@blinkk/root 3.1.2 → 3.1.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.
- package/dist/{chunk-X2C2MEJ2.js → chunk-HPRRG4EA.js} +2 -1
- package/dist/chunk-HPRRG4EA.js.map +7 -0
- package/dist/{chunk-GK3TDYUY.js → chunk-WGQNQPWG.js} +85 -5
- package/dist/chunk-WGQNQPWG.js.map +7 -0
- package/dist/cli/build-progress.d.ts +35 -0
- package/dist/cli.js +1 -1
- package/dist/functions.js +1 -1
- package/dist/jsx.js +1 -1
- package/dist/render.js +1 -1
- package/package.json +1 -1
- package/dist/chunk-GK3TDYUY.js.map +0 -7
- package/dist/chunk-X2C2MEJ2.js.map +0 -7
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/cli/cli.ts", "../src/cli/build.ts", "../src/node/vite-plugin-prune-empty-chunks.ts", "../src/utils/batch.ts", "../src/cli/build-progress.ts", "../src/cli/build-worker-pool.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/secrets.ts", "../src/secrets/manifest.ts", "../src/secrets/secrets.ts", "../src/secrets/env-file.ts", "../src/secrets/gcloud.ts", "../src/secrets/hash.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, Option} 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 {registerSecretsCommands} from './secrets.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 '--threads [num]',\n 'renders pages using worker threads; pass a number for exactly N workers, or omit the value (or pass \"auto\") to pick based on cpu cores and page count'\n )\n .option(\n '--filter <urlPathRegex>',\n 'builds the url paths that match the given regex, e.g. \"/products/.*\"',\n ''\n )\n .addOption(\n new Option(\n '--log <mode>',\n 'build log output: \"progress\" (default) shows a progress indicator and a final summary, \"verbose\" prints one line per output file, \"quiet\" prints only the final summary'\n ).choices(['progress', 'verbose', 'quiet'])\n )\n .action((rootProjectDir, options, cmd) =>\n build(rootProjectDir, cmd.optsWithGlobals())\n );\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 registerSecretsCommands(program);\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 os from 'node:os';\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, SitemapItem} 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 {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';\nimport {buildPage, BuildPageResult} from './build-page.js';\nimport {\n BuildLogMode,\n BuildProgress,\n formatBytes,\n parseBuildLogMode,\n} from './build-progress.js';\nimport {BuildPageError, BuildWorkerPool} from './build-worker-pool.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 * Renders pages using worker threads. Pass a number to use exactly N\n * workers, or pass without a value (or \"auto\") to pick a worker count\n * automatically based on CPU cores and the number of pages to build.\n */\n threads?: string | boolean;\n /**\n * Build log output mode: \"progress\" (default) shows a progress indicator\n * and a final summary, \"verbose\" prints one line per output file, and\n * \"quiet\" prints only the final summary.\n */\n log?: string;\n /** Global `-q, --quiet` flag; equivalent to `log: 'quiet'`. */\n quiet?: boolean;\n}\n\n/** Active log mode for the current build. */\nlet activeLogMode: BuildLogMode = 'progress';\n\nexport async function build(rootProjectDir?: string, options?: BuildOptions) {\n const mode = options?.mode || 'production';\n process.env.NODE_ENV = mode;\n activeLogMode = options?.quiet ? 'quiet' : parseBuildLogMode(options?.log);\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 if (activeLogMode !== 'quiet') {\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\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 // In quiet mode, only surface vite warnings and errors.\n logLevel: activeLogMode === 'quiet' ? 'warn' : viteConfig.logLevel,\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 podRoutes = pods.flatMap((pod) =>\n pod.routeFiles.map((route) => ({\n src: `pod/${pod.name}/${route.relPath}`,\n filePath: route.filePath,\n }))\n );\n const assetMap = BuildAssetMap.fromViteManifest(\n rootConfig,\n clientManifest,\n elementGraph,\n podRoutes\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 if (activeLogMode !== 'quiet') {\n console.log('\\njs/css output:');\n }\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 /** Adds an entry to sitemap.xml for a rendered page. */\n const addSitemapXmlItem = (\n urlPath: string,\n sitemapItem: SitemapItem,\n outFilePath: string\n ) => {\n // Save the url to sitemap.xml. Ignore error files (e.g. 404.html).\n if (!rootConfig.sitemap || !outFilePath.endsWith('index.html')) {\n return;\n }\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 /** Handles the result of a page render. */\n const onPageResult = (\n sitemapItem: SitemapItem,\n result: BuildPageResult\n ) => {\n if (result.notFound || !result.outFilePath) {\n return;\n }\n if (!result.staticContent) {\n addSitemapXmlItem(result.urlPath, sitemapItem, result.outFilePath);\n }\n progress.add(\n result.outFilePath,\n fileSizeBytes(path.join(buildDir, result.outFilePath))\n );\n };\n\n // If \"excludeDefaultLocaleFromIntlPaths\" is true, ignore /intl/en/... in\n // the SSG build and exclude it from sitemap.xml.\n const sitemapEntries = Object.entries(sitemap).filter(([, sitemapItem]) => {\n if (rootConfig.build?.excludeDefaultLocaleFromIntlPaths) {\n const defaultLocale = rootConfig.i18n?.defaultLocale || 'en';\n if (sitemapItem.locale === defaultLocale) {\n return false;\n }\n }\n return true;\n });\n\n if (activeLogMode !== 'quiet') {\n console.log('\\nhtml output:');\n }\n const concurrency = Number(options?.concurrency || 10);\n const resolvedThreads = resolveNumThreads(\n options?.threads,\n sitemapEntries.length\n );\n const numThreads = resolvedThreads.count;\n const workerConcurrency =\n numThreads > 0 ? Math.max(Math.ceil(concurrency / numThreads), 1) : 0;\n // Log the render parallelism (helps troubleshoot what `--threads=auto`\n // resolved to, e.g. when investigating OOM issues on CI builders).\n if (activeLogMode !== 'quiet') {\n const threadsDesc =\n numThreads > 0\n ? `${numThreads} workers x ${workerConcurrency} pages/worker`\n : `in-process, ${concurrency} concurrent pages`;\n console.log(\n ` ${dim(`threads: ${threadsDesc} (${resolvedThreads.source})`)}`\n );\n }\n const progress = new BuildProgress({\n total: sitemapEntries.length,\n mode: activeLogMode,\n itemLabel: 'pages',\n outputDirLabel: 'dist/html/',\n });\n\n try {\n if (numThreads > 0) {\n // Render pages in parallel using worker threads. Each worker loads the\n // server bundle (dist/server/render.js) and renders pages\n // independently.\n const pool = new BuildWorkerPool({\n numWorkers: numThreads,\n workerConcurrency,\n rootDir,\n mode,\n });\n try {\n await pool.ready();\n await Promise.all(\n sitemapEntries.map(async ([urlPath, sitemapItem]) => {\n try {\n const result = await pool.run({\n urlPath,\n params: sitemapItem.params,\n routeSrc: sitemapItem.route.src,\n locale: sitemapItem.locale,\n });\n onPageResult(sitemapItem, result);\n } catch (e) {\n if (e instanceof BuildPageError) {\n progress.abort();\n logBuildError(\n {\n route: sitemapItem.route,\n params: sitemapItem.params,\n urlPath,\n },\n new Error(e.workerError)\n );\n }\n throw e;\n }\n })\n );\n } finally {\n await pool.terminate();\n }\n } else {\n await batchAsyncCalls(\n sitemapEntries,\n concurrency,\n async ([urlPath, sitemapItem]) => {\n try {\n const result = await buildPage(\n renderer,\n rootConfig,\n buildDir,\n sitemapItem.route,\n {urlPath, params: sitemapItem.params}\n );\n onPageResult(sitemapItem, result);\n } catch (e) {\n progress.abort();\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 } catch (e) {\n progress.abort();\n throw e;\n }\n progress.finish();\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\n/**\n * Minimum number of pages per worker thread in \"auto\" mode. Each worker pays\n * a fixed startup cost (loading the server bundle, config, and manifests), so\n * spawning a worker is only worthwhile when it has enough pages to render.\n */\nconst MIN_PAGES_PER_THREAD = 10;\n\n/**\n * Estimated memory footprint per worker thread (in bytes), used to cap the\n * worker count in \"auto\" mode. Each worker loads the site's server bundle,\n * config, and manifests, and holds in-flight renders, which can add up to\n * hundreds of MB on large sites. Without a memory cap, high-core machines\n * (e.g. 32-core CI runners) can spawn more workers than the machine's RAM\n * supports, leading to out-of-memory crashes.\n */\nconst MEMORY_PER_THREAD = 1024 * 1024 * 1024; // 1GB\n\n/** Result of resolving the `--threads` flag. */\ninterface ResolvedThreads {\n /** Number of worker threads to use (0 = in-process build). */\n count: number;\n /** Human-readable description of how the count was determined. */\n source: string;\n}\n\n/**\n * Returns the memory (in bytes) available for worker threads. Prefers\n * `process.availableMemory()`, which counts reclaimable memory (file caches,\n * inactive pages) that the OS will hand back under pressure. `os.freemem()`\n * only counts truly-free pages, which on macOS (and Linux with a warm page\n * cache) is often near zero even when most RAM is reclaimable, causing\n * `--threads=auto` to always resolve to an in-process build.\n */\nfunction availableMemory(): number {\n if (typeof process.availableMemory === 'function') {\n return process.availableMemory();\n }\n return os.freemem();\n}\n\n/**\n * Resolves the `--threads` flag to a worker count. Returns a count of 0 for\n * an in-process (single-threaded) build.\n *\n * - unset: 0 (in-process build).\n * - `--threads` or `--threads auto`: picks a worker count based on the\n * machine's CPU cores, available memory, and the number of pages to build.\n * One core is reserved for the main thread, each worker is budgeted\n * `MEMORY_PER_THREAD` of available memory, and each worker should have at\n * least `MIN_PAGES_PER_THREAD` pages to justify its startup cost. Small\n * builds resolve to 0 and stay in-process.\n * - `--threads <num>`: uses exactly N workers (no workload heuristics).\n */\nfunction resolveNumThreads(\n threads: string | boolean | undefined,\n numPages: number\n): ResolvedThreads {\n if (threads === undefined || threads === false) {\n return {count: 0, source: '--threads not set'};\n }\n if (threads === true || threads === 'auto') {\n const maxByCpu = Math.max(os.availableParallelism() - 1, 1);\n const maxByPages = Math.floor(numPages / MIN_PAGES_PER_THREAD);\n // Reserve 1 worker's worth of memory for the main thread.\n const maxByMemory = Math.max(\n Math.floor(availableMemory() / MEMORY_PER_THREAD) - 1,\n 1\n );\n const numThreads = Math.min(maxByCpu, maxByPages, maxByMemory);\n // Surface each limit so it's clear which one is binding, e.g.\n // \"auto = min(cpu 31, pages 212, memory 14)\".\n const source = `auto = min(cpu ${maxByCpu}, pages ${maxByPages}, memory ${maxByMemory})`;\n // A single worker is never faster than rendering in-process (same\n // parallelism, plus startup and messaging overhead).\n if (numThreads <= 1) {\n return {count: 0, source};\n }\n return {count: numThreads, source};\n }\n const num = parseInt(threads);\n if (isNaN(num) || num < 0) {\n throw new Error(`invalid --threads value: ${threads}`);\n }\n return {count: num, source: `--threads=${num}`};\n}\n\nfunction fileSizeBytes(filepath: string): number {\n return fsExtra.statSync(filepath).size;\n}\n\nfunction fileSize(filepath: string) {\n return formatBytes(fileSizeBytes(filepath));\n}\n\nfunction printFileOutput(\n fileSize: string,\n outputDir: string,\n outputFile: string\n) {\n if (activeLogMode === 'quiet') {\n return;\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 {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", "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 {cyan, dim, green} from 'kleur/colors';\n\n/**\n * Log output modes for `root build`:\n *\n * - `progress` (default): shows a progress indicator while pages render. In\n * interactive terminals this is a live single-line progress bar; in\n * non-interactive environments (e.g. CI) a progress line is printed at\n * ~10% intervals. A short summary (with the largest output files) is\n * printed at the end.\n * - `verbose`: prints one line per output file (legacy behavior).\n * - `quiet`: prints only the final summary line.\n */\nexport type BuildLogMode = 'progress' | 'verbose' | 'quiet';\n\nexport function parseBuildLogMode(value: unknown): BuildLogMode {\n if (value === undefined || value === null || value === '') {\n return 'progress';\n }\n if (value === 'progress' || value === 'verbose' || value === 'quiet') {\n return value;\n }\n throw new Error(\n `invalid --log value: \"${value}\" (expected \"progress\", \"verbose\", or \"quiet\")`\n );\n}\n\n/** Formats a byte count for display, e.g. `549.86 kB`. */\nexport function formatBytes(bytes: number): string {\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\n/** Formats a duration in ms for display, e.g. `45.2s` or `2m31s`. */\nexport function formatDuration(ms: number): string {\n const secs = ms / 1000;\n if (secs < 60) {\n return `${secs.toFixed(1)}s`;\n }\n const mins = Math.floor(secs / 60);\n const rem = Math.round(secs - mins * 60);\n return `${mins}m${String(rem).padStart(2, '0')}s`;\n}\n\ninterface WritableStreamLike {\n write(str: string): unknown;\n isTTY?: boolean;\n}\n\ntype AnyWriteFn = (...args: unknown[]) => unknown;\n\nexport interface BuildProgressOptions {\n /** Total number of files expected. */\n total: number;\n /** Log output mode. */\n mode: BuildLogMode;\n /** Label for items in progress lines. Defaults to \"pages\". */\n itemLabel?: string;\n /** Path prefix shown before file paths, e.g. `dist/html/`. */\n outputDirLabel?: string;\n /** Output stream. Defaults to `process.stdout`. */\n stream?: WritableStreamLike;\n /** Clock function (injectable for tests). Defaults to `Date.now`. */\n now?: () => number;\n /**\n * Minimum interval between progress updates, in ms. Defaults to 80ms for\n * interactive terminals and 5000ms otherwise.\n */\n intervalMs?: number;\n /** Number of largest files to list in the summary. Defaults to 5. */\n summaryTopN?: number;\n /**\n * Streams to intercept while the TTY progress bar is active. Anything\n * written to these streams (e.g. `console.log` calls from user code during\n * page renders) clears the bar first so the log prints on its own line,\n * then the bar is redrawn below. Defaults to\n * `[process.stdout, process.stderr]` when `stream` is not overridden.\n */\n interceptStreams?: WritableStreamLike[];\n}\n\nconst BAR_WIDTH = 20;\n\n/**\n * Reports progress for build output files.\n *\n * Tracks completed files and bytes written, and renders progress according\n * to the configured `BuildLogMode`. Designed to keep CI logs readable: a\n * 10,000-page build emits ~10 progress lines instead of 10,000.\n *\n * While the interactive (TTY) progress bar is active, writes to\n * `interceptStreams` from other sources (e.g. `console.log` from user code\n * rendering pages, including output forwarded from worker threads) are\n * wrapped so log lines appear above the bar instead of interleaving with it.\n * Call `finish()` or `abort()` to restore the streams.\n */\nexport class BuildProgress {\n private readonly total: number;\n private readonly mode: BuildLogMode;\n private readonly itemLabel: string;\n private readonly outputDirLabel: string;\n private readonly stream: WritableStreamLike;\n private readonly now: () => number;\n private readonly intervalMs: number;\n private readonly summaryTopN: number;\n private readonly isTTY: boolean;\n private readonly startedAt: number;\n\n private completed = 0;\n private totalBytes = 0;\n private files: Array<{path: string; size: number}> = [];\n private lastPrintAt = 0;\n private lastMilestone = 0;\n private ttyLineActive = false;\n private done = false;\n /** Writes to `this.stream`, bypassing the log interceptor. */\n private streamWrite: (str: string) => unknown;\n /** Restores the original `write` of each intercepted stream. */\n private restoreWrites: Array<() => void> = [];\n /** True when intercepted output ended without a trailing newline. */\n private foreignLineOpen = false;\n private redrawTimer: ReturnType<typeof setTimeout> | null = null;\n\n constructor(options: BuildProgressOptions) {\n this.total = options.total;\n this.mode = options.mode;\n this.itemLabel = options.itemLabel ?? 'pages';\n this.outputDirLabel = options.outputDirLabel ?? '';\n this.stream = options.stream ?? process.stdout;\n this.now = options.now ?? Date.now;\n this.isTTY = !!this.stream.isTTY;\n this.intervalMs = options.intervalMs ?? (this.isTTY ? 80 : 5000);\n this.summaryTopN = options.summaryTopN ?? 5;\n this.startedAt = this.now();\n this.streamWrite = (str: string) => this.stream.write(str);\n const interceptStreams =\n options.interceptStreams ??\n (options.stream ? [] : [process.stdout, process.stderr]);\n if (this.isTTY && this.mode === 'progress') {\n this.interceptLogs(interceptStreams);\n }\n }\n\n /** Records a completed output file. */\n add(outputFile: string, sizeBytes: number) {\n this.completed += 1;\n this.totalBytes += sizeBytes;\n this.files.push({path: outputFile, size: sizeBytes});\n if (this.mode === 'verbose') {\n const paddedSize = formatBytes(sizeBytes).padStart(9, ' ');\n this.println(\n ` ${dim(paddedSize)} ${dim(this.outputDirLabel)}${cyan(outputFile)}`\n );\n return;\n }\n if (this.mode === 'progress') {\n this.maybePrintProgress();\n }\n }\n\n /** Clears any in-place progress line (call before printing errors). */\n abort() {\n this.clearTtyLine();\n this.done = true;\n this.restoreLogs();\n }\n\n /** Prints the final summary. */\n finish() {\n if (this.done) {\n return;\n }\n this.done = true;\n this.restoreLogs();\n this.clearTtyLine();\n const elapsed = formatDuration(this.now() - this.startedAt);\n const summary = `${this.completed} ${this.itemLabel} (${formatBytes(\n this.totalBytes\n )}) in ${elapsed}`;\n this.println(` ${green('\u2713')} ${summary}`);\n if (this.mode === 'progress' && this.summaryTopN > 0) {\n const largest = [...this.files]\n .sort((a, b) => b.size - a.size)\n .slice(0, this.summaryTopN);\n if (largest.length > 0) {\n this.println(` ${dim(`largest ${this.itemLabel}:`)}`);\n for (const file of largest) {\n const paddedSize = formatBytes(file.size).padStart(9, ' ');\n this.println(\n ` ${dim(paddedSize)} ${dim(this.outputDirLabel)}${cyan(\n file.path\n )}`\n );\n }\n }\n }\n }\n\n private maybePrintProgress() {\n const now = this.now();\n if (this.isTTY) {\n // Live single-line progress bar, throttled to avoid excessive redraws.\n // The final state is always rendered by `finish()`.\n if (now - this.lastPrintAt < this.intervalMs) {\n return;\n }\n this.lastPrintAt = now;\n this.renderTtyLine(now);\n return;\n }\n // Non-interactive (e.g. CI): print a progress line at each ~10%\n // milestone, throttled to at most one line per interval. The 100%\n // state is reported by `finish()`.\n const milestone = Math.floor((this.completed / this.total) * 10);\n if (milestone <= this.lastMilestone || this.completed === this.total) {\n return;\n }\n if (now - this.lastPrintAt < this.intervalMs) {\n return;\n }\n this.lastMilestone = milestone;\n this.lastPrintAt = now;\n const pct = Math.floor((this.completed / this.total) * 100);\n this.println(\n ` ${this.completed}/${this.total} ${this.itemLabel} (${pct}%) \u00B7 ${formatBytes(this.totalBytes)} \u00B7 ${formatDuration(now - this.startedAt)}${this.eta(now)}`\n );\n }\n\n private renderTtyLine(now: number) {\n this.closeForeignLine();\n const ratio = this.total > 0 ? this.completed / this.total : 0;\n const filled = Math.round(ratio * BAR_WIDTH);\n const bar = '\u2595' + '\u2588'.repeat(filled) + '\u2591'.repeat(BAR_WIDTH - filled) + '\u258F';\n const pct = String(Math.floor(ratio * 100)).padStart(3, ' ');\n const line = ` ${bar} ${pct}% \u00B7 ${this.completed}/${this.total} ${this.itemLabel} \u00B7 ${formatBytes(this.totalBytes)} \u00B7 ${formatDuration(now - this.startedAt)}${this.eta(now)}`;\n this.streamWrite(`\\r\\x1b[2K${line}`);\n this.ttyLineActive = true;\n }\n\n /** Returns an \" \u00B7 eta 12.3s\" suffix once enough progress exists to estimate. */\n private eta(now: number): string {\n if (this.completed < 10 || this.completed / this.total < 0.05) {\n return '';\n }\n const elapsed = now - this.startedAt;\n const remaining =\n (elapsed / this.completed) * (this.total - this.completed);\n return ` \u00B7 eta ${formatDuration(remaining)}`;\n }\n\n private clearTtyLine() {\n if (this.ttyLineActive) {\n this.streamWrite('\\r\\x1b[2K');\n this.ttyLineActive = false;\n }\n }\n\n private println(line: string) {\n this.clearTtyLine();\n this.closeForeignLine();\n this.streamWrite(line + '\\n');\n }\n\n /**\n * Patches `write` on each stream so foreign output (user logs) clears the\n * progress bar line before printing and schedules a redraw after. The\n * progress bar's own writes go through `streamWrite` and bypass the patch.\n */\n private interceptLogs(streams: WritableStreamLike[]) {\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const self = this;\n for (const stream of streams) {\n const original = stream.write as AnyWriteFn;\n if (stream === this.stream) {\n this.streamWrite = (str: string) => original.call(stream, str);\n }\n stream.write = function (...args: unknown[]) {\n self.clearTtyLine();\n const chunk = args[0];\n const text = typeof chunk === 'string' ? chunk : String(chunk ?? '');\n self.foreignLineOpen = text.length > 0 && !text.endsWith('\\n');\n const result = original.apply(stream, args);\n self.scheduleRedraw();\n return result;\n } as WritableStreamLike['write'];\n this.restoreWrites.push(() => {\n stream.write = original as WritableStreamLike['write'];\n });\n }\n }\n\n /** Redraws the progress bar shortly after foreign output interrupts it. */\n private scheduleRedraw() {\n if (this.done || this.redrawTimer !== null || this.completed === 0) {\n return;\n }\n this.redrawTimer = setTimeout(() => {\n this.redrawTimer = null;\n if (!this.done) {\n this.renderTtyLine(this.now());\n }\n }, 0);\n this.redrawTimer.unref?.();\n }\n\n /**\n * If intercepted output left a partial (unterminated) line, terminate it\n * so the next progress bar render doesn't overwrite it with `\\r`.\n */\n private closeForeignLine() {\n if (this.foreignLineOpen) {\n this.streamWrite('\\n');\n this.foreignLineOpen = false;\n }\n }\n\n private restoreLogs() {\n if (this.redrawTimer) {\n clearTimeout(this.redrawTimer);\n this.redrawTimer = null;\n }\n while (this.restoreWrites.length > 0) {\n this.restoreWrites.pop()!();\n }\n }\n}\n", "import path from 'node:path';\nimport {fileURLToPath} from 'node:url';\nimport v8 from 'node:v8';\nimport {Worker} from 'node:worker_threads';\n\nimport {\n BuildPageResult,\n BuildPageTask,\n BuildWorkerRequest,\n BuildWorkerResponse,\n} from './build-page.js';\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\n\n/**\n * Heap size limit (in MB) for each worker thread.\n *\n * Worker threads do not inherit the main thread's heap size limit (e.g. from\n * `NODE_OPTIONS=--max-old-space-size=...`). When `resourceLimits` is unset,\n * v8 sizes each worker's heap from the memory available at spawn time, which\n * can collapse to a few hundred MB when many workers start concurrently \u2014\n * causing \"JavaScript heap out of memory\" crashes on large builds even on\n * machines with plenty of RAM. Give each worker the same heap limit as the\n * main thread so flags like `--max-old-space-size` apply to workers too.\n */\nconst WORKER_HEAP_LIMIT_MB = Math.ceil(\n v8.getHeapStatistics().heap_size_limit / (1024 * 1024)\n);\n\nexport interface BuildWorkerPoolOptions {\n /** Number of worker threads. */\n numWorkers: number;\n /**\n * Number of pages each worker renders concurrently. Rendering is async, so\n * pages that wait on I/O (e.g. CMS fetches in `getStaticProps()`) don't\n * block other pages on the same thread.\n */\n workerConcurrency: number;\n /** Project root dir, passed to each worker. */\n rootDir: string;\n /** Build mode (e.g. \"production\"), passed to each worker. */\n mode: string;\n}\n\ninterface PendingTask {\n id: number;\n task: BuildPageTask;\n resolve: (result: BuildPageResult) => void;\n reject: (err: Error) => void;\n}\n\nexport class BuildPageError extends Error {\n urlPath: string;\n params: Record<string, string>;\n routeSrc?: string;\n workerError: string;\n\n constructor(\n urlPath: string,\n params: Record<string, string>,\n routeSrc: string | undefined,\n workerError: string\n ) {\n super(\n `BuildError: ${urlPath} (${routeSrc || 'unknown route'}) failed to build.`\n );\n this.urlPath = urlPath;\n this.params = params;\n this.routeSrc = routeSrc;\n this.workerError = workerError;\n }\n}\n\nclass BuildWorker {\n private worker: Worker;\n private pool: BuildWorkerPool;\n private concurrency: number;\n private inFlight = new Map<number, PendingTask>();\n private isReady = false;\n ready: Promise<void>;\n\n constructor(pool: BuildWorkerPool, options: BuildWorkerPoolOptions) {\n this.pool = pool;\n this.concurrency = options.workerConcurrency;\n this.worker = new Worker(path.resolve(__dirname, './build-worker.js'), {\n workerData: {rootDir: options.rootDir, mode: options.mode},\n resourceLimits: {maxOldGenerationSizeMb: WORKER_HEAP_LIMIT_MB},\n });\n let onReady!: () => void;\n let onFailed!: (err: Error) => void;\n this.ready = new Promise<void>((resolve, reject) => {\n onReady = resolve;\n onFailed = reject;\n });\n this.worker.on('message', (msg: BuildWorkerResponse) => {\n if (msg.type === 'ready') {\n this.isReady = true;\n onReady();\n this.next();\n } else if (msg.type === 'result') {\n const pending = this.inFlight.get(msg.id);\n this.inFlight.delete(msg.id);\n pending?.resolve(msg.result);\n this.next();\n } else if (msg.type === 'error') {\n const pending = this.inFlight.get(msg.id);\n this.inFlight.delete(msg.id);\n pending?.reject(\n new BuildPageError(msg.urlPath, msg.params, msg.routeSrc, msg.error)\n );\n this.next();\n } else if (msg.type === 'fatal') {\n const err = new Error(`build worker failed: ${msg.error}`);\n onFailed(err);\n this.failAll(err);\n }\n });\n this.worker.on('error', (err) => {\n onFailed(err);\n this.failAll(err);\n });\n this.worker.on('exit', (code) => {\n if (code !== 0) {\n const err = new Error(`build worker exited with code ${code}`);\n onFailed(err);\n this.failAll(err);\n }\n });\n }\n\n /**\n * Rejects all in-flight tasks after a worker-level failure (fatal error,\n * crash, or non-zero exit \u2014 e.g. an OOM kill).\n *\n * Each task is rejected with its own `BuildPageError` so the build log\n * names every page that was in flight when the worker died. Without this,\n * worker deaths surface as a single generic error with no route context,\n * making OOM crashes impossible to trace back to pages. Note the in-flight\n * pages are the OOM *suspects*, not necessarily the cause (memory pressure\n * is cumulative), which is why the message says \"while rendering\".\n */\n private failAll(err: Error) {\n const pendingTasks = Array.from(this.inFlight.values());\n this.inFlight.clear();\n pendingTasks.forEach((pending) =>\n pending.reject(\n new BuildPageError(\n pending.task.urlPath,\n pending.task.params,\n pending.task.routeSrc,\n `worker thread died while rendering this page (` +\n `${pendingTasks.length} page(s) were in flight): ` +\n String(err.message || err)\n )\n )\n );\n }\n\n /** Pulls tasks off the pool's queue until at max concurrency. */\n next() {\n if (!this.isReady) {\n return;\n }\n while (this.inFlight.size < this.concurrency) {\n const pending = this.pool.dequeue();\n if (!pending) {\n return;\n }\n this.inFlight.set(pending.id, pending);\n const req: BuildWorkerRequest = {\n type: 'render',\n id: pending.id,\n task: pending.task,\n };\n this.worker.postMessage(req);\n }\n }\n\n async terminate() {\n await this.worker.terminate();\n }\n}\n\n/**\n * A pool of worker threads that render SSG pages in parallel. Each worker\n * loads the site's built server bundle (`dist/server/render.js`) and renders\n * pages independently, allowing the build to utilize multiple CPU cores.\n */\nexport class BuildWorkerPool {\n private workers: BuildWorker[] = [];\n private queue: PendingTask[] = [];\n private nextTaskId = 0;\n\n constructor(options: BuildWorkerPoolOptions) {\n for (let i = 0; i < options.numWorkers; i++) {\n this.workers.push(new BuildWorker(this, options));\n }\n }\n\n /** Waits for all workers to finish initializing. */\n async ready() {\n await Promise.all(this.workers.map((worker) => worker.ready));\n }\n\n /** Schedules a page build and resolves when the page finishes. */\n run(task: BuildPageTask): Promise<BuildPageResult> {\n return new Promise<BuildPageResult>((resolve, reject) => {\n this.queue.push({id: this.nextTaskId++, task, resolve, reject});\n // Wake up any workers with spare capacity.\n this.workers.forEach((worker) => worker.next());\n });\n }\n\n dequeue(): PendingTask | undefined {\n return this.queue.shift();\n }\n\n async terminate() {\n await Promise.all(this.workers.map((worker) => worker.terminate()));\n }\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 securityHeadersMiddleware,\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 {syncSecretsOnDev} from './secrets.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 // Block on a secrets sync (if configured) so managed values are live before\n // the server starts. Bounded by an internal timeout; never throws.\n await syncSecretsOnDev(rootDir);\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 // Set security-related HTTP headers (e.g. HSTS) on all responses. The\n // renderer re-sets these on rendered HTML responses (along with the\n // per-request CSP nonce).\n server.use(securityHeadersMiddleware({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 {spawn} from 'node:child_process';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport * as readline from 'node:readline';\n\nimport {Command} from 'commander';\nimport {dim, green, red, yellow} from 'kleur/colors';\n\nimport {\n emptyManifest,\n ImportConfig,\n manifestPath,\n MANIFEST_FILENAME,\n readManifest,\n writeManifest,\n} from '../secrets/manifest.js';\nimport {\n EnvPushResult,\n getSecretsStatus,\n isSecretsSyncEnabled,\n KeyStatus,\n pushEnvToSecrets,\n removeSecret,\n setSecret,\n syncSecrets,\n SyncResult,\n} from '../secrets/secrets.js';\n\nconst BAR = dim('\u2503');\nconst DEV_SYNC_TIMEOUT_MS = 10000;\n\n/** Registers the `root secrets \u2026` command group. */\nexport function registerSecretsCommands(program: Command) {\n const secrets = program\n .command('secrets')\n .description(\n 'manage shared secrets backed by Google Cloud Secret Manager (requires the gcloud CLI)'\n );\n\n secrets\n .command('init')\n .description('create a secrets manifest')\n .requiredOption('--gcp-project <id>', 'GCP project id')\n .requiredOption('--gsm-key <key>', 'Secret Manager key for this manifest')\n .option(\n '--manifest <path>',\n 'manifest path (defaults to ./.root.secrets.json)'\n )\n .option('--import <path>', 'path to a shared manifest to import keys from')\n .option(\n '--import-keys <names>',\n 'comma-separated subset of shared keys to import'\n )\n .action(action(secretsInit));\n\n secrets\n .command('set <name>')\n .description(\n 'store a secret value, read from a prompt (TTY) or piped stdin'\n )\n .option(\n '--manifest <path>',\n 'target manifest (defaults to ./.root.secrets.json)'\n )\n .action(action(secretsSet));\n\n secrets\n .command('rm <name>')\n .description('remove a secret')\n .option(\n '--manifest <path>',\n 'target manifest (defaults to ./.root.secrets.json)'\n )\n .action(action(secretsRm));\n\n secrets\n .command('sync')\n .description('three-way merge managed secrets into .env')\n .action(action(secretsSync));\n\n secrets\n .command('pull')\n .description(\n 'force-download managed secrets into .env (overwrites local edits)'\n )\n .action(action(secretsPull));\n\n secrets\n .command('push')\n .description(\n 'push .env values up to Secret Manager and record them in the manifest'\n )\n .option(\n '--manifest <path>',\n 'target manifest (defaults to ./.root.secrets.json)'\n )\n .option(\n '--keys <names>',\n 'comma-separated subset of .env keys (default: all)'\n )\n .option('--yes', 'skip the confirmation prompt')\n .action(action(secretsPush));\n\n secrets\n .command('status')\n .description('show managed secrets and their sync status (no network)')\n .action(action(secretsStatus));\n}\n\ninterface InitOptions {\n gcpProject: string;\n gsmKey: string;\n manifest?: string;\n import?: string;\n importKeys?: string;\n}\n\nasync function secretsInit(opts: InitOptions) {\n const rootDir = process.cwd();\n const target = opts.manifest\n ? path.resolve(rootDir, opts.manifest)\n : manifestPath(rootDir);\n\n if (await readManifest(target)) {\n console.log(\n `${BAR} ${yellow('secrets:')} manifest already exists at ${rel(rootDir, target)}`\n );\n return;\n }\n\n const manifest = emptyManifest(opts.gcpProject, opts.gsmKey);\n if (opts.import) {\n const importConfig: ImportConfig = {manifest: opts.import};\n if (opts.importKeys) {\n const keys = opts.importKeys\n .split(',')\n .map((k) => k.trim())\n .filter(Boolean);\n if (keys.length > 0) {\n importConfig.keys = keys;\n }\n }\n manifest.import = importConfig;\n }\n await writeManifest(target, manifest);\n\n const addedGitignore = await ensureRootGitignored(rootDir);\n console.log();\n console.log(`${BAR} ${green('secrets:')} created ${rel(rootDir, target)}`);\n if (addedGitignore) {\n console.log(`${BAR} added ${dim('.root/')} to .gitignore`);\n }\n await warnIfEnvNotIgnored(rootDir);\n console.log(\n `${BAR} ${dim('next: `root secrets set <NAME>` to store a value')}`\n );\n console.log();\n}\n\ninterface SetOptions {\n manifest?: string;\n}\n\nasync function secretsSet(name: string, opts: SetOptions) {\n const rootDir = process.cwd();\n const manifestFilePath = opts.manifest\n ? path.resolve(rootDir, opts.manifest)\n : manifestPath(rootDir);\n\n // The value is only ever read from stdin (a masked prompt on a TTY, or piped\n // input) so it never appears in argv, shell history, or the process list.\n const secretValue = await readSecretValue(name);\n if (!secretValue) {\n throw new Error('no value provided on stdin');\n }\n\n await setSecret({rootDir, manifestFilePath, name, value: secretValue});\n console.log(`${BAR} ${green('secrets:')} set ${name}`);\n console.log(\n `${BAR} ${dim(`commit ${rel(rootDir, manifestFilePath)} to share this change`)}`\n );\n}\n\nasync function secretsRm(name: string, opts: {manifest?: string}) {\n const rootDir = process.cwd();\n const manifestFilePath = opts.manifest\n ? path.resolve(rootDir, opts.manifest)\n : manifestPath(rootDir);\n await removeSecret({rootDir, manifestFilePath, name});\n console.log(`${BAR} ${green('secrets:')} removed ${name}`);\n console.log(\n `${BAR} ${dim(`commit ${rel(rootDir, manifestFilePath)} to share this change`)}`\n );\n}\n\ninterface PushOptions {\n manifest?: string;\n keys?: string;\n yes?: boolean;\n}\n\nasync function secretsPush(opts: PushOptions) {\n const rootDir = process.cwd();\n const manifestFilePath = opts.manifest\n ? path.resolve(rootDir, opts.manifest)\n : manifestPath(rootDir);\n const only = opts.keys\n ? opts.keys\n .split(',')\n .map((k) => k.trim())\n .filter(Boolean)\n : undefined;\n\n // The confirm callback receives names only (never values). Skipped entirely\n // with --yes; on a non-TTY without --yes we refuse rather than hang.\n const confirm = opts.yes\n ? undefined\n : async (names: string[], gsmKey: string) => {\n if (!process.stdin.isTTY) {\n throw new Error(\n 'refusing to import without --yes on a non-interactive shell'\n );\n }\n console.log();\n console.log(\n `${BAR} ${green('secrets:')} push ${names.length} value(s) from .env to \"${gsmKey}\":`\n );\n for (const name of names) {\n console.log(`${BAR} ${name}`);\n }\n return promptYesNo(`${BAR} continue? [y/N] `);\n };\n\n const result = await pushEnvToSecrets({\n rootDir,\n manifestFilePath,\n only,\n confirm,\n });\n printPushResult(result, rootDir, manifestFilePath);\n}\n\nasync function secretsSync() {\n const rootDir = process.cwd();\n const result = await syncSecrets({rootDir, apply: true});\n printSyncSummary(result);\n // syncSecrets never throws for gcloud/network failures (it records them so\n // they retry), so the CLI must translate them into a non-zero exit itself.\n failOnSyncErrors(result);\n}\n\nasync function secretsPull() {\n const rootDir = process.cwd();\n const result = await syncSecrets({rootDir, apply: true, force: true});\n printSyncSummary(result, {pull: true});\n failOnSyncErrors(result);\n}\n\n/** Marks the process as failed when a sync hit any gcloud fetch errors. */\nfunction failOnSyncErrors(result: SyncResult) {\n if (result.errors.length > 0) {\n process.exitCode = 1;\n }\n}\n\nasync function secretsStatus() {\n const rootDir = process.cwd();\n const {resolved, keys} = await getSecretsStatus(rootDir);\n if (!resolved) {\n console.log(\n `${BAR} ${yellow('secrets:')} no ${MANIFEST_FILENAME} here; run \\`root secrets init\\``\n );\n return;\n }\n console.log();\n console.log(\n `${BAR} ${green('secrets:')} ${resolved.site.gsmKey} ${dim(`(${resolved.site.gcpProjectId})`)}`\n );\n if (resolved.shared) {\n console.log(`${BAR} imports ${dim(resolved.shared.gsmKey)}`);\n }\n if (keys.length === 0) {\n console.log(`${BAR} ${dim('no managed keys yet')}`);\n }\n for (const key of keys) {\n console.log(`${BAR} ${formatStatus(key)}`);\n }\n console.log();\n}\n\n/**\n * Runs a blocking secrets sync at the start of `root dev` so managed values are\n * live before the server starts. Never throws and never blocks longer than\n * {@link DEV_SYNC_TIMEOUT_MS}; failures degrade to a notice so dev still starts.\n */\nexport async function syncSecretsOnDev(rootDir: string): Promise<void> {\n if (!(await isSecretsSyncEnabled(rootDir))) {\n return;\n }\n try {\n const result = await withTimeout(\n syncSecrets({rootDir, apply: true}),\n DEV_SYNC_TIMEOUT_MS\n );\n printSyncSummary(result, {dev: true});\n } catch (err: any) {\n console.log();\n console.log(\n `${BAR} ${yellow('secrets:')} sync skipped (${firstLine(err?.message || String(err))})`\n );\n console.log();\n }\n}\n\nfunction formatStatus(key: KeyStatus): string {\n switch (key.kind) {\n case 'in-sync':\n return `${green('\u2713')} ${key.name}`;\n case 'remote-newer':\n return `${yellow('\u2193')} ${key.name} ${dim('(update available \u2014 run `root secrets sync`)')}`;\n case 'locally-edited':\n return `${dim('\u2022')} ${key.name} ${dim('(locally edited)')}`;\n case 'conflict':\n return `${yellow('!')} ${key.name} ${dim('(changed locally & remotely)')}`;\n case 'not-pulled':\n return `${yellow('\u2193')} ${key.name} ${dim('(not pulled yet)')}`;\n default:\n return key.name;\n }\n}\n\nfunction printSyncSummary(\n result: SyncResult,\n opts: {dev?: boolean; pull?: boolean} = {}\n) {\n const notable =\n result.changed.length > 0 ||\n result.removed.length > 0 ||\n result.conflicts.length > 0 ||\n result.overwritten.length > 0 ||\n result.errors.length > 0;\n // During `root dev`, stay quiet unless something noteworthy happened.\n if (opts.dev && !notable) {\n return;\n }\n\n const parts: string[] = [];\n if (result.changed.length) {\n parts.push(green(`${result.changed.length} updated`));\n }\n if (result.removed.length) {\n parts.push(`${result.removed.length} removed`);\n }\n if (result.kept.length) {\n parts.push(dim(`${result.kept.length} local`));\n }\n if (result.conflicts.length) {\n parts.push(yellow(`${result.conflicts.length} conflict`));\n }\n // Surface failures in the headline so a sync that fetched nothing can never\n // masquerade as \"up to date\".\n if (result.errors.length) {\n parts.push(red(`${result.errors.length} error`));\n }\n\n console.log();\n console.log(\n `${BAR} ${green('secrets:')} ${parts.length ? parts.join(', ') : 'up to date'}`\n );\n for (const name of result.changed) {\n console.log(`${BAR} ${green('+')} ${name}`);\n }\n for (const name of result.removed) {\n console.log(`${BAR} ${dim('-')} ${name} ${dim('(removed)')}`);\n }\n for (const name of result.overwritten) {\n console.log(\n `${BAR} ${yellow('!')} ${name} ${dim('(local value replaced)')}`\n );\n }\n for (const name of result.conflicts) {\n console.log(\n `${BAR} ${yellow('!')} ${name} ${dim(\n '(changed locally & remotely; keeping yours \u2014 `root secrets pull` to take remote)'\n )}`\n );\n }\n for (const err of result.errors) {\n console.log(\n `${BAR} ${red('\u00D7')} ${err.gsmKey}: ${firstLine(err.message)}`\n );\n }\n console.log();\n}\n\nfunction printPushResult(\n result: EnvPushResult,\n rootDir: string,\n manifestFilePath: string\n) {\n if (result.aborted) {\n console.log(`${BAR} ${yellow('secrets:')} aborted, nothing written`);\n return;\n }\n console.log();\n if (result.pushed.length === 0) {\n console.log(`${BAR} ${yellow('secrets:')} nothing to push`);\n } else {\n console.log(\n `${BAR} ${green('secrets:')} pushed ${result.pushed.length} value(s) to \"${result.gsmKey}\"`\n );\n for (const name of result.pushed) {\n console.log(`${BAR} ${green('+')} ${name}`);\n }\n }\n for (const skip of result.skipped) {\n console.log(`${BAR} ${dim('-')} ${skip.name} ${dim(`(${skip.reason})`)}`);\n }\n if (result.pushed.length > 0) {\n console.log(\n `${BAR} ${dim(`commit ${rel(rootDir, manifestFilePath)} to share`)}`\n );\n }\n console.log();\n}\n\n/**\n * Ensures `.root/` is git-ignored; returns true if it added the entry. In a\n * monorepo the project may live in a subdirectory, so the entry is written to\n * the `.gitignore` at the enclosing git repository root (falling back to\n * `rootDir` when not inside a git repo). The `.root/` pattern matches the\n * directory at any depth, so it still ignores the project's `.root/` folder.\n */\nasync function ensureRootGitignored(rootDir: string): Promise<boolean> {\n const gitRoot = (await gitToplevel(rootDir)) ?? rootDir;\n const gitignore = path.join(gitRoot, '.gitignore');\n let content = '';\n try {\n content = await fs.promises.readFile(gitignore, 'utf8');\n } catch {\n // No .gitignore yet; we'll create one.\n }\n const lines = content.split(/\\r?\\n/).map((line) => line.trim());\n if (lines.includes('.root/') || lines.includes('.root')) {\n return false;\n }\n const prefix = content && !content.endsWith('\\n') ? '\\n' : '';\n await fs.promises.writeFile(gitignore, `${content}${prefix}.root/\\n`, 'utf8');\n return true;\n}\n\n/** Warns (best-effort) if `.env` is not git-ignored. */\nasync function warnIfEnvNotIgnored(rootDir: string): Promise<void> {\n const ignored = await isPathGitIgnored(rootDir, '.env');\n if (ignored === false) {\n console.log(\n `${BAR} ${yellow('warning:')} ${dim('.env is not git-ignored \u2014 add it to .gitignore')}`\n );\n }\n}\n\n/**\n * Returns the absolute path of the enclosing git repository's top-level\n * directory, or undefined if `rootDir` is not inside a git repo (or git is\n * unavailable).\n */\nfunction gitToplevel(rootDir: string): Promise<string | undefined> {\n return new Promise((resolve) => {\n try {\n const child = spawn('git', ['rev-parse', '--show-toplevel'], {\n cwd: rootDir,\n });\n let stdout = '';\n child.stdout.setEncoding('utf8');\n child.stdout.on('data', (chunk) => {\n stdout += chunk;\n });\n child.on('error', () => resolve(undefined));\n child.on('close', (code) => {\n const toplevel = stdout.trim();\n resolve(code === 0 && toplevel ? toplevel : undefined);\n });\n } catch {\n resolve(undefined);\n }\n });\n}\n\n/** Returns true/false if known, or undefined if git can't answer. */\nfunction isPathGitIgnored(\n rootDir: string,\n relPath: string\n): Promise<boolean | undefined> {\n return new Promise((resolve) => {\n try {\n const child = spawn('git', ['check-ignore', '--quiet', relPath], {\n cwd: rootDir,\n });\n child.on('error', () => resolve(undefined));\n child.on('close', (code) => {\n // 0 = ignored, 1 = not ignored, 128 = not a git repo / other.\n if (code === 0) {\n resolve(true);\n } else if (code === 1) {\n resolve(false);\n } else {\n resolve(undefined);\n }\n });\n } catch {\n resolve(undefined);\n }\n });\n}\n\n/**\n * Reads the secret value from stdin only \u2014 a masked prompt when attached to a\n * TTY, otherwise the piped input \u2014 so the value never reaches argv.\n */\nfunction readSecretValue(name: string): Promise<string> {\n if (process.stdin.isTTY) {\n return promptSecret(`Value for ${name}: `);\n }\n return readStdin().then(stripOneTrailingNewline);\n}\n\n/** Reads all of stdin as a UTF-8 string. */\nfunction readStdin(): Promise<string> {\n return new Promise((resolve, reject) => {\n let data = '';\n process.stdin.setEncoding('utf8');\n process.stdin.on('data', (chunk) => {\n data += chunk;\n });\n process.stdin.on('end', () => resolve(data));\n process.stdin.on('error', reject);\n });\n}\n\n/** Strips a single trailing newline so `echo value | root secrets set` works. */\nfunction stripOneTrailingNewline(value: string): string {\n return value.replace(/\\r?\\n$/, '');\n}\n\n/** Prompts a yes/no question; resolves true only for an affirmative answer. */\nfunction promptYesNo(question: string): Promise<boolean> {\n return new Promise((resolve) => {\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n rl.question(question, (answer) => {\n rl.close();\n const normalized = answer.trim().toLowerCase();\n resolve(normalized === 'y' || normalized === 'yes');\n });\n });\n}\n\n/** Prompts for a secret value, masking the typed characters on a TTY. */\nfunction promptSecret(question: string): Promise<string> {\n return new Promise((resolve) => {\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n terminal: true,\n });\n let muted = false;\n const rlAny = rl as any;\n rlAny._writeToOutput = (chunk: string) => {\n if (!muted) {\n rlAny.output.write(chunk);\n } else if (chunk.includes('\\n') || chunk.includes('\\r')) {\n rlAny.output.write('\\n');\n }\n // Swallow echoed value characters while muted.\n };\n rl.question(question, (answer) => {\n rl.close();\n resolve(answer.trim());\n });\n muted = true;\n });\n}\n\nfunction withTimeout<T>(promise: Promise<T>, ms: number): Promise<T> {\n return new Promise((resolve, reject) => {\n const timer = setTimeout(() => {\n reject(new Error(`timed out after ${ms}ms`));\n }, ms);\n promise.then(\n (value) => {\n clearTimeout(timer);\n resolve(value);\n },\n (err) => {\n clearTimeout(timer);\n reject(err);\n }\n );\n });\n}\n\nfunction rel(rootDir: string, filePath: string): string {\n return path.relative(rootDir, filePath) || path.basename(filePath);\n}\n\nfunction firstLine(text: string): string {\n return String(text).split('\\n')[0];\n}\n\n/** Wraps a command action to print friendly errors and set a failing exit code. */\nfunction action<A extends any[]>(fn: (...args: A) => Promise<void>) {\n return async (...args: A) => {\n try {\n await fn(...args);\n } catch (err: any) {\n console.error(`${red('error:')} ${err?.message || err}`);\n process.exitCode = 1;\n }\n };\n}\n", "import fs from 'node:fs';\nimport path from 'node:path';\n\n/** Filename of the committed, CLI-managed secrets manifest. */\nexport const MANIFEST_FILENAME = '.root.secrets.json';\n\nconst GSM_KEY_RE = /^[A-Za-z0-9_-]{1,255}$/;\nconst ENV_NAME_RE = /^[A-Za-z0-9_]+$/;\n\n/** A single managed secret's metadata (no value is ever stored here). */\nexport interface SecretEntry {\n /** ISO-8601 UTC timestamp of when the value last changed. */\n updatedAt: string;\n /** Email of whoever last changed the value (best-effort). */\n updatedBy?: string;\n}\n\n/** Optional reference to a shared manifest that this site pulls keys from. */\nexport interface ImportConfig {\n /** Path to the shared manifest, relative to this manifest's directory. */\n manifest: string;\n /** Allowlist of names to import; omit or `'*'` to import all shared keys. */\n keys?: string[] | '*';\n}\n\n/** The committed manifest schema. */\nexport interface Manifest {\n version: number;\n gcpProjectId: string;\n gsmKey: string;\n import?: ImportConfig;\n secrets: Record<string, SecretEntry>;\n}\n\n/** A fully-resolved managed key, after following any `import`. */\nexport interface ManagedKey {\n name: string;\n gsmKey: string;\n gcpProjectId: string;\n updatedAt: string;\n}\n\n/** Resolved view of a site manifest plus its imported shared keys. */\nexport interface ResolvedSecrets {\n rootDir: string;\n site: Manifest;\n shared?: Manifest;\n keys: ManagedKey[];\n}\n\n/** Absolute path to a directory's manifest file. */\nexport function manifestPath(dir: string): string {\n return path.join(dir, MANIFEST_FILENAME);\n}\n\n/** Whether a string is a valid env var name for a managed secret. */\nexport function isValidEnvName(name: string): boolean {\n return ENV_NAME_RE.test(name);\n}\n\n/** Reads and validates a manifest, returning null if the file doesn't exist. */\nexport async function readManifest(filePath: string): Promise<Manifest | null> {\n let raw: string;\n try {\n raw = await fs.promises.readFile(filePath, 'utf8');\n } catch (err: any) {\n if (err.code === 'ENOENT') {\n return null;\n }\n throw err;\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n throw new Error(`invalid JSON in ${filePath}`);\n }\n return validateManifest(parsed, filePath);\n}\n\n/**\n * Writes a manifest with stable formatting: `secrets` keys are sorted so that\n * setting/removing values produces minimal, readable git diffs.\n */\nexport async function writeManifest(\n filePath: string,\n manifest: Manifest\n): Promise<void> {\n const sortedSecrets: Record<string, SecretEntry> = {};\n for (const name of Object.keys(manifest.secrets).sort()) {\n sortedSecrets[name] = manifest.secrets[name];\n }\n const ordered: Manifest = {\n version: manifest.version,\n gcpProjectId: manifest.gcpProjectId,\n gsmKey: manifest.gsmKey,\n ...(manifest.import ? {import: manifest.import} : {}),\n secrets: sortedSecrets,\n };\n await fs.promises.mkdir(path.dirname(filePath), {recursive: true});\n await fs.promises.writeFile(\n filePath,\n JSON.stringify(ordered, null, 2) + '\\n',\n 'utf8'\n );\n}\n\n/** Creates an empty manifest header. */\nexport function emptyManifest(gcpProjectId: string, gsmKey: string): Manifest {\n return {version: 1, gcpProjectId, gsmKey, secrets: {}};\n}\n\n/**\n * Resolves the full set of managed keys for a site: the site manifest's own\n * `secrets` plus any keys pulled in via `import` from a shared manifest.\n *\n * Returns null if the site has no manifest. Throws on validation errors:\n * unknown imported keys, a name declared in both the site and the imported\n * subset, or a shared manifest whose `gcpProjectId` differs from the site's.\n */\nexport async function resolveManagedKeys(\n rootDir: string\n): Promise<ResolvedSecrets | null> {\n const sitePath = manifestPath(rootDir);\n const site = await readManifest(sitePath);\n if (!site) {\n return null;\n }\n\n const keys: ManagedKey[] = [];\n const siteNames = new Set<string>();\n for (const [name, entry] of Object.entries(site.secrets)) {\n siteNames.add(name);\n keys.push({\n name,\n gsmKey: site.gsmKey,\n gcpProjectId: site.gcpProjectId,\n updatedAt: entry.updatedAt,\n });\n }\n\n let shared: Manifest | undefined;\n if (site.import) {\n const sharedPath = path.resolve(rootDir, site.import.manifest);\n const loaded = await readManifest(sharedPath);\n if (!loaded) {\n throw new Error(`imported manifest not found: ${sharedPath}`);\n }\n shared = loaded;\n if (shared.gcpProjectId !== site.gcpProjectId) {\n throw new Error(\n `imported manifest ${sharedPath} uses gcpProjectId ` +\n `\"${shared.gcpProjectId}\" but the site uses \"${site.gcpProjectId}\"`\n );\n }\n const requested = resolveImportedNames(site.import, shared, sharedPath);\n for (const name of requested) {\n if (siteNames.has(name)) {\n throw new Error(\n `\"${name}\" is declared in both the site manifest and the imported ` +\n 'shared manifest; remove it from one'\n );\n }\n const entry = shared.secrets[name];\n keys.push({\n name,\n gsmKey: shared.gsmKey,\n gcpProjectId: shared.gcpProjectId,\n updatedAt: entry.updatedAt,\n });\n }\n }\n\n return {rootDir, site, shared, keys};\n}\n\nfunction resolveImportedNames(\n config: ImportConfig,\n shared: Manifest,\n sharedPath: string\n): string[] {\n if (!config.keys || config.keys === '*') {\n return Object.keys(shared.secrets);\n }\n for (const name of config.keys) {\n if (!Object.prototype.hasOwnProperty.call(shared.secrets, name)) {\n throw new Error(`imported key \"${name}\" is not defined in ${sharedPath}`);\n }\n }\n return config.keys;\n}\n\nfunction validateManifest(value: unknown, filePath: string): Manifest {\n if (typeof value !== 'object' || value === null) {\n throw new Error(`invalid manifest ${filePath}: expected an object`);\n }\n const obj = value as Record<string, unknown>;\n if (typeof obj.gcpProjectId !== 'string' || !obj.gcpProjectId) {\n throw new Error(`invalid manifest ${filePath}: missing \"gcpProjectId\"`);\n }\n if (typeof obj.gsmKey !== 'string' || !GSM_KEY_RE.test(obj.gsmKey)) {\n throw new Error(\n `invalid manifest ${filePath}: \"gsmKey\" must match ${GSM_KEY_RE}`\n );\n }\n const secretsValue = obj.secrets ?? {};\n if (typeof secretsValue !== 'object' || secretsValue === null) {\n throw new Error(\n `invalid manifest ${filePath}: \"secrets\" must be an object`\n );\n }\n const secrets: Record<string, SecretEntry> = {};\n for (const [name, entry] of Object.entries(\n secretsValue as Record<string, unknown>\n )) {\n if (!ENV_NAME_RE.test(name)) {\n throw new Error(\n `invalid manifest ${filePath}: secret name \"${name}\" must match ${ENV_NAME_RE}`\n );\n }\n if (typeof entry !== 'object' || entry === null) {\n throw new Error(\n `invalid manifest ${filePath}: secret \"${name}\" must be an object`\n );\n }\n const e = entry as Record<string, unknown>;\n if (typeof e.updatedAt !== 'string' || !e.updatedAt) {\n throw new Error(\n `invalid manifest ${filePath}: secret \"${name}\" missing \"updatedAt\"`\n );\n }\n secrets[name] = {\n updatedAt: e.updatedAt,\n ...(typeof e.updatedBy === 'string' ? {updatedBy: e.updatedBy} : {}),\n };\n }\n\n let importConfig: ImportConfig | undefined;\n if (obj.import !== undefined) {\n if (typeof obj.import !== 'object' || obj.import === null) {\n throw new Error(\n `invalid manifest ${filePath}: \"import\" must be an object`\n );\n }\n const imp = obj.import as Record<string, unknown>;\n if (typeof imp.manifest !== 'string' || !imp.manifest) {\n throw new Error(\n `invalid manifest ${filePath}: \"import.manifest\" must be a path`\n );\n }\n let keys: string[] | '*' | undefined;\n if (imp.keys === '*' || imp.keys === undefined) {\n keys = imp.keys as '*' | undefined;\n } else if (Array.isArray(imp.keys)) {\n keys = imp.keys.map((k) => {\n if (typeof k !== 'string' || !ENV_NAME_RE.test(k)) {\n throw new Error(\n `invalid manifest ${filePath}: \"import.keys\" entries must match ${ENV_NAME_RE}`\n );\n }\n return k;\n });\n } else {\n throw new Error(\n `invalid manifest ${filePath}: \"import.keys\" must be an array or \"*\"`\n );\n }\n importConfig = {manifest: imp.manifest, ...(keys ? {keys} : {})};\n }\n\n return {\n version: typeof obj.version === 'number' ? obj.version : 1,\n gcpProjectId: obj.gcpProjectId,\n gsmKey: obj.gsmKey,\n ...(importConfig ? {import: importConfig} : {}),\n secrets,\n };\n}\n", "import {spawn} from 'node:child_process';\nimport fs from 'node:fs';\nimport path from 'node:path';\n\nimport {fileExists} from '../utils/fsutils.js';\nimport {\n readEnvFile,\n parseEnv,\n upsertEnvVars,\n writeEnvFile,\n} from './env-file.js';\nimport {accessSecretJson, writeSecretJson} from './gcloud.js';\nimport {hashValue, randomSalt} from './hash.js';\nimport {\n isValidEnvName,\n manifestPath,\n ManagedKey,\n readManifest,\n resolveManagedKeys,\n ResolvedSecrets,\n writeManifest,\n} from './manifest.js';\n\n/** Per-machine sync state filename, kept under `<rootDir>/.root/`. */\nexport const STATE_FILENAME = 'secrets-sync.json';\n\ninterface LocalStateEntry {\n /** ISO-8601 UTC timestamp last synced for this key. */\n updatedAt: string;\n /** Salted sha256 of the last value written to `.env`, for edit detection. */\n hash: string;\n}\n\ninterface LocalState {\n /** Random per-file salt so hashes resist rainbow-table reversal. */\n salt: string;\n /** Map of managed env name to its last-synced metadata. */\n secrets: Record<string, LocalStateEntry>;\n}\n\nexport interface SyncOptions {\n rootDir: string;\n /** When false, compute the result without writing `.env` or state. */\n apply: boolean;\n /** When true (pull), overwrite local values regardless of local edits. */\n force?: boolean;\n}\n\nexport interface SyncResult {\n /** Keys whose remote value was written into `.env`. */\n changed: string[];\n /** Keys with a local override that was kept (no remote change). */\n kept: string[];\n /** Keys changed both remotely and locally; local kept, needs `pull`. */\n conflicts: string[];\n /** Keys whose pre-existing local value was replaced on first sync. */\n overwritten: string[];\n /** Keys removed from `.env` because they're no longer managed. */\n removed: string[];\n /** Per-gsmKey fetch failures; affected keys are left for the next run. */\n errors: Array<{gsmKey: string; message: string}>;\n /** Whether any network (gcloud) call was made. */\n ranNetwork: boolean;\n}\n\n/** Absolute path to the per-machine sync state file for a site. */\nexport function localStatePath(rootDir: string): string {\n return path.join(rootDir, '.root', STATE_FILENAME);\n}\n\nfunction envPath(rootDir: string): string {\n return path.join(rootDir, '.env');\n}\n\n// Dedupes concurrent default syncs for the same project (e.g. the dev-startup\n// await racing the registered run). Only the apply-without-force path is memoed.\nconst inFlight = new Map<string, Promise<SyncResult>>();\n\n/**\n * Three-way merges the manifest(s), Google Cloud Secret Manager values, and the\n * local `.env`, writing only managed keys and preserving everything else.\n *\n * For each managed key, \"theirs\" (the manifest `updatedAt`) and the local sync\n * state decide the outcome: take remote, keep a local override, flag a conflict,\n * or remove a no-longer-managed key. GSM is fetched at most once per gsmKey and\n * only when a key in that blob actually changed. Fetch failures are recorded and\n * skipped so they retry; this function never throws for network reasons.\n */\nexport function syncSecrets(options: SyncOptions): Promise<SyncResult> {\n const {rootDir, apply, force = false} = options;\n if (apply && !force) {\n const existing = inFlight.get(rootDir);\n if (existing) {\n return existing;\n }\n const promise = doSync(options).finally(() => inFlight.delete(rootDir));\n inFlight.set(rootDir, promise);\n return promise;\n }\n return doSync(options);\n}\n\ninterface KeyPlan {\n key: ManagedKey;\n synced?: LocalStateEntry;\n envVal?: string;\n remoteChanged: boolean;\n localChanged: boolean;\n}\n\nasync function doSync(options: SyncOptions): Promise<SyncResult> {\n const {rootDir, apply, force = false} = options;\n const result: SyncResult = {\n changed: [],\n kept: [],\n conflicts: [],\n overwritten: [],\n removed: [],\n errors: [],\n ranNetwork: false,\n };\n\n const resolved = await resolveManagedKeys(rootDir);\n if (!resolved) {\n return result;\n }\n\n const envFilePath = envPath(rootDir);\n const content = await readEnvFile(envFilePath);\n const parsed = parseEnv(content);\n const state = await readLocalState(rootDir);\n\n const plans: KeyPlan[] = resolved.keys.map((key) => {\n const synced = state.secrets[key.name];\n const envVal = parsed[key.name];\n const remoteChanged =\n force || !synced || key.updatedAt !== synced.updatedAt;\n const localChanged = synced\n ? hashValue(state.salt, envVal ?? '') !== synced.hash\n : envVal !== undefined;\n return {key, synced, envVal, remoteChanged, localChanged};\n });\n\n // A key needs its remote value fetched only when we intend to write \"theirs\".\n const needsTheirs = (plan: KeyPlan): boolean =>\n force || !plan.synced || (plan.remoteChanged && !plan.localChanged);\n\n // Fetch each required gsmKey blob at most once.\n const blobs = new Map<string, Record<string, string>>();\n const toFetch = new Map<string, string>(); // gsmKey -> project\n for (const plan of plans) {\n if (needsTheirs(plan)) {\n toFetch.set(plan.key.gsmKey, plan.key.gcpProjectId);\n }\n }\n for (const [gsmKey, project] of toFetch) {\n try {\n blobs.set(gsmKey, await accessSecretJson(gsmKey, project));\n result.ranNetwork = true;\n } catch (err: any) {\n result.errors.push({gsmKey, message: err?.message || String(err)});\n }\n }\n\n const updates: Record<string, string> = {};\n const nextState: LocalState = {salt: state.salt, secrets: {...state.secrets}};\n\n for (const plan of plans) {\n const name = plan.key.name;\n if (!needsTheirs(plan)) {\n if (plan.remoteChanged && plan.localChanged) {\n // Both sides moved: keep local, keep flagging until `pull` or a match.\n result.conflicts.push(name);\n } else if (!plan.remoteChanged && plan.localChanged) {\n // Intentional local override; leave it untouched.\n result.kept.push(name);\n }\n continue;\n }\n if (!blobs.has(plan.key.gsmKey)) {\n // Fetch failed; leave state untouched so it retries next run.\n continue;\n }\n const theirs = blobs.get(plan.key.gsmKey)![name];\n if (theirs === undefined) {\n // Declared in the manifest but no value stored yet; nothing to write.\n continue;\n }\n if (!plan.synced && plan.envVal !== undefined && plan.envVal !== theirs) {\n result.overwritten.push(name);\n }\n updates[name] = theirs;\n nextState.secrets[name] = {\n updatedAt: plan.key.updatedAt,\n hash: hashValue(state.salt, theirs),\n };\n result.changed.push(name);\n }\n\n // Keys recorded in state but no longer managed are removed from `.env`.\n const managed = new Set(resolved.keys.map((key) => key.name));\n const removals: string[] = [];\n for (const name of Object.keys(state.secrets)) {\n if (!managed.has(name)) {\n removals.push(name);\n delete nextState.secrets[name];\n result.removed.push(name);\n }\n }\n\n if (apply) {\n if (Object.keys(updates).length > 0 || removals.length > 0) {\n const next = upsertEnvVars(content, updates, removals);\n if (next !== content) {\n await writeEnvFile(envFilePath, next);\n }\n // Make changes live in the current process without a restart.\n for (const [name, value] of Object.entries(updates)) {\n process.env[name] = value;\n }\n for (const name of removals) {\n delete process.env[name];\n }\n }\n await writeLocalState(rootDir, nextState);\n }\n\n return result;\n}\n\nexport interface SetSecretOptions {\n rootDir: string;\n /** Resolved path to the manifest the value belongs to (site or shared). */\n manifestFilePath: string;\n name: string;\n value: string;\n /** Defaults to `git config user.email`. */\n updatedBy?: string;\n}\n\n/**\n * Stores a value in GSM (read-modify-write of the gsmKey's JSON blob), records\n * its name + timestamp in the manifest, and updates the local `.env` and sync\n * state so the value is immediately usable.\n */\nexport async function setSecret(options: SetSecretOptions): Promise<void> {\n const {rootDir, manifestFilePath, name, value} = options;\n if (!isValidEnvName(name)) {\n throw new Error(`invalid secret name \"${name}\" (must match [A-Za-z0-9_]+)`);\n }\n const manifest = await readManifest(manifestFilePath);\n if (!manifest) {\n throw new Error(\n `no manifest at ${manifestFilePath}; run \\`root secrets init\\` first`\n );\n }\n\n const blob = await accessSecretJson(manifest.gsmKey, manifest.gcpProjectId);\n blob[name] = value;\n await writeSecretJson(manifest.gsmKey, manifest.gcpProjectId, blob);\n\n const updatedAt = new Date().toISOString();\n const updatedBy = options.updatedBy ?? (await getGitEmail());\n manifest.secrets[name] = {updatedAt, ...(updatedBy ? {updatedBy} : {})};\n await writeManifest(manifestFilePath, manifest);\n\n const envFilePath = envPath(rootDir);\n const content = await readEnvFile(envFilePath);\n const next = upsertEnvVars(content, {[name]: value});\n if (next !== content) {\n await writeEnvFile(envFilePath, next);\n }\n const state = await readLocalState(rootDir);\n state.secrets[name] = {updatedAt, hash: hashValue(state.salt, value)};\n await writeLocalState(rootDir, state);\n}\n\nexport interface RemoveSecretOptions {\n rootDir: string;\n manifestFilePath: string;\n name: string;\n}\n\n/** Removes a secret from the manifest, its GSM blob, the local `.env`, and state. */\nexport async function removeSecret(\n options: RemoveSecretOptions\n): Promise<void> {\n const {rootDir, manifestFilePath, name} = options;\n const manifest = await readManifest(manifestFilePath);\n if (!manifest) {\n throw new Error(`no manifest at ${manifestFilePath}`);\n }\n\n if (Object.prototype.hasOwnProperty.call(manifest.secrets, name)) {\n delete manifest.secrets[name];\n await writeManifest(manifestFilePath, manifest);\n }\n\n const blob = await accessSecretJson(manifest.gsmKey, manifest.gcpProjectId);\n if (Object.prototype.hasOwnProperty.call(blob, name)) {\n delete blob[name];\n await writeSecretJson(manifest.gsmKey, manifest.gcpProjectId, blob);\n }\n\n const envFilePath = envPath(rootDir);\n const content = await readEnvFile(envFilePath);\n const next = upsertEnvVars(content, {}, [name]);\n if (next !== content) {\n await writeEnvFile(envFilePath, next);\n }\n const state = await readLocalState(rootDir);\n if (state.secrets[name]) {\n delete state.secrets[name];\n await writeLocalState(rootDir, state);\n }\n}\n\nexport interface PushEnvOptions {\n rootDir: string;\n /** Resolved path to the manifest to push into (site or shared). */\n manifestFilePath: string;\n /** Optional allowlist of `.env` keys to push; default pushes all. */\n only?: string[];\n /** Defaults to `git config user.email`. */\n updatedBy?: string;\n /**\n * Called with the candidate NAMES (never values) and target gsmKey before any\n * write. Return false to abort. Omit to push without confirmation.\n */\n confirm?: (names: string[], gsmKey: string) => Promise<boolean>;\n}\n\nexport interface EnvPushResult {\n /** Names written to GSM + the manifest. */\n pushed: string[];\n /** Names skipped, with a reason (not in `.env`, invalid, or shared). */\n skipped: Array<{name: string; reason: string}>;\n /** True if the confirm callback declined. */\n aborted: boolean;\n /** The gsmKey the values were (or would be) written to. */\n gsmKey: string;\n}\n\n/**\n * Pushes the values in the local `.env` up to Secret Manager and records them in\n * the manifest, in a single GSM version write. Existing GSM values for the same\n * keys are overwritten (a \"force push\"). Keys already provided by a shared\n * manifest, invalid names, and (with `only`) names absent from `.env` are\n * skipped. Secret values never leave this function.\n */\nexport async function pushEnvToSecrets(\n options: PushEnvOptions\n): Promise<EnvPushResult> {\n const {rootDir, manifestFilePath, only} = options;\n const manifest = await readManifest(manifestFilePath);\n if (!manifest) {\n throw new Error(\n `no manifest at ${manifestFilePath}; run \\`root secrets init\\` first`\n );\n }\n\n const content = await readEnvFile(envPath(rootDir));\n const parsed = parseEnv(content);\n const skipped: Array<{name: string; reason: string}> = [];\n const sharedNames = await sharedImportedNames(rootDir, manifestFilePath);\n\n const requested = only && only.length > 0 ? only : Object.keys(parsed);\n const candidates: string[] = [];\n for (const name of requested) {\n if (!Object.prototype.hasOwnProperty.call(parsed, name)) {\n skipped.push({name, reason: 'not found in .env'});\n } else if (!isValidEnvName(name)) {\n skipped.push({name, reason: 'invalid name'});\n } else if (sharedNames.has(name)) {\n skipped.push({name, reason: 'provided by shared manifest'});\n } else {\n candidates.push(name);\n }\n }\n\n if (candidates.length === 0) {\n return {pushed: [], skipped, aborted: false, gsmKey: manifest.gsmKey};\n }\n if (\n options.confirm &&\n !(await options.confirm(candidates, manifest.gsmKey))\n ) {\n return {pushed: [], skipped, aborted: true, gsmKey: manifest.gsmKey};\n }\n\n // Single read-modify-write of the gsmKey blob for all pushed values.\n const blob = await accessSecretJson(manifest.gsmKey, manifest.gcpProjectId);\n for (const name of candidates) {\n blob[name] = parsed[name];\n }\n await writeSecretJson(manifest.gsmKey, manifest.gcpProjectId, blob);\n\n const updatedAt = new Date().toISOString();\n const updatedBy = options.updatedBy ?? (await getGitEmail());\n for (const name of candidates) {\n manifest.secrets[name] = {updatedAt, ...(updatedBy ? {updatedBy} : {})};\n }\n await writeManifest(manifestFilePath, manifest);\n\n const state = await readLocalState(rootDir);\n for (const name of candidates) {\n state.secrets[name] = {\n updatedAt,\n hash: hashValue(state.salt, parsed[name]),\n };\n }\n await writeLocalState(rootDir, state);\n\n return {\n pushed: candidates,\n skipped,\n aborted: false,\n gsmKey: manifest.gsmKey,\n };\n}\n\n/**\n * Names a site pulls from a shared manifest \u2014 these can't also be declared in\n * the site manifest, so they're excluded when pushing into it. Returns empty\n * when the target isn't the site manifest, or on any resolution error.\n */\nasync function sharedImportedNames(\n rootDir: string,\n manifestFilePath: string\n): Promise<Set<string>> {\n if (path.resolve(manifestFilePath) !== path.resolve(manifestPath(rootDir))) {\n return new Set();\n }\n try {\n const resolved = await resolveManagedKeys(rootDir);\n if (!resolved || !resolved.shared) {\n return new Set();\n }\n const sharedGsmKey = resolved.shared.gsmKey;\n return new Set(\n resolved.keys\n .filter((key) => key.gsmKey === sharedGsmKey)\n .map((key) => key.name)\n );\n } catch {\n return new Set();\n }\n}\n\nexport type KeyStatusKind =\n | 'in-sync'\n | 'remote-newer'\n | 'locally-edited'\n | 'conflict'\n | 'not-pulled';\n\nexport interface KeyStatus {\n name: string;\n gsmKey: string;\n updatedAt: string;\n kind: KeyStatusKind;\n inEnv: boolean;\n}\n\n/**\n * Computes the sync status of every managed key WITHOUT any network access, by\n * comparing the manifest `updatedAt` and the local `.env` against the recorded\n * sync state. Used by `root secrets status`.\n */\nexport async function getSecretsStatus(\n rootDir: string\n): Promise<{resolved: ResolvedSecrets | null; keys: KeyStatus[]}> {\n const resolved = await resolveManagedKeys(rootDir);\n if (!resolved) {\n return {resolved: null, keys: []};\n }\n const content = await readEnvFile(envPath(rootDir));\n const parsed = parseEnv(content);\n const state = await readLocalState(rootDir);\n const keys: KeyStatus[] = resolved.keys.map((key) => {\n const synced = state.secrets[key.name];\n const envVal = parsed[key.name];\n const remoteChanged = !synced || key.updatedAt !== synced.updatedAt;\n const localChanged = synced\n ? hashValue(state.salt, envVal ?? '') !== synced.hash\n : envVal !== undefined;\n let kind: KeyStatusKind;\n if (!synced) {\n kind = 'not-pulled';\n } else if (remoteChanged && localChanged) {\n kind = 'conflict';\n } else if (remoteChanged) {\n kind = 'remote-newer';\n } else if (localChanged) {\n kind = 'locally-edited';\n } else {\n kind = 'in-sync';\n }\n return {\n name: key.name,\n gsmKey: key.gsmKey,\n updatedAt: key.updatedAt,\n kind,\n inEnv: envVal !== undefined,\n };\n });\n return {resolved, keys};\n}\n\n/** True when a site has a manifest and sync isn't disabled via env var. */\nexport async function isSecretsSyncEnabled(rootDir: string): Promise<boolean> {\n if (isSyncDisabledByEnv()) {\n return false;\n }\n return fileExists(manifestPath(rootDir));\n}\n\nfunction isSyncDisabledByEnv(): boolean {\n const value = (process.env.ROOT_DISABLE_SECRETS_SYNC || '')\n .trim()\n .toLowerCase();\n return value !== '' && value !== '0' && value !== 'false';\n}\n\nasync function readLocalState(rootDir: string): Promise<LocalState> {\n try {\n const raw = await fs.promises.readFile(localStatePath(rootDir), 'utf8');\n const parsed = JSON.parse(raw);\n if (\n parsed &&\n typeof parsed === 'object' &&\n typeof parsed.salt === 'string' &&\n parsed.secrets &&\n typeof parsed.secrets === 'object'\n ) {\n return {\n salt: parsed.salt,\n secrets: parsed.secrets as Record<string, LocalStateEntry>,\n };\n }\n } catch {\n // Missing or corrupt state; start fresh with a new salt.\n }\n return {salt: randomSalt(), secrets: {}};\n}\n\nasync function writeLocalState(\n rootDir: string,\n state: LocalState\n): Promise<void> {\n const file = localStatePath(rootDir);\n await fs.promises.mkdir(path.dirname(file), {recursive: true});\n await fs.promises.writeFile(\n file,\n JSON.stringify(state, null, 2) + '\\n',\n 'utf8'\n );\n}\n\n/** Best-effort `git config user.email`; resolves undefined on any failure. */\nfunction getGitEmail(): Promise<string | undefined> {\n return new Promise((resolve) => {\n try {\n const child = spawn('git', ['config', 'user.email']);\n let out = '';\n child.stdout.on('data', (chunk) => {\n out += chunk.toString();\n });\n child.on('error', () => resolve(undefined));\n child.on('close', (code) => {\n resolve(code === 0 && out.trim() ? out.trim() : undefined);\n });\n child.stdin.end();\n } catch {\n resolve(undefined);\n }\n });\n}\n", "import fs from 'node:fs';\nimport path from 'node:path';\n\nimport dotenv from 'dotenv';\n\n/**\n * Reads a `.env` file, returning an empty string if it doesn't exist. Other\n * read errors propagate.\n */\nexport async function readEnvFile(envPath: string): Promise<string> {\n try {\n return await fs.promises.readFile(envPath, 'utf8');\n } catch (err: any) {\n if (err.code === 'ENOENT') {\n return '';\n }\n throw err;\n }\n}\n\n/**\n * Atomically writes `.env` content via a temp file + rename so a crash mid-write\n * can never leave a partially written `.env`.\n */\nexport async function writeEnvFile(\n envPath: string,\n content: string\n): Promise<void> {\n const dir = path.dirname(envPath);\n await fs.promises.mkdir(dir, {recursive: true});\n const tmp = path.join(dir, `.env.tmp-${process.pid}-${Date.now()}`);\n await fs.promises.writeFile(tmp, content, 'utf8');\n await fs.promises.rename(tmp, envPath);\n}\n\n/**\n * Parses `.env` content into a key/value map using the same parser the CLI uses\n * to load env vars at startup (`dotenv`), so values compared here match what the\n * running process sees.\n */\nexport function parseEnv(content: string): Record<string, string> {\n return dotenv.parse(content);\n}\n\n/**\n * Serializes a value into a `.env`-safe, single-physical-line representation\n * that round-trips through `dotenv.parse`.\n *\n * Prefers single quotes, which dotenv treats as fully literal \u2014 so backslashes,\n * tabs, double-quotes, `#`, `=`, and spaces all survive untouched. Values that\n * contain a single-quote or a newline fall back to double quotes, where dotenv\n * only un-escapes `\\n` and `\\r`; those are escaped (collapsing multi-line values\n * onto one line) and embedded double-quotes are escaped for parse-safety.\n *\n * Known limitation (inherited from dotenv): a value containing BOTH a single and\n * a double quote, or a literal backslash adjacent to `n`/`r`, may not round-trip\n * exactly. Such values are vanishingly rare for secrets.\n */\nexport function serializeEnvValue(value: string): string {\n if (!value.includes(\"'\") && !value.includes('\\n') && !value.includes('\\r')) {\n return `'${value}'`;\n }\n const escaped = value\n .replace(/\\n/g, '\\\\n')\n .replace(/\\r/g, '\\\\r')\n .replace(/\"/g, '\\\\\"');\n return `\"${escaped}\"`;\n}\n\n/**\n * Upserts and/or removes the given keys in `.env` content, preserving every\n * other line (comments, blank lines, unmanaged vars) and the file's dominant\n * EOL.\n *\n * - Keys in `updates` replace an existing assignment in place (first occurrence;\n * later duplicates of the same key are dropped) or are appended if absent.\n * - Keys in `removals` are deleted.\n *\n * All managed values are written as single physical lines (see\n * `serializeEnvValue`), so a simple per-line scan is sufficient and safe.\n */\nexport function upsertEnvVars(\n content: string,\n updates: Record<string, string>,\n removals: string[] = []\n): string {\n const eol = detectEol(content);\n const removeSet = new Set(removals);\n const written = new Set<string>();\n const lines = content.length ? content.split(/\\r?\\n/) : [];\n // A trailing newline yields a phantom empty final element; drop it so appended\n // keys don't land after a blank line.\n if (\n lines.length > 0 &&\n lines[lines.length - 1] === '' &&\n /\\r?\\n$/.test(content)\n ) {\n lines.pop();\n }\n const out: string[] = [];\n\n for (const line of lines) {\n const key = parseAssignmentKey(line);\n if (key && removeSet.has(key)) {\n continue;\n }\n if (key && Object.prototype.hasOwnProperty.call(updates, key)) {\n if (!written.has(key)) {\n out.push(`${key}=${serializeEnvValue(updates[key])}`);\n written.add(key);\n }\n continue;\n }\n out.push(line);\n }\n\n for (const key of Object.keys(updates)) {\n if (!written.has(key)) {\n out.push(`${key}=${serializeEnvValue(updates[key])}`);\n written.add(key);\n }\n }\n\n // Drop trailing blank lines, then terminate with a single EOL.\n while (out.length > 0 && out[out.length - 1].trim() === '') {\n out.pop();\n }\n if (out.length === 0) {\n return '';\n }\n return out.join(eol) + eol;\n}\n\n/** Extracts the variable name from an assignment line, or null if not one. */\nfunction parseAssignmentKey(line: string): string | null {\n const match = line.match(/^\\s*(?:export\\s+)?([\\w.-]+)\\s*=/);\n return match ? match[1] : null;\n}\n\n/** Returns the dominant line ending of existing content (`\\r\\n` vs `\\n`). */\nfunction detectEol(content: string): string {\n const crlf = (content.match(/\\r\\n/g) || []).length;\n const lf = (content.match(/\\n/g) || []).length - crlf;\n return crlf > lf ? '\\r\\n' : '\\n';\n}\n", "import {spawn} from 'node:child_process';\n\nexport type GcloudErrorCode =\n | 'ENOENT'\n | 'NOT_FOUND'\n | 'ALREADY_EXISTS'\n | 'PERMISSION_DENIED'\n | 'UNAUTHENTICATED'\n | 'UNKNOWN';\n\n/** Error thrown when a `gcloud` invocation fails, with a classified code. */\nexport class GcloudError extends Error {\n code: GcloudErrorCode;\n stderr: string;\n\n constructor(code: GcloudErrorCode, message: string, stderr = '') {\n super(message);\n this.name = 'GcloudError';\n this.code = code;\n this.stderr = stderr;\n }\n}\n\n/**\n * Spawns `gcloud` with the given args (no shell \u2014 args are passed as an array,\n * so secret names and project ids can never be interpreted by a shell). Any\n * `input` is written to stdin (used to pass secret payloads, never argv).\n * Resolves with stdout; rejects with a {@link GcloudError} on failure.\n */\nexport function runGcloud(\n args: string[],\n options: {input?: string} = {}\n): Promise<string> {\n return new Promise((resolve, reject) => {\n const child = spawn('gcloud', args, {\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n let stdout = '';\n let stderr = '';\n child.stdout.on('data', (chunk) => {\n stdout += chunk.toString();\n });\n child.stderr.on('data', (chunk) => {\n stderr += chunk.toString();\n });\n child.on('error', (err: any) => {\n if (err.code === 'ENOENT') {\n reject(\n new GcloudError(\n 'ENOENT',\n 'The Google Cloud CLI (gcloud) was not found. Install it: ' +\n 'https://cloud.google.com/sdk/docs/install'\n )\n );\n return;\n }\n reject(err);\n });\n child.on('close', (code) => {\n if (code === 0) {\n resolve(stdout);\n return;\n }\n reject(classifyError(stderr));\n });\n if (options.input !== undefined) {\n child.stdin.end(options.input);\n } else {\n child.stdin.end();\n }\n });\n}\n\n/**\n * Reads the latest version of a GSM secret and parses it as a JSON object of\n * `{ENV_NAME: value}`. A missing secret (`NOT_FOUND`) or empty payload resolves\n * to `{}` so callers can treat \"never created\" the same as \"empty\".\n */\nexport async function accessSecretJson(\n gsmKey: string,\n project: string\n): Promise<Record<string, string>> {\n let stdout: string;\n try {\n stdout = await runGcloud([\n 'secrets',\n 'versions',\n 'access',\n 'latest',\n '--secret',\n gsmKey,\n '--project',\n project,\n ]);\n } catch (err) {\n if (err instanceof GcloudError && err.code === 'NOT_FOUND') {\n return {};\n }\n throw err;\n }\n const trimmed = stdout.trim();\n if (!trimmed) {\n return {};\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(trimmed);\n } catch {\n throw new Error(\n `secret \"${gsmKey}\" does not contain valid JSON (expected an object of ` +\n 'env-name to value)'\n );\n }\n if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {\n throw new Error(`secret \"${gsmKey}\" must be a JSON object`);\n }\n return parsed as Record<string, string>;\n}\n\n/**\n * Writes a JSON `{ENV_NAME: value}` object as a new version of a GSM secret,\n * creating the secret first if it doesn't yet exist. The payload is passed via\n * stdin, never as a command-line argument.\n */\nexport async function writeSecretJson(\n gsmKey: string,\n project: string,\n data: Record<string, string>\n): Promise<void> {\n await ensureSecret(gsmKey, project);\n await runGcloud(\n [\n 'secrets',\n 'versions',\n 'add',\n gsmKey,\n '--project',\n project,\n '--data-file=-',\n ],\n {input: JSON.stringify(data, null, 2)}\n );\n}\n\n/** Creates a GSM secret, tolerating the case where it already exists. */\nasync function ensureSecret(gsmKey: string, project: string): Promise<void> {\n try {\n await runGcloud([\n 'secrets',\n 'create',\n gsmKey,\n '--project',\n project,\n '--replication-policy',\n 'automatic',\n '--labels',\n 'managed-by=root',\n ]);\n } catch (err) {\n if (\n err instanceof GcloudError &&\n (err.code === 'ALREADY_EXISTS' || /already exists/i.test(err.stderr))\n ) {\n return;\n }\n throw err;\n }\n}\n\n/** Maps gcloud stderr to a classified, user-actionable error. */\nfunction classifyError(stderr: string): GcloudError {\n const text = stderr.trim();\n if (/NOT_FOUND|was not found|does not exist/i.test(text)) {\n return new GcloudError('NOT_FOUND', text || 'not found', stderr);\n }\n if (/ALREADY_EXISTS|already exists/i.test(text)) {\n return new GcloudError('ALREADY_EXISTS', text || 'already exists', stderr);\n }\n if (/PERMISSION_DENIED|permission|forbidden|403/i.test(text)) {\n return new GcloudError(\n 'PERMISSION_DENIED',\n 'Permission denied by Google Cloud. Ensure your account has the right ' +\n 'IAM roles (roles/secretmanager.admin to write, ' +\n 'roles/secretmanager.secretAccessor to read).\\n' +\n text,\n stderr\n );\n }\n if (/UNAUTHENTICATED|not authenticated|reauth|login/i.test(text)) {\n return new GcloudError(\n 'UNAUTHENTICATED',\n 'Not authenticated with Google Cloud. Run `gcloud auth login`.\\n' + text,\n stderr\n );\n }\n return new GcloudError('UNKNOWN', text || 'gcloud command failed', stderr);\n}\n", "import crypto from 'node:crypto';\n\n/**\n * Returns a random salt (hex), generated once per local sync-state file. Storing\n * a salt makes {@link hashValue} digests non-precomputable, so a leaked state\n * file can't be reversed against a rainbow table of bare sha256 hashes.\n */\nexport function randomSalt(): string {\n return crypto.randomBytes(16).toString('hex');\n}\n\n/**\n * Returns the salted sha256 (hex) of a value. Used to detect local edits to a\n * managed `.env` value without storing the plaintext in the sync state.\n */\nexport function hashValue(salt: string, value: string): string {\n return crypto\n .createHash('sha256')\n .update(salt)\n .update('\\0')\n .update(value, 'utf8')\n .digest('hex');\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 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 {compressionMiddleware} from '../middleware/compression.js';\nimport {hooksMiddleware} from '../middleware/hooks.js';\nimport {\n headersMiddleware,\n rootProjectMiddleware,\n securityHeadersMiddleware,\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(compressionMiddleware());\n\n // Inject request context vars.\n server.use(rootProjectMiddleware({rootConfig}));\n // Set security-related HTTP headers (e.g. HSTS) on all responses. The\n // renderer re-sets these on rendered HTML responses (along with the\n // per-request CSP nonce).\n server.use(securityHeadersMiddleware({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 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 {compressionMiddleware} from '../middleware/compression.js';\nimport {hooksMiddleware} from '../middleware/hooks.js';\nimport {\n headersMiddleware,\n rootProjectMiddleware,\n securityHeadersMiddleware,\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(compressionMiddleware());\n\n // Inject request context vars.\n server.use(rootProjectMiddleware({rootConfig}));\n // Set security-related HTTP headers (e.g. HSTS) on all responses. The\n // renderer re-sets these on rendered HTML responses (along with the\n // per-request CSP nonce).\n server.use(securityHeadersMiddleware({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", "fileURLToPath", "dim", "cyan", "dim", "__dirname", "path", "fileURLToPath", "dim", "importedCss", "fileSize", "cyan", "path", "fileURLToPath", "glob", "__dirname", "path", "fileURLToPath", "glob", "fs", "path", "path", "fs", "build", "path", "fileURLToPath", "dim", "glob", "path", "path", "spawn", "fs", "path", "dim", "green", "fs", "path", "spawn", "fs", "path", "fs", "path", "envPath", "crypto", "path", "fs", "spawn", "dim", "path", "green", "fs", "spawn", "os", "path", "dim", "green", "yellow", "path", "os", "__dirname", "path", "fileURLToPath", "start", "dim", "glob", "fs", "path", "cookieParser", "express", "dim", "sirv", "path", "dim", "express", "cookieParser", "sirv", "manifestPath", "path", "cookieParser", "express", "dim", "sirv", "path", "dim", "express", "cookieParser", "sirv", "manifestPath"]
|
|
7
|
+
}
|