Skip to content

Update wordpress monorepo - #53004

Merged
retrofox merged 48 commits into
trunkfrom
renovate/wordpress-monorepo
Oct 15, 2026
Merged

retrofox merged 48 commits into
trunkfrom
renovate/wordpress-monorepo

Conversation

@matticbot

@matticbot matticbot commented Sep 30, 2026 •

Copy link
Copy Markdown
Contributor

ℹ️ Note

This PR body was truncated due to platform limits.

This PR contains the following updates:

Package Change Age Confidence
@wordpress/a11y (source) 4.55.0 → 4.57.0 age confidence
@wordpress/a11y (source) 4.54.0 → 4.57.0 age confidence
@wordpress/admin-ui (source) 2.9.0 → 2.12.0 age confidence
@wordpress/admin-ui (source) 2.10.0 → 2.12.0 age confidence
@wordpress/api-fetch (source) 7.55.0 → 7.57.0 age confidence
@wordpress/api-fetch (source) 7.54.0 → 7.57.0 age confidence
@wordpress/base-styles (source) 13.1.0 → 13.3.0 age confidence
@wordpress/blob (source) 4.55.0 → 4.57.0 age confidence
@wordpress/block-editor (source) 17.1.0 → 18.1.0 age confidence
@wordpress/block-library (source) 11.0.0 → 11.2.0 age confidence
@wordpress/block-serialization-default-parser (source) 5.55.0 → 5.57.0 age confidence
@wordpress/blocks (source) 16.0.0 → 16.2.0 age confidence
@wordpress/boot (source) ^0.22.0 → ^0.24.0 age confidence
@wordpress/boot (source) 0.22.0 → 0.24.0 age confidence
@wordpress/browserslist-config (source) 6.55.0 → 6.57.0 age confidence
@wordpress/build (source) 0.23.0 → 0.25.0 age confidence
@wordpress/commands (source) 1.55.0 → 1.57.0 age confidence
@wordpress/components (source) 40.1.0 → 42.0.0 age confidence
@wordpress/components (source) 40.0.0 → 42.0.0 age confidence
@wordpress/compose (source) 8.8.0 → 8.10.0 age confidence
@wordpress/core-data (source) 8.0.0 → 8.2.0 age confidence
@wordpress/data (source) 10.55.0 → 10.57.0 age confidence
@wordpress/data (source) 10.54.0 → 10.57.0 age confidence
@wordpress/data-controls (source) 4.55.0 → 4.57.0 age confidence
@wordpress/dataviews (source) 18.1.0 → 20.0.0 age confidence
@wordpress/dataviews (source) 19.0.0 → 20.0.0 age confidence
@wordpress/dataviews (source) 19.0.1-next.v.202609031004.0 → 20.0.0 age confidence
@wordpress/date (source) 5.55.0 → 5.57.0 age confidence
@wordpress/dom (source) 4.55.0 → 4.57.0 age confidence
@wordpress/dom-ready (source) 4.55.0 → 4.57.0 age confidence
@wordpress/e2e-test-utils-playwright (source) 2.0.0 → 3.0.0 age confidence
@wordpress/edit-post (source) 8.55.0 → 8.57.0 age confidence
@wordpress/editor (source) 15.0.0 → 15.2.0 age confidence
@wordpress/element (source) 8.7.0 → 9.0.0 age confidence
@wordpress/element (source) 8.6.0 → 9.0.0 age confidence
@wordpress/escape-html (source) 3.55.0 → 3.57.0 age confidence
@wordpress/format-library (source) 5.55.0 → 5.57.0 age confidence
@wordpress/hooks (source) 4.55.0 → 4.57.0 age confidence
@wordpress/html-entities (source) 4.55.0 → 4.57.0 age confidence
@wordpress/i18n (source) 6.28.0 → 6.30.0 age confidence
@wordpress/i18n (source) 6.27.0 → 6.30.0 age confidence
@wordpress/icons (source) 16.0.0 → 18.0.0 age confidence
@wordpress/icons (source) 15.5.0 → 18.0.0 age confidence
@wordpress/icons (source) ^16.0.0 → ^18.0.0 age confidence
@wordpress/interactivity (source) 6.55.0 → 7.0.0 age confidence
@wordpress/interface (source) 10.1.0 → 10.3.0 age confidence
@wordpress/keycodes (source) 4.55.0 → 4.57.0 age confidence
@wordpress/lazy-editor (source) 1.21.0 → 1.23.0 age confidence
@wordpress/media-utils (source) 5.55.0 → 5.57.0 age confidence
@wordpress/notices (source) 5.54.0 → 5.57.0 age confidence
@wordpress/notices (source) 5.55.0 → 5.57.0 age confidence
@wordpress/plugins (source) 7.55.0 → 7.57.0 age confidence
@wordpress/preferences (source) 4.54.0 → 4.57.0 age confidence
@wordpress/preferences (source) 4.55.0 → 4.57.0 age confidence
@wordpress/primitives (source) 4.54.0 → 4.57.0 age confidence
@wordpress/primitives (source) 4.55.0 → 4.57.0 age confidence
@wordpress/private-apis (source) 1.55.0 → 2.0.0 age confidence
@wordpress/private-apis (source) ^1.8.1 → ^2.0.0 age confidence
@wordpress/rich-text (source) 7.55.0 → 7.57.0 age confidence
@wordpress/route (source) 0.20.0 → 0.23.0 age confidence
@wordpress/route (source) 0.21.0 → 0.23.0 age confidence
@wordpress/route (source) ^0.21.0 → ^0.23.0 age confidence
@wordpress/router (source) 1.54.0 → 1.57.0 age confidence
@wordpress/server-side-render (source) 6.31.0 → 6.33.0 age confidence
@wordpress/stylelint-config (source) 25.0.0 → 26.1.0 age confidence
@wordpress/sync (source) 1.55.0 → 2.0.0 age confidence
@wordpress/theme (source) 2.1.0 → 2.3.0 age confidence
@wordpress/theme (source) 2.0.0 → 2.3.0 age confidence
@wordpress/theme (source) 2.1.1-next.v.202609031004.0 → 2.3.0 age confidence
@wordpress/token-list (source) 3.55.0 → 3.57.0 age confidence
@wordpress/ui (source) 0.22.0 → 0.24.0 age confidence
@wordpress/ui (source) 0.21.0 → 0.24.0 age confidence
@wordpress/ui (source) ^0.22.0 → ^0.24.0 age confidence
@wordpress/url (source) 4.55.0 → 4.57.0 age confidence
@wordpress/url (source) 4.54.0 → 4.57.0 age confidence
@wordpress/viewport (source) 6.55.0 → 6.57.0 age confidence
@wordpress/views (source) ~1.22.0 → ~2.0.0 age confidence
@wordpress/widget-dashboard (source) 0.7.1-next.v.202609031004.0 → 0.9.0 age confidence
@wordpress/widget-primitives (source) 0.7.0 → 0.9.0 age confidence
@wordpress/widgets (source) 4.55.0 → 4.57.0 age confidence
@wordpress/wordcount (source) 4.55.0 → 4.57.0 age confidence

Release Notes

WordPress/gutenberg (@​wordpress/a11y)

v4.57.0

Compare Source

New Features
  • Add prefersReducedMotion, which reports whether the user has asked their operating system to reduce motion. It is the counterpart to the useReducedMotion hook in @wordpress/compose, for code that runs outside React such as block view scripts (#​83452).

v4.56.0

Compare Source

WordPress/gutenberg (@​wordpress/admin-ui)

v2.12.0

Compare Source

Bug Fixes
  • Declare react-dom and @types/react-dom as peer dependencies, forwarding the peers of @wordpress/element, so strict package managers such as Yarn PnP can resolve them (#​83765).
Internal
  • Export ADMIN_THEME_COLORS from its own module, without adding it to the package's exports, so tooling in the repository can read the bundled admin colour schemes instead of copying them (#​82425).

v2.11.0

Compare Source

v2.10.0

Compare Source

Internal
  • Stop publishing the src directory to npm. The package's exports field only exposes the built artifacts, so the source files were unreachable by consumers and only inflated the package size (#​77285).
WordPress/gutenberg (@​wordpress/api-fetch)

v7.57.0

Compare Source

v7.56.0

Compare Source

WordPress/gutenberg (@​wordpress/base-styles)

v13.3.0

Compare Source

Enhancements
  • Default --wp-admin-theme-color to #​3858e9, the WordPress 7.0 default admin color scheme, instead of the legacy #​007cba. To keep the old color, include admin-scheme(#​007cba) on :root in your own stylesheet. wordpress-admin-schemes() and the default custom properties now set #​007cba for the Fresh scheme, which had used the :root default (#​83749).
  • radio-control: Use the design system color tokens (#​83270).
Bug Fixes
  • radio-control: Keep radio circles and checked dots visually 16px and 8px on narrow screens while providing a 24px pointer target (#​83840).

v13.2.0

Compare Source

Enhancements
  • checkbox-control: Use the design system tokens for the default border, hover, and disabled icon colors (#​83271).
  • checkbox-control: Use the design system disabled fill and border tokens (#​82555).
WordPress/gutenberg (@​wordpress/blob)

v4.57.0

Compare Source

v4.56.0

Compare Source

WordPress/gutenberg (@​wordpress/block-editor)

v18.1.0

Compare Source

New Features
  • Add useBackgroundProps and getBackgroundClassesAndStyles, and honour background.__experimentalSkipSerialization in the editor (#​83943).
Enhancements
  • Inserter: Open faster when many block types are registered (#​83446).
  • State control badges: migrate from the private @wordpress/components Badge to @wordpress/ui Badge (#​82608).
  • Use the inertValue helper to set inert attributes, for better React 18/19 compatibility (#​83871).
  • LinkControl: Add a transformSuggestions prop, so a consumer can filter, order or add to the search suggestions before they are shown (#​83652).
  • Block Switcher: Show the pattern previews' focus and hover rings with the design system's outline instead of a legacy box-shadow (#​83933).
Bug Fixes
  • Block Mover: Restrict button sizing styles to the mover buttons so visually hidden descriptions do not overflow the block toolbar (#​84114).
  • Block inspector: Restore the Settings tab for a block whose only advanced tool is "Allowed blocks" (e.g. a container with allowedBlocks and no anchor), by counting the allowed-blocks fills when deciding whether to show the tab. The control is also now hidden while editing a section (pattern) block, matching the other inspector controls (#​84067).
  • Fix the translator comments for the "blocks moved" and "blocks added" screen reader messages, which described the count as a block name (#​83555).
  • BlockCompare: Show whitespace differences in the Resolve Block dialog. The markup's spaces and blank lines are kept instead of collapsed by the browser, and each added or removed line break gets a visible marker, so a diff made only of whitespace no longer looks identical on both sides. The dialog also shows the markup of a converted Custom HTML block, which is kept in its innerContent rather than produced by save, instead of an empty diff (#​82397).
  • Inserter: Stop re-rendering the block list when the block selection changes while the inserter is open (#​83284).
  • Fix style edits applied to a multi-block selection overwriting each block's other styles. Only the changed values are now applied to every selected block, so distinct styles are preserved and resets propagate to the whole selection (#​80070).
  • Fix exception thrown by getSelectedBlockStyleState when an undefined clientId is passed as an argument. (#​84140)
Internal
  • Apply the disabled state to block binding menu triggers instead of their roots (#​83791).

v18.0.0

Compare Source

Breaking Changes
  • InspectorControls: Remove the __experimentalGroup prop from the fill and the slot. It was deprecated in WordPress 6.2 in favour of group, with removal scheduled for 6.4 (#​83171).
New Features
  • Add a text shadow block support and its control in the typography panel (#​79584).
  • Stabilize getStyleForState and setStyleForState, for reading and writing block style values for a given viewport or pseudo state, and stabilize the getSelectedBlockStyleState and hasSelectedBlockStyleState(renamed from hasSelectedStyleState) store selectors. (#​82741).
Enhancements
  • Remove the react-autosize-textarea dependency. PlainText and the block "Edit as HTML" field now auto-grow with CSS field-sizing: content. Browsers without support use scrollable fields. PlainText consumers should use CSS height constraints instead of rows (#​64208).
  • BlockCard: Migrate the block-type badge from the private Components Badge to @wordpress/ui Badge. (#​82503).
  • Inspector controls in the standard block-supports panels (Typography, Dimensions, Border, Color, Background, Filters) reflect the value a block inherits from Global Styles when nothing is set on the block. The gutenberg-global-styles-inheritance-ui experiment now gates only the indicators for that value: the dotted underline on an inherited label, and the dot that resets a local override (#​82840).
  • TypographyPanel: Setting a text color starts an unset link color tracking it whenever no link color is set on the block or inherited from Global Styles. Previously the link color was left alone (#​82840).
  • LinkControl, LinkPicker: migrate the link preview badges from the private @wordpress/components Badge to @wordpress/ui Badge (#​82684).
  • BlockQuickNavigation: Highlight a block on the canvas while its item is hovered or focused, matching the List View. This affects the inspector Content tab, the pattern overrides panel, and the template and template part content panels (#​83049).
  • Inserter and pattern search: rank title matches above keyword and description matches, and rank a word in the title that starts with the search term above a substring match (#​83312).
  • ViewportVisibilityInfo: Migrate the block visibility badge from the private @wordpress/components Badge to @wordpress/ui Notice component (#​82670).
Bug Fixes
  • BlockAlignmentControl: Hide the control again when none of a block's alignments are available. Paragraph, Heading, List and other blocks that support only wide and full were showing a menu of unavailable options that could not change anything (#​83265).
  • Inline images in rich text are selected by clicking them again. A block captures a drag that starts on its own image through the dragstart target instead of the pointer-events: none rule that also kept the image from any click (#​83370).
  • RichText: The edit UI of a format follows the active object when the selection moves from one object straight to another, for example from one inline image to the next, so the popover shows the attributes of that object at its position (#​83370).
  • FontAppearanceControl: List only the weights inside a variable font's range, reading both ends of the range as whole numbers or as the keywords normal and bold (#​83128).
  • LinkControl: Only label pages as the front page or blog home. Posts, terms and media are separate tables and can share an id, so an unscoped search could label a term "Front page" (#​83082).
  • InnerBlocks: Resolve a container's legacy layout markup (inherit: true, or a bare contentSize / wideSize with no type) to a constrained layout for its inner blocks, so they are offered the wide and full alignments. Previously only the container's styles honoured the legacy form, and the inner blocks resolved to the flow layout (#​82637).
  • Block Patterns, Block Visibility, and Block Lock: Preserve the intended colors of icons converted to strokes. (#​82540, [#​82754](https://redirect

❗ Important

✂ PR body was truncated to here.


Configuration

📅 Schedule: (in timezone UTC)

  • Branch creation
    • Between 12:00 AM and 02:59 AM, on day 1 of the month (* 0-2 1 * *)
  • Automerge
    • At any time (no schedule defined)

🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.

♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

👻 Immortal: This PR will be recreated if closed unmerged. Get config help if that's undesired.


  • If you want to rebase/retry this PR, check this box

This PR has been generated by Mend Renovate CLI.

@retrofox

retrofox commented Oct 9, 2026

Copy link
Copy Markdown
Contributor

Thanks for the thorough pass; this is exactly the kind of cross-plugin case the matrix misses.

widget-primitives across plugin copies (the blocker): fixed in 5c77d405197.

The polyfill build now emits build/modules/<name>/version.php with the bundled package version, and register_modules() records, in a global shared by every copy of the package, which version registered each module.

For widget-primitives (the one module Core never ships), a newer bundled copy now replaces an older plugin's registration, and an older copy leaves a newer one alone, whichever plugin loads first; a build predating the version file counts as older.

With a supported Gutenberg, its copy still wins, and GUTENBERG_WIDGET_PRIMITIVES_MIN_VERSION is now 24.1.0, since HostLink arrived with widget-primitives 0.8 (I checked the 24.0.0 zip: it ships useWidgetHost but not HostLink).

Four PHP tests cover the order permutations and the version-less copy, and a node test checks every emitted version file against the bundled package. So the "Jetpack updated ahead of the standalone Stats/VideoPress" case now takes Jetpack's copy.

The rest are in too, since they were small:

  • AI usage meter: indicator tinted through the child element, like Boost/Backup/VideoPress.
  • Form block variation picker: the fill: currentColor on paths now skips stroke-based icons, so the Lead capture heads are outlines again.
  • Forms rename-modal save error and Protect's "Firewall disabled" notice announce through speak() (3794e100a77).

Noted the interactivity 7 two-hyphen IDs in Forms and Search for a follow-up; they only bite once Core or Gutenberg ships that runtime.

…onorepo

# Conflicts:
#	pnpm-lock.yaml
#	projects/packages/premium-analytics/widgets/store-performance/package.json
#	projects/packages/sharing-likes/package.json
#	projects/packages/sharing-likes/routes/settings/package.json
@retrofox

retrofox commented Oct 9, 2026 •

Copy link
Copy Markdown
Contributor

Manual matrix on a local Docker site (build of 1589eb90fd1)

Who serves each polyfillable package per cell, read from the Debug Helper's Package Provenance panel, plus the console filtered by unlock|module specifier|does not provide|Failed|TypeError|ReferenceError|SyntaxError|Uncaught after every load. The site's WordPress.com connection was broken during the run, so the connection-gated surfaces (VideoPress library, Boost scores, Protect data, AI hub, Social connections) show their unconnected state; they render without console errors but I could not exercise their connected views.

Cell Core Gutenberg Surfaces Provenance Console
G 7.1 off Stats v2 (dashboard, Referrers), Forms, My Jetpack, VideoPress, Boost, Protect, classic Settings, editor with the Jetpack sidebar (SEO + Social) Core serves notices, private-apis, rich-text, theme, boot, route, a11y; wp-views and @wordpress/widget-primitives from the polyfill clean (Settings shows two pre-existing React warnings from FormToggle/WritingSettings)
G2 7.1 24.1.0 Stats v2, Forms, My Jetpack, editor everything from Gutenberg (its widget-primitives has HostLink); wp-views from the polyfill clean
G3 7.1 24.0.0 Stats v2, Forms Gutenberg, except wp-views and @wordpress/widget-primitives from the polyfill: the new 24.1.0 gate replaced Gutenberg 24.0's copy, which lacks HostLink clean
E 7.0.4 off Stats v2, Forms, My Jetpack, editor with the Jetpack sidebar Core serves notices, theme, boot, route, a11y; private-apis 2.0, rich-text, views and widget-primitives from the polyfill clean
F 7.0.4 24.1.0 Stats v2, editor with the Jetpack sidebar everything from Gutenberg; wp-views from the polyfill clean

G3 is the Gutenberg side of @louwie17's report; the plugin-copy side (an older wp-build-polyfills registering first) is covered by the new PHP tests, since every standalone plugin on this site already carries the 0.9.0 copy.

G Stats v2 G Forms G My Jetpack G editor Jetpack sidebar G Settings
G2 Stats v2 with Gutenberg 24.1 G3 Stats v2 with Gutenberg 24.0 E Stats v2 on 7.0.4 E editor Jetpack sidebar F Stats v2 on 7.0.4 with Gutenberg 24.1 F editor Jetpack sidebar

…onorepo

# Conflicts:
#	pnpm-lock.yaml
#	projects/plugins/jetpack/package.json
…onorepo

# Conflicts:
#	projects/packages/backup/src/dashboard/components/query-error/index.tsx
#	projects/packages/backup/src/dashboard/components/storage-space/addon-upsell.tsx
#	projects/packages/backup/src/dashboard/screens/restore.tsx

@louwie17 louwie17 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Thanks @retrofox for the quick turnaround on all of these! I retested on a local Docker site with WP 7.0 and 7.1, GB off, 24.0 and 24.1, with Stats and VideoPress active, and Stats v2 loads fine in every combination now. The 24.1.0 gate does its job too, GB 24.0's copy gets replaced and the dashboard renders.

One correction on my side, the "older standalone plugin registers first" case I reported was most likely a local artifact. All plugins on my site report the same dev version, so the autoloader picked trunk's polyfill class and your fix never ran. On real sites the autoloader picks the highest package version, so I don't think that case can happen in practice.

The one thing I'd like to change before merging is how the version gets to PHP. Instead of introducing a brand new version.php file per module (plus a separate webpack plugin to emit it), lets make use of the index.asset.php that PolyfillModulePlugin already generates for each module. It's already the file that describes the build, register_modules() already loads it right before the version check, and it saves an extra file and an extra file read per module. I left inline comments with code examples for the webpack plugin, the PHP and both tests.

The AI meter, Form icon and notice announcement fixes look good from the diff (didn't recheck those visually).

Let me know what you think.

*
* WP_Build_Polyfills reads it to keep the newest copy when several plugins register the module.
*/
class ModuleVersionPlugin {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Instead of a separate plugin emitting a new version.php, could we pass the version into PolyfillModulePlugin and add it to the index.asset.php it already writes ( L454 )? Then this whole class can go:

class PolyfillModulePlugin {
	constructor( { skipPackage, packageVersion } ) {
		this.skipPackage = skipPackage;
		this.packageVersion = packageVersion;
	}
	// ...
}
parts.push( `'version' => '${ hash }'` );
if ( this.packageVersion ) {
	parts.push( `'package_version' => '${ this.packageVersion }'` );
}

Comment on lines +504 to +505
new PolyfillModulePlugin( { skipPackage: polyfill.packageName } ),
new ModuleVersionPlugin( resolvePackageVersion( polyfill.packageName ) ),

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

And here we'd hand the version to the existing plugin:

Suggested change
new PolyfillModulePlugin( { skipPackage: polyfill.packageName } ),
new ModuleVersionPlugin( resolvePackageVersion( polyfill.packageName ) ),
new PolyfillModulePlugin( {
skipPackage: polyfill.packageName,
packageVersion: resolvePackageVersion( polyfill.packageName ),
} ),

Comment on lines +399 to +403
// Builds before this file carry no version and count as older than any that does.
$version_file = $build_dir . '/modules/' . $name . '/version.php';
$version = file_exists( $version_file ) ? require $version_file : null;
$replace = $gutenberg_too_old;
$record = false;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

With the version in the asset file, which is already loaded a few lines up, this becomes a key lookup instead of a second file:

Suggested change
// Builds before this file carry no version and count as older than any that does.
$version_file = $build_dir . '/modules/' . $name . '/version.php';
$version = file_exists( $version_file ) ? require $version_file : null;
$replace = $gutenberg_too_old;
$record = false;
// Builds without `package_version` predate it and count as older than any that does.
$version = $asset['package_version'] ?? null;
$replace = $gutenberg_too_old;
$record = false;

Comment on lines +261 to +267
file_put_contents(
$dir . '/modules/widget-primitives/index.asset.php',
"<?php return array('dependencies' => array(), 'version' => '$asset_version', 'module_dependencies' => array());"
);
if ( null !== $package_version ) {
file_put_contents( $dir . '/modules/widget-primitives/version.php', "<?php return '$package_version';" );
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

The helper would then write the version into the asset file:

Suggested change
file_put_contents(
$dir . '/modules/widget-primitives/index.asset.php',
"<?php return array('dependencies' => array(), 'version' => '$asset_version', 'module_dependencies' => array());"
);
if ( null !== $package_version ) {
file_put_contents( $dir . '/modules/widget-primitives/version.php', "<?php return '$package_version';" );
}
$package_version_php = null === $package_version ? '' : ", 'package_version' => '$package_version'";
file_put_contents(
$dir . '/modules/widget-primitives/index.asset.php',
"<?php return array('dependencies' => array(), 'version' => '$asset_version', 'module_dependencies' => array()$package_version_php);"
);

Comment on lines +18 to +24
test( `build/modules/${ name }/version.php returns the bundled ${ packageName } version`, () => {
const file = path.join( packageRoot, 'build/modules', name, 'version.php' );
const expected = JSON.parse(
fs.readFileSync( localRequire.resolve( `${ packageName }/package.json` ), 'utf8' )
).version;

assert.equal( fs.readFileSync( file, 'utf8' ), `<?php return '${ expected }';\n` );

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Same here, checking the asset file instead:

Suggested change
test( `build/modules/${ name }/version.php returns the bundled ${ packageName } version`, () => {
const file = path.join( packageRoot, 'build/modules', name, 'version.php' );
const expected = JSON.parse(
fs.readFileSync( localRequire.resolve( `${ packageName }/package.json` ), 'utf8' )
).version;
assert.equal( fs.readFileSync( file, 'utf8' ), `<?php return '${ expected }';\n` );
test( `build/modules/${ name }/index.asset.php carries the bundled ${ packageName } version`, () => {
const asset = fs.readFileSync( path.join( packageRoot, 'build/modules', name, 'index.asset.php' ), 'utf8' );
const expected = JSON.parse(
fs.readFileSync( localRequire.resolve( `${ packageName }/package.json` ), 'utf8' )
).version;
assert.ok( asset.includes( `'package_version' => '${ expected }'` ) );

louwie17
louwie17 previously approved these changes Oct 12, 2026

@louwie17 louwie17 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Thanks @retrofox for moving the version into the index.asset.php, that's much cleaner 🙂 I retested the latest on a local Docker site with WP 7.1, GB on and off, and Stats v2, Forms, Jetpack AI, Backup, Newsletter, VideoPress and the Form block all match trunk. Stats v2 now picks up the polyfill copy with package_version when GB is off, and GB's own copy when it's on. I also tested on Atomic and Simple sites and those looked good too.

LGTM 🚀

…onorepo

# Conflicts:
#	projects/packages/backup/src/dashboard/components/query-error/index.tsx
#	projects/packages/premium-analytics/widgets/conversion-rate/package.json
#	projects/packages/premium-analytics/widgets/plan-usage/package.json
#	projects/packages/premium-analytics/widgets/store-conversion-rate-bookings/package.json
#	projects/packages/woocommerce-stats/widgets/sessions-by-device/package.json
…onorepo

# Conflicts:
#	pnpm-lock.yaml
#	projects/packages/backup/src/dashboard/screens/restore.tsx
#	projects/packages/connection/package.json
#	projects/packages/newsletter/src/settings/sections/email-design-section.tsx
#	projects/packages/podcast/package.json
#	projects/packages/premium-analytics/packages/widgets-toolkit/src/components/chart-empty-state/chart-empty-state.tsx
#	projects/packages/premium-analytics/widgets/sales-by-coupon-usage/package.json
#	projects/packages/premium-analytics/widgets/utm-insights/package.json
#	projects/packages/protect/routes/dashboard/sections/scan/delete-software.tsx
#	projects/packages/protect/routes/dashboard/sections/scan/threat-details.tsx
#	projects/packages/woocommerce-stats/widgets/bookings-by-device/package.json
#	projects/packages/woocommerce-stats/widgets/bookings-revenue-by-customer-type/package.json
#	projects/packages/woocommerce-stats/widgets/revenue-by-customer-type/package.json
#	projects/packages/woocommerce-stats/widgets/sales-by-coupon/package.json
#	projects/packages/woocommerce-stats/widgets/sales-by-device/package.json
#	projects/packages/woocommerce-stats/widgets/total-returns/package.json
#	projects/packages/woocommerce-stats/widgets/visitors-by-location/package.json
…onorepo

# Conflicts:
#	projects/packages/jetpack-mu-wpcom/src/features/ai-launchpad/js/tailored-list/tailored-list.tsx
louwie17
louwie17 previously approved these changes Oct 14, 2026

@louwie17 louwie17 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Thanks @retrofox for keeping this one up to date with trunk! I did a couple more tests on a local Docker site with WP 7.1.3, GB on and off, across Stats v2, Forms, Jetpack AI, Backup, Newsletter, My Jetpack, Social, VideoPress and the editor, and everything still matches trunk. Stats v2 also still picks up the polyfill's widget-primitives with GB off and Gutenberg's own copy with GB on 👍

This is still good to go!

…onorepo

# Conflicts:
#	pnpm-lock.yaml
#	projects/plugins/classic-theme-helper-plugin/package.json
@retrofox

Copy link
Copy Markdown
Contributor

Head audited: 0d49bab05a. Two environments: the local Docker site of the base checkout (~/lab/jetpack, jetpack_dev on :8888, reached through ibardaga.ngrok.app) and the Atomic site retrofoxsuperdeploy.wpcomstaging.com running the Jetpack Beta build of the same head. Chrome driven through the extension. Screenshots in .retrofox-tmp/pr-53004-audit-shots/ (NOT published anywhere). Console filtered by unlock|module specifier|does not provide|Failed|TypeError|ReferenceError|SyntaxError|Uncaught|Warning: after every load; provenance read from the Debug Helper "Package Provenance" JSON (#package-provenance-data).

What changed since the 2026-10-09 matrix (1589eb90fd1)

  • Polyfills: the bundled package version now travels in index.asset.php (package_version), not in a separate version.php.
  • ui 0.24 renames applied to code that arrived from trunk: PA chart-empty-state (widget empty states), PA plan-limit-notice (Notice.CloseIconButton), PA utm-url-builder-dialog (Dialog.CloseIconButton), Backup backup-detail (ButtonLink.Icon with rotateLeft), Newsletter email-design-section, Protect threat-details / delete-software, mu-wpcom tailored-list + difm-offer-banner (WordPress.com only, not visible here).
  • About 80 trunk commits merged (PA All time, views-limit notice, Woo Stats widgets moved, Protect Monitor, Backup locale, Comments…).

Local Docker matrix

Cell Core Gutenberg Surfaces Provenance Console Result
G2 7.1.3 24.1.0 PA (WooCommerce, Traffic, Insights, Subscribers, Ads, Settings, date menu), Forms, My Jetpack, Newsletter (Overview + Settings), Protect (Scan + Firewall), Boost (pricing), classic Settings, editor + Jetpack sidebar (SEO) GB serves notices/theme/private-apis/rich-text/a11y/components/data/element and the boot/route/a11y/abilities/connectors/widget-primitives modules; wp-views POLYFILL; PA SDK APP (jetpack) clean everywhere except classic Settings: 6 React warnings (StrictMode from boot over legacy components: UNSAFE_componentWillMount in Main/NoticesList/PrivacySettings/Query*/Search/Tracker, setState in WritingSettings, FormToggle uncontrolled→controlled, Cannot update Transitioner while rendering HashRouter); trunk class (#52667 retired the flag, the page now runs under boot), not the bump. Absent on Atomic, which runs the production React build: dev-only noise green
G 7.1.3 off PA (WooCommerce + Traffic), Forms, My Jetpack, core editor + Jetpack sidebar (SEO) CORE serves notices/theme/private-apis/rich-text/a11y/components/data/element and boot/route/a11y/abilities/connectors; wp-views and @wordpress/widget-primitives POLYFILL, served from jetpack-protect's copy (/plugins/jetpack-protect/jetpack_vendor/.../wp-build-polyfills/build/modules/widget-primitives/index.js): the three active copies (jetpack, jetpack-protect, jetpack-boost) are 0.9.0 with package_version, Protect registered first and Jetpack left an equal version alone; Stats v2 loads with HostLink clean green
G3 7.1.3 24.0.0 PA (WooCommerce + Traffic) GB serves everything except wp-views and @wordpress/widget-primitives POLYFILL (jetpack-protect's copy, 0.9.0): the GUTENBERG_WIDGET_PRIMITIVES_MIN_VERSION 24.1.0 gate replaced GB 24.0's copy, which lacks HostLink, now reading package_version from index.asset.php clean green: the case from Lourens' review, with the final implementation
E 7.0.4 off PA (WooCommerce + Traffic), Forms, core editor + Jetpack sidebar (SEO) CORE serves notices/theme/a11y/components/data/element and boot/route/a11y/abilities/connectors; wp-private-apis 2.0, wp-rich-text, wp-views and @wordpress/widget-primitives POLYFILL (jetpack-protect's copy) clean green (summary tiles with smaller type = pre-existing in E, same as on 10-09 and in #52187)
F 7.0.4 24.1.0 PA (WooCommerce + Traffic), editor + Jetpack sidebar (SEO) GB serves everything, including @wordpress/widget-primitives (24.1.0 ships HostLink, the gate does not replace it); wp-views POLYFILL (jetpack-protect's copy) clean green

Findings

No regression attributable to the bump. Console clean in all 5 cells and on every surface, except Jetpack's classic Settings (see the G2 row), whose 6 warnings are StrictMode over legacy components: trunk retired the jetpack-settings-wp-build flag (#52667) and the page now runs under @wordpress/boot; no package from the bump is involved (route and boot come from GB/core), and they do not show up on Atomic (production React build).

Verified in this round:

  • Polyfill with package_version in index.asset.php: the three active copies (jetpack, jetpack-protect, jetpack-boost) are 0.9.0 and declare the version; in G and E wp-views + @wordpress/widget-primitives are served by jetpack-protect's copy (it registered first, Jetpack does not replace an equal copy) and Stats v2 loads with HostLink. In G3 (GB 24.0.0) the 24.1.0 gate replaces Gutenberg's copy; in G2/F (GB 24.1.0) Gutenberg wins.
  • PA empty states (chart-empty-state with EmptyState.Visual + ButtonLink): Top referrers, Devices, Locations (Retry), Top UTM, Top videos (Upload video) render in G, G2, G3, E and F.
  • ui 0.24 Menu (PA date range) opens and closes correctly.
  • Stroke icons (icons 18): Protect navigation and accordion, firewall "Paid feature" tiles, My Jetpack, tinted through color instead of fill.
  • Editor + Jetpack sidebar (SEO) on core 7.0.4, 7.1.3 and with GB 24.0.0/24.1.0.

Not exercisable on the Docker site (covered by typecheck/jest, not by the browser):

  • Boost overview with ProgressBar meters: without a plan or a user connection the plugin shows the pricing page.
  • Newsletter email-design-section.tsx (ButtonLink + addQueryArgs): the Email design section belongs to WordPress.com (Atomic/Simple) and does not show up self-hosted.
  • PA plan-limit-notice.tsx (Notice.CloseIconButton): needs a site near its views limit.
  • PA utm-url-builder-dialog.tsx (Dialog.CloseIconButton): the UTM widget shows "You don't have access to this data" on this site, not the empty state with "Build URL".
  • Backup backup-detail/index.tsx (ButtonLink.Icon): the Backup dashboard is not in the menu without a Backup product; the standalone plugin is inactive and unbuilt.
  • Protect threat-details.tsx / delete-software.tsx: no threats, so no detail panel.
  • mu-wpcom tailored-list.tsx + difm-offer-banner.tsx: AI Launchpad is WordPress.com only.
  • VideoPress and Social: no user connection (My Jetpack asks to "Connect your user account").

Environment

Base checkout ~/lab/jetpack on renovate/wordpress-monorepo @ 0d49bab05a; builds by Damián 16:15-16:46 UTC (plugins/jetpack, premium-analytics, boost, protect, all with --deps), after deleting the orphaned node_modules inside PA's sub-packages (see memory stale-nested-node-modules-non-importers). Docker jetpack_dev (:8888) through ibardaga.ngrok.app, session jp_docker_acct. Changes made and reverted: Boost activated for the check and deactivated; core downgraded to 7.1 by cell-g.sh and restored to 7.1.3 (the scripts now ask for 7.1.3); Gutenberg 24.0.0 downloaded into the gutenberg slug for G3 and the slug restored to 24.1.0 (the gutenberg-24-1-0 copy removed); two auto-drafts created by post-new.php (WordPress purges them). Final state: WP 7.1.3 + Gutenberg 24.1.0 active, plugins as at the start.

Atomic: retrofoxsuperdeploy.wpcomstaging.com (2026-10-14, afternoon)

WP 7.1.3, Gutenberg 23.9.0-rc.1 active, Commerce plan, WooCommerce 11.2.1, jetpack-dev = Beta build 16.4-a.0-38582201632-g0d49bab0 (head 0d49bab05a), Debug Helper with provenance. Damián's Chrome through the a8c proxy (PROXIED V2). Screenshots atomic-*.jpg.

The real cross-plugin case: two polyfill copies, jetpack-dev (0.9.0 with package_version) and wpcomsh (/wordpress/plugins/wpcomsh/latest/jetpack_vendor/.../wp-build-polyfills, an older build without package_version, which counts as older).

Surface Provenance Console Result
PA WooCommerce (empty store: generic empty states) and Traffic (map, Top referrers/UTM/links/videos in empty/error state) GB 23.9.0-rc.1 serves react/element/notices/theme/private-apis/rich-text/data/components/a11y and boot/route/a11y/abilities/connectors; wp-views and @wordpress/widget-primitives POLYFILL from jetpack-dev (beats GB 23.9 through the 24.1.0 gate and wpcomsh's versionless copy) clean green
My Jetpack — — does not exist on Atomic ("Sorry, you are not allowed"): the WoA Jetpack menu is Social, Akismet, Activity Log, Scan, Backup, Forms, Monetize, Search, Newsletter, Settings, Jetpack AI, VideoPress
Newsletter Overview (onboarding checklist) GB clean green
Newsletter Settings GB clean green; the Email design section (ButtonLink + addQueryArgs) does not show up: on Atomic the blog sticker enables it (#53496) and this site lacks it
Backup (admin.php?page=jetpack-backup) — clean minimal "Manage your backup files" page (file browser); the new dashboard with backup-detail (ButtonLink.Icon) is not exposed on this site
VideoPress (connected library, welcome modal, then the "Upload your first video" empty state) GB clean green
Scan — — on Atomic the menu goes to Calypso (wordpress.com/scan/…), not plugin code
Social (no connected accounts, empty state with a stroke icon) GB clean green
Forms (DataViews 20, empty forms list, 8 responses) GB clean green
Jetpack AI (admin.php?page=jetpack-ai: "turned off" notice, 20/20 requests meter with ProgressBar tinted blue through the > div rule, MCP quick start, videos) GB clean green
Jetpack Settings (admin.php?page=jetpack-settings, Security) GB clean: the 6 React warnings from Docker do not appear on Atomic because they come from React's development build (production does not emit them) green
Editor (GB 23.9.0-rc.1) + Jetpack sidebar: SEO, Shortlink, Share to social media (network icons, "Connect your accounts"), Link preview, Insert likes and sharing GB clean green

Atomic conclusion: green. No regressions; console clean on every surface. The real cross-plugin case (wpcomsh with a versionless polyfill + jetpack-dev 0.9.0 + Gutenberg 23.9 below the gate) resolves to jetpack-dev's copy and Stats v2 loads. Not exercisable on this site: My Jetpack (absent on Atomic), Scan (Calypso), the new Backup dashboard, Newsletter Email design (no sticker), Boost (not installed), Protect threats. Pending: Simple (Damián's sandbox).

Simple: jetpackme.wordpress.com through the sandbox (2026-10-14, afternoon)

Sandbox retrofocs.dev.dfw on wpcom trunk @ 04dc2917ac6 with wp-content/mu-plugins/jetpack-plugin/sun/ replaced by the Beta build of our head (16.4-a.0-38582201632-g0d49bab0); moon still on 16.4-a.0. Without the Debug Helper, the proof that our build is running comes from two sides:

  • Server (ssh sandbox): sun/jetpack.php declares 16.4-a.0-38582201632-g0d49bab0 (CI run 38582201632 = head 0d49bab05a) and sun/jetpack_vendor/automattic/jetpack-wp-build-polyfills/build/modules/widget-primitives/index.asset.php carries package_version => 0.9.0, a key that exists only on this branch; moon lacks it. The loader (0-wpcom-jetpack-loader.php) picks JETPACK_PLUGIN_LOADER unless the jetpack-sun-moon-opposite sticker or a dev/ directory says otherwise.
  • Browser (no Debug Helper): the import map and the <script src> entries classified by path. @automattic/jetpack-premium-analytics-sdk is served from /wp-content/mu-plugins/jetpack-plugin/sun/…; react, element, notices, theme, private-apis, rich-text, data, components, a11y and the boot/route/a11y/widget-primitives modules come from /wp-content/plugins/gutenberg-core/v24.1.0/ (24.1.0 ships HostLink, the gate does not replace it). On top of that, the served routes/dashboard/content.min.js bundle contains CloseIconButton ×7 and ButtonLink ×2, with zero LinkButton and zero spokenMessage: ui 0.24 code.
Surface Provenance Console Result
PA Traffic (41.9K views, Top pages/referrers/Devices with data), Insights (Year in review, All-time, Most popular), Subscribers (60.5K) GB core 24.1.0 + SDK from SUN clean green
Newsletter Overview + Settings GB core + SUN clean green; Email design does not show up here either (sticker)
Podcast (welcome page, "included with your plan") GB core + SUN clean green
Forms responses (DataViews 20 with 3,926 real responses, filters, pagination 1/197) GB core + SUN clean green
Editor (Gutenberg core 24.1.0) + Jetpack sidebar opened through wp.data (enableComplementaryArea( 'core', 'jetpack-sidebar/jetpack' )): Improve with AI ("moved to the WordPress Agent" notice), Optimize SEO with the metadata generator GB core + SUN clean (pattern widened with Error) green; Simple's editor has no Jetpack button in the top bar and find fails on the tree size (>200K tokens), hence the wp.data shortcut

Simple conclusion: green. Our build (sun) serves PA, Forms, Newsletter, Podcast and the editor sidebar without console errors; Gutenberg core 24.1.0 provides the shared packages, so the polyfill never kicks in (neither widget-primitives nor private-apis from the polyfill are exercised on Simple). mu-wpcom was not touched on the sandbox (still trunk's copy), so AI Launchpad stays out of scope.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Admin Page React-powered dashboard under the Jetpack menu [Block] AI Assistant [Block] Contact Form Coverage tests to be added later Use to ignore the Code coverage requirement check when tests will be added in a follow-up PR E2E Tests [Extension] AI Assistant Plugin [Feature] Contact Form [Feature] Masterbar WordPress.com Toolbar and Dashboard customizations [Feature] Publicize Now Jetpack Social, auto-sharing [Feature] Theme Tools [JS Package] AI Client [JS Package] API [JS Package] Base Styles [JS Package] Boost Score Api [JS Package] Charts [JS Package] Components [JS Package] Connection [JS Package] Eslint Config Target Es [JS Package] I18n Loader Webpack Plugin [JS Package] IDC [JS Package] Image Guide [JS Package] Jetpack Shared Stores [JS Package] Licensing [JS Package] Partner Coupon [JS Package] Scan [JS Package] Shared Extension Utils [JS Package] Social Previews [JS Package] Storybook [JS Package] Webpack Config [mu wpcom Feature] Ai Launchpad [mu wpcom Feature] Wpcom Backup [Package] Activity Log [Package] Admin Ui [Package] Ads [Package] Agents Manager [Package] Assets [Package] Backup [Package] Blaze [Package] Classic Theme Helper [Package] Comments [Package] Connection [Package] Cookie Consent [Package] Explat [Package] External Connections [Package] External Media [Package] Forms [Package] Jetpack mu wpcom WordPress.com Features [Package] Jitm [Package] Masterbar [Package] My Jetpack [Package] Newsletter [Package] Paypal Payments [Package] Podcast [Package] Post List [Package] Premium Analytics [Package] Protect [Package] Publicize [Package] Rtc [Package] Scan [Package] Search Contains core Search functionality for Jetpack and Search plugins [Package] Seo [Package] Sharing Likes [Package] VideoPress [Package] Woocommerce Stats [Package] Wp Build Polyfills [Package] Yoast Promo [Plugin] Automattic For Agencies Client [Plugin] Boost A feature to speed up the site and improve performance. [Plugin] Classic Theme Helper Plugin [Plugin] Inspect [Plugin] Jetpack Issues about the Jetpack plugin. https://wordpress.org/plugins/jetpack/ [Plugin] Paypal Payment Buttons [Plugin] Protect A plugin with features to protect a site: brute force protection, security scanning, and a WAF. [Plugin] Starter Plugin [Plugin] VideoPress A standalone plugin to add high-quality VideoPress videos to your site. RNA Task [Tests] Includes Tests

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants