Commit f0ae5d99baf for woocommerce

commit f0ae5d99bafb26135cc24dc8b8c9c94de9a3fa92
Author: Christopher Allford <6451942+ObliviousHarmony@users.noreply.github.com>
Date:   Tue Jun 2 03:14:40 2026 -0700

    Centralize `esbuild` Configuration (#65422)

    * Scaffold @woocommerce/internal-build Package

    Move SCSS abstracts, webpack helpers, generate-types script, and shared
    tsconfig out of @woocommerce/internal-style-build and
    @woocommerce/internal-ts-config into a single new package. Patch headers
    and includePaths are rewritten for the renamed directories. The lib's
    own TypeScript scaffold builds cleanly via tsc; the esbuild helpers it
    will expose are stubbed and land in a follow-up commit.

    * Implement Esbuild Helpers in @woocommerce/internal-build

    Add runPackageBuilder, buildPackage, and watchPackage plus a TTY-aware
    logger that drives output for both one-shot and watch builds. Watch
    mode shuts down cleanly on SIGINT and SIGTERM. Webpack helpers are
    renamed to .cjs so the package can opt into "type": "module" while the
    require-only subpath export still resolves to CommonJS.

    * Wire @woocommerce/internal-build Into 23 packages/js Packages

    Add the workspace dep and drop esbuild, glob, chokidar, and
    @woocommerce/internal-ts-config which are now provided transitively.
    The per-package build.mjs, tsconfig, and exports edits land in
    follow-up commits.

    * Migrate @woocommerce/number to internal-build

    Replace build.mjs with a runPackageBuilder call, retarget tsconfig
    extends, drop the dead tsconfig-cjs.json, and add conditional exports
    with publishConfig stripping the source condition on publish.

    * Migrate @woocommerce/admin-layout to internal-build

    Replace build.mjs with a runPackageBuilder call, retarget tsconfig
    extends, drop the dead tsconfig-cjs.json, and add conditional exports
    with publishConfig stripping the source condition on publish.

    * Migrate @woocommerce/block-templates to internal-build

    * Migrate @woocommerce/components to internal-build

    * Migrate @woocommerce/csv-export to internal-build

    * Migrate @woocommerce/currency to internal-build

    * Migrate @woocommerce/customer-effort-score to internal-build

    * Migrate @woocommerce/data to internal-build

    * Migrate @woocommerce/date to internal-build

    * Migrate @woocommerce/e2e-utils-playwright to internal-build

    * Migrate @woocommerce/email-editor to internal-build

    * Migrate @woocommerce/experimental to internal-build

    * Migrate @woocommerce/experimental-products-app to internal-build

    * Migrate @woocommerce/explat to internal-build

    * Migrate @woocommerce/expression-evaluation to internal-build

    * Migrate @woocommerce/integrate-plugin to internal-build

    * Migrate @woocommerce/navigation to internal-build

    * Migrate @woocommerce/notices to internal-build

    * Migrate @woocommerce/onboarding to internal-build

    * Migrate @woocommerce/remote-logging to internal-build

    * Migrate @woocommerce/sanitize to internal-build

    * Migrate @woocommerce/tracks to internal-build

    * Migrate @woocommerce/internal-js-tests to internal-build

    Uses runPackageBuilder's ignore option to exclude setup-*.js and
    mocks/** from the entry point glob. The jest preset inlines the
    react-jsx and module: commonjs overrides directly into the ts-jest
    config since the old tsconfig-jest.json no longer exists.

    * Migrate @woocommerce/product-editor to internal-build

    Uses runPackageBuilder's assets option to copy block.json files
    alongside the JS output so the runtime block.json imports resolve.

    * Retarget WordPress Type Augmentation Imports to internal-build

    Ten monorepo-enhancements.d.ts files imported from
    @woocommerce/internal-ts-config/types/@wordpress/...; redirect to
    @woocommerce/internal-build/type-overrides/@wordpress/...

    * Clean Up Syncpack Rules and Admin and Blocks Hoist Lists

    Drop the chokidar, esbuild, and glob pin rules now that the only
    declarer is @woocommerce/internal-build, and loosen its version ranges
    to syncpack's defaults. Swap @woocommerce/internal-ts-config for
    @woocommerce/internal-build as a workspace dep on admin and blocks,
    and retarget their node_modules hoist entries plus a typings file in
    blocks that the stage 3d sweep missed.

    * Swap @woocommerce/internal-style-build for the style-build Subpath

    Rename internal-build's src/webpack directory to src/style-build and
    expose it under the @woocommerce/internal-build/style-build export.
    Retarget all 13 consumer webpack configs and drop the
    @woocommerce/internal-style-build workspace dep from 11 package.json
    files. The legacy admin.scss comment is updated for accuracy.

    * Drop @woocommerce/data Deep Imports From Admin Homescreen

    Two admin homescreen files reached past the package boundary with
    import { createErrorNotice } from '@woocommerce/data/src/plugins/actions'.
    Replace with useDispatch( 'core/notices' ), which has been a top-level
    action on the notices store since @wordpress/notices shipped its
    public API. Equivalent behavior; no deep import; works through the new
    conditional exports field that @woocommerce/data now carries.

    * Delete @woocommerce/internal-style-build and @woocommerce/internal-ts-config

    Both packages have been hollowed out across stages 1 through 4 — their
    SCSS abstracts, webpack helpers, shared tsconfig, WordPress type
    overrides, and generate-types script all live in
    @woocommerce/internal-build now. Delete the husks, retarget the pnpm
    hook marker that gates TypeScript project-reference syncing, scrub
    syncpack and codecov references, and update the blocks RTL plugin
    docs.

    * Fix --cjs Flag in Two Migrated Packages

    @woocommerce/e2e-utils-playwright and @woocommerce/integrate-plugin
    were missed by the stage 3 migration script because their CJS build
    script lives at build:project:cjs (rather than build:publish:project:cjs
    like every other package). Both still passed --cjs to build.mjs, which
    the runPackageBuilder lib does not recognize; the build silently fell
    back to esmodules and wrote the CJS output to the ESM directory.
    Rename to --commonjs.

    * Fix Failing Tests

    * Migrate @woocommerce/settings-ui-sdk to internal-build

    * Linting Fixes

    * Removed Fake Condition Export

    * Use `wc-source`

    In practice, `"source"` might collide with other
    projects. This prevents that.

    * Monorepo: resolve merge conflicts.

    ---------

    Co-authored-by: kalessil <kalessil@gmail.com>

diff --git a/.codecov.yml b/.codecov.yml
index f631b4d57ae..4cf81e57f86 100644
--- a/.codecov.yml
+++ b/.codecov.yml
@@ -8,8 +8,8 @@ ignore:
     - 'tools/**'
     - 'packages/js/create-woo-extension'
     - 'packages/js/eslint-plugin'
+    - 'packages/js/internal-build'
     - 'packages/js/internal-js-tests'
-    - 'packages/js/internal-style-build'
     - '**/*.test.*'

 coverage:
diff --git a/.pnpmfile.cjs b/.pnpmfile.cjs
index cbe684e8006..f5158263d8c 100644
--- a/.pnpmfile.cjs
+++ b/.pnpmfile.cjs
@@ -84,9 +84,9 @@ function writeTsconfig( tsconfigPath, tsconfig ) {
 }

 /**
- * Identify workspace packages that consume @woocommerce/internal-ts-config.
+ * Identify workspace packages that consume @woocommerce/internal-build.
  *
- * A TS consumer has @woocommerce/internal-ts-config in dependencies or
+ * A TS consumer has @woocommerce/internal-build in dependencies or
  * devDependencies. Whether the package has a tsconfig.json on disk is
  * verified by loadTsconfig later in syncTsReferences.
  *
@@ -102,7 +102,7 @@ function identifyTsConsumers( lockfile ) {
 			...( packageFile.dependencies || {} ),
 			...( packageFile.devDependencies || {} ),
 		};
-		if ( ! ( '@woocommerce/internal-ts-config' in allDeps ) ) {
+		if ( ! ( '@woocommerce/internal-build' in allDeps ) ) {
 			continue;
 		}

diff --git a/.syncpackrc b/.syncpackrc
index 02a712124ba..3c75a26c57a 100644
--- a/.syncpackrc
+++ b/.syncpackrc
@@ -9,7 +9,7 @@
 	},
 	"versionGroups": [
 		{
-			"label": "Banned dependencies: classnames(->clsx), concurrently(->pnpm), cross-env(->wsl),@automattic/webpack-rtl-plugin(->internal-style-build)",
+			"label": "Banned dependencies: classnames(->clsx), concurrently(->pnpm), cross-env(->wsl),@automattic/webpack-rtl-plugin(->internal-build)",
 			"dependencies": [
 				"classnames",
 				"concurrently",
@@ -64,15 +64,16 @@
 			"isIgnored": true
 		},
 		{
-			"label": "internal-ts-config generates version-constrained vendored types for these dependencies",
+			"label": "internal-build generates version-constrained vendored types for these dependencies",
 			"dependencies": [
 				"@wordpress/core-data",
 				"@wordpress/data",
 				"@wordpress/editor",
-				"@wordpress/notices"
+				"@wordpress/notices",
+				"@wordpress/postcss-plugins-preset"
 			],
 			"packages": [
-				"@woocommerce/internal-ts-config"
+				"@woocommerce/internal-build"
 			],
 			"isIgnored": true
 		},
@@ -497,15 +498,6 @@
 			],
 			"pinVersion": "2.1.x"
 		},
-		{
-			"dependencies": [
-				"glob"
-			],
-			"packages": [
-				"**"
-			],
-			"pinVersion": "^10.3.10"
-		},
 		{
 			"dependencies": [
 				"postcss-loader"
@@ -642,24 +634,6 @@
 			],
 			"pinVersion": "0.14.12"
 		},
-		{
-			"dependencies": [
-				"esbuild"
-			],
-			"packages": [
-				"**"
-			],
-			"pinVersion": "0.24.x"
-		},
-		{
-			"dependencies": [
-				"chokidar"
-			],
-			"packages": [
-				"**"
-			],
-			"pinVersion": "3.6.x"
-		},
 		{
 			"dependencies": [
 				"dompurify"
diff --git a/packages/js/admin-layout/build.mjs b/packages/js/admin-layout/build.mjs
index 746bc61fc4b..2d76d01222e 100644
--- a/packages/js/admin-layout/build.mjs
+++ b/packages/js/admin-layout/build.mjs
@@ -1,112 +1,3 @@
-import { build, context } from 'esbuild';
-import { glob } from 'glob';
-import { rm } from 'node:fs/promises';
-import chokidar from 'chokidar';
+import { runPackageBuilder } from '@woocommerce/internal-build';

-const watch = process.argv.includes( '--watch' );
-const format = process.argv.includes( '--cjs' ) ? 'cjs' : 'esm';
-const outdir = format === 'cjs' ? 'build' : 'build-module';
-
-const ENTRY_GLOB = 'src/**/*.{ts,tsx,js,jsx}';
-const ENTRY_IGNORE = [
-	'**/test/**',
-	'**/stories/**',
-	'**/*.test.{ts,tsx,js,jsx}',
-	'**/*.d.ts',
-];
-
-async function resolveEntryPoints() {
-	return glob( ENTRY_GLOB, { ignore: ENTRY_IGNORE } );
-}
-
-function makeOptions( entryPoints ) {
-	return {
-		entryPoints,
-		outdir,
-		outbase: 'src',
-		bundle: false,
-		format,
-		platform: 'neutral',
-		target: 'esnext',
-		loader: { '.js': 'jsx', '.jsx': 'jsx', '.ts': 'ts', '.tsx': 'tsx' },
-		jsx: 'transform',
-		jsxFactory: 'createElement',
-		jsxFragment: 'Fragment',
-		logLevel: 'warning',
-		sourcemap: false,
-	};
-}
-
-function summarize( result ) {
-	const errors = result.errors.length;
-	const warnings = result.warnings.length;
-	const parts = [];
-	if ( errors ) parts.push( `${ errors } error(s)` );
-	if ( warnings ) parts.push( `${ warnings } warning(s)` );
-	return parts.length ? ` — ${ parts.join( ', ' ) }` : '';
-}
-
-// Wrap a watch-mode step so a single failure (disk error, build crash, etc.)
-// doesn't take the watcher process down. Errors are surfaced; the loop survives.
-async function safe( label, fn ) {
-	try {
-		return await fn();
-	} catch ( error ) {
-		console.error( `[watch] ${ label } failed:`, error?.message ?? error );
-		return null;
-	}
-}
-
-await rm( outdir, { recursive: true, force: true } );
-
-if ( watch ) {
-	const startupT0 = Date.now();
-	let entryPoints = await resolveEntryPoints();
-	let ctx = await context( makeOptions( entryPoints ) );
-	const initial = await safe( 'startup build', () => ctx.rebuild() );
-	console.log( `[watch] ready in ${ Date.now() - startupT0 }ms — ${ entryPoints.length } entry point(s)${ initial ? summarize( initial ) : '' }` );
-
-	// esbuild's own watcher polls the filesystem, which can miss or delay
-	// changes (especially edits to files added after context creation).
-	// chokidar uses OS-level events (fsevents/inotify) and drives rebuilds
-	// directly: changes call ctx.rebuild() (preserves the AST cache),
-	// add/unlink trigger a debounced context restart (entry list changed).
-	let pending;
-	const pendingChanges = new Set();
-	const restart = ( path, kind ) => {
-		pendingChanges.add( `${ path } (${ kind })` );
-		clearTimeout( pending );
-		pending = setTimeout( () => safe( 'restart', async () => {
-			const changes = [ ...pendingChanges ];
-			pendingChanges.clear();
-			const preview = changes.slice( 0, 3 ).join( ', ' );
-			const suffix = changes.length > 3 ? `, +${ changes.length - 3 } more` : '';
-			console.log( `[watch] restarting (${ preview }${ suffix })` );
-			const t0 = Date.now();
-			await ctx.dispose();
-			await rm( outdir, { recursive: true, force: true } );
-			entryPoints = await resolveEntryPoints();
-			ctx = await context( makeOptions( entryPoints ) );
-			const result = await ctx.rebuild();
-			console.log( `[watch] rebuilt in ${ Date.now() - t0 }ms — ${ entryPoints.length } entry point(s)${ summarize( result ) }` );
-		} ), 200 );
-	};
-
-	chokidar
-		.watch( ENTRY_GLOB, { ignored: ENTRY_IGNORE, ignoreInitial: true } )
-		.on( 'add', ( path ) => restart( path, 'added' ) )
-		.on( 'unlink', ( path ) => restart( path, 'deleted' ) )
-		.on( 'change', async ( path ) => {
-			const t0 = Date.now();
-			const result = await safe( `rebuild ${ path }`, () => ctx.rebuild() );
-			if ( result ) {
-				console.log( `[watch] rebuilt ${ path } in ${ Date.now() - t0 }ms${ summarize( result ) }` );
-			}
-		} );
-} else {
-	const entryPoints = await resolveEntryPoints();
-	const t0 = Date.now();
-	console.log( `[build] ${ entryPoints.length } entry point(s)...` );
-	const result = await build( makeOptions( entryPoints ) );
-	console.log( `[build] done in ${ Date.now() - t0 }ms${ summarize( result ) }` );
-}
+await runPackageBuilder( { entryPoints: 'src/**/*.{ts,tsx,js,jsx}' } );
diff --git a/packages/js/admin-layout/package.json b/packages/js/admin-layout/package.json
index 6be9fd88a0a..e0d97ab6516 100644
--- a/packages/js/admin-layout/package.json
+++ b/packages/js/admin-layout/package.json
@@ -16,9 +16,17 @@
 	"bugs": {
 		"url": "https://github.com/woocommerce/woocommerce/issues"
 	},
+	"exports": {
+		".": {
+			"wc-source": "./src/index.ts",
+			"types": "./build-types/index.d.ts",
+			"import": "./build-module/index.js",
+			"require": "./build/index.js"
+		}
+	},
 	"main": "build/index.js",
 	"module": "build-module/index.js",
-	"types": "build-types",
+	"types": "build-types/index.d.ts",
 	"react-native": "src/index",
 	"files": [
 		"build",
@@ -31,15 +39,22 @@
 		"src/**/*.scss"
 	],
 	"publishConfig": {
-		"access": "public"
+		"access": "public",
+		"exports": {
+			".": {
+				"types": "./build-types/index.d.ts",
+				"import": "./build-module/index.js",
+				"require": "./build/index.js"
+			}
+		}
 	},
 	"scripts": {
 		"build": "pnpm --if-present --workspace-concurrency=Infinity --stream --filter=\"$npm_package_name...\" '/^build:project:.*$/'",
-		"build:project": "pnpm --if-present '/^build:project:.*$/'",
+		"build:project": "pnpm --stream --if-present '/^build:project:.*$/'",
 		"build:project:bundle": "NODE_ENV=production webpack",
 		"build:project:esm": "node build.mjs",
 		"build:publish:project": "pnpm --if-present '/^build:publish:project:.*$/'",
-		"build:publish:project:cjs": "node build.mjs --cjs",
+		"build:publish:project:cjs": "node build.mjs --commonjs",
 		"build:publish:project:types": "tsc --build --emitDeclarationOnly",
 		"build:publish:project:deps": "pnpm build",
 		"changelog": "XDEBUG_MODE=off composer install --quiet && composer exec -- changelogger",
@@ -63,14 +78,10 @@
 	"devDependencies": {
 		"@types/react": "18.3.x",
 		"@woocommerce/eslint-plugin": "workspace:*",
-		"@woocommerce/internal-style-build": "workspace:*",
-		"@woocommerce/internal-ts-config": "workspace:*",
+		"@woocommerce/internal-build": "workspace:*",
 		"@wordpress/browserslist-config": "next",
-		"chokidar": "3.6.x",
 		"css-loader": "6.11.x",
-		"esbuild": "0.24.x",
 		"eslint": "^8.55.0",
-		"glob": "^10.3.10",
 		"jest": "29.5.x",
 		"jest-cli": "29.5.x",
 		"postcss-loader": "4.3.x",
diff --git a/packages/js/admin-layout/tsconfig-cjs.json b/packages/js/admin-layout/tsconfig-cjs.json
deleted file mode 100644
index 5a4f74e214d..00000000000
--- a/packages/js/admin-layout/tsconfig-cjs.json
+++ /dev/null
@@ -1,18 +0,0 @@
-{
-	"extends": "@woocommerce/internal-ts-config/tsconfig-cjs.json",
-	"compilerOptions": {
-		"rootDir": "src",
-		"outDir": "build",
-		"typeRoots": [
-			"./typings",
-			"./node_modules/@types"
-		]
-	},
-	"include": [
-		"typings/**/*",
-		"src/**/*"
-	],
-	"exclude": [
-		"**/test/**"
-	]
-}
diff --git a/packages/js/admin-layout/tsconfig.json b/packages/js/admin-layout/tsconfig.json
index f041e96649d..7f7e2b3dfe1 100644
--- a/packages/js/admin-layout/tsconfig.json
+++ b/packages/js/admin-layout/tsconfig.json
@@ -1,5 +1,5 @@
 {
-	"extends": "@woocommerce/internal-ts-config/tsconfig.json",
+	"extends": "@woocommerce/internal-build/configs/tsconfig.json",
 	"compilerOptions": {
 		"rootDir": "src",
 		"outDir": "build-module",
diff --git a/packages/js/admin-layout/webpack.config.js b/packages/js/admin-layout/webpack.config.js
index 9d696e6b37f..0f8dbd47654 100644
--- a/packages/js/admin-layout/webpack.config.js
+++ b/packages/js/admin-layout/webpack.config.js
@@ -1,7 +1,7 @@
 /**
  * Internal dependencies
  */
-const { webpackConfig } = require( '@woocommerce/internal-style-build' );
+const { webpackConfig } = require( '@woocommerce/internal-build/style-build' );

 /**
  * External dependencies
@@ -22,7 +22,7 @@ module.exports = {
 			config: [
 				__filename,
 				path.resolve( __dirname, '../../../pnpm-lock.yaml' ),
-				require.resolve( '@woocommerce/internal-style-build' ),
+				require.resolve( '@woocommerce/internal-build/style-build' ),
 			],
 		},
 	},
diff --git a/packages/js/block-templates/build.mjs b/packages/js/block-templates/build.mjs
index 746bc61fc4b..2d76d01222e 100644
--- a/packages/js/block-templates/build.mjs
+++ b/packages/js/block-templates/build.mjs
@@ -1,112 +1,3 @@
-import { build, context } from 'esbuild';
-import { glob } from 'glob';
-import { rm } from 'node:fs/promises';
-import chokidar from 'chokidar';
+import { runPackageBuilder } from '@woocommerce/internal-build';

-const watch = process.argv.includes( '--watch' );
-const format = process.argv.includes( '--cjs' ) ? 'cjs' : 'esm';
-const outdir = format === 'cjs' ? 'build' : 'build-module';
-
-const ENTRY_GLOB = 'src/**/*.{ts,tsx,js,jsx}';
-const ENTRY_IGNORE = [
-	'**/test/**',
-	'**/stories/**',
-	'**/*.test.{ts,tsx,js,jsx}',
-	'**/*.d.ts',
-];
-
-async function resolveEntryPoints() {
-	return glob( ENTRY_GLOB, { ignore: ENTRY_IGNORE } );
-}
-
-function makeOptions( entryPoints ) {
-	return {
-		entryPoints,
-		outdir,
-		outbase: 'src',
-		bundle: false,
-		format,
-		platform: 'neutral',
-		target: 'esnext',
-		loader: { '.js': 'jsx', '.jsx': 'jsx', '.ts': 'ts', '.tsx': 'tsx' },
-		jsx: 'transform',
-		jsxFactory: 'createElement',
-		jsxFragment: 'Fragment',
-		logLevel: 'warning',
-		sourcemap: false,
-	};
-}
-
-function summarize( result ) {
-	const errors = result.errors.length;
-	const warnings = result.warnings.length;
-	const parts = [];
-	if ( errors ) parts.push( `${ errors } error(s)` );
-	if ( warnings ) parts.push( `${ warnings } warning(s)` );
-	return parts.length ? ` — ${ parts.join( ', ' ) }` : '';
-}
-
-// Wrap a watch-mode step so a single failure (disk error, build crash, etc.)
-// doesn't take the watcher process down. Errors are surfaced; the loop survives.
-async function safe( label, fn ) {
-	try {
-		return await fn();
-	} catch ( error ) {
-		console.error( `[watch] ${ label } failed:`, error?.message ?? error );
-		return null;
-	}
-}
-
-await rm( outdir, { recursive: true, force: true } );
-
-if ( watch ) {
-	const startupT0 = Date.now();
-	let entryPoints = await resolveEntryPoints();
-	let ctx = await context( makeOptions( entryPoints ) );
-	const initial = await safe( 'startup build', () => ctx.rebuild() );
-	console.log( `[watch] ready in ${ Date.now() - startupT0 }ms — ${ entryPoints.length } entry point(s)${ initial ? summarize( initial ) : '' }` );
-
-	// esbuild's own watcher polls the filesystem, which can miss or delay
-	// changes (especially edits to files added after context creation).
-	// chokidar uses OS-level events (fsevents/inotify) and drives rebuilds
-	// directly: changes call ctx.rebuild() (preserves the AST cache),
-	// add/unlink trigger a debounced context restart (entry list changed).
-	let pending;
-	const pendingChanges = new Set();
-	const restart = ( path, kind ) => {
-		pendingChanges.add( `${ path } (${ kind })` );
-		clearTimeout( pending );
-		pending = setTimeout( () => safe( 'restart', async () => {
-			const changes = [ ...pendingChanges ];
-			pendingChanges.clear();
-			const preview = changes.slice( 0, 3 ).join( ', ' );
-			const suffix = changes.length > 3 ? `, +${ changes.length - 3 } more` : '';
-			console.log( `[watch] restarting (${ preview }${ suffix })` );
-			const t0 = Date.now();
-			await ctx.dispose();
-			await rm( outdir, { recursive: true, force: true } );
-			entryPoints = await resolveEntryPoints();
-			ctx = await context( makeOptions( entryPoints ) );
-			const result = await ctx.rebuild();
-			console.log( `[watch] rebuilt in ${ Date.now() - t0 }ms — ${ entryPoints.length } entry point(s)${ summarize( result ) }` );
-		} ), 200 );
-	};
-
-	chokidar
-		.watch( ENTRY_GLOB, { ignored: ENTRY_IGNORE, ignoreInitial: true } )
-		.on( 'add', ( path ) => restart( path, 'added' ) )
-		.on( 'unlink', ( path ) => restart( path, 'deleted' ) )
-		.on( 'change', async ( path ) => {
-			const t0 = Date.now();
-			const result = await safe( `rebuild ${ path }`, () => ctx.rebuild() );
-			if ( result ) {
-				console.log( `[watch] rebuilt ${ path } in ${ Date.now() - t0 }ms${ summarize( result ) }` );
-			}
-		} );
-} else {
-	const entryPoints = await resolveEntryPoints();
-	const t0 = Date.now();
-	console.log( `[build] ${ entryPoints.length } entry point(s)...` );
-	const result = await build( makeOptions( entryPoints ) );
-	console.log( `[build] done in ${ Date.now() - t0 }ms${ summarize( result ) }` );
-}
+await runPackageBuilder( { entryPoints: 'src/**/*.{ts,tsx,js,jsx}' } );
diff --git a/packages/js/block-templates/package.json b/packages/js/block-templates/package.json
index 6243b93479c..0d9135825e7 100644
--- a/packages/js/block-templates/package.json
+++ b/packages/js/block-templates/package.json
@@ -16,9 +16,17 @@
 	"bugs": {
 		"url": "https://github.com/woocommerce/woocommerce/issues"
 	},
+	"exports": {
+		".": {
+			"wc-source": "./src/index.ts",
+			"types": "./build-types/index.d.ts",
+			"import": "./build-module/index.js",
+			"require": "./build/index.js"
+		}
+	},
 	"main": "build/index.js",
 	"module": "build-module/index.js",
-	"types": "build-types",
+	"types": "build-types/index.d.ts",
 	"react-native": "src/index",
 	"files": [
 		"build",
@@ -32,11 +40,11 @@
 	],
 	"scripts": {
 		"build": "pnpm --if-present --workspace-concurrency=Infinity --stream --filter=\"$npm_package_name...\" '/^build:project:.*$/'",
-		"build:project": "pnpm --if-present '/^build:project:.*$/'",
+		"build:project": "pnpm --stream --if-present '/^build:project:.*$/'",
 		"build:project:bundle": "NODE_ENV=production webpack",
 		"build:project:esm": "node build.mjs",
 		"build:publish:project": "pnpm --if-present '/^build:publish:project:.*$/'",
-		"build:publish:project:cjs": "node build.mjs --cjs",
+		"build:publish:project:cjs": "node build.mjs --commonjs",
 		"build:publish:project:types": "tsc --build --emitDeclarationOnly",
 		"build:publish:project:deps": "pnpm build",
 		"changelog": "XDEBUG_MODE=off composer install --quiet && composer exec -- changelogger",
@@ -72,16 +80,12 @@
 		"@types/wordpress__block-editor": "catalog:wp-min",
 		"@types/wordpress__blocks": "catalog:wp-min",
 		"@woocommerce/eslint-plugin": "workspace:*",
+		"@woocommerce/internal-build": "workspace:*",
 		"@woocommerce/internal-js-tests": "workspace:*",
-		"@woocommerce/internal-style-build": "workspace:*",
-		"@woocommerce/internal-ts-config": "workspace:*",
 		"@wordpress/browserslist-config": "next",
-		"chokidar": "3.6.x",
 		"copy-webpack-plugin": "13.0.x",
 		"css-loader": "6.11.x",
-		"esbuild": "0.24.x",
 		"eslint": "^8.55.0",
-		"glob": "^10.3.10",
 		"jest": "29.5.x",
 		"jest-cli": "29.5.x",
 		"jest-environment-jsdom": "29.5.x",
@@ -103,7 +107,14 @@
 		"react-dom": "18.3.x"
 	},
 	"publishConfig": {
-		"access": "public"
+		"access": "public",
+		"exports": {
+			".": {
+				"types": "./build-types/index.d.ts",
+				"import": "./build-module/index.js",
+				"require": "./build/index.js"
+			}
+		}
 	},
 	"config": {
 		"ci": {
diff --git a/packages/js/block-templates/tsconfig-cjs.json b/packages/js/block-templates/tsconfig-cjs.json
deleted file mode 100644
index 5a4f74e214d..00000000000
--- a/packages/js/block-templates/tsconfig-cjs.json
+++ /dev/null
@@ -1,18 +0,0 @@
-{
-	"extends": "@woocommerce/internal-ts-config/tsconfig-cjs.json",
-	"compilerOptions": {
-		"rootDir": "src",
-		"outDir": "build",
-		"typeRoots": [
-			"./typings",
-			"./node_modules/@types"
-		]
-	},
-	"include": [
-		"typings/**/*",
-		"src/**/*"
-	],
-	"exclude": [
-		"**/test/**"
-	]
-}
diff --git a/packages/js/block-templates/tsconfig.json b/packages/js/block-templates/tsconfig.json
index c66fb29617e..ae9029b5e06 100644
--- a/packages/js/block-templates/tsconfig.json
+++ b/packages/js/block-templates/tsconfig.json
@@ -1,5 +1,5 @@
 {
-	"extends": "@woocommerce/internal-ts-config/tsconfig.json",
+	"extends": "@woocommerce/internal-build/configs/tsconfig.json",
 	"compilerOptions": {
 		"rootDir": "src",
 		"outDir": "build-module",
diff --git a/packages/js/block-templates/typings/monorepo-enhancements.d.ts b/packages/js/block-templates/typings/monorepo-enhancements.d.ts
index db9ce864929..6871fc81e6b 100644
--- a/packages/js/block-templates/typings/monorepo-enhancements.d.ts
+++ b/packages/js/block-templates/typings/monorepo-enhancements.d.ts
@@ -1,3 +1,3 @@
-import '@woocommerce/internal-ts-config/types/@wordpress/data';
-import '@woocommerce/internal-ts-config/types/@wordpress/core-data';
-import '@woocommerce/internal-ts-config/types/@wordpress/block-editor';
+import '@woocommerce/internal-build/type-overrides/@wordpress/data';
+import '@woocommerce/internal-build/type-overrides/@wordpress/core-data';
+import '@woocommerce/internal-build/type-overrides/@wordpress/block-editor';
diff --git a/packages/js/block-templates/webpack.config.js b/packages/js/block-templates/webpack.config.js
index 9d696e6b37f..0f8dbd47654 100644
--- a/packages/js/block-templates/webpack.config.js
+++ b/packages/js/block-templates/webpack.config.js
@@ -1,7 +1,7 @@
 /**
  * Internal dependencies
  */
-const { webpackConfig } = require( '@woocommerce/internal-style-build' );
+const { webpackConfig } = require( '@woocommerce/internal-build/style-build' );

 /**
  * External dependencies
@@ -22,7 +22,7 @@ module.exports = {
 			config: [
 				__filename,
 				path.resolve( __dirname, '../../../pnpm-lock.yaml' ),
-				require.resolve( '@woocommerce/internal-style-build' ),
+				require.resolve( '@woocommerce/internal-build/style-build' ),
 			],
 		},
 	},
diff --git a/packages/js/components/build.mjs b/packages/js/components/build.mjs
index 746bc61fc4b..2d76d01222e 100644
--- a/packages/js/components/build.mjs
+++ b/packages/js/components/build.mjs
@@ -1,112 +1,3 @@
-import { build, context } from 'esbuild';
-import { glob } from 'glob';
-import { rm } from 'node:fs/promises';
-import chokidar from 'chokidar';
+import { runPackageBuilder } from '@woocommerce/internal-build';

-const watch = process.argv.includes( '--watch' );
-const format = process.argv.includes( '--cjs' ) ? 'cjs' : 'esm';
-const outdir = format === 'cjs' ? 'build' : 'build-module';
-
-const ENTRY_GLOB = 'src/**/*.{ts,tsx,js,jsx}';
-const ENTRY_IGNORE = [
-	'**/test/**',
-	'**/stories/**',
-	'**/*.test.{ts,tsx,js,jsx}',
-	'**/*.d.ts',
-];
-
-async function resolveEntryPoints() {
-	return glob( ENTRY_GLOB, { ignore: ENTRY_IGNORE } );
-}
-
-function makeOptions( entryPoints ) {
-	return {
-		entryPoints,
-		outdir,
-		outbase: 'src',
-		bundle: false,
-		format,
-		platform: 'neutral',
-		target: 'esnext',
-		loader: { '.js': 'jsx', '.jsx': 'jsx', '.ts': 'ts', '.tsx': 'tsx' },
-		jsx: 'transform',
-		jsxFactory: 'createElement',
-		jsxFragment: 'Fragment',
-		logLevel: 'warning',
-		sourcemap: false,
-	};
-}
-
-function summarize( result ) {
-	const errors = result.errors.length;
-	const warnings = result.warnings.length;
-	const parts = [];
-	if ( errors ) parts.push( `${ errors } error(s)` );
-	if ( warnings ) parts.push( `${ warnings } warning(s)` );
-	return parts.length ? ` — ${ parts.join( ', ' ) }` : '';
-}
-
-// Wrap a watch-mode step so a single failure (disk error, build crash, etc.)
-// doesn't take the watcher process down. Errors are surfaced; the loop survives.
-async function safe( label, fn ) {
-	try {
-		return await fn();
-	} catch ( error ) {
-		console.error( `[watch] ${ label } failed:`, error?.message ?? error );
-		return null;
-	}
-}
-
-await rm( outdir, { recursive: true, force: true } );
-
-if ( watch ) {
-	const startupT0 = Date.now();
-	let entryPoints = await resolveEntryPoints();
-	let ctx = await context( makeOptions( entryPoints ) );
-	const initial = await safe( 'startup build', () => ctx.rebuild() );
-	console.log( `[watch] ready in ${ Date.now() - startupT0 }ms — ${ entryPoints.length } entry point(s)${ initial ? summarize( initial ) : '' }` );
-
-	// esbuild's own watcher polls the filesystem, which can miss or delay
-	// changes (especially edits to files added after context creation).
-	// chokidar uses OS-level events (fsevents/inotify) and drives rebuilds
-	// directly: changes call ctx.rebuild() (preserves the AST cache),
-	// add/unlink trigger a debounced context restart (entry list changed).
-	let pending;
-	const pendingChanges = new Set();
-	const restart = ( path, kind ) => {
-		pendingChanges.add( `${ path } (${ kind })` );
-		clearTimeout( pending );
-		pending = setTimeout( () => safe( 'restart', async () => {
-			const changes = [ ...pendingChanges ];
-			pendingChanges.clear();
-			const preview = changes.slice( 0, 3 ).join( ', ' );
-			const suffix = changes.length > 3 ? `, +${ changes.length - 3 } more` : '';
-			console.log( `[watch] restarting (${ preview }${ suffix })` );
-			const t0 = Date.now();
-			await ctx.dispose();
-			await rm( outdir, { recursive: true, force: true } );
-			entryPoints = await resolveEntryPoints();
-			ctx = await context( makeOptions( entryPoints ) );
-			const result = await ctx.rebuild();
-			console.log( `[watch] rebuilt in ${ Date.now() - t0 }ms — ${ entryPoints.length } entry point(s)${ summarize( result ) }` );
-		} ), 200 );
-	};
-
-	chokidar
-		.watch( ENTRY_GLOB, { ignored: ENTRY_IGNORE, ignoreInitial: true } )
-		.on( 'add', ( path ) => restart( path, 'added' ) )
-		.on( 'unlink', ( path ) => restart( path, 'deleted' ) )
-		.on( 'change', async ( path ) => {
-			const t0 = Date.now();
-			const result = await safe( `rebuild ${ path }`, () => ctx.rebuild() );
-			if ( result ) {
-				console.log( `[watch] rebuilt ${ path } in ${ Date.now() - t0 }ms${ summarize( result ) }` );
-			}
-		} );
-} else {
-	const entryPoints = await resolveEntryPoints();
-	const t0 = Date.now();
-	console.log( `[build] ${ entryPoints.length } entry point(s)...` );
-	const result = await build( makeOptions( entryPoints ) );
-	console.log( `[build] done in ${ Date.now() - t0 }ms${ summarize( result ) }` );
-}
+await runPackageBuilder( { entryPoints: 'src/**/*.{ts,tsx,js,jsx}' } );
diff --git a/packages/js/components/package.json b/packages/js/components/package.json
index c916779a338..4795e7d1168 100644
--- a/packages/js/components/package.json
+++ b/packages/js/components/package.json
@@ -20,6 +20,14 @@
 	"bugs": {
 		"url": "https://github.com/woocommerce/woocommerce/issues"
 	},
+	"exports": {
+		".": {
+			"wc-source": "./src/index.ts",
+			"types": "./build-types/index.d.ts",
+			"import": "./build-module/index.js",
+			"require": "./build/index.js"
+		}
+	},
 	"main": "build/index.js",
 	"module": "build-module/index.js",
 	"react-native": "src/index",
@@ -33,14 +41,14 @@
 		"build-style/**",
 		"src/**/*.scss"
 	],
-	"types": "build-types",
+	"types": "build-types/index.d.ts",
 	"scripts": {
 		"build": "pnpm --if-present --workspace-concurrency=Infinity --stream --filter=\"$npm_package_name...\" '/^build:project:.*$/'",
-		"build:project": "pnpm --if-present '/^build:project:.*$/'",
+		"build:project": "pnpm --stream --if-present '/^build:project:.*$/'",
 		"build:project:bundle": "NODE_ENV=production webpack",
 		"build:project:esm": "node build.mjs",
 		"build:publish:project": "pnpm --if-present '/^build:publish:project:.*$/'",
-		"build:publish:project:cjs": "node build.mjs --cjs",
+		"build:publish:project:cjs": "node build.mjs --commonjs",
 		"build:publish:project:types": "tsc --build --emitDeclarationOnly",
 		"build:publish:project:deps": "pnpm build",
 		"changelog": "XDEBUG_MODE=off composer install --quiet && composer exec -- changelogger",
@@ -130,7 +138,14 @@
 		"react-dom": "18.3.x"
 	},
 	"publishConfig": {
-		"access": "public"
+		"access": "public",
+		"exports": {
+			".": {
+				"types": "./build-types/index.d.ts",
+				"import": "./build-module/index.js",
+				"require": "./build/index.js"
+			}
+		}
 	},
 	"devDependencies": {
 		"@babel/core": "7.25.7",
@@ -151,16 +166,12 @@
 		"@types/uuid": "^8.3.4",
 		"@types/wordpress__viewport": "catalog:wp-min",
 		"@woocommerce/eslint-plugin": "workspace:*",
+		"@woocommerce/internal-build": "workspace:*",
 		"@woocommerce/internal-js-tests": "workspace:*",
-		"@woocommerce/internal-style-build": "workspace:*",
-		"@woocommerce/internal-ts-config": "workspace:*",
 		"@wordpress/babel-preset-default": "next",
 		"@wordpress/browserslist-config": "next",
-		"chokidar": "3.6.x",
 		"css-loader": "6.11.x",
-		"esbuild": "0.24.x",
 		"eslint": "^8.55.0",
-		"glob": "^10.3.10",
 		"jest": "29.5.x",
 		"jest-cli": "29.5.x",
 		"jest-environment-jsdom": "29.5.x",
diff --git a/packages/js/components/tsconfig-cjs.json b/packages/js/components/tsconfig-cjs.json
deleted file mode 100644
index 247b557c04c..00000000000
--- a/packages/js/components/tsconfig-cjs.json
+++ /dev/null
@@ -1,19 +0,0 @@
-{
-	"extends": "@woocommerce/internal-ts-config/tsconfig-cjs.json",
-	"compilerOptions": {
-		"rootDir": "src",
-		"outDir": "build",
-		"typeRoots": [
-			"./typings",
-			"./node_modules/@types"
-		]
-	},
-	"include": [
-		"typings/**/*",
-		"src/**/*"
-	],
-	"exclude": [
-		"**/test/**",
-		"**/stories/**"
-	]
-}
diff --git a/packages/js/components/tsconfig.json b/packages/js/components/tsconfig.json
index 5bcd6b93a13..63de96a3577 100644
--- a/packages/js/components/tsconfig.json
+++ b/packages/js/components/tsconfig.json
@@ -1,5 +1,5 @@
 {
-	"extends": "@woocommerce/internal-ts-config/tsconfig.json",
+	"extends": "@woocommerce/internal-build/configs/tsconfig.json",
 	"compilerOptions": {
 		"rootDir": "src",
 		"noCheck": false,
diff --git a/packages/js/components/typings/monorepo-enhancements.d.ts b/packages/js/components/typings/monorepo-enhancements.d.ts
index dc453ab911e..8d3d6bdc1e4 100644
--- a/packages/js/components/typings/monorepo-enhancements.d.ts
+++ b/packages/js/components/typings/monorepo-enhancements.d.ts
@@ -1 +1 @@
-import '@woocommerce/internal-ts-config/types/@wordpress/data';
+import '@woocommerce/internal-build/type-overrides/@wordpress/data';
diff --git a/packages/js/components/webpack.config.js b/packages/js/components/webpack.config.js
index 9d696e6b37f..0f8dbd47654 100644
--- a/packages/js/components/webpack.config.js
+++ b/packages/js/components/webpack.config.js
@@ -1,7 +1,7 @@
 /**
  * Internal dependencies
  */
-const { webpackConfig } = require( '@woocommerce/internal-style-build' );
+const { webpackConfig } = require( '@woocommerce/internal-build/style-build' );

 /**
  * External dependencies
@@ -22,7 +22,7 @@ module.exports = {
 			config: [
 				__filename,
 				path.resolve( __dirname, '../../../pnpm-lock.yaml' ),
-				require.resolve( '@woocommerce/internal-style-build' ),
+				require.resolve( '@woocommerce/internal-build/style-build' ),
 			],
 		},
 	},
diff --git a/packages/js/csv-export/build.mjs b/packages/js/csv-export/build.mjs
index 746bc61fc4b..2d76d01222e 100644
--- a/packages/js/csv-export/build.mjs
+++ b/packages/js/csv-export/build.mjs
@@ -1,112 +1,3 @@
-import { build, context } from 'esbuild';
-import { glob } from 'glob';
-import { rm } from 'node:fs/promises';
-import chokidar from 'chokidar';
+import { runPackageBuilder } from '@woocommerce/internal-build';

-const watch = process.argv.includes( '--watch' );
-const format = process.argv.includes( '--cjs' ) ? 'cjs' : 'esm';
-const outdir = format === 'cjs' ? 'build' : 'build-module';
-
-const ENTRY_GLOB = 'src/**/*.{ts,tsx,js,jsx}';
-const ENTRY_IGNORE = [
-	'**/test/**',
-	'**/stories/**',
-	'**/*.test.{ts,tsx,js,jsx}',
-	'**/*.d.ts',
-];
-
-async function resolveEntryPoints() {
-	return glob( ENTRY_GLOB, { ignore: ENTRY_IGNORE } );
-}
-
-function makeOptions( entryPoints ) {
-	return {
-		entryPoints,
-		outdir,
-		outbase: 'src',
-		bundle: false,
-		format,
-		platform: 'neutral',
-		target: 'esnext',
-		loader: { '.js': 'jsx', '.jsx': 'jsx', '.ts': 'ts', '.tsx': 'tsx' },
-		jsx: 'transform',
-		jsxFactory: 'createElement',
-		jsxFragment: 'Fragment',
-		logLevel: 'warning',
-		sourcemap: false,
-	};
-}
-
-function summarize( result ) {
-	const errors = result.errors.length;
-	const warnings = result.warnings.length;
-	const parts = [];
-	if ( errors ) parts.push( `${ errors } error(s)` );
-	if ( warnings ) parts.push( `${ warnings } warning(s)` );
-	return parts.length ? ` — ${ parts.join( ', ' ) }` : '';
-}
-
-// Wrap a watch-mode step so a single failure (disk error, build crash, etc.)
-// doesn't take the watcher process down. Errors are surfaced; the loop survives.
-async function safe( label, fn ) {
-	try {
-		return await fn();
-	} catch ( error ) {
-		console.error( `[watch] ${ label } failed:`, error?.message ?? error );
-		return null;
-	}
-}
-
-await rm( outdir, { recursive: true, force: true } );
-
-if ( watch ) {
-	const startupT0 = Date.now();
-	let entryPoints = await resolveEntryPoints();
-	let ctx = await context( makeOptions( entryPoints ) );
-	const initial = await safe( 'startup build', () => ctx.rebuild() );
-	console.log( `[watch] ready in ${ Date.now() - startupT0 }ms — ${ entryPoints.length } entry point(s)${ initial ? summarize( initial ) : '' }` );
-
-	// esbuild's own watcher polls the filesystem, which can miss or delay
-	// changes (especially edits to files added after context creation).
-	// chokidar uses OS-level events (fsevents/inotify) and drives rebuilds
-	// directly: changes call ctx.rebuild() (preserves the AST cache),
-	// add/unlink trigger a debounced context restart (entry list changed).
-	let pending;
-	const pendingChanges = new Set();
-	const restart = ( path, kind ) => {
-		pendingChanges.add( `${ path } (${ kind })` );
-		clearTimeout( pending );
-		pending = setTimeout( () => safe( 'restart', async () => {
-			const changes = [ ...pendingChanges ];
-			pendingChanges.clear();
-			const preview = changes.slice( 0, 3 ).join( ', ' );
-			const suffix = changes.length > 3 ? `, +${ changes.length - 3 } more` : '';
-			console.log( `[watch] restarting (${ preview }${ suffix })` );
-			const t0 = Date.now();
-			await ctx.dispose();
-			await rm( outdir, { recursive: true, force: true } );
-			entryPoints = await resolveEntryPoints();
-			ctx = await context( makeOptions( entryPoints ) );
-			const result = await ctx.rebuild();
-			console.log( `[watch] rebuilt in ${ Date.now() - t0 }ms — ${ entryPoints.length } entry point(s)${ summarize( result ) }` );
-		} ), 200 );
-	};
-
-	chokidar
-		.watch( ENTRY_GLOB, { ignored: ENTRY_IGNORE, ignoreInitial: true } )
-		.on( 'add', ( path ) => restart( path, 'added' ) )
-		.on( 'unlink', ( path ) => restart( path, 'deleted' ) )
-		.on( 'change', async ( path ) => {
-			const t0 = Date.now();
-			const result = await safe( `rebuild ${ path }`, () => ctx.rebuild() );
-			if ( result ) {
-				console.log( `[watch] rebuilt ${ path } in ${ Date.now() - t0 }ms${ summarize( result ) }` );
-			}
-		} );
-} else {
-	const entryPoints = await resolveEntryPoints();
-	const t0 = Date.now();
-	console.log( `[build] ${ entryPoints.length } entry point(s)...` );
-	const result = await build( makeOptions( entryPoints ) );
-	console.log( `[build] done in ${ Date.now() - t0 }ms${ summarize( result ) }` );
-}
+await runPackageBuilder( { entryPoints: 'src/**/*.{ts,tsx,js,jsx}' } );
diff --git a/packages/js/csv-export/package.json b/packages/js/csv-export/package.json
index f7ea174766c..89a66b9dcb5 100644
--- a/packages/js/csv-export/package.json
+++ b/packages/js/csv-export/package.json
@@ -20,9 +20,17 @@
 	"bugs": {
 		"url": "https://github.com/woocommerce/woocommerce/issues"
 	},
+	"exports": {
+		".": {
+			"wc-source": "./src/index.ts",
+			"types": "./build-types/index.d.ts",
+			"import": "./build-module/index.js",
+			"require": "./build/index.js"
+		}
+	},
 	"main": "build/index.js",
 	"module": "build-module/index.js",
-	"types": "build-types",
+	"types": "build-types/index.d.ts",
 	"react-native": "src/index",
 	"files": [
 		"build",
@@ -31,10 +39,10 @@
 	],
 	"scripts": {
 		"build": "pnpm --if-present --workspace-concurrency=Infinity --stream --filter=\"$npm_package_name...\" '/^build:project:.*$/'",
-		"build:project": "pnpm --if-present '/^build:project:.*$/'",
+		"build:project": "pnpm --stream --if-present '/^build:project:.*$/'",
 		"build:project:esm": "node build.mjs",
 		"build:publish:project": "pnpm --if-present '/^build:publish:project:.*$/'",
-		"build:publish:project:cjs": "node build.mjs --cjs",
+		"build:publish:project:cjs": "node build.mjs --commonjs",
 		"build:publish:project:types": "tsc --build --emitDeclarationOnly",
 		"build:publish:project:deps": "pnpm build",
 		"changelog": "XDEBUG_MODE=off composer install --quiet && composer exec -- changelogger",
@@ -58,12 +66,9 @@
 		"@babel/core": "7.25.7",
 		"@types/jest": "29.5.x",
 		"@woocommerce/eslint-plugin": "workspace:*",
+		"@woocommerce/internal-build": "workspace:*",
 		"@woocommerce/internal-js-tests": "workspace:*",
-		"@woocommerce/internal-ts-config": "workspace:*",
-		"chokidar": "3.6.x",
-		"esbuild": "0.24.x",
 		"eslint": "^8.55.0",
-		"glob": "^10.3.10",
 		"jest": "29.5.x",
 		"jest-cli": "29.5.x",
 		"jest-environment-jsdom": "29.5.x",
@@ -78,7 +83,14 @@
 		]
 	},
 	"publishConfig": {
-		"access": "public"
+		"access": "public",
+		"exports": {
+			".": {
+				"types": "./build-types/index.d.ts",
+				"import": "./build-module/index.js",
+				"require": "./build/index.js"
+			}
+		}
 	},
 	"config": {
 		"ci": {
diff --git a/packages/js/csv-export/tsconfig-cjs.json b/packages/js/csv-export/tsconfig-cjs.json
deleted file mode 100644
index 5a4f74e214d..00000000000
--- a/packages/js/csv-export/tsconfig-cjs.json
+++ /dev/null
@@ -1,18 +0,0 @@
-{
-	"extends": "@woocommerce/internal-ts-config/tsconfig-cjs.json",
-	"compilerOptions": {
-		"rootDir": "src",
-		"outDir": "build",
-		"typeRoots": [
-			"./typings",
-			"./node_modules/@types"
-		]
-	},
-	"include": [
-		"typings/**/*",
-		"src/**/*"
-	],
-	"exclude": [
-		"**/test/**"
-	]
-}
diff --git a/packages/js/csv-export/tsconfig.json b/packages/js/csv-export/tsconfig.json
index 2cb6f5a848f..be24cae4c13 100644
--- a/packages/js/csv-export/tsconfig.json
+++ b/packages/js/csv-export/tsconfig.json
@@ -1,5 +1,5 @@
 {
-	"extends": "@woocommerce/internal-ts-config/tsconfig.json",
+	"extends": "@woocommerce/internal-build/configs/tsconfig.json",
 	"compilerOptions": {
 		"rootDir": "src",
 		"outDir": "build-module",
diff --git a/packages/js/currency/build.mjs b/packages/js/currency/build.mjs
index 746bc61fc4b..2d76d01222e 100644
--- a/packages/js/currency/build.mjs
+++ b/packages/js/currency/build.mjs
@@ -1,112 +1,3 @@
-import { build, context } from 'esbuild';
-import { glob } from 'glob';
-import { rm } from 'node:fs/promises';
-import chokidar from 'chokidar';
+import { runPackageBuilder } from '@woocommerce/internal-build';

-const watch = process.argv.includes( '--watch' );
-const format = process.argv.includes( '--cjs' ) ? 'cjs' : 'esm';
-const outdir = format === 'cjs' ? 'build' : 'build-module';
-
-const ENTRY_GLOB = 'src/**/*.{ts,tsx,js,jsx}';
-const ENTRY_IGNORE = [
-	'**/test/**',
-	'**/stories/**',
-	'**/*.test.{ts,tsx,js,jsx}',
-	'**/*.d.ts',
-];
-
-async function resolveEntryPoints() {
-	return glob( ENTRY_GLOB, { ignore: ENTRY_IGNORE } );
-}
-
-function makeOptions( entryPoints ) {
-	return {
-		entryPoints,
-		outdir,
-		outbase: 'src',
-		bundle: false,
-		format,
-		platform: 'neutral',
-		target: 'esnext',
-		loader: { '.js': 'jsx', '.jsx': 'jsx', '.ts': 'ts', '.tsx': 'tsx' },
-		jsx: 'transform',
-		jsxFactory: 'createElement',
-		jsxFragment: 'Fragment',
-		logLevel: 'warning',
-		sourcemap: false,
-	};
-}
-
-function summarize( result ) {
-	const errors = result.errors.length;
-	const warnings = result.warnings.length;
-	const parts = [];
-	if ( errors ) parts.push( `${ errors } error(s)` );
-	if ( warnings ) parts.push( `${ warnings } warning(s)` );
-	return parts.length ? ` — ${ parts.join( ', ' ) }` : '';
-}
-
-// Wrap a watch-mode step so a single failure (disk error, build crash, etc.)
-// doesn't take the watcher process down. Errors are surfaced; the loop survives.
-async function safe( label, fn ) {
-	try {
-		return await fn();
-	} catch ( error ) {
-		console.error( `[watch] ${ label } failed:`, error?.message ?? error );
-		return null;
-	}
-}
-
-await rm( outdir, { recursive: true, force: true } );
-
-if ( watch ) {
-	const startupT0 = Date.now();
-	let entryPoints = await resolveEntryPoints();
-	let ctx = await context( makeOptions( entryPoints ) );
-	const initial = await safe( 'startup build', () => ctx.rebuild() );
-	console.log( `[watch] ready in ${ Date.now() - startupT0 }ms — ${ entryPoints.length } entry point(s)${ initial ? summarize( initial ) : '' }` );
-
-	// esbuild's own watcher polls the filesystem, which can miss or delay
-	// changes (especially edits to files added after context creation).
-	// chokidar uses OS-level events (fsevents/inotify) and drives rebuilds
-	// directly: changes call ctx.rebuild() (preserves the AST cache),
-	// add/unlink trigger a debounced context restart (entry list changed).
-	let pending;
-	const pendingChanges = new Set();
-	const restart = ( path, kind ) => {
-		pendingChanges.add( `${ path } (${ kind })` );
-		clearTimeout( pending );
-		pending = setTimeout( () => safe( 'restart', async () => {
-			const changes = [ ...pendingChanges ];
-			pendingChanges.clear();
-			const preview = changes.slice( 0, 3 ).join( ', ' );
-			const suffix = changes.length > 3 ? `, +${ changes.length - 3 } more` : '';
-			console.log( `[watch] restarting (${ preview }${ suffix })` );
-			const t0 = Date.now();
-			await ctx.dispose();
-			await rm( outdir, { recursive: true, force: true } );
-			entryPoints = await resolveEntryPoints();
-			ctx = await context( makeOptions( entryPoints ) );
-			const result = await ctx.rebuild();
-			console.log( `[watch] rebuilt in ${ Date.now() - t0 }ms — ${ entryPoints.length } entry point(s)${ summarize( result ) }` );
-		} ), 200 );
-	};
-
-	chokidar
-		.watch( ENTRY_GLOB, { ignored: ENTRY_IGNORE, ignoreInitial: true } )
-		.on( 'add', ( path ) => restart( path, 'added' ) )
-		.on( 'unlink', ( path ) => restart( path, 'deleted' ) )
-		.on( 'change', async ( path ) => {
-			const t0 = Date.now();
-			const result = await safe( `rebuild ${ path }`, () => ctx.rebuild() );
-			if ( result ) {
-				console.log( `[watch] rebuilt ${ path } in ${ Date.now() - t0 }ms${ summarize( result ) }` );
-			}
-		} );
-} else {
-	const entryPoints = await resolveEntryPoints();
-	const t0 = Date.now();
-	console.log( `[build] ${ entryPoints.length } entry point(s)...` );
-	const result = await build( makeOptions( entryPoints ) );
-	console.log( `[build] done in ${ Date.now() - t0 }ms${ summarize( result ) }` );
-}
+await runPackageBuilder( { entryPoints: 'src/**/*.{ts,tsx,js,jsx}' } );
diff --git a/packages/js/currency/package.json b/packages/js/currency/package.json
index 03bade432c9..75dba674c08 100644
--- a/packages/js/currency/package.json
+++ b/packages/js/currency/package.json
@@ -20,9 +20,17 @@
 	"bugs": {
 		"url": "https://github.com/woocommerce/woocommerce/issues"
 	},
+	"exports": {
+		".": {
+			"wc-source": "./src/index.ts",
+			"types": "./build-types/index.d.ts",
+			"import": "./build-module/index.js",
+			"require": "./build/index.js"
+		}
+	},
 	"main": "build/index.js",
 	"module": "build-module/index.js",
-	"types": "build-types",
+	"types": "build-types/index.d.ts",
 	"react-native": "src/index",
 	"files": [
 		"build",
@@ -31,10 +39,10 @@
 	],
 	"scripts": {
 		"build": "pnpm --if-present --workspace-concurrency=Infinity --stream --filter=\"$npm_package_name...\" '/^build:project:.*$/'",
-		"build:project": "pnpm --if-present '/^build:project:.*$/'",
+		"build:project": "pnpm --stream --if-present '/^build:project:.*$/'",
 		"build:project:esm": "node build.mjs",
 		"build:publish:project": "pnpm --if-present '/^build:publish:project:.*$/'",
-		"build:publish:project:cjs": "node build.mjs --cjs",
+		"build:publish:project:cjs": "node build.mjs --commonjs",
 		"build:publish:project:types": "tsc --build --emitDeclarationOnly",
 		"build:publish:project:deps": "pnpm build",
 		"changelog": "XDEBUG_MODE=off composer install --quiet && composer exec -- changelogger",
@@ -65,19 +73,23 @@
 		"@wordpress/i18n": "catalog:wp-min"
 	},
 	"publishConfig": {
-		"access": "public"
+		"access": "public",
+		"exports": {
+			".": {
+				"types": "./build-types/index.d.ts",
+				"import": "./build-module/index.js",
+				"require": "./build/index.js"
+			}
+		}
 	},
 	"devDependencies": {
 		"@babel/core": "7.25.7",
 		"@types/jest": "29.5.x",
 		"@types/react": "18.3.x",
 		"@woocommerce/eslint-plugin": "workspace:*",
+		"@woocommerce/internal-build": "workspace:*",
 		"@woocommerce/internal-js-tests": "workspace:*",
-		"@woocommerce/internal-ts-config": "workspace:*",
-		"chokidar": "3.6.x",
-		"esbuild": "0.24.x",
 		"eslint": "^8.55.0",
-		"glob": "^10.3.10",
 		"jest": "29.5.x",
 		"jest-cli": "29.5.x",
 		"jest-environment-jsdom": "29.5.x",
diff --git a/packages/js/currency/tsconfig-cjs.json b/packages/js/currency/tsconfig-cjs.json
deleted file mode 100644
index 5a4f74e214d..00000000000
--- a/packages/js/currency/tsconfig-cjs.json
+++ /dev/null
@@ -1,18 +0,0 @@
-{
-	"extends": "@woocommerce/internal-ts-config/tsconfig-cjs.json",
-	"compilerOptions": {
-		"rootDir": "src",
-		"outDir": "build",
-		"typeRoots": [
-			"./typings",
-			"./node_modules/@types"
-		]
-	},
-	"include": [
-		"typings/**/*",
-		"src/**/*"
-	],
-	"exclude": [
-		"**/test/**"
-	]
-}
diff --git a/packages/js/currency/tsconfig.json b/packages/js/currency/tsconfig.json
index c16f73fed50..07c2df3c2b5 100644
--- a/packages/js/currency/tsconfig.json
+++ b/packages/js/currency/tsconfig.json
@@ -1,5 +1,5 @@
 {
-	"extends": "@woocommerce/internal-ts-config/tsconfig.json",
+	"extends": "@woocommerce/internal-build/configs/tsconfig.json",
 	"compilerOptions": {
 		"rootDir": "src",
 		"outDir": "build-module",
diff --git a/packages/js/customer-effort-score/build.mjs b/packages/js/customer-effort-score/build.mjs
index 746bc61fc4b..2d76d01222e 100644
--- a/packages/js/customer-effort-score/build.mjs
+++ b/packages/js/customer-effort-score/build.mjs
@@ -1,112 +1,3 @@
-import { build, context } from 'esbuild';
-import { glob } from 'glob';
-import { rm } from 'node:fs/promises';
-import chokidar from 'chokidar';
+import { runPackageBuilder } from '@woocommerce/internal-build';

-const watch = process.argv.includes( '--watch' );
-const format = process.argv.includes( '--cjs' ) ? 'cjs' : 'esm';
-const outdir = format === 'cjs' ? 'build' : 'build-module';
-
-const ENTRY_GLOB = 'src/**/*.{ts,tsx,js,jsx}';
-const ENTRY_IGNORE = [
-	'**/test/**',
-	'**/stories/**',
-	'**/*.test.{ts,tsx,js,jsx}',
-	'**/*.d.ts',
-];
-
-async function resolveEntryPoints() {
-	return glob( ENTRY_GLOB, { ignore: ENTRY_IGNORE } );
-}
-
-function makeOptions( entryPoints ) {
-	return {
-		entryPoints,
-		outdir,
-		outbase: 'src',
-		bundle: false,
-		format,
-		platform: 'neutral',
-		target: 'esnext',
-		loader: { '.js': 'jsx', '.jsx': 'jsx', '.ts': 'ts', '.tsx': 'tsx' },
-		jsx: 'transform',
-		jsxFactory: 'createElement',
-		jsxFragment: 'Fragment',
-		logLevel: 'warning',
-		sourcemap: false,
-	};
-}
-
-function summarize( result ) {
-	const errors = result.errors.length;
-	const warnings = result.warnings.length;
-	const parts = [];
-	if ( errors ) parts.push( `${ errors } error(s)` );
-	if ( warnings ) parts.push( `${ warnings } warning(s)` );
-	return parts.length ? ` — ${ parts.join( ', ' ) }` : '';
-}
-
-// Wrap a watch-mode step so a single failure (disk error, build crash, etc.)
-// doesn't take the watcher process down. Errors are surfaced; the loop survives.
-async function safe( label, fn ) {
-	try {
-		return await fn();
-	} catch ( error ) {
-		console.error( `[watch] ${ label } failed:`, error?.message ?? error );
-		return null;
-	}
-}
-
-await rm( outdir, { recursive: true, force: true } );
-
-if ( watch ) {
-	const startupT0 = Date.now();
-	let entryPoints = await resolveEntryPoints();
-	let ctx = await context( makeOptions( entryPoints ) );
-	const initial = await safe( 'startup build', () => ctx.rebuild() );
-	console.log( `[watch] ready in ${ Date.now() - startupT0 }ms — ${ entryPoints.length } entry point(s)${ initial ? summarize( initial ) : '' }` );
-
-	// esbuild's own watcher polls the filesystem, which can miss or delay
-	// changes (especially edits to files added after context creation).
-	// chokidar uses OS-level events (fsevents/inotify) and drives rebuilds
-	// directly: changes call ctx.rebuild() (preserves the AST cache),
-	// add/unlink trigger a debounced context restart (entry list changed).
-	let pending;
-	const pendingChanges = new Set();
-	const restart = ( path, kind ) => {
-		pendingChanges.add( `${ path } (${ kind })` );
-		clearTimeout( pending );
-		pending = setTimeout( () => safe( 'restart', async () => {
-			const changes = [ ...pendingChanges ];
-			pendingChanges.clear();
-			const preview = changes.slice( 0, 3 ).join( ', ' );
-			const suffix = changes.length > 3 ? `, +${ changes.length - 3 } more` : '';
-			console.log( `[watch] restarting (${ preview }${ suffix })` );
-			const t0 = Date.now();
-			await ctx.dispose();
-			await rm( outdir, { recursive: true, force: true } );
-			entryPoints = await resolveEntryPoints();
-			ctx = await context( makeOptions( entryPoints ) );
-			const result = await ctx.rebuild();
-			console.log( `[watch] rebuilt in ${ Date.now() - t0 }ms — ${ entryPoints.length } entry point(s)${ summarize( result ) }` );
-		} ), 200 );
-	};
-
-	chokidar
-		.watch( ENTRY_GLOB, { ignored: ENTRY_IGNORE, ignoreInitial: true } )
-		.on( 'add', ( path ) => restart( path, 'added' ) )
-		.on( 'unlink', ( path ) => restart( path, 'deleted' ) )
-		.on( 'change', async ( path ) => {
-			const t0 = Date.now();
-			const result = await safe( `rebuild ${ path }`, () => ctx.rebuild() );
-			if ( result ) {
-				console.log( `[watch] rebuilt ${ path } in ${ Date.now() - t0 }ms${ summarize( result ) }` );
-			}
-		} );
-} else {
-	const entryPoints = await resolveEntryPoints();
-	const t0 = Date.now();
-	console.log( `[build] ${ entryPoints.length } entry point(s)...` );
-	const result = await build( makeOptions( entryPoints ) );
-	console.log( `[build] done in ${ Date.now() - t0 }ms${ summarize( result ) }` );
-}
+await runPackageBuilder( { entryPoints: 'src/**/*.{ts,tsx,js,jsx}' } );
diff --git a/packages/js/customer-effort-score/package.json b/packages/js/customer-effort-score/package.json
index f9971f8ba45..f2ef6406cd8 100644
--- a/packages/js/customer-effort-score/package.json
+++ b/packages/js/customer-effort-score/package.json
@@ -19,9 +19,17 @@
 	"bugs": {
 		"url": "https://github.com/woocommerce/woocommerce/issues"
 	},
+	"exports": {
+		".": {
+			"wc-source": "./src/index.ts",
+			"types": "./build-types/index.d.ts",
+			"import": "./build-module/index.js",
+			"require": "./build/index.js"
+		}
+	},
 	"main": "build/index.js",
 	"module": "build-module/index.js",
-	"types": "build-types",
+	"types": "build-types/index.d.ts",
 	"react-native": "src/index",
 	"files": [
 		"build",
@@ -31,11 +39,11 @@
 	],
 	"scripts": {
 		"build": "pnpm --if-present --workspace-concurrency=Infinity --stream --filter=\"$npm_package_name...\" '/^build:project:.*$/'",
-		"build:project": "pnpm --if-present '/^build:project:.*$/'",
+		"build:project": "pnpm --stream --if-present '/^build:project:.*$/'",
 		"build:project:bundle": "NODE_ENV=production webpack",
 		"build:project:esm": "node build.mjs",
 		"build:publish:project": "pnpm --if-present '/^build:publish:project:.*$/'",
-		"build:publish:project:cjs": "node build.mjs --cjs",
+		"build:publish:project:cjs": "node build.mjs --commonjs",
 		"build:publish:project:types": "tsc --build --emitDeclarationOnly",
 		"build:publish:project:deps": "pnpm build",
 		"changelog": "XDEBUG_MODE=off composer install --quiet && composer exec -- changelogger",
@@ -70,7 +78,14 @@
 		"react-transition-group": "^4.4.5"
 	},
 	"publishConfig": {
-		"access": "public"
+		"access": "public",
+		"exports": {
+			".": {
+				"types": "./build-types/index.d.ts",
+				"import": "./build-module/index.js",
+				"require": "./build/index.js"
+			}
+		}
 	},
 	"devDependencies": {
 		"@babel/core": "7.25.7",
@@ -81,17 +96,13 @@
 		"@types/testing-library__jest-dom": "^5.14.9",
 		"@woocommerce/data": "workspace:*",
 		"@woocommerce/eslint-plugin": "workspace:*",
+		"@woocommerce/internal-build": "workspace:*",
 		"@woocommerce/internal-js-tests": "workspace:*",
-		"@woocommerce/internal-style-build": "workspace:*",
-		"@woocommerce/internal-ts-config": "workspace:*",
 		"@woocommerce/navigation": "workspace:*",
 		"@woocommerce/tracks": "workspace:*",
 		"@wordpress/browserslist-config": "next",
-		"chokidar": "3.6.x",
 		"css-loader": "6.11.x",
-		"esbuild": "0.24.x",
 		"eslint": "^8.55.0",
-		"glob": "^10.3.10",
 		"jest": "29.5.x",
 		"jest-cli": "29.5.x",
 		"jest-environment-jsdom": "29.5.x",
diff --git a/packages/js/customer-effort-score/tsconfig-cjs.json b/packages/js/customer-effort-score/tsconfig-cjs.json
deleted file mode 100644
index 5a4f74e214d..00000000000
--- a/packages/js/customer-effort-score/tsconfig-cjs.json
+++ /dev/null
@@ -1,18 +0,0 @@
-{
-	"extends": "@woocommerce/internal-ts-config/tsconfig-cjs.json",
-	"compilerOptions": {
-		"rootDir": "src",
-		"outDir": "build",
-		"typeRoots": [
-			"./typings",
-			"./node_modules/@types"
-		]
-	},
-	"include": [
-		"typings/**/*",
-		"src/**/*"
-	],
-	"exclude": [
-		"**/test/**"
-	]
-}
diff --git a/packages/js/customer-effort-score/tsconfig.json b/packages/js/customer-effort-score/tsconfig.json
index 63b95b60eeb..1b557625d3a 100644
--- a/packages/js/customer-effort-score/tsconfig.json
+++ b/packages/js/customer-effort-score/tsconfig.json
@@ -1,5 +1,5 @@
 {
-	"extends": "@woocommerce/internal-ts-config/tsconfig.json",
+	"extends": "@woocommerce/internal-build/configs/tsconfig.json",
 	"compilerOptions": {
 		"rootDir": "src",
 		"outDir": "build-module",
diff --git a/packages/js/customer-effort-score/typings/monorepo-enhancements.d.ts b/packages/js/customer-effort-score/typings/monorepo-enhancements.d.ts
index dc453ab911e..8d3d6bdc1e4 100644
--- a/packages/js/customer-effort-score/typings/monorepo-enhancements.d.ts
+++ b/packages/js/customer-effort-score/typings/monorepo-enhancements.d.ts
@@ -1 +1 @@
-import '@woocommerce/internal-ts-config/types/@wordpress/data';
+import '@woocommerce/internal-build/type-overrides/@wordpress/data';
diff --git a/packages/js/customer-effort-score/webpack.config.js b/packages/js/customer-effort-score/webpack.config.js
index 9d696e6b37f..0f8dbd47654 100644
--- a/packages/js/customer-effort-score/webpack.config.js
+++ b/packages/js/customer-effort-score/webpack.config.js
@@ -1,7 +1,7 @@
 /**
  * Internal dependencies
  */
-const { webpackConfig } = require( '@woocommerce/internal-style-build' );
+const { webpackConfig } = require( '@woocommerce/internal-build/style-build' );

 /**
  * External dependencies
@@ -22,7 +22,7 @@ module.exports = {
 			config: [
 				__filename,
 				path.resolve( __dirname, '../../../pnpm-lock.yaml' ),
-				require.resolve( '@woocommerce/internal-style-build' ),
+				require.resolve( '@woocommerce/internal-build/style-build' ),
 			],
 		},
 	},
diff --git a/packages/js/data/build.mjs b/packages/js/data/build.mjs
index 746bc61fc4b..2d76d01222e 100644
--- a/packages/js/data/build.mjs
+++ b/packages/js/data/build.mjs
@@ -1,112 +1,3 @@
-import { build, context } from 'esbuild';
-import { glob } from 'glob';
-import { rm } from 'node:fs/promises';
-import chokidar from 'chokidar';
+import { runPackageBuilder } from '@woocommerce/internal-build';

-const watch = process.argv.includes( '--watch' );
-const format = process.argv.includes( '--cjs' ) ? 'cjs' : 'esm';
-const outdir = format === 'cjs' ? 'build' : 'build-module';
-
-const ENTRY_GLOB = 'src/**/*.{ts,tsx,js,jsx}';
-const ENTRY_IGNORE = [
-	'**/test/**',
-	'**/stories/**',
-	'**/*.test.{ts,tsx,js,jsx}',
-	'**/*.d.ts',
-];
-
-async function resolveEntryPoints() {
-	return glob( ENTRY_GLOB, { ignore: ENTRY_IGNORE } );
-}
-
-function makeOptions( entryPoints ) {
-	return {
-		entryPoints,
-		outdir,
-		outbase: 'src',
-		bundle: false,
-		format,
-		platform: 'neutral',
-		target: 'esnext',
-		loader: { '.js': 'jsx', '.jsx': 'jsx', '.ts': 'ts', '.tsx': 'tsx' },
-		jsx: 'transform',
-		jsxFactory: 'createElement',
-		jsxFragment: 'Fragment',
-		logLevel: 'warning',
-		sourcemap: false,
-	};
-}
-
-function summarize( result ) {
-	const errors = result.errors.length;
-	const warnings = result.warnings.length;
-	const parts = [];
-	if ( errors ) parts.push( `${ errors } error(s)` );
-	if ( warnings ) parts.push( `${ warnings } warning(s)` );
-	return parts.length ? ` — ${ parts.join( ', ' ) }` : '';
-}
-
-// Wrap a watch-mode step so a single failure (disk error, build crash, etc.)
-// doesn't take the watcher process down. Errors are surfaced; the loop survives.
-async function safe( label, fn ) {
-	try {
-		return await fn();
-	} catch ( error ) {
-		console.error( `[watch] ${ label } failed:`, error?.message ?? error );
-		return null;
-	}
-}
-
-await rm( outdir, { recursive: true, force: true } );
-
-if ( watch ) {
-	const startupT0 = Date.now();
-	let entryPoints = await resolveEntryPoints();
-	let ctx = await context( makeOptions( entryPoints ) );
-	const initial = await safe( 'startup build', () => ctx.rebuild() );
-	console.log( `[watch] ready in ${ Date.now() - startupT0 }ms — ${ entryPoints.length } entry point(s)${ initial ? summarize( initial ) : '' }` );
-
-	// esbuild's own watcher polls the filesystem, which can miss or delay
-	// changes (especially edits to files added after context creation).
-	// chokidar uses OS-level events (fsevents/inotify) and drives rebuilds
-	// directly: changes call ctx.rebuild() (preserves the AST cache),
-	// add/unlink trigger a debounced context restart (entry list changed).
-	let pending;
-	const pendingChanges = new Set();
-	const restart = ( path, kind ) => {
-		pendingChanges.add( `${ path } (${ kind })` );
-		clearTimeout( pending );
-		pending = setTimeout( () => safe( 'restart', async () => {
-			const changes = [ ...pendingChanges ];
-			pendingChanges.clear();
-			const preview = changes.slice( 0, 3 ).join( ', ' );
-			const suffix = changes.length > 3 ? `, +${ changes.length - 3 } more` : '';
-			console.log( `[watch] restarting (${ preview }${ suffix })` );
-			const t0 = Date.now();
-			await ctx.dispose();
-			await rm( outdir, { recursive: true, force: true } );
-			entryPoints = await resolveEntryPoints();
-			ctx = await context( makeOptions( entryPoints ) );
-			const result = await ctx.rebuild();
-			console.log( `[watch] rebuilt in ${ Date.now() - t0 }ms — ${ entryPoints.length } entry point(s)${ summarize( result ) }` );
-		} ), 200 );
-	};
-
-	chokidar
-		.watch( ENTRY_GLOB, { ignored: ENTRY_IGNORE, ignoreInitial: true } )
-		.on( 'add', ( path ) => restart( path, 'added' ) )
-		.on( 'unlink', ( path ) => restart( path, 'deleted' ) )
-		.on( 'change', async ( path ) => {
-			const t0 = Date.now();
-			const result = await safe( `rebuild ${ path }`, () => ctx.rebuild() );
-			if ( result ) {
-				console.log( `[watch] rebuilt ${ path } in ${ Date.now() - t0 }ms${ summarize( result ) }` );
-			}
-		} );
-} else {
-	const entryPoints = await resolveEntryPoints();
-	const t0 = Date.now();
-	console.log( `[build] ${ entryPoints.length } entry point(s)...` );
-	const result = await build( makeOptions( entryPoints ) );
-	console.log( `[build] done in ${ Date.now() - t0 }ms${ summarize( result ) }` );
-}
+await runPackageBuilder( { entryPoints: 'src/**/*.{ts,tsx,js,jsx}' } );
diff --git a/packages/js/data/package.json b/packages/js/data/package.json
index 497845646e1..a47967b25f2 100644
--- a/packages/js/data/package.json
+++ b/packages/js/data/package.json
@@ -20,9 +20,17 @@
 	"bugs": {
 		"url": "https://github.com/woocommerce/woocommerce/issues"
 	},
+	"exports": {
+		".": {
+			"wc-source": "./src/index.ts",
+			"types": "./build-types/index.d.ts",
+			"import": "./build-module/index.js",
+			"require": "./build/index.js"
+		}
+	},
 	"main": "build/index.js",
 	"module": "build-module/index.js",
-	"types": "build-types",
+	"types": "build-types/index.d.ts",
 	"files": [
 		"build",
 		"build-module",
@@ -30,10 +38,10 @@
 	],
 	"scripts": {
 		"build": "pnpm --if-present --workspace-concurrency=Infinity --stream --filter=\"$npm_package_name...\" '/^build:project:.*$/'",
-		"build:project": "pnpm --if-present '/^build:project:.*$/'",
+		"build:project": "pnpm --stream --if-present '/^build:project:.*$/'",
 		"build:project:esm": "node build.mjs",
 		"build:publish:project": "pnpm --if-present '/^build:publish:project:.*$/'",
-		"build:publish:project:cjs": "node build.mjs --cjs",
+		"build:publish:project:cjs": "node build.mjs --commonjs",
 		"build:publish:project:types": "tsc --build --emitDeclarationOnly",
 		"build:publish:project:deps": "pnpm build",
 		"changelog": "XDEBUG_MODE=off composer install --quiet && composer exec -- changelogger",
@@ -73,7 +81,14 @@
 		"rememo": "^4.0.2"
 	},
 	"publishConfig": {
-		"access": "public"
+		"access": "public",
+		"exports": {
+			".": {
+				"types": "./build-types/index.d.ts",
+				"import": "./build-module/index.js",
+				"require": "./build/index.js"
+			}
+		}
 	},
 	"devDependencies": {
 		"@babel/core": "7.25.7",
@@ -87,12 +102,9 @@
 		"@types/qs": "^6.9.10",
 		"@types/react": "18.3.x",
 		"@woocommerce/eslint-plugin": "workspace:*",
+		"@woocommerce/internal-build": "workspace:*",
 		"@woocommerce/internal-js-tests": "workspace:*",
-		"@woocommerce/internal-ts-config": "workspace:*",
-		"chokidar": "3.6.x",
-		"esbuild": "0.24.x",
 		"eslint": "^8.55.0",
-		"glob": "^10.3.10",
 		"jest": "29.5.x",
 		"jest-cli": "29.5.x",
 		"jest-environment-jsdom": "29.5.x",
diff --git a/packages/js/data/tsconfig-cjs.json b/packages/js/data/tsconfig-cjs.json
deleted file mode 100644
index 5a4f74e214d..00000000000
--- a/packages/js/data/tsconfig-cjs.json
+++ /dev/null
@@ -1,18 +0,0 @@
-{
-	"extends": "@woocommerce/internal-ts-config/tsconfig-cjs.json",
-	"compilerOptions": {
-		"rootDir": "src",
-		"outDir": "build",
-		"typeRoots": [
-			"./typings",
-			"./node_modules/@types"
-		]
-	},
-	"include": [
-		"typings/**/*",
-		"src/**/*"
-	],
-	"exclude": [
-		"**/test/**"
-	]
-}
diff --git a/packages/js/data/tsconfig.json b/packages/js/data/tsconfig.json
index 570ed1b3c5d..755bc3ddcea 100644
--- a/packages/js/data/tsconfig.json
+++ b/packages/js/data/tsconfig.json
@@ -1,5 +1,5 @@
 {
-	"extends": "@woocommerce/internal-ts-config/tsconfig.json",
+	"extends": "@woocommerce/internal-build/configs/tsconfig.json",
 	"compilerOptions": {
 		"rootDir": "src",
 		"noCheck": false,
diff --git a/packages/js/data/typings/monorepo-enhancements.d.ts b/packages/js/data/typings/monorepo-enhancements.d.ts
index aaae7212f72..11ed4b931a1 100644
--- a/packages/js/data/typings/monorepo-enhancements.d.ts
+++ b/packages/js/data/typings/monorepo-enhancements.d.ts
@@ -1,2 +1,2 @@
-import '@woocommerce/internal-ts-config/types/@wordpress/data';
-import '@woocommerce/internal-ts-config/types/@wordpress/core-data';
+import '@woocommerce/internal-build/type-overrides/@wordpress/data';
+import '@woocommerce/internal-build/type-overrides/@wordpress/core-data';
diff --git a/packages/js/date/build.mjs b/packages/js/date/build.mjs
index 746bc61fc4b..2d76d01222e 100644
--- a/packages/js/date/build.mjs
+++ b/packages/js/date/build.mjs
@@ -1,112 +1,3 @@
-import { build, context } from 'esbuild';
-import { glob } from 'glob';
-import { rm } from 'node:fs/promises';
-import chokidar from 'chokidar';
+import { runPackageBuilder } from '@woocommerce/internal-build';

-const watch = process.argv.includes( '--watch' );
-const format = process.argv.includes( '--cjs' ) ? 'cjs' : 'esm';
-const outdir = format === 'cjs' ? 'build' : 'build-module';
-
-const ENTRY_GLOB = 'src/**/*.{ts,tsx,js,jsx}';
-const ENTRY_IGNORE = [
-	'**/test/**',
-	'**/stories/**',
-	'**/*.test.{ts,tsx,js,jsx}',
-	'**/*.d.ts',
-];
-
-async function resolveEntryPoints() {
-	return glob( ENTRY_GLOB, { ignore: ENTRY_IGNORE } );
-}
-
-function makeOptions( entryPoints ) {
-	return {
-		entryPoints,
-		outdir,
-		outbase: 'src',
-		bundle: false,
-		format,
-		platform: 'neutral',
-		target: 'esnext',
-		loader: { '.js': 'jsx', '.jsx': 'jsx', '.ts': 'ts', '.tsx': 'tsx' },
-		jsx: 'transform',
-		jsxFactory: 'createElement',
-		jsxFragment: 'Fragment',
-		logLevel: 'warning',
-		sourcemap: false,
-	};
-}
-
-function summarize( result ) {
-	const errors = result.errors.length;
-	const warnings = result.warnings.length;
-	const parts = [];
-	if ( errors ) parts.push( `${ errors } error(s)` );
-	if ( warnings ) parts.push( `${ warnings } warning(s)` );
-	return parts.length ? ` — ${ parts.join( ', ' ) }` : '';
-}
-
-// Wrap a watch-mode step so a single failure (disk error, build crash, etc.)
-// doesn't take the watcher process down. Errors are surfaced; the loop survives.
-async function safe( label, fn ) {
-	try {
-		return await fn();
-	} catch ( error ) {
-		console.error( `[watch] ${ label } failed:`, error?.message ?? error );
-		return null;
-	}
-}
-
-await rm( outdir, { recursive: true, force: true } );
-
-if ( watch ) {
-	const startupT0 = Date.now();
-	let entryPoints = await resolveEntryPoints();
-	let ctx = await context( makeOptions( entryPoints ) );
-	const initial = await safe( 'startup build', () => ctx.rebuild() );
-	console.log( `[watch] ready in ${ Date.now() - startupT0 }ms — ${ entryPoints.length } entry point(s)${ initial ? summarize( initial ) : '' }` );
-
-	// esbuild's own watcher polls the filesystem, which can miss or delay
-	// changes (especially edits to files added after context creation).
-	// chokidar uses OS-level events (fsevents/inotify) and drives rebuilds
-	// directly: changes call ctx.rebuild() (preserves the AST cache),
-	// add/unlink trigger a debounced context restart (entry list changed).
-	let pending;
-	const pendingChanges = new Set();
-	const restart = ( path, kind ) => {
-		pendingChanges.add( `${ path } (${ kind })` );
-		clearTimeout( pending );
-		pending = setTimeout( () => safe( 'restart', async () => {
-			const changes = [ ...pendingChanges ];
-			pendingChanges.clear();
-			const preview = changes.slice( 0, 3 ).join( ', ' );
-			const suffix = changes.length > 3 ? `, +${ changes.length - 3 } more` : '';
-			console.log( `[watch] restarting (${ preview }${ suffix })` );
-			const t0 = Date.now();
-			await ctx.dispose();
-			await rm( outdir, { recursive: true, force: true } );
-			entryPoints = await resolveEntryPoints();
-			ctx = await context( makeOptions( entryPoints ) );
-			const result = await ctx.rebuild();
-			console.log( `[watch] rebuilt in ${ Date.now() - t0 }ms — ${ entryPoints.length } entry point(s)${ summarize( result ) }` );
-		} ), 200 );
-	};
-
-	chokidar
-		.watch( ENTRY_GLOB, { ignored: ENTRY_IGNORE, ignoreInitial: true } )
-		.on( 'add', ( path ) => restart( path, 'added' ) )
-		.on( 'unlink', ( path ) => restart( path, 'deleted' ) )
-		.on( 'change', async ( path ) => {
-			const t0 = Date.now();
-			const result = await safe( `rebuild ${ path }`, () => ctx.rebuild() );
-			if ( result ) {
-				console.log( `[watch] rebuilt ${ path } in ${ Date.now() - t0 }ms${ summarize( result ) }` );
-			}
-		} );
-} else {
-	const entryPoints = await resolveEntryPoints();
-	const t0 = Date.now();
-	console.log( `[build] ${ entryPoints.length } entry point(s)...` );
-	const result = await build( makeOptions( entryPoints ) );
-	console.log( `[build] done in ${ Date.now() - t0 }ms${ summarize( result ) }` );
-}
+await runPackageBuilder( { entryPoints: 'src/**/*.{ts,tsx,js,jsx}' } );
diff --git a/packages/js/date/package.json b/packages/js/date/package.json
index 095a90761c6..ec923f4bbeb 100644
--- a/packages/js/date/package.json
+++ b/packages/js/date/package.json
@@ -20,9 +20,17 @@
 	"bugs": {
 		"url": "https://github.com/woocommerce/woocommerce/issues"
 	},
+	"exports": {
+		".": {
+			"wc-source": "./src/index.ts",
+			"types": "./build-types/index.d.ts",
+			"import": "./build-module/index.js",
+			"require": "./build/index.js"
+		}
+	},
 	"main": "build/index.js",
 	"module": "build-module/index.js",
-	"types": "build-types",
+	"types": "build-types/index.d.ts",
 	"react-native": "src/index",
 	"files": [
 		"build",
@@ -44,13 +52,10 @@
 		"@types/node": "^24.1.0",
 		"@types/qs": "^6.9.10",
 		"@woocommerce/eslint-plugin": "workspace:*",
+		"@woocommerce/internal-build": "workspace:*",
 		"@woocommerce/internal-js-tests": "workspace:*",
-		"@woocommerce/internal-ts-config": "workspace:*",
-		"chokidar": "3.6.x",
 		"d3-time-format": "^2.3.0",
-		"esbuild": "0.24.x",
 		"eslint": "^8.55.0",
-		"glob": "^10.3.10",
 		"jest": "29.5.x",
 		"jest-cli": "29.5.x",
 		"jest-environment-jsdom": "29.5.x",
@@ -62,14 +67,21 @@
 		"lodash": "^4.17.0"
 	},
 	"publishConfig": {
-		"access": "public"
+		"access": "public",
+		"exports": {
+			".": {
+				"types": "./build-types/index.d.ts",
+				"import": "./build-module/index.js",
+				"require": "./build/index.js"
+			}
+		}
 	},
 	"scripts": {
 		"build": "pnpm --if-present --workspace-concurrency=Infinity --stream --filter=\"$npm_package_name...\" '/^build:project:.*$/'",
-		"build:project": "pnpm --if-present '/^build:project:.*$/'",
+		"build:project": "pnpm --stream --if-present '/^build:project:.*$/'",
 		"build:project:esm": "node build.mjs",
 		"build:publish:project": "pnpm --if-present '/^build:publish:project:.*$/'",
-		"build:publish:project:cjs": "node build.mjs --cjs",
+		"build:publish:project:cjs": "node build.mjs --commonjs",
 		"build:publish:project:types": "tsc --build --emitDeclarationOnly",
 		"build:publish:project:deps": "pnpm build",
 		"changelog": "XDEBUG_MODE=off composer install --quiet && composer exec -- changelogger",
diff --git a/packages/js/date/tsconfig-cjs.json b/packages/js/date/tsconfig-cjs.json
deleted file mode 100644
index 5a4f74e214d..00000000000
--- a/packages/js/date/tsconfig-cjs.json
+++ /dev/null
@@ -1,18 +0,0 @@
-{
-	"extends": "@woocommerce/internal-ts-config/tsconfig-cjs.json",
-	"compilerOptions": {
-		"rootDir": "src",
-		"outDir": "build",
-		"typeRoots": [
-			"./typings",
-			"./node_modules/@types"
-		]
-	},
-	"include": [
-		"typings/**/*",
-		"src/**/*"
-	],
-	"exclude": [
-		"**/test/**"
-	]
-}
diff --git a/packages/js/date/tsconfig.json b/packages/js/date/tsconfig.json
index 2cb6f5a848f..be24cae4c13 100644
--- a/packages/js/date/tsconfig.json
+++ b/packages/js/date/tsconfig.json
@@ -1,5 +1,5 @@
 {
-	"extends": "@woocommerce/internal-ts-config/tsconfig.json",
+	"extends": "@woocommerce/internal-build/configs/tsconfig.json",
 	"compilerOptions": {
 		"rootDir": "src",
 		"outDir": "build-module",
diff --git a/packages/js/e2e-utils-playwright/build.mjs b/packages/js/e2e-utils-playwright/build.mjs
index 746bc61fc4b..2d76d01222e 100644
--- a/packages/js/e2e-utils-playwright/build.mjs
+++ b/packages/js/e2e-utils-playwright/build.mjs
@@ -1,112 +1,3 @@
-import { build, context } from 'esbuild';
-import { glob } from 'glob';
-import { rm } from 'node:fs/promises';
-import chokidar from 'chokidar';
+import { runPackageBuilder } from '@woocommerce/internal-build';

-const watch = process.argv.includes( '--watch' );
-const format = process.argv.includes( '--cjs' ) ? 'cjs' : 'esm';
-const outdir = format === 'cjs' ? 'build' : 'build-module';
-
-const ENTRY_GLOB = 'src/**/*.{ts,tsx,js,jsx}';
-const ENTRY_IGNORE = [
-	'**/test/**',
-	'**/stories/**',
-	'**/*.test.{ts,tsx,js,jsx}',
-	'**/*.d.ts',
-];
-
-async function resolveEntryPoints() {
-	return glob( ENTRY_GLOB, { ignore: ENTRY_IGNORE } );
-}
-
-function makeOptions( entryPoints ) {
-	return {
-		entryPoints,
-		outdir,
-		outbase: 'src',
-		bundle: false,
-		format,
-		platform: 'neutral',
-		target: 'esnext',
-		loader: { '.js': 'jsx', '.jsx': 'jsx', '.ts': 'ts', '.tsx': 'tsx' },
-		jsx: 'transform',
-		jsxFactory: 'createElement',
-		jsxFragment: 'Fragment',
-		logLevel: 'warning',
-		sourcemap: false,
-	};
-}
-
-function summarize( result ) {
-	const errors = result.errors.length;
-	const warnings = result.warnings.length;
-	const parts = [];
-	if ( errors ) parts.push( `${ errors } error(s)` );
-	if ( warnings ) parts.push( `${ warnings } warning(s)` );
-	return parts.length ? ` — ${ parts.join( ', ' ) }` : '';
-}
-
-// Wrap a watch-mode step so a single failure (disk error, build crash, etc.)
-// doesn't take the watcher process down. Errors are surfaced; the loop survives.
-async function safe( label, fn ) {
-	try {
-		return await fn();
-	} catch ( error ) {
-		console.error( `[watch] ${ label } failed:`, error?.message ?? error );
-		return null;
-	}
-}
-
-await rm( outdir, { recursive: true, force: true } );
-
-if ( watch ) {
-	const startupT0 = Date.now();
-	let entryPoints = await resolveEntryPoints();
-	let ctx = await context( makeOptions( entryPoints ) );
-	const initial = await safe( 'startup build', () => ctx.rebuild() );
-	console.log( `[watch] ready in ${ Date.now() - startupT0 }ms — ${ entryPoints.length } entry point(s)${ initial ? summarize( initial ) : '' }` );
-
-	// esbuild's own watcher polls the filesystem, which can miss or delay
-	// changes (especially edits to files added after context creation).
-	// chokidar uses OS-level events (fsevents/inotify) and drives rebuilds
-	// directly: changes call ctx.rebuild() (preserves the AST cache),
-	// add/unlink trigger a debounced context restart (entry list changed).
-	let pending;
-	const pendingChanges = new Set();
-	const restart = ( path, kind ) => {
-		pendingChanges.add( `${ path } (${ kind })` );
-		clearTimeout( pending );
-		pending = setTimeout( () => safe( 'restart', async () => {
-			const changes = [ ...pendingChanges ];
-			pendingChanges.clear();
-			const preview = changes.slice( 0, 3 ).join( ', ' );
-			const suffix = changes.length > 3 ? `, +${ changes.length - 3 } more` : '';
-			console.log( `[watch] restarting (${ preview }${ suffix })` );
-			const t0 = Date.now();
-			await ctx.dispose();
-			await rm( outdir, { recursive: true, force: true } );
-			entryPoints = await resolveEntryPoints();
-			ctx = await context( makeOptions( entryPoints ) );
-			const result = await ctx.rebuild();
-			console.log( `[watch] rebuilt in ${ Date.now() - t0 }ms — ${ entryPoints.length } entry point(s)${ summarize( result ) }` );
-		} ), 200 );
-	};
-
-	chokidar
-		.watch( ENTRY_GLOB, { ignored: ENTRY_IGNORE, ignoreInitial: true } )
-		.on( 'add', ( path ) => restart( path, 'added' ) )
-		.on( 'unlink', ( path ) => restart( path, 'deleted' ) )
-		.on( 'change', async ( path ) => {
-			const t0 = Date.now();
-			const result = await safe( `rebuild ${ path }`, () => ctx.rebuild() );
-			if ( result ) {
-				console.log( `[watch] rebuilt ${ path } in ${ Date.now() - t0 }ms${ summarize( result ) }` );
-			}
-		} );
-} else {
-	const entryPoints = await resolveEntryPoints();
-	const t0 = Date.now();
-	console.log( `[build] ${ entryPoints.length } entry point(s)...` );
-	const result = await build( makeOptions( entryPoints ) );
-	console.log( `[build] done in ${ Date.now() - t0 }ms${ summarize( result ) }` );
-}
+await runPackageBuilder( { entryPoints: 'src/**/*.{ts,tsx,js,jsx}' } );
diff --git a/packages/js/e2e-utils-playwright/package.json b/packages/js/e2e-utils-playwright/package.json
index 3dd6eec4578..7f19a77a9ee 100644
--- a/packages/js/e2e-utils-playwright/package.json
+++ b/packages/js/e2e-utils-playwright/package.json
@@ -11,9 +11,6 @@
 	"engines": {
 		"node": "^24.15.0"
 	},
-	"main": "build/index.js",
-	"module": "build-module/index.js",
-	"types": "build-types/index.d.ts",
 	"exports": {
 		".": {
 			"types": "./build-types/index.d.ts",
@@ -21,6 +18,9 @@
 			"require": "./build/index.js"
 		}
 	},
+	"main": "build/index.js",
+	"module": "build-module/index.js",
+	"types": "build-types/index.d.ts",
 	"files": [
 		"build",
 		"build-module",
@@ -28,8 +28,8 @@
 	],
 	"scripts": {
 		"build": "pnpm --if-present --workspace-concurrency=Infinity --stream --filter=\"$npm_package_name...\" '/^build:project:.*$/'",
-		"build:project": "pnpm --if-present '/^build:project:.*$/'",
-		"build:project:cjs": "node build.mjs --cjs",
+		"build:project": "pnpm --stream --if-present '/^build:project:.*$/'",
+		"build:project:cjs": "node build.mjs --commonjs",
 		"build:project:esm": "node build.mjs",
 		"changelog": "XDEBUG_MODE=off composer install --quiet && composer exec -- changelogger",
 		"lint": "eslint --ext=js,ts,tsx src",
@@ -41,7 +41,7 @@
 		"update:php": "XDEBUG_MODE=off composer update --quiet",
 		"watch:build": "pnpm --if-present --workspace-concurrency=Infinity --filter=\"$npm_package_name...\" --parallel '/^watch:build:project:.*$/'",
 		"watch:build:project": "pnpm --if-present run '/^watch:build:project:.*$/'",
-		"watch:build:project:cjs": "node build.mjs --cjs --watch",
+		"watch:build:project:cjs": "node build.mjs --commonjs --watch",
 		"watch:build:project:esm": "node build.mjs --watch"
 	},
 	"config": {
@@ -72,12 +72,9 @@
 		"@types/jest": "29.5.x",
 		"@types/node": "^24.1.0",
 		"@woocommerce/eslint-plugin": "workspace:*",
+		"@woocommerce/internal-build": "workspace:*",
 		"@woocommerce/internal-js-tests": "workspace:*",
-		"@woocommerce/internal-ts-config": "workspace:*",
-		"chokidar": "3.6.x",
-		"esbuild": "0.24.x",
 		"eslint": "^8.55.0",
-		"glob": "^10.3.10",
 		"jest": "29.5.x",
 		"jest-cli": "29.5.x",
 		"ts-jest": "29.1.x",
@@ -88,6 +85,13 @@
 		"oauth-1.0a": "^2.2.6"
 	},
 	"publishConfig": {
-		"access": "public"
+		"access": "public",
+		"exports": {
+			".": {
+				"types": "./build-types/index.d.ts",
+				"import": "./build-module/index.js",
+				"require": "./build/index.js"
+			}
+		}
 	}
 }
diff --git a/packages/js/e2e-utils-playwright/tsconfig-cjs.json b/packages/js/e2e-utils-playwright/tsconfig-cjs.json
deleted file mode 100644
index f9d6e810b31..00000000000
--- a/packages/js/e2e-utils-playwright/tsconfig-cjs.json
+++ /dev/null
@@ -1,10 +0,0 @@
-{
-	"extends": "../tsconfig-cjs",
-	"compilerOptions": {
-		"rootDir": "src",
-		"outDir": "build",
-		"typeRoots": ["./node_modules/@types"]
-	},
-	"include": ["src/**/*"],
-	"exclude": ["**/test/**"]
-}
diff --git a/packages/js/e2e-utils-playwright/tsconfig.json b/packages/js/e2e-utils-playwright/tsconfig.json
index 3864127388e..e711ed46c21 100644
--- a/packages/js/e2e-utils-playwright/tsconfig.json
+++ b/packages/js/e2e-utils-playwright/tsconfig.json
@@ -1,5 +1,5 @@
 {
-	"extends": "@woocommerce/internal-ts-config/tsconfig.json",
+	"extends": "@woocommerce/internal-build/configs/tsconfig.json",
 	"compilerOptions": {
 		"rootDir": "src",
 		"outDir": "build-module",
diff --git a/packages/js/email-editor/build.mjs b/packages/js/email-editor/build.mjs
index 746bc61fc4b..2d76d01222e 100644
--- a/packages/js/email-editor/build.mjs
+++ b/packages/js/email-editor/build.mjs
@@ -1,112 +1,3 @@
-import { build, context } from 'esbuild';
-import { glob } from 'glob';
-import { rm } from 'node:fs/promises';
-import chokidar from 'chokidar';
+import { runPackageBuilder } from '@woocommerce/internal-build';

-const watch = process.argv.includes( '--watch' );
-const format = process.argv.includes( '--cjs' ) ? 'cjs' : 'esm';
-const outdir = format === 'cjs' ? 'build' : 'build-module';
-
-const ENTRY_GLOB = 'src/**/*.{ts,tsx,js,jsx}';
-const ENTRY_IGNORE = [
-	'**/test/**',
-	'**/stories/**',
-	'**/*.test.{ts,tsx,js,jsx}',
-	'**/*.d.ts',
-];
-
-async function resolveEntryPoints() {
-	return glob( ENTRY_GLOB, { ignore: ENTRY_IGNORE } );
-}
-
-function makeOptions( entryPoints ) {
-	return {
-		entryPoints,
-		outdir,
-		outbase: 'src',
-		bundle: false,
-		format,
-		platform: 'neutral',
-		target: 'esnext',
-		loader: { '.js': 'jsx', '.jsx': 'jsx', '.ts': 'ts', '.tsx': 'tsx' },
-		jsx: 'transform',
-		jsxFactory: 'createElement',
-		jsxFragment: 'Fragment',
-		logLevel: 'warning',
-		sourcemap: false,
-	};
-}
-
-function summarize( result ) {
-	const errors = result.errors.length;
-	const warnings = result.warnings.length;
-	const parts = [];
-	if ( errors ) parts.push( `${ errors } error(s)` );
-	if ( warnings ) parts.push( `${ warnings } warning(s)` );
-	return parts.length ? ` — ${ parts.join( ', ' ) }` : '';
-}
-
-// Wrap a watch-mode step so a single failure (disk error, build crash, etc.)
-// doesn't take the watcher process down. Errors are surfaced; the loop survives.
-async function safe( label, fn ) {
-	try {
-		return await fn();
-	} catch ( error ) {
-		console.error( `[watch] ${ label } failed:`, error?.message ?? error );
-		return null;
-	}
-}
-
-await rm( outdir, { recursive: true, force: true } );
-
-if ( watch ) {
-	const startupT0 = Date.now();
-	let entryPoints = await resolveEntryPoints();
-	let ctx = await context( makeOptions( entryPoints ) );
-	const initial = await safe( 'startup build', () => ctx.rebuild() );
-	console.log( `[watch] ready in ${ Date.now() - startupT0 }ms — ${ entryPoints.length } entry point(s)${ initial ? summarize( initial ) : '' }` );
-
-	// esbuild's own watcher polls the filesystem, which can miss or delay
-	// changes (especially edits to files added after context creation).
-	// chokidar uses OS-level events (fsevents/inotify) and drives rebuilds
-	// directly: changes call ctx.rebuild() (preserves the AST cache),
-	// add/unlink trigger a debounced context restart (entry list changed).
-	let pending;
-	const pendingChanges = new Set();
-	const restart = ( path, kind ) => {
-		pendingChanges.add( `${ path } (${ kind })` );
-		clearTimeout( pending );
-		pending = setTimeout( () => safe( 'restart', async () => {
-			const changes = [ ...pendingChanges ];
-			pendingChanges.clear();
-			const preview = changes.slice( 0, 3 ).join( ', ' );
-			const suffix = changes.length > 3 ? `, +${ changes.length - 3 } more` : '';
-			console.log( `[watch] restarting (${ preview }${ suffix })` );
-			const t0 = Date.now();
-			await ctx.dispose();
-			await rm( outdir, { recursive: true, force: true } );
-			entryPoints = await resolveEntryPoints();
-			ctx = await context( makeOptions( entryPoints ) );
-			const result = await ctx.rebuild();
-			console.log( `[watch] rebuilt in ${ Date.now() - t0 }ms — ${ entryPoints.length } entry point(s)${ summarize( result ) }` );
-		} ), 200 );
-	};
-
-	chokidar
-		.watch( ENTRY_GLOB, { ignored: ENTRY_IGNORE, ignoreInitial: true } )
-		.on( 'add', ( path ) => restart( path, 'added' ) )
-		.on( 'unlink', ( path ) => restart( path, 'deleted' ) )
-		.on( 'change', async ( path ) => {
-			const t0 = Date.now();
-			const result = await safe( `rebuild ${ path }`, () => ctx.rebuild() );
-			if ( result ) {
-				console.log( `[watch] rebuilt ${ path } in ${ Date.now() - t0 }ms${ summarize( result ) }` );
-			}
-		} );
-} else {
-	const entryPoints = await resolveEntryPoints();
-	const t0 = Date.now();
-	console.log( `[build] ${ entryPoints.length } entry point(s)...` );
-	const result = await build( makeOptions( entryPoints ) );
-	console.log( `[build] done in ${ Date.now() - t0 }ms${ summarize( result ) }` );
-}
+await runPackageBuilder( { entryPoints: 'src/**/*.{ts,tsx,js,jsx}' } );
diff --git a/packages/js/email-editor/package.json b/packages/js/email-editor/package.json
index 47ae6ee58fb..25bc959c820 100644
--- a/packages/js/email-editor/package.json
+++ b/packages/js/email-editor/package.json
@@ -17,9 +17,17 @@
 	"bugs": {
 		"url": "https://github.com/woocommerce/woocommerce/issues"
 	},
+	"exports": {
+		".": {
+			"wc-source": "./src/index.ts",
+			"types": "./build-types/index.d.ts",
+			"import": "./build-module/index.js",
+			"require": "./build/index.js"
+		}
+	},
 	"main": "build/index.js",
 	"module": "build-module/index.js",
-	"types": "build-types",
+	"types": "build-types/index.d.ts",
 	"files": [
 		"build",
 		"build-module",
@@ -28,7 +36,14 @@
 		"assets"
 	],
 	"publishConfig": {
-		"access": "public"
+		"access": "public",
+		"exports": {
+			".": {
+				"types": "./build-types/index.d.ts",
+				"import": "./build-module/index.js",
+				"require": "./build/index.js"
+			}
+		}
 	},
 	"sideEffects": [
 		"build-style/**",
@@ -36,11 +51,11 @@
 	],
 	"scripts": {
 		"build": "pnpm --if-present --workspace-concurrency=Infinity --stream --filter=\"$npm_package_name...\" '/^build:project:.*$/'",
-		"build:project": "pnpm --if-present '/^build:project:.*$/'",
+		"build:project": "pnpm --stream --if-present '/^build:project:.*$/'",
 		"build:project:bundle": "NODE_ENV=production webpack",
 		"build:project:esm": "node build.mjs",
 		"build:publish:project": "pnpm --if-present '/^build:publish:project:.*$/'",
-		"build:publish:project:cjs": "node build.mjs --cjs",
+		"build:publish:project:cjs": "node build.mjs --commonjs",
 		"build:publish:project:types": "tsc --build --emitDeclarationOnly",
 		"build:publish:project:deps": "pnpm build",
 		"changelog": "XDEBUG_MODE=off composer install --quiet && composer exec -- changelogger",
@@ -121,16 +136,12 @@
 		"@types/wordpress__blocks": "catalog:wp-min",
 		"@types/wordpress__edit-post": "catalog:wp-min",
 		"@woocommerce/eslint-plugin": "workspace:*",
+		"@woocommerce/internal-build": "workspace:*",
 		"@woocommerce/internal-js-tests": "workspace:*",
-		"@woocommerce/internal-style-build": "workspace:*",
-		"@woocommerce/internal-ts-config": "workspace:*",
 		"@wordpress/browserslist-config": "next",
 		"@wordpress/prettier-config": "2.17.0",
 		"@wordpress/stylelint-config": "^21.0.0",
-		"chokidar": "3.6.x",
-		"esbuild": "0.24.x",
 		"eslint": "^8.55.0",
-		"glob": "^10.3.10",
 		"jest": "29.5.x",
 		"jest-cli": "29.5.x",
 		"jest-environment-jsdom": "29.5.x",
diff --git a/packages/js/email-editor/tsconfig-cjs.json b/packages/js/email-editor/tsconfig-cjs.json
deleted file mode 100644
index a2112660f05..00000000000
--- a/packages/js/email-editor/tsconfig-cjs.json
+++ /dev/null
@@ -1,10 +0,0 @@
-{
-	"extends": "./tsconfig.json",
-	"compilerOptions": {
-		"module": "commonjs",
-		"outDir": "build",
-		"declaration": false,
-		"declarationMap": false,
-		"declarationDir": null
-	}
-}
\ No newline at end of file
diff --git a/packages/js/email-editor/tsconfig.json b/packages/js/email-editor/tsconfig.json
index 62a5e98089a..7b5bb530b68 100644
--- a/packages/js/email-editor/tsconfig.json
+++ b/packages/js/email-editor/tsconfig.json
@@ -1,5 +1,5 @@
 {
-	"extends": "@woocommerce/internal-ts-config/tsconfig.json",
+	"extends": "@woocommerce/internal-build/configs/tsconfig.json",
 	"compilerOptions": {
 		"rootDir": "src",
 		"outDir": "build-module",
diff --git a/packages/js/email-editor/typings/monorepo-enhancements.d.ts b/packages/js/email-editor/typings/monorepo-enhancements.d.ts
index 97d793c920a..9f66f5ca4f5 100644
--- a/packages/js/email-editor/typings/monorepo-enhancements.d.ts
+++ b/packages/js/email-editor/typings/monorepo-enhancements.d.ts
@@ -1,5 +1,5 @@
-import '@woocommerce/internal-ts-config/types/@wordpress/data';
-import '@woocommerce/internal-ts-config/types/@wordpress/core-data';
-import '@woocommerce/internal-ts-config/types/@wordpress/block-editor';
-import '@woocommerce/internal-ts-config/types/@wordpress/notices';
-import '@woocommerce/internal-ts-config/types/@wordpress/notices';
+import '@woocommerce/internal-build/type-overrides/@wordpress/data';
+import '@woocommerce/internal-build/type-overrides/@wordpress/core-data';
+import '@woocommerce/internal-build/type-overrides/@wordpress/block-editor';
+import '@woocommerce/internal-build/type-overrides/@wordpress/notices';
+import '@woocommerce/internal-build/type-overrides/@wordpress/notices';
diff --git a/packages/js/email-editor/webpack.config.js b/packages/js/email-editor/webpack.config.js
index 7e67ce57262..4e7063977fb 100644
--- a/packages/js/email-editor/webpack.config.js
+++ b/packages/js/email-editor/webpack.config.js
@@ -1,7 +1,7 @@
 /**
  * Internal dependencies
  */
-const { webpackConfig } = require( '@woocommerce/internal-style-build' );
+const { webpackConfig } = require( '@woocommerce/internal-build/style-build' );

 /**
  * External dependencies
@@ -22,7 +22,7 @@ module.exports = {
 			config: [
 				__filename,
 				path.resolve( __dirname, '../../../pnpm-lock.yaml' ),
-				require.resolve( '@woocommerce/internal-style-build' ),
+				require.resolve( '@woocommerce/internal-build/style-build' ),
 			],
 		},
 	},
diff --git a/packages/js/experimental-products-app/build.mjs b/packages/js/experimental-products-app/build.mjs
index 746bc61fc4b..2d76d01222e 100644
--- a/packages/js/experimental-products-app/build.mjs
+++ b/packages/js/experimental-products-app/build.mjs
@@ -1,112 +1,3 @@
-import { build, context } from 'esbuild';
-import { glob } from 'glob';
-import { rm } from 'node:fs/promises';
-import chokidar from 'chokidar';
+import { runPackageBuilder } from '@woocommerce/internal-build';

-const watch = process.argv.includes( '--watch' );
-const format = process.argv.includes( '--cjs' ) ? 'cjs' : 'esm';
-const outdir = format === 'cjs' ? 'build' : 'build-module';
-
-const ENTRY_GLOB = 'src/**/*.{ts,tsx,js,jsx}';
-const ENTRY_IGNORE = [
-	'**/test/**',
-	'**/stories/**',
-	'**/*.test.{ts,tsx,js,jsx}',
-	'**/*.d.ts',
-];
-
-async function resolveEntryPoints() {
-	return glob( ENTRY_GLOB, { ignore: ENTRY_IGNORE } );
-}
-
-function makeOptions( entryPoints ) {
-	return {
-		entryPoints,
-		outdir,
-		outbase: 'src',
-		bundle: false,
-		format,
-		platform: 'neutral',
-		target: 'esnext',
-		loader: { '.js': 'jsx', '.jsx': 'jsx', '.ts': 'ts', '.tsx': 'tsx' },
-		jsx: 'transform',
-		jsxFactory: 'createElement',
-		jsxFragment: 'Fragment',
-		logLevel: 'warning',
-		sourcemap: false,
-	};
-}
-
-function summarize( result ) {
-	const errors = result.errors.length;
-	const warnings = result.warnings.length;
-	const parts = [];
-	if ( errors ) parts.push( `${ errors } error(s)` );
-	if ( warnings ) parts.push( `${ warnings } warning(s)` );
-	return parts.length ? ` — ${ parts.join( ', ' ) }` : '';
-}
-
-// Wrap a watch-mode step so a single failure (disk error, build crash, etc.)
-// doesn't take the watcher process down. Errors are surfaced; the loop survives.
-async function safe( label, fn ) {
-	try {
-		return await fn();
-	} catch ( error ) {
-		console.error( `[watch] ${ label } failed:`, error?.message ?? error );
-		return null;
-	}
-}
-
-await rm( outdir, { recursive: true, force: true } );
-
-if ( watch ) {
-	const startupT0 = Date.now();
-	let entryPoints = await resolveEntryPoints();
-	let ctx = await context( makeOptions( entryPoints ) );
-	const initial = await safe( 'startup build', () => ctx.rebuild() );
-	console.log( `[watch] ready in ${ Date.now() - startupT0 }ms — ${ entryPoints.length } entry point(s)${ initial ? summarize( initial ) : '' }` );
-
-	// esbuild's own watcher polls the filesystem, which can miss or delay
-	// changes (especially edits to files added after context creation).
-	// chokidar uses OS-level events (fsevents/inotify) and drives rebuilds
-	// directly: changes call ctx.rebuild() (preserves the AST cache),
-	// add/unlink trigger a debounced context restart (entry list changed).
-	let pending;
-	const pendingChanges = new Set();
-	const restart = ( path, kind ) => {
-		pendingChanges.add( `${ path } (${ kind })` );
-		clearTimeout( pending );
-		pending = setTimeout( () => safe( 'restart', async () => {
-			const changes = [ ...pendingChanges ];
-			pendingChanges.clear();
-			const preview = changes.slice( 0, 3 ).join( ', ' );
-			const suffix = changes.length > 3 ? `, +${ changes.length - 3 } more` : '';
-			console.log( `[watch] restarting (${ preview }${ suffix })` );
-			const t0 = Date.now();
-			await ctx.dispose();
-			await rm( outdir, { recursive: true, force: true } );
-			entryPoints = await resolveEntryPoints();
-			ctx = await context( makeOptions( entryPoints ) );
-			const result = await ctx.rebuild();
-			console.log( `[watch] rebuilt in ${ Date.now() - t0 }ms — ${ entryPoints.length } entry point(s)${ summarize( result ) }` );
-		} ), 200 );
-	};
-
-	chokidar
-		.watch( ENTRY_GLOB, { ignored: ENTRY_IGNORE, ignoreInitial: true } )
-		.on( 'add', ( path ) => restart( path, 'added' ) )
-		.on( 'unlink', ( path ) => restart( path, 'deleted' ) )
-		.on( 'change', async ( path ) => {
-			const t0 = Date.now();
-			const result = await safe( `rebuild ${ path }`, () => ctx.rebuild() );
-			if ( result ) {
-				console.log( `[watch] rebuilt ${ path } in ${ Date.now() - t0 }ms${ summarize( result ) }` );
-			}
-		} );
-} else {
-	const entryPoints = await resolveEntryPoints();
-	const t0 = Date.now();
-	console.log( `[build] ${ entryPoints.length } entry point(s)...` );
-	const result = await build( makeOptions( entryPoints ) );
-	console.log( `[build] done in ${ Date.now() - t0 }ms${ summarize( result ) }` );
-}
+await runPackageBuilder( { entryPoints: 'src/**/*.{ts,tsx,js,jsx}' } );
diff --git a/packages/js/experimental-products-app/package.json b/packages/js/experimental-products-app/package.json
index f4567c3a3c8..31a74cf10a6 100644
--- a/packages/js/experimental-products-app/package.json
+++ b/packages/js/experimental-products-app/package.json
@@ -17,9 +17,17 @@
 	"bugs": {
 		"url": "https://github.com/woocommerce/woocommerce/issues"
 	},
+	"exports": {
+		".": {
+			"wc-source": "./src/index.ts",
+			"types": "./build-types/index.d.ts",
+			"import": "./build-module/index.js",
+			"require": "./build/index.js"
+		}
+	},
 	"main": "build/index.js",
 	"module": "build-module/index.js",
-	"types": "build-types",
+	"types": "build-types/index.d.ts",
 	"react-native": "src/index",
 	"files": [
 		"build",
@@ -32,7 +40,14 @@
 		"src/**/*.scss"
 	],
 	"publishConfig": {
-		"access": "public"
+		"access": "public",
+		"exports": {
+			".": {
+				"types": "./build-types/index.d.ts",
+				"import": "./build-module/index.js",
+				"require": "./build/index.js"
+			}
+		}
 	},
 	"dependencies": {
 		"@base-ui/react": "1.4.1",
@@ -75,14 +90,10 @@
 		"@types/react": "18.3.x",
 		"@types/testing-library__jest-dom": "^5.14.9",
 		"@woocommerce/eslint-plugin": "workspace:*",
+		"@woocommerce/internal-build": "workspace:*",
 		"@woocommerce/internal-js-tests": "workspace:*",
-		"@woocommerce/internal-style-build": "workspace:*",
-		"@woocommerce/internal-ts-config": "workspace:*",
-		"chokidar": "^3.6.0",
 		"css-loader": "6.11.x",
-		"esbuild": "^0.24.0",
 		"eslint": "^8.55.0",
-		"glob": "^10.3.10",
 		"jest": "29.5.x",
 		"jest-cli": "29.5.x",
 		"jest-environment-jsdom": "29.5.x",
@@ -98,11 +109,11 @@
 	},
 	"scripts": {
 		"build": "pnpm --if-present --workspace-concurrency=Infinity --stream --filter=\"$npm_package_name...\" '/^build:project:.*$/'",
-		"build:project": "pnpm --if-present '/^build:project:.*$/'",
+		"build:project": "pnpm --stream --if-present '/^build:project:.*$/'",
 		"build:project:bundle": "NODE_ENV=production webpack",
 		"build:project:esm": "node build.mjs",
 		"build:publish:project": "pnpm --if-present '/^build:publish:project:.*$/'",
-		"build:publish:project:cjs": "node build.mjs --cjs",
+		"build:publish:project:cjs": "node build.mjs --commonjs",
 		"build:publish:project:types": "tsc --build --emitDeclarationOnly",
 		"build:publish:project:deps": "pnpm build",
 		"changelog": "XDEBUG_MODE=off composer install --quiet && composer exec -- changelogger",
diff --git a/packages/js/experimental-products-app/tsconfig-cjs.json b/packages/js/experimental-products-app/tsconfig-cjs.json
deleted file mode 100644
index da0d647649a..00000000000
--- a/packages/js/experimental-products-app/tsconfig-cjs.json
+++ /dev/null
@@ -1,23 +0,0 @@
-{
-	"extends": "../internal-ts-config/tsconfig-cjs.json",
-	"compilerOptions": {
-		"rootDir": "src",
-		"outDir": "build",
-		"noCheck": false,
-		"resolveJsonModule": true,
-		"typeRoots": [
-			"./typings",
-			"./node_modules/@types"
-		]
-	},
-	"include": [
-		"typings/**/*",
-		"src/**/*"
-	],
-	"exclude": [
-		"**/test/**",
-		"**/stories/**",
-		"**/*.test.ts",
-		"**/*.test.tsx"
-	]
-}
diff --git a/packages/js/experimental-products-app/tsconfig.json b/packages/js/experimental-products-app/tsconfig.json
index b1bfb675b22..f0fa036ac32 100644
--- a/packages/js/experimental-products-app/tsconfig.json
+++ b/packages/js/experimental-products-app/tsconfig.json
@@ -1,5 +1,5 @@
 {
-	"extends": "@woocommerce/internal-ts-config/tsconfig.json",
+	"extends": "@woocommerce/internal-build/configs/tsconfig.json",
 	"compilerOptions": {
 		"rootDir": "src",
 		"noCheck": false,
diff --git a/packages/js/experimental-products-app/webpack.config.js b/packages/js/experimental-products-app/webpack.config.js
index 6b4b56b1a6b..29e8b19870d 100644
--- a/packages/js/experimental-products-app/webpack.config.js
+++ b/packages/js/experimental-products-app/webpack.config.js
@@ -12,7 +12,7 @@ const {
 	plugin,
 	StyleAssetPlugin,
 	WebpackRTLPlugin
-} = require( '@woocommerce/internal-style-build' );
+} = require( '@woocommerce/internal-build/style-build' );

 const NODE_ENV = process.env.NODE_ENV || 'development';

@@ -28,7 +28,7 @@ module.exports = {
 			config: [
 				__filename,
 				path.resolve( __dirname, '../../../pnpm-lock.yaml' ),
-				require.resolve( '@woocommerce/internal-style-build' ),
+				require.resolve( '@woocommerce/internal-build/style-build' ),
 			],
 		},
 	},
diff --git a/packages/js/experimental/build.mjs b/packages/js/experimental/build.mjs
index 746bc61fc4b..2d76d01222e 100644
--- a/packages/js/experimental/build.mjs
+++ b/packages/js/experimental/build.mjs
@@ -1,112 +1,3 @@
-import { build, context } from 'esbuild';
-import { glob } from 'glob';
-import { rm } from 'node:fs/promises';
-import chokidar from 'chokidar';
+import { runPackageBuilder } from '@woocommerce/internal-build';

-const watch = process.argv.includes( '--watch' );
-const format = process.argv.includes( '--cjs' ) ? 'cjs' : 'esm';
-const outdir = format === 'cjs' ? 'build' : 'build-module';
-
-const ENTRY_GLOB = 'src/**/*.{ts,tsx,js,jsx}';
-const ENTRY_IGNORE = [
-	'**/test/**',
-	'**/stories/**',
-	'**/*.test.{ts,tsx,js,jsx}',
-	'**/*.d.ts',
-];
-
-async function resolveEntryPoints() {
-	return glob( ENTRY_GLOB, { ignore: ENTRY_IGNORE } );
-}
-
-function makeOptions( entryPoints ) {
-	return {
-		entryPoints,
-		outdir,
-		outbase: 'src',
-		bundle: false,
-		format,
-		platform: 'neutral',
-		target: 'esnext',
-		loader: { '.js': 'jsx', '.jsx': 'jsx', '.ts': 'ts', '.tsx': 'tsx' },
-		jsx: 'transform',
-		jsxFactory: 'createElement',
-		jsxFragment: 'Fragment',
-		logLevel: 'warning',
-		sourcemap: false,
-	};
-}
-
-function summarize( result ) {
-	const errors = result.errors.length;
-	const warnings = result.warnings.length;
-	const parts = [];
-	if ( errors ) parts.push( `${ errors } error(s)` );
-	if ( warnings ) parts.push( `${ warnings } warning(s)` );
-	return parts.length ? ` — ${ parts.join( ', ' ) }` : '';
-}
-
-// Wrap a watch-mode step so a single failure (disk error, build crash, etc.)
-// doesn't take the watcher process down. Errors are surfaced; the loop survives.
-async function safe( label, fn ) {
-	try {
-		return await fn();
-	} catch ( error ) {
-		console.error( `[watch] ${ label } failed:`, error?.message ?? error );
-		return null;
-	}
-}
-
-await rm( outdir, { recursive: true, force: true } );
-
-if ( watch ) {
-	const startupT0 = Date.now();
-	let entryPoints = await resolveEntryPoints();
-	let ctx = await context( makeOptions( entryPoints ) );
-	const initial = await safe( 'startup build', () => ctx.rebuild() );
-	console.log( `[watch] ready in ${ Date.now() - startupT0 }ms — ${ entryPoints.length } entry point(s)${ initial ? summarize( initial ) : '' }` );
-
-	// esbuild's own watcher polls the filesystem, which can miss or delay
-	// changes (especially edits to files added after context creation).
-	// chokidar uses OS-level events (fsevents/inotify) and drives rebuilds
-	// directly: changes call ctx.rebuild() (preserves the AST cache),
-	// add/unlink trigger a debounced context restart (entry list changed).
-	let pending;
-	const pendingChanges = new Set();
-	const restart = ( path, kind ) => {
-		pendingChanges.add( `${ path } (${ kind })` );
-		clearTimeout( pending );
-		pending = setTimeout( () => safe( 'restart', async () => {
-			const changes = [ ...pendingChanges ];
-			pendingChanges.clear();
-			const preview = changes.slice( 0, 3 ).join( ', ' );
-			const suffix = changes.length > 3 ? `, +${ changes.length - 3 } more` : '';
-			console.log( `[watch] restarting (${ preview }${ suffix })` );
-			const t0 = Date.now();
-			await ctx.dispose();
-			await rm( outdir, { recursive: true, force: true } );
-			entryPoints = await resolveEntryPoints();
-			ctx = await context( makeOptions( entryPoints ) );
-			const result = await ctx.rebuild();
-			console.log( `[watch] rebuilt in ${ Date.now() - t0 }ms — ${ entryPoints.length } entry point(s)${ summarize( result ) }` );
-		} ), 200 );
-	};
-
-	chokidar
-		.watch( ENTRY_GLOB, { ignored: ENTRY_IGNORE, ignoreInitial: true } )
-		.on( 'add', ( path ) => restart( path, 'added' ) )
-		.on( 'unlink', ( path ) => restart( path, 'deleted' ) )
-		.on( 'change', async ( path ) => {
-			const t0 = Date.now();
-			const result = await safe( `rebuild ${ path }`, () => ctx.rebuild() );
-			if ( result ) {
-				console.log( `[watch] rebuilt ${ path } in ${ Date.now() - t0 }ms${ summarize( result ) }` );
-			}
-		} );
-} else {
-	const entryPoints = await resolveEntryPoints();
-	const t0 = Date.now();
-	console.log( `[build] ${ entryPoints.length } entry point(s)...` );
-	const result = await build( makeOptions( entryPoints ) );
-	console.log( `[build] done in ${ Date.now() - t0 }ms${ summarize( result ) }` );
-}
+await runPackageBuilder( { entryPoints: 'src/**/*.{ts,tsx,js,jsx}' } );
diff --git a/packages/js/experimental/package.json b/packages/js/experimental/package.json
index 1ba6b302693..44f750215ad 100644
--- a/packages/js/experimental/package.json
+++ b/packages/js/experimental/package.json
@@ -20,9 +20,17 @@
 	"bugs": {
 		"url": "https://github.com/woocommerce/woocommerce/issues"
 	},
+	"exports": {
+		".": {
+			"wc-source": "./src/index.js",
+			"types": "./build-types/index.d.ts",
+			"import": "./build-module/index.js",
+			"require": "./build/index.js"
+		}
+	},
 	"main": "build/index.js",
 	"module": "build-module/index.js",
-	"types": "build-types",
+	"types": "build-types/index.d.ts",
 	"react-native": "src/index",
 	"files": [
 		"build",
@@ -49,7 +57,14 @@
 		"react-transition-group": "^4.4.5"
 	},
 	"publishConfig": {
-		"access": "public"
+		"access": "public",
+		"exports": {
+			".": {
+				"types": "./build-types/index.d.ts",
+				"import": "./build-module/index.js",
+				"require": "./build/index.js"
+			}
+		}
 	},
 	"devDependencies": {
 		"@babel/core": "7.25.7",
@@ -64,15 +79,11 @@
 		"@types/react-transition-group": "^4.4.10",
 		"@types/testing-library__jest-dom": "^5.14.9",
 		"@woocommerce/eslint-plugin": "workspace:*",
+		"@woocommerce/internal-build": "workspace:*",
 		"@woocommerce/internal-js-tests": "workspace:*",
-		"@woocommerce/internal-style-build": "workspace:*",
-		"@woocommerce/internal-ts-config": "workspace:*",
 		"@wordpress/browserslist-config": "next",
-		"chokidar": "3.6.x",
 		"css-loader": "6.11.x",
-		"esbuild": "0.24.x",
 		"eslint": "^8.55.0",
-		"glob": "^10.3.10",
 		"jest": "29.5.x",
 		"jest-cli": "29.5.x",
 		"jest-environment-jsdom": "29.5.x",
@@ -91,11 +102,11 @@
 	},
 	"scripts": {
 		"build": "pnpm --if-present --workspace-concurrency=Infinity --stream --filter=\"$npm_package_name...\" '/^build:project:.*$/'",
-		"build:project": "pnpm --if-present '/^build:project:.*$/'",
+		"build:project": "pnpm --stream --if-present '/^build:project:.*$/'",
 		"build:project:bundle": "NODE_ENV=production webpack",
 		"build:project:esm": "node build.mjs",
 		"build:publish:project": "pnpm --if-present '/^build:publish:project:.*$/'",
-		"build:publish:project:cjs": "node build.mjs --cjs",
+		"build:publish:project:cjs": "node build.mjs --commonjs",
 		"build:publish:project:types": "tsc --build --emitDeclarationOnly",
 		"build:publish:project:deps": "pnpm build",
 		"changelog": "XDEBUG_MODE=off composer install --quiet && composer exec -- changelogger",
diff --git a/packages/js/experimental/tsconfig-cjs.json b/packages/js/experimental/tsconfig-cjs.json
deleted file mode 100644
index 247b557c04c..00000000000
--- a/packages/js/experimental/tsconfig-cjs.json
+++ /dev/null
@@ -1,19 +0,0 @@
-{
-	"extends": "@woocommerce/internal-ts-config/tsconfig-cjs.json",
-	"compilerOptions": {
-		"rootDir": "src",
-		"outDir": "build",
-		"typeRoots": [
-			"./typings",
-			"./node_modules/@types"
-		]
-	},
-	"include": [
-		"typings/**/*",
-		"src/**/*"
-	],
-	"exclude": [
-		"**/test/**",
-		"**/stories/**"
-	]
-}
diff --git a/packages/js/experimental/tsconfig.json b/packages/js/experimental/tsconfig.json
index fbd555398a3..0db42f1fe26 100644
--- a/packages/js/experimental/tsconfig.json
+++ b/packages/js/experimental/tsconfig.json
@@ -1,5 +1,5 @@
 {
-	"extends": "@woocommerce/internal-ts-config/tsconfig.json",
+	"extends": "@woocommerce/internal-build/configs/tsconfig.json",
 	"compilerOptions": {
 		"rootDir": "src",
 		"outDir": "build-module",
diff --git a/packages/js/experimental/webpack.config.js b/packages/js/experimental/webpack.config.js
index 9d696e6b37f..0f8dbd47654 100644
--- a/packages/js/experimental/webpack.config.js
+++ b/packages/js/experimental/webpack.config.js
@@ -1,7 +1,7 @@
 /**
  * Internal dependencies
  */
-const { webpackConfig } = require( '@woocommerce/internal-style-build' );
+const { webpackConfig } = require( '@woocommerce/internal-build/style-build' );

 /**
  * External dependencies
@@ -22,7 +22,7 @@ module.exports = {
 			config: [
 				__filename,
 				path.resolve( __dirname, '../../../pnpm-lock.yaml' ),
-				require.resolve( '@woocommerce/internal-style-build' ),
+				require.resolve( '@woocommerce/internal-build/style-build' ),
 			],
 		},
 	},
diff --git a/packages/js/explat/build.mjs b/packages/js/explat/build.mjs
index 746bc61fc4b..2d76d01222e 100644
--- a/packages/js/explat/build.mjs
+++ b/packages/js/explat/build.mjs
@@ -1,112 +1,3 @@
-import { build, context } from 'esbuild';
-import { glob } from 'glob';
-import { rm } from 'node:fs/promises';
-import chokidar from 'chokidar';
+import { runPackageBuilder } from '@woocommerce/internal-build';

-const watch = process.argv.includes( '--watch' );
-const format = process.argv.includes( '--cjs' ) ? 'cjs' : 'esm';
-const outdir = format === 'cjs' ? 'build' : 'build-module';
-
-const ENTRY_GLOB = 'src/**/*.{ts,tsx,js,jsx}';
-const ENTRY_IGNORE = [
-	'**/test/**',
-	'**/stories/**',
-	'**/*.test.{ts,tsx,js,jsx}',
-	'**/*.d.ts',
-];
-
-async function resolveEntryPoints() {
-	return glob( ENTRY_GLOB, { ignore: ENTRY_IGNORE } );
-}
-
-function makeOptions( entryPoints ) {
-	return {
-		entryPoints,
-		outdir,
-		outbase: 'src',
-		bundle: false,
-		format,
-		platform: 'neutral',
-		target: 'esnext',
-		loader: { '.js': 'jsx', '.jsx': 'jsx', '.ts': 'ts', '.tsx': 'tsx' },
-		jsx: 'transform',
-		jsxFactory: 'createElement',
-		jsxFragment: 'Fragment',
-		logLevel: 'warning',
-		sourcemap: false,
-	};
-}
-
-function summarize( result ) {
-	const errors = result.errors.length;
-	const warnings = result.warnings.length;
-	const parts = [];
-	if ( errors ) parts.push( `${ errors } error(s)` );
-	if ( warnings ) parts.push( `${ warnings } warning(s)` );
-	return parts.length ? ` — ${ parts.join( ', ' ) }` : '';
-}
-
-// Wrap a watch-mode step so a single failure (disk error, build crash, etc.)
-// doesn't take the watcher process down. Errors are surfaced; the loop survives.
-async function safe( label, fn ) {
-	try {
-		return await fn();
-	} catch ( error ) {
-		console.error( `[watch] ${ label } failed:`, error?.message ?? error );
-		return null;
-	}
-}
-
-await rm( outdir, { recursive: true, force: true } );
-
-if ( watch ) {
-	const startupT0 = Date.now();
-	let entryPoints = await resolveEntryPoints();
-	let ctx = await context( makeOptions( entryPoints ) );
-	const initial = await safe( 'startup build', () => ctx.rebuild() );
-	console.log( `[watch] ready in ${ Date.now() - startupT0 }ms — ${ entryPoints.length } entry point(s)${ initial ? summarize( initial ) : '' }` );
-
-	// esbuild's own watcher polls the filesystem, which can miss or delay
-	// changes (especially edits to files added after context creation).
-	// chokidar uses OS-level events (fsevents/inotify) and drives rebuilds
-	// directly: changes call ctx.rebuild() (preserves the AST cache),
-	// add/unlink trigger a debounced context restart (entry list changed).
-	let pending;
-	const pendingChanges = new Set();
-	const restart = ( path, kind ) => {
-		pendingChanges.add( `${ path } (${ kind })` );
-		clearTimeout( pending );
-		pending = setTimeout( () => safe( 'restart', async () => {
-			const changes = [ ...pendingChanges ];
-			pendingChanges.clear();
-			const preview = changes.slice( 0, 3 ).join( ', ' );
-			const suffix = changes.length > 3 ? `, +${ changes.length - 3 } more` : '';
-			console.log( `[watch] restarting (${ preview }${ suffix })` );
-			const t0 = Date.now();
-			await ctx.dispose();
-			await rm( outdir, { recursive: true, force: true } );
-			entryPoints = await resolveEntryPoints();
-			ctx = await context( makeOptions( entryPoints ) );
-			const result = await ctx.rebuild();
-			console.log( `[watch] rebuilt in ${ Date.now() - t0 }ms — ${ entryPoints.length } entry point(s)${ summarize( result ) }` );
-		} ), 200 );
-	};
-
-	chokidar
-		.watch( ENTRY_GLOB, { ignored: ENTRY_IGNORE, ignoreInitial: true } )
-		.on( 'add', ( path ) => restart( path, 'added' ) )
-		.on( 'unlink', ( path ) => restart( path, 'deleted' ) )
-		.on( 'change', async ( path ) => {
-			const t0 = Date.now();
-			const result = await safe( `rebuild ${ path }`, () => ctx.rebuild() );
-			if ( result ) {
-				console.log( `[watch] rebuilt ${ path } in ${ Date.now() - t0 }ms${ summarize( result ) }` );
-			}
-		} );
-} else {
-	const entryPoints = await resolveEntryPoints();
-	const t0 = Date.now();
-	console.log( `[build] ${ entryPoints.length } entry point(s)...` );
-	const result = await build( makeOptions( entryPoints ) );
-	console.log( `[build] done in ${ Date.now() - t0 }ms${ summarize( result ) }` );
-}
+await runPackageBuilder( { entryPoints: 'src/**/*.{ts,tsx,js,jsx}' } );
diff --git a/packages/js/explat/package.json b/packages/js/explat/package.json
index cf7d73412b2..31a04e504f2 100644
--- a/packages/js/explat/package.json
+++ b/packages/js/explat/package.json
@@ -21,9 +21,17 @@
 	"bugs": {
 		"url": "https://github.com/woocommerce/woocommerce/issues"
 	},
+	"exports": {
+		".": {
+			"wc-source": "./src/index.ts",
+			"types": "./build-types/index.d.ts",
+			"import": "./build-module/index.js",
+			"require": "./build/index.js"
+		}
+	},
 	"main": "build/index.js",
 	"module": "build-module/index.js",
-	"types": "build-types",
+	"types": "build-types/index.d.ts",
 	"files": [
 		"build",
 		"build-module",
@@ -31,10 +39,10 @@
 	],
 	"scripts": {
 		"build": "pnpm --if-present --workspace-concurrency=Infinity --stream --filter=\"$npm_package_name...\" '/^build:project:.*$/'",
-		"build:project": "pnpm --if-present '/^build:project:.*$/'",
+		"build:project": "pnpm --stream --if-present '/^build:project:.*$/'",
 		"build:project:esm": "node build.mjs",
 		"build:publish:project": "pnpm --if-present '/^build:publish:project:.*$/'",
-		"build:publish:project:cjs": "node build.mjs --cjs",
+		"build:publish:project:cjs": "node build.mjs --commonjs",
 		"build:publish:project:types": "tsc --build --emitDeclarationOnly",
 		"build:publish:project:deps": "pnpm build",
 		"changelog": "XDEBUG_MODE=off composer install --quiet && composer exec -- changelogger",
@@ -72,12 +80,9 @@
 		"@types/qs": "^6.9.10",
 		"@types/react": "18.3.x",
 		"@woocommerce/eslint-plugin": "workspace:*",
+		"@woocommerce/internal-build": "workspace:*",
 		"@woocommerce/internal-js-tests": "workspace:*",
-		"@woocommerce/internal-ts-config": "workspace:*",
-		"chokidar": "3.6.x",
-		"esbuild": "0.24.x",
 		"eslint": "^8.55.0",
-		"glob": "^10.3.10",
 		"jest": "29.5.x",
 		"jest-cli": "29.5.x",
 		"jest-environment-jsdom": "29.5.x",
@@ -86,7 +91,14 @@
 		"typescript": "5.7.x"
 	},
 	"publishConfig": {
-		"access": "public"
+		"access": "public",
+		"exports": {
+			".": {
+				"types": "./build-types/index.d.ts",
+				"import": "./build-module/index.js",
+				"require": "./build/index.js"
+			}
+		}
 	},
 	"config": {
 		"ci": {
diff --git a/packages/js/explat/tsconfig-cjs.json b/packages/js/explat/tsconfig-cjs.json
deleted file mode 100644
index 5a4f74e214d..00000000000
--- a/packages/js/explat/tsconfig-cjs.json
+++ /dev/null
@@ -1,18 +0,0 @@
-{
-	"extends": "@woocommerce/internal-ts-config/tsconfig-cjs.json",
-	"compilerOptions": {
-		"rootDir": "src",
-		"outDir": "build",
-		"typeRoots": [
-			"./typings",
-			"./node_modules/@types"
-		]
-	},
-	"include": [
-		"typings/**/*",
-		"src/**/*"
-	],
-	"exclude": [
-		"**/test/**"
-	]
-}
diff --git a/packages/js/explat/tsconfig.json b/packages/js/explat/tsconfig.json
index 2cb6f5a848f..be24cae4c13 100644
--- a/packages/js/explat/tsconfig.json
+++ b/packages/js/explat/tsconfig.json
@@ -1,5 +1,5 @@
 {
-	"extends": "@woocommerce/internal-ts-config/tsconfig.json",
+	"extends": "@woocommerce/internal-build/configs/tsconfig.json",
 	"compilerOptions": {
 		"rootDir": "src",
 		"outDir": "build-module",
diff --git a/packages/js/expression-evaluation/build.mjs b/packages/js/expression-evaluation/build.mjs
index 746bc61fc4b..2d76d01222e 100644
--- a/packages/js/expression-evaluation/build.mjs
+++ b/packages/js/expression-evaluation/build.mjs
@@ -1,112 +1,3 @@
-import { build, context } from 'esbuild';
-import { glob } from 'glob';
-import { rm } from 'node:fs/promises';
-import chokidar from 'chokidar';
+import { runPackageBuilder } from '@woocommerce/internal-build';

-const watch = process.argv.includes( '--watch' );
-const format = process.argv.includes( '--cjs' ) ? 'cjs' : 'esm';
-const outdir = format === 'cjs' ? 'build' : 'build-module';
-
-const ENTRY_GLOB = 'src/**/*.{ts,tsx,js,jsx}';
-const ENTRY_IGNORE = [
-	'**/test/**',
-	'**/stories/**',
-	'**/*.test.{ts,tsx,js,jsx}',
-	'**/*.d.ts',
-];
-
-async function resolveEntryPoints() {
-	return glob( ENTRY_GLOB, { ignore: ENTRY_IGNORE } );
-}
-
-function makeOptions( entryPoints ) {
-	return {
-		entryPoints,
-		outdir,
-		outbase: 'src',
-		bundle: false,
-		format,
-		platform: 'neutral',
-		target: 'esnext',
-		loader: { '.js': 'jsx', '.jsx': 'jsx', '.ts': 'ts', '.tsx': 'tsx' },
-		jsx: 'transform',
-		jsxFactory: 'createElement',
-		jsxFragment: 'Fragment',
-		logLevel: 'warning',
-		sourcemap: false,
-	};
-}
-
-function summarize( result ) {
-	const errors = result.errors.length;
-	const warnings = result.warnings.length;
-	const parts = [];
-	if ( errors ) parts.push( `${ errors } error(s)` );
-	if ( warnings ) parts.push( `${ warnings } warning(s)` );
-	return parts.length ? ` — ${ parts.join( ', ' ) }` : '';
-}
-
-// Wrap a watch-mode step so a single failure (disk error, build crash, etc.)
-// doesn't take the watcher process down. Errors are surfaced; the loop survives.
-async function safe( label, fn ) {
-	try {
-		return await fn();
-	} catch ( error ) {
-		console.error( `[watch] ${ label } failed:`, error?.message ?? error );
-		return null;
-	}
-}
-
-await rm( outdir, { recursive: true, force: true } );
-
-if ( watch ) {
-	const startupT0 = Date.now();
-	let entryPoints = await resolveEntryPoints();
-	let ctx = await context( makeOptions( entryPoints ) );
-	const initial = await safe( 'startup build', () => ctx.rebuild() );
-	console.log( `[watch] ready in ${ Date.now() - startupT0 }ms — ${ entryPoints.length } entry point(s)${ initial ? summarize( initial ) : '' }` );
-
-	// esbuild's own watcher polls the filesystem, which can miss or delay
-	// changes (especially edits to files added after context creation).
-	// chokidar uses OS-level events (fsevents/inotify) and drives rebuilds
-	// directly: changes call ctx.rebuild() (preserves the AST cache),
-	// add/unlink trigger a debounced context restart (entry list changed).
-	let pending;
-	const pendingChanges = new Set();
-	const restart = ( path, kind ) => {
-		pendingChanges.add( `${ path } (${ kind })` );
-		clearTimeout( pending );
-		pending = setTimeout( () => safe( 'restart', async () => {
-			const changes = [ ...pendingChanges ];
-			pendingChanges.clear();
-			const preview = changes.slice( 0, 3 ).join( ', ' );
-			const suffix = changes.length > 3 ? `, +${ changes.length - 3 } more` : '';
-			console.log( `[watch] restarting (${ preview }${ suffix })` );
-			const t0 = Date.now();
-			await ctx.dispose();
-			await rm( outdir, { recursive: true, force: true } );
-			entryPoints = await resolveEntryPoints();
-			ctx = await context( makeOptions( entryPoints ) );
-			const result = await ctx.rebuild();
-			console.log( `[watch] rebuilt in ${ Date.now() - t0 }ms — ${ entryPoints.length } entry point(s)${ summarize( result ) }` );
-		} ), 200 );
-	};
-
-	chokidar
-		.watch( ENTRY_GLOB, { ignored: ENTRY_IGNORE, ignoreInitial: true } )
-		.on( 'add', ( path ) => restart( path, 'added' ) )
-		.on( 'unlink', ( path ) => restart( path, 'deleted' ) )
-		.on( 'change', async ( path ) => {
-			const t0 = Date.now();
-			const result = await safe( `rebuild ${ path }`, () => ctx.rebuild() );
-			if ( result ) {
-				console.log( `[watch] rebuilt ${ path } in ${ Date.now() - t0 }ms${ summarize( result ) }` );
-			}
-		} );
-} else {
-	const entryPoints = await resolveEntryPoints();
-	const t0 = Date.now();
-	console.log( `[build] ${ entryPoints.length } entry point(s)...` );
-	const result = await build( makeOptions( entryPoints ) );
-	console.log( `[build] done in ${ Date.now() - t0 }ms${ summarize( result ) }` );
-}
+await runPackageBuilder( { entryPoints: 'src/**/*.{ts,tsx,js,jsx}' } );
diff --git a/packages/js/expression-evaluation/package.json b/packages/js/expression-evaluation/package.json
index bf9f54c815d..051c12ff6fe 100644
--- a/packages/js/expression-evaluation/package.json
+++ b/packages/js/expression-evaluation/package.json
@@ -21,9 +21,17 @@
 	"bugs": {
 		"url": "https://github.com/woocommerce/woocommerce/issues"
 	},
+	"exports": {
+		".": {
+			"wc-source": "./src/index.ts",
+			"types": "./build-types/index.d.ts",
+			"import": "./build-module/index.js",
+			"require": "./build/index.js"
+		}
+	},
 	"main": "build/index.js",
 	"module": "build-module/index.js",
-	"types": "build-types",
+	"types": "build-types/index.d.ts",
 	"react-native": "src/index",
 	"files": [
 		"build",
@@ -35,14 +43,21 @@
 		"peggy": "^3.0.2"
 	},
 	"publishConfig": {
-		"access": "public"
+		"access": "public",
+		"exports": {
+			".": {
+				"types": "./build-types/index.d.ts",
+				"import": "./build-module/index.js",
+				"require": "./build/index.js"
+			}
+		}
 	},
 	"scripts": {
 		"build": "pnpm --if-present --workspace-concurrency=Infinity --stream --filter=\"$npm_package_name...\" '/^build:project:.*$/'",
-		"build:project": "pnpm --if-present '/^build:project:.*$/'",
+		"build:project": "pnpm --stream --if-present '/^build:project:.*$/'",
 		"build:project:esm": "node build.mjs",
 		"build:publish:project": "pnpm --if-present '/^build:publish:project:.*$/'",
-		"build:publish:project:cjs": "node build.mjs --cjs",
+		"build:publish:project:cjs": "node build.mjs --commonjs",
 		"build:publish:project:types": "tsc --build --emitDeclarationOnly",
 		"build:publish:project:deps": "pnpm build",
 		"changelog": "XDEBUG_MODE=off composer install --quiet && composer exec -- changelogger",
@@ -61,12 +76,9 @@
 		"@babel/core": "7.25.7",
 		"@types/jest": "29.5.x",
 		"@woocommerce/eslint-plugin": "workspace:*",
+		"@woocommerce/internal-build": "workspace:*",
 		"@woocommerce/internal-js-tests": "workspace:*",
-		"@woocommerce/internal-ts-config": "workspace:*",
-		"chokidar": "3.6.x",
-		"esbuild": "0.24.x",
 		"eslint": "^8.55.0",
-		"glob": "^10.3.10",
 		"jest": "29.5.x",
 		"jest-cli": "29.5.x",
 		"jest-environment-jsdom": "29.5.x",
diff --git a/packages/js/expression-evaluation/tsconfig-cjs.json b/packages/js/expression-evaluation/tsconfig-cjs.json
deleted file mode 100644
index 8bb9e43ef3b..00000000000
--- a/packages/js/expression-evaluation/tsconfig-cjs.json
+++ /dev/null
@@ -1,19 +0,0 @@
-{
-	"extends": "@woocommerce/internal-ts-config/tsconfig-cjs.json",
-	"compilerOptions": {
-		"rootDir": "src",
-		"declaration": true,
-		"outDir": "build",
-		"typeRoots": [
-			"./typings",
-			"./node_modules/@types"
-		]
-	},
-	"include": [
-		"typings/**/*",
-		"src/**/*"
-	],
-	"exclude": [
-		"**/test/**"
-	]
-}
diff --git a/packages/js/expression-evaluation/tsconfig.json b/packages/js/expression-evaluation/tsconfig.json
index 2cb6f5a848f..be24cae4c13 100644
--- a/packages/js/expression-evaluation/tsconfig.json
+++ b/packages/js/expression-evaluation/tsconfig.json
@@ -1,5 +1,5 @@
 {
-	"extends": "@woocommerce/internal-ts-config/tsconfig.json",
+	"extends": "@woocommerce/internal-build/configs/tsconfig.json",
 	"compilerOptions": {
 		"rootDir": "src",
 		"outDir": "build-module",
diff --git a/packages/js/internal-style-build/.eslintrc.js b/packages/js/internal-build/.eslintrc.cjs
similarity index 100%
rename from packages/js/internal-style-build/.eslintrc.js
rename to packages/js/internal-build/.eslintrc.cjs
diff --git a/packages/js/internal-build/.gitignore b/packages/js/internal-build/.gitignore
new file mode 100644
index 00000000000..686ca67be0a
--- /dev/null
+++ b/packages/js/internal-build/.gitignore
@@ -0,0 +1,6 @@
+# Auto-generated by scripts/generate-types.mjs — only the .patch file is committed.
+type-overrides/@wordpress/block-editor/
+type-overrides/@wordpress/core-data/
+type-overrides/@wordpress/data/
+type-overrides/@wordpress/editor/
+type-overrides/@wordpress/notices/
diff --git a/packages/js/internal-ts-config/tsconfig.json b/packages/js/internal-build/configs/tsconfig.json
similarity index 100%
rename from packages/js/internal-ts-config/tsconfig.json
rename to packages/js/internal-build/configs/tsconfig.json
diff --git a/packages/js/internal-build/package.json b/packages/js/internal-build/package.json
new file mode 100644
index 00000000000..540df7924ce
--- /dev/null
+++ b/packages/js/internal-build/package.json
@@ -0,0 +1,89 @@
+{
+	"name": "@woocommerce/internal-build",
+	"version": "1.0.0",
+	"description": "Shared build tooling for the WooCommerce monorepo: esbuild helpers, webpack/SCSS config, shared tsconfig, and WordPress ambient type overrides.",
+	"author": "Automattic",
+	"license": "GPL-2.0-or-later",
+	"engines": {
+		"node": "^24.15.0"
+	},
+	"private": true,
+	"type": "module",
+	"homepage": "https://github.com/woocommerce/woocommerce/tree/trunk/packages/js/internal-build/README.md",
+	"repository": {
+		"type": "git",
+		"url": "https://github.com/woocommerce/woocommerce.git"
+	},
+	"bugs": {
+		"url": "https://github.com/woocommerce/woocommerce/issues"
+	},
+	"module": "build-module/index.js",
+	"types": "build-types/index.d.ts",
+	"exports": {
+		".": {
+			"wc-source": "./src/index.ts",
+			"types": "./build-types/index.d.ts",
+			"import": "./build-module/index.js"
+		},
+		"./style-build": {
+			"require": "./src/style-build/index.cjs"
+		},
+		"./configs/tsconfig.json": "./configs/tsconfig.json",
+		"./type-overrides/*": "./type-overrides/*",
+		"./styles/*": "./styles/*"
+	},
+	"files": [
+		"build-module",
+		"build-types",
+		"configs",
+		"src/style-build",
+		"styles",
+		"type-overrides",
+		"scripts"
+	],
+	"scripts": {
+		"build": "pnpm --if-present --workspace-concurrency=Infinity --stream --filter=\"$npm_package_name...\" '/^build:project:.*$/'",
+		"build:project": "pnpm --if-present '/^build:project:.*$/'",
+		"build:project:lib": "tsc --build src/tsconfig.json",
+		"build:project:type-overrides": "node scripts/generate-types.mjs generate",
+		"postinstall": "pnpm build:project",
+		"type-overrides:update-patch": "node scripts/generate-types.mjs update-patch",
+		"lint": "pnpm --if-present '/^lint:lang:.*$/'",
+		"lint:fix": "pnpm --if-present '/^lint:fix:lang:.*$/'",
+		"lint:fix:lang:js": "eslint src --fix",
+		"lint:lang:js": "eslint src"
+	},
+	"dependencies": {
+		"@automattic/color-studio": "^4.0.0",
+		"@wordpress/base-styles": "catalog:wp-min",
+		"@wordpress/postcss-plugins-preset": "catalog:wp-min",
+		"chokidar": "^3.6.0",
+		"css-loader": "6.11.x",
+		"esbuild": "^0.24.0",
+		"glob": "^10.3.10",
+		"json2php": "^0.0.7",
+		"mini-css-extract-plugin": "2.9.x",
+		"postcss-loader": "4.3.x",
+		"rtlcss": "4.3.x",
+		"sass-loader": "10.5.x",
+		"webpack-remove-empty-scripts": "1.0.x"
+	},
+	"devDependencies": {
+		"@types/wordpress__block-editor": "14.21.8",
+		"@woocommerce/eslint-plugin": "workspace:*",
+		"@wordpress/core-data": "7.19.6",
+		"@wordpress/data": "10.19.2",
+		"@wordpress/editor": "14.19.7",
+		"@wordpress/notices": "5.19.2",
+		"eslint": "^8.55.0",
+		"typescript": "5.7.x"
+	},
+	"config": {
+		"ci": {
+			"lint": {
+				"command": "lint",
+				"changes": "src/**/*.{js,jsx,ts,tsx,cjs}"
+			}
+		}
+	}
+}
diff --git a/packages/js/internal-ts-config/scripts/generate-types.mjs b/packages/js/internal-build/scripts/generate-types.mjs
similarity index 98%
rename from packages/js/internal-ts-config/scripts/generate-types.mjs
rename to packages/js/internal-build/scripts/generate-types.mjs
index 99566184bb8..22fb4daea71 100644
--- a/packages/js/internal-ts-config/scripts/generate-types.mjs
+++ b/packages/js/internal-build/scripts/generate-types.mjs
@@ -43,7 +43,7 @@ const PACKAGE_NAMES = [
 ];

 const PKG_ROOT = resolve( dirname( new URL( import.meta.url ).pathname ), '..' );
-const TYPES_DIR = join( PKG_ROOT, 'types' );
+const TYPES_DIR = join( PKG_ROOT, 'type-overrides' );

 function dtPackageName( packageName ) {
 	return '@types/' + packageName.slice( 1 ).replace( '/', '__' );
@@ -422,7 +422,7 @@ function generate( outputDir ) {
 /**
  * Apply a patch file if it exists.
  *
- * Patch paths are relative to PKG_ROOT (e.g. `types/@wordpress/core-data/index.d.ts`),
+ * Patch paths are relative to PKG_ROOT (e.g. `type-overrides/@wordpress/core-data/index.d.ts`),
  * so `git apply` runs from PKG_ROOT without `--directory`.
  *
  * @param {string} patchFile - Path to the patch file.
@@ -496,8 +496,8 @@ function runUpdatePatch() {
 					// diff returns 1 when files differ — this is our patch content.
 					// Rewrite paths so the patch applies from the package root.
 					const patchContent = error.stdout
-						.replaceAll( cleanPkgDir, `a/types/${ pkg.name }` )
-						.replaceAll( currentPkgDir, `b/types/${ pkg.name }` )
+						.replaceAll( cleanPkgDir, `a/type-overrides/${ pkg.name }` )
+						.replaceAll( currentPkgDir, `b/type-overrides/${ pkg.name }` )
 						// Strip timestamps from diff headers to avoid noisy diffs.
 						.replace( /^(---\s+\S+)\t.+$/gm, '$1' )
 						.replace( /^(\+\+\+\s+\S+)\t.+$/gm, '$1' );
diff --git a/packages/js/internal-build/src/esbuild/args.ts b/packages/js/internal-build/src/esbuild/args.ts
new file mode 100644
index 00000000000..a0f1fa66708
--- /dev/null
+++ b/packages/js/internal-build/src/esbuild/args.ts
@@ -0,0 +1,15 @@
+export interface ParsedArgs {
+	watch: boolean;
+	format: 'esmodules' | 'commonjs';
+	debug: boolean;
+}
+
+export function parseBuildArgs(
+	argv: readonly string[] = process.argv
+): ParsedArgs {
+	return {
+		watch: argv.includes( '--watch' ),
+		format: argv.includes( '--commonjs' ) ? 'commonjs' : 'esmodules',
+		debug: argv.includes( '--debug' ),
+	};
+}
diff --git a/packages/js/internal-build/src/esbuild/assets.ts b/packages/js/internal-build/src/esbuild/assets.ts
new file mode 100644
index 00000000000..9b412b76959
--- /dev/null
+++ b/packages/js/internal-build/src/esbuild/assets.ts
@@ -0,0 +1,19 @@
+/**
+ * External dependencies
+ */
+import { copyFile, mkdir } from 'node:fs/promises';
+import { dirname, join, relative } from 'node:path';
+import { glob } from 'glob';
+
+export async function copyAssets(
+	patterns: readonly string[],
+	outdir: string
+): Promise< void > {
+	for ( const pattern of patterns ) {
+		for ( const src of await glob( pattern ) ) {
+			const dest = join( outdir, relative( 'src', src ) );
+			await mkdir( dirname( dest ), { recursive: true } );
+			await copyFile( src, dest );
+		}
+	}
+}
diff --git a/packages/js/internal-build/src/esbuild/index.ts b/packages/js/internal-build/src/esbuild/index.ts
new file mode 100644
index 00000000000..eadb563e68a
--- /dev/null
+++ b/packages/js/internal-build/src/esbuild/index.ts
@@ -0,0 +1,228 @@
+/**
+ * External dependencies
+ */
+import { build, context } from 'esbuild';
+import type { BuildResult } from 'esbuild';
+import { glob } from 'glob';
+import { rm } from 'node:fs/promises';
+import chokidar from 'chokidar';
+
+/**
+ * Internal dependencies
+ */
+import { parseBuildArgs } from './args.js';
+import {
+	DEFAULT_IGNORE,
+	prepareEsbuildOptions,
+	type BuildOptions,
+} from './options.js';
+import { copyAssets } from './assets.js';
+import { log, setDebugEnabled } from './logger.js';
+
+export type { BuildOptions } from './options.js';
+export { parseBuildArgs } from './args.js';
+
+const RESTART_DEBOUNCE_MS = 200;
+
+async function resolveEntryPoints(
+	entryPoints: string | string[],
+	ignore: readonly string[]
+): Promise< string[] > {
+	const patterns = Array.isArray( entryPoints )
+		? entryPoints
+		: [ entryPoints ];
+	const results = await Promise.all(
+		patterns.map( ( pattern ) =>
+			glob( pattern, { ignore: [ ...ignore ] } )
+		)
+	);
+	return Array.from( new Set( results.flat() ) ).sort();
+}
+
+function summarize( result: BuildResult ): string {
+	const parts: string[] = [];
+	if ( result.errors.length )
+		parts.push( `${ result.errors.length } error(s)` );
+	if ( result.warnings.length )
+		parts.push( `${ result.warnings.length } warning(s)` );
+	return parts.length ? ` — ${ parts.join( ', ' ) }` : '';
+}
+
+function errorMessage( error: unknown ): string {
+	return error && typeof error === 'object' && 'message' in error
+		? String( ( error as { message: unknown } ).message )
+		: String( error );
+}
+
+export async function buildPackage( options: BuildOptions ): Promise< void > {
+	const format = options.format ?? 'esmodules';
+	const ignore = [ ...DEFAULT_IGNORE, ...( options.ignore ?? [] ) ];
+	const outdir = format === 'commonjs' ? 'build' : 'build-module';
+
+	await rm( outdir, { recursive: true, force: true } );
+	const entryPoints = await resolveEntryPoints( options.entryPoints, ignore );
+
+	log.debug( 'build', `format: ${ format }, outdir: ${ outdir }` );
+	for ( const entry of entryPoints )
+		log.debug( 'build', `entry: ${ entry }` );
+
+	const t0 = Date.now();
+	log.info( 'build', `${ entryPoints.length } entry point(s)...` );
+	const result = await build(
+		prepareEsbuildOptions( format, entryPoints, options.esbuild )
+	);
+	if ( options.assets?.length ) await copyAssets( options.assets, outdir );
+	log.info( 'ok', `done in ${ Date.now() - t0 }ms${ summarize( result ) }` );
+}
+
+export async function watchPackage( options: BuildOptions ): Promise< void > {
+	const format = options.format ?? 'esmodules';
+	const ignore = [ ...DEFAULT_IGNORE, ...( options.ignore ?? [] ) ];
+	const assets = options.assets ?? [];
+	const outdir = format === 'commonjs' ? 'build' : 'build-module';
+	const watchedPatterns = [
+		...( Array.isArray( options.entryPoints )
+			? options.entryPoints
+			: [ options.entryPoints ] ),
+		...assets,
+	];
+
+	const startupT0 = Date.now();
+	await rm( outdir, { recursive: true, force: true } );
+
+	let entryPoints = await resolveEntryPoints( options.entryPoints, ignore );
+	let ctx = await context(
+		prepareEsbuildOptions( format, entryPoints, options.esbuild )
+	);
+
+	log.debug( 'watch', `format: ${ format }, outdir: ${ outdir }` );
+	log.debug( 'watch', `watching: ${ watchedPatterns.join( ', ' ) }` );
+	for ( const entry of entryPoints )
+		log.debug( 'watch', `entry: ${ entry }` );
+
+	try {
+		const initial = await ctx.rebuild();
+		if ( assets.length ) await copyAssets( assets, outdir );
+		log.info(
+			'watch',
+			`ready in ${ Date.now() - startupT0 }ms — ${
+				entryPoints.length
+			} entry point(s)${ summarize( initial ) }`
+		);
+	} catch ( error ) {
+		log.error(
+			'watch',
+			`startup build failed: ${ errorMessage( error ) }`
+		);
+	}
+
+	// esbuild's own watcher polls the filesystem, which can miss or delay
+	// changes (especially edits to files added after context creation).
+	// chokidar uses OS-level events and drives rebuilds directly: changes
+	// call ctx.rebuild() (preserves the AST cache), add/unlink trigger a
+	// debounced context restart (entry list changed).
+	let pending: NodeJS.Timeout | undefined;
+	const pendingChanges = new Set< string >();
+
+	const restart = ( path: string, kind: string ): void => {
+		pendingChanges.add( `${ path } (${ kind })` );
+		log.debug( 'watch', `${ kind }: ${ path }` );
+		if ( pending ) clearTimeout( pending );
+		pending = setTimeout( () => {
+			void ( async () => {
+				const changes = [ ...pendingChanges ];
+				pendingChanges.clear();
+				const preview = changes.slice( 0, 3 ).join( ', ' );
+				const suffix =
+					changes.length > 3 ? `, +${ changes.length - 3 } more` : '';
+				log.info( 'watch', `restarting (${ preview }${ suffix })` );
+				const t0 = Date.now();
+				try {
+					await ctx.dispose();
+					await rm( outdir, { recursive: true, force: true } );
+					entryPoints = await resolveEntryPoints(
+						options.entryPoints,
+						ignore
+					);
+					ctx = await context(
+						prepareEsbuildOptions(
+							format,
+							entryPoints,
+							options.esbuild
+						)
+					);
+					const result = await ctx.rebuild();
+					if ( assets.length ) await copyAssets( assets, outdir );
+					log.info(
+						'ok',
+						`rebuilt in ${ Date.now() - t0 }ms — ${
+							entryPoints.length
+						} entry point(s)${ summarize( result ) }`
+					);
+				} catch ( error ) {
+					log.error(
+						'watch',
+						`restart failed: ${ errorMessage( error ) }`
+					);
+				}
+			} )();
+		}, RESTART_DEBOUNCE_MS );
+	};
+
+	const watcher = chokidar
+		.watch( watchedPatterns, {
+			ignored: [ ...ignore ],
+			ignoreInitial: true,
+			awaitWriteFinish: { stabilityThreshold: 50, pollInterval: 20 },
+		} )
+		.on( 'add', ( path ) => restart( path, 'added' ) )
+		.on( 'unlink', ( path ) => restart( path, 'deleted' ) )
+		.on( 'change', ( path ) => {
+			void ( async () => {
+				log.debug( 'watch', `changed: ${ path }` );
+				const t0 = Date.now();
+				try {
+					const result = await ctx.rebuild();
+					if ( assets.length && path.endsWith( '.json' ) ) {
+						await copyAssets( assets, outdir );
+					}
+					log.info(
+						'ok',
+						`rebuilt ${ path } in ${
+							Date.now() - t0
+						}ms${ summarize( result ) }`
+					);
+				} catch ( error ) {
+					log.error(
+						'watch',
+						`rebuild ${ path } failed: ${ errorMessage( error ) }`
+					);
+				}
+			} )();
+		} );
+
+	const shutdown = async (): Promise< void > => {
+		log.info( 'watch', 'shutting down' );
+		await watcher.close();
+		await ctx.dispose();
+		process.exit( 0 );
+	};
+	process.once( 'SIGINT', () => void shutdown() );
+	process.once( 'SIGTERM', () => void shutdown() );
+}
+
+export async function runPackageBuilder(
+	options: BuildOptions
+): Promise< void > {
+	const args = parseBuildArgs();
+	setDebugEnabled( args.debug );
+	const merged: BuildOptions = {
+		...options,
+		format: options.format ?? args.format,
+	};
+	if ( args.watch ) {
+		await watchPackage( merged );
+	} else {
+		await buildPackage( merged );
+	}
+}
diff --git a/packages/js/internal-build/src/esbuild/logger.ts b/packages/js/internal-build/src/esbuild/logger.ts
new file mode 100644
index 00000000000..bbe9eaf2b64
--- /dev/null
+++ b/packages/js/internal-build/src/esbuild/logger.ts
@@ -0,0 +1,59 @@
+/* eslint-disable no-console -- This module is the build logger; console output is its purpose. */
+
+const PRETTY =
+	Boolean( process.stdout.isTTY ) &&
+	! process.env.NO_COLOR &&
+	! process.env.CI;
+
+const COLOR = {
+	reset: PRETTY ? '\x1b[0m' : '',
+	dim: PRETTY ? '\x1b[2m' : '',
+	red: PRETTY ? '\x1b[31m' : '',
+	green: PRETTY ? '\x1b[32m' : '',
+	yellow: PRETTY ? '\x1b[33m' : '',
+	blue: PRETTY ? '\x1b[34m' : '',
+	cyan: PRETTY ? '\x1b[36m' : '',
+};
+
+const PREFIXES = {
+	build: { icon: '📦', color: COLOR.cyan },
+	watch: { icon: '👀', color: COLOR.blue },
+	ok: { icon: '✓', color: COLOR.green },
+	warn: { icon: 'âš ', color: COLOR.yellow },
+	error: { icon: '✗', color: COLOR.red },
+	debug: { icon: '·', color: COLOR.dim },
+};
+
+export type LoggerPrefix = keyof typeof PREFIXES;
+
+let debugEnabled = false;
+
+export function setDebugEnabled( enabled: boolean ): void {
+	debugEnabled = enabled;
+}
+
+function format( prefix: LoggerPrefix, message: string ): string {
+	const style = PREFIXES[ prefix ];
+	return PRETTY
+		? `${ style.color }${ style.icon } ${ prefix }${ COLOR.reset }  ${ message }`
+		: `[${ prefix }] ${ message }`;
+}
+
+export const log = {
+	info( prefix: LoggerPrefix, message: string ): void {
+		console.log( format( prefix, message ) );
+	},
+	debug( context: string, message: string ): void {
+		if ( debugEnabled )
+			console.log( format( 'debug', `${ context }: ${ message }` ) );
+	},
+	warn( prefix: LoggerPrefix, message: string ): void {
+		console.warn( format( prefix, message ) );
+	},
+	error( prefix: LoggerPrefix, message: string ): void {
+		console.error( format( prefix, message ) );
+	},
+	dim( message: string ): string {
+		return `${ COLOR.dim }${ message }${ COLOR.reset }`;
+	},
+};
diff --git a/packages/js/internal-build/src/esbuild/options.ts b/packages/js/internal-build/src/esbuild/options.ts
new file mode 100644
index 00000000000..fdba9f8850a
--- /dev/null
+++ b/packages/js/internal-build/src/esbuild/options.ts
@@ -0,0 +1,42 @@
+/**
+ * External dependencies
+ */
+import type { BuildOptions as EsbuildOptions } from 'esbuild';
+
+export interface BuildOptions {
+	entryPoints: string | string[];
+	ignore?: string[];
+	format?: 'esmodules' | 'commonjs';
+	assets?: string[];
+	esbuild?: EsbuildOptions;
+}
+
+export const DEFAULT_IGNORE: readonly string[] = [
+	'**/test/**',
+	'**/stories/**',
+	'**/*.test.{ts,tsx,js,jsx}',
+	'**/*.d.ts',
+];
+
+export function prepareEsbuildOptions(
+	format: 'esmodules' | 'commonjs',
+	entryPoints: string[],
+	overrides: EsbuildOptions = {}
+): EsbuildOptions {
+	return {
+		entryPoints,
+		outdir: format === 'commonjs' ? 'build' : 'build-module',
+		outbase: 'src',
+		bundle: false,
+		format: format === 'commonjs' ? 'cjs' : 'esm',
+		platform: 'neutral',
+		target: 'esnext',
+		loader: { '.js': 'jsx', '.jsx': 'jsx', '.ts': 'ts', '.tsx': 'tsx' },
+		jsx: 'transform',
+		jsxFactory: 'createElement',
+		jsxFragment: 'Fragment',
+		logLevel: 'warning',
+		sourcemap: false,
+		...overrides,
+	};
+}
diff --git a/packages/js/internal-build/src/index.ts b/packages/js/internal-build/src/index.ts
new file mode 100644
index 00000000000..cdf5514f016
--- /dev/null
+++ b/packages/js/internal-build/src/index.ts
@@ -0,0 +1,6 @@
+export {
+	runPackageBuilder,
+	buildPackage,
+	watchPackage,
+} from './esbuild/index.js';
+export type { BuildOptions } from './esbuild/index.js';
diff --git a/packages/js/internal-style-build/index.js b/packages/js/internal-build/src/style-build/index.cjs
similarity index 89%
rename from packages/js/internal-style-build/index.js
rename to packages/js/internal-build/src/style-build/index.cjs
index ab223d4a5bd..aa2ded78499 100644
--- a/packages/js/internal-style-build/index.js
+++ b/packages/js/internal-build/src/style-build/index.cjs
@@ -5,8 +5,8 @@ const MiniCssExtractPlugin = require( 'mini-css-extract-plugin' );
 const path = require( 'path' );
 const RemoveEmptyScriptsPlugin = require( 'webpack-remove-empty-scripts' );
 const postcssPlugins = require( '@wordpress/postcss-plugins-preset' );
-const StyleAssetPlugin = require( './style-asset-plugin' );
-const WebpackRTLPlugin = require( './webpack-rtl-plugin' );
+const StyleAssetPlugin = require( './style-asset-plugin.cjs' );
+const WebpackRTLPlugin = require( './webpack-rtl-plugin.cjs' );

 module.exports = {
 	plugin: MiniCssExtractPlugin,
@@ -40,7 +40,12 @@ module.exports = {
 						options: {
 							sassOptions: {
 								includePaths: [
-									path.resolve( __dirname, 'abstracts' ),
+									path.resolve(
+										__dirname,
+										'..',
+										'..',
+										'styles'
+									),
 								],
 							},
 							webpackImporter: true,
diff --git a/packages/js/internal-style-build/style-asset-plugin.js b/packages/js/internal-build/src/style-build/style-asset-plugin.cjs
similarity index 100%
rename from packages/js/internal-style-build/style-asset-plugin.js
rename to packages/js/internal-build/src/style-build/style-asset-plugin.cjs
diff --git a/packages/js/internal-style-build/webpack-rtl-plugin.js b/packages/js/internal-build/src/style-build/webpack-rtl-plugin.cjs
similarity index 100%
rename from packages/js/internal-style-build/webpack-rtl-plugin.js
rename to packages/js/internal-build/src/style-build/webpack-rtl-plugin.cjs
diff --git a/packages/js/internal-build/src/tsconfig.json b/packages/js/internal-build/src/tsconfig.json
new file mode 100644
index 00000000000..f42028648c1
--- /dev/null
+++ b/packages/js/internal-build/src/tsconfig.json
@@ -0,0 +1,20 @@
+{
+	"compilerOptions": {
+		"target": "es2022",
+		"module": "esnext",
+		"moduleResolution": "bundler",
+		"lib": [ "es2022" ],
+		"strict": true,
+		"esModuleInterop": true,
+		"skipLibCheck": true,
+		"isolatedModules": true,
+		"declaration": true,
+		"declarationMap": true,
+		"declarationDir": "../build-types",
+		"outDir": "../build-module",
+		"rootDir": ".",
+		"resolveJsonModule": true
+	},
+	"include": [ "**/*.ts" ],
+	"exclude": [ "style-build/**" ]
+}
diff --git a/packages/js/internal-style-build/abstracts/_breakpoints.scss b/packages/js/internal-build/styles/_breakpoints.scss
similarity index 100%
rename from packages/js/internal-style-build/abstracts/_breakpoints.scss
rename to packages/js/internal-build/styles/_breakpoints.scss
diff --git a/packages/js/internal-style-build/abstracts/_colors.scss b/packages/js/internal-build/styles/_colors.scss
similarity index 100%
rename from packages/js/internal-style-build/abstracts/_colors.scss
rename to packages/js/internal-build/styles/_colors.scss
diff --git a/packages/js/internal-style-build/abstracts/_mixins.scss b/packages/js/internal-build/styles/_mixins.scss
similarity index 100%
rename from packages/js/internal-style-build/abstracts/_mixins.scss
rename to packages/js/internal-build/styles/_mixins.scss
diff --git a/packages/js/internal-style-build/abstracts/_variables.scss b/packages/js/internal-build/styles/_variables.scss
similarity index 100%
rename from packages/js/internal-style-build/abstracts/_variables.scss
rename to packages/js/internal-build/styles/_variables.scss
diff --git a/packages/js/internal-ts-config/types/@wordpress/block-editor.patch b/packages/js/internal-build/type-overrides/@wordpress/block-editor.patch
similarity index 93%
rename from packages/js/internal-ts-config/types/@wordpress/block-editor.patch
rename to packages/js/internal-build/type-overrides/@wordpress/block-editor.patch
index 8a2b420a90a..68d356b3bbf 100644
--- a/packages/js/internal-ts-config/types/@wordpress/block-editor.patch
+++ b/packages/js/internal-build/type-overrides/@wordpress/block-editor.patch
@@ -1,6 +1,6 @@
-diff -ruN a/types/@wordpress/block-editor/index.d.ts b/types/@wordpress/block-editor/index.d.ts
---- a/types/@wordpress/block-editor/index.d.ts
-+++ b/types/@wordpress/block-editor/index.d.ts
+diff -ruN a/type-overrides/@wordpress/block-editor/index.d.ts b/type-overrides/@wordpress/block-editor/index.d.ts
+--- a/type-overrides/@wordpress/block-editor/index.d.ts
++++ b/type-overrides/@wordpress/block-editor/index.d.ts
 @@ -6,9 +6,26 @@
  /// <reference path="./store/selectors.d.ts" />
  /// <reference path="./utils/index.d.ts" />
diff --git a/packages/js/internal-ts-config/types/@wordpress/core-data.patch b/packages/js/internal-build/type-overrides/@wordpress/core-data.patch
similarity index 95%
rename from packages/js/internal-ts-config/types/@wordpress/core-data.patch
rename to packages/js/internal-build/type-overrides/@wordpress/core-data.patch
index 30252f45fc9..a723b7753e4 100644
--- a/packages/js/internal-ts-config/types/@wordpress/core-data.patch
+++ b/packages/js/internal-build/type-overrides/@wordpress/core-data.patch
@@ -1,6 +1,6 @@
-diff -ruN a/types/@wordpress/core-data/dynamic-entities.d.ts b/types/@wordpress/core-data/dynamic-entities.d.ts
---- a/types/@wordpress/core-data/dynamic-entities.d.ts
-+++ b/types/@wordpress/core-data/dynamic-entities.d.ts
+diff -ruN a/type-overrides/@wordpress/core-data/dynamic-entities.d.ts b/type-overrides/@wordpress/core-data/dynamic-entities.d.ts
+--- a/type-overrides/@wordpress/core-data/dynamic-entities.d.ts
++++ b/type-overrides/@wordpress/core-data/dynamic-entities.d.ts
 @@ -60,10 +60,10 @@
  	};
  	type DeleteRecordsHttpQuery = Record<string, any>;
@@ -14,9 +14,9 @@ diff -ruN a/types/@wordpress/core-data/dynamic-entities.d.ts b/types/@wordpress/
  	};
  	export declare let dynamicActions: SaveActions & DeleteActions;
  	export declare let dynamicSelectors: SingularGetters & PluralGetters;
-diff -ruN a/types/@wordpress/core-data/hooks/use-entity-prop.d.ts b/types/@wordpress/core-data/hooks/use-entity-prop.d.ts
---- a/types/@wordpress/core-data/hooks/use-entity-prop.d.ts
-+++ b/types/@wordpress/core-data/hooks/use-entity-prop.d.ts
+diff -ruN a/type-overrides/@wordpress/core-data/hooks/use-entity-prop.d.ts b/type-overrides/@wordpress/core-data/hooks/use-entity-prop.d.ts
+--- a/type-overrides/@wordpress/core-data/hooks/use-entity-prop.d.ts
++++ b/type-overrides/@wordpress/core-data/hooks/use-entity-prop.d.ts
 @@ -16,5 +16,5 @@
  	 * 							  information like `raw`, `rendered` and
  	 * 							  `protected` props.
@@ -24,9 +24,9 @@ diff -ruN a/types/@wordpress/core-data/hooks/use-entity-prop.d.ts b/types/@wordp
 -	export default function useEntityProp(kind: string, name: string, prop: string, _id?: number | string): [any, Function, any];
 +	export default function useEntityProp<PropType>(kind: string, name: string, prop: string, _id?: number | string): [PropType, (value: PropType) => void, PropType];
  }
-diff -ruN a/types/@wordpress/core-data/index.d.ts b/types/@wordpress/core-data/index.d.ts
---- a/types/@wordpress/core-data/index.d.ts
-+++ b/types/@wordpress/core-data/index.d.ts
+diff -ruN a/type-overrides/@wordpress/core-data/index.d.ts b/type-overrides/@wordpress/core-data/index.d.ts
+--- a/type-overrides/@wordpress/core-data/index.d.ts
++++ b/type-overrides/@wordpress/core-data/index.d.ts
 @@ -80,156 +80,156 @@
  	    }) => Promise<void>;
  	    saveMenu: (data: Partial<import("@wordpress/core-data/build-types/entity-types").NavMenu<"edit">>, options?: {
diff --git a/packages/js/internal-ts-config/types/@wordpress/data.patch b/packages/js/internal-build/type-overrides/@wordpress/data.patch
similarity index 92%
rename from packages/js/internal-ts-config/types/@wordpress/data.patch
rename to packages/js/internal-build/type-overrides/@wordpress/data.patch
index e2b6e30014e..8c71a5ec430 100644
--- a/packages/js/internal-ts-config/types/@wordpress/data.patch
+++ b/packages/js/internal-build/type-overrides/@wordpress/data.patch
@@ -1,6 +1,6 @@
-diff -ruN a/types/@wordpress/data/components/registry-provider/use-registry.d.ts b/types/@wordpress/data/components/registry-provider/use-registry.d.ts
---- a/types/@wordpress/data/components/registry-provider/use-registry.d.ts
-+++ b/types/@wordpress/data/components/registry-provider/use-registry.d.ts
+diff -ruN a/type-overrides/@wordpress/data/components/registry-provider/use-registry.d.ts b/type-overrides/@wordpress/data/components/registry-provider/use-registry.d.ts
+--- a/type-overrides/@wordpress/data/components/registry-provider/use-registry.d.ts
++++ b/type-overrides/@wordpress/data/components/registry-provider/use-registry.d.ts
 @@ -1,4 +1,7 @@
 +/// <reference path="../../registry.d.ts" />
 +
@@ -16,9 +16,9 @@ diff -ruN a/types/@wordpress/data/components/registry-provider/use-registry.d.ts
 -	export default function useRegistry(): Function;
 +	export default function useRegistry(): WPDataRegistry;
  }
-diff -ruN a/types/@wordpress/data/components/use-dispatch/use-dispatch.d.ts b/types/@wordpress/data/components/use-dispatch/use-dispatch.d.ts
---- a/types/@wordpress/data/components/use-dispatch/use-dispatch.d.ts
-+++ b/types/@wordpress/data/components/use-dispatch/use-dispatch.d.ts
+diff -ruN a/type-overrides/@wordpress/data/components/use-dispatch/use-dispatch.d.ts b/type-overrides/@wordpress/data/components/use-dispatch/use-dispatch.d.ts
+--- a/type-overrides/@wordpress/data/components/use-dispatch/use-dispatch.d.ts
++++ b/type-overrides/@wordpress/data/components/use-dispatch/use-dispatch.d.ts
 @@ -1,62 +1,17 @@
  /// <reference path="../../types.d.ts" />
 +/// <reference path="../../registry.d.ts" />
@@ -89,9 +89,9 @@ diff -ruN a/types/@wordpress/data/components/use-dispatch/use-dispatch.d.ts b/ty
 +	declare function useDispatch(storeNameOrDescriptor: StoreNameOrDescriptor): ActionCreatorsOf<StoreDescriptor>;
 +	export default useDispatch;
  }
-diff -ruN a/types/@wordpress/data/components/use-select/index.d.ts b/types/@wordpress/data/components/use-select/index.d.ts
---- a/types/@wordpress/data/components/use-select/index.d.ts
-+++ b/types/@wordpress/data/components/use-select/index.d.ts
+diff -ruN a/type-overrides/@wordpress/data/components/use-select/index.d.ts b/type-overrides/@wordpress/data/components/use-select/index.d.ts
+--- a/type-overrides/@wordpress/data/components/use-select/index.d.ts
++++ b/type-overrides/@wordpress/data/components/use-select/index.d.ts
 @@ -1,93 +1,29 @@
  /// <reference path="../../types.d.ts" />

@@ -197,9 +197,9 @@ diff -ruN a/types/@wordpress/data/components/use-select/index.d.ts b/types/@word
 -	export type UseSelectReturn<T extends MapSelect | StoreDescriptor<any>> = import("@wordpress/data/build-types/types").UseSelectReturn<T>;
 +	export function useSuspenseSelect<T extends MapSelect>(mapSelect: T, deps: unknown[]): ReturnType<T>;
  }
-diff -ruN a/types/@wordpress/data/components/with-dispatch/index.d.ts b/types/@wordpress/data/components/with-dispatch/index.d.ts
---- a/types/@wordpress/data/components/with-dispatch/index.d.ts
-+++ b/types/@wordpress/data/components/with-dispatch/index.d.ts
+diff -ruN a/type-overrides/@wordpress/data/components/with-dispatch/index.d.ts b/type-overrides/@wordpress/data/components/with-dispatch/index.d.ts
+--- a/type-overrides/@wordpress/data/components/with-dispatch/index.d.ts
++++ b/type-overrides/@wordpress/data/components/with-dispatch/index.d.ts
 @@ -1,4 +1,8 @@
 +/// <reference path="../../types.d.ts" />
 +/// <reference path="../../registry.d.ts" />
@@ -216,9 +216,9 @@ diff -ruN a/types/@wordpress/data/components/with-dispatch/index.d.ts b/types/@w
 -	declare function withDispatch(mapDispatchToProps: Function): ComponentType;
 +	declare const withDispatch: (mapDispatchToProps: (dispatch: WPDataRegistry['dispatch'], ownProps: Record<string, unknown>, registry: WPDataRegistry) => Record<string, (...args: unknown[]) => unknown>) => (Inner: ComponentType<any>) => (ownProps: Record<string, unknown>) => import("react").JSX.Element;
  }
-diff -ruN a/types/@wordpress/data/components/with-select/index.d.ts b/types/@wordpress/data/components/with-select/index.d.ts
---- a/types/@wordpress/data/components/with-select/index.d.ts
-+++ b/types/@wordpress/data/components/with-select/index.d.ts
+diff -ruN a/type-overrides/@wordpress/data/components/with-select/index.d.ts b/type-overrides/@wordpress/data/components/with-select/index.d.ts
+--- a/type-overrides/@wordpress/data/components/with-select/index.d.ts
++++ b/type-overrides/@wordpress/data/components/with-select/index.d.ts
 @@ -1,4 +1,8 @@
 +/// <reference path="../../types.d.ts" />
 +/// <reference path="../../registry.d.ts" />
@@ -235,9 +235,9 @@ diff -ruN a/types/@wordpress/data/components/with-select/index.d.ts b/types/@wor
 -	declare function withSelect(mapSelectToProps: Function): ComponentType;
 +	declare const withSelect: (mapSelectToProps: (select: WPDataRegistry['select'], ownProps: Record<string, unknown>, registry: WPDataRegistry) => Record<string, unknown>) => (Inner: ComponentType<any>) => ComponentType<Record<string, unknown>>;
  }
-diff -ruN a/types/@wordpress/data/dispatch.d.ts b/types/@wordpress/data/dispatch.d.ts
---- a/types/@wordpress/data/dispatch.d.ts
-+++ b/types/@wordpress/data/dispatch.d.ts
+diff -ruN a/type-overrides/@wordpress/data/dispatch.d.ts b/type-overrides/@wordpress/data/dispatch.d.ts
+--- a/type-overrides/@wordpress/data/dispatch.d.ts
++++ b/type-overrides/@wordpress/data/dispatch.d.ts
 @@ -4,7 +4,7 @@
  	/**
  	 * Internal dependencies
@@ -266,9 +266,9 @@ diff -ruN a/types/@wordpress/data/dispatch.d.ts b/types/@wordpress/data/dispatch
 +	export declare function dispatch<K extends keyof StoreRegistry>(storeName: K): ActionCreatorsOf<StoreRegistry[K]>;
 +	export declare function dispatch(storeNameOrDescriptor: StoreNameOrDescriptor): ActionCreatorsOf<StoreDescriptor>;
  }
-diff -ruN a/types/@wordpress/data/factory.d.ts b/types/@wordpress/data/factory.d.ts
---- a/types/@wordpress/data/factory.d.ts
-+++ b/types/@wordpress/data/factory.d.ts
+diff -ruN a/type-overrides/@wordpress/data/factory.d.ts b/type-overrides/@wordpress/data/factory.d.ts
+--- a/type-overrides/@wordpress/data/factory.d.ts
++++ b/type-overrides/@wordpress/data/factory.d.ts
 @@ -1,3 +1,4 @@
 +/// <reference path="./types.d.ts" />
  /// <reference path="./select.d.ts" />
@@ -291,9 +291,9 @@ diff -ruN a/types/@wordpress/data/factory.d.ts b/types/@wordpress/data/factory.d
  	    isRegistryControl?: boolean;
  	}): T & {
  	    isRegistryControl?: boolean;
-diff -ruN a/types/@wordpress/data/index.d.ts b/types/@wordpress/data/index.d.ts
---- a/types/@wordpress/data/index.d.ts
-+++ b/types/@wordpress/data/index.d.ts
+diff -ruN a/type-overrides/@wordpress/data/index.d.ts b/type-overrides/@wordpress/data/index.d.ts
+--- a/type-overrides/@wordpress/data/index.d.ts
++++ b/type-overrides/@wordpress/data/index.d.ts
 @@ -16,6 +16,15 @@
  /// <reference path="./types.d.ts" />

@@ -355,9 +355,9 @@ diff -ruN a/types/@wordpress/data/index.d.ts b/types/@wordpress/data/index.d.ts
 +	export type StoreDescriptor = import("@wordpress/data/build-types/types").StoreDescriptor<any>;
 +	export { StoreRegistry } from "@wordpress/data/build-types/types";
  }
-diff -ruN a/types/@wordpress/data/registry.d.ts b/types/@wordpress/data/registry.d.ts
---- a/types/@wordpress/data/registry.d.ts
-+++ b/types/@wordpress/data/registry.d.ts
+diff -ruN a/type-overrides/@wordpress/data/registry.d.ts b/type-overrides/@wordpress/data/registry.d.ts
+--- a/type-overrides/@wordpress/data/registry.d.ts
++++ b/type-overrides/@wordpress/data/registry.d.ts
 @@ -1,59 +1,62 @@
  /// <reference path="./types.d.ts" />

@@ -461,9 +461,9 @@ diff -ruN a/types/@wordpress/data/registry.d.ts b/types/@wordpress/data/registry
 +	    options?: Record<string, unknown>
 +	) => Partial<WPDataRegistry>;
  }
-diff -ruN a/types/@wordpress/data/select.d.ts b/types/@wordpress/data/select.d.ts
---- a/types/@wordpress/data/select.d.ts
-+++ b/types/@wordpress/data/select.d.ts
+diff -ruN a/type-overrides/@wordpress/data/select.d.ts b/type-overrides/@wordpress/data/select.d.ts
+--- a/type-overrides/@wordpress/data/select.d.ts
++++ b/type-overrides/@wordpress/data/select.d.ts
 @@ -4,16 +4,12 @@
  	/**
  	 * Internal dependencies
@@ -491,9 +491,9 @@ diff -ruN a/types/@wordpress/data/select.d.ts b/types/@wordpress/data/select.d.t
 +	export declare function select<K extends keyof StoreRegistry>(storeName: K): CurriedSelectorsOf<StoreRegistry[K]>;
 +	export declare function select(storeNameOrDescriptor: StoreNameOrDescriptor): CurriedSelectorsOf<StoreDescriptor>;
  }
-diff -ruN a/types/@wordpress/data/types.d.ts b/types/@wordpress/data/types.d.ts
---- a/types/@wordpress/data/types.d.ts
-+++ b/types/@wordpress/data/types.d.ts
+diff -ruN a/type-overrides/@wordpress/data/types.d.ts b/type-overrides/@wordpress/data/types.d.ts
+--- a/type-overrides/@wordpress/data/types.d.ts
++++ b/type-overrides/@wordpress/data/types.d.ts
 @@ -15,7 +15,7 @@
  	    getActions: () => ActionCreatorsOf<Config>;
  	    subscribe: (listener: () => void) => () => void;
diff --git a/packages/js/internal-ts-config/types/@wordpress/editor.patch b/packages/js/internal-build/type-overrides/@wordpress/editor.patch
similarity index 60%
rename from packages/js/internal-ts-config/types/@wordpress/editor.patch
rename to packages/js/internal-build/type-overrides/@wordpress/editor.patch
index 8c79b73f212..af3f8e1cf1d 100644
--- a/packages/js/internal-ts-config/types/@wordpress/editor.patch
+++ b/packages/js/internal-build/type-overrides/@wordpress/editor.patch
@@ -1,6 +1,6 @@
-diff -ruN a/types/@wordpress/editor/index.d.ts b/types/@wordpress/editor/index.d.ts
---- a/types/@wordpress/editor/index.d.ts
-+++ b/types/@wordpress/editor/index.d.ts
+diff -ruN a/type-overrides/@wordpress/editor/index.d.ts b/type-overrides/@wordpress/editor/index.d.ts
+--- a/type-overrides/@wordpress/editor/index.d.ts
++++ b/type-overrides/@wordpress/editor/index.d.ts
 @@ -11,3 +11,9 @@
  	export * from "@wordpress/editor/build-types/dataviews/api";
  	export { storeConfig, store } from "@wordpress/editor/build-types/store";
diff --git a/packages/js/internal-ts-config/types/@wordpress/notices.patch b/packages/js/internal-build/type-overrides/@wordpress/notices.patch
similarity index 57%
rename from packages/js/internal-ts-config/types/@wordpress/notices.patch
rename to packages/js/internal-build/type-overrides/@wordpress/notices.patch
index d8d3ef0e5e7..ca24ea18975 100644
--- a/packages/js/internal-ts-config/types/@wordpress/notices.patch
+++ b/packages/js/internal-build/type-overrides/@wordpress/notices.patch
@@ -1,6 +1,6 @@
-diff -ruN a/types/@wordpress/notices/index.d.ts b/types/@wordpress/notices/index.d.ts
---- a/types/@wordpress/notices/index.d.ts
-+++ b/types/@wordpress/notices/index.d.ts
+diff -ruN a/type-overrides/@wordpress/notices/index.d.ts b/type-overrides/@wordpress/notices/index.d.ts
+--- a/type-overrides/@wordpress/notices/index.d.ts
++++ b/type-overrides/@wordpress/notices/index.d.ts
 @@ -3,3 +3,9 @@
  declare module '@wordpress/notices' {
  	export { store } from "@wordpress/notices/build-types/store";
diff --git a/packages/js/internal-js-tests/build.mjs b/packages/js/internal-js-tests/build.mjs
index 302b9874aaf..32ab366d2e0 100644
--- a/packages/js/internal-js-tests/build.mjs
+++ b/packages/js/internal-js-tests/build.mjs
@@ -1,114 +1,6 @@
-import { build, context } from 'esbuild';
-import { glob } from 'glob';
-import { rm } from 'node:fs/promises';
-import chokidar from 'chokidar';
+import { runPackageBuilder } from '@woocommerce/internal-build';

-const watch = process.argv.includes( '--watch' );
-const format = process.argv.includes( '--cjs' ) ? 'cjs' : 'esm';
-const outdir = format === 'cjs' ? 'build' : 'build-module';
-
-const ENTRY_GLOB = 'src/**/*.{ts,tsx,js,jsx}';
-const ENTRY_IGNORE = [
-	'**/test/**',
-	'**/stories/**',
-	'**/*.test.{ts,tsx,js,jsx}',
-	'**/*.d.ts',
-	'src/setup-*.js',
-	'src/mocks/**',
-];
-
-async function resolveEntryPoints() {
-	return glob( ENTRY_GLOB, { ignore: ENTRY_IGNORE } );
-}
-
-function makeOptions( entryPoints ) {
-	return {
-		entryPoints,
-		outdir,
-		outbase: 'src',
-		bundle: false,
-		format,
-		platform: 'neutral',
-		target: 'esnext',
-		loader: { '.js': 'jsx', '.jsx': 'jsx', '.ts': 'ts', '.tsx': 'tsx' },
-		jsx: 'transform',
-		jsxFactory: 'createElement',
-		jsxFragment: 'Fragment',
-		logLevel: 'warning',
-		sourcemap: false,
-	};
-}
-
-function summarize( result ) {
-	const errors = result.errors.length;
-	const warnings = result.warnings.length;
-	const parts = [];
-	if ( errors ) parts.push( `${ errors } error(s)` );
-	if ( warnings ) parts.push( `${ warnings } warning(s)` );
-	return parts.length ? ` — ${ parts.join( ', ' ) }` : '';
-}
-
-// Wrap a watch-mode step so a single failure (disk error, build crash, etc.)
-// doesn't take the watcher process down. Errors are surfaced; the loop survives.
-async function safe( label, fn ) {
-	try {
-		return await fn();
-	} catch ( error ) {
-		console.error( `[watch] ${ label } failed:`, error?.message ?? error );
-		return null;
-	}
-}
-
-await rm( outdir, { recursive: true, force: true } );
-
-if ( watch ) {
-	const startupT0 = Date.now();
-	let entryPoints = await resolveEntryPoints();
-	let ctx = await context( makeOptions( entryPoints ) );
-	const initial = await safe( 'startup build', () => ctx.rebuild() );
-	console.log( `[watch] ready in ${ Date.now() - startupT0 }ms — ${ entryPoints.length } entry point(s)${ initial ? summarize( initial ) : '' }` );
-
-	// esbuild's own watcher polls the filesystem, which can miss or delay
-	// changes (especially edits to files added after context creation).
-	// chokidar uses OS-level events (fsevents/inotify) and drives rebuilds
-	// directly: changes call ctx.rebuild() (preserves the AST cache),
-	// add/unlink trigger a debounced context restart (entry list changed).
-	let pending;
-	const pendingChanges = new Set();
-	const restart = ( path, kind ) => {
-		pendingChanges.add( `${ path } (${ kind })` );
-		clearTimeout( pending );
-		pending = setTimeout( () => safe( 'restart', async () => {
-			const changes = [ ...pendingChanges ];
-			pendingChanges.clear();
-			const preview = changes.slice( 0, 3 ).join( ', ' );
-			const suffix = changes.length > 3 ? `, +${ changes.length - 3 } more` : '';
-			console.log( `[watch] restarting (${ preview }${ suffix })` );
-			const t0 = Date.now();
-			await ctx.dispose();
-			await rm( outdir, { recursive: true, force: true } );
-			entryPoints = await resolveEntryPoints();
-			ctx = await context( makeOptions( entryPoints ) );
-			const result = await ctx.rebuild();
-			console.log( `[watch] rebuilt in ${ Date.now() - t0 }ms — ${ entryPoints.length } entry point(s)${ summarize( result ) }` );
-		} ), 200 );
-	};
-
-	chokidar
-		.watch( ENTRY_GLOB, { ignored: ENTRY_IGNORE, ignoreInitial: true } )
-		.on( 'add', ( path ) => restart( path, 'added' ) )
-		.on( 'unlink', ( path ) => restart( path, 'deleted' ) )
-		.on( 'change', async ( path ) => {
-			const t0 = Date.now();
-			const result = await safe( `rebuild ${ path }`, () => ctx.rebuild() );
-			if ( result ) {
-				console.log( `[watch] rebuilt ${ path } in ${ Date.now() - t0 }ms${ summarize( result ) }` );
-			}
-		} );
-} else {
-	const entryPoints = await resolveEntryPoints();
-	const t0 = Date.now();
-	console.log( `[build] ${ entryPoints.length } entry point(s)...` );
-	const result = await build( makeOptions( entryPoints ) );
-	console.log( `[build] done in ${ Date.now() - t0 }ms${ summarize( result ) }` );
-}
+await runPackageBuilder( {
+	entryPoints: 'src/**/*.{ts,tsx,js,jsx}',
+	ignore: [ 'src/setup-*.js', 'src/mocks/**' ],
+} );
diff --git a/packages/js/internal-js-tests/jest-preset.js b/packages/js/internal-js-tests/jest-preset.js
index 7b888d6d260..3d6145d1f5e 100644
--- a/packages/js/internal-js-tests/jest-preset.js
+++ b/packages/js/internal-js-tests/jest-preset.js
@@ -31,6 +31,7 @@ const transformModules = {
  */
 const mapWpModules = [
 	'@wordpress/private-apis',
+	'@wordpress/data',
 	'@wordpress/core-data',
 	'@wordpress/components',
 	'@wordpress/html-entities',
@@ -127,16 +128,12 @@ module.exports = {
 			'(?:src|client|assets/js)/.*\\.[jt]sx?$': [
 				'ts-jest',
 				{
-					// A dedicated test tsconfig sidesteps per-package
-					// include/exclude/rootDir restrictions that block
-					// ts-jest from compiling cross-package source files
-					// (resolved via the @woocommerce/* moduleNameMapper).
-					// The compiler emits CJS so Jest's runtime can execute
-					// it; package builds keep their own tsconfigs for
-					// publishing.
-					tsconfig: require.resolve(
-						'@woocommerce/internal-ts-config/tsconfig-jest.json'
-					),
+					// Dedicated jest tsconfig flips jsx to the automatic
+					// runtime and emits CJS for jest's runtime. Sidesteps
+					// per-package include/exclude/rootDir restrictions that
+					// block ts-jest from compiling cross-package source
+					// files (resolved via the @woocommerce/* moduleNameMapper).
+					tsconfig: path.resolve( __dirname, 'tsconfig-jest.json' ),
 					diagnostics: false,
 				},
 			],
diff --git a/packages/js/internal-js-tests/package.json b/packages/js/internal-js-tests/package.json
index e7d75f9c127..1839e06e4f4 100644
--- a/packages/js/internal-js-tests/package.json
+++ b/packages/js/internal-js-tests/package.json
@@ -17,19 +17,29 @@
 		"url": "https://github.com/woocommerce/woocommerce/issues"
 	},
 	"private": true,
+	"exports": {
+		".": {
+			"wc-source": "./src/util/index.js",
+			"types": "./build-types/util/index.d.ts",
+			"import": "./build-module/util/index.js",
+			"require": "./build/util/index.js"
+		}
+	},
 	"main": "build/util/index.js",
 	"module": "build-module/util/index.js",
+	"types": "build-types/util/index.d.ts",
 	"files": [
 		"build",
 		"build-module",
+		"build-types",
 		"jest-preset.js"
 	],
 	"scripts": {
 		"build": "pnpm --if-present --workspace-concurrency=Infinity --stream --filter=\"$npm_package_name...\" '/^build:project:.*$/'",
-		"build:project": "pnpm --if-present '/^build:project:.*$/'",
+		"build:project": "pnpm --stream --if-present '/^build:project:.*$/'",
 		"build:project:esm": "node build.mjs",
 		"build:publish:project": "pnpm --if-present '/^build:publish:project:.*$/'",
-		"build:publish:project:cjs": "node build.mjs --cjs",
+		"build:publish:project:cjs": "node build.mjs --commonjs",
 		"build:publish:project:types": "tsc --build --emitDeclarationOnly",
 		"build:publish:project:deps": "pnpm build",
 		"changelog": "XDEBUG_MODE=off composer install --quiet && composer exec -- changelogger",
@@ -54,12 +64,9 @@
 	"devDependencies": {
 		"@babel/core": "7.25.7",
 		"@woocommerce/eslint-plugin": "workspace:*",
-		"@woocommerce/internal-ts-config": "workspace:*",
+		"@woocommerce/internal-build": "workspace:*",
 		"babel-jest": "29.5.x",
-		"chokidar": "3.6.x",
-		"esbuild": "0.24.x",
 		"eslint": "^8.55.0",
-		"glob": "^10.3.10",
 		"jest": "29.5.x",
 		"jest-cli": "29.5.x",
 		"jest-environment-jsdom": "29.5.x",
@@ -74,6 +81,15 @@
 		"react": "18.3.x",
 		"react-dom": "18.3.x"
 	},
+	"publishConfig": {
+		"exports": {
+			".": {
+				"types": "./build-types/util/index.d.ts",
+				"import": "./build-module/util/index.js",
+				"require": "./build/util/index.js"
+			}
+		}
+	},
 	"lint-staged": {
 		"*.(t|j)s?(x)": [
 			"pnpm lint:fix"
diff --git a/packages/js/internal-js-tests/tsconfig-cjs.json b/packages/js/internal-js-tests/tsconfig-cjs.json
deleted file mode 100644
index 5a4f74e214d..00000000000
--- a/packages/js/internal-js-tests/tsconfig-cjs.json
+++ /dev/null
@@ -1,18 +0,0 @@
-{
-	"extends": "@woocommerce/internal-ts-config/tsconfig-cjs.json",
-	"compilerOptions": {
-		"rootDir": "src",
-		"outDir": "build",
-		"typeRoots": [
-			"./typings",
-			"./node_modules/@types"
-		]
-	},
-	"include": [
-		"typings/**/*",
-		"src/**/*"
-	],
-	"exclude": [
-		"**/test/**"
-	]
-}
diff --git a/packages/js/internal-js-tests/tsconfig-jest.json b/packages/js/internal-js-tests/tsconfig-jest.json
new file mode 100644
index 00000000000..c0de0f592a5
--- /dev/null
+++ b/packages/js/internal-js-tests/tsconfig-jest.json
@@ -0,0 +1,10 @@
+{
+	"extends": "@woocommerce/internal-build/configs/tsconfig.json",
+	"compilerOptions": {
+		"module": "commonjs",
+		"declaration": false,
+		"declarationMap": false,
+		"declarationDir": null,
+		"jsx": "react-jsx"
+	}
+}
diff --git a/packages/js/internal-js-tests/tsconfig.json b/packages/js/internal-js-tests/tsconfig.json
index 2cb6f5a848f..be24cae4c13 100644
--- a/packages/js/internal-js-tests/tsconfig.json
+++ b/packages/js/internal-js-tests/tsconfig.json
@@ -1,5 +1,5 @@
 {
-	"extends": "@woocommerce/internal-ts-config/tsconfig.json",
+	"extends": "@woocommerce/internal-build/configs/tsconfig.json",
 	"compilerOptions": {
 		"rootDir": "src",
 		"outDir": "build-module",
diff --git a/packages/js/internal-js-tests/typings/monorepo-enhancements.d.ts b/packages/js/internal-js-tests/typings/monorepo-enhancements.d.ts
index dc453ab911e..8d3d6bdc1e4 100644
--- a/packages/js/internal-js-tests/typings/monorepo-enhancements.d.ts
+++ b/packages/js/internal-js-tests/typings/monorepo-enhancements.d.ts
@@ -1 +1 @@
-import '@woocommerce/internal-ts-config/types/@wordpress/data';
+import '@woocommerce/internal-build/type-overrides/@wordpress/data';
diff --git a/packages/js/internal-style-build/.npmrc b/packages/js/internal-style-build/.npmrc
deleted file mode 100644
index 43c97e719a5..00000000000
--- a/packages/js/internal-style-build/.npmrc
+++ /dev/null
@@ -1 +0,0 @@
-package-lock=false
diff --git a/packages/js/internal-style-build/README.md b/packages/js/internal-style-build/README.md
deleted file mode 100644
index c347847a5c5..00000000000
--- a/packages/js/internal-style-build/README.md
+++ /dev/null
@@ -1,30 +0,0 @@
-# Style Build Helper
-
-This is a partial [Webpack](https://webpack.js.org/) config for building WooCommerce component styles using base styles from Gutenberg. It is used to replace the [`bin/packages/build.js`](https://github.com/woocommerce/woocommerce-admin/blob/6859249/bin/packages/build.js) script.
-
-
-## Usage
-
-Create a `webpack.config.js` in your package root that defines the `entry` and `output`, making use of the `rules` and `plugins` from `@woocommerce/internal-style-build`.
-
-***Note:*** The `entry` should be named `'build-style'` so the CSS will get picked up by the main `client/` application's `CopyWebpackPlugin` config.
-
-```js
-// packages/<package-name>/webpack.config.js
-
-import { webpackConfig } from '@woocommerce/internal-style-build';
-
-module.exports = {
-	mode: process.env.NODE_ENV || 'development',
-	entry: {
-		'build-style': __dirname + '/src/style.scss',
-	},
-	output: {
-		path: __dirname,
-	},
-	module: {
-		rules: webpackConfig.rules,
-	},
-	plugins: webpackConfig.plugins,
-};
-```
diff --git a/packages/js/internal-style-build/changelog/.gitkeep b/packages/js/internal-style-build/changelog/.gitkeep
deleted file mode 100644
index e69de29bb2d..00000000000
diff --git a/packages/js/internal-style-build/changelog/64838-dev-esbuild-package-builds b/packages/js/internal-style-build/changelog/64838-dev-esbuild-package-builds
deleted file mode 100644
index 8c5062a7c61..00000000000
--- a/packages/js/internal-style-build/changelog/64838-dev-esbuild-package-builds
+++ /dev/null
@@ -1,4 +0,0 @@
-Significance: patch
-Type: dev
-
-Removed stray wireit devDependency.
diff --git a/packages/js/internal-style-build/changelog/add-js-packages-changelogger b/packages/js/internal-style-build/changelog/add-js-packages-changelogger
deleted file mode 100644
index 34c7e271ae2..00000000000
--- a/packages/js/internal-style-build/changelog/add-js-packages-changelogger
+++ /dev/null
@@ -1,4 +0,0 @@
-Significance: minor
-Type: dev
-
-Add Jetpack Changelogger
diff --git a/packages/js/internal-style-build/changelog/add-require-turbo b/packages/js/internal-style-build/changelog/add-require-turbo
deleted file mode 100644
index 083b604a06d..00000000000
--- a/packages/js/internal-style-build/changelog/add-require-turbo
+++ /dev/null
@@ -1,5 +0,0 @@
-Significance: patch
-Type: dev
-Comment: This PR updates repository tooling and doesn't require a changelog entry.
-
-
diff --git a/packages/js/internal-style-build/changelog/bump-a8c-color-studio-version b/packages/js/internal-style-build/changelog/bump-a8c-color-studio-version
deleted file mode 100644
index b381b3b550a..00000000000
--- a/packages/js/internal-style-build/changelog/bump-a8c-color-studio-version
+++ /dev/null
@@ -1,5 +0,0 @@
-Significance: patch
-Type: dev
-Comment: Update the A8c color studio package to version 4.0.0 to use the latest Woo branding.
-
-
diff --git a/packages/js/internal-style-build/changelog/enhancement-35565 b/packages/js/internal-style-build/changelog/enhancement-35565
deleted file mode 100644
index c69b2129169..00000000000
--- a/packages/js/internal-style-build/changelog/enhancement-35565
+++ /dev/null
@@ -1,4 +0,0 @@
-Significance: patch
-Type: enhancement
-
-Add updated versions of screen-reader-only and not-screen-reader-only mixins
diff --git a/packages/js/internal-style-build/changelog/enhancement-46501 b/packages/js/internal-style-build/changelog/enhancement-46501
deleted file mode 100644
index 8ad44e6ac3d..00000000000
--- a/packages/js/internal-style-build/changelog/enhancement-46501
+++ /dev/null
@@ -1,4 +0,0 @@
-Significance: minor
-Type: performance
-
-Remove duplicate css code from any woo scss file
diff --git a/packages/js/internal-style-build/changelog/fix-standardize-lint-monorepo b/packages/js/internal-style-build/changelog/fix-standardize-lint-monorepo
deleted file mode 100644
index 684cc6c8fd3..00000000000
--- a/packages/js/internal-style-build/changelog/fix-standardize-lint-monorepo
+++ /dev/null
@@ -1,4 +0,0 @@
-Significance: patch
-Type: dev
-
-Standardize lint scripts: add lint:fix
diff --git a/packages/js/internal-style-build/changelog/sprinkle-adminbar-height-from-base-styles b/packages/js/internal-style-build/changelog/sprinkle-adminbar-height-from-base-styles
deleted file mode 100644
index 4008260ff21..00000000000
--- a/packages/js/internal-style-build/changelog/sprinkle-adminbar-height-from-base-styles
+++ /dev/null
@@ -1,4 +0,0 @@
-Significance: patch
-Type: tweak
-
-Alias the four WordPress-defaults SCSS variables ($adminbar-height, $adminbar-height-mobile, $admin-menu-width, $admin-menu-width-collapsed) to their @wordpress/base-styles equivalents instead of hardcoding raw px values, so they track Core automatically.
diff --git a/packages/js/internal-style-build/changelog/sprinkle-header-tokens-alignment b/packages/js/internal-style-build/changelog/sprinkle-header-tokens-alignment
deleted file mode 100644
index b64d30fa88a..00000000000
--- a/packages/js/internal-style-build/changelog/sprinkle-header-tokens-alignment
+++ /dev/null
@@ -1,4 +0,0 @@
-Significance: patch
-Type: tweak
-
-Rewrite `$header-scroll-shadow` to a 4-layer subtle drop matching Gutenberg's `--wpds-elevation-xs` aesthetic, replacing the previous single heavy rgba shadow.
diff --git a/packages/js/internal-style-build/changelog/update-wp-68-packages b/packages/js/internal-style-build/changelog/update-wp-68-packages
deleted file mode 100644
index 866d7f6ed70..00000000000
--- a/packages/js/internal-style-build/changelog/update-wp-68-packages
+++ /dev/null
@@ -1,4 +0,0 @@
-Significance: major
-Type: update
-
-Update @wordpress/* dependencies to wp-6.8 minimum.
diff --git a/packages/js/internal-style-build/package.json b/packages/js/internal-style-build/package.json
deleted file mode 100644
index 998fa29bbd0..00000000000
--- a/packages/js/internal-style-build/package.json
+++ /dev/null
@@ -1,73 +0,0 @@
-{
-	"name": "@woocommerce/internal-style-build",
-	"version": "1.0.0",
-	"description": "WooCommerce Components SASS Build",
-	"author": "Automattic",
-	"license": "GPL-2.0-or-later",
-	"engines": {
-		"node": "^24.15.0"
-	},
-	"keywords": [
-		"wordpress",
-		"woocommerce"
-	],
-	"homepage": "https://github.com/woocommerce/woocommerce/tree/trunk/packages/js/internal-style-build/README.md",
-	"repository": {
-		"type": "git",
-		"url": "https://github.com/woocommerce/woocommerce.git"
-	},
-	"bugs": {
-		"url": "https://github.com/woocommerce/woocommerce/issues"
-	},
-	"main": "index.js",
-	"files": [
-		"index.js",
-		"webpack-rtl-plugin.js",
-		"style-asset-plugin.js",
-		"abstracts"
-	],
-	"scripts": {
-		"lint": "pnpm --if-present '/^lint:lang:.*$/'",
-		"lint:fix": "pnpm --if-present '/^lint:fix:lang:.*$/'",
-		"lint:fix:lang:js": "eslint index.js --fix",
-		"lint:lang:js": "eslint index.js"
-	},
-	"lint-staged": {
-		"*.(t|j)s?(x)": [
-			"pnpm lint:fix"
-		]
-	},
-	"dependencies": {
-		"@automattic/color-studio": "^4.0.0",
-		"@wordpress/base-styles": "catalog:wp-min",
-		"@wordpress/postcss-plugins-preset": "next",
-		"css-loader": "6.11.x",
-		"fork-ts-checker-webpack-plugin": "9.0.x",
-		"json2php": "^0.0.7",
-		"mini-css-extract-plugin": "2.9.x",
-		"postcss-loader": "4.3.x",
-		"rtlcss": "4.3.x",
-		"sass-loader": "10.5.x",
-		"webpack-remove-empty-scripts": "1.0.x"
-	},
-	"private": true,
-	"devDependencies": {
-		"@babel/core": "7.25.7",
-		"@woocommerce/eslint-plugin": "workspace:*",
-		"eslint": "^8.55.0",
-		"jest": "29.5.x",
-		"jest-cli": "29.5.x",
-		"rimraf": "5.0.5",
-		"ts-jest": "29.1.x",
-		"typescript": "5.7.x",
-		"webpack": "5.97.x"
-	},
-	"config": {
-		"ci": {
-			"lint": {
-				"command": "lint",
-				"changes": "index.js"
-			}
-		}
-	}
-}
diff --git a/packages/js/internal-ts-config/.gitignore b/packages/js/internal-ts-config/.gitignore
deleted file mode 100644
index 9f34ba92cf6..00000000000
--- a/packages/js/internal-ts-config/.gitignore
+++ /dev/null
@@ -1,6 +0,0 @@
-# Auto-generated by scripts/generate-types.mjs — only the .patch file is committed.
-types/@wordpress/block-editor/
-types/@wordpress/core-data/
-types/@wordpress/data/
-types/@wordpress/editor/
-types/@wordpress/notices/
diff --git a/packages/js/internal-ts-config/changelog/64838-dev-esbuild-package-builds b/packages/js/internal-ts-config/changelog/64838-dev-esbuild-package-builds
deleted file mode 100644
index ce3980e55d8..00000000000
--- a/packages/js/internal-ts-config/changelog/64838-dev-esbuild-package-builds
+++ /dev/null
@@ -1,4 +0,0 @@
-Significance: patch
-Type: dev
-
-Inlined the wireit-wrapped types generator command into the build script.
diff --git a/packages/js/internal-ts-config/changelog/dev-64837-type-check-only-on-lint b/packages/js/internal-ts-config/changelog/dev-64837-type-check-only-on-lint
deleted file mode 100644
index 8185199ba80..00000000000
--- a/packages/js/internal-ts-config/changelog/dev-64837-type-check-only-on-lint
+++ /dev/null
@@ -1,4 +0,0 @@
-Significance: patch
-Type: dev
-
-Add postinstall hook so that generated `@wordpress/*` type declarations exist immediately after a fresh install.
diff --git a/packages/js/internal-ts-config/package.json b/packages/js/internal-ts-config/package.json
deleted file mode 100644
index 1f1d7bbe673..00000000000
--- a/packages/js/internal-ts-config/package.json
+++ /dev/null
@@ -1,32 +0,0 @@
-{
-	"name": "@woocommerce/internal-ts-config",
-	"version": "1.0.0",
-	"description": "Shared TypeScript configuration and typings for the WooCommerce monorepo.",
-	"author": "Automattic",
-	"license": "GPL-2.0-or-later",
-	"engines": {
-		"node": "^24.15.0"
-	},
-	"private": true,
-	"files": [
-		"tsconfig.json",
-		"tsconfig-cjs.json",
-		"tsconfig-jest.json",
-		"types"
-	],
-	"scripts": {
-		"build": "pnpm --if-present --workspace-concurrency=Infinity --stream --filter=\"$npm_package_name...\" '/^build:project:.*$/'",
-		"build:project": "pnpm --if-present '/^build:project:.*$/'",
-		"build:project:types": "node scripts/generate-types.mjs generate",
-		"postinstall": "pnpm build:project:types",
-		"types:update-patch": "node scripts/generate-types.mjs update-patch"
-	},
-	"devDependencies": {
-		"@types/wordpress__block-editor": "14.21.8",
-		"@wordpress/core-data": "7.19.6",
-		"@wordpress/data": "10.19.2",
-		"@wordpress/editor": "14.19.7",
-		"@wordpress/notices": "5.19.2",
-		"typescript": "5.7.x"
-	}
-}
diff --git a/packages/js/internal-ts-config/tsconfig-cjs.json b/packages/js/internal-ts-config/tsconfig-cjs.json
deleted file mode 100644
index 77e611d145a..00000000000
--- a/packages/js/internal-ts-config/tsconfig-cjs.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
-	"extends": "./tsconfig.json",
-	"compilerOptions": {
-		"module": "commonjs",
-		"declaration": false,
-		"declarationMap": false,
-		"declarationDir": null
-	}
-}
diff --git a/packages/js/internal-ts-config/tsconfig-jest.json b/packages/js/internal-ts-config/tsconfig-jest.json
deleted file mode 100644
index c1764ea37f7..00000000000
--- a/packages/js/internal-ts-config/tsconfig-jest.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
-	"extends": "./tsconfig-cjs.json",
-	"compilerOptions": {
-		"jsx": "react-jsx"
-	}
-}
diff --git a/packages/js/navigation/build.mjs b/packages/js/navigation/build.mjs
index 746bc61fc4b..2d76d01222e 100644
--- a/packages/js/navigation/build.mjs
+++ b/packages/js/navigation/build.mjs
@@ -1,112 +1,3 @@
-import { build, context } from 'esbuild';
-import { glob } from 'glob';
-import { rm } from 'node:fs/promises';
-import chokidar from 'chokidar';
+import { runPackageBuilder } from '@woocommerce/internal-build';

-const watch = process.argv.includes( '--watch' );
-const format = process.argv.includes( '--cjs' ) ? 'cjs' : 'esm';
-const outdir = format === 'cjs' ? 'build' : 'build-module';
-
-const ENTRY_GLOB = 'src/**/*.{ts,tsx,js,jsx}';
-const ENTRY_IGNORE = [
-	'**/test/**',
-	'**/stories/**',
-	'**/*.test.{ts,tsx,js,jsx}',
-	'**/*.d.ts',
-];
-
-async function resolveEntryPoints() {
-	return glob( ENTRY_GLOB, { ignore: ENTRY_IGNORE } );
-}
-
-function makeOptions( entryPoints ) {
-	return {
-		entryPoints,
-		outdir,
-		outbase: 'src',
-		bundle: false,
-		format,
-		platform: 'neutral',
-		target: 'esnext',
-		loader: { '.js': 'jsx', '.jsx': 'jsx', '.ts': 'ts', '.tsx': 'tsx' },
-		jsx: 'transform',
-		jsxFactory: 'createElement',
-		jsxFragment: 'Fragment',
-		logLevel: 'warning',
-		sourcemap: false,
-	};
-}
-
-function summarize( result ) {
-	const errors = result.errors.length;
-	const warnings = result.warnings.length;
-	const parts = [];
-	if ( errors ) parts.push( `${ errors } error(s)` );
-	if ( warnings ) parts.push( `${ warnings } warning(s)` );
-	return parts.length ? ` — ${ parts.join( ', ' ) }` : '';
-}
-
-// Wrap a watch-mode step so a single failure (disk error, build crash, etc.)
-// doesn't take the watcher process down. Errors are surfaced; the loop survives.
-async function safe( label, fn ) {
-	try {
-		return await fn();
-	} catch ( error ) {
-		console.error( `[watch] ${ label } failed:`, error?.message ?? error );
-		return null;
-	}
-}
-
-await rm( outdir, { recursive: true, force: true } );
-
-if ( watch ) {
-	const startupT0 = Date.now();
-	let entryPoints = await resolveEntryPoints();
-	let ctx = await context( makeOptions( entryPoints ) );
-	const initial = await safe( 'startup build', () => ctx.rebuild() );
-	console.log( `[watch] ready in ${ Date.now() - startupT0 }ms — ${ entryPoints.length } entry point(s)${ initial ? summarize( initial ) : '' }` );
-
-	// esbuild's own watcher polls the filesystem, which can miss or delay
-	// changes (especially edits to files added after context creation).
-	// chokidar uses OS-level events (fsevents/inotify) and drives rebuilds
-	// directly: changes call ctx.rebuild() (preserves the AST cache),
-	// add/unlink trigger a debounced context restart (entry list changed).
-	let pending;
-	const pendingChanges = new Set();
-	const restart = ( path, kind ) => {
-		pendingChanges.add( `${ path } (${ kind })` );
-		clearTimeout( pending );
-		pending = setTimeout( () => safe( 'restart', async () => {
-			const changes = [ ...pendingChanges ];
-			pendingChanges.clear();
-			const preview = changes.slice( 0, 3 ).join( ', ' );
-			const suffix = changes.length > 3 ? `, +${ changes.length - 3 } more` : '';
-			console.log( `[watch] restarting (${ preview }${ suffix })` );
-			const t0 = Date.now();
-			await ctx.dispose();
-			await rm( outdir, { recursive: true, force: true } );
-			entryPoints = await resolveEntryPoints();
-			ctx = await context( makeOptions( entryPoints ) );
-			const result = await ctx.rebuild();
-			console.log( `[watch] rebuilt in ${ Date.now() - t0 }ms — ${ entryPoints.length } entry point(s)${ summarize( result ) }` );
-		} ), 200 );
-	};
-
-	chokidar
-		.watch( ENTRY_GLOB, { ignored: ENTRY_IGNORE, ignoreInitial: true } )
-		.on( 'add', ( path ) => restart( path, 'added' ) )
-		.on( 'unlink', ( path ) => restart( path, 'deleted' ) )
-		.on( 'change', async ( path ) => {
-			const t0 = Date.now();
-			const result = await safe( `rebuild ${ path }`, () => ctx.rebuild() );
-			if ( result ) {
-				console.log( `[watch] rebuilt ${ path } in ${ Date.now() - t0 }ms${ summarize( result ) }` );
-			}
-		} );
-} else {
-	const entryPoints = await resolveEntryPoints();
-	const t0 = Date.now();
-	console.log( `[build] ${ entryPoints.length } entry point(s)...` );
-	const result = await build( makeOptions( entryPoints ) );
-	console.log( `[build] done in ${ Date.now() - t0 }ms${ summarize( result ) }` );
-}
+await runPackageBuilder( { entryPoints: 'src/**/*.{ts,tsx,js,jsx}' } );
diff --git a/packages/js/navigation/package.json b/packages/js/navigation/package.json
index 44d6ff8312b..915078960d0 100644
--- a/packages/js/navigation/package.json
+++ b/packages/js/navigation/package.json
@@ -20,9 +20,17 @@
 	"bugs": {
 		"url": "https://github.com/woocommerce/woocommerce/issues"
 	},
+	"exports": {
+		".": {
+			"wc-source": "./src/index.js",
+			"types": "./build-types/index.d.ts",
+			"import": "./build-module/index.js",
+			"require": "./build/index.js"
+		}
+	},
 	"main": "build/index.js",
 	"module": "build-module/index.js",
-	"types": "build-types",
+	"types": "build-types/index.d.ts",
 	"react-native": "src/index",
 	"files": [
 		"build",
@@ -31,10 +39,10 @@
 	],
 	"scripts": {
 		"build": "pnpm --if-present --workspace-concurrency=Infinity --stream --filter=\"$npm_package_name...\" '/^build:project:.*$/'",
-		"build:project": "pnpm --if-present '/^build:project:.*$/'",
+		"build:project": "pnpm --stream --if-present '/^build:project:.*$/'",
 		"build:project:esm": "node build.mjs",
 		"build:publish:project": "pnpm --if-present '/^build:publish:project:.*$/'",
-		"build:publish:project:cjs": "node build.mjs --cjs",
+		"build:publish:project:cjs": "node build.mjs --commonjs",
 		"build:publish:project:types": "tsc --build --emitDeclarationOnly",
 		"build:publish:project:deps": "pnpm build",
 		"changelog": "XDEBUG_MODE=off composer install --quiet && composer exec -- changelogger",
@@ -73,7 +81,14 @@
 		"lodash": "^4.17.0"
 	},
 	"publishConfig": {
-		"access": "public"
+		"access": "public",
+		"exports": {
+			".": {
+				"types": "./build-types/index.d.ts",
+				"import": "./build-module/index.js",
+				"require": "./build/index.js"
+			}
+		}
 	},
 	"devDependencies": {
 		"@babel/core": "7.25.7",
@@ -81,12 +96,9 @@
 		"@types/jest": "29.5.x",
 		"@types/qs": "^6.9.10",
 		"@woocommerce/eslint-plugin": "workspace:*",
+		"@woocommerce/internal-build": "workspace:*",
 		"@woocommerce/internal-js-tests": "workspace:*",
-		"@woocommerce/internal-ts-config": "workspace:*",
-		"chokidar": "3.6.x",
-		"esbuild": "0.24.x",
 		"eslint": "^8.55.0",
-		"glob": "^10.3.10",
 		"jest": "29.5.x",
 		"jest-cli": "29.5.x",
 		"jest-environment-jsdom": "29.5.x",
diff --git a/packages/js/navigation/tsconfig-cjs.json b/packages/js/navigation/tsconfig-cjs.json
deleted file mode 100644
index 5a4f74e214d..00000000000
--- a/packages/js/navigation/tsconfig-cjs.json
+++ /dev/null
@@ -1,18 +0,0 @@
-{
-	"extends": "@woocommerce/internal-ts-config/tsconfig-cjs.json",
-	"compilerOptions": {
-		"rootDir": "src",
-		"outDir": "build",
-		"typeRoots": [
-			"./typings",
-			"./node_modules/@types"
-		]
-	},
-	"include": [
-		"typings/**/*",
-		"src/**/*"
-	],
-	"exclude": [
-		"**/test/**"
-	]
-}
diff --git a/packages/js/navigation/tsconfig.json b/packages/js/navigation/tsconfig.json
index 2cb6f5a848f..be24cae4c13 100644
--- a/packages/js/navigation/tsconfig.json
+++ b/packages/js/navigation/tsconfig.json
@@ -1,5 +1,5 @@
 {
-	"extends": "@woocommerce/internal-ts-config/tsconfig.json",
+	"extends": "@woocommerce/internal-build/configs/tsconfig.json",
 	"compilerOptions": {
 		"rootDir": "src",
 		"outDir": "build-module",
diff --git a/packages/js/notices/build.mjs b/packages/js/notices/build.mjs
index 746bc61fc4b..2d76d01222e 100644
--- a/packages/js/notices/build.mjs
+++ b/packages/js/notices/build.mjs
@@ -1,112 +1,3 @@
-import { build, context } from 'esbuild';
-import { glob } from 'glob';
-import { rm } from 'node:fs/promises';
-import chokidar from 'chokidar';
+import { runPackageBuilder } from '@woocommerce/internal-build';

-const watch = process.argv.includes( '--watch' );
-const format = process.argv.includes( '--cjs' ) ? 'cjs' : 'esm';
-const outdir = format === 'cjs' ? 'build' : 'build-module';
-
-const ENTRY_GLOB = 'src/**/*.{ts,tsx,js,jsx}';
-const ENTRY_IGNORE = [
-	'**/test/**',
-	'**/stories/**',
-	'**/*.test.{ts,tsx,js,jsx}',
-	'**/*.d.ts',
-];
-
-async function resolveEntryPoints() {
-	return glob( ENTRY_GLOB, { ignore: ENTRY_IGNORE } );
-}
-
-function makeOptions( entryPoints ) {
-	return {
-		entryPoints,
-		outdir,
-		outbase: 'src',
-		bundle: false,
-		format,
-		platform: 'neutral',
-		target: 'esnext',
-		loader: { '.js': 'jsx', '.jsx': 'jsx', '.ts': 'ts', '.tsx': 'tsx' },
-		jsx: 'transform',
-		jsxFactory: 'createElement',
-		jsxFragment: 'Fragment',
-		logLevel: 'warning',
-		sourcemap: false,
-	};
-}
-
-function summarize( result ) {
-	const errors = result.errors.length;
-	const warnings = result.warnings.length;
-	const parts = [];
-	if ( errors ) parts.push( `${ errors } error(s)` );
-	if ( warnings ) parts.push( `${ warnings } warning(s)` );
-	return parts.length ? ` — ${ parts.join( ', ' ) }` : '';
-}
-
-// Wrap a watch-mode step so a single failure (disk error, build crash, etc.)
-// doesn't take the watcher process down. Errors are surfaced; the loop survives.
-async function safe( label, fn ) {
-	try {
-		return await fn();
-	} catch ( error ) {
-		console.error( `[watch] ${ label } failed:`, error?.message ?? error );
-		return null;
-	}
-}
-
-await rm( outdir, { recursive: true, force: true } );
-
-if ( watch ) {
-	const startupT0 = Date.now();
-	let entryPoints = await resolveEntryPoints();
-	let ctx = await context( makeOptions( entryPoints ) );
-	const initial = await safe( 'startup build', () => ctx.rebuild() );
-	console.log( `[watch] ready in ${ Date.now() - startupT0 }ms — ${ entryPoints.length } entry point(s)${ initial ? summarize( initial ) : '' }` );
-
-	// esbuild's own watcher polls the filesystem, which can miss or delay
-	// changes (especially edits to files added after context creation).
-	// chokidar uses OS-level events (fsevents/inotify) and drives rebuilds
-	// directly: changes call ctx.rebuild() (preserves the AST cache),
-	// add/unlink trigger a debounced context restart (entry list changed).
-	let pending;
-	const pendingChanges = new Set();
-	const restart = ( path, kind ) => {
-		pendingChanges.add( `${ path } (${ kind })` );
-		clearTimeout( pending );
-		pending = setTimeout( () => safe( 'restart', async () => {
-			const changes = [ ...pendingChanges ];
-			pendingChanges.clear();
-			const preview = changes.slice( 0, 3 ).join( ', ' );
-			const suffix = changes.length > 3 ? `, +${ changes.length - 3 } more` : '';
-			console.log( `[watch] restarting (${ preview }${ suffix })` );
-			const t0 = Date.now();
-			await ctx.dispose();
-			await rm( outdir, { recursive: true, force: true } );
-			entryPoints = await resolveEntryPoints();
-			ctx = await context( makeOptions( entryPoints ) );
-			const result = await ctx.rebuild();
-			console.log( `[watch] rebuilt in ${ Date.now() - t0 }ms — ${ entryPoints.length } entry point(s)${ summarize( result ) }` );
-		} ), 200 );
-	};
-
-	chokidar
-		.watch( ENTRY_GLOB, { ignored: ENTRY_IGNORE, ignoreInitial: true } )
-		.on( 'add', ( path ) => restart( path, 'added' ) )
-		.on( 'unlink', ( path ) => restart( path, 'deleted' ) )
-		.on( 'change', async ( path ) => {
-			const t0 = Date.now();
-			const result = await safe( `rebuild ${ path }`, () => ctx.rebuild() );
-			if ( result ) {
-				console.log( `[watch] rebuilt ${ path } in ${ Date.now() - t0 }ms${ summarize( result ) }` );
-			}
-		} );
-} else {
-	const entryPoints = await resolveEntryPoints();
-	const t0 = Date.now();
-	console.log( `[build] ${ entryPoints.length } entry point(s)...` );
-	const result = await build( makeOptions( entryPoints ) );
-	console.log( `[build] done in ${ Date.now() - t0 }ms${ summarize( result ) }` );
-}
+await runPackageBuilder( { entryPoints: 'src/**/*.{ts,tsx,js,jsx}' } );
diff --git a/packages/js/notices/package.json b/packages/js/notices/package.json
index 1bcd7764e9d..999e4e9b9cb 100644
--- a/packages/js/notices/package.json
+++ b/packages/js/notices/package.json
@@ -21,9 +21,17 @@
 	"bugs": {
 		"url": "https://github.com/woocommerce/woocommerce/issues"
 	},
+	"exports": {
+		".": {
+			"wc-source": "./src/index.ts",
+			"types": "./build-types/index.d.ts",
+			"import": "./build-module/index.js",
+			"require": "./build/index.js"
+		}
+	},
 	"main": "build/index.js",
 	"module": "build-module/index.js",
-	"types": "build-types",
+	"types": "build-types/index.d.ts",
 	"react-native": "src/index",
 	"files": [
 		"build",
@@ -32,10 +40,10 @@
 	],
 	"scripts": {
 		"build": "pnpm --if-present --workspace-concurrency=Infinity --stream --filter=\"$npm_package_name...\" '/^build:project:.*$/'",
-		"build:project": "pnpm --if-present '/^build:project:.*$/'",
+		"build:project": "pnpm --stream --if-present '/^build:project:.*$/'",
 		"build:project:esm": "node build.mjs",
 		"build:publish:project": "pnpm --if-present '/^build:publish:project:.*$/'",
-		"build:publish:project:cjs": "node build.mjs --cjs",
+		"build:publish:project:cjs": "node build.mjs --commonjs",
 		"build:publish:project:types": "tsc --build --emitDeclarationOnly",
 		"build:publish:project:deps": "pnpm build",
 		"changelog": "XDEBUG_MODE=off composer install --quiet && composer exec -- changelogger",
@@ -67,18 +75,22 @@
 		"react-dom": "18.3.x"
 	},
 	"publishConfig": {
-		"access": "public"
+		"access": "public",
+		"exports": {
+			".": {
+				"types": "./build-types/index.d.ts",
+				"import": "./build-module/index.js",
+				"require": "./build/index.js"
+			}
+		}
 	},
 	"private": true,
 	"devDependencies": {
 		"@babel/core": "7.25.7",
 		"@types/lodash": "^4.14.202",
 		"@woocommerce/eslint-plugin": "workspace:*",
-		"@woocommerce/internal-ts-config": "workspace:*",
-		"chokidar": "3.6.x",
-		"esbuild": "0.24.x",
+		"@woocommerce/internal-build": "workspace:*",
 		"eslint": "^8.55.0",
-		"glob": "^10.3.10",
 		"jest": "29.5.x",
 		"jest-cli": "29.5.x",
 		"redux": "^4.2.1",
diff --git a/packages/js/notices/tsconfig-cjs.json b/packages/js/notices/tsconfig-cjs.json
deleted file mode 100644
index 5a4f74e214d..00000000000
--- a/packages/js/notices/tsconfig-cjs.json
+++ /dev/null
@@ -1,18 +0,0 @@
-{
-	"extends": "@woocommerce/internal-ts-config/tsconfig-cjs.json",
-	"compilerOptions": {
-		"rootDir": "src",
-		"outDir": "build",
-		"typeRoots": [
-			"./typings",
-			"./node_modules/@types"
-		]
-	},
-	"include": [
-		"typings/**/*",
-		"src/**/*"
-	],
-	"exclude": [
-		"**/test/**"
-	]
-}
diff --git a/packages/js/notices/tsconfig.json b/packages/js/notices/tsconfig.json
index f4ce33ca5b8..c1f3e6716e8 100644
--- a/packages/js/notices/tsconfig.json
+++ b/packages/js/notices/tsconfig.json
@@ -1,5 +1,5 @@
 {
-	"extends": "@woocommerce/internal-ts-config/tsconfig.json",
+	"extends": "@woocommerce/internal-build/configs/tsconfig.json",
 	"compilerOptions": {
 		"rootDir": "src",
 		"outDir": "build-module",
diff --git a/packages/js/notices/typings/monorepo-enhancements.d.ts b/packages/js/notices/typings/monorepo-enhancements.d.ts
index dc453ab911e..8d3d6bdc1e4 100644
--- a/packages/js/notices/typings/monorepo-enhancements.d.ts
+++ b/packages/js/notices/typings/monorepo-enhancements.d.ts
@@ -1 +1 @@
-import '@woocommerce/internal-ts-config/types/@wordpress/data';
+import '@woocommerce/internal-build/type-overrides/@wordpress/data';
diff --git a/packages/js/number/build.mjs b/packages/js/number/build.mjs
index 746bc61fc4b..2d76d01222e 100644
--- a/packages/js/number/build.mjs
+++ b/packages/js/number/build.mjs
@@ -1,112 +1,3 @@
-import { build, context } from 'esbuild';
-import { glob } from 'glob';
-import { rm } from 'node:fs/promises';
-import chokidar from 'chokidar';
+import { runPackageBuilder } from '@woocommerce/internal-build';

-const watch = process.argv.includes( '--watch' );
-const format = process.argv.includes( '--cjs' ) ? 'cjs' : 'esm';
-const outdir = format === 'cjs' ? 'build' : 'build-module';
-
-const ENTRY_GLOB = 'src/**/*.{ts,tsx,js,jsx}';
-const ENTRY_IGNORE = [
-	'**/test/**',
-	'**/stories/**',
-	'**/*.test.{ts,tsx,js,jsx}',
-	'**/*.d.ts',
-];
-
-async function resolveEntryPoints() {
-	return glob( ENTRY_GLOB, { ignore: ENTRY_IGNORE } );
-}
-
-function makeOptions( entryPoints ) {
-	return {
-		entryPoints,
-		outdir,
-		outbase: 'src',
-		bundle: false,
-		format,
-		platform: 'neutral',
-		target: 'esnext',
-		loader: { '.js': 'jsx', '.jsx': 'jsx', '.ts': 'ts', '.tsx': 'tsx' },
-		jsx: 'transform',
-		jsxFactory: 'createElement',
-		jsxFragment: 'Fragment',
-		logLevel: 'warning',
-		sourcemap: false,
-	};
-}
-
-function summarize( result ) {
-	const errors = result.errors.length;
-	const warnings = result.warnings.length;
-	const parts = [];
-	if ( errors ) parts.push( `${ errors } error(s)` );
-	if ( warnings ) parts.push( `${ warnings } warning(s)` );
-	return parts.length ? ` — ${ parts.join( ', ' ) }` : '';
-}
-
-// Wrap a watch-mode step so a single failure (disk error, build crash, etc.)
-// doesn't take the watcher process down. Errors are surfaced; the loop survives.
-async function safe( label, fn ) {
-	try {
-		return await fn();
-	} catch ( error ) {
-		console.error( `[watch] ${ label } failed:`, error?.message ?? error );
-		return null;
-	}
-}
-
-await rm( outdir, { recursive: true, force: true } );
-
-if ( watch ) {
-	const startupT0 = Date.now();
-	let entryPoints = await resolveEntryPoints();
-	let ctx = await context( makeOptions( entryPoints ) );
-	const initial = await safe( 'startup build', () => ctx.rebuild() );
-	console.log( `[watch] ready in ${ Date.now() - startupT0 }ms — ${ entryPoints.length } entry point(s)${ initial ? summarize( initial ) : '' }` );
-
-	// esbuild's own watcher polls the filesystem, which can miss or delay
-	// changes (especially edits to files added after context creation).
-	// chokidar uses OS-level events (fsevents/inotify) and drives rebuilds
-	// directly: changes call ctx.rebuild() (preserves the AST cache),
-	// add/unlink trigger a debounced context restart (entry list changed).
-	let pending;
-	const pendingChanges = new Set();
-	const restart = ( path, kind ) => {
-		pendingChanges.add( `${ path } (${ kind })` );
-		clearTimeout( pending );
-		pending = setTimeout( () => safe( 'restart', async () => {
-			const changes = [ ...pendingChanges ];
-			pendingChanges.clear();
-			const preview = changes.slice( 0, 3 ).join( ', ' );
-			const suffix = changes.length > 3 ? `, +${ changes.length - 3 } more` : '';
-			console.log( `[watch] restarting (${ preview }${ suffix })` );
-			const t0 = Date.now();
-			await ctx.dispose();
-			await rm( outdir, { recursive: true, force: true } );
-			entryPoints = await resolveEntryPoints();
-			ctx = await context( makeOptions( entryPoints ) );
-			const result = await ctx.rebuild();
-			console.log( `[watch] rebuilt in ${ Date.now() - t0 }ms — ${ entryPoints.length } entry point(s)${ summarize( result ) }` );
-		} ), 200 );
-	};
-
-	chokidar
-		.watch( ENTRY_GLOB, { ignored: ENTRY_IGNORE, ignoreInitial: true } )
-		.on( 'add', ( path ) => restart( path, 'added' ) )
-		.on( 'unlink', ( path ) => restart( path, 'deleted' ) )
-		.on( 'change', async ( path ) => {
-			const t0 = Date.now();
-			const result = await safe( `rebuild ${ path }`, () => ctx.rebuild() );
-			if ( result ) {
-				console.log( `[watch] rebuilt ${ path } in ${ Date.now() - t0 }ms${ summarize( result ) }` );
-			}
-		} );
-} else {
-	const entryPoints = await resolveEntryPoints();
-	const t0 = Date.now();
-	console.log( `[build] ${ entryPoints.length } entry point(s)...` );
-	const result = await build( makeOptions( entryPoints ) );
-	console.log( `[build] done in ${ Date.now() - t0 }ms${ summarize( result ) }` );
-}
+await runPackageBuilder( { entryPoints: 'src/**/*.{ts,tsx,js,jsx}' } );
diff --git a/packages/js/number/package.json b/packages/js/number/package.json
index a4a1cb30a47..3031725e584 100644
--- a/packages/js/number/package.json
+++ b/packages/js/number/package.json
@@ -19,9 +19,17 @@
 	"bugs": {
 		"url": "https://github.com/woocommerce/woocommerce/issues"
 	},
+	"exports": {
+		".": {
+			"wc-source": "./src/index.ts",
+			"types": "./build-types/index.d.ts",
+			"import": "./build-module/index.js",
+			"require": "./build/index.js"
+		}
+	},
 	"main": "build/index.js",
 	"module": "build-module/index.js",
-	"types": "build-types",
+	"types": "build-types/index.d.ts",
 	"react-native": "src/index",
 	"files": [
 		"build",
@@ -32,14 +40,21 @@
 		"locutus": "^3.0.14"
 	},
 	"publishConfig": {
-		"access": "public"
+		"access": "public",
+		"exports": {
+			".": {
+				"types": "./build-types/index.d.ts",
+				"import": "./build-module/index.js",
+				"require": "./build/index.js"
+			}
+		}
 	},
 	"scripts": {
 		"build": "pnpm --if-present --workspace-concurrency=Infinity --stream --filter=\"$npm_package_name...\" '/^build:project:.*$/'",
-		"build:project": "pnpm --if-present '/^build:project:.*$/'",
+		"build:project": "pnpm --stream --if-present '/^build:project:.*$/'",
 		"build:project:esm": "node build.mjs",
 		"build:publish:project": "pnpm --if-present '/^build:publish:project:.*$/'",
-		"build:publish:project:cjs": "node build.mjs --cjs",
+		"build:publish:project:cjs": "node build.mjs --commonjs",
 		"build:publish:project:types": "tsc --build --emitDeclarationOnly",
 		"build:publish:project:deps": "pnpm build",
 		"changelog": "XDEBUG_MODE=off composer install --quiet && composer exec -- changelogger",
@@ -61,12 +76,9 @@
 		"@types/jest": "29.5.x",
 		"@types/lodash": "^4.14.202",
 		"@woocommerce/eslint-plugin": "workspace:*",
+		"@woocommerce/internal-build": "workspace:*",
 		"@woocommerce/internal-js-tests": "workspace:*",
-		"@woocommerce/internal-ts-config": "workspace:*",
-		"chokidar": "3.6.x",
-		"esbuild": "0.24.x",
 		"eslint": "^8.55.0",
-		"glob": "^10.3.10",
 		"jest": "29.5.x",
 		"jest-cli": "29.5.x",
 		"jest-environment-jsdom": "29.5.x",
diff --git a/packages/js/number/tsconfig-cjs.json b/packages/js/number/tsconfig-cjs.json
deleted file mode 100644
index 5a4f74e214d..00000000000
--- a/packages/js/number/tsconfig-cjs.json
+++ /dev/null
@@ -1,18 +0,0 @@
-{
-	"extends": "@woocommerce/internal-ts-config/tsconfig-cjs.json",
-	"compilerOptions": {
-		"rootDir": "src",
-		"outDir": "build",
-		"typeRoots": [
-			"./typings",
-			"./node_modules/@types"
-		]
-	},
-	"include": [
-		"typings/**/*",
-		"src/**/*"
-	],
-	"exclude": [
-		"**/test/**"
-	]
-}
diff --git a/packages/js/number/tsconfig.json b/packages/js/number/tsconfig.json
index 2cb6f5a848f..be24cae4c13 100644
--- a/packages/js/number/tsconfig.json
+++ b/packages/js/number/tsconfig.json
@@ -1,5 +1,5 @@
 {
-	"extends": "@woocommerce/internal-ts-config/tsconfig.json",
+	"extends": "@woocommerce/internal-build/configs/tsconfig.json",
 	"compilerOptions": {
 		"rootDir": "src",
 		"outDir": "build-module",
diff --git a/packages/js/onboarding/build.mjs b/packages/js/onboarding/build.mjs
index 746bc61fc4b..2d76d01222e 100644
--- a/packages/js/onboarding/build.mjs
+++ b/packages/js/onboarding/build.mjs
@@ -1,112 +1,3 @@
-import { build, context } from 'esbuild';
-import { glob } from 'glob';
-import { rm } from 'node:fs/promises';
-import chokidar from 'chokidar';
+import { runPackageBuilder } from '@woocommerce/internal-build';

-const watch = process.argv.includes( '--watch' );
-const format = process.argv.includes( '--cjs' ) ? 'cjs' : 'esm';
-const outdir = format === 'cjs' ? 'build' : 'build-module';
-
-const ENTRY_GLOB = 'src/**/*.{ts,tsx,js,jsx}';
-const ENTRY_IGNORE = [
-	'**/test/**',
-	'**/stories/**',
-	'**/*.test.{ts,tsx,js,jsx}',
-	'**/*.d.ts',
-];
-
-async function resolveEntryPoints() {
-	return glob( ENTRY_GLOB, { ignore: ENTRY_IGNORE } );
-}
-
-function makeOptions( entryPoints ) {
-	return {
-		entryPoints,
-		outdir,
-		outbase: 'src',
-		bundle: false,
-		format,
-		platform: 'neutral',
-		target: 'esnext',
-		loader: { '.js': 'jsx', '.jsx': 'jsx', '.ts': 'ts', '.tsx': 'tsx' },
-		jsx: 'transform',
-		jsxFactory: 'createElement',
-		jsxFragment: 'Fragment',
-		logLevel: 'warning',
-		sourcemap: false,
-	};
-}
-
-function summarize( result ) {
-	const errors = result.errors.length;
-	const warnings = result.warnings.length;
-	const parts = [];
-	if ( errors ) parts.push( `${ errors } error(s)` );
-	if ( warnings ) parts.push( `${ warnings } warning(s)` );
-	return parts.length ? ` — ${ parts.join( ', ' ) }` : '';
-}
-
-// Wrap a watch-mode step so a single failure (disk error, build crash, etc.)
-// doesn't take the watcher process down. Errors are surfaced; the loop survives.
-async function safe( label, fn ) {
-	try {
-		return await fn();
-	} catch ( error ) {
-		console.error( `[watch] ${ label } failed:`, error?.message ?? error );
-		return null;
-	}
-}
-
-await rm( outdir, { recursive: true, force: true } );
-
-if ( watch ) {
-	const startupT0 = Date.now();
-	let entryPoints = await resolveEntryPoints();
-	let ctx = await context( makeOptions( entryPoints ) );
-	const initial = await safe( 'startup build', () => ctx.rebuild() );
-	console.log( `[watch] ready in ${ Date.now() - startupT0 }ms — ${ entryPoints.length } entry point(s)${ initial ? summarize( initial ) : '' }` );
-
-	// esbuild's own watcher polls the filesystem, which can miss or delay
-	// changes (especially edits to files added after context creation).
-	// chokidar uses OS-level events (fsevents/inotify) and drives rebuilds
-	// directly: changes call ctx.rebuild() (preserves the AST cache),
-	// add/unlink trigger a debounced context restart (entry list changed).
-	let pending;
-	const pendingChanges = new Set();
-	const restart = ( path, kind ) => {
-		pendingChanges.add( `${ path } (${ kind })` );
-		clearTimeout( pending );
-		pending = setTimeout( () => safe( 'restart', async () => {
-			const changes = [ ...pendingChanges ];
-			pendingChanges.clear();
-			const preview = changes.slice( 0, 3 ).join( ', ' );
-			const suffix = changes.length > 3 ? `, +${ changes.length - 3 } more` : '';
-			console.log( `[watch] restarting (${ preview }${ suffix })` );
-			const t0 = Date.now();
-			await ctx.dispose();
-			await rm( outdir, { recursive: true, force: true } );
-			entryPoints = await resolveEntryPoints();
-			ctx = await context( makeOptions( entryPoints ) );
-			const result = await ctx.rebuild();
-			console.log( `[watch] rebuilt in ${ Date.now() - t0 }ms — ${ entryPoints.length } entry point(s)${ summarize( result ) }` );
-		} ), 200 );
-	};
-
-	chokidar
-		.watch( ENTRY_GLOB, { ignored: ENTRY_IGNORE, ignoreInitial: true } )
-		.on( 'add', ( path ) => restart( path, 'added' ) )
-		.on( 'unlink', ( path ) => restart( path, 'deleted' ) )
-		.on( 'change', async ( path ) => {
-			const t0 = Date.now();
-			const result = await safe( `rebuild ${ path }`, () => ctx.rebuild() );
-			if ( result ) {
-				console.log( `[watch] rebuilt ${ path } in ${ Date.now() - t0 }ms${ summarize( result ) }` );
-			}
-		} );
-} else {
-	const entryPoints = await resolveEntryPoints();
-	const t0 = Date.now();
-	console.log( `[build] ${ entryPoints.length } entry point(s)...` );
-	const result = await build( makeOptions( entryPoints ) );
-	console.log( `[build] done in ${ Date.now() - t0 }ms${ summarize( result ) }` );
-}
+await runPackageBuilder( { entryPoints: 'src/**/*.{ts,tsx,js,jsx}' } );
diff --git a/packages/js/onboarding/package.json b/packages/js/onboarding/package.json
index b3570ee08f4..231e605db6e 100644
--- a/packages/js/onboarding/package.json
+++ b/packages/js/onboarding/package.json
@@ -20,9 +20,17 @@
 	"bugs": {
 		"url": "https://github.com/woocommerce/woocommerce/issues"
 	},
+	"exports": {
+		".": {
+			"wc-source": "./src/index.ts",
+			"types": "./build-types/index.d.ts",
+			"import": "./build-module/index.js",
+			"require": "./build/index.js"
+		}
+	},
 	"main": "build/index.js",
 	"module": "build-module/index.js",
-	"types": "build-types",
+	"types": "build-types/index.d.ts",
 	"react-native": "src/index",
 	"files": [
 		"build",
@@ -32,11 +40,11 @@
 	],
 	"scripts": {
 		"build": "pnpm --if-present --workspace-concurrency=Infinity --stream --filter=\"$npm_package_name...\" '/^build:project:.*$/'",
-		"build:project": "pnpm --if-present '/^build:project:.*$/'",
+		"build:project": "pnpm --stream --if-present '/^build:project:.*$/'",
 		"build:project:bundle": "NODE_ENV=production webpack",
 		"build:project:esm": "node build.mjs",
 		"build:publish:project": "pnpm --if-present '/^build:publish:project:.*$/'",
-		"build:publish:project:cjs": "node build.mjs --cjs",
+		"build:publish:project:cjs": "node build.mjs --commonjs",
 		"build:publish:project:types": "tsc --build --emitDeclarationOnly",
 		"build:publish:project:deps": "pnpm build",
 		"changelog": "XDEBUG_MODE=off composer install --quiet && composer exec -- changelogger",
@@ -80,15 +88,11 @@
 		"@types/react": "18.3.x",
 		"@types/string-similarity": "4.0.0",
 		"@woocommerce/eslint-plugin": "workspace:*",
+		"@woocommerce/internal-build": "workspace:*",
 		"@woocommerce/internal-js-tests": "workspace:*",
-		"@woocommerce/internal-style-build": "workspace:*",
-		"@woocommerce/internal-ts-config": "workspace:*",
 		"@wordpress/browserslist-config": "next",
-		"chokidar": "3.6.x",
 		"css-loader": "6.11.x",
-		"esbuild": "0.24.x",
 		"eslint": "^8.55.0",
-		"glob": "^10.3.10",
 		"jest": "29.5.x",
 		"jest-cli": "29.5.x",
 		"jest-environment-jsdom": "29.5.x",
@@ -102,7 +106,14 @@
 		"webpack-cli": "5.1.x"
 	},
 	"publishConfig": {
-		"access": "public"
+		"access": "public",
+		"exports": {
+			".": {
+				"types": "./build-types/index.d.ts",
+				"import": "./build-module/index.js",
+				"require": "./build/index.js"
+			}
+		}
 	},
 	"config": {
 		"ci": {
diff --git a/packages/js/onboarding/tsconfig-cjs.json b/packages/js/onboarding/tsconfig-cjs.json
deleted file mode 100644
index 247b557c04c..00000000000
--- a/packages/js/onboarding/tsconfig-cjs.json
+++ /dev/null
@@ -1,19 +0,0 @@
-{
-	"extends": "@woocommerce/internal-ts-config/tsconfig-cjs.json",
-	"compilerOptions": {
-		"rootDir": "src",
-		"outDir": "build",
-		"typeRoots": [
-			"./typings",
-			"./node_modules/@types"
-		]
-	},
-	"include": [
-		"typings/**/*",
-		"src/**/*"
-	],
-	"exclude": [
-		"**/test/**",
-		"**/stories/**"
-	]
-}
diff --git a/packages/js/onboarding/tsconfig.json b/packages/js/onboarding/tsconfig.json
index 5072b058f70..f27f4fd28ed 100644
--- a/packages/js/onboarding/tsconfig.json
+++ b/packages/js/onboarding/tsconfig.json
@@ -1,5 +1,5 @@
 {
-	"extends": "@woocommerce/internal-ts-config/tsconfig.json",
+	"extends": "@woocommerce/internal-build/configs/tsconfig.json",
 	"compilerOptions": {
 		"rootDir": "src",
 		"outDir": "build-module",
diff --git a/packages/js/onboarding/typings/monorepo-enhancements.d.ts b/packages/js/onboarding/typings/monorepo-enhancements.d.ts
index dc453ab911e..8d3d6bdc1e4 100644
--- a/packages/js/onboarding/typings/monorepo-enhancements.d.ts
+++ b/packages/js/onboarding/typings/monorepo-enhancements.d.ts
@@ -1 +1 @@
-import '@woocommerce/internal-ts-config/types/@wordpress/data';
+import '@woocommerce/internal-build/type-overrides/@wordpress/data';
diff --git a/packages/js/onboarding/webpack.config.js b/packages/js/onboarding/webpack.config.js
index 9d696e6b37f..0f8dbd47654 100644
--- a/packages/js/onboarding/webpack.config.js
+++ b/packages/js/onboarding/webpack.config.js
@@ -1,7 +1,7 @@
 /**
  * Internal dependencies
  */
-const { webpackConfig } = require( '@woocommerce/internal-style-build' );
+const { webpackConfig } = require( '@woocommerce/internal-build/style-build' );

 /**
  * External dependencies
@@ -22,7 +22,7 @@ module.exports = {
 			config: [
 				__filename,
 				path.resolve( __dirname, '../../../pnpm-lock.yaml' ),
-				require.resolve( '@woocommerce/internal-style-build' ),
+				require.resolve( '@woocommerce/internal-build/style-build' ),
 			],
 		},
 	},
diff --git a/packages/js/product-editor/build.mjs b/packages/js/product-editor/build.mjs
index 09753307811..781434f810b 100644
--- a/packages/js/product-editor/build.mjs
+++ b/packages/js/product-editor/build.mjs
@@ -1,125 +1,6 @@
-import { build, context } from 'esbuild';
-import { glob } from 'glob';
-import { copyFile, mkdir, rm } from 'node:fs/promises';
-import { dirname, join, relative } from 'node:path';
-import chokidar from 'chokidar';
+import { runPackageBuilder } from '@woocommerce/internal-build';

-const watch = process.argv.includes( '--watch' );
-const format = process.argv.includes( '--cjs' ) ? 'cjs' : 'esm';
-const outdir = format === 'cjs' ? 'build' : 'build-module';
-
-const ENTRY_GLOB = 'src/**/*.{ts,tsx,js,jsx}';
-const ENTRY_IGNORE = [
-	'**/test/**',
-	'**/stories/**',
-	'**/*.test.{ts,tsx,js,jsx}',
-	'**/*.d.ts',
-];
-const BLOCK_JSON_GLOB = 'src/**/block.json';
-
-async function resolveEntryPoints() {
-	return glob( ENTRY_GLOB, { ignore: ENTRY_IGNORE } );
-}
-
-// block.json files are runtime-imported by src/blocks/**/index.ts. esbuild in
-// transpile mode preserves the `import './block.json'` statements as-is, so
-// the .json files must sit next to the emitted .js for those imports to
-// resolve.
-async function copyBlockJson() {
-	for ( const src of await glob( BLOCK_JSON_GLOB ) ) {
-		const dest = join( outdir, relative( 'src', src ) );
-		await mkdir( dirname( dest ), { recursive: true } );
-		await copyFile( src, dest );
-	}
-}
-
-function makeOptions( entryPoints ) {
-	return {
-		entryPoints,
-		outdir,
-		outbase: 'src',
-		bundle: false,
-		format,
-		platform: 'neutral',
-		target: 'esnext',
-		loader: { '.js': 'jsx', '.jsx': 'jsx', '.ts': 'ts', '.tsx': 'tsx' },
-		jsx: 'transform',
-		jsxFactory: 'createElement',
-		jsxFragment: 'Fragment',
-		logLevel: 'warning',
-		sourcemap: false,
-	};
-}
-
-function summarize( result ) {
-	const errors = result.errors.length;
-	const warnings = result.warnings.length;
-	const parts = [];
-	if ( errors ) parts.push( `${ errors } error(s)` );
-	if ( warnings ) parts.push( `${ warnings } warning(s)` );
-	return parts.length ? ` — ${ parts.join( ', ' ) }` : '';
-}
-
-// Wrap a watch-mode step so a single failure (disk error, build crash, etc.)
-// doesn't take the watcher process down. Errors are surfaced; the loop survives.
-async function safe( label, fn ) {
-	try {
-		return await fn();
-	} catch ( error ) {
-		console.error( `[watch] ${ label } failed:`, error?.message ?? error );
-		return null;
-	}
-}
-
-await rm( outdir, { recursive: true, force: true } );
-
-if ( watch ) {
-	const startupT0 = Date.now();
-	let entryPoints = await resolveEntryPoints();
-	let ctx = await context( makeOptions( entryPoints ) );
-	const initial = await safe( 'startup build', () => ctx.rebuild() );
-	await safe( 'startup block.json copy', copyBlockJson );
-	console.log( `[watch] ready in ${ Date.now() - startupT0 }ms — ${ entryPoints.length } entry point(s)${ initial ? summarize( initial ) : '' }` );
-
-	let pending;
-	const pendingChanges = new Set();
-	const restart = ( path, kind ) => {
-		pendingChanges.add( `${ path } (${ kind })` );
-		clearTimeout( pending );
-		pending = setTimeout( () => safe( 'restart', async () => {
-			const changes = [ ...pendingChanges ];
-			pendingChanges.clear();
-			const preview = changes.slice( 0, 3 ).join( ', ' );
-			const suffix = changes.length > 3 ? `, +${ changes.length - 3 } more` : '';
-			console.log( `[watch] restarting (${ preview }${ suffix })` );
-			const t0 = Date.now();
-			await ctx.dispose();
-			await rm( outdir, { recursive: true, force: true } );
-			entryPoints = await resolveEntryPoints();
-			ctx = await context( makeOptions( entryPoints ) );
-			const result = await ctx.rebuild();
-			await copyBlockJson();
-			console.log( `[watch] rebuilt in ${ Date.now() - t0 }ms — ${ entryPoints.length } entry point(s)${ summarize( result ) }` );
-		} ), 200 );
-	};
-
-	chokidar
-		.watch( [ ENTRY_GLOB, BLOCK_JSON_GLOB ], { ignored: ENTRY_IGNORE, ignoreInitial: true } )
-		.on( 'add', ( path ) => restart( path, 'added' ) )
-		.on( 'unlink', ( path ) => restart( path, 'deleted' ) )
-		.on( 'change', async ( path ) => {
-			const t0 = Date.now();
-			const result = await safe( `rebuild ${ path }`, () => ctx.rebuild() );
-			if ( path.endsWith( '.json' ) ) await safe( 'block.json copy', copyBlockJson );
-			if ( result ) {
-				console.log( `[watch] rebuilt ${ path } in ${ Date.now() - t0 }ms${ summarize( result ) }` );
-			}
-		} );
-} else {
-	const entryPoints = await resolveEntryPoints();
-	const t0 = Date.now();
-	console.log( `[build] ${ entryPoints.length } entry point(s)...` );
-	const result = await build( makeOptions( entryPoints ) );
-	await copyBlockJson();
-	console.log( `[build] done in ${ Date.now() - t0 }ms${ summarize( result ) }` );
-}
+await runPackageBuilder( {
+	entryPoints: 'src/**/*.{ts,tsx,js,jsx}',
+	assets: [ 'src/**/block.json' ],
+} );
diff --git a/packages/js/product-editor/package.json b/packages/js/product-editor/package.json
index 148d26271cb..9de870f6455 100644
--- a/packages/js/product-editor/package.json
+++ b/packages/js/product-editor/package.json
@@ -16,9 +16,17 @@
 	"bugs": {
 		"url": "https://github.com/woocommerce/woocommerce/issues"
 	},
+	"exports": {
+		".": {
+			"wc-source": "./src/index.ts",
+			"types": "./build-types/index.d.ts",
+			"import": "./build-module/index.js",
+			"require": "./build/index.js"
+		}
+	},
 	"main": "build/index.js",
 	"module": "build-module/index.js",
-	"types": "build-types",
+	"types": "build-types/index.d.ts",
 	"react-native": "src/index",
 	"files": [
 		"build",
@@ -31,7 +39,14 @@
 		"src/**/*.scss"
 	],
 	"publishConfig": {
-		"access": "public"
+		"access": "public",
+		"exports": {
+			".": {
+				"types": "./build-types/index.d.ts",
+				"import": "./build-module/index.js",
+				"require": "./build/index.js"
+			}
+		}
 	},
 	"dependencies": {
 		"@types/lodash": "^4.14.202",
@@ -96,17 +111,13 @@
 		"@types/wordpress__blocks": "catalog:wp-min",
 		"@types/wordpress__edit-post": "catalog:wp-min",
 		"@woocommerce/eslint-plugin": "workspace:*",
+		"@woocommerce/internal-build": "workspace:*",
 		"@woocommerce/internal-js-tests": "workspace:*",
-		"@woocommerce/internal-style-build": "workspace:*",
-		"@woocommerce/internal-ts-config": "workspace:*",
 		"@wordpress/block-editor": "catalog:wp-min",
 		"@wordpress/browserslist-config": "next",
-		"chokidar": "3.6.x",
 		"copy-webpack-plugin": "13.0.x",
 		"css-loader": "6.11.x",
-		"esbuild": "0.24.x",
 		"eslint": "^8.55.0",
-		"glob": "^10.3.10",
 		"jest": "29.5.x",
 		"jest-cli": "29.5.x",
 		"jest-environment-jsdom": "29.5.x",
@@ -126,9 +137,9 @@
 	},
 	"scripts": {
 		"build": "pnpm --if-present --workspace-concurrency=Infinity --stream --filter=\"$npm_package_name...\" '/^build:project:.*$/'",
-		"build:project": "pnpm --if-present '/^build:project:.*$/'",
+		"build:project": "pnpm --stream --if-present '/^build:project:.*$/'",
 		"build:project:bundle": "NODE_ENV=production webpack",
-		"build:project:cjs": "node build.mjs --cjs",
+		"build:project:cjs": "node build.mjs --commonjs",
 		"build:project:esm": "node build.mjs",
 		"changelog": "XDEBUG_MODE=off composer install --quiet && composer exec -- changelogger",
 		"lint": "pnpm --if-present '/^lint:lang:.*$/'",
@@ -143,7 +154,7 @@
 		"watch:build": "pnpm --if-present --workspace-concurrency=Infinity --filter=\"$npm_package_name...\" --parallel '/^watch:build:project:.*$/'",
 		"watch:build:project": "pnpm --if-present run '/^watch:build:project:.*$/'",
 		"watch:build:project:bundle": "NODE_ENV=development webpack --watch",
-		"watch:build:project:cjs": "node build.mjs --cjs --watch",
+		"watch:build:project:cjs": "node build.mjs --commonjs --watch",
 		"watch:build:project:esm": "node build.mjs --watch"
 	},
 	"peerDependencies": {
diff --git a/packages/js/product-editor/tsconfig-cjs.json b/packages/js/product-editor/tsconfig-cjs.json
deleted file mode 100644
index fa37ff1c0b4..00000000000
--- a/packages/js/product-editor/tsconfig-cjs.json
+++ /dev/null
@@ -1,21 +0,0 @@
-{
-	"extends": "@woocommerce/internal-ts-config/tsconfig-cjs.json",
-	"compilerOptions": {
-		"rootDir": "src",
-		"outDir": "build",
-		"noCheck": false,
-		"resolveJsonModule": true,
-		"typeRoots": [
-			"./typings",
-			"./node_modules/@types"
-		]
-	},
-	"include": [
-		"typings/**/*",
-		"src/**/*"
-	],
-	"exclude": [
-		"**/test/**",
-		"**/stories/**"
-	]
-}
diff --git a/packages/js/product-editor/tsconfig.json b/packages/js/product-editor/tsconfig.json
index 535464397c8..76fe9472c41 100644
--- a/packages/js/product-editor/tsconfig.json
+++ b/packages/js/product-editor/tsconfig.json
@@ -1,5 +1,5 @@
 {
-	"extends": "@woocommerce/internal-ts-config/tsconfig.json",
+	"extends": "@woocommerce/internal-build/configs/tsconfig.json",
 	"compilerOptions": {
 		"rootDir": "src",
 		"noCheck": false,
diff --git a/packages/js/product-editor/typings/monorepo-enhancements.d.ts b/packages/js/product-editor/typings/monorepo-enhancements.d.ts
index 696161e42a5..96d21882977 100644
--- a/packages/js/product-editor/typings/monorepo-enhancements.d.ts
+++ b/packages/js/product-editor/typings/monorepo-enhancements.d.ts
@@ -1,5 +1,5 @@
-import '@woocommerce/internal-ts-config/types/@wordpress/data';
-import '@woocommerce/internal-ts-config/types/@wordpress/core-data';
-import '@woocommerce/internal-ts-config/types/@wordpress/block-editor';
-import '@woocommerce/internal-ts-config/types/@wordpress/editor';
-import '@woocommerce/internal-ts-config/types/@wordpress/notices';
+import '@woocommerce/internal-build/type-overrides/@wordpress/data';
+import '@woocommerce/internal-build/type-overrides/@wordpress/core-data';
+import '@woocommerce/internal-build/type-overrides/@wordpress/block-editor';
+import '@woocommerce/internal-build/type-overrides/@wordpress/editor';
+import '@woocommerce/internal-build/type-overrides/@wordpress/notices';
diff --git a/packages/js/product-editor/webpack.config.js b/packages/js/product-editor/webpack.config.js
index 0eb9535e071..1d29a3e722f 100644
--- a/packages/js/product-editor/webpack.config.js
+++ b/packages/js/product-editor/webpack.config.js
@@ -13,7 +13,7 @@ const {
 	plugin,
 	StyleAssetPlugin,
 	WebpackRTLPlugin,
-} = require( '@woocommerce/internal-style-build' );
+} = require( '@woocommerce/internal-build/style-build' );
 const {
 	blockEntryPoints,
 	getBlockMetaData,
@@ -34,7 +34,7 @@ module.exports = {
 			config: [
 				__filename,
 				path.resolve( __dirname, '../../../pnpm-lock.yaml' ),
-				require.resolve( '@woocommerce/internal-style-build' ),
+				require.resolve( '@woocommerce/internal-build/style-build' ),
 			],
 		},
 	},
diff --git a/packages/js/remote-logging/build.mjs b/packages/js/remote-logging/build.mjs
index 746bc61fc4b..2d76d01222e 100644
--- a/packages/js/remote-logging/build.mjs
+++ b/packages/js/remote-logging/build.mjs
@@ -1,112 +1,3 @@
-import { build, context } from 'esbuild';
-import { glob } from 'glob';
-import { rm } from 'node:fs/promises';
-import chokidar from 'chokidar';
+import { runPackageBuilder } from '@woocommerce/internal-build';

-const watch = process.argv.includes( '--watch' );
-const format = process.argv.includes( '--cjs' ) ? 'cjs' : 'esm';
-const outdir = format === 'cjs' ? 'build' : 'build-module';
-
-const ENTRY_GLOB = 'src/**/*.{ts,tsx,js,jsx}';
-const ENTRY_IGNORE = [
-	'**/test/**',
-	'**/stories/**',
-	'**/*.test.{ts,tsx,js,jsx}',
-	'**/*.d.ts',
-];
-
-async function resolveEntryPoints() {
-	return glob( ENTRY_GLOB, { ignore: ENTRY_IGNORE } );
-}
-
-function makeOptions( entryPoints ) {
-	return {
-		entryPoints,
-		outdir,
-		outbase: 'src',
-		bundle: false,
-		format,
-		platform: 'neutral',
-		target: 'esnext',
-		loader: { '.js': 'jsx', '.jsx': 'jsx', '.ts': 'ts', '.tsx': 'tsx' },
-		jsx: 'transform',
-		jsxFactory: 'createElement',
-		jsxFragment: 'Fragment',
-		logLevel: 'warning',
-		sourcemap: false,
-	};
-}
-
-function summarize( result ) {
-	const errors = result.errors.length;
-	const warnings = result.warnings.length;
-	const parts = [];
-	if ( errors ) parts.push( `${ errors } error(s)` );
-	if ( warnings ) parts.push( `${ warnings } warning(s)` );
-	return parts.length ? ` — ${ parts.join( ', ' ) }` : '';
-}
-
-// Wrap a watch-mode step so a single failure (disk error, build crash, etc.)
-// doesn't take the watcher process down. Errors are surfaced; the loop survives.
-async function safe( label, fn ) {
-	try {
-		return await fn();
-	} catch ( error ) {
-		console.error( `[watch] ${ label } failed:`, error?.message ?? error );
-		return null;
-	}
-}
-
-await rm( outdir, { recursive: true, force: true } );
-
-if ( watch ) {
-	const startupT0 = Date.now();
-	let entryPoints = await resolveEntryPoints();
-	let ctx = await context( makeOptions( entryPoints ) );
-	const initial = await safe( 'startup build', () => ctx.rebuild() );
-	console.log( `[watch] ready in ${ Date.now() - startupT0 }ms — ${ entryPoints.length } entry point(s)${ initial ? summarize( initial ) : '' }` );
-
-	// esbuild's own watcher polls the filesystem, which can miss or delay
-	// changes (especially edits to files added after context creation).
-	// chokidar uses OS-level events (fsevents/inotify) and drives rebuilds
-	// directly: changes call ctx.rebuild() (preserves the AST cache),
-	// add/unlink trigger a debounced context restart (entry list changed).
-	let pending;
-	const pendingChanges = new Set();
-	const restart = ( path, kind ) => {
-		pendingChanges.add( `${ path } (${ kind })` );
-		clearTimeout( pending );
-		pending = setTimeout( () => safe( 'restart', async () => {
-			const changes = [ ...pendingChanges ];
-			pendingChanges.clear();
-			const preview = changes.slice( 0, 3 ).join( ', ' );
-			const suffix = changes.length > 3 ? `, +${ changes.length - 3 } more` : '';
-			console.log( `[watch] restarting (${ preview }${ suffix })` );
-			const t0 = Date.now();
-			await ctx.dispose();
-			await rm( outdir, { recursive: true, force: true } );
-			entryPoints = await resolveEntryPoints();
-			ctx = await context( makeOptions( entryPoints ) );
-			const result = await ctx.rebuild();
-			console.log( `[watch] rebuilt in ${ Date.now() - t0 }ms — ${ entryPoints.length } entry point(s)${ summarize( result ) }` );
-		} ), 200 );
-	};
-
-	chokidar
-		.watch( ENTRY_GLOB, { ignored: ENTRY_IGNORE, ignoreInitial: true } )
-		.on( 'add', ( path ) => restart( path, 'added' ) )
-		.on( 'unlink', ( path ) => restart( path, 'deleted' ) )
-		.on( 'change', async ( path ) => {
-			const t0 = Date.now();
-			const result = await safe( `rebuild ${ path }`, () => ctx.rebuild() );
-			if ( result ) {
-				console.log( `[watch] rebuilt ${ path } in ${ Date.now() - t0 }ms${ summarize( result ) }` );
-			}
-		} );
-} else {
-	const entryPoints = await resolveEntryPoints();
-	const t0 = Date.now();
-	console.log( `[build] ${ entryPoints.length } entry point(s)...` );
-	const result = await build( makeOptions( entryPoints ) );
-	console.log( `[build] done in ${ Date.now() - t0 }ms${ summarize( result ) }` );
-}
+await runPackageBuilder( { entryPoints: 'src/**/*.{ts,tsx,js,jsx}' } );
diff --git a/packages/js/remote-logging/package.json b/packages/js/remote-logging/package.json
index 453032afc84..e16b53fa9c4 100644
--- a/packages/js/remote-logging/package.json
+++ b/packages/js/remote-logging/package.json
@@ -20,9 +20,17 @@
 	"bugs": {
 		"url": "https://github.com/woocommerce/woocommerce/issues"
 	},
+	"exports": {
+		".": {
+			"wc-source": "./src/index.ts",
+			"types": "./build-types/index.d.ts",
+			"import": "./build-module/index.js",
+			"require": "./build/index.js"
+		}
+	},
 	"main": "build/index.js",
 	"module": "build-module/index.js",
-	"types": "build-types",
+	"types": "build-types/index.d.ts",
 	"files": [
 		"build",
 		"build-module",
@@ -30,10 +38,10 @@
 	],
 	"scripts": {
 		"build": "pnpm --if-present --workspace-concurrency=Infinity --stream --filter=\"$npm_package_name...\" '/^build:project:.*$/'",
-		"build:project": "pnpm --if-present '/^build:project:.*$/'",
+		"build:project": "pnpm --stream --if-present '/^build:project:.*$/'",
 		"build:project:esm": "node build.mjs",
 		"build:publish:project": "pnpm --if-present '/^build:publish:project:.*$/'",
-		"build:publish:project:cjs": "node build.mjs --cjs",
+		"build:publish:project:cjs": "node build.mjs --commonjs",
 		"build:publish:project:types": "tsc --build --emitDeclarationOnly",
 		"build:publish:project:deps": "pnpm build",
 		"changelog": "XDEBUG_MODE=off composer install --quiet && composer exec -- changelogger",
@@ -67,13 +75,10 @@
 		"@types/jest": "29.5.x",
 		"@types/node": "^24.1.0",
 		"@woocommerce/eslint-plugin": "workspace:*",
+		"@woocommerce/internal-build": "workspace:*",
 		"@woocommerce/internal-js-tests": "workspace:*",
-		"@woocommerce/internal-ts-config": "workspace:*",
 		"@wordpress/jest-console": "^5.4.0",
-		"chokidar": "3.6.x",
-		"esbuild": "0.24.x",
 		"eslint": "^8.55.0",
-		"glob": "^10.3.10",
 		"jest": "29.5.x",
 		"jest-cli": "29.5.x",
 		"jest-environment-jsdom": "29.5.x",
@@ -82,7 +87,14 @@
 		"typescript": "5.7.x"
 	},
 	"publishConfig": {
-		"access": "public"
+		"access": "public",
+		"exports": {
+			".": {
+				"types": "./build-types/index.d.ts",
+				"import": "./build-module/index.js",
+				"require": "./build/index.js"
+			}
+		}
 	},
 	"config": {
 		"ci": {
diff --git a/packages/js/remote-logging/tsconfig-cjs.json b/packages/js/remote-logging/tsconfig-cjs.json
deleted file mode 100644
index 5a4f74e214d..00000000000
--- a/packages/js/remote-logging/tsconfig-cjs.json
+++ /dev/null
@@ -1,18 +0,0 @@
-{
-	"extends": "@woocommerce/internal-ts-config/tsconfig-cjs.json",
-	"compilerOptions": {
-		"rootDir": "src",
-		"outDir": "build",
-		"typeRoots": [
-			"./typings",
-			"./node_modules/@types"
-		]
-	},
-	"include": [
-		"typings/**/*",
-		"src/**/*"
-	],
-	"exclude": [
-		"**/test/**"
-	]
-}
diff --git a/packages/js/remote-logging/tsconfig.json b/packages/js/remote-logging/tsconfig.json
index 5ebf3e08a8a..5366adbfc4b 100644
--- a/packages/js/remote-logging/tsconfig.json
+++ b/packages/js/remote-logging/tsconfig.json
@@ -1,5 +1,5 @@
 {
-	"extends": "@woocommerce/internal-ts-config/tsconfig.json",
+	"extends": "@woocommerce/internal-build/configs/tsconfig.json",
 	"compilerOptions": {
 		"rootDir": "src",
 		"outDir": "build-module",
diff --git a/packages/js/sanitize/build.mjs b/packages/js/sanitize/build.mjs
index 746bc61fc4b..2d76d01222e 100644
--- a/packages/js/sanitize/build.mjs
+++ b/packages/js/sanitize/build.mjs
@@ -1,112 +1,3 @@
-import { build, context } from 'esbuild';
-import { glob } from 'glob';
-import { rm } from 'node:fs/promises';
-import chokidar from 'chokidar';
+import { runPackageBuilder } from '@woocommerce/internal-build';

-const watch = process.argv.includes( '--watch' );
-const format = process.argv.includes( '--cjs' ) ? 'cjs' : 'esm';
-const outdir = format === 'cjs' ? 'build' : 'build-module';
-
-const ENTRY_GLOB = 'src/**/*.{ts,tsx,js,jsx}';
-const ENTRY_IGNORE = [
-	'**/test/**',
-	'**/stories/**',
-	'**/*.test.{ts,tsx,js,jsx}',
-	'**/*.d.ts',
-];
-
-async function resolveEntryPoints() {
-	return glob( ENTRY_GLOB, { ignore: ENTRY_IGNORE } );
-}
-
-function makeOptions( entryPoints ) {
-	return {
-		entryPoints,
-		outdir,
-		outbase: 'src',
-		bundle: false,
-		format,
-		platform: 'neutral',
-		target: 'esnext',
-		loader: { '.js': 'jsx', '.jsx': 'jsx', '.ts': 'ts', '.tsx': 'tsx' },
-		jsx: 'transform',
-		jsxFactory: 'createElement',
-		jsxFragment: 'Fragment',
-		logLevel: 'warning',
-		sourcemap: false,
-	};
-}
-
-function summarize( result ) {
-	const errors = result.errors.length;
-	const warnings = result.warnings.length;
-	const parts = [];
-	if ( errors ) parts.push( `${ errors } error(s)` );
-	if ( warnings ) parts.push( `${ warnings } warning(s)` );
-	return parts.length ? ` — ${ parts.join( ', ' ) }` : '';
-}
-
-// Wrap a watch-mode step so a single failure (disk error, build crash, etc.)
-// doesn't take the watcher process down. Errors are surfaced; the loop survives.
-async function safe( label, fn ) {
-	try {
-		return await fn();
-	} catch ( error ) {
-		console.error( `[watch] ${ label } failed:`, error?.message ?? error );
-		return null;
-	}
-}
-
-await rm( outdir, { recursive: true, force: true } );
-
-if ( watch ) {
-	const startupT0 = Date.now();
-	let entryPoints = await resolveEntryPoints();
-	let ctx = await context( makeOptions( entryPoints ) );
-	const initial = await safe( 'startup build', () => ctx.rebuild() );
-	console.log( `[watch] ready in ${ Date.now() - startupT0 }ms — ${ entryPoints.length } entry point(s)${ initial ? summarize( initial ) : '' }` );
-
-	// esbuild's own watcher polls the filesystem, which can miss or delay
-	// changes (especially edits to files added after context creation).
-	// chokidar uses OS-level events (fsevents/inotify) and drives rebuilds
-	// directly: changes call ctx.rebuild() (preserves the AST cache),
-	// add/unlink trigger a debounced context restart (entry list changed).
-	let pending;
-	const pendingChanges = new Set();
-	const restart = ( path, kind ) => {
-		pendingChanges.add( `${ path } (${ kind })` );
-		clearTimeout( pending );
-		pending = setTimeout( () => safe( 'restart', async () => {
-			const changes = [ ...pendingChanges ];
-			pendingChanges.clear();
-			const preview = changes.slice( 0, 3 ).join( ', ' );
-			const suffix = changes.length > 3 ? `, +${ changes.length - 3 } more` : '';
-			console.log( `[watch] restarting (${ preview }${ suffix })` );
-			const t0 = Date.now();
-			await ctx.dispose();
-			await rm( outdir, { recursive: true, force: true } );
-			entryPoints = await resolveEntryPoints();
-			ctx = await context( makeOptions( entryPoints ) );
-			const result = await ctx.rebuild();
-			console.log( `[watch] rebuilt in ${ Date.now() - t0 }ms — ${ entryPoints.length } entry point(s)${ summarize( result ) }` );
-		} ), 200 );
-	};
-
-	chokidar
-		.watch( ENTRY_GLOB, { ignored: ENTRY_IGNORE, ignoreInitial: true } )
-		.on( 'add', ( path ) => restart( path, 'added' ) )
-		.on( 'unlink', ( path ) => restart( path, 'deleted' ) )
-		.on( 'change', async ( path ) => {
-			const t0 = Date.now();
-			const result = await safe( `rebuild ${ path }`, () => ctx.rebuild() );
-			if ( result ) {
-				console.log( `[watch] rebuilt ${ path } in ${ Date.now() - t0 }ms${ summarize( result ) }` );
-			}
-		} );
-} else {
-	const entryPoints = await resolveEntryPoints();
-	const t0 = Date.now();
-	console.log( `[build] ${ entryPoints.length } entry point(s)...` );
-	const result = await build( makeOptions( entryPoints ) );
-	console.log( `[build] done in ${ Date.now() - t0 }ms${ summarize( result ) }` );
-}
+await runPackageBuilder( { entryPoints: 'src/**/*.{ts,tsx,js,jsx}' } );
diff --git a/packages/js/sanitize/package.json b/packages/js/sanitize/package.json
index a93d13c35e6..a9500688d4c 100644
--- a/packages/js/sanitize/package.json
+++ b/packages/js/sanitize/package.json
@@ -2,6 +2,14 @@
 	"name": "@woocommerce/sanitize",
 	"version": "1.0.0",
 	"description": "WooCommerce HTML sanitization utilities.",
+	"exports": {
+		".": {
+			"wc-source": "./src/index.ts",
+			"types": "./build-types/index.d.ts",
+			"import": "./build-module/index.js",
+			"require": "./build/index.js"
+		}
+	},
 	"main": "build/index.js",
 	"module": "build-module/index.js",
 	"types": "build-types/index.d.ts",
@@ -38,13 +46,10 @@
 		"@types/jest": "29.5.x",
 		"@types/trusted-types": "^2.0.7",
 		"@woocommerce/eslint-plugin": "workspace:*",
+		"@woocommerce/internal-build": "workspace:*",
 		"@woocommerce/internal-js-tests": "workspace:*",
-		"@woocommerce/internal-ts-config": "workspace:*",
 		"@wordpress/scripts": "^27.0.0",
-		"chokidar": "3.6.x",
-		"esbuild": "0.24.x",
 		"eslint": "^8.55.0",
-		"glob": "^10.3.10",
 		"jest": "29.5.x",
 		"jest-cli": "29.5.x",
 		"jest-environment-jsdom": "29.5.x",
@@ -59,14 +64,21 @@
 		"react-dom": "18.3.x"
 	},
 	"publishConfig": {
-		"access": "public"
+		"access": "public",
+		"exports": {
+			".": {
+				"types": "./build-types/index.d.ts",
+				"import": "./build-module/index.js",
+				"require": "./build/index.js"
+			}
+		}
 	},
 	"scripts": {
 		"build": "pnpm --if-present --workspace-concurrency=Infinity --stream --filter=\"$npm_package_name...\" '/^build:project:.*$/'",
-		"build:project": "pnpm --if-present '/^build:project:.*$/'",
+		"build:project": "pnpm --stream --if-present '/^build:project:.*$/'",
 		"build:project:esm": "node build.mjs",
 		"build:publish:project": "pnpm --if-present '/^build:publish:project:.*$/'",
-		"build:publish:project:cjs": "node build.mjs --cjs",
+		"build:publish:project:cjs": "node build.mjs --commonjs",
 		"build:publish:project:types": "tsc --build --emitDeclarationOnly",
 		"build:publish:project:deps": "pnpm build",
 		"changelog": "XDEBUG_MODE=off composer install --quiet && composer exec -- changelogger",
diff --git a/packages/js/sanitize/tsconfig-cjs.json b/packages/js/sanitize/tsconfig-cjs.json
deleted file mode 100644
index b9a31b8c427..00000000000
--- a/packages/js/sanitize/tsconfig-cjs.json
+++ /dev/null
@@ -1,18 +0,0 @@
-{
-	"extends": "@woocommerce/internal-ts-config/tsconfig-cjs.json",
-	"compilerOptions": {
-		"rootDir": "src",
-		"outDir": "build",
-		"typeRoots": [
-			"./typings",
-			"./node_modules/@types"
-		]
-	},
-	"include": [
-		"typings/**/*",
-		"src/**/*"
-	],
-	"exclude": [
-		"**/test/**"
-	]
-}
diff --git a/packages/js/sanitize/tsconfig.json b/packages/js/sanitize/tsconfig.json
index 344c7e4527e..a6eed2b6ec5 100644
--- a/packages/js/sanitize/tsconfig.json
+++ b/packages/js/sanitize/tsconfig.json
@@ -1,5 +1,5 @@
 {
-	"extends": "@woocommerce/internal-ts-config/tsconfig.json",
+	"extends": "@woocommerce/internal-build/configs/tsconfig.json",
 	"compilerOptions": {
 		"rootDir": "src",
 		"noCheck": false,
diff --git a/packages/js/settings-ui-sdk/build.mjs b/packages/js/settings-ui-sdk/build.mjs
index 746bc61fc4b..2d76d01222e 100644
--- a/packages/js/settings-ui-sdk/build.mjs
+++ b/packages/js/settings-ui-sdk/build.mjs
@@ -1,112 +1,3 @@
-import { build, context } from 'esbuild';
-import { glob } from 'glob';
-import { rm } from 'node:fs/promises';
-import chokidar from 'chokidar';
+import { runPackageBuilder } from '@woocommerce/internal-build';

-const watch = process.argv.includes( '--watch' );
-const format = process.argv.includes( '--cjs' ) ? 'cjs' : 'esm';
-const outdir = format === 'cjs' ? 'build' : 'build-module';
-
-const ENTRY_GLOB = 'src/**/*.{ts,tsx,js,jsx}';
-const ENTRY_IGNORE = [
-	'**/test/**',
-	'**/stories/**',
-	'**/*.test.{ts,tsx,js,jsx}',
-	'**/*.d.ts',
-];
-
-async function resolveEntryPoints() {
-	return glob( ENTRY_GLOB, { ignore: ENTRY_IGNORE } );
-}
-
-function makeOptions( entryPoints ) {
-	return {
-		entryPoints,
-		outdir,
-		outbase: 'src',
-		bundle: false,
-		format,
-		platform: 'neutral',
-		target: 'esnext',
-		loader: { '.js': 'jsx', '.jsx': 'jsx', '.ts': 'ts', '.tsx': 'tsx' },
-		jsx: 'transform',
-		jsxFactory: 'createElement',
-		jsxFragment: 'Fragment',
-		logLevel: 'warning',
-		sourcemap: false,
-	};
-}
-
-function summarize( result ) {
-	const errors = result.errors.length;
-	const warnings = result.warnings.length;
-	const parts = [];
-	if ( errors ) parts.push( `${ errors } error(s)` );
-	if ( warnings ) parts.push( `${ warnings } warning(s)` );
-	return parts.length ? ` — ${ parts.join( ', ' ) }` : '';
-}
-
-// Wrap a watch-mode step so a single failure (disk error, build crash, etc.)
-// doesn't take the watcher process down. Errors are surfaced; the loop survives.
-async function safe( label, fn ) {
-	try {
-		return await fn();
-	} catch ( error ) {
-		console.error( `[watch] ${ label } failed:`, error?.message ?? error );
-		return null;
-	}
-}
-
-await rm( outdir, { recursive: true, force: true } );
-
-if ( watch ) {
-	const startupT0 = Date.now();
-	let entryPoints = await resolveEntryPoints();
-	let ctx = await context( makeOptions( entryPoints ) );
-	const initial = await safe( 'startup build', () => ctx.rebuild() );
-	console.log( `[watch] ready in ${ Date.now() - startupT0 }ms — ${ entryPoints.length } entry point(s)${ initial ? summarize( initial ) : '' }` );
-
-	// esbuild's own watcher polls the filesystem, which can miss or delay
-	// changes (especially edits to files added after context creation).
-	// chokidar uses OS-level events (fsevents/inotify) and drives rebuilds
-	// directly: changes call ctx.rebuild() (preserves the AST cache),
-	// add/unlink trigger a debounced context restart (entry list changed).
-	let pending;
-	const pendingChanges = new Set();
-	const restart = ( path, kind ) => {
-		pendingChanges.add( `${ path } (${ kind })` );
-		clearTimeout( pending );
-		pending = setTimeout( () => safe( 'restart', async () => {
-			const changes = [ ...pendingChanges ];
-			pendingChanges.clear();
-			const preview = changes.slice( 0, 3 ).join( ', ' );
-			const suffix = changes.length > 3 ? `, +${ changes.length - 3 } more` : '';
-			console.log( `[watch] restarting (${ preview }${ suffix })` );
-			const t0 = Date.now();
-			await ctx.dispose();
-			await rm( outdir, { recursive: true, force: true } );
-			entryPoints = await resolveEntryPoints();
-			ctx = await context( makeOptions( entryPoints ) );
-			const result = await ctx.rebuild();
-			console.log( `[watch] rebuilt in ${ Date.now() - t0 }ms — ${ entryPoints.length } entry point(s)${ summarize( result ) }` );
-		} ), 200 );
-	};
-
-	chokidar
-		.watch( ENTRY_GLOB, { ignored: ENTRY_IGNORE, ignoreInitial: true } )
-		.on( 'add', ( path ) => restart( path, 'added' ) )
-		.on( 'unlink', ( path ) => restart( path, 'deleted' ) )
-		.on( 'change', async ( path ) => {
-			const t0 = Date.now();
-			const result = await safe( `rebuild ${ path }`, () => ctx.rebuild() );
-			if ( result ) {
-				console.log( `[watch] rebuilt ${ path } in ${ Date.now() - t0 }ms${ summarize( result ) }` );
-			}
-		} );
-} else {
-	const entryPoints = await resolveEntryPoints();
-	const t0 = Date.now();
-	console.log( `[build] ${ entryPoints.length } entry point(s)...` );
-	const result = await build( makeOptions( entryPoints ) );
-	console.log( `[build] done in ${ Date.now() - t0 }ms${ summarize( result ) }` );
-}
+await runPackageBuilder( { entryPoints: 'src/**/*.{ts,tsx,js,jsx}' } );
diff --git a/packages/js/settings-ui-sdk/package.json b/packages/js/settings-ui-sdk/package.json
index 01e7899ce93..5a8a32c949d 100644
--- a/packages/js/settings-ui-sdk/package.json
+++ b/packages/js/settings-ui-sdk/package.json
@@ -17,9 +17,17 @@
 	"bugs": {
 		"url": "https://github.com/woocommerce/woocommerce/issues"
 	},
+	"exports": {
+		".": {
+			"wc-source": "./src/index.ts",
+			"types": "./build-types/index.d.ts",
+			"import": "./build-module/index.js",
+			"require": "./build/index.js"
+		}
+	},
 	"main": "build/index.js",
 	"module": "build-module/index.js",
-	"types": "build-types",
+	"types": "build-types/index.d.ts",
 	"react-native": "src/index",
 	"files": [
 		"build",
@@ -38,12 +46,9 @@
 		"@types/jest": "29.5.x",
 		"@types/react": "18.3.x",
 		"@woocommerce/eslint-plugin": "workspace:*",
+		"@woocommerce/internal-build": "workspace:*",
 		"@woocommerce/internal-js-tests": "workspace:*",
-		"@woocommerce/internal-ts-config": "workspace:*",
-		"chokidar": "3.6.x",
-		"esbuild": "0.24.x",
 		"eslint": "^8.55.0",
-		"glob": "^10.3.10",
 		"jest": "29.5.x",
 		"jest-cli": "29.5.x",
 		"jest-environment-jsdom": "29.5.x",
@@ -57,14 +62,21 @@
 		"react-dom": "18.3.x"
 	},
 	"publishConfig": {
-		"access": "public"
+		"access": "public",
+		"exports": {
+			".": {
+				"types": "./build-types/index.d.ts",
+				"import": "./build-module/index.js",
+				"require": "./build/index.js"
+			}
+		}
 	},
 	"scripts": {
 		"build": "pnpm --if-present --workspace-concurrency=Infinity --stream --filter=\"$npm_package_name...\" '/^build:project:.*$/'",
-		"build:project": "pnpm --if-present '/^build:project:.*$/'",
+		"build:project": "pnpm --stream --if-present '/^build:project:.*$/'",
 		"build:project:esm": "node build.mjs",
 		"build:publish:project": "pnpm --if-present '/^build:publish:project:.*$/'",
-		"build:publish:project:cjs": "node build.mjs --cjs",
+		"build:publish:project:cjs": "node build.mjs --commonjs",
 		"build:publish:project:types": "tsc --build --emitDeclarationOnly",
 		"build:publish:project:deps": "pnpm build",
 		"lint": "pnpm --if-present '/^lint:lang:.*$/'",
diff --git a/packages/js/settings-ui-sdk/tsconfig-cjs.json b/packages/js/settings-ui-sdk/tsconfig-cjs.json
deleted file mode 100644
index 78af0d193db..00000000000
--- a/packages/js/settings-ui-sdk/tsconfig-cjs.json
+++ /dev/null
@@ -1,10 +0,0 @@
-{
-	"extends": "@woocommerce/internal-ts-config/tsconfig-cjs.json",
-	"compilerOptions": {
-		"rootDir": "src",
-		"outDir": "build",
-		"typeRoots": [ "./node_modules/@types" ]
-	},
-	"include": [ "src/**/*" ],
-	"exclude": [ "**/test/**" ]
-}
diff --git a/packages/js/settings-ui-sdk/tsconfig.json b/packages/js/settings-ui-sdk/tsconfig.json
index aaf85323f16..3a58bca52cf 100644
--- a/packages/js/settings-ui-sdk/tsconfig.json
+++ b/packages/js/settings-ui-sdk/tsconfig.json
@@ -1,5 +1,5 @@
 {
-	"extends": "@woocommerce/internal-ts-config/tsconfig.json",
+	"extends": "@woocommerce/internal-build/configs/tsconfig.json",
 	"compilerOptions": {
 		"rootDir": "src",
 		"noCheck": false,
diff --git a/packages/js/tracks/build.mjs b/packages/js/tracks/build.mjs
index 746bc61fc4b..2d76d01222e 100644
--- a/packages/js/tracks/build.mjs
+++ b/packages/js/tracks/build.mjs
@@ -1,112 +1,3 @@
-import { build, context } from 'esbuild';
-import { glob } from 'glob';
-import { rm } from 'node:fs/promises';
-import chokidar from 'chokidar';
+import { runPackageBuilder } from '@woocommerce/internal-build';

-const watch = process.argv.includes( '--watch' );
-const format = process.argv.includes( '--cjs' ) ? 'cjs' : 'esm';
-const outdir = format === 'cjs' ? 'build' : 'build-module';
-
-const ENTRY_GLOB = 'src/**/*.{ts,tsx,js,jsx}';
-const ENTRY_IGNORE = [
-	'**/test/**',
-	'**/stories/**',
-	'**/*.test.{ts,tsx,js,jsx}',
-	'**/*.d.ts',
-];
-
-async function resolveEntryPoints() {
-	return glob( ENTRY_GLOB, { ignore: ENTRY_IGNORE } );
-}
-
-function makeOptions( entryPoints ) {
-	return {
-		entryPoints,
-		outdir,
-		outbase: 'src',
-		bundle: false,
-		format,
-		platform: 'neutral',
-		target: 'esnext',
-		loader: { '.js': 'jsx', '.jsx': 'jsx', '.ts': 'ts', '.tsx': 'tsx' },
-		jsx: 'transform',
-		jsxFactory: 'createElement',
-		jsxFragment: 'Fragment',
-		logLevel: 'warning',
-		sourcemap: false,
-	};
-}
-
-function summarize( result ) {
-	const errors = result.errors.length;
-	const warnings = result.warnings.length;
-	const parts = [];
-	if ( errors ) parts.push( `${ errors } error(s)` );
-	if ( warnings ) parts.push( `${ warnings } warning(s)` );
-	return parts.length ? ` — ${ parts.join( ', ' ) }` : '';
-}
-
-// Wrap a watch-mode step so a single failure (disk error, build crash, etc.)
-// doesn't take the watcher process down. Errors are surfaced; the loop survives.
-async function safe( label, fn ) {
-	try {
-		return await fn();
-	} catch ( error ) {
-		console.error( `[watch] ${ label } failed:`, error?.message ?? error );
-		return null;
-	}
-}
-
-await rm( outdir, { recursive: true, force: true } );
-
-if ( watch ) {
-	const startupT0 = Date.now();
-	let entryPoints = await resolveEntryPoints();
-	let ctx = await context( makeOptions( entryPoints ) );
-	const initial = await safe( 'startup build', () => ctx.rebuild() );
-	console.log( `[watch] ready in ${ Date.now() - startupT0 }ms — ${ entryPoints.length } entry point(s)${ initial ? summarize( initial ) : '' }` );
-
-	// esbuild's own watcher polls the filesystem, which can miss or delay
-	// changes (especially edits to files added after context creation).
-	// chokidar uses OS-level events (fsevents/inotify) and drives rebuilds
-	// directly: changes call ctx.rebuild() (preserves the AST cache),
-	// add/unlink trigger a debounced context restart (entry list changed).
-	let pending;
-	const pendingChanges = new Set();
-	const restart = ( path, kind ) => {
-		pendingChanges.add( `${ path } (${ kind })` );
-		clearTimeout( pending );
-		pending = setTimeout( () => safe( 'restart', async () => {
-			const changes = [ ...pendingChanges ];
-			pendingChanges.clear();
-			const preview = changes.slice( 0, 3 ).join( ', ' );
-			const suffix = changes.length > 3 ? `, +${ changes.length - 3 } more` : '';
-			console.log( `[watch] restarting (${ preview }${ suffix })` );
-			const t0 = Date.now();
-			await ctx.dispose();
-			await rm( outdir, { recursive: true, force: true } );
-			entryPoints = await resolveEntryPoints();
-			ctx = await context( makeOptions( entryPoints ) );
-			const result = await ctx.rebuild();
-			console.log( `[watch] rebuilt in ${ Date.now() - t0 }ms — ${ entryPoints.length } entry point(s)${ summarize( result ) }` );
-		} ), 200 );
-	};
-
-	chokidar
-		.watch( ENTRY_GLOB, { ignored: ENTRY_IGNORE, ignoreInitial: true } )
-		.on( 'add', ( path ) => restart( path, 'added' ) )
-		.on( 'unlink', ( path ) => restart( path, 'deleted' ) )
-		.on( 'change', async ( path ) => {
-			const t0 = Date.now();
-			const result = await safe( `rebuild ${ path }`, () => ctx.rebuild() );
-			if ( result ) {
-				console.log( `[watch] rebuilt ${ path } in ${ Date.now() - t0 }ms${ summarize( result ) }` );
-			}
-		} );
-} else {
-	const entryPoints = await resolveEntryPoints();
-	const t0 = Date.now();
-	console.log( `[build] ${ entryPoints.length } entry point(s)...` );
-	const result = await build( makeOptions( entryPoints ) );
-	console.log( `[build] done in ${ Date.now() - t0 }ms${ summarize( result ) }` );
-}
+await runPackageBuilder( { entryPoints: 'src/**/*.{ts,tsx,js,jsx}' } );
diff --git a/packages/js/tracks/package.json b/packages/js/tracks/package.json
index c4910f1bb6a..5f526f5af19 100644
--- a/packages/js/tracks/package.json
+++ b/packages/js/tracks/package.json
@@ -20,9 +20,17 @@
 	"bugs": {
 		"url": "https://github.com/woocommerce/woocommerce/issues"
 	},
+	"exports": {
+		".": {
+			"wc-source": "./src/index.ts",
+			"types": "./build-types/index.d.ts",
+			"import": "./build-module/index.js",
+			"require": "./build/index.js"
+		}
+	},
 	"main": "build/index.js",
 	"module": "build-module/index.js",
-	"types": "build-types",
+	"types": "build-types/index.d.ts",
 	"react-native": "src/index",
 	"files": [
 		"build",
@@ -33,14 +41,21 @@
 		"debug": "^4.3.4"
 	},
 	"publishConfig": {
-		"access": "public"
+		"access": "public",
+		"exports": {
+			".": {
+				"types": "./build-types/index.d.ts",
+				"import": "./build-module/index.js",
+				"require": "./build/index.js"
+			}
+		}
 	},
 	"scripts": {
 		"build": "pnpm --if-present --workspace-concurrency=Infinity --stream --filter=\"$npm_package_name...\" '/^build:project:.*$/'",
-		"build:project": "pnpm --if-present '/^build:project:.*$/'",
+		"build:project": "pnpm --stream --if-present '/^build:project:.*$/'",
 		"build:project:esm": "node build.mjs",
 		"build:publish:project": "pnpm --if-present '/^build:publish:project:.*$/'",
-		"build:publish:project:cjs": "node build.mjs --cjs",
+		"build:publish:project:cjs": "node build.mjs --commonjs",
 		"build:publish:project:types": "tsc --build --emitDeclarationOnly",
 		"build:publish:project:deps": "pnpm build",
 		"changelog": "XDEBUG_MODE=off composer install --quiet && composer exec -- changelogger",
@@ -62,12 +77,9 @@
 		"@types/jest": "29.5.x",
 		"@types/node": "^24.1.0",
 		"@woocommerce/eslint-plugin": "workspace:*",
+		"@woocommerce/internal-build": "workspace:*",
 		"@woocommerce/internal-js-tests": "workspace:*",
-		"@woocommerce/internal-ts-config": "workspace:*",
-		"chokidar": "3.6.x",
-		"esbuild": "0.24.x",
 		"eslint": "^8.55.0",
-		"glob": "^10.3.10",
 		"jest": "29.5.x",
 		"jest-cli": "29.5.x",
 		"jest-environment-jsdom": "29.5.x",
diff --git a/packages/js/tracks/tsconfig-cjs.json b/packages/js/tracks/tsconfig-cjs.json
deleted file mode 100644
index 5a4f74e214d..00000000000
--- a/packages/js/tracks/tsconfig-cjs.json
+++ /dev/null
@@ -1,18 +0,0 @@
-{
-	"extends": "@woocommerce/internal-ts-config/tsconfig-cjs.json",
-	"compilerOptions": {
-		"rootDir": "src",
-		"outDir": "build",
-		"typeRoots": [
-			"./typings",
-			"./node_modules/@types"
-		]
-	},
-	"include": [
-		"typings/**/*",
-		"src/**/*"
-	],
-	"exclude": [
-		"**/test/**"
-	]
-}
diff --git a/packages/js/tracks/tsconfig.json b/packages/js/tracks/tsconfig.json
index 2cb6f5a848f..be24cae4c13 100644
--- a/packages/js/tracks/tsconfig.json
+++ b/packages/js/tracks/tsconfig.json
@@ -1,5 +1,5 @@
 {
-	"extends": "@woocommerce/internal-ts-config/tsconfig.json",
+	"extends": "@woocommerce/internal-build/configs/tsconfig.json",
 	"compilerOptions": {
 		"rootDir": "src",
 		"outDir": "build-module",
diff --git a/plugins/woocommerce/client/admin/client/homescreen/mobile-app-modal/components/useJetpackPluginState.tsx b/plugins/woocommerce/client/admin/client/homescreen/mobile-app-modal/components/useJetpackPluginState.tsx
index 928e768cd59..fe2b63a5e00 100644
--- a/plugins/woocommerce/client/admin/client/homescreen/mobile-app-modal/components/useJetpackPluginState.tsx
+++ b/plugins/woocommerce/client/admin/client/homescreen/mobile-app-modal/components/useJetpackPluginState.tsx
@@ -4,7 +4,6 @@
 import { useState, useEffect, useCallback } from '@wordpress/element';
 import { useSelect, useDispatch } from '@wordpress/data';
 import { pluginsStore, useUser } from '@woocommerce/data';
-import { createErrorNotice } from '@woocommerce/data/src/plugins/actions';

 export const JetpackPluginStates = {
 	/** Jetpack plugin is not installed, can use installHandler() to install */
@@ -53,6 +52,7 @@ export const useJetpackPluginState = () => {
 	);

 	const { installJetpackAndConnect } = useDispatch( pluginsStore );
+	const { createErrorNotice } = useDispatch( 'core/notices' );

 	const [ pluginState, setPluginState ] = useState< JetpackPluginStates >(
 		JetpackPluginStates.INITIALIZING
@@ -68,7 +68,7 @@ export const useJetpackPluginState = () => {
 			() => thisUrl + '&jetpackState=returning'
 		);
 		setPluginState( JetpackPluginStates.INSTALLING );
-	}, [ installJetpackAndConnect ] );
+	}, [ installJetpackAndConnect, createErrorNotice ] );

 	useEffect( () => {
 		if ( ! canUserInstallPlugins ) {
diff --git a/plugins/woocommerce/client/admin/client/homescreen/stats-overview/install-jetpack-cta.js b/plugins/woocommerce/client/admin/client/homescreen/stats-overview/install-jetpack-cta.js
index c5e06fecdb4..ba766d9633a 100644
--- a/plugins/woocommerce/client/admin/client/homescreen/stats-overview/install-jetpack-cta.js
+++ b/plugins/woocommerce/client/admin/client/homescreen/stats-overview/install-jetpack-cta.js
@@ -8,7 +8,6 @@ import { pluginsStore, useUser, useUserPreferences } from '@woocommerce/data';
 import { H } from '@woocommerce/components';
 import { recordEvent } from '@woocommerce/tracks';
 import { getAdminLink } from '@woocommerce/settings';
-import { createErrorNotice } from '@woocommerce/data/src/plugins/actions';

 const getJetpackInstallText = ( jetpackInstallState ) => {
 	return (
@@ -89,6 +88,7 @@ export const InstallJetpackCTA = () => {
 	);

 	const { installJetpackAndConnect } = useDispatch( pluginsStore );
+	const { createErrorNotice } = useDispatch( 'core/notices' );

 	if ( ! canUserInstallPlugins ) {
 		return null;
diff --git a/plugins/woocommerce/client/admin/client/settings-payments/components/buttons/test/enable-gateway-button.test.tsx b/plugins/woocommerce/client/admin/client/settings-payments/components/buttons/test/enable-gateway-button.test.tsx
index 6a53c4127c7..806081f3e35 100644
--- a/plugins/woocommerce/client/admin/client/settings-payments/components/buttons/test/enable-gateway-button.test.tsx
+++ b/plugins/woocommerce/client/admin/client/settings-payments/components/buttons/test/enable-gateway-button.test.tsx
@@ -21,6 +21,7 @@ jest.mock( '@woocommerce/data', () => ( {
 } ) );

 jest.mock( '@wordpress/data', () => ( {
+	...jest.requireActual( '@wordpress/data' ),
 	dispatch: jest.fn( () => ( {
 		createErrorNotice: mockCreateErrorNotice,
 	} ) ),
diff --git a/plugins/woocommerce/client/admin/client/typings/monorepo-enhancements.d.ts b/plugins/woocommerce/client/admin/client/typings/monorepo-enhancements.d.ts
index 0672096c4ba..df7b2aa1306 100644
--- a/plugins/woocommerce/client/admin/client/typings/monorepo-enhancements.d.ts
+++ b/plugins/woocommerce/client/admin/client/typings/monorepo-enhancements.d.ts
@@ -1,3 +1,3 @@
-import '@woocommerce/internal-ts-config/types/@wordpress/data';
-import '@woocommerce/internal-ts-config/types/@wordpress/core-data';
-import '@woocommerce/internal-ts-config/types/@wordpress/editor';
+import '@woocommerce/internal-build/type-overrides/@wordpress/data';
+import '@woocommerce/internal-build/type-overrides/@wordpress/core-data';
+import '@woocommerce/internal-build/type-overrides/@wordpress/editor';
diff --git a/plugins/woocommerce/client/admin/package.json b/plugins/woocommerce/client/admin/package.json
index 4eb56a73d92..2f03e67f8e2 100644
--- a/plugins/woocommerce/client/admin/package.json
+++ b/plugins/woocommerce/client/admin/package.json
@@ -160,9 +160,8 @@
 		"@woocommerce/dependency-extraction-webpack-plugin": "workspace:*",
 		"@woocommerce/eslint-plugin": "workspace:*",
 		"@woocommerce/experimental-products-app": "workspace:*",
+		"@woocommerce/internal-build": "workspace:*",
 		"@woocommerce/internal-js-tests": "workspace:*",
-		"@woocommerce/internal-style-build": "workspace:*",
-		"@woocommerce/internal-ts-config": "workspace:*",
 		"@woocommerce/notices": "workspace:*",
 		"@wordpress/babel-preset-default": "next",
 		"@wordpress/block-editor": "catalog:wp-min",
@@ -347,17 +346,15 @@
 				"node_modules/@woocommerce/experimental-products-app/build",
 				"node_modules/@woocommerce/experimental-products-app/build-style",
 				"node_modules/@woocommerce/experimental-products-app/build-types",
+				"node_modules/@woocommerce/internal-build/build-types",
+				"node_modules/@woocommerce/internal-build/configs",
+				"node_modules/@woocommerce/internal-build/src/style-build",
+				"node_modules/@woocommerce/internal-build/styles",
+				"node_modules/@woocommerce/internal-build/type-overrides",
+				"node_modules/@woocommerce/internal-build/scripts",
 				"node_modules/@woocommerce/internal-js-tests/build",
-				"node_modules/@woocommerce/internal-js-tests/build-module",
+				"node_modules/@woocommerce/internal-js-tests/build-types",
 				"node_modules/@woocommerce/internal-js-tests/jest-preset.js",
-				"node_modules/@woocommerce/internal-style-build/index.js",
-				"node_modules/@woocommerce/internal-style-build/webpack-rtl-plugin.js",
-				"node_modules/@woocommerce/internal-style-build/style-asset-plugin.js",
-				"node_modules/@woocommerce/internal-style-build/abstracts",
-				"node_modules/@woocommerce/internal-ts-config/tsconfig.json",
-				"node_modules/@woocommerce/internal-ts-config/tsconfig-cjs.json",
-				"node_modules/@woocommerce/internal-ts-config/tsconfig-jest.json",
-				"node_modules/@woocommerce/internal-ts-config/types",
 				"node_modules/@woocommerce/notices/build",
 				"node_modules/@woocommerce/notices/build-types"
 			]
diff --git a/plugins/woocommerce/client/admin/webpack.config.js b/plugins/woocommerce/client/admin/webpack.config.js
index 9e96f337171..46346bb4b20 100644
--- a/plugins/woocommerce/client/admin/webpack.config.js
+++ b/plugins/woocommerce/client/admin/webpack.config.js
@@ -16,7 +16,7 @@ const CustomTemplatedPathPlugin = require( './bin/custom-templated-path-webpack-
 const UnminifyWebpackPlugin = require( './bin/unminify-webpack-plugin.js' );
 const {
 	webpackConfig: styleConfig,
-} = require( '@woocommerce/internal-style-build' );
+} = require( '@woocommerce/internal-build/style-build' );
 const WooCommerceDependencyExtractionWebpackPlugin = require( '@woocommerce/dependency-extraction-webpack-plugin/src/index' );

 const NODE_ENV = process.env.NODE_ENV || 'development';
@@ -106,7 +106,7 @@ const webpackConfig = {
 								'@woocommerce/dependency-extraction-webpack-plugin'
 							),
 							require.resolve(
-								'@woocommerce/internal-style-build'
+								'@woocommerce/internal-build/style-build'
 							),
 						],
 					},
diff --git a/plugins/woocommerce/client/blocks/bin/webpack-config-interactive-blocks.js b/plugins/woocommerce/client/blocks/bin/webpack-config-interactive-blocks.js
index 5a0eeee4004..e6ff03045cd 100644
--- a/plugins/woocommerce/client/blocks/bin/webpack-config-interactive-blocks.js
+++ b/plugins/woocommerce/client/blocks/bin/webpack-config-interactive-blocks.js
@@ -14,7 +14,9 @@ const RemoveFilesPlugin = require( './remove-files-webpack-plugin' );
  */
 const DependencyExtractionWebpackPlugin = require( '@woocommerce/dependency-extraction-webpack-plugin' );
 const FilesystemCacheWarningsPlugin = require( './filesystem-cache-warnings-webpack-plugin.js' );
-const { WebpackRTLPlugin } = require( '@woocommerce/internal-style-build' );
+const {
+	WebpackRTLPlugin,
+} = require( '@woocommerce/internal-build/style-build' );
 const { sharedOptimizationConfig } = require( './webpack-shared-config' );
 const {
 	scriptModuleEntries,
diff --git a/plugins/woocommerce/client/blocks/bin/webpack-configs.js b/plugins/woocommerce/client/blocks/bin/webpack-configs.js
index a863661681f..2d3f0d675b0 100644
--- a/plugins/woocommerce/client/blocks/bin/webpack-configs.js
+++ b/plugins/woocommerce/client/blocks/bin/webpack-configs.js
@@ -17,7 +17,9 @@ const CopyWebpackPlugin = require( 'copy-webpack-plugin' );
  */
 const DependencyExtractionWebpackPlugin = require( '@woocommerce/dependency-extraction-webpack-plugin' );
 const FilesystemCacheWarningsPlugin = require( './filesystem-cache-warnings-webpack-plugin.js' );
-const { WebpackRTLPlugin } = require( '@woocommerce/internal-style-build' );
+const {
+	WebpackRTLPlugin,
+} = require( '@woocommerce/internal-build/style-build' );
 const { getEntryConfig, genericBlocks } = require( './webpack-entries' );
 const {
 	ASSET_CHECK,
diff --git a/plugins/woocommerce/client/blocks/docs/contributors/coding-guidelines.md b/plugins/woocommerce/client/blocks/docs/contributors/coding-guidelines.md
index 8e88ec7cac2..e435df629af 100644
--- a/plugins/woocommerce/client/blocks/docs/contributors/coding-guidelines.md
+++ b/plugins/woocommerce/client/blocks/docs/contributors/coding-guidelines.md
@@ -68,7 +68,7 @@ Naming is not strictly tied to the DOM so it **doesn’t matter how many nested

 ## RTL Styles

-Blocks uses the internal `@woocommerce/internal-style-build/webpack-rtl-plugin` package to generate styles for Right-to-Left languages. These are generated automatically.
+Blocks uses the internal `WebpackRTLPlugin` exported from `@woocommerce/internal-build/style-build` to generate styles for Right-to-Left languages. These are generated automatically.

 To make adjustments to the generated RTL styles, for example, excluding certain rules from the RTL stylesheets, you should use the [control directives here](https://rtlcss.com/learn/usage-guide/control-directives/index.html).

diff --git a/plugins/woocommerce/client/blocks/docs/contributors/css-build-system.md b/plugins/woocommerce/client/blocks/docs/contributors/css-build-system.md
index 099d1c11727..8d1356d4b21 100644
--- a/plugins/woocommerce/client/blocks/docs/contributors/css-build-system.md
+++ b/plugins/woocommerce/client/blocks/docs/contributors/css-build-system.md
@@ -15,7 +15,7 @@ CSS files are built with Webpack, which gathers all SCSS files in the app and pr

 ## Right-to-left

-All files described above are generated in a LTR version and a RTL version. The RTL version is generated automatically with the internal `@woocommerce/internal-style-build/webpack-rtl-plugin` and has a `-rtl.css` suffix at the end of the file name.
+All files described above are generated in a LTR version and a RTL version. The RTL version is generated automatically with the internal `WebpackRTLPlugin` exported from `@woocommerce/internal-build/style-build` and has a `-rtl.css` suffix at the end of the file name.

 ## Relevant files

diff --git a/plugins/woocommerce/client/blocks/package.json b/plugins/woocommerce/client/blocks/package.json
index ba79699affe..5892487115c 100644
--- a/plugins/woocommerce/client/blocks/package.json
+++ b/plugins/woocommerce/client/blocks/package.json
@@ -104,7 +104,6 @@
 	},
 	"devDependencies": {
 		"@automattic/color-studio": "4.0.0",
-		"@woocommerce/internal-ts-config": "workspace:*",
 		"@babel/cli": "7.25.7",
 		"@babel/core": "7.25.7",
 		"@babel/plugin-syntax-jsx": "7.25.7",
@@ -144,7 +143,7 @@
 		"@woocommerce/customer-effort-score": "workspace:*",
 		"@woocommerce/data": "workspace:*",
 		"@woocommerce/dependency-extraction-webpack-plugin": "workspace:*",
-		"@woocommerce/internal-style-build": "workspace:*",
+		"@woocommerce/internal-build": "workspace:*",
 		"@woocommerce/eslint-plugin": "workspace:*",
 		"@wordpress/api-fetch": "catalog:wp-min",
 		"@wordpress/babel-preset-default": "next",
@@ -445,10 +444,6 @@
 				"node_modules/@woocommerce/sanitize/build-types",
 				"node_modules/@woocommerce/tracks/build",
 				"node_modules/@woocommerce/tracks/build-types",
-				"node_modules/@woocommerce/internal-ts-config/tsconfig.json",
-				"node_modules/@woocommerce/internal-ts-config/tsconfig-cjs.json",
-				"node_modules/@woocommerce/internal-ts-config/tsconfig-jest.json",
-				"node_modules/@woocommerce/internal-ts-config/types",
 				"node_modules/@woocommerce/customer-effort-score/build",
 				"node_modules/@woocommerce/customer-effort-score/build-style",
 				"node_modules/@woocommerce/customer-effort-score/build-types",
@@ -456,10 +451,12 @@
 				"node_modules/@woocommerce/data/build-types",
 				"node_modules/@woocommerce/dependency-extraction-webpack-plugin/src/",
 				"node_modules/@woocommerce/dependency-extraction-webpack-plugin/assets/",
-				"node_modules/@woocommerce/internal-style-build/index.js",
-				"node_modules/@woocommerce/internal-style-build/webpack-rtl-plugin.js",
-				"node_modules/@woocommerce/internal-style-build/style-asset-plugin.js",
-				"node_modules/@woocommerce/internal-style-build/abstracts",
+				"node_modules/@woocommerce/internal-build/build-types",
+				"node_modules/@woocommerce/internal-build/configs",
+				"node_modules/@woocommerce/internal-build/src/style-build",
+				"node_modules/@woocommerce/internal-build/styles",
+				"node_modules/@woocommerce/internal-build/type-overrides",
+				"node_modules/@woocommerce/internal-build/scripts",
 				"node_modules/@woocommerce/eslint-plugin/configs",
 				"node_modules/@woocommerce/eslint-plugin/rules",
 				"node_modules/@woocommerce/eslint-plugin/index.js"
diff --git a/plugins/woocommerce/client/blocks/typings/monorepo-enhancements.d.ts b/plugins/woocommerce/client/blocks/typings/monorepo-enhancements.d.ts
index 2000ac9d7b1..a7161ffdb4c 100644
--- a/plugins/woocommerce/client/blocks/typings/monorepo-enhancements.d.ts
+++ b/plugins/woocommerce/client/blocks/typings/monorepo-enhancements.d.ts
@@ -1,4 +1,4 @@
-import '@woocommerce/internal-ts-config/types/@wordpress/data';
-import '@woocommerce/internal-ts-config/types/@wordpress/core-data';
-import '@woocommerce/internal-ts-config/types/@wordpress/block-editor';
-import '@woocommerce/internal-ts-config/types/@wordpress/editor';
+import '@woocommerce/internal-build/type-overrides/@wordpress/data';
+import '@woocommerce/internal-build/type-overrides/@wordpress/core-data';
+import '@woocommerce/internal-build/type-overrides/@wordpress/block-editor';
+import '@woocommerce/internal-build/type-overrides/@wordpress/editor';
diff --git a/plugins/woocommerce/client/blocks/webpack.config.js b/plugins/woocommerce/client/blocks/webpack.config.js
index efa76c99f10..e428ee262ab 100644
--- a/plugins/woocommerce/client/blocks/webpack.config.js
+++ b/plugins/woocommerce/client/blocks/webpack.config.js
@@ -39,7 +39,9 @@ const getCacheConfig = ( name, configPaths = [] ) =>
 						require.resolve(
 							'@woocommerce/dependency-extraction-webpack-plugin'
 						),
-						require.resolve( '@woocommerce/internal-style-build' ),
+						require.resolve(
+							'@woocommerce/internal-build/style-build'
+						),
 						...configPaths.map( ( configPath ) =>
 							path.resolve( __dirname, configPath )
 						),
diff --git a/plugins/woocommerce/client/legacy/css/admin.scss b/plugins/woocommerce/client/legacy/css/admin.scss
index b277a1e2554..ec2af865e34 100644
--- a/plugins/woocommerce/client/legacy/css/admin.scss
+++ b/plugins/woocommerce/client/legacy/css/admin.scss
@@ -9499,7 +9499,7 @@ body.woocommerce_page_wc-settings {
 		// Tab strip inherits the wp-admin body bg so it reads as one
 		// continuous title region with the floating header above. Bottom
 		// border colour matches the rest of the wp-admin chrome borders
-		// ($wp-admin-border in packages/js/internal-style-build); kept as
+		// ($wp-admin-border in packages/js/internal-build/styles); kept as
 		// a literal here because legacy admin.scss doesn't import the
 		// shared variables file.
 		border-bottom: 1px solid #dcdcde;
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index a53e969b95d..605917a8f6b 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -129,6 +129,9 @@ catalogs:
     '@wordpress/plugins':
       specifier: 7.19.4
       version: 7.19.4
+    '@wordpress/postcss-plugins-preset':
+      specifier: 4.42.0
+      version: 4.42.0
     '@wordpress/preferences':
       specifier: 4.19.4
       version: 4.19.4
@@ -167,7 +170,7 @@ overrides:
   react-resize-aware: 3.1.1
   sass: 1.69.5

-pnpmfileChecksum: sha256-ofqgayQfdORNdNWxdnzBUzzKBo1Y72+rVI+d7hI5LT0=
+pnpmfileChecksum: sha256-0mGO2uxSzpGcsYJBjrnH8vcgzXYYgU2kSQKpHvcFKPM=

 patchedDependencies:
   '@wordpress/edit-site@5.15.0':
@@ -214,7 +217,7 @@ importers:
         version: 2.17.0(wp-prettier@2.8.5)
       babel-loader:
         specifier: 9.2.x
-        version: 9.2.1(@babel/core@7.25.7)(webpack@5.97.1)
+        version: 9.2.1(@babel/core@7.25.7)(webpack@5.97.1(@swc/core@1.15.24))
       chalk:
         specifier: ^4.1.2
         version: 4.1.2
@@ -226,7 +229,7 @@ importers:
         version: 3.49.0
       css-loader:
         specifier: 6.11.x
-        version: 6.11.0(webpack@5.97.1)
+        version: 6.11.0(webpack@5.97.1(@swc/core@1.15.24))
       glob:
         specifier: ^10.3.10
         version: 10.5.0
@@ -250,7 +253,7 @@ importers:
         version: 1.15.0
       postcss-loader:
         specifier: 4.3.x
-        version: 4.3.0(postcss@8.5.9)(webpack@5.97.1(@swc/core@1.15.24))
+        version: 4.3.0(postcss@8.5.9)(webpack@5.97.1)
       prettier:
         specifier: npm:wp-prettier@^2.8.5
         version: wp-prettier@2.8.5
@@ -277,7 +280,7 @@ importers:
         version: 5.7.3
       webpack:
         specifier: 5.97.x
-        version: 5.97.1(@swc/core@1.15.24)
+        version: 5.97.1(@swc/core@1.15.24)(webpack-cli@5.1.4)

   packages/js/admin-layout:
     dependencies:
@@ -297,30 +300,18 @@ importers:
       '@woocommerce/eslint-plugin':
         specifier: workspace:*
         version: link:../eslint-plugin
-      '@woocommerce/internal-style-build':
+      '@woocommerce/internal-build':
         specifier: workspace:*
-        version: link:../internal-style-build
-      '@woocommerce/internal-ts-config':
-        specifier: workspace:*
-        version: link:../internal-ts-config
+        version: link:../internal-build
       '@wordpress/browserslist-config':
         specifier: next
         version: 6.43.1-next.v.202604091042.0
-      chokidar:
-        specifier: 3.6.x
-        version: 3.6.0
       css-loader:
         specifier: 6.11.x
-        version: 6.11.0(webpack@5.97.1)
-      esbuild:
-        specifier: 0.24.x
-        version: 0.24.2
+        version: 6.11.0(webpack@5.97.1(@swc/core@1.15.24))
       eslint:
         specifier: ^8.55.0
         version: 8.57.1
-      glob:
-        specifier: ^10.3.10
-        version: 10.5.0
       jest:
         specifier: 29.5.x
         version: 29.5.0(@types/node@24.12.2)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@24.12.2)(typescript@5.7.3))
@@ -341,16 +332,16 @@ importers:
         version: 5.0.5
       sass-loader:
         specifier: 10.5.x
-        version: 10.5.2(sass@1.69.5)(webpack@5.97.1)
+        version: 10.5.2(sass@1.69.5)(webpack@5.97.1(@swc/core@1.15.24))
       ts-jest:
         specifier: 29.1.x
-        version: 29.1.5(@babel/core@7.25.7)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.7))(esbuild@0.24.2)(jest@29.5.0(@types/node@24.12.2)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@24.12.2)(typescript@5.7.3)))(typescript@5.7.3)
+        version: 29.1.5(@babel/core@7.25.7)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.7))(jest@29.5.0(@types/node@24.12.2)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@24.12.2)(typescript@5.7.3)))(typescript@5.7.3)
       typescript:
         specifier: 5.7.x
         version: 5.7.3
       webpack:
         specifier: 5.97.x
-        version: 5.97.1(@swc/core@1.15.24)(esbuild@0.24.2)(webpack-cli@5.1.4)
+        version: 5.97.1(@swc/core@1.15.24)(webpack-cli@5.1.4)
       webpack-cli:
         specifier: 5.1.x
         version: 5.1.4(webpack@5.97.1)
@@ -409,36 +400,24 @@ importers:
       '@woocommerce/eslint-plugin':
         specifier: workspace:*
         version: link:../eslint-plugin
+      '@woocommerce/internal-build':
+        specifier: workspace:*
+        version: link:../internal-build
       '@woocommerce/internal-js-tests':
         specifier: workspace:*
         version: link:../internal-js-tests
-      '@woocommerce/internal-style-build':
-        specifier: workspace:*
-        version: link:../internal-style-build
-      '@woocommerce/internal-ts-config':
-        specifier: workspace:*
-        version: link:../internal-ts-config
       '@wordpress/browserslist-config':
         specifier: next
         version: 6.43.1-next.v.202604091042.0
-      chokidar:
-        specifier: 3.6.x
-        version: 3.6.0
       copy-webpack-plugin:
         specifier: 13.0.x
-        version: 13.0.1(webpack@5.97.1)
+        version: 13.0.1(webpack@5.97.1(@swc/core@1.15.24))
       css-loader:
         specifier: 6.11.x
-        version: 6.11.0(webpack@5.97.1)
-      esbuild:
-        specifier: 0.24.x
-        version: 0.24.2
+        version: 6.11.0(webpack@5.97.1(@swc/core@1.15.24))
       eslint:
         specifier: ^8.55.0
         version: 8.57.1
-      glob:
-        specifier: ^10.3.10
-        version: 10.5.0
       jest:
         specifier: 29.5.x
         version: 29.5.0(@types/node@24.12.2)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@24.12.2)(typescript@5.7.3))
@@ -465,16 +444,16 @@ importers:
         version: 5.0.5
       sass-loader:
         specifier: 10.5.x
-        version: 10.5.2(sass@1.69.5)(webpack@5.97.1)
+        version: 10.5.2(sass@1.69.5)(webpack@5.97.1(@swc/core@1.15.24))
       ts-jest:
         specifier: 29.1.x
-        version: 29.1.5(@babel/core@7.25.7)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.7))(esbuild@0.24.2)(jest@29.5.0(@types/node@24.12.2)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@24.12.2)(typescript@5.7.3)))(typescript@5.7.3)
+        version: 29.1.5(@babel/core@7.25.7)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.7))(jest@29.5.0(@types/node@24.12.2)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@24.12.2)(typescript@5.7.3)))(typescript@5.7.3)
       typescript:
         specifier: 5.7.x
         version: 5.7.3
       webpack:
         specifier: 5.97.x
-        version: 5.97.1(@swc/core@1.15.24)(esbuild@0.24.2)(webpack-cli@5.1.4)
+        version: 5.97.1(@swc/core@1.15.24)(webpack-cli@5.1.4)
       webpack-cli:
         specifier: 5.1.x
         version: 5.1.4(webpack@5.97.1)
@@ -540,7 +519,7 @@ importers:
         version: 14.14.6(@babel/core@7.25.7)(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(webpack-virtual-modules@0.6.2)(webpack@5.97.1)
       '@wordpress/block-library':
         specifier: catalog:wp-min
-        version: 9.19.6(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@14.16.1)
+        version: 9.19.6(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@16.26.1(typescript@5.7.3))
       '@wordpress/blocks':
         specifier: catalog:wp-min
         version: 14.8.2(react@18.3.1)
@@ -682,7 +661,7 @@ importers:
         version: 7.6.19(react@18.3.1)
       '@storybook/react':
         specifier: 6.5.17-alpha.0
-        version: 6.5.17-alpha.0(@babel/core@7.25.7)(@swc/core@1.15.24)(@types/webpack@4.41.40)(encoding@0.1.13)(esbuild@0.24.2)(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.7.3)(webpack-cli@5.1.4)(webpack-dev-server@4.15.2)(webpack-hot-middleware@2.26.1)
+        version: 6.5.17-alpha.0(@babel/core@7.25.7)(@swc/core@1.15.24)(@types/webpack@4.41.40)(encoding@0.1.13)(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.7.3)(webpack-cli@5.1.4)(webpack-dev-server@4.15.2)(webpack-hot-middleware@2.26.1)
       '@testing-library/dom':
         specifier: 8.11.3
         version: 8.11.3
@@ -719,36 +698,24 @@ importers:
       '@woocommerce/eslint-plugin':
         specifier: workspace:*
         version: link:../eslint-plugin
+      '@woocommerce/internal-build':
+        specifier: workspace:*
+        version: link:../internal-build
       '@woocommerce/internal-js-tests':
         specifier: workspace:*
         version: link:../internal-js-tests
-      '@woocommerce/internal-style-build':
-        specifier: workspace:*
-        version: link:../internal-style-build
-      '@woocommerce/internal-ts-config':
-        specifier: workspace:*
-        version: link:../internal-ts-config
       '@wordpress/babel-preset-default':
         specifier: next
         version: 8.43.1-next.v.202604091042.0
       '@wordpress/browserslist-config':
         specifier: next
         version: 6.43.1-next.v.202604091042.0
-      chokidar:
-        specifier: 3.6.x
-        version: 3.6.0
       css-loader:
         specifier: 6.11.x
-        version: 6.11.0(webpack@5.97.1)
-      esbuild:
-        specifier: 0.24.x
-        version: 0.24.2
+        version: 6.11.0(webpack@5.97.1(@swc/core@1.15.24))
       eslint:
         specifier: ^8.55.0
         version: 8.57.1
-      glob:
-        specifier: ^10.3.10
-        version: 10.5.0
       jest:
         specifier: 29.5.x
         version: 29.5.0(@types/node@24.12.2)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@24.12.2)(typescript@5.7.3))
@@ -778,10 +745,10 @@ importers:
         version: 5.0.5
       sass-loader:
         specifier: 10.5.x
-        version: 10.5.2(sass@1.69.5)(webpack@5.97.1)
+        version: 10.5.2(sass@1.69.5)(webpack@5.97.1(@swc/core@1.15.24))
       ts-jest:
         specifier: 29.1.x
-        version: 29.1.5(@babel/core@7.25.7)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.7))(esbuild@0.24.2)(jest@29.5.0(@types/node@24.12.2)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@24.12.2)(typescript@5.7.3)))(typescript@5.7.3)
+        version: 29.1.5(@babel/core@7.25.7)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.7))(jest@29.5.0(@types/node@24.12.2)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@24.12.2)(typescript@5.7.3)))(typescript@5.7.3)
       typescript:
         specifier: 5.7.x
         version: 5.7.3
@@ -790,7 +757,7 @@ importers:
         version: 9.0.1
       webpack:
         specifier: 5.97.x
-        version: 5.97.1(@swc/core@1.15.24)(esbuild@0.24.2)(webpack-cli@5.1.4)
+        version: 5.97.1(@swc/core@1.15.24)(webpack-cli@5.1.4)
       webpack-cli:
         specifier: 5.1.x
         version: 5.1.4(webpack-dev-server@4.15.2)(webpack@5.97.1)
@@ -817,24 +784,15 @@ importers:
       '@woocommerce/eslint-plugin':
         specifier: workspace:*
         version: link:../eslint-plugin
+      '@woocommerce/internal-build':
+        specifier: workspace:*
+        version: link:../internal-build
       '@woocommerce/internal-js-tests':
         specifier: workspace:*
         version: link:../internal-js-tests
-      '@woocommerce/internal-ts-config':
-        specifier: workspace:*
-        version: link:../internal-ts-config
-      chokidar:
-        specifier: 3.6.x
-        version: 3.6.0
-      esbuild:
-        specifier: 0.24.x
-        version: 0.24.2
       eslint:
         specifier: ^8.55.0
         version: 8.57.1
-      glob:
-        specifier: ^10.3.10
-        version: 10.5.0
       jest:
         specifier: 29.5.x
         version: 29.5.0(@types/node@24.12.2)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@24.12.2)(typescript@5.7.3))
@@ -849,7 +807,7 @@ importers:
         version: 5.0.5
       ts-jest:
         specifier: 29.1.x
-        version: 29.1.5(@babel/core@7.25.7)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.7))(esbuild@0.24.2)(jest@29.5.0(@types/node@24.12.2)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@24.12.2)(typescript@5.7.3)))(typescript@5.7.3)
+        version: 29.1.5(@babel/core@7.25.7)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.7))(jest@29.5.0(@types/node@24.12.2)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@24.12.2)(typescript@5.7.3)))(typescript@5.7.3)
       typescript:
         specifier: 5.7.x
         version: 5.7.3
@@ -887,24 +845,15 @@ importers:
       '@woocommerce/eslint-plugin':
         specifier: workspace:*
         version: link:../eslint-plugin
+      '@woocommerce/internal-build':
+        specifier: workspace:*
+        version: link:../internal-build
       '@woocommerce/internal-js-tests':
         specifier: workspace:*
         version: link:../internal-js-tests
-      '@woocommerce/internal-ts-config':
-        specifier: workspace:*
-        version: link:../internal-ts-config
-      chokidar:
-        specifier: 3.6.x
-        version: 3.6.0
-      esbuild:
-        specifier: 0.24.x
-        version: 0.24.2
       eslint:
         specifier: ^8.55.0
         version: 8.57.1
-      glob:
-        specifier: ^10.3.10
-        version: 10.5.0
       jest:
         specifier: 29.5.x
         version: 29.5.0(@types/node@24.12.2)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@24.12.2)(typescript@5.7.3))
@@ -919,7 +868,7 @@ importers:
         version: 5.0.5
       ts-jest:
         specifier: 29.1.x
-        version: 29.1.5(@babel/core@7.25.7)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.7))(esbuild@0.24.2)(jest@29.5.0(@types/node@24.12.2)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@24.12.2)(typescript@5.7.3)))(typescript@5.7.3)
+        version: 29.1.5(@babel/core@7.25.7)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.7))(jest@29.5.0(@types/node@24.12.2)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@24.12.2)(typescript@5.7.3)))(typescript@5.7.3)
       typescript:
         specifier: 5.7.x
         version: 5.7.3
@@ -987,15 +936,12 @@ importers:
       '@woocommerce/eslint-plugin':
         specifier: workspace:*
         version: link:../eslint-plugin
+      '@woocommerce/internal-build':
+        specifier: workspace:*
+        version: link:../internal-build
       '@woocommerce/internal-js-tests':
         specifier: workspace:*
         version: link:../internal-js-tests
-      '@woocommerce/internal-style-build':
-        specifier: workspace:*
-        version: link:../internal-style-build
-      '@woocommerce/internal-ts-config':
-        specifier: workspace:*
-        version: link:../internal-ts-config
       '@woocommerce/navigation':
         specifier: workspace:*
         version: link:../navigation
@@ -1005,21 +951,12 @@ importers:
       '@wordpress/browserslist-config':
         specifier: next
         version: 6.43.1-next.v.202604091042.0
-      chokidar:
-        specifier: 3.6.x
-        version: 3.6.0
       css-loader:
         specifier: 6.11.x
-        version: 6.11.0(webpack@5.97.1)
-      esbuild:
-        specifier: 0.24.x
-        version: 0.24.2
+        version: 6.11.0(webpack@5.97.1(@swc/core@1.15.24))
       eslint:
         specifier: ^8.55.0
         version: 8.57.1
-      glob:
-        specifier: ^10.3.10
-        version: 10.5.0
       jest:
         specifier: 29.5.x
         version: 29.5.0(@types/node@24.12.2)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@24.12.2)(typescript@5.7.3))
@@ -1040,16 +977,16 @@ importers:
         version: 5.0.5
       sass-loader:
         specifier: 10.5.x
-        version: 10.5.2(sass@1.69.5)(webpack@5.97.1)
+        version: 10.5.2(sass@1.69.5)(webpack@5.97.1(@swc/core@1.15.24))
       ts-jest:
         specifier: 29.1.x
-        version: 29.1.5(@babel/core@7.25.7)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.7))(esbuild@0.24.2)(jest@29.5.0(@types/node@24.12.2)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@24.12.2)(typescript@5.7.3)))(typescript@5.7.3)
+        version: 29.1.5(@babel/core@7.25.7)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.7))(jest@29.5.0(@types/node@24.12.2)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@24.12.2)(typescript@5.7.3)))(typescript@5.7.3)
       typescript:
         specifier: 5.7.x
         version: 5.7.3
       webpack:
         specifier: 5.97.x
-        version: 5.97.1(@swc/core@1.15.24)(esbuild@0.24.2)(webpack-cli@5.1.4)
+        version: 5.97.1(@swc/core@1.15.24)(webpack-cli@5.1.4)
       webpack-cli:
         specifier: 5.1.x
         version: 5.1.4(webpack@5.97.1)
@@ -1147,24 +1084,15 @@ importers:
       '@woocommerce/eslint-plugin':
         specifier: workspace:*
         version: link:../eslint-plugin
+      '@woocommerce/internal-build':
+        specifier: workspace:*
+        version: link:../internal-build
       '@woocommerce/internal-js-tests':
         specifier: workspace:*
         version: link:../internal-js-tests
-      '@woocommerce/internal-ts-config':
-        specifier: workspace:*
-        version: link:../internal-ts-config
-      chokidar:
-        specifier: 3.6.x
-        version: 3.6.0
-      esbuild:
-        specifier: 0.24.x
-        version: 0.24.2
       eslint:
         specifier: ^8.55.0
         version: 8.57.1
-      glob:
-        specifier: ^10.3.10
-        version: 10.5.0
       jest:
         specifier: 29.5.x
         version: 29.5.0(@types/node@24.12.2)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@24.12.2)(typescript@5.7.3))
@@ -1182,7 +1110,7 @@ importers:
         version: 5.0.5
       ts-jest:
         specifier: 29.1.x
-        version: 29.1.5(@babel/core@7.25.7)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.7))(esbuild@0.24.2)(jest@29.5.0(@types/node@24.12.2)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@24.12.2)(typescript@5.7.3)))(typescript@5.7.3)
+        version: 29.1.5(@babel/core@7.25.7)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.7))(jest@29.5.0(@types/node@24.12.2)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@24.12.2)(typescript@5.7.3)))(typescript@5.7.3)
       typescript:
         specifier: 5.7.x
         version: 5.7.3
@@ -1229,27 +1157,18 @@ importers:
       '@woocommerce/eslint-plugin':
         specifier: workspace:*
         version: link:../eslint-plugin
+      '@woocommerce/internal-build':
+        specifier: workspace:*
+        version: link:../internal-build
       '@woocommerce/internal-js-tests':
         specifier: workspace:*
         version: link:../internal-js-tests
-      '@woocommerce/internal-ts-config':
-        specifier: workspace:*
-        version: link:../internal-ts-config
-      chokidar:
-        specifier: 3.6.x
-        version: 3.6.0
       d3-time-format:
         specifier: ^2.3.0
         version: 2.3.0
-      esbuild:
-        specifier: 0.24.x
-        version: 0.24.2
       eslint:
         specifier: ^8.55.0
         version: 8.57.1
-      glob:
-        specifier: ^10.3.10
-        version: 10.5.0
       jest:
         specifier: 29.5.x
         version: 29.5.0(@types/node@24.12.2)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@24.12.2)(typescript@5.7.3))
@@ -1264,7 +1183,7 @@ importers:
         version: 5.0.5
       ts-jest:
         specifier: 29.1.x
-        version: 29.1.5(@babel/core@7.25.7)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.7))(esbuild@0.24.2)(jest@29.5.0(@types/node@24.12.2)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@24.12.2)(typescript@5.7.3)))(typescript@5.7.3)
+        version: 29.1.5(@babel/core@7.25.7)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.7))(jest@29.5.0(@types/node@24.12.2)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@24.12.2)(typescript@5.7.3)))(typescript@5.7.3)
       typescript:
         specifier: 5.7.x
         version: 5.7.3
@@ -1295,7 +1214,7 @@ importers:
         version: 5.0.5
       ts-jest:
         specifier: 29.1.x
-        version: 29.1.5(@babel/core@7.25.7)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.7))(esbuild@0.24.2)(jest@29.5.0(@types/node@24.12.2)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@24.12.2)(typescript@5.7.3)))(typescript@5.7.3)
+        version: 29.1.5(@babel/core@7.25.7)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.7))(jest@29.5.0(@types/node@24.12.2)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@24.12.2)(typescript@5.7.3)))(typescript@5.7.3)
       typescript:
         specifier: 5.7.x
         version: 5.7.3
@@ -1327,24 +1246,15 @@ importers:
       '@woocommerce/eslint-plugin':
         specifier: workspace:*
         version: link:../eslint-plugin
+      '@woocommerce/internal-build':
+        specifier: workspace:*
+        version: link:../internal-build
       '@woocommerce/internal-js-tests':
         specifier: workspace:*
         version: link:../internal-js-tests
-      '@woocommerce/internal-ts-config':
-        specifier: workspace:*
-        version: link:../internal-ts-config
-      chokidar:
-        specifier: 3.6.x
-        version: 3.6.0
-      esbuild:
-        specifier: 0.24.x
-        version: 0.24.2
       eslint:
         specifier: ^8.55.0
         version: 8.57.1
-      glob:
-        specifier: ^10.3.10
-        version: 10.5.0
       jest:
         specifier: 29.5.x
         version: 29.5.0(@types/node@24.12.2)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@24.12.2)(typescript@5.7.3))
@@ -1353,7 +1263,7 @@ importers:
         version: 29.5.0(@types/node@24.12.2)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@24.12.2)(typescript@5.7.3))
       ts-jest:
         specifier: 29.1.x
-        version: 29.1.5(@babel/core@7.25.7)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.7))(esbuild@0.24.2)(jest@29.5.0(@types/node@24.12.2)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@24.12.2)(typescript@5.7.3)))(typescript@5.7.3)
+        version: 29.1.5(@babel/core@7.25.7)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.7))(jest@29.5.0(@types/node@24.12.2)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@24.12.2)(typescript@5.7.3)))(typescript@5.7.3)
       typescript:
         specifier: 5.7.x
         version: 5.7.3
@@ -1517,15 +1427,12 @@ importers:
       '@woocommerce/eslint-plugin':
         specifier: workspace:*
         version: link:../eslint-plugin
+      '@woocommerce/internal-build':
+        specifier: workspace:*
+        version: link:../internal-build
       '@woocommerce/internal-js-tests':
         specifier: workspace:*
         version: link:../internal-js-tests
-      '@woocommerce/internal-style-build':
-        specifier: workspace:*
-        version: link:../internal-style-build
-      '@woocommerce/internal-ts-config':
-        specifier: workspace:*
-        version: link:../internal-ts-config
       '@wordpress/browserslist-config':
         specifier: next
         version: 6.43.1-next.v.202604091042.0
@@ -1535,18 +1442,9 @@ importers:
       '@wordpress/stylelint-config':
         specifier: ^21.0.0
         version: 21.41.0(postcss@8.5.9)(stylelint@14.16.1)
-      chokidar:
-        specifier: 3.6.x
-        version: 3.6.0
-      esbuild:
-        specifier: 0.24.x
-        version: 0.24.2
       eslint:
         specifier: ^8.55.0
         version: 8.57.1
-      glob:
-        specifier: ^10.3.10
-        version: 10.5.0
       jest:
         specifier: 29.5.x
         version: 29.5.0(@types/node@24.12.2)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@24.12.2)(typescript@5.7.3))
@@ -1567,7 +1465,7 @@ importers:
         version: 14.16.1
       ts-jest:
         specifier: 29.1.x
-        version: 29.1.5(@babel/core@7.25.7)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.7))(esbuild@0.24.2)(jest@29.5.0(@types/node@24.12.2)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@24.12.2)(typescript@5.7.3)))(typescript@5.7.3)
+        version: 29.1.5(@babel/core@7.25.7)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.7))(jest@29.5.0(@types/node@24.12.2)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@24.12.2)(typescript@5.7.3)))(typescript@5.7.3)
       ts-loader:
         specifier: 9.5.x
         version: 9.5.7(typescript@5.7.3)(webpack@5.97.1)
@@ -1576,7 +1474,7 @@ importers:
         version: 5.7.3
       webpack:
         specifier: 5.97.x
-        version: 5.97.1(@swc/core@1.15.24)(esbuild@0.24.2)(webpack-cli@5.1.4)
+        version: 5.97.1(@swc/core@1.15.24)(webpack-cli@5.1.4)
       webpack-cli:
         specifier: 5.1.x
         version: 5.1.4(webpack@5.97.1)
@@ -1619,7 +1517,7 @@ importers:
         version: 5.0.5
       ts-jest:
         specifier: 29.1.x
-        version: 29.1.5(@babel/core@7.25.7)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.7))(esbuild@0.24.2)(jest@29.5.0(@types/node@24.12.2)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@24.12.2)(typescript@5.7.3)))(typescript@5.7.3)
+        version: 29.1.5(@babel/core@7.25.7)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.7))(jest@29.5.0(@types/node@24.12.2)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@24.12.2)(typescript@5.7.3)))(typescript@5.7.3)
       typescript:
         specifier: 5.7.x
         version: 5.7.3
@@ -1683,7 +1581,7 @@ importers:
         version: 1.2.3(@storybook/addon-actions@6.5.17-alpha.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))
       '@storybook/react':
         specifier: 6.5.17-alpha.0
-        version: 6.5.17-alpha.0(@babel/core@7.25.7)(@swc/core@1.15.24)(@types/webpack@4.41.40)(encoding@0.1.13)(esbuild@0.24.2)(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.7.3)(webpack-cli@5.1.4)(webpack-dev-server@4.15.2)(webpack-hot-middleware@2.26.1)
+        version: 6.5.17-alpha.0(@babel/core@7.25.7)(@swc/core@1.15.24)(@types/webpack@4.41.40)(encoding@0.1.13)(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.7.3)(webpack-cli@5.1.4)(webpack-dev-server@4.15.2)(webpack-hot-middleware@2.26.1)
       '@testing-library/dom':
         specifier: 8.11.3
         version: 8.11.3
@@ -1705,33 +1603,21 @@ importers:
       '@woocommerce/eslint-plugin':
         specifier: workspace:*
         version: link:../eslint-plugin
+      '@woocommerce/internal-build':
+        specifier: workspace:*
+        version: link:../internal-build
       '@woocommerce/internal-js-tests':
         specifier: workspace:*
         version: link:../internal-js-tests
-      '@woocommerce/internal-style-build':
-        specifier: workspace:*
-        version: link:../internal-style-build
-      '@woocommerce/internal-ts-config':
-        specifier: workspace:*
-        version: link:../internal-ts-config
       '@wordpress/browserslist-config':
         specifier: next
         version: 6.43.1-next.v.202604091042.0
-      chokidar:
-        specifier: 3.6.x
-        version: 3.6.0
       css-loader:
         specifier: 6.11.x
-        version: 6.11.0(webpack@5.97.1)
-      esbuild:
-        specifier: 0.24.x
-        version: 0.24.2
+        version: 6.11.0(webpack@5.97.1(@swc/core@1.15.24))
       eslint:
         specifier: ^8.55.0
         version: 8.57.1
-      glob:
-        specifier: ^10.3.10
-        version: 10.5.0
       jest:
         specifier: 29.5.x
         version: 29.5.0(@types/node@24.12.2)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@24.12.2)(typescript@5.7.3))
@@ -1752,16 +1638,16 @@ importers:
         version: 5.0.5
       sass-loader:
         specifier: 10.5.x
-        version: 10.5.2(sass@1.69.5)(webpack@5.97.1)
+        version: 10.5.2(sass@1.69.5)(webpack@5.97.1(@swc/core@1.15.24))
       ts-jest:
         specifier: 29.1.x
-        version: 29.1.5(@babel/core@7.25.7)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.7))(esbuild@0.24.2)(jest@29.5.0(@types/node@24.12.2)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@24.12.2)(typescript@5.7.3)))(typescript@5.7.3)
+        version: 29.1.5(@babel/core@7.25.7)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.7))(jest@29.5.0(@types/node@24.12.2)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@24.12.2)(typescript@5.7.3)))(typescript@5.7.3)
       typescript:
         specifier: 5.7.x
         version: 5.7.3
       webpack:
         specifier: 5.97.x
-        version: 5.97.1(@swc/core@1.15.24)(esbuild@0.24.2)(webpack-cli@5.1.4)
+        version: 5.97.1(@swc/core@1.15.24)(webpack-cli@5.1.4)
       webpack-cli:
         specifier: 5.1.x
         version: 5.1.4(webpack-dev-server@4.15.2)(webpack@5.97.1)
@@ -1770,7 +1656,7 @@ importers:
     dependencies:
       '@base-ui/react':
         specifier: 1.4.1
-        version: 1.4.1(@date-fns/tz@1.4.1)(@types/react@18.3.28)(date-fns@4.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+        version: 1.4.1(@date-fns/tz@1.4.1)(@types/react@18.3.28)(date-fns@3.6.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
       '@dnd-kit/react':
         specifier: 0.4.0
         version: 0.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
@@ -1785,7 +1671,7 @@ importers:
         version: 1.0.0
       '@wordpress/admin-ui':
         specifier: 1.12.0
-        version: 1.12.0(@date-fns/tz@1.4.1)(@emotion/is-prop-valid@1.4.0)(@types/react@18.3.28)(date-fns@4.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@16.26.1(typescript@5.7.3))
+        version: 1.12.0(@date-fns/tz@1.4.1)(@emotion/is-prop-valid@1.4.0)(@types/react@18.3.28)(date-fns@3.6.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@16.26.1(typescript@5.7.3))
       '@wordpress/api-fetch':
         specifier: 7.44.0
         version: 7.44.0
@@ -1839,7 +1725,7 @@ importers:
         version: 0.12.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@16.26.1(typescript@5.7.3))
       '@wordpress/ui':
         specifier: next
-        version: 0.13.1-next.v.202605131032.0(@date-fns/tz@1.4.1)(@types/react@18.3.28)(date-fns@4.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@16.26.1(typescript@5.7.3))
+        version: 0.13.1-next.v.202605131032.0(@date-fns/tz@1.4.1)(@types/react@18.3.28)(date-fns@3.6.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@16.26.1(typescript@5.7.3))
       '@wordpress/url':
         specifier: catalog:wp-min
         version: 4.19.2
@@ -1883,30 +1769,18 @@ importers:
       '@woocommerce/eslint-plugin':
         specifier: workspace:*
         version: link:../eslint-plugin
+      '@woocommerce/internal-build':
+        specifier: workspace:*
+        version: link:../internal-build
       '@woocommerce/internal-js-tests':
         specifier: workspace:*
         version: link:../internal-js-tests
-      '@woocommerce/internal-style-build':
-        specifier: workspace:*
-        version: link:../internal-style-build
-      '@woocommerce/internal-ts-config':
-        specifier: workspace:*
-        version: link:../internal-ts-config
-      chokidar:
-        specifier: ^3.6.0
-        version: 3.6.0
       css-loader:
         specifier: 6.11.x
-        version: 6.11.0(webpack@5.97.1)
-      esbuild:
-        specifier: ^0.24.0
-        version: 0.24.2
+        version: 6.11.0(webpack@5.97.1(@swc/core@1.15.24))
       eslint:
         specifier: ^8.55.0
         version: 8.57.1
-      glob:
-        specifier: ^10.3.10
-        version: 10.5.0
       jest:
         specifier: 29.5.x
         version: 29.5.0(@types/node@24.12.2)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@24.12.2)(typescript@5.7.3))
@@ -1927,16 +1801,16 @@ importers:
         version: 5.0.5
       sass-loader:
         specifier: 10.5.x
-        version: 10.5.2(sass@1.69.5)(webpack@5.97.1)
+        version: 10.5.2(sass@1.69.5)(webpack@5.97.1(@swc/core@1.15.24))
       ts-jest:
         specifier: 29.1.x
-        version: 29.1.5(@babel/core@7.25.7)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.7))(esbuild@0.24.2)(jest@29.5.0(@types/node@24.12.2)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@24.12.2)(typescript@5.7.3)))(typescript@5.7.3)
+        version: 29.1.5(@babel/core@7.25.7)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.7))(jest@29.5.0(@types/node@24.12.2)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@24.12.2)(typescript@5.7.3)))(typescript@5.7.3)
       typescript:
         specifier: 5.7.x
         version: 5.7.3
       webpack:
         specifier: 5.97.x
-        version: 5.97.1(@swc/core@1.15.24)(esbuild@0.24.2)(webpack-cli@5.1.4)
+        version: 5.97.1(@swc/core@1.15.24)(webpack-cli@5.1.4)
       webpack-cli:
         specifier: 5.1.x
         version: 5.1.4(webpack@5.97.1)
@@ -1986,24 +1860,15 @@ importers:
       '@woocommerce/eslint-plugin':
         specifier: workspace:*
         version: link:../eslint-plugin
+      '@woocommerce/internal-build':
+        specifier: workspace:*
+        version: link:../internal-build
       '@woocommerce/internal-js-tests':
         specifier: workspace:*
         version: link:../internal-js-tests
-      '@woocommerce/internal-ts-config':
-        specifier: workspace:*
-        version: link:../internal-ts-config
-      chokidar:
-        specifier: 3.6.x
-        version: 3.6.0
-      esbuild:
-        specifier: 0.24.x
-        version: 0.24.2
       eslint:
         specifier: ^8.55.0
         version: 8.57.1
-      glob:
-        specifier: ^10.3.10
-        version: 10.5.0
       jest:
         specifier: 29.5.x
         version: 29.5.0(@types/node@24.12.2)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@24.12.2)(typescript@5.7.3))
@@ -2018,7 +1883,7 @@ importers:
         version: 5.0.5
       ts-jest:
         specifier: 29.1.x
-        version: 29.1.5(@babel/core@7.25.7)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.7))(esbuild@0.24.2)(jest@29.5.0(@types/node@24.12.2)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@24.12.2)(typescript@5.7.3)))(typescript@5.7.3)
+        version: 29.1.5(@babel/core@7.25.7)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.7))(jest@29.5.0(@types/node@24.12.2)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@24.12.2)(typescript@5.7.3)))(typescript@5.7.3)
       typescript:
         specifier: 5.7.x
         version: 5.7.3
@@ -2041,24 +1906,15 @@ importers:
       '@woocommerce/eslint-plugin':
         specifier: workspace:*
         version: link:../eslint-plugin
+      '@woocommerce/internal-build':
+        specifier: workspace:*
+        version: link:../internal-build
       '@woocommerce/internal-js-tests':
         specifier: workspace:*
         version: link:../internal-js-tests
-      '@woocommerce/internal-ts-config':
-        specifier: workspace:*
-        version: link:../internal-ts-config
-      chokidar:
-        specifier: 3.6.x
-        version: 3.6.0
-      esbuild:
-        specifier: 0.24.x
-        version: 0.24.2
       eslint:
         specifier: ^8.55.0
         version: 8.57.1
-      glob:
-        specifier: ^10.3.10
-        version: 10.5.0
       jest:
         specifier: 29.5.x
         version: 29.5.0(@types/node@24.12.2)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@24.12.2)(typescript@5.7.3))
@@ -2073,13 +1929,80 @@ importers:
         version: 5.0.5
       ts-jest:
         specifier: 29.1.x
-        version: 29.1.5(@babel/core@7.25.7)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.7))(esbuild@0.24.2)(jest@29.5.0(@types/node@24.12.2)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@24.12.2)(typescript@5.7.3)))(typescript@5.7.3)
+        version: 29.1.5(@babel/core@7.25.7)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.7))(jest@29.5.0(@types/node@24.12.2)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@24.12.2)(typescript@5.7.3)))(typescript@5.7.3)
       typescript:
         specifier: 5.7.x
         version: 5.7.3

   packages/js/extend-cart-checkout-block: {}

+  packages/js/internal-build:
+    dependencies:
+      '@automattic/color-studio':
+        specifier: ^4.0.0
+        version: 4.0.0
+      '@wordpress/base-styles':
+        specifier: catalog:wp-min
+        version: 5.19.1
+      '@wordpress/postcss-plugins-preset':
+        specifier: catalog:wp-min
+        version: 4.42.0(postcss@8.5.9)
+      chokidar:
+        specifier: ^3.6.0
+        version: 3.6.0
+      css-loader:
+        specifier: 6.11.x
+        version: 6.11.0(webpack@5.97.1(@swc/core@1.15.24)(esbuild@0.24.2))
+      esbuild:
+        specifier: ^0.24.0
+        version: 0.24.2
+      glob:
+        specifier: ^10.3.10
+        version: 10.5.0
+      json2php:
+        specifier: ^0.0.7
+        version: 0.0.7
+      mini-css-extract-plugin:
+        specifier: 2.9.x
+        version: 2.9.4(webpack@5.97.1(@swc/core@1.15.24)(esbuild@0.24.2))
+      postcss-loader:
+        specifier: 4.3.x
+        version: 4.3.0(postcss@8.5.9)(webpack@5.97.1(@swc/core@1.15.24)(esbuild@0.24.2))
+      rtlcss:
+        specifier: 4.3.x
+        version: 4.3.0
+      sass-loader:
+        specifier: 10.5.x
+        version: 10.5.2(sass@1.69.5)(webpack@5.97.1(@swc/core@1.15.24)(esbuild@0.24.2))
+      webpack-remove-empty-scripts:
+        specifier: 1.0.x
+        version: 1.0.4(webpack@5.97.1(@swc/core@1.15.24)(esbuild@0.24.2))
+    devDependencies:
+      '@types/wordpress__block-editor':
+        specifier: 14.21.8
+        version: 14.21.8(@emotion/is-prop-valid@1.4.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+      '@woocommerce/eslint-plugin':
+        specifier: workspace:*
+        version: link:../eslint-plugin
+      '@wordpress/core-data':
+        specifier: 7.19.6
+        version: 7.19.6(@emotion/is-prop-valid@1.4.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+      '@wordpress/data':
+        specifier: 10.19.2
+        version: 10.19.2(react@18.3.1)
+      '@wordpress/editor':
+        specifier: 14.19.7
+        version: 14.19.7(@emotion/is-prop-valid@1.4.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+      '@wordpress/notices':
+        specifier: 5.19.2
+        version: 5.19.2(react@18.3.1)
+      eslint:
+        specifier: ^8.55.0
+        version: 8.57.1
+      typescript:
+        specifier: 5.7.x
+        version: 5.7.3
+
   packages/js/internal-js-tests:
     dependencies:
       '@testing-library/jest-dom':
@@ -2113,24 +2036,15 @@ importers:
       '@woocommerce/eslint-plugin':
         specifier: workspace:*
         version: link:../eslint-plugin
-      '@woocommerce/internal-ts-config':
+      '@woocommerce/internal-build':
         specifier: workspace:*
-        version: link:../internal-ts-config
+        version: link:../internal-build
       babel-jest:
         specifier: 29.5.x
         version: 29.5.0(@babel/core@7.25.7)
-      chokidar:
-        specifier: 3.6.x
-        version: 3.6.0
-      esbuild:
-        specifier: 0.24.x
-        version: 0.24.2
       eslint:
         specifier: ^8.55.0
         version: 8.57.1
-      glob:
-        specifier: ^10.3.10
-        version: 10.5.0
       jest:
         specifier: 29.5.x
         version: 29.5.0(@types/node@24.12.2)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@24.12.2)(typescript@5.7.3))
@@ -2151,92 +2065,7 @@ importers:
         version: 5.0.5
       ts-jest:
         specifier: 29.1.x
-        version: 29.1.5(@babel/core@7.25.7)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.5.0(@babel/core@7.25.7))(esbuild@0.24.2)(jest@29.5.0(@types/node@24.12.2)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@24.12.2)(typescript@5.7.3)))(typescript@5.7.3)
-      typescript:
-        specifier: 5.7.x
-        version: 5.7.3
-
-  packages/js/internal-style-build:
-    dependencies:
-      '@automattic/color-studio':
-        specifier: ^4.0.0
-        version: 4.0.0
-      '@wordpress/base-styles':
-        specifier: catalog:wp-min
-        version: 5.19.1
-      '@wordpress/postcss-plugins-preset':
-        specifier: next
-        version: 5.43.1-next.v.202604091042.0(postcss@8.5.9)
-      css-loader:
-        specifier: 6.11.x
-        version: 6.11.0(webpack@5.97.1(@swc/core@1.15.24))
-      fork-ts-checker-webpack-plugin:
-        specifier: 9.0.x
-        version: 9.0.3(typescript@5.7.3)(webpack@5.97.1(@swc/core@1.15.24))
-      json2php:
-        specifier: ^0.0.7
-        version: 0.0.7
-      mini-css-extract-plugin:
-        specifier: 2.9.x
-        version: 2.9.4(webpack@5.97.1(@swc/core@1.15.24))
-      postcss-loader:
-        specifier: 4.3.x
-        version: 4.3.0(postcss@8.5.9)(webpack@5.97.1(@swc/core@1.15.24))
-      rtlcss:
-        specifier: 4.3.x
-        version: 4.3.0
-      sass-loader:
-        specifier: 10.5.x
-        version: 10.5.2(sass@1.69.5)(webpack@5.97.1(@swc/core@1.15.24))
-      webpack-remove-empty-scripts:
-        specifier: 1.0.x
-        version: 1.0.4(webpack@5.97.1(@swc/core@1.15.24))
-    devDependencies:
-      '@babel/core':
-        specifier: 7.25.7
-        version: 7.25.7
-      '@woocommerce/eslint-plugin':
-        specifier: workspace:*
-        version: link:../eslint-plugin
-      eslint:
-        specifier: ^8.55.0
-        version: 8.57.1
-      jest:
-        specifier: 29.5.x
-        version: 29.5.0(@types/node@24.12.2)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@24.12.2)(typescript@5.7.3))
-      jest-cli:
-        specifier: 29.5.x
-        version: 29.5.0(@types/node@24.12.2)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@24.12.2)(typescript@5.7.3))
-      rimraf:
-        specifier: 5.0.5
-        version: 5.0.5
-      ts-jest:
-        specifier: 29.1.x
-        version: 29.1.5(@babel/core@7.25.7)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.7))(esbuild@0.24.2)(jest@29.5.0(@types/node@24.12.2)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@24.12.2)(typescript@5.7.3)))(typescript@5.7.3)
-      typescript:
-        specifier: 5.7.x
-        version: 5.7.3
-      webpack:
-        specifier: 5.97.x
-        version: 5.97.1(@swc/core@1.15.24)
-
-  packages/js/internal-ts-config:
-    devDependencies:
-      '@types/wordpress__block-editor':
-        specifier: 14.21.8
-        version: 14.21.8(@emotion/is-prop-valid@1.4.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
-      '@wordpress/core-data':
-        specifier: 7.19.6
-        version: 7.19.6(@emotion/is-prop-valid@1.4.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
-      '@wordpress/data':
-        specifier: 10.19.2
-        version: 10.19.2(react@18.3.1)
-      '@wordpress/editor':
-        specifier: 14.19.7
-        version: 14.19.7(@emotion/is-prop-valid@1.4.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
-      '@wordpress/notices':
-        specifier: 5.19.2
-        version: 5.19.2(react@18.3.1)
+        version: 29.1.5(@babel/core@7.25.7)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.5.0(@babel/core@7.25.7))(jest@29.5.0(@types/node@24.12.2)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@24.12.2)(typescript@5.7.3)))(typescript@5.7.3)
       typescript:
         specifier: 5.7.x
         version: 5.7.3
@@ -2295,24 +2124,15 @@ importers:
       '@woocommerce/eslint-plugin':
         specifier: workspace:*
         version: link:../eslint-plugin
+      '@woocommerce/internal-build':
+        specifier: workspace:*
+        version: link:../internal-build
       '@woocommerce/internal-js-tests':
         specifier: workspace:*
         version: link:../internal-js-tests
-      '@woocommerce/internal-ts-config':
-        specifier: workspace:*
-        version: link:../internal-ts-config
-      chokidar:
-        specifier: 3.6.x
-        version: 3.6.0
-      esbuild:
-        specifier: 0.24.x
-        version: 0.24.2
       eslint:
         specifier: ^8.55.0
         version: 8.57.1
-      glob:
-        specifier: ^10.3.10
-        version: 10.5.0
       jest:
         specifier: 29.5.x
         version: 29.5.0(@types/node@24.12.2)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@24.12.2)(typescript@5.7.3))
@@ -2327,7 +2147,7 @@ importers:
         version: 5.0.5
       ts-jest:
         specifier: 29.1.x
-        version: 29.1.5(@babel/core@7.25.7)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.7))(esbuild@0.24.2)(jest@29.5.0(@types/node@24.12.2)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@24.12.2)(typescript@5.7.3)))(typescript@5.7.3)
+        version: 29.1.5(@babel/core@7.25.7)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.7))(jest@29.5.0(@types/node@24.12.2)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@24.12.2)(typescript@5.7.3)))(typescript@5.7.3)
       typescript:
         specifier: 5.7.x
         version: 5.7.3
@@ -2365,21 +2185,12 @@ importers:
       '@woocommerce/eslint-plugin':
         specifier: workspace:*
         version: link:../eslint-plugin
-      '@woocommerce/internal-ts-config':
+      '@woocommerce/internal-build':
         specifier: workspace:*
-        version: link:../internal-ts-config
-      chokidar:
-        specifier: 3.6.x
-        version: 3.6.0
-      esbuild:
-        specifier: 0.24.x
-        version: 0.24.2
+        version: link:../internal-build
       eslint:
         specifier: ^8.55.0
         version: 8.57.1
-      glob:
-        specifier: ^10.3.10
-        version: 10.5.0
       jest:
         specifier: 29.5.x
         version: 29.5.0(@types/node@24.12.2)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@24.12.2)(typescript@5.7.3))
@@ -2394,7 +2205,7 @@ importers:
         version: 5.0.5
       ts-jest:
         specifier: 29.1.x
-        version: 29.1.5(@babel/core@7.25.7)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.7))(esbuild@0.24.2)(jest@29.5.0(@types/node@24.12.2)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@24.12.2)(typescript@5.7.3)))(typescript@5.7.3)
+        version: 29.1.5(@babel/core@7.25.7)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.7))(jest@29.5.0(@types/node@24.12.2)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@24.12.2)(typescript@5.7.3)))(typescript@5.7.3)
       typescript:
         specifier: 5.7.x
         version: 5.7.3
@@ -2420,24 +2231,15 @@ importers:
       '@woocommerce/eslint-plugin':
         specifier: workspace:*
         version: link:../eslint-plugin
+      '@woocommerce/internal-build':
+        specifier: workspace:*
+        version: link:../internal-build
       '@woocommerce/internal-js-tests':
         specifier: workspace:*
         version: link:../internal-js-tests
-      '@woocommerce/internal-ts-config':
-        specifier: workspace:*
-        version: link:../internal-ts-config
-      chokidar:
-        specifier: 3.6.x
-        version: 3.6.0
-      esbuild:
-        specifier: 0.24.x
-        version: 0.24.2
       eslint:
         specifier: ^8.55.0
         version: 8.57.1
-      glob:
-        specifier: ^10.3.10
-        version: 10.5.0
       jest:
         specifier: 29.5.x
         version: 29.5.0(@types/node@24.12.2)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@24.12.2)(typescript@5.7.3))
@@ -2452,7 +2254,7 @@ importers:
         version: 5.0.5
       ts-jest:
         specifier: 29.1.x
-        version: 29.1.5(@babel/core@7.25.7)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.7))(esbuild@0.24.2)(jest@29.5.0(@types/node@24.12.2)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@24.12.2)(typescript@5.7.3)))(typescript@5.7.3)
+        version: 29.1.5(@babel/core@7.25.7)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.7))(jest@29.5.0(@types/node@24.12.2)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@24.12.2)(typescript@5.7.3)))(typescript@5.7.3)
       typescript:
         specifier: 5.7.x
         version: 5.7.3
@@ -2514,33 +2316,21 @@ importers:
       '@woocommerce/eslint-plugin':
         specifier: workspace:*
         version: link:../eslint-plugin
+      '@woocommerce/internal-build':
+        specifier: workspace:*
+        version: link:../internal-build
       '@woocommerce/internal-js-tests':
         specifier: workspace:*
         version: link:../internal-js-tests
-      '@woocommerce/internal-style-build':
-        specifier: workspace:*
-        version: link:../internal-style-build
-      '@woocommerce/internal-ts-config':
-        specifier: workspace:*
-        version: link:../internal-ts-config
       '@wordpress/browserslist-config':
         specifier: next
         version: 6.43.1-next.v.202604091042.0
-      chokidar:
-        specifier: 3.6.x
-        version: 3.6.0
       css-loader:
         specifier: 6.11.x
-        version: 6.11.0(webpack@5.97.1)
-      esbuild:
-        specifier: 0.24.x
-        version: 0.24.2
+        version: 6.11.0(webpack@5.97.1(@swc/core@1.15.24))
       eslint:
         specifier: ^8.55.0
         version: 8.57.1
-      glob:
-        specifier: ^10.3.10
-        version: 10.5.0
       jest:
         specifier: 29.5.x
         version: 29.5.0(@types/node@24.12.2)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@24.12.2)(typescript@5.7.3))
@@ -2561,16 +2351,16 @@ importers:
         version: 5.0.5
       sass-loader:
         specifier: 10.5.x
-        version: 10.5.2(sass@1.69.5)(webpack@5.97.1)
+        version: 10.5.2(sass@1.69.5)(webpack@5.97.1(@swc/core@1.15.24))
       ts-jest:
         specifier: 29.1.x
-        version: 29.1.5(@babel/core@7.25.7)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.7))(esbuild@0.24.2)(jest@29.5.0(@types/node@24.12.2)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@24.12.2)(typescript@5.7.3)))(typescript@5.7.3)
+        version: 29.1.5(@babel/core@7.25.7)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.7))(jest@29.5.0(@types/node@24.12.2)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@24.12.2)(typescript@5.7.3)))(typescript@5.7.3)
       typescript:
         specifier: 5.7.x
         version: 5.7.3
       webpack:
         specifier: 5.97.x
-        version: 5.97.1(@swc/core@1.15.24)(esbuild@0.24.2)(webpack-cli@5.1.4)
+        version: 5.97.1(@swc/core@1.15.24)(webpack-cli@5.1.4)
       webpack-cli:
         specifier: 5.1.x
         version: 5.1.4(webpack@5.97.1)
@@ -2660,7 +2450,7 @@ importers:
         version: 8.19.7(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
       '@wordpress/editor':
         specifier: catalog:wp-min
-        version: 14.19.7(@date-fns/tz@1.4.1)(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@14.16.1)
+        version: 14.19.7(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
       '@wordpress/element':
         specifier: catalog:wp-min
         version: 6.19.1
@@ -2758,36 +2548,24 @@ importers:
       '@woocommerce/eslint-plugin':
         specifier: workspace:*
         version: link:../eslint-plugin
+      '@woocommerce/internal-build':
+        specifier: workspace:*
+        version: link:../internal-build
       '@woocommerce/internal-js-tests':
         specifier: workspace:*
         version: link:../internal-js-tests
-      '@woocommerce/internal-style-build':
-        specifier: workspace:*
-        version: link:../internal-style-build
-      '@woocommerce/internal-ts-config':
-        specifier: workspace:*
-        version: link:../internal-ts-config
       '@wordpress/browserslist-config':
         specifier: next
         version: 6.43.1-next.v.202604091042.0
-      chokidar:
-        specifier: 3.6.x
-        version: 3.6.0
       copy-webpack-plugin:
         specifier: 13.0.x
-        version: 13.0.1(webpack@5.97.1)
+        version: 13.0.1(webpack@5.97.1(@swc/core@1.15.24))
       css-loader:
         specifier: 6.11.x
-        version: 6.11.0(webpack@5.97.1)
-      esbuild:
-        specifier: 0.24.x
-        version: 0.24.2
+        version: 6.11.0(webpack@5.97.1(@swc/core@1.15.24))
       eslint:
         specifier: ^8.55.0
         version: 8.57.1
-      glob:
-        specifier: ^10.3.10
-        version: 10.5.0
       jest:
         specifier: 29.5.x
         version: 29.5.0(@types/node@24.12.2)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@24.12.2)(typescript@5.7.3))
@@ -2820,16 +2598,16 @@ importers:
         version: 5.0.5
       sass-loader:
         specifier: 10.5.x
-        version: 10.5.2(sass@1.69.5)(webpack@5.97.1)
+        version: 10.5.2(sass@1.69.5)(webpack@5.97.1(@swc/core@1.15.24))
       ts-jest:
         specifier: 29.1.x
-        version: 29.1.5(@babel/core@7.25.7)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.7))(esbuild@0.24.2)(jest@29.5.0(@types/node@24.12.2)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@24.12.2)(typescript@5.7.3)))(typescript@5.7.3)
+        version: 29.1.5(@babel/core@7.25.7)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.7))(jest@29.5.0(@types/node@24.12.2)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@24.12.2)(typescript@5.7.3)))(typescript@5.7.3)
       typescript:
         specifier: 5.7.x
         version: 5.7.3
       webpack:
         specifier: 5.97.x
-        version: 5.97.1(@swc/core@1.15.24)(esbuild@0.24.2)(webpack-cli@5.1.4)
+        version: 5.97.1(@swc/core@1.15.24)(webpack-cli@5.1.4)
       webpack-cli:
         specifier: 5.1.x
         version: 5.1.4(webpack@5.97.1)
@@ -2867,27 +2645,18 @@ importers:
       '@woocommerce/eslint-plugin':
         specifier: workspace:*
         version: link:../eslint-plugin
+      '@woocommerce/internal-build':
+        specifier: workspace:*
+        version: link:../internal-build
       '@woocommerce/internal-js-tests':
         specifier: workspace:*
         version: link:../internal-js-tests
-      '@woocommerce/internal-ts-config':
-        specifier: workspace:*
-        version: link:../internal-ts-config
       '@wordpress/jest-console':
         specifier: ^5.4.0
         version: 5.4.0(jest@29.5.0(@types/node@24.12.2)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@24.12.2)(typescript@5.7.3)))
-      chokidar:
-        specifier: 3.6.x
-        version: 3.6.0
-      esbuild:
-        specifier: 0.24.x
-        version: 0.24.2
       eslint:
         specifier: ^8.55.0
         version: 8.57.1
-      glob:
-        specifier: ^10.3.10
-        version: 10.5.0
       jest:
         specifier: 29.5.x
         version: 29.5.0(@types/node@24.12.2)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@24.12.2)(typescript@5.7.3))
@@ -2902,7 +2671,7 @@ importers:
         version: 5.0.5
       ts-jest:
         specifier: 29.1.x
-        version: 29.1.5(@babel/core@7.25.7)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.7))(esbuild@0.24.2)(jest@29.5.0(@types/node@24.12.2)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@24.12.2)(typescript@5.7.3)))(typescript@5.7.3)
+        version: 29.1.5(@babel/core@7.25.7)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.7))(jest@29.5.0(@types/node@24.12.2)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@24.12.2)(typescript@5.7.3)))(typescript@5.7.3)
       typescript:
         specifier: 5.7.x
         version: 5.7.3
@@ -2940,27 +2709,18 @@ importers:
       '@woocommerce/eslint-plugin':
         specifier: workspace:*
         version: link:../eslint-plugin
+      '@woocommerce/internal-build':
+        specifier: workspace:*
+        version: link:../internal-build
       '@woocommerce/internal-js-tests':
         specifier: workspace:*
         version: link:../internal-js-tests
-      '@woocommerce/internal-ts-config':
-        specifier: workspace:*
-        version: link:../internal-ts-config
       '@wordpress/scripts':
         specifier: ^27.0.0
-        version: 27.9.0(@playwright/test@1.59.1)(@swc/core@1.15.24)(@types/eslint@9.6.1)(@types/node@24.12.2)(@types/webpack@4.41.40)(babel-plugin-macros@3.1.0)(encoding@0.1.13)(esbuild@0.24.2)(file-loader@6.2.0(webpack@5.97.1))(node-notifier@8.0.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@24.12.2)(typescript@5.7.3))(type-fest@4.41.0)(typescript@5.7.3)(webpack-hot-middleware@2.26.1)
-      chokidar:
-        specifier: 3.6.x
-        version: 3.6.0
-      esbuild:
-        specifier: 0.24.x
-        version: 0.24.2
+        version: 27.9.0(@playwright/test@1.59.1)(@swc/core@1.15.24)(@types/eslint@9.6.1)(@types/node@24.12.2)(@types/webpack@4.41.40)(babel-plugin-macros@3.1.0)(encoding@0.1.13)(file-loader@6.2.0(webpack@5.97.1))(node-notifier@8.0.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@24.12.2)(typescript@5.7.3))(type-fest@4.41.0)(typescript@5.7.3)(webpack-hot-middleware@2.26.1)
       eslint:
         specifier: ^8.55.0
         version: 8.57.1
-      glob:
-        specifier: ^10.3.10
-        version: 10.5.0
       jest:
         specifier: 29.5.x
         version: 29.5.0(@types/node@24.12.2)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@24.12.2)(typescript@5.7.3))
@@ -2975,7 +2735,7 @@ importers:
         version: 5.0.5
       ts-jest:
         specifier: 29.1.x
-        version: 29.1.5(@babel/core@7.25.7)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.7))(esbuild@0.24.2)(jest@29.5.0(@types/node@24.12.2)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@24.12.2)(typescript@5.7.3)))(typescript@5.7.3)
+        version: 29.1.5(@babel/core@7.25.7)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.7))(jest@29.5.0(@types/node@24.12.2)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@24.12.2)(typescript@5.7.3)))(typescript@5.7.3)
       typescript:
         specifier: 5.7.x
         version: 5.7.3
@@ -3016,24 +2776,15 @@ importers:
       '@woocommerce/eslint-plugin':
         specifier: workspace:*
         version: link:../eslint-plugin
+      '@woocommerce/internal-build':
+        specifier: workspace:*
+        version: link:../internal-build
       '@woocommerce/internal-js-tests':
         specifier: workspace:*
         version: link:../internal-js-tests
-      '@woocommerce/internal-ts-config':
-        specifier: workspace:*
-        version: link:../internal-ts-config
-      chokidar:
-        specifier: 3.6.x
-        version: 3.6.0
-      esbuild:
-        specifier: 0.24.x
-        version: 0.24.2
       eslint:
         specifier: ^8.55.0
         version: 8.57.1
-      glob:
-        specifier: ^10.3.10
-        version: 10.5.0
       jest:
         specifier: 29.5.x
         version: 29.5.0(@types/node@24.12.2)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@24.12.2)(typescript@5.7.3))
@@ -3048,7 +2799,7 @@ importers:
         version: 5.0.5
       ts-jest:
         specifier: 29.1.x
-        version: 29.1.5(@babel/core@7.25.7)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.7))(esbuild@0.24.2)(jest@29.5.0(@types/node@24.12.2)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@24.12.2)(typescript@5.7.3)))(typescript@5.7.3)
+        version: 29.1.5(@babel/core@7.25.7)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.7))(jest@29.5.0(@types/node@24.12.2)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@24.12.2)(typescript@5.7.3)))(typescript@5.7.3)
       typescript:
         specifier: 5.7.x
         version: 5.7.3
@@ -3074,24 +2825,15 @@ importers:
       '@woocommerce/eslint-plugin':
         specifier: workspace:*
         version: link:../eslint-plugin
+      '@woocommerce/internal-build':
+        specifier: workspace:*
+        version: link:../internal-build
       '@woocommerce/internal-js-tests':
         specifier: workspace:*
         version: link:../internal-js-tests
-      '@woocommerce/internal-ts-config':
-        specifier: workspace:*
-        version: link:../internal-ts-config
-      chokidar:
-        specifier: 3.6.x
-        version: 3.6.0
-      esbuild:
-        specifier: 0.24.x
-        version: 0.24.2
       eslint:
         specifier: ^8.55.0
         version: 8.57.1
-      glob:
-        specifier: ^10.3.10
-        version: 10.5.0
       jest:
         specifier: 29.5.x
         version: 29.5.0(@types/node@24.12.2)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@24.12.2)(typescript@5.7.3))
@@ -3106,7 +2848,7 @@ importers:
         version: 5.0.5
       ts-jest:
         specifier: 29.1.x
-        version: 29.1.5(@babel/core@7.25.7)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.7))(esbuild@0.24.2)(jest@29.5.0(@types/node@24.12.2)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@24.12.2)(typescript@5.7.3)))(typescript@5.7.3)
+        version: 29.1.5(@babel/core@7.25.7)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.7))(jest@29.5.0(@types/node@24.12.2)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@24.12.2)(typescript@5.7.3)))(typescript@5.7.3)
       typescript:
         specifier: 5.7.x
         version: 5.7.3
@@ -3170,7 +2912,7 @@ importers:
         version: 6.43.1-next.v.202604091042.0(webpack@5.97.1)
       babel-loader:
         specifier: 9.2.x
-        version: 9.2.1(@babel/core@7.25.7)(webpack@5.97.1)
+        version: 9.2.1(@babel/core@7.25.7)(webpack@5.97.1(@swc/core@1.15.24))
       jest:
         specifier: 29.5.x
         version: 29.5.0(@types/node@24.12.2)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@24.12.2)(typescript@5.7.3))
@@ -3762,15 +3504,12 @@ importers:
       '@woocommerce/experimental-products-app':
         specifier: workspace:*
         version: link:../../../../packages/js/experimental-products-app
+      '@woocommerce/internal-build':
+        specifier: workspace:*
+        version: link:../../../../packages/js/internal-build
       '@woocommerce/internal-js-tests':
         specifier: workspace:*
         version: link:../../../../packages/js/internal-js-tests
-      '@woocommerce/internal-style-build':
-        specifier: workspace:*
-        version: link:../../../../packages/js/internal-style-build
-      '@woocommerce/internal-ts-config':
-        specifier: workspace:*
-        version: link:../../../../packages/js/internal-ts-config
       '@woocommerce/notices':
         specifier: workspace:*
         version: link:../../../../packages/js/notices
@@ -3815,7 +3554,7 @@ importers:
         version: 29.5.0(@babel/core@7.25.7)
       babel-loader:
         specifier: 9.2.x
-        version: 9.2.1(@babel/core@7.25.7)(webpack@5.97.1)
+        version: 9.2.1(@babel/core@7.25.7)(webpack@5.97.1(@swc/core@1.15.24))
       babel-plugin-transform-react-remove-prop-types:
         specifier: 0.4.24
         version: 0.4.24
@@ -3830,10 +3569,10 @@ importers:
         version: 3.3.7
       copy-webpack-plugin:
         specifier: 13.0.x
-        version: 13.0.1(webpack@5.97.1)
+        version: 13.0.1(webpack@5.97.1(@swc/core@1.15.24))
       css-loader:
         specifier: 6.11.x
-        version: 6.11.0(webpack@5.97.1)
+        version: 6.11.0(webpack@5.97.1(@swc/core@1.15.24))
       eslint:
         specifier: ^8.55.0
         version: 8.57.1
@@ -3923,13 +3662,13 @@ importers:
         version: 1.69.5
       sass-loader:
         specifier: 10.5.x
-        version: 10.5.2(sass@1.69.5)(webpack@5.97.1)
+        version: 10.5.2(sass@1.69.5)(webpack@5.97.1(@swc/core@1.15.24))
       stylelint:
         specifier: ^14.16.1
         version: 14.16.1
       ts-jest:
         specifier: 29.1.x
-        version: 29.1.5(@babel/core@7.25.7)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.5.0(@babel/core@7.25.7))(esbuild@0.24.2)(jest@29.5.0(@types/node@24.12.2)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@24.12.2)(typescript@5.7.3)))(typescript@5.7.3)
+        version: 29.1.5(@babel/core@7.25.7)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.5.0(@babel/core@7.25.7))(jest@29.5.0(@types/node@24.12.2)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@24.12.2)(typescript@5.7.3)))(typescript@5.7.3)
       typescript:
         specifier: 5.7.x
         version: 5.7.3
@@ -4237,12 +3976,9 @@ importers:
       '@woocommerce/eslint-plugin':
         specifier: workspace:*
         version: link:../../../../packages/js/eslint-plugin
-      '@woocommerce/internal-style-build':
-        specifier: workspace:*
-        version: link:../../../../packages/js/internal-style-build
-      '@woocommerce/internal-ts-config':
+      '@woocommerce/internal-build':
         specifier: workspace:*
-        version: link:../../../../packages/js/internal-ts-config
+        version: link:../../../../packages/js/internal-build
       '@wordpress/api-fetch':
         specifier: catalog:wp-min
         version: 7.19.2
@@ -4374,13 +4110,13 @@ importers:
         version: 5.2.2(webpack@5.97.1)
       copy-webpack-plugin:
         specifier: 13.0.x
-        version: 13.0.1(webpack@5.97.1)
+        version: 13.0.1(webpack@5.97.1(@swc/core@1.15.24))
       core-js:
         specifier: 3.25.0
         version: 3.25.0
       css-loader:
         specifier: 6.11.x
-        version: 6.11.0(webpack@5.97.1)
+        version: 6.11.0(webpack@5.97.1(@swc/core@1.15.24))
       cssnano:
         specifier: 5.1.12
         version: 5.1.12(postcss@8.4.49)
@@ -4503,7 +4239,7 @@ importers:
         version: 4.3.0
       sass-loader:
         specifier: 10.5.x
-        version: 10.5.2(sass@1.69.5)(webpack@5.97.1)
+        version: 10.5.2(sass@1.69.5)(webpack@5.97.1(@swc/core@1.15.24))
       storybook:
         specifier: ^7.6.4
         version: 7.6.19(encoding@0.1.13)
@@ -4850,7 +4586,7 @@ importers:
         version: link:../../packages/js/eslint-plugin
       copy-webpack-plugin:
         specifier: 13.0.x
-        version: 13.0.1(webpack@5.97.1)
+        version: 13.0.1(webpack@5.97.1(@swc/core@1.15.24))
       eslint:
         specifier: ^8.55.0
         version: 8.57.1
@@ -5083,7 +4819,7 @@ importers:
         version: 5.7.3
       webpack:
         specifier: 5.97.x
-        version: 5.97.1(@swc/core@1.15.24)
+        version: 5.97.1(@swc/core@1.15.24)(webpack-cli@5.1.4)
       wireit:
         specifier: 0.14.12
         version: 0.14.12
@@ -10737,9 +10473,6 @@ packages:
     resolution: {integrity: sha512-6EQW8ysiQkct2MolHlhyqXfZ/Vgl0Cu9dCeHfPEf7S/8575qua1GnuDSFzEqU/8TIrEG88f2e2qP/R7VRB+EwQ==}
     engines: {node: '>=18.12.0', npm: '>=8.19.2'}

-  '@wordpress/base-styles@3.6.0':
-    resolution: {integrity: sha512-6/vXAmc9FSX7Y17UjKgUJoVU++Pv1U1G8uMx7iClRUaLetc7/jj2DD9PTyX/cdJjHr32e3yXuLVT9wfEbo6SEg==}
-
   '@wordpress/base-styles@4.49.0':
     resolution: {integrity: sha512-yFRYqNtd26ULZ0oAHhCu/IcaA0XHI3E7kRCKajZqUvyRQj7YprXnpD3o0/pnwvF6ZFTXzCX8pXHjUc2TIv97ig==}

@@ -11522,6 +11255,11 @@ packages:
     resolution: {integrity: sha512-6I400T3iMrlsQW9s7H+vQVPWhS7EkWQbcAJCw4XHvqpyWi5NpCrH0fCmbbm9PrQ1hPZbqjspZsYg2o7JqOJJGA==}
     engines: {node: '>=18.12.0', npm: '>=8.19.2'}

+  '@wordpress/interactivity@https://codeload.github.com/woocommerce/gutenberg/tar.gz/96b89ddfd6344b417a6e2fcd3748be856bb55b16#path:/packages/interactivity':
+    resolution: {path: /packages/interactivity, tarball: https://codeload.github.com/woocommerce/gutenberg/tar.gz/96b89ddfd6344b417a6e2fcd3748be856bb55b16}
+    version: 6.23.0
+    engines: {node: '>=18.12.0', npm: '>=8.19.2'}
+
   '@wordpress/interface@5.35.0':
     resolution: {integrity: sha512-ClRQQVZQ6dpMwlcFLigdtqLdc8rXRwW4c2MUQTHctnU4Y9Lean+PV4ZhX/QN32gS/vhseCDzO0hg+gjQY6cdjQ==}
     engines: {node: '>=12'}
@@ -11761,10 +11499,6 @@ packages:
       react: ^18.0.0
       react-dom: ^18.0.0

-  '@wordpress/postcss-plugins-preset@1.6.0':
-    resolution: {integrity: sha512-WPToVlX99PiUSSxSbwAR2wJtIpbcnnRkB48sIIkDvw7rCpSWkh6OLuzfj0o5g+JCYuNL1OnQXFA8EtydNEZ9Sw==}
-    engines: {node: '>=10'}
-
   '@wordpress/postcss-plugins-preset@3.10.0':
     resolution: {integrity: sha512-vBXy+8e6BpUvmxcIFgldvFlTFA6kAlC+J86GcDEoIq/IFVoqSJlnX1s1QHXgG3CzTHjIlN/FNJxGxYinSMJhng==}
     engines: {node: '>=12'}
@@ -11789,10 +11523,6 @@ packages:
     peerDependencies:
       postcss: ^8.0.0

-  '@wordpress/postcss-themes@2.6.0':
-    resolution: {integrity: sha512-Q22s1KSVdtoK0Z0ND06V2QwTx/U4KvJhWFmoI8IzYW/LGlk8BkQJhHH157Y9vFliwpMlQpqfXW6/zOg2XtvHzQ==}
-    engines: {node: '>=8'}
-
   '@wordpress/postcss-themes@6.43.1-next.v.202604091042.0':
     resolution: {integrity: sha512-xTg4tQYuoKGHNh312kP+KgKp5o7J7caqEU+gDmkrx6MuIiiOcwOLl0bfMkJda4qhEF/TbVP9Nejf97qxrEII9w==}
     engines: {node: '>=18.12.0', npm: '>=8.19.2'}
@@ -16093,13 +15823,6 @@ packages:
       typescript: '>3.6.0'
       webpack: ^5.11.0

-  fork-ts-checker-webpack-plugin@9.0.3:
-    resolution: {integrity: sha512-zUE6ABwfybBbSH5TIsdAFiR2kfy0nm2yT0DEtujNM4vHbKhbrIsfoC5cPfJa4vqlmcSBPxqIED+EWVPWEw1hTw==}
-    engines: {node: '>=12.13.0'}
-    peerDependencies:
-      typescript: '>3.6.0'
-      webpack: ^5.11.0
-
   form-data@2.3.3:
     resolution: {integrity: sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==}
     engines: {node: '>= 0.12'}
@@ -17623,10 +17346,6 @@ packages:
   is-upper-case@1.1.2:
     resolution: {integrity: sha512-GQYSJMgfeAmVwh9ixyk888l7OIhNAGKtY6QA+IrWlu9MDTCaXmeozOZ2S9Knj7bQwBO/H6J2kb+pbyTUiMNbsw==}

-  is-url-superb@4.0.0:
-    resolution: {integrity: sha512-GI+WjezhPPcbM+tqE9LnmsY5qqjwHzTvjJ36wxYX5ujNXefSUJ/T17r5bqDV8yLhcgB59KTPNOc9O9cmHTPWsA==}
-    engines: {node: '>=10'}
-
   is-utf8@0.2.1:
     resolution: {integrity: sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==}

@@ -20249,10 +19968,6 @@ packages:
     peerDependencies:
       postcss: ^8.4.31

-  postcss-custom-properties@10.0.0:
-    resolution: {integrity: sha512-55BPj5FudpCiPZzBaO+MOeqmwMDa+nV9/0QBJBfhZjYg6D9hE+rW9lpMBLTJoF4OTXnS5Po4yM1nMlgkPbCxFg==}
-    engines: {node: '>=10.0.0'}
-
   postcss-discard-comments@5.1.2:
     resolution: {integrity: sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==}
     engines: {node: ^10 || ^12 || >=14.0}
@@ -20701,10 +20416,6 @@ packages:
   postcss-value-parser@4.2.0:
     resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==}

-  postcss-values-parser@4.0.0:
-    resolution: {integrity: sha512-R9x2D87FcbhwXUmoCXJR85M1BLII5suXRuXibGYyBJ7lVDEpRIdKZh4+8q5S+/+A4m0IoG1U5tFw39asyhX/Hw==}
-    engines: {node: '>=10'}
-
   postcss@6.0.23:
     resolution: {integrity: sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==}
     engines: {node: '>=4.0.0'}
@@ -28376,30 +28087,13 @@ snapshots:
       react-refresh: 0.11.0
       schema-utils: 4.3.3
       source-map: 0.7.6
-      webpack: 5.97.1(@swc/core@1.15.24)(esbuild@0.24.2)(webpack-cli@5.1.4)
+      webpack: 5.97.1(@swc/core@1.15.24)(webpack-cli@5.1.4)
     optionalDependencies:
       '@types/webpack': 4.41.40
       type-fest: 4.41.0
       webpack-dev-server: 4.15.2(webpack-cli@5.1.4)(webpack@5.97.1)
       webpack-hot-middleware: 2.26.1

-  '@pmmmwh/react-refresh-webpack-plugin@0.5.17(@types/webpack@4.41.40)(react-refresh@0.14.2)(type-fest@4.41.0)(webpack-dev-server@4.15.2(webpack@5.97.1(@swc/core@1.15.24)))(webpack-hot-middleware@2.26.1)(webpack@5.97.1(@swc/core@1.15.24))':
-    dependencies:
-      ansi-html: 0.0.9
-      core-js-pure: 3.49.0
-      error-stack-parser: 2.1.4
-      html-entities: 2.6.0
-      loader-utils: 2.0.4
-      react-refresh: 0.14.2
-      schema-utils: 4.3.3
-      source-map: 0.7.6
-      webpack: 5.97.1(@swc/core@1.15.24)
-    optionalDependencies:
-      '@types/webpack': 4.41.40
-      type-fest: 4.41.0
-      webpack-dev-server: 4.15.2(webpack@5.97.1(@swc/core@1.15.24))
-      webpack-hot-middleware: 2.26.1
-
   '@pmmmwh/react-refresh-webpack-plugin@0.5.17(@types/webpack@4.41.40)(react-refresh@0.14.2)(type-fest@4.41.0)(webpack-dev-server@4.15.2)(webpack-hot-middleware@2.26.1)(webpack@5.97.1)':
     dependencies:
       ansi-html: 0.0.9
@@ -29916,12 +29610,12 @@ snapshots:
       '@swc/core': 1.15.24
       '@types/node': 18.19.130
       '@types/semver': 7.7.1
-      babel-loader: 9.2.1(@babel/core@7.25.7)(webpack@5.97.1)
+      babel-loader: 9.2.1(@babel/core@7.25.7)(webpack@5.97.1(@swc/core@1.15.24))
       browser-assert: 1.2.1
       case-sensitive-paths-webpack-plugin: 2.4.0
       cjs-module-lexer: 1.4.3
       constants-browserify: 1.0.0
-      css-loader: 6.11.0(webpack@5.97.1)
+      css-loader: 6.11.0(webpack@5.97.1(@swc/core@1.15.24))
       es-module-lexer: 1.7.0
       express: 4.22.1
       fork-ts-checker-webpack-plugin: 8.0.0(typescript@5.7.3)(webpack@5.97.1)
@@ -29984,12 +29678,12 @@ snapshots:
       semver: 7.7.4
       style-loader: 3.3.4(webpack@5.97.1(@swc/core@1.15.24))
       swc-loader: 0.2.7(@swc/core@1.15.24)(webpack@5.97.1(@swc/core@1.15.24))
-      terser-webpack-plugin: 5.4.0(@swc/core@1.15.24)(webpack@5.97.1(@swc/core@1.15.24))
+      terser-webpack-plugin: 5.4.0(@swc/core@1.15.24)(webpack@5.97.1)
       ts-dedent: 2.2.0
       url: 0.11.4
       util: 0.12.5
       util-deprecate: 1.0.2
-      webpack: 5.97.1(@swc/core@1.15.24)
+      webpack: 5.97.1(@swc/core@1.15.24)(webpack-cli@5.1.4)
       webpack-dev-middleware: 6.1.3(webpack@5.97.1(@swc/core@1.15.24))
       webpack-hot-middleware: 2.26.1
       webpack-virtual-modules: 0.5.0
@@ -30270,7 +29964,7 @@ snapshots:
       ts-dedent: 2.2.0
       unfetch: 4.2.0
       util-deprecate: 1.0.2
-      webpack: 5.97.1(@swc/core@1.15.24)(esbuild@0.24.2)(webpack-cli@5.1.4)
+      webpack: 5.97.1(@swc/core@1.15.24)(webpack-cli@5.1.4)
     optionalDependencies:
       typescript: 5.7.3

@@ -30550,7 +30244,7 @@ snapshots:
       '@storybook/core-server': 6.5.17-alpha.0(encoding@0.1.13)(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.7.3)(webpack-cli@5.1.4)
       react: 18.3.1
       react-dom: 18.3.1(react@18.3.1)
-      webpack: 5.97.1(@swc/core@1.15.24)(esbuild@0.24.2)(webpack-cli@5.1.4)
+      webpack: 5.97.1(@swc/core@1.15.24)(webpack-cli@5.1.4)
     optionalDependencies:
       typescript: 5.7.3
     transitivePeerDependencies:
@@ -30852,7 +30546,7 @@ snapshots:
     dependencies:
       '@babel/preset-flow': 7.27.1(@babel/core@7.25.7)
       '@babel/preset-react': 7.25.7(@babel/core@7.25.7)
-      '@pmmmwh/react-refresh-webpack-plugin': 0.5.17(@types/webpack@4.41.40)(react-refresh@0.14.2)(type-fest@4.41.0)(webpack-dev-server@4.15.2(webpack@5.97.1(@swc/core@1.15.24)))(webpack-hot-middleware@2.26.1)(webpack@5.97.1(@swc/core@1.15.24))
+      '@pmmmwh/react-refresh-webpack-plugin': 0.5.17(@types/webpack@4.41.40)(react-refresh@0.14.2)(type-fest@4.41.0)(webpack-dev-server@4.15.2)(webpack-hot-middleware@2.26.1)(webpack@5.97.1)
       '@storybook/core-webpack': 7.6.19(encoding@0.1.13)
       '@storybook/docs-tools': 7.6.19(encoding@0.1.13)
       '@storybook/node-logger': 7.6.19
@@ -30868,7 +30562,7 @@ snapshots:
       react-dom: 18.3.1(react@18.3.1)
       react-refresh: 0.14.2
       semver: 7.7.4
-      webpack: 5.97.1(@swc/core@1.15.24)
+      webpack: 5.97.1(@swc/core@1.15.24)(webpack-cli@5.1.4)
     optionalDependencies:
       '@babel/core': 7.25.7
       typescript: 5.7.3
@@ -30970,7 +30664,7 @@ snapshots:
       react-docgen-typescript: 2.4.0(typescript@5.7.3)
       tslib: 2.8.1
       typescript: 5.7.3
-      webpack: 5.97.1(@swc/core@1.15.24)
+      webpack: 5.97.1(@swc/core@1.15.24)(webpack-cli@5.1.4)
     transitivePeerDependencies:
       - supports-color

@@ -30998,7 +30692,7 @@ snapshots:
       react-docgen-typescript: 2.4.0(typescript@5.7.3)
       tslib: 2.8.1
       typescript: 5.7.3
-      webpack: 5.97.1(@swc/core@1.15.24)(esbuild@0.24.2)(webpack-cli@5.1.4)
+      webpack: 5.97.1(@swc/core@1.15.24)(webpack-cli@5.1.4)
     transitivePeerDependencies:
       - supports-color

@@ -31066,7 +30760,7 @@ snapshots:
       - webpack-hot-middleware
       - webpack-plugin-serve

-  '@storybook/react@6.5.17-alpha.0(@babel/core@7.25.7)(@swc/core@1.15.24)(@types/webpack@4.41.40)(encoding@0.1.13)(esbuild@0.24.2)(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.7.3)(webpack-cli@5.1.4)(webpack-dev-server@4.15.2)(webpack-hot-middleware@2.26.1)':
+  '@storybook/react@6.5.17-alpha.0(@babel/core@7.25.7)(@swc/core@1.15.24)(@types/webpack@4.41.40)(encoding@0.1.13)(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.7.3)(webpack-cli@5.1.4)(webpack-dev-server@4.15.2)(webpack-hot-middleware@2.26.1)':
     dependencies:
       '@babel/preset-flow': 7.27.1(@babel/core@7.25.7)
       '@babel/preset-react': 7.25.7(@babel/core@7.25.7)
@@ -31105,7 +30799,7 @@ snapshots:
       require-from-string: 2.0.2
       ts-dedent: 2.2.0
       util-deprecate: 1.0.2
-      webpack: 5.97.1(@swc/core@1.15.24)(esbuild@0.24.2)(webpack-cli@5.1.4)
+      webpack: 5.97.1(@swc/core@1.15.24)(webpack-cli@5.1.4)
     optionalDependencies:
       '@babel/core': 7.25.7
       typescript: 5.7.3
@@ -32278,7 +31972,7 @@ snapshots:
       '@wordpress/data': 10.44.0(react@18.3.1)
       '@wordpress/element': 6.44.0
       '@wordpress/global-styles-engine': 1.11.0(react@18.3.1)
-      '@wordpress/keycodes': 4.44.0
+      '@wordpress/keycodes': 4.45.0
       react-autosize-textarea: 7.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
     transitivePeerDependencies:
       - '@emotion/is-prop-valid'
@@ -32318,8 +32012,8 @@ snapshots:
     dependencies:
       '@types/react': 18.3.28
       '@wordpress/components': 28.13.0(@emotion/is-prop-valid@1.4.0)(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
-      '@wordpress/data': 10.19.2(react@18.3.1)
-      '@wordpress/editor': 14.19.7(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+      '@wordpress/data': 10.44.0(react@18.3.1)
+      '@wordpress/editor': 14.44.0(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
       '@wordpress/element': 6.44.0
     transitivePeerDependencies:
       - '@date-fns/tz'
@@ -32334,8 +32028,8 @@ snapshots:
     dependencies:
       '@types/react': 18.3.28
       '@wordpress/components': 28.13.0(@emotion/is-prop-valid@1.4.0)(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
-      '@wordpress/data': 10.19.2(react@18.3.1)
-      '@wordpress/editor': 14.19.7(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@14.16.1)
+      '@wordpress/data': 10.44.0(react@18.3.1)
+      '@wordpress/editor': 14.44.0(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@14.16.1)
       '@wordpress/element': 6.44.0
     transitivePeerDependencies:
       - '@date-fns/tz'
@@ -32898,10 +32592,10 @@ snapshots:

   '@webpack-cli/serve@2.0.5(webpack-cli@5.1.4)(webpack-dev-server@4.15.2)(webpack@5.97.1)':
     dependencies:
-      webpack: 5.97.1(@swc/core@1.15.24)(esbuild@0.18.20)(webpack-cli@5.1.4)
+      webpack: 5.97.1(@swc/core@1.15.24)(webpack-cli@5.1.4)
       webpack-cli: 5.1.4(webpack-bundle-analyzer@4.9.1)(webpack-dev-server@4.15.2)(webpack@5.97.1)
     optionalDependencies:
-      webpack-dev-server: 4.15.2(webpack-cli@5.1.4)(webpack@5.97.1)
+      webpack-dev-server: 4.15.2(debug@4.4.3)(webpack-cli@5.1.4)(webpack@5.97.1)

   '@webpack-cli/serve@2.0.5(webpack-cli@5.1.4)(webpack@5.97.1)':
     dependencies:
@@ -33157,8 +32851,6 @@ snapshots:
     transitivePeerDependencies:
       - supports-color

-  '@wordpress/base-styles@3.6.0': {}
-
   '@wordpress/base-styles@4.49.0': {}

   '@wordpress/base-styles@5.19.1': {}
@@ -33248,7 +32940,7 @@ snapshots:
       '@wordpress/commands': 1.44.0(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
       '@wordpress/components': 29.12.0(@emotion/is-prop-valid@1.4.0)(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
       '@wordpress/compose': 7.44.0(react@18.3.1)
-      '@wordpress/data': 10.19.2(react@18.3.1)
+      '@wordpress/data': 10.44.0(react@18.3.1)
       '@wordpress/date': 5.44.0
       '@wordpress/deprecated': 4.44.0
       '@wordpress/dom': 4.44.0
@@ -33261,7 +32953,7 @@ snapshots:
       '@wordpress/is-shallow-equal': 5.44.0
       '@wordpress/keyboard-shortcuts': 5.44.0(react@18.3.1)
       '@wordpress/keycodes': 4.44.0
-      '@wordpress/notices': 5.19.2(react@18.3.1)
+      '@wordpress/notices': 5.44.0(@emotion/is-prop-valid@1.4.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
       '@wordpress/preferences': 4.44.0(@emotion/is-prop-valid@1.4.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
       '@wordpress/priority-queue': 3.44.0
       '@wordpress/private-apis': 1.44.0
@@ -33733,8 +33425,8 @@ snapshots:
       '@wordpress/blocks': 14.15.0(react@18.3.1)
       '@wordpress/components': 29.12.0(@emotion/is-prop-valid@1.4.0)(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
       '@wordpress/compose': 7.44.0(react@18.3.1)
-      '@wordpress/core-data': 7.19.6(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
-      '@wordpress/data': 10.19.2(react@18.3.1)
+      '@wordpress/core-data': 7.44.0(@date-fns/tz@1.4.1)(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@14.16.1)
+      '@wordpress/data': 10.44.0(react@18.3.1)
       '@wordpress/date': 5.44.0
       '@wordpress/deprecated': 4.44.0
       '@wordpress/dom': 4.44.0
@@ -33748,7 +33440,7 @@ snapshots:
       '@wordpress/interactivity-router': 2.19.1
       '@wordpress/keyboard-shortcuts': 5.44.0(react@18.3.1)
       '@wordpress/keycodes': 4.44.0
-      '@wordpress/notices': 5.19.2(react@18.3.1)
+      '@wordpress/notices': 5.44.0(@emotion/is-prop-valid@1.4.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
       '@wordpress/patterns': 2.44.0(@date-fns/tz@1.4.1)(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@14.16.1)
       '@wordpress/primitives': 4.44.0(react@18.3.1)
       '@wordpress/private-apis': 1.44.0
@@ -33788,8 +33480,8 @@ snapshots:
       '@wordpress/blocks': 14.15.0(react@18.3.1)
       '@wordpress/components': 29.12.0(@emotion/is-prop-valid@1.4.0)(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
       '@wordpress/compose': 7.44.0(react@18.3.1)
-      '@wordpress/core-data': 7.19.6(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
-      '@wordpress/data': 10.19.2(react@18.3.1)
+      '@wordpress/core-data': 7.44.0(@date-fns/tz@1.4.1)(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@16.26.1(typescript@5.7.3))
+      '@wordpress/data': 10.44.0(react@18.3.1)
       '@wordpress/date': 5.44.0
       '@wordpress/deprecated': 4.44.0
       '@wordpress/dom': 4.44.0
@@ -33803,7 +33495,7 @@ snapshots:
       '@wordpress/interactivity-router': 2.19.1
       '@wordpress/keyboard-shortcuts': 5.44.0(react@18.3.1)
       '@wordpress/keycodes': 4.44.0
-      '@wordpress/notices': 5.19.2(react@18.3.1)
+      '@wordpress/notices': 5.44.0(@emotion/is-prop-valid@1.4.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
       '@wordpress/patterns': 2.44.0(@date-fns/tz@1.4.1)(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@16.26.1(typescript@5.7.3))
       '@wordpress/primitives': 4.44.0(react@18.3.1)
       '@wordpress/private-apis': 1.44.0
@@ -33840,11 +33532,11 @@ snapshots:
       '@wordpress/autop': 4.44.0
       '@wordpress/base-styles': 6.20.0
       '@wordpress/blob': 4.44.0
-      '@wordpress/block-editor': 15.17.0(@date-fns/tz@1.4.1)(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@14.16.1)
+      '@wordpress/block-editor': 15.17.0(@date-fns/tz@1.4.1)(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@16.26.1(typescript@5.7.3))
       '@wordpress/blocks': 15.17.0(react@18.3.1)
       '@wordpress/components': 32.6.0(@emotion/is-prop-valid@1.4.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
       '@wordpress/compose': 7.44.0(react@18.3.1)
-      '@wordpress/core-data': 7.44.0(@date-fns/tz@1.4.1)(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@14.16.1)
+      '@wordpress/core-data': 7.44.0(@date-fns/tz@1.4.1)(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@16.26.1(typescript@5.7.3))
       '@wordpress/data': 10.44.0(react@18.3.1)
       '@wordpress/date': 5.45.0
       '@wordpress/deprecated': 4.45.0
@@ -33861,10 +33553,10 @@ snapshots:
       '@wordpress/keycodes': 4.45.0
       '@wordpress/latex-to-mathml': 1.12.0
       '@wordpress/notices': 5.44.0(@emotion/is-prop-valid@1.4.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
-      '@wordpress/patterns': 2.44.0(@date-fns/tz@1.4.1)(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@14.16.1)
+      '@wordpress/patterns': 2.44.0(@date-fns/tz@1.4.1)(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@16.26.1(typescript@5.7.3))
       '@wordpress/primitives': 4.45.0(react@18.3.1)
       '@wordpress/private-apis': 1.44.0
-      '@wordpress/reusable-blocks': 5.44.0(@date-fns/tz@1.4.1)(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@14.16.1)
+      '@wordpress/reusable-blocks': 5.44.0(@date-fns/tz@1.4.1)(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@16.26.1(typescript@5.7.3))
       '@wordpress/rich-text': 7.45.0(react@18.3.1)
       '@wordpress/server-side-render': 6.20.0(@emotion/is-prop-valid@1.4.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
       '@wordpress/upload-media': 0.29.0(@emotion/is-prop-valid@1.4.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
@@ -33964,7 +33656,7 @@ snapshots:
       '@wordpress/autop': 4.44.0
       '@wordpress/blob': 4.44.0
       '@wordpress/block-serialization-default-parser': 5.44.0
-      '@wordpress/data': 10.19.2(react@18.3.1)
+      '@wordpress/data': 10.44.0(react@18.3.1)
       '@wordpress/deprecated': 4.44.0
       '@wordpress/dom': 4.44.0
       '@wordpress/element': 6.44.0
@@ -34073,7 +33765,7 @@ snapshots:
     dependencies:
       '@babel/runtime': 7.25.7
       '@wordpress/components': 29.12.0(@emotion/is-prop-valid@1.4.0)(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
-      '@wordpress/data': 10.19.2(react@18.3.1)
+      '@wordpress/data': 10.44.0(react@18.3.1)
       '@wordpress/element': 6.44.0
       '@wordpress/i18n': 5.26.0
       '@wordpress/icons': 10.32.0(react@18.3.1)
@@ -35002,10 +34694,10 @@ snapshots:

   '@wordpress/core-commands@1.44.0(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
     dependencies:
-      '@wordpress/block-editor': 15.17.0(@date-fns/tz@1.4.1)(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@14.16.1)
+      '@wordpress/block-editor': 15.17.0(@date-fns/tz@1.4.1)(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@16.26.1(typescript@5.7.3))
       '@wordpress/commands': 1.44.0(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
       '@wordpress/compose': 7.44.0(react@18.3.1)
-      '@wordpress/core-data': 7.44.0(@date-fns/tz@1.4.1)(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@14.16.1)
+      '@wordpress/core-data': 7.44.0(@date-fns/tz@1.4.1)(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@16.26.1(typescript@5.7.3))
       '@wordpress/data': 10.44.0(react@18.3.1)
       '@wordpress/element': 6.44.0
       '@wordpress/html-entities': 4.45.0
@@ -35064,18 +34756,18 @@ snapshots:
       '@wordpress/block-editor': 14.21.0(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
       '@wordpress/blocks': 14.15.0(react@18.3.1)
       '@wordpress/compose': 7.44.0(react@18.3.1)
-      '@wordpress/data': 10.19.2(react@18.3.1)
-      '@wordpress/deprecated': 4.44.0
+      '@wordpress/data': 10.44.0(react@18.3.1)
+      '@wordpress/deprecated': 4.45.0
       '@wordpress/element': 6.44.0
-      '@wordpress/html-entities': 4.44.0
+      '@wordpress/html-entities': 4.45.0
       '@wordpress/i18n': 5.26.0
-      '@wordpress/is-shallow-equal': 5.44.0
+      '@wordpress/is-shallow-equal': 5.45.0
       '@wordpress/private-apis': 1.44.0
-      '@wordpress/rich-text': 7.44.0(react@18.3.1)
+      '@wordpress/rich-text': 7.45.0(react@18.3.1)
       '@wordpress/sync': 1.44.0
-      '@wordpress/undo-manager': 1.44.0
+      '@wordpress/undo-manager': 1.45.0
       '@wordpress/url': 4.44.0
-      '@wordpress/warning': 3.44.0
+      '@wordpress/warning': 3.45.0
       change-case: 4.1.2
       equivalent-key-map: 0.2.2
       fast-deep-equal: 3.1.3
@@ -35096,18 +34788,18 @@ snapshots:
       '@wordpress/block-editor': 14.21.0(@emotion/is-prop-valid@1.4.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
       '@wordpress/blocks': 14.15.0(react@18.3.1)
       '@wordpress/compose': 7.44.0(react@18.3.1)
-      '@wordpress/data': 10.19.2(react@18.3.1)
-      '@wordpress/deprecated': 4.44.0
+      '@wordpress/data': 10.44.0(react@18.3.1)
+      '@wordpress/deprecated': 4.45.0
       '@wordpress/element': 6.44.0
-      '@wordpress/html-entities': 4.44.0
+      '@wordpress/html-entities': 4.45.0
       '@wordpress/i18n': 5.26.0
-      '@wordpress/is-shallow-equal': 5.44.0
+      '@wordpress/is-shallow-equal': 5.45.0
       '@wordpress/private-apis': 1.44.0
-      '@wordpress/rich-text': 7.44.0(react@18.3.1)
+      '@wordpress/rich-text': 7.45.0(react@18.3.1)
       '@wordpress/sync': 1.44.0
-      '@wordpress/undo-manager': 1.44.0
+      '@wordpress/undo-manager': 1.45.0
       '@wordpress/url': 4.44.0
-      '@wordpress/warning': 3.44.0
+      '@wordpress/warning': 3.45.0
       change-case: 4.1.2
       equivalent-key-map: 0.2.2
       fast-deep-equal: 3.1.3
@@ -35128,18 +34820,18 @@ snapshots:
       '@wordpress/block-editor': 14.21.0(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
       '@wordpress/blocks': 14.15.0(react@18.3.1)
       '@wordpress/compose': 7.44.0(react@18.3.1)
-      '@wordpress/data': 10.19.2(react@18.3.1)
-      '@wordpress/deprecated': 4.44.0
+      '@wordpress/data': 10.44.0(react@18.3.1)
+      '@wordpress/deprecated': 4.45.0
       '@wordpress/element': 6.44.0
-      '@wordpress/html-entities': 4.44.0
+      '@wordpress/html-entities': 4.45.0
       '@wordpress/i18n': 5.26.0
-      '@wordpress/is-shallow-equal': 5.44.0
+      '@wordpress/is-shallow-equal': 5.45.0
       '@wordpress/private-apis': 1.44.0
-      '@wordpress/rich-text': 7.44.0(react@18.3.1)
+      '@wordpress/rich-text': 7.45.0(react@18.3.1)
       '@wordpress/sync': 1.44.0
-      '@wordpress/undo-manager': 1.44.0
+      '@wordpress/undo-manager': 1.45.0
       '@wordpress/url': 4.44.0
-      '@wordpress/warning': 3.44.0
+      '@wordpress/warning': 3.45.0
       change-case: 4.1.2
       equivalent-key-map: 0.2.2
       fast-deep-equal: 3.1.3
@@ -35264,12 +34956,12 @@ snapshots:
     dependencies:
       '@babel/runtime': 7.25.7
       '@wordpress/compose': 7.44.0(react@18.3.1)
-      '@wordpress/deprecated': 4.44.0
+      '@wordpress/deprecated': 4.45.0
       '@wordpress/element': 6.44.0
-      '@wordpress/is-shallow-equal': 5.44.0
-      '@wordpress/priority-queue': 3.44.0
+      '@wordpress/is-shallow-equal': 5.45.0
+      '@wordpress/priority-queue': 3.45.0
       '@wordpress/private-apis': 1.44.0
-      '@wordpress/redux-routine': 5.44.0(redux@5.0.1)
+      '@wordpress/redux-routine': 5.45.0(redux@5.0.1)
       deepmerge: 4.3.1
       equivalent-key-map: 0.2.2
       is-plain-object: 5.0.0
@@ -35544,7 +35236,7 @@ snapshots:
   '@wordpress/dependency-extraction-webpack-plugin@5.9.0(webpack@5.97.1)':
     dependencies:
       json2php: 0.0.7
-      webpack: 5.97.1(@swc/core@1.15.24)(esbuild@0.24.2)(webpack-cli@5.1.4)
+      webpack: 5.97.1(@swc/core@1.15.24)(webpack-cli@5.1.4)

   '@wordpress/dependency-extraction-webpack-plugin@6.43.1-next.v.202604091042.0(webpack@5.97.1)':
     dependencies:
@@ -35554,7 +35246,7 @@ snapshots:
   '@wordpress/dependency-extraction-webpack-plugin@6.44.0(webpack@5.97.1)':
     dependencies:
       json2php: 0.0.7
-      webpack: 5.97.1(@swc/core@1.15.24)
+      webpack: 5.97.1(@swc/core@1.15.24)(webpack-cli@5.1.4)

   '@wordpress/deprecated@3.58.0':
     dependencies:
@@ -35680,7 +35372,7 @@ snapshots:
       '@wordpress/components': 29.12.0(@emotion/is-prop-valid@1.4.0)(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
       '@wordpress/compose': 7.44.0(react@18.3.1)
       '@wordpress/core-commands': 1.44.0(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
-      '@wordpress/core-data': 7.44.0(@date-fns/tz@1.4.1)(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@14.16.1)
+      '@wordpress/core-data': 7.44.0(@date-fns/tz@1.4.1)(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@16.26.1(typescript@5.7.3))
       '@wordpress/data': 10.44.0(react@18.3.1)
       '@wordpress/deprecated': 4.44.0
       '@wordpress/dom': 4.44.0
@@ -35842,32 +35534,32 @@ snapshots:
       '@wordpress/commands': 1.44.0(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
       '@wordpress/components': 29.12.0(@emotion/is-prop-valid@1.4.0)(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
       '@wordpress/compose': 7.44.0(react@18.3.1)
-      '@wordpress/core-data': 7.19.6(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
-      '@wordpress/data': 10.19.2(react@18.3.1)
+      '@wordpress/core-data': 7.44.0(@date-fns/tz@1.4.1)(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@14.16.1)
+      '@wordpress/data': 10.44.0(react@18.3.1)
       '@wordpress/dataviews': 4.22.0(@emotion/is-prop-valid@1.4.0)(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
-      '@wordpress/date': 5.44.0
-      '@wordpress/deprecated': 4.44.0
-      '@wordpress/dom': 4.44.0
+      '@wordpress/date': 5.45.0
+      '@wordpress/deprecated': 4.45.0
+      '@wordpress/dom': 4.45.0
       '@wordpress/element': 6.44.0
       '@wordpress/fields': 0.11.6(@date-fns/tz@1.4.1)(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(date-fns@3.6.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@14.16.1)
-      '@wordpress/hooks': 4.44.0
-      '@wordpress/html-entities': 4.44.0
+      '@wordpress/hooks': 4.45.0
+      '@wordpress/html-entities': 4.45.0
       '@wordpress/i18n': 5.26.0
       '@wordpress/icons': 10.32.0(react@18.3.1)
       '@wordpress/interface': 9.29.0(@date-fns/tz@1.4.1)(@emotion/is-prop-valid@1.4.0)(@types/react@18.3.28)(date-fns@3.6.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@14.16.1)
       '@wordpress/keyboard-shortcuts': 5.44.0(react@18.3.1)
-      '@wordpress/keycodes': 4.44.0
+      '@wordpress/keycodes': 4.45.0
       '@wordpress/media-utils': 5.44.0(@date-fns/tz@1.4.1)(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(date-fns@3.6.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@14.16.1)
-      '@wordpress/notices': 5.19.2(react@18.3.1)
+      '@wordpress/notices': 5.44.0(@emotion/is-prop-valid@1.4.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
       '@wordpress/patterns': 2.44.0(@date-fns/tz@1.4.1)(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@14.16.1)
       '@wordpress/plugins': 7.44.0(@emotion/is-prop-valid@1.4.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
       '@wordpress/preferences': 4.44.0(@emotion/is-prop-valid@1.4.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
       '@wordpress/private-apis': 1.44.0
       '@wordpress/reusable-blocks': 5.44.0(@date-fns/tz@1.4.1)(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@14.16.1)
-      '@wordpress/rich-text': 7.44.0(react@18.3.1)
+      '@wordpress/rich-text': 7.45.0(react@18.3.1)
       '@wordpress/server-side-render': 5.23.0(@emotion/is-prop-valid@1.4.0)(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
       '@wordpress/url': 4.44.0
-      '@wordpress/warning': 3.44.0
+      '@wordpress/warning': 3.45.0
       '@wordpress/wordcount': 4.44.0
       change-case: 4.1.2
       client-zip: 2.5.0
@@ -35901,32 +35593,32 @@ snapshots:
       '@wordpress/commands': 1.44.0(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
       '@wordpress/components': 29.12.0(@emotion/is-prop-valid@1.4.0)(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
       '@wordpress/compose': 7.44.0(react@18.3.1)
-      '@wordpress/core-data': 7.19.6(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
-      '@wordpress/data': 10.19.2(react@18.3.1)
+      '@wordpress/core-data': 7.44.0(@date-fns/tz@1.4.1)(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@16.26.1(typescript@5.7.3))
+      '@wordpress/data': 10.44.0(react@18.3.1)
       '@wordpress/dataviews': 4.22.0(@emotion/is-prop-valid@1.4.0)(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
-      '@wordpress/date': 5.44.0
-      '@wordpress/deprecated': 4.44.0
-      '@wordpress/dom': 4.44.0
+      '@wordpress/date': 5.45.0
+      '@wordpress/deprecated': 4.45.0
+      '@wordpress/dom': 4.45.0
       '@wordpress/element': 6.44.0
-      '@wordpress/fields': 0.11.6(@date-fns/tz@1.4.1)(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(date-fns@3.6.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@14.16.1)
-      '@wordpress/hooks': 4.44.0
-      '@wordpress/html-entities': 4.44.0
+      '@wordpress/fields': 0.11.6(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(date-fns@3.6.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+      '@wordpress/hooks': 4.45.0
+      '@wordpress/html-entities': 4.45.0
       '@wordpress/i18n': 5.26.0
       '@wordpress/icons': 10.32.0(react@18.3.1)
       '@wordpress/interface': 9.29.0(@date-fns/tz@1.4.1)(@emotion/is-prop-valid@1.4.0)(@types/react@18.3.28)(date-fns@3.6.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@14.16.1)
       '@wordpress/keyboard-shortcuts': 5.44.0(react@18.3.1)
-      '@wordpress/keycodes': 4.44.0
-      '@wordpress/media-utils': 5.44.0(@date-fns/tz@1.4.1)(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(date-fns@3.6.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@14.16.1)
-      '@wordpress/notices': 5.19.2(react@18.3.1)
-      '@wordpress/patterns': 2.44.0(@date-fns/tz@1.4.1)(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@14.16.1)
+      '@wordpress/keycodes': 4.45.0
+      '@wordpress/media-utils': 5.44.0(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(date-fns@3.6.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+      '@wordpress/notices': 5.44.0(@emotion/is-prop-valid@1.4.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+      '@wordpress/patterns': 2.44.0(@date-fns/tz@1.4.1)(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@16.26.1(typescript@5.7.3))
       '@wordpress/plugins': 7.44.0(@emotion/is-prop-valid@1.4.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
       '@wordpress/preferences': 4.44.0(@emotion/is-prop-valid@1.4.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
       '@wordpress/private-apis': 1.44.0
-      '@wordpress/reusable-blocks': 5.44.0(@date-fns/tz@1.4.1)(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@14.16.1)
-      '@wordpress/rich-text': 7.44.0(react@18.3.1)
+      '@wordpress/reusable-blocks': 5.44.0(@date-fns/tz@1.4.1)(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@16.26.1(typescript@5.7.3))
+      '@wordpress/rich-text': 7.45.0(react@18.3.1)
       '@wordpress/server-side-render': 5.23.0(@emotion/is-prop-valid@1.4.0)(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
       '@wordpress/url': 4.44.0
-      '@wordpress/warning': 3.44.0
+      '@wordpress/warning': 3.45.0
       '@wordpress/wordcount': 4.44.0
       change-case: 4.1.2
       client-zip: 2.5.0
@@ -35949,7 +35641,7 @@ snapshots:
       - stylelint
       - supports-color

-  '@wordpress/editor@14.19.7(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@14.16.1)':
+  '@wordpress/editor@14.19.7(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@16.26.1(typescript@5.7.3))':
     dependencies:
       '@babel/runtime': 7.25.7
       '@wordpress/a11y': 4.19.1
@@ -35960,32 +35652,32 @@ snapshots:
       '@wordpress/commands': 1.44.0(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
       '@wordpress/components': 29.12.0(@emotion/is-prop-valid@1.4.0)(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
       '@wordpress/compose': 7.44.0(react@18.3.1)
-      '@wordpress/core-data': 7.19.6(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
-      '@wordpress/data': 10.19.2(react@18.3.1)
+      '@wordpress/core-data': 7.44.0(@date-fns/tz@1.4.1)(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@16.26.1(typescript@5.7.3))
+      '@wordpress/data': 10.44.0(react@18.3.1)
       '@wordpress/dataviews': 4.22.0(@emotion/is-prop-valid@1.4.0)(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
-      '@wordpress/date': 5.44.0
-      '@wordpress/deprecated': 4.44.0
-      '@wordpress/dom': 4.44.0
+      '@wordpress/date': 5.45.0
+      '@wordpress/deprecated': 4.45.0
+      '@wordpress/dom': 4.45.0
       '@wordpress/element': 6.44.0
-      '@wordpress/fields': 0.11.6(@date-fns/tz@1.4.1)(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(date-fns@3.6.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@14.16.1)
-      '@wordpress/hooks': 4.44.0
-      '@wordpress/html-entities': 4.44.0
+      '@wordpress/fields': 0.11.6(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(date-fns@3.6.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@16.26.1(typescript@5.7.3))
+      '@wordpress/hooks': 4.45.0
+      '@wordpress/html-entities': 4.45.0
       '@wordpress/i18n': 5.26.0
       '@wordpress/icons': 10.32.0(react@18.3.1)
-      '@wordpress/interface': 9.29.0(@date-fns/tz@1.4.1)(@emotion/is-prop-valid@1.4.0)(@types/react@18.3.28)(date-fns@3.6.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@14.16.1)
+      '@wordpress/interface': 9.29.0(@date-fns/tz@1.4.1)(@emotion/is-prop-valid@1.4.0)(@types/react@18.3.28)(date-fns@3.6.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@16.26.1(typescript@5.7.3))
       '@wordpress/keyboard-shortcuts': 5.44.0(react@18.3.1)
-      '@wordpress/keycodes': 4.44.0
-      '@wordpress/media-utils': 5.44.0(@date-fns/tz@1.4.1)(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(date-fns@3.6.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@14.16.1)
-      '@wordpress/notices': 5.19.2(react@18.3.1)
-      '@wordpress/patterns': 2.44.0(@date-fns/tz@1.4.1)(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@14.16.1)
+      '@wordpress/keycodes': 4.45.0
+      '@wordpress/media-utils': 5.44.0(@date-fns/tz@1.4.1)(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(date-fns@3.6.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@16.26.1(typescript@5.7.3))
+      '@wordpress/notices': 5.44.0(@emotion/is-prop-valid@1.4.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+      '@wordpress/patterns': 2.44.0(@date-fns/tz@1.4.1)(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@16.26.1(typescript@5.7.3))
       '@wordpress/plugins': 7.44.0(@emotion/is-prop-valid@1.4.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
       '@wordpress/preferences': 4.44.0(@emotion/is-prop-valid@1.4.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
       '@wordpress/private-apis': 1.44.0
-      '@wordpress/reusable-blocks': 5.44.0(@date-fns/tz@1.4.1)(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@14.16.1)
-      '@wordpress/rich-text': 7.44.0(react@18.3.1)
+      '@wordpress/reusable-blocks': 5.44.0(@date-fns/tz@1.4.1)(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@16.26.1(typescript@5.7.3))
+      '@wordpress/rich-text': 7.45.0(react@18.3.1)
       '@wordpress/server-side-render': 5.23.0(@emotion/is-prop-valid@1.4.0)(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
       '@wordpress/url': 4.44.0
-      '@wordpress/warning': 3.44.0
+      '@wordpress/warning': 3.45.0
       '@wordpress/wordcount': 4.44.0
       change-case: 4.1.2
       client-zip: 2.5.0
@@ -36008,43 +35700,43 @@ snapshots:
       - stylelint
       - supports-color

-  '@wordpress/editor@14.19.7(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@16.26.1(typescript@5.7.3))':
+  '@wordpress/editor@14.19.7(@emotion/is-prop-valid@1.4.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
     dependencies:
       '@babel/runtime': 7.25.7
       '@wordpress/a11y': 4.19.1
       '@wordpress/api-fetch': 7.44.0
       '@wordpress/blob': 4.44.0
-      '@wordpress/block-editor': 14.21.0(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+      '@wordpress/block-editor': 14.21.0(@emotion/is-prop-valid@1.4.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
       '@wordpress/blocks': 14.15.0(react@18.3.1)
       '@wordpress/commands': 1.44.0(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
       '@wordpress/components': 29.12.0(@emotion/is-prop-valid@1.4.0)(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
       '@wordpress/compose': 7.44.0(react@18.3.1)
-      '@wordpress/core-data': 7.19.6(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
-      '@wordpress/data': 10.19.2(react@18.3.1)
+      '@wordpress/core-data': 7.44.0(@emotion/is-prop-valid@1.4.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+      '@wordpress/data': 10.44.0(react@18.3.1)
       '@wordpress/dataviews': 4.22.0(@emotion/is-prop-valid@1.4.0)(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
-      '@wordpress/date': 5.44.0
-      '@wordpress/deprecated': 4.44.0
-      '@wordpress/dom': 4.44.0
+      '@wordpress/date': 5.45.0
+      '@wordpress/deprecated': 4.45.0
+      '@wordpress/dom': 4.45.0
       '@wordpress/element': 6.44.0
-      '@wordpress/fields': 0.11.6(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(date-fns@3.6.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@16.26.1(typescript@5.7.3))
-      '@wordpress/hooks': 4.44.0
-      '@wordpress/html-entities': 4.44.0
+      '@wordpress/fields': 0.11.6(@emotion/is-prop-valid@1.4.0)(date-fns@3.6.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+      '@wordpress/hooks': 4.45.0
+      '@wordpress/html-entities': 4.45.0
       '@wordpress/i18n': 5.26.0
       '@wordpress/icons': 10.32.0(react@18.3.1)
-      '@wordpress/interface': 9.29.0(@date-fns/tz@1.4.1)(@emotion/is-prop-valid@1.4.0)(@types/react@18.3.28)(date-fns@3.6.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@16.26.1(typescript@5.7.3))
+      '@wordpress/interface': 9.29.0(@emotion/is-prop-valid@1.4.0)(date-fns@3.6.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
       '@wordpress/keyboard-shortcuts': 5.44.0(react@18.3.1)
-      '@wordpress/keycodes': 4.44.0
-      '@wordpress/media-utils': 5.44.0(@date-fns/tz@1.4.1)(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(date-fns@3.6.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@16.26.1(typescript@5.7.3))
-      '@wordpress/notices': 5.19.2(react@18.3.1)
-      '@wordpress/patterns': 2.44.0(@date-fns/tz@1.4.1)(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@16.26.1(typescript@5.7.3))
+      '@wordpress/keycodes': 4.45.0
+      '@wordpress/media-utils': 5.44.0(@emotion/is-prop-valid@1.4.0)(date-fns@3.6.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+      '@wordpress/notices': 5.44.0(@emotion/is-prop-valid@1.4.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+      '@wordpress/patterns': 2.44.0(@emotion/is-prop-valid@1.4.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
       '@wordpress/plugins': 7.44.0(@emotion/is-prop-valid@1.4.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
       '@wordpress/preferences': 4.44.0(@emotion/is-prop-valid@1.4.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
       '@wordpress/private-apis': 1.44.0
-      '@wordpress/reusable-blocks': 5.44.0(@date-fns/tz@1.4.1)(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@16.26.1(typescript@5.7.3))
-      '@wordpress/rich-text': 7.44.0(react@18.3.1)
+      '@wordpress/reusable-blocks': 5.44.0(@emotion/is-prop-valid@1.4.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+      '@wordpress/rich-text': 7.45.0(react@18.3.1)
       '@wordpress/server-side-render': 5.23.0(@emotion/is-prop-valid@1.4.0)(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
       '@wordpress/url': 4.44.0
-      '@wordpress/warning': 3.44.0
+      '@wordpress/warning': 3.45.0
       '@wordpress/wordcount': 4.44.0
       change-case: 4.1.2
       client-zip: 2.5.0
@@ -36067,51 +35759,59 @@ snapshots:
       - stylelint
       - supports-color

-  '@wordpress/editor@14.19.7(@emotion/is-prop-valid@1.4.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+  '@wordpress/editor@14.44.0(@date-fns/tz@1.4.1)(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@16.26.1(typescript@5.7.3))':
     dependencies:
-      '@babel/runtime': 7.25.7
-      '@wordpress/a11y': 4.19.1
+      '@floating-ui/react-dom': 2.0.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+      '@wordpress/a11y': 4.45.0
       '@wordpress/api-fetch': 7.44.0
+      '@wordpress/base-styles': 6.20.0
       '@wordpress/blob': 4.44.0
-      '@wordpress/block-editor': 14.21.0(@emotion/is-prop-valid@1.4.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
-      '@wordpress/blocks': 14.15.0(react@18.3.1)
+      '@wordpress/block-editor': 15.17.0(@date-fns/tz@1.4.1)(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@16.26.1(typescript@5.7.3))
+      '@wordpress/block-serialization-default-parser': 5.44.0
+      '@wordpress/blocks': 15.17.0(react@18.3.1)
       '@wordpress/commands': 1.44.0(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
-      '@wordpress/components': 29.12.0(@emotion/is-prop-valid@1.4.0)(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+      '@wordpress/components': 32.6.0(@emotion/is-prop-valid@1.4.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
       '@wordpress/compose': 7.44.0(react@18.3.1)
-      '@wordpress/core-data': 7.19.6(@emotion/is-prop-valid@1.4.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
-      '@wordpress/data': 10.19.2(react@18.3.1)
-      '@wordpress/dataviews': 4.22.0(@emotion/is-prop-valid@1.4.0)(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+      '@wordpress/core-data': 7.44.0(@date-fns/tz@1.4.1)(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@16.26.1(typescript@5.7.3))
+      '@wordpress/data': 10.44.0(react@18.3.1)
+      '@wordpress/dataviews': 14.2.0(@date-fns/tz@1.4.1)(@emotion/is-prop-valid@1.4.0)(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@16.26.1(typescript@5.7.3))
       '@wordpress/date': 5.44.0
       '@wordpress/deprecated': 4.44.0
       '@wordpress/dom': 4.44.0
       '@wordpress/element': 6.44.0
-      '@wordpress/fields': 0.11.6(@emotion/is-prop-valid@1.4.0)(date-fns@3.6.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+      '@wordpress/fields': 0.36.0(@date-fns/tz@1.4.1)(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(date-fns@3.6.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@16.26.1(typescript@5.7.3))
+      '@wordpress/global-styles-engine': 1.11.0(react@18.3.1)
+      '@wordpress/global-styles-ui': 1.11.0(@date-fns/tz@1.4.1)(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@16.26.1(typescript@5.7.3))
       '@wordpress/hooks': 4.44.0
       '@wordpress/html-entities': 4.44.0
-      '@wordpress/i18n': 5.26.0
-      '@wordpress/icons': 10.32.0(react@18.3.1)
-      '@wordpress/interface': 9.29.0(@emotion/is-prop-valid@1.4.0)(date-fns@3.6.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+      '@wordpress/i18n': 6.18.0
+      '@wordpress/icons': 12.2.0(react@18.3.1)
+      '@wordpress/interface': 9.29.0(@date-fns/tz@1.4.1)(@emotion/is-prop-valid@1.4.0)(@types/react@18.3.28)(date-fns@3.6.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@16.26.1(typescript@5.7.3))
       '@wordpress/keyboard-shortcuts': 5.44.0(react@18.3.1)
       '@wordpress/keycodes': 4.44.0
-      '@wordpress/media-utils': 5.44.0(@emotion/is-prop-valid@1.4.0)(date-fns@3.6.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
-      '@wordpress/notices': 5.19.2(react@18.3.1)
-      '@wordpress/patterns': 2.44.0(@emotion/is-prop-valid@1.4.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+      '@wordpress/media-editor': 0.7.0(@date-fns/tz@1.4.1)(@emotion/is-prop-valid@1.4.0)(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@16.26.1(typescript@5.7.3))
+      '@wordpress/media-fields': 0.9.0(@date-fns/tz@1.4.1)(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@16.26.1(typescript@5.7.3))
+      '@wordpress/media-utils': 5.44.0(@date-fns/tz@1.4.1)(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(date-fns@3.6.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@16.26.1(typescript@5.7.3))
+      '@wordpress/notices': 5.44.0(@emotion/is-prop-valid@1.4.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+      '@wordpress/patterns': 2.44.0(@date-fns/tz@1.4.1)(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@16.26.1(typescript@5.7.3))
       '@wordpress/plugins': 7.44.0(@emotion/is-prop-valid@1.4.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
       '@wordpress/preferences': 4.44.0(@emotion/is-prop-valid@1.4.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
       '@wordpress/private-apis': 1.44.0
-      '@wordpress/reusable-blocks': 5.44.0(@emotion/is-prop-valid@1.4.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+      '@wordpress/reusable-blocks': 5.44.0(@date-fns/tz@1.4.1)(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@16.26.1(typescript@5.7.3))
       '@wordpress/rich-text': 7.44.0(react@18.3.1)
-      '@wordpress/server-side-render': 5.23.0(@emotion/is-prop-valid@1.4.0)(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+      '@wordpress/server-side-render': 6.20.0(@emotion/is-prop-valid@1.4.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+      '@wordpress/upload-media': 0.29.0(@emotion/is-prop-valid@1.4.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
       '@wordpress/url': 4.44.0
+      '@wordpress/views': 1.11.0(@date-fns/tz@1.4.1)(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@16.26.1(typescript@5.7.3))
       '@wordpress/warning': 3.44.0
       '@wordpress/wordcount': 4.44.0
       change-case: 4.1.2
       client-zip: 2.5.0
       clsx: 2.1.1
+      colord: 2.9.3
       date-fns: 3.6.0
-      deepmerge: 4.3.1
+      diff: 4.0.4
       fast-deep-equal: 3.1.3
-      is-plain-object: 5.0.0
       memize: 2.1.1
       react: 18.3.1
       react-autosize-textarea: 7.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
@@ -36126,7 +35826,7 @@ snapshots:
       - stylelint
       - supports-color

-  '@wordpress/editor@14.44.0(@date-fns/tz@1.4.1)(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@16.26.1(typescript@5.7.3))':
+  '@wordpress/editor@14.44.0(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
     dependencies:
       '@floating-ui/react-dom': 2.0.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
       '@wordpress/a11y': 4.45.0
@@ -36146,19 +35846,19 @@ snapshots:
       '@wordpress/deprecated': 4.44.0
       '@wordpress/dom': 4.44.0
       '@wordpress/element': 6.44.0
-      '@wordpress/fields': 0.36.0(@date-fns/tz@1.4.1)(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(date-fns@3.6.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@16.26.1(typescript@5.7.3))
+      '@wordpress/fields': 0.36.0(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(date-fns@3.6.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
       '@wordpress/global-styles-engine': 1.11.0(react@18.3.1)
       '@wordpress/global-styles-ui': 1.11.0(@date-fns/tz@1.4.1)(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@16.26.1(typescript@5.7.3))
       '@wordpress/hooks': 4.44.0
       '@wordpress/html-entities': 4.44.0
       '@wordpress/i18n': 6.18.0
       '@wordpress/icons': 12.2.0(react@18.3.1)
-      '@wordpress/interface': 9.29.0(@date-fns/tz@1.4.1)(@emotion/is-prop-valid@1.4.0)(@types/react@18.3.28)(date-fns@3.6.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@16.26.1(typescript@5.7.3))
+      '@wordpress/interface': 9.29.0(@date-fns/tz@1.4.1)(@emotion/is-prop-valid@1.4.0)(@types/react@18.3.28)(date-fns@3.6.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@14.16.1)
       '@wordpress/keyboard-shortcuts': 5.44.0(react@18.3.1)
       '@wordpress/keycodes': 4.44.0
       '@wordpress/media-editor': 0.7.0(@date-fns/tz@1.4.1)(@emotion/is-prop-valid@1.4.0)(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@16.26.1(typescript@5.7.3))
       '@wordpress/media-fields': 0.9.0(@date-fns/tz@1.4.1)(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@16.26.1(typescript@5.7.3))
-      '@wordpress/media-utils': 5.44.0(@date-fns/tz@1.4.1)(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(date-fns@3.6.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@16.26.1(typescript@5.7.3))
+      '@wordpress/media-utils': 5.44.0(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(date-fns@3.6.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
       '@wordpress/notices': 5.44.0(@emotion/is-prop-valid@1.4.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
       '@wordpress/patterns': 2.44.0(@date-fns/tz@1.4.1)(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@16.26.1(typescript@5.7.3))
       '@wordpress/plugins': 7.44.0(@emotion/is-prop-valid@1.4.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
@@ -36193,7 +35893,7 @@ snapshots:
       - stylelint
       - supports-color

-  '@wordpress/editor@14.44.0(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+  '@wordpress/editor@14.44.0(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@14.16.1)':
     dependencies:
       '@floating-ui/react-dom': 2.0.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
       '@wordpress/a11y': 4.45.0
@@ -36213,9 +35913,9 @@ snapshots:
       '@wordpress/deprecated': 4.44.0
       '@wordpress/dom': 4.44.0
       '@wordpress/element': 6.44.0
-      '@wordpress/fields': 0.36.0(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(date-fns@3.6.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+      '@wordpress/fields': 0.36.0(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(date-fns@3.6.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@14.16.1)
       '@wordpress/global-styles-engine': 1.11.0(react@18.3.1)
-      '@wordpress/global-styles-ui': 1.11.0(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+      '@wordpress/global-styles-ui': 1.11.0(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@14.16.1)
       '@wordpress/hooks': 4.44.0
       '@wordpress/html-entities': 4.44.0
       '@wordpress/i18n': 6.18.0
@@ -36223,7 +35923,7 @@ snapshots:
       '@wordpress/interface': 9.29.0(@date-fns/tz@1.4.1)(@emotion/is-prop-valid@1.4.0)(@types/react@18.3.28)(date-fns@3.6.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@14.16.1)
       '@wordpress/keyboard-shortcuts': 5.44.0(react@18.3.1)
       '@wordpress/keycodes': 4.44.0
-      '@wordpress/media-editor': 0.7.0(@emotion/is-prop-valid@1.4.0)(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+      '@wordpress/media-editor': 0.7.0(@emotion/is-prop-valid@1.4.0)(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@14.16.1)
       '@wordpress/media-fields': 0.9.0(@date-fns/tz@1.4.1)(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@14.16.1)
       '@wordpress/media-utils': 5.44.0(@date-fns/tz@1.4.1)(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(date-fns@3.6.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@14.16.1)
       '@wordpress/notices': 5.44.0(@emotion/is-prop-valid@1.4.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
@@ -36376,7 +36076,7 @@ snapshots:
       cosmiconfig: 7.1.0
       eslint: 8.57.1
       eslint-config-prettier: 8.10.2(eslint@8.57.1)
-      eslint-plugin-import: 2.32.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.7.3))(eslint-import-resolver-typescript@3.6.1)(eslint-import-resolver-webpack@0.13.11)(eslint@8.57.1)
+      eslint-plugin-import: 2.32.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.7.3))(eslint-import-resolver-typescript@4.4.4)(eslint-import-resolver-webpack@0.13.2)(eslint@8.57.1)
       eslint-plugin-jest: 27.9.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1)(jest@29.5.0(@types/node@24.12.2)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@24.12.2)(typescript@5.7.3)))(typescript@5.7.3)
       eslint-plugin-jsdoc: 39.9.1(eslint@8.57.1)
       eslint-plugin-jsx-a11y: 6.10.2(eslint@8.57.1)
@@ -36405,7 +36105,7 @@ snapshots:
       cosmiconfig: 7.1.0
       eslint: 8.57.1
       eslint-config-prettier: 8.10.2(eslint@8.57.1)
-      eslint-plugin-import: 2.32.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.7.3))(eslint-import-resolver-typescript@3.6.1)(eslint-import-resolver-webpack@0.13.11)(eslint@8.57.1)
+      eslint-plugin-import: 2.32.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.7.3))(eslint-import-resolver-typescript@4.4.4)(eslint-import-resolver-webpack@0.13.2)(eslint@8.57.1)
       eslint-plugin-jest: 27.9.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1)(jest@29.7.0(@types/node@24.12.2)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@24.12.2)(typescript@5.7.3)))(typescript@5.7.3)
       eslint-plugin-jsdoc: 39.9.1(eslint@8.57.1)
       eslint-plugin-jsx-a11y: 6.10.2(eslint@8.57.1)
@@ -36434,7 +36134,7 @@ snapshots:
       cosmiconfig: 7.1.0
       eslint: 8.57.1
       eslint-config-prettier: 8.10.2(eslint@8.57.1)
-      eslint-plugin-import: 2.32.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.7.3))(eslint-import-resolver-typescript@3.6.1)(eslint-import-resolver-webpack@0.13.11)(eslint@8.57.1)
+      eslint-plugin-import: 2.32.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.7.3))(eslint-import-resolver-typescript@4.4.4)(eslint-import-resolver-webpack@0.13.2)(eslint@8.57.1)
       eslint-plugin-jest: 27.9.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1)(jest@29.5.0(@types/node@24.12.2)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@24.12.2)(typescript@5.7.3)))(typescript@5.7.3)
       eslint-plugin-jsdoc: 39.9.1(eslint@8.57.1)
       eslint-plugin-jsx-a11y: 6.10.2(eslint@8.57.1)
@@ -36586,6 +36286,47 @@ snapshots:
       - stylelint
       - supports-color

+  '@wordpress/fields@0.11.6(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(date-fns@3.6.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+    dependencies:
+      '@babel/runtime': 7.25.7
+      '@wordpress/api-fetch': 7.44.0
+      '@wordpress/blob': 4.44.0
+      '@wordpress/block-editor': 14.21.0(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+      '@wordpress/blocks': 14.15.0(react@18.3.1)
+      '@wordpress/components': 29.12.0(@emotion/is-prop-valid@1.4.0)(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+      '@wordpress/compose': 7.44.0(react@18.3.1)
+      '@wordpress/core-data': 7.44.0(@date-fns/tz@1.4.1)(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@16.26.1(typescript@5.7.3))
+      '@wordpress/data': 10.44.0(react@18.3.1)
+      '@wordpress/dataviews': 4.22.0(@emotion/is-prop-valid@1.4.0)(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+      '@wordpress/date': 5.45.0
+      '@wordpress/element': 6.44.0
+      '@wordpress/hooks': 4.45.0
+      '@wordpress/html-entities': 4.45.0
+      '@wordpress/i18n': 5.26.0
+      '@wordpress/icons': 10.32.0(react@18.3.1)
+      '@wordpress/media-utils': 5.44.0(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(date-fns@3.6.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+      '@wordpress/notices': 5.44.0(@emotion/is-prop-valid@1.4.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+      '@wordpress/patterns': 2.44.0(@date-fns/tz@1.4.1)(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@16.26.1(typescript@5.7.3))
+      '@wordpress/primitives': 4.45.0(react@18.3.1)
+      '@wordpress/private-apis': 1.44.0
+      '@wordpress/router': 1.44.0(react@18.3.1)
+      '@wordpress/url': 4.44.0
+      '@wordpress/warning': 3.45.0
+      change-case: 4.1.2
+      client-zip: 2.5.0
+      clsx: 2.1.1
+      react: 18.3.1
+      remove-accents: 0.5.0
+    transitivePeerDependencies:
+      - '@date-fns/tz'
+      - '@emotion/is-prop-valid'
+      - '@types/react'
+      - '@types/react-dom'
+      - date-fns
+      - react-dom
+      - stylelint
+      - supports-color
+
   '@wordpress/fields@0.11.6(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(date-fns@3.6.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@16.26.1(typescript@5.7.3))':
     dependencies:
       '@babel/runtime': 7.25.7
@@ -36711,6 +36452,48 @@ snapshots:
       - supports-color

   '@wordpress/fields@0.36.0(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(date-fns@3.6.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+    dependencies:
+      '@react-spring/web': 9.7.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+      '@wordpress/api-fetch': 7.44.0
+      '@wordpress/base-styles': 6.20.0
+      '@wordpress/blob': 4.44.0
+      '@wordpress/blocks': 15.17.0(react@18.3.1)
+      '@wordpress/components': 32.6.0(@emotion/is-prop-valid@1.4.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+      '@wordpress/compose': 7.44.0(react@18.3.1)
+      '@wordpress/core-data': 7.44.0(@date-fns/tz@1.4.1)(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@16.26.1(typescript@5.7.3))
+      '@wordpress/data': 10.44.0(react@18.3.1)
+      '@wordpress/dataviews': 14.2.0(@date-fns/tz@1.4.1)(@emotion/is-prop-valid@1.4.0)(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@16.26.1(typescript@5.7.3))
+      '@wordpress/date': 5.45.0
+      '@wordpress/element': 6.44.0
+      '@wordpress/hooks': 4.45.0
+      '@wordpress/html-entities': 4.45.0
+      '@wordpress/i18n': 6.18.0
+      '@wordpress/icons': 12.2.0(react@18.3.1)
+      '@wordpress/media-utils': 5.44.0(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(date-fns@3.6.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+      '@wordpress/notices': 5.44.0(@emotion/is-prop-valid@1.4.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+      '@wordpress/patterns': 2.44.0(@date-fns/tz@1.4.1)(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@16.26.1(typescript@5.7.3))
+      '@wordpress/primitives': 4.45.0(react@18.3.1)
+      '@wordpress/private-apis': 1.44.0
+      '@wordpress/router': 1.44.0(react@18.3.1)
+      '@wordpress/url': 4.44.0
+      '@wordpress/warning': 3.45.0
+      '@wordpress/wordcount': 4.44.0
+      change-case: 4.1.2
+      client-zip: 2.5.0
+      clsx: 2.1.1
+      react: 18.3.1
+      remove-accents: 0.5.0
+    transitivePeerDependencies:
+      - '@date-fns/tz'
+      - '@emotion/is-prop-valid'
+      - '@types/react'
+      - '@types/react-dom'
+      - date-fns
+      - react-dom
+      - stylelint
+      - supports-color
+
+  '@wordpress/fields@0.36.0(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(date-fns@3.6.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@14.16.1)':
     dependencies:
       '@react-spring/web': 9.7.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
       '@wordpress/api-fetch': 7.44.0
@@ -36759,7 +36542,7 @@ snapshots:
       '@wordpress/block-editor': 14.21.0(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
       '@wordpress/components': 29.12.0(@emotion/is-prop-valid@1.4.0)(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
       '@wordpress/compose': 7.44.0(react@18.3.1)
-      '@wordpress/data': 10.19.2(react@18.3.1)
+      '@wordpress/data': 10.44.0(react@18.3.1)
       '@wordpress/element': 6.44.0
       '@wordpress/html-entities': 4.44.0
       '@wordpress/i18n': 5.26.0
@@ -36820,7 +36603,7 @@ snapshots:
       - stylelint
       - supports-color

-  '@wordpress/global-styles-ui@1.11.0(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+  '@wordpress/global-styles-ui@1.11.0(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@14.16.1)':
     dependencies:
       '@wordpress/a11y': 4.45.0
       '@wordpress/api-fetch': 7.44.0
@@ -37012,7 +36795,7 @@ snapshots:
   '@wordpress/interactivity-router@2.19.1':
     dependencies:
       '@wordpress/a11y': 4.45.0
-      '@wordpress/interactivity': 6.19.1
+      '@wordpress/interactivity': https://codeload.github.com/woocommerce/gutenberg/tar.gz/96b89ddfd6344b417a6e2fcd3748be856bb55b16#path:/packages/interactivity

   '@wordpress/interactivity-router@2.44.0':
     dependencies:
@@ -37039,6 +36822,11 @@ snapshots:
       '@preact/signals': 1.3.4(preact@10.29.1)
       preact: 10.29.1

+  '@wordpress/interactivity@https://codeload.github.com/woocommerce/gutenberg/tar.gz/96b89ddfd6344b417a6e2fcd3748be856bb55b16#path:/packages/interactivity':
+    dependencies:
+      '@preact/signals': 1.3.4(preact@10.29.1)
+      preact: 10.29.1
+
   '@wordpress/interface@5.35.0(@emotion/is-prop-valid@1.4.0)(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
     dependencies:
       '@babel/runtime': 7.25.7
@@ -37146,7 +36934,7 @@ snapshots:
       '@wordpress/a11y': 4.45.0
       '@wordpress/components': 29.12.0(@emotion/is-prop-valid@1.4.0)(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
       '@wordpress/compose': 7.44.0(react@18.3.1)
-      '@wordpress/data': 10.19.2(react@18.3.1)
+      '@wordpress/data': 10.44.0(react@18.3.1)
       '@wordpress/deprecated': 4.44.0
       '@wordpress/element': 6.44.0
       '@wordpress/i18n': 5.26.0
@@ -37201,7 +36989,7 @@ snapshots:
       jest-matcher-utils: 29.7.0
       jest-mock: 29.7.0

-  '@wordpress/jest-console@8.44.0(jest@29.7.0(@types/node@24.12.2)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@24.12.2)(typescript@5.7.3)))':
+  '@wordpress/jest-console@8.44.0(jest@29.7.0(@types/node@24.12.2)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@24.12.2)(typescript@5.7.3)))':
     dependencies:
       jest: 29.7.0(@types/node@24.12.2)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@24.12.2)(typescript@5.7.3))
       jest-matcher-utils: 29.7.0
@@ -37219,7 +37007,7 @@ snapshots:
   '@wordpress/jest-preset-default@12.22.0(@babel/core@7.25.7)(jest@29.7.0(@types/node@24.12.2)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@24.12.2)(typescript@5.7.3)))':
     dependencies:
       '@babel/core': 7.25.7
-      '@wordpress/jest-console': 8.44.0(jest@29.7.0(@types/node@24.12.2)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@24.12.2)(typescript@5.7.3)))
+      '@wordpress/jest-console': 8.44.0(jest@29.7.0(@types/node@24.12.2)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@24.12.2)(typescript@5.7.3)))
       babel-jest: 29.7.0(@babel/core@7.25.7)
       jest: 29.7.0(@types/node@24.12.2)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@24.12.2)(typescript@5.7.3))
     transitivePeerDependencies:
@@ -37234,10 +37022,10 @@ snapshots:
     transitivePeerDependencies:
       - supports-color

-  '@wordpress/jest-preset-default@12.44.0(@babel/core@7.25.7)(jest@29.7.0(@types/node@24.12.2)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@24.12.2)(typescript@5.7.3)))':
+  '@wordpress/jest-preset-default@12.44.0(@babel/core@7.25.7)(jest@29.7.0(@types/node@24.12.2)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@24.12.2)(typescript@5.7.3)))':
     dependencies:
       '@babel/core': 7.25.7
-      '@wordpress/jest-console': 8.44.0(jest@29.7.0(@types/node@24.12.2)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@24.12.2)(typescript@5.7.3)))
+      '@wordpress/jest-console': 8.44.0(jest@29.7.0(@types/node@24.12.2)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@24.12.2)(typescript@5.7.3)))
       babel-jest: 29.7.0(@babel/core@7.25.7)
       jest: 29.7.0(@types/node@24.12.2)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@24.12.2)(typescript@5.7.3))
     transitivePeerDependencies:
@@ -37268,7 +37056,7 @@ snapshots:
   '@wordpress/keyboard-shortcuts@5.19.2(react@18.3.1)':
     dependencies:
       '@babel/runtime': 7.25.7
-      '@wordpress/data': 10.19.2(react@18.3.1)
+      '@wordpress/data': 10.44.0(react@18.3.1)
       '@wordpress/element': 6.44.0
       '@wordpress/keycodes': 4.44.0
       react: 18.3.1
@@ -37322,7 +37110,7 @@ snapshots:
       - stylelint
       - supports-color

-  '@wordpress/media-editor@0.7.0(@emotion/is-prop-valid@1.4.0)(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+  '@wordpress/media-editor@0.7.0(@emotion/is-prop-valid@1.4.0)(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@14.16.1)':
     dependencies:
       '@babel/runtime': 7.25.7
       '@wordpress/components': 32.6.0(@emotion/is-prop-valid@1.4.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
@@ -37488,6 +37276,35 @@ snapshots:
       - stylelint
       - supports-color

+  '@wordpress/media-utils@5.44.0(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(date-fns@3.6.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+    dependencies:
+      '@wordpress/api-fetch': 7.44.0
+      '@wordpress/base-styles': 6.20.0
+      '@wordpress/blob': 4.44.0
+      '@wordpress/components': 32.6.0(@emotion/is-prop-valid@1.4.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+      '@wordpress/core-data': 7.44.0(@date-fns/tz@1.4.1)(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@16.26.1(typescript@5.7.3))
+      '@wordpress/data': 10.44.0(react@18.3.1)
+      '@wordpress/dataviews': 14.2.0(@date-fns/tz@1.4.1)(@emotion/is-prop-valid@1.4.0)(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@16.26.1(typescript@5.7.3))
+      '@wordpress/element': 6.44.0
+      '@wordpress/i18n': 6.18.0
+      '@wordpress/icons': 12.2.0(react@18.3.1)
+      '@wordpress/media-fields': 0.9.0(@date-fns/tz@1.4.1)(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@16.26.1(typescript@5.7.3))
+      '@wordpress/notices': 5.44.0(@emotion/is-prop-valid@1.4.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+      '@wordpress/private-apis': 1.44.0
+      '@wordpress/ui': 0.11.0(@date-fns/tz@1.4.1)(@types/react@18.3.28)(date-fns@3.6.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@14.16.1)
+      '@wordpress/views': 1.11.0(@date-fns/tz@1.4.1)(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@16.26.1(typescript@5.7.3))
+      clsx: 2.1.1
+      react: 18.3.1
+    transitivePeerDependencies:
+      - '@date-fns/tz'
+      - '@emotion/is-prop-valid'
+      - '@types/react'
+      - '@types/react-dom'
+      - date-fns
+      - react-dom
+      - stylelint
+      - supports-color
+
   '@wordpress/media-utils@5.44.0(@emotion/is-prop-valid@1.4.0)(date-fns@3.6.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
     dependencies:
       '@wordpress/api-fetch': 7.44.0
@@ -37528,7 +37345,7 @@ snapshots:
     dependencies:
       '@babel/runtime': 7.25.7
       '@wordpress/a11y': 4.19.1
-      '@wordpress/data': 10.19.2(react@18.3.1)
+      '@wordpress/data': 10.44.0(react@18.3.1)
       react: 18.3.1

   '@wordpress/notices@5.44.0(@emotion/is-prop-valid@1.4.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
@@ -37752,13 +37569,6 @@ snapshots:
       - '@emotion/is-prop-valid'
       - supports-color

-  '@wordpress/postcss-plugins-preset@1.6.0':
-    dependencies:
-      '@wordpress/base-styles': 3.6.0
-      '@wordpress/postcss-themes': 2.6.0
-      autoprefixer: 9.8.6
-      postcss-custom-properties: 10.0.0
-
   '@wordpress/postcss-plugins-preset@3.10.0(postcss@8.4.49)':
     dependencies:
       '@wordpress/base-styles': 4.49.0
@@ -37771,6 +37581,12 @@ snapshots:
       autoprefixer: 10.5.0(postcss@8.4.49)
       postcss: 8.4.49

+  '@wordpress/postcss-plugins-preset@4.42.0(postcss@8.5.9)':
+    dependencies:
+      '@wordpress/base-styles': 4.49.0
+      autoprefixer: 10.5.0(postcss@8.5.9)
+      postcss: 8.5.9
+
   '@wordpress/postcss-plugins-preset@5.43.1-next.v.202604091042.0(postcss@8.4.49)':
     dependencies:
       '@wordpress/base-styles': 6.20.0
@@ -37778,13 +37594,6 @@ snapshots:
       postcss: 8.4.49
       postcss-import: 16.1.1(postcss@8.4.49)

-  '@wordpress/postcss-plugins-preset@5.43.1-next.v.202604091042.0(postcss@8.5.9)':
-    dependencies:
-      '@wordpress/base-styles': 6.20.0
-      autoprefixer: 10.5.0(postcss@8.5.9)
-      postcss: 8.5.9
-      postcss-import: 16.1.1(postcss@8.5.9)
-
   '@wordpress/postcss-plugins-preset@5.44.0(postcss@8.4.49)':
     dependencies:
       '@wordpress/base-styles': 6.20.0
@@ -37792,10 +37601,6 @@ snapshots:
       postcss: 8.4.49
       postcss-import: 16.1.1(postcss@8.4.49)

-  '@wordpress/postcss-themes@2.6.0':
-    dependencies:
-      postcss: 7.0.39
-
   '@wordpress/postcss-themes@6.43.1-next.v.202604091042.0(postcss@8.4.49)':
     dependencies:
       postcss: 8.4.49
@@ -37826,7 +37631,7 @@ snapshots:
       '@wordpress/a11y': 4.45.0
       '@wordpress/components': 29.12.0(@emotion/is-prop-valid@1.4.0)(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
       '@wordpress/compose': 7.44.0(react@18.3.1)
-      '@wordpress/data': 10.19.2(react@18.3.1)
+      '@wordpress/data': 10.44.0(react@18.3.1)
       '@wordpress/deprecated': 4.44.0
       '@wordpress/element': 6.44.0
       '@wordpress/i18n': 5.26.0
@@ -38130,7 +37935,7 @@ snapshots:
       '@babel/runtime': 7.25.7
       '@wordpress/a11y': 4.45.0
       '@wordpress/compose': 7.44.0(react@18.3.1)
-      '@wordpress/data': 10.19.2(react@18.3.1)
+      '@wordpress/data': 10.44.0(react@18.3.1)
       '@wordpress/deprecated': 4.44.0
       '@wordpress/element': 6.44.0
       '@wordpress/escape-html': 3.44.0
@@ -38227,7 +38032,7 @@ snapshots:
       check-node-version: 4.2.1
       clean-webpack-plugin: 3.0.0(webpack@5.97.1)
       cross-spawn: 5.1.0
-      css-loader: 6.11.0(webpack@5.97.1)
+      css-loader: 6.11.0(webpack@5.97.1(@swc/core@1.15.24))
       cssnano: 5.1.12(postcss@8.4.49)
       cwd: 0.10.0
       dir-glob: 3.0.1
@@ -38288,7 +38093,7 @@ snapshots:
       - utf-8-validate
       - webpack-dev-server

-  '@wordpress/scripts@27.9.0(@playwright/test@1.59.1)(@swc/core@1.15.24)(@types/eslint@9.6.1)(@types/node@24.12.2)(@types/webpack@4.41.40)(babel-plugin-macros@3.1.0)(encoding@0.1.13)(esbuild@0.24.2)(file-loader@6.2.0(webpack@5.97.1))(node-notifier@8.0.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@24.12.2)(typescript@5.7.3))(type-fest@4.41.0)(typescript@5.7.3)(webpack-hot-middleware@2.26.1)':
+  '@wordpress/scripts@27.9.0(@playwright/test@1.59.1)(@swc/core@1.15.24)(@types/eslint@9.6.1)(@types/node@24.12.2)(@types/webpack@4.41.40)(babel-plugin-macros@3.1.0)(encoding@0.1.13)(file-loader@6.2.0(webpack@5.97.1))(node-notifier@8.0.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@24.12.2)(typescript@5.7.3))(type-fest@4.41.0)(typescript@5.7.3)(webpack-hot-middleware@2.26.1)':
     dependencies:
       '@babel/core': 7.25.7
       '@playwright/test': 1.59.1
@@ -38313,7 +38118,7 @@ snapshots:
       clean-webpack-plugin: 3.0.0(webpack@5.97.1)
       copy-webpack-plugin: 10.2.4(webpack@5.97.1)
       cross-spawn: 5.1.0
-      css-loader: 6.11.0(webpack@5.97.1)
+      css-loader: 6.11.0(webpack@5.97.1(@swc/core@1.15.24))
       cssnano: 6.1.2(postcss@8.4.49)
       cwd: 0.10.0
       dir-glob: 3.0.1
@@ -38345,9 +38150,9 @@ snapshots:
       sass-loader: 12.6.0(sass@1.69.5)(webpack@5.97.1)
       source-map-loader: 3.0.2(webpack@5.97.1)
       stylelint: 14.16.1
-      terser-webpack-plugin: 5.4.0(@swc/core@1.15.24)(esbuild@0.24.2)(webpack@5.97.1)
+      terser-webpack-plugin: 5.4.0(@swc/core@1.15.24)(webpack@5.97.1)
       url-loader: 4.1.1(file-loader@6.2.0(webpack@5.97.1))(webpack@5.97.1)
-      webpack: 5.97.1(@swc/core@1.15.24)(esbuild@0.24.2)(webpack-cli@5.1.4)
+      webpack: 5.97.1(@swc/core@1.15.24)(webpack-cli@5.1.4)
       webpack-bundle-analyzer: 4.9.1
       webpack-cli: 5.1.4(webpack-bundle-analyzer@4.9.1)(webpack-dev-server@4.15.2)(webpack@5.97.1)
       webpack-dev-server: 4.15.2(webpack-cli@5.1.4)(webpack@5.97.1)
@@ -38395,21 +38200,21 @@ snapshots:
       '@wordpress/dependency-extraction-webpack-plugin': 6.44.0(webpack@5.97.1)
       '@wordpress/e2e-test-utils-playwright': 1.44.0(@playwright/test@1.59.1)(@types/node@24.12.2)
       '@wordpress/eslint-plugin': 22.22.0(@babel/core@7.25.7)(@types/eslint@9.6.1)(eslint-import-resolver-webpack@0.13.2)(eslint@8.57.1)(jest@29.7.0(@types/node@24.12.2)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@24.12.2)(typescript@5.7.3)))(typescript@5.7.3)(wp-prettier@3.0.3)
-      '@wordpress/jest-preset-default': 12.44.0(@babel/core@7.25.7)(jest@29.7.0(@types/node@24.12.2)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@24.12.2)(typescript@5.7.3)))
+      '@wordpress/jest-preset-default': 12.44.0(@babel/core@7.25.7)(jest@29.7.0(@types/node@24.12.2)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@24.12.2)(typescript@5.7.3)))
       '@wordpress/npm-package-json-lint-config': 5.44.0(npm-package-json-lint@6.4.0(typescript@5.7.3))
       '@wordpress/postcss-plugins-preset': 5.44.0(postcss@8.4.49)
       '@wordpress/prettier-config': 4.44.0(wp-prettier@3.0.3)
       '@wordpress/stylelint-config': 23.36.0(postcss@8.4.49)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint-scss@6.14.0(stylelint@16.26.1(typescript@5.7.3)))(stylelint@16.26.1(typescript@5.7.3))
       adm-zip: 0.5.17
       babel-jest: 29.7.0(@babel/core@7.25.7)
-      babel-loader: 9.2.1(@babel/core@7.25.7)(webpack@5.97.1)
+      babel-loader: 9.2.1(@babel/core@7.25.7)(webpack@5.97.1(@swc/core@1.15.24))
       browserslist: 4.28.2
       chalk: 4.1.2
       check-node-version: 4.2.1
       clean-webpack-plugin: 3.0.0(webpack@5.97.1)
       copy-webpack-plugin: 10.2.4(webpack@5.97.1)
       cross-spawn: 7.0.6
-      css-loader: 6.11.0(webpack@5.97.1)
+      css-loader: 6.11.0(webpack@5.97.1(@swc/core@1.15.24))
       cssnano: 6.1.2(postcss@8.4.49)
       cwd: 0.10.0
       dir-glob: 3.0.1
@@ -38492,20 +38297,20 @@ snapshots:
       '@wordpress/dependency-extraction-webpack-plugin': 6.44.0(webpack@5.97.1)
       '@wordpress/e2e-test-utils-playwright': 1.44.0(@playwright/test@1.59.1)(@types/node@24.12.2)
       '@wordpress/eslint-plugin': 22.22.0(@babel/core@7.25.7)(@types/eslint@9.6.1)(eslint@8.57.1)(jest@29.7.0(@types/node@24.12.2)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@24.12.2)(typescript@5.7.3)))(typescript@5.7.3)(wp-prettier@3.0.3)
-      '@wordpress/jest-preset-default': 12.44.0(@babel/core@7.25.7)(jest@29.7.0(@types/node@24.12.2)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@24.12.2)(typescript@5.7.3)))
+      '@wordpress/jest-preset-default': 12.44.0(@babel/core@7.25.7)(jest@29.7.0(@types/node@24.12.2)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@24.12.2)(typescript@5.7.3)))
       '@wordpress/npm-package-json-lint-config': 5.44.0(npm-package-json-lint@6.4.0(typescript@5.7.3))
       '@wordpress/postcss-plugins-preset': 5.44.0(postcss@8.4.49)
       '@wordpress/prettier-config': 4.44.0(wp-prettier@3.0.3)
       '@wordpress/stylelint-config': 23.36.0(postcss@8.4.49)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint-scss@6.14.0(stylelint@14.16.1))(stylelint@16.26.1(typescript@5.7.3))
       adm-zip: 0.5.17
       babel-jest: 29.7.0(@babel/core@7.25.7)
-      babel-loader: 9.2.1(@babel/core@7.25.7)(webpack@5.97.1)
+      babel-loader: 9.2.1(@babel/core@7.25.7)(webpack@5.97.1(@swc/core@1.15.24))
       browserslist: 4.28.2
       chalk: 4.1.2
       check-node-version: 4.2.1
       copy-webpack-plugin: 10.2.4(webpack@5.97.1)
       cross-spawn: 7.0.6
-      css-loader: 6.11.0(webpack@5.97.1)
+      css-loader: 6.11.0(webpack@5.97.1(@swc/core@1.15.24))
       cssnano: 6.1.2(postcss@8.4.49)
       cwd: 0.10.0
       dir-glob: 3.0.1
@@ -38541,7 +38346,7 @@ snapshots:
       stylelint: 16.26.1(typescript@5.7.3)
       terser-webpack-plugin: 5.4.0(@swc/core@1.15.24)(webpack@5.97.1)
       url-loader: 4.1.1(file-loader@6.2.0(webpack@5.97.1))(webpack@5.97.1)
-      webpack: 5.97.1(@swc/core@1.15.24)
+      webpack: 5.97.1(@swc/core@1.15.24)(webpack-cli@5.1.4)
       webpack-bundle-analyzer: 4.9.1
       webpack-cli: 5.1.4(webpack-bundle-analyzer@4.9.1)(webpack-dev-server@4.15.2)(webpack@5.97.1)
       webpack-dev-server: 4.15.2(webpack-cli@5.1.4)(webpack@5.97.1)
@@ -38590,19 +38395,19 @@ snapshots:
       '@wordpress/eslint-plugin': 14.7.0(@babel/core@7.25.7)(eslint@8.57.1)(jest@29.7.0(@types/node@24.12.2)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@24.12.2)(typescript@5.7.3)))(typescript@5.7.3)(wp-prettier@3.0.3)
       '@wordpress/jest-preset-default': 12.22.0(@babel/core@7.25.7)(jest@29.7.0(@types/node@24.12.2)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@24.12.2)(typescript@5.7.3)))
       '@wordpress/npm-package-json-lint-config': 5.44.0(npm-package-json-lint@6.4.0(typescript@5.7.3))
-      '@wordpress/postcss-plugins-preset': 1.6.0
+      '@wordpress/postcss-plugins-preset': 5.44.0(postcss@8.4.49)
       '@wordpress/prettier-config': 2.17.0(wp-prettier@3.0.3)
       '@wordpress/stylelint-config': 21.41.0(postcss@8.4.49)(stylelint@16.26.1(typescript@5.7.3))
       adm-zip: 0.5.17
       babel-jest: 29.7.0(@babel/core@7.25.7)
-      babel-loader: 9.2.1(@babel/core@7.25.7)(webpack@5.97.1)
+      babel-loader: 9.2.1(@babel/core@7.25.7)(webpack@5.97.1(@swc/core@1.15.24))
       browserslist: 4.28.2
       chalk: 4.1.2
       check-node-version: 4.2.1
       clean-webpack-plugin: 3.0.0(webpack@5.97.1)
       copy-webpack-plugin: 10.2.4(webpack@5.97.1)
       cross-spawn: 5.1.0
-      css-loader: 6.11.0(webpack@5.97.1)
+      css-loader: 6.11.0(webpack@5.97.1(@swc/core@1.15.24))
       cssnano: 6.1.2(postcss@8.4.49)
       cwd: 0.10.0
       dir-glob: 3.0.1
@@ -38638,7 +38443,7 @@ snapshots:
       stylelint: 16.26.1(typescript@5.7.3)
       terser-webpack-plugin: 5.4.0(@swc/core@1.15.24)(webpack@5.97.1)
       url-loader: 4.1.1(file-loader@6.2.0(webpack@5.97.1))(webpack@5.97.1)
-      webpack: 5.97.1(@swc/core@1.15.24)
+      webpack: 5.97.1(@swc/core@1.15.24)(webpack-cli@5.1.4)
       webpack-bundle-analyzer: 4.9.1
       webpack-cli: 5.1.4(webpack-bundle-analyzer@4.9.1)(webpack-dev-server@4.15.2)(webpack@5.97.1)
       webpack-dev-server: 4.15.2(webpack-cli@5.1.4)(webpack@5.97.1)
@@ -38700,7 +38505,7 @@ snapshots:
       '@wordpress/blocks': 14.15.0(react@18.3.1)
       '@wordpress/components': 29.12.0(@emotion/is-prop-valid@1.4.0)(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
       '@wordpress/compose': 7.44.0(react@18.3.1)
-      '@wordpress/data': 10.19.2(react@18.3.1)
+      '@wordpress/data': 10.44.0(react@18.3.1)
       '@wordpress/deprecated': 4.44.0
       '@wordpress/element': 6.44.0
       '@wordpress/i18n': 5.26.0
@@ -39083,7 +38888,7 @@ snapshots:
       '@wordpress/keycodes': 4.45.0
       '@wordpress/primitives': 4.45.0(react@18.3.1)
       '@wordpress/private-apis': 1.44.0
-      '@wordpress/theme': 0.12.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@14.16.1)
+      '@wordpress/theme': 0.12.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@16.26.1(typescript@5.7.3))
       clsx: 2.1.1
       react: 18.3.1
       react-dom: 18.3.1(react@18.3.1)
@@ -39094,9 +38899,9 @@ snapshots:
       - date-fns
       - stylelint

-  '@wordpress/ui@0.13.1-next.v.202605131032.0(@date-fns/tz@1.4.1)(@types/react@18.3.28)(date-fns@4.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@16.26.1(typescript@5.7.3))':
+  '@wordpress/ui@0.13.1-next.v.202605131032.0(@date-fns/tz@1.4.1)(@types/react@18.3.28)(date-fns@3.6.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@16.26.1(typescript@5.7.3))':
     dependencies:
-      '@base-ui/react': 1.4.1(@date-fns/tz@1.4.1)(@types/react@18.3.28)(date-fns@4.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+      '@base-ui/react': 1.4.1(@date-fns/tz@1.4.1)(@types/react@18.3.28)(date-fns@3.6.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
       '@wordpress/a11y': 4.45.1-next.v.202605131032.0
       '@wordpress/compose': 7.45.1-next.v.202605131032.0(react@18.3.1)
       '@wordpress/element': 6.45.1-next.v.202605131032.0
@@ -39239,7 +39044,7 @@ snapshots:
     dependencies:
       '@babel/runtime': 7.25.7
       '@wordpress/compose': 7.44.0(react@18.3.1)
-      '@wordpress/data': 10.19.2(react@18.3.1)
+      '@wordpress/data': 10.44.0(react@18.3.1)
       '@wordpress/element': 6.44.0
       react: 18.3.1

@@ -39348,11 +39153,11 @@ snapshots:
     dependencies:
       '@wordpress/api-fetch': 7.44.0
       '@wordpress/base-styles': 6.20.0
-      '@wordpress/block-editor': 15.17.0(@date-fns/tz@1.4.1)(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@14.16.1)
+      '@wordpress/block-editor': 15.17.0(@date-fns/tz@1.4.1)(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@16.26.1(typescript@5.7.3))
       '@wordpress/blocks': 15.17.0(react@18.3.1)
       '@wordpress/components': 32.6.0(@emotion/is-prop-valid@1.4.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
       '@wordpress/compose': 7.44.0(react@18.3.1)
-      '@wordpress/core-data': 7.44.0(@date-fns/tz@1.4.1)(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@14.16.1)
+      '@wordpress/core-data': 7.44.0(@date-fns/tz@1.4.1)(@emotion/is-prop-valid@1.4.0)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@16.26.1(typescript@5.7.3))
       '@wordpress/data': 10.44.0(react@18.3.1)
       '@wordpress/element': 6.44.0
       '@wordpress/i18n': 6.18.0
@@ -40283,16 +40088,9 @@ snapshots:
       loader-utils: 2.0.4
       make-dir: 3.1.0
       schema-utils: 2.7.1
-      webpack: 5.97.1(@swc/core@1.15.24)(esbuild@0.24.2)(webpack-cli@5.1.4)
+      webpack: 5.97.1(@swc/core@1.15.24)(webpack-cli@5.1.4)

   babel-loader@9.2.1(@babel/core@7.25.7)(webpack@5.97.1(@swc/core@1.15.24)):
-    dependencies:
-      '@babel/core': 7.25.7
-      find-cache-dir: 4.0.0
-      schema-utils: 4.3.3
-      webpack: 5.97.1(@swc/core@1.15.24)
-
-  babel-loader@9.2.1(@babel/core@7.25.7)(webpack@5.97.1):
     dependencies:
       '@babel/core': 7.25.7
       find-cache-dir: 4.0.0
@@ -41246,7 +41044,7 @@ snapshots:
     dependencies:
       '@types/webpack': 4.41.40
       del: 4.1.1
-      webpack: 5.97.1(@swc/core@1.15.24)(esbuild@0.24.2)(webpack-cli@5.1.4)
+      webpack: 5.97.1(@swc/core@1.15.24)(webpack-cli@5.1.4)

   cli-boxes@1.0.0: {}

@@ -41656,7 +41454,7 @@ snapshots:
       normalize-path: 3.0.0
       schema-utils: 4.3.3
       serialize-javascript: 6.0.2
-      webpack: 5.97.1(@swc/core@1.15.24)(esbuild@0.24.2)(webpack-cli@5.1.4)
+      webpack: 5.97.1(@swc/core@1.15.24)(webpack-cli@5.1.4)

   copy-webpack-plugin@13.0.1(webpack@5.97.1(@swc/core@1.15.24)):
     dependencies:
@@ -41665,16 +41463,7 @@ snapshots:
       schema-utils: 4.3.3
       serialize-javascript: 6.0.2
       tinyglobby: 0.2.16
-      webpack: 5.97.1(@swc/core@1.15.24)
-
-  copy-webpack-plugin@13.0.1(webpack@5.97.1):
-    dependencies:
-      glob-parent: 6.0.2
-      normalize-path: 3.0.0
-      schema-utils: 4.3.3
-      serialize-javascript: 6.0.2
-      tinyglobby: 0.2.16
-      webpack: 5.97.1(@swc/core@1.15.24)(esbuild@0.18.20)(webpack-cli@5.1.4)
+      webpack: 5.97.1(@swc/core@1.15.24)(webpack-cli@5.1.4)

   core-js-compat@3.49.0:
     dependencies:
@@ -41896,7 +41685,7 @@ snapshots:
       semver: 6.3.1
       webpack: 4.47.0(webpack-cli@5.1.4)

-  css-loader@6.11.0(webpack@5.97.1(@swc/core@1.15.24)):
+  css-loader@6.11.0(webpack@5.97.1(@swc/core@1.15.24)(esbuild@0.24.2)):
     dependencies:
       icss-utils: 5.1.0(postcss@8.4.49)
       postcss: 8.4.49
@@ -41907,9 +41696,9 @@ snapshots:
       postcss-value-parser: 4.2.0
       semver: 7.7.4
     optionalDependencies:
-      webpack: 5.97.1(@swc/core@1.15.24)
+      webpack: 5.97.1(@swc/core@1.15.24)(esbuild@0.24.2)

-  css-loader@6.11.0(webpack@5.97.1):
+  css-loader@6.11.0(webpack@5.97.1(@swc/core@1.15.24)):
     dependencies:
       icss-utils: 5.1.0(postcss@8.4.49)
       postcss: 8.4.49
@@ -41920,7 +41709,7 @@ snapshots:
       postcss-value-parser: 4.2.0
       semver: 7.7.4
     optionalDependencies:
-      webpack: 5.97.1(@swc/core@1.15.24)(esbuild@0.24.2)(webpack-cli@5.1.4)
+      webpack: 5.97.1(@swc/core@1.15.24)(webpack-cli@5.1.4)

   css-select-base-adapter@0.1.1: {}

@@ -44206,7 +43995,7 @@ snapshots:
     dependencies:
       loader-utils: 2.0.4
       schema-utils: 3.3.0
-      webpack: 5.97.1(@swc/core@1.15.24)(esbuild@0.24.2)(webpack-cli@5.1.4)
+      webpack: 5.97.1(@swc/core@1.15.24)(webpack-cli@5.1.4)
     optional: true

   file-sync-cmp@0.1.1: {}
@@ -44469,7 +44258,7 @@ snapshots:
       semver: 7.7.4
       tapable: 2.3.2
       typescript: 5.7.3
-      webpack: 5.97.1(@swc/core@1.15.24)
+      webpack: 5.97.1(@swc/core@1.15.24)(webpack-cli@5.1.4)

   fork-ts-checker-webpack-plugin@8.0.0(typescript@5.7.3)(webpack@5.97.1):
     dependencies:
@@ -44488,23 +44277,6 @@ snapshots:
       typescript: 5.7.3
       webpack: 5.97.1(@swc/core@1.15.24)(esbuild@0.18.20)(webpack-cli@5.1.4)

-  fork-ts-checker-webpack-plugin@9.0.3(typescript@5.7.3)(webpack@5.97.1(@swc/core@1.15.24)):
-    dependencies:
-      '@babel/code-frame': 7.29.0
-      chalk: 4.1.2
-      chokidar: 3.6.0
-      cosmiconfig: 8.3.6(typescript@5.7.3)
-      deepmerge: 4.3.1
-      fs-extra: 10.1.0
-      memfs: 3.5.3
-      minimatch: 3.1.5
-      node-abort-controller: 3.1.1
-      schema-utils: 3.3.0
-      semver: 7.7.4
-      tapable: 2.3.2
-      typescript: 5.7.3
-      webpack: 5.97.1(@swc/core@1.15.24)
-
   form-data@2.3.3:
     dependencies:
       asynckit: 0.4.0
@@ -45536,7 +45308,7 @@ snapshots:
       pretty-error: 4.0.0
       tapable: 2.3.2
     optionalDependencies:
-      webpack: 5.97.1(@swc/core@1.15.24)
+      webpack: 5.97.1(@swc/core@1.15.24)(webpack-cli@5.1.4)

   html-webpack-plugin@5.6.6(webpack@5.97.1):
     dependencies:
@@ -46251,8 +46023,6 @@ snapshots:
     dependencies:
       upper-case: 1.1.3

-  is-url-superb@4.0.0: {}
-
   is-utf8@0.2.1: {}

   is-weakmap@2.0.2: {}
@@ -48553,17 +48323,17 @@ snapshots:

   min-indent@1.0.1: {}

-  mini-css-extract-plugin@2.9.4(webpack@5.97.1(@swc/core@1.15.24)):
+  mini-css-extract-plugin@2.9.4(webpack@5.97.1(@swc/core@1.15.24)(esbuild@0.24.2)):
     dependencies:
       schema-utils: 4.3.3
       tapable: 2.3.2
-      webpack: 5.97.1(@swc/core@1.15.24)
+      webpack: 5.97.1(@swc/core@1.15.24)(esbuild@0.24.2)

   mini-css-extract-plugin@2.9.4(webpack@5.97.1):
     dependencies:
       schema-utils: 4.3.3
       tapable: 2.3.2
-      webpack: 5.97.1(@swc/core@1.15.24)(esbuild@0.24.2)(webpack-cli@5.1.4)
+      webpack: 5.97.1(@swc/core@1.15.24)(webpack-cli@5.1.4)

   minimalistic-assert@1.0.1: {}

@@ -49084,7 +48854,7 @@ snapshots:
     dependencies:
       hosted-git-info: 6.1.3
       proc-log: 3.0.0
-      semver: 7.7.4
+      semver: 7.5.4
       validate-npm-package-name: 5.0.1

   npm-package-arg@8.1.5:
@@ -50045,11 +49815,6 @@ snapshots:
       postcss: 8.4.49
       postcss-value-parser: 4.2.0

-  postcss-custom-properties@10.0.0:
-    dependencies:
-      postcss: 7.0.39
-      postcss-values-parser: 4.0.0
-
   postcss-discard-comments@5.1.2(postcss@8.4.49):
     dependencies:
       postcss: 8.4.49
@@ -50099,13 +49864,6 @@ snapshots:
       read-cache: 1.0.0
       resolve: 1.22.12

-  postcss-import@16.1.1(postcss@8.5.9):
-    dependencies:
-      postcss: 8.5.9
-      postcss-value-parser: 4.2.0
-      read-cache: 1.0.0
-      resolve: 1.22.12
-
   postcss-less@3.1.4:
     dependencies:
       postcss: 7.0.39
@@ -50128,9 +49886,9 @@ snapshots:
       postcss: 8.4.49
       schema-utils: 3.3.0
       semver: 7.7.4
-      webpack: 5.97.1(@swc/core@1.15.24)(esbuild@0.18.20)(webpack-cli@5.1.4)
+      webpack: 5.97.1(@swc/core@1.15.24)(webpack-cli@5.1.4)

-  postcss-loader@4.3.0(postcss@8.5.9)(webpack@5.97.1(@swc/core@1.15.24)):
+  postcss-loader@4.3.0(postcss@8.5.9)(webpack@5.97.1(@swc/core@1.15.24)(esbuild@0.24.2)):
     dependencies:
       cosmiconfig: 7.1.0
       klona: 2.0.6
@@ -50138,7 +49896,7 @@ snapshots:
       postcss: 8.5.9
       schema-utils: 3.3.0
       semver: 7.7.4
-      webpack: 5.97.1(@swc/core@1.15.24)
+      webpack: 5.97.1(@swc/core@1.15.24)(esbuild@0.24.2)

   postcss-loader@4.3.0(postcss@8.5.9)(webpack@5.97.1):
     dependencies:
@@ -50148,7 +49906,7 @@ snapshots:
       postcss: 8.5.9
       schema-utils: 3.3.0
       semver: 7.7.4
-      webpack: 5.97.1(@swc/core@1.15.24)(esbuild@0.24.2)(webpack-cli@5.1.4)
+      webpack: 5.97.1(@swc/core@1.15.24)(webpack-cli@5.1.4)

   postcss-loader@6.2.1(postcss@8.4.49)(webpack@5.97.1):
     dependencies:
@@ -50156,7 +49914,7 @@ snapshots:
       klona: 2.0.6
       postcss: 8.4.49
       semver: 7.7.4
-      webpack: 5.97.1(@swc/core@1.15.24)(esbuild@0.24.2)(webpack-cli@5.1.4)
+      webpack: 5.97.1(@swc/core@1.15.24)(webpack-cli@5.1.4)

   postcss-media-query-parser@0.2.3: {}

@@ -50489,12 +50247,6 @@ snapshots:

   postcss-value-parser@4.2.0: {}

-  postcss-values-parser@4.0.0:
-    dependencies:
-      color-name: 1.1.4
-      is-url-superb: 4.0.0
-      postcss: 7.0.39
-
   postcss@6.0.23:
     dependencies:
       chalk: 2.4.2
@@ -52086,25 +51838,25 @@ snapshots:
     transitivePeerDependencies:
       - supports-color

-  sass-loader@10.5.2(sass@1.69.5)(webpack@5.97.1(@swc/core@1.15.24)):
+  sass-loader@10.5.2(sass@1.69.5)(webpack@5.97.1(@swc/core@1.15.24)(esbuild@0.24.2)):
     dependencies:
       klona: 2.0.6
       loader-utils: 2.0.4
       neo-async: 2.6.2
       schema-utils: 3.3.0
       semver: 7.7.4
-      webpack: 5.97.1(@swc/core@1.15.24)
+      webpack: 5.97.1(@swc/core@1.15.24)(esbuild@0.24.2)
     optionalDependencies:
       sass: 1.69.5

-  sass-loader@10.5.2(sass@1.69.5)(webpack@5.97.1):
+  sass-loader@10.5.2(sass@1.69.5)(webpack@5.97.1(@swc/core@1.15.24)):
     dependencies:
       klona: 2.0.6
       loader-utils: 2.0.4
       neo-async: 2.6.2
       schema-utils: 3.3.0
       semver: 7.7.4
-      webpack: 5.97.1(@swc/core@1.15.24)(esbuild@0.18.20)(webpack-cli@5.1.4)
+      webpack: 5.97.1(@swc/core@1.15.24)(webpack-cli@5.1.4)
     optionalDependencies:
       sass: 1.69.5

@@ -52112,7 +51864,7 @@ snapshots:
     dependencies:
       klona: 2.0.6
       neo-async: 2.6.2
-      webpack: 5.97.1(@swc/core@1.15.24)(esbuild@0.24.2)(webpack-cli@5.1.4)
+      webpack: 5.97.1(@swc/core@1.15.24)(webpack-cli@5.1.4)
     optionalDependencies:
       sass: 1.69.5

@@ -52121,7 +51873,7 @@ snapshots:
       neo-async: 2.6.2
     optionalDependencies:
       sass: 1.69.5
-      webpack: 5.97.1(@swc/core@1.15.24)
+      webpack: 5.97.1(@swc/core@1.15.24)(esbuild@0.18.20)(webpack-cli@5.1.4)

   sass@1.69.5:
     dependencies:
@@ -52578,7 +52330,7 @@ snapshots:
       abab: 2.0.6
       iconv-lite: 0.6.3
       source-map-js: 1.2.1
-      webpack: 5.97.1(@swc/core@1.15.24)(esbuild@0.24.2)(webpack-cli@5.1.4)
+      webpack: 5.97.1(@swc/core@1.15.24)(webpack-cli@5.1.4)

   source-map-resolve@0.5.3:
     dependencies:
@@ -52995,7 +52747,7 @@ snapshots:

   style-loader@3.3.4(webpack@5.97.1(@swc/core@1.15.24)):
     dependencies:
-      webpack: 5.97.1(@swc/core@1.15.24)
+      webpack: 5.97.1(@swc/core@1.15.24)(webpack-cli@5.1.4)

   style-loader@3.3.4(webpack@5.97.1):
     dependencies:
@@ -53388,7 +53140,7 @@ snapshots:
     dependencies:
       '@swc/core': 1.15.24
       '@swc/counter': 0.1.3
-      webpack: 5.97.1(@swc/core@1.15.24)
+      webpack: 5.97.1(@swc/core@1.15.24)(webpack-cli@5.1.4)

   swc-loader@0.2.7(@swc/core@1.15.24)(webpack@5.97.1):
     dependencies:
@@ -53625,13 +53377,13 @@ snapshots:
       '@swc/core': 1.15.24
       esbuild: 0.18.20

-  terser-webpack-plugin@5.4.0(@swc/core@1.15.24)(esbuild@0.24.2)(webpack@5.97.1):
+  terser-webpack-plugin@5.4.0(@swc/core@1.15.24)(esbuild@0.24.2)(webpack@5.97.1(@swc/core@1.15.24)(esbuild@0.24.2)):
     dependencies:
       '@jridgewell/trace-mapping': 0.3.31
       jest-worker: 27.5.1
       schema-utils: 4.3.3
       terser: 5.46.1
-      webpack: 5.97.1(@swc/core@1.15.24)(esbuild@0.24.2)(webpack-cli@5.1.4)
+      webpack: 5.97.1(@swc/core@1.15.24)(esbuild@0.24.2)
     optionalDependencies:
       '@swc/core': 1.15.24
       esbuild: 0.24.2
@@ -53647,16 +53399,6 @@ snapshots:
       '@swc/core': 1.15.24
       uglify-js: 3.19.3

-  terser-webpack-plugin@5.4.0(@swc/core@1.15.24)(webpack@5.97.1(@swc/core@1.15.24)):
-    dependencies:
-      '@jridgewell/trace-mapping': 0.3.31
-      jest-worker: 27.5.1
-      schema-utils: 4.3.3
-      terser: 5.46.1
-      webpack: 5.97.1(@swc/core@1.15.24)
-    optionalDependencies:
-      '@swc/core': 1.15.24
-
   terser-webpack-plugin@5.4.0(@swc/core@1.15.24)(webpack@5.97.1):
     dependencies:
       '@jridgewell/trace-mapping': 0.3.31
@@ -53862,7 +53604,7 @@ snapshots:

   ts-dedent@2.2.0: {}

-  ts-jest@29.1.5(@babel/core@7.25.7)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.5.0(@babel/core@7.25.7))(esbuild@0.24.2)(jest@29.5.0(@types/node@24.12.2)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@24.12.2)(typescript@5.7.3)))(typescript@5.7.3):
+  ts-jest@29.1.5(@babel/core@7.25.7)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.5.0(@babel/core@7.25.7))(jest@29.5.0(@types/node@24.12.2)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@24.12.2)(typescript@5.7.3)))(typescript@5.7.3):
     dependencies:
       bs-logger: 0.2.6
       fast-json-stable-stringify: 2.1.0
@@ -53879,26 +53621,6 @@ snapshots:
       '@jest/transform': 29.7.0
       '@jest/types': 29.6.3
       babel-jest: 29.5.0(@babel/core@7.25.7)
-      esbuild: 0.24.2
-
-  ts-jest@29.1.5(@babel/core@7.25.7)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.7))(esbuild@0.24.2)(jest@29.5.0(@types/node@24.12.2)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@24.12.2)(typescript@5.7.3)))(typescript@5.7.3):
-    dependencies:
-      bs-logger: 0.2.6
-      fast-json-stable-stringify: 2.1.0
-      jest: 29.5.0(@types/node@24.12.2)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@24.12.2)(typescript@5.7.3))
-      jest-util: 29.7.0
-      json5: 2.2.3
-      lodash.memoize: 4.1.2
-      make-error: 1.3.6
-      semver: 7.7.4
-      typescript: 5.7.3
-      yargs-parser: 21.1.1
-    optionalDependencies:
-      '@babel/core': 7.25.7
-      '@jest/transform': 29.7.0
-      '@jest/types': 29.6.3
-      babel-jest: 29.7.0(@babel/core@7.25.7)
-      esbuild: 0.24.2

   ts-jest@29.1.5(@babel/core@7.25.7)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.7))(jest@29.5.0(@types/node@24.12.2)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@24.12.2)(typescript@5.7.3)))(typescript@5.7.3):
     dependencies:
@@ -54354,7 +54076,7 @@ snapshots:
       loader-utils: 2.0.4
       mime-types: 2.1.35
       schema-utils: 3.3.0
-      webpack: 5.97.1(@swc/core@1.15.24)(esbuild@0.24.2)(webpack-cli@5.1.4)
+      webpack: 5.97.1(@swc/core@1.15.24)(webpack-cli@5.1.4)
     optionalDependencies:
       file-loader: 6.2.0(webpack@5.97.1)

@@ -54733,11 +54455,11 @@ snapshots:
       import-local: 3.2.0
       interpret: 3.1.1
       rechoir: 0.8.0
-      webpack: 5.97.1(@swc/core@1.15.24)(esbuild@0.18.20)(webpack-cli@5.1.4)
+      webpack: 5.97.1(@swc/core@1.15.24)(webpack-cli@5.1.4)
       webpack-merge: 5.10.0
     optionalDependencies:
       webpack-bundle-analyzer: 4.9.1
-      webpack-dev-server: 4.15.2(webpack-cli@5.1.4)(webpack@5.97.1)
+      webpack-dev-server: 4.15.2(debug@4.4.3)(webpack-cli@5.1.4)(webpack@5.97.1)

   webpack-cli@5.1.4(webpack-dev-server@4.15.2)(webpack@5.97.1):
     dependencies:
@@ -54753,7 +54475,7 @@ snapshots:
       import-local: 3.2.0
       interpret: 3.1.1
       rechoir: 0.8.0
-      webpack: 5.97.1(@swc/core@1.15.24)(esbuild@0.24.2)(webpack-cli@5.1.4)
+      webpack: 5.97.1(@swc/core@1.15.24)(webpack-cli@5.1.4)
       webpack-merge: 5.10.0
     optionalDependencies:
       webpack-dev-server: 4.15.2(webpack-cli@5.1.4)(webpack@5.97.1)
@@ -54785,16 +54507,6 @@ snapshots:
       webpack-log: 2.0.0

   webpack-dev-middleware@5.3.4(webpack@5.97.1(@swc/core@1.15.24)):
-    dependencies:
-      colorette: 2.0.20
-      memfs: 3.5.3
-      mime-types: 2.1.35
-      range-parser: 1.2.1
-      schema-utils: 4.3.3
-      webpack: 5.97.1(@swc/core@1.15.24)
-    optional: true
-
-  webpack-dev-middleware@5.3.4(webpack@5.97.1):
     dependencies:
       colorette: 2.0.20
       memfs: 3.5.3
@@ -54811,7 +54523,7 @@ snapshots:
       range-parser: 1.2.1
       schema-utils: 4.3.3
     optionalDependencies:
-      webpack: 5.97.1(@swc/core@1.15.24)
+      webpack: 5.97.1(@swc/core@1.15.24)(webpack-cli@5.1.4)

   webpack-dev-middleware@6.1.3(webpack@5.97.1):
     dependencies:
@@ -54853,7 +54565,7 @@ snapshots:
       serve-index: 1.9.2
       sockjs: 0.3.24
       spdy: 4.0.2
-      webpack-dev-middleware: 5.3.4(webpack@5.97.1)
+      webpack-dev-middleware: 5.3.4(webpack@5.97.1(@swc/core@1.15.24))
       ws: 8.20.0
     optionalDependencies:
       webpack: 5.97.1(@swc/core@1.15.24)(webpack-cli@5.1.4)
@@ -54865,47 +54577,6 @@ snapshots:
       - utf-8-validate

   webpack-dev-server@4.15.2(webpack-cli@5.1.4)(webpack@5.97.1):
-    dependencies:
-      '@types/bonjour': 3.5.13
-      '@types/connect-history-api-fallback': 1.5.4
-      '@types/express': 4.17.25
-      '@types/serve-index': 1.9.4
-      '@types/serve-static': 1.15.10
-      '@types/sockjs': 0.3.36
-      '@types/ws': 8.18.1
-      ansi-html-community: 0.0.8
-      bonjour-service: 1.3.0
-      chokidar: 3.6.0
-      colorette: 2.0.20
-      compression: 1.8.1
-      connect-history-api-fallback: 2.0.0
-      default-gateway: 6.0.3
-      express: 4.22.1
-      graceful-fs: 4.2.11
-      html-entities: 2.6.0
-      http-proxy-middleware: 2.0.9(@types/express@4.17.25)(debug@4.4.3)
-      ipaddr.js: 2.3.0
-      launch-editor: 2.13.2
-      open: 8.4.2
-      p-retry: 4.6.2
-      rimraf: 3.0.2
-      schema-utils: 4.3.3
-      selfsigned: 2.4.1
-      serve-index: 1.9.2
-      sockjs: 0.3.24
-      spdy: 4.0.2
-      webpack-dev-middleware: 5.3.4(webpack@5.97.1)
-      ws: 8.20.0
-    optionalDependencies:
-      webpack: 5.97.1(@swc/core@1.15.24)(esbuild@0.24.2)(webpack-cli@5.1.4)
-      webpack-cli: 5.1.4(webpack-dev-server@4.15.2)(webpack@5.97.1)
-    transitivePeerDependencies:
-      - bufferutil
-      - debug
-      - supports-color
-      - utf-8-validate
-
-  webpack-dev-server@4.15.2(webpack@5.97.1(@swc/core@1.15.24)):
     dependencies:
       '@types/bonjour': 3.5.13
       '@types/connect-history-api-fallback': 1.5.4
@@ -54938,13 +54609,13 @@ snapshots:
       webpack-dev-middleware: 5.3.4(webpack@5.97.1(@swc/core@1.15.24))
       ws: 8.20.0
     optionalDependencies:
-      webpack: 5.97.1(@swc/core@1.15.24)
+      webpack: 5.97.1(@swc/core@1.15.24)(webpack-cli@5.1.4)
+      webpack-cli: 5.1.4(webpack-dev-server@4.15.2)(webpack@5.97.1)
     transitivePeerDependencies:
       - bufferutil
       - debug
       - supports-color
       - utf-8-validate
-    optional: true

   webpack-filter-warnings-plugin@1.2.1(webpack@4.47.0(webpack-cli@5.1.4)):
     dependencies:
@@ -54979,15 +54650,15 @@ snapshots:
       flat: 5.0.2
       wildcard: 2.0.1

-  webpack-remove-empty-scripts@1.0.4(webpack@5.97.1(@swc/core@1.15.24)):
+  webpack-remove-empty-scripts@1.0.4(webpack@5.97.1(@swc/core@1.15.24)(esbuild@0.24.2)):
     dependencies:
       ansis: 1.5.2
-      webpack: 5.97.1(@swc/core@1.15.24)
+      webpack: 5.97.1(@swc/core@1.15.24)(esbuild@0.24.2)

   webpack-remove-empty-scripts@1.0.4(webpack@5.97.1):
     dependencies:
       ansis: 1.5.2
-      webpack: 5.97.1(@swc/core@1.15.24)(esbuild@0.24.2)(webpack-cli@5.1.4)
+      webpack: 5.97.1(@swc/core@1.15.24)(webpack-cli@5.1.4)

   webpack-sources@1.4.3:
     dependencies:
@@ -55036,36 +54707,6 @@ snapshots:
     transitivePeerDependencies:
       - supports-color

-  webpack@5.97.1(@swc/core@1.15.24):
-    dependencies:
-      '@types/eslint-scope': 3.7.7
-      '@types/estree': 1.0.8
-      '@webassemblyjs/ast': 1.14.1
-      '@webassemblyjs/wasm-edit': 1.14.1
-      '@webassemblyjs/wasm-parser': 1.14.1
-      acorn: 8.16.0
-      browserslist: 4.28.2
-      chrome-trace-event: 1.0.4
-      enhanced-resolve: 5.20.1
-      es-module-lexer: 1.7.0
-      eslint-scope: 5.1.1
-      events: 3.3.0
-      glob-to-regexp: 0.4.1
-      graceful-fs: 4.2.11
-      json-parse-even-better-errors: 2.3.1
-      loader-runner: 4.3.1
-      mime-types: 2.1.35
-      neo-async: 2.6.2
-      schema-utils: 3.3.0
-      tapable: 2.3.2
-      terser-webpack-plugin: 5.4.0(@swc/core@1.15.24)(webpack@5.97.1(@swc/core@1.15.24))
-      watchpack: 2.5.1
-      webpack-sources: 3.3.4
-    transitivePeerDependencies:
-      - '@swc/core'
-      - esbuild
-      - uglify-js
-
   webpack@5.97.1(@swc/core@1.15.24)(esbuild@0.18.20)(webpack-cli@5.1.4):
     dependencies:
       '@types/eslint-scope': 3.7.7
@@ -55098,7 +54739,7 @@ snapshots:
       - esbuild
       - uglify-js

-  webpack@5.97.1(@swc/core@1.15.24)(esbuild@0.24.2)(webpack-cli@5.1.4):
+  webpack@5.97.1(@swc/core@1.15.24)(esbuild@0.24.2):
     dependencies:
       '@types/eslint-scope': 3.7.7
       '@types/estree': 1.0.8
@@ -55120,11 +54761,9 @@ snapshots:
       neo-async: 2.6.2
       schema-utils: 3.3.0
       tapable: 2.3.2
-      terser-webpack-plugin: 5.4.0(@swc/core@1.15.24)(esbuild@0.24.2)(webpack@5.97.1)
+      terser-webpack-plugin: 5.4.0(@swc/core@1.15.24)(esbuild@0.24.2)(webpack@5.97.1(@swc/core@1.15.24)(esbuild@0.24.2))
       watchpack: 2.5.1
       webpack-sources: 3.3.4
-    optionalDependencies:
-      webpack-cli: 5.1.4(webpack@5.97.1)
     transitivePeerDependencies:
       - '@swc/core'
       - esbuild
diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml
index 0ccb6766dab..8190325717a 100644
--- a/pnpm-workspace.yaml
+++ b/pnpm-workspace.yaml
@@ -45,6 +45,7 @@ catalogs:
         '@wordpress/notices': 5.19.2
         '@wordpress/patterns': 2.19.6
         '@wordpress/plugins': 7.19.4
+        '@wordpress/postcss-plugins-preset': 4.42.0
         '@wordpress/preferences': 4.19.4
         '@wordpress/primitives': 4.19.1
         '@wordpress/priority-queue': 3.19.1