@wordpress/build 0.5.0 → 0.5.1-next.79a2f3cdd.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.cache/tsconfig.tsbuildinfo +1 -1
- package/CHANGELOG.md +0 -2
- package/LICENSE.md +1 -1
- package/README.md +47 -5
- package/build-module/build.mjs +1454 -0
- package/build-module/build.mjs.map +7 -0
- package/build-module/dependency-graph.mjs +149 -0
- package/build-module/dependency-graph.mjs.map +7 -0
- package/build-module/package-utils.mjs +44 -0
- package/build-module/package-utils.mjs.map +7 -0
- package/build-module/php-generator.mjs +48 -0
- package/build-module/php-generator.mjs.map +7 -0
- package/build-module/route-utils.mjs +85 -0
- package/build-module/route-utils.mjs.map +7 -0
- package/build-module/wordpress-externals-plugin.mjs +257 -0
- package/build-module/wordpress-externals-plugin.mjs.map +7 -0
- package/package.json +4 -6
- package/src/build.mjs +216 -97
- package/src/dependency-graph.mjs +36 -110
- package/src/package-utils.mjs +45 -10
- package/src/php-generator.mjs +5 -6
- package/src/route-utils.mjs +13 -4
- package/src/wordpress-externals-plugin.mjs +77 -15
- package/templates/constants.php.template +14 -0
- package/templates/index.php.template +0 -6
- package/templates/module-registration.php.template +3 -1
- package/templates/page-wp-admin.php.template +68 -28
- package/templates/page.php.template +13 -4
- package/templates/routes-registration.php.template +4 -2
- package/templates/script-registration.php.template +4 -2
- package/templates/style-registration.php.template +6 -2
- package/templates/version.php.template +0 -11
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/build.mjs"],
|
|
4
|
+
"sourcesContent": ["#!/usr/bin/env node\n\n/**\n * External dependencies\n */\nimport { readFile, writeFile, copyFile, mkdir, unlink } from 'fs/promises';\nimport path from 'path';\nimport { parseArgs } from 'node:util';\nimport esbuild from 'esbuild';\nimport glob from 'fast-glob';\nimport chokidar from 'chokidar';\nimport browserslistToEsbuild from 'browserslist-to-esbuild';\nimport { sassPlugin, postcssModules } from 'esbuild-sass-plugin';\nimport postcss from 'postcss';\nimport autoprefixer from 'autoprefixer';\nimport rtlcss from 'rtlcss';\nimport cssnano from 'cssnano';\nimport babel from 'esbuild-plugin-babel';\nimport { camelCase } from 'change-case';\n\n/**\n * Internal dependencies\n */\nimport {\n\tgroupByDepth,\n\tfindScriptsToRebundle,\n\tfindRoutesToRebuild,\n} from './dependency-graph.mjs';\nimport {\n\tgeneratePhpFromTemplate,\n\tgetPhpReplacements,\n} from './php-generator.mjs';\nimport { getPackageInfo, getPackageInfoFromFile } from './package-utils.mjs';\nimport { createWordpressExternalsPlugin } from './wordpress-externals-plugin.mjs';\nimport {\n\tgetAllRoutes,\n\tgetRouteFiles,\n\tgetRouteMetadata,\n\tgenerateContentEntryPoint,\n} from './route-utils.mjs';\n\nconst ROOT_DIR = process.cwd();\nconst PACKAGES_DIR = path.join( ROOT_DIR, 'packages' );\nconst BUILD_DIR = path.join( ROOT_DIR, 'build' );\n\nconst SOURCE_EXTENSIONS = '{js,mjs,ts,tsx}';\nconst ASSET_EXTENSIONS = 'json';\nconst IGNORE_PATTERNS = [\n\t'**/benchmark/**',\n\t'**/{__mocks__,__tests__,test}/**',\n\t'**/{storybook,stories}/**',\n\t'**/*.native.*',\n\t'**/*.ios.*',\n\t'**/*.android.*',\n\t'**/*.{spec,test}.*',\n];\nconst TEST_FILE_PATTERNS = [\n\t/\\/(benchmark|__mocks__|__tests__|test|storybook|stories)\\/.+/,\n\t/\\.(spec|test)\\.(js|ts|tsx)$/,\n\t/\\.(native|ios|android)\\.(js|ts|tsx)$/,\n];\n\n/**\n * Get all package names from the packages directory.\n *\n * @return {string[]} Array of package names.\n */\nfunction getAllPackages() {\n\treturn glob\n\t\t.sync( normalizePath( path.join( PACKAGES_DIR, '*', 'package.json' ) ) )\n\t\t.map( ( packageJsonPath ) =>\n\t\t\tpath.basename( path.dirname( packageJsonPath ) )\n\t\t);\n}\n\nconst PACKAGES = getAllPackages();\nconst ROOT_PACKAGE_JSON = getPackageInfoFromFile(\n\tpath.join( ROOT_DIR, 'package.json' )\n);\nconst WP_PLUGIN_CONFIG = ROOT_PACKAGE_JSON.wpPlugin || {};\nconst SCRIPT_GLOBAL = WP_PLUGIN_CONFIG.scriptGlobal;\nconst PACKAGE_NAMESPACE = WP_PLUGIN_CONFIG.packageNamespace;\nconst HANDLE_PREFIX = WP_PLUGIN_CONFIG.handlePrefix || PACKAGE_NAMESPACE;\nconst EXTERNAL_NAMESPACES = WP_PLUGIN_CONFIG.externalNamespaces || {};\nconst PAGES = WP_PLUGIN_CONFIG.pages || [];\n\nconst baseDefine = {\n\t'globalThis.IS_GUTENBERG_PLUGIN': JSON.stringify(\n\t\tBoolean( process.env.npm_package_config_IS_GUTENBERG_PLUGIN )\n\t),\n\t'globalThis.IS_WORDPRESS_CORE': JSON.stringify(\n\t\tBoolean( process.env.npm_package_config_IS_WORDPRESS_CORE )\n\t),\n};\nconst getDefine = ( scriptDebug ) => ( {\n\t...baseDefine,\n\t'globalThis.SCRIPT_DEBUG': JSON.stringify( scriptDebug ),\n} );\n\n/**\n * Initialize WordPress externals plugin with custom namespace configuration.\n */\nconst wordpressExternalsPlugin = createWordpressExternalsPlugin(\n\tPACKAGE_NAMESPACE,\n\tSCRIPT_GLOBAL,\n\tEXTERNAL_NAMESPACES,\n\tHANDLE_PREFIX\n);\n\nconst styleBundlingPlugins = [\n\t// Handle CSS modules (.module.css and .module.scss)\n\tsassPlugin( {\n\t\tembedded: true,\n\t\tfilter: /\\.module\\.(css|scss)$/,\n\t\ttransform: postcssModules( {\n\t\t\tgenerateScopedName: '[name]__[local]__[hash:base64:5]',\n\t\t} ),\n\t\ttype: 'style',\n\t\tloadPaths: [ 'node_modules', path.join( PACKAGES_DIR, 'base-styles' ) ],\n\t} ),\n\t// Handle regular CSS/SCSS files\n\t// Note: .module.css and .module.scss already handled by plugin above\n\tsassPlugin( {\n\t\tembedded: true,\n\t\tfilter: /\\.(css|scss)$/,\n\t\ttype: 'style',\n\t\tloadPaths: [ 'node_modules', path.join( PACKAGES_DIR, 'base-styles' ) ],\n\t} ),\n];\n\n/**\n * Normalize path separators for cross-platform compatibility.\n *\n * @param {string} p Path to normalize.\n * @return {string} Normalized path with forward slashes.\n */\nfunction normalizePath( p ) {\n\treturn p.replace( /\\\\/g, '/' );\n}\n\nfunction transformPhpContent( content, transforms ) {\n\tconst {\n\t\tfunctionPrefix = '',\n\t\tclassSuffix = '',\n\t\tprefixFunctions = [],\n\t\tsuffixClasses = [],\n\t\taddActionPriority,\n\t} = transforms;\n\n\tcontent = content.toString();\n\n\tif ( prefixFunctions.length ) {\n\t\tcontent = content.replace(\n\t\t\tnew RegExp( prefixFunctions.join( '|' ), 'g' ),\n\t\t\t( match ) => `${ functionPrefix }${ match.replace( /^wp_/, '' ) }`\n\t\t);\n\t}\n\n\tif ( suffixClasses.length ) {\n\t\tcontent = content.replace(\n\t\t\tnew RegExp( suffixClasses.join( '|' ), 'g' ),\n\t\t\t( match ) => `${ match }${ classSuffix }`\n\t\t);\n\t}\n\n\tif ( functionPrefix ) {\n\t\tcontent = Array.from(\n\t\t\tcontent.matchAll( /^\\s*function ([^\\(]+)/gm )\n\t\t).reduce( ( result, [ , functionName ] ) => {\n\t\t\treturn result.replace(\n\t\t\t\tnew RegExp( functionName + '(?![a-zA-Z0-9_])', 'g' ),\n\t\t\t\t( match ) => functionPrefix + match.replace( /^wp_/, '' )\n\t\t\t);\n\t\t}, content );\n\t}\n\n\tif ( addActionPriority ) {\n\t\tcontent = content.replace(\n\t\t\t/(add_action\\(\\s*'init',\\s*'gutenberg_register_block_[^']+'(?!,))/,\n\t\t\t`$1, ${ addActionPriority }`\n\t\t);\n\t}\n\n\treturn content;\n}\n\n/**\n * Plugin to handle moment-timezone aliases.\n * Redirects moment-timezone imports to use pre-built bundles with limited data.\n *\n * @return {Object} esbuild plugin.\n */\nfunction momentTimezoneAliasPlugin() {\n\treturn {\n\t\tname: 'moment-timezone-alias',\n\t\tasync setup( build ) {\n\t\t\tconst { createRequire } = await import( 'module' );\n\t\t\tconst require = createRequire( import.meta.url );\n\n\t\t\t// Cached paths - resolved lazily on first use\n\t\t\tlet preBuiltBundlePath;\n\t\t\tlet momentTimezoneUtilsPath;\n\t\t\tconst resolvePaths = () => {\n\t\t\t\tif ( preBuiltBundlePath ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tpreBuiltBundlePath = require.resolve(\n\t\t\t\t\t'moment-timezone/builds/moment-timezone-with-data-1970-2030'\n\t\t\t\t);\n\t\t\t\tmomentTimezoneUtilsPath = require.resolve(\n\t\t\t\t\t'moment-timezone/moment-timezone-utils.js'\n\t\t\t\t);\n\t\t\t};\n\n\t\t\t// Redirect main moment-timezone files to pre-built bundle\n\t\t\tbuild.onResolve(\n\t\t\t\t{ filter: /^moment-timezone\\/moment-timezone$/ },\n\t\t\t\t() => {\n\t\t\t\t\tresolvePaths();\n\t\t\t\t\treturn { path: preBuiltBundlePath };\n\t\t\t\t}\n\t\t\t);\n\n\t\t\t// For utils, we need to load it but ensure it works with the pre-built bundle.\n\t\t\t// The utils file tries to require('./') which would load index.js.\n\t\t\t// We need to make sure it gets the pre-built bundle instead.\n\t\t\tbuild.onResolve(\n\t\t\t\t{ filter: /^moment-timezone\\/moment-timezone-utils$/ },\n\t\t\t\t() => {\n\t\t\t\t\tresolvePaths();\n\t\t\t\t\treturn { path: momentTimezoneUtilsPath };\n\t\t\t\t}\n\t\t\t);\n\n\t\t\t// Intercept the require('./') call inside moment-timezone-utils\n\t\t\t// and redirect it to the pre-built bundle.\n\t\t\tbuild.onResolve( { filter: /^\\.\\/$/ }, ( args ) => {\n\t\t\t\tif (\n\t\t\t\t\targs.importer &&\n\t\t\t\t\targs.importer.includes( 'moment-timezone-utils' )\n\t\t\t\t) {\n\t\t\t\t\tresolvePaths();\n\t\t\t\t\treturn { path: preBuiltBundlePath };\n\t\t\t\t}\n\t\t\t} );\n\t\t},\n\t};\n}\n\n/**\n * Resolve the entry point for bundling from package.json exports field.\n * Falls back to build-module/index.js if no exports field is found.\n *\n * @param {string} packageDir Package directory path.\n * @param {Object} packageJson Package.json object.\n * @return {string} Resolved entry point path.\n */\nfunction resolveEntryPoint( packageDir, packageJson ) {\n\tif ( packageJson.exports ) {\n\t\tconst rootExport = packageJson.exports[ '.' ];\n\t\tif ( rootExport ) {\n\t\t\t// If it's an object with conditions, prefer 'import' over 'default'\n\t\t\tif ( typeof rootExport === 'object' ) {\n\t\t\t\tconst entryFile =\n\t\t\t\t\trootExport.import ||\n\t\t\t\t\trootExport.default ||\n\t\t\t\t\trootExport.require;\n\t\t\t\tif ( entryFile ) {\n\t\t\t\t\treturn path.join( packageDir, entryFile );\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ( typeof rootExport === 'string' ) {\n\t\t\t\treturn path.join( packageDir, rootExport );\n\t\t\t}\n\t\t}\n\t}\n\n\t// Fallback: try module field, then main field, then build-module/index.js\n\tif ( packageJson.module ) {\n\t\treturn path.join( packageDir, packageJson.module );\n\t}\n\tif ( packageJson.main ) {\n\t\treturn path.join( packageDir, packageJson.main );\n\t}\n\n\treturn path.join( packageDir, 'build-module', 'index.js' );\n}\n\n/**\n * Bundle a package for WordPress using esbuild.\n *\n * @param {string} packageName Package name.\n * @param {Object} options Optional bundling options.\n * @return {Promise<boolean>} True if the package was bundled, false otherwise.\n */\nasync function bundlePackage( packageName, options = {} ) {\n\tconst {\n\t\tsourceDir = PACKAGES_DIR,\n\t\thandlePrefix = HANDLE_PREFIX,\n\t\tscriptGlobal = SCRIPT_GLOBAL,\n\t\tpackageNamespace = PACKAGE_NAMESPACE,\n\t} = options;\n\n\tconst builtModules = [];\n\tconst builtScripts = [];\n\tconst builtStyles = [];\n\tconst packageDir = path.join( sourceDir, packageName );\n\tconst packageJson = getPackageInfoFromFile(\n\t\tpath.join( sourceDir, packageName, 'package.json' )\n\t);\n\n\tconst builds = [];\n\n\tif ( packageJson.wpScript ) {\n\t\tconst entryPoint = resolveEntryPoint( packageDir, packageJson );\n\t\tconst outputDir = path.join( BUILD_DIR, 'scripts', packageName );\n\t\tconst target = browserslistToEsbuild();\n\n\t\t// Check if package matches the namespace and should expose a global\n\t\tconst packageFullName = packageJson.name;\n\t\tconst matchesNamespace = packageFullName.startsWith(\n\t\t\t`@${ packageNamespace }/`\n\t\t);\n\t\tconst shouldExposeGlobal = matchesNamespace && scriptGlobal !== false;\n\n\t\tconst globalName = shouldExposeGlobal\n\t\t\t? `${ scriptGlobal }.${ camelCase( packageName ) }`\n\t\t\t: undefined;\n\n\t\tconst baseConfig = {\n\t\t\tentryPoints: [ entryPoint ],\n\t\t\tbundle: true,\n\t\t\tsourcemap: true,\n\t\t\tformat: 'iife',\n\t\t\ttarget,\n\t\t\tplatform: 'browser',\n\t\t\tglobalName,\n\t\t};\n\n\t\t// For packages with default exports, add a footer to properly expose the default\n\t\tif ( packageJson.wpScriptDefaultExport && globalName ) {\n\t\t\tbaseConfig.footer = {\n\t\t\t\tjs: `if (typeof ${ globalName } === 'object' && ${ globalName }.default) { ${ globalName } = ${ globalName }.default; }`,\n\t\t\t};\n\t\t}\n\n\t\tconst baseBundlePlugins = [ momentTimezoneAliasPlugin() ];\n\n\t\tbuilds.push(\n\t\t\tesbuild.build( {\n\t\t\t\t...baseConfig,\n\t\t\t\toutfile: path.join( outputDir, 'index.min.js' ),\n\t\t\t\tminify: true,\n\t\t\t\tdefine: getDefine( false ),\n\t\t\t\tplugins: [\n\t\t\t\t\t...baseBundlePlugins,\n\t\t\t\t\twordpressExternalsPlugin(\n\t\t\t\t\t\t'index.min',\n\t\t\t\t\t\t'iife',\n\t\t\t\t\t\tpackageJson.wpScriptExtraDependencies || [],\n\t\t\t\t\t\ttrue // Generate asset file for minified build\n\t\t\t\t\t),\n\t\t\t\t],\n\t\t\t} ),\n\t\t\tesbuild.build( {\n\t\t\t\t...baseConfig,\n\t\t\t\toutfile: path.join( outputDir, 'index.js' ),\n\t\t\t\tminify: false,\n\t\t\t\tdefine: getDefine( true ),\n\t\t\t\tplugins: [\n\t\t\t\t\t...baseBundlePlugins,\n\t\t\t\t\twordpressExternalsPlugin(\n\t\t\t\t\t\t'index.min',\n\t\t\t\t\t\t'iife',\n\t\t\t\t\t\tpackageJson.wpScriptExtraDependencies || [],\n\t\t\t\t\t\tfalse // Skip asset file for non-minified build\n\t\t\t\t\t),\n\t\t\t\t],\n\t\t\t} )\n\t\t);\n\n\t\tbuiltScripts.push( {\n\t\t\thandle: `${ handlePrefix }-${ packageName }`,\n\t\t\tpath: `${ packageName }/index`,\n\t\t\tasset: `${ packageName }/index.min.asset.php`,\n\t\t} );\n\t}\n\n\tif ( packageJson.wpScriptModuleExports ) {\n\t\tconst target = browserslistToEsbuild();\n\t\tconst rootBuildModuleDir = path.join(\n\t\t\tBUILD_DIR,\n\t\t\t'modules',\n\t\t\tpackageName\n\t\t);\n\n\t\tconst exports =\n\t\t\ttypeof packageJson.wpScriptModuleExports === 'string'\n\t\t\t\t? { '.': packageJson.wpScriptModuleExports }\n\t\t\t\t: packageJson.wpScriptModuleExports;\n\n\t\tfor ( const [ exportName, exportPath ] of Object.entries( exports ) ) {\n\t\t\tconst fileName =\n\t\t\t\texportName === '.'\n\t\t\t\t\t? 'index'\n\t\t\t\t\t: exportName.replace( /^\\.\\//, '' );\n\t\t\tconst entryPoint = path.join( packageDir, exportPath );\n\t\t\tconst baseFileName = path.basename( fileName );\n\n\t\t\tbuilds.push(\n\t\t\t\tesbuild.build( {\n\t\t\t\t\tentryPoints: [ entryPoint ],\n\t\t\t\t\toutfile: path.join(\n\t\t\t\t\t\trootBuildModuleDir,\n\t\t\t\t\t\t`${ fileName }.min.js`\n\t\t\t\t\t),\n\t\t\t\t\tbundle: true,\n\t\t\t\t\tsourcemap: true,\n\t\t\t\t\tformat: 'esm',\n\t\t\t\t\ttarget,\n\t\t\t\t\tplatform: 'browser',\n\t\t\t\t\tminify: true,\n\t\t\t\t\tdefine: getDefine( false ),\n\t\t\t\t\tplugins: [\n\t\t\t\t\t\twordpressExternalsPlugin(\n\t\t\t\t\t\t\t`${ baseFileName }.min`,\n\t\t\t\t\t\t\t'esm',\n\t\t\t\t\t\t\t[],\n\t\t\t\t\t\t\ttrue // Generate asset file for minified build\n\t\t\t\t\t\t),\n\t\t\t\t\t],\n\t\t\t\t} ),\n\t\t\t\tesbuild.build( {\n\t\t\t\t\tentryPoints: [ entryPoint ],\n\t\t\t\t\toutfile: path.join(\n\t\t\t\t\t\trootBuildModuleDir,\n\t\t\t\t\t\t`${ fileName }.js`\n\t\t\t\t\t),\n\t\t\t\t\tbundle: true,\n\t\t\t\t\tsourcemap: true,\n\t\t\t\t\tformat: 'esm',\n\t\t\t\t\ttarget,\n\t\t\t\t\tplatform: 'browser',\n\t\t\t\t\tminify: false,\n\t\t\t\t\tdefine: getDefine( true ),\n\t\t\t\t\tplugins: [\n\t\t\t\t\t\twordpressExternalsPlugin(\n\t\t\t\t\t\t\t`${ baseFileName }.min`,\n\t\t\t\t\t\t\t'esm',\n\t\t\t\t\t\t\t[],\n\t\t\t\t\t\t\tfalse // Skip asset file for non-minified build\n\t\t\t\t\t\t),\n\t\t\t\t\t],\n\t\t\t\t} )\n\t\t\t);\n\n\t\t\tconst scriptModuleId =\n\t\t\t\texportName === '.'\n\t\t\t\t\t? `@${ packageNamespace }/${ packageName }`\n\t\t\t\t\t: `@${ packageNamespace }/${ packageName }/${ fileName }`;\n\n\t\t\tbuiltModules.push( {\n\t\t\t\tid: scriptModuleId,\n\t\t\t\tpath: `${ packageName }/${ fileName }`,\n\t\t\t\tasset: `${ packageName }/${ fileName }.min.asset.php`,\n\t\t\t} );\n\t\t}\n\t}\n\n\tlet hasMainStyle = false;\n\tif ( packageJson.wpScript ) {\n\t\tconst buildStyleDir = path.join( packageDir, 'build-style' );\n\t\tconst outputDir = path.join( BUILD_DIR, 'styles', packageName );\n\n\t\tconst cssFiles = await glob(\n\t\t\tnormalizePath( path.join( buildStyleDir, '**/*.css' ) )\n\t\t);\n\n\t\tfor ( const cssFile of cssFiles ) {\n\t\t\tconst relativePath = path.relative( buildStyleDir, cssFile );\n\t\t\tconst destPath = path.join( outputDir, relativePath );\n\t\t\tconst destDir = path.dirname( destPath );\n\n\t\t\t// Track if this package has a main style.css for auto-registration\n\t\t\tif ( relativePath === 'style.css' ) {\n\t\t\t\thasMainStyle = true;\n\t\t\t}\n\n\t\t\t// Generate minified path: style.css -> style.min.css, style-rtl.css -> style-rtl.min.css\n\t\t\tconst minifiedPath = destPath.replace( /\\.css$/, '.min.css' );\n\n\t\t\t// Always produce both versions (like JavaScript does):\n\t\t\t// 1. Non-minified version (for SCRIPT_DEBUG=true)\n\t\t\t// 2. Minified version (for SCRIPT_DEBUG=false)\n\t\t\tbuilds.push(\n\t\t\t\t( async () => {\n\t\t\t\t\tawait mkdir( destDir, { recursive: true } );\n\t\t\t\t\tconst content = await readFile( cssFile, 'utf8' );\n\n\t\t\t\t\t// Write non-minified version\n\t\t\t\t\tawait writeFile( destPath, content );\n\n\t\t\t\t\t// Write minified version\n\t\t\t\t\tconst result = await postcss( [\n\t\t\t\t\t\tcssnano( {\n\t\t\t\t\t\t\tpreset: [\n\t\t\t\t\t\t\t\t'default',\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tdiscardComments: {\n\t\t\t\t\t\t\t\t\t\tremoveAll: true,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t} ),\n\t\t\t\t\t] ).process( content, {\n\t\t\t\t\t\tfrom: cssFile,\n\t\t\t\t\t\tto: minifiedPath,\n\t\t\t\t\t} );\n\t\t\t\t\tawait writeFile( minifiedPath, result.css );\n\t\t\t\t} )()\n\t\t\t);\n\t\t}\n\t}\n\n\tif ( packageJson.wpCopyFiles ) {\n\t\tconst { files, transforms = {} } = packageJson.wpCopyFiles;\n\t\tconst packageSourceDir = path.join( packageDir, 'src' );\n\t\tconst outputDir = path.join( BUILD_DIR, 'scripts', packageName );\n\n\t\tfor ( const filePattern of files ) {\n\t\t\tconst matchedFiles = await glob(\n\t\t\t\tnormalizePath( path.join( packageDir, filePattern ) )\n\t\t\t);\n\n\t\t\tfor ( const sourceFile of matchedFiles ) {\n\t\t\t\tconst relativePath = path.relative(\n\t\t\t\t\tpackageSourceDir,\n\t\t\t\t\tsourceFile\n\t\t\t\t);\n\t\t\t\tconst destPath = path.join( outputDir, relativePath );\n\t\t\t\tconst destDir = path.dirname( destPath );\n\n\t\t\t\tif ( sourceFile.endsWith( '.php' ) && transforms.php ) {\n\t\t\t\t\tbuilds.push(\n\t\t\t\t\t\t( async () => {\n\t\t\t\t\t\t\tlet finalPath = destPath;\n\t\t\t\t\t\t\tlet finalDir = destDir;\n\n\t\t\t\t\t\t\tconst content = await readFile(\n\t\t\t\t\t\t\t\tsourceFile,\n\t\t\t\t\t\t\t\t'utf8'\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tconst transformed = transformPhpContent(\n\t\t\t\t\t\t\t\tcontent,\n\t\t\t\t\t\t\t\ttransforms.php\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tif ( transforms.php.filenameSuffix ) {\n\t\t\t\t\t\t\t\tconst ext = path.extname( destPath );\n\t\t\t\t\t\t\t\tconst base = path.basename( destPath, ext );\n\t\t\t\t\t\t\t\tfinalPath = path.join(\n\t\t\t\t\t\t\t\t\tdestDir,\n\t\t\t\t\t\t\t\t\t`${ base }${ transforms.php.filenameSuffix }${ ext }`\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// Check if we should flatten index.php files\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\ttransforms.php.flattenIndexFiles &&\n\t\t\t\t\t\t\t\tpath.basename( sourceFile ) === 'index.php'\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t// Flatten: button/index.php \u2192 button.php\n\t\t\t\t\t\t\t\tconst parentDir = path.dirname( finalPath );\n\t\t\t\t\t\t\t\tconst blockName = path.basename( parentDir );\n\t\t\t\t\t\t\t\tfinalPath = path.join(\n\t\t\t\t\t\t\t\t\tpath.dirname( parentDir ),\n\t\t\t\t\t\t\t\t\t`${ blockName }.php`\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\tfinalDir = path.dirname( finalPath );\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tawait mkdir( finalDir, { recursive: true } );\n\t\t\t\t\t\t\tawait writeFile( finalPath, transformed );\n\t\t\t\t\t\t} )()\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tbuilds.push(\n\t\t\t\t\t\tmkdir( destDir, { recursive: true } ).then( () =>\n\t\t\t\t\t\t\tcopyFile( sourceFile, destPath )\n\t\t\t\t\t\t)\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( builds.length === 0 ) {\n\t\treturn false;\n\t}\n\n\tawait Promise.all( builds );\n\n\t// Collect style metadata after builds complete (so asset files exist)\n\t// Only register the main style.css file - complex cases handled manually in lib/client-assets.php\n\tif ( hasMainStyle ) {\n\t\t// Read script asset file to get dependencies\n\t\tconst scriptAssetPath = path.join(\n\t\t\tBUILD_DIR,\n\t\t\t'scripts',\n\t\t\tpackageName,\n\t\t\t'index.min.asset.php'\n\t\t);\n\n\t\tconst assetContent = await readFile( scriptAssetPath, 'utf8' );\n\t\tconst depsMatch = assetContent.match(\n\t\t\t/'dependencies' => array\\((.*?)\\)/s\n\t\t);\n\n\t\tlet scriptDependencies = [];\n\t\tif ( depsMatch ) {\n\t\t\tconst depsString = depsMatch[ 1 ];\n\t\t\tscriptDependencies =\n\t\t\t\tdepsString\n\t\t\t\t\t.match( /'([^']+)'/g )\n\t\t\t\t\t?.map( ( d ) => d.replace( /'/g, '' ) ) || [];\n\t\t}\n\n\t\tconst styleDeps = await inferStyleDependencies(\n\t\t\tscriptDependencies,\n\t\t\tpackageName\n\t\t);\n\n\t\tbuiltStyles.push( {\n\t\t\thandle: `${ handlePrefix }-${ packageName }`,\n\t\t\tpath: `${ packageName }/style`,\n\t\t\tdependencies: styleDeps,\n\t\t} );\n\t}\n\n\treturn {\n\t\tmodules: builtModules,\n\t\tscripts: builtScripts,\n\t\tstyles: builtStyles,\n\t};\n}\n\n/**\n * Infer style dependencies from script dependencies.\n * Only includes dependencies that:\n * 1. Are @wordpress packages (start with 'wp-')\n * 2. Have wpScript: true in their package.json\n * 3. Actually have a built style.css file\n *\n * @param {string[]} scriptDependencies Array of script handles from asset file.\n * @param {string} packageName Package name (short name) being bundled, for context-aware resolution.\n * @return {Promise<string[]>} Array of style handles to depend on.\n */\nasync function inferStyleDependencies( scriptDependencies, packageName ) {\n\tif ( ! scriptDependencies || scriptDependencies.length === 0 ) {\n\t\treturn [];\n\t}\n\n\tconst styleDeps = [];\n\t// Get the resolve directory for context-aware package resolution\n\tconst resolveDir = path.join( PACKAGES_DIR, packageName );\n\n\tfor ( const scriptHandle of scriptDependencies ) {\n\t\t// Skip non-package dependencies (like 'react', 'lodash', etc.)\n\t\tif ( ! scriptHandle.startsWith( 'wp-' ) ) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Convert handle to package name: 'wp-components' \u2192 '@wordpress/components'\n\t\tconst shortName = scriptHandle.replace( 'wp-', '' );\n\t\tconst depPackageName = `@wordpress/${ shortName }`;\n\n\t\t// Read the dependency's package.json with context-aware resolution\n\t\ttry {\n\t\t\tconst depPackageJson = getPackageInfo( depPackageName, resolveDir );\n\n\t\t\tif ( ! depPackageJson ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// ONLY include if it has wpScript: true (which means it builds styles)\n\t\t\tif ( depPackageJson.wpScript === true ) {\n\t\t\t\t// Double-check the style file actually exists\n\t\t\t\tconst styleFile = path.join(\n\t\t\t\t\tBUILD_DIR,\n\t\t\t\t\t'styles',\n\t\t\t\t\tshortName,\n\t\t\t\t\t'style.css'\n\t\t\t\t);\n\t\t\t\ttry {\n\t\t\t\t\tawait readFile( styleFile );\n\t\t\t\t\tstyleDeps.push( scriptHandle );\n\t\t\t\t} catch {\n\t\t\t\t\t// Style file doesn't exist, skip it\n\t\t\t\t}\n\t\t\t}\n\t\t} catch {\n\t\t\t// Package not found or can't read package.json - skip it\n\t\t\tcontinue;\n\t\t}\n\t}\n\n\treturn styleDeps;\n}\n\n/**\n * Generate PHP files for script module registration.\n *\n * @param {Array} modules Array of module info objects.\n * @param {Record<string, string>} replacements PHP template replacements.\n */\nasync function generateModuleRegistrationPhp( modules, replacements ) {\n\t// Generate modules array for registry\n\tconst modulesArray = modules\n\t\t.map(\n\t\t\t( module ) =>\n\t\t\t\t`\\tarray(\\n` +\n\t\t\t\t`\\t\\t'id' => '${ module.id }',\\n` +\n\t\t\t\t`\\t\\t'path' => '${ module.path }',\\n` +\n\t\t\t\t`\\t\\t'asset' => '${ module.asset }',\\n` +\n\t\t\t\t`\\t),`\n\t\t)\n\t\t.join( '\\n' );\n\n\tawait Promise.all( [\n\t\tgeneratePhpFromTemplate(\n\t\t\t'module-registry.php.template',\n\t\t\tpath.join( BUILD_DIR, 'modules', 'index.php' ),\n\t\t\t{ ...replacements, '{{MODULES}}': modulesArray }\n\t\t),\n\t\tgeneratePhpFromTemplate(\n\t\t\t'module-registration.php.template',\n\t\t\tpath.join( BUILD_DIR, 'modules.php' ),\n\t\t\treplacements\n\t\t),\n\t] );\n}\n\n/**\n * Generate PHP files for script registration.\n *\n * @param {Array} scripts Array of script info objects.\n * @param {Record<string, string>} replacements PHP template replacements.\n */\nasync function generateScriptRegistrationPhp( scripts, replacements ) {\n\t// Generate scripts array for registry\n\tconst scriptsArray = scripts\n\t\t.map(\n\t\t\t( script ) =>\n\t\t\t\t`\\tarray(\\n` +\n\t\t\t\t`\\t\\t'handle' => '${ script.handle }',\\n` +\n\t\t\t\t`\\t\\t'path' => '${ script.path }',\\n` +\n\t\t\t\t`\\t\\t'asset' => '${ script.asset }',\\n` +\n\t\t\t\t`\\t),`\n\t\t)\n\t\t.join( '\\n' );\n\n\tawait Promise.all( [\n\t\tgeneratePhpFromTemplate(\n\t\t\t'script-registry.php.template',\n\t\t\tpath.join( BUILD_DIR, 'scripts', 'index.php' ),\n\t\t\t{ ...replacements, '{{SCRIPTS}}': scriptsArray }\n\t\t),\n\t\tgeneratePhpFromTemplate(\n\t\t\t'script-registration.php.template',\n\t\t\tpath.join( BUILD_DIR, 'scripts.php' ),\n\t\t\treplacements\n\t\t),\n\t] );\n}\n\n/**\n * Generate PHP file for constants (version and build URL).\n *\n * @param {Record<string, string>} replacements PHP template replacements.\n */\nasync function generateConstantsPhp( replacements ) {\n\tawait generatePhpFromTemplate(\n\t\t'constants.php.template',\n\t\tpath.join( BUILD_DIR, 'constants.php' ),\n\t\treplacements\n\t);\n}\n\n/**\n * Generate PHP files for style registration.\n *\n * @param {Array} styles Array of style info objects.\n * @param {Record<string, string>} replacements PHP template replacements.\n */\nasync function generateStyleRegistrationPhp( styles, replacements ) {\n\t// Generate styles array for registry\n\tconst stylesArray = styles\n\t\t.map(\n\t\t\t( style ) =>\n\t\t\t\t`\\tarray(\\n` +\n\t\t\t\t`\\t\\t'handle' => '${ style.handle }',\\n` +\n\t\t\t\t`\\t\\t'path' => '${ style.path }',\\n` +\n\t\t\t\t`\\t\\t'dependencies' => array(${ style.dependencies\n\t\t\t\t\t.map( ( dep ) => `'${ dep }'` )\n\t\t\t\t\t.join( ', ' ) }),\\n` +\n\t\t\t\t`\\t),`\n\t\t)\n\t\t.join( '\\n' );\n\n\tawait Promise.all( [\n\t\tgeneratePhpFromTemplate(\n\t\t\t'style-registry.php.template',\n\t\t\tpath.join( BUILD_DIR, 'styles', 'index.php' ),\n\t\t\t{ ...replacements, '{{STYLES}}': stylesArray }\n\t\t),\n\t\tgeneratePhpFromTemplate(\n\t\t\t'style-registration.php.template',\n\t\t\tpath.join( BUILD_DIR, 'styles.php' ),\n\t\t\treplacements\n\t\t),\n\t] );\n}\n\n/**\n * Generate main index.php that loads both modules and scripts.\n *\n * @param {Record<string, string>} replacements PHP template replacements.\n */\nasync function generateMainIndexPhp( replacements ) {\n\tawait generatePhpFromTemplate(\n\t\t'index.php.template',\n\t\tpath.join( BUILD_DIR, 'index.php' ),\n\t\treplacements\n\t);\n}\n\n/**\n * Generate global route registry file.\n * Creates a single registry with all routes including page metadata.\n *\n * @param {Array} routes Array of route objects.\n * @param {Record<string, string>} replacements PHP template replacements.\n */\nasync function generateRoutesRegistry( routes, replacements ) {\n\tif ( routes.length === 0 ) {\n\t\t// No routes to register, skip generating routes registry\n\t\treturn;\n\t}\n\n\t// Generate PHP array entries with page metadata\n\tconst routeEntries = routes\n\t\t.map( ( route ) => {\n\t\t\tconst hasRouteStr = route.hasRoute ? 'true' : 'false';\n\t\t\tconst hasContentStr = route.hasContent ? 'true' : 'false';\n\t\t\treturn `\\tarray(\n\t\t'name' => '${ route.name }',\n\t\t'path' => '${ route.path }',\n\t\t'page' => '${ route.page }',\n\t\t'has_route' => ${ hasRouteStr },\n\t\t'has_content' => ${ hasContentStr },\n\t)`;\n\t\t} )\n\t\t.join( ',\\n' );\n\n\t// Generate single global registry at build/routes/index.php\n\tawait generatePhpFromTemplate(\n\t\t'route-registry.php.template',\n\t\tpath.join( BUILD_DIR, 'routes', 'index.php' ),\n\t\t{ ...replacements, '{{ROUTES}}': routeEntries }\n\t);\n}\n\n/**\n * Generate routes.php file with route registration logic.\n * Uses registry pattern with loop-based registration on page init hooks.\n *\n * @param {Array} routes Array of route objects.\n * @param {Record<string, string>} replacements PHP template replacements.\n */\nasync function generateRoutesPhp( routes, replacements ) {\n\tif ( routes.length === 0 ) {\n\t\t// No routes to register, skip generating routes.php\n\t\treturn;\n\t}\n\n\t// Generate routes.php from template\n\tawait generatePhpFromTemplate(\n\t\t'routes-registration.php.template',\n\t\tpath.join( BUILD_DIR, 'routes.php' ),\n\t\t{ ...replacements, '{{HANDLE_PREFIX}}': HANDLE_PREFIX }\n\t);\n}\n\n/**\n * Generate page-specific PHP files for all pages.\n *\n * @param {Array} pageData Array of page objects with routes.\n * @param {Record<string, string>} replacements PHP template replacements.\n */\nasync function generatePagesPhp( pageData, replacements ) {\n\tif ( pageData.length === 0 ) {\n\t\t// No pages to generate\n\t\treturn;\n\t}\n\n\t// Generate files for each page\n\tconst pageGenerationPromises = pageData.map( async ( page ) => {\n\t\t// Skip pages with no routes\n\t\tif ( page.routes.length === 0 ) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst pageSlugUnderscore = page.slug.replace( /-/g, '_' );\n\t\tconst prefixUnderscore = replacements[ '{{PREFIX}}' ].replace(\n\t\t\t/-/g,\n\t\t\t'_'\n\t\t);\n\n\t\t// Generate PHP code for init modules\n\t\tconst initModulesPhp =\n\t\t\tpage.initModules.length > 0\n\t\t\t\t? page.initModules\n\t\t\t\t\t\t.map(\n\t\t\t\t\t\t\t( moduleId ) =>\n\t\t\t\t\t\t\t\t`\\t\\t\\t$boot_dependencies[] = array( 'import' => 'static', 'id' => '${ moduleId }' );`\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.join( '\\n' )\n\t\t\t\t: '\\t\\t\\t// No init modules configured';\n\n\t\tconst templateReplacements = {\n\t\t\t...replacements,\n\t\t\t'{{PAGE_SLUG}}': page.slug,\n\t\t\t'{{PAGE_SLUG_UNDERSCORE}}': pageSlugUnderscore,\n\t\t\t'{{PREFIX}}': prefixUnderscore,\n\t\t\t'{{INIT_MODULES_PHP_ARRAY}}': initModulesPhp,\n\t\t\t'{{INIT_MODULES_JSON}}': JSON.stringify( page.initModules ),\n\t\t};\n\n\t\t// Generate both page.php and page-wp-admin.php\n\t\tawait Promise.all( [\n\t\t\tgeneratePhpFromTemplate(\n\t\t\t\t'page.php.template',\n\t\t\t\tpath.join( BUILD_DIR, 'pages', page.slug, 'page.php' ),\n\t\t\t\ttemplateReplacements\n\t\t\t),\n\t\t\tgeneratePhpFromTemplate(\n\t\t\t\t'page-wp-admin.php.template',\n\t\t\t\tpath.join( BUILD_DIR, 'pages', page.slug, 'page-wp-admin.php' ),\n\t\t\t\ttemplateReplacements\n\t\t\t),\n\t\t] );\n\n\t\t// Generate empty loader.js (dummy module for dependencies)\n\t\tawait writeFile(\n\t\t\tpath.join( BUILD_DIR, 'pages', page.slug, 'loader.js' ),\n\t\t\t'// Empty module loader for page dependencies\\n'\n\t\t);\n\t} );\n\n\tawait Promise.all( pageGenerationPromises );\n\n\t// Generate pages.php loader\n\tconst pageIncludes = pageData\n\t\t.map( ( page ) => {\n\t\t\treturn `require_once __DIR__ . '/pages/${ page.slug }/page.php';\\nrequire_once __DIR__ . '/pages/${ page.slug }/page-wp-admin.php';`;\n\t\t} )\n\t\t.join( '\\n' );\n\n\tawait generatePhpFromTemplate(\n\t\t'pages.php.template',\n\t\tpath.join( BUILD_DIR, 'pages.php' ),\n\t\t{ ...replacements, '{{PAGE_INCLUDES}}': pageIncludes }\n\t);\n}\n\n/**\n * Transpile a single package's source files and copy JSON files.\n *\n * @param {string} packageName Package name.\n * @return {Promise<number>} Build time in milliseconds.\n */\nasync function transpilePackage( packageName ) {\n\tconst startTime = Date.now();\n\tconst packageDir = path.join( PACKAGES_DIR, packageName );\n\tconst packageJson = getPackageInfoFromFile(\n\t\tpath.join( PACKAGES_DIR, packageName, 'package.json' )\n\t);\n\n\tif ( ! packageJson ) {\n\t\tthrow new Error(\n\t\t\t`Could not find package.json for package: ${ packageName }`\n\t\t);\n\t}\n\n\tconst srcFiles = await glob(\n\t\tnormalizePath(\n\t\t\tpath.join( packageDir, `src/**/*.${ SOURCE_EXTENSIONS }` )\n\t\t),\n\t\t{\n\t\t\tignore: IGNORE_PATTERNS,\n\t\t}\n\t);\n\n\tconst assetFiles = await glob(\n\t\tnormalizePath(\n\t\t\tpath.join( packageDir, `src/**/*.${ ASSET_EXTENSIONS }` )\n\t\t),\n\t\t{\n\t\t\tignore: IGNORE_PATTERNS,\n\t\t}\n\t);\n\n\tconst buildDir = path.join( packageDir, 'build' );\n\tconst buildModuleDir = path.join( packageDir, 'build-module' );\n\tconst srcDir = path.join( packageDir, 'src' );\n\tconst target = browserslistToEsbuild();\n\n\tconst builds = [];\n\n\t// Check if this is the components package that needs emotion babel plugin.\n\t// Ideally we should remove this exception and move away from emotion.\n\tconst needsEmotionPlugin = packageName === 'components';\n\tconst emotionPlugin = babel( {\n\t\tfilter: /\\.[jt]sx?$/,\n\t\tconfig: {\n\t\t\tplugins: [ '@emotion/babel-plugin' ],\n\t\t},\n\t} );\n\tconst externalizeAllExceptCssPlugin = {\n\t\tname: 'externalize-except-css',\n\t\tsetup( build ) {\n\t\t\t// Externalize all non-CSS imports\n\t\t\tbuild.onResolve( { filter: /.*/ }, async ( args ) => {\n\t\t\t\t// Skip recursive calls.\n\t\t\t\tif ( args.pluginData?.__fromExternalize ) {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\n\t\t\t\t// Skip entry points\n\t\t\t\tif ( args.kind === 'entry-point' ) {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\n\t\t\t\t// Let CSS/SCSS files be processed by sassPlugin\n\t\t\t\tif ( args.path.match( /\\.(css|scss)$/ ) ) {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\n\t\t\t\t// Fully resolve local dependencies without file extension\n\t\t\t\t// and replace the extension with the target extension.\n\t\t\t\tif ( args.path.startsWith( '.' ) ) {\n\t\t\t\t\tconst resolved = await build.resolve( args.path, {\n\t\t\t\t\t\tnamespace: args.namespace,\n\t\t\t\t\t\timporter: args.importer,\n\t\t\t\t\t\tkind: args.kind,\n\t\t\t\t\t\tresolveDir: args.resolveDir,\n\t\t\t\t\t\twith: args.with,\n\t\t\t\t\t\tpluginData: {\n\t\t\t\t\t\t\t...args.pluginData,\n\t\t\t\t\t\t\t__fromExternalize: true,\n\t\t\t\t\t\t},\n\t\t\t\t\t} );\n\n\t\t\t\t\tif ( resolved.errors.length > 0 ) {\n\t\t\t\t\t\treturn resolved;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Relativize path: make it relative to resolveDir with leading ./\n\t\t\t\t\tlet relativePath = normalizePath(\n\t\t\t\t\t\tpath.relative( args.resolveDir, resolved.path )\n\t\t\t\t\t);\n\t\t\t\t\tif ( ! relativePath.startsWith( '.' ) ) {\n\t\t\t\t\t\trelativePath = './' + relativePath;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Replace extension: make sure that file extension is always `.mjs` or `.cjs`.\n\t\t\t\t\tconst newExt =\n\t\t\t\t\t\tbuild.initialOptions.format === 'cjs' ? '.cjs' : '.mjs';\n\t\t\t\t\trelativePath = relativePath.replace( /\\.[jt]sx?$/, newExt );\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\tpath: relativePath,\n\t\t\t\t\t\texternal: true,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\t// Externalize everything else (keep imports as-is)\n\t\t\t\treturn { path: args.path, external: true };\n\t\t\t} );\n\t\t},\n\t};\n\tconst plugins = [\n\t\tneedsEmotionPlugin && emotionPlugin,\n\t\texternalizeAllExceptCssPlugin,\n\t\t...styleBundlingPlugins,\n\t].filter( Boolean );\n\n\tif ( packageJson.main ) {\n\t\tbuilds.push(\n\t\t\tesbuild.build( {\n\t\t\t\tentryPoints: srcFiles,\n\t\t\t\toutdir: buildDir,\n\t\t\t\toutbase: srcDir,\n\t\t\t\toutExtension: { '.js': '.cjs' },\n\t\t\t\tbundle: true,\n\t\t\t\tplatform: 'node',\n\t\t\t\tformat: 'cjs',\n\t\t\t\tsourcemap: true,\n\t\t\t\ttarget,\n\t\t\t\tjsx: 'automatic',\n\t\t\t\tjsxImportSource: 'react',\n\t\t\t\tloader: { '.js': 'jsx' },\n\t\t\t\tplugins,\n\t\t\t} )\n\t\t);\n\n\t\tfor ( const assetFile of assetFiles ) {\n\t\t\tconst relativePath = path.relative( srcDir, assetFile );\n\t\t\tconst destPath = path.join( buildDir, relativePath );\n\t\t\tconst destDir = path.dirname( destPath );\n\t\t\tbuilds.push(\n\t\t\t\tmkdir( destDir, { recursive: true } ).then( () =>\n\t\t\t\t\tcopyFile( assetFile, destPath )\n\t\t\t\t)\n\t\t\t);\n\t\t}\n\t}\n\n\tif ( packageJson.module ) {\n\t\tbuilds.push(\n\t\t\tesbuild.build( {\n\t\t\t\tentryPoints: srcFiles,\n\t\t\t\toutdir: buildModuleDir,\n\t\t\t\toutbase: srcDir,\n\t\t\t\toutExtension: { '.js': '.mjs' },\n\t\t\t\tbundle: true,\n\t\t\t\tplatform: 'neutral',\n\t\t\t\tformat: 'esm',\n\t\t\t\tsourcemap: true,\n\t\t\t\ttarget,\n\t\t\t\tjsx: 'automatic',\n\t\t\t\tjsxImportSource: 'react',\n\t\t\t\tloader: { '.js': 'jsx' },\n\t\t\t\tplugins,\n\t\t\t} )\n\t\t);\n\n\t\tfor ( const jsonFile of assetFiles ) {\n\t\t\tconst relativePath = path.relative( srcDir, jsonFile );\n\t\t\tconst destPath = path.join( buildModuleDir, relativePath );\n\t\t\tconst destDir = path.dirname( destPath );\n\t\t\tbuilds.push(\n\t\t\t\tmkdir( destDir, { recursive: true } ).then( () =>\n\t\t\t\t\tcopyFile( jsonFile, destPath )\n\t\t\t\t)\n\t\t\t);\n\t\t}\n\t}\n\n\tawait Promise.all( builds );\n\n\tawait compileStyles( packageName );\n\n\treturn Date.now() - startTime;\n}\n\n/**\n * Compile styles for a single package.\n *\n * Discovers and compiles SCSS entry points based on package configuration,\n * supporting wpStyleEntryPoints in package.json for custom entry point\n * patterns.\n *\n * @param {string} packageName Package name.\n * @return {Promise<number|null>} Build time in milliseconds, or null if no styles.\n */\nasync function compileStyles( packageName ) {\n\tconst packageDir = path.join( PACKAGES_DIR, packageName );\n\tconst packageJson = getPackageInfoFromFile(\n\t\tpath.join( PACKAGES_DIR, packageName, 'package.json' )\n\t);\n\n\t// Get SCSS entry point patterns from package.json, default to root-level only\n\tconst scssEntryPointPatterns = packageJson.wpStyleEntryPoints || [\n\t\t'src/*.scss',\n\t];\n\n\t// Find all matching SCSS files\n\tconst scssEntries = await glob(\n\t\tscssEntryPointPatterns.map( ( pattern ) =>\n\t\t\tnormalizePath( path.join( packageDir, pattern ) )\n\t\t)\n\t);\n\n\tif ( scssEntries.length === 0 ) {\n\t\treturn null;\n\t}\n\n\tconst startTime = Date.now();\n\tconst buildStyleDir = path.join( packageDir, 'build-style' );\n\tconst srcDir = path.join( packageDir, 'src' );\n\n\t// Process SCSS files\n\tawait Promise.all(\n\t\tscssEntries.map( async ( styleEntryPath ) => {\n\t\t\t// Calculate relative path from src/ to preserve directory structure\n\t\t\tconst relativePath = path.relative( srcDir, styleEntryPath );\n\t\t\tconst relativeDir = path.dirname( relativePath );\n\t\t\tconst entryName = path.basename( styleEntryPath, '.scss' );\n\n\t\t\tconst outputDir =\n\t\t\t\trelativeDir === '.'\n\t\t\t\t\t? buildStyleDir\n\t\t\t\t\t: path.join( buildStyleDir, relativeDir );\n\n\t\t\tawait mkdir( outputDir, { recursive: true } );\n\n\t\t\tawait esbuild.build( {\n\t\t\t\tentryPoints: [ styleEntryPath ],\n\t\t\t\toutdir: outputDir,\n\t\t\t\tbundle: true,\n\t\t\t\twrite: false,\n\t\t\t\tloader: {\n\t\t\t\t\t'.scss': 'css',\n\t\t\t\t},\n\t\t\t\tplugins: [\n\t\t\t\t\tsassPlugin( {\n\t\t\t\t\t\tembedded: true,\n\t\t\t\t\t\tloadPaths: [\n\t\t\t\t\t\t\t'node_modules',\n\t\t\t\t\t\t\tpath.join( PACKAGES_DIR, 'base-styles' ),\n\t\t\t\t\t\t],\n\t\t\t\t\t\tasync transform( source ) {\n\t\t\t\t\t\t\t// Process with autoprefixer for LTR version\n\t\t\t\t\t\t\tconst ltrResult = await postcss( [\n\t\t\t\t\t\t\t\tautoprefixer( { grid: true } ),\n\t\t\t\t\t\t\t] ).process( source, { from: undefined } );\n\n\t\t\t\t\t\t\t// Process with rtlcss for RTL version\n\t\t\t\t\t\t\tconst rtlResult = await postcss( [\n\t\t\t\t\t\t\t\trtlcss(),\n\t\t\t\t\t\t\t] ).process( ltrResult.css, { from: undefined } );\n\n\t\t\t\t\t\t\tawait Promise.all( [\n\t\t\t\t\t\t\t\twriteFile(\n\t\t\t\t\t\t\t\t\tpath.join(\n\t\t\t\t\t\t\t\t\t\toutputDir,\n\t\t\t\t\t\t\t\t\t\t`${ entryName }.css`\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\tltrResult.css\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\twriteFile(\n\t\t\t\t\t\t\t\t\tpath.join(\n\t\t\t\t\t\t\t\t\t\toutputDir,\n\t\t\t\t\t\t\t\t\t\t`${ entryName }-rtl.css`\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\trtlResult.css\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t] );\n\n\t\t\t\t\t\t\treturn '';\n\t\t\t\t\t\t},\n\t\t\t\t\t} ),\n\t\t\t\t],\n\t\t\t} );\n\t\t} )\n\t);\n\n\treturn Date.now() - startTime;\n}\n\n/**\n * Determine if a file is a source file in a package.\n *\n * @param {string} filename File path.\n * @return {boolean} True if the file is a package source file.\n */\nfunction isPackageSourceFile( filename ) {\n\tconst relativePath = normalizePath(\n\t\tpath.relative( process.cwd(), filename )\n\t);\n\n\tif ( ! /\\/src\\/.+/.test( relativePath ) ) {\n\t\treturn false;\n\t}\n\n\tif ( TEST_FILE_PATTERNS.some( ( regex ) => regex.test( relativePath ) ) ) {\n\t\treturn false;\n\t}\n\n\treturn PACKAGES.some( ( packageName ) => {\n\t\tconst packagePath = normalizePath(\n\t\t\tpath.join( 'packages', packageName )\n\t\t);\n\t\treturn relativePath.startsWith( packagePath + '/' );\n\t} );\n}\n\n/**\n * Get the package name from a file path.\n *\n * @param {string} filename File path.\n * @return {string|null} Package name or null if not found.\n */\nfunction getPackageName( filename ) {\n\tconst relativePath = normalizePath(\n\t\tpath.relative( process.cwd(), filename )\n\t);\n\n\tfor ( const packageName of PACKAGES ) {\n\t\tconst packagePath = normalizePath(\n\t\t\tpath.join( 'packages', packageName )\n\t\t);\n\t\tif ( relativePath.startsWith( packagePath + '/' ) ) {\n\t\t\treturn packageName;\n\t\t}\n\t}\n\treturn null;\n}\n\n/**\n * Build a single route's files.\n *\n * @param {string} routeName Route name.\n * @return {Promise<number>} Build time in milliseconds.\n */\nasync function buildRoute( routeName ) {\n\tconst startTime = Date.now();\n\tconst routeDir = path.join( ROOT_DIR, 'routes', routeName );\n\tconst outputDir = path.join( BUILD_DIR, 'routes', routeName );\n\n\t// Ensure output directory exists\n\tawait mkdir( outputDir, { recursive: true } );\n\n\t// Copy package.json\n\tawait copyFile(\n\t\tpath.join( routeDir, 'package.json' ),\n\t\tpath.join( outputDir, 'package.json' )\n\t);\n\n\tconst files = getRouteFiles( routeDir );\n\n\t// Build route.js if it exists\n\tif ( files.hasRoute ) {\n\t\tconst routeEntryPoints = await glob( `route.${ SOURCE_EXTENSIONS }`, {\n\t\t\tcwd: routeDir,\n\t\t\tabsolute: true,\n\t\t} );\n\n\t\tif ( routeEntryPoints.length > 0 ) {\n\t\t\t// Build both minified and non-minified versions in parallel\n\t\t\tawait Promise.all( [\n\t\t\t\tesbuild.build( {\n\t\t\t\t\tentryPoints: routeEntryPoints,\n\t\t\t\t\toutfile: path.join( outputDir, 'route.min.js' ),\n\t\t\t\t\tbundle: true,\n\t\t\t\t\tformat: 'esm',\n\t\t\t\t\ttarget: browserslistToEsbuild(),\n\t\t\t\t\tminify: true,\n\t\t\t\t\tdefine: getDefine( false ),\n\t\t\t\t\tplugins: [\n\t\t\t\t\t\twordpressExternalsPlugin(\n\t\t\t\t\t\t\t'route.min',\n\t\t\t\t\t\t\t'esm',\n\t\t\t\t\t\t\t[],\n\t\t\t\t\t\t\ttrue // Generate asset file for minified build\n\t\t\t\t\t\t),\n\t\t\t\t\t],\n\t\t\t\t} ),\n\t\t\t\tesbuild.build( {\n\t\t\t\t\tentryPoints: routeEntryPoints,\n\t\t\t\t\toutfile: path.join( outputDir, 'route.js' ),\n\t\t\t\t\tbundle: true,\n\t\t\t\t\tformat: 'esm',\n\t\t\t\t\ttarget: browserslistToEsbuild(),\n\t\t\t\t\tminify: false,\n\t\t\t\t\tdefine: getDefine( true ),\n\t\t\t\t\tplugins: [\n\t\t\t\t\t\twordpressExternalsPlugin(\n\t\t\t\t\t\t\t'route.min',\n\t\t\t\t\t\t\t'esm',\n\t\t\t\t\t\t\t[],\n\t\t\t\t\t\t\tfalse // Skip asset file for non-minified build\n\t\t\t\t\t\t),\n\t\t\t\t\t],\n\t\t\t\t} ),\n\t\t\t] );\n\t\t}\n\t}\n\n\t// Build content.js if stage, inspector, or canvas exists\n\tif ( files.hasStage || files.hasInspector || files.hasCanvas ) {\n\t\t// Create synthetic entry point\n\t\tconst syntheticEntry = generateContentEntryPoint( files );\n\t\tconst tempEntryPath = path.join( routeDir, '.content-entry.js' );\n\n\t\t// Write temporary entry file\n\t\tawait writeFile( tempEntryPath, syntheticEntry );\n\n\t\t// Build both minified and non-minified versions in parallel\n\t\tawait Promise.all( [\n\t\t\tesbuild.build( {\n\t\t\t\tentryPoints: [ tempEntryPath ],\n\t\t\t\toutfile: path.join( outputDir, 'content.min.js' ),\n\t\t\t\tbundle: true,\n\t\t\t\tformat: 'esm',\n\t\t\t\ttarget: browserslistToEsbuild(),\n\t\t\t\tminify: true,\n\t\t\t\tdefine: getDefine( false ),\n\t\t\t\tplugins: [\n\t\t\t\t\twordpressExternalsPlugin(\n\t\t\t\t\t\t'content.min',\n\t\t\t\t\t\t'esm',\n\t\t\t\t\t\t[],\n\t\t\t\t\t\ttrue // Generate asset file for minified build\n\t\t\t\t\t),\n\t\t\t\t\t...styleBundlingPlugins,\n\t\t\t\t],\n\t\t\t} ),\n\t\t\tesbuild.build( {\n\t\t\t\tentryPoints: [ tempEntryPath ],\n\t\t\t\toutfile: path.join( outputDir, 'content.js' ),\n\t\t\t\tbundle: true,\n\t\t\t\tformat: 'esm',\n\t\t\t\ttarget: browserslistToEsbuild(),\n\t\t\t\tminify: false,\n\t\t\t\tdefine: getDefine( true ),\n\t\t\t\tplugins: [\n\t\t\t\t\twordpressExternalsPlugin(\n\t\t\t\t\t\t'content.min',\n\t\t\t\t\t\t'esm',\n\t\t\t\t\t\t[],\n\t\t\t\t\t\tfalse // Skip asset file for non-minified build\n\t\t\t\t\t),\n\t\t\t\t\t...styleBundlingPlugins,\n\t\t\t\t],\n\t\t\t} ),\n\t\t] );\n\n\t\tawait unlink( tempEntryPath );\n\t}\n\n\treturn Date.now() - startTime;\n}\n\n/**\n * Build all discovered routes.\n *\n * @return {Promise<void>}\n */\nasync function buildAllRoutes() {\n\tconsole.log( '\\n\uD83D\uDEA6 Phase 3: Building routes...\\n' );\n\n\tconst routes = getAllRoutes( ROOT_DIR );\n\n\tif ( routes.length === 0 ) {\n\t\tconsole.log( ' No routes found, skipping.\\n' );\n\t\treturn;\n\t}\n\n\tawait Promise.all(\n\t\troutes.map( async ( routeName ) => {\n\t\t\tconst buildTime = await buildRoute( routeName );\n\t\t\tconsole.log(\n\t\t\t\t` \u2714 Built route ${ routeName } (${ buildTime }ms)`\n\t\t\t);\n\t\t} )\n\t);\n}\n\n/**\n * Main build function.\n *\n * @param {string?} baseUrlExpression\n */\nasync function buildAll( baseUrlExpression ) {\n\tconsole.log( '\uD83D\uDD28 Building packages...\\n' );\n\n\tconst startTime = Date.now();\n\n\t// Build maps: short name \u2194 full name \u2194 package.json from package.json files\n\tconst shortToFull = new Map();\n\tconst fullToShort = new Map();\n\tconst fullToPackageJson = new Map();\n\tfor ( const pkg of PACKAGES ) {\n\t\tconst packageJson = getPackageInfoFromFile(\n\t\t\tpath.join( PACKAGES_DIR, pkg, 'package.json' )\n\t\t);\n\t\tshortToFull.set( pkg, packageJson.name );\n\t\tfullToShort.set( packageJson.name, pkg );\n\t\tfullToPackageJson.set( packageJson.name, packageJson );\n\t}\n\n\tconst levels = groupByDepth( fullToPackageJson );\n\n\tconsole.log( '\uD83D\uDCDD Phase 1: Transpiling packages...\\n' );\n\n\tfor ( const level of levels ) {\n\t\tawait Promise.all(\n\t\t\tlevel.map( async ( fullName ) => {\n\t\t\t\tconst packageName = fullToShort.get( fullName );\n\t\t\t\tconst buildTime = await transpilePackage( packageName );\n\t\t\t\tconsole.log(\n\t\t\t\t\t` \u2714 Transpiled ${ packageName } (${ buildTime }ms)`\n\t\t\t\t);\n\t\t\t} )\n\t\t);\n\t}\n\n\tconsole.log( '\\n\uD83D\uDCE6 Phase 2: Bundling packages...\\n' );\n\tconst modules = [];\n\tconst scripts = [];\n\tconst styles = [];\n\tawait Promise.all(\n\t\tPACKAGES.map( async ( packageName ) => {\n\t\t\tconst startBundleTime = Date.now();\n\t\t\tconst ret = await bundlePackage( packageName );\n\t\t\tconst buildTime = Date.now() - startBundleTime;\n\t\t\tif ( ret ) {\n\t\t\t\tconsole.log(\n\t\t\t\t\t` \u2714 Bundled ${ packageName } (${ buildTime }ms)`\n\t\t\t\t);\n\n\t\t\t\tif ( ret.modules ) {\n\t\t\t\t\tmodules.push( ...ret.modules );\n\t\t\t\t}\n\t\t\t\tif ( ret.scripts ) {\n\t\t\t\t\tscripts.push( ...ret.scripts );\n\t\t\t\t}\n\t\t\t\tif ( ret.styles ) {\n\t\t\t\t\tstyles.push( ...ret.styles );\n\t\t\t\t}\n\t\t\t}\n\t\t} )\n\t);\n\n\t// Build routes\n\tawait buildAllRoutes();\n\n\t// Collect route and page data for PHP generation\n\t// Use flatMap to expand routes with multiple pages into separate entries\n\tconst routes = getAllRoutes( ROOT_DIR ).flatMap( ( routeName ) => {\n\t\tconst metadata = getRouteMetadata( ROOT_DIR, routeName );\n\n\t\t// Skip routes without pages\n\t\tif ( ! metadata || ! metadata.pages || metadata.pages.length === 0 ) {\n\t\t\treturn [];\n\t\t}\n\t\tconst routeFiles = getRouteFiles(\n\t\t\tpath.join( ROOT_DIR, 'routes', routeName )\n\t\t);\n\n\t\t// Create a route entry for each page\n\t\treturn metadata.pages.map( ( page ) => {\n\t\t\treturn {\n\t\t\t\tname: routeName,\n\t\t\t\tpath: metadata.path,\n\t\t\t\tpage,\n\t\t\t\thasRoute: routeFiles.hasRoute,\n\t\t\t\thasContent: routeFiles.hasStage || routeFiles.hasInspector,\n\t\t\t};\n\t\t} );\n\t} );\n\n\t// Normalize PAGES config to support both string and object formats\n\tconst normalizedPages = PAGES.map( ( page ) => {\n\t\tif ( typeof page === 'string' ) {\n\t\t\treturn { id: page, init: [], title: undefined };\n\t\t}\n\t\treturn {\n\t\t\tid: page.id,\n\t\t\tinit: page.init || [],\n\t\t\ttitle: page.title || undefined,\n\t\t};\n\t} );\n\n\tconst pageData = normalizedPages.map( ( page ) => {\n\t\tconst pageRoutes = routes.filter( ( r ) => r.page === page.id );\n\t\treturn {\n\t\t\tslug: page.id,\n\t\t\troutes: pageRoutes,\n\t\t\tinitModules: page.init,\n\t\t\ttitle: page.title,\n\t\t};\n\t} );\n\n\t// Bundle boot, route, and theme packages from node_modules when pages exist\n\tif ( pageData.length > 0 ) {\n\t\ttry {\n\t\t\tconst { createRequire } = await import( 'module' );\n\t\t\tconst require = createRequire( import.meta.url );\n\n\t\t\t// Resolve the @wordpress packages directory from node_modules\n\t\t\tconst bootPackageJson = require.resolve(\n\t\t\t\t'@wordpress/boot/package.json',\n\t\t\t\t{ paths: [ ROOT_DIR ] }\n\t\t\t);\n\t\t\tconst wordpressPackagesDir = path.dirname(\n\t\t\t\tpath.dirname( bootPackageJson )\n\t\t\t);\n\n\t\t\t// Bundle boot, route, theme, and private-apis packages\n\t\t\tconst externalPackages = [\n\t\t\t\t'boot',\n\t\t\t\t'route',\n\t\t\t\t'theme',\n\t\t\t\t'private-apis',\n\t\t\t];\n\t\t\tfor ( const pkgName of externalPackages ) {\n\t\t\t\tconst result = await bundlePackage( pkgName, {\n\t\t\t\t\tsourceDir: wordpressPackagesDir,\n\t\t\t\t\thandlePrefix: 'wp',\n\t\t\t\t\tscriptGlobal: 'wp',\n\t\t\t\t\tpackageNamespace: 'wordpress',\n\t\t\t\t} );\n\n\t\t\t\tif ( result && result.modules ) {\n\t\t\t\t\tmodules.push( ...result.modules );\n\t\t\t\t}\n\t\t\t\tif ( result && result.scripts ) {\n\t\t\t\t\tscripts.push( ...result.scripts );\n\t\t\t\t}\n\t\t\t}\n\t\t} catch ( error ) {\n\t\t\tconsole.warn(\n\t\t\t\t'\\n\u26A0\uFE0F Warning: Could not bundle WordPress packages for pages:',\n\t\t\t\terror.message\n\t\t\t);\n\t\t}\n\t}\n\n\tconsole.log( '\\n\uD83D\uDCC4 Generating PHP registration files...\\n' );\n\tconst phpReplacements = await getPhpReplacements(\n\t\tROOT_DIR,\n\t\tbaseUrlExpression\n\t);\n\tawait Promise.all( [\n\t\tgenerateMainIndexPhp( phpReplacements ),\n\t\tgenerateModuleRegistrationPhp( modules, phpReplacements ),\n\t\tgenerateScriptRegistrationPhp( scripts, phpReplacements ),\n\t\tgenerateStyleRegistrationPhp( styles, phpReplacements ),\n\t\tgenerateConstantsPhp( phpReplacements ),\n\t\tgenerateRoutesRegistry( routes, phpReplacements ),\n\t\tgenerateRoutesPhp( routes, phpReplacements ),\n\t\tgeneratePagesPhp( pageData, phpReplacements ),\n\t] );\n\tconsole.log( ' \u2714 Generated build/modules.php' );\n\tconsole.log( ' \u2714 Generated build/modules/index.php' );\n\tconsole.log( ' \u2714 Generated build/scripts.php' );\n\tconsole.log( ' \u2714 Generated build/scripts/index.php' );\n\tconsole.log( ' \u2714 Generated build/styles.php' );\n\tconsole.log( ' \u2714 Generated build/styles/index.php' );\n\tconsole.log( ' \u2714 Generated build/version.php' );\n\tconsole.log( ' \u2714 Generated build/routes.php' );\n\tif ( pageData.length > 0 ) {\n\t\tconsole.log( ' \u2714 Generated build/pages.php' );\n\t\tfor ( const page of pageData ) {\n\t\t\tconsole.log(\n\t\t\t\t` \u2714 Generated build/pages/${ page.slug }/page.php`\n\t\t\t);\n\t\t\tconsole.log(\n\t\t\t\t` \u2714 Generated build/pages/${ page.slug }/page-wp-admin.php`\n\t\t\t);\n\t\t}\n\t}\n\tconsole.log( ' \u2714 Generated build/index.php' );\n\n\tconst totalTime = Date.now() - startTime;\n\tconsole.log(\n\t\t`\\n\uD83C\uDF89 All packages built successfully! (${ totalTime }ms total)`\n\t);\n}\n\n/**\n * Watch mode for development.\n */\nasync function watchMode() {\n\tlet isRebuilding = false;\n\tconst needsRebuild = new Set();\n\n\t// Build maps: short name \u2194 full name \u2194 package.json from package.json files (once)\n\tconst shortToFull = new Map();\n\tconst fullToShort = new Map();\n\tconst fullToPackageJson = new Map();\n\tfor ( const pkg of PACKAGES ) {\n\t\tconst packageJson = getPackageInfoFromFile(\n\t\t\tpath.join( PACKAGES_DIR, pkg, 'package.json' )\n\t\t);\n\t\tshortToFull.set( pkg, packageJson.name );\n\t\tfullToShort.set( packageJson.name, pkg );\n\t\tfullToPackageJson.set( packageJson.name, packageJson );\n\t}\n\n\t// Get all routes for dependency tracking\n\tconst allRoutes = getAllRoutes( ROOT_DIR );\n\n\t/**\n\t * Rebuild a package and any affected scripts/modules.\n\t *\n\t * @param {string} packageName Package to rebuild (short name).\n\t */\n\tasync function rebuildPackage( packageName ) {\n\t\ttry {\n\t\t\tconst startTime = Date.now();\n\n\t\t\tawait transpilePackage( packageName );\n\t\t\tawait bundlePackage( packageName );\n\n\t\t\tconst buildTime = Date.now() - startTime;\n\t\t\tconsole.log( `\u2705 ${ packageName } (${ buildTime }ms)` );\n\n\t\t\tconst fullName = shortToFull.get( packageName );\n\t\t\tconst affectedScripts = findScriptsToRebundle(\n\t\t\t\tfullName,\n\t\t\t\tfullToPackageJson\n\t\t\t);\n\n\t\t\tfor ( const fullScript of affectedScripts ) {\n\t\t\t\tconst script = fullToShort.get( fullScript );\n\t\t\t\ttry {\n\t\t\t\t\tconst rebundleStartTime = Date.now();\n\t\t\t\t\tawait compileStyles( script );\n\t\t\t\t\tawait bundlePackage( script );\n\t\t\t\t\tconst rebundleTime = Date.now() - rebundleStartTime;\n\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t`\u2705 ${ script } (rebundled) (${ rebundleTime }ms)`\n\t\t\t\t\t);\n\t\t\t\t} catch ( error ) {\n\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t`\u274C ${ script } - Rebundle error: ${ error.message }`\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Find and rebuild affected routes\n\t\t\tconst affectedRoutes = findRoutesToRebuild(\n\t\t\t\tfullName,\n\t\t\t\tfullToPackageJson,\n\t\t\t\tROOT_DIR,\n\t\t\t\tallRoutes\n\t\t\t);\n\n\t\t\tfor ( const route of affectedRoutes ) {\n\t\t\t\ttry {\n\t\t\t\t\tconst rebuildStartTime = Date.now();\n\t\t\t\t\tawait buildRoute( route );\n\t\t\t\t\tconst rebuildTime = Date.now() - rebuildStartTime;\n\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t`\u2705 routes/${ route } (rebuilt) (${ rebuildTime }ms)`\n\t\t\t\t\t);\n\t\t\t\t} catch ( error ) {\n\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t`\u274C routes/${ route } - Rebuild error: ${ error.message }`\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t} catch ( error ) {\n\t\t\tconsole.log( `\u274C ${ packageName } - Error: ${ error.message }` );\n\t\t}\n\t}\n\n\t/**\n\t * Rebuild a route.\n\t *\n\t * @param {string} routeName Route to rebuild.\n\t */\n\tasync function rebuildRoute( routeName ) {\n\t\ttry {\n\t\t\tconst startTime = Date.now();\n\t\t\tawait buildRoute( routeName );\n\t\t\tconst buildTime = Date.now() - startTime;\n\t\t\tconsole.log( `\u2705 routes/${ routeName } (${ buildTime }ms)` );\n\t\t} catch ( error ) {\n\t\t\tconsole.log(\n\t\t\t\t`\u274C routes/${ routeName } - Error: ${ error.message }`\n\t\t\t);\n\t\t}\n\t}\n\n\tasync function processNextRebuild() {\n\t\tif ( needsRebuild.size === 0 ) {\n\t\t\tisRebuilding = false;\n\t\t\treturn;\n\t\t}\n\n\t\tconst itemsToRebuild = Array.from( needsRebuild );\n\t\tneedsRebuild.clear();\n\n\t\tfor ( const item of itemsToRebuild ) {\n\t\t\t// Check if it's a route (prefixed with 'route:')\n\t\t\tif ( item.startsWith( 'route:' ) ) {\n\t\t\t\tconst routeName = item.slice( 6 ); // Remove 'route:' prefix\n\t\t\t\tawait rebuildRoute( routeName );\n\t\t\t} else {\n\t\t\t\tawait rebuildPackage( item );\n\t\t\t}\n\t\t}\n\n\t\tawait processNextRebuild();\n\t}\n\n\tconst watchPaths = PACKAGES.map( ( packageName ) =>\n\t\tpath.join( PACKAGES_DIR, packageName, 'src' )\n\t);\n\n\tconst watcher = chokidar.watch( watchPaths, {\n\t\tignored: [\n\t\t\t'**/{__mocks__,__tests__,test,storybook,stories}/**',\n\t\t\t'**/*.{spec,test}.{js,ts,tsx}',\n\t\t\t'**/*.native.*',\n\t\t],\n\t\tpersistent: true,\n\t\tignoreInitial: true,\n\t\t// Reduce file descriptor usage on macOS\n\t\tuseFsEvents: true,\n\t\tdepth: 10,\n\t\tawaitWriteFinish: {\n\t\t\tstabilityThreshold: 100,\n\t\t\tpollInterval: 50,\n\t\t},\n\t} );\n\n\twatcher.on( 'error', ( error ) => {\n\t\tif ( error.code === 'EMFILE' ) {\n\t\t\tconsole.error(\n\t\t\t\t'\\n\u274C Too many open files. Try increasing the limit:\\n' +\n\t\t\t\t\t' Run: ulimit -n 10240\\n' +\n\t\t\t\t\t' Or add to ~/.zshrc: ulimit -n 10240\\n'\n\t\t\t);\n\t\t\tprocess.exit( 1 );\n\t\t}\n\t\tconsole.error( '\u274C Watcher error:', error );\n\t} );\n\n\tconst handleFileChange = async ( filename ) => {\n\t\tif ( ! isPackageSourceFile( filename ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst packageName = getPackageName( filename );\n\t\tif ( ! packageName ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( isRebuilding ) {\n\t\t\tneedsRebuild.add( packageName );\n\t\t\treturn;\n\t\t}\n\n\t\tisRebuilding = true;\n\t\tawait rebuildPackage( packageName );\n\t\tawait processNextRebuild();\n\t};\n\n\twatcher.on( 'change', handleFileChange );\n\twatcher.on( 'add', handleFileChange );\n\twatcher.on( 'unlink', handleFileChange );\n\n\t// Watch route files if routes exist\n\tif ( allRoutes.length > 0 ) {\n\t\tconst routeWatchPaths = allRoutes.map( ( routeName ) =>\n\t\t\tpath.join( ROOT_DIR, 'routes', routeName )\n\t\t);\n\n\t\tconst routeWatcher = chokidar.watch( routeWatchPaths, {\n\t\t\tpersistent: true,\n\t\t\tignoreInitial: true,\n\t\t\tignored: ( filepath ) => {\n\t\t\t\tconst basename = path.basename( filepath );\n\t\t\t\t// Ignore .content-entry.js temporary build files\n\t\t\t\tif ( basename === '.content-entry.js' ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\t// Ignore node_modules directories and contents\n\t\t\t\tif ( filepath.includes( 'node_modules' ) ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t},\n\t\t\tuseFsEvents: true,\n\t\t\tdepth: 10,\n\t\t\tawaitWriteFinish: {\n\t\t\t\tstabilityThreshold: 100,\n\t\t\t\tpollInterval: 50,\n\t\t\t},\n\t\t} );\n\n\t\trouteWatcher.on( 'error', ( error ) => {\n\t\t\tconsole.error( '\u274C Route watcher error:', error );\n\t\t} );\n\n\t\tconst handleRouteFileChange = async ( filename ) => {\n\t\t\t// Extract route name from path: routes/{routeName}/...\n\t\t\tconst routeMatch = filename.match( /routes[/\\\\]([^/\\\\]+)[/\\\\]/ );\n\t\t\tif ( ! routeMatch ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst routeName = routeMatch[ 1 ];\n\t\t\tif ( ! allRoutes.includes( routeName ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( isRebuilding ) {\n\t\t\t\tneedsRebuild.add( `route:${ routeName }` );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tisRebuilding = true;\n\t\t\tawait rebuildRoute( routeName );\n\t\t\tawait processNextRebuild();\n\t\t};\n\n\t\trouteWatcher.on( 'change', handleRouteFileChange );\n\t\trouteWatcher.on( 'add', handleRouteFileChange );\n\t\trouteWatcher.on( 'unlink', handleRouteFileChange );\n\t}\n}\n\n/**\n * Main entry point.\n */\nasync function main() {\n\tconst { values } = parseArgs( {\n\t\toptions: {\n\t\t\twatch: {\n\t\t\t\ttype: 'boolean',\n\t\t\t\tshort: 'w',\n\t\t\t\tdefault: false,\n\t\t\t},\n\t\t\t'base-url': {\n\t\t\t\ttype: 'string',\n\t\t\t\tdefault: 'plugin_dir_url( __FILE__ )',\n\t\t\t},\n\t\t},\n\t} );\n\n\tconst baseUrlExpression = values[ 'base-url' ];\n\n\tawait buildAll( baseUrlExpression );\n\n\tif ( values.watch ) {\n\t\tconsole.log( '\\n\uD83D\uDC40 Watching for changes...\\n' );\n\t\tawait watchMode();\n\t}\n}\n\nmain().catch( ( error ) => {\n\tconsole.error( '\u274C Build failed:', error );\n\tprocess.exit( 1 );\n} );\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["require"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
// packages/wp-build/src/dependency-graph.mjs
|
|
2
|
+
import path from "path";
|
|
3
|
+
import { getPackageInfoFromFile } from "./package-utils.mjs";
|
|
4
|
+
function isScriptOrModule(packageJson) {
|
|
5
|
+
if (!packageJson) {
|
|
6
|
+
return false;
|
|
7
|
+
}
|
|
8
|
+
return !!(packageJson.wpScript || packageJson.wpScriptModuleExports);
|
|
9
|
+
}
|
|
10
|
+
function getDependencies(packageJson) {
|
|
11
|
+
if (!packageJson) {
|
|
12
|
+
return [];
|
|
13
|
+
}
|
|
14
|
+
const deps = packageJson.dependencies || {};
|
|
15
|
+
return Object.keys(deps);
|
|
16
|
+
}
|
|
17
|
+
function groupByDepth(packages) {
|
|
18
|
+
const packagesSet = new Set(packages.keys());
|
|
19
|
+
const depths = /* @__PURE__ */ new Map();
|
|
20
|
+
const visited = /* @__PURE__ */ new Set();
|
|
21
|
+
function calculateDepth(packageName) {
|
|
22
|
+
if (depths.has(packageName)) {
|
|
23
|
+
return depths.get(packageName);
|
|
24
|
+
}
|
|
25
|
+
if (visited.has(packageName)) {
|
|
26
|
+
return 0;
|
|
27
|
+
}
|
|
28
|
+
visited.add(packageName);
|
|
29
|
+
const packageJson = packages.get(packageName);
|
|
30
|
+
const deps = getDependencies(packageJson);
|
|
31
|
+
const relevantDeps = deps.filter((dep) => packagesSet.has(dep));
|
|
32
|
+
if (relevantDeps.length === 0) {
|
|
33
|
+
depths.set(packageName, 0);
|
|
34
|
+
return 0;
|
|
35
|
+
}
|
|
36
|
+
const maxDepth2 = Math.max(
|
|
37
|
+
...relevantDeps.map((dep) => calculateDepth(dep))
|
|
38
|
+
);
|
|
39
|
+
const depth = maxDepth2 + 1;
|
|
40
|
+
depths.set(packageName, depth);
|
|
41
|
+
return depth;
|
|
42
|
+
}
|
|
43
|
+
for (const packageName of packages.keys()) {
|
|
44
|
+
calculateDepth(packageName);
|
|
45
|
+
}
|
|
46
|
+
const levels = [];
|
|
47
|
+
const maxDepth = Math.max(...depths.values());
|
|
48
|
+
for (let depth = 0; depth <= maxDepth; depth++) {
|
|
49
|
+
const packagesAtDepth = Array.from(packages.keys()).filter(
|
|
50
|
+
(pkg) => depths.get(pkg) === depth
|
|
51
|
+
);
|
|
52
|
+
if (packagesAtDepth.length > 0) {
|
|
53
|
+
levels.push(packagesAtDepth);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return levels;
|
|
57
|
+
}
|
|
58
|
+
function getReverseDependencies(packageName, workspacePackages) {
|
|
59
|
+
const dependents = [];
|
|
60
|
+
for (const [pkg, packageJson] of workspacePackages) {
|
|
61
|
+
const deps = getDependencies(packageJson);
|
|
62
|
+
if (deps.includes(packageName)) {
|
|
63
|
+
dependents.push(pkg);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return dependents;
|
|
67
|
+
}
|
|
68
|
+
function findScriptsToRebundle(changedPackage, workspacePackages) {
|
|
69
|
+
const changedPackageJson = workspacePackages.get(changedPackage);
|
|
70
|
+
if (isScriptOrModule(changedPackageJson)) {
|
|
71
|
+
return [];
|
|
72
|
+
}
|
|
73
|
+
const scriptsToRebundle = /* @__PURE__ */ new Set();
|
|
74
|
+
const visited = /* @__PURE__ */ new Set();
|
|
75
|
+
const queue = [changedPackage];
|
|
76
|
+
while (queue.length > 0) {
|
|
77
|
+
const currentPackage = queue.shift();
|
|
78
|
+
if (!currentPackage || visited.has(currentPackage)) {
|
|
79
|
+
continue;
|
|
80
|
+
}
|
|
81
|
+
visited.add(currentPackage);
|
|
82
|
+
const dependents = getReverseDependencies(
|
|
83
|
+
currentPackage,
|
|
84
|
+
workspacePackages
|
|
85
|
+
);
|
|
86
|
+
for (const dependent of dependents) {
|
|
87
|
+
const dependentPackageJson = workspacePackages.get(dependent);
|
|
88
|
+
if (isScriptOrModule(dependentPackageJson)) {
|
|
89
|
+
scriptsToRebundle.add(dependent);
|
|
90
|
+
} else if (!visited.has(dependent)) {
|
|
91
|
+
queue.push(dependent);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
return Array.from(scriptsToRebundle);
|
|
96
|
+
}
|
|
97
|
+
function getRouteDependencies(rootDir, routeName) {
|
|
98
|
+
const packageJson = getPackageInfoFromFile(
|
|
99
|
+
path.join(rootDir, "routes", routeName, "package.json")
|
|
100
|
+
);
|
|
101
|
+
if (!packageJson) {
|
|
102
|
+
return [];
|
|
103
|
+
}
|
|
104
|
+
const deps = packageJson.dependencies || {};
|
|
105
|
+
return Object.keys(deps);
|
|
106
|
+
}
|
|
107
|
+
function findRoutesToRebuild(changedPackage, workspacePackages, rootDir, allRoutes) {
|
|
108
|
+
const changedPackageJson = workspacePackages.get(changedPackage);
|
|
109
|
+
if (isScriptOrModule(changedPackageJson)) {
|
|
110
|
+
return [];
|
|
111
|
+
}
|
|
112
|
+
const routesToRebuild = /* @__PURE__ */ new Set();
|
|
113
|
+
const visited = /* @__PURE__ */ new Set();
|
|
114
|
+
const queue = [changedPackage];
|
|
115
|
+
while (queue.length > 0) {
|
|
116
|
+
const currentPackage = queue.shift();
|
|
117
|
+
if (!currentPackage || visited.has(currentPackage)) {
|
|
118
|
+
continue;
|
|
119
|
+
}
|
|
120
|
+
visited.add(currentPackage);
|
|
121
|
+
for (const route of allRoutes) {
|
|
122
|
+
const deps = getRouteDependencies(rootDir, route);
|
|
123
|
+
if (deps.includes(currentPackage)) {
|
|
124
|
+
routesToRebuild.add(route);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
const dependents = getReverseDependencies(
|
|
128
|
+
currentPackage,
|
|
129
|
+
workspacePackages
|
|
130
|
+
);
|
|
131
|
+
for (const dependent of dependents) {
|
|
132
|
+
const dependentPackageJson = workspacePackages.get(dependent);
|
|
133
|
+
if (!isScriptOrModule(dependentPackageJson) && !visited.has(dependent)) {
|
|
134
|
+
queue.push(dependent);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
return Array.from(routesToRebuild);
|
|
139
|
+
}
|
|
140
|
+
export {
|
|
141
|
+
findRoutesToRebuild,
|
|
142
|
+
findScriptsToRebundle,
|
|
143
|
+
getDependencies,
|
|
144
|
+
getReverseDependencies,
|
|
145
|
+
getRouteDependencies,
|
|
146
|
+
groupByDepth,
|
|
147
|
+
isScriptOrModule
|
|
148
|
+
};
|
|
149
|
+
//# sourceMappingURL=dependency-graph.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/dependency-graph.mjs"],
|
|
4
|
+
"sourcesContent": ["/**\n * Dependency graph utilities for WordPress packages.\n *\n * This module provides functions to analyze dependencies between @wordpress/* packages\n * and determine the correct build order using topological sorting.\n */\n\nimport path from 'path';\nimport { getPackageInfoFromFile } from './package-utils.mjs';\n\n/**\n * Check if a package is a script or script module.\n * A package is a script if it has wpScript or wpScriptModuleExports.\n *\n * @param {import('./package-utils.mjs').PackageJson|null|undefined} packageJson The package.json object.\n * @return {boolean} True if the package is a script or script module.\n */\nfunction isScriptOrModule( packageJson ) {\n\tif ( ! packageJson ) {\n\t\treturn false;\n\t}\n\treturn !! ( packageJson.wpScript || packageJson.wpScriptModuleExports );\n}\n\n/**\n * Get package dependencies from a package.json object.\n *\n * @param {import('./package-utils.mjs').PackageJson|null|undefined} packageJson The package.json object.\n * @return {string[]} Array of package names this package depends on.\n */\nfunction getDependencies( packageJson ) {\n\tif ( ! packageJson ) {\n\t\treturn [];\n\t}\n\n\tconst deps = packageJson.dependencies || {};\n\n\treturn Object.keys( deps );\n}\n\n/**\n * Group packages by dependency depth level.\n * Packages at the same depth level can be built in parallel.\n *\n * @param {Map<string, import('./package-utils.mjs').PackageJson>} packages Map of package names to package.json objects.\n * @return {string[][]} Array of arrays, where each inner array is a depth level containing package names.\n */\nfunction groupByDepth( packages ) {\n\tconst packagesSet = new Set( packages.keys() );\n\tconst depths = new Map();\n\tconst visited = new Set();\n\n\t/**\n\t * Calculate depth for a package recursively.\n\t *\n\t * @param {string} packageName Package name to calculate depth for.\n\t * @return {number} Depth level (0 = no dependencies).\n\t */\n\tfunction calculateDepth( packageName ) {\n\t\tif ( depths.has( packageName ) ) {\n\t\t\treturn depths.get( packageName );\n\t\t}\n\n\t\t// Prevent infinite loops in case of circular dependencies\n\t\tif ( visited.has( packageName ) ) {\n\t\t\treturn 0;\n\t\t}\n\n\t\tvisited.add( packageName );\n\n\t\tconst packageJson = packages.get( packageName );\n\t\tconst deps = getDependencies( packageJson );\n\t\tconst relevantDeps = deps.filter( ( dep ) => packagesSet.has( dep ) );\n\n\t\tif ( relevantDeps.length === 0 ) {\n\t\t\tdepths.set( packageName, 0 );\n\t\t\treturn 0;\n\t\t}\n\n\t\tconst maxDepth = Math.max(\n\t\t\t...relevantDeps.map( ( dep ) => calculateDepth( dep ) )\n\t\t);\n\t\tconst depth = maxDepth + 1;\n\t\tdepths.set( packageName, depth );\n\n\t\treturn depth;\n\t}\n\n\t// Calculate depth for all packages\n\tfor ( const packageName of packages.keys() ) {\n\t\tcalculateDepth( packageName );\n\t}\n\n\t// Group by depth\n\tconst levels = [];\n\tconst maxDepth = Math.max( ...depths.values() );\n\n\tfor ( let depth = 0; depth <= maxDepth; depth++ ) {\n\t\tconst packagesAtDepth = Array.from( packages.keys() ).filter(\n\t\t\t( pkg ) => depths.get( pkg ) === depth\n\t\t);\n\t\tif ( packagesAtDepth.length > 0 ) {\n\t\t\tlevels.push( packagesAtDepth );\n\t\t}\n\t}\n\n\treturn levels;\n}\n\n/**\n * Get packages that depend on a given package (reverse dependencies).\n *\n * @param {string} packageName The full package name to find dependents of.\n * @param {Map<string, import('./package-utils.mjs').PackageJson>} workspacePackages Map of workspace package names to package.json objects.\n * @return {string[]} Array of package names that depend on the given package.\n */\nfunction getReverseDependencies( packageName, workspacePackages ) {\n\tconst dependents = [];\n\n\tfor ( const [ pkg, packageJson ] of workspacePackages ) {\n\t\tconst deps = getDependencies( packageJson );\n\t\tif ( deps.includes( packageName ) ) {\n\t\t\tdependents.push( pkg );\n\t\t}\n\t}\n\n\treturn dependents;\n}\n\n/**\n * Find scripts/script-modules that need to be rebundled when a bundled package changes.\n * Uses BFS to traverse reverse dependencies, stopping at script/module boundaries.\n *\n * When a bundled package (no wpScript/wpScriptModuleExports) changes, we need to\n * rebundle any scripts/modules that depend on it through a chain of bundled packages.\n * We stop at script/module boundaries because they handle their own bundling.\n *\n * Example:\n * - A (bundled) changes\n * - B (bundled) depends on A\n * - C (script) depends on B\n * - D (script) depends on C\n * Result: Only C needs rebundling (D stops at C boundary)\n *\n * @param {string} changedPackage The full package name that changed.\n * @param {Map<string, import('./package-utils.mjs').PackageJson>} workspacePackages Map of workspace package names to package.json objects.\n * @return {string[]} Array of script/module package names to rebundle.\n */\nfunction findScriptsToRebundle( changedPackage, workspacePackages ) {\n\t// If the changed package itself is a script/module, no need to find others\n\t// (it will be rebuilt by the regular watch logic)\n\tconst changedPackageJson = workspacePackages.get( changedPackage );\n\tif ( isScriptOrModule( changedPackageJson ) ) {\n\t\treturn [];\n\t}\n\n\tconst scriptsToRebundle = new Set();\n\tconst visited = new Set();\n\tconst queue = [ changedPackage ];\n\n\twhile ( queue.length > 0 ) {\n\t\tconst currentPackage = queue.shift();\n\n\t\tif ( ! currentPackage || visited.has( currentPackage ) ) {\n\t\t\tcontinue;\n\t\t}\n\t\tvisited.add( currentPackage );\n\n\t\t// Get all packages that depend on the current package\n\t\tconst dependents = getReverseDependencies(\n\t\t\tcurrentPackage,\n\t\t\tworkspacePackages\n\t\t);\n\n\t\tfor ( const dependent of dependents ) {\n\t\t\t// If this dependent is a script/module, add it to the result\n\t\t\t// but don't traverse further (stop at script boundaries)\n\t\t\tconst dependentPackageJson = workspacePackages.get( dependent );\n\t\t\tif ( isScriptOrModule( dependentPackageJson ) ) {\n\t\t\t\tscriptsToRebundle.add( dependent );\n\t\t\t} else if ( ! visited.has( dependent ) ) {\n\t\t\t\t// If it's a bundled package, continue traversing\n\t\t\t\tqueue.push( dependent );\n\t\t\t}\n\t\t}\n\t}\n\n\treturn Array.from( scriptsToRebundle );\n}\n\n/**\n * Get package dependencies from a route's package.json file.\n *\n * @param {string} rootDir Root directory path.\n * @param {string} routeName The route name (e.g., 'home').\n * @return {string[]} Array of package names this route depends on.\n */\nfunction getRouteDependencies( rootDir, routeName ) {\n\tconst packageJson = getPackageInfoFromFile(\n\t\tpath.join( rootDir, 'routes', routeName, 'package.json' )\n\t);\n\tif ( ! packageJson ) {\n\t\treturn [];\n\t}\n\n\tconst deps = packageJson.dependencies || {};\n\n\treturn Object.keys( deps );\n}\n\n/**\n * Find routes that need to be rebuilt when a bundled package changes.\n * Uses BFS to traverse reverse dependencies, stopping at script/module boundaries.\n *\n * When a bundled package changes, we need to rebuild any routes that depend on it\n * through a chain of bundled packages. Routes are leaf nodes like scripts/modules.\n *\n * Example:\n * - A (bundled) changes\n * - B (bundled) depends on A\n * - C (script) depends on B\n * - home (route) depends on B\n * Result: Both C and home need rebuilding\n *\n * @param {string} changedPackage The full package name that changed.\n * @param {Map<string, import('./package-utils.mjs').PackageJson>} workspacePackages Map of workspace package names to package.json objects.\n * @param {string} rootDir Root directory path.\n * @param {string[]} allRoutes Array of all route names.\n * @return {string[]} Array of route names to rebuild.\n */\nfunction findRoutesToRebuild(\n\tchangedPackage,\n\tworkspacePackages,\n\trootDir,\n\tallRoutes\n) {\n\t// If the changed package itself is a script/module, routes won't be affected\n\t// (routes depend on bundled packages, not scripts/modules)\n\tconst changedPackageJson = workspacePackages.get( changedPackage );\n\tif ( isScriptOrModule( changedPackageJson ) ) {\n\t\treturn [];\n\t}\n\n\tconst routesToRebuild = new Set();\n\tconst visited = new Set();\n\tconst queue = [ changedPackage ];\n\n\twhile ( queue.length > 0 ) {\n\t\tconst currentPackage = queue.shift();\n\n\t\tif ( ! currentPackage || visited.has( currentPackage ) ) {\n\t\t\tcontinue;\n\t\t}\n\t\tvisited.add( currentPackage );\n\n\t\t// Check if any routes depend on the current package\n\t\tfor ( const route of allRoutes ) {\n\t\t\tconst deps = getRouteDependencies( rootDir, route );\n\t\t\tif ( deps.includes( currentPackage ) ) {\n\t\t\t\troutesToRebuild.add( route );\n\t\t\t}\n\t\t}\n\n\t\t// Get all packages that depend on the current package\n\t\tconst dependents = getReverseDependencies(\n\t\t\tcurrentPackage,\n\t\t\tworkspacePackages\n\t\t);\n\n\t\tfor ( const dependent of dependents ) {\n\t\t\t// If this dependent is a script/module, don't traverse further\n\t\t\t// (stop at script boundaries)\n\t\t\tconst dependentPackageJson = workspacePackages.get( dependent );\n\t\t\tif (\n\t\t\t\t! isScriptOrModule( dependentPackageJson ) &&\n\t\t\t\t! visited.has( dependent )\n\t\t\t) {\n\t\t\t\t// If it's a bundled package, continue traversing\n\t\t\t\tqueue.push( dependent );\n\t\t\t}\n\t\t}\n\t}\n\n\treturn Array.from( routesToRebuild );\n}\n\nexport {\n\tgetDependencies,\n\tgroupByDepth,\n\tisScriptOrModule,\n\tgetReverseDependencies,\n\tfindScriptsToRebundle,\n\tgetRouteDependencies,\n\tfindRoutesToRebuild,\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["maxDepth"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
// packages/wp-build/src/package-utils.mjs
|
|
2
|
+
import { readFileSync, existsSync } from "fs";
|
|
3
|
+
import { createRequire } from "module";
|
|
4
|
+
import path from "path";
|
|
5
|
+
var packageJsonCache = /* @__PURE__ */ new Map();
|
|
6
|
+
var packagePathCache = /* @__PURE__ */ new Map();
|
|
7
|
+
function findPackageRoot(startDir) {
|
|
8
|
+
let current = startDir;
|
|
9
|
+
const root = path.parse(current).root;
|
|
10
|
+
while (current !== root) {
|
|
11
|
+
const packageJsonPath = path.join(current, "package.json");
|
|
12
|
+
if (existsSync(packageJsonPath)) {
|
|
13
|
+
return current;
|
|
14
|
+
}
|
|
15
|
+
current = path.dirname(current);
|
|
16
|
+
}
|
|
17
|
+
return startDir;
|
|
18
|
+
}
|
|
19
|
+
function getPackageInfo(fullPackageName, resolveDir = null) {
|
|
20
|
+
const packageRoot = resolveDir ? findPackageRoot(resolveDir) : process.cwd();
|
|
21
|
+
const cacheKey = `${fullPackageName}@${packageRoot}`;
|
|
22
|
+
if (packageJsonCache.has(cacheKey)) {
|
|
23
|
+
return packageJsonCache.get(cacheKey);
|
|
24
|
+
}
|
|
25
|
+
const contextPath = path.join(packageRoot, "package.json");
|
|
26
|
+
const require2 = createRequire(contextPath);
|
|
27
|
+
const resolved = require2.resolve(`${fullPackageName}/package.json`);
|
|
28
|
+
const result = getPackageInfoFromFile(resolved);
|
|
29
|
+
packageJsonCache.set(cacheKey, result);
|
|
30
|
+
return result;
|
|
31
|
+
}
|
|
32
|
+
function getPackageInfoFromFile(packageJsonPath) {
|
|
33
|
+
if (packagePathCache.has(packageJsonPath)) {
|
|
34
|
+
return packagePathCache.get(packageJsonPath);
|
|
35
|
+
}
|
|
36
|
+
const packageJson = JSON.parse(readFileSync(packageJsonPath, "utf8"));
|
|
37
|
+
packagePathCache.set(packageJsonPath, packageJson);
|
|
38
|
+
return packageJson;
|
|
39
|
+
}
|
|
40
|
+
export {
|
|
41
|
+
getPackageInfo,
|
|
42
|
+
getPackageInfoFromFile
|
|
43
|
+
};
|
|
44
|
+
//# sourceMappingURL=package-utils.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/package-utils.mjs"],
|
|
4
|
+
"sourcesContent": ["/**\n * External dependencies\n */\nimport { readFileSync, existsSync } from 'fs';\nimport { createRequire } from 'module';\nimport path from 'path';\n\n/**\n * Shared cache for package.json files to avoid redundant reads.\n * Cache is keyed by the full package name from package.json's name field.\n */\nconst packageJsonCache = new Map();\nconst packagePathCache = new Map();\n\n/**\n * @typedef {Object} PackageJson\n *\n * @property {string} name Package name.\n * @property {string} version Package version.\n * @property {string} [description] Package description.\n * @property {string} [author] Package author.\n * @property {string} [license] Package license.\n * @property {string} [main] Main entry point.\n * @property {string} [module] ES module entry point.\n * @property {string} [react-native] React Native entry point.\n * @property {Record<string, string>} [dependencies] Runtime dependencies.\n * @property {Record<string, string>} [devDependencies] Development dependencies.\n * @property {Record<string, string>} [peerDependencies] Peer dependencies.\n * @property {string[]} [wpScript] WordPress script handles for dependency extraction.\n * @property {Record<string, string>} [wpScriptModuleExports] WordPress script module exports.\n * @property {Object} [sideEffects] Side effects configuration for tree shaking.\n * @property {string} [publishConfig] NPM publish configuration.\n * @property {Record<string, string>} [scripts] NPM scripts.\n * @property {string[]} [files] Files to include in package.\n * @property {string} [repository] Repository URL.\n * @property {string[]} [keywords] Package keywords.\n */\n\n// Create a new type that extends PackageJson with an optional \"route\" property\n/**\n * @typedef {PackageJson & { route: { path: string; page?: string } }} RoutePackageJson\n */\n\n/**\n * Find the nearest package root directory by walking up from the given directory.\n * Looks for a directory containing package.json.\n *\n * @param {string} startDir The directory to start searching from.\n * @return {string} The package root directory, or the start directory if no package.json found.\n */\nfunction findPackageRoot( startDir ) {\n\tlet current = startDir;\n\tconst root = path.parse( current ).root;\n\n\twhile ( current !== root ) {\n\t\tconst packageJsonPath = path.join( current, 'package.json' );\n\t\tif ( existsSync( packageJsonPath ) ) {\n\t\t\treturn current;\n\t\t}\n\t\tcurrent = path.dirname( current );\n\t}\n\n\t// Fallback to the start directory if no package.json found\n\treturn startDir;\n}\n\n/**\n * Get package.json info using Node's module resolution.\n * Resolves packages from the appropriate context to support both workspace packages\n * and external dependencies in pnpm/yarn/npm workspaces.\n *\n * @param {string} fullPackageName The full package name (e.g., '@wordpress/blocks').\n * @param {string|null} resolveDir Optional directory context for resolution (from esbuild).\n * @return {PackageJson|null} Package.json object or null if not found.\n */\nexport function getPackageInfo( fullPackageName, resolveDir = null ) {\n\t// Determine the package root for cache keying\n\tconst packageRoot = resolveDir\n\t\t? findPackageRoot( resolveDir )\n\t\t: process.cwd();\n\tconst cacheKey = `${ fullPackageName }@${ packageRoot }`;\n\n\tif ( packageJsonCache.has( cacheKey ) ) {\n\t\treturn packageJsonCache.get( cacheKey );\n\t}\n\n\t// Resolve from the package root context to get correct versions\n\tconst contextPath = path.join( packageRoot, 'package.json' );\n\tconst require = createRequire( contextPath );\n\tconst resolved = require.resolve( `${ fullPackageName }/package.json` );\n\tconst result = getPackageInfoFromFile( resolved );\n\tpackageJsonCache.set( cacheKey, result );\n\n\treturn result;\n}\n\n/**\n * Get package.json info from an explicit file path.\n * Reads the package.json file and caches it by its name field.\n *\n * @param {string} packageJsonPath Absolute path to package.json file.\n * @return {PackageJson|null} Package.json object or null if not found.\n */\nexport function getPackageInfoFromFile( packageJsonPath ) {\n\tif ( packagePathCache.has( packageJsonPath ) ) {\n\t\treturn packagePathCache.get( packageJsonPath );\n\t}\n\tconst packageJson = JSON.parse( readFileSync( packageJsonPath, 'utf8' ) );\n\tpackagePathCache.set( packageJsonPath, packageJson );\n\treturn packageJson;\n}\n"],
|
|
5
|
+
"mappings": ";AAGA,SAAS,cAAc,kBAAkB;AACzC,SAAS,qBAAqB;AAC9B,OAAO,UAAU;AAMjB,IAAM,mBAAmB,oBAAI,IAAI;AACjC,IAAM,mBAAmB,oBAAI,IAAI;AAsCjC,SAAS,gBAAiB,UAAW;AACpC,MAAI,UAAU;AACd,QAAM,OAAO,KAAK,MAAO,OAAQ,EAAE;AAEnC,SAAQ,YAAY,MAAO;AAC1B,UAAM,kBAAkB,KAAK,KAAM,SAAS,cAAe;AAC3D,QAAK,WAAY,eAAgB,GAAI;AACpC,aAAO;AAAA,IACR;AACA,cAAU,KAAK,QAAS,OAAQ;AAAA,EACjC;AAGA,SAAO;AACR;AAWO,SAAS,eAAgB,iBAAiB,aAAa,MAAO;AAEpE,QAAM,cAAc,aACjB,gBAAiB,UAAW,IAC5B,QAAQ,IAAI;AACf,QAAM,WAAW,GAAI,eAAgB,IAAK,WAAY;AAEtD,MAAK,iBAAiB,IAAK,QAAS,GAAI;AACvC,WAAO,iBAAiB,IAAK,QAAS;AAAA,EACvC;AAGA,QAAM,cAAc,KAAK,KAAM,aAAa,cAAe;AAC3D,QAAMA,WAAU,cAAe,WAAY;AAC3C,QAAM,WAAWA,SAAQ,QAAS,GAAI,eAAgB,eAAgB;AACtE,QAAM,SAAS,uBAAwB,QAAS;AAChD,mBAAiB,IAAK,UAAU,MAAO;AAEvC,SAAO;AACR;AASO,SAAS,uBAAwB,iBAAkB;AACzD,MAAK,iBAAiB,IAAK,eAAgB,GAAI;AAC9C,WAAO,iBAAiB,IAAK,eAAgB;AAAA,EAC9C;AACA,QAAM,cAAc,KAAK,MAAO,aAAc,iBAAiB,MAAO,CAAE;AACxE,mBAAiB,IAAK,iBAAiB,WAAY;AACnD,SAAO;AACR;",
|
|
6
|
+
"names": ["require"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
// packages/wp-build/src/php-generator.mjs
|
|
2
|
+
import { readFile, writeFile, mkdir } from "fs/promises";
|
|
3
|
+
import path from "path";
|
|
4
|
+
import { fileURLToPath } from "url";
|
|
5
|
+
import { getPackageInfoFromFile } from "./package-utils.mjs";
|
|
6
|
+
var __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
7
|
+
async function getPhpReplacements(rootDir, baseUrlExpression) {
|
|
8
|
+
const rootPackageJson = getPackageInfoFromFile(
|
|
9
|
+
path.join(rootDir, "package.json")
|
|
10
|
+
);
|
|
11
|
+
if (!rootPackageJson) {
|
|
12
|
+
throw new Error("Could not read root package.json");
|
|
13
|
+
}
|
|
14
|
+
const name = rootPackageJson.wpPlugin?.name || "gutenberg";
|
|
15
|
+
const version = rootPackageJson.version;
|
|
16
|
+
return {
|
|
17
|
+
"{{PREFIX}}": name,
|
|
18
|
+
"{{VERSION}}": version,
|
|
19
|
+
"{{BASE_URL}}": baseUrlExpression
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
function applyTemplateReplacements(template, replacements) {
|
|
23
|
+
let content = template;
|
|
24
|
+
for (const [placeholder, value] of Object.entries(replacements)) {
|
|
25
|
+
content = content.replaceAll(placeholder, value);
|
|
26
|
+
}
|
|
27
|
+
return content;
|
|
28
|
+
}
|
|
29
|
+
async function renderTemplateToString(templateName, replacements) {
|
|
30
|
+
const templatesDir = path.join(__dirname, "..", "templates");
|
|
31
|
+
const template = await readFile(
|
|
32
|
+
path.join(templatesDir, templateName),
|
|
33
|
+
"utf8"
|
|
34
|
+
);
|
|
35
|
+
return applyTemplateReplacements(template, replacements);
|
|
36
|
+
}
|
|
37
|
+
async function generatePhpFromTemplate(templateName, outputPath, replacements) {
|
|
38
|
+
const content = await renderTemplateToString(templateName, replacements);
|
|
39
|
+
await mkdir(path.dirname(outputPath), { recursive: true });
|
|
40
|
+
await writeFile(outputPath, content);
|
|
41
|
+
}
|
|
42
|
+
export {
|
|
43
|
+
applyTemplateReplacements,
|
|
44
|
+
generatePhpFromTemplate,
|
|
45
|
+
getPhpReplacements,
|
|
46
|
+
renderTemplateToString
|
|
47
|
+
};
|
|
48
|
+
//# sourceMappingURL=php-generator.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/php-generator.mjs"],
|
|
4
|
+
"sourcesContent": ["/**\n * External dependencies\n */\nimport { readFile, writeFile, mkdir } from 'fs/promises';\nimport path from 'path';\nimport { fileURLToPath } from 'url';\n\n/**\n * Internal dependencies\n */\nimport { getPackageInfoFromFile } from './package-utils.mjs';\n\nconst __dirname = path.dirname( fileURLToPath( import.meta.url ) );\n\n/**\n * Get PHP replacements from root package.json.\n *\n * @param {string} rootDir Root directory path.\n * @param {string} baseUrlExpression PHP expression for base URL (e.g. \"includes_url( 'build' )\").\n * @return {Promise<Record<string, string>>} Replacements object with {{PREFIX}}, {{VERSION}}, {{BASE_URL}}.\n */\nexport async function getPhpReplacements( rootDir, baseUrlExpression ) {\n\tconst rootPackageJson = getPackageInfoFromFile(\n\t\tpath.join( rootDir, 'package.json' )\n\t);\n\tif ( ! rootPackageJson ) {\n\t\tthrow new Error( 'Could not read root package.json' );\n\t}\n\n\t// @ts-expect-error specific override to package.json\n\tconst name = rootPackageJson.wpPlugin?.name || 'gutenberg';\n\tconst version = rootPackageJson.version;\n\n\treturn {\n\t\t'{{PREFIX}}': name,\n\t\t'{{VERSION}}': version,\n\t\t'{{BASE_URL}}': baseUrlExpression,\n\t};\n}\n\n/**\n * Apply template replacements to a template string.\n *\n * @param {string} template Template string with placeholders.\n * @param {Record<string, string>} replacements Replacements object (e.g. {'{{PREFIX}}': 'gutenberg'}).\n * @return {string} Template with replacements applied.\n */\nexport function applyTemplateReplacements( template, replacements ) {\n\tlet content = template;\n\tfor ( const [ placeholder, value ] of Object.entries( replacements ) ) {\n\t\tcontent = content.replaceAll( placeholder, value );\n\t}\n\treturn content;\n}\n\n/**\n * Render a template to a string with replacements.\n *\n * @param {string} templateName Template file name.\n * @param {Record<string, string>} replacements Replacements object (e.g. {'{{PREFIX}}': 'gutenberg'}).\n * @return {Promise<string>} Rendered template string.\n */\nexport async function renderTemplateToString( templateName, replacements ) {\n\t// Templates directory\n\tconst templatesDir = path.join( __dirname, '..', 'templates' );\n\n\t// Read template\n\tconst template = await readFile(\n\t\tpath.join( templatesDir, templateName ),\n\t\t'utf8'\n\t);\n\n\t// Apply replacements\n\treturn applyTemplateReplacements( template, replacements );\n}\n\n/**\n * Generate a PHP file from a template with replacements.\n *\n * @param {string} templateName Template file name.\n * @param {string} outputPath Full output path.\n * @param {Record<string, string>} replacements Replacements object (e.g. {'{{PREFIX}}': 'gutenberg'}).\n */\nexport async function generatePhpFromTemplate(\n\ttemplateName,\n\toutputPath,\n\treplacements\n) {\n\t// Render template to string\n\tconst content = await renderTemplateToString( templateName, replacements );\n\n\t// Write output file\n\tawait mkdir( path.dirname( outputPath ), { recursive: true } );\n\tawait writeFile( outputPath, content );\n}\n"],
|
|
5
|
+
"mappings": ";AAGA,SAAS,UAAU,WAAW,aAAa;AAC3C,OAAO,UAAU;AACjB,SAAS,qBAAqB;AAK9B,SAAS,8BAA8B;AAEvC,IAAM,YAAY,KAAK,QAAS,cAAe,YAAY,GAAI,CAAE;AASjE,eAAsB,mBAAoB,SAAS,mBAAoB;AACtE,QAAM,kBAAkB;AAAA,IACvB,KAAK,KAAM,SAAS,cAAe;AAAA,EACpC;AACA,MAAK,CAAE,iBAAkB;AACxB,UAAM,IAAI,MAAO,kCAAmC;AAAA,EACrD;AAGA,QAAM,OAAO,gBAAgB,UAAU,QAAQ;AAC/C,QAAM,UAAU,gBAAgB;AAEhC,SAAO;AAAA,IACN,cAAc;AAAA,IACd,eAAe;AAAA,IACf,gBAAgB;AAAA,EACjB;AACD;AASO,SAAS,0BAA2B,UAAU,cAAe;AACnE,MAAI,UAAU;AACd,aAAY,CAAE,aAAa,KAAM,KAAK,OAAO,QAAS,YAAa,GAAI;AACtE,cAAU,QAAQ,WAAY,aAAa,KAAM;AAAA,EAClD;AACA,SAAO;AACR;AASA,eAAsB,uBAAwB,cAAc,cAAe;AAE1E,QAAM,eAAe,KAAK,KAAM,WAAW,MAAM,WAAY;AAG7D,QAAM,WAAW,MAAM;AAAA,IACtB,KAAK,KAAM,cAAc,YAAa;AAAA,IACtC;AAAA,EACD;AAGA,SAAO,0BAA2B,UAAU,YAAa;AAC1D;AASA,eAAsB,wBACrB,cACA,YACA,cACC;AAED,QAAM,UAAU,MAAM,uBAAwB,cAAc,YAAa;AAGzE,QAAM,MAAO,KAAK,QAAS,UAAW,GAAG,EAAE,WAAW,KAAK,CAAE;AAC7D,QAAM,UAAW,YAAY,OAAQ;AACtC;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
// packages/wp-build/src/route-utils.mjs
|
|
2
|
+
import { readdirSync } from "fs";
|
|
3
|
+
import path from "path";
|
|
4
|
+
import { getPackageInfoFromFile } from "./package-utils.mjs";
|
|
5
|
+
function getAllRoutes(rootDir) {
|
|
6
|
+
const routesPath = path.join(rootDir, "routes");
|
|
7
|
+
try {
|
|
8
|
+
return readdirSync(routesPath, { withFileTypes: true }).filter((dirent) => dirent.isDirectory()).map((dirent) => dirent.name);
|
|
9
|
+
} catch (error) {
|
|
10
|
+
return [];
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
function getRouteMetadata(rootDir, routeName) {
|
|
14
|
+
const routePackageJson = (
|
|
15
|
+
/** @type {import('./package-utils.mjs').RoutePackageJson|null} */
|
|
16
|
+
getPackageInfoFromFile(
|
|
17
|
+
path.join(rootDir, "routes", routeName, "package.json")
|
|
18
|
+
)
|
|
19
|
+
);
|
|
20
|
+
if (!routePackageJson || !routePackageJson.route) {
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
23
|
+
const pageField = routePackageJson.route.page;
|
|
24
|
+
let pages = [];
|
|
25
|
+
if (pageField) {
|
|
26
|
+
pages = Array.isArray(pageField) ? pageField : [pageField];
|
|
27
|
+
}
|
|
28
|
+
return {
|
|
29
|
+
name: routeName,
|
|
30
|
+
path: routePackageJson.route.path,
|
|
31
|
+
pages
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
function getRouteFiles(routeDirectory) {
|
|
35
|
+
const extensions = ["tsx", "ts", "jsx", "js"];
|
|
36
|
+
const files = {
|
|
37
|
+
hasRoute: false,
|
|
38
|
+
hasStage: false,
|
|
39
|
+
hasInspector: false,
|
|
40
|
+
hasCanvas: false,
|
|
41
|
+
hasStyle: false
|
|
42
|
+
};
|
|
43
|
+
const entries = readdirSync(routeDirectory);
|
|
44
|
+
for (const ext of extensions) {
|
|
45
|
+
if (entries.includes(`route.${ext}`)) {
|
|
46
|
+
files.hasRoute = true;
|
|
47
|
+
}
|
|
48
|
+
if (entries.includes(`stage.${ext}`)) {
|
|
49
|
+
files.hasStage = true;
|
|
50
|
+
}
|
|
51
|
+
if (entries.includes(`inspector.${ext}`)) {
|
|
52
|
+
files.hasInspector = true;
|
|
53
|
+
}
|
|
54
|
+
if (entries.includes(`canvas.${ext}`)) {
|
|
55
|
+
files.hasCanvas = true;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
if (entries.includes("route.scss")) {
|
|
59
|
+
files.hasStyle = true;
|
|
60
|
+
}
|
|
61
|
+
return files;
|
|
62
|
+
}
|
|
63
|
+
function generateContentEntryPoint(files) {
|
|
64
|
+
const lines = [];
|
|
65
|
+
if (files.hasStage) {
|
|
66
|
+
lines.push("export { stage } from './stage';");
|
|
67
|
+
}
|
|
68
|
+
if (files.hasInspector) {
|
|
69
|
+
lines.push("export { inspector } from './inspector';");
|
|
70
|
+
}
|
|
71
|
+
if (files.hasCanvas) {
|
|
72
|
+
lines.push("export { canvas } from './canvas';");
|
|
73
|
+
}
|
|
74
|
+
if (lines.length === 0) {
|
|
75
|
+
lines.push("export {};");
|
|
76
|
+
}
|
|
77
|
+
return lines.join("\n");
|
|
78
|
+
}
|
|
79
|
+
export {
|
|
80
|
+
generateContentEntryPoint,
|
|
81
|
+
getAllRoutes,
|
|
82
|
+
getRouteFiles,
|
|
83
|
+
getRouteMetadata
|
|
84
|
+
};
|
|
85
|
+
//# sourceMappingURL=route-utils.mjs.map
|