@blinkk/root 3.0.1 → 3.0.3

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.
Files changed (117) hide show
  1. package/dist/{chunk-FQBA5QSG.js → chunk-3Z5TNZEP.js} +3 -3
  2. package/dist/chunk-3Z5TNZEP.js.map +7 -0
  3. package/dist/{chunk-JCRXBB26.js → chunk-6NBKAR5Y.js} +2 -2
  4. package/dist/chunk-6NBKAR5Y.js.map +7 -0
  5. package/dist/chunk-6P3B7ZXL.js +1 -1
  6. package/dist/chunk-6P3B7ZXL.js.map +7 -1
  7. package/dist/{chunk-PVBPP5LN.js → chunk-7PSEEE6C.js} +10 -10
  8. package/dist/chunk-7PSEEE6C.js.map +7 -0
  9. package/dist/{chunk-M6WGW5VY.js → chunk-DU7JUEDY.js} +48 -6
  10. package/dist/chunk-DU7JUEDY.js.map +7 -0
  11. package/dist/{chunk-GSR74KEI.js → chunk-JTZWI4MH.js} +279 -73
  12. package/dist/chunk-JTZWI4MH.js.map +7 -0
  13. package/dist/{chunk-WAZTR3DX.js → chunk-KW7KTYGC.js} +2 -2
  14. package/dist/chunk-KW7KTYGC.js.map +7 -0
  15. package/dist/chunk-XSNCF7WU.js +1 -1
  16. package/dist/chunk-XSNCF7WU.js.map +7 -1
  17. package/dist/cli/build.d.ts +7 -0
  18. package/dist/cli/cli.d.ts +12 -0
  19. package/dist/cli/codegen.d.ts +5 -0
  20. package/dist/cli/create-package.d.ts +14 -0
  21. package/dist/cli/dev.d.ts +10 -0
  22. package/dist/cli/gae-deploy.d.ts +18 -0
  23. package/dist/cli/preview.d.ts +8 -0
  24. package/dist/cli/start.d.ts +8 -0
  25. package/dist/cli/startup/check-version.d.ts +17 -0
  26. package/dist/cli/startup/startup-tasks.d.ts +39 -0
  27. package/dist/cli.js +4 -4
  28. package/dist/cli.js.map +7 -1
  29. package/dist/core/components/Body.d.ts +23 -0
  30. package/dist/core/components/Head.d.ts +18 -0
  31. package/dist/core/components/Html.d.ts +24 -0
  32. package/dist/core/components/Script.d.ts +16 -0
  33. package/dist/core/config.d.ts +285 -0
  34. package/dist/core/core.d.ts +14 -0
  35. package/dist/core/hooks/useI18nContext.d.ts +11 -0
  36. package/dist/core/hooks/useRequestContext.d.ts +36 -0
  37. package/dist/core/hooks/useStringParams.d.ts +34 -0
  38. package/dist/core/hooks/useTranslations.d.ts +20 -0
  39. package/dist/core/hooks/useTranslationsMiddleware.d.ts +25 -0
  40. package/dist/core/pages/DevErrorPage.d.ts +9 -0
  41. package/dist/core/pages/DevNotFoundPage.d.ts +10 -0
  42. package/dist/core/pages/ErrorPage.d.ts +9 -0
  43. package/dist/core/plugin.d.ts +80 -0
  44. package/dist/core/pod.d.ts +54 -0
  45. package/dist/core/types.d.ts +228 -0
  46. package/dist/core.js +3 -3
  47. package/dist/core.js.map +7 -1
  48. package/dist/functions/functions.d.ts +1 -0
  49. package/dist/functions/server.d.ts +10 -0
  50. package/dist/functions.js +5 -5
  51. package/dist/functions.js.map +7 -1
  52. package/dist/jsx/jsx-dev-runtime.d.ts +10 -1
  53. package/dist/jsx/jsx-dev-runtime.js +2 -2
  54. package/dist/jsx/jsx-dev-runtime.js.map +7 -1
  55. package/dist/{jsx-C8BaDh-4.d.ts → jsx/jsx-render.d.ts} +3 -6
  56. package/dist/jsx/jsx-runtime.d.ts +120 -1
  57. package/dist/jsx/jsx-runtime.js +2 -2
  58. package/dist/jsx/jsx-runtime.js.map +7 -1
  59. package/dist/jsx/jsx.d.ts +37 -0
  60. package/dist/{jsx-dev-runtime-DUJrvx5P.d.ts → jsx/types.d.ts} +9 -125
  61. package/dist/jsx.js +3 -3
  62. package/dist/jsx.js.map +7 -1
  63. package/dist/middleware/common.d.ts +22 -0
  64. package/dist/middleware/hooks.d.ts +8 -0
  65. package/dist/middleware/middleware.d.ts +3 -0
  66. package/dist/middleware/multipart.d.ts +11 -0
  67. package/dist/middleware/redirects.d.ts +10 -0
  68. package/dist/middleware/session.d.ts +24 -0
  69. package/dist/middleware.js +2 -2
  70. package/dist/middleware.js.map +7 -1
  71. package/dist/node/element-graph.d.ts +51 -0
  72. package/dist/node/load-config.d.ts +17 -0
  73. package/dist/node/monorepo.d.ts +14 -0
  74. package/dist/node/node.d.ts +4 -0
  75. package/dist/node/pod-collector.d.ts +33 -0
  76. package/dist/node/pods-vite-plugin.d.ts +6 -0
  77. package/dist/node/vite-plugin-preact-alias.d.ts +10 -0
  78. package/dist/node/vite-plugin-prune-empty-chunks.d.ts +27 -0
  79. package/dist/node/vite-plugin-root-jsx-virtual.d.ts +16 -0
  80. package/dist/node/vite.d.ts +18 -0
  81. package/dist/node.js +2 -2
  82. package/dist/node.js.map +7 -1
  83. package/dist/render/accept-language.d.ts +8 -0
  84. package/dist/render/asset-map/asset-map.d.ts +25 -0
  85. package/dist/render/asset-map/build-asset-map.d.ts +47 -0
  86. package/dist/render/asset-map/dev-asset-map.d.ts +26 -0
  87. package/dist/render/countrie-language.d.ts +13 -0
  88. package/dist/render/html-minify.d.ts +3 -0
  89. package/dist/render/html-pretty.d.ts +3 -0
  90. package/dist/render/i18n-fallbacks.d.ts +11 -0
  91. package/dist/render/render.d.ts +91 -0
  92. package/dist/render/route-trie.d.ts +44 -0
  93. package/dist/render/router.d.ts +18 -0
  94. package/dist/render.js +9 -9
  95. package/dist/render.js.map +7 -1
  96. package/dist/utils/batch.d.ts +1 -0
  97. package/dist/utils/elements.d.ts +12 -0
  98. package/dist/utils/fsutils.d.ts +24 -0
  99. package/dist/utils/i18n.d.ts +8 -0
  100. package/dist/utils/ports.d.ts +8 -0
  101. package/dist/utils/rand.d.ts +10 -0
  102. package/dist/utils/url-path-params.d.ts +2 -0
  103. package/package.json +14 -15
  104. package/dist/chunk-FQBA5QSG.js.map +0 -1
  105. package/dist/chunk-GSR74KEI.js.map +0 -1
  106. package/dist/chunk-JCRXBB26.js.map +0 -1
  107. package/dist/chunk-M6WGW5VY.js.map +0 -1
  108. package/dist/chunk-PVBPP5LN.js.map +0 -1
  109. package/dist/chunk-WAZTR3DX.js.map +0 -1
  110. package/dist/cli.d.ts +0 -60
  111. package/dist/core.d.ts +0 -214
  112. package/dist/functions.d.ts +0 -14
  113. package/dist/jsx.d.ts +0 -2
  114. package/dist/middleware.d.ts +0 -43
  115. package/dist/node.d.ts +0 -91
  116. package/dist/render.d.ts +0 -8
  117. package/dist/types-Cksf99CK.d.ts +0 -827
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/cli/cli.ts", "../src/cli/build.ts", "../src/node/element-graph.ts", "../src/node/vite-plugin-prune-empty-chunks.ts", "../src/render/asset-map/build-asset-map.ts", "../src/utils/batch.ts", "../src/cli/codegen.ts", "../src/cli/create-package.ts", "../src/cli/dev.ts", "../src/middleware/hooks.ts", "../src/middleware/redirects.ts", "../src/render/asset-map/dev-asset-map.ts", "../src/utils/ports.ts", "../src/utils/rand.ts", "../src/cli/startup/startup-tasks.ts", "../src/cli/startup/check-version.ts", "../src/cli/gae-deploy.ts", "../src/cli/preview.ts", "../src/cli/start.ts"],
4
+ "sourcesContent": ["import {Command, InvalidArgumentError} from 'commander';\nimport {bgGreen, black} from 'kleur/colors';\nimport {build, BuildOptions} from './build.js';\nimport {codegen} from './codegen.js';\nimport {createPackage} from './create-package.js';\nimport {dev, createDevServer} from './dev.js';\nimport {gaeDeploy} from './gae-deploy.js';\nimport {preview, createPreviewServer} from './preview.js';\nimport {start, createProdServer} from './start.js';\n\nclass CliRunner {\n private name: string;\n private version: string;\n\n constructor(name: string, version: string) {\n this.name = name;\n this.version = version;\n }\n\n async run(argv: string[]) {\n const program = new Command('root');\n program.version(this.version);\n program.option('-q, --quiet', 'quiet');\n program.hook('preAction', (cmd) => {\n if (!cmd.opts().quiet) {\n console.log(\n `\uD83E\uDD55 ${bgGreen(black(` ${this.name} `))} v${this.version}\\n`\n );\n }\n });\n program\n .command('build [path]')\n .description('generates a static build')\n .option('--ssr-only', 'produce a ssr-only build')\n .option(\n '--mode <mode>',\n 'see: https://vitejs.dev/guide/env-and-mode.html#modes',\n 'production'\n )\n .option(\n '-c, --concurrency <num>',\n 'number of files to build concurrently',\n '10'\n )\n .option(\n '--filter <urlPathRegex>',\n 'builds the url paths that match the given regex, e.g. \"/products/.*\"',\n ''\n )\n .action(build);\n program\n .command('codegen [type] [name]')\n .description('generates boilerplate code')\n .option('--out <outdir>', 'output dir')\n .action(codegen);\n program\n .command('create-package [path]')\n .alias('package')\n .description(\n 'creates a standalone npm package for deployment to various hosting services'\n )\n .option('--target <target>', 'hosting target, i.e. appengine or firebase')\n .option('--out <outdir>', 'output dir')\n .option('--mode <mode>', 'deployment mode, i.e. production or preview')\n .option(\n '--app-yaml <path>',\n 'for appengine targets, path to app.yaml (defaults to \"app.yaml\")'\n )\n .action((rootPackageDir, options) => {\n options.version = this.version;\n createPackage(rootPackageDir, options);\n });\n program\n .command('dev [path]')\n .description('starts the server in development mode')\n .option(\n '--host <host>',\n 'network address the server should listen on, e.g. 127.0.0.1'\n )\n .action((rootProjectDir, options) => {\n options.version = this.version;\n dev(rootProjectDir, options);\n });\n program\n .command('gae-deploy <appdir>')\n .description(\n 'appengine deploy utility that can optionally run healthchecks before diverting traffic to the new version and clean up old versions'\n )\n .option('--project <project>', 'GCP project id')\n .option('--prefix <prefix>', 'prefix to append the version')\n .option(\n '--promote',\n 'whether to promote the version (if healthchecks pass)'\n )\n .option(\n '--healthcheck-url <url>',\n 'healthcheck url path (e.g. \"/healthcheck\") which should return a 200 status with the text \"OK\"'\n )\n .option(\n '--max-versions <num>',\n 'the max number of versions to keep',\n numberFlag\n )\n .action(gaeDeploy);\n program\n .command('preview [path]')\n .description('starts the server in preview mode')\n .option(\n '--host <host>',\n 'network address the server should listen on, e.g. 127.0.0.1'\n )\n .action(preview);\n program\n .command('start [path]')\n .description('starts the server in production mode')\n .option(\n '--host <host>',\n 'network address the server should listen on, e.g. 127.0.0.1'\n )\n .action(start);\n await program.parseAsync(argv);\n }\n}\n\nfunction numberFlag(value: string) {\n const num = parseInt(value);\n if (isNaN(num)) {\n throw new InvalidArgumentError(`not a number: ${value}`);\n }\n return num;\n}\n\nexport {\n CliRunner,\n build,\n BuildOptions,\n createPackage,\n dev,\n createDevServer,\n preview,\n createPreviewServer,\n start,\n createProdServer,\n};\n", "/* eslint-disable no-control-regex */\nimport path from 'node:path';\nimport {fileURLToPath} from 'node:url';\n\nimport fsExtra from 'fs-extra';\nimport {dim, cyan} from 'kleur/colors';\nimport glob from 'tiny-glob';\nimport {build as viteBuild, Manifest, ManifestChunk, UserConfig} from 'vite';\n\nimport {getVitePlugins} from '../core/plugin.js';\nimport {Route, Sitemap} from '../core/types.js';\nimport {getElements} from '../node/element-graph.js';\nimport {bundleRootConfig, loadRootConfig} from '../node/load-config.js';\nimport {collectPods} from '../node/pod-collector.js';\nimport {rootPodsVitePlugin} from '../node/pods-vite-plugin.js';\nimport {pruneEmptyChunksPlugin} from '../node/vite-plugin-prune-empty-chunks.js';\nimport {preactToRootJsxPlugin} from '../node/vite-plugin-root-jsx-virtual.js';\nimport {BuildAssetMap} from '../render/asset-map/build-asset-map.js';\nimport {htmlMinify} from '../render/html-minify.js';\nimport {htmlPretty} from '../render/html-pretty.js';\nimport {batchAsyncCalls} from '../utils/batch.js';\nimport {\n copyGlob,\n fileExists,\n isDirectory,\n isJsFile,\n loadJson,\n makeDir,\n rmDir,\n writeFile,\n} from '../utils/fsutils.js';\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\n\ntype RenderModule = typeof import('../render/render.js');\n\nexport interface BuildOptions {\n ssrOnly?: boolean;\n mode?: string;\n concurrency?: string | number;\n filter?: string;\n}\n\nexport async function build(rootProjectDir?: string, options?: BuildOptions) {\n const mode = options?.mode || 'production';\n process.env.NODE_ENV = mode;\n\n const rootDir = path.resolve(rootProjectDir || process.cwd());\n const rootConfig = await loadRootConfig(rootDir, {command: 'build'});\n const distDir = path.join(rootDir, 'dist');\n const ssrOnly = options?.ssrOnly || false;\n\n console.log();\n console.log(`${dim('\u2503')} project: ${rootDir}`);\n console.log(`${dim('\u2503')} output: ${distDir}/html`);\n console.log(`${dim('\u2503')} mode: ${mode}`);\n console.log();\n\n await rmDir(distDir);\n await makeDir(distDir);\n\n const pods = await collectPods(rootConfig);\n\n const routeFiles: string[] = [];\n if (await isDirectory(path.join(rootDir, 'routes'))) {\n const pageFiles = await glob('routes/**/*', {cwd: rootDir});\n pageFiles.forEach((file) => {\n const parts = path.parse(file);\n if (!parts.name.startsWith('_') && isJsFile(parts.base)) {\n routeFiles.push(path.resolve(rootDir, file));\n }\n });\n }\n // Add pod route files for the CSS extraction pass.\n for (const pod of pods) {\n for (const route of pod.routeFiles) {\n routeFiles.push(route.filePath);\n }\n }\n\n const elementGraph = await getElements(rootConfig, pods);\n const elements = Object.values(elementGraph.sourceFiles).map((sourceFile) => {\n return sourceFile.filePath;\n });\n\n const bundleScripts: string[] = [];\n if (await isDirectory(path.join(rootDir, 'bundles'))) {\n const bundleFiles = await glob('bundles/*', {cwd: rootDir});\n bundleFiles.forEach((file) => {\n const parts = path.parse(file);\n if (isJsFile(parts.base)) {\n bundleScripts.push(path.resolve(rootDir, file));\n }\n });\n }\n // Add pod bundle files.\n for (const pod of pods) {\n for (const bundleFile of pod.bundleFiles) {\n bundleScripts.push(bundleFile);\n }\n }\n\n const rootPlugins = rootConfig.plugins || [];\n const viteConfig = rootConfig.vite || {};\n\n for (const plugin of rootPlugins) {\n if (plugin.hooks?.preBuild) {\n await plugin.hooks.preBuild(rootConfig);\n }\n }\n\n const vitePlugins = [\n preactToRootJsxPlugin({useRootJsx: !!rootConfig.jsxRenderer?.mode}),\n rootPodsVitePlugin(rootConfig),\n ...(viteConfig.plugins || []),\n ...getVitePlugins(rootPlugins),\n pruneEmptyChunksPlugin(),\n ];\n\n const baseConfig: UserConfig = {\n ...viteConfig,\n root: rootDir,\n mode: mode,\n plugins: vitePlugins,\n };\n\n // Bundle the render.js file with vite along with any plugins `ssrInput()`\n // config values. These inputs are bundled through vite and support things\n // like `input.meta.glob()`.\n const ssrInput = {\n render: path.resolve(__dirname, './render.js'),\n };\n rootPlugins.forEach((plugin) => {\n if (plugin.ssrInput) {\n Object.assign(ssrInput, plugin.ssrInput());\n }\n });\n const noExternalConfig = viteConfig.ssr?.noExternal;\n const noExternal: Array<string | RegExp> = [];\n if (noExternalConfig) {\n if (Array.isArray(noExternalConfig)) {\n noExternal.push(...noExternalConfig);\n } else {\n noExternal.push(noExternalConfig as string | RegExp);\n }\n }\n await viteBuild({\n ...baseConfig,\n publicDir: false,\n build: {\n ...viteConfig?.build,\n rolldownOptions: {\n ...viteConfig?.build?.rolldownOptions,\n input: ssrInput,\n output: {\n format: 'esm',\n chunkFileNames: 'chunks/[hash].min.js',\n assetFileNames: 'assets/[hash][extname]',\n sanitizeFileName: sanitizeFileName,\n },\n },\n outDir: path.join(distDir, 'server'),\n ssr: true,\n ssrManifest: false,\n cssCodeSplit: true,\n target: 'esnext',\n minify: false,\n modulePreload: {polyfill: false},\n reportCompressedSize: false,\n sourcemap: 'inline',\n },\n ssr: {\n ...viteConfig.ssr,\n target: 'node',\n noExternal: ['@blinkk/root', /^virtual:/, ...noExternal],\n },\n });\n\n // Pre-render CSS deps from /routes/.\n await viteBuild({\n ...baseConfig,\n publicDir: false,\n build: {\n ...viteConfig?.build,\n rolldownOptions: {\n ...viteConfig?.build?.rolldownOptions,\n input: [...routeFiles],\n output: {\n format: 'esm',\n entryFileNames: 'assets/[hash].min.js',\n assetFileNames: 'assets/[hash][extname]',\n chunkFileNames: 'chunks/[hash].min.js',\n sanitizeFileName: sanitizeFileName,\n ...viteConfig?.build?.rolldownOptions?.output,\n },\n },\n outDir: path.join(distDir, '.build/routes'),\n ssr: true,\n ssrManifest: false,\n ssrEmitAssets: true,\n manifest: true,\n cssCodeSplit: true,\n target: 'esnext',\n minify: true,\n modulePreload: {polyfill: false},\n reportCompressedSize: false,\n },\n });\n\n // Pre-render /elements/ and /bundles/.\n const clientInput = [...elements, ...bundleScripts];\n if (clientInput.length > 0) {\n await viteBuild({\n ...baseConfig,\n publicDir: false,\n build: {\n ...viteConfig?.build,\n rolldownOptions: {\n ...viteConfig?.build?.rolldownOptions,\n input: [...elements, ...bundleScripts],\n output: {\n format: 'esm',\n entryFileNames: 'assets/[hash].min.js',\n assetFileNames: 'assets/[hash][extname]',\n chunkFileNames: 'chunks/[hash].min.js',\n sanitizeFileName: sanitizeFileName,\n ...viteConfig?.build?.rolldownOptions?.output,\n },\n },\n outDir: path.join(distDir, '.build/client'),\n ssr: false,\n ssrManifest: false,\n manifest: true,\n cssCodeSplit: true,\n target: 'esnext',\n minify: true,\n modulePreload: {polyfill: false},\n reportCompressedSize: false,\n },\n });\n } else {\n await writeFile(\n path.join(distDir, '.build/client/.vite/manifest.json'),\n '{}'\n );\n }\n\n // Bundle the root.config.ts file to dist/root.config.js.\n await bundleRootConfig(rootDir, path.join(distDir, 'root.config.js'));\n\n // Copy CSS files from `dist/.build/routes/**/*.css` to\n // `dist/.build/client/` and flatten the routes manifest to ignore any\n // imported modules. Then add the route assets to the client manifest.\n await copyGlob(\n '**/*.css',\n path.join(distDir, '.build/routes'),\n path.join(distDir, '.build/client')\n );\n const routesManifest = await loadJson<Manifest>(\n path.join(distDir, '.build/routes/.vite/manifest.json')\n );\n const clientManifest = await loadJson<Manifest>(\n path.join(distDir, '.build/client/.vite/manifest.json')\n );\n function collectRouteCss(\n asset: ManifestChunk,\n cssDeps: Set<string>,\n visited: Set<string>\n ) {\n if (!asset || !asset.file || visited.has(asset.file)) {\n return;\n }\n visited.add(asset.file);\n if (asset.css) {\n asset.css.forEach((dep) => cssDeps.add(dep));\n }\n if (asset.imports) {\n asset.imports.forEach((manifestKey) => {\n collectRouteCss(routesManifest[manifestKey], cssDeps, visited);\n });\n }\n }\n Object.keys(routesManifest).forEach((manifestKey) => {\n const asset = routesManifest[manifestKey];\n if (asset.isEntry) {\n const visited = new Set<string>();\n const cssDeps = new Set<string>();\n collectRouteCss(asset, cssDeps, visited);\n asset.css = Array.from(cssDeps);\n asset.imports = [];\n clientManifest[manifestKey] = asset;\n } else if (asset.file.endsWith('.css')) {\n clientManifest[manifestKey] = asset;\n }\n });\n\n // Use the output of the client build to generate an asset map, which is used\n // by the renderer for automatically injecting dependencies for a page.\n const assetMap = BuildAssetMap.fromViteManifest(\n rootConfig,\n clientManifest,\n elementGraph\n );\n\n // Save the root's asset map to `dist/.root/manifest.json` for use by the prod\n // SSR server.\n const rootManifest = assetMap.toJson();\n await writeFile(\n path.join(distDir, '.root/manifest.json'),\n JSON.stringify(rootManifest, null, 2)\n );\n\n // Save the element graph to `dist/.root/elements.json` for use by the prod\n // SSR server.\n const elementGraphJson = elementGraph.toJson();\n await writeFile(\n path.join(distDir, '.root/elements.json'),\n JSON.stringify(elementGraphJson, null, 2)\n );\n\n // Write SSG output to `dist/html`.\n const buildDir = path.join(distDir, 'html');\n\n // Recursively copy files from `public` to `dist/html`.\n const publicDir = path.join(rootDir, 'public');\n if (fsExtra.existsSync(path.join(rootDir, 'public'))) {\n fsExtra.copySync(publicDir, buildDir, {dereference: true});\n } else {\n await makeDir(buildDir);\n }\n\n const seenAssets = new Set<string>();\n async function copyAssetToDistHtml(assetUrl: string) {\n if (seenAssets.has(assetUrl)) {\n return;\n }\n seenAssets.add(assetUrl);\n const assetRelPath = assetUrl.slice(1);\n const assetFrom = path.join(distDir, '.build/client', assetRelPath);\n const assetTo = path.join(buildDir, assetRelPath);\n // Ignore assets that don't exist. This is because build artifacts from\n // the routes/ folder are not copied to dist/client (only css deps are).\n if (!(await fileExists(assetFrom))) {\n console.log(`${assetFrom} does not exist`);\n return;\n }\n await fsExtra.copy(assetFrom, assetTo);\n printFileOutput(fileSize(assetTo), 'dist/html/', assetRelPath);\n }\n\n // Copy files from `dist/client/{assets,chunks}` to `dist/html` using the\n // root manifest. Ignore route files.\n console.log('\\njs/css output:');\n await Promise.all(\n Object.keys(rootManifest).map(async (src) => {\n const assetData = rootManifest[src];\n // Only imported css from routes files should be included in build output.\n // Don't expose route files in the final output. If any client-side code\n // relies on route dependencies, it should probably be broken out into a\n // shared component instead.\n if (isRouteFile(src)) {\n const importedCss = assetData.importedCss || [];\n for (const cssAssetUrl of importedCss) {\n await copyAssetToDistHtml(cssAssetUrl);\n }\n return;\n }\n\n // Ignore files with no assetUrl, which can sometimes occur if a source\n // file is empty.\n if (!assetData.assetUrl) {\n return;\n }\n\n // Copy assets and any imported css files.\n await copyAssetToDistHtml(assetData.assetUrl);\n const importedCss = assetData.importedCss || [];\n for (const cssAssetUrl of importedCss) {\n await copyAssetToDistHtml(cssAssetUrl);\n }\n })\n );\n\n // Pre-render HTML pages (SSG).\n if (!ssrOnly) {\n const render: RenderModule = await import(\n path.join(distDir, 'server/render.js')\n );\n const renderer = new render.Renderer(rootConfig, {assetMap, elementGraph});\n let sitemap = await renderer.getSitemap();\n\n // If the `--filter` flag is passed, build only the paths that match the\n // given regex.\n if (options?.filter) {\n const filterRegex = new RegExp(`^${options.filter}`);\n const filteredSitemap: Sitemap = {};\n Object.entries(sitemap).forEach(([urlPath, sitemapItem]) => {\n if (urlPath.match(filterRegex)) {\n filteredSitemap[urlPath] = sitemapItem;\n }\n });\n sitemap = filteredSitemap;\n }\n\n const sitemapXmlItems: Array<{\n url: string;\n locale: string;\n alts: Array<{locale: string; hreflang: string; url: string}>;\n }> = [];\n if (rootConfig.sitemap && !rootConfig.domain) {\n throw new Error(\n 'missing \"domain\" in root.config.ts, required when using {sitemap: true}'\n );\n }\n const domain = rootConfig.domain!;\n\n console.log('\\nhtml output:');\n const batchSize = Number(options?.concurrency || 10);\n\n await batchAsyncCalls(\n Object.entries(sitemap),\n batchSize,\n async ([urlPath, sitemapItem]) => {\n // If \"excludeDefaultLocaleFromIntlPaths\" is true, ignore /intl/en/... in\n // the SSG build and exclude it from sitemap.xml.\n if (rootConfig.build?.excludeDefaultLocaleFromIntlPaths) {\n const defaultLocale = rootConfig.i18n?.defaultLocale || 'en';\n if (sitemapItem.locale === defaultLocale) {\n return;\n }\n }\n\n try {\n const routeModule = sitemapItem.route.module;\n if (routeModule.getStaticContent) {\n let props: any;\n if (routeModule.getStaticProps) {\n props = await routeModule.getStaticProps({\n rootConfig,\n params: sitemapItem.params,\n });\n if (props?.notFound) {\n return;\n }\n } else {\n props = {rootConfig, params: sitemapItem.params};\n }\n const result = await routeModule.getStaticContent(props);\n let body: string;\n if (typeof result === 'string') {\n body = result;\n } else if (result && typeof result === 'object') {\n body = result.body;\n } else {\n body = '';\n }\n const outFilePath = urlPath.slice(1);\n const outPath = path.join(buildDir, outFilePath);\n await makeDir(path.dirname(outPath));\n await writeFile(outPath, body);\n printFileOutput(fileSize(outPath), 'dist/html/', outFilePath);\n return;\n }\n\n const data = await renderer.renderRoute(sitemapItem.route, {\n routeParams: sitemapItem.params,\n });\n if (data.notFound) {\n return;\n }\n\n let outFilePath = path.join(urlPath.slice(1), 'index.html');\n if (outFilePath.endsWith('404/index.html')) {\n outFilePath = outFilePath.replace('404/index.html', '404.html');\n }\n const outPath = path.join(buildDir, outFilePath);\n\n // Save the url to sitemap.xml. Ignore error files (e.g. 404.html).\n if (rootConfig.sitemap && outFilePath.endsWith('index.html')) {\n const sitemapXmlItem: {\n url: string;\n locale: string;\n alts: Array<{locale: string; hreflang: string; url: string}>;\n } = {\n url: `${domain}${urlPath}`,\n locale: sitemapItem.locale,\n alts: [],\n };\n sitemapXmlItems.push(sitemapXmlItem);\n if (sitemapItem.alts) {\n Object.entries(sitemapItem.alts).forEach(([altLocale, item]) => {\n sitemapXmlItem.alts.push({\n url: `${domain}${item.urlPath}`,\n locale: altLocale,\n hreflang: item.hrefLang,\n });\n });\n }\n }\n\n // Render html and save the file to dist/html.\n // TODO(stevenle): consolidate post-build html transformation logic.\n let html = data.html || '';\n if (rootConfig.prettyHtml) {\n html = await htmlPretty(html, rootConfig.prettyHtmlOptions);\n } else if (rootConfig.minifyHtml) {\n html = await htmlMinify(html, rootConfig.minifyHtmlOptions);\n }\n await writeFile(outPath, html);\n\n printFileOutput(fileSize(outPath), 'dist/html/', outFilePath);\n } catch (e) {\n logBuildError(\n {route: sitemapItem.route, params: sitemapItem.params, urlPath},\n e\n );\n throw new Error(\n `BuildError: ${urlPath} (${sitemapItem.route.src}) failed to build.`,\n {cause: e}\n );\n }\n }\n );\n\n // Generate sitemap.xml.\n if (rootConfig.sitemap) {\n const sitemapXmlBuilder: string[] = [];\n sitemapXmlItems.sort((a, b) => a.url.localeCompare(b.url));\n sitemapXmlItems.forEach((item) => {\n sitemapXmlBuilder.push('<url>');\n sitemapXmlBuilder.push(` <loc>${item.url}</loc>`);\n if (item.alts.length > 0) {\n item.alts.sort((a, b) => a.hreflang.localeCompare(b.hreflang));\n item.alts.forEach((alt) => {\n if (item.locale !== alt.locale) {\n sitemapXmlBuilder.push(\n ` <xhtml:link rel=\"alternate\" hreflang=\"${alt.hreflang}\" href=\"${alt.url}\" />`\n );\n }\n });\n }\n sitemapXmlBuilder.push('</url>');\n });\n\n const sitemapXmlLines = [\n '<?xml version=\"1.0\" encoding=\"UTF-8\"?>',\n '<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\" xmlns:xhtml=\"http://www.w3.org/1999/xhtml\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd\">',\n ...sitemapXmlBuilder,\n '</urlset>',\n ];\n const sitemapXml = sitemapXmlLines.join('\\n');\n const outPath = path.join(buildDir, 'sitemap.xml');\n await writeFile(outPath, sitemapXml);\n printFileOutput(fileSize(outPath), 'dist/html/', 'sitemap.xml');\n }\n }\n\n // Run postBuild hooks.\n for (const plugin of rootPlugins) {\n if (plugin.hooks?.postBuild) {\n await plugin.hooks.postBuild(rootConfig, {ssrOnly});\n }\n }\n}\n\nfunction isRouteFile(filepath: string) {\n return filepath.startsWith('routes') && isJsFile(filepath);\n}\n\nfunction fileSize(filepath: string) {\n const stats = fsExtra.statSync(filepath);\n const bytes = stats.size;\n\n const k = 1024;\n if (bytes < k) {\n return (bytes / k).toFixed(2) + ' kB';\n }\n const units = ['B', 'kB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + units[i];\n}\n\nfunction printFileOutput(\n fileSize: string,\n outputDir: string,\n outputFile: string\n) {\n const indent = ' '.repeat(2);\n const paddedSize = fileSize.padStart(9, ' ');\n console.log(\n `${indent}${dim(paddedSize)} ${dim(outputDir)}${cyan(outputFile)}`\n );\n}\n\nfunction sanitizeFileName(name: string): string {\n return (\n name\n // Remove placeholder vars from paths like routes/[...var].tsx.\n .replaceAll('...', '')\n .replaceAll('_', '')\n .replaceAll('[', '')\n .replaceAll(']', '')\n // Remove non-ascii chars and null bytes.\n .replace(/[^\\x00-\\x7F]/g, '')\n .replace(/\\x00/g, '')\n .toLowerCase()\n );\n}\n\ninterface BuildContext {\n route: Route;\n params: Record<string, string>;\n urlPath: string;\n}\n\nfunction logBuildError(ctx: BuildContext, e: Error) {\n const {route, params, urlPath} = ctx;\n const errorString = String(e.stack || e);\n console.error();\n if (Object.keys(params).length > 0) {\n console.error(\n `An error occurred building ${urlPath} (${route.src}) with params:\n${formatParams(params)}\n\nThe error was:\n ${errorString}\n `.trim()\n );\n } else {\n console.error(\n `An error occurred building ${urlPath} (${route.src})\n\nThe error was:\n ${errorString}`\n );\n }\n}\n\nfunction formatParams(params: Record<string, string>) {\n return Object.entries(params)\n .map(([key, value]) => {\n return ` ${key}: ${value}`;\n })\n .join('\\n');\n}\n", "import fs from 'node:fs';\nimport path from 'node:path';\nimport glob from 'tiny-glob';\nimport {searchForWorkspaceRoot} from 'vite';\nimport {RootConfig} from '../core/config.js';\nimport {isValidTagName, parseTagNames} from '../utils/elements.js';\nimport {directoryContains, isDirectory, isJsFile} from '../utils/fsutils.js';\nimport type {ResolvedPod} from './pod-collector.js';\n\ninterface ElementSourceFile {\n /** Full file path. */\n filePath: string;\n /** Path relative to the root project directory. */\n relPath: string;\n}\n\n/**\n * Dependency graph for element files to capture which other elements are used\n * by any particular element.\n */\nexport class ElementGraph {\n /**\n * Element tagName => sourceFile.\n */\n readonly sourceFiles: {[tagName: string]: ElementSourceFile} = {};\n\n /**\n * Element tagName => set of element tagName dependencies.\n */\n private deps: Record<string, string[]> = {};\n\n constructor(sourceFiles: {[tagName: string]: ElementSourceFile}) {\n this.sourceFiles = sourceFiles;\n }\n\n toJson() {\n for (const tagName in this.sourceFiles) {\n this.deps[tagName] ??= this.parseDepsFromSource(tagName);\n }\n return {\n sourceFiles: this.sourceFiles,\n deps: this.deps,\n };\n }\n\n static fromJson(data: {deps: any; sourceFiles: any}) {\n const graph = new ElementGraph(data.sourceFiles);\n graph.deps = data.deps;\n return graph;\n }\n\n getDeps(tagName: string, visited?: Set<string>): string[] {\n visited ??= new Set();\n if (visited.has(tagName)) {\n return [];\n }\n\n visited.add(tagName);\n this.deps[tagName] ??= this.parseDepsFromSource(tagName);\n\n const deps = new Set(this.deps[tagName]);\n for (const depTagName of this.deps[tagName]) {\n for (const childDep of this.getDeps(depTagName, visited)) {\n deps.add(childDep);\n }\n }\n return Array.from(deps);\n }\n\n /**\n * Parses an element's source file for usage of other custom elements.\n */\n private parseDepsFromSource(tagName: string): string[] {\n const srcFile = this.sourceFiles[tagName];\n if (!srcFile) {\n throw new Error(`could not find file path for tagName <${tagName}>`);\n }\n const src = fs.readFileSync(srcFile.filePath, 'utf-8');\n const tagNames = parseTagNames(src);\n const deps = new Set<string>();\n for (const depTagName of tagNames) {\n if (depTagName !== tagName && depTagName in this.sourceFiles) {\n deps.add(depTagName);\n }\n }\n return Array.from(deps);\n }\n}\n\n/**\n * Returns a map of all the element file definitions in the project.\n */\nexport async function getElements(\n rootConfig: RootConfig,\n pods?: ResolvedPod[]\n): Promise<ElementGraph> {\n const rootDir = rootConfig.rootDir;\n\n const elementsDirs = getElementsDirs(rootConfig, pods);\n const excludePatterns = rootConfig.elements?.exclude || [];\n const excludeElement = (moduleId: string) => {\n return excludePatterns.some((pattern) => Boolean(moduleId.match(pattern)));\n };\n\n const elementFilePaths: {[tagName: string]: ElementSourceFile} = {};\n for (const dirPath of elementsDirs) {\n if (await isDirectory(dirPath)) {\n const files = await glob('**/*', {cwd: dirPath});\n files.forEach((file) => {\n const parts = path.parse(file);\n if (isJsFile(parts.base) && isValidTagName(parts.name)) {\n const tagName = parts.name;\n const filePath = path.join(dirPath, file);\n const relPath = path.relative(rootDir, filePath);\n if (!excludeElement(relPath)) {\n elementFilePaths[tagName] = {filePath, relPath};\n }\n }\n });\n }\n }\n\n const graph = new ElementGraph(elementFilePaths);\n return graph;\n}\n\n/**\n * Get all element dirs.\n */\nexport function getElementsDirs(rootConfig: RootConfig, pods?: ResolvedPod[]) {\n const rootDir = rootConfig.rootDir;\n const workspaceRoot = searchForWorkspaceRoot(rootDir);\n\n const elementsDirs = [path.join(rootDir, 'elements')];\n const elementsInclude = rootConfig.elements?.include || [];\n\n for (const dirPath of elementsInclude) {\n const elementsDir = path.resolve(rootDir, dirPath);\n if (!directoryContains(rootDir, elementsDir)) {\n throw new Error(\n `the elements dir (${dirPath}) should be within the project's workspace (${workspaceRoot})`\n );\n }\n elementsDirs.push(elementsDir);\n }\n\n // Pod-contributed element dirs bypass the workspace containment check\n // because they are trusted (registered by plugins, not user input).\n if (pods) {\n for (const pod of pods) {\n for (const dir of pod.elementsDirs) {\n elementsDirs.push(dir);\n }\n }\n }\n\n return elementsDirs;\n}\n", "import {dim} from 'kleur/colors';\nimport type {Plugin} from 'vite';\n\n/**\n * Vite plugin that removes 0-byte JS chunks from the build output and prunes\n * the import statements that reference them.\n *\n * Tree-shaking (via rolldown/esbuild) can reduce a module to nothing \u2014 e.g. a\n * type-only `.ts` file, or an entry whose contents are entirely eliminated.\n * rolldown still emits a file for every explicit input, so these surface as\n * 0-byte `.js` files in the build output. Worse, a sibling chunk may keep a\n * bare side-effect import (`import \"./<hash>.js\"`) pointing at the empty file.\n * If that empty file is removed without also removing the import, the import\n * 404s at runtime and breaks the entire module graph.\n *\n * This plugin runs in `generateBundle` (before Vite's manifest plugin) and:\n * 1. Detects chunks whose generated code is empty.\n * 2. Skips any that still anchor CSS or asset references, so co-located\n * styles are preserved (Vite keeps an empty JS chunk to carry the CSS\n * link for a style-only module).\n * 3. Strips bare side-effect imports of the empty chunks from sibling chunks.\n * A 0-byte module exports nothing, so it can only be imported bare.\n * 4. Deletes the empty chunks from the bundle.\n *\n * Because it runs before the manifest is emitted, the resulting\n * `manifest.json` (consumed by Root's asset map) never references the removed\n * files.\n */\nexport function pruneEmptyChunksPlugin(): Plugin {\n return {\n name: 'root:prune-empty-chunks',\n generateBundle: {\n // Run before Vite's manifest plugin so the manifest reflects removals.\n order: 'pre',\n handler(_options, bundle) {\n const emptyChunks = new Set<string>();\n for (const [fileName, item] of Object.entries(bundle)) {\n if (item.type !== 'chunk' || item.code.trim() !== '') {\n continue;\n }\n // Keep empty chunks that still anchor CSS or asset references, since\n // removing them would drop those deps from the manifest.\n const css = item.viteMetadata?.importedCss;\n const assets = item.viteMetadata?.importedAssets;\n if ((css && css.size > 0) || (assets && assets.size > 0)) {\n continue;\n }\n emptyChunks.add(fileName);\n }\n if (emptyChunks.size === 0) {\n return;\n }\n\n // Remove references to the empty chunks from every sibling chunk.\n for (const item of Object.values(bundle)) {\n if (item.type !== 'chunk') {\n continue;\n }\n const referenced = new Set(\n [...(item.imports || []), ...(item.dynamicImports || [])].filter(\n (fileName) => emptyChunks.has(fileName)\n )\n );\n for (const emptyFileName of referenced) {\n item.code = removeSideEffectImport(item.code, emptyFileName);\n }\n if (item.imports) {\n item.imports = item.imports.filter((f) => !emptyChunks.has(f));\n }\n if (item.dynamicImports) {\n item.dynamicImports = item.dynamicImports.filter(\n (f) => !emptyChunks.has(f)\n );\n }\n }\n\n for (const fileName of emptyChunks) {\n delete bundle[fileName];\n }\n\n const removed = Array.from(emptyChunks).sort();\n console.log(\n `${dim('\u2503')} pruned ${removed.length} empty chunk(s): ${dim(\n removed.join(', ')\n )}`\n );\n },\n },\n };\n}\n\n/**\n * Removes bare side-effect imports of `fileName` from the given chunk code.\n *\n * The empty module has no exports, so it can only be imported via a bare\n * `import \"...\"` statement. The rendered specifier is a relative path ending\n * in the chunk's file name (e.g. `./abc.min.js` or `../chunks/abc.min.js`).\n */\nfunction removeSideEffectImport(code: string, fileName: string): string {\n const base = fileName.split('/').pop() || fileName;\n const escaped = base.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n const re = new RegExp(`import\\\\s*[\"'][^\"']*${escaped}[\"']\\\\s*;?`, 'g');\n return code.replace(re, '');\n}\n", "import fs from 'node:fs';\nimport path from 'node:path';\nimport {Manifest} from 'vite';\nimport {RootConfig} from '../../core/config.js';\nimport {ElementGraph} from '../../node/element-graph.js';\nimport {isJsFile} from '../../utils/fsutils.js';\nimport {Asset, AssetMap} from './asset-map.js';\n\nexport type BuildAssetManifest = Record<\n string,\n {\n src: string;\n assetUrl: string;\n importedModules: string[];\n importedCss: string[];\n isElement: boolean;\n }\n>;\n\nexport class BuildAssetMap implements AssetMap {\n private rootConfig: RootConfig;\n private srcToAsset: Map<string, BuildAsset>;\n\n constructor(rootConfig: RootConfig) {\n this.rootConfig = rootConfig;\n this.srcToAsset = new Map();\n }\n\n async get(src: string): Promise<Asset | null> {\n const asset = this.srcToAsset.get(src);\n if (asset) {\n return asset;\n }\n // Try resolving the realpath of the asset, following symlinks.\n const realSrc = realPathRelativeTo(this.rootConfig.rootDir, src);\n if (realSrc !== src) {\n const asset = this.srcToAsset.get(realSrc);\n if (asset) {\n return asset;\n }\n }\n console.log(`could not find build asset: ${src}`);\n return null;\n }\n\n private add(asset: BuildAsset) {\n this.srcToAsset.set(asset.src, asset);\n }\n\n toJson(): BuildAssetManifest {\n const result: BuildAssetManifest = {};\n for (const src of this.srcToAsset.keys()) {\n result[src] = this.srcToAsset.get(src)!.toJson();\n }\n return result;\n }\n\n static fromViteManifest(\n rootConfig: RootConfig,\n clientManifest: Manifest,\n elementsGraph: ElementGraph\n ) {\n const assetMap = new BuildAssetMap(rootConfig);\n\n const elementFiles = new Set();\n Object.values(elementsGraph.sourceFiles).forEach((elementSource) => {\n elementFiles.add(elementSource.relPath);\n // Vite will resolve symlinks, so we need to follow the src and add the\n // realpath to the element files.\n const realSrc = realPathRelativeTo(\n rootConfig.rootDir,\n elementSource.relPath\n );\n if (realSrc !== elementSource.filePath) {\n elementFiles.add(realSrc);\n }\n });\n\n Object.keys(clientManifest).forEach((manifestKey) => {\n const src = manifestKey;\n const manifestChunk = clientManifest[manifestKey];\n const isElement = elementFiles.has(src);\n // NOTES(stevenle): routes/ files are included in the manifest for\n // their CSS deps, but do not have an asset URL.\n const assetUrl =\n src.startsWith('routes/') && isJsFile(src)\n ? ''\n : `/${manifestChunk.file}`;\n const assetData = {\n src: src,\n assetUrl: assetUrl,\n importedModules: manifestChunk.imports || [],\n importedCss: (manifestChunk.css || []).map((relPath) => `/${relPath}`),\n isElement: isElement,\n };\n assetMap.add(new BuildAsset(assetMap, assetData));\n });\n\n return assetMap;\n }\n\n static fromRootManifest(\n rootConfig: RootConfig,\n rootManifest: BuildAssetManifest\n ) {\n const assetMap = new BuildAssetMap(rootConfig);\n Object.keys(rootManifest).forEach((moduleId) => {\n const assetData = rootManifest[moduleId];\n assetMap.add(new BuildAsset(assetMap, assetData));\n });\n return assetMap;\n }\n}\n\n/**\n * Returns the realpath of a src file, relative to the rootDir.\n */\nfunction realPathRelativeTo(rootDir: string, src: string) {\n const fullPath = path.resolve(rootDir, src);\n if (!fs.existsSync(fullPath)) {\n return src;\n }\n const realpath = fs.realpathSync(path.resolve(rootDir, src));\n return path.relative(rootDir, realpath);\n}\n\nexport class BuildAsset {\n src: string;\n assetUrl: string;\n private assetMap: BuildAssetMap;\n private importedModules: string[];\n private importedCss: string[];\n isElement: boolean;\n\n constructor(\n assetMap: BuildAssetMap,\n assetData: {\n src: string;\n assetUrl: string;\n importedModules: string[];\n importedCss: string[];\n isElement: boolean;\n }\n ) {\n this.assetMap = assetMap;\n this.src = assetData.src;\n this.assetUrl = assetData.assetUrl;\n this.importedModules = assetData.importedModules;\n this.importedCss = assetData.importedCss;\n this.isElement = assetData.isElement;\n }\n\n async getCssDeps(): Promise<string[]> {\n const visited = new Set<string>();\n const deps = new Set<string>();\n await this.collectCss(this, deps, visited);\n return Array.from(deps);\n }\n\n async getJsDeps(): Promise<string[]> {\n const visited = new Set<string>();\n const deps = new Set<string>();\n await this.collectJs(this, deps, visited);\n return Array.from(deps);\n }\n\n private async collectJs(\n asset: BuildAsset | null,\n urls: Set<string>,\n visited: Set<string>\n ) {\n if (!asset) {\n return;\n }\n if (!asset.src) {\n return;\n }\n if (visited.has(asset.src)) {\n return;\n }\n visited.add(asset.src);\n if (asset.isElement) {\n urls.add(asset.assetUrl);\n }\n await Promise.all(\n asset.importedModules.map(async (src) => {\n const importedAsset = (await this.assetMap.get(src)) as BuildAsset;\n this.collectJs(importedAsset, urls, visited);\n })\n );\n }\n\n private async collectCss(\n asset: BuildAsset | null,\n urls: Set<string>,\n visited: Set<string>\n ) {\n if (!asset) {\n return;\n }\n if (!asset.src) {\n return;\n }\n if (visited.has(asset.src)) {\n return;\n }\n visited.add(asset.src);\n if (asset.importedCss) {\n asset.importedCss.forEach((cssUrl) => urls.add(cssUrl));\n }\n await Promise.all(\n asset.importedModules.map(async (moduleId) => {\n const importedAsset = (await this.assetMap.get(moduleId)) as BuildAsset;\n this.collectCss(importedAsset, urls, visited);\n })\n );\n }\n\n toJson() {\n return {\n src: this.src,\n assetUrl: this.assetUrl,\n importedModules: this.importedModules,\n importedCss: this.importedCss,\n isElement: this.isElement,\n };\n }\n}\n", "export async function batchAsyncCalls<T, U>(\n data: T[],\n concurrency: number,\n asyncFunction: (item: T) => Promise<U>\n): Promise<U[]> {\n const result: U[] = new Array(data.length);\n let nextIndex = 0;\n\n async function worker() {\n while (nextIndex < data.length) {\n const index = nextIndex++;\n result[index] = await asyncFunction(data[index]);\n }\n }\n\n const workers = Array.from({length: Math.min(concurrency, data.length)}, () =>\n worker()\n );\n await Promise.all(workers);\n return result;\n}\n", "import {promises as fs} from 'node:fs';\nimport path from 'node:path';\nimport {fileURLToPath} from 'node:url';\nimport glob from 'tiny-glob';\nimport {dirExists, makeDir, rmDir, writeFile} from '../utils/fsutils.js';\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\n\ninterface CodegenOptions {\n out?: string;\n}\n\ninterface Template {\n read: () => Promise<string>;\n}\n\ntype TemplateMap = Record<string, Template>;\n\nexport async function codegen(\n type: string,\n name: string,\n options?: CodegenOptions\n) {\n const rootDir = path.resolve(process.cwd());\n const project = new Project(rootDir);\n await project.generateCode(type, name, options);\n}\n\nclass Project {\n rootDir: string;\n tplDirs: string[];\n\n constructor(rootDir: string) {\n this.rootDir = rootDir;\n this.tplDirs = [\n path.join(rootDir, 'codegen'),\n path.join(__dirname, '../codegen'),\n ];\n }\n\n async generateCode(type: string, name: string, options?: CodegenOptions) {\n const files = await this.loadFiles(type);\n if (Object.keys(files).length === 0) {\n console.log(`no files in codegen/${type}/*.tpl`);\n return;\n }\n\n // By default, running `root codegen template Foo` outputs to\n // `<rootDir>/templates/Foo`.\n const outname = options?.out || `${type}s`;\n const outdir = path.join(this.rootDir, outname, name);\n if (await dirExists(outdir)) {\n await rmDir(outdir);\n }\n await makeDir(outdir);\n\n for (const tplName in files) {\n const tpl = await files[tplName].read();\n const content = tpl\n .replaceAll('[[name]]', name)\n .replaceAll('[[name:camel_upper]]', toCamelCaseUpper(name));\n const filename = tplName.replace('[name]', name);\n const filepath = path.join(outdir, filename);\n await writeFile(filepath, content);\n console.log(`saved ${filepath}`);\n }\n }\n\n /**\n * Searches the project's \"codegen\" dir (or fallsback to root's \"codegen\" dir)\n * and returns a `TemplateMap` for all files in `codgen/<type>/*.tpl`.\n */\n async loadFiles(type: string): Promise<TemplateMap> {\n for (const tplDir of this.tplDirs) {\n const typeDir = path.join(tplDir, type);\n if (await dirExists(typeDir)) {\n return this.loadTplFiles(typeDir);\n }\n }\n return {};\n }\n\n /**\n * Reads files matching `*.tpl` in a given directory.\n */\n private async loadTplFiles(dirpath: string): Promise<TemplateMap> {\n const tplFiles: TemplateMap = {};\n const files = await glob('*.tpl', {cwd: dirpath});\n for (const filename of files) {\n const filepath = path.join(dirpath, filename);\n // Remove `.tpl`.\n const name = filename.slice(0, -4);\n tplFiles[name] = {\n read: () => fs.readFile(filepath, 'utf-8'),\n };\n }\n return tplFiles;\n }\n}\n\nfunction toCamelCaseUpper(str: string) {\n const segments = str.split('-');\n return segments.map((part) => toTitleCase(part)).join('');\n}\n\nfunction toTitleCase(str: string) {\n const ch = String(str).charAt(0).toUpperCase();\n return `${ch}${str.slice(1)}`;\n}\n", "import {promises as fs} from 'node:fs';\nimport path from 'node:path';\nimport {build as esbuild} from 'esbuild';\nimport {flattenPackageDepsFromMonorepo} from '../node/monorepo.js';\nimport {\n copyDir,\n dirExists,\n fileExists,\n loadJson,\n makeDir,\n rmDir,\n writeJson,\n} from '../utils/fsutils.js';\nimport {build as rootBuild} from './build.js';\n\ntype DeployTarget = 'appengine' | 'firebase';\n\ninterface CreatePackageOptions {\n mode?: string;\n out?: string;\n target?: DeployTarget;\n version?: string;\n appYaml?: string;\n}\n\ninterface PeerDependencyMeta {\n optional?: boolean;\n}\n\ninterface PackageJson {\n [key: string]: any;\n scripts?: Record<string, string>;\n dependencies?: Record<string, string>;\n peerDependencies?: Record<string, string>;\n peerDependenciesMeta?: Record<string, PeerDependencyMeta>;\n workspaces?: string[];\n}\n\nexport async function createPackage(\n rootProjectDir?: string,\n options?: CreatePackageOptions\n) {\n const mode = options?.mode || 'production';\n process.env.NODE_ENV = mode;\n\n const rootDir = path.resolve(rootProjectDir || process.cwd());\n // const rootConfig = await loadRootConfig(rootDir, {command: 'build'});\n const distDir = path.join(rootDir, 'dist');\n const target = options?.target || (await getDefaultTarget(rootDir));\n const outDir = path.resolve(options?.out || target || 'out');\n\n // Build the site in ssr-only mode.\n await rootBuild(rootProjectDir, {ssrOnly: true, mode: mode});\n\n // Create `outDir` and copy the generated `distDir` files to it.\n await rmDir(outDir);\n await makeDir(outDir);\n await copyDir(distDir, path.resolve(outDir, 'dist'));\n\n // Copy the \"collections\" dir if it exists.\n const collectionsDir = path.resolve(rootDir, 'collections');\n if (await dirExists(collectionsDir)) {\n await copyDir(collectionsDir, path.join(outDir, 'collections'));\n }\n\n // Create package.json.\n const packageJson = await generatePackageJson(rootDir, options);\n\n // Set root.js versions.\n if (options?.version && packageJson.dependencies) {\n if (packageJson.dependencies['@blinkk/root']) {\n packageJson.dependencies['@blinkk/root'] = options.version;\n }\n if (packageJson.dependencies['@blinkk/root-cms']) {\n packageJson.dependencies['@blinkk/root-cms'] = options.version;\n }\n if (packageJson.dependencies['@blinkk/root-password-protect']) {\n packageJson.dependencies['@blinkk/root-password-protect'] =\n options.version;\n }\n }\n\n // Run target-specific updates to the output.\n if (target === 'appengine') {\n const appYamlPath = options?.appYaml || path.join(rootDir, 'app.yaml');\n await onAppEngine({packageJson, outDir, appYamlPath});\n } else if (target === 'firebase') {\n await onFirebase({rootDir, packageJson, outDir});\n }\n\n // Save `outDir/package.json`.\n await writeJson(path.resolve(outDir, 'package.json'), packageJson);\n\n console.log('done!');\n console.log(`saved package to ${outDir}`);\n}\n\nasync function getDefaultTarget(rootDir: string): Promise<DeployTarget | null> {\n // Default to firebase if a firebase.json file exists in the root dir.\n const firebaseConfigPath = path.resolve(rootDir, 'firebase.json');\n if (await fileExists(firebaseConfigPath)) {\n return 'firebase';\n }\n\n // Default to appengine.\n const appEngineConfigPath = path.resolve(rootDir, 'app.yaml');\n if (await fileExists(appEngineConfigPath)) {\n return 'appengine';\n }\n\n return null;\n}\n\nasync function generatePackageJson(\n rootDir: string,\n options?: CreatePackageOptions\n): Promise<PackageJson> {\n // Read the package.json.\n const packageJson: PackageJson = await loadJson<any>(\n path.resolve(rootDir, 'package.json')\n );\n\n // Flatten any deps from the monorepo, and remove peerDependencies and\n // devDependencies.\n const allDeps = flattenPackageDepsFromMonorepo(rootDir);\n packageJson.dependencies ??= {} as Record<string, string>;\n for (const depName in allDeps) {\n if (!packageJson.dependencies[depName]) {\n packageJson.dependencies[depName] = allDeps[depName];\n }\n }\n\n Object.entries(packageJson.dependencies).forEach(([depName, depVersion]) => {\n if (depName.startsWith('@blinkk/root') && options?.version) {\n // Replace root version with the current version.\n packageJson.dependencies![depName] = options.version;\n } else if (depVersion.startsWith('workspace:')) {\n // Remove `workspace:` deps.\n delete packageJson.dependencies![depName];\n }\n });\n if (packageJson.peerDependencies) {\n delete packageJson.peerDependencies;\n }\n if (packageJson.devDependencies) {\n delete packageJson.devDependencies;\n }\n\n return packageJson;\n}\n\n/**\n * Called for App Engine targets.\n */\nasync function onAppEngine(options: {\n packageJson: PackageJson;\n outDir: string;\n appYamlPath: string;\n}) {\n const {outDir, packageJson, appYamlPath} = options;\n if (await fileExists(appYamlPath)) {\n await fs.copyFile(appYamlPath, path.resolve(outDir, 'app.yaml'));\n }\n\n // Only include the \"start\" script.\n if (packageJson.scripts?.start) {\n packageJson.scripts = {start: packageJson.scripts.start};\n } else {\n packageJson.scripts = {start: 'root start --host=0.0.0.0'};\n }\n}\n\n/**\n * Called for Firebase Hosting targets.\n */\nasync function onFirebase(options: {\n rootDir: string;\n packageJson: PackageJson;\n outDir: string;\n}) {\n const {rootDir, outDir, packageJson} = options;\n\n // If the outDir is called `functions/` and an index.ts file exists in the\n // root project dir, automatically compile it through esbuild.\n const outBasename = path.basename(outDir);\n if (outBasename === 'functions') {\n const indexTsFile = path.resolve(rootDir, 'index.ts');\n if (await fileExists(indexTsFile)) {\n await bundleTsFile(indexTsFile, path.resolve(outDir, 'index.js'));\n }\n }\n\n // Only include the \"start\" script.\n if (packageJson.scripts?.start) {\n packageJson.scripts = {start: packageJson.scripts.start};\n } else {\n packageJson.scripts = {start: 'root start --host=0.0.0.0'};\n }\n}\n\n/**\n * Compiles a `.ts` file to `.js`.\n */\nexport async function bundleTsFile(srcPath: string, outPath: string) {\n await esbuild({\n entryPoints: [srcPath],\n bundle: true,\n minify: true,\n platform: 'node',\n outfile: outPath,\n sourcemap: 'inline',\n metafile: true,\n format: 'esm',\n plugins: [\n {\n name: 'externalize-deps',\n setup(build: any) {\n build.onResolve({filter: /.*/}, (args: any) => {\n const id = args.path;\n if (id[0] !== '.' && !path.isAbsolute(id)) {\n return {\n external: true,\n };\n }\n return null;\n });\n },\n },\n ],\n });\n}\n", "import http from 'node:http';\nimport path from 'node:path';\nimport {fileURLToPath} from 'node:url';\n\nimport cookieParser from 'cookie-parser';\nimport {default as express} from 'express';\nimport {dim} from 'kleur/colors';\nimport sirv from 'sirv';\nimport glob from 'tiny-glob';\n\nimport {ViteDevServer} from 'vite';\nimport {RootConfig} from '../core/config.js';\nimport {configureServerPlugins} from '../core/plugin.js';\nimport {Server, Request, Response, NextFunction} from '../core/types.js';\nimport {hooksMiddleware} from '../middleware/hooks.js';\nimport {\n headersMiddleware,\n rootProjectMiddleware,\n trailingSlashMiddleware,\n} from '../middleware/middleware.js';\nimport {redirectsMiddleware} from '../middleware/redirects.js';\nimport {sessionMiddleware} from '../middleware/session.js';\nimport {getElements, getElementsDirs} from '../node/element-graph.js';\nimport {loadRootConfigWithDeps} from '../node/load-config.js';\nimport {collectPods} from '../node/pod-collector.js';\nimport {createViteServer} from '../node/vite.js';\nimport {DevServerAssetMap} from '../render/asset-map/dev-asset-map.js';\nimport {dirExists, isDirectory, isJsFile} from '../utils/fsutils.js';\nimport {findOpenPort} from '../utils/ports.js';\nimport {getSessionCookieSecret} from '../utils/rand.js';\nimport {runStartupTasks} from './startup/startup-tasks.js';\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\n\ntype RenderModule = typeof import('../render/render.js');\nconst DEV_SERVER_404_LOG_IGNORE_PATHS = new Set([\n '/.well-known/appspecific/com.chrome.devtools.json',\n]);\n\nexport interface DevOptions {\n host?: string;\n version?: string;\n}\n\nexport async function dev(rootProjectDir?: string, options?: DevOptions) {\n process.env.NODE_ENV = 'development';\n const rootDir = path.resolve(rootProjectDir || process.cwd());\n const defaultPort = parseInt(process.env.PORT || '4007');\n const host = options?.host || 'localhost';\n const port = await findOpenPort(defaultPort, defaultPort + 10);\n\n // Run startup tasks (e.g. the npm version check) without blocking server\n // startup. Failures are handled internally and never interrupt `root dev`.\n void runStartupTasks({rootDir, version: options?.version});\n\n let currentServer: http.Server | null = null;\n let currentViteServer: ViteDevServer | null = null;\n\n async function start() {\n const server = await createDevServer({rootDir, port});\n const rootConfig: RootConfig = server.get('rootConfig');\n const viteServer: ViteDevServer = server.get('viteServer');\n currentViteServer = viteServer;\n\n const basePath = rootConfig.base || '';\n const homePagePath = rootConfig.server?.homePagePath || basePath;\n console.log();\n console.log(`${dim('\u2503')} project: ${rootDir}`);\n console.log(`${dim('\u2503')} server: http://${host}:${port}${homePagePath}`);\n if (testCmsEnabled(rootConfig)) {\n console.log(`${dim('\u2503')} cms: http://${host}:${port}/cms/`);\n }\n console.log(`${dim('\u2503')} mode: development`);\n console.log();\n currentServer = server.listen(port, host);\n\n // Watch for config changes.\n const rootConfigDependencies: string[] = server.get(\n 'rootConfigDependencies'\n );\n const dependencies = [\n path.resolve(rootDir, 'root.config.ts'),\n ...rootConfigDependencies,\n ];\n viteServer.watcher.add(dependencies);\n viteServer.watcher.on('change', async (file) => {\n if (dependencies.includes(file)) {\n console.log(\n `\\n${dim('\u2503')} root.config.ts changed. restarting server...`\n );\n await restart();\n }\n });\n }\n\n async function restart() {\n if (currentServer) {\n currentServer.close();\n currentServer = null;\n }\n if (currentViteServer) {\n await currentViteServer.close();\n currentViteServer = null;\n }\n await start();\n }\n\n await start();\n}\n\nexport async function createDevServer(options?: {\n rootDir?: string;\n port?: number;\n}): Promise<Server> {\n const rootDir = path.resolve(options?.rootDir || process.cwd());\n const {rootConfig, dependencies} = await loadRootConfigWithDeps(rootDir, {\n command: 'dev',\n });\n const port = options?.port;\n\n const server: Server = express();\n server.set('rootConfig', rootConfig);\n server.set('rootConfigDependencies', dependencies);\n server.disable('x-powered-by');\n\n // Create viteServer.\n const {viteServer, viteMiddleware} = await createViteMiddleware({\n rootConfig,\n port,\n });\n server.set('viteServer', viteServer);\n\n // Inject req context vars.\n server.use(rootProjectMiddleware({rootConfig}));\n server.use(viteMiddleware);\n server.use(hooksMiddleware());\n\n // Session middleware for handling session cookies.\n const sessionCookieSecret = getSessionCookieSecret(rootConfig, rootDir);\n server.use(cookieParser(sessionCookieSecret));\n server.use(sessionMiddleware());\n\n const plugins = rootConfig.plugins || [];\n await configureServerPlugins(\n server,\n async () => {\n // Add user-configured middlewares from `root.config.ts`.\n const userMiddlewares = rootConfig.server?.middlewares || [];\n for (const middleware of userMiddlewares) {\n server.use(middleware);\n }\n\n // Add redirects middlewares.\n if (rootConfig.server?.redirects) {\n server.use(\n redirectsMiddleware({redirects: rootConfig.server.redirects})\n );\n }\n\n // Add http headers middleware.\n if (rootConfig.server?.headers) {\n server.use(headersMiddleware({rootConfig: rootConfig}));\n }\n\n // Add static file middleware.\n const publicDir = path.join(rootDir, 'public');\n if (await dirExists(publicDir)) {\n server.use(rootPublicDirMiddleware({publicDir, viteServer}));\n }\n\n // NOTE: The trailing slash middleware needs to come after public files so\n // that slashes are not appended to public file routes.\n server.use(trailingSlashMiddleware({rootConfig}));\n\n // Add the root.js dev server middlewares.\n server.use(rootDevServerMiddleware());\n\n // Add any custom plugin 404 handlers.\n plugins.forEach((plugin) => {\n if (plugin.handle404) {\n server.use(plugin.handle404);\n }\n });\n\n // Add error handlers.\n server.use(rootDevServer404Middleware());\n server.use(rootDevServer500Middleware());\n },\n plugins,\n {type: 'dev', rootConfig}\n );\n\n return server;\n}\n\n/**\n * Middleware that initializes a vite server and injects it into the request\n * context.\n */\nasync function createViteMiddleware(options: {\n rootConfig: RootConfig;\n port?: number;\n}) {\n const rootConfig = options.rootConfig;\n const rootDir = rootConfig.rootDir;\n\n const pods = await collectPods(rootConfig);\n\n let elementGraph = await getElements(rootConfig, pods);\n const elements = Object.values(elementGraph.sourceFiles).map((sourceFile) => {\n return sourceFile.relPath;\n });\n\n const bundleScripts: string[] = [];\n if (await isDirectory(path.join(rootDir, 'bundles'))) {\n const bundleFiles = await glob('bundles/*', {cwd: rootDir});\n bundleFiles.forEach((file) => {\n const parts = path.parse(file);\n if (isJsFile(parts.base)) {\n bundleScripts.push(file);\n }\n });\n }\n // Add pod bundle scripts.\n for (const pod of pods) {\n for (const bundleFile of pod.bundleFiles) {\n bundleScripts.push(bundleFile);\n }\n }\n\n const optimizeDeps = [...elements, ...bundleScripts];\n const viteServer = await createViteServer(rootConfig, {\n port: options.port,\n optimizeDeps: optimizeDeps,\n });\n\n // Watch for file changes and re-generate the elements graph if any elements\n // are added or deleted.\n function isInElementsDir(changedFilePath: string) {\n const filePath = path.resolve(changedFilePath);\n const elementsDirs = getElementsDirs(rootConfig, pods);\n return elementsDirs.some((dirPath) => filePath.startsWith(dirPath));\n }\n viteServer.watcher.on('add', async (filePath: string) => {\n if (isInElementsDir(filePath)) {\n elementGraph = await getElements(rootConfig, pods);\n console.log(`element added: ${filePath}`);\n }\n });\n viteServer.watcher.on('unlink', async (filePath: string) => {\n if (isInElementsDir(filePath)) {\n elementGraph = await getElements(rootConfig, pods);\n console.log(`element deleted: ${filePath}`);\n }\n });\n\n const viteMiddleware = async (\n req: Request,\n res: Response,\n next: NextFunction\n ) => {\n try {\n // Add the viteServer to the req.\n req.viteServer = viteServer;\n // Dynamically import the render.js module using vite's SSR import loader.\n const renderModulePath = path.resolve(__dirname, './render.js');\n const render = (await viteServer.ssrLoadModule(\n renderModulePath\n )) as RenderModule;\n // Create a dev asset map using Vite dev server's module graph.\n const assetMap = new DevServerAssetMap(\n rootConfig,\n viteServer.moduleGraph\n );\n // Add a renderer object to the req for plugins and other middleware to\n // use.\n req.renderer = new render.Renderer(rootConfig, {assetMap, elementGraph});\n // Run the viteServer middlewares to handle vite-specific endpoints.\n viteServer.middlewares(req, res, next);\n } catch (e) {\n next(e);\n }\n };\n\n return {viteServer, viteMiddleware};\n}\n\nfunction rootPublicDirMiddleware(options: {\n publicDir: string;\n viteServer: ViteDevServer;\n}) {\n const publicDir = options.publicDir;\n\n // The `{dev: false}` option is used for performance reasons. When dev is set\n // to `true`, every request will traverse the filesystem to check if a\n // matching file exists. Setting it to `false` uses a cache, which can be\n // reloaded whenever a file change is detected in the `public` directory.\n const sirvOptions = {dev: false};\n let handler = sirv(publicDir, sirvOptions);\n\n const reloadPublicDirCache = debounce(() => {\n handler = sirv(publicDir, sirvOptions);\n }, 1000);\n\n function isInPublicDir(changedFilePath: string) {\n const filePath = path.resolve(changedFilePath);\n return filePath.startsWith(publicDir);\n }\n\n const watcher = options.viteServer.watcher;\n watcher.on('all', (event, filepath) => {\n if (isInPublicDir(filepath)) {\n reloadPublicDirCache();\n }\n });\n\n return (req: Request, res: Response, next: NextFunction) => {\n handler(req, res, next);\n };\n}\n\nfunction rootDevServerMiddleware() {\n return async (req: Request, res: Response, next: NextFunction) => {\n const renderer = req.renderer!;\n const viteServer = req.viteServer!;\n try {\n await renderer.handle(req, res, next);\n } catch (err) {\n // If an error is caught, let Vite fix the stack trace so it maps back to\n // your actual source code.\n viteServer.ssrFixStacktrace(err);\n next(err);\n }\n };\n}\n\nfunction rootDevServer404Middleware() {\n return async (req: Request, res: Response) => {\n if (!DEV_SERVER_404_LOG_IGNORE_PATHS.has(req.path)) {\n console.error(`\u2753 404 ${req.originalUrl}`);\n }\n if (req.renderer) {\n const url = req.path;\n const ext = path.extname(url);\n if (!ext) {\n const renderer = req.renderer;\n const data = await renderer.renderDevServer404(req);\n const html = data.html || '';\n res.status(404).set({'Content-Type': 'text/html'}).end(html);\n return;\n }\n }\n res.status(404).set({'Content-Type': 'text/plain'}).end('404');\n };\n}\n\nfunction rootDevServer500Middleware() {\n return async (err: any, req: Request, res: Response, next: NextFunction) => {\n console.error(`\u2757 500 ${req.originalUrl}`);\n console.error(String(err.stack || err));\n if (req.renderer) {\n const url = req.path;\n const ext = path.extname(url);\n if (!ext) {\n const renderer = req.renderer;\n const data = await renderer.renderDevServer500(req, err);\n const html = data.html || '';\n res.status(500).set({'Content-Type': 'text/html'}).end(html);\n return;\n }\n }\n next(err);\n };\n}\n\nfunction testCmsEnabled(rootConfig: RootConfig) {\n const plugins = rootConfig.plugins || [];\n return Boolean(plugins.find((plugin) => plugin.name === 'root-cms'));\n}\n\nfunction debounce(fn: (...args: any[]) => any, timeout: number) {\n let timer: NodeJS.Timeout;\n return (...args: any[]) => {\n clearTimeout(timer);\n timer = setTimeout(() => fn(...args), timeout);\n };\n}\n", "import {Request, Response, NextFunction} from '../core/types.js';\n\nexport function hooksMiddleware() {\n return (req: Request, res: Response, next: NextFunction) => {\n req.hooks = new Hooks();\n next();\n };\n}\n\nexport type HooksCallbackFn = (...args: any[]) => any;\n\nexport class Hooks {\n private callbacks: {[name: string]: HooksCallbackFn[]} = {};\n\n add(name: string, cb: (...args: any[]) => any) {\n this.callbacks[name] ??= [];\n this.callbacks[name].push(cb);\n }\n\n trigger(name: string, ...args: any[]) {\n const callbacks = this.callbacks[name] || [];\n callbacks.forEach((cb) => {\n cb(...args);\n });\n }\n}\n", "import {RootRedirectConfig} from '../core/config.js';\nimport {NextFunction, Request, Response} from '../core/types.js';\nimport {RouteTrie} from '../render/route-trie.js';\n\nexport interface RedirectsMiddlewareOptions {\n redirects: RootRedirectConfig[];\n}\n\n/**\n * Middleware for handling server-side redirects from the `server.redirects`\n * config in `root.config.ts`.\n */\nexport function redirectsMiddleware(options: RedirectsMiddlewareOptions) {\n const routeTrie = new RouteTrie<RootRedirectConfig>();\n const redirects = options.redirects || [];\n redirects.forEach((redirect) => {\n if (!verifyRedirectConfig(redirect)) {\n console.warn('ignoring invalid redirect config:', redirect);\n return;\n }\n routeTrie.add(redirect.source!, redirect);\n });\n\n return (req: Request, res: Response, next: NextFunction) => {\n const [redirect, params] = routeTrie.get(req.path);\n if (redirect) {\n const destination = replaceParams(redirect.destination!, params);\n const code = redirect.type || 302;\n res.setHeader(\n 'cache-control',\n 'no-cache, no-store, max-age=0, must-revalidate'\n );\n res.redirect(code, destination);\n return;\n }\n next();\n };\n}\n\nfunction verifyRedirectConfig(redirect: RootRedirectConfig) {\n if (!redirect.source) {\n return false;\n }\n if (!redirect.source.startsWith('/')) {\n return false;\n }\n if (!redirect.destination) {\n return false;\n }\n if (!testIsRedirectValid(redirect.destination)) {\n return false;\n }\n // TODO(stevenle): verify all destination params exist within source.\n return true;\n}\n\n/**\n * Replaces placeholders in a URL path format string with actual values.\n *\n * @param urlPathFormat The URL path format string containing parameter placeholders in the format `[key]` or `[...key]`.\n * @param params A map of parameter names to their corresponding values.\n * @returns The URL path with all parameter placeholders replaced by their corresponding values.\n */\nfunction replaceParams(urlPathFormat: string, params: Record<string, string>) {\n const urlPath = urlPathFormat.replaceAll(\n /\\[\\[?(\\.\\.\\.)?([\\w\\-_]*)\\]?\\]/g,\n (match: string, _wildcard: string, key: string) => {\n const val = params[key];\n if (!val) {\n throw new Error(`unreplaced param ${match} in url: ${urlPathFormat}`);\n }\n return val;\n }\n );\n return urlPath;\n}\n\n/**\n * Only support full urls (e.g. https://...) and relative paths (e.g. /foo/...).\n */\nfunction testIsRedirectValid(url: string) {\n if (url.startsWith('/')) {\n return true;\n }\n if (url.match(/^https?:\\/\\//)) {\n return true;\n }\n return false;\n}\n", "import path from 'node:path';\nimport {ModuleGraph, ModuleNode, searchForWorkspaceRoot} from 'vite';\nimport {RootConfig} from '../../core/config.js';\nimport {directoryContains} from '../../utils/fsutils.js';\nimport {Asset, AssetMap} from './asset-map.js';\n\nexport class DevServerAssetMap implements AssetMap {\n private rootConfig: RootConfig;\n private moduleGraph: ModuleGraph;\n\n constructor(rootConfig: RootConfig, moduleGraph: ModuleGraph) {\n this.rootConfig = rootConfig;\n this.moduleGraph = moduleGraph;\n }\n\n async get(src: string): Promise<Asset | null> {\n const file = path.resolve(this.rootConfig.rootDir, src);\n\n const viteModules = this.moduleGraph.getModulesByFile(file);\n if (viteModules && viteModules.size > 0) {\n const [viteModule] = viteModules;\n return new DevServerAsset(src, {\n assetMap: this,\n viteModule: viteModule,\n });\n }\n\n // On dev, in some cases the module doesn't make it into the module graph\n // so return a generic asset.\n if (file.startsWith(this.rootConfig.rootDir)) {\n const assetUrl = file.slice(this.rootConfig.rootDir.length);\n return {\n src: src,\n assetUrl: assetUrl,\n getCssDeps: async () => [],\n getJsDeps: async () => [assetUrl],\n };\n }\n const workspaceRoot = searchForWorkspaceRoot(this.rootConfig.rootDir);\n if (await directoryContains(workspaceRoot, file)) {\n const assetUrl = `/@fs/${file}`;\n return {\n src: src,\n assetUrl: assetUrl,\n getCssDeps: async () => [],\n getJsDeps: async () => [assetUrl],\n };\n }\n\n console.log(`could not find asset in asset map: ${src}`);\n return null;\n }\n\n filePathToSrc(file: string) {\n return path.relative(this.rootConfig.rootDir, file);\n }\n}\n\nexport class DevServerAsset implements Asset {\n src: string;\n moduleId: string;\n assetUrl: string;\n private assetMap: DevServerAssetMap;\n private viteModule: ModuleNode;\n\n constructor(\n src: string,\n options: {\n assetMap: DevServerAssetMap;\n viteModule: ModuleNode;\n }\n ) {\n this.src = src;\n this.assetMap = options.assetMap;\n this.viteModule = options.viteModule;\n this.moduleId = this.viteModule.id!;\n this.assetUrl = this.viteModule.url;\n }\n\n async getCssDeps(): Promise<string[]> {\n const visited = new Set<string>();\n const deps = new Set<string>();\n this.collectCss(this, deps, visited);\n return Array.from(deps);\n }\n\n async getJsDeps(): Promise<string[]> {\n const visited = new Set<string>();\n const deps = new Set<string>();\n this.collectJs(this, deps, visited);\n return Array.from(deps);\n }\n\n getImportedModules() {\n return this.viteModule.importedModules;\n }\n\n private collectJs(\n asset: DevServerAsset | null,\n urls: Set<string>,\n visited: Set<string>\n ) {\n if (!asset) {\n return;\n }\n if (!asset.moduleId) {\n return;\n }\n if (visited.has(asset.moduleId)) {\n return;\n }\n visited.add(asset.moduleId);\n const parts = path.parse(asset.assetUrl);\n if (\n ['.js', '.jsx', '.ts', '.tsx'].includes(parts.ext) &&\n asset.moduleId.includes('/elements/')\n ) {\n urls.add(asset.assetUrl);\n }\n asset.getImportedModules().forEach((viteModule) => {\n if (viteModule.file) {\n const src = this.assetMap.filePathToSrc(viteModule.file);\n const importedAsset = new DevServerAsset(src, {\n assetMap: this.assetMap,\n viteModule: viteModule,\n });\n this.collectJs(importedAsset, urls, visited);\n }\n });\n }\n\n private collectCss(\n asset: DevServerAsset | null,\n urls: Set<string>,\n visited: Set<string>\n ) {\n if (!asset) {\n return;\n }\n if (!asset.assetUrl) {\n return;\n }\n if (visited.has(asset.assetUrl)) {\n return;\n }\n visited.add(asset.assetUrl);\n if (asset.src.endsWith('.scss')) {\n const parts = path.parse(asset.src);\n if (!parts.name.startsWith('_')) {\n urls.add(asset.assetUrl);\n }\n }\n asset.getImportedModules().forEach((viteModule) => {\n if (viteModule.file) {\n const src = this.assetMap.filePathToSrc(viteModule.file);\n const importedAsset = new DevServerAsset(src, {\n assetMap: this.assetMap,\n viteModule: viteModule,\n });\n this.collectCss(importedAsset, urls, visited);\n }\n });\n }\n}\n", "import {createServer} from 'node:net';\n\n/**\n * Checks whether a port is open.\n */\nexport function isPortOpen(port: number): Promise<boolean> {\n return new Promise((resolve, reject) => {\n const server = createServer();\n server.on('error', (err: NodeJS.ErrnoException) => {\n if (err.code === 'EADDRINUSE') {\n resolve(false);\n return;\n }\n reject(err);\n });\n server.on('close', () => {\n resolve(true);\n });\n server.listen(port, () => {\n server.close((err) => {\n if (err) {\n console.log(`error closing server: ${err}`);\n reject(err);\n }\n });\n });\n });\n}\n\n/**\n * Finds the first open port between two values.\n */\nexport async function findOpenPort(min: number, max: number): Promise<number> {\n let port = min;\n while (port <= max) {\n const isOpen = await isPortOpen(port);\n if (isOpen) {\n return port;\n }\n port += 1;\n }\n throw new Error(`no ports open between ${min} and ${max}`);\n}\n", "import crypto from 'node:crypto';\n\nimport {RootConfig} from '../core/config.js';\n\nexport function randString(len: number): string {\n const result = [];\n const chars =\n 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';\n for (let i = 0; i < len; i++) {\n const rand = Math.floor(Math.random() * chars.length);\n result.push(chars.charAt(rand));\n }\n return result.join('');\n}\n\n/**\n * Generates a deterministic session secret based on a seed string (e.g., project path).\n * This ensures the same secret is generated for the same seed across dev server restarts,\n * while still allowing different projects to have unique secrets.\n */\nfunction deterministicSessionSecret(seed: string): string {\n return crypto.createHash('sha256').update(seed).digest('hex');\n}\n\n/**\n * Gets the session cookie secret for the server.\n *\n * Returns the configured session cookie secret, or generates one if not provided:\n * - In development: uses a deterministic secret based on rootDir for session persistence\n * - In production: generates a random secret (sessions won't persist across restarts)\n */\nexport function getSessionCookieSecret(\n rootConfig: RootConfig,\n rootDir: string\n): string | string[] {\n // Use configured secret if provided.\n if (rootConfig.server?.sessionCookieSecret) {\n return rootConfig.server.sessionCookieSecret;\n }\n\n // Use deterministic secret in dev mode for consistent sessions across server restarts.\n if (process.env.NODE_ENV === 'development') {\n return deterministicSessionSecret(rootDir);\n }\n\n return randString(36);\n}\n", "import os from 'node:os';\nimport path from 'node:path';\n\nimport {fileExists, loadJson, writeJson} from '../../utils/fsutils.js';\nimport {checkVersionTask} from './check-version.js';\n\nexport interface StartupTaskContext {\n /** Absolute path to the root project directory. */\n rootDir: string;\n /** Currently installed version of the `@blinkk/root` package. */\n version?: string;\n}\n\nexport interface StartupTask {\n /**\n * Unique id for the task. Used as the persistence key for the last run time,\n * so it must remain stable across releases.\n */\n name: string;\n /**\n * Minimum time (in milliseconds) that must elapse between runs. When set, the\n * task is skipped if it last ran more recently than this interval. Omit to\n * run on every startup.\n */\n throttle?: number;\n /**\n * Optional predicate evaluated before the throttle check. When it returns\n * false the task is skipped entirely (and its throttle is left untouched).\n * Useful for opt-out flags, e.g. an env var that disables the task.\n */\n enabled?: (ctx: StartupTaskContext) => boolean;\n /**\n * Task logic. Thrown errors are swallowed by the runner so that a failing\n * startup task never prevents `root` commands from starting.\n */\n run: (ctx: StartupTaskContext) => Promise<void>;\n}\n\n/**\n * Registered startup tasks. Add new startup tasks to this list.\n */\nconst STARTUP_TASKS: StartupTask[] = [checkVersionTask];\n\nconst STATE_FILE = path.join(os.homedir(), '.root', 'startup-tasks.json');\n\ninterface StartupTasksState {\n /** Map of task name to last run time (ms since epoch). */\n lastRun: Record<string, number>;\n}\n\n/**\n * Runs all registered startup tasks, honoring each task's throttle interval.\n *\n * Tasks are best-effort: failures are swallowed and never block startup. The\n * last run time of each task is persisted to the user's home directory so that\n * throttled tasks (e.g. the version check) run at most once per interval across\n * separate `root` invocations.\n */\nexport async function runStartupTasks(ctx: StartupTaskContext): Promise<void> {\n try {\n const state = await readState();\n const now = Date.now();\n const dueTasks = STARTUP_TASKS.filter(\n (task) =>\n isEnabled(task, ctx) && isDue(task, state.lastRun[task.name], now)\n );\n if (dueTasks.length === 0) {\n return;\n }\n await Promise.all(\n dueTasks.map(async (task) => {\n try {\n await task.run(ctx);\n } catch {\n // Startup tasks are best-effort; ignore failures.\n }\n // Record the attempt regardless of outcome so a failing task (e.g. no\n // network) doesn't retry on every startup.\n state.lastRun[task.name] = Date.now();\n })\n );\n await writeState(state);\n } catch {\n // Never let startup tasks interfere with the command.\n }\n}\n\nfunction isEnabled(task: StartupTask, ctx: StartupTaskContext): boolean {\n return !task.enabled || task.enabled(ctx);\n}\n\nfunction isDue(\n task: StartupTask,\n lastRun: number | undefined,\n now: number\n): boolean {\n if (!task.throttle || !lastRun) {\n return true;\n }\n return now - lastRun >= task.throttle;\n}\n\nasync function readState(): Promise<StartupTasksState> {\n if (await fileExists(STATE_FILE)) {\n try {\n const state = await loadJson<Partial<StartupTasksState>>(STATE_FILE);\n return {lastRun: state.lastRun || {}};\n } catch {\n // Corrupt or unreadable state file; start fresh.\n }\n }\n return {lastRun: {}};\n}\n\nasync function writeState(state: StartupTasksState): Promise<void> {\n try {\n await writeJson(STATE_FILE, state);\n } catch {\n // Ignore write failures (e.g. read-only home directory).\n }\n}\n", "import {dim, green, yellow} from 'kleur/colors';\n\nimport type {StartupTask} from './startup-tasks.js';\n\nconst PACKAGE_NAME = '@blinkk/root';\nconst ONE_DAY_MS = 24 * 60 * 60 * 1000;\nconst REGISTRY_TIMEOUT_MS = 3000;\n\n/**\n * Startup task that checks whether a newer version of `@blinkk/root` has been\n * published to npm and, if so, prints an update notice. Throttled to run at\n * most once per day.\n */\nexport const checkVersionTask: StartupTask = {\n name: 'check-version',\n throttle: ONE_DAY_MS,\n // Skip the check when disabled via env var, when the version is unknown, or\n // for pre-release (alpha/beta/rc) builds that are intentionally ahead of the\n // latest stable release.\n enabled(ctx) {\n return (\n !isVersionCheckDisabled() && !!ctx.version && !isPrerelease(ctx.version)\n );\n },\n async run(ctx) {\n const current = ctx.version;\n const latest = await fetchLatestVersion();\n if (current && latest && isNewerVersion(current, latest)) {\n printUpdateNotice(current, latest);\n }\n },\n};\n\n/**\n * Whether the version check has been disabled via environment variable. Honors\n * the `@blinkk/root`-specific `ROOT_DISABLE_VERSION_CHECK` as well as the de\n * facto `NO_UPDATE_NOTIFIER` convention. Either can be set in the shell or in a\n * project's `.env` file, which the CLI loads on startup.\n */\nfunction isVersionCheckDisabled(): boolean {\n return (\n isEnvEnabled('ROOT_DISABLE_VERSION_CHECK') ||\n isEnvEnabled('NO_UPDATE_NOTIFIER')\n );\n}\n\nfunction isEnvEnabled(name: string): boolean {\n const value = (process.env[name] || '').trim().toLowerCase();\n return value !== '' && value !== '0' && value !== 'false';\n}\n\nasync function fetchLatestVersion(): Promise<string | null> {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), REGISTRY_TIMEOUT_MS);\n try {\n const url = `https://registry.npmjs.org/${PACKAGE_NAME}/latest`;\n const res = await fetch(url, {signal: controller.signal});\n if (!res.ok) {\n return null;\n }\n const data = (await res.json()) as {version?: string};\n return data.version || null;\n } catch {\n // Network error, timeout, or invalid response; skip the check.\n return null;\n } finally {\n clearTimeout(timeout);\n }\n}\n\n/**\n * Returns true if `latest` is a higher semantic version than `current`.\n * Pre-release identifiers are ignored.\n */\nexport function isNewerVersion(current: string, latest: string): boolean {\n const a = parseVersion(latest);\n const b = parseVersion(current);\n for (let i = 0; i < 3; i++) {\n if (a[i] > b[i]) {\n return true;\n }\n if (a[i] < b[i]) {\n return false;\n }\n }\n return false;\n}\n\n/**\n * Returns true if `version` is an alpha, beta, or rc pre-release build, e.g.\n * `3.1.0-rc.1`.\n */\nexport function isPrerelease(version: string): boolean {\n return /-(alpha|beta|rc)\\b/i.test(version);\n}\n\nfunction parseVersion(version: string): [number, number, number] {\n const main = version.split('-')[0];\n const parts = main.split('.');\n const toInt = (value: string | undefined) => {\n const num = parseInt(value || '0', 10);\n return isNaN(num) ? 0 : num;\n };\n return [toInt(parts[0]), toInt(parts[1]), toInt(parts[2])];\n}\n\nfunction printUpdateNotice(current: string, latest: string) {\n const bar = dim('\u2503');\n const label = yellow(`Update available for ${PACKAGE_NAME}:`);\n console.log();\n console.log(`${bar} ${label} ${dim(current)} \u2192 ${green(latest)}`);\n console.log();\n}\n", "import {execSync} from 'node:child_process';\nimport fs from 'node:fs';\nimport yaml from 'js-yaml';\n\nexport interface GaeDeployOptions {\n /** GCP project id. */\n project?: string;\n /** Prefix to append to the version. */\n prefix?: string;\n /** Whether to divert traffic to the new version. */\n promote?: boolean;\n /** If provided, verifies that the given URL path returns a 200 response. */\n healthcheckUrl?: string;\n /** If provided, the latest N versions are preserved, all others are deleted */\n maxVersions?: number;\n}\n\ntype AppYaml = any;\n\ninterface AppVersionInfo {\n service: string;\n id: string;\n traffic_split: number;\n last_deployed_time: {\n datetime: string;\n };\n}\n\nexport async function gaeDeploy(appDir: string, options?: GaeDeployOptions) {\n if (!appDir) {\n throw new Error(\n '[gae-deplopy] Missing app dir, e.g. `root gae-deploy <app dir>`'\n );\n }\n\n const project = options?.project;\n if (!project) {\n throw new Error('[gae-deplopy] Missing: --project');\n }\n\n // Change cwd to the app dir.\n process.chdir(appDir);\n\n const appYamlPath = 'app.yaml';\n if (!fs.existsSync(appYamlPath)) {\n throw new Error(`[gae-deplopy] Missing: ${appYamlPath}`);\n }\n\n // Read the service from `app.yaml` and deploy it.\n const appYaml = yaml.load(fs.readFileSync(appYamlPath, 'utf8')) as AppYaml;\n const service = appYaml.service;\n if (!service) {\n throw new Error(\n '[gae-deploy] Missing service definition. Ensure \"service\" is defined in app.yaml.'\n );\n }\n\n let prefix = options?.prefix;\n if (!prefix) {\n prefix = options?.promote ? 'prod' : 'staging';\n }\n const version = `${prefix}-${getTimestamp()}`;\n if (testVersionTooLong(version, service, project)) {\n throw new Error(`version \"${version}\" should not exceed 63 chars`);\n }\n\n console.log('[gae-deploy] \uD83D\uDE80 starting deployment...');\n\n // If the env_variables has placeholders like `MY_SECRET_TOKEN: '{MY_SECRET_TOKEN}'`,\n // replace with the current env value.\n const appYamlHasPlaceholders = testHasEnvPlaceholders(appYaml);\n let backupAppYaml = '';\n if (appYamlHasPlaceholders) {\n backupAppYaml = updateAppYamlEnv(appYamlPath, appYaml);\n }\n\n // Deploy the app.\n execSync(\n `gcloud app deploy -q --project=${project} --version=${version} --no-promote app.yaml`,\n {stdio: 'inherit'}\n );\n\n // Restore the original app.yaml, if needed.\n if (backupAppYaml) {\n fs.copyFileSync(backupAppYaml, 'app.yaml');\n }\n\n // Check the health of the new version and abort if unhealthy.\n if (options?.healthcheckUrl) {\n const healthcheckPassed = await testHealth(\n project,\n service,\n version,\n options.healthcheckUrl\n );\n if (!healthcheckPassed) {\n throw new Error(\n `[gae-deploy] \u274C health check failed. check logs: \\n${getLogsURL(\n project,\n service,\n version\n )}`\n );\n }\n console.log('[gae-deploy] \u2705 health check succeeded!');\n }\n\n if (options?.promote) {\n console.log(`[gae-deploy] promoting version ${version}...`);\n execSync(\n `gcloud app -q --project=${project} services set-traffic ${service} --splits ${version}=1`,\n {stdio: 'inherit'}\n );\n }\n\n if (options?.maxVersions) {\n // List all managed versions.\n const resp = execSync(\n `gcloud app versions list --project ${project} --service ${service} --format json`\n ).toString();\n const versions = JSON.parse(resp.toString()) as AppVersionInfo[];\n const managedVersions = versions\n .filter((appInfo: AppVersionInfo) =>\n testManagedVersion(service, appInfo, prefix)\n )\n .sort(\n (a, b) =>\n new Date(b.last_deployed_time.datetime).getTime() -\n new Date(a.last_deployed_time.datetime).getTime()\n );\n\n console.log(\n `[gae-deploy] \uD83D\uDCE6 all managed versions (${managedVersions.length}):`\n );\n for (const eachVersion of managedVersions) {\n console.log(` ${eachVersion.id}`);\n }\n\n // Delete the oldest managed versions.\n for (const eachVersion of managedVersions.slice(options.maxVersions - 1)) {\n console.log(`[gae-deploy] \u2702\uFE0F deleting old version ${eachVersion.id}`);\n execSync(\n `gcloud app versions delete -q --project=${project} --service=${service} ${eachVersion.id}`,\n {stdio: 'inherit'}\n );\n }\n }\n\n console.log(\n `[gae-deploy] \u2728 deployment complete\\nversions: ${getVersionsURL(\n project,\n service\n )}`\n );\n}\n\n/**\n * Returns whether a given version name is too long (a subdomain part should not\n * exceed 63 characters).\n */\nfunction testVersionTooLong(version: string, service: string, project: string) {\n const subdomain = `${version}-dot-${service}-dot-${project}`;\n // console.log(subdomain, subdomain.length);\n return subdomain.length > 63;\n}\n\n/** Returns the logs viewer URL in the Google Cloud Console. */\nfunction getLogsURL(project: string, service: string, version: string) {\n return `https://console.cloud.google.com/logs/query;query=resource.type%3D\"gae_app\"%0Aresource.labels.module_id%3D\"${service}\"%0Aresource.labels.version_id%3D\"${version}\"?project=${project}`;\n}\n\n/** Returns the App Engine versions viewer URL in the Google Cloud Console. */\nfunction getVersionsURL(project: string, service: string) {\n return `https://console.cloud.google.com/appengine/versions?project=${project}&serviceId=${service}`;\n}\n\n/**\n * Returns whether the `env_variables` key in app.yaml has placeholders.\n *\n * Example:\n * ```yaml\n * env_variables:\n * MY_SECRET_TOKEN: '{MY_SECRET_TOKEN}'\n * ```\n */\nfunction testHasEnvPlaceholders(appYaml: AppYaml) {\n if (typeof appYaml?.env_variables !== 'object') {\n return false;\n }\n const envVars: Record<string, string> = appYaml.env_variables;\n return Object.values(envVars).some((envValue: string) => {\n return testIsEnvPlaceholder(envValue);\n });\n}\n\nfunction testIsEnvPlaceholder(envValue: any) {\n if (typeof envValue === 'string') {\n return envValue.startsWith('{') && envValue.endsWith('}');\n }\n return false;\n}\n\n/** Updates any placeholders used in environment variables with their values. */\nfunction updateAppYamlEnv(appYamlPath: string, appYaml: AppYaml) {\n // Copy the original app.yaml to a backup file.\n const backupAppYaml = `${appYamlPath}.bak`;\n fs.copyFileSync(appYamlPath, backupAppYaml);\n let content = fs.readFileSync(appYamlPath, 'utf8');\n\n // Replace env_variables placeholders like `MY_SECRET_TOKEN: '{MY_SECRET_TOKEN}'`.\n const envVars: Record<string, string> = appYaml.env_variables;\n Object.entries(envVars).forEach(([envVar, envValue]) => {\n if (testIsEnvPlaceholder(envValue)) {\n const value = process.env[envVar];\n if (!value && content.includes(`{${envVar}}`)) {\n console.warn(`[gae-deploy] Missing environment variable: ${envVar}`);\n content = content.replaceAll(`{${envVar}}`, '');\n } else if (value && content.includes(`{${envVar}}`)) {\n content = content.replaceAll(`{${envVar}}`, value);\n }\n }\n });\n\n fs.writeFileSync(appYamlPath, content, 'utf8');\n return backupAppYaml;\n}\n\n/**\n * Returns a timestamp for the version name, formatted `YYYYMMDDtHHMM`.\n */\nfunction getTimestamp() {\n const pretty = (num: number) => (num + '').padStart(2, '0');\n const date = new Date();\n return `${date.getFullYear()}${pretty(date.getMonth() + 1)}${pretty(\n date.getDate()\n )}t${pretty(date.getHours())}${pretty(date.getMinutes())}`;\n}\n\n/**\n * Returns whether the App Engine service succeeds in handling a health check\n * request.\n */\nexport async function testHealth(\n project: string,\n service: string,\n version: string,\n healthcheckUrl: string\n) {\n if (!healthcheckUrl.startsWith('/')) {\n healthcheckUrl = `/${healthcheckUrl}`;\n }\n const url = `https://${version}-dot-${service}-dot-${project}.appspot.com${healthcheckUrl}`;\n const response = await fetch(url);\n return response.status === 200;\n}\n\n/**\n * Returns whether a version is considered to be managed by this script, and\n * whether it's an \"old\" prod version (e.g. a version that receives no traffic).\n * This script only manages old prod versions.\n */\nfunction testManagedVersion(\n service: string,\n appInfo: AppVersionInfo,\n prefix: string\n) {\n const re = new RegExp(`${prefix}-\\\\d{8}t\\\\d{4}`);\n return (\n appInfo.service === service &&\n re.exec(appInfo.id) &&\n appInfo.traffic_split === 0.0\n );\n}\n", "import path from 'node:path';\n\nimport compression from 'compression';\nimport cookieParser from 'cookie-parser';\nimport {default as express} from 'express';\nimport {dim} from 'kleur/colors';\nimport sirv from 'sirv';\n\nimport {RootConfig} from '../core/config.js';\nimport {configureServerPlugins} from '../core/plugin.js';\nimport {Request, Response, NextFunction, Server} from '../core/types.js';\nimport {hooksMiddleware} from '../middleware/hooks.js';\nimport {\n headersMiddleware,\n rootProjectMiddleware,\n trailingSlashMiddleware,\n} from '../middleware/middleware.js';\nimport {redirectsMiddleware} from '../middleware/redirects.js';\nimport {sessionMiddleware} from '../middleware/session.js';\nimport {ElementGraph} from '../node/element-graph.js';\nimport {loadBundledConfig} from '../node/load-config.js';\nimport {\n BuildAssetManifest,\n BuildAssetMap,\n} from '../render/asset-map/build-asset-map.js';\nimport {fileExists, loadJson} from '../utils/fsutils.js';\nimport {getSessionCookieSecret} from '../utils/rand.js';\n\ntype RenderModule = typeof import('../render/render.js');\n\nexport interface PreviewOptions {\n host?: string;\n}\n\nexport async function preview(\n rootProjectDir?: string,\n options?: PreviewOptions\n) {\n // TODO(stevenle): figure out standard practice for NODE_ENV when using the\n // preview command.\n process.env.NODE_ENV = 'development';\n const rootDir = path.resolve(rootProjectDir || process.cwd());\n const server = await createPreviewServer({rootDir});\n const port = parseInt(process.env.PORT || '4007');\n const host = options?.host || 'localhost';\n console.log();\n console.log(`${dim('\u2503')} project: ${rootDir}`);\n console.log(`${dim('\u2503')} server: http://${host}:${port}`);\n console.log(`${dim('\u2503')} mode: preview`);\n console.log();\n server.listen(port, host);\n}\n\nexport async function createPreviewServer(options: {\n rootDir: string;\n}): Promise<Server> {\n const rootDir = options.rootDir;\n const rootConfig = await loadBundledConfig(rootDir, {command: 'preview'});\n const distDir = path.join(rootDir, 'dist');\n\n const server: Server = express();\n server.disable('x-powered-by');\n server.use(compression());\n\n // Inject request context vars.\n server.use(rootProjectMiddleware({rootConfig}));\n server.use(await rootPreviewRendererMiddleware({rootConfig, distDir}));\n server.use(hooksMiddleware());\n\n // Session middleware for handling session cookies.\n const sessionCookieSecret = getSessionCookieSecret(rootConfig, rootDir);\n server.use(cookieParser(sessionCookieSecret));\n server.use(sessionMiddleware());\n\n const plugins = rootConfig.plugins || [];\n await configureServerPlugins(\n server,\n async () => {\n // Add user-configured middlewares from `root.config.ts`.\n const userMiddlewares = rootConfig.server?.middlewares || [];\n userMiddlewares.forEach((middleware) => {\n server.use(middleware);\n });\n\n // Add redirects middleware.\n if (rootConfig.server?.redirects) {\n server.use(\n redirectsMiddleware({redirects: rootConfig.server.redirects})\n );\n }\n\n // Add http headers middleware.\n if (rootConfig.server?.headers) {\n server.use(headersMiddleware({rootConfig: rootConfig}));\n }\n\n // Add static file middleware.\n const publicDir = path.join(distDir, 'html');\n server.use(sirv(publicDir, {dev: false}));\n\n // NOTE: The trailing slash middleware needs to come after public files so\n // that slashes are not appended to public file routes.\n server.use(trailingSlashMiddleware({rootConfig}));\n\n // Add the root.js preview server middlewares.\n server.use(rootPreviewServerMiddleware());\n\n // Add any custom plugin 404 handlers.\n plugins.forEach((plugin) => {\n if (plugin.handle404) {\n server.use(plugin.handle404);\n }\n });\n\n // Add error handlers.\n server.use(rootPreviewServer404Middleware());\n server.use(rootPreviewServer500Middleware());\n },\n plugins,\n {type: 'preview', rootConfig}\n );\n return server;\n}\n\n/**\n * Injects a renderer into the request.\n */\nasync function rootPreviewRendererMiddleware(options: {\n rootConfig: RootConfig;\n distDir: string;\n}) {\n const {distDir, rootConfig} = options;\n const render: RenderModule = await import(\n path.join(distDir, 'server/render.js')\n );\n const manifestPath = path.join(distDir, '.root/manifest.json');\n if (!(await fileExists(manifestPath))) {\n throw new Error(\n `could not find ${manifestPath}. run \\`root build\\` before \\`root preview\\`.`\n );\n }\n const elementGraphJsonPath = path.join(distDir, '.root/elements.json');\n if (!(await fileExists(elementGraphJsonPath))) {\n throw new Error(\n `could not find ${elementGraphJsonPath}. run \\`root build\\` before \\`root preview\\`.`\n );\n }\n const rootManifest = await loadJson<BuildAssetManifest>(manifestPath);\n const assetMap = BuildAssetMap.fromRootManifest(rootConfig, rootManifest);\n const elementGraphJson = await loadJson<any>(elementGraphJsonPath);\n const elementGraph = ElementGraph.fromJson(elementGraphJson);\n const renderer = new render.Renderer(rootConfig, {assetMap, elementGraph});\n return async (req: Request, _: Response, next: NextFunction) => {\n req.renderer = renderer;\n next();\n };\n}\n\n/**\n * Preview server request handler.\n */\nfunction rootPreviewServerMiddleware() {\n return async (req: Request, res: Response, next: NextFunction) => {\n const renderer = req.renderer!;\n try {\n await renderer.handle(req, res, next);\n } catch (e) {\n try {\n console.error(`error rendering ${req.originalUrl}`);\n console.error(e.stack || e);\n const {html} = await renderer.renderDevServer500(req, e);\n res.status(500).set({'Content-Type': 'text/html'}).end(html);\n } catch (e2) {\n console.error('failed to render custom error');\n console.error(e2);\n next(e);\n }\n }\n };\n}\n\nfunction rootPreviewServer404Middleware() {\n return async (req: Request, res: Response) => {\n console.error(`\u2753 404 ${req.originalUrl}`);\n if (req.renderer) {\n const url = req.path;\n const ext = path.extname(url);\n if (!ext) {\n const renderer = req.renderer;\n const data = await renderer.render404({currentPath: url});\n const html = data.html || '';\n res.status(404).set({'Content-Type': 'text/html'}).end(html);\n return;\n }\n }\n res.status(404).set({'Content-Type': 'text/plain'}).end('404');\n };\n}\n\nfunction rootPreviewServer500Middleware() {\n return async (err: any, req: Request, res: Response, next: NextFunction) => {\n console.error(`\u2757 500 ${req.originalUrl}`);\n console.error(String(err.stack || err));\n if (req.renderer) {\n const url = req.path;\n const ext = path.extname(url);\n if (!ext) {\n const renderer = req.renderer;\n const data = await renderer.renderDevServer500(req, err);\n const html = data.html || '';\n res.status(500).set({'Content-Type': 'text/html'}).end(html);\n return;\n }\n }\n next(err);\n };\n}\n", "import path from 'node:path';\n\nimport compression from 'compression';\nimport cookieParser from 'cookie-parser';\nimport {default as express} from 'express';\nimport {dim} from 'kleur/colors';\nimport sirv from 'sirv';\n\nimport {RootConfig} from '../core/config.js';\nimport {configureServerPlugins} from '../core/plugin.js';\nimport {Request, Response, NextFunction, Server} from '../core/types.js';\nimport {hooksMiddleware} from '../middleware/hooks.js';\nimport {\n headersMiddleware,\n rootProjectMiddleware,\n trailingSlashMiddleware,\n} from '../middleware/middleware.js';\nimport {redirectsMiddleware} from '../middleware/redirects.js';\nimport {sessionMiddleware} from '../middleware/session.js';\nimport {ElementGraph} from '../node/element-graph.js';\nimport {loadBundledConfig} from '../node/load-config.js';\nimport {\n BuildAssetManifest,\n BuildAssetMap,\n} from '../render/asset-map/build-asset-map.js';\nimport {fileExists, loadJson} from '../utils/fsutils.js';\nimport {getSessionCookieSecret} from '../utils/rand.js';\n\ntype RenderModule = typeof import('../render/render.js');\n\nexport interface StartOptions {\n host?: string;\n}\n\nexport async function start(rootProjectDir?: string, options?: StartOptions) {\n process.env.NODE_ENV = 'production';\n const rootDir = path.resolve(rootProjectDir || process.cwd());\n const server = await createProdServer({rootDir});\n const port = parseInt(process.env.PORT || '4007');\n const host = options?.host || 'localhost';\n console.log();\n console.log(`${dim('\u2503')} project: ${rootDir}`);\n console.log(`${dim('\u2503')} server: http://${host}:${port}`);\n console.log(`${dim('\u2503')} mode: production`);\n console.log();\n server.listen(port, host);\n}\n\nexport async function createProdServer(options: {\n rootDir: string;\n}): Promise<Server> {\n const rootDir = options.rootDir;\n const rootConfig = await loadBundledConfig(rootDir, {command: 'start'});\n const distDir = path.join(rootDir, 'dist');\n\n const server: Server = express();\n server.disable('x-powered-by');\n server.use(compression());\n\n // Inject request context vars.\n server.use(rootProjectMiddleware({rootConfig}));\n server.use(await rootProdRendererMiddleware({rootConfig, distDir}));\n server.use(hooksMiddleware());\n\n // Session middleware for handling session cookies.\n const sessionCookieSecret = getSessionCookieSecret(rootConfig, rootDir);\n server.use(cookieParser(sessionCookieSecret));\n server.use(sessionMiddleware());\n\n const plugins = rootConfig.plugins || [];\n await configureServerPlugins(\n server,\n async () => {\n // Add user-configured middlewares from `root.config.ts`.\n const userMiddlewares = rootConfig.server?.middlewares || [];\n userMiddlewares.forEach((middleware) => {\n server.use(middleware);\n });\n\n // Add redirects middleware.\n if (rootConfig.server?.redirects) {\n server.use(\n redirectsMiddleware({redirects: rootConfig.server.redirects})\n );\n }\n\n // Add http headers middleware.\n if (rootConfig.server?.headers) {\n server.use(headersMiddleware({rootConfig: rootConfig}));\n }\n\n // Add static file middleware.\n const publicDir = path.join(distDir, 'html');\n server.use(sirv(publicDir, {dev: false}));\n\n // NOTE: The trailing slash middleware needs to come after public files so\n // that slashes are not appended to public file routes.\n server.use(trailingSlashMiddleware({rootConfig}));\n\n // Add the root.js preview server middlewares.\n server.use(rootProdServerMiddleware());\n\n // Add any custom plugin 404 handlers.\n plugins.forEach((plugin) => {\n if (plugin.handle404) {\n server.use(plugin.handle404);\n }\n });\n\n // Add error handlers.\n server.use(rootProdServer404Middleware());\n server.use(rootProdServer500Middleware());\n },\n plugins,\n {type: 'prod', rootConfig}\n );\n return server;\n}\n\n/**\n * Injects a renderer into the request.\n */\nasync function rootProdRendererMiddleware(options: {\n rootConfig: RootConfig;\n distDir: string;\n}) {\n const {distDir, rootConfig} = options;\n const render: RenderModule = await import(\n path.join(distDir, 'server/render.js')\n );\n const manifestPath = path.join(distDir, '.root/manifest.json');\n if (!(await fileExists(manifestPath))) {\n throw new Error(\n `could not find ${manifestPath}. run \\`root build\\` before \\`root start\\`.`\n );\n }\n const elementGraphJsonPath = path.join(distDir, '.root/elements.json');\n if (!(await fileExists(elementGraphJsonPath))) {\n throw new Error(\n `could not find ${elementGraphJsonPath}. run \\`root build\\` before \\`root start\\`.`\n );\n }\n const rootManifest = await loadJson<BuildAssetManifest>(manifestPath);\n const assetMap = BuildAssetMap.fromRootManifest(rootConfig, rootManifest);\n const elementGraphJson = await loadJson<any>(elementGraphJsonPath);\n const elementGraph = ElementGraph.fromJson(elementGraphJson);\n const renderer = new render.Renderer(rootConfig, {assetMap, elementGraph});\n return async (req: Request, _: Response, next: NextFunction) => {\n req.renderer = renderer;\n next();\n };\n}\n\n/**\n * Prod server request handler.\n */\nfunction rootProdServerMiddleware() {\n return async (req: Request, res: Response, next: NextFunction) => {\n const renderer = req.renderer!;\n try {\n await renderer.handle(req, res, next);\n } catch (e) {\n try {\n console.error(`error rendering ${req.originalUrl}`);\n console.error(e.stack || e);\n const {html} = await renderer.renderError(e);\n res.status(500).set({'Content-Type': 'text/html'}).end(html);\n } catch (e2) {\n console.error('failed to render custom error');\n console.error(e2);\n next(e);\n }\n }\n };\n}\n\nfunction rootProdServer404Middleware() {\n return async (req: Request, res: Response) => {\n console.error(`\u2753 404 ${req.originalUrl}`);\n if (req.renderer) {\n const url = req.path;\n const ext = path.extname(url);\n if (!ext) {\n const renderer = req.renderer;\n const data = await renderer.render404({currentPath: url});\n const html = data.html || '';\n res.status(404).set({'Content-Type': 'text/html'}).end(html);\n return;\n }\n }\n res.status(404).set({'Content-Type': 'text/plain'}).end('404');\n };\n}\n\nfunction rootProdServer500Middleware() {\n return async (err: any, req: Request, res: Response, next: NextFunction) => {\n console.error(`\u2757 500 ${req.originalUrl}`);\n console.error(String(err.stack || err));\n if (req.renderer) {\n const url = req.path;\n const ext = path.extname(url);\n if (!ext) {\n const renderer = req.renderer;\n const data = await renderer.renderError(err);\n const html = data.html || '';\n res.status(500).set({'Content-Type': 'text/html'}).end(html);\n return;\n }\n }\n next(err);\n };\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["path", "dim", "glob", "fs", "path", "asset", "path", "fs", "path", "dim", "glob", "importedCss", "outFilePath", "outPath", "fileSize", "fs", "path", "fileURLToPath", "glob", "__dirname", "path", "fileURLToPath", "glob", "fs", "fs", "path", "path", "fs", "build", "path", "fileURLToPath", "dim", "glob", "path", "searchForWorkspaceRoot", "path", "searchForWorkspaceRoot", "path", "dim", "path", "__dirname", "path", "fileURLToPath", "start", "dim", "glob", "fs", "path", "cookieParser", "express", "dim", "sirv", "path", "dim", "express", "cookieParser", "sirv", "path", "compression", "cookieParser", "express", "dim", "sirv", "path", "dim", "express", "compression", "cookieParser", "sirv"]
7
+ }
@@ -15,7 +15,7 @@ var Html = ({ children, ...attrs }) => {
15
15
  };
16
16
 
17
17
  // src/core/hooks/useI18nContext.ts
18
- import path from "path";
18
+ import path from "node:path";
19
19
  import { createContext as createContext2 } from "preact";
20
20
  import { useContext as useContext2 } from "preact/hooks";
21
21
  var I18N_CONTEXT = createContext2(null);
@@ -86,4 +86,4 @@ export {
86
86
  replaceParams,
87
87
  testPathHasParams
88
88
  };
89
- //# sourceMappingURL=chunk-WAZTR3DX.js.map
89
+ //# sourceMappingURL=chunk-KW7KTYGC.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/core/components/Html.tsx", "../src/core/hooks/useI18nContext.ts", "../src/core/hooks/useRequestContext.ts", "../src/utils/url-path-params.ts"],
4
+ "sourcesContent": ["import {ComponentChildren, FunctionalComponent, createContext} from 'preact';\nimport {useContext} from 'preact/hooks';\n\nexport interface HtmlContext {\n htmlAttrs: preact.JSX.HTMLAttributes<HTMLHtmlElement>;\n headAttrs: preact.JSX.HTMLAttributes<HTMLHeadElement>;\n headComponents: ComponentChildren[];\n bodyAttrs: preact.JSX.HTMLAttributes<HTMLBodyElement>;\n scriptDeps: Array<preact.JSX.ScriptHTMLAttributes<HTMLScriptElement>>;\n}\n\nexport const HTML_CONTEXT = createContext<HtmlContext | null>(null);\n\nexport type HtmlProps = preact.JSX.HTMLAttributes<HTMLHtmlElement> & {\n children?: ComponentChildren;\n};\n\n/**\n * The `<Html>` component can be used to update attrs in the `<html>` tag.\n *\n * Usage:\n *\n * ```tsx\n * <Html lang=\"en-US\">\n * <h1>Hello world</h1>\n * </Html>\n * ```\n */\nexport const Html: FunctionalComponent<HtmlProps> = ({children, ...attrs}) => {\n const context = useContext(HTML_CONTEXT);\n if (!context) {\n throw new Error(\n 'HTML_CONTEXT not found, double-check usage of the <Html> component'\n );\n }\n context.htmlAttrs = attrs;\n return <>{children}</>;\n};\n", "import path from 'node:path';\nimport {createContext} from 'preact';\nimport {useContext} from 'preact/hooks';\n\nexport const I18N_CONTEXT = createContext<I18nContext | null>(null);\n\nexport interface I18nContext {\n locale: string;\n translations: Record<string, string>;\n}\n\n/**\n * A hook that returns information about the current i18n context, including the\n * locale for the given route and a map of translations for that locale.\n */\nexport function useI18nContext() {\n const context = useContext(I18N_CONTEXT);\n if (!context) {\n throw new Error('I18N_CONTEXT not found');\n }\n return context;\n}\n\nexport function getTranslations(locale: string): Record<string, string> {\n const translations: Record<string, Record<string, string>> = {};\n const translationsFiles = import.meta.glob(['/translations/*.json'], {\n eager: true,\n }) as Record<string, {default?: Record<string, string>}>;\n Object.keys(translationsFiles).forEach((translationPath) => {\n const parts = path.parse(translationPath);\n const locale = parts.name;\n const module = translationsFiles[translationPath];\n if (module && module.default) {\n translations[locale] = module.default;\n }\n });\n return translations[locale] || {};\n}\n", "import {createContext} from 'preact';\nimport {useContext} from 'preact/hooks';\nimport {Route} from '../types.js';\n\nexport interface RequestContext {\n /**\n * The current request path, e.g. `/foo/bar` (default route path) or\n * `/{locale}/foo/bar` (localized route path).\n */\n currentPath: string;\n /** The route file. */\n route: Route;\n /**\n * Route param values. E.g. for a route like `routes/blog/[slug].tsx`,\n * visiting `/blog/foo` will pass {slug: 'foo'} here.\n */\n routeParams: Record<string, string>;\n /** Props passed to the route's server component. */\n props: any;\n /** The current locale. */\n locale: string;\n /** Translations map for the current locale. */\n translations: Record<string, string>;\n /** CSP nonce value. */\n nonce?: string;\n}\n\nexport const REQUEST_CONTEXT = createContext<RequestContext | null>(null);\n\n/**\n * A hook that returns information about the current route.\n *\n * Usage:\n *\n * ```ts\n * const ctx = useRequestContext();\n * ctx.route.src;\n * // => 'routes/index.tsx'\n * ```\n */\nexport function useRequestContext() {\n const context = useContext(REQUEST_CONTEXT);\n if (!context) {\n throw new Error('REQUEST_CONTEXT not found');\n }\n return context;\n}\n", "export function replaceParams(\n urlPathFormat: string,\n params: Record<string, string>\n) {\n const urlPath = urlPathFormat.replaceAll(\n /\\[\\[?(\\.\\.\\.)?([\\w\\-_]*)\\]?\\]/g,\n (match: string, _wildcard: string, key: string) => {\n const val = params[key];\n if (!val) {\n throw new Error(`unreplaced param ${match} in url: ${urlPathFormat}`);\n }\n return val;\n }\n );\n return urlPath;\n}\n\nexport function testPathHasParams(urlPath: string) {\n const segments = urlPath.split('/');\n return segments.some((segment) => {\n return segment.startsWith('[') && segment.includes(']');\n });\n}\n"],
5
+ "mappings": ";AAAA,SAAgD,qBAAoB;AACpE,SAAQ,kBAAiB;AAmChB;AAzBF,IAAM,eAAe,cAAkC,IAAI;AAiB3D,IAAM,OAAuC,CAAC,EAAC,UAAU,GAAG,MAAK,MAAM;AAC5E,QAAM,UAAU,WAAW,YAAY;AACvC,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACA,UAAQ,YAAY;AACpB,SAAO,gCAAG,UAAS;AACrB;;;ACrCA,OAAO,UAAU;AACjB,SAAQ,iBAAAA,sBAAoB;AAC5B,SAAQ,cAAAC,mBAAiB;AAElB,IAAM,eAAeD,eAAkC,IAAI;AAW3D,SAAS,iBAAiB;AAC/B,QAAM,UAAUC,YAAW,YAAY;AACvC,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,wBAAwB;AAAA,EAC1C;AACA,SAAO;AACT;AAEO,SAAS,gBAAgB,QAAwC;AACtE,QAAM,eAAuD,CAAC;AAC9D,QAAM,oBAAoB,YAAY,KAAK,CAAC,sBAAsB,GAAG;AAAA,IACnE,OAAO;AAAA,EACT,CAAC;AACD,SAAO,KAAK,iBAAiB,EAAE,QAAQ,CAAC,oBAAoB;AAC1D,UAAM,QAAQ,KAAK,MAAM,eAAe;AACxC,UAAMC,UAAS,MAAM;AACrB,UAAM,SAAS,kBAAkB,eAAe;AAChD,QAAI,UAAU,OAAO,SAAS;AAC5B,mBAAaA,OAAM,IAAI,OAAO;AAAA,IAChC;AAAA,EACF,CAAC;AACD,SAAO,aAAa,MAAM,KAAK,CAAC;AAClC;;;ACrCA,SAAQ,iBAAAC,sBAAoB;AAC5B,SAAQ,cAAAC,mBAAiB;AA0BlB,IAAM,kBAAkBD,eAAqC,IAAI;AAajE,SAAS,oBAAoB;AAClC,QAAM,UAAUC,YAAW,eAAe;AAC1C,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,2BAA2B;AAAA,EAC7C;AACA,SAAO;AACT;;;AC9CO,SAAS,cACd,eACA,QACA;AACA,QAAM,UAAU,cAAc;AAAA,IAC5B;AAAA,IACA,CAAC,OAAe,WAAmB,QAAgB;AACjD,YAAM,MAAM,OAAO,GAAG;AACtB,UAAI,CAAC,KAAK;AACR,cAAM,IAAI,MAAM,oBAAoB,KAAK,YAAY,aAAa,EAAE;AAAA,MACtE;AACA,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,kBAAkB,SAAiB;AACjD,QAAM,WAAW,QAAQ,MAAM,GAAG;AAClC,SAAO,SAAS,KAAK,CAAC,YAAY;AAChC,WAAO,QAAQ,WAAW,GAAG,KAAK,QAAQ,SAAS,GAAG;AAAA,EACxD,CAAC;AACH;",
6
+ "names": ["createContext", "useContext", "locale", "createContext", "useContext"]
7
+ }
@@ -32,4 +32,4 @@ export {
32
32
  configureServerPlugins,
33
33
  getVitePlugins
34
34
  };
35
- //# sourceMappingURL=chunk-XSNCF7WU.js.map
35
+ //# sourceMappingURL=chunk-XSNCF7WU.js.map
@@ -1 +1,7 @@
1
- {"version":3,"sources":["../src/core/plugin.ts"],"sourcesContent":["import {ViteDevServer, PluginOption as VitePlugin} from 'vite';\nimport {RootConfig} from './config.js';\nimport {Pod, PodFactory} from './pod.js';\nimport {NextFunction, Request, Response, Server} from './types.js';\n\ntype MaybePromise<T> = T | Promise<T>;\n\ntype PreBuildHook = (rootConfig: RootConfig) => MaybePromise<void>;\n\nexport interface PostBuildOptions {\n /** Whether the build was SSR-only (no SSG pre-rendering). */\n ssrOnly?: boolean;\n}\n\ntype PostBuildHook = (\n rootConfig: RootConfig,\n options?: PostBuildOptions\n) => MaybePromise<void>;\n\nexport type ConfigureServerHook = (\n server: Server,\n options: ConfigureServerOptions\n) => MaybePromise<void> | MaybePromise<() => void>;\n\nexport interface ConfigureServerOptions {\n type: 'dev' | 'preview' | 'prod';\n rootConfig: RootConfig;\n}\n\nexport interface PluginHooks {\n /**\n * Hook that runs before the build starts.\n */\n preBuild?: PreBuildHook;\n\n /**\n * Hook that runs after the build completes.\n */\n postBuild?: PostBuildHook;\n\n /**\n * Post-render hook that's called before the HTML is rendered to the response\n * object. If a string is returned from this hook, it will replace the\n * rendered HTML.\n */\n preRender?: (html: string) => void | MaybePromise<string>;\n}\n\nexport interface Plugin {\n [key: string]: any;\n /** The name of the plugin. */\n name?: string;\n /**\n * Configures the root.js express server. Any middleware defined by the plugin\n * will be added to the server first. If a callback fn is returned, it will\n * be called after the root.js middlewares are added.\n */\n configureServer?: ConfigureServerHook;\n /**\n * Hook for file changes.\n */\n onFileChange?: (\n eventName: 'add' | 'addDir' | 'change' | 'unlink' | 'unlinkDir',\n path: string\n ) => void;\n /**\n * Returns a list of deps to bundle for ssr. The files will be bundled and\n * output to `dist/server/`. The return value should be a map of\n * `{output filename => input filepath}`.\n *\n * E.g. a value of `{foo: 'path/to/bar.js'}` will output `dist/server/foo.js`.\n *\n * @experimental This config is subject to change to be incorporated into a\n * broader config option called \"ssr\" or \"ssrOptions\".\n */\n ssrInput?: () => {[entryAlias: string]: string};\n /** Adds vite plugins. */\n vitePlugins?: VitePlugin[];\n /** Plugin lifecycle callback hooks. */\n hooks?: PluginHooks;\n /** Custom 404 handler. */\n handle404?: (\n req: Request,\n res: Response,\n next: NextFunction\n ) => void | Promise<void>;\n\n /**\n * Registers a pod (a mini root.js site) that gets merged into the parent\n * site at dev/build time. A plugin may return a single pod, an array of\n * pods, or a factory that receives the rootConfig.\n */\n pod?: Pod | Pod[] | PodFactory;\n}\n\n/**\n * Runs the pre-hook configureServer method of every plugin, calls a callback\n * function, and then runs the configureServer's post-hook if provided. Plugins\n * provide a post-hook by returning a callback function from configureServer.\n */\nexport async function configureServerPlugins(\n server: Server,\n callback: () => Promise<void>,\n plugins: Plugin[],\n options: ConfigureServerOptions\n) {\n const postHooks: Array<() => void> = [];\n const viteServer = server.get('viteServer') as ViteDevServer;\n\n // Call the `configureServer()` method for each plugin.\n for (const plugin of plugins) {\n if (plugin.configureServer) {\n const postHook = await plugin.configureServer(server, options);\n if (postHook) {\n postHooks.push(postHook);\n }\n }\n\n if (viteServer && plugin.onFileChange) {\n viteServer.watcher.on('all', plugin.onFileChange);\n }\n }\n\n // Register any built-in middleware.\n callback();\n\n // Run any post hooks returned by `plugin.configureServer()`.\n for (const postHook of postHooks) {\n await postHook();\n }\n}\n\nexport function getVitePlugins(plugins: Plugin[]): VitePlugin[] {\n const vitePlugins: VitePlugin[] = [];\n for (const plugin of plugins) {\n if (plugin.vitePlugins) {\n vitePlugins.push(...plugin.vitePlugins);\n }\n }\n return vitePlugins;\n}\n"],"mappings":";AAoGA,eAAsB,uBACpB,QACA,UACA,SACA,SACA;AACA,QAAM,YAA+B,CAAC;AACtC,QAAM,aAAa,OAAO,IAAI,YAAY;AAG1C,aAAW,UAAU,SAAS;AAC5B,QAAI,OAAO,iBAAiB;AAC1B,YAAM,WAAW,MAAM,OAAO,gBAAgB,QAAQ,OAAO;AAC7D,UAAI,UAAU;AACZ,kBAAU,KAAK,QAAQ;AAAA,MACzB;AAAA,IACF;AAEA,QAAI,cAAc,OAAO,cAAc;AACrC,iBAAW,QAAQ,GAAG,OAAO,OAAO,YAAY;AAAA,IAClD;AAAA,EACF;AAGA,WAAS;AAGT,aAAW,YAAY,WAAW;AAChC,UAAM,SAAS;AAAA,EACjB;AACF;AAEO,SAAS,eAAe,SAAiC;AAC9D,QAAM,cAA4B,CAAC;AACnC,aAAW,UAAU,SAAS;AAC5B,QAAI,OAAO,aAAa;AACtB,kBAAY,KAAK,GAAG,OAAO,WAAW;AAAA,IACxC;AAAA,EACF;AACA,SAAO;AACT;","names":[]}
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/core/plugin.ts"],
4
+ "sourcesContent": ["import {ViteDevServer, PluginOption as VitePlugin} from 'vite';\nimport {RootConfig} from './config.js';\nimport {Pod, PodFactory} from './pod.js';\nimport {NextFunction, Request, Response, Server} from './types.js';\n\ntype MaybePromise<T> = T | Promise<T>;\n\ntype PreBuildHook = (rootConfig: RootConfig) => MaybePromise<void>;\n\nexport interface PostBuildOptions {\n /** Whether the build was SSR-only (no SSG pre-rendering). */\n ssrOnly?: boolean;\n}\n\ntype PostBuildHook = (\n rootConfig: RootConfig,\n options?: PostBuildOptions\n) => MaybePromise<void>;\n\nexport type ConfigureServerHook = (\n server: Server,\n options: ConfigureServerOptions\n) => MaybePromise<void> | MaybePromise<() => void>;\n\nexport interface ConfigureServerOptions {\n type: 'dev' | 'preview' | 'prod';\n rootConfig: RootConfig;\n}\n\nexport interface PluginHooks {\n /**\n * Hook that runs before the build starts.\n */\n preBuild?: PreBuildHook;\n\n /**\n * Hook that runs after the build completes.\n */\n postBuild?: PostBuildHook;\n\n /**\n * Post-render hook that's called before the HTML is rendered to the response\n * object. If a string is returned from this hook, it will replace the\n * rendered HTML.\n */\n preRender?: (html: string) => void | MaybePromise<string>;\n}\n\nexport interface Plugin {\n [key: string]: any;\n /** The name of the plugin. */\n name?: string;\n /**\n * Configures the root.js express server. Any middleware defined by the plugin\n * will be added to the server first. If a callback fn is returned, it will\n * be called after the root.js middlewares are added.\n */\n configureServer?: ConfigureServerHook;\n /**\n * Hook for file changes.\n */\n onFileChange?: (\n eventName: 'add' | 'addDir' | 'change' | 'unlink' | 'unlinkDir',\n path: string\n ) => void;\n /**\n * Returns a list of deps to bundle for ssr. The files will be bundled and\n * output to `dist/server/`. The return value should be a map of\n * `{output filename => input filepath}`.\n *\n * E.g. a value of `{foo: 'path/to/bar.js'}` will output `dist/server/foo.js`.\n *\n * @experimental This config is subject to change to be incorporated into a\n * broader config option called \"ssr\" or \"ssrOptions\".\n */\n ssrInput?: () => {[entryAlias: string]: string};\n /** Adds vite plugins. */\n vitePlugins?: VitePlugin[];\n /** Plugin lifecycle callback hooks. */\n hooks?: PluginHooks;\n /** Custom 404 handler. */\n handle404?: (\n req: Request,\n res: Response,\n next: NextFunction\n ) => void | Promise<void>;\n\n /**\n * Registers a pod (a mini root.js site) that gets merged into the parent\n * site at dev/build time. A plugin may return a single pod, an array of\n * pods, or a factory that receives the rootConfig.\n */\n pod?: Pod | Pod[] | PodFactory;\n}\n\n/**\n * Runs the pre-hook configureServer method of every plugin, calls a callback\n * function, and then runs the configureServer's post-hook if provided. Plugins\n * provide a post-hook by returning a callback function from configureServer.\n */\nexport async function configureServerPlugins(\n server: Server,\n callback: () => Promise<void>,\n plugins: Plugin[],\n options: ConfigureServerOptions\n) {\n const postHooks: Array<() => void> = [];\n const viteServer = server.get('viteServer') as ViteDevServer;\n\n // Call the `configureServer()` method for each plugin.\n for (const plugin of plugins) {\n if (plugin.configureServer) {\n const postHook = await plugin.configureServer(server, options);\n if (postHook) {\n postHooks.push(postHook);\n }\n }\n\n if (viteServer && plugin.onFileChange) {\n viteServer.watcher.on('all', plugin.onFileChange);\n }\n }\n\n // Register any built-in middleware.\n callback();\n\n // Run any post hooks returned by `plugin.configureServer()`.\n for (const postHook of postHooks) {\n await postHook();\n }\n}\n\nexport function getVitePlugins(plugins: Plugin[]): VitePlugin[] {\n const vitePlugins: VitePlugin[] = [];\n for (const plugin of plugins) {\n if (plugin.vitePlugins) {\n vitePlugins.push(...plugin.vitePlugins);\n }\n }\n return vitePlugins;\n}\n"],
5
+ "mappings": ";AAoGA,eAAsB,uBACpB,QACA,UACA,SACA,SACA;AACA,QAAM,YAA+B,CAAC;AACtC,QAAM,aAAa,OAAO,IAAI,YAAY;AAG1C,aAAW,UAAU,SAAS;AAC5B,QAAI,OAAO,iBAAiB;AAC1B,YAAM,WAAW,MAAM,OAAO,gBAAgB,QAAQ,OAAO;AAC7D,UAAI,UAAU;AACZ,kBAAU,KAAK,QAAQ;AAAA,MACzB;AAAA,IACF;AAEA,QAAI,cAAc,OAAO,cAAc;AACrC,iBAAW,QAAQ,GAAG,OAAO,OAAO,YAAY;AAAA,IAClD;AAAA,EACF;AAGA,WAAS;AAGT,aAAW,YAAY,WAAW;AAChC,UAAM,SAAS;AAAA,EACjB;AACF;AAEO,SAAS,eAAe,SAAiC;AAC9D,QAAM,cAA4B,CAAC;AACnC,aAAW,UAAU,SAAS;AAC5B,QAAI,OAAO,aAAa;AACtB,kBAAY,KAAK,GAAG,OAAO,WAAW;AAAA,IACxC;AAAA,EACF;AACA,SAAO;AACT;",
6
+ "names": []
7
+ }
@@ -0,0 +1,7 @@
1
+ export interface BuildOptions {
2
+ ssrOnly?: boolean;
3
+ mode?: string;
4
+ concurrency?: string | number;
5
+ filter?: string;
6
+ }
7
+ export declare function build(rootProjectDir?: string, options?: BuildOptions): Promise<void>;
@@ -0,0 +1,12 @@
1
+ import { build, BuildOptions } from './build.js';
2
+ import { createPackage } from './create-package.js';
3
+ import { dev, createDevServer } from './dev.js';
4
+ import { preview, createPreviewServer } from './preview.js';
5
+ import { start, createProdServer } from './start.js';
6
+ declare class CliRunner {
7
+ private name;
8
+ private version;
9
+ constructor(name: string, version: string);
10
+ run(argv: string[]): Promise<void>;
11
+ }
12
+ export { CliRunner, build, BuildOptions, createPackage, dev, createDevServer, preview, createPreviewServer, start, createProdServer, };
@@ -0,0 +1,5 @@
1
+ interface CodegenOptions {
2
+ out?: string;
3
+ }
4
+ export declare function codegen(type: string, name: string, options?: CodegenOptions): Promise<void>;
5
+ export {};
@@ -0,0 +1,14 @@
1
+ type DeployTarget = 'appengine' | 'firebase';
2
+ interface CreatePackageOptions {
3
+ mode?: string;
4
+ out?: string;
5
+ target?: DeployTarget;
6
+ version?: string;
7
+ appYaml?: string;
8
+ }
9
+ export declare function createPackage(rootProjectDir?: string, options?: CreatePackageOptions): Promise<void>;
10
+ /**
11
+ * Compiles a `.ts` file to `.js`.
12
+ */
13
+ export declare function bundleTsFile(srcPath: string, outPath: string): Promise<void>;
14
+ export {};
@@ -0,0 +1,10 @@
1
+ import { Server } from '../core/types.js';
2
+ export interface DevOptions {
3
+ host?: string;
4
+ version?: string;
5
+ }
6
+ export declare function dev(rootProjectDir?: string, options?: DevOptions): Promise<void>;
7
+ export declare function createDevServer(options?: {
8
+ rootDir?: string;
9
+ port?: number;
10
+ }): Promise<Server>;
@@ -0,0 +1,18 @@
1
+ export interface GaeDeployOptions {
2
+ /** GCP project id. */
3
+ project?: string;
4
+ /** Prefix to append to the version. */
5
+ prefix?: string;
6
+ /** Whether to divert traffic to the new version. */
7
+ promote?: boolean;
8
+ /** If provided, verifies that the given URL path returns a 200 response. */
9
+ healthcheckUrl?: string;
10
+ /** If provided, the latest N versions are preserved, all others are deleted */
11
+ maxVersions?: number;
12
+ }
13
+ export declare function gaeDeploy(appDir: string, options?: GaeDeployOptions): Promise<void>;
14
+ /**
15
+ * Returns whether the App Engine service succeeds in handling a health check
16
+ * request.
17
+ */
18
+ export declare function testHealth(project: string, service: string, version: string, healthcheckUrl: string): Promise<boolean>;
@@ -0,0 +1,8 @@
1
+ import { Server } from '../core/types.js';
2
+ export interface PreviewOptions {
3
+ host?: string;
4
+ }
5
+ export declare function preview(rootProjectDir?: string, options?: PreviewOptions): Promise<void>;
6
+ export declare function createPreviewServer(options: {
7
+ rootDir: string;
8
+ }): Promise<Server>;
@@ -0,0 +1,8 @@
1
+ import { Server } from '../core/types.js';
2
+ export interface StartOptions {
3
+ host?: string;
4
+ }
5
+ export declare function start(rootProjectDir?: string, options?: StartOptions): Promise<void>;
6
+ export declare function createProdServer(options: {
7
+ rootDir: string;
8
+ }): Promise<Server>;
@@ -0,0 +1,17 @@
1
+ import type { StartupTask } from './startup-tasks.js';
2
+ /**
3
+ * Startup task that checks whether a newer version of `@blinkk/root` has been
4
+ * published to npm and, if so, prints an update notice. Throttled to run at
5
+ * most once per day.
6
+ */
7
+ export declare const checkVersionTask: StartupTask;
8
+ /**
9
+ * Returns true if `latest` is a higher semantic version than `current`.
10
+ * Pre-release identifiers are ignored.
11
+ */
12
+ export declare function isNewerVersion(current: string, latest: string): boolean;
13
+ /**
14
+ * Returns true if `version` is an alpha, beta, or rc pre-release build, e.g.
15
+ * `3.1.0-rc.1`.
16
+ */
17
+ export declare function isPrerelease(version: string): boolean;