Commit 7d6e8c41e5a for woocommerce

commit 7d6e8c41e5aa9b4663c29580b59e089ab9f8010a
Author: Christopher Allford <6451942+ObliviousHarmony@users.noreply.github.com>
Date:   Fri May 29 00:31:09 2026 -0700

    Replace `tsc` With `esbuild` (#65210)

    * Remove Wireit From `packages/js/*`

    Strips Wireit orchestration from every package under `packages/js/*`,
    inlining the underlying `tsc` and `webpack` commands directly into each
    `build:project:*` and `watch:build:project:*` script. With type generation
    already moved to a separate workflow, the JS emit is fast enough that
    Wireit's cache management no longer pays for itself (especially in CI).
    This is a no-op in behavior — same outputs, same emit shape. The Wireit
    devDependency is removed; the `tools/*` and `plugins/*` Wireit usages
    (out of scope) remain untouched, so `.pnpmfile.cjs` is left alone.

    * Build @woocommerce/number With esbuild

    Pilot for the package-wide tsc → esbuild swap. Replaces `tsc` with a
    per-package `build.mjs` that transpiles `src/` file-by-file using esbuild,
    mirroring the previous output shape: ESM to `build-module/`, CJS to `build/`.
    Watch mode uses esbuild's `context().watch()`.

    Downstream `@woocommerce/data` tests pass against the esbuild output,
    confirming runtime equivalence. The output is semantically identical to
    the previous tsc emit but cosmetically different (double quotes, `void 0`,
    trailing `export { ... }` block, esbuild's `__toCommonJS` CJS interop
    helper). JSDoc comments in `.js` files are stripped by esbuild's TS
    transformer — this matches the broader esbuild ecosystem
    (@wordpress/dom@4.46.0, @radix-ui/*, @mantine/core, @tanstack/react-query)
    and JSDoc remains available to TS consumers via the `.d.ts` files
    generated by `lint:lang:types`.

    * Fix esbuild Loader Mapping in @woocommerce/number

    The previous mapping (`.ts: 'tsx'`) sent every TypeScript file through
    esbuild's TSX parser, which interprets generic-arrow syntax like `<T>(x)
    => ...` as an opening JSX element. Plain `.ts` files now use the `ts`
    loader; `.tsx` keeps the `tsx` loader. Matches what tsc and the project's
    tsconfig do (JSX is only legal in `.tsx`). Surfaced when rolling esbuild
    out to @woocommerce/data, which uses generic-arrow selectors.

    * Build @woocommerce/admin-layout With esbuild

    Swaps tsc for a per-package build.mjs that transpiles src/ file-by-file using esbuild. Output shape, entry points, and the existing webpack-managed CSS step (where applicable) are all unchanged.

    * Build @woocommerce/block-templates With esbuild

    Swaps tsc for a per-package build.mjs that transpiles src/ file-by-file using esbuild. Output shape, entry points, and the existing webpack-managed CSS step (where applicable) are all unchanged.

    * Build @woocommerce/components With esbuild

    Swaps tsc for a per-package build.mjs that transpiles src/ file-by-file using esbuild. Output shape, entry points, and the existing webpack-managed CSS step (where applicable) are all unchanged.

    * Build @woocommerce/csv-export With esbuild

    Swaps tsc for a per-package build.mjs that transpiles src/ file-by-file using esbuild. Output shape, entry points, and the existing webpack-managed CSS step (where applicable) are all unchanged.

    * Build @woocommerce/currency With esbuild

    Swaps tsc for a per-package build.mjs that transpiles src/ file-by-file using esbuild. Output shape, entry points, and the existing webpack-managed CSS step (where applicable) are all unchanged.

    * Build @woocommerce/customer-effort-score With esbuild

    Swaps tsc for a per-package build.mjs that transpiles src/ file-by-file using esbuild. Output shape, entry points, and the existing webpack-managed CSS step (where applicable) are all unchanged.

    * Build @woocommerce/data With esbuild

    Swaps tsc for a per-package build.mjs that transpiles src/ file-by-file using esbuild. Output shape, entry points, and the existing webpack-managed CSS step (where applicable) are all unchanged.

    * Build @woocommerce/date With esbuild

    Swaps tsc for a per-package build.mjs that transpiles src/ file-by-file using esbuild. Output shape, entry points, and the existing webpack-managed CSS step (where applicable) are all unchanged.

    * Build @woocommerce/e2e-utils-playwright With esbuild

    Swaps tsc for a per-package build.mjs that transpiles src/ file-by-file using esbuild. Output shape, entry points, and the existing webpack-managed CSS step (where applicable) are all unchanged.

    * Build @woocommerce/email-editor With esbuild

    Swaps tsc for a per-package build.mjs that transpiles src/ file-by-file using esbuild. Output shape, entry points, and the existing webpack-managed CSS step (where applicable) are all unchanged.

    * Build @woocommerce/experimental With esbuild

    Swaps tsc for a per-package build.mjs that transpiles src/ file-by-file using esbuild. Output shape, entry points, and the existing webpack-managed CSS step (where applicable) are all unchanged.

    * Build @woocommerce/experimental-products-app With esbuild

    Swaps tsc for a per-package build.mjs that transpiles src/ file-by-file using esbuild. Output shape, entry points, and the existing webpack-managed CSS step (where applicable) are all unchanged.

    * Build @woocommerce/explat With esbuild

    Swaps tsc for a per-package build.mjs that transpiles src/ file-by-file using esbuild. Output shape, entry points, and the existing webpack-managed CSS step (where applicable) are all unchanged.

    * Build @woocommerce/expression-evaluation With esbuild

    Swaps tsc for a per-package build.mjs that transpiles src/ file-by-file using esbuild. Output shape, entry points, and the existing webpack-managed CSS step (where applicable) are all unchanged.

    * Build @woocommerce/integrate-plugin With esbuild

    Swaps tsc for a per-package build.mjs that transpiles src/ file-by-file using esbuild. Output shape, entry points, and the existing webpack-managed CSS step (where applicable) are all unchanged.

    * Build @woocommerce/internal-js-tests With esbuild

    Swaps tsc for a per-package build.mjs that transpiles src/ file-by-file using esbuild. Output shape, entry points, and the existing webpack-managed CSS step (where applicable) are all unchanged.

    * Build @woocommerce/navigation With esbuild

    Swaps tsc for a per-package build.mjs that transpiles src/ file-by-file using esbuild. Output shape, entry points, and the existing webpack-managed CSS step (where applicable) are all unchanged.

    * Build @woocommerce/notices With esbuild

    Swaps tsc for a per-package build.mjs that transpiles src/ file-by-file using esbuild. Output shape, entry points, and the existing webpack-managed CSS step (where applicable) are all unchanged.

    * Build @woocommerce/onboarding With esbuild

    Swaps tsc for a per-package build.mjs that transpiles src/ file-by-file using esbuild. Output shape, entry points, and the existing webpack-managed CSS step (where applicable) are all unchanged.

    * Build @woocommerce/product-editor With esbuild

    Swaps tsc for a per-package build.mjs that transpiles src/ file-by-file using esbuild. Output shape, entry points, and the existing webpack-managed CSS step (where applicable) are all unchanged.

    * Build @woocommerce/remote-logging With esbuild

    Swaps tsc for a per-package build.mjs that transpiles src/ file-by-file using esbuild. Output shape, entry points, and the existing webpack-managed CSS step (where applicable) are all unchanged.

    * Build @woocommerce/sanitize With esbuild

    Swaps tsc for a per-package build.mjs that transpiles src/ file-by-file using esbuild. Output shape, entry points, and the existing webpack-managed CSS step (where applicable) are all unchanged.

    * Build @woocommerce/tracks With esbuild

    Swaps tsc for a per-package build.mjs that transpiles src/ file-by-file using esbuild. Output shape, entry points, and the existing webpack-managed CSS step (where applicable) are all unchanged.

    * Changelogs for #64838

    One entry per affected packages/js/* package covering the Phase 1 wireit
    removal and Phase 2 tsc → esbuild swap. Buildable packages note the
    pipeline change; non-buildable packages note only the stray devDep
    removal.

    * Make `packages/js/*` Source esbuild-Safe

    Two issues surfaced when bundling the esbuild-built `packages/js/*` outputs
    into the admin webpack bundle:

    1. `product-editor`'s `import './block.json'` statements lost their target
       files in the esbuild emit. tsc's `resolveJsonModule` copied the .json
       files into the output tree alongside the emitted .js; esbuild in
       transpile mode (`bundle: false`) leaves the import statements verbatim
       and does no side-channel copy. Added a small block.json copy step to
       `product-editor/build.mjs`. No other package uses this pattern.

    2. Mixed `export { Value, Type }` re-exports from sibling modules went
       uncorrected because tsc's whole-program analysis silently erased the
       type halves during emit. esbuild has no project-wide view and preserves
       re-exports verbatim, leaving downstream bundlers chasing bindings that
       don't exist at runtime. Enabled `isolatedModules: true` in the base
       tsconfig (matching Gutenberg's approach in `wp-build`) to force tsc to
       reject the same patterns esbuild can't handle, then ran
       `@typescript-eslint/consistent-type-exports --fix` across the affected
       packages to add the `type` keyword. The rule is temporary tooling; it
       isn't enabled in the project's shared eslint config — `isolatedModules`
       is the durable guard.

    Also cleans up `@woocommerce/internal-ts-config`: removes the perma-broken
    lint scripts (the package's only source is one generator script; eslint
    was being pointed at the vendored `types/**/*.d.ts` tree, which eslint
    defaults to ignoring) along with the now-orphaned `.eslintrc.js` and the
    `@woocommerce/eslint-plugin` / `eslint` devDependencies.

    * Remove Wireit Cache

    The theory goes that `esbuild` is fast
    enough that Wireit won't help
    in CI. Let's test that!

    * Re-Add Cache Action

    Technically, we still have some Wireit caching in place.
    We need this in place until we remove it from the
    rest of the monorepo.

    * Mark `State` Imports In `@woocommerce/data` As Type-Only

    Each per-store `index.ts` imports `State` alongside its default reducer:
    `import reducer, { State } from './reducer'`. Under the `isolatedModules`
    TS config enabled in 397640a4, babel-loader transpiling these sources
    directly (rather than consuming pre-built esbuild output) hits
    `@babel/plugin-transform-typescript`'s scope-tracker warning because the
    single-file transform cannot tell that `State` is a type re-export, and
    emits it as a JS value binding. esbuild's transpile mode happened to
    strip it correctly, so the cascade-built artifacts were fine.

    Switch the 14 affected imports to `import reducer, { type State }` so
    the transform is unambiguous in both build paths.

    * Lockfile Update

    * Custom Watch Handler

    By default, esbuild actually doesn't
    provide a great watcher. It doesn't
    pick up new, renamed, or
    deleted files. This
    custom script does
    so.

    * Emit Types on Pack

    * Address #65210 Review Feedback

    Bundles the actionable items from kalessil's and CodeRabbit's reviews:

    - **Type emission on publish**: add `build:publish:project:types` (running
      `tsc --build --emitDeclarationOnly`) to every esbuild-built package so
      `prepack` produces `.d.ts` files. Trunk's old `tsc` emit produced these
      as a side effect; esbuild does not. Without this, published tarballs
      shipped an empty `build-types/`.

    - **Pin esbuild and chokidar in `.syncpackrc`**: `esbuild` at `0.24.x` (stable
      emitted output per minor) and `chokidar` at `3.6.x`, matching the existing
      dev-tooling pin convention. syncpack rewrites the consuming `package.json`
      files.

    - **Guard watch-mode rebuild paths**: wrap `ctx.rebuild()`, `ctx.dispose()`,
      `rm()`, and `context()` calls in a `safe()` helper so a transient disk or
      build error logs and continues instead of crashing the watcher.

    - **Silence `internal-js-tests` `require()` warnings**: add `src/setup-*.js`
      and `src/mocks/**` to the package's `ENTRY_IGNORE`. These files are
      CommonJS shims consumed directly by Jest via `jest-preset.js` → `src/*`
      and were never meant for ESM emission (tsc didn't emit them either).

    - **Restore Storybook compatibility for `@woocommerce/sanitize`**: split
      the inline `export { type Foo, value } from '...'` pattern into separate
      `export type {...}` and `export {...}` statements. Storybook's
      `react-docgen-loader` (Storybook 7.x) doesn't understand the inline
      `type` keyword in re-exports and was producing `Module parse failed`
      errors when traversing through this entry point.

    * Harden `safe()` Watcher Wrapper Against Non-Error Throws

    `catch ( error )` can receive `null`, `undefined`, or primitive throws.
    Accessing `.message` on `null`/`undefined` raised a `TypeError` that
    short-circuited the very safety wrapper meant to keep the watcher alive.
    Switching to optional chaining handles all cases — Errors print their
    message, non-Errors print their string form.

    * Prune Type-Only Empty Stubs and Ignore Inline Test Files

    Replaces the regex-based empty-stub detector with byte-for-byte template
    matching: reconstruct the canonical empty CJS stub from the filename and
    delete only files matching exactly. The previous regex misclassified
    __reExport() barrel files (e.g. utils/date/index.js in product-editor)
    as stubs and would have silently deleted them.

    Also adds `**/*.test.{ts,tsx,js,jsx}` to ENTRY_IGNORE so packages that
    keep tests in `src/` rather than `src/**/test/` (e.g.
    experimental-products-app) stop shipping compiled test files in their
    published tarballs.

    * Restore Production Mode for Webpack Bundle Steps

    Wireit's `build:project:bundle` block defaulted NODE_ENV to "production"
    via its env config; that default was dropped in Phase 1 when wireit was
    removed in favor of invoking `webpack` directly. Without it, webpack ran
    in development mode and emitted unminified CSS with loader header
    comments — block-templates' style.css ballooned from 503 bytes to
    ~4 KB, and similar regressions hit the other 8 webpack packages.

    Restores `NODE_ENV=production` on `build:project:bundle` and pins
    `NODE_ENV=development` on the watch variant.

    * Stop Pruning Type-Only Empty Stubs

    Empty CJS/ESM stubs from type-only sources (e.g. `types.ts` with only
    `export type` declarations) aren't dead weight — they satisfy runtime
    `export * from './types'` re-export chains that esbuild emits in
    `isolatedModules` mode, because it can't tell across files that the
    named re-export is type-only.

    Pruning them broke webpack's module resolution for consumers of the
    workspace-linked `build-module/` and `build/` directories (e.g.
    `plugins/woocommerce/client/admin` failed to resolve `./types` from
    product-editor at bundle time). Removes the prune step entirely; the
    ~77 KB of empty stubs survive in the published tarball but
    tree-shake out of the consumer bundles where it matters.

diff --git a/.syncpackrc b/.syncpackrc
index f8b8d6f778f..103bfe3cae9 100644
--- a/.syncpackrc
+++ b/.syncpackrc
@@ -645,6 +645,24 @@
 			],
 			"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
new file mode 100644
index 00000000000..746bc61fc4b
--- /dev/null
+++ b/packages/js/admin-layout/build.mjs
@@ -0,0 +1,112 @@
+import { build, context } from 'esbuild';
+import { glob } from 'glob';
+import { rm } from 'node:fs/promises';
+import chokidar from 'chokidar';
+
+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 ) }` );
+}
diff --git a/packages/js/admin-layout/changelog/64838-dev-esbuild-package-builds b/packages/js/admin-layout/changelog/64838-dev-esbuild-package-builds
new file mode 100644
index 00000000000..53b9c7cd29c
--- /dev/null
+++ b/packages/js/admin-layout/changelog/64838-dev-esbuild-package-builds
@@ -0,0 +1,4 @@
+Significance: patch
+Type: dev
+
+Replaced wireit + tsc package build pipeline with a per-package esbuild script.
diff --git a/packages/js/admin-layout/package.json b/packages/js/admin-layout/package.json
index c0118d3accc..6be9fd88a0a 100644
--- a/packages/js/admin-layout/package.json
+++ b/packages/js/admin-layout/package.json
@@ -36,10 +36,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:bundle": "wireit",
-		"build:project:esm": "wireit",
+		"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": "tsc --project tsconfig-cjs.json --noCheck",
+		"build:publish:project:cjs": "node build.mjs --cjs",
+		"build:publish:project:types": "tsc --build --emitDeclarationOnly",
 		"build:publish:project:deps": "pnpm build",
 		"changelog": "XDEBUG_MODE=off composer install --quiet && composer exec -- changelogger",
 		"lint": "pnpm --if-present '/^lint:lang:.*$/'",
@@ -51,8 +52,8 @@
 		"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:bundle": "wireit",
-		"watch:build:project:esm": "wireit"
+		"watch:build:project:bundle": "NODE_ENV=development webpack --watch",
+		"watch:build:project:esm": "node build.mjs --watch"
 	},
 	"dependencies": {
 		"@woocommerce/components": "workspace:*",
@@ -65,8 +66,11 @@
 		"@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",
 		"postcss-loader": "4.3.x",
@@ -77,8 +81,7 @@
 		"ts-jest": "29.1.x",
 		"typescript": "5.7.x",
 		"webpack": "5.97.x",
-		"webpack-cli": "5.1.x",
-		"wireit": "0.14.12"
+		"webpack-cli": "5.1.x"
 	},
 	"peerDependencies": {
 		"@types/react": "18.3.x",
@@ -92,73 +95,5 @@
 				"changes": "src/**/*.{js,jsx,ts,tsx}"
 			}
 		}
-	},
-	"wireit": {
-		"build:project:bundle": {
-			"command": "webpack",
-			"clean": "if-file-deleted",
-			"env": {
-				"NODE_ENV": {
-					"external": true,
-					"default": "production"
-				}
-			},
-			"files": [
-				"webpack.config.js",
-				"src/**/*.scss"
-			],
-			"output": [
-				"build-style"
-			],
-			"dependencies": [
-				"dependencyOutputs"
-			]
-		},
-		"watch:build:project:bundle": {
-			"command": "webpack --watch",
-			"service": true
-		},
-		"build:project:esm": {
-			"command": "tsc --project tsconfig.json --noCheck",
-			"clean": "if-file-deleted",
-			"files": [
-				"tsconfig.json",
-				"src/**/*.{js,jsx,ts,tsx}",
-				"typings/**/*.ts"
-			],
-			"output": [
-				"build-module",
-				"build-types",
-				"tsconfig.tsbuildinfo"
-			],
-			"dependencies": [
-				"dependencyOutputs"
-			]
-		},
-		"watch:build:project:esm": {
-			"command": "tsc --project tsconfig.json --noCheck --watch",
-			"service": true
-		},
-		"dependencyOutputs": {
-			"allowUsuallyExcludedPaths": true,
-			"files": [
-				"package.json",
-				"../../../pnpm-lock.yaml",
-				"node_modules/@woocommerce/components/build",
-				"node_modules/@woocommerce/components/build-style",
-				"node_modules/@woocommerce/components/build-types",
-				"node_modules/@woocommerce/eslint-plugin/configs",
-				"node_modules/@woocommerce/eslint-plugin/rules",
-				"node_modules/@woocommerce/eslint-plugin/index.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"
-			]
-		}
 	}
 }
diff --git a/packages/js/block-templates/build.mjs b/packages/js/block-templates/build.mjs
new file mode 100644
index 00000000000..746bc61fc4b
--- /dev/null
+++ b/packages/js/block-templates/build.mjs
@@ -0,0 +1,112 @@
+import { build, context } from 'esbuild';
+import { glob } from 'glob';
+import { rm } from 'node:fs/promises';
+import chokidar from 'chokidar';
+
+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 ) }` );
+}
diff --git a/packages/js/block-templates/changelog/64838-dev-esbuild-package-builds b/packages/js/block-templates/changelog/64838-dev-esbuild-package-builds
new file mode 100644
index 00000000000..53b9c7cd29c
--- /dev/null
+++ b/packages/js/block-templates/changelog/64838-dev-esbuild-package-builds
@@ -0,0 +1,4 @@
+Significance: patch
+Type: dev
+
+Replaced wireit + tsc package build pipeline with a per-package esbuild script.
diff --git a/packages/js/block-templates/package.json b/packages/js/block-templates/package.json
index 939b32cbb7d..6243b93479c 100644
--- a/packages/js/block-templates/package.json
+++ b/packages/js/block-templates/package.json
@@ -33,10 +33,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:bundle": "wireit",
-		"build:project:esm": "wireit",
+		"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": "tsc --project tsconfig-cjs.json --noCheck",
+		"build:publish:project:cjs": "node build.mjs --cjs",
+		"build:publish:project:types": "tsc --build --emitDeclarationOnly",
 		"build:publish:project:deps": "pnpm build",
 		"changelog": "XDEBUG_MODE=off composer install --quiet && composer exec -- changelogger",
 		"lint": "pnpm --if-present '/^lint:lang:.*$/'",
@@ -49,8 +50,8 @@
 		"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:bundle": "wireit",
-		"watch:build:project:esm": "wireit"
+		"watch:build:project:bundle": "NODE_ENV=development webpack --watch",
+		"watch:build:project:esm": "node build.mjs --watch"
 	},
 	"dependencies": {
 		"@woocommerce/expression-evaluation": "workspace:*",
@@ -75,9 +76,12 @@
 		"@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",
@@ -90,8 +94,7 @@
 		"ts-jest": "29.1.x",
 		"typescript": "5.7.x",
 		"webpack": "5.97.x",
-		"webpack-cli": "5.1.x",
-		"wireit": "0.14.12"
+		"webpack-cli": "5.1.x"
 	},
 	"peerDependencies": {
 		"@types/react": "18.3.x",
@@ -125,75 +128,5 @@
 				}
 			]
 		}
-	},
-	"wireit": {
-		"build:project:bundle": {
-			"command": "webpack",
-			"clean": "if-file-deleted",
-			"env": {
-				"NODE_ENV": {
-					"external": true,
-					"default": "production"
-				}
-			},
-			"files": [
-				"webpack.config.js",
-				"src/**/*.scss"
-			],
-			"output": [
-				"build-style"
-			],
-			"dependencies": [
-				"dependencyOutputs"
-			]
-		},
-		"watch:build:project:bundle": {
-			"command": "webpack --watch",
-			"service": true
-		},
-		"build:project:esm": {
-			"command": "tsc --project tsconfig.json --noCheck",
-			"clean": "if-file-deleted",
-			"files": [
-				"tsconfig.json",
-				"src/**/*.{js,jsx,ts,tsx}",
-				"typings/**/*.ts"
-			],
-			"output": [
-				"build-module",
-				"build-types",
-				"tsconfig.tsbuildinfo"
-			],
-			"dependencies": [
-				"dependencyOutputs"
-			]
-		},
-		"watch:build:project:esm": {
-			"command": "tsc --project tsconfig.json --noCheck --watch",
-			"service": true
-		},
-		"dependencyOutputs": {
-			"allowUsuallyExcludedPaths": true,
-			"files": [
-				"package.json",
-				"../../../pnpm-lock.yaml",
-				"node_modules/@woocommerce/expression-evaluation/build",
-				"node_modules/@woocommerce/expression-evaluation/build-types",
-				"node_modules/@woocommerce/eslint-plugin/configs",
-				"node_modules/@woocommerce/eslint-plugin/rules",
-				"node_modules/@woocommerce/eslint-plugin/index.js",
-				"node_modules/@woocommerce/internal-js-tests/build",
-				"node_modules/@woocommerce/internal-js-tests/build-module",
-				"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"
-			]
-		}
 	}
 }
diff --git a/packages/js/components/build.mjs b/packages/js/components/build.mjs
new file mode 100644
index 00000000000..746bc61fc4b
--- /dev/null
+++ b/packages/js/components/build.mjs
@@ -0,0 +1,112 @@
+import { build, context } from 'esbuild';
+import { glob } from 'glob';
+import { rm } from 'node:fs/promises';
+import chokidar from 'chokidar';
+
+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 ) }` );
+}
diff --git a/packages/js/components/changelog/64838-dev-esbuild-package-builds b/packages/js/components/changelog/64838-dev-esbuild-package-builds
new file mode 100644
index 00000000000..53b9c7cd29c
--- /dev/null
+++ b/packages/js/components/changelog/64838-dev-esbuild-package-builds
@@ -0,0 +1,4 @@
+Significance: patch
+Type: dev
+
+Replaced wireit + tsc package build pipeline with a per-package esbuild script.
diff --git a/packages/js/components/package.json b/packages/js/components/package.json
index 5de7a79aca8..c916779a338 100644
--- a/packages/js/components/package.json
+++ b/packages/js/components/package.json
@@ -37,10 +37,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:bundle": "wireit",
-		"build:project:esm": "wireit",
+		"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": "tsc --project tsconfig-cjs.json --noCheck",
+		"build:publish:project:cjs": "node build.mjs --cjs",
+		"build:publish:project:types": "tsc --build --emitDeclarationOnly",
 		"build:publish:project:deps": "pnpm build",
 		"changelog": "XDEBUG_MODE=off composer install --quiet && composer exec -- changelogger",
 		"lint": "pnpm --if-present '/^lint:lang:.*$/'",
@@ -53,8 +54,8 @@
 		"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:bundle": "wireit",
-		"watch:build:project:esm": "wireit"
+		"watch:build:project:bundle": "NODE_ENV=development webpack --watch",
+		"watch:build:project:esm": "node build.mjs --watch"
 	},
 	"lint-staged": {
 		"*.(t|j)s?(x)": [
@@ -155,8 +156,11 @@
 		"@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",
@@ -171,8 +175,7 @@
 		"typescript": "5.7.x",
 		"uuid": "^9.0.1",
 		"webpack": "5.97.x",
-		"webpack-cli": "5.1.x",
-		"wireit": "0.14.12"
+		"webpack-cli": "5.1.x"
 	},
 	"config": {
 		"ci": {
@@ -199,87 +202,5 @@
 				}
 			]
 		}
-	},
-	"wireit": {
-		"build:project:bundle": {
-			"command": "webpack",
-			"clean": "if-file-deleted",
-			"env": {
-				"NODE_ENV": {
-					"external": true,
-					"default": "production"
-				}
-			},
-			"files": [
-				"webpack.config.js",
-				"babel.config.js",
-				"src/**/*.scss"
-			],
-			"output": [
-				"build-style"
-			],
-			"dependencies": [
-				"dependencyOutputs"
-			]
-		},
-		"watch:build:project:bundle": {
-			"command": "webpack --watch",
-			"service": true
-		},
-		"build:project:esm": {
-			"command": "tsc --project tsconfig.json --noCheck",
-			"clean": "if-file-deleted",
-			"files": [
-				"tsconfig.json",
-				"src/**/*.{js,jsx,ts,tsx}",
-				"typings/**/*.ts"
-			],
-			"output": [
-				"build-module",
-				"build-types",
-				"tsconfig.tsbuildinfo"
-			],
-			"dependencies": [
-				"dependencyOutputs"
-			]
-		},
-		"watch:build:project:esm": {
-			"command": "tsc --project tsconfig.json --noCheck --watch",
-			"service": true
-		},
-		"dependencyOutputs": {
-			"allowUsuallyExcludedPaths": true,
-			"files": [
-				"package.json",
-				"../../../pnpm-lock.yaml",
-				"node_modules/@woocommerce/csv-export/build",
-				"node_modules/@woocommerce/csv-export/build-types",
-				"node_modules/@woocommerce/currency/build",
-				"node_modules/@woocommerce/currency/build-types",
-				"node_modules/@woocommerce/data/build",
-				"node_modules/@woocommerce/data/build-types",
-				"node_modules/@woocommerce/date/build",
-				"node_modules/@woocommerce/date/build-types",
-				"node_modules/@woocommerce/navigation/build",
-				"node_modules/@woocommerce/navigation/build-types",
-				"node_modules/@woocommerce/sanitize/build",
-				"node_modules/@woocommerce/sanitize/build-style",
-				"node_modules/@woocommerce/sanitize/build-types",
-				"node_modules/@woocommerce/eslint-plugin/configs",
-				"node_modules/@woocommerce/eslint-plugin/rules",
-				"node_modules/@woocommerce/eslint-plugin/index.js",
-				"node_modules/@woocommerce/internal-js-tests/build",
-				"node_modules/@woocommerce/internal-js-tests/build-module",
-				"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"
-			]
-		}
 	}
 }
diff --git a/packages/js/components/src/form/index.ts b/packages/js/components/src/form/index.ts
index b17d1cf8f79..35a5e0b26d4 100644
--- a/packages/js/components/src/form/index.ts
+++ b/packages/js/components/src/form/index.ts
@@ -1,6 +1,6 @@
 export * from './form';
 export * from './form-context';
-export {
+export type {
 	FormContextType,
 	FormErrors,
 	FormRef,
diff --git a/packages/js/components/src/index.ts b/packages/js/components/src/index.ts
index 2b26451d687..ff8f208e25d 100644
--- a/packages/js/components/src/index.ts
+++ b/packages/js/components/src/index.ts
@@ -24,7 +24,10 @@ export { ImageGallery, ImageGalleryItem } from './image-gallery';
 export { default as ImageUpload } from './image-upload';
 export { Link } from './link';
 export { default as List } from './list';
-export { MediaUploader, MediaUploaderErrorCallback } from './media-uploader';
+export {
+	MediaUploader,
+	type MediaUploaderErrorCallback,
+} from './media-uploader';
 export { default as MenuItem } from './ellipsis-menu/menu-item';
 export { default as MenuTitle } from './ellipsis-menu/menu-title';
 export { default as OrderStatus } from './order-status';
@@ -49,7 +52,7 @@ export {
 } from './experimental-select-control';
 export {
 	MenuItem as __experimentalSelectControlMenuItem,
-	MenuItemProps as __experimentalSelectControlMenuItemProps,
+	type MenuItemProps as __experimentalSelectControlMenuItemProps,
 } from './experimental-select-control/menu-item';
 export {
 	Menu as __experimentalSelectControlMenu,
@@ -59,7 +62,7 @@ export { default as ScrollTo } from './scroll-to';
 export { Sortable } from './sortable';
 export { ListItem } from './list-item';
 export { default as Spinner } from './spinner';
-export { default as Stepper, StepperProps } from './stepper';
+export { default as Stepper, type StepperProps } from './stepper';
 export { default as SummaryList } from './summary';
 export { default as SummaryListPlaceholder } from './summary/placeholder';
 export { SummaryNumberPlaceholder } from './summary/placeholder';
@@ -89,12 +92,12 @@ export * from './product-fields';
 export {
 	SlotContextProvider,
 	useSlotContext,
-	SlotContextType,
-	SlotContextHelpersType,
+	type SlotContextType,
+	type SlotContextHelpersType,
 } from './slot-context';
 export {
 	TreeControl as __experimentalTreeControl,
-	Item as TreeItemType,
+	type Item as TreeItemType,
 } from './experimental-tree-control';
 export { SelectTree as __experimentalSelectTreeControl } from './experimental-select-tree-control';
 export { default as TreeSelectControl } from './tree-select-control';
diff --git a/packages/js/components/src/tour-kit/types.ts b/packages/js/components/src/tour-kit/types.ts
index 96faa2761d5..a41cdbd5565 100644
--- a/packages/js/components/src/tour-kit/types.ts
+++ b/packages/js/components/src/tour-kit/types.ts
@@ -53,4 +53,4 @@ export interface WooTourStepRendererProps extends TourStepRendererProps {
 	steps: WooStep[];
 }

-export { CloseHandler } from '@automattic/tour-kit';
+export type { CloseHandler } from '@automattic/tour-kit';
diff --git a/packages/js/create-product-editor-block/changelog/64838-dev-esbuild-package-builds b/packages/js/create-product-editor-block/changelog/64838-dev-esbuild-package-builds
new file mode 100644
index 00000000000..8c5062a7c61
--- /dev/null
+++ b/packages/js/create-product-editor-block/changelog/64838-dev-esbuild-package-builds
@@ -0,0 +1,4 @@
+Significance: patch
+Type: dev
+
+Removed stray wireit devDependency.
diff --git a/packages/js/create-product-editor-block/package.json b/packages/js/create-product-editor-block/package.json
index 5afe877da93..408e4494bd6 100644
--- a/packages/js/create-product-editor-block/package.json
+++ b/packages/js/create-product-editor-block/package.json
@@ -25,8 +25,5 @@
 	"homepage": "https://github.com/woocommerce/woocommerce/tree/trunk/packages/js/create-product-editor-block-extensionv#readme",
 	"publishConfig": {
 		"access": "public"
-	},
-	"devDependencies": {
-		"wireit": "0.14.12"
 	}
 }
diff --git a/packages/js/create-woo-extension/changelog/64838-dev-esbuild-package-builds b/packages/js/create-woo-extension/changelog/64838-dev-esbuild-package-builds
new file mode 100644
index 00000000000..8c5062a7c61
--- /dev/null
+++ b/packages/js/create-woo-extension/changelog/64838-dev-esbuild-package-builds
@@ -0,0 +1,4 @@
+Significance: patch
+Type: dev
+
+Removed stray wireit devDependency.
diff --git a/packages/js/create-woo-extension/package.json b/packages/js/create-woo-extension/package.json
index 41f0a62243b..d1f82341027 100644
--- a/packages/js/create-woo-extension/package.json
+++ b/packages/js/create-woo-extension/package.json
@@ -19,8 +19,5 @@
 	"scripts": {
 		"changelog": "XDEBUG_MODE=off composer install --quiet && composer exec -- changelogger"
 	},
-	"homepage": "https://github.com/woocommerce/woocommerce/tree/trunk/packages/js/create-woo-extension#readme",
-	"devDependencies": {
-		"wireit": "0.14.12"
-	}
+	"homepage": "https://github.com/woocommerce/woocommerce/tree/trunk/packages/js/create-woo-extension#readme"
 }
diff --git a/packages/js/csv-export/build.mjs b/packages/js/csv-export/build.mjs
new file mode 100644
index 00000000000..746bc61fc4b
--- /dev/null
+++ b/packages/js/csv-export/build.mjs
@@ -0,0 +1,112 @@
+import { build, context } from 'esbuild';
+import { glob } from 'glob';
+import { rm } from 'node:fs/promises';
+import chokidar from 'chokidar';
+
+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 ) }` );
+}
diff --git a/packages/js/csv-export/changelog/64838-dev-esbuild-package-builds b/packages/js/csv-export/changelog/64838-dev-esbuild-package-builds
new file mode 100644
index 00000000000..53b9c7cd29c
--- /dev/null
+++ b/packages/js/csv-export/changelog/64838-dev-esbuild-package-builds
@@ -0,0 +1,4 @@
+Significance: patch
+Type: dev
+
+Replaced wireit + tsc package build pipeline with a per-package esbuild script.
diff --git a/packages/js/csv-export/package.json b/packages/js/csv-export/package.json
index 32ad20a878d..f7ea174766c 100644
--- a/packages/js/csv-export/package.json
+++ b/packages/js/csv-export/package.json
@@ -32,9 +32,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:esm": "wireit",
+		"build:project:esm": "node build.mjs",
 		"build:publish:project": "pnpm --if-present '/^build:publish:project:.*$/'",
-		"build:publish:project:cjs": "tsc --project tsconfig-cjs.json --noCheck",
+		"build:publish:project:cjs": "node build.mjs --cjs",
+		"build:publish:project:types": "tsc --build --emitDeclarationOnly",
 		"build:publish:project:deps": "pnpm build",
 		"changelog": "XDEBUG_MODE=off composer install --quiet && composer exec -- changelogger",
 		"lint": "pnpm --if-present '/^lint:lang:.*$/'",
@@ -47,7 +48,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:esm": "wireit"
+		"watch:build:project:esm": "node build.mjs --watch"
 	},
 	"dependencies": {
 		"@types/node": "^24.1.0",
@@ -59,14 +60,16 @@
 		"@woocommerce/eslint-plugin": "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",
 		"rimraf": "5.0.5",
 		"ts-jest": "29.1.x",
-		"typescript": "5.7.x",
-		"wireit": "0.14.12"
+		"typescript": "5.7.x"
 	},
 	"lint-staged": {
 		"*.(t|j)s?(x)": [
@@ -101,45 +104,5 @@
 				}
 			]
 		}
-	},
-	"wireit": {
-		"build:project:esm": {
-			"command": "tsc --project tsconfig.json --noCheck",
-			"clean": "if-file-deleted",
-			"files": [
-				"tsconfig.json",
-				"src/**/*.{js,jsx,ts,tsx}",
-				"typings/**/*.ts"
-			],
-			"output": [
-				"build-module",
-				"build-types",
-				"tsconfig.tsbuildinfo"
-			],
-			"dependencies": [
-				"dependencyOutputs"
-			]
-		},
-		"watch:build:project:esm": {
-			"command": "tsc --project tsconfig.json --noCheck --watch",
-			"service": true
-		},
-		"dependencyOutputs": {
-			"allowUsuallyExcludedPaths": true,
-			"files": [
-				"package.json",
-				"../../../pnpm-lock.yaml",
-				"node_modules/@woocommerce/eslint-plugin/configs",
-				"node_modules/@woocommerce/eslint-plugin/rules",
-				"node_modules/@woocommerce/eslint-plugin/index.js",
-				"node_modules/@woocommerce/internal-js-tests/build",
-				"node_modules/@woocommerce/internal-js-tests/build-module",
-				"node_modules/@woocommerce/internal-js-tests/jest-preset.js",
-				"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"
-			]
-		}
 	}
 }
diff --git a/packages/js/currency/build.mjs b/packages/js/currency/build.mjs
new file mode 100644
index 00000000000..746bc61fc4b
--- /dev/null
+++ b/packages/js/currency/build.mjs
@@ -0,0 +1,112 @@
+import { build, context } from 'esbuild';
+import { glob } from 'glob';
+import { rm } from 'node:fs/promises';
+import chokidar from 'chokidar';
+
+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 ) }` );
+}
diff --git a/packages/js/currency/changelog/64838-dev-esbuild-package-builds b/packages/js/currency/changelog/64838-dev-esbuild-package-builds
new file mode 100644
index 00000000000..53b9c7cd29c
--- /dev/null
+++ b/packages/js/currency/changelog/64838-dev-esbuild-package-builds
@@ -0,0 +1,4 @@
+Significance: patch
+Type: dev
+
+Replaced wireit + tsc package build pipeline with a per-package esbuild script.
diff --git a/packages/js/currency/package.json b/packages/js/currency/package.json
index e8458e32e62..03bade432c9 100644
--- a/packages/js/currency/package.json
+++ b/packages/js/currency/package.json
@@ -32,9 +32,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:esm": "wireit",
+		"build:project:esm": "node build.mjs",
 		"build:publish:project": "pnpm --if-present '/^build:publish:project:.*$/'",
-		"build:publish:project:cjs": "tsc --project tsconfig-cjs.json --noCheck",
+		"build:publish:project:cjs": "node build.mjs --cjs",
+		"build:publish:project:types": "tsc --build --emitDeclarationOnly",
 		"build:publish:project:deps": "pnpm build",
 		"changelog": "XDEBUG_MODE=off composer install --quiet && composer exec -- changelogger",
 		"lint": "pnpm --if-present '/^lint:lang:.*$/'",
@@ -47,7 +48,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:esm": "wireit"
+		"watch:build:project:esm": "node build.mjs --watch"
 	},
 	"lint-staged": {
 		"*.(t|j)s?(x)": [
@@ -73,14 +74,16 @@
 		"@woocommerce/eslint-plugin": "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",
 		"rimraf": "5.0.5",
 		"ts-jest": "29.1.x",
-		"typescript": "5.7.x",
-		"wireit": "0.14.12"
+		"typescript": "5.7.x"
 	},
 	"config": {
 		"ci": {
@@ -106,47 +109,5 @@
 				}
 			]
 		}
-	},
-	"wireit": {
-		"build:project:esm": {
-			"command": "tsc --project tsconfig.json --noCheck",
-			"clean": "if-file-deleted",
-			"files": [
-				"tsconfig.json",
-				"src/**/*.{js,jsx,ts,tsx}",
-				"typings/**/*.ts"
-			],
-			"output": [
-				"build-module",
-				"build-types",
-				"tsconfig.tsbuildinfo"
-			],
-			"dependencies": [
-				"dependencyOutputs"
-			]
-		},
-		"watch:build:project:esm": {
-			"command": "tsc --project tsconfig.json --noCheck --watch",
-			"service": true
-		},
-		"dependencyOutputs": {
-			"allowUsuallyExcludedPaths": true,
-			"files": [
-				"package.json",
-				"../../../pnpm-lock.yaml",
-				"node_modules/@woocommerce/number/build",
-				"node_modules/@woocommerce/number/build-types",
-				"node_modules/@woocommerce/eslint-plugin/configs",
-				"node_modules/@woocommerce/eslint-plugin/rules",
-				"node_modules/@woocommerce/eslint-plugin/index.js",
-				"node_modules/@woocommerce/internal-js-tests/build",
-				"node_modules/@woocommerce/internal-js-tests/build-module",
-				"node_modules/@woocommerce/internal-js-tests/jest-preset.js",
-				"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"
-			]
-		}
 	}
 }
diff --git a/packages/js/customer-effort-score/build.mjs b/packages/js/customer-effort-score/build.mjs
new file mode 100644
index 00000000000..746bc61fc4b
--- /dev/null
+++ b/packages/js/customer-effort-score/build.mjs
@@ -0,0 +1,112 @@
+import { build, context } from 'esbuild';
+import { glob } from 'glob';
+import { rm } from 'node:fs/promises';
+import chokidar from 'chokidar';
+
+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 ) }` );
+}
diff --git a/packages/js/customer-effort-score/changelog/64838-dev-esbuild-package-builds b/packages/js/customer-effort-score/changelog/64838-dev-esbuild-package-builds
new file mode 100644
index 00000000000..53b9c7cd29c
--- /dev/null
+++ b/packages/js/customer-effort-score/changelog/64838-dev-esbuild-package-builds
@@ -0,0 +1,4 @@
+Significance: patch
+Type: dev
+
+Replaced wireit + tsc package build pipeline with a per-package esbuild script.
diff --git a/packages/js/customer-effort-score/package.json b/packages/js/customer-effort-score/package.json
index e5eead9414d..f9971f8ba45 100644
--- a/packages/js/customer-effort-score/package.json
+++ b/packages/js/customer-effort-score/package.json
@@ -32,10 +32,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:bundle": "wireit",
-		"build:project:esm": "wireit",
+		"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": "tsc --project tsconfig-cjs.json --noCheck",
+		"build:publish:project:cjs": "node build.mjs --cjs",
+		"build:publish:project:types": "tsc --build --emitDeclarationOnly",
 		"build:publish:project:deps": "pnpm build",
 		"changelog": "XDEBUG_MODE=off composer install --quiet && composer exec -- changelogger",
 		"lint": "pnpm --if-present '/^lint:lang:.*$/'",
@@ -48,8 +49,8 @@
 		"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:bundle": "wireit",
-		"watch:build:project:esm": "wireit"
+		"watch:build:project:bundle": "NODE_ENV=development webpack --watch",
+		"watch:build:project:esm": "node build.mjs --watch"
 	},
 	"lint-staged": {
 		"*.(t|j)s?(x)": [
@@ -73,8 +74,8 @@
 	},
 	"devDependencies": {
 		"@babel/core": "7.25.7",
-		"@testing-library/react": "^16.x.x",
 		"@testing-library/dom": "^10.4.x",
+		"@testing-library/react": "^16.x.x",
 		"@types/jest": "29.5.x",
 		"@types/prop-types": "^15.7.11",
 		"@types/testing-library__jest-dom": "^5.14.9",
@@ -86,8 +87,11 @@
 		"@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",
@@ -98,8 +102,7 @@
 		"ts-jest": "29.1.x",
 		"typescript": "5.7.x",
 		"webpack": "5.97.x",
-		"webpack-cli": "5.1.x",
-		"wireit": "0.14.12"
+		"webpack-cli": "5.1.x"
 	},
 	"peerDependencies": {
 		"@wordpress/data": "^10.0.2",
@@ -130,82 +133,5 @@
 				}
 			]
 		}
-	},
-	"wireit": {
-		"build:project:bundle": {
-			"command": "webpack",
-			"clean": "if-file-deleted",
-			"env": {
-				"NODE_ENV": {
-					"external": true,
-					"default": "production"
-				}
-			},
-			"files": [
-				"webpack.config.js",
-				"src/**/*.scss"
-			],
-			"output": [
-				"build-style"
-			],
-			"dependencies": [
-				"dependencyOutputs"
-			]
-		},
-		"watch:build:project:bundle": {
-			"command": "webpack --watch",
-			"service": true
-		},
-		"build:project:esm": {
-			"command": "tsc --project tsconfig.json --noCheck",
-			"clean": "if-file-deleted",
-			"files": [
-				"tsconfig.json",
-				"src/**/*.{js,jsx,ts,tsx}",
-				"typings/**/*.ts"
-			],
-			"output": [
-				"build-module",
-				"build-types",
-				"tsconfig.tsbuildinfo"
-			],
-			"dependencies": [
-				"dependencyOutputs"
-			]
-		},
-		"watch:build:project:esm": {
-			"command": "tsc --project tsconfig.json --noCheck --watch",
-			"service": true
-		},
-		"dependencyOutputs": {
-			"allowUsuallyExcludedPaths": true,
-			"files": [
-				"package.json",
-				"../../../pnpm-lock.yaml",
-				"node_modules/@woocommerce/experimental/build",
-				"node_modules/@woocommerce/experimental/build-style",
-				"node_modules/@woocommerce/experimental/build-types",
-				"node_modules/@woocommerce/data/build",
-				"node_modules/@woocommerce/data/build-types",
-				"node_modules/@woocommerce/eslint-plugin/configs",
-				"node_modules/@woocommerce/eslint-plugin/rules",
-				"node_modules/@woocommerce/eslint-plugin/index.js",
-				"node_modules/@woocommerce/internal-js-tests/build",
-				"node_modules/@woocommerce/internal-js-tests/build-module",
-				"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/navigation/build",
-				"node_modules/@woocommerce/navigation/build-types",
-				"node_modules/@woocommerce/tracks/build",
-				"node_modules/@woocommerce/tracks/build-types"
-			]
-		}
 	}
 }
diff --git a/packages/js/data/build.mjs b/packages/js/data/build.mjs
new file mode 100644
index 00000000000..746bc61fc4b
--- /dev/null
+++ b/packages/js/data/build.mjs
@@ -0,0 +1,112 @@
+import { build, context } from 'esbuild';
+import { glob } from 'glob';
+import { rm } from 'node:fs/promises';
+import chokidar from 'chokidar';
+
+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 ) }` );
+}
diff --git a/packages/js/data/changelog/64838-dev-esbuild-package-builds b/packages/js/data/changelog/64838-dev-esbuild-package-builds
new file mode 100644
index 00000000000..53b9c7cd29c
--- /dev/null
+++ b/packages/js/data/changelog/64838-dev-esbuild-package-builds
@@ -0,0 +1,4 @@
+Significance: patch
+Type: dev
+
+Replaced wireit + tsc package build pipeline with a per-package esbuild script.
diff --git a/packages/js/data/package.json b/packages/js/data/package.json
index 916040310ad..497845646e1 100644
--- a/packages/js/data/package.json
+++ b/packages/js/data/package.json
@@ -31,9 +31,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:esm": "wireit",
+		"build:project:esm": "node build.mjs",
 		"build:publish:project": "pnpm --if-present '/^build:publish:project:.*$/'",
-		"build:publish:project:cjs": "tsc --project tsconfig-cjs.json --noCheck",
+		"build:publish:project:cjs": "node build.mjs --cjs",
+		"build:publish:project:types": "tsc --build --emitDeclarationOnly",
 		"build:publish:project:deps": "pnpm build",
 		"changelog": "XDEBUG_MODE=off composer install --quiet && composer exec -- changelogger",
 		"update:php": "XDEBUG_MODE=off composer update --quiet",
@@ -46,7 +47,7 @@
 		"test:js": "jest --config ./jest.config.json --passWithNoTests",
 		"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:esm": "wireit"
+		"watch:build:project:esm": "node build.mjs --watch"
 	},
 	"lint-staged": {
 		"*.(t|j)s?(x)": [
@@ -77,8 +78,8 @@
 	"devDependencies": {
 		"@babel/core": "7.25.7",
 		"@babel/runtime": "7.25.7",
-		"@testing-library/react": "^16.x.x",
 		"@testing-library/dom": "^10.4.x",
+		"@testing-library/react": "^16.x.x",
 		"@types/jest": "29.5.x",
 		"@types/lodash": "^4.14.202",
 		"@types/md5": "^2.3.5",
@@ -88,15 +89,17 @@
 		"@woocommerce/eslint-plugin": "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",
 		"redux": "^4.2.1",
 		"rimraf": "5.0.5",
 		"ts-jest": "29.1.x",
-		"typescript": "5.7.x",
-		"wireit": "0.14.12"
+		"typescript": "5.7.x"
 	},
 	"peerDependencies": {
 		"@wordpress/data": "^10.0.2",
@@ -129,51 +132,5 @@
 				}
 			]
 		}
-	},
-	"wireit": {
-		"build:project:esm": {
-			"command": "tsc --project tsconfig.json --noCheck",
-			"clean": "if-file-deleted",
-			"files": [
-				"tsconfig.json",
-				"src/**/*.{js,jsx,ts,tsx}",
-				"typings/**/*.ts"
-			],
-			"output": [
-				"build-module",
-				"build-types",
-				"tsconfig.tsbuildinfo"
-			],
-			"dependencies": [
-				"dependencyOutputs"
-			]
-		},
-		"watch:build:project:esm": {
-			"command": "tsc --project tsconfig.json --noCheck --watch",
-			"service": true
-		},
-		"dependencyOutputs": {
-			"allowUsuallyExcludedPaths": true,
-			"files": [
-				"package.json",
-				"../../../pnpm-lock.yaml",
-				"node_modules/@woocommerce/date/build",
-				"node_modules/@woocommerce/date/build-types",
-				"node_modules/@woocommerce/navigation/build",
-				"node_modules/@woocommerce/navigation/build-types",
-				"node_modules/@woocommerce/tracks/build",
-				"node_modules/@woocommerce/tracks/build-types",
-				"node_modules/@woocommerce/eslint-plugin/configs",
-				"node_modules/@woocommerce/eslint-plugin/rules",
-				"node_modules/@woocommerce/eslint-plugin/index.js",
-				"node_modules/@woocommerce/internal-js-tests/build",
-				"node_modules/@woocommerce/internal-js-tests/build-module",
-				"node_modules/@woocommerce/internal-js-tests/jest-preset.js",
-				"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"
-			]
-		}
 	}
 }
diff --git a/packages/js/data/src/countries/index.ts b/packages/js/data/src/countries/index.ts
index e8c5f32a903..716e178769d 100644
--- a/packages/js/data/src/countries/index.ts
+++ b/packages/js/data/src/countries/index.ts
@@ -10,7 +10,7 @@ import { STORE_NAME } from './constants';
 import * as selectors from './selectors';
 import * as actions from './actions';
 import * as resolvers from './resolvers';
-import reducer, { State } from './reducer';
+import reducer, { type State } from './reducer';
 export * from './types';
 export type { State };

diff --git a/packages/js/data/src/export/index.ts b/packages/js/data/src/export/index.ts
index e1bf8329e50..c2780d3605a 100644
--- a/packages/js/data/src/export/index.ts
+++ b/packages/js/data/src/export/index.ts
@@ -9,7 +9,7 @@ import { Reducer, AnyAction } from 'redux';
 import { STORE_NAME } from './constants';
 import * as selectors from './selectors';
 import * as actions from './actions';
-import reducer, { State } from './reducer';
+import reducer, { type State } from './reducer';
 import { DispatchFromMap, SelectFromMap, WPDataSelectors } from '../types';
 import controls from '../controls';
 import { PromiseifySelectors } from '../types/promiseify-selectors';
diff --git a/packages/js/data/src/import/index.ts b/packages/js/data/src/import/index.ts
index f93ef728a9c..e45bd5b3262 100644
--- a/packages/js/data/src/import/index.ts
+++ b/packages/js/data/src/import/index.ts
@@ -11,7 +11,7 @@ import { STORE_NAME } from './constants';
 import * as selectors from './selectors';
 import * as actions from './actions';
 import * as resolvers from './resolvers';
-import reducer, { State } from './reducer';
+import reducer, { type State } from './reducer';
 export * from './types';
 export type { State };

diff --git a/packages/js/data/src/index.ts b/packages/js/data/src/index.ts
index c084b04bd45..c0cc818a869 100644
--- a/packages/js/data/src/index.ts
+++ b/packages/js/data/src/index.ts
@@ -28,11 +28,10 @@ export { EXPERIMENTAL_PRODUCT_CATEGORIES_STORE_NAME } from './product-categories
 export { EXPERIMENTAL_PRODUCT_ATTRIBUTE_TERMS_STORE_NAME } from './product-attribute-terms';
 export { EXPERIMENTAL_PRODUCT_VARIATIONS_STORE_NAME } from './product-variations';
 export { EXPERIMENTAL_TAX_CLASSES_STORE_NAME } from './tax-classes';
-export { PaymentGateway } from './payment-gateways/types';
-export {
+export type { PaymentGateway } from './payment-gateways/types';
+export type {
 	PaymentsEntity,
 	PaymentsProvider,
-	PaymentsProviderType,
 	PaymentsProviderState,
 	PaymentsProviderOnboardingState,
 	PaymentGatewayProvider,
@@ -47,7 +46,8 @@ export {
 	RecommendedPaymentMethod,
 	PluginData,
 } from './payment-settings/types';
-export { ShippingMethod } from './shipping-methods/types';
+export { PaymentsProviderType } from './payment-settings/types';
+export type { ShippingMethod } from './shipping-methods/types';
 export { EXPERIMENTAL_PRODUCT_FORM_STORE_NAME } from './product-form';
 export { WOOPAYMENTS_ONBOARDING_STORE_NAME } from './woopayments-onboarding';

@@ -128,19 +128,19 @@ export {
 // Export types
 export * from './types';
 export * from './countries/types';
-export {
+export type {
 	ProductForm,
 	ProductFormField,
 	ProductFormSection,
 } from './product-form/types';
 export * from './onboarding/types';
 export * from './plugins/types';
-export { PluginSelectors } from './plugins/selectors';
-export { PaymentSelectors } from './payment-gateways/selectors';
-export { OnboardingSelectors } from './onboarding/selectors';
-export { PaymentSettingsSelectors } from './payment-settings/selectors';
-export { WooPaymentsOnboardingSelectors } from './woopayments-onboarding/selectors';
-export { ActionDispatchers as PluginActions } from './plugins/actions';
+export type { PluginSelectors } from './plugins/selectors';
+export type { PaymentSelectors } from './payment-gateways/selectors';
+export type { OnboardingSelectors } from './onboarding/selectors';
+export type { PaymentSettingsSelectors } from './payment-settings/selectors';
+export type { WooPaymentsOnboardingSelectors } from './woopayments-onboarding/selectors';
+export type { ActionDispatchers as PluginActions } from './plugins/actions';
 export * from './products/types';
 export type {
 	PartialProductVariation,
@@ -148,28 +148,28 @@ export type {
 	ProductVariationAttribute,
 	ProductVariationImage,
 } from './product-variations/types';
-export {
+export type {
 	QueryProductAttribute,
 	ProductAttribute,
 	ProductAttributeSelectors,
 } from './product-attributes/types';
 export * from './product-shipping-classes/types';
-export {
+export type {
 	ProductAttributeTerm,
 	ProductAttributeTermsSelectors,
 } from './product-attribute-terms/types';
 export * from './orders/types';
-export {
+export type {
 	ProductCategory,
 	ProductCategoryImage,
 	ProductCategorySelectors,
 } from './product-categories/types';
-export { TaxClass } from './tax-classes/types';
-export { ProductTag, Query } from './product-tags/types';
-export { WCUser } from './user/types';
-export { UserPreferences } from './user/types';
+export type { TaxClass } from './tax-classes/types';
+export type { ProductTag, Query } from './product-tags/types';
+export type { WCUser } from './user/types';
+export type { UserPreferences } from './user/types';
 export type { StepContent as WooPaymentsOnboardingStepContent } from './woopayments-onboarding/types';
-export {
+export type {
 	Setting,
 	SettingsGroup,
 	SettingValue,
@@ -318,13 +318,13 @@ export interface WCDataSelector {
 }

 // Other exports
-export { ActionDispatchers as PluginsStoreActions } from './plugins/actions';
-export { ActionDispatchers as ProductTagsActions } from './product-tags/types';
-export { ActionDispatchers as ProductCategoryActions } from './product-categories/types';
-export { ActionDispatchers as ProductAttributeTermsActions } from './product-attribute-terms/types';
-export { ActionDispatchers as ProductAttributesActions } from './product-attributes/types';
-export { ActionDispatchers as ProductVariationsActions } from './product-variations/types';
-export { ActionDispatchers as ProductsStoreActions } from './products/actions';
-export { ActionDispatchers as ProductShippingClassesActions } from './product-shipping-classes/types';
-export { ActionDispatchers as ShippingZonesActions } from './shipping-zones/types';
-export { ActionDispatchers as TaxClassActions } from './tax-classes/types';
+export type { ActionDispatchers as PluginsStoreActions } from './plugins/actions';
+export type { ActionDispatchers as ProductTagsActions } from './product-tags/types';
+export type { ActionDispatchers as ProductCategoryActions } from './product-categories/types';
+export type { ActionDispatchers as ProductAttributeTermsActions } from './product-attribute-terms/types';
+export type { ActionDispatchers as ProductAttributesActions } from './product-attributes/types';
+export type { ActionDispatchers as ProductVariationsActions } from './product-variations/types';
+export type { ActionDispatchers as ProductsStoreActions } from './products/actions';
+export type { ActionDispatchers as ProductShippingClassesActions } from './product-shipping-classes/types';
+export type { ActionDispatchers as ShippingZonesActions } from './shipping-zones/types';
+export type { ActionDispatchers as TaxClassActions } from './tax-classes/types';
diff --git a/packages/js/data/src/items/index.ts b/packages/js/data/src/items/index.ts
index 49d9d531260..403dcb00d20 100644
--- a/packages/js/data/src/items/index.ts
+++ b/packages/js/data/src/items/index.ts
@@ -9,7 +9,7 @@ import { STORE_NAME } from './constants';
 import * as selectors from './selectors';
 import * as actions from './actions';
 import * as resolvers from './resolvers';
-import reducer, { State } from './reducer';
+import reducer, { type State } from './reducer';
 import controls from '../controls';
 import { SelectFromMap, WPDataSelectors } from '../types';
 import { getItemsType } from './selectors';
diff --git a/packages/js/data/src/navigation/index.ts b/packages/js/data/src/navigation/index.ts
index 2b15043c991..24b05831f48 100644
--- a/packages/js/data/src/navigation/index.ts
+++ b/packages/js/data/src/navigation/index.ts
@@ -11,7 +11,7 @@ import deprecated from '@wordpress/deprecated';
 import { STORE_NAME } from './constants';
 import * as selectors from './selectors';
 import * as actions from './actions';
-import reducer, { State } from './reducer';
+import reducer, { type State } from './reducer';
 import * as resolvers from './resolvers';
 import initDispatchers, { INTERNAL_CALL } from './dispatchers';
 import {
diff --git a/packages/js/data/src/notes/index.ts b/packages/js/data/src/notes/index.ts
index 6312064489f..01eb0307d88 100644
--- a/packages/js/data/src/notes/index.ts
+++ b/packages/js/data/src/notes/index.ts
@@ -12,7 +12,7 @@ import { STORE_NAME } from './constants';
 import * as selectors from './selectors';
 import * as actions from './actions';
 import * as resolvers from './resolvers';
-import reducer, { State } from './reducer';
+import reducer, { type State } from './reducer';

 export * from './types';
 export type { State };
diff --git a/packages/js/data/src/onboarding/index.ts b/packages/js/data/src/onboarding/index.ts
index 2f4cc7cea5e..1c5dbcd0ca7 100644
--- a/packages/js/data/src/onboarding/index.ts
+++ b/packages/js/data/src/onboarding/index.ts
@@ -11,7 +11,7 @@ import { STORE_NAME } from './constants';
 import * as selectors from './selectors';
 import * as actions from './actions';
 import * as resolvers from './resolvers';
-import reducer, { State } from './reducer';
+import reducer, { type State } from './reducer';
 import { SelectFromMap, WPDataSelectors } from '../types';
 export * from './types';
 export type { State };
diff --git a/packages/js/data/src/options/index.ts b/packages/js/data/src/options/index.ts
index f0a2679b559..7fffcc58924 100644
--- a/packages/js/data/src/options/index.ts
+++ b/packages/js/data/src/options/index.ts
@@ -10,7 +10,7 @@ import { STORE_NAME } from './constants';
 import * as selectors from './selectors';
 import * as actions from './actions';
 import * as resolvers from './resolvers';
-import reducer, { State } from './reducer';
+import reducer, { type State } from './reducer';
 import { controls } from './controls';
 export * from './types';
 export type { State };
diff --git a/packages/js/data/src/orders/index.ts b/packages/js/data/src/orders/index.ts
index 490822bd236..df46e4fe55f 100644
--- a/packages/js/data/src/orders/index.ts
+++ b/packages/js/data/src/orders/index.ts
@@ -11,7 +11,7 @@ import * as selectors from './selectors';
 import * as actions from './actions';
 import * as resolvers from './resolvers';
 import controls from '../controls';
-import reducer, { State } from './reducer';
+import reducer, { type State } from './reducer';

 export * from './types';
 export type { State };
diff --git a/packages/js/data/src/plugins/index.ts b/packages/js/data/src/plugins/index.ts
index 28f0d762827..cfc4860c51f 100644
--- a/packages/js/data/src/plugins/index.ts
+++ b/packages/js/data/src/plugins/index.ts
@@ -11,7 +11,7 @@ import { STORE_NAME } from './constants';
 import * as selectors from './selectors';
 import * as actions from './actions';
 import * as resolvers from './resolvers';
-import reducer, { State } from './reducer';
+import reducer, { type State } from './reducer';

 export * from './types';
 export type { State };
diff --git a/packages/js/data/src/product-form/index.ts b/packages/js/data/src/product-form/index.ts
index 168063b96a4..b6edf716cef 100644
--- a/packages/js/data/src/product-form/index.ts
+++ b/packages/js/data/src/product-form/index.ts
@@ -10,7 +10,7 @@ import { STORE_NAME } from './constants';
 import * as selectors from './selectors';
 import * as actions from './actions';
 import * as resolvers from './resolvers';
-import reducer, { State } from './reducer';
+import reducer, { type State } from './reducer';
 export * from './types';
 export type { State };

diff --git a/packages/js/data/src/reports/index.ts b/packages/js/data/src/reports/index.ts
index 8473b0ca97d..b2fd4db649c 100644
--- a/packages/js/data/src/reports/index.ts
+++ b/packages/js/data/src/reports/index.ts
@@ -12,7 +12,7 @@ import * as selectors from './selectors';
 import * as actions from './actions';
 import * as resolvers from './resolvers';
 import controls from '../controls';
-import reducer, { State } from './reducer';
+import reducer, { type State } from './reducer';
 import { SelectFromMap, WPDataSelectors } from '../types';
 import { PromiseifySelectors } from '../types/promiseify-selectors';
 export * from './types';
diff --git a/packages/js/data/src/reviews/index.ts b/packages/js/data/src/reviews/index.ts
index 22d78f45ddf..3a20054f402 100644
--- a/packages/js/data/src/reviews/index.ts
+++ b/packages/js/data/src/reviews/index.ts
@@ -11,7 +11,7 @@ import * as selectors from './selectors';
 import * as actions from './actions';
 import * as resolvers from './resolvers';
 import controls from '../controls';
-import reducer, { State } from './reducer';
+import reducer, { type State } from './reducer';

 export * from './types';
 export type { State };
diff --git a/packages/js/data/src/settings/index.ts b/packages/js/data/src/settings/index.ts
index 98394ecc0b4..8e30d7c7637 100644
--- a/packages/js/data/src/settings/index.ts
+++ b/packages/js/data/src/settings/index.ts
@@ -12,7 +12,7 @@ import { STORE_NAME } from './constants';
 import * as selectors from './selectors';
 import * as actions from './actions';
 import * as resolvers from './resolvers';
-import reducer, { State } from './reducer';
+import reducer, { type State } from './reducer';
 import { SettingsState } from './types';

 export * from './types';
diff --git a/packages/js/date/build.mjs b/packages/js/date/build.mjs
new file mode 100644
index 00000000000..746bc61fc4b
--- /dev/null
+++ b/packages/js/date/build.mjs
@@ -0,0 +1,112 @@
+import { build, context } from 'esbuild';
+import { glob } from 'glob';
+import { rm } from 'node:fs/promises';
+import chokidar from 'chokidar';
+
+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 ) }` );
+}
diff --git a/packages/js/date/changelog/64838-dev-esbuild-package-builds b/packages/js/date/changelog/64838-dev-esbuild-package-builds
new file mode 100644
index 00000000000..53b9c7cd29c
--- /dev/null
+++ b/packages/js/date/changelog/64838-dev-esbuild-package-builds
@@ -0,0 +1,4 @@
+Significance: patch
+Type: dev
+
+Replaced wireit + tsc package build pipeline with a per-package esbuild script.
diff --git a/packages/js/date/package.json b/packages/js/date/package.json
index 7e652973709..095a90761c6 100644
--- a/packages/js/date/package.json
+++ b/packages/js/date/package.json
@@ -46,15 +46,17 @@
 		"@woocommerce/eslint-plugin": "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",
 		"rimraf": "5.0.5",
 		"ts-jest": "29.1.x",
-		"typescript": "5.7.x",
-		"wireit": "0.14.12"
+		"typescript": "5.7.x"
 	},
 	"peerDependencies": {
 		"lodash": "^4.17.0"
@@ -65,9 +67,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:esm": "wireit",
+		"build:project:esm": "node build.mjs",
 		"build:publish:project": "pnpm --if-present '/^build:publish:project:.*$/'",
-		"build:publish:project:cjs": "tsc --project tsconfig-cjs.json --noCheck",
+		"build:publish:project:cjs": "node build.mjs --cjs",
+		"build:publish:project:types": "tsc --build --emitDeclarationOnly",
 		"build:publish:project:deps": "pnpm build",
 		"changelog": "XDEBUG_MODE=off composer install --quiet && composer exec -- changelogger",
 		"lint": "pnpm --if-present '/^lint:lang:.*$/'",
@@ -80,7 +83,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:esm": "wireit"
+		"watch:build:project:esm": "node build.mjs --watch"
 	},
 	"lint-staged": {
 		"*.(t|j)s?(x)": [
@@ -112,45 +115,5 @@
 				}
 			]
 		}
-	},
-	"wireit": {
-		"build:project:esm": {
-			"command": "tsc --project tsconfig.json --noCheck",
-			"clean": "if-file-deleted",
-			"files": [
-				"tsconfig.json",
-				"src/**/*.{js,jsx,ts,tsx}",
-				"typings/**/*.ts"
-			],
-			"output": [
-				"build-module",
-				"build-types",
-				"tsconfig.tsbuildinfo"
-			],
-			"dependencies": [
-				"dependencyOutputs"
-			]
-		},
-		"watch:build:project:esm": {
-			"command": "tsc --project tsconfig.json --noCheck --watch",
-			"service": true
-		},
-		"dependencyOutputs": {
-			"allowUsuallyExcludedPaths": true,
-			"files": [
-				"package.json",
-				"../../../pnpm-lock.yaml",
-				"node_modules/@woocommerce/eslint-plugin/configs",
-				"node_modules/@woocommerce/eslint-plugin/rules",
-				"node_modules/@woocommerce/eslint-plugin/index.js",
-				"node_modules/@woocommerce/internal-js-tests/build",
-				"node_modules/@woocommerce/internal-js-tests/build-module",
-				"node_modules/@woocommerce/internal-js-tests/jest-preset.js",
-				"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"
-			]
-		}
 	}
 }
diff --git a/packages/js/dependency-extraction-webpack-plugin/changelog/64838-dev-esbuild-package-builds b/packages/js/dependency-extraction-webpack-plugin/changelog/64838-dev-esbuild-package-builds
new file mode 100644
index 00000000000..8c5062a7c61
--- /dev/null
+++ b/packages/js/dependency-extraction-webpack-plugin/changelog/64838-dev-esbuild-package-builds
@@ -0,0 +1,4 @@
+Significance: patch
+Type: dev
+
+Removed stray wireit devDependency.
diff --git a/packages/js/dependency-extraction-webpack-plugin/package.json b/packages/js/dependency-extraction-webpack-plugin/package.json
index e78a06681ef..4d6ee1017c0 100644
--- a/packages/js/dependency-extraction-webpack-plugin/package.json
+++ b/packages/js/dependency-extraction-webpack-plugin/package.json
@@ -40,8 +40,7 @@
 		"ts-jest": "29.1.x",
 		"typescript": "5.7.x",
 		"webpack": "5.97.x",
-		"webpack-cli": "5.1.x",
-		"wireit": "0.14.12"
+		"webpack-cli": "5.1.x"
 	},
 	"scripts": {
 		"changelog": "XDEBUG_MODE=off composer install --quiet && composer exec -- changelogger",
diff --git a/packages/js/e2e-utils-playwright/build.mjs b/packages/js/e2e-utils-playwright/build.mjs
new file mode 100644
index 00000000000..746bc61fc4b
--- /dev/null
+++ b/packages/js/e2e-utils-playwright/build.mjs
@@ -0,0 +1,112 @@
+import { build, context } from 'esbuild';
+import { glob } from 'glob';
+import { rm } from 'node:fs/promises';
+import chokidar from 'chokidar';
+
+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 ) }` );
+}
diff --git a/packages/js/e2e-utils-playwright/changelog/64838-dev-esbuild-package-builds b/packages/js/e2e-utils-playwright/changelog/64838-dev-esbuild-package-builds
new file mode 100644
index 00000000000..53b9c7cd29c
--- /dev/null
+++ b/packages/js/e2e-utils-playwright/changelog/64838-dev-esbuild-package-builds
@@ -0,0 +1,4 @@
+Significance: patch
+Type: dev
+
+Replaced wireit + tsc package build pipeline with a per-package esbuild script.
diff --git a/packages/js/e2e-utils-playwright/package.json b/packages/js/e2e-utils-playwright/package.json
index 4ea72802191..3dd6eec4578 100644
--- a/packages/js/e2e-utils-playwright/package.json
+++ b/packages/js/e2e-utils-playwright/package.json
@@ -29,19 +29,20 @@
 	"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": "wireit",
-		"build:project:esm": "wireit",
+		"build:project:cjs": "node build.mjs --cjs",
+		"build:project:esm": "node build.mjs",
 		"changelog": "XDEBUG_MODE=off composer install --quiet && composer exec -- changelogger",
 		"lint": "eslint --ext=js,ts,tsx src",
 		"lint:fix": "eslint --ext=js,ts,tsx src --fix",
 		"lint:lang:types": "tsc --build --emitDeclarationOnly",
+		"build:publish:project:types": "tsc --build --emitDeclarationOnly",
 		"prepack": "pnpm build",
 		"test": "jest --passWithNoTests",
 		"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": "wireit",
-		"watch:build:project:esm": "wireit"
+		"watch:build:project:cjs": "node build.mjs --cjs --watch",
+		"watch:build:project:esm": "node build.mjs --watch"
 	},
 	"config": {
 		"ci": {
@@ -73,12 +74,14 @@
 		"@woocommerce/eslint-plugin": "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",
-		"typescript": "5.7.x",
-		"wireit": "0.14.12"
+		"typescript": "5.7.x"
 	},
 	"dependencies": {
 		"axios": "^1.6.0",
@@ -86,62 +89,5 @@
 	},
 	"publishConfig": {
 		"access": "public"
-	},
-	"wireit": {
-		"build:project:cjs": {
-			"command": "tsc --project tsconfig-cjs.json --noCheck",
-			"clean": "if-file-deleted",
-			"files": [
-				"tsconfig-cjs.json",
-				"src/**/*.{js,jsx,ts,tsx}"
-			],
-			"output": [
-				"build"
-			],
-			"dependencies": [
-				"dependencyOutputs"
-			]
-		},
-		"watch:build:project:cjs": {
-			"command": "tsc --project tsconfig-cjs.json --watch --noCheck",
-			"service": true
-		},
-		"build:project:esm": {
-			"command": "tsc --project tsconfig.json --noCheck",
-			"clean": "if-file-deleted",
-			"files": [
-				"tsconfig.json",
-				"src/**/*.{js,jsx,ts,tsx}"
-			],
-			"output": [
-				"build-module",
-				"build-types",
-				"tsconfig.tsbuildinfo"
-			],
-			"dependencies": [
-				"dependencyOutputs"
-			]
-		},
-		"watch:build:project:esm": {
-			"command": "tsc --project tsconfig.json --noCheck --watch",
-			"service": true
-		},
-		"dependencyOutputs": {
-			"allowUsuallyExcludedPaths": true,
-			"files": [
-				"package.json",
-				"../../../pnpm-lock.yaml",
-				"node_modules/@woocommerce/eslint-plugin/configs",
-				"node_modules/@woocommerce/eslint-plugin/rules",
-				"node_modules/@woocommerce/eslint-plugin/index.js",
-				"node_modules/@woocommerce/internal-js-tests/build",
-				"node_modules/@woocommerce/internal-js-tests/build-module",
-				"node_modules/@woocommerce/internal-js-tests/jest-preset.js",
-				"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"
-			]
-		}
 	}
 }
diff --git a/packages/js/email-editor/build.mjs b/packages/js/email-editor/build.mjs
new file mode 100644
index 00000000000..746bc61fc4b
--- /dev/null
+++ b/packages/js/email-editor/build.mjs
@@ -0,0 +1,112 @@
+import { build, context } from 'esbuild';
+import { glob } from 'glob';
+import { rm } from 'node:fs/promises';
+import chokidar from 'chokidar';
+
+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 ) }` );
+}
diff --git a/packages/js/email-editor/changelog/64838-dev-esbuild-package-builds b/packages/js/email-editor/changelog/64838-dev-esbuild-package-builds
new file mode 100644
index 00000000000..53b9c7cd29c
--- /dev/null
+++ b/packages/js/email-editor/changelog/64838-dev-esbuild-package-builds
@@ -0,0 +1,4 @@
+Significance: patch
+Type: dev
+
+Replaced wireit + tsc package build pipeline with a per-package esbuild script.
diff --git a/packages/js/email-editor/package.json b/packages/js/email-editor/package.json
index 092c960d825..47ae6ee58fb 100644
--- a/packages/js/email-editor/package.json
+++ b/packages/js/email-editor/package.json
@@ -37,10 +37,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:bundle": "wireit",
-		"build:project:esm": "wireit",
+		"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": "tsc --project tsconfig-cjs.json --noCheck",
+		"build:publish:project:cjs": "node build.mjs --cjs",
+		"build:publish:project:types": "tsc --build --emitDeclarationOnly",
 		"build:publish:project:deps": "pnpm build",
 		"changelog": "XDEBUG_MODE=off composer install --quiet && composer exec -- changelogger",
 		"format": "prettier --write 'src/**/*.{js,jsx,json,ts,tsx,yml,yaml,scss}'",
@@ -57,8 +58,8 @@
 		"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:bundle": "wireit",
-		"watch:build:project:esm": "wireit"
+		"watch:build:project:bundle": "NODE_ENV=development webpack --watch",
+		"watch:build:project:esm": "node build.mjs --watch"
 	},
 	"lint-staged": {
 		"*.{js,jsx,json,ts,tsx,yml,yaml,scss}": "pnpm run format",
@@ -126,7 +127,10 @@
 		"@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",
@@ -137,8 +141,7 @@
 		"ts-loader": "9.5.x",
 		"typescript": "5.7.x",
 		"webpack": "5.97.x",
-		"webpack-cli": "5.1.x",
-		"wireit": "0.14.12"
+		"webpack-cli": "5.1.x"
 	},
 	"config": {
 		"ci": {
@@ -165,73 +168,5 @@
 				}
 			]
 		}
-	},
-	"wireit": {
-		"build:project:bundle": {
-			"command": "webpack",
-			"clean": "if-file-deleted",
-			"env": {
-				"NODE_ENV": {
-					"external": true,
-					"default": "production"
-				}
-			},
-			"files": [
-				"webpack.config.js",
-				"src/**/*.scss"
-			],
-			"output": [
-				"build-style"
-			],
-			"dependencies": [
-				"dependencyOutputs"
-			]
-		},
-		"watch:build:project:bundle": {
-			"command": "webpack --watch",
-			"service": true
-		},
-		"build:project:esm": {
-			"command": "tsc --project tsconfig.json --noCheck",
-			"clean": "if-file-deleted",
-			"files": [
-				"tsconfig.json",
-				"src/**/*.{js,jsx,ts,tsx}",
-				"typings/**/*.ts"
-			],
-			"output": [
-				"build-module",
-				"build-types",
-				"tsconfig.tsbuildinfo"
-			],
-			"dependencies": [
-				"dependencyOutputs"
-			]
-		},
-		"watch:build:project:esm": {
-			"command": "tsc --project tsconfig.json --noCheck --watch",
-			"service": true
-		},
-		"dependencyOutputs": {
-			"allowUsuallyExcludedPaths": true,
-			"files": [
-				"package.json",
-				"../../../pnpm-lock.yaml",
-				"node_modules/@woocommerce/eslint-plugin/configs",
-				"node_modules/@woocommerce/eslint-plugin/rules",
-				"node_modules/@woocommerce/eslint-plugin/index.js",
-				"node_modules/@woocommerce/internal-js-tests/build",
-				"node_modules/@woocommerce/internal-js-tests/build-module",
-				"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"
-			]
-		}
 	}
 }
diff --git a/packages/js/email-editor/src/index.ts b/packages/js/email-editor/src/index.ts
index 5120cbe73ab..fb4797e4738 100644
--- a/packages/js/email-editor/src/index.ts
+++ b/packages/js/email-editor/src/index.ts
@@ -29,8 +29,8 @@ import { initialize } from './editor';
 export {
 	storeName,
 	createStore,
-	TemplatePreview,
-	EmailBuiltStyles,
+	type TemplatePreview,
+	type EmailBuiltStyles,
 } from './store';

 /**
diff --git a/packages/js/eslint-plugin/changelog/64838-dev-esbuild-package-builds b/packages/js/eslint-plugin/changelog/64838-dev-esbuild-package-builds
new file mode 100644
index 00000000000..8c5062a7c61
--- /dev/null
+++ b/packages/js/eslint-plugin/changelog/64838-dev-esbuild-package-builds
@@ -0,0 +1,4 @@
+Significance: patch
+Type: dev
+
+Removed stray wireit devDependency.
diff --git a/packages/js/eslint-plugin/package.json b/packages/js/eslint-plugin/package.json
index 73779f23f25..c146b774564 100644
--- a/packages/js/eslint-plugin/package.json
+++ b/packages/js/eslint-plugin/package.json
@@ -54,8 +54,7 @@
 		"jest-cli": "29.5.x",
 		"rimraf": "5.0.5",
 		"ts-jest": "29.1.x",
-		"typescript": "5.7.x",
-		"wireit": "0.14.12"
+		"typescript": "5.7.x"
 	},
 	"lint-staged": {
 		"*.(t|j)s?(x)": [
diff --git a/packages/js/experimental-products-app/build.mjs b/packages/js/experimental-products-app/build.mjs
new file mode 100644
index 00000000000..746bc61fc4b
--- /dev/null
+++ b/packages/js/experimental-products-app/build.mjs
@@ -0,0 +1,112 @@
+import { build, context } from 'esbuild';
+import { glob } from 'glob';
+import { rm } from 'node:fs/promises';
+import chokidar from 'chokidar';
+
+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 ) }` );
+}
diff --git a/packages/js/experimental-products-app/changelog/64838-dev-esbuild-package-builds b/packages/js/experimental-products-app/changelog/64838-dev-esbuild-package-builds
new file mode 100644
index 00000000000..53b9c7cd29c
--- /dev/null
+++ b/packages/js/experimental-products-app/changelog/64838-dev-esbuild-package-builds
@@ -0,0 +1,4 @@
+Significance: patch
+Type: dev
+
+Replaced wireit + tsc package build pipeline with a per-package esbuild script.
diff --git a/packages/js/experimental-products-app/package.json b/packages/js/experimental-products-app/package.json
index 9bd47131c3b..f4567c3a3c8 100644
--- a/packages/js/experimental-products-app/package.json
+++ b/packages/js/experimental-products-app/package.json
@@ -78,8 +78,11 @@
 		"@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",
@@ -91,16 +94,16 @@
 		"typescript": "5.7.x",
 		"webpack": "5.97.x",
 		"webpack-cli": "5.1.x",
-		"webpack-remove-empty-scripts": "1.0.x",
-		"wireit": "0.14.12"
+		"webpack-remove-empty-scripts": "1.0.x"
 	},
 	"scripts": {
 		"build": "pnpm --if-present --workspace-concurrency=Infinity --stream --filter=\"$npm_package_name...\" '/^build:project:.*$/'",
 		"build:project": "pnpm --if-present '/^build:project:.*$/'",
-		"build:project:bundle": "wireit",
-		"build:project:esm": "wireit",
+		"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": "tsc --project tsconfig-cjs.json --noCheck",
+		"build:publish:project:cjs": "node build.mjs --cjs",
+		"build:publish:project:types": "tsc --build --emitDeclarationOnly",
 		"build:publish:project:deps": "pnpm build",
 		"changelog": "XDEBUG_MODE=off composer install --quiet && composer exec -- changelogger",
 		"lint": "pnpm --if-present '/^lint:lang:.*$/'",
@@ -113,8 +116,8 @@
 		"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:bundle": "wireit",
-		"watch:build:project:esm": "wireit"
+		"watch:build:project:bundle": "NODE_ENV=development webpack --watch",
+		"watch:build:project:esm": "node build.mjs --watch"
 	},
 	"peerDependencies": {
 		"@types/react": "18.3.x",
@@ -146,75 +149,5 @@
 				}
 			]
 		}
-	},
-	"wireit": {
-		"build:project:bundle": {
-			"command": "webpack",
-			"clean": "if-file-deleted",
-			"env": {
-				"NODE_ENV": {
-					"external": true,
-					"default": "production"
-				}
-			},
-			"files": [
-				"webpack.config.js",
-				"src/**/*.scss"
-			],
-			"output": [
-				"build-style"
-			],
-			"dependencies": [
-				"dependencyOutputs"
-			]
-		},
-		"watch:build:project:bundle": {
-			"command": "webpack --watch",
-			"service": true
-		},
-		"build:project:esm": {
-			"command": "tsc --project tsconfig.json --noCheck",
-			"clean": "if-file-deleted",
-			"files": [
-				"tsconfig.json",
-				"src/**/*.{js,jsx,ts,tsx}",
-				"typings/**/*.ts"
-			],
-			"output": [
-				"build-module",
-				"build-types",
-				"tsconfig.tsbuildinfo"
-			],
-			"dependencies": [
-				"dependencyOutputs"
-			]
-		},
-		"watch:build:project:esm": {
-			"command": "tsc --project tsconfig.json --noCheck --watch",
-			"service": true
-		},
-		"dependencyOutputs": {
-			"allowUsuallyExcludedPaths": true,
-			"files": [
-				"package.json",
-				"../../../pnpm-lock.yaml",
-				"node_modules/@woocommerce/data/build",
-				"node_modules/@woocommerce/data/build-types",
-				"node_modules/@woocommerce/eslint-plugin/configs",
-				"node_modules/@woocommerce/eslint-plugin/rules",
-				"node_modules/@woocommerce/eslint-plugin/index.js",
-				"node_modules/@woocommerce/internal-js-tests/build",
-				"node_modules/@woocommerce/internal-js-tests/build-module",
-				"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"
-			]
-		}
 	}
 }
diff --git a/packages/js/experimental/build.mjs b/packages/js/experimental/build.mjs
new file mode 100644
index 00000000000..746bc61fc4b
--- /dev/null
+++ b/packages/js/experimental/build.mjs
@@ -0,0 +1,112 @@
+import { build, context } from 'esbuild';
+import { glob } from 'glob';
+import { rm } from 'node:fs/promises';
+import chokidar from 'chokidar';
+
+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 ) }` );
+}
diff --git a/packages/js/experimental/changelog/64838-dev-esbuild-package-builds b/packages/js/experimental/changelog/64838-dev-esbuild-package-builds
new file mode 100644
index 00000000000..53b9c7cd29c
--- /dev/null
+++ b/packages/js/experimental/changelog/64838-dev-esbuild-package-builds
@@ -0,0 +1,4 @@
+Significance: patch
+Type: dev
+
+Replaced wireit + tsc package build pipeline with a per-package esbuild script.
diff --git a/packages/js/experimental/package.json b/packages/js/experimental/package.json
index c5a35019a49..1ba6b302693 100644
--- a/packages/js/experimental/package.json
+++ b/packages/js/experimental/package.json
@@ -68,8 +68,11 @@
 		"@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",
@@ -80,8 +83,7 @@
 		"ts-jest": "29.1.x",
 		"typescript": "5.7.x",
 		"webpack": "5.97.x",
-		"webpack-cli": "5.1.x",
-		"wireit": "0.14.12"
+		"webpack-cli": "5.1.x"
 	},
 	"peerDependencies": {
 		"react": "18.3.x",
@@ -90,10 +92,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:bundle": "wireit",
-		"build:project:esm": "wireit",
+		"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": "tsc --project tsconfig-cjs.json --noCheck",
+		"build:publish:project:cjs": "node build.mjs --cjs",
+		"build:publish:project:types": "tsc --build --emitDeclarationOnly",
 		"build:publish:project:deps": "pnpm build",
 		"changelog": "XDEBUG_MODE=off composer install --quiet && composer exec -- changelogger",
 		"lint": "pnpm --if-present '/^lint:lang:.*$/'",
@@ -106,8 +109,8 @@
 		"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:bundle": "wireit",
-		"watch:build:project:esm": "wireit"
+		"watch:build:project:bundle": "NODE_ENV=development webpack --watch",
+		"watch:build:project:esm": "node build.mjs --watch"
 	},
 	"lint-staged": {
 		"*.(t|j)s?(x)": [
@@ -139,79 +142,5 @@
 				}
 			]
 		}
-	},
-	"wireit": {
-		"build:project:bundle": {
-			"command": "webpack",
-			"clean": "if-file-deleted",
-			"env": {
-				"NODE_ENV": {
-					"external": true,
-					"default": "production"
-				}
-			},
-			"files": [
-				"webpack.config.js",
-				"src/**/*.scss"
-			],
-			"output": [
-				"build-style"
-			],
-			"dependencies": [
-				"dependencyOutputs"
-			]
-		},
-		"watch:build:project:bundle": {
-			"command": "webpack --watch",
-			"service": true
-		},
-		"build:project:esm": {
-			"command": "tsc --project tsconfig.json --noCheck",
-			"clean": "if-file-deleted",
-			"files": [
-				"tsconfig.json",
-				"src/**/*.{js,jsx,ts,tsx}",
-				"typings/**/*.ts"
-			],
-			"output": [
-				"build-module",
-				"build-types",
-				"tsconfig.tsbuildinfo"
-			],
-			"dependencies": [
-				"dependencyOutputs"
-			]
-		},
-		"watch:build:project:esm": {
-			"command": "tsc --project tsconfig.json --noCheck --watch",
-			"service": true
-		},
-		"dependencyOutputs": {
-			"allowUsuallyExcludedPaths": true,
-			"files": [
-				"package.json",
-				"../../../pnpm-lock.yaml",
-				"node_modules/@woocommerce/components/build",
-				"node_modules/@woocommerce/components/build-style",
-				"node_modules/@woocommerce/components/build-types",
-				"node_modules/@woocommerce/sanitize/build",
-				"node_modules/@woocommerce/sanitize/build-style",
-				"node_modules/@woocommerce/sanitize/build-types",
-				"node_modules/@woocommerce/eslint-plugin/configs",
-				"node_modules/@woocommerce/eslint-plugin/rules",
-				"node_modules/@woocommerce/eslint-plugin/index.js",
-				"node_modules/@woocommerce/internal-js-tests/build",
-				"node_modules/@woocommerce/internal-js-tests/build-module",
-				"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"
-			]
-		}
 	}
 }
diff --git a/packages/js/experimental/src/inbox-note/inbox-note.tsx b/packages/js/experimental/src/inbox-note/inbox-note.tsx
index 49f58aaf738..3fa8d130012 100644
--- a/packages/js/experimental/src/inbox-note/inbox-note.tsx
+++ b/packages/js/experimental/src/inbox-note/inbox-note.tsx
@@ -206,4 +206,4 @@ const InboxNoteCard = ( {
 	);
 };

-export { InboxNoteCard, InboxNote, InboxNoteAction };
+export { InboxNoteCard, type InboxNote, type InboxNoteAction };
diff --git a/packages/js/explat/build.mjs b/packages/js/explat/build.mjs
new file mode 100644
index 00000000000..746bc61fc4b
--- /dev/null
+++ b/packages/js/explat/build.mjs
@@ -0,0 +1,112 @@
+import { build, context } from 'esbuild';
+import { glob } from 'glob';
+import { rm } from 'node:fs/promises';
+import chokidar from 'chokidar';
+
+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 ) }` );
+}
diff --git a/packages/js/explat/changelog/64838-dev-esbuild-package-builds b/packages/js/explat/changelog/64838-dev-esbuild-package-builds
new file mode 100644
index 00000000000..53b9c7cd29c
--- /dev/null
+++ b/packages/js/explat/changelog/64838-dev-esbuild-package-builds
@@ -0,0 +1,4 @@
+Significance: patch
+Type: dev
+
+Replaced wireit + tsc package build pipeline with a per-package esbuild script.
diff --git a/packages/js/explat/package.json b/packages/js/explat/package.json
index 53d0b00a7b7..cf7d73412b2 100644
--- a/packages/js/explat/package.json
+++ b/packages/js/explat/package.json
@@ -32,9 +32,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:esm": "wireit",
+		"build:project:esm": "node build.mjs",
 		"build:publish:project": "pnpm --if-present '/^build:publish:project:.*$/'",
-		"build:publish:project:cjs": "tsc --project tsconfig-cjs.json --noCheck",
+		"build:publish:project:cjs": "node build.mjs --cjs",
+		"build:publish:project:types": "tsc --build --emitDeclarationOnly",
 		"build:publish:project:deps": "pnpm build",
 		"changelog": "XDEBUG_MODE=off composer install --quiet && composer exec -- changelogger",
 		"lint": "pnpm --if-present '/^lint:lang:.*$/'",
@@ -47,7 +48,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:esm": "wireit"
+		"watch:build:project:esm": "node build.mjs --watch"
 	},
 	"lint-staged": {
 		"*.(t|j)s?(x)": [
@@ -73,14 +74,16 @@
 		"@woocommerce/eslint-plugin": "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",
 		"rimraf": "5.0.5",
 		"ts-jest": "29.1.x",
-		"typescript": "5.7.x",
-		"wireit": "0.14.12"
+		"typescript": "5.7.x"
 	},
 	"publishConfig": {
 		"access": "public"
@@ -109,45 +112,5 @@
 				}
 			]
 		}
-	},
-	"wireit": {
-		"build:project:esm": {
-			"command": "tsc --project tsconfig.json --noCheck",
-			"clean": "if-file-deleted",
-			"files": [
-				"tsconfig.json",
-				"src/**/*.{js,jsx,ts,tsx}",
-				"typings/**/*.ts"
-			],
-			"output": [
-				"build-module",
-				"build-types",
-				"tsconfig.tsbuildinfo"
-			],
-			"dependencies": [
-				"dependencyOutputs"
-			]
-		},
-		"watch:build:project:esm": {
-			"command": "tsc --project tsconfig.json --noCheck --watch",
-			"service": true
-		},
-		"dependencyOutputs": {
-			"allowUsuallyExcludedPaths": true,
-			"files": [
-				"package.json",
-				"../../../pnpm-lock.yaml",
-				"node_modules/@woocommerce/eslint-plugin/configs",
-				"node_modules/@woocommerce/eslint-plugin/rules",
-				"node_modules/@woocommerce/eslint-plugin/index.js",
-				"node_modules/@woocommerce/internal-js-tests/build",
-				"node_modules/@woocommerce/internal-js-tests/build-module",
-				"node_modules/@woocommerce/internal-js-tests/jest-preset.js",
-				"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"
-			]
-		}
 	}
 }
diff --git a/packages/js/expression-evaluation/build.mjs b/packages/js/expression-evaluation/build.mjs
new file mode 100644
index 00000000000..746bc61fc4b
--- /dev/null
+++ b/packages/js/expression-evaluation/build.mjs
@@ -0,0 +1,112 @@
+import { build, context } from 'esbuild';
+import { glob } from 'glob';
+import { rm } from 'node:fs/promises';
+import chokidar from 'chokidar';
+
+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 ) }` );
+}
diff --git a/packages/js/expression-evaluation/changelog/64838-dev-esbuild-package-builds b/packages/js/expression-evaluation/changelog/64838-dev-esbuild-package-builds
new file mode 100644
index 00000000000..53b9c7cd29c
--- /dev/null
+++ b/packages/js/expression-evaluation/changelog/64838-dev-esbuild-package-builds
@@ -0,0 +1,4 @@
+Significance: patch
+Type: dev
+
+Replaced wireit + tsc package build pipeline with a per-package esbuild script.
diff --git a/packages/js/expression-evaluation/package.json b/packages/js/expression-evaluation/package.json
index 658f5d428e6..bf9f54c815d 100644
--- a/packages/js/expression-evaluation/package.json
+++ b/packages/js/expression-evaluation/package.json
@@ -40,9 +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:esm": "wireit",
+		"build:project:esm": "node build.mjs",
 		"build:publish:project": "pnpm --if-present '/^build:publish:project:.*$/'",
-		"build:publish:project:cjs": "tsc --project tsconfig-cjs.json --noCheck",
+		"build:publish:project:cjs": "node build.mjs --cjs",
+		"build:publish:project:types": "tsc --build --emitDeclarationOnly",
 		"build:publish:project:deps": "pnpm build",
 		"changelog": "XDEBUG_MODE=off composer install --quiet && composer exec -- changelogger",
 		"lint": "pnpm --if-present '/^lint:lang:.*$/'",
@@ -54,7 +55,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:esm": "wireit"
+		"watch:build:project:esm": "node build.mjs --watch"
 	},
 	"devDependencies": {
 		"@babel/core": "7.25.7",
@@ -62,14 +63,16 @@
 		"@woocommerce/eslint-plugin": "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",
 		"rimraf": "5.0.5",
 		"ts-jest": "29.1.x",
-		"typescript": "5.7.x",
-		"wireit": "0.14.12"
+		"typescript": "5.7.x"
 	},
 	"lint-staged": {
 		"*.(t|j)s?(x)": [
@@ -84,45 +87,5 @@
 				"changes": "src/**/*.{js,jsx,ts,tsx}"
 			}
 		}
-	},
-	"wireit": {
-		"build:project:esm": {
-			"command": "tsc --project tsconfig.json --noCheck",
-			"clean": "if-file-deleted",
-			"files": [
-				"tsconfig.json",
-				"src/**/*.{js,jsx,ts,tsx}",
-				"typings/**/*.ts"
-			],
-			"output": [
-				"build-module",
-				"build-types",
-				"tsconfig.tsbuildinfo"
-			],
-			"dependencies": [
-				"dependencyOutputs"
-			]
-		},
-		"watch:build:project:esm": {
-			"command": "tsc --project tsconfig.json --noCheck --watch",
-			"service": true
-		},
-		"dependencyOutputs": {
-			"allowUsuallyExcludedPaths": true,
-			"files": [
-				"package.json",
-				"../../../pnpm-lock.yaml",
-				"node_modules/@woocommerce/eslint-plugin/configs",
-				"node_modules/@woocommerce/eslint-plugin/rules",
-				"node_modules/@woocommerce/eslint-plugin/index.js",
-				"node_modules/@woocommerce/internal-js-tests/build",
-				"node_modules/@woocommerce/internal-js-tests/build-module",
-				"node_modules/@woocommerce/internal-js-tests/jest-preset.js",
-				"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"
-			]
-		}
 	}
 }
diff --git a/packages/js/extend-cart-checkout-block/changelog/64838-dev-esbuild-package-builds b/packages/js/extend-cart-checkout-block/changelog/64838-dev-esbuild-package-builds
new file mode 100644
index 00000000000..8c5062a7c61
--- /dev/null
+++ b/packages/js/extend-cart-checkout-block/changelog/64838-dev-esbuild-package-builds
@@ -0,0 +1,4 @@
+Significance: patch
+Type: dev
+
+Removed stray wireit devDependency.
diff --git a/packages/js/extend-cart-checkout-block/package.json b/packages/js/extend-cart-checkout-block/package.json
index fb1b2eb94ff..d82cdc93a45 100644
--- a/packages/js/extend-cart-checkout-block/package.json
+++ b/packages/js/extend-cart-checkout-block/package.json
@@ -19,8 +19,5 @@
 	"scripts": {
 		"changelog": "XDEBUG_MODE=off composer install --quiet && composer exec -- changelogger"
 	},
-	"homepage": "https://github.com/woocommerce/woocommerce/tree/trunk/packages/js/extend-cart-checkout-block#readme",
-	"devDependencies": {
-		"wireit": "0.14.12"
-	}
+	"homepage": "https://github.com/woocommerce/woocommerce/tree/trunk/packages/js/extend-cart-checkout-block#readme"
 }
diff --git a/packages/js/integrate-plugin/build.mjs b/packages/js/integrate-plugin/build.mjs
new file mode 100644
index 00000000000..746bc61fc4b
--- /dev/null
+++ b/packages/js/integrate-plugin/build.mjs
@@ -0,0 +1,112 @@
+import { build, context } from 'esbuild';
+import { glob } from 'glob';
+import { rm } from 'node:fs/promises';
+import chokidar from 'chokidar';
+
+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 ) }` );
+}
diff --git a/packages/js/integrate-plugin/changelog/64838-dev-esbuild-package-builds b/packages/js/integrate-plugin/changelog/64838-dev-esbuild-package-builds
new file mode 100644
index 00000000000..53b9c7cd29c
--- /dev/null
+++ b/packages/js/integrate-plugin/changelog/64838-dev-esbuild-package-builds
@@ -0,0 +1,4 @@
+Significance: patch
+Type: dev
+
+Replaced wireit + tsc package build pipeline with a per-package esbuild script.
diff --git a/packages/js/integrate-plugin/package.json b/packages/js/integrate-plugin/package.json
index 6d7c5e90e14..05897d48b3f 100644
--- a/packages/js/integrate-plugin/package.json
+++ b/packages/js/integrate-plugin/package.json
@@ -30,21 +30,22 @@
 	"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": "wireit",
-		"build:project:esm": "wireit",
+		"build:project:cjs": "node build.mjs --cjs",
+		"build:project:esm": "node build.mjs",
 		"changelog": "XDEBUG_MODE=off composer install --quiet && composer exec -- changelogger",
 		"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",
 		"lint:lang:types": "tsc --build --emitDeclarationOnly",
+		"build:publish:project:types": "tsc --build --emitDeclarationOnly",
 		"prepack": "pnpm build",
 		"test:js": "jest --config ./jest.config.json --passWithNoTests",
 		"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": "wireit",
-		"watch:build:project:esm": "wireit"
+		"watch:build:project:cjs": "node build.mjs --cjs --watch",
+		"watch:build:project:esm": "node build.mjs --watch"
 	},
 	"dependencies": {
 		"@wordpress/create-block": "catalog:wp-min",
@@ -69,9 +70,12 @@
 		"@woocommerce/internal-js-tests": "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",
@@ -79,8 +83,7 @@
 		"ts-jest": "29.1.x",
 		"typescript": "5.7.x",
 		"webpack": "5.97.x",
-		"webpack-cli": "5.1.x",
-		"wireit": "0.14.12"
+		"webpack-cli": "5.1.x"
 	},
 	"config": {
 		"ci": {
@@ -106,64 +109,5 @@
 				}
 			]
 		}
-	},
-	"wireit": {
-		"build:project:cjs": {
-			"command": "tsc --project tsconfig-cjs.json --noCheck",
-			"clean": "if-file-deleted",
-			"files": [
-				"tsconfig-cjs.json",
-				"src/**/*.{js,jsx,ts,tsx}",
-				"typings/**/*.ts"
-			],
-			"output": [
-				"build"
-			],
-			"dependencies": [
-				"dependencyOutputs"
-			]
-		},
-		"watch:build:project:cjs": {
-			"command": "tsc --project tsconfig-cjs.json --watch --noCheck",
-			"service": true
-		},
-		"build:project:esm": {
-			"command": "tsc --project tsconfig.json --noCheck",
-			"clean": "if-file-deleted",
-			"files": [
-				"tsconfig.json",
-				"src/**/*.{js,jsx,ts,tsx}",
-				"typings/**/*.ts"
-			],
-			"output": [
-				"build-module",
-				"build-types",
-				"tsconfig.tsbuildinfo"
-			],
-			"dependencies": [
-				"dependencyOutputs"
-			]
-		},
-		"watch:build:project:esm": {
-			"command": "tsc --project tsconfig.json --noCheck --watch",
-			"service": true
-		},
-		"dependencyOutputs": {
-			"allowUsuallyExcludedPaths": true,
-			"files": [
-				"package.json",
-				"../../../pnpm-lock.yaml",
-				"node_modules/@woocommerce/eslint-plugin/configs",
-				"node_modules/@woocommerce/eslint-plugin/rules",
-				"node_modules/@woocommerce/eslint-plugin/index.js",
-				"node_modules/@woocommerce/internal-js-tests/build",
-				"node_modules/@woocommerce/internal-js-tests/build-module",
-				"node_modules/@woocommerce/internal-js-tests/jest-preset.js",
-				"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"
-			]
-		}
 	}
 }
diff --git a/packages/js/internal-js-tests/build.mjs b/packages/js/internal-js-tests/build.mjs
new file mode 100644
index 00000000000..302b9874aaf
--- /dev/null
+++ b/packages/js/internal-js-tests/build.mjs
@@ -0,0 +1,114 @@
+import { build, context } from 'esbuild';
+import { glob } from 'glob';
+import { rm } from 'node:fs/promises';
+import chokidar from 'chokidar';
+
+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 ) }` );
+}
diff --git a/packages/js/internal-js-tests/changelog/64838-dev-esbuild-package-builds b/packages/js/internal-js-tests/changelog/64838-dev-esbuild-package-builds
new file mode 100644
index 00000000000..53b9c7cd29c
--- /dev/null
+++ b/packages/js/internal-js-tests/changelog/64838-dev-esbuild-package-builds
@@ -0,0 +1,4 @@
+Significance: patch
+Type: dev
+
+Replaced wireit + tsc package build pipeline with a per-package esbuild script.
diff --git a/packages/js/internal-js-tests/package.json b/packages/js/internal-js-tests/package.json
index 4639e861f11..e7d75f9c127 100644
--- a/packages/js/internal-js-tests/package.json
+++ b/packages/js/internal-js-tests/package.json
@@ -27,9 +27,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:esm": "wireit",
+		"build:project:esm": "node build.mjs",
 		"build:publish:project": "pnpm --if-present '/^build:publish:project:.*$/'",
-		"build:publish:project:cjs": "tsc --project tsconfig-cjs.json --noCheck",
+		"build:publish:project:cjs": "node build.mjs --cjs",
+		"build:publish:project:types": "tsc --build --emitDeclarationOnly",
 		"build:publish:project:deps": "pnpm build",
 		"changelog": "XDEBUG_MODE=off composer install --quiet && composer exec -- changelogger",
 		"lint": "pnpm --if-present '/^lint:lang:.*$/'",
@@ -41,7 +42,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:esm": "wireit"
+		"watch:build:project:esm": "node build.mjs --watch"
 	},
 	"dependencies": {
 		"@testing-library/jest-dom": "^6.x.x",
@@ -55,16 +56,18 @@
 		"@woocommerce/eslint-plugin": "workspace:*",
 		"@woocommerce/internal-ts-config": "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",
+		"lib0": "0.2.x",
 		"resize-observer-polyfill": "1.5.1",
 		"rimraf": "5.0.5",
 		"ts-jest": "29.1.x",
-		"lib0": "0.2.x",
-		"typescript": "5.7.x",
-		"wireit": "0.14.12"
+		"typescript": "5.7.x"
 	},
 	"peerDependencies": {
 		"@wordpress/data": "^10.0.2",
@@ -83,41 +86,5 @@
 				"changes": "src/**/*.{js,jsx,ts,tsx}"
 			}
 		}
-	},
-	"wireit": {
-		"build:project:esm": {
-			"command": "tsc --project tsconfig.json --noCheck",
-			"clean": "if-file-deleted",
-			"files": [
-				"tsconfig.json",
-				"src/**/*.{js,jsx,ts,tsx}",
-				"typings/**/*.ts"
-			],
-			"output": [
-				"build-module",
-				"tsconfig.tsbuildinfo"
-			],
-			"dependencies": [
-				"dependencyOutputs"
-			]
-		},
-		"watch:build:project:esm": {
-			"command": "tsc --project tsconfig.json --noCheck --watch",
-			"service": true
-		},
-		"dependencyOutputs": {
-			"allowUsuallyExcludedPaths": true,
-			"files": [
-				"package.json",
-				"../../../pnpm-lock.yaml",
-				"node_modules/@woocommerce/eslint-plugin/configs",
-				"node_modules/@woocommerce/eslint-plugin/rules",
-				"node_modules/@woocommerce/eslint-plugin/index.js",
-				"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"
-			]
-		}
 	}
 }
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
new file mode 100644
index 00000000000..8c5062a7c61
--- /dev/null
+++ b/packages/js/internal-style-build/changelog/64838-dev-esbuild-package-builds
@@ -0,0 +1,4 @@
+Significance: patch
+Type: dev
+
+Removed stray wireit devDependency.
diff --git a/packages/js/internal-style-build/package.json b/packages/js/internal-style-build/package.json
index dd52070d159..998fa29bbd0 100644
--- a/packages/js/internal-style-build/package.json
+++ b/packages/js/internal-style-build/package.json
@@ -60,8 +60,7 @@
 		"rimraf": "5.0.5",
 		"ts-jest": "29.1.x",
 		"typescript": "5.7.x",
-		"webpack": "5.97.x",
-		"wireit": "0.14.12"
+		"webpack": "5.97.x"
 	},
 	"config": {
 		"ci": {
diff --git a/packages/js/internal-ts-config/.eslintrc.js b/packages/js/internal-ts-config/.eslintrc.js
deleted file mode 100644
index d38babfc189..00000000000
--- a/packages/js/internal-ts-config/.eslintrc.js
+++ /dev/null
@@ -1,5 +0,0 @@
-module.exports = {
-	extends: [ 'plugin:@woocommerce/eslint-plugin/recommended' ],
-	root: true,
-	ignorePatterns: [ 'scripts/' ],
-};
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
new file mode 100644
index 00000000000..ce3980e55d8
--- /dev/null
+++ b/packages/js/internal-ts-config/changelog/64838-dev-esbuild-package-builds
@@ -0,0 +1,4 @@
+Significance: patch
+Type: dev
+
+Inlined the wireit-wrapped types generator command into the build script.
diff --git a/packages/js/internal-ts-config/package.json b/packages/js/internal-ts-config/package.json
index e2568a0ff33..1f1d7bbe673 100644
--- a/packages/js/internal-ts-config/package.json
+++ b/packages/js/internal-ts-config/package.json
@@ -17,54 +17,16 @@
 	"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": "wireit",
-		"lint": "pnpm --if-present '/^lint:lang:.*$/'",
-		"lint:fix": "pnpm --if-present '/^lint:fix:lang:.*$/'",
-		"lint:fix:lang:js": "eslint 'types/**/*.d.ts' --fix",
-		"lint:lang:js": "eslint 'types/**/*.d.ts'",
+		"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",
-		"@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",
-		"wireit": "0.14.12"
-	},
-	"wireit": {
-		"build:project:types": {
-			"command": "node scripts/generate-types.mjs generate",
-			"files": [
-				"scripts/generate-types.mjs",
-				"types/@wordpress/block-editor.patch",
-				"types/@wordpress/core-data.patch",
-				"types/@wordpress/data.patch",
-				"types/@wordpress/editor.patch",
-				"types/@wordpress/notices.patch"
-			],
-			"output": [
-				"types/@wordpress/block-editor/",
-				"types/@wordpress/core-data/",
-				"types/@wordpress/data/",
-				"types/@wordpress/editor/",
-				"types/@wordpress/notices/"
-			],
-			"clean": "if-file-deleted"
-		},
-		"dependencyOutputs": {
-			"allowUsuallyExcludedPaths": true,
-			"files": [
-				"package.json",
-				"../../../pnpm-lock.yaml",
-				"node_modules/@woocommerce/eslint-plugin/configs",
-				"node_modules/@woocommerce/eslint-plugin/rules",
-				"node_modules/@woocommerce/eslint-plugin/index.js"
-			]
-		}
+		"typescript": "5.7.x"
 	}
 }
diff --git a/packages/js/internal-ts-config/tsconfig.json b/packages/js/internal-ts-config/tsconfig.json
index 25892314c87..93f8b284f2e 100644
--- a/packages/js/internal-ts-config/tsconfig.json
+++ b/packages/js/internal-ts-config/tsconfig.json
@@ -7,6 +7,7 @@
 		"strict": true,
 		"esModuleInterop": true,
 		"skipLibCheck": true,
+		"isolatedModules": true,
 		"jsx": "react",
 		"jsxFactory": "createElement",
 		"jsxFragmentFactory": "Fragment"
diff --git a/packages/js/navigation/build.mjs b/packages/js/navigation/build.mjs
new file mode 100644
index 00000000000..746bc61fc4b
--- /dev/null
+++ b/packages/js/navigation/build.mjs
@@ -0,0 +1,112 @@
+import { build, context } from 'esbuild';
+import { glob } from 'glob';
+import { rm } from 'node:fs/promises';
+import chokidar from 'chokidar';
+
+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 ) }` );
+}
diff --git a/packages/js/navigation/changelog/64838-dev-esbuild-package-builds b/packages/js/navigation/changelog/64838-dev-esbuild-package-builds
new file mode 100644
index 00000000000..53b9c7cd29c
--- /dev/null
+++ b/packages/js/navigation/changelog/64838-dev-esbuild-package-builds
@@ -0,0 +1,4 @@
+Significance: patch
+Type: dev
+
+Replaced wireit + tsc package build pipeline with a per-package esbuild script.
diff --git a/packages/js/navigation/package.json b/packages/js/navigation/package.json
index 9d10340d5fa..44d6ff8312b 100644
--- a/packages/js/navigation/package.json
+++ b/packages/js/navigation/package.json
@@ -32,9 +32,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:esm": "wireit",
+		"build:project:esm": "node build.mjs",
 		"build:publish:project": "pnpm --if-present '/^build:publish:project:.*$/'",
-		"build:publish:project:cjs": "tsc --project tsconfig-cjs.json --noCheck",
+		"build:publish:project:cjs": "node build.mjs --cjs",
+		"build:publish:project:types": "tsc --build --emitDeclarationOnly",
 		"build:publish:project:deps": "pnpm build",
 		"changelog": "XDEBUG_MODE=off composer install --quiet && composer exec -- changelogger",
 		"lint": "pnpm --if-present '/^lint:lang:.*$/'",
@@ -47,7 +48,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:esm": "wireit"
+		"watch:build:project:esm": "node build.mjs --watch"
 	},
 	"lint-staged": {
 		"*.(t|j)s?(x)": [
@@ -82,14 +83,16 @@
 		"@woocommerce/eslint-plugin": "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",
 		"rimraf": "5.0.5",
 		"ts-jest": "29.1.x",
-		"typescript": "5.7.x",
-		"wireit": "0.14.12"
+		"typescript": "5.7.x"
 	},
 	"config": {
 		"ci": {
@@ -115,45 +118,5 @@
 				}
 			]
 		}
-	},
-	"wireit": {
-		"build:project:esm": {
-			"command": "tsc --project tsconfig.json --noCheck",
-			"clean": "if-file-deleted",
-			"files": [
-				"tsconfig.json",
-				"src/**/*.{js,jsx,ts,tsx}",
-				"typings/**/*.ts"
-			],
-			"output": [
-				"build-module",
-				"build-types",
-				"tsconfig.tsbuildinfo"
-			],
-			"dependencies": [
-				"dependencyOutputs"
-			]
-		},
-		"watch:build:project:esm": {
-			"command": "tsc --project tsconfig.json --noCheck --watch",
-			"service": true
-		},
-		"dependencyOutputs": {
-			"allowUsuallyExcludedPaths": true,
-			"files": [
-				"package.json",
-				"../../../pnpm-lock.yaml",
-				"node_modules/@woocommerce/eslint-plugin/configs",
-				"node_modules/@woocommerce/eslint-plugin/rules",
-				"node_modules/@woocommerce/eslint-plugin/index.js",
-				"node_modules/@woocommerce/internal-js-tests/build",
-				"node_modules/@woocommerce/internal-js-tests/build-module",
-				"node_modules/@woocommerce/internal-js-tests/jest-preset.js",
-				"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"
-			]
-		}
 	}
 }
diff --git a/packages/js/notices/build.mjs b/packages/js/notices/build.mjs
new file mode 100644
index 00000000000..746bc61fc4b
--- /dev/null
+++ b/packages/js/notices/build.mjs
@@ -0,0 +1,112 @@
+import { build, context } from 'esbuild';
+import { glob } from 'glob';
+import { rm } from 'node:fs/promises';
+import chokidar from 'chokidar';
+
+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 ) }` );
+}
diff --git a/packages/js/notices/changelog/64838-dev-esbuild-package-builds b/packages/js/notices/changelog/64838-dev-esbuild-package-builds
new file mode 100644
index 00000000000..53b9c7cd29c
--- /dev/null
+++ b/packages/js/notices/changelog/64838-dev-esbuild-package-builds
@@ -0,0 +1,4 @@
+Significance: patch
+Type: dev
+
+Replaced wireit + tsc package build pipeline with a per-package esbuild script.
diff --git a/packages/js/notices/package.json b/packages/js/notices/package.json
index 1ee36abcf11..1bcd7764e9d 100644
--- a/packages/js/notices/package.json
+++ b/packages/js/notices/package.json
@@ -33,9 +33,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:esm": "wireit",
+		"build:project:esm": "node build.mjs",
 		"build:publish:project": "pnpm --if-present '/^build:publish:project:.*$/'",
-		"build:publish:project:cjs": "tsc --project tsconfig-cjs.json --noCheck",
+		"build:publish:project:cjs": "node build.mjs --cjs",
+		"build:publish:project:types": "tsc --build --emitDeclarationOnly",
 		"build:publish:project:deps": "pnpm build",
 		"changelog": "XDEBUG_MODE=off composer install --quiet && composer exec -- changelogger",
 		"lint": "pnpm --if-present '/^lint:lang:.*$/'",
@@ -47,7 +48,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:esm": "wireit"
+		"watch:build:project:esm": "node build.mjs --watch"
 	},
 	"lint-staged": {
 		"*.(t|j)s?(x)": [
@@ -74,14 +75,16 @@
 		"@types/lodash": "^4.14.202",
 		"@woocommerce/eslint-plugin": "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",
 		"redux": "^4.2.1",
 		"rimraf": "5.0.5",
 		"ts-jest": "29.1.x",
-		"typescript": "5.7.x",
-		"wireit": "0.14.12"
+		"typescript": "5.7.x"
 	},
 	"config": {
 		"ci": {
@@ -90,44 +93,5 @@
 				"changes": "src/**/*.{js,jsx,ts,tsx}"
 			}
 		}
-	},
-	"wireit": {
-		"build:project:esm": {
-			"command": "tsc --project tsconfig.json --noCheck",
-			"clean": "if-file-deleted",
-			"files": [
-				"tsconfig.json",
-				"src/**/*.{js,jsx,ts,tsx}",
-				"typings/**/*.ts"
-			],
-			"output": [
-				"build-module",
-				"build-types",
-				"tsconfig.tsbuildinfo"
-			],
-			"dependencies": [
-				"dependencyOutputs"
-			]
-		},
-		"watch:build:project:esm": {
-			"command": "tsc --project tsconfig.json --noCheck --watch",
-			"service": true
-		},
-		"dependencyOutputs": {
-			"allowUsuallyExcludedPaths": true,
-			"files": [
-				"package.json",
-				"../../../pnpm-lock.yaml",
-				"node_modules/@woocommerce/data/build",
-				"node_modules/@woocommerce/data/build-types",
-				"node_modules/@woocommerce/eslint-plugin/configs",
-				"node_modules/@woocommerce/eslint-plugin/rules",
-				"node_modules/@woocommerce/eslint-plugin/index.js",
-				"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"
-			]
-		}
 	}
 }
diff --git a/packages/js/number/build.mjs b/packages/js/number/build.mjs
new file mode 100644
index 00000000000..746bc61fc4b
--- /dev/null
+++ b/packages/js/number/build.mjs
@@ -0,0 +1,112 @@
+import { build, context } from 'esbuild';
+import { glob } from 'glob';
+import { rm } from 'node:fs/promises';
+import chokidar from 'chokidar';
+
+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 ) }` );
+}
diff --git a/packages/js/number/changelog/64838-dev-esbuild-package-builds b/packages/js/number/changelog/64838-dev-esbuild-package-builds
new file mode 100644
index 00000000000..53b9c7cd29c
--- /dev/null
+++ b/packages/js/number/changelog/64838-dev-esbuild-package-builds
@@ -0,0 +1,4 @@
+Significance: patch
+Type: dev
+
+Replaced wireit + tsc package build pipeline with a per-package esbuild script.
diff --git a/packages/js/number/package.json b/packages/js/number/package.json
index 63587ddb39a..a4a1cb30a47 100644
--- a/packages/js/number/package.json
+++ b/packages/js/number/package.json
@@ -37,9 +37,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:esm": "wireit",
+		"build:project:esm": "node build.mjs",
 		"build:publish:project": "pnpm --if-present '/^build:publish:project:.*$/'",
-		"build:publish:project:cjs": "tsc --project tsconfig-cjs.json --noCheck",
+		"build:publish:project:cjs": "node build.mjs --cjs",
+		"build:publish:project:types": "tsc --build --emitDeclarationOnly",
 		"build:publish:project:deps": "pnpm build",
 		"changelog": "XDEBUG_MODE=off composer install --quiet && composer exec -- changelogger",
 		"lint": "pnpm --if-present '/^lint:lang:.*$/'",
@@ -52,7 +53,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:esm": "wireit"
+		"watch:build:project:esm": "node build.mjs --watch"
 	},
 	"devDependencies": {
 		"@babel/core": "7.25.7",
@@ -62,14 +63,16 @@
 		"@woocommerce/eslint-plugin": "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",
 		"rimraf": "5.0.5",
 		"ts-jest": "29.1.x",
-		"typescript": "5.7.x",
-		"wireit": "0.14.12"
+		"typescript": "5.7.x"
 	},
 	"lint-staged": {
 		"*.(t|j)s?(x)": [
@@ -101,45 +104,5 @@
 				}
 			]
 		}
-	},
-	"wireit": {
-		"build:project:esm": {
-			"command": "tsc --project tsconfig.json --noCheck",
-			"clean": "if-file-deleted",
-			"files": [
-				"tsconfig.json",
-				"src/**/*.{js,jsx,ts,tsx}",
-				"typings/**/*.ts"
-			],
-			"output": [
-				"build-module",
-				"build-types",
-				"tsconfig.tsbuildinfo"
-			],
-			"dependencies": [
-				"dependencyOutputs"
-			]
-		},
-		"watch:build:project:esm": {
-			"command": "tsc --project tsconfig.json --noCheck --watch",
-			"service": true
-		},
-		"dependencyOutputs": {
-			"allowUsuallyExcludedPaths": true,
-			"files": [
-				"package.json",
-				"../../../pnpm-lock.yaml",
-				"node_modules/@woocommerce/eslint-plugin/configs",
-				"node_modules/@woocommerce/eslint-plugin/rules",
-				"node_modules/@woocommerce/eslint-plugin/index.js",
-				"node_modules/@woocommerce/internal-js-tests/build",
-				"node_modules/@woocommerce/internal-js-tests/build-module",
-				"node_modules/@woocommerce/internal-js-tests/jest-preset.js",
-				"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"
-			]
-		}
 	}
 }
diff --git a/packages/js/onboarding/build.mjs b/packages/js/onboarding/build.mjs
new file mode 100644
index 00000000000..746bc61fc4b
--- /dev/null
+++ b/packages/js/onboarding/build.mjs
@@ -0,0 +1,112 @@
+import { build, context } from 'esbuild';
+import { glob } from 'glob';
+import { rm } from 'node:fs/promises';
+import chokidar from 'chokidar';
+
+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 ) }` );
+}
diff --git a/packages/js/onboarding/changelog/64838-dev-esbuild-package-builds b/packages/js/onboarding/changelog/64838-dev-esbuild-package-builds
new file mode 100644
index 00000000000..53b9c7cd29c
--- /dev/null
+++ b/packages/js/onboarding/changelog/64838-dev-esbuild-package-builds
@@ -0,0 +1,4 @@
+Significance: patch
+Type: dev
+
+Replaced wireit + tsc package build pipeline with a per-package esbuild script.
diff --git a/packages/js/onboarding/package.json b/packages/js/onboarding/package.json
index 6c02a7b72b8..b3570ee08f4 100644
--- a/packages/js/onboarding/package.json
+++ b/packages/js/onboarding/package.json
@@ -33,10 +33,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:bundle": "wireit",
-		"build:project:esm": "wireit",
+		"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": "tsc --project tsconfig-cjs.json --noCheck",
+		"build:publish:project:cjs": "node build.mjs --cjs",
+		"build:publish:project:types": "tsc --build --emitDeclarationOnly",
 		"build:publish:project:deps": "pnpm build",
 		"changelog": "XDEBUG_MODE=off composer install --quiet && composer exec -- changelogger",
 		"lint": "pnpm --if-present '/^lint:lang:.*$/'",
@@ -49,8 +50,8 @@
 		"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:bundle": "wireit",
-		"watch:build:project:esm": "wireit"
+		"watch:build:project:bundle": "NODE_ENV=development webpack --watch",
+		"watch:build:project:esm": "node build.mjs --watch"
 	},
 	"lint-staged": {
 		"*.(t|j)s?(x)": [
@@ -83,8 +84,11 @@
 		"@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",
@@ -95,8 +99,7 @@
 		"ts-jest": "29.1.x",
 		"typescript": "5.7.x",
 		"webpack": "5.97.x",
-		"webpack-cli": "5.1.x",
-		"wireit": "0.14.12"
+		"webpack-cli": "5.1.x"
 	},
 	"publishConfig": {
 		"access": "public"
@@ -125,83 +128,5 @@
 				}
 			]
 		}
-	},
-	"wireit": {
-		"build:project:bundle": {
-			"command": "webpack",
-			"clean": "if-file-deleted",
-			"env": {
-				"NODE_ENV": {
-					"external": true,
-					"default": "production"
-				}
-			},
-			"files": [
-				"webpack.config.js",
-				"src/**/*.scss"
-			],
-			"output": [
-				"build-style"
-			],
-			"dependencies": [
-				"dependencyOutputs"
-			]
-		},
-		"watch:build:project:bundle": {
-			"command": "webpack --watch",
-			"service": true
-		},
-		"build:project:esm": {
-			"command": "tsc --project tsconfig.json --noCheck",
-			"clean": "if-file-deleted",
-			"files": [
-				"tsconfig.json",
-				"src/**/*.{js,jsx,ts,tsx}",
-				"typings/**/*.ts"
-			],
-			"output": [
-				"build-module",
-				"build-types",
-				"tsconfig.tsbuildinfo"
-			],
-			"dependencies": [
-				"dependencyOutputs"
-			]
-		},
-		"watch:build:project:esm": {
-			"command": "tsc --project tsconfig.json --noCheck --watch",
-			"service": true
-		},
-		"dependencyOutputs": {
-			"allowUsuallyExcludedPaths": true,
-			"files": [
-				"package.json",
-				"../../../pnpm-lock.yaml",
-				"node_modules/@woocommerce/components/build",
-				"node_modules/@woocommerce/components/build-style",
-				"node_modules/@woocommerce/components/build-types",
-				"node_modules/@woocommerce/experimental/build",
-				"node_modules/@woocommerce/experimental/build-style",
-				"node_modules/@woocommerce/experimental/build-types",
-				"node_modules/@woocommerce/explat/build",
-				"node_modules/@woocommerce/explat/build-types",
-				"node_modules/@woocommerce/tracks/build",
-				"node_modules/@woocommerce/tracks/build-types",
-				"node_modules/@woocommerce/eslint-plugin/configs",
-				"node_modules/@woocommerce/eslint-plugin/rules",
-				"node_modules/@woocommerce/eslint-plugin/index.js",
-				"node_modules/@woocommerce/internal-js-tests/build",
-				"node_modules/@woocommerce/internal-js-tests/build-module",
-				"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"
-			]
-		}
 	}
 }
diff --git a/packages/js/onboarding/src/index.ts b/packages/js/onboarding/src/index.ts
index 5663523e469..a9374144134 100644
--- a/packages/js/onboarding/src/index.ts
+++ b/packages/js/onboarding/src/index.ts
@@ -21,7 +21,7 @@ export { default as WCPayLogo } from './images/wcpay-logo';
 export { WooPaymentGatewaySetup } from './components/WooPaymentGatewaySetup';
 export { WooPaymentGatewayConfigure } from './components/WooPaymentGatewayConfigure';
 export {
-	TaskReferralRecord,
+	type TaskReferralRecord,
 	accessTaskReferralStorage,
 	createStorageUtils,
 } from './components/WooOnboardingTaskReferral';
diff --git a/packages/js/product-editor/build.mjs b/packages/js/product-editor/build.mjs
new file mode 100644
index 00000000000..09753307811
--- /dev/null
+++ b/packages/js/product-editor/build.mjs
@@ -0,0 +1,125 @@
+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';
+
+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 ) }` );
+}
diff --git a/packages/js/product-editor/changelog/64838-dev-esbuild-package-builds b/packages/js/product-editor/changelog/64838-dev-esbuild-package-builds
new file mode 100644
index 00000000000..53b9c7cd29c
--- /dev/null
+++ b/packages/js/product-editor/changelog/64838-dev-esbuild-package-builds
@@ -0,0 +1,4 @@
+Significance: patch
+Type: dev
+
+Replaced wireit + tsc package build pipeline with a per-package esbuild script.
diff --git a/packages/js/product-editor/package.json b/packages/js/product-editor/package.json
index 289791795d4..148d26271cb 100644
--- a/packages/js/product-editor/package.json
+++ b/packages/js/product-editor/package.json
@@ -83,8 +83,8 @@
 	"devDependencies": {
 		"@babel/core": "7.25.7",
 		"@babel/runtime": "7.25.7",
-		"@testing-library/jest-dom": "^6.x.x",
 		"@testing-library/dom": "^10.4.x",
+		"@testing-library/jest-dom": "^6.x.x",
 		"@testing-library/react": "^16.x.x",
 		"@testing-library/react-hooks": "8.0.1",
 		"@testing-library/user-event": "13.5.0",
@@ -101,9 +101,12 @@
 		"@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",
@@ -119,29 +122,29 @@
 		"typescript": "5.7.x",
 		"webpack": "5.97.x",
 		"webpack-cli": "5.1.x",
-		"webpack-remove-empty-scripts": "1.0.x",
-		"wireit": "0.14.12"
+		"webpack-remove-empty-scripts": "1.0.x"
 	},
 	"scripts": {
 		"build": "pnpm --if-present --workspace-concurrency=Infinity --stream --filter=\"$npm_package_name...\" '/^build:project:.*$/'",
 		"build:project": "pnpm --if-present '/^build:project:.*$/'",
-		"build:project:bundle": "wireit",
-		"build:project:cjs": "wireit",
-		"build:project:esm": "wireit",
+		"build:project:bundle": "NODE_ENV=production webpack",
+		"build:project:cjs": "node build.mjs --cjs",
+		"build:project:esm": "node build.mjs",
 		"changelog": "XDEBUG_MODE=off composer install --quiet && composer exec -- changelogger",
 		"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",
 		"lint:lang:types": "tsc --build --emitDeclarationOnly",
+		"build:publish:project:types": "tsc --build --emitDeclarationOnly",
 		"prepack": "pnpm build",
 		"test:js": "jest --config ./jest.config.json --passWithNoTests",
 		"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:bundle": "wireit",
-		"watch:build:project:cjs": "wireit",
-		"watch:build:project:esm": "wireit"
+		"watch:build:project:bundle": "NODE_ENV=development webpack --watch",
+		"watch:build:project:cjs": "node build.mjs --cjs --watch",
+		"watch:build:project:esm": "node build.mjs --watch"
 	},
 	"peerDependencies": {
 		"@types/react": "18.3.x",
@@ -174,124 +177,5 @@
 				}
 			]
 		}
-	},
-	"wireit": {
-		"build:project:bundle": {
-			"command": "webpack",
-			"clean": "if-file-deleted",
-			"env": {
-				"NODE_ENV": {
-					"external": true,
-					"default": "production"
-				}
-			},
-			"files": [
-				"webpack.config.js",
-				"config/**/*.js",
-				"src/**/*.scss",
-				"src/**/block.json"
-			],
-			"output": [
-				"build-style"
-			],
-			"dependencies": [
-				"dependencyOutputs"
-			]
-		},
-		"watch:build:project:bundle": {
-			"command": "webpack --watch",
-			"service": true
-		},
-		"build:project:cjs": {
-			"command": "tsc --project tsconfig-cjs.json --noCheck",
-			"clean": "if-file-deleted",
-			"files": [
-				"tsconfig-cjs.json",
-				"src/**/*.{js,jsx,ts,tsx}",
-				"typings/**/*.ts"
-			],
-			"output": [
-				"build"
-			],
-			"dependencies": [
-				"dependencyOutputs"
-			]
-		},
-		"watch:build:project:cjs": {
-			"command": "tsc --project tsconfig-cjs.json --watch --noCheck",
-			"service": true
-		},
-		"build:project:esm": {
-			"command": "tsc --project tsconfig.json --noCheck",
-			"clean": "if-file-deleted",
-			"files": [
-				"tsconfig.json",
-				"src/**/*.{js,jsx,ts,tsx}",
-				"typings/**/*.ts"
-			],
-			"output": [
-				"build-module",
-				"build-types",
-				"tsconfig.tsbuildinfo"
-			],
-			"dependencies": [
-				"dependencyOutputs"
-			]
-		},
-		"watch:build:project:esm": {
-			"command": "tsc --project tsconfig.json --noCheck --watch",
-			"service": true
-		},
-		"dependencyOutputs": {
-			"allowUsuallyExcludedPaths": true,
-			"files": [
-				"package.json",
-				"../../../pnpm-lock.yaml",
-				"node_modules/@woocommerce/admin-layout/build",
-				"node_modules/@woocommerce/admin-layout/build-style",
-				"node_modules/@woocommerce/admin-layout/build-types",
-				"node_modules/@woocommerce/block-templates/build",
-				"node_modules/@woocommerce/block-templates/build-style",
-				"node_modules/@woocommerce/block-templates/build-types",
-				"node_modules/@woocommerce/components/build",
-				"node_modules/@woocommerce/components/build-style",
-				"node_modules/@woocommerce/components/build-types",
-				"node_modules/@woocommerce/currency/build",
-				"node_modules/@woocommerce/currency/build-types",
-				"node_modules/@woocommerce/customer-effort-score/build",
-				"node_modules/@woocommerce/customer-effort-score/build-style",
-				"node_modules/@woocommerce/customer-effort-score/build-types",
-				"node_modules/@woocommerce/data/build",
-				"node_modules/@woocommerce/data/build-types",
-				"node_modules/@woocommerce/experimental/build",
-				"node_modules/@woocommerce/experimental/build-style",
-				"node_modules/@woocommerce/experimental/build-types",
-				"node_modules/@woocommerce/expression-evaluation/build",
-				"node_modules/@woocommerce/expression-evaluation/build-types",
-				"node_modules/@woocommerce/navigation/build",
-				"node_modules/@woocommerce/navigation/build-types",
-				"node_modules/@woocommerce/number/build",
-				"node_modules/@woocommerce/number/build-types",
-				"node_modules/@woocommerce/tracks/build",
-				"node_modules/@woocommerce/tracks/build-types",
-				"node_modules/@woocommerce/sanitize/build",
-				"node_modules/@woocommerce/sanitize/build-style",
-				"node_modules/@woocommerce/sanitize/build-types",
-				"node_modules/@woocommerce/eslint-plugin/configs",
-				"node_modules/@woocommerce/eslint-plugin/rules",
-				"node_modules/@woocommerce/eslint-plugin/index.js",
-				"node_modules/@woocommerce/internal-js-tests/build",
-				"node_modules/@woocommerce/internal-js-tests/build-module",
-				"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"
-			]
-		}
 	}
 }
diff --git a/packages/js/product-editor/src/components/index.ts b/packages/js/product-editor/src/components/index.ts
index 80b37d9c793..20fcbefa264 100644
--- a/packages/js/product-editor/src/components/index.ts
+++ b/packages/js/product-editor/src/components/index.ts
@@ -13,11 +13,11 @@ export {
 export {
 	Editor as __experimentalEditor,
 	initBlocks as __experimentalInitBlocks,
-	ProductEditorSettings,
+	type ProductEditorSettings,
 } from './editor';
 export {
 	BlockIcon as __experimentalBlockIcon,
-	BlockIconProps,
+	type BlockIconProps,
 } from './block-icon';
 export { FeedbackBar as __experimentalProductMVPCESFooter } from './feedback-bar';
 export { ProductMVPFeedbackModal as __experimentalProductMVPFeedbackModal } from './product-mvp-feedback-modal';
@@ -38,7 +38,7 @@ export * from './remove-confirmation-modal';

 export {
 	ManageDownloadLimitsModal as __experimentalManageDownloadLimitsModal,
-	ManageDownloadLimitsModalProps,
+	type ManageDownloadLimitsModalProps,
 } from './manage-download-limits-modal';

 export { Checkbox as __experimentalCheckboxControl } from './checkbox-control';
@@ -48,54 +48,54 @@ export * from './modal-editor-welcome-guide';

 export {
 	TextControl as __experimentalTextControl,
-	TextControlProps,
+	type TextControlProps,
 } from './text-control';

 export {
 	AddProductsModal as __experimentalAddProductsModal,
-	AddProductsModalProps,
+	type AddProductsModalProps,
 } from './add-products-modal';

 export {
 	BlockFill as __experimentalBlockFill,
 	BlockSlot as __experimentalBlockSlot,
 	SectionActions as __experimentalSectionActions,
-	BlockFillProps,
-	BlockSlotProps,
+	type BlockFillProps,
+	type BlockSlotProps,
 } from './block-slot-fill';

 export { Label as __experimentalLabel } from './label/label';
 export { ButtonWithDropdownMenu as __experimentalButtonWithDropdownMenu } from './button-with-dropdown-menu';
 export {
 	FormattedPrice as __experimentalFormattedPrice,
-	FormattedPriceProps,
+	type FormattedPriceProps,
 } from './formatted-price';

 export {
 	ProductList as __experimentalProductList,
-	ProductListProps,
+	type ProductListProps,
 } from './product-list';

 export {
 	ProductSelect as __experimentalProductSelect,
-	ProductSelectProps,
+	type ProductSelectProps,
 } from './product-select';

 export {
 	ProductImage as __experimentalProductImage,
-	ProductImageProps,
+	type ProductImageProps,
 } from './product-image';

 export { Notice as __experimentalNotice } from './notice';

 export {
 	SchedulePublishModal as __experimentalSchedulePublishModal,
-	SchedulePublishModalProps,
+	type SchedulePublishModalProps,
 } from './schedule-publish-modal';

 export {
 	CustomFields as __experimentalCustomFields,
-	CustomFieldsProps,
+	type CustomFieldsProps,
 } from './custom-fields';

 export { PluginSidebar as __experimentalModalBlockEditorPluginSidebar } from './iframe-editor';
diff --git a/packages/js/product-editor/src/components/product-select/product-select.tsx b/packages/js/product-editor/src/components/product-select/product-select.tsx
index a7d2618cb1e..8d76f4b9039 100644
--- a/packages/js/product-editor/src/components/product-select/product-select.tsx
+++ b/packages/js/product-editor/src/components/product-select/product-select.tsx
@@ -13,7 +13,10 @@ import clsx from 'clsx';
 import { FormattedPrice } from '../formatted-price';
 import { ProductImage } from '../product-image';
 import { ProductSelectProps } from './types';
-import { ComboboxControl, ComboboxControlOption } from '../combobox-control';
+import {
+	ComboboxControl,
+	type ComboboxControlOption,
+} from '../combobox-control';

 /**
  * Map the product item to the Combobox core option.
diff --git a/packages/js/remote-logging/build.mjs b/packages/js/remote-logging/build.mjs
new file mode 100644
index 00000000000..746bc61fc4b
--- /dev/null
+++ b/packages/js/remote-logging/build.mjs
@@ -0,0 +1,112 @@
+import { build, context } from 'esbuild';
+import { glob } from 'glob';
+import { rm } from 'node:fs/promises';
+import chokidar from 'chokidar';
+
+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 ) }` );
+}
diff --git a/packages/js/remote-logging/changelog/64838-dev-esbuild-package-builds b/packages/js/remote-logging/changelog/64838-dev-esbuild-package-builds
new file mode 100644
index 00000000000..53b9c7cd29c
--- /dev/null
+++ b/packages/js/remote-logging/changelog/64838-dev-esbuild-package-builds
@@ -0,0 +1,4 @@
+Significance: patch
+Type: dev
+
+Replaced wireit + tsc package build pipeline with a per-package esbuild script.
diff --git a/packages/js/remote-logging/package.json b/packages/js/remote-logging/package.json
index 549a2156a28..453032afc84 100644
--- a/packages/js/remote-logging/package.json
+++ b/packages/js/remote-logging/package.json
@@ -31,9 +31,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:esm": "wireit",
+		"build:project:esm": "node build.mjs",
 		"build:publish:project": "pnpm --if-present '/^build:publish:project:.*$/'",
-		"build:publish:project:cjs": "tsc --project tsconfig-cjs.json --noCheck",
+		"build:publish:project:cjs": "node build.mjs --cjs",
+		"build:publish:project:types": "tsc --build --emitDeclarationOnly",
 		"build:publish:project:deps": "pnpm build",
 		"changelog": "XDEBUG_MODE=off composer install --quiet && composer exec -- changelogger",
 		"lint": "pnpm --if-present '/^lint:lang:.*$/'",
@@ -46,7 +47,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:esm": "wireit"
+		"watch:build:project:esm": "node build.mjs --watch"
 	},
 	"lint-staged": {
 		"*.(t|j)s?(x)": [
@@ -69,14 +70,16 @@
 		"@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",
 		"rimraf": "5.0.5",
 		"ts-jest": "29.1.x",
-		"typescript": "5.7.x",
-		"wireit": "0.14.12"
+		"typescript": "5.7.x"
 	},
 	"publishConfig": {
 		"access": "public"
@@ -105,47 +108,5 @@
 				}
 			]
 		}
-	},
-	"wireit": {
-		"build:project:esm": {
-			"command": "tsc --project tsconfig.json --noCheck",
-			"clean": "if-file-deleted",
-			"files": [
-				"tsconfig.json",
-				"src/**/*.{js,jsx,ts,tsx}",
-				"typings/**/*.ts"
-			],
-			"output": [
-				"build-module",
-				"build-types",
-				"tsconfig.tsbuildinfo"
-			],
-			"dependencies": [
-				"dependencyOutputs"
-			]
-		},
-		"watch:build:project:esm": {
-			"command": "tsc --project tsconfig.json --noCheck --watch",
-			"service": true
-		},
-		"dependencyOutputs": {
-			"allowUsuallyExcludedPaths": true,
-			"files": [
-				"package.json",
-				"../../../pnpm-lock.yaml",
-				"node_modules/@woocommerce/tracks/build",
-				"node_modules/@woocommerce/tracks/build-types",
-				"node_modules/@woocommerce/eslint-plugin/configs",
-				"node_modules/@woocommerce/eslint-plugin/rules",
-				"node_modules/@woocommerce/eslint-plugin/index.js",
-				"node_modules/@woocommerce/internal-js-tests/build",
-				"node_modules/@woocommerce/internal-js-tests/build-module",
-				"node_modules/@woocommerce/internal-js-tests/jest-preset.js",
-				"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"
-			]
-		}
 	}
 }
diff --git a/packages/js/sanitize/build.mjs b/packages/js/sanitize/build.mjs
new file mode 100644
index 00000000000..746bc61fc4b
--- /dev/null
+++ b/packages/js/sanitize/build.mjs
@@ -0,0 +1,112 @@
+import { build, context } from 'esbuild';
+import { glob } from 'glob';
+import { rm } from 'node:fs/promises';
+import chokidar from 'chokidar';
+
+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 ) }` );
+}
diff --git a/packages/js/sanitize/changelog/64838-dev-esbuild-package-builds b/packages/js/sanitize/changelog/64838-dev-esbuild-package-builds
new file mode 100644
index 00000000000..53b9c7cd29c
--- /dev/null
+++ b/packages/js/sanitize/changelog/64838-dev-esbuild-package-builds
@@ -0,0 +1,4 @@
+Significance: patch
+Type: dev
+
+Replaced wireit + tsc package build pipeline with a per-package esbuild script.
diff --git a/packages/js/sanitize/package.json b/packages/js/sanitize/package.json
index dfd61ee8923..a93d13c35e6 100644
--- a/packages/js/sanitize/package.json
+++ b/packages/js/sanitize/package.json
@@ -41,14 +41,16 @@
 		"@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",
 		"rimraf": "5.0.5",
 		"ts-jest": "29.1.x",
-		"typescript": "5.7.x",
-		"wireit": "0.14.12"
+		"typescript": "5.7.x"
 	},
 	"peerDependencies": {
 		"@types/react": "18.3.x",
@@ -62,9 +64,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:esm": "wireit",
+		"build:project:esm": "node build.mjs",
 		"build:publish:project": "pnpm --if-present '/^build:publish:project:.*$/'",
-		"build:publish:project:cjs": "tsc --project tsconfig-cjs.json --noCheck",
+		"build:publish:project:cjs": "node build.mjs --cjs",
+		"build:publish:project:types": "tsc --build --emitDeclarationOnly",
 		"build:publish:project:deps": "pnpm build",
 		"changelog": "XDEBUG_MODE=off composer install --quiet && composer exec -- changelogger",
 		"lint": "pnpm --if-present '/^lint:lang:.*$/'",
@@ -77,7 +80,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:esm": "wireit"
+		"watch:build:project:esm": "node build.mjs --watch"
 	},
 	"lint-staged": {
 		"*.(t|j)s?(x)": [
@@ -107,45 +110,5 @@
 				}
 			]
 		}
-	},
-	"wireit": {
-		"build:project:esm": {
-			"command": "tsc --project tsconfig.json --noCheck",
-			"clean": "if-file-deleted",
-			"files": [
-				"tsconfig.json",
-				"src/**/*.{js,jsx,ts,tsx}",
-				"typings/**/*.ts"
-			],
-			"output": [
-				"build-module",
-				"build-types",
-				"tsconfig.tsbuildinfo"
-			],
-			"dependencies": [
-				"dependencyOutputs"
-			]
-		},
-		"watch:build:project:esm": {
-			"command": "tsc --project tsconfig.json --noCheck --watch",
-			"service": true
-		},
-		"dependencyOutputs": {
-			"allowUsuallyExcludedPaths": true,
-			"files": [
-				"package.json",
-				"../../../pnpm-lock.yaml",
-				"node_modules/@woocommerce/eslint-plugin/configs",
-				"node_modules/@woocommerce/eslint-plugin/rules",
-				"node_modules/@woocommerce/eslint-plugin/index.js",
-				"node_modules/@woocommerce/internal-js-tests/build",
-				"node_modules/@woocommerce/internal-js-tests/build-module",
-				"node_modules/@woocommerce/internal-js-tests/jest-preset.js",
-				"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"
-			]
-		}
 	}
 }
diff --git a/packages/js/sanitize/src/index.ts b/packages/js/sanitize/src/index.ts
index b62b4690c8c..4510a27d200 100644
--- a/packages/js/sanitize/src/index.ts
+++ b/packages/js/sanitize/src/index.ts
@@ -1,12 +1,12 @@
-export {
-	WooCommerceSanitizePolicyType,
-	getTrustedTypesPolicy,
-} from './trusted-types-policy';
+export { getTrustedTypesPolicy } from './trusted-types-policy';
+export type { WooCommerceSanitizePolicyType } from './trusted-types-policy';
 export {
 	DEFAULT_ALLOWED_TAGS,
 	DEFAULT_ALLOWED_ATTR,
+	sanitizeHTML,
+} from './sanitize';
+export type {
 	SanitizeReturnKind,
 	SanitizeReturnType,
 	SanitizeConfig,
-	sanitizeHTML,
 } from './sanitize';
diff --git a/packages/js/settings-editor/changelog/64838-dev-esbuild-package-builds b/packages/js/settings-editor/changelog/64838-dev-esbuild-package-builds
new file mode 100644
index 00000000000..53b9c7cd29c
--- /dev/null
+++ b/packages/js/settings-editor/changelog/64838-dev-esbuild-package-builds
@@ -0,0 +1,4 @@
+Significance: patch
+Type: dev
+
+Replaced wireit + tsc package build pipeline with a per-package esbuild script.
diff --git a/packages/js/settings-editor/changelog/dev-64837-type-check-only-on-lint b/packages/js/settings-editor/changelog/dev-64837-type-check-only-on-lint
deleted file mode 100644
index efdb3bd771a..00000000000
--- a/packages/js/settings-editor/changelog/dev-64837-type-check-only-on-lint
+++ /dev/null
@@ -1,4 +0,0 @@
-Significance: patch
-Type: dev
-
-Move TypeScript type-checking from the build to a new `lint:lang:types` script. Builds now emit types and JS without type-checking.
diff --git a/packages/js/tracks/build.mjs b/packages/js/tracks/build.mjs
new file mode 100644
index 00000000000..746bc61fc4b
--- /dev/null
+++ b/packages/js/tracks/build.mjs
@@ -0,0 +1,112 @@
+import { build, context } from 'esbuild';
+import { glob } from 'glob';
+import { rm } from 'node:fs/promises';
+import chokidar from 'chokidar';
+
+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 ) }` );
+}
diff --git a/packages/js/tracks/changelog/64838-dev-esbuild-package-builds b/packages/js/tracks/changelog/64838-dev-esbuild-package-builds
new file mode 100644
index 00000000000..53b9c7cd29c
--- /dev/null
+++ b/packages/js/tracks/changelog/64838-dev-esbuild-package-builds
@@ -0,0 +1,4 @@
+Significance: patch
+Type: dev
+
+Replaced wireit + tsc package build pipeline with a per-package esbuild script.
diff --git a/packages/js/tracks/package.json b/packages/js/tracks/package.json
index df513ed5ab0..c4910f1bb6a 100644
--- a/packages/js/tracks/package.json
+++ b/packages/js/tracks/package.json
@@ -38,9 +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:esm": "wireit",
+		"build:project:esm": "node build.mjs",
 		"build:publish:project": "pnpm --if-present '/^build:publish:project:.*$/'",
-		"build:publish:project:cjs": "tsc --project tsconfig-cjs.json --noCheck",
+		"build:publish:project:cjs": "node build.mjs --cjs",
+		"build:publish:project:types": "tsc --build --emitDeclarationOnly",
 		"build:publish:project:deps": "pnpm build",
 		"changelog": "XDEBUG_MODE=off composer install --quiet && composer exec -- changelogger",
 		"lint": "pnpm --if-present '/^lint:lang:.*$/'",
@@ -53,24 +54,26 @@
 		"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:esm": "wireit"
+		"watch:build:project:esm": "node build.mjs --watch"
 	},
 	"devDependencies": {
 		"@babel/core": "7.25.7",
 		"@types/debug": "^4.1.12",
-		"@types/node": "^24.1.0",
 		"@types/jest": "29.5.x",
+		"@types/node": "^24.1.0",
 		"@woocommerce/eslint-plugin": "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",
 		"rimraf": "5.0.5",
 		"ts-jest": "29.1.x",
-		"typescript": "5.7.x",
-		"wireit": "0.14.12"
+		"typescript": "5.7.x"
 	},
 	"lint-staged": {
 		"*.(t|j)s?(x)": [
@@ -84,45 +87,5 @@
 				"changes": "src/**/*.{js,jsx,ts,tsx}"
 			}
 		}
-	},
-	"wireit": {
-		"build:project:esm": {
-			"command": "tsc --project tsconfig.json --noCheck",
-			"clean": "if-file-deleted",
-			"files": [
-				"tsconfig.json",
-				"src/**/*.{js,jsx,ts,tsx}",
-				"typings/**/*.ts"
-			],
-			"output": [
-				"build-module",
-				"build-types",
-				"tsconfig.tsbuildinfo"
-			],
-			"dependencies": [
-				"dependencyOutputs"
-			]
-		},
-		"watch:build:project:esm": {
-			"command": "tsc --project tsconfig.json --noCheck --watch",
-			"service": true
-		},
-		"dependencyOutputs": {
-			"allowUsuallyExcludedPaths": true,
-			"files": [
-				"package.json",
-				"../../../pnpm-lock.yaml",
-				"node_modules/@woocommerce/eslint-plugin/configs",
-				"node_modules/@woocommerce/eslint-plugin/rules",
-				"node_modules/@woocommerce/eslint-plugin/index.js",
-				"node_modules/@woocommerce/internal-js-tests/build",
-				"node_modules/@woocommerce/internal-js-tests/build-module",
-				"node_modules/@woocommerce/internal-js-tests/jest-preset.js",
-				"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"
-			]
-		}
 	}
 }
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index f5574520aed..5cc028611f7 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -208,7 +208,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(@swc/core@1.15.24))
+        version: 9.2.1(@babel/core@7.25.7)(webpack@5.97.1)
       chalk:
         specifier: ^4.1.2
         version: 4.1.2
@@ -220,7 +220,7 @@ importers:
         version: 3.49.0
       css-loader:
         specifier: 6.11.x
-        version: 6.11.0(webpack@5.97.1(@swc/core@1.15.24))
+        version: 6.11.0(webpack@5.97.1)
       glob:
         specifier: ^10.3.10
         version: 10.5.0
@@ -244,7 +244,7 @@ importers:
         version: 1.15.0
       postcss-loader:
         specifier: 4.3.x
-        version: 4.3.0(postcss@8.5.9)(webpack@5.97.1)
+        version: 4.3.0(postcss@8.5.9)(webpack@5.97.1(@swc/core@1.15.24))
       prettier:
         specifier: npm:wp-prettier@^2.8.5
         version: wp-prettier@2.8.5
@@ -271,7 +271,7 @@ importers:
         version: 5.7.3
       webpack:
         specifier: 5.97.x
-        version: 5.97.1(@swc/core@1.15.24)(webpack-cli@5.1.4)
+        version: 5.97.1(@swc/core@1.15.24)

   packages/js/admin-layout:
     dependencies:
@@ -300,12 +300,21 @@ 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(@swc/core@1.15.24))
+        version: 6.11.0(webpack@5.97.1)
+      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))
@@ -329,19 +338,16 @@ importers:
         version: 10.5.2(sass@1.69.5)(webpack@5.97.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))(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)
+        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)(webpack-cli@5.1.4)
+        version: 5.97.1(@swc/core@1.15.24)(esbuild@0.24.2)(webpack-cli@5.1.4)
       webpack-cli:
         specifier: 5.1.x
         version: 5.1.4(webpack@5.97.1)
-      wireit:
-        specifier: 0.14.12
-        version: 0.14.12

   packages/js/block-templates:
     dependencies:
@@ -409,15 +415,24 @@ importers:
       '@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)
       css-loader:
         specifier: 6.11.x
-        version: 6.11.0(webpack@5.97.1(@swc/core@1.15.24))
+        version: 6.11.0(webpack@5.97.1)
+      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))
@@ -447,19 +462,16 @@ importers:
         version: 10.5.2(sass@1.69.5)(webpack@5.97.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))(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)
+        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)(webpack-cli@5.1.4)
+        version: 5.97.1(@swc/core@1.15.24)(esbuild@0.24.2)(webpack-cli@5.1.4)
       webpack-cli:
         specifier: 5.1.x
         version: 5.1.4(webpack@5.97.1)
-      wireit:
-        specifier: 0.14.12
-        version: 0.14.12

   packages/js/components:
     dependencies:
@@ -522,7 +534,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)
@@ -664,7 +676,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)(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)(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)
       '@testing-library/dom':
         specifier: 8.11.3
         version: 8.11.3
@@ -716,12 +728,21 @@ 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(@swc/core@1.15.24))
+        version: 6.11.0(webpack@5.97.1)
+      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))
@@ -754,7 +775,7 @@ importers:
         version: 10.5.2(sass@1.69.5)(webpack@5.97.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))(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)
+        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
@@ -763,25 +784,14 @@ importers:
         version: 9.0.1
       webpack:
         specifier: 5.97.x
-        version: 5.97.1(@swc/core@1.15.24)(webpack-cli@5.1.4)
+        version: 5.97.1(@swc/core@1.15.24)(esbuild@0.24.2)(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)
-      wireit:
-        specifier: 0.14.12
-        version: 0.14.12

-  packages/js/create-product-editor-block:
-    devDependencies:
-      wireit:
-        specifier: 0.14.12
-        version: 0.14.12
+  packages/js/create-product-editor-block: {}

-  packages/js/create-woo-extension:
-    devDependencies:
-      wireit:
-        specifier: 0.14.12
-        version: 0.14.12
+  packages/js/create-woo-extension: {}

   packages/js/csv-export:
     dependencies:
@@ -807,9 +817,18 @@ importers:
       '@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))
@@ -824,13 +843,10 @@ 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))(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)
+        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
-      wireit:
-        specifier: 0.14.12
-        version: 0.14.12

   packages/js/currency:
     dependencies:
@@ -871,9 +887,18 @@ importers:
       '@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))
@@ -888,13 +913,10 @@ 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))(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)
+        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
-      wireit:
-        specifier: 0.14.12
-        version: 0.14.12

   packages/js/customer-effort-score:
     dependencies:
@@ -977,12 +999,21 @@ 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(@swc/core@1.15.24))
+        version: 6.11.0(webpack@5.97.1)
+      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))
@@ -1006,19 +1037,16 @@ importers:
         version: 10.5.2(sass@1.69.5)(webpack@5.97.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))(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)
+        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)(webpack-cli@5.1.4)
+        version: 5.97.1(@swc/core@1.15.24)(esbuild@0.24.2)(webpack-cli@5.1.4)
       webpack-cli:
         specifier: 5.1.x
         version: 5.1.4(webpack@5.97.1)
-      wireit:
-        specifier: 0.14.12
-        version: 0.14.12

   packages/js/data:
     dependencies:
@@ -1119,9 +1147,18 @@ importers:
       '@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))
@@ -1139,13 +1176,10 @@ 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))(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)
+        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
-      wireit:
-        specifier: 0.14.12
-        version: 0.14.12

   packages/js/date:
     dependencies:
@@ -1195,12 +1229,21 @@ importers:
       '@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))
@@ -1215,13 +1258,10 @@ 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))(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)
+        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
-      wireit:
-        specifier: 0.14.12
-        version: 0.14.12

   packages/js/dependency-extraction-webpack-plugin:
     dependencies:
@@ -1249,7 +1289,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))(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)
+        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
@@ -1259,9 +1299,6 @@ importers:
       webpack-cli:
         specifier: 5.1.x
         version: 5.1.4(webpack@5.97.1)
-      wireit:
-        specifier: 0.14.12
-        version: 0.14.12

   packages/js/e2e-utils-playwright:
     dependencies:
@@ -1290,9 +1327,18 @@ importers:
       '@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))
@@ -1301,13 +1347,10 @@ 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))(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)
+        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
-      wireit:
-        specifier: 0.14.12
-        version: 0.14.12

   packages/js/email-editor:
     dependencies:
@@ -1486,9 +1529,18 @@ 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))
@@ -1509,7 +1561,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))(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)
+        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)
       ts-loader:
         specifier: 9.5.x
         version: 9.5.7(typescript@5.7.3)(webpack@5.97.1)
@@ -1518,13 +1570,10 @@ importers:
         version: 5.7.3
       webpack:
         specifier: 5.97.x
-        version: 5.97.1(@swc/core@1.15.24)(webpack-cli@5.1.4)
+        version: 5.97.1(@swc/core@1.15.24)(esbuild@0.24.2)(webpack-cli@5.1.4)
       webpack-cli:
         specifier: 5.1.x
         version: 5.1.4(webpack@5.97.1)
-      wireit:
-        specifier: 0.14.12
-        version: 0.14.12

   packages/js/eslint-plugin:
     dependencies:
@@ -1564,13 +1613,10 @@ 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))(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)
+        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
-      wireit:
-        specifier: 0.14.12
-        version: 0.14.12

   packages/js/experimental:
     dependencies:
@@ -1631,7 +1677,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)(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)(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)
       '@testing-library/dom':
         specifier: 8.11.3
         version: 8.11.3
@@ -1665,12 +1711,21 @@ 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(@swc/core@1.15.24))
+        version: 6.11.0(webpack@5.97.1)
+      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))
@@ -1694,19 +1749,16 @@ importers:
         version: 10.5.2(sass@1.69.5)(webpack@5.97.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))(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)
+        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)(webpack-cli@5.1.4)
+        version: 5.97.1(@swc/core@1.15.24)(esbuild@0.24.2)(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)
-      wireit:
-        specifier: 0.14.12
-        version: 0.14.12

   packages/js/experimental-products-app:
     dependencies:
@@ -1834,12 +1886,21 @@ importers:
       '@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(@swc/core@1.15.24))
+        version: 6.11.0(webpack@5.97.1)
+      esbuild:
+        specifier: ^0.24.0
+        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))
@@ -1863,22 +1924,19 @@ importers:
         version: 10.5.2(sass@1.69.5)(webpack@5.97.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))(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)
+        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)(webpack-cli@5.1.4)
+        version: 5.97.1(@swc/core@1.15.24)(esbuild@0.24.2)(webpack-cli@5.1.4)
       webpack-cli:
         specifier: 5.1.x
         version: 5.1.4(webpack@5.97.1)
       webpack-remove-empty-scripts:
         specifier: 1.0.x
-        version: 1.0.4(webpack@5.97.1(@swc/core@1.15.24))
-      wireit:
-        specifier: 0.14.12
-        version: 0.14.12
+        version: 1.0.4(webpack@5.97.1)

   packages/js/explat:
     dependencies:
@@ -1928,9 +1986,18 @@ importers:
       '@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))
@@ -1945,13 +2012,10 @@ 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))(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)
+        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
-      wireit:
-        specifier: 0.14.12
-        version: 0.14.12

   packages/js/expression-evaluation:
     dependencies:
@@ -1977,9 +2041,18 @@ importers:
       '@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))
@@ -1994,19 +2067,12 @@ 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))(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)
+        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
-      wireit:
-        specifier: 0.14.12
-        version: 0.14.12

-  packages/js/extend-cart-checkout-block:
-    devDependencies:
-      wireit:
-        specifier: 0.14.12
-        version: 0.14.12
+  packages/js/extend-cart-checkout-block: {}

   packages/js/integrate-plugin:
     dependencies:
@@ -2071,15 +2137,24 @@ importers:
       '@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)
       css-loader:
         specifier: 6.11.x
-        version: 6.11.0(webpack@5.97.1(@swc/core@1.15.24))
+        version: 6.11.0(webpack@5.97.1)
+      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))
@@ -2091,19 +2166,16 @@ importers:
         version: 29.5.0
       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))(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)
+        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)(webpack-cli@5.1.4)
+        version: 5.97.1(@swc/core@1.15.24)(esbuild@0.24.2)(webpack-cli@5.1.4)
       webpack-cli:
         specifier: 5.1.x
         version: 5.1.4(webpack@5.97.1)
-      wireit:
-        specifier: 0.14.12
-        version: 0.14.12

   packages/js/internal-js-tests:
     dependencies:
@@ -2144,9 +2216,18 @@ importers:
       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))
@@ -2167,13 +2248,10 @@ 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))(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))(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
-      wireit:
-        specifier: 0.14.12
-        version: 0.14.12

   packages/js/internal-style-build:
     dependencies:
@@ -2200,7 +2278,7 @@ importers:
         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)
+        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
@@ -2231,25 +2309,19 @@ 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))(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)
+        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)(webpack-cli@5.1.4)
-      wireit:
-        specifier: 0.14.12
-        version: 0.14.12
+        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)
-      '@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)
@@ -2262,15 +2334,9 @@ importers:
       '@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
-      wireit:
-        specifier: 0.14.12
-        version: 0.14.12

   packages/js/navigation:
     dependencies:
@@ -2332,9 +2398,18 @@ importers:
       '@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))
@@ -2349,13 +2424,10 @@ 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))(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)
+        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
-      wireit:
-        specifier: 0.14.12
-        version: 0.14.12

   packages/js/notices:
     dependencies:
@@ -2393,9 +2465,18 @@ importers:
       '@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))
@@ -2410,13 +2491,10 @@ 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))(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)
+        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
-      wireit:
-        specifier: 0.14.12
-        version: 0.14.12

   packages/js/number:
     dependencies:
@@ -2445,9 +2523,18 @@ importers:
       '@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))
@@ -2462,13 +2549,10 @@ 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))(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)
+        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
-      wireit:
-        specifier: 0.14.12
-        version: 0.14.12

   packages/js/onboarding:
     dependencies:
@@ -2539,12 +2623,21 @@ 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(@swc/core@1.15.24))
+        version: 6.11.0(webpack@5.97.1)
+      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))
@@ -2568,19 +2661,16 @@ importers:
         version: 10.5.2(sass@1.69.5)(webpack@5.97.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))(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)
+        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)(webpack-cli@5.1.4)
+        version: 5.97.1(@swc/core@1.15.24)(esbuild@0.24.2)(webpack-cli@5.1.4)
       webpack-cli:
         specifier: 5.1.x
         version: 5.1.4(webpack@5.97.1)
-      wireit:
-        specifier: 0.14.12
-        version: 0.14.12

   packages/js/product-editor:
     dependencies:
@@ -2667,7 +2757,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(@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)(stylelint@16.26.1(typescript@5.7.3))
       '@wordpress/element':
         specifier: catalog:wp-min
         version: 6.19.1
@@ -2777,15 +2867,24 @@ importers:
       '@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)
       css-loader:
         specifier: 6.11.x
-        version: 6.11.0(webpack@5.97.1(@swc/core@1.15.24))
+        version: 6.11.0(webpack@5.97.1)
+      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))
@@ -2797,7 +2896,7 @@ importers:
         version: 29.5.0
       mini-css-extract-plugin:
         specifier: 2.9.x
-        version: 2.9.4(webpack@5.97.1(@swc/core@1.15.24))
+        version: 2.9.4(webpack@5.97.1)
       postcss:
         specifier: 8.4.x
         version: 8.4.49
@@ -2821,22 +2920,19 @@ importers:
         version: 10.5.2(sass@1.69.5)(webpack@5.97.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))(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)
+        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)(webpack-cli@5.1.4)
+        version: 5.97.1(@swc/core@1.15.24)(esbuild@0.24.2)(webpack-cli@5.1.4)
       webpack-cli:
         specifier: 5.1.x
         version: 5.1.4(webpack@5.97.1)
       webpack-remove-empty-scripts:
         specifier: 1.0.x
-        version: 1.0.4(webpack@5.97.1(@swc/core@1.15.24))
-      wireit:
-        specifier: 0.14.12
-        version: 0.14.12
+        version: 1.0.4(webpack@5.97.1)

   packages/js/remote-logging:
     dependencies:
@@ -2877,9 +2973,18 @@ importers:
       '@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))
@@ -2894,13 +2999,10 @@ 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))(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)
+        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
-      wireit:
-        specifier: 0.14.12
-        version: 0.14.12

   packages/js/sanitize:
     dependencies:
@@ -2943,10 +3045,19 @@ importers:
         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)(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)
+        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
       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))
@@ -2961,13 +3072,10 @@ 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))(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)
+        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
-      wireit:
-        specifier: 0.14.12
-        version: 0.14.12

   packages/js/tracks:
     dependencies:
@@ -2996,9 +3104,18 @@ importers:
       '@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))
@@ -3013,13 +3130,10 @@ 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))(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)
+        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
-      wireit:
-        specifier: 0.14.12
-        version: 0.14.12

   packages/php/blueprint:
     devDependencies:
@@ -3080,7 +3194,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(@swc/core@1.15.24))
+        version: 9.2.1(@babel/core@7.25.7)(webpack@5.97.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))
@@ -3719,7 +3833,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(@swc/core@1.15.24))
+        version: 9.2.1(@babel/core@7.25.7)(webpack@5.97.1)
       babel-plugin-transform-react-remove-prop-types:
         specifier: 0.4.24
         version: 0.4.24
@@ -3737,7 +3851,7 @@ importers:
         version: 13.0.1(webpack@5.97.1)
       css-loader:
         specifier: 6.11.x
-        version: 6.11.0(webpack@5.97.1(@swc/core@1.15.24))
+        version: 6.11.0(webpack@5.97.1)
       eslint:
         specifier: ^8.55.0
         version: 8.57.1
@@ -3773,7 +3887,7 @@ importers:
         version: 2.0.0
       mini-css-extract-plugin:
         specifier: 2.9.x
-        version: 2.9.4(webpack@5.97.1(@swc/core@1.15.24))
+        version: 2.9.4(webpack@5.97.1)
       moment:
         specifier: ^2.29.4
         version: 2.30.1
@@ -3833,7 +3947,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.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)
+        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
@@ -4284,7 +4398,7 @@ importers:
         version: 3.25.0
       css-loader:
         specifier: 6.11.x
-        version: 6.11.0(webpack@5.97.1(@swc/core@1.15.24))
+        version: 6.11.0(webpack@5.97.1)
       cssnano:
         specifier: 5.1.12
         version: 5.1.12(postcss@8.4.49)
@@ -4362,7 +4476,7 @@ importers:
         version: 13.0.1
       mini-css-extract-plugin:
         specifier: 2.9.x
-        version: 2.9.4(webpack@5.97.1(@swc/core@1.15.24))
+        version: 2.9.4(webpack@5.97.1)
       msw:
         specifier: 2.10.4
         version: 2.10.4(@types/node@24.12.2)(typescript@5.7.3)
@@ -4987,7 +5101,7 @@ importers:
         version: 5.7.3
       webpack:
         specifier: 5.97.x
-        version: 5.97.1(@swc/core@1.15.24)(webpack-cli@5.1.4)
+        version: 5.97.1(@swc/core@1.15.24)
       wireit:
         specifier: 0.14.12
         version: 0.14.12
@@ -6220,138 +6334,288 @@ packages:
     resolution: {integrity: sha512-922xqFsTpHs6D0BUiG4toiyPOMc8/jafnWKxz1KWgS4XzKPy2qXf1Pe6UFuNSCQqt6tOuhAWXBNuuyUhJmw9Vg==}
     engines: {node: ^14 || ^16 || ^17 || ^18 || ^19}

+  '@esbuild/aix-ppc64@0.24.2':
+    resolution: {integrity: sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==}
+    engines: {node: '>=18'}
+    cpu: [ppc64]
+    os: [aix]
+
   '@esbuild/android-arm64@0.18.20':
     resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==}
     engines: {node: '>=12'}
     cpu: [arm64]
     os: [android]

+  '@esbuild/android-arm64@0.24.2':
+    resolution: {integrity: sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==}
+    engines: {node: '>=18'}
+    cpu: [arm64]
+    os: [android]
+
   '@esbuild/android-arm@0.18.20':
     resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==}
     engines: {node: '>=12'}
     cpu: [arm]
     os: [android]

+  '@esbuild/android-arm@0.24.2':
+    resolution: {integrity: sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==}
+    engines: {node: '>=18'}
+    cpu: [arm]
+    os: [android]
+
   '@esbuild/android-x64@0.18.20':
     resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==}
     engines: {node: '>=12'}
     cpu: [x64]
     os: [android]

+  '@esbuild/android-x64@0.24.2':
+    resolution: {integrity: sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==}
+    engines: {node: '>=18'}
+    cpu: [x64]
+    os: [android]
+
   '@esbuild/darwin-arm64@0.18.20':
     resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==}
     engines: {node: '>=12'}
     cpu: [arm64]
     os: [darwin]

+  '@esbuild/darwin-arm64@0.24.2':
+    resolution: {integrity: sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==}
+    engines: {node: '>=18'}
+    cpu: [arm64]
+    os: [darwin]
+
   '@esbuild/darwin-x64@0.18.20':
     resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==}
     engines: {node: '>=12'}
     cpu: [x64]
     os: [darwin]

+  '@esbuild/darwin-x64@0.24.2':
+    resolution: {integrity: sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==}
+    engines: {node: '>=18'}
+    cpu: [x64]
+    os: [darwin]
+
   '@esbuild/freebsd-arm64@0.18.20':
     resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==}
     engines: {node: '>=12'}
     cpu: [arm64]
     os: [freebsd]

+  '@esbuild/freebsd-arm64@0.24.2':
+    resolution: {integrity: sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==}
+    engines: {node: '>=18'}
+    cpu: [arm64]
+    os: [freebsd]
+
   '@esbuild/freebsd-x64@0.18.20':
     resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==}
     engines: {node: '>=12'}
     cpu: [x64]
     os: [freebsd]

+  '@esbuild/freebsd-x64@0.24.2':
+    resolution: {integrity: sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==}
+    engines: {node: '>=18'}
+    cpu: [x64]
+    os: [freebsd]
+
   '@esbuild/linux-arm64@0.18.20':
     resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==}
     engines: {node: '>=12'}
     cpu: [arm64]
     os: [linux]

+  '@esbuild/linux-arm64@0.24.2':
+    resolution: {integrity: sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==}
+    engines: {node: '>=18'}
+    cpu: [arm64]
+    os: [linux]
+
   '@esbuild/linux-arm@0.18.20':
     resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==}
     engines: {node: '>=12'}
     cpu: [arm]
     os: [linux]

+  '@esbuild/linux-arm@0.24.2':
+    resolution: {integrity: sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==}
+    engines: {node: '>=18'}
+    cpu: [arm]
+    os: [linux]
+
   '@esbuild/linux-ia32@0.18.20':
     resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==}
     engines: {node: '>=12'}
     cpu: [ia32]
     os: [linux]

+  '@esbuild/linux-ia32@0.24.2':
+    resolution: {integrity: sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==}
+    engines: {node: '>=18'}
+    cpu: [ia32]
+    os: [linux]
+
   '@esbuild/linux-loong64@0.18.20':
     resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==}
     engines: {node: '>=12'}
     cpu: [loong64]
     os: [linux]

+  '@esbuild/linux-loong64@0.24.2':
+    resolution: {integrity: sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==}
+    engines: {node: '>=18'}
+    cpu: [loong64]
+    os: [linux]
+
   '@esbuild/linux-mips64el@0.18.20':
     resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==}
     engines: {node: '>=12'}
     cpu: [mips64el]
     os: [linux]

+  '@esbuild/linux-mips64el@0.24.2':
+    resolution: {integrity: sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==}
+    engines: {node: '>=18'}
+    cpu: [mips64el]
+    os: [linux]
+
   '@esbuild/linux-ppc64@0.18.20':
     resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==}
     engines: {node: '>=12'}
     cpu: [ppc64]
     os: [linux]

+  '@esbuild/linux-ppc64@0.24.2':
+    resolution: {integrity: sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==}
+    engines: {node: '>=18'}
+    cpu: [ppc64]
+    os: [linux]
+
   '@esbuild/linux-riscv64@0.18.20':
     resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==}
     engines: {node: '>=12'}
     cpu: [riscv64]
     os: [linux]

+  '@esbuild/linux-riscv64@0.24.2':
+    resolution: {integrity: sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==}
+    engines: {node: '>=18'}
+    cpu: [riscv64]
+    os: [linux]
+
   '@esbuild/linux-s390x@0.18.20':
     resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==}
     engines: {node: '>=12'}
     cpu: [s390x]
     os: [linux]

+  '@esbuild/linux-s390x@0.24.2':
+    resolution: {integrity: sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==}
+    engines: {node: '>=18'}
+    cpu: [s390x]
+    os: [linux]
+
   '@esbuild/linux-x64@0.18.20':
     resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==}
     engines: {node: '>=12'}
     cpu: [x64]
     os: [linux]

+  '@esbuild/linux-x64@0.24.2':
+    resolution: {integrity: sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==}
+    engines: {node: '>=18'}
+    cpu: [x64]
+    os: [linux]
+
+  '@esbuild/netbsd-arm64@0.24.2':
+    resolution: {integrity: sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==}
+    engines: {node: '>=18'}
+    cpu: [arm64]
+    os: [netbsd]
+
   '@esbuild/netbsd-x64@0.18.20':
     resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==}
     engines: {node: '>=12'}
     cpu: [x64]
     os: [netbsd]

+  '@esbuild/netbsd-x64@0.24.2':
+    resolution: {integrity: sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==}
+    engines: {node: '>=18'}
+    cpu: [x64]
+    os: [netbsd]
+
+  '@esbuild/openbsd-arm64@0.24.2':
+    resolution: {integrity: sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==}
+    engines: {node: '>=18'}
+    cpu: [arm64]
+    os: [openbsd]
+
   '@esbuild/openbsd-x64@0.18.20':
     resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==}
     engines: {node: '>=12'}
     cpu: [x64]
     os: [openbsd]

+  '@esbuild/openbsd-x64@0.24.2':
+    resolution: {integrity: sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==}
+    engines: {node: '>=18'}
+    cpu: [x64]
+    os: [openbsd]
+
   '@esbuild/sunos-x64@0.18.20':
     resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==}
     engines: {node: '>=12'}
     cpu: [x64]
     os: [sunos]

+  '@esbuild/sunos-x64@0.24.2':
+    resolution: {integrity: sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==}
+    engines: {node: '>=18'}
+    cpu: [x64]
+    os: [sunos]
+
   '@esbuild/win32-arm64@0.18.20':
     resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==}
     engines: {node: '>=12'}
     cpu: [arm64]
     os: [win32]

+  '@esbuild/win32-arm64@0.24.2':
+    resolution: {integrity: sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==}
+    engines: {node: '>=18'}
+    cpu: [arm64]
+    os: [win32]
+
   '@esbuild/win32-ia32@0.18.20':
     resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==}
     engines: {node: '>=12'}
     cpu: [ia32]
     os: [win32]

+  '@esbuild/win32-ia32@0.24.2':
+    resolution: {integrity: sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==}
+    engines: {node: '>=18'}
+    cpu: [ia32]
+    os: [win32]
+
   '@esbuild/win32-x64@0.18.20':
     resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==}
     engines: {node: '>=12'}
     cpu: [x64]
     os: [win32]

+  '@esbuild/win32-x64@0.24.2':
+    resolution: {integrity: sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==}
+    engines: {node: '>=18'}
+    cpu: [x64]
+    os: [win32]
+
   '@eslint-community/eslint-utils@4.9.1':
     resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==}
     engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
@@ -14978,6 +15242,11 @@ packages:
     engines: {node: '>=12'}
     hasBin: true

+  esbuild@0.24.2:
+    resolution: {integrity: sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==}
+    engines: {node: '>=18'}
+    hasBin: true
+
   escalade@3.2.0:
     resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==}
     engines: {node: '>=6'}
@@ -26124,72 +26393,147 @@ snapshots:
       esquery: 1.7.0
       jsdoc-type-pratt-parser: 3.1.0

+  '@esbuild/aix-ppc64@0.24.2':
+    optional: true
+
   '@esbuild/android-arm64@0.18.20':
     optional: true

+  '@esbuild/android-arm64@0.24.2':
+    optional: true
+
   '@esbuild/android-arm@0.18.20':
     optional: true

+  '@esbuild/android-arm@0.24.2':
+    optional: true
+
   '@esbuild/android-x64@0.18.20':
     optional: true

+  '@esbuild/android-x64@0.24.2':
+    optional: true
+
   '@esbuild/darwin-arm64@0.18.20':
     optional: true

+  '@esbuild/darwin-arm64@0.24.2':
+    optional: true
+
   '@esbuild/darwin-x64@0.18.20':
     optional: true

+  '@esbuild/darwin-x64@0.24.2':
+    optional: true
+
   '@esbuild/freebsd-arm64@0.18.20':
     optional: true

+  '@esbuild/freebsd-arm64@0.24.2':
+    optional: true
+
   '@esbuild/freebsd-x64@0.18.20':
     optional: true

+  '@esbuild/freebsd-x64@0.24.2':
+    optional: true
+
   '@esbuild/linux-arm64@0.18.20':
     optional: true

+  '@esbuild/linux-arm64@0.24.2':
+    optional: true
+
   '@esbuild/linux-arm@0.18.20':
     optional: true

+  '@esbuild/linux-arm@0.24.2':
+    optional: true
+
   '@esbuild/linux-ia32@0.18.20':
     optional: true

+  '@esbuild/linux-ia32@0.24.2':
+    optional: true
+
   '@esbuild/linux-loong64@0.18.20':
     optional: true

+  '@esbuild/linux-loong64@0.24.2':
+    optional: true
+
   '@esbuild/linux-mips64el@0.18.20':
     optional: true

+  '@esbuild/linux-mips64el@0.24.2':
+    optional: true
+
   '@esbuild/linux-ppc64@0.18.20':
     optional: true

+  '@esbuild/linux-ppc64@0.24.2':
+    optional: true
+
   '@esbuild/linux-riscv64@0.18.20':
     optional: true

+  '@esbuild/linux-riscv64@0.24.2':
+    optional: true
+
   '@esbuild/linux-s390x@0.18.20':
     optional: true

+  '@esbuild/linux-s390x@0.24.2':
+    optional: true
+
   '@esbuild/linux-x64@0.18.20':
     optional: true

+  '@esbuild/linux-x64@0.24.2':
+    optional: true
+
+  '@esbuild/netbsd-arm64@0.24.2':
+    optional: true
+
   '@esbuild/netbsd-x64@0.18.20':
     optional: true

+  '@esbuild/netbsd-x64@0.24.2':
+    optional: true
+
+  '@esbuild/openbsd-arm64@0.24.2':
+    optional: true
+
   '@esbuild/openbsd-x64@0.18.20':
     optional: true

+  '@esbuild/openbsd-x64@0.24.2':
+    optional: true
+
   '@esbuild/sunos-x64@0.18.20':
     optional: true

+  '@esbuild/sunos-x64@0.24.2':
+    optional: true
+
   '@esbuild/win32-arm64@0.18.20':
     optional: true

+  '@esbuild/win32-arm64@0.24.2':
+    optional: true
+
   '@esbuild/win32-ia32@0.18.20':
     optional: true

+  '@esbuild/win32-ia32@0.24.2':
+    optional: true
+
   '@esbuild/win32-x64@0.18.20':
     optional: true

+  '@esbuild/win32-x64@0.24.2':
+    optional: true
+
   '@eslint-community/eslint-utils@4.9.1(eslint@7.32.0)':
     dependencies:
       eslint: 7.32.0
@@ -28082,13 +28426,30 @@ 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)(webpack-cli@5.1.4)
+      webpack: 5.97.1(@swc/core@1.15.24)(esbuild@0.24.2)(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
@@ -29605,12 +29966,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(@swc/core@1.15.24))
+      babel-loader: 9.2.1(@babel/core@7.25.7)(webpack@5.97.1)
       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(@swc/core@1.15.24))
+      css-loader: 6.11.0(webpack@5.97.1)
       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)
@@ -29678,7 +30039,7 @@ snapshots:
       url: 0.11.4
       util: 0.12.5
       util-deprecate: 1.0.2
-      webpack: 5.97.1(@swc/core@1.15.24)(webpack-cli@5.1.4)
+      webpack: 5.97.1(@swc/core@1.15.24)
       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
@@ -29959,7 +30320,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)(webpack-cli@5.1.4)
+      webpack: 5.97.1(@swc/core@1.15.24)(esbuild@0.24.2)(webpack-cli@5.1.4)
     optionalDependencies:
       typescript: 5.7.3

@@ -30239,7 +30600,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)(webpack-cli@5.1.4)
+      webpack: 5.97.1(@swc/core@1.15.24)(esbuild@0.24.2)(webpack-cli@5.1.4)
     optionalDependencies:
       typescript: 5.7.3
     transitivePeerDependencies:
@@ -30541,7 +30902,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-hot-middleware@2.26.1)(webpack@5.97.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))
       '@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
@@ -30557,7 +30918,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-cli@5.1.4)
+      webpack: 5.97.1(@swc/core@1.15.24)
     optionalDependencies:
       '@babel/core': 7.25.7
       typescript: 5.7.3
@@ -30659,7 +31020,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-cli@5.1.4)
+      webpack: 5.97.1(@swc/core@1.15.24)
     transitivePeerDependencies:
       - supports-color

@@ -30687,7 +31048,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-cli@5.1.4)
+      webpack: 5.97.1(@swc/core@1.15.24)(esbuild@0.24.2)(webpack-cli@5.1.4)
     transitivePeerDependencies:
       - supports-color

@@ -30755,7 +31116,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)(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)(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)':
     dependencies:
       '@babel/preset-flow': 7.27.1(@babel/core@7.25.7)
       '@babel/preset-react': 7.25.7(@babel/core@7.25.7)
@@ -30794,7 +31155,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)(webpack-cli@5.1.4)
+      webpack: 5.97.1(@swc/core@1.15.24)(esbuild@0.24.2)(webpack-cli@5.1.4)
     optionalDependencies:
       '@babel/core': 7.25.7
       typescript: 5.7.3
@@ -32018,7 +32379,7 @@ snapshots:
       '@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/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/element': 6.44.0
     transitivePeerDependencies:
       - '@date-fns/tz'
@@ -32597,10 +32958,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:
@@ -33464,11 +33825,11 @@ snapshots:
       '@wordpress/autop': 4.44.0
       '@wordpress/base-styles': 6.20.0
       '@wordpress/blob': 4.44.0
-      '@wordpress/block-editor': 15.17.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/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(@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
@@ -33485,10 +33846,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(@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(@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)
@@ -34515,10 +34876,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(@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(@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
@@ -35065,7 +35426,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)(webpack-cli@5.1.4)
+      webpack: 5.97.1(@swc/core@1.15.24)(esbuild@0.24.2)(webpack-cli@5.1.4)

   '@wordpress/dependency-extraction-webpack-plugin@6.43.1-next.v.202604091042.0(webpack@5.97.1)':
     dependencies:
@@ -35075,7 +35436,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-cli@5.1.4)
+      webpack: 5.97.1(@swc/core@1.15.24)

   '@wordpress/deprecated@3.58.0':
     dependencies:
@@ -35203,11 +35564,11 @@ 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(@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
-      '@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(@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/element': 6.44.0
       '@wordpress/hooks': 4.44.0
       '@wordpress/html-entities': 4.44.0
@@ -35354,65 +35715,6 @@ snapshots:
       - supports-color
       - utf-8-validate

-  '@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)':
-    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/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/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/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@14.16.1)
-      '@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)(@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(@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(@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(@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/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/wordcount': 4.44.0
-      change-case: 4.1.2
-      client-zip: 2.5.0
-      clsx: 2.1.1
-      date-fns: 3.6.0
-      deepmerge: 4.3.1
-      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)
-      react-dom: 18.3.1(react@18.3.1)
-      remove-accents: 0.5.0
-      uuid: 9.0.1
-    transitivePeerDependencies:
-      - '@date-fns/tz'
-      - '@emotion/is-prop-valid'
-      - '@types/react'
-      - '@types/react-dom'
-      - 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)':
     dependencies:
       '@babel/runtime': 7.25.7
@@ -35657,73 +35959,6 @@ 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)':
-    dependencies:
-      '@floating-ui/react-dom': 2.0.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
-      '@wordpress/a11y': 4.44.0
-      '@wordpress/api-fetch': 7.44.0
-      '@wordpress/base-styles': 6.20.0
-      '@wordpress/blob': 4.44.0
-      '@wordpress/block-editor': 15.17.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/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': 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(@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': 14.2.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/date': 5.44.0
-      '@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/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/hooks': 4.44.0
-      '@wordpress/html-entities': 4.44.0
-      '@wordpress/i18n': 6.17.0
-      '@wordpress/icons': 12.2.0(react@18.3.1)
-      '@wordpress/interface': 9.29.0(@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-fields': 0.9.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/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)(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)
-      '@wordpress/patterns': 2.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/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)(@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/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(@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/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
-      diff: 4.0.4
-      fast-deep-equal: 3.1.3
-      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)
-      react-dom: 18.3.1(react@18.3.1)
-      remove-accents: 0.5.0
-      uuid: 9.0.1
-    transitivePeerDependencies:
-      - '@date-fns/tz'
-      - '@emotion/is-prop-valid'
-      - '@types/react'
-      - '@types/react-dom'
-      - stylelint
-      - supports-color
-
   '@wordpress/element@3.2.0':
     dependencies:
       '@babel/runtime': 7.25.7
@@ -35840,7 +36075,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)
@@ -35869,7 +36104,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)
@@ -35898,7 +36133,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)
@@ -36174,48 +36409,6 @@ snapshots:
       - 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)':
-    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(@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': 14.2.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/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)(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)
-      '@wordpress/patterns': 2.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/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/format-library@5.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)':
     dependencies:
       '@babel/runtime': 7.25.7
@@ -36284,37 +36477,6 @@ 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)':
-    dependencies:
-      '@wordpress/a11y': 4.45.0
-      '@wordpress/api-fetch': 7.44.0
-      '@wordpress/base-styles': 6.20.0
-      '@wordpress/block-editor': 15.17.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/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(@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.45.0
-      '@wordpress/element': 6.44.0
-      '@wordpress/global-styles-engine': 1.11.0(react@18.3.1)
-      '@wordpress/i18n': 6.18.0
-      '@wordpress/icons': 12.2.0(react@18.3.1)
-      '@wordpress/keycodes': 4.45.0
-      '@wordpress/private-apis': 1.44.0
-      change-case: 4.1.2
-      clsx: 2.1.1
-      colord: 2.9.3
-      react: 18.3.1
-      react-dom: 18.3.1(react@18.3.1)
-    transitivePeerDependencies:
-      - '@date-fns/tz'
-      - '@emotion/is-prop-valid'
-      - '@types/react'
-      - '@types/react-dom'
-      - stylelint
-      - supports-color
-
   '@wordpress/hooks@3.58.0':
     dependencies:
       '@babel/runtime': 7.25.7
@@ -36668,7 +36830,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
@@ -36686,7 +36848,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:
@@ -36704,7 +36866,7 @@ snapshots:
   '@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:
@@ -36795,22 +36957,6 @@ 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)':
-    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)
-      '@wordpress/dataviews': 14.2.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/element': 6.44.0
-      '@wordpress/i18n': 6.18.0
-      react: 18.3.1
-    transitivePeerDependencies:
-      - '@date-fns/tz'
-      - '@emotion/is-prop-valid'
-      - '@types/react'
-      - react-dom
-      - stylelint
-      - supports-color
-
   '@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))':
     dependencies:
       '@wordpress/base-styles': 6.20.0
@@ -37669,7 +37815,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(@swc/core@1.15.24))
+      css-loader: 6.11.0(webpack@5.97.1)
       cssnano: 5.1.12(postcss@8.4.49)
       cwd: 0.10.0
       dir-glob: 3.0.1
@@ -37684,7 +37830,7 @@ snapshots:
       markdownlint: 0.23.1
       markdownlint-cli: 0.27.1
       merge-deep: 3.0.3
-      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)
       minimist: 1.2.8
       npm-package-json-lint: 5.4.2
       postcss: 8.4.49
@@ -37730,7 +37876,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)(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)(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)':
     dependencies:
       '@babel/core': 7.25.7
       '@playwright/test': 1.59.1
@@ -37755,7 +37901,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(@swc/core@1.15.24))
+      css-loader: 6.11.0(webpack@5.97.1)
       cssnano: 6.1.2(postcss@8.4.49)
       cwd: 0.10.0
       dir-glob: 3.0.1
@@ -37769,7 +37915,7 @@ snapshots:
       jest-environment-node: 29.7.0
       markdownlint-cli: 0.31.1
       merge-deep: 3.0.3
-      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)
       minimist: 1.2.8
       npm-package-json-lint: 6.4.0(typescript@5.7.3)
       npm-packlist: 3.0.0
@@ -37787,9 +37933,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)(webpack@5.97.1(@swc/core@1.15.24))
+      terser-webpack-plugin: 5.4.0(@swc/core@1.15.24)(esbuild@0.24.2)(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-cli@5.1.4)
+      webpack: 5.97.1(@swc/core@1.15.24)(esbuild@0.24.2)(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)
@@ -37844,14 +37990,14 @@ snapshots:
       '@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(@swc/core@1.15.24))
+      babel-loader: 9.2.1(@babel/core@7.25.7)(webpack@5.97.1)
       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(@swc/core@1.15.24))
+      css-loader: 6.11.0(webpack@5.97.1)
       cssnano: 6.1.2(postcss@8.4.49)
       cwd: 0.10.0
       dir-glob: 3.0.1
@@ -37866,7 +38012,7 @@ snapshots:
       json2php: 0.0.9
       markdownlint-cli: 0.31.1
       merge-deep: 3.0.3
-      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)
       minimist: 1.2.8
       npm-package-json-lint: 6.4.0(typescript@5.7.3)
       npm-packlist: 3.0.0
@@ -37941,13 +38087,13 @@ snapshots:
       '@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(@swc/core@1.15.24))
+      babel-loader: 9.2.1(@babel/core@7.25.7)(webpack@5.97.1)
       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(@swc/core@1.15.24))
+      css-loader: 6.11.0(webpack@5.97.1)
       cssnano: 6.1.2(postcss@8.4.49)
       cwd: 0.10.0
       dir-glob: 3.0.1
@@ -37962,7 +38108,7 @@ snapshots:
       json2php: 0.0.9
       markdownlint-cli: 0.31.1
       merge-deep: 3.0.3
-      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)
       minimist: 1.2.8
       npm-package-json-lint: 6.4.0(typescript@5.7.3)
       npm-packlist: 3.0.0
@@ -37981,9 +38127,9 @@ snapshots:
       schema-utils: 4.3.3
       source-map-loader: 3.0.2(webpack@5.97.1)
       stylelint: 16.26.1(typescript@5.7.3)
-      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)
       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-cli@5.1.4)
+      webpack: 5.97.1(@swc/core@1.15.24)
       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)
@@ -38037,14 +38183,14 @@ snapshots:
       '@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(@swc/core@1.15.24))
+      babel-loader: 9.2.1(@babel/core@7.25.7)(webpack@5.97.1)
       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(@swc/core@1.15.24))
+      css-loader: 6.11.0(webpack@5.97.1)
       cssnano: 6.1.2(postcss@8.4.49)
       cwd: 0.10.0
       dir-glob: 3.0.1
@@ -38059,7 +38205,7 @@ snapshots:
       json2php: 0.0.9
       markdownlint-cli: 0.31.1
       merge-deep: 3.0.3
-      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)
       minimist: 1.2.8
       npm-package-json-lint: 6.4.0(typescript@5.7.3)
       npm-packlist: 3.0.0
@@ -38078,9 +38224,9 @@ snapshots:
       schema-utils: 4.3.3
       source-map-loader: 3.0.2(webpack@5.97.1)
       stylelint: 16.26.1(typescript@5.7.3)
-      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)
       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-cli@5.1.4)
+      webpack: 5.97.1(@swc/core@1.15.24)
       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)
@@ -38457,7 +38603,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.11.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@14.16.1)
+      '@wordpress/theme': 0.11.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)
@@ -38523,7 +38669,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)
@@ -38769,11 +38915,11 @@ snapshots:
     dependencies:
       '@wordpress/api-fetch': 7.44.0
       '@wordpress/base-styles': 6.20.0
-      '@wordpress/block-editor': 15.17.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/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(@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
@@ -39704,9 +39850,16 @@ 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)(webpack-cli@5.1.4)
+      webpack: 5.97.1(@swc/core@1.15.24)(esbuild@0.24.2)(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
@@ -40660,7 +40813,7 @@ snapshots:
     dependencies:
       '@types/webpack': 4.41.40
       del: 4.1.1
-      webpack: 5.97.1(@swc/core@1.15.24)(webpack-cli@5.1.4)
+      webpack: 5.97.1(@swc/core@1.15.24)(esbuild@0.24.2)(webpack-cli@5.1.4)

   cli-boxes@1.0.0: {}

@@ -41070,7 +41223,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)(webpack-cli@5.1.4)
+      webpack: 5.97.1(@swc/core@1.15.24)(esbuild@0.24.2)(webpack-cli@5.1.4)

   copy-webpack-plugin@13.0.1(webpack@5.97.1(@swc/core@1.15.24)):
     dependencies:
@@ -41079,7 +41232,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)(webpack-cli@5.1.4)
+      webpack: 5.97.1(@swc/core@1.15.24)

   copy-webpack-plugin@13.0.1(webpack@5.97.1):
     dependencies:
@@ -41088,7 +41241,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)(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:
@@ -41311,6 +41464,19 @@ snapshots:
       webpack: 4.47.0(webpack-cli@5.1.4)

   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
+      postcss-modules-extract-imports: 3.1.0(postcss@8.4.49)
+      postcss-modules-local-by-default: 4.2.0(postcss@8.4.49)
+      postcss-modules-scope: 3.2.1(postcss@8.4.49)
+      postcss-modules-values: 4.0.0(postcss@8.4.49)
+      postcss-value-parser: 4.2.0
+      semver: 7.7.4
+    optionalDependencies:
+      webpack: 5.97.1(@swc/core@1.15.24)
+
+  css-loader@6.11.0(webpack@5.97.1):
     dependencies:
       icss-utils: 5.1.0(postcss@8.4.49)
       postcss: 8.4.49
@@ -42403,6 +42569,34 @@ snapshots:
       '@esbuild/win32-ia32': 0.18.20
       '@esbuild/win32-x64': 0.18.20

+  esbuild@0.24.2:
+    optionalDependencies:
+      '@esbuild/aix-ppc64': 0.24.2
+      '@esbuild/android-arm': 0.24.2
+      '@esbuild/android-arm64': 0.24.2
+      '@esbuild/android-x64': 0.24.2
+      '@esbuild/darwin-arm64': 0.24.2
+      '@esbuild/darwin-x64': 0.24.2
+      '@esbuild/freebsd-arm64': 0.24.2
+      '@esbuild/freebsd-x64': 0.24.2
+      '@esbuild/linux-arm': 0.24.2
+      '@esbuild/linux-arm64': 0.24.2
+      '@esbuild/linux-ia32': 0.24.2
+      '@esbuild/linux-loong64': 0.24.2
+      '@esbuild/linux-mips64el': 0.24.2
+      '@esbuild/linux-ppc64': 0.24.2
+      '@esbuild/linux-riscv64': 0.24.2
+      '@esbuild/linux-s390x': 0.24.2
+      '@esbuild/linux-x64': 0.24.2
+      '@esbuild/netbsd-arm64': 0.24.2
+      '@esbuild/netbsd-x64': 0.24.2
+      '@esbuild/openbsd-arm64': 0.24.2
+      '@esbuild/openbsd-x64': 0.24.2
+      '@esbuild/sunos-x64': 0.24.2
+      '@esbuild/win32-arm64': 0.24.2
+      '@esbuild/win32-ia32': 0.24.2
+      '@esbuild/win32-x64': 0.24.2
+
   escalade@3.2.0: {}

   escape-html@1.0.3: {}
@@ -43581,7 +43775,7 @@ snapshots:
     dependencies:
       loader-utils: 2.0.4
       schema-utils: 3.3.0
-      webpack: 5.97.1(@swc/core@1.15.24)(webpack-cli@5.1.4)
+      webpack: 5.97.1(@swc/core@1.15.24)(esbuild@0.24.2)(webpack-cli@5.1.4)
     optional: true

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

   fork-ts-checker-webpack-plugin@8.0.0(typescript@5.7.3)(webpack@5.97.1):
     dependencies:
@@ -43878,7 +44072,7 @@ snapshots:
       semver: 7.7.4
       tapable: 2.3.2
       typescript: 5.7.3
-      webpack: 5.97.1(@swc/core@1.15.24)(webpack-cli@5.1.4)
+      webpack: 5.97.1(@swc/core@1.15.24)

   form-data@2.3.3:
     dependencies:
@@ -44223,7 +44417,7 @@ snapshots:
     dependencies:
       inflight: 1.0.6
       inherits: 2.0.4
-      minimatch: 3.0.8
+      minimatch: 3.1.5
       once: 1.4.0
       path-is-absolute: 1.0.1

@@ -44232,7 +44426,7 @@ snapshots:
       fs.realpath: 1.0.0
       inflight: 1.0.6
       inherits: 2.0.4
-      minimatch: 3.0.8
+      minimatch: 3.1.5
       once: 1.4.0
       path-is-absolute: 1.0.1

@@ -44911,7 +45105,7 @@ snapshots:
       pretty-error: 4.0.0
       tapable: 2.3.2
     optionalDependencies:
-      webpack: 5.97.1(@swc/core@1.15.24)(webpack-cli@5.1.4)
+      webpack: 5.97.1(@swc/core@1.15.24)

   html-webpack-plugin@5.6.6(webpack@5.97.1):
     dependencies:
@@ -47933,6 +48127,12 @@ snapshots:
   min-indent@1.0.1: {}

   mini-css-extract-plugin@2.9.4(webpack@5.97.1(@swc/core@1.15.24)):
+    dependencies:
+      schema-utils: 4.3.3
+      tapable: 2.3.2
+      webpack: 5.97.1(@swc/core@1.15.24)
+
+  mini-css-extract-plugin@2.9.4(webpack@5.97.1):
     dependencies:
       schema-utils: 4.3.3
       tapable: 2.3.2
@@ -49503,7 +49703,17 @@ 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)):
+    dependencies:
+      cosmiconfig: 7.1.0
+      klona: 2.0.6
+      loader-utils: 2.0.4
+      postcss: 8.5.9
+      schema-utils: 3.3.0
+      semver: 7.7.4
+      webpack: 5.97.1(@swc/core@1.15.24)

   postcss-loader@4.3.0(postcss@8.5.9)(webpack@5.97.1):
     dependencies:
@@ -49513,7 +49723,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-cli@5.1.4)
+      webpack: 5.97.1(@swc/core@1.15.24)(esbuild@0.24.2)(webpack-cli@5.1.4)

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

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

@@ -51466,7 +51676,7 @@ snapshots:
       neo-async: 2.6.2
       schema-utils: 3.3.0
       semver: 7.7.4
-      webpack: 5.97.1(@swc/core@1.15.24)(webpack-cli@5.1.4)
+      webpack: 5.97.1(@swc/core@1.15.24)
     optionalDependencies:
       sass: 1.69.5

@@ -51477,7 +51687,7 @@ snapshots:
       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

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

@@ -51955,7 +52165,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)(webpack-cli@5.1.4)
+      webpack: 5.97.1(@swc/core@1.15.24)(esbuild@0.24.2)(webpack-cli@5.1.4)

   source-map-resolve@0.5.3:
     dependencies:
@@ -52372,7 +52582,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-cli@5.1.4)
+      webpack: 5.97.1(@swc/core@1.15.24)

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

   swc-loader@0.2.7(@swc/core@1.15.24)(webpack@5.97.1):
     dependencies:
@@ -53002,6 +53212,17 @@ 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):
+    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)
+    optionalDependencies:
+      '@swc/core': 1.15.24
+      esbuild: 0.24.2
+
   terser-webpack-plugin@5.4.0(@swc/core@1.15.24)(uglify-js@3.19.3)(webpack@5.97.1):
     dependencies:
       '@jridgewell/trace-mapping': 0.3.31
@@ -53014,6 +53235,16 @@ snapshots:
       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
       jest-worker: 27.5.1
@@ -53218,7 +53449,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))(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))(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
@@ -53235,6 +53466,26 @@ 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:
@@ -53692,7 +53943,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)(webpack-cli@5.1.4)
+      webpack: 5.97.1(@swc/core@1.15.24)(esbuild@0.24.2)(webpack-cli@5.1.4)
     optionalDependencies:
       file-loader: 6.2.0(webpack@5.97.1)

@@ -54071,11 +54322,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:
@@ -54091,7 +54342,7 @@ snapshots:
       import-local: 3.2.0
       interpret: 3.1.1
       rechoir: 0.8.0
-      webpack: 5.97.1(@swc/core@1.15.24)(webpack-cli@5.1.4)
+      webpack: 5.97.1(@swc/core@1.15.24)(esbuild@0.24.2)(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)
@@ -54123,6 +54374,16 @@ 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
@@ -54139,7 +54400,7 @@ snapshots:
       range-parser: 1.2.1
       schema-utils: 4.3.3
     optionalDependencies:
-      webpack: 5.97.1(@swc/core@1.15.24)(webpack-cli@5.1.4)
+      webpack: 5.97.1(@swc/core@1.15.24)

   webpack-dev-middleware@6.1.3(webpack@5.97.1):
     dependencies:
@@ -54181,7 +54442,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(@swc/core@1.15.24))
+      webpack-dev-middleware: 5.3.4(webpack@5.97.1)
       ws: 8.20.0
     optionalDependencies:
       webpack: 5.97.1(@swc/core@1.15.24)(webpack-cli@5.1.4)
@@ -54222,10 +54483,10 @@ snapshots:
       serve-index: 1.9.2
       sockjs: 0.3.24
       spdy: 4.0.2
-      webpack-dev-middleware: 5.3.4(webpack@5.97.1(@swc/core@1.15.24))
+      webpack-dev-middleware: 5.3.4(webpack@5.97.1)
       ws: 8.20.0
     optionalDependencies:
-      webpack: 5.97.1(@swc/core@1.15.24)(webpack-cli@5.1.4)
+      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
@@ -54233,6 +54494,47 @@ snapshots:
       - 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
+      '@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(@swc/core@1.15.24))
+      ws: 8.20.0
+    optionalDependencies:
+      webpack: 5.97.1(@swc/core@1.15.24)
+    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:
       webpack: 4.47.0(webpack-cli@5.1.4)
@@ -54269,7 +54571,12 @@ snapshots:
   webpack-remove-empty-scripts@1.0.4(webpack@5.97.1(@swc/core@1.15.24)):
     dependencies:
       ansis: 1.5.2
-      webpack: 5.97.1(@swc/core@1.15.24)(webpack-cli@5.1.4)
+      webpack: 5.97.1(@swc/core@1.15.24)
+
+  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-sources@1.4.3:
     dependencies:
@@ -54318,6 +54625,36 @@ 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
@@ -54350,6 +54687,38 @@ snapshots:
       - esbuild
       - uglify-js

+  webpack@5.97.1(@swc/core@1.15.24)(esbuild@0.24.2)(webpack-cli@5.1.4):
+    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)(esbuild@0.24.2)(webpack@5.97.1)
+      watchpack: 2.5.1
+      webpack-sources: 3.3.4
+    optionalDependencies:
+      webpack-cli: 5.1.4(webpack@5.97.1)
+    transitivePeerDependencies:
+      - '@swc/core'
+      - esbuild
+      - uglify-js
+
   webpack@5.97.1(@swc/core@1.15.24)(uglify-js@3.19.3)(webpack-cli@4.10.0):
     dependencies:
       '@types/eslint-scope': 3.7.7
@@ -54404,7 +54773,7 @@ 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)(webpack@5.97.1(@swc/core@1.15.24))
+      terser-webpack-plugin: 5.4.0(@swc/core@1.15.24)(webpack@5.97.1)
       watchpack: 2.5.1
       webpack-sources: 3.3.4
     optionalDependencies: