reroute-js 0.9.3 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/_/basic/src/index.ts +1 -8
- package/_/blog/src/client/index.html +0 -1
- package/_/blog/src/client/routes/blog/[layout].tsx +53 -3
- package/_/blog/src/client/routes/docs.tsx +1 -1
- package/_/blog/src/index.ts +1 -8
- package/_/store/src/index.ts +1 -8
- package/cli/bin.d.ts +1 -1
- package/cli/bin.js +3662 -2681
- package/cli/bin.js.map +40 -29
- package/cli/index.d.ts +2 -2
- package/cli/index.d.ts.map +1 -1
- package/cli/index.js +74 -10
- package/cli/index.js.map +7 -5
- package/cli/src/cli.d.ts +1 -1
- package/cli/src/commands/analyze.d.ts +1 -1
- package/cli/src/commands/build.d.ts +1 -1
- package/cli/src/commands/build.d.ts.map +1 -1
- package/cli/src/commands/dev.d.ts +1 -1
- package/cli/src/commands/gen.d.ts +1 -1
- package/cli/src/commands/gen.d.ts.map +1 -1
- package/{core/src/template → cli/src/commands}/index.d.ts +2 -2
- package/cli/src/commands/index.d.ts.map +1 -0
- package/cli/src/commands/init.d.ts +1 -1
- package/cli/src/{libs → commands/lib}/command.d.ts +1 -1
- package/cli/src/commands/lib/command.d.ts.map +1 -0
- package/cli/src/{libs → commands/lib}/index.d.ts +3 -2
- package/cli/src/commands/lib/index.d.ts.map +1 -0
- package/cli/src/{libs → commands/lib}/log.d.ts +1 -1
- package/cli/src/commands/lib/log.d.ts.map +1 -0
- package/cli/src/{libs/markdown.d.ts → commands/lib/markdown/availability.d.ts} +2 -2
- package/cli/src/commands/lib/markdown/availability.d.ts.map +1 -0
- package/cli/src/commands/lib/markdown/index.d.ts +12 -0
- package/cli/src/commands/lib/markdown/index.d.ts.map +1 -0
- package/cli/src/{libs/markdown-processor.d.ts → commands/lib/markdown/processor.d.ts} +2 -2
- package/cli/src/commands/lib/markdown/processor.d.ts.map +1 -0
- package/cli/src/{libs → commands/lib}/production.d.ts +1 -1
- package/cli/src/commands/lib/production.d.ts.map +1 -0
- package/cli/src/{libs → commands/lib}/server.d.ts +1 -1
- package/cli/src/commands/lib/server.d.ts.map +1 -0
- package/cli/src/commands/lib/streaming/analyzer.d.ts +26 -0
- package/cli/src/commands/lib/streaming/analyzer.d.ts.map +1 -0
- package/cli/src/commands/lib/streaming/suspense.d.ts +20 -0
- package/cli/src/commands/lib/streaming/suspense.d.ts.map +1 -0
- package/cli/src/{libs → commands/lib}/tailwind.d.ts +1 -1
- package/cli/src/commands/lib/tailwind.d.ts.map +1 -0
- package/cli/src/{libs → commands/lib}/version.d.ts +1 -1
- package/cli/src/commands/lib/version.d.ts.map +1 -0
- package/cli/src/commands/start.d.ts +2 -2
- package/cli/src/commands/start.d.ts.map +1 -1
- package/cli/src/index.d.ts +11 -0
- package/cli/src/index.d.ts.map +1 -0
- package/core/index.d.ts +1 -1
- package/core/index.js +1169 -471
- package/core/index.js.map +22 -13
- package/core/src/bundler/hash.d.ts +1 -1
- package/core/src/bundler/index.d.ts +1 -1
- package/core/src/config.d.ts +42 -0
- package/core/src/config.d.ts.map +1 -0
- package/core/src/content/discovery.d.ts +1 -1
- package/core/src/content/index.d.ts +1 -1
- package/core/src/content/metadata.d.ts +2 -2
- package/core/src/content/metadata.d.ts.map +1 -1
- package/core/src/index.d.ts +2 -4
- package/core/src/index.d.ts.map +1 -1
- package/core/src/ssr/index.d.ts +3 -3
- package/core/src/ssr/index.d.ts.map +1 -1
- package/core/src/ssr/lib/cache.d.ts +67 -0
- package/core/src/ssr/lib/cache.d.ts.map +1 -0
- package/core/src/ssr/lib/collections.d.ts +18 -0
- package/core/src/ssr/lib/collections.d.ts.map +1 -0
- package/core/src/{utils → ssr/lib}/compression.d.ts +9 -2
- package/core/src/ssr/lib/compression.d.ts.map +1 -0
- package/core/src/ssr/lib/compute.d.ts +28 -0
- package/core/src/ssr/lib/compute.d.ts.map +1 -0
- package/core/src/ssr/{data.d.ts → lib/data.d.ts} +1 -1
- package/core/src/ssr/lib/data.d.ts.map +1 -0
- package/core/src/{template → ssr/lib}/html.d.ts +2 -2
- package/core/src/ssr/lib/html.d.ts.map +1 -0
- package/core/src/ssr/lib/index.d.ts +26 -0
- package/core/src/ssr/lib/index.d.ts.map +1 -0
- package/core/src/ssr/lib/metadata.d.ts +20 -0
- package/core/src/ssr/lib/metadata.d.ts.map +1 -0
- package/core/src/{utils → ssr/lib}/mime.d.ts +1 -1
- package/core/src/ssr/lib/mime.d.ts.map +1 -0
- package/core/src/ssr/{modules.d.ts → lib/modules.d.ts} +2 -2
- package/core/src/ssr/lib/modules.d.ts.map +1 -0
- package/core/src/{utils → ssr/lib}/path.d.ts +1 -1
- package/core/src/ssr/lib/path.d.ts.map +1 -0
- package/core/src/ssr/lib/preload.d.ts +29 -0
- package/core/src/ssr/lib/preload.d.ts.map +1 -0
- package/core/src/ssr/lib/scripts.d.ts +31 -0
- package/core/src/ssr/lib/scripts.d.ts.map +1 -0
- package/core/src/ssr/{seed.d.ts → lib/seed.d.ts} +1 -1
- package/core/src/ssr/lib/seed.d.ts.map +1 -0
- package/core/src/ssr/lib/styles.d.ts +14 -0
- package/core/src/ssr/lib/styles.d.ts.map +1 -0
- package/core/src/ssr/lib/template.d.ts +19 -0
- package/core/src/ssr/lib/template.d.ts.map +1 -0
- package/core/src/{types.d.ts → ssr/lib/types.d.ts} +1 -1
- package/core/src/ssr/lib/types.d.ts.map +1 -0
- package/core/src/ssr/render.d.ts +2 -1
- package/core/src/ssr/render.d.ts.map +1 -1
- package/core/src/ssr/stream.d.ts +30 -0
- package/core/src/ssr/stream.d.ts.map +1 -0
- package/elysia/index.d.ts +1 -1
- package/elysia/index.js +1917 -794
- package/elysia/index.js.map +34 -19
- package/elysia/src/index.d.ts +1 -1
- package/elysia/src/libs/cache.d.ts +1 -1
- package/elysia/src/libs/http.d.ts +1 -1
- package/elysia/src/libs/image.d.ts +1 -1
- package/elysia/src/plugin.d.ts +1 -1
- package/elysia/src/plugin.d.ts.map +1 -1
- package/elysia/src/routes/artifacts.d.ts +1 -1
- package/elysia/src/routes/content.d.ts +1 -1
- package/elysia/src/routes/image.d.ts +2 -1
- package/elysia/src/routes/image.d.ts.map +1 -1
- package/elysia/src/routes/internal.d.ts +36 -0
- package/elysia/src/routes/internal.d.ts.map +1 -0
- package/elysia/src/routes/ssr.d.ts +3 -1
- package/elysia/src/routes/ssr.d.ts.map +1 -1
- package/elysia/src/routes/static.d.ts +2 -1
- package/elysia/src/routes/static.d.ts.map +1 -1
- package/elysia/src/types.d.ts +11 -4
- package/elysia/src/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/react/index.d.ts +1 -1
- package/react/index.js +295 -53
- package/react/index.js.map +10 -9
- package/react/src/components/ClientOnly.d.ts +1 -1
- package/react/src/components/ContentRoute.d.ts +1 -1
- package/react/src/components/ContentRoute.d.ts.map +1 -1
- package/react/src/components/Image.d.ts +1 -1
- package/react/src/components/LazyRoute.d.ts +26 -0
- package/react/src/components/LazyRoute.d.ts.map +1 -0
- package/react/src/components/Link.d.ts +1 -1
- package/react/src/components/Link.d.ts.map +1 -1
- package/react/src/components/Markdown.d.ts +1 -1
- package/react/src/components/Outlet.d.ts +1 -1
- package/react/src/components/index.d.ts +1 -1
- package/react/src/hooks/index.d.ts +2 -1
- package/react/src/hooks/index.d.ts.map +1 -1
- package/react/src/hooks/useContent.d.ts +1 -1
- package/react/src/hooks/useData.d.ts +1 -1
- package/react/src/hooks/useData.d.ts.map +1 -1
- package/react/src/hooks/useLayoutData.d.ts +18 -0
- package/react/src/hooks/useLayoutData.d.ts.map +1 -0
- package/react/src/hooks/useNavigate.d.ts +1 -1
- package/react/src/hooks/useParams.d.ts +1 -1
- package/react/src/hooks/useRouter.d.ts +1 -1
- package/react/src/hooks/useSearchParams.d.ts +1 -1
- package/react/src/index.d.ts +2 -2
- package/react/src/index.d.ts.map +1 -1
- package/react/src/{utils → lib}/content.d.ts +1 -1
- package/react/src/lib/content.d.ts.map +1 -0
- package/react/src/{utils → lib}/head.d.ts +1 -1
- package/react/src/lib/head.d.ts.map +1 -0
- package/react/src/{utils → lib}/index.d.ts +2 -2
- package/react/src/lib/index.d.ts.map +1 -0
- package/react/src/{utils → lib}/lazy-route.d.ts +1 -1
- package/react/src/lib/lazy-route.d.ts.map +1 -0
- package/react/src/lib/route-loader.d.ts +31 -0
- package/react/src/lib/route-loader.d.ts.map +1 -0
- package/react/src/providers/ContentProvider.d.ts +1 -1
- package/react/src/providers/ContentProvider.d.ts.map +1 -1
- package/react/src/providers/RerouteProvider.d.ts +1 -1
- package/react/src/providers/RerouteProvider.d.ts.map +1 -1
- package/react/src/providers/RouterProvider.d.ts +1 -1
- package/react/src/providers/RouterProvider.d.ts.map +1 -1
- package/react/src/providers/index.d.ts +1 -1
- package/react/src/types/any.d.ts +1 -1
- package/react/src/types/index.d.ts +1 -1
- package/react/src/types/router.d.ts +1 -1
- package/cli/src/libs/command.d.ts.map +0 -1
- package/cli/src/libs/index.d.ts.map +0 -1
- package/cli/src/libs/log.d.ts.map +0 -1
- package/cli/src/libs/markdown-processor.d.ts.map +0 -1
- package/cli/src/libs/markdown.d.ts.map +0 -1
- package/cli/src/libs/production.d.ts.map +0 -1
- package/cli/src/libs/server.d.ts.map +0 -1
- package/cli/src/libs/tailwind.d.ts.map +0 -1
- package/cli/src/libs/version.d.ts.map +0 -1
- package/core/src/ssr/data.d.ts.map +0 -1
- package/core/src/ssr/modules.d.ts.map +0 -1
- package/core/src/ssr/seed.d.ts.map +0 -1
- package/core/src/template/html.d.ts.map +0 -1
- package/core/src/template/index.d.ts.map +0 -1
- package/core/src/types.d.ts.map +0 -1
- package/core/src/utils/cache.d.ts +0 -21
- package/core/src/utils/cache.d.ts.map +0 -1
- package/core/src/utils/compression.d.ts.map +0 -1
- package/core/src/utils/index.d.ts +0 -14
- package/core/src/utils/index.d.ts.map +0 -1
- package/core/src/utils/mime.d.ts.map +0 -1
- package/core/src/utils/path.d.ts.map +0 -1
- package/elysia/src/routes/dev.d.ts +0 -18
- package/elysia/src/routes/dev.d.ts.map +0 -1
- package/react/src/utils/content.d.ts.map +0 -1
- package/react/src/utils/head.d.ts.map +0 -1
- package/react/src/utils/index.d.ts.map +0 -1
- package/react/src/utils/lazy-route.d.ts.map +0 -1
package/cli/bin.js.map
CHANGED
|
@@ -1,43 +1,54 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../../packages/cli/src/
|
|
3
|
+
"sources": ["../../packages/cli/src/commands/lib/version.ts", "../../packages/cli/src/commands/init.ts", "../../packages/core/src/bundler/hash.ts", "../../packages/core/src/config.ts", "../../packages/core/src/ssr/lib/path.ts", "../../packages/core/src/content/discovery.ts", "../../packages/core/src/content/metadata.ts", "../../packages/core/src/content/index.ts", "../../packages/core/src/ssr/lib/cache.ts", "../../packages/core/src/ssr/lib/collections.ts", "../../packages/core/src/ssr/lib/mime.ts", "../../packages/core/src/ssr/lib/compression.ts", "../../packages/core/src/ssr/lib/compute.ts", "../../packages/core/src/ssr/lib/modules.ts", "../../packages/core/src/ssr/lib/seed.ts", "../../packages/core/src/ssr/lib/data.ts", "../../packages/core/src/ssr/lib/html.ts", "../../packages/core/src/ssr/lib/metadata.ts", "../../packages/core/src/ssr/lib/preload.ts", "../../packages/core/src/ssr/lib/scripts.ts", "../../packages/core/src/ssr/lib/styles.ts", "../../packages/core/src/ssr/lib/template.ts", "../../packages/core/src/ssr/lib/index.ts", "../../node_modules/.bun/dedent@1.7.0/node_modules/dedent/dist/dedent.mjs", "../../packages/core/src/ssr/render.ts", "../../packages/core/src/ssr/stream.ts", "../../packages/core/src/ssr/index.ts", "../../packages/core/src/index.ts", "../../packages/core/index.ts", "../../packages/cli/src/commands/lib/markdown/availability.ts", "../../packages/cli/src/commands/lib/markdown/processor.ts", "../../packages/cli/src/commands/lib/markdown/index.ts", "../../packages/cli/src/commands/lib/production.ts", "../../packages/cli/src/commands/lib/streaming/analyzer.ts", "../../packages/cli/src/commands/lib/streaming/suspense.ts", "../../packages/cli/src/commands/lib/tailwind.ts", "../../packages/cli/src/commands/gen.ts", "../../packages/cli/src/commands/lib/log.ts", "../../packages/cli/src/commands/lib/server.ts", "../../packages/cli/src/commands/dev.ts", "../../packages/cli/src/commands/start.ts", "../../packages/cli/src/commands/build.ts", "../../packages/cli/src/commands/lib/command.ts", "../../packages/cli/src/commands/analyze.ts", "../../packages/cli/src/cli.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
5
|
"import path from 'node:path';\n\n// Version and commit injected at build time\ndeclare const __REROUTE_VERSION__: string;\ndeclare const __REROUTE_COMMIT__: string;\n\nexport async function getVersionString(): Promise<string> {\n\tconst version = await getVersion();\n\tconst commit = await getCommit();\n\treturn `Reroute v${version} ${commit}`;\n}\n\nasync function getVersion(): Promise<string> {\n\t// Use version injected at build time\n\tif (typeof __REROUTE_VERSION__ !== 'undefined') {\n\t\treturn __REROUTE_VERSION__;\n\t}\n\n\t// Fallback for development: try to find package.json\n\tconst possiblePaths = [\n\t\tpath.join(import.meta.dir, '../../../../package.json'),\n\t\tpath.join(import.meta.dir, '../../../package.json'),\n\t\tpath.join(import.meta.dir, '../../package.json'),\n\t\tpath.join(import.meta.dir, '../package.json'),\n\t];\n\n\tfor (const pkgPath of possiblePaths) {\n\t\ttry {\n\t\t\tconst pkg = await Bun.file(pkgPath).json();\n\t\t\treturn pkg.version;\n\t\t} catch {}\n\t}\n\n\treturn 'unknown';\n}\n\nasync function getCommit(): Promise<string> {\n\t// Use commit injected at build time\n\tif (typeof __REROUTE_COMMIT__ !== 'undefined') {\n\t\treturn __REROUTE_COMMIT__;\n\t}\n\n\t// Fallback for development\n\treturn 'dev';\n}\n",
|
|
6
|
-
"#!/usr/bin/env bun\n\n/**\n * Reroute init command\n *\n * Scaffold a new Reroute project with templates\n */\n\nimport { existsSync } from 'node:fs';\nimport { mkdir, readdir } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { getVersionString } from '../libs/version';\n\ninterface InitOptions {\n\tprojectName: string;\n\ttemplate: 'basic' | 'blog' | 'store';\n}\n\nexport default async function init(args: string[]) {\n\tconst options = parseArgs(args);\n\n\tif (!options) {\n\t\tawait printHelp();\n\t\tprocess.exit(1);\n\t}\n\n\ttry {\n\t\tawait scaffoldProject(options);\n\t} catch (error) {\n\t\tconsole.error('Error scaffolding project:', error);\n\t\tprocess.exit(1);\n\t}\n}\n\nfunction parseArgs(args: string[]): InitOptions | null {\n\tif (args.length === 0 || args[0] === '--help' || args[0] === '-h') {\n\t\treturn null;\n\t}\n\n\tconst projectName = args[0];\n\n\tif (!projectName || projectName.startsWith('-')) {\n\t\tconsole.error('Error: Project name is required');\n\t\treturn null;\n\t}\n\n\t// Validate project name\n\tif (!/^[a-z0-9-_]+$/i.test(projectName)) {\n\t\tconsole.error(\n\t\t\t'Error: Project name can only contain letters, numbers, hyphens, and underscores',\n\t\t);\n\t\treturn null;\n\t}\n\n\tlet template: 'basic' | 'blog' | 'store' = 'basic';\n\n\t// Parse template flag\n\tconst templateIndex = args.indexOf('--template');\n\tif (templateIndex !== -1 && args[templateIndex + 1]) {\n\t\tconst templateArg = args[templateIndex + 1];\n\t\tif (['basic', 'blog', 'store'].includes(templateArg)) {\n\t\t\ttemplate = templateArg as 'basic' | 'blog' | 'store';\n\t\t} else {\n\t\t\tconsole.error(\n\t\t\t\t`Error: Unknown template \"${templateArg}\". Available templates: basic, blog, store`,\n\t\t\t);\n\t\t\treturn null;\n\t\t}\n\t}\n\n\treturn { projectName, template };\n}\n\nasync function scaffoldProject(options: InitOptions) {\n\tconst { projectName, template } = options;\n\tconst projectPath = join(process.cwd(), projectName);\n\n\t// Check if directory already exists\n\tif (existsSync(projectPath)) {\n\t\tconsole.error(`Error: Directory \"${projectName}\" already exists`);\n\t\tprocess.exit(1);\n\t}\n\n\tconsole.log(`\\n🏗️ Creating project: ${projectName}`);\n\tconsole.log(`\\n📦 Template: ${template}\\n`);\n\n\t// Get template directory path (for non-src files like package.json, tsconfig.json)\n\t// Try multiple possible paths to find template directory (dev vs production)\n\tconst possibleTemplatePaths = [\n\t\t// When running from source: packages/cli/src/commands -> packages/cli/src/_\n\t\tjoin(import.meta.dir, '..', '_', template),\n\t\t// When running from production build: dist/cli/src/commands -> dist/_\n\t\tjoin(import.meta.dir, '..', '..', '..', '_', template),\n\t];\n\n\tlet templatePath: string | undefined;\n\tfor (const path of possibleTemplatePaths) {\n\t\tif (existsSync(path)) {\n\t\t\ttemplatePath = path;\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tif (!templatePath) {\n\t\tconsole.error(\n\t\t\t`Error: Template directory not found for template \"${template}\"`,\n\t\t);\n\t\tconsole.error(`Tried paths: ${possibleTemplatePaths.join(', ')}`);\n\t\tprocess.exit(1);\n\t}\n\n\t// Get examples directory path (for src folder)\n\t// Try multiple possible paths to find examples directory\n\tconst possibleExamplesPaths = [\n\t\t// When running from source: packages/cli/src/commands -> examples\n\t\tjoin(import.meta.dir, '..', '..', '..', '..', 'examples', template, 'src'),\n\t\t// Alternative path structure\n\t\tjoin(\n\t\t\timport.meta.dir,\n\t\t\t'..',\n\t\t\t'..',\n\t\t\t'..',\n\t\t\t'..',\n\t\t\t'..',\n\t\t\t'examples',\n\t\t\ttemplate,\n\t\t\t'src',\n\t\t),\n\t];\n\n\tlet examplesPath: string | undefined;\n\tfor (const path of possibleExamplesPaths) {\n\t\tif (existsSync(path)) {\n\t\t\texamplesPath = path;\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t// Create project directory\n\tawait mkdir(projectPath, { recursive: true });\n\n\t// Copy template files (excluding src folder)\n\tawait copyTemplateFiles(templatePath, projectPath, {\n\t\tPROJECT_NAME: projectName,\n\t});\n\n\t// Variables to replace in source files\n\tconst sourceVariables = {\n\t\tPROJECT_NAME: projectName,\n\t};\n\n\t// Copy src folder from examples (or fallback to template if examples not found)\n\tif (examplesPath) {\n\t\t// Copy src folder from examples (always up-to-date)\n\t\tawait copySourceFiles(\n\t\t\texamplesPath,\n\t\t\tjoin(projectPath, 'src'),\n\t\t\tsourceVariables,\n\t\t);\n\t} else {\n\t\t// Fallback: copy src folder from template (for distribution scenarios)\n\t\tconst templateSrcPath = join(templatePath, 'src');\n\t\tif (existsSync(templateSrcPath)) {\n\t\t\tawait copySourceFiles(\n\t\t\t\ttemplateSrcPath,\n\t\t\t\tjoin(projectPath, 'src'),\n\t\t\t\tsourceVariables,\n\t\t\t);\n\t\t} else {\n\t\t\tconsole.error(`Error: No src directory found for template \"${template}\"`);\n\t\t\tconsole.error(\n\t\t\t\t`Tried examples paths: ${possibleExamplesPaths.join(', ')}`,\n\t\t\t);\n\t\t\tconsole.error(`Tried template path: ${templateSrcPath}`);\n\t\t\tprocess.exit(1);\n\t\t}\n\t}\n\n\t// Run bun install\n\tconsole.log('📥 Installing dependencies...\\n');\n\tconst proc = Bun.spawn(['bun', 'install'], {\n\t\tcwd: projectPath,\n\t\tstdout: 'inherit',\n\t\tstderr: 'inherit',\n\t});\n\n\tawait proc.exited;\n\n\t// Print success message\n\tprintSuccess(projectName, template);\n}\n\nasync function copyTemplateFiles(\n\ttemplatePath: string,\n\ttargetPath: string,\n\tvariables: Record<string, string>,\n) {\n\tconst entries = await readdir(templatePath, { withFileTypes: true });\n\n\tfor (const entry of entries) {\n\t\t// Skip src directory - it will be copied from examples\n\t\tif (entry.isDirectory() && entry.name === 'src') {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst sourcePath = join(templatePath, entry.name);\n\t\tconst destPath = join(targetPath, entry.name);\n\n\t\tif (entry.isDirectory()) {\n\t\t\t// Create directory and recurse\n\t\t\tawait mkdir(destPath, { recursive: true });\n\t\t\tawait copyTemplateFiles(sourcePath, destPath, variables);\n\t\t} else if (entry.isFile()) {\n\t\t\t// Read file content\n\t\t\tconst content = await Bun.file(sourcePath).text();\n\n\t\t\t// Replace variables in content\n\t\t\tlet processedContent = content;\n\t\t\tfor (const [key, value] of Object.entries(variables)) {\n\t\t\t\tconst placeholder = `{{${key}}}`;\n\t\t\t\tprocessedContent = processedContent.split(placeholder).join(value);\n\t\t\t}\n\n\t\t\t// Write file\n\t\t\tawait Bun.write(destPath, processedContent);\n\t\t}\n\t}\n}\n\n/**\n * File patterns that should have variable replacements applied\n * Add more patterns here as needed for future variables\n */\nconst VARIABLE_REPLACEMENT_PATTERNS = [\n\t/\\.html$/i, // HTML files (e.g., index.html)\n\t// Add more patterns here as needed:\n\t// /\\.md$/i, // Markdown files\n\t// /\\.txt$/i, // Text files\n];\n\n/**\n * Apply variable replacements to file content based on file type\n * This allows examples to remain as working projects while still customizing them during init\n */\nfunction applyVariableReplacements(\n\tcontent: string,\n\tfileName: string,\n\tvariables: Record<string, string>,\n): string {\n\t// Check if this file type should have variables replaced\n\tconst shouldReplaceVariables = VARIABLE_REPLACEMENT_PATTERNS.some((pattern) =>\n\t\tpattern.test(fileName),\n\t);\n\n\tif (!shouldReplaceVariables) {\n\t\treturn content;\n\t}\n\n\tlet processedContent = content;\n\n\t// For HTML files, replace title tag content\n\tif (/\\.html$/i.test(fileName)) {\n\t\t// Replace title tag content with PROJECT_NAME if available\n\t\tif (variables.PROJECT_NAME) {\n\t\t\t// Match <title>...</title> and replace content\n\t\t\tprocessedContent = processedContent.replace(\n\t\t\t\t/<title>.*?<\\/title>/i,\n\t\t\t\t`<title>${variables.PROJECT_NAME}</title>`,\n\t\t\t);\n\t\t}\n\t}\n\n\t// Add more file-specific replacements here as needed\n\t// For example, for markdown files:\n\t// if (/\\.md$/i.test(fileName)) {\n\t// processedContent = processedContent.replace(/{{PROJECT_NAME}}/g, variables.PROJECT_NAME);\n\t// }\n\n\treturn processedContent;\n}\n\n/**\n * Copy source files from examples, optionally applying variable replacements\n */\nasync function copySourceFiles(\n\tsourcePath: string,\n\ttargetPath: string,\n\tvariables?: Record<string, string>,\n) {\n\tconst entries = await readdir(sourcePath, { withFileTypes: true });\n\n\t// Create target directory\n\tawait mkdir(targetPath, { recursive: true });\n\n\tfor (const entry of entries) {\n\t\tconst sourceEntryPath = join(sourcePath, entry.name);\n\t\tconst targetEntryPath = join(targetPath, entry.name);\n\n\t\tif (entry.isDirectory()) {\n\t\t\t// Recursively copy directory\n\t\t\tawait copySourceFiles(sourceEntryPath, targetEntryPath, variables);\n\t\t} else if (entry.isFile()) {\n\t\t\t// Read file content\n\t\t\tconst content = await Bun.file(sourceEntryPath).text();\n\n\t\t\t// Apply variable replacements if variables are provided\n\t\t\tconst processedContent = variables\n\t\t\t\t? applyVariableReplacements(content, entry.name, variables)\n\t\t\t\t: content;\n\n\t\t\t// Write file\n\t\t\tawait Bun.write(targetEntryPath, processedContent);\n\t\t}\n\t}\n}\n\nfunction printSuccess(projectName: string, template: string) {\n\tconsole.log('\\n🏎️ Project created successfully!\\n');\n\tconsole.log('Next steps:\\n');\n\tconsole.log(` cd ${projectName}`);\n\tconsole.log(' bun dev\\n');\n\tconsole.log('Your app will be running at http://localhost:3000\\n');\n\tconsole.log('Project structure:');\n\tconsole.log(' src/');\n\tconsole.log(' |-- index.ts # Server entry point');\n\tconsole.log(' +-- client/');\n\tconsole.log(' |-- App.tsx # Root React component');\n\tconsole.log(' |-- index.tsx # Client entry point');\n\tconsole.log(' |-- index.html # HTML template');\n\tconsole.log(' |-- routes/ # File-based routes');\n\tif (template === 'blog') {\n\t\tconsole.log(' | |-- blog/');\n\t\tconsole.log(' | | |-- content/ # Blog posts');\n\t\tconsole.log(' | | |-- [slug].tsx');\n\t\tconsole.log(' | | +-- index.tsx');\n\t}\n\tif (template === 'store') {\n\t\tconsole.log(' | |-- products/');\n\t\tconsole.log(' | |-- categories/');\n\t\tconsole.log(' |-- lib/ # API client & utilities');\n\t\tconsole.log(' +-- theme.css # Tailwind CSS v4');\n\t}\n\tconsole.log(' | |-- index.tsx');\n\tconsole.log(' | +-- about.tsx');\n\tconsole.log(' +-- components/ # React components\\n');\n\tconsole.log('Learn more at https://github.com/stewones/reroute');\n}\n\nasync function printHelp() {\n\tconsole.log(await getVersionString());\n\tconsole.log('');\n\tconsole.log('Usage:');\n\tconsole.log(' reroute init <project-name> [options]');\n\tconsole.log('');\n\tconsole.log('Options:');\n\tconsole.log(' --template <name> Template to use (basic, blog, store)');\n\tconsole.log(' -h, --help Show help');\n\tconsole.log('');\n\tconsole.log('Examples:');\n\tconsole.log(' reroute init my-app');\n\tconsole.log(' reroute init my-blog --template blog');\n\tconsole.log(' reroute init my-store --template store');\n}\n",
|
|
7
|
-
"/**\n * Markdown integration utility\n *\n * Manages markdown and syntax highlighting packages for the Reroute framework\n */\n\nimport { existsSync, readFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\n\n/**\n * Check if a package is available in package.json, searching up to 5 parent directories\n */\nfunction isPackageAvailable(cwd: string, packageName: string): boolean {\n\tlet currentDir = cwd;\n\n\t// Check up to 5 levels up\n\tfor (let i = 0; i < 5; i++) {\n\t\tconst packageJsonPath = join(currentDir, 'package.json');\n\n\t\tif (existsSync(packageJsonPath)) {\n\t\t\ttry {\n\t\t\t\tconst packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf-8'));\n\t\t\t\tconst deps = {\n\t\t\t\t\t...packageJson.dependencies,\n\t\t\t\t\t...packageJson.devDependencies,\n\t\t\t\t\t...packageJson.peerDependencies,\n\t\t\t\t};\n\n\t\t\t\tif (packageName in deps) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\t// Continue to parent directory\n\t\t\t}\n\t\t}\n\n\t\tconst parentDir = dirname(currentDir);\n\t\t// Stop if we've reached the root\n\t\tif (parentDir === currentDir) {\n\t\t\tbreak;\n\t\t}\n\t\tcurrentDir = parentDir;\n\t}\n\n\treturn false;\n}\n\n/**\n * Check if react-markdown is available in the project\n */\nfunction isReactMarkdownAvailable(cwd: string): boolean {\n\treturn isPackageAvailable(cwd, 'react-markdown');\n}\n\n/**\n * Check if Shiki is available in the project\n */\nfunction isShikiAvailable(cwd: string): boolean {\n\treturn isPackageAvailable(cwd, '@shikijs/rehype');\n}\n\n/**\n * Check if remark-gfm (GitHub Flavored Markdown) is available\n */\nfunction isRemarkGfmAvailable(cwd: string): boolean {\n\treturn isPackageAvailable(cwd, 'remark-gfm');\n}\n\n/**\n * Check if @mdx-js/mdx is available in the project\n */\nfunction isMdxAvailable(cwd: string): boolean {\n\treturn isPackageAvailable(cwd, '@mdx-js/mdx');\n}\n\n/**\n * Get markdown configuration status for the project\n */\nexport function getMarkdownConfig(cwd: string) {\n\tconst hasReactMarkdown = isReactMarkdownAvailable(cwd);\n\tconst hasShiki = isShikiAvailable(cwd);\n\tconst hasRemarkGfm = isRemarkGfmAvailable(cwd);\n\tconst hasMdx = isMdxAvailable(cwd);\n\n\treturn {\n\t\thasReactMarkdown,\n\t\thasShiki,\n\t\thasRemarkGfm,\n\t\thasMdx,\n\t\tisConfigured: hasReactMarkdown,\n\t};\n}\n\n/**\n * Log markdown configuration status\n */\nexport function logMarkdownStatus(cwd: string): void {\n\tconst config = getMarkdownConfig(cwd);\n\n\tif (config.isConfigured) {\n\t\tconsole.log('[reroute/markdown] Markdown rendering available');\n\t\tif (config.hasShiki) {\n\t\t\tconsole.log('[reroute/markdown] ✓ Shiki syntax highlighting enabled');\n\t\t}\n\t\tif (config.hasRemarkGfm) {\n\t\t\tconsole.log('[reroute/markdown] ✓ GitHub Flavored Markdown enabled');\n\t\t}\n\t\tif (config.hasMdx) {\n\t\t\tconsole.log(\n\t\t\t\t'[reroute/markdown] ✓ MDX compiler enabled (JSX in markdown)',\n\t\t\t);\n\t\t}\n\t}\n}\n\n/**\n * Check if markdown packages are configured and log status\n */\nexport function checkMarkdownIfConfigured(cwd: string): boolean {\n\ttry {\n\t\tconst config = getMarkdownConfig(cwd);\n\t\tif (config.isConfigured) {\n\t\t\tlogMarkdownStatus(cwd);\n\t\t}\n\t\treturn config.isConfigured;\n\t} catch (e) {\n\t\tconsole.warn('[reroute/markdown] check failed:', e);\n\t\treturn false;\n\t}\n}\n",
|
|
8
|
-
"/**\n * Markdown/MDX processor for route files\n *\n * Processes .md and .mdx files with frontmatter support for use in the routing system\n */\n\nimport { existsSync, readFileSync } from 'node:fs';\nimport { basename, dirname, extname, join } from 'node:path';\n\n// biome-ignore lint/suspicious/noExplicitAny: yes\ntype Any = any;\n\nexport interface MarkdownFrontmatter {\n\ttitle?: string;\n\tdescription?: string;\n\tdate?: string;\n\tslug?: string;\n\texcerpt?: string;\n\t[key: string]: Any;\n}\n\nexport interface ProcessedMarkdown {\n\tfrontmatter: MarkdownFrontmatter;\n\tcontent: string;\n\trawContent: string;\n\thasJSX: boolean;\n}\n\n/**\n * Simple frontmatter parser (YAML-like)\n * Extracts metadata from markdown files between --- delimiters\n */\nfunction parseFrontmatter(content: string): {\n\tdata: MarkdownFrontmatter;\n\tcontent: string;\n} {\n\tconst frontmatterRegex = /^---\\s*\\n([\\s\\S]*?)\\n---\\s*\\n([\\s\\S]*)$/;\n\tconst match = content.match(frontmatterRegex);\n\n\tif (!match) {\n\t\treturn { data: {}, content };\n\t}\n\n\tconst [, frontmatterText, markdownContent] = match;\n\tconst data: MarkdownFrontmatter = {};\n\n\t// Parse simple key: value pairs\n\tconst lines = frontmatterText.split('\\n');\n\tfor (const line of lines) {\n\t\tconst colonIndex = line.indexOf(':');\n\t\tif (colonIndex === -1) continue;\n\n\t\tconst key = line.slice(0, colonIndex).trim();\n\t\tlet value = line.slice(colonIndex + 1).trim();\n\n\t\t// Remove quotes if present\n\t\tif (\n\t\t\t(value.startsWith('\"') && value.endsWith('\"')) ||\n\t\t\t(value.startsWith(\"'\") && value.endsWith(\"'\"))\n\t\t) {\n\t\t\tvalue = value.slice(1, -1);\n\t\t}\n\n\t\t// Parse arrays (simple format: [item1, item2])\n\t\tif (value.startsWith('[') && value.endsWith(']')) {\n\t\t\tdata[key] = value\n\t\t\t\t.slice(1, -1)\n\t\t\t\t.split(',')\n\t\t\t\t.map((v) => v.trim().replace(/^[\"']|[\"']$/g, ''));\n\t\t}\n\t\t// Parse booleans\n\t\telse if (value === 'true' || value === 'false') {\n\t\t\tdata[key] = value === 'true';\n\t\t}\n\t\t// Parse numbers\n\t\telse if (!Number.isNaN(Number(value))) {\n\t\t\tdata[key] = Number(value);\n\t\t}\n\t\t// String value\n\t\telse {\n\t\t\tdata[key] = value;\n\t\t}\n\t}\n\n\treturn { data, content: markdownContent };\n}\n\n/**\n * Check if markdown content contains JSX syntax\n */\nfunction hasJSXSyntax(content: string): boolean {\n\t// Simple heuristic: look for JSX-like patterns\n\tconst jsxPatterns = [\n\t\t/<[A-Z][a-zA-Z0-9]*/, // Component tags like <Component>\n\t\t/import\\s+{[^}]+}\\s+from/, // ES6 imports\n\t\t/import\\s+\\w+\\s+from/, // Default imports\n\t\t/export\\s+(default|const|function)/, // Exports\n\t\t/<\\w+\\s+\\w+={/, // Props with curly braces\n\t];\n\n\treturn jsxPatterns.some((pattern) => pattern.test(content));\n}\n\n/**\n * Process a markdown/MDX file and return structured data\n */\nexport function processMarkdownFile(filePath: string): ProcessedMarkdown {\n\tconst rawContent = readFileSync(filePath, 'utf-8');\n\tconst { data, content } = parseFrontmatter(rawContent);\n\tconst hasJSX = hasJSXSyntax(content);\n\n\treturn {\n\t\tfrontmatter: data,\n\t\tcontent,\n\t\trawContent,\n\t\thasJSX,\n\t};\n}\n\n/**\n * Check if @mdx-js/mdx is available in the project\n */\nfunction isMdxAvailable(cwd: string): boolean {\n\tlet currentDir = cwd;\n\n\t// Check up to 5 levels up\n\tfor (let i = 0; i < 5; i++) {\n\t\tconst packageJsonPath = join(currentDir, 'package.json');\n\n\t\tif (existsSync(packageJsonPath)) {\n\t\t\ttry {\n\t\t\t\tconst packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf-8'));\n\t\t\t\tconst deps = {\n\t\t\t\t\t...packageJson.dependencies,\n\t\t\t\t\t...packageJson.devDependencies,\n\t\t\t\t\t...packageJson.peerDependencies,\n\t\t\t\t};\n\n\t\t\t\tif ('@mdx-js/mdx' in deps) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\t// Continue to parent directory\n\t\t\t}\n\t\t}\n\n\t\tconst parentDir = dirname(currentDir);\n\t\t// Stop if we've reached the root\n\t\tif (parentDir === currentDir) {\n\t\t\tbreak;\n\t\t}\n\t\tcurrentDir = parentDir;\n\t}\n\n\treturn false;\n}\n\n/**\n * Compile MDX content to JSX using @mdx-js/mdx\n */\nasync function compileMdx(\n\tcontent: string,\n\tcwd: string,\n\toptions: {\n\t\tenableGfm?: boolean;\n\t\ttheme?: string;\n\t\tfilename?: string;\n\t} = {},\n): Promise<string | null> {\n\tif (!isMdxAvailable(cwd)) {\n\t\tconsole.warn(\n\t\t\t'[reroute/mdx] @mdx-js/mdx not installed. Install with: bun add @mdx-js/mdx',\n\t\t);\n\t\treturn null;\n\t}\n\n\ttry {\n\t\t// Try to find @mdx-js/mdx in workspace, checking up to 3 levels up\n\t\tlet compile: Any;\n\t\tconst pathsToTry = [\n\t\t\tjoin(cwd, 'node_modules/@mdx-js/mdx'),\n\t\t\tjoin(cwd, '../node_modules/@mdx-js/mdx'),\n\t\t\tjoin(cwd, '../../node_modules/@mdx-js/mdx'),\n\t\t\tjoin(cwd, '../../../node_modules/@mdx-js/mdx'),\n\t\t];\n\n\t\tfor (const mdxPath of pathsToTry) {\n\t\t\ttry {\n\t\t\t\tconst mdxModule = require(mdxPath);\n\t\t\t\tcompile = mdxModule.compile;\n\t\t\t\tbreak;\n\t\t\t} catch {\n\t\t\t\t// Try next path\n\t\t\t}\n\t\t}\n\n\t\tif (!compile) {\n\t\t\tconsole.error('[reroute/mdx] Could not load @mdx-js/mdx from any path');\n\t\t\treturn null;\n\t\t}\n\n\t\tconst { enableGfm = true, theme = 'github-dark' } = options;\n\n\t\tconst remarkPlugins = [] as Any[];\n\t\tconst rehypePlugins = [] as Any[];\n\n\t\t// Add GFM support if requested\n\t\tif (enableGfm) {\n\t\t\tconst gfmPathsToTry = [\n\t\t\t\tjoin(cwd, 'node_modules/remark-gfm'),\n\t\t\t\tjoin(cwd, '../node_modules/remark-gfm'),\n\t\t\t\tjoin(cwd, '../../node_modules/remark-gfm'),\n\t\t\t\tjoin(cwd, '../../../node_modules/remark-gfm'),\n\t\t\t];\n\n\t\t\tlet remarkGfm: Any = null;\n\t\t\tfor (const gfmPath of gfmPathsToTry) {\n\t\t\t\ttry {\n\t\t\t\t\tremarkGfm = require(gfmPath);\n\t\t\t\t\tbreak;\n\t\t\t\t} catch {\n\t\t\t\t\t// Try next path\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (remarkGfm) {\n\t\t\t\tremarkPlugins.push(remarkGfm.default || remarkGfm);\n\t\t\t} else {\n\t\t\t\tconsole.warn('[reroute/mdx] remark-gfm not available, skipping');\n\t\t\t}\n\t\t}\n\n\t\t// Add Shiki highlighting if available (compile-time only, safe for SSR)\n\t\tconst shikiPathsToTry = [\n\t\t\tjoin(cwd, 'node_modules/@shikijs/rehype'),\n\t\t\tjoin(cwd, '../node_modules/@shikijs/rehype'),\n\t\t\tjoin(cwd, '../../node_modules/@shikijs/rehype'),\n\t\t\tjoin(cwd, '../../../node_modules/@shikijs/rehype'),\n\t\t];\n\n\t\tlet rehypeShiki: Any = null;\n\t\tfor (const shikiPath of shikiPathsToTry) {\n\t\t\ttry {\n\t\t\t\trehypeShiki = require(shikiPath);\n\t\t\t\tbreak;\n\t\t\t} catch {\n\t\t\t\t// Try next path\n\t\t\t}\n\t\t}\n\n\t\tif (rehypeShiki) {\n\t\t\trehypePlugins.push([rehypeShiki.default || rehypeShiki, { theme }]);\n\t\t} else {\n\t\t\tconsole.warn(\n\t\t\t\t'[reroute/mdx] @shikijs/rehype not available, skipping highlighting',\n\t\t\t);\n\t\t}\n\n\t\tconst result = await compile(content, {\n\t\t\tremarkPlugins,\n\t\t\trehypePlugins,\n\t\t\toutputFormat: 'program',\n\t\t\tdevelopment: false,\n\t\t});\n\n\t\treturn String(result);\n\t} catch (error) {\n\t\t// Log only the essential error information to avoid confusion\n\t\tconst errorMessage = error instanceof Error ? error.message : String(error);\n\t\tconst errorLocation =\n\t\t\terror &&\n\t\t\ttypeof error === 'object' &&\n\t\t\t'place' in error &&\n\t\t\terror.place &&\n\t\t\ttypeof error.place === 'object'\n\t\t\t\t? `at line ${(error.place as Any).line || '?'}, column ${(error.place as Any).column || '?'}`\n\t\t\t\t: '';\n\t\tconst fileInfo = options.filename ? ` in ${options.filename}` : '';\n\n\t\tconsole.warn(\n\t\t\t`[reroute/mdx] Compilation failed${fileInfo}${errorLocation ? ` ${errorLocation}` : ''}: ${errorMessage}`,\n\t\t);\n\t\tconsole.warn('[reroute/mdx] Falling back to react-markdown');\n\t\treturn null;\n\t}\n}\n\n/**\n * Generate a React component wrapper for markdown content\n * This creates a TypeScript module that can be imported as a route\n */\nexport async function generateMarkdownModule(\n\tprocessed: ProcessedMarkdown,\n\tcwd: string,\n\toptions: {\n\t\tenableGfm?: boolean;\n\t\ttheme?: string;\n\t\tisMdx?: boolean;\n\t\tfilename?: string;\n\t} = {},\n): Promise<string> {\n\tconst { frontmatter, content } = processed;\n\tconst {\n\t\tenableGfm = true,\n\t\ttheme = 'github-dark',\n\t\tisMdx = false,\n\t\tfilename,\n\t} = options;\n\n\t// Prefer MDX engine for both .mdx and .md when available to ensure\n\t// identical SSR/CSR output. MD is a subset of MDX, so compile it too.\n\tconst compiledMdx = await compileMdx(content, cwd, {\n\t\tenableGfm,\n\t\ttheme,\n\t\tfilename,\n\t});\n\tif (compiledMdx) {\n\t\t// Already a complete program that exports a default component\n\t\treturn `// Generated from ${isMdx ? 'MDX' : 'Markdown'} file with @mdx-js/mdx\n\n// MDX compiled content with imports and component\n${compiledMdx}\n\n// Add metadata exports\nexport const meta = ${JSON.stringify(frontmatter, null, 2)};\n\nexport const ssr = {\n head: [\n '<meta property=\"og:type\" content=\"article\" />',\n '<meta name=\"twitter:card\" content=\"summary_large_image\" />',\n ],\n};\n`;\n\t}\n\n\t// Regular markdown - wrap with Markdown component\n\tconst escapedContent = content\n\t\t.replace(/\\\\/g, '\\\\\\\\')\n\t\t.replace(/`/g, '\\\\`')\n\t\t.replace(/\\$/g, '\\\\$');\n\n\t// Build plugin imports\n\tconst pluginImports: string[] = [];\n\tconst remarkPluginsList: string[] = [];\n\tconst rehypePluginsList: string[] = [];\n\n\tif (enableGfm) {\n\t\tpluginImports.push(\"import remarkGfm from 'remark-gfm';\");\n\t\tremarkPluginsList.push('remarkGfm');\n\t}\n\n\t// Note: Shiki is async and breaks SSR - skip it\n\n\tconst pluginImportsStr =\n\t\tpluginImports.length > 0 ? `${pluginImports.join('\\n')}\\n` : '';\n\tconst remarkPluginsStr =\n\t\tremarkPluginsList.length > 0\n\t\t\t? `remarkPlugins={[${remarkPluginsList.join(', ')}]}`\n\t\t\t: '';\n\tconst rehypePluginsStr =\n\t\trehypePluginsList.length > 0\n\t\t\t? `rehypePlugins={[${rehypePluginsList.join(', ')}]}`\n\t\t\t: '';\n\tconst pluginsPropsStr = [remarkPluginsStr, rehypePluginsStr]\n\t\t.filter(Boolean)\n\t\t.join('\\n ');\n\n\treturn `// Generated from markdown file\nimport { Markdown } from 'reroute-js/react';\n${pluginImportsStr}\nconst meta = ${JSON.stringify(frontmatter, null, 2)};\n\nconst ssr = {\n head: [\n '<meta property=\"og:type\" content=\"article\" />',\n '<meta name=\"twitter:card\" content=\"summary_large_image\" />',\n ],\n};\n\nconst markdownContent = \\`${escapedContent}\\`;\n\nfunction MarkdownRoute() {\n return (\n <div>\n <Markdown\n ${pluginsPropsStr}\n >\n {markdownContent}\n </Markdown>\n </div>\n );\n}\n\nexport { meta, ssr };\nexport default MarkdownRoute;\n`;\n}\n\n/**\n * Generate a plain fallback TSX module when markdown tooling\n * is not configured. Renders raw markdown content in a <pre> block\n * so routes still work without extra deps.\n */\nexport function generatePlainMarkdownModule(\n\tprocessed: ProcessedMarkdown,\n): string {\n\tconst { frontmatter, content } = processed;\n\tconst escapedContent = content\n\t\t.replace(/\\\\/g, '\\\\\\\\')\n\t\t.split(String.fromCharCode(96))\n\t\t.join(`\\\\${String.fromCharCode(96)}`)\n\t\t.split('$')\n\t\t.join('\\\\$');\n\n\treturn `// Generated from markdown file (plain fallback)\n// No markdown renderer detected; showing raw content.\nexport const meta = ${JSON.stringify(frontmatter, null, 2)};\n\nexport const ssr = {\n head: [\n '<meta property=\"og:type\" content=\"article\" />',\n '<meta name=\"twitter:card\" content=\"summary_large_image\" />',\n ],\n};\n\nconst markdownContent = \\`${escapedContent}\\`;\n\nexport default function MarkdownFallback() {\n return (\n <div style={{ padding: '1rem' }}>\n {meta?.title && (\n <h1 style={{ fontSize: '1.5rem', fontWeight: 600 }}>{meta.title}</h1>\n )}\n <div style={{\n margin: '0.75rem 0',\n padding: '0.75rem',\n borderLeft: '4px solid #eab308',\n background: '#fefce8',\n color: '#713f12'\n }}>\n <strong>Markdown rendering not configured.</strong>\n <div style={{ marginTop: '0.25rem' }}>\n Install: react-markdown (required), remark-gfm (optional), @mdx-js/mdx (optional), @shikijs/rehype (optional).\n </div>\n </div>\n <pre style={{ whiteSpace: 'pre-wrap', lineHeight: 1.6 }}>{markdownContent}</pre>\n </div>\n );\n}\n`;\n}\n\n/**\n * Check if a file is a markdown file\n */\nexport function isMarkdownFile(filePath: string): boolean {\n\tconst ext = extname(filePath).toLowerCase();\n\treturn ext === '.md' || ext === '.mdx';\n}\n\n/**\n * Get the route name from a markdown filename\n * Converts kebab-case to the route path\n */\nexport function getMarkdownRouteName(filePath: string): string {\n\tconst name = basename(filePath, extname(filePath));\n\treturn name;\n}\n",
|
|
9
|
-
"/**\n * Production mode utility\n *\n * Provides utilities to check if the CLI is running in production mode.\n * Production mode can be enabled either via NODE_ENV=production or --prod flag.\n */\n\n/**\n * Check if production mode is enabled\n * @param args Command line arguments to check for --prod flag\n * @returns true if NODE_ENV=production or --prod flag is present\n */\nexport function isProductionMode(args: string[] = []): boolean {\n\treturn (\n\t\tprocess.env.NODE_ENV === 'production' ||\n\t\tBun.env.NODE_ENV === 'production' ||\n\t\targs.includes('--prod')\n\t);\n}\n\n/**\n * Set NODE_ENV to production if --prod flag is present\n * This ensures child processes inherit the production setting\n * @param args Command line arguments to check for --prod flag\n */\nexport function ensureProductionEnv(args: string[] = []): void {\n\tif (args.includes('--prod')) {\n\t\tprocess.env.NODE_ENV = 'production';\n\t\tBun.env.NODE_ENV = 'production';\n\t}\n}\n\n/**\n * Filter out --prod flag from arguments since it's handled globally\n * @param args Command line arguments\n * @returns Filtered arguments without --prod\n */\nexport function filterProdFlag(args: string[]): string[] {\n\treturn args.filter((arg) => arg !== '--prod');\n}\n",
|
|
10
|
-
"/**\n * Tailwind CSS v4 integration utility\n *\n * Manages Tailwind CLI integration for the Reroute framework\n */\n\nimport { spawn } from 'node:child_process';\nimport { existsSync, readFileSync } from 'node:fs';\nimport { join } from 'node:path';\n\n/**\n * Check if Tailwind CSS v4 is available in the project\n * Checks current directory and up to 3 levels up (for monorepos)\n */\nfunction isTailwindAvailable(cwd: string): boolean {\n\tconst pathsToTry = [\n\t\tjoin(cwd, 'package.json'),\n\t\tjoin(cwd, '../package.json'),\n\t\tjoin(cwd, '../../package.json'),\n\t\tjoin(cwd, '../../../package.json'),\n\t];\n\n\tfor (const packageJsonPath of pathsToTry) {\n\t\tif (!existsSync(packageJsonPath)) {\n\t\t\tcontinue;\n\t\t}\n\n\t\ttry {\n\t\t\tconst packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf-8'));\n\t\t\tconst deps = {\n\t\t\t\t...packageJson.dependencies,\n\t\t\t\t...packageJson.devDependencies,\n\t\t\t};\n\n\t\t\tif ('@tailwindcss/cli' in deps) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t} catch {}\n\t}\n\n\treturn false;\n}\n\n/**\n * Get the default paths for Tailwind CSS\n */\nfunction getTailwindPaths(cwd: string) {\n\tconst input = join(cwd, 'src/client/theme.css');\n\tconst output = join(cwd, '.reroute/theme.css');\n\n\treturn { input, output };\n}\n\n/**\n * Check if Tailwind input file exists and uses v4 format\n */\nfunction hasTailwindInput(cwd: string): boolean {\n\tconst { input } = getTailwindPaths(cwd);\n\n\tif (!existsSync(input)) {\n\t\treturn false;\n\t}\n\n\ttry {\n\t\tconst content = readFileSync(input, 'utf-8');\n\t\t// v4 uses @import \"tailwindcss\"\n\t\treturn content.includes('tailwindcss');\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nfunction resolveTailwindBin(cwd: string): string {\n\t// Try to find tailwindcss binary, checking up to 3 levels up\n\tconst pathsToTry = [\n\t\tjoin(cwd, '../node_modules/.bin/tailwindcss'),\n\t\tjoin(cwd, '../../node_modules/.bin/tailwindcss'),\n\t\tjoin(cwd, '../../../node_modules/.bin/tailwindcss'),\n\t];\n\n\tfor (const binPath of pathsToTry) {\n\t\tif (existsSync(binPath)) {\n\t\t\treturn binPath;\n\t\t}\n\t}\n\n\t// Fallback to the default location if none found\n\treturn join(cwd, 'node_modules/.bin/tailwindcss');\n}\n\n/**\n * Build Tailwind CSS using the Tailwind CLI\n */\nasync function buildTailwind(cwd: string, minify = false): Promise<void> {\n\tconst { input, output } = getTailwindPaths(cwd);\n\n\treturn new Promise((resolve, reject) => {\n\t\tconst tailwindBin = resolveTailwindBin(cwd);\n\t\tconst args = ['-i', input, '-o', output];\n\n\t\t// Add minify flag for production builds\n\t\tif (minify) {\n\t\t\targs.push('--minify');\n\t\t}\n\n\t\tconst argsStr = args.join(' ');\n\t\tconsole.log(`[reroute/tailwind] build start: ${argsStr}`);\n\n\t\tconst tailwind = spawn(tailwindBin, args, {\n\t\t\tcwd,\n\t\t\tstdio: 'pipe',\n\t\t});\n\n\t\ttailwind.stdout?.on('data', (data) => {\n\t\t\tconst line = data.toString().trim();\n\t\t\tif (line) {\n\t\t\t\tconsole.log(`[reroute/tailwind] ${line}`);\n\t\t\t}\n\t\t});\n\n\t\ttailwind.stderr?.on('data', (data) => {\n\t\t\tconst line = data.toString().trim();\n\t\t\tif (line) {\n\t\t\t\tconsole.log(`[reroute/tailwind] ${line}`);\n\t\t\t}\n\t\t});\n\n\t\ttailwind.on('close', (code) => {\n\t\t\tif (code === 0) {\n\t\t\t\tconsole.log('[reroute/tailwind] build done');\n\t\t\t\tresolve();\n\t\t\t} else {\n\t\t\t\treject(new Error(`Tailwind CSS build failed with code ${code}`));\n\t\t\t}\n\t\t});\n\n\t\ttailwind.on('error', (error) => {\n\t\t\treject(error);\n\t\t});\n\t});\n}\n\n/**\n * Build Tailwind once if installed and input exists.\n * Returns true if a build was attempted (success or failure), false if skipped.\n */\nexport async function buildTailwindIfConfigured(\n\tcwd: string,\n\tminify = false,\n): Promise<boolean> {\n\ttry {\n\t\tif (isTailwindAvailable(cwd) && hasTailwindInput(cwd)) {\n\t\t\tawait buildTailwind(cwd, minify);\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t} catch (e) {\n\t\tconsole.warn('[reroute/tailwind] build failed:', e);\n\t\treturn true;\n\t}\n}\n",
|
|
11
|
-
"#!/usr/bin/env bun\nimport { watch } from 'node:fs';\nimport { mkdir, readdir, rm } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { pathToFileURL } from 'node:url';\nimport { checkMarkdownIfConfigured, getMarkdownConfig } from '../libs/markdown';\nimport {\n\tgenerateMarkdownModule,\n\tgeneratePlainMarkdownModule,\n\tisMarkdownFile,\n\tprocessMarkdownFile,\n} from '../libs/markdown-processor';\nimport { isProductionMode } from '../libs/production';\nimport { buildTailwindIfConfigured } from '../libs/tailwind';\n\n// biome-ignore lint/suspicious/noExplicitAny: flexible content meta type\ntype Doc = any;\n\ninterface RouteFile {\n\tpath: string;\n\tpattern: string;\n\tfilePath: string;\n\tisLayout: boolean;\n\tisDynamic: boolean;\n\tparams: string[];\n\t/** special case for [404].tsx */\n\tisNotFound?: boolean;\n\t/** when isNotFound, this is the base pattern to match as a prefix */\n\tnotFoundBasePattern?: string;\n}\n\ninterface RouteTree {\n\troutes: RouteFile[];\n\tlayouts: RouteFile[];\n\tnotFoundRoutes: RouteFile[];\n}\n\nconst ROUTES_DIR = 'src/client/routes';\nconst OUTPUT_DIR = '.reroute';\nconst OUTPUT_ROUTES = '.reroute/routes.ts';\nconst OUTPUT_CONTENT_TS = '.reroute/content.ts';\nconst OUTPUT_COLLECTIONS_DIR = '.reroute/collections';\nconst OUTPUT_INDEX = '.reroute/index.ts';\n\nasync function ensureOutputDir(cwd: string) {\n\ttry {\n\t\tconst outputPath = join(cwd, OUTPUT_DIR);\n\n\t\t// Check if .reroute directory exists and has content\n\t\tlet needsCleanup = false;\n\t\ttry {\n\t\t\tconst entries = await readdir(outputPath);\n\t\t\tneedsCleanup = entries.length > 0;\n\t\t} catch {\n\t\t\t// Directory doesn't exist, no cleanup needed\n\t\t}\n\n\t\tif (needsCleanup) {\n\t\t\t// Remove existing generated files\n\t\t\tawait rm(outputPath, { force: true, recursive: true });\n\t\t\tconsole.log('[reroute/gen] Cleaned up generated artifacts in .reroute');\n\t\t}\n\n\t\t// Ensure .reroute exists for subsequent writes\n\t\tawait mkdir(outputPath, { recursive: true });\n\t\tawait mkdir(join(cwd, OUTPUT_COLLECTIONS_DIR), { recursive: true });\n\t\tawait mkdir(join(cwd, '.reroute/bundles'), { recursive: true });\n\t} catch {\n\t\t// Ignore cleanup errors\n\t}\n}\n\nasync function writeStubFiles(cwd: string) {\n\t// Write minimal stub files so the app can start immediately\n\t// This prevents \"Cannot find module\" errors when server starts\n\tconst STUB_ROUTES = `// 🚨 Auto-generated stub by Reroute - DO NOT EDIT 🚨\n// This will be replaced by actual routes\n/* eslint-disable */\n// @ts-nocheck\n\nexport const layouts: any[] = [];\nexport const notFoundRoutes: any[] = [];\n\nexport function matchRoute(pathname: string): any {\n return null;\n}\n\nexport type RouteParams = Record<string, never>;\n`;\n\n\tconst STUB_CONTENT = `// 🚨 Auto-generated stub by Reroute - DO NOT EDIT 🚨\n// This will be replaced by actual content\n/* eslint-disable */\n// @ts-nocheck\n\nexport const contentRegistry: Record<string, any> = {};\n`;\n\n\tconst STUB_INDEX = `// 🚨 Auto-generated stub by Reroute - DO NOT EDIT 🚨\n// This will be replaced by actual artifacts\n/* eslint-disable */\n// @ts-nocheck\n\nimport { layouts, matchRoute, notFoundRoutes } from './routes';\n\nexport const artifacts = {\n layouts,\n matchRoute,\n notFoundRoutes,\n contentBaseUrl: '/.reroute/collections'\n} as const;\n\nexport type RerouteArtifacts = typeof artifacts;\n`;\n\n\tawait Bun.write(join(cwd, OUTPUT_ROUTES), STUB_ROUTES);\n\tawait Bun.write(join(cwd, OUTPUT_CONTENT_TS), STUB_CONTENT);\n\tawait Bun.write(join(cwd, OUTPUT_INDEX), STUB_INDEX);\n\n\tconsole.log('[reroute/gen] Initialized stub files');\n}\n\nasync function scanDirectory(dir: string, base = ''): Promise<string[]> {\n\tconst files: string[] = [];\n\tconst entries = await readdir(dir, { withFileTypes: true });\n\n\tfor (const entry of entries) {\n\t\tconst fullPath = join(dir, entry.name);\n\t\tconst relativePath = join(base, entry.name);\n\n\t\tif (entry.isDirectory()) {\n\t\t\t// Skip content directories; those are not routes\n\t\t\tif (entry.name === 'content') continue;\n\t\t\tconst nested = await scanDirectory(fullPath, relativePath);\n\t\t\tfiles.push(...nested);\n\t\t} else if (\n\t\t\tentry.isFile() &&\n\t\t\t(entry.name.endsWith('.tsx') ||\n\t\t\t\tentry.name.endsWith('.ts') ||\n\t\t\t\tentry.name.endsWith('.md') ||\n\t\t\t\tentry.name.endsWith('.mdx'))\n\t\t) {\n\t\t\t// Skip non-route files and any files under a content/ segment\n\t\t\tif (\n\t\t\t\trelativePath.includes('/content/') ||\n\t\t\t\trelativePath.startsWith('content/')\n\t\t\t) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (!entry.name.startsWith('_') || entry.name === '[layout].tsx') {\n\t\t\t\tfiles.push(relativePath);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn files;\n}\n\n// Recursively scan for [404].tsx or [404].ts anywhere under routes, including content dirs\nasync function scan404Files(dir: string, base = ''): Promise<string[]> {\n\tconst files: string[] = [];\n\tconst entries = await readdir(dir, { withFileTypes: true });\n\tfor (const entry of entries) {\n\t\tconst fullPath = join(dir, entry.name);\n\t\tconst relativePath = join(base, entry.name);\n\t\tif (entry.isDirectory()) {\n\t\t\tconst nested = await scan404Files(fullPath, relativePath);\n\t\t\tfiles.push(...nested);\n\t\t} else if (entry.isFile()) {\n\t\t\tif (/^\\[404]\\.(tsx|ts)$/.test(entry.name)) files.push(relativePath);\n\t\t}\n\t}\n\treturn files;\n}\n\nfunction fileToRoute(filePath: string): RouteFile {\n\tconst isLayout =\n\t\tfilePath.endsWith('[layout].tsx') ||\n\t\tfilePath.endsWith('[layout].ts') ||\n\t\tfilePath.endsWith('[layout].md') ||\n\t\tfilePath.endsWith('[layout].mdx');\n\n\t// Remove extension\n\tlet routePath = filePath.replace(/\\.(tsx|ts|md|mdx)$/, '');\n\n\t// Handle layouts\n\tif (isLayout) {\n\t\troutePath = routePath.replace(/[layout]$/, '').replace(/\\/$/, '');\n\t}\n\n\t// Convert index to /\n\troutePath = routePath.replace(/\\/index$/, '').replace(/^index$/, '');\n\n\t// Extract params from [param] syntax\n\tconst params: string[] = [];\n\tconst pattern = routePath.replace(/\\[([^\\]]+)\\]/g, (_, param) => {\n\t\tparams.push(param);\n\t\treturn `:${param}`;\n\t});\n\n\t// Ensure leading slash\n\tconst normalizedPattern = pattern === '' ? '/' : `/${pattern}`;\n\n\t// Special case: [404].tsx files act as NotFound entries for their directory\n\tconst isNotFound = /(^|\\/)\\[404\\]$/.test(routePath);\n\tlet notFoundBasePattern: string | undefined;\n\tif (isNotFound) {\n\t\tconst base = routePath.replace(/(^|\\/)\\[404\\]$/, '').replace(/\\/$/, '');\n\t\tnotFoundBasePattern = base ? `/${base}` : '/';\n\t}\n\n\treturn {\n\t\tpath: routePath,\n\t\tpattern: normalizedPattern,\n\t\tfilePath,\n\t\tisLayout,\n\t\tisDynamic: params.length > 0,\n\t\tparams,\n\t\tisNotFound,\n\t\tnotFoundBasePattern,\n\t};\n}\n\nfunction sortRoutes(routes: RouteFile[]): RouteFile[] {\n\t// Sort by specificity: static routes first, then dynamic, then catch-all\n\treturn routes.sort((a, b) => {\n\t\tconst aDepth = a.pattern.split('/').length;\n\t\tconst bDepth = b.pattern.split('/').length;\n\n\t\t// Deeper routes first\n\t\tif (aDepth !== bDepth) return bDepth - aDepth;\n\n\t\t// Static before dynamic\n\t\tif (!a.isDynamic && b.isDynamic) return -1;\n\t\tif (a.isDynamic && !b.isDynamic) return 1;\n\n\t\t// Alphabetical\n\t\treturn a.pattern.localeCompare(b.pattern);\n\t});\n}\n\nfunction generateRouteTree(files: string[]): RouteTree {\n\tconst routes: RouteFile[] = [];\n\tconst layouts: RouteFile[] = [];\n\tconst notFoundRoutes: RouteFile[] = [];\n\n\tfor (const file of files) {\n\t\tconst route = fileToRoute(file);\n\t\tif (route.isLayout) {\n\t\t\tlayouts.push(route);\n\t\t} else if (route.isNotFound) {\n\t\t\t// Do not include [404] as a normal route; store separately\n\t\t\tnotFoundRoutes.push(route);\n\t\t} else {\n\t\t\troutes.push(route);\n\t\t}\n\t}\n\n\treturn {\n\t\troutes: sortRoutes(routes),\n\t\tlayouts,\n\t\tnotFoundRoutes: notFoundRoutes,\n\t};\n}\n\n/**\n * Generate import path for a route file\n * Markdown files are imported from .reroute/markdown/, others from src/client/routes/\n */\nfunction getImportPath(filePath: string): string {\n\tconst isMarkdown = /\\.(md|mdx)$/.test(filePath);\n\n\tif (isMarkdown) {\n\t\t// Import from converted markdown in .reroute/markdown/\n\t\tconst pathWithoutExt = filePath.replace(/\\.(md|mdx)$/, '');\n\t\treturn `./markdown/${pathWithoutExt}`;\n\t}\n\n\t// Import from source\n\tconst pathWithoutExt = filePath.replace(/\\.(tsx|ts)$/, '');\n\treturn `../src/client/routes/${pathWithoutExt}`;\n}\n\nfunction generateTypeScript(tree: RouteTree): string {\n\t// Import createLazyRoute helper for code splitting\n\tconst helperImport = \"import { createLazyRoute } from 'reroute-js/react';\";\n\n\t// Import eager versions of all route components for SSR\n\tconst eagerImports = [\n\t\t...tree.routes.map(\n\t\t\t(r, i) => `import Route${i}Eager from '${getImportPath(r.filePath)}';`,\n\t\t),\n\t\t...tree.layouts.map(\n\t\t\t(l, i) => `import Layout${i}Eager from '${getImportPath(l.filePath)}';`,\n\t\t),\n\t\t...tree.notFoundRoutes.map(\n\t\t\t(nf, i) =>\n\t\t\t\t`import NotFound${i}Eager from '${getImportPath(nf.filePath)}';`,\n\t\t),\n\t].join('\\n');\n\n\t// Create lazy-wrapped versions for code splitting\n\tconst lazyWrappers = [\n\t\t...tree.routes.map((r, i) => {\n\t\t\tconst importPath = getImportPath(r.filePath);\n\t\t\treturn `const Route${i} = createLazyRoute(Route${i}Eager, () => import('${importPath}'), \"${r.pattern}\");`;\n\t\t}),\n\t\t...tree.layouts.map((l, i) => {\n\t\t\tconst importPath = getImportPath(l.filePath);\n\t\t\treturn `const Layout${i} = createLazyRoute(Layout${i}Eager, () => import('${importPath}'), \"${l.pattern}\");`;\n\t\t}),\n\t\t...tree.notFoundRoutes.map((nf, i) => {\n\t\t\tconst importPath = getImportPath(nf.filePath);\n\t\t\treturn `const NotFound${i} = createLazyRoute(NotFound${i}Eager, () => import('${importPath}'), \"${nf.notFoundBasePattern || '/'}\");`;\n\t\t}),\n\t].join('\\n');\n\n\tconst routesArray = tree.routes\n\t\t.map((r, i) => {\n\t\t\treturn ` {\n pattern: \"${r.pattern}\",\n path: \"${r.path}\",\n component: Route${i},\n params: ${JSON.stringify(r.params)},\n isDynamic: ${r.isDynamic},\n } as const`;\n\t\t})\n\t\t.join(',\\n');\n\n\tconst routePatterns = tree.routes.map((r) => ` | \"${r.pattern}\"`).join('\\n');\n\n\tconst routeParamsUnion = tree.routes\n\t\t.filter((r) => r.isDynamic)\n\t\t.map((r) => {\n\t\t\tconst params = r.params.map((p) => `${p}: string`).join('; ');\n\t\t\treturn ` T extends \"${r.pattern}\" ? { ${params} } :`;\n\t\t})\n\t\t.join('\\n');\n\n\tconst layoutsArray = tree.layouts\n\t\t.map((l, i) => {\n\t\t\treturn ` {\n pattern: \"${l.pattern}\",\n path: \"${l.path}\",\n component: Layout${i},\n } as const`;\n\t\t})\n\t\t.join(',\\n');\n\n\tconst notFoundRoutesArray = tree.notFoundRoutes\n\t\t.map((nf, i) => {\n\t\t\treturn ` {\n pattern: \"${nf.notFoundBasePattern || '/'}\",\n path: \"${nf.path}\",\n component: NotFound${i},\n } as const`;\n\t\t})\n\t\t.join(',\\n');\n\n\treturn `// 🚨 Auto-generated by Reroute - DO NOT EDIT 🚨\n/* eslint-disable */\n// @ts-nocheck\n\n${helperImport}\n\n${eagerImports}\n\n${lazyWrappers}\n\nexport const routes: RouteInfo = [\n${routesArray}\n] as const;\n\nexport const layouts = [\n${layoutsArray || ''}\n] as const;\n\nexport const notFoundRoutes = [\n${notFoundRoutesArray || ''}\n] as const;\n\nexport type RoutePath =\n${routePatterns || ' | \"/\"'};\n\nexport type RouteParams<T extends RoutePath> = ${\n\t\trouteParamsUnion\n\t\t\t? `\\n${routeParamsUnion}\\n Record<string, never>;`\n\t\t\t: 'Record<string, never>;'\n\t}\n\nexport interface Route {\n pattern: string;\n path: string;\n component: any;\n params: string[];\n isDynamic: boolean;\n}\n\nexport function matchRoute(pathname: string): { route: Route; params: Record<string, string> } | null {\n for (const route of routes) {\n const match = matchPattern(route.pattern, pathname);\n if (match) {\n return { route, params: match };\n }\n }\n return null;\n}\n\nfunction matchPattern(pattern: string, pathname: string): Record<string, string> | null {\n const patternParts = pattern.split('/').filter(Boolean);\n const pathnameParts = pathname.split('/').filter(Boolean);\n\n if (patternParts.length !== pathnameParts.length) {\n return null;\n }\n\n const params: Record<string, string> = {};\n\n for (let i = 0; i < patternParts.length; i++) {\n const patternPart = patternParts[i];\n const pathnamePart = pathnameParts[i];\n\n if (patternPart.startsWith(':')) {\n params[patternPart.slice(1)] = pathnamePart;\n } else if (patternPart !== pathnamePart) {\n return null;\n }\n }\n\n return params;\n}\n`;\n}\n\nasync function listContentFiles(collectionDir: string): Promise<string[]> {\n\ttry {\n\t\tconst entries = await readdir(collectionDir, { withFileTypes: true });\n\t\treturn entries\n\t\t\t.filter(\n\t\t\t\t(e) =>\n\t\t\t\t\te.isFile() &&\n\t\t\t\t\t/\\.(tsx|ts|md|mdx)$/.test(e.name) &&\n\t\t\t\t\t!e.name.startsWith('_'),\n\t\t\t)\n\t\t\t.map((e) => e.name);\n\t} catch {\n\t\treturn [];\n\t}\n}\n\nasync function sha8(text: string): Promise<string> {\n\tconst data = new TextEncoder().encode(text);\n\tconst buf = await crypto.subtle.digest('SHA-256', data);\n\tlet hex = '';\n\tfor (const b of new Uint8Array(buf)) hex += b.toString(16).padStart(2, '0');\n\treturn hex.slice(0, 8);\n}\n\nasync function buildContentChunks(cwd: string, args: string[] = []) {\n\tconst routesRoot = join(cwd, ROUTES_DIR);\n\tconsole.log(`[reroute/content] scan ${routesRoot}`);\n\t// Find any '<collection>/content/*.(ts|tsx)'\n\tconst collections = await readdir(routesRoot, { withFileTypes: true });\n\n\tconst results: Array<{\n\t\tcollection: string;\n\t\tname: string;\n\t\tslug: string;\n\t\thref: string;\n\t\tmoduleUrl: string;\n\t\tmeta: Doc;\n\t}> = [];\n\n\tfor (const c of collections) {\n\t\tif (!c.isDirectory()) continue;\n\t\tconst collection = c.name;\n\t\tconst contentDir = join(routesRoot, collection, 'content');\n\t\tconsole.log(`[reroute/content] collection ${collection} dir ${contentDir}`);\n\t\tconst files = await listContentFiles(contentDir);\n\t\tconsole.log(`[reroute/content] files ${files.length}`);\n\t\tif (!files.length) continue;\n\n\t\tfor (const file of files) {\n\t\t\tconst name = file.replace(/\\.(tsx|ts|md|mdx)$/, '');\n\t\t\tconst absSrc = join(contentDir, file);\n\t\t\tconst isMarkdown = /\\.(md|mdx)$/.test(file);\n\n\t\t\t// For markdown files, use the converted version from .reroute/markdown/\n\n\t\t\tconst buildSrc = isMarkdown\n\t\t\t\t? join(\n\t\t\t\t\t\tcwd,\n\t\t\t\t\t\t'.reroute',\n\t\t\t\t\t\t'markdown',\n\t\t\t\t\t\tcollection,\n\t\t\t\t\t\t'content',\n\t\t\t\t\t\t`${name}.tsx`,\n\t\t\t\t\t)\n\t\t\t\t: absSrc;\n\n\t\t\t// If targeting a converted markdown module, ensure it exists\n\t\t\tif (isMarkdown) {\n\t\t\t\ttry {\n\t\t\t\t\tconst exists = await Bun.file(buildSrc).exists();\n\t\t\t\t\tif (!exists) {\n\t\t\t\t\t\tconsole.warn(\n\t\t\t\t\t\t\t`[reroute/content] Converted markdown missing, skipping: ${buildSrc}`,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t} catch {}\n\t\t\t}\n\t\t\t// Build to JS once (no minify) for dev reliability\n\t\t\tlet code = '';\n\t\t\ttry {\n\t\t\t\tconst isProd = isProductionMode(args);\n\t\t\t\tconst result = await Bun.build({\n\t\t\t\t\tentrypoints: [buildSrc],\n\t\t\t\t\ttarget: 'browser',\n\t\t\t\t\tformat: 'esm',\n\t\t\t\t\tsplitting: false,\n\t\t\t\t\tsourcemap: isProd ? 'linked' : 'none',\n\t\t\t\t\tminify: isProd,\n\t\t\t\t\tdefine: {\n\t\t\t\t\t\t'process.env.NODE_ENV': isProd ? '\"production\"' : '\"development\"',\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t\tif (!result.success) throw new Error('build failed');\n\t\t\t\tcode = await result.outputs[0].text();\n\t\t\t} catch (e) {\n\t\t\t\tconsole.error(\n\t\t\t\t\t'[reroute/gen] Failed to build content chunk:',\n\t\t\t\t\tabsSrc,\n\t\t\t\t\te,\n\t\t\t\t);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst hash = await sha8(code);\n\t\t\t// Use bundles directory which is already being served\n\t\t\tconst chunkRelDir = join('.reroute', 'bundles');\n\t\t\tconst chunkAbsDir = join(cwd, chunkRelDir);\n\t\t\t// Prefix with collection to avoid name collisions\n\t\t\tconst outFile = `${collection}-${name}.${hash}.js`;\n\t\t\tconst absOut = join(chunkAbsDir, outFile);\n\t\t\ttry {\n\t\t\t\tconst exists = await Bun.file(absOut).exists();\n\t\t\t\tif (!exists) await Bun.write(absOut, code);\n\t\t\t} catch {}\n\n\t\t\t// Meta via source import (not bundled)\n\t\t\tlet meta: Doc = {};\n\t\t\ttry {\n\t\t\t\tconst url = `${pathToFileURL(buildSrc).href}?t=${Date.now()}`;\n\t\t\t\tconst m = await import(url);\n\t\t\t\tmeta = (m as Doc).meta || {};\n\t\t\t} catch {}\n\n\t\t\tresults.push({\n\t\t\t\tcollection,\n\t\t\t\tname,\n\t\t\t\tslug: name,\n\t\t\t\thref: `/${collection}/${name}`,\n\t\t\t\tmoduleUrl: `/bundles/${outFile}`,\n\t\t\t\tmeta,\n\t\t\t});\n\t\t}\n\t}\n\n\t// Write .reroute/content.ts (types for tooling only)\n\tconst lines: string[] = [];\n\tlines.push('// 🚨 Auto-generated by Reroute - DO NOT EDIT 🚨');\n\tlines.push('/* eslint-disable */');\n\tlines.push('// @ts-nocheck');\n\tlines.push('');\n\tlines.push('export const contents = [');\n\tfor (const e of results) {\n\t\tlines.push(\n\t\t\t\" { collection: '\" +\n\t\t\t\te.collection +\n\t\t\t\t\"', slug: '\" +\n\t\t\t\te.slug +\n\t\t\t\t\"', name: '\" +\n\t\t\t\te.name +\n\t\t\t\t\"', href: '\" +\n\t\t\t\te.href +\n\t\t\t\t\"', module: '\" +\n\t\t\t\te.moduleUrl +\n\t\t\t\t\"', meta: \" +\n\t\t\t\tJSON.stringify(e.meta || {}) +\n\t\t\t\t' },',\n\t\t);\n\t}\n\tlines.push('] as const;');\n\tlines.push('');\n\tlines.push('export const byCollection: Record<string, any[]> = {};');\n\tlines.push(\n\t\t'for (const c of contents) { (byCollection[c.collection] ||= []).push(c as any); }',\n\t);\n\tlines.push('');\n\tlines.push(\n\t\t'export const byCollectionAndName: Record<string, Record<string, any>> = {};',\n\t);\n\tlines.push(\n\t\t'for (const c of contents) { ((byCollectionAndName[c.collection] ||= {})[c.name] = c as any); }',\n\t);\n\tlines.push('');\n\tlines.push('export type Collections = keyof typeof byCollection;');\n\tlines.push(\n\t\t'export type Names<C extends Collections> = keyof (typeof byCollectionAndName)[C];',\n\t);\n\tlines.push('export type ContentEntry = (typeof contents)[number];');\n\tlines.push('');\n\tlines.push(\n\t\t'export function getContentEntry<C extends string, N extends string>(collection: C, name: N) {',\n\t);\n\tlines.push(' const m = (byCollectionAndName as any)[collection];');\n\tlines.push(' return m ? (m as Record<string, any>)[name] : undefined;');\n\tlines.push('}');\n\tlines.push('');\n\n\tawait Bun.write(join(cwd, OUTPUT_CONTENT_TS), lines.join('\\n'));\n\tconsole.log(`[reroute/content] wrote ${join(cwd, OUTPUT_CONTENT_TS)}`);\n\n\t// Write per-collection runtime ESM files under .reroute/collections/<collection>.js\n\tconst collectionsSet = new Set(results.map((r) => r.collection));\n\tfor (const collection of collectionsSet) {\n\t\tconst items = results.filter((r) => r.collection === collection);\n\t\tconst js: string[] = [];\n\t\tjs.push('// 🚨 Auto-generated by Reroute - DO NOT EDIT 🚨');\n\t\tjs.push('');\n\t\tjs.push('export const items = [');\n\t\tfor (const e of items) {\n\t\t\tjs.push(\n\t\t\t\t` { collection: '${e.collection}', slug: '${e.slug}', name: '${e.name}', href: '${e.href}', module: '${e.moduleUrl}', meta: ${JSON.stringify(e.meta || {})} },`,\n\t\t\t);\n\t\t}\n\t\tjs.push('];');\n\t\tjs.push('');\n\t\tjs.push('export const byName = {};');\n\t\tjs.push('for (const it of items) { byName[it.name] = it; }');\n\t\tjs.push('');\n\t\tjs.push('export function get(collectionName, name) {');\n\t\tjs.push(` if (collectionName !== '${collection}') return undefined;`);\n\t\tjs.push(' return byName[name];');\n\t\tjs.push('}');\n\t\tjs.push('');\n\n\t\tawait Bun.write(\n\t\t\tjoin(cwd, OUTPUT_COLLECTIONS_DIR, `${collection}.js`),\n\t\t\tjs.join('\\n'),\n\t\t);\n\t\tconsole.log(\n\t\t\t`[reroute/content] wrote ${join(cwd, OUTPUT_COLLECTIONS_DIR, `${collection}.js`)}`,\n\t\t);\n\t}\n}\n\nasync function preprocessMarkdownFiles(cwd: string): Promise<void> {\n\tconsole.log('[reroute/markdown] Starting markdown preprocessing...');\n\tconst routesPath = join(cwd, ROUTES_DIR);\n\tconst markdownDir = join(cwd, '.reroute', 'markdown');\n\n\t// Clean up previous markdown conversions\n\ttry {\n\t\tawait rm(markdownDir, { force: true, recursive: true });\n\t} catch {}\n\n\t// Check configuration but continue regardless (we will fallback if needed)\n\tconst markdownConfig = getMarkdownConfig(cwd);\n\tconsole.log('[reroute/markdown] Config:', markdownConfig);\n\n\t// Bun.write creates directories automatically, no need for mkdir\n\n\t// Scan for markdown files (including in content directories)\n\tasync function scanMarkdown(dir: string, base = ''): Promise<string[]> {\n\t\tconst files: string[] = [];\n\t\ttry {\n\t\t\tconst entries = await readdir(dir, { withFileTypes: true });\n\n\t\t\tfor (const entry of entries) {\n\t\t\t\tconst fullPath = join(dir, entry.name);\n\t\t\t\tconst relativePath = join(base, entry.name);\n\n\t\t\t\tif (entry.isDirectory()) {\n\t\t\t\t\t// Process content directories too\n\t\t\t\t\tconst nested = await scanMarkdown(fullPath, relativePath);\n\t\t\t\t\tfiles.push(...nested);\n\t\t\t\t} else if (entry.isFile() && isMarkdownFile(entry.name)) {\n\t\t\t\t\tfiles.push(relativePath);\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (err) {\n\t\t\tconsole.error(`[reroute/markdown] Error scanning ${dir}:`, err);\n\t\t}\n\n\t\treturn files;\n\t}\n\n\tconsole.log(\n\t\t`[reroute/markdown] Scanning ${routesPath} for markdown files...`,\n\t);\n\tconst markdownFiles = await scanMarkdown(routesPath);\n\tconsole.log(\n\t\t`[reroute/markdown] Scan complete. Found files:`,\n\t\tmarkdownFiles.length,\n\t);\n\n\tif (markdownFiles.length === 0) {\n\t\tconsole.log(\n\t\t\t'[reroute/markdown] No markdown files found, skipping preprocessing',\n\t\t);\n\t\treturn;\n\t}\n\n\tconsole.log(\n\t\t`[reroute/markdown] Found ${markdownFiles.length} markdown file(s)`,\n\t);\n\n\t// Bun.write creates directories automatically\n\n\t// Process each markdown file\n\tfor (const file of markdownFiles) {\n\t\tconst sourcePath = join(routesPath, file);\n\t\tconst targetPath = join(markdownDir, file.replace(/\\.mdx?$/, '.tsx'));\n\n\t\ttry {\n\t\t\tconst processed = processMarkdownFile(sourcePath);\n\t\t\tconst isMdx = file.endsWith('.mdx');\n\n\t\t\tlet moduleCode: string;\n\t\t\tif (markdownConfig.isConfigured) {\n\t\t\t\tmoduleCode = await generateMarkdownModule(processed, cwd, {\n\t\t\t\t\tenableGfm: markdownConfig.hasRemarkGfm,\n\t\t\t\t\ttheme: 'github-dark',\n\t\t\t\t\tisMdx,\n\t\t\t\t\tfilename: file,\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tmoduleCode = generatePlainMarkdownModule(processed);\n\t\t\t}\n\n\t\t\t// Bun.write creates parent directories automatically\n\t\t\tawait Bun.write(targetPath, moduleCode);\n\t\t} catch (error) {\n\t\t\tconsole.error(`[reroute/markdown] Failed to process ${file}:`, error);\n\t\t}\n\t}\n}\n\nasync function buildEntrypointBundle(cwd: string, args: string[] = []) {\n\tconst clientDir = join(cwd, 'src', 'client');\n\tconst entrypoint = join(clientDir, 'index.tsx');\n\n\t// Check if entrypoint exists\n\tconst exists = await Bun.file(entrypoint).exists();\n\tif (!exists) {\n\t\tconsole.log('[reroute/gen] No index.tsx found, skipping bundle build');\n\t\treturn;\n\t}\n\n\tconsole.log(\n\t\t'[reroute/gen] Building entrypoint bundle with code splitting...',\n\t);\n\n\tconst isProd = isProductionMode(args);\n\tconst result = await Bun.build({\n\t\tentrypoints: [entrypoint],\n\t\ttarget: 'browser',\n\t\tformat: 'esm',\n\t\tsplitting: true,\n\t\tsourcemap: isProd ? 'linked' : 'external',\n\t\tminify: isProd,\n\t\t// Ensure content-based hashing for cache busting\n\t\tnaming: {\n\t\t\tentry: '[name].[hash].[ext]',\n\t\t\tchunk: 'chunk.[hash].[ext]',\n\t\t\tasset: '[name].[hash].[ext]',\n\t\t},\n\t\tjsx: {\n\t\t\truntime: 'automatic',\n\t\t\timportSource: 'react',\n\t\t\tdevelopment: !isProd,\n\t\t},\n\t\tdefine: {\n\t\t\t'process.env.NODE_ENV': isProd ? '\"production\"' : '\"development\"',\n\t\t\t__DEV__: isProd ? 'false' : 'true',\n\t\t\t'import.meta.env.MODE': isProd ? '\"production\"' : '\"development\"',\n\t\t},\n\t\t...(isProd ? { drop: ['console', 'debugger'] } : {}),\n\t});\n\n\tif (!result.success) {\n\t\tconsole.error('[reroute/gen] Entrypoint build failed:');\n\t\tfor (const log of result.logs) console.error(log);\n\t\tthrow new Error('Failed to build entrypoint');\n\t}\n\n\t// Write all outputs to .reroute/bundles/\n\tconst bundlesDir = join(cwd, '.reroute', 'bundles');\n\n\t// Clean up old bundle files to prevent stale bundles from being served\n\ttry {\n\t\tconst existingFiles = await readdir(bundlesDir);\n\t\tfor (const file of existingFiles) {\n\t\t\t// Remove old index.*.js, chunk.*.js files and their sourcemaps\n\t\t\tif (/^(index|chunk)\\.[a-z0-9]+\\.(js|js\\.map)$/i.test(file)) {\n\t\t\t\tawait rm(join(bundlesDir, file), { force: true });\n\t\t\t}\n\t\t}\n\t} catch {\n\t\t// Directory might not exist yet, that's fine\n\t}\n\n\t// Bun.write creates parent directories automatically\n\n\tconst outputs: { fileName: string; size: number; isEntry: boolean }[] = [];\n\tlet entryFile = '';\n\n\tfor (const output of result.outputs) {\n\t\tconst content = await output.text();\n\t\tconst fileName =\n\t\t\toutput.path.split('/').pop() ||\n\t\t\toutput.path.split('\\\\').pop() ||\n\t\t\t'unknown';\n\t\tconst destPath = join(bundlesDir, fileName);\n\n\t\tawait Bun.write(destPath, content);\n\n\t\tconst isEntry =\n\t\t\tfileName.startsWith('index.') &&\n\t\t\tfileName.endsWith('.js') &&\n\t\t\t!fileName.endsWith('.map');\n\t\tif (isEntry) entryFile = fileName;\n\n\t\toutputs.push({\n\t\t\tfileName,\n\t\t\tsize: content.length,\n\t\t\tisEntry,\n\t\t});\n\t}\n\n\t// No manifest needed - bundle URL is found by scanning directory\n\n\tconst totalSize = outputs.reduce((sum, o) => sum + o.size, 0);\n\tconst gzipped = Bun.gzipSync(\n\t\tnew TextEncoder().encode(\n\t\t\toutputs.find((o) => o.isEntry)?.fileName\n\t\t\t\t? await Bun.file(join(bundlesDir, entryFile)).text()\n\t\t\t\t: '',\n\t\t),\n\t).length;\n\n\tconsole.log(\n\t\t`[reroute/gen] Built ${outputs.length} files (${(totalSize / 1024).toFixed(2)}KB, ${(gzipped / 1024).toFixed(2)}KB gzipped)`,\n\t);\n\tconsole.log(`[reroute/gen] Entry: ${entryFile}`);\n\tconsole.log(\n\t\t`[reroute/gen] Chunks: ${outputs.filter((o) => !o.isEntry && o.fileName.endsWith('.js')).length}`,\n\t);\n}\n\nasync function generate(cwd: string, args: string[] = []) {\n\tconst startTime = performance.now();\n\tconsole.log('[reroute/gen] Starting generation...');\n\n\t// Ensure output directory exists and cleanup if needed\n\tawait ensureOutputDir(cwd);\n\n\t// Write minimal stub files first so server can start immediately\n\t// This replaces the old \"boot\" functionality but happens inline\n\tawait writeStubFiles(cwd);\n\n\t// Preprocess markdown files before route generation\n\tawait preprocessMarkdownFiles(cwd);\n\n\t// Routes\n\tconst routesPath = join(cwd, ROUTES_DIR);\n\ttry {\n\t\tconst files = await scanDirectory(routesPath);\n\t\tconst nfFiles = await scan404Files(routesPath);\n\t\tconst all = Array.from(new Set([...files, ...nfFiles]));\n\n\t\t// Keep markdown routes; preprocess will generate fallback modules\n\t\tconst tree = generateRouteTree(all.map((f) => f.replace(/\\\\/g, '/')));\n\t\tconst ts = generateTypeScript(tree);\n\t\tawait Bun.write(join(cwd, OUTPUT_ROUTES), ts);\n\t\tconsole.log(`[reroute/gen] Generated routes: ${join(cwd, OUTPUT_ROUTES)}`);\n\t} catch (error) {\n\t\tconsole.error('[reroute/gen] Failed to generate routes:', error);\n\t\tthrow error;\n\t}\n\n\t// Content\n\ttry {\n\t\tawait buildContentChunks(cwd, args);\n\t\tconsole.log(\n\t\t\t`[reroute/gen] Generated content: ${join(cwd, OUTPUT_CONTENT_TS)} + collections/*.js`,\n\t\t);\n\t} catch (error) {\n\t\tconsole.error('[reroute/gen] Failed to generate content:', error);\n\t\tthrow error;\n\t}\n\n\t// Write .reroute/index.ts aggregator (before bundle build so it can be imported)\n\tconst indexLines: string[] = [];\n\tindexLines.push('// 🚨 Auto-generated by Reroute - DO NOT EDIT 🚨');\n\tindexLines.push('/* eslint-disable */');\n\tindexLines.push('// @ts-nocheck');\n\tindexLines.push('');\n\tindexLines.push(\n\t\t\"import { layouts, matchRoute, notFoundRoutes } from './routes';\",\n\t);\n\tindexLines.push('');\n\tindexLines.push('export const artifacts = {');\n\tindexLines.push(' layouts,');\n\tindexLines.push(' matchRoute,');\n\tindexLines.push(' notFoundRoutes,');\n\tindexLines.push(\" contentBaseUrl: '/.reroute/collections'\");\n\tindexLines.push('} as const;');\n\tindexLines.push('');\n\tindexLines.push('export type RerouteArtifacts = typeof artifacts;');\n\n\tawait Bun.write(join(cwd, OUTPUT_INDEX), indexLines.join('\\n'));\n\n\tconsole.log(`[reroute/gen] Generated index: ${join(cwd, OUTPUT_INDEX)}`);\n\n\t// Build main entrypoint bundle with code splitting\n\ttry {\n\t\tawait buildEntrypointBundle(cwd, args);\n\t} catch (error) {\n\t\tconsole.error('[reroute/gen] Failed to build entrypoint:', error);\n\t\tthrow error;\n\t}\n\n\tconst endTime = performance.now();\n\tconst duration = ((endTime - startTime) / 1000).toFixed(2);\n\tconsole.log(`[reroute/gen] Generation complete in ${duration}s`);\n}\n\nexport default async function gen(args: string[]) {\n\tconst cwd = process.cwd();\n\tconst watchMode = args.includes('--watch') || args.includes('-w');\n\tconst isProd = isProductionMode(args);\n\n\tif (!watchMode) {\n\t\tawait generate(cwd, args);\n\t\tawait buildTailwindIfConfigured(cwd, isProd);\n\t\tcheckMarkdownIfConfigured(cwd);\n\t\treturn;\n\t}\n\n\tconsole.log('[reroute/gen] Watch mode enabled');\n\tconsole.log('[reroute/gen] Initial generation...');\n\tawait generate(cwd, args);\n\n\ttry {\n\t\tawait buildTailwindIfConfigured(cwd, isProd);\n\t\tcheckMarkdownIfConfigured(cwd);\n\t} catch {}\n\n\t// Helper: notify server to reload connected browsers (best-effort)\n\tconst notifyReload = async (reason: string) => {\n\t\tconst ports = [\n\t\t\tNumber(process.env.PORT || '0') || 0,\n\t\t\tNumber(process.env.REROUTE_PORT || '0') || 0,\n\t\t\t3001,\n\t\t\t3000,\n\t\t].filter(Boolean) as number[];\n\t\tfor (const p of ports) {\n\t\t\ttry {\n\t\t\t\tawait fetch(`http://localhost:${p}/__reroute_reload`, {\n\t\t\t\t\tmethod: 'POST',\n\t\t\t\t});\n\t\t\t\tconsole.log(\n\t\t\t\t\t`[reroute/gen] reload notified (port ${p})${reason ? `: ${reason}` : ''}`,\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t\t} catch {}\n\t\t}\n\t};\n\n\t// Notify server after initial generation to clear caches and rebuild with fresh routes\n\tawait notifyReload('initial generation');\n\n\t// Watch routes for generation + Tailwind rebuild\n\tconst routesPath = join(cwd, ROUTES_DIR);\n\tconsole.log(`[reroute/gen] Watching ${routesPath} for changes...`);\n\tlet debounce: NodeJS.Timeout | null = null;\n\tconst routesWatcher = watch(\n\t\troutesPath,\n\t\t{ recursive: true },\n\t\t(_ev, filename) => {\n\t\t\tif (!filename) return;\n\t\t\tif (debounce) clearTimeout(debounce);\n\t\t\tdebounce = setTimeout(async () => {\n\t\t\t\tconsole.log('[reroute/gen] Change detected, regenerating...');\n\t\t\t\ttry {\n\t\t\t\t\tawait generate(cwd, args);\n\t\t\t\t\tawait buildTailwindIfConfigured(cwd, isProd);\n\t\t\t\t\tawait notifyReload('routes change');\n\t\t\t\t} catch (e) {\n\t\t\t\t\tconsole.error('[reroute/gen] Error during regeneration:', e);\n\t\t\t\t}\n\t\t\t}, 50);\n\t\t},\n\t);\n\n\t// Watch src/client for bundle rebuild + Tailwind changes\n\tconst clientPath = join(cwd, 'src', 'client');\n\tconsole.log(`[reroute/gen] Watching ${clientPath} for changes...`);\n\tlet twDebounce: NodeJS.Timeout | null = null;\n\tconst twWatcher = watch(clientPath, { recursive: true }, (_ev, filename) => {\n\t\tif (!filename) return;\n\t\tconst name = String(filename);\n\t\tif (name.includes('.reroute') || name.includes('node_modules')) return;\n\t\tif (name.includes('routes/') || name.includes('routes\\\\')) return;\n\t\tif (!/\\.(tsx|ts|jsx|js|html|md|mdx|css)$/.test(name)) return;\n\t\tif (twDebounce) clearTimeout(twDebounce);\n\t\ttwDebounce = setTimeout(async () => {\n\t\t\ttry {\n\t\t\t\t// Rebuild bundle if index.tsx changed or any component it imports\n\t\t\t\tif (\n\t\t\t\t\tname === 'index.tsx' ||\n\t\t\t\t\tname.includes('components/') ||\n\t\t\t\t\tname.includes('hooks/') ||\n\t\t\t\t\tname.includes('providers/')\n\t\t\t\t) {\n\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t'[reroute/gen] Client code changed, rebuilding bundle...',\n\t\t\t\t\t);\n\t\t\t\t\tawait buildEntrypointBundle(cwd, args);\n\t\t\t\t}\n\t\t\t\tawait buildTailwindIfConfigured(cwd, isProd);\n\t\t\t\tawait notifyReload('client change');\n\t\t\t} catch {}\n\t\t}, 100);\n\t});\n\n\t// Keep process running until SIGINT\n\tprocess.on('SIGINT', () => {\n\t\tconsole.log('\\n[reroute/gen] Stopping watch mode...');\n\t\ttry {\n\t\t\troutesWatcher.close();\n\t\t} catch {}\n\t\ttry {\n\t\t\ttwWatcher.close();\n\t\t} catch {}\n\t\tprocess.exit(0);\n\t});\n}\n",
|
|
12
|
-
"/**\n * Log colorization utilities\n *\n * Provides colorization for log prefixes in both blessed (TUI) and ANSI (console) formats.\n * Consumers can use [api] and [app] prefixes to differentiate their application logs.\n */\n\n/**\n * Map of prefix patterns to blessed color tags\n * Each prefix has a unique color for easy visual distinction\n */\nconst PREFIX_COLORS: Record<string, string> = {\n\t'[reroute]': '{cyan-fg}', // Base reroute logs - cyan\n\t'[reroute/gen]': '{bright-blue-fg}', // Generator - bright blue\n\t'[reroute/content]': '{magenta-fg}', // Content - magenta\n\t'[reroute/markdown]': '{yellow-fg}', // Markdown - yellow\n\t'[reroute/tailwind]': '{red-fg}', // Tailwind - red\n\t'[reroute/mdx]': '{bright-red-fg}', // MDX - bright red\n\t'[reroute/dev]': '{green-fg}', // Dev command - green\n\t'[reroute/start]': '{bright-cyan-fg}', // Start command - bright cyan\n\t'[reroute/build]': '{bright-magenta-fg}', // Build command - bright magenta\n\t'[reroute/analyze]': '{bright-green-fg}', // Analyze command - bright green\n\t'[api]': '{blue-fg}', // API logs - blue\n\t'[app]': '{bright-green-fg}', // App logs - bright green\n};\n\n/**\n * Colorize log prefixes using blessed color tags (for TUI output)\n *\n * @param text - The log text to colorize\n * @returns Text with colorized prefixes using blessed tags\n */\nexport function colorizeLogPrefix(text: string): string {\n\tlet colored = text;\n\t// Sort prefixes by length (longest first) to match more specific prefixes before general ones\n\t// e.g., [reroute/markdown] should match before [reroute]\n\tconst sortedPrefixes = Object.entries(PREFIX_COLORS).sort(\n\t\t([a], [b]) => b.length - a.length,\n\t);\n\n\tfor (const [prefix, colorTag] of sortedPrefixes) {\n\t\t// Replace prefix with colored version\n\t\tcolored = colored.replace(\n\t\t\tnew RegExp(`(${prefix.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')})`, 'g'),\n\t\t\t`${colorTag}$1{/}`,\n\t\t);\n\t}\n\n\treturn colored;\n}\n\n/**\n * Convert blessed color tags to ANSI escape codes (for console output)\n *\n * @param text - Text with blessed color tags\n * @returns Text with ANSI escape codes\n */\nexport function blessedToAnsi(text: string): string {\n\treturn (\n\t\ttext\n\t\t\t// Standard colors\n\t\t\t.replace(/\\{cyan-fg\\}/g, '\\x1b[36m')\n\t\t\t.replace(/\\{blue-fg\\}/g, '\\x1b[34m')\n\t\t\t.replace(/\\{magenta-fg\\}/g, '\\x1b[35m')\n\t\t\t.replace(/\\{yellow-fg\\}/g, '\\x1b[33m')\n\t\t\t.replace(/\\{green-fg\\}/g, '\\x1b[32m')\n\t\t\t.replace(/\\{red-fg\\}/g, '\\x1b[31m')\n\t\t\t// Bright colors\n\t\t\t.replace(/\\{bright-cyan-fg\\}/g, '\\x1b[96m')\n\t\t\t.replace(/\\{bright-blue-fg\\}/g, '\\x1b[94m')\n\t\t\t.replace(/\\{bright-magenta-fg\\}/g, '\\x1b[95m')\n\t\t\t.replace(/\\{bright-yellow-fg\\}/g, '\\x1b[93m')\n\t\t\t.replace(/\\{bright-green-fg\\}/g, '\\x1b[92m')\n\t\t\t.replace(/\\{bright-red-fg\\}/g, '\\x1b[91m')\n\t\t\t.replace(/\\{\\/\\}/g, '\\x1b[0m')\n\t);\n}\n\n/**\n * Colorize log prefixes and convert to ANSI codes (for console output)\n *\n * @param text - The log text to colorize\n * @returns Text with colorized prefixes using ANSI escape codes\n */\nexport function colorizeLogPrefixAnsi(text: string): string {\n\treturn blessedToAnsi(colorizeLogPrefix(text));\n}\n\n/**\n * Create a handler function for server output that colorizes logs\n *\n * @param buffer - Reference to a buffer string for incomplete lines\n * @returns Handler function for Buffer data\n */\nexport function createServerOutputHandler(buffer: { current: string }) {\n\treturn (data: Buffer) => {\n\t\tconst text = buffer.current + data.toString();\n\t\tconst lines = text.split('\\n');\n\t\tbuffer.current = lines.pop() || ''; // Keep last incomplete line\n\n\t\tfor (const line of lines) {\n\t\t\t// Skip empty lines\n\t\t\tconst trimmedLine = line.trim();\n\t\t\tif (!trimmedLine) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Colorize the line (preserves existing prefixes or leaves unprefixed lines as-is)\n\t\t\tconst ansiColored = colorizeLogPrefixAnsi(line);\n\t\t\tconsole.log(ansiColored);\n\t\t}\n\t};\n}\n",
|
|
13
|
-
"/**\n * Server utilities for waiting and polling\n */\n\n/**\n * Poll server health endpoint until it responds successfully\n * This ensures the server is fully initialized before declaring it ready\n */\nexport async function waitForServerReady(\n\tport = 3000,\n\ttimeout = 10000,\n): Promise<void> {\n\tconst startTime = Date.now();\n\tconst checkInterval = 200; // Check every 200ms\n\n\twhile (Date.now() - startTime < timeout) {\n\t\ttry {\n\t\t\tconst response = await fetch(`http://localhost:${port}/`, {\n\t\t\t\tmethod: 'GET',\n\t\t\t});\n\t\t\t// Accept both success and 404 (means server is responding)\n\t\t\tif (response.status < 500) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t} catch {\n\t\t\t// Server not ready yet, continue polling\n\t\t}\n\t\tawait new Promise((resolve) => setTimeout(resolve, checkInterval));\n\t}\n\n\tthrow new Error(`Timeout waiting for server to respond after ${timeout}ms`);\n}\n",
|
|
14
|
-
"/**\n * Dev command - Start development environment\n *\n * This command runs:\n * 1. `reroute gen --watch` and `bun --watch src/index.ts` in parallel with side-by-side logs\n */\n\nimport { spawn } from 'node:child_process';\nimport { existsSync } from 'node:fs';\nimport { join } from 'node:path';\nimport {\n\tcolorizeLogPrefix,\n\tcolorizeLogPrefixAnsi,\n\tcreateServerOutputHandler,\n} from '../libs/log';\nimport { waitForServerReady } from '../libs/server';\n\n/**\n * Poll for required files to exist before starting the server\n * This ensures the server doesn't crash with \"Cannot find module\" or \"Bundle not found\" errors\n */\nasync function waitForRequiredFiles(\n\tcwd: string,\n\ttimeout = 30000,\n): Promise<void> {\n\tconst requiredFiles = [\n\t\tjoin(cwd, '.reroute/routes.ts'),\n\t\tjoin(cwd, '.reroute/content.ts'),\n\t\tjoin(cwd, '.reroute/index.ts'),\n\t];\n\n\tconst bundlesDir = join(cwd, '.reroute/bundles');\n\n\tconst startTime = Date.now();\n\tconst checkInterval = 100; // Check every 100ms\n\n\twhile (Date.now() - startTime < timeout) {\n\t\t// Check if all required files exist\n\t\tconst allFilesExist = requiredFiles.every((file) => existsSync(file));\n\n\t\tif (!allFilesExist) {\n\t\t\tawait new Promise((resolve) => setTimeout(resolve, checkInterval));\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Check if bundles directory exists and has the main index bundle\n\t\tif (existsSync(bundlesDir)) {\n\t\t\tconst { readdirSync, statSync } = require('node:fs');\n\t\t\ttry {\n\t\t\t\tconst files = readdirSync(bundlesDir);\n\t\t\t\t// Look for index.*.js file (the main entry bundle)\n\t\t\t\tconst indexBundleFile = files.find((f: string) => {\n\t\t\t\t\tif (\n\t\t\t\t\t\t!f.startsWith('index.') ||\n\t\t\t\t\t\t!f.endsWith('.js') ||\n\t\t\t\t\t\tf.endsWith('.map')\n\t\t\t\t\t) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\t// Verify file is not empty and readable\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst filePath = join(bundlesDir, f);\n\t\t\t\t\t\tconst stats = statSync(filePath);\n\t\t\t\t\t\treturn stats.size > 100; // At least 100 bytes (real bundles are much larger)\n\t\t\t\t\t} catch {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tif (indexBundleFile) {\n\t\t\t\t\t// Double-check: wait a tiny bit and verify file size hasn't changed\n\t\t\t\t\t// This ensures the file is fully written and not still being generated\n\t\t\t\t\tconst filePath = join(bundlesDir, indexBundleFile);\n\t\t\t\t\tconst size1 = statSync(filePath).size;\n\t\t\t\t\tawait new Promise((resolve) => setTimeout(resolve, 200));\n\t\t\t\t\tconst size2 = statSync(filePath).size;\n\n\t\t\t\t\tif (size1 === size2 && size2 > 100) {\n\t\t\t\t\t\treturn; // Bundle is stable and ready\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\t// Directory exists but can't read, keep polling\n\t\t\t}\n\t\t}\n\n\t\tawait new Promise((resolve) => setTimeout(resolve, checkInterval));\n\t}\n\n\tthrow new Error(\n\t\t`Timeout waiting for required files to be created after ${timeout}ms`,\n\t);\n}\n\nfunction getRerouteCommand(): string {\n\t// Check if we're running from source (development mode)\n\t// Look for bin.ts in the expected location relative to this file\n\tconst binPath = join(import.meta.dir, '..', '..', 'bin.ts');\n\tconst isBunDev = existsSync(binPath);\n\n\tif (isBunDev) {\n\t\t// Running via bun during development from source\n\t\treturn `bun ${binPath}`;\n\t}\n\n\t// Check for reroute binary in node_modules/.bin, checking up to 3 levels up\n\tconst cwd = process.cwd();\n\tconst nodeModulesPaths = [\n\t\tjoin(cwd, 'node_modules', '.bin', 'reroute'),\n\t\tjoin(cwd, '..', 'node_modules', '.bin', 'reroute'),\n\t\tjoin(cwd, '..', '..', 'node_modules', '.bin', 'reroute'),\n\t\tjoin(cwd, '..', '..', '..', 'node_modules', '.bin', 'reroute'),\n\t];\n\n\tfor (const binPath of nodeModulesPaths) {\n\t\tif (existsSync(binPath)) {\n\t\t\treturn binPath;\n\t\t}\n\t}\n\n\t// Fallback: assume reroute is installed globally and available in PATH\n\treturn 'reroute';\n}\n\nexport default async function dev(args: string[]) {\n\tconst singleColumn = args.includes('--single') || args.includes('-s');\n\ttry {\n\t\tconsole.log('[reroute/dev] Starting development servers...');\n\t\tconsole.log('[reroute/dev] Press Ctrl+C to stop\\n');\n\n\t\tconst rerouteCmd = getRerouteCommand();\n\n\t\t// Spawn gen process\n\t\t// If rerouteCmd contains spaces (like \"bun packages/cli/bin.ts\"), use shell mode\n\t\t// Otherwise, it's either an absolute path or 'reroute' command\n\t\tconst useShell = rerouteCmd.includes(' ');\n\t\tconst genCommand = useShell ? `${rerouteCmd} gen --watch` : rerouteCmd;\n\t\tconst genArgs = useShell ? [] : ['gen', '--watch'];\n\n\t\tconst genProcess = spawn(genCommand, genArgs, {\n\t\t\tstdio: ['ignore', 'pipe', 'pipe'],\n\t\t\tshell: useShell,\n\t\t});\n\n\t\t// Wait for required files (stubs + bundle) to be created before starting server\n\t\t// This ensures the server doesn't crash with \"Cannot find module\" or \"Bundle not found\" errors\n\t\tconsole.log('[reroute/dev] Generating bundle...');\n\t\ttry {\n\t\t\tawait waitForRequiredFiles(process.cwd());\n\t\t} catch (error) {\n\t\t\tconsole.error('[reroute/dev] Failed to initialize:', error);\n\t\t\tgenProcess.kill();\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\t// Spawn server process\n\t\tconst serverProcess = spawn('bun', ['--watch', 'src/index.ts'], {\n\t\t\tstdio: ['ignore', 'pipe', 'pipe'],\n\t\t});\n\n\t\t// Wait for server to be ready before declaring success\n\t\tconsole.log('[reroute/dev] Bundle complete, waiting for server...');\n\t\tconst port = Number(process.env.PORT || '3000');\n\t\ttry {\n\t\t\tawait waitForServerReady(port);\n\t\t} catch (error) {\n\t\t\tconsole.error('[reroute/dev] Server failed to start:', error);\n\t\t\tgenProcess.kill();\n\t\t\tserverProcess.kill();\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\tif (singleColumn) {\n\t\t\t// Single column mode - use regular console output with colors\n\t\t\t// Buffer for incomplete lines\n\t\t\tconst genBuffer = { current: '' };\n\t\t\tconst serverBuffer = { current: '' };\n\n\t\t\tconst handleGenOutput = (data: Buffer) => {\n\t\t\t\tconst text = genBuffer.current + data.toString();\n\t\t\t\tconst lines = text.split('\\n');\n\t\t\t\tgenBuffer.current = lines.pop() || ''; // Keep last incomplete line\n\n\t\t\t\tfor (const line of lines) {\n\t\t\t\t\t// Skip empty lines\n\t\t\t\t\tif (!line.trim()) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tconst ansiColored = colorizeLogPrefixAnsi(line);\n\t\t\t\t\tconsole.log(ansiColored);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tconst handleServerOutput = createServerOutputHandler(serverBuffer);\n\n\t\t\tgenProcess.stdout?.on('data', handleGenOutput);\n\t\t\tgenProcess.stderr?.on('data', handleGenOutput);\n\t\t\tserverProcess.stdout?.on('data', handleServerOutput);\n\t\t\tserverProcess.stderr?.on('data', handleServerOutput);\n\n\t\t\tgenProcess.on('exit', (code) => {\n\t\t\t\tconsole.log(`\\n[reroute/gen] Process exited with code ${code}`);\n\t\t\t});\n\n\t\t\tserverProcess.on('exit', (code) => {\n\t\t\t\tconsole.log(`\\n[server] Process exited with code ${code}`);\n\t\t\t});\n\n\t\t\t// Handle Ctrl+C\n\t\t\tprocess.on('SIGINT', () => {\n\t\t\t\tconsole.log('\\n[reroute/dev] Shutting down...');\n\t\t\t\tgenProcess.kill('SIGINT');\n\t\t\t\tserverProcess.kill('SIGINT');\n\t\t\t\tprocess.exit(0);\n\t\t\t});\n\t\t} else {\n\t\t\t// Side-by-side mode - use blessed-contrib\n\t\t\tconst blessed = await import('blessed');\n\t\t\tconst contrib = await import('blessed-contrib');\n\n\t\t\tconst screen = blessed.default.screen({\n\t\t\t\tsmartCSR: true,\n\t\t\t\ttitle: 'reroute dev',\n\t\t\t\tmouse: true, // Enable mouse support for scrolling\n\t\t\t});\n\n\t\t\tconst grid = new contrib.default.grid({\n\t\t\t\trows: 1,\n\t\t\t\tcols: 2,\n\t\t\t\tscreen: screen,\n\t\t\t});\n\n\t\t\t// Create log boxes for each process\n\t\t\tconst genBox = grid.set(0, 0, 1, 1, blessed.default.log, {\n\t\t\t\tlabel: ' reroute gen --watch ',\n\t\t\t\tborder: { type: 'line' },\n\t\t\t\tstyle: {\n\t\t\t\t\tborder: { fg: 'cyan' },\n\t\t\t\t},\n\t\t\t\tscrollable: true,\n\t\t\t\talwaysScroll: true,\n\t\t\t\tscrollbar: {\n\t\t\t\t\tch: ' ',\n\t\t\t\t\tinverse: true,\n\t\t\t\t},\n\t\t\t\ttags: true, // Enable color tags\n\t\t\t\tkeys: true, // Enable key bindings\n\t\t\t\tvi: true, // Enable vi keys\n\t\t\t\tmouse: true, // Enable mouse support\n\t\t\t\tinput: true, // Allow input focus for text selection\n\t\t\t\tclickable: true, // Make boxes clickable\n\t\t\t});\n\n\t\t\tconst serverBox = grid.set(0, 1, 1, 1, blessed.default.log, {\n\t\t\t\tlabel: ' bun --watch src/index.ts ',\n\t\t\t\tborder: { type: 'line' },\n\t\t\t\tstyle: {\n\t\t\t\t\tborder: { fg: 'green' },\n\t\t\t\t},\n\t\t\t\tscrollable: true,\n\t\t\t\talwaysScroll: true,\n\t\t\t\tscrollbar: {\n\t\t\t\t\tch: ' ',\n\t\t\t\t\tinverse: true,\n\t\t\t\t},\n\t\t\t\ttags: true, // Enable color tags\n\t\t\t\tkeys: true, // Enable key bindings\n\t\t\t\tvi: true, // Enable vi keys\n\t\t\t\tmouse: true, // Enable mouse support\n\t\t\t\tinput: true, // Allow input focus for text selection\n\t\t\t\tclickable: true, // Make boxes clickable\n\t\t\t});\n\n\t\t\t// Add scrolling key bindings for genBox\n\t\t\tgenBox.key(['up', 'k'], () => {\n\t\t\t\tgenBox.scroll(-1);\n\t\t\t\tscreen.render();\n\t\t\t});\n\n\t\t\tgenBox.key(['down', 'j'], () => {\n\t\t\t\tgenBox.scroll(1);\n\t\t\t\tscreen.render();\n\t\t\t});\n\n\t\t\tgenBox.key(['pageup'], () => {\n\t\t\t\tgenBox.scroll(-genBox.height);\n\t\t\t\tscreen.render();\n\t\t\t});\n\n\t\t\tgenBox.key(['pagedown'], () => {\n\t\t\t\tgenBox.scroll(genBox.height);\n\t\t\t\tscreen.render();\n\t\t\t});\n\n\t\t\tgenBox.key(['home', 'g'], () => {\n\t\t\t\tgenBox.setScrollPerc(0);\n\t\t\t\tscreen.render();\n\t\t\t});\n\n\t\t\tgenBox.key(['end', 'G'], () => {\n\t\t\t\tgenBox.setScrollPerc(100);\n\t\t\t\tscreen.render();\n\t\t\t});\n\n\t\t\t// Add scrolling key bindings for serverBox\n\t\t\tserverBox.key(['up', 'k'], () => {\n\t\t\t\tserverBox.scroll(-1);\n\t\t\t\tscreen.render();\n\t\t\t});\n\n\t\t\tserverBox.key(['down', 'j'], () => {\n\t\t\t\tserverBox.scroll(1);\n\t\t\t\tscreen.render();\n\t\t\t});\n\n\t\t\tserverBox.key(['pageup'], () => {\n\t\t\t\tserverBox.scroll(-serverBox.height);\n\t\t\t\tscreen.render();\n\t\t\t});\n\n\t\t\tserverBox.key(['pagedown'], () => {\n\t\t\t\tserverBox.scroll(serverBox.height);\n\t\t\t\tscreen.render();\n\t\t\t});\n\n\t\t\tserverBox.key(['home', 'g'], () => {\n\t\t\t\tserverBox.setScrollPerc(0);\n\t\t\t\tscreen.render();\n\t\t\t});\n\n\t\t\tserverBox.key(['end', 'G'], () => {\n\t\t\t\tserverBox.setScrollPerc(100);\n\t\t\t\tscreen.render();\n\t\t\t});\n\n\t\t\t// Add mouse wheel support\n\t\t\tgenBox.on('wheeldown', () => {\n\t\t\t\tgenBox.scroll(3);\n\t\t\t\tscreen.render();\n\t\t\t});\n\n\t\t\tgenBox.on('wheelup', () => {\n\t\t\t\tgenBox.scroll(-3);\n\t\t\t\tscreen.render();\n\t\t\t});\n\n\t\t\tserverBox.on('wheeldown', () => {\n\t\t\t\tserverBox.scroll(3);\n\t\t\t\tscreen.render();\n\t\t\t});\n\n\t\t\tserverBox.on('wheelup', () => {\n\t\t\t\tserverBox.scroll(-3);\n\t\t\t\tscreen.render();\n\t\t\t});\n\n\t\t\t// Focus handling - click to focus a box\n\t\t\tgenBox.on('click', () => {\n\t\t\t\tgenBox.focus();\n\t\t\t\tscreen.render();\n\t\t\t});\n\n\t\t\tserverBox.on('click', () => {\n\t\t\t\tserverBox.focus();\n\t\t\t\tscreen.render();\n\t\t\t});\n\n\t\t\t// Tab to switch between boxes\n\t\t\tscreen.key(['tab'], () => {\n\t\t\t\tif (screen.focused === genBox) {\n\t\t\t\t\tserverBox.focus();\n\t\t\t\t} else {\n\t\t\t\t\tgenBox.focus();\n\t\t\t\t}\n\t\t\t\tscreen.render();\n\t\t\t});\n\n\t\t\t// Start with genBox focused\n\t\t\tgenBox.focus();\n\n\t\t\tscreen.render();\n\n\t\t\t// Handle gen output with colorization\n\t\t\tgenProcess.stdout?.on('data', (data: Buffer) => {\n\t\t\t\tconst text = data.toString();\n\t\t\t\t// Filter out empty lines\n\t\t\t\tconst lines = text.split('\\n').filter((line) => line.trim());\n\t\t\t\tif (lines.length > 0) {\n\t\t\t\t\tconst colored = colorizeLogPrefix(lines.join('\\n'));\n\t\t\t\t\tgenBox.log(colored);\n\t\t\t\t\tscreen.render();\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tgenProcess.stderr?.on('data', (data: Buffer) => {\n\t\t\t\tconst text = data.toString();\n\t\t\t\t// Filter out empty lines\n\t\t\t\tconst lines = text.split('\\n').filter((line) => line.trim());\n\t\t\t\tif (lines.length > 0) {\n\t\t\t\t\tconst colored = colorizeLogPrefix(lines.join('\\n'));\n\t\t\t\t\tgenBox.log(colored);\n\t\t\t\t\tscreen.render();\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// Handle server output\n\t\t\tserverProcess.stdout?.on('data', (data: Buffer) => {\n\t\t\t\tconst text = data.toString();\n\t\t\t\t// Filter out empty lines and colorize\n\t\t\t\tconst filteredText = text\n\t\t\t\t\t.split('\\n')\n\t\t\t\t\t.filter((line) => line.trim()) // Filter out empty lines\n\t\t\t\t\t.join('\\n');\n\t\t\t\tif (filteredText) {\n\t\t\t\t\tconst colored = colorizeLogPrefix(filteredText);\n\t\t\t\t\tserverBox.log(colored);\n\t\t\t\t\tscreen.render();\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tserverProcess.stderr?.on('data', (data: Buffer) => {\n\t\t\t\tconst text = data.toString();\n\t\t\t\t// Filter out empty lines and colorize\n\t\t\t\tconst filteredText = text\n\t\t\t\t\t.split('\\n')\n\t\t\t\t\t.filter((line) => line.trim()) // Filter out empty lines\n\t\t\t\t\t.join('\\n');\n\t\t\t\tif (filteredText) {\n\t\t\t\t\tconst colored = colorizeLogPrefix(filteredText);\n\t\t\t\t\tserverBox.log(colored);\n\t\t\t\t\tscreen.render();\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// Handle process exit\n\t\t\tgenProcess.on('exit', (code) => {\n\t\t\t\tgenBox.log(`\\n[Process exited with code ${code}]`);\n\t\t\t\tscreen.render();\n\t\t\t});\n\n\t\t\tserverProcess.on('exit', (code) => {\n\t\t\t\tserverBox.log(`\\n[Process exited with code ${code}]`);\n\t\t\t\tscreen.render();\n\t\t\t});\n\n\t\t\t// Handle Ctrl+C\n\t\t\tscreen.key(['escape', 'q', 'C-c'], () => {\n\t\t\t\tgenProcess.kill('SIGINT');\n\t\t\t\tserverProcess.kill('SIGINT');\n\t\t\t\tscreen.destroy();\n\t\t\t\tprocess.exit(0);\n\t\t\t});\n\n\t\t\t// Handle window resize\n\t\t\tscreen.on('resize', () => {\n\t\t\t\tscreen.render();\n\t\t\t});\n\t\t}\n\t} catch (error) {\n\t\t// Handle Ctrl+C gracefully\n\t\tif ((error as { code?: string }).code === 'SIGINT') {\n\t\t\tconsole.log('\\n[reroute/dev] Shutting down...');\n\t\t\tprocess.exit(0);\n\t\t}\n\t\tconsole.error('[reroute/dev] Error:', error);\n\t\tthrow error;\n\t}\n}\n",
|
|
15
|
-
"/**\n * Start command - Run production-like server\n *\n * This command runs:\n * 1. `reroute gen --prod` (waits for completion, no watch)\n * 2. `bun src/index.ts` (runs the server, no watch)\n */\n\nimport { spawn } from 'node:child_process';\nimport { existsSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { colorizeLogPrefixAnsi, createServerOutputHandler } from '../libs/log';\nimport { waitForServerReady } from '../libs/server';\n\nfunction getRerouteCommand(): string {\n\t// Check if we're running from source (development mode)\n\t// Look for bin.ts in the expected location relative to this file\n\tconst binPath = join(import.meta.dir, '..', '..', 'bin.ts');\n\tconst isBunDev = existsSync(binPath);\n\n\tif (isBunDev) {\n\t\t// Running via bun during development from source\n\t\treturn `bun ${binPath}`;\n\t}\n\n\t// Check for reroute binary in node_modules/.bin, checking up to 3 levels up\n\tconst cwd = process.cwd();\n\tconst nodeModulesPaths = [\n\t\tjoin(cwd, 'node_modules', '.bin', 'reroute'),\n\t\tjoin(cwd, '..', 'node_modules', '.bin', 'reroute'),\n\t\tjoin(cwd, '..', '..', 'node_modules', '.bin', 'reroute'),\n\t\tjoin(cwd, '..', '..', '..', 'node_modules', '.bin', 'reroute'),\n\t];\n\n\tfor (const binPath of nodeModulesPaths) {\n\t\tif (existsSync(binPath)) {\n\t\t\treturn binPath;\n\t\t}\n\t}\n\n\t// Fallback: assume reroute is installed globally and available in PATH\n\treturn 'reroute';\n}\n\nexport default async function start(_args: string[]) {\n\ttry {\n\t\tconst rerouteCmd = getRerouteCommand();\n\t\tconst useShell = rerouteCmd.includes(' ');\n\n\t\t// Buffer for incomplete lines\n\t\tconst genBuffer = { current: '' };\n\n\t\tconst handleGenOutput = (data: Buffer) => {\n\t\t\tconst text = genBuffer.current + data.toString();\n\t\t\tconst lines = text.split('\\n');\n\t\t\tgenBuffer.current = lines.pop() || '';\n\n\t\t\tfor (const line of lines) {\n\t\t\t\t// Skip empty lines\n\t\t\t\tif (!line.trim()) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tconst ansiColored = colorizeLogPrefixAnsi(line);\n\t\t\t\tconsole.log(ansiColored);\n\t\t\t}\n\t\t};\n\n\t\t// Step 1: Run gen (without watch)\n\t\tprocess.stdout.write(\n\t\t\t`${colorizeLogPrefixAnsi('[reroute/start] Running gen...')}\\n`,\n\t\t);\n\t\tconst genCommand = useShell ? `${rerouteCmd} gen --prod` : rerouteCmd;\n\t\tconst genArgs = useShell ? [] : ['gen', '--prod'];\n\n\t\tawait new Promise<void>((resolve, reject) => {\n\t\t\tconst genProcess = spawn(genCommand, genArgs, {\n\t\t\t\tstdio: ['ignore', 'pipe', 'pipe'],\n\t\t\t\tshell: useShell,\n\t\t\t});\n\n\t\t\tgenProcess.stdout?.on('data', handleGenOutput);\n\t\t\tgenProcess.stderr?.on('data', handleGenOutput);\n\n\t\t\tgenProcess.on('exit', (code) => {\n\t\t\t\tif (code !== null && code !== 0) {\n\t\t\t\t\treject(new Error(`Gen exited with code ${code}`));\n\t\t\t\t} else {\n\t\t\t\t\tresolve();\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tgenProcess.on('error', (error) => {\n\t\t\t\treject(error);\n\t\t\t});\n\t\t});\n\t\tprocess.stdout.write(\n\t\t\tcolorizeLogPrefixAnsi('[reroute/start] Generation complete\\n'),\n\t\t);\n\n\t\t// Step 2: Run the server\n\t\tprocess.stdout.write(\n\t\t\t`${colorizeLogPrefixAnsi('[reroute/start] Starting server...')}\\n`,\n\t\t);\n\n\t\tconst serverProcess = spawn('bun', ['src/index.ts'], {\n\t\t\tstdio: ['ignore', 'pipe', 'pipe'],\n\t\t});\n\n\t\t// Buffer for incomplete lines\n\t\tconst serverBuffer = { current: '' };\n\t\tconst handleServerOutput = createServerOutputHandler(serverBuffer);\n\n\t\tserverProcess.stdout?.on('data', handleServerOutput);\n\t\tserverProcess.stderr?.on('data', handleServerOutput);\n\n\t\t// Wait for server to be ready by polling the health endpoint\n\t\tprocess.stdout.write(\n\t\t\tcolorizeLogPrefixAnsi(\n\t\t\t\t'[reroute/start] Waiting for server to be ready...\\n',\n\t\t\t),\n\t\t);\n\n\t\tconst port = Number(process.env.PORT || '3000');\n\t\ttry {\n\t\t\tawait waitForServerReady(port, 10000);\n\t\t\tprocess.stdout.write(\n\t\t\t\tcolorizeLogPrefixAnsi('[reroute/start] Server is ready!\\n'),\n\t\t\t);\n\t\t} catch {\n\t\t\tprocess.stdout.write(\n\t\t\t\tcolorizeLogPrefixAnsi(\n\t\t\t\t\t'[reroute/start] 🚨Warning: Server may not be fully ready yet\\n',\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\n\t\tprocess.stdout.write(\n\t\t\tcolorizeLogPrefixAnsi('[reroute/start] Press Ctrl+C to stop\\n'),\n\t\t);\n\n\t\t// Handle Ctrl+C\n\t\tprocess.on('SIGINT', () => {\n\t\t\tprocess.stdout.write(\n\t\t\t\t`${colorizeLogPrefixAnsi('\\n[reroute/start] Shutting down...')}\\n`,\n\t\t\t);\n\t\t\tserverProcess.kill('SIGINT');\n\t\t\tprocess.exit(0);\n\t\t});\n\n\t\t// Wait for the server process to exit\n\t\tawait new Promise<void>((resolve, reject) => {\n\t\t\tserverProcess.on('exit', (code) => {\n\t\t\t\tif (code !== null && code !== 0) {\n\t\t\t\t\tconsole.error(\n\t\t\t\t\t\tcolorizeLogPrefixAnsi(\n\t\t\t\t\t\t\t`[reroute/start] Server exited with code ${code}`,\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t\treject(new Error(`Server exited with code ${code}`));\n\t\t\t\t} else {\n\t\t\t\t\tresolve();\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tserverProcess.on('error', (error) => {\n\t\t\t\treject(error);\n\t\t\t});\n\t\t});\n\t} catch (error) {\n\t\t// Handle Ctrl+C gracefully\n\t\tif ((error as { code?: string }).code === 'SIGINT') {\n\t\t\tprocess.stdout.write(\n\t\t\t\t`${colorizeLogPrefixAnsi('\\n[reroute/start] Shutting down...')}\\n`,\n\t\t\t);\n\t\t\tprocess.exit(0);\n\t\t}\n\t\tprocess.stderr.write(\n\t\t\t`${colorizeLogPrefixAnsi('[reroute/start] Error: ') + String(error)}\\n`,\n\t\t);\n\t\tthrow error;\n\t}\n}\n",
|
|
16
|
-
"/**\n * Build command - Build production binary\n *\n * This command runs:\n * 1. `reroute gen --prod` (waits for completion, no watch)\n * 2. `bun build src/index.ts --target bun --compile --outfile ./dist/{name}`\n */\n\nimport { spawn } from 'node:child_process';\nimport { existsSync, readFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { colorizeLogPrefixAnsi } from '../libs/log';\nimport { isProductionMode } from '../libs/production';\n\nfunction getRerouteCommand(): string {\n\t// Check if we're running from source (development mode)\n\t// Look for bin.ts in the expected location relative to this file\n\tconst binPath = join(import.meta.dir, '..', '..', 'bin.ts');\n\tconst isBunDev = existsSync(binPath);\n\n\tif (isBunDev) {\n\t\t// Running via bun during development from source\n\t\treturn `bun ${binPath}`;\n\t}\n\n\t// Check for reroute binary in node_modules/.bin, checking up to 3 levels up\n\tconst cwd = process.cwd();\n\tconst nodeModulesPaths = [\n\t\tjoin(cwd, 'node_modules', '.bin', 'reroute'),\n\t\tjoin(cwd, '..', 'node_modules', '.bin', 'reroute'),\n\t\tjoin(cwd, '..', '..', 'node_modules', '.bin', 'reroute'),\n\t\tjoin(cwd, '..', '..', '..', 'node_modules', '.bin', 'reroute'),\n\t];\n\n\tfor (const binPath of nodeModulesPaths) {\n\t\tif (existsSync(binPath)) {\n\t\t\treturn binPath;\n\t\t}\n\t}\n\n\t// Fallback: assume reroute is installed globally and available in PATH\n\treturn 'reroute';\n}\n\nfunction getOutputName(): string {\n\tconst cwd = process.cwd();\n\tconst packageJsonPath = join(cwd, 'package.json');\n\n\tif (existsSync(packageJsonPath)) {\n\t\ttry {\n\t\t\tconst packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf-8'));\n\t\t\tconst name = packageJson.name;\n\t\t\tif (name) {\n\t\t\t\t// Extract name from package.json (e.g., \"reroute-blog-example\" -> \"blog\")\n\t\t\t\t// Or use the name directly if it's simple\n\t\t\t\tconst parts = name.split('-');\n\t\t\t\t// If name has multiple parts, use the second-to-last or last meaningful part\n\t\t\t\tif (parts.length > 1 && parts[parts.length - 1] === 'example') {\n\t\t\t\t\treturn parts[parts.length - 2] || 'app';\n\t\t\t\t}\n\t\t\t\t// Use last part or full name if simple\n\t\t\t\treturn parts[parts.length - 1] || name;\n\t\t\t}\n\t\t} catch {\n\t\t\t// Fallback to 'app' if package.json parsing fails\n\t\t}\n\t}\n\n\treturn 'app';\n}\n\nexport default async function build(args: string[]) {\n\ttry {\n\t\tconst rerouteCmd = getRerouteCommand();\n\t\tconst useShell = rerouteCmd.includes(' ');\n\n\t\t// Parse output path from args or derive from package.json\n\t\tlet outputPath = `./dist/${getOutputName()}`;\n\t\tconst outfileIndex = args.indexOf('--outfile');\n\t\tconst shortOutfileIndex = args.indexOf('-o');\n\t\tconst outfileArgIndex =\n\t\t\toutfileIndex !== -1 ? outfileIndex : shortOutfileIndex;\n\n\t\tif (outfileArgIndex !== -1 && args[outfileArgIndex + 1]) {\n\t\t\toutputPath = args[outfileArgIndex + 1];\n\t\t}\n\n\t\t// Buffer for incomplete lines\n\t\tconst genBuffer = { current: '' };\n\n\t\tconst handleGenOutput = (data: Buffer) => {\n\t\t\tconst text = genBuffer.current + data.toString();\n\t\t\tconst lines = text.split('\\n');\n\t\t\tgenBuffer.current = lines.pop() || '';\n\n\t\t\tfor (const line of lines) {\n\t\t\t\t// Skip empty lines\n\t\t\t\tif (!line.trim()) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tconst ansiColored = colorizeLogPrefixAnsi(line);\n\t\t\t\tconsole.log(ansiColored);\n\t\t\t}\n\t\t};\n\n\t\t// Step 1: Run gen with --prod (without watch)\n\t\tprocess.stdout.write(\n\t\t\t`${colorizeLogPrefixAnsi('[reroute/build] Running gen --prod...')}\\n`,\n\t\t);\n\t\tconst genCommand = useShell ? `${rerouteCmd} gen --prod` : rerouteCmd;\n\t\tconst genArgs = useShell ? [] : ['gen', '--prod'];\n\n\t\tawait new Promise<void>((resolve, reject) => {\n\t\t\tconst genProcess = spawn(genCommand, genArgs, {\n\t\t\t\tstdio: ['ignore', 'pipe', 'pipe'],\n\t\t\t\tshell: useShell,\n\t\t\t});\n\n\t\t\tgenProcess.stdout?.on('data', handleGenOutput);\n\t\t\tgenProcess.stderr?.on('data', handleGenOutput);\n\n\t\t\tgenProcess.on('exit', (code) => {\n\t\t\t\tif (code !== null && code !== 0) {\n\t\t\t\t\treject(new Error(`Gen exited with code ${code}`));\n\t\t\t\t} else {\n\t\t\t\t\tresolve();\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tgenProcess.on('error', (error) => {\n\t\t\t\treject(error);\n\t\t\t});\n\t\t});\n\t\tprocess.stdout.write(\n\t\t\tcolorizeLogPrefixAnsi('[reroute/build] Generation complete\\n'),\n\t\t);\n\n\t\t// Step 2: Build the binary\n\t\tprocess.stdout.write(\n\t\t\t`${colorizeLogPrefixAnsi(`[reroute/build] Building binary to ${outputPath}...`)}\\n`,\n\t\t);\n\n\t\t// Check if we're in production mode (NODE_ENV=production, --prod, or --minify)\n\t\tconst isProduction = isProductionMode(args) || args.includes('--minify');\n\n\t\t// Build bun build args, filtering out --outfile/-o flags since we handle them\n\t\tconst buildArgs = ['build', 'src/index.ts', '--target', 'bun', '--compile'];\n\n\t\t// Add minify flag for production builds\n\t\tif (isProduction) {\n\t\t\tbuildArgs.push('--minify');\n\t\t\tbuildArgs.push('--external', 'sharp');\n\t\t}\n\n\t\t// Filter out --outfile/-o and its value, then add our parsed outputPath\n\t\t// Also filter out --minify/--no-minify/--prod since we handle them\n\t\tconst filteredArgs = args.filter((arg, idx) => {\n\t\t\tif (outfileArgIndex !== -1) {\n\t\t\t\tif (idx === outfileArgIndex || idx === outfileArgIndex + 1) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn (\n\t\t\t\targ !== '--outfile' &&\n\t\t\t\targ !== '-o' &&\n\t\t\t\targ !== '--minify' &&\n\t\t\t\targ !== '--no-minify' &&\n\t\t\t\targ !== '--prod'\n\t\t\t);\n\t\t});\n\n\t\tbuildArgs.push(...filteredArgs, '--outfile', outputPath);\n\n\t\tawait new Promise<void>((resolve, reject) => {\n\t\t\tconst buildProcess = spawn('bun', buildArgs, {\n\t\t\t\tstdio: 'inherit',\n\t\t\t});\n\n\t\t\tbuildProcess.on('exit', (code) => {\n\t\t\t\tif (code !== null && code !== 0) {\n\t\t\t\t\treject(new Error(`Build exited with code ${code}`));\n\t\t\t\t} else {\n\t\t\t\t\tprocess.stdout.write(\n\t\t\t\t\t\tcolorizeLogPrefixAnsi(\n\t\t\t\t\t\t\t`[reroute/build] Build complete: ${outputPath}\\n`,\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t\tresolve();\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tbuildProcess.on('error', (error) => {\n\t\t\t\treject(error);\n\t\t\t});\n\t\t});\n\t} catch (error) {\n\t\tprocess.stderr.write(\n\t\t\t`${colorizeLogPrefixAnsi('[reroute/build] Error: ') + String(error)}\\n`,\n\t\t);\n\t\tthrow error;\n\t}\n}\n",
|
|
6
|
+
"#!/usr/bin/env bun\n\n/**\n * Reroute init command\n *\n * Scaffold a new Reroute project with templates\n */\n\nimport { existsSync } from 'node:fs';\nimport { mkdir, readdir } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { getVersionString } from './lib/version';\n\ninterface InitOptions {\n\tprojectName: string;\n\ttemplate: 'basic' | 'blog' | 'store';\n}\n\nexport default async function init(args: string[]) {\n\tconst options = parseArgs(args);\n\n\tif (!options) {\n\t\tawait printHelp();\n\t\tprocess.exit(1);\n\t}\n\n\ttry {\n\t\tawait scaffoldProject(options);\n\t} catch (error) {\n\t\tconsole.error('Error scaffolding project:', error);\n\t\tprocess.exit(1);\n\t}\n}\n\nfunction parseArgs(args: string[]): InitOptions | null {\n\tif (args.length === 0 || args[0] === '--help' || args[0] === '-h') {\n\t\treturn null;\n\t}\n\n\tconst projectName = args[0];\n\n\tif (!projectName || projectName.startsWith('-')) {\n\t\tconsole.error('Error: Project name is required');\n\t\treturn null;\n\t}\n\n\t// Validate project name\n\tif (!/^[a-z0-9-_]+$/i.test(projectName)) {\n\t\tconsole.error(\n\t\t\t'Error: Project name can only contain letters, numbers, hyphens, and underscores',\n\t\t);\n\t\treturn null;\n\t}\n\n\tlet template: 'basic' | 'blog' | 'store' = 'basic';\n\n\t// Parse template flag\n\tconst templateIndex = args.indexOf('--template');\n\tif (templateIndex !== -1 && args[templateIndex + 1]) {\n\t\tconst templateArg = args[templateIndex + 1];\n\t\tif (['basic', 'blog', 'store'].includes(templateArg)) {\n\t\t\ttemplate = templateArg as 'basic' | 'blog' | 'store';\n\t\t} else {\n\t\t\tconsole.error(\n\t\t\t\t`Error: Unknown template \"${templateArg}\". Available templates: basic, blog, store`,\n\t\t\t);\n\t\t\treturn null;\n\t\t}\n\t}\n\n\treturn { projectName, template };\n}\n\nasync function scaffoldProject(options: InitOptions) {\n\tconst { projectName, template } = options;\n\tconst projectPath = join(process.cwd(), projectName);\n\n\t// Check if directory already exists\n\tif (existsSync(projectPath)) {\n\t\tconsole.error(`Error: Directory \"${projectName}\" already exists`);\n\t\tprocess.exit(1);\n\t}\n\n\tconsole.log(`\\n🏗️ Creating project: ${projectName}`);\n\tconsole.log(`\\n📦 Template: ${template}\\n`);\n\n\t// Get template directory path (for non-src files like package.json, tsconfig.json)\n\t// Try multiple possible paths to find template directory (dev vs production)\n\tconst possibleTemplatePaths = [\n\t\t// When running from source: packages/cli/src/commands -> packages/cli/src/_\n\t\tjoin(import.meta.dir, '..', '_', template),\n\t\t// When running from production build: dist/cli/src/commands -> dist/_\n\t\tjoin(import.meta.dir, '..', '..', '..', '_', template),\n\t];\n\n\tlet templatePath: string | undefined;\n\tfor (const path of possibleTemplatePaths) {\n\t\tif (existsSync(path)) {\n\t\t\ttemplatePath = path;\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tif (!templatePath) {\n\t\tconsole.error(\n\t\t\t`Error: Template directory not found for template \"${template}\"`,\n\t\t);\n\t\tconsole.error(`Tried paths: ${possibleTemplatePaths.join(', ')}`);\n\t\tprocess.exit(1);\n\t}\n\n\t// Get examples directory path (for src folder)\n\t// Try multiple possible paths to find examples directory\n\tconst possibleExamplesPaths = [\n\t\t// When running from source: packages/cli/src/commands -> examples\n\t\tjoin(import.meta.dir, '..', '..', '..', '..', 'examples', template, 'src'),\n\t\t// Alternative path structure\n\t\tjoin(\n\t\t\timport.meta.dir,\n\t\t\t'..',\n\t\t\t'..',\n\t\t\t'..',\n\t\t\t'..',\n\t\t\t'..',\n\t\t\t'examples',\n\t\t\ttemplate,\n\t\t\t'src',\n\t\t),\n\t];\n\n\tlet examplesPath: string | undefined;\n\tfor (const path of possibleExamplesPaths) {\n\t\tif (existsSync(path)) {\n\t\t\texamplesPath = path;\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t// Create project directory\n\tawait mkdir(projectPath, { recursive: true });\n\n\t// Copy template files (excluding src folder)\n\tawait copyTemplateFiles(templatePath, projectPath, {\n\t\tPROJECT_NAME: projectName,\n\t});\n\n\t// Variables to replace in source files\n\tconst sourceVariables = {\n\t\tPROJECT_NAME: projectName,\n\t};\n\n\t// Copy src folder from examples (or fallback to template if examples not found)\n\tif (examplesPath) {\n\t\t// Copy src folder from examples (always up-to-date)\n\t\tawait copySourceFiles(\n\t\t\texamplesPath,\n\t\t\tjoin(projectPath, 'src'),\n\t\t\tsourceVariables,\n\t\t);\n\t} else {\n\t\t// Fallback: copy src folder from template (for distribution scenarios)\n\t\tconst templateSrcPath = join(templatePath, 'src');\n\t\tif (existsSync(templateSrcPath)) {\n\t\t\tawait copySourceFiles(\n\t\t\t\ttemplateSrcPath,\n\t\t\t\tjoin(projectPath, 'src'),\n\t\t\t\tsourceVariables,\n\t\t\t);\n\t\t} else {\n\t\t\tconsole.error(`Error: No src directory found for template \"${template}\"`);\n\t\t\tconsole.error(\n\t\t\t\t`Tried examples paths: ${possibleExamplesPaths.join(', ')}`,\n\t\t\t);\n\t\t\tconsole.error(`Tried template path: ${templateSrcPath}`);\n\t\t\tprocess.exit(1);\n\t\t}\n\t}\n\n\t// Run bun install\n\tconsole.log('📥 Installing dependencies...\\n');\n\tconst proc = Bun.spawn(['bun', 'install'], {\n\t\tcwd: projectPath,\n\t\tstdout: 'inherit',\n\t\tstderr: 'inherit',\n\t});\n\n\tawait proc.exited;\n\n\t// Print success message\n\tprintSuccess(projectName, template);\n}\n\nasync function copyTemplateFiles(\n\ttemplatePath: string,\n\ttargetPath: string,\n\tvariables: Record<string, string>,\n) {\n\tconst entries = await readdir(templatePath, { withFileTypes: true });\n\n\tfor (const entry of entries) {\n\t\t// Skip src directory - it will be copied from examples\n\t\tif (entry.isDirectory() && entry.name === 'src') {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst sourcePath = join(templatePath, entry.name);\n\t\tconst destPath = join(targetPath, entry.name);\n\n\t\tif (entry.isDirectory()) {\n\t\t\t// Create directory and recurse\n\t\t\tawait mkdir(destPath, { recursive: true });\n\t\t\tawait copyTemplateFiles(sourcePath, destPath, variables);\n\t\t} else if (entry.isFile()) {\n\t\t\t// Read file content\n\t\t\tconst content = await Bun.file(sourcePath).text();\n\n\t\t\t// Replace variables in content\n\t\t\tlet processedContent = content;\n\t\t\tfor (const [key, value] of Object.entries(variables)) {\n\t\t\t\tconst placeholder = `{{${key}}}`;\n\t\t\t\tprocessedContent = processedContent.split(placeholder).join(value);\n\t\t\t}\n\n\t\t\t// Write file\n\t\t\tawait Bun.write(destPath, processedContent);\n\t\t}\n\t}\n}\n\n/**\n * File patterns that should have variable replacements applied\n * Add more patterns here as needed for future variables\n */\nconst VARIABLE_REPLACEMENT_PATTERNS = [\n\t/\\.html$/i, // HTML files (e.g., index.html)\n\t// Add more patterns here as needed:\n\t// /\\.md$/i, // Markdown files\n\t// /\\.txt$/i, // Text files\n];\n\n/**\n * Apply variable replacements to file content based on file type\n * This allows examples to remain as working projects while still customizing them during init\n */\nfunction applyVariableReplacements(\n\tcontent: string,\n\tfileName: string,\n\tvariables: Record<string, string>,\n): string {\n\t// Check if this file type should have variables replaced\n\tconst shouldReplaceVariables = VARIABLE_REPLACEMENT_PATTERNS.some((pattern) =>\n\t\tpattern.test(fileName),\n\t);\n\n\tif (!shouldReplaceVariables) {\n\t\treturn content;\n\t}\n\n\tlet processedContent = content;\n\n\t// For HTML files, replace title tag content\n\tif (/\\.html$/i.test(fileName)) {\n\t\t// Replace title tag content with PROJECT_NAME if available\n\t\tif (variables.PROJECT_NAME) {\n\t\t\t// Match <title>...</title> and replace content\n\t\t\tprocessedContent = processedContent.replace(\n\t\t\t\t/<title>.*?<\\/title>/i,\n\t\t\t\t`<title>${variables.PROJECT_NAME}</title>`,\n\t\t\t);\n\t\t}\n\t}\n\n\t// Add more file-specific replacements here as needed\n\t// For example, for markdown files:\n\t// if (/\\.md$/i.test(fileName)) {\n\t// processedContent = processedContent.replace(/{{PROJECT_NAME}}/g, variables.PROJECT_NAME);\n\t// }\n\n\treturn processedContent;\n}\n\n/**\n * Copy source files from examples, optionally applying variable replacements\n */\nasync function copySourceFiles(\n\tsourcePath: string,\n\ttargetPath: string,\n\tvariables?: Record<string, string>,\n) {\n\tconst entries = await readdir(sourcePath, { withFileTypes: true });\n\n\t// Create target directory\n\tawait mkdir(targetPath, { recursive: true });\n\n\tfor (const entry of entries) {\n\t\tconst sourceEntryPath = join(sourcePath, entry.name);\n\t\tconst targetEntryPath = join(targetPath, entry.name);\n\n\t\tif (entry.isDirectory()) {\n\t\t\t// Recursively copy directory\n\t\t\tawait copySourceFiles(sourceEntryPath, targetEntryPath, variables);\n\t\t} else if (entry.isFile()) {\n\t\t\t// Read file content\n\t\t\tconst content = await Bun.file(sourceEntryPath).text();\n\n\t\t\t// Apply variable replacements if variables are provided\n\t\t\tconst processedContent = variables\n\t\t\t\t? applyVariableReplacements(content, entry.name, variables)\n\t\t\t\t: content;\n\n\t\t\t// Write file\n\t\t\tawait Bun.write(targetEntryPath, processedContent);\n\t\t}\n\t}\n}\n\nfunction printSuccess(projectName: string, template: string) {\n\tconsole.log('\\n🏎️ Project created successfully!\\n');\n\tconsole.log('Next steps:\\n');\n\tconsole.log(` cd ${projectName}`);\n\tconsole.log(' bun dev\\n');\n\tconsole.log('Your app will be running at http://localhost:3000\\n');\n\tconsole.log('Project structure:');\n\tconsole.log(' src/');\n\tconsole.log(' |-- index.ts # Server entry point');\n\tconsole.log(' +-- client/');\n\tconsole.log(' |-- App.tsx # Root React component');\n\tconsole.log(' |-- index.tsx # Client entry point');\n\tconsole.log(' |-- index.html # HTML template');\n\tconsole.log(' |-- routes/ # File-based routes');\n\tif (template === 'blog') {\n\t\tconsole.log(' | |-- blog/');\n\t\tconsole.log(' | | |-- content/ # Blog posts');\n\t\tconsole.log(' | | |-- [slug].tsx');\n\t\tconsole.log(' | | +-- index.tsx');\n\t}\n\tif (template === 'store') {\n\t\tconsole.log(' | |-- products/');\n\t\tconsole.log(' | |-- categories/');\n\t\tconsole.log(' |-- lib/ # API client & utilities');\n\t\tconsole.log(' +-- theme.css # Tailwind CSS v4');\n\t}\n\tconsole.log(' | |-- index.tsx');\n\tconsole.log(' | +-- about.tsx');\n\tconsole.log(' +-- components/ # React components\\n');\n\tconsole.log('Learn more at https://github.com/stewones/reroute');\n}\n\nasync function printHelp() {\n\tconsole.log(await getVersionString());\n\tconsole.log('');\n\tconsole.log('Usage:');\n\tconsole.log(' reroute init <project-name> [options]');\n\tconsole.log('');\n\tconsole.log('Options:');\n\tconsole.log(' --template <name> Template to use (basic, blog, store)');\n\tconsole.log(' -h, --help Show help');\n\tconsole.log('');\n\tconsole.log('Examples:');\n\tconsole.log(' reroute init my-app');\n\tconsole.log(' reroute init my-blog --template blog');\n\tconsole.log(' reroute init my-store --template store');\n}\n",
|
|
17
7
|
"export async function generateContentHash(content: string): Promise<string> {\n\tconst data = new TextEncoder().encode(content);\n\tconst buf = await crypto.subtle.digest('SHA-256', data);\n\tlet hex = '';\n\tfor (const b of new Uint8Array(buf)) hex += b.toString(16).padStart(2, '0');\n\treturn hex.slice(0, 8);\n}\n",
|
|
8
|
+
"import { pathToFileURL } from 'node:url';\nimport type { ComponentType } from 'react';\n\nexport interface StreamingOptions {\n\tenabled?: boolean;\n\tdefaultSkeleton?: ComponentType | string;\n\tdefaultLayoutSkeleton?: ComponentType | string;\n}\n\nexport interface ConfigOptions {\n\t// App component - must be string path in config (not ReactElement)\n\tapp?: string;\n\n\t// SSR options\n\thead?: string;\n\tlang?: string;\n\tappId?: string;\n\n\t// Static serving options\n\tassets?: string;\n\tprefix?: string;\n\tignorePatterns?: (string | RegExp)[];\n\tstaticHeaders?: Record<string, string>;\n\tmaxAge?: number;\n\tdirective?: string;\n\tindexHTML?: boolean;\n\n\t// Build options\n\tminify?: boolean;\n\n\t// Compression (applies to both sync and streaming SSR)\n\tcompression?: boolean;\n\n\t// Image optimization options\n\timageMaxAge?: number;\n\timageAllowedDomains?: string[];\n\timageMaxWidth?: number;\n\timageMaxHeight?: number;\n\n\t// Bundle caching options\n\tbundleMaxAge?: number;\n}\n\nexport interface RerouteConfig {\n\toptions?: ConfigOptions;\n\tstreaming?: StreamingOptions;\n}\n\nexport function defineConfig(config: RerouteConfig): RerouteConfig {\n\treturn config;\n}\n\nexport async function loadConfig(cwd: string): Promise<RerouteConfig> {\n\tconst configPath = `${cwd}/reroute.config.ts`;\n\tconst configFile = Bun.file(configPath);\n\n\tif (!(await configFile.exists())) {\n\t\treturn {};\n\t}\n\n\ttry {\n\t\tconst mod = await import(\n\t\t\t`${pathToFileURL(configPath).href}?t=${Date.now()}`\n\t\t);\n\t\treturn (mod.default || mod) as RerouteConfig;\n\t} catch (error) {\n\t\tconsole.warn('[reroute] Failed to load reroute.config.ts:', error);\n\t\treturn {};\n\t}\n}\n",
|
|
18
9
|
"export function join(...parts: string[]): string {\n\treturn parts.join('/').replace(/\\/+/g, '/');\n}\n\nexport function extname(p: string): string {\n\tconst i = p.lastIndexOf('.');\n\treturn i >= 0 ? p.slice(i) : '';\n}\n\nexport function basename(p: string, ext?: string): string {\n\tconst name = p.replace(/\\\\/g, '/').split('/').pop() || p;\n\treturn ext && name.endsWith(ext) ? name.slice(0, -ext.length) : name;\n}\n\nexport function stripStart(p: string, ch: string): string {\n\treturn p.startsWith(ch) ? p.slice(ch.length) : p;\n}\n\nexport function stripEnd(p: string, ch: string): string {\n\treturn p.endsWith(ch) ? p.slice(0, -ch.length) : p;\n}\n",
|
|
19
|
-
"import { readdir, stat } from 'node:fs/promises';\nimport { join } from '../
|
|
20
|
-
"import { stat } from 'node:fs/promises';\nimport { pathToFileURL } from 'node:url';\nimport type { ContentMeta, Doc } from '../types';\n\nexport async function getContentMeta(\n\tabsPath: string,\n\tisWatchMode: boolean,\n): Promise<ContentMeta> {\n\ttry {\n\t\tconst url = pathToFileURL(absPath).href;\n\t\tconst mod = await import(`${url}${isWatchMode ? `?t=${Date.now()}` : ''}`);\n\t\tconst meta: unknown = (mod as Doc).meta || (mod as Doc).frontmatter || {};\n\t\tif (meta && typeof meta === 'object') return meta as ContentMeta;\n\t\treturn {};\n\t} catch {\n\t\ttry {\n\t\t\tconst s = await stat(absPath);\n\t\t\treturn { date: new Date(s.mtimeMs).toISOString() };\n\t\t} catch {\n\t\t\treturn {};\n\t\t}\n\t}\n}\n\n/**\n * Build a minimal <head> snippet from content metadata.\n * - <title>\n * - <meta name=\"description\">\n */\nexport function buildHeadFromMeta(\n\tmeta: ContentMeta | undefined | null,\n): string {\n\tif (!meta || typeof meta !== 'object') return '';\n\tconst parts: string[] = [];\n\tconst title = typeof meta.title === 'string' ? meta.title : undefined;\n\tconst description =\n\t\ttypeof meta.description === 'string'\n\t\t\t? meta.description\n\t\t\t: typeof meta.excerpt === 'string'\n\t\t\t\t? meta.excerpt\n\t\t\t\t: undefined;\n\tif (title) parts.push(`<title>${escapeHtml(title)}</title>`);\n\tif (description)\n\t\tparts.push(\n\t\t\t`<meta name=\"description\" content=\"${escapeHtml(description)}\" />`,\n\t\t);\n\treturn parts.length ? `\\n${parts.join('\\n')}` : '';\n}\n\nfunction escapeHtml(input: string): string {\n\treturn input\n\t\t.replace(/&/g, '&')\n\t\t.replace(/</g, '<')\n\t\t.replace(/>/g, '>')\n\t\t.replace(/\"/g, '"')\n\t\t.replace(/'/g, ''');\n}\n",
|
|
10
|
+
"import { readdir, stat } from 'node:fs/promises';\nimport { join } from '../ssr/lib/path';\n\nexport async function listContentFiles(\n\tdir: string,\n\tbaseRel: string,\n): Promise<string[]> {\n\tconst out: string[] = [];\n\ttry {\n\t\tconst entries = await readdir(dir, { withFileTypes: true });\n\t\tfor (const entry of entries) {\n\t\t\tconst full = join(dir, entry.name);\n\t\t\tconst rel = join(baseRel, entry.name);\n\t\t\tif (entry.isDirectory()) {\n\t\t\t\tconst nested = await listContentFiles(full, rel);\n\t\t\t\tout.push(...nested);\n\t\t\t} else if (entry.isFile()) {\n\t\t\t\tif (/\\.(tsx|ts)$/.test(entry.name) && !entry.name.startsWith('_')) {\n\t\t\t\t\tout.push(rel);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t} catch {\n\t\t// ignore missing dirs\n\t}\n\treturn out;\n}\n\n// buildContentDTOs removed - content is now fully pre-generated at build time\n\nexport async function discoverCollections(\n\tclientDir: string,\n): Promise<string[]> {\n\tconst root = join(clientDir, 'routes');\n\tconst collections = new Set<string>();\n\ttry {\n\t\tconst entries = await readdir(root, { withFileTypes: true });\n\t\tfor (const entry of entries) {\n\t\t\tif (entry.isDirectory()) {\n\t\t\t\tconst contentDir = join(root, entry.name, 'content');\n\t\t\t\ttry {\n\t\t\t\t\tawait stat(contentDir);\n\t\t\t\t\tcollections.add(entry.name);\n\t\t\t\t} catch {\n\t\t\t\t\t// content directory doesn't exist, skip\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t} catch {\n\t\t// routes directory doesn't exist\n\t}\n\treturn Array.from(collections);\n}\n",
|
|
11
|
+
"import { stat } from 'node:fs/promises';\nimport { pathToFileURL } from 'node:url';\nimport type { ContentMeta, Doc } from '../ssr/lib/types';\n\nexport async function getContentMeta(\n\tabsPath: string,\n\tisWatchMode: boolean,\n): Promise<ContentMeta> {\n\ttry {\n\t\tconst url = pathToFileURL(absPath).href;\n\t\tconst mod = await import(`${url}${isWatchMode ? `?t=${Date.now()}` : ''}`);\n\t\tconst meta: unknown = (mod as Doc).meta || (mod as Doc).frontmatter || {};\n\t\tif (meta && typeof meta === 'object') return meta as ContentMeta;\n\t\treturn {};\n\t} catch {\n\t\ttry {\n\t\t\tconst s = await stat(absPath);\n\t\t\treturn { date: new Date(s.mtimeMs).toISOString() };\n\t\t} catch {\n\t\t\treturn {};\n\t\t}\n\t}\n}\n\n/**\n * Build a minimal <head> snippet from content metadata.\n * - <title>\n * - <meta name=\"description\">\n */\nexport function buildHeadFromMeta(\n\tmeta: ContentMeta | undefined | null,\n): string {\n\tif (!meta || typeof meta !== 'object') return '';\n\tconst parts: string[] = [];\n\tconst title = typeof meta.title === 'string' ? meta.title : undefined;\n\tconst description =\n\t\ttypeof meta.description === 'string'\n\t\t\t? meta.description\n\t\t\t: typeof meta.excerpt === 'string'\n\t\t\t\t? meta.excerpt\n\t\t\t\t: undefined;\n\tif (title) parts.push(`<title>${escapeHtml(title)}</title>`);\n\tif (description)\n\t\tparts.push(\n\t\t\t`<meta name=\"description\" content=\"${escapeHtml(description)}\" />`,\n\t\t);\n\treturn parts.length ? `\\n${parts.join('\\n')}` : '';\n}\n\nfunction escapeHtml(input: string): string {\n\treturn input\n\t\t.replace(/&/g, '&')\n\t\t.replace(/</g, '<')\n\t\t.replace(/>/g, '>')\n\t\t.replace(/\"/g, '"')\n\t\t.replace(/'/g, ''');\n}\n",
|
|
21
12
|
"export * from './discovery';\nexport * from './metadata';\n",
|
|
22
|
-
"
|
|
23
|
-
"import
|
|
24
|
-
"
|
|
13
|
+
"type CacheEntry<T> = {\n\tdata: T;\n\ttimestamp: number;\n\tmaxAge: number;\n};\n\n/**\n * Simple in-memory cache for SSR data\n * Thread-safe for single-process usage\n */\nclass SSRDataCache {\n\tprivate cache: Map<string, CacheEntry<unknown>> = new Map();\n\tprivate static cleanupInterval: NodeJS.Timeout | null = null;\n\n\tconstructor() {\n\t\t// Run cleanup every 60 seconds to remove expired entries\n\t\t// Only start interval once globally\n\t\tif (!SSRDataCache.cleanupInterval) {\n\t\t\tSSRDataCache.cleanupInterval = setInterval(() => {\n\t\t\t\tthis.cleanup();\n\t\t\t}, 60_000);\n\t\t}\n\t}\n\n\t/**\n\t * Get cached data if available and not expired\n\t */\n\tget<T>(key: string): T | undefined {\n\t\tconst entry = this.cache.get(key);\n\t\tif (!entry) return undefined;\n\n\t\tconst age = Date.now() - entry.timestamp;\n\t\tif (age > entry.maxAge) {\n\t\t\tthis.cache.delete(key);\n\t\t\treturn undefined;\n\t\t}\n\n\t\treturn entry.data as T;\n\t}\n\n\t/**\n\t * Set data in cache with maxAge (in milliseconds)\n\t */\n\tset<T>(key: string, data: T, maxAge: number): void {\n\t\tif (maxAge <= 0) return; // Don't cache if maxAge is 0 or negative\n\n\t\tthis.cache.set(key, {\n\t\t\tdata,\n\t\t\ttimestamp: Date.now(),\n\t\t\tmaxAge, // maxAge should be in milliseconds\n\t\t});\n\t}\n\n\t/**\n\t * Check if key exists and is not expired\n\t */\n\thas(key: string): boolean {\n\t\treturn this.get(key) !== undefined;\n\t}\n\n\t/**\n\t * Clear all cached data\n\t */\n\tclear(): void {\n\t\tthis.cache.clear();\n\t}\n\n\t/**\n\t * Remove expired entries\n\t */\n\tprivate cleanup(): void {\n\t\tconst now = Date.now();\n\t\tfor (const [key, entry] of this.cache.entries()) {\n\t\t\tif (now - entry.timestamp > entry.maxAge) {\n\t\t\t\tthis.cache.delete(key);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Get cache stats (useful for debugging)\n\t */\n\tstats(): { size: number; keys: string[] } {\n\t\treturn {\n\t\t\tsize: this.cache.size,\n\t\t\tkeys: Array.from(this.cache.keys()),\n\t\t};\n\t}\n\n\t/**\n\t * Cleanup interval on shutdown\n\t */\n\tdestroy(): void {\n\t\tif (SSRDataCache.cleanupInterval) {\n\t\t\tclearInterval(SSRDataCache.cleanupInterval);\n\t\t\tSSRDataCache.cleanupInterval = null;\n\t\t}\n\t\tthis.clear();\n\t}\n}\n\n// Simple LRU Cache implementation for backward compatibility\nexport class LRUCache<K, V> {\n\tprivate cache: Map<K, V> = new Map();\n\tprivate maxSize: number;\n\n\tconstructor(maxSize: number = 100) {\n\t\tthis.maxSize = maxSize;\n\t}\n\n\tget(key: K): V | undefined {\n\t\tconst value = this.cache.get(key);\n\t\tif (value !== undefined) {\n\t\t\t// Move to end (most recently used)\n\t\t\tthis.cache.delete(key);\n\t\t\tthis.cache.set(key, value);\n\t\t}\n\t\treturn value;\n\t}\n\n\tset(key: K, value: V): void {\n\t\t// Delete if exists (to update position)\n\t\tthis.cache.delete(key);\n\n\t\t// Evict oldest if at capacity\n\t\tif (this.cache.size >= this.maxSize) {\n\t\t\tconst firstKey = this.cache.keys().next().value;\n\t\t\tthis.cache.delete(firstKey as K);\n\t\t}\n\n\t\tthis.cache.set(key, value);\n\t}\n\n\thas(key: K): boolean {\n\t\treturn this.cache.has(key);\n\t}\n\n\tclear(): void {\n\t\tthis.cache.clear();\n\t}\n}\n\n// Global singleton instance - persist across module reloads in dev mode\n// Use globalThis to ensure cache survives hot reloads\nconst getGlobalCache = (): SSRDataCache => {\n\tconst g = globalThis as typeof globalThis & {\n\t\t__REROUTE_SSR_CACHE__?: SSRDataCache;\n\t\t__REROUTE_SSR_CACHE_INIT__?: boolean;\n\t};\n\n\tif (!g.__REROUTE_SSR_CACHE__) {\n\t\tg.__REROUTE_SSR_CACHE__ = new SSRDataCache();\n\t\tg.__REROUTE_SSR_CACHE_INIT__ = true;\n\t}\n\n\treturn g.__REROUTE_SSR_CACHE__;\n};\n\nconst ssrCache = getGlobalCache();\n\nexport { ssrCache, SSRDataCache };\nexport type { CacheEntry };\n",
|
|
14
|
+
"import { pathToFileURL } from 'node:url';\nimport { join } from './path';\n\n// biome-ignore lint/suspicious/noExplicitAny: flexible types\ntype Doc = any;\n\n/**\n * Load content collections for SSR rendering\n */\nexport async function loadCollections(\n\tcwd: string,\n\tisWatchMode: boolean,\n): Promise<Record<string, unknown[]>> {\n\ttry {\n\t\tconst p = join(cwd, '.reroute', 'content.ts');\n\t\tconst mod = await import(\n\t\t\tpathToFileURL(p).href + (isWatchMode ? `?t=${Date.now()}` : '')\n\t\t);\n\t\treturn (mod?.byCollection || {}) as Record<string, unknown[]>;\n\t} catch {\n\t\treturn {};\n\t}\n}\n\n/**\n * Set global collections for SSR\n */\nexport function setGlobalCollections(\n\tbyCollectionForSSR: Record<string, unknown[]>,\n): void {\n\ttry {\n\t\t(globalThis as Doc).__REROUTE_COLLECTIONS__ = byCollectionForSSR as Doc;\n\t} catch {}\n}\n",
|
|
15
|
+
"export function getMimeType(filePath: string): string {\n\tconst ext = filePath.split('.').pop()?.toLowerCase();\n\tconst mimeTypes: Record<string, string> = {\n\t\thtml: 'text/html',\n\t\tcss: 'text/css',\n\t\tjs: 'application/javascript',\n\t\tts: 'application/javascript',\n\t\tjson: 'application/json',\n\t\tpng: 'image/png',\n\t\tjpg: 'image/jpeg',\n\t\tjpeg: 'image/jpeg',\n\t\tgif: 'image/gif',\n\t\tsvg: 'image/svg+xml',\n\t\tico: 'image/x-icon',\n\t\twoff: 'font/woff',\n\t\twoff2: 'font/woff2',\n\t\tttf: 'font/ttf',\n\t};\n\treturn mimeTypes[ext || ''] || 'application/octet-stream';\n}\n\nexport function isCompressible(contentType: string): boolean {\n\tif (!contentType) return false;\n\tconst ct = contentType.split(';')[0].trim();\n\treturn (\n\t\tct.startsWith('text/') ||\n\t\tct === 'application/javascript' ||\n\t\tct === 'application/json' ||\n\t\tct === 'application/xml' ||\n\t\tct === 'image/svg+xml' ||\n\t\t// Compress TTF and WOFF fonts (50-60% reduction for TTF)\n\t\t// WOFF2 is already highly compressed, so skip it to avoid overhead\n\t\tct === 'font/ttf' ||\n\t\tct === 'font/woff'\n\t);\n}\n",
|
|
16
|
+
"import { brotliCompressSync } from 'node:zlib';\nimport { isCompressible } from './mime';\nimport type { CompressionResult } from './types';\n\nexport function acceptsGzip(acceptEncoding?: string): boolean {\n\treturn Boolean(acceptEncoding && /gzip/i.test(acceptEncoding));\n}\n\nexport function acceptsBrotli(acceptEncoding?: string): boolean {\n\treturn Boolean(acceptEncoding && /\\bbr\\b/i.test(acceptEncoding));\n}\n\nexport function toBytes(\n\tinput: string | Uint8Array,\n): Uint8Array<ArrayBuffer> | string {\n\treturn typeof input === 'string'\n\t\t? new TextEncoder().encode(input)\n\t\t: (input as Uint8Array<ArrayBuffer>);\n}\n\nexport function gzipIfAccepted(\n\tbody: string | Uint8Array,\n\tcontentType: string,\n\tacceptEncoding?: string,\n): CompressionResult {\n\tconst extraHeaders: Record<string, string> = {};\n\tif (isCompressible(contentType)) {\n\t\t// Prefer Brotli if supported by the client\n\t\tif (acceptsBrotli(acceptEncoding)) {\n\t\t\ttry {\n\t\t\t\t// Bun doesn't have native brotli sync API, use Node.js zlib\n\t\t\t\tconst compressed = brotliCompressSync(toBytes(body) as Uint8Array);\n\t\t\t\textraHeaders['Content-Encoding'] = 'br';\n\t\t\t\textraHeaders.Vary = 'Accept-Encoding';\n\t\t\t\treturn { body: compressed, extraHeaders };\n\t\t\t} catch {\n\t\t\t\t// ignore and fallthrough to gzip\n\t\t\t}\n\t\t}\n\t\t// Fallback to gzip\n\t\tif (acceptsGzip(acceptEncoding)) {\n\t\t\ttry {\n\t\t\t\tconst compressed = Bun.gzipSync(toBytes(body));\n\t\t\t\textraHeaders['Content-Encoding'] = 'gzip';\n\t\t\t\textraHeaders.Vary = 'Accept-Encoding';\n\t\t\t\treturn { body: compressed, extraHeaders };\n\t\t\t} catch {\n\t\t\t\t// ignore and fallthrough\n\t\t\t}\n\t\t}\n\t}\n\treturn { body, extraHeaders };\n}\n\nfunction compressStreamIfAccepted(\n\tstream: ReadableStream<Uint8Array>,\n\tcontentType: string,\n\t_acceptEncoding?: string,\n): StreamCompressionResult {\n\tconst extraHeaders: Record<string, string> = {};\n\n\tif (!isCompressible(contentType)) {\n\t\treturn { stream, extraHeaders };\n\t}\n\n\t// Streaming compression not supported in Bun yet\n\t// CompressionStream API is not available, and per-chunk gzipping breaks the format\n\t// Return uncompressed stream for now\n\treturn { stream, extraHeaders };\n}\n\ntype StreamCompressionResult = {\n\tstream: ReadableStream<Uint8Array>;\n\textraHeaders: Record<string, string>;\n};\n\nexport { compressStreamIfAccepted };\nexport type { StreamCompressionResult };\n",
|
|
17
|
+
"import { pathToFileURL } from 'node:url';\nimport { ssrCache } from './cache';\nimport { join } from './path';\n\n// biome-ignore lint/suspicious/noExplicitAny: flexible types\ntype Doc = any;\n\ntype ComputeResult = {\n\tdata: Record<string, unknown>;\n\terror?: string;\n\tpending?: Promise<void>;\n};\n\ntype ComputeOptions = {\n\tstreaming?: boolean;\n\tmaxAge?: number;\n};\n\n/**\n * Check if a value is a thenable (Promise-like)\n */\nconst isThenable = (value: unknown): value is Promise<unknown> => {\n\treturn (\n\t\ttypeof value === 'object' &&\n\t\tvalue !== null &&\n\t\ttypeof (value as { then?: unknown }).then === 'function'\n\t);\n};\n\n/**\n * Compute SSR data by executing ssr.data() from layouts (hierarchical) and route/content modules\n */\nexport async function computeSSRData(\n\tpathname: string,\n\tclientDir: string,\n\tcwd: string,\n\tisWatchMode: boolean,\n\toptions: ComputeOptions = {},\n): Promise<ComputeResult> {\n\tconst ssrData: Record<string, unknown> = {};\n\tlet error: string | undefined;\n\tconst pendingTasks: Promise<unknown>[] = [];\n\tconst streaming = options.streaming === true;\n\tconst maxAge = options.maxAge || 0; // maxAge in seconds from config\n\tconst maxAgeMs = maxAge * 1000; // Convert to milliseconds for cache\n\n\tconst toPromise = <T>(input: T | Promise<T>): Promise<T> =>\n\t\tinput instanceof Promise ? input : Promise.resolve(input);\n\n\tconst storeResult = (key: string, task: Promise<unknown>) => {\n\t\tpendingTasks.push(\n\t\t\ttask\n\t\t\t\t.then((value) => {\n\t\t\t\t\tssrData[key] = value as unknown;\n\t\t\t\t})\n\t\t\t\t.catch(() => {}),\n\t\t);\n\t};\n\n\ttry {\n\t\tconst routesPath = join(cwd, '.reroute', 'routes.ts');\n\t\tconst m = await import(\n\t\t\tpathToFileURL(routesPath).href + (isWatchMode ? `?t=${Date.now()}` : '')\n\t\t);\n\n\t\t// 1. Compute layout data hierarchically (root → nested)\n\t\ttry {\n\t\t\tconst layouts = (m as Doc)?.layouts as Doc[] | undefined;\n\n\t\t\tif (Array.isArray(layouts)) {\n\t\t\t\t// Filter layouts matching the pathname\n\t\t\t\tconst matchingLayouts = layouts\n\t\t\t\t\t.filter((layout: Doc) => {\n\t\t\t\t\t\tconst pattern = String(layout?.pattern || '/');\n\t\t\t\t\t\tif (pattern === '/') return true;\n\t\t\t\t\t\treturn pathname.startsWith(pattern);\n\t\t\t\t\t})\n\t\t\t\t\t.sort((a: Doc, b: Doc) => {\n\t\t\t\t\t\t// Sort by depth (shallow first, so root layout comes before nested)\n\t\t\t\t\t\tconst aDepth = String(a?.pattern || '/')\n\t\t\t\t\t\t\t.split('/')\n\t\t\t\t\t\t\t.filter(Boolean).length;\n\t\t\t\t\t\tconst bDepth = String(b?.pattern || '/')\n\t\t\t\t\t\t\t.split('/')\n\t\t\t\t\t\t\t.filter(Boolean).length;\n\t\t\t\t\t\treturn aDepth - bDepth;\n\t\t\t\t\t});\n\n\t\t\t\t// Execute ssr.data for each matching layout in hierarchical order\n\t\t\t\tfor (const layout of matchingLayouts) {\n\t\t\t\t\tif (typeof layout?.path === 'string') {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst abs = join(clientDir, 'routes', String(layout.path));\n\t\t\t\t\t\t\tconst mod = (await import(\n\t\t\t\t\t\t\t\tpathToFileURL(abs).href +\n\t\t\t\t\t\t\t\t\t(isWatchMode ? `?t=${Date.now()}` : '')\n\t\t\t\t\t\t\t)) as Doc;\n\t\t\t\t\t\t\tconst ssr = (mod as Doc)?.ssr as Doc | undefined;\n\t\t\t\t\t\t\tconst dataFn = (ssr as Doc)?.data as\n\t\t\t\t\t\t\t\t| ((ctx: Doc) => unknown | Promise<unknown>)\n\t\t\t\t\t\t\t\t| undefined;\n\t\t\t\t\t\t\tif (typeof dataFn === 'function') {\n\t\t\t\t\t\t\t\tconst pattern = String(layout.pattern || '/');\n\t\t\t\t\t\t\t\tconst layoutKey = `__layout:${pattern}`;\n\t\t\t\t\t\t\t\tconst cacheKey = `layout:${pattern}:${pathname}`;\n\n\t\t\t\t\t\t\t\t// Check cache first (if maxAge > 0)\n\t\t\t\t\t\t\t\tconst cached =\n\t\t\t\t\t\t\t\t\tmaxAgeMs > 0 ? ssrCache.get(cacheKey) : undefined;\n\n\t\t\t\t\t\t\t\tif (cached !== undefined) {\n\t\t\t\t\t\t\t\t\t// Cache hit! Use cached data\n\t\t\t\t\t\t\t\t\tif (streaming) {\n\t\t\t\t\t\t\t\t\t\tssrData[layoutKey] = cached;\n\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\tssrData[layoutKey] = cached;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t// Cache miss - execute data function\n\t\t\t\t\t\t\t\t\tconst task = toPromise(\n\t\t\t\t\t\t\t\t\t\tdataFn({ pathname, params: {} } as Doc),\n\t\t\t\t\t\t\t\t\t).catch((err) => {\n\t\t\t\t\t\t\t\t\t\tconst msg =\n\t\t\t\t\t\t\t\t\t\t\terr instanceof Error ? err.message : String(err);\n\t\t\t\t\t\t\t\t\t\tconsole.error(\n\t\t\t\t\t\t\t\t\t\t\t`[reroute] Layout SSR data() failed for ${layout.pattern}:`,\n\t\t\t\t\t\t\t\t\t\t\tmsg,\n\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\tthrow err;\n\t\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\t\tif (streaming) {\n\t\t\t\t\t\t\t\t\t\tssrData[layoutKey] = task as unknown;\n\t\t\t\t\t\t\t\t\t\t// Cache only the resolved value, not the promise\n\t\t\t\t\t\t\t\t\t\tstoreResult(\n\t\t\t\t\t\t\t\t\t\t\tlayoutKey,\n\t\t\t\t\t\t\t\t\t\t\ttask.then((value) => {\n\t\t\t\t\t\t\t\t\t\t\t\tif (maxAgeMs > 0) {\n\t\t\t\t\t\t\t\t\t\t\t\t\tssrCache.set(cacheKey, value, maxAgeMs);\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\treturn value;\n\t\t\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\tconst result = await task;\n\t\t\t\t\t\t\t\t\t\tssrData[layoutKey] = result;\n\t\t\t\t\t\t\t\t\t\t// Cache the resolved value\n\t\t\t\t\t\t\t\t\t\tif (maxAgeMs > 0) {\n\t\t\t\t\t\t\t\t\t\t\tssrCache.set(cacheKey, result, maxAgeMs);\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} catch {}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} catch {}\n\n\t\t// 2. Content page ssr.data\n\t\ttry {\n\t\t\tconst parts = pathname.split('/').filter(Boolean);\n\t\t\tif (parts.length >= 2) {\n\t\t\t\tconst g = globalThis as Doc;\n\t\t\t\tconst key = `${parts[0]}:${parts[1]}`;\n\t\t\t\tconst exp = g.__REROUTE_SSR_EXPORTS__?.[key] as\n\t\t\t\t\t| { ssr?: { data?: (ctx: Doc) => unknown | Promise<unknown> } }\n\t\t\t\t\t| undefined;\n\t\t\t\tconst dataFn = (exp as Doc)?.ssr?.data as\n\t\t\t\t\t| ((ctx: Doc) => unknown | Promise<unknown>)\n\t\t\t\t\t| undefined;\n\t\t\t\tif (typeof dataFn === 'function') {\n\t\t\t\t\tconst cacheKey = `content:${pathname}:${parts[1]}`;\n\n\t\t\t\t\t// Check cache first (if maxAge > 0)\n\t\t\t\t\tconst cached = maxAgeMs > 0 ? ssrCache.get(cacheKey) : undefined;\n\n\t\t\t\t\tif (cached !== undefined) {\n\t\t\t\t\t\t// Cache hit! Use cached data\n\t\t\t\t\t\tssrData[pathname] = cached;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Cache miss - execute data function\n\t\t\t\t\t\tconst task = toPromise(\n\t\t\t\t\t\t\tdataFn({\n\t\t\t\t\t\t\t\tpathname,\n\t\t\t\t\t\t\t\tparams: { name: parts[1] },\n\t\t\t\t\t\t\t} as Doc),\n\t\t\t\t\t\t).catch((err) => {\n\t\t\t\t\t\t\tconst msg = err instanceof Error ? err.message : String(err);\n\t\t\t\t\t\t\terror = `SSR data() failed: ${msg}`;\n\t\t\t\t\t\t\tconsole.error(`[reroute] ${error}`);\n\t\t\t\t\t\t\tthrow err;\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tif (streaming) {\n\t\t\t\t\t\t\tssrData[pathname] = task as unknown;\n\t\t\t\t\t\t\t// Cache only the resolved value, not the promise\n\t\t\t\t\t\t\tstoreResult(\n\t\t\t\t\t\t\t\tpathname,\n\t\t\t\t\t\t\t\ttask.then((value) => {\n\t\t\t\t\t\t\t\t\tif (maxAgeMs > 0) {\n\t\t\t\t\t\t\t\t\t\tssrCache.set(cacheKey, value, maxAgeMs);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\treturn value;\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconst result = await task;\n\t\t\t\t\t\t\tssrData[pathname] = result;\n\t\t\t\t\t\t\t// Cache the resolved value\n\t\t\t\t\t\t\tif (maxAgeMs > 0) {\n\t\t\t\t\t\t\t\tssrCache.set(cacheKey, result, maxAgeMs);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} catch {}\n\n\t\t// 3. Route-level ssr.data\n\t\ttry {\n\t\t\tconst match =\n\t\t\t\ttypeof m.matchRoute === 'function' ? m.matchRoute(pathname) : null;\n\t\t\tconst r = match?.route as Doc | undefined;\n\t\t\tconst params = (match?.params || {}) as Record<string, string>;\n\n\t\t\tif (r && typeof r.path === 'string') {\n\t\t\t\ttry {\n\t\t\t\t\tconst abs = join(clientDir, 'routes', String(r.path));\n\t\t\t\t\tconst mod = (await import(\n\t\t\t\t\t\tpathToFileURL(abs).href + (isWatchMode ? `?t=${Date.now()}` : '')\n\t\t\t\t\t)) as Doc;\n\t\t\t\t\tconst ssr = (mod as Doc)?.ssr as Doc | undefined;\n\t\t\t\t\tconst dataFn = (ssr as Doc)?.data as\n\t\t\t\t\t\t| ((ctx: Doc) => unknown | Promise<unknown>)\n\t\t\t\t\t\t| undefined;\n\t\t\t\t\tif (typeof dataFn === 'function') {\n\t\t\t\t\t\tconst cacheKey = `route:${pathname}:${JSON.stringify(params)}`;\n\n\t\t\t\t\t\t// Check cache first (if maxAge > 0)\n\t\t\t\t\t\tconst cached = maxAgeMs > 0 ? ssrCache.get(cacheKey) : undefined;\n\n\t\t\t\t\t\tif (cached !== undefined) {\n\t\t\t\t\t\t\t// Cache hit! Use cached data\n\t\t\t\t\t\t\t// If the cached result is an object with multiple keys, flatten it\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\tstreaming &&\n\t\t\t\t\t\t\t\ttypeof cached === 'object' &&\n\t\t\t\t\t\t\t\tcached !== null &&\n\t\t\t\t\t\t\t\t!Array.isArray(cached)\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t// Flatten object keys into top-level SSR data for progressive streaming\n\t\t\t\t\t\t\t\tfor (const [key, value] of Object.entries(cached)) {\n\t\t\t\t\t\t\t\t\tssrData[key] = value;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tssrData[pathname] = cached;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Cache miss - execute data function\n\t\t\t\t\t\t\tconst rawResult = dataFn({ pathname, params } as Doc);\n\n\t\t\t\t\t\t\tif (streaming) {\n\t\t\t\t\t\t\t\t// In streaming mode, check if the result is an object with promises immediately\n\t\t\t\t\t\t\t\t// This allows progressive streaming of individual promises\n\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\ttypeof rawResult === 'object' &&\n\t\t\t\t\t\t\t\t\trawResult !== null &&\n\t\t\t\t\t\t\t\t\t!Array.isArray(rawResult) &&\n\t\t\t\t\t\t\t\t\t!(rawResult instanceof Promise)\n\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\t// Check if this is an object with promise values\n\t\t\t\t\t\t\t\t\tconst entries = Object.entries(\n\t\t\t\t\t\t\t\t\t\trawResult as Record<string, unknown>,\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\tconst hasMultipleKeys = entries.length > 1;\n\t\t\t\t\t\t\t\t\tconst hasPromises = entries.some(([_, v]) => isThenable(v));\n\n\t\t\t\t\t\t\t\t\tif (hasMultipleKeys || hasPromises) {\n\t\t\t\t\t\t\t\t\t\t// Flatten: each key becomes a top-level SSR data key\n\t\t\t\t\t\t\t\t\t\t// This allows each promise to resolve and stream independently\n\n\t\t\t\t\t\t\t\t\t\t// Build a promise that resolves when all data is ready (for caching)\n\t\t\t\t\t\t\t\t\t\tconst promisesToResolve: Promise<[string, unknown]>[] = [];\n\n\t\t\t\t\t\t\t\t\t\tfor (const [key, val] of entries) {\n\t\t\t\t\t\t\t\t\t\t\tif (isThenable(val)) {\n\t\t\t\t\t\t\t\t\t\t\t\t// Handle promise values\n\t\t\t\t\t\t\t\t\t\t\t\tconst wrappedPromise = (val as Promise<unknown>)\n\t\t\t\t\t\t\t\t\t\t\t\t\t.then((resolved) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn resolved;\n\t\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\t\t.catch((err) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tconst msg =\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\terr instanceof Error ? err.message : String(err);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\terror = `SSR data() failed for key ${key}: ${msg}`;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tconsole.error(`[reroute] ${error}`);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tthrow err;\n\t\t\t\t\t\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\t\t\t\t\tssrData[key] = wrappedPromise;\n\t\t\t\t\t\t\t\t\t\t\t\tstoreResult(key, wrappedPromise);\n\n\t\t\t\t\t\t\t\t\t\t\t\t// Track for caching\n\t\t\t\t\t\t\t\t\t\t\t\tpromisesToResolve.push(\n\t\t\t\t\t\t\t\t\t\t\t\t\twrappedPromise.then(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t(resolved) => [key, resolved] as [string, unknown],\n\t\t\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\t\t\t// Handle synchronous values\n\t\t\t\t\t\t\t\t\t\t\t\tssrData[key] = val;\n\t\t\t\t\t\t\t\t\t\t\t\tpromisesToResolve.push(\n\t\t\t\t\t\t\t\t\t\t\t\t\tPromise.resolve([key, val] as [string, unknown]),\n\t\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t// Cache the result when all promises resolve\n\t\t\t\t\t\t\t\t\t\tif (maxAgeMs > 0) {\n\t\t\t\t\t\t\t\t\t\t\tPromise.all(promisesToResolve)\n\t\t\t\t\t\t\t\t\t\t\t\t.then((resolvedEntries) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\tconst resolvedResult: Record<string, unknown> = {};\n\t\t\t\t\t\t\t\t\t\t\t\t\tfor (const [key, value] of resolvedEntries) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tresolvedResult[key] = value;\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\tssrCache.set(cacheKey, resolvedResult, maxAgeMs);\n\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\t.catch(() => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t// If any promise fails, don't cache\n\t\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t// Skip to next - we've already handled this case\n\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\t// Object but not suitable for flattening - handle as single promise\n\t\t\t\t\t\t\t\t\t\tconst task = toPromise(rawResult).catch((err) => {\n\t\t\t\t\t\t\t\t\t\t\tconst msg =\n\t\t\t\t\t\t\t\t\t\t\t\terr instanceof Error ? err.message : String(err);\n\t\t\t\t\t\t\t\t\t\t\terror = `SSR data() failed: ${msg}`;\n\t\t\t\t\t\t\t\t\t\t\tconsole.error(`[reroute] ${error}`);\n\t\t\t\t\t\t\t\t\t\t\tthrow err;\n\t\t\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\t\t\tssrData[pathname] = task as unknown;\n\t\t\t\t\t\t\t\t\t\tstoreResult(\n\t\t\t\t\t\t\t\t\t\t\tpathname,\n\t\t\t\t\t\t\t\t\t\t\ttask.then((value) => {\n\t\t\t\t\t\t\t\t\t\t\t\tif (maxAgeMs > 0) {\n\t\t\t\t\t\t\t\t\t\t\t\t\tssrCache.set(cacheKey, value, maxAgeMs);\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\treturn value;\n\t\t\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t// Single value, promise, or array - handle normally\n\t\t\t\t\t\t\t\t\tconst task = toPromise(rawResult).catch((err) => {\n\t\t\t\t\t\t\t\t\t\tconst msg =\n\t\t\t\t\t\t\t\t\t\t\terr instanceof Error ? err.message : String(err);\n\t\t\t\t\t\t\t\t\t\terror = `SSR data() failed: ${msg}`;\n\t\t\t\t\t\t\t\t\t\tconsole.error(`[reroute] ${error}`);\n\t\t\t\t\t\t\t\t\t\tthrow err;\n\t\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\t\tssrData[pathname] = task as unknown;\n\t\t\t\t\t\t\t\t\tstoreResult(\n\t\t\t\t\t\t\t\t\t\tpathname,\n\t\t\t\t\t\t\t\t\t\ttask.then((value) => {\n\t\t\t\t\t\t\t\t\t\t\tif (maxAgeMs > 0) {\n\t\t\t\t\t\t\t\t\t\t\t\tssrCache.set(cacheKey, value, maxAgeMs);\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\treturn value;\n\t\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t// Non-streaming mode - await the result\n\t\t\t\t\t\t\t\tconst task = toPromise(rawResult).catch((err) => {\n\t\t\t\t\t\t\t\t\tconst msg = err instanceof Error ? err.message : String(err);\n\t\t\t\t\t\t\t\t\terror = `SSR data() failed: ${msg}`;\n\t\t\t\t\t\t\t\t\tconsole.error(`[reroute] ${error}`);\n\t\t\t\t\t\t\t\t\tthrow err;\n\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\tconst result = await task;\n\t\t\t\t\t\t\t\tssrData[pathname] = result;\n\t\t\t\t\t\t\t\t// Cache the resolved value\n\t\t\t\t\t\t\t\tif (maxAgeMs > 0) {\n\t\t\t\t\t\t\t\t\tssrCache.set(cacheKey, result, maxAgeMs);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} catch {}\n\t\t\t}\n\t\t} catch {}\n\t} catch {}\n\n\tconst layoutKeys = Object.keys(ssrData).filter((key) =>\n\t\tkey.startsWith('__layout:'),\n\t);\n\n\tif (streaming) {\n\t\t// In streaming mode, keep layout and route data separate so they can resolve independently\n\t\t// Layout data stays at __layout:${pattern} keys\n\t\t// Route data stays at pathname key\n\t\t// Each resolves as soon as its own data is ready (not waiting for the other)\n\t\t// Don't combine them - this allows progressive streaming!\n\t\t// Components can access layout data via __layout: keys if needed\n\t} else {\n\t\t// Merge layout data into the route data for the current pathname\n\t\t// So users can just call useData() without knowing about layout keys\n\t\tconst layoutData: Record<string, unknown> = {};\n\t\tfor (const key of layoutKeys) {\n\t\t\tObject.assign(layoutData, ssrData[key] as Record<string, unknown>);\n\t\t}\n\n\t\t// If we have route data for this pathname, merge layout data into it\n\t\tif (pathname in ssrData) {\n\t\t\tssrData[pathname] = {\n\t\t\t\t...layoutData,\n\t\t\t\t...(typeof ssrData[pathname] === 'object' && ssrData[pathname] !== null\n\t\t\t\t\t? (ssrData[pathname] as Record<string, unknown>)\n\t\t\t\t\t: {}),\n\t\t\t};\n\t\t} else if (Object.keys(layoutData).length > 0) {\n\t\t\t// If no route data but we have layout data, use layout data\n\t\t\tssrData[pathname] = layoutData;\n\t\t}\n\t}\n\n\tconst pending =\n\t\tstreaming && pendingTasks.length\n\t\t\t? Promise.allSettled(pendingTasks).then(() => undefined)\n\t\t\t: undefined;\n\n\treturn { data: ssrData, error, pending };\n}\n\n/**\n * Set global SSR data\n */\nexport function setGlobalSSRData(data: Record<string, unknown>): void {\n\ttry {\n\t\t(globalThis as Doc).__REROUTE_DATA__ = data as Doc;\n\t} catch {}\n}\n\nexport type { ComputeResult };\n",
|
|
18
|
+
"import { readdir, stat } from 'node:fs/promises';\nimport { pathToFileURL } from 'node:url';\nimport { join } from './path';\nimport type { Doc } from './types';\n\n/**\n * Import a content module for a given pathname like \"/collection/name\".\n * Prefer the latest built chunk in .reroute to align with the client preload,\n * then fall back to source TS/TSX if no chunk exists.\n */\nexport async function importContentModuleForPath(\n\tpathname: string,\n\tclientDir: string,\n\tcwd: string,\n\tisWatchMode: boolean,\n): Promise<Doc | null> {\n\ttry {\n\t\tconst parts = pathname.split('/').filter(Boolean);\n\t\tif (parts.length < 2) return null;\n\t\tconst collection = parts[0];\n\t\tconst name = parts[1];\n\n\t\t// 1) Prefer registry mapping from .reroute/content.ts to get exact chunk path\n\t\ttry {\n\t\t\tconst registryPath = join(cwd, '.reroute', 'content.ts');\n\t\t\tconst reg = (await import(\n\t\t\t\tpathToFileURL(registryPath).href +\n\t\t\t\t\t(isWatchMode ? `?t=${Date.now()}` : '')\n\t\t\t)) as Doc;\n\t\t\tconst get = (reg as Doc)?.getContentEntry as\n\t\t\t\t| ((c: string, n: string) => { module?: string } | undefined)\n\t\t\t\t| undefined;\n\t\t\tconst entry =\n\t\t\t\ttypeof get === 'function' ? get(collection, name) : undefined;\n\t\t\tconst moduleUrl = (entry as Doc)?.module as string | undefined;\n\t\t\tif (moduleUrl?.endsWith('.js')) {\n\t\t\t\tconst raw = moduleUrl.split('?')[0] || '';\n\t\t\t\tconst normalized = raw.replace(/^\\/+/, '');\n\t\t\t\tconst candidates: string[] = [];\n\t\t\t\tif (normalized) {\n\t\t\t\t\tcandidates.push(join(cwd, normalized));\n\t\t\t\t\tif (!normalized.startsWith('.reroute/')) {\n\t\t\t\t\t\tcandidates.push(join(cwd, '.reroute', normalized));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tfor (const abs of candidates) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tif (!(await Bun.file(abs).exists())) continue;\n\t\t\t\t\t\tconst href =\n\t\t\t\t\t\t\tpathToFileURL(abs).href + (isWatchMode ? `?t=${Date.now()}` : '');\n\t\t\t\t\t\tconst mod = await import(href);\n\t\t\t\t\t\treturn mod as Doc;\n\t\t\t\t\t} catch {}\n\t\t\t\t}\n\t\t\t}\n\t\t} catch {}\n\n\t\t// 2) Try latest prebuilt chunk from .reroute (fallback)\n\t\ttry {\n\t\t\tconst chunkDir = join(cwd, '.reroute', 'chunks', collection);\n\t\t\tconst files = await readdir(chunkDir);\n\t\t\tconst matches = files.filter(\n\t\t\t\t(n) => n.startsWith(`${name}.`) && n.endsWith('.js'),\n\t\t\t);\n\t\t\tif (matches.length) {\n\t\t\t\tlet latest = matches[0];\n\t\t\t\tlet latestM = 0;\n\t\t\t\tfor (const f of matches) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst s = await stat(join(chunkDir, f));\n\t\t\t\t\t\tif (s.mtimeMs >= latestM) {\n\t\t\t\t\t\t\tlatestM = s.mtimeMs;\n\t\t\t\t\t\t\tlatest = f;\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch {}\n\t\t\t\t}\n\t\t\t\tconst absChunk = join(chunkDir, latest);\n\t\t\t\tconst href =\n\t\t\t\t\tpathToFileURL(absChunk).href +\n\t\t\t\t\t(isWatchMode ? `?t=${Date.now()}` : '');\n\t\t\t\tconst mod = await import(href);\n\t\t\t\treturn mod as Doc;\n\t\t\t}\n\t\t} catch {}\n\n\t\t// 3) Fallback to source (TSX/TS)\n\t\ttry {\n\t\t\tconst srcTsx = join(\n\t\t\t\tclientDir,\n\t\t\t\t'routes',\n\t\t\t\tcollection,\n\t\t\t\t'content',\n\t\t\t\t`${name}.tsx`,\n\t\t\t);\n\t\t\tconst srcTs = join(\n\t\t\t\tclientDir,\n\t\t\t\t'routes',\n\t\t\t\tcollection,\n\t\t\t\t'content',\n\t\t\t\t`${name}.ts`,\n\t\t\t);\n\t\t\tlet absSrc: string | null = null;\n\t\t\tif (await Bun.file(srcTsx).exists()) absSrc = srcTsx;\n\t\t\telse if (await Bun.file(srcTs).exists()) absSrc = srcTs;\n\t\t\tif (absSrc) {\n\t\t\t\tconst href = pathToFileURL(absSrc).href;\n\t\t\t\tconst mod = await import(\n\t\t\t\t\tisWatchMode ? `${href}?t=${Date.now()}` : href\n\t\t\t\t);\n\t\t\t\treturn mod as Doc;\n\t\t\t}\n\t\t} catch {}\n\t} catch {}\n\treturn null;\n}\n",
|
|
19
|
+
"import { importContentModuleForPath } from './modules';\nimport type { Doc } from './types';\n\nexport async function seedSSRModuleForPath(\n\tpathname: string,\n\tclientDir: string,\n\tcwd: string,\n\tisWatchMode: boolean,\n): Promise<void> {\n\ttry {\n\t\tconst parts = pathname.split('/').filter(Boolean);\n\t\tif (parts.length < 2) return;\n\t\tconst collection = parts[0];\n\t\tconst name = parts[1];\n\t\tconst key = `${collection}:${name}`;\n\n\t\tconst mod = await importContentModuleForPath(\n\t\t\tpathname,\n\t\t\tclientDir,\n\t\t\tcwd,\n\t\t\tisWatchMode,\n\t\t);\n\n\t\tif (!mod) return;\n\n\t\tconst C = (mod as Doc).default || (mod as Doc);\n\t\t(globalThis as Doc).__REROUTE_SSR_MODULES__ =\n\t\t\t(globalThis as Doc).__REROUTE_SSR_MODULES__ || {};\n\t\t(globalThis as Doc).__REROUTE_SSR_MODULES__[key] = C;\n\n\t\t// Also capture exported meta/frontmatter and optional ssr config for head injection\n\t\ttry {\n\t\t\tconst pageMeta = (mod as Doc).meta || (mod as Doc).frontmatter || {};\n\t\t\tconst pageSSR = (mod as Doc).ssr || {};\n\t\t\t(globalThis as Doc).__REROUTE_SSR_EXPORTS__ =\n\t\t\t\t(globalThis as Doc).__REROUTE_SSR_EXPORTS__ || {};\n\t\t\t(globalThis as Doc).__REROUTE_SSR_EXPORTS__[key] = {\n\t\t\t\tmeta: pageMeta,\n\t\t\t\tssr: pageSSR,\n\t\t\t};\n\t\t} catch {}\n\t} catch {}\n}\n",
|
|
20
|
+
"import { pathToFileURL } from 'node:url';\nimport { join } from './path';\nimport { seedSSRModuleForPath } from './seed';\nimport type { Doc } from './types';\n\ntype ComputeParams = {\n\tpathname: string;\n\tclientDir: string;\n\tcwd: string;\n\tisWatchMode: boolean;\n};\n\nexport async function computeSSRDataForPath(\n\tparams: ComputeParams,\n): Promise<unknown> {\n\tconst { pathname, clientDir, cwd, isWatchMode } = params;\n\tconst allData: Record<string, unknown> = {};\n\n\t// Seed content modules for potential content pages\n\ttry {\n\t\tawait seedSSRModuleForPath(pathname, clientDir, cwd, isWatchMode);\n\t} catch {}\n\n\t// 1) Compute layout data (for routes with layouts)\n\ttry {\n\t\tconst routesPath = join(cwd, '.reroute', 'routes.ts');\n\t\tconst m = await import(\n\t\t\tpathToFileURL(routesPath).href + (isWatchMode ? `?t=${Date.now()}` : '')\n\t\t);\n\t\tconst layouts = (m as Doc)?.layouts as Doc[] | undefined;\n\n\t\tif (Array.isArray(layouts)) {\n\t\t\t// Filter layouts matching the pathname\n\t\t\tconst matchingLayouts = layouts\n\t\t\t\t.filter((layout: Doc) => {\n\t\t\t\t\tconst pattern = String(layout?.pattern || '/');\n\t\t\t\t\tif (pattern === '/') return true;\n\t\t\t\t\treturn pathname.startsWith(pattern);\n\t\t\t\t})\n\t\t\t\t.sort((a: Doc, b: Doc) => {\n\t\t\t\t\t// Sort by depth (shallow first, so root layout comes before nested)\n\t\t\t\t\tconst aDepth = String(a?.pattern || '/')\n\t\t\t\t\t\t.split('/')\n\t\t\t\t\t\t.filter(Boolean).length;\n\t\t\t\t\tconst bDepth = String(b?.pattern || '/')\n\t\t\t\t\t\t.split('/')\n\t\t\t\t\t\t.filter(Boolean).length;\n\t\t\t\t\treturn aDepth - bDepth;\n\t\t\t\t});\n\n\t\t\t// Execute ssr.data for each matching layout\n\t\t\tfor (const layout of matchingLayouts) {\n\t\t\t\tif (typeof layout?.path === 'string') {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst abs = join(clientDir, 'routes', String(layout.path));\n\t\t\t\t\t\tconst mod = (await import(\n\t\t\t\t\t\t\tpathToFileURL(abs).href + (isWatchMode ? `?t=${Date.now()}` : '')\n\t\t\t\t\t\t)) as Doc;\n\t\t\t\t\t\tconst ssr = (mod as Doc)?.ssr as Doc | undefined;\n\t\t\t\t\t\tconst dataFn = (ssr as Doc)?.data as\n\t\t\t\t\t\t\t| ((ctx: Doc) => unknown | Promise<unknown>)\n\t\t\t\t\t\t\t| undefined;\n\t\t\t\t\t\tif (typeof dataFn === 'function') {\n\t\t\t\t\t\t\tconst pattern = String(layout.pattern || '/');\n\t\t\t\t\t\t\tconst layoutKey = `__layout:${pattern}`;\n\t\t\t\t\t\t\t// Don't await - check if it's a promise first\n\t\t\t\t\t\t\tconst rawResult = dataFn({ pathname, params: {} } as Doc);\n\n\t\t\t\t\t\t\t// Check if the result is a promise\n\t\t\t\t\t\t\tif (rawResult instanceof Promise) {\n\t\t\t\t\t\t\t\t// Single promise - create lazy marker\n\t\t\t\t\t\t\t\tallData[layoutKey] = {\n\t\t\t\t\t\t\t\t\t__lazy__: true,\n\t\t\t\t\t\t\t\t\t__fetch__: `/__reroute_data?path=${encodeURIComponent(pathname)}&key=${encodeURIComponent(layoutKey)}`,\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t} else if (\n\t\t\t\t\t\t\t\ttypeof rawResult === 'object' &&\n\t\t\t\t\t\t\t\trawResult !== null &&\n\t\t\t\t\t\t\t\t!Array.isArray(rawResult)\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t// Object - check for promises inside\n\t\t\t\t\t\t\t\tconst entries = Object.entries(\n\t\t\t\t\t\t\t\t\trawResult as Record<string, unknown>,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\tconst hasPromises = entries.some(\n\t\t\t\t\t\t\t\t\t([_, v]) => v instanceof Promise,\n\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t\tif (hasPromises) {\n\t\t\t\t\t\t\t\t\t// Object with promises - create lazy markers\n\t\t\t\t\t\t\t\t\tconst flattened: Record<string, unknown> = {\n\t\t\t\t\t\t\t\t\t\t__flatten__: true,\n\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t\tfor (const [key, value] of entries) {\n\t\t\t\t\t\t\t\t\t\tif (value instanceof Promise) {\n\t\t\t\t\t\t\t\t\t\t\tflattened[key] = {\n\t\t\t\t\t\t\t\t\t\t\t\t__lazy__: true,\n\t\t\t\t\t\t\t\t\t\t\t\t__fetch__: `/__reroute_data?path=${encodeURIComponent(pathname)}&key=${encodeURIComponent(key)}`,\n\t\t\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\t\tflattened[key] = value;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tallData[layoutKey] = flattened;\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tallData[layoutKey] = rawResult;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t// Synchronous non-object result\n\t\t\t\t\t\t\t\tallData[layoutKey] = rawResult;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch {}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t} catch {}\n\n\t// 2) Try content-level export ssr.data if available\n\ttry {\n\t\tconst parts = pathname.split('/').filter(Boolean);\n\t\tif (parts.length >= 2) {\n\t\t\tconst key = `${parts[0]}:${parts[1]}`;\n\t\t\tconst g = globalThis as Doc;\n\t\t\tconst exp = g.__REROUTE_SSR_EXPORTS__?.[key] as\n\t\t\t\t| { ssr?: { data?: (ctx: Doc) => unknown | Promise<unknown> } }\n\t\t\t\t| undefined;\n\t\t\tconst dataFn = (exp as Doc)?.ssr?.data as\n\t\t\t\t| ((ctx: Doc) => unknown | Promise<unknown>)\n\t\t\t\t| undefined;\n\t\t\tif (typeof dataFn === 'function') {\n\t\t\t\t// Don't await - check if it's a promise first\n\t\t\t\tconst rawResult = dataFn({\n\t\t\t\t\tpathname,\n\t\t\t\t\tparams: { name: parts[1] },\n\t\t\t\t} as Doc);\n\n\t\t\t\t// Check if the result is a promise\n\t\t\t\tif (rawResult instanceof Promise) {\n\t\t\t\t\t// Single promise - create lazy marker\n\t\t\t\t\treturn {\n\t\t\t\t\t\t__lazy__: true,\n\t\t\t\t\t\t__fetch__: `/__reroute_data?path=${encodeURIComponent(pathname)}&key=${encodeURIComponent(pathname)}`,\n\t\t\t\t\t};\n\t\t\t\t} else if (\n\t\t\t\t\ttypeof rawResult === 'object' &&\n\t\t\t\t\trawResult !== null &&\n\t\t\t\t\t!Array.isArray(rawResult)\n\t\t\t\t) {\n\t\t\t\t\t// Object - check for promises inside\n\t\t\t\t\tconst entries = Object.entries(rawResult as Record<string, unknown>);\n\t\t\t\t\tconst hasPromises = entries.some(([_, v]) => v instanceof Promise);\n\n\t\t\t\t\tif (hasPromises) {\n\t\t\t\t\t\t// Object with promises - create lazy markers\n\t\t\t\t\t\tconst flattened: Record<string, unknown> = { __flatten__: true };\n\t\t\t\t\t\tfor (const [key, value] of entries) {\n\t\t\t\t\t\t\tif (value instanceof Promise) {\n\t\t\t\t\t\t\t\tflattened[key] = {\n\t\t\t\t\t\t\t\t\t__lazy__: true,\n\t\t\t\t\t\t\t\t\t__fetch__: `/__reroute_data?path=${encodeURIComponent(pathname)}&key=${encodeURIComponent(key)}`,\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tflattened[key] = value;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn flattened;\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn rawResult;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// Synchronous non-object result\n\t\t\t\t\treturn rawResult;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t} catch {}\n\n\t// 3) Route-level export ssr.data (non-content routes)\n\ttry {\n\t\tconst routesPath = join(cwd, '.reroute', 'routes.ts');\n\t\tconst m = await import(\n\t\t\tpathToFileURL(routesPath).href + (isWatchMode ? `?t=${Date.now()}` : '')\n\t\t);\n\t\tconst match =\n\t\t\ttypeof (m as Doc).matchRoute === 'function'\n\t\t\t\t? (m as Doc).matchRoute(pathname)\n\t\t\t\t: null;\n\t\tconst r = (match as Doc | null | undefined)?.route as Doc | undefined;\n\t\tconst paramsValue = ((match as Doc | null | undefined)?.params ||\n\t\t\t{}) as Record<string, string>;\n\t\tif (r && typeof (r as Doc).path === 'string') {\n\t\t\ttry {\n\t\t\t\tconst abs = join(clientDir, 'routes', String((r as Doc).path));\n\t\t\t\tconst mod = (await import(\n\t\t\t\t\tpathToFileURL(abs).href + (isWatchMode ? `?t=${Date.now()}` : '')\n\t\t\t\t)) as Doc;\n\t\t\t\tconst ssr = (mod as Doc)?.ssr as Doc | undefined;\n\t\t\t\tconst dataFn = (ssr as Doc)?.data as\n\t\t\t\t\t| ((ctx: Doc) => unknown | Promise<unknown>)\n\t\t\t\t\t| undefined;\n\t\t\t\tif (typeof dataFn === 'function') {\n\t\t\t\t\t// Call dataFn but DON'T await yet - we need to check if it's a promise\n\t\t\t\t\tconst rawResult = dataFn({\n\t\t\t\t\t\tpathname,\n\t\t\t\t\t\tparams: paramsValue,\n\t\t\t\t\t} as Doc);\n\n\t\t\t\t\t// Check if the result is a promise (without awaiting it)\n\t\t\t\t\tif (rawResult instanceof Promise) {\n\t\t\t\t\t\t// Single promise - create lazy marker\n\t\t\t\t\t\tallData[pathname] = {\n\t\t\t\t\t\t\t__lazy__: true,\n\t\t\t\t\t\t\t__fetch__: `/__reroute_data?path=${encodeURIComponent(pathname)}&key=${encodeURIComponent(pathname)}`,\n\t\t\t\t\t\t};\n\t\t\t\t\t} else if (\n\t\t\t\t\t\ttypeof rawResult === 'object' &&\n\t\t\t\t\t\trawResult !== null &&\n\t\t\t\t\t\t!Array.isArray(rawResult)\n\t\t\t\t\t) {\n\t\t\t\t\t\t// Object result - check if it contains promises\n\t\t\t\t\t\tconst obj = rawResult as Record<string, unknown>;\n\t\t\t\t\t\tconst entries = Object.entries(obj);\n\t\t\t\t\t\tconst hasPromises = entries.some(([_, v]) => v instanceof Promise);\n\n\t\t\t\t\t\tif (hasPromises) {\n\t\t\t\t\t\t\t// Object with promises - create lazy markers for each promise key\n\t\t\t\t\t\t\tconst flattened: Record<string, unknown> = { __flatten__: true };\n\t\t\t\t\t\t\tfor (const [key, value] of entries) {\n\t\t\t\t\t\t\t\tif (value instanceof Promise) {\n\t\t\t\t\t\t\t\t\tflattened[key] = {\n\t\t\t\t\t\t\t\t\t\t__lazy__: true,\n\t\t\t\t\t\t\t\t\t\t__fetch__: `/__reroute_data?path=${encodeURIComponent(pathname)}&key=${encodeURIComponent(key)}`,\n\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tflattened[key] = value;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tallData[pathname] = flattened;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Plain object with no promises\n\t\t\t\t\t\t\tallData[pathname] = rawResult;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Synchronous non-object result\n\t\t\t\t\t\tallData[pathname] = rawResult;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} catch {}\n\t\t}\n\t} catch {}\n\n\t// If we have both layout and route data, return them together\n\t// Otherwise return just the single data piece\n\tconst dataKeys = Object.keys(allData);\n\tif (dataKeys.length > 1) {\n\t\t// Multiple data sources (layout + route)\n\t\treturn {\n\t\t\t__reroute_multiple__: true,\n\t\t\t...allData,\n\t\t};\n\t} else if (dataKeys.length === 1) {\n\t\t// Single data source\n\t\treturn allData[dataKeys[0]];\n\t}\n\n\treturn null;\n}\n",
|
|
21
|
+
"import { join } from './path';\nimport type { TemplateContext } from './types';\n\nexport async function loadIndexHtml(clientDir: string): Promise<string> {\n\tconst templatePath = join(clientDir, 'index.html');\n\ttry {\n\t\tconst content = await Bun.file(templatePath).text();\n\t\treturn content;\n\t} catch (error) {\n\t\tconsole.error(\n\t\t\t`[reroute] Failed to load template from ${templatePath}:`,\n\t\t\terror,\n\t\t);\n\t\t// Minimal fallback (kept simple; will still be transformed below)\n\t\treturn `<!doctype html>\\n<html lang=\"en\">\\n <head>\\n <meta charset=\"UTF-8\" />\\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\\n <title>Reroute</title>\\n </head>\\n <body>\\n <div id=\"root\"></div>\\n </body>\\n</html>`;\n\t}\n}\n\nexport function applyIndexTemplate(\n\ttemplateHtml: string,\n\tappHtml: string,\n\t{\n\t\thead = '',\n\t\thydrationScript = '',\n\t\tlang = 'en',\n\t\tappId = 'root',\n\t}: TemplateContext,\n): string {\n\tlet html = templateHtml;\n\n\t// Ensure <html> has correct lang attribute\n\thtml = html.replace(/<html([^>]*)>/i, (_m, attrs: string) => {\n\t\tconst hasLang = /(^|\\s)lang\\s*=/.test(attrs);\n\t\tconst newAttrs = hasLang\n\t\t\t? attrs.replace(/lang\\s*=\\s*(\"[^\"]*\"|'[^']*'|[^\\s>]+)/i, `lang=\"${lang}\"`)\n\t\t\t: `${attrs} lang=\"${lang}\"`;\n\t\treturn `<html${newAttrs}>`;\n\t});\n\n\t// If incoming head contains <title> or a description meta, prefer replacing\n\t// existing ones in the template instead of duplicating.\n\tlet headToInject = head || '';\n\ttry {\n\t\tconst titleMatch = headToInject.match(/<title[\\s\\S]*?<\\/title>/i);\n\t\tif (titleMatch) {\n\t\t\tconst titleTag = titleMatch[0];\n\t\t\tif (/<title[\\s\\S]*?<\\/title>/i.test(html)) {\n\t\t\t\thtml = html.replace(/<title[\\s\\S]*?<\\/title>/i, titleTag);\n\t\t\t} else {\n\t\t\t\t// No title in template; will be injected below\n\t\t\t\t// keep titleTag in headToInject\n\t\t\t}\n\t\t\t// Remove the title from the extra head to avoid duplication when injecting\n\t\t\theadToInject = headToInject.replace(titleTag, '');\n\t\t}\n\n\t\tconst descRe = /<meta\\s+name\\s*=\\s*['\"]description['\"][^>]*>/i;\n\t\tconst descMatch = headToInject.match(descRe);\n\t\tif (descMatch) {\n\t\t\tconst descTag = descMatch[0];\n\t\t\tif (descRe.test(html)) {\n\t\t\t\thtml = html.replace(descRe, descTag);\n\t\t\t}\n\t\t\theadToInject = headToInject.replace(descTag, '');\n\t\t}\n\t} catch {}\n\n\t// Inject remaining head content before </head>\n\tif (headToInject) {\n\t\thtml = html.replace(/<\\/head>/i, `${headToInject}\\n\\t</head>`);\n\t}\n\n\t// Remove any TS/TSX script tags to avoid double-loading in SSR\n\thtml = html.replace(\n\t\t/<script\\b[^>]*src\\s*=\\s*[\"'][^\"']+\\.(ts|tsx)(?:[?#][^\"']*)?[\"'][^>]*>\\s*<\\/script>/gi,\n\t\t'',\n\t);\n\n\t// Extract React preload hints from appHtml and move them to head\n\t// React 19 outputs <link> tags at the start of SSR output\n\tlet cleanAppHtml = appHtml;\n\tconst preloadLinks: string[] = [];\n\n\t// Only extract link tags from the very beginning of the HTML (before first non-whitespace element)\n\tconst linkPrefixRegex = /^(\\s*(?:<link\\b[^>]*>\\s*)+)/;\n\tconst prefixMatch = appHtml.match(linkPrefixRegex);\n\tif (prefixMatch?.[1]) {\n\t\tconst linkMatches = prefixMatch[1].match(/<link\\b[^>]*>/g);\n\t\tif (linkMatches) {\n\t\t\tpreloadLinks.push(...linkMatches);\n\t\t\t// Remove only the prefix link tags\n\t\t\tcleanAppHtml = appHtml.slice(prefixMatch[1].length);\n\t\t}\n\t}\n\n\t// Add extracted preload links to head\n\tif (preloadLinks.length > 0) {\n\t\tconst preloadHtml = preloadLinks.join('\\n\\t\\t');\n\t\thtml = html.replace(/<\\/head>/i, `\\t\\t${preloadHtml}\\n\\t</head>`);\n\t}\n\n\t// Replace content of the app root (e.g., <div id=\"root\"></div>)\n\tconst appIdEscaped = appId.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n\tconst rootDivRegex = new RegExp(\n\t\t`(<div[^>]*\\\\bid=(\\\\\"|')${appIdEscaped}\\\\2[^>]*>)([\\\\s\\\\S]*?)(<\\\\/div>)`,\n\t\t'i',\n\t);\n\tif (rootDivRegex.test(html)) {\n\t\t// Escape $ in cleanAppHtml to prevent it from being interpreted as backreferences\n\t\tconst escapedAppHtml = cleanAppHtml.replace(/\\$/g, '$$$$');\n\t\thtml = html.replace(rootDivRegex, `$1${escapedAppHtml}$4`);\n\t} else {\n\t\t// If missing, inject just before </body>\n\t\thtml = html.replace(\n\t\t\t/<\\/body>/i,\n\t\t\t`\\t\\t<div id=\"${appId}\">${cleanAppHtml}</div>\\n\\t</body>`,\n\t\t);\n\t}\n\n\t// Append hydration scripts just before </body>\n\tif (hydrationScript) {\n\t\thtml = html.replace(/<\\/body>/i, `\\t\\t${hydrationScript}\\n\\t</body>`);\n\t}\n\n\treturn html;\n}\n",
|
|
22
|
+
"import { pathToFileURL } from 'node:url';\nimport { buildHeadFromMeta } from '../../content/metadata';\nimport { join } from './path';\n\n// biome-ignore lint/suspicious/noExplicitAny: flexible types\ntype Doc = any;\n\ntype MetadataResult = {\n\tperPageHead: string;\n\tpageLang?: string;\n\tstatusOverride?: number;\n};\n\n/**\n * Extract per-page head and metadata from layouts (hierarchical), routes, and content modules\n */\nexport async function extractPageMetadata(\n\tpathname: string,\n\tclientDir: string,\n\tcwd: string,\n\tisWatchMode: boolean,\n\tcurrentStatusOverride?: number,\n): Promise<MetadataResult> {\n\tlet perPageHead = '';\n\tlet pageLang: string | undefined;\n\tlet statusOverride = currentStatusOverride;\n\n\t// 1. Extract layout metadata hierarchically (root → nested)\n\ttry {\n\t\tconst routesPath = join(cwd, '.reroute', 'routes.ts');\n\t\tconst m = await import(\n\t\t\tpathToFileURL(routesPath).href + (isWatchMode ? `?t=${Date.now()}` : '')\n\t\t);\n\t\tconst layouts = (m as Doc)?.layouts as Doc[] | undefined;\n\t\tif (Array.isArray(layouts)) {\n\t\t\t// Filter and sort layouts matching the pathname\n\t\t\tconst matchingLayouts = layouts\n\t\t\t\t.filter((layout: Doc) => {\n\t\t\t\t\tconst pattern = String(layout?.pattern || '/');\n\t\t\t\t\tif (pattern === '/') return true;\n\t\t\t\t\treturn pathname.startsWith(pattern);\n\t\t\t\t})\n\t\t\t\t.sort((a: Doc, b: Doc) => {\n\t\t\t\t\t// Sort by depth (shallow first, so root layout comes before nested)\n\t\t\t\t\tconst aDepth = String(a?.pattern || '/')\n\t\t\t\t\t\t.split('/')\n\t\t\t\t\t\t.filter(Boolean).length;\n\t\t\t\t\tconst bDepth = String(b?.pattern || '/')\n\t\t\t\t\t\t.split('/')\n\t\t\t\t\t\t.filter(Boolean).length;\n\t\t\t\t\treturn aDepth - bDepth;\n\t\t\t\t});\n\n\t\t\t// Extract metadata from each matching layout in hierarchical order\n\t\t\tfor (const layout of matchingLayouts) {\n\t\t\t\tif (typeof layout?.path === 'string') {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst abs = join(clientDir, 'routes', String(layout.path));\n\t\t\t\t\t\tconst mod = (await import(\n\t\t\t\t\t\t\tpathToFileURL(abs).href + (isWatchMode ? `?t=${Date.now()}` : '')\n\t\t\t\t\t\t)) as Doc;\n\t\t\t\t\t\tconst meta = (mod as Doc)?.meta;\n\t\t\t\t\t\tconst ssr = (mod as Doc)?.ssr as Doc | undefined;\n\t\t\t\t\t\tif (meta) perPageHead += buildHeadFromMeta(meta);\n\t\t\t\t\t\tif (ssr) {\n\t\t\t\t\t\t\tconst ssrHead =\n\t\t\t\t\t\t\t\ttypeof ssr.head === 'string'\n\t\t\t\t\t\t\t\t\t? ssr.head\n\t\t\t\t\t\t\t\t\t: Array.isArray(ssr.head)\n\t\t\t\t\t\t\t\t\t\t? String((ssr.head as unknown[]).join('\\n'))\n\t\t\t\t\t\t\t\t\t\t: '';\n\t\t\t\t\t\t\tif (ssrHead) perPageHead += `\\n${ssrHead}`;\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\ttypeof ssr.lang === 'string' &&\n\t\t\t\t\t\t\t\tssr.lang.trim() &&\n\t\t\t\t\t\t\t\t!pageLang\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\tpageLang = ssr.lang.trim();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch {}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t} catch {}\n\n\t// 2. Content page metadata\n\ttry {\n\t\tconst parts = pathname.split('/').filter(Boolean);\n\t\tif (parts.length >= 2) {\n\t\t\tconst key = `${parts[0]}:${parts[1]}`;\n\t\t\tconst g = globalThis as Doc;\n\t\t\tconst exp = g.__REROUTE_SSR_EXPORTS__?.[key] as\n\t\t\t\t| { meta?: unknown; ssr?: unknown }\n\t\t\t\t| undefined;\n\t\t\tconst meta = (exp as Doc)?.meta;\n\t\t\tconst ssr = (exp as Doc)?.ssr;\n\t\t\tperPageHead += buildHeadFromMeta(meta);\n\t\t\tconst ssrHead =\n\t\t\t\ttypeof ssr?.head === 'string'\n\t\t\t\t\t? ssr.head\n\t\t\t\t\t: Array.isArray(ssr?.head)\n\t\t\t\t\t\t? String(ssr.head.join('\\n'))\n\t\t\t\t\t\t: '';\n\t\t\tif (ssrHead) perPageHead += `\\n${ssrHead}`;\n\t\t\tif (typeof ssr?.lang === 'string' && ssr.lang.trim()) {\n\t\t\t\tpageLang = ssr.lang.trim();\n\t\t\t}\n\t\t}\n\t} catch {}\n\n\t// 3. Route-level metadata\n\ttry {\n\t\tconst routesPath = join(cwd, '.reroute', 'routes.ts');\n\t\tconst m = await import(\n\t\t\tpathToFileURL(routesPath).href + (isWatchMode ? `?t=${Date.now()}` : '')\n\t\t);\n\t\tconst match =\n\t\t\ttypeof m.matchRoute === 'function' ? m.matchRoute(pathname) : null;\n\t\tconst r = match?.route as Doc | undefined;\n\n\t\tif (!r) {\n\t\t\t// No route matched; mark as 404 for status\n\t\t\tstatusOverride = statusOverride || 404;\n\t\t}\n\n\t\tif (r && typeof r.path === 'string') {\n\t\t\ttry {\n\t\t\t\tconst abs = join(clientDir, 'routes', String(r.path));\n\t\t\t\tconst mod = (await import(\n\t\t\t\t\tpathToFileURL(abs).href + (isWatchMode ? `?t=${Date.now()}` : '')\n\t\t\t\t)) as Doc;\n\t\t\t\tconst meta = (mod as Doc)?.meta;\n\t\t\t\tconst ssr = (mod as Doc)?.ssr as Doc | undefined;\n\t\t\t\tif (meta) perPageHead += buildHeadFromMeta(meta);\n\t\t\t\tif (ssr) {\n\t\t\t\t\tconst ssrHead =\n\t\t\t\t\t\ttypeof ssr.head === 'string'\n\t\t\t\t\t\t\t? ssr.head\n\t\t\t\t\t\t\t: Array.isArray(ssr.head)\n\t\t\t\t\t\t\t\t? String((ssr.head as unknown[]).join('\\n'))\n\t\t\t\t\t\t\t\t: '';\n\t\t\t\t\tif (ssrHead) perPageHead += `\\n${ssrHead}`;\n\t\t\t\t\tif (typeof ssr.lang === 'string' && ssr.lang.trim()) {\n\t\t\t\t\t\tpageLang = ssr.lang.trim();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} catch {}\n\t\t} else {\n\t\t\t// Try to find notFound route metadata\n\t\t\ttry {\n\t\t\t\tconst list = (m as Doc)?.notFoundRoutes as Doc[] | undefined;\n\t\t\t\tif (Array.isArray(list)) {\n\t\t\t\t\t// choose most specific by longest pattern prefix\n\t\t\t\t\tlet chosen: Doc | undefined;\n\t\t\t\t\tlet bestLen = -1;\n\t\t\t\t\tfor (const nf of list) {\n\t\t\t\t\t\tconst pat = String((nf as Doc)?.pattern || '/');\n\t\t\t\t\t\tif (!pathname.startsWith(pat)) continue;\n\t\t\t\t\t\tconst len = pat.split('/').filter(Boolean).length;\n\t\t\t\t\t\tif (len >= bestLen) {\n\t\t\t\t\t\t\tbestLen = len;\n\t\t\t\t\t\t\tchosen = nf;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (chosen && typeof (chosen as Doc).path === 'string') {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst abs = join(\n\t\t\t\t\t\t\t\tclientDir,\n\t\t\t\t\t\t\t\t'routes',\n\t\t\t\t\t\t\t\tString((chosen as Doc).path),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tconst mod = (await import(\n\t\t\t\t\t\t\t\tpathToFileURL(abs).href +\n\t\t\t\t\t\t\t\t\t(isWatchMode ? `?t=${Date.now()}` : '')\n\t\t\t\t\t\t\t)) as Doc;\n\t\t\t\t\t\t\tconst meta = (mod as Doc)?.meta;\n\t\t\t\t\t\t\tconst ssr = (mod as Doc)?.ssr as Doc | undefined;\n\t\t\t\t\t\t\tif (meta) perPageHead += buildHeadFromMeta(meta);\n\t\t\t\t\t\t\tconst ssrHead =\n\t\t\t\t\t\t\t\ttypeof ssr?.head === 'string'\n\t\t\t\t\t\t\t\t\t? ssr.head\n\t\t\t\t\t\t\t\t\t: Array.isArray(ssr?.head)\n\t\t\t\t\t\t\t\t\t\t? String((ssr.head as unknown[]).join('\\n'))\n\t\t\t\t\t\t\t\t\t\t: '';\n\t\t\t\t\t\t\tif (ssrHead) perPageHead += `\\n${ssrHead}`;\n\t\t\t\t\t\t\tif (typeof ssr?.lang === 'string' && ssr.lang?.trim()) {\n\t\t\t\t\t\t\t\tpageLang = String(ssr.lang).trim();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} catch {}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} catch {}\n\t\t}\n\t} catch {}\n\n\treturn { perPageHead, pageLang, statusOverride };\n}\n\nexport type { MetadataResult };\n",
|
|
23
|
+
"import { readdir, stat } from 'node:fs/promises';\nimport { pathToFileURL } from 'node:url';\nimport { join } from './path';\n\n// biome-ignore lint/suspicious/noExplicitAny: flexible types\ntype Doc = any;\n\ntype PreloadResult = {\n\tmodulePath?: string;\n\textraHead: string;\n\thydrationScript: string;\n\tstatusOverride?: number;\n};\n\n/**\n * Handle content module preloading for content pages\n */\nexport async function preloadContentModule(\n\tpathname: string,\n\tclientDir: string,\n\tcwd: string,\n\tisWatchMode: boolean,\n): Promise<PreloadResult> {\n\tlet extraHead = '';\n\tlet hydrationScript = '';\n\tlet statusOverride: number | undefined;\n\n\ttry {\n\t\tconst parts = pathname.split('/').filter(Boolean);\n\t\tif (parts.length >= 2) {\n\t\t\tconst collection = parts[0];\n\t\t\tconst name = parts[1];\n\t\t\tlet modulePath = '';\n\n\t\t\t// Only consider this a content collection if routes/<collection>/content exists\n\t\t\tlet isContentCollection = false;\n\t\t\ttry {\n\t\t\t\tconst maybeDir = join(clientDir, 'routes', collection, 'content');\n\t\t\t\tconst s = await stat(maybeDir);\n\t\t\t\tisContentCollection =\n\t\t\t\t\ttypeof s?.isDirectory === 'function' ? s.isDirectory() : true;\n\t\t\t} catch {\n\t\t\t\tisContentCollection = false;\n\t\t\t}\n\n\t\t\tif (!isContentCollection) {\n\t\t\t\t// Not a content collection path; skip content preloading logic\n\t\t\t\tthrow new Error('skip-content-preload');\n\t\t\t}\n\n\t\t\t// Prefer registry mapping from .reroute/content.ts for exact chunk\n\t\t\ttry {\n\t\t\t\tconst registryPath = join(cwd, '.reroute', 'content.ts');\n\t\t\t\tconst reg = (await import(\n\t\t\t\t\tpathToFileURL(registryPath).href +\n\t\t\t\t\t\t(isWatchMode ? `?t=${Date.now()}` : '')\n\t\t\t\t)) as Doc;\n\t\t\t\tconst get = (reg as Doc)?.getContentEntry as\n\t\t\t\t\t| ((c: string, n: string) => { module?: string } | undefined)\n\t\t\t\t\t| undefined;\n\t\t\t\tconst entry =\n\t\t\t\t\ttypeof get === 'function' ? get(collection, name) : undefined;\n\t\t\t\tconst moduleUrl = (entry as Doc)?.module as string | undefined;\n\t\t\t\tif (moduleUrl?.endsWith('.js')) {\n\t\t\t\t\tmodulePath = moduleUrl;\n\t\t\t\t}\n\t\t\t} catch {}\n\n\t\t\t// Fallback: pick newest chunk if registry unavailable\n\t\t\tif (!modulePath) {\n\t\t\t\ttry {\n\t\t\t\t\tconst chunkDir = join(cwd, '.reroute', 'chunks', collection);\n\t\t\t\t\tconst files = await readdir(chunkDir);\n\t\t\t\t\tconst candidates = files.filter(\n\t\t\t\t\t\t(n) => n.startsWith(`${name}.`) && n.endsWith('.js'),\n\t\t\t\t\t);\n\t\t\t\t\tif (candidates.length) {\n\t\t\t\t\t\tlet latest = candidates[0];\n\t\t\t\t\t\tlet latestM = 0;\n\t\t\t\t\t\tfor (const candidateName of candidates) {\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tconst s = await stat(join(chunkDir, candidateName));\n\t\t\t\t\t\t\t\tif (s.mtimeMs >= latestM) {\n\t\t\t\t\t\t\t\t\tlatestM = s.mtimeMs;\n\t\t\t\t\t\t\t\t\tlatest = candidateName;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} catch {}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tmodulePath = `/${join('.reroute', 'chunks', collection, latest).replace(/\\\\+/g, '/')}`;\n\t\t\t\t\t}\n\t\t\t\t} catch {}\n\t\t\t}\n\n\t\t\t// Fallback to raw source if chunk missing\n\t\t\tif (!modulePath) {\n\t\t\t\tconst tsx = join(\n\t\t\t\t\tclientDir,\n\t\t\t\t\t'routes',\n\t\t\t\t\tcollection,\n\t\t\t\t\t'content',\n\t\t\t\t\t`${name}.tsx`,\n\t\t\t\t);\n\t\t\t\tconst ts = join(\n\t\t\t\t\tclientDir,\n\t\t\t\t\t'routes',\n\t\t\t\t\tcollection,\n\t\t\t\t\t'content',\n\t\t\t\t\t`${name}.ts`,\n\t\t\t\t);\n\t\t\t\tlet srcUrl = '';\n\t\t\t\tif (await Bun.file(tsx).exists()) {\n\t\t\t\t\tsrcUrl = `/${join('routes', collection, 'content', `${name}.tsx`).replace(/\\\\+/g, '/')}`;\n\t\t\t\t} else if (await Bun.file(ts).exists()) {\n\t\t\t\t\tsrcUrl = `/${join('routes', collection, 'content', `${name}.ts`).replace(/\\\\+/g, '/')}`;\n\t\t\t\t}\n\t\t\t\tif (srcUrl) {\n\t\t\t\t\tmodulePath = srcUrl;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (!modulePath) {\n\t\t\t\tstatusOverride = 404;\n\t\t\t}\n\n\t\t\tif (modulePath) {\n\t\t\t\tconst key = `${collection}:${name}`;\n\t\t\t\t// Hint the browser to fetch the module ASAP\n\t\t\t\textraHead += `\\n<link rel=\"modulepreload\" href=\"${modulePath}\" />`;\n\t\t\t\t// Ensure the module is evaluated before the main app module runs via external module\n\t\t\t\tconst qs = `src=${encodeURIComponent(modulePath)}&key=${encodeURIComponent(key)}`;\n\t\t\t\thydrationScript += `<script type=\"module\" src=\"/__reroute_preload?${qs}\"></script>`;\n\t\t\t}\n\t\t}\n\t} catch {}\n\n\treturn { modulePath: undefined, extraHead, hydrationScript, statusOverride };\n}\n\n/**\n * Reset SSR access tracking for a new request\n */\nexport function resetSSRAccessTracking(): void {\n\ttry {\n\t\t(globalThis as Doc).__REROUTE_SSR_ACCESSED__ = {} as unknown as Doc;\n\t} catch {}\n}\n\n/**\n * Create bundle preload link\n */\nexport function createBundlePreload(bundleUrl: string): string {\n\ttry {\n\t\tif (typeof bundleUrl === 'string' && bundleUrl.endsWith('.js')) {\n\t\t\treturn `\\n<link rel=\"modulepreload\" href=\"${bundleUrl}\" />`;\n\t\t}\n\t} catch {}\n\treturn '';\n}\n\nexport type { PreloadResult };\n",
|
|
24
|
+
"// biome-ignore lint/suspicious/noExplicitAny: flexible types\ntype Doc = any;\n\n/**\n * Escape JSON for safe embedding in HTML script tags\n */\nexport function escapeJsonForScript(json: string): string {\n\treturn json\n\t\t.replace(/</g, '\\\\u003c')\n\t\t.replace(/>/g, '\\\\u003e')\n\t\t.replace(/&/g, '\\\\u0026');\n}\n\n/**\n * Create inline script for SSR data\n */\nexport function createDataScript(\n\tssrData: Record<string, unknown>,\n\terrorMsg?: string,\n): string {\n\tlet script = '';\n\n\t// Add data if present\n\tif (ssrData && Object.keys(ssrData).length > 0) {\n\t\ttry {\n\t\t\tconst dataJson = escapeJsonForScript(JSON.stringify(ssrData));\n\t\t\tscript += `<script>(function(){try{var w=(typeof window!=='undefined'?window:globalThis);w.__REROUTE_DATA__=Object.assign({},w.__REROUTE_DATA__||{},${dataJson});try{w.dispatchEvent(new CustomEvent('__reroute_data__',{detail:{keys:Object.keys(${dataJson})}}));}catch(e){}}catch(e){}})();</script>`;\n\t\t} catch (error) {\n\t\t\tconsole.error('[reroute] Failed to serialize SSR data:', error);\n\t\t}\n\t}\n\n\t// Add dev warning for SSR data errors\n\tif (errorMsg) {\n\t\tconst escapedMsg = JSON.stringify(errorMsg);\n\t\tscript += `<script>(function(){try{console.warn('%c[reroute] SSR Data Error','background: #ff5555; color: white; padding: 2px 6px; border-radius: 3px;',${escapedMsg});}catch(e){}})();</script>`;\n\t}\n\n\treturn script;\n}\n\n/**\n * Create inline script for collection data\n */\nexport function createCollectionScript(\n\tsubset: Record<string, unknown[]>,\n\tpartial: Record<string, boolean>,\n): string {\n\tconst subsetJson = escapeJsonForScript(JSON.stringify(subset));\n\tconst partialJson = escapeJsonForScript(JSON.stringify(partial));\n\treturn `<script>(function(){try{var w=(typeof window!=='undefined'?window:globalThis);w.__REROUTE_COLLECTIONS__=w.__REROUTE_COLLECTIONS__||{};Object.assign(w.__REROUTE_COLLECTIONS__,${subsetJson});w.__REROUTE_COLLECTIONS_PARTIAL__=w.__REROUTE_COLLECTIONS_PARTIAL__||{};Object.assign(w.__REROUTE_COLLECTIONS_PARTIAL__,${partialJson});}catch(e){}})();</script>`;\n}\n\n/**\n * Process collections based on SSR access tracking\n */\nexport function processCollections(\n\taccessedCollections: Doc,\n\tbyCollectionForSSR: Record<string, unknown[]>,\n): { subset: Record<string, unknown[]>; partial: Record<string, boolean> } {\n\tconst sortByDate = (order: 'asc' | 'desc') => (a: Doc, b: Doc) => {\n\t\tconst da = a?.meta?.date ? Date.parse(String(a.meta.date)) : 0;\n\t\tconst db = b?.meta?.date ? Date.parse(String(b.meta.date)) : 0;\n\t\treturn order === 'asc' ? da - db : db - da;\n\t};\n\n\tconst usage: Record<string, { limit: number; sort: string }> = {};\n\tif (\n\t\taccessedCollections &&\n\t\ttypeof accessedCollections.forEach === 'function'\n\t) {\n\t\t(accessedCollections as Set<string>).forEach((c) => {\n\t\t\tif (typeof c === 'string')\n\t\t\t\tusage[c] = { limit: Number.POSITIVE_INFINITY, sort: 'custom' };\n\t\t});\n\t} else if (accessedCollections && typeof accessedCollections === 'object') {\n\t\tfor (const [k, v] of Object.entries(\n\t\t\taccessedCollections as Record<string, Doc>,\n\t\t)) {\n\t\t\tconst lim =\n\t\t\t\ttypeof v?.limit === 'number' ? v.limit : Number.POSITIVE_INFINITY;\n\t\t\tconst s = typeof v?.sort === 'string' ? v.sort : 'custom';\n\t\t\tusage[k] = { limit: lim, sort: s };\n\t\t}\n\t}\n\n\tconst collections = Object.keys(usage);\n\tconst subset: Record<string, unknown[]> = {};\n\tconst partial: Record<string, boolean> = {};\n\n\tfor (const c of collections) {\n\t\tconst conf = usage[c];\n\t\tconst full = byCollectionForSSR?.[c] || [];\n\t\tlet arr: unknown[] = full;\n\n\t\tif (\n\t\t\tNumber.isFinite(conf.limit) &&\n\t\t\tconf.limit > 0 &&\n\t\t\tconf.sort !== 'custom'\n\t\t) {\n\t\t\tif (conf.sort === 'date-desc') {\n\t\t\t\tarr = [...full].sort(sortByDate('desc')).slice(0, conf.limit);\n\t\t\t} else if (conf.sort === 'date-asc') {\n\t\t\t\tarr = [...full].sort(sortByDate('asc')).slice(0, conf.limit);\n\t\t\t} else if (conf.sort === 'none') {\n\t\t\t\tarr = full.slice(0, conf.limit);\n\t\t\t}\n\t\t}\n\n\t\tsubset[c] = arr;\n\t\tpartial[c] =\n\t\t\tArray.isArray(arr) && Array.isArray(full)\n\t\t\t\t? arr.length < full.length\n\t\t\t\t: false;\n\t}\n\n\treturn { subset, partial };\n}\n",
|
|
25
|
+
"import { join } from './path';\n\n/**\n * Find and inline Tailwind CSS from .reroute directory\n */\nexport async function inlineTailwindCSS(\n\tclientDir: string,\n\tminify = false,\n): Promise<string> {\n\ttry {\n\t\tconst candidates = [\n\t\t\tjoin(clientDir, '..', '.reroute', 'theme.css'),\n\t\t\tjoin(clientDir, '..', '..', '.reroute', 'theme.css'),\n\t\t\tjoin(clientDir, '..', '..', '..', '.reroute', 'theme.css'),\n\t\t\tjoin(clientDir, '..', '..', '..', '..', '.reroute', 'theme.css'),\n\t\t];\n\n\t\tlet cssPath = '';\n\t\tfor (const p of candidates) {\n\t\t\tif (await Bun.file(p).exists()) {\n\t\t\t\tcssPath = p;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif (!cssPath) return '';\n\n\t\tlet css = await Bun.file(cssPath).text();\n\n\t\tif (minify) {\n\t\t\t// Best-effort, safe-ish CSS minification without external deps\n\t\t\tcss = css\n\t\t\t\t// Remove /* block comments */\n\t\t\t\t.replace(/\\/\\*[\\s\\S]*?\\*\\//g, '')\n\t\t\t\t// Collapse whitespace\n\t\t\t\t.replace(/\\s+/g, ' ')\n\t\t\t\t// Remove space around selectors, braces, colons and semicolons\n\t\t\t\t.replace(/\\s*([{}:;,>+~])\\s*/g, '$1')\n\t\t\t\t// Remove final semicolons before closing brace\n\t\t\t\t.replace(/;}/g, '}')\n\t\t\t\t// Trim\n\t\t\t\t.trim();\n\t\t}\n\n\t\treturn `<style data-reroute=\"tailwind\">${css}</style>`;\n\t} catch {\n\t\treturn '';\n\t}\n}\n",
|
|
26
|
+
"function splitTemplate(html: string, appId: string = 'root'): TemplateParts {\n\t// Escape special regex characters in appId\n\tconst appIdEscaped = appId.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n\n\t// Match the root div with the specified id\n\tconst rootDivRegex = new RegExp(\n\t\t`(<div[^>]*\\\\bid=[\"']${appIdEscaped}[\"'][^>]*>)([\\\\s\\\\S]*?)(<\\\\/div>)`,\n\t\t'i',\n\t);\n\n\tconst match = html.match(rootDivRegex);\n\tif (!match || match.index === undefined) {\n\t\tthrow new Error(`Could not find app root div with id=\"${appId}\"`);\n\t}\n\n\tconst [fullMatch, rootStart, , rootEnd] = match;\n\tconst matchIndex = match.index;\n\n\treturn {\n\t\thtmlHead: html.substring(0, matchIndex),\n\t\trootStart,\n\t\trootEnd,\n\t\thtmlTail: html.substring(matchIndex + fullMatch.length),\n\t};\n}\n\ntype TemplateParts = {\n\thtmlHead: string;\n\trootStart: string;\n\trootEnd: string;\n\thtmlTail: string;\n};\n\nexport { splitTemplate };\nexport type { TemplateParts };\n",
|
|
27
|
+
"export * from './cache';\nexport * from './collections';\nexport * from './compression';\nexport * from './compute';\nexport * from './data';\nexport * from './html';\nexport * from './metadata';\nexport * from './mime';\nexport * from './modules';\nexport * from './path';\nexport * from './preload';\nexport * from './scripts';\nexport * from './seed';\nexport * from './styles';\nexport * from './template';\nexport * from './types';\n",
|
|
25
28
|
"function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\nfunction _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\nfunction _toPropertyKey(arg) { var key = _toPrimitive(arg, \"string\"); return typeof key === \"symbol\" ? key : String(key); }\nfunction _toPrimitive(input, hint) { if (typeof input !== \"object\" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || \"default\"); if (typeof res !== \"object\") return res; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (hint === \"string\" ? String : Number)(input); }\nconst dedent = createDedent({});\nexport default dedent;\nfunction createDedent(options) {\n dedent.withOptions = newOptions => createDedent(_objectSpread(_objectSpread({}, options), newOptions));\n return dedent;\n function dedent(strings, ...values) {\n const raw = typeof strings === \"string\" ? [strings] : strings.raw;\n const {\n alignValues = false,\n escapeSpecialCharacters = Array.isArray(strings),\n trimWhitespace = true\n } = options;\n\n // first, perform interpolation\n let result = \"\";\n for (let i = 0; i < raw.length; i++) {\n let next = raw[i];\n if (escapeSpecialCharacters) {\n // handle escaped newlines, backticks, and interpolation characters\n next = next.replace(/\\\\\\n[ \\t]*/g, \"\").replace(/\\\\`/g, \"`\").replace(/\\\\\\$/g, \"$\").replace(/\\\\\\{/g, \"{\");\n }\n result += next;\n if (i < values.length) {\n const value = alignValues ? alignValue(values[i], result) : values[i];\n\n // eslint-disable-next-line @typescript-eslint/restrict-plus-operands\n result += value;\n }\n }\n\n // now strip indentation\n const lines = result.split(\"\\n\");\n let mindent = null;\n for (const l of lines) {\n const m = l.match(/^(\\s+)\\S+/);\n if (m) {\n const indent = m[1].length;\n if (!mindent) {\n // this is the first indented line\n mindent = indent;\n } else {\n mindent = Math.min(mindent, indent);\n }\n }\n }\n if (mindent !== null) {\n const m = mindent; // appease TypeScript\n result = lines\n // https://github.com/typescript-eslint/typescript-eslint/issues/7140\n // eslint-disable-next-line @typescript-eslint/prefer-string-starts-ends-with\n .map(l => l[0] === \" \" || l[0] === \"\\t\" ? l.slice(m) : l).join(\"\\n\");\n }\n\n // dedent eats leading and trailing whitespace too\n if (trimWhitespace) {\n result = result.trim();\n }\n\n // handle escaped newlines at the end to ensure they don't get stripped too\n if (escapeSpecialCharacters) {\n result = result.replace(/\\\\n/g, \"\\n\");\n }\n return result;\n }\n}\n\n/**\n * Adjusts the indentation of a multi-line interpolated value to match the current line.\n */\nfunction alignValue(value, precedingText) {\n if (typeof value !== \"string\" || !value.includes(\"\\n\")) {\n return value;\n }\n const currentLine = precedingText.slice(precedingText.lastIndexOf(\"\\n\") + 1);\n const indentMatch = currentLine.match(/^(\\s+)/);\n if (indentMatch) {\n const indent = indentMatch[1];\n return value.replace(/\\n/g, `\\n${indent}`);\n }\n return value;\n}\n",
|
|
26
|
-
"import
|
|
27
|
-
"
|
|
28
|
-
"import { readdir, stat } from 'node:fs/promises';\nimport { pathToFileURL } from 'node:url';\nimport dedent from 'dedent';\nimport { cloneElement, type ReactElement } from 'react';\nimport { renderToString } from 'react-dom/server';\nimport { buildHeadFromMeta } from '../content/metadata';\nimport { applyIndexTemplate, loadIndexHtml } from '../template';\nimport type { Doc } from '../types';\nimport { join } from '../utils/path';\nimport { seedSSRModuleForPath } from './seed';\n\ntype SSRRenderOptions = {\n\tpathname: string;\n\trootComponent: ReactElement;\n\tclientDir: string;\n\tcwd: string;\n\tisWatchMode: boolean;\n\tbundleUrl: string;\n\thead?: string;\n\tlang?: string;\n\tappId?: string;\n\t// When true, also attempt to minify inlined assets like CSS\n\tminify?: boolean;\n};\n\ntype SSRRenderResult = {\n\thtml: string;\n\tstatus: number;\n};\n\nasync function renderSSRDocument(\n\toptions: SSRRenderOptions,\n): Promise<SSRRenderResult> {\n\tconst {\n\t\tpathname,\n\t\trootComponent,\n\t\tclientDir,\n\t\tcwd,\n\t\tisWatchMode,\n\t\tbundleUrl,\n\t\thead = '',\n\t\tlang = 'en',\n\t\tappId = 'root',\n\t\tminify = false,\n\t} = options;\n\n\tconst scripts = [bundleUrl];\n\tlet hydrationScript = '';\n\tlet extraHead = '';\n\n\t// Preload the main client entry for earlier fetch start\n\ttry {\n\t\tif (typeof bundleUrl === 'string' && bundleUrl.endsWith('.js')) {\n\t\t\textraHead += `\\n<link rel=\"modulepreload\" href=\"${bundleUrl}\" />`;\n\t\t}\n\t} catch {}\n\n\t// Track HTTP status override (e.g., 404 when content entry missing)\n\tlet statusOverride: number | undefined;\n\n\t// Reset per-request SSR access tracking to avoid cross-request leakage\n\t// Shape: { [collection]: { limit: number|Infinity, sort: 'date-desc'|'date-asc'|'none'|'custom' } }\n\ttry {\n\t\t(globalThis as Doc).__REROUTE_SSR_ACCESSED__ = {} as unknown as Doc;\n\t} catch {}\n\n\t// If current page is a content page (/collection/name) AND the collection exists,\n\t// preload its module for instant hydration. Avoid treating non-content dynamic\n\t// routes (e.g., /products/19) as missing content, which would set 404.\n\ttry {\n\t\tconst parts = pathname.split('/').filter(Boolean);\n\t\tif (parts.length >= 2) {\n\t\t\tconst collection = parts[0];\n\t\t\tconst name = parts[1];\n\t\t\tlet modulePath = '';\n\n\t\t\t// Only consider this a content collection if routes/<collection>/content exists\n\t\t\tlet isContentCollection = false;\n\t\t\ttry {\n\t\t\t\tconst maybeDir = join(clientDir, 'routes', collection, 'content');\n\t\t\t\tconst s = await stat(maybeDir);\n\t\t\t\tisContentCollection =\n\t\t\t\t\ttypeof s?.isDirectory === 'function' ? s.isDirectory() : true;\n\t\t\t} catch {\n\t\t\t\tisContentCollection = false;\n\t\t\t}\n\n\t\t\tif (!isContentCollection) {\n\t\t\t\t// Not a content collection path; skip content preloading logic\n\t\t\t\t// to avoid incorrectly marking the request as 404.\n\t\t\t\tthrow new Error('skip-content-preload');\n\t\t\t}\n\n\t\t\t// Prefer registry mapping from .reroute/content.ts for exact chunk\n\t\t\ttry {\n\t\t\t\tconst registryPath = join(cwd, '.reroute', 'content.ts');\n\t\t\t\tconst reg = (await import(\n\t\t\t\t\tpathToFileURL(registryPath).href +\n\t\t\t\t\t\t(isWatchMode ? `?t=${Date.now()}` : '')\n\t\t\t\t)) as Doc;\n\t\t\t\tconst get = (reg as Doc)?.getContentEntry as\n\t\t\t\t\t| ((c: string, n: string) => { module?: string } | undefined)\n\t\t\t\t\t| undefined;\n\t\t\t\tconst entry =\n\t\t\t\t\ttypeof get === 'function' ? get(collection, name) : undefined;\n\t\t\t\tconst moduleUrl = (entry as Doc)?.module as string | undefined;\n\t\t\t\tif (moduleUrl?.endsWith('.js')) {\n\t\t\t\t\tmodulePath = moduleUrl;\n\t\t\t\t}\n\t\t\t} catch {}\n\n\t\t\t// Fallback: pick newest chunk if registry unavailable\n\t\t\tif (!modulePath) {\n\t\t\t\ttry {\n\t\t\t\t\tconst chunkDir = join(cwd, '.reroute', 'chunks', collection);\n\t\t\t\t\tconst files = await readdir(chunkDir);\n\t\t\t\t\tconst candidates = files.filter(\n\t\t\t\t\t\t(n) => n.startsWith(`${name}.`) && n.endsWith('.js'),\n\t\t\t\t\t);\n\t\t\t\t\tif (candidates.length) {\n\t\t\t\t\t\tlet latest = candidates[0];\n\t\t\t\t\t\tlet latestM = 0;\n\t\t\t\t\t\tfor (const candidateName of candidates) {\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tconst s = await stat(join(chunkDir, candidateName));\n\t\t\t\t\t\t\t\tif (s.mtimeMs >= latestM) {\n\t\t\t\t\t\t\t\t\tlatestM = s.mtimeMs;\n\t\t\t\t\t\t\t\t\tlatest = candidateName;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} catch {}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tmodulePath = `/${join('.reroute', 'chunks', collection, latest).replace(/\\\\+/g, '/')}`;\n\t\t\t\t\t}\n\t\t\t\t} catch {}\n\t\t\t}\n\n\t\t\t// Fallback to raw source if chunk missing\n\t\t\tif (!modulePath) {\n\t\t\t\tconst tsx = join(\n\t\t\t\t\tclientDir,\n\t\t\t\t\t'routes',\n\t\t\t\t\tcollection,\n\t\t\t\t\t'content',\n\t\t\t\t\t`${name}.tsx`,\n\t\t\t\t);\n\t\t\t\tconst ts = join(\n\t\t\t\t\tclientDir,\n\t\t\t\t\t'routes',\n\t\t\t\t\tcollection,\n\t\t\t\t\t'content',\n\t\t\t\t\t`${name}.ts`,\n\t\t\t\t);\n\t\t\t\tlet srcUrl = '';\n\t\t\t\tif (await Bun.file(tsx).exists()) {\n\t\t\t\t\tsrcUrl = `/${join('routes', collection, 'content', `${name}.tsx`).replace(/\\\\+/g, '/')}`;\n\t\t\t\t} else if (await Bun.file(ts).exists()) {\n\t\t\t\t\tsrcUrl = `/${join('routes', collection, 'content', `${name}.ts`).replace(/\\\\+/g, '/')}`;\n\t\t\t\t}\n\t\t\t\tif (srcUrl) {\n\t\t\t\t\tmodulePath = srcUrl;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (!modulePath) {\n\t\t\t\tstatusOverride = 404;\n\t\t\t}\n\n\t\t\tif (modulePath) {\n\t\t\t\tconst key = `${collection}:${name}`;\n\t\t\t\t// Hint the browser to fetch the module ASAP\n\t\t\t\textraHead += `\\n<link rel=\"modulepreload\" href=\"${modulePath}\" />`;\n\t\t\t\t// Ensure the module is evaluated before the main app module runs via external module\n\t\t\t\tconst qs = `src=${encodeURIComponent(modulePath)}&key=${encodeURIComponent(key)}`;\n\t\t\t\thydrationScript += `<script type=\"module\" src=\"/__reroute_preload?${qs}\"></script>`;\n\t\t\t}\n\t\t}\n\t} catch {}\n\n\t// Seed SSR store with content component so BlogPost can render on server\n\tawait seedSSRModuleForPath(pathname, clientDir, cwd, isWatchMode);\n\n\t// Route component module preload removed to avoid extra requests.\n\n\t// Execute optional route/content ssr.data and expose per-request store\n\tconst __SSR_DATA__: Record<string, unknown> = {};\n\ttry {\n\t\t// Content page ssr.data exported from the content module (if any)\n\t\ttry {\n\t\t\tconst parts = pathname.split('/').filter(Boolean);\n\t\t\tif (parts.length >= 2) {\n\t\t\t\tconst g = globalThis as Doc;\n\t\t\t\tconst key = `${parts[0]}:${parts[1]}`;\n\t\t\t\tconst exp = g.__REROUTE_SSR_EXPORTS__?.[key] as\n\t\t\t\t\t| { ssr?: { data?: (ctx: Doc) => unknown | Promise<unknown> } }\n\t\t\t\t\t| undefined;\n\t\t\t\tconst dataFn = (exp as Doc)?.ssr?.data as\n\t\t\t\t\t| ((ctx: Doc) => unknown | Promise<unknown>)\n\t\t\t\t\t| undefined;\n\t\t\t\tif (typeof dataFn === 'function') {\n\t\t\t\t\tconst out = await dataFn({\n\t\t\t\t\t\tpathname,\n\t\t\t\t\t\tparams: { name: parts[1] },\n\t\t\t\t\t} as Doc);\n\t\t\t\t\t__SSR_DATA__[pathname] = out as unknown;\n\t\t\t\t}\n\t\t\t}\n\t\t} catch {}\n\n\t\t// Route-level ssr.data from route module (non-content routes)\n\t\ttry {\n\t\t\tconst routesPath = join(cwd, '.reroute', 'routes.ts');\n\t\t\tconst m = await import(\n\t\t\t\tpathToFileURL(routesPath).href + (isWatchMode ? `?t=${Date.now()}` : '')\n\t\t\t);\n\t\t\tconst match =\n\t\t\t\ttypeof m.matchRoute === 'function' ? m.matchRoute(pathname) : null;\n\t\t\tconst r = match?.route as Doc | undefined;\n\t\t\tconst params = (match?.params || {}) as Record<string, string>;\n\n\t\t\tif (r && typeof r.path === 'string') {\n\t\t\t\ttry {\n\t\t\t\t\tconst abs = join(clientDir, 'routes', String(r.path));\n\t\t\t\t\tconst mod = (await import(\n\t\t\t\t\t\tpathToFileURL(abs).href + (isWatchMode ? `?t=${Date.now()}` : '')\n\t\t\t\t\t)) as Doc;\n\t\t\t\t\tconst ssr = (mod as Doc)?.ssr as Doc | undefined;\n\t\t\t\t\tconst dataFn = (ssr as Doc)?.data as\n\t\t\t\t\t\t| ((ctx: Doc) => unknown | Promise<unknown>)\n\t\t\t\t\t\t| undefined;\n\t\t\t\t\tif (typeof dataFn === 'function') {\n\t\t\t\t\t\tconst out = await dataFn({ pathname, params } as Doc);\n\t\t\t\t\t\t__SSR_DATA__[pathname] = out as unknown;\n\t\t\t\t\t}\n\t\t\t\t} catch {}\n\t\t\t}\n\t\t} catch {}\n\t} catch {}\n\n\ttry {\n\t\t(globalThis as Doc).__REROUTE_DATA__ = __SSR_DATA__ as Doc;\n\t} catch {}\n\n\t// Seed content collections on the server for SSR rendering (no client delivery yet).\n\t// We'll only inline the collections actually accessed during this render, captured\n\t// via the hook-level tracker.\n\tlet __byCollectionForSSR: Record<string, unknown[]> = {};\n\ttry {\n\t\tconst p = join(cwd, '.reroute', 'content.ts');\n\t\tconst mod = await import(\n\t\t\tpathToFileURL(p).href + (isWatchMode ? `?t=${Date.now()}` : '')\n\t\t);\n\t\t__byCollectionForSSR = ((mod as Doc)?.byCollection || {}) as Record<\n\t\t\tstring,\n\t\t\tunknown[]\n\t\t>;\n\t\ttry {\n\t\t\t(globalThis as Doc).__REROUTE_COLLECTIONS__ = __byCollectionForSSR as Doc;\n\t\t} catch {}\n\t} catch {}\n\n\t// (moved) Entry + dev watcher scripts are appended later, after we inline\n\t// any accessed collections so data is available before app boot.\n\n\tconst componentWithPathname = cloneElement<Doc>(rootComponent, {\n\t\tpathname,\n\t});\n\tconst appHtml = renderToString(componentWithPathname);\n\tconst baseTemplate = await loadIndexHtml(clientDir);\n\n\t// Inline compiled Tailwind CSS output if present (generated by CLI):\n\t// Prefer theme.css relative to clientDir (e.g., src/client/theme.css -> ../../.reroute/theme.css)\n\tlet inlineStyleTag = '';\n\ttry {\n\t\tconst candidates = [\n\t\t\tjoin(clientDir, '..', '.reroute', 'theme.css'),\n\t\t\tjoin(clientDir, '..', '..', '.reroute', 'theme.css'),\n\t\t\tjoin(clientDir, '..', '..', '..', '.reroute', 'theme.css'),\n\t\t\tjoin(clientDir, '..', '..', '..', '..', '.reroute', 'theme.css'),\n\t\t];\n\t\tlet cssPath = '';\n\t\tfor (const p of candidates) {\n\t\t\tif (await Bun.file(p).exists()) {\n\t\t\t\tcssPath = p;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif (cssPath) {\n\t\t\tlet css = await Bun.file(cssPath).text();\n\t\t\tif (minify) {\n\t\t\t\t// Best-effort, safe-ish CSS minification without external deps\n\t\t\t\tcss = css\n\t\t\t\t\t// Remove /* block comments */\n\t\t\t\t\t.replace(/\\/\\*[\\s\\S]*?\\*\\//g, '')\n\t\t\t\t\t// Collapse whitespace\n\t\t\t\t\t.replace(/\\s+/g, ' ')\n\t\t\t\t\t// Remove space around selectors, braces, colons and semicolons\n\t\t\t\t\t.replace(/\\s*([{}:;,>+~])\\s*/g, '$1')\n\t\t\t\t\t// Remove final semicolons before closing brace\n\t\t\t\t\t.replace(/;}/g, '}')\n\t\t\t\t\t// Trim\n\t\t\t\t\t.trim();\n\t\t\t}\n\t\t\tinlineStyleTag = `<style data-reroute=\"tailwind\">${css}</style>`;\n\t\t}\n\t} catch {}\n\n\t// After rendering, inline only the content collections that were actually\n\t// accessed during this SSR render. This preserves SSR for static routes that\n\t// use useContent(), while avoiding shipping the entire content index to pages\n\t// that don't need it (e.g., a single post entry without lists).\n\ttry {\n\t\tconst g = globalThis as unknown as { __REROUTE_SSR_ACCESSED__?: unknown };\n\t\tconst acc = g.__REROUTE_SSR_ACCESSED__ as Doc;\n\n\t\t// Helper for date ordering\n\t\tconst sortByDate = (order: 'asc' | 'desc') => (a: Doc, b: Doc) => {\n\t\t\tconst da = a?.meta?.date ? Date.parse(String(a.meta.date)) : 0;\n\t\t\tconst db = b?.meta?.date ? Date.parse(String(b.meta.date)) : 0;\n\t\t\treturn order === 'asc' ? da - db : db - da;\n\t\t};\n\n\t\t// Normalize tracker into a map of collection -> { limit, sort }\n\t\tconst usage: Record<string, { limit: number; sort: string }> = {};\n\t\tif (acc && typeof acc.forEach === 'function') {\n\t\t\t// Back-compat with old Set<string> form: treat as full list\n\t\t\t(acc as Set<string>).forEach((c) => {\n\t\t\t\tif (typeof c === 'string')\n\t\t\t\t\tusage[c] = { limit: Number.POSITIVE_INFINITY, sort: 'custom' };\n\t\t\t});\n\t\t} else if (acc && typeof acc === 'object') {\n\t\t\tfor (const [k, v] of Object.entries(acc as Record<string, Doc>)) {\n\t\t\t\tconst lim =\n\t\t\t\t\ttypeof v?.limit === 'number' ? v.limit : Number.POSITIVE_INFINITY;\n\t\t\t\tconst s = typeof v?.sort === 'string' ? v.sort : 'custom';\n\t\t\t\tusage[k] = { limit: lim, sort: s };\n\t\t\t}\n\t\t}\n\n\t\tconst collections = Object.keys(usage);\n\t\tif (collections.length) {\n\t\t\tconst subset: Record<string, unknown[]> = {};\n\t\t\tconst partial: Record<string, boolean> = {};\n\t\t\tfor (const c of collections) {\n\t\t\t\tconst conf = usage[c];\n\t\t\t\tconst full = __byCollectionForSSR?.[c] || [];\n\t\t\t\tlet arr: unknown[] = full;\n\t\t\t\tif (\n\t\t\t\t\tNumber.isFinite(conf.limit) &&\n\t\t\t\t\tconf.limit > 0 &&\n\t\t\t\t\tconf.sort !== 'custom'\n\t\t\t\t) {\n\t\t\t\t\tif (conf.sort === 'date-desc') {\n\t\t\t\t\t\tarr = [...full].sort(sortByDate('desc')).slice(0, conf.limit);\n\t\t\t\t\t} else if (conf.sort === 'date-asc') {\n\t\t\t\t\t\tarr = [...full].sort(sortByDate('asc')).slice(0, conf.limit);\n\t\t\t\t\t} else if (conf.sort === 'none') {\n\t\t\t\t\t\tarr = full.slice(0, conf.limit);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tsubset[c] = arr;\n\t\t\t\tpartial[c] =\n\t\t\t\t\tArray.isArray(arr) && Array.isArray(full)\n\t\t\t\t\t\t? arr.length < full.length\n\t\t\t\t\t\t: false;\n\t\t\t}\n\t\t\tconst subsetJson = JSON.stringify(subset);\n\t\t\tconst partialJson = JSON.stringify(partial);\n\t\t\thydrationScript += `\\n<script>\\n (function(){ try {\\n var w = (typeof window!== 'undefined'? window : globalThis);\\n w.__REROUTE_COLLECTIONS__ = w.__REROUTE_COLLECTIONS__ || {};\\n Object.assign(w.__REROUTE_COLLECTIONS__, ${subsetJson});\\n w.__REROUTE_COLLECTIONS_PARTIAL__ = w.__REROUTE_COLLECTIONS_PARTIAL__ || {};\\n Object.assign(w.__REROUTE_COLLECTIONS_PARTIAL__, ${partialJson});\\n } catch(e){} })();\\n</script>`;\n\t\t}\n\t} catch {}\n\n\t// Inline SSR data before client entry loads\n\ttry {\n\t\tconst seededJson = JSON.stringify(__SSR_DATA__);\n\t\thydrationScript += `\\n<script>\\n (function(){ try {\\n var w = (typeof window!== 'undefined'? window : globalThis);\\n w.__REROUTE_DATA__ = Object.assign({}, w.__REROUTE_DATA__ || {}, ${seededJson});\\n } catch(e){} })();\\n</script>`;\n\t} catch {}\n\n\t// Append client entry module only after inlining accessed collections\n\thydrationScript += scripts\n\t\t.map((src) => `<script type=\"module\" src=\"${src}\"></script>`)\n\t\t.join('');\n\n\t// (Dev) Load live reload module (no inline script)\n\tif (isWatchMode) {\n\t\thydrationScript += `<script type=\"module\" src=\"/__reroute_watch.js\"></script>`;\n\t}\n\n\t// Derive per-page head from exported meta/ssr if available\n\tlet perPageHead = '';\n\tlet pageLang: string | undefined;\n\ttry {\n\t\tconst parts = pathname.split('/').filter(Boolean);\n\t\tif (parts.length >= 2) {\n\t\t\tconst key = `${parts[0]}:${parts[1]}`;\n\t\t\tconst g = globalThis as Doc;\n\t\t\tconst exp = g.__REROUTE_SSR_EXPORTS__?.[key] as\n\t\t\t\t| { meta?: unknown; ssr?: unknown }\n\t\t\t\t| undefined;\n\t\t\tconst meta = (exp as Doc)?.meta;\n\t\t\tconst ssr = (exp as Doc)?.ssr;\n\t\t\tperPageHead += buildHeadFromMeta(meta);\n\t\t\tconst ssrHead =\n\t\t\t\ttypeof ssr?.head === 'string'\n\t\t\t\t\t? ssr.head\n\t\t\t\t\t: Array.isArray(ssr?.head)\n\t\t\t\t\t\t? String(ssr.head.join('\\n'))\n\t\t\t\t\t\t: '';\n\t\t\tif (ssrHead) perPageHead += `\\n${ssrHead}`;\n\t\t\tif (typeof ssr?.lang === 'string' && ssr.lang.trim()) {\n\t\t\t\tpageLang = ssr.lang.trim();\n\t\t\t}\n\t\t}\n\t} catch {}\n\n\t// Additionally, import the matched route module to apply route-level meta/ssr for non-content routes\n\ttry {\n\t\tconst routesPath = join(cwd, '.reroute', 'routes.ts');\n\t\tconst m = await import(\n\t\t\tpathToFileURL(routesPath).href + (isWatchMode ? `?t=${Date.now()}` : '')\n\t\t);\n\t\tconst match =\n\t\t\ttypeof m.matchRoute === 'function' ? m.matchRoute(pathname) : null;\n\t\tconst r = match?.route as Doc | undefined;\n\t\tif (!r) {\n\t\t\t// No route matched; mark as 404 for status\n\t\t\tstatusOverride = statusOverride || 404;\n\t\t}\n\t\tif (r && typeof r.path === 'string') {\n\t\t\ttry {\n\t\t\t\tconst abs = join(clientDir, 'routes', String(r.path));\n\t\t\t\tconst mod = (await import(\n\t\t\t\t\tpathToFileURL(abs).href + (isWatchMode ? `?t=${Date.now()}` : '')\n\t\t\t\t)) as Doc;\n\t\t\t\tconst meta = (mod as Doc)?.meta;\n\t\t\t\tconst ssr = (mod as Doc)?.ssr as Doc | undefined;\n\t\t\t\tif (meta) perPageHead += buildHeadFromMeta(meta);\n\t\t\t\tif (ssr) {\n\t\t\t\t\tconst ssrHead =\n\t\t\t\t\t\ttypeof ssr.head === 'string'\n\t\t\t\t\t\t\t? ssr.head\n\t\t\t\t\t\t\t: Array.isArray(ssr.head)\n\t\t\t\t\t\t\t\t? String((ssr.head as unknown[]).join('\\n'))\n\t\t\t\t\t\t\t\t: '';\n\t\t\t\t\tif (ssrHead) perPageHead += `\\n${ssrHead}`;\n\t\t\t\t\tif (typeof ssr.lang === 'string' && ssr.lang.trim()) {\n\t\t\t\t\t\tpageLang = ssr.lang.trim();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} catch {}\n\t\t\t// If route matched but we will render a custom 404 (e.g., content missing),\n\t\t\t// try to also apply the closest notFound meta if available.\n\t\t} else {\n\t\t\ttry {\n\t\t\t\tconst list = (m as Doc)?.notFoundRoutes as Doc[] | undefined;\n\t\t\t\tif (Array.isArray(list)) {\n\t\t\t\t\t// choose most specific by longest pattern prefix\n\t\t\t\t\tlet chosen: Doc | undefined;\n\t\t\t\t\tlet bestLen = -1;\n\t\t\t\t\tfor (const nf of list) {\n\t\t\t\t\t\tconst pat = String((nf as Doc)?.pattern || '/');\n\t\t\t\t\t\tif (!pathname.startsWith(pat)) continue;\n\t\t\t\t\t\tconst len = pat.split('/').filter(Boolean).length;\n\t\t\t\t\t\tif (len >= bestLen) {\n\t\t\t\t\t\t\tbestLen = len;\n\t\t\t\t\t\t\tchosen = nf;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (chosen && typeof (chosen as Doc).path === 'string') {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst abs = join(\n\t\t\t\t\t\t\t\tclientDir,\n\t\t\t\t\t\t\t\t'routes',\n\t\t\t\t\t\t\t\tString((chosen as Doc).path),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tconst mod = (await import(\n\t\t\t\t\t\t\t\tpathToFileURL(abs).href +\n\t\t\t\t\t\t\t\t\t(isWatchMode ? `?t=${Date.now()}` : '')\n\t\t\t\t\t\t\t)) as Doc;\n\t\t\t\t\t\t\tconst meta = (mod as Doc)?.meta;\n\t\t\t\t\t\t\tconst ssr = (mod as Doc)?.ssr as Doc | undefined;\n\t\t\t\t\t\t\tif (meta) perPageHead += buildHeadFromMeta(meta);\n\t\t\t\t\t\t\tconst ssrHead =\n\t\t\t\t\t\t\t\ttypeof ssr?.head === 'string'\n\t\t\t\t\t\t\t\t\t? ssr.head\n\t\t\t\t\t\t\t\t\t: Array.isArray(ssr?.head)\n\t\t\t\t\t\t\t\t\t\t? String((ssr.head as unknown[]).join('\\n'))\n\t\t\t\t\t\t\t\t\t\t: '';\n\t\t\t\t\t\t\tif (ssrHead) perPageHead += `\\n${ssrHead}`;\n\t\t\t\t\t\t\tif (typeof ssr?.lang === 'string' && ssr.lang?.trim()) {\n\t\t\t\t\t\t\t\tpageLang = String(ssr.lang).trim();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} catch {}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} catch {}\n\t\t}\n\t} catch {}\n\n\tconst combinedHead = dedent(\n\t\t[dedent(head) || '', dedent(extraHead), dedent(perPageHead)]\n\t\t\t.filter(Boolean)\n\t\t\t.join('\\n'),\n\t);\n\tconst html = applyIndexTemplate(baseTemplate, appHtml, {\n\t\thead: [inlineStyleTag, combinedHead].filter(Boolean).join('\\n'),\n\t\thydrationScript,\n\t\tlang: pageLang || lang,\n\t\tappId,\n\t});\n\n\treturn {\n\t\thtml,\n\t\tstatus: statusOverride || 200,\n\t};\n}\n\nexport { renderSSRDocument, type SSRRenderOptions, type SSRRenderResult };\n",
|
|
29
|
-
"export * from './
|
|
30
|
-
"class LRUCache<K, V> {\n\tprivate cache: Map<K, V>;\n\tprivate maxSize: number;\n\n\tconstructor(maxSize: number = 100) {\n\t\tthis.cache = new Map();\n\t\tthis.maxSize = maxSize;\n\t}\n\n\tget(key: K): V | undefined {\n\t\tif (!this.cache.has(key)) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\t// Move to end (most recently used)\n\t\t// biome-ignore lint/style/noNonNullAssertion: it's all good\n\t\tconst value = this.cache.get(key)!;\n\t\tthis.cache.delete(key);\n\t\tthis.cache.set(key, value);\n\n\t\treturn value;\n\t}\n\n\tset(key: K, value: V): void {\n\t\t// Delete if exists to reinsert at end\n\t\tif (this.cache.has(key)) {\n\t\t\tthis.cache.delete(key);\n\t\t}\n\n\t\tthis.cache.set(key, value);\n\n\t\t// Evict least recently used if over size\n\t\tif (this.cache.size > this.maxSize) {\n\t\t\tconst firstKey = this.cache.keys().next().value;\n\t\t\tthis.cache.delete(firstKey as K);\n\t\t}\n\t}\n\n\thas(key: K): boolean {\n\t\treturn this.cache.has(key);\n\t}\n\n\tclear(): void {\n\t\tthis.cache.clear();\n\t}\n\n\tget size(): number {\n\t\treturn this.cache.size;\n\t}\n}\n\nexport { LRUCache };\n",
|
|
31
|
-
"export function getMimeType(filePath: string): string {\n\tconst ext = filePath.split('.').pop()?.toLowerCase();\n\tconst mimeTypes: Record<string, string> = {\n\t\thtml: 'text/html',\n\t\tcss: 'text/css',\n\t\tjs: 'application/javascript',\n\t\tts: 'application/javascript',\n\t\tjson: 'application/json',\n\t\tpng: 'image/png',\n\t\tjpg: 'image/jpeg',\n\t\tjpeg: 'image/jpeg',\n\t\tgif: 'image/gif',\n\t\tsvg: 'image/svg+xml',\n\t\tico: 'image/x-icon',\n\t\twoff: 'font/woff',\n\t\twoff2: 'font/woff2',\n\t\tttf: 'font/ttf',\n\t};\n\treturn mimeTypes[ext || ''] || 'application/octet-stream';\n}\n\nexport function isCompressible(contentType: string): boolean {\n\tif (!contentType) return false;\n\tconst ct = contentType.split(';')[0].trim();\n\treturn (\n\t\tct.startsWith('text/') ||\n\t\tct === 'application/javascript' ||\n\t\tct === 'application/json' ||\n\t\tct === 'application/xml' ||\n\t\tct === 'image/svg+xml'\n\t);\n}\n",
|
|
32
|
-
"import { brotliCompressSync } from 'node:zlib';\nimport type { CompressionResult } from '../types';\nimport { isCompressible } from './mime';\n\nexport function acceptsGzip(acceptEncoding?: string): boolean {\n\treturn Boolean(acceptEncoding && /gzip/i.test(acceptEncoding));\n}\n\nexport function acceptsBrotli(acceptEncoding?: string): boolean {\n\treturn Boolean(acceptEncoding && /\\bbr\\b/i.test(acceptEncoding));\n}\n\nexport function toBytes(\n\tinput: string | Uint8Array,\n): Uint8Array<ArrayBuffer> | string {\n\treturn typeof input === 'string'\n\t\t? new TextEncoder().encode(input)\n\t\t: (input as Uint8Array<ArrayBuffer>);\n}\n\nexport function gzipIfAccepted(\n\tbody: string | Uint8Array,\n\tcontentType: string,\n\tacceptEncoding?: string,\n): CompressionResult {\n\tconst extraHeaders: Record<string, string> = {};\n\tif (isCompressible(contentType)) {\n\t\t// Prefer Brotli if supported by the client\n\t\tif (acceptsBrotli(acceptEncoding)) {\n\t\t\ttry {\n\t\t\t\t// Bun doesn't have native brotli sync API, use Node.js zlib\n\t\t\t\tconst compressed = brotliCompressSync(toBytes(body) as Uint8Array);\n\t\t\t\textraHeaders['Content-Encoding'] = 'br';\n\t\t\t\textraHeaders.Vary = 'Accept-Encoding';\n\t\t\t\treturn { body: compressed, extraHeaders };\n\t\t\t} catch {\n\t\t\t\t// ignore and fallthrough to gzip\n\t\t\t}\n\t\t}\n\t\t// Fallback to gzip\n\t\tif (acceptsGzip(acceptEncoding)) {\n\t\t\ttry {\n\t\t\t\tconst compressed = Bun.gzipSync(toBytes(body));\n\t\t\t\textraHeaders['Content-Encoding'] = 'gzip';\n\t\t\t\textraHeaders.Vary = 'Accept-Encoding';\n\t\t\t\treturn { body: compressed, extraHeaders };\n\t\t\t} catch {\n\t\t\t\t// ignore and fallthrough\n\t\t\t}\n\t\t}\n\t}\n\treturn { body, extraHeaders };\n}\n",
|
|
33
|
-
"export * from './cache';\nexport * from './compression';\nexport * from './mime';\nexport * from './path';\n",
|
|
34
|
-
"// Bundler\nexport * from './bundler';\n// Content\nexport * from './content';\n// SSR\nexport * from './ssr';\n// Template\nexport * from './template';\nexport * from './types';\n\n// Utils\nexport * from './utils';\n",
|
|
29
|
+
"import dedent from 'dedent';\nimport { cloneElement, type ReactElement } from 'react';\nimport { renderToString } from 'react-dom/server';\nimport { applyIndexTemplate, loadIndexHtml } from './lib';\nimport { loadCollections, setGlobalCollections } from './lib/collections';\nimport { computeSSRData, setGlobalSSRData } from './lib/compute';\nimport { extractPageMetadata } from './lib/metadata';\nimport {\n\tcreateBundlePreload,\n\tpreloadContentModule,\n\tresetSSRAccessTracking,\n} from './lib/preload';\nimport {\n\tcreateCollectionScript,\n\tcreateDataScript,\n\tprocessCollections,\n} from './lib/scripts';\nimport { seedSSRModuleForPath } from './lib/seed';\nimport { inlineTailwindCSS } from './lib/styles';\nimport type { Doc } from './lib/types';\n\ntype SSRRenderOptions = {\n\tpathname: string;\n\trootComponent: ReactElement;\n\tclientDir: string;\n\tcwd: string;\n\tisWatchMode: boolean;\n\tbundleUrl: string;\n\thead?: string;\n\tlang?: string;\n\tappId?: string;\n\t// When true, also attempt to minify inlined assets like CSS\n\tminify?: boolean;\n\tmaxAge?: number;\n};\n\ntype SSRRenderResult = {\n\thtml: string;\n\tstatus: number;\n};\n\nasync function renderSSRDocument(\n\toptions: SSRRenderOptions,\n): Promise<SSRRenderResult> {\n\tconst {\n\t\tpathname,\n\t\trootComponent,\n\t\tclientDir,\n\t\tcwd,\n\t\tisWatchMode,\n\t\tbundleUrl,\n\t\thead = '',\n\t\tlang = 'en',\n\t\tappId = 'root',\n\t\tminify = false,\n\t\tmaxAge = 0,\n\t} = options;\n\n\tconst scripts = [bundleUrl];\n\n\t// Content module preloading\n\tresetSSRAccessTracking();\n\tconst bundlePreload = createBundlePreload(bundleUrl);\n\tconst preloadResult = await preloadContentModule(\n\t\tpathname,\n\t\tclientDir,\n\t\tcwd,\n\t\tisWatchMode,\n\t);\n\n\tconst extraHead = bundlePreload + preloadResult.extraHead;\n\tlet hydrationScript = preloadResult.hydrationScript;\n\tlet statusOverride = preloadResult.statusOverride;\n\n\t// Seed SSR store with content component so BlogPost can render on server\n\tawait seedSSRModuleForPath(pathname, clientDir, cwd, isWatchMode);\n\n\t// Route component module preload removed to avoid extra requests.\n\n\t// Execute optional route/content ssr.data and expose per-request store\n\tconst { data: __SSR_DATA__, error: __SSR_DATA_ERROR__ } =\n\t\tawait computeSSRData(pathname, clientDir, cwd, isWatchMode, { maxAge });\n\tsetGlobalSSRData(__SSR_DATA__);\n\n\t// Seed content collections on the server for SSR rendering (no client delivery yet).\n\t// We'll only inline the collections actually accessed during this render, captured\n\t// via the hook-level tracker.\n\tconst __byCollectionForSSR = await loadCollections(cwd, isWatchMode);\n\tsetGlobalCollections(__byCollectionForSSR);\n\n\t// (moved) Entry + dev watcher scripts are appended later, after we inline\n\t// any accessed collections so data is available before app boot.\n\n\tconst componentWithPathname = cloneElement<Doc>(rootComponent, {\n\t\tpathname,\n\t});\n\tconst appHtml = renderToString(componentWithPathname);\n\tconst baseTemplate = await loadIndexHtml(clientDir);\n\n\t// Inline compiled Tailwind CSS output if present (generated by CLI)\n\tconst inlineStyleTag = await inlineTailwindCSS(clientDir, minify);\n\n\t// After rendering, inline only the content collections that were actually\n\t// accessed during this SSR render. This preserves SSR for static routes that\n\t// use useContent(), while avoiding shipping the entire content index to pages\n\t// that don't need it (e.g., a single post entry without lists).\n\ttry {\n\t\tconst g = globalThis as unknown as { __REROUTE_SSR_ACCESSED__?: unknown };\n\t\tconst acc = g.__REROUTE_SSR_ACCESSED__;\n\n\t\tif (acc) {\n\t\t\tconst { subset, partial } = processCollections(acc, __byCollectionForSSR);\n\t\t\tif (Object.keys(subset).length > 0) {\n\t\t\t\thydrationScript += createCollectionScript(subset, partial);\n\t\t\t}\n\t\t}\n\t} catch {}\n\n\t// Inline SSR data and error warnings\n\thydrationScript += createDataScript(\n\t\t__SSR_DATA__,\n\t\tisWatchMode ? __SSR_DATA_ERROR__ : undefined,\n\t);\n\n\t// Append client entry module only after inlining accessed collections\n\thydrationScript += scripts\n\t\t.map((src) => `<script type=\"module\" src=\"${src}\"></script>`)\n\t\t.join('');\n\n\t// (Dev) Load live reload module (no inline script)\n\tif (isWatchMode) {\n\t\thydrationScript += `<script type=\"module\" src=\"/__reroute_watch.js\"></script>`;\n\t}\n\n\t// Derive per-page head from exported meta/ssr if available\n\tconst metadataResult = await extractPageMetadata(\n\t\tpathname,\n\t\tclientDir,\n\t\tcwd,\n\t\tisWatchMode,\n\t\tstatusOverride,\n\t);\n\tconst perPageHead = metadataResult.perPageHead;\n\tconst pageLang = metadataResult.pageLang;\n\tstatusOverride = metadataResult.statusOverride;\n\n\tconst combinedHead = dedent(\n\t\t[dedent(head) || '', dedent(extraHead), dedent(perPageHead)]\n\t\t\t.filter(Boolean)\n\t\t\t.join('\\n'),\n\t);\n\tconst html = applyIndexTemplate(baseTemplate, appHtml, {\n\t\thead: [inlineStyleTag, combinedHead].filter(Boolean).join('\\n'),\n\t\thydrationScript,\n\t\tlang: pageLang || lang,\n\t\tappId,\n\t});\n\n\treturn {\n\t\thtml,\n\t\tstatus: statusOverride || 200,\n\t};\n}\n\nexport { renderSSRDocument, type SSRRenderOptions, type SSRRenderResult };\n",
|
|
30
|
+
"import { cloneElement, type ReactElement } from 'react';\nimport { renderToReadableStream } from 'react-dom/server';\nimport { loadCollections, setGlobalCollections } from './lib/collections';\nimport { computeSSRData, setGlobalSSRData } from './lib/compute';\nimport { loadIndexHtml } from './lib/html';\nimport { extractPageMetadata } from './lib/metadata';\nimport {\n\tcreateBundlePreload,\n\tpreloadContentModule,\n\tresetSSRAccessTracking,\n} from './lib/preload';\nimport {\n\tcreateCollectionScript,\n\tcreateDataScript,\n\tprocessCollections,\n} from './lib/scripts';\nimport { seedSSRModuleForPath } from './lib/seed';\nimport { inlineTailwindCSS } from './lib/styles';\nimport { splitTemplate } from './lib/template';\n\n// biome-ignore lint/suspicious/noExplicitAny: flexible types\ntype Doc = any;\n\nconst isThenable = (value: unknown): value is Promise<unknown> => {\n\treturn (\n\t\ttypeof value === 'object' &&\n\t\tvalue !== null &&\n\t\ttypeof (value as { then?: unknown }).then === 'function'\n\t);\n};\n\nasync function renderSSRDocumentStream(\n\toptions: StreamingSSROptions,\n): Promise<StreamingSSRResult> {\n\tconst {\n\t\tpathname,\n\t\trootComponent,\n\t\tclientDir,\n\t\tcwd,\n\t\tisWatchMode,\n\t\tbundleUrl,\n\t\thead = '',\n\t\tlang = 'en',\n\t\tappId = 'root',\n\t\tmaxAge = 0,\n\t} = options;\n\n\t// IMPORTANT: Seed content modules before rendering (same as sync version)\n\tawait seedSSRModuleForPath(pathname, clientDir, cwd, isWatchMode);\n\n\t// Compute SSR data\n\tconst { data: __SSR_DATA__, error: __SSR_DATA_ERROR__ } =\n\t\tawait computeSSRData(pathname, clientDir, cwd, isWatchMode, {\n\t\t\tstreaming: true,\n\t\t\tmaxAge,\n\t\t});\n\tsetGlobalSSRData(__SSR_DATA__);\n\n\t// Load content collections for SSR rendering\n\tconst __byCollectionForSSR = await loadCollections(cwd, isWatchMode);\n\tsetGlobalCollections(__byCollectionForSSR);\n\n\t// Content module preloading\n\tresetSSRAccessTracking();\n\tconst bundlePreload = createBundlePreload(bundleUrl);\n\tconst preloadResult = await preloadContentModule(\n\t\tpathname,\n\t\tclientDir,\n\t\tcwd,\n\t\tisWatchMode,\n\t);\n\n\tlet extraHead = bundlePreload + preloadResult.extraHead;\n\tconst hydrationScript = preloadResult.hydrationScript;\n\tlet statusOverride = preloadResult.statusOverride;\n\n\tconst encoder = new TextEncoder();\n\tconst { readable, writable } = new TransformStream<Uint8Array>();\n\tconst writer = writable.getWriter();\n\n\t// Load and split template\n\tconst baseTemplate = await loadIndexHtml(clientDir);\n\tconst { htmlHead, rootStart, rootEnd, htmlTail } = splitTemplate(\n\t\tbaseTemplate,\n\t\tappId,\n\t);\n\n\t// Build head with lang attribute\n\tconst headWithLang = htmlHead.replace(\n\t\t/<html([^>]*)>/i,\n\t\t`<html$1 lang=\"${lang}\">`,\n\t);\n\n\t// Inline compiled Tailwind CSS output if present (generated by CLI)\n\tconst inlineStyleTag = await inlineTailwindCSS(clientDir, false);\n\n\t// Extract page metadata\n\tconst metadataResult = await extractPageMetadata(\n\t\tpathname,\n\t\tclientDir,\n\t\tcwd,\n\t\tisWatchMode,\n\t\tstatusOverride,\n\t);\n\textraHead += metadataResult.perPageHead;\n\tconst pageLang = metadataResult.pageLang;\n\tstatusOverride = metadataResult.statusOverride;\n\n\t// Start streaming in the background\n\t(async () => {\n\t\ttry {\n\t\t\t// 1. Send HTML head immediately (shell) with all preload links\n\t\t\tconst combinedHead = [inlineStyleTag, head, extraHead]\n\t\t\t\t.filter(Boolean)\n\t\t\t\t.join('\\n');\n\t\t\tconst headContent = `${headWithLang.replace(/<html([^>]*)>/i, `<html$1 lang=\"${pageLang || lang}\">`)}${combinedHead ? `\\n${combinedHead}` : ''}</head><body>`;\n\t\t\tawait writer.write(encoder.encode(headContent));\n\n\t\t\t// 2. Send root div start\n\t\t\tawait writer.write(encoder.encode(rootStart));\n\n\t\t\t// 3. Stream React content (starts immediately, Suspense boundaries stream progressively)\n\t\t\tconst componentWithPathname = cloneElement(rootComponent, {\n\t\t\t\tpathname,\n\t\t\t} as Doc);\n\n\t\t\t// Use React 19's streaming with progressive Suspense resolution\n\t\t\t// We start streaming as soon as the shell is ready, not waiting for all Suspense boundaries\n\t\t\tlet streamError: Error | null = null;\n\n\t\t\tconst streamPromise = renderToReadableStream(componentWithPathname, {\n\t\t\t\tonError(error) {\n\t\t\t\t\tconsole.error('[reroute] SSR stream error:', error);\n\t\t\t\t\tstreamError =\n\t\t\t\t\t\terror instanceof Error ? error : new Error(String(error));\n\t\t\t\t},\n\t\t\t}).catch((err) => {\n\t\t\t\tstreamError = err;\n\t\t\t\tthrow err;\n\t\t\t});\n\n\t\t\t// Wait for the stream to be ready (this happens quickly - just the initial setup)\n\t\t\tconst reactStream = await streamPromise;\n\t\t\tif (streamError) {\n\t\t\t\tthrow streamError;\n\t\t\t}\n\n\t\t\t// Now pipe the React stream to our writer\n\t\t\t// This will stream progressively as Suspense boundaries resolve\n\t\t\tconst reader = reactStream.getReader();\n\t\t\twhile (true) {\n\t\t\t\tconst { done, value } = await reader.read();\n\t\t\t\tif (done) break;\n\t\t\t\tawait writer.write(value);\n\t\t\t}\n\n\t\t\t// 4. Close root div\n\t\t\tawait writer.write(encoder.encode(rootEnd));\n\n\t\t\t// 5. Inline accessed collections script\n\t\t\tlet collectionScripts = '';\n\t\t\ttry {\n\t\t\t\tconst g = globalThis as unknown as {\n\t\t\t\t\t__REROUTE_SSR_ACCESSED__?: unknown;\n\t\t\t\t};\n\t\t\t\tconst acc = g.__REROUTE_SSR_ACCESSED__ as Doc;\n\n\t\t\t\tif (acc) {\n\t\t\t\t\tconst { subset, partial } = processCollections(\n\t\t\t\t\t\tacc,\n\t\t\t\t\t\t__byCollectionForSSR,\n\t\t\t\t\t);\n\t\t\t\t\tif (Object.keys(subset).length > 0) {\n\t\t\t\t\t\tcollectionScripts = createCollectionScript(subset, partial);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} catch {}\n\n\t\t\t// 6. Create a snapshot of current SSR data state for hydration\n\t\t\t// Use a copy to avoid race conditions with pending promises\n\t\t\tconst ssrDataSnapshot: Record<string, unknown> = {};\n\t\t\tfor (const key of Object.keys(__SSR_DATA__)) {\n\t\t\t\tconst value = __SSR_DATA__[key];\n\t\t\t\t// Only include resolved values, not promises\n\t\t\t\tif (!isThenable(value)) {\n\t\t\t\t\tssrDataSnapshot[key] = value;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// 7. Add SSR data snapshot and preload scripts\n\t\t\tconst dataScript = createDataScript(\n\t\t\t\tssrDataSnapshot,\n\t\t\t\tisWatchMode ? __SSR_DATA_ERROR__ : undefined,\n\t\t\t);\n\t\t\tlet allScripts = dataScript + collectionScripts + hydrationScript;\n\n\t\t\t// 8. Add bundle script with type=\"module\"\n\t\t\tallScripts += `<script type=\"module\" src=\"${bundleUrl}\"></script>`;\n\n\t\t\t// (Dev) Load live reload module\n\t\t\tif (isWatchMode) {\n\t\t\t\tallScripts += `<script type=\"module\" src=\"/__reroute_watch.js\"></script>`;\n\t\t\t}\n\n\t\t\tawait writer.write(encoder.encode(allScripts + htmlTail));\n\t\t\tawait writer.close();\n\t\t} catch (error) {\n\t\t\tconsole.error('[reroute] Stream error:', error);\n\t\t\tawait writer.abort(error);\n\t\t}\n\t})();\n\n\treturn { stream: readable, status: statusOverride || 200 };\n}\n\ntype StreamingSSROptions = {\n\tpathname: string;\n\trootComponent: ReactElement;\n\tclientDir: string;\n\tcwd: string;\n\tisWatchMode: boolean;\n\tbundleUrl: string;\n\thead?: string;\n\tlang?: string;\n\tappId?: string;\n\tmaxAge?: number;\n};\n\ntype StreamingSSRResult = {\n\tstream: ReadableStream<Uint8Array>;\n\tstatus: number;\n};\n\nexport { renderSSRDocumentStream };\nexport type { StreamingSSROptions, StreamingSSRResult };\n",
|
|
31
|
+
"export * from './lib';\nexport * from './render';\nexport * from './stream';\n",
|
|
32
|
+
"export * from './bundler';\nexport * from './config';\nexport * from './content';\nexport * from './ssr';\n",
|
|
35
33
|
"export * from './src';\n",
|
|
34
|
+
"/**\n * Markdown integration utility\n *\n * Manages markdown and syntax highlighting packages for the Reroute framework\n */\n\nimport { existsSync, readFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\n\n/**\n * Check if a package is available in package.json, searching up to 5 parent directories\n */\nfunction isPackageAvailable(cwd: string, packageName: string): boolean {\n\tlet currentDir = cwd;\n\n\t// Check up to 5 levels up\n\tfor (let i = 0; i < 5; i++) {\n\t\tconst packageJsonPath = join(currentDir, 'package.json');\n\n\t\tif (existsSync(packageJsonPath)) {\n\t\t\ttry {\n\t\t\t\tconst packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf-8'));\n\t\t\t\tconst deps = {\n\t\t\t\t\t...packageJson.dependencies,\n\t\t\t\t\t...packageJson.devDependencies,\n\t\t\t\t\t...packageJson.peerDependencies,\n\t\t\t\t};\n\n\t\t\t\tif (packageName in deps) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\t// Continue to parent directory\n\t\t\t}\n\t\t}\n\n\t\tconst parentDir = dirname(currentDir);\n\t\t// Stop if we've reached the root\n\t\tif (parentDir === currentDir) {\n\t\t\tbreak;\n\t\t}\n\t\tcurrentDir = parentDir;\n\t}\n\n\treturn false;\n}\n\n/**\n * Check if react-markdown is available in the project\n */\nfunction isReactMarkdownAvailable(cwd: string): boolean {\n\treturn isPackageAvailable(cwd, 'react-markdown');\n}\n\n/**\n * Check if Shiki is available in the project\n */\nfunction isShikiAvailable(cwd: string): boolean {\n\treturn isPackageAvailable(cwd, '@shikijs/rehype');\n}\n\n/**\n * Check if remark-gfm (GitHub Flavored Markdown) is available\n */\nfunction isRemarkGfmAvailable(cwd: string): boolean {\n\treturn isPackageAvailable(cwd, 'remark-gfm');\n}\n\n/**\n * Check if @mdx-js/mdx is available in the project\n */\nfunction isMdxAvailable(cwd: string): boolean {\n\treturn isPackageAvailable(cwd, '@mdx-js/mdx');\n}\n\n/**\n * Get markdown configuration status for the project\n */\nexport function getMarkdownConfig(cwd: string) {\n\tconst hasReactMarkdown = isReactMarkdownAvailable(cwd);\n\tconst hasShiki = isShikiAvailable(cwd);\n\tconst hasRemarkGfm = isRemarkGfmAvailable(cwd);\n\tconst hasMdx = isMdxAvailable(cwd);\n\n\treturn {\n\t\thasReactMarkdown,\n\t\thasShiki,\n\t\thasRemarkGfm,\n\t\thasMdx,\n\t\tisConfigured: hasReactMarkdown,\n\t};\n}\n\n/**\n * Log markdown configuration status\n */\nexport function logMarkdownStatus(cwd: string): void {\n\tconst config = getMarkdownConfig(cwd);\n\n\tif (config.isConfigured) {\n\t\tconsole.log('[reroute/markdown] Markdown rendering available');\n\t\tif (config.hasShiki) {\n\t\t\tconsole.log('[reroute/markdown] ✓ Shiki syntax highlighting enabled');\n\t\t}\n\t\tif (config.hasRemarkGfm) {\n\t\t\tconsole.log('[reroute/markdown] ✓ GitHub Flavored Markdown enabled');\n\t\t}\n\t\tif (config.hasMdx) {\n\t\t\tconsole.log(\n\t\t\t\t'[reroute/markdown] ✓ MDX compiler enabled (JSX in markdown)',\n\t\t\t);\n\t\t}\n\t}\n}\n\n/**\n * Check if markdown packages are configured and log status\n */\nexport function checkMarkdownIfConfigured(cwd: string): boolean {\n\ttry {\n\t\tconst config = getMarkdownConfig(cwd);\n\t\tif (config.isConfigured) {\n\t\t\tlogMarkdownStatus(cwd);\n\t\t}\n\t\treturn config.isConfigured;\n\t} catch (e) {\n\t\tconsole.warn('[reroute/markdown] check failed:', e);\n\t\treturn false;\n\t}\n}\n",
|
|
35
|
+
"/**\n * Markdown/MDX processor for route files\n *\n * Processes .md and .mdx files with frontmatter support for use in the routing system\n */\n\nimport { existsSync, readFileSync } from 'node:fs';\nimport { basename, dirname, extname, join } from 'node:path';\n\n// biome-ignore lint/suspicious/noExplicitAny: yes\ntype Any = any;\n\nexport interface MarkdownFrontmatter {\n\ttitle?: string;\n\tdescription?: string;\n\tdate?: string;\n\tslug?: string;\n\texcerpt?: string;\n\t[key: string]: Any;\n}\n\nexport interface ProcessedMarkdown {\n\tfrontmatter: MarkdownFrontmatter;\n\tcontent: string;\n\trawContent: string;\n\thasJSX: boolean;\n}\n\n/**\n * Simple frontmatter parser (YAML-like)\n * Extracts metadata from markdown files between --- delimiters\n */\nfunction parseFrontmatter(content: string): {\n\tdata: MarkdownFrontmatter;\n\tcontent: string;\n} {\n\tconst frontmatterRegex = /^---\\s*\\n([\\s\\S]*?)\\n---\\s*\\n([\\s\\S]*)$/;\n\tconst match = content.match(frontmatterRegex);\n\n\tif (!match) {\n\t\treturn { data: {}, content };\n\t}\n\n\tconst [, frontmatterText, markdownContent] = match;\n\tconst data: MarkdownFrontmatter = {};\n\n\t// Parse simple key: value pairs\n\tconst lines = frontmatterText.split('\\n');\n\tfor (const line of lines) {\n\t\tconst colonIndex = line.indexOf(':');\n\t\tif (colonIndex === -1) continue;\n\n\t\tconst key = line.slice(0, colonIndex).trim();\n\t\tlet value = line.slice(colonIndex + 1).trim();\n\n\t\t// Remove quotes if present\n\t\tif (\n\t\t\t(value.startsWith('\"') && value.endsWith('\"')) ||\n\t\t\t(value.startsWith(\"'\") && value.endsWith(\"'\"))\n\t\t) {\n\t\t\tvalue = value.slice(1, -1);\n\t\t}\n\n\t\t// Parse arrays (simple format: [item1, item2])\n\t\tif (value.startsWith('[') && value.endsWith(']')) {\n\t\t\tdata[key] = value\n\t\t\t\t.slice(1, -1)\n\t\t\t\t.split(',')\n\t\t\t\t.map((v) => v.trim().replace(/^[\"']|[\"']$/g, ''));\n\t\t}\n\t\t// Parse booleans\n\t\telse if (value === 'true' || value === 'false') {\n\t\t\tdata[key] = value === 'true';\n\t\t}\n\t\t// Parse numbers\n\t\telse if (!Number.isNaN(Number(value))) {\n\t\t\tdata[key] = Number(value);\n\t\t}\n\t\t// String value\n\t\telse {\n\t\t\tdata[key] = value;\n\t\t}\n\t}\n\n\treturn { data, content: markdownContent };\n}\n\n/**\n * Check if markdown content contains JSX syntax\n */\nfunction hasJSXSyntax(content: string): boolean {\n\t// Simple heuristic: look for JSX-like patterns\n\tconst jsxPatterns = [\n\t\t/<[A-Z][a-zA-Z0-9]*/, // Component tags like <Component>\n\t\t/import\\s+{[^}]+}\\s+from/, // ES6 imports\n\t\t/import\\s+\\w+\\s+from/, // Default imports\n\t\t/export\\s+(default|const|function)/, // Exports\n\t\t/<\\w+\\s+\\w+={/, // Props with curly braces\n\t];\n\n\treturn jsxPatterns.some((pattern) => pattern.test(content));\n}\n\n/**\n * Process a markdown/MDX file and return structured data\n */\nexport function processMarkdownFile(filePath: string): ProcessedMarkdown {\n\tconst rawContent = readFileSync(filePath, 'utf-8');\n\tconst { data, content } = parseFrontmatter(rawContent);\n\tconst hasJSX = hasJSXSyntax(content);\n\n\treturn {\n\t\tfrontmatter: data,\n\t\tcontent,\n\t\trawContent,\n\t\thasJSX,\n\t};\n}\n\n/**\n * Check if @mdx-js/mdx is available in the project\n */\nfunction isMdxAvailable(cwd: string): boolean {\n\tlet currentDir = cwd;\n\n\t// Check up to 5 levels up\n\tfor (let i = 0; i < 5; i++) {\n\t\tconst packageJsonPath = join(currentDir, 'package.json');\n\n\t\tif (existsSync(packageJsonPath)) {\n\t\t\ttry {\n\t\t\t\tconst packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf-8'));\n\t\t\t\tconst deps = {\n\t\t\t\t\t...packageJson.dependencies,\n\t\t\t\t\t...packageJson.devDependencies,\n\t\t\t\t\t...packageJson.peerDependencies,\n\t\t\t\t};\n\n\t\t\t\tif ('@mdx-js/mdx' in deps) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\t// Continue to parent directory\n\t\t\t}\n\t\t}\n\n\t\tconst parentDir = dirname(currentDir);\n\t\t// Stop if we've reached the root\n\t\tif (parentDir === currentDir) {\n\t\t\tbreak;\n\t\t}\n\t\tcurrentDir = parentDir;\n\t}\n\n\treturn false;\n}\n\n/**\n * Compile MDX content to JSX using @mdx-js/mdx\n */\nasync function compileMdx(\n\tcontent: string,\n\tcwd: string,\n\toptions: {\n\t\tenableGfm?: boolean;\n\t\ttheme?: string;\n\t\tfilename?: string;\n\t} = {},\n): Promise<string | null> {\n\tif (!isMdxAvailable(cwd)) {\n\t\tconsole.warn(\n\t\t\t'[reroute/mdx] @mdx-js/mdx not installed. Install with: bun add @mdx-js/mdx',\n\t\t);\n\t\treturn null;\n\t}\n\n\ttry {\n\t\t// Try to find @mdx-js/mdx in workspace, checking up to 3 levels up\n\t\tlet compile: Any;\n\t\tconst pathsToTry = [\n\t\t\tjoin(cwd, 'node_modules/@mdx-js/mdx'),\n\t\t\tjoin(cwd, '../node_modules/@mdx-js/mdx'),\n\t\t\tjoin(cwd, '../../node_modules/@mdx-js/mdx'),\n\t\t\tjoin(cwd, '../../../node_modules/@mdx-js/mdx'),\n\t\t];\n\n\t\tfor (const mdxPath of pathsToTry) {\n\t\t\ttry {\n\t\t\t\tconst mdxModule = require(mdxPath);\n\t\t\t\tcompile = mdxModule.compile;\n\t\t\t\tbreak;\n\t\t\t} catch {\n\t\t\t\t// Try next path\n\t\t\t}\n\t\t}\n\n\t\tif (!compile) {\n\t\t\tconsole.error('[reroute/mdx] Could not load @mdx-js/mdx from any path');\n\t\t\treturn null;\n\t\t}\n\n\t\tconst { enableGfm = true, theme = 'github-dark' } = options;\n\n\t\tconst remarkPlugins = [] as Any[];\n\t\tconst rehypePlugins = [] as Any[];\n\n\t\t// Add GFM support if requested\n\t\tif (enableGfm) {\n\t\t\tconst gfmPathsToTry = [\n\t\t\t\tjoin(cwd, 'node_modules/remark-gfm'),\n\t\t\t\tjoin(cwd, '../node_modules/remark-gfm'),\n\t\t\t\tjoin(cwd, '../../node_modules/remark-gfm'),\n\t\t\t\tjoin(cwd, '../../../node_modules/remark-gfm'),\n\t\t\t];\n\n\t\t\tlet remarkGfm: Any = null;\n\t\t\tfor (const gfmPath of gfmPathsToTry) {\n\t\t\t\ttry {\n\t\t\t\t\tremarkGfm = require(gfmPath);\n\t\t\t\t\tbreak;\n\t\t\t\t} catch {\n\t\t\t\t\t// Try next path\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (remarkGfm) {\n\t\t\t\tremarkPlugins.push(remarkGfm.default || remarkGfm);\n\t\t\t} else {\n\t\t\t\tconsole.warn('[reroute/mdx] remark-gfm not available, skipping');\n\t\t\t}\n\t\t}\n\n\t\t// Add Shiki highlighting if available (compile-time only, safe for SSR)\n\t\tconst shikiPathsToTry = [\n\t\t\tjoin(cwd, 'node_modules/@shikijs/rehype'),\n\t\t\tjoin(cwd, '../node_modules/@shikijs/rehype'),\n\t\t\tjoin(cwd, '../../node_modules/@shikijs/rehype'),\n\t\t\tjoin(cwd, '../../../node_modules/@shikijs/rehype'),\n\t\t];\n\n\t\tlet rehypeShiki: Any = null;\n\t\tfor (const shikiPath of shikiPathsToTry) {\n\t\t\ttry {\n\t\t\t\trehypeShiki = require(shikiPath);\n\t\t\t\tbreak;\n\t\t\t} catch {\n\t\t\t\t// Try next path\n\t\t\t}\n\t\t}\n\n\t\tif (rehypeShiki) {\n\t\t\trehypePlugins.push([rehypeShiki.default || rehypeShiki, { theme }]);\n\t\t} else {\n\t\t\tconsole.warn(\n\t\t\t\t'[reroute/mdx] @shikijs/rehype not available, skipping highlighting',\n\t\t\t);\n\t\t}\n\n\t\tconst result = await compile(content, {\n\t\t\tremarkPlugins,\n\t\t\trehypePlugins,\n\t\t\toutputFormat: 'program',\n\t\t\tdevelopment: false,\n\t\t});\n\n\t\treturn String(result);\n\t} catch (error) {\n\t\t// Log only the essential error information to avoid confusion\n\t\tconst errorMessage = error instanceof Error ? error.message : String(error);\n\t\tconst errorLocation =\n\t\t\terror &&\n\t\t\ttypeof error === 'object' &&\n\t\t\t'place' in error &&\n\t\t\terror.place &&\n\t\t\ttypeof error.place === 'object'\n\t\t\t\t? `at line ${(error.place as Any).line || '?'}, column ${(error.place as Any).column || '?'}`\n\t\t\t\t: '';\n\t\tconst fileInfo = options.filename ? ` in ${options.filename}` : '';\n\n\t\tconsole.warn(\n\t\t\t`[reroute/mdx] Compilation failed${fileInfo}${errorLocation ? ` ${errorLocation}` : ''}: ${errorMessage}`,\n\t\t);\n\t\tconsole.warn('[reroute/mdx] Falling back to react-markdown');\n\t\treturn null;\n\t}\n}\n\n/**\n * Generate a React component wrapper for markdown content\n * This creates a TypeScript module that can be imported as a route\n */\nexport async function generateMarkdownModule(\n\tprocessed: ProcessedMarkdown,\n\tcwd: string,\n\toptions: {\n\t\tenableGfm?: boolean;\n\t\ttheme?: string;\n\t\tisMdx?: boolean;\n\t\tfilename?: string;\n\t} = {},\n): Promise<string> {\n\tconst { frontmatter, content } = processed;\n\tconst {\n\t\tenableGfm = true,\n\t\ttheme = 'github-dark',\n\t\tisMdx = false,\n\t\tfilename,\n\t} = options;\n\n\t// Prefer MDX engine for both .mdx and .md when available to ensure\n\t// identical SSR/CSR output. MD is a subset of MDX, so compile it too.\n\tconst compiledMdx = await compileMdx(content, cwd, {\n\t\tenableGfm,\n\t\ttheme,\n\t\tfilename,\n\t});\n\tif (compiledMdx) {\n\t\t// Add TypeScript type definitions for MDX props\n\t\t// Using proper JSX types to avoid ElementType errors\n\t\tconst typeDefinitions = `// TypeScript types for MDX components\ntype MDXProps = {\n components?: Record<string, React.ComponentType<any>>;\n [key: string]: any;\n};\n\n// Suppress JSX element type checking for MDX-generated code\n// @ts-nocheck enables this for the entire generated file\n`;\n\n\t\t// Fix type annotations in the compiled MDX by adding types to function parameters\n\t\tconst typedMdx = compiledMdx\n\t\t\t.replace(\n\t\t\t\t/function\\s+_createMdxContent\\s*\\(\\s*props\\s*\\)/g,\n\t\t\t\t'function _createMdxContent(props: MDXProps)',\n\t\t\t)\n\t\t\t.replace(\n\t\t\t\t/function\\s+MDXContent\\s*\\(\\s*props\\s*\\)/g,\n\t\t\t\t'function MDXContent(props: MDXProps)',\n\t\t\t);\n\n\t\t// Already a complete program that exports a default component\n\t\treturn `// @ts-nocheck\n// Generated from ${isMdx ? 'MDX' : 'Markdown'} file with @mdx-js/mdx\n// TypeScript checking is disabled for MDX-generated code\n\n${typeDefinitions}\n\n// MDX compiled content with imports and component\n${typedMdx}\n\n// Add metadata exports\nexport const meta = ${JSON.stringify(frontmatter, null, 2)};\n\nexport const ssr = {\n head: [\n '<meta property=\"og:type\" content=\"article\" />',\n '<meta name=\"twitter:card\" content=\"summary_large_image\" />',\n ],\n};\n`;\n\t}\n\n\t// Regular markdown - wrap with Markdown component\n\tconst escapedContent = content\n\t\t.replace(/\\\\/g, '\\\\\\\\')\n\t\t.replace(/`/g, '\\\\`')\n\t\t.replace(/\\$/g, '\\\\$');\n\n\t// Build plugin imports\n\tconst pluginImports: string[] = [];\n\tconst remarkPluginsList: string[] = [];\n\tconst rehypePluginsList: string[] = [];\n\n\tif (enableGfm) {\n\t\tpluginImports.push(\"import remarkGfm from 'remark-gfm';\");\n\t\tremarkPluginsList.push('remarkGfm');\n\t}\n\n\t// Note: Shiki is async and breaks SSR - skip it\n\n\tconst pluginImportsStr =\n\t\tpluginImports.length > 0 ? `${pluginImports.join('\\n')}\\n` : '';\n\tconst remarkPluginsStr =\n\t\tremarkPluginsList.length > 0\n\t\t\t? `remarkPlugins={[${remarkPluginsList.join(', ')}]}`\n\t\t\t: '';\n\tconst rehypePluginsStr =\n\t\trehypePluginsList.length > 0\n\t\t\t? `rehypePlugins={[${rehypePluginsList.join(', ')}]}`\n\t\t\t: '';\n\tconst pluginsPropsStr = [remarkPluginsStr, rehypePluginsStr]\n\t\t.filter(Boolean)\n\t\t.join('\\n ');\n\n\treturn `// Generated from markdown file\nimport { Markdown } from 'reroute-js/react';\n${pluginImportsStr}\nconst meta = ${JSON.stringify(frontmatter, null, 2)};\n\nconst ssr = {\n head: [\n '<meta property=\"og:type\" content=\"article\" />',\n '<meta name=\"twitter:card\" content=\"summary_large_image\" />',\n ],\n};\n\nconst markdownContent = \\`${escapedContent}\\`;\n\nfunction MarkdownRoute() {\n return (\n <div>\n <Markdown\n ${pluginsPropsStr}\n >\n {markdownContent}\n </Markdown>\n </div>\n );\n}\n\nexport { meta, ssr };\nexport default MarkdownRoute;\n`;\n}\n\n/**\n * Generate a plain fallback TSX module when markdown tooling\n * is not configured. Renders raw markdown content in a <pre> block\n * so routes still work without extra deps.\n */\nexport function generatePlainMarkdownModule(\n\tprocessed: ProcessedMarkdown,\n): string {\n\tconst { frontmatter, content } = processed;\n\tconst escapedContent = content\n\t\t.replace(/\\\\/g, '\\\\\\\\')\n\t\t.split(String.fromCharCode(96))\n\t\t.join(`\\\\${String.fromCharCode(96)}`)\n\t\t.split('$')\n\t\t.join('\\\\$');\n\n\treturn `// Generated from markdown file (plain fallback)\n// No markdown renderer detected; showing raw content.\nexport const meta = ${JSON.stringify(frontmatter, null, 2)};\n\nexport const ssr = {\n head: [\n '<meta property=\"og:type\" content=\"article\" />',\n '<meta name=\"twitter:card\" content=\"summary_large_image\" />',\n ],\n};\n\nconst markdownContent = \\`${escapedContent}\\`;\n\nexport default function MarkdownFallback() {\n return (\n <div style={{ padding: '1rem' }}>\n {meta?.title && (\n <h1 style={{ fontSize: '1.5rem', fontWeight: 600 }}>{meta.title}</h1>\n )}\n <div style={{\n margin: '0.75rem 0',\n padding: '0.75rem',\n borderLeft: '4px solid #eab308',\n background: '#fefce8',\n color: '#713f12'\n }}>\n <strong>Markdown rendering not configured.</strong>\n <div style={{ marginTop: '0.25rem' }}>\n Install: react-markdown (required), remark-gfm (optional), @mdx-js/mdx (optional), @shikijs/rehype (optional).\n </div>\n </div>\n <pre style={{ whiteSpace: 'pre-wrap', lineHeight: 1.6 }}>{markdownContent}</pre>\n </div>\n );\n}\n`;\n}\n\n/**\n * Check if a file is a markdown file\n */\nexport function isMarkdownFile(filePath: string): boolean {\n\tconst ext = extname(filePath).toLowerCase();\n\treturn ext === '.md' || ext === '.mdx';\n}\n\n/**\n * Get the route name from a markdown filename\n * Converts kebab-case to the route path\n */\nexport function getMarkdownRouteName(filePath: string): string {\n\tconst name = basename(filePath, extname(filePath));\n\treturn name;\n}\n",
|
|
36
|
+
"export * from './availability';\nexport * from './processor';\n",
|
|
37
|
+
"/**\n * Production mode utility\n *\n * Provides utilities to check if the CLI is running in production mode.\n * Production mode can be enabled either via NODE_ENV=production or --prod flag.\n */\n\n/**\n * Check if production mode is enabled\n * @param args Command line arguments to check for --prod flag\n * @returns true if NODE_ENV=production or --prod flag is present\n */\nexport function isProductionMode(args: string[] = []): boolean {\n\treturn (\n\t\tprocess.env.NODE_ENV === 'production' ||\n\t\tBun.env.NODE_ENV === 'production' ||\n\t\targs.includes('--prod')\n\t);\n}\n\n/**\n * Set NODE_ENV to production if --prod flag is present\n * This ensures child processes inherit the production setting\n * @param args Command line arguments to check for --prod flag\n */\nexport function ensureProductionEnv(args: string[] = []): void {\n\tif (args.includes('--prod')) {\n\t\tprocess.env.NODE_ENV = 'production';\n\t\tBun.env.NODE_ENV = 'production';\n\t}\n}\n\n/**\n * Filter out --prod flag from arguments since it's handled globally\n * @param args Command line arguments\n * @returns Filtered arguments without --prod\n */\nexport function filterProdFlag(args: string[]): string[] {\n\treturn args.filter((arg) => arg !== '--prod');\n}\n",
|
|
38
|
+
"import { dirname, join } from 'node:path';\n\ntype StreamingTarget = 'route' | 'layout';\n\nconst SSR_DATA_REGEX = /export\\s+const\\s+ssr[\\s\\S]*?data\\s*[:(]/i;\n\nexport interface StreamingAnalysis {\n\tfilePath: string;\n\ttype: StreamingTarget;\n\thasSSRData: boolean;\n\tneedsStreaming: boolean;\n\tcustomSkeletonPath?: string;\n}\n\ntype AnalyzeOptions = {\n\tabsolutePath: string;\n\trelativePath: string;\n\ttype: StreamingTarget;\n\troutesDir: string;\n};\n\nexport async function analyzeRouteForStreaming(\n\toptions: AnalyzeOptions,\n): Promise<StreamingAnalysis> {\n\tconst normalizedRelativePath = normalizeRelativePath(options.relativePath);\n\tlet source = '';\n\ttry {\n\t\tsource = await Bun.file(options.absolutePath).text();\n\t} catch {\n\t\t// Ignore read errors; treat as no ssr.data\n\t}\n\n\tconst hasSSRData = SSR_DATA_REGEX.test(source);\n\tconst customSkeletonPath = await findSkeletonForTarget(\n\t\toptions.routesDir,\n\t\tnormalizedRelativePath,\n\t\toptions.type,\n\t);\n\n\treturn {\n\t\tfilePath: normalizedRelativePath,\n\t\ttype: options.type,\n\t\thasSSRData,\n\t\tneedsStreaming: hasSSRData,\n\t\tcustomSkeletonPath,\n\t};\n}\n\nasync function findSkeletonForTarget(\n\troutesDir: string,\n\trelativePath: string,\n\ttype: StreamingTarget,\n): Promise<string | undefined> {\n\tconst dirName = normalizeRelativePath(dirname(relativePath));\n\tconst baseDir =\n\t\tdirName === '.' ? routesDir : join(routesDir, dirName).replace(/\\\\/g, '/');\n\tconst candidates =\n\t\ttype === 'layout'\n\t\t\t? ['[layout+skeleton].tsx', '[layout+skeleton].ts']\n\t\t\t: ['[skeleton].tsx', '[skeleton].ts'];\n\n\tfor (const candidate of candidates) {\n\t\tconst candidatePath = join(baseDir, candidate);\n\t\ttry {\n\t\t\tconst file = Bun.file(candidatePath);\n\t\t\tif (await file.exists()) {\n\t\t\t\treturn candidatePath;\n\t\t\t}\n\t\t} catch {\n\t\t\t// Ignore existence errors\n\t\t}\n\t}\n\n\treturn undefined;\n}\n\nfunction normalizeRelativePath(path: string): string {\n\treturn path.replace(/\\\\/g, '/');\n}\n",
|
|
39
|
+
"import { dirname, join, relative } from 'node:path';\nimport type { RerouteConfig } from 'reroute-js/core';\nimport type { StreamingAnalysis } from './analyzer';\n\ntype GenerateWrapperOptions = {\n\tcwd: string;\n\trelativeFilePath: string;\n\tanalysis: StreamingAnalysis;\n\tconfig: RerouteConfig;\n};\n\nconst AUTO_HEADER = `// 🚨 Auto-generated streaming wrapper by Reroute - DO NOT EDIT 🚨\n/* eslint-disable */\n// @ts-nocheck\n`;\n\nconst BUILT_IN_SKELETON = `const Skeleton = () => (\n <div className=\"animate-pulse p-8\">\n DEFAULT SKELETON (REMOVE ME BEFORE COMMITING THE CODE)\n <div className=\"h-8 bg-gray-200 rounded w-3/4 mb-4\" />\n <div className=\"space-y-3\">\n <div className=\"h-4 bg-gray-200 rounded\" />\n <div className=\"h-4 bg-gray-200 rounded\" />\n <div className=\"h-4 bg-gray-200 rounded w-5/6\" />\n </div>\n </div>\n);`;\n\nlet warnedSkeletonType = false;\n\nexport async function generateStreamingWrapper(\n\toptions: GenerateWrapperOptions,\n): Promise<string> {\n\tconst { cwd, relativeFilePath, analysis, config } = options;\n\tconst streamingModulePath = join(\n\t\tcwd,\n\t\t'.reroute',\n\t\t'streaming',\n\t\trelativeFilePath,\n\t).replace(/\\.(tsx|ts)$/, '.tsx');\n\tconst wrapperDir = dirname(streamingModulePath);\n\tconst originalModuleWithoutExt = removeExtension(\n\t\tjoin(cwd, 'src', 'client', 'routes', relativeFilePath),\n\t);\n\n\tconst originalImportPath = toImportPath(wrapperDir, originalModuleWithoutExt);\n\n\tconst skeletonImportBlock = await resolveSkeletonBlock({\n\t\tanalysis,\n\t\tconfig,\n\t\tcwd,\n\t\twrapperDir,\n\t});\n\n\tconst componentName = `${toComponentName(relativeFilePath)}Streaming`;\n\n\treturn `${AUTO_HEADER}import { Suspense } from 'react';\nimport OriginalComponent from '${originalImportPath}';\n${skeletonImportBlock}\n\nexport default function ${componentName}(props) {\n return (\n <Suspense fallback={<Skeleton />}>\n <OriginalComponent {...props} />\n </Suspense>\n );\n}\n\nexport * from '${originalImportPath}';\n`;\n}\n\nasync function resolveSkeletonBlock(args: {\n\tanalysis: StreamingAnalysis;\n\tconfig: RerouteConfig;\n\tcwd: string;\n\twrapperDir: string;\n}): Promise<string> {\n\tconst { analysis, config, cwd, wrapperDir } = args;\n\n\tif (analysis.customSkeletonPath) {\n\t\tconst importPath = toImportPath(\n\t\t\twrapperDir,\n\t\t\tremoveExtension(analysis.customSkeletonPath),\n\t\t);\n\t\treturn `import Skeleton from '${importPath}';`;\n\t}\n\n\tconst streamingConfig = config.streaming || {};\n\tconst layoutDefault =\n\t\tanalysis.type === 'layout'\n\t\t\t? resolveConfiguredSkeletonPath(\n\t\t\t\t\tstreamingConfig.defaultLayoutSkeleton,\n\t\t\t\t\tcwd,\n\t\t\t\t)\n\t\t\t: undefined;\n\tconst routeDefault = resolveConfiguredSkeletonPath(\n\t\tstreamingConfig.defaultSkeleton,\n\t\tcwd,\n\t);\n\n\tconst configuredSkeleton = layoutDefault || routeDefault || undefined;\n\tif (configuredSkeleton) {\n\t\tconst importPath = toImportPath(\n\t\t\twrapperDir,\n\t\t\tremoveExtension(configuredSkeleton),\n\t\t);\n\t\treturn `import Skeleton from '${importPath}';`;\n\t}\n\n\treturn BUILT_IN_SKELETON;\n}\n\nfunction resolveConfiguredSkeletonPath(\n\tvalue: unknown,\n\tcwd: string,\n): string | undefined {\n\tif (typeof value === 'string' && value.trim().length > 0) {\n\t\treturn value.startsWith('/') ? value : join(cwd, value);\n\t}\n\tif (value && !warnedSkeletonType) {\n\t\tconsole.warn(\n\t\t\t'[reroute/streaming] default skeletons must be provided as string module paths in reroute.config.ts',\n\t\t);\n\t\twarnedSkeletonType = true;\n\t}\n\treturn undefined;\n}\n\nfunction toImportPath(fromDir: string, targetModule: string): string {\n\tconst rel = relative(fromDir, targetModule).replace(/\\\\/g, '/');\n\tif (rel.startsWith('.')) return rel;\n\treturn `./${rel}`;\n}\n\nfunction removeExtension(filePath: string): string {\n\treturn filePath.replace(/\\.(tsx|ts|jsx|js)$/, '');\n}\n\nfunction toComponentName(filePath: string): string {\n\tconst withoutExt = filePath.replace(/\\.(tsx|ts)$/, '');\n\tconst parts = withoutExt.split('/').filter(Boolean);\n\tconst name = parts\n\t\t.map((part) => {\n\t\t\tconst cleaned = part\n\t\t\t\t.replace(/\\[(.+?)\\]/g, '$1')\n\t\t\t\t.replace(/[^a-zA-Z0-9]/g, '');\n\t\t\tif (!cleaned) return '';\n\t\t\treturn cleaned.charAt(0).toUpperCase() + cleaned.slice(1);\n\t\t})\n\t\t.join('');\n\treturn name || 'Route';\n}\n",
|
|
40
|
+
"/**\n * Tailwind CSS v4 integration utility\n *\n * Manages Tailwind CLI integration for the Reroute framework\n */\n\nimport { spawn } from 'node:child_process';\nimport { existsSync, readFileSync } from 'node:fs';\nimport { join } from 'node:path';\n\n/**\n * Check if Tailwind CSS v4 is available in the project\n * Checks current directory and up to 3 levels up (for monorepos)\n */\nfunction isTailwindAvailable(cwd: string): boolean {\n\tconst pathsToTry = [\n\t\tjoin(cwd, 'package.json'),\n\t\tjoin(cwd, '../package.json'),\n\t\tjoin(cwd, '../../package.json'),\n\t\tjoin(cwd, '../../../package.json'),\n\t];\n\n\tfor (const packageJsonPath of pathsToTry) {\n\t\tif (!existsSync(packageJsonPath)) {\n\t\t\tcontinue;\n\t\t}\n\n\t\ttry {\n\t\t\tconst packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf-8'));\n\t\t\tconst deps = {\n\t\t\t\t...packageJson.dependencies,\n\t\t\t\t...packageJson.devDependencies,\n\t\t\t};\n\n\t\t\tif ('@tailwindcss/cli' in deps) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t} catch {}\n\t}\n\n\treturn false;\n}\n\n/**\n * Get the default paths for Tailwind CSS\n */\nfunction getTailwindPaths(cwd: string) {\n\tconst input = join(cwd, 'src/client/theme.css');\n\tconst output = join(cwd, '.reroute/theme.css');\n\n\treturn { input, output };\n}\n\n/**\n * Check if Tailwind input file exists and uses v4 format\n */\nfunction hasTailwindInput(cwd: string): boolean {\n\tconst { input } = getTailwindPaths(cwd);\n\n\tif (!existsSync(input)) {\n\t\treturn false;\n\t}\n\n\ttry {\n\t\tconst content = readFileSync(input, 'utf-8');\n\t\t// v4 uses @import \"tailwindcss\"\n\t\treturn content.includes('tailwindcss');\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nfunction resolveTailwindBin(cwd: string): string {\n\t// Try to find tailwindcss binary, checking up to 3 levels up\n\tconst pathsToTry = [\n\t\tjoin(cwd, '../node_modules/.bin/tailwindcss'),\n\t\tjoin(cwd, '../../node_modules/.bin/tailwindcss'),\n\t\tjoin(cwd, '../../../node_modules/.bin/tailwindcss'),\n\t];\n\n\tfor (const binPath of pathsToTry) {\n\t\tif (existsSync(binPath)) {\n\t\t\treturn binPath;\n\t\t}\n\t}\n\n\t// Fallback to the default location if none found\n\treturn join(cwd, 'node_modules/.bin/tailwindcss');\n}\n\n/**\n * Build Tailwind CSS using the Tailwind CLI\n */\nasync function buildTailwind(cwd: string, minify = false): Promise<void> {\n\tconst { input, output } = getTailwindPaths(cwd);\n\n\treturn new Promise((resolve, reject) => {\n\t\tconst tailwindBin = resolveTailwindBin(cwd);\n\t\tconst args = ['-i', input, '-o', output];\n\n\t\t// Add minify flag for production builds\n\t\tif (minify) {\n\t\t\targs.push('--minify');\n\t\t}\n\n\t\tconst argsStr = args.join(' ');\n\t\tconsole.log(`[reroute/tailwind] build start: ${argsStr}`);\n\n\t\tconst tailwind = spawn(tailwindBin, args, {\n\t\t\tcwd,\n\t\t\tstdio: 'pipe',\n\t\t});\n\n\t\ttailwind.stdout?.on('data', (data) => {\n\t\t\tconst line = data.toString().trim();\n\t\t\tif (line) {\n\t\t\t\tconsole.log(`[reroute/tailwind] ${line}`);\n\t\t\t}\n\t\t});\n\n\t\ttailwind.stderr?.on('data', (data) => {\n\t\t\tconst line = data.toString().trim();\n\t\t\tif (line) {\n\t\t\t\tconsole.log(`[reroute/tailwind] ${line}`);\n\t\t\t}\n\t\t});\n\n\t\ttailwind.on('close', (code) => {\n\t\t\tif (code === 0) {\n\t\t\t\tconsole.log('[reroute/tailwind] build done');\n\t\t\t\tresolve();\n\t\t\t} else {\n\t\t\t\treject(new Error(`Tailwind CSS build failed with code ${code}`));\n\t\t\t}\n\t\t});\n\n\t\ttailwind.on('error', (error) => {\n\t\t\treject(error);\n\t\t});\n\t});\n}\n\n/**\n * Build Tailwind once if installed and input exists.\n * Returns true if a build was attempted (success or failure), false if skipped.\n */\nexport async function buildTailwindIfConfigured(\n\tcwd: string,\n\tminify = false,\n): Promise<boolean> {\n\ttry {\n\t\tif (isTailwindAvailable(cwd) && hasTailwindInput(cwd)) {\n\t\t\tawait buildTailwind(cwd, minify);\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t} catch (e) {\n\t\tconsole.warn('[reroute/tailwind] build failed:', e);\n\t\treturn true;\n\t}\n}\n",
|
|
41
|
+
"#!/usr/bin/env bun\nimport { watch } from 'node:fs';\nimport { mkdir, readdir, rm } from 'node:fs/promises';\nimport { dirname, join } from 'node:path';\nimport { pathToFileURL } from 'node:url';\nimport type { RerouteConfig } from 'reroute-js/core';\nimport { loadConfig } from 'reroute-js/core';\nimport {\n\tcheckMarkdownIfConfigured,\n\tgenerateMarkdownModule,\n\tgeneratePlainMarkdownModule,\n\tgetMarkdownConfig,\n\tisMarkdownFile,\n\tprocessMarkdownFile,\n} from './lib/markdown';\nimport { isProductionMode } from './lib/production';\nimport {\n\tanalyzeRouteForStreaming,\n\ttype StreamingAnalysis,\n} from './lib/streaming/analyzer';\nimport { generateStreamingWrapper } from './lib/streaming/suspense';\nimport { buildTailwindIfConfigured } from './lib/tailwind';\n\n// biome-ignore lint/suspicious/noExplicitAny: flexible content meta type\ntype Doc = any;\n\ninterface RouteFile {\n\tpath: string;\n\tpattern: string;\n\tfilePath: string;\n\tisLayout: boolean;\n\tisDynamic: boolean;\n\tparams: string[];\n\t/** special case for [404].tsx */\n\tisNotFound?: boolean;\n\t/** when isNotFound, this is the base pattern to match as a prefix */\n\tnotFoundBasePattern?: string;\n}\n\ninterface RouteTree {\n\troutes: RouteFile[];\n\tlayouts: RouteFile[];\n\tnotFoundRoutes: RouteFile[];\n}\n\nconst ROUTES_DIR = 'src/client/routes';\nconst OUTPUT_DIR = '.reroute';\nconst OUTPUT_ROUTES = '.reroute/routes.ts';\nconst OUTPUT_CONTENT_TS = '.reroute/content.ts';\nconst OUTPUT_COLLECTIONS_DIR = '.reroute/collections';\nconst OUTPUT_INDEX = '.reroute/index.ts';\n\nasync function ensureOutputDir(cwd: string, options: { clean?: boolean } = {}) {\n\tconst { clean = true } = options;\n\ttry {\n\t\tconst outputPath = join(cwd, OUTPUT_DIR);\n\n\t\tif (clean) {\n\t\t\t// Check if .reroute directory exists and has content\n\t\t\tlet needsCleanup = false;\n\t\t\ttry {\n\t\t\t\tconst entries = await readdir(outputPath);\n\t\t\t\tneedsCleanup = entries.length > 0;\n\t\t\t} catch {\n\t\t\t\t// Directory doesn't exist, no cleanup needed\n\t\t\t}\n\n\t\t\tif (needsCleanup) {\n\t\t\t\t// Remove existing generated files\n\t\t\t\tawait rm(outputPath, { force: true, recursive: true });\n\t\t\t\tconsole.log('[reroute/gen] Cleaned up generated artifacts in .reroute');\n\t\t\t}\n\t\t}\n\n\t\t// Ensure .reroute exists for subsequent writes\n\t\tawait mkdir(outputPath, { recursive: true });\n\t\tawait mkdir(join(cwd, OUTPUT_COLLECTIONS_DIR), { recursive: true });\n\t\tawait mkdir(join(cwd, '.reroute/bundles'), { recursive: true });\n\t\tawait mkdir(join(cwd, '.reroute/streaming'), { recursive: true });\n\t} catch {\n\t\t// Ignore cleanup errors\n\t}\n}\n\nasync function writeStubFiles(cwd: string) {\n\t// Write minimal stub files so the app can start immediately\n\t// This prevents \"Cannot find module\" errors when server starts\n\tconst STUB_ROUTES = `// 🚨 Auto-generated stub by Reroute - DO NOT EDIT 🚨\n// This will be replaced by actual routes\n/* eslint-disable */\n// @ts-nocheck\n\nexport const layouts: any[] = [];\nexport const notFoundRoutes: any[] = [];\n\nexport function matchRoute(pathname: string): any {\n return null;\n}\n\nexport type RouteParams = Record<string, never>;\n`;\n\n\tconst STUB_CONTENT = `// 🚨 Auto-generated stub by Reroute - DO NOT EDIT 🚨\n// This will be replaced by actual content\n/* eslint-disable */\n// @ts-nocheck\n\nexport const contentRegistry: Record<string, any> = {};\n`;\n\n\tconst STUB_INDEX = `// 🚨 Auto-generated stub by Reroute - DO NOT EDIT 🚨\n// This will be replaced by actual artifacts\n/* eslint-disable */\n// @ts-nocheck\n\nimport { layouts, matchRoute, notFoundRoutes } from './routes';\n\nexport const artifacts = {\n layouts,\n matchRoute,\n notFoundRoutes,\n contentBaseUrl: '/.reroute/collections'\n} as const;\n\nexport type RerouteArtifacts = typeof artifacts;\n`;\n\n\tawait Bun.write(join(cwd, OUTPUT_ROUTES), STUB_ROUTES);\n\tawait Bun.write(join(cwd, OUTPUT_CONTENT_TS), STUB_CONTENT);\n\tawait Bun.write(join(cwd, OUTPUT_INDEX), STUB_INDEX);\n\n\tconsole.log('[reroute/gen] Initialized stub files');\n}\n\nasync function scanDirectory(dir: string, base = ''): Promise<string[]> {\n\tconst files: string[] = [];\n\tconst entries = await readdir(dir, { withFileTypes: true });\n\n\tfor (const entry of entries) {\n\t\tconst fullPath = join(dir, entry.name);\n\t\tconst relativePath = join(base, entry.name);\n\n\t\tif (entry.isDirectory()) {\n\t\t\t// Skip content directories; those are not routes\n\t\t\tif (entry.name === 'content') continue;\n\t\t\tconst nested = await scanDirectory(fullPath, relativePath);\n\t\t\tfiles.push(...nested);\n\t\t} else if (\n\t\t\tentry.isFile() &&\n\t\t\t(entry.name.endsWith('.tsx') ||\n\t\t\t\tentry.name.endsWith('.ts') ||\n\t\t\t\tentry.name.endsWith('.md') ||\n\t\t\t\tentry.name.endsWith('.mdx'))\n\t\t) {\n\t\t\t// Skip non-route files and any files under a content/ segment\n\t\t\tif (\n\t\t\t\trelativePath.includes('/content/') ||\n\t\t\t\trelativePath.startsWith('content/')\n\t\t\t) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (/\\[(?:layout\\+)?skeleton\\]\\.(tsx|ts)$/i.test(entry.name)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (!entry.name.startsWith('_') || entry.name === '[layout].tsx') {\n\t\t\t\tfiles.push(relativePath);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn files;\n}\n\n// Recursively scan for [404].tsx or [404].ts anywhere under routes, including content dirs\nasync function scan404Files(dir: string, base = ''): Promise<string[]> {\n\tconst files: string[] = [];\n\tconst entries = await readdir(dir, { withFileTypes: true });\n\tfor (const entry of entries) {\n\t\tconst fullPath = join(dir, entry.name);\n\t\tconst relativePath = join(base, entry.name);\n\t\tif (entry.isDirectory()) {\n\t\t\tconst nested = await scan404Files(fullPath, relativePath);\n\t\t\tfiles.push(...nested);\n\t\t} else if (entry.isFile()) {\n\t\t\tif (/^\\[404]\\.(tsx|ts)$/.test(entry.name)) files.push(relativePath);\n\t\t}\n\t}\n\treturn files;\n}\n\nfunction fileToRoute(filePath: string): RouteFile {\n\tconst isLayout =\n\t\tfilePath.endsWith('[layout].tsx') ||\n\t\tfilePath.endsWith('[layout].ts') ||\n\t\tfilePath.endsWith('[layout].md') ||\n\t\tfilePath.endsWith('[layout].mdx');\n\n\t// Remove extension\n\tlet routePath = filePath.replace(/\\.(tsx|ts|md|mdx)$/, '');\n\n\t// Handle layouts: pattern is directory, but path keeps [layout] for imports\n\tif (isLayout) {\n\t\t// Pattern is the directory without [layout]\n\t\tconst pattern = routePath.replace(/\\[layout\\]$/, '').replace(/\\/$/, '');\n\t\tconst normalizedPattern = pattern === '' ? '/' : `/${pattern}`;\n\n\t\treturn {\n\t\t\tpath: routePath, // Keep [layout] for imports: \"blog/[layout]\"\n\t\t\tpattern: normalizedPattern, // Pattern for matching: \"/blog\"\n\t\t\tfilePath,\n\t\t\tisLayout,\n\t\t\tisDynamic: false,\n\t\t\tparams: [],\n\t\t\tisNotFound: false,\n\t\t};\n\t}\n\n\t// Convert index to /\n\troutePath = routePath.replace(/\\/index$/, '').replace(/^index$/, '');\n\n\t// Extract params from [param] syntax\n\tconst params: string[] = [];\n\tconst pattern = routePath.replace(/\\[([^\\]]+)\\]/g, (_, param) => {\n\t\tparams.push(param);\n\t\treturn `:${param}`;\n\t});\n\n\t// Ensure leading slash\n\tconst normalizedPattern = pattern === '' ? '/' : `/${pattern}`;\n\n\t// Special case: [404].tsx files act as NotFound entries for their directory\n\tconst isNotFound = /(^|\\/)\\[404\\]$/.test(routePath);\n\tlet notFoundBasePattern: string | undefined;\n\tif (isNotFound) {\n\t\tconst base = routePath.replace(/(^|\\/)\\[404\\]$/, '').replace(/\\/$/, '');\n\t\tnotFoundBasePattern = base ? `/${base}` : '/';\n\t}\n\n\treturn {\n\t\tpath: routePath,\n\t\tpattern: normalizedPattern,\n\t\tfilePath,\n\t\tisLayout: false,\n\t\tisDynamic: params.length > 0,\n\t\tparams,\n\t\tisNotFound,\n\t\tnotFoundBasePattern,\n\t};\n}\n\nfunction sortRoutes(routes: RouteFile[]): RouteFile[] {\n\t// Sort by specificity: static routes first, then dynamic, then catch-all\n\treturn routes.sort((a, b) => {\n\t\tconst aDepth = a.pattern.split('/').length;\n\t\tconst bDepth = b.pattern.split('/').length;\n\n\t\t// Deeper routes first\n\t\tif (aDepth !== bDepth) return bDepth - aDepth;\n\n\t\t// Static before dynamic\n\t\tif (!a.isDynamic && b.isDynamic) return -1;\n\t\tif (a.isDynamic && !b.isDynamic) return 1;\n\n\t\t// Alphabetical\n\t\treturn a.pattern.localeCompare(b.pattern);\n\t});\n}\n\nfunction generateRouteTree(files: string[]): RouteTree {\n\tconst routes: RouteFile[] = [];\n\tconst layouts: RouteFile[] = [];\n\tconst notFoundRoutes: RouteFile[] = [];\n\n\tfor (const file of files) {\n\t\tconst route = fileToRoute(file);\n\t\tif (route.isLayout) {\n\t\t\tlayouts.push(route);\n\t\t} else if (route.isNotFound) {\n\t\t\t// Do not include [404] as a normal route; store separately\n\t\t\tnotFoundRoutes.push(route);\n\t\t} else {\n\t\t\troutes.push(route);\n\t\t}\n\t}\n\n\treturn {\n\t\troutes: sortRoutes(routes),\n\t\tlayouts,\n\t\tnotFoundRoutes: notFoundRoutes,\n\t};\n}\n\n/**\n * Generate import path for a route file\n * Markdown files are imported from .reroute/markdown/, others from src/client/routes/\n */\nfunction getImportPath(\n\tfilePath: string,\n\tstreamingMap?: Map<string, StreamingAnalysis>,\n): string {\n\tconst isMarkdown = /\\.(md|mdx)$/.test(filePath);\n\n\tif (isMarkdown) {\n\t\t// Import from converted markdown in .reroute/markdown/\n\t\tconst pathWithoutExt = filePath.replace(/\\.(md|mdx)$/, '');\n\t\treturn `./markdown/${pathWithoutExt}`;\n\t}\n\n\tconst streamingEntry = streamingMap?.get(filePath);\n\tif (streamingEntry?.needsStreaming) {\n\t\tconst pathWithoutExt = filePath.replace(/\\.(tsx|ts)$/, '');\n\t\treturn `./streaming/${pathWithoutExt}`;\n\t}\n\n\t// Import from source\n\tconst pathWithoutExt = filePath.replace(/\\.(tsx|ts)$/, '');\n\treturn `../src/client/routes/${pathWithoutExt}`;\n}\n\nfunction generateTypeScript(\n\ttree: RouteTree,\n\tstreamingMap: Map<string, StreamingAnalysis>,\n): string {\n\t// Import createLazyRoute helper for code splitting\n\tconst helperImport = \"import { createLazyRoute } from 'reroute-js/react';\";\n\n\t// Import eager versions of all route components for SSR\n\tconst eagerImports = [\n\t\t...tree.routes.map(\n\t\t\t(r, i) =>\n\t\t\t\t`import Route${i}Eager from '${getImportPath(\n\t\t\t\t\tr.filePath,\n\t\t\t\t\tstreamingMap,\n\t\t\t\t)}';`,\n\t\t),\n\t\t...tree.layouts.map(\n\t\t\t(l, i) =>\n\t\t\t\t`import Layout${i}Eager from '${getImportPath(\n\t\t\t\t\tl.filePath,\n\t\t\t\t\tstreamingMap,\n\t\t\t\t)}';`,\n\t\t),\n\t\t...tree.notFoundRoutes.map(\n\t\t\t(nf, i) =>\n\t\t\t\t`import NotFound${i}Eager from '${getImportPath(\n\t\t\t\t\tnf.filePath,\n\t\t\t\t\tstreamingMap,\n\t\t\t\t)}';`,\n\t\t),\n\t].join('\\n');\n\n\t// Create lazy-wrapped versions for code splitting\n\tconst lazyWrappers = [\n\t\t...tree.routes.map((r, i) => {\n\t\t\tconst importPath = getImportPath(r.filePath, streamingMap);\n\t\t\treturn `const Route${i} = createLazyRoute(Route${i}Eager, () => import('${importPath}'), \"${r.pattern}\");`;\n\t\t}),\n\t\t...tree.layouts.map((l, i) => {\n\t\t\tconst importPath = getImportPath(l.filePath, streamingMap);\n\t\t\treturn `const Layout${i} = createLazyRoute(Layout${i}Eager, () => import('${importPath}'), \"${l.pattern}\");`;\n\t\t}),\n\t\t...tree.notFoundRoutes.map((nf, i) => {\n\t\t\tconst importPath = getImportPath(nf.filePath, streamingMap);\n\t\t\treturn `const NotFound${i} = createLazyRoute(NotFound${i}Eager, () => import('${importPath}'), \"${nf.notFoundBasePattern || '/'}\");`;\n\t\t}),\n\t].join('\\n');\n\n\tconst routesArray = tree.routes\n\t\t.map((r, i) => {\n\t\t\treturn ` {\n pattern: \"${r.pattern}\",\n path: \"${r.path}\",\n component: Route${i},\n params: ${JSON.stringify(r.params)},\n isDynamic: ${r.isDynamic},\n } as const`;\n\t\t})\n\t\t.join(',\\n');\n\n\tconst routePatterns = tree.routes.map((r) => ` | \"${r.pattern}\"`).join('\\n');\n\n\tconst routeParamsUnion = tree.routes\n\t\t.filter((r) => r.isDynamic)\n\t\t.map((r) => {\n\t\t\tconst params = r.params.map((p) => `${p}: string`).join('; ');\n\t\t\treturn ` T extends \"${r.pattern}\" ? { ${params} } :`;\n\t\t})\n\t\t.join('\\n');\n\n\tconst layoutsArray = tree.layouts\n\t\t.map((l, i) => {\n\t\t\treturn ` {\n pattern: \"${l.pattern}\",\n path: \"${l.path}\",\n component: Layout${i},\n } as const`;\n\t\t})\n\t\t.join(',\\n');\n\n\tconst notFoundRoutesArray = tree.notFoundRoutes\n\t\t.map((nf, i) => {\n\t\t\treturn ` {\n pattern: \"${nf.notFoundBasePattern || '/'}\",\n path: \"${nf.path}\",\n component: NotFound${i},\n } as const`;\n\t\t})\n\t\t.join(',\\n');\n\n\treturn `// 🚨 Auto-generated by Reroute - DO NOT EDIT 🚨\n/* eslint-disable */\n// @ts-nocheck\n\n${helperImport}\n\n${eagerImports}\n\n${lazyWrappers}\n\nexport const routes: RouteInfo = [\n${routesArray}\n] as const;\n\nexport const layouts = [\n${layoutsArray || ''}\n] as const;\n\nexport const notFoundRoutes = [\n${notFoundRoutesArray || ''}\n] as const;\n\nexport type RoutePath =\n${routePatterns || ' | \"/\"'};\n\nexport type RouteParams<T extends RoutePath> = ${\n\t\trouteParamsUnion\n\t\t\t? `\\n${routeParamsUnion}\\n Record<string, never>;`\n\t\t\t: 'Record<string, never>;'\n\t}\n\nexport interface Route {\n pattern: string;\n path: string;\n component: any;\n params: string[];\n isDynamic: boolean;\n}\n\nexport function matchRoute(pathname: string): { route: Route; params: Record<string, string> } | null {\n for (const route of routes) {\n const match = matchPattern(route.pattern, pathname);\n if (match) {\n return { route, params: match };\n }\n }\n return null;\n}\n\nfunction matchPattern(pattern: string, pathname: string): Record<string, string> | null {\n const patternParts = pattern.split('/').filter(Boolean);\n const pathnameParts = pathname.split('/').filter(Boolean);\n\n if (patternParts.length !== pathnameParts.length) {\n return null;\n }\n\n const params: Record<string, string> = {};\n\n for (let i = 0; i < patternParts.length; i++) {\n const patternPart = patternParts[i];\n const pathnamePart = pathnameParts[i];\n\n if (patternPart.startsWith(':')) {\n params[patternPart.slice(1)] = pathnamePart;\n } else if (patternPart !== pathnamePart) {\n return null;\n }\n }\n\n return params;\n}\n`;\n}\n\nasync function buildStreamingWrappersForTree(\n\tcwd: string,\n\troutesPath: string,\n\ttree: RouteTree,\n\tconfig: RerouteConfig,\n): Promise<Map<string, StreamingAnalysis>> {\n\tconst streamingDir = join(cwd, '.reroute', 'streaming');\n\tconst analyses = new Map<string, StreamingAnalysis>();\n\tconst candidates = [\n\t\t...tree.routes.map((route) => ({\n\t\t\tfilePath: route.filePath,\n\t\t\ttype: 'route' as const,\n\t\t})),\n\t\t...tree.layouts.map((layout) => ({\n\t\t\tfilePath: layout.filePath,\n\t\t\ttype: 'layout' as const,\n\t\t})),\n\t\t...tree.notFoundRoutes.map((nf) => ({\n\t\t\tfilePath: nf.filePath,\n\t\t\ttype: 'route' as const,\n\t\t})),\n\t];\n\n\tfor (const candidate of candidates) {\n\t\tif (!/\\.(tsx|ts)$/.test(candidate.filePath)) continue;\n\n\t\tconst absolutePath = join(routesPath, candidate.filePath);\n\t\tconst analysis = await analyzeRouteForStreaming({\n\t\t\tabsolutePath,\n\t\t\trelativePath: candidate.filePath,\n\t\t\ttype: candidate.type,\n\t\t\troutesDir: routesPath,\n\t\t});\n\n\t\tif (!analysis.needsStreaming) continue;\n\n\t\tconst wrapperPath = join(streamingDir, candidate.filePath).replace(\n\t\t\t/\\.(tsx|ts)$/,\n\t\t\t'.tsx',\n\t\t);\n\t\tawait mkdir(dirname(wrapperPath), { recursive: true });\n\n\t\tconst code = await generateStreamingWrapper({\n\t\t\tcwd,\n\t\t\trelativeFilePath: candidate.filePath,\n\t\t\tanalysis,\n\t\t\tconfig,\n\t\t});\n\n\t\tawait Bun.write(wrapperPath, code);\n\t\tanalyses.set(candidate.filePath, analysis);\n\t\tconsole.log(`[reroute/streaming] Wrapped ${candidate.filePath}`);\n\t}\n\n\tif (analyses.size > 0) {\n\t\tconsole.log(\n\t\t\t`[reroute/streaming] Generated ${analyses.size} streaming wrapper${\n\t\t\t\tanalyses.size === 1 ? '' : 's'\n\t\t\t}`,\n\t\t);\n\t}\n\n\treturn analyses;\n}\n\nasync function listContentFiles(collectionDir: string): Promise<string[]> {\n\ttry {\n\t\tconst entries = await readdir(collectionDir, { withFileTypes: true });\n\t\treturn entries\n\t\t\t.filter(\n\t\t\t\t(e) =>\n\t\t\t\t\te.isFile() &&\n\t\t\t\t\t/\\.(tsx|ts|md|mdx)$/.test(e.name) &&\n\t\t\t\t\t!e.name.startsWith('_'),\n\t\t\t)\n\t\t\t.map((e) => e.name);\n\t} catch {\n\t\treturn [];\n\t}\n}\n\nasync function sha8(text: string): Promise<string> {\n\tconst data = new TextEncoder().encode(text);\n\tconst buf = await crypto.subtle.digest('SHA-256', data);\n\tlet hex = '';\n\tfor (const b of new Uint8Array(buf)) hex += b.toString(16).padStart(2, '0');\n\treturn hex.slice(0, 8);\n}\n\nasync function buildContentChunks(cwd: string, args: string[] = []) {\n\tconst routesRoot = join(cwd, ROUTES_DIR);\n\tconsole.log(`[reroute/content] scan ${routesRoot}`);\n\t// Find any '<collection>/content/*.(ts|tsx)'\n\tconst collections = await readdir(routesRoot, { withFileTypes: true });\n\n\tconst results: Array<{\n\t\tcollection: string;\n\t\tname: string;\n\t\tslug: string;\n\t\thref: string;\n\t\tmoduleUrl: string;\n\t\tmeta: Doc;\n\t}> = [];\n\n\tfor (const c of collections) {\n\t\tif (!c.isDirectory()) continue;\n\t\tconst collection = c.name;\n\t\tconst contentDir = join(routesRoot, collection, 'content');\n\t\tconsole.log(`[reroute/content] collection ${collection} dir ${contentDir}`);\n\t\tconst files = await listContentFiles(contentDir);\n\t\tconsole.log(`[reroute/content] files ${files.length}`);\n\t\tif (!files.length) continue;\n\n\t\tfor (const file of files) {\n\t\t\tconst name = file.replace(/\\.(tsx|ts|md|mdx)$/, '');\n\t\t\tconst absSrc = join(contentDir, file);\n\t\t\tconst isMarkdown = /\\.(md|mdx)$/.test(file);\n\n\t\t\t// For markdown files, use the converted version from .reroute/markdown/\n\n\t\t\tconst buildSrc = isMarkdown\n\t\t\t\t? join(\n\t\t\t\t\t\tcwd,\n\t\t\t\t\t\t'.reroute',\n\t\t\t\t\t\t'markdown',\n\t\t\t\t\t\tcollection,\n\t\t\t\t\t\t'content',\n\t\t\t\t\t\t`${name}.tsx`,\n\t\t\t\t\t)\n\t\t\t\t: absSrc;\n\n\t\t\t// If targeting a converted markdown module, ensure it exists\n\t\t\tif (isMarkdown) {\n\t\t\t\ttry {\n\t\t\t\t\tconst exists = await Bun.file(buildSrc).exists();\n\t\t\t\t\tif (!exists) {\n\t\t\t\t\t\tconsole.warn(\n\t\t\t\t\t\t\t`[reroute/content] Converted markdown missing, skipping: ${buildSrc}`,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t} catch {}\n\t\t\t}\n\t\t\t// Build to JS once (no minify) for dev reliability\n\t\t\tlet code = '';\n\t\t\ttry {\n\t\t\t\tconst isProd = isProductionMode(args);\n\t\t\t\tconst result = await Bun.build({\n\t\t\t\t\tentrypoints: [buildSrc],\n\t\t\t\t\ttarget: 'browser',\n\t\t\t\t\tformat: 'esm',\n\t\t\t\t\tsplitting: false,\n\t\t\t\t\tsourcemap: isProd ? 'linked' : 'none',\n\t\t\t\t\tminify: isProd,\n\t\t\t\t\tdefine: {\n\t\t\t\t\t\t'process.env.NODE_ENV': isProd ? '\"production\"' : '\"development\"',\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t\tif (!result.success) throw new Error('build failed');\n\t\t\t\tcode = await result.outputs[0].text();\n\t\t\t} catch (e) {\n\t\t\t\tconsole.error(\n\t\t\t\t\t'[reroute/gen] Failed to build content chunk:',\n\t\t\t\t\tabsSrc,\n\t\t\t\t\te,\n\t\t\t\t);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst hash = await sha8(code);\n\t\t\t// Use bundles directory which is already being served\n\t\t\tconst chunkRelDir = join('.reroute', 'bundles');\n\t\t\tconst chunkAbsDir = join(cwd, chunkRelDir);\n\t\t\t// Prefix with collection to avoid name collisions\n\t\t\tconst outFile = `${collection}-${name}.${hash}.js`;\n\t\t\tconst absOut = join(chunkAbsDir, outFile);\n\t\t\ttry {\n\t\t\t\tconst exists = await Bun.file(absOut).exists();\n\t\t\t\tif (!exists) await Bun.write(absOut, code);\n\t\t\t} catch {}\n\n\t\t\t// Meta via source import (not bundled)\n\t\t\tlet meta: Doc = {};\n\t\t\ttry {\n\t\t\t\tconst url = `${pathToFileURL(buildSrc).href}?t=${Date.now()}`;\n\t\t\t\tconst m = await import(url);\n\t\t\t\tmeta = (m as Doc).meta || {};\n\t\t\t} catch {}\n\n\t\t\tresults.push({\n\t\t\t\tcollection,\n\t\t\t\tname,\n\t\t\t\tslug: name,\n\t\t\t\thref: `/${collection}/${name}`,\n\t\t\t\tmoduleUrl: `/bundles/${outFile}`,\n\t\t\t\tmeta,\n\t\t\t});\n\t\t}\n\t}\n\n\t// Write .reroute/content.ts (types for tooling only)\n\tconst lines: string[] = [];\n\tlines.push('// 🚨 Auto-generated by Reroute - DO NOT EDIT 🚨');\n\tlines.push('/* eslint-disable */');\n\tlines.push('// @ts-nocheck');\n\tlines.push('');\n\tlines.push('export const contents = [');\n\tfor (const e of results) {\n\t\tlines.push(\n\t\t\t\" { collection: '\" +\n\t\t\t\te.collection +\n\t\t\t\t\"', slug: '\" +\n\t\t\t\te.slug +\n\t\t\t\t\"', name: '\" +\n\t\t\t\te.name +\n\t\t\t\t\"', href: '\" +\n\t\t\t\te.href +\n\t\t\t\t\"', module: '\" +\n\t\t\t\te.moduleUrl +\n\t\t\t\t\"', meta: \" +\n\t\t\t\tJSON.stringify(e.meta || {}) +\n\t\t\t\t' },',\n\t\t);\n\t}\n\tlines.push('] as const;');\n\tlines.push('');\n\tlines.push('export const byCollection: Record<string, any[]> = {};');\n\tlines.push(\n\t\t'for (const c of contents) { (byCollection[c.collection] ||= []).push(c as any); }',\n\t);\n\tlines.push('');\n\tlines.push(\n\t\t'export const byCollectionAndName: Record<string, Record<string, any>> = {};',\n\t);\n\tlines.push(\n\t\t'for (const c of contents) { ((byCollectionAndName[c.collection] ||= {})[c.name] = c as any); }',\n\t);\n\tlines.push('');\n\tlines.push('export type Collections = keyof typeof byCollection;');\n\tlines.push(\n\t\t'export type Names<C extends Collections> = keyof (typeof byCollectionAndName)[C];',\n\t);\n\tlines.push('export type ContentEntry = (typeof contents)[number];');\n\tlines.push('');\n\tlines.push(\n\t\t'export function getContentEntry<C extends string, N extends string>(collection: C, name: N) {',\n\t);\n\tlines.push(' const m = (byCollectionAndName as any)[collection];');\n\tlines.push(' return m ? (m as Record<string, any>)[name] : undefined;');\n\tlines.push('}');\n\tlines.push('');\n\n\tawait Bun.write(join(cwd, OUTPUT_CONTENT_TS), lines.join('\\n'));\n\tconsole.log(`[reroute/content] wrote ${join(cwd, OUTPUT_CONTENT_TS)}`);\n\n\t// Write per-collection runtime ESM files under .reroute/collections/<collection>.js\n\tconst collectionsSet = new Set(results.map((r) => r.collection));\n\tfor (const collection of collectionsSet) {\n\t\tconst items = results.filter((r) => r.collection === collection);\n\t\tconst js: string[] = [];\n\t\tjs.push('// 🚨 Auto-generated by Reroute - DO NOT EDIT 🚨');\n\t\tjs.push('');\n\t\tjs.push('export const items = [');\n\t\tfor (const e of items) {\n\t\t\tjs.push(\n\t\t\t\t` { collection: '${e.collection}', slug: '${e.slug}', name: '${e.name}', href: '${e.href}', module: '${e.moduleUrl}', meta: ${JSON.stringify(e.meta || {})} },`,\n\t\t\t);\n\t\t}\n\t\tjs.push('];');\n\t\tjs.push('');\n\t\tjs.push('export const byName = {};');\n\t\tjs.push('for (const it of items) { byName[it.name] = it; }');\n\t\tjs.push('');\n\t\tjs.push('export function get(collectionName, name) {');\n\t\tjs.push(` if (collectionName !== '${collection}') return undefined;`);\n\t\tjs.push(' return byName[name];');\n\t\tjs.push('}');\n\t\tjs.push('');\n\n\t\tawait Bun.write(\n\t\t\tjoin(cwd, OUTPUT_COLLECTIONS_DIR, `${collection}.js`),\n\t\t\tjs.join('\\n'),\n\t\t);\n\t\tconsole.log(\n\t\t\t`[reroute/content] wrote ${join(cwd, OUTPUT_COLLECTIONS_DIR, `${collection}.js`)}`,\n\t\t);\n\t}\n}\n\nasync function preprocessMarkdownFiles(cwd: string): Promise<void> {\n\tconsole.log('[reroute/markdown] Starting markdown preprocessing...');\n\tconst routesPath = join(cwd, ROUTES_DIR);\n\tconst markdownDir = join(cwd, '.reroute', 'markdown');\n\n\t// Clean up previous markdown conversions\n\ttry {\n\t\tawait rm(markdownDir, { force: true, recursive: true });\n\t} catch {}\n\n\t// Check configuration but continue regardless (we will fallback if needed)\n\tconst markdownConfig = getMarkdownConfig(cwd);\n\tconsole.log('[reroute/markdown] Config:', markdownConfig);\n\n\t// Bun.write creates directories automatically, no need for mkdir\n\n\t// Scan for markdown files (including in content directories)\n\tasync function scanMarkdown(dir: string, base = ''): Promise<string[]> {\n\t\tconst files: string[] = [];\n\t\ttry {\n\t\t\tconst entries = await readdir(dir, { withFileTypes: true });\n\n\t\t\tfor (const entry of entries) {\n\t\t\t\tconst fullPath = join(dir, entry.name);\n\t\t\t\tconst relativePath = join(base, entry.name);\n\n\t\t\t\tif (entry.isDirectory()) {\n\t\t\t\t\t// Process content directories too\n\t\t\t\t\tconst nested = await scanMarkdown(fullPath, relativePath);\n\t\t\t\t\tfiles.push(...nested);\n\t\t\t\t} else if (entry.isFile() && isMarkdownFile(entry.name)) {\n\t\t\t\t\tfiles.push(relativePath);\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (err) {\n\t\t\tconsole.error(`[reroute/markdown] Error scanning ${dir}:`, err);\n\t\t}\n\n\t\treturn files;\n\t}\n\n\tconsole.log(\n\t\t`[reroute/markdown] Scanning ${routesPath} for markdown files...`,\n\t);\n\tconst markdownFiles = await scanMarkdown(routesPath);\n\tconsole.log(\n\t\t`[reroute/markdown] Scan complete. Found files:`,\n\t\tmarkdownFiles.length,\n\t);\n\n\tif (markdownFiles.length === 0) {\n\t\tconsole.log(\n\t\t\t'[reroute/markdown] No markdown files found, skipping preprocessing',\n\t\t);\n\t\treturn;\n\t}\n\n\tconsole.log(\n\t\t`[reroute/markdown] Found ${markdownFiles.length} markdown file(s)`,\n\t);\n\n\t// Bun.write creates directories automatically\n\n\t// Process each markdown file\n\tfor (const file of markdownFiles) {\n\t\tconst sourcePath = join(routesPath, file);\n\t\tconst targetPath = join(markdownDir, file.replace(/\\.mdx?$/, '.tsx'));\n\n\t\ttry {\n\t\t\tconst processed = processMarkdownFile(sourcePath);\n\t\t\tconst isMdx = file.endsWith('.mdx');\n\n\t\t\tlet moduleCode: string;\n\t\t\tif (markdownConfig.isConfigured) {\n\t\t\t\tmoduleCode = await generateMarkdownModule(processed, cwd, {\n\t\t\t\t\tenableGfm: markdownConfig.hasRemarkGfm,\n\t\t\t\t\ttheme: 'github-dark',\n\t\t\t\t\tisMdx,\n\t\t\t\t\tfilename: file,\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tmoduleCode = generatePlainMarkdownModule(processed);\n\t\t\t}\n\n\t\t\t// Bun.write creates parent directories automatically\n\t\t\tawait Bun.write(targetPath, moduleCode);\n\t\t} catch (error) {\n\t\t\tconsole.error(`[reroute/markdown] Failed to process ${file}:`, error);\n\t\t}\n\t}\n}\n\nasync function buildEntrypointBundle(cwd: string, args: string[] = []) {\n\tconst clientDir = join(cwd, 'src', 'client');\n\tconst entrypoint = join(clientDir, 'index.tsx');\n\n\t// Check if entrypoint exists\n\tconst exists = await Bun.file(entrypoint).exists();\n\tif (!exists) {\n\t\tconsole.log('[reroute/gen] No index.tsx found, skipping bundle build');\n\t\treturn;\n\t}\n\n\tconsole.log(\n\t\t'[reroute/gen] Building entrypoint bundle with code splitting...',\n\t);\n\n\tconst isProd = isProductionMode(args);\n\tconst bundlesDir = join(cwd, '.reroute', 'bundles');\n\n\t// Ensure bundles directory exists\n\tawait mkdir(bundlesDir, { recursive: true });\n\n\t// Build without outdir - keep files in memory to avoid race conditions\n\tconst result = await Bun.build({\n\t\tentrypoints: [entrypoint],\n\t\ttarget: 'browser',\n\t\tformat: 'esm',\n\t\tsplitting: true,\n\t\tsourcemap: isProd ? 'linked' : 'external',\n\t\tminify: isProd,\n\t\t// Don't use outdir - we'll write files manually for better control\n\t\t// Ensure content-based hashing for cache busting\n\t\tnaming: {\n\t\t\tentry: '[name].[hash].[ext]',\n\t\t\tchunk: 'chunk.[hash].[ext]',\n\t\t\tasset: '[name].[hash].[ext]',\n\t\t},\n\t\tjsx: {\n\t\t\truntime: 'automatic',\n\t\t\timportSource: 'react',\n\t\t\tdevelopment: !isProd,\n\t\t},\n\t\tdefine: {\n\t\t\t'process.env.NODE_ENV': isProd ? '\"production\"' : '\"development\"',\n\t\t\t__DEV__: isProd ? 'false' : 'true',\n\t\t\t'import.meta.env.MODE': isProd ? '\"production\"' : '\"development\"',\n\t\t},\n\t\t...(isProd ? { drop: ['console', 'debugger'] } : {}),\n\t});\n\n\tif (!result.success) {\n\t\tconsole.error('[reroute/gen] Entrypoint build failed:');\n\t\tfor (const log of result.logs) console.error(log);\n\t\tthrow new Error('Failed to build entrypoint');\n\t}\n\n\t// First, read all outputs into memory before any file operations\n\tconst outputs: Array<{\n\t\tfileName: string;\n\t\tcontent: string;\n\t\tsize: number;\n\t\tisEntry: boolean;\n\t}> = [];\n\n\tlet entryFile = '';\n\tlet entryContent = '';\n\n\tfor (const output of result.outputs) {\n\t\tconst fileName =\n\t\t\toutput.path.split('/').pop() ||\n\t\t\toutput.path.split('\\\\').pop() ||\n\t\t\t'unknown';\n\n\t\tconst content = await output.text();\n\t\tconst isEntry =\n\t\t\tfileName.startsWith('index.') &&\n\t\t\tfileName.endsWith('.js') &&\n\t\t\t!fileName.endsWith('.map');\n\n\t\tif (isEntry) {\n\t\t\tentryFile = fileName;\n\t\t\tentryContent = content;\n\t\t}\n\n\t\toutputs.push({\n\t\t\tfileName,\n\t\t\tcontent,\n\t\t\tsize: content.length,\n\t\t\tisEntry,\n\t\t});\n\t}\n\n\t// Get list of new files for cleanup\n\tconst newFiles = new Set(outputs.map((o) => o.fileName));\n\n\t// Clean up old bundle files BEFORE writing new ones\n\t// Only delete files that are not in the new build outputs\n\ttry {\n\t\tconst existingFiles = await readdir(bundlesDir);\n\t\tfor (const file of existingFiles) {\n\t\t\t// Remove old index.*.js, chunk.*.js files and their sourcemaps\n\t\t\t// but only if they're not in the new build outputs\n\t\t\tif (\n\t\t\t\t/^(index|chunk)\\.[a-z0-9]+\\.(js|js\\.map)$/i.test(file) &&\n\t\t\t\t!newFiles.has(file)\n\t\t\t) {\n\t\t\t\tawait rm(join(bundlesDir, file), { force: true });\n\t\t\t}\n\t\t}\n\t} catch (error) {\n\t\t// Cleanup errors shouldn't fail the build\n\t\tconsole.warn('[reroute/gen] Warning: cleanup failed:', error);\n\t}\n\n\t// Now write all new files\n\tfor (const output of outputs) {\n\t\tconst destPath = join(bundlesDir, output.fileName);\n\t\tawait Bun.write(destPath, output.content);\n\t}\n\n\t// Calculate stats\n\tconst totalSize = outputs.reduce((sum, o) => sum + o.size, 0);\n\tconst gzipped = entryContent\n\t\t? Bun.gzipSync(new TextEncoder().encode(entryContent)).length\n\t\t: 0;\n\tconst chunkCount = outputs.filter(\n\t\t(o) =>\n\t\t\t!o.fileName.startsWith('index.') &&\n\t\t\to.fileName.endsWith('.js') &&\n\t\t\t!o.fileName.endsWith('.map'),\n\t).length;\n\n\tconsole.log(\n\t\t`[reroute/gen] Built ${outputs.length} files (${(totalSize / 1024).toFixed(2)}KB, ${(gzipped / 1024).toFixed(2)}KB gzipped)`,\n\t);\n\tconsole.log(`[reroute/gen] Entry: ${entryFile}`);\n\tconsole.log(`[reroute/gen] Chunks: ${chunkCount}`);\n}\n\ntype GenerateOptions = {\n\tclean?: boolean;\n\twriteStubs?: boolean;\n};\n\nasync function generate(\n\tcwd: string,\n\targs: string[] = [],\n\toptions: GenerateOptions = {},\n) {\n\tconst { clean = true, writeStubs = true } = options;\n\tconst startTime = performance.now();\n\tconsole.log('[reroute/gen] Starting generation...');\n\n\tconst config = await loadConfig(cwd);\n\tconst streamingEnabled = config.streaming?.enabled ?? false;\n\n\t// Ensure output directory exists and cleanup if needed\n\tawait ensureOutputDir(cwd, { clean });\n\n\t// Write minimal stub files first so server can start immediately\n\t// This replaces the old \"boot\" functionality but happens inline\n\tif (writeStubs) {\n\t\tawait writeStubFiles(cwd);\n\t}\n\n\t// Preprocess markdown files before route generation\n\tawait preprocessMarkdownFiles(cwd);\n\n\t// Routes\n\tconst routesPath = join(cwd, ROUTES_DIR);\n\ttry {\n\t\tconst files = await scanDirectory(routesPath);\n\t\tconst nfFiles = await scan404Files(routesPath);\n\t\tconst all = Array.from(new Set([...files, ...nfFiles]));\n\n\t\t// Keep markdown routes; preprocess will generate fallback modules\n\t\tconst tree = generateRouteTree(all.map((f) => f.replace(/\\\\/g, '/')));\n\t\tconst streamingAnalyses = streamingEnabled\n\t\t\t? await buildStreamingWrappersForTree(cwd, routesPath, tree, config)\n\t\t\t: new Map<string, StreamingAnalysis>();\n\t\tconst ts = generateTypeScript(tree, streamingAnalyses);\n\t\tawait Bun.write(join(cwd, OUTPUT_ROUTES), ts);\n\t\tconsole.log(`[reroute/gen] Generated routes: ${join(cwd, OUTPUT_ROUTES)}`);\n\t} catch (error) {\n\t\tconsole.error('[reroute/gen] Failed to generate routes:', error);\n\t\tthrow error;\n\t}\n\n\t// Content\n\ttry {\n\t\tawait buildContentChunks(cwd, args);\n\t\tconsole.log(\n\t\t\t`[reroute/gen] Generated content: ${join(cwd, OUTPUT_CONTENT_TS)} + collections/*.js`,\n\t\t);\n\t} catch (error) {\n\t\tconsole.error('[reroute/gen] Failed to generate content:', error);\n\t\tthrow error;\n\t}\n\n\t// Write .reroute/index.ts aggregator (before bundle build so it can be imported)\n\tconst indexLines: string[] = [];\n\tindexLines.push('// 🚨 Auto-generated by Reroute - DO NOT EDIT 🚨');\n\tindexLines.push('/* eslint-disable */');\n\tindexLines.push('// @ts-nocheck');\n\tindexLines.push('');\n\tindexLines.push(\n\t\t\"import { layouts, matchRoute, notFoundRoutes } from './routes';\",\n\t);\n\tindexLines.push('');\n\tindexLines.push('export const artifacts = {');\n\tindexLines.push(' layouts,');\n\tindexLines.push(' matchRoute,');\n\tindexLines.push(' notFoundRoutes,');\n\tindexLines.push(\" contentBaseUrl: '/.reroute/collections'\");\n\tindexLines.push('} as const;');\n\tindexLines.push('');\n\tindexLines.push('export type RerouteArtifacts = typeof artifacts;');\n\n\tawait Bun.write(join(cwd, OUTPUT_INDEX), indexLines.join('\\n'));\n\n\tconsole.log(`[reroute/gen] Generated index: ${join(cwd, OUTPUT_INDEX)}`);\n\n\t// Build main entrypoint bundle with code splitting\n\ttry {\n\t\tawait buildEntrypointBundle(cwd, args);\n\t} catch (error) {\n\t\tconsole.error('[reroute/gen] Failed to build entrypoint:', error);\n\t\tthrow error;\n\t}\n\n\tconst endTime = performance.now();\n\tconst duration = ((endTime - startTime) / 1000).toFixed(2);\n\tconsole.log(`[reroute/gen] Generation complete in ${duration}s`);\n}\n\nexport default async function gen(args: string[]) {\n\tconst cwd = process.cwd();\n\tconst watchMode = args.includes('--watch') || args.includes('-w');\n\tconst isProd = isProductionMode(args);\n\n\tif (!watchMode) {\n\t\tawait generate(cwd, args);\n\t\tawait buildTailwindIfConfigured(cwd, isProd);\n\t\tcheckMarkdownIfConfigured(cwd);\n\t\t// Force exit to prevent hanging (some imports may keep event loop alive)\n\t\tprocess.exit(0);\n\t}\n\n\tconsole.log('[reroute/gen] Watch mode enabled');\n\tconsole.log('[reroute/gen] Initial generation...');\n\tawait generate(cwd, args);\n\n\ttry {\n\t\tawait buildTailwindIfConfigured(cwd, isProd);\n\t\tcheckMarkdownIfConfigured(cwd);\n\t} catch {}\n\n\t// Helper: notify server to reload connected browsers (best-effort)\n\tconst notifyReload = async (reason: string) => {\n\t\tconst ports = [\n\t\t\tNumber(process.env.PORT || '0') || 0,\n\t\t\tNumber(process.env.REROUTE_PORT || '0') || 0,\n\t\t\t3001,\n\t\t\t3000,\n\t\t].filter(Boolean) as number[];\n\t\tfor (const p of ports) {\n\t\t\ttry {\n\t\t\t\tawait fetch(`http://localhost:${p}/__reroute_reload`, {\n\t\t\t\t\tmethod: 'POST',\n\t\t\t\t});\n\t\t\t\tconsole.log(\n\t\t\t\t\t`[reroute/gen] reload notified (port ${p})${reason ? `: ${reason}` : ''}`,\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t\t} catch {}\n\t\t}\n\t};\n\n\t// Notify server after initial generation to clear caches and rebuild with fresh routes\n\tawait notifyReload('initial generation');\n\n\t// Watch routes for generation + Tailwind rebuild\n\tconst routesPath = join(cwd, ROUTES_DIR);\n\tconsole.log(`[reroute/gen] Watching ${routesPath} for changes...`);\n\tlet debounce: NodeJS.Timeout | null = null;\n\tconst routesWatcher = watch(\n\t\troutesPath,\n\t\t{ recursive: true },\n\t\t(_ev, filename) => {\n\t\t\tif (!filename) return;\n\t\t\tif (debounce) clearTimeout(debounce);\n\t\t\tdebounce = setTimeout(async () => {\n\t\t\t\tconsole.log('[reroute/gen] Change detected, regenerating...');\n\t\t\t\ttry {\n\t\t\t\t\tawait generate(cwd, args, {\n\t\t\t\t\t\tclean: false,\n\t\t\t\t\t\twriteStubs: false,\n\t\t\t\t\t});\n\t\t\t\t\tawait buildTailwindIfConfigured(cwd, isProd);\n\t\t\t\t\tawait notifyReload('routes change');\n\t\t\t\t} catch (e) {\n\t\t\t\t\tconsole.error('[reroute/gen] Error during regeneration:', e);\n\t\t\t\t}\n\t\t\t}, 50);\n\t\t},\n\t);\n\n\t// Watch src/client for bundle rebuild + Tailwind changes\n\tconst clientPath = join(cwd, 'src', 'client');\n\tconsole.log(`[reroute/gen] Watching ${clientPath} for changes...`);\n\tlet twDebounce: NodeJS.Timeout | null = null;\n\tconst twWatcher = watch(clientPath, { recursive: true }, (_ev, filename) => {\n\t\tif (!filename) return;\n\t\tconst name = String(filename);\n\t\tif (name.includes('.reroute') || name.includes('node_modules')) return;\n\t\tif (name.includes('routes/') || name.includes('routes\\\\')) return;\n\t\tif (!/\\.(tsx|ts|jsx|js|html|md|mdx|css)$/.test(name)) return;\n\t\tif (twDebounce) clearTimeout(twDebounce);\n\t\ttwDebounce = setTimeout(async () => {\n\t\t\ttry {\n\t\t\t\t// Rebuild bundle if index.tsx changed or any component it imports\n\t\t\t\tif (\n\t\t\t\t\tname === 'index.tsx' ||\n\t\t\t\t\tname.includes('components/') ||\n\t\t\t\t\tname.includes('hooks/') ||\n\t\t\t\t\tname.includes('providers/')\n\t\t\t\t) {\n\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t'[reroute/gen] Client code changed, rebuilding bundle...',\n\t\t\t\t\t);\n\t\t\t\t\tawait buildEntrypointBundle(cwd, args);\n\t\t\t\t}\n\t\t\t\tawait buildTailwindIfConfigured(cwd, isProd);\n\t\t\t\tawait notifyReload('client change');\n\t\t\t} catch {}\n\t\t}, 100);\n\t});\n\n\t// Keep process running until SIGINT\n\tprocess.on('SIGINT', () => {\n\t\tconsole.log('\\n[reroute/gen] Stopping watch mode...');\n\t\ttry {\n\t\t\troutesWatcher.close();\n\t\t} catch {}\n\t\ttry {\n\t\t\ttwWatcher.close();\n\t\t} catch {}\n\t\tprocess.exit(0);\n\t});\n}\n",
|
|
42
|
+
"/**\n * Log colorization utilities\n *\n * Provides colorization for log prefixes in both blessed (TUI) and ANSI (console) formats.\n * Consumers can use [api] and [app] prefixes to differentiate their application logs.\n */\n\n/**\n * Map of prefix patterns to blessed color tags\n * Each prefix has a unique color for easy visual distinction\n */\nconst PREFIX_COLORS: Record<string, string> = {\n\t'[reroute]': '{cyan-fg}', // Base reroute logs - cyan\n\t'[reroute/gen]': '{bright-blue-fg}', // Generator - bright blue\n\t'[reroute/content]': '{magenta-fg}', // Content - magenta\n\t'[reroute/markdown]': '{yellow-fg}', // Markdown - yellow\n\t'[reroute/tailwind]': '{red-fg}', // Tailwind - red\n\t'[reroute/mdx]': '{bright-red-fg}', // MDX - bright red\n\t'[reroute/dev]': '{green-fg}', // Dev command - green\n\t'[reroute/start]': '{bright-cyan-fg}', // Start command - bright cyan\n\t'[reroute/build]': '{bright-magenta-fg}', // Build command - bright magenta\n\t'[reroute/analyze]': '{bright-green-fg}', // Analyze command - bright green\n\t'[api]': '{blue-fg}', // API logs - blue\n\t'[app]': '{bright-green-fg}', // App logs - bright green\n};\n\n/**\n * Colorize log prefixes using blessed color tags (for TUI output)\n *\n * @param text - The log text to colorize\n * @returns Text with colorized prefixes using blessed tags\n */\nexport function colorizeLogPrefix(text: string): string {\n\tlet colored = text;\n\t// Sort prefixes by length (longest first) to match more specific prefixes before general ones\n\t// e.g., [reroute/markdown] should match before [reroute]\n\tconst sortedPrefixes = Object.entries(PREFIX_COLORS).sort(\n\t\t([a], [b]) => b.length - a.length,\n\t);\n\n\tfor (const [prefix, colorTag] of sortedPrefixes) {\n\t\t// Replace prefix with colored version\n\t\tcolored = colored.replace(\n\t\t\tnew RegExp(`(${prefix.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')})`, 'g'),\n\t\t\t`${colorTag}$1{/}`,\n\t\t);\n\t}\n\n\treturn colored;\n}\n\n/**\n * Convert blessed color tags to ANSI escape codes (for console output)\n *\n * @param text - Text with blessed color tags\n * @returns Text with ANSI escape codes\n */\nexport function blessedToAnsi(text: string): string {\n\treturn (\n\t\ttext\n\t\t\t// Standard colors\n\t\t\t.replace(/\\{cyan-fg\\}/g, '\\x1b[36m')\n\t\t\t.replace(/\\{blue-fg\\}/g, '\\x1b[34m')\n\t\t\t.replace(/\\{magenta-fg\\}/g, '\\x1b[35m')\n\t\t\t.replace(/\\{yellow-fg\\}/g, '\\x1b[33m')\n\t\t\t.replace(/\\{green-fg\\}/g, '\\x1b[32m')\n\t\t\t.replace(/\\{red-fg\\}/g, '\\x1b[31m')\n\t\t\t// Bright colors\n\t\t\t.replace(/\\{bright-cyan-fg\\}/g, '\\x1b[96m')\n\t\t\t.replace(/\\{bright-blue-fg\\}/g, '\\x1b[94m')\n\t\t\t.replace(/\\{bright-magenta-fg\\}/g, '\\x1b[95m')\n\t\t\t.replace(/\\{bright-yellow-fg\\}/g, '\\x1b[93m')\n\t\t\t.replace(/\\{bright-green-fg\\}/g, '\\x1b[92m')\n\t\t\t.replace(/\\{bright-red-fg\\}/g, '\\x1b[91m')\n\t\t\t.replace(/\\{\\/\\}/g, '\\x1b[0m')\n\t);\n}\n\n/**\n * Colorize log prefixes and convert to ANSI codes (for console output)\n *\n * @param text - The log text to colorize\n * @returns Text with colorized prefixes using ANSI escape codes\n */\nexport function colorizeLogPrefixAnsi(text: string): string {\n\treturn blessedToAnsi(colorizeLogPrefix(text));\n}\n\n/**\n * Create a handler function for server output that colorizes logs\n *\n * @param buffer - Reference to a buffer string for incomplete lines\n * @returns Handler function for Buffer data\n */\nexport function createServerOutputHandler(buffer: { current: string }) {\n\treturn (data: Buffer) => {\n\t\tconst text = buffer.current + data.toString();\n\t\tconst lines = text.split('\\n');\n\t\tbuffer.current = lines.pop() || ''; // Keep last incomplete line\n\n\t\tfor (const line of lines) {\n\t\t\t// Skip empty lines\n\t\t\tconst trimmedLine = line.trim();\n\t\t\tif (!trimmedLine) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Colorize the line (preserves existing prefixes or leaves unprefixed lines as-is)\n\t\t\tconst ansiColored = colorizeLogPrefixAnsi(line);\n\t\t\tconsole.log(ansiColored);\n\t\t}\n\t};\n}\n",
|
|
43
|
+
"/**\n * Server utilities for waiting and polling\n */\n\n/**\n * Poll server health endpoint until it responds successfully\n * This ensures the server is fully initialized before declaring it ready\n */\nexport async function waitForServerReady(\n\tport = 3000,\n\ttimeout = 10000,\n): Promise<void> {\n\tconst startTime = Date.now();\n\tconst checkInterval = 200; // Check every 200ms\n\n\twhile (Date.now() - startTime < timeout) {\n\t\ttry {\n\t\t\tconst response = await fetch(`http://localhost:${port}/`, {\n\t\t\t\tmethod: 'GET',\n\t\t\t});\n\t\t\t// Accept both success and 404 (means server is responding)\n\t\t\tif (response.status < 500) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t} catch {\n\t\t\t// Server not ready yet, continue polling\n\t\t}\n\t\tawait new Promise((resolve) => setTimeout(resolve, checkInterval));\n\t}\n\n\tthrow new Error(`Timeout waiting for server to respond after ${timeout}ms`);\n}\n",
|
|
44
|
+
"/**\n * Dev command - Start development environment\n *\n * This command runs:\n * 1. `reroute gen --watch` and `bun --watch src/index.ts` in parallel with side-by-side logs\n */\n\nimport { spawn } from 'node:child_process';\nimport { existsSync } from 'node:fs';\nimport { join } from 'node:path';\nimport {\n\tcolorizeLogPrefix,\n\tcolorizeLogPrefixAnsi,\n\tcreateServerOutputHandler,\n} from './lib/log';\nimport { waitForServerReady } from './lib/server';\n\n/**\n * Poll for required files to exist before starting the server\n * This ensures the server doesn't crash with \"Cannot find module\" or \"Bundle not found\" errors\n */\nasync function waitForRequiredFiles(\n\tcwd: string,\n\ttimeout = 30000,\n): Promise<void> {\n\tconst requiredFiles = [\n\t\tjoin(cwd, '.reroute/routes.ts'),\n\t\tjoin(cwd, '.reroute/content.ts'),\n\t\tjoin(cwd, '.reroute/index.ts'),\n\t];\n\n\tconst bundlesDir = join(cwd, '.reroute/bundles');\n\n\tconst startTime = Date.now();\n\tconst checkInterval = 100; // Check every 100ms\n\n\twhile (Date.now() - startTime < timeout) {\n\t\t// Check if all required files exist\n\t\tconst allFilesExist = requiredFiles.every((file) => existsSync(file));\n\n\t\tif (!allFilesExist) {\n\t\t\tawait new Promise((resolve) => setTimeout(resolve, checkInterval));\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Check if bundles directory exists and has the main index bundle\n\t\tif (existsSync(bundlesDir)) {\n\t\t\tconst { readdirSync, statSync } = require('node:fs');\n\t\t\ttry {\n\t\t\t\tconst files = readdirSync(bundlesDir);\n\t\t\t\t// Look for index.*.js file (the main entry bundle)\n\t\t\t\tconst indexBundleFile = files.find((f: string) => {\n\t\t\t\t\tif (\n\t\t\t\t\t\t!f.startsWith('index.') ||\n\t\t\t\t\t\t!f.endsWith('.js') ||\n\t\t\t\t\t\tf.endsWith('.map')\n\t\t\t\t\t) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\t// Verify file is not empty and readable\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst filePath = join(bundlesDir, f);\n\t\t\t\t\t\tconst stats = statSync(filePath);\n\t\t\t\t\t\treturn stats.size > 100; // At least 100 bytes (real bundles are much larger)\n\t\t\t\t\t} catch {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tif (indexBundleFile) {\n\t\t\t\t\t// Double-check: wait a tiny bit and verify file size hasn't changed\n\t\t\t\t\t// This ensures the file is fully written and not still being generated\n\t\t\t\t\tconst filePath = join(bundlesDir, indexBundleFile);\n\t\t\t\t\tconst size1 = statSync(filePath).size;\n\t\t\t\t\tawait new Promise((resolve) => setTimeout(resolve, 200));\n\t\t\t\t\tconst size2 = statSync(filePath).size;\n\n\t\t\t\t\tif (size1 === size2 && size2 > 100) {\n\t\t\t\t\t\treturn; // Bundle is stable and ready\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\t// Directory exists but can't read, keep polling\n\t\t\t}\n\t\t}\n\n\t\tawait new Promise((resolve) => setTimeout(resolve, checkInterval));\n\t}\n\n\tthrow new Error(\n\t\t`Timeout waiting for required files to be created after ${timeout}ms`,\n\t);\n}\n\nfunction getRerouteCommand(): string {\n\t// Check if we're running from source (development mode)\n\t// Look for bin.ts in the expected location relative to this file\n\tconst binPath = join(import.meta.dir, '..', '..', 'bin.ts');\n\tconst isBunDev = existsSync(binPath);\n\n\tif (isBunDev) {\n\t\t// Running via bun during development from source\n\t\treturn `bun ${binPath}`;\n\t}\n\n\t// Check for reroute binary in node_modules/.bin, checking up to 3 levels up\n\tconst cwd = process.cwd();\n\tconst nodeModulesPaths = [\n\t\tjoin(cwd, 'node_modules', '.bin', 'reroute'),\n\t\tjoin(cwd, '..', 'node_modules', '.bin', 'reroute'),\n\t\tjoin(cwd, '..', '..', 'node_modules', '.bin', 'reroute'),\n\t\tjoin(cwd, '..', '..', '..', 'node_modules', '.bin', 'reroute'),\n\t];\n\n\tfor (const binPath of nodeModulesPaths) {\n\t\tif (existsSync(binPath)) {\n\t\t\treturn binPath;\n\t\t}\n\t}\n\n\t// Fallback: assume reroute is installed globally and available in PATH\n\treturn 'reroute';\n}\n\nexport default async function dev(args: string[]) {\n\tconst singleColumn = args.includes('--single') || args.includes('-s');\n\ttry {\n\t\tconsole.log('[reroute/dev] Starting development servers...');\n\t\tconsole.log('[reroute/dev] Press Ctrl+C to stop\\n');\n\n\t\tconst rerouteCmd = getRerouteCommand();\n\n\t\t// Spawn gen process\n\t\t// If rerouteCmd contains spaces (like \"bun packages/cli/bin.ts\"), use shell mode\n\t\t// Otherwise, it's either an absolute path or 'reroute' command\n\t\tconst useShell = rerouteCmd.includes(' ');\n\t\tconst genCommand = useShell ? `${rerouteCmd} gen --watch` : rerouteCmd;\n\t\tconst genArgs = useShell ? [] : ['gen', '--watch'];\n\n\t\tconst genProcess = spawn(genCommand, genArgs, {\n\t\t\tstdio: ['ignore', 'pipe', 'pipe'],\n\t\t\tshell: useShell,\n\t\t});\n\n\t\t// Wait for required files (stubs + bundle) to be created before starting server\n\t\t// This ensures the server doesn't crash with \"Cannot find module\" or \"Bundle not found\" errors\n\t\tconsole.log('[reroute/dev] Generating bundle...');\n\t\ttry {\n\t\t\tawait waitForRequiredFiles(process.cwd());\n\t\t} catch (error) {\n\t\t\tconsole.error('[reroute/dev] Failed to initialize:', error);\n\t\t\tgenProcess.kill();\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\t// Spawn server process\n\t\tconst serverProcess = spawn('bun', ['--watch', 'src/index.ts'], {\n\t\t\tstdio: ['ignore', 'pipe', 'pipe'],\n\t\t});\n\n\t\t// Wait for server to be ready before declaring success\n\t\tconsole.log('[reroute/dev] Bundle complete, waiting for server...');\n\t\tconst port = Number(process.env.PORT || '3000');\n\t\ttry {\n\t\t\tawait waitForServerReady(port);\n\t\t} catch (error) {\n\t\t\tconsole.error('[reroute/dev] Server failed to start:', error);\n\t\t\tgenProcess.kill();\n\t\t\tserverProcess.kill();\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\tif (singleColumn) {\n\t\t\t// Single column mode - use regular console output with colors\n\t\t\t// Buffer for incomplete lines\n\t\t\tconst genBuffer = { current: '' };\n\t\t\tconst serverBuffer = { current: '' };\n\n\t\t\tconst handleGenOutput = (data: Buffer) => {\n\t\t\t\tconst text = genBuffer.current + data.toString();\n\t\t\t\tconst lines = text.split('\\n');\n\t\t\t\tgenBuffer.current = lines.pop() || ''; // Keep last incomplete line\n\n\t\t\t\tfor (const line of lines) {\n\t\t\t\t\t// Skip empty lines\n\t\t\t\t\tif (!line.trim()) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tconst ansiColored = colorizeLogPrefixAnsi(line);\n\t\t\t\t\tconsole.log(ansiColored);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tconst handleServerOutput = createServerOutputHandler(serverBuffer);\n\n\t\t\tgenProcess.stdout?.on('data', handleGenOutput);\n\t\t\tgenProcess.stderr?.on('data', handleGenOutput);\n\t\t\tserverProcess.stdout?.on('data', handleServerOutput);\n\t\t\tserverProcess.stderr?.on('data', handleServerOutput);\n\n\t\t\tgenProcess.on('exit', (code) => {\n\t\t\t\tconsole.log(`\\n[reroute/gen] Process exited with code ${code}`);\n\t\t\t});\n\n\t\t\tserverProcess.on('exit', (code) => {\n\t\t\t\tconsole.log(`\\n[server] Process exited with code ${code}`);\n\t\t\t});\n\n\t\t\t// Handle Ctrl+C\n\t\t\tprocess.on('SIGINT', () => {\n\t\t\t\tconsole.log('\\n[reroute/dev] Shutting down...');\n\t\t\t\tgenProcess.kill('SIGINT');\n\t\t\t\tserverProcess.kill('SIGINT');\n\t\t\t\tprocess.exit(0);\n\t\t\t});\n\t\t} else {\n\t\t\t// Side-by-side mode - use blessed-contrib\n\t\t\tconst blessed = await import('blessed');\n\t\t\tconst contrib = await import('blessed-contrib');\n\n\t\t\tconst screen = blessed.default.screen({\n\t\t\t\tsmartCSR: true,\n\t\t\t\ttitle: 'reroute dev',\n\t\t\t\tmouse: true, // Enable mouse support for scrolling\n\t\t\t});\n\n\t\t\tconst grid = new contrib.default.grid({\n\t\t\t\trows: 1,\n\t\t\t\tcols: 2,\n\t\t\t\tscreen: screen,\n\t\t\t});\n\n\t\t\t// Create log boxes for each process\n\t\t\tconst genBox = grid.set(0, 0, 1, 1, blessed.default.log, {\n\t\t\t\tlabel: ' reroute gen --watch ',\n\t\t\t\tborder: { type: 'line' },\n\t\t\t\tstyle: {\n\t\t\t\t\tborder: { fg: 'cyan' },\n\t\t\t\t},\n\t\t\t\tscrollable: true,\n\t\t\t\talwaysScroll: true,\n\t\t\t\tscrollbar: {\n\t\t\t\t\tch: ' ',\n\t\t\t\t\tinverse: true,\n\t\t\t\t},\n\t\t\t\ttags: true, // Enable color tags\n\t\t\t\tkeys: true, // Enable key bindings\n\t\t\t\tvi: true, // Enable vi keys\n\t\t\t\tmouse: true, // Enable mouse support\n\t\t\t\tinput: true, // Allow input focus for text selection\n\t\t\t\tclickable: true, // Make boxes clickable\n\t\t\t});\n\n\t\t\tconst serverBox = grid.set(0, 1, 1, 1, blessed.default.log, {\n\t\t\t\tlabel: ' bun --watch src/index.ts ',\n\t\t\t\tborder: { type: 'line' },\n\t\t\t\tstyle: {\n\t\t\t\t\tborder: { fg: 'green' },\n\t\t\t\t},\n\t\t\t\tscrollable: true,\n\t\t\t\talwaysScroll: true,\n\t\t\t\tscrollbar: {\n\t\t\t\t\tch: ' ',\n\t\t\t\t\tinverse: true,\n\t\t\t\t},\n\t\t\t\ttags: true, // Enable color tags\n\t\t\t\tkeys: true, // Enable key bindings\n\t\t\t\tvi: true, // Enable vi keys\n\t\t\t\tmouse: true, // Enable mouse support\n\t\t\t\tinput: true, // Allow input focus for text selection\n\t\t\t\tclickable: true, // Make boxes clickable\n\t\t\t});\n\n\t\t\t// Add scrolling key bindings for genBox\n\t\t\tgenBox.key(['up', 'k'], () => {\n\t\t\t\tgenBox.scroll(-1);\n\t\t\t\tscreen.render();\n\t\t\t});\n\n\t\t\tgenBox.key(['down', 'j'], () => {\n\t\t\t\tgenBox.scroll(1);\n\t\t\t\tscreen.render();\n\t\t\t});\n\n\t\t\tgenBox.key(['pageup'], () => {\n\t\t\t\tgenBox.scroll(-genBox.height);\n\t\t\t\tscreen.render();\n\t\t\t});\n\n\t\t\tgenBox.key(['pagedown'], () => {\n\t\t\t\tgenBox.scroll(genBox.height);\n\t\t\t\tscreen.render();\n\t\t\t});\n\n\t\t\tgenBox.key(['home', 'g'], () => {\n\t\t\t\tgenBox.setScrollPerc(0);\n\t\t\t\tscreen.render();\n\t\t\t});\n\n\t\t\tgenBox.key(['end', 'G'], () => {\n\t\t\t\tgenBox.setScrollPerc(100);\n\t\t\t\tscreen.render();\n\t\t\t});\n\n\t\t\t// Add scrolling key bindings for serverBox\n\t\t\tserverBox.key(['up', 'k'], () => {\n\t\t\t\tserverBox.scroll(-1);\n\t\t\t\tscreen.render();\n\t\t\t});\n\n\t\t\tserverBox.key(['down', 'j'], () => {\n\t\t\t\tserverBox.scroll(1);\n\t\t\t\tscreen.render();\n\t\t\t});\n\n\t\t\tserverBox.key(['pageup'], () => {\n\t\t\t\tserverBox.scroll(-serverBox.height);\n\t\t\t\tscreen.render();\n\t\t\t});\n\n\t\t\tserverBox.key(['pagedown'], () => {\n\t\t\t\tserverBox.scroll(serverBox.height);\n\t\t\t\tscreen.render();\n\t\t\t});\n\n\t\t\tserverBox.key(['home', 'g'], () => {\n\t\t\t\tserverBox.setScrollPerc(0);\n\t\t\t\tscreen.render();\n\t\t\t});\n\n\t\t\tserverBox.key(['end', 'G'], () => {\n\t\t\t\tserverBox.setScrollPerc(100);\n\t\t\t\tscreen.render();\n\t\t\t});\n\n\t\t\t// Add mouse wheel support\n\t\t\tgenBox.on('wheeldown', () => {\n\t\t\t\tgenBox.scroll(3);\n\t\t\t\tscreen.render();\n\t\t\t});\n\n\t\t\tgenBox.on('wheelup', () => {\n\t\t\t\tgenBox.scroll(-3);\n\t\t\t\tscreen.render();\n\t\t\t});\n\n\t\t\tserverBox.on('wheeldown', () => {\n\t\t\t\tserverBox.scroll(3);\n\t\t\t\tscreen.render();\n\t\t\t});\n\n\t\t\tserverBox.on('wheelup', () => {\n\t\t\t\tserverBox.scroll(-3);\n\t\t\t\tscreen.render();\n\t\t\t});\n\n\t\t\t// Focus handling - click to focus a box\n\t\t\tgenBox.on('click', () => {\n\t\t\t\tgenBox.focus();\n\t\t\t\tscreen.render();\n\t\t\t});\n\n\t\t\tserverBox.on('click', () => {\n\t\t\t\tserverBox.focus();\n\t\t\t\tscreen.render();\n\t\t\t});\n\n\t\t\t// Tab to switch between boxes\n\t\t\tscreen.key(['tab'], () => {\n\t\t\t\tif (screen.focused === genBox) {\n\t\t\t\t\tserverBox.focus();\n\t\t\t\t} else {\n\t\t\t\t\tgenBox.focus();\n\t\t\t\t}\n\t\t\t\tscreen.render();\n\t\t\t});\n\n\t\t\t// Start with genBox focused\n\t\t\tgenBox.focus();\n\n\t\t\tscreen.render();\n\n\t\t\t// Handle gen output with colorization\n\t\t\tgenProcess.stdout?.on('data', (data: Buffer) => {\n\t\t\t\tconst text = data.toString();\n\t\t\t\t// Filter out empty lines\n\t\t\t\tconst lines = text.split('\\n').filter((line) => line.trim());\n\t\t\t\tif (lines.length > 0) {\n\t\t\t\t\tconst colored = colorizeLogPrefix(lines.join('\\n'));\n\t\t\t\t\tgenBox.log(colored);\n\t\t\t\t\tscreen.render();\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tgenProcess.stderr?.on('data', (data: Buffer) => {\n\t\t\t\tconst text = data.toString();\n\t\t\t\t// Filter out empty lines\n\t\t\t\tconst lines = text.split('\\n').filter((line) => line.trim());\n\t\t\t\tif (lines.length > 0) {\n\t\t\t\t\tconst colored = colorizeLogPrefix(lines.join('\\n'));\n\t\t\t\t\tgenBox.log(colored);\n\t\t\t\t\tscreen.render();\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// Handle server output\n\t\t\tserverProcess.stdout?.on('data', (data: Buffer) => {\n\t\t\t\tconst text = data.toString();\n\t\t\t\t// Filter out empty lines and colorize\n\t\t\t\tconst filteredText = text\n\t\t\t\t\t.split('\\n')\n\t\t\t\t\t.filter((line) => line.trim()) // Filter out empty lines\n\t\t\t\t\t.join('\\n');\n\t\t\t\tif (filteredText) {\n\t\t\t\t\tconst colored = colorizeLogPrefix(filteredText);\n\t\t\t\t\tserverBox.log(colored);\n\t\t\t\t\tscreen.render();\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tserverProcess.stderr?.on('data', (data: Buffer) => {\n\t\t\t\tconst text = data.toString();\n\t\t\t\t// Filter out empty lines and colorize\n\t\t\t\tconst filteredText = text\n\t\t\t\t\t.split('\\n')\n\t\t\t\t\t.filter((line) => line.trim()) // Filter out empty lines\n\t\t\t\t\t.join('\\n');\n\t\t\t\tif (filteredText) {\n\t\t\t\t\tconst colored = colorizeLogPrefix(filteredText);\n\t\t\t\t\tserverBox.log(colored);\n\t\t\t\t\tscreen.render();\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// Handle process exit\n\t\t\tgenProcess.on('exit', (code) => {\n\t\t\t\tgenBox.log(`\\n[Process exited with code ${code}]`);\n\t\t\t\tscreen.render();\n\t\t\t});\n\n\t\t\tserverProcess.on('exit', (code) => {\n\t\t\t\tserverBox.log(`\\n[Process exited with code ${code}]`);\n\t\t\t\tscreen.render();\n\t\t\t});\n\n\t\t\t// Handle Ctrl+C\n\t\t\tscreen.key(['escape', 'q', 'C-c'], () => {\n\t\t\t\tgenProcess.kill('SIGINT');\n\t\t\t\tserverProcess.kill('SIGINT');\n\t\t\t\tscreen.destroy();\n\t\t\t\tprocess.exit(0);\n\t\t\t});\n\n\t\t\t// Handle window resize\n\t\t\tscreen.on('resize', () => {\n\t\t\t\tscreen.render();\n\t\t\t});\n\t\t}\n\t} catch (error) {\n\t\t// Handle Ctrl+C gracefully\n\t\tif ((error as { code?: string }).code === 'SIGINT') {\n\t\t\tconsole.log('\\n[reroute/dev] Shutting down...');\n\t\t\tprocess.exit(0);\n\t\t}\n\t\tconsole.error('[reroute/dev] Error:', error);\n\t\tthrow error;\n\t}\n}\n",
|
|
45
|
+
"/**\n * Start command - Run production-like server\n *\n * This command runs:\n * 1. `reroute gen --prod` (waits for completion, no watch)\n * 2. `bun src/index.ts` (runs the server, no watch)\n */\n\nimport { spawn } from 'node:child_process';\nimport { existsSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { colorizeLogPrefixAnsi, createServerOutputHandler } from './lib/log';\nimport { waitForServerReady } from './lib/server';\n\nfunction getRerouteCommand(): string {\n\t// Check if we're running from source (development mode)\n\t// Look for bin.ts in the expected location relative to this file\n\tconst binPath = join(import.meta.dir, '..', '..', 'bin.ts');\n\tconst isBunDev = existsSync(binPath);\n\n\tif (isBunDev) {\n\t\t// Running via bun during development from source\n\t\treturn `bun ${binPath}`;\n\t}\n\n\t// Check for reroute binary in node_modules/.bin, checking up to 3 levels up\n\tconst cwd = process.cwd();\n\tconst nodeModulesPaths = [\n\t\tjoin(cwd, 'node_modules', '.bin', 'reroute'),\n\t\tjoin(cwd, '..', 'node_modules', '.bin', 'reroute'),\n\t\tjoin(cwd, '..', '..', 'node_modules', '.bin', 'reroute'),\n\t\tjoin(cwd, '..', '..', '..', 'node_modules', '.bin', 'reroute'),\n\t];\n\n\tfor (const binPath of nodeModulesPaths) {\n\t\tif (existsSync(binPath)) {\n\t\t\treturn binPath;\n\t\t}\n\t}\n\n\t// Fallback: assume reroute is installed globally and available in PATH\n\treturn 'reroute';\n}\n\nexport default async function start(args: string[]) {\n\ttry {\n\t\tconst rerouteCmd = getRerouteCommand();\n\t\tconst useShell = rerouteCmd.includes(' ');\n\n\t\t// Buffer for incomplete lines\n\t\tconst genBuffer = { current: '' };\n\n\t\tconst handleGenOutput = (data: Buffer) => {\n\t\t\tconst text = genBuffer.current + data.toString();\n\t\t\tconst lines = text.split('\\n');\n\t\t\tgenBuffer.current = lines.pop() || '';\n\n\t\t\tfor (const line of lines) {\n\t\t\t\t// Skip empty lines\n\t\t\t\tif (!line.trim()) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tconst ansiColored = colorizeLogPrefixAnsi(line);\n\t\t\t\tconsole.log(ansiColored);\n\t\t\t}\n\t\t};\n\n\t\t// Step 1: Run gen (without watch)\n\t\t// Pass through any args (like --prod) to gen command\n\t\tprocess.stdout.write(\n\t\t\t`${colorizeLogPrefixAnsi('[reroute/start] Running gen...')}\\n`,\n\t\t);\n\t\tconst genCommand = useShell\n\t\t\t? `${rerouteCmd} gen ${args.join(' ')}`\n\t\t\t: rerouteCmd;\n\t\tconst genArgs = useShell ? [] : ['gen', ...args];\n\n\t\tawait new Promise<void>((resolve, reject) => {\n\t\t\tconst genProcess = spawn(genCommand, genArgs, {\n\t\t\t\tstdio: ['ignore', 'pipe', 'pipe'],\n\t\t\t\tshell: useShell,\n\t\t\t});\n\n\t\t\tgenProcess.stdout?.on('data', handleGenOutput);\n\t\t\tgenProcess.stderr?.on('data', handleGenOutput);\n\n\t\t\tgenProcess.on('exit', (code) => {\n\t\t\t\tif (code !== null && code !== 0) {\n\t\t\t\t\treject(new Error(`Gen exited with code ${code}`));\n\t\t\t\t} else {\n\t\t\t\t\tresolve();\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tgenProcess.on('error', (error) => {\n\t\t\t\treject(error);\n\t\t\t});\n\t\t});\n\t\tprocess.stdout.write(\n\t\t\tcolorizeLogPrefixAnsi('[reroute/start] Generation complete\\n'),\n\t\t);\n\n\t\t// Step 2: Run the server\n\t\tprocess.stdout.write(\n\t\t\t`${colorizeLogPrefixAnsi('[reroute/start] Starting server...')}\\n`,\n\t\t);\n\n\t\tconst serverProcess = spawn('bun', ['src/index.ts'], {\n\t\t\tstdio: ['ignore', 'pipe', 'pipe'],\n\t\t});\n\n\t\t// Buffer for incomplete lines\n\t\tconst serverBuffer = { current: '' };\n\t\tconst handleServerOutput = createServerOutputHandler(serverBuffer);\n\n\t\tserverProcess.stdout?.on('data', handleServerOutput);\n\t\tserverProcess.stderr?.on('data', handleServerOutput);\n\n\t\t// Wait for server to be ready by polling the health endpoint\n\t\tprocess.stdout.write(\n\t\t\tcolorizeLogPrefixAnsi(\n\t\t\t\t'[reroute/start] Waiting for server to be ready...\\n',\n\t\t\t),\n\t\t);\n\n\t\tconst port = Number(process.env.PORT || '3000');\n\t\ttry {\n\t\t\tawait waitForServerReady(port, 10000);\n\t\t\tprocess.stdout.write(\n\t\t\t\tcolorizeLogPrefixAnsi('[reroute/start] Server is ready!\\n'),\n\t\t\t);\n\t\t} catch {\n\t\t\tprocess.stdout.write(\n\t\t\t\tcolorizeLogPrefixAnsi(\n\t\t\t\t\t'[reroute/start] 🚨Warning: Server may not be fully ready yet\\n',\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\n\t\tprocess.stdout.write(\n\t\t\tcolorizeLogPrefixAnsi('[reroute/start] Press Ctrl+C to stop\\n'),\n\t\t);\n\n\t\t// Handle Ctrl+C\n\t\tprocess.on('SIGINT', () => {\n\t\t\tprocess.stdout.write(\n\t\t\t\t`${colorizeLogPrefixAnsi('\\n[reroute/start] Shutting down...')}\\n`,\n\t\t\t);\n\t\t\tserverProcess.kill('SIGINT');\n\t\t\tprocess.exit(0);\n\t\t});\n\n\t\t// Wait for the server process to exit\n\t\tawait new Promise<void>((resolve, reject) => {\n\t\t\tserverProcess.on('exit', (code) => {\n\t\t\t\tif (code !== null && code !== 0) {\n\t\t\t\t\tconsole.error(\n\t\t\t\t\t\tcolorizeLogPrefixAnsi(\n\t\t\t\t\t\t\t`[reroute/start] Server exited with code ${code}`,\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t\treject(new Error(`Server exited with code ${code}`));\n\t\t\t\t} else {\n\t\t\t\t\tresolve();\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tserverProcess.on('error', (error) => {\n\t\t\t\treject(error);\n\t\t\t});\n\t\t});\n\t} catch (error) {\n\t\t// Handle Ctrl+C gracefully\n\t\tif ((error as { code?: string }).code === 'SIGINT') {\n\t\t\tprocess.stdout.write(\n\t\t\t\t`${colorizeLogPrefixAnsi('\\n[reroute/start] Shutting down...')}\\n`,\n\t\t\t);\n\t\t\tprocess.exit(0);\n\t\t}\n\t\tprocess.stderr.write(\n\t\t\t`${colorizeLogPrefixAnsi('[reroute/start] Error: ') + String(error)}\\n`,\n\t\t);\n\t\tthrow error;\n\t}\n}\n",
|
|
46
|
+
"/**\n * Build command - Build production binary\n *\n * This command runs:\n * 1. `reroute gen --prod` (waits for completion, no watch)\n * 2. `bun build src/index.ts --target bun --compile --outfile ./dist/{name}`\n */\n\nimport { spawn } from 'node:child_process';\nimport { existsSync, readFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { colorizeLogPrefixAnsi } from './lib/log';\n\nfunction getRerouteCommand(): string {\n\t// Check if we're running from source (development mode)\n\t// Look for bin.ts in the expected location relative to this file\n\tconst binPath = join(import.meta.dir, '..', '..', 'bin.ts');\n\tconst isBunDev = existsSync(binPath);\n\n\tif (isBunDev) {\n\t\t// Running via bun during development from source\n\t\treturn `bun ${binPath}`;\n\t}\n\n\t// Check for reroute binary in node_modules/.bin, checking up to 3 levels up\n\tconst cwd = process.cwd();\n\tconst nodeModulesPaths = [\n\t\tjoin(cwd, 'node_modules', '.bin', 'reroute'),\n\t\tjoin(cwd, '..', 'node_modules', '.bin', 'reroute'),\n\t\tjoin(cwd, '..', '..', 'node_modules', '.bin', 'reroute'),\n\t\tjoin(cwd, '..', '..', '..', 'node_modules', '.bin', 'reroute'),\n\t];\n\n\tfor (const binPath of nodeModulesPaths) {\n\t\tif (existsSync(binPath)) {\n\t\t\treturn binPath;\n\t\t}\n\t}\n\n\t// Fallback: assume reroute is installed globally and available in PATH\n\treturn 'reroute';\n}\n\nfunction getOutputName(): string {\n\tconst cwd = process.cwd();\n\tconst packageJsonPath = join(cwd, 'package.json');\n\n\tif (existsSync(packageJsonPath)) {\n\t\ttry {\n\t\t\tconst packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf-8'));\n\t\t\tconst name = packageJson.name;\n\t\t\tif (name) {\n\t\t\t\t// Extract name from package.json (e.g., \"reroute-blog-example\" -> \"blog\")\n\t\t\t\t// Or use the name directly if it's simple\n\t\t\t\tconst parts = name.split('-');\n\t\t\t\t// If name has multiple parts, use the second-to-last or last meaningful part\n\t\t\t\tif (parts.length > 1 && parts[parts.length - 1] === 'example') {\n\t\t\t\t\treturn parts[parts.length - 2] || 'app';\n\t\t\t\t}\n\t\t\t\t// Use last part or full name if simple\n\t\t\t\treturn parts[parts.length - 1] || name;\n\t\t\t}\n\t\t} catch {\n\t\t\t// Fallback to 'app' if package.json parsing fails\n\t\t}\n\t}\n\n\treturn 'app';\n}\n\nexport default async function build(args: string[]) {\n\ttry {\n\t\tconst rerouteCmd = getRerouteCommand();\n\t\tconst useShell = rerouteCmd.includes(' ');\n\n\t\t// Parse output path from args or derive from package.json\n\t\tlet outputPath = `./dist/${getOutputName()}`;\n\t\tconst outfileIndex = args.indexOf('--outfile');\n\t\tconst shortOutfileIndex = args.indexOf('-o');\n\t\tconst outfileArgIndex =\n\t\t\toutfileIndex !== -1 ? outfileIndex : shortOutfileIndex;\n\n\t\tif (outfileArgIndex !== -1 && args[outfileArgIndex + 1]) {\n\t\t\toutputPath = args[outfileArgIndex + 1];\n\t\t}\n\n\t\t// Buffer for incomplete lines\n\t\tconst genBuffer = { current: '' };\n\n\t\tconst handleGenOutput = (data: Buffer) => {\n\t\t\tconst text = genBuffer.current + data.toString();\n\t\t\tconst lines = text.split('\\n');\n\t\t\tgenBuffer.current = lines.pop() || '';\n\n\t\t\tfor (const line of lines) {\n\t\t\t\t// Skip empty lines\n\t\t\t\tif (!line.trim()) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tconst ansiColored = colorizeLogPrefixAnsi(line);\n\t\t\t\tconsole.log(ansiColored);\n\t\t\t}\n\t\t};\n\n\t\t// Step 1: Run gen with --prod (without watch)\n\t\tprocess.stdout.write(\n\t\t\t`${colorizeLogPrefixAnsi('[reroute/build] Running gen --prod...')}\\n`,\n\t\t);\n\t\tconst genCommand = useShell ? `${rerouteCmd} gen --prod` : rerouteCmd;\n\t\tconst genArgs = useShell ? [] : ['gen', '--prod'];\n\n\t\tawait new Promise<void>((resolve, reject) => {\n\t\t\tconst genProcess = spawn(genCommand, genArgs, {\n\t\t\t\tstdio: ['ignore', 'pipe', 'pipe'],\n\t\t\t\tshell: useShell,\n\t\t\t});\n\n\t\t\tgenProcess.stdout?.on('data', handleGenOutput);\n\t\t\tgenProcess.stderr?.on('data', handleGenOutput);\n\n\t\t\tgenProcess.on('exit', (code) => {\n\t\t\t\tif (code !== null && code !== 0) {\n\t\t\t\t\treject(new Error(`Gen exited with code ${code}`));\n\t\t\t\t} else {\n\t\t\t\t\tresolve();\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tgenProcess.on('error', (error) => {\n\t\t\t\treject(error);\n\t\t\t});\n\t\t});\n\t\tprocess.stdout.write(\n\t\t\tcolorizeLogPrefixAnsi('[reroute/build] Generation complete\\n'),\n\t\t);\n\n\t\t// Step 2: Build the binary\n\t\tprocess.stdout.write(\n\t\t\t`${colorizeLogPrefixAnsi(`[reroute/build] Building binary to ${outputPath}...`)}\\n`,\n\t\t);\n\n\t\t// Build bun build args, filtering out --outfile/-o flags since we handle them\n\t\tconst buildArgs = ['build', 'src/index.ts', '--target', 'bun', '--compile'];\n\n\t\t// Add minify flag for production builds\n\t\t// always do production builds with reroute build\n\n\t\tbuildArgs.push('--minify');\n\t\tbuildArgs.push('--external', 'sharp');\n\n\t\t// Filter out --outfile/-o and its value, then add our parsed outputPath\n\t\t// Also filter out --minify/--no-minify/--prod since we handle them\n\t\tconst filteredArgs = args.filter((arg, idx) => {\n\t\t\tif (outfileArgIndex !== -1) {\n\t\t\t\tif (idx === outfileArgIndex || idx === outfileArgIndex + 1) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn (\n\t\t\t\targ !== '--outfile' &&\n\t\t\t\targ !== '-o' &&\n\t\t\t\targ !== '--minify' &&\n\t\t\t\targ !== '--no-minify' &&\n\t\t\t\targ !== '--prod'\n\t\t\t);\n\t\t});\n\n\t\tbuildArgs.push(...filteredArgs, '--outfile', outputPath);\n\n\t\tawait new Promise<void>((resolve, reject) => {\n\t\t\tconst buildProcess = spawn('bun', buildArgs, {\n\t\t\t\tstdio: 'inherit',\n\t\t\t});\n\n\t\t\tbuildProcess.on('exit', (code) => {\n\t\t\t\tif (code !== null && code !== 0) {\n\t\t\t\t\treject(new Error(`Build exited with code ${code}`));\n\t\t\t\t} else {\n\t\t\t\t\tprocess.stdout.write(\n\t\t\t\t\t\tcolorizeLogPrefixAnsi(\n\t\t\t\t\t\t\t`[reroute/build] Build complete: ${outputPath}\\n`,\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t\tresolve();\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tbuildProcess.on('error', (error) => {\n\t\t\t\treject(error);\n\t\t\t});\n\t\t});\n\t} catch (error) {\n\t\tprocess.stderr.write(\n\t\t\t`${colorizeLogPrefixAnsi('[reroute/build] Error: ') + String(error)}\\n`,\n\t\t);\n\t\tthrow error;\n\t}\n}\n",
|
|
36
47
|
"import { existsSync } from 'node:fs';\nimport { join } from 'node:path';\n\n/**\n * Get the reroute command to execute\n * Handles both development mode (running from source) and installed mode\n */\nexport function getRerouteCommand(): string {\n\t// Check if we're running from source (development mode)\n\t// Look for bin.ts in the expected location relative to this file\n\tconst binPath = join(import.meta.dir, '..', '..', 'bin.ts');\n\tconst isBunDev = existsSync(binPath);\n\n\tif (isBunDev) {\n\t\t// Running via bun during development from source\n\t\treturn `bun ${binPath}`;\n\t}\n\n\t// Check for reroute binary in node_modules/.bin, checking up to 3 levels up\n\tconst cwd = process.cwd();\n\tconst nodeModulesPaths = [\n\t\tjoin(cwd, 'node_modules', '.bin', 'reroute'),\n\t\tjoin(cwd, '..', 'node_modules', '.bin', 'reroute'),\n\t\tjoin(cwd, '..', '..', 'node_modules', '.bin', 'reroute'),\n\t\tjoin(cwd, '..', '..', '..', 'node_modules', '.bin', 'reroute'),\n\t];\n\n\tfor (const binPath of nodeModulesPaths) {\n\t\tif (existsSync(binPath)) {\n\t\t\treturn binPath;\n\t\t}\n\t}\n\n\t// Fallback: assume reroute is installed globally and available in PATH\n\treturn 'reroute';\n}\n",
|
|
37
|
-
"#!/usr/bin/env bun\n\n/**\n * Analyze command - Analyze bundle sizes\n *\n * This command analyzes bundles generated by reroute and provides:\n * - Bundle size statistics\n * - Gzipped size information\n * - HTML visualization report with dependency treemap\n */\n\nimport { existsSync, statSync } from 'node:fs';\nimport { readdir, readFile, stat, writeFile } from 'node:fs/promises';\nimport { basename, join, relative } from 'node:path';\nimport Table from 'cli-table3';\nimport { colorizeLogPrefixAnsi } from '../libs/log';\nimport { isProductionMode } from '../libs/production';\n\n// ASCII-only table borders to avoid Unicode rendering issues in some environments\nconst ASCII_TABLE_CHARS = {\n\ttop: '-',\n\t'top-mid': '+',\n\t'top-left': '+',\n\t'top-right': '+',\n\tbottom: '-',\n\t'bottom-mid': '+',\n\t'bottom-left': '+',\n\t'bottom-right': '+',\n\tleft: '|',\n\t'left-mid': '+',\n\tmid: '-',\n\t'mid-mid': '+',\n\tright: '|',\n\t'right-mid': '+',\n\tmiddle: '|',\n} as const;\n\ninterface BundleInfo {\n\tpath: string;\n\tname: string;\n\tsize: number;\n\tgzippedSize: number;\n\trelativePath: string;\n\ttype: 'chunk' | 'binary';\n}\n\ninterface BundleStats {\n\ttotalBundles: number;\n\ttotalSize: number;\n\ttotalGzippedSize: number;\n\tbundles: BundleInfo[];\n\tbyCollection: Record<string, BundleInfo[]>;\n}\n\ninterface DepNode {\n\tname: string;\n\tpath: string;\n\tsize: number;\n\tchildren?: DepNode[];\n}\n\ninterface DepTree {\n\tentry: string;\n\ttotalSize: number;\n\troot: DepNode;\n}\n\nasync function findBundles(cwd: string): Promise<BundleInfo[]> {\n\tconst bundles: BundleInfo[] = [];\n\n\t// Find chunks in .reroute/chunks/\n\tconst chunksDir = join(cwd, '.reroute', 'chunks');\n\tif (existsSync(chunksDir)) {\n\t\tconst collections = await readdir(chunksDir, { withFileTypes: true });\n\t\tfor (const collection of collections) {\n\t\t\tif (!collection.isDirectory()) continue;\n\n\t\t\tconst collectionDir = join(chunksDir, collection.name);\n\t\t\tconst files = await readdir(collectionDir);\n\t\t\tfor (const file of files) {\n\t\t\t\tif (!file.endsWith('.js')) continue;\n\n\t\t\t\tconst filePath = join(collectionDir, file);\n\t\t\t\tconst stats = await stat(filePath);\n\t\t\t\tconst content = await Bun.file(filePath).arrayBuffer();\n\t\t\t\tconst gzippedSize = Bun.gzipSync(new Uint8Array(content)).length;\n\n\t\t\t\tbundles.push({\n\t\t\t\t\tpath: filePath,\n\t\t\t\t\tname: file,\n\t\t\t\t\tsize: stats.size,\n\t\t\t\t\tgzippedSize,\n\t\t\t\t\trelativePath: relative(cwd, filePath),\n\t\t\t\t\ttype: 'chunk',\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\t// Find production binaries in dist/\n\tconst distDir = join(cwd, 'dist');\n\tif (existsSync(distDir)) {\n\t\tconst files = await readdir(distDir);\n\t\tfor (const file of files) {\n\t\t\tconst filePath = join(distDir, file);\n\t\t\tconst stats = statSync(filePath);\n\t\t\tif (stats.isFile() && !file.endsWith('.map') && !file.endsWith('.d.ts')) {\n\t\t\t\tconst content = await Bun.file(filePath).arrayBuffer();\n\t\t\t\tconst gzippedSize = Bun.gzipSync(new Uint8Array(content)).length;\n\n\t\t\t\tbundles.push({\n\t\t\t\t\tpath: filePath,\n\t\t\t\t\tname: file,\n\t\t\t\t\tsize: stats.size,\n\t\t\t\t\tgzippedSize,\n\t\t\t\t\trelativePath: relative(cwd, filePath),\n\t\t\t\t\ttype: 'binary',\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\treturn bundles;\n}\n\n/**\n * Find the main browser entrypoint bundle (e.g., index.52a12e66.js)\n * This is the actual JavaScript file shipped to browsers\n */\nasync function findBrowserEntry(cwd: string): Promise<string | null> {\n\ttry {\n\t\tconst clientDir = join(cwd, 'src', 'client');\n\t\tconst tsxEntry = join(clientDir, 'index.tsx');\n\t\tconst tsEntry = join(clientDir, 'index.ts');\n\n\t\tlet sourceEntry: string | null = null;\n\t\tif (existsSync(tsxEntry)) {\n\t\t\tsourceEntry = tsxEntry;\n\t\t} else if (existsSync(tsEntry)) {\n\t\t\tsourceEntry = tsEntry;\n\t\t}\n\n\t\tif (!sourceEntry) return null;\n\n\t\tconst { generateContentHash } = await import('reroute-js/core');\n\n\t\t// Build with NO externals - include everything\n\t\tconst isProd = isProductionMode();\n\t\tconst result = await Bun.build({\n\t\t\tentrypoints: [sourceEntry],\n\t\t\ttarget: 'browser',\n\t\t\tformat: 'esm',\n\t\t\tminify: isProd,\n\t\t\tsourcemap: 'linked',\n\t\t\texternal: [], // Include all dependencies\n\t\t\tdefine: {\n\t\t\t\t'process.env.NODE_ENV': isProd ? '\"production\"' : '\"development\"',\n\t\t\t},\n\t\t});\n\n\t\tif (!result.success) {\n\t\t\tif (result.logs && result.logs.length > 0) {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t'[reroute/analyze] Browser build errors:',\n\t\t\t\t\tresult.logs.map((log) => log.message).join('\\n'),\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn null;\n\t\t}\n\n\t\tif (result.outputs.length === 0) {\n\t\t\tconsole.warn('[reroute/analyze] Browser build produced no outputs');\n\t\t\treturn null;\n\t\t}\n\n\t\tconst tempDir = join(cwd, '.reroute', 'browser');\n\t\tawait import('node:fs/promises').then((fs) =>\n\t\t\tfs.mkdir(tempDir, { recursive: true }),\n\t\t);\n\n\t\tconst output = result.outputs[0];\n\t\tconst code = await output.text();\n\t\tconst actualHash = await generateContentHash(code);\n\t\tconst bundlePath = join(tempDir, `index.${actualHash}.js`);\n\n\t\tawait writeFile(bundlePath, code, 'utf-8');\n\n\t\tconst mapOutput = result.outputs.find((o) => o.path.endsWith('.map'));\n\t\tif (mapOutput) {\n\t\t\tconst mapContent = await mapOutput.text();\n\t\t\tawait writeFile(`${bundlePath}.map`, mapContent, 'utf-8');\n\t\t}\n\n\t\treturn bundlePath;\n\t} catch (error) {\n\t\tconsole.warn('[reroute/analyze] Could not build browser entry:', error);\n\t\treturn null;\n\t}\n}\n\nfunction formatBytes(bytes: number): string {\n\tif (bytes === 0) return '0 B';\n\tconst k = 1024;\n\tconst sizes = ['B', 'KB', 'MB', 'GB'];\n\tconst i = Math.floor(Math.log(bytes) / Math.log(k));\n\treturn `${(bytes / k ** i).toFixed(2)} ${sizes[i]}`;\n}\n\nfunction calculateStats(bundles: BundleInfo[]): BundleStats {\n\tconst byCollection: Record<string, BundleInfo[]> = {};\n\tlet totalSize = 0;\n\tlet totalGzippedSize = 0;\n\n\tfor (const bundle of bundles) {\n\t\ttotalSize += bundle.size;\n\t\ttotalGzippedSize += bundle.gzippedSize;\n\n\t\tif (bundle.type === 'chunk') {\n\t\t\t// Extract collection name from path\n\t\t\tconst match = bundle.relativePath.match(/\\.reroute\\/chunks\\/([^/]+)/);\n\t\t\tconst collection = match ? match[1] : 'unknown';\n\t\t\tif (!byCollection[collection]) {\n\t\t\t\tbyCollection[collection] = [];\n\t\t\t}\n\t\t\tbyCollection[collection].push(bundle);\n\t\t} else {\n\t\t\tif (!byCollection.binaries) {\n\t\t\t\tbyCollection.binaries = [];\n\t\t\t}\n\t\t\tbyCollection.binaries.push(bundle);\n\t\t}\n\t}\n\n\treturn {\n\t\ttotalBundles: bundles.length,\n\t\ttotalSize,\n\t\ttotalGzippedSize,\n\t\tbundles,\n\t\tbyCollection,\n\t};\n}\n\n/**\n * Build a dependency tree from bundle comments (no runtime imports).\n * Groups by node_modules packages vs local src files.\n */\n/**\n * Get actual installed package sizes from node_modules\n */\nasync function getInstalledPackageSizes(\n\tcwd: string,\n): Promise<Map<string, number>> {\n\tconst packageSizes = new Map<string, number>();\n\tconst nodeModulesDir = join(cwd, 'node_modules');\n\n\tif (!existsSync(nodeModulesDir)) return packageSizes;\n\n\ttry {\n\t\tconst { execSync } = await import('node:child_process');\n\t\t// Use du to get directory sizes (faster than recursively statting files)\n\t\tconst output = execSync(`du -sk ${nodeModulesDir}/* 2>/dev/null || true`, {\n\t\t\tencoding: 'utf8',\n\t\t\tmaxBuffer: 10 * 1024 * 1024,\n\t\t});\n\n\t\tconst lines = output.trim().split('\\n');\n\t\tfor (const line of lines) {\n\t\t\tconst [sizeKB, path] = line.split('\\t');\n\t\t\tif (!path) continue;\n\t\t\tconst pkgName = basename(path);\n\t\t\t// Handle @scope packages\n\t\t\tif (pkgName.startsWith('@')) {\n\t\t\t\tconst scopeDir = path;\n\t\t\t\tconst scopedOutput = execSync(\n\t\t\t\t\t`du -sk ${scopeDir}/* 2>/dev/null || true`,\n\t\t\t\t\t{\n\t\t\t\t\t\tencoding: 'utf8',\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t\tconst scopedLines = scopedOutput.trim().split('\\n');\n\t\t\t\tfor (const scopedLine of scopedLines) {\n\t\t\t\t\tconst [scopedSizeKB, scopedPath] = scopedLine.split('\\t');\n\t\t\t\t\tif (!scopedPath) continue;\n\t\t\t\t\tconst fullPkgName = `${pkgName}/${basename(scopedPath)}`;\n\t\t\t\t\tpackageSizes.set(\n\t\t\t\t\t\tfullPkgName,\n\t\t\t\t\t\tNumber.parseInt(scopedSizeKB, 10) * 1024,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tpackageSizes.set(pkgName, Number.parseInt(sizeKB, 10) * 1024);\n\t\t\t}\n\t\t}\n\t} catch (_error) {\n\t\t// Silently fail if du command doesn't work\n\t}\n\n\treturn packageSizes;\n}\n\nasync function buildDependencyTree(\n\tentryPath: string,\n\tcwd: string,\n): Promise<DepTree | null> {\n\ttry {\n\t\tif (!existsSync(entryPath)) return null;\n\n\t\tconst root: DepNode = {\n\t\t\tname: basename(entryPath),\n\t\t\tpath: entryPath,\n\t\t\tsize: 0,\n\t\t\tchildren: [],\n\t\t};\n\t\t// Prefer sourcemap-based analysis (generated build only)\n\t\tconst fromMap = await buildTreeFromSourceMap(entryPath, cwd);\n\t\tif (fromMap) return fromMap;\n\n\t\t// Fallback: use bundle comment markers (still generated build only)\n\t\ttry {\n\t\t\tconst content = await readFile(entryPath, 'utf-8');\n\t\t\tconst modulePattern = /\\/\\/\\s*(.+?\\.(?:ts|tsx|js|jsx|mjs|cjs))\\s*$/gm;\n\t\t\tconst nodeModulesNode: DepNode = {\n\t\t\t\tname: 'node_modules',\n\t\t\t\tpath: join(cwd, 'node_modules'),\n\t\t\t\tsize: 0,\n\t\t\t\tchildren: [],\n\t\t\t};\n\t\t\tconst srcNode: DepNode = {\n\t\t\t\tname: 'src',\n\t\t\t\tpath: cwd,\n\t\t\t\tsize: 0,\n\t\t\t\tchildren: [],\n\t\t\t};\n\t\t\troot.children?.push(nodeModulesNode, srcNode);\n\n\t\t\tfunction place(filePath: string, size: number) {\n\t\t\t\tif (filePath.includes('node_modules')) {\n\t\t\t\t\tlet pkgName = filePath.slice(\n\t\t\t\t\t\tfilePath.indexOf('node_modules') + 'node_modules'.length + 1,\n\t\t\t\t\t);\n\t\t\t\t\tpkgName = pkgName.startsWith('@')\n\t\t\t\t\t\t? pkgName.split('/').slice(0, 2).join('/')\n\t\t\t\t\t\t: pkgName.split('/')[0];\n\t\t\t\t\tlet pkgNode = nodeModulesNode.children?.find(\n\t\t\t\t\t\t(c) => c.name === pkgName,\n\t\t\t\t\t);\n\t\t\t\t\tif (!pkgNode) {\n\t\t\t\t\t\tpkgNode = {\n\t\t\t\t\t\t\tname: pkgName || 'unknown',\n\t\t\t\t\t\t\tpath: join(cwd, 'node_modules', pkgName || ''),\n\t\t\t\t\t\t\tsize: 0,\n\t\t\t\t\t\t\tchildren: [],\n\t\t\t\t\t\t};\n\t\t\t\t\t\tnodeModulesNode.children?.push(pkgNode);\n\t\t\t\t\t}\n\t\t\t\t\tpkgNode.children?.push({\n\t\t\t\t\t\tname: basename(filePath),\n\t\t\t\t\t\tpath: filePath,\n\t\t\t\t\t\tsize,\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tconst rel = relative(cwd, filePath);\n\t\t\t\t\tconst parts = rel.split('/').filter(Boolean);\n\t\t\t\t\tlet current = srcNode;\n\t\t\t\t\tfor (let i = 0; i < parts.length - 1; i++) {\n\t\t\t\t\t\tconst part = parts[i];\n\t\t\t\t\t\tlet child = current.children?.find((c) => c.name === part);\n\t\t\t\t\t\tif (!child) {\n\t\t\t\t\t\t\tchild = {\n\t\t\t\t\t\t\t\tname: part,\n\t\t\t\t\t\t\t\tpath: join(cwd, ...parts.slice(0, i + 1)),\n\t\t\t\t\t\t\t\tsize: 0,\n\t\t\t\t\t\t\t\tchildren: [],\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\tcurrent.children?.push(child);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcurrent = child;\n\t\t\t\t\t}\n\t\t\t\t\tcurrent.children?.push({\n\t\t\t\t\t\tname: parts[parts.length - 1] || basename(filePath),\n\t\t\t\t\t\tpath: filePath,\n\t\t\t\t\t\tsize,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet match: RegExpExecArray | null;\n\t\t\tlet lastPath = '';\n\t\t\tlet lastPos = 0;\n\t\t\tmatch = modulePattern.exec(content);\n\t\t\twhile (match !== null) {\n\t\t\t\tif (lastPath) {\n\t\t\t\t\tconst size = match.index - lastPos;\n\t\t\t\t\tif (size > 0) place(lastPath, size);\n\t\t\t\t}\n\t\t\t\tlastPath = match[1];\n\t\t\t\tlastPos = match.index + match[0].length;\n\t\t\t\tmatch = modulePattern.exec(content);\n\t\t\t}\n\t\t\tif (lastPath) {\n\t\t\t\tconst size = content.length - lastPos;\n\t\t\t\tif (size > 0) place(lastPath, size);\n\t\t\t}\n\n\t\t\t// Aggregate sizes\n\t\t\tfunction compute(node: DepNode): number {\n\t\t\t\tif (node.children && node.children.length > 0) {\n\t\t\t\t\tnode.size = node.children.reduce((s, c) => s + compute(c), 0);\n\t\t\t\t}\n\t\t\t\treturn node.size;\n\t\t\t}\n\t\t\tcompute(root);\n\n\t\t\treturn {\n\t\t\t\tentry: entryPath,\n\t\t\t\ttotalSize: root.size,\n\t\t\t\troot,\n\t\t\t};\n\t\t} catch {\n\t\t\treturn null;\n\t\t}\n\t} catch {\n\t\treturn null;\n\t}\n}\n\n/**\n * Build dependency tree from source map by attributing generated character spans\n * to original sources.\n */\nasync function buildTreeFromSourceMap(\n\tbundlePath: string,\n\tcwd: string,\n): Promise<DepTree | null> {\n\ttry {\n\t\tconst mapPath = `${bundlePath}.map`;\n\t\tif (!existsSync(mapPath)) return null;\n\t\tconst [bundle, mapJson] = await Promise.all([\n\t\t\treadFile(bundlePath, 'utf-8'),\n\t\t\treadFile(mapPath, 'utf-8'),\n\t\t]);\n\t\tconst map = JSON.parse(mapJson) as {\n\t\t\tversion: number;\n\t\t\tfile?: string;\n\t\t\tsourceRoot?: string;\n\t\t\tsources: string[];\n\t\t\tmappings: string;\n\t\t};\n\t\tconst sourceRoot = map.sourceRoot || '';\n\t\tconst genLines = bundle.split('\\n').map((l) => l.length);\n\n\t\t// Base64 VLQ decoding helpers\n\t\tconst chars =\n\t\t\t'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n\t\tconst charToInt = new Map<string, number>();\n\t\tfor (let i = 0; i < chars.length; i++) charToInt.set(chars[i], i);\n\t\tfunction decodeVLQ(str: string, indexRef: { i: number }): number {\n\t\t\tlet result = 0;\n\t\t\tlet shift = 0;\n\t\t\tlet continuation: boolean;\n\t\t\tdo {\n\t\t\t\tconst ch = str[indexRef.i++];\n\t\t\t\tif (ch == null) return 0;\n\t\t\t\tconst val = charToInt.get(ch) ?? 0;\n\t\t\t\tcontinuation = (val & 32) !== 0;\n\t\t\t\tconst digit = val & 31;\n\t\t\t\tresult += digit << shift;\n\t\t\t\tshift += 5;\n\t\t\t} while (continuation);\n\t\t\tconst negate = result & 1;\n\t\t\tresult >>= 1;\n\t\t\treturn negate ? -result : result;\n\t\t}\n\n\t\t// Aggregate generated spans per source index\n\t\tconst perSource: number[] = new Array(map.sources.length).fill(0);\n\n\t\tconst lines = map.mappings.split(';');\n\t\tfor (let line = 0; line < lines.length; line++) {\n\t\t\tconst segs = lines[line];\n\t\t\tif (!segs) continue;\n\t\t\tlet genCol = 0;\n\t\t\tlet src = 0;\n\t\t\tlet _srcLine = 0;\n\t\t\tlet _srcCol = 0;\n\n\t\t\tconst decoded: Array<{ gen: number; src: number | null }> = [];\n\t\t\tconst idx = { i: 0 };\n\t\t\twhile (idx.i < segs.length) {\n\t\t\t\tconst start = idx.i;\n\t\t\t\tgenCol += decodeVLQ(segs, idx);\n\t\t\t\tlet srcIndex: number | null = null;\n\t\t\t\tif (idx.i < segs.length && segs[idx.i] !== ',') {\n\t\t\t\t\tsrc += decodeVLQ(segs, idx);\n\t\t\t\t\t_srcLine += decodeVLQ(segs, idx);\n\t\t\t\t\t_srcCol += decodeVLQ(segs, idx);\n\t\t\t\t\tif (idx.i < segs.length && segs[idx.i] !== ',') {\n\t\t\t\t\t\tdecodeVLQ(segs, idx);\n\t\t\t\t\t}\n\t\t\t\t\tsrcIndex = src;\n\t\t\t\t}\n\t\t\t\tdecoded.push({ gen: genCol, src: srcIndex });\n\t\t\t\tif (segs[idx.i] === ',') idx.i++;\n\t\t\t\tif (idx.i === start) idx.i++;\n\t\t\t}\n\t\t\tif (decoded.length === 0) continue;\n\t\t\tfor (let i = 0; i < decoded.length; i++) {\n\t\t\t\tconst curr = decoded[i];\n\t\t\t\tconst nextGen =\n\t\t\t\t\ti + 1 < decoded.length ? decoded[i + 1].gen : (genLines[line] ?? 0);\n\t\t\t\tconst span = Math.max(0, nextGen - curr.gen);\n\t\t\t\tif (span > 0 && curr.src != null && perSource[curr.src] != null) {\n\t\t\t\t\tperSource[curr.src] += span;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Build tree\n\t\tconst root: DepNode = {\n\t\t\tname: basename(bundlePath),\n\t\t\tpath: bundlePath,\n\t\t\tsize: 0,\n\t\t\tchildren: [],\n\t\t};\n\t\tconst nodeModulesNode: DepNode = {\n\t\t\tname: 'node_modules',\n\t\t\tpath: join(cwd, 'node_modules'),\n\t\t\tsize: 0,\n\t\t\tchildren: [],\n\t\t};\n\t\tconst srcNode: DepNode = {\n\t\t\tname: 'src',\n\t\t\tpath: cwd,\n\t\t\tsize: 0,\n\t\t\tchildren: [],\n\t\t};\n\t\troot.children?.push(nodeModulesNode, srcNode);\n\n\t\tfunction absFor(sourcePath: string): string {\n\t\t\tif (sourcePath.startsWith('/') || sourcePath.match(/^[A-Za-z]:\\\\/))\n\t\t\t\treturn sourcePath;\n\t\t\t// Resolve relative to the bundle file's directory\n\t\t\tconst bundleDir = bundlePath.substring(0, bundlePath.lastIndexOf('/'));\n\t\t\treturn join(bundleDir, sourceRoot || '', sourcePath);\n\t\t}\n\n\t\tfor (let i = 0; i < map.sources.length; i++) {\n\t\t\tconst size = perSource[i];\n\t\t\tif (size <= 0) continue;\n\t\t\tconst srcPath = absFor(map.sources[i]);\n\t\t\tif (srcPath.includes('node_modules')) {\n\t\t\t\t// Extract package name - handle Bun's .bun/package@version/node_modules/package/ format\n\t\t\t\tlet pkgName: string;\n\n\t\t\t\t// Check if it's a Bun internal path like: node_modules/.bun/package@version/node_modules/package/\n\t\t\t\tif (srcPath.includes('.bun/')) {\n\t\t\t\t\tconst bunMatch = srcPath.match(\n\t\t\t\t\t\t/\\.bun\\/([^/]+)@[^/]+\\/node_modules\\/([^/]+)\\//,\n\t\t\t\t\t);\n\t\t\t\t\tif (bunMatch) {\n\t\t\t\t\t\t// Use the package name from the inner node_modules path\n\t\t\t\t\t\tconst innerPkg = bunMatch[2];\n\t\t\t\t\t\t// Handle @scope/package\n\t\t\t\t\t\tif (innerPkg === '@borewit' || innerPkg.startsWith('@')) {\n\t\t\t\t\t\t\tconst scopeMatch = srcPath.match(\n\t\t\t\t\t\t\t\t/\\.bun\\/[^/]+@[^/]+\\/node_modules\\/((@[^/]+\\/[^/]+))/,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tpkgName = scopeMatch ? scopeMatch[1] : innerPkg;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tpkgName = innerPkg;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Fallback: extract from .bun/package@version\n\t\t\t\t\t\tconst fallbackMatch = srcPath.match(/\\.bun\\/([^@/]+)/);\n\t\t\t\t\t\tpkgName = fallbackMatch ? fallbackMatch[1] : 'unknown';\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// Normal node_modules path\n\t\t\t\t\tconst afterNm = srcPath.slice(\n\t\t\t\t\t\tsrcPath.lastIndexOf('node_modules') + 'node_modules'.length + 1,\n\t\t\t\t\t);\n\t\t\t\t\tpkgName = afterNm.startsWith('@')\n\t\t\t\t\t\t? afterNm.split('/').slice(0, 2).join('/')\n\t\t\t\t\t\t: afterNm.split('/')[0];\n\t\t\t\t}\n\n\t\t\t\tlet pkgNode = nodeModulesNode.children?.find((c) => c.name === pkgName);\n\t\t\t\tif (!pkgNode) {\n\t\t\t\t\tpkgNode = {\n\t\t\t\t\t\tname: pkgName || 'unknown',\n\t\t\t\t\t\tpath: join(cwd, 'node_modules', pkgName || ''),\n\t\t\t\t\t\tsize: 0,\n\t\t\t\t\t\tchildren: [],\n\t\t\t\t\t};\n\t\t\t\t\tnodeModulesNode.children?.push(pkgNode);\n\t\t\t\t}\n\t\t\t\tpkgNode.children?.push({\n\t\t\t\t\tname: basename(srcPath),\n\t\t\t\t\tpath: srcPath,\n\t\t\t\t\tsize,\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tconst rel = relative(cwd, srcPath);\n\t\t\t\tconst parts = rel.split('/').filter(Boolean);\n\t\t\t\tlet current = srcNode;\n\t\t\t\tfor (let i = 0; i < parts.length - 1; i++) {\n\t\t\t\t\tconst part = parts[i];\n\t\t\t\t\tlet child = current.children?.find((c) => c.name === part);\n\t\t\t\t\tif (!child) {\n\t\t\t\t\t\tchild = {\n\t\t\t\t\t\t\tname: part,\n\t\t\t\t\t\t\tpath: join(cwd, ...parts.slice(0, i + 1)),\n\t\t\t\t\t\t\tsize: 0,\n\t\t\t\t\t\t\tchildren: [],\n\t\t\t\t\t\t};\n\t\t\t\t\t\tcurrent.children?.push(child);\n\t\t\t\t\t}\n\t\t\t\t\tcurrent = child;\n\t\t\t\t}\n\t\t\t\tcurrent.children?.push({\n\t\t\t\t\tname: parts[parts.length - 1] || basename(srcPath),\n\t\t\t\t\tpath: srcPath,\n\t\t\t\t\tsize,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tfunction computeSizes(node: DepNode): number {\n\t\t\tif (node.children && node.children.length > 0) {\n\t\t\t\tnode.size = node.children.reduce((s, c) => s + computeSizes(c), 0);\n\t\t\t}\n\t\t\treturn node.size;\n\t\t}\n\t\tcomputeSizes(root);\n\n\t\treturn {\n\t\t\tentry: bundlePath,\n\t\t\ttotalSize: root.size,\n\t\t\troot,\n\t\t};\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nasync function generateHTMLReport(\n\tstats: BundleStats,\n\tdepTree?: DepTree | null,\n\tmainInfo?: { name: string; size: number; gzippedSize: number } | null,\n\tbrowserDepTree?: DepTree | null,\n\tbrowserInfo?: { name: string; size: number; gzippedSize: number } | null,\n\tinitialSearch?: string,\n): Promise<string> {\n\tconst bundles = stats.bundles.sort((a, b) => b.size - a.size);\n\n\t// Get actual dist/ binary size for HTML\n\tlet actualServerBinarySize: number | null = null;\n\tlet actualServerBinaryGzipped: number | null = null;\n\ttry {\n\t\tconst distDir = join(process.cwd(), 'dist');\n\t\tif (existsSync(distDir)) {\n\t\t\tconst files = await readdir(distDir);\n\t\t\tfor (const file of files) {\n\t\t\t\tconst filePath = join(distDir, file);\n\t\t\t\tconst stats = statSync(filePath);\n\t\t\t\tif (stats.isFile() && !file.includes('.')) {\n\t\t\t\t\tactualServerBinarySize = stats.size;\n\t\t\t\t\tconst content = await readFile(filePath);\n\t\t\t\t\tactualServerBinaryGzipped = Bun.gzipSync(content).length;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t} catch {}\n\n\t// Helper function to create inline SVG icons (Tabler Icons style, terminal aesthetic)\n\tconst icon = (name: string, color = '#0f0', size = 16) => {\n\t\tconst icons: Record<string, string> = {\n\t\t\tchart: '<path d=\"M3 3v18h18\"/><path d=\"M7 12l4-4 4 4 6-6\"/>',\n\t\t\tworld:\n\t\t\t\t'<path d=\"M21 12a9 9 0 1 1-6.219-8.56\"/><path d=\"M3 9v6a6 6 0 0 0 6 6h6\"/><path d=\"M21 9v6a6 6 0 0 1-6 6H9\"/>',\n\t\t\tsearch: '<circle cx=\"10\" cy=\"10\" r=\"7\"/><path d=\"m21 21-6-6\"/>',\n\t\t\ttreemap:\n\t\t\t\t'<path d=\"M3 3v18h18\"/><path d=\"M3 9h8v12H3z\"/><path d=\"M13 9h8v6h-8z\"/><path d=\"M13 17h8v4h-8z\"/>',\n\t\t\tpackage:\n\t\t\t\t'<path d=\"M12 3v20\"/><path d=\"M2 7h20v14H2z\"/><path d=\"M2 7l10-4 10 4\"/>',\n\t\t\tserver:\n\t\t\t\t'<path d=\"M4 5h16\"/><path d=\"M4 9h16\"/><path d=\"M4 13h16\"/><path d=\"M4 17h16\"/><path d=\"M6 3v18\"/><path d=\"M18 3v18\"/>',\n\t\t};\n\t\tconst path = icons[name] || icons.chart;\n\t\treturn `<svg width=\"${size}\" height=\"${size}\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"${color}\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" style=\"display: inline-block; vertical-align: middle; margin-right: 0.4rem;\">${path}</svg>`;\n\t};\n\n\tconst html = `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n\t<meta charset=\"UTF-8\">\n\t<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n\t<title>Reroute Bundle Analysis</title>\n\t<script src=\"https://d3js.org/d3.v7.min.js\"></script>\n\t<style>\n\t\t* {\n\t\t\tmargin: 0;\n\t\t\tpadding: 0;\n\t\t\tbox-sizing: border-box;\n\t\t}\n\t\tbody {\n\t\t\tfont-family: 'SF Mono', 'Monaco', 'Inconsolata', 'Fira Code', 'Droid Sans Mono', 'Source Code Pro', monospace;\n\t\t\tbackground: #000;\n\t\t\tcolor: #0f0;\n\t\t\tpadding: 1.5rem;\n\t\t\tline-height: 1.5;\n\t\t\tfont-size: 13px;\n\t\t}\n\t\t.container {\n\t\t\tmax-width: 1600px;\n\t\t\tmargin: 0 auto;\n\t\t}\n\t\th1 {\n\t\t\tcolor: #0f0;\n\t\t\tmargin-bottom: 0.5rem;\n\t\t\tfont-size: 1.25rem;\n\t\t\tfont-weight: 600;\n\t\t\tletter-spacing: 0.5px;\n\t\t}\n\t\th1::before {\n\t\t\tcontent: '$ ';\n\t\t\tcolor: #666;\n\t\t}\n\t\t.sticky-search {\n\t\t\tposition: sticky;\n\t\t\ttop: 0;\n\t\t\tbackground: #000;\n\t\t\tz-index: 100;\n\t\t\tpadding: 1rem 0;\n\t\t\tmargin: 0;\n\t\t}\n\t\t.search-row {\n\t\t\tdisplay: grid;\n\t\t\tgrid-template-columns: 1fr auto;\n\t\t\tgap: 0.75rem;\n\t\t\talign-items: start;\n\t\t\theight: 33px;\n\t\t}\n\t\t.search-container {\n\t\t\tposition: relative;\n\t\t\tdisplay: flex;\n\t\t\tflex-direction: column;\n\t\t\tgap: 0.5rem;\n\t\t}\n\t\t.search-input-wrapper {\n\t\t\tposition: relative;\n\t\t}\n\t\t.search-clear {\n\t\t\tposition: absolute;\n\t\t\tright: 0.5rem;\n\t\t\ttop: 50%;\n\t\t\ttransform: translateY(-50%);\n\t\t\tbackground: none;\n\t\t\tborder: none;\n\t\t\tcolor: #666;\n\t\t\tcursor: pointer;\n\t\t\tpadding: 0.25rem;\n\t\t\tdisplay: none;\n\t\t\talign-items: center;\n\t\t\tjustify-content: center;\n\t\t\tfont-size: 17px;\n\t\t\tline-height: 1;\n\t\t}\n\t\t.search-clear:hover {\n\t\t\tcolor: #0f0;\n\t\t}\n\t\t.search-clear.visible {\n\t\t\tdisplay: flex;\n\t\t}\n\t\t.search-input {\n\t\t\twidth: 100%;\n\t\t\tpadding: 0.5rem 2rem 0.5rem 0.75rem;\n\t\t\tbackground: #111;\n\t\t\tborder: 1px solid #333;\n\t\t\tcolor: #0f0;\n\t\t\tfont-size: 13px;\n\t\t\tfont-family: inherit;\n\t\t}\n\t\t.note {\n\t\t\tcolor: #666;\n\t\t\tfont-size: 12px;\n\t\t\tpadding: 0.75rem;\n\t\t\tbackground: #111;\n\t\t\tborder-left: 2px solid #333;\n\t\t}\n\t\t.note strong {\n\t\t\tcolor: #0f0;\n\t\t}\n\t\t@media (max-width: 640px) {\n\t\t\t.search-row {\n\t\t\t\tgrid-template-columns: 1fr;\n\t\t\t\tgap: 0.5rem;\n\t\t\t}\n\t\t}\n\t\t.search-input:focus {\n\t\t\toutline: none;\n\t\t\tborder-color: #0f0;\n\t\t}\n\t\t.search-input::placeholder {\n\t\t\tcolor: #666;\n\t\t}\n\t\t.search-stats {\n\t\t\tmargin-bottom: 1rem;\n\t\t\tfont-size: 12px;\n\t\t\tcolor: #666;\n\t\t}\n\t\t.search-actions {\n\t\t\tdisplay: flex;\n\t\t\tgap: 0.5rem;\n\t\t\talign-items: stretch;\n\t\t}\n\t\t@media (max-width: 640px) {\n\t\t\t.search-actions {\n\t\t\t\twidth: 100%;\n\t\t\t}\n\t\t}\n\t\t.checkbox-label {\n\t\t\tpadding: 0.5rem 0.75rem;\n\t\t\tbackground: #111;\n\t\t\tborder: 1px solid #333;\n\t\t\tcolor: #0f0;\n\t\t\tfont-size: 13px;\n\t\t\tfont-family: inherit;\n\t\t\tcursor: pointer;\n\t\t\twhite-space: nowrap;\n\t\t\tdisplay: flex;\n\t\t\talign-items: center;\n\t\t\tgap: 0.5rem;\n\t\t\tuser-select: none;\n\t\t}\n\t\t.checkbox-label:hover {\n\t\t\tbackground: #1a1a1a;\n\t\t\tborder-color: #0f0;\n\t\t}\n\t\t.checkbox-label input[type=\"checkbox\"] {\n\t\t\tcursor: pointer;\n\t\t\twidth: 14px;\n\t\t\theight: 14px;\n\t\t\taccent-color: #0f0;\n\t\t}\n\t\t@media (max-width: 640px) {\n\t\t\t.checkbox-label {\n\t\t\t\tflex: 1;\n\t\t\t}\n\t\t}\n\t\t.btn-toggle {\n\t\t\tpadding: 0.5rem 0.75rem;\n\t\t\tbackground: #111;\n\t\t\tborder: 1px solid #333;\n\t\t\tcolor: #0f0;\n\t\t\tfont-size: 13px;\n\t\t\tfont-family: inherit;\n\t\t\tcursor: pointer;\n\t\t\twhite-space: nowrap;\n\t\t\tdisplay: flex;\n\t\t\talign-items: center;\n\t\t\tbox-sizing: border-box;\n\t\t}\n\t\t.btn-toggle:hover {\n\t\t\tbackground: #1a1a1a;\n\t\t\tborder-color: #0f0;\n\t\t}\n\t\t@media (max-width: 640px) {\n\t\t\t.btn-toggle {\n\t\t\t\tflex: 1;\n\t\t\t}\n\t\t}\n\t\t.hidden {\n\t\t\tdisplay: none !important;\n\t\t}\n\t\t.section {\n\t\t\tmargin-bottom: 1.5rem;\n\t\t\tborder: 1px solid #333;\n\t\t\tbackground: #0a0a0a;\n\t\t}\n\t\t.section-header {\n\t\t\tpadding: 0.75rem 1rem;\n\t\t\tbackground: #111;\n\t\t\tborder-bottom: 1px solid #333;\n\t\t\tcursor: pointer;\n\t\t\tuser-select: none;\n\t\t\tdisplay: flex;\n\t\t\tjustify-content: space-between;\n\t\t\talign-items: center;\n\t\t}\n\t\t.section-header:hover {\n\t\t\tbackground: #151515;\n\t\t}\n\t\t.section-title {\n\t\t\tfont-size: 14px;\n\t\t\tfont-weight: 600;\n\t\t\tcolor: #0f0;\n\t\t}\n\t\t.section-title.server {\n\t\t\tcolor: #666;\n\t\t}\n\t\t.section-meta {\n\t\t\tcolor: #666;\n\t\t\tfont-size: 12px;\n\t\t}\n\t\t.section-toggle {\n\t\t\tcolor: #666;\n\t\t\tfont-size: 12px;\n\t\t}\n\t\t.section-content {\n\t\t\tpadding: 1rem;\n\t\t}\n\t\t.section.collapsed .section-content {\n\t\t\tdisplay: none;\n\t\t}\n\t\t.section.collapsed .section-toggle::before {\n\t\t\tcontent: '▶ ';\n\t\t}\n\t\t.section-toggle::before {\n\t\t\tcontent: '▼ ';\n\t\t}\n\t\t.stats-grid {\n\t\t\tdisplay: grid;\n\t\t\tgrid-template-columns: repeat(auto-fit, minmax(140px, 1fr));\n\t\t\tgap: 0.5rem;\n\t\t\tmargin-bottom: 1rem;\n\t\t}\n\t\t.stat {\n\t\t\tbackground: #111;\n\t\t\tpadding: 0.5rem 0.75rem;\n\t\t\tborder: 1px solid #222;\n\t\t}\n\t\t.stat-label {\n\t\t\tfont-size: 11px;\n\t\t\tcolor: #666;\n\t\t\tmargin-bottom: 0.25rem;\n\t\t}\n\t\t.stat-value {\n\t\t\tfont-size: 16px;\n\t\t\tfont-weight: 600;\n\t\t\tcolor: #0f0;\n\t\t}\n\t\t.stat-value.server {\n\t\t\tcolor: #666;\n\t\t}\n\t\t.dep-list {\n\t\t\tlist-style: none;\n\t\t\tmargin: 0;\n\t\t\tpadding: 0;\n\t\t}\n\t\t.dep-item {\n\t\t\tpadding: 0.4rem 0;\n\t\t\tborder-bottom: 1px solid #1a1a1a;\n\t\t\tdisplay: flex;\n\t\t\tjustify-content: space-between;\n\t\t\talign-items: center;\n\t\t\tfont-size: 12px;\n\t\t}\n\t\t.dep-item:last-child {\n\t\t\tborder-bottom: none;\n\t\t}\n\t\t.dep-name {\n\t\t\tcolor: #0f0;\n\t\t\tfont-weight: 500;\n\t\t}\n\t\t.dep-name.server {\n\t\t\tcolor: #666;\n\t\t}\n\t\t.dep-size {\n\t\t\tcolor: #666;\n\t\t\tfont-size: 11px;\n\t\t}\n\t\t.dep-children {\n\t\t\tmargin-left: 1.5rem;\n\t\t\tmargin-top: 0.25rem;\n\t\t}\n\t\t.dep-child {\n\t\t\tcolor: #666;\n\t\t\tfont-size: 11px;\n\t\t\tpadding: 0.2rem 0;\n\t\t}\n\t\t.load-more {\n\t\t\tmargin-top: 0.75rem;\n\t\t\tpadding: 0.4rem 0.75rem;\n\t\t\tbackground: #111;\n\t\t\tborder: 1px solid #333;\n\t\t\tcolor: #0f0;\n\t\t\tcursor: pointer;\n\t\t\tfont-family: inherit;\n\t\t\tfont-size: 12px;\n\t\t\twidth: 100%;\n\t\t}\n\t\t.load-more:hover {\n\t\t\tbackground: #1a1a1a;\n\t\t\tborder-color: #0f0;\n\t\t}\n\t\t.treemap-container {\n\t\t\twidth: 100%;\n\t\t\toverflow: visible;\n\t\t}\n\t\t.empty {\n\t\t\ttext-align: center;\n\t\t\tpadding: 2rem;\n\t\t\tcolor: #666;\n\t\t\tfont-size: 12px;\n\t\t}\n\t\t.treemap-cell {\n\t\t\tstroke: #111;\n\t\t\tstroke-width: 1px;\n\t\t\tcursor: pointer;\n\t\t\ttransition: all 0.2s;\n\t\t}\n\t\t.treemap-cell:hover {\n\t\t\tstroke: #0f0;\n\t\t\tstroke-width: 2px;\n\t\t}\n\t\t.treemap-label {\n\t\t\tfill: #0f0;\n\t\t\tfont-size: 10px;\n\t\t\tpointer-events: none;\n\t\t\ttext-anchor: middle;\n\t\t\tfont-weight: 500;\n\t\t}\n\t\t.treemap-tooltip {\n\t\t\tposition: absolute;\n\t\t\tbackground: #000;\n\t\t\tborder: 1px solid #0f0;\n\t\t\tpadding: 0.5rem 0.75rem;\n\t\t\tpointer-events: none;\n\t\t\topacity: 0;\n\t\t\ttransition: opacity 0.15s;\n\t\t\tz-index: 1000;\n\t\t\tfont-size: 11px;\n\t\t}\n\t\t.treemap-tooltip.visible {\n\t\t\topacity: 1;\n\t\t}\n\t\t.tooltip-name {\n\t\t\tfont-weight: 600;\n\t\t\tcolor: #0f0;\n\t\t\tmargin-bottom: 0.25rem;\n\t\t}\n\t\t.tooltip-path {\n\t\t\tcolor: #666;\n\t\t\tfont-size: 10px;\n\t\t\tmargin-bottom: 0.25rem;\n\t\t\tword-break: break-all;\n\t\t}\n\t\t.tooltip-size {\n\t\t\tcolor: #0f0;\n\t\t\tfont-size: 11px;\n\t\t}\n\t</style>\n</head>\n<body>\n\t<div class=\"container\">\n\t\t<h1>reroute analyze</h1>\n\n\t\t<div class=\"sticky-search\">\n\t\t\t<div class=\"search-row\">\n\t\t\t\t<div class=\"search-container\">\n\t\t\t\t\t<div class=\"search-input-wrapper\">\n\t\t\t\t\t\t<input\n\t\t\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t\t\tid=\"search-input\"\n\t\t\t\t\t\t\tclass=\"search-input\"\n\t\t\t\t\t\t\tplaceholder=\"search dependencies (e.g., 'react', 'scheduler', 'sharp')...\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<button class=\"search-clear\" id=\"search-clear\" type=\"button\" aria-label=\"Clear search\">×</button>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"search-actions\">\n\t\t\t\t\t<button class=\"btn-toggle\" id=\"expand-all\">expand</button>\n\t\t\t\t\t<button class=\"btn-toggle\" id=\"collapse-all\">collapse</button>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\n\t\t<div class=\"section\">\n\t\t\t<div class=\"section-header\">\n\t\t\t\t<div>\n\t\t\t\t\t<div class=\"section-title\">${icon('chart')}Summary</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div class=\"section-content\">\n\t\t\t\t<div class=\"stats-grid\">\n\t\t\t\t\t<div class=\"stat\">\n\t\t\t\t\t\t<div class=\"stat-label\">browser dependencies</div>\n\t\t\t\t\t\t<div class=\"stat-value\">${(() => {\n\t\t\t\t\t\t\tconst nodeModules = browserDepTree?.root.children?.find(\n\t\t\t\t\t\t\t\t(c) => c.name === 'node_modules',\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\treturn nodeModules?.children?.length || 0;\n\t\t\t\t\t\t})()}</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"stat\">\n\t\t\t\t\t\t<div class=\"stat-label\">browser bundle</div>\n\t\t\t\t\t\t<div class=\"stat-value\">${browserInfo ? formatBytes(browserInfo.size) : 'N/A'}</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"stat\">\n\t\t\t\t\t\t<div class=\"stat-label\">server dependencies</div>\n\t\t\t\t\t\t<div class=\"stat-value\">${(() => {\n\t\t\t\t\t\t\tconst nodeModules = depTree?.root.children?.find(\n\t\t\t\t\t\t\t\t(c) => c.name === 'node_modules',\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\treturn nodeModules?.children?.length || 0;\n\t\t\t\t\t\t})()}</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"stat\">\n\t\t\t\t\t\t<div class=\"stat-label\">final server binary</div>\n\t\t\t\t\t\t<div class=\"stat-value\">${actualServerBinarySize ? formatBytes(actualServerBinarySize) : 'N/A'}</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\n\t\t<!-- ═══════════════════════════════════════════════════════════ -->\n\t\t<!-- BROWSER SECTION (what users download) -->\n\t\t<!-- ═══════════════════════════════════════════════════════════ -->\n\n\t\t${\n\t\t\tbrowserInfo\n\t\t\t\t? `\n\t\t<div class=\"section\">\n\t\t\t<div class=\"section-header\" onclick=\"this.parentElement.classList.toggle('collapsed')\">\n\t\t\t\t<div>\n\t\t\t\t\t<div class=\"section-title\">${icon('world')}browser bundle</div>\n\t\t\t\t\t<div class=\"section-meta\">${browserInfo.name} · ${formatBytes(browserInfo.size)} raw · ${formatBytes(browserInfo.gzippedSize)} gzipped</div>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"section-toggle\"></div>\n\t\t\t</div>\n\t\t\t<div class=\"section-content\">\n\t\t\t\t<div class=\"stats-grid\">\n\t\t\t\t\t<div class=\"stat\">\n\t\t\t\t\t\t<div class=\"stat-label\">raw size</div>\n\t\t\t\t\t\t<div class=\"stat-value\">${formatBytes(browserInfo.size)}</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"stat\">\n\t\t\t\t\t\t<div class=\"stat-label\">gzipped</div>\n\t\t\t\t\t\t<div class=\"stat-value\">${formatBytes(browserInfo.gzippedSize)}</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"stat\">\n\t\t\t\t\t\t<div class=\"stat-label\">compression</div>\n\t\t\t\t\t\t<div class=\"stat-value\">${((1 - browserInfo.gzippedSize / browserInfo.size) * 100).toFixed(1)}%</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"stat\">\n\t\t\t\t\t\t<div class=\"stat-label\">3G transfer</div>\n\t\t\t\t\t\t<div class=\"stat-value\">${(() => {\n\t\t\t\t\t\t\tconst t = browserInfo.gzippedSize / 1024 / (1.6 * 128);\n\t\t\t\t\t\t\treturn t >= 1 ? `${t.toFixed(1)}s` : `${(t * 1000).toFixed(0)}ms`;\n\t\t\t\t\t\t})()}</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"stat\">\n\t\t\t\t\t\t<div class=\"stat-label\">4G transfer</div>\n\t\t\t\t\t\t<div class=\"stat-value\">${(() => {\n\t\t\t\t\t\t\tconst t = browserInfo.gzippedSize / 1024 / (9 * 128);\n\t\t\t\t\t\t\treturn t >= 1 ? `${t.toFixed(1)}s` : `${(t * 1000).toFixed(0)}ms`;\n\t\t\t\t\t\t})()}</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"stat\">\n\t\t\t\t\t\t<div class=\"stat-label\">5G transfer</div>\n\t\t\t\t\t\t<div class=\"stat-value\">${(() => {\n\t\t\t\t\t\t\tconst t = browserInfo.gzippedSize / 1024 / (50 * 128);\n\t\t\t\t\t\t\treturn t >= 1 ? `${t.toFixed(1)}s` : `${(t * 1000).toFixed(0)}ms`;\n\t\t\t\t\t\t})()}</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t\t`\n\t\t\t\t: ''\n\t\t}\n\t\t${\n\t\t\tbrowserDepTree\n\t\t\t\t? `\n\t\t<div class=\"section collapsed\">\n\t\t\t<div class=\"section-header\" onclick=\"this.parentElement.classList.toggle('collapsed')\">\n\t\t\t\t<div>\n\t\t\t\t\t<div class=\"section-title\">${icon('search')}browser dependencies</div>\n\t\t\t\t\t<div class=\"section-meta\">dependency breakdown</div>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"section-toggle\"></div>\n\t\t\t</div>\n\t\t\t<div class=\"section-content\">\n\t\t\t\t<div id=\"browser-deps-list\"></div>\n\t\t\t</div>\n\t\t</div>\n\n\t\t<div class=\"section collapsed\">\n\t\t\t<div class=\"section-header\" onclick=\"this.parentElement.classList.toggle('collapsed')\">\n\t\t\t\t<div>\n\t\t\t\t\t<div class=\"section-title\">${icon('treemap')}browser treemap</div>\n\t\t\t\t\t<div class=\"section-meta\">visual dependency breakdown</div>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"section-toggle\"></div>\n\t\t\t</div>\n\t\t\t<div class=\"section-content\">\n\t\t\t\t<div class=\"treemap-container\" id=\"browser-treemap\"></div>\n\t\t\t</div>\n\t\t</div>\n\t\t`\n\t\t\t\t: ''\n\t\t}\n\n\t\t${Object.entries(stats.byCollection)\n\t\t\t.filter(([collection]) => collection !== 'binaries')\n\t\t\t.map(([collection, collectionBundles]) => {\n\t\t\t\tconst collectionTotal = collectionBundles.reduce(\n\t\t\t\t\t(sum, b) => sum + b.size,\n\t\t\t\t\t0,\n\t\t\t\t);\n\t\t\t\tconst collectionGzipped = collectionBundles.reduce(\n\t\t\t\t\t(sum, b) => sum + b.gzippedSize,\n\t\t\t\t\t0,\n\t\t\t\t);\n\t\t\t\treturn `\n\t\t<div class=\"section collapsed\">\n\t\t\t<div class=\"section-header\" onclick=\"this.parentElement.classList.toggle('collapsed')\">\n\t\t\t\t<div>\n\t\t\t\t\t<div class=\"section-title\">${icon('package')}${collection} chunks</div>\n\t\t\t\t\t<div class=\"section-meta\">${collectionBundles.length} files · ${formatBytes(collectionTotal)} raw · ${formatBytes(collectionGzipped)} gzipped</div>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"section-toggle\"></div>\n\t\t\t</div>\n\t\t\t<div class=\"section-content\">\n\t\t\t\t<ul class=\"dep-list\" id=\"${collection}-chunks-list\">\n\t\t\t\t\t${collectionBundles\n\t\t\t\t\t\t.sort((a, b) => b.size - a.size)\n\t\t\t\t\t\t.slice(0, 10)\n\t\t\t\t\t\t.map(\n\t\t\t\t\t\t\t(bundle) => `\n\t\t\t\t\t<li class=\"dep-item\">\n\t\t\t\t\t\t<span class=\"dep-name\">${bundle.name}</span>\n\t\t\t\t\t\t<span class=\"dep-size\">${formatBytes(bundle.size)} · ${formatBytes(bundle.gzippedSize)} gz</span>\n\t\t\t\t\t</li>\n\t\t\t\t\t`,\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.join('')}\n\t\t\t\t</ul>\n\t\t\t\t${\n\t\t\t\t\tcollectionBundles.length > 10\n\t\t\t\t\t\t? `\n\t\t\t\t<button class=\"load-more\" onclick=\"loadMore${collection}()\">load ${collectionBundles.length - 10} more...</button>\n\t\t\t\t<script>\n\t\t\t\t\tlet ${collection}Loaded = false;\n\t\t\t\t\tfunction loadMore${collection}() {\n\t\t\t\t\t\tif (${collection}Loaded) return;\n\t\t\t\t\t\t${collection}Loaded = true;\n\t\t\t\t\t\tconst list = document.getElementById('${collection}-chunks-list');\n\t\t\t\t\t\tconst remaining = ${JSON.stringify(collectionBundles.slice(10).map((b) => ({ name: b.name, size: b.size, gzippedSize: b.gzippedSize })))};\n\t\t\t\t\t\tfor (const bundle of remaining) {\n\t\t\t\t\t\t\tconst li = document.createElement('li');\n\t\t\t\t\t\t\tli.className = 'dep-item';\n\t\t\t\t\t\t\tli.innerHTML = '<span class=\"dep-name\">' + bundle.name + '</span><span class=\"dep-size\">' + formatBytes(bundle.size) + ' · ' + formatBytes(bundle.gzippedSize) + ' gz</span>';\n\t\t\t\t\t\t\tlist.appendChild(li);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tevent.target.remove();\n\t\t\t\t\t}\n\t\t\t\t</script>\n\t\t\t\t`\n\t\t\t\t\t\t: ''\n\t\t\t\t}\n\t\t\t</div>\n\t\t</div>\n\t\t`;\n\t\t\t})\n\t\t\t.join('')}\n\n\t\t<!-- ═══════════════════════════════════════════════════════════ -->\n\t\t<!-- SERVER SECTION (not shipped to browser) -->\n\t\t<!-- ═══════════════════════════════════════════════════════════ -->\n\n\t\t${\n\t\t\tactualServerBinarySize\n\t\t\t\t? `\n\t\t<div class=\"section collapsed\">\n\t\t\t<div class=\"section-header\" onclick=\"this.parentElement.classList.toggle('collapsed')\">\n\t\t\t\t<div>\n\t\t\t\t\t<div class=\"section-title server\">${icon('server', '#666')}final server binary</div>\n\t\t\t\t\t<div class=\"section-meta\">standalone executable · ${formatBytes(actualServerBinarySize)} · not shipped to browser</div>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"section-toggle\"></div>\n\t\t\t</div>\n\t\t\t<div class=\"section-content\">\n\t\t\t\t<div class=\"stats-grid\">\n\t\t\t\t\t<div class=\"stat\">\n\t\t\t\t\t\t<div class=\"stat-label\">binary size</div>\n\t\t\t\t\t\t<div class=\"stat-value server\">${formatBytes(actualServerBinarySize)}</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t${\n\t\t\t\t\t\tactualServerBinaryGzipped\n\t\t\t\t\t\t\t? `\n\t\t\t\t\t<div class=\"stat\">\n\t\t\t\t\t\t<div class=\"stat-label\">gzipped</div>\n\t\t\t\t\t\t<div class=\"stat-value server\">${formatBytes(actualServerBinaryGzipped)}</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"stat\">\n\t\t\t\t\t\t<div class=\"stat-label\">compression</div>\n\t\t\t\t\t\t<div class=\"stat-value server\">${((1 - actualServerBinaryGzipped / actualServerBinarySize) * 100).toFixed(1)}%</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t`\n\t\t\t\t\t\t\t: ''\n\t\t\t\t\t}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t\t`\n\t\t\t\t: ''\n\t\t}\n\t\t${\n\t\t\tdepTree\n\t\t\t\t? `\n\t\t<div class=\"section collapsed\">\n\t\t\t<div class=\"section-header\" onclick=\"this.parentElement.classList.toggle('collapsed')\">\n\t\t\t\t<div>\n\t\t\t\t\t<div class=\"section-title server\">${icon('search', '#666')}server dependencies</div>\n\t\t\t\t\t<div class=\"section-meta\">server-side only · not shipped to browser</div>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"section-toggle\"></div>\n\t\t\t</div>\n\t\t\t<div class=\"section-content\">\n\t\t\t\t<div id=\"server-deps-list\"></div>\n\t\t\t</div>\n\t\t</div>\n\n\t\t<div class=\"section collapsed\">\n\t\t\t<div class=\"section-header\" onclick=\"this.parentElement.classList.toggle('collapsed')\">\n\t\t\t\t<div>\n\t\t\t\t\t<div class=\"section-title server\">${icon('treemap', '#666')}server treemap</div>\n\t\t\t\t\t<div class=\"section-meta\">visual dependency breakdown</div>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"section-toggle\"></div>\n\t\t\t</div>\n\t\t\t<div class=\"section-content\">\n\t\t\t\t<div class=\"treemap-container\" id=\"server-treemap\"></div>\n\t\t\t</div>\n\t\t</div>\n\t\t`\n\t\t\t\t: ''\n\t\t}\n\n\t\t${bundles.length === 0 ? '<div class=\"empty\">no bundles found. run <code>reroute gen</code> or <code>reroute build</code> first.</div>' : ''}\n\t</div>\n\t<div class=\"treemap-tooltip\" id=\"tooltip\">\n\t\t<div class=\"tooltip-name\" id=\"tooltip-name\"></div>\n\t\t<div class=\"tooltip-path\" id=\"tooltip-path\"></div>\n\t\t<div class=\"tooltip-size\" id=\"tooltip-size\"></div>\n\t</div>\n\t${\n\t\tbrowserDepTree || depTree\n\t\t\t? `\n\t<script>\n\t\tconst browserDepTree = ${browserDepTree ? JSON.stringify(browserDepTree) : 'null'};\n\t\tconst serverDepTree = ${depTree ? JSON.stringify(depTree) : 'null'};\n\t\tconst formatBytes = ${formatBytes.toString()};\n\n\t\tfunction cleanPath(path) {\n\t\t\tif (!path) return '';\n\t\t\tconst nodeModulesIdx = path.indexOf('node_modules');\n\t\t\tif (nodeModulesIdx === -1) return path;\n\t\t\treturn path.substring(nodeModulesIdx);\n\t\t}\n\n\t\tfunction convertNode(node) {\n\t\t\treturn {\n\t\t\t\tname: node.name,\n\t\t\t\tpath: node.path,\n\t\t\t\tsize: node.size,\n\t\t\t\tchildren: node.children && node.children.length > 0 ? node.children.map(convertNode) : null\n\t\t\t};\n\t\t}\n\n\t\tfunction renderDepTreemap(tree, containerId) {\n\t\t\tconst container = d3.select(containerId);\n\t\t\tcontainer.selectAll(\"*\").remove();\n\t\t\tconst width = container.node()?.clientWidth || 1200;\n\n\t\t\tconst tooltip = d3.select(\"#tooltip\");\n\n\t\t\tconst root = d3.hierarchy(convertNode(tree.root))\n\t\t\t\t.sum(d => d.size || 0)\n\t\t\t\t.sort((a, b) => (b.value || 0) - (a.value || 0));\n\n\t\t\t// Calculate height based on data - use aspect ratio that works well for treemaps\n\t\t\t// More items = taller treemap, but cap at reasonable max\n\t\t\tconst leafCount = root.leaves().length;\n\t\t\tconst baseHeight = Math.max(400, Math.min(1200, width * 0.6));\n\t\t\tconst height = Math.min(baseHeight + (leafCount * 2), width * 1.2);\n\n\t\t\tconst svg = container.append(\"svg\")\n\t\t\t\t.attr(\"width\", width)\n\t\t\t\t.attr(\"height\", height);\n\n\t\t\tconst treemap = d3.treemap()\n\t\t\t\t.size([width, height])\n\t\t\t\t.padding(2)\n\t\t\t\t.round(true);\n\n\t\t\ttreemap(root);\n\n\t\t\tfunction hashString(str) {\n\t\t\t\tlet h = 0;\n\t\t\t\tfor (let i = 0; i < str.length; i++) {\n\t\t\t\t\th = ((h << 5) - h + str.charCodeAt(i)) | 0;\n\t\t\t\t}\n\t\t\t\treturn Math.abs(h);\n\t\t\t}\n\t\t\tfunction getPackageName(d) {\n\t\t\t\tconst p = d.data.path || '';\n\t\t\t\tif (!p.includes('node_modules')) return null;\n\t\t\t\tconst idx = p.lastIndexOf('node_modules/');\n\t\t\t\tif (idx === -1) return null;\n\t\t\t\tconst after = p.slice(idx + 'node_modules/'.length);\n\t\t\t\t// Handle @scope/package or package\n\t\t\t\tif (after.startsWith('@')) {\n\t\t\t\t\tconst parts = after.split('/');\n\t\t\t\t\treturn parts.length >= 2 ? parts[0] + '/' + parts[1] : after;\n\t\t\t\t}\n\t\t\t\treturn after.split('/')[0];\n\t\t\t}\n\n\t\t\t// Terminal-style colors\n\t\t\tconst colorCache = {};\n\t\t\tfunction colorFor(d) {\n\t\t\t\tconst p = d.data.path || '';\n\t\t\t\tif (p.includes('node_modules')) {\n\t\t\t\t\tconst pkg = getPackageName(d) || 'unknown';\n\n\t\t\t\t\tif (!colorCache[pkg]) {\n\t\t\t\t\t\tconst hash = hashString(pkg);\n\t\t\t\t\t\t// Shades of green for terminal aesthetic\n\t\t\t\t\t\tconst brightness = 40 + (hash % 40);\n\t\t\t\t\t\tcolorCache[pkg] = 'rgb(0, ' + brightness + ', 0)';\n\t\t\t\t\t}\n\n\t\t\t\t\treturn colorCache[pkg];\n\t\t\t\t}\n\t\t\t\t// Brighter green for local src files\n\t\t\t\tconst depth = Math.min(d.depth, 4);\n\t\t\t\tconst brightness = 80 + depth * 30;\n\t\t\t\treturn 'rgb(0, ' + Math.min(255, brightness) + ', 0)';\n\t\t\t}\n\n\t\t\tconst cell = svg.selectAll(\"g\")\n\t\t\t\t.data(root.leaves())\n\t\t\t\t.enter()\n\t\t\t\t.append(\"g\")\n\t\t\t\t.attr(\"transform\", d => \\`translate(\\${d.x0},\\${d.y0})\\`);\n\n\t\t\tcell.append(\"rect\")\n\t\t\t\t.attr(\"class\", \"treemap-cell\")\n\t\t\t\t.attr(\"width\", d => d.x1 - d.x0)\n\t\t\t\t.attr(\"height\", d => d.y1 - d.y0)\n\t\t\t\t.attr(\"fill\", colorFor)\n\t\t\t\t.on(\"mouseover\", function(event, d) {\n\t\t\t\t\td3.select(this).attr(\"stroke\", \"#0f0\").attr(\"stroke-width\", 2);\n\t\t\t\t\ttooltip.select(\"#tooltip-name\").text(d.data.name);\n\t\t\t\t\ttooltip.select(\"#tooltip-path\").text(cleanPath(d.data.path || ''));\n\t\t\t\t\ttooltip.select(\"#tooltip-size\").text(formatBytes(d.value));\n\t\t\t\t\ttooltip.classed(\"visible\", true);\n\t\t\t\t})\n\t\t\t\t.on(\"mousemove\", function(event) {\n\t\t\t\t\ttooltip.style(\"left\", (event.pageX + 10) + \"px\")\n\t\t\t\t\t .style(\"top\", (event.pageY - 10) + \"px\");\n\t\t\t\t})\n\t\t\t\t.on(\"mouseout\", function() {\n\t\t\t\t\td3.select(this).attr(\"stroke\", \"#111\").attr(\"stroke-width\", 1);\n\t\t\t\t\ttooltip.classed(\"visible\", false);\n\t\t\t\t});\n\n\t\t\t// Labels on cells - show first letter for small cells, truncated text for larger ones\n\t\t\tconst labels = cell.filter(d => {\n\t\t\t\tconst w = d.x1 - d.x0;\n\t\t\t\tconst h = d.y1 - d.y0;\n\t\t\t\t// Show label if cell is at least 10px wide and 10px tall (enough for first letter)\n\t\t\t\treturn w > 10 && h > 10;\n\t\t\t})\n\t\t\t\t.append(\"text\")\n\t\t\t\t.attr(\"class\", \"treemap-label\")\n\t\t\t\t.attr(\"x\", d => (d.x1 - d.x0) / 2)\n\t\t\t\t.attr(\"y\", d => (d.y1 - d.y0) / 2)\n\t\t\t\t.style(\"text-anchor\", \"middle\")\n\t\t\t\t.style(\"dominant-baseline\", \"middle\");\n\n\t\t\tlabels.each(function(d) {\n\t\t\t\tconst name = d.data.name;\n\t\t\t\tconst width = d.x1 - d.x0;\n\t\t\t\tconst height = d.y1 - d.y0;\n\t\t\t\tconst text = d3.select(this);\n\n\t\t\t\t// Estimate character width: ~6px per character for 10px monospace font\n\t\t\t\tconst charWidth = 6;\n\t\t\t\tconst maxChars = Math.floor((width - 8) / charWidth); // 8px padding\n\t\t\t\tconst minSize = Math.min(width, height);\n\n\t\t\t\tlet labelText = '';\n\t\t\t\tlet fontSize = 10;\n\n\t\t\t\tif (width < 20 || height < 14 || maxChars < 1) {\n\t\t\t\t\t// Very small cell - show first letter only, ensure it's readable\n\t\t\t\t\tlabelText = name.charAt(0).toUpperCase();\n\t\t\t\t\t// Scale font to fit but ensure minimum 8px for readability\n\t\t\t\t\tfontSize = Math.max(8, Math.min(12, minSize * 0.65));\n\t\t\t\t} else if (width < 30 || maxChars < 2) {\n\t\t\t\t\t// Small cell - show first letter (or 2 chars if fits)\n\t\t\t\t\tlabelText = name.substring(0, Math.min(1, name.length)).toUpperCase();\n\t\t\t\t\tfontSize = Math.max(8, Math.min(10, minSize * 0.5));\n\t\t\t\t} else if (width < 40 || maxChars < 3) {\n\t\t\t\t\t// Small-medium cell - show first 2-3 characters\n\t\t\t\t\tlabelText = name.substring(0, Math.min(2, name.length));\n\t\t\t\t\tfontSize = 9;\n\t\t\t\t} else if (maxChars >= name.length) {\n\t\t\t\t\t// Large enough - show full name\n\t\t\t\t\tlabelText = name;\n\t\t\t\t\tfontSize = 10;\n\t\t\t\t} else {\n\t\t\t\t\t// Medium cell - truncate based on available width\n\t\t\t\t\tconst truncateLength = Math.max(3, maxChars - 3); // Leave room for \"...\"\n\t\t\t\t\tlabelText = name.substring(0, truncateLength) + '...';\n\t\t\t\t\tfontSize = 10;\n\t\t\t\t}\n\n\t\t\t\ttext.style(\"font-size\", fontSize + \"px\")\n\t\t\t\t\t.text(labelText);\n\n\t\t\t\t// Show size for larger cells\n\t\t\t\tif (width > 90 && height > 32) {\n\t\t\t\t\ttext.append(\"tspan\")\n\t\t\t\t\t\t.attr(\"x\", width / 2)\n\t\t\t\t\t\t.attr(\"dy\", \"14\")\n\t\t\t\t\t\t.text(formatBytes(d.value));\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tlet currentSearchTerm = '';\n\n\t\tfunction updateSearchStats(visibleCount, totalCount) {\n\t\t\tconst stats = document.getElementById('search-stats');\n\t\t\tif (stats) {\n\t\t\t\tif (currentSearchTerm) {\n\t\t\t\t\tstats.textContent = 'Showing ' + visibleCount + ' of ' + totalCount + ' items matching \"' + currentSearchTerm + '\"';\n\t\t\t\t} else {\n\t\t\t\t\tstats.textContent = '';\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfunction filterTreemap(searchTerm) {\n\t\t\tcurrentSearchTerm = searchTerm.toLowerCase();\n\t\t\tif (!searchTerm) {\n\t\t\t\tif (browserDepTree) renderDepTreemap(browserDepTree, \"#browser-treemap\");\n\t\t\t\tif (serverDepTree) renderDepTreemap(serverDepTree, \"#server-treemap\");\n\t\t\t\tupdateSearchStats(0, 0);\n\n\t\t\t\t// Show all elements\n\t\t\t\tdocument.querySelectorAll('.section').forEach(el => el.classList.remove('hidden'));\n\t\t\t\tdocument.querySelectorAll('tbody tr').forEach(el => el.classList.remove('hidden'));\n\t\t\t\tdocument.querySelectorAll('.dep-item').forEach(el => el.classList.remove('hidden'));\n\t\t\t\tdocument.querySelectorAll('.stat').forEach(el => el.classList.remove('hidden'));\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlet totalMatches = 0;\n\t\t\tlet totalItems = 0;\n\n\t\t// Filter treemap data\n\t\tfunction filterNode(node) {\n\t\t\t// Only match against the package/file name, not the full path\n\t\t\t// to avoid matching build directories like .reroute/\n\t\t\tconst matches = node.name.toLowerCase().includes(searchTerm);\n\n\t\t\tif (!node.children || node.children.length === 0) {\n\t\t\t\treturn matches ? { ...node } : null;\n\t\t\t}\n\n\t\t\tconst filteredChildren = node.children\n\t\t\t\t.map(child => filterNode(child))\n\t\t\t\t.filter(child => child !== null);\n\n\t\t\tif (filteredChildren.length > 0 || matches) {\n\t\t\t\treturn {\n\t\t\t\t\t...node,\n\t\t\t\t\tchildren: filteredChildren.length > 0 ? filteredChildren : undefined\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn null;\n\t\t}\n\n\t\t\tfunction countLeaves(node) {\n\t\t\t\tif (!node.children || node.children.length === 0) return 1;\n\t\t\t\treturn node.children.reduce((sum, child) => sum + countLeaves(child), 0);\n\t\t\t}\n\n\t\t\t// Filter browser treemap\n\t\t\tif (browserDepTree) {\n\t\t\t\tconst filtered = filterNode(browserDepTree.root);\n\t\t\t\tif (filtered) {\n\t\t\t\t\tconst totalLeaves = countLeaves(browserDepTree.root);\n\t\t\t\t\tconst visibleLeaves = countLeaves(filtered);\n\t\t\t\t\ttotalItems += totalLeaves;\n\t\t\t\t\ttotalMatches += visibleLeaves;\n\t\t\t\t\trenderDepTreemap({ ...browserDepTree, root: filtered }, \"#browser-treemap\");\n\t\t\t\t} else {\n\t\t\t\t\tconst elem = document.getElementById('browser-treemap');\n\t\t\t\t\tif (elem) elem.innerHTML = '<div class=\"empty\">No matches found</div>';\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Filter server treemap\n\t\t\tif (serverDepTree) {\n\t\t\t\tconst filtered = filterNode(serverDepTree.root);\n\t\t\t\tif (filtered) {\n\t\t\t\t\trenderDepTreemap({ ...serverDepTree, root: filtered }, \"#server-treemap\");\n\t\t\t\t} else {\n\t\t\t\t\tconst elem = document.getElementById('server-treemap');\n\t\t\t\t\tif (elem) elem.innerHTML = '<div class=\"empty\">No matches found</div>';\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Render matching items that aren't loaded yet\n\t\t\tif (searchTerm) {\n\t\t\t\trenderMatchingDeps('browser-deps-list', searchTerm);\n\t\t\t\trenderMatchingDeps('server-deps-list', searchTerm);\n\t\t\t}\n\n\t\t\t// Filter dependency lists\n\t\t\tdocument.querySelectorAll('.dep-item').forEach(item => {\n\t\t\t\tconst packageName = item.getAttribute('data-package-name') || '';\n\t\t\t\tif (packageName.includes(searchTerm)) {\n\t\t\t\t\titem.classList.remove('hidden');\n\t\t\t\t\ttotalMatches++;\n\t\t\t\t} else {\n\t\t\t\t\titem.classList.add('hidden');\n\t\t\t\t}\n\t\t\t\ttotalItems++;\n\t\t\t});\n\n\t\t\t// Filter bundle/chunk tables\n\t\t\tdocument.querySelectorAll('tbody tr').forEach(row => {\n\t\t\t\tconst text = row.textContent.toLowerCase();\n\t\t\t\tif (text.includes(searchTerm)) {\n\t\t\t\t\trow.classList.remove('hidden');\n\t\t\t\t\ttotalMatches++;\n\t\t\t\t} else {\n\t\t\t\t\trow.classList.add('hidden');\n\t\t\t\t}\n\t\t\t\ttotalItems++;\n\t\t\t});\n\n\t\t\t// Filter section headers and content\n\t\t\tdocument.querySelectorAll('.section').forEach(section => {\n\t\t\t\t// Check if section has visible content\n\t\t\t\tconst tbody = section.querySelector('tbody');\n\t\t\t\tconst depList = section.querySelector('.dep-list');\n\t\t\t\tconst treemapContainer = section.querySelector('.treemap-container');\n\t\t\t\tconst stats = section.querySelectorAll('.stat');\n\t\t\t\tconst sectionTitle = section.querySelector('.section-title');\n\n\t\t\t\tlet hasVisibleContent = false;\n\n\t\t\t\tif (tbody) {\n\t\t\t\t\tconst visibleRows = tbody.querySelectorAll('tr:not(.hidden)');\n\t\t\t\t\thasVisibleContent = visibleRows.length > 0;\n\t\t\t\t} else if (depList) {\n\t\t\t\t\tconst visibleItems = depList.querySelectorAll('.dep-item:not(.hidden)');\n\t\t\t\t\thasVisibleContent = visibleItems.length > 0;\n\t\t\t\t} else if (treemapContainer) {\n\t\t\t\t\thasVisibleContent = !treemapContainer.querySelector('.empty');\n\t\t\t\t} else if (stats.length > 0) {\n\t\t\t\t\t// Stat sections: show if any stat matches\n\t\t\t\t\tconst statMatches = Array.from(stats).some(stat =>\n\t\t\t\t\t\tstat.textContent.toLowerCase().includes(searchTerm)\n\t\t\t\t\t);\n\t\t\t\t\thasVisibleContent = statMatches;\n\t\t\t\t} else if (sectionTitle && sectionTitle.textContent.toLowerCase().includes(searchTerm)) {\n\t\t\t\t\t// Section title matches\n\t\t\t\t\thasVisibleContent = true;\n\t\t\t\t}\n\n\t\t\t\tif (hasVisibleContent) {\n\t\t\t\t\tsection.classList.remove('hidden');\n\t\t\t\t} else {\n\t\t\t\t\tsection.classList.add('hidden');\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tupdateSearchStats(totalMatches, totalItems);\n\t\t}\n\n\t\t// Setup search\n\t\tconst searchInput = document.getElementById('search-input');\n\t\tconst searchClear = document.getElementById('search-clear');\n\n\t\tfunction updateClearButton() {\n\t\t\tif (searchClear && searchInput) {\n\t\t\t\tif (searchInput.value.trim().length > 0) {\n\t\t\t\t\tsearchClear.classList.add('visible');\n\t\t\t\t} else {\n\t\t\t\t\tsearchClear.classList.remove('visible');\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (searchInput) {\n\t\t\tsearchInput.addEventListener('input', (e) => {\n\t\t\t\tfilterTreemap(e.target.value);\n\t\t\t\tupdateClearButton();\n\t\t\t});\n\t\t\t// Check initial state\n\t\t\tupdateClearButton();\n\t\t}\n\n\t\tif (searchClear) {\n\t\t\tsearchClear.addEventListener('click', () => {\n\t\t\t\tif (searchInput) {\n\t\t\t\t\tsearchInput.value = '';\n\t\t\t\t\tsearchInput.focus();\n\t\t\t\t\tfilterTreemap('');\n\t\t\t\t\tupdateClearButton();\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\t// Expand/collapse all handlers\n\t\tconst expandAllBtn = document.getElementById('expand-all');\n\t\tconst collapseAllBtn = document.getElementById('collapse-all');\n\n\t\tif (expandAllBtn) {\n\t\t\texpandAllBtn.addEventListener('click', () => {\n\t\t\t\tdocument.querySelectorAll('.section.collapsed').forEach(section => {\n\t\t\t\t\tsection.classList.remove('collapsed');\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\n\t\tif (collapseAllBtn) {\n\t\t\tcollapseAllBtn.addEventListener('click', () => {\n\t\t\t\tdocument.querySelectorAll('.section:not(.collapsed)').forEach(section => {\n\t\t\t\t\t// Don't collapse the Summary section\n\t\t\t\t\tconst title = section.querySelector('.section-title');\n\t\t\t\t\tif (title && !title.textContent.includes('Summary')) {\n\t\t\t\t\t\tsection.classList.add('collapsed');\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\n\t\t// Store full packages data for search\n\t\tconst depListData = new Map();\n\n\t\t// Helper to create a dep item element\n\t\tfunction createDepItem(pkg, isServer, totalSize, bundleInfo) {\n\t\t\tconst li = document.createElement('li');\n\t\t\tli.className = 'dep-item';\n\t\t\tli.setAttribute('data-package-name', pkg.name.toLowerCase());\n\n\t\t\tconst nameSpan = document.createElement('span');\n\t\t\tnameSpan.className = isServer ? 'dep-name server' : 'dep-name';\n\t\t\tnameSpan.textContent = pkg.name;\n\n\t\t\tconst sizeSpan = document.createElement('span');\n\t\t\tsizeSpan.className = 'dep-size';\n\n\t\t\t// Estimate gzipped size using compression ratio\n\t\t\tlet sizeText = formatBytes(pkg.size);\n\t\t\tif (bundleInfo && bundleInfo.size > 0) {\n\t\t\t\tconst compressionRatio = bundleInfo.gzippedSize / bundleInfo.size;\n\t\t\t\tconst estimatedGz = Math.round(pkg.size * compressionRatio);\n\t\t\t\tsizeText += ' (' + formatBytes(estimatedGz) + ' gz)';\n\t\t\t}\n\t\t\tsizeText += ' · ' + ((pkg.size / totalSize) * 100).toFixed(1) + '%';\n\t\t\tsizeSpan.textContent = sizeText;\n\n\t\t\tli.appendChild(nameSpan);\n\t\t\tli.appendChild(sizeSpan);\n\t\t\treturn li;\n\t\t}\n\n\t\t// Populate dependency lists\n\t\tfunction populateDepList(tree, containerId, isServer, bundleInfo) {\n\t\t\tconst container = document.getElementById(containerId);\n\t\t\tif (!container || !tree) return;\n\n\t\t\tconst nodeModules = tree.root.children?.find(c => c.name === 'node_modules');\n\t\t\tif (!nodeModules || !nodeModules.children) return;\n\n\t\t\tconst packages = nodeModules.children\n\t\t\t\t.filter(pkg => pkg.size > 0)\n\t\t\t\t.sort((a, b) => b.size - a.size);\n\n\t\t\t// Store full packages data for this container\n\t\t\tdepListData.set(containerId, {\n\t\t\t\tpackages: packages,\n\t\t\t\tisServer: isServer,\n\t\t\t\ttotalSize: tree.totalSize,\n\t\t\t\tbundleInfo: bundleInfo,\n\t\t\t\tloadedCount: 0\n\t\t\t});\n\n\t\t\tconst ul = document.createElement('ul');\n\t\t\tul.className = 'dep-list';\n\n\t\t\tconst initialCount = 10;\n\t\t\tfor (let i = 0; i < Math.min(initialCount, packages.length); i++) {\n\t\t\t\tconst li = createDepItem(packages[i], isServer, tree.totalSize, bundleInfo);\n\t\t\t\tul.appendChild(li);\n\t\t\t}\n\n\t\t\tdepListData.get(containerId).loadedCount = Math.min(initialCount, packages.length);\n\n\t\t\tcontainer.appendChild(ul);\n\n\t\t\tif (packages.length > initialCount) {\n\t\t\t\tconst btn = document.createElement('button');\n\t\t\t\tbtn.className = 'load-more';\n\t\t\t\tbtn.textContent = 'load ' + (packages.length - initialCount) + ' more...';\n\t\t\t\tbtn.onclick = function() {\n\t\t\t\t\tconst data = depListData.get(containerId);\n\t\t\t\t\tconst existingItems = new Set();\n\t\t\t\t\tul.querySelectorAll('.dep-item').forEach(item => {\n\t\t\t\t\t\texistingItems.add(item.getAttribute('data-package-name'));\n\t\t\t\t\t});\n\n\t\t\t\t\tlet loaded = 0;\n\t\t\t\t\tfor (let i = 0; i < packages.length; i++) {\n\t\t\t\t\t\tconst pkg = packages[i];\n\t\t\t\t\t\tconst nameLower = pkg.name.toLowerCase();\n\t\t\t\t\t\tif (!existingItems.has(nameLower)) {\n\t\t\t\t\t\t\tconst li = createDepItem(pkg, isServer, tree.totalSize, bundleInfo);\n\t\t\t\t\t\t\tul.appendChild(li);\n\t\t\t\t\t\t\tloaded++;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tdata.loadedCount = packages.length;\n\t\t\t\t\tbtn.remove();\n\t\t\t\t};\n\t\t\t\tcontainer.appendChild(btn);\n\t\t\t}\n\t\t}\n\n\t\t// Render matching items that aren't loaded yet\n\t\tfunction renderMatchingDeps(containerId, searchTerm) {\n\t\t\tconst data = depListData.get(containerId);\n\t\t\tif (!data || !searchTerm) return;\n\n\t\t\tconst container = document.getElementById(containerId);\n\t\t\tif (!container) return;\n\n\t\t\tconst ul = container.querySelector('.dep-list');\n\t\t\tif (!ul) return;\n\n\t\t\tconst searchLower = searchTerm.toLowerCase();\n\t\t\tconst existingItems = new Set();\n\t\t\tul.querySelectorAll('.dep-item').forEach(item => {\n\t\t\t\texistingItems.add(item.getAttribute('data-package-name'));\n\t\t\t});\n\n\t\t\t// Find matching packages that aren't rendered yet\n\t\t\tconst matchingPackages = data.packages.filter((pkg) => {\n\t\t\t\tconst nameLower = pkg.name.toLowerCase();\n\t\t\t\tconst matches = nameLower.includes(searchLower);\n\t\t\t\tconst notRendered = !existingItems.has(nameLower);\n\t\t\t\treturn matches && notRendered;\n\t\t\t});\n\n\t\t\t// Render matching items\n\t\t\tmatchingPackages.forEach(pkg => {\n\t\t\t\tconst li = createDepItem(pkg, data.isServer, data.totalSize, data.bundleInfo);\n\t\t\t\tul.appendChild(li);\n\t\t\t});\n\t\t}\n\n\t\t// Initial render\n\t\tconst browserInfo = ${JSON.stringify(browserInfo)};\n\t\tconst serverInfo = ${JSON.stringify(mainInfo)};\n\n\t\tif (browserDepTree) {\n\t\t\tpopulateDepList(browserDepTree, 'browser-deps-list', false, browserInfo);\n\t\t\trenderDepTreemap(browserDepTree, \"#browser-treemap\");\n\t\t}\n\t\tif (serverDepTree) {\n\t\t\tpopulateDepList(serverDepTree, 'server-deps-list', true, serverInfo);\n\t\t\trenderDepTreemap(serverDepTree, \"#server-treemap\");\n\t\t}\n\n\t\twindow.addEventListener(\"resize\", () => {\n\t\t\tif (currentSearchTerm) {\n\t\t\t\tfilterTreemap(currentSearchTerm);\n\t\t\t} else {\n\t\t\t\tif (browserDepTree) renderDepTreemap(browserDepTree, \"#browser-treemap\");\n\t\t\t\tif (serverDepTree) renderDepTreemap(serverDepTree, \"#server-treemap\");\n\t\t\t}\n\t\t});\n\n\t\t// Apply initial search if provided\n\t\tconst initialSearchTerm = ${JSON.stringify(initialSearch || '')};\n\t\tif (initialSearchTerm && searchInput) {\n\t\t\tsearchInput.value = initialSearchTerm;\n\t\t\tfilterTreemap(initialSearchTerm);\n\t\t\tupdateClearButton();\n\t\t}\n\t</script>\n\t`\n\t\t\t: ''\n\t}\n\n\t\t<div class=\"footer\">\n\t\t\t<div class=\"search-stats\" id=\"search-stats\"></div>\n\t\t\t<div class=\"note\">\n\t\t\t\t<strong>Browser</strong> bundles are shipped to users. <strong>Server</strong> binaries run on your server only.\n\t\t\t</div>\n\t\t\t${\n\t\t\t\tmainInfo\n\t\t\t\t\t? `\n\t\t\t<div class=\"note\" style=\"margin-top: 0.5rem;\">\n\t\t\t\t<strong>Final Server Binary</strong> is a standalone executable that includes the Bun runtime, your application code, and all dependencies. This allows it to run without requiring Node.js or Bun to be installed on the deployment server.\n\t\t\t</div>\n\t\t\t`\n\t\t\t\t\t: ''\n\t\t\t}\n\t\t</div>\n\t</div>\n</body>\n</html>`;\n\n\treturn html;\n}\n\nasync function printConsoleReport(\n\tstats: BundleStats,\n\tdepTree?: DepTree | null,\n\tmainInfo?: { name: string; size: number; gzippedSize: number } | null,\n\tbrowserDepTree?: DepTree | null,\n\tbrowserInfo?: { name: string; size: number; gzippedSize: number } | null,\n\tfullOutput = false,\n): Promise<void> {\n\tconsole.log(\n\t\tcolorizeLogPrefixAnsi('[reroute/analyze] Bundle Analysis Report\\n'),\n\t);\n\n\t// Print helpful note about server vs browser bundles\n\tif (mainInfo || browserInfo) {\n\t\tconsole.log(\n\t\t\t'\\x1b[90mNote: Browser bundles are shipped to users. Server binaries run on your server only.\\x1b[0m\\n',\n\t\t);\n\t}\n\n\t// ${String.fromCharCode(0x2501).repeat(1)}\n\t// BROWSER SECTION (what users download)\n\t// ${String.fromCharCode(0x2501).repeat(1)}\n\n\tif (browserInfo) {\n\t\tconsole.log(\n\t\t\t`\\x1b[1m\\x1b[36m${String.fromCharCode(0x2501).repeat(1)}\\x1b[0m`,\n\t\t);\n\t\tconsole.log(\n\t\t\t`\\x1b[1m\\x1b[36mBrowser Bundle: ${browserInfo.name}\\x1b[0m \\x1b[32m(shipped to browser)\\x1b[0m`,\n\t\t);\n\t\tconsole.log(\n\t\t\t`\\x1b[1m\\x1b[36m${String.fromCharCode(0x2501).repeat(1)}\\x1b[0m\\n`,\n\t\t);\n\n\t\tconst browserTable = new Table({\n\t\t\thead: ['Metric', 'Value'],\n\t\t\tcolWidths: [25, 35],\n\t\t\tstyle: {\n\t\t\t\thead: ['cyan', 'bold'],\n\t\t\t\tborder: ['gray'],\n\t\t\t},\n\t\t\tchars: ASCII_TABLE_CHARS,\n\t\t});\n\n\t\tbrowserTable.push(\n\t\t\t['Raw Size', formatBytes(browserInfo.size)],\n\t\t\t['Gzipped', formatBytes(browserInfo.gzippedSize)],\n\t\t\t[\n\t\t\t\t'Compression Ratio',\n\t\t\t\t`${((1 - browserInfo.gzippedSize / browserInfo.size) * 100).toFixed(1)}%`,\n\t\t\t],\n\t\t);\n\n\t\tconsole.log(browserTable.toString());\n\t\tconsole.log('');\n\n\t\t// Estimate transfer time for browser bundle\n\t\tconst gzipKB = browserInfo.gzippedSize / 1024;\n\t\tconst time3G = gzipKB / (1.6 * 128); // 1.6 Mbps = ~200 KB/s\n\t\tconst time4G = gzipKB / (9 * 128); // 9 Mbps = ~1125 KB/s\n\t\tconst time5G = gzipKB / (50 * 128); // 50 Mbps = ~6250 KB/s\n\t\tconst timeWiFi = gzipKB / (100 * 128); // 100 Mbps = ~12500 KB/s\n\n\t\tconst transferTable = new Table({\n\t\t\thead: ['Network', 'Throughput', 'Transfer Time'],\n\t\t\tcolWidths: [15, 15, 20],\n\t\t\tstyle: {\n\t\t\t\thead: ['cyan', 'bold'],\n\t\t\t\tborder: ['gray'],\n\t\t\t},\n\t\t\tchars: ASCII_TABLE_CHARS,\n\t\t});\n\n\t\ttransferTable.push(\n\t\t\t[\n\t\t\t\t'3G Fast',\n\t\t\t\t'1.6 Mbps',\n\t\t\t\ttime3G >= 1\n\t\t\t\t\t? `~${time3G.toFixed(2)}s`\n\t\t\t\t\t: `~${(time3G * 1000).toFixed(0)}ms`,\n\t\t\t],\n\t\t\t[\n\t\t\t\t'4G',\n\t\t\t\t'9 Mbps',\n\t\t\t\ttime4G >= 1\n\t\t\t\t\t? `~${time4G.toFixed(2)}s`\n\t\t\t\t\t: `~${(time4G * 1000).toFixed(0)}ms`,\n\t\t\t],\n\t\t\t[\n\t\t\t\t'5G',\n\t\t\t\t'50 Mbps',\n\t\t\t\ttime5G >= 1\n\t\t\t\t\t? `~${time5G.toFixed(2)}s`\n\t\t\t\t\t: `~${(time5G * 1000).toFixed(0)}ms`,\n\t\t\t],\n\t\t\t[\n\t\t\t\t'Wi-Fi 100',\n\t\t\t\t'100 Mbps',\n\t\t\t\ttimeWiFi >= 1\n\t\t\t\t\t? `~${timeWiFi.toFixed(2)}s`\n\t\t\t\t\t: `~${(timeWiFi * 1000).toFixed(0)}ms`,\n\t\t\t],\n\t\t);\n\n\t\tconsole.log(transferTable.toString());\n\t\tconsole.log(\n\t\t\t'\\x1b[90m Note: Estimates use gzipped size, ignore latency/HTTP overhead\\x1b[0m\\n',\n\t\t);\n\t}\n\n\t// Print browser dependency breakdown if available\n\n\tif (browserDepTree) {\n\t\tconst nodeModules = browserDepTree.root.children?.find(\n\t\t\t(c) => c.name === 'node_modules',\n\t\t);\n\t\tconst src = browserDepTree.root.children?.find((c) => c.name === 'src');\n\n\t\tif (nodeModules || src) {\n\t\t\tconsole.log(\n\t\t\t\t`\\x1b[1m\\x1b[36m${String.fromCharCode(0x2501).repeat(1)}\\x1b[0m`,\n\t\t\t);\n\t\t\tconsole.log(\n\t\t\t\t'\\x1b[1m\\x1b[36mBrowser Dependency Breakdown\\x1b[0m \\x1b[32m(shipped to browser)\\x1b[0m',\n\t\t\t);\n\t\t\tconsole.log(\n\t\t\t\t`\\x1b[1m\\x1b[36m${String.fromCharCode(0x2501).repeat(1)}\\x1b[0m\\n`,\n\t\t\t);\n\n\t\t\tif (nodeModules && nodeModules.size > 0) {\n\t\t\t\tconst nmPercent = (\n\t\t\t\t\t(nodeModules.size / browserDepTree.totalSize) *\n\t\t\t\t\t100\n\t\t\t\t).toFixed(1);\n\t\t\t\tconsole.log(\n\t\t\t\t\t`\\x1b[1mnode_modules: ${formatBytes(nodeModules.size)} (${nmPercent}%)\\x1b[0m\\n`,\n\t\t\t\t);\n\n\t\t\t\t// Show all packages by size\n\t\t\t\tconst packages = (nodeModules.children || [])\n\t\t\t\t\t.filter((pkg) => pkg.size > 0)\n\t\t\t\t\t.sort((a, b) => b.size - a.size);\n\n\t\t\t\tif (packages.length > 0) {\n\t\t\t\t\tconst pkgTable = new Table({\n\t\t\t\t\t\thead: ['Package / File', 'Raw Size', 'Gzipped', '% of Total'],\n\t\t\t\t\t\tcolWidths: [40, 15, 15, 12],\n\t\t\t\t\t\tstyle: {\n\t\t\t\t\t\t\thead: ['green', 'bold'],\n\t\t\t\t\t\t\tborder: ['gray'],\n\t\t\t\t\t\t},\n\t\t\t\t\t\tchars: ASCII_TABLE_CHARS,\n\t\t\t\t\t});\n\n\t\t\t\t\t// Show packages (all if --full, otherwise top packages with meaningful size)\n\t\t\t\t\tconst packagesToShow = fullOutput\n\t\t\t\t\t\t? packages\n\t\t\t\t\t\t: packages.filter(\n\t\t\t\t\t\t\t\t(pkg) => pkg.size / browserDepTree.totalSize >= 0.01,\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\tfor (const pkg of packagesToShow) {\n\t\t\t\t\t\tconst percentage = (\n\t\t\t\t\t\t\t(pkg.size / browserDepTree.totalSize) *\n\t\t\t\t\t\t\t100\n\t\t\t\t\t\t).toFixed(1);\n\t\t\t\t\t\t// Add package row with bold name and gzipped estimate\n\t\t\t\t\t\tconst pkgEstimatedGz = Math.round(\n\t\t\t\t\t\t\t(pkg.size * (browserInfo?.gzippedSize || 0)) /\n\t\t\t\t\t\t\t\t(browserInfo?.size || 1),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tpkgTable.push([\n\t\t\t\t\t\t\t`\\x1b[1m${pkg.name}\\x1b[0m`,\n\t\t\t\t\t\t\tformatBytes(pkg.size),\n\t\t\t\t\t\t\tformatBytes(pkgEstimatedGz),\n\t\t\t\t\t\t\t`${percentage}%`,\n\t\t\t\t\t\t]);\n\n\t\t\t\t\t\t// Add file rows (indented)\n\t\t\t\t\t\tconst files = (pkg.children || [])\n\t\t\t\t\t\t\t.filter((f) => f.size > 0)\n\t\t\t\t\t\t\t.sort((a, b) => b.size - a.size);\n\n\t\t\t\t\t\t// Show files (all if --full, otherwise top 10)\n\t\t\t\t\t\tconst filesToShow = fullOutput ? files : files.slice(0, 10);\n\t\t\t\t\t\tfor (const file of filesToShow) {\n\t\t\t\t\t\t\tconst filePercent = (\n\t\t\t\t\t\t\t\t(file.size / browserDepTree.totalSize) *\n\t\t\t\t\t\t\t\t100\n\t\t\t\t\t\t\t).toFixed(1);\n\t\t\t\t\t\t\t// Estimate gzipped size using overall compression ratio\n\t\t\t\t\t\t\tconst estimatedGz = Math.round(\n\t\t\t\t\t\t\t\t(file.size * (browserInfo?.gzippedSize || 0)) /\n\t\t\t\t\t\t\t\t\t(browserInfo?.size || 1),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tpkgTable.push([\n\t\t\t\t\t\t\t\t` ${String.fromCharCode(0x21b3)} ${file.name}`,\n\t\t\t\t\t\t\t\tformatBytes(file.size),\n\t\t\t\t\t\t\t\tformatBytes(estimatedGz),\n\t\t\t\t\t\t\t\t`${filePercent}%`,\n\t\t\t\t\t\t\t]);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (!fullOutput && files.length > 10) {\n\t\t\t\t\t\t\tpkgTable.push([\n\t\t\t\t\t\t\t\t` ... ${files.length - 10} more files`,\n\t\t\t\t\t\t\t\t'',\n\t\t\t\t\t\t\t\t'',\n\t\t\t\t\t\t\t\t'',\n\t\t\t\t\t\t\t]);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tconsole.log(pkgTable.toString());\n\t\t\t\t\tconsole.log('');\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (src && src.size > 0) {\n\t\t\t\tconst srcPercent = (\n\t\t\t\t\t(src.size / browserDepTree.totalSize) *\n\t\t\t\t\t100\n\t\t\t\t).toFixed(1);\n\t\t\t\tconsole.log(\n\t\t\t\t\t`\\x1b[1msrc: ${formatBytes(src.size)} (${srcPercent}%)\\x1b[0m\\n`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\t// Print browser chunks summary\n\tconst browserChunks = Object.entries(stats.byCollection).filter(\n\t\t([collection]) => collection !== 'binaries',\n\t);\n\tif (browserChunks.length > 0) {\n\t\tfor (const [collection, bundles] of browserChunks) {\n\t\t\tconst collectionTotal = bundles.reduce((sum, b) => sum + b.size, 0);\n\t\t\tconst collectionGzipped = bundles.reduce(\n\t\t\t\t(sum, b) => sum + b.gzippedSize,\n\t\t\t\t0,\n\t\t\t);\n\n\t\t\tconsole.log(\n\t\t\t\t`\\x1b[1mBrowser Chunks: ${collection}\\x1b[0m \\x1b[32m(shipped to browser)\\x1b[0m`,\n\t\t\t);\n\t\t\tconsole.log(\n\t\t\t\t` Total: ${formatBytes(collectionTotal)} (${formatBytes(collectionGzipped)} gzipped)\\n`,\n\t\t\t);\n\n\t\t\t// Sort by size descending\n\t\t\tconst sorted = bundles.sort((a, b) => b.size - a.size);\n\n\t\t\tconst bundleTable = new Table({\n\t\t\t\thead: ['Bundle', 'Size', 'Gzipped', '% of Total'],\n\t\t\t\tcolWidths: [40, 12, 12, 12],\n\t\t\t\tstyle: {\n\t\t\t\t\thead: ['green', 'bold'],\n\t\t\t\t\tborder: ['gray'],\n\t\t\t\t},\n\t\t\t\tchars: ASCII_TABLE_CHARS,\n\t\t\t});\n\n\t\t\tfor (const bundle of sorted) {\n\t\t\t\tconst percentage = ((bundle.size / stats.totalSize) * 100).toFixed(1);\n\t\t\t\tbundleTable.push([\n\t\t\t\t\tbundle.name,\n\t\t\t\t\tformatBytes(bundle.size),\n\t\t\t\t\tformatBytes(bundle.gzippedSize),\n\t\t\t\t\t`${percentage}%`,\n\t\t\t\t]);\n\t\t\t}\n\n\t\t\tconsole.log(bundleTable.toString());\n\t\t\tconsole.log('');\n\t\t}\n\t}\n\n\t// ${String.fromCharCode(0x2501).repeat(1)}\n\t// SERVER SECTION (not shipped to browser)\n\t// ${String.fromCharCode(0x2501).repeat(1)}\n\n\t// Print main bundle info if available\n\tif (mainInfo) {\n\t\tconsole.log(\n\t\t\t`\\x1b[1m\\x1b[36m${String.fromCharCode(0x2501).repeat(1)}\\x1b[0m`,\n\t\t);\n\t\tconsole.log(\n\t\t\t`\\x1b[1m\\x1b[36mServer Binary: ${mainInfo.name}\\x1b[0m \\x1b[90m(not shipped to browser)\\x1b[0m`,\n\t\t);\n\t\tconsole.log(\n\t\t\t`\\x1b[1m\\x1b[36m${String.fromCharCode(0x2501).repeat(1)}\\x1b[0m\\n`,\n\t\t);\n\n\t\tconst mainTable = new Table({\n\t\t\thead: ['Metric', 'Value'],\n\t\t\tcolWidths: [25, 35],\n\t\t\tstyle: {\n\t\t\t\thead: ['cyan', 'bold'],\n\t\t\t\tborder: ['gray'],\n\t\t\t},\n\t\t\tchars: ASCII_TABLE_CHARS,\n\t\t});\n\n\t\tmainTable.push(['Binary Size', formatBytes(mainInfo.size)]);\n\n\t\tconsole.log(mainTable.toString());\n\t\tconsole.log('');\n\t}\n\n\t// Print detailed dependency breakdown if available\n\tif (depTree) {\n\t\tconst nodeModules = depTree.root.children?.find(\n\t\t\t(c) => c.name === 'node_modules',\n\t\t);\n\t\tconst src = depTree.root.children?.find((c) => c.name === 'src');\n\n\t\tif (nodeModules || src) {\n\t\t\tconsole.log(\n\t\t\t\t`\\x1b[1m\\x1b[36m${String.fromCharCode(0x2501).repeat(1)}\\x1b[0m`,\n\t\t\t);\n\t\t\tconsole.log(\n\t\t\t\t'\\x1b[1m\\x1b[36mServer Dependency Breakdown\\x1b[0m \\x1b[90m(server-side only)\\x1b[0m',\n\t\t\t);\n\t\t\tconsole.log(\n\t\t\t\t`\\x1b[1m\\x1b[36m${String.fromCharCode(0x2501).repeat(1)}\\x1b[0m\\n`,\n\t\t\t);\n\n\t\t\tif (nodeModules && nodeModules.size > 0) {\n\t\t\t\tconst nmPercent = (\n\t\t\t\t\t(nodeModules.size / depTree.totalSize) *\n\t\t\t\t\t100\n\t\t\t\t).toFixed(1);\n\t\t\t\tconsole.log(\n\t\t\t\t\t`\\x1b[1mnode_modules: ${formatBytes(nodeModules.size)} (${nmPercent}%)\\x1b[0m\\n`,\n\t\t\t\t);\n\n\t\t\t\t// Show all packages by size\n\t\t\t\tconst packages = (nodeModules.children || [])\n\t\t\t\t\t.filter((pkg) => pkg.size > 0)\n\t\t\t\t\t.sort((a, b) => b.size - a.size);\n\n\t\t\t\tif (packages.length > 0) {\n\t\t\t\t\tconst pkgTable = new Table({\n\t\t\t\t\t\thead: ['Package / File', 'Size', '% of Total'],\n\t\t\t\t\t\tcolWidths: [50, 20, 12],\n\t\t\t\t\t\tstyle: {\n\t\t\t\t\t\t\thead: ['red', 'bold'],\n\t\t\t\t\t\t\tborder: ['gray'],\n\t\t\t\t\t\t},\n\t\t\t\t\t\tchars: ASCII_TABLE_CHARS,\n\t\t\t\t\t});\n\n\t\t\t\t\t// Show packages (all if --full, otherwise top packages with meaningful size)\n\t\t\t\t\tconst packagesToShow = fullOutput\n\t\t\t\t\t\t? packages\n\t\t\t\t\t\t: packages.filter((pkg) => pkg.size / depTree.totalSize >= 0.01);\n\n\t\t\t\t\tfor (const pkg of packagesToShow) {\n\t\t\t\t\t\tconst percentage = ((pkg.size / depTree.totalSize) * 100).toFixed(\n\t\t\t\t\t\t\t1,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tpkgTable.push([\n\t\t\t\t\t\t\t`\\x1b[1m${pkg.name}\\x1b[0m`,\n\t\t\t\t\t\t\tformatBytes(pkg.size),\n\t\t\t\t\t\t\t`${percentage}%`,\n\t\t\t\t\t\t]);\n\n\t\t\t\t\t\t// Add file rows (indented)\n\t\t\t\t\t\tconst files = (pkg.children || [])\n\t\t\t\t\t\t\t.filter((f) => f.size > 0)\n\t\t\t\t\t\t\t.sort((a, b) => b.size - a.size);\n\n\t\t\t\t\t\t// Show files (all if --full, otherwise top 10)\n\t\t\t\t\t\tconst filesToShow = fullOutput ? files : files.slice(0, 10);\n\t\t\t\t\t\tfor (const file of filesToShow) {\n\t\t\t\t\t\t\tconst filePercent = (\n\t\t\t\t\t\t\t\t(file.size / depTree.totalSize) *\n\t\t\t\t\t\t\t\t100\n\t\t\t\t\t\t\t).toFixed(1);\n\t\t\t\t\t\t\tpkgTable.push([\n\t\t\t\t\t\t\t\t` ${String.fromCharCode(0x21b3)} ${file.name}`,\n\t\t\t\t\t\t\t\tformatBytes(file.size),\n\t\t\t\t\t\t\t\t`${filePercent}%`,\n\t\t\t\t\t\t\t]);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (!fullOutput && files.length > 10) {\n\t\t\t\t\t\t\tpkgTable.push([` ... ${files.length - 10} more files`, '', '']);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tconsole.log(pkgTable.toString());\n\t\t\t\t\tconsole.log('');\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (src && src.size > 0) {\n\t\t\t\tconst srcPercent = ((src.size / depTree.totalSize) * 100).toFixed(1);\n\t\t\t\tconsole.log(\n\t\t\t\t\t`\\x1b[1msrc: ${formatBytes(src.size)} (${srcPercent}%)\\x1b[0m\\n`,\n\t\t\t\t);\n\n\t\t\t\t// Show src breakdown\n\t\t\t\tconst srcItems = (src.children || [])\n\t\t\t\t\t.filter((item) => item.size > 0)\n\t\t\t\t\t.sort((a, b) => b.size - a.size);\n\n\t\t\t\tif (srcItems.length > 0) {\n\t\t\t\t\tconst srcTable = new Table({\n\t\t\t\t\t\thead: ['Source', 'Size', '% of Total'],\n\t\t\t\t\t\tcolWidths: [45, 12, 12],\n\t\t\t\t\t\tstyle: {\n\t\t\t\t\t\t\thead: ['green', 'bold'],\n\t\t\t\t\t\t\tborder: ['gray'],\n\t\t\t\t\t\t},\n\t\t\t\t\t\tchars: ASCII_TABLE_CHARS,\n\t\t\t\t\t});\n\n\t\t\t\t\tfor (const item of srcItems) {\n\t\t\t\t\t\tconst percentage = ((item.size / depTree.totalSize) * 100).toFixed(\n\t\t\t\t\t\t\t1,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tsrcTable.push([\n\t\t\t\t\t\t\titem.name,\n\t\t\t\t\t\t\tformatBytes(item.size),\n\t\t\t\t\t\t\t`${percentage}%`,\n\t\t\t\t\t\t]);\n\t\t\t\t\t}\n\n\t\t\t\t\tconsole.log(srcTable.toString());\n\t\t\t\t\tconsole.log('');\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// ${String.fromCharCode(0x2501).repeat(1)}\n\t// SUMMARY\n\t// ${String.fromCharCode(0x2501).repeat(1)}\n\n\tconsole.log(`\\x1b[1m\\x1b[36m${String.fromCharCode(0x2501).repeat(1)}\\x1b[0m`);\n\tconsole.log('\\x1b[1m\\x1b[36mSummary\\x1b[0m');\n\tconsole.log(\n\t\t`\\x1b[1m\\x1b[36m${String.fromCharCode(0x2501).repeat(1)}\\x1b[0m\\n`,\n\t);\n\n\tconst summaryTable = new Table({\n\t\thead: ['Metric', 'Value'],\n\t\tcolWidths: [25, 35],\n\t\tstyle: {\n\t\t\thead: ['cyan', 'bold'],\n\t\t\tborder: ['gray'],\n\t\t},\n\t\tchars: ASCII_TABLE_CHARS,\n\t});\n\n\t// Count dependencies separately for browser and server\n\tconst browserNodeModules = browserDepTree?.root.children?.find(\n\t\t(c) => c.name === 'node_modules',\n\t);\n\tconst browserDepCount = browserNodeModules?.children?.length || 0;\n\n\tconst serverNodeModules = depTree?.root.children?.find(\n\t\t(c) => c.name === 'node_modules',\n\t);\n\tconst serverDepCount = serverNodeModules?.children?.length || 0;\n\n\t// Check for actual dist/ binary (from reroute build)\n\tlet actualServerBinarySize: number | null = null;\n\tlet actualServerBinaryGzipped: number | null = null;\n\ttry {\n\t\tconst distDir = join(process.cwd(), 'dist');\n\t\tif (existsSync(distDir)) {\n\t\t\tconst files = await readdir(distDir);\n\t\t\tfor (const file of files) {\n\t\t\t\tconst filePath = join(distDir, file);\n\t\t\t\tconst stats = statSync(filePath);\n\t\t\t\tif (stats.isFile() && !file.includes('.')) {\n\t\t\t\t\tactualServerBinarySize = stats.size;\n\t\t\t\t\t// Estimate gzipped size\n\t\t\t\t\tconst content = await readFile(filePath);\n\t\t\t\t\tactualServerBinaryGzipped = Bun.gzipSync(content).length;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t} catch {}\n\n\tconst browserBundleDisplay = browserInfo\n\t\t? `${formatBytes(browserInfo.size)} (${formatBytes(browserInfo.gzippedSize)} gz)`\n\t\t: 'N/A';\n\n\tconst serverBinaryDisplay = actualServerBinarySize\n\t\t? `${formatBytes(actualServerBinarySize)}${actualServerBinaryGzipped ? ` (${formatBytes(actualServerBinaryGzipped)} gz)` : ''}`\n\t\t: mainInfo\n\t\t\t? formatBytes(mainInfo.size)\n\t\t\t: 'N/A';\n\n\tsummaryTable.push(\n\t\t['Browser Dependencies', browserDepCount.toString()],\n\t\t['Browser Bundle', browserBundleDisplay],\n\t\t['Server Dependencies', serverDepCount.toString()],\n\t\t['Final Server Binary', serverBinaryDisplay],\n\t);\n\n\tconsole.log(summaryTable.toString());\n\tconsole.log('');\n\n\t// Add explanatory note about server binary size\n\tif (actualServerBinarySize) {\n\t\tconsole.log(\n\t\t\t'\\x1b[90mNote: Final Server Binary is a standalone executable that includes the Bun runtime,\\x1b[0m',\n\t\t);\n\t\tconsole.log(\n\t\t\t'\\x1b[90m your application code, and all dependencies. This allows it to run without\\x1b[0m',\n\t\t);\n\t\tconsole.log(\n\t\t\t'\\x1b[90m requiring Node.js or Bun to be installed on the deployment server.\\x1b[0m',\n\t\t);\n\t\tconsole.log('');\n\t}\n\n\tif (stats.bundles.length === 0) {\n\t\tconsole.log(\n\t\t\tcolorizeLogPrefixAnsi(\n\t\t\t\t'[reroute/analyze] No bundles found. Run `reroute build` first. For production builds, use NODE_ENV=production or --prod flag.\\n',\n\t\t\t),\n\t\t);\n\t}\n}\n\nexport default async function analyze(args: string[]): Promise<void> {\n\ttry {\n\t\tconst cwd = process.cwd();\n\t\tconst outputHtml = args.includes('--html');\n\t\tconst openBrowser = args.includes('--open') || args.includes('-o');\n\t\tconst isProd = isProductionMode(args);\n\n\t\t// Extract search term from --search flag\n\t\tconst searchIndex = args.indexOf('--search');\n\t\tconst initialSearch =\n\t\t\tsearchIndex !== -1 && args[searchIndex + 1] ? args[searchIndex + 1] : '';\n\n\t\t// Ensure .reroute artifacts exist by running build if needed\n\t\tconst rerouteIndexPath = join(cwd, '.reroute', 'index.ts');\n\t\tif (!existsSync(rerouteIndexPath)) {\n\t\t\tconsole.log(\n\t\t\t\tcolorizeLogPrefixAnsi(\n\t\t\t\t\t'[reroute/analyze] .reroute artifacts not found, running build...\\n',\n\t\t\t\t),\n\t\t\t);\n\t\t\tconst { spawn } = await import('node:child_process');\n\t\t\tconst { getRerouteCommand } = await import('../libs/command');\n\n\t\t\tconst rerouteCmd = getRerouteCommand();\n\t\t\tconst useShell = rerouteCmd.includes(' ');\n\n\t\t\tconst buildCommand = useShell ? `${rerouteCmd} build` : rerouteCmd;\n\t\t\tconst buildArgs = useShell ? [] : ['build'];\n\n\t\t\tawait new Promise<void>((resolve, reject) => {\n\t\t\t\tconst buildProcess = spawn(buildCommand, buildArgs, {\n\t\t\t\t\tstdio: 'inherit',\n\t\t\t\t\tshell: useShell,\n\t\t\t\t});\n\n\t\t\t\tbuildProcess.on('exit', (code) => {\n\t\t\t\t\tif (code !== null && code !== 0) {\n\t\t\t\t\t\treject(new Error(`Build exited with code ${code}`));\n\t\t\t\t\t} else {\n\t\t\t\t\t\tresolve();\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tbuildProcess.on('error', (error) => {\n\t\t\t\t\treject(error);\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tconsole.log(colorizeLogPrefixAnsi('[reroute/analyze] Build complete\\n'));\n\t\t}\n\n\t\tconsole.log(\n\t\t\tcolorizeLogPrefixAnsi('[reroute/analyze] Scanning for bundles...\\n'),\n\t\t);\n\n\t\tconst bundles = await findBundles(cwd);\n\t\tconst stats = calculateStats(bundles);\n\n\t\t// Find and analyze the browser entrypoint\n\t\tconsole.log(\n\t\t\tcolorizeLogPrefixAnsi(\n\t\t\t\t'[reroute/analyze] Building browser entrypoint for analysis...\\n',\n\t\t\t),\n\t\t);\n\t\tconst browserEntry = await findBrowserEntry(cwd);\n\t\tlet browserDepTree: DepTree | null = null;\n\t\tlet browserInfo: {\n\t\t\tname: string;\n\t\t\tsize: number;\n\t\t\tgzippedSize: number;\n\t\t} | null = null;\n\n\t\tif (browserEntry) {\n\t\t\tconsole.log(\n\t\t\t\tcolorizeLogPrefixAnsi(\n\t\t\t\t\t`[reroute/analyze] Analyzing browser bundle: ${relative(cwd, browserEntry)}\\n`,\n\t\t\t\t),\n\t\t\t);\n\t\t\tbrowserDepTree = await buildDependencyTree(browserEntry, cwd);\n\n\t\t\tif (!browserDepTree) {\n\t\t\t\tconsole.log(\n\t\t\t\t\tcolorizeLogPrefixAnsi(\n\t\t\t\t\t\t'[reroute/analyze] Could not build dependency tree from browser bundle. Sourcemap may be missing or invalid.\\n',\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tconst browserStat = await stat(browserEntry);\n\t\t\t\tconst browserContent = await readFile(browserEntry);\n\t\t\t\tconst browserGzipped = Bun.gzipSync(browserContent).length;\n\t\t\t\tbrowserInfo = {\n\t\t\t\t\tname: basename(browserEntry),\n\t\t\t\t\tsize: browserStat.size,\n\t\t\t\t\tgzippedSize: browserGzipped,\n\t\t\t\t};\n\t\t\t} catch {}\n\t\t} else {\n\t\t\tconsole.log(\n\t\t\t\tcolorizeLogPrefixAnsi(\n\t\t\t\t\t'[reroute/analyze] Could not build browser entrypoint for analysis. Browser dependency breakdown will not be available.\\n',\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\n\t\t// Build dependency tree for server binary\n\t\t// Always build a fresh server bundle for analysis with all deps bundled\n\t\tlet entry: string | null = null;\n\t\tlet depTree: DepTree | null = null;\n\t\tlet mainInfo: { name: string; size: number; gzippedSize: number } | null =\n\t\t\tnull;\n\n\t\tconst srcEntry = join(cwd, 'src', 'index.ts');\n\t\tif (existsSync(srcEntry)) {\n\t\t\tconsole.log(\n\t\t\t\tcolorizeLogPrefixAnsi(\n\t\t\t\t\t`[reroute/analyze] Building server binary for analysis...\\n`,\n\t\t\t\t),\n\t\t\t);\n\t\t\tconst { mkdir } = await import('node:fs/promises');\n\t\t\tconst serverAnalysisDir = join(cwd, '.reroute', 'server');\n\t\t\tawait mkdir(serverAnalysisDir, { recursive: true });\n\n\t\t\t// Use Bun.build API directly with NO externals\n\t\t\tconst result = await Bun.build({\n\t\t\t\tentrypoints: [srcEntry],\n\t\t\t\ttarget: 'bun',\n\t\t\t\tminify: isProd,\n\t\t\t\tsourcemap: 'linked',\n\t\t\t\texternal: [], // Don't externalize anything\n\t\t\t\tsplitting: false,\n\t\t\t});\n\n\t\t\tif (result.success && result.outputs.length > 0) {\n\t\t\t\tconst output = result.outputs[0];\n\t\t\t\tconst code = await output.text();\n\t\t\t\tconst analysisEntry = join(serverAnalysisDir, 'index.js');\n\t\t\t\tawait writeFile(analysisEntry, code, 'utf-8');\n\n\t\t\t\t// Write sourcemap if available\n\t\t\t\tconst mapOutput = result.outputs.find((o) => o.path.endsWith('.map'));\n\t\t\t\tif (mapOutput) {\n\t\t\t\t\tconst mapContent = await mapOutput.text();\n\t\t\t\t\tawait writeFile(`${analysisEntry}.map`, mapContent, 'utf-8');\n\t\t\t\t}\n\n\t\t\t\tentry = analysisEntry;\n\t\t\t}\n\t\t}\n\n\t\tif (entry) {\n\t\t\tconsole.log(\n\t\t\t\tcolorizeLogPrefixAnsi(\n\t\t\t\t\t`[reroute/analyze] Building dependency graph for ${relative(cwd, entry)}\\n`,\n\t\t\t\t),\n\t\t\t);\n\t\t\tdepTree = await buildDependencyTree(entry, cwd);\n\n\t\t\t// Get actual installed package sizes as supplementary data\n\t\t\tconsole.log(\n\t\t\t\tcolorizeLogPrefixAnsi(\n\t\t\t\t\t`[reroute/analyze] Checking installed package sizes...\\n`,\n\t\t\t\t),\n\t\t\t);\n\t\t\tconst installedSizes = await getInstalledPackageSizes(cwd);\n\n\t\t\t// Add missing packages to the tree based on package.json\n\t\t\tif (depTree) {\n\t\t\t\tconst packageJsonPath = join(cwd, 'package.json');\n\t\t\t\tif (existsSync(packageJsonPath)) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst packageJson = JSON.parse(\n\t\t\t\t\t\t\tawait readFile(packageJsonPath, 'utf-8'),\n\t\t\t\t\t\t);\n\t\t\t\t\t\t// Only include runtime dependencies (not devDependencies like typescript, @types)\n\t\t\t\t\t\tconst runtimeDeps = packageJson.dependencies || {};\n\n\t\t\t\t\t\tconst nodeModulesNode = depTree.root.children?.find(\n\t\t\t\t\t\t\t(c) => c.name === 'node_modules',\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (nodeModulesNode) {\n\t\t\t\t\t\t\tconst trackedPkgs = new Set(\n\t\t\t\t\t\t\t\tnodeModulesNode.children?.map((c) => c.name) || [],\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t// Add missing packages with their installed sizes\n\t\t\t\t\t\t\tfor (const pkgName of Object.keys(runtimeDeps)) {\n\t\t\t\t\t\t\t\tif (!trackedPkgs.has(pkgName) && installedSizes.has(pkgName)) {\n\t\t\t\t\t\t\t\t\tnodeModulesNode.children?.push({\n\t\t\t\t\t\t\t\t\t\tname: pkgName,\n\t\t\t\t\t\t\t\t\t\tpath: join(cwd, 'node_modules', pkgName),\n\t\t\t\t\t\t\t\t\t\tsize: installedSizes.get(pkgName) || 0,\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// Recompute total size\n\t\t\t\t\t\t\tnodeModulesNode.size =\n\t\t\t\t\t\t\t\tnodeModulesNode.children?.reduce((sum, c) => {\n\t\t\t\t\t\t\t\t\tif (c.children && c.children.length > 0) {\n\t\t\t\t\t\t\t\t\t\tc.size = c.children.reduce((s, child) => s + child.size, 0);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\treturn sum + c.size;\n\t\t\t\t\t\t\t\t}, 0) || 0;\n\n\t\t\t\t\t\t\tdepTree.root.size =\n\t\t\t\t\t\t\t\tdepTree.root.children?.reduce((sum, c) => sum + c.size, 0) || 0;\n\t\t\t\t\t\t\tdepTree.totalSize = depTree.root.size;\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch (_e) {\n\t\t\t\t\t\t// Silently continue if package.json parsing fails\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Get main bundle info\n\t\t\ttry {\n\t\t\t\tconst entryStat = await stat(entry);\n\t\t\t\tconst entryContent = await readFile(entry);\n\t\t\t\tconst entryGzipped = Bun.gzipSync(entryContent).length;\n\t\t\t\tmainInfo = {\n\t\t\t\t\tname: basename(entry),\n\t\t\t\t\tsize: entryStat.size,\n\t\t\t\t\tgzippedSize: entryGzipped,\n\t\t\t\t};\n\t\t\t} catch {}\n\t\t}\n\n\t\t// Print console report with dependency info\n\t\tconst fullOutput = args.includes('--full');\n\t\tawait printConsoleReport(\n\t\t\tstats,\n\t\t\tdepTree,\n\t\t\tmainInfo,\n\t\t\tbrowserDepTree,\n\t\t\tbrowserInfo,\n\t\t\tfullOutput,\n\t\t);\n\n\t\t// Generate HTML report if requested\n\t\tif (outputHtml || openBrowser) {\n\t\t\tconst htmlPath = join(cwd, '.reroute', 'analysis.html');\n\t\t\tconst html = await generateHTMLReport(\n\t\t\t\tstats,\n\t\t\t\tdepTree,\n\t\t\t\tmainInfo,\n\t\t\t\tbrowserDepTree,\n\t\t\t\tbrowserInfo,\n\t\t\t\tinitialSearch,\n\t\t\t);\n\n\t\t\t// Ensure .reroute directory exists\n\t\t\tconst { mkdir } = await import('node:fs/promises');\n\t\t\tawait mkdir(join(cwd, '.reroute'), { recursive: true });\n\n\t\t\tawait writeFile(htmlPath, html, 'utf-8');\n\t\t\tconsole.log(\n\t\t\t\tcolorizeLogPrefixAnsi(\n\t\t\t\t\t`[reroute/analyze] HTML report generated: ${relative(cwd, htmlPath)}\\n`,\n\t\t\t\t),\n\t\t\t);\n\n\t\t\tif (openBrowser) {\n\t\t\t\ttry {\n\t\t\t\t\t// Use Bun's spawn to open the file with the system's default application\n\t\t\t\t\tconst { spawn } = await import('node:child_process');\n\t\t\t\t\tconst platform = process.platform;\n\t\t\t\t\tlet command: string;\n\t\t\t\t\tlet commandArgs: string[];\n\n\t\t\t\t\tif (platform === 'darwin') {\n\t\t\t\t\t\tcommand = 'open';\n\t\t\t\t\t\tcommandArgs = [htmlPath];\n\t\t\t\t\t} else if (platform === 'win32') {\n\t\t\t\t\t\tcommand = 'cmd';\n\t\t\t\t\t\tcommandArgs = ['/c', 'start', '', htmlPath];\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcommand = 'xdg-open';\n\t\t\t\t\t\tcommandArgs = [htmlPath];\n\t\t\t\t\t}\n\n\t\t\t\t\tspawn(command, commandArgs, { detached: true, stdio: 'ignore' });\n\t\t\t\t\tconsole.log(\n\t\t\t\t\t\tcolorizeLogPrefixAnsi(\n\t\t\t\t\t\t\t'[reroute/analyze] Opened report in browser\\n',\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t} catch {\n\t\t\t\t\tconsole.warn(\n\t\t\t\t\t\tcolorizeLogPrefixAnsi(\n\t\t\t\t\t\t\t`[reroute/analyze] Could not open browser automatically. Please open ${htmlPath} manually.\\n`,\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t} catch (error) {\n\t\tconsole.error(\n\t\t\tcolorizeLogPrefixAnsi(`[reroute/analyze] Error: ${String(error)}\\n`),\n\t\t);\n\t\tthrow error;\n\t}\n}\n",
|
|
48
|
+
"#!/usr/bin/env bun\n\n/**\n * Analyze command - Analyze bundle sizes\n *\n * This command analyzes bundles generated by reroute and provides:\n * - Bundle size statistics\n * - Gzipped size information\n * - HTML visualization report with dependency treemap\n */\n\nimport { existsSync, statSync } from 'node:fs';\nimport { readdir, readFile, stat, writeFile } from 'node:fs/promises';\nimport { basename, join, relative } from 'node:path';\nimport Table from 'cli-table3';\nimport { colorizeLogPrefixAnsi } from './lib/log';\nimport { isProductionMode } from './lib/production';\n\n// ASCII-only table borders to avoid Unicode rendering issues in some environments\nconst ASCII_TABLE_CHARS = {\n\ttop: '-',\n\t'top-mid': '+',\n\t'top-left': '+',\n\t'top-right': '+',\n\tbottom: '-',\n\t'bottom-mid': '+',\n\t'bottom-left': '+',\n\t'bottom-right': '+',\n\tleft: '|',\n\t'left-mid': '+',\n\tmid: '-',\n\t'mid-mid': '+',\n\tright: '|',\n\t'right-mid': '+',\n\tmiddle: '|',\n} as const;\n\ninterface BundleInfo {\n\tpath: string;\n\tname: string;\n\tsize: number;\n\tgzippedSize: number;\n\trelativePath: string;\n\ttype: 'chunk' | 'binary';\n}\n\ninterface BundleStats {\n\ttotalBundles: number;\n\ttotalSize: number;\n\ttotalGzippedSize: number;\n\tbundles: BundleInfo[];\n\tbyCollection: Record<string, BundleInfo[]>;\n}\n\ninterface DepNode {\n\tname: string;\n\tpath: string;\n\tsize: number;\n\tchildren?: DepNode[];\n}\n\ninterface DepTree {\n\tentry: string;\n\ttotalSize: number;\n\troot: DepNode;\n}\n\nasync function findBundles(cwd: string): Promise<BundleInfo[]> {\n\tconst bundles: BundleInfo[] = [];\n\n\t// Find chunks in .reroute/chunks/\n\tconst chunksDir = join(cwd, '.reroute', 'chunks');\n\tif (existsSync(chunksDir)) {\n\t\tconst collections = await readdir(chunksDir, { withFileTypes: true });\n\t\tfor (const collection of collections) {\n\t\t\tif (!collection.isDirectory()) continue;\n\n\t\t\tconst collectionDir = join(chunksDir, collection.name);\n\t\t\tconst files = await readdir(collectionDir);\n\t\t\tfor (const file of files) {\n\t\t\t\tif (!file.endsWith('.js')) continue;\n\n\t\t\t\tconst filePath = join(collectionDir, file);\n\t\t\t\tconst stats = await stat(filePath);\n\t\t\t\tconst content = await Bun.file(filePath).arrayBuffer();\n\t\t\t\tconst gzippedSize = Bun.gzipSync(new Uint8Array(content)).length;\n\n\t\t\t\tbundles.push({\n\t\t\t\t\tpath: filePath,\n\t\t\t\t\tname: file,\n\t\t\t\t\tsize: stats.size,\n\t\t\t\t\tgzippedSize,\n\t\t\t\t\trelativePath: relative(cwd, filePath),\n\t\t\t\t\ttype: 'chunk',\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\t// Find production binaries in dist/\n\tconst distDir = join(cwd, 'dist');\n\tif (existsSync(distDir)) {\n\t\tconst files = await readdir(distDir);\n\t\tfor (const file of files) {\n\t\t\tconst filePath = join(distDir, file);\n\t\t\tconst stats = statSync(filePath);\n\t\t\tif (stats.isFile() && !file.endsWith('.map') && !file.endsWith('.d.ts')) {\n\t\t\t\tconst content = await Bun.file(filePath).arrayBuffer();\n\t\t\t\tconst gzippedSize = Bun.gzipSync(new Uint8Array(content)).length;\n\n\t\t\t\tbundles.push({\n\t\t\t\t\tpath: filePath,\n\t\t\t\t\tname: file,\n\t\t\t\t\tsize: stats.size,\n\t\t\t\t\tgzippedSize,\n\t\t\t\t\trelativePath: relative(cwd, filePath),\n\t\t\t\t\ttype: 'binary',\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\treturn bundles;\n}\n\n/**\n * Find the main browser entrypoint bundle (e.g., index.52a12e66.js)\n * This is the actual JavaScript file shipped to browsers\n */\nasync function findBrowserEntry(cwd: string): Promise<string | null> {\n\ttry {\n\t\tconst clientDir = join(cwd, 'src', 'client');\n\t\tconst tsxEntry = join(clientDir, 'index.tsx');\n\t\tconst tsEntry = join(clientDir, 'index.ts');\n\n\t\tlet sourceEntry: string | null = null;\n\t\tif (existsSync(tsxEntry)) {\n\t\t\tsourceEntry = tsxEntry;\n\t\t} else if (existsSync(tsEntry)) {\n\t\t\tsourceEntry = tsEntry;\n\t\t}\n\n\t\tif (!sourceEntry) return null;\n\n\t\tconst { generateContentHash } = await import('reroute-js/core');\n\n\t\t// Build with NO externals - include everything\n\t\tconst isProd = isProductionMode();\n\t\tconst result = await Bun.build({\n\t\t\tentrypoints: [sourceEntry],\n\t\t\ttarget: 'browser',\n\t\t\tformat: 'esm',\n\t\t\tminify: isProd,\n\t\t\tsourcemap: 'linked',\n\t\t\texternal: [], // Include all dependencies\n\t\t\tdefine: {\n\t\t\t\t'process.env.NODE_ENV': isProd ? '\"production\"' : '\"development\"',\n\t\t\t},\n\t\t});\n\n\t\tif (!result.success) {\n\t\t\tif (result.logs && result.logs.length > 0) {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t'[reroute/analyze] Browser build errors:',\n\t\t\t\t\tresult.logs.map((log) => log.message).join('\\n'),\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn null;\n\t\t}\n\n\t\tif (result.outputs.length === 0) {\n\t\t\tconsole.warn('[reroute/analyze] Browser build produced no outputs');\n\t\t\treturn null;\n\t\t}\n\n\t\tconst tempDir = join(cwd, '.reroute', 'browser');\n\t\tawait import('node:fs/promises').then((fs) =>\n\t\t\tfs.mkdir(tempDir, { recursive: true }),\n\t\t);\n\n\t\tconst output = result.outputs[0];\n\t\tconst code = await output.text();\n\t\tconst actualHash = await generateContentHash(code);\n\t\tconst bundlePath = join(tempDir, `index.${actualHash}.js`);\n\n\t\tawait writeFile(bundlePath, code, 'utf-8');\n\n\t\tconst mapOutput = result.outputs.find((o) => o.path.endsWith('.map'));\n\t\tif (mapOutput) {\n\t\t\tconst mapContent = await mapOutput.text();\n\t\t\tawait writeFile(`${bundlePath}.map`, mapContent, 'utf-8');\n\t\t}\n\n\t\treturn bundlePath;\n\t} catch (error) {\n\t\tconsole.warn('[reroute/analyze] Could not build browser entry:', error);\n\t\treturn null;\n\t}\n}\n\nfunction formatBytes(bytes: number): string {\n\tif (bytes === 0) return '0 B';\n\tconst k = 1024;\n\tconst sizes = ['B', 'KB', 'MB', 'GB'];\n\tconst i = Math.floor(Math.log(bytes) / Math.log(k));\n\treturn `${(bytes / k ** i).toFixed(2)} ${sizes[i]}`;\n}\n\nfunction calculateStats(bundles: BundleInfo[]): BundleStats {\n\tconst byCollection: Record<string, BundleInfo[]> = {};\n\tlet totalSize = 0;\n\tlet totalGzippedSize = 0;\n\n\tfor (const bundle of bundles) {\n\t\ttotalSize += bundle.size;\n\t\ttotalGzippedSize += bundle.gzippedSize;\n\n\t\tif (bundle.type === 'chunk') {\n\t\t\t// Extract collection name from path\n\t\t\tconst match = bundle.relativePath.match(/\\.reroute\\/chunks\\/([^/]+)/);\n\t\t\tconst collection = match ? match[1] : 'unknown';\n\t\t\tif (!byCollection[collection]) {\n\t\t\t\tbyCollection[collection] = [];\n\t\t\t}\n\t\t\tbyCollection[collection].push(bundle);\n\t\t} else {\n\t\t\tif (!byCollection.binaries) {\n\t\t\t\tbyCollection.binaries = [];\n\t\t\t}\n\t\t\tbyCollection.binaries.push(bundle);\n\t\t}\n\t}\n\n\treturn {\n\t\ttotalBundles: bundles.length,\n\t\ttotalSize,\n\t\ttotalGzippedSize,\n\t\tbundles,\n\t\tbyCollection,\n\t};\n}\n\n/**\n * Build a dependency tree from bundle comments (no runtime imports).\n * Groups by node_modules packages vs local src files.\n */\n/**\n * Get actual installed package sizes from node_modules\n */\nasync function getInstalledPackageSizes(\n\tcwd: string,\n): Promise<Map<string, number>> {\n\tconst packageSizes = new Map<string, number>();\n\tconst nodeModulesDir = join(cwd, 'node_modules');\n\n\tif (!existsSync(nodeModulesDir)) return packageSizes;\n\n\ttry {\n\t\tconst { execSync } = await import('node:child_process');\n\t\t// Use du to get directory sizes (faster than recursively statting files)\n\t\tconst output = execSync(`du -sk ${nodeModulesDir}/* 2>/dev/null || true`, {\n\t\t\tencoding: 'utf8',\n\t\t\tmaxBuffer: 10 * 1024 * 1024,\n\t\t});\n\n\t\tconst lines = output.trim().split('\\n');\n\t\tfor (const line of lines) {\n\t\t\tconst [sizeKB, path] = line.split('\\t');\n\t\t\tif (!path) continue;\n\t\t\tconst pkgName = basename(path);\n\t\t\t// Handle @scope packages\n\t\t\tif (pkgName.startsWith('@')) {\n\t\t\t\tconst scopeDir = path;\n\t\t\t\tconst scopedOutput = execSync(\n\t\t\t\t\t`du -sk ${scopeDir}/* 2>/dev/null || true`,\n\t\t\t\t\t{\n\t\t\t\t\t\tencoding: 'utf8',\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t\tconst scopedLines = scopedOutput.trim().split('\\n');\n\t\t\t\tfor (const scopedLine of scopedLines) {\n\t\t\t\t\tconst [scopedSizeKB, scopedPath] = scopedLine.split('\\t');\n\t\t\t\t\tif (!scopedPath) continue;\n\t\t\t\t\tconst fullPkgName = `${pkgName}/${basename(scopedPath)}`;\n\t\t\t\t\tpackageSizes.set(\n\t\t\t\t\t\tfullPkgName,\n\t\t\t\t\t\tNumber.parseInt(scopedSizeKB, 10) * 1024,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tpackageSizes.set(pkgName, Number.parseInt(sizeKB, 10) * 1024);\n\t\t\t}\n\t\t}\n\t} catch (_error) {\n\t\t// Silently fail if du command doesn't work\n\t}\n\n\treturn packageSizes;\n}\n\nasync function buildDependencyTree(\n\tentryPath: string,\n\tcwd: string,\n): Promise<DepTree | null> {\n\ttry {\n\t\tif (!existsSync(entryPath)) return null;\n\n\t\tconst root: DepNode = {\n\t\t\tname: basename(entryPath),\n\t\t\tpath: entryPath,\n\t\t\tsize: 0,\n\t\t\tchildren: [],\n\t\t};\n\t\t// Prefer sourcemap-based analysis (generated build only)\n\t\tconst fromMap = await buildTreeFromSourceMap(entryPath, cwd);\n\t\tif (fromMap) return fromMap;\n\n\t\t// Fallback: use bundle comment markers (still generated build only)\n\t\ttry {\n\t\t\tconst content = await readFile(entryPath, 'utf-8');\n\t\t\tconst modulePattern = /\\/\\/\\s*(.+?\\.(?:ts|tsx|js|jsx|mjs|cjs))\\s*$/gm;\n\t\t\tconst nodeModulesNode: DepNode = {\n\t\t\t\tname: 'node_modules',\n\t\t\t\tpath: join(cwd, 'node_modules'),\n\t\t\t\tsize: 0,\n\t\t\t\tchildren: [],\n\t\t\t};\n\t\t\tconst srcNode: DepNode = {\n\t\t\t\tname: 'src',\n\t\t\t\tpath: cwd,\n\t\t\t\tsize: 0,\n\t\t\t\tchildren: [],\n\t\t\t};\n\t\t\troot.children?.push(nodeModulesNode, srcNode);\n\n\t\t\tfunction place(filePath: string, size: number) {\n\t\t\t\tif (filePath.includes('node_modules')) {\n\t\t\t\t\tlet pkgName = filePath.slice(\n\t\t\t\t\t\tfilePath.indexOf('node_modules') + 'node_modules'.length + 1,\n\t\t\t\t\t);\n\t\t\t\t\tpkgName = pkgName.startsWith('@')\n\t\t\t\t\t\t? pkgName.split('/').slice(0, 2).join('/')\n\t\t\t\t\t\t: pkgName.split('/')[0];\n\t\t\t\t\tlet pkgNode = nodeModulesNode.children?.find(\n\t\t\t\t\t\t(c) => c.name === pkgName,\n\t\t\t\t\t);\n\t\t\t\t\tif (!pkgNode) {\n\t\t\t\t\t\tpkgNode = {\n\t\t\t\t\t\t\tname: pkgName || 'unknown',\n\t\t\t\t\t\t\tpath: join(cwd, 'node_modules', pkgName || ''),\n\t\t\t\t\t\t\tsize: 0,\n\t\t\t\t\t\t\tchildren: [],\n\t\t\t\t\t\t};\n\t\t\t\t\t\tnodeModulesNode.children?.push(pkgNode);\n\t\t\t\t\t}\n\t\t\t\t\tpkgNode.children?.push({\n\t\t\t\t\t\tname: basename(filePath),\n\t\t\t\t\t\tpath: filePath,\n\t\t\t\t\t\tsize,\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tconst rel = relative(cwd, filePath);\n\t\t\t\t\tconst parts = rel.split('/').filter(Boolean);\n\t\t\t\t\tlet current = srcNode;\n\t\t\t\t\tfor (let i = 0; i < parts.length - 1; i++) {\n\t\t\t\t\t\tconst part = parts[i];\n\t\t\t\t\t\tlet child = current.children?.find((c) => c.name === part);\n\t\t\t\t\t\tif (!child) {\n\t\t\t\t\t\t\tchild = {\n\t\t\t\t\t\t\t\tname: part,\n\t\t\t\t\t\t\t\tpath: join(cwd, ...parts.slice(0, i + 1)),\n\t\t\t\t\t\t\t\tsize: 0,\n\t\t\t\t\t\t\t\tchildren: [],\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\tcurrent.children?.push(child);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcurrent = child;\n\t\t\t\t\t}\n\t\t\t\t\tcurrent.children?.push({\n\t\t\t\t\t\tname: parts[parts.length - 1] || basename(filePath),\n\t\t\t\t\t\tpath: filePath,\n\t\t\t\t\t\tsize,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet match: RegExpExecArray | null;\n\t\t\tlet lastPath = '';\n\t\t\tlet lastPos = 0;\n\t\t\tmatch = modulePattern.exec(content);\n\t\t\twhile (match !== null) {\n\t\t\t\tif (lastPath) {\n\t\t\t\t\tconst size = match.index - lastPos;\n\t\t\t\t\tif (size > 0) place(lastPath, size);\n\t\t\t\t}\n\t\t\t\tlastPath = match[1];\n\t\t\t\tlastPos = match.index + match[0].length;\n\t\t\t\tmatch = modulePattern.exec(content);\n\t\t\t}\n\t\t\tif (lastPath) {\n\t\t\t\tconst size = content.length - lastPos;\n\t\t\t\tif (size > 0) place(lastPath, size);\n\t\t\t}\n\n\t\t\t// Aggregate sizes\n\t\t\tfunction compute(node: DepNode): number {\n\t\t\t\tif (node.children && node.children.length > 0) {\n\t\t\t\t\tnode.size = node.children.reduce((s, c) => s + compute(c), 0);\n\t\t\t\t}\n\t\t\t\treturn node.size;\n\t\t\t}\n\t\t\tcompute(root);\n\n\t\t\treturn {\n\t\t\t\tentry: entryPath,\n\t\t\t\ttotalSize: root.size,\n\t\t\t\troot,\n\t\t\t};\n\t\t} catch {\n\t\t\treturn null;\n\t\t}\n\t} catch {\n\t\treturn null;\n\t}\n}\n\n/**\n * Build dependency tree from source map by attributing generated character spans\n * to original sources.\n */\nasync function buildTreeFromSourceMap(\n\tbundlePath: string,\n\tcwd: string,\n): Promise<DepTree | null> {\n\ttry {\n\t\tconst mapPath = `${bundlePath}.map`;\n\t\tif (!existsSync(mapPath)) return null;\n\t\tconst [bundle, mapJson] = await Promise.all([\n\t\t\treadFile(bundlePath, 'utf-8'),\n\t\t\treadFile(mapPath, 'utf-8'),\n\t\t]);\n\t\tconst map = JSON.parse(mapJson) as {\n\t\t\tversion: number;\n\t\t\tfile?: string;\n\t\t\tsourceRoot?: string;\n\t\t\tsources: string[];\n\t\t\tmappings: string;\n\t\t};\n\t\tconst sourceRoot = map.sourceRoot || '';\n\t\tconst genLines = bundle.split('\\n').map((l) => l.length);\n\n\t\t// Base64 VLQ decoding helpers\n\t\tconst chars =\n\t\t\t'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n\t\tconst charToInt = new Map<string, number>();\n\t\tfor (let i = 0; i < chars.length; i++) charToInt.set(chars[i], i);\n\t\tfunction decodeVLQ(str: string, indexRef: { i: number }): number {\n\t\t\tlet result = 0;\n\t\t\tlet shift = 0;\n\t\t\tlet continuation: boolean;\n\t\t\tdo {\n\t\t\t\tconst ch = str[indexRef.i++];\n\t\t\t\tif (ch == null) return 0;\n\t\t\t\tconst val = charToInt.get(ch) ?? 0;\n\t\t\t\tcontinuation = (val & 32) !== 0;\n\t\t\t\tconst digit = val & 31;\n\t\t\t\tresult += digit << shift;\n\t\t\t\tshift += 5;\n\t\t\t} while (continuation);\n\t\t\tconst negate = result & 1;\n\t\t\tresult >>= 1;\n\t\t\treturn negate ? -result : result;\n\t\t}\n\n\t\t// Aggregate generated spans per source index\n\t\tconst perSource: number[] = new Array(map.sources.length).fill(0);\n\n\t\tconst lines = map.mappings.split(';');\n\t\tfor (let line = 0; line < lines.length; line++) {\n\t\t\tconst segs = lines[line];\n\t\t\tif (!segs) continue;\n\t\t\tlet genCol = 0;\n\t\t\tlet src = 0;\n\t\t\tlet _srcLine = 0;\n\t\t\tlet _srcCol = 0;\n\n\t\t\tconst decoded: Array<{ gen: number; src: number | null }> = [];\n\t\t\tconst idx = { i: 0 };\n\t\t\twhile (idx.i < segs.length) {\n\t\t\t\tconst start = idx.i;\n\t\t\t\tgenCol += decodeVLQ(segs, idx);\n\t\t\t\tlet srcIndex: number | null = null;\n\t\t\t\tif (idx.i < segs.length && segs[idx.i] !== ',') {\n\t\t\t\t\tsrc += decodeVLQ(segs, idx);\n\t\t\t\t\t_srcLine += decodeVLQ(segs, idx);\n\t\t\t\t\t_srcCol += decodeVLQ(segs, idx);\n\t\t\t\t\tif (idx.i < segs.length && segs[idx.i] !== ',') {\n\t\t\t\t\t\tdecodeVLQ(segs, idx);\n\t\t\t\t\t}\n\t\t\t\t\tsrcIndex = src;\n\t\t\t\t}\n\t\t\t\tdecoded.push({ gen: genCol, src: srcIndex });\n\t\t\t\tif (segs[idx.i] === ',') idx.i++;\n\t\t\t\tif (idx.i === start) idx.i++;\n\t\t\t}\n\t\t\tif (decoded.length === 0) continue;\n\t\t\tfor (let i = 0; i < decoded.length; i++) {\n\t\t\t\tconst curr = decoded[i];\n\t\t\t\tconst nextGen =\n\t\t\t\t\ti + 1 < decoded.length ? decoded[i + 1].gen : (genLines[line] ?? 0);\n\t\t\t\tconst span = Math.max(0, nextGen - curr.gen);\n\t\t\t\tif (span > 0 && curr.src != null && perSource[curr.src] != null) {\n\t\t\t\t\tperSource[curr.src] += span;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Build tree\n\t\tconst root: DepNode = {\n\t\t\tname: basename(bundlePath),\n\t\t\tpath: bundlePath,\n\t\t\tsize: 0,\n\t\t\tchildren: [],\n\t\t};\n\t\tconst nodeModulesNode: DepNode = {\n\t\t\tname: 'node_modules',\n\t\t\tpath: join(cwd, 'node_modules'),\n\t\t\tsize: 0,\n\t\t\tchildren: [],\n\t\t};\n\t\tconst srcNode: DepNode = {\n\t\t\tname: 'src',\n\t\t\tpath: cwd,\n\t\t\tsize: 0,\n\t\t\tchildren: [],\n\t\t};\n\t\troot.children?.push(nodeModulesNode, srcNode);\n\n\t\tfunction absFor(sourcePath: string): string {\n\t\t\tif (sourcePath.startsWith('/') || sourcePath.match(/^[A-Za-z]:\\\\/))\n\t\t\t\treturn sourcePath;\n\t\t\t// Resolve relative to the bundle file's directory\n\t\t\tconst bundleDir = bundlePath.substring(0, bundlePath.lastIndexOf('/'));\n\t\t\treturn join(bundleDir, sourceRoot || '', sourcePath);\n\t\t}\n\n\t\tfor (let i = 0; i < map.sources.length; i++) {\n\t\t\tconst size = perSource[i];\n\t\t\tif (size <= 0) continue;\n\t\t\tconst srcPath = absFor(map.sources[i]);\n\t\t\tif (srcPath.includes('node_modules')) {\n\t\t\t\t// Extract package name - handle Bun's .bun/package@version/node_modules/package/ format\n\t\t\t\tlet pkgName: string;\n\n\t\t\t\t// Check if it's a Bun internal path like: node_modules/.bun/package@version/node_modules/package/\n\t\t\t\tif (srcPath.includes('.bun/')) {\n\t\t\t\t\tconst bunMatch = srcPath.match(\n\t\t\t\t\t\t/\\.bun\\/([^/]+)@[^/]+\\/node_modules\\/([^/]+)\\//,\n\t\t\t\t\t);\n\t\t\t\t\tif (bunMatch) {\n\t\t\t\t\t\t// Use the package name from the inner node_modules path\n\t\t\t\t\t\tconst innerPkg = bunMatch[2];\n\t\t\t\t\t\t// Handle @scope/package\n\t\t\t\t\t\tif (innerPkg === '@borewit' || innerPkg.startsWith('@')) {\n\t\t\t\t\t\t\tconst scopeMatch = srcPath.match(\n\t\t\t\t\t\t\t\t/\\.bun\\/[^/]+@[^/]+\\/node_modules\\/((@[^/]+\\/[^/]+))/,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tpkgName = scopeMatch ? scopeMatch[1] : innerPkg;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tpkgName = innerPkg;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Fallback: extract from .bun/package@version\n\t\t\t\t\t\tconst fallbackMatch = srcPath.match(/\\.bun\\/([^@/]+)/);\n\t\t\t\t\t\tpkgName = fallbackMatch ? fallbackMatch[1] : 'unknown';\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// Normal node_modules path\n\t\t\t\t\tconst afterNm = srcPath.slice(\n\t\t\t\t\t\tsrcPath.lastIndexOf('node_modules') + 'node_modules'.length + 1,\n\t\t\t\t\t);\n\t\t\t\t\tpkgName = afterNm.startsWith('@')\n\t\t\t\t\t\t? afterNm.split('/').slice(0, 2).join('/')\n\t\t\t\t\t\t: afterNm.split('/')[0];\n\t\t\t\t}\n\n\t\t\t\tlet pkgNode = nodeModulesNode.children?.find((c) => c.name === pkgName);\n\t\t\t\tif (!pkgNode) {\n\t\t\t\t\tpkgNode = {\n\t\t\t\t\t\tname: pkgName || 'unknown',\n\t\t\t\t\t\tpath: join(cwd, 'node_modules', pkgName || ''),\n\t\t\t\t\t\tsize: 0,\n\t\t\t\t\t\tchildren: [],\n\t\t\t\t\t};\n\t\t\t\t\tnodeModulesNode.children?.push(pkgNode);\n\t\t\t\t}\n\t\t\t\tpkgNode.children?.push({\n\t\t\t\t\tname: basename(srcPath),\n\t\t\t\t\tpath: srcPath,\n\t\t\t\t\tsize,\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tconst rel = relative(cwd, srcPath);\n\t\t\t\tconst parts = rel.split('/').filter(Boolean);\n\t\t\t\tlet current = srcNode;\n\t\t\t\tfor (let i = 0; i < parts.length - 1; i++) {\n\t\t\t\t\tconst part = parts[i];\n\t\t\t\t\tlet child = current.children?.find((c) => c.name === part);\n\t\t\t\t\tif (!child) {\n\t\t\t\t\t\tchild = {\n\t\t\t\t\t\t\tname: part,\n\t\t\t\t\t\t\tpath: join(cwd, ...parts.slice(0, i + 1)),\n\t\t\t\t\t\t\tsize: 0,\n\t\t\t\t\t\t\tchildren: [],\n\t\t\t\t\t\t};\n\t\t\t\t\t\tcurrent.children?.push(child);\n\t\t\t\t\t}\n\t\t\t\t\tcurrent = child;\n\t\t\t\t}\n\t\t\t\tcurrent.children?.push({\n\t\t\t\t\tname: parts[parts.length - 1] || basename(srcPath),\n\t\t\t\t\tpath: srcPath,\n\t\t\t\t\tsize,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tfunction computeSizes(node: DepNode): number {\n\t\t\tif (node.children && node.children.length > 0) {\n\t\t\t\tnode.size = node.children.reduce((s, c) => s + computeSizes(c), 0);\n\t\t\t}\n\t\t\treturn node.size;\n\t\t}\n\t\tcomputeSizes(root);\n\n\t\treturn {\n\t\t\tentry: bundlePath,\n\t\t\ttotalSize: root.size,\n\t\t\troot,\n\t\t};\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nasync function generateHTMLReport(\n\tstats: BundleStats,\n\tdepTree?: DepTree | null,\n\tmainInfo?: { name: string; size: number; gzippedSize: number } | null,\n\tbrowserDepTree?: DepTree | null,\n\tbrowserInfo?: { name: string; size: number; gzippedSize: number } | null,\n\tinitialSearch?: string,\n): Promise<string> {\n\tconst bundles = stats.bundles.sort((a, b) => b.size - a.size);\n\n\t// Get actual dist/ binary size for HTML\n\tlet actualServerBinarySize: number | null = null;\n\tlet actualServerBinaryGzipped: number | null = null;\n\ttry {\n\t\tconst distDir = join(process.cwd(), 'dist');\n\t\tif (existsSync(distDir)) {\n\t\t\tconst files = await readdir(distDir);\n\t\t\tfor (const file of files) {\n\t\t\t\tconst filePath = join(distDir, file);\n\t\t\t\tconst stats = statSync(filePath);\n\t\t\t\tif (stats.isFile() && !file.includes('.')) {\n\t\t\t\t\tactualServerBinarySize = stats.size;\n\t\t\t\t\tconst content = await readFile(filePath);\n\t\t\t\t\tactualServerBinaryGzipped = Bun.gzipSync(content).length;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t} catch {}\n\n\t// Helper function to create inline SVG icons (Tabler Icons style, terminal aesthetic)\n\tconst icon = (name: string, color = '#0f0', size = 16) => {\n\t\tconst icons: Record<string, string> = {\n\t\t\tchart: '<path d=\"M3 3v18h18\"/><path d=\"M7 12l4-4 4 4 6-6\"/>',\n\t\t\tworld:\n\t\t\t\t'<path d=\"M21 12a9 9 0 1 1-6.219-8.56\"/><path d=\"M3 9v6a6 6 0 0 0 6 6h6\"/><path d=\"M21 9v6a6 6 0 0 1-6 6H9\"/>',\n\t\t\tsearch: '<circle cx=\"10\" cy=\"10\" r=\"7\"/><path d=\"m21 21-6-6\"/>',\n\t\t\ttreemap:\n\t\t\t\t'<path d=\"M3 3v18h18\"/><path d=\"M3 9h8v12H3z\"/><path d=\"M13 9h8v6h-8z\"/><path d=\"M13 17h8v4h-8z\"/>',\n\t\t\tpackage:\n\t\t\t\t'<path d=\"M12 3v20\"/><path d=\"M2 7h20v14H2z\"/><path d=\"M2 7l10-4 10 4\"/>',\n\t\t\tserver:\n\t\t\t\t'<path d=\"M4 5h16\"/><path d=\"M4 9h16\"/><path d=\"M4 13h16\"/><path d=\"M4 17h16\"/><path d=\"M6 3v18\"/><path d=\"M18 3v18\"/>',\n\t\t};\n\t\tconst path = icons[name] || icons.chart;\n\t\treturn `<svg width=\"${size}\" height=\"${size}\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"${color}\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" style=\"display: inline-block; vertical-align: middle; margin-right: 0.4rem;\">${path}</svg>`;\n\t};\n\n\tconst html = `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n\t<meta charset=\"UTF-8\">\n\t<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n\t<title>Reroute Bundle Analysis</title>\n\t<script src=\"https://d3js.org/d3.v7.min.js\"></script>\n\t<style>\n\t\t* {\n\t\t\tmargin: 0;\n\t\t\tpadding: 0;\n\t\t\tbox-sizing: border-box;\n\t\t}\n\t\tbody {\n\t\t\tfont-family: 'SF Mono', 'Monaco', 'Inconsolata', 'Fira Code', 'Droid Sans Mono', 'Source Code Pro', monospace;\n\t\t\tbackground: #000;\n\t\t\tcolor: #0f0;\n\t\t\tpadding: 1.5rem;\n\t\t\tline-height: 1.5;\n\t\t\tfont-size: 13px;\n\t\t}\n\t\t.container {\n\t\t\tmax-width: 1600px;\n\t\t\tmargin: 0 auto;\n\t\t}\n\t\th1 {\n\t\t\tcolor: #0f0;\n\t\t\tmargin-bottom: 0.5rem;\n\t\t\tfont-size: 1.25rem;\n\t\t\tfont-weight: 600;\n\t\t\tletter-spacing: 0.5px;\n\t\t}\n\t\th1::before {\n\t\t\tcontent: '$ ';\n\t\t\tcolor: #666;\n\t\t}\n\t\t.sticky-search {\n\t\t\tposition: sticky;\n\t\t\ttop: 0;\n\t\t\tbackground: #000;\n\t\t\tz-index: 100;\n\t\t\tpadding: 1rem 0;\n\t\t\tmargin: 0;\n\t\t}\n\t\t.search-row {\n\t\t\tdisplay: grid;\n\t\t\tgrid-template-columns: 1fr auto;\n\t\t\tgap: 0.75rem;\n\t\t\talign-items: start;\n\t\t\theight: 33px;\n\t\t}\n\t\t.search-container {\n\t\t\tposition: relative;\n\t\t\tdisplay: flex;\n\t\t\tflex-direction: column;\n\t\t\tgap: 0.5rem;\n\t\t}\n\t\t.search-input-wrapper {\n\t\t\tposition: relative;\n\t\t}\n\t\t.search-clear {\n\t\t\tposition: absolute;\n\t\t\tright: 0.5rem;\n\t\t\ttop: 50%;\n\t\t\ttransform: translateY(-50%);\n\t\t\tbackground: none;\n\t\t\tborder: none;\n\t\t\tcolor: #666;\n\t\t\tcursor: pointer;\n\t\t\tpadding: 0.25rem;\n\t\t\tdisplay: none;\n\t\t\talign-items: center;\n\t\t\tjustify-content: center;\n\t\t\tfont-size: 17px;\n\t\t\tline-height: 1;\n\t\t}\n\t\t.search-clear:hover {\n\t\t\tcolor: #0f0;\n\t\t}\n\t\t.search-clear.visible {\n\t\t\tdisplay: flex;\n\t\t}\n\t\t.search-input {\n\t\t\twidth: 100%;\n\t\t\tpadding: 0.5rem 2rem 0.5rem 0.75rem;\n\t\t\tbackground: #111;\n\t\t\tborder: 1px solid #333;\n\t\t\tcolor: #0f0;\n\t\t\tfont-size: 13px;\n\t\t\tfont-family: inherit;\n\t\t}\n\t\t.note {\n\t\t\tcolor: #666;\n\t\t\tfont-size: 12px;\n\t\t\tpadding: 0.75rem;\n\t\t\tbackground: #111;\n\t\t\tborder-left: 2px solid #333;\n\t\t}\n\t\t.note strong {\n\t\t\tcolor: #0f0;\n\t\t}\n\t\t@media (max-width: 640px) {\n\t\t\t.search-row {\n\t\t\t\tgrid-template-columns: 1fr;\n\t\t\t\tgap: 0.5rem;\n\t\t\t}\n\t\t}\n\t\t.search-input:focus {\n\t\t\toutline: none;\n\t\t\tborder-color: #0f0;\n\t\t}\n\t\t.search-input::placeholder {\n\t\t\tcolor: #666;\n\t\t}\n\t\t.search-stats {\n\t\t\tmargin-bottom: 1rem;\n\t\t\tfont-size: 12px;\n\t\t\tcolor: #666;\n\t\t}\n\t\t.search-actions {\n\t\t\tdisplay: flex;\n\t\t\tgap: 0.5rem;\n\t\t\talign-items: stretch;\n\t\t}\n\t\t@media (max-width: 640px) {\n\t\t\t.search-actions {\n\t\t\t\twidth: 100%;\n\t\t\t}\n\t\t}\n\t\t.checkbox-label {\n\t\t\tpadding: 0.5rem 0.75rem;\n\t\t\tbackground: #111;\n\t\t\tborder: 1px solid #333;\n\t\t\tcolor: #0f0;\n\t\t\tfont-size: 13px;\n\t\t\tfont-family: inherit;\n\t\t\tcursor: pointer;\n\t\t\twhite-space: nowrap;\n\t\t\tdisplay: flex;\n\t\t\talign-items: center;\n\t\t\tgap: 0.5rem;\n\t\t\tuser-select: none;\n\t\t}\n\t\t.checkbox-label:hover {\n\t\t\tbackground: #1a1a1a;\n\t\t\tborder-color: #0f0;\n\t\t}\n\t\t.checkbox-label input[type=\"checkbox\"] {\n\t\t\tcursor: pointer;\n\t\t\twidth: 14px;\n\t\t\theight: 14px;\n\t\t\taccent-color: #0f0;\n\t\t}\n\t\t@media (max-width: 640px) {\n\t\t\t.checkbox-label {\n\t\t\t\tflex: 1;\n\t\t\t}\n\t\t}\n\t\t.btn-toggle {\n\t\t\tpadding: 0.5rem 0.75rem;\n\t\t\tbackground: #111;\n\t\t\tborder: 1px solid #333;\n\t\t\tcolor: #0f0;\n\t\t\tfont-size: 13px;\n\t\t\tfont-family: inherit;\n\t\t\tcursor: pointer;\n\t\t\twhite-space: nowrap;\n\t\t\tdisplay: flex;\n\t\t\talign-items: center;\n\t\t\tbox-sizing: border-box;\n\t\t}\n\t\t.btn-toggle:hover {\n\t\t\tbackground: #1a1a1a;\n\t\t\tborder-color: #0f0;\n\t\t}\n\t\t@media (max-width: 640px) {\n\t\t\t.btn-toggle {\n\t\t\t\tflex: 1;\n\t\t\t}\n\t\t}\n\t\t.hidden {\n\t\t\tdisplay: none !important;\n\t\t}\n\t\t.section {\n\t\t\tmargin-bottom: 1.5rem;\n\t\t\tborder: 1px solid #333;\n\t\t\tbackground: #0a0a0a;\n\t\t}\n\t\t.section-header {\n\t\t\tpadding: 0.75rem 1rem;\n\t\t\tbackground: #111;\n\t\t\tborder-bottom: 1px solid #333;\n\t\t\tcursor: pointer;\n\t\t\tuser-select: none;\n\t\t\tdisplay: flex;\n\t\t\tjustify-content: space-between;\n\t\t\talign-items: center;\n\t\t}\n\t\t.section-header:hover {\n\t\t\tbackground: #151515;\n\t\t}\n\t\t.section-title {\n\t\t\tfont-size: 14px;\n\t\t\tfont-weight: 600;\n\t\t\tcolor: #0f0;\n\t\t}\n\t\t.section-title.server {\n\t\t\tcolor: #666;\n\t\t}\n\t\t.section-meta {\n\t\t\tcolor: #666;\n\t\t\tfont-size: 12px;\n\t\t}\n\t\t.section-toggle {\n\t\t\tcolor: #666;\n\t\t\tfont-size: 12px;\n\t\t}\n\t\t.section-content {\n\t\t\tpadding: 1rem;\n\t\t}\n\t\t.section.collapsed .section-content {\n\t\t\tdisplay: none;\n\t\t}\n\t\t.section.collapsed .section-toggle::before {\n\t\t\tcontent: '▶ ';\n\t\t}\n\t\t.section-toggle::before {\n\t\t\tcontent: '▼ ';\n\t\t}\n\t\t.stats-grid {\n\t\t\tdisplay: grid;\n\t\t\tgrid-template-columns: repeat(auto-fit, minmax(140px, 1fr));\n\t\t\tgap: 0.5rem;\n\t\t\tmargin-bottom: 1rem;\n\t\t}\n\t\t.stat {\n\t\t\tbackground: #111;\n\t\t\tpadding: 0.5rem 0.75rem;\n\t\t\tborder: 1px solid #222;\n\t\t}\n\t\t.stat-label {\n\t\t\tfont-size: 11px;\n\t\t\tcolor: #666;\n\t\t\tmargin-bottom: 0.25rem;\n\t\t}\n\t\t.stat-value {\n\t\t\tfont-size: 16px;\n\t\t\tfont-weight: 600;\n\t\t\tcolor: #0f0;\n\t\t}\n\t\t.stat-value.server {\n\t\t\tcolor: #666;\n\t\t}\n\t\t.dep-list {\n\t\t\tlist-style: none;\n\t\t\tmargin: 0;\n\t\t\tpadding: 0;\n\t\t}\n\t\t.dep-item {\n\t\t\tpadding: 0.4rem 0;\n\t\t\tborder-bottom: 1px solid #1a1a1a;\n\t\t\tdisplay: flex;\n\t\t\tjustify-content: space-between;\n\t\t\talign-items: center;\n\t\t\tfont-size: 12px;\n\t\t}\n\t\t.dep-item:last-child {\n\t\t\tborder-bottom: none;\n\t\t}\n\t\t.dep-name {\n\t\t\tcolor: #0f0;\n\t\t\tfont-weight: 500;\n\t\t}\n\t\t.dep-name.server {\n\t\t\tcolor: #666;\n\t\t}\n\t\t.dep-size {\n\t\t\tcolor: #666;\n\t\t\tfont-size: 11px;\n\t\t}\n\t\t.dep-children {\n\t\t\tmargin-left: 1.5rem;\n\t\t\tmargin-top: 0.25rem;\n\t\t}\n\t\t.dep-child {\n\t\t\tcolor: #666;\n\t\t\tfont-size: 11px;\n\t\t\tpadding: 0.2rem 0;\n\t\t}\n\t\t.load-more {\n\t\t\tmargin-top: 0.75rem;\n\t\t\tpadding: 0.4rem 0.75rem;\n\t\t\tbackground: #111;\n\t\t\tborder: 1px solid #333;\n\t\t\tcolor: #0f0;\n\t\t\tcursor: pointer;\n\t\t\tfont-family: inherit;\n\t\t\tfont-size: 12px;\n\t\t\twidth: 100%;\n\t\t}\n\t\t.load-more:hover {\n\t\t\tbackground: #1a1a1a;\n\t\t\tborder-color: #0f0;\n\t\t}\n\t\t.treemap-container {\n\t\t\twidth: 100%;\n\t\t\toverflow: visible;\n\t\t}\n\t\t.empty {\n\t\t\ttext-align: center;\n\t\t\tpadding: 2rem;\n\t\t\tcolor: #666;\n\t\t\tfont-size: 12px;\n\t\t}\n\t\t.treemap-cell {\n\t\t\tstroke: #111;\n\t\t\tstroke-width: 1px;\n\t\t\tcursor: pointer;\n\t\t\ttransition: all 0.2s;\n\t\t}\n\t\t.treemap-cell:hover {\n\t\t\tstroke: #0f0;\n\t\t\tstroke-width: 2px;\n\t\t}\n\t\t.treemap-label {\n\t\t\tfill: #0f0;\n\t\t\tfont-size: 10px;\n\t\t\tpointer-events: none;\n\t\t\ttext-anchor: middle;\n\t\t\tfont-weight: 500;\n\t\t}\n\t\t.treemap-tooltip {\n\t\t\tposition: absolute;\n\t\t\tbackground: #000;\n\t\t\tborder: 1px solid #0f0;\n\t\t\tpadding: 0.5rem 0.75rem;\n\t\t\tpointer-events: none;\n\t\t\topacity: 0;\n\t\t\ttransition: opacity 0.15s;\n\t\t\tz-index: 1000;\n\t\t\tfont-size: 11px;\n\t\t}\n\t\t.treemap-tooltip.visible {\n\t\t\topacity: 1;\n\t\t}\n\t\t.tooltip-name {\n\t\t\tfont-weight: 600;\n\t\t\tcolor: #0f0;\n\t\t\tmargin-bottom: 0.25rem;\n\t\t}\n\t\t.tooltip-path {\n\t\t\tcolor: #666;\n\t\t\tfont-size: 10px;\n\t\t\tmargin-bottom: 0.25rem;\n\t\t\tword-break: break-all;\n\t\t}\n\t\t.tooltip-size {\n\t\t\tcolor: #0f0;\n\t\t\tfont-size: 11px;\n\t\t}\n\t</style>\n</head>\n<body>\n\t<div class=\"container\">\n\t\t<h1>reroute analyze</h1>\n\n\t\t<div class=\"sticky-search\">\n\t\t\t<div class=\"search-row\">\n\t\t\t\t<div class=\"search-container\">\n\t\t\t\t\t<div class=\"search-input-wrapper\">\n\t\t\t\t\t\t<input\n\t\t\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t\t\tid=\"search-input\"\n\t\t\t\t\t\t\tclass=\"search-input\"\n\t\t\t\t\t\t\tplaceholder=\"search dependencies (e.g., 'react', 'scheduler', 'sharp')...\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<button class=\"search-clear\" id=\"search-clear\" type=\"button\" aria-label=\"Clear search\">×</button>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"search-actions\">\n\t\t\t\t\t<button class=\"btn-toggle\" id=\"expand-all\">expand</button>\n\t\t\t\t\t<button class=\"btn-toggle\" id=\"collapse-all\">collapse</button>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\n\t\t<div class=\"section\">\n\t\t\t<div class=\"section-header\">\n\t\t\t\t<div>\n\t\t\t\t\t<div class=\"section-title\">${icon('chart')}Summary</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div class=\"section-content\">\n\t\t\t\t<div class=\"stats-grid\">\n\t\t\t\t\t<div class=\"stat\">\n\t\t\t\t\t\t<div class=\"stat-label\">browser dependencies</div>\n\t\t\t\t\t\t<div class=\"stat-value\">${(() => {\n\t\t\t\t\t\t\tconst nodeModules = browserDepTree?.root.children?.find(\n\t\t\t\t\t\t\t\t(c) => c.name === 'node_modules',\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\treturn nodeModules?.children?.length || 0;\n\t\t\t\t\t\t})()}</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"stat\">\n\t\t\t\t\t\t<div class=\"stat-label\">browser bundle</div>\n\t\t\t\t\t\t<div class=\"stat-value\">${browserInfo ? formatBytes(browserInfo.size) : 'N/A'}</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"stat\">\n\t\t\t\t\t\t<div class=\"stat-label\">server dependencies</div>\n\t\t\t\t\t\t<div class=\"stat-value\">${(() => {\n\t\t\t\t\t\t\tconst nodeModules = depTree?.root.children?.find(\n\t\t\t\t\t\t\t\t(c) => c.name === 'node_modules',\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\treturn nodeModules?.children?.length || 0;\n\t\t\t\t\t\t})()}</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"stat\">\n\t\t\t\t\t\t<div class=\"stat-label\">final server binary</div>\n\t\t\t\t\t\t<div class=\"stat-value\">${actualServerBinarySize ? formatBytes(actualServerBinarySize) : 'N/A'}</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\n\t\t<!-- ═══════════════════════════════════════════════════════════ -->\n\t\t<!-- BROWSER SECTION (what users download) -->\n\t\t<!-- ═══════════════════════════════════════════════════════════ -->\n\n\t\t${\n\t\t\tbrowserInfo\n\t\t\t\t? `\n\t\t<div class=\"section\">\n\t\t\t<div class=\"section-header\" onclick=\"this.parentElement.classList.toggle('collapsed')\">\n\t\t\t\t<div>\n\t\t\t\t\t<div class=\"section-title\">${icon('world')}browser bundle</div>\n\t\t\t\t\t<div class=\"section-meta\">${browserInfo.name} · ${formatBytes(browserInfo.size)} raw · ${formatBytes(browserInfo.gzippedSize)} gzipped</div>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"section-toggle\"></div>\n\t\t\t</div>\n\t\t\t<div class=\"section-content\">\n\t\t\t\t<div class=\"stats-grid\">\n\t\t\t\t\t<div class=\"stat\">\n\t\t\t\t\t\t<div class=\"stat-label\">raw size</div>\n\t\t\t\t\t\t<div class=\"stat-value\">${formatBytes(browserInfo.size)}</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"stat\">\n\t\t\t\t\t\t<div class=\"stat-label\">gzipped</div>\n\t\t\t\t\t\t<div class=\"stat-value\">${formatBytes(browserInfo.gzippedSize)}</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"stat\">\n\t\t\t\t\t\t<div class=\"stat-label\">compression</div>\n\t\t\t\t\t\t<div class=\"stat-value\">${((1 - browserInfo.gzippedSize / browserInfo.size) * 100).toFixed(1)}%</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"stat\">\n\t\t\t\t\t\t<div class=\"stat-label\">3G transfer</div>\n\t\t\t\t\t\t<div class=\"stat-value\">${(() => {\n\t\t\t\t\t\t\tconst t = browserInfo.gzippedSize / 1024 / (1.6 * 128);\n\t\t\t\t\t\t\treturn t >= 1 ? `${t.toFixed(1)}s` : `${(t * 1000).toFixed(0)}ms`;\n\t\t\t\t\t\t})()}</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"stat\">\n\t\t\t\t\t\t<div class=\"stat-label\">4G transfer</div>\n\t\t\t\t\t\t<div class=\"stat-value\">${(() => {\n\t\t\t\t\t\t\tconst t = browserInfo.gzippedSize / 1024 / (9 * 128);\n\t\t\t\t\t\t\treturn t >= 1 ? `${t.toFixed(1)}s` : `${(t * 1000).toFixed(0)}ms`;\n\t\t\t\t\t\t})()}</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"stat\">\n\t\t\t\t\t\t<div class=\"stat-label\">5G transfer</div>\n\t\t\t\t\t\t<div class=\"stat-value\">${(() => {\n\t\t\t\t\t\t\tconst t = browserInfo.gzippedSize / 1024 / (50 * 128);\n\t\t\t\t\t\t\treturn t >= 1 ? `${t.toFixed(1)}s` : `${(t * 1000).toFixed(0)}ms`;\n\t\t\t\t\t\t})()}</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t\t`\n\t\t\t\t: ''\n\t\t}\n\t\t${\n\t\t\tbrowserDepTree\n\t\t\t\t? `\n\t\t<div class=\"section collapsed\">\n\t\t\t<div class=\"section-header\" onclick=\"this.parentElement.classList.toggle('collapsed')\">\n\t\t\t\t<div>\n\t\t\t\t\t<div class=\"section-title\">${icon('search')}browser dependencies</div>\n\t\t\t\t\t<div class=\"section-meta\">dependency breakdown</div>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"section-toggle\"></div>\n\t\t\t</div>\n\t\t\t<div class=\"section-content\">\n\t\t\t\t<div id=\"browser-deps-list\"></div>\n\t\t\t</div>\n\t\t</div>\n\n\t\t<div class=\"section collapsed\">\n\t\t\t<div class=\"section-header\" onclick=\"this.parentElement.classList.toggle('collapsed')\">\n\t\t\t\t<div>\n\t\t\t\t\t<div class=\"section-title\">${icon('treemap')}browser treemap</div>\n\t\t\t\t\t<div class=\"section-meta\">visual dependency breakdown</div>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"section-toggle\"></div>\n\t\t\t</div>\n\t\t\t<div class=\"section-content\">\n\t\t\t\t<div class=\"treemap-container\" id=\"browser-treemap\"></div>\n\t\t\t</div>\n\t\t</div>\n\t\t`\n\t\t\t\t: ''\n\t\t}\n\n\t\t${Object.entries(stats.byCollection)\n\t\t\t.filter(([collection]) => collection !== 'binaries')\n\t\t\t.map(([collection, collectionBundles]) => {\n\t\t\t\tconst collectionTotal = collectionBundles.reduce(\n\t\t\t\t\t(sum, b) => sum + b.size,\n\t\t\t\t\t0,\n\t\t\t\t);\n\t\t\t\tconst collectionGzipped = collectionBundles.reduce(\n\t\t\t\t\t(sum, b) => sum + b.gzippedSize,\n\t\t\t\t\t0,\n\t\t\t\t);\n\t\t\t\treturn `\n\t\t<div class=\"section collapsed\">\n\t\t\t<div class=\"section-header\" onclick=\"this.parentElement.classList.toggle('collapsed')\">\n\t\t\t\t<div>\n\t\t\t\t\t<div class=\"section-title\">${icon('package')}${collection} chunks</div>\n\t\t\t\t\t<div class=\"section-meta\">${collectionBundles.length} files · ${formatBytes(collectionTotal)} raw · ${formatBytes(collectionGzipped)} gzipped</div>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"section-toggle\"></div>\n\t\t\t</div>\n\t\t\t<div class=\"section-content\">\n\t\t\t\t<ul class=\"dep-list\" id=\"${collection}-chunks-list\">\n\t\t\t\t\t${collectionBundles\n\t\t\t\t\t\t.sort((a, b) => b.size - a.size)\n\t\t\t\t\t\t.slice(0, 10)\n\t\t\t\t\t\t.map(\n\t\t\t\t\t\t\t(bundle) => `\n\t\t\t\t\t<li class=\"dep-item\">\n\t\t\t\t\t\t<span class=\"dep-name\">${bundle.name}</span>\n\t\t\t\t\t\t<span class=\"dep-size\">${formatBytes(bundle.size)} · ${formatBytes(bundle.gzippedSize)} gz</span>\n\t\t\t\t\t</li>\n\t\t\t\t\t`,\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.join('')}\n\t\t\t\t</ul>\n\t\t\t\t${\n\t\t\t\t\tcollectionBundles.length > 10\n\t\t\t\t\t\t? `\n\t\t\t\t<button class=\"load-more\" onclick=\"loadMore${collection}()\">load ${collectionBundles.length - 10} more...</button>\n\t\t\t\t<script>\n\t\t\t\t\tlet ${collection}Loaded = false;\n\t\t\t\t\tfunction loadMore${collection}() {\n\t\t\t\t\t\tif (${collection}Loaded) return;\n\t\t\t\t\t\t${collection}Loaded = true;\n\t\t\t\t\t\tconst list = document.getElementById('${collection}-chunks-list');\n\t\t\t\t\t\tconst remaining = ${JSON.stringify(collectionBundles.slice(10).map((b) => ({ name: b.name, size: b.size, gzippedSize: b.gzippedSize })))};\n\t\t\t\t\t\tfor (const bundle of remaining) {\n\t\t\t\t\t\t\tconst li = document.createElement('li');\n\t\t\t\t\t\t\tli.className = 'dep-item';\n\t\t\t\t\t\t\tli.innerHTML = '<span class=\"dep-name\">' + bundle.name + '</span><span class=\"dep-size\">' + formatBytes(bundle.size) + ' · ' + formatBytes(bundle.gzippedSize) + ' gz</span>';\n\t\t\t\t\t\t\tlist.appendChild(li);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tevent.target.remove();\n\t\t\t\t\t}\n\t\t\t\t</script>\n\t\t\t\t`\n\t\t\t\t\t\t: ''\n\t\t\t\t}\n\t\t\t</div>\n\t\t</div>\n\t\t`;\n\t\t\t})\n\t\t\t.join('')}\n\n\t\t<!-- ═══════════════════════════════════════════════════════════ -->\n\t\t<!-- SERVER SECTION (not shipped to browser) -->\n\t\t<!-- ═══════════════════════════════════════════════════════════ -->\n\n\t\t${\n\t\t\tactualServerBinarySize\n\t\t\t\t? `\n\t\t<div class=\"section collapsed\">\n\t\t\t<div class=\"section-header\" onclick=\"this.parentElement.classList.toggle('collapsed')\">\n\t\t\t\t<div>\n\t\t\t\t\t<div class=\"section-title server\">${icon('server', '#666')}final server binary</div>\n\t\t\t\t\t<div class=\"section-meta\">standalone executable · ${formatBytes(actualServerBinarySize)} · not shipped to browser</div>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"section-toggle\"></div>\n\t\t\t</div>\n\t\t\t<div class=\"section-content\">\n\t\t\t\t<div class=\"stats-grid\">\n\t\t\t\t\t<div class=\"stat\">\n\t\t\t\t\t\t<div class=\"stat-label\">binary size</div>\n\t\t\t\t\t\t<div class=\"stat-value server\">${formatBytes(actualServerBinarySize)}</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t${\n\t\t\t\t\t\tactualServerBinaryGzipped\n\t\t\t\t\t\t\t? `\n\t\t\t\t\t<div class=\"stat\">\n\t\t\t\t\t\t<div class=\"stat-label\">gzipped</div>\n\t\t\t\t\t\t<div class=\"stat-value server\">${formatBytes(actualServerBinaryGzipped)}</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"stat\">\n\t\t\t\t\t\t<div class=\"stat-label\">compression</div>\n\t\t\t\t\t\t<div class=\"stat-value server\">${((1 - actualServerBinaryGzipped / actualServerBinarySize) * 100).toFixed(1)}%</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t`\n\t\t\t\t\t\t\t: ''\n\t\t\t\t\t}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t\t`\n\t\t\t\t: ''\n\t\t}\n\t\t${\n\t\t\tdepTree\n\t\t\t\t? `\n\t\t<div class=\"section collapsed\">\n\t\t\t<div class=\"section-header\" onclick=\"this.parentElement.classList.toggle('collapsed')\">\n\t\t\t\t<div>\n\t\t\t\t\t<div class=\"section-title server\">${icon('search', '#666')}server dependencies</div>\n\t\t\t\t\t<div class=\"section-meta\">server-side only · not shipped to browser</div>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"section-toggle\"></div>\n\t\t\t</div>\n\t\t\t<div class=\"section-content\">\n\t\t\t\t<div id=\"server-deps-list\"></div>\n\t\t\t</div>\n\t\t</div>\n\n\t\t<div class=\"section collapsed\">\n\t\t\t<div class=\"section-header\" onclick=\"this.parentElement.classList.toggle('collapsed')\">\n\t\t\t\t<div>\n\t\t\t\t\t<div class=\"section-title server\">${icon('treemap', '#666')}server treemap</div>\n\t\t\t\t\t<div class=\"section-meta\">visual dependency breakdown</div>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"section-toggle\"></div>\n\t\t\t</div>\n\t\t\t<div class=\"section-content\">\n\t\t\t\t<div class=\"treemap-container\" id=\"server-treemap\"></div>\n\t\t\t</div>\n\t\t</div>\n\t\t`\n\t\t\t\t: ''\n\t\t}\n\n\t\t${bundles.length === 0 ? '<div class=\"empty\">no bundles found. run <code>reroute gen</code> or <code>reroute build</code> first.</div>' : ''}\n\t</div>\n\t<div class=\"treemap-tooltip\" id=\"tooltip\">\n\t\t<div class=\"tooltip-name\" id=\"tooltip-name\"></div>\n\t\t<div class=\"tooltip-path\" id=\"tooltip-path\"></div>\n\t\t<div class=\"tooltip-size\" id=\"tooltip-size\"></div>\n\t</div>\n\t${\n\t\tbrowserDepTree || depTree\n\t\t\t? `\n\t<script>\n\t\tconst browserDepTree = ${browserDepTree ? JSON.stringify(browserDepTree) : 'null'};\n\t\tconst serverDepTree = ${depTree ? JSON.stringify(depTree) : 'null'};\n\t\tconst formatBytes = ${formatBytes.toString()};\n\n\t\tfunction cleanPath(path) {\n\t\t\tif (!path) return '';\n\t\t\tconst nodeModulesIdx = path.indexOf('node_modules');\n\t\t\tif (nodeModulesIdx === -1) return path;\n\t\t\treturn path.substring(nodeModulesIdx);\n\t\t}\n\n\t\tfunction convertNode(node) {\n\t\t\treturn {\n\t\t\t\tname: node.name,\n\t\t\t\tpath: node.path,\n\t\t\t\tsize: node.size,\n\t\t\t\tchildren: node.children && node.children.length > 0 ? node.children.map(convertNode) : null\n\t\t\t};\n\t\t}\n\n\t\tfunction renderDepTreemap(tree, containerId) {\n\t\t\tconst container = d3.select(containerId);\n\t\t\tcontainer.selectAll(\"*\").remove();\n\t\t\tconst width = container.node()?.clientWidth || 1200;\n\n\t\t\tconst tooltip = d3.select(\"#tooltip\");\n\n\t\t\tconst root = d3.hierarchy(convertNode(tree.root))\n\t\t\t\t.sum(d => d.size || 0)\n\t\t\t\t.sort((a, b) => (b.value || 0) - (a.value || 0));\n\n\t\t\t// Calculate height based on data - use aspect ratio that works well for treemaps\n\t\t\t// More items = taller treemap, but cap at reasonable max\n\t\t\tconst leafCount = root.leaves().length;\n\t\t\tconst baseHeight = Math.max(400, Math.min(1200, width * 0.6));\n\t\t\tconst height = Math.min(baseHeight + (leafCount * 2), width * 1.2);\n\n\t\t\tconst svg = container.append(\"svg\")\n\t\t\t\t.attr(\"width\", width)\n\t\t\t\t.attr(\"height\", height);\n\n\t\t\tconst treemap = d3.treemap()\n\t\t\t\t.size([width, height])\n\t\t\t\t.padding(2)\n\t\t\t\t.round(true);\n\n\t\t\ttreemap(root);\n\n\t\t\tfunction hashString(str) {\n\t\t\t\tlet h = 0;\n\t\t\t\tfor (let i = 0; i < str.length; i++) {\n\t\t\t\t\th = ((h << 5) - h + str.charCodeAt(i)) | 0;\n\t\t\t\t}\n\t\t\t\treturn Math.abs(h);\n\t\t\t}\n\t\t\tfunction getPackageName(d) {\n\t\t\t\tconst p = d.data.path || '';\n\t\t\t\tif (!p.includes('node_modules')) return null;\n\t\t\t\tconst idx = p.lastIndexOf('node_modules/');\n\t\t\t\tif (idx === -1) return null;\n\t\t\t\tconst after = p.slice(idx + 'node_modules/'.length);\n\t\t\t\t// Handle @scope/package or package\n\t\t\t\tif (after.startsWith('@')) {\n\t\t\t\t\tconst parts = after.split('/');\n\t\t\t\t\treturn parts.length >= 2 ? parts[0] + '/' + parts[1] : after;\n\t\t\t\t}\n\t\t\t\treturn after.split('/')[0];\n\t\t\t}\n\n\t\t\t// Terminal-style colors\n\t\t\tconst colorCache = {};\n\t\t\tfunction colorFor(d) {\n\t\t\t\tconst p = d.data.path || '';\n\t\t\t\tif (p.includes('node_modules')) {\n\t\t\t\t\tconst pkg = getPackageName(d) || 'unknown';\n\n\t\t\t\t\tif (!colorCache[pkg]) {\n\t\t\t\t\t\tconst hash = hashString(pkg);\n\t\t\t\t\t\t// Shades of green for terminal aesthetic\n\t\t\t\t\t\tconst brightness = 40 + (hash % 40);\n\t\t\t\t\t\tcolorCache[pkg] = 'rgb(0, ' + brightness + ', 0)';\n\t\t\t\t\t}\n\n\t\t\t\t\treturn colorCache[pkg];\n\t\t\t\t}\n\t\t\t\t// Brighter green for local src files\n\t\t\t\tconst depth = Math.min(d.depth, 4);\n\t\t\t\tconst brightness = 80 + depth * 30;\n\t\t\t\treturn 'rgb(0, ' + Math.min(255, brightness) + ', 0)';\n\t\t\t}\n\n\t\t\tconst cell = svg.selectAll(\"g\")\n\t\t\t\t.data(root.leaves())\n\t\t\t\t.enter()\n\t\t\t\t.append(\"g\")\n\t\t\t\t.attr(\"transform\", d => \\`translate(\\${d.x0},\\${d.y0})\\`);\n\n\t\t\tcell.append(\"rect\")\n\t\t\t\t.attr(\"class\", \"treemap-cell\")\n\t\t\t\t.attr(\"width\", d => d.x1 - d.x0)\n\t\t\t\t.attr(\"height\", d => d.y1 - d.y0)\n\t\t\t\t.attr(\"fill\", colorFor)\n\t\t\t\t.on(\"mouseover\", function(event, d) {\n\t\t\t\t\td3.select(this).attr(\"stroke\", \"#0f0\").attr(\"stroke-width\", 2);\n\t\t\t\t\ttooltip.select(\"#tooltip-name\").text(d.data.name);\n\t\t\t\t\ttooltip.select(\"#tooltip-path\").text(cleanPath(d.data.path || ''));\n\t\t\t\t\ttooltip.select(\"#tooltip-size\").text(formatBytes(d.value));\n\t\t\t\t\ttooltip.classed(\"visible\", true);\n\t\t\t\t})\n\t\t\t\t.on(\"mousemove\", function(event) {\n\t\t\t\t\ttooltip.style(\"left\", (event.pageX + 10) + \"px\")\n\t\t\t\t\t .style(\"top\", (event.pageY - 10) + \"px\");\n\t\t\t\t})\n\t\t\t\t.on(\"mouseout\", function() {\n\t\t\t\t\td3.select(this).attr(\"stroke\", \"#111\").attr(\"stroke-width\", 1);\n\t\t\t\t\ttooltip.classed(\"visible\", false);\n\t\t\t\t});\n\n\t\t\t// Labels on cells - show first letter for small cells, truncated text for larger ones\n\t\t\tconst labels = cell.filter(d => {\n\t\t\t\tconst w = d.x1 - d.x0;\n\t\t\t\tconst h = d.y1 - d.y0;\n\t\t\t\t// Show label if cell is at least 10px wide and 10px tall (enough for first letter)\n\t\t\t\treturn w > 10 && h > 10;\n\t\t\t})\n\t\t\t\t.append(\"text\")\n\t\t\t\t.attr(\"class\", \"treemap-label\")\n\t\t\t\t.attr(\"x\", d => (d.x1 - d.x0) / 2)\n\t\t\t\t.attr(\"y\", d => (d.y1 - d.y0) / 2)\n\t\t\t\t.style(\"text-anchor\", \"middle\")\n\t\t\t\t.style(\"dominant-baseline\", \"middle\");\n\n\t\t\tlabels.each(function(d) {\n\t\t\t\tconst name = d.data.name;\n\t\t\t\tconst width = d.x1 - d.x0;\n\t\t\t\tconst height = d.y1 - d.y0;\n\t\t\t\tconst text = d3.select(this);\n\n\t\t\t\t// Estimate character width: ~6px per character for 10px monospace font\n\t\t\t\tconst charWidth = 6;\n\t\t\t\tconst maxChars = Math.floor((width - 8) / charWidth); // 8px padding\n\t\t\t\tconst minSize = Math.min(width, height);\n\n\t\t\t\tlet labelText = '';\n\t\t\t\tlet fontSize = 10;\n\n\t\t\t\tif (width < 20 || height < 14 || maxChars < 1) {\n\t\t\t\t\t// Very small cell - show first letter only, ensure it's readable\n\t\t\t\t\tlabelText = name.charAt(0).toUpperCase();\n\t\t\t\t\t// Scale font to fit but ensure minimum 8px for readability\n\t\t\t\t\tfontSize = Math.max(8, Math.min(12, minSize * 0.65));\n\t\t\t\t} else if (width < 30 || maxChars < 2) {\n\t\t\t\t\t// Small cell - show first letter (or 2 chars if fits)\n\t\t\t\t\tlabelText = name.substring(0, Math.min(1, name.length)).toUpperCase();\n\t\t\t\t\tfontSize = Math.max(8, Math.min(10, minSize * 0.5));\n\t\t\t\t} else if (width < 40 || maxChars < 3) {\n\t\t\t\t\t// Small-medium cell - show first 2-3 characters\n\t\t\t\t\tlabelText = name.substring(0, Math.min(2, name.length));\n\t\t\t\t\tfontSize = 9;\n\t\t\t\t} else if (maxChars >= name.length) {\n\t\t\t\t\t// Large enough - show full name\n\t\t\t\t\tlabelText = name;\n\t\t\t\t\tfontSize = 10;\n\t\t\t\t} else {\n\t\t\t\t\t// Medium cell - truncate based on available width\n\t\t\t\t\tconst truncateLength = Math.max(3, maxChars - 3); // Leave room for \"...\"\n\t\t\t\t\tlabelText = name.substring(0, truncateLength) + '...';\n\t\t\t\t\tfontSize = 10;\n\t\t\t\t}\n\n\t\t\t\ttext.style(\"font-size\", fontSize + \"px\")\n\t\t\t\t\t.text(labelText);\n\n\t\t\t\t// Show size for larger cells\n\t\t\t\tif (width > 90 && height > 32) {\n\t\t\t\t\ttext.append(\"tspan\")\n\t\t\t\t\t\t.attr(\"x\", width / 2)\n\t\t\t\t\t\t.attr(\"dy\", \"14\")\n\t\t\t\t\t\t.text(formatBytes(d.value));\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tlet currentSearchTerm = '';\n\n\t\tfunction updateSearchStats(visibleCount, totalCount) {\n\t\t\tconst stats = document.getElementById('search-stats');\n\t\t\tif (stats) {\n\t\t\t\tif (currentSearchTerm) {\n\t\t\t\t\tstats.textContent = 'Showing ' + visibleCount + ' of ' + totalCount + ' items matching \"' + currentSearchTerm + '\"';\n\t\t\t\t} else {\n\t\t\t\t\tstats.textContent = '';\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfunction filterTreemap(searchTerm) {\n\t\t\tcurrentSearchTerm = searchTerm.toLowerCase();\n\t\t\tif (!searchTerm) {\n\t\t\t\tif (browserDepTree) renderDepTreemap(browserDepTree, \"#browser-treemap\");\n\t\t\t\tif (serverDepTree) renderDepTreemap(serverDepTree, \"#server-treemap\");\n\t\t\t\tupdateSearchStats(0, 0);\n\n\t\t\t\t// Show all elements\n\t\t\t\tdocument.querySelectorAll('.section').forEach(el => el.classList.remove('hidden'));\n\t\t\t\tdocument.querySelectorAll('tbody tr').forEach(el => el.classList.remove('hidden'));\n\t\t\t\tdocument.querySelectorAll('.dep-item').forEach(el => el.classList.remove('hidden'));\n\t\t\t\tdocument.querySelectorAll('.stat').forEach(el => el.classList.remove('hidden'));\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlet totalMatches = 0;\n\t\t\tlet totalItems = 0;\n\n\t\t// Filter treemap data\n\t\tfunction filterNode(node) {\n\t\t\t// Only match against the package/file name, not the full path\n\t\t\t// to avoid matching build directories like .reroute/\n\t\t\tconst matches = node.name.toLowerCase().includes(searchTerm);\n\n\t\t\tif (!node.children || node.children.length === 0) {\n\t\t\t\treturn matches ? { ...node } : null;\n\t\t\t}\n\n\t\t\tconst filteredChildren = node.children\n\t\t\t\t.map(child => filterNode(child))\n\t\t\t\t.filter(child => child !== null);\n\n\t\t\tif (filteredChildren.length > 0 || matches) {\n\t\t\t\treturn {\n\t\t\t\t\t...node,\n\t\t\t\t\tchildren: filteredChildren.length > 0 ? filteredChildren : undefined\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn null;\n\t\t}\n\n\t\t\tfunction countLeaves(node) {\n\t\t\t\tif (!node.children || node.children.length === 0) return 1;\n\t\t\t\treturn node.children.reduce((sum, child) => sum + countLeaves(child), 0);\n\t\t\t}\n\n\t\t\t// Filter browser treemap\n\t\t\tif (browserDepTree) {\n\t\t\t\tconst filtered = filterNode(browserDepTree.root);\n\t\t\t\tif (filtered) {\n\t\t\t\t\tconst totalLeaves = countLeaves(browserDepTree.root);\n\t\t\t\t\tconst visibleLeaves = countLeaves(filtered);\n\t\t\t\t\ttotalItems += totalLeaves;\n\t\t\t\t\ttotalMatches += visibleLeaves;\n\t\t\t\t\trenderDepTreemap({ ...browserDepTree, root: filtered }, \"#browser-treemap\");\n\t\t\t\t} else {\n\t\t\t\t\tconst elem = document.getElementById('browser-treemap');\n\t\t\t\t\tif (elem) elem.innerHTML = '<div class=\"empty\">No matches found</div>';\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Filter server treemap\n\t\t\tif (serverDepTree) {\n\t\t\t\tconst filtered = filterNode(serverDepTree.root);\n\t\t\t\tif (filtered) {\n\t\t\t\t\trenderDepTreemap({ ...serverDepTree, root: filtered }, \"#server-treemap\");\n\t\t\t\t} else {\n\t\t\t\t\tconst elem = document.getElementById('server-treemap');\n\t\t\t\t\tif (elem) elem.innerHTML = '<div class=\"empty\">No matches found</div>';\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Render matching items that aren't loaded yet\n\t\t\tif (searchTerm) {\n\t\t\t\trenderMatchingDeps('browser-deps-list', searchTerm);\n\t\t\t\trenderMatchingDeps('server-deps-list', searchTerm);\n\t\t\t}\n\n\t\t\t// Filter dependency lists\n\t\t\tdocument.querySelectorAll('.dep-item').forEach(item => {\n\t\t\t\tconst packageName = item.getAttribute('data-package-name') || '';\n\t\t\t\tif (packageName.includes(searchTerm)) {\n\t\t\t\t\titem.classList.remove('hidden');\n\t\t\t\t\ttotalMatches++;\n\t\t\t\t} else {\n\t\t\t\t\titem.classList.add('hidden');\n\t\t\t\t}\n\t\t\t\ttotalItems++;\n\t\t\t});\n\n\t\t\t// Filter bundle/chunk tables\n\t\t\tdocument.querySelectorAll('tbody tr').forEach(row => {\n\t\t\t\tconst text = row.textContent.toLowerCase();\n\t\t\t\tif (text.includes(searchTerm)) {\n\t\t\t\t\trow.classList.remove('hidden');\n\t\t\t\t\ttotalMatches++;\n\t\t\t\t} else {\n\t\t\t\t\trow.classList.add('hidden');\n\t\t\t\t}\n\t\t\t\ttotalItems++;\n\t\t\t});\n\n\t\t\t// Filter section headers and content\n\t\t\tdocument.querySelectorAll('.section').forEach(section => {\n\t\t\t\t// Check if section has visible content\n\t\t\t\tconst tbody = section.querySelector('tbody');\n\t\t\t\tconst depList = section.querySelector('.dep-list');\n\t\t\t\tconst treemapContainer = section.querySelector('.treemap-container');\n\t\t\t\tconst stats = section.querySelectorAll('.stat');\n\t\t\t\tconst sectionTitle = section.querySelector('.section-title');\n\n\t\t\t\tlet hasVisibleContent = false;\n\n\t\t\t\tif (tbody) {\n\t\t\t\t\tconst visibleRows = tbody.querySelectorAll('tr:not(.hidden)');\n\t\t\t\t\thasVisibleContent = visibleRows.length > 0;\n\t\t\t\t} else if (depList) {\n\t\t\t\t\tconst visibleItems = depList.querySelectorAll('.dep-item:not(.hidden)');\n\t\t\t\t\thasVisibleContent = visibleItems.length > 0;\n\t\t\t\t} else if (treemapContainer) {\n\t\t\t\t\thasVisibleContent = !treemapContainer.querySelector('.empty');\n\t\t\t\t} else if (stats.length > 0) {\n\t\t\t\t\t// Stat sections: show if any stat matches\n\t\t\t\t\tconst statMatches = Array.from(stats).some(stat =>\n\t\t\t\t\t\tstat.textContent.toLowerCase().includes(searchTerm)\n\t\t\t\t\t);\n\t\t\t\t\thasVisibleContent = statMatches;\n\t\t\t\t} else if (sectionTitle && sectionTitle.textContent.toLowerCase().includes(searchTerm)) {\n\t\t\t\t\t// Section title matches\n\t\t\t\t\thasVisibleContent = true;\n\t\t\t\t}\n\n\t\t\t\tif (hasVisibleContent) {\n\t\t\t\t\tsection.classList.remove('hidden');\n\t\t\t\t} else {\n\t\t\t\t\tsection.classList.add('hidden');\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tupdateSearchStats(totalMatches, totalItems);\n\t\t}\n\n\t\t// Setup search\n\t\tconst searchInput = document.getElementById('search-input');\n\t\tconst searchClear = document.getElementById('search-clear');\n\n\t\tfunction updateClearButton() {\n\t\t\tif (searchClear && searchInput) {\n\t\t\t\tif (searchInput.value.trim().length > 0) {\n\t\t\t\t\tsearchClear.classList.add('visible');\n\t\t\t\t} else {\n\t\t\t\t\tsearchClear.classList.remove('visible');\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (searchInput) {\n\t\t\tsearchInput.addEventListener('input', (e) => {\n\t\t\t\tfilterTreemap(e.target.value);\n\t\t\t\tupdateClearButton();\n\t\t\t});\n\t\t\t// Check initial state\n\t\t\tupdateClearButton();\n\t\t}\n\n\t\tif (searchClear) {\n\t\t\tsearchClear.addEventListener('click', () => {\n\t\t\t\tif (searchInput) {\n\t\t\t\t\tsearchInput.value = '';\n\t\t\t\t\tsearchInput.focus();\n\t\t\t\t\tfilterTreemap('');\n\t\t\t\t\tupdateClearButton();\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\t// Expand/collapse all handlers\n\t\tconst expandAllBtn = document.getElementById('expand-all');\n\t\tconst collapseAllBtn = document.getElementById('collapse-all');\n\n\t\tif (expandAllBtn) {\n\t\t\texpandAllBtn.addEventListener('click', () => {\n\t\t\t\tdocument.querySelectorAll('.section.collapsed').forEach(section => {\n\t\t\t\t\tsection.classList.remove('collapsed');\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\n\t\tif (collapseAllBtn) {\n\t\t\tcollapseAllBtn.addEventListener('click', () => {\n\t\t\t\tdocument.querySelectorAll('.section:not(.collapsed)').forEach(section => {\n\t\t\t\t\t// Don't collapse the Summary section\n\t\t\t\t\tconst title = section.querySelector('.section-title');\n\t\t\t\t\tif (title && !title.textContent.includes('Summary')) {\n\t\t\t\t\t\tsection.classList.add('collapsed');\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\n\t\t// Store full packages data for search\n\t\tconst depListData = new Map();\n\n\t\t// Helper to create a dep item element\n\t\tfunction createDepItem(pkg, isServer, totalSize, bundleInfo) {\n\t\t\tconst li = document.createElement('li');\n\t\t\tli.className = 'dep-item';\n\t\t\tli.setAttribute('data-package-name', pkg.name.toLowerCase());\n\n\t\t\tconst nameSpan = document.createElement('span');\n\t\t\tnameSpan.className = isServer ? 'dep-name server' : 'dep-name';\n\t\t\tnameSpan.textContent = pkg.name;\n\n\t\t\tconst sizeSpan = document.createElement('span');\n\t\t\tsizeSpan.className = 'dep-size';\n\n\t\t\t// Estimate gzipped size using compression ratio\n\t\t\tlet sizeText = formatBytes(pkg.size);\n\t\t\tif (bundleInfo && bundleInfo.size > 0) {\n\t\t\t\tconst compressionRatio = bundleInfo.gzippedSize / bundleInfo.size;\n\t\t\t\tconst estimatedGz = Math.round(pkg.size * compressionRatio);\n\t\t\t\tsizeText += ' (' + formatBytes(estimatedGz) + ' gz)';\n\t\t\t}\n\t\t\tsizeText += ' · ' + ((pkg.size / totalSize) * 100).toFixed(1) + '%';\n\t\t\tsizeSpan.textContent = sizeText;\n\n\t\t\tli.appendChild(nameSpan);\n\t\t\tli.appendChild(sizeSpan);\n\t\t\treturn li;\n\t\t}\n\n\t\t// Populate dependency lists\n\t\tfunction populateDepList(tree, containerId, isServer, bundleInfo) {\n\t\t\tconst container = document.getElementById(containerId);\n\t\t\tif (!container || !tree) return;\n\n\t\t\tconst nodeModules = tree.root.children?.find(c => c.name === 'node_modules');\n\t\t\tif (!nodeModules || !nodeModules.children) return;\n\n\t\t\tconst packages = nodeModules.children\n\t\t\t\t.filter(pkg => pkg.size > 0)\n\t\t\t\t.sort((a, b) => b.size - a.size);\n\n\t\t\t// Store full packages data for this container\n\t\t\tdepListData.set(containerId, {\n\t\t\t\tpackages: packages,\n\t\t\t\tisServer: isServer,\n\t\t\t\ttotalSize: tree.totalSize,\n\t\t\t\tbundleInfo: bundleInfo,\n\t\t\t\tloadedCount: 0\n\t\t\t});\n\n\t\t\tconst ul = document.createElement('ul');\n\t\t\tul.className = 'dep-list';\n\n\t\t\tconst initialCount = 10;\n\t\t\tfor (let i = 0; i < Math.min(initialCount, packages.length); i++) {\n\t\t\t\tconst li = createDepItem(packages[i], isServer, tree.totalSize, bundleInfo);\n\t\t\t\tul.appendChild(li);\n\t\t\t}\n\n\t\t\tdepListData.get(containerId).loadedCount = Math.min(initialCount, packages.length);\n\n\t\t\tcontainer.appendChild(ul);\n\n\t\t\tif (packages.length > initialCount) {\n\t\t\t\tconst btn = document.createElement('button');\n\t\t\t\tbtn.className = 'load-more';\n\t\t\t\tbtn.textContent = 'load ' + (packages.length - initialCount) + ' more...';\n\t\t\t\tbtn.onclick = function() {\n\t\t\t\t\tconst data = depListData.get(containerId);\n\t\t\t\t\tconst existingItems = new Set();\n\t\t\t\t\tul.querySelectorAll('.dep-item').forEach(item => {\n\t\t\t\t\t\texistingItems.add(item.getAttribute('data-package-name'));\n\t\t\t\t\t});\n\n\t\t\t\t\tlet loaded = 0;\n\t\t\t\t\tfor (let i = 0; i < packages.length; i++) {\n\t\t\t\t\t\tconst pkg = packages[i];\n\t\t\t\t\t\tconst nameLower = pkg.name.toLowerCase();\n\t\t\t\t\t\tif (!existingItems.has(nameLower)) {\n\t\t\t\t\t\t\tconst li = createDepItem(pkg, isServer, tree.totalSize, bundleInfo);\n\t\t\t\t\t\t\tul.appendChild(li);\n\t\t\t\t\t\t\tloaded++;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tdata.loadedCount = packages.length;\n\t\t\t\t\tbtn.remove();\n\t\t\t\t};\n\t\t\t\tcontainer.appendChild(btn);\n\t\t\t}\n\t\t}\n\n\t\t// Render matching items that aren't loaded yet\n\t\tfunction renderMatchingDeps(containerId, searchTerm) {\n\t\t\tconst data = depListData.get(containerId);\n\t\t\tif (!data || !searchTerm) return;\n\n\t\t\tconst container = document.getElementById(containerId);\n\t\t\tif (!container) return;\n\n\t\t\tconst ul = container.querySelector('.dep-list');\n\t\t\tif (!ul) return;\n\n\t\t\tconst searchLower = searchTerm.toLowerCase();\n\t\t\tconst existingItems = new Set();\n\t\t\tul.querySelectorAll('.dep-item').forEach(item => {\n\t\t\t\texistingItems.add(item.getAttribute('data-package-name'));\n\t\t\t});\n\n\t\t\t// Find matching packages that aren't rendered yet\n\t\t\tconst matchingPackages = data.packages.filter((pkg) => {\n\t\t\t\tconst nameLower = pkg.name.toLowerCase();\n\t\t\t\tconst matches = nameLower.includes(searchLower);\n\t\t\t\tconst notRendered = !existingItems.has(nameLower);\n\t\t\t\treturn matches && notRendered;\n\t\t\t});\n\n\t\t\t// Render matching items\n\t\t\tmatchingPackages.forEach(pkg => {\n\t\t\t\tconst li = createDepItem(pkg, data.isServer, data.totalSize, data.bundleInfo);\n\t\t\t\tul.appendChild(li);\n\t\t\t});\n\t\t}\n\n\t\t// Initial render\n\t\tconst browserInfo = ${JSON.stringify(browserInfo)};\n\t\tconst serverInfo = ${JSON.stringify(mainInfo)};\n\n\t\tif (browserDepTree) {\n\t\t\tpopulateDepList(browserDepTree, 'browser-deps-list', false, browserInfo);\n\t\t\trenderDepTreemap(browserDepTree, \"#browser-treemap\");\n\t\t}\n\t\tif (serverDepTree) {\n\t\t\tpopulateDepList(serverDepTree, 'server-deps-list', true, serverInfo);\n\t\t\trenderDepTreemap(serverDepTree, \"#server-treemap\");\n\t\t}\n\n\t\twindow.addEventListener(\"resize\", () => {\n\t\t\tif (currentSearchTerm) {\n\t\t\t\tfilterTreemap(currentSearchTerm);\n\t\t\t} else {\n\t\t\t\tif (browserDepTree) renderDepTreemap(browserDepTree, \"#browser-treemap\");\n\t\t\t\tif (serverDepTree) renderDepTreemap(serverDepTree, \"#server-treemap\");\n\t\t\t}\n\t\t});\n\n\t\t// Apply initial search if provided\n\t\tconst initialSearchTerm = ${JSON.stringify(initialSearch || '')};\n\t\tif (initialSearchTerm && searchInput) {\n\t\t\tsearchInput.value = initialSearchTerm;\n\t\t\tfilterTreemap(initialSearchTerm);\n\t\t\tupdateClearButton();\n\t\t}\n\t</script>\n\t`\n\t\t\t: ''\n\t}\n\n\t\t<div class=\"footer\">\n\t\t\t<div class=\"search-stats\" id=\"search-stats\"></div>\n\t\t\t<div class=\"note\">\n\t\t\t\t<strong>Browser</strong> bundles are shipped to users. <strong>Server</strong> binaries run on your server only.\n\t\t\t</div>\n\t\t\t${\n\t\t\t\tmainInfo\n\t\t\t\t\t? `\n\t\t\t<div class=\"note\" style=\"margin-top: 0.5rem;\">\n\t\t\t\t<strong>Final Server Binary</strong> is a standalone executable that includes the Bun runtime, your application code, and all dependencies. This allows it to run without requiring Node.js or Bun to be installed on the deployment server.\n\t\t\t</div>\n\t\t\t`\n\t\t\t\t\t: ''\n\t\t\t}\n\t\t</div>\n\t</div>\n</body>\n</html>`;\n\n\treturn html;\n}\n\nasync function printConsoleReport(\n\tstats: BundleStats,\n\tdepTree?: DepTree | null,\n\tmainInfo?: { name: string; size: number; gzippedSize: number } | null,\n\tbrowserDepTree?: DepTree | null,\n\tbrowserInfo?: { name: string; size: number; gzippedSize: number } | null,\n\tfullOutput = false,\n): Promise<void> {\n\tconsole.log(\n\t\tcolorizeLogPrefixAnsi('[reroute/analyze] Bundle Analysis Report\\n'),\n\t);\n\n\t// Print helpful note about server vs browser bundles\n\tif (mainInfo || browserInfo) {\n\t\tconsole.log(\n\t\t\t'\\x1b[90mNote: Browser bundles are shipped to users. Server binaries run on your server only.\\x1b[0m\\n',\n\t\t);\n\t}\n\n\t// ${String.fromCharCode(0x2501).repeat(1)}\n\t// BROWSER SECTION (what users download)\n\t// ${String.fromCharCode(0x2501).repeat(1)}\n\n\tif (browserInfo) {\n\t\tconsole.log(\n\t\t\t`\\x1b[1m\\x1b[36m${String.fromCharCode(0x2501).repeat(1)}\\x1b[0m`,\n\t\t);\n\t\tconsole.log(\n\t\t\t`\\x1b[1m\\x1b[36mBrowser Bundle: ${browserInfo.name}\\x1b[0m \\x1b[32m(shipped to browser)\\x1b[0m`,\n\t\t);\n\t\tconsole.log(\n\t\t\t`\\x1b[1m\\x1b[36m${String.fromCharCode(0x2501).repeat(1)}\\x1b[0m\\n`,\n\t\t);\n\n\t\tconst browserTable = new Table({\n\t\t\thead: ['Metric', 'Value'],\n\t\t\tcolWidths: [25, 35],\n\t\t\tstyle: {\n\t\t\t\thead: ['cyan', 'bold'],\n\t\t\t\tborder: ['gray'],\n\t\t\t},\n\t\t\tchars: ASCII_TABLE_CHARS,\n\t\t});\n\n\t\tbrowserTable.push(\n\t\t\t['Raw Size', formatBytes(browserInfo.size)],\n\t\t\t['Gzipped', formatBytes(browserInfo.gzippedSize)],\n\t\t\t[\n\t\t\t\t'Compression Ratio',\n\t\t\t\t`${((1 - browserInfo.gzippedSize / browserInfo.size) * 100).toFixed(1)}%`,\n\t\t\t],\n\t\t);\n\n\t\tconsole.log(browserTable.toString());\n\t\tconsole.log('');\n\n\t\t// Estimate transfer time for browser bundle\n\t\tconst gzipKB = browserInfo.gzippedSize / 1024;\n\t\tconst time3G = gzipKB / (1.6 * 128); // 1.6 Mbps = ~200 KB/s\n\t\tconst time4G = gzipKB / (9 * 128); // 9 Mbps = ~1125 KB/s\n\t\tconst time5G = gzipKB / (50 * 128); // 50 Mbps = ~6250 KB/s\n\t\tconst timeWiFi = gzipKB / (100 * 128); // 100 Mbps = ~12500 KB/s\n\n\t\tconst transferTable = new Table({\n\t\t\thead: ['Network', 'Throughput', 'Transfer Time'],\n\t\t\tcolWidths: [15, 15, 20],\n\t\t\tstyle: {\n\t\t\t\thead: ['cyan', 'bold'],\n\t\t\t\tborder: ['gray'],\n\t\t\t},\n\t\t\tchars: ASCII_TABLE_CHARS,\n\t\t});\n\n\t\ttransferTable.push(\n\t\t\t[\n\t\t\t\t'3G Fast',\n\t\t\t\t'1.6 Mbps',\n\t\t\t\ttime3G >= 1\n\t\t\t\t\t? `~${time3G.toFixed(2)}s`\n\t\t\t\t\t: `~${(time3G * 1000).toFixed(0)}ms`,\n\t\t\t],\n\t\t\t[\n\t\t\t\t'4G',\n\t\t\t\t'9 Mbps',\n\t\t\t\ttime4G >= 1\n\t\t\t\t\t? `~${time4G.toFixed(2)}s`\n\t\t\t\t\t: `~${(time4G * 1000).toFixed(0)}ms`,\n\t\t\t],\n\t\t\t[\n\t\t\t\t'5G',\n\t\t\t\t'50 Mbps',\n\t\t\t\ttime5G >= 1\n\t\t\t\t\t? `~${time5G.toFixed(2)}s`\n\t\t\t\t\t: `~${(time5G * 1000).toFixed(0)}ms`,\n\t\t\t],\n\t\t\t[\n\t\t\t\t'Wi-Fi 100',\n\t\t\t\t'100 Mbps',\n\t\t\t\ttimeWiFi >= 1\n\t\t\t\t\t? `~${timeWiFi.toFixed(2)}s`\n\t\t\t\t\t: `~${(timeWiFi * 1000).toFixed(0)}ms`,\n\t\t\t],\n\t\t);\n\n\t\tconsole.log(transferTable.toString());\n\t\tconsole.log(\n\t\t\t'\\x1b[90m Note: Estimates use gzipped size, ignore latency/HTTP overhead\\x1b[0m\\n',\n\t\t);\n\t}\n\n\t// Print browser dependency breakdown if available\n\n\tif (browserDepTree) {\n\t\tconst nodeModules = browserDepTree.root.children?.find(\n\t\t\t(c) => c.name === 'node_modules',\n\t\t);\n\t\tconst src = browserDepTree.root.children?.find((c) => c.name === 'src');\n\n\t\tif (nodeModules || src) {\n\t\t\tconsole.log(\n\t\t\t\t`\\x1b[1m\\x1b[36m${String.fromCharCode(0x2501).repeat(1)}\\x1b[0m`,\n\t\t\t);\n\t\t\tconsole.log(\n\t\t\t\t'\\x1b[1m\\x1b[36mBrowser Dependency Breakdown\\x1b[0m \\x1b[32m(shipped to browser)\\x1b[0m',\n\t\t\t);\n\t\t\tconsole.log(\n\t\t\t\t`\\x1b[1m\\x1b[36m${String.fromCharCode(0x2501).repeat(1)}\\x1b[0m\\n`,\n\t\t\t);\n\n\t\t\tif (nodeModules && nodeModules.size > 0) {\n\t\t\t\tconst nmPercent = (\n\t\t\t\t\t(nodeModules.size / browserDepTree.totalSize) *\n\t\t\t\t\t100\n\t\t\t\t).toFixed(1);\n\t\t\t\tconsole.log(\n\t\t\t\t\t`\\x1b[1mnode_modules: ${formatBytes(nodeModules.size)} (${nmPercent}%)\\x1b[0m\\n`,\n\t\t\t\t);\n\n\t\t\t\t// Show all packages by size\n\t\t\t\tconst packages = (nodeModules.children || [])\n\t\t\t\t\t.filter((pkg) => pkg.size > 0)\n\t\t\t\t\t.sort((a, b) => b.size - a.size);\n\n\t\t\t\tif (packages.length > 0) {\n\t\t\t\t\tconst pkgTable = new Table({\n\t\t\t\t\t\thead: ['Package / File', 'Raw Size', 'Gzipped', '% of Total'],\n\t\t\t\t\t\tcolWidths: [40, 15, 15, 12],\n\t\t\t\t\t\tstyle: {\n\t\t\t\t\t\t\thead: ['green', 'bold'],\n\t\t\t\t\t\t\tborder: ['gray'],\n\t\t\t\t\t\t},\n\t\t\t\t\t\tchars: ASCII_TABLE_CHARS,\n\t\t\t\t\t});\n\n\t\t\t\t\t// Show packages (all if --full, otherwise top packages with meaningful size)\n\t\t\t\t\tconst packagesToShow = fullOutput\n\t\t\t\t\t\t? packages\n\t\t\t\t\t\t: packages.filter(\n\t\t\t\t\t\t\t\t(pkg) => pkg.size / browserDepTree.totalSize >= 0.01,\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\tfor (const pkg of packagesToShow) {\n\t\t\t\t\t\tconst percentage = (\n\t\t\t\t\t\t\t(pkg.size / browserDepTree.totalSize) *\n\t\t\t\t\t\t\t100\n\t\t\t\t\t\t).toFixed(1);\n\t\t\t\t\t\t// Add package row with bold name and gzipped estimate\n\t\t\t\t\t\tconst pkgEstimatedGz = Math.round(\n\t\t\t\t\t\t\t(pkg.size * (browserInfo?.gzippedSize || 0)) /\n\t\t\t\t\t\t\t\t(browserInfo?.size || 1),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tpkgTable.push([\n\t\t\t\t\t\t\t`\\x1b[1m${pkg.name}\\x1b[0m`,\n\t\t\t\t\t\t\tformatBytes(pkg.size),\n\t\t\t\t\t\t\tformatBytes(pkgEstimatedGz),\n\t\t\t\t\t\t\t`${percentage}%`,\n\t\t\t\t\t\t]);\n\n\t\t\t\t\t\t// Add file rows (indented)\n\t\t\t\t\t\tconst files = (pkg.children || [])\n\t\t\t\t\t\t\t.filter((f) => f.size > 0)\n\t\t\t\t\t\t\t.sort((a, b) => b.size - a.size);\n\n\t\t\t\t\t\t// Show files (all if --full, otherwise top 10)\n\t\t\t\t\t\tconst filesToShow = fullOutput ? files : files.slice(0, 10);\n\t\t\t\t\t\tfor (const file of filesToShow) {\n\t\t\t\t\t\t\tconst filePercent = (\n\t\t\t\t\t\t\t\t(file.size / browserDepTree.totalSize) *\n\t\t\t\t\t\t\t\t100\n\t\t\t\t\t\t\t).toFixed(1);\n\t\t\t\t\t\t\t// Estimate gzipped size using overall compression ratio\n\t\t\t\t\t\t\tconst estimatedGz = Math.round(\n\t\t\t\t\t\t\t\t(file.size * (browserInfo?.gzippedSize || 0)) /\n\t\t\t\t\t\t\t\t\t(browserInfo?.size || 1),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tpkgTable.push([\n\t\t\t\t\t\t\t\t` ${String.fromCharCode(0x21b3)} ${file.name}`,\n\t\t\t\t\t\t\t\tformatBytes(file.size),\n\t\t\t\t\t\t\t\tformatBytes(estimatedGz),\n\t\t\t\t\t\t\t\t`${filePercent}%`,\n\t\t\t\t\t\t\t]);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (!fullOutput && files.length > 10) {\n\t\t\t\t\t\t\tpkgTable.push([\n\t\t\t\t\t\t\t\t` ... ${files.length - 10} more files`,\n\t\t\t\t\t\t\t\t'',\n\t\t\t\t\t\t\t\t'',\n\t\t\t\t\t\t\t\t'',\n\t\t\t\t\t\t\t]);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tconsole.log(pkgTable.toString());\n\t\t\t\t\tconsole.log('');\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (src && src.size > 0) {\n\t\t\t\tconst srcPercent = (\n\t\t\t\t\t(src.size / browserDepTree.totalSize) *\n\t\t\t\t\t100\n\t\t\t\t).toFixed(1);\n\t\t\t\tconsole.log(\n\t\t\t\t\t`\\x1b[1msrc: ${formatBytes(src.size)} (${srcPercent}%)\\x1b[0m\\n`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\t// Print browser chunks summary\n\tconst browserChunks = Object.entries(stats.byCollection).filter(\n\t\t([collection]) => collection !== 'binaries',\n\t);\n\tif (browserChunks.length > 0) {\n\t\tfor (const [collection, bundles] of browserChunks) {\n\t\t\tconst collectionTotal = bundles.reduce((sum, b) => sum + b.size, 0);\n\t\t\tconst collectionGzipped = bundles.reduce(\n\t\t\t\t(sum, b) => sum + b.gzippedSize,\n\t\t\t\t0,\n\t\t\t);\n\n\t\t\tconsole.log(\n\t\t\t\t`\\x1b[1mBrowser Chunks: ${collection}\\x1b[0m \\x1b[32m(shipped to browser)\\x1b[0m`,\n\t\t\t);\n\t\t\tconsole.log(\n\t\t\t\t` Total: ${formatBytes(collectionTotal)} (${formatBytes(collectionGzipped)} gzipped)\\n`,\n\t\t\t);\n\n\t\t\t// Sort by size descending\n\t\t\tconst sorted = bundles.sort((a, b) => b.size - a.size);\n\n\t\t\tconst bundleTable = new Table({\n\t\t\t\thead: ['Bundle', 'Size', 'Gzipped', '% of Total'],\n\t\t\t\tcolWidths: [40, 12, 12, 12],\n\t\t\t\tstyle: {\n\t\t\t\t\thead: ['green', 'bold'],\n\t\t\t\t\tborder: ['gray'],\n\t\t\t\t},\n\t\t\t\tchars: ASCII_TABLE_CHARS,\n\t\t\t});\n\n\t\t\tfor (const bundle of sorted) {\n\t\t\t\tconst percentage = ((bundle.size / stats.totalSize) * 100).toFixed(1);\n\t\t\t\tbundleTable.push([\n\t\t\t\t\tbundle.name,\n\t\t\t\t\tformatBytes(bundle.size),\n\t\t\t\t\tformatBytes(bundle.gzippedSize),\n\t\t\t\t\t`${percentage}%`,\n\t\t\t\t]);\n\t\t\t}\n\n\t\t\tconsole.log(bundleTable.toString());\n\t\t\tconsole.log('');\n\t\t}\n\t}\n\n\t// ${String.fromCharCode(0x2501).repeat(1)}\n\t// SERVER SECTION (not shipped to browser)\n\t// ${String.fromCharCode(0x2501).repeat(1)}\n\n\t// Print main bundle info if available\n\tif (mainInfo) {\n\t\tconsole.log(\n\t\t\t`\\x1b[1m\\x1b[36m${String.fromCharCode(0x2501).repeat(1)}\\x1b[0m`,\n\t\t);\n\t\tconsole.log(\n\t\t\t`\\x1b[1m\\x1b[36mServer Binary: ${mainInfo.name}\\x1b[0m \\x1b[90m(not shipped to browser)\\x1b[0m`,\n\t\t);\n\t\tconsole.log(\n\t\t\t`\\x1b[1m\\x1b[36m${String.fromCharCode(0x2501).repeat(1)}\\x1b[0m\\n`,\n\t\t);\n\n\t\tconst mainTable = new Table({\n\t\t\thead: ['Metric', 'Value'],\n\t\t\tcolWidths: [25, 35],\n\t\t\tstyle: {\n\t\t\t\thead: ['cyan', 'bold'],\n\t\t\t\tborder: ['gray'],\n\t\t\t},\n\t\t\tchars: ASCII_TABLE_CHARS,\n\t\t});\n\n\t\tmainTable.push(['Binary Size', formatBytes(mainInfo.size)]);\n\n\t\tconsole.log(mainTable.toString());\n\t\tconsole.log('');\n\t}\n\n\t// Print detailed dependency breakdown if available\n\tif (depTree) {\n\t\tconst nodeModules = depTree.root.children?.find(\n\t\t\t(c) => c.name === 'node_modules',\n\t\t);\n\t\tconst src = depTree.root.children?.find((c) => c.name === 'src');\n\n\t\tif (nodeModules || src) {\n\t\t\tconsole.log(\n\t\t\t\t`\\x1b[1m\\x1b[36m${String.fromCharCode(0x2501).repeat(1)}\\x1b[0m`,\n\t\t\t);\n\t\t\tconsole.log(\n\t\t\t\t'\\x1b[1m\\x1b[36mServer Dependency Breakdown\\x1b[0m \\x1b[90m(server-side only)\\x1b[0m',\n\t\t\t);\n\t\t\tconsole.log(\n\t\t\t\t`\\x1b[1m\\x1b[36m${String.fromCharCode(0x2501).repeat(1)}\\x1b[0m\\n`,\n\t\t\t);\n\n\t\t\tif (nodeModules && nodeModules.size > 0) {\n\t\t\t\tconst nmPercent = (\n\t\t\t\t\t(nodeModules.size / depTree.totalSize) *\n\t\t\t\t\t100\n\t\t\t\t).toFixed(1);\n\t\t\t\tconsole.log(\n\t\t\t\t\t`\\x1b[1mnode_modules: ${formatBytes(nodeModules.size)} (${nmPercent}%)\\x1b[0m\\n`,\n\t\t\t\t);\n\n\t\t\t\t// Show all packages by size\n\t\t\t\tconst packages = (nodeModules.children || [])\n\t\t\t\t\t.filter((pkg) => pkg.size > 0)\n\t\t\t\t\t.sort((a, b) => b.size - a.size);\n\n\t\t\t\tif (packages.length > 0) {\n\t\t\t\t\tconst pkgTable = new Table({\n\t\t\t\t\t\thead: ['Package / File', 'Size', '% of Total'],\n\t\t\t\t\t\tcolWidths: [50, 20, 12],\n\t\t\t\t\t\tstyle: {\n\t\t\t\t\t\t\thead: ['red', 'bold'],\n\t\t\t\t\t\t\tborder: ['gray'],\n\t\t\t\t\t\t},\n\t\t\t\t\t\tchars: ASCII_TABLE_CHARS,\n\t\t\t\t\t});\n\n\t\t\t\t\t// Show packages (all if --full, otherwise top packages with meaningful size)\n\t\t\t\t\tconst packagesToShow = fullOutput\n\t\t\t\t\t\t? packages\n\t\t\t\t\t\t: packages.filter((pkg) => pkg.size / depTree.totalSize >= 0.01);\n\n\t\t\t\t\tfor (const pkg of packagesToShow) {\n\t\t\t\t\t\tconst percentage = ((pkg.size / depTree.totalSize) * 100).toFixed(\n\t\t\t\t\t\t\t1,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tpkgTable.push([\n\t\t\t\t\t\t\t`\\x1b[1m${pkg.name}\\x1b[0m`,\n\t\t\t\t\t\t\tformatBytes(pkg.size),\n\t\t\t\t\t\t\t`${percentage}%`,\n\t\t\t\t\t\t]);\n\n\t\t\t\t\t\t// Add file rows (indented)\n\t\t\t\t\t\tconst files = (pkg.children || [])\n\t\t\t\t\t\t\t.filter((f) => f.size > 0)\n\t\t\t\t\t\t\t.sort((a, b) => b.size - a.size);\n\n\t\t\t\t\t\t// Show files (all if --full, otherwise top 10)\n\t\t\t\t\t\tconst filesToShow = fullOutput ? files : files.slice(0, 10);\n\t\t\t\t\t\tfor (const file of filesToShow) {\n\t\t\t\t\t\t\tconst filePercent = (\n\t\t\t\t\t\t\t\t(file.size / depTree.totalSize) *\n\t\t\t\t\t\t\t\t100\n\t\t\t\t\t\t\t).toFixed(1);\n\t\t\t\t\t\t\tpkgTable.push([\n\t\t\t\t\t\t\t\t` ${String.fromCharCode(0x21b3)} ${file.name}`,\n\t\t\t\t\t\t\t\tformatBytes(file.size),\n\t\t\t\t\t\t\t\t`${filePercent}%`,\n\t\t\t\t\t\t\t]);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (!fullOutput && files.length > 10) {\n\t\t\t\t\t\t\tpkgTable.push([` ... ${files.length - 10} more files`, '', '']);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tconsole.log(pkgTable.toString());\n\t\t\t\t\tconsole.log('');\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (src && src.size > 0) {\n\t\t\t\tconst srcPercent = ((src.size / depTree.totalSize) * 100).toFixed(1);\n\t\t\t\tconsole.log(\n\t\t\t\t\t`\\x1b[1msrc: ${formatBytes(src.size)} (${srcPercent}%)\\x1b[0m\\n`,\n\t\t\t\t);\n\n\t\t\t\t// Show src breakdown\n\t\t\t\tconst srcItems = (src.children || [])\n\t\t\t\t\t.filter((item) => item.size > 0)\n\t\t\t\t\t.sort((a, b) => b.size - a.size);\n\n\t\t\t\tif (srcItems.length > 0) {\n\t\t\t\t\tconst srcTable = new Table({\n\t\t\t\t\t\thead: ['Source', 'Size', '% of Total'],\n\t\t\t\t\t\tcolWidths: [45, 12, 12],\n\t\t\t\t\t\tstyle: {\n\t\t\t\t\t\t\thead: ['green', 'bold'],\n\t\t\t\t\t\t\tborder: ['gray'],\n\t\t\t\t\t\t},\n\t\t\t\t\t\tchars: ASCII_TABLE_CHARS,\n\t\t\t\t\t});\n\n\t\t\t\t\tfor (const item of srcItems) {\n\t\t\t\t\t\tconst percentage = ((item.size / depTree.totalSize) * 100).toFixed(\n\t\t\t\t\t\t\t1,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tsrcTable.push([\n\t\t\t\t\t\t\titem.name,\n\t\t\t\t\t\t\tformatBytes(item.size),\n\t\t\t\t\t\t\t`${percentage}%`,\n\t\t\t\t\t\t]);\n\t\t\t\t\t}\n\n\t\t\t\t\tconsole.log(srcTable.toString());\n\t\t\t\t\tconsole.log('');\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// ${String.fromCharCode(0x2501).repeat(1)}\n\t// SUMMARY\n\t// ${String.fromCharCode(0x2501).repeat(1)}\n\n\tconsole.log(`\\x1b[1m\\x1b[36m${String.fromCharCode(0x2501).repeat(1)}\\x1b[0m`);\n\tconsole.log('\\x1b[1m\\x1b[36mSummary\\x1b[0m');\n\tconsole.log(\n\t\t`\\x1b[1m\\x1b[36m${String.fromCharCode(0x2501).repeat(1)}\\x1b[0m\\n`,\n\t);\n\n\tconst summaryTable = new Table({\n\t\thead: ['Metric', 'Value'],\n\t\tcolWidths: [25, 35],\n\t\tstyle: {\n\t\t\thead: ['cyan', 'bold'],\n\t\t\tborder: ['gray'],\n\t\t},\n\t\tchars: ASCII_TABLE_CHARS,\n\t});\n\n\t// Count dependencies separately for browser and server\n\tconst browserNodeModules = browserDepTree?.root.children?.find(\n\t\t(c) => c.name === 'node_modules',\n\t);\n\tconst browserDepCount = browserNodeModules?.children?.length || 0;\n\n\tconst serverNodeModules = depTree?.root.children?.find(\n\t\t(c) => c.name === 'node_modules',\n\t);\n\tconst serverDepCount = serverNodeModules?.children?.length || 0;\n\n\t// Check for actual dist/ binary (from reroute build)\n\tlet actualServerBinarySize: number | null = null;\n\tlet actualServerBinaryGzipped: number | null = null;\n\ttry {\n\t\tconst distDir = join(process.cwd(), 'dist');\n\t\tif (existsSync(distDir)) {\n\t\t\tconst files = await readdir(distDir);\n\t\t\tfor (const file of files) {\n\t\t\t\tconst filePath = join(distDir, file);\n\t\t\t\tconst stats = statSync(filePath);\n\t\t\t\tif (stats.isFile() && !file.includes('.')) {\n\t\t\t\t\tactualServerBinarySize = stats.size;\n\t\t\t\t\t// Estimate gzipped size\n\t\t\t\t\tconst content = await readFile(filePath);\n\t\t\t\t\tactualServerBinaryGzipped = Bun.gzipSync(content).length;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t} catch {}\n\n\tconst browserBundleDisplay = browserInfo\n\t\t? `${formatBytes(browserInfo.size)} (${formatBytes(browserInfo.gzippedSize)} gz)`\n\t\t: 'N/A';\n\n\tconst serverBinaryDisplay = actualServerBinarySize\n\t\t? `${formatBytes(actualServerBinarySize)}${actualServerBinaryGzipped ? ` (${formatBytes(actualServerBinaryGzipped)} gz)` : ''}`\n\t\t: mainInfo\n\t\t\t? formatBytes(mainInfo.size)\n\t\t\t: 'N/A';\n\n\tsummaryTable.push(\n\t\t['Browser Dependencies', browserDepCount.toString()],\n\t\t['Browser Bundle', browserBundleDisplay],\n\t\t['Server Dependencies', serverDepCount.toString()],\n\t\t['Final Server Binary', serverBinaryDisplay],\n\t);\n\n\tconsole.log(summaryTable.toString());\n\tconsole.log('');\n\n\t// Add explanatory note about server binary size\n\tif (actualServerBinarySize) {\n\t\tconsole.log(\n\t\t\t'\\x1b[90mNote: Final Server Binary is a standalone executable that includes the Bun runtime,\\x1b[0m',\n\t\t);\n\t\tconsole.log(\n\t\t\t'\\x1b[90m your application code, and all dependencies. This allows it to run without\\x1b[0m',\n\t\t);\n\t\tconsole.log(\n\t\t\t'\\x1b[90m requiring Node.js or Bun to be installed on the deployment server.\\x1b[0m',\n\t\t);\n\t\tconsole.log('');\n\t}\n\n\tif (stats.bundles.length === 0) {\n\t\tconsole.log(\n\t\t\tcolorizeLogPrefixAnsi(\n\t\t\t\t'[reroute/analyze] No bundles found. Run `reroute build` first. For production builds, use NODE_ENV=production or --prod flag.\\n',\n\t\t\t),\n\t\t);\n\t}\n}\n\nexport default async function analyze(args: string[]): Promise<void> {\n\ttry {\n\t\tconst cwd = process.cwd();\n\t\tconst outputHtml = args.includes('--html');\n\t\tconst openBrowser = args.includes('--open') || args.includes('-o');\n\t\tconst isProd = isProductionMode(args);\n\n\t\t// Extract search term from --search flag\n\t\tconst searchIndex = args.indexOf('--search');\n\t\tconst initialSearch =\n\t\t\tsearchIndex !== -1 && args[searchIndex + 1] ? args[searchIndex + 1] : '';\n\n\t\t// Ensure .reroute artifacts exist by running build if needed\n\t\tconst rerouteIndexPath = join(cwd, '.reroute', 'index.ts');\n\t\tif (!existsSync(rerouteIndexPath)) {\n\t\t\tconsole.log(\n\t\t\t\tcolorizeLogPrefixAnsi(\n\t\t\t\t\t'[reroute/analyze] .reroute artifacts not found, running build...\\n',\n\t\t\t\t),\n\t\t\t);\n\t\t\tconst { spawn } = await import('node:child_process');\n\t\t\tconst { getRerouteCommand } = await import('./lib/command');\n\n\t\t\tconst rerouteCmd = getRerouteCommand();\n\t\t\tconst useShell = rerouteCmd.includes(' ');\n\n\t\t\tconst buildCommand = useShell ? `${rerouteCmd} build` : rerouteCmd;\n\t\t\tconst buildArgs = useShell ? [] : ['build'];\n\n\t\t\tawait new Promise<void>((resolve, reject) => {\n\t\t\t\tconst buildProcess = spawn(buildCommand, buildArgs, {\n\t\t\t\t\tstdio: 'inherit',\n\t\t\t\t\tshell: useShell,\n\t\t\t\t});\n\n\t\t\t\tbuildProcess.on('exit', (code) => {\n\t\t\t\t\tif (code !== null && code !== 0) {\n\t\t\t\t\t\treject(new Error(`Build exited with code ${code}`));\n\t\t\t\t\t} else {\n\t\t\t\t\t\tresolve();\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tbuildProcess.on('error', (error) => {\n\t\t\t\t\treject(error);\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tconsole.log(colorizeLogPrefixAnsi('[reroute/analyze] Build complete\\n'));\n\t\t}\n\n\t\tconsole.log(\n\t\t\tcolorizeLogPrefixAnsi('[reroute/analyze] Scanning for bundles...\\n'),\n\t\t);\n\n\t\tconst bundles = await findBundles(cwd);\n\t\tconst stats = calculateStats(bundles);\n\n\t\t// Find and analyze the browser entrypoint\n\t\tconsole.log(\n\t\t\tcolorizeLogPrefixAnsi(\n\t\t\t\t'[reroute/analyze] Building browser entrypoint for analysis...\\n',\n\t\t\t),\n\t\t);\n\t\tconst browserEntry = await findBrowserEntry(cwd);\n\t\tlet browserDepTree: DepTree | null = null;\n\t\tlet browserInfo: {\n\t\t\tname: string;\n\t\t\tsize: number;\n\t\t\tgzippedSize: number;\n\t\t} | null = null;\n\n\t\tif (browserEntry) {\n\t\t\tconsole.log(\n\t\t\t\tcolorizeLogPrefixAnsi(\n\t\t\t\t\t`[reroute/analyze] Analyzing browser bundle: ${relative(cwd, browserEntry)}\\n`,\n\t\t\t\t),\n\t\t\t);\n\t\t\tbrowserDepTree = await buildDependencyTree(browserEntry, cwd);\n\n\t\t\tif (!browserDepTree) {\n\t\t\t\tconsole.log(\n\t\t\t\t\tcolorizeLogPrefixAnsi(\n\t\t\t\t\t\t'[reroute/analyze] Could not build dependency tree from browser bundle. Sourcemap may be missing or invalid.\\n',\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tconst browserStat = await stat(browserEntry);\n\t\t\t\tconst browserContent = await readFile(browserEntry);\n\t\t\t\tconst browserGzipped = Bun.gzipSync(browserContent).length;\n\t\t\t\tbrowserInfo = {\n\t\t\t\t\tname: basename(browserEntry),\n\t\t\t\t\tsize: browserStat.size,\n\t\t\t\t\tgzippedSize: browserGzipped,\n\t\t\t\t};\n\t\t\t} catch {}\n\t\t} else {\n\t\t\tconsole.log(\n\t\t\t\tcolorizeLogPrefixAnsi(\n\t\t\t\t\t'[reroute/analyze] Could not build browser entrypoint for analysis. Browser dependency breakdown will not be available.\\n',\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\n\t\t// Build dependency tree for server binary\n\t\t// Always build a fresh server bundle for analysis with all deps bundled\n\t\tlet entry: string | null = null;\n\t\tlet depTree: DepTree | null = null;\n\t\tlet mainInfo: { name: string; size: number; gzippedSize: number } | null =\n\t\t\tnull;\n\n\t\tconst srcEntry = join(cwd, 'src', 'index.ts');\n\t\tif (existsSync(srcEntry)) {\n\t\t\tconsole.log(\n\t\t\t\tcolorizeLogPrefixAnsi(\n\t\t\t\t\t`[reroute/analyze] Building server binary for analysis...\\n`,\n\t\t\t\t),\n\t\t\t);\n\t\t\tconst { mkdir } = await import('node:fs/promises');\n\t\t\tconst serverAnalysisDir = join(cwd, '.reroute', 'server');\n\t\t\tawait mkdir(serverAnalysisDir, { recursive: true });\n\n\t\t\t// Use Bun.build API directly with NO externals\n\t\t\tconst result = await Bun.build({\n\t\t\t\tentrypoints: [srcEntry],\n\t\t\t\ttarget: 'bun',\n\t\t\t\tminify: isProd,\n\t\t\t\tsourcemap: 'linked',\n\t\t\t\texternal: [], // Don't externalize anything\n\t\t\t\tsplitting: false,\n\t\t\t});\n\n\t\t\tif (result.success && result.outputs.length > 0) {\n\t\t\t\tconst output = result.outputs[0];\n\t\t\t\tconst code = await output.text();\n\t\t\t\tconst analysisEntry = join(serverAnalysisDir, 'index.js');\n\t\t\t\tawait writeFile(analysisEntry, code, 'utf-8');\n\n\t\t\t\t// Write sourcemap if available\n\t\t\t\tconst mapOutput = result.outputs.find((o) => o.path.endsWith('.map'));\n\t\t\t\tif (mapOutput) {\n\t\t\t\t\tconst mapContent = await mapOutput.text();\n\t\t\t\t\tawait writeFile(`${analysisEntry}.map`, mapContent, 'utf-8');\n\t\t\t\t}\n\n\t\t\t\tentry = analysisEntry;\n\t\t\t}\n\t\t}\n\n\t\tif (entry) {\n\t\t\tconsole.log(\n\t\t\t\tcolorizeLogPrefixAnsi(\n\t\t\t\t\t`[reroute/analyze] Building dependency graph for ${relative(cwd, entry)}\\n`,\n\t\t\t\t),\n\t\t\t);\n\t\t\tdepTree = await buildDependencyTree(entry, cwd);\n\n\t\t\t// Get actual installed package sizes as supplementary data\n\t\t\tconsole.log(\n\t\t\t\tcolorizeLogPrefixAnsi(\n\t\t\t\t\t`[reroute/analyze] Checking installed package sizes...\\n`,\n\t\t\t\t),\n\t\t\t);\n\t\t\tconst installedSizes = await getInstalledPackageSizes(cwd);\n\n\t\t\t// Add missing packages to the tree based on package.json\n\t\t\tif (depTree) {\n\t\t\t\tconst packageJsonPath = join(cwd, 'package.json');\n\t\t\t\tif (existsSync(packageJsonPath)) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst packageJson = JSON.parse(\n\t\t\t\t\t\t\tawait readFile(packageJsonPath, 'utf-8'),\n\t\t\t\t\t\t);\n\t\t\t\t\t\t// Only include runtime dependencies (not devDependencies like typescript, @types)\n\t\t\t\t\t\tconst runtimeDeps = packageJson.dependencies || {};\n\n\t\t\t\t\t\tconst nodeModulesNode = depTree.root.children?.find(\n\t\t\t\t\t\t\t(c) => c.name === 'node_modules',\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (nodeModulesNode) {\n\t\t\t\t\t\t\tconst trackedPkgs = new Set(\n\t\t\t\t\t\t\t\tnodeModulesNode.children?.map((c) => c.name) || [],\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t// Add missing packages with their installed sizes\n\t\t\t\t\t\t\tfor (const pkgName of Object.keys(runtimeDeps)) {\n\t\t\t\t\t\t\t\tif (!trackedPkgs.has(pkgName) && installedSizes.has(pkgName)) {\n\t\t\t\t\t\t\t\t\tnodeModulesNode.children?.push({\n\t\t\t\t\t\t\t\t\t\tname: pkgName,\n\t\t\t\t\t\t\t\t\t\tpath: join(cwd, 'node_modules', pkgName),\n\t\t\t\t\t\t\t\t\t\tsize: installedSizes.get(pkgName) || 0,\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// Recompute total size\n\t\t\t\t\t\t\tnodeModulesNode.size =\n\t\t\t\t\t\t\t\tnodeModulesNode.children?.reduce((sum, c) => {\n\t\t\t\t\t\t\t\t\tif (c.children && c.children.length > 0) {\n\t\t\t\t\t\t\t\t\t\tc.size = c.children.reduce((s, child) => s + child.size, 0);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\treturn sum + c.size;\n\t\t\t\t\t\t\t\t}, 0) || 0;\n\n\t\t\t\t\t\t\tdepTree.root.size =\n\t\t\t\t\t\t\t\tdepTree.root.children?.reduce((sum, c) => sum + c.size, 0) || 0;\n\t\t\t\t\t\t\tdepTree.totalSize = depTree.root.size;\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch (_e) {\n\t\t\t\t\t\t// Silently continue if package.json parsing fails\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Get main bundle info\n\t\t\ttry {\n\t\t\t\tconst entryStat = await stat(entry);\n\t\t\t\tconst entryContent = await readFile(entry);\n\t\t\t\tconst entryGzipped = Bun.gzipSync(entryContent).length;\n\t\t\t\tmainInfo = {\n\t\t\t\t\tname: basename(entry),\n\t\t\t\t\tsize: entryStat.size,\n\t\t\t\t\tgzippedSize: entryGzipped,\n\t\t\t\t};\n\t\t\t} catch {}\n\t\t}\n\n\t\t// Print console report with dependency info\n\t\tconst fullOutput = args.includes('--full');\n\t\tawait printConsoleReport(\n\t\t\tstats,\n\t\t\tdepTree,\n\t\t\tmainInfo,\n\t\t\tbrowserDepTree,\n\t\t\tbrowserInfo,\n\t\t\tfullOutput,\n\t\t);\n\n\t\t// Generate HTML report if requested\n\t\tif (outputHtml || openBrowser) {\n\t\t\tconst htmlPath = join(cwd, '.reroute', 'analysis.html');\n\t\t\tconst html = await generateHTMLReport(\n\t\t\t\tstats,\n\t\t\t\tdepTree,\n\t\t\t\tmainInfo,\n\t\t\t\tbrowserDepTree,\n\t\t\t\tbrowserInfo,\n\t\t\t\tinitialSearch,\n\t\t\t);\n\n\t\t\t// Ensure .reroute directory exists\n\t\t\tconst { mkdir } = await import('node:fs/promises');\n\t\t\tawait mkdir(join(cwd, '.reroute'), { recursive: true });\n\n\t\t\tawait writeFile(htmlPath, html, 'utf-8');\n\t\t\tconsole.log(\n\t\t\t\tcolorizeLogPrefixAnsi(\n\t\t\t\t\t`[reroute/analyze] HTML report generated: ${relative(cwd, htmlPath)}\\n`,\n\t\t\t\t),\n\t\t\t);\n\n\t\t\tif (openBrowser) {\n\t\t\t\ttry {\n\t\t\t\t\t// Use Bun's spawn to open the file with the system's default application\n\t\t\t\t\tconst { spawn } = await import('node:child_process');\n\t\t\t\t\tconst platform = process.platform;\n\t\t\t\t\tlet command: string;\n\t\t\t\t\tlet commandArgs: string[];\n\n\t\t\t\t\tif (platform === 'darwin') {\n\t\t\t\t\t\tcommand = 'open';\n\t\t\t\t\t\tcommandArgs = [htmlPath];\n\t\t\t\t\t} else if (platform === 'win32') {\n\t\t\t\t\t\tcommand = 'cmd';\n\t\t\t\t\t\tcommandArgs = ['/c', 'start', '', htmlPath];\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcommand = 'xdg-open';\n\t\t\t\t\t\tcommandArgs = [htmlPath];\n\t\t\t\t\t}\n\n\t\t\t\t\tspawn(command, commandArgs, { detached: true, stdio: 'ignore' });\n\t\t\t\t\tconsole.log(\n\t\t\t\t\t\tcolorizeLogPrefixAnsi(\n\t\t\t\t\t\t\t'[reroute/analyze] Opened report in browser\\n',\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t} catch {\n\t\t\t\t\tconsole.warn(\n\t\t\t\t\t\tcolorizeLogPrefixAnsi(\n\t\t\t\t\t\t\t`[reroute/analyze] Could not open browser automatically. Please open ${htmlPath} manually.\\n`,\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t} catch (error) {\n\t\tconsole.error(\n\t\t\tcolorizeLogPrefixAnsi(`[reroute/analyze] Error: ${String(error)}\\n`),\n\t\t);\n\t\tthrow error;\n\t}\n}\n",
|
|
38
49
|
"#!/usr/bin/env bun\n\n/**\n * Reroute CLI\n *\n * Command-line interface for Reroute framework operations.\n */\n\nimport path from 'node:path';\n\n// Version and commit injected at build time\ndeclare const __REROUTE_VERSION__: string;\ndeclare const __REROUTE_COMMIT__: string;\n\nconst commands = {\n\tinit: () => import('./commands/init'),\n\tgen: () => import('./commands/gen'),\n\tdev: () => import('./commands/dev'),\n\tstart: () => import('./commands/start'),\n\tbuild: () => import('./commands/build'),\n\tanalyze: () => import('./commands/analyze'),\n};\n\ntype Command = keyof typeof commands;\n\nasync function main() {\n\tconst args = process.argv.slice(2);\n\n\tif (args[0] === '--version' || args[0] === '-v') {\n\t\tconst version = await getVersionString();\n\t\tconsole.log(version);\n\t\tprocess.exit(0);\n\t}\n\n\tif (args.length === 0 || args[0] === '--help' || args[0] === '-h') {\n\t\tawait printHelp();\n\t\tprocess.exit(0);\n\t}\n\n\tconst command = args[0] as Command;\n\n\tif (!commands[command]) {\n\t\tconsole.error(`Unknown command: ${command}`);\n\t\tconsole.error('');\n\t\tawait printHelp();\n\t\tprocess.exit(1);\n\t}\n\n\ttry {\n\t\tconst commandArgs = args.slice(1);\n\n\t\t// Handle --prod flag globally by setting NODE_ENV\n\t\tif (commandArgs.includes('--prod')) {\n\t\t\tprocess.env.NODE_ENV = 'production';\n\t\t\tif (typeof Bun !== 'undefined') {\n\t\t\t\tBun.env.NODE_ENV = 'production';\n\t\t\t}\n\t\t}\n\n\t\tconst module = await commands[command]();\n\t\tawait module.default(commandArgs);\n\t} catch (error) {\n\t\tconsole.error('Error executing command:', error);\n\t\tprocess.exit(1);\n\t}\n}\n\nasync function printHelp() {\n\tconsole.log('');\n\tconsole.log(await getVersionString());\n\tconsole.log('');\n\tconsole.log('');\n\tconsole.log('Usage:');\n\tconsole.log('');\n\tconsole.log(' reroute <command> [options]');\n\tconsole.log('');\n\tconsole.log('');\n\tconsole.log('Commands:');\n\tconsole.log('');\n\tconsole.log(' init Scaffold a new Reroute project');\n\tconsole.log(' gen Generate content registry and static assets');\n\tconsole.log(' dev Start development environment');\n\tconsole.log(' start Run production-like server locally');\n\tconsole.log(' build Build production binary');\n\tconsole.log(' analyze Analyze bundle sizes and generate report');\n\tconsole.log('');\n\tconsole.log('');\n\tconsole.log('Options:');\n\tconsole.log('');\n\tconsole.log(' -h, --help Show help');\n\tconsole.log(' -v, --version Show version');\n\tconsole.log(\n\t\t' --prod Enable production mode (same as NODE_ENV=production)',\n\t);\n\tconsole.log('');\n\tconsole.log('');\n\tconsole.log('Examples:');\n\tconsole.log('');\n\tconsole.log(' reroute init my-app');\n\tconsole.log('');\n\tconsole.log(' reroute gen');\n\tconsole.log(' reroute gen -w');\n\tconsole.log(' reroute gen --watch');\n\tconsole.log('');\n\tconsole.log(' reroute dev');\n\tconsole.log(' reroute dev -s');\n\tconsole.log(' reroute dev --single');\n\tconsole.log('');\n\tconsole.log(' reroute start');\n\tconsole.log('');\n\tconsole.log(' reroute build');\n\tconsole.log(' reroute build --prod');\n\tconsole.log(' reroute build -o ./dist/myapp');\n\tconsole.log(' reroute build --outfile ./dist/myapp');\n\tconsole.log('');\n\tconsole.log(' reroute analyze');\n\tconsole.log(' reroute analyze --prod');\n\tconsole.log(' reroute analyze --full');\n\tconsole.log(' reroute analyze --html');\n\tconsole.log(' reroute analyze --open');\n}\n\nasync function getVersionString(): Promise<string> {\n\tconst version = await getVersion();\n\tconst commit = await getCommit();\n\treturn `Reroute v${version} ${commit}`;\n}\n\nasync function getVersion(): Promise<string> {\n\t// Use version injected at build time\n\tif (typeof __REROUTE_VERSION__ !== 'undefined') {\n\t\treturn __REROUTE_VERSION__;\n\t}\n\n\t// Fallback for development: try to find package.json\n\tconst possiblePaths = [\n\t\tpath.join(import.meta.dir, '../../../package.json'),\n\t\tpath.join(import.meta.dir, '../../package.json'),\n\t\tpath.join(import.meta.dir, '../package.json'),\n\t];\n\n\tfor (const pkgPath of possiblePaths) {\n\t\ttry {\n\t\t\tconst pkg = await Bun.file(pkgPath).json();\n\t\t\treturn pkg.version;\n\t\t} catch {}\n\t}\n\n\treturn 'unknown';\n}\n\nasync function getCommit(): Promise<string> {\n\t// Use commit injected at build time\n\tif (typeof __REROUTE_COMMIT__ !== 'undefined') {\n\t\treturn __REROUTE_COMMIT__;\n\t}\n\n\t// Fallback for development\n\treturn 'dev';\n}\n\nmain();\n"
|
|
39
50
|
],
|
|
40
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAMA,eAAsB,gBAAgB,GAAoB;AAAA,EACzD,MAAM,UAAU,MAAM,WAAW;AAAA,EACjC,MAAM,SAAS,MAAM,UAAU;AAAA,EAC/B,OAAO,YAAY,WAAW;AAAA;AAG/B,eAAe,UAAU,GAAoB;AAAA,EAE5C,IAAI,MAA4C;AAAA,IAC/C,OAAO;AAAA,EACR;AAAA,EAGA,MAAM,gBAAgB;AAAA,IACrB,KAAK,KAAK,YAAY,KAAK,0BAA0B;AAAA,IACrD,KAAK,KAAK,YAAY,KAAK,uBAAuB;AAAA,IAClD,KAAK,KAAK,YAAY,KAAK,oBAAoB;AAAA,IAC/C,KAAK,KAAK,YAAY,KAAK,iBAAiB;AAAA,EAC7C;AAAA,EAEA,WAAW,WAAW,eAAe;AAAA,IACpC,IAAI;AAAA,MACH,MAAM,MAAM,MAAM,IAAI,KAAK,OAAO,EAAE,KAAK;AAAA,MACzC,OAAO,IAAI;AAAA,MACV,MAAM;AAAA,EACT;AAAA,EAEA,OAAO;AAAA;AAGR,eAAe,SAAS,GAAoB;AAAA,EAE3C,IAAI,MAA2C;AAAA,IAC9C,OAAO;AAAA,EACR;AAAA,EAGA,OAAO;AAAA;AAAA;;;;;;;ACnCR;AACA;AACA;AAQA,eAA8B,IAAI,CAAC,MAAgB;AAAA,EAClD,MAAM,UAAU,UAAU,IAAI;AAAA,EAE9B,IAAI,CAAC,SAAS;AAAA,IACb,MAAM,UAAU;AAAA,IAChB,QAAQ,KAAK,CAAC;AAAA,EACf;AAAA,EAEA,IAAI;AAAA,IACH,MAAM,gBAAgB,OAAO;AAAA,IAC5B,OAAO,OAAO;AAAA,IACf,QAAQ,MAAM,8BAA8B,KAAK;AAAA,IACjD,QAAQ,KAAK,CAAC;AAAA;AAAA;AAIhB,SAAS,SAAS,CAAC,MAAoC;AAAA,EACtD,IAAI,KAAK,WAAW,KAAK,KAAK,OAAO,YAAY,KAAK,OAAO,MAAM;AAAA,IAClE,OAAO;AAAA,EACR;AAAA,EAEA,MAAM,cAAc,KAAK;AAAA,EAEzB,IAAI,CAAC,eAAe,YAAY,WAAW,GAAG,GAAG;AAAA,IAChD,QAAQ,MAAM,iCAAiC;AAAA,IAC/C,OAAO;AAAA,EACR;AAAA,EAGA,IAAI,CAAC,iBAAiB,KAAK,WAAW,GAAG;AAAA,IACxC,QAAQ,MACP,iFACD;AAAA,IACA,OAAO;AAAA,EACR;AAAA,EAEA,IAAI,WAAuC;AAAA,EAG3C,MAAM,gBAAgB,KAAK,QAAQ,YAAY;AAAA,EAC/C,IAAI,kBAAkB,MAAM,KAAK,gBAAgB,IAAI;AAAA,IACpD,MAAM,cAAc,KAAK,gBAAgB;AAAA,IACzC,IAAI,CAAC,SAAS,QAAQ,OAAO,EAAE,SAAS,WAAW,GAAG;AAAA,MACrD,WAAW;AAAA,IACZ,EAAO;AAAA,MACN,QAAQ,MACP,4BAA4B,uDAC7B;AAAA,MACA,OAAO;AAAA;AAAA,EAET;AAAA,EAEA,OAAO,EAAE,aAAa,SAAS;AAAA;AAGhC,eAAe,eAAe,CAAC,SAAsB;AAAA,EACpD,QAAQ,aAAa,aAAa;AAAA,EAClC,MAAM,cAAc,KAAK,QAAQ,IAAI,GAAG,WAAW;AAAA,EAGnD,IAAI,WAAW,WAAW,GAAG;AAAA,IAC5B,QAAQ,MAAM,qBAAqB,6BAA6B;AAAA,IAChE,QAAQ,KAAK,CAAC;AAAA,EACf;AAAA,EAEA,QAAQ,IAAI;AAAA,kCAA0B,aAAa;AAAA,EACnD,QAAQ,IAAI;AAAA,0BAAkB;AAAA,CAAY;AAAA,EAI1C,MAAM,wBAAwB;AAAA,IAE7B,KAAK,YAAY,KAAK,MAAM,KAAK,QAAQ;AAAA,IAEzC,KAAK,YAAY,KAAK,MAAM,MAAM,MAAM,KAAK,QAAQ;AAAA,EACtD;AAAA,EAEA,IAAI;AAAA,EACJ,WAAW,SAAQ,uBAAuB;AAAA,IACzC,IAAI,WAAW,KAAI,GAAG;AAAA,MACrB,eAAe;AAAA,MACf;AAAA,IACD;AAAA,EACD;AAAA,EAEA,IAAI,CAAC,cAAc;AAAA,IAClB,QAAQ,MACP,qDAAqD,WACtD;AAAA,IACA,QAAQ,MAAM,gBAAgB,sBAAsB,KAAK,IAAI,GAAG;AAAA,IAChE,QAAQ,KAAK,CAAC;AAAA,EACf;AAAA,EAIA,MAAM,wBAAwB;AAAA,IAE7B,KAAK,YAAY,KAAK,MAAM,MAAM,MAAM,MAAM,YAAY,UAAU,KAAK;AAAA,IAEzE,KACC,YAAY,KACZ,MACA,MACA,MACA,MACA,MACA,YACA,UACA,KACD;AAAA,EACD;AAAA,EAEA,IAAI;AAAA,EACJ,WAAW,SAAQ,uBAAuB;AAAA,IACzC,IAAI,WAAW,KAAI,GAAG;AAAA,MACrB,eAAe;AAAA,MACf;AAAA,IACD;AAAA,EACD;AAAA,EAGA,MAAM,MAAM,aAAa,EAAE,WAAW,KAAK,CAAC;AAAA,EAG5C,MAAM,kBAAkB,cAAc,aAAa;AAAA,IAClD,cAAc;AAAA,EACf,CAAC;AAAA,EAGD,MAAM,kBAAkB;AAAA,IACvB,cAAc;AAAA,EACf;AAAA,EAGA,IAAI,cAAc;AAAA,IAEjB,MAAM,gBACL,cACA,KAAK,aAAa,KAAK,GACvB,eACD;AAAA,EACD,EAAO;AAAA,IAEN,MAAM,kBAAkB,KAAK,cAAc,KAAK;AAAA,IAChD,IAAI,WAAW,eAAe,GAAG;AAAA,MAChC,MAAM,gBACL,iBACA,KAAK,aAAa,KAAK,GACvB,eACD;AAAA,IACD,EAAO;AAAA,MACN,QAAQ,MAAM,+CAA+C,WAAW;AAAA,MACxE,QAAQ,MACP,yBAAyB,sBAAsB,KAAK,IAAI,GACzD;AAAA,MACA,QAAQ,MAAM,wBAAwB,iBAAiB;AAAA,MACvD,QAAQ,KAAK,CAAC;AAAA;AAAA;AAAA,EAKhB,QAAQ,IAAI;AAAA,CAAiC;AAAA,EAC7C,MAAM,OAAO,IAAI,MAAM,CAAC,OAAO,SAAS,GAAG;AAAA,IAC1C,KAAK;AAAA,IACL,QAAQ;AAAA,IACR,QAAQ;AAAA,EACT,CAAC;AAAA,EAED,MAAM,KAAK;AAAA,EAGX,aAAa,aAAa,QAAQ;AAAA;AAGnC,eAAe,iBAAiB,CAC/B,cACA,YACA,WACC;AAAA,EACD,MAAM,UAAU,MAAM,QAAQ,cAAc,EAAE,eAAe,KAAK,CAAC;AAAA,EAEnE,WAAW,SAAS,SAAS;AAAA,IAE5B,IAAI,MAAM,YAAY,KAAK,MAAM,SAAS,OAAO;AAAA,MAChD;AAAA,IACD;AAAA,IAEA,MAAM,aAAa,KAAK,cAAc,MAAM,IAAI;AAAA,IAChD,MAAM,WAAW,KAAK,YAAY,MAAM,IAAI;AAAA,IAE5C,IAAI,MAAM,YAAY,GAAG;AAAA,MAExB,MAAM,MAAM,UAAU,EAAE,WAAW,KAAK,CAAC;AAAA,MACzC,MAAM,kBAAkB,YAAY,UAAU,SAAS;AAAA,IACxD,EAAO,SAAI,MAAM,OAAO,GAAG;AAAA,MAE1B,MAAM,UAAU,MAAM,IAAI,KAAK,UAAU,EAAE,KAAK;AAAA,MAGhD,IAAI,mBAAmB;AAAA,MACvB,YAAY,KAAK,UAAU,OAAO,QAAQ,SAAS,GAAG;AAAA,QACrD,MAAM,cAAc,KAAK;AAAA,QACzB,mBAAmB,iBAAiB,MAAM,WAAW,EAAE,KAAK,KAAK;AAAA,MAClE;AAAA,MAGA,MAAM,IAAI,MAAM,UAAU,gBAAgB;AAAA,IAC3C;AAAA,EACD;AAAA;AAkBD,SAAS,yBAAyB,CACjC,SACA,UACA,WACS;AAAA,EAET,MAAM,yBAAyB,8BAA8B,KAAK,CAAC,YAClE,QAAQ,KAAK,QAAQ,CACtB;AAAA,EAEA,IAAI,CAAC,wBAAwB;AAAA,IAC5B,OAAO;AAAA,EACR;AAAA,EAEA,IAAI,mBAAmB;AAAA,EAGvB,IAAI,WAAW,KAAK,QAAQ,GAAG;AAAA,IAE9B,IAAI,UAAU,cAAc;AAAA,MAE3B,mBAAmB,iBAAiB,QACnC,wBACA,UAAU,UAAU,sBACrB;AAAA,IACD;AAAA,EACD;AAAA,EAQA,OAAO;AAAA;AAMR,eAAe,eAAe,CAC7B,YACA,YACA,WACC;AAAA,EACD,MAAM,UAAU,MAAM,QAAQ,YAAY,EAAE,eAAe,KAAK,CAAC;AAAA,EAGjE,MAAM,MAAM,YAAY,EAAE,WAAW,KAAK,CAAC;AAAA,EAE3C,WAAW,SAAS,SAAS;AAAA,IAC5B,MAAM,kBAAkB,KAAK,YAAY,MAAM,IAAI;AAAA,IACnD,MAAM,kBAAkB,KAAK,YAAY,MAAM,IAAI;AAAA,IAEnD,IAAI,MAAM,YAAY,GAAG;AAAA,MAExB,MAAM,gBAAgB,iBAAiB,iBAAiB,SAAS;AAAA,IAClE,EAAO,SAAI,MAAM,OAAO,GAAG;AAAA,MAE1B,MAAM,UAAU,MAAM,IAAI,KAAK,eAAe,EAAE,KAAK;AAAA,MAGrD,MAAM,mBAAmB,YACtB,0BAA0B,SAAS,MAAM,MAAM,SAAS,IACxD;AAAA,MAGH,MAAM,IAAI,MAAM,iBAAiB,gBAAgB;AAAA,IAClD;AAAA,EACD;AAAA;AAGD,SAAS,YAAY,CAAC,aAAqB,UAAkB;AAAA,EAC5D,QAAQ,IAAI;AAAA;AAAA,CAAsC;AAAA,EAClD,QAAQ,IAAI;AAAA,CAAe;AAAA,EAC3B,QAAQ,IAAI,QAAQ,aAAa;AAAA,EACjC,QAAQ,IAAI;AAAA,CAAa;AAAA,EACzB,QAAQ,IAAI;AAAA,CAAqD;AAAA,EACjE,QAAQ,IAAI,oBAAoB;AAAA,EAChC,QAAQ,IAAI,QAAQ;AAAA,EACpB,QAAQ,IAAI,0DAA0D;AAAA,EACtE,QAAQ,IAAI,eAAe;AAAA,EAC3B,QAAQ,IAAI,4DAA4D;AAAA,EACxE,QAAQ,IAAI,0DAA0D;AAAA,EACtE,QAAQ,IAAI,qDAAqD;AAAA,EACjE,QAAQ,IAAI,yDAAyD;AAAA,EACrE,IAAI,aAAa,QAAQ;AAAA,IACxB,QAAQ,IAAI,qBAAqB;AAAA,IACjC,QAAQ,IAAI,kDAAkD;AAAA,IAC9D,QAAQ,IAAI,8BAA8B;AAAA,IAC1C,QAAQ,IAAI,6BAA6B;AAAA,EAC1C;AAAA,EACA,IAAI,aAAa,SAAS;AAAA,IACzB,QAAQ,IAAI,yBAAyB;AAAA,IACrC,QAAQ,IAAI,2BAA2B;AAAA,IACvC,QAAQ,IAAI,8DAA8D;AAAA,IAC1E,QAAQ,IAAI,uDAAuD;AAAA,EACpE;AAAA,EACA,QAAQ,IAAI,yBAAyB;AAAA,EACrC,QAAQ,IAAI,yBAAyB;AAAA,EACrC,QAAQ,IAAI;AAAA,CAA0D;AAAA,EACtE,QAAQ,IAAI,mDAAmD;AAAA;AAGhE,eAAe,SAAS,GAAG;AAAA,EAC1B,QAAQ,IAAI,MAAM,iBAAiB,CAAC;AAAA,EACpC,QAAQ,IAAI,EAAE;AAAA,EACd,QAAQ,IAAI,QAAQ;AAAA,EACpB,QAAQ,IAAI,yCAAyC;AAAA,EACrD,QAAQ,IAAI,EAAE;AAAA,EACd,QAAQ,IAAI,UAAU;AAAA,EACtB,QAAQ,IAAI,2DAA2D;AAAA,EACvE,QAAQ,IAAI,gCAAgC;AAAA,EAC5C,QAAQ,IAAI,EAAE;AAAA,EACd,QAAQ,IAAI,WAAW;AAAA,EACvB,QAAQ,IAAI,uBAAuB;AAAA,EACnC,QAAQ,IAAI,wCAAwC;AAAA,EACpD,QAAQ,IAAI,0CAA0C;AAAA;AAAA,IAhIjD;AAAA;AAAA,EA9NN;AAAA,EA8NM,gCAAgC;AAAA,IACrC;AAAA,EAID;AAAA;;;ACxOA,uBAAS;AACT,0BAAkB;AAKlB,SAAS,kBAAkB,CAAC,KAAa,aAA8B;AAAA,EACtE,IAAI,aAAa;AAAA,EAGjB,SAAS,IAAI,EAAG,IAAI,GAAG,KAAK;AAAA,IAC3B,MAAM,kBAAkB,MAAK,YAAY,cAAc;AAAA,IAEvD,IAAI,YAAW,eAAe,GAAG;AAAA,MAChC,IAAI;AAAA,QACH,MAAM,cAAc,KAAK,MAAM,aAAa,iBAAiB,OAAO,CAAC;AAAA,QACrE,MAAM,OAAO;AAAA,aACT,YAAY;AAAA,aACZ,YAAY;AAAA,aACZ,YAAY;AAAA,QAChB;AAAA,QAEA,IAAI,eAAe,MAAM;AAAA,UACxB,OAAO;AAAA,QACR;AAAA,QACC,MAAM;AAAA,IAGT;AAAA,IAEA,MAAM,YAAY,QAAQ,UAAU;AAAA,IAEpC,IAAI,cAAc,YAAY;AAAA,MAC7B;AAAA,IACD;AAAA,IACA,aAAa;AAAA,EACd;AAAA,EAEA,OAAO;AAAA;AAMR,SAAS,wBAAwB,CAAC,KAAsB;AAAA,EACvD,OAAO,mBAAmB,KAAK,gBAAgB;AAAA;AAMhD,SAAS,gBAAgB,CAAC,KAAsB;AAAA,EAC/C,OAAO,mBAAmB,KAAK,iBAAiB;AAAA;AAMjD,SAAS,oBAAoB,CAAC,KAAsB;AAAA,EACnD,OAAO,mBAAmB,KAAK,YAAY;AAAA;AAM5C,SAAS,cAAc,CAAC,KAAsB;AAAA,EAC7C,OAAO,mBAAmB,KAAK,aAAa;AAAA;AAMtC,SAAS,iBAAiB,CAAC,KAAa;AAAA,EAC9C,MAAM,mBAAmB,yBAAyB,GAAG;AAAA,EACrD,MAAM,WAAW,iBAAiB,GAAG;AAAA,EACrC,MAAM,eAAe,qBAAqB,GAAG;AAAA,EAC7C,MAAM,SAAS,eAAe,GAAG;AAAA,EAEjC,OAAO;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,cAAc;AAAA,EACf;AAAA;AAMM,SAAS,iBAAiB,CAAC,KAAmB;AAAA,EACpD,MAAM,SAAS,kBAAkB,GAAG;AAAA,EAEpC,IAAI,OAAO,cAAc;AAAA,IACxB,QAAQ,IAAI,iDAAiD;AAAA,IAC7D,IAAI,OAAO,UAAU;AAAA,MACpB,QAAQ,IAAI,wDAAuD;AAAA,IACpE;AAAA,IACA,IAAI,OAAO,cAAc;AAAA,MACxB,QAAQ,IAAI,uDAAsD;AAAA,IACnE;AAAA,IACA,IAAI,OAAO,QAAQ;AAAA,MAClB,QAAQ,IACP,6DACD;AAAA,IACD;AAAA,EACD;AAAA;AAMM,SAAS,yBAAyB,CAAC,KAAsB;AAAA,EAC/D,IAAI;AAAA,IACH,MAAM,SAAS,kBAAkB,GAAG;AAAA,IACpC,IAAI,OAAO,cAAc;AAAA,MACxB,kBAAkB,GAAG;AAAA,IACtB;AAAA,IACA,OAAO,OAAO;AAAA,IACb,OAAO,GAAG;AAAA,IACX,QAAQ,KAAK,oCAAoC,CAAC;AAAA,IAClD,OAAO;AAAA;AAAA;AAAA;;;ACzHT,uBAAS,6BAAY;AACrB,8BAAmB,2BAAkB;AAyBrC,SAAS,gBAAgB,CAAC,SAGxB;AAAA,EACD,MAAM,mBAAmB;AAAA,EACzB,MAAM,QAAQ,QAAQ,MAAM,gBAAgB;AAAA,EAE5C,IAAI,CAAC,OAAO;AAAA,IACX,OAAO,EAAE,MAAM,CAAC,GAAG,QAAQ;AAAA,EAC5B;AAAA,EAEA,SAAS,iBAAiB,mBAAmB;AAAA,EAC7C,MAAM,OAA4B,CAAC;AAAA,EAGnC,MAAM,QAAQ,gBAAgB,MAAM;AAAA,CAAI;AAAA,EACxC,WAAW,QAAQ,OAAO;AAAA,IACzB,MAAM,aAAa,KAAK,QAAQ,GAAG;AAAA,IACnC,IAAI,eAAe;AAAA,MAAI;AAAA,IAEvB,MAAM,MAAM,KAAK,MAAM,GAAG,UAAU,EAAE,KAAK;AAAA,IAC3C,IAAI,QAAQ,KAAK,MAAM,aAAa,CAAC,EAAE,KAAK;AAAA,IAG5C,IACE,MAAM,WAAW,GAAG,KAAK,MAAM,SAAS,GAAG,KAC3C,MAAM,WAAW,GAAG,KAAK,MAAM,SAAS,GAAG,GAC3C;AAAA,MACD,QAAQ,MAAM,MAAM,GAAG,EAAE;AAAA,IAC1B;AAAA,IAGA,IAAI,MAAM,WAAW,GAAG,KAAK,MAAM,SAAS,GAAG,GAAG;AAAA,MACjD,KAAK,OAAO,MACV,MAAM,GAAG,EAAE,EACX,MAAM,GAAG,EACT,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,gBAAgB,EAAE,CAAC;AAAA,IAClD,EAEK,SAAI,UAAU,UAAU,UAAU,SAAS;AAAA,MAC/C,KAAK,OAAO,UAAU;AAAA,IACvB,EAEK,SAAI,CAAC,OAAO,MAAM,OAAO,KAAK,CAAC,GAAG;AAAA,MACtC,KAAK,OAAO,OAAO,KAAK;AAAA,IACzB,EAEK;AAAA,MACJ,KAAK,OAAO;AAAA;AAAA,EAEd;AAAA,EAEA,OAAO,EAAE,MAAM,SAAS,gBAAgB;AAAA;AAMzC,SAAS,YAAY,CAAC,SAA0B;AAAA,EAE/C,MAAM,cAAc;AAAA,IACnB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACD;AAAA,EAEA,OAAO,YAAY,KAAK,CAAC,YAAY,QAAQ,KAAK,OAAO,CAAC;AAAA;AAMpD,SAAS,mBAAmB,CAAC,UAAqC;AAAA,EACxE,MAAM,aAAa,cAAa,UAAU,OAAO;AAAA,EACjD,QAAQ,MAAM,YAAY,iBAAiB,UAAU;AAAA,EACrD,MAAM,SAAS,aAAa,OAAO;AAAA,EAEnC,OAAO;AAAA,IACN,aAAa;AAAA,IACb;AAAA,IACA;AAAA,IACA;AAAA,EACD;AAAA;AAMD,SAAS,eAAc,CAAC,KAAsB;AAAA,EAC7C,IAAI,aAAa;AAAA,EAGjB,SAAS,IAAI,EAAG,IAAI,GAAG,KAAK;AAAA,IAC3B,MAAM,kBAAkB,MAAK,YAAY,cAAc;AAAA,IAEvD,IAAI,YAAW,eAAe,GAAG;AAAA,MAChC,IAAI;AAAA,QACH,MAAM,cAAc,KAAK,MAAM,cAAa,iBAAiB,OAAO,CAAC;AAAA,QACrE,MAAM,OAAO;AAAA,aACT,YAAY;AAAA,aACZ,YAAY;AAAA,aACZ,YAAY;AAAA,QAChB;AAAA,QAEA,IAAI,iBAAiB,MAAM;AAAA,UAC1B,OAAO;AAAA,QACR;AAAA,QACC,MAAM;AAAA,IAGT;AAAA,IAEA,MAAM,YAAY,SAAQ,UAAU;AAAA,IAEpC,IAAI,cAAc,YAAY;AAAA,MAC7B;AAAA,IACD;AAAA,IACA,aAAa;AAAA,EACd;AAAA,EAEA,OAAO;AAAA;AAMR,eAAe,UAAU,CACxB,SACA,KACA,UAII,CAAC,GACoB;AAAA,EACzB,IAAI,CAAC,gBAAe,GAAG,GAAG;AAAA,IACzB,QAAQ,KACP,4EACD;AAAA,IACA,OAAO;AAAA,EACR;AAAA,EAEA,IAAI;AAAA,IAEH,IAAI;AAAA,IACJ,MAAM,aAAa;AAAA,MAClB,MAAK,KAAK,0BAA0B;AAAA,MACpC,MAAK,KAAK,6BAA6B;AAAA,MACvC,MAAK,KAAK,gCAAgC;AAAA,MAC1C,MAAK,KAAK,mCAAmC;AAAA,IAC9C;AAAA,IAEA,WAAW,WAAW,YAAY;AAAA,MACjC,IAAI;AAAA,QACH,MAAM,YAAY,UAAQ,OAAO;AAAA,QACjC,UAAU,UAAU;AAAA,QACpB;AAAA,QACC,MAAM;AAAA,IAGT;AAAA,IAEA,IAAI,CAAC,SAAS;AAAA,MACb,QAAQ,MAAM,wDAAwD;AAAA,MACtE,OAAO;AAAA,IACR;AAAA,IAEA,QAAQ,YAAY,MAAM,QAAQ,kBAAkB;AAAA,IAEpD,MAAM,gBAAgB,CAAC;AAAA,IACvB,MAAM,gBAAgB,CAAC;AAAA,IAGvB,IAAI,WAAW;AAAA,MACd,MAAM,gBAAgB;AAAA,QACrB,MAAK,KAAK,yBAAyB;AAAA,QACnC,MAAK,KAAK,4BAA4B;AAAA,QACtC,MAAK,KAAK,+BAA+B;AAAA,QACzC,MAAK,KAAK,kCAAkC;AAAA,MAC7C;AAAA,MAEA,IAAI,YAAiB;AAAA,MACrB,WAAW,WAAW,eAAe;AAAA,QACpC,IAAI;AAAA,UACH,YAAY,UAAQ,OAAO;AAAA,UAC3B;AAAA,UACC,MAAM;AAAA,MAGT;AAAA,MAEA,IAAI,WAAW;AAAA,QACd,cAAc,KAAK,UAAU,WAAW,SAAS;AAAA,MAClD,EAAO;AAAA,QACN,QAAQ,KAAK,kDAAkD;AAAA;AAAA,IAEjE;AAAA,IAGA,MAAM,kBAAkB;AAAA,MACvB,MAAK,KAAK,8BAA8B;AAAA,MACxC,MAAK,KAAK,iCAAiC;AAAA,MAC3C,MAAK,KAAK,oCAAoC;AAAA,MAC9C,MAAK,KAAK,uCAAuC;AAAA,IAClD;AAAA,IAEA,IAAI,cAAmB;AAAA,IACvB,WAAW,aAAa,iBAAiB;AAAA,MACxC,IAAI;AAAA,QACH,cAAc,UAAQ,SAAS;AAAA,QAC/B;AAAA,QACC,MAAM;AAAA,IAGT;AAAA,IAEA,IAAI,aAAa;AAAA,MAChB,cAAc,KAAK,CAAC,YAAY,WAAW,aAAa,EAAE,MAAM,CAAC,CAAC;AAAA,IACnE,EAAO;AAAA,MACN,QAAQ,KACP,oEACD;AAAA;AAAA,IAGD,MAAM,SAAS,MAAM,QAAQ,SAAS;AAAA,MACrC;AAAA,MACA;AAAA,MACA,cAAc;AAAA,MACd,aAAa;AAAA,IACd,CAAC;AAAA,IAED,OAAO,OAAO,MAAM;AAAA,IACnB,OAAO,OAAO;AAAA,IAEf,MAAM,eAAe,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,IAC1E,MAAM,gBACL,SACA,OAAO,UAAU,YACjB,WAAW,SACX,MAAM,SACN,OAAO,MAAM,UAAU,WACpB,WAAY,MAAM,MAAc,QAAQ,eAAgB,MAAM,MAAc,UAAU,QACtF;AAAA,IACJ,MAAM,WAAW,QAAQ,WAAW,OAAO,QAAQ,aAAa;AAAA,IAEhE,QAAQ,KACP,mCAAmC,WAAW,gBAAgB,IAAI,kBAAkB,OAAO,cAC5F;AAAA,IACA,QAAQ,KAAK,8CAA8C;AAAA,IAC3D,OAAO;AAAA;AAAA;AAQT,eAAsB,sBAAsB,CAC3C,WACA,KACA,UAKI,CAAC,GACa;AAAA,EAClB,QAAQ,aAAa,YAAY;AAAA,EACjC;AAAA,IACC,YAAY;AAAA,IACZ,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR;AAAA,MACG;AAAA,EAIJ,MAAM,cAAc,MAAM,WAAW,SAAS,KAAK;AAAA,IAClD;AAAA,IACA;AAAA,IACA;AAAA,EACD,CAAC;AAAA,EACD,IAAI,aAAa;AAAA,IAEhB,OAAO,qBAAqB,QAAQ,QAAQ;AAAA;AAAA;AAAA,EAG5C;AAAA;AAAA;AAAA,sBAGoB,KAAK,UAAU,aAAa,MAAM,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASxD;AAAA,EAGA,MAAM,iBAAiB,QACrB,QAAQ,OAAO,MAAM,EACrB,QAAQ,MAAM,KAAK,EACnB,QAAQ,OAAO,KAAK;AAAA,EAGtB,MAAM,gBAA0B,CAAC;AAAA,EACjC,MAAM,oBAA8B,CAAC;AAAA,EACrC,MAAM,oBAA8B,CAAC;AAAA,EAErC,IAAI,WAAW;AAAA,IACd,cAAc,KAAK,qCAAqC;AAAA,IACxD,kBAAkB,KAAK,WAAW;AAAA,EACnC;AAAA,EAIA,MAAM,mBACL,cAAc,SAAS,IAAI,GAAG,cAAc,KAAK;AAAA,CAAI;AAAA,IAAQ;AAAA,EAC9D,MAAM,mBACL,kBAAkB,SAAS,IACxB,mBAAmB,kBAAkB,KAAK,IAAI,QAC9C;AAAA,EACJ,MAAM,mBACL,kBAAkB,SAAS,IACxB,mBAAmB,kBAAkB,KAAK,IAAI,QAC9C;AAAA,EACJ,MAAM,kBAAkB,CAAC,kBAAkB,gBAAgB,EACzD,OAAO,OAAO,EACd,KAAK;AAAA,SAAY;AAAA,EAEnB,OAAO;AAAA;AAAA,EAEN;AAAA,eACa,KAAK,UAAU,aAAa,MAAM,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,4BAStB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAMlB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAkBH,SAAS,2BAA2B,CAC1C,WACS;AAAA,EACT,QAAQ,aAAa,YAAY;AAAA,EACjC,MAAM,iBAAiB,QACrB,QAAQ,OAAO,MAAM,EACrB,MAAM,OAAO,aAAa,EAAE,CAAC,EAC7B,KAAK,KAAK,OAAO,aAAa,EAAE,GAAG,EACnC,MAAM,GAAG,EACT,KAAK,KAAK;AAAA,EAEZ,OAAO;AAAA;AAAA,sBAEc,KAAK,UAAU,aAAa,MAAM,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,4BAS7B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA8BrB,SAAS,cAAc,CAAC,UAA2B;AAAA,EACzD,MAAM,MAAM,QAAQ,QAAQ,EAAE,YAAY;AAAA,EAC1C,OAAO,QAAQ,SAAS,QAAQ;AAAA;AAAA;;;AC7b1B,SAAS,gBAAgB,CAAC,OAAiB,CAAC,GAAY;AAAA,EAC9D,OACC;AAAA;;;ACRF;AACA,uBAAS,6BAAY;AACrB,iBAAS;AAMT,SAAS,mBAAmB,CAAC,KAAsB;AAAA,EAClD,MAAM,aAAa;AAAA,IAClB,MAAK,KAAK,cAAc;AAAA,IACxB,MAAK,KAAK,iBAAiB;AAAA,IAC3B,MAAK,KAAK,oBAAoB;AAAA,IAC9B,MAAK,KAAK,uBAAuB;AAAA,EAClC;AAAA,EAEA,WAAW,mBAAmB,YAAY;AAAA,IACzC,IAAI,CAAC,YAAW,eAAe,GAAG;AAAA,MACjC;AAAA,IACD;AAAA,IAEA,IAAI;AAAA,MACH,MAAM,cAAc,KAAK,MAAM,cAAa,iBAAiB,OAAO,CAAC;AAAA,MACrE,MAAM,OAAO;AAAA,WACT,YAAY;AAAA,WACZ,YAAY;AAAA,MAChB;AAAA,MAEA,IAAI,sBAAsB,MAAM;AAAA,QAC/B,OAAO;AAAA,MACR;AAAA,MACC,MAAM;AAAA,EACT;AAAA,EAEA,OAAO;AAAA;AAMR,SAAS,gBAAgB,CAAC,KAAa;AAAA,EACtC,MAAM,QAAQ,MAAK,KAAK,sBAAsB;AAAA,EAC9C,MAAM,SAAS,MAAK,KAAK,oBAAoB;AAAA,EAE7C,OAAO,EAAE,OAAO,OAAO;AAAA;AAMxB,SAAS,gBAAgB,CAAC,KAAsB;AAAA,EAC/C,QAAQ,UAAU,iBAAiB,GAAG;AAAA,EAEtC,IAAI,CAAC,YAAW,KAAK,GAAG;AAAA,IACvB,OAAO;AAAA,EACR;AAAA,EAEA,IAAI;AAAA,IACH,MAAM,UAAU,cAAa,OAAO,OAAO;AAAA,IAE3C,OAAO,QAAQ,SAAS,aAAa;AAAA,IACpC,MAAM;AAAA,IACP,OAAO;AAAA;AAAA;AAIT,SAAS,kBAAkB,CAAC,KAAqB;AAAA,EAEhD,MAAM,aAAa;AAAA,IAClB,MAAK,KAAK,kCAAkC;AAAA,IAC5C,MAAK,KAAK,qCAAqC;AAAA,IAC/C,MAAK,KAAK,wCAAwC;AAAA,EACnD;AAAA,EAEA,WAAW,WAAW,YAAY;AAAA,IACjC,IAAI,YAAW,OAAO,GAAG;AAAA,MACxB,OAAO;AAAA,IACR;AAAA,EACD;AAAA,EAGA,OAAO,MAAK,KAAK,+BAA+B;AAAA;AAMjD,eAAe,aAAa,CAAC,KAAa,SAAS,OAAsB;AAAA,EACxE,QAAQ,OAAO,WAAW,iBAAiB,GAAG;AAAA,EAE9C,OAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AAAA,IACvC,MAAM,cAAc,mBAAmB,GAAG;AAAA,IAC1C,MAAM,OAAO,CAAC,MAAM,OAAO,MAAM,MAAM;AAAA,IAGvC,IAAI,QAAQ;AAAA,MACX,KAAK,KAAK,UAAU;AAAA,IACrB;AAAA,IAEA,MAAM,UAAU,KAAK,KAAK,GAAG;AAAA,IAC7B,QAAQ,IAAI,mCAAmC,SAAS;AAAA,IAExD,MAAM,WAAW,MAAM,aAAa,MAAM;AAAA,MACzC;AAAA,MACA,OAAO;AAAA,IACR,CAAC;AAAA,IAED,SAAS,QAAQ,GAAG,QAAQ,CAAC,SAAS;AAAA,MACrC,MAAM,OAAO,KAAK,SAAS,EAAE,KAAK;AAAA,MAClC,IAAI,MAAM;AAAA,QACT,QAAQ,IAAI,sBAAsB,MAAM;AAAA,MACzC;AAAA,KACA;AAAA,IAED,SAAS,QAAQ,GAAG,QAAQ,CAAC,SAAS;AAAA,MACrC,MAAM,OAAO,KAAK,SAAS,EAAE,KAAK;AAAA,MAClC,IAAI,MAAM;AAAA,QACT,QAAQ,IAAI,sBAAsB,MAAM;AAAA,MACzC;AAAA,KACA;AAAA,IAED,SAAS,GAAG,SAAS,CAAC,SAAS;AAAA,MAC9B,IAAI,SAAS,GAAG;AAAA,QACf,QAAQ,IAAI,+BAA+B;AAAA,QAC3C,QAAQ;AAAA,MACT,EAAO;AAAA,QACN,OAAO,IAAI,MAAM,uCAAuC,MAAM,CAAC;AAAA;AAAA,KAEhE;AAAA,IAED,SAAS,GAAG,SAAS,CAAC,UAAU;AAAA,MAC/B,OAAO,KAAK;AAAA,KACZ;AAAA,GACD;AAAA;AAOF,eAAsB,yBAAyB,CAC9C,KACA,SAAS,OACU;AAAA,EACnB,IAAI;AAAA,IACH,IAAI,oBAAoB,GAAG,KAAK,iBAAiB,GAAG,GAAG;AAAA,MACtD,MAAM,cAAc,KAAK,MAAM;AAAA,MAC/B,OAAO;AAAA,IACR;AAAA,IACA,OAAO;AAAA,IACN,OAAO,GAAG;AAAA,IACX,QAAQ,KAAK,oCAAoC,CAAC;AAAA,IAClD,OAAO;AAAA;AAAA;AAAA;;;;;;;AC7JT;AACA,kBAAS,mBAAO;AAChB,iBAAS;AACT;AAwCA,eAAe,eAAe,CAAC,KAAa;AAAA,EAC3C,IAAI;AAAA,IACH,MAAM,aAAa,MAAK,KAAK,UAAU;AAAA,IAGvC,IAAI,eAAe;AAAA,IACnB,IAAI;AAAA,MACH,MAAM,UAAU,MAAM,SAAQ,UAAU;AAAA,MACxC,eAAe,QAAQ,SAAS;AAAA,MAC/B,MAAM;AAAA,IAIR,IAAI,cAAc;AAAA,MAEjB,MAAM,GAAG,YAAY,EAAE,OAAO,MAAM,WAAW,KAAK,CAAC;AAAA,MACrD,QAAQ,IAAI,0DAA0D;AAAA,IACvE;AAAA,IAGA,MAAM,OAAM,YAAY,EAAE,WAAW,KAAK,CAAC;AAAA,IAC3C,MAAM,OAAM,MAAK,KAAK,sBAAsB,GAAG,EAAE,WAAW,KAAK,CAAC;AAAA,IAClE,MAAM,OAAM,MAAK,KAAK,kBAAkB,GAAG,EAAE,WAAW,KAAK,CAAC;AAAA,IAC7D,MAAM;AAAA;AAKT,eAAe,cAAc,CAAC,KAAa;AAAA,EAG1C,MAAM,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAepB,MAAM,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQrB,MAAM,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBnB,MAAM,IAAI,MAAM,MAAK,KAAK,aAAa,GAAG,WAAW;AAAA,EACrD,MAAM,IAAI,MAAM,MAAK,KAAK,iBAAiB,GAAG,YAAY;AAAA,EAC1D,MAAM,IAAI,MAAM,MAAK,KAAK,YAAY,GAAG,UAAU;AAAA,EAEnD,QAAQ,IAAI,sCAAsC;AAAA;AAGnD,eAAe,aAAa,CAAC,KAAa,OAAO,IAAuB;AAAA,EACvE,MAAM,QAAkB,CAAC;AAAA,EACzB,MAAM,UAAU,MAAM,SAAQ,KAAK,EAAE,eAAe,KAAK,CAAC;AAAA,EAE1D,WAAW,SAAS,SAAS;AAAA,IAC5B,MAAM,WAAW,MAAK,KAAK,MAAM,IAAI;AAAA,IACrC,MAAM,eAAe,MAAK,MAAM,MAAM,IAAI;AAAA,IAE1C,IAAI,MAAM,YAAY,GAAG;AAAA,MAExB,IAAI,MAAM,SAAS;AAAA,QAAW;AAAA,MAC9B,MAAM,SAAS,MAAM,cAAc,UAAU,YAAY;AAAA,MACzD,MAAM,KAAK,GAAG,MAAM;AAAA,IACrB,EAAO,SACN,MAAM,OAAO,MACZ,MAAM,KAAK,SAAS,MAAM,KAC1B,MAAM,KAAK,SAAS,KAAK,KACzB,MAAM,KAAK,SAAS,KAAK,KACzB,MAAM,KAAK,SAAS,MAAM,IAC1B;AAAA,MAED,IACC,aAAa,SAAS,WAAW,KACjC,aAAa,WAAW,UAAU,GACjC;AAAA,QACD;AAAA,MACD;AAAA,MACA,IAAI,CAAC,MAAM,KAAK,WAAW,GAAG,KAAK,MAAM,SAAS,gBAAgB;AAAA,QACjE,MAAM,KAAK,YAAY;AAAA,MACxB;AAAA,IACD;AAAA,EACD;AAAA,EAEA,OAAO;AAAA;AAIR,eAAe,YAAY,CAAC,KAAa,OAAO,IAAuB;AAAA,EACtE,MAAM,QAAkB,CAAC;AAAA,EACzB,MAAM,UAAU,MAAM,SAAQ,KAAK,EAAE,eAAe,KAAK,CAAC;AAAA,EAC1D,WAAW,SAAS,SAAS;AAAA,IAC5B,MAAM,WAAW,MAAK,KAAK,MAAM,IAAI;AAAA,IACrC,MAAM,eAAe,MAAK,MAAM,MAAM,IAAI;AAAA,IAC1C,IAAI,MAAM,YAAY,GAAG;AAAA,MACxB,MAAM,SAAS,MAAM,aAAa,UAAU,YAAY;AAAA,MACxD,MAAM,KAAK,GAAG,MAAM;AAAA,IACrB,EAAO,SAAI,MAAM,OAAO,GAAG;AAAA,MAC1B,IAAI,qBAAqB,KAAK,MAAM,IAAI;AAAA,QAAG,MAAM,KAAK,YAAY;AAAA,IACnE;AAAA,EACD;AAAA,EACA,OAAO;AAAA;AAGR,SAAS,WAAW,CAAC,UAA6B;AAAA,EACjD,MAAM,WACL,SAAS,SAAS,cAAc,KAChC,SAAS,SAAS,aAAa,KAC/B,SAAS,SAAS,aAAa,KAC/B,SAAS,SAAS,cAAc;AAAA,EAGjC,IAAI,YAAY,SAAS,QAAQ,sBAAsB,EAAE;AAAA,EAGzD,IAAI,UAAU;AAAA,IACb,YAAY,UAAU,QAAQ,aAAa,EAAE,EAAE,QAAQ,OAAO,EAAE;AAAA,EACjE;AAAA,EAGA,YAAY,UAAU,QAAQ,YAAY,EAAE,EAAE,QAAQ,WAAW,EAAE;AAAA,EAGnE,MAAM,SAAmB,CAAC;AAAA,EAC1B,MAAM,UAAU,UAAU,QAAQ,iBAAiB,CAAC,GAAG,UAAU;AAAA,IAChE,OAAO,KAAK,KAAK;AAAA,IACjB,OAAO,IAAI;AAAA,GACX;AAAA,EAGD,MAAM,oBAAoB,YAAY,KAAK,MAAM,IAAI;AAAA,EAGrD,MAAM,aAAa,iBAAiB,KAAK,SAAS;AAAA,EAClD,IAAI;AAAA,EACJ,IAAI,YAAY;AAAA,IACf,MAAM,OAAO,UAAU,QAAQ,kBAAkB,EAAE,EAAE,QAAQ,OAAO,EAAE;AAAA,IACtE,sBAAsB,OAAO,IAAI,SAAS;AAAA,EAC3C;AAAA,EAEA,OAAO;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,IACT;AAAA,IACA;AAAA,IACA,WAAW,OAAO,SAAS;AAAA,IAC3B;AAAA,IACA;AAAA,IACA;AAAA,EACD;AAAA;AAGD,SAAS,UAAU,CAAC,QAAkC;AAAA,EAErD,OAAO,OAAO,KAAK,CAAC,GAAG,MAAM;AAAA,IAC5B,MAAM,SAAS,EAAE,QAAQ,MAAM,GAAG,EAAE;AAAA,IACpC,MAAM,SAAS,EAAE,QAAQ,MAAM,GAAG,EAAE;AAAA,IAGpC,IAAI,WAAW;AAAA,MAAQ,OAAO,SAAS;AAAA,IAGvC,IAAI,CAAC,EAAE,aAAa,EAAE;AAAA,MAAW,OAAO;AAAA,IACxC,IAAI,EAAE,aAAa,CAAC,EAAE;AAAA,MAAW,OAAO;AAAA,IAGxC,OAAO,EAAE,QAAQ,cAAc,EAAE,OAAO;AAAA,GACxC;AAAA;AAGF,SAAS,iBAAiB,CAAC,OAA4B;AAAA,EACtD,MAAM,SAAsB,CAAC;AAAA,EAC7B,MAAM,UAAuB,CAAC;AAAA,EAC9B,MAAM,iBAA8B,CAAC;AAAA,EAErC,WAAW,QAAQ,OAAO;AAAA,IACzB,MAAM,QAAQ,YAAY,IAAI;AAAA,IAC9B,IAAI,MAAM,UAAU;AAAA,MACnB,QAAQ,KAAK,KAAK;AAAA,IACnB,EAAO,SAAI,MAAM,YAAY;AAAA,MAE5B,eAAe,KAAK,KAAK;AAAA,IAC1B,EAAO;AAAA,MACN,OAAO,KAAK,KAAK;AAAA;AAAA,EAEnB;AAAA,EAEA,OAAO;AAAA,IACN,QAAQ,WAAW,MAAM;AAAA,IACzB;AAAA,IACA;AAAA,EACD;AAAA;AAOD,SAAS,aAAa,CAAC,UAA0B;AAAA,EAChD,MAAM,aAAa,cAAc,KAAK,QAAQ;AAAA,EAE9C,IAAI,YAAY;AAAA,IAEf,MAAM,kBAAiB,SAAS,QAAQ,eAAe,EAAE;AAAA,IACzD,OAAO,cAAc;AAAA,EACtB;AAAA,EAGA,MAAM,iBAAiB,SAAS,QAAQ,eAAe,EAAE;AAAA,EACzD,OAAO,wBAAwB;AAAA;AAGhC,SAAS,kBAAkB,CAAC,MAAyB;AAAA,EAEpD,MAAM,eAAe;AAAA,EAGrB,MAAM,eAAe;AAAA,IACpB,GAAG,KAAK,OAAO,IACd,CAAC,GAAG,MAAM,eAAe,gBAAgB,cAAc,EAAE,QAAQ,KAClE;AAAA,IACA,GAAG,KAAK,QAAQ,IACf,CAAC,GAAG,MAAM,gBAAgB,gBAAgB,cAAc,EAAE,QAAQ,KACnE;AAAA,IACA,GAAG,KAAK,eAAe,IACtB,CAAC,IAAI,MACJ,kBAAkB,gBAAgB,cAAc,GAAG,QAAQ,KAC7D;AAAA,EACD,EAAE,KAAK;AAAA,CAAI;AAAA,EAGX,MAAM,eAAe;AAAA,IACpB,GAAG,KAAK,OAAO,IAAI,CAAC,GAAG,MAAM;AAAA,MAC5B,MAAM,aAAa,cAAc,EAAE,QAAQ;AAAA,MAC3C,OAAO,cAAc,4BAA4B,yBAAyB,kBAAkB,EAAE;AAAA,KAC9F;AAAA,IACD,GAAG,KAAK,QAAQ,IAAI,CAAC,GAAG,MAAM;AAAA,MAC7B,MAAM,aAAa,cAAc,EAAE,QAAQ;AAAA,MAC3C,OAAO,eAAe,6BAA6B,yBAAyB,kBAAkB,EAAE;AAAA,KAChG;AAAA,IACD,GAAG,KAAK,eAAe,IAAI,CAAC,IAAI,MAAM;AAAA,MACrC,MAAM,aAAa,cAAc,GAAG,QAAQ;AAAA,MAC5C,OAAO,iBAAiB,+BAA+B,yBAAyB,kBAAkB,GAAG,uBAAuB;AAAA,KAC5H;AAAA,EACF,EAAE,KAAK;AAAA,CAAI;AAAA,EAEX,MAAM,cAAc,KAAK,OACvB,IAAI,CAAC,GAAG,MAAM;AAAA,IACd,OAAO;AAAA,gBACM,EAAE;AAAA,aACL,EAAE;AAAA,sBACO;AAAA,cACR,KAAK,UAAU,EAAE,MAAM;AAAA,iBACpB,EAAE;AAAA;AAAA,GAEhB,EACA,KAAK;AAAA,CAAK;AAAA,EAEZ,MAAM,gBAAgB,KAAK,OAAO,IAAI,CAAC,MAAM,QAAQ,EAAE,UAAU,EAAE,KAAK;AAAA,CAAI;AAAA,EAE5E,MAAM,mBAAmB,KAAK,OAC5B,OAAO,CAAC,MAAM,EAAE,SAAS,EACzB,IAAI,CAAC,MAAM;AAAA,IACX,MAAM,SAAS,EAAE,OAAO,IAAI,CAAC,MAAM,GAAG,WAAW,EAAE,KAAK,IAAI;AAAA,IAC5D,OAAO,gBAAgB,EAAE,gBAAgB;AAAA,GACzC,EACA,KAAK;AAAA,CAAI;AAAA,EAEX,MAAM,eAAe,KAAK,QACxB,IAAI,CAAC,GAAG,MAAM;AAAA,IACd,OAAO;AAAA,gBACM,EAAE;AAAA,aACL,EAAE;AAAA,uBACQ;AAAA;AAAA,GAEpB,EACA,KAAK;AAAA,CAAK;AAAA,EAEZ,MAAM,sBAAsB,KAAK,eAC/B,IAAI,CAAC,IAAI,MAAM;AAAA,IACf,OAAO;AAAA,gBACM,GAAG,uBAAuB;AAAA,aAC7B,GAAG;AAAA,yBACS;AAAA;AAAA,GAEtB,EACA,KAAK;AAAA,CAAK;AAAA,EAEZ,OAAO;AAAA;AAAA;AAAA;AAAA,EAIN;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA;AAAA,EAGA;AAAA;AAAA;AAAA;AAAA,EAIA,gBAAgB;AAAA;AAAA;AAAA;AAAA,EAIhB,uBAAuB;AAAA;AAAA;AAAA;AAAA,EAIvB,iBAAiB;AAAA;AAAA,iDAGjB,mBACG;AAAA,EAAK;AAAA,4BACL;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA+CL,eAAe,gBAAgB,CAAC,eAA0C;AAAA,EACzE,IAAI;AAAA,IACH,MAAM,UAAU,MAAM,SAAQ,eAAe,EAAE,eAAe,KAAK,CAAC;AAAA,IACpE,OAAO,QACL,OACA,CAAC,MACA,EAAE,OAAO,KACT,qBAAqB,KAAK,EAAE,IAAI,KAChC,CAAC,EAAE,KAAK,WAAW,GAAG,CACxB,EACC,IAAI,CAAC,MAAM,EAAE,IAAI;AAAA,IAClB,MAAM;AAAA,IACP,OAAO,CAAC;AAAA;AAAA;AAIV,eAAe,IAAI,CAAC,MAA+B;AAAA,EAClD,MAAM,OAAO,IAAI,YAAY,EAAE,OAAO,IAAI;AAAA,EAC1C,MAAM,MAAM,MAAM,OAAO,OAAO,OAAO,WAAW,IAAI;AAAA,EACtD,IAAI,MAAM;AAAA,EACV,WAAW,KAAK,IAAI,WAAW,GAAG;AAAA,IAAG,OAAO,EAAE,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG;AAAA,EAC1E,OAAO,IAAI,MAAM,GAAG,CAAC;AAAA;AAGtB,eAAe,kBAAkB,CAAC,KAAa,OAAiB,CAAC,GAAG;AAAA,EACnE,MAAM,aAAa,MAAK,KAAK,UAAU;AAAA,EACvC,QAAQ,IAAI,0BAA0B,YAAY;AAAA,EAElD,MAAM,cAAc,MAAM,SAAQ,YAAY,EAAE,eAAe,KAAK,CAAC;AAAA,EAErE,MAAM,UAOD,CAAC;AAAA,EAEN,WAAW,KAAK,aAAa;AAAA,IAC5B,IAAI,CAAC,EAAE,YAAY;AAAA,MAAG;AAAA,IACtB,MAAM,aAAa,EAAE;AAAA,IACrB,MAAM,aAAa,MAAK,YAAY,YAAY,SAAS;AAAA,IACzD,QAAQ,IAAI,gCAAgC,kBAAkB,YAAY;AAAA,IAC1E,MAAM,QAAQ,MAAM,iBAAiB,UAAU;AAAA,IAC/C,QAAQ,IAAI,2BAA2B,MAAM,QAAQ;AAAA,IACrD,IAAI,CAAC,MAAM;AAAA,MAAQ;AAAA,IAEnB,WAAW,QAAQ,OAAO;AAAA,MACzB,MAAM,OAAO,KAAK,QAAQ,sBAAsB,EAAE;AAAA,MAClD,MAAM,SAAS,MAAK,YAAY,IAAI;AAAA,MACpC,MAAM,aAAa,cAAc,KAAK,IAAI;AAAA,MAI1C,MAAM,WAAW,aACd,MACA,KACA,YACA,YACA,YACA,WACA,GAAG,UACJ,IACC;AAAA,MAGH,IAAI,YAAY;AAAA,QACf,IAAI;AAAA,UACH,MAAM,SAAS,MAAM,IAAI,KAAK,QAAQ,EAAE,OAAO;AAAA,UAC/C,IAAI,CAAC,QAAQ;AAAA,YACZ,QAAQ,KACP,2DAA2D,UAC5D;AAAA,YACA;AAAA,UACD;AAAA,UACC,MAAM;AAAA,MACT;AAAA,MAEA,IAAI,OAAO;AAAA,MACX,IAAI;AAAA,QACH,MAAM,SAAS,iBAAiB,IAAI;AAAA,QACpC,MAAM,SAAS,MAAM,IAAI,MAAM;AAAA,UAC9B,aAAa,CAAC,QAAQ;AAAA,UACtB,QAAQ;AAAA,UACR,QAAQ;AAAA,UACR,WAAW;AAAA,UACX,WAAW,SAAS,WAAW;AAAA,UAC/B,QAAQ;AAAA,UACR,QAAQ;AAAA,YACP,wBAAwB,SAAS,iBAAiB;AAAA,UACnD;AAAA,QACD,CAAC;AAAA,QACD,IAAI,CAAC,OAAO;AAAA,UAAS,MAAM,IAAI,MAAM,cAAc;AAAA,QACnD,OAAO,MAAM,OAAO,QAAQ,GAAG,KAAK;AAAA,QACnC,OAAO,GAAG;AAAA,QACX,QAAQ,MACP,gDACA,QACA,CACD;AAAA,QACA;AAAA;AAAA,MAGD,MAAM,OAAO,MAAM,KAAK,IAAI;AAAA,MAE5B,MAAM,cAAc,MAAK,YAAY,SAAS;AAAA,MAC9C,MAAM,cAAc,MAAK,KAAK,WAAW;AAAA,MAEzC,MAAM,UAAU,GAAG,cAAc,QAAQ;AAAA,MACzC,MAAM,SAAS,MAAK,aAAa,OAAO;AAAA,MACxC,IAAI;AAAA,QACH,MAAM,SAAS,MAAM,IAAI,KAAK,MAAM,EAAE,OAAO;AAAA,QAC7C,IAAI,CAAC;AAAA,UAAQ,MAAM,IAAI,MAAM,QAAQ,IAAI;AAAA,QACxC,MAAM;AAAA,MAGR,IAAI,OAAY,CAAC;AAAA,MACjB,IAAI;AAAA,QACH,MAAM,MAAM,GAAG,cAAc,QAAQ,EAAE,UAAU,KAAK,IAAI;AAAA,QAC1D,MAAM,IAAI,MAAa;AAAA,QACvB,OAAQ,EAAU,QAAQ,CAAC;AAAA,QAC1B,MAAM;AAAA,MAER,QAAQ,KAAK;AAAA,QACZ;AAAA,QACA;AAAA,QACA,MAAM;AAAA,QACN,MAAM,IAAI,cAAc;AAAA,QACxB,WAAW,YAAY;AAAA,QACvB;AAAA,MACD,CAAC;AAAA,IACF;AAAA,EACD;AAAA,EAGA,MAAM,QAAkB,CAAC;AAAA,EACzB,MAAM,KAAK,sEAAiD;AAAA,EAC5D,MAAM,KAAK,sBAAsB;AAAA,EACjC,MAAM,KAAK,gBAAgB;AAAA,EAC3B,MAAM,KAAK,EAAE;AAAA,EACb,MAAM,KAAK,2BAA2B;AAAA,EACtC,WAAW,KAAK,SAAS;AAAA,IACxB,MAAM,KACL,sBACC,EAAE,aACF,eACA,EAAE,OACF,eACA,EAAE,OACF,eACA,EAAE,OACF,iBACA,EAAE,YACF,cACA,KAAK,UAAU,EAAE,QAAQ,CAAC,CAAC,IAC3B,KACF;AAAA,EACD;AAAA,EACA,MAAM,KAAK,aAAa;AAAA,EACxB,MAAM,KAAK,EAAE;AAAA,EACb,MAAM,KAAK,wDAAwD;AAAA,EACnE,MAAM,KACL,mFACD;AAAA,EACA,MAAM,KAAK,EAAE;AAAA,EACb,MAAM,KACL,6EACD;AAAA,EACA,MAAM,KACL,gGACD;AAAA,EACA,MAAM,KAAK,EAAE;AAAA,EACb,MAAM,KAAK,sDAAsD;AAAA,EACjE,MAAM,KACL,mFACD;AAAA,EACA,MAAM,KAAK,uDAAuD;AAAA,EAClE,MAAM,KAAK,EAAE;AAAA,EACb,MAAM,KACL,+FACD;AAAA,EACA,MAAM,KAAK,uDAAuD;AAAA,EAClE,MAAM,KAAK,4DAA4D;AAAA,EACvE,MAAM,KAAK,GAAG;AAAA,EACd,MAAM,KAAK,EAAE;AAAA,EAEb,MAAM,IAAI,MAAM,MAAK,KAAK,iBAAiB,GAAG,MAAM,KAAK;AAAA,CAAI,CAAC;AAAA,EAC9D,QAAQ,IAAI,2BAA2B,MAAK,KAAK,iBAAiB,GAAG;AAAA,EAGrE,MAAM,iBAAiB,IAAI,IAAI,QAAQ,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC;AAAA,EAC/D,WAAW,cAAc,gBAAgB;AAAA,IACxC,MAAM,QAAQ,QAAQ,OAAO,CAAC,MAAM,EAAE,eAAe,UAAU;AAAA,IAC/D,MAAM,KAAe,CAAC;AAAA,IACtB,GAAG,KAAK,sEAAiD;AAAA,IACzD,GAAG,KAAK,EAAE;AAAA,IACV,GAAG,KAAK,wBAAwB;AAAA,IAChC,WAAW,KAAK,OAAO;AAAA,MACtB,GAAG,KACF,oBAAoB,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,qBAAqB,KAAK,UAAU,EAAE,QAAQ,CAAC,CAAC,MAC3J;AAAA,IACD;AAAA,IACA,GAAG,KAAK,IAAI;AAAA,IACZ,GAAG,KAAK,EAAE;AAAA,IACV,GAAG,KAAK,2BAA2B;AAAA,IACnC,GAAG,KAAK,mDAAmD;AAAA,IAC3D,GAAG,KAAK,EAAE;AAAA,IACV,GAAG,KAAK,6CAA6C;AAAA,IACrD,GAAG,KAAK,6BAA6B,gCAAgC;AAAA,IACrE,GAAG,KAAK,wBAAwB;AAAA,IAChC,GAAG,KAAK,GAAG;AAAA,IACX,GAAG,KAAK,EAAE;AAAA,IAEV,MAAM,IAAI,MACT,MAAK,KAAK,wBAAwB,GAAG,eAAe,GACpD,GAAG,KAAK;AAAA,CAAI,CACb;AAAA,IACA,QAAQ,IACP,2BAA2B,MAAK,KAAK,wBAAwB,GAAG,eAAe,GAChF;AAAA,EACD;AAAA;AAGD,eAAe,uBAAuB,CAAC,KAA4B;AAAA,EAClE,QAAQ,IAAI,uDAAuD;AAAA,EACnE,MAAM,aAAa,MAAK,KAAK,UAAU;AAAA,EACvC,MAAM,cAAc,MAAK,KAAK,YAAY,UAAU;AAAA,EAGpD,IAAI;AAAA,IACH,MAAM,GAAG,aAAa,EAAE,OAAO,MAAM,WAAW,KAAK,CAAC;AAAA,IACrD,MAAM;AAAA,EAGR,MAAM,iBAAiB,kBAAkB,GAAG;AAAA,EAC5C,QAAQ,IAAI,8BAA8B,cAAc;AAAA,EAKxD,eAAe,YAAY,CAAC,KAAa,OAAO,IAAuB;AAAA,IACtE,MAAM,QAAkB,CAAC;AAAA,IACzB,IAAI;AAAA,MACH,MAAM,UAAU,MAAM,SAAQ,KAAK,EAAE,eAAe,KAAK,CAAC;AAAA,MAE1D,WAAW,SAAS,SAAS;AAAA,QAC5B,MAAM,WAAW,MAAK,KAAK,MAAM,IAAI;AAAA,QACrC,MAAM,eAAe,MAAK,MAAM,MAAM,IAAI;AAAA,QAE1C,IAAI,MAAM,YAAY,GAAG;AAAA,UAExB,MAAM,SAAS,MAAM,aAAa,UAAU,YAAY;AAAA,UACxD,MAAM,KAAK,GAAG,MAAM;AAAA,QACrB,EAAO,SAAI,MAAM,OAAO,KAAK,eAAe,MAAM,IAAI,GAAG;AAAA,UACxD,MAAM,KAAK,YAAY;AAAA,QACxB;AAAA,MACD;AAAA,MACC,OAAO,KAAK;AAAA,MACb,QAAQ,MAAM,qCAAqC,QAAQ,GAAG;AAAA;AAAA,IAG/D,OAAO;AAAA;AAAA,EAGR,QAAQ,IACP,+BAA+B,kCAChC;AAAA,EACA,MAAM,gBAAgB,MAAM,aAAa,UAAU;AAAA,EACnD,QAAQ,IACP,kDACA,cAAc,MACf;AAAA,EAEA,IAAI,cAAc,WAAW,GAAG;AAAA,IAC/B,QAAQ,IACP,oEACD;AAAA,IACA;AAAA,EACD;AAAA,EAEA,QAAQ,IACP,4BAA4B,cAAc,yBAC3C;AAAA,EAKA,WAAW,QAAQ,eAAe;AAAA,IACjC,MAAM,aAAa,MAAK,YAAY,IAAI;AAAA,IACxC,MAAM,aAAa,MAAK,aAAa,KAAK,QAAQ,WAAW,MAAM,CAAC;AAAA,IAEpE,IAAI;AAAA,MACH,MAAM,YAAY,oBAAoB,UAAU;AAAA,MAChD,MAAM,QAAQ,KAAK,SAAS,MAAM;AAAA,MAElC,IAAI;AAAA,MACJ,IAAI,eAAe,cAAc;AAAA,QAChC,aAAa,MAAM,uBAAuB,WAAW,KAAK;AAAA,UACzD,WAAW,eAAe;AAAA,UAC1B,OAAO;AAAA,UACP;AAAA,UACA,UAAU;AAAA,QACX,CAAC;AAAA,MACF,EAAO;AAAA,QACN,aAAa,4BAA4B,SAAS;AAAA;AAAA,MAInD,MAAM,IAAI,MAAM,YAAY,UAAU;AAAA,MACrC,OAAO,OAAO;AAAA,MACf,QAAQ,MAAM,wCAAwC,SAAS,KAAK;AAAA;AAAA,EAEtE;AAAA;AAGD,eAAe,qBAAqB,CAAC,KAAa,OAAiB,CAAC,GAAG;AAAA,EACtE,MAAM,YAAY,MAAK,KAAK,OAAO,QAAQ;AAAA,EAC3C,MAAM,aAAa,MAAK,WAAW,WAAW;AAAA,EAG9C,MAAM,SAAS,MAAM,IAAI,KAAK,UAAU,EAAE,OAAO;AAAA,EACjD,IAAI,CAAC,QAAQ;AAAA,IACZ,QAAQ,IAAI,yDAAyD;AAAA,IACrE;AAAA,EACD;AAAA,EAEA,QAAQ,IACP,iEACD;AAAA,EAEA,MAAM,SAAS,iBAAiB,IAAI;AAAA,EACpC,MAAM,SAAS,MAAM,IAAI,MAAM;AAAA,IAC9B,aAAa,CAAC,UAAU;AAAA,IACxB,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,WAAW;AAAA,IACX,WAAW,SAAS,WAAW;AAAA,IAC/B,QAAQ;AAAA,IAER,QAAQ;AAAA,MACP,OAAO;AAAA,MACP,OAAO;AAAA,MACP,OAAO;AAAA,IACR;AAAA,IACA,KAAK;AAAA,MACJ,SAAS;AAAA,MACT,cAAc;AAAA,MACd,aAAa,CAAC;AAAA,IACf;AAAA,IACA,QAAQ;AAAA,MACP,wBAAwB,SAAS,iBAAiB;AAAA,MAClD,SAAS,SAAS,UAAU;AAAA,MAC5B,wBAAwB,SAAS,iBAAiB;AAAA,IACnD;AAAA,OACI,SAAS,EAAE,MAAM,CAAC,WAAW,UAAU,EAAE,IAAI,CAAC;AAAA,EACnD,CAAC;AAAA,EAED,IAAI,CAAC,OAAO,SAAS;AAAA,IACpB,QAAQ,MAAM,wCAAwC;AAAA,IACtD,WAAW,OAAO,OAAO;AAAA,MAAM,QAAQ,MAAM,GAAG;AAAA,IAChD,MAAM,IAAI,MAAM,4BAA4B;AAAA,EAC7C;AAAA,EAGA,MAAM,aAAa,MAAK,KAAK,YAAY,SAAS;AAAA,EAGlD,IAAI;AAAA,IACH,MAAM,gBAAgB,MAAM,SAAQ,UAAU;AAAA,IAC9C,WAAW,QAAQ,eAAe;AAAA,MAEjC,IAAI,4CAA4C,KAAK,IAAI,GAAG;AAAA,QAC3D,MAAM,GAAG,MAAK,YAAY,IAAI,GAAG,EAAE,OAAO,KAAK,CAAC;AAAA,MACjD;AAAA,IACD;AAAA,IACC,MAAM;AAAA,EAMR,MAAM,UAAkE,CAAC;AAAA,EACzE,IAAI,YAAY;AAAA,EAEhB,WAAW,UAAU,OAAO,SAAS;AAAA,IACpC,MAAM,UAAU,MAAM,OAAO,KAAK;AAAA,IAClC,MAAM,WACL,OAAO,KAAK,MAAM,GAAG,EAAE,IAAI,KAC3B,OAAO,KAAK,MAAM,IAAI,EAAE,IAAI,KAC5B;AAAA,IACD,MAAM,WAAW,MAAK,YAAY,QAAQ;AAAA,IAE1C,MAAM,IAAI,MAAM,UAAU,OAAO;AAAA,IAEjC,MAAM,UACL,SAAS,WAAW,QAAQ,KAC5B,SAAS,SAAS,KAAK,KACvB,CAAC,SAAS,SAAS,MAAM;AAAA,IAC1B,IAAI;AAAA,MAAS,YAAY;AAAA,IAEzB,QAAQ,KAAK;AAAA,MACZ;AAAA,MACA,MAAM,QAAQ;AAAA,MACd;AAAA,IACD,CAAC;AAAA,EACF;AAAA,EAIA,MAAM,YAAY,QAAQ,OAAO,CAAC,KAAK,MAAM,MAAM,EAAE,MAAM,CAAC;AAAA,EAC5D,MAAM,UAAU,IAAI,SACnB,IAAI,YAAY,EAAE,OACjB,QAAQ,KAAK,CAAC,MAAM,EAAE,OAAO,GAAG,WAC7B,MAAM,IAAI,KAAK,MAAK,YAAY,SAAS,CAAC,EAAE,KAAK,IACjD,EACJ,CACD,EAAE;AAAA,EAEF,QAAQ,IACP,uBAAuB,QAAQ,kBAAkB,YAAY,MAAM,QAAQ,CAAC,SAAS,UAAU,MAAM,QAAQ,CAAC,cAC/G;AAAA,EACA,QAAQ,IAAI,wBAAwB,WAAW;AAAA,EAC/C,QAAQ,IACP,yBAAyB,QAAQ,OAAO,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,SAAS,SAAS,KAAK,CAAC,EAAE,QAC1F;AAAA;AAGD,eAAe,QAAQ,CAAC,KAAa,OAAiB,CAAC,GAAG;AAAA,EACzD,MAAM,YAAY,YAAY,IAAI;AAAA,EAClC,QAAQ,IAAI,sCAAsC;AAAA,EAGlD,MAAM,gBAAgB,GAAG;AAAA,EAIzB,MAAM,eAAe,GAAG;AAAA,EAGxB,MAAM,wBAAwB,GAAG;AAAA,EAGjC,MAAM,aAAa,MAAK,KAAK,UAAU;AAAA,EACvC,IAAI;AAAA,IACH,MAAM,QAAQ,MAAM,cAAc,UAAU;AAAA,IAC5C,MAAM,UAAU,MAAM,aAAa,UAAU;AAAA,IAC7C,MAAM,MAAM,MAAM,KAAK,IAAI,IAAI,CAAC,GAAG,OAAO,GAAG,OAAO,CAAC,CAAC;AAAA,IAGtD,MAAM,OAAO,kBAAkB,IAAI,IAAI,CAAC,MAAM,EAAE,QAAQ,OAAO,GAAG,CAAC,CAAC;AAAA,IACpE,MAAM,KAAK,mBAAmB,IAAI;AAAA,IAClC,MAAM,IAAI,MAAM,MAAK,KAAK,aAAa,GAAG,EAAE;AAAA,IAC5C,QAAQ,IAAI,mCAAmC,MAAK,KAAK,aAAa,GAAG;AAAA,IACxE,OAAO,OAAO;AAAA,IACf,QAAQ,MAAM,4CAA4C,KAAK;AAAA,IAC/D,MAAM;AAAA;AAAA,EAIP,IAAI;AAAA,IACH,MAAM,mBAAmB,KAAK,IAAI;AAAA,IAClC,QAAQ,IACP,oCAAoC,MAAK,KAAK,iBAAiB,sBAChE;AAAA,IACC,OAAO,OAAO;AAAA,IACf,QAAQ,MAAM,6CAA6C,KAAK;AAAA,IAChE,MAAM;AAAA;AAAA,EAIP,MAAM,aAAuB,CAAC;AAAA,EAC9B,WAAW,KAAK,sEAAiD;AAAA,EACjE,WAAW,KAAK,sBAAsB;AAAA,EACtC,WAAW,KAAK,gBAAgB;AAAA,EAChC,WAAW,KAAK,EAAE;AAAA,EAClB,WAAW,KACV,iEACD;AAAA,EACA,WAAW,KAAK,EAAE;AAAA,EAClB,WAAW,KAAK,4BAA4B;AAAA,EAC5C,WAAW,KAAK,YAAY;AAAA,EAC5B,WAAW,KAAK,eAAe;AAAA,EAC/B,WAAW,KAAK,mBAAmB;AAAA,EACnC,WAAW,KAAK,2CAA2C;AAAA,EAC3D,WAAW,KAAK,aAAa;AAAA,EAC7B,WAAW,KAAK,EAAE;AAAA,EAClB,WAAW,KAAK,kDAAkD;AAAA,EAElE,MAAM,IAAI,MAAM,MAAK,KAAK,YAAY,GAAG,WAAW,KAAK;AAAA,CAAI,CAAC;AAAA,EAE9D,QAAQ,IAAI,kCAAkC,MAAK,KAAK,YAAY,GAAG;AAAA,EAGvE,IAAI;AAAA,IACH,MAAM,sBAAsB,KAAK,IAAI;AAAA,IACpC,OAAO,OAAO;AAAA,IACf,QAAQ,MAAM,6CAA6C,KAAK;AAAA,IAChE,MAAM;AAAA;AAAA,EAGP,MAAM,UAAU,YAAY,IAAI;AAAA,EAChC,MAAM,aAAa,UAAU,aAAa,MAAM,QAAQ,CAAC;AAAA,EACzD,QAAQ,IAAI,wCAAwC,WAAW;AAAA;AAGhE,eAA8B,GAAG,CAAC,MAAgB;AAAA,EACjD,MAAM,MAAM,QAAQ,IAAI;AAAA,EACxB,MAAM,YAAY,KAAK,SAAS,SAAS,KAAK,KAAK,SAAS,IAAI;AAAA,EAChE,MAAM,SAAS,iBAAiB,IAAI;AAAA,EAEpC,IAAI,CAAC,WAAW;AAAA,IACf,MAAM,SAAS,KAAK,IAAI;AAAA,IACxB,MAAM,0BAA0B,KAAK,MAAM;AAAA,IAC3C,0BAA0B,GAAG;AAAA,IAC7B;AAAA,EACD;AAAA,EAEA,QAAQ,IAAI,kCAAkC;AAAA,EAC9C,QAAQ,IAAI,qCAAqC;AAAA,EACjD,MAAM,SAAS,KAAK,IAAI;AAAA,EAExB,IAAI;AAAA,IACH,MAAM,0BAA0B,KAAK,MAAM;AAAA,IAC3C,0BAA0B,GAAG;AAAA,IAC5B,MAAM;AAAA,EAGR,MAAM,eAAe,OAAO,WAAmB;AAAA,IAC9C,MAAM,QAAQ;AAAA,MACb,OAAO,QAAQ,IAAI,QAAQ,GAAG,KAAK;AAAA,MACnC,OAAO,QAAQ,IAAI,gBAAgB,GAAG,KAAK;AAAA,MAC3C;AAAA,MACA;AAAA,IACD,EAAE,OAAO,OAAO;AAAA,IAChB,WAAW,KAAK,OAAO;AAAA,MACtB,IAAI;AAAA,QACH,MAAM,MAAM,oBAAoB,sBAAsB;AAAA,UACrD,QAAQ;AAAA,QACT,CAAC;AAAA,QACD,QAAQ,IACP,uCAAuC,KAAK,SAAS,KAAK,WAAW,IACtE;AAAA,QACA;AAAA,QACC,MAAM;AAAA,IACT;AAAA;AAAA,EAID,MAAM,aAAa,oBAAoB;AAAA,EAGvC,MAAM,aAAa,MAAK,KAAK,UAAU;AAAA,EACvC,QAAQ,IAAI,0BAA0B,2BAA2B;AAAA,EACjE,IAAI,WAAkC;AAAA,EACtC,MAAM,gBAAgB,MACrB,YACA,EAAE,WAAW,KAAK,GAClB,CAAC,KAAK,aAAa;AAAA,IAClB,IAAI,CAAC;AAAA,MAAU;AAAA,IACf,IAAI;AAAA,MAAU,aAAa,QAAQ;AAAA,IACnC,WAAW,WAAW,YAAY;AAAA,MACjC,QAAQ,IAAI,gDAAgD;AAAA,MAC5D,IAAI;AAAA,QACH,MAAM,SAAS,KAAK,IAAI;AAAA,QACxB,MAAM,0BAA0B,KAAK,MAAM;AAAA,QAC3C,MAAM,aAAa,eAAe;AAAA,QACjC,OAAO,GAAG;AAAA,QACX,QAAQ,MAAM,4CAA4C,CAAC;AAAA;AAAA,OAE1D,EAAE;AAAA,GAEP;AAAA,EAGA,MAAM,aAAa,MAAK,KAAK,OAAO,QAAQ;AAAA,EAC5C,QAAQ,IAAI,0BAA0B,2BAA2B;AAAA,EACjE,IAAI,aAAoC;AAAA,EACxC,MAAM,YAAY,MAAM,YAAY,EAAE,WAAW,KAAK,GAAG,CAAC,KAAK,aAAa;AAAA,IAC3E,IAAI,CAAC;AAAA,MAAU;AAAA,IACf,MAAM,OAAO,OAAO,QAAQ;AAAA,IAC5B,IAAI,KAAK,SAAS,UAAU,KAAK,KAAK,SAAS,cAAc;AAAA,MAAG;AAAA,IAChE,IAAI,KAAK,SAAS,SAAS,KAAK,KAAK,SAAS,UAAU;AAAA,MAAG;AAAA,IAC3D,IAAI,CAAC,qCAAqC,KAAK,IAAI;AAAA,MAAG;AAAA,IACtD,IAAI;AAAA,MAAY,aAAa,UAAU;AAAA,IACvC,aAAa,WAAW,YAAY;AAAA,MACnC,IAAI;AAAA,QAEH,IACC,SAAS,eACT,KAAK,SAAS,aAAa,KAC3B,KAAK,SAAS,QAAQ,KACtB,KAAK,SAAS,YAAY,GACzB;AAAA,UACD,QAAQ,IACP,yDACD;AAAA,UACA,MAAM,sBAAsB,KAAK,IAAI;AAAA,QACtC;AAAA,QACA,MAAM,0BAA0B,KAAK,MAAM;AAAA,QAC3C,MAAM,aAAa,eAAe;AAAA,QACjC,MAAM;AAAA,OACN,GAAG;AAAA,GACN;AAAA,EAGD,QAAQ,GAAG,UAAU,MAAM;AAAA,IAC1B,QAAQ,IAAI;AAAA,qCAAwC;AAAA,IACpD,IAAI;AAAA,MACH,cAAc,MAAM;AAAA,MACnB,MAAM;AAAA,IACR,IAAI;AAAA,MACH,UAAU,MAAM;AAAA,MACf,MAAM;AAAA,IACR,QAAQ,KAAK,CAAC;AAAA,GACd;AAAA;AAAA,IAp/BI,aAAa,qBACb,aAAa,YACb,gBAAgB,sBAChB,oBAAoB,uBACpB,yBAAyB,wBACzB,eAAe;AAAA;AAAA,EArCrB;AAAA,EACA;AAAA,EAOA;AAAA;;;ACmBO,SAAS,iBAAiB,CAAC,MAAsB;AAAA,EACvD,IAAI,UAAU;AAAA,EAGd,MAAM,iBAAiB,OAAO,QAAQ,aAAa,EAAE,KACpD,EAAE,KAAK,OAAO,EAAE,SAAS,EAAE,MAC5B;AAAA,EAEA,YAAY,QAAQ,aAAa,gBAAgB;AAAA,IAEhD,UAAU,QAAQ,QACjB,IAAI,OAAO,IAAI,OAAO,QAAQ,uBAAuB,MAAM,MAAM,GAAG,GACpE,GAAG,eACJ;AAAA,EACD;AAAA,EAEA,OAAO;AAAA;AASD,SAAS,aAAa,CAAC,MAAsB;AAAA,EACnD,OACC,KAEE,QAAQ,gBAAgB,UAAU,EAClC,QAAQ,gBAAgB,UAAU,EAClC,QAAQ,mBAAmB,UAAU,EACrC,QAAQ,kBAAkB,UAAU,EACpC,QAAQ,iBAAiB,UAAU,EACnC,QAAQ,eAAe,UAAU,EAEjC,QAAQ,uBAAuB,UAAU,EACzC,QAAQ,uBAAuB,UAAU,EACzC,QAAQ,0BAA0B,UAAU,EAC5C,QAAQ,yBAAyB,UAAU,EAC3C,QAAQ,wBAAwB,UAAU,EAC1C,QAAQ,sBAAsB,UAAU,EACxC,QAAQ,WAAW,SAAS;AAAA;AAUzB,SAAS,qBAAqB,CAAC,MAAsB;AAAA,EAC3D,OAAO,cAAc,kBAAkB,IAAI,CAAC;AAAA;AAStC,SAAS,yBAAyB,CAAC,QAA6B;AAAA,EACtE,OAAO,CAAC,SAAiB;AAAA,IACxB,MAAM,OAAO,OAAO,UAAU,KAAK,SAAS;AAAA,IAC5C,MAAM,QAAQ,KAAK,MAAM;AAAA,CAAI;AAAA,IAC7B,OAAO,UAAU,MAAM,IAAI,KAAK;AAAA,IAEhC,WAAW,QAAQ,OAAO;AAAA,MAEzB,MAAM,cAAc,KAAK,KAAK;AAAA,MAC9B,IAAI,CAAC,aAAa;AAAA,QACjB;AAAA,MACD;AAAA,MAGA,MAAM,cAAc,sBAAsB,IAAI;AAAA,MAC9C,QAAQ,IAAI,WAAW;AAAA,IACxB;AAAA;AAAA;AAAA,IAnGI;AAAA;AAAA,kBAAwC;AAAA,IAC7C,aAAa;AAAA,IACb,iBAAiB;AAAA,IACjB,qBAAqB;AAAA,IACrB,sBAAsB;AAAA,IACtB,sBAAsB;AAAA,IACtB,iBAAiB;AAAA,IACjB,iBAAiB;AAAA,IACjB,mBAAmB;AAAA,IACnB,mBAAmB;AAAA,IACnB,qBAAqB;AAAA,IACrB,SAAS;AAAA,IACT,SAAS;AAAA,EACV;AAAA;;;AChBA,eAAsB,kBAAkB,CACvC,OAAO,MACP,UAAU,KACM;AAAA,EAChB,MAAM,YAAY,KAAK,IAAI;AAAA,EAC3B,MAAM,gBAAgB;AAAA,EAEtB,OAAO,KAAK,IAAI,IAAI,YAAY,SAAS;AAAA,IACxC,IAAI;AAAA,MACH,MAAM,WAAW,MAAM,MAAM,oBAAoB,SAAS;AAAA,QACzD,QAAQ;AAAA,MACT,CAAC;AAAA,MAED,IAAI,SAAS,SAAS,KAAK;AAAA,QAC1B;AAAA,MACD;AAAA,MACC,MAAM;AAAA,IAGR,MAAM,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,aAAa,CAAC;AAAA,EAClE;AAAA,EAEA,MAAM,IAAI,MAAM,+CAA+C,WAAW;AAAA;;;;;;;ACvB3E,kBAAS;AACT,uBAAS;AACT,iBAAS;AAYT,eAAe,oBAAoB,CAClC,KACA,UAAU,OACM;AAAA,EAChB,MAAM,gBAAgB;AAAA,IACrB,MAAK,KAAK,oBAAoB;AAAA,IAC9B,MAAK,KAAK,qBAAqB;AAAA,IAC/B,MAAK,KAAK,mBAAmB;AAAA,EAC9B;AAAA,EAEA,MAAM,aAAa,MAAK,KAAK,kBAAkB;AAAA,EAE/C,MAAM,YAAY,KAAK,IAAI;AAAA,EAC3B,MAAM,gBAAgB;AAAA,EAEtB,OAAO,KAAK,IAAI,IAAI,YAAY,SAAS;AAAA,IAExC,MAAM,gBAAgB,cAAc,MAAM,CAAC,SAAS,YAAW,IAAI,CAAC;AAAA,IAEpE,IAAI,CAAC,eAAe;AAAA,MACnB,MAAM,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,aAAa,CAAC;AAAA,MACjE;AAAA,IACD;AAAA,IAGA,IAAI,YAAW,UAAU,GAAG;AAAA,MAC3B,QAAQ,aAAa;AAAA,MACrB,IAAI;AAAA,QACH,MAAM,QAAQ,YAAY,UAAU;AAAA,QAEpC,MAAM,kBAAkB,MAAM,KAAK,CAAC,MAAc;AAAA,UACjD,IACC,CAAC,EAAE,WAAW,QAAQ,KACtB,CAAC,EAAE,SAAS,KAAK,KACjB,EAAE,SAAS,MAAM,GAChB;AAAA,YACD,OAAO;AAAA,UACR;AAAA,UAEA,IAAI;AAAA,YACH,MAAM,WAAW,MAAK,YAAY,CAAC;AAAA,YACnC,MAAM,QAAQ,SAAS,QAAQ;AAAA,YAC/B,OAAO,MAAM,OAAO;AAAA,YACnB,MAAM;AAAA,YACP,OAAO;AAAA;AAAA,SAER;AAAA,QAED,IAAI,iBAAiB;AAAA,UAGpB,MAAM,WAAW,MAAK,YAAY,eAAe;AAAA,UACjD,MAAM,QAAQ,SAAS,QAAQ,EAAE;AAAA,UACjC,MAAM,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,GAAG,CAAC;AAAA,UACvD,MAAM,QAAQ,SAAS,QAAQ,EAAE;AAAA,UAEjC,IAAI,UAAU,SAAS,QAAQ,KAAK;AAAA,YACnC;AAAA,UACD;AAAA,QACD;AAAA,QACC,MAAM;AAAA,IAGT;AAAA,IAEA,MAAM,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,aAAa,CAAC;AAAA,EAClE;AAAA,EAEA,MAAM,IAAI,MACT,0DAA0D,WAC3D;AAAA;AAGD,SAAS,iBAAiB,GAAW;AAAA,EAGpC,MAAM,UAAU,MAAK,YAAY,KAAK,MAAM,MAAM,QAAQ;AAAA,EAC1D,MAAM,WAAW,YAAW,OAAO;AAAA,EAEnC,IAAI,UAAU;AAAA,IAEb,OAAO,OAAO;AAAA,EACf;AAAA,EAGA,MAAM,MAAM,QAAQ,IAAI;AAAA,EACxB,MAAM,mBAAmB;AAAA,IACxB,MAAK,KAAK,gBAAgB,QAAQ,SAAS;AAAA,IAC3C,MAAK,KAAK,MAAM,gBAAgB,QAAQ,SAAS;AAAA,IACjD,MAAK,KAAK,MAAM,MAAM,gBAAgB,QAAQ,SAAS;AAAA,IACvD,MAAK,KAAK,MAAM,MAAM,MAAM,gBAAgB,QAAQ,SAAS;AAAA,EAC9D;AAAA,EAEA,WAAW,YAAW,kBAAkB;AAAA,IACvC,IAAI,YAAW,QAAO,GAAG;AAAA,MACxB,OAAO;AAAA,IACR;AAAA,EACD;AAAA,EAGA,OAAO;AAAA;AAGR,eAA8B,GAAG,CAAC,MAAgB;AAAA,EACjD,MAAM,eAAe,KAAK,SAAS,UAAU,KAAK,KAAK,SAAS,IAAI;AAAA,EACpE,IAAI;AAAA,IACH,QAAQ,IAAI,+CAA+C;AAAA,IAC3D,QAAQ,IAAI;AAAA,CAAsC;AAAA,IAElD,MAAM,aAAa,kBAAkB;AAAA,IAKrC,MAAM,WAAW,WAAW,SAAS,GAAG;AAAA,IACxC,MAAM,aAAa,WAAW,GAAG,2BAA2B;AAAA,IAC5D,MAAM,UAAU,WAAW,CAAC,IAAI,CAAC,OAAO,SAAS;AAAA,IAEjD,MAAM,aAAa,OAAM,YAAY,SAAS;AAAA,MAC7C,OAAO,CAAC,UAAU,QAAQ,MAAM;AAAA,MAChC,OAAO;AAAA,IACR,CAAC;AAAA,IAID,QAAQ,IAAI,oCAAoC;AAAA,IAChD,IAAI;AAAA,MACH,MAAM,qBAAqB,QAAQ,IAAI,CAAC;AAAA,MACvC,OAAO,OAAO;AAAA,MACf,QAAQ,MAAM,uCAAuC,KAAK;AAAA,MAC1D,WAAW,KAAK;AAAA,MAChB,QAAQ,KAAK,CAAC;AAAA;AAAA,IAIf,MAAM,gBAAgB,OAAM,OAAO,CAAC,WAAW,cAAc,GAAG;AAAA,MAC/D,OAAO,CAAC,UAAU,QAAQ,MAAM;AAAA,IACjC,CAAC;AAAA,IAGD,QAAQ,IAAI,sDAAsD;AAAA,IAClE,MAAM,OAAO,OAAO,QAAQ,IAAI,QAAQ,MAAM;AAAA,IAC9C,IAAI;AAAA,MACH,MAAM,mBAAmB,IAAI;AAAA,MAC5B,OAAO,OAAO;AAAA,MACf,QAAQ,MAAM,yCAAyC,KAAK;AAAA,MAC5D,WAAW,KAAK;AAAA,MAChB,cAAc,KAAK;AAAA,MACnB,QAAQ,KAAK,CAAC;AAAA;AAAA,IAGf,IAAI,cAAc;AAAA,MAGjB,MAAM,YAAY,EAAE,SAAS,GAAG;AAAA,MAChC,MAAM,eAAe,EAAE,SAAS,GAAG;AAAA,MAEnC,MAAM,kBAAkB,CAAC,SAAiB;AAAA,QACzC,MAAM,OAAO,UAAU,UAAU,KAAK,SAAS;AAAA,QAC/C,MAAM,QAAQ,KAAK,MAAM;AAAA,CAAI;AAAA,QAC7B,UAAU,UAAU,MAAM,IAAI,KAAK;AAAA,QAEnC,WAAW,QAAQ,OAAO;AAAA,UAEzB,IAAI,CAAC,KAAK,KAAK,GAAG;AAAA,YACjB;AAAA,UACD;AAAA,UACA,MAAM,cAAc,sBAAsB,IAAI;AAAA,UAC9C,QAAQ,IAAI,WAAW;AAAA,QACxB;AAAA;AAAA,MAGD,MAAM,qBAAqB,0BAA0B,YAAY;AAAA,MAEjE,WAAW,QAAQ,GAAG,QAAQ,eAAe;AAAA,MAC7C,WAAW,QAAQ,GAAG,QAAQ,eAAe;AAAA,MAC7C,cAAc,QAAQ,GAAG,QAAQ,kBAAkB;AAAA,MACnD,cAAc,QAAQ,GAAG,QAAQ,kBAAkB;AAAA,MAEnD,WAAW,GAAG,QAAQ,CAAC,SAAS;AAAA,QAC/B,QAAQ,IAAI;AAAA,yCAA4C,MAAM;AAAA,OAC9D;AAAA,MAED,cAAc,GAAG,QAAQ,CAAC,SAAS;AAAA,QAClC,QAAQ,IAAI;AAAA,oCAAuC,MAAM;AAAA,OACzD;AAAA,MAGD,QAAQ,GAAG,UAAU,MAAM;AAAA,QAC1B,QAAQ,IAAI;AAAA,+BAAkC;AAAA,QAC9C,WAAW,KAAK,QAAQ;AAAA,QACxB,cAAc,KAAK,QAAQ;AAAA,QAC3B,QAAQ,KAAK,CAAC;AAAA,OACd;AAAA,IACF,EAAO;AAAA,MAEN,MAAM,UAAU,MAAa;AAAA,MAC7B,MAAM,UAAU,MAAa;AAAA,MAE7B,MAAM,SAAS,QAAQ,QAAQ,OAAO;AAAA,QACrC,UAAU;AAAA,QACV,OAAO;AAAA,QACP,OAAO;AAAA,MACR,CAAC;AAAA,MAED,MAAM,OAAO,IAAI,QAAQ,QAAQ,KAAK;AAAA,QACrC,MAAM;AAAA,QACN,MAAM;AAAA,QACN;AAAA,MACD,CAAC;AAAA,MAGD,MAAM,SAAS,KAAK,IAAI,GAAG,GAAG,GAAG,GAAG,QAAQ,QAAQ,KAAK;AAAA,QACxD,OAAO;AAAA,QACP,QAAQ,EAAE,MAAM,OAAO;AAAA,QACvB,OAAO;AAAA,UACN,QAAQ,EAAE,IAAI,OAAO;AAAA,QACtB;AAAA,QACA,YAAY;AAAA,QACZ,cAAc;AAAA,QACd,WAAW;AAAA,UACV,IAAI;AAAA,UACJ,SAAS;AAAA,QACV;AAAA,QACA,MAAM;AAAA,QACN,MAAM;AAAA,QACN,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,OAAO;AAAA,QACP,WAAW;AAAA,MACZ,CAAC;AAAA,MAED,MAAM,YAAY,KAAK,IAAI,GAAG,GAAG,GAAG,GAAG,QAAQ,QAAQ,KAAK;AAAA,QAC3D,OAAO;AAAA,QACP,QAAQ,EAAE,MAAM,OAAO;AAAA,QACvB,OAAO;AAAA,UACN,QAAQ,EAAE,IAAI,QAAQ;AAAA,QACvB;AAAA,QACA,YAAY;AAAA,QACZ,cAAc;AAAA,QACd,WAAW;AAAA,UACV,IAAI;AAAA,UACJ,SAAS;AAAA,QACV;AAAA,QACA,MAAM;AAAA,QACN,MAAM;AAAA,QACN,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,OAAO;AAAA,QACP,WAAW;AAAA,MACZ,CAAC;AAAA,MAGD,OAAO,IAAI,CAAC,MAAM,GAAG,GAAG,MAAM;AAAA,QAC7B,OAAO,OAAO,EAAE;AAAA,QAChB,OAAO,OAAO;AAAA,OACd;AAAA,MAED,OAAO,IAAI,CAAC,QAAQ,GAAG,GAAG,MAAM;AAAA,QAC/B,OAAO,OAAO,CAAC;AAAA,QACf,OAAO,OAAO;AAAA,OACd;AAAA,MAED,OAAO,IAAI,CAAC,QAAQ,GAAG,MAAM;AAAA,QAC5B,OAAO,OAAO,CAAC,OAAO,MAAM;AAAA,QAC5B,OAAO,OAAO;AAAA,OACd;AAAA,MAED,OAAO,IAAI,CAAC,UAAU,GAAG,MAAM;AAAA,QAC9B,OAAO,OAAO,OAAO,MAAM;AAAA,QAC3B,OAAO,OAAO;AAAA,OACd;AAAA,MAED,OAAO,IAAI,CAAC,QAAQ,GAAG,GAAG,MAAM;AAAA,QAC/B,OAAO,cAAc,CAAC;AAAA,QACtB,OAAO,OAAO;AAAA,OACd;AAAA,MAED,OAAO,IAAI,CAAC,OAAO,GAAG,GAAG,MAAM;AAAA,QAC9B,OAAO,cAAc,GAAG;AAAA,QACxB,OAAO,OAAO;AAAA,OACd;AAAA,MAGD,UAAU,IAAI,CAAC,MAAM,GAAG,GAAG,MAAM;AAAA,QAChC,UAAU,OAAO,EAAE;AAAA,QACnB,OAAO,OAAO;AAAA,OACd;AAAA,MAED,UAAU,IAAI,CAAC,QAAQ,GAAG,GAAG,MAAM;AAAA,QAClC,UAAU,OAAO,CAAC;AAAA,QAClB,OAAO,OAAO;AAAA,OACd;AAAA,MAED,UAAU,IAAI,CAAC,QAAQ,GAAG,MAAM;AAAA,QAC/B,UAAU,OAAO,CAAC,UAAU,MAAM;AAAA,QAClC,OAAO,OAAO;AAAA,OACd;AAAA,MAED,UAAU,IAAI,CAAC,UAAU,GAAG,MAAM;AAAA,QACjC,UAAU,OAAO,UAAU,MAAM;AAAA,QACjC,OAAO,OAAO;AAAA,OACd;AAAA,MAED,UAAU,IAAI,CAAC,QAAQ,GAAG,GAAG,MAAM;AAAA,QAClC,UAAU,cAAc,CAAC;AAAA,QACzB,OAAO,OAAO;AAAA,OACd;AAAA,MAED,UAAU,IAAI,CAAC,OAAO,GAAG,GAAG,MAAM;AAAA,QACjC,UAAU,cAAc,GAAG;AAAA,QAC3B,OAAO,OAAO;AAAA,OACd;AAAA,MAGD,OAAO,GAAG,aAAa,MAAM;AAAA,QAC5B,OAAO,OAAO,CAAC;AAAA,QACf,OAAO,OAAO;AAAA,OACd;AAAA,MAED,OAAO,GAAG,WAAW,MAAM;AAAA,QAC1B,OAAO,OAAO,EAAE;AAAA,QAChB,OAAO,OAAO;AAAA,OACd;AAAA,MAED,UAAU,GAAG,aAAa,MAAM;AAAA,QAC/B,UAAU,OAAO,CAAC;AAAA,QAClB,OAAO,OAAO;AAAA,OACd;AAAA,MAED,UAAU,GAAG,WAAW,MAAM;AAAA,QAC7B,UAAU,OAAO,EAAE;AAAA,QACnB,OAAO,OAAO;AAAA,OACd;AAAA,MAGD,OAAO,GAAG,SAAS,MAAM;AAAA,QACxB,OAAO,MAAM;AAAA,QACb,OAAO,OAAO;AAAA,OACd;AAAA,MAED,UAAU,GAAG,SAAS,MAAM;AAAA,QAC3B,UAAU,MAAM;AAAA,QAChB,OAAO,OAAO;AAAA,OACd;AAAA,MAGD,OAAO,IAAI,CAAC,KAAK,GAAG,MAAM;AAAA,QACzB,IAAI,OAAO,YAAY,QAAQ;AAAA,UAC9B,UAAU,MAAM;AAAA,QACjB,EAAO;AAAA,UACN,OAAO,MAAM;AAAA;AAAA,QAEd,OAAO,OAAO;AAAA,OACd;AAAA,MAGD,OAAO,MAAM;AAAA,MAEb,OAAO,OAAO;AAAA,MAGd,WAAW,QAAQ,GAAG,QAAQ,CAAC,SAAiB;AAAA,QAC/C,MAAM,OAAO,KAAK,SAAS;AAAA,QAE3B,MAAM,QAAQ,KAAK,MAAM;AAAA,CAAI,EAAE,OAAO,CAAC,SAAS,KAAK,KAAK,CAAC;AAAA,QAC3D,IAAI,MAAM,SAAS,GAAG;AAAA,UACrB,MAAM,UAAU,kBAAkB,MAAM,KAAK;AAAA,CAAI,CAAC;AAAA,UAClD,OAAO,IAAI,OAAO;AAAA,UAClB,OAAO,OAAO;AAAA,QACf;AAAA,OACA;AAAA,MAED,WAAW,QAAQ,GAAG,QAAQ,CAAC,SAAiB;AAAA,QAC/C,MAAM,OAAO,KAAK,SAAS;AAAA,QAE3B,MAAM,QAAQ,KAAK,MAAM;AAAA,CAAI,EAAE,OAAO,CAAC,SAAS,KAAK,KAAK,CAAC;AAAA,QAC3D,IAAI,MAAM,SAAS,GAAG;AAAA,UACrB,MAAM,UAAU,kBAAkB,MAAM,KAAK;AAAA,CAAI,CAAC;AAAA,UAClD,OAAO,IAAI,OAAO;AAAA,UAClB,OAAO,OAAO;AAAA,QACf;AAAA,OACA;AAAA,MAGD,cAAc,QAAQ,GAAG,QAAQ,CAAC,SAAiB;AAAA,QAClD,MAAM,OAAO,KAAK,SAAS;AAAA,QAE3B,MAAM,eAAe,KACnB,MAAM;AAAA,CAAI,EACV,OAAO,CAAC,SAAS,KAAK,KAAK,CAAC,EAC5B,KAAK;AAAA,CAAI;AAAA,QACX,IAAI,cAAc;AAAA,UACjB,MAAM,UAAU,kBAAkB,YAAY;AAAA,UAC9C,UAAU,IAAI,OAAO;AAAA,UACrB,OAAO,OAAO;AAAA,QACf;AAAA,OACA;AAAA,MAED,cAAc,QAAQ,GAAG,QAAQ,CAAC,SAAiB;AAAA,QAClD,MAAM,OAAO,KAAK,SAAS;AAAA,QAE3B,MAAM,eAAe,KACnB,MAAM;AAAA,CAAI,EACV,OAAO,CAAC,SAAS,KAAK,KAAK,CAAC,EAC5B,KAAK;AAAA,CAAI;AAAA,QACX,IAAI,cAAc;AAAA,UACjB,MAAM,UAAU,kBAAkB,YAAY;AAAA,UAC9C,UAAU,IAAI,OAAO;AAAA,UACrB,OAAO,OAAO;AAAA,QACf;AAAA,OACA;AAAA,MAGD,WAAW,GAAG,QAAQ,CAAC,SAAS;AAAA,QAC/B,OAAO,IAAI;AAAA,4BAA+B,OAAO;AAAA,QACjD,OAAO,OAAO;AAAA,OACd;AAAA,MAED,cAAc,GAAG,QAAQ,CAAC,SAAS;AAAA,QAClC,UAAU,IAAI;AAAA,4BAA+B,OAAO;AAAA,QACpD,OAAO,OAAO;AAAA,OACd;AAAA,MAGD,OAAO,IAAI,CAAC,UAAU,KAAK,KAAK,GAAG,MAAM;AAAA,QACxC,WAAW,KAAK,QAAQ;AAAA,QACxB,cAAc,KAAK,QAAQ;AAAA,QAC3B,OAAO,QAAQ;AAAA,QACf,QAAQ,KAAK,CAAC;AAAA,OACd;AAAA,MAGD,OAAO,GAAG,UAAU,MAAM;AAAA,QACzB,OAAO,OAAO;AAAA,OACd;AAAA;AAAA,IAED,OAAO,OAAO;AAAA,IAEf,IAAK,MAA4B,SAAS,UAAU;AAAA,MACnD,QAAQ,IAAI;AAAA,+BAAkC;AAAA,MAC9C,QAAQ,KAAK,CAAC;AAAA,IACf;AAAA,IACA,QAAQ,MAAM,wBAAwB,KAAK;AAAA,IAC3C,MAAM;AAAA;AAAA;AAAA;AAAA,EAvcR;AAAA;;;;;;;ACFA,kBAAS;AACT,uBAAS;AACT,iBAAS;AAIT,SAAS,kBAAiB,GAAW;AAAA,EAGpC,MAAM,UAAU,MAAK,YAAY,KAAK,MAAM,MAAM,QAAQ;AAAA,EAC1D,MAAM,WAAW,YAAW,OAAO;AAAA,EAEnC,IAAI,UAAU;AAAA,IAEb,OAAO,OAAO;AAAA,EACf;AAAA,EAGA,MAAM,MAAM,QAAQ,IAAI;AAAA,EACxB,MAAM,mBAAmB;AAAA,IACxB,MAAK,KAAK,gBAAgB,QAAQ,SAAS;AAAA,IAC3C,MAAK,KAAK,MAAM,gBAAgB,QAAQ,SAAS;AAAA,IACjD,MAAK,KAAK,MAAM,MAAM,gBAAgB,QAAQ,SAAS;AAAA,IACvD,MAAK,KAAK,MAAM,MAAM,MAAM,gBAAgB,QAAQ,SAAS;AAAA,EAC9D;AAAA,EAEA,WAAW,YAAW,kBAAkB;AAAA,IACvC,IAAI,YAAW,QAAO,GAAG;AAAA,MACxB,OAAO;AAAA,IACR;AAAA,EACD;AAAA,EAGA,OAAO;AAAA;AAGR,eAA8B,KAAK,CAAC,OAAiB;AAAA,EACpD,IAAI;AAAA,IACH,MAAM,aAAa,mBAAkB;AAAA,IACrC,MAAM,WAAW,WAAW,SAAS,GAAG;AAAA,IAGxC,MAAM,YAAY,EAAE,SAAS,GAAG;AAAA,IAEhC,MAAM,kBAAkB,CAAC,SAAiB;AAAA,MACzC,MAAM,OAAO,UAAU,UAAU,KAAK,SAAS;AAAA,MAC/C,MAAM,QAAQ,KAAK,MAAM;AAAA,CAAI;AAAA,MAC7B,UAAU,UAAU,MAAM,IAAI,KAAK;AAAA,MAEnC,WAAW,QAAQ,OAAO;AAAA,QAEzB,IAAI,CAAC,KAAK,KAAK,GAAG;AAAA,UACjB;AAAA,QACD;AAAA,QACA,MAAM,cAAc,sBAAsB,IAAI;AAAA,QAC9C,QAAQ,IAAI,WAAW;AAAA,MACxB;AAAA;AAAA,IAID,QAAQ,OAAO,MACd,GAAG,sBAAsB,gCAAgC;AAAA,CAC1D;AAAA,IACA,MAAM,aAAa,WAAW,GAAG,0BAA0B;AAAA,IAC3D,MAAM,UAAU,WAAW,CAAC,IAAI,CAAC,OAAO,QAAQ;AAAA,IAEhD,MAAM,IAAI,QAAc,CAAC,SAAS,WAAW;AAAA,MAC5C,MAAM,aAAa,OAAM,YAAY,SAAS;AAAA,QAC7C,OAAO,CAAC,UAAU,QAAQ,MAAM;AAAA,QAChC,OAAO;AAAA,MACR,CAAC;AAAA,MAED,WAAW,QAAQ,GAAG,QAAQ,eAAe;AAAA,MAC7C,WAAW,QAAQ,GAAG,QAAQ,eAAe;AAAA,MAE7C,WAAW,GAAG,QAAQ,CAAC,SAAS;AAAA,QAC/B,IAAI,SAAS,QAAQ,SAAS,GAAG;AAAA,UAChC,OAAO,IAAI,MAAM,wBAAwB,MAAM,CAAC;AAAA,QACjD,EAAO;AAAA,UACN,QAAQ;AAAA;AAAA,OAET;AAAA,MAED,WAAW,GAAG,SAAS,CAAC,UAAU;AAAA,QACjC,OAAO,KAAK;AAAA,OACZ;AAAA,KACD;AAAA,IACD,QAAQ,OAAO,MACd,sBAAsB;AAAA,CAAuC,CAC9D;AAAA,IAGA,QAAQ,OAAO,MACd,GAAG,sBAAsB,oCAAoC;AAAA,CAC9D;AAAA,IAEA,MAAM,gBAAgB,OAAM,OAAO,CAAC,cAAc,GAAG;AAAA,MACpD,OAAO,CAAC,UAAU,QAAQ,MAAM;AAAA,IACjC,CAAC;AAAA,IAGD,MAAM,eAAe,EAAE,SAAS,GAAG;AAAA,IACnC,MAAM,qBAAqB,0BAA0B,YAAY;AAAA,IAEjE,cAAc,QAAQ,GAAG,QAAQ,kBAAkB;AAAA,IACnD,cAAc,QAAQ,GAAG,QAAQ,kBAAkB;AAAA,IAGnD,QAAQ,OAAO,MACd,sBACC;AAAA,CACD,CACD;AAAA,IAEA,MAAM,OAAO,OAAO,QAAQ,IAAI,QAAQ,MAAM;AAAA,IAC9C,IAAI;AAAA,MACH,MAAM,mBAAmB,MAAM,GAAK;AAAA,MACpC,QAAQ,OAAO,MACd,sBAAsB;AAAA,CAAoC,CAC3D;AAAA,MACC,MAAM;AAAA,MACP,QAAQ,OAAO,MACd,sBACC;AAAA,CACD,CACD;AAAA;AAAA,IAGD,QAAQ,OAAO,MACd,sBAAsB;AAAA,CAAwC,CAC/D;AAAA,IAGA,QAAQ,GAAG,UAAU,MAAM;AAAA,MAC1B,QAAQ,OAAO,MACd,GAAG,sBAAsB;AAAA,iCAAoC;AAAA,CAC9D;AAAA,MACA,cAAc,KAAK,QAAQ;AAAA,MAC3B,QAAQ,KAAK,CAAC;AAAA,KACd;AAAA,IAGD,MAAM,IAAI,QAAc,CAAC,SAAS,WAAW;AAAA,MAC5C,cAAc,GAAG,QAAQ,CAAC,SAAS;AAAA,QAClC,IAAI,SAAS,QAAQ,SAAS,GAAG;AAAA,UAChC,QAAQ,MACP,sBACC,2CAA2C,MAC5C,CACD;AAAA,UACA,OAAO,IAAI,MAAM,2BAA2B,MAAM,CAAC;AAAA,QACpD,EAAO;AAAA,UACN,QAAQ;AAAA;AAAA,OAET;AAAA,MAED,cAAc,GAAG,SAAS,CAAC,UAAU;AAAA,QACpC,OAAO,KAAK;AAAA,OACZ;AAAA,KACD;AAAA,IACA,OAAO,OAAO;AAAA,IAEf,IAAK,MAA4B,SAAS,UAAU;AAAA,MACnD,QAAQ,OAAO,MACd,GAAG,sBAAsB;AAAA,iCAAoC;AAAA,CAC9D;AAAA,MACA,QAAQ,KAAK,CAAC;AAAA,IACf;AAAA,IACA,QAAQ,OAAO,MACd,GAAG,sBAAsB,yBAAyB,IAAI,OAAO,KAAK;AAAA,CACnE;AAAA,IACA,MAAM;AAAA;AAAA;AAAA;AAAA,EAxKR;AAAA;;;;;;;ACHA,kBAAS;AACT,uBAAS,6BAAY;AACrB,iBAAS;AAIT,SAAS,kBAAiB,GAAW;AAAA,EAGpC,MAAM,UAAU,MAAK,YAAY,KAAK,MAAM,MAAM,QAAQ;AAAA,EAC1D,MAAM,WAAW,YAAW,OAAO;AAAA,EAEnC,IAAI,UAAU;AAAA,IAEb,OAAO,OAAO;AAAA,EACf;AAAA,EAGA,MAAM,MAAM,QAAQ,IAAI;AAAA,EACxB,MAAM,mBAAmB;AAAA,IACxB,MAAK,KAAK,gBAAgB,QAAQ,SAAS;AAAA,IAC3C,MAAK,KAAK,MAAM,gBAAgB,QAAQ,SAAS;AAAA,IACjD,MAAK,KAAK,MAAM,MAAM,gBAAgB,QAAQ,SAAS;AAAA,IACvD,MAAK,KAAK,MAAM,MAAM,MAAM,gBAAgB,QAAQ,SAAS;AAAA,EAC9D;AAAA,EAEA,WAAW,YAAW,kBAAkB;AAAA,IACvC,IAAI,YAAW,QAAO,GAAG;AAAA,MACxB,OAAO;AAAA,IACR;AAAA,EACD;AAAA,EAGA,OAAO;AAAA;AAGR,SAAS,aAAa,GAAW;AAAA,EAChC,MAAM,MAAM,QAAQ,IAAI;AAAA,EACxB,MAAM,kBAAkB,MAAK,KAAK,cAAc;AAAA,EAEhD,IAAI,YAAW,eAAe,GAAG;AAAA,IAChC,IAAI;AAAA,MACH,MAAM,cAAc,KAAK,MAAM,cAAa,iBAAiB,OAAO,CAAC;AAAA,MACrE,MAAM,OAAO,YAAY;AAAA,MACzB,IAAI,MAAM;AAAA,QAGT,MAAM,QAAQ,KAAK,MAAM,GAAG;AAAA,QAE5B,IAAI,MAAM,SAAS,KAAK,MAAM,MAAM,SAAS,OAAO,WAAW;AAAA,UAC9D,OAAO,MAAM,MAAM,SAAS,MAAM;AAAA,QACnC;AAAA,QAEA,OAAO,MAAM,MAAM,SAAS,MAAM;AAAA,MACnC;AAAA,MACC,MAAM;AAAA,EAGT;AAAA,EAEA,OAAO;AAAA;AAGR,eAA8B,KAAK,CAAC,MAAgB;AAAA,EACnD,IAAI;AAAA,IACH,MAAM,aAAa,mBAAkB;AAAA,IACrC,MAAM,WAAW,WAAW,SAAS,GAAG;AAAA,IAGxC,IAAI,aAAa,UAAU,cAAc;AAAA,IACzC,MAAM,eAAe,KAAK,QAAQ,WAAW;AAAA,IAC7C,MAAM,oBAAoB,KAAK,QAAQ,IAAI;AAAA,IAC3C,MAAM,kBACL,iBAAiB,KAAK,eAAe;AAAA,IAEtC,IAAI,oBAAoB,MAAM,KAAK,kBAAkB,IAAI;AAAA,MACxD,aAAa,KAAK,kBAAkB;AAAA,IACrC;AAAA,IAGA,MAAM,YAAY,EAAE,SAAS,GAAG;AAAA,IAEhC,MAAM,kBAAkB,CAAC,SAAiB;AAAA,MACzC,MAAM,OAAO,UAAU,UAAU,KAAK,SAAS;AAAA,MAC/C,MAAM,QAAQ,KAAK,MAAM;AAAA,CAAI;AAAA,MAC7B,UAAU,UAAU,MAAM,IAAI,KAAK;AAAA,MAEnC,WAAW,QAAQ,OAAO;AAAA,QAEzB,IAAI,CAAC,KAAK,KAAK,GAAG;AAAA,UACjB;AAAA,QACD;AAAA,QACA,MAAM,cAAc,sBAAsB,IAAI;AAAA,QAC9C,QAAQ,IAAI,WAAW;AAAA,MACxB;AAAA;AAAA,IAID,QAAQ,OAAO,MACd,GAAG,sBAAsB,uCAAuC;AAAA,CACjE;AAAA,IACA,MAAM,aAAa,WAAW,GAAG,0BAA0B;AAAA,IAC3D,MAAM,UAAU,WAAW,CAAC,IAAI,CAAC,OAAO,QAAQ;AAAA,IAEhD,MAAM,IAAI,QAAc,CAAC,SAAS,WAAW;AAAA,MAC5C,MAAM,aAAa,OAAM,YAAY,SAAS;AAAA,QAC7C,OAAO,CAAC,UAAU,QAAQ,MAAM;AAAA,QAChC,OAAO;AAAA,MACR,CAAC;AAAA,MAED,WAAW,QAAQ,GAAG,QAAQ,eAAe;AAAA,MAC7C,WAAW,QAAQ,GAAG,QAAQ,eAAe;AAAA,MAE7C,WAAW,GAAG,QAAQ,CAAC,SAAS;AAAA,QAC/B,IAAI,SAAS,QAAQ,SAAS,GAAG;AAAA,UAChC,OAAO,IAAI,MAAM,wBAAwB,MAAM,CAAC;AAAA,QACjD,EAAO;AAAA,UACN,QAAQ;AAAA;AAAA,OAET;AAAA,MAED,WAAW,GAAG,SAAS,CAAC,UAAU;AAAA,QACjC,OAAO,KAAK;AAAA,OACZ;AAAA,KACD;AAAA,IACD,QAAQ,OAAO,MACd,sBAAsB;AAAA,CAAuC,CAC9D;AAAA,IAGA,QAAQ,OAAO,MACd,GAAG,sBAAsB,sCAAsC,eAAe;AAAA,CAC/E;AAAA,IAGA,MAAM,eAAe,iBAAiB,IAAI,KAAK,KAAK,SAAS,UAAU;AAAA,IAGvE,MAAM,YAAY,CAAC,SAAS,gBAAgB,YAAY,OAAO,WAAW;AAAA,IAG1E,IAAI,cAAc;AAAA,MACjB,UAAU,KAAK,UAAU;AAAA,MACzB,UAAU,KAAK,cAAc,OAAO;AAAA,IACrC;AAAA,IAIA,MAAM,eAAe,KAAK,OAAO,CAAC,KAAK,QAAQ;AAAA,MAC9C,IAAI,oBAAoB,IAAI;AAAA,QAC3B,IAAI,QAAQ,mBAAmB,QAAQ,kBAAkB,GAAG;AAAA,UAC3D,OAAO;AAAA,QACR;AAAA,MACD;AAAA,MACA,OACC,QAAQ,eACR,QAAQ,QACR,QAAQ,cACR,QAAQ,iBACR,QAAQ;AAAA,KAET;AAAA,IAED,UAAU,KAAK,GAAG,cAAc,aAAa,UAAU;AAAA,IAEvD,MAAM,IAAI,QAAc,CAAC,SAAS,WAAW;AAAA,MAC5C,MAAM,eAAe,OAAM,OAAO,WAAW;AAAA,QAC5C,OAAO;AAAA,MACR,CAAC;AAAA,MAED,aAAa,GAAG,QAAQ,CAAC,SAAS;AAAA,QACjC,IAAI,SAAS,QAAQ,SAAS,GAAG;AAAA,UAChC,OAAO,IAAI,MAAM,0BAA0B,MAAM,CAAC;AAAA,QACnD,EAAO;AAAA,UACN,QAAQ,OAAO,MACd,sBACC,mCAAmC;AAAA,CACpC,CACD;AAAA,UACA,QAAQ;AAAA;AAAA,OAET;AAAA,MAED,aAAa,GAAG,SAAS,CAAC,UAAU;AAAA,QACnC,OAAO,KAAK;AAAA,OACZ;AAAA,KACD;AAAA,IACA,OAAO,OAAO;AAAA,IACf,QAAQ,OAAO,MACd,GAAG,sBAAsB,yBAAyB,IAAI,OAAO,KAAK;AAAA,CACnE;AAAA,IACA,MAAM;AAAA;AAAA;AAAA;AAAA,EA5LR;AAAA;;;ACXA,eAAsB,mBAAmB,CAAC,SAAkC;AAAA,EAC3E,MAAM,OAAO,IAAI,YAAY,EAAE,OAAO,OAAO;AAAA,EAC7C,MAAM,MAAM,MAAM,OAAO,OAAO,OAAO,WAAW,IAAI;AAAA,EACtD,IAAI,MAAM;AAAA,EACV,WAAW,KAAK,IAAI,WAAW,GAAG;AAAA,IAAG,OAAO,EAAE,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG;AAAA,EAC1E,OAAO,IAAI,MAAM,GAAG,CAAC;AAAA;;;;;;ACLf,SAAS,KAAI,IAAI,OAAyB;AAAA,EAChD,OAAO,MAAM,KAAK,GAAG,EAAE,QAAQ,QAAQ,GAAG;AAAA;AAGpC,SAAS,QAAO,CAAC,GAAmB;AAAA,EAC1C,MAAM,IAAI,EAAE,YAAY,GAAG;AAAA,EAC3B,OAAO,KAAK,IAAI,EAAE,MAAM,CAAC,IAAI;AAAA;AAGvB,SAAS,SAAQ,CAAC,GAAW,KAAsB;AAAA,EACzD,MAAM,OAAO,EAAE,QAAQ,OAAO,GAAG,EAAE,MAAM,GAAG,EAAE,IAAI,KAAK;AAAA,EACvD,OAAO,OAAO,KAAK,SAAS,GAAG,IAAI,KAAK,MAAM,GAAG,CAAC,IAAI,MAAM,IAAI;AAAA;AAG1D,SAAS,UAAU,CAAC,GAAW,IAAoB;AAAA,EACzD,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,IAAI;AAAA;AAGzC,SAAS,QAAQ,CAAC,GAAW,IAAoB;AAAA,EACvD,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,GAAG,CAAC,GAAG,MAAM,IAAI;AAAA;;;ACnBlD,oBAAS;AAGT,eAAsB,iBAAgB,CACrC,KACA,SACoB;AAAA,EACpB,MAAM,MAAgB,CAAC;AAAA,EACvB,IAAI;AAAA,IACH,MAAM,UAAU,MAAM,SAAQ,KAAK,EAAE,eAAe,KAAK,CAAC;AAAA,IAC1D,WAAW,SAAS,SAAS;AAAA,MAC5B,MAAM,OAAO,MAAK,KAAK,MAAM,IAAI;AAAA,MACjC,MAAM,MAAM,MAAK,SAAS,MAAM,IAAI;AAAA,MACpC,IAAI,MAAM,YAAY,GAAG;AAAA,QACxB,MAAM,SAAS,MAAM,kBAAiB,MAAM,GAAG;AAAA,QAC/C,IAAI,KAAK,GAAG,MAAM;AAAA,MACnB,EAAO,SAAI,MAAM,OAAO,GAAG;AAAA,QAC1B,IAAI,cAAc,KAAK,MAAM,IAAI,KAAK,CAAC,MAAM,KAAK,WAAW,GAAG,GAAG;AAAA,UAClE,IAAI,KAAK,GAAG;AAAA,QACb;AAAA,MACD;AAAA,IACD;AAAA,IACC,MAAM;AAAA,EAGR,OAAO;AAAA;AAKR,eAAsB,mBAAmB,CACxC,WACoB;AAAA,EACpB,MAAM,OAAO,MAAK,WAAW,QAAQ;AAAA,EACrC,MAAM,cAAc,IAAI;AAAA,EACxB,IAAI;AAAA,IACH,MAAM,UAAU,MAAM,SAAQ,MAAM,EAAE,eAAe,KAAK,CAAC;AAAA,IAC3D,WAAW,SAAS,SAAS;AAAA,MAC5B,IAAI,MAAM,YAAY,GAAG;AAAA,QACxB,MAAM,aAAa,MAAK,MAAM,MAAM,MAAM,SAAS;AAAA,QACnD,IAAI;AAAA,UACH,MAAM,KAAK,UAAU;AAAA,UACrB,YAAY,IAAI,MAAM,IAAI;AAAA,UACzB,MAAM;AAAA,MAGT;AAAA,IACD;AAAA,IACC,MAAM;AAAA,EAGR,OAAO,MAAM,KAAK,WAAW;AAAA;AAAA;;;ACnD9B,iBAAS;AACT,0BAAS;AAGT,eAAsB,cAAc,CACnC,SACA,aACuB;AAAA,EACvB,IAAI;AAAA,IACH,MAAM,MAAM,eAAc,OAAO,EAAE;AAAA,IACnC,MAAM,MAAM,MAAa,UAAG,MAAM,cAAc,MAAM,KAAK,IAAI,MAAM;AAAA,IACrE,MAAM,OAAiB,IAAY,QAAS,IAAY,eAAe,CAAC;AAAA,IACxE,IAAI,QAAQ,OAAO,SAAS;AAAA,MAAU,OAAO;AAAA,IAC7C,OAAO,CAAC;AAAA,IACP,MAAM;AAAA,IACP,IAAI;AAAA,MACH,MAAM,IAAI,MAAM,MAAK,OAAO;AAAA,MAC5B,OAAO,EAAE,MAAM,IAAI,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE;AAAA,MAChD,MAAM;AAAA,MACP,OAAO,CAAC;AAAA;AAAA;AAAA;AAUJ,SAAS,iBAAiB,CAChC,MACS;AAAA,EACT,IAAI,CAAC,QAAQ,OAAO,SAAS;AAAA,IAAU,OAAO;AAAA,EAC9C,MAAM,QAAkB,CAAC;AAAA,EACzB,MAAM,QAAQ,OAAO,KAAK,UAAU,WAAW,KAAK,QAAQ;AAAA,EAC5D,MAAM,cACL,OAAO,KAAK,gBAAgB,WACzB,KAAK,cACL,OAAO,KAAK,YAAY,WACvB,KAAK,UACL;AAAA,EACL,IAAI;AAAA,IAAO,MAAM,KAAK,UAAU,WAAW,KAAK,WAAW;AAAA,EAC3D,IAAI;AAAA,IACH,MAAM,KACL,qCAAqC,WAAW,WAAW,OAC5D;AAAA,EACD,OAAO,MAAM,SAAS;AAAA,EAAK,MAAM,KAAK;AAAA,CAAI,MAAM;AAAA;AAGjD,SAAS,UAAU,CAAC,OAAuB;AAAA,EAC1C,OAAO,MACL,QAAQ,MAAM,OAAO,EACrB,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,QAAQ,EACtB,QAAQ,MAAM,OAAO;AAAA;AAAA;;;;ECvDxB;AAAA,EACA;AAAA;;;ACDA,oBAAS,kBAAS;AAClB,0BAAS;AAST,eAAsB,0BAA0B,CAC/C,UACA,WACA,KACA,aACsB;AAAA,EACtB,IAAI;AAAA,IACH,MAAM,QAAQ,SAAS,MAAM,GAAG,EAAE,OAAO,OAAO;AAAA,IAChD,IAAI,MAAM,SAAS;AAAA,MAAG,OAAO;AAAA,IAC7B,MAAM,aAAa,MAAM;AAAA,IACzB,MAAM,OAAO,MAAM;AAAA,IAGnB,IAAI;AAAA,MACH,MAAM,eAAe,MAAK,KAAK,YAAY,YAAY;AAAA,MACvD,MAAM,MAAO,MACZ,sBAAc,YAAY,EAAE,QAC1B,cAAc,MAAM,KAAK,IAAI,MAAM;AAAA,MAEtC,MAAM,MAAO,KAAa;AAAA,MAG1B,MAAM,QACL,OAAO,QAAQ,aAAa,IAAI,YAAY,IAAI,IAAI;AAAA,MACrD,MAAM,YAAa,OAAe;AAAA,MAClC,IAAI,WAAW,SAAS,KAAK,GAAG;AAAA,QAC/B,MAAM,MAAM,MAAK,KAAK,UAAU,QAAQ,OAAO,EAAE,CAAC;AAAA,QAClD,MAAM,OACL,eAAc,GAAG,EAAE,QAAQ,cAAc,MAAM,KAAK,IAAI,MAAM;AAAA,QAC/D,MAAM,MAAM,MAAa;AAAA,QACzB,OAAO;AAAA,MACR;AAAA,MACC,MAAM;AAAA,IAGR,IAAI;AAAA,MACH,MAAM,WAAW,MAAK,KAAK,YAAY,UAAU,UAAU;AAAA,MAC3D,MAAM,QAAQ,MAAM,SAAQ,QAAQ;AAAA,MACpC,MAAM,UAAU,MAAM,OACrB,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,KAAK,EAAE,SAAS,KAAK,CACpD;AAAA,MACA,IAAI,QAAQ,QAAQ;AAAA,QACnB,IAAI,SAAS,QAAQ;AAAA,QACrB,IAAI,UAAU;AAAA,QACd,WAAW,KAAK,SAAS;AAAA,UACxB,IAAI;AAAA,YACH,MAAM,IAAI,MAAM,MAAK,MAAK,UAAU,CAAC,CAAC;AAAA,YACtC,IAAI,EAAE,WAAW,SAAS;AAAA,cACzB,UAAU,EAAE;AAAA,cACZ,SAAS;AAAA,YACV;AAAA,YACC,MAAM;AAAA,QACT;AAAA,QACA,MAAM,WAAW,MAAK,UAAU,MAAM;AAAA,QACtC,MAAM,OACL,eAAc,QAAQ,EAAE,QACvB,cAAc,MAAM,KAAK,IAAI,MAAM;AAAA,QACrC,MAAM,MAAM,MAAa;AAAA,QACzB,OAAO;AAAA,MACR;AAAA,MACC,MAAM;AAAA,IAGR,IAAI;AAAA,MACH,MAAM,SAAS,MACd,WACA,UACA,YACA,WACA,GAAG,UACJ;AAAA,MACA,MAAM,QAAQ,MACb,WACA,UACA,YACA,WACA,GAAG,SACJ;AAAA,MACA,IAAI,SAAwB;AAAA,MAC5B,IAAI,MAAM,IAAI,KAAK,MAAM,EAAE,OAAO;AAAA,QAAG,SAAS;AAAA,MACzC,SAAI,MAAM,IAAI,KAAK,KAAK,EAAE,OAAO;AAAA,QAAG,SAAS;AAAA,MAClD,IAAI,QAAQ;AAAA,QACX,MAAM,OAAO,eAAc,MAAM,EAAE;AAAA,QACnC,MAAM,MAAM,OACX,qBAAc,GAAG,UAAU,KAAK,IAAI,OAApC,OAA0C;AAAA,QAE3C,OAAO;AAAA,MACR;AAAA,MACC,MAAM;AAAA,IACP,MAAM;AAAA,EACR,OAAO;AAAA;AAAA;;;ACjGR,eAAsB,oBAAoB,CACzC,UACA,WACA,KACA,aACgB;AAAA,EAChB,IAAI;AAAA,IACH,MAAM,QAAQ,SAAS,MAAM,GAAG,EAAE,OAAO,OAAO;AAAA,IAChD,IAAI,MAAM,SAAS;AAAA,MAAG;AAAA,IACtB,MAAM,aAAa,MAAM;AAAA,IACzB,MAAM,OAAO,MAAM;AAAA,IACnB,MAAM,MAAM,GAAG,cAAc;AAAA,IAE7B,MAAM,MAAM,MAAM,2BACjB,UACA,WACA,KACA,WACD;AAAA,IAEA,IAAI,CAAC;AAAA,MAAK;AAAA,IAEV,MAAM,IAAK,IAAY,WAAY;AAAA,IAClC,WAAmB,0BAClB,WAAmB,2BAA2B,CAAC;AAAA,IAChD,WAAmB,wBAAwB,OAAO;AAAA,IAGnD,IAAI;AAAA,MACH,MAAM,WAAY,IAAY,QAAS,IAAY,eAAe,CAAC;AAAA,MACnE,MAAM,UAAW,IAAY,OAAO,CAAC;AAAA,MACpC,WAAmB,0BAClB,WAAmB,2BAA2B,CAAC;AAAA,MAChD,WAAmB,wBAAwB,OAAO;AAAA,QAClD,MAAM;AAAA,QACN,KAAK;AAAA,MACN;AAAA,MACC,MAAM;AAAA,IACP,MAAM;AAAA;AAAA;AAAA,EAxCT;AAAA;;;ACDA,0BAAS;AAYT,eAAsB,qBAAqB,CAC1C,QACmB;AAAA,EACnB,QAAQ,UAAU,WAAW,KAAK,gBAAgB;AAAA,EAGlD,IAAI;AAAA,IACH,MAAM,qBAAqB,UAAU,WAAW,KAAK,WAAW;AAAA,IAC/D,MAAM;AAAA,EAGR,IAAI;AAAA,IACH,MAAM,QAAQ,SAAS,MAAM,GAAG,EAAE,OAAO,OAAO;AAAA,IAChD,IAAI,MAAM,UAAU,GAAG;AAAA,MACtB,MAAM,MAAM,GAAG,MAAM,MAAM,MAAM;AAAA,MACjC,MAAM,IAAI;AAAA,MACV,MAAM,MAAM,EAAE,0BAA0B;AAAA,MAGxC,MAAM,SAAU,KAAa,KAAK;AAAA,MAGlC,IAAI,OAAO,WAAW,YAAY;AAAA,QACjC,OAAO,MAAM,OAAO,EAAE,UAAU,QAAQ,EAAE,MAAM,MAAM,GAAG,EAAE,CAAQ;AAAA,MACpE;AAAA,IACD;AAAA,IACC,MAAM;AAAA,EAGR,IAAI;AAAA,IACH,MAAM,aAAa,MAAK,KAAK,YAAY,WAAW;AAAA,IACpD,MAAM,IAAI,MACT,sBAAc,UAAU,EAAE,QAAQ,cAAc,MAAM,KAAK,IAAI,MAAM;AAAA,IAEtE,MAAM,QACL,OAAQ,EAAU,eAAe,aAC7B,EAAU,WAAW,QAAQ,IAC9B;AAAA,IACJ,MAAM,IAAK,OAAkC;AAAA,IAC7C,MAAM,cAAgB,OAAkC,UACvD,CAAC;AAAA,IACF,IAAI,KAAK,OAAQ,EAAU,SAAS,UAAU;AAAA,MAC7C,IAAI;AAAA,QACH,MAAM,MAAM,MAAK,WAAW,UAAU,OAAQ,EAAU,IAAI,CAAC;AAAA,QAC7D,MAAM,MAAO,MACZ,sBAAc,GAAG,EAAE,QAAQ,cAAc,MAAM,KAAK,IAAI,MAAM;AAAA,QAE/D,MAAM,MAAO,KAAa;AAAA,QAC1B,MAAM,SAAU,KAAa;AAAA,QAG7B,IAAI,OAAO,WAAW,YAAY;AAAA,UACjC,OAAO,MAAM,OAAO,EAAE,UAAU,QAAQ,YAAY,CAAQ;AAAA,QAC7D;AAAA,QACC,MAAM;AAAA,IACT;AAAA,IACC,MAAM;AAAA,EAER,OAAO;AAAA;AAAA;AAAA,EAnER;AAAA;;;ACHA,SAAS,OAAO,CAAC,QAAQ,gBAAgB;AAAA,EAAE,IAAI,OAAO,OAAO,KAAK,MAAM;AAAA,EAAG,IAAI,OAAO,uBAAuB;AAAA,IAAE,IAAI,UAAU,OAAO,sBAAsB,MAAM;AAAA,IAAG,mBAAmB,UAAU,QAAQ,OAAO,QAAS,CAAC,KAAK;AAAA,MAAE,OAAO,OAAO,yBAAyB,QAAQ,GAAG,EAAE;AAAA,KAAa,IAAI,KAAK,KAAK,MAAM,MAAM,OAAO;AAAA,EAAG;AAAA,EAAE,OAAO;AAAA;AAC9U,SAAS,aAAa,CAAC,QAAQ;AAAA,EAAE,SAAS,IAAI,EAAG,IAAI,UAAU,QAAQ,KAAK;AAAA,IAAE,IAAI,SAAiB,UAAU,MAAlB,OAAuB,UAAU,KAAK,CAAC;AAAA,IAAG,IAAI,IAAI,QAAQ,OAAO,MAAM,GAAG,IAAE,EAAE,QAAQ,QAAS,CAAC,KAAK;AAAA,MAAE,gBAAgB,QAAQ,KAAK,OAAO,IAAI;AAAA,KAAI,IAAI,OAAO,4BAA4B,OAAO,iBAAiB,QAAQ,OAAO,0BAA0B,MAAM,CAAC,IAAI,QAAQ,OAAO,MAAM,CAAC,EAAE,QAAQ,QAAS,CAAC,KAAK;AAAA,MAAE,OAAO,eAAe,QAAQ,KAAK,OAAO,yBAAyB,QAAQ,GAAG,CAAC;AAAA,KAAI;AAAA,EAAG;AAAA,EAAE,OAAO;AAAA;AACjf,SAAS,eAAe,CAAC,KAAK,KAAK,OAAO;AAAA,EAAE,MAAM,eAAe,GAAG;AAAA,EAAG,IAAI,OAAO,KAAK;AAAA,IAAE,OAAO,eAAe,KAAK,KAAK,EAAE,OAAc,YAAY,MAAM,cAAc,MAAM,UAAU,KAAK,CAAC;AAAA,EAAG,EAAO;AAAA,IAAE,IAAI,OAAO;AAAA;AAAA,EAAS,OAAO;AAAA;AACtO,SAAS,cAAc,CAAC,KAAK;AAAA,EAAE,IAAI,MAAM,aAAa,KAAK,QAAQ;AAAA,EAAG,OAAO,OAAO,QAAQ,WAAW,MAAM,OAAO,GAAG;AAAA;AACvH,SAAS,YAAY,CAAC,OAAO,MAAM;AAAA,EAAE,IAAI,OAAO,UAAU,YAAY,UAAU;AAAA,IAAM,OAAO;AAAA,EAAO,IAAI,OAAO,MAAM,OAAO;AAAA,EAAc,IAAI,SAAS,WAAW;AAAA,IAAE,IAAI,MAAM,KAAK,KAAK,OAAO,QAAQ,SAAS;AAAA,IAAG,IAAI,OAAO,QAAQ;AAAA,MAAU,OAAO;AAAA,IAAK,MAAM,IAAI,UAAU,8CAA8C;AAAA,EAAG;AAAA,EAAE,QAAQ,SAAS,WAAW,SAAS,QAAQ,KAAK;AAAA;AAGrX,SAAS,YAAY,CAAC,SAAS;AAAA,EAC7B,QAAO,cAAc,gBAAc,aAAa,cAAc,cAAc,CAAC,GAAG,OAAO,GAAG,UAAU,CAAC;AAAA,EACrG,OAAO;AAAA,EACP,SAAS,OAAM,CAAC,YAAY,QAAQ;AAAA,IAClC,MAAM,MAAM,OAAO,YAAY,WAAW,CAAC,OAAO,IAAI,QAAQ;AAAA,IAC9D;AAAA,MACE,cAAc;AAAA,MACd,0BAA0B,MAAM,QAAQ,OAAO;AAAA,MAC/C,iBAAiB;AAAA,QACf;AAAA,IAGJ,IAAI,SAAS;AAAA,IACb,SAAS,IAAI,EAAG,IAAI,IAAI,QAAQ,KAAK;AAAA,MACnC,IAAI,OAAO,IAAI;AAAA,MACf,IAAI,yBAAyB;AAAA,QAE3B,OAAO,KAAK,QAAQ,eAAe,EAAE,EAAE,QAAQ,QAAQ,GAAG,EAAE,QAAQ,SAAS,GAAG,EAAE,QAAQ,SAAS,GAAG;AAAA,MACxG;AAAA,MACA,UAAU;AAAA,MACV,IAAI,IAAI,OAAO,QAAQ;AAAA,QACrB,MAAM,QAAQ,cAAc,WAAW,OAAO,IAAI,MAAM,IAAI,OAAO;AAAA,QAGnE,UAAU;AAAA,MACZ;AAAA,IACF;AAAA,IAGA,MAAM,QAAQ,OAAO,MAAM;AAAA,CAAI;AAAA,IAC/B,IAAI,UAAU;AAAA,IACd,WAAW,KAAK,OAAO;AAAA,MACrB,MAAM,IAAI,EAAE,MAAM,WAAW;AAAA,MAC7B,IAAI,GAAG;AAAA,QACL,MAAM,SAAS,EAAE,GAAG;AAAA,QACpB,IAAI,CAAC,SAAS;AAAA,UAEZ,UAAU;AAAA,QACZ,EAAO;AAAA,UACL,UAAU,KAAK,IAAI,SAAS,MAAM;AAAA;AAAA,MAEtC;AAAA,IACF;AAAA,IACA,IAAI,YAAY,MAAM;AAAA,MACpB,MAAM,IAAI;AAAA,MACV,SAAS,MAGR,IAAI,OAAK,EAAE,OAAO,OAAO,EAAE,OAAO,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK;AAAA,CAAI;AAAA,IACrE;AAAA,IAGA,IAAI,gBAAgB;AAAA,MAClB,SAAS,OAAO,KAAK;AAAA,IACvB;AAAA,IAGA,IAAI,yBAAyB;AAAA,MAC3B,SAAS,OAAO,QAAQ,QAAQ;AAAA,CAAI;AAAA,IACtC;AAAA,IACA,OAAO;AAAA;AAAA;AAOX,SAAS,UAAU,CAAC,OAAO,eAAe;AAAA,EACxC,IAAI,OAAO,UAAU,YAAY,CAAC,MAAM,SAAS;AAAA,CAAI,GAAG;AAAA,IACtD,OAAO;AAAA,EACT;AAAA,EACA,MAAM,cAAc,cAAc,MAAM,cAAc,YAAY;AAAA,CAAI,IAAI,CAAC;AAAA,EAC3E,MAAM,cAAc,YAAY,MAAM,QAAQ;AAAA,EAC9C,IAAI,aAAa;AAAA,IACf,MAAM,SAAS,YAAY;AAAA,IAC3B,OAAO,MAAM,QAAQ,OAAO;AAAA,EAAK,QAAQ;AAAA,EAC3C;AAAA,EACA,OAAO;AAAA;AAAA,IA/EH,QACS;AAAA;AAAA,EADT,SAAS,aAAa,CAAC,CAAC;AAAA,EACf;AAAA;;;ACHf,eAAsB,aAAa,CAAC,WAAoC;AAAA,EACvE,MAAM,eAAe,MAAK,WAAW,YAAY;AAAA,EACjD,IAAI;AAAA,IACH,MAAM,UAAU,MAAM,IAAI,KAAK,YAAY,EAAE,KAAK;AAAA,IAClD,OAAO;AAAA,IACN,OAAO,OAAO;AAAA,IACf,QAAQ,MACP,0CAA0C,iBAC1C,KACD;AAAA,IAEA,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAIF,SAAS,kBAAkB,CACjC,cACA;AAAA,EAEC,OAAO;AAAA,EACP,kBAAkB;AAAA,EAClB,OAAO;AAAA,EACP,QAAQ;AAAA,GAEA;AAAA,EACT,IAAI,OAAO;AAAA,EAGX,OAAO,KAAK,QAAQ,kBAAkB,CAAC,IAAI,UAAkB;AAAA,IAC5D,MAAM,UAAU,iBAAiB,KAAK,KAAK;AAAA,IAC3C,MAAM,WAAW,UACd,MAAM,QAAQ,yCAAyC,SAAS,OAAO,IACvE,GAAG,eAAe;AAAA,IACrB,OAAO,QAAQ;AAAA,GACf;AAAA,EAID,IAAI,eAAe,QAAQ;AAAA,EAC3B,IAAI;AAAA,IACH,MAAM,aAAa,aAAa,MAAM,0BAA0B;AAAA,IAChE,IAAI,YAAY;AAAA,MACf,MAAM,WAAW,WAAW;AAAA,MAC5B,IAAI,2BAA2B,KAAK,IAAI,GAAG;AAAA,QAC1C,OAAO,KAAK,QAAQ,4BAA4B,QAAQ;AAAA,MACzD,EAAO;AAAA,MAKP,eAAe,aAAa,QAAQ,UAAU,EAAE;AAAA,IACjD;AAAA,IAEA,MAAM,SAAS;AAAA,IACf,MAAM,YAAY,aAAa,MAAM,MAAM;AAAA,IAC3C,IAAI,WAAW;AAAA,MACd,MAAM,UAAU,UAAU;AAAA,MAC1B,IAAI,OAAO,KAAK,IAAI,GAAG;AAAA,QACtB,OAAO,KAAK,QAAQ,QAAQ,OAAO;AAAA,MACpC;AAAA,MACA,eAAe,aAAa,QAAQ,SAAS,EAAE;AAAA,IAChD;AAAA,IACC,MAAM;AAAA,EAGR,IAAI,cAAc;AAAA,IACjB,OAAO,KAAK,QAAQ,aAAa,GAAG;AAAA,SAAyB;AAAA,EAC9D;AAAA,EAGA,OAAO,KAAK,QACX,wFACA,EACD;AAAA,EAGA,MAAM,eAAe,MAAM,QAAQ,uBAAuB,MAAM;AAAA,EAChE,MAAM,eAAe,IAAI,OACxB,0BAA0B,gDAC1B,GACD;AAAA,EACA,IAAI,aAAa,KAAK,IAAI,GAAG;AAAA,IAC5B,OAAO,KAAK,QAAQ,cAAc,KAAK,WAAW;AAAA,EACnD,EAAO;AAAA,IAEN,OAAO,KAAK,QACX,aACA,cAAgB,UAAU;AAAA,SAC3B;AAAA;AAAA,EAID,IAAI,iBAAiB;AAAA,IACpB,OAAO,KAAK,QAAQ,aAAa,KAAO;AAAA,SAA4B;AAAA,EACrE;AAAA,EAEA,OAAO;AAAA;AAAA;;;;ECnGR;AAAA;;;ACAA,oBAAS,kBAAS;AAClB,0BAAS;AAET;AACA;AA0BA,eAAe,iBAAiB,CAC/B,SAC2B;AAAA,EAC3B;AAAA,IACC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO;AAAA,IACP,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,SAAS;AAAA,MACN;AAAA,EAEJ,MAAM,UAAU,CAAC,SAAS;AAAA,EAC1B,IAAI,kBAAkB;AAAA,EACtB,IAAI,YAAY;AAAA,EAGhB,IAAI;AAAA,IACH,IAAI,OAAO,cAAc,YAAY,UAAU,SAAS,KAAK,GAAG;AAAA,MAC/D,aAAa;AAAA,kCAAqC;AAAA,IACnD;AAAA,IACC,MAAM;AAAA,EAGR,IAAI;AAAA,EAIJ,IAAI;AAAA,IACF,WAAmB,2BAA2B,CAAC;AAAA,IAC/C,MAAM;AAAA,EAKR,IAAI;AAAA,IACH,MAAM,QAAQ,SAAS,MAAM,GAAG,EAAE,OAAO,OAAO;AAAA,IAChD,IAAI,MAAM,UAAU,GAAG;AAAA,MACtB,MAAM,aAAa,MAAM;AAAA,MACzB,MAAM,OAAO,MAAM;AAAA,MACnB,IAAI,aAAa;AAAA,MAGjB,IAAI,sBAAsB;AAAA,MAC1B,IAAI;AAAA,QACH,MAAM,WAAW,MAAK,WAAW,UAAU,YAAY,SAAS;AAAA,QAChE,MAAM,IAAI,MAAM,MAAK,QAAQ;AAAA,QAC7B,sBACC,OAAO,GAAG,gBAAgB,aAAa,EAAE,YAAY,IAAI;AAAA,QACzD,MAAM;AAAA,QACP,sBAAsB;AAAA;AAAA,MAGvB,IAAI,CAAC,qBAAqB;AAAA,QAGzB,MAAM,IAAI,MAAM,sBAAsB;AAAA,MACvC;AAAA,MAGA,IAAI;AAAA,QACH,MAAM,eAAe,MAAK,KAAK,YAAY,YAAY;AAAA,QACvD,MAAM,MAAO,MACZ,sBAAc,YAAY,EAAE,QAC1B,cAAc,MAAM,KAAK,IAAI,MAAM;AAAA,QAEtC,MAAM,MAAO,KAAa;AAAA,QAG1B,MAAM,QACL,OAAO,QAAQ,aAAa,IAAI,YAAY,IAAI,IAAI;AAAA,QACrD,MAAM,YAAa,OAAe;AAAA,QAClC,IAAI,WAAW,SAAS,KAAK,GAAG;AAAA,UAC/B,aAAa;AAAA,QACd;AAAA,QACC,MAAM;AAAA,MAGR,IAAI,CAAC,YAAY;AAAA,QAChB,IAAI;AAAA,UACH,MAAM,WAAW,MAAK,KAAK,YAAY,UAAU,UAAU;AAAA,UAC3D,MAAM,QAAQ,MAAM,SAAQ,QAAQ;AAAA,UACpC,MAAM,aAAa,MAAM,OACxB,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,KAAK,EAAE,SAAS,KAAK,CACpD;AAAA,UACA,IAAI,WAAW,QAAQ;AAAA,YACtB,IAAI,SAAS,WAAW;AAAA,YACxB,IAAI,UAAU;AAAA,YACd,WAAW,iBAAiB,YAAY;AAAA,cACvC,IAAI;AAAA,gBACH,MAAM,IAAI,MAAM,MAAK,MAAK,UAAU,aAAa,CAAC;AAAA,gBAClD,IAAI,EAAE,WAAW,SAAS;AAAA,kBACzB,UAAU,EAAE;AAAA,kBACZ,SAAS;AAAA,gBACV;AAAA,gBACC,MAAM;AAAA,YACT;AAAA,YACA,aAAa,IAAI,MAAK,YAAY,UAAU,YAAY,MAAM,EAAE,QAAQ,QAAQ,GAAG;AAAA,UACpF;AAAA,UACC,MAAM;AAAA,MACT;AAAA,MAGA,IAAI,CAAC,YAAY;AAAA,QAChB,MAAM,MAAM,MACX,WACA,UACA,YACA,WACA,GAAG,UACJ;AAAA,QACA,MAAM,KAAK,MACV,WACA,UACA,YACA,WACA,GAAG,SACJ;AAAA,QACA,IAAI,SAAS;AAAA,QACb,IAAI,MAAM,IAAI,KAAK,GAAG,EAAE,OAAO,GAAG;AAAA,UACjC,SAAS,IAAI,MAAK,UAAU,YAAY,WAAW,GAAG,UAAU,EAAE,QAAQ,QAAQ,GAAG;AAAA,QACtF,EAAO,SAAI,MAAM,IAAI,KAAK,EAAE,EAAE,OAAO,GAAG;AAAA,UACvC,SAAS,IAAI,MAAK,UAAU,YAAY,WAAW,GAAG,SAAS,EAAE,QAAQ,QAAQ,GAAG;AAAA,QACrF;AAAA,QACA,IAAI,QAAQ;AAAA,UACX,aAAa;AAAA,QACd;AAAA,MACD;AAAA,MAEA,IAAI,CAAC,YAAY;AAAA,QAChB,iBAAiB;AAAA,MAClB;AAAA,MAEA,IAAI,YAAY;AAAA,QACf,MAAM,MAAM,GAAG,cAAc;AAAA,QAE7B,aAAa;AAAA,kCAAqC;AAAA,QAElD,MAAM,KAAK,OAAO,mBAAmB,UAAU,SAAS,mBAAmB,GAAG;AAAA,QAC9E,mBAAmB,iDAAiD;AAAA,MACrE;AAAA,IACD;AAAA,IACC,MAAM;AAAA,EAGR,MAAM,qBAAqB,UAAU,WAAW,KAAK,WAAW;AAAA,EAKhE,MAAM,eAAwC,CAAC;AAAA,EAC/C,IAAI;AAAA,IAEH,IAAI;AAAA,MACH,MAAM,QAAQ,SAAS,MAAM,GAAG,EAAE,OAAO,OAAO;AAAA,MAChD,IAAI,MAAM,UAAU,GAAG;AAAA,QACtB,MAAM,IAAI;AAAA,QACV,MAAM,MAAM,GAAG,MAAM,MAAM,MAAM;AAAA,QACjC,MAAM,MAAM,EAAE,0BAA0B;AAAA,QAGxC,MAAM,SAAU,KAAa,KAAK;AAAA,QAGlC,IAAI,OAAO,WAAW,YAAY;AAAA,UACjC,MAAM,MAAM,MAAM,OAAO;AAAA,YACxB;AAAA,YACA,QAAQ,EAAE,MAAM,MAAM,GAAG;AAAA,UAC1B,CAAQ;AAAA,UACR,aAAa,YAAY;AAAA,QAC1B;AAAA,MACD;AAAA,MACC,MAAM;AAAA,IAGR,IAAI;AAAA,MACH,MAAM,aAAa,MAAK,KAAK,YAAY,WAAW;AAAA,MACpD,MAAM,IAAI,MACT,sBAAc,UAAU,EAAE,QAAQ,cAAc,MAAM,KAAK,IAAI,MAAM;AAAA,MAEtE,MAAM,QACL,OAAO,EAAE,eAAe,aAAa,EAAE,WAAW,QAAQ,IAAI;AAAA,MAC/D,MAAM,IAAI,OAAO;AAAA,MACjB,MAAM,SAAU,OAAO,UAAU,CAAC;AAAA,MAElC,IAAI,KAAK,OAAO,EAAE,SAAS,UAAU;AAAA,QACpC,IAAI;AAAA,UACH,MAAM,MAAM,MAAK,WAAW,UAAU,OAAO,EAAE,IAAI,CAAC;AAAA,UACpD,MAAM,MAAO,MACZ,sBAAc,GAAG,EAAE,QAAQ,cAAc,MAAM,KAAK,IAAI,MAAM;AAAA,UAE/D,MAAM,MAAO,KAAa;AAAA,UAC1B,MAAM,SAAU,KAAa;AAAA,UAG7B,IAAI,OAAO,WAAW,YAAY;AAAA,YACjC,MAAM,MAAM,MAAM,OAAO,EAAE,UAAU,OAAO,CAAQ;AAAA,YACpD,aAAa,YAAY;AAAA,UAC1B;AAAA,UACC,MAAM;AAAA,MACT;AAAA,MACC,MAAM;AAAA,IACP,MAAM;AAAA,EAER,IAAI;AAAA,IACF,WAAmB,mBAAmB;AAAA,IACtC,MAAM;AAAA,EAKR,IAAI,uBAAkD,CAAC;AAAA,EACvD,IAAI;AAAA,IACH,MAAM,IAAI,MAAK,KAAK,YAAY,YAAY;AAAA,IAC5C,MAAM,MAAM,MACX,sBAAc,CAAC,EAAE,QAAQ,cAAc,MAAM,KAAK,IAAI,MAAM;AAAA,IAE7D,uBAAyB,KAAa,gBAAgB,CAAC;AAAA,IAIvD,IAAI;AAAA,MACF,WAAmB,0BAA0B;AAAA,MAC7C,MAAM;AAAA,IACP,MAAM;AAAA,EAKR,MAAM,wBAAwB,aAAkB,eAAe;AAAA,IAC9D;AAAA,EACD,CAAC;AAAA,EACD,MAAM,UAAU,eAAe,qBAAqB;AAAA,EACpD,MAAM,eAAe,MAAM,cAAc,SAAS;AAAA,EAIlD,IAAI,iBAAiB;AAAA,EACrB,IAAI;AAAA,IACH,MAAM,aAAa;AAAA,MAClB,MAAK,WAAW,MAAM,YAAY,WAAW;AAAA,MAC7C,MAAK,WAAW,MAAM,MAAM,YAAY,WAAW;AAAA,MACnD,MAAK,WAAW,MAAM,MAAM,MAAM,YAAY,WAAW;AAAA,MACzD,MAAK,WAAW,MAAM,MAAM,MAAM,MAAM,YAAY,WAAW;AAAA,IAChE;AAAA,IACA,IAAI,UAAU;AAAA,IACd,WAAW,KAAK,YAAY;AAAA,MAC3B,IAAI,MAAM,IAAI,KAAK,CAAC,EAAE,OAAO,GAAG;AAAA,QAC/B,UAAU;AAAA,QACV;AAAA,MACD;AAAA,IACD;AAAA,IACA,IAAI,SAAS;AAAA,MACZ,IAAI,MAAM,MAAM,IAAI,KAAK,OAAO,EAAE,KAAK;AAAA,MACvC,IAAI,QAAQ;AAAA,QAEX,MAAM,IAEJ,QAAQ,qBAAqB,EAAE,EAE/B,QAAQ,QAAQ,GAAG,EAEnB,QAAQ,uBAAuB,IAAI,EAEnC,QAAQ,OAAO,GAAG,EAElB,KAAK;AAAA,MACR;AAAA,MACA,iBAAiB,kCAAkC;AAAA,IACpD;AAAA,IACC,MAAM;AAAA,EAMR,IAAI;AAAA,IACH,MAAM,IAAI;AAAA,IACV,MAAM,MAAM,EAAE;AAAA,IAGd,MAAM,aAAa,CAAC,UAA0B,CAAC,GAAQ,MAAW;AAAA,MACjE,MAAM,KAAK,GAAG,MAAM,OAAO,KAAK,MAAM,OAAO,EAAE,KAAK,IAAI,CAAC,IAAI;AAAA,MAC7D,MAAM,KAAK,GAAG,MAAM,OAAO,KAAK,MAAM,OAAO,EAAE,KAAK,IAAI,CAAC,IAAI;AAAA,MAC7D,OAAO,UAAU,QAAQ,KAAK,KAAK,KAAK;AAAA;AAAA,IAIzC,MAAM,QAAyD,CAAC;AAAA,IAChE,IAAI,OAAO,OAAO,IAAI,YAAY,YAAY;AAAA,MAE5C,IAAoB,QAAQ,CAAC,MAAM;AAAA,QACnC,IAAI,OAAO,MAAM;AAAA,UAChB,MAAM,KAAK,EAAE,OAAO,OAAO,mBAAmB,MAAM,SAAS;AAAA,OAC9D;AAAA,IACF,EAAO,SAAI,OAAO,OAAO,QAAQ,UAAU;AAAA,MAC1C,YAAY,GAAG,MAAM,OAAO,QAAQ,GAA0B,GAAG;AAAA,QAChE,MAAM,MACL,OAAO,GAAG,UAAU,WAAW,EAAE,QAAQ,OAAO;AAAA,QACjD,MAAM,IAAI,OAAO,GAAG,SAAS,WAAW,EAAE,OAAO;AAAA,QACjD,MAAM,KAAK,EAAE,OAAO,KAAK,MAAM,EAAE;AAAA,MAClC;AAAA,IACD;AAAA,IAEA,MAAM,cAAc,OAAO,KAAK,KAAK;AAAA,IACrC,IAAI,YAAY,QAAQ;AAAA,MACvB,MAAM,SAAoC,CAAC;AAAA,MAC3C,MAAM,UAAmC,CAAC;AAAA,MAC1C,WAAW,KAAK,aAAa;AAAA,QAC5B,MAAM,OAAO,MAAM;AAAA,QACnB,MAAM,OAAO,uBAAuB,MAAM,CAAC;AAAA,QAC3C,IAAI,MAAiB;AAAA,QACrB,IACC,OAAO,SAAS,KAAK,KAAK,KAC1B,KAAK,QAAQ,KACb,KAAK,SAAS,UACb;AAAA,UACD,IAAI,KAAK,SAAS,aAAa;AAAA,YAC9B,MAAM,CAAC,GAAG,IAAI,EAAE,KAAK,WAAW,MAAM,CAAC,EAAE,MAAM,GAAG,KAAK,KAAK;AAAA,UAC7D,EAAO,SAAI,KAAK,SAAS,YAAY;AAAA,YACpC,MAAM,CAAC,GAAG,IAAI,EAAE,KAAK,WAAW,KAAK,CAAC,EAAE,MAAM,GAAG,KAAK,KAAK;AAAA,UAC5D,EAAO,SAAI,KAAK,SAAS,QAAQ;AAAA,YAChC,MAAM,KAAK,MAAM,GAAG,KAAK,KAAK;AAAA,UAC/B;AAAA,QACD;AAAA,QACA,OAAO,KAAK;AAAA,QACZ,QAAQ,KACP,MAAM,QAAQ,GAAG,KAAK,MAAM,QAAQ,IAAI,IACrC,IAAI,SAAS,KAAK,SAClB;AAAA,MACL;AAAA,MACA,MAAM,aAAa,KAAK,UAAU,MAAM;AAAA,MACxC,MAAM,cAAc,KAAK,UAAU,OAAO;AAAA,MAC1C,mBAAmB;AAAA;AAAA;AAAA;AAAA;AAAA,+CAAsN;AAAA;AAAA,uDAAwJ;AAAA;AAAA;AAAA,IAClY;AAAA,IACC,MAAM;AAAA,EAGR,IAAI;AAAA,IACH,MAAM,aAAa,KAAK,UAAU,YAAY;AAAA,IAC9C,mBAAmB;AAAA;AAAA;AAAA;AAAA,uEAA4K;AAAA;AAAA;AAAA,IAC9L,MAAM;AAAA,EAGR,mBAAmB,QACjB,IAAI,CAAC,QAAQ,8BAA8B,gBAAgB,EAC3D,KAAK,EAAE;AAAA,EAGT,IAAI,aAAa;AAAA,IAChB,mBAAmB;AAAA,EACpB;AAAA,EAGA,IAAI,cAAc;AAAA,EAClB,IAAI;AAAA,EACJ,IAAI;AAAA,IACH,MAAM,QAAQ,SAAS,MAAM,GAAG,EAAE,OAAO,OAAO;AAAA,IAChD,IAAI,MAAM,UAAU,GAAG;AAAA,MACtB,MAAM,MAAM,GAAG,MAAM,MAAM,MAAM;AAAA,MACjC,MAAM,IAAI;AAAA,MACV,MAAM,MAAM,EAAE,0BAA0B;AAAA,MAGxC,MAAM,OAAQ,KAAa;AAAA,MAC3B,MAAM,MAAO,KAAa;AAAA,MAC1B,eAAe,kBAAkB,IAAI;AAAA,MACrC,MAAM,UACL,OAAO,KAAK,SAAS,WAClB,IAAI,OACJ,MAAM,QAAQ,KAAK,IAAI,IACtB,OAAO,IAAI,KAAK,KAAK;AAAA,CAAI,CAAC,IAC1B;AAAA,MACL,IAAI;AAAA,QAAS,eAAe;AAAA,EAAK;AAAA,MACjC,IAAI,OAAO,KAAK,SAAS,YAAY,IAAI,KAAK,KAAK,GAAG;AAAA,QACrD,WAAW,IAAI,KAAK,KAAK;AAAA,MAC1B;AAAA,IACD;AAAA,IACC,MAAM;AAAA,EAGR,IAAI;AAAA,IACH,MAAM,aAAa,MAAK,KAAK,YAAY,WAAW;AAAA,IACpD,MAAM,IAAI,MACT,sBAAc,UAAU,EAAE,QAAQ,cAAc,MAAM,KAAK,IAAI,MAAM;AAAA,IAEtE,MAAM,QACL,OAAO,EAAE,eAAe,aAAa,EAAE,WAAW,QAAQ,IAAI;AAAA,IAC/D,MAAM,IAAI,OAAO;AAAA,IACjB,IAAI,CAAC,GAAG;AAAA,MAEP,iBAAiB,kBAAkB;AAAA,IACpC;AAAA,IACA,IAAI,KAAK,OAAO,EAAE,SAAS,UAAU;AAAA,MACpC,IAAI;AAAA,QACH,MAAM,MAAM,MAAK,WAAW,UAAU,OAAO,EAAE,IAAI,CAAC;AAAA,QACpD,MAAM,MAAO,MACZ,sBAAc,GAAG,EAAE,QAAQ,cAAc,MAAM,KAAK,IAAI,MAAM;AAAA,QAE/D,MAAM,OAAQ,KAAa;AAAA,QAC3B,MAAM,MAAO,KAAa;AAAA,QAC1B,IAAI;AAAA,UAAM,eAAe,kBAAkB,IAAI;AAAA,QAC/C,IAAI,KAAK;AAAA,UACR,MAAM,UACL,OAAO,IAAI,SAAS,WACjB,IAAI,OACJ,MAAM,QAAQ,IAAI,IAAI,IACrB,OAAQ,IAAI,KAAmB,KAAK;AAAA,CAAI,CAAC,IACzC;AAAA,UACL,IAAI;AAAA,YAAS,eAAe;AAAA,EAAK;AAAA,UACjC,IAAI,OAAO,IAAI,SAAS,YAAY,IAAI,KAAK,KAAK,GAAG;AAAA,YACpD,WAAW,IAAI,KAAK,KAAK;AAAA,UAC1B;AAAA,QACD;AAAA,QACC,MAAM;AAAA,IAGT,EAAO;AAAA,MACN,IAAI;AAAA,QACH,MAAM,OAAQ,GAAW;AAAA,QACzB,IAAI,MAAM,QAAQ,IAAI,GAAG;AAAA,UAExB,IAAI;AAAA,UACJ,IAAI,UAAU;AAAA,UACd,WAAW,MAAM,MAAM;AAAA,YACtB,MAAM,MAAM,OAAQ,IAAY,WAAW,GAAG;AAAA,YAC9C,IAAI,CAAC,SAAS,WAAW,GAAG;AAAA,cAAG;AAAA,YAC/B,MAAM,MAAM,IAAI,MAAM,GAAG,EAAE,OAAO,OAAO,EAAE;AAAA,YAC3C,IAAI,OAAO,SAAS;AAAA,cACnB,UAAU;AAAA,cACV,SAAS;AAAA,YACV;AAAA,UACD;AAAA,UACA,IAAI,UAAU,OAAQ,OAAe,SAAS,UAAU;AAAA,YACvD,IAAI;AAAA,cACH,MAAM,MAAM,MACX,WACA,UACA,OAAQ,OAAe,IAAI,CAC5B;AAAA,cACA,MAAM,MAAO,MACZ,sBAAc,GAAG,EAAE,QACjB,cAAc,MAAM,KAAK,IAAI,MAAM;AAAA,cAEtC,MAAM,OAAQ,KAAa;AAAA,cAC3B,MAAM,MAAO,KAAa;AAAA,cAC1B,IAAI;AAAA,gBAAM,eAAe,kBAAkB,IAAI;AAAA,cAC/C,MAAM,UACL,OAAO,KAAK,SAAS,WAClB,IAAI,OACJ,MAAM,QAAQ,KAAK,IAAI,IACtB,OAAQ,IAAI,KAAmB,KAAK;AAAA,CAAI,CAAC,IACzC;AAAA,cACL,IAAI;AAAA,gBAAS,eAAe;AAAA,EAAK;AAAA,cACjC,IAAI,OAAO,KAAK,SAAS,YAAY,IAAI,MAAM,KAAK,GAAG;AAAA,gBACtD,WAAW,OAAO,IAAI,IAAI,EAAE,KAAK;AAAA,cAClC;AAAA,cACC,MAAM;AAAA,UACT;AAAA,QACD;AAAA,QACC,MAAM;AAAA;AAAA,IAER,MAAM;AAAA,EAER,MAAM,eAAe,eACpB,CAAC,eAAO,IAAI,KAAK,IAAI,eAAO,SAAS,GAAG,eAAO,WAAW,CAAC,EACzD,OAAO,OAAO,EACd,KAAK;AAAA,CAAI,CACZ;AAAA,EACA,MAAM,QAAO,mBAAmB,cAAc,SAAS;AAAA,IACtD,MAAM,CAAC,gBAAgB,YAAY,EAAE,OAAO,OAAO,EAAE,KAAK;AAAA,CAAI;AAAA,IAC9D;AAAA,IACA,MAAM,YAAY;AAAA,IAClB;AAAA,EACD,CAAC;AAAA,EAED,OAAO;AAAA,IACN;AAAA,IACA,QAAQ,kBAAkB;AAAA,EAC3B;AAAA;AAAA;AAAA,EA/fD;AAAA,EAGA;AAAA,EACA;AAAA,EAGA;AAAA;;;;ECTA;AAAA,EACA;AAAA,EACA;AAAA;;ACFA,MAAM,SAAe;AAAA,EACZ;AAAA,EACA;AAAA,EAER,WAAW,CAAC,UAAkB,KAAK;AAAA,IAClC,KAAK,QAAQ,IAAI;AAAA,IACjB,KAAK,UAAU;AAAA;AAAA,EAGhB,GAAG,CAAC,KAAuB;AAAA,IAC1B,IAAI,CAAC,KAAK,MAAM,IAAI,GAAG,GAAG;AAAA,MACzB;AAAA,IACD;AAAA,IAIA,MAAM,QAAQ,KAAK,MAAM,IAAI,GAAG;AAAA,IAChC,KAAK,MAAM,OAAO,GAAG;AAAA,IACrB,KAAK,MAAM,IAAI,KAAK,KAAK;AAAA,IAEzB,OAAO;AAAA;AAAA,EAGR,GAAG,CAAC,KAAQ,OAAgB;AAAA,IAE3B,IAAI,KAAK,MAAM,IAAI,GAAG,GAAG;AAAA,MACxB,KAAK,MAAM,OAAO,GAAG;AAAA,IACtB;AAAA,IAEA,KAAK,MAAM,IAAI,KAAK,KAAK;AAAA,IAGzB,IAAI,KAAK,MAAM,OAAO,KAAK,SAAS;AAAA,MACnC,MAAM,WAAW,KAAK,MAAM,KAAK,EAAE,KAAK,EAAE;AAAA,MAC1C,KAAK,MAAM,OAAO,QAAa;AAAA,IAChC;AAAA;AAAA,EAGD,GAAG,CAAC,KAAiB;AAAA,IACpB,OAAO,KAAK,MAAM,IAAI,GAAG;AAAA;AAAA,EAG1B,KAAK,GAAS;AAAA,IACb,KAAK,MAAM,MAAM;AAAA;AAAA,MAGd,IAAI,GAAW;AAAA,IAClB,OAAO,KAAK,MAAM;AAAA;AAEpB;AAAA;;;ACjDO,SAAS,WAAW,CAAC,UAA0B;AAAA,EACrD,MAAM,MAAM,SAAS,MAAM,GAAG,EAAE,IAAI,GAAG,YAAY;AAAA,EACnD,MAAM,YAAoC;AAAA,IACzC,MAAM;AAAA,IACN,KAAK;AAAA,IACL,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,KAAK;AAAA,IACL,KAAK;AAAA,IACL,MAAM;AAAA,IACN,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,MAAM;AAAA,IACN,OAAO;AAAA,IACP,KAAK;AAAA,EACN;AAAA,EACA,OAAO,UAAU,OAAO,OAAO;AAAA;AAGzB,SAAS,cAAc,CAAC,aAA8B;AAAA,EAC5D,IAAI,CAAC;AAAA,IAAa,OAAO;AAAA,EACzB,MAAM,KAAK,YAAY,MAAM,GAAG,EAAE,GAAG,KAAK;AAAA,EAC1C,OACC,GAAG,WAAW,OAAO,KACrB,OAAO,4BACP,OAAO,sBACP,OAAO,qBACP,OAAO;AAAA;;;AC7BT;AAIO,SAAS,WAAW,CAAC,gBAAkC;AAAA,EAC7D,OAAO,QAAQ,kBAAkB,QAAQ,KAAK,cAAc,CAAC;AAAA;AAGvD,SAAS,aAAa,CAAC,gBAAkC;AAAA,EAC/D,OAAO,QAAQ,kBAAkB,UAAU,KAAK,cAAc,CAAC;AAAA;AAGzD,SAAS,OAAO,CACtB,OACmC;AAAA,EACnC,OAAO,OAAO,UAAU,WACrB,IAAI,YAAY,EAAE,OAAO,KAAK,IAC7B;AAAA;AAGE,SAAS,cAAc,CAC7B,MACA,aACA,gBACoB;AAAA,EACpB,MAAM,eAAuC,CAAC;AAAA,EAC9C,IAAI,eAAe,WAAW,GAAG;AAAA,IAEhC,IAAI,cAAc,cAAc,GAAG;AAAA,MAClC,IAAI;AAAA,QAEH,MAAM,aAAa,mBAAmB,QAAQ,IAAI,CAAe;AAAA,QACjE,aAAa,sBAAsB;AAAA,QACnC,aAAa,OAAO;AAAA,QACpB,OAAO,EAAE,MAAM,YAAY,aAAa;AAAA,QACvC,MAAM;AAAA,IAGT;AAAA,IAEA,IAAI,YAAY,cAAc,GAAG;AAAA,MAChC,IAAI;AAAA,QACH,MAAM,aAAa,IAAI,SAAS,QAAQ,IAAI,CAAC;AAAA,QAC7C,aAAa,sBAAsB;AAAA,QACnC,aAAa,OAAO;AAAA,QACpB,OAAO,EAAE,MAAM,YAAY,aAAa;AAAA,QACvC,MAAM;AAAA,IAGT;AAAA,EACD;AAAA,EACA,OAAO,EAAE,MAAM,aAAa;AAAA;AAAA;;;;ECnD7B;AAAA,EACA;AAAA;;;;ECAA;AAAA,EAEA;AAAA,EAEA;AAAA,EAEA;AAAA,EAIA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ECXA;AAAA;;;;;;;ACAA,uBAAS;AACT,iBAAS;AAMF,SAAS,kBAAiB,GAAW;AAAA,EAG3C,MAAM,UAAU,OAAK,YAAY,KAAK,MAAM,MAAM,QAAQ;AAAA,EAC1D,MAAM,WAAW,YAAW,OAAO;AAAA,EAEnC,IAAI,UAAU;AAAA,IAEb,OAAO,OAAO;AAAA,EACf;AAAA,EAGA,MAAM,MAAM,QAAQ,IAAI;AAAA,EACxB,MAAM,mBAAmB;AAAA,IACxB,OAAK,KAAK,gBAAgB,QAAQ,SAAS;AAAA,IAC3C,OAAK,KAAK,MAAM,gBAAgB,QAAQ,SAAS;AAAA,IACjD,OAAK,KAAK,MAAM,MAAM,gBAAgB,QAAQ,SAAS;AAAA,IACvD,OAAK,KAAK,MAAM,MAAM,MAAM,gBAAgB,QAAQ,SAAS;AAAA,EAC9D;AAAA,EAEA,WAAW,YAAW,kBAAkB;AAAA,IACvC,IAAI,YAAW,QAAO,GAAG;AAAA,MACxB,OAAO;AAAA,IACR;AAAA,EACD;AAAA,EAGA,OAAO;AAAA;AAAA;;;;;;;ACvBR,uBAAS;AACT,oBAAS,4BAAmB;AAC5B,qBAAS,mBAAU;AACnB;AAqDA,eAAe,WAAW,CAAC,KAAoC;AAAA,EAC9D,MAAM,UAAwB,CAAC;AAAA,EAG/B,MAAM,YAAY,OAAK,KAAK,YAAY,QAAQ;AAAA,EAChD,IAAI,YAAW,SAAS,GAAG;AAAA,IAC1B,MAAM,cAAc,MAAM,SAAQ,WAAW,EAAE,eAAe,KAAK,CAAC;AAAA,IACpE,WAAW,cAAc,aAAa;AAAA,MACrC,IAAI,CAAC,WAAW,YAAY;AAAA,QAAG;AAAA,MAE/B,MAAM,gBAAgB,OAAK,WAAW,WAAW,IAAI;AAAA,MACrD,MAAM,QAAQ,MAAM,SAAQ,aAAa;AAAA,MACzC,WAAW,QAAQ,OAAO;AAAA,QACzB,IAAI,CAAC,KAAK,SAAS,KAAK;AAAA,UAAG;AAAA,QAE3B,MAAM,WAAW,OAAK,eAAe,IAAI;AAAA,QACzC,MAAM,QAAQ,MAAM,MAAK,QAAQ;AAAA,QACjC,MAAM,WAAU,MAAM,IAAI,KAAK,QAAQ,EAAE,YAAY;AAAA,QACrD,MAAM,cAAc,IAAI,SAAS,IAAI,WAAW,QAAO,CAAC,EAAE;AAAA,QAE1D,QAAQ,KAAK;AAAA,UACZ,MAAM;AAAA,UACN,MAAM;AAAA,UACN,MAAM,MAAM;AAAA,UACZ;AAAA,UACA,cAAc,SAAS,KAAK,QAAQ;AAAA,UACpC,MAAM;AAAA,QACP,CAAC;AAAA,MACF;AAAA,IACD;AAAA,EACD;AAAA,EAGA,MAAM,UAAU,OAAK,KAAK,MAAM;AAAA,EAChC,IAAI,YAAW,OAAO,GAAG;AAAA,IACxB,MAAM,QAAQ,MAAM,SAAQ,OAAO;AAAA,IACnC,WAAW,QAAQ,OAAO;AAAA,MACzB,MAAM,WAAW,OAAK,SAAS,IAAI;AAAA,MACnC,MAAM,QAAQ,SAAS,QAAQ;AAAA,MAC/B,IAAI,MAAM,OAAO,KAAK,CAAC,KAAK,SAAS,MAAM,KAAK,CAAC,KAAK,SAAS,OAAO,GAAG;AAAA,QACxE,MAAM,WAAU,MAAM,IAAI,KAAK,QAAQ,EAAE,YAAY;AAAA,QACrD,MAAM,cAAc,IAAI,SAAS,IAAI,WAAW,QAAO,CAAC,EAAE;AAAA,QAE1D,QAAQ,KAAK;AAAA,UACZ,MAAM;AAAA,UACN,MAAM;AAAA,UACN,MAAM,MAAM;AAAA,UACZ;AAAA,UACA,cAAc,SAAS,KAAK,QAAQ;AAAA,UACpC,MAAM;AAAA,QACP,CAAC;AAAA,MACF;AAAA,IACD;AAAA,EACD;AAAA,EAEA,OAAO;AAAA;AAOR,eAAe,gBAAgB,CAAC,KAAqC;AAAA,EACpE,IAAI;AAAA,IACH,MAAM,YAAY,OAAK,KAAK,OAAO,QAAQ;AAAA,IAC3C,MAAM,WAAW,OAAK,WAAW,WAAW;AAAA,IAC5C,MAAM,UAAU,OAAK,WAAW,UAAU;AAAA,IAE1C,IAAI,cAA6B;AAAA,IACjC,IAAI,YAAW,QAAQ,GAAG;AAAA,MACzB,cAAc;AAAA,IACf,EAAO,SAAI,YAAW,OAAO,GAAG;AAAA,MAC/B,cAAc;AAAA,IACf;AAAA,IAEA,IAAI,CAAC;AAAA,MAAa,OAAO;AAAA,IAEzB,QAAQ,8CAAwB;AAAA,IAGhC,MAAM,SAAS,iBAAiB;AAAA,IAChC,MAAM,SAAS,MAAM,IAAI,MAAM;AAAA,MAC9B,aAAa,CAAC,WAAW;AAAA,MACzB,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,WAAW;AAAA,MACX,UAAU,CAAC;AAAA,MACX,QAAQ;AAAA,QACP,wBAAwB,SAAS,iBAAiB;AAAA,MACnD;AAAA,IACD,CAAC;AAAA,IAED,IAAI,CAAC,OAAO,SAAS;AAAA,MACpB,IAAI,OAAO,QAAQ,OAAO,KAAK,SAAS,GAAG;AAAA,QAC1C,QAAQ,KACP,2CACA,OAAO,KAAK,IAAI,CAAC,QAAQ,IAAI,OAAO,EAAE,KAAK;AAAA,CAAI,CAChD;AAAA,MACD;AAAA,MACA,OAAO;AAAA,IACR;AAAA,IAEA,IAAI,OAAO,QAAQ,WAAW,GAAG;AAAA,MAChC,QAAQ,KAAK,qDAAqD;AAAA,MAClE,OAAO;AAAA,IACR;AAAA,IAEA,MAAM,UAAU,OAAK,KAAK,YAAY,SAAS;AAAA,IAC/C,MAAa,2BAAoB,KAAK,CAAC,OACtC,GAAG,MAAM,SAAS,EAAE,WAAW,KAAK,CAAC,CACtC;AAAA,IAEA,MAAM,SAAS,OAAO,QAAQ;AAAA,IAC9B,MAAM,OAAO,MAAM,OAAO,KAAK;AAAA,IAC/B,MAAM,aAAa,MAAM,qBAAoB,IAAI;AAAA,IACjD,MAAM,aAAa,OAAK,SAAS,SAAS,eAAe;AAAA,IAEzD,MAAM,UAAU,YAAY,MAAM,OAAO;AAAA,IAEzC,MAAM,YAAY,OAAO,QAAQ,KAAK,CAAC,MAAM,EAAE,KAAK,SAAS,MAAM,CAAC;AAAA,IACpE,IAAI,WAAW;AAAA,MACd,MAAM,aAAa,MAAM,UAAU,KAAK;AAAA,MACxC,MAAM,UAAU,GAAG,kBAAkB,YAAY,OAAO;AAAA,IACzD;AAAA,IAEA,OAAO;AAAA,IACN,OAAO,OAAO;AAAA,IACf,QAAQ,KAAK,oDAAoD,KAAK;AAAA,IACtE,OAAO;AAAA;AAAA;AAIT,SAAS,WAAW,CAAC,OAAuB;AAAA,EAC3C,IAAI,UAAU;AAAA,IAAG,OAAO;AAAA,EACxB,MAAM,IAAI;AAAA,EACV,MAAM,QAAQ,CAAC,KAAK,MAAM,MAAM,IAAI;AAAA,EACpC,MAAM,IAAI,KAAK,MAAM,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,CAAC,CAAC;AAAA,EAClD,OAAO,IAAI,QAAQ,KAAK,GAAG,QAAQ,CAAC,KAAK,MAAM;AAAA;AAGhD,SAAS,cAAc,CAAC,SAAoC;AAAA,EAC3D,MAAM,eAA6C,CAAC;AAAA,EACpD,IAAI,YAAY;AAAA,EAChB,IAAI,mBAAmB;AAAA,EAEvB,WAAW,UAAU,SAAS;AAAA,IAC7B,aAAa,OAAO;AAAA,IACpB,oBAAoB,OAAO;AAAA,IAE3B,IAAI,OAAO,SAAS,SAAS;AAAA,MAE5B,MAAM,QAAQ,OAAO,aAAa,MAAM,4BAA4B;AAAA,MACpE,MAAM,aAAa,QAAQ,MAAM,KAAK;AAAA,MACtC,IAAI,CAAC,aAAa,aAAa;AAAA,QAC9B,aAAa,cAAc,CAAC;AAAA,MAC7B;AAAA,MACA,aAAa,YAAY,KAAK,MAAM;AAAA,IACrC,EAAO;AAAA,MACN,IAAI,CAAC,aAAa,UAAU;AAAA,QAC3B,aAAa,WAAW,CAAC;AAAA,MAC1B;AAAA,MACA,aAAa,SAAS,KAAK,MAAM;AAAA;AAAA,EAEnC;AAAA,EAEA,OAAO;AAAA,IACN,cAAc,QAAQ;AAAA,IACtB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACD;AAAA;AAUD,eAAe,wBAAwB,CACtC,KAC+B;AAAA,EAC/B,MAAM,eAAe,IAAI;AAAA,EACzB,MAAM,iBAAiB,OAAK,KAAK,cAAc;AAAA,EAE/C,IAAI,CAAC,YAAW,cAAc;AAAA,IAAG,OAAO;AAAA,EAExC,IAAI;AAAA,IACH,QAAQ,aAAa,MAAa;AAAA,IAElC,MAAM,SAAS,SAAS,UAAU,wCAAwC;AAAA,MACzE,UAAU;AAAA,MACV,WAAW;AAAA,IACZ,CAAC;AAAA,IAED,MAAM,QAAQ,OAAO,KAAK,EAAE,MAAM;AAAA,CAAI;AAAA,IACtC,WAAW,QAAQ,OAAO;AAAA,MACzB,OAAO,QAAQ,SAAQ,KAAK,MAAM,IAAI;AAAA,MACtC,IAAI,CAAC;AAAA,QAAM;AAAA,MACX,MAAM,UAAU,UAAS,KAAI;AAAA,MAE7B,IAAI,QAAQ,WAAW,GAAG,GAAG;AAAA,QAC5B,MAAM,WAAW;AAAA,QACjB,MAAM,eAAe,SACpB,UAAU,kCACV;AAAA,UACC,UAAU;AAAA,QACX,CACD;AAAA,QACA,MAAM,cAAc,aAAa,KAAK,EAAE,MAAM;AAAA,CAAI;AAAA,QAClD,WAAW,cAAc,aAAa;AAAA,UACrC,OAAO,cAAc,cAAc,WAAW,MAAM,IAAI;AAAA,UACxD,IAAI,CAAC;AAAA,YAAY;AAAA,UACjB,MAAM,cAAc,GAAG,WAAW,UAAS,UAAU;AAAA,UACrD,aAAa,IACZ,aACA,OAAO,SAAS,cAAc,EAAE,IAAI,IACrC;AAAA,QACD;AAAA,MACD,EAAO;AAAA,QACN,aAAa,IAAI,SAAS,OAAO,SAAS,QAAQ,EAAE,IAAI,IAAI;AAAA;AAAA,IAE9D;AAAA,IACC,OAAO,QAAQ;AAAA,EAIjB,OAAO;AAAA;AAGR,eAAe,mBAAmB,CACjC,WACA,KAC0B;AAAA,EAC1B,IAAI;AAAA,IACH,IAAI,CAAC,YAAW,SAAS;AAAA,MAAG,OAAO;AAAA,IAEnC,MAAM,OAAgB;AAAA,MACrB,MAAM,UAAS,SAAS;AAAA,MACxB,MAAM;AAAA,MACN,MAAM;AAAA,MACN,UAAU,CAAC;AAAA,IACZ;AAAA,IAEA,MAAM,UAAU,MAAM,uBAAuB,WAAW,GAAG;AAAA,IAC3D,IAAI;AAAA,MAAS,OAAO;AAAA,IAGpB,IAAI;AAAA,MAiBH,IAAS,QAAT,QAAc,CAAC,UAAkB,MAAc;AAAA,QAC9C,IAAI,SAAS,SAAS,cAAc,GAAG;AAAA,UACtC,IAAI,UAAU,SAAS,MACtB,SAAS,QAAQ,cAAc,IAAI,eAAe,SAAS,CAC5D;AAAA,UACA,UAAU,QAAQ,WAAW,GAAG,IAC7B,QAAQ,MAAM,GAAG,EAAE,MAAM,GAAG,CAAC,EAAE,KAAK,GAAG,IACvC,QAAQ,MAAM,GAAG,EAAE;AAAA,UACtB,IAAI,UAAU,gBAAgB,UAAU,KACvC,CAAC,MAAM,EAAE,SAAS,OACnB;AAAA,UACA,IAAI,CAAC,SAAS;AAAA,YACb,UAAU;AAAA,cACT,MAAM,WAAW;AAAA,cACjB,MAAM,OAAK,KAAK,gBAAgB,WAAW,EAAE;AAAA,cAC7C,MAAM;AAAA,cACN,UAAU,CAAC;AAAA,YACZ;AAAA,YACA,gBAAgB,UAAU,KAAK,OAAO;AAAA,UACvC;AAAA,UACA,QAAQ,UAAU,KAAK;AAAA,YACtB,MAAM,UAAS,QAAQ;AAAA,YACvB,MAAM;AAAA,YACN;AAAA,UACD,CAAC;AAAA,QACF,EAAO;AAAA,UACN,MAAM,MAAM,SAAS,KAAK,QAAQ;AAAA,UAClC,MAAM,QAAQ,IAAI,MAAM,GAAG,EAAE,OAAO,OAAO;AAAA,UAC3C,IAAI,UAAU;AAAA,UACd,SAAS,IAAI,EAAG,IAAI,MAAM,SAAS,GAAG,KAAK;AAAA,YAC1C,MAAM,OAAO,MAAM;AAAA,YACnB,IAAI,QAAQ,QAAQ,UAAU,KAAK,CAAC,MAAM,EAAE,SAAS,IAAI;AAAA,YACzD,IAAI,CAAC,OAAO;AAAA,cACX,QAAQ;AAAA,gBACP,MAAM;AAAA,gBACN,MAAM,OAAK,KAAK,GAAG,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC;AAAA,gBACxC,MAAM;AAAA,gBACN,UAAU,CAAC;AAAA,cACZ;AAAA,cACA,QAAQ,UAAU,KAAK,KAAK;AAAA,YAC7B;AAAA,YACA,UAAU;AAAA,UACX;AAAA,UACA,QAAQ,UAAU,KAAK;AAAA,YACtB,MAAM,MAAM,MAAM,SAAS,MAAM,UAAS,QAAQ;AAAA,YAClD,MAAM;AAAA,YACN;AAAA,UACD,CAAC;AAAA;AAAA,SAuBM,UAAT,QAAgB,CAAC,MAAuB;AAAA,QACvC,IAAI,KAAK,YAAY,KAAK,SAAS,SAAS,GAAG;AAAA,UAC9C,KAAK,OAAO,KAAK,SAAS,OAAO,CAAC,GAAG,MAAM,IAAI,QAAQ,CAAC,GAAG,CAAC;AAAA,QAC7D;AAAA,QACA,OAAO,KAAK;AAAA;AAAA,MA1Fb,MAAM,WAAU,MAAM,SAAS,WAAW,OAAO;AAAA,MACjD,MAAM,gBAAgB;AAAA,MACtB,MAAM,kBAA2B;AAAA,QAChC,MAAM;AAAA,QACN,MAAM,OAAK,KAAK,cAAc;AAAA,QAC9B,MAAM;AAAA,QACN,UAAU,CAAC;AAAA,MACZ;AAAA,MACA,MAAM,UAAmB;AAAA,QACxB,MAAM;AAAA,QACN,MAAM;AAAA,QACN,MAAM;AAAA,QACN,UAAU,CAAC;AAAA,MACZ;AAAA,MACA,KAAK,UAAU,KAAK,iBAAiB,OAAO;AAAA,MAqD5C,IAAI;AAAA,MACJ,IAAI,WAAW;AAAA,MACf,IAAI,UAAU;AAAA,MACd,QAAQ,cAAc,KAAK,QAAO;AAAA,MAClC,OAAO,UAAU,MAAM;AAAA,QACtB,IAAI,UAAU;AAAA,UACb,MAAM,OAAO,MAAM,QAAQ;AAAA,UAC3B,IAAI,OAAO;AAAA,YAAG,MAAM,UAAU,IAAI;AAAA,QACnC;AAAA,QACA,WAAW,MAAM;AAAA,QACjB,UAAU,MAAM,QAAQ,MAAM,GAAG;AAAA,QACjC,QAAQ,cAAc,KAAK,QAAO;AAAA,MACnC;AAAA,MACA,IAAI,UAAU;AAAA,QACb,MAAM,OAAO,SAAQ,SAAS;AAAA,QAC9B,IAAI,OAAO;AAAA,UAAG,MAAM,UAAU,IAAI;AAAA,MACnC;AAAA,MASA,QAAQ,IAAI;AAAA,MAEZ,OAAO;AAAA,QACN,OAAO;AAAA,QACP,WAAW,KAAK;AAAA,QAChB;AAAA,MACD;AAAA,MACC,MAAM;AAAA,MACP,OAAO;AAAA;AAAA,IAEP,MAAM;AAAA,IACP,OAAO;AAAA;AAAA;AAQT,eAAe,sBAAsB,CACpC,YACA,KAC0B;AAAA,EAC1B,IAAI;AAAA,IAsBH,IAAS,YAAT,QAAkB,CAAC,KAAa,UAAiC;AAAA,MAChE,IAAI,SAAS;AAAA,MACb,IAAI,QAAQ;AAAA,MACZ,IAAI;AAAA,MACJ,GAAG;AAAA,QACF,MAAM,KAAK,IAAI,SAAS;AAAA,QACxB,IAAI,MAAM;AAAA,UAAM,OAAO;AAAA,QACvB,MAAM,MAAM,UAAU,IAAI,EAAE,KAAK;AAAA,QACjC,gBAAgB,MAAM,QAAQ;AAAA,QAC9B,MAAM,QAAQ,MAAM;AAAA,QACpB,UAAU,SAAS;AAAA,QACnB,SAAS;AAAA,MACV,SAAS;AAAA,MACT,MAAM,SAAS,SAAS;AAAA,MACxB,WAAW;AAAA,MACX,OAAO,SAAS,CAAC,SAAS;AAAA,OAmElB,SAAT,QAAe,CAAC,YAA4B;AAAA,MAC3C,IAAI,WAAW,WAAW,GAAG,KAAK,WAAW,MAAM,cAAc;AAAA,QAChE,OAAO;AAAA,MAER,MAAM,YAAY,WAAW,UAAU,GAAG,WAAW,YAAY,GAAG,CAAC;AAAA,MACrE,OAAO,OAAK,WAAW,cAAc,IAAI,UAAU;AAAA,OAoF3C,eAAT,QAAqB,CAAC,MAAuB;AAAA,MAC5C,IAAI,KAAK,YAAY,KAAK,SAAS,SAAS,GAAG;AAAA,QAC9C,KAAK,OAAO,KAAK,SAAS,OAAO,CAAC,GAAG,MAAM,IAAI,aAAa,CAAC,GAAG,CAAC;AAAA,MAClE;AAAA,MACA,OAAO,KAAK;AAAA;AAAA,IApMb,MAAM,UAAU,GAAG;AAAA,IACnB,IAAI,CAAC,YAAW,OAAO;AAAA,MAAG,OAAO;AAAA,IACjC,OAAO,QAAQ,WAAW,MAAM,QAAQ,IAAI;AAAA,MAC3C,SAAS,YAAY,OAAO;AAAA,MAC5B,SAAS,SAAS,OAAO;AAAA,IAC1B,CAAC;AAAA,IACD,MAAM,MAAM,KAAK,MAAM,OAAO;AAAA,IAO9B,MAAM,aAAa,IAAI,cAAc;AAAA,IACrC,MAAM,WAAW,OAAO,MAAM;AAAA,CAAI,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM;AAAA,IAGvD,MAAM,QACL;AAAA,IACD,MAAM,YAAY,IAAI;AAAA,IACtB,SAAS,IAAI,EAAG,IAAI,MAAM,QAAQ;AAAA,MAAK,UAAU,IAAI,MAAM,IAAI,CAAC;AAAA,IAoBhE,MAAM,YAAsB,IAAI,MAAM,IAAI,QAAQ,MAAM,EAAE,KAAK,CAAC;AAAA,IAEhE,MAAM,QAAQ,IAAI,SAAS,MAAM,GAAG;AAAA,IACpC,SAAS,OAAO,EAAG,OAAO,MAAM,QAAQ,QAAQ;AAAA,MAC/C,MAAM,OAAO,MAAM;AAAA,MACnB,IAAI,CAAC;AAAA,QAAM;AAAA,MACX,IAAI,SAAS;AAAA,MACb,IAAI,OAAM;AAAA,MACV,IAAI,WAAW;AAAA,MACf,IAAI,UAAU;AAAA,MAEd,MAAM,UAAsD,CAAC;AAAA,MAC7D,MAAM,MAAM,EAAE,GAAG,EAAE;AAAA,MACnB,OAAO,IAAI,IAAI,KAAK,QAAQ;AAAA,QAC3B,MAAM,SAAQ,IAAI;AAAA,QAClB,UAAU,UAAU,MAAM,GAAG;AAAA,QAC7B,IAAI,WAA0B;AAAA,QAC9B,IAAI,IAAI,IAAI,KAAK,UAAU,KAAK,IAAI,OAAO,KAAK;AAAA,UAC/C,QAAO,UAAU,MAAM,GAAG;AAAA,UAC1B,YAAY,UAAU,MAAM,GAAG;AAAA,UAC/B,WAAW,UAAU,MAAM,GAAG;AAAA,UAC9B,IAAI,IAAI,IAAI,KAAK,UAAU,KAAK,IAAI,OAAO,KAAK;AAAA,YAC/C,UAAU,MAAM,GAAG;AAAA,UACpB;AAAA,UACA,WAAW;AAAA,QACZ;AAAA,QACA,QAAQ,KAAK,EAAE,KAAK,QAAQ,KAAK,SAAS,CAAC;AAAA,QAC3C,IAAI,KAAK,IAAI,OAAO;AAAA,UAAK,IAAI;AAAA,QAC7B,IAAI,IAAI,MAAM;AAAA,UAAO,IAAI;AAAA,MAC1B;AAAA,MACA,IAAI,QAAQ,WAAW;AAAA,QAAG;AAAA,MAC1B,SAAS,IAAI,EAAG,IAAI,QAAQ,QAAQ,KAAK;AAAA,QACxC,MAAM,OAAO,QAAQ;AAAA,QACrB,MAAM,UACL,IAAI,IAAI,QAAQ,SAAS,QAAQ,IAAI,GAAG,MAAO,SAAS,SAAS;AAAA,QAClE,MAAM,OAAO,KAAK,IAAI,GAAG,UAAU,KAAK,GAAG;AAAA,QAC3C,IAAI,OAAO,KAAK,KAAK,OAAO,QAAQ,UAAU,KAAK,QAAQ,MAAM;AAAA,UAChE,UAAU,KAAK,QAAQ;AAAA,QACxB;AAAA,MACD;AAAA,IACD;AAAA,IAGA,MAAM,OAAgB;AAAA,MACrB,MAAM,UAAS,UAAU;AAAA,MACzB,MAAM;AAAA,MACN,MAAM;AAAA,MACN,UAAU,CAAC;AAAA,IACZ;AAAA,IACA,MAAM,kBAA2B;AAAA,MAChC,MAAM;AAAA,MACN,MAAM,OAAK,KAAK,cAAc;AAAA,MAC9B,MAAM;AAAA,MACN,UAAU,CAAC;AAAA,IACZ;AAAA,IACA,MAAM,UAAmB;AAAA,MACxB,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,UAAU,CAAC;AAAA,IACZ;AAAA,IACA,KAAK,UAAU,KAAK,iBAAiB,OAAO;AAAA,IAU5C,SAAS,IAAI,EAAG,IAAI,IAAI,QAAQ,QAAQ,KAAK;AAAA,MAC5C,MAAM,OAAO,UAAU;AAAA,MACvB,IAAI,QAAQ;AAAA,QAAG;AAAA,MACf,MAAM,UAAU,OAAO,IAAI,QAAQ,EAAE;AAAA,MACrC,IAAI,QAAQ,SAAS,cAAc,GAAG;AAAA,QAErC,IAAI;AAAA,QAGJ,IAAI,QAAQ,SAAS,OAAO,GAAG;AAAA,UAC9B,MAAM,WAAW,QAAQ,MACxB,+CACD;AAAA,UACA,IAAI,UAAU;AAAA,YAEb,MAAM,WAAW,SAAS;AAAA,YAE1B,IAAI,aAAa,cAAc,SAAS,WAAW,GAAG,GAAG;AAAA,cACxD,MAAM,aAAa,QAAQ,MAC1B,qDACD;AAAA,cACA,UAAU,aAAa,WAAW,KAAK;AAAA,YACxC,EAAO;AAAA,cACN,UAAU;AAAA;AAAA,UAEZ,EAAO;AAAA,YAEN,MAAM,gBAAgB,QAAQ,MAAM,iBAAiB;AAAA,YACrD,UAAU,gBAAgB,cAAc,KAAK;AAAA;AAAA,QAE/C,EAAO;AAAA,UAEN,MAAM,UAAU,QAAQ,MACvB,QAAQ,YAAY,cAAc,IAAI,eAAe,SAAS,CAC/D;AAAA,UACA,UAAU,QAAQ,WAAW,GAAG,IAC7B,QAAQ,MAAM,GAAG,EAAE,MAAM,GAAG,CAAC,EAAE,KAAK,GAAG,IACvC,QAAQ,MAAM,GAAG,EAAE;AAAA;AAAA,QAGvB,IAAI,UAAU,gBAAgB,UAAU,KAAK,CAAC,MAAM,EAAE,SAAS,OAAO;AAAA,QACtE,IAAI,CAAC,SAAS;AAAA,UACb,UAAU;AAAA,YACT,MAAM,WAAW;AAAA,YACjB,MAAM,OAAK,KAAK,gBAAgB,WAAW,EAAE;AAAA,YAC7C,MAAM;AAAA,YACN,UAAU,CAAC;AAAA,UACZ;AAAA,UACA,gBAAgB,UAAU,KAAK,OAAO;AAAA,QACvC;AAAA,QACA,QAAQ,UAAU,KAAK;AAAA,UACtB,MAAM,UAAS,OAAO;AAAA,UACtB,MAAM;AAAA,UACN;AAAA,QACD,CAAC;AAAA,MACF,EAAO;AAAA,QACN,MAAM,MAAM,SAAS,KAAK,OAAO;AAAA,QACjC,MAAM,QAAQ,IAAI,MAAM,GAAG,EAAE,OAAO,OAAO;AAAA,QAC3C,IAAI,UAAU;AAAA,QACd,SAAS,KAAI,EAAG,KAAI,MAAM,SAAS,GAAG,MAAK;AAAA,UAC1C,MAAM,OAAO,MAAM;AAAA,UACnB,IAAI,QAAQ,QAAQ,UAAU,KAAK,CAAC,MAAM,EAAE,SAAS,IAAI;AAAA,UACzD,IAAI,CAAC,OAAO;AAAA,YACX,QAAQ;AAAA,cACP,MAAM;AAAA,cACN,MAAM,OAAK,KAAK,GAAG,MAAM,MAAM,GAAG,KAAI,CAAC,CAAC;AAAA,cACxC,MAAM;AAAA,cACN,UAAU,CAAC;AAAA,YACZ;AAAA,YACA,QAAQ,UAAU,KAAK,KAAK;AAAA,UAC7B;AAAA,UACA,UAAU;AAAA,QACX;AAAA,QACA,QAAQ,UAAU,KAAK;AAAA,UACtB,MAAM,MAAM,MAAM,SAAS,MAAM,UAAS,OAAO;AAAA,UACjD,MAAM;AAAA,UACN;AAAA,QACD,CAAC;AAAA;AAAA,IAEH;AAAA,IAQA,aAAa,IAAI;AAAA,IAEjB,OAAO;AAAA,MACN,OAAO;AAAA,MACP,WAAW,KAAK;AAAA,MAChB;AAAA,IACD;AAAA,IACC,MAAM;AAAA,IACP,OAAO;AAAA;AAAA;AAIT,eAAe,kBAAkB,CAChC,OACA,SACA,UACA,gBACA,aACA,eACkB;AAAA,EAClB,MAAM,UAAU,MAAM,QAAQ,KAAK,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,IAAI;AAAA,EAG5D,IAAI,yBAAwC;AAAA,EAC5C,IAAI,4BAA2C;AAAA,EAC/C,IAAI;AAAA,IACH,MAAM,UAAU,OAAK,QAAQ,IAAI,GAAG,MAAM;AAAA,IAC1C,IAAI,YAAW,OAAO,GAAG;AAAA,MACxB,MAAM,QAAQ,MAAM,SAAQ,OAAO;AAAA,MACnC,WAAW,QAAQ,OAAO;AAAA,QACzB,MAAM,WAAW,OAAK,SAAS,IAAI;AAAA,QACnC,MAAM,SAAQ,SAAS,QAAQ;AAAA,QAC/B,IAAI,OAAM,OAAO,KAAK,CAAC,KAAK,SAAS,GAAG,GAAG;AAAA,UAC1C,yBAAyB,OAAM;AAAA,UAC/B,MAAM,WAAU,MAAM,SAAS,QAAQ;AAAA,UACvC,4BAA4B,IAAI,SAAS,QAAO,EAAE;AAAA,UAClD;AAAA,QACD;AAAA,MACD;AAAA,IACD;AAAA,IACC,MAAM;AAAA,EAGR,MAAM,OAAO,CAAC,MAAc,QAAQ,QAAQ,OAAO,OAAO;AAAA,IACzD,MAAM,QAAgC;AAAA,MACrC,OAAO;AAAA,MACP,OACC;AAAA,MACD,QAAQ;AAAA,MACR,SACC;AAAA,MACD,SACC;AAAA,MACD,QACC;AAAA,IACF;AAAA,IACA,MAAM,QAAO,MAAM,SAAS,MAAM;AAAA,IAClC,OAAO,eAAe,iBAAiB,iDAAiD,uJAAuJ;AAAA;AAAA,EAGhP,MAAM,QAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kCAqYoB,KAAK,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iCAOb,MAAM;AAAA,IAChC,MAAM,cAAc,gBAAgB,KAAK,UAAU,KAClD,CAAC,MAAM,EAAE,SAAS,cACnB;AAAA,IACA,OAAO,aAAa,UAAU,UAAU;AAAA,KACtC;AAAA;AAAA;AAAA;AAAA,gCAIuB,cAAc,YAAY,YAAY,IAAI,IAAI;AAAA;AAAA;AAAA;AAAA,iCAI7C,MAAM;AAAA,IAChC,MAAM,cAAc,SAAS,KAAK,UAAU,KAC3C,CAAC,MAAM,EAAE,SAAS,cACnB;AAAA,IACA,OAAO,aAAa,UAAU,UAAU;AAAA,KACtC;AAAA;AAAA;AAAA;AAAA,gCAIuB,yBAAyB,YAAY,sBAAsB,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAW5F,cACG;AAAA;AAAA;AAAA;AAAA,kCAI4B,KAAK,OAAO;AAAA,iCACb,YAAY,iBAAiB,YAAY,YAAY,IAAI,kBAAkB,YAAY,YAAY,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gCAQ/G,YAAY,YAAY,IAAI;AAAA;AAAA;AAAA;AAAA,gCAI5B,YAAY,YAAY,WAAW;AAAA;AAAA;AAAA;AAAA,kCAIjC,IAAI,YAAY,cAAc,YAAY,QAAQ,KAAK,QAAQ,CAAC;AAAA;AAAA;AAAA;AAAA,iCAIjE,MAAM;AAAA,IAChC,MAAM,IAAI,YAAY,cAAc,OAAQ;AAAA,IAC5C,OAAO,KAAK,IAAI,GAAG,EAAE,QAAQ,CAAC,OAAO,IAAI,IAAI,MAAM,QAAQ,CAAC;AAAA,KAC1D;AAAA;AAAA;AAAA;AAAA,iCAIwB,MAAM;AAAA,IAChC,MAAM,IAAI,YAAY,cAAc,OAAQ;AAAA,IAC5C,OAAO,KAAK,IAAI,GAAG,EAAE,QAAQ,CAAC,OAAO,IAAI,IAAI,MAAM,QAAQ,CAAC;AAAA,KAC1D;AAAA;AAAA;AAAA;AAAA,iCAIwB,MAAM;AAAA,IAChC,MAAM,IAAI,YAAY,cAAc,OAAQ;AAAA,IAC5C,OAAO,KAAK,IAAI,GAAG,EAAE,QAAQ,CAAC,OAAO,IAAI,IAAI,MAAM,QAAQ,CAAC;AAAA,KAC1D;AAAA;AAAA;AAAA;AAAA;AAAA,MAMH;AAAA,IAGH,iBACG;AAAA;AAAA;AAAA;AAAA,kCAI4B,KAAK,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kCAab,KAAK,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAU1C;AAAA;AAAA,IAGF,OAAO,QAAQ,MAAM,YAAY,EACjC,OAAO,EAAE,gBAAgB,eAAe,UAAU,EAClD,IAAI,EAAE,YAAY,uBAAuB;AAAA,IACzC,MAAM,kBAAkB,kBAAkB,OACzC,CAAC,KAAK,MAAM,MAAM,EAAE,MACpB,CACD;AAAA,IACA,MAAM,oBAAoB,kBAAkB,OAC3C,CAAC,KAAK,MAAM,MAAM,EAAE,aACpB,CACD;AAAA,IACA,OAAO;AAAA;AAAA;AAAA;AAAA,kCAIuB,KAAK,SAAS,IAAI;AAAA,iCACnB,kBAAkB,yBAAyB,YAAY,eAAe,kBAAkB,YAAY,iBAAiB;AAAA;AAAA;AAAA;AAAA;AAAA,+BAKvH;AAAA,OACxB,kBACA,KAAK,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,IAAI,EAC9B,MAAM,GAAG,EAAE,EACX,IACA,CAAC,WAAW;AAAA;AAAA,+BAEY,OAAO;AAAA,+BACP,YAAY,OAAO,IAAI,cAAc,YAAY,OAAO,WAAW;AAAA;AAAA,MAG5F,EACC,KAAK,EAAE;AAAA;AAAA,MAGT,kBAAkB,SAAS,KACxB;AAAA,iDACyC,sBAAsB,kBAAkB,SAAS;AAAA;AAAA,WAEvF;AAAA,wBACa;AAAA,YACZ;AAAA,QACJ;AAAA,8CACsC;AAAA,0BACpB,KAAK,UAAU,kBAAkB,MAAM,EAAE,EAAE,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,EAAE,MAAM,aAAa,EAAE,YAAY,EAAE,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAWrI;AAAA;AAAA;AAAA;AAAA,GAKJ,EACA,KAAK,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOR,yBACG;AAAA;AAAA;AAAA;AAAA,yCAImC,KAAK,UAAU,MAAM;AAAA,gEACE,YAAY,sBAAsB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uCAQ3D,YAAY,sBAAsB;AAAA;AAAA,OAGnE,4BACG;AAAA;AAAA;AAAA,uCAG8B,YAAY,yBAAyB;AAAA;AAAA;AAAA;AAAA,yCAInC,IAAI,4BAA4B,0BAA0B,KAAK,QAAQ,CAAC;AAAA;AAAA,SAGxG;AAAA;AAAA;AAAA;AAAA,MAMH;AAAA,IAGH,UACG;AAAA;AAAA;AAAA;AAAA,yCAImC,KAAK,UAAU,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yCAarB,KAAK,WAAW,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAUzD;AAAA;AAAA,IAGF,QAAQ,WAAW,IAAI,iHAAiH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAQ1I,kBAAkB,UACf;AAAA;AAAA,2BAEsB,iBAAiB,KAAK,UAAU,cAAc,IAAI;AAAA,0BACnD,UAAU,KAAK,UAAU,OAAO,IAAI;AAAA,wBACtC,YAAY,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA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",
|
|
41
|
-
"debugId": "
|
|
51
|
+
"mappings": "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;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA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AI;AAAA,0BACnD,UAAU,KAAK,UAAU,OAAO,IAAI;AAAA,wBACtC,YAAY,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAA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",
|
|
52
|
+
"debugId": "34CC9BF0CD017A3B64756E2164756E21",
|
|
42
53
|
"names": []
|
|
43
54
|
}
|