@blinkk/root 1.0.0-alpha.13 → 1.0.0-alpha.15

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/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/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, res: Response, next: NextFunction) => {\n req.viteServer = viteServer;\n viteServer.middlewares(req, res, 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":"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","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"]}
1
+ {"version":3,"sources":["../src/cli/commands/dev.ts","../src/render/vite-plugin-root.ts","../src/core/elements.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/ports.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';\nimport {findOpenPort} from '../ports.js';\nimport {getElements} from '../../core/elements.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 defaultPort = parseInt(process.env.PORT || '4007');\n const port = await findOpenPort(defaultPort, defaultPort + 10);\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 const server = await createServer({rootDir, port});\n server.listen(port);\n}\n\nasync function createServer(options?: {\n rootDir?: string;\n port?: number;\n}): Promise<Server> {\n const rootDir = path.resolve(options?.rootDir || process.cwd());\n const rootConfig = await loadRootConfig(rootDir);\n const port = options?.port;\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, port}));\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 port?: number;\n}) {\n const rootDir = options.rootDir;\n const rootConfig = options.rootConfig;\n const viteConfig = rootConfig.vite || {};\n\n let hmrOptions = viteConfig.server?.hmr;\n if (typeof hmrOptions === 'undefined' && options.port) {\n // Automatically set the HMR port to `port + 10`. This allows multiple\n // root.js dev servers to run without conflicts.\n hmrOptions = {port: options.port + 10};\n }\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 elementsMap = await getElements(rootConfig);\n const elements = Object.values(elementsMap).map((mod) => mod.src);\n\n const bundleScripts: string[] = [];\n if (await isDirectory(path.join(rootDir, 'bundles'))) {\n const bundleFiles = await glob('bundles/*', {cwd: rootDir});\n bundleFiles.forEach((file) => {\n const parts = path.parse(file);\n if (isJsFile(parts.base)) {\n bundleScripts.push(file);\n }\n });\n }\n\n const viteServer = await createViteServer({\n ...viteConfig,\n mode: 'development',\n root: rootDir,\n publicDir: path.join(rootDir, 'public'),\n server: {\n ...(viteConfig.server || {}),\n middlewareMode: true,\n hmr: hmrOptions,\n },\n appType: 'custom',\n optimizeDeps: {\n ...(viteConfig.optimizeDeps || {}),\n include: [\n ...routeFiles,\n ...elements,\n ...bundleScripts,\n ...(viteConfig.optimizeDeps?.include || []),\n ],\n },\n ssr: {\n ...(viteConfig.ssr || {}),\n noExternal: ['@blinkk/root'],\n },\n esbuild: {\n ...(viteConfig.esbuild || {}),\n jsx: 'automatic',\n jsxImportSource: 'preact',\n },\n plugins: [\n pluginRoot({rootConfig}),\n ...(viteConfig.plugins || []),\n ...getVitePlugins(rootConfig.plugins || []),\n ],\n });\n return (req: Request, res: Response, next: NextFunction) => {\n req.viteServer = viteServer;\n viteServer.middlewares(req, res, 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(rootConfig, 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 'node:path';\nimport {ElementModule} from 'virtual:root-elements';\nimport {RootConfig} from '../core/config';\nimport {getElements} from '../core/elements';\nimport {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 rootConfig: RootConfig;\n}\n\nexport async function pluginRoot(options: RootPluginOptions) {\n const elementsVirtualId = 'virtual:root-elements';\n const resolvedElementsVirtualId = '\\0' + elementsVirtualId;\n const rootConfig = options.rootConfig;\n\n let tagNameToElement: Record<string, ElementModule>;\n const customElementFiles: Set<string> = new Set();\n async function updateElementMap() {\n tagNameToElement = await getElements(rootConfig);\n customElementFiles.clear();\n Object.values(tagNameToElement).forEach((elementModule) => {\n customElementFiles.add(elementModule.filePath);\n customElementFiles.add(elementModule.realPath);\n });\n }\n await updateElementMap();\n\n async function getElementImport(tagname: string): Promise<string | null> {\n if (!tagNameToElement) {\n await updateElementMap();\n }\n if (tagname in tagNameToElement) {\n const elementModule = tagNameToElement[tagname];\n if (elementModule.filePath === elementModule.realPath) {\n return elementModule.src;\n }\n // TODO(stevenle): handle symlinked elements.\n }\n return null;\n }\n\n function isCustomElement(id: string) {\n if (!isJsFile(id)) {\n return false;\n }\n return customElementFiles.has(id);\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(tagNameToElement)}`;\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 fs from 'node:fs';\nimport path from 'node:path';\nimport glob from 'tiny-glob';\nimport {ElementModule} from 'virtual:root-elements';\nimport {searchForWorkspaceRoot} from 'vite';\nimport {RootConfig} from './config';\nimport {directoryContains, isDirectory, isJsFile} from './fsutils';\n\n/**\n * Returns a map of all the element file definitions in the project.\n */\nexport async function getElements(\n rootConfig: RootConfig\n): Promise<Record<string, ElementModule>> {\n const rootDir = rootConfig.rootDir;\n const workspaceRoot = searchForWorkspaceRoot(rootDir);\n\n const elementsDirs = [path.join(rootDir, 'elements')];\n const elementsInclude = rootConfig.elements?.include || [];\n 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 (!directoryContains(rootDir, elementsDir)) {\n throw new Error(\n `the elements dir (${dirPath}) should be within the project's workspace (${workspaceRoot})`\n );\n }\n elementsDirs.push(elementsDir);\n }\n\n const elementMap: Record<string, ElementModule> = {};\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 filePath = path.join(dirPath, file);\n const src = path.relative(rootDir, filePath);\n const realPath = fs.realpathSync(filePath);\n if (!excludeElement(src)) {\n elementMap[parts.name] = {\n src,\n filePath,\n realPath,\n };\n }\n }\n });\n }\n }\n return elementMap;\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\nexport async function directoryContains(\n dirpath: string,\n subpath: string\n): Promise<boolean> {\n const outer = await fs.realpath(dirpath);\n const inner = await fs.realpath(subpath);\n const rel = path.relative(outer, inner);\n return !rel.startsWith('..');\n}\n","import path from 'node:path';\nimport {ModuleGraph, ModuleNode, searchForWorkspaceRoot} from 'vite';\nimport {RootConfig} from '../../core/config';\nimport {directoryContains} from '../../core/fsutils';\nimport {Asset, AssetMap} from './asset-map';\n\nexport class DevServerAssetMap implements AssetMap {\n private rootConfig: RootConfig;\n private moduleGraph: ModuleGraph;\n\n constructor(rootConfig: RootConfig, moduleGraph: ModuleGraph) {\n this.rootConfig = rootConfig;\n this.moduleGraph = moduleGraph;\n }\n\n async get(src: string): Promise<Asset | null> {\n const file = path.resolve(this.rootConfig.rootDir, src);\n\n const viteModules = this.moduleGraph.getModulesByFile(file);\n if (viteModules && viteModules.size > 0) {\n const [viteModule] = viteModules;\n return new DevServerAsset(src, {\n assetMap: this,\n viteModule: viteModule,\n });\n }\n\n // On dev, in some cases the module doesn't make it into the module graph\n // so return a generic asset.\n if (file.startsWith(this.rootConfig.rootDir)) {\n const assetUrl = file.slice(this.rootConfig.rootDir.length);\n return {\n src: src,\n assetUrl: assetUrl,\n getCssDeps: async () => [],\n getJsDeps: async () => [assetUrl],\n };\n }\n const workspaceRoot = searchForWorkspaceRoot(this.rootConfig.rootDir);\n if (await directoryContains(workspaceRoot, file)) {\n const assetUrl = `/@fs/${file}`;\n return {\n src: src,\n assetUrl: assetUrl,\n getCssDeps: async () => [],\n getJsDeps: async () => [assetUrl],\n };\n }\n\n console.log(`could not find asset in asset map: ${src}`);\n return null;\n }\n\n filePathToSrc(file: string) {\n return path.relative(this.rootConfig.rootDir, file);\n }\n}\n\nexport class DevServerAsset implements Asset {\n src: string;\n moduleId: string;\n assetUrl: string;\n private assetMap: DevServerAssetMap;\n private viteModule: ModuleNode;\n\n constructor(\n src: string,\n options: {\n assetMap: DevServerAssetMap;\n viteModule: ModuleNode;\n }\n ) {\n this.src = src;\n this.assetMap = options.assetMap;\n this.viteModule = options.viteModule;\n this.moduleId = this.viteModule.id!;\n this.assetUrl = this.viteModule.url;\n }\n\n async getCssDeps(): Promise<string[]> {\n const visited = new Set<string>();\n const deps = new Set<string>();\n this.collectCss(this, deps, visited);\n return Array.from(deps);\n }\n\n async getJsDeps(): Promise<string[]> {\n const visited = new Set<string>();\n const deps = new Set<string>();\n this.collectJs(this, deps, visited);\n return Array.from(deps);\n }\n\n getImportedModules() {\n return this.viteModule.importedModules;\n }\n\n private collectJs(\n asset: DevServerAsset | null,\n urls: Set<string>,\n visited: Set<string>\n ) {\n if (!asset) {\n return;\n }\n if (!asset.moduleId) {\n return;\n }\n if (visited.has(asset.moduleId)) {\n return;\n }\n visited.add(asset.moduleId);\n const parts = path.parse(asset.assetUrl);\n if (\n ['.js', '.jsx', '.ts', '.tsx'].includes(parts.ext) &&\n asset.moduleId.includes('/elements/')\n ) {\n urls.add(asset.assetUrl);\n }\n asset.getImportedModules().forEach((viteModule) => {\n if (viteModule.file) {\n const src = this.assetMap.filePathToSrc(viteModule.file);\n const importedAsset = new DevServerAsset(src, {\n assetMap: this.assetMap,\n viteModule: viteModule,\n });\n this.collectJs(importedAsset, urls, visited);\n }\n });\n }\n\n private collectCss(\n asset: DevServerAsset | null,\n urls: Set<string>,\n visited: Set<string>\n ) {\n if (!asset) {\n return;\n }\n if (!asset.assetUrl) {\n return;\n }\n if (visited.has(asset.assetUrl)) {\n return;\n }\n visited.add(asset.assetUrl);\n if (asset.src.endsWith('.scss')) {\n const parts = path.parse(asset.src);\n if (!parts.name.startsWith('_')) {\n urls.add(asset.assetUrl);\n }\n }\n asset.getImportedModules().forEach((viteModule) => {\n if (viteModule.file) {\n const src = this.assetMap.filePathToSrc(viteModule.file);\n const importedAsset = new DevServerAsset(src, {\n assetMap: this.assetMap,\n viteModule: viteModule,\n });\n this.collectCss(importedAsset, urls, visited);\n }\n });\n }\n}\n","import {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 Object.assign({}, configBundle.mod.default || {}, {rootDir});\n }\n return {rootDir};\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 {createServer} from 'node:net';\n\n/**\n * Checks whether a port is open.\n */\nexport function isPortOpen(port: number): Promise<boolean> {\n return new Promise((resolve, reject) => {\n const server = createServer();\n server.on('error', (err: NodeJS.ErrnoException) => {\n if (err.code === 'EADDRINUSE') {\n resolve(false);\n return;\n }\n reject(err);\n });\n server.on('close', () => {\n resolve(true);\n });\n server.listen(port, () => {\n server.close((err) => {\n if (err) {\n console.log(`error closing server: ${err}`);\n reject(err);\n }\n });\n });\n });\n}\n\n/**\n * Finds the first open port between two values.\n */\nexport async function findOpenPort(min: number, max: number): Promise<number> {\n let port = min;\n while (port <= max) {\n const isOpen = await isPortOpen(port);\n if (isOpen) {\n return port;\n }\n port += 1;\n }\n throw new Error(`no ports open between ${min} and ${max}`);\n}\n","import 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';\nimport {getElements} from '../../core/elements.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 routeFiles: string[] = [];\n if (await isDirectory(path.join(rootDir, 'routes'))) {\n const pageFiles = await glob('routes/**/*', {cwd: rootDir});\n pageFiles.forEach((file) => {\n const parts = path.parse(file);\n if (!parts.name.startsWith('_') && isJsFile(parts.base)) {\n routeFiles.push(path.resolve(rootDir, file));\n }\n });\n }\n\n const elementsMap = await getElements(rootConfig);\n const elements = Object.values(elementsMap).map((mod) =>\n path.resolve(rootDir, mod.src)\n );\n\n const bundleScripts: string[] = [];\n if (await isDirectory(path.join(rootDir, 'bundles'))) {\n const bundleFiles = await glob('bundles/*', {cwd: rootDir});\n bundleFiles.forEach((file) => {\n const parts = path.parse(file);\n if (isJsFile(parts.base)) {\n bundleScripts.push(path.resolve(rootDir, file));\n }\n });\n }\n\n const viteConfig = rootConfig.vite || {};\n const vitePlugins = [\n pluginRoot({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: [...routeFiles, ...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, elementsMap);\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 {ElementModule} from 'virtual:root-elements';\nimport {Manifest} from 'vite';\nimport {Asset, AssetMap} from './asset-map';\n\nexport type BuildAssetManifest = Record<\n string,\n {\n src: string;\n assetUrl: string;\n importedModules: string[];\n importedCss: string[];\n isElement: boolean;\n }\n>;\n\nexport class BuildAssetMap implements AssetMap {\n private srcToAsset: Map<string, BuildAsset>;\n\n constructor() {\n this.srcToAsset = new Map();\n }\n\n async get(src: string): Promise<Asset | null> {\n const asset = this.srcToAsset.get(src);\n if (asset) {\n return asset;\n }\n console.log(`could not find build asset: ${src}`);\n return null;\n }\n\n private add(asset: BuildAsset) {\n this.srcToAsset.set(asset.src, asset);\n }\n\n toJson(): BuildAssetManifest {\n const result: BuildAssetManifest = {};\n for (const src of this.srcToAsset.keys()) {\n result[src] = this.srcToAsset.get(src)!.toJson();\n }\n return result;\n }\n\n static fromViteManifest(\n viteManifest: Manifest,\n elementMap: Record<string, ElementModule>\n ) {\n const assetMap = new BuildAssetMap();\n\n const elementFiles = new Set();\n Object.values(elementMap).forEach((elementModule) =>\n elementFiles.add(elementModule.src)\n );\n\n Object.keys(viteManifest).forEach((manifestKey) => {\n const src = manifestKey;\n const manifestChunk = viteManifest[manifestKey];\n const isElement = elementFiles.has(src);\n const assetData = {\n src: src,\n assetUrl: `/${manifestChunk.file}`,\n importedModules: manifestChunk.imports || [],\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 src: string;\n assetUrl: string;\n private assetMap: BuildAssetMap;\n private importedModules: string[];\n private importedCss: string[];\n isElement: boolean;\n\n constructor(\n assetMap: BuildAssetMap,\n assetData: {\n src: string;\n assetUrl: string;\n importedModules: string[];\n importedCss: string[];\n isElement: boolean;\n }\n ) {\n this.assetMap = assetMap;\n this.src = assetData.src;\n this.assetUrl = assetData.assetUrl;\n this.importedModules = assetData.importedModules;\n this.importedCss = assetData.importedCss;\n this.isElement = assetData.isElement;\n }\n\n async getCssDeps(): Promise<string[]> {\n const visited = new Set<string>();\n const deps = new Set<string>();\n await this.collectCss(this, deps, visited);\n return Array.from(deps);\n }\n\n async getJsDeps(): Promise<string[]> {\n const visited = new Set<string>();\n const deps = new Set<string>();\n await this.collectJs(this, deps, visited);\n return Array.from(deps);\n }\n\n private async collectJs(\n asset: BuildAsset | null,\n urls: Set<string>,\n visited: Set<string>\n ) {\n if (!asset) {\n return;\n }\n if (!asset.src) {\n return;\n }\n if (visited.has(asset.src)) {\n return;\n }\n visited.add(asset.src);\n if (asset.isElement) {\n urls.add(asset.assetUrl);\n }\n await Promise.all(\n asset.importedModules.map(async (src) => {\n const importedAsset = (await this.assetMap.get(src)) as BuildAsset;\n this.collectJs(importedAsset, urls, visited);\n })\n );\n }\n\n private async collectCss(\n asset: BuildAsset | null,\n urls: Set<string>,\n visited: Set<string>\n ) {\n if (!asset) {\n return;\n }\n if (!asset.assetUrl) {\n return;\n }\n if (visited.has(asset.src)) {\n return;\n }\n visited.add(asset.src);\n if (asset.importedCss) {\n asset.importedCss.forEach((cssUrl) => urls.add(cssUrl));\n }\n await Promise.all(\n asset.importedModules.map(async (moduleId) => {\n const importedAsset = (await this.assetMap.get(moduleId)) as BuildAsset;\n this.collectCss(importedAsset, urls, visited);\n })\n );\n }\n\n toJson() {\n return {\n src: this.src,\n assetUrl: this.assetUrl,\n importedModules: this.importedModules,\n importedCss: this.importedCss,\n isElement: this.isElement,\n };\n }\n}\n","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":"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","names":["path","path","fs","path","path","fs","path","path","searchForWorkspaceRoot","path","searchForWorkspaceRoot","glob","path","createServer","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"]}
@@ -8,25 +8,42 @@ interface RouteModule {
8
8
  getStaticProps?: GetStaticProps;
9
9
  }
10
10
  interface Route {
11
- modulePath: string;
11
+ src: string;
12
12
  module: RouteModule;
13
13
  locale: string;
14
14
  }
15
15
 
16
16
  interface Asset {
17
- moduleId: string;
17
+ /**
18
+ * The path to the asset's src file, relative to the project root.
19
+ */
20
+ src: string;
21
+ /**
22
+ * The serving URL for the asset.
23
+ */
18
24
  assetUrl: string;
25
+ /**
26
+ * Recursively walks all deps and returns a list of CSS asset URLs.
27
+ */
19
28
  getCssDeps(): Promise<string[]>;
29
+ /**
30
+ * Recursively walks all deps and returns a list of JS asset URLs.
31
+ */
20
32
  getJsDeps(): Promise<string[]>;
21
33
  }
22
34
  interface AssetMap {
23
- get: (moduleId: string) => Promise<Asset | null>;
35
+ /**
36
+ * Returns the asset for a given src file. The `src` value should be a path
37
+ * relative to the project root, e.g. "routes/index.tsx".
38
+ */
39
+ get: (src: string) => Promise<Asset | null>;
24
40
  }
25
41
 
26
42
  declare class Renderer {
43
+ private rootConfig;
27
44
  private routes;
28
45
  private assetMap;
29
- constructor(config: RootConfig, options: {
46
+ constructor(rootConfig: RootConfig, options: {
30
47
  assetMap: AssetMap;
31
48
  });
32
49
  render(url: string): Promise<{
@@ -102,7 +119,7 @@ interface Plugin {
102
119
  declare function configureServerPlugins(server: Server, callback: () => Promise<void>, plugins: Plugin[], options: ConfigureServerOptions): Promise<void>;
103
120
  declare function getVitePlugins(plugins: Plugin[]): PluginOption[];
104
121
 
105
- interface RootConfig {
122
+ interface RootUserConfig {
106
123
  /**
107
124
  * Config for auto-injecting custom element dependencies.
108
125
  */
@@ -145,6 +162,9 @@ interface RootConfig {
145
162
  */
146
163
  plugins?: Plugin[];
147
164
  }
165
+ declare type RootConfig = RootUserConfig & {
166
+ rootDir: string;
167
+ };
148
168
  interface RootI18nConfig {
149
169
  /**
150
170
  * Locales enabled for the site.
@@ -166,6 +186,6 @@ interface RootServerConfig {
166
186
  */
167
187
  middlewares?: Array<(req: Request, res: Response, next: NextFunction) => void | Promise<void>>;
168
188
  }
169
- declare function defineConfig(config: RootConfig): RootConfig;
189
+ declare function defineConfig(config: RootUserConfig): RootUserConfig;
170
190
 
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 };
191
+ export { ConfigureServerHook as C, GetStaticProps as G, NextFunction as N, Plugin as P, RootUserConfig as R, Server as S, RootConfig as a, RootI18nConfig as b, RootServerConfig as c, defineConfig as d, ConfigureServerOptions as e, configureServerPlugins as f, getVitePlugins as g, GetStaticPaths as h, Request as i, Response as j, Renderer as k };
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 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';
3
+ export { C as ConfigureServerHook, e as ConfigureServerOptions, h as GetStaticPaths, G as GetStaticProps, N as NextFunction, P as Plugin, i as Request, j as Response, a as RootConfig, b as RootI18nConfig, c as RootServerConfig, R as RootUserConfig, S as Server, f as configureServerPlugins, d as defineConfig, g as getVitePlugins } from './config-1674bc63.js';
4
4
  import 'express';
5
5
  import 'vite';
6
6
 
package/dist/core.js.map CHANGED
@@ -1 +1 @@
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":[]}
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 RootUserConfig {\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 type RootConfig = RootUserConfig & {\n rootDir: string;\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: RootUserConfig): RootUserConfig {\n return config;\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAsFO,SAAS,aAAa,QAAwC;AACnE,SAAO;AACT;","names":[]}
package/dist/render.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- export { j as Renderer } from './config-3a70dc3b.js';
1
+ export { k as Renderer } from './config-1674bc63.js';
2
2
  import 'express';
3
3
  import 'vite';
4
4
  import 'preact';
package/dist/render.js CHANGED
@@ -149,8 +149,9 @@ function getRoutes(config) {
149
149
  }
150
150
  );
151
151
  const trie = new RouteTrie();
152
- Object.keys(routes).forEach((filePath) => {
153
- let routePath = filePath.replace(/^\/routes/, "");
152
+ Object.keys(routes).forEach((modulePath) => {
153
+ const src = modulePath.slice(1);
154
+ let routePath = modulePath.replace(/^\/routes/, "");
154
155
  const parts = path.parse(routePath);
155
156
  if (parts.name.startsWith("_")) {
156
157
  return;
@@ -161,16 +162,16 @@ function getRoutes(config) {
161
162
  routePath = path.join(parts.dir, parts.name);
162
163
  }
163
164
  trie.add(routePath, {
164
- modulePath: filePath,
165
- module: routes[filePath],
165
+ src,
166
+ module: routes[modulePath],
166
167
  locale: defaultLocale
167
168
  });
168
169
  locales.forEach((locale) => {
169
170
  const localeRoutePath = i18nUrlFormat.replace("{locale}", locale).replace("{path}", routePath.replace(/^\/*/, ""));
170
171
  if (localeRoutePath !== routePath) {
171
172
  trie.add(localeRoutePath, {
172
- modulePath: filePath,
173
- module: routes[filePath],
173
+ src,
174
+ module: routes[modulePath],
174
175
  locale
175
176
  });
176
177
  }
@@ -331,8 +332,9 @@ function DevNotFoundPage(props) {
331
332
  // src/render/render.tsx
332
333
  import { jsx as jsx2, jsxs as jsxs2 } from "preact/jsx-runtime";
333
334
  var Renderer = class {
334
- constructor(config, options) {
335
- this.routes = getRoutes(config);
335
+ constructor(rootConfig, options) {
336
+ this.rootConfig = rootConfig;
337
+ this.routes = getRoutes(rootConfig);
336
338
  this.assetMap = options.assetMap;
337
339
  }
338
340
  async render(url) {
@@ -380,7 +382,7 @@ var Renderer = class {
380
382
  })
381
383
  });
382
384
  const mainHtml = renderToString(vdom, {}, { pretty: true });
383
- const pageAsset = await assetMap.get(route.modulePath);
385
+ const pageAsset = await assetMap.get(route.src);
384
386
  const cssDeps = await (pageAsset == null ? void 0 : pageAsset.getCssDeps());
385
387
  if (cssDeps) {
386
388
  cssDeps.forEach((cssUrl) => {
@@ -487,8 +489,8 @@ ${renderToString(
487
489
  matches.map(async (match) => {
488
490
  const tagName = match[1];
489
491
  if (tagName && tagName.includes("-") && tagName in elementsMap) {
490
- const modulePath = elementsMap[tagName];
491
- const asset = await assetMap.get(modulePath);
492
+ const elementModule = elementsMap[tagName];
493
+ const asset = await assetMap.get(elementModule.src);
492
494
  if (!asset) {
493
495
  return;
494
496
  }