Skip to content

Comments

[FEATURE] Version 12.0.0, added v14 support, removed v11 support including php8.0 and php8.1, rewrote backend javascript functionality to typescript and webcomponents#632

Open
RinyVT wants to merge 1 commit intomainfrom
feature/yoast-v12
Open

[FEATURE] Version 12.0.0, added v14 support, removed v11 support including php8.0 and php8.1, rewrote backend javascript functionality to typescript and webcomponents#632
RinyVT wants to merge 1 commit intomainfrom
feature/yoast-v12

Conversation

@RinyVT
Copy link
Collaborator

@RinyVT RinyVT commented Feb 23, 2026

Summary

This PR can be summarized in the following changelog entry:

Breaking

  • Dropped support for TYPO3 11
  • Dropped support for PHP 8.0 and 8.1, now requires PHP 8.2+
  • Added new dependency maxserv/frontend-request for handling frontend requests
    • Removed ModifyPreviewUrlEvent event - use ModifyUrlEvent from maxserv/frontend-request instead
    • Removed PreviewHandler AJAX handler
    • Removed PreviewService and related content extractors (ContentParser, UrlContentFetcher, HttpOptionSetter,
      etc.)
  • Removed SnippetPreviewUrlGenerator - replaced by SnippetPreviewRequestDataGenerator
  • Removed JavascriptService and JsonConfigService - replaced by JsonTranslationsService
  • Removed YoastEnvironmentService
  • Removed BackendYoastConfig hook - replaced by BackendYoastTranslations
  • Removed UsePageCache and AfterCacheableContentIsGeneratedListener - replaced by new event listeners
  • Removed PagesWithoutDescriptionDataProvider dashboard widget (use core TYPO3 widget instead)

Added

  • Support for TYPO3 14
  • New TypeScript-based frontend architecture replacing the legacy JavaScript implementation
    • Complete rewrite of analysis, insights, and preview components in TypeScript
    • New modular TypeScript source files in Build/typescript/
  • New form elements for social previews:
    • FacebookPreview - dedicated Facebook/Open Graph preview widget
    • TwitterPreview - dedicated Twitter card preview widget
    • AbstractSocialPreview - base class for social preview implementations
    • AbstractLabeledFormElement - base class for labeled form elements
  • New service architecture for TYPO3 version compatibility:
    • FrontendServiceInterface with FrontendService (v13+) and LegacyFrontendService (v12)
    • HmacGeneratorServiceInterface with HmacGeneratorService (v13+) and LegacyHmacGeneratorService (v12)
    • StandaloneViewServiceInterface with StandaloneViewService (v13+) and LegacyStandaloneViewService (v12)
  • New FrontendRequestListener event listener for frontend request handling
  • New PageCacheIdentifierListener and PageCacheListener for cache handling
  • New SnippetPreviewRequestDataGenerator for generating preview request data
  • New SaveScoresService for handling score persistence
  • New SiteService for site-related operations
  • New RequestData DTO for structured request data handling
  • New PageParser/BodyParser and TitleConfigurationParser for parsing page content
  • New ModifyPageLayoutContentListener event listener (replacing the removed backend class)
  • Various new functional and unit tests for the new architecture and features

Changed

  • Updated TYPO3 version constraints: now supports TYPO3 12.4.25+, 13.4+, and 14.1+
  • Complete JavaScript/TypeScript frontend rewrite:
    • Migrated from legacy JavaScript to TypeScript
    • New web components architecture
    • Improved analysis worker implementation
  • Reorganized event listeners under EventListener namespace
  • Renamed AbstractAbstractListener to AbstractBuilderListener
  • Improved internal linking suggestions handling for TYPO3 14 TCA changes
  • Updated DDEV configuration:
    • Removed TYPO3 v11 installation command
    • Added TYPO3 v14 installation command
    • Updated PHP version and configuration
  • Restructured form elements with better separation of concerns
  • Simplified ext_localconf.php - removed IIFE wrapper, modernized hook registration
  • Updated GitHub Actions workflow for new TYPO3 version matrix
  • Updated translations to latest versions
  • Improved dark mode compatibility
  • Updated documentation for the ddev setup and typescript / javascript development

Fixed

  • Fixed merge conflict markers in CHANGELOG.md from previous release
  • Fixed saving scores for translated pages
  • Fixed the schema.org declaration inside the structured data providers (removed www. from the URL)

Removed

  • Legacy JavaScript files (plugin.js, yoastModal.js, yoastModalEs6.js)
  • Legacy layout template (Resources/Private/Layouts/Legacy.html)
  • Legacy crawler template (Resources/Private/Templates/Crawler/Legacy.html)
  • PagesWithoutMetaDescriptionWidget template (functionality moved to core TYPO3)
  • PHPStan configuration for TYPO3 11 (Build/phpstan/phpstan.cms11.neon)
  • Various unit tests for removed controllers

Relevant technical choices:

  • To make the javascript functionality more accessible to contributors the whole react/javascript setup is replaced by typescript modules where the yoast components are used as webcomponents by making use of @r2wc/react-to-web-component

Test instructions

This PR can be tested by following these steps:

  • The ddev setup has been updated to work with TYPO3 14, see the developer documentation for setting up the environment(s)

Quality assurance

  • I have tested this code to the best of my abilities
  • I have added unittests to verify the code works as intended

…uding php8.0 and php8.1, rewrote backend javascript functionality to typescript and webcomponents
@RinyVT RinyVT requested a review from Copilot February 23, 2026 14:22
Copy link

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR upgrades the Yoast SEO for TYPO3 extension to version 12.0.0, adding TYPO3 v14 support while removing support for TYPO3 v11 and older PHP versions (8.0/8.1). The extension's frontend JavaScript architecture has been completely rewritten in TypeScript with web components, replacing the legacy React/Redux implementation.

Changes:

  • Dropped TYPO3 v11 and PHP 8.0/8.1 support, now requires PHP 8.2+ and TYPO3 12.4.25+, 13.4+, or 14.1+
  • Complete TypeScript rewrite of frontend JavaScript with new modular architecture and web components
  • Added new social preview form elements (FacebookPreview, TwitterPreview) and service architecture for version compatibility

Reviewed changes

Copilot reviewed 278 out of 420 changed files in this pull request and generated 5 comments.

Show a summary per file
File Description
Resources/Private/Language/*.xlf Reformatted XML files with consistent indentation and updated product names
README.md Updated badges and branch references from master to main
Documentation/* Added new documentation for TypeScript/JavaScript development, Facebook/Twitter previews, and updated configuration references
Configuration/* Added file headers, updated middleware configuration, removed deprecated AJAX routes and hooks
Classes/Service/* New service architecture with interfaces for TYPO3 version compatibility (Frontend, HMAC, StandaloneView)
Classes/Form/Element/* New social preview elements and refactored existing elements to use constructor DI
Classes/EventListener/* Renamed AbstractListener to AbstractBuilderListener, added new cache and frontend request listeners
Build/typescript/* New TypeScript source structure with modular components and type definitions
Build/resources/* Updated dependencies and webpack configuration for web components
.ddev/* Removed v11 installation commands, added v14 support, updated configuration
Build/extensions/sitepackage/* Example extension updated with new TCA configuration and controllers

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

</trans-unit>
<file source-language="en" datatype="plaintext"
original="EXT:yoast_seo/Resources/Private/Language/BackendModuleOverview.xlf" date="2014-05-02T12:00:00Z"
product-name="yoast_seo">
Copy link

Copilot AI Feb 23, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The product-name changed from 'yoastseo-overview' to 'yoast_seo'. While this change makes the naming consistent across files, verify that this doesn't break any existing translation workflows or tooling that might depend on the previous product-name identifier.

Suggested change
product-name="yoast_seo">
product-name="yoastseo-overview">

Copilot uses AI. Check for mistakes.
# t3templating = https://docs.typo3.org/m/typo3/tutorial-templating/main/en-us/
# t3translate = https://docs.typo3.org/m/typo3/guide-frontendlocalization/main/en-us/
t3tsconfig = https://docs.typo3.org/m/typo3/reference-tsconfig/11.5/en-us/
t3tsconfig = https://docs.typo3.org/m/typo3/reference-tsconfig/13.4/en-us/
Copy link

Copilot AI Feb 23, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The TSConfig reference link has been updated to version 13.4, but the extension now supports TYPO3 12.4, 13.4, and 14.1. Consider whether this should point to version 14 documentation instead, or provide version-specific links in the documentation itself to support all three supported TYPO3 versions.

Suggested change
t3tsconfig = https://docs.typo3.org/m/typo3/reference-tsconfig/13.4/en-us/
t3tsconfig = https://docs.typo3.org/m/typo3/reference-tsconfig/14.1/en-us/

Copilot uses AI. Check for mistakes.
export default class Result<T> {
public result: T;
public data: object;
constructor( result: T, data: object) {
Copy link

Copilot AI Feb 23, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Inconsistent spacing: there's an extra space after the opening parenthesis in 'constructor( result: T'. The closing parenthesis at line 5 and 6 also show inconsistent spacing. This violates the Prettier configuration that should be enforcing consistent spacing.

Suggested change
constructor( result: T, data: object) {
constructor(result: T, data: object) {

Copilot uses AI. Check for mistakes.
Comment on lines +4 to +7
private readonly _resolve: any;
private readonly _reject: any;
private readonly _data: {};
constructor( resolve: any, reject: any, data = {} ) {
Copy link

Copilot AI Feb 23, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Using any types defeats the purpose of TypeScript's type safety. Consider defining proper types for resolve and reject functions, such as (value: object) => void and (reason?: any) => void, or use generic type parameters to properly type the Promise resolution.

Copilot uses AI. Check for mistakes.
Comment on lines +9 to +10
const getKeywordResearchArticleLink = (url) => {
const keywordsResearchLinkTranslation = sprintf(
Copy link

Copilot AI Feb 23, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The sprintf function is used but not imported. This will cause a runtime error. Import sprintf from the appropriate package (likely @wordpress/i18n) or use template literals instead.

Copilot uses AI. Check for mistakes.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant