@blinkk/root 3.0.1-alpha.1 → 3.0.1-beta.2
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.
|
@@ -1326,6 +1326,9 @@ function getSessionCookieSecret(rootConfig, rootDir) {
|
|
|
1326
1326
|
|
|
1327
1327
|
// src/cli/dev.ts
|
|
1328
1328
|
var __dirname3 = path7.dirname(fileURLToPath3(import.meta.url));
|
|
1329
|
+
var DEV_SERVER_404_LOG_IGNORE_PATHS = /* @__PURE__ */ new Set([
|
|
1330
|
+
"/.well-known/appspecific/com.chrome.devtools.json"
|
|
1331
|
+
]);
|
|
1329
1332
|
async function dev(rootProjectDir, options) {
|
|
1330
1333
|
process.env.NODE_ENV = "development";
|
|
1331
1334
|
const rootDir = path7.resolve(rootProjectDir || process.cwd());
|
|
@@ -1536,7 +1539,9 @@ function rootDevServerMiddleware() {
|
|
|
1536
1539
|
}
|
|
1537
1540
|
function rootDevServer404Middleware() {
|
|
1538
1541
|
return async (req, res) => {
|
|
1539
|
-
|
|
1542
|
+
if (!DEV_SERVER_404_LOG_IGNORE_PATHS.has(req.path)) {
|
|
1543
|
+
console.error(`\u2753 404 ${req.originalUrl}`);
|
|
1544
|
+
}
|
|
1540
1545
|
if (req.renderer) {
|
|
1541
1546
|
const url = req.path;
|
|
1542
1547
|
const ext = path7.extname(url);
|
|
@@ -2132,4 +2137,4 @@ export {
|
|
|
2132
2137
|
createProdServer,
|
|
2133
2138
|
CliRunner
|
|
2134
2139
|
};
|
|
2135
|
-
//# sourceMappingURL=chunk-
|
|
2140
|
+
//# sourceMappingURL=chunk-GSR74KEI.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli/cli.ts","../src/cli/build.ts","../src/node/element-graph.ts","../src/render/asset-map/build-asset-map.ts","../src/utils/batch.ts","../src/cli/codegen.ts","../src/cli/create-package.ts","../src/cli/dev.ts","../src/middleware/hooks.ts","../src/middleware/redirects.ts","../src/render/asset-map/dev-asset-map.ts","../src/utils/ports.ts","../src/utils/rand.ts","../src/cli/gae-deploy.ts","../src/cli/preview.ts","../src/cli/start.ts"],"sourcesContent":["import {Command, InvalidArgumentError} from 'commander';\nimport {bgGreen, black} from 'kleur/colors';\nimport {build, BuildOptions} from './build.js';\nimport {codegen} from './codegen.js';\nimport {createPackage} from './create-package.js';\nimport {dev, createDevServer} from './dev.js';\nimport {gaeDeploy} from './gae-deploy.js';\nimport {preview, createPreviewServer} from './preview.js';\nimport {start, createProdServer} from './start.js';\n\nclass CliRunner {\n private name: string;\n private version: string;\n\n constructor(name: string, version: string) {\n this.name = name;\n this.version = version;\n }\n\n async run(argv: string[]) {\n const program = new Command('root');\n program.version(this.version);\n program.option('-q, --quiet', 'quiet');\n program.hook('preAction', (cmd) => {\n if (!cmd.opts().quiet) {\n console.log(\n `🥕 ${bgGreen(black(` ${this.name} `))} v${this.version}\\n`\n );\n }\n });\n program\n .command('build [path]')\n .description('generates a static build')\n .option('--ssr-only', 'produce a ssr-only build')\n .option(\n '--mode <mode>',\n 'see: https://vitejs.dev/guide/env-and-mode.html#modes',\n 'production'\n )\n .option(\n '-c, --concurrency <num>',\n 'number of files to build concurrently',\n '10'\n )\n .option(\n '--filter <urlPathRegex>',\n 'builds the url paths that match the given regex, e.g. \"/products/.*\"',\n ''\n )\n .action(build);\n program\n .command('codegen [type] [name]')\n .description('generates boilerplate code')\n .option('--out <outdir>', 'output dir')\n .action(codegen);\n program\n .command('create-package [path]')\n .alias('package')\n .description(\n 'creates a standalone npm package for deployment to various hosting services'\n )\n .option('--target <target>', 'hosting target, i.e. appengine or firebase')\n .option('--out <outdir>', 'output dir')\n .option('--mode <mode>', 'deployment mode, i.e. production or preview')\n .option(\n '--app-yaml <path>',\n 'for appengine targets, path to app.yaml (defaults to \"app.yaml\")'\n )\n .action((rootPackageDir, options) => {\n options.version = this.version;\n createPackage(rootPackageDir, options);\n });\n program\n .command('dev [path]')\n .description('starts the server in development mode')\n .option(\n '--host <host>',\n 'network address the server should listen on, e.g. 127.0.0.1'\n )\n .action(dev);\n program\n .command('gae-deploy <appdir>')\n .description(\n 'appengine deploy utility that can optionally run healthchecks before diverting traffic to the new version and clean up old versions'\n )\n .option('--project <project>', 'GCP project id')\n .option('--prefix <prefix>', 'prefix to append the version')\n .option(\n '--promote',\n 'whether to promote the version (if healthchecks pass)'\n )\n .option(\n '--healthcheck-url <url>',\n 'healthcheck url path (e.g. \"/healthcheck\") which should return a 200 status with the text \"OK\"'\n )\n .option(\n '--max-versions <num>',\n 'the max number of versions to keep',\n numberFlag\n )\n .action(gaeDeploy);\n program\n .command('preview [path]')\n .description('starts the server in preview mode')\n .option(\n '--host <host>',\n 'network address the server should listen on, e.g. 127.0.0.1'\n )\n .action(preview);\n program\n .command('start [path]')\n .description('starts the server in production mode')\n .option(\n '--host <host>',\n 'network address the server should listen on, e.g. 127.0.0.1'\n )\n .action(start);\n await program.parseAsync(argv);\n }\n}\n\nfunction numberFlag(value: string) {\n const num = parseInt(value);\n if (isNaN(num)) {\n throw new InvalidArgumentError(`not a number: ${value}`);\n }\n return num;\n}\n\nexport {\n CliRunner,\n build,\n BuildOptions,\n createPackage,\n dev,\n createDevServer,\n preview,\n createPreviewServer,\n start,\n createProdServer,\n};\n","/* eslint-disable no-control-regex */\nimport path from 'node:path';\nimport {fileURLToPath} from 'node:url';\n\nimport fsExtra from 'fs-extra';\nimport {dim, cyan} from 'kleur/colors';\nimport glob from 'tiny-glob';\nimport {build as viteBuild, Manifest, ManifestChunk, UserConfig} from 'vite';\n\nimport {getVitePlugins} from '../core/plugin.js';\nimport {Route, Sitemap} from '../core/types.js';\nimport {getElements} from '../node/element-graph.js';\nimport {bundleRootConfig, loadRootConfig} from '../node/load-config.js';\nimport {collectPods} from '../node/pod-collector.js';\nimport {rootPodsVitePlugin} from '../node/pods-vite-plugin.js';\nimport {preactToRootJsxPlugin} from '../node/vite-plugin-root-jsx-virtual.js';\nimport {BuildAssetMap} from '../render/asset-map/build-asset-map.js';\nimport {htmlMinify} from '../render/html-minify.js';\nimport {htmlPretty} from '../render/html-pretty.js';\nimport {batchAsyncCalls} from '../utils/batch.js';\nimport {\n copyGlob,\n fileExists,\n isDirectory,\n isJsFile,\n loadJson,\n makeDir,\n rmDir,\n writeFile,\n} from '../utils/fsutils.js';\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\n\ntype RenderModule = typeof import('../render/render.js');\n\nexport interface BuildOptions {\n ssrOnly?: boolean;\n mode?: string;\n concurrency?: string | number;\n filter?: string;\n}\n\nexport async function build(rootProjectDir?: string, options?: BuildOptions) {\n const mode = options?.mode || 'production';\n process.env.NODE_ENV = mode;\n\n const rootDir = path.resolve(rootProjectDir || process.cwd());\n const rootConfig = await loadRootConfig(rootDir, {command: 'build'});\n const distDir = path.join(rootDir, 'dist');\n const ssrOnly = options?.ssrOnly || false;\n\n console.log();\n console.log(`${dim('┃')} project: ${rootDir}`);\n console.log(`${dim('┃')} output: ${distDir}/html`);\n console.log(`${dim('┃')} mode: ${mode}`);\n console.log();\n\n await rmDir(distDir);\n await makeDir(distDir);\n\n const pods = await collectPods(rootConfig);\n\n const routeFiles: string[] = [];\n if (await isDirectory(path.join(rootDir, 'routes'))) {\n const pageFiles = await glob('routes/**/*', {cwd: rootDir});\n pageFiles.forEach((file) => {\n const parts = path.parse(file);\n if (!parts.name.startsWith('_') && isJsFile(parts.base)) {\n routeFiles.push(path.resolve(rootDir, file));\n }\n });\n }\n // Add pod route files for the CSS extraction pass.\n for (const pod of pods) {\n for (const route of pod.routeFiles) {\n routeFiles.push(route.filePath);\n }\n }\n\n const elementGraph = await getElements(rootConfig, pods);\n const elements = Object.values(elementGraph.sourceFiles).map((sourceFile) => {\n return sourceFile.filePath;\n });\n\n const bundleScripts: string[] = [];\n if (await isDirectory(path.join(rootDir, 'bundles'))) {\n const bundleFiles = await glob('bundles/*', {cwd: rootDir});\n bundleFiles.forEach((file) => {\n const parts = path.parse(file);\n if (isJsFile(parts.base)) {\n bundleScripts.push(path.resolve(rootDir, file));\n }\n });\n }\n // Add pod bundle files.\n for (const pod of pods) {\n for (const bundleFile of pod.bundleFiles) {\n bundleScripts.push(bundleFile);\n }\n }\n\n const rootPlugins = rootConfig.plugins || [];\n const viteConfig = rootConfig.vite || {};\n\n for (const plugin of rootPlugins) {\n if (plugin.hooks?.preBuild) {\n await plugin.hooks.preBuild(rootConfig);\n }\n }\n\n const vitePlugins = [\n preactToRootJsxPlugin({useRootJsx: !!rootConfig.jsxRenderer?.mode}),\n rootPodsVitePlugin(rootConfig),\n ...(viteConfig.plugins || []),\n ...getVitePlugins(rootPlugins),\n ];\n\n const baseConfig: UserConfig = {\n ...viteConfig,\n root: rootDir,\n mode: mode,\n plugins: vitePlugins,\n };\n\n // Bundle the render.js file with vite along with any plugins `ssrInput()`\n // config values. These inputs are bundled through vite and support things\n // like `input.meta.glob()`.\n const ssrInput = {\n render: path.resolve(__dirname, './render.js'),\n };\n rootPlugins.forEach((plugin) => {\n if (plugin.ssrInput) {\n Object.assign(ssrInput, plugin.ssrInput());\n }\n });\n const noExternalConfig = viteConfig.ssr?.noExternal;\n const noExternal: Array<string | RegExp> = [];\n if (noExternalConfig) {\n if (Array.isArray(noExternalConfig)) {\n noExternal.push(...noExternalConfig);\n } else {\n noExternal.push(noExternalConfig as string | RegExp);\n }\n }\n await viteBuild({\n ...baseConfig,\n publicDir: false,\n build: {\n ...viteConfig?.build,\n rolldownOptions: {\n ...viteConfig?.build?.rolldownOptions,\n input: ssrInput,\n output: {\n format: 'esm',\n chunkFileNames: 'chunks/[hash].min.js',\n assetFileNames: 'assets/[hash][extname]',\n sanitizeFileName: sanitizeFileName,\n },\n },\n outDir: path.join(distDir, 'server'),\n ssr: true,\n ssrManifest: false,\n cssCodeSplit: true,\n target: 'esnext',\n minify: false,\n modulePreload: {polyfill: false},\n reportCompressedSize: false,\n sourcemap: 'inline',\n },\n ssr: {\n ...viteConfig.ssr,\n target: 'node',\n noExternal: ['@blinkk/root', /^virtual:/, ...noExternal],\n },\n });\n\n // Pre-render CSS deps from /routes/.\n await viteBuild({\n ...baseConfig,\n publicDir: false,\n build: {\n ...viteConfig?.build,\n rolldownOptions: {\n ...viteConfig?.build?.rolldownOptions,\n input: [...routeFiles],\n output: {\n format: 'esm',\n entryFileNames: 'assets/[hash].min.js',\n assetFileNames: 'assets/[hash][extname]',\n chunkFileNames: 'chunks/[hash].min.js',\n sanitizeFileName: sanitizeFileName,\n ...viteConfig?.build?.rolldownOptions?.output,\n },\n },\n outDir: path.join(distDir, '.build/routes'),\n ssr: true,\n ssrManifest: false,\n ssrEmitAssets: true,\n manifest: true,\n cssCodeSplit: true,\n target: 'esnext',\n minify: true,\n modulePreload: {polyfill: false},\n reportCompressedSize: false,\n },\n });\n\n // Pre-render /elements/ and /bundles/.\n const clientInput = [...elements, ...bundleScripts];\n if (clientInput.length > 0) {\n await viteBuild({\n ...baseConfig,\n publicDir: false,\n build: {\n ...viteConfig?.build,\n rolldownOptions: {\n ...viteConfig?.build?.rolldownOptions,\n input: [...elements, ...bundleScripts],\n output: {\n format: 'esm',\n entryFileNames: 'assets/[hash].min.js',\n assetFileNames: 'assets/[hash][extname]',\n chunkFileNames: 'chunks/[hash].min.js',\n sanitizeFileName: sanitizeFileName,\n ...viteConfig?.build?.rolldownOptions?.output,\n },\n },\n outDir: path.join(distDir, '.build/client'),\n ssr: false,\n ssrManifest: false,\n manifest: true,\n cssCodeSplit: true,\n target: 'esnext',\n minify: true,\n modulePreload: {polyfill: false},\n reportCompressedSize: false,\n },\n });\n } else {\n await writeFile(\n path.join(distDir, '.build/client/.vite/manifest.json'),\n '{}'\n );\n }\n\n // Bundle the root.config.ts file to dist/root.config.js.\n await bundleRootConfig(rootDir, path.join(distDir, 'root.config.js'));\n\n // Copy CSS files from `dist/.build/routes/**/*.css` to\n // `dist/.build/client/` and flatten the routes manifest to ignore any\n // imported modules. Then add the route assets to the client manifest.\n await copyGlob(\n '**/*.css',\n path.join(distDir, '.build/routes'),\n path.join(distDir, '.build/client')\n );\n const routesManifest = await loadJson<Manifest>(\n path.join(distDir, '.build/routes/.vite/manifest.json')\n );\n const clientManifest = await loadJson<Manifest>(\n path.join(distDir, '.build/client/.vite/manifest.json')\n );\n function collectRouteCss(\n asset: ManifestChunk,\n cssDeps: Set<string>,\n visited: Set<string>\n ) {\n if (!asset || !asset.file || visited.has(asset.file)) {\n return;\n }\n visited.add(asset.file);\n if (asset.css) {\n asset.css.forEach((dep) => cssDeps.add(dep));\n }\n if (asset.imports) {\n asset.imports.forEach((manifestKey) => {\n collectRouteCss(routesManifest[manifestKey], cssDeps, visited);\n });\n }\n }\n Object.keys(routesManifest).forEach((manifestKey) => {\n const asset = routesManifest[manifestKey];\n if (asset.isEntry) {\n const visited = new Set<string>();\n const cssDeps = new Set<string>();\n collectRouteCss(asset, cssDeps, visited);\n asset.css = Array.from(cssDeps);\n asset.imports = [];\n clientManifest[manifestKey] = asset;\n } else if (asset.file.endsWith('.css')) {\n clientManifest[manifestKey] = asset;\n }\n });\n\n // Use the output of the client build to generate an asset map, which is used\n // by the renderer for automatically injecting dependencies for a page.\n const assetMap = BuildAssetMap.fromViteManifest(\n rootConfig,\n clientManifest,\n elementGraph\n );\n\n // Save the root's asset map to `dist/.root/manifest.json` for use by the prod\n // SSR server.\n const rootManifest = assetMap.toJson();\n await writeFile(\n path.join(distDir, '.root/manifest.json'),\n JSON.stringify(rootManifest, null, 2)\n );\n\n // Save the element graph to `dist/.root/elements.json` for use by the prod\n // SSR server.\n const elementGraphJson = elementGraph.toJson();\n await writeFile(\n path.join(distDir, '.root/elements.json'),\n JSON.stringify(elementGraphJson, null, 2)\n );\n\n // Write SSG output to `dist/html`.\n const buildDir = path.join(distDir, 'html');\n\n // Recursively copy files from `public` to `dist/html`.\n const publicDir = path.join(rootDir, 'public');\n if (fsExtra.existsSync(path.join(rootDir, 'public'))) {\n fsExtra.copySync(publicDir, buildDir, {dereference: true});\n } else {\n await makeDir(buildDir);\n }\n\n const seenAssets = new Set<string>();\n async function copyAssetToDistHtml(assetUrl: string) {\n if (seenAssets.has(assetUrl)) {\n return;\n }\n seenAssets.add(assetUrl);\n const assetRelPath = assetUrl.slice(1);\n const assetFrom = path.join(distDir, '.build/client', assetRelPath);\n const assetTo = path.join(buildDir, assetRelPath);\n // Ignore assets that don't exist. This is because build artifacts from\n // the routes/ folder are not copied to dist/client (only css deps are).\n if (!(await fileExists(assetFrom))) {\n console.log(`${assetFrom} does not exist`);\n return;\n }\n await fsExtra.copy(assetFrom, assetTo);\n printFileOutput(fileSize(assetTo), 'dist/html/', assetRelPath);\n }\n\n // Copy files from `dist/client/{assets,chunks}` to `dist/html` using the\n // root manifest. Ignore route files.\n console.log('\\njs/css output:');\n await Promise.all(\n Object.keys(rootManifest).map(async (src) => {\n const assetData = rootManifest[src];\n // Only imported css from routes files should be included in build output.\n // Don't expose route files in the final output. If any client-side code\n // relies on route dependencies, it should probably be broken out into a\n // shared component instead.\n if (isRouteFile(src)) {\n const importedCss = assetData.importedCss || [];\n for (const cssAssetUrl of importedCss) {\n await copyAssetToDistHtml(cssAssetUrl);\n }\n return;\n }\n\n // Ignore files with no assetUrl, which can sometimes occur if a source\n // file is empty.\n if (!assetData.assetUrl) {\n return;\n }\n\n // Copy assets and any imported css files.\n await copyAssetToDistHtml(assetData.assetUrl);\n const importedCss = assetData.importedCss || [];\n for (const cssAssetUrl of importedCss) {\n await copyAssetToDistHtml(cssAssetUrl);\n }\n })\n );\n\n // Pre-render HTML pages (SSG).\n if (!ssrOnly) {\n const render: RenderModule = await import(\n path.join(distDir, 'server/render.js')\n );\n const renderer = new render.Renderer(rootConfig, {assetMap, elementGraph});\n let sitemap = await renderer.getSitemap();\n\n // If the `--filter` flag is passed, build only the paths that match the\n // given regex.\n if (options?.filter) {\n const filterRegex = new RegExp(`^${options.filter}`);\n const filteredSitemap: Sitemap = {};\n Object.entries(sitemap).forEach(([urlPath, sitemapItem]) => {\n if (urlPath.match(filterRegex)) {\n filteredSitemap[urlPath] = sitemapItem;\n }\n });\n sitemap = filteredSitemap;\n }\n\n const sitemapXmlItems: Array<{\n url: string;\n locale: string;\n alts: Array<{locale: string; hreflang: string; url: string}>;\n }> = [];\n if (rootConfig.sitemap && !rootConfig.domain) {\n throw new Error(\n 'missing \"domain\" in root.config.ts, required when using {sitemap: true}'\n );\n }\n const domain = rootConfig.domain!;\n\n console.log('\\nhtml output:');\n const batchSize = Number(options?.concurrency || 10);\n\n await batchAsyncCalls(\n Object.entries(sitemap),\n batchSize,\n async ([urlPath, sitemapItem]) => {\n // If \"excludeDefaultLocaleFromIntlPaths\" is true, ignore /intl/en/... in\n // the SSG build and exclude it from sitemap.xml.\n if (rootConfig.build?.excludeDefaultLocaleFromIntlPaths) {\n const defaultLocale = rootConfig.i18n?.defaultLocale || 'en';\n if (sitemapItem.locale === defaultLocale) {\n return;\n }\n }\n\n try {\n const routeModule = sitemapItem.route.module;\n if (routeModule.getStaticContent) {\n let props: any;\n if (routeModule.getStaticProps) {\n props = await routeModule.getStaticProps({\n rootConfig,\n params: sitemapItem.params,\n });\n if (props?.notFound) {\n return;\n }\n } else {\n props = {rootConfig, params: sitemapItem.params};\n }\n const result = await routeModule.getStaticContent(props);\n let body: string;\n if (typeof result === 'string') {\n body = result;\n } else if (result && typeof result === 'object') {\n body = result.body;\n } else {\n body = '';\n }\n const outFilePath = urlPath.slice(1);\n const outPath = path.join(buildDir, outFilePath);\n await makeDir(path.dirname(outPath));\n await writeFile(outPath, body);\n printFileOutput(fileSize(outPath), 'dist/html/', outFilePath);\n return;\n }\n\n const data = await renderer.renderRoute(sitemapItem.route, {\n routeParams: sitemapItem.params,\n });\n if (data.notFound) {\n return;\n }\n\n let outFilePath = path.join(urlPath.slice(1), 'index.html');\n if (outFilePath.endsWith('404/index.html')) {\n outFilePath = outFilePath.replace('404/index.html', '404.html');\n }\n const outPath = path.join(buildDir, outFilePath);\n\n // Save the url to sitemap.xml. Ignore error files (e.g. 404.html).\n if (rootConfig.sitemap && outFilePath.endsWith('index.html')) {\n const sitemapXmlItem: {\n url: string;\n locale: string;\n alts: Array<{locale: string; hreflang: string; url: string}>;\n } = {\n url: `${domain}${urlPath}`,\n locale: sitemapItem.locale,\n alts: [],\n };\n sitemapXmlItems.push(sitemapXmlItem);\n if (sitemapItem.alts) {\n Object.entries(sitemapItem.alts).forEach(([altLocale, item]) => {\n sitemapXmlItem.alts.push({\n url: `${domain}${item.urlPath}`,\n locale: altLocale,\n hreflang: item.hrefLang,\n });\n });\n }\n }\n\n // Render html and save the file to dist/html.\n // TODO(stevenle): consolidate post-build html transformation logic.\n let html = data.html || '';\n if (rootConfig.prettyHtml) {\n html = await htmlPretty(html, rootConfig.prettyHtmlOptions);\n } else if (rootConfig.minifyHtml) {\n html = await htmlMinify(html, rootConfig.minifyHtmlOptions);\n }\n await writeFile(outPath, html);\n\n printFileOutput(fileSize(outPath), 'dist/html/', outFilePath);\n } catch (e) {\n logBuildError(\n {route: sitemapItem.route, params: sitemapItem.params, urlPath},\n e\n );\n throw new Error(\n `BuildError: ${urlPath} (${sitemapItem.route.src}) failed to build.`\n );\n }\n }\n );\n\n // Generate sitemap.xml.\n if (rootConfig.sitemap) {\n const sitemapXmlBuilder: string[] = [];\n sitemapXmlItems.sort((a, b) => a.url.localeCompare(b.url));\n sitemapXmlItems.forEach((item) => {\n sitemapXmlBuilder.push('<url>');\n sitemapXmlBuilder.push(` <loc>${item.url}</loc>`);\n if (item.alts.length > 0) {\n item.alts.sort((a, b) => a.hreflang.localeCompare(b.hreflang));\n item.alts.forEach((alt) => {\n if (item.locale !== alt.locale) {\n sitemapXmlBuilder.push(\n ` <xhtml:link rel=\"alternate\" hreflang=\"${alt.hreflang}\" href=\"${alt.url}\" />`\n );\n }\n });\n }\n sitemapXmlBuilder.push('</url>');\n });\n\n const sitemapXmlLines = [\n '<?xml version=\"1.0\" encoding=\"UTF-8\"?>',\n '<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\" xmlns:xhtml=\"http://www.w3.org/1999/xhtml\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd\">',\n ...sitemapXmlBuilder,\n '</urlset>',\n ];\n const sitemapXml = sitemapXmlLines.join('\\n');\n const outPath = path.join(buildDir, 'sitemap.xml');\n await writeFile(outPath, sitemapXml);\n printFileOutput(fileSize(outPath), 'dist/html/', 'sitemap.xml');\n }\n }\n\n // Run postBuild hooks.\n for (const plugin of rootPlugins) {\n if (plugin.hooks?.postBuild) {\n await plugin.hooks.postBuild(rootConfig, {ssrOnly});\n }\n }\n}\n\nfunction isRouteFile(filepath: string) {\n return filepath.startsWith('routes') && isJsFile(filepath);\n}\n\nfunction fileSize(filepath: string) {\n const stats = fsExtra.statSync(filepath);\n const bytes = stats.size;\n\n const k = 1024;\n if (bytes < k) {\n return (bytes / k).toFixed(2) + ' kB';\n }\n const units = ['B', 'kB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + units[i];\n}\n\nfunction printFileOutput(\n fileSize: string,\n outputDir: string,\n outputFile: string\n) {\n const indent = ' '.repeat(2);\n const paddedSize = fileSize.padStart(9, ' ');\n console.log(\n `${indent}${dim(paddedSize)} ${dim(outputDir)}${cyan(outputFile)}`\n );\n}\n\nfunction sanitizeFileName(name: string): string {\n return (\n name\n // Remove placeholder vars from paths like routes/[...var].tsx.\n .replaceAll('...', '')\n .replaceAll('_', '')\n .replaceAll('[', '')\n .replaceAll(']', '')\n // Remove non-ascii chars and null bytes.\n .replace(/[^\\x00-\\x7F]/g, '')\n .replace(/\\x00/g, '')\n .toLowerCase()\n );\n}\n\ninterface BuildContext {\n route: Route;\n params: Record<string, string>;\n urlPath: string;\n}\n\nfunction logBuildError(ctx: BuildContext, e: Error) {\n const {route, params, urlPath} = ctx;\n const errorString = String(e.stack || e);\n console.error();\n if (Object.keys(params).length > 0) {\n console.error(\n `An error occurred building ${urlPath} (${route.src}) with params:\n${formatParams(params)}\n\nThe error was:\n ${errorString}\n `.trim()\n );\n } else {\n console.error(\n `An error occurred building ${urlPath} (${route.src})\n\nThe error was:\n ${errorString}`\n );\n }\n}\n\nfunction formatParams(params: Record<string, string>) {\n return Object.entries(params)\n .map(([key, value]) => {\n return ` ${key}: ${value}`;\n })\n .join('\\n');\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport glob from 'tiny-glob';\nimport {searchForWorkspaceRoot} from 'vite';\nimport {RootConfig} from '../core/config.js';\nimport {isValidTagName, parseTagNames} from '../utils/elements.js';\nimport {directoryContains, isDirectory, isJsFile} from '../utils/fsutils.js';\nimport type {ResolvedPod} from './pod-collector.js';\n\ninterface ElementSourceFile {\n /** Full file path. */\n filePath: string;\n /** Path relative to the root project directory. */\n relPath: string;\n}\n\n/**\n * Dependency graph for element files to capture which other elements are used\n * by any particular element.\n */\nexport class ElementGraph {\n /**\n * Element tagName => sourceFile.\n */\n readonly sourceFiles: {[tagName: string]: ElementSourceFile} = {};\n\n /**\n * Element tagName => set of element tagName dependencies.\n */\n private deps: Record<string, string[]> = {};\n\n constructor(sourceFiles: {[tagName: string]: ElementSourceFile}) {\n this.sourceFiles = sourceFiles;\n }\n\n toJson() {\n for (const tagName in this.sourceFiles) {\n this.deps[tagName] ??= this.parseDepsFromSource(tagName);\n }\n return {\n sourceFiles: this.sourceFiles,\n deps: this.deps,\n };\n }\n\n static fromJson(data: {deps: any; sourceFiles: any}) {\n const graph = new ElementGraph(data.sourceFiles);\n graph.deps = data.deps;\n return graph;\n }\n\n getDeps(tagName: string, visited?: Set<string>): string[] {\n visited ??= new Set();\n if (visited.has(tagName)) {\n return [];\n }\n\n visited.add(tagName);\n this.deps[tagName] ??= this.parseDepsFromSource(tagName);\n\n const deps = new Set(this.deps[tagName]);\n for (const depTagName of this.deps[tagName]) {\n for (const childDep of this.getDeps(depTagName, visited)) {\n deps.add(childDep);\n }\n }\n return Array.from(deps);\n }\n\n /**\n * Parses an element's source file for usage of other custom elements.\n */\n private parseDepsFromSource(tagName: string): string[] {\n const srcFile = this.sourceFiles[tagName];\n if (!srcFile) {\n throw new Error(`could not find file path for tagName <${tagName}>`);\n }\n const src = fs.readFileSync(srcFile.filePath, 'utf-8');\n const tagNames = parseTagNames(src);\n const deps = new Set<string>();\n for (const depTagName of tagNames) {\n if (depTagName !== tagName && depTagName in this.sourceFiles) {\n deps.add(depTagName);\n }\n }\n return Array.from(deps);\n }\n}\n\n/**\n * Returns a map of all the element file definitions in the project.\n */\nexport async function getElements(\n rootConfig: RootConfig,\n pods?: ResolvedPod[]\n): Promise<ElementGraph> {\n const rootDir = rootConfig.rootDir;\n\n const elementsDirs = getElementsDirs(rootConfig, pods);\n const excludePatterns = rootConfig.elements?.exclude || [];\n const excludeElement = (moduleId: string) => {\n return excludePatterns.some((pattern) => Boolean(moduleId.match(pattern)));\n };\n\n const elementFilePaths: {[tagName: string]: ElementSourceFile} = {};\n for (const dirPath of elementsDirs) {\n if (await isDirectory(dirPath)) {\n const files = await glob('**/*', {cwd: dirPath});\n files.forEach((file) => {\n const parts = path.parse(file);\n if (isJsFile(parts.base) && isValidTagName(parts.name)) {\n const tagName = parts.name;\n const filePath = path.join(dirPath, file);\n const relPath = path.relative(rootDir, filePath);\n if (!excludeElement(relPath)) {\n elementFilePaths[tagName] = {filePath, relPath};\n }\n }\n });\n }\n }\n\n const graph = new ElementGraph(elementFilePaths);\n return graph;\n}\n\n/**\n * Get all element dirs.\n */\nexport function getElementsDirs(rootConfig: RootConfig, pods?: ResolvedPod[]) {\n const rootDir = rootConfig.rootDir;\n const workspaceRoot = searchForWorkspaceRoot(rootDir);\n\n const elementsDirs = [path.join(rootDir, 'elements')];\n const elementsInclude = rootConfig.elements?.include || [];\n\n for (const dirPath of elementsInclude) {\n const elementsDir = path.resolve(rootDir, dirPath);\n if (!directoryContains(rootDir, elementsDir)) {\n throw new Error(\n `the elements dir (${dirPath}) should be within the project's workspace (${workspaceRoot})`\n );\n }\n elementsDirs.push(elementsDir);\n }\n\n // Pod-contributed element dirs bypass the workspace containment check\n // because they are trusted (registered by plugins, not user input).\n if (pods) {\n for (const pod of pods) {\n for (const dir of pod.elementsDirs) {\n elementsDirs.push(dir);\n }\n }\n }\n\n return elementsDirs;\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport {Manifest} from 'vite';\nimport {RootConfig} from '../../core/config.js';\nimport {ElementGraph} from '../../node/element-graph.js';\nimport {isJsFile} from '../../utils/fsutils.js';\nimport {Asset, AssetMap} from './asset-map.js';\n\nexport type BuildAssetManifest = Record<\n string,\n {\n src: string;\n assetUrl: string;\n importedModules: string[];\n importedCss: string[];\n isElement: boolean;\n }\n>;\n\nexport class BuildAssetMap implements AssetMap {\n private rootConfig: RootConfig;\n private srcToAsset: Map<string, BuildAsset>;\n\n constructor(rootConfig: RootConfig) {\n this.rootConfig = rootConfig;\n this.srcToAsset = new Map();\n }\n\n async get(src: string): Promise<Asset | null> {\n const asset = this.srcToAsset.get(src);\n if (asset) {\n return asset;\n }\n // Try resolving the realpath of the asset, following symlinks.\n const realSrc = realPathRelativeTo(this.rootConfig.rootDir, src);\n if (realSrc !== src) {\n const asset = this.srcToAsset.get(realSrc);\n if (asset) {\n return asset;\n }\n }\n console.log(`could not find build asset: ${src}`);\n return null;\n }\n\n private add(asset: BuildAsset) {\n this.srcToAsset.set(asset.src, asset);\n }\n\n toJson(): BuildAssetManifest {\n const result: BuildAssetManifest = {};\n for (const src of this.srcToAsset.keys()) {\n result[src] = this.srcToAsset.get(src)!.toJson();\n }\n return result;\n }\n\n static fromViteManifest(\n rootConfig: RootConfig,\n clientManifest: Manifest,\n elementsGraph: ElementGraph\n ) {\n const assetMap = new BuildAssetMap(rootConfig);\n\n const elementFiles = new Set();\n Object.values(elementsGraph.sourceFiles).forEach((elementSource) => {\n elementFiles.add(elementSource.relPath);\n // Vite will resolve symlinks, so we need to follow the src and add the\n // realpath to the element files.\n const realSrc = realPathRelativeTo(\n rootConfig.rootDir,\n elementSource.relPath\n );\n if (realSrc !== elementSource.filePath) {\n elementFiles.add(realSrc);\n }\n });\n\n Object.keys(clientManifest).forEach((manifestKey) => {\n const src = manifestKey;\n const manifestChunk = clientManifest[manifestKey];\n const isElement = elementFiles.has(src);\n // NOTES(stevenle): routes/ files are included in the manifest for\n // their CSS deps, but do not have an asset URL.\n const assetUrl =\n src.startsWith('routes/') && isJsFile(src)\n ? ''\n : `/${manifestChunk.file}`;\n const assetData = {\n src: src,\n assetUrl: assetUrl,\n importedModules: manifestChunk.imports || [],\n importedCss: (manifestChunk.css || []).map((relPath) => `/${relPath}`),\n isElement: isElement,\n };\n assetMap.add(new BuildAsset(assetMap, assetData));\n });\n\n return assetMap;\n }\n\n static fromRootManifest(\n rootConfig: RootConfig,\n rootManifest: BuildAssetManifest\n ) {\n const assetMap = new BuildAssetMap(rootConfig);\n Object.keys(rootManifest).forEach((moduleId) => {\n const assetData = rootManifest[moduleId];\n assetMap.add(new BuildAsset(assetMap, assetData));\n });\n return assetMap;\n }\n}\n\n/**\n * Returns the realpath of a src file, relative to the rootDir.\n */\nfunction realPathRelativeTo(rootDir: string, src: string) {\n const fullPath = path.resolve(rootDir, src);\n if (!fs.existsSync(fullPath)) {\n return src;\n }\n const realpath = fs.realpathSync(path.resolve(rootDir, src));\n return path.relative(rootDir, realpath);\n}\n\nexport class BuildAsset {\n src: string;\n assetUrl: string;\n private assetMap: BuildAssetMap;\n private importedModules: string[];\n private importedCss: string[];\n isElement: boolean;\n\n constructor(\n assetMap: BuildAssetMap,\n assetData: {\n src: string;\n assetUrl: string;\n importedModules: string[];\n importedCss: string[];\n isElement: boolean;\n }\n ) {\n this.assetMap = assetMap;\n this.src = assetData.src;\n this.assetUrl = assetData.assetUrl;\n this.importedModules = assetData.importedModules;\n this.importedCss = assetData.importedCss;\n this.isElement = assetData.isElement;\n }\n\n async getCssDeps(): Promise<string[]> {\n const visited = new Set<string>();\n const deps = new Set<string>();\n await this.collectCss(this, deps, visited);\n return Array.from(deps);\n }\n\n async getJsDeps(): Promise<string[]> {\n const visited = new Set<string>();\n const deps = new Set<string>();\n await this.collectJs(this, deps, visited);\n return Array.from(deps);\n }\n\n private async collectJs(\n asset: BuildAsset | null,\n urls: Set<string>,\n visited: Set<string>\n ) {\n if (!asset) {\n return;\n }\n if (!asset.src) {\n return;\n }\n if (visited.has(asset.src)) {\n return;\n }\n visited.add(asset.src);\n if (asset.isElement) {\n urls.add(asset.assetUrl);\n }\n await Promise.all(\n asset.importedModules.map(async (src) => {\n const importedAsset = (await this.assetMap.get(src)) as BuildAsset;\n this.collectJs(importedAsset, urls, visited);\n })\n );\n }\n\n private async collectCss(\n asset: BuildAsset | null,\n urls: Set<string>,\n visited: Set<string>\n ) {\n if (!asset) {\n return;\n }\n if (!asset.src) {\n return;\n }\n if (visited.has(asset.src)) {\n return;\n }\n visited.add(asset.src);\n if (asset.importedCss) {\n asset.importedCss.forEach((cssUrl) => urls.add(cssUrl));\n }\n await Promise.all(\n asset.importedModules.map(async (moduleId) => {\n const importedAsset = (await this.assetMap.get(moduleId)) as BuildAsset;\n this.collectCss(importedAsset, urls, visited);\n })\n );\n }\n\n toJson() {\n return {\n src: this.src,\n assetUrl: this.assetUrl,\n importedModules: this.importedModules,\n importedCss: this.importedCss,\n isElement: this.isElement,\n };\n }\n}\n","export async function batchAsyncCalls<T, U>(\n data: T[],\n concurrency: number,\n asyncFunction: (item: T) => Promise<U>\n): Promise<U[]> {\n const result: U[] = new Array(data.length);\n let nextIndex = 0;\n\n async function worker() {\n while (nextIndex < data.length) {\n const index = nextIndex++;\n result[index] = await asyncFunction(data[index]);\n }\n }\n\n const workers = Array.from(\n {length: Math.min(concurrency, data.length)},\n () => worker()\n );\n await Promise.all(workers);\n return result;\n}\n","import {promises as fs} from 'node:fs';\nimport path from 'node:path';\nimport {fileURLToPath} from 'node:url';\nimport glob from 'tiny-glob';\nimport {dirExists, makeDir, rmDir, writeFile} from '../utils/fsutils.js';\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\n\ninterface CodegenOptions {\n out?: string;\n}\n\ninterface Template {\n read: () => Promise<string>;\n}\n\ntype TemplateMap = Record<string, Template>;\n\nexport async function codegen(\n type: string,\n name: string,\n options?: CodegenOptions\n) {\n const rootDir = path.resolve(process.cwd());\n const project = new Project(rootDir);\n await project.generateCode(type, name, options);\n}\n\nclass Project {\n rootDir: string;\n tplDirs: string[];\n\n constructor(rootDir: string) {\n this.rootDir = rootDir;\n this.tplDirs = [\n path.join(rootDir, 'codegen'),\n path.join(__dirname, '../codegen'),\n ];\n }\n\n async generateCode(type: string, name: string, options?: CodegenOptions) {\n const files = await this.loadFiles(type);\n if (Object.keys(files).length === 0) {\n console.log(`no files in codegen/${type}/*.tpl`);\n return;\n }\n\n // By default, running `root codegen template Foo` outputs to\n // `<rootDir>/templates/Foo`.\n const outname = options?.out || `${type}s`;\n const outdir = path.join(this.rootDir, outname, name);\n if (await dirExists(outdir)) {\n await rmDir(outdir);\n }\n await makeDir(outdir);\n\n for (const tplName in files) {\n const tpl = await files[tplName].read();\n const content = tpl\n .replaceAll('[[name]]', name)\n .replaceAll('[[name:camel_upper]]', toCamelCaseUpper(name));\n const filename = tplName.replace('[name]', name);\n const filepath = path.join(outdir, filename);\n await writeFile(filepath, content);\n console.log(`saved ${filepath}`);\n }\n }\n\n /**\n * Searches the project's \"codegen\" dir (or fallsback to root's \"codegen\" dir)\n * and returns a `TemplateMap` for all files in `codgen/<type>/*.tpl`.\n */\n async loadFiles(type: string): Promise<TemplateMap> {\n for (const tplDir of this.tplDirs) {\n const typeDir = path.join(tplDir, type);\n if (await dirExists(typeDir)) {\n return this.loadTplFiles(typeDir);\n }\n }\n return {};\n }\n\n /**\n * Reads files matching `*.tpl` in a given directory.\n */\n private async loadTplFiles(dirpath: string): Promise<TemplateMap> {\n const tplFiles: TemplateMap = {};\n const files = await glob('*.tpl', {cwd: dirpath});\n for (const filename of files) {\n const filepath = path.join(dirpath, filename);\n // Remove `.tpl`.\n const name = filename.slice(0, -4);\n tplFiles[name] = {\n read: () => fs.readFile(filepath, 'utf-8'),\n };\n }\n return tplFiles;\n }\n}\n\nfunction toCamelCaseUpper(str: string) {\n const segments = str.split('-');\n return segments.map((part) => toTitleCase(part)).join('');\n}\n\nfunction toTitleCase(str: string) {\n const ch = String(str).charAt(0).toUpperCase();\n return `${ch}${str.slice(1)}`;\n}\n","import {promises as fs} from 'node:fs';\nimport path from 'node:path';\nimport {build as esbuild} from 'esbuild';\nimport {flattenPackageDepsFromMonorepo} from '../node/monorepo.js';\nimport {\n copyDir,\n dirExists,\n fileExists,\n loadJson,\n makeDir,\n rmDir,\n writeJson,\n} from '../utils/fsutils.js';\nimport {build as rootBuild} from './build.js';\n\ntype DeployTarget = 'appengine' | 'firebase';\n\ninterface CreatePackageOptions {\n mode?: string;\n out?: string;\n target?: DeployTarget;\n version?: string;\n appYaml?: string;\n}\n\ninterface PeerDependencyMeta {\n optional?: boolean;\n}\n\ninterface PackageJson {\n [key: string]: any;\n scripts?: Record<string, string>;\n dependencies?: Record<string, string>;\n peerDependencies?: Record<string, string>;\n peerDependenciesMeta?: Record<string, PeerDependencyMeta>;\n workspaces?: string[];\n}\n\nexport async function createPackage(\n rootProjectDir?: string,\n options?: CreatePackageOptions\n) {\n const mode = options?.mode || 'production';\n process.env.NODE_ENV = mode;\n\n const rootDir = path.resolve(rootProjectDir || process.cwd());\n // const rootConfig = await loadRootConfig(rootDir, {command: 'build'});\n const distDir = path.join(rootDir, 'dist');\n const target = options?.target || (await getDefaultTarget(rootDir));\n const outDir = path.resolve(options?.out || target || 'out');\n\n // Build the site in ssr-only mode.\n await rootBuild(rootProjectDir, {ssrOnly: true, mode: mode});\n\n // Create `outDir` and copy the generated `distDir` files to it.\n await rmDir(outDir);\n await makeDir(outDir);\n await copyDir(distDir, path.resolve(outDir, 'dist'));\n\n // Copy the \"collections\" dir if it exists.\n const collectionsDir = path.resolve(rootDir, 'collections');\n if (await dirExists(collectionsDir)) {\n await copyDir(collectionsDir, path.join(outDir, 'collections'));\n }\n\n // Create package.json.\n const packageJson = await generatePackageJson(rootDir, options);\n\n // Set root.js versions.\n if (options?.version && packageJson.dependencies) {\n if (packageJson.dependencies['@blinkk/root']) {\n packageJson.dependencies['@blinkk/root'] = options.version;\n }\n if (packageJson.dependencies['@blinkk/root-cms']) {\n packageJson.dependencies['@blinkk/root-cms'] = options.version;\n }\n if (packageJson.dependencies['@blinkk/root-password-protect']) {\n packageJson.dependencies['@blinkk/root-password-protect'] =\n options.version;\n }\n }\n\n // Run target-specific updates to the output.\n if (target === 'appengine') {\n const appYamlPath = options?.appYaml || path.join(rootDir, 'app.yaml');\n await onAppEngine({packageJson, outDir, appYamlPath});\n } else if (target === 'firebase') {\n await onFirebase({rootDir, packageJson, outDir});\n }\n\n // Save `outDir/package.json`.\n await writeJson(path.resolve(outDir, 'package.json'), packageJson);\n\n console.log('done!');\n console.log(`saved package to ${outDir}`);\n}\n\nasync function getDefaultTarget(rootDir: string): Promise<DeployTarget | null> {\n // Default to firebase if a firebase.json file exists in the root dir.\n const firebaseConfigPath = path.resolve(rootDir, 'firebase.json');\n if (await fileExists(firebaseConfigPath)) {\n return 'firebase';\n }\n\n // Default to appengine.\n const appEngineConfigPath = path.resolve(rootDir, 'app.yaml');\n if (await fileExists(appEngineConfigPath)) {\n return 'appengine';\n }\n\n return null;\n}\n\nasync function generatePackageJson(\n rootDir: string,\n options?: CreatePackageOptions\n): Promise<PackageJson> {\n // Read the package.json.\n const packageJson: PackageJson = await loadJson<any>(\n path.resolve(rootDir, 'package.json')\n );\n\n // Flatten any deps from the monorepo, and remove peerDependencies and\n // devDependencies.\n const allDeps = flattenPackageDepsFromMonorepo(rootDir);\n packageJson.dependencies ??= {} as Record<string, string>;\n for (const depName in allDeps) {\n if (!packageJson.dependencies[depName]) {\n packageJson.dependencies[depName] = allDeps[depName];\n }\n }\n\n Object.entries(packageJson.dependencies).forEach(([depName, depVersion]) => {\n if (depName.startsWith('@blinkk/root') && options?.version) {\n // Replace root version with the current version.\n packageJson.dependencies![depName] = options.version;\n } else if (depVersion.startsWith('workspace:')) {\n // Remove `workspace:` deps.\n delete packageJson.dependencies![depName];\n }\n });\n if (packageJson.peerDependencies) {\n delete packageJson.peerDependencies;\n }\n if (packageJson.devDependencies) {\n delete packageJson.devDependencies;\n }\n\n return packageJson;\n}\n\n/**\n * Called for App Engine targets.\n */\nasync function onAppEngine(options: {\n packageJson: PackageJson;\n outDir: string;\n appYamlPath: string;\n}) {\n const {outDir, packageJson, appYamlPath} = options;\n if (await fileExists(appYamlPath)) {\n await fs.copyFile(appYamlPath, path.resolve(outDir, 'app.yaml'));\n }\n\n // Only include the \"start\" script.\n if (packageJson.scripts?.start) {\n packageJson.scripts = {start: packageJson.scripts.start};\n } else {\n packageJson.scripts = {start: 'root start --host=0.0.0.0'};\n }\n}\n\n/**\n * Called for Firebase Hosting targets.\n */\nasync function onFirebase(options: {\n rootDir: string;\n packageJson: PackageJson;\n outDir: string;\n}) {\n const {rootDir, outDir, packageJson} = options;\n\n // If the outDir is called `functions/` and an index.ts file exists in the\n // root project dir, automatically compile it through esbuild.\n const outBasename = path.basename(outDir);\n if (outBasename === 'functions') {\n const indexTsFile = path.resolve(rootDir, 'index.ts');\n if (await fileExists(indexTsFile)) {\n await bundleTsFile(indexTsFile, path.resolve(outDir, 'index.js'));\n }\n }\n\n // Only include the \"start\" script.\n if (packageJson.scripts?.start) {\n packageJson.scripts = {start: packageJson.scripts.start};\n } else {\n packageJson.scripts = {start: 'root start --host=0.0.0.0'};\n }\n}\n\n/**\n * Compiles a `.ts` file to `.js`.\n */\nexport async function bundleTsFile(srcPath: string, outPath: string) {\n await esbuild({\n entryPoints: [srcPath],\n bundle: true,\n minify: true,\n platform: 'node',\n outfile: outPath,\n sourcemap: 'inline',\n metafile: true,\n format: 'esm',\n plugins: [\n {\n name: 'externalize-deps',\n setup(build: any) {\n build.onResolve({filter: /.*/}, (args: any) => {\n const id = args.path;\n if (id[0] !== '.' && !path.isAbsolute(id)) {\n return {\n external: true,\n };\n }\n return null;\n });\n },\n },\n ],\n });\n}\n","import http from 'node:http';\nimport path from 'node:path';\nimport {fileURLToPath} from 'node:url';\n\nimport cookieParser from 'cookie-parser';\nimport {default as express} from 'express';\nimport {dim} from 'kleur/colors';\nimport sirv from 'sirv';\nimport glob from 'tiny-glob';\n\nimport {ViteDevServer} from 'vite';\nimport {RootConfig} from '../core/config.js';\nimport {configureServerPlugins} from '../core/plugin.js';\nimport {Server, Request, Response, NextFunction} from '../core/types.js';\nimport {hooksMiddleware} from '../middleware/hooks.js';\nimport {\n headersMiddleware,\n rootProjectMiddleware,\n trailingSlashMiddleware,\n} from '../middleware/middleware.js';\nimport {redirectsMiddleware} from '../middleware/redirects.js';\nimport {sessionMiddleware} from '../middleware/session.js';\nimport {getElements, getElementsDirs} from '../node/element-graph.js';\nimport {loadRootConfigWithDeps} from '../node/load-config.js';\nimport {collectPods} from '../node/pod-collector.js';\nimport {createViteServer} from '../node/vite.js';\nimport {DevServerAssetMap} from '../render/asset-map/dev-asset-map.js';\nimport {dirExists, isDirectory, isJsFile} from '../utils/fsutils.js';\nimport {findOpenPort} from '../utils/ports.js';\nimport {getSessionCookieSecret} from '../utils/rand.js';\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}\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 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('┃')} project: ${rootDir}`);\n console.log(`${dim('┃')} server: http://${host}:${port}${homePagePath}`);\n if (testCmsEnabled(rootConfig)) {\n console.log(`${dim('┃')} cms: http://${host}:${port}/cms/`);\n }\n console.log(`${dim('┃')} 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('┃')} root.config.ts changed. restarting server...`\n );\n await restart();\n }\n });\n }\n\n async function restart() {\n if (currentServer) {\n currentServer.close();\n currentServer = null;\n }\n if (currentViteServer) {\n await currentViteServer.close();\n currentViteServer = null;\n }\n await start();\n }\n\n await start();\n}\n\nexport async function createDevServer(options?: {\n rootDir?: string;\n port?: number;\n}): Promise<Server> {\n const rootDir = path.resolve(options?.rootDir || process.cwd());\n const {rootConfig, dependencies} = await loadRootConfigWithDeps(rootDir, {\n command: 'dev',\n });\n const port = options?.port;\n\n const server: Server = express();\n server.set('rootConfig', rootConfig);\n server.set('rootConfigDependencies', dependencies);\n server.disable('x-powered-by');\n\n // Create viteServer.\n const {viteServer, viteMiddleware} = await createViteMiddleware({\n rootConfig,\n port,\n });\n server.set('viteServer', viteServer);\n\n // Inject req context vars.\n server.use(rootProjectMiddleware({rootConfig}));\n server.use(viteMiddleware);\n server.use(hooksMiddleware());\n\n // Session middleware for handling session cookies.\n const sessionCookieSecret = getSessionCookieSecret(rootConfig, rootDir);\n server.use(cookieParser(sessionCookieSecret));\n server.use(sessionMiddleware());\n\n const plugins = rootConfig.plugins || [];\n await configureServerPlugins(\n server,\n async () => {\n // Add user-configured middlewares from `root.config.ts`.\n const userMiddlewares = rootConfig.server?.middlewares || [];\n for (const middleware of userMiddlewares) {\n server.use(middleware);\n }\n\n // Add redirects middlewares.\n if (rootConfig.server?.redirects) {\n server.use(\n redirectsMiddleware({redirects: rootConfig.server.redirects})\n );\n }\n\n // Add http headers middleware.\n if (rootConfig.server?.headers) {\n server.use(headersMiddleware({rootConfig: rootConfig}));\n }\n\n // Add static file middleware.\n const publicDir = path.join(rootDir, 'public');\n if (await dirExists(publicDir)) {\n server.use(rootPublicDirMiddleware({publicDir, viteServer}));\n }\n\n // NOTE: The trailing slash middleware needs to come after public files so\n // that slashes are not appended to public file routes.\n server.use(trailingSlashMiddleware({rootConfig}));\n\n // Add the root.js dev server middlewares.\n server.use(rootDevServerMiddleware());\n\n // Add any custom plugin 404 handlers.\n plugins.forEach((plugin) => {\n if (plugin.handle404) {\n server.use(plugin.handle404);\n }\n });\n\n // Add error handlers.\n server.use(rootDevServer404Middleware());\n server.use(rootDevServer500Middleware());\n },\n plugins,\n {type: 'dev', rootConfig}\n );\n\n return server;\n}\n\n/**\n * Middleware that initializes a vite server and injects it into the request\n * context.\n */\nasync function createViteMiddleware(options: {\n rootConfig: RootConfig;\n port?: number;\n}) {\n const rootConfig = options.rootConfig;\n const rootDir = rootConfig.rootDir;\n\n const pods = await collectPods(rootConfig);\n\n let elementGraph = await getElements(rootConfig, pods);\n const elements = Object.values(elementGraph.sourceFiles).map((sourceFile) => {\n return sourceFile.relPath;\n });\n\n const bundleScripts: string[] = [];\n if (await isDirectory(path.join(rootDir, 'bundles'))) {\n const bundleFiles = await glob('bundles/*', {cwd: rootDir});\n bundleFiles.forEach((file) => {\n const parts = path.parse(file);\n if (isJsFile(parts.base)) {\n bundleScripts.push(file);\n }\n });\n }\n // Add pod bundle scripts.\n for (const pod of pods) {\n for (const bundleFile of pod.bundleFiles) {\n bundleScripts.push(bundleFile);\n }\n }\n\n const optimizeDeps = [...elements, ...bundleScripts];\n const viteServer = await createViteServer(rootConfig, {\n port: options.port,\n optimizeDeps: optimizeDeps,\n });\n\n // Watch for file changes and re-generate the elements graph if any elements\n // are added or deleted.\n function isInElementsDir(changedFilePath: string) {\n const filePath = path.resolve(changedFilePath);\n const elementsDirs = getElementsDirs(rootConfig, pods);\n return elementsDirs.some((dirPath) => filePath.startsWith(dirPath));\n }\n viteServer.watcher.on('add', async (filePath: string) => {\n if (isInElementsDir(filePath)) {\n elementGraph = await getElements(rootConfig, pods);\n console.log(`element added: ${filePath}`);\n }\n });\n viteServer.watcher.on('unlink', async (filePath: string) => {\n if (isInElementsDir(filePath)) {\n elementGraph = await getElements(rootConfig, pods);\n console.log(`element deleted: ${filePath}`);\n }\n });\n\n const viteMiddleware = async (\n req: Request,\n res: Response,\n next: NextFunction\n ) => {\n try {\n // Add the viteServer to the req.\n req.viteServer = viteServer;\n // Dynamically import the render.js module using vite's SSR import loader.\n const renderModulePath = path.resolve(__dirname, './render.js');\n const render = (await viteServer.ssrLoadModule(\n renderModulePath\n )) as RenderModule;\n // Create a dev asset map using Vite dev server's module graph.\n const assetMap = new DevServerAssetMap(\n rootConfig,\n viteServer.moduleGraph\n );\n // Add a renderer object to the req for plugins and other middleware to\n // use.\n req.renderer = new render.Renderer(rootConfig, {assetMap, elementGraph});\n // Run the viteServer middlewares to handle vite-specific endpoints.\n viteServer.middlewares(req, res, next);\n } catch (e) {\n next(e);\n }\n };\n\n return {viteServer, viteMiddleware};\n}\n\nfunction rootPublicDirMiddleware(options: {\n publicDir: string;\n viteServer: ViteDevServer;\n}) {\n const publicDir = options.publicDir;\n\n // The `{dev: false}` option is used for performance reasons. When dev is set\n // to `true`, every request will traverse the filesystem to check if a\n // matching file exists. Setting it to `false` uses a cache, which can be\n // reloaded whenever a file change is detected in the `public` directory.\n const sirvOptions = {dev: false};\n let handler = sirv(publicDir, sirvOptions);\n\n const reloadPublicDirCache = debounce(() => {\n handler = sirv(publicDir, sirvOptions);\n }, 1000);\n\n function isInPublicDir(changedFilePath: string) {\n const filePath = path.resolve(changedFilePath);\n return filePath.startsWith(publicDir);\n }\n\n const watcher = options.viteServer.watcher;\n watcher.on('all', (event, filepath) => {\n if (isInPublicDir(filepath)) {\n reloadPublicDirCache();\n }\n });\n\n return (req: Request, res: Response, next: NextFunction) => {\n handler(req, res, next);\n };\n}\n\nfunction rootDevServerMiddleware() {\n return async (req: Request, res: Response, next: NextFunction) => {\n const renderer = req.renderer!;\n const viteServer = req.viteServer!;\n try {\n await renderer.handle(req, res, next);\n } catch (err) {\n // If an error is caught, let Vite fix the stack trace so it maps back to\n // your actual source code.\n viteServer.ssrFixStacktrace(err);\n next(err);\n }\n };\n}\n\nfunction rootDevServer404Middleware() {\n return async (req: Request, res: Response) => {\n if (!DEV_SERVER_404_LOG_IGNORE_PATHS.has(req.path)) {\n console.error(`❓ 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(`❗ 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 {execSync} from 'node:child_process';\nimport fs from 'node:fs';\nimport path from 'node:path';\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] 🚀 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] ❌ health check failed. check logs: \\n${getLogsURL(\n project,\n service,\n version\n )}`\n );\n }\n console.log('[gae-deploy] ✅ 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] 📦 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] ✂️ 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] ✨ deployment complete\\nversions: ${getVersionsURL(\n project,\n service\n )}`\n );\n}\n\n/**\n * Returns whether a given version name is too long (a subdomain part should not\n * exceed 63 characters).\n */\nfunction testVersionTooLong(version: string, service: string, project: string) {\n const subdomain = `${version}-dot-${service}-dot-${project}`;\n // console.log(subdomain, subdomain.length);\n return subdomain.length > 63;\n}\n\n/** Returns the logs viewer URL in the Google Cloud Console. */\nfunction getLogsURL(project: string, service: string, version: string) {\n return `https://console.cloud.google.com/logs/query;query=resource.type%3D\"gae_app\"%0Aresource.labels.module_id%3D\"${service}\"%0Aresource.labels.version_id%3D\"${version}\"?project=${project}`;\n}\n\n/** Returns the App Engine versions viewer URL in the Google Cloud Console. */\nfunction getVersionsURL(project: string, service: string) {\n return `https://console.cloud.google.com/appengine/versions?project=${project}&serviceId=${service}`;\n}\n\n/**\n * Returns whether the `env_variables` key in app.yaml has placeholders.\n *\n * Example:\n * ```yaml\n * env_variables:\n * MY_SECRET_TOKEN: '{MY_SECRET_TOKEN}'\n * ```\n */\nfunction testHasEnvPlaceholders(appYaml: AppYaml) {\n if (typeof appYaml?.env_variables !== 'object') {\n return false;\n }\n const envVars: Record<string, string> = appYaml.env_variables;\n return Object.values(envVars).some((envValue: string) => {\n return testIsEnvPlaceholder(envValue);\n });\n}\n\nfunction testIsEnvPlaceholder(envValue: any) {\n if (typeof envValue === 'string') {\n return envValue.startsWith('{') && envValue.endsWith('}');\n }\n return false;\n}\n\n/** Updates any placeholders used in environment variables with their values. */\nfunction updateAppYamlEnv(appYamlPath: string, appYaml: AppYaml) {\n // Copy the original app.yaml to a backup file.\n const backupAppYaml = `${appYamlPath}.bak`;\n fs.copyFileSync(appYamlPath, backupAppYaml);\n let content = fs.readFileSync(appYamlPath, 'utf8');\n\n // Replace env_variables placeholders like `MY_SECRET_TOKEN: '{MY_SECRET_TOKEN}'`.\n const envVars: Record<string, string> = appYaml.env_variables;\n Object.entries(envVars).forEach(([envVar, envValue]) => {\n if (testIsEnvPlaceholder(envValue)) {\n const value = process.env[envVar];\n if (!value && content.includes(`{${envVar}}`)) {\n console.warn(`[gae-deploy] Missing environment variable: ${envVar}`);\n content = content.replaceAll(`{${envVar}}`, '');\n } else if (value && content.includes(`{${envVar}}`)) {\n content = content.replaceAll(`{${envVar}}`, value);\n }\n }\n });\n\n fs.writeFileSync(appYamlPath, content, 'utf8');\n return backupAppYaml;\n}\n\n/**\n * Returns a timestamp for the version name, formatted `YYYYMMDDtHHMM`.\n */\nfunction getTimestamp() {\n const pretty = (num: number) => (num + '').padStart(2, '0');\n const date = new Date();\n return `${date.getFullYear()}${pretty(date.getMonth() + 1)}${pretty(\n date.getDate()\n )}t${pretty(date.getHours())}${pretty(date.getMinutes())}`;\n}\n\n/**\n * Returns whether the App Engine service succeeds in handling a health check\n * request.\n */\nexport async function testHealth(\n project: string,\n service: string,\n version: string,\n healthcheckUrl: string\n) {\n if (!healthcheckUrl.startsWith('/')) {\n healthcheckUrl = `/${healthcheckUrl}`;\n }\n const url = `https://${version}-dot-${service}-dot-${project}.appspot.com${healthcheckUrl}`;\n const response = await fetch(url);\n return response.status === 200;\n}\n\n/**\n * Returns whether a version is considered to be managed by this script, and\n * whether it's an \"old\" prod version (e.g. a version that receives no traffic).\n * This script only manages old prod versions.\n */\nfunction testManagedVersion(\n service: string,\n appInfo: AppVersionInfo,\n prefix: string\n) {\n const re = new RegExp(`${prefix}-\\\\d{8}t\\\\d{4}`);\n return (\n appInfo.service === service &&\n re.exec(appInfo.id) &&\n appInfo.traffic_split === 0.0\n );\n}\n","import path from 'node:path';\n\nimport compression from 'compression';\nimport cookieParser from 'cookie-parser';\nimport {default as express} from 'express';\nimport {dim} from 'kleur/colors';\nimport sirv from 'sirv';\n\nimport {RootConfig} from '../core/config.js';\nimport {configureServerPlugins} from '../core/plugin.js';\nimport {Request, Response, NextFunction, Server} from '../core/types.js';\nimport {hooksMiddleware} from '../middleware/hooks.js';\nimport {\n headersMiddleware,\n rootProjectMiddleware,\n trailingSlashMiddleware,\n} from '../middleware/middleware.js';\nimport {redirectsMiddleware} from '../middleware/redirects.js';\nimport {sessionMiddleware} from '../middleware/session.js';\nimport {ElementGraph} from '../node/element-graph.js';\nimport {loadBundledConfig} from '../node/load-config.js';\nimport {\n BuildAssetManifest,\n BuildAssetMap,\n} from '../render/asset-map/build-asset-map.js';\nimport {fileExists, loadJson} from '../utils/fsutils.js';\nimport {getSessionCookieSecret} from '../utils/rand.js';\n\ntype RenderModule = typeof import('../render/render.js');\n\nexport interface PreviewOptions {\n host?: string;\n}\n\nexport async function preview(\n rootProjectDir?: string,\n options?: PreviewOptions\n) {\n // TODO(stevenle): figure out standard practice for NODE_ENV when using the\n // preview command.\n process.env.NODE_ENV = 'development';\n const rootDir = path.resolve(rootProjectDir || process.cwd());\n const server = await createPreviewServer({rootDir});\n const port = parseInt(process.env.PORT || '4007');\n const host = options?.host || 'localhost';\n console.log();\n console.log(`${dim('┃')} project: ${rootDir}`);\n console.log(`${dim('┃')} server: http://${host}:${port}`);\n console.log(`${dim('┃')} mode: preview`);\n console.log();\n server.listen(port, host);\n}\n\nexport async function createPreviewServer(options: {\n rootDir: string;\n}): Promise<Server> {\n const rootDir = options.rootDir;\n const rootConfig = await loadBundledConfig(rootDir, {command: 'preview'});\n const distDir = path.join(rootDir, 'dist');\n\n const server: Server = express();\n server.disable('x-powered-by');\n server.use(compression());\n\n // Inject request context vars.\n server.use(rootProjectMiddleware({rootConfig}));\n server.use(await rootPreviewRendererMiddleware({rootConfig, distDir}));\n server.use(hooksMiddleware());\n\n // Session middleware for handling session cookies.\n const sessionCookieSecret = getSessionCookieSecret(rootConfig, rootDir);\n server.use(cookieParser(sessionCookieSecret));\n server.use(sessionMiddleware());\n\n const plugins = rootConfig.plugins || [];\n await configureServerPlugins(\n server,\n async () => {\n // Add user-configured middlewares from `root.config.ts`.\n const userMiddlewares = rootConfig.server?.middlewares || [];\n userMiddlewares.forEach((middleware) => {\n server.use(middleware);\n });\n\n // Add redirects middleware.\n if (rootConfig.server?.redirects) {\n server.use(\n redirectsMiddleware({redirects: rootConfig.server.redirects})\n );\n }\n\n // Add http headers middleware.\n if (rootConfig.server?.headers) {\n server.use(headersMiddleware({rootConfig: rootConfig}));\n }\n\n // Add static file middleware.\n const publicDir = path.join(distDir, 'html');\n server.use(sirv(publicDir, {dev: false}));\n\n // NOTE: The trailing slash middleware needs to come after public files so\n // that slashes are not appended to public file routes.\n server.use(trailingSlashMiddleware({rootConfig}));\n\n // Add the root.js preview server middlewares.\n server.use(rootPreviewServerMiddleware());\n\n // Add any custom plugin 404 handlers.\n plugins.forEach((plugin) => {\n if (plugin.handle404) {\n server.use(plugin.handle404);\n }\n });\n\n // Add error handlers.\n server.use(rootPreviewServer404Middleware());\n server.use(rootPreviewServer500Middleware());\n },\n plugins,\n {type: 'preview', rootConfig}\n );\n return server;\n}\n\n/**\n * Injects a renderer into the request.\n */\nasync function rootPreviewRendererMiddleware(options: {\n rootConfig: RootConfig;\n distDir: string;\n}) {\n const {distDir, rootConfig} = options;\n const render: RenderModule = await import(\n path.join(distDir, 'server/render.js')\n );\n const manifestPath = path.join(distDir, '.root/manifest.json');\n if (!(await fileExists(manifestPath))) {\n throw new Error(\n `could not find ${manifestPath}. run \\`root build\\` before \\`root preview\\`.`\n );\n }\n const elementGraphJsonPath = path.join(distDir, '.root/elements.json');\n if (!(await fileExists(elementGraphJsonPath))) {\n throw new Error(\n `could not find ${elementGraphJsonPath}. run \\`root build\\` before \\`root preview\\`.`\n );\n }\n const rootManifest = await loadJson<BuildAssetManifest>(manifestPath);\n const assetMap = BuildAssetMap.fromRootManifest(rootConfig, rootManifest);\n const elementGraphJson = await loadJson<any>(elementGraphJsonPath);\n const elementGraph = ElementGraph.fromJson(elementGraphJson);\n const renderer = new render.Renderer(rootConfig, {assetMap, elementGraph});\n return async (req: Request, _: Response, next: NextFunction) => {\n req.renderer = renderer;\n next();\n };\n}\n\n/**\n * Preview server request handler.\n */\nfunction rootPreviewServerMiddleware() {\n return async (req: Request, res: Response, next: NextFunction) => {\n const renderer = req.renderer!;\n try {\n await renderer.handle(req, res, next);\n } catch (e) {\n try {\n console.error(`error rendering ${req.originalUrl}`);\n console.error(e.stack || e);\n const {html} = await renderer.renderDevServer500(req, e);\n res.status(500).set({'Content-Type': 'text/html'}).end(html);\n } catch (e2) {\n console.error('failed to render custom error');\n console.error(e2);\n next(e);\n }\n }\n };\n}\n\nfunction rootPreviewServer404Middleware() {\n return async (req: Request, res: Response) => {\n console.error(`❓ 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(`❗ 500 ${req.originalUrl}`);\n console.error(String(err.stack || err));\n if (req.renderer) {\n const url = req.path;\n const ext = path.extname(url);\n if (!ext) {\n const renderer = req.renderer;\n const data = await renderer.renderDevServer500(req, err);\n const html = data.html || '';\n res.status(500).set({'Content-Type': 'text/html'}).end(html);\n return;\n }\n }\n next(err);\n };\n}\n","import path from 'node:path';\n\nimport compression from 'compression';\nimport cookieParser from 'cookie-parser';\nimport {default as express} from 'express';\nimport {dim} from 'kleur/colors';\nimport sirv from 'sirv';\n\nimport {RootConfig} from '../core/config.js';\nimport {configureServerPlugins} from '../core/plugin.js';\nimport {Request, Response, NextFunction, Server} from '../core/types.js';\nimport {hooksMiddleware} from '../middleware/hooks.js';\nimport {\n headersMiddleware,\n rootProjectMiddleware,\n trailingSlashMiddleware,\n} from '../middleware/middleware.js';\nimport {redirectsMiddleware} from '../middleware/redirects.js';\nimport {sessionMiddleware} from '../middleware/session.js';\nimport {ElementGraph} from '../node/element-graph.js';\nimport {loadBundledConfig} from '../node/load-config.js';\nimport {\n BuildAssetManifest,\n BuildAssetMap,\n} from '../render/asset-map/build-asset-map.js';\nimport {fileExists, loadJson} from '../utils/fsutils.js';\nimport {getSessionCookieSecret} from '../utils/rand.js';\n\ntype RenderModule = typeof import('../render/render.js');\n\nexport interface StartOptions {\n host?: string;\n}\n\nexport async function start(rootProjectDir?: string, options?: StartOptions) {\n process.env.NODE_ENV = 'production';\n const rootDir = path.resolve(rootProjectDir || process.cwd());\n const server = await createProdServer({rootDir});\n const port = parseInt(process.env.PORT || '4007');\n const host = options?.host || 'localhost';\n console.log();\n console.log(`${dim('┃')} project: ${rootDir}`);\n console.log(`${dim('┃')} server: http://${host}:${port}`);\n console.log(`${dim('┃')} mode: production`);\n console.log();\n server.listen(port, host);\n}\n\nexport async function createProdServer(options: {\n rootDir: string;\n}): Promise<Server> {\n const rootDir = options.rootDir;\n const rootConfig = await loadBundledConfig(rootDir, {command: 'start'});\n const distDir = path.join(rootDir, 'dist');\n\n const server: Server = express();\n server.disable('x-powered-by');\n server.use(compression());\n\n // Inject request context vars.\n server.use(rootProjectMiddleware({rootConfig}));\n server.use(await rootProdRendererMiddleware({rootConfig, distDir}));\n server.use(hooksMiddleware());\n\n // Session middleware for handling session cookies.\n const sessionCookieSecret = getSessionCookieSecret(rootConfig, rootDir);\n server.use(cookieParser(sessionCookieSecret));\n server.use(sessionMiddleware());\n\n const plugins = rootConfig.plugins || [];\n await configureServerPlugins(\n server,\n async () => {\n // Add user-configured middlewares from `root.config.ts`.\n const userMiddlewares = rootConfig.server?.middlewares || [];\n userMiddlewares.forEach((middleware) => {\n server.use(middleware);\n });\n\n // Add redirects middleware.\n if (rootConfig.server?.redirects) {\n server.use(\n redirectsMiddleware({redirects: rootConfig.server.redirects})\n );\n }\n\n // Add http headers middleware.\n if (rootConfig.server?.headers) {\n server.use(headersMiddleware({rootConfig: rootConfig}));\n }\n\n // Add static file middleware.\n const publicDir = path.join(distDir, 'html');\n server.use(sirv(publicDir, {dev: false}));\n\n // NOTE: The trailing slash middleware needs to come after public files so\n // that slashes are not appended to public file routes.\n server.use(trailingSlashMiddleware({rootConfig}));\n\n // Add the root.js preview server middlewares.\n server.use(rootProdServerMiddleware());\n\n // Add any custom plugin 404 handlers.\n plugins.forEach((plugin) => {\n if (plugin.handle404) {\n server.use(plugin.handle404);\n }\n });\n\n // Add error handlers.\n server.use(rootProdServer404Middleware());\n server.use(rootProdServer500Middleware());\n },\n plugins,\n {type: 'prod', rootConfig}\n );\n return server;\n}\n\n/**\n * Injects a renderer into the request.\n */\nasync function rootProdRendererMiddleware(options: {\n rootConfig: RootConfig;\n distDir: string;\n}) {\n const {distDir, rootConfig} = options;\n const render: RenderModule = await import(\n path.join(distDir, 'server/render.js')\n );\n const manifestPath = path.join(distDir, '.root/manifest.json');\n if (!(await fileExists(manifestPath))) {\n throw new Error(\n `could not find ${manifestPath}. run \\`root build\\` before \\`root start\\`.`\n );\n }\n const elementGraphJsonPath = path.join(distDir, '.root/elements.json');\n if (!(await fileExists(elementGraphJsonPath))) {\n throw new Error(\n `could not find ${elementGraphJsonPath}. run \\`root build\\` before \\`root start\\`.`\n );\n }\n const rootManifest = await loadJson<BuildAssetManifest>(manifestPath);\n const assetMap = BuildAssetMap.fromRootManifest(rootConfig, rootManifest);\n const elementGraphJson = await loadJson<any>(elementGraphJsonPath);\n const elementGraph = ElementGraph.fromJson(elementGraphJson);\n const renderer = new render.Renderer(rootConfig, {assetMap, elementGraph});\n return async (req: Request, _: Response, next: NextFunction) => {\n req.renderer = renderer;\n next();\n };\n}\n\n/**\n * Prod server request handler.\n */\nfunction rootProdServerMiddleware() {\n return async (req: Request, res: Response, next: NextFunction) => {\n const renderer = req.renderer!;\n try {\n await renderer.handle(req, res, next);\n } catch (e) {\n try {\n console.error(`error rendering ${req.originalUrl}`);\n console.error(e.stack || e);\n const {html} = await renderer.renderError(e);\n res.status(500).set({'Content-Type': 'text/html'}).end(html);\n } catch (e2) {\n console.error('failed to render custom error');\n console.error(e2);\n next(e);\n }\n }\n };\n}\n\nfunction rootProdServer404Middleware() {\n return async (req: Request, res: Response) => {\n console.error(`❓ 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(`❗ 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"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,SAAQ,SAAS,4BAA2B;AAC5C,SAAQ,SAAS,aAAY;;;ACA7B,OAAOA,WAAU;AACjB,SAAQ,qBAAoB;AAE5B,OAAO,aAAa;AACpB,SAAQ,KAAK,YAAW;AACxB,OAAOC,WAAU;AACjB,SAAQ,SAAS,iBAAqD;;;ACPtE,OAAO,QAAQ;AACf,OAAO,UAAU;AACjB,OAAO,UAAU;AACjB,SAAQ,8BAA6B;AAiB9B,IAAM,eAAN,MAAM,cAAa;AAAA;AAAA;AAAA;AAAA,EAIf,cAAsD,CAAC;AAAA;AAAA;AAAA;AAAA,EAKxD,OAAiC,CAAC;AAAA,EAE1C,YAAY,aAAqD;AAC/D,SAAK,cAAc;AAAA,EACrB;AAAA,EAEA,SAAS;AACP,eAAW,WAAW,KAAK,aAAa;AACtC,WAAK,KAAK,OAAO,MAAM,KAAK,oBAAoB,OAAO;AAAA,IACzD;AACA,WAAO;AAAA,MACL,aAAa,KAAK;AAAA,MAClB,MAAM,KAAK;AAAA,IACb;AAAA,EACF;AAAA,EAEA,OAAO,SAAS,MAAqC;AACnD,UAAM,QAAQ,IAAI,cAAa,KAAK,WAAW;AAC/C,UAAM,OAAO,KAAK;AAClB,WAAO;AAAA,EACT;AAAA,EAEA,QAAQ,SAAiB,SAAiC;AACxD,gBAAY,oBAAI,IAAI;AACpB,QAAI,QAAQ,IAAI,OAAO,GAAG;AACxB,aAAO,CAAC;AAAA,IACV;AAEA,YAAQ,IAAI,OAAO;AACnB,SAAK,KAAK,OAAO,MAAM,KAAK,oBAAoB,OAAO;AAEvD,UAAM,OAAO,IAAI,IAAI,KAAK,KAAK,OAAO,CAAC;AACvC,eAAW,cAAc,KAAK,KAAK,OAAO,GAAG;AAC3C,iBAAW,YAAY,KAAK,QAAQ,YAAY,OAAO,GAAG;AACxD,aAAK,IAAI,QAAQ;AAAA,MACnB;AAAA,IACF;AACA,WAAO,MAAM,KAAK,IAAI;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA,EAKQ,oBAAoB,SAA2B;AACrD,UAAM,UAAU,KAAK,YAAY,OAAO;AACxC,QAAI,CAAC,SAAS;AACZ,YAAM,IAAI,MAAM,yCAAyC,OAAO,GAAG;AAAA,IACrE;AACA,UAAM,MAAM,GAAG,aAAa,QAAQ,UAAU,OAAO;AACrD,UAAM,WAAW,cAAc,GAAG;AAClC,UAAM,OAAO,oBAAI,IAAY;AAC7B,eAAW,cAAc,UAAU;AACjC,UAAI,eAAe,WAAW,cAAc,KAAK,aAAa;AAC5D,aAAK,IAAI,UAAU;AAAA,MACrB;AAAA,IACF;AACA,WAAO,MAAM,KAAK,IAAI;AAAA,EACxB;AACF;AAKA,eAAsB,YACpB,YACA,MACuB;AACvB,QAAM,UAAU,WAAW;AAE3B,QAAM,eAAe,gBAAgB,YAAY,IAAI;AACrD,QAAM,kBAAkB,WAAW,UAAU,WAAW,CAAC;AACzD,QAAM,iBAAiB,CAAC,aAAqB;AAC3C,WAAO,gBAAgB,KAAK,CAAC,YAAY,QAAQ,SAAS,MAAM,OAAO,CAAC,CAAC;AAAA,EAC3E;AAEA,QAAM,mBAA2D,CAAC;AAClE,aAAW,WAAW,cAAc;AAClC,QAAI,MAAM,YAAY,OAAO,GAAG;AAC9B,YAAM,QAAQ,MAAM,KAAK,QAAQ,EAAC,KAAK,QAAO,CAAC;AAC/C,YAAM,QAAQ,CAAC,SAAS;AACtB,cAAM,QAAQ,KAAK,MAAM,IAAI;AAC7B,YAAI,SAAS,MAAM,IAAI,KAAK,eAAe,MAAM,IAAI,GAAG;AACtD,gBAAM,UAAU,MAAM;AACtB,gBAAM,WAAW,KAAK,KAAK,SAAS,IAAI;AACxC,gBAAM,UAAU,KAAK,SAAS,SAAS,QAAQ;AAC/C,cAAI,CAAC,eAAe,OAAO,GAAG;AAC5B,6BAAiB,OAAO,IAAI,EAAC,UAAU,QAAO;AAAA,UAChD;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAEA,QAAM,QAAQ,IAAI,aAAa,gBAAgB;AAC/C,SAAO;AACT;AAKO,SAAS,gBAAgB,YAAwB,MAAsB;AAC5E,QAAM,UAAU,WAAW;AAC3B,QAAM,gBAAgB,uBAAuB,OAAO;AAEpD,QAAM,eAAe,CAAC,KAAK,KAAK,SAAS,UAAU,CAAC;AACpD,QAAM,kBAAkB,WAAW,UAAU,WAAW,CAAC;AAEzD,aAAW,WAAW,iBAAiB;AACrC,UAAM,cAAc,KAAK,QAAQ,SAAS,OAAO;AACjD,QAAI,CAAC,kBAAkB,SAAS,WAAW,GAAG;AAC5C,YAAM,IAAI;AAAA,QACR,qBAAqB,OAAO,+CAA+C,aAAa;AAAA,MAC1F;AAAA,IACF;AACA,iBAAa,KAAK,WAAW;AAAA,EAC/B;AAIA,MAAI,MAAM;AACR,eAAW,OAAO,MAAM;AACtB,iBAAW,OAAO,IAAI,cAAc;AAClC,qBAAa,KAAK,GAAG;AAAA,MACvB;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;;;AC7JA,OAAOC,SAAQ;AACf,OAAOC,WAAU;AAkBV,IAAM,gBAAN,MAAM,eAAkC;AAAA,EACrC;AAAA,EACA;AAAA,EAER,YAAY,YAAwB;AAClC,SAAK,aAAa;AAClB,SAAK,aAAa,oBAAI,IAAI;AAAA,EAC5B;AAAA,EAEA,MAAM,IAAI,KAAoC;AAC5C,UAAM,QAAQ,KAAK,WAAW,IAAI,GAAG;AACrC,QAAI,OAAO;AACT,aAAO;AAAA,IACT;AAEA,UAAM,UAAU,mBAAmB,KAAK,WAAW,SAAS,GAAG;AAC/D,QAAI,YAAY,KAAK;AACnB,YAAMC,SAAQ,KAAK,WAAW,IAAI,OAAO;AACzC,UAAIA,QAAO;AACT,eAAOA;AAAA,MACT;AAAA,IACF;AACA,YAAQ,IAAI,+BAA+B,GAAG,EAAE;AAChD,WAAO;AAAA,EACT;AAAA,EAEQ,IAAI,OAAmB;AAC7B,SAAK,WAAW,IAAI,MAAM,KAAK,KAAK;AAAA,EACtC;AAAA,EAEA,SAA6B;AAC3B,UAAM,SAA6B,CAAC;AACpC,eAAW,OAAO,KAAK,WAAW,KAAK,GAAG;AACxC,aAAO,GAAG,IAAI,KAAK,WAAW,IAAI,GAAG,EAAG,OAAO;AAAA,IACjD;AACA,WAAO;AAAA,EACT;AAAA,EAEA,OAAO,iBACL,YACA,gBACA,eACA;AACA,UAAM,WAAW,IAAI,eAAc,UAAU;AAE7C,UAAM,eAAe,oBAAI,IAAI;AAC7B,WAAO,OAAO,cAAc,WAAW,EAAE,QAAQ,CAAC,kBAAkB;AAClE,mBAAa,IAAI,cAAc,OAAO;AAGtC,YAAM,UAAU;AAAA,QACd,WAAW;AAAA,QACX,cAAc;AAAA,MAChB;AACA,UAAI,YAAY,cAAc,UAAU;AACtC,qBAAa,IAAI,OAAO;AAAA,MAC1B;AAAA,IACF,CAAC;AAED,WAAO,KAAK,cAAc,EAAE,QAAQ,CAAC,gBAAgB;AACnD,YAAM,MAAM;AACZ,YAAM,gBAAgB,eAAe,WAAW;AAChD,YAAM,YAAY,aAAa,IAAI,GAAG;AAGtC,YAAM,WACJ,IAAI,WAAW,SAAS,KAAK,SAAS,GAAG,IACrC,KACA,IAAI,cAAc,IAAI;AAC5B,YAAM,YAAY;AAAA,QAChB;AAAA,QACA;AAAA,QACA,iBAAiB,cAAc,WAAW,CAAC;AAAA,QAC3C,cAAc,cAAc,OAAO,CAAC,GAAG,IAAI,CAAC,YAAY,IAAI,OAAO,EAAE;AAAA,QACrE;AAAA,MACF;AACA,eAAS,IAAI,IAAI,WAAW,UAAU,SAAS,CAAC;AAAA,IAClD,CAAC;AAED,WAAO;AAAA,EACT;AAAA,EAEA,OAAO,iBACL,YACA,cACA;AACA,UAAM,WAAW,IAAI,eAAc,UAAU;AAC7C,WAAO,KAAK,YAAY,EAAE,QAAQ,CAAC,aAAa;AAC9C,YAAM,YAAY,aAAa,QAAQ;AACvC,eAAS,IAAI,IAAI,WAAW,UAAU,SAAS,CAAC;AAAA,IAClD,CAAC;AACD,WAAO;AAAA,EACT;AACF;AAKA,SAAS,mBAAmB,SAAiB,KAAa;AACxD,QAAM,WAAWC,MAAK,QAAQ,SAAS,GAAG;AAC1C,MAAI,CAACC,IAAG,WAAW,QAAQ,GAAG;AAC5B,WAAO;AAAA,EACT;AACA,QAAM,WAAWA,IAAG,aAAaD,MAAK,QAAQ,SAAS,GAAG,CAAC;AAC3D,SAAOA,MAAK,SAAS,SAAS,QAAQ;AACxC;AAEO,IAAM,aAAN,MAAiB;AAAA,EACtB;AAAA,EACA;AAAA,EACQ;AAAA,EACA;AAAA,EACA;AAAA,EACR;AAAA,EAEA,YACE,UACA,WAOA;AACA,SAAK,WAAW;AAChB,SAAK,MAAM,UAAU;AACrB,SAAK,WAAW,UAAU;AAC1B,SAAK,kBAAkB,UAAU;AACjC,SAAK,cAAc,UAAU;AAC7B,SAAK,YAAY,UAAU;AAAA,EAC7B;AAAA,EAEA,MAAM,aAAgC;AACpC,UAAM,UAAU,oBAAI,IAAY;AAChC,UAAM,OAAO,oBAAI,IAAY;AAC7B,UAAM,KAAK,WAAW,MAAM,MAAM,OAAO;AACzC,WAAO,MAAM,KAAK,IAAI;AAAA,EACxB;AAAA,EAEA,MAAM,YAA+B;AACnC,UAAM,UAAU,oBAAI,IAAY;AAChC,UAAM,OAAO,oBAAI,IAAY;AAC7B,UAAM,KAAK,UAAU,MAAM,MAAM,OAAO;AACxC,WAAO,MAAM,KAAK,IAAI;AAAA,EACxB;AAAA,EAEA,MAAc,UACZ,OACA,MACA,SACA;AACA,QAAI,CAAC,OAAO;AACV;AAAA,IACF;AACA,QAAI,CAAC,MAAM,KAAK;AACd;AAAA,IACF;AACA,QAAI,QAAQ,IAAI,MAAM,GAAG,GAAG;AAC1B;AAAA,IACF;AACA,YAAQ,IAAI,MAAM,GAAG;AACrB,QAAI,MAAM,WAAW;AACnB,WAAK,IAAI,MAAM,QAAQ;AAAA,IACzB;AACA,UAAM,QAAQ;AAAA,MACZ,MAAM,gBAAgB,IAAI,OAAO,QAAQ;AACvC,cAAM,gBAAiB,MAAM,KAAK,SAAS,IAAI,GAAG;AAClD,aAAK,UAAU,eAAe,MAAM,OAAO;AAAA,MAC7C,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAc,WACZ,OACA,MACA,SACA;AACA,QAAI,CAAC,OAAO;AACV;AAAA,IACF;AACA,QAAI,CAAC,MAAM,KAAK;AACd;AAAA,IACF;AACA,QAAI,QAAQ,IAAI,MAAM,GAAG,GAAG;AAC1B;AAAA,IACF;AACA,YAAQ,IAAI,MAAM,GAAG;AACrB,QAAI,MAAM,aAAa;AACrB,YAAM,YAAY,QAAQ,CAAC,WAAW,KAAK,IAAI,MAAM,CAAC;AAAA,IACxD;AACA,UAAM,QAAQ;AAAA,MACZ,MAAM,gBAAgB,IAAI,OAAO,aAAa;AAC5C,cAAM,gBAAiB,MAAM,KAAK,SAAS,IAAI,QAAQ;AACvD,aAAK,WAAW,eAAe,MAAM,OAAO;AAAA,MAC9C,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,SAAS;AACP,WAAO;AAAA,MACL,KAAK,KAAK;AAAA,MACV,UAAU,KAAK;AAAA,MACf,iBAAiB,KAAK;AAAA,MACtB,aAAa,KAAK;AAAA,MAClB,WAAW,KAAK;AAAA,IAClB;AAAA,EACF;AACF;;;ACnOA,eAAsB,gBACpB,MACA,aACA,eACc;AACd,QAAM,SAAc,IAAI,MAAM,KAAK,MAAM;AACzC,MAAI,YAAY;AAEhB,iBAAe,SAAS;AACtB,WAAO,YAAY,KAAK,QAAQ;AAC9B,YAAM,QAAQ;AACd,aAAO,KAAK,IAAI,MAAM,cAAc,KAAK,KAAK,CAAC;AAAA,IACjD;AAAA,EACF;AAEA,QAAM,UAAU,MAAM;AAAA,IACpB,EAAC,QAAQ,KAAK,IAAI,aAAa,KAAK,MAAM,EAAC;AAAA,IAC3C,MAAM,OAAO;AAAA,EACf;AACA,QAAM,QAAQ,IAAI,OAAO;AACzB,SAAO;AACT;;;AHUA,IAAM,YAAYE,MAAK,QAAQ,cAAc,YAAY,GAAG,CAAC;AAW7D,eAAsB,MAAM,gBAAyB,SAAwB;AAC3E,QAAM,OAAO,SAAS,QAAQ;AAC9B,UAAQ,IAAI,WAAW;AAEvB,QAAM,UAAUA,MAAK,QAAQ,kBAAkB,QAAQ,IAAI,CAAC;AAC5D,QAAM,aAAa,MAAM,eAAe,SAAS,EAAC,SAAS,QAAO,CAAC;AACnE,QAAM,UAAUA,MAAK,KAAK,SAAS,MAAM;AACzC,QAAM,UAAU,SAAS,WAAW;AAEpC,UAAQ,IAAI;AACZ,UAAQ,IAAI,GAAG,IAAI,QAAG,CAAC,cAAc,OAAO,EAAE;AAC9C,UAAQ,IAAI,GAAG,IAAI,QAAG,CAAC,cAAc,OAAO,OAAO;AACnD,UAAQ,IAAI,GAAG,IAAI,QAAG,CAAC,cAAc,IAAI,EAAE;AAC3C,UAAQ,IAAI;AAEZ,QAAM,MAAM,OAAO;AACnB,QAAM,QAAQ,OAAO;AAErB,QAAM,OAAO,MAAM,YAAY,UAAU;AAEzC,QAAM,aAAuB,CAAC;AAC9B,MAAI,MAAM,YAAYA,MAAK,KAAK,SAAS,QAAQ,CAAC,GAAG;AACnD,UAAM,YAAY,MAAMC,MAAK,eAAe,EAAC,KAAK,QAAO,CAAC;AAC1D,cAAU,QAAQ,CAAC,SAAS;AAC1B,YAAM,QAAQD,MAAK,MAAM,IAAI;AAC7B,UAAI,CAAC,MAAM,KAAK,WAAW,GAAG,KAAK,SAAS,MAAM,IAAI,GAAG;AACvD,mBAAW,KAAKA,MAAK,QAAQ,SAAS,IAAI,CAAC;AAAA,MAC7C;AAAA,IACF,CAAC;AAAA,EACH;AAEA,aAAW,OAAO,MAAM;AACtB,eAAW,SAAS,IAAI,YAAY;AAClC,iBAAW,KAAK,MAAM,QAAQ;AAAA,IAChC;AAAA,EACF;AAEA,QAAM,eAAe,MAAM,YAAY,YAAY,IAAI;AACvD,QAAM,WAAW,OAAO,OAAO,aAAa,WAAW,EAAE,IAAI,CAAC,eAAe;AAC3E,WAAO,WAAW;AAAA,EACpB,CAAC;AAED,QAAM,gBAA0B,CAAC;AACjC,MAAI,MAAM,YAAYA,MAAK,KAAK,SAAS,SAAS,CAAC,GAAG;AACpD,UAAM,cAAc,MAAMC,MAAK,aAAa,EAAC,KAAK,QAAO,CAAC;AAC1D,gBAAY,QAAQ,CAAC,SAAS;AAC5B,YAAM,QAAQD,MAAK,MAAM,IAAI;AAC7B,UAAI,SAAS,MAAM,IAAI,GAAG;AACxB,sBAAc,KAAKA,MAAK,QAAQ,SAAS,IAAI,CAAC;AAAA,MAChD;AAAA,IACF,CAAC;AAAA,EACH;AAEA,aAAW,OAAO,MAAM;AACtB,eAAW,cAAc,IAAI,aAAa;AACxC,oBAAc,KAAK,UAAU;AAAA,IAC/B;AAAA,EACF;AAEA,QAAM,cAAc,WAAW,WAAW,CAAC;AAC3C,QAAM,aAAa,WAAW,QAAQ,CAAC;AAEvC,aAAW,UAAU,aAAa;AAChC,QAAI,OAAO,OAAO,UAAU;AAC1B,YAAM,OAAO,MAAM,SAAS,UAAU;AAAA,IACxC;AAAA,EACF;AAEA,QAAM,cAAc;AAAA,IAClB,sBAAsB,EAAC,YAAY,CAAC,CAAC,WAAW,aAAa,KAAI,CAAC;AAAA,IAClE,mBAAmB,UAAU;AAAA,IAC7B,GAAI,WAAW,WAAW,CAAC;AAAA,IAC3B,GAAG,eAAe,WAAW;AAAA,EAC/B;AAEA,QAAM,aAAyB;AAAA,IAC7B,GAAG;AAAA,IACH,MAAM;AAAA,IACN;AAAA,IACA,SAAS;AAAA,EACX;AAKA,QAAM,WAAW;AAAA,IACf,QAAQA,MAAK,QAAQ,WAAW,aAAa;AAAA,EAC/C;AACA,cAAY,QAAQ,CAAC,WAAW;AAC9B,QAAI,OAAO,UAAU;AACnB,aAAO,OAAO,UAAU,OAAO,SAAS,CAAC;AAAA,IAC3C;AAAA,EACF,CAAC;AACD,QAAM,mBAAmB,WAAW,KAAK;AACzC,QAAM,aAAqC,CAAC;AAC5C,MAAI,kBAAkB;AACpB,QAAI,MAAM,QAAQ,gBAAgB,GAAG;AACnC,iBAAW,KAAK,GAAG,gBAAgB;AAAA,IACrC,OAAO;AACL,iBAAW,KAAK,gBAAmC;AAAA,IACrD;AAAA,EACF;AACA,QAAM,UAAU;AAAA,IACd,GAAG;AAAA,IACH,WAAW;AAAA,IACX,OAAO;AAAA,MACL,GAAG,YAAY;AAAA,MACf,iBAAiB;AAAA,QACf,GAAG,YAAY,OAAO;AAAA,QACtB,OAAO;AAAA,QACP,QAAQ;AAAA,UACN,QAAQ;AAAA,UACR,gBAAgB;AAAA,UAChB,gBAAgB;AAAA,UAChB;AAAA,QACF;AAAA,MACF;AAAA,MACA,QAAQA,MAAK,KAAK,SAAS,QAAQ;AAAA,MACnC,KAAK;AAAA,MACL,aAAa;AAAA,MACb,cAAc;AAAA,MACd,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,eAAe,EAAC,UAAU,MAAK;AAAA,MAC/B,sBAAsB;AAAA,MACtB,WAAW;AAAA,IACb;AAAA,IACA,KAAK;AAAA,MACH,GAAG,WAAW;AAAA,MACd,QAAQ;AAAA,MACR,YAAY,CAAC,gBAAgB,aAAa,GAAG,UAAU;AAAA,IACzD;AAAA,EACF,CAAC;AAGD,QAAM,UAAU;AAAA,IACd,GAAG;AAAA,IACH,WAAW;AAAA,IACX,OAAO;AAAA,MACL,GAAG,YAAY;AAAA,MACf,iBAAiB;AAAA,QACf,GAAG,YAAY,OAAO;AAAA,QACtB,OAAO,CAAC,GAAG,UAAU;AAAA,QACrB,QAAQ;AAAA,UACN,QAAQ;AAAA,UACR,gBAAgB;AAAA,UAChB,gBAAgB;AAAA,UAChB,gBAAgB;AAAA,UAChB;AAAA,UACA,GAAG,YAAY,OAAO,iBAAiB;AAAA,QACzC;AAAA,MACF;AAAA,MACA,QAAQA,MAAK,KAAK,SAAS,eAAe;AAAA,MAC1C,KAAK;AAAA,MACL,aAAa;AAAA,MACb,eAAe;AAAA,MACf,UAAU;AAAA,MACV,cAAc;AAAA,MACd,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,eAAe,EAAC,UAAU,MAAK;AAAA,MAC/B,sBAAsB;AAAA,IACxB;AAAA,EACF,CAAC;AAGD,QAAM,cAAc,CAAC,GAAG,UAAU,GAAG,aAAa;AAClD,MAAI,YAAY,SAAS,GAAG;AAC1B,UAAM,UAAU;AAAA,MACd,GAAG;AAAA,MACH,WAAW;AAAA,MACX,OAAO;AAAA,QACL,GAAG,YAAY;AAAA,QACf,iBAAiB;AAAA,UACf,GAAG,YAAY,OAAO;AAAA,UACtB,OAAO,CAAC,GAAG,UAAU,GAAG,aAAa;AAAA,UACrC,QAAQ;AAAA,YACN,QAAQ;AAAA,YACR,gBAAgB;AAAA,YAChB,gBAAgB;AAAA,YAChB,gBAAgB;AAAA,YAChB;AAAA,YACA,GAAG,YAAY,OAAO,iBAAiB;AAAA,UACzC;AAAA,QACF;AAAA,QACA,QAAQA,MAAK,KAAK,SAAS,eAAe;AAAA,QAC1C,KAAK;AAAA,QACL,aAAa;AAAA,QACb,UAAU;AAAA,QACV,cAAc;AAAA,QACd,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,eAAe,EAAC,UAAU,MAAK;AAAA,QAC/B,sBAAsB;AAAA,MACxB;AAAA,IACF,CAAC;AAAA,EACH,OAAO;AACL,UAAM;AAAA,MACJA,MAAK,KAAK,SAAS,mCAAmC;AAAA,MACtD;AAAA,IACF;AAAA,EACF;AAGA,QAAM,iBAAiB,SAASA,MAAK,KAAK,SAAS,gBAAgB,CAAC;AAKpE,QAAM;AAAA,IACJ;AAAA,IACAA,MAAK,KAAK,SAAS,eAAe;AAAA,IAClCA,MAAK,KAAK,SAAS,eAAe;AAAA,EACpC;AACA,QAAM,iBAAiB,MAAM;AAAA,IAC3BA,MAAK,KAAK,SAAS,mCAAmC;AAAA,EACxD;AACA,QAAM,iBAAiB,MAAM;AAAA,IAC3BA,MAAK,KAAK,SAAS,mCAAmC;AAAA,EACxD;AACA,WAAS,gBACP,OACA,SACA,SACA;AACA,QAAI,CAAC,SAAS,CAAC,MAAM,QAAQ,QAAQ,IAAI,MAAM,IAAI,GAAG;AACpD;AAAA,IACF;AACA,YAAQ,IAAI,MAAM,IAAI;AACtB,QAAI,MAAM,KAAK;AACb,YAAM,IAAI,QAAQ,CAAC,QAAQ,QAAQ,IAAI,GAAG,CAAC;AAAA,IAC7C;AACA,QAAI,MAAM,SAAS;AACjB,YAAM,QAAQ,QAAQ,CAAC,gBAAgB;AACrC,wBAAgB,eAAe,WAAW,GAAG,SAAS,OAAO;AAAA,MAC/D,CAAC;AAAA,IACH;AAAA,EACF;AACA,SAAO,KAAK,cAAc,EAAE,QAAQ,CAAC,gBAAgB;AACnD,UAAM,QAAQ,eAAe,WAAW;AACxC,QAAI,MAAM,SAAS;AACjB,YAAM,UAAU,oBAAI,IAAY;AAChC,YAAM,UAAU,oBAAI,IAAY;AAChC,sBAAgB,OAAO,SAAS,OAAO;AACvC,YAAM,MAAM,MAAM,KAAK,OAAO;AAC9B,YAAM,UAAU,CAAC;AACjB,qBAAe,WAAW,IAAI;AAAA,IAChC,WAAW,MAAM,KAAK,SAAS,MAAM,GAAG;AACtC,qBAAe,WAAW,IAAI;AAAA,IAChC;AAAA,EACF,CAAC;AAID,QAAM,WAAW,cAAc;AAAA,IAC7B;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAIA,QAAM,eAAe,SAAS,OAAO;AACrC,QAAM;AAAA,IACJA,MAAK,KAAK,SAAS,qBAAqB;AAAA,IACxC,KAAK,UAAU,cAAc,MAAM,CAAC;AAAA,EACtC;AAIA,QAAM,mBAAmB,aAAa,OAAO;AAC7C,QAAM;AAAA,IACJA,MAAK,KAAK,SAAS,qBAAqB;AAAA,IACxC,KAAK,UAAU,kBAAkB,MAAM,CAAC;AAAA,EAC1C;AAGA,QAAM,WAAWA,MAAK,KAAK,SAAS,MAAM;AAG1C,QAAM,YAAYA,MAAK,KAAK,SAAS,QAAQ;AAC7C,MAAI,QAAQ,WAAWA,MAAK,KAAK,SAAS,QAAQ,CAAC,GAAG;AACpD,YAAQ,SAAS,WAAW,UAAU,EAAC,aAAa,KAAI,CAAC;AAAA,EAC3D,OAAO;AACL,UAAM,QAAQ,QAAQ;AAAA,EACxB;AAEA,QAAM,aAAa,oBAAI,IAAY;AACnC,iBAAe,oBAAoB,UAAkB;AACnD,QAAI,WAAW,IAAI,QAAQ,GAAG;AAC5B;AAAA,IACF;AACA,eAAW,IAAI,QAAQ;AACvB,UAAM,eAAe,SAAS,MAAM,CAAC;AACrC,UAAM,YAAYA,MAAK,KAAK,SAAS,iBAAiB,YAAY;AAClE,UAAM,UAAUA,MAAK,KAAK,UAAU,YAAY;AAGhD,QAAI,CAAE,MAAM,WAAW,SAAS,GAAI;AAClC,cAAQ,IAAI,GAAG,SAAS,iBAAiB;AACzC;AAAA,IACF;AACA,UAAM,QAAQ,KAAK,WAAW,OAAO;AACrC,oBAAgB,SAAS,OAAO,GAAG,cAAc,YAAY;AAAA,EAC/D;AAIA,UAAQ,IAAI,kBAAkB;AAC9B,QAAM,QAAQ;AAAA,IACZ,OAAO,KAAK,YAAY,EAAE,IAAI,OAAO,QAAQ;AAC3C,YAAM,YAAY,aAAa,GAAG;AAKlC,UAAI,YAAY,GAAG,GAAG;AACpB,cAAME,eAAc,UAAU,eAAe,CAAC;AAC9C,mBAAW,eAAeA,cAAa;AACrC,gBAAM,oBAAoB,WAAW;AAAA,QACvC;AACA;AAAA,MACF;AAIA,UAAI,CAAC,UAAU,UAAU;AACvB;AAAA,MACF;AAGA,YAAM,oBAAoB,UAAU,QAAQ;AAC5C,YAAM,cAAc,UAAU,eAAe,CAAC;AAC9C,iBAAW,eAAe,aAAa;AACrC,cAAM,oBAAoB,WAAW;AAAA,MACvC;AAAA,IACF,CAAC;AAAA,EACH;AAGA,MAAI,CAAC,SAAS;AACZ,UAAM,SAAuB,MAAM,OACjCF,MAAK,KAAK,SAAS,kBAAkB;AAEvC,UAAM,WAAW,IAAI,OAAO,SAAS,YAAY,EAAC,UAAU,aAAY,CAAC;AACzE,QAAI,UAAU,MAAM,SAAS,WAAW;AAIxC,QAAI,SAAS,QAAQ;AACnB,YAAM,cAAc,IAAI,OAAO,IAAI,QAAQ,MAAM,EAAE;AACnD,YAAM,kBAA2B,CAAC;AAClC,aAAO,QAAQ,OAAO,EAAE,QAAQ,CAAC,CAAC,SAAS,WAAW,MAAM;AAC1D,YAAI,QAAQ,MAAM,WAAW,GAAG;AAC9B,0BAAgB,OAAO,IAAI;AAAA,QAC7B;AAAA,MACF,CAAC;AACD,gBAAU;AAAA,IACZ;AAEA,UAAM,kBAID,CAAC;AACN,QAAI,WAAW,WAAW,CAAC,WAAW,QAAQ;AAC5C,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AACA,UAAM,SAAS,WAAW;AAE1B,YAAQ,IAAI,gBAAgB;AAC5B,UAAM,YAAY,OAAO,SAAS,eAAe,EAAE;AAEnD,UAAM;AAAA,MACJ,OAAO,QAAQ,OAAO;AAAA,MACtB;AAAA,MACA,OAAO,CAAC,SAAS,WAAW,MAAM;AAGhC,YAAI,WAAW,OAAO,mCAAmC;AACvD,gBAAM,gBAAgB,WAAW,MAAM,iBAAiB;AACxD,cAAI,YAAY,WAAW,eAAe;AACxC;AAAA,UACF;AAAA,QACF;AAEA,YAAI;AACF,gBAAM,cAAc,YAAY,MAAM;AACtC,cAAI,YAAY,kBAAkB;AAChC,gBAAI;AACJ,gBAAI,YAAY,gBAAgB;AAC9B,sBAAQ,MAAM,YAAY,eAAe;AAAA,gBACvC;AAAA,gBACA,QAAQ,YAAY;AAAA,cACtB,CAAC;AACD,kBAAI,OAAO,UAAU;AACnB;AAAA,cACF;AAAA,YACF,OAAO;AACL,sBAAQ,EAAC,YAAY,QAAQ,YAAY,OAAM;AAAA,YACjD;AACA,kBAAM,SAAS,MAAM,YAAY,iBAAiB,KAAK;AACvD,gBAAI;AACJ,gBAAI,OAAO,WAAW,UAAU;AAC9B,qBAAO;AAAA,YACT,WAAW,UAAU,OAAO,WAAW,UAAU;AAC/C,qBAAO,OAAO;AAAA,YAChB,OAAO;AACL,qBAAO;AAAA,YACT;AACA,kBAAMG,eAAc,QAAQ,MAAM,CAAC;AACnC,kBAAMC,WAAUJ,MAAK,KAAK,UAAUG,YAAW;AAC/C,kBAAM,QAAQH,MAAK,QAAQI,QAAO,CAAC;AACnC,kBAAM,UAAUA,UAAS,IAAI;AAC7B,4BAAgB,SAASA,QAAO,GAAG,cAAcD,YAAW;AAC5D;AAAA,UACF;AAEA,gBAAM,OAAO,MAAM,SAAS,YAAY,YAAY,OAAO;AAAA,YACzD,aAAa,YAAY;AAAA,UAC3B,CAAC;AACD,cAAI,KAAK,UAAU;AACjB;AAAA,UACF;AAEA,cAAI,cAAcH,MAAK,KAAK,QAAQ,MAAM,CAAC,GAAG,YAAY;AAC1D,cAAI,YAAY,SAAS,gBAAgB,GAAG;AAC1C,0BAAc,YAAY,QAAQ,kBAAkB,UAAU;AAAA,UAChE;AACA,gBAAM,UAAUA,MAAK,KAAK,UAAU,WAAW;AAG/C,cAAI,WAAW,WAAW,YAAY,SAAS,YAAY,GAAG;AAC5D,kBAAM,iBAIF;AAAA,cACF,KAAK,GAAG,MAAM,GAAG,OAAO;AAAA,cACxB,QAAQ,YAAY;AAAA,cACpB,MAAM,CAAC;AAAA,YACT;AACA,4BAAgB,KAAK,cAAc;AACnC,gBAAI,YAAY,MAAM;AACpB,qBAAO,QAAQ,YAAY,IAAI,EAAE,QAAQ,CAAC,CAAC,WAAW,IAAI,MAAM;AAC9D,+BAAe,KAAK,KAAK;AAAA,kBACvB,KAAK,GAAG,MAAM,GAAG,KAAK,OAAO;AAAA,kBAC7B,QAAQ;AAAA,kBACR,UAAU,KAAK;AAAA,gBACjB,CAAC;AAAA,cACH,CAAC;AAAA,YACH;AAAA,UACF;AAIA,cAAI,OAAO,KAAK,QAAQ;AACxB,cAAI,WAAW,YAAY;AACzB,mBAAO,MAAM,WAAW,MAAM,WAAW,iBAAiB;AAAA,UAC5D,WAAW,WAAW,YAAY;AAChC,mBAAO,MAAM,WAAW,MAAM,WAAW,iBAAiB;AAAA,UAC5D;AACA,gBAAM,UAAU,SAAS,IAAI;AAE7B,0BAAgB,SAAS,OAAO,GAAG,cAAc,WAAW;AAAA,QAC9D,SAAS,GAAG;AACV;AAAA,YACE,EAAC,OAAO,YAAY,OAAO,QAAQ,YAAY,QAAQ,QAAO;AAAA,YAC9D;AAAA,UACF;AACA,gBAAM,IAAI;AAAA,YACR,eAAe,OAAO,KAAK,YAAY,MAAM,GAAG;AAAA,UAClD;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAGA,QAAI,WAAW,SAAS;AACtB,YAAM,oBAA8B,CAAC;AACrC,sBAAgB,KAAK,CAAC,GAAG,MAAM,EAAE,IAAI,cAAc,EAAE,GAAG,CAAC;AACzD,sBAAgB,QAAQ,CAAC,SAAS;AAChC,0BAAkB,KAAK,OAAO;AAC9B,0BAAkB,KAAK,UAAU,KAAK,GAAG,QAAQ;AACjD,YAAI,KAAK,KAAK,SAAS,GAAG;AACxB,eAAK,KAAK,KAAK,CAAC,GAAG,MAAM,EAAE,SAAS,cAAc,EAAE,QAAQ,CAAC;AAC7D,eAAK,KAAK,QAAQ,CAAC,QAAQ;AACzB,gBAAI,KAAK,WAAW,IAAI,QAAQ;AAC9B,gCAAkB;AAAA,gBAChB,2CAA2C,IAAI,QAAQ,WAAW,IAAI,GAAG;AAAA,cAC3E;AAAA,YACF;AAAA,UACF,CAAC;AAAA,QACH;AACA,0BAAkB,KAAK,QAAQ;AAAA,MACjC,CAAC;AAED,YAAM,kBAAkB;AAAA,QACtB;AAAA,QACA;AAAA,QACA,GAAG;AAAA,QACH;AAAA,MACF;AACA,YAAM,aAAa,gBAAgB,KAAK,IAAI;AAC5C,YAAM,UAAUA,MAAK,KAAK,UAAU,aAAa;AACjD,YAAM,UAAU,SAAS,UAAU;AACnC,sBAAgB,SAAS,OAAO,GAAG,cAAc,aAAa;AAAA,IAChE;AAAA,EACF;AAGA,aAAW,UAAU,aAAa;AAChC,QAAI,OAAO,OAAO,WAAW;AAC3B,YAAM,OAAO,MAAM,UAAU,YAAY,EAAC,QAAO,CAAC;AAAA,IACpD;AAAA,EACF;AACF;AAEA,SAAS,YAAY,UAAkB;AACrC,SAAO,SAAS,WAAW,QAAQ,KAAK,SAAS,QAAQ;AAC3D;AAEA,SAAS,SAAS,UAAkB;AAClC,QAAM,QAAQ,QAAQ,SAAS,QAAQ;AACvC,QAAM,QAAQ,MAAM;AAEpB,QAAM,IAAI;AACV,MAAI,QAAQ,GAAG;AACb,YAAQ,QAAQ,GAAG,QAAQ,CAAC,IAAI;AAAA,EAClC;AACA,QAAM,QAAQ,CAAC,KAAK,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,IAAI;AAClE,QAAM,IAAI,KAAK,MAAM,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,CAAC,CAAC;AAClD,SAAO,YAAY,QAAQ,KAAK,IAAI,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC,IAAI,MAAM,MAAM,CAAC;AACxE;AAEA,SAAS,gBACPK,WACA,WACA,YACA;AACA,QAAM,SAAS,IAAI,OAAO,CAAC;AAC3B,QAAM,aAAaA,UAAS,SAAS,GAAG,GAAG;AAC3C,UAAQ;AAAA,IACN,GAAG,MAAM,GAAG,IAAI,UAAU,CAAC,KAAK,IAAI,SAAS,CAAC,GAAG,KAAK,UAAU,CAAC;AAAA,EACnE;AACF;AAEA,SAAS,iBAAiB,MAAsB;AAC9C,SACE,KAEG,WAAW,OAAO,EAAE,EACpB,WAAW,KAAK,EAAE,EAClB,WAAW,KAAK,EAAE,EAClB,WAAW,KAAK,EAAE,EAElB,QAAQ,iBAAiB,EAAE,EAC3B,QAAQ,SAAS,EAAE,EACnB,YAAY;AAEnB;AAQA,SAAS,cAAc,KAAmB,GAAU;AAClD,QAAM,EAAC,OAAO,QAAQ,QAAO,IAAI;AACjC,QAAM,cAAc,OAAO,EAAE,SAAS,CAAC;AACvC,UAAQ,MAAM;AACd,MAAI,OAAO,KAAK,MAAM,EAAE,SAAS,GAAG;AAClC,YAAQ;AAAA,MACN,8BAA8B,OAAO,KAAK,MAAM,GAAG;AAAA,EACvD,aAAa,MAAM,CAAC;AAAA;AAAA;AAAA,IAGlB,WAAW;AAAA,IACX,KAAK;AAAA,IACL;AAAA,EACF,OAAO;AACL,YAAQ;AAAA,MACN,8BAA8B,OAAO,KAAK,MAAM,GAAG;AAAA;AAAA;AAAA,IAGrD,WAAW;AAAA,IACX;AAAA,EACF;AACF;AAEA,SAAS,aAAa,QAAgC;AACpD,SAAO,OAAO,QAAQ,MAAM,EACzB,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM;AACrB,WAAO,KAAK,GAAG,KAAK,KAAK;AAAA,EAC3B,CAAC,EACA,KAAK,IAAI;AACd;;;AIjoBA,SAAQ,YAAYC,WAAS;AAC7B,OAAOC,WAAU;AACjB,SAAQ,iBAAAC,sBAAoB;AAC5B,OAAOC,WAAU;AAGjB,IAAMC,aAAYC,MAAK,QAAQC,eAAc,YAAY,GAAG,CAAC;AAY7D,eAAsB,QACpB,MACA,MACA,SACA;AACA,QAAM,UAAUD,MAAK,QAAQ,QAAQ,IAAI,CAAC;AAC1C,QAAM,UAAU,IAAI,QAAQ,OAAO;AACnC,QAAM,QAAQ,aAAa,MAAM,MAAM,OAAO;AAChD;AAEA,IAAM,UAAN,MAAc;AAAA,EACZ;AAAA,EACA;AAAA,EAEA,YAAY,SAAiB;AAC3B,SAAK,UAAU;AACf,SAAK,UAAU;AAAA,MACbA,MAAK,KAAK,SAAS,SAAS;AAAA,MAC5BA,MAAK,KAAKD,YAAW,YAAY;AAAA,IACnC;AAAA,EACF;AAAA,EAEA,MAAM,aAAa,MAAc,MAAc,SAA0B;AACvE,UAAM,QAAQ,MAAM,KAAK,UAAU,IAAI;AACvC,QAAI,OAAO,KAAK,KAAK,EAAE,WAAW,GAAG;AACnC,cAAQ,IAAI,uBAAuB,IAAI,QAAQ;AAC/C;AAAA,IACF;AAIA,UAAM,UAAU,SAAS,OAAO,GAAG,IAAI;AACvC,UAAM,SAASC,MAAK,KAAK,KAAK,SAAS,SAAS,IAAI;AACpD,QAAI,MAAM,UAAU,MAAM,GAAG;AAC3B,YAAM,MAAM,MAAM;AAAA,IACpB;AACA,UAAM,QAAQ,MAAM;AAEpB,eAAW,WAAW,OAAO;AAC3B,YAAM,MAAM,MAAM,MAAM,OAAO,EAAE,KAAK;AACtC,YAAM,UAAU,IACb,WAAW,YAAY,IAAI,EAC3B,WAAW,wBAAwB,iBAAiB,IAAI,CAAC;AAC5D,YAAM,WAAW,QAAQ,QAAQ,UAAU,IAAI;AAC/C,YAAM,WAAWA,MAAK,KAAK,QAAQ,QAAQ;AAC3C,YAAM,UAAU,UAAU,OAAO;AACjC,cAAQ,IAAI,SAAS,QAAQ,EAAE;AAAA,IACjC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,UAAU,MAAoC;AAClD,eAAW,UAAU,KAAK,SAAS;AACjC,YAAM,UAAUA,MAAK,KAAK,QAAQ,IAAI;AACtC,UAAI,MAAM,UAAU,OAAO,GAAG;AAC5B,eAAO,KAAK,aAAa,OAAO;AAAA,MAClC;AAAA,IACF;AACA,WAAO,CAAC;AAAA,EACV;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,aAAa,SAAuC;AAChE,UAAM,WAAwB,CAAC;AAC/B,UAAM,QAAQ,MAAME,MAAK,SAAS,EAAC,KAAK,QAAO,CAAC;AAChD,eAAW,YAAY,OAAO;AAC5B,YAAM,WAAWF,MAAK,KAAK,SAAS,QAAQ;AAE5C,YAAM,OAAO,SAAS,MAAM,GAAG,EAAE;AACjC,eAAS,IAAI,IAAI;AAAA,QACf,MAAM,MAAMG,IAAG,SAAS,UAAU,OAAO;AAAA,MAC3C;AAAA,IACF;AACA,WAAO;AAAA,EACT;AACF;AAEA,SAAS,iBAAiB,KAAa;AACrC,QAAM,WAAW,IAAI,MAAM,GAAG;AAC9B,SAAO,SAAS,IAAI,CAAC,SAAS,YAAY,IAAI,CAAC,EAAE,KAAK,EAAE;AAC1D;AAEA,SAAS,YAAY,KAAa;AAChC,QAAM,KAAK,OAAO,GAAG,EAAE,OAAO,CAAC,EAAE,YAAY;AAC7C,SAAO,GAAG,EAAE,GAAG,IAAI,MAAM,CAAC,CAAC;AAC7B;;;AC5GA,SAAQ,YAAYC,WAAS;AAC7B,OAAOC,WAAU;AACjB,SAAQ,SAAS,eAAc;AAoC/B,eAAsB,cACpB,gBACA,SACA;AACA,QAAM,OAAO,SAAS,QAAQ;AAC9B,UAAQ,IAAI,WAAW;AAEvB,QAAM,UAAUC,MAAK,QAAQ,kBAAkB,QAAQ,IAAI,CAAC;AAE5D,QAAM,UAAUA,MAAK,KAAK,SAAS,MAAM;AACzC,QAAM,SAAS,SAAS,UAAW,MAAM,iBAAiB,OAAO;AACjE,QAAM,SAASA,MAAK,QAAQ,SAAS,OAAO,UAAU,KAAK;AAG3D,QAAM,MAAU,gBAAgB,EAAC,SAAS,MAAM,KAAU,CAAC;AAG3D,QAAM,MAAM,MAAM;AAClB,QAAM,QAAQ,MAAM;AACpB,QAAM,QAAQ,SAASA,MAAK,QAAQ,QAAQ,MAAM,CAAC;AAGnD,QAAM,iBAAiBA,MAAK,QAAQ,SAAS,aAAa;AAC1D,MAAI,MAAM,UAAU,cAAc,GAAG;AACnC,UAAM,QAAQ,gBAAgBA,MAAK,KAAK,QAAQ,aAAa,CAAC;AAAA,EAChE;AAGA,QAAM,cAAc,MAAM,oBAAoB,SAAS,OAAO;AAG9D,MAAI,SAAS,WAAW,YAAY,cAAc;AAChD,QAAI,YAAY,aAAa,cAAc,GAAG;AAC5C,kBAAY,aAAa,cAAc,IAAI,QAAQ;AAAA,IACrD;AACA,QAAI,YAAY,aAAa,kBAAkB,GAAG;AAChD,kBAAY,aAAa,kBAAkB,IAAI,QAAQ;AAAA,IACzD;AACA,QAAI,YAAY,aAAa,+BAA+B,GAAG;AAC7D,kBAAY,aAAa,+BAA+B,IACtD,QAAQ;AAAA,IACZ;AAAA,EACF;AAGA,MAAI,WAAW,aAAa;AAC1B,UAAM,cAAc,SAAS,WAAWA,MAAK,KAAK,SAAS,UAAU;AACrE,UAAM,YAAY,EAAC,aAAa,QAAQ,YAAW,CAAC;AAAA,EACtD,WAAW,WAAW,YAAY;AAChC,UAAM,WAAW,EAAC,SAAS,aAAa,OAAM,CAAC;AAAA,EACjD;AAGA,QAAM,UAAUA,MAAK,QAAQ,QAAQ,cAAc,GAAG,WAAW;AAEjE,UAAQ,IAAI,OAAO;AACnB,UAAQ,IAAI,oBAAoB,MAAM,EAAE;AAC1C;AAEA,eAAe,iBAAiB,SAA+C;AAE7E,QAAM,qBAAqBA,MAAK,QAAQ,SAAS,eAAe;AAChE,MAAI,MAAM,WAAW,kBAAkB,GAAG;AACxC,WAAO;AAAA,EACT;AAGA,QAAM,sBAAsBA,MAAK,QAAQ,SAAS,UAAU;AAC5D,MAAI,MAAM,WAAW,mBAAmB,GAAG;AACzC,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,eAAe,oBACb,SACA,SACsB;AAEtB,QAAM,cAA2B,MAAM;AAAA,IACrCA,MAAK,QAAQ,SAAS,cAAc;AAAA,EACtC;AAIA,QAAM,UAAU,+BAA+B,OAAO;AACtD,cAAY,iBAAiB,CAAC;AAC9B,aAAW,WAAW,SAAS;AAC7B,QAAI,CAAC,YAAY,aAAa,OAAO,GAAG;AACtC,kBAAY,aAAa,OAAO,IAAI,QAAQ,OAAO;AAAA,IACrD;AAAA,EACF;AAEA,SAAO,QAAQ,YAAY,YAAY,EAAE,QAAQ,CAAC,CAAC,SAAS,UAAU,MAAM;AAC1E,QAAI,QAAQ,WAAW,cAAc,KAAK,SAAS,SAAS;AAE1D,kBAAY,aAAc,OAAO,IAAI,QAAQ;AAAA,IAC/C,WAAW,WAAW,WAAW,YAAY,GAAG;AAE9C,aAAO,YAAY,aAAc,OAAO;AAAA,IAC1C;AAAA,EACF,CAAC;AACD,MAAI,YAAY,kBAAkB;AAChC,WAAO,YAAY;AAAA,EACrB;AACA,MAAI,YAAY,iBAAiB;AAC/B,WAAO,YAAY;AAAA,EACrB;AAEA,SAAO;AACT;AAKA,eAAe,YAAY,SAIxB;AACD,QAAM,EAAC,QAAQ,aAAa,YAAW,IAAI;AAC3C,MAAI,MAAM,WAAW,WAAW,GAAG;AACjC,UAAMC,IAAG,SAAS,aAAaD,MAAK,QAAQ,QAAQ,UAAU,CAAC;AAAA,EACjE;AAGA,MAAI,YAAY,SAAS,OAAO;AAC9B,gBAAY,UAAU,EAAC,OAAO,YAAY,QAAQ,MAAK;AAAA,EACzD,OAAO;AACL,gBAAY,UAAU,EAAC,OAAO,4BAA2B;AAAA,EAC3D;AACF;AAKA,eAAe,WAAW,SAIvB;AACD,QAAM,EAAC,SAAS,QAAQ,YAAW,IAAI;AAIvC,QAAM,cAAcA,MAAK,SAAS,MAAM;AACxC,MAAI,gBAAgB,aAAa;AAC/B,UAAM,cAAcA,MAAK,QAAQ,SAAS,UAAU;AACpD,QAAI,MAAM,WAAW,WAAW,GAAG;AACjC,YAAM,aAAa,aAAaA,MAAK,QAAQ,QAAQ,UAAU,CAAC;AAAA,IAClE;AAAA,EACF;AAGA,MAAI,YAAY,SAAS,OAAO;AAC9B,gBAAY,UAAU,EAAC,OAAO,YAAY,QAAQ,MAAK;AAAA,EACzD,OAAO;AACL,gBAAY,UAAU,EAAC,OAAO,4BAA2B;AAAA,EAC3D;AACF;AAKA,eAAsB,aAAa,SAAiB,SAAiB;AACnE,QAAM,QAAQ;AAAA,IACZ,aAAa,CAAC,OAAO;AAAA,IACrB,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,SAAS;AAAA,IACT,WAAW;AAAA,IACX,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,MACP;AAAA,QACE,MAAM;AAAA,QACN,MAAME,QAAY;AAChB,UAAAA,OAAM,UAAU,EAAC,QAAQ,KAAI,GAAG,CAAC,SAAc;AAC7C,kBAAM,KAAK,KAAK;AAChB,gBAAI,GAAG,CAAC,MAAM,OAAO,CAACF,MAAK,WAAW,EAAE,GAAG;AACzC,qBAAO;AAAA,gBACL,UAAU;AAAA,cACZ;AAAA,YACF;AACA,mBAAO;AAAA,UACT,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AACH;;;ACrOA,OAAOG,WAAU;AACjB,SAAQ,iBAAAC,sBAAoB;AAE5B,OAAO,kBAAkB;AACzB,SAAQ,WAAW,eAAc;AACjC,SAAQ,OAAAC,YAAU;AAClB,OAAO,UAAU;AACjB,OAAOC,WAAU;;;ACNV,SAAS,kBAAkB;AAChC,SAAO,CAAC,KAAc,KAAe,SAAuB;AAC1D,QAAI,QAAQ,IAAI,MAAM;AACtB,SAAK;AAAA,EACP;AACF;AAIO,IAAM,QAAN,MAAY;AAAA,EACT,YAAiD,CAAC;AAAA,EAE1D,IAAI,MAAc,IAA6B;AAC7C,SAAK,UAAU,IAAI,MAAM,CAAC;AAC1B,SAAK,UAAU,IAAI,EAAE,KAAK,EAAE;AAAA,EAC9B;AAAA,EAEA,QAAQ,SAAiB,MAAa;AACpC,UAAM,YAAY,KAAK,UAAU,IAAI,KAAK,CAAC;AAC3C,cAAU,QAAQ,CAAC,OAAO;AACxB,SAAG,GAAG,IAAI;AAAA,IACZ,CAAC;AAAA,EACH;AACF;;;ACbO,SAAS,oBAAoB,SAAqC;AACvE,QAAM,YAAY,IAAI,UAA8B;AACpD,QAAM,YAAY,QAAQ,aAAa,CAAC;AACxC,YAAU,QAAQ,CAAC,aAAa;AAC9B,QAAI,CAAC,qBAAqB,QAAQ,GAAG;AACnC,cAAQ,KAAK,qCAAqC,QAAQ;AAC1D;AAAA,IACF;AACA,cAAU,IAAI,SAAS,QAAS,QAAQ;AAAA,EAC1C,CAAC;AAED,SAAO,CAAC,KAAc,KAAe,SAAuB;AAC1D,UAAM,CAAC,UAAU,MAAM,IAAI,UAAU,IAAI,IAAI,IAAI;AACjD,QAAI,UAAU;AACZ,YAAM,cAAc,cAAc,SAAS,aAAc,MAAM;AAC/D,YAAM,OAAO,SAAS,QAAQ;AAC9B,UAAI;AAAA,QACF;AAAA,QACA;AAAA,MACF;AACA,UAAI,SAAS,MAAM,WAAW;AAC9B;AAAA,IACF;AACA,SAAK;AAAA,EACP;AACF;AAEA,SAAS,qBAAqB,UAA8B;AAC1D,MAAI,CAAC,SAAS,QAAQ;AACpB,WAAO;AAAA,EACT;AACA,MAAI,CAAC,SAAS,OAAO,WAAW,GAAG,GAAG;AACpC,WAAO;AAAA,EACT;AACA,MAAI,CAAC,SAAS,aAAa;AACzB,WAAO;AAAA,EACT;AACA,MAAI,CAAC,oBAAoB,SAAS,WAAW,GAAG;AAC9C,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AASA,SAAS,cAAc,eAAuB,QAAgC;AAC5E,QAAM,UAAU,cAAc;AAAA,IAC5B;AAAA,IACA,CAAC,OAAe,WAAmB,QAAgB;AACjD,YAAM,MAAM,OAAO,GAAG;AACtB,UAAI,CAAC,KAAK;AACR,cAAM,IAAI,MAAM,oBAAoB,KAAK,YAAY,aAAa,EAAE;AAAA,MACtE;AACA,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAKA,SAAS,oBAAoB,KAAa;AACxC,MAAI,IAAI,WAAW,GAAG,GAAG;AACvB,WAAO;AAAA,EACT;AACA,MAAI,IAAI,MAAM,cAAc,GAAG;AAC7B,WAAO;AAAA,EACT;AACA,SAAO;AACT;;;ACxFA,OAAOC,WAAU;AACjB,SAAiC,0BAAAC,+BAA6B;AAKvD,IAAM,oBAAN,MAA4C;AAAA,EACzC;AAAA,EACA;AAAA,EAER,YAAY,YAAwB,aAA0B;AAC5D,SAAK,aAAa;AAClB,SAAK,cAAc;AAAA,EACrB;AAAA,EAEA,MAAM,IAAI,KAAoC;AAC5C,UAAM,OAAOC,MAAK,QAAQ,KAAK,WAAW,SAAS,GAAG;AAEtD,UAAM,cAAc,KAAK,YAAY,iBAAiB,IAAI;AAC1D,QAAI,eAAe,YAAY,OAAO,GAAG;AACvC,YAAM,CAAC,UAAU,IAAI;AACrB,aAAO,IAAI,eAAe,KAAK;AAAA,QAC7B,UAAU;AAAA,QACV;AAAA,MACF,CAAC;AAAA,IACH;AAIA,QAAI,KAAK,WAAW,KAAK,WAAW,OAAO,GAAG;AAC5C,YAAM,WAAW,KAAK,MAAM,KAAK,WAAW,QAAQ,MAAM;AAC1D,aAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA,YAAY,YAAY,CAAC;AAAA,QACzB,WAAW,YAAY,CAAC,QAAQ;AAAA,MAClC;AAAA,IACF;AACA,UAAM,gBAAgBC,wBAAuB,KAAK,WAAW,OAAO;AACpE,QAAI,MAAM,kBAAkB,eAAe,IAAI,GAAG;AAChD,YAAM,WAAW,QAAQ,IAAI;AAC7B,aAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA,YAAY,YAAY,CAAC;AAAA,QACzB,WAAW,YAAY,CAAC,QAAQ;AAAA,MAClC;AAAA,IACF;AAEA,YAAQ,IAAI,sCAAsC,GAAG,EAAE;AACvD,WAAO;AAAA,EACT;AAAA,EAEA,cAAc,MAAc;AAC1B,WAAOD,MAAK,SAAS,KAAK,WAAW,SAAS,IAAI;AAAA,EACpD;AACF;AAEO,IAAM,iBAAN,MAAM,gBAAgC;AAAA,EAC3C;AAAA,EACA;AAAA,EACA;AAAA,EACQ;AAAA,EACA;AAAA,EAER,YACE,KACA,SAIA;AACA,SAAK,MAAM;AACX,SAAK,WAAW,QAAQ;AACxB,SAAK,aAAa,QAAQ;AAC1B,SAAK,WAAW,KAAK,WAAW;AAChC,SAAK,WAAW,KAAK,WAAW;AAAA,EAClC;AAAA,EAEA,MAAM,aAAgC;AACpC,UAAM,UAAU,oBAAI,IAAY;AAChC,UAAM,OAAO,oBAAI,IAAY;AAC7B,SAAK,WAAW,MAAM,MAAM,OAAO;AACnC,WAAO,MAAM,KAAK,IAAI;AAAA,EACxB;AAAA,EAEA,MAAM,YAA+B;AACnC,UAAM,UAAU,oBAAI,IAAY;AAChC,UAAM,OAAO,oBAAI,IAAY;AAC7B,SAAK,UAAU,MAAM,MAAM,OAAO;AAClC,WAAO,MAAM,KAAK,IAAI;AAAA,EACxB;AAAA,EAEA,qBAAqB;AACnB,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA,EAEQ,UACN,OACA,MACA,SACA;AACA,QAAI,CAAC,OAAO;AACV;AAAA,IACF;AACA,QAAI,CAAC,MAAM,UAAU;AACnB;AAAA,IACF;AACA,QAAI,QAAQ,IAAI,MAAM,QAAQ,GAAG;AAC/B;AAAA,IACF;AACA,YAAQ,IAAI,MAAM,QAAQ;AAC1B,UAAM,QAAQA,MAAK,MAAM,MAAM,QAAQ;AACvC,QACE,CAAC,OAAO,QAAQ,OAAO,MAAM,EAAE,SAAS,MAAM,GAAG,KACjD,MAAM,SAAS,SAAS,YAAY,GACpC;AACA,WAAK,IAAI,MAAM,QAAQ;AAAA,IACzB;AACA,UAAM,mBAAmB,EAAE,QAAQ,CAAC,eAAe;AACjD,UAAI,WAAW,MAAM;AACnB,cAAM,MAAM,KAAK,SAAS,cAAc,WAAW,IAAI;AACvD,cAAM,gBAAgB,IAAI,gBAAe,KAAK;AAAA,UAC5C,UAAU,KAAK;AAAA,UACf;AAAA,QACF,CAAC;AACD,aAAK,UAAU,eAAe,MAAM,OAAO;AAAA,MAC7C;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEQ,WACN,OACA,MACA,SACA;AACA,QAAI,CAAC,OAAO;AACV;AAAA,IACF;AACA,QAAI,CAAC,MAAM,UAAU;AACnB;AAAA,IACF;AACA,QAAI,QAAQ,IAAI,MAAM,QAAQ,GAAG;AAC/B;AAAA,IACF;AACA,YAAQ,IAAI,MAAM,QAAQ;AAC1B,QAAI,MAAM,IAAI,SAAS,OAAO,GAAG;AAC/B,YAAM,QAAQA,MAAK,MAAM,MAAM,GAAG;AAClC,UAAI,CAAC,MAAM,KAAK,WAAW,GAAG,GAAG;AAC/B,aAAK,IAAI,MAAM,QAAQ;AAAA,MACzB;AAAA,IACF;AACA,UAAM,mBAAmB,EAAE,QAAQ,CAAC,eAAe;AACjD,UAAI,WAAW,MAAM;AACnB,cAAM,MAAM,KAAK,SAAS,cAAc,WAAW,IAAI;AACvD,cAAM,gBAAgB,IAAI,gBAAe,KAAK;AAAA,UAC5C,UAAU,KAAK;AAAA,UACf;AAAA,QACF,CAAC;AACD,aAAK,WAAW,eAAe,MAAM,OAAO;AAAA,MAC9C;AAAA,IACF,CAAC;AAAA,EACH;AACF;;;ACnKA,SAAQ,oBAAmB;AAKpB,SAAS,WAAW,MAAgC;AACzD,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,UAAM,SAAS,aAAa;AAC5B,WAAO,GAAG,SAAS,CAAC,QAA+B;AACjD,UAAI,IAAI,SAAS,cAAc;AAC7B,gBAAQ,KAAK;AACb;AAAA,MACF;AACA,aAAO,GAAG;AAAA,IACZ,CAAC;AACD,WAAO,GAAG,SAAS,MAAM;AACvB,cAAQ,IAAI;AAAA,IACd,CAAC;AACD,WAAO,OAAO,MAAM,MAAM;AACxB,aAAO,MAAM,CAAC,QAAQ;AACpB,YAAI,KAAK;AACP,kBAAQ,IAAI,yBAAyB,GAAG,EAAE;AAC1C,iBAAO,GAAG;AAAA,QACZ;AAAA,MACF,CAAC;AAAA,IACH,CAAC;AAAA,EACH,CAAC;AACH;AAKA,eAAsB,aAAa,KAAa,KAA8B;AAC5E,MAAI,OAAO;AACX,SAAO,QAAQ,KAAK;AAClB,UAAM,SAAS,MAAM,WAAW,IAAI;AACpC,QAAI,QAAQ;AACV,aAAO;AAAA,IACT;AACA,YAAQ;AAAA,EACV;AACA,QAAM,IAAI,MAAM,yBAAyB,GAAG,QAAQ,GAAG,EAAE;AAC3D;;;AC1CA,OAAO,YAAY;AAIZ,SAAS,WAAW,KAAqB;AAC9C,QAAM,SAAS,CAAC;AAChB,QAAM,QACJ;AACF,WAAS,IAAI,GAAG,IAAI,KAAK,KAAK;AAC5B,UAAM,OAAO,KAAK,MAAM,KAAK,OAAO,IAAI,MAAM,MAAM;AACpD,WAAO,KAAK,MAAM,OAAO,IAAI,CAAC;AAAA,EAChC;AACA,SAAO,OAAO,KAAK,EAAE;AACvB;AAOA,SAAS,2BAA2B,MAAsB;AACxD,SAAO,OAAO,WAAW,QAAQ,EAAE,OAAO,IAAI,EAAE,OAAO,KAAK;AAC9D;AASO,SAAS,uBACd,YACA,SACmB;AAEnB,MAAI,WAAW,QAAQ,qBAAqB;AAC1C,WAAO,WAAW,OAAO;AAAA,EAC3B;AAGA,MAAI,QAAQ,IAAI,aAAa,eAAe;AAC1C,WAAO,2BAA2B,OAAO;AAAA,EAC3C;AAEA,SAAO,WAAW,EAAE;AACtB;;;ALfA,IAAME,aAAYC,MAAK,QAAQC,eAAc,YAAY,GAAG,CAAC;AAG7D,IAAM,kCAAkC,oBAAI,IAAI;AAAA,EAC9C;AACF,CAAC;AAMD,eAAsB,IAAI,gBAAyB,SAAsB;AACvE,UAAQ,IAAI,WAAW;AACvB,QAAM,UAAUD,MAAK,QAAQ,kBAAkB,QAAQ,IAAI,CAAC;AAC5D,QAAM,cAAc,SAAS,QAAQ,IAAI,QAAQ,MAAM;AACvD,QAAM,OAAO,SAAS,QAAQ;AAC9B,QAAM,OAAO,MAAM,aAAa,aAAa,cAAc,EAAE;AAE7D,MAAI,gBAAoC;AACxC,MAAI,oBAA0C;AAE9C,iBAAeE,SAAQ;AACrB,UAAM,SAAS,MAAM,gBAAgB,EAAC,SAAS,KAAI,CAAC;AACpD,UAAM,aAAyB,OAAO,IAAI,YAAY;AACtD,UAAM,aAA4B,OAAO,IAAI,YAAY;AACzD,wBAAoB;AAEpB,UAAM,WAAW,WAAW,QAAQ;AACpC,UAAM,eAAe,WAAW,QAAQ,gBAAgB;AACxD,YAAQ,IAAI;AACZ,YAAQ,IAAI,GAAGC,KAAI,QAAG,CAAC,cAAc,OAAO,EAAE;AAC9C,YAAQ,IAAI,GAAGA,KAAI,QAAG,CAAC,qBAAqB,IAAI,IAAI,IAAI,GAAG,YAAY,EAAE;AACzE,QAAI,eAAe,UAAU,GAAG;AAC9B,cAAQ,IAAI,GAAGA,KAAI,QAAG,CAAC,qBAAqB,IAAI,IAAI,IAAI,OAAO;AAAA,IACjE;AACA,YAAQ,IAAI,GAAGA,KAAI,QAAG,CAAC,wBAAwB;AAC/C,YAAQ,IAAI;AACZ,oBAAgB,OAAO,OAAO,MAAM,IAAI;AAGxC,UAAM,yBAAmC,OAAO;AAAA,MAC9C;AAAA,IACF;AACA,UAAM,eAAe;AAAA,MACnBH,MAAK,QAAQ,SAAS,gBAAgB;AAAA,MACtC,GAAG;AAAA,IACL;AACA,eAAW,QAAQ,IAAI,YAAY;AACnC,eAAW,QAAQ,GAAG,UAAU,OAAO,SAAS;AAC9C,UAAI,aAAa,SAAS,IAAI,GAAG;AAC/B,gBAAQ;AAAA,UACN;AAAA,EAAKG,KAAI,QAAG,CAAC;AAAA,QACf;AACA,cAAM,QAAQ;AAAA,MAChB;AAAA,IACF,CAAC;AAAA,EACH;AAEA,iBAAe,UAAU;AACvB,QAAI,eAAe;AACjB,oBAAc,MAAM;AACpB,sBAAgB;AAAA,IAClB;AACA,QAAI,mBAAmB;AACrB,YAAM,kBAAkB,MAAM;AAC9B,0BAAoB;AAAA,IACtB;AACA,UAAMD,OAAM;AAAA,EACd;AAEA,QAAMA,OAAM;AACd;AAEA,eAAsB,gBAAgB,SAGlB;AAClB,QAAM,UAAUF,MAAK,QAAQ,SAAS,WAAW,QAAQ,IAAI,CAAC;AAC9D,QAAM,EAAC,YAAY,aAAY,IAAI,MAAM,uBAAuB,SAAS;AAAA,IACvE,SAAS;AAAA,EACX,CAAC;AACD,QAAM,OAAO,SAAS;AAEtB,QAAM,SAAiB,QAAQ;AAC/B,SAAO,IAAI,cAAc,UAAU;AACnC,SAAO,IAAI,0BAA0B,YAAY;AACjD,SAAO,QAAQ,cAAc;AAG7B,QAAM,EAAC,YAAY,eAAc,IAAI,MAAM,qBAAqB;AAAA,IAC9D;AAAA,IACA;AAAA,EACF,CAAC;AACD,SAAO,IAAI,cAAc,UAAU;AAGnC,SAAO,IAAI,sBAAsB,EAAC,WAAU,CAAC,CAAC;AAC9C,SAAO,IAAI,cAAc;AACzB,SAAO,IAAI,gBAAgB,CAAC;AAG5B,QAAM,sBAAsB,uBAAuB,YAAY,OAAO;AACtE,SAAO,IAAI,aAAa,mBAAmB,CAAC;AAC5C,SAAO,IAAI,kBAAkB,CAAC;AAE9B,QAAM,UAAU,WAAW,WAAW,CAAC;AACvC,QAAM;AAAA,IACJ;AAAA,IACA,YAAY;AAEV,YAAM,kBAAkB,WAAW,QAAQ,eAAe,CAAC;AAC3D,iBAAW,cAAc,iBAAiB;AACxC,eAAO,IAAI,UAAU;AAAA,MACvB;AAGA,UAAI,WAAW,QAAQ,WAAW;AAChC,eAAO;AAAA,UACL,oBAAoB,EAAC,WAAW,WAAW,OAAO,UAAS,CAAC;AAAA,QAC9D;AAAA,MACF;AAGA,UAAI,WAAW,QAAQ,SAAS;AAC9B,eAAO,IAAI,kBAAkB,EAAC,WAAsB,CAAC,CAAC;AAAA,MACxD;AAGA,YAAM,YAAYA,MAAK,KAAK,SAAS,QAAQ;AAC7C,UAAI,MAAM,UAAU,SAAS,GAAG;AAC9B,eAAO,IAAI,wBAAwB,EAAC,WAAW,WAAU,CAAC,CAAC;AAAA,MAC7D;AAIA,aAAO,IAAI,wBAAwB,EAAC,WAAU,CAAC,CAAC;AAGhD,aAAO,IAAI,wBAAwB,CAAC;AAGpC,cAAQ,QAAQ,CAAC,WAAW;AAC1B,YAAI,OAAO,WAAW;AACpB,iBAAO,IAAI,OAAO,SAAS;AAAA,QAC7B;AAAA,MACF,CAAC;AAGD,aAAO,IAAI,2BAA2B,CAAC;AACvC,aAAO,IAAI,2BAA2B,CAAC;AAAA,IACzC;AAAA,IACA;AAAA,IACA,EAAC,MAAM,OAAO,WAAU;AAAA,EAC1B;AAEA,SAAO;AACT;AAMA,eAAe,qBAAqB,SAGjC;AACD,QAAM,aAAa,QAAQ;AAC3B,QAAM,UAAU,WAAW;AAE3B,QAAM,OAAO,MAAM,YAAY,UAAU;AAEzC,MAAI,eAAe,MAAM,YAAY,YAAY,IAAI;AACrD,QAAM,WAAW,OAAO,OAAO,aAAa,WAAW,EAAE,IAAI,CAAC,eAAe;AAC3E,WAAO,WAAW;AAAA,EACpB,CAAC;AAED,QAAM,gBAA0B,CAAC;AACjC,MAAI,MAAM,YAAYA,MAAK,KAAK,SAAS,SAAS,CAAC,GAAG;AACpD,UAAM,cAAc,MAAMI,MAAK,aAAa,EAAC,KAAK,QAAO,CAAC;AAC1D,gBAAY,QAAQ,CAAC,SAAS;AAC5B,YAAM,QAAQJ,MAAK,MAAM,IAAI;AAC7B,UAAI,SAAS,MAAM,IAAI,GAAG;AACxB,sBAAc,KAAK,IAAI;AAAA,MACzB;AAAA,IACF,CAAC;AAAA,EACH;AAEA,aAAW,OAAO,MAAM;AACtB,eAAW,cAAc,IAAI,aAAa;AACxC,oBAAc,KAAK,UAAU;AAAA,IAC/B;AAAA,EACF;AAEA,QAAM,eAAe,CAAC,GAAG,UAAU,GAAG,aAAa;AACnD,QAAM,aAAa,MAAM,iBAAiB,YAAY;AAAA,IACpD,MAAM,QAAQ;AAAA,IACd;AAAA,EACF,CAAC;AAID,WAAS,gBAAgB,iBAAyB;AAChD,UAAM,WAAWA,MAAK,QAAQ,eAAe;AAC7C,UAAM,eAAe,gBAAgB,YAAY,IAAI;AACrD,WAAO,aAAa,KAAK,CAAC,YAAY,SAAS,WAAW,OAAO,CAAC;AAAA,EACpE;AACA,aAAW,QAAQ,GAAG,OAAO,OAAO,aAAqB;AACvD,QAAI,gBAAgB,QAAQ,GAAG;AAC7B,qBAAe,MAAM,YAAY,YAAY,IAAI;AACjD,cAAQ,IAAI,kBAAkB,QAAQ,EAAE;AAAA,IAC1C;AAAA,EACF,CAAC;AACD,aAAW,QAAQ,GAAG,UAAU,OAAO,aAAqB;AAC1D,QAAI,gBAAgB,QAAQ,GAAG;AAC7B,qBAAe,MAAM,YAAY,YAAY,IAAI;AACjD,cAAQ,IAAI,oBAAoB,QAAQ,EAAE;AAAA,IAC5C;AAAA,EACF,CAAC;AAED,QAAM,iBAAiB,OACrB,KACA,KACA,SACG;AACH,QAAI;AAEF,UAAI,aAAa;AAEjB,YAAM,mBAAmBA,MAAK,QAAQD,YAAW,aAAa;AAC9D,YAAM,SAAU,MAAM,WAAW;AAAA,QAC/B;AAAA,MACF;AAEA,YAAM,WAAW,IAAI;AAAA,QACnB;AAAA,QACA,WAAW;AAAA,MACb;AAGA,UAAI,WAAW,IAAI,OAAO,SAAS,YAAY,EAAC,UAAU,aAAY,CAAC;AAEvE,iBAAW,YAAY,KAAK,KAAK,IAAI;AAAA,IACvC,SAAS,GAAG;AACV,WAAK,CAAC;AAAA,IACR;AAAA,EACF;AAEA,SAAO,EAAC,YAAY,eAAc;AACpC;AAEA,SAAS,wBAAwB,SAG9B;AACD,QAAM,YAAY,QAAQ;AAM1B,QAAM,cAAc,EAAC,KAAK,MAAK;AAC/B,MAAI,UAAU,KAAK,WAAW,WAAW;AAEzC,QAAM,uBAAuB,SAAS,MAAM;AAC1C,cAAU,KAAK,WAAW,WAAW;AAAA,EACvC,GAAG,GAAI;AAEP,WAAS,cAAc,iBAAyB;AAC9C,UAAM,WAAWC,MAAK,QAAQ,eAAe;AAC7C,WAAO,SAAS,WAAW,SAAS;AAAA,EACtC;AAEA,QAAM,UAAU,QAAQ,WAAW;AACnC,UAAQ,GAAG,OAAO,CAAC,OAAO,aAAa;AACrC,QAAI,cAAc,QAAQ,GAAG;AAC3B,2BAAqB;AAAA,IACvB;AAAA,EACF,CAAC;AAED,SAAO,CAAC,KAAc,KAAe,SAAuB;AAC1D,YAAQ,KAAK,KAAK,IAAI;AAAA,EACxB;AACF;AAEA,SAAS,0BAA0B;AACjC,SAAO,OAAO,KAAc,KAAe,SAAuB;AAChE,UAAM,WAAW,IAAI;AACrB,UAAM,aAAa,IAAI;AACvB,QAAI;AACF,YAAM,SAAS,OAAO,KAAK,KAAK,IAAI;AAAA,IACtC,SAAS,KAAK;AAGZ,iBAAW,iBAAiB,GAAG;AAC/B,WAAK,GAAG;AAAA,IACV;AAAA,EACF;AACF;AAEA,SAAS,6BAA6B;AACpC,SAAO,OAAO,KAAc,QAAkB;AAC5C,QAAI,CAAC,gCAAgC,IAAI,IAAI,IAAI,GAAG;AAClD,cAAQ,MAAM,cAAS,IAAI,WAAW,EAAE;AAAA,IAC1C;AACA,QAAI,IAAI,UAAU;AAChB,YAAM,MAAM,IAAI;AAChB,YAAM,MAAMA,MAAK,QAAQ,GAAG;AAC5B,UAAI,CAAC,KAAK;AACR,cAAM,WAAW,IAAI;AACrB,cAAM,OAAO,MAAM,SAAS,mBAAmB,GAAG;AAClD,cAAM,OAAO,KAAK,QAAQ;AAC1B,YAAI,OAAO,GAAG,EAAE,IAAI,EAAC,gBAAgB,YAAW,CAAC,EAAE,IAAI,IAAI;AAC3D;AAAA,MACF;AAAA,IACF;AACA,QAAI,OAAO,GAAG,EAAE,IAAI,EAAC,gBAAgB,aAAY,CAAC,EAAE,IAAI,KAAK;AAAA,EAC/D;AACF;AAEA,SAAS,6BAA6B;AACpC,SAAO,OAAO,KAAU,KAAc,KAAe,SAAuB;AAC1E,YAAQ,MAAM,cAAS,IAAI,WAAW,EAAE;AACxC,YAAQ,MAAM,OAAO,IAAI,SAAS,GAAG,CAAC;AACtC,QAAI,IAAI,UAAU;AAChB,YAAM,MAAM,IAAI;AAChB,YAAM,MAAMA,MAAK,QAAQ,GAAG;AAC5B,UAAI,CAAC,KAAK;AACR,cAAM,WAAW,IAAI;AACrB,cAAM,OAAO,MAAM,SAAS,mBAAmB,KAAK,GAAG;AACvD,cAAM,OAAO,KAAK,QAAQ;AAC1B,YAAI,OAAO,GAAG,EAAE,IAAI,EAAC,gBAAgB,YAAW,CAAC,EAAE,IAAI,IAAI;AAC3D;AAAA,MACF;AAAA,IACF;AACA,SAAK,GAAG;AAAA,EACV;AACF;AAEA,SAAS,eAAe,YAAwB;AAC9C,QAAM,UAAU,WAAW,WAAW,CAAC;AACvC,SAAO,QAAQ,QAAQ,KAAK,CAAC,WAAW,OAAO,SAAS,UAAU,CAAC;AACrE;AAEA,SAAS,SAAS,IAA6B,SAAiB;AAC9D,MAAI;AACJ,SAAO,IAAI,SAAgB;AACzB,iBAAa,KAAK;AAClB,YAAQ,WAAW,MAAM,GAAG,GAAG,IAAI,GAAG,OAAO;AAAA,EAC/C;AACF;;;AM5XA,SAAQ,gBAAe;AACvB,OAAOK,SAAQ;AAEf,OAAO,UAAU;AA0BjB,eAAsB,UAAU,QAAgB,SAA4B;AAC1E,MAAI,CAAC,QAAQ;AACX,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,QAAM,UAAU,SAAS;AACzB,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,kCAAkC;AAAA,EACpD;AAGA,UAAQ,MAAM,MAAM;AAEpB,QAAM,cAAc;AACpB,MAAI,CAACA,IAAG,WAAW,WAAW,GAAG;AAC/B,UAAM,IAAI,MAAM,0BAA0B,WAAW,EAAE;AAAA,EACzD;AAGA,QAAM,UAAU,KAAK,KAAKA,IAAG,aAAa,aAAa,MAAM,CAAC;AAC9D,QAAM,UAAU,QAAQ;AACxB,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,MAAI,SAAS,SAAS;AACtB,MAAI,CAAC,QAAQ;AACX,aAAS,SAAS,UAAU,SAAS;AAAA,EACvC;AACA,QAAM,UAAU,GAAG,MAAM,IAAI,aAAa,CAAC;AAC3C,MAAI,mBAAmB,SAAS,SAAS,OAAO,GAAG;AACjD,UAAM,IAAI,MAAM,YAAY,OAAO,8BAA8B;AAAA,EACnE;AAEA,UAAQ,IAAI,+CAAwC;AAIpD,QAAM,yBAAyB,uBAAuB,OAAO;AAC7D,MAAI,gBAAgB;AACpB,MAAI,wBAAwB;AAC1B,oBAAgB,iBAAiB,aAAa,OAAO;AAAA,EACvD;AAGA;AAAA,IACE,kCAAkC,OAAO,cAAc,OAAO;AAAA,IAC9D,EAAC,OAAO,UAAS;AAAA,EACnB;AAGA,MAAI,eAAe;AACjB,IAAAA,IAAG,aAAa,eAAe,UAAU;AAAA,EAC3C;AAGA,MAAI,SAAS,gBAAgB;AAC3B,UAAM,oBAAoB,MAAM;AAAA,MAC9B;AAAA,MACA;AAAA,MACA;AAAA,MACA,QAAQ;AAAA,IACV;AACA,QAAI,CAAC,mBAAmB;AACtB,YAAM,IAAI;AAAA,QACR;AAAA,EAAqD;AAAA,UACnD;AAAA,UACA;AAAA,UACA;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AACA,YAAQ,IAAI,6CAAwC;AAAA,EACtD;AAEA,MAAI,SAAS,SAAS;AACpB,YAAQ,IAAI,kCAAkC,OAAO,KAAK;AAC1D;AAAA,MACE,2BAA2B,OAAO,yBAAyB,OAAO,aAAa,OAAO;AAAA,MACtF,EAAC,OAAO,UAAS;AAAA,IACnB;AAAA,EACF;AAEA,MAAI,SAAS,aAAa;AAExB,UAAM,OAAO;AAAA,MACX,sCAAsC,OAAO,cAAc,OAAO;AAAA,IACpE,EAAE,SAAS;AACX,UAAM,WAAW,KAAK,MAAM,KAAK,SAAS,CAAC;AAC3C,UAAM,kBAAkB,SACrB;AAAA,MAAO,CAAC,YACP,mBAAmB,SAAS,SAAS,MAAM;AAAA,IAC7C,EACC;AAAA,MACC,CAAC,GAAG,MACF,IAAI,KAAK,EAAE,mBAAmB,QAAQ,EAAE,QAAQ,IAChD,IAAI,KAAK,EAAE,mBAAmB,QAAQ,EAAE,QAAQ;AAAA,IACpD;AAEF,YAAQ;AAAA,MACN,gDAAyC,gBAAgB,MAAM;AAAA,IACjE;AACA,eAAW,eAAe,iBAAiB;AACzC,cAAQ,IAAI,KAAK,YAAY,EAAE,EAAE;AAAA,IACnC;AAGA,eAAW,eAAe,gBAAgB,MAAM,QAAQ,cAAc,CAAC,GAAG;AACxE,cAAQ,IAAI,kDAAwC,YAAY,EAAE,EAAE;AACpE;AAAA,QACE,2CAA2C,OAAO,cAAc,OAAO,IAAI,YAAY,EAAE;AAAA,QACzF,EAAC,OAAO,UAAS;AAAA,MACnB;AAAA,IACF;AAAA,EACF;AAEA,UAAQ;AAAA,IACN;AAAA,YAAiD;AAAA,MAC/C;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AACF;AAMA,SAAS,mBAAmB,SAAiB,SAAiB,SAAiB;AAC7E,QAAM,YAAY,GAAG,OAAO,QAAQ,OAAO,QAAQ,OAAO;AAE1D,SAAO,UAAU,SAAS;AAC5B;AAGA,SAAS,WAAW,SAAiB,SAAiB,SAAiB;AACrE,SAAO,8GAA8G,OAAO,qCAAqC,OAAO,aAAa,OAAO;AAC9L;AAGA,SAAS,eAAe,SAAiB,SAAiB;AACxD,SAAO,+DAA+D,OAAO,cAAc,OAAO;AACpG;AAWA,SAAS,uBAAuB,SAAkB;AAChD,MAAI,OAAO,SAAS,kBAAkB,UAAU;AAC9C,WAAO;AAAA,EACT;AACA,QAAM,UAAkC,QAAQ;AAChD,SAAO,OAAO,OAAO,OAAO,EAAE,KAAK,CAAC,aAAqB;AACvD,WAAO,qBAAqB,QAAQ;AAAA,EACtC,CAAC;AACH;AAEA,SAAS,qBAAqB,UAAe;AAC3C,MAAI,OAAO,aAAa,UAAU;AAChC,WAAO,SAAS,WAAW,GAAG,KAAK,SAAS,SAAS,GAAG;AAAA,EAC1D;AACA,SAAO;AACT;AAGA,SAAS,iBAAiB,aAAqB,SAAkB;AAE/D,QAAM,gBAAgB,GAAG,WAAW;AACpC,EAAAA,IAAG,aAAa,aAAa,aAAa;AAC1C,MAAI,UAAUA,IAAG,aAAa,aAAa,MAAM;AAGjD,QAAM,UAAkC,QAAQ;AAChD,SAAO,QAAQ,OAAO,EAAE,QAAQ,CAAC,CAAC,QAAQ,QAAQ,MAAM;AACtD,QAAI,qBAAqB,QAAQ,GAAG;AAClC,YAAM,QAAQ,QAAQ,IAAI,MAAM;AAChC,UAAI,CAAC,SAAS,QAAQ,SAAS,IAAI,MAAM,GAAG,GAAG;AAC7C,gBAAQ,KAAK,8CAA8C,MAAM,EAAE;AACnE,kBAAU,QAAQ,WAAW,IAAI,MAAM,KAAK,EAAE;AAAA,MAChD,WAAW,SAAS,QAAQ,SAAS,IAAI,MAAM,GAAG,GAAG;AACnD,kBAAU,QAAQ,WAAW,IAAI,MAAM,KAAK,KAAK;AAAA,MACnD;AAAA,IACF;AAAA,EACF,CAAC;AAED,EAAAA,IAAG,cAAc,aAAa,SAAS,MAAM;AAC7C,SAAO;AACT;AAKA,SAAS,eAAe;AACtB,QAAM,SAAS,CAAC,SAAiB,MAAM,IAAI,SAAS,GAAG,GAAG;AAC1D,QAAM,OAAO,oBAAI,KAAK;AACtB,SAAO,GAAG,KAAK,YAAY,CAAC,GAAG,OAAO,KAAK,SAAS,IAAI,CAAC,CAAC,GAAG;AAAA,IAC3D,KAAK,QAAQ;AAAA,EACf,CAAC,IAAI,OAAO,KAAK,SAAS,CAAC,CAAC,GAAG,OAAO,KAAK,WAAW,CAAC,CAAC;AAC1D;AAMA,eAAsB,WACpB,SACA,SACA,SACA,gBACA;AACA,MAAI,CAAC,eAAe,WAAW,GAAG,GAAG;AACnC,qBAAiB,IAAI,cAAc;AAAA,EACrC;AACA,QAAM,MAAM,WAAW,OAAO,QAAQ,OAAO,QAAQ,OAAO,eAAe,cAAc;AACzF,QAAM,WAAW,MAAM,MAAM,GAAG;AAChC,SAAO,SAAS,WAAW;AAC7B;AAOA,SAAS,mBACP,SACA,SACA,QACA;AACA,QAAM,KAAK,IAAI,OAAO,GAAG,MAAM,gBAAgB;AAC/C,SACE,QAAQ,YAAY,WACpB,GAAG,KAAK,QAAQ,EAAE,KAClB,QAAQ,kBAAkB;AAE9B;;;ACjRA,OAAOC,WAAU;AAEjB,OAAO,iBAAiB;AACxB,OAAOC,mBAAkB;AACzB,SAAQ,WAAWC,gBAAc;AACjC,SAAQ,OAAAC,YAAU;AAClB,OAAOC,WAAU;AA4BjB,eAAsB,QACpB,gBACA,SACA;AAGA,UAAQ,IAAI,WAAW;AACvB,QAAM,UAAUC,MAAK,QAAQ,kBAAkB,QAAQ,IAAI,CAAC;AAC5D,QAAM,SAAS,MAAM,oBAAoB,EAAC,QAAO,CAAC;AAClD,QAAM,OAAO,SAAS,QAAQ,IAAI,QAAQ,MAAM;AAChD,QAAM,OAAO,SAAS,QAAQ;AAC9B,UAAQ,IAAI;AACZ,UAAQ,IAAI,GAAGC,KAAI,QAAG,CAAC,cAAc,OAAO,EAAE;AAC9C,UAAQ,IAAI,GAAGA,KAAI,QAAG,CAAC,qBAAqB,IAAI,IAAI,IAAI,EAAE;AAC1D,UAAQ,IAAI,GAAGA,KAAI,QAAG,CAAC,oBAAoB;AAC3C,UAAQ,IAAI;AACZ,SAAO,OAAO,MAAM,IAAI;AAC1B;AAEA,eAAsB,oBAAoB,SAEtB;AAClB,QAAM,UAAU,QAAQ;AACxB,QAAM,aAAa,MAAM,kBAAkB,SAAS,EAAC,SAAS,UAAS,CAAC;AACxE,QAAM,UAAUD,MAAK,KAAK,SAAS,MAAM;AAEzC,QAAM,SAAiBE,SAAQ;AAC/B,SAAO,QAAQ,cAAc;AAC7B,SAAO,IAAI,YAAY,CAAC;AAGxB,SAAO,IAAI,sBAAsB,EAAC,WAAU,CAAC,CAAC;AAC9C,SAAO,IAAI,MAAM,8BAA8B,EAAC,YAAY,QAAO,CAAC,CAAC;AACrE,SAAO,IAAI,gBAAgB,CAAC;AAG5B,QAAM,sBAAsB,uBAAuB,YAAY,OAAO;AACtE,SAAO,IAAIC,cAAa,mBAAmB,CAAC;AAC5C,SAAO,IAAI,kBAAkB,CAAC;AAE9B,QAAM,UAAU,WAAW,WAAW,CAAC;AACvC,QAAM;AAAA,IACJ;AAAA,IACA,YAAY;AAEV,YAAM,kBAAkB,WAAW,QAAQ,eAAe,CAAC;AAC3D,sBAAgB,QAAQ,CAAC,eAAe;AACtC,eAAO,IAAI,UAAU;AAAA,MACvB,CAAC;AAGD,UAAI,WAAW,QAAQ,WAAW;AAChC,eAAO;AAAA,UACL,oBAAoB,EAAC,WAAW,WAAW,OAAO,UAAS,CAAC;AAAA,QAC9D;AAAA,MACF;AAGA,UAAI,WAAW,QAAQ,SAAS;AAC9B,eAAO,IAAI,kBAAkB,EAAC,WAAsB,CAAC,CAAC;AAAA,MACxD;AAGA,YAAM,YAAYH,MAAK,KAAK,SAAS,MAAM;AAC3C,aAAO,IAAII,MAAK,WAAW,EAAC,KAAK,MAAK,CAAC,CAAC;AAIxC,aAAO,IAAI,wBAAwB,EAAC,WAAU,CAAC,CAAC;AAGhD,aAAO,IAAI,4BAA4B,CAAC;AAGxC,cAAQ,QAAQ,CAAC,WAAW;AAC1B,YAAI,OAAO,WAAW;AACpB,iBAAO,IAAI,OAAO,SAAS;AAAA,QAC7B;AAAA,MACF,CAAC;AAGD,aAAO,IAAI,+BAA+B,CAAC;AAC3C,aAAO,IAAI,+BAA+B,CAAC;AAAA,IAC7C;AAAA,IACA;AAAA,IACA,EAAC,MAAM,WAAW,WAAU;AAAA,EAC9B;AACA,SAAO;AACT;AAKA,eAAe,8BAA8B,SAG1C;AACD,QAAM,EAAC,SAAS,WAAU,IAAI;AAC9B,QAAM,SAAuB,MAAM,OACjCJ,MAAK,KAAK,SAAS,kBAAkB;AAEvC,QAAM,eAAeA,MAAK,KAAK,SAAS,qBAAqB;AAC7D,MAAI,CAAE,MAAM,WAAW,YAAY,GAAI;AACrC,UAAM,IAAI;AAAA,MACR,kBAAkB,YAAY;AAAA,IAChC;AAAA,EACF;AACA,QAAM,uBAAuBA,MAAK,KAAK,SAAS,qBAAqB;AACrE,MAAI,CAAE,MAAM,WAAW,oBAAoB,GAAI;AAC7C,UAAM,IAAI;AAAA,MACR,kBAAkB,oBAAoB;AAAA,IACxC;AAAA,EACF;AACA,QAAM,eAAe,MAAM,SAA6B,YAAY;AACpE,QAAM,WAAW,cAAc,iBAAiB,YAAY,YAAY;AACxE,QAAM,mBAAmB,MAAM,SAAc,oBAAoB;AACjE,QAAM,eAAe,aAAa,SAAS,gBAAgB;AAC3D,QAAM,WAAW,IAAI,OAAO,SAAS,YAAY,EAAC,UAAU,aAAY,CAAC;AACzE,SAAO,OAAO,KAAc,GAAa,SAAuB;AAC9D,QAAI,WAAW;AACf,SAAK;AAAA,EACP;AACF;AAKA,SAAS,8BAA8B;AACrC,SAAO,OAAO,KAAc,KAAe,SAAuB;AAChE,UAAM,WAAW,IAAI;AACrB,QAAI;AACF,YAAM,SAAS,OAAO,KAAK,KAAK,IAAI;AAAA,IACtC,SAAS,GAAG;AACV,UAAI;AACF,gBAAQ,MAAM,mBAAmB,IAAI,WAAW,EAAE;AAClD,gBAAQ,MAAM,EAAE,SAAS,CAAC;AAC1B,cAAM,EAAC,KAAI,IAAI,MAAM,SAAS,mBAAmB,KAAK,CAAC;AACvD,YAAI,OAAO,GAAG,EAAE,IAAI,EAAC,gBAAgB,YAAW,CAAC,EAAE,IAAI,IAAI;AAAA,MAC7D,SAAS,IAAI;AACX,gBAAQ,MAAM,+BAA+B;AAC7C,gBAAQ,MAAM,EAAE;AAChB,aAAK,CAAC;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,iCAAiC;AACxC,SAAO,OAAO,KAAc,QAAkB;AAC5C,YAAQ,MAAM,cAAS,IAAI,WAAW,EAAE;AACxC,QAAI,IAAI,UAAU;AAChB,YAAM,MAAM,IAAI;AAChB,YAAM,MAAMA,MAAK,QAAQ,GAAG;AAC5B,UAAI,CAAC,KAAK;AACR,cAAM,WAAW,IAAI;AACrB,cAAM,OAAO,MAAM,SAAS,UAAU,EAAC,aAAa,IAAG,CAAC;AACxD,cAAM,OAAO,KAAK,QAAQ;AAC1B,YAAI,OAAO,GAAG,EAAE,IAAI,EAAC,gBAAgB,YAAW,CAAC,EAAE,IAAI,IAAI;AAC3D;AAAA,MACF;AAAA,IACF;AACA,QAAI,OAAO,GAAG,EAAE,IAAI,EAAC,gBAAgB,aAAY,CAAC,EAAE,IAAI,KAAK;AAAA,EAC/D;AACF;AAEA,SAAS,iCAAiC;AACxC,SAAO,OAAO,KAAU,KAAc,KAAe,SAAuB;AAC1E,YAAQ,MAAM,cAAS,IAAI,WAAW,EAAE;AACxC,YAAQ,MAAM,OAAO,IAAI,SAAS,GAAG,CAAC;AACtC,QAAI,IAAI,UAAU;AAChB,YAAM,MAAM,IAAI;AAChB,YAAM,MAAMA,MAAK,QAAQ,GAAG;AAC5B,UAAI,CAAC,KAAK;AACR,cAAM,WAAW,IAAI;AACrB,cAAM,OAAO,MAAM,SAAS,mBAAmB,KAAK,GAAG;AACvD,cAAM,OAAO,KAAK,QAAQ;AAC1B,YAAI,OAAO,GAAG,EAAE,IAAI,EAAC,gBAAgB,YAAW,CAAC,EAAE,IAAI,IAAI;AAC3D;AAAA,MACF;AAAA,IACF;AACA,SAAK,GAAG;AAAA,EACV;AACF;;;ACxNA,OAAOK,WAAU;AAEjB,OAAOC,kBAAiB;AACxB,OAAOC,mBAAkB;AACzB,SAAQ,WAAWC,gBAAc;AACjC,SAAQ,OAAAC,YAAU;AAClB,OAAOC,WAAU;AA4BjB,eAAsB,MAAM,gBAAyB,SAAwB;AAC3E,UAAQ,IAAI,WAAW;AACvB,QAAM,UAAUC,MAAK,QAAQ,kBAAkB,QAAQ,IAAI,CAAC;AAC5D,QAAM,SAAS,MAAM,iBAAiB,EAAC,QAAO,CAAC;AAC/C,QAAM,OAAO,SAAS,QAAQ,IAAI,QAAQ,MAAM;AAChD,QAAM,OAAO,SAAS,QAAQ;AAC9B,UAAQ,IAAI;AACZ,UAAQ,IAAI,GAAGC,KAAI,QAAG,CAAC,cAAc,OAAO,EAAE;AAC9C,UAAQ,IAAI,GAAGA,KAAI,QAAG,CAAC,qBAAqB,IAAI,IAAI,IAAI,EAAE;AAC1D,UAAQ,IAAI,GAAGA,KAAI,QAAG,CAAC,uBAAuB;AAC9C,UAAQ,IAAI;AACZ,SAAO,OAAO,MAAM,IAAI;AAC1B;AAEA,eAAsB,iBAAiB,SAEnB;AAClB,QAAM,UAAU,QAAQ;AACxB,QAAM,aAAa,MAAM,kBAAkB,SAAS,EAAC,SAAS,QAAO,CAAC;AACtE,QAAM,UAAUD,MAAK,KAAK,SAAS,MAAM;AAEzC,QAAM,SAAiBE,SAAQ;AAC/B,SAAO,QAAQ,cAAc;AAC7B,SAAO,IAAIC,aAAY,CAAC;AAGxB,SAAO,IAAI,sBAAsB,EAAC,WAAU,CAAC,CAAC;AAC9C,SAAO,IAAI,MAAM,2BAA2B,EAAC,YAAY,QAAO,CAAC,CAAC;AAClE,SAAO,IAAI,gBAAgB,CAAC;AAG5B,QAAM,sBAAsB,uBAAuB,YAAY,OAAO;AACtE,SAAO,IAAIC,cAAa,mBAAmB,CAAC;AAC5C,SAAO,IAAI,kBAAkB,CAAC;AAE9B,QAAM,UAAU,WAAW,WAAW,CAAC;AACvC,QAAM;AAAA,IACJ;AAAA,IACA,YAAY;AAEV,YAAM,kBAAkB,WAAW,QAAQ,eAAe,CAAC;AAC3D,sBAAgB,QAAQ,CAAC,eAAe;AACtC,eAAO,IAAI,UAAU;AAAA,MACvB,CAAC;AAGD,UAAI,WAAW,QAAQ,WAAW;AAChC,eAAO;AAAA,UACL,oBAAoB,EAAC,WAAW,WAAW,OAAO,UAAS,CAAC;AAAA,QAC9D;AAAA,MACF;AAGA,UAAI,WAAW,QAAQ,SAAS;AAC9B,eAAO,IAAI,kBAAkB,EAAC,WAAsB,CAAC,CAAC;AAAA,MACxD;AAGA,YAAM,YAAYJ,MAAK,KAAK,SAAS,MAAM;AAC3C,aAAO,IAAIK,MAAK,WAAW,EAAC,KAAK,MAAK,CAAC,CAAC;AAIxC,aAAO,IAAI,wBAAwB,EAAC,WAAU,CAAC,CAAC;AAGhD,aAAO,IAAI,yBAAyB,CAAC;AAGrC,cAAQ,QAAQ,CAAC,WAAW;AAC1B,YAAI,OAAO,WAAW;AACpB,iBAAO,IAAI,OAAO,SAAS;AAAA,QAC7B;AAAA,MACF,CAAC;AAGD,aAAO,IAAI,4BAA4B,CAAC;AACxC,aAAO,IAAI,4BAA4B,CAAC;AAAA,IAC1C;AAAA,IACA;AAAA,IACA,EAAC,MAAM,QAAQ,WAAU;AAAA,EAC3B;AACA,SAAO;AACT;AAKA,eAAe,2BAA2B,SAGvC;AACD,QAAM,EAAC,SAAS,WAAU,IAAI;AAC9B,QAAM,SAAuB,MAAM,OACjCL,MAAK,KAAK,SAAS,kBAAkB;AAEvC,QAAM,eAAeA,MAAK,KAAK,SAAS,qBAAqB;AAC7D,MAAI,CAAE,MAAM,WAAW,YAAY,GAAI;AACrC,UAAM,IAAI;AAAA,MACR,kBAAkB,YAAY;AAAA,IAChC;AAAA,EACF;AACA,QAAM,uBAAuBA,MAAK,KAAK,SAAS,qBAAqB;AACrE,MAAI,CAAE,MAAM,WAAW,oBAAoB,GAAI;AAC7C,UAAM,IAAI;AAAA,MACR,kBAAkB,oBAAoB;AAAA,IACxC;AAAA,EACF;AACA,QAAM,eAAe,MAAM,SAA6B,YAAY;AACpE,QAAM,WAAW,cAAc,iBAAiB,YAAY,YAAY;AACxE,QAAM,mBAAmB,MAAM,SAAc,oBAAoB;AACjE,QAAM,eAAe,aAAa,SAAS,gBAAgB;AAC3D,QAAM,WAAW,IAAI,OAAO,SAAS,YAAY,EAAC,UAAU,aAAY,CAAC;AACzE,SAAO,OAAO,KAAc,GAAa,SAAuB;AAC9D,QAAI,WAAW;AACf,SAAK;AAAA,EACP;AACF;AAKA,SAAS,2BAA2B;AAClC,SAAO,OAAO,KAAc,KAAe,SAAuB;AAChE,UAAM,WAAW,IAAI;AACrB,QAAI;AACF,YAAM,SAAS,OAAO,KAAK,KAAK,IAAI;AAAA,IACtC,SAAS,GAAG;AACV,UAAI;AACF,gBAAQ,MAAM,mBAAmB,IAAI,WAAW,EAAE;AAClD,gBAAQ,MAAM,EAAE,SAAS,CAAC;AAC1B,cAAM,EAAC,KAAI,IAAI,MAAM,SAAS,YAAY,CAAC;AAC3C,YAAI,OAAO,GAAG,EAAE,IAAI,EAAC,gBAAgB,YAAW,CAAC,EAAE,IAAI,IAAI;AAAA,MAC7D,SAAS,IAAI;AACX,gBAAQ,MAAM,+BAA+B;AAC7C,gBAAQ,MAAM,EAAE;AAChB,aAAK,CAAC;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,8BAA8B;AACrC,SAAO,OAAO,KAAc,QAAkB;AAC5C,YAAQ,MAAM,cAAS,IAAI,WAAW,EAAE;AACxC,QAAI,IAAI,UAAU;AAChB,YAAM,MAAM,IAAI;AAChB,YAAM,MAAMA,MAAK,QAAQ,GAAG;AAC5B,UAAI,CAAC,KAAK;AACR,cAAM,WAAW,IAAI;AACrB,cAAM,OAAO,MAAM,SAAS,UAAU,EAAC,aAAa,IAAG,CAAC;AACxD,cAAM,OAAO,KAAK,QAAQ;AAC1B,YAAI,OAAO,GAAG,EAAE,IAAI,EAAC,gBAAgB,YAAW,CAAC,EAAE,IAAI,IAAI;AAC3D;AAAA,MACF;AAAA,IACF;AACA,QAAI,OAAO,GAAG,EAAE,IAAI,EAAC,gBAAgB,aAAY,CAAC,EAAE,IAAI,KAAK;AAAA,EAC/D;AACF;AAEA,SAAS,8BAA8B;AACrC,SAAO,OAAO,KAAU,KAAc,KAAe,SAAuB;AAC1E,YAAQ,MAAM,cAAS,IAAI,WAAW,EAAE;AACxC,YAAQ,MAAM,OAAO,IAAI,SAAS,GAAG,CAAC;AACtC,QAAI,IAAI,UAAU;AAChB,YAAM,MAAM,IAAI;AAChB,YAAM,MAAMA,MAAK,QAAQ,GAAG;AAC5B,UAAI,CAAC,KAAK;AACR,cAAM,WAAW,IAAI;AACrB,cAAM,OAAO,MAAM,SAAS,YAAY,GAAG;AAC3C,cAAM,OAAO,KAAK,QAAQ;AAC1B,YAAI,OAAO,GAAG,EAAE,IAAI,EAAC,gBAAgB,YAAW,CAAC,EAAE,IAAI,IAAI;AAC3D;AAAA,MACF;AAAA,IACF;AACA,SAAK,GAAG;AAAA,EACV;AACF;;;AfzMA,IAAM,YAAN,MAAgB;AAAA,EACN;AAAA,EACA;AAAA,EAER,YAAY,MAAc,SAAiB;AACzC,SAAK,OAAO;AACZ,SAAK,UAAU;AAAA,EACjB;AAAA,EAEA,MAAM,IAAI,MAAgB;AACxB,UAAM,UAAU,IAAI,QAAQ,MAAM;AAClC,YAAQ,QAAQ,KAAK,OAAO;AAC5B,YAAQ,OAAO,eAAe,OAAO;AACrC,YAAQ,KAAK,aAAa,CAAC,QAAQ;AACjC,UAAI,CAAC,IAAI,KAAK,EAAE,OAAO;AACrB,gBAAQ;AAAA,UACN,aAAM,QAAQ,MAAM,IAAI,KAAK,IAAI,GAAG,CAAC,CAAC,KAAK,KAAK,OAAO;AAAA;AAAA,QACzD;AAAA,MACF;AAAA,IACF,CAAC;AACD,YACG,QAAQ,cAAc,EACtB,YAAY,0BAA0B,EACtC,OAAO,cAAc,0BAA0B,EAC/C;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,IACF,EACC;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,IACF,EACC;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,IACF,EACC,OAAO,KAAK;AACf,YACG,QAAQ,uBAAuB,EAC/B,YAAY,4BAA4B,EACxC,OAAO,kBAAkB,YAAY,EACrC,OAAO,OAAO;AACjB,YACG,QAAQ,uBAAuB,EAC/B,MAAM,SAAS,EACf;AAAA,MACC;AAAA,IACF,EACC,OAAO,qBAAqB,4CAA4C,EACxE,OAAO,kBAAkB,YAAY,EACrC,OAAO,iBAAiB,6CAA6C,EACrE;AAAA,MACC;AAAA,MACA;AAAA,IACF,EACC,OAAO,CAAC,gBAAgB,YAAY;AACnC,cAAQ,UAAU,KAAK;AACvB,oBAAc,gBAAgB,OAAO;AAAA,IACvC,CAAC;AACH,YACG,QAAQ,YAAY,EACpB,YAAY,uCAAuC,EACnD;AAAA,MACC;AAAA,MACA;AAAA,IACF,EACC,OAAO,GAAG;AACb,YACG,QAAQ,qBAAqB,EAC7B;AAAA,MACC;AAAA,IACF,EACC,OAAO,uBAAuB,gBAAgB,EAC9C,OAAO,qBAAqB,8BAA8B,EAC1D;AAAA,MACC;AAAA,MACA;AAAA,IACF,EACC;AAAA,MACC;AAAA,MACA;AAAA,IACF,EACC;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,IACF,EACC,OAAO,SAAS;AACnB,YACG,QAAQ,gBAAgB,EACxB,YAAY,mCAAmC,EAC/C;AAAA,MACC;AAAA,MACA;AAAA,IACF,EACC,OAAO,OAAO;AACjB,YACG,QAAQ,cAAc,EACtB,YAAY,sCAAsC,EAClD;AAAA,MACC;AAAA,MACA;AAAA,IACF,EACC,OAAO,KAAK;AACf,UAAM,QAAQ,WAAW,IAAI;AAAA,EAC/B;AACF;AAEA,SAAS,WAAW,OAAe;AACjC,QAAM,MAAM,SAAS,KAAK;AAC1B,MAAI,MAAM,GAAG,GAAG;AACd,UAAM,IAAI,qBAAqB,iBAAiB,KAAK,EAAE;AAAA,EACzD;AACA,SAAO;AACT;","names":["path","glob","fs","path","asset","path","fs","path","glob","importedCss","outFilePath","outPath","fileSize","fs","path","fileURLToPath","glob","__dirname","path","fileURLToPath","glob","fs","fs","path","path","fs","build","path","fileURLToPath","dim","glob","path","searchForWorkspaceRoot","path","searchForWorkspaceRoot","__dirname","path","fileURLToPath","start","dim","glob","fs","path","cookieParser","express","dim","sirv","path","dim","express","cookieParser","sirv","path","compression","cookieParser","express","dim","sirv","path","dim","express","compression","cookieParser","sirv"]}
|
package/dist/cli.js
CHANGED
package/dist/functions.js
CHANGED
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli/cli.ts","../src/cli/build.ts","../src/node/element-graph.ts","../src/render/asset-map/build-asset-map.ts","../src/utils/batch.ts","../src/cli/codegen.ts","../src/cli/create-package.ts","../src/cli/dev.ts","../src/middleware/hooks.ts","../src/middleware/redirects.ts","../src/render/asset-map/dev-asset-map.ts","../src/utils/ports.ts","../src/utils/rand.ts","../src/cli/gae-deploy.ts","../src/cli/preview.ts","../src/cli/start.ts"],"sourcesContent":["import {Command, InvalidArgumentError} from 'commander';\nimport {bgGreen, black} from 'kleur/colors';\nimport {build, BuildOptions} from './build.js';\nimport {codegen} from './codegen.js';\nimport {createPackage} from './create-package.js';\nimport {dev, createDevServer} from './dev.js';\nimport {gaeDeploy} from './gae-deploy.js';\nimport {preview, createPreviewServer} from './preview.js';\nimport {start, createProdServer} from './start.js';\n\nclass CliRunner {\n private name: string;\n private version: string;\n\n constructor(name: string, version: string) {\n this.name = name;\n this.version = version;\n }\n\n async run(argv: string[]) {\n const program = new Command('root');\n program.version(this.version);\n program.option('-q, --quiet', 'quiet');\n program.hook('preAction', (cmd) => {\n if (!cmd.opts().quiet) {\n console.log(\n `🥕 ${bgGreen(black(` ${this.name} `))} v${this.version}\\n`\n );\n }\n });\n program\n .command('build [path]')\n .description('generates a static build')\n .option('--ssr-only', 'produce a ssr-only build')\n .option(\n '--mode <mode>',\n 'see: https://vitejs.dev/guide/env-and-mode.html#modes',\n 'production'\n )\n .option(\n '-c, --concurrency <num>',\n 'number of files to build concurrently',\n '10'\n )\n .option(\n '--filter <urlPathRegex>',\n 'builds the url paths that match the given regex, e.g. \"/products/.*\"',\n ''\n )\n .action(build);\n program\n .command('codegen [type] [name]')\n .description('generates boilerplate code')\n .option('--out <outdir>', 'output dir')\n .action(codegen);\n program\n .command('create-package [path]')\n .alias('package')\n .description(\n 'creates a standalone npm package for deployment to various hosting services'\n )\n .option('--target <target>', 'hosting target, i.e. appengine or firebase')\n .option('--out <outdir>', 'output dir')\n .option('--mode <mode>', 'deployment mode, i.e. production or preview')\n .option(\n '--app-yaml <path>',\n 'for appengine targets, path to app.yaml (defaults to \"app.yaml\")'\n )\n .action((rootPackageDir, options) => {\n options.version = this.version;\n createPackage(rootPackageDir, options);\n });\n program\n .command('dev [path]')\n .description('starts the server in development mode')\n .option(\n '--host <host>',\n 'network address the server should listen on, e.g. 127.0.0.1'\n )\n .action(dev);\n program\n .command('gae-deploy <appdir>')\n .description(\n 'appengine deploy utility that can optionally run healthchecks before diverting traffic to the new version and clean up old versions'\n )\n .option('--project <project>', 'GCP project id')\n .option('--prefix <prefix>', 'prefix to append the version')\n .option(\n '--promote',\n 'whether to promote the version (if healthchecks pass)'\n )\n .option(\n '--healthcheck-url <url>',\n 'healthcheck url path (e.g. \"/healthcheck\") which should return a 200 status with the text \"OK\"'\n )\n .option(\n '--max-versions <num>',\n 'the max number of versions to keep',\n numberFlag\n )\n .action(gaeDeploy);\n program\n .command('preview [path]')\n .description('starts the server in preview mode')\n .option(\n '--host <host>',\n 'network address the server should listen on, e.g. 127.0.0.1'\n )\n .action(preview);\n program\n .command('start [path]')\n .description('starts the server in production mode')\n .option(\n '--host <host>',\n 'network address the server should listen on, e.g. 127.0.0.1'\n )\n .action(start);\n await program.parseAsync(argv);\n }\n}\n\nfunction numberFlag(value: string) {\n const num = parseInt(value);\n if (isNaN(num)) {\n throw new InvalidArgumentError(`not a number: ${value}`);\n }\n return num;\n}\n\nexport {\n CliRunner,\n build,\n BuildOptions,\n createPackage,\n dev,\n createDevServer,\n preview,\n createPreviewServer,\n start,\n createProdServer,\n};\n","/* eslint-disable no-control-regex */\nimport path from 'node:path';\nimport {fileURLToPath} from 'node:url';\n\nimport fsExtra from 'fs-extra';\nimport {dim, cyan} from 'kleur/colors';\nimport glob from 'tiny-glob';\nimport {build as viteBuild, Manifest, ManifestChunk, UserConfig} from 'vite';\n\nimport {getVitePlugins} from '../core/plugin.js';\nimport {Route, Sitemap} from '../core/types.js';\nimport {getElements} from '../node/element-graph.js';\nimport {bundleRootConfig, loadRootConfig} from '../node/load-config.js';\nimport {collectPods} from '../node/pod-collector.js';\nimport {rootPodsVitePlugin} from '../node/pods-vite-plugin.js';\nimport {preactToRootJsxPlugin} from '../node/vite-plugin-root-jsx-virtual.js';\nimport {BuildAssetMap} from '../render/asset-map/build-asset-map.js';\nimport {htmlMinify} from '../render/html-minify.js';\nimport {htmlPretty} from '../render/html-pretty.js';\nimport {batchAsyncCalls} from '../utils/batch.js';\nimport {\n copyGlob,\n fileExists,\n isDirectory,\n isJsFile,\n loadJson,\n makeDir,\n rmDir,\n writeFile,\n} from '../utils/fsutils.js';\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\n\ntype RenderModule = typeof import('../render/render.js');\n\nexport interface BuildOptions {\n ssrOnly?: boolean;\n mode?: string;\n concurrency?: string | number;\n filter?: string;\n}\n\nexport async function build(rootProjectDir?: string, options?: BuildOptions) {\n const mode = options?.mode || 'production';\n process.env.NODE_ENV = mode;\n\n const rootDir = path.resolve(rootProjectDir || process.cwd());\n const rootConfig = await loadRootConfig(rootDir, {command: 'build'});\n const distDir = path.join(rootDir, 'dist');\n const ssrOnly = options?.ssrOnly || false;\n\n console.log();\n console.log(`${dim('┃')} project: ${rootDir}`);\n console.log(`${dim('┃')} output: ${distDir}/html`);\n console.log(`${dim('┃')} mode: ${mode}`);\n console.log();\n\n await rmDir(distDir);\n await makeDir(distDir);\n\n const pods = await collectPods(rootConfig);\n\n const routeFiles: string[] = [];\n if (await isDirectory(path.join(rootDir, 'routes'))) {\n const pageFiles = await glob('routes/**/*', {cwd: rootDir});\n pageFiles.forEach((file) => {\n const parts = path.parse(file);\n if (!parts.name.startsWith('_') && isJsFile(parts.base)) {\n routeFiles.push(path.resolve(rootDir, file));\n }\n });\n }\n // Add pod route files for the CSS extraction pass.\n for (const pod of pods) {\n for (const route of pod.routeFiles) {\n routeFiles.push(route.filePath);\n }\n }\n\n const elementGraph = await getElements(rootConfig, pods);\n const elements = Object.values(elementGraph.sourceFiles).map((sourceFile) => {\n return sourceFile.filePath;\n });\n\n const bundleScripts: string[] = [];\n if (await isDirectory(path.join(rootDir, 'bundles'))) {\n const bundleFiles = await glob('bundles/*', {cwd: rootDir});\n bundleFiles.forEach((file) => {\n const parts = path.parse(file);\n if (isJsFile(parts.base)) {\n bundleScripts.push(path.resolve(rootDir, file));\n }\n });\n }\n // Add pod bundle files.\n for (const pod of pods) {\n for (const bundleFile of pod.bundleFiles) {\n bundleScripts.push(bundleFile);\n }\n }\n\n const rootPlugins = rootConfig.plugins || [];\n const viteConfig = rootConfig.vite || {};\n\n for (const plugin of rootPlugins) {\n if (plugin.hooks?.preBuild) {\n await plugin.hooks.preBuild(rootConfig);\n }\n }\n\n const vitePlugins = [\n preactToRootJsxPlugin({useRootJsx: !!rootConfig.jsxRenderer?.mode}),\n rootPodsVitePlugin(rootConfig),\n ...(viteConfig.plugins || []),\n ...getVitePlugins(rootPlugins),\n ];\n\n const baseConfig: UserConfig = {\n ...viteConfig,\n root: rootDir,\n mode: mode,\n plugins: vitePlugins,\n };\n\n // Bundle the render.js file with vite along with any plugins `ssrInput()`\n // config values. These inputs are bundled through vite and support things\n // like `input.meta.glob()`.\n const ssrInput = {\n render: path.resolve(__dirname, './render.js'),\n };\n rootPlugins.forEach((plugin) => {\n if (plugin.ssrInput) {\n Object.assign(ssrInput, plugin.ssrInput());\n }\n });\n const noExternalConfig = viteConfig.ssr?.noExternal;\n const noExternal: Array<string | RegExp> = [];\n if (noExternalConfig) {\n if (Array.isArray(noExternalConfig)) {\n noExternal.push(...noExternalConfig);\n } else {\n noExternal.push(noExternalConfig as string | RegExp);\n }\n }\n await viteBuild({\n ...baseConfig,\n publicDir: false,\n build: {\n ...viteConfig?.build,\n rolldownOptions: {\n ...viteConfig?.build?.rolldownOptions,\n input: ssrInput,\n output: {\n format: 'esm',\n chunkFileNames: 'chunks/[hash].min.js',\n assetFileNames: 'assets/[hash][extname]',\n sanitizeFileName: sanitizeFileName,\n },\n },\n outDir: path.join(distDir, 'server'),\n ssr: true,\n ssrManifest: false,\n cssCodeSplit: true,\n target: 'esnext',\n minify: false,\n modulePreload: {polyfill: false},\n reportCompressedSize: false,\n sourcemap: 'inline',\n },\n ssr: {\n ...viteConfig.ssr,\n target: 'node',\n noExternal: ['@blinkk/root', /^virtual:/, ...noExternal],\n },\n });\n\n // Pre-render CSS deps from /routes/.\n await viteBuild({\n ...baseConfig,\n publicDir: false,\n build: {\n ...viteConfig?.build,\n rolldownOptions: {\n ...viteConfig?.build?.rolldownOptions,\n input: [...routeFiles],\n output: {\n format: 'esm',\n entryFileNames: 'assets/[hash].min.js',\n assetFileNames: 'assets/[hash][extname]',\n chunkFileNames: 'chunks/[hash].min.js',\n sanitizeFileName: sanitizeFileName,\n ...viteConfig?.build?.rolldownOptions?.output,\n },\n },\n outDir: path.join(distDir, '.build/routes'),\n ssr: true,\n ssrManifest: false,\n ssrEmitAssets: true,\n manifest: true,\n cssCodeSplit: true,\n target: 'esnext',\n minify: true,\n modulePreload: {polyfill: false},\n reportCompressedSize: false,\n },\n });\n\n // Pre-render /elements/ and /bundles/.\n const clientInput = [...elements, ...bundleScripts];\n if (clientInput.length > 0) {\n await viteBuild({\n ...baseConfig,\n publicDir: false,\n build: {\n ...viteConfig?.build,\n rolldownOptions: {\n ...viteConfig?.build?.rolldownOptions,\n input: [...elements, ...bundleScripts],\n output: {\n format: 'esm',\n entryFileNames: 'assets/[hash].min.js',\n assetFileNames: 'assets/[hash][extname]',\n chunkFileNames: 'chunks/[hash].min.js',\n sanitizeFileName: sanitizeFileName,\n ...viteConfig?.build?.rolldownOptions?.output,\n },\n },\n outDir: path.join(distDir, '.build/client'),\n ssr: false,\n ssrManifest: false,\n manifest: true,\n cssCodeSplit: true,\n target: 'esnext',\n minify: true,\n modulePreload: {polyfill: false},\n reportCompressedSize: false,\n },\n });\n } else {\n await writeFile(\n path.join(distDir, '.build/client/.vite/manifest.json'),\n '{}'\n );\n }\n\n // Bundle the root.config.ts file to dist/root.config.js.\n await bundleRootConfig(rootDir, path.join(distDir, 'root.config.js'));\n\n // Copy CSS files from `dist/.build/routes/**/*.css` to\n // `dist/.build/client/` and flatten the routes manifest to ignore any\n // imported modules. Then add the route assets to the client manifest.\n await copyGlob(\n '**/*.css',\n path.join(distDir, '.build/routes'),\n path.join(distDir, '.build/client')\n );\n const routesManifest = await loadJson<Manifest>(\n path.join(distDir, '.build/routes/.vite/manifest.json')\n );\n const clientManifest = await loadJson<Manifest>(\n path.join(distDir, '.build/client/.vite/manifest.json')\n );\n function collectRouteCss(\n asset: ManifestChunk,\n cssDeps: Set<string>,\n visited: Set<string>\n ) {\n if (!asset || !asset.file || visited.has(asset.file)) {\n return;\n }\n visited.add(asset.file);\n if (asset.css) {\n asset.css.forEach((dep) => cssDeps.add(dep));\n }\n if (asset.imports) {\n asset.imports.forEach((manifestKey) => {\n collectRouteCss(routesManifest[manifestKey], cssDeps, visited);\n });\n }\n }\n Object.keys(routesManifest).forEach((manifestKey) => {\n const asset = routesManifest[manifestKey];\n if (asset.isEntry) {\n const visited = new Set<string>();\n const cssDeps = new Set<string>();\n collectRouteCss(asset, cssDeps, visited);\n asset.css = Array.from(cssDeps);\n asset.imports = [];\n clientManifest[manifestKey] = asset;\n } else if (asset.file.endsWith('.css')) {\n clientManifest[manifestKey] = asset;\n }\n });\n\n // Use the output of the client build to generate an asset map, which is used\n // by the renderer for automatically injecting dependencies for a page.\n const assetMap = BuildAssetMap.fromViteManifest(\n rootConfig,\n clientManifest,\n elementGraph\n );\n\n // Save the root's asset map to `dist/.root/manifest.json` for use by the prod\n // SSR server.\n const rootManifest = assetMap.toJson();\n await writeFile(\n path.join(distDir, '.root/manifest.json'),\n JSON.stringify(rootManifest, null, 2)\n );\n\n // Save the element graph to `dist/.root/elements.json` for use by the prod\n // SSR server.\n const elementGraphJson = elementGraph.toJson();\n await writeFile(\n path.join(distDir, '.root/elements.json'),\n JSON.stringify(elementGraphJson, null, 2)\n );\n\n // Write SSG output to `dist/html`.\n const buildDir = path.join(distDir, 'html');\n\n // Recursively copy files from `public` to `dist/html`.\n const publicDir = path.join(rootDir, 'public');\n if (fsExtra.existsSync(path.join(rootDir, 'public'))) {\n fsExtra.copySync(publicDir, buildDir, {dereference: true});\n } else {\n await makeDir(buildDir);\n }\n\n const seenAssets = new Set<string>();\n async function copyAssetToDistHtml(assetUrl: string) {\n if (seenAssets.has(assetUrl)) {\n return;\n }\n seenAssets.add(assetUrl);\n const assetRelPath = assetUrl.slice(1);\n const assetFrom = path.join(distDir, '.build/client', assetRelPath);\n const assetTo = path.join(buildDir, assetRelPath);\n // Ignore assets that don't exist. This is because build artifacts from\n // the routes/ folder are not copied to dist/client (only css deps are).\n if (!(await fileExists(assetFrom))) {\n console.log(`${assetFrom} does not exist`);\n return;\n }\n await fsExtra.copy(assetFrom, assetTo);\n printFileOutput(fileSize(assetTo), 'dist/html/', assetRelPath);\n }\n\n // Copy files from `dist/client/{assets,chunks}` to `dist/html` using the\n // root manifest. Ignore route files.\n console.log('\\njs/css output:');\n await Promise.all(\n Object.keys(rootManifest).map(async (src) => {\n const assetData = rootManifest[src];\n // Only imported css from routes files should be included in build output.\n // Don't expose route files in the final output. If any client-side code\n // relies on route dependencies, it should probably be broken out into a\n // shared component instead.\n if (isRouteFile(src)) {\n const importedCss = assetData.importedCss || [];\n for (const cssAssetUrl of importedCss) {\n await copyAssetToDistHtml(cssAssetUrl);\n }\n return;\n }\n\n // Ignore files with no assetUrl, which can sometimes occur if a source\n // file is empty.\n if (!assetData.assetUrl) {\n return;\n }\n\n // Copy assets and any imported css files.\n await copyAssetToDistHtml(assetData.assetUrl);\n const importedCss = assetData.importedCss || [];\n for (const cssAssetUrl of importedCss) {\n await copyAssetToDistHtml(cssAssetUrl);\n }\n })\n );\n\n // Pre-render HTML pages (SSG).\n if (!ssrOnly) {\n const render: RenderModule = await import(\n path.join(distDir, 'server/render.js')\n );\n const renderer = new render.Renderer(rootConfig, {assetMap, elementGraph});\n let sitemap = await renderer.getSitemap();\n\n // If the `--filter` flag is passed, build only the paths that match the\n // given regex.\n if (options?.filter) {\n const filterRegex = new RegExp(`^${options.filter}`);\n const filteredSitemap: Sitemap = {};\n Object.entries(sitemap).forEach(([urlPath, sitemapItem]) => {\n if (urlPath.match(filterRegex)) {\n filteredSitemap[urlPath] = sitemapItem;\n }\n });\n sitemap = filteredSitemap;\n }\n\n const sitemapXmlItems: Array<{\n url: string;\n locale: string;\n alts: Array<{locale: string; hreflang: string; url: string}>;\n }> = [];\n if (rootConfig.sitemap && !rootConfig.domain) {\n throw new Error(\n 'missing \"domain\" in root.config.ts, required when using {sitemap: true}'\n );\n }\n const domain = rootConfig.domain!;\n\n console.log('\\nhtml output:');\n const batchSize = Number(options?.concurrency || 10);\n\n await batchAsyncCalls(\n Object.entries(sitemap),\n batchSize,\n async ([urlPath, sitemapItem]) => {\n // If \"excludeDefaultLocaleFromIntlPaths\" is true, ignore /intl/en/... in\n // the SSG build and exclude it from sitemap.xml.\n if (rootConfig.build?.excludeDefaultLocaleFromIntlPaths) {\n const defaultLocale = rootConfig.i18n?.defaultLocale || 'en';\n if (sitemapItem.locale === defaultLocale) {\n return;\n }\n }\n\n try {\n const routeModule = sitemapItem.route.module;\n if (routeModule.getStaticContent) {\n let props: any;\n if (routeModule.getStaticProps) {\n props = await routeModule.getStaticProps({\n rootConfig,\n params: sitemapItem.params,\n });\n if (props?.notFound) {\n return;\n }\n } else {\n props = {rootConfig, params: sitemapItem.params};\n }\n const result = await routeModule.getStaticContent(props);\n let body: string;\n if (typeof result === 'string') {\n body = result;\n } else if (result && typeof result === 'object') {\n body = result.body;\n } else {\n body = '';\n }\n const outFilePath = urlPath.slice(1);\n const outPath = path.join(buildDir, outFilePath);\n await makeDir(path.dirname(outPath));\n await writeFile(outPath, body);\n printFileOutput(fileSize(outPath), 'dist/html/', outFilePath);\n return;\n }\n\n const data = await renderer.renderRoute(sitemapItem.route, {\n routeParams: sitemapItem.params,\n });\n if (data.notFound) {\n return;\n }\n\n let outFilePath = path.join(urlPath.slice(1), 'index.html');\n if (outFilePath.endsWith('404/index.html')) {\n outFilePath = outFilePath.replace('404/index.html', '404.html');\n }\n const outPath = path.join(buildDir, outFilePath);\n\n // Save the url to sitemap.xml. Ignore error files (e.g. 404.html).\n if (rootConfig.sitemap && outFilePath.endsWith('index.html')) {\n const sitemapXmlItem: {\n url: string;\n locale: string;\n alts: Array<{locale: string; hreflang: string; url: string}>;\n } = {\n url: `${domain}${urlPath}`,\n locale: sitemapItem.locale,\n alts: [],\n };\n sitemapXmlItems.push(sitemapXmlItem);\n if (sitemapItem.alts) {\n Object.entries(sitemapItem.alts).forEach(([altLocale, item]) => {\n sitemapXmlItem.alts.push({\n url: `${domain}${item.urlPath}`,\n locale: altLocale,\n hreflang: item.hrefLang,\n });\n });\n }\n }\n\n // Render html and save the file to dist/html.\n // TODO(stevenle): consolidate post-build html transformation logic.\n let html = data.html || '';\n if (rootConfig.prettyHtml) {\n html = await htmlPretty(html, rootConfig.prettyHtmlOptions);\n } else if (rootConfig.minifyHtml) {\n html = await htmlMinify(html, rootConfig.minifyHtmlOptions);\n }\n await writeFile(outPath, html);\n\n printFileOutput(fileSize(outPath), 'dist/html/', outFilePath);\n } catch (e) {\n logBuildError(\n {route: sitemapItem.route, params: sitemapItem.params, urlPath},\n e\n );\n throw new Error(\n `BuildError: ${urlPath} (${sitemapItem.route.src}) failed to build.`\n );\n }\n }\n );\n\n // Generate sitemap.xml.\n if (rootConfig.sitemap) {\n const sitemapXmlBuilder: string[] = [];\n sitemapXmlItems.sort((a, b) => a.url.localeCompare(b.url));\n sitemapXmlItems.forEach((item) => {\n sitemapXmlBuilder.push('<url>');\n sitemapXmlBuilder.push(` <loc>${item.url}</loc>`);\n if (item.alts.length > 0) {\n item.alts.sort((a, b) => a.hreflang.localeCompare(b.hreflang));\n item.alts.forEach((alt) => {\n if (item.locale !== alt.locale) {\n sitemapXmlBuilder.push(\n ` <xhtml:link rel=\"alternate\" hreflang=\"${alt.hreflang}\" href=\"${alt.url}\" />`\n );\n }\n });\n }\n sitemapXmlBuilder.push('</url>');\n });\n\n const sitemapXmlLines = [\n '<?xml version=\"1.0\" encoding=\"UTF-8\"?>',\n '<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\" xmlns:xhtml=\"http://www.w3.org/1999/xhtml\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd\">',\n ...sitemapXmlBuilder,\n '</urlset>',\n ];\n const sitemapXml = sitemapXmlLines.join('\\n');\n const outPath = path.join(buildDir, 'sitemap.xml');\n await writeFile(outPath, sitemapXml);\n printFileOutput(fileSize(outPath), 'dist/html/', 'sitemap.xml');\n }\n }\n\n // Run postBuild hooks.\n for (const plugin of rootPlugins) {\n if (plugin.hooks?.postBuild) {\n await plugin.hooks.postBuild(rootConfig, {ssrOnly});\n }\n }\n}\n\nfunction isRouteFile(filepath: string) {\n return filepath.startsWith('routes') && isJsFile(filepath);\n}\n\nfunction fileSize(filepath: string) {\n const stats = fsExtra.statSync(filepath);\n const bytes = stats.size;\n\n const k = 1024;\n if (bytes < k) {\n return (bytes / k).toFixed(2) + ' kB';\n }\n const units = ['B', 'kB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + units[i];\n}\n\nfunction printFileOutput(\n fileSize: string,\n outputDir: string,\n outputFile: string\n) {\n const indent = ' '.repeat(2);\n const paddedSize = fileSize.padStart(9, ' ');\n console.log(\n `${indent}${dim(paddedSize)} ${dim(outputDir)}${cyan(outputFile)}`\n );\n}\n\nfunction sanitizeFileName(name: string): string {\n return (\n name\n // Remove placeholder vars from paths like routes/[...var].tsx.\n .replaceAll('...', '')\n .replaceAll('_', '')\n .replaceAll('[', '')\n .replaceAll(']', '')\n // Remove non-ascii chars and null bytes.\n .replace(/[^\\x00-\\x7F]/g, '')\n .replace(/\\x00/g, '')\n .toLowerCase()\n );\n}\n\ninterface BuildContext {\n route: Route;\n params: Record<string, string>;\n urlPath: string;\n}\n\nfunction logBuildError(ctx: BuildContext, e: Error) {\n const {route, params, urlPath} = ctx;\n const errorString = String(e.stack || e);\n console.error();\n if (Object.keys(params).length > 0) {\n console.error(\n `An error occurred building ${urlPath} (${route.src}) with params:\n${formatParams(params)}\n\nThe error was:\n ${errorString}\n `.trim()\n );\n } else {\n console.error(\n `An error occurred building ${urlPath} (${route.src})\n\nThe error was:\n ${errorString}`\n );\n }\n}\n\nfunction formatParams(params: Record<string, string>) {\n return Object.entries(params)\n .map(([key, value]) => {\n return ` ${key}: ${value}`;\n })\n .join('\\n');\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport glob from 'tiny-glob';\nimport {searchForWorkspaceRoot} from 'vite';\nimport {RootConfig} from '../core/config.js';\nimport {isValidTagName, parseTagNames} from '../utils/elements.js';\nimport {directoryContains, isDirectory, isJsFile} from '../utils/fsutils.js';\nimport type {ResolvedPod} from './pod-collector.js';\n\ninterface ElementSourceFile {\n /** Full file path. */\n filePath: string;\n /** Path relative to the root project directory. */\n relPath: string;\n}\n\n/**\n * Dependency graph for element files to capture which other elements are used\n * by any particular element.\n */\nexport class ElementGraph {\n /**\n * Element tagName => sourceFile.\n */\n readonly sourceFiles: {[tagName: string]: ElementSourceFile} = {};\n\n /**\n * Element tagName => set of element tagName dependencies.\n */\n private deps: Record<string, string[]> = {};\n\n constructor(sourceFiles: {[tagName: string]: ElementSourceFile}) {\n this.sourceFiles = sourceFiles;\n }\n\n toJson() {\n for (const tagName in this.sourceFiles) {\n this.deps[tagName] ??= this.parseDepsFromSource(tagName);\n }\n return {\n sourceFiles: this.sourceFiles,\n deps: this.deps,\n };\n }\n\n static fromJson(data: {deps: any; sourceFiles: any}) {\n const graph = new ElementGraph(data.sourceFiles);\n graph.deps = data.deps;\n return graph;\n }\n\n getDeps(tagName: string, visited?: Set<string>): string[] {\n visited ??= new Set();\n if (visited.has(tagName)) {\n return [];\n }\n\n visited.add(tagName);\n this.deps[tagName] ??= this.parseDepsFromSource(tagName);\n\n const deps = new Set(this.deps[tagName]);\n for (const depTagName of this.deps[tagName]) {\n for (const childDep of this.getDeps(depTagName, visited)) {\n deps.add(childDep);\n }\n }\n return Array.from(deps);\n }\n\n /**\n * Parses an element's source file for usage of other custom elements.\n */\n private parseDepsFromSource(tagName: string): string[] {\n const srcFile = this.sourceFiles[tagName];\n if (!srcFile) {\n throw new Error(`could not find file path for tagName <${tagName}>`);\n }\n const src = fs.readFileSync(srcFile.filePath, 'utf-8');\n const tagNames = parseTagNames(src);\n const deps = new Set<string>();\n for (const depTagName of tagNames) {\n if (depTagName !== tagName && depTagName in this.sourceFiles) {\n deps.add(depTagName);\n }\n }\n return Array.from(deps);\n }\n}\n\n/**\n * Returns a map of all the element file definitions in the project.\n */\nexport async function getElements(\n rootConfig: RootConfig,\n pods?: ResolvedPod[]\n): Promise<ElementGraph> {\n const rootDir = rootConfig.rootDir;\n\n const elementsDirs = getElementsDirs(rootConfig, pods);\n const excludePatterns = rootConfig.elements?.exclude || [];\n const excludeElement = (moduleId: string) => {\n return excludePatterns.some((pattern) => Boolean(moduleId.match(pattern)));\n };\n\n const elementFilePaths: {[tagName: string]: ElementSourceFile} = {};\n for (const dirPath of elementsDirs) {\n if (await isDirectory(dirPath)) {\n const files = await glob('**/*', {cwd: dirPath});\n files.forEach((file) => {\n const parts = path.parse(file);\n if (isJsFile(parts.base) && isValidTagName(parts.name)) {\n const tagName = parts.name;\n const filePath = path.join(dirPath, file);\n const relPath = path.relative(rootDir, filePath);\n if (!excludeElement(relPath)) {\n elementFilePaths[tagName] = {filePath, relPath};\n }\n }\n });\n }\n }\n\n const graph = new ElementGraph(elementFilePaths);\n return graph;\n}\n\n/**\n * Get all element dirs.\n */\nexport function getElementsDirs(rootConfig: RootConfig, pods?: ResolvedPod[]) {\n const rootDir = rootConfig.rootDir;\n const workspaceRoot = searchForWorkspaceRoot(rootDir);\n\n const elementsDirs = [path.join(rootDir, 'elements')];\n const elementsInclude = rootConfig.elements?.include || [];\n\n for (const dirPath of elementsInclude) {\n const elementsDir = path.resolve(rootDir, dirPath);\n if (!directoryContains(rootDir, elementsDir)) {\n throw new Error(\n `the elements dir (${dirPath}) should be within the project's workspace (${workspaceRoot})`\n );\n }\n elementsDirs.push(elementsDir);\n }\n\n // Pod-contributed element dirs bypass the workspace containment check\n // because they are trusted (registered by plugins, not user input).\n if (pods) {\n for (const pod of pods) {\n for (const dir of pod.elementsDirs) {\n elementsDirs.push(dir);\n }\n }\n }\n\n return elementsDirs;\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport {Manifest} from 'vite';\nimport {RootConfig} from '../../core/config.js';\nimport {ElementGraph} from '../../node/element-graph.js';\nimport {isJsFile} from '../../utils/fsutils.js';\nimport {Asset, AssetMap} from './asset-map.js';\n\nexport type BuildAssetManifest = Record<\n string,\n {\n src: string;\n assetUrl: string;\n importedModules: string[];\n importedCss: string[];\n isElement: boolean;\n }\n>;\n\nexport class BuildAssetMap implements AssetMap {\n private rootConfig: RootConfig;\n private srcToAsset: Map<string, BuildAsset>;\n\n constructor(rootConfig: RootConfig) {\n this.rootConfig = rootConfig;\n this.srcToAsset = new Map();\n }\n\n async get(src: string): Promise<Asset | null> {\n const asset = this.srcToAsset.get(src);\n if (asset) {\n return asset;\n }\n // Try resolving the realpath of the asset, following symlinks.\n const realSrc = realPathRelativeTo(this.rootConfig.rootDir, src);\n if (realSrc !== src) {\n const asset = this.srcToAsset.get(realSrc);\n if (asset) {\n return asset;\n }\n }\n console.log(`could not find build asset: ${src}`);\n return null;\n }\n\n private add(asset: BuildAsset) {\n this.srcToAsset.set(asset.src, asset);\n }\n\n toJson(): BuildAssetManifest {\n const result: BuildAssetManifest = {};\n for (const src of this.srcToAsset.keys()) {\n result[src] = this.srcToAsset.get(src)!.toJson();\n }\n return result;\n }\n\n static fromViteManifest(\n rootConfig: RootConfig,\n clientManifest: Manifest,\n elementsGraph: ElementGraph\n ) {\n const assetMap = new BuildAssetMap(rootConfig);\n\n const elementFiles = new Set();\n Object.values(elementsGraph.sourceFiles).forEach((elementSource) => {\n elementFiles.add(elementSource.relPath);\n // Vite will resolve symlinks, so we need to follow the src and add the\n // realpath to the element files.\n const realSrc = realPathRelativeTo(\n rootConfig.rootDir,\n elementSource.relPath\n );\n if (realSrc !== elementSource.filePath) {\n elementFiles.add(realSrc);\n }\n });\n\n Object.keys(clientManifest).forEach((manifestKey) => {\n const src = manifestKey;\n const manifestChunk = clientManifest[manifestKey];\n const isElement = elementFiles.has(src);\n // NOTES(stevenle): routes/ files are included in the manifest for\n // their CSS deps, but do not have an asset URL.\n const assetUrl =\n src.startsWith('routes/') && isJsFile(src)\n ? ''\n : `/${manifestChunk.file}`;\n const assetData = {\n src: src,\n assetUrl: assetUrl,\n importedModules: manifestChunk.imports || [],\n importedCss: (manifestChunk.css || []).map((relPath) => `/${relPath}`),\n isElement: isElement,\n };\n assetMap.add(new BuildAsset(assetMap, assetData));\n });\n\n return assetMap;\n }\n\n static fromRootManifest(\n rootConfig: RootConfig,\n rootManifest: BuildAssetManifest\n ) {\n const assetMap = new BuildAssetMap(rootConfig);\n Object.keys(rootManifest).forEach((moduleId) => {\n const assetData = rootManifest[moduleId];\n assetMap.add(new BuildAsset(assetMap, assetData));\n });\n return assetMap;\n }\n}\n\n/**\n * Returns the realpath of a src file, relative to the rootDir.\n */\nfunction realPathRelativeTo(rootDir: string, src: string) {\n const fullPath = path.resolve(rootDir, src);\n if (!fs.existsSync(fullPath)) {\n return src;\n }\n const realpath = fs.realpathSync(path.resolve(rootDir, src));\n return path.relative(rootDir, realpath);\n}\n\nexport class BuildAsset {\n src: string;\n assetUrl: string;\n private assetMap: BuildAssetMap;\n private importedModules: string[];\n private importedCss: string[];\n isElement: boolean;\n\n constructor(\n assetMap: BuildAssetMap,\n assetData: {\n src: string;\n assetUrl: string;\n importedModules: string[];\n importedCss: string[];\n isElement: boolean;\n }\n ) {\n this.assetMap = assetMap;\n this.src = assetData.src;\n this.assetUrl = assetData.assetUrl;\n this.importedModules = assetData.importedModules;\n this.importedCss = assetData.importedCss;\n this.isElement = assetData.isElement;\n }\n\n async getCssDeps(): Promise<string[]> {\n const visited = new Set<string>();\n const deps = new Set<string>();\n await this.collectCss(this, deps, visited);\n return Array.from(deps);\n }\n\n async getJsDeps(): Promise<string[]> {\n const visited = new Set<string>();\n const deps = new Set<string>();\n await this.collectJs(this, deps, visited);\n return Array.from(deps);\n }\n\n private async collectJs(\n asset: BuildAsset | null,\n urls: Set<string>,\n visited: Set<string>\n ) {\n if (!asset) {\n return;\n }\n if (!asset.src) {\n return;\n }\n if (visited.has(asset.src)) {\n return;\n }\n visited.add(asset.src);\n if (asset.isElement) {\n urls.add(asset.assetUrl);\n }\n await Promise.all(\n asset.importedModules.map(async (src) => {\n const importedAsset = (await this.assetMap.get(src)) as BuildAsset;\n this.collectJs(importedAsset, urls, visited);\n })\n );\n }\n\n private async collectCss(\n asset: BuildAsset | null,\n urls: Set<string>,\n visited: Set<string>\n ) {\n if (!asset) {\n return;\n }\n if (!asset.src) {\n return;\n }\n if (visited.has(asset.src)) {\n return;\n }\n visited.add(asset.src);\n if (asset.importedCss) {\n asset.importedCss.forEach((cssUrl) => urls.add(cssUrl));\n }\n await Promise.all(\n asset.importedModules.map(async (moduleId) => {\n const importedAsset = (await this.assetMap.get(moduleId)) as BuildAsset;\n this.collectCss(importedAsset, urls, visited);\n })\n );\n }\n\n toJson() {\n return {\n src: this.src,\n assetUrl: this.assetUrl,\n importedModules: this.importedModules,\n importedCss: this.importedCss,\n isElement: this.isElement,\n };\n }\n}\n","export async function batchAsyncCalls<T, U>(\n data: T[],\n concurrency: number,\n asyncFunction: (item: T) => Promise<U>\n): Promise<U[]> {\n const result: U[] = new Array(data.length);\n let nextIndex = 0;\n\n async function worker() {\n while (nextIndex < data.length) {\n const index = nextIndex++;\n result[index] = await asyncFunction(data[index]);\n }\n }\n\n const workers = Array.from(\n {length: Math.min(concurrency, data.length)},\n () => worker()\n );\n await Promise.all(workers);\n return result;\n}\n","import {promises as fs} from 'node:fs';\nimport path from 'node:path';\nimport {fileURLToPath} from 'node:url';\nimport glob from 'tiny-glob';\nimport {dirExists, makeDir, rmDir, writeFile} from '../utils/fsutils.js';\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\n\ninterface CodegenOptions {\n out?: string;\n}\n\ninterface Template {\n read: () => Promise<string>;\n}\n\ntype TemplateMap = Record<string, Template>;\n\nexport async function codegen(\n type: string,\n name: string,\n options?: CodegenOptions\n) {\n const rootDir = path.resolve(process.cwd());\n const project = new Project(rootDir);\n await project.generateCode(type, name, options);\n}\n\nclass Project {\n rootDir: string;\n tplDirs: string[];\n\n constructor(rootDir: string) {\n this.rootDir = rootDir;\n this.tplDirs = [\n path.join(rootDir, 'codegen'),\n path.join(__dirname, '../codegen'),\n ];\n }\n\n async generateCode(type: string, name: string, options?: CodegenOptions) {\n const files = await this.loadFiles(type);\n if (Object.keys(files).length === 0) {\n console.log(`no files in codegen/${type}/*.tpl`);\n return;\n }\n\n // By default, running `root codegen template Foo` outputs to\n // `<rootDir>/templates/Foo`.\n const outname = options?.out || `${type}s`;\n const outdir = path.join(this.rootDir, outname, name);\n if (await dirExists(outdir)) {\n await rmDir(outdir);\n }\n await makeDir(outdir);\n\n for (const tplName in files) {\n const tpl = await files[tplName].read();\n const content = tpl\n .replaceAll('[[name]]', name)\n .replaceAll('[[name:camel_upper]]', toCamelCaseUpper(name));\n const filename = tplName.replace('[name]', name);\n const filepath = path.join(outdir, filename);\n await writeFile(filepath, content);\n console.log(`saved ${filepath}`);\n }\n }\n\n /**\n * Searches the project's \"codegen\" dir (or fallsback to root's \"codegen\" dir)\n * and returns a `TemplateMap` for all files in `codgen/<type>/*.tpl`.\n */\n async loadFiles(type: string): Promise<TemplateMap> {\n for (const tplDir of this.tplDirs) {\n const typeDir = path.join(tplDir, type);\n if (await dirExists(typeDir)) {\n return this.loadTplFiles(typeDir);\n }\n }\n return {};\n }\n\n /**\n * Reads files matching `*.tpl` in a given directory.\n */\n private async loadTplFiles(dirpath: string): Promise<TemplateMap> {\n const tplFiles: TemplateMap = {};\n const files = await glob('*.tpl', {cwd: dirpath});\n for (const filename of files) {\n const filepath = path.join(dirpath, filename);\n // Remove `.tpl`.\n const name = filename.slice(0, -4);\n tplFiles[name] = {\n read: () => fs.readFile(filepath, 'utf-8'),\n };\n }\n return tplFiles;\n }\n}\n\nfunction toCamelCaseUpper(str: string) {\n const segments = str.split('-');\n return segments.map((part) => toTitleCase(part)).join('');\n}\n\nfunction toTitleCase(str: string) {\n const ch = String(str).charAt(0).toUpperCase();\n return `${ch}${str.slice(1)}`;\n}\n","import {promises as fs} from 'node:fs';\nimport path from 'node:path';\nimport {build as esbuild} from 'esbuild';\nimport {flattenPackageDepsFromMonorepo} from '../node/monorepo.js';\nimport {\n copyDir,\n dirExists,\n fileExists,\n loadJson,\n makeDir,\n rmDir,\n writeJson,\n} from '../utils/fsutils.js';\nimport {build as rootBuild} from './build.js';\n\ntype DeployTarget = 'appengine' | 'firebase';\n\ninterface CreatePackageOptions {\n mode?: string;\n out?: string;\n target?: DeployTarget;\n version?: string;\n appYaml?: string;\n}\n\ninterface PeerDependencyMeta {\n optional?: boolean;\n}\n\ninterface PackageJson {\n [key: string]: any;\n scripts?: Record<string, string>;\n dependencies?: Record<string, string>;\n peerDependencies?: Record<string, string>;\n peerDependenciesMeta?: Record<string, PeerDependencyMeta>;\n workspaces?: string[];\n}\n\nexport async function createPackage(\n rootProjectDir?: string,\n options?: CreatePackageOptions\n) {\n const mode = options?.mode || 'production';\n process.env.NODE_ENV = mode;\n\n const rootDir = path.resolve(rootProjectDir || process.cwd());\n // const rootConfig = await loadRootConfig(rootDir, {command: 'build'});\n const distDir = path.join(rootDir, 'dist');\n const target = options?.target || (await getDefaultTarget(rootDir));\n const outDir = path.resolve(options?.out || target || 'out');\n\n // Build the site in ssr-only mode.\n await rootBuild(rootProjectDir, {ssrOnly: true, mode: mode});\n\n // Create `outDir` and copy the generated `distDir` files to it.\n await rmDir(outDir);\n await makeDir(outDir);\n await copyDir(distDir, path.resolve(outDir, 'dist'));\n\n // Copy the \"collections\" dir if it exists.\n const collectionsDir = path.resolve(rootDir, 'collections');\n if (await dirExists(collectionsDir)) {\n await copyDir(collectionsDir, path.join(outDir, 'collections'));\n }\n\n // Create package.json.\n const packageJson = await generatePackageJson(rootDir, options);\n\n // Set root.js versions.\n if (options?.version && packageJson.dependencies) {\n if (packageJson.dependencies['@blinkk/root']) {\n packageJson.dependencies['@blinkk/root'] = options.version;\n }\n if (packageJson.dependencies['@blinkk/root-cms']) {\n packageJson.dependencies['@blinkk/root-cms'] = options.version;\n }\n if (packageJson.dependencies['@blinkk/root-password-protect']) {\n packageJson.dependencies['@blinkk/root-password-protect'] =\n options.version;\n }\n }\n\n // Run target-specific updates to the output.\n if (target === 'appengine') {\n const appYamlPath = options?.appYaml || path.join(rootDir, 'app.yaml');\n await onAppEngine({packageJson, outDir, appYamlPath});\n } else if (target === 'firebase') {\n await onFirebase({rootDir, packageJson, outDir});\n }\n\n // Save `outDir/package.json`.\n await writeJson(path.resolve(outDir, 'package.json'), packageJson);\n\n console.log('done!');\n console.log(`saved package to ${outDir}`);\n}\n\nasync function getDefaultTarget(rootDir: string): Promise<DeployTarget | null> {\n // Default to firebase if a firebase.json file exists in the root dir.\n const firebaseConfigPath = path.resolve(rootDir, 'firebase.json');\n if (await fileExists(firebaseConfigPath)) {\n return 'firebase';\n }\n\n // Default to appengine.\n const appEngineConfigPath = path.resolve(rootDir, 'app.yaml');\n if (await fileExists(appEngineConfigPath)) {\n return 'appengine';\n }\n\n return null;\n}\n\nasync function generatePackageJson(\n rootDir: string,\n options?: CreatePackageOptions\n): Promise<PackageJson> {\n // Read the package.json.\n const packageJson: PackageJson = await loadJson<any>(\n path.resolve(rootDir, 'package.json')\n );\n\n // Flatten any deps from the monorepo, and remove peerDependencies and\n // devDependencies.\n const allDeps = flattenPackageDepsFromMonorepo(rootDir);\n packageJson.dependencies ??= {} as Record<string, string>;\n for (const depName in allDeps) {\n if (!packageJson.dependencies[depName]) {\n packageJson.dependencies[depName] = allDeps[depName];\n }\n }\n\n Object.entries(packageJson.dependencies).forEach(([depName, depVersion]) => {\n if (depName.startsWith('@blinkk/root') && options?.version) {\n // Replace root version with the current version.\n packageJson.dependencies![depName] = options.version;\n } else if (depVersion.startsWith('workspace:')) {\n // Remove `workspace:` deps.\n delete packageJson.dependencies![depName];\n }\n });\n if (packageJson.peerDependencies) {\n delete packageJson.peerDependencies;\n }\n if (packageJson.devDependencies) {\n delete packageJson.devDependencies;\n }\n\n return packageJson;\n}\n\n/**\n * Called for App Engine targets.\n */\nasync function onAppEngine(options: {\n packageJson: PackageJson;\n outDir: string;\n appYamlPath: string;\n}) {\n const {outDir, packageJson, appYamlPath} = options;\n if (await fileExists(appYamlPath)) {\n await fs.copyFile(appYamlPath, path.resolve(outDir, 'app.yaml'));\n }\n\n // Only include the \"start\" script.\n if (packageJson.scripts?.start) {\n packageJson.scripts = {start: packageJson.scripts.start};\n } else {\n packageJson.scripts = {start: 'root start --host=0.0.0.0'};\n }\n}\n\n/**\n * Called for Firebase Hosting targets.\n */\nasync function onFirebase(options: {\n rootDir: string;\n packageJson: PackageJson;\n outDir: string;\n}) {\n const {rootDir, outDir, packageJson} = options;\n\n // If the outDir is called `functions/` and an index.ts file exists in the\n // root project dir, automatically compile it through esbuild.\n const outBasename = path.basename(outDir);\n if (outBasename === 'functions') {\n const indexTsFile = path.resolve(rootDir, 'index.ts');\n if (await fileExists(indexTsFile)) {\n await bundleTsFile(indexTsFile, path.resolve(outDir, 'index.js'));\n }\n }\n\n // Only include the \"start\" script.\n if (packageJson.scripts?.start) {\n packageJson.scripts = {start: packageJson.scripts.start};\n } else {\n packageJson.scripts = {start: 'root start --host=0.0.0.0'};\n }\n}\n\n/**\n * Compiles a `.ts` file to `.js`.\n */\nexport async function bundleTsFile(srcPath: string, outPath: string) {\n await esbuild({\n entryPoints: [srcPath],\n bundle: true,\n minify: true,\n platform: 'node',\n outfile: outPath,\n sourcemap: 'inline',\n metafile: true,\n format: 'esm',\n plugins: [\n {\n name: 'externalize-deps',\n setup(build: any) {\n build.onResolve({filter: /.*/}, (args: any) => {\n const id = args.path;\n if (id[0] !== '.' && !path.isAbsolute(id)) {\n return {\n external: true,\n };\n }\n return null;\n });\n },\n },\n ],\n });\n}\n","import http from 'node:http';\nimport path from 'node:path';\nimport {fileURLToPath} from 'node:url';\n\nimport cookieParser from 'cookie-parser';\nimport {default as express} from 'express';\nimport {dim} from 'kleur/colors';\nimport sirv from 'sirv';\nimport glob from 'tiny-glob';\n\nimport {ViteDevServer} from 'vite';\nimport {RootConfig} from '../core/config.js';\nimport {configureServerPlugins} from '../core/plugin.js';\nimport {Server, Request, Response, NextFunction} from '../core/types.js';\nimport {hooksMiddleware} from '../middleware/hooks.js';\nimport {\n headersMiddleware,\n rootProjectMiddleware,\n trailingSlashMiddleware,\n} from '../middleware/middleware.js';\nimport {redirectsMiddleware} from '../middleware/redirects.js';\nimport {sessionMiddleware} from '../middleware/session.js';\nimport {getElements, getElementsDirs} from '../node/element-graph.js';\nimport {loadRootConfigWithDeps} from '../node/load-config.js';\nimport {collectPods} from '../node/pod-collector.js';\nimport {createViteServer} from '../node/vite.js';\nimport {DevServerAssetMap} from '../render/asset-map/dev-asset-map.js';\nimport {dirExists, isDirectory, isJsFile} from '../utils/fsutils.js';\nimport {findOpenPort} from '../utils/ports.js';\nimport {getSessionCookieSecret} from '../utils/rand.js';\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\n\ntype RenderModule = typeof import('../render/render.js');\n\nexport interface DevOptions {\n host?: 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 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('┃')} project: ${rootDir}`);\n console.log(`${dim('┃')} server: http://${host}:${port}${homePagePath}`);\n if (testCmsEnabled(rootConfig)) {\n console.log(`${dim('┃')} cms: http://${host}:${port}/cms/`);\n }\n console.log(`${dim('┃')} 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('┃')} root.config.ts changed. restarting server...`\n );\n await restart();\n }\n });\n }\n\n async function restart() {\n if (currentServer) {\n currentServer.close();\n currentServer = null;\n }\n if (currentViteServer) {\n await currentViteServer.close();\n currentViteServer = null;\n }\n await start();\n }\n\n await start();\n}\n\nexport async function createDevServer(options?: {\n rootDir?: string;\n port?: number;\n}): Promise<Server> {\n const rootDir = path.resolve(options?.rootDir || process.cwd());\n const {rootConfig, dependencies} = await loadRootConfigWithDeps(rootDir, {\n command: 'dev',\n });\n const port = options?.port;\n\n const server: Server = express();\n server.set('rootConfig', rootConfig);\n server.set('rootConfigDependencies', dependencies);\n server.disable('x-powered-by');\n\n // Create viteServer.\n const {viteServer, viteMiddleware} = await createViteMiddleware({\n rootConfig,\n port,\n });\n server.set('viteServer', viteServer);\n\n // Inject req context vars.\n server.use(rootProjectMiddleware({rootConfig}));\n server.use(viteMiddleware);\n server.use(hooksMiddleware());\n\n // Session middleware for handling session cookies.\n const sessionCookieSecret = getSessionCookieSecret(rootConfig, rootDir);\n server.use(cookieParser(sessionCookieSecret));\n server.use(sessionMiddleware());\n\n const plugins = rootConfig.plugins || [];\n await configureServerPlugins(\n server,\n async () => {\n // Add user-configured middlewares from `root.config.ts`.\n const userMiddlewares = rootConfig.server?.middlewares || [];\n for (const middleware of userMiddlewares) {\n server.use(middleware);\n }\n\n // Add redirects middlewares.\n if (rootConfig.server?.redirects) {\n server.use(\n redirectsMiddleware({redirects: rootConfig.server.redirects})\n );\n }\n\n // Add http headers middleware.\n if (rootConfig.server?.headers) {\n server.use(headersMiddleware({rootConfig: rootConfig}));\n }\n\n // Add static file middleware.\n const publicDir = path.join(rootDir, 'public');\n if (await dirExists(publicDir)) {\n server.use(rootPublicDirMiddleware({publicDir, viteServer}));\n }\n\n // NOTE: The trailing slash middleware needs to come after public files so\n // that slashes are not appended to public file routes.\n server.use(trailingSlashMiddleware({rootConfig}));\n\n // Add the root.js dev server middlewares.\n server.use(rootDevServerMiddleware());\n\n // Add any custom plugin 404 handlers.\n plugins.forEach((plugin) => {\n if (plugin.handle404) {\n server.use(plugin.handle404);\n }\n });\n\n // Add error handlers.\n server.use(rootDevServer404Middleware());\n server.use(rootDevServer500Middleware());\n },\n plugins,\n {type: 'dev', rootConfig}\n );\n\n return server;\n}\n\n/**\n * Middleware that initializes a vite server and injects it into the request\n * context.\n */\nasync function createViteMiddleware(options: {\n rootConfig: RootConfig;\n port?: number;\n}) {\n const rootConfig = options.rootConfig;\n const rootDir = rootConfig.rootDir;\n\n const pods = await collectPods(rootConfig);\n\n let elementGraph = await getElements(rootConfig, pods);\n const elements = Object.values(elementGraph.sourceFiles).map((sourceFile) => {\n return sourceFile.relPath;\n });\n\n const bundleScripts: string[] = [];\n if (await isDirectory(path.join(rootDir, 'bundles'))) {\n const bundleFiles = await glob('bundles/*', {cwd: rootDir});\n bundleFiles.forEach((file) => {\n const parts = path.parse(file);\n if (isJsFile(parts.base)) {\n bundleScripts.push(file);\n }\n });\n }\n // Add pod bundle scripts.\n for (const pod of pods) {\n for (const bundleFile of pod.bundleFiles) {\n bundleScripts.push(bundleFile);\n }\n }\n\n const optimizeDeps = [...elements, ...bundleScripts];\n const viteServer = await createViteServer(rootConfig, {\n port: options.port,\n optimizeDeps: optimizeDeps,\n });\n\n // Watch for file changes and re-generate the elements graph if any elements\n // are added or deleted.\n function isInElementsDir(changedFilePath: string) {\n const filePath = path.resolve(changedFilePath);\n const elementsDirs = getElementsDirs(rootConfig, pods);\n return elementsDirs.some((dirPath) => filePath.startsWith(dirPath));\n }\n viteServer.watcher.on('add', async (filePath: string) => {\n if (isInElementsDir(filePath)) {\n elementGraph = await getElements(rootConfig, pods);\n console.log(`element added: ${filePath}`);\n }\n });\n viteServer.watcher.on('unlink', async (filePath: string) => {\n if (isInElementsDir(filePath)) {\n elementGraph = await getElements(rootConfig, pods);\n console.log(`element deleted: ${filePath}`);\n }\n });\n\n const viteMiddleware = async (\n req: Request,\n res: Response,\n next: NextFunction\n ) => {\n try {\n // Add the viteServer to the req.\n req.viteServer = viteServer;\n // Dynamically import the render.js module using vite's SSR import loader.\n const renderModulePath = path.resolve(__dirname, './render.js');\n const render = (await viteServer.ssrLoadModule(\n renderModulePath\n )) as RenderModule;\n // Create a dev asset map using Vite dev server's module graph.\n const assetMap = new DevServerAssetMap(\n rootConfig,\n viteServer.moduleGraph\n );\n // Add a renderer object to the req for plugins and other middleware to\n // use.\n req.renderer = new render.Renderer(rootConfig, {assetMap, elementGraph});\n // Run the viteServer middlewares to handle vite-specific endpoints.\n viteServer.middlewares(req, res, next);\n } catch (e) {\n next(e);\n }\n };\n\n return {viteServer, viteMiddleware};\n}\n\nfunction rootPublicDirMiddleware(options: {\n publicDir: string;\n viteServer: ViteDevServer;\n}) {\n const publicDir = options.publicDir;\n\n // The `{dev: false}` option is used for performance reasons. When dev is set\n // to `true`, every request will traverse the filesystem to check if a\n // matching file exists. Setting it to `false` uses a cache, which can be\n // reloaded whenever a file change is detected in the `public` directory.\n const sirvOptions = {dev: false};\n let handler = sirv(publicDir, sirvOptions);\n\n const reloadPublicDirCache = debounce(() => {\n handler = sirv(publicDir, sirvOptions);\n }, 1000);\n\n function isInPublicDir(changedFilePath: string) {\n const filePath = path.resolve(changedFilePath);\n return filePath.startsWith(publicDir);\n }\n\n const watcher = options.viteServer.watcher;\n watcher.on('all', (event, filepath) => {\n if (isInPublicDir(filepath)) {\n reloadPublicDirCache();\n }\n });\n\n return (req: Request, res: Response, next: NextFunction) => {\n handler(req, res, next);\n };\n}\n\nfunction rootDevServerMiddleware() {\n return async (req: Request, res: Response, next: NextFunction) => {\n const renderer = req.renderer!;\n const viteServer = req.viteServer!;\n try {\n await renderer.handle(req, res, next);\n } catch (err) {\n // If an error is caught, let Vite fix the stack trace so it maps back to\n // your actual source code.\n viteServer.ssrFixStacktrace(err);\n next(err);\n }\n };\n}\n\nfunction rootDevServer404Middleware() {\n return async (req: Request, res: Response) => {\n console.error(`❓ 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.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(`❗ 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 {execSync} from 'node:child_process';\nimport fs from 'node:fs';\nimport path from 'node:path';\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] 🚀 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] ❌ health check failed. check logs: \\n${getLogsURL(\n project,\n service,\n version\n )}`\n );\n }\n console.log('[gae-deploy] ✅ 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] 📦 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] ✂️ 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] ✨ deployment complete\\nversions: ${getVersionsURL(\n project,\n service\n )}`\n );\n}\n\n/**\n * Returns whether a given version name is too long (a subdomain part should not\n * exceed 63 characters).\n */\nfunction testVersionTooLong(version: string, service: string, project: string) {\n const subdomain = `${version}-dot-${service}-dot-${project}`;\n // console.log(subdomain, subdomain.length);\n return subdomain.length > 63;\n}\n\n/** Returns the logs viewer URL in the Google Cloud Console. */\nfunction getLogsURL(project: string, service: string, version: string) {\n return `https://console.cloud.google.com/logs/query;query=resource.type%3D\"gae_app\"%0Aresource.labels.module_id%3D\"${service}\"%0Aresource.labels.version_id%3D\"${version}\"?project=${project}`;\n}\n\n/** Returns the App Engine versions viewer URL in the Google Cloud Console. */\nfunction getVersionsURL(project: string, service: string) {\n return `https://console.cloud.google.com/appengine/versions?project=${project}&serviceId=${service}`;\n}\n\n/**\n * Returns whether the `env_variables` key in app.yaml has placeholders.\n *\n * Example:\n * ```yaml\n * env_variables:\n * MY_SECRET_TOKEN: '{MY_SECRET_TOKEN}'\n * ```\n */\nfunction testHasEnvPlaceholders(appYaml: AppYaml) {\n if (typeof appYaml?.env_variables !== 'object') {\n return false;\n }\n const envVars: Record<string, string> = appYaml.env_variables;\n return Object.values(envVars).some((envValue: string) => {\n return testIsEnvPlaceholder(envValue);\n });\n}\n\nfunction testIsEnvPlaceholder(envValue: any) {\n if (typeof envValue === 'string') {\n return envValue.startsWith('{') && envValue.endsWith('}');\n }\n return false;\n}\n\n/** Updates any placeholders used in environment variables with their values. */\nfunction updateAppYamlEnv(appYamlPath: string, appYaml: AppYaml) {\n // Copy the original app.yaml to a backup file.\n const backupAppYaml = `${appYamlPath}.bak`;\n fs.copyFileSync(appYamlPath, backupAppYaml);\n let content = fs.readFileSync(appYamlPath, 'utf8');\n\n // Replace env_variables placeholders like `MY_SECRET_TOKEN: '{MY_SECRET_TOKEN}'`.\n const envVars: Record<string, string> = appYaml.env_variables;\n Object.entries(envVars).forEach(([envVar, envValue]) => {\n if (testIsEnvPlaceholder(envValue)) {\n const value = process.env[envVar];\n if (!value && content.includes(`{${envVar}}`)) {\n console.warn(`[gae-deploy] Missing environment variable: ${envVar}`);\n content = content.replaceAll(`{${envVar}}`, '');\n } else if (value && content.includes(`{${envVar}}`)) {\n content = content.replaceAll(`{${envVar}}`, value);\n }\n }\n });\n\n fs.writeFileSync(appYamlPath, content, 'utf8');\n return backupAppYaml;\n}\n\n/**\n * Returns a timestamp for the version name, formatted `YYYYMMDDtHHMM`.\n */\nfunction getTimestamp() {\n const pretty = (num: number) => (num + '').padStart(2, '0');\n const date = new Date();\n return `${date.getFullYear()}${pretty(date.getMonth() + 1)}${pretty(\n date.getDate()\n )}t${pretty(date.getHours())}${pretty(date.getMinutes())}`;\n}\n\n/**\n * Returns whether the App Engine service succeeds in handling a health check\n * request.\n */\nexport async function testHealth(\n project: string,\n service: string,\n version: string,\n healthcheckUrl: string\n) {\n if (!healthcheckUrl.startsWith('/')) {\n healthcheckUrl = `/${healthcheckUrl}`;\n }\n const url = `https://${version}-dot-${service}-dot-${project}.appspot.com${healthcheckUrl}`;\n const response = await fetch(url);\n return response.status === 200;\n}\n\n/**\n * Returns whether a version is considered to be managed by this script, and\n * whether it's an \"old\" prod version (e.g. a version that receives no traffic).\n * This script only manages old prod versions.\n */\nfunction testManagedVersion(\n service: string,\n appInfo: AppVersionInfo,\n prefix: string\n) {\n const re = new RegExp(`${prefix}-\\\\d{8}t\\\\d{4}`);\n return (\n appInfo.service === service &&\n re.exec(appInfo.id) &&\n appInfo.traffic_split === 0.0\n );\n}\n","import path from 'node:path';\n\nimport compression from 'compression';\nimport cookieParser from 'cookie-parser';\nimport {default as express} from 'express';\nimport {dim} from 'kleur/colors';\nimport sirv from 'sirv';\n\nimport {RootConfig} from '../core/config.js';\nimport {configureServerPlugins} from '../core/plugin.js';\nimport {Request, Response, NextFunction, Server} from '../core/types.js';\nimport {hooksMiddleware} from '../middleware/hooks.js';\nimport {\n headersMiddleware,\n rootProjectMiddleware,\n trailingSlashMiddleware,\n} from '../middleware/middleware.js';\nimport {redirectsMiddleware} from '../middleware/redirects.js';\nimport {sessionMiddleware} from '../middleware/session.js';\nimport {ElementGraph} from '../node/element-graph.js';\nimport {loadBundledConfig} from '../node/load-config.js';\nimport {\n BuildAssetManifest,\n BuildAssetMap,\n} from '../render/asset-map/build-asset-map.js';\nimport {fileExists, loadJson} from '../utils/fsutils.js';\nimport {getSessionCookieSecret} from '../utils/rand.js';\n\ntype RenderModule = typeof import('../render/render.js');\n\nexport interface PreviewOptions {\n host?: string;\n}\n\nexport async function preview(\n rootProjectDir?: string,\n options?: PreviewOptions\n) {\n // TODO(stevenle): figure out standard practice for NODE_ENV when using the\n // preview command.\n process.env.NODE_ENV = 'development';\n const rootDir = path.resolve(rootProjectDir || process.cwd());\n const server = await createPreviewServer({rootDir});\n const port = parseInt(process.env.PORT || '4007');\n const host = options?.host || 'localhost';\n console.log();\n console.log(`${dim('┃')} project: ${rootDir}`);\n console.log(`${dim('┃')} server: http://${host}:${port}`);\n console.log(`${dim('┃')} mode: preview`);\n console.log();\n server.listen(port, host);\n}\n\nexport async function createPreviewServer(options: {\n rootDir: string;\n}): Promise<Server> {\n const rootDir = options.rootDir;\n const rootConfig = await loadBundledConfig(rootDir, {command: 'preview'});\n const distDir = path.join(rootDir, 'dist');\n\n const server: Server = express();\n server.disable('x-powered-by');\n server.use(compression());\n\n // Inject request context vars.\n server.use(rootProjectMiddleware({rootConfig}));\n server.use(await rootPreviewRendererMiddleware({rootConfig, distDir}));\n server.use(hooksMiddleware());\n\n // Session middleware for handling session cookies.\n const sessionCookieSecret = getSessionCookieSecret(rootConfig, rootDir);\n server.use(cookieParser(sessionCookieSecret));\n server.use(sessionMiddleware());\n\n const plugins = rootConfig.plugins || [];\n await configureServerPlugins(\n server,\n async () => {\n // Add user-configured middlewares from `root.config.ts`.\n const userMiddlewares = rootConfig.server?.middlewares || [];\n userMiddlewares.forEach((middleware) => {\n server.use(middleware);\n });\n\n // Add redirects middleware.\n if (rootConfig.server?.redirects) {\n server.use(\n redirectsMiddleware({redirects: rootConfig.server.redirects})\n );\n }\n\n // Add http headers middleware.\n if (rootConfig.server?.headers) {\n server.use(headersMiddleware({rootConfig: rootConfig}));\n }\n\n // Add static file middleware.\n const publicDir = path.join(distDir, 'html');\n server.use(sirv(publicDir, {dev: false}));\n\n // NOTE: The trailing slash middleware needs to come after public files so\n // that slashes are not appended to public file routes.\n server.use(trailingSlashMiddleware({rootConfig}));\n\n // Add the root.js preview server middlewares.\n server.use(rootPreviewServerMiddleware());\n\n // Add any custom plugin 404 handlers.\n plugins.forEach((plugin) => {\n if (plugin.handle404) {\n server.use(plugin.handle404);\n }\n });\n\n // Add error handlers.\n server.use(rootPreviewServer404Middleware());\n server.use(rootPreviewServer500Middleware());\n },\n plugins,\n {type: 'preview', rootConfig}\n );\n return server;\n}\n\n/**\n * Injects a renderer into the request.\n */\nasync function rootPreviewRendererMiddleware(options: {\n rootConfig: RootConfig;\n distDir: string;\n}) {\n const {distDir, rootConfig} = options;\n const render: RenderModule = await import(\n path.join(distDir, 'server/render.js')\n );\n const manifestPath = path.join(distDir, '.root/manifest.json');\n if (!(await fileExists(manifestPath))) {\n throw new Error(\n `could not find ${manifestPath}. run \\`root build\\` before \\`root preview\\`.`\n );\n }\n const elementGraphJsonPath = path.join(distDir, '.root/elements.json');\n if (!(await fileExists(elementGraphJsonPath))) {\n throw new Error(\n `could not find ${elementGraphJsonPath}. run \\`root build\\` before \\`root preview\\`.`\n );\n }\n const rootManifest = await loadJson<BuildAssetManifest>(manifestPath);\n const assetMap = BuildAssetMap.fromRootManifest(rootConfig, rootManifest);\n const elementGraphJson = await loadJson<any>(elementGraphJsonPath);\n const elementGraph = ElementGraph.fromJson(elementGraphJson);\n const renderer = new render.Renderer(rootConfig, {assetMap, elementGraph});\n return async (req: Request, _: Response, next: NextFunction) => {\n req.renderer = renderer;\n next();\n };\n}\n\n/**\n * Preview server request handler.\n */\nfunction rootPreviewServerMiddleware() {\n return async (req: Request, res: Response, next: NextFunction) => {\n const renderer = req.renderer!;\n try {\n await renderer.handle(req, res, next);\n } catch (e) {\n try {\n console.error(`error rendering ${req.originalUrl}`);\n console.error(e.stack || e);\n const {html} = await renderer.renderDevServer500(req, e);\n res.status(500).set({'Content-Type': 'text/html'}).end(html);\n } catch (e2) {\n console.error('failed to render custom error');\n console.error(e2);\n next(e);\n }\n }\n };\n}\n\nfunction rootPreviewServer404Middleware() {\n return async (req: Request, res: Response) => {\n console.error(`❓ 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(`❗ 500 ${req.originalUrl}`);\n console.error(String(err.stack || err));\n if (req.renderer) {\n const url = req.path;\n const ext = path.extname(url);\n if (!ext) {\n const renderer = req.renderer;\n const data = await renderer.renderDevServer500(req, err);\n const html = data.html || '';\n res.status(500).set({'Content-Type': 'text/html'}).end(html);\n return;\n }\n }\n next(err);\n };\n}\n","import path from 'node:path';\n\nimport compression from 'compression';\nimport cookieParser from 'cookie-parser';\nimport {default as express} from 'express';\nimport {dim} from 'kleur/colors';\nimport sirv from 'sirv';\n\nimport {RootConfig} from '../core/config.js';\nimport {configureServerPlugins} from '../core/plugin.js';\nimport {Request, Response, NextFunction, Server} from '../core/types.js';\nimport {hooksMiddleware} from '../middleware/hooks.js';\nimport {\n headersMiddleware,\n rootProjectMiddleware,\n trailingSlashMiddleware,\n} from '../middleware/middleware.js';\nimport {redirectsMiddleware} from '../middleware/redirects.js';\nimport {sessionMiddleware} from '../middleware/session.js';\nimport {ElementGraph} from '../node/element-graph.js';\nimport {loadBundledConfig} from '../node/load-config.js';\nimport {\n BuildAssetManifest,\n BuildAssetMap,\n} from '../render/asset-map/build-asset-map.js';\nimport {fileExists, loadJson} from '../utils/fsutils.js';\nimport {getSessionCookieSecret} from '../utils/rand.js';\n\ntype RenderModule = typeof import('../render/render.js');\n\nexport interface StartOptions {\n host?: string;\n}\n\nexport async function start(rootProjectDir?: string, options?: StartOptions) {\n process.env.NODE_ENV = 'production';\n const rootDir = path.resolve(rootProjectDir || process.cwd());\n const server = await createProdServer({rootDir});\n const port = parseInt(process.env.PORT || '4007');\n const host = options?.host || 'localhost';\n console.log();\n console.log(`${dim('┃')} project: ${rootDir}`);\n console.log(`${dim('┃')} server: http://${host}:${port}`);\n console.log(`${dim('┃')} mode: production`);\n console.log();\n server.listen(port, host);\n}\n\nexport async function createProdServer(options: {\n rootDir: string;\n}): Promise<Server> {\n const rootDir = options.rootDir;\n const rootConfig = await loadBundledConfig(rootDir, {command: 'start'});\n const distDir = path.join(rootDir, 'dist');\n\n const server: Server = express();\n server.disable('x-powered-by');\n server.use(compression());\n\n // Inject request context vars.\n server.use(rootProjectMiddleware({rootConfig}));\n server.use(await rootProdRendererMiddleware({rootConfig, distDir}));\n server.use(hooksMiddleware());\n\n // Session middleware for handling session cookies.\n const sessionCookieSecret = getSessionCookieSecret(rootConfig, rootDir);\n server.use(cookieParser(sessionCookieSecret));\n server.use(sessionMiddleware());\n\n const plugins = rootConfig.plugins || [];\n await configureServerPlugins(\n server,\n async () => {\n // Add user-configured middlewares from `root.config.ts`.\n const userMiddlewares = rootConfig.server?.middlewares || [];\n userMiddlewares.forEach((middleware) => {\n server.use(middleware);\n });\n\n // Add redirects middleware.\n if (rootConfig.server?.redirects) {\n server.use(\n redirectsMiddleware({redirects: rootConfig.server.redirects})\n );\n }\n\n // Add http headers middleware.\n if (rootConfig.server?.headers) {\n server.use(headersMiddleware({rootConfig: rootConfig}));\n }\n\n // Add static file middleware.\n const publicDir = path.join(distDir, 'html');\n server.use(sirv(publicDir, {dev: false}));\n\n // NOTE: The trailing slash middleware needs to come after public files so\n // that slashes are not appended to public file routes.\n server.use(trailingSlashMiddleware({rootConfig}));\n\n // Add the root.js preview server middlewares.\n server.use(rootProdServerMiddleware());\n\n // Add any custom plugin 404 handlers.\n plugins.forEach((plugin) => {\n if (plugin.handle404) {\n server.use(plugin.handle404);\n }\n });\n\n // Add error handlers.\n server.use(rootProdServer404Middleware());\n server.use(rootProdServer500Middleware());\n },\n plugins,\n {type: 'prod', rootConfig}\n );\n return server;\n}\n\n/**\n * Injects a renderer into the request.\n */\nasync function rootProdRendererMiddleware(options: {\n rootConfig: RootConfig;\n distDir: string;\n}) {\n const {distDir, rootConfig} = options;\n const render: RenderModule = await import(\n path.join(distDir, 'server/render.js')\n );\n const manifestPath = path.join(distDir, '.root/manifest.json');\n if (!(await fileExists(manifestPath))) {\n throw new Error(\n `could not find ${manifestPath}. run \\`root build\\` before \\`root start\\`.`\n );\n }\n const elementGraphJsonPath = path.join(distDir, '.root/elements.json');\n if (!(await fileExists(elementGraphJsonPath))) {\n throw new Error(\n `could not find ${elementGraphJsonPath}. run \\`root build\\` before \\`root start\\`.`\n );\n }\n const rootManifest = await loadJson<BuildAssetManifest>(manifestPath);\n const assetMap = BuildAssetMap.fromRootManifest(rootConfig, rootManifest);\n const elementGraphJson = await loadJson<any>(elementGraphJsonPath);\n const elementGraph = ElementGraph.fromJson(elementGraphJson);\n const renderer = new render.Renderer(rootConfig, {assetMap, elementGraph});\n return async (req: Request, _: Response, next: NextFunction) => {\n req.renderer = renderer;\n next();\n };\n}\n\n/**\n * Prod server request handler.\n */\nfunction rootProdServerMiddleware() {\n return async (req: Request, res: Response, next: NextFunction) => {\n const renderer = req.renderer!;\n try {\n await renderer.handle(req, res, next);\n } catch (e) {\n try {\n console.error(`error rendering ${req.originalUrl}`);\n console.error(e.stack || e);\n const {html} = await renderer.renderError(e);\n res.status(500).set({'Content-Type': 'text/html'}).end(html);\n } catch (e2) {\n console.error('failed to render custom error');\n console.error(e2);\n next(e);\n }\n }\n };\n}\n\nfunction rootProdServer404Middleware() {\n return async (req: Request, res: Response) => {\n console.error(`❓ 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(`❗ 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"],"mappings":"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","names":["path","glob","fs","path","asset","path","fs","path","glob","importedCss","outFilePath","outPath","fileSize","fs","path","fileURLToPath","glob","__dirname","path","fileURLToPath","glob","fs","fs","path","path","fs","build","path","fileURLToPath","dim","glob","path","searchForWorkspaceRoot","path","searchForWorkspaceRoot","__dirname","path","fileURLToPath","start","dim","glob","fs","path","cookieParser","express","dim","sirv","path","dim","express","cookieParser","sirv","path","compression","cookieParser","express","dim","sirv","path","dim","express","compression","cookieParser","sirv"]}
|