@blinkk/root 1.0.0-alpha.11 → 1.0.0-alpha.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunk-ZB7R6ZOY.js +31 -0
- package/dist/chunk-ZB7R6ZOY.js.map +1 -0
- package/dist/cli.js +200 -85
- package/dist/cli.js.map +1 -1
- package/dist/config-3a70dc3b.d.ts +171 -0
- package/dist/core.d.ts +1 -1
- package/dist/core.js +6 -0
- package/dist/core.js.map +1 -1
- package/dist/render.d.ts +2 -60
- package/dist/render.js +9 -9
- package/dist/render.js.map +1 -1
- package/package.json +4 -1
- package/dist/config-ea7b8b9c.d.ts +0 -81
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli/commands/dev.ts","../src/render/vite-plugin-root.ts","../src/core/fsutils.ts","../src/render/asset-map/dev-asset-map.ts","../src/cli/load-config.ts","../src/render/html-minify.ts","../src/cli/commands/build.ts","../src/render/asset-map/build-asset-map.ts","../src/cli/commands/preview.ts","../src/cli/commands/start.ts"],"sourcesContent":["import path from 'node:path';\nimport {fileURLToPath} from 'node:url';\nimport {default as express, Request, Response, NextFunction} from 'express';\nimport {createServer as createViteServer} from 'vite';\nimport {pluginRoot} from '../../render/vite-plugin-root.js';\nimport {DevServerAssetMap} from '../../render/asset-map/dev-asset-map.js';\nimport {loadRootConfig} from '../load-config.js';\nimport {htmlMinify} from '../../render/html-minify.js';\nimport {Renderer} from '../../render/render.js';\nimport {isDirectory, isJsFile} from '../../core/fsutils.js';\nimport glob from 'tiny-glob';\nimport {dim} from 'kleur/colors';\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\n\nexport async function createServer(options?: {rootDir?: string}) {\n const rootDir = options?.rootDir || process.cwd();\n\n const app = express();\n app.disable('x-powered-by');\n app.use(express.static('public'));\n const middlewares = await getMiddlewares({rootDir});\n middlewares.forEach((middleware) => app.use(middleware));\n\n const port = parseInt(process.env.PORT || '4007');\n console.log();\n console.log(`${dim('┃')} project: ${rootDir}`);\n console.log(`${dim('┃')} server: http://localhost:${port}`);\n console.log();\n app.listen(port);\n}\n\nexport async function getMiddlewares(options?: {rootDir?: string}) {\n const rootDir = path.resolve(options?.rootDir || process.cwd());\n const rootConfig = await loadRootConfig(rootDir);\n const viteConfig = rootConfig.vite || {};\n const renderModulePath = path.resolve(__dirname, './render.js');\n\n const pages: string[] = [];\n if (await isDirectory(path.join(rootDir, 'routes'))) {\n const pageFiles = await glob('routes/**/*', {cwd: rootDir});\n pageFiles.forEach((file) => {\n const parts = path.parse(file);\n if (!parts.name.startsWith('_') && isJsFile(parts.base)) {\n pages.push(file);\n }\n });\n }\n\n const elementsDirs = [path.join(rootDir, 'elements')];\n const elementsInclude = rootConfig.elements?.include || [];\n const excludePatterns = rootConfig.elements?.exclude || [];\n const excludeElement = (moduleId: string) => {\n return excludePatterns.some((pattern) => Boolean(moduleId.match(pattern)));\n };\n\n for (const dirPath of elementsInclude) {\n const elementsDir = path.resolve(rootDir, dirPath);\n if (!elementsDir.startsWith(rootDir)) {\n throw new Error(\n `the elements dir (${dirPath}) should be relative to the project's root dir (${rootDir})`\n );\n }\n elementsDirs.push(elementsDir);\n }\n const elements: string[] = [];\n for (const dirPath of elementsDirs) {\n if (await isDirectory(dirPath)) {\n const elementFiles = await glob('**/*', {cwd: dirPath});\n elementFiles.forEach((file) => {\n const parts = path.parse(file);\n if (isJsFile(parts.base)) {\n const fullPath = path.join(dirPath, file);\n const moduleId = fullPath.slice(rootDir.length);\n if (!excludeElement(moduleId)) {\n elements.push(moduleId.slice(1));\n }\n }\n });\n }\n }\n\n const bundleScripts: string[] = [];\n if (await isDirectory(path.join(rootDir, 'bundles'))) {\n const bundleFiles = await glob(path.join(rootDir, 'bundles/*'));\n bundleFiles.forEach((file) => {\n const parts = path.parse(file);\n if (isJsFile(parts.base)) {\n bundleScripts.push(file);\n }\n });\n }\n\n const viteServer = await createViteServer({\n ...viteConfig,\n mode: 'development',\n root: rootDir,\n server: {middlewareMode: true},\n appType: 'custom',\n optimizeDeps: {\n include: [...pages, ...elements, ...bundleScripts],\n },\n ssr: {\n noExternal: ['@blinkk/root'],\n },\n esbuild: {\n jsx: 'automatic',\n jsxImportSource: 'preact',\n },\n plugins: [...(viteConfig.plugins || []), pluginRoot({rootDir, rootConfig})],\n });\n\n const rootMiddleware = async (\n req: Request,\n res: Response,\n next: NextFunction\n ) => {\n const url = req.originalUrl;\n let renderer: Renderer | null = null;\n try {\n const render = await viteServer.ssrLoadModule(renderModulePath);\n renderer = new render.Renderer(rootConfig) as Renderer;\n // Create a dev asset map using Vite dev server's module graph.\n const assetMap = new DevServerAssetMap(viteServer.moduleGraph);\n const data = await renderer.render(url, {\n assetMap: assetMap,\n });\n if (data.notFound || !data.html) {\n next();\n return;\n }\n // Inject the Vite HMR client.\n let html = await viteServer.transformIndexHtml(url, data.html || '');\n if (rootConfig.minifyHtml !== false) {\n html = await htmlMinify(html);\n }\n res.status(200).set({'Content-Type': 'text/html'}).end(html);\n } catch (e) {\n // If an error is caught, let Vite fix the stack trace so it maps back to\n // your actual source code.\n viteServer.ssrFixStacktrace(e);\n console.error(e);\n try {\n if (renderer) {\n const {html} = await renderer.renderError(e);\n res.status(500).set({'Content-Type': 'text/html'}).end(html);\n } else {\n next(e);\n }\n } catch (e2) {\n console.error('failed to render custom error');\n console.error(e2);\n next(e);\n }\n }\n };\n\n const notFoundMiddleware = async (req: Request, res: Response) => {\n const url = req.originalUrl;\n const ext = path.extname(url);\n if (!ext) {\n const render = await viteServer.ssrLoadModule(renderModulePath);\n const renderer = new render.Renderer(rootConfig) as Renderer;\n const data = await renderer.renderDevNotFound();\n const html = data.html || '';\n res.status(404).set({'Content-Type': 'text/html'}).end(html);\n return;\n }\n res.status(404).set({'Content-Type': 'text/plain'}).end('404');\n };\n\n const userMiddlewares = rootConfig.server?.middlewares || [];\n return [\n ...userMiddlewares,\n viteServer.middlewares,\n rootMiddleware,\n notFoundMiddleware,\n ];\n}\n\nexport async function dev(rootProjectDir?: string) {\n process.env.NODE_ENV = 'development';\n const rootDir = path.resolve(rootProjectDir || process.cwd());\n await createServer({rootDir});\n}\n","import path from 'path';\nimport glob from 'tiny-glob';\nimport {RootConfig} from '../core/config';\nimport {isDirectory, isJsFile} from '../core/fsutils';\n\nconst JSX_ELEMENTS_REGEX = /jsxs?\\(\"(\\w[\\w-]+\\w)\"/g;\nconst HTML_ELEMENTS_REGEX = /<(\\w[\\w-]+\\w)/g;\n\nexport interface RootPluginOptions {\n rootDir: string;\n rootConfig: RootConfig;\n}\n\nexport function pluginRoot(options?: RootPluginOptions) {\n const elementsVirtualId = 'virtual:root-elements';\n const resolvedElementsVirtualId = '\\0' + elementsVirtualId;\n\n const rootDir = options?.rootDir || process.cwd();\n const rootConfig = options?.rootConfig || {};\n const elementsDirs = [path.join(rootDir, 'elements')];\n const includeDirs = rootConfig.elements?.include || [];\n includeDirs.forEach((dirPath) => {\n const elementsDir = path.resolve(rootDir, dirPath);\n if (!elementsDir.startsWith(rootDir)) {\n throw new Error(\n `the elements dir (${dirPath}) should be relative to the project's root dir (${rootDir})`\n );\n }\n elementsDirs.push(elementsDir);\n });\n\n const excludePatterns = rootConfig.elements?.exclude || [];\n const excludeElement = (moduleId: string) => {\n return excludePatterns.some((pattern) => Boolean(moduleId.match(pattern)));\n };\n\n let elementMap: Record<string, string>;\n async function updateElementMap() {\n elementMap = {};\n await Promise.all(\n elementsDirs.map(async (dirPath: string) => {\n const dirExists = await isDirectory(dirPath);\n if (!dirExists) {\n return;\n }\n const files = await glob('**/*', {cwd: dirPath});\n files.forEach((file) => {\n const parts = path.parse(file);\n if (isJsFile(parts.base)) {\n const fullPath = path.join(dirPath, file);\n const moduleId = fullPath.slice(rootDir.length);\n if (!excludeElement(moduleId)) {\n elementMap[parts.name] = moduleId;\n }\n }\n });\n })\n );\n }\n\n async function getElementImport(tagname: string): Promise<string | null> {\n if (!elementMap) {\n await updateElementMap();\n }\n if (tagname in elementMap) {\n return elementMap[tagname];\n }\n return null;\n }\n\n function isCustomElement(id: string) {\n if (!isJsFile(id)) {\n return false;\n }\n return elementsDirs.some((elementsDir) => {\n return id.startsWith(elementsDir);\n });\n }\n\n return {\n name: 'vite-plugin-root',\n\n resolveId(id: string) {\n if (id === elementsVirtualId) {\n return resolvedElementsVirtualId;\n }\n return null;\n },\n\n async load(id: string) {\n if (id === resolvedElementsVirtualId) {\n await updateElementMap();\n return `export const elementsMap = ${JSON.stringify(elementMap)}`;\n }\n return null;\n },\n\n async transform(src: string, id: string): Promise<any> {\n if (isCustomElement(id)) {\n const idParts = path.parse(id);\n const deps = new Set<string>();\n const tagnames = [\n ...src.matchAll(JSX_ELEMENTS_REGEX),\n ...src.matchAll(HTML_ELEMENTS_REGEX),\n ];\n for (const match of tagnames) {\n const tagname = match[1];\n // All custom elements should contain a dash.\n if (!tagname.includes('-')) {\n continue;\n }\n // Avoid circular deps.\n if (tagname === idParts.name) {\n continue;\n }\n deps.add(tagname);\n }\n const importUrls: string[] = [];\n await Promise.all(\n Array.from(deps).map(async (tagname) => {\n const importUrl = await getElementImport(tagname);\n if (importUrl) {\n importUrls.push(importUrl);\n }\n })\n );\n if (importUrls.length > 0) {\n const importLines = importUrls\n .map((url) => `import '${url}';`)\n .join('\\n');\n const code = `${src}\n\n// autogenerated by root:\n${importLines}\n`;\n return {code};\n }\n return null;\n }\n return null;\n },\n };\n}\n","import {promises as fs} from 'node:fs';\nimport path from 'node:path';\nimport fsExtra from 'fs-extra';\n\nexport function isJsFile(filename: string) {\n return !!filename.match(/\\.(j|t)sx?$/);\n}\n\nexport async function writeFile(filepath: string, content: string) {\n const dirPath = path.dirname(filepath);\n await makeDir(dirPath);\n await fs.writeFile(filepath, content);\n}\n\nexport async function makeDir(dirpath: string) {\n try {\n await fs.access(dirpath);\n } catch (e) {\n await fs.mkdir(dirpath, {recursive: true});\n }\n}\n\nexport async function copyDir(srcdir: string, dstdir: string) {\n if (!fsExtra.existsSync(srcdir)) {\n return;\n }\n fsExtra.copySync(srcdir, dstdir, {recursive: true, overwrite: true});\n}\n\nexport async function rmDir(dirpath: string) {\n await fs.rm(dirpath, {recursive: true, force: true});\n}\n\nexport async function loadJson<T = unknown>(filepath: string): Promise<T> {\n const content = await fs.readFile(filepath, 'utf-8');\n return JSON.parse(content);\n}\n\nexport async function isDirectory(dirpath: string) {\n return fs\n .stat(dirpath)\n .then((fsStat) => {\n return fsStat.isDirectory();\n })\n .catch((err) => {\n if (err.code === 'ENOENT') {\n return false;\n }\n throw err;\n });\n}\n\nexport function fileExists(filepath: string): Promise<boolean> {\n return fs\n .access(filepath)\n .then(() => true)\n .catch(() => false);\n}\n","import path from 'node:path';\nimport {ModuleGraph, ModuleNode} from 'vite';\nimport {Asset, AssetMap} from './asset-map';\n\nexport class DevServerAssetMap implements AssetMap {\n private moduleGraph: ModuleGraph;\n\n constructor(moduleGraph: ModuleGraph) {\n this.moduleGraph = moduleGraph;\n }\n\n async get(moduleId: string): Promise<Asset | null> {\n const viteModule = await this.moduleGraph.getModuleByUrl(moduleId);\n if (!viteModule || !viteModule.id) {\n // On dev, in some cases the module doesn't make it into the module graph\n // so return a generic asset.\n return {\n moduleId: moduleId,\n assetUrl: moduleId,\n getCssDeps: async () => [],\n getJsDeps: async () => [moduleId],\n };\n }\n return new DevServerAsset(this, viteModule);\n }\n}\n\nexport class DevServerAsset implements Asset {\n moduleId: string;\n assetUrl: string;\n private assetMap: AssetMap;\n private viteModule: ModuleNode;\n\n constructor(assetMap: AssetMap, viteModule: ModuleNode) {\n this.assetMap = assetMap;\n this.viteModule = viteModule;\n this.moduleId = this.viteModule.id!;\n this.assetUrl = this.viteModule.url;\n }\n\n async getCssDeps(): Promise<string[]> {\n const visited = new Set<string>();\n const deps = new Set<string>();\n this.collectCss(this, deps, visited);\n return Array.from(deps);\n }\n\n async getJsDeps(): Promise<string[]> {\n const visited = new Set<string>();\n const deps = new Set<string>();\n this.collectJs(this, deps, visited);\n return Array.from(deps);\n }\n\n getImportedModules() {\n return this.viteModule.importedModules;\n }\n\n private collectJs(\n asset: DevServerAsset | null,\n urls: Set<string>,\n visited: Set<string>\n ) {\n if (!asset) {\n return;\n }\n if (!asset.moduleId) {\n return;\n }\n if (visited.has(asset.moduleId)) {\n return;\n }\n visited.add(asset.moduleId);\n const parts = path.parse(asset.assetUrl);\n if (\n ['.js', '.jsx', '.ts', '.tsx'].includes(parts.ext) &&\n asset.moduleId.includes('/elements/')\n ) {\n urls.add(asset.assetUrl);\n }\n asset.getImportedModules().forEach((viteModule) => {\n if (viteModule.id) {\n const importedAsset = new DevServerAsset(this.assetMap, viteModule);\n this.collectJs(importedAsset, urls, visited);\n }\n });\n }\n\n private collectCss(\n asset: DevServerAsset | null,\n urls: Set<string>,\n visited: Set<string>\n ) {\n if (!asset) {\n return;\n }\n if (!asset.assetUrl) {\n return;\n }\n if (visited.has(asset.assetUrl)) {\n return;\n }\n visited.add(asset.assetUrl);\n if (asset.moduleId.endsWith('.scss')) {\n const parts = path.parse(asset.assetUrl);\n if (!parts.name.startsWith('_')) {\n urls.add(asset.assetUrl);\n }\n }\n asset.getImportedModules().forEach((viteModule) => {\n if (viteModule.id) {\n const importedAsset = new DevServerAsset(this.assetMap, viteModule);\n this.collectCss(importedAsset, urls, visited);\n }\n });\n }\n}\n","import {bundleRequire} from 'bundle-require';\nimport JoyCon from 'joycon';\nimport {RootConfig} from '../core/config';\n\nexport async function loadRootConfig(rootDir: string): Promise<RootConfig> {\n const joycon = new JoyCon();\n const configPath = await joycon.resolve({\n cwd: rootDir,\n files: ['root.config.ts'],\n });\n if (configPath) {\n const configBundle = await bundleRequire({\n filepath: configPath,\n });\n return configBundle.mod.default || {};\n }\n return {};\n}\n","import {minify} from 'html-minifier-terser';\n\nexport async function htmlMinify(html: string): Promise<string> {\n try {\n const min = await minify(html, {\n collapseWhitespace: true,\n removeComments: true,\n preserveLineBreaks: true,\n });\n return min.trimStart();\n } catch (e) {\n console.error('failed to minify html:', e);\n return html;\n }\n}\n","import path from 'node:path';\nimport {fileURLToPath} from 'node:url';\nimport fsExtra from 'fs-extra';\nimport glob from 'tiny-glob';\nimport {build as viteBuild, Manifest, UserConfig} from 'vite';\nimport {pluginRoot} from '../../render/vite-plugin-root.js';\nimport {BuildAssetMap} from '../../render/asset-map/build-asset-map.js';\nimport {loadRootConfig} from '../load-config.js';\nimport {\n copyDir,\n isDirectory,\n isJsFile,\n loadJson,\n makeDir,\n rmDir,\n writeFile,\n} from '../../core/fsutils.js';\nimport {Renderer} from '../../render/render.js';\nimport {htmlMinify} from '../../render/html-minify.js';\nimport {dim} from 'kleur/colors';\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\n\ninterface BuildOptions {\n ssrOnly?: boolean;\n mode?: string;\n}\n\nexport async function build(rootProjectDir?: string, options?: BuildOptions) {\n const rootDir = path.resolve(rootProjectDir || process.cwd());\n const rootConfig = await loadRootConfig(rootDir);\n const distDir = path.join(rootDir, 'dist');\n const ssrOnly = options?.ssrOnly || false;\n const mode = options?.mode || 'production';\n\n console.log();\n console.log(`${dim('┃')} project: ${rootDir}`);\n console.log(`${dim('┃')} output: ${distDir}/html`);\n console.log(`${dim('┃')} mode: ${mode}`);\n console.log();\n\n await rmDir(distDir);\n await makeDir(distDir);\n\n const pages: string[] = [];\n if (await isDirectory(path.join(rootDir, 'routes'))) {\n const pageFiles = await glob(path.join(rootDir, 'routes/**/*'));\n pageFiles.forEach((file) => {\n const parts = path.parse(file);\n if (!parts.name.startsWith('_') && isJsFile(parts.base)) {\n pages.push(file);\n }\n });\n }\n\n const elementsDirs = [path.join(rootDir, 'elements')];\n const elementsInclude = rootConfig.elements?.include || [];\n const excludePatterns = rootConfig.elements?.exclude || [];\n const excludeElement = (moduleId: string) => {\n return excludePatterns.some((pattern) => Boolean(moduleId.match(pattern)));\n };\n\n for (const dirPath of elementsInclude) {\n const elementsDir = path.resolve(rootDir, dirPath);\n if (!elementsDir.startsWith(rootDir)) {\n throw new Error(\n `the elements dir (${dirPath}) should be relative to the project's root dir (${rootDir})`\n );\n }\n elementsDirs.push(elementsDir);\n }\n const elements: string[] = [];\n const elementMap: Record<string, string> = {};\n for (const dirPath of elementsDirs) {\n if (await isDirectory(dirPath)) {\n const elementFiles = await glob('**/*', {cwd: dirPath});\n elementFiles.forEach((file) => {\n const parts = path.parse(file);\n if (isJsFile(parts.base)) {\n const fullPath = path.join(dirPath, file);\n const moduleId = fullPath.slice(rootDir.length);\n if (!excludeElement(moduleId)) {\n elements.push(fullPath);\n elementMap[parts.name] = moduleId;\n }\n }\n });\n }\n }\n\n const bundleScripts: string[] = [];\n if (await isDirectory(path.join(rootDir, 'bundles'))) {\n const bundleFiles = await glob(path.join(rootDir, 'bundles/*'));\n bundleFiles.forEach((file) => {\n const parts = path.parse(file);\n if (isJsFile(parts.base)) {\n bundleScripts.push(file);\n }\n });\n }\n\n const viteConfig = rootConfig.vite || {};\n const baseConfig: UserConfig = {\n ...viteConfig,\n root: rootDir,\n mode: mode,\n esbuild: {\n jsx: 'automatic',\n jsxImportSource: 'preact',\n treeShaking: true,\n },\n plugins: [...(viteConfig.plugins || []), pluginRoot({rootDir, rootConfig})],\n };\n\n // Bundle the render.js file with vite, which is pre-optimized for rendering\n // HTML routes.\n await viteBuild({\n ...baseConfig,\n publicDir: false,\n build: {\n rollupOptions: {\n input: [path.resolve(__dirname, './render.js')],\n output: {\n format: 'esm',\n chunkFileNames: 'chunks/[name].[hash].js',\n assetFileNames: 'assets/[name].[hash][extname]',\n },\n },\n outDir: path.join(distDir, 'server'),\n ssr: true,\n ssrManifest: false,\n cssCodeSplit: true,\n target: 'esnext',\n minify: false,\n polyfillModulePreload: false,\n reportCompressedSize: false,\n },\n ssr: {\n noExternal: ['@blinkk/root'],\n },\n });\n\n // Pre-render any client scripts and CSS deps.\n await viteBuild({\n ...baseConfig,\n publicDir: false,\n build: {\n rollupOptions: {\n input: [...pages, ...elements, ...bundleScripts],\n output: {\n format: 'esm',\n chunkFileNames: 'chunks/[name].[hash].js',\n assetFileNames: 'assets/[name].[hash][extname]',\n },\n },\n outDir: path.join(distDir, 'client'),\n ssr: false,\n ssrManifest: false,\n manifest: true,\n cssCodeSplit: true,\n target: 'esnext',\n minify: true,\n polyfillModulePreload: false,\n reportCompressedSize: false,\n },\n });\n\n const viteManifest = await loadJson<Manifest>(\n path.join(distDir, 'client/manifest.json')\n );\n\n // Use the output of the client build to generate an asset map, which is used\n // by the renderer for automatically injecting dependencies for a page.\n const assetMap = BuildAssetMap.fromViteManifest(viteManifest, elementMap);\n\n // Save the asset map to `dist/client` for use by the prod SSR server.\n writeFile(\n path.join(distDir, 'client/root-manifest.json'),\n JSON.stringify(assetMap.toJson(), null, 2)\n );\n\n // Write SSG output to `dist/html`.\n const buildDir = path.join(distDir, 'html');\n\n // Recursively copy files from `public` to `dist/html`.\n const publicDir = path.join(rootDir, 'public');\n if (fsExtra.existsSync(path.join(rootDir, 'public'))) {\n fsExtra.copySync(publicDir, buildDir);\n } else {\n makeDir(buildDir);\n }\n\n // Copy files from `dist/client/{assets,chunks}` to `dist/html`.\n copyDir(path.join(distDir, 'client/assets'), path.join(buildDir, 'assets'));\n copyDir(path.join(distDir, 'client/chunks'), path.join(buildDir, 'chunks'));\n\n // Pre-render HTML pages (SSG).\n if (!ssrOnly) {\n const render = await import(path.join(distDir, 'server/render.js'));\n const renderer = new render.Renderer(rootConfig) as Renderer;\n const sitemap = await renderer.getSitemap();\n\n await Promise.all(\n Object.keys(sitemap).map(async (urlPath) => {\n const {route, params} = sitemap[urlPath];\n const data = await renderer.renderRoute(route, {\n assetMap,\n routeParams: params,\n });\n\n // The renderer currently assumes that all paths serve HTML.\n // TODO(stevenle): support non-HTML routes using `routes/[name].[ext].ts`.\n let outPath = path.join(distDir, `html${urlPath}`, 'index.html');\n\n if (outPath.endsWith('404/index.html')) {\n outPath = outPath.replace('404/index.html', '404.html');\n }\n\n const html = await htmlMinify(data.html || '');\n await writeFile(outPath, html);\n\n const relPath = outPath.slice(path.dirname(distDir).length + 1);\n console.log(`saved ${relPath}`);\n })\n );\n }\n}\n","import {Manifest} from 'vite';\nimport {Asset, AssetMap} from './asset-map';\n\nexport type BuildAssetManifest = Record<\n string,\n {\n moduleId: string;\n assetUrl: string;\n importedModules: string[];\n importedCss: string[];\n isElement: boolean;\n }\n>;\n\nexport class BuildAssetMap implements AssetMap {\n private moduleIdToAsset: Map<string, BuildAsset>;\n\n constructor() {\n this.moduleIdToAsset = new Map();\n }\n\n async get(moduleId: string): Promise<Asset | null> {\n return this.moduleIdToAsset.get(moduleId) || null;\n }\n\n private add(asset: BuildAsset) {\n this.moduleIdToAsset.set(asset.moduleId, asset);\n }\n\n toJson(): BuildAssetManifest {\n const result: BuildAssetManifest = {};\n for (const moduleId of this.moduleIdToAsset.keys()) {\n result[moduleId] = this.moduleIdToAsset.get(moduleId)!.toJson();\n }\n return result;\n }\n\n static fromViteManifest(\n viteManifest: Manifest,\n elementMap: Record<string, string>\n ) {\n const assetMap = new BuildAssetMap();\n\n const elementModuleIds = new Set();\n Object.values(elementMap).forEach((moduleId) =>\n elementModuleIds.add(moduleId)\n );\n\n Object.keys(viteManifest).forEach((manifestKey) => {\n const moduleId = `/${manifestKey}`;\n const manifestChunk = viteManifest[manifestKey];\n const isElement = elementModuleIds.has(moduleId);\n const assetData = {\n moduleId,\n assetUrl: `/${manifestChunk.file}`,\n importedModules: (manifestChunk.imports || []).map(\n (relPath) => `/${relPath}`\n ),\n importedCss: (manifestChunk.css || []).map((relPath) => `/${relPath}`),\n isElement: isElement,\n };\n assetMap.add(new BuildAsset(assetMap, assetData));\n });\n return assetMap;\n }\n\n static fromRootManifest(rootManifest: BuildAssetManifest) {\n const assetMap = new BuildAssetMap();\n Object.keys(rootManifest).forEach((moduleId) => {\n const assetData = rootManifest[moduleId];\n assetMap.add(new BuildAsset(assetMap, assetData));\n });\n return assetMap;\n }\n}\n\nexport class BuildAsset {\n moduleId: string;\n assetUrl: string;\n private assetMap: BuildAssetMap;\n private importedModules: string[];\n private importedCss: string[];\n isElement: boolean;\n\n constructor(\n assetMap: BuildAssetMap,\n assetData: {\n moduleId: string;\n assetUrl: string;\n importedModules: string[];\n importedCss: string[];\n isElement: boolean;\n }\n ) {\n this.assetMap = assetMap;\n this.moduleId = assetData.moduleId;\n this.assetUrl = assetData.assetUrl;\n this.importedModules = assetData.importedModules;\n this.importedCss = assetData.importedCss;\n this.isElement = assetData.isElement;\n }\n\n async getCssDeps(): Promise<string[]> {\n const visited = new Set<string>();\n const deps = new Set<string>();\n await this.collectCss(this, deps, visited);\n return Array.from(deps);\n }\n\n async getJsDeps(): Promise<string[]> {\n const visited = new Set<string>();\n const deps = new Set<string>();\n await this.collectJs(this, deps, visited);\n return Array.from(deps);\n }\n\n private async collectJs(\n asset: BuildAsset | null,\n urls: Set<string>,\n visited: Set<string>\n ) {\n if (!asset) {\n return;\n }\n if (!asset.moduleId) {\n return;\n }\n if (visited.has(asset.moduleId)) {\n return;\n }\n visited.add(asset.moduleId);\n if (asset.isElement) {\n urls.add(asset.assetUrl);\n }\n await Promise.all(\n asset.importedModules.map(async (moduleId) => {\n const importedAsset = (await this.assetMap.get(moduleId)) as BuildAsset;\n this.collectJs(importedAsset, urls, visited);\n })\n );\n }\n\n private async collectCss(\n asset: BuildAsset | null,\n urls: Set<string>,\n visited: Set<string>\n ) {\n if (!asset) {\n return;\n }\n if (!asset.assetUrl) {\n return;\n }\n if (visited.has(asset.moduleId)) {\n return;\n }\n visited.add(asset.moduleId);\n if (asset.importedCss) {\n asset.importedCss.forEach((cssUrl) => urls.add(cssUrl));\n }\n await Promise.all(\n asset.importedModules.map(async (moduleId) => {\n const importedAsset = (await this.assetMap.get(moduleId)) as BuildAsset;\n this.collectCss(importedAsset, urls, visited);\n })\n );\n }\n\n toJson() {\n return {\n moduleId: this.moduleId,\n assetUrl: this.assetUrl,\n importedModules: this.importedModules,\n importedCss: this.importedCss,\n isElement: this.isElement,\n };\n }\n}\n","import path from 'node:path';\nimport {default as express, Request, Response, NextFunction} from 'express';\nimport {loadRootConfig} from '../load-config';\nimport {Renderer} from '../../render/render.js';\nimport {fileExists, loadJson} from '../../core/fsutils';\nimport {\n BuildAssetManifest,\n BuildAssetMap,\n} from '../../render/asset-map/build-asset-map';\nimport {htmlMinify} from '../../render/html-minify';\nimport {dim} from 'kleur/colors';\n\nexport async function preview(rootProjectDir?: string) {\n // TODO(stevenle): figure out standard practice for NODE_ENV.\n process.env.NODE_ENV = 'development';\n const rootDir = path.resolve(rootProjectDir || process.cwd());\n const rootConfig = await loadRootConfig(rootDir);\n const distDir = path.join(rootDir, 'dist');\n\n const render = await import(path.join(distDir, 'server/render.js'));\n const renderer = new render.Renderer(rootConfig) as Renderer;\n\n const manifestPath = path.join(distDir, 'client/root-manifest.json');\n if (!(await fileExists(manifestPath))) {\n throw new Error(\n `could not find ${manifestPath}. run \\`root build\\` before \\`root preview\\`.`\n );\n }\n const rootManifest = await loadJson<BuildAssetManifest>(manifestPath);\n const assetMap = BuildAssetMap.fromRootManifest(rootManifest);\n\n const app = express();\n app.disable('x-powered-by');\n\n const userMiddlewares = rootConfig.server?.middlewares || [];\n userMiddlewares.forEach((middleware) => {\n app.use(middleware);\n });\n\n const publicDir = path.join(distDir, 'html');\n app.use(express.static(publicDir));\n // TODO(stevenle): add middleware that checks for pre-built HTML in dist/.\n\n app.use(async (req: Request, res: Response, next: NextFunction) => {\n try {\n const url = req.originalUrl;\n const data = await renderer.render(url, {\n assetMap: assetMap,\n });\n if (data.notFound || !data.html) {\n next();\n return;\n }\n let html = data.html || '';\n if (rootConfig.minifyHtml !== false) {\n html = await htmlMinify(html);\n }\n res.status(200).set({'Content-Type': 'text/html'}).end(html);\n } catch (e) {\n try {\n const {html} = await renderer.renderError(e);\n res.status(500).set({'Content-Type': 'text/html'}).end(html);\n } catch (e2) {\n console.error('failed to render custom error');\n console.error(e2);\n next(e);\n }\n }\n });\n\n // TODO(stevenle): add 404 handler.\n\n const port = parseInt(process.env.PORT || '4007');\n console.log();\n console.log(`${dim('┃')} project: ${rootDir}`);\n console.log(`${dim('┃')} server: http://localhost:${port}`);\n console.log();\n app.listen(port);\n}\n","import path from 'node:path';\nimport {default as express, Request, Response, NextFunction} from 'express';\nimport {loadRootConfig} from '../load-config';\nimport {Renderer} from '../../render/render.js';\nimport {fileExists, loadJson} from '../../core/fsutils';\nimport {\n BuildAssetManifest,\n BuildAssetMap,\n} from '../../render/asset-map/build-asset-map';\nimport {htmlMinify} from '../../render/html-minify';\nimport {dim} from 'kleur/colors';\n\nexport async function start(rootProjectDir?: string) {\n process.env.NODE_ENV = 'production';\n const rootDir = path.resolve(rootProjectDir || process.cwd());\n const rootConfig = await loadRootConfig(rootDir);\n const distDir = path.join(rootDir, 'dist');\n\n const render = await import(path.join(distDir, 'server/render.js'));\n const renderer = new render.Renderer(rootConfig) as Renderer;\n\n const manifestPath = path.join(distDir, 'client/root-manifest.json');\n if (!(await fileExists(manifestPath))) {\n throw new Error(\n `could not find ${manifestPath}. run \\`root build\\` before \\`root start\\`.`\n );\n }\n const rootManifest = await loadJson<BuildAssetManifest>(manifestPath);\n const assetMap = BuildAssetMap.fromRootManifest(rootManifest);\n\n const app = express();\n app.disable('x-powered-by');\n\n const userMiddlewares = rootConfig.server?.middlewares || [];\n userMiddlewares.forEach((middleware) => {\n app.use(middleware);\n });\n\n const publicDir = path.join(distDir, 'html');\n app.use(express.static(publicDir));\n // TODO(stevenle): add middleware that checks for pre-built HTML in dist/.\n\n app.use(async (req: Request, res: Response, next: NextFunction) => {\n try {\n const url = req.originalUrl;\n const data = await renderer.render(url, {\n assetMap: assetMap,\n });\n if (data.notFound || !data.html) {\n next();\n return;\n }\n let html = data.html || '';\n if (rootConfig.minifyHtml !== false) {\n html = await htmlMinify(html);\n }\n res.status(200).set({'Content-Type': 'text/html'}).end(html);\n } catch (e) {\n try {\n const {html} = await renderer.renderError(e);\n res.status(500).set({'Content-Type': 'text/html'}).end(html);\n } catch (e2) {\n console.error('failed to render custom error');\n console.error(e2);\n next(e);\n }\n }\n });\n\n // TODO(stevenle): add 404 handler.\n\n const port = parseInt(process.env.PORT || '4007');\n console.log();\n console.log(`${dim('┃')} project: ${rootDir}`);\n console.log(`${dim('┃')} server: http://localhost:${port}`);\n console.log();\n app.listen(port);\n}\n"],"mappings":";AAAA,OAAOA,WAAU;AACjB,SAAQ,qBAAoB;AAC5B,SAAQ,WAAW,eAA+C;AAClE,SAAQ,gBAAgB,wBAAuB;;;ACH/C,OAAOC,WAAU;AACjB,OAAO,UAAU;;;ACDjB,SAAQ,YAAY,UAAS;AAC7B,OAAO,UAAU;AACjB,OAAO,aAAa;AAEb,SAAS,SAAS,UAAkB;AACzC,SAAO,CAAC,CAAC,SAAS,MAAM,aAAa;AACvC;AAEA,eAAsB,UAAU,UAAkB,SAAiB;AACjE,QAAM,UAAU,KAAK,QAAQ,QAAQ;AACrC,QAAM,QAAQ,OAAO;AACrB,QAAM,GAAG,UAAU,UAAU,OAAO;AACtC;AAEA,eAAsB,QAAQ,SAAiB;AAC7C,MAAI;AACF,UAAM,GAAG,OAAO,OAAO;AAAA,EACzB,SAAS,GAAP;AACA,UAAM,GAAG,MAAM,SAAS,EAAC,WAAW,KAAI,CAAC;AAAA,EAC3C;AACF;AAEA,eAAsB,QAAQ,QAAgB,QAAgB;AAC5D,MAAI,CAAC,QAAQ,WAAW,MAAM,GAAG;AAC/B;AAAA,EACF;AACA,UAAQ,SAAS,QAAQ,QAAQ,EAAC,WAAW,MAAM,WAAW,KAAI,CAAC;AACrE;AAEA,eAAsB,MAAM,SAAiB;AAC3C,QAAM,GAAG,GAAG,SAAS,EAAC,WAAW,MAAM,OAAO,KAAI,CAAC;AACrD;AAEA,eAAsB,SAAsB,UAA8B;AACxE,QAAM,UAAU,MAAM,GAAG,SAAS,UAAU,OAAO;AACnD,SAAO,KAAK,MAAM,OAAO;AAC3B;AAEA,eAAsB,YAAY,SAAiB;AACjD,SAAO,GACJ,KAAK,OAAO,EACZ,KAAK,CAAC,WAAW;AAChB,WAAO,OAAO,YAAY;AAAA,EAC5B,CAAC,EACA,MAAM,CAAC,QAAQ;AACd,QAAI,IAAI,SAAS,UAAU;AACzB,aAAO;AAAA,IACT;AACA,UAAM;AAAA,EACR,CAAC;AACL;AAEO,SAAS,WAAW,UAAoC;AAC7D,SAAO,GACJ,OAAO,QAAQ,EACf,KAAK,MAAM,IAAI,EACf,MAAM,MAAM,KAAK;AACtB;;;ADpDA,IAAM,qBAAqB;AAC3B,IAAM,sBAAsB;AAOrB,SAAS,WAAW,SAA6B;AAbxD;AAcE,QAAM,oBAAoB;AAC1B,QAAM,4BAA4B,OAAO;AAEzC,QAAM,WAAU,mCAAS,YAAW,QAAQ,IAAI;AAChD,QAAM,cAAa,mCAAS,eAAc,CAAC;AAC3C,QAAM,eAAe,CAACC,MAAK,KAAK,SAAS,UAAU,CAAC;AACpD,QAAM,gBAAc,gBAAW,aAAX,mBAAqB,YAAW,CAAC;AACrD,cAAY,QAAQ,CAAC,YAAY;AAC/B,UAAM,cAAcA,MAAK,QAAQ,SAAS,OAAO;AACjD,QAAI,CAAC,YAAY,WAAW,OAAO,GAAG;AACpC,YAAM,IAAI;AAAA,QACR,qBAAqB,0DAA0D;AAAA,MACjF;AAAA,IACF;AACA,iBAAa,KAAK,WAAW;AAAA,EAC/B,CAAC;AAED,QAAM,oBAAkB,gBAAW,aAAX,mBAAqB,YAAW,CAAC;AACzD,QAAM,iBAAiB,CAAC,aAAqB;AAC3C,WAAO,gBAAgB,KAAK,CAAC,YAAY,QAAQ,SAAS,MAAM,OAAO,CAAC,CAAC;AAAA,EAC3E;AAEA,MAAI;AACJ,iBAAe,mBAAmB;AAChC,iBAAa,CAAC;AACd,UAAM,QAAQ;AAAA,MACZ,aAAa,IAAI,OAAO,YAAoB;AAC1C,cAAM,YAAY,MAAM,YAAY,OAAO;AAC3C,YAAI,CAAC,WAAW;AACd;AAAA,QACF;AACA,cAAM,QAAQ,MAAM,KAAK,QAAQ,EAAC,KAAK,QAAO,CAAC;AAC/C,cAAM,QAAQ,CAAC,SAAS;AACtB,gBAAM,QAAQA,MAAK,MAAM,IAAI;AAC7B,cAAI,SAAS,MAAM,IAAI,GAAG;AACxB,kBAAM,WAAWA,MAAK,KAAK,SAAS,IAAI;AACxC,kBAAM,WAAW,SAAS,MAAM,QAAQ,MAAM;AAC9C,gBAAI,CAAC,eAAe,QAAQ,GAAG;AAC7B,yBAAW,MAAM,QAAQ;AAAA,YAC3B;AAAA,UACF;AAAA,QACF,CAAC;AAAA,MACH,CAAC;AAAA,IACH;AAAA,EACF;AAEA,iBAAe,iBAAiB,SAAyC;AACvE,QAAI,CAAC,YAAY;AACf,YAAM,iBAAiB;AAAA,IACzB;AACA,QAAI,WAAW,YAAY;AACzB,aAAO,WAAW;AAAA,IACpB;AACA,WAAO;AAAA,EACT;AAEA,WAAS,gBAAgB,IAAY;AACnC,QAAI,CAAC,SAAS,EAAE,GAAG;AACjB,aAAO;AAAA,IACT;AACA,WAAO,aAAa,KAAK,CAAC,gBAAgB;AACxC,aAAO,GAAG,WAAW,WAAW;AAAA,IAClC,CAAC;AAAA,EACH;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IAEN,UAAU,IAAY;AACpB,UAAI,OAAO,mBAAmB;AAC5B,eAAO;AAAA,MACT;AACA,aAAO;AAAA,IACT;AAAA,IAEA,MAAM,KAAK,IAAY;AACrB,UAAI,OAAO,2BAA2B;AACpC,cAAM,iBAAiB;AACvB,eAAO,8BAA8B,KAAK,UAAU,UAAU;AAAA,MAChE;AACA,aAAO;AAAA,IACT;AAAA,IAEA,MAAM,UAAU,KAAa,IAA0B;AACrD,UAAI,gBAAgB,EAAE,GAAG;AACvB,cAAM,UAAUA,MAAK,MAAM,EAAE;AAC7B,cAAM,OAAO,oBAAI,IAAY;AAC7B,cAAM,WAAW;AAAA,UACf,GAAG,IAAI,SAAS,kBAAkB;AAAA,UAClC,GAAG,IAAI,SAAS,mBAAmB;AAAA,QACrC;AACA,mBAAW,SAAS,UAAU;AAC5B,gBAAM,UAAU,MAAM;AAEtB,cAAI,CAAC,QAAQ,SAAS,GAAG,GAAG;AAC1B;AAAA,UACF;AAEA,cAAI,YAAY,QAAQ,MAAM;AAC5B;AAAA,UACF;AACA,eAAK,IAAI,OAAO;AAAA,QAClB;AACA,cAAM,aAAuB,CAAC;AAC9B,cAAM,QAAQ;AAAA,UACZ,MAAM,KAAK,IAAI,EAAE,IAAI,OAAO,YAAY;AACtC,kBAAM,YAAY,MAAM,iBAAiB,OAAO;AAChD,gBAAI,WAAW;AACb,yBAAW,KAAK,SAAS;AAAA,YAC3B;AAAA,UACF,CAAC;AAAA,QACH;AACA,YAAI,WAAW,SAAS,GAAG;AACzB,gBAAM,cAAc,WACjB,IAAI,CAAC,QAAQ,WAAW,OAAO,EAC/B,KAAK,IAAI;AACZ,gBAAM,OAAO,GAAG;AAAA;AAAA;AAAA,EAGxB;AAAA;AAEQ,iBAAO,EAAC,KAAI;AAAA,QACd;AACA,eAAO;AAAA,MACT;AACA,aAAO;AAAA,IACT;AAAA,EACF;AACF;;;AE9IA,OAAOC,WAAU;AAIV,IAAM,oBAAN,MAA4C;AAAA,EAGjD,YAAY,aAA0B;AACpC,SAAK,cAAc;AAAA,EACrB;AAAA,EAEA,MAAM,IAAI,UAAyC;AACjD,UAAM,aAAa,MAAM,KAAK,YAAY,eAAe,QAAQ;AACjE,QAAI,CAAC,cAAc,CAAC,WAAW,IAAI;AAGjC,aAAO;AAAA,QACL;AAAA,QACA,UAAU;AAAA,QACV,YAAY,YAAY,CAAC;AAAA,QACzB,WAAW,YAAY,CAAC,QAAQ;AAAA,MAClC;AAAA,IACF;AACA,WAAO,IAAI,eAAe,MAAM,UAAU;AAAA,EAC5C;AACF;AAEO,IAAM,iBAAN,MAAsC;AAAA,EAM3C,YAAY,UAAoB,YAAwB;AACtD,SAAK,WAAW;AAChB,SAAK,aAAa;AAClB,SAAK,WAAW,KAAK,WAAW;AAChC,SAAK,WAAW,KAAK,WAAW;AAAA,EAClC;AAAA,EAEA,MAAM,aAAgC;AACpC,UAAM,UAAU,oBAAI,IAAY;AAChC,UAAM,OAAO,oBAAI,IAAY;AAC7B,SAAK,WAAW,MAAM,MAAM,OAAO;AACnC,WAAO,MAAM,KAAK,IAAI;AAAA,EACxB;AAAA,EAEA,MAAM,YAA+B;AACnC,UAAM,UAAU,oBAAI,IAAY;AAChC,UAAM,OAAO,oBAAI,IAAY;AAC7B,SAAK,UAAU,MAAM,MAAM,OAAO;AAClC,WAAO,MAAM,KAAK,IAAI;AAAA,EACxB;AAAA,EAEA,qBAAqB;AACnB,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA,EAEQ,UACN,OACA,MACA,SACA;AACA,QAAI,CAAC,OAAO;AACV;AAAA,IACF;AACA,QAAI,CAAC,MAAM,UAAU;AACnB;AAAA,IACF;AACA,QAAI,QAAQ,IAAI,MAAM,QAAQ,GAAG;AAC/B;AAAA,IACF;AACA,YAAQ,IAAI,MAAM,QAAQ;AAC1B,UAAM,QAAQA,MAAK,MAAM,MAAM,QAAQ;AACvC,QACE,CAAC,OAAO,QAAQ,OAAO,MAAM,EAAE,SAAS,MAAM,GAAG,KACjD,MAAM,SAAS,SAAS,YAAY,GACpC;AACA,WAAK,IAAI,MAAM,QAAQ;AAAA,IACzB;AACA,UAAM,mBAAmB,EAAE,QAAQ,CAAC,eAAe;AACjD,UAAI,WAAW,IAAI;AACjB,cAAM,gBAAgB,IAAI,eAAe,KAAK,UAAU,UAAU;AAClE,aAAK,UAAU,eAAe,MAAM,OAAO;AAAA,MAC7C;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEQ,WACN,OACA,MACA,SACA;AACA,QAAI,CAAC,OAAO;AACV;AAAA,IACF;AACA,QAAI,CAAC,MAAM,UAAU;AACnB;AAAA,IACF;AACA,QAAI,QAAQ,IAAI,MAAM,QAAQ,GAAG;AAC/B;AAAA,IACF;AACA,YAAQ,IAAI,MAAM,QAAQ;AAC1B,QAAI,MAAM,SAAS,SAAS,OAAO,GAAG;AACpC,YAAM,QAAQA,MAAK,MAAM,MAAM,QAAQ;AACvC,UAAI,CAAC,MAAM,KAAK,WAAW,GAAG,GAAG;AAC/B,aAAK,IAAI,MAAM,QAAQ;AAAA,MACzB;AAAA,IACF;AACA,UAAM,mBAAmB,EAAE,QAAQ,CAAC,eAAe;AACjD,UAAI,WAAW,IAAI;AACjB,cAAM,gBAAgB,IAAI,eAAe,KAAK,UAAU,UAAU;AAClE,aAAK,WAAW,eAAe,MAAM,OAAO;AAAA,MAC9C;AAAA,IACF,CAAC;AAAA,EACH;AACF;;;ACpHA,SAAQ,qBAAoB;AAC5B,OAAO,YAAY;AAGnB,eAAsB,eAAe,SAAsC;AACzE,QAAM,SAAS,IAAI,OAAO;AAC1B,QAAM,aAAa,MAAM,OAAO,QAAQ;AAAA,IACtC,KAAK;AAAA,IACL,OAAO,CAAC,gBAAgB;AAAA,EAC1B,CAAC;AACD,MAAI,YAAY;AACd,UAAM,eAAe,MAAM,cAAc;AAAA,MACvC,UAAU;AAAA,IACZ,CAAC;AACD,WAAO,aAAa,IAAI,WAAW,CAAC;AAAA,EACtC;AACA,SAAO,CAAC;AACV;;;ACjBA,SAAQ,cAAa;AAErB,eAAsB,WAAW,MAA+B;AAC9D,MAAI;AACF,UAAM,MAAM,MAAM,OAAO,MAAM;AAAA,MAC7B,oBAAoB;AAAA,MACpB,gBAAgB;AAAA,MAChB,oBAAoB;AAAA,IACtB,CAAC;AACD,WAAO,IAAI,UAAU;AAAA,EACvB,SAAS,GAAP;AACA,YAAQ,MAAM,0BAA0B,CAAC;AACzC,WAAO;AAAA,EACT;AACF;;;ALJA,OAAOC,WAAU;AACjB,SAAQ,WAAU;AAElB,IAAM,YAAYC,MAAK,QAAQ,cAAc,YAAY,GAAG,CAAC;AAE7D,eAAsB,aAAa,SAA8B;AAC/D,QAAM,WAAU,mCAAS,YAAW,QAAQ,IAAI;AAEhD,QAAM,MAAM,QAAQ;AACpB,MAAI,QAAQ,cAAc;AAC1B,MAAI,IAAI,QAAQ,OAAO,QAAQ,CAAC;AAChC,QAAM,cAAc,MAAM,eAAe,EAAC,QAAO,CAAC;AAClD,cAAY,QAAQ,CAAC,eAAe,IAAI,IAAI,UAAU,CAAC;AAEvD,QAAM,OAAO,SAAS,QAAQ,IAAI,QAAQ,MAAM;AAChD,UAAQ,IAAI;AACZ,UAAQ,IAAI,GAAG,IAAI,QAAG,eAAe,SAAS;AAC9C,UAAQ,IAAI,GAAG,IAAI,QAAG,gCAAgC,MAAM;AAC5D,UAAQ,IAAI;AACZ,MAAI,OAAO,IAAI;AACjB;AAEA,eAAsB,eAAe,SAA8B;AAhCnE;AAiCE,QAAM,UAAUA,MAAK,SAAQ,mCAAS,YAAW,QAAQ,IAAI,CAAC;AAC9D,QAAM,aAAa,MAAM,eAAe,OAAO;AAC/C,QAAM,aAAa,WAAW,QAAQ,CAAC;AACvC,QAAM,mBAAmBA,MAAK,QAAQ,WAAW,aAAa;AAE9D,QAAM,QAAkB,CAAC;AACzB,MAAI,MAAM,YAAYA,MAAK,KAAK,SAAS,QAAQ,CAAC,GAAG;AACnD,UAAM,YAAY,MAAMD,MAAK,eAAe,EAAC,KAAK,QAAO,CAAC;AAC1D,cAAU,QAAQ,CAAC,SAAS;AAC1B,YAAM,QAAQC,MAAK,MAAM,IAAI;AAC7B,UAAI,CAAC,MAAM,KAAK,WAAW,GAAG,KAAK,SAAS,MAAM,IAAI,GAAG;AACvD,cAAM,KAAK,IAAI;AAAA,MACjB;AAAA,IACF,CAAC;AAAA,EACH;AAEA,QAAM,eAAe,CAACA,MAAK,KAAK,SAAS,UAAU,CAAC;AACpD,QAAM,oBAAkB,gBAAW,aAAX,mBAAqB,YAAW,CAAC;AACzD,QAAM,oBAAkB,gBAAW,aAAX,mBAAqB,YAAW,CAAC;AACzD,QAAM,iBAAiB,CAAC,aAAqB;AAC3C,WAAO,gBAAgB,KAAK,CAAC,YAAY,QAAQ,SAAS,MAAM,OAAO,CAAC,CAAC;AAAA,EAC3E;AAEA,aAAW,WAAW,iBAAiB;AACrC,UAAM,cAAcA,MAAK,QAAQ,SAAS,OAAO;AACjD,QAAI,CAAC,YAAY,WAAW,OAAO,GAAG;AACpC,YAAM,IAAI;AAAA,QACR,qBAAqB,0DAA0D;AAAA,MACjF;AAAA,IACF;AACA,iBAAa,KAAK,WAAW;AAAA,EAC/B;AACA,QAAM,WAAqB,CAAC;AAC5B,aAAW,WAAW,cAAc;AAClC,QAAI,MAAM,YAAY,OAAO,GAAG;AAC9B,YAAM,eAAe,MAAMD,MAAK,QAAQ,EAAC,KAAK,QAAO,CAAC;AACtD,mBAAa,QAAQ,CAAC,SAAS;AAC7B,cAAM,QAAQC,MAAK,MAAM,IAAI;AAC7B,YAAI,SAAS,MAAM,IAAI,GAAG;AACxB,gBAAM,WAAWA,MAAK,KAAK,SAAS,IAAI;AACxC,gBAAM,WAAW,SAAS,MAAM,QAAQ,MAAM;AAC9C,cAAI,CAAC,eAAe,QAAQ,GAAG;AAC7B,qBAAS,KAAK,SAAS,MAAM,CAAC,CAAC;AAAA,UACjC;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAEA,QAAM,gBAA0B,CAAC;AACjC,MAAI,MAAM,YAAYA,MAAK,KAAK,SAAS,SAAS,CAAC,GAAG;AACpD,UAAM,cAAc,MAAMD,MAAKC,MAAK,KAAK,SAAS,WAAW,CAAC;AAC9D,gBAAY,QAAQ,CAAC,SAAS;AAC5B,YAAM,QAAQA,MAAK,MAAM,IAAI;AAC7B,UAAI,SAAS,MAAM,IAAI,GAAG;AACxB,sBAAc,KAAK,IAAI;AAAA,MACzB;AAAA,IACF,CAAC;AAAA,EACH;AAEA,QAAM,aAAa,MAAM,iBAAiB;AAAA,IACxC,GAAG;AAAA,IACH,MAAM;AAAA,IACN,MAAM;AAAA,IACN,QAAQ,EAAC,gBAAgB,KAAI;AAAA,IAC7B,SAAS;AAAA,IACT,cAAc;AAAA,MACZ,SAAS,CAAC,GAAG,OAAO,GAAG,UAAU,GAAG,aAAa;AAAA,IACnD;AAAA,IACA,KAAK;AAAA,MACH,YAAY,CAAC,cAAc;AAAA,IAC7B;AAAA,IACA,SAAS;AAAA,MACP,KAAK;AAAA,MACL,iBAAiB;AAAA,IACnB;AAAA,IACA,SAAS,CAAC,GAAI,WAAW,WAAW,CAAC,GAAI,WAAW,EAAC,SAAS,WAAU,CAAC,CAAC;AAAA,EAC5E,CAAC;AAED,QAAM,iBAAiB,OACrB,KACA,KACA,SACG;AACH,UAAM,MAAM,IAAI;AAChB,QAAI,WAA4B;AAChC,QAAI;AACF,YAAM,SAAS,MAAM,WAAW,cAAc,gBAAgB;AAC9D,iBAAW,IAAI,OAAO,SAAS,UAAU;AAEzC,YAAM,WAAW,IAAI,kBAAkB,WAAW,WAAW;AAC7D,YAAM,OAAO,MAAM,SAAS,OAAO,KAAK;AAAA,QACtC;AAAA,MACF,CAAC;AACD,UAAI,KAAK,YAAY,CAAC,KAAK,MAAM;AAC/B,aAAK;AACL;AAAA,MACF;AAEA,UAAI,OAAO,MAAM,WAAW,mBAAmB,KAAK,KAAK,QAAQ,EAAE;AACnE,UAAI,WAAW,eAAe,OAAO;AACnC,eAAO,MAAM,WAAW,IAAI;AAAA,MAC9B;AACA,UAAI,OAAO,GAAG,EAAE,IAAI,EAAC,gBAAgB,YAAW,CAAC,EAAE,IAAI,IAAI;AAAA,IAC7D,SAAS,GAAP;AAGA,iBAAW,iBAAiB,CAAC;AAC7B,cAAQ,MAAM,CAAC;AACf,UAAI;AACF,YAAI,UAAU;AACZ,gBAAM,EAAC,KAAI,IAAI,MAAM,SAAS,YAAY,CAAC;AAC3C,cAAI,OAAO,GAAG,EAAE,IAAI,EAAC,gBAAgB,YAAW,CAAC,EAAE,IAAI,IAAI;AAAA,QAC7D,OAAO;AACL,eAAK,CAAC;AAAA,QACR;AAAA,MACF,SAAS,IAAP;AACA,gBAAQ,MAAM,+BAA+B;AAC7C,gBAAQ,MAAM,EAAE;AAChB,aAAK,CAAC;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,QAAM,qBAAqB,OAAO,KAAc,QAAkB;AAChE,UAAM,MAAM,IAAI;AAChB,UAAM,MAAMA,MAAK,QAAQ,GAAG;AAC5B,QAAI,CAAC,KAAK;AACR,YAAM,SAAS,MAAM,WAAW,cAAc,gBAAgB;AAC9D,YAAM,WAAW,IAAI,OAAO,SAAS,UAAU;AAC/C,YAAM,OAAO,MAAM,SAAS,kBAAkB;AAC9C,YAAM,OAAO,KAAK,QAAQ;AAC1B,UAAI,OAAO,GAAG,EAAE,IAAI,EAAC,gBAAgB,YAAW,CAAC,EAAE,IAAI,IAAI;AAC3D;AAAA,IACF;AACA,QAAI,OAAO,GAAG,EAAE,IAAI,EAAC,gBAAgB,aAAY,CAAC,EAAE,IAAI,KAAK;AAAA,EAC/D;AAEA,QAAM,oBAAkB,gBAAW,WAAX,mBAAmB,gBAAe,CAAC;AAC3D,SAAO;AAAA,IACL,GAAG;AAAA,IACH,WAAW;AAAA,IACX;AAAA,IACA;AAAA,EACF;AACF;AAEA,eAAsB,IAAI,gBAAyB;AACjD,UAAQ,IAAI,WAAW;AACvB,QAAM,UAAUA,MAAK,QAAQ,kBAAkB,QAAQ,IAAI,CAAC;AAC5D,QAAM,aAAa,EAAC,QAAO,CAAC;AAC9B;;;AMxLA,OAAOC,WAAU;AACjB,SAAQ,iBAAAC,sBAAoB;AAC5B,OAAOC,cAAa;AACpB,OAAOC,WAAU;AACjB,SAAQ,SAAS,iBAAsC;;;ACUhD,IAAM,gBAAN,MAAwC;AAAA,EAG7C,cAAc;AACZ,SAAK,kBAAkB,oBAAI,IAAI;AAAA,EACjC;AAAA,EAEA,MAAM,IAAI,UAAyC;AACjD,WAAO,KAAK,gBAAgB,IAAI,QAAQ,KAAK;AAAA,EAC/C;AAAA,EAEQ,IAAI,OAAmB;AAC7B,SAAK,gBAAgB,IAAI,MAAM,UAAU,KAAK;AAAA,EAChD;AAAA,EAEA,SAA6B;AAC3B,UAAM,SAA6B,CAAC;AACpC,eAAW,YAAY,KAAK,gBAAgB,KAAK,GAAG;AAClD,aAAO,YAAY,KAAK,gBAAgB,IAAI,QAAQ,EAAG,OAAO;AAAA,IAChE;AACA,WAAO;AAAA,EACT;AAAA,EAEA,OAAO,iBACL,cACA,YACA;AACA,UAAM,WAAW,IAAI,cAAc;AAEnC,UAAM,mBAAmB,oBAAI,IAAI;AACjC,WAAO,OAAO,UAAU,EAAE;AAAA,MAAQ,CAAC,aACjC,iBAAiB,IAAI,QAAQ;AAAA,IAC/B;AAEA,WAAO,KAAK,YAAY,EAAE,QAAQ,CAAC,gBAAgB;AACjD,YAAM,WAAW,IAAI;AACrB,YAAM,gBAAgB,aAAa;AACnC,YAAM,YAAY,iBAAiB,IAAI,QAAQ;AAC/C,YAAM,YAAY;AAAA,QAChB;AAAA,QACA,UAAU,IAAI,cAAc;AAAA,QAC5B,kBAAkB,cAAc,WAAW,CAAC,GAAG;AAAA,UAC7C,CAAC,YAAY,IAAI;AAAA,QACnB;AAAA,QACA,cAAc,cAAc,OAAO,CAAC,GAAG,IAAI,CAAC,YAAY,IAAI,SAAS;AAAA,QACrE;AAAA,MACF;AACA,eAAS,IAAI,IAAI,WAAW,UAAU,SAAS,CAAC;AAAA,IAClD,CAAC;AACD,WAAO;AAAA,EACT;AAAA,EAEA,OAAO,iBAAiB,cAAkC;AACxD,UAAM,WAAW,IAAI,cAAc;AACnC,WAAO,KAAK,YAAY,EAAE,QAAQ,CAAC,aAAa;AAC9C,YAAM,YAAY,aAAa;AAC/B,eAAS,IAAI,IAAI,WAAW,UAAU,SAAS,CAAC;AAAA,IAClD,CAAC;AACD,WAAO;AAAA,EACT;AACF;AAEO,IAAM,aAAN,MAAiB;AAAA,EAQtB,YACE,UACA,WAOA;AACA,SAAK,WAAW;AAChB,SAAK,WAAW,UAAU;AAC1B,SAAK,WAAW,UAAU;AAC1B,SAAK,kBAAkB,UAAU;AACjC,SAAK,cAAc,UAAU;AAC7B,SAAK,YAAY,UAAU;AAAA,EAC7B;AAAA,EAEA,MAAM,aAAgC;AACpC,UAAM,UAAU,oBAAI,IAAY;AAChC,UAAM,OAAO,oBAAI,IAAY;AAC7B,UAAM,KAAK,WAAW,MAAM,MAAM,OAAO;AACzC,WAAO,MAAM,KAAK,IAAI;AAAA,EACxB;AAAA,EAEA,MAAM,YAA+B;AACnC,UAAM,UAAU,oBAAI,IAAY;AAChC,UAAM,OAAO,oBAAI,IAAY;AAC7B,UAAM,KAAK,UAAU,MAAM,MAAM,OAAO;AACxC,WAAO,MAAM,KAAK,IAAI;AAAA,EACxB;AAAA,EAEA,MAAc,UACZ,OACA,MACA,SACA;AACA,QAAI,CAAC,OAAO;AACV;AAAA,IACF;AACA,QAAI,CAAC,MAAM,UAAU;AACnB;AAAA,IACF;AACA,QAAI,QAAQ,IAAI,MAAM,QAAQ,GAAG;AAC/B;AAAA,IACF;AACA,YAAQ,IAAI,MAAM,QAAQ;AAC1B,QAAI,MAAM,WAAW;AACnB,WAAK,IAAI,MAAM,QAAQ;AAAA,IACzB;AACA,UAAM,QAAQ;AAAA,MACZ,MAAM,gBAAgB,IAAI,OAAO,aAAa;AAC5C,cAAM,gBAAiB,MAAM,KAAK,SAAS,IAAI,QAAQ;AACvD,aAAK,UAAU,eAAe,MAAM,OAAO;AAAA,MAC7C,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAc,WACZ,OACA,MACA,SACA;AACA,QAAI,CAAC,OAAO;AACV;AAAA,IACF;AACA,QAAI,CAAC,MAAM,UAAU;AACnB;AAAA,IACF;AACA,QAAI,QAAQ,IAAI,MAAM,QAAQ,GAAG;AAC/B;AAAA,IACF;AACA,YAAQ,IAAI,MAAM,QAAQ;AAC1B,QAAI,MAAM,aAAa;AACrB,YAAM,YAAY,QAAQ,CAAC,WAAW,KAAK,IAAI,MAAM,CAAC;AAAA,IACxD;AACA,UAAM,QAAQ;AAAA,MACZ,MAAM,gBAAgB,IAAI,OAAO,aAAa;AAC5C,cAAM,gBAAiB,MAAM,KAAK,SAAS,IAAI,QAAQ;AACvD,aAAK,WAAW,eAAe,MAAM,OAAO;AAAA,MAC9C,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,SAAS;AACP,WAAO;AAAA,MACL,UAAU,KAAK;AAAA,MACf,UAAU,KAAK;AAAA,MACf,iBAAiB,KAAK;AAAA,MACtB,aAAa,KAAK;AAAA,MAClB,WAAW,KAAK;AAAA,IAClB;AAAA,EACF;AACF;;;AD9JA,SAAQ,OAAAC,YAAU;AAElB,IAAMC,aAAYC,MAAK,QAAQC,eAAc,YAAY,GAAG,CAAC;AAO7D,eAAsB,MAAM,gBAAyB,SAAwB;AA5B7E;AA6BE,QAAM,UAAUD,MAAK,QAAQ,kBAAkB,QAAQ,IAAI,CAAC;AAC5D,QAAM,aAAa,MAAM,eAAe,OAAO;AAC/C,QAAM,UAAUA,MAAK,KAAK,SAAS,MAAM;AACzC,QAAM,WAAU,mCAAS,YAAW;AACpC,QAAM,QAAO,mCAAS,SAAQ;AAE9B,UAAQ,IAAI;AACZ,UAAQ,IAAI,GAAGF,KAAI,QAAG,eAAe,SAAS;AAC9C,UAAQ,IAAI,GAAGA,KAAI,QAAG,eAAe,cAAc;AACnD,UAAQ,IAAI,GAAGA,KAAI,QAAG,eAAe,MAAM;AAC3C,UAAQ,IAAI;AAEZ,QAAM,MAAM,OAAO;AACnB,QAAM,QAAQ,OAAO;AAErB,QAAM,QAAkB,CAAC;AACzB,MAAI,MAAM,YAAYE,MAAK,KAAK,SAAS,QAAQ,CAAC,GAAG;AACnD,UAAM,YAAY,MAAME,MAAKF,MAAK,KAAK,SAAS,aAAa,CAAC;AAC9D,cAAU,QAAQ,CAAC,SAAS;AAC1B,YAAM,QAAQA,MAAK,MAAM,IAAI;AAC7B,UAAI,CAAC,MAAM,KAAK,WAAW,GAAG,KAAK,SAAS,MAAM,IAAI,GAAG;AACvD,cAAM,KAAK,IAAI;AAAA,MACjB;AAAA,IACF,CAAC;AAAA,EACH;AAEA,QAAM,eAAe,CAACA,MAAK,KAAK,SAAS,UAAU,CAAC;AACpD,QAAM,oBAAkB,gBAAW,aAAX,mBAAqB,YAAW,CAAC;AACzD,QAAM,oBAAkB,gBAAW,aAAX,mBAAqB,YAAW,CAAC;AACzD,QAAM,iBAAiB,CAAC,aAAqB;AAC3C,WAAO,gBAAgB,KAAK,CAAC,YAAY,QAAQ,SAAS,MAAM,OAAO,CAAC,CAAC;AAAA,EAC3E;AAEA,aAAW,WAAW,iBAAiB;AACrC,UAAM,cAAcA,MAAK,QAAQ,SAAS,OAAO;AACjD,QAAI,CAAC,YAAY,WAAW,OAAO,GAAG;AACpC,YAAM,IAAI;AAAA,QACR,qBAAqB,0DAA0D;AAAA,MACjF;AAAA,IACF;AACA,iBAAa,KAAK,WAAW;AAAA,EAC/B;AACA,QAAM,WAAqB,CAAC;AAC5B,QAAM,aAAqC,CAAC;AAC5C,aAAW,WAAW,cAAc;AAClC,QAAI,MAAM,YAAY,OAAO,GAAG;AAC9B,YAAM,eAAe,MAAME,MAAK,QAAQ,EAAC,KAAK,QAAO,CAAC;AACtD,mBAAa,QAAQ,CAAC,SAAS;AAC7B,cAAM,QAAQF,MAAK,MAAM,IAAI;AAC7B,YAAI,SAAS,MAAM,IAAI,GAAG;AACxB,gBAAM,WAAWA,MAAK,KAAK,SAAS,IAAI;AACxC,gBAAM,WAAW,SAAS,MAAM,QAAQ,MAAM;AAC9C,cAAI,CAAC,eAAe,QAAQ,GAAG;AAC7B,qBAAS,KAAK,QAAQ;AACtB,uBAAW,MAAM,QAAQ;AAAA,UAC3B;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAEA,QAAM,gBAA0B,CAAC;AACjC,MAAI,MAAM,YAAYA,MAAK,KAAK,SAAS,SAAS,CAAC,GAAG;AACpD,UAAM,cAAc,MAAME,MAAKF,MAAK,KAAK,SAAS,WAAW,CAAC;AAC9D,gBAAY,QAAQ,CAAC,SAAS;AAC5B,YAAM,QAAQA,MAAK,MAAM,IAAI;AAC7B,UAAI,SAAS,MAAM,IAAI,GAAG;AACxB,sBAAc,KAAK,IAAI;AAAA,MACzB;AAAA,IACF,CAAC;AAAA,EACH;AAEA,QAAM,aAAa,WAAW,QAAQ,CAAC;AACvC,QAAM,aAAyB;AAAA,IAC7B,GAAG;AAAA,IACH,MAAM;AAAA,IACN;AAAA,IACA,SAAS;AAAA,MACP,KAAK;AAAA,MACL,iBAAiB;AAAA,MACjB,aAAa;AAAA,IACf;AAAA,IACA,SAAS,CAAC,GAAI,WAAW,WAAW,CAAC,GAAI,WAAW,EAAC,SAAS,WAAU,CAAC,CAAC;AAAA,EAC5E;AAIA,QAAM,UAAU;AAAA,IACd,GAAG;AAAA,IACH,WAAW;AAAA,IACX,OAAO;AAAA,MACL,eAAe;AAAA,QACb,OAAO,CAACA,MAAK,QAAQD,YAAW,aAAa,CAAC;AAAA,QAC9C,QAAQ;AAAA,UACN,QAAQ;AAAA,UACR,gBAAgB;AAAA,UAChB,gBAAgB;AAAA,QAClB;AAAA,MACF;AAAA,MACA,QAAQC,MAAK,KAAK,SAAS,QAAQ;AAAA,MACnC,KAAK;AAAA,MACL,aAAa;AAAA,MACb,cAAc;AAAA,MACd,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,uBAAuB;AAAA,MACvB,sBAAsB;AAAA,IACxB;AAAA,IACA,KAAK;AAAA,MACH,YAAY,CAAC,cAAc;AAAA,IAC7B;AAAA,EACF,CAAC;AAGD,QAAM,UAAU;AAAA,IACd,GAAG;AAAA,IACH,WAAW;AAAA,IACX,OAAO;AAAA,MACL,eAAe;AAAA,QACb,OAAO,CAAC,GAAG,OAAO,GAAG,UAAU,GAAG,aAAa;AAAA,QAC/C,QAAQ;AAAA,UACN,QAAQ;AAAA,UACR,gBAAgB;AAAA,UAChB,gBAAgB;AAAA,QAClB;AAAA,MACF;AAAA,MACA,QAAQA,MAAK,KAAK,SAAS,QAAQ;AAAA,MACnC,KAAK;AAAA,MACL,aAAa;AAAA,MACb,UAAU;AAAA,MACV,cAAc;AAAA,MACd,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,uBAAuB;AAAA,MACvB,sBAAsB;AAAA,IACxB;AAAA,EACF,CAAC;AAED,QAAM,eAAe,MAAM;AAAA,IACzBA,MAAK,KAAK,SAAS,sBAAsB;AAAA,EAC3C;AAIA,QAAM,WAAW,cAAc,iBAAiB,cAAc,UAAU;AAGxE;AAAA,IACEA,MAAK,KAAK,SAAS,2BAA2B;AAAA,IAC9C,KAAK,UAAU,SAAS,OAAO,GAAG,MAAM,CAAC;AAAA,EAC3C;AAGA,QAAM,WAAWA,MAAK,KAAK,SAAS,MAAM;AAG1C,QAAM,YAAYA,MAAK,KAAK,SAAS,QAAQ;AAC7C,MAAIG,SAAQ,WAAWH,MAAK,KAAK,SAAS,QAAQ,CAAC,GAAG;AACpD,IAAAG,SAAQ,SAAS,WAAW,QAAQ;AAAA,EACtC,OAAO;AACL,YAAQ,QAAQ;AAAA,EAClB;AAGA,UAAQH,MAAK,KAAK,SAAS,eAAe,GAAGA,MAAK,KAAK,UAAU,QAAQ,CAAC;AAC1E,UAAQA,MAAK,KAAK,SAAS,eAAe,GAAGA,MAAK,KAAK,UAAU,QAAQ,CAAC;AAG1E,MAAI,CAAC,SAAS;AACZ,UAAM,SAAS,MAAM,OAAOA,MAAK,KAAK,SAAS,kBAAkB;AACjE,UAAM,WAAW,IAAI,OAAO,SAAS,UAAU;AAC/C,UAAM,UAAU,MAAM,SAAS,WAAW;AAE1C,UAAM,QAAQ;AAAA,MACZ,OAAO,KAAK,OAAO,EAAE,IAAI,OAAO,YAAY;AAC1C,cAAM,EAAC,OAAO,OAAM,IAAI,QAAQ;AAChC,cAAM,OAAO,MAAM,SAAS,YAAY,OAAO;AAAA,UAC7C;AAAA,UACA,aAAa;AAAA,QACf,CAAC;AAID,YAAI,UAAUA,MAAK,KAAK,SAAS,OAAO,WAAW,YAAY;AAE/D,YAAI,QAAQ,SAAS,gBAAgB,GAAG;AACtC,oBAAU,QAAQ,QAAQ,kBAAkB,UAAU;AAAA,QACxD;AAEA,cAAM,OAAO,MAAM,WAAW,KAAK,QAAQ,EAAE;AAC7C,cAAM,UAAU,SAAS,IAAI;AAE7B,cAAM,UAAU,QAAQ,MAAMA,MAAK,QAAQ,OAAO,EAAE,SAAS,CAAC;AAC9D,gBAAQ,IAAI,SAAS,SAAS;AAAA,MAChC,CAAC;AAAA,IACH;AAAA,EACF;AACF;;;AElOA,OAAOI,WAAU;AACjB,SAAQ,WAAWC,gBAA+C;AASlE,SAAQ,OAAAC,YAAU;AAElB,eAAsB,QAAQ,gBAAyB;AAZvD;AAcE,UAAQ,IAAI,WAAW;AACvB,QAAM,UAAUC,MAAK,QAAQ,kBAAkB,QAAQ,IAAI,CAAC;AAC5D,QAAM,aAAa,MAAM,eAAe,OAAO;AAC/C,QAAM,UAAUA,MAAK,KAAK,SAAS,MAAM;AAEzC,QAAM,SAAS,MAAM,OAAOA,MAAK,KAAK,SAAS,kBAAkB;AACjE,QAAM,WAAW,IAAI,OAAO,SAAS,UAAU;AAE/C,QAAM,eAAeA,MAAK,KAAK,SAAS,2BAA2B;AACnE,MAAI,CAAE,MAAM,WAAW,YAAY,GAAI;AACrC,UAAM,IAAI;AAAA,MACR,kBAAkB;AAAA,IACpB;AAAA,EACF;AACA,QAAM,eAAe,MAAM,SAA6B,YAAY;AACpE,QAAM,WAAW,cAAc,iBAAiB,YAAY;AAE5D,QAAM,MAAMC,SAAQ;AACpB,MAAI,QAAQ,cAAc;AAE1B,QAAM,oBAAkB,gBAAW,WAAX,mBAAmB,gBAAe,CAAC;AAC3D,kBAAgB,QAAQ,CAAC,eAAe;AACtC,QAAI,IAAI,UAAU;AAAA,EACpB,CAAC;AAED,QAAM,YAAYD,MAAK,KAAK,SAAS,MAAM;AAC3C,MAAI,IAAIC,SAAQ,OAAO,SAAS,CAAC;AAGjC,MAAI,IAAI,OAAO,KAAc,KAAe,SAAuB;AACjE,QAAI;AACF,YAAM,MAAM,IAAI;AAChB,YAAM,OAAO,MAAM,SAAS,OAAO,KAAK;AAAA,QACtC;AAAA,MACF,CAAC;AACD,UAAI,KAAK,YAAY,CAAC,KAAK,MAAM;AAC/B,aAAK;AACL;AAAA,MACF;AACA,UAAI,OAAO,KAAK,QAAQ;AACxB,UAAI,WAAW,eAAe,OAAO;AACnC,eAAO,MAAM,WAAW,IAAI;AAAA,MAC9B;AACA,UAAI,OAAO,GAAG,EAAE,IAAI,EAAC,gBAAgB,YAAW,CAAC,EAAE,IAAI,IAAI;AAAA,IAC7D,SAAS,GAAP;AACA,UAAI;AACF,cAAM,EAAC,KAAI,IAAI,MAAM,SAAS,YAAY,CAAC;AAC3C,YAAI,OAAO,GAAG,EAAE,IAAI,EAAC,gBAAgB,YAAW,CAAC,EAAE,IAAI,IAAI;AAAA,MAC7D,SAAS,IAAP;AACA,gBAAQ,MAAM,+BAA+B;AAC7C,gBAAQ,MAAM,EAAE;AAChB,aAAK,CAAC;AAAA,MACR;AAAA,IACF;AAAA,EACF,CAAC;AAID,QAAM,OAAO,SAAS,QAAQ,IAAI,QAAQ,MAAM;AAChD,UAAQ,IAAI;AACZ,UAAQ,IAAI,GAAGF,KAAI,QAAG,eAAe,SAAS;AAC9C,UAAQ,IAAI,GAAGA,KAAI,QAAG,gCAAgC,MAAM;AAC5D,UAAQ,IAAI;AACZ,MAAI,OAAO,IAAI;AACjB;;;AC9EA,OAAOG,WAAU;AACjB,SAAQ,WAAWC,gBAA+C;AASlE,SAAQ,OAAAC,YAAU;AAElB,eAAsB,MAAM,gBAAyB;AAZrD;AAaE,UAAQ,IAAI,WAAW;AACvB,QAAM,UAAUC,MAAK,QAAQ,kBAAkB,QAAQ,IAAI,CAAC;AAC5D,QAAM,aAAa,MAAM,eAAe,OAAO;AAC/C,QAAM,UAAUA,MAAK,KAAK,SAAS,MAAM;AAEzC,QAAM,SAAS,MAAM,OAAOA,MAAK,KAAK,SAAS,kBAAkB;AACjE,QAAM,WAAW,IAAI,OAAO,SAAS,UAAU;AAE/C,QAAM,eAAeA,MAAK,KAAK,SAAS,2BAA2B;AACnE,MAAI,CAAE,MAAM,WAAW,YAAY,GAAI;AACrC,UAAM,IAAI;AAAA,MACR,kBAAkB;AAAA,IACpB;AAAA,EACF;AACA,QAAM,eAAe,MAAM,SAA6B,YAAY;AACpE,QAAM,WAAW,cAAc,iBAAiB,YAAY;AAE5D,QAAM,MAAMC,SAAQ;AACpB,MAAI,QAAQ,cAAc;AAE1B,QAAM,oBAAkB,gBAAW,WAAX,mBAAmB,gBAAe,CAAC;AAC3D,kBAAgB,QAAQ,CAAC,eAAe;AACtC,QAAI,IAAI,UAAU;AAAA,EACpB,CAAC;AAED,QAAM,YAAYD,MAAK,KAAK,SAAS,MAAM;AAC3C,MAAI,IAAIC,SAAQ,OAAO,SAAS,CAAC;AAGjC,MAAI,IAAI,OAAO,KAAc,KAAe,SAAuB;AACjE,QAAI;AACF,YAAM,MAAM,IAAI;AAChB,YAAM,OAAO,MAAM,SAAS,OAAO,KAAK;AAAA,QACtC;AAAA,MACF,CAAC;AACD,UAAI,KAAK,YAAY,CAAC,KAAK,MAAM;AAC/B,aAAK;AACL;AAAA,MACF;AACA,UAAI,OAAO,KAAK,QAAQ;AACxB,UAAI,WAAW,eAAe,OAAO;AACnC,eAAO,MAAM,WAAW,IAAI;AAAA,MAC9B;AACA,UAAI,OAAO,GAAG,EAAE,IAAI,EAAC,gBAAgB,YAAW,CAAC,EAAE,IAAI,IAAI;AAAA,IAC7D,SAAS,GAAP;AACA,UAAI;AACF,cAAM,EAAC,KAAI,IAAI,MAAM,SAAS,YAAY,CAAC;AAC3C,YAAI,OAAO,GAAG,EAAE,IAAI,EAAC,gBAAgB,YAAW,CAAC,EAAE,IAAI,IAAI;AAAA,MAC7D,SAAS,IAAP;AACA,gBAAQ,MAAM,+BAA+B;AAC7C,gBAAQ,MAAM,EAAE;AAChB,aAAK,CAAC;AAAA,MACR;AAAA,IACF;AAAA,EACF,CAAC;AAID,QAAM,OAAO,SAAS,QAAQ,IAAI,QAAQ,MAAM;AAChD,UAAQ,IAAI;AACZ,UAAQ,IAAI,GAAGF,KAAI,QAAG,eAAe,SAAS;AAC9C,UAAQ,IAAI,GAAGA,KAAI,QAAG,gCAAgC,MAAM;AAC5D,UAAQ,IAAI;AACZ,MAAI,OAAO,IAAI;AACjB;","names":["path","path","path","path","glob","path","path","fileURLToPath","fsExtra","glob","dim","__dirname","path","fileURLToPath","glob","fsExtra","path","express","dim","path","express","path","express","dim","path","express"]}
|
|
1
|
+
{"version":3,"sources":["../src/cli/commands/dev.ts","../src/render/vite-plugin-root.ts","../src/core/fsutils.ts","../src/render/asset-map/dev-asset-map.ts","../src/cli/load-config.ts","../src/render/html-minify.ts","../src/core/middleware.ts","../src/cli/commands/build.ts","../src/render/asset-map/build-asset-map.ts","../src/cli/commands/preview.ts","../src/cli/commands/start.ts"],"sourcesContent":["import path from 'node:path';\nimport {fileURLToPath} from 'node:url';\nimport {default as express} from 'express';\nimport {createServer as createViteServer} from 'vite';\nimport {pluginRoot} from '../../render/vite-plugin-root.js';\nimport {DevServerAssetMap} from '../../render/asset-map/dev-asset-map.js';\nimport {loadRootConfig} from '../load-config.js';\nimport {htmlMinify} from '../../render/html-minify.js';\nimport {isDirectory, isJsFile} from '../../core/fsutils.js';\nimport glob from 'tiny-glob';\nimport {dim} from 'kleur/colors';\nimport {Server, Request, Response, NextFunction} from '../../core/types.js';\nimport {configureServerPlugins, getVitePlugins} from '../../core/plugin.js';\nimport {RootConfig} from '../../core/config.js';\nimport {rootProjectMiddleware} from '../../core/middleware.js';\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\n\nexport async function dev(rootProjectDir?: string) {\n process.env.NODE_ENV = 'development';\n const rootDir = path.resolve(rootProjectDir || process.cwd());\n const server = await createServer({rootDir});\n const port = parseInt(process.env.PORT || '4007');\n console.log();\n console.log(`${dim('┃')} project: ${rootDir}`);\n console.log(`${dim('┃')} server: http://localhost:${port}`);\n console.log(`${dim('┃')} mode: development`);\n console.log();\n server.listen(port);\n}\n\nasync function createServer(options?: {rootDir?: string}): Promise<Server> {\n const rootDir = path.resolve(options?.rootDir || process.cwd());\n const rootConfig = await loadRootConfig(rootDir);\n\n const server = express();\n server.disable('x-powered-by');\n\n // Inject req context vars.\n server.use(rootProjectMiddleware({rootDir, rootConfig}));\n server.use(await viteServerMiddleware({rootDir, rootConfig}));\n server.use(rootDevRendererMiddleware());\n\n const plugins = rootConfig.plugins || [];\n await configureServerPlugins(\n server,\n async () => {\n // Add user-configured middlewares from `root.config.ts`.\n const userMiddlewares = rootConfig.server?.middlewares || [];\n for (const middleware of userMiddlewares) {\n server.use(middleware);\n }\n // Add the root.js dev server middlewares.\n server.use(rootDevServerMiddleware());\n server.use(rootDevServer404Middleware());\n },\n plugins,\n {type: 'dev'}\n );\n\n return server;\n}\n\n/**\n * Middleware that initializes a vite server and injects it into the request\n * context.\n */\nasync function viteServerMiddleware(options: {\n rootDir: string;\n rootConfig: RootConfig;\n}) {\n const rootDir = options.rootDir;\n const rootConfig = options.rootConfig;\n const viteConfig = rootConfig.vite || {};\n\n const routeFiles: string[] = [];\n if (await isDirectory(path.join(rootDir, 'routes'))) {\n const pageFiles = await glob('routes/**/*', {cwd: rootDir});\n pageFiles.forEach((file) => {\n const parts = path.parse(file);\n if (!parts.name.startsWith('_') && isJsFile(parts.base)) {\n routeFiles.push(file);\n }\n });\n }\n\n const elementsDirs = [path.join(rootDir, 'elements')];\n const elementsInclude = rootConfig.elements?.include || [];\n const excludePatterns = rootConfig.elements?.exclude || [];\n const excludeElement = (moduleId: string) => {\n return excludePatterns.some((pattern) => Boolean(moduleId.match(pattern)));\n };\n\n for (const dirPath of elementsInclude) {\n const elementsDir = path.resolve(rootDir, dirPath);\n if (!elementsDir.startsWith(rootDir)) {\n throw new Error(\n `the elements dir (${dirPath}) should be relative to the project's root dir (${rootDir})`\n );\n }\n elementsDirs.push(elementsDir);\n }\n const elements: string[] = [];\n for (const dirPath of elementsDirs) {\n if (await isDirectory(dirPath)) {\n const elementFiles = await glob('**/*', {cwd: dirPath});\n elementFiles.forEach((file) => {\n const parts = path.parse(file);\n if (isJsFile(parts.base)) {\n const fullPath = path.join(dirPath, file);\n const moduleId = fullPath.slice(rootDir.length);\n if (!excludeElement(moduleId)) {\n elements.push(moduleId.slice(1));\n }\n }\n });\n }\n }\n\n const bundleScripts: string[] = [];\n if (await isDirectory(path.join(rootDir, 'bundles'))) {\n const bundleFiles = await glob(path.join(rootDir, 'bundles/*'));\n bundleFiles.forEach((file) => {\n const parts = path.parse(file);\n if (isJsFile(parts.base)) {\n bundleScripts.push(file);\n }\n });\n }\n\n const vitePlugins = [\n pluginRoot({rootDir, rootConfig}),\n ...(viteConfig.plugins || []),\n ...getVitePlugins(rootConfig.plugins || []),\n ];\n\n const viteServer = await createViteServer({\n ...viteConfig,\n mode: 'development',\n root: rootDir,\n publicDir: path.join(rootDir, 'public'),\n server: {middlewareMode: true},\n appType: 'custom',\n optimizeDeps: {\n include: [\n ...routeFiles,\n ...elements,\n ...bundleScripts,\n ...(viteConfig.optimizeDeps?.include || []),\n ],\n },\n ssr: {\n noExternal: ['@blinkk/root'],\n },\n esbuild: {\n jsx: 'automatic',\n jsxImportSource: 'preact',\n },\n plugins: vitePlugins,\n });\n return async (req: Request, _: Response, next: NextFunction) => {\n req.viteServer = viteServer;\n next();\n };\n}\n\nfunction rootDevRendererMiddleware() {\n const renderModulePath = path.resolve(__dirname, './render.js');\n return async (req: Request, _: Response, next: NextFunction) => {\n const rootConfig = req.rootConfig!;\n const viteServer = req.viteServer!;\n // Dynamically import the render.js module using vite's SSR import loader.\n const render = await viteServer.ssrLoadModule(renderModulePath);\n // Create a dev asset map using Vite dev server's module graph.\n const assetMap = new DevServerAssetMap(viteServer.moduleGraph);\n req.renderer = new render.Renderer(rootConfig, {assetMap});\n next();\n };\n}\n\nfunction rootDevServerMiddleware() {\n return async (req: Request, res: Response, next: NextFunction) => {\n const url = req.originalUrl;\n const renderer = req.renderer!;\n const viteServer = req.viteServer!;\n const rootConfig = req.rootConfig!;\n try {\n const data = await renderer.render(url);\n if (data.notFound || !data.html) {\n next();\n return;\n }\n // Inject the Vite HMR client.\n let html = await viteServer.transformIndexHtml(url, data.html || '');\n if (rootConfig.minifyHtml !== false) {\n html = await htmlMinify(html);\n }\n res.status(200).set({'Content-Type': 'text/html'}).end(html);\n } catch (e) {\n // If an error is caught, let Vite fix the stack trace so it maps back to\n // your actual source code.\n viteServer.ssrFixStacktrace(e);\n console.error(e);\n try {\n if (renderer) {\n const {html} = await renderer.renderError(e);\n res.status(500).set({'Content-Type': 'text/html'}).end(html);\n } else {\n next(e);\n }\n } catch (e2) {\n console.error('failed to render custom error');\n console.error(e2);\n next(e);\n }\n }\n };\n}\n\nfunction rootDevServer404Middleware() {\n return async (req: Request, res: Response) => {\n const url = req.originalUrl;\n const ext = path.extname(url);\n const renderer = req.renderer!;\n if (!ext) {\n const data = await renderer.renderDevServer404();\n const html = data.html || '';\n res.status(404).set({'Content-Type': 'text/html'}).end(html);\n return;\n }\n res.status(404).set({'Content-Type': 'text/plain'}).end('404');\n };\n}\n","import path from 'path';\nimport glob from 'tiny-glob';\nimport {RootConfig} from '../core/config';\nimport {isDirectory, isJsFile} from '../core/fsutils';\n\nconst JSX_ELEMENTS_REGEX = /jsxs?\\(\"(\\w[\\w-]+\\w)\"/g;\nconst HTML_ELEMENTS_REGEX = /<(\\w[\\w-]+\\w)/g;\n\nexport interface RootPluginOptions {\n rootDir: string;\n rootConfig: RootConfig;\n}\n\nexport function pluginRoot(options?: RootPluginOptions) {\n const elementsVirtualId = 'virtual:root-elements';\n const resolvedElementsVirtualId = '\\0' + elementsVirtualId;\n\n const rootDir = options?.rootDir || process.cwd();\n const rootConfig = options?.rootConfig || {};\n const elementsDirs = [path.join(rootDir, 'elements')];\n const includeDirs = rootConfig.elements?.include || [];\n includeDirs.forEach((dirPath) => {\n const elementsDir = path.resolve(rootDir, dirPath);\n if (!elementsDir.startsWith(rootDir)) {\n throw new Error(\n `the elements dir (${dirPath}) should be relative to the project's root dir (${rootDir})`\n );\n }\n elementsDirs.push(elementsDir);\n });\n\n const excludePatterns = rootConfig.elements?.exclude || [];\n const excludeElement = (moduleId: string) => {\n return excludePatterns.some((pattern) => Boolean(moduleId.match(pattern)));\n };\n\n let elementMap: Record<string, string>;\n async function updateElementMap() {\n elementMap = {};\n await Promise.all(\n elementsDirs.map(async (dirPath: string) => {\n const dirExists = await isDirectory(dirPath);\n if (!dirExists) {\n return;\n }\n const files = await glob('**/*', {cwd: dirPath});\n files.forEach((file) => {\n const parts = path.parse(file);\n if (isJsFile(parts.base)) {\n const fullPath = path.join(dirPath, file);\n const moduleId = fullPath.slice(rootDir.length);\n if (!excludeElement(moduleId)) {\n elementMap[parts.name] = moduleId;\n }\n }\n });\n })\n );\n }\n\n async function getElementImport(tagname: string): Promise<string | null> {\n if (!elementMap) {\n await updateElementMap();\n }\n if (tagname in elementMap) {\n return elementMap[tagname];\n }\n return null;\n }\n\n function isCustomElement(id: string) {\n if (!isJsFile(id)) {\n return false;\n }\n return elementsDirs.some((elementsDir) => {\n return id.startsWith(elementsDir);\n });\n }\n\n return {\n name: 'vite-plugin-root',\n\n resolveId(id: string) {\n if (id === elementsVirtualId) {\n return resolvedElementsVirtualId;\n }\n return null;\n },\n\n async load(id: string) {\n if (id === resolvedElementsVirtualId) {\n await updateElementMap();\n return `export const elementsMap = ${JSON.stringify(elementMap)}`;\n }\n return null;\n },\n\n async transform(src: string, id: string): Promise<any> {\n if (isCustomElement(id)) {\n const idParts = path.parse(id);\n const deps = new Set<string>();\n const tagnames = [\n ...src.matchAll(JSX_ELEMENTS_REGEX),\n ...src.matchAll(HTML_ELEMENTS_REGEX),\n ];\n for (const match of tagnames) {\n const tagname = match[1];\n // All custom elements should contain a dash.\n if (!tagname.includes('-')) {\n continue;\n }\n // Avoid circular deps.\n if (tagname === idParts.name) {\n continue;\n }\n deps.add(tagname);\n }\n const importUrls: string[] = [];\n await Promise.all(\n Array.from(deps).map(async (tagname) => {\n const importUrl = await getElementImport(tagname);\n if (importUrl) {\n importUrls.push(importUrl);\n }\n })\n );\n if (importUrls.length > 0) {\n const importLines = importUrls\n .map((url) => `import '${url}';`)\n .join('\\n');\n const code = `${src}\n\n// autogenerated by root:\n${importLines}\n`;\n return {code};\n }\n return null;\n }\n return null;\n },\n };\n}\n","import {promises as fs} from 'node:fs';\nimport path from 'node:path';\nimport fsExtra from 'fs-extra';\n\nexport function isJsFile(filename: string) {\n return !!filename.match(/\\.(j|t)sx?$/);\n}\n\nexport async function writeFile(filepath: string, content: string) {\n const dirPath = path.dirname(filepath);\n await makeDir(dirPath);\n await fs.writeFile(filepath, content);\n}\n\nexport async function makeDir(dirpath: string) {\n try {\n await fs.access(dirpath);\n } catch (e) {\n await fs.mkdir(dirpath, {recursive: true});\n }\n}\n\nexport async function copyDir(srcdir: string, dstdir: string) {\n if (!fsExtra.existsSync(srcdir)) {\n return;\n }\n fsExtra.copySync(srcdir, dstdir, {recursive: true, overwrite: true});\n}\n\nexport async function rmDir(dirpath: string) {\n await fs.rm(dirpath, {recursive: true, force: true});\n}\n\nexport async function loadJson<T = unknown>(filepath: string): Promise<T> {\n const content = await fs.readFile(filepath, 'utf-8');\n return JSON.parse(content);\n}\n\nexport async function isDirectory(dirpath: string) {\n return fs\n .stat(dirpath)\n .then((fsStat) => {\n return fsStat.isDirectory();\n })\n .catch((err) => {\n if (err.code === 'ENOENT') {\n return false;\n }\n throw err;\n });\n}\n\nexport function fileExists(filepath: string): Promise<boolean> {\n return fs\n .access(filepath)\n .then(() => true)\n .catch(() => false);\n}\n","import path from 'node:path';\nimport {ModuleGraph, ModuleNode} from 'vite';\nimport {Asset, AssetMap} from './asset-map';\n\nexport class DevServerAssetMap implements AssetMap {\n private moduleGraph: ModuleGraph;\n\n constructor(moduleGraph: ModuleGraph) {\n this.moduleGraph = moduleGraph;\n }\n\n async get(moduleId: string): Promise<Asset | null> {\n const viteModule = await this.moduleGraph.getModuleByUrl(moduleId);\n if (!viteModule || !viteModule.id) {\n // On dev, in some cases the module doesn't make it into the module graph\n // so return a generic asset.\n return {\n moduleId: moduleId,\n assetUrl: moduleId,\n getCssDeps: async () => [],\n getJsDeps: async () => [moduleId],\n };\n }\n return new DevServerAsset(this, viteModule);\n }\n}\n\nexport class DevServerAsset implements Asset {\n moduleId: string;\n assetUrl: string;\n private assetMap: AssetMap;\n private viteModule: ModuleNode;\n\n constructor(assetMap: AssetMap, viteModule: ModuleNode) {\n this.assetMap = assetMap;\n this.viteModule = viteModule;\n this.moduleId = this.viteModule.id!;\n this.assetUrl = this.viteModule.url;\n }\n\n async getCssDeps(): Promise<string[]> {\n const visited = new Set<string>();\n const deps = new Set<string>();\n this.collectCss(this, deps, visited);\n return Array.from(deps);\n }\n\n async getJsDeps(): Promise<string[]> {\n const visited = new Set<string>();\n const deps = new Set<string>();\n this.collectJs(this, deps, visited);\n return Array.from(deps);\n }\n\n getImportedModules() {\n return this.viteModule.importedModules;\n }\n\n private collectJs(\n asset: DevServerAsset | null,\n urls: Set<string>,\n visited: Set<string>\n ) {\n if (!asset) {\n return;\n }\n if (!asset.moduleId) {\n return;\n }\n if (visited.has(asset.moduleId)) {\n return;\n }\n visited.add(asset.moduleId);\n const parts = path.parse(asset.assetUrl);\n if (\n ['.js', '.jsx', '.ts', '.tsx'].includes(parts.ext) &&\n asset.moduleId.includes('/elements/')\n ) {\n urls.add(asset.assetUrl);\n }\n asset.getImportedModules().forEach((viteModule) => {\n if (viteModule.id) {\n const importedAsset = new DevServerAsset(this.assetMap, viteModule);\n this.collectJs(importedAsset, urls, visited);\n }\n });\n }\n\n private collectCss(\n asset: DevServerAsset | null,\n urls: Set<string>,\n visited: Set<string>\n ) {\n if (!asset) {\n return;\n }\n if (!asset.assetUrl) {\n return;\n }\n if (visited.has(asset.assetUrl)) {\n return;\n }\n visited.add(asset.assetUrl);\n if (asset.moduleId.endsWith('.scss')) {\n const parts = path.parse(asset.assetUrl);\n if (!parts.name.startsWith('_')) {\n urls.add(asset.assetUrl);\n }\n }\n asset.getImportedModules().forEach((viteModule) => {\n if (viteModule.id) {\n const importedAsset = new DevServerAsset(this.assetMap, viteModule);\n this.collectCss(importedAsset, urls, visited);\n }\n });\n }\n}\n","import {bundleRequire} from 'bundle-require';\nimport JoyCon from 'joycon';\nimport {RootConfig} from '../core/config';\n\nexport async function loadRootConfig(rootDir: string): Promise<RootConfig> {\n const joycon = new JoyCon();\n const configPath = await joycon.resolve({\n cwd: rootDir,\n files: ['root.config.ts'],\n });\n if (configPath) {\n const configBundle = await bundleRequire({\n filepath: configPath,\n });\n return configBundle.mod.default || {};\n }\n return {};\n}\n","import {minify} from 'html-minifier-terser';\n\nexport async function htmlMinify(html: string): Promise<string> {\n try {\n const min = await minify(html, {\n collapseWhitespace: true,\n removeComments: true,\n preserveLineBreaks: true,\n });\n return min.trimStart();\n } catch (e) {\n console.error('failed to minify html:', e);\n return html;\n }\n}\n","import {RootConfig} from './config';\nimport {Request, Response, NextFunction} from './types';\n\n/**\n * Middleware that injects the root.js project config into the request context.\n */\nexport function rootProjectMiddleware(options: {\n rootDir: string;\n rootConfig: RootConfig;\n}) {\n return (req: Request, _: Response, next: NextFunction) => {\n req.rootConfig = Object.assign({}, options.rootConfig, {\n rootDir: options.rootDir,\n });\n next();\n };\n}\n","import path from 'node:path';\nimport {fileURLToPath} from 'node:url';\nimport fsExtra from 'fs-extra';\nimport glob from 'tiny-glob';\nimport {build as viteBuild, Manifest, UserConfig} from 'vite';\nimport {pluginRoot} from '../../render/vite-plugin-root.js';\nimport {BuildAssetMap} from '../../render/asset-map/build-asset-map.js';\nimport {loadRootConfig} from '../load-config.js';\nimport {\n copyDir,\n isDirectory,\n isJsFile,\n loadJson,\n makeDir,\n rmDir,\n writeFile,\n} from '../../core/fsutils.js';\nimport {htmlMinify} from '../../render/html-minify.js';\nimport {dim} from 'kleur/colors';\nimport {getVitePlugins} from '../../core/plugin.js';\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\n\ntype RenderModule = typeof import('../../render/render.js');\n\ninterface BuildOptions {\n ssrOnly?: boolean;\n mode?: string;\n}\n\nexport async function build(rootProjectDir?: string, options?: BuildOptions) {\n const rootDir = path.resolve(rootProjectDir || process.cwd());\n const rootConfig = await loadRootConfig(rootDir);\n const distDir = path.join(rootDir, 'dist');\n const ssrOnly = options?.ssrOnly || false;\n const mode = options?.mode || 'production';\n\n console.log();\n console.log(`${dim('┃')} project: ${rootDir}`);\n console.log(`${dim('┃')} output: ${distDir}/html`);\n console.log(`${dim('┃')} mode: ${mode}`);\n console.log();\n\n await rmDir(distDir);\n await makeDir(distDir);\n\n const pages: string[] = [];\n if (await isDirectory(path.join(rootDir, 'routes'))) {\n const pageFiles = await glob(path.join(rootDir, 'routes/**/*'));\n pageFiles.forEach((file) => {\n const parts = path.parse(file);\n if (!parts.name.startsWith('_') && isJsFile(parts.base)) {\n pages.push(file);\n }\n });\n }\n\n const elementsDirs = [path.join(rootDir, 'elements')];\n const elementsInclude = rootConfig.elements?.include || [];\n const excludePatterns = rootConfig.elements?.exclude || [];\n const excludeElement = (moduleId: string) => {\n return excludePatterns.some((pattern) => Boolean(moduleId.match(pattern)));\n };\n\n for (const dirPath of elementsInclude) {\n const elementsDir = path.resolve(rootDir, dirPath);\n if (!elementsDir.startsWith(rootDir)) {\n throw new Error(\n `the elements dir (${dirPath}) should be relative to the project's root dir (${rootDir})`\n );\n }\n elementsDirs.push(elementsDir);\n }\n const elements: string[] = [];\n const elementMap: Record<string, string> = {};\n for (const dirPath of elementsDirs) {\n if (await isDirectory(dirPath)) {\n const elementFiles = await glob('**/*', {cwd: dirPath});\n elementFiles.forEach((file) => {\n const parts = path.parse(file);\n if (isJsFile(parts.base)) {\n const fullPath = path.join(dirPath, file);\n const moduleId = fullPath.slice(rootDir.length);\n if (!excludeElement(moduleId)) {\n elements.push(fullPath);\n elementMap[parts.name] = moduleId;\n }\n }\n });\n }\n }\n\n const bundleScripts: string[] = [];\n if (await isDirectory(path.join(rootDir, 'bundles'))) {\n const bundleFiles = await glob(path.join(rootDir, 'bundles/*'));\n bundleFiles.forEach((file) => {\n const parts = path.parse(file);\n if (isJsFile(parts.base)) {\n bundleScripts.push(file);\n }\n });\n }\n\n const viteConfig = rootConfig.vite || {};\n const vitePlugins = [\n pluginRoot({rootDir, rootConfig}),\n ...(viteConfig.plugins || []),\n ...getVitePlugins(rootConfig.plugins || []),\n ];\n\n const baseConfig: UserConfig = {\n ...viteConfig,\n root: rootDir,\n mode: mode,\n esbuild: {\n jsx: 'automatic',\n jsxImportSource: 'preact',\n treeShaking: true,\n },\n plugins: vitePlugins,\n };\n\n // Bundle the render.js file with vite, which is pre-optimized for rendering\n // HTML routes.\n await viteBuild({\n ...baseConfig,\n publicDir: false,\n build: {\n rollupOptions: {\n input: [path.resolve(__dirname, './render.js')],\n output: {\n format: 'esm',\n chunkFileNames: 'chunks/[name].[hash].js',\n assetFileNames: 'assets/[name].[hash][extname]',\n },\n },\n outDir: path.join(distDir, 'server'),\n ssr: true,\n ssrManifest: false,\n cssCodeSplit: true,\n target: 'esnext',\n minify: false,\n polyfillModulePreload: false,\n reportCompressedSize: false,\n },\n ssr: {\n noExternal: ['@blinkk/root'],\n },\n });\n\n // Pre-render any client scripts and CSS deps.\n await viteBuild({\n ...baseConfig,\n publicDir: false,\n build: {\n rollupOptions: {\n input: [...pages, ...elements, ...bundleScripts],\n output: {\n format: 'esm',\n chunkFileNames: 'chunks/[name].[hash].js',\n assetFileNames: 'assets/[name].[hash][extname]',\n },\n },\n outDir: path.join(distDir, 'client'),\n ssr: false,\n ssrManifest: false,\n manifest: true,\n cssCodeSplit: true,\n target: 'esnext',\n minify: true,\n polyfillModulePreload: false,\n reportCompressedSize: false,\n },\n });\n\n const viteManifest = await loadJson<Manifest>(\n path.join(distDir, 'client/manifest.json')\n );\n\n // Use the output of the client build to generate an asset map, which is used\n // by the renderer for automatically injecting dependencies for a page.\n const assetMap = BuildAssetMap.fromViteManifest(viteManifest, elementMap);\n\n // Save the asset map to `dist/client` for use by the prod SSR server.\n writeFile(\n path.join(distDir, 'client/root-manifest.json'),\n JSON.stringify(assetMap.toJson(), null, 2)\n );\n\n // Write SSG output to `dist/html`.\n const buildDir = path.join(distDir, 'html');\n\n // Recursively copy files from `public` to `dist/html`.\n const publicDir = path.join(rootDir, 'public');\n if (fsExtra.existsSync(path.join(rootDir, 'public'))) {\n fsExtra.copySync(publicDir, buildDir);\n } else {\n makeDir(buildDir);\n }\n\n // Copy files from `dist/client/{assets,chunks}` to `dist/html`.\n copyDir(path.join(distDir, 'client/assets'), path.join(buildDir, 'assets'));\n copyDir(path.join(distDir, 'client/chunks'), path.join(buildDir, 'chunks'));\n\n // Pre-render HTML pages (SSG).\n if (!ssrOnly) {\n const render: RenderModule = await import(\n path.join(distDir, 'server/render.js')\n );\n const renderer = new render.Renderer(rootConfig, {assetMap});\n const sitemap = await renderer.getSitemap();\n\n await Promise.all(\n Object.keys(sitemap).map(async (urlPath) => {\n const {route, params} = sitemap[urlPath];\n const data = await renderer.renderRoute(route, {\n routeParams: params,\n });\n\n // The renderer currently assumes that all paths serve HTML.\n // TODO(stevenle): support non-HTML routes using `routes/[name].[ext].ts`.\n let outPath = path.join(distDir, `html${urlPath}`, 'index.html');\n\n if (outPath.endsWith('404/index.html')) {\n outPath = outPath.replace('404/index.html', '404.html');\n }\n\n const html = await htmlMinify(data.html || '');\n await writeFile(outPath, html);\n\n const relPath = outPath.slice(path.dirname(distDir).length + 1);\n console.log(`saved ${relPath}`);\n })\n );\n }\n}\n","import {Manifest} from 'vite';\nimport {Asset, AssetMap} from './asset-map';\n\nexport type BuildAssetManifest = Record<\n string,\n {\n moduleId: string;\n assetUrl: string;\n importedModules: string[];\n importedCss: string[];\n isElement: boolean;\n }\n>;\n\nexport class BuildAssetMap implements AssetMap {\n private moduleIdToAsset: Map<string, BuildAsset>;\n\n constructor() {\n this.moduleIdToAsset = new Map();\n }\n\n async get(moduleId: string): Promise<Asset | null> {\n return this.moduleIdToAsset.get(moduleId) || null;\n }\n\n private add(asset: BuildAsset) {\n this.moduleIdToAsset.set(asset.moduleId, asset);\n }\n\n toJson(): BuildAssetManifest {\n const result: BuildAssetManifest = {};\n for (const moduleId of this.moduleIdToAsset.keys()) {\n result[moduleId] = this.moduleIdToAsset.get(moduleId)!.toJson();\n }\n return result;\n }\n\n static fromViteManifest(\n viteManifest: Manifest,\n elementMap: Record<string, string>\n ) {\n const assetMap = new BuildAssetMap();\n\n const elementModuleIds = new Set();\n Object.values(elementMap).forEach((moduleId) =>\n elementModuleIds.add(moduleId)\n );\n\n Object.keys(viteManifest).forEach((manifestKey) => {\n const moduleId = `/${manifestKey}`;\n const manifestChunk = viteManifest[manifestKey];\n const isElement = elementModuleIds.has(moduleId);\n const assetData = {\n moduleId,\n assetUrl: `/${manifestChunk.file}`,\n importedModules: (manifestChunk.imports || []).map(\n (relPath) => `/${relPath}`\n ),\n importedCss: (manifestChunk.css || []).map((relPath) => `/${relPath}`),\n isElement: isElement,\n };\n assetMap.add(new BuildAsset(assetMap, assetData));\n });\n return assetMap;\n }\n\n static fromRootManifest(rootManifest: BuildAssetManifest) {\n const assetMap = new BuildAssetMap();\n Object.keys(rootManifest).forEach((moduleId) => {\n const assetData = rootManifest[moduleId];\n assetMap.add(new BuildAsset(assetMap, assetData));\n });\n return assetMap;\n }\n}\n\nexport class BuildAsset {\n moduleId: string;\n assetUrl: string;\n private assetMap: BuildAssetMap;\n private importedModules: string[];\n private importedCss: string[];\n isElement: boolean;\n\n constructor(\n assetMap: BuildAssetMap,\n assetData: {\n moduleId: string;\n assetUrl: string;\n importedModules: string[];\n importedCss: string[];\n isElement: boolean;\n }\n ) {\n this.assetMap = assetMap;\n this.moduleId = assetData.moduleId;\n this.assetUrl = assetData.assetUrl;\n this.importedModules = assetData.importedModules;\n this.importedCss = assetData.importedCss;\n this.isElement = assetData.isElement;\n }\n\n async getCssDeps(): Promise<string[]> {\n const visited = new Set<string>();\n const deps = new Set<string>();\n await this.collectCss(this, deps, visited);\n return Array.from(deps);\n }\n\n async getJsDeps(): Promise<string[]> {\n const visited = new Set<string>();\n const deps = new Set<string>();\n await this.collectJs(this, deps, visited);\n return Array.from(deps);\n }\n\n private async collectJs(\n asset: BuildAsset | null,\n urls: Set<string>,\n visited: Set<string>\n ) {\n if (!asset) {\n return;\n }\n if (!asset.moduleId) {\n return;\n }\n if (visited.has(asset.moduleId)) {\n return;\n }\n visited.add(asset.moduleId);\n if (asset.isElement) {\n urls.add(asset.assetUrl);\n }\n await Promise.all(\n asset.importedModules.map(async (moduleId) => {\n const importedAsset = (await this.assetMap.get(moduleId)) as BuildAsset;\n this.collectJs(importedAsset, urls, visited);\n })\n );\n }\n\n private async collectCss(\n asset: BuildAsset | null,\n urls: Set<string>,\n visited: Set<string>\n ) {\n if (!asset) {\n return;\n }\n if (!asset.assetUrl) {\n return;\n }\n if (visited.has(asset.moduleId)) {\n return;\n }\n visited.add(asset.moduleId);\n if (asset.importedCss) {\n asset.importedCss.forEach((cssUrl) => urls.add(cssUrl));\n }\n await Promise.all(\n asset.importedModules.map(async (moduleId) => {\n const importedAsset = (await this.assetMap.get(moduleId)) as BuildAsset;\n this.collectCss(importedAsset, urls, visited);\n })\n );\n }\n\n toJson() {\n return {\n moduleId: this.moduleId,\n assetUrl: this.assetUrl,\n importedModules: this.importedModules,\n importedCss: this.importedCss,\n isElement: this.isElement,\n };\n }\n}\n","import path from 'node:path';\nimport {default as express} from 'express';\nimport {Request, Response, NextFunction, Server} from '../../core/types.js';\nimport {loadRootConfig} from '../load-config';\nimport {Renderer} from '../../render/render.js';\nimport {fileExists, loadJson} from '../../core/fsutils';\nimport {\n BuildAssetManifest,\n BuildAssetMap,\n} from '../../render/asset-map/build-asset-map';\nimport {htmlMinify} from '../../render/html-minify';\nimport {dim} from 'kleur/colors';\nimport {configureServerPlugins} from '../../core/plugin';\nimport sirv from 'sirv';\nimport compression from 'compression';\nimport {rootProjectMiddleware} from '../../core/middleware';\nimport {RootConfig} from '../../core/config';\n\ntype RenderModule = typeof import('../../render/render.js');\n\nexport async function preview(rootProjectDir?: string) {\n // TODO(stevenle): figure out standard practice for NODE_ENV when using the\n // preview command.\n process.env.NODE_ENV = 'development';\n const rootDir = path.resolve(rootProjectDir || process.cwd());\n const server = await createServer({rootDir});\n const port = parseInt(process.env.PORT || '4007');\n console.log();\n console.log(`${dim('┃')} project: ${rootDir}`);\n console.log(`${dim('┃')} server: http://localhost:${port}`);\n console.log(`${dim('┃')} mode: staging`);\n console.log();\n server.listen(port);\n}\n\nasync function createServer(options: {rootDir: string}): Promise<Server> {\n const rootDir = options.rootDir;\n const rootConfig = await loadRootConfig(rootDir);\n const distDir = path.join(rootDir, 'dist');\n\n const server = express();\n server.disable('x-powered-by');\n server.use(compression());\n\n // Inject request context vars.\n server.use(rootProjectMiddleware({rootDir, rootConfig}));\n server.use(await rootPreviewRendererMiddleware({rootConfig, distDir}));\n\n const plugins = rootConfig.plugins || [];\n configureServerPlugins(\n server,\n async () => {\n // Add user-configured middlewares from `root.config.ts`.\n const userMiddlewares = rootConfig.server?.middlewares || [];\n userMiddlewares.forEach((middleware) => {\n server.use(middleware);\n });\n\n // Add static file middleware.\n const publicDir = path.join(distDir, 'html');\n server.use(sirv(publicDir, {dev: false}));\n\n // Add the root.js preview server middlewares.\n server.use(rootPreviewServerMiddleware());\n // TODO(stevenle): handle 404/500 errors.\n },\n plugins,\n {type: 'preview'}\n );\n return server;\n}\n\n/**\n * Injects a renderer into the request.\n */\nasync function rootPreviewRendererMiddleware(options: {\n rootConfig: RootConfig;\n distDir: string;\n}) {\n const {distDir, rootConfig} = options;\n const render: RenderModule = await import(\n path.join(distDir, 'server/render.js')\n );\n const manifestPath = path.join(distDir, 'client/root-manifest.json');\n if (!(await fileExists(manifestPath))) {\n throw new Error(\n `could not find ${manifestPath}. run \\`root build\\` before \\`root preview\\`.`\n );\n }\n const rootManifest = await loadJson<BuildAssetManifest>(manifestPath);\n const assetMap = BuildAssetMap.fromRootManifest(rootManifest);\n const renderer = new render.Renderer(rootConfig, {assetMap}) as Renderer;\n return async (req: Request, _: Response, next: NextFunction) => {\n req.renderer = renderer;\n next();\n };\n}\n\n/**\n * Preview server request handler.\n */\nfunction rootPreviewServerMiddleware() {\n return async (req: Request, res: Response, next: NextFunction) => {\n const rootConfig = req.rootConfig!;\n const renderer = req.renderer!;\n try {\n const url = req.originalUrl;\n const data = await renderer.render(url);\n if (data.notFound || !data.html) {\n next();\n return;\n }\n let html = data.html || '';\n if (rootConfig.minifyHtml !== false) {\n html = await htmlMinify(html);\n }\n res.status(200).set({'Content-Type': 'text/html'}).end(html);\n } catch (e) {\n try {\n const {html} = await renderer.renderError(e);\n res.status(500).set({'Content-Type': 'text/html'}).end(html);\n } catch (e2) {\n console.error('failed to render custom error');\n console.error(e2);\n next(e);\n }\n }\n };\n}\n","import path from 'node:path';\nimport {default as express} from 'express';\nimport {loadRootConfig} from '../load-config';\nimport {Renderer} from '../../render/render.js';\nimport {fileExists, loadJson} from '../../core/fsutils';\nimport {\n BuildAssetManifest,\n BuildAssetMap,\n} from '../../render/asset-map/build-asset-map';\nimport {htmlMinify} from '../../render/html-minify';\nimport {dim} from 'kleur/colors';\nimport {configureServerPlugins} from '../../core/plugin';\nimport sirv from 'sirv';\nimport compression from 'compression';\nimport {Request, Response, NextFunction, Server} from '../../core/types.js';\nimport {rootProjectMiddleware} from '../../core/middleware';\nimport {RootConfig} from '../../core/config';\n\ntype RenderModule = typeof import('../../render/render.js');\n\nexport async function start(rootProjectDir?: string) {\n process.env.NODE_ENV = 'production';\n const rootDir = path.resolve(rootProjectDir || process.cwd());\n const server = await createServer({rootDir});\n const port = parseInt(process.env.PORT || '4007');\n console.log();\n console.log(`${dim('┃')} project: ${rootDir}`);\n console.log(`${dim('┃')} server: http://localhost:${port}`);\n console.log(`${dim('┃')} mode: production`);\n console.log();\n server.listen(port);\n}\n\nasync function createServer(options: {rootDir: string}): Promise<Server> {\n const rootDir = options.rootDir;\n const rootConfig = await loadRootConfig(rootDir);\n const distDir = path.join(rootDir, 'dist');\n\n const server = express();\n server.disable('x-powered-by');\n server.use(compression());\n\n // Inject request context vars.\n server.use(rootProjectMiddleware({rootDir, rootConfig}));\n server.use(await rootProdRendererMiddleware({rootConfig, distDir}));\n\n const plugins = rootConfig.plugins || [];\n configureServerPlugins(\n server,\n async () => {\n // Add user-configured middlewares from `root.config.ts`.\n const userMiddlewares = rootConfig.server?.middlewares || [];\n userMiddlewares.forEach((middleware) => {\n server.use(middleware);\n });\n\n // Add static file middleware.\n const publicDir = path.join(distDir, 'html');\n server.use(sirv(publicDir, {dev: false}));\n\n // Add the root.js preview server middlewares.\n server.use(rootProdServerMiddleware());\n // TODO(stevenle): handle 404/500 errors.\n },\n plugins,\n {type: 'prod'}\n );\n return server;\n}\n\n/**\n * Injects a renderer into the request.\n */\nasync function rootProdRendererMiddleware(options: {\n rootConfig: RootConfig;\n distDir: string;\n}) {\n const {distDir, rootConfig} = options;\n const render: RenderModule = await import(\n path.join(distDir, 'server/render.js')\n );\n const manifestPath = path.join(distDir, 'client/root-manifest.json');\n if (!(await fileExists(manifestPath))) {\n throw new Error(\n `could not find ${manifestPath}. run \\`root build\\` before \\`root preview\\`.`\n );\n }\n const rootManifest = await loadJson<BuildAssetManifest>(manifestPath);\n const assetMap = BuildAssetMap.fromRootManifest(rootManifest);\n const renderer = new render.Renderer(rootConfig, {assetMap}) as Renderer;\n return async (req: Request, _: Response, next: NextFunction) => {\n req.renderer = renderer;\n next();\n };\n}\n\n/**\n * Preview server request handler.\n */\nfunction rootProdServerMiddleware() {\n return async (req: Request, res: Response, next: NextFunction) => {\n const rootConfig = req.rootConfig!;\n const renderer = req.renderer!;\n try {\n const url = req.originalUrl;\n const data = await renderer.render(url);\n if (data.notFound || !data.html) {\n next();\n return;\n }\n let html = data.html || '';\n if (rootConfig.minifyHtml !== false) {\n html = await htmlMinify(html);\n }\n res.status(200).set({'Content-Type': 'text/html'}).end(html);\n } catch (e) {\n try {\n const {html} = await renderer.renderError(e);\n res.status(500).set({'Content-Type': 'text/html'}).end(html);\n } catch (e2) {\n console.error('failed to render custom error');\n console.error(e2);\n next(e);\n }\n }\n };\n}\n"],"mappings":";;;;;;AAAA,OAAOA,WAAU;AACjB,SAAQ,qBAAoB;AAC5B,SAAQ,WAAW,eAAc;AACjC,SAAQ,gBAAgB,wBAAuB;;;ACH/C,OAAOC,WAAU;AACjB,OAAO,UAAU;;;ACDjB,SAAQ,YAAY,UAAS;AAC7B,OAAO,UAAU;AACjB,OAAO,aAAa;AAEb,SAAS,SAAS,UAAkB;AACzC,SAAO,CAAC,CAAC,SAAS,MAAM,aAAa;AACvC;AAEA,eAAsB,UAAU,UAAkB,SAAiB;AACjE,QAAM,UAAU,KAAK,QAAQ,QAAQ;AACrC,QAAM,QAAQ,OAAO;AACrB,QAAM,GAAG,UAAU,UAAU,OAAO;AACtC;AAEA,eAAsB,QAAQ,SAAiB;AAC7C,MAAI;AACF,UAAM,GAAG,OAAO,OAAO;AAAA,EACzB,SAAS,GAAP;AACA,UAAM,GAAG,MAAM,SAAS,EAAC,WAAW,KAAI,CAAC;AAAA,EAC3C;AACF;AAEA,eAAsB,QAAQ,QAAgB,QAAgB;AAC5D,MAAI,CAAC,QAAQ,WAAW,MAAM,GAAG;AAC/B;AAAA,EACF;AACA,UAAQ,SAAS,QAAQ,QAAQ,EAAC,WAAW,MAAM,WAAW,KAAI,CAAC;AACrE;AAEA,eAAsB,MAAM,SAAiB;AAC3C,QAAM,GAAG,GAAG,SAAS,EAAC,WAAW,MAAM,OAAO,KAAI,CAAC;AACrD;AAEA,eAAsB,SAAsB,UAA8B;AACxE,QAAM,UAAU,MAAM,GAAG,SAAS,UAAU,OAAO;AACnD,SAAO,KAAK,MAAM,OAAO;AAC3B;AAEA,eAAsB,YAAY,SAAiB;AACjD,SAAO,GACJ,KAAK,OAAO,EACZ,KAAK,CAAC,WAAW;AAChB,WAAO,OAAO,YAAY;AAAA,EAC5B,CAAC,EACA,MAAM,CAAC,QAAQ;AACd,QAAI,IAAI,SAAS,UAAU;AACzB,aAAO;AAAA,IACT;AACA,UAAM;AAAA,EACR,CAAC;AACL;AAEO,SAAS,WAAW,UAAoC;AAC7D,SAAO,GACJ,OAAO,QAAQ,EACf,KAAK,MAAM,IAAI,EACf,MAAM,MAAM,KAAK;AACtB;;;ADpDA,IAAM,qBAAqB;AAC3B,IAAM,sBAAsB;AAOrB,SAAS,WAAW,SAA6B;AAbxD;AAcE,QAAM,oBAAoB;AAC1B,QAAM,4BAA4B,OAAO;AAEzC,QAAM,WAAU,mCAAS,YAAW,QAAQ,IAAI;AAChD,QAAM,cAAa,mCAAS,eAAc,CAAC;AAC3C,QAAM,eAAe,CAACC,MAAK,KAAK,SAAS,UAAU,CAAC;AACpD,QAAM,gBAAc,gBAAW,aAAX,mBAAqB,YAAW,CAAC;AACrD,cAAY,QAAQ,CAAC,YAAY;AAC/B,UAAM,cAAcA,MAAK,QAAQ,SAAS,OAAO;AACjD,QAAI,CAAC,YAAY,WAAW,OAAO,GAAG;AACpC,YAAM,IAAI;AAAA,QACR,qBAAqB,0DAA0D;AAAA,MACjF;AAAA,IACF;AACA,iBAAa,KAAK,WAAW;AAAA,EAC/B,CAAC;AAED,QAAM,oBAAkB,gBAAW,aAAX,mBAAqB,YAAW,CAAC;AACzD,QAAM,iBAAiB,CAAC,aAAqB;AAC3C,WAAO,gBAAgB,KAAK,CAAC,YAAY,QAAQ,SAAS,MAAM,OAAO,CAAC,CAAC;AAAA,EAC3E;AAEA,MAAI;AACJ,iBAAe,mBAAmB;AAChC,iBAAa,CAAC;AACd,UAAM,QAAQ;AAAA,MACZ,aAAa,IAAI,OAAO,YAAoB;AAC1C,cAAM,YAAY,MAAM,YAAY,OAAO;AAC3C,YAAI,CAAC,WAAW;AACd;AAAA,QACF;AACA,cAAM,QAAQ,MAAM,KAAK,QAAQ,EAAC,KAAK,QAAO,CAAC;AAC/C,cAAM,QAAQ,CAAC,SAAS;AACtB,gBAAM,QAAQA,MAAK,MAAM,IAAI;AAC7B,cAAI,SAAS,MAAM,IAAI,GAAG;AACxB,kBAAM,WAAWA,MAAK,KAAK,SAAS,IAAI;AACxC,kBAAM,WAAW,SAAS,MAAM,QAAQ,MAAM;AAC9C,gBAAI,CAAC,eAAe,QAAQ,GAAG;AAC7B,yBAAW,MAAM,QAAQ;AAAA,YAC3B;AAAA,UACF;AAAA,QACF,CAAC;AAAA,MACH,CAAC;AAAA,IACH;AAAA,EACF;AAEA,iBAAe,iBAAiB,SAAyC;AACvE,QAAI,CAAC,YAAY;AACf,YAAM,iBAAiB;AAAA,IACzB;AACA,QAAI,WAAW,YAAY;AACzB,aAAO,WAAW;AAAA,IACpB;AACA,WAAO;AAAA,EACT;AAEA,WAAS,gBAAgB,IAAY;AACnC,QAAI,CAAC,SAAS,EAAE,GAAG;AACjB,aAAO;AAAA,IACT;AACA,WAAO,aAAa,KAAK,CAAC,gBAAgB;AACxC,aAAO,GAAG,WAAW,WAAW;AAAA,IAClC,CAAC;AAAA,EACH;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IAEN,UAAU,IAAY;AACpB,UAAI,OAAO,mBAAmB;AAC5B,eAAO;AAAA,MACT;AACA,aAAO;AAAA,IACT;AAAA,IAEA,MAAM,KAAK,IAAY;AACrB,UAAI,OAAO,2BAA2B;AACpC,cAAM,iBAAiB;AACvB,eAAO,8BAA8B,KAAK,UAAU,UAAU;AAAA,MAChE;AACA,aAAO;AAAA,IACT;AAAA,IAEA,MAAM,UAAU,KAAa,IAA0B;AACrD,UAAI,gBAAgB,EAAE,GAAG;AACvB,cAAM,UAAUA,MAAK,MAAM,EAAE;AAC7B,cAAM,OAAO,oBAAI,IAAY;AAC7B,cAAM,WAAW;AAAA,UACf,GAAG,IAAI,SAAS,kBAAkB;AAAA,UAClC,GAAG,IAAI,SAAS,mBAAmB;AAAA,QACrC;AACA,mBAAW,SAAS,UAAU;AAC5B,gBAAM,UAAU,MAAM;AAEtB,cAAI,CAAC,QAAQ,SAAS,GAAG,GAAG;AAC1B;AAAA,UACF;AAEA,cAAI,YAAY,QAAQ,MAAM;AAC5B;AAAA,UACF;AACA,eAAK,IAAI,OAAO;AAAA,QAClB;AACA,cAAM,aAAuB,CAAC;AAC9B,cAAM,QAAQ;AAAA,UACZ,MAAM,KAAK,IAAI,EAAE,IAAI,OAAO,YAAY;AACtC,kBAAM,YAAY,MAAM,iBAAiB,OAAO;AAChD,gBAAI,WAAW;AACb,yBAAW,KAAK,SAAS;AAAA,YAC3B;AAAA,UACF,CAAC;AAAA,QACH;AACA,YAAI,WAAW,SAAS,GAAG;AACzB,gBAAM,cAAc,WACjB,IAAI,CAAC,QAAQ,WAAW,OAAO,EAC/B,KAAK,IAAI;AACZ,gBAAM,OAAO,GAAG;AAAA;AAAA;AAAA,EAGxB;AAAA;AAEQ,iBAAO,EAAC,KAAI;AAAA,QACd;AACA,eAAO;AAAA,MACT;AACA,aAAO;AAAA,IACT;AAAA,EACF;AACF;;;AE9IA,OAAOC,WAAU;AAIV,IAAM,oBAAN,MAA4C;AAAA,EAGjD,YAAY,aAA0B;AACpC,SAAK,cAAc;AAAA,EACrB;AAAA,EAEA,MAAM,IAAI,UAAyC;AACjD,UAAM,aAAa,MAAM,KAAK,YAAY,eAAe,QAAQ;AACjE,QAAI,CAAC,cAAc,CAAC,WAAW,IAAI;AAGjC,aAAO;AAAA,QACL;AAAA,QACA,UAAU;AAAA,QACV,YAAY,YAAY,CAAC;AAAA,QACzB,WAAW,YAAY,CAAC,QAAQ;AAAA,MAClC;AAAA,IACF;AACA,WAAO,IAAI,eAAe,MAAM,UAAU;AAAA,EAC5C;AACF;AAEO,IAAM,iBAAN,MAAsC;AAAA,EAM3C,YAAY,UAAoB,YAAwB;AACtD,SAAK,WAAW;AAChB,SAAK,aAAa;AAClB,SAAK,WAAW,KAAK,WAAW;AAChC,SAAK,WAAW,KAAK,WAAW;AAAA,EAClC;AAAA,EAEA,MAAM,aAAgC;AACpC,UAAM,UAAU,oBAAI,IAAY;AAChC,UAAM,OAAO,oBAAI,IAAY;AAC7B,SAAK,WAAW,MAAM,MAAM,OAAO;AACnC,WAAO,MAAM,KAAK,IAAI;AAAA,EACxB;AAAA,EAEA,MAAM,YAA+B;AACnC,UAAM,UAAU,oBAAI,IAAY;AAChC,UAAM,OAAO,oBAAI,IAAY;AAC7B,SAAK,UAAU,MAAM,MAAM,OAAO;AAClC,WAAO,MAAM,KAAK,IAAI;AAAA,EACxB;AAAA,EAEA,qBAAqB;AACnB,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA,EAEQ,UACN,OACA,MACA,SACA;AACA,QAAI,CAAC,OAAO;AACV;AAAA,IACF;AACA,QAAI,CAAC,MAAM,UAAU;AACnB;AAAA,IACF;AACA,QAAI,QAAQ,IAAI,MAAM,QAAQ,GAAG;AAC/B;AAAA,IACF;AACA,YAAQ,IAAI,MAAM,QAAQ;AAC1B,UAAM,QAAQA,MAAK,MAAM,MAAM,QAAQ;AACvC,QACE,CAAC,OAAO,QAAQ,OAAO,MAAM,EAAE,SAAS,MAAM,GAAG,KACjD,MAAM,SAAS,SAAS,YAAY,GACpC;AACA,WAAK,IAAI,MAAM,QAAQ;AAAA,IACzB;AACA,UAAM,mBAAmB,EAAE,QAAQ,CAAC,eAAe;AACjD,UAAI,WAAW,IAAI;AACjB,cAAM,gBAAgB,IAAI,eAAe,KAAK,UAAU,UAAU;AAClE,aAAK,UAAU,eAAe,MAAM,OAAO;AAAA,MAC7C;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEQ,WACN,OACA,MACA,SACA;AACA,QAAI,CAAC,OAAO;AACV;AAAA,IACF;AACA,QAAI,CAAC,MAAM,UAAU;AACnB;AAAA,IACF;AACA,QAAI,QAAQ,IAAI,MAAM,QAAQ,GAAG;AAC/B;AAAA,IACF;AACA,YAAQ,IAAI,MAAM,QAAQ;AAC1B,QAAI,MAAM,SAAS,SAAS,OAAO,GAAG;AACpC,YAAM,QAAQA,MAAK,MAAM,MAAM,QAAQ;AACvC,UAAI,CAAC,MAAM,KAAK,WAAW,GAAG,GAAG;AAC/B,aAAK,IAAI,MAAM,QAAQ;AAAA,MACzB;AAAA,IACF;AACA,UAAM,mBAAmB,EAAE,QAAQ,CAAC,eAAe;AACjD,UAAI,WAAW,IAAI;AACjB,cAAM,gBAAgB,IAAI,eAAe,KAAK,UAAU,UAAU;AAClE,aAAK,WAAW,eAAe,MAAM,OAAO;AAAA,MAC9C;AAAA,IACF,CAAC;AAAA,EACH;AACF;;;ACpHA,SAAQ,qBAAoB;AAC5B,OAAO,YAAY;AAGnB,eAAsB,eAAe,SAAsC;AACzE,QAAM,SAAS,IAAI,OAAO;AAC1B,QAAM,aAAa,MAAM,OAAO,QAAQ;AAAA,IACtC,KAAK;AAAA,IACL,OAAO,CAAC,gBAAgB;AAAA,EAC1B,CAAC;AACD,MAAI,YAAY;AACd,UAAM,eAAe,MAAM,cAAc;AAAA,MACvC,UAAU;AAAA,IACZ,CAAC;AACD,WAAO,aAAa,IAAI,WAAW,CAAC;AAAA,EACtC;AACA,SAAO,CAAC;AACV;;;ACjBA,SAAQ,cAAa;AAErB,eAAsB,WAAW,MAA+B;AAC9D,MAAI;AACF,UAAM,MAAM,MAAM,OAAO,MAAM;AAAA,MAC7B,oBAAoB;AAAA,MACpB,gBAAgB;AAAA,MAChB,oBAAoB;AAAA,IACtB,CAAC;AACD,WAAO,IAAI,UAAU;AAAA,EACvB,SAAS,GAAP;AACA,YAAQ,MAAM,0BAA0B,CAAC;AACzC,WAAO;AAAA,EACT;AACF;;;ALLA,OAAOC,WAAU;AACjB,SAAQ,WAAU;;;AMJX,SAAS,sBAAsB,SAGnC;AACD,SAAO,CAAC,KAAc,GAAa,SAAuB;AACxD,QAAI,aAAa,OAAO,OAAO,CAAC,GAAG,QAAQ,YAAY;AAAA,MACrD,SAAS,QAAQ;AAAA,IACnB,CAAC;AACD,SAAK;AAAA,EACP;AACF;;;ANAA,IAAM,YAAYC,MAAK,QAAQ,cAAc,YAAY,GAAG,CAAC;AAE7D,eAAsB,IAAI,gBAAyB;AACjD,UAAQ,IAAI,WAAW;AACvB,QAAM,UAAUA,MAAK,QAAQ,kBAAkB,QAAQ,IAAI,CAAC;AAC5D,QAAM,SAAS,MAAM,aAAa,EAAC,QAAO,CAAC;AAC3C,QAAM,OAAO,SAAS,QAAQ,IAAI,QAAQ,MAAM;AAChD,UAAQ,IAAI;AACZ,UAAQ,IAAI,GAAG,IAAI,QAAG,eAAe,SAAS;AAC9C,UAAQ,IAAI,GAAG,IAAI,QAAG,gCAAgC,MAAM;AAC5D,UAAQ,IAAI,GAAG,IAAI,QAAG,yBAAyB;AAC/C,UAAQ,IAAI;AACZ,SAAO,OAAO,IAAI;AACpB;AAEA,eAAe,aAAa,SAA+C;AACzE,QAAM,UAAUA,MAAK,SAAQ,mCAAS,YAAW,QAAQ,IAAI,CAAC;AAC9D,QAAM,aAAa,MAAM,eAAe,OAAO;AAE/C,QAAM,SAAS,QAAQ;AACvB,SAAO,QAAQ,cAAc;AAG7B,SAAO,IAAI,sBAAsB,EAAC,SAAS,WAAU,CAAC,CAAC;AACvD,SAAO,IAAI,MAAM,qBAAqB,EAAC,SAAS,WAAU,CAAC,CAAC;AAC5D,SAAO,IAAI,0BAA0B,CAAC;AAEtC,QAAM,UAAU,WAAW,WAAW,CAAC;AACvC,QAAM;AAAA,IACJ;AAAA,IACA,YAAY;AA9ChB;AAgDM,YAAM,oBAAkB,gBAAW,WAAX,mBAAmB,gBAAe,CAAC;AAC3D,iBAAW,cAAc,iBAAiB;AACxC,eAAO,IAAI,UAAU;AAAA,MACvB;AAEA,aAAO,IAAI,wBAAwB,CAAC;AACpC,aAAO,IAAI,2BAA2B,CAAC;AAAA,IACzC;AAAA,IACA;AAAA,IACA,EAAC,MAAM,MAAK;AAAA,EACd;AAEA,SAAO;AACT;AAMA,eAAe,qBAAqB,SAGjC;AAtEH;AAuEE,QAAM,UAAU,QAAQ;AACxB,QAAM,aAAa,QAAQ;AAC3B,QAAM,aAAa,WAAW,QAAQ,CAAC;AAEvC,QAAM,aAAuB,CAAC;AAC9B,MAAI,MAAM,YAAYA,MAAK,KAAK,SAAS,QAAQ,CAAC,GAAG;AACnD,UAAM,YAAY,MAAMC,MAAK,eAAe,EAAC,KAAK,QAAO,CAAC;AAC1D,cAAU,QAAQ,CAAC,SAAS;AAC1B,YAAM,QAAQD,MAAK,MAAM,IAAI;AAC7B,UAAI,CAAC,MAAM,KAAK,WAAW,GAAG,KAAK,SAAS,MAAM,IAAI,GAAG;AACvD,mBAAW,KAAK,IAAI;AAAA,MACtB;AAAA,IACF,CAAC;AAAA,EACH;AAEA,QAAM,eAAe,CAACA,MAAK,KAAK,SAAS,UAAU,CAAC;AACpD,QAAM,oBAAkB,gBAAW,aAAX,mBAAqB,YAAW,CAAC;AACzD,QAAM,oBAAkB,gBAAW,aAAX,mBAAqB,YAAW,CAAC;AACzD,QAAM,iBAAiB,CAAC,aAAqB;AAC3C,WAAO,gBAAgB,KAAK,CAAC,YAAY,QAAQ,SAAS,MAAM,OAAO,CAAC,CAAC;AAAA,EAC3E;AAEA,aAAW,WAAW,iBAAiB;AACrC,UAAM,cAAcA,MAAK,QAAQ,SAAS,OAAO;AACjD,QAAI,CAAC,YAAY,WAAW,OAAO,GAAG;AACpC,YAAM,IAAI;AAAA,QACR,qBAAqB,0DAA0D;AAAA,MACjF;AAAA,IACF;AACA,iBAAa,KAAK,WAAW;AAAA,EAC/B;AACA,QAAM,WAAqB,CAAC;AAC5B,aAAW,WAAW,cAAc;AAClC,QAAI,MAAM,YAAY,OAAO,GAAG;AAC9B,YAAM,eAAe,MAAMC,MAAK,QAAQ,EAAC,KAAK,QAAO,CAAC;AACtD,mBAAa,QAAQ,CAAC,SAAS;AAC7B,cAAM,QAAQD,MAAK,MAAM,IAAI;AAC7B,YAAI,SAAS,MAAM,IAAI,GAAG;AACxB,gBAAM,WAAWA,MAAK,KAAK,SAAS,IAAI;AACxC,gBAAM,WAAW,SAAS,MAAM,QAAQ,MAAM;AAC9C,cAAI,CAAC,eAAe,QAAQ,GAAG;AAC7B,qBAAS,KAAK,SAAS,MAAM,CAAC,CAAC;AAAA,UACjC;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAEA,QAAM,gBAA0B,CAAC;AACjC,MAAI,MAAM,YAAYA,MAAK,KAAK,SAAS,SAAS,CAAC,GAAG;AACpD,UAAM,cAAc,MAAMC,MAAKD,MAAK,KAAK,SAAS,WAAW,CAAC;AAC9D,gBAAY,QAAQ,CAAC,SAAS;AAC5B,YAAM,QAAQA,MAAK,MAAM,IAAI;AAC7B,UAAI,SAAS,MAAM,IAAI,GAAG;AACxB,sBAAc,KAAK,IAAI;AAAA,MACzB;AAAA,IACF,CAAC;AAAA,EACH;AAEA,QAAM,cAAc;AAAA,IAClB,WAAW,EAAC,SAAS,WAAU,CAAC;AAAA,IAChC,GAAI,WAAW,WAAW,CAAC;AAAA,IAC3B,GAAG,eAAe,WAAW,WAAW,CAAC,CAAC;AAAA,EAC5C;AAEA,QAAM,aAAa,MAAM,iBAAiB;AAAA,IACxC,GAAG;AAAA,IACH,MAAM;AAAA,IACN,MAAM;AAAA,IACN,WAAWA,MAAK,KAAK,SAAS,QAAQ;AAAA,IACtC,QAAQ,EAAC,gBAAgB,KAAI;AAAA,IAC7B,SAAS;AAAA,IACT,cAAc;AAAA,MACZ,SAAS;AAAA,QACP,GAAG;AAAA,QACH,GAAG;AAAA,QACH,GAAG;AAAA,QACH,KAAI,gBAAW,iBAAX,mBAAyB,YAAW,CAAC;AAAA,MAC3C;AAAA,IACF;AAAA,IACA,KAAK;AAAA,MACH,YAAY,CAAC,cAAc;AAAA,IAC7B;AAAA,IACA,SAAS;AAAA,MACP,KAAK;AAAA,MACL,iBAAiB;AAAA,IACnB;AAAA,IACA,SAAS;AAAA,EACX,CAAC;AACD,SAAO,OAAO,KAAc,GAAa,SAAuB;AAC9D,QAAI,aAAa;AACjB,SAAK;AAAA,EACP;AACF;AAEA,SAAS,4BAA4B;AACnC,QAAM,mBAAmBA,MAAK,QAAQ,WAAW,aAAa;AAC9D,SAAO,OAAO,KAAc,GAAa,SAAuB;AAC9D,UAAM,aAAa,IAAI;AACvB,UAAM,aAAa,IAAI;AAEvB,UAAM,SAAS,MAAM,WAAW,cAAc,gBAAgB;AAE9D,UAAM,WAAW,IAAI,kBAAkB,WAAW,WAAW;AAC7D,QAAI,WAAW,IAAI,OAAO,SAAS,YAAY,EAAC,SAAQ,CAAC;AACzD,SAAK;AAAA,EACP;AACF;AAEA,SAAS,0BAA0B;AACjC,SAAO,OAAO,KAAc,KAAe,SAAuB;AAChE,UAAM,MAAM,IAAI;AAChB,UAAM,WAAW,IAAI;AACrB,UAAM,aAAa,IAAI;AACvB,UAAM,aAAa,IAAI;AACvB,QAAI;AACF,YAAM,OAAO,MAAM,SAAS,OAAO,GAAG;AACtC,UAAI,KAAK,YAAY,CAAC,KAAK,MAAM;AAC/B,aAAK;AACL;AAAA,MACF;AAEA,UAAI,OAAO,MAAM,WAAW,mBAAmB,KAAK,KAAK,QAAQ,EAAE;AACnE,UAAI,WAAW,eAAe,OAAO;AACnC,eAAO,MAAM,WAAW,IAAI;AAAA,MAC9B;AACA,UAAI,OAAO,GAAG,EAAE,IAAI,EAAC,gBAAgB,YAAW,CAAC,EAAE,IAAI,IAAI;AAAA,IAC7D,SAAS,GAAP;AAGA,iBAAW,iBAAiB,CAAC;AAC7B,cAAQ,MAAM,CAAC;AACf,UAAI;AACF,YAAI,UAAU;AACZ,gBAAM,EAAC,KAAI,IAAI,MAAM,SAAS,YAAY,CAAC;AAC3C,cAAI,OAAO,GAAG,EAAE,IAAI,EAAC,gBAAgB,YAAW,CAAC,EAAE,IAAI,IAAI;AAAA,QAC7D,OAAO;AACL,eAAK,CAAC;AAAA,QACR;AAAA,MACF,SAAS,IAAP;AACA,gBAAQ,MAAM,+BAA+B;AAC7C,gBAAQ,MAAM,EAAE;AAChB,aAAK,CAAC;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,6BAA6B;AACpC,SAAO,OAAO,KAAc,QAAkB;AAC5C,UAAM,MAAM,IAAI;AAChB,UAAM,MAAMA,MAAK,QAAQ,GAAG;AAC5B,UAAM,WAAW,IAAI;AACrB,QAAI,CAAC,KAAK;AACR,YAAM,OAAO,MAAM,SAAS,mBAAmB;AAC/C,YAAM,OAAO,KAAK,QAAQ;AAC1B,UAAI,OAAO,GAAG,EAAE,IAAI,EAAC,gBAAgB,YAAW,CAAC,EAAE,IAAI,IAAI;AAC3D;AAAA,IACF;AACA,QAAI,OAAO,GAAG,EAAE,IAAI,EAAC,gBAAgB,aAAY,CAAC,EAAE,IAAI,KAAK;AAAA,EAC/D;AACF;;;AOxOA,OAAOE,WAAU;AACjB,SAAQ,iBAAAC,sBAAoB;AAC5B,OAAOC,cAAa;AACpB,OAAOC,WAAU;AACjB,SAAQ,SAAS,iBAAsC;;;ACUhD,IAAM,gBAAN,MAAwC;AAAA,EAG7C,cAAc;AACZ,SAAK,kBAAkB,oBAAI,IAAI;AAAA,EACjC;AAAA,EAEA,MAAM,IAAI,UAAyC;AACjD,WAAO,KAAK,gBAAgB,IAAI,QAAQ,KAAK;AAAA,EAC/C;AAAA,EAEQ,IAAI,OAAmB;AAC7B,SAAK,gBAAgB,IAAI,MAAM,UAAU,KAAK;AAAA,EAChD;AAAA,EAEA,SAA6B;AAC3B,UAAM,SAA6B,CAAC;AACpC,eAAW,YAAY,KAAK,gBAAgB,KAAK,GAAG;AAClD,aAAO,YAAY,KAAK,gBAAgB,IAAI,QAAQ,EAAG,OAAO;AAAA,IAChE;AACA,WAAO;AAAA,EACT;AAAA,EAEA,OAAO,iBACL,cACA,YACA;AACA,UAAM,WAAW,IAAI,cAAc;AAEnC,UAAM,mBAAmB,oBAAI,IAAI;AACjC,WAAO,OAAO,UAAU,EAAE;AAAA,MAAQ,CAAC,aACjC,iBAAiB,IAAI,QAAQ;AAAA,IAC/B;AAEA,WAAO,KAAK,YAAY,EAAE,QAAQ,CAAC,gBAAgB;AACjD,YAAM,WAAW,IAAI;AACrB,YAAM,gBAAgB,aAAa;AACnC,YAAM,YAAY,iBAAiB,IAAI,QAAQ;AAC/C,YAAM,YAAY;AAAA,QAChB;AAAA,QACA,UAAU,IAAI,cAAc;AAAA,QAC5B,kBAAkB,cAAc,WAAW,CAAC,GAAG;AAAA,UAC7C,CAAC,YAAY,IAAI;AAAA,QACnB;AAAA,QACA,cAAc,cAAc,OAAO,CAAC,GAAG,IAAI,CAAC,YAAY,IAAI,SAAS;AAAA,QACrE;AAAA,MACF;AACA,eAAS,IAAI,IAAI,WAAW,UAAU,SAAS,CAAC;AAAA,IAClD,CAAC;AACD,WAAO;AAAA,EACT;AAAA,EAEA,OAAO,iBAAiB,cAAkC;AACxD,UAAM,WAAW,IAAI,cAAc;AACnC,WAAO,KAAK,YAAY,EAAE,QAAQ,CAAC,aAAa;AAC9C,YAAM,YAAY,aAAa;AAC/B,eAAS,IAAI,IAAI,WAAW,UAAU,SAAS,CAAC;AAAA,IAClD,CAAC;AACD,WAAO;AAAA,EACT;AACF;AAEO,IAAM,aAAN,MAAiB;AAAA,EAQtB,YACE,UACA,WAOA;AACA,SAAK,WAAW;AAChB,SAAK,WAAW,UAAU;AAC1B,SAAK,WAAW,UAAU;AAC1B,SAAK,kBAAkB,UAAU;AACjC,SAAK,cAAc,UAAU;AAC7B,SAAK,YAAY,UAAU;AAAA,EAC7B;AAAA,EAEA,MAAM,aAAgC;AACpC,UAAM,UAAU,oBAAI,IAAY;AAChC,UAAM,OAAO,oBAAI,IAAY;AAC7B,UAAM,KAAK,WAAW,MAAM,MAAM,OAAO;AACzC,WAAO,MAAM,KAAK,IAAI;AAAA,EACxB;AAAA,EAEA,MAAM,YAA+B;AACnC,UAAM,UAAU,oBAAI,IAAY;AAChC,UAAM,OAAO,oBAAI,IAAY;AAC7B,UAAM,KAAK,UAAU,MAAM,MAAM,OAAO;AACxC,WAAO,MAAM,KAAK,IAAI;AAAA,EACxB;AAAA,EAEA,MAAc,UACZ,OACA,MACA,SACA;AACA,QAAI,CAAC,OAAO;AACV;AAAA,IACF;AACA,QAAI,CAAC,MAAM,UAAU;AACnB;AAAA,IACF;AACA,QAAI,QAAQ,IAAI,MAAM,QAAQ,GAAG;AAC/B;AAAA,IACF;AACA,YAAQ,IAAI,MAAM,QAAQ;AAC1B,QAAI,MAAM,WAAW;AACnB,WAAK,IAAI,MAAM,QAAQ;AAAA,IACzB;AACA,UAAM,QAAQ;AAAA,MACZ,MAAM,gBAAgB,IAAI,OAAO,aAAa;AAC5C,cAAM,gBAAiB,MAAM,KAAK,SAAS,IAAI,QAAQ;AACvD,aAAK,UAAU,eAAe,MAAM,OAAO;AAAA,MAC7C,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAc,WACZ,OACA,MACA,SACA;AACA,QAAI,CAAC,OAAO;AACV;AAAA,IACF;AACA,QAAI,CAAC,MAAM,UAAU;AACnB;AAAA,IACF;AACA,QAAI,QAAQ,IAAI,MAAM,QAAQ,GAAG;AAC/B;AAAA,IACF;AACA,YAAQ,IAAI,MAAM,QAAQ;AAC1B,QAAI,MAAM,aAAa;AACrB,YAAM,YAAY,QAAQ,CAAC,WAAW,KAAK,IAAI,MAAM,CAAC;AAAA,IACxD;AACA,UAAM,QAAQ;AAAA,MACZ,MAAM,gBAAgB,IAAI,OAAO,aAAa;AAC5C,cAAM,gBAAiB,MAAM,KAAK,SAAS,IAAI,QAAQ;AACvD,aAAK,WAAW,eAAe,MAAM,OAAO;AAAA,MAC9C,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,SAAS;AACP,WAAO;AAAA,MACL,UAAU,KAAK;AAAA,MACf,UAAU,KAAK;AAAA,MACf,iBAAiB,KAAK;AAAA,MACtB,aAAa,KAAK;AAAA,MAClB,WAAW,KAAK;AAAA,IAClB;AAAA,EACF;AACF;;;AD/JA,SAAQ,OAAAC,YAAU;AAGlB,IAAMC,aAAYC,MAAK,QAAQC,eAAc,YAAY,GAAG,CAAC;AAS7D,eAAsB,MAAM,gBAAyB,SAAwB;AA9B7E;AA+BE,QAAM,UAAUD,MAAK,QAAQ,kBAAkB,QAAQ,IAAI,CAAC;AAC5D,QAAM,aAAa,MAAM,eAAe,OAAO;AAC/C,QAAM,UAAUA,MAAK,KAAK,SAAS,MAAM;AACzC,QAAM,WAAU,mCAAS,YAAW;AACpC,QAAM,QAAO,mCAAS,SAAQ;AAE9B,UAAQ,IAAI;AACZ,UAAQ,IAAI,GAAGE,KAAI,QAAG,eAAe,SAAS;AAC9C,UAAQ,IAAI,GAAGA,KAAI,QAAG,eAAe,cAAc;AACnD,UAAQ,IAAI,GAAGA,KAAI,QAAG,eAAe,MAAM;AAC3C,UAAQ,IAAI;AAEZ,QAAM,MAAM,OAAO;AACnB,QAAM,QAAQ,OAAO;AAErB,QAAM,QAAkB,CAAC;AACzB,MAAI,MAAM,YAAYF,MAAK,KAAK,SAAS,QAAQ,CAAC,GAAG;AACnD,UAAM,YAAY,MAAMG,MAAKH,MAAK,KAAK,SAAS,aAAa,CAAC;AAC9D,cAAU,QAAQ,CAAC,SAAS;AAC1B,YAAM,QAAQA,MAAK,MAAM,IAAI;AAC7B,UAAI,CAAC,MAAM,KAAK,WAAW,GAAG,KAAK,SAAS,MAAM,IAAI,GAAG;AACvD,cAAM,KAAK,IAAI;AAAA,MACjB;AAAA,IACF,CAAC;AAAA,EACH;AAEA,QAAM,eAAe,CAACA,MAAK,KAAK,SAAS,UAAU,CAAC;AACpD,QAAM,oBAAkB,gBAAW,aAAX,mBAAqB,YAAW,CAAC;AACzD,QAAM,oBAAkB,gBAAW,aAAX,mBAAqB,YAAW,CAAC;AACzD,QAAM,iBAAiB,CAAC,aAAqB;AAC3C,WAAO,gBAAgB,KAAK,CAAC,YAAY,QAAQ,SAAS,MAAM,OAAO,CAAC,CAAC;AAAA,EAC3E;AAEA,aAAW,WAAW,iBAAiB;AACrC,UAAM,cAAcA,MAAK,QAAQ,SAAS,OAAO;AACjD,QAAI,CAAC,YAAY,WAAW,OAAO,GAAG;AACpC,YAAM,IAAI;AAAA,QACR,qBAAqB,0DAA0D;AAAA,MACjF;AAAA,IACF;AACA,iBAAa,KAAK,WAAW;AAAA,EAC/B;AACA,QAAM,WAAqB,CAAC;AAC5B,QAAM,aAAqC,CAAC;AAC5C,aAAW,WAAW,cAAc;AAClC,QAAI,MAAM,YAAY,OAAO,GAAG;AAC9B,YAAM,eAAe,MAAMG,MAAK,QAAQ,EAAC,KAAK,QAAO,CAAC;AACtD,mBAAa,QAAQ,CAAC,SAAS;AAC7B,cAAM,QAAQH,MAAK,MAAM,IAAI;AAC7B,YAAI,SAAS,MAAM,IAAI,GAAG;AACxB,gBAAM,WAAWA,MAAK,KAAK,SAAS,IAAI;AACxC,gBAAM,WAAW,SAAS,MAAM,QAAQ,MAAM;AAC9C,cAAI,CAAC,eAAe,QAAQ,GAAG;AAC7B,qBAAS,KAAK,QAAQ;AACtB,uBAAW,MAAM,QAAQ;AAAA,UAC3B;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAEA,QAAM,gBAA0B,CAAC;AACjC,MAAI,MAAM,YAAYA,MAAK,KAAK,SAAS,SAAS,CAAC,GAAG;AACpD,UAAM,cAAc,MAAMG,MAAKH,MAAK,KAAK,SAAS,WAAW,CAAC;AAC9D,gBAAY,QAAQ,CAAC,SAAS;AAC5B,YAAM,QAAQA,MAAK,MAAM,IAAI;AAC7B,UAAI,SAAS,MAAM,IAAI,GAAG;AACxB,sBAAc,KAAK,IAAI;AAAA,MACzB;AAAA,IACF,CAAC;AAAA,EACH;AAEA,QAAM,aAAa,WAAW,QAAQ,CAAC;AACvC,QAAM,cAAc;AAAA,IAClB,WAAW,EAAC,SAAS,WAAU,CAAC;AAAA,IAChC,GAAI,WAAW,WAAW,CAAC;AAAA,IAC3B,GAAG,eAAe,WAAW,WAAW,CAAC,CAAC;AAAA,EAC5C;AAEA,QAAM,aAAyB;AAAA,IAC7B,GAAG;AAAA,IACH,MAAM;AAAA,IACN;AAAA,IACA,SAAS;AAAA,MACP,KAAK;AAAA,MACL,iBAAiB;AAAA,MACjB,aAAa;AAAA,IACf;AAAA,IACA,SAAS;AAAA,EACX;AAIA,QAAM,UAAU;AAAA,IACd,GAAG;AAAA,IACH,WAAW;AAAA,IACX,OAAO;AAAA,MACL,eAAe;AAAA,QACb,OAAO,CAACA,MAAK,QAAQD,YAAW,aAAa,CAAC;AAAA,QAC9C,QAAQ;AAAA,UACN,QAAQ;AAAA,UACR,gBAAgB;AAAA,UAChB,gBAAgB;AAAA,QAClB;AAAA,MACF;AAAA,MACA,QAAQC,MAAK,KAAK,SAAS,QAAQ;AAAA,MACnC,KAAK;AAAA,MACL,aAAa;AAAA,MACb,cAAc;AAAA,MACd,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,uBAAuB;AAAA,MACvB,sBAAsB;AAAA,IACxB;AAAA,IACA,KAAK;AAAA,MACH,YAAY,CAAC,cAAc;AAAA,IAC7B;AAAA,EACF,CAAC;AAGD,QAAM,UAAU;AAAA,IACd,GAAG;AAAA,IACH,WAAW;AAAA,IACX,OAAO;AAAA,MACL,eAAe;AAAA,QACb,OAAO,CAAC,GAAG,OAAO,GAAG,UAAU,GAAG,aAAa;AAAA,QAC/C,QAAQ;AAAA,UACN,QAAQ;AAAA,UACR,gBAAgB;AAAA,UAChB,gBAAgB;AAAA,QAClB;AAAA,MACF;AAAA,MACA,QAAQA,MAAK,KAAK,SAAS,QAAQ;AAAA,MACnC,KAAK;AAAA,MACL,aAAa;AAAA,MACb,UAAU;AAAA,MACV,cAAc;AAAA,MACd,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,uBAAuB;AAAA,MACvB,sBAAsB;AAAA,IACxB;AAAA,EACF,CAAC;AAED,QAAM,eAAe,MAAM;AAAA,IACzBA,MAAK,KAAK,SAAS,sBAAsB;AAAA,EAC3C;AAIA,QAAM,WAAW,cAAc,iBAAiB,cAAc,UAAU;AAGxE;AAAA,IACEA,MAAK,KAAK,SAAS,2BAA2B;AAAA,IAC9C,KAAK,UAAU,SAAS,OAAO,GAAG,MAAM,CAAC;AAAA,EAC3C;AAGA,QAAM,WAAWA,MAAK,KAAK,SAAS,MAAM;AAG1C,QAAM,YAAYA,MAAK,KAAK,SAAS,QAAQ;AAC7C,MAAII,SAAQ,WAAWJ,MAAK,KAAK,SAAS,QAAQ,CAAC,GAAG;AACpD,IAAAI,SAAQ,SAAS,WAAW,QAAQ;AAAA,EACtC,OAAO;AACL,YAAQ,QAAQ;AAAA,EAClB;AAGA,UAAQJ,MAAK,KAAK,SAAS,eAAe,GAAGA,MAAK,KAAK,UAAU,QAAQ,CAAC;AAC1E,UAAQA,MAAK,KAAK,SAAS,eAAe,GAAGA,MAAK,KAAK,UAAU,QAAQ,CAAC;AAG1E,MAAI,CAAC,SAAS;AACZ,UAAM,SAAuB,MAAM,OACjCA,MAAK,KAAK,SAAS,kBAAkB;AAEvC,UAAM,WAAW,IAAI,OAAO,SAAS,YAAY,EAAC,SAAQ,CAAC;AAC3D,UAAM,UAAU,MAAM,SAAS,WAAW;AAE1C,UAAM,QAAQ;AAAA,MACZ,OAAO,KAAK,OAAO,EAAE,IAAI,OAAO,YAAY;AAC1C,cAAM,EAAC,OAAO,OAAM,IAAI,QAAQ;AAChC,cAAM,OAAO,MAAM,SAAS,YAAY,OAAO;AAAA,UAC7C,aAAa;AAAA,QACf,CAAC;AAID,YAAI,UAAUA,MAAK,KAAK,SAAS,OAAO,WAAW,YAAY;AAE/D,YAAI,QAAQ,SAAS,gBAAgB,GAAG;AACtC,oBAAU,QAAQ,QAAQ,kBAAkB,UAAU;AAAA,QACxD;AAEA,cAAM,OAAO,MAAM,WAAW,KAAK,QAAQ,EAAE;AAC7C,cAAM,UAAU,SAAS,IAAI;AAE7B,cAAM,UAAU,QAAQ,MAAMA,MAAK,QAAQ,OAAO,EAAE,SAAS,CAAC;AAC9D,gBAAQ,IAAI,SAAS,SAAS;AAAA,MAChC,CAAC;AAAA,IACH;AAAA,EACF;AACF;;;AE3OA,OAAOK,WAAU;AACjB,SAAQ,WAAWC,gBAAc;AAUjC,SAAQ,OAAAC,YAAU;AAElB,OAAO,UAAU;AACjB,OAAO,iBAAiB;AAMxB,eAAsB,QAAQ,gBAAyB;AAGrD,UAAQ,IAAI,WAAW;AACvB,QAAM,UAAUC,MAAK,QAAQ,kBAAkB,QAAQ,IAAI,CAAC;AAC5D,QAAM,SAAS,MAAMC,cAAa,EAAC,QAAO,CAAC;AAC3C,QAAM,OAAO,SAAS,QAAQ,IAAI,QAAQ,MAAM;AAChD,UAAQ,IAAI;AACZ,UAAQ,IAAI,GAAGC,KAAI,QAAG,eAAe,SAAS;AAC9C,UAAQ,IAAI,GAAGA,KAAI,QAAG,gCAAgC,MAAM;AAC5D,UAAQ,IAAI,GAAGA,KAAI,QAAG,qBAAqB;AAC3C,UAAQ,IAAI;AACZ,SAAO,OAAO,IAAI;AACpB;AAEA,eAAeD,cAAa,SAA6C;AACvE,QAAM,UAAU,QAAQ;AACxB,QAAM,aAAa,MAAM,eAAe,OAAO;AAC/C,QAAM,UAAUD,MAAK,KAAK,SAAS,MAAM;AAEzC,QAAM,SAASG,SAAQ;AACvB,SAAO,QAAQ,cAAc;AAC7B,SAAO,IAAI,YAAY,CAAC;AAGxB,SAAO,IAAI,sBAAsB,EAAC,SAAS,WAAU,CAAC,CAAC;AACvD,SAAO,IAAI,MAAM,8BAA8B,EAAC,YAAY,QAAO,CAAC,CAAC;AAErE,QAAM,UAAU,WAAW,WAAW,CAAC;AACvC;AAAA,IACE;AAAA,IACA,YAAY;AAnDhB;AAqDM,YAAM,oBAAkB,gBAAW,WAAX,mBAAmB,gBAAe,CAAC;AAC3D,sBAAgB,QAAQ,CAAC,eAAe;AACtC,eAAO,IAAI,UAAU;AAAA,MACvB,CAAC;AAGD,YAAM,YAAYH,MAAK,KAAK,SAAS,MAAM;AAC3C,aAAO,IAAI,KAAK,WAAW,EAAC,KAAK,MAAK,CAAC,CAAC;AAGxC,aAAO,IAAI,4BAA4B,CAAC;AAAA,IAE1C;AAAA,IACA;AAAA,IACA,EAAC,MAAM,UAAS;AAAA,EAClB;AACA,SAAO;AACT;AAKA,eAAe,8BAA8B,SAG1C;AACD,QAAM,EAAC,SAAS,WAAU,IAAI;AAC9B,QAAM,SAAuB,MAAM,OACjCA,MAAK,KAAK,SAAS,kBAAkB;AAEvC,QAAM,eAAeA,MAAK,KAAK,SAAS,2BAA2B;AACnE,MAAI,CAAE,MAAM,WAAW,YAAY,GAAI;AACrC,UAAM,IAAI;AAAA,MACR,kBAAkB;AAAA,IACpB;AAAA,EACF;AACA,QAAM,eAAe,MAAM,SAA6B,YAAY;AACpE,QAAM,WAAW,cAAc,iBAAiB,YAAY;AAC5D,QAAM,WAAW,IAAI,OAAO,SAAS,YAAY,EAAC,SAAQ,CAAC;AAC3D,SAAO,OAAO,KAAc,GAAa,SAAuB;AAC9D,QAAI,WAAW;AACf,SAAK;AAAA,EACP;AACF;AAKA,SAAS,8BAA8B;AACrC,SAAO,OAAO,KAAc,KAAe,SAAuB;AAChE,UAAM,aAAa,IAAI;AACvB,UAAM,WAAW,IAAI;AACrB,QAAI;AACF,YAAM,MAAM,IAAI;AAChB,YAAM,OAAO,MAAM,SAAS,OAAO,GAAG;AACtC,UAAI,KAAK,YAAY,CAAC,KAAK,MAAM;AAC/B,aAAK;AACL;AAAA,MACF;AACA,UAAI,OAAO,KAAK,QAAQ;AACxB,UAAI,WAAW,eAAe,OAAO;AACnC,eAAO,MAAM,WAAW,IAAI;AAAA,MAC9B;AACA,UAAI,OAAO,GAAG,EAAE,IAAI,EAAC,gBAAgB,YAAW,CAAC,EAAE,IAAI,IAAI;AAAA,IAC7D,SAAS,GAAP;AACA,UAAI;AACF,cAAM,EAAC,KAAI,IAAI,MAAM,SAAS,YAAY,CAAC;AAC3C,YAAI,OAAO,GAAG,EAAE,IAAI,EAAC,gBAAgB,YAAW,CAAC,EAAE,IAAI,IAAI;AAAA,MAC7D,SAAS,IAAP;AACA,gBAAQ,MAAM,+BAA+B;AAC7C,gBAAQ,MAAM,EAAE;AAChB,aAAK,CAAC;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACF;;;AChIA,OAAOI,WAAU;AACjB,SAAQ,WAAWC,gBAAc;AASjC,SAAQ,OAAAC,YAAU;AAElB,OAAOC,WAAU;AACjB,OAAOC,kBAAiB;AAOxB,eAAsB,MAAM,gBAAyB;AACnD,UAAQ,IAAI,WAAW;AACvB,QAAM,UAAUC,MAAK,QAAQ,kBAAkB,QAAQ,IAAI,CAAC;AAC5D,QAAM,SAAS,MAAMC,cAAa,EAAC,QAAO,CAAC;AAC3C,QAAM,OAAO,SAAS,QAAQ,IAAI,QAAQ,MAAM;AAChD,UAAQ,IAAI;AACZ,UAAQ,IAAI,GAAGC,KAAI,QAAG,eAAe,SAAS;AAC9C,UAAQ,IAAI,GAAGA,KAAI,QAAG,gCAAgC,MAAM;AAC5D,UAAQ,IAAI,GAAGA,KAAI,QAAG,wBAAwB;AAC9C,UAAQ,IAAI;AACZ,SAAO,OAAO,IAAI;AACpB;AAEA,eAAeD,cAAa,SAA6C;AACvE,QAAM,UAAU,QAAQ;AACxB,QAAM,aAAa,MAAM,eAAe,OAAO;AAC/C,QAAM,UAAUD,MAAK,KAAK,SAAS,MAAM;AAEzC,QAAM,SAASG,SAAQ;AACvB,SAAO,QAAQ,cAAc;AAC7B,SAAO,IAAIC,aAAY,CAAC;AAGxB,SAAO,IAAI,sBAAsB,EAAC,SAAS,WAAU,CAAC,CAAC;AACvD,SAAO,IAAI,MAAM,2BAA2B,EAAC,YAAY,QAAO,CAAC,CAAC;AAElE,QAAM,UAAU,WAAW,WAAW,CAAC;AACvC;AAAA,IACE;AAAA,IACA,YAAY;AAjDhB;AAmDM,YAAM,oBAAkB,gBAAW,WAAX,mBAAmB,gBAAe,CAAC;AAC3D,sBAAgB,QAAQ,CAAC,eAAe;AACtC,eAAO,IAAI,UAAU;AAAA,MACvB,CAAC;AAGD,YAAM,YAAYJ,MAAK,KAAK,SAAS,MAAM;AAC3C,aAAO,IAAIK,MAAK,WAAW,EAAC,KAAK,MAAK,CAAC,CAAC;AAGxC,aAAO,IAAI,yBAAyB,CAAC;AAAA,IAEvC;AAAA,IACA;AAAA,IACA,EAAC,MAAM,OAAM;AAAA,EACf;AACA,SAAO;AACT;AAKA,eAAe,2BAA2B,SAGvC;AACD,QAAM,EAAC,SAAS,WAAU,IAAI;AAC9B,QAAM,SAAuB,MAAM,OACjCL,MAAK,KAAK,SAAS,kBAAkB;AAEvC,QAAM,eAAeA,MAAK,KAAK,SAAS,2BAA2B;AACnE,MAAI,CAAE,MAAM,WAAW,YAAY,GAAI;AACrC,UAAM,IAAI;AAAA,MACR,kBAAkB;AAAA,IACpB;AAAA,EACF;AACA,QAAM,eAAe,MAAM,SAA6B,YAAY;AACpE,QAAM,WAAW,cAAc,iBAAiB,YAAY;AAC5D,QAAM,WAAW,IAAI,OAAO,SAAS,YAAY,EAAC,SAAQ,CAAC;AAC3D,SAAO,OAAO,KAAc,GAAa,SAAuB;AAC9D,QAAI,WAAW;AACf,SAAK;AAAA,EACP;AACF;AAKA,SAAS,2BAA2B;AAClC,SAAO,OAAO,KAAc,KAAe,SAAuB;AAChE,UAAM,aAAa,IAAI;AACvB,UAAM,WAAW,IAAI;AACrB,QAAI;AACF,YAAM,MAAM,IAAI;AAChB,YAAM,OAAO,MAAM,SAAS,OAAO,GAAG;AACtC,UAAI,KAAK,YAAY,CAAC,KAAK,MAAM;AAC/B,aAAK;AACL;AAAA,MACF;AACA,UAAI,OAAO,KAAK,QAAQ;AACxB,UAAI,WAAW,eAAe,OAAO;AACnC,eAAO,MAAM,WAAW,IAAI;AAAA,MAC9B;AACA,UAAI,OAAO,GAAG,EAAE,IAAI,EAAC,gBAAgB,YAAW,CAAC,EAAE,IAAI,IAAI;AAAA,IAC7D,SAAS,GAAP;AACA,UAAI;AACF,cAAM,EAAC,KAAI,IAAI,MAAM,SAAS,YAAY,CAAC;AAC3C,YAAI,OAAO,GAAG,EAAE,IAAI,EAAC,gBAAgB,YAAW,CAAC,EAAE,IAAI,IAAI;AAAA,MAC7D,SAAS,IAAP;AACA,gBAAQ,MAAM,+BAA+B;AAC7C,gBAAQ,MAAM,EAAE;AAChB,aAAK,CAAC;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACF;","names":["path","path","path","path","glob","path","glob","path","fileURLToPath","fsExtra","glob","dim","__dirname","path","fileURLToPath","dim","glob","fsExtra","path","express","dim","path","createServer","dim","express","path","express","dim","sirv","compression","path","createServer","dim","express","compression","sirv"]}
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
import { Express, Request as Request$1, Response as Response$1, NextFunction as NextFunction$1 } from 'express';
|
|
2
|
+
import { ViteDevServer, PluginOption, UserConfig } from 'vite';
|
|
3
|
+
import { ComponentType } from 'preact';
|
|
4
|
+
|
|
5
|
+
interface RouteModule {
|
|
6
|
+
default?: ComponentType<unknown>;
|
|
7
|
+
getStaticPaths?: GetStaticPaths;
|
|
8
|
+
getStaticProps?: GetStaticProps;
|
|
9
|
+
}
|
|
10
|
+
interface Route {
|
|
11
|
+
modulePath: string;
|
|
12
|
+
module: RouteModule;
|
|
13
|
+
locale: string;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
interface Asset {
|
|
17
|
+
moduleId: string;
|
|
18
|
+
assetUrl: string;
|
|
19
|
+
getCssDeps(): Promise<string[]>;
|
|
20
|
+
getJsDeps(): Promise<string[]>;
|
|
21
|
+
}
|
|
22
|
+
interface AssetMap {
|
|
23
|
+
get: (moduleId: string) => Promise<Asset | null>;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
declare class Renderer {
|
|
27
|
+
private routes;
|
|
28
|
+
private assetMap;
|
|
29
|
+
constructor(config: RootConfig, options: {
|
|
30
|
+
assetMap: AssetMap;
|
|
31
|
+
});
|
|
32
|
+
render(url: string): Promise<{
|
|
33
|
+
html?: string;
|
|
34
|
+
notFound?: boolean;
|
|
35
|
+
}>;
|
|
36
|
+
renderRoute(route: Route, options: {
|
|
37
|
+
routeParams: Record<string, string>;
|
|
38
|
+
}): Promise<{
|
|
39
|
+
html?: string;
|
|
40
|
+
notFound?: boolean;
|
|
41
|
+
}>;
|
|
42
|
+
getSitemap(): Promise<Record<string, {
|
|
43
|
+
route: Route;
|
|
44
|
+
params: Record<string, string>;
|
|
45
|
+
}>>;
|
|
46
|
+
private renderHtml;
|
|
47
|
+
render404(): Promise<{
|
|
48
|
+
html: string;
|
|
49
|
+
notFound: boolean;
|
|
50
|
+
}>;
|
|
51
|
+
renderError(error: unknown): Promise<{
|
|
52
|
+
html: string;
|
|
53
|
+
}>;
|
|
54
|
+
renderDevServer404(): Promise<{
|
|
55
|
+
html: string;
|
|
56
|
+
}>;
|
|
57
|
+
private getScriptDeps;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
declare type GetStaticProps<T = unknown> = (ctx: {
|
|
61
|
+
params: Record<string, string>;
|
|
62
|
+
}) => Promise<{
|
|
63
|
+
props?: T;
|
|
64
|
+
notFound?: boolean;
|
|
65
|
+
}>;
|
|
66
|
+
declare type GetStaticPaths<T = Record<string, string>> = () => Promise<{
|
|
67
|
+
paths: Array<{
|
|
68
|
+
params: T;
|
|
69
|
+
}>;
|
|
70
|
+
}>;
|
|
71
|
+
declare type Server = Express;
|
|
72
|
+
declare type Request = Request$1 & {
|
|
73
|
+
/** The root.js project config. */
|
|
74
|
+
rootConfig?: RootConfig & {
|
|
75
|
+
rootDir: string;
|
|
76
|
+
};
|
|
77
|
+
/** The vite dev server. This is only available when running `root dev`. */
|
|
78
|
+
viteServer?: ViteDevServer;
|
|
79
|
+
/** The root.js renderer, to render routes within middlware. */
|
|
80
|
+
renderer?: Renderer;
|
|
81
|
+
};
|
|
82
|
+
declare type Response = Response$1;
|
|
83
|
+
declare type NextFunction = NextFunction$1;
|
|
84
|
+
|
|
85
|
+
declare type MaybePromise<T> = T | Promise<T>;
|
|
86
|
+
declare type ConfigureServerHook = (server: Server, options: ConfigureServerOptions) => MaybePromise<void> | MaybePromise<() => void>;
|
|
87
|
+
interface ConfigureServerOptions {
|
|
88
|
+
type: 'dev' | 'preview' | 'prod';
|
|
89
|
+
}
|
|
90
|
+
interface Plugin {
|
|
91
|
+
name?: string;
|
|
92
|
+
/** Configures the root.js express server . */
|
|
93
|
+
configureServer?: ConfigureServerHook;
|
|
94
|
+
/** Adds vite plugins. */
|
|
95
|
+
vitePlugins?: PluginOption[];
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Runs the pre-hook configureServer method of every plugin, calls a callback
|
|
99
|
+
* function, and then runs the configureServer's post-hook if provided. Plugins
|
|
100
|
+
* provide a post-hook by returning a callback function from configureServer.
|
|
101
|
+
*/
|
|
102
|
+
declare function configureServerPlugins(server: Server, callback: () => Promise<void>, plugins: Plugin[], options: ConfigureServerOptions): Promise<void>;
|
|
103
|
+
declare function getVitePlugins(plugins: Plugin[]): PluginOption[];
|
|
104
|
+
|
|
105
|
+
interface RootConfig {
|
|
106
|
+
/**
|
|
107
|
+
* Config for auto-injecting custom element dependencies.
|
|
108
|
+
*/
|
|
109
|
+
elements?: {
|
|
110
|
+
/**
|
|
111
|
+
* A list of directories to use to look for custom elements. The dir path
|
|
112
|
+
* should be relative to the project dir, e.g. "path/to/elements" or
|
|
113
|
+
* "node_modules/my-package".
|
|
114
|
+
*/
|
|
115
|
+
include?: string[];
|
|
116
|
+
/**
|
|
117
|
+
* A list of RegEx patterns to exclude. The string passed to the RegEx is
|
|
118
|
+
* the file URL relative to the project root, e.g. "/elements/foo/foo.ts".
|
|
119
|
+
*/
|
|
120
|
+
exclude?: RegExp[];
|
|
121
|
+
};
|
|
122
|
+
/**
|
|
123
|
+
* Config options for localization and internationalization.
|
|
124
|
+
*/
|
|
125
|
+
i18n?: RootI18nConfig;
|
|
126
|
+
/**
|
|
127
|
+
* Config options for the Root.js express server.
|
|
128
|
+
*/
|
|
129
|
+
server?: RootServerConfig;
|
|
130
|
+
/**
|
|
131
|
+
* Vite config.
|
|
132
|
+
* @see {@link https://vitejs.dev/config/} for more information.
|
|
133
|
+
*/
|
|
134
|
+
vite?: UserConfig;
|
|
135
|
+
/**
|
|
136
|
+
* Whether to automatically minify HTML output.
|
|
137
|
+
*/
|
|
138
|
+
minifyHtml?: boolean;
|
|
139
|
+
/**
|
|
140
|
+
* Whether to include a sitemap.xml file to the build output.
|
|
141
|
+
*/
|
|
142
|
+
sitemap?: boolean;
|
|
143
|
+
/**
|
|
144
|
+
* Plugins.
|
|
145
|
+
*/
|
|
146
|
+
plugins?: Plugin[];
|
|
147
|
+
}
|
|
148
|
+
interface RootI18nConfig {
|
|
149
|
+
/**
|
|
150
|
+
* Locales enabled for the site.
|
|
151
|
+
*/
|
|
152
|
+
locales?: string[];
|
|
153
|
+
/**
|
|
154
|
+
* The default locale to use. Defaults is `en`.
|
|
155
|
+
*/
|
|
156
|
+
defaultLocale?: string;
|
|
157
|
+
/**
|
|
158
|
+
* URL format for localized content. Default is `/{locale}/{path}`.
|
|
159
|
+
*/
|
|
160
|
+
urlFormat?: string;
|
|
161
|
+
}
|
|
162
|
+
interface RootServerConfig {
|
|
163
|
+
/**
|
|
164
|
+
* An array of middleware to add to the express server. These middleware are
|
|
165
|
+
* added to the beginning of the express app.
|
|
166
|
+
*/
|
|
167
|
+
middlewares?: Array<(req: Request, res: Response, next: NextFunction) => void | Promise<void>>;
|
|
168
|
+
}
|
|
169
|
+
declare function defineConfig(config: RootConfig): RootConfig;
|
|
170
|
+
|
|
171
|
+
export { ConfigureServerHook as C, GetStaticProps as G, NextFunction as N, Plugin as P, RootConfig as R, Server as S, RootI18nConfig as a, RootServerConfig as b, ConfigureServerOptions as c, defineConfig as d, configureServerPlugins as e, GetStaticPaths as f, getVitePlugins as g, Request as h, Response as i, Renderer as j };
|
package/dist/core.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as preact from 'preact';
|
|
2
2
|
import { ComponentChildren } from 'preact';
|
|
3
|
-
export { c as GetStaticPaths, G as GetStaticProps, N as NextFunction,
|
|
3
|
+
export { C as ConfigureServerHook, c as ConfigureServerOptions, f as GetStaticPaths, G as GetStaticProps, N as NextFunction, P as Plugin, h as Request, i as Response, R as RootConfig, a as RootI18nConfig, b as RootServerConfig, S as Server, e as configureServerPlugins, d as defineConfig, g as getVitePlugins } from './config-3a70dc3b.js';
|
|
4
4
|
import 'express';
|
|
5
5
|
import 'vite';
|
|
6
6
|
|
package/dist/core.js
CHANGED
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
import {
|
|
2
|
+
configureServerPlugins,
|
|
3
|
+
getVitePlugins
|
|
4
|
+
} from "./chunk-ZB7R6ZOY.js";
|
|
1
5
|
import {
|
|
2
6
|
ErrorPage,
|
|
3
7
|
HEAD_CONTEXT,
|
|
@@ -20,8 +24,10 @@ export {
|
|
|
20
24
|
I18N_CONTEXT,
|
|
21
25
|
SCRIPT_CONTEXT,
|
|
22
26
|
Script,
|
|
27
|
+
configureServerPlugins,
|
|
23
28
|
defineConfig,
|
|
24
29
|
getTranslations,
|
|
30
|
+
getVitePlugins,
|
|
25
31
|
useTranslations
|
|
26
32
|
};
|
|
27
33
|
//# sourceMappingURL=core.js.map
|
package/dist/core.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core/config.ts"],"sourcesContent":["import {Request, Response, NextFunction} from './types';\nimport {UserConfig as ViteUserConfig} from 'vite';\n\nexport interface RootConfig {\n /**\n * Config for auto-injecting custom element dependencies.\n */\n elements?: {\n /**\n * A list of directories to use to look for custom elements. The dir path\n * should be relative to the project dir, e.g. \"path/to/elements\" or\n * \"node_modules/my-package\".\n */\n include?: string[];\n\n /**\n * A list of RegEx patterns to exclude. The string passed to the RegEx is\n * the file URL relative to the project root, e.g. \"/elements/foo/foo.ts\".\n */\n exclude?: RegExp[];\n };\n\n /**\n * Config options for localization and internationalization.\n */\n i18n?: RootI18nConfig;\n\n /**\n * Config options for the Root.js express server.\n */\n server?: RootServerConfig;\n\n /**\n * Vite config.\n * @see {@link https://vitejs.dev/config/} for more information.\n */\n vite?: ViteUserConfig;\n\n /**\n * Whether to automatically minify HTML output.\n */\n minifyHtml?: boolean;\n\n /**\n * Whether to include a sitemap.xml file to the build output.\n */\n sitemap?: boolean;\n}\n\nexport interface RootI18nConfig {\n /**\n * Locales enabled for the site.\n */\n locales?: string[];\n\n /**\n * The default locale to use. Defaults is `en`.\n */\n defaultLocale?: string;\n\n /**\n * URL format for localized content. Default is `/{locale}/{path}`.\n */\n urlFormat?: string;\n}\n\nexport interface RootServerConfig {\n /**\n * An array of middleware to add to the express server. These middleware are\n * added to the beginning of the express app.\n */\n middlewares?: Array<\n (req: Request, res: Response, next: NextFunction) => void | Promise<void>\n >;\n}\n\nexport function defineConfig(config: RootConfig): RootConfig {\n return config;\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../src/core/config.ts"],"sourcesContent":["import {Request, Response, NextFunction} from './types';\nimport {Plugin} from './plugin';\nimport {UserConfig as ViteUserConfig} from 'vite';\n\nexport interface RootConfig {\n /**\n * Config for auto-injecting custom element dependencies.\n */\n elements?: {\n /**\n * A list of directories to use to look for custom elements. The dir path\n * should be relative to the project dir, e.g. \"path/to/elements\" or\n * \"node_modules/my-package\".\n */\n include?: string[];\n\n /**\n * A list of RegEx patterns to exclude. The string passed to the RegEx is\n * the file URL relative to the project root, e.g. \"/elements/foo/foo.ts\".\n */\n exclude?: RegExp[];\n };\n\n /**\n * Config options for localization and internationalization.\n */\n i18n?: RootI18nConfig;\n\n /**\n * Config options for the Root.js express server.\n */\n server?: RootServerConfig;\n\n /**\n * Vite config.\n * @see {@link https://vitejs.dev/config/} for more information.\n */\n vite?: ViteUserConfig;\n\n /**\n * Whether to automatically minify HTML output.\n */\n minifyHtml?: boolean;\n\n /**\n * Whether to include a sitemap.xml file to the build output.\n */\n sitemap?: boolean;\n\n /**\n * Plugins.\n */\n plugins?: Plugin[];\n}\n\nexport interface RootI18nConfig {\n /**\n * Locales enabled for the site.\n */\n locales?: string[];\n\n /**\n * The default locale to use. Defaults is `en`.\n */\n defaultLocale?: string;\n\n /**\n * URL format for localized content. Default is `/{locale}/{path}`.\n */\n urlFormat?: string;\n}\n\nexport interface RootServerConfig {\n /**\n * An array of middleware to add to the express server. These middleware are\n * added to the beginning of the express app.\n */\n middlewares?: Array<\n (req: Request, res: Response, next: NextFunction) => void | Promise<void>\n >;\n}\n\nexport function defineConfig(config: RootConfig): RootConfig {\n return config;\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAkFO,SAAS,aAAa,QAAgC;AAC3D,SAAO;AACT;","names":[]}
|
package/dist/render.d.ts
CHANGED
|
@@ -1,62 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
import { c as GetStaticPaths, G as GetStaticProps, R as RootConfig } from './config-ea7b8b9c.js';
|
|
1
|
+
export { j as Renderer } from './config-3a70dc3b.js';
|
|
3
2
|
import 'express';
|
|
4
3
|
import 'vite';
|
|
5
|
-
|
|
6
|
-
interface RouteModule {
|
|
7
|
-
default?: ComponentType<unknown>;
|
|
8
|
-
getStaticPaths?: GetStaticPaths;
|
|
9
|
-
getStaticProps?: GetStaticProps;
|
|
10
|
-
}
|
|
11
|
-
interface Route {
|
|
12
|
-
modulePath: string;
|
|
13
|
-
module: RouteModule;
|
|
14
|
-
locale: string;
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
interface Asset {
|
|
18
|
-
moduleId: string;
|
|
19
|
-
assetUrl: string;
|
|
20
|
-
getCssDeps(): Promise<string[]>;
|
|
21
|
-
getJsDeps(): Promise<string[]>;
|
|
22
|
-
}
|
|
23
|
-
interface AssetMap {
|
|
24
|
-
get: (moduleId: string) => Promise<Asset | null>;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
interface RenderOptions {
|
|
28
|
-
assetMap: AssetMap;
|
|
29
|
-
}
|
|
30
|
-
declare class Renderer {
|
|
31
|
-
private routes;
|
|
32
|
-
constructor(config: RootConfig);
|
|
33
|
-
render(url: string, options: RenderOptions): Promise<{
|
|
34
|
-
html?: string;
|
|
35
|
-
notFound?: boolean;
|
|
36
|
-
}>;
|
|
37
|
-
renderRoute(route: Route, options: {
|
|
38
|
-
routeParams: Record<string, string>;
|
|
39
|
-
assetMap: AssetMap;
|
|
40
|
-
}): Promise<{
|
|
41
|
-
html?: string;
|
|
42
|
-
notFound?: boolean;
|
|
43
|
-
}>;
|
|
44
|
-
getSitemap(): Promise<Record<string, {
|
|
45
|
-
route: Route;
|
|
46
|
-
params: Record<string, string>;
|
|
47
|
-
}>>;
|
|
48
|
-
private renderHtml;
|
|
49
|
-
render404(): Promise<{
|
|
50
|
-
html: string;
|
|
51
|
-
notFound: boolean;
|
|
52
|
-
}>;
|
|
53
|
-
renderError(error: unknown): Promise<{
|
|
54
|
-
html: string;
|
|
55
|
-
}>;
|
|
56
|
-
renderDevNotFound(): Promise<{
|
|
57
|
-
html: string;
|
|
58
|
-
}>;
|
|
59
|
-
private getScriptDeps;
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
export { Renderer };
|
|
4
|
+
import 'preact';
|
package/dist/render.js
CHANGED
|
@@ -331,20 +331,20 @@ function DevNotFoundPage(props) {
|
|
|
331
331
|
// src/render/render.tsx
|
|
332
332
|
import { jsx as jsx2, jsxs as jsxs2 } from "preact/jsx-runtime";
|
|
333
333
|
var Renderer = class {
|
|
334
|
-
constructor(config) {
|
|
334
|
+
constructor(config, options) {
|
|
335
335
|
this.routes = getRoutes(config);
|
|
336
|
+
this.assetMap = options.assetMap;
|
|
336
337
|
}
|
|
337
|
-
async render(url
|
|
338
|
-
const assetMap = options.assetMap;
|
|
338
|
+
async render(url) {
|
|
339
339
|
const [route, routeParams] = this.routes.get(url);
|
|
340
340
|
if (route && route.module && route.module.default) {
|
|
341
|
-
return await this.renderRoute(route, { routeParams
|
|
341
|
+
return await this.renderRoute(route, { routeParams });
|
|
342
342
|
}
|
|
343
343
|
return { notFound: true };
|
|
344
344
|
}
|
|
345
345
|
async renderRoute(route, options) {
|
|
346
346
|
const routeParams = options.routeParams;
|
|
347
|
-
const assetMap =
|
|
347
|
+
const assetMap = this.assetMap;
|
|
348
348
|
const Component = route.module.default;
|
|
349
349
|
if (!Component) {
|
|
350
350
|
throw new Error(
|
|
@@ -390,7 +390,7 @@ var Renderer = class {
|
|
|
390
390
|
}));
|
|
391
391
|
});
|
|
392
392
|
}
|
|
393
|
-
const scriptDeps = await this.getScriptDeps(mainHtml
|
|
393
|
+
const scriptDeps = await this.getScriptDeps(mainHtml);
|
|
394
394
|
scriptDeps.forEach((jsUrls) => {
|
|
395
395
|
headComponents.push(/* @__PURE__ */ jsx2("script", {
|
|
396
396
|
type: "module",
|
|
@@ -464,7 +464,7 @@ ${renderToString(
|
|
|
464
464
|
const html = await this.renderHtml({ mainHtml, locale: "en" });
|
|
465
465
|
return { html };
|
|
466
466
|
}
|
|
467
|
-
async
|
|
467
|
+
async renderDevServer404() {
|
|
468
468
|
const sitemap = await this.getSitemap();
|
|
469
469
|
const mainHtml = renderToString(/* @__PURE__ */ jsx2(DevNotFoundPage, {
|
|
470
470
|
sitemap
|
|
@@ -478,8 +478,8 @@ ${renderToString(
|
|
|
478
478
|
});
|
|
479
479
|
return { html };
|
|
480
480
|
}
|
|
481
|
-
async getScriptDeps(html
|
|
482
|
-
const assetMap =
|
|
481
|
+
async getScriptDeps(html) {
|
|
482
|
+
const assetMap = this.assetMap;
|
|
483
483
|
const deps = /* @__PURE__ */ new Set();
|
|
484
484
|
const re = /<(\w[\w-]+\w)/g;
|
|
485
485
|
const matches = Array.from(html.matchAll(re));
|