@blinkk/root 1.0.0-alpha.27 → 1.0.0-alpha.29
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-5FVR2OXQ.js → chunk-ACIQKW7Y.js} +33 -12
- package/dist/chunk-ACIQKW7Y.js.map +1 -0
- package/dist/cli.js +8 -3
- package/dist/cli.js.map +1 -1
- package/dist/core.d.ts +25 -1
- package/dist/core.js +5 -1
- package/dist/core.js.map +1 -1
- package/dist/render.js +16 -6
- package/dist/render.js.map +1 -1
- package/package.json +1 -1
- package/dist/chunk-5FVR2OXQ.js.map +0 -1
|
@@ -43,14 +43,33 @@ function Head(props) {
|
|
|
43
43
|
return null;
|
|
44
44
|
}
|
|
45
45
|
|
|
46
|
-
// src/core/components/
|
|
46
|
+
// src/core/components/html.ts
|
|
47
47
|
import { createContext as createContext2 } from "preact";
|
|
48
48
|
import { useContext as useContext2 } from "preact/hooks";
|
|
49
|
-
var
|
|
49
|
+
var HTML_CONTEXT = createContext2({ attrs: {} });
|
|
50
|
+
function Html({ children, ...attrs }) {
|
|
51
|
+
let context;
|
|
52
|
+
try {
|
|
53
|
+
context = useContext2(HTML_CONTEXT);
|
|
54
|
+
context.attrs = attrs;
|
|
55
|
+
} catch (err) {
|
|
56
|
+
console.log(err);
|
|
57
|
+
throw new Error(
|
|
58
|
+
"<Html> component is not supported in the browser, or during suspense renders.",
|
|
59
|
+
{ cause: err }
|
|
60
|
+
);
|
|
61
|
+
}
|
|
62
|
+
return children;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// src/core/components/script.ts
|
|
66
|
+
import { createContext as createContext3 } from "preact";
|
|
67
|
+
import { useContext as useContext3 } from "preact/hooks";
|
|
68
|
+
var SCRIPT_CONTEXT = createContext3([]);
|
|
50
69
|
function Script(props) {
|
|
51
70
|
let context;
|
|
52
71
|
try {
|
|
53
|
-
context =
|
|
72
|
+
context = useContext3(SCRIPT_CONTEXT);
|
|
54
73
|
} catch (err) {
|
|
55
74
|
throw new Error(
|
|
56
75
|
"<Script> component is not supported in the browser, or during suspense renders.",
|
|
@@ -63,9 +82,9 @@ function Script(props) {
|
|
|
63
82
|
|
|
64
83
|
// src/core/i18n.ts
|
|
65
84
|
import path from "node:path";
|
|
66
|
-
import { createContext as
|
|
67
|
-
import { useContext as
|
|
68
|
-
var I18N_CONTEXT =
|
|
85
|
+
import { createContext as createContext4 } from "preact";
|
|
86
|
+
import { useContext as useContext4 } from "preact/hooks";
|
|
87
|
+
var I18N_CONTEXT = createContext4(null);
|
|
69
88
|
function getTranslations(locale) {
|
|
70
89
|
const translations = {};
|
|
71
90
|
const translationsFiles = import.meta.glob(["/translations/*.json"], {
|
|
@@ -82,7 +101,7 @@ function getTranslations(locale) {
|
|
|
82
101
|
return translations[locale] || {};
|
|
83
102
|
}
|
|
84
103
|
function useI18nContext() {
|
|
85
|
-
const context =
|
|
104
|
+
const context = useContext4(I18N_CONTEXT);
|
|
86
105
|
if (!context) {
|
|
87
106
|
throw new Error("could not find i18n context");
|
|
88
107
|
}
|
|
@@ -105,11 +124,11 @@ function useTranslations() {
|
|
|
105
124
|
}
|
|
106
125
|
|
|
107
126
|
// src/core/request-context.ts
|
|
108
|
-
import { createContext as
|
|
109
|
-
import { useContext as
|
|
110
|
-
var REQUEST_CONTEXT =
|
|
127
|
+
import { createContext as createContext5 } from "preact";
|
|
128
|
+
import { useContext as useContext5 } from "preact/hooks";
|
|
129
|
+
var REQUEST_CONTEXT = createContext5(null);
|
|
111
130
|
function useRequestContext() {
|
|
112
|
-
const context =
|
|
131
|
+
const context = useContext5(REQUEST_CONTEXT);
|
|
113
132
|
if (!context) {
|
|
114
133
|
throw new Error("could not find request context");
|
|
115
134
|
}
|
|
@@ -120,6 +139,8 @@ export {
|
|
|
120
139
|
ErrorPage,
|
|
121
140
|
HEAD_CONTEXT,
|
|
122
141
|
Head,
|
|
142
|
+
HTML_CONTEXT,
|
|
143
|
+
Html,
|
|
123
144
|
SCRIPT_CONTEXT,
|
|
124
145
|
Script,
|
|
125
146
|
I18N_CONTEXT,
|
|
@@ -129,4 +150,4 @@ export {
|
|
|
129
150
|
REQUEST_CONTEXT,
|
|
130
151
|
useRequestContext
|
|
131
152
|
};
|
|
132
|
-
//# sourceMappingURL=chunk-
|
|
153
|
+
//# sourceMappingURL=chunk-ACIQKW7Y.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/components/error-page.tsx","../src/core/components/head.ts","../src/core/components/html.ts","../src/core/components/script.ts","../src/core/i18n.ts","../src/core/request-context.ts"],"sourcesContent":["export interface ErrorPageProps {\n error: unknown;\n}\n\nexport function ErrorPage(props: ErrorPageProps) {\n const error = props.error;\n\n let message = undefined;\n if (import.meta.env.DEV) {\n if (error instanceof Error) {\n message = error.stack;\n } else {\n message = String(error);\n }\n }\n\n return (\n <div>\n <div>\n <p>An error occured during route handling or page rendering.</p>\n {message && <pre>{message}</pre>}\n </div>\n </div>\n );\n}\n","import {ComponentChildren, createContext} from 'preact';\nimport {useContext} from 'preact/hooks';\n\nexport const HEAD_CONTEXT = createContext<ComponentChildren[]>([]);\n\nexport interface HeadProps {\n children?: ComponentChildren;\n}\n\n/**\n * The <Head> component can be used for injecting elements into the HTML head\n * tag from any part of a page.\n */\nexport function Head(props: HeadProps) {\n let context: ComponentChildren[];\n try {\n context = useContext(HEAD_CONTEXT);\n } catch (err) {\n console.log(err);\n throw new Error(\n '<Head> component is not supported in the browser, or during suspense renders.',\n {cause: err}\n );\n }\n context.push(props.children);\n return null;\n}\n","import {createContext} from 'preact';\nimport {useContext} from 'preact/hooks';\n\nexport interface HtmlContextValue {\n attrs: Record<string, string>;\n}\n\nexport const HTML_CONTEXT = createContext<HtmlContextValue>({attrs: {}});\n\nexport type HtmlProps = {\n [key: string]: string;\n} & preact.JSX.HTMLAttributes<HTMLHtmlElement>;\n\n/**\n * The <Html> component can be used to update attrs used in the <html> tag.\n *\n * Usage:\n *\n * import {Html} from '@blinkk/root';\n *\n * export default function Page() {\n * return (\n * <Html lang={locale}>\n * <h1>Hello world</h1>\n * </Html>\n * );\n * }\n */\nexport function Html({children, ...attrs}: HtmlProps) {\n let context: Record<string, any>;\n try {\n context = useContext(HTML_CONTEXT);\n context.attrs = attrs;\n } catch (err) {\n console.log(err);\n throw new Error(\n '<Html> component is not supported in the browser, or during suspense renders.',\n {cause: err}\n );\n }\n return children;\n}\n","import {createContext} from 'preact';\nimport {useContext} from 'preact/hooks';\n\nexport const SCRIPT_CONTEXT = createContext<ScriptProps[]>([]);\n\nexport interface ScriptProps {\n src: string;\n type?: string;\n}\n\n/**\n * The <Script> component is used for rendering any custom script modules. At\n * the moment, the system only pre-renders and bundles files that are in the\n * `/bundles` folder at the root of the project.\n */\nexport function Script(props: ScriptProps) {\n let context: ScriptProps[];\n try {\n context = useContext(SCRIPT_CONTEXT);\n } catch (err) {\n throw new Error(\n '<Script> component is not supported in the browser, or during suspense renders.',\n {cause: err}\n );\n }\n context.push(props);\n return null;\n}\n","import path from 'node:path';\nimport {createContext} from 'preact';\nimport {useContext} from 'preact/hooks';\n\nexport const I18N_CONTEXT = createContext<I18nContext | null>(null);\n\nexport interface I18nContext {\n locale: string;\n translations: Record<string, string>;\n}\n\nexport function getTranslations(locale: string): Record<string, string> {\n const translations: Record<string, Record<string, string>> = {};\n const translationsFiles = import.meta.glob(['/translations/*.json'], {\n eager: true,\n }) as Record<string, {default?: Record<string, string>}>;\n Object.keys(translationsFiles).forEach((translationPath) => {\n const parts = path.parse(translationPath);\n const locale = parts.name;\n const module = translationsFiles[translationPath];\n if (module && module.default) {\n translations[locale] = module.default;\n }\n });\n return translations[locale] || {};\n}\n\nexport function useI18nContext() {\n const context = useContext(I18N_CONTEXT);\n if (!context) {\n throw new Error('could not find i18n context');\n }\n return context;\n}\n\nexport function useTranslations() {\n const context = useI18nContext();\n const translations = context.translations || {};\n const t = (str: string, params?: Record<string, string>) => {\n let translation = translations[str] || str || '';\n if (params) {\n for (const key of Object.keys(params)) {\n const val = String(params[key] || '');\n translation = translation.replaceAll(`{${key}}`, val);\n }\n }\n return translation;\n };\n return t;\n}\n","import {createContext} from 'preact';\nimport {useContext} from 'preact/hooks';\nimport {Route} from '../render/router';\n\nexport interface RequestContext {\n /** The route file. */\n route: Route;\n /**\n * Route param values. E.g. for a route like `routes/blog/[slug].tsx`,\n * visiting `/blog/foo` will pass {slug: 'foo'} here.\n */\n routeParams: Record<string, string>;\n /** Props passed to the route's server component. */\n props: any;\n /** The current locale. */\n locale: string;\n /** Translations map for the current locale. */\n translations: Record<string, string>;\n}\n\nexport const REQUEST_CONTEXT = createContext<RequestContext | null>(null);\n\nexport function useRequestContext() {\n const context = useContext(REQUEST_CONTEXT);\n if (!context) {\n throw new Error('could not find request context');\n }\n return context;\n}\n"],"mappings":"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","names":["createContext","useContext","createContext","useContext","createContext","useContext","locale","createContext","useContext"]}
|
package/dist/cli.js
CHANGED
|
@@ -754,6 +754,7 @@ var BuildAsset = class {
|
|
|
754
754
|
import { dim as dim2, cyan } from "kleur/colors";
|
|
755
755
|
var __dirname2 = path7.dirname(fileURLToPath2(import.meta.url));
|
|
756
756
|
async function build(rootProjectDir, options) {
|
|
757
|
+
var _a, _b, _c, _d;
|
|
757
758
|
const rootDir = path7.resolve(rootProjectDir || process.cwd());
|
|
758
759
|
const rootConfig = await loadRootConfig(rootDir);
|
|
759
760
|
const distDir = path7.join(rootDir, "dist");
|
|
@@ -812,10 +813,11 @@ async function build(rootProjectDir, options) {
|
|
|
812
813
|
publicDir: false,
|
|
813
814
|
build: {
|
|
814
815
|
rollupOptions: {
|
|
816
|
+
...(_a = viteConfig == null ? void 0 : viteConfig.build) == null ? void 0 : _a.rollupOptions,
|
|
815
817
|
input: [path7.resolve(__dirname2, "./render.js")],
|
|
816
818
|
output: {
|
|
817
819
|
format: "esm",
|
|
818
|
-
chunkFileNames: "chunks/[name].[hash].js",
|
|
820
|
+
chunkFileNames: "chunks/[name].[hash].min.js",
|
|
819
821
|
assetFileNames: "assets/[name].[hash][extname]"
|
|
820
822
|
}
|
|
821
823
|
},
|
|
@@ -837,11 +839,14 @@ async function build(rootProjectDir, options) {
|
|
|
837
839
|
publicDir: false,
|
|
838
840
|
build: {
|
|
839
841
|
rollupOptions: {
|
|
842
|
+
...(_b = viteConfig == null ? void 0 : viteConfig.build) == null ? void 0 : _b.rollupOptions,
|
|
840
843
|
input: [...routeFiles, ...elements, ...bundleScripts],
|
|
841
844
|
output: {
|
|
842
845
|
format: "esm",
|
|
843
|
-
|
|
844
|
-
|
|
846
|
+
entryFileNames: "[name].[hash].min.js",
|
|
847
|
+
chunkFileNames: "chunks/[name].[hash].min.js",
|
|
848
|
+
assetFileNames: "assets/[name].[hash][extname]",
|
|
849
|
+
...(_d = (_c = viteConfig == null ? void 0 : viteConfig.build) == null ? void 0 : _c.rollupOptions) == null ? void 0 : _d.output
|
|
845
850
|
}
|
|
846
851
|
},
|
|
847
852
|
outDir: path7.join(distDir, "client"),
|
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/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 await pluginRoot({rootConfig}),\n ...(viteConfig.plugins || []),\n ...getVitePlugins(rootConfig.plugins || []),\n ],\n });\n return async (req: Request, res: Response, next: NextFunction) => {\n try {\n req.viteServer = viteServer;\n viteServer.middlewares(req, res, next);\n } catch (e) {\n next(e);\n }\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 try {\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(\n rootConfig,\n viteServer.moduleGraph\n );\n req.renderer = new render.Renderer(rootConfig, {assetMap});\n next();\n } catch (e) {\n next(e);\n }\n };\n}\n\nfunction rootDevServerMiddleware() {\n return async (req: Request, res: Response, next: NextFunction) => {\n const url = req.path;\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 // HTML minification is `true` by default. Set to `false` to disable.\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.path;\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 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\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 await updateElementMap();\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 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, blue, cyan} 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(\n rootConfig,\n viteManifest,\n elementsMap\n );\n\n // Save the asset map to `dist/client` for use by the prod SSR server.\n const rootManifest = assetMap.toJson();\n writeFile(\n path.join(distDir, 'client/root-manifest.json'),\n JSON.stringify(rootManifest, 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\n // Copy files from `dist/client/{assets,chunks}` to `dist/html` using the\n // root manifest. Ignore route files.\n console.log('\\njs/css output:');\n makeDir(path.join(buildDir, 'assets'));\n makeDir(path.join(buildDir, 'chunks'));\n Object.keys(rootManifest).forEach((src) => {\n // Don't expose route files in the final output. If any client-side code\n // relies on route dependencies, it should probably be broken out into a\n // shared component instead.\n if (isRouteFile(src)) {\n return;\n }\n const assetData = rootManifest[src];\n const assetRelPath = assetData.assetUrl.slice(1);\n const assetFrom = path.join(distDir, 'client', assetRelPath);\n const assetTo = path.join(buildDir, assetRelPath);\n fsExtra.copySync(assetFrom, assetTo);\n printFileOutput(fileSize(assetTo), 'dist/html/', assetRelPath);\n });\n\n // Pre-render HTML pages (SSG).\n if (!ssrOnly) {\n const render: RenderModule = await import(\n path.join(distDir, 'server/render.js')\n );\n const renderer = new render.Renderer(rootConfig, {assetMap});\n const sitemap = await renderer.getSitemap();\n\n console.log('\\nhtml output:');\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 outFilePath = path.join(urlPath.slice(1), 'index.html');\n if (outFilePath.endsWith('404/index.html')) {\n outFilePath = outFilePath.replace('404/index.html', '404.html');\n }\n const outPath = path.join(buildDir, outFilePath);\n\n let html = data.html || '';\n // HTML minification is `true` by default. Set to `false` to disable.\n if (rootConfig.minifyHtml !== false) {\n html = await htmlMinify(html);\n }\n await writeFile(outPath, html);\n\n printFileOutput(fileSize(outPath), 'dist/html/', outFilePath);\n })\n );\n }\n}\n\nfunction isRouteFile(filepath: string) {\n return filepath.startsWith('routes') && isJsFile(filepath);\n}\n\nfunction fileSize(filepath: string) {\n const stats = fsExtra.statSync(filepath);\n const bytes = stats.size;\n\n const k = 1024;\n if (bytes < k) {\n return (bytes / k).toFixed(2) + ' kB';\n }\n const units = ['B', 'kB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + units[i];\n}\n\nfunction printFileOutput(\n fileSize: string,\n outputDir: string,\n outputFile: string\n) {\n const indent = ' '.repeat(2);\n const paddedSize = fileSize.padStart(9, ' ');\n console.log(\n `${indent}${dim(paddedSize)} ${dim(outputDir)}${cyan(outputFile)}`\n );\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport {ElementModule} from 'virtual:root-elements';\nimport {Manifest} from 'vite';\nimport {RootConfig} from '../../core/config';\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 rootConfig: RootConfig;\n private srcToAsset: Map<string, BuildAsset>;\n\n constructor(rootConfig: RootConfig) {\n this.rootConfig = rootConfig;\n this.srcToAsset = new Map();\n }\n\n async get(src: string): Promise<Asset | null> {\n const asset = this.srcToAsset.get(src);\n if (asset) {\n return asset;\n }\n // Try resolving the realpath of the asset, following symlinks.\n const realSrc = realPathRelativeTo(this.rootConfig.rootDir, src);\n if (realSrc !== src) {\n const asset = this.srcToAsset.get(realSrc);\n if (asset) {\n return asset;\n }\n }\n console.log(`could not find build asset: ${src}`);\n return null;\n }\n\n private add(asset: BuildAsset) {\n this.srcToAsset.set(asset.src, asset);\n }\n\n toJson(): BuildAssetManifest {\n const result: BuildAssetManifest = {};\n for (const src of this.srcToAsset.keys()) {\n result[src] = this.srcToAsset.get(src)!.toJson();\n }\n return result;\n }\n\n static fromViteManifest(\n rootConfig: RootConfig,\n viteManifest: Manifest,\n elementMap: Record<string, ElementModule>\n ) {\n const assetMap = new BuildAssetMap(rootConfig);\n\n const elementFiles = new Set();\n Object.values(elementMap).forEach((elementModule) => {\n elementFiles.add(elementModule.src);\n // Vite will resolve symlinks, so we need to follow the src and add the\n // realpath to the element files.\n const realSrc = realPathRelativeTo(rootConfig.rootDir, elementModule.src);\n if (realSrc !== elementModule.src) {\n elementFiles.add(realSrc);\n }\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(\n rootConfig: RootConfig,\n rootManifest: BuildAssetManifest\n ) {\n const assetMap = new BuildAssetMap(rootConfig);\n Object.keys(rootManifest).forEach((moduleId) => {\n const assetData = rootManifest[moduleId];\n assetMap.add(new BuildAsset(assetMap, assetData));\n });\n return assetMap;\n }\n}\n\n/**\n * Returns the realpath of a src file, relative to the rootDir.\n */\nfunction realPathRelativeTo(rootDir: string, src: string) {\n const fullPath = path.resolve(rootDir, src);\n if (!fs.existsSync(fullPath)) {\n return src;\n }\n const realpath = fs.realpathSync(path.resolve(rootDir, src));\n return path.relative(rootDir, realpath);\n}\n\nexport class BuildAsset {\n src: string;\n assetUrl: string;\n private assetMap: BuildAssetMap;\n private importedModules: string[];\n private importedCss: string[];\n isElement: boolean;\n\n constructor(\n assetMap: BuildAssetMap,\n assetData: {\n src: string;\n assetUrl: string;\n importedModules: string[];\n importedCss: string[];\n isElement: boolean;\n }\n ) {\n this.assetMap = assetMap;\n this.src = assetData.src;\n this.assetUrl = assetData.assetUrl;\n this.importedModules = assetData.importedModules;\n this.importedCss = assetData.importedCss;\n this.isElement = assetData.isElement;\n }\n\n async getCssDeps(): Promise<string[]> {\n const visited = new Set<string>();\n const deps = new Set<string>();\n await this.collectCss(this, deps, visited);\n return Array.from(deps);\n }\n\n async getJsDeps(): Promise<string[]> {\n const visited = new Set<string>();\n const deps = new Set<string>();\n await this.collectJs(this, deps, visited);\n return Array.from(deps);\n }\n\n private async collectJs(\n asset: BuildAsset | null,\n urls: Set<string>,\n visited: Set<string>\n ) {\n if (!asset) {\n return;\n }\n if (!asset.src) {\n return;\n }\n if (visited.has(asset.src)) {\n return;\n }\n visited.add(asset.src);\n if (asset.isElement) {\n urls.add(asset.assetUrl);\n }\n await Promise.all(\n asset.importedModules.map(async (src) => {\n const importedAsset = (await this.assetMap.get(src)) as BuildAsset;\n this.collectJs(importedAsset, urls, visited);\n })\n );\n }\n\n private async collectCss(\n asset: BuildAsset | null,\n urls: Set<string>,\n visited: Set<string>\n ) {\n if (!asset) {\n return;\n }\n if (!asset.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(rootConfig, 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.path;\n const data = await renderer.render(url);\n if (data.notFound || !data.html) {\n next();\n return;\n }\n let html = data.html || '';\n // HTML minification is `true` by default. Set to `false` to disable.\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(rootConfig, 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.path;\n const data = await renderer.render(url);\n if (data.notFound || !data.html) {\n next();\n return;\n }\n let html = data.html || '';\n // HTML minification is `true` by default. Set to `false` to disable.\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","fs","path","asset","dim","__dirname","path","fileURLToPath","dim","glob","fsExtra","fileSize","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 await pluginRoot({rootConfig}),\n ...(viteConfig.plugins || []),\n ...getVitePlugins(rootConfig.plugins || []),\n ],\n });\n return async (req: Request, res: Response, next: NextFunction) => {\n try {\n req.viteServer = viteServer;\n viteServer.middlewares(req, res, next);\n } catch (e) {\n next(e);\n }\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 try {\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(\n rootConfig,\n viteServer.moduleGraph\n );\n req.renderer = new render.Renderer(rootConfig, {assetMap});\n next();\n } catch (e) {\n next(e);\n }\n };\n}\n\nfunction rootDevServerMiddleware() {\n return async (req: Request, res: Response, next: NextFunction) => {\n const url = req.path;\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 // HTML minification is `true` by default. Set to `false` to disable.\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.path;\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 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\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 await updateElementMap();\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 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, blue, cyan} 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 ...viteConfig?.build?.rollupOptions,\n input: [path.resolve(__dirname, './render.js')],\n output: {\n format: 'esm',\n chunkFileNames: 'chunks/[name].[hash].min.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 ...viteConfig?.build?.rollupOptions,\n input: [...routeFiles, ...elements, ...bundleScripts],\n output: {\n format: 'esm',\n entryFileNames: '[name].[hash].min.js',\n chunkFileNames: 'chunks/[name].[hash].min.js',\n assetFileNames: 'assets/[name].[hash][extname]',\n ...viteConfig?.build?.rollupOptions?.output,\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(\n rootConfig,\n viteManifest,\n elementsMap\n );\n\n // Save the asset map to `dist/client` for use by the prod SSR server.\n const rootManifest = assetMap.toJson();\n writeFile(\n path.join(distDir, 'client/root-manifest.json'),\n JSON.stringify(rootManifest, 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` using the\n // root manifest. Ignore route files.\n console.log('\\njs/css output:');\n makeDir(path.join(buildDir, 'assets'));\n makeDir(path.join(buildDir, 'chunks'));\n Object.keys(rootManifest).forEach((src) => {\n // Don't expose route files in the final output. If any client-side code\n // relies on route dependencies, it should probably be broken out into a\n // shared component instead.\n if (isRouteFile(src)) {\n return;\n }\n const assetData = rootManifest[src];\n const assetRelPath = assetData.assetUrl.slice(1);\n const assetFrom = path.join(distDir, 'client', assetRelPath);\n const assetTo = path.join(buildDir, assetRelPath);\n fsExtra.copySync(assetFrom, assetTo);\n printFileOutput(fileSize(assetTo), 'dist/html/', assetRelPath);\n });\n\n // Pre-render HTML pages (SSG).\n if (!ssrOnly) {\n const render: RenderModule = await import(\n path.join(distDir, 'server/render.js')\n );\n const renderer = new render.Renderer(rootConfig, {assetMap});\n const sitemap = await renderer.getSitemap();\n\n console.log('\\nhtml output:');\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 outFilePath = path.join(urlPath.slice(1), 'index.html');\n if (outFilePath.endsWith('404/index.html')) {\n outFilePath = outFilePath.replace('404/index.html', '404.html');\n }\n const outPath = path.join(buildDir, outFilePath);\n\n let html = data.html || '';\n // HTML minification is `true` by default. Set to `false` to disable.\n if (rootConfig.minifyHtml !== false) {\n html = await htmlMinify(html);\n }\n await writeFile(outPath, html);\n\n printFileOutput(fileSize(outPath), 'dist/html/', outFilePath);\n })\n );\n }\n}\n\nfunction isRouteFile(filepath: string) {\n return filepath.startsWith('routes') && isJsFile(filepath);\n}\n\nfunction fileSize(filepath: string) {\n const stats = fsExtra.statSync(filepath);\n const bytes = stats.size;\n\n const k = 1024;\n if (bytes < k) {\n return (bytes / k).toFixed(2) + ' kB';\n }\n const units = ['B', 'kB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + units[i];\n}\n\nfunction printFileOutput(\n fileSize: string,\n outputDir: string,\n outputFile: string\n) {\n const indent = ' '.repeat(2);\n const paddedSize = fileSize.padStart(9, ' ');\n console.log(\n `${indent}${dim(paddedSize)} ${dim(outputDir)}${cyan(outputFile)}`\n );\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport {ElementModule} from 'virtual:root-elements';\nimport {Manifest} from 'vite';\nimport {RootConfig} from '../../core/config';\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 rootConfig: RootConfig;\n private srcToAsset: Map<string, BuildAsset>;\n\n constructor(rootConfig: RootConfig) {\n this.rootConfig = rootConfig;\n this.srcToAsset = new Map();\n }\n\n async get(src: string): Promise<Asset | null> {\n const asset = this.srcToAsset.get(src);\n if (asset) {\n return asset;\n }\n // Try resolving the realpath of the asset, following symlinks.\n const realSrc = realPathRelativeTo(this.rootConfig.rootDir, src);\n if (realSrc !== src) {\n const asset = this.srcToAsset.get(realSrc);\n if (asset) {\n return asset;\n }\n }\n console.log(`could not find build asset: ${src}`);\n return null;\n }\n\n private add(asset: BuildAsset) {\n this.srcToAsset.set(asset.src, asset);\n }\n\n toJson(): BuildAssetManifest {\n const result: BuildAssetManifest = {};\n for (const src of this.srcToAsset.keys()) {\n result[src] = this.srcToAsset.get(src)!.toJson();\n }\n return result;\n }\n\n static fromViteManifest(\n rootConfig: RootConfig,\n viteManifest: Manifest,\n elementMap: Record<string, ElementModule>\n ) {\n const assetMap = new BuildAssetMap(rootConfig);\n\n const elementFiles = new Set();\n Object.values(elementMap).forEach((elementModule) => {\n elementFiles.add(elementModule.src);\n // Vite will resolve symlinks, so we need to follow the src and add the\n // realpath to the element files.\n const realSrc = realPathRelativeTo(rootConfig.rootDir, elementModule.src);\n if (realSrc !== elementModule.src) {\n elementFiles.add(realSrc);\n }\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(\n rootConfig: RootConfig,\n rootManifest: BuildAssetManifest\n ) {\n const assetMap = new BuildAssetMap(rootConfig);\n Object.keys(rootManifest).forEach((moduleId) => {\n const assetData = rootManifest[moduleId];\n assetMap.add(new BuildAsset(assetMap, assetData));\n });\n return assetMap;\n }\n}\n\n/**\n * Returns the realpath of a src file, relative to the rootDir.\n */\nfunction realPathRelativeTo(rootDir: string, src: string) {\n const fullPath = path.resolve(rootDir, src);\n if (!fs.existsSync(fullPath)) {\n return src;\n }\n const realpath = fs.realpathSync(path.resolve(rootDir, src));\n return path.relative(rootDir, realpath);\n}\n\nexport class BuildAsset {\n src: string;\n assetUrl: string;\n private assetMap: BuildAssetMap;\n private importedModules: string[];\n private importedCss: string[];\n isElement: boolean;\n\n constructor(\n assetMap: BuildAssetMap,\n assetData: {\n src: string;\n assetUrl: string;\n importedModules: string[];\n importedCss: string[];\n isElement: boolean;\n }\n ) {\n this.assetMap = assetMap;\n this.src = assetData.src;\n this.assetUrl = assetData.assetUrl;\n this.importedModules = assetData.importedModules;\n this.importedCss = assetData.importedCss;\n this.isElement = assetData.isElement;\n }\n\n async getCssDeps(): Promise<string[]> {\n const visited = new Set<string>();\n const deps = new Set<string>();\n await this.collectCss(this, deps, visited);\n return Array.from(deps);\n }\n\n async getJsDeps(): Promise<string[]> {\n const visited = new Set<string>();\n const deps = new Set<string>();\n await this.collectJs(this, deps, visited);\n return Array.from(deps);\n }\n\n private async collectJs(\n asset: BuildAsset | null,\n urls: Set<string>,\n visited: Set<string>\n ) {\n if (!asset) {\n return;\n }\n if (!asset.src) {\n return;\n }\n if (visited.has(asset.src)) {\n return;\n }\n visited.add(asset.src);\n if (asset.isElement) {\n urls.add(asset.assetUrl);\n }\n await Promise.all(\n asset.importedModules.map(async (src) => {\n const importedAsset = (await this.assetMap.get(src)) as BuildAsset;\n this.collectJs(importedAsset, urls, visited);\n })\n );\n }\n\n private async collectCss(\n asset: BuildAsset | null,\n urls: Set<string>,\n visited: Set<string>\n ) {\n if (!asset) {\n return;\n }\n if (!asset.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(rootConfig, 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.path;\n const data = await renderer.render(url);\n if (data.notFound || !data.html) {\n next();\n return;\n }\n let html = data.html || '';\n // HTML minification is `true` by default. Set to `false` to disable.\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(rootConfig, 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.path;\n const data = await renderer.render(url);\n if (data.notFound || !data.html) {\n next();\n return;\n }\n let html = data.html || '';\n // HTML minification is `true` by default. Set to `false` to disable.\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","fs","path","asset","dim","__dirname","path","fileURLToPath","dim","glob","fsExtra","fileSize","path","express","dim","path","createServer","dim","express","path","express","dim","sirv","compression","path","createServer","dim","express","compression","sirv"]}
|
package/dist/core.d.ts
CHANGED
|
@@ -20,6 +20,30 @@ interface HeadProps {
|
|
|
20
20
|
*/
|
|
21
21
|
declare function Head(props: HeadProps): null;
|
|
22
22
|
|
|
23
|
+
interface HtmlContextValue {
|
|
24
|
+
attrs: Record<string, string>;
|
|
25
|
+
}
|
|
26
|
+
declare const HTML_CONTEXT: preact.Context<HtmlContextValue>;
|
|
27
|
+
declare type HtmlProps = {
|
|
28
|
+
[key: string]: string;
|
|
29
|
+
} & preact.JSX.HTMLAttributes<HTMLHtmlElement>;
|
|
30
|
+
/**
|
|
31
|
+
* The <Html> component can be used to update attrs used in the <html> tag.
|
|
32
|
+
*
|
|
33
|
+
* Usage:
|
|
34
|
+
*
|
|
35
|
+
* import {Html} from '@blinkk/root';
|
|
36
|
+
*
|
|
37
|
+
* export default function Page() {
|
|
38
|
+
* return (
|
|
39
|
+
* <Html lang={locale}>
|
|
40
|
+
* <h1>Hello world</h1>
|
|
41
|
+
* </Html>
|
|
42
|
+
* );
|
|
43
|
+
* }
|
|
44
|
+
*/
|
|
45
|
+
declare function Html({ children, ...attrs }: HtmlProps): preact.ComponentChildren;
|
|
46
|
+
|
|
23
47
|
declare const SCRIPT_CONTEXT: preact.Context<ScriptProps[]>;
|
|
24
48
|
interface ScriptProps {
|
|
25
49
|
src: string;
|
|
@@ -59,4 +83,4 @@ interface RequestContext {
|
|
|
59
83
|
declare const REQUEST_CONTEXT: preact.Context<RequestContext | null>;
|
|
60
84
|
declare function useRequestContext(): RequestContext;
|
|
61
85
|
|
|
62
|
-
export { ErrorPage, ErrorPageProps, HEAD_CONTEXT, Head, HeadProps, I18N_CONTEXT, I18nContext, REQUEST_CONTEXT, RequestContext, SCRIPT_CONTEXT, Script, ScriptProps, getTranslations, useI18nContext, useRequestContext, useTranslations };
|
|
86
|
+
export { ErrorPage, ErrorPageProps, HEAD_CONTEXT, HTML_CONTEXT, Head, HeadProps, Html, HtmlContextValue, HtmlProps, I18N_CONTEXT, I18nContext, REQUEST_CONTEXT, RequestContext, SCRIPT_CONTEXT, Script, ScriptProps, getTranslations, useI18nContext, useRequestContext, useTranslations };
|
package/dist/core.js
CHANGED
|
@@ -5,7 +5,9 @@ import {
|
|
|
5
5
|
import {
|
|
6
6
|
ErrorPage,
|
|
7
7
|
HEAD_CONTEXT,
|
|
8
|
+
HTML_CONTEXT,
|
|
8
9
|
Head,
|
|
10
|
+
Html,
|
|
9
11
|
I18N_CONTEXT,
|
|
10
12
|
REQUEST_CONTEXT,
|
|
11
13
|
SCRIPT_CONTEXT,
|
|
@@ -14,7 +16,7 @@ import {
|
|
|
14
16
|
useI18nContext,
|
|
15
17
|
useRequestContext,
|
|
16
18
|
useTranslations
|
|
17
|
-
} from "./chunk-
|
|
19
|
+
} from "./chunk-ACIQKW7Y.js";
|
|
18
20
|
|
|
19
21
|
// src/core/config.ts
|
|
20
22
|
function defineConfig(config) {
|
|
@@ -23,7 +25,9 @@ function defineConfig(config) {
|
|
|
23
25
|
export {
|
|
24
26
|
ErrorPage,
|
|
25
27
|
HEAD_CONTEXT,
|
|
28
|
+
HTML_CONTEXT,
|
|
26
29
|
Head,
|
|
30
|
+
Html,
|
|
27
31
|
I18N_CONTEXT,
|
|
28
32
|
REQUEST_CONTEXT,
|
|
29
33
|
SCRIPT_CONTEXT,
|
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 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. This is enabled by default,\n * in order to disable, pass `minifyHtml: false` to root.config.ts.\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":"
|
|
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. This is enabled by default,\n * in order to disable, pass `minifyHtml: false` to root.config.ts.\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":";;;;;;;;;;;;;;;;;;;;;AAuFO,SAAS,aAAa,QAAwC;AACnE,SAAO;AACT;","names":[]}
|
package/dist/render.js
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import {
|
|
2
2
|
ErrorPage,
|
|
3
3
|
HEAD_CONTEXT,
|
|
4
|
+
HTML_CONTEXT,
|
|
4
5
|
I18N_CONTEXT,
|
|
5
6
|
REQUEST_CONTEXT,
|
|
6
7
|
SCRIPT_CONTEXT,
|
|
7
8
|
getTranslations
|
|
8
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-ACIQKW7Y.js";
|
|
9
10
|
|
|
10
11
|
// src/render/render.tsx
|
|
11
12
|
import renderToString from "preact-render-to-string";
|
|
@@ -385,16 +386,20 @@ var Renderer = class {
|
|
|
385
386
|
};
|
|
386
387
|
const headComponents = [];
|
|
387
388
|
const userScripts = [];
|
|
389
|
+
const htmlContext = { attrs: {} };
|
|
388
390
|
const vdom = /* @__PURE__ */ jsx2(REQUEST_CONTEXT.Provider, {
|
|
389
391
|
value: ctx,
|
|
390
392
|
children: /* @__PURE__ */ jsx2(I18N_CONTEXT.Provider, {
|
|
391
393
|
value: { locale, translations },
|
|
392
|
-
children: /* @__PURE__ */ jsx2(
|
|
393
|
-
value:
|
|
394
|
+
children: /* @__PURE__ */ jsx2(HTML_CONTEXT.Provider, {
|
|
395
|
+
value: htmlContext,
|
|
394
396
|
children: /* @__PURE__ */ jsx2(HEAD_CONTEXT.Provider, {
|
|
395
397
|
value: headComponents,
|
|
396
|
-
children: /* @__PURE__ */ jsx2(
|
|
397
|
-
|
|
398
|
+
children: /* @__PURE__ */ jsx2(SCRIPT_CONTEXT.Provider, {
|
|
399
|
+
value: userScripts,
|
|
400
|
+
children: /* @__PURE__ */ jsx2(Component, {
|
|
401
|
+
...props
|
|
402
|
+
})
|
|
398
403
|
})
|
|
399
404
|
})
|
|
400
405
|
})
|
|
@@ -431,7 +436,12 @@ var Renderer = class {
|
|
|
431
436
|
src: jsUrls
|
|
432
437
|
}));
|
|
433
438
|
});
|
|
434
|
-
const
|
|
439
|
+
const htmlLang = htmlContext.attrs.lang || locale;
|
|
440
|
+
const html = await this.renderHtml({
|
|
441
|
+
mainHtml,
|
|
442
|
+
locale: htmlLang,
|
|
443
|
+
headComponents
|
|
444
|
+
});
|
|
435
445
|
return { html };
|
|
436
446
|
}
|
|
437
447
|
async getSitemap() {
|
package/dist/render.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/render/render.tsx","../src/render/router.ts","../src/render/route-trie.ts","../src/core/components/dev-not-found-page.tsx"],"sourcesContent":["// eslint-disable-next-line @typescript-eslint/no-unused-vars\nimport {ComponentChildren} from 'preact';\nimport renderToString from 'preact-render-to-string';\nimport {getRoutes, Route, getAllPathsForRoute} from './router';\nimport {HEAD_CONTEXT} from '../core/components/head';\nimport {ErrorPage} from '../core/components/error-page';\nimport {getTranslations, I18N_CONTEXT} from '../core/i18n';\nimport {ScriptProps, SCRIPT_CONTEXT} from '../core/components/script';\nimport {AssetMap} from './asset-map/asset-map';\nimport {RootConfig} from '../core/config';\nimport {RouteTrie} from './route-trie';\nimport {elementsMap} from 'virtual:root-elements';\nimport {DevNotFoundPage} from '../core/components/dev-not-found-page';\nimport {RequestContext, REQUEST_CONTEXT} from '../core/request-context';\n\ninterface RenderHtmlOptions {\n mainHtml: string;\n locale: string;\n headComponents?: ComponentChildren[];\n}\n\nexport class Renderer {\n private rootConfig: RootConfig;\n private routes: RouteTrie<Route>;\n private assetMap: AssetMap;\n\n constructor(rootConfig: RootConfig, options: {assetMap: AssetMap}) {\n this.rootConfig = rootConfig;\n this.routes = getRoutes(this.rootConfig);\n this.assetMap = options.assetMap;\n }\n\n async render(url: string): Promise<{html?: string; notFound?: boolean}> {\n const [route, routeParams] = this.routes.get(url);\n if (route && route.module && route.module.default) {\n return await this.renderRoute(route, {routeParams});\n }\n return {notFound: true};\n }\n\n async renderRoute(\n route: Route,\n options: {routeParams: Record<string, string>}\n ): Promise<{html?: string; notFound?: boolean}> {\n const routeParams = options.routeParams;\n const assetMap = this.assetMap;\n const Component = route.module.default;\n if (!Component) {\n throw new Error(\n 'unable to render route. the route should have a default export that renders a jsx component.'\n );\n }\n let props = {};\n if (route.module.getStaticProps) {\n const propsData = await route.module.getStaticProps({\n params: routeParams,\n });\n if (propsData.notFound) {\n return this.render404();\n }\n if (propsData.props) {\n props = propsData.props;\n }\n }\n\n const locale = route.locale;\n const translations = getTranslations(locale);\n const ctx: RequestContext = {\n route,\n props,\n routeParams,\n locale,\n translations,\n };\n const headComponents: ComponentChildren[] = [];\n const userScripts: ScriptProps[] = [];\n const vdom = (\n <REQUEST_CONTEXT.Provider value={ctx}>\n <I18N_CONTEXT.Provider value={{locale, translations}}>\n <SCRIPT_CONTEXT.Provider value={userScripts}>\n <HEAD_CONTEXT.Provider value={headComponents}>\n <Component {...props} />\n </HEAD_CONTEXT.Provider>\n </SCRIPT_CONTEXT.Provider>\n </I18N_CONTEXT.Provider>\n </REQUEST_CONTEXT.Provider>\n );\n const mainHtml = renderToString(vdom);\n\n const jsDeps = new Set<string>();\n const cssDeps = new Set<string>();\n\n // Walk the page's dependency tree for CSS dependencies that are added via\n // `import 'foo.scss'` or `import 'foo.module.scss'`.\n const pageAsset = await assetMap.get(route.src);\n if (pageAsset) {\n const pageCssDeps = await pageAsset.getCssDeps();\n pageCssDeps.forEach((dep) => cssDeps.add(dep));\n }\n\n // Parse the HTML for custom elements that are found within the project\n // and automatically inject the script deps for them.\n await this.collectElementDeps(mainHtml, jsDeps, cssDeps);\n\n // Add user defined scripts added via the `<Script>` component.\n await Promise.all(\n userScripts.map(async (scriptDep) => {\n const scriptAsset = await assetMap.get(scriptDep.src.slice(1));\n if (scriptAsset) {\n jsDeps.add(scriptAsset.assetUrl);\n const scriptJsDeps = await scriptAsset.getJsDeps();\n scriptJsDeps.forEach((dep) => jsDeps.add(dep));\n }\n })\n );\n\n cssDeps.forEach((cssUrl) => {\n headComponents.push(<link rel=\"stylesheet\" href={cssUrl} />);\n });\n jsDeps.forEach((jsUrls) => {\n headComponents.push(<script type=\"module\" src={jsUrls} />);\n });\n\n const html = await this.renderHtml({mainHtml, locale, headComponents});\n return {html};\n }\n\n async getSitemap(): Promise<\n Record<string, {route: Route; params: Record<string, string>}>\n > {\n const sitemap: Record<\n string,\n {route: Route; params: Record<string, string>}\n > = {};\n await this.routes.walk(async (urlPath: string, route: Route) => {\n const routePaths = await getAllPathsForRoute(urlPath, route);\n routePaths.forEach((routePath) => {\n sitemap[routePath.urlPath] = {\n route,\n params: routePath.params,\n };\n });\n });\n return sitemap;\n }\n\n private async renderHtml(options: RenderHtmlOptions) {\n const page = (\n <html lang={options.locale}>\n <head>\n <meta charSet=\"utf-8\" />\n {options.headComponents}\n </head>\n <body dangerouslySetInnerHTML={{__html: options.mainHtml}} />\n </html>\n );\n const html = `<!doctype html>\\n${renderToString(page)}\\n`;\n return html;\n }\n\n async render404() {\n return {\n html: '<!doctype html><html><title>404 Not Found</title><h1>404 Not Found</h1>',\n notFound: true,\n };\n }\n\n async renderError(error: unknown) {\n const mainHtml = renderToString(<ErrorPage error={error} />);\n const html = await this.renderHtml({mainHtml, locale: 'en'});\n return {html};\n }\n\n async renderDevServer404() {\n const sitemap = await this.getSitemap();\n const mainHtml = renderToString(<DevNotFoundPage sitemap={sitemap} />);\n const html = await this.renderHtml({\n mainHtml,\n locale: 'en',\n headComponents: [<title>404: Not Found</title>],\n });\n return {html};\n }\n\n /**\n * Parses rendered HTML for custom element tags used on the page and\n * automatically adds the JS/CSS deps to the page.\n */\n private async collectElementDeps(\n html: string,\n jsDeps: Set<string>,\n cssDeps: Set<string>,\n ): Promise<{jsDeps: Set<string>; cssDeps: Set<string>}> {\n const assetMap = this.assetMap;\n\n const re = /<(\\w[\\w-]+\\w)/g;\n const matches = Array.from(html.matchAll(re));\n await Promise.all(\n matches.map(async (match) => {\n const tagName = match[1];\n // Custom elements require a dash.\n if (tagName && tagName.includes('-') && tagName in elementsMap) {\n const elementModule = elementsMap[tagName];\n const asset = await assetMap.get(elementModule.src);\n if (!asset) {\n return;\n }\n const assetJsDeps = await asset.getJsDeps();\n assetJsDeps.forEach((dep) => jsDeps.add(dep));\n const assetCssDeps = await asset.getCssDeps();\n assetCssDeps.forEach((dep) => cssDeps.add(dep));\n }\n })\n );\n\n return {jsDeps, cssDeps};\n }\n}\n","import path from 'node:path';\nimport {ComponentType} from 'preact';\nimport {RootConfig} from '../core/config';\nimport {GetStaticPaths, GetStaticProps} from '../core/types';\nimport {RouteTrie} from './route-trie';\n\nexport interface RouteModule {\n default?: ComponentType<unknown>;\n getStaticPaths?: GetStaticPaths;\n getStaticProps?: GetStaticProps;\n}\n\nexport interface Route {\n /** The relative path to the route file, e.g. `routes/index.tsx`. */\n src: string;\n\n /** The imported route module. */\n module: RouteModule;\n\n /** The locale used for the route. */\n locale: string;\n\n /**\n * The mapped URL path for the route, e.g.:\n *\n * routes/index.tsx => `/`.\n * routes/events.tsx => `/events`.\n * routes/blog/[slug].tsx => `/blog/[slug]`.\n *\n * Per the example above, this value may contain placeholder params.\n */\n routePath: string;\n\n /**\n * The localized URL path for the route, e.g. `/[locale]/blog/[slug]`.\n * Per the example above, this value contains placeholder params.\n */\n localeRoutePath: string;\n}\n\nexport function getRoutes(config: RootConfig) {\n const locales = config.i18n?.locales || [];\n const i18nUrlFormat = config.i18n?.urlFormat || '/{locale}/{path}';\n const defaultLocale = config.i18n?.defaultLocale || 'en';\n\n const routes = import.meta.glob(\n ['/routes/*.ts', '/routes/**/*.ts', '/routes/*.tsx', '/routes/**/*.tsx'],\n {\n eager: true,\n }\n );\n const trie = new RouteTrie<Route>();\n Object.keys(routes).forEach((modulePath) => {\n const src = modulePath.slice(1);\n let routePath = modulePath.replace(/^\\/routes/, '');\n const parts = path.parse(routePath);\n if (parts.name.startsWith('_')) {\n return;\n }\n if (parts.name === 'index') {\n routePath = parts.dir;\n } else {\n routePath = path.join(parts.dir, parts.name);\n }\n\n const localeRoutePath = i18nUrlFormat\n .replace('{locale}', '[locale]')\n .replace('{path}', routePath.replace(/^\\/*/, ''));\n\n trie.add(routePath, {\n src,\n module: routes[modulePath] as RouteModule,\n locale: defaultLocale,\n routePath,\n localeRoutePath,\n });\n\n // At the moment, all routes are assumed to use the site-wide i18n config.\n // TODO(stevenle): provide routes with a way to override the default\n // i18n serving behavior.\n locales.forEach((locale) => {\n const localePath = localeRoutePath.replace('[locale]', locale);\n if (localePath !== routePath) {\n trie.add(localePath, {\n src,\n module: routes[modulePath] as RouteModule,\n locale: locale,\n routePath,\n localeRoutePath,\n });\n }\n });\n });\n return trie;\n}\n\nexport async function getAllPathsForRoute(\n urlPathFormat: string,\n route: Route\n): Promise<Array<{urlPath: string; params: Record<string, string>}>> {\n const routeModule = route.module;\n if (!routeModule.default) {\n return [];\n }\n\n const urlPaths: Array<{urlPath: string; params: Record<string, string>}> = [];\n if (routeModule.getStaticPaths) {\n const staticPaths = await routeModule.getStaticPaths();\n if (staticPaths.paths) {\n staticPaths.paths.forEach(\n (pathParams: {params: Record<string, string>}) => {\n const urlPath = replaceParams(urlPathFormat, pathParams.params || {});\n if (pathContainsPlaceholders(urlPath)) {\n console.warn(\n `path contains placeholders: ${urlPathFormat}, double check getStaticPaths() and ensure all params are returned. more info: https://rootjs.dev/guide/routes#getStaticPaths`\n );\n } else {\n urlPaths.push({\n urlPath: replaceParams(urlPathFormat, pathParams.params),\n params: pathParams.params || {},\n });\n }\n }\n );\n }\n } else if (pathContainsPlaceholders(urlPathFormat)) {\n console.warn(\n `path contains placeholders: ${urlPathFormat}, did you forget to define getStaticPaths()? more info: https://rootjs.dev/guide/routes#getStaticPaths`\n );\n } else {\n urlPaths.push({urlPath: urlPathFormat, params: {}});\n }\n return urlPaths;\n}\n\nexport function replaceParams(\n urlPathFormat: string,\n params: Record<string, string>\n) {\n const urlPath = urlPathFormat.replaceAll(\n /\\[(\\.\\.\\.)?([\\w\\-_]*)\\]/g,\n (match: string, _wildcard: string, key: string) => {\n const val = params[key];\n if (!val) {\n throw new Error(`unreplaced param ${match} in url: ${urlPathFormat}`);\n }\n return val;\n }\n );\n return urlPath;\n}\n\nfunction pathContainsPlaceholders(urlPath: string) {\n const segments = urlPath.split('/');\n return segments.some((segment) => {\n return segment.startsWith('[') && segment.endsWith(']');\n });\n}\n","/**\n * A trie data structure that stores routes. The trie supports `:param` and\n * `*wildcard` values.\n */\nexport class RouteTrie<T> {\n private children: Record<string, RouteTrie<T>> = {};\n private paramChild?: ParamChild<T>;\n private wildcardChild?: WildcardChild<T>;\n private route?: T;\n\n /**\n * Adds a route to the trie.\n */\n add(path: string, route: T) {\n path = this.normalizePath(path);\n\n // If the end was reached, save the value to the node.\n if (path === '') {\n this.route = route;\n return;\n }\n\n const [head, tail] = this.splitPath(path);\n if (head.startsWith('[...') && head.endsWith(']')) {\n const paramName = head.slice(4, -1);\n this.wildcardChild = new WildcardChild(paramName, route);\n return;\n }\n\n let nextNode: RouteTrie<T>;\n if (head.startsWith('[') && head.endsWith(']')) {\n if (!this.paramChild) {\n const paramName = head.slice(1, -1);\n this.paramChild = new ParamChild(paramName);\n }\n nextNode = this.paramChild.trie;\n } else {\n nextNode = this.children[head];\n if (!nextNode) {\n nextNode = new RouteTrie();\n this.children[head] = nextNode;\n }\n }\n nextNode.add(tail, route);\n }\n\n /**\n * Returns a route mapped to the given path and any parameter values from the\n * URL.\n */\n get(path: string): [T | undefined, Record<string, string>] {\n const params = {};\n const route = this.getRoute(path, params);\n return [route, params];\n }\n\n /**\n * Walks the route trie and calls a callback function for each route.\n */\n walk(cb: (urlPath: string, route: T) => Promise<void> | void): Promise<void> {\n const promises: Array<Promise<void>> = [];\n const addPromise = (promise: Promise<void> | void) => {\n if (promise) {\n promises.push(promise);\n }\n };\n if (this.route) {\n addPromise(cb('/', this.route));\n }\n if (this.paramChild) {\n const param = `[${this.paramChild.name}]`;\n this.paramChild.trie.walk((childPath: string, route: T) => {\n const paramUrlPath = `/${param}${childPath}`;\n addPromise(cb(paramUrlPath, route));\n });\n }\n if (this.wildcardChild) {\n const wildcardUrlPath = `/[...${this.wildcardChild.name}]`;\n addPromise(cb(wildcardUrlPath, this.wildcardChild.route));\n }\n for (const subpath of Object.keys(this.children)) {\n const childTrie = this.children[subpath];\n childTrie.walk((childPath: string, childRoute: T) => {\n addPromise(cb(`/${subpath}${childPath}`, childRoute));\n });\n }\n return Promise.all(promises).then(() => {});\n }\n\n /**\n * Removes all routes from the trie.\n */\n clear() {\n this.children = {};\n this.paramChild = undefined;\n this.wildcardChild = undefined;\n this.route = undefined;\n }\n\n private getRoute(\n urlPath: string,\n params: Record<string, string>\n ): T | undefined {\n urlPath = this.normalizePath(urlPath);\n if (urlPath === '') {\n return this.route;\n }\n\n const [head, tail] = this.splitPath(urlPath);\n\n const child = this.children[head];\n if (child) {\n const route = child.getRoute(tail, params);\n if (route) {\n return route;\n }\n }\n\n if (this.paramChild) {\n const route = this.paramChild.trie.getRoute(tail, params);\n if (route) {\n params[this.paramChild.name] = head;\n return route;\n }\n }\n\n if (this.wildcardChild) {\n params[this.wildcardChild.name] = urlPath;\n return this.wildcardChild.route;\n }\n\n return undefined;\n }\n\n /**\n * Normalizes a path for inclusion into the route trie.\n */\n private normalizePath(path: string) {\n // Remove leading slashes.\n return path.replace(/^\\/+/g, '');\n }\n\n /**\n * Splits the parent directory from its children, e.g.:\n *\n * splitPath(\"foo/bar/baz\") -> [\"foo\", \"bar/baz\"]\n */\n private splitPath(path: string): [string, string] {\n const i = path.indexOf('/');\n if (i === -1) {\n return [path, ''];\n }\n return [path.slice(0, i), path.slice(i + 1)];\n }\n}\n\n/**\n * A node in the RouteTrie for a :param child.\n */\nclass ParamChild<T> {\n readonly name: string;\n readonly trie: RouteTrie<T> = new RouteTrie();\n\n constructor(name: string) {\n this.name = name;\n }\n}\n\n/**\n * A node in the RouteTrie for a *wildcard child.\n */\nclass WildcardChild<T> {\n readonly name: string;\n readonly route: T;\n\n constructor(name: string, route: T) {\n this.name = name;\n this.route = route;\n }\n}\n","import {Route} from '../../render/router';\n\nconst STYLES = `\nbody {\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif;\n}\n\nh1 {\n margin-bottom: 40px;\n}\n\n.route-list {\n display: grid;\n grid-template-columns: auto 1fr;\n align-items: center;\n column-gap: 24px;\n row-gap: 8px;\n padding: 0 40px;\n}\n\n.route-module {\n text-align: right;\n}\n\nhr {\n margin: 60px 0;\n}\n`;\n\ninterface DevNotFoundPageProps {\n sitemap: Record<string, {route: Route; params: Record<string, string>}>;\n}\n\nexport function DevNotFoundPage(props: DevNotFoundPageProps) {\n const routesList: Array<Route & {urlPath: string}> = [];\n Object.keys(props.sitemap).forEach((urlPath) => {\n const route = props.sitemap[urlPath].route;\n routesList.push(Object.assign({}, route, {urlPath}));\n });\n return (\n <>\n <style dangerouslySetInnerHTML={{__html: STYLES}}></style>\n <div>\n <h1>\n <strong>404:</strong> Not Found\n </h1>\n {routesList.length > 0 ? (\n <>\n <h2>Routes found in the project:</h2>\n <div class=\"route-list\">\n {routesList.map((route) => (\n <>\n <div class=\"route-module\">{route.modulePath}</div>\n <a class=\"route-url\" href={route.urlPath}>\n {route.urlPath}\n </a>\n </>\n ))}\n </div>\n </>\n ) : (\n <>\n <h2>No routes found in the project</h2>\n <p>\n Add your first route at <code>/routes/index.tsx</code>\n </p>\n </>\n )}\n <hr />\n <p>\n Note: This page could use some love! If you're interested in helping\n to style this page, please reach out to the root.js developers!\n </p>\n </div>\n </>\n );\n}\n"],"mappings":"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","names":["path","jsx","jsxs"]}
|
|
1
|
+
{"version":3,"sources":["../src/render/render.tsx","../src/render/router.ts","../src/render/route-trie.ts","../src/core/components/dev-not-found-page.tsx"],"sourcesContent":["// eslint-disable-next-line @typescript-eslint/no-unused-vars\nimport {ComponentChildren} from 'preact';\nimport renderToString from 'preact-render-to-string';\nimport {getRoutes, Route, getAllPathsForRoute} from './router';\nimport {HEAD_CONTEXT} from '../core/components/head';\nimport {ErrorPage} from '../core/components/error-page';\nimport {getTranslations, I18N_CONTEXT} from '../core/i18n';\nimport {ScriptProps, SCRIPT_CONTEXT} from '../core/components/script';\nimport {AssetMap} from './asset-map/asset-map';\nimport {RootConfig} from '../core/config';\nimport {RouteTrie} from './route-trie';\nimport {elementsMap} from 'virtual:root-elements';\nimport {DevNotFoundPage} from '../core/components/dev-not-found-page';\nimport {RequestContext, REQUEST_CONTEXT} from '../core/request-context';\nimport {HtmlContextValue, HTML_CONTEXT} from '../core/components/html';\n\ninterface RenderHtmlOptions {\n mainHtml: string;\n locale: string;\n headComponents?: ComponentChildren[];\n}\n\nexport class Renderer {\n private rootConfig: RootConfig;\n private routes: RouteTrie<Route>;\n private assetMap: AssetMap;\n\n constructor(rootConfig: RootConfig, options: {assetMap: AssetMap}) {\n this.rootConfig = rootConfig;\n this.routes = getRoutes(this.rootConfig);\n this.assetMap = options.assetMap;\n }\n\n async render(url: string): Promise<{html?: string; notFound?: boolean}> {\n const [route, routeParams] = this.routes.get(url);\n if (route && route.module && route.module.default) {\n return await this.renderRoute(route, {routeParams});\n }\n return {notFound: true};\n }\n\n async renderRoute(\n route: Route,\n options: {routeParams: Record<string, string>}\n ): Promise<{html?: string; notFound?: boolean}> {\n const routeParams = options.routeParams;\n const assetMap = this.assetMap;\n const Component = route.module.default;\n if (!Component) {\n throw new Error(\n 'unable to render route. the route should have a default export that renders a jsx component.'\n );\n }\n let props = {};\n if (route.module.getStaticProps) {\n const propsData = await route.module.getStaticProps({\n params: routeParams,\n });\n if (propsData.notFound) {\n return this.render404();\n }\n if (propsData.props) {\n props = propsData.props;\n }\n }\n\n const locale = route.locale;\n const translations = getTranslations(locale);\n const ctx: RequestContext = {\n route,\n props,\n routeParams,\n locale,\n translations,\n };\n const headComponents: ComponentChildren[] = [];\n const userScripts: ScriptProps[] = [];\n const htmlContext: HtmlContextValue = {attrs: {}};\n const vdom = (\n <REQUEST_CONTEXT.Provider value={ctx}>\n <I18N_CONTEXT.Provider value={{locale, translations}}>\n <HTML_CONTEXT.Provider value={htmlContext}>\n <HEAD_CONTEXT.Provider value={headComponents}>\n <SCRIPT_CONTEXT.Provider value={userScripts}>\n <Component {...props} />\n </SCRIPT_CONTEXT.Provider>\n </HEAD_CONTEXT.Provider>\n </HTML_CONTEXT.Provider>\n </I18N_CONTEXT.Provider>\n </REQUEST_CONTEXT.Provider>\n );\n const mainHtml = renderToString(vdom);\n\n const jsDeps = new Set<string>();\n const cssDeps = new Set<string>();\n\n // Walk the page's dependency tree for CSS dependencies that are added via\n // `import 'foo.scss'` or `import 'foo.module.scss'`.\n const pageAsset = await assetMap.get(route.src);\n if (pageAsset) {\n const pageCssDeps = await pageAsset.getCssDeps();\n pageCssDeps.forEach((dep) => cssDeps.add(dep));\n }\n\n // Parse the HTML for custom elements that are found within the project\n // and automatically inject the script deps for them.\n await this.collectElementDeps(mainHtml, jsDeps, cssDeps);\n\n // Add user defined scripts added via the `<Script>` component.\n await Promise.all(\n userScripts.map(async (scriptDep) => {\n const scriptAsset = await assetMap.get(scriptDep.src.slice(1));\n if (scriptAsset) {\n jsDeps.add(scriptAsset.assetUrl);\n const scriptJsDeps = await scriptAsset.getJsDeps();\n scriptJsDeps.forEach((dep) => jsDeps.add(dep));\n }\n })\n );\n\n cssDeps.forEach((cssUrl) => {\n headComponents.push(<link rel=\"stylesheet\" href={cssUrl} />);\n });\n jsDeps.forEach((jsUrls) => {\n headComponents.push(<script type=\"module\" src={jsUrls} />);\n });\n\n const htmlLang = htmlContext.attrs.lang || locale;\n const html = await this.renderHtml({\n mainHtml,\n locale: htmlLang,\n headComponents,\n });\n return {html};\n }\n\n async getSitemap(): Promise<\n Record<string, {route: Route; params: Record<string, string>}>\n > {\n const sitemap: Record<\n string,\n {route: Route; params: Record<string, string>}\n > = {};\n await this.routes.walk(async (urlPath: string, route: Route) => {\n const routePaths = await getAllPathsForRoute(urlPath, route);\n routePaths.forEach((routePath) => {\n sitemap[routePath.urlPath] = {\n route,\n params: routePath.params,\n };\n });\n });\n return sitemap;\n }\n\n private async renderHtml(options: RenderHtmlOptions) {\n const page = (\n <html lang={options.locale}>\n <head>\n <meta charSet=\"utf-8\" />\n {options.headComponents}\n </head>\n <body dangerouslySetInnerHTML={{__html: options.mainHtml}} />\n </html>\n );\n const html = `<!doctype html>\\n${renderToString(page)}\\n`;\n return html;\n }\n\n async render404() {\n return {\n html: '<!doctype html><html><title>404 Not Found</title><h1>404 Not Found</h1>',\n notFound: true,\n };\n }\n\n async renderError(error: unknown) {\n const mainHtml = renderToString(<ErrorPage error={error} />);\n const html = await this.renderHtml({mainHtml, locale: 'en'});\n return {html};\n }\n\n async renderDevServer404() {\n const sitemap = await this.getSitemap();\n const mainHtml = renderToString(<DevNotFoundPage sitemap={sitemap} />);\n const html = await this.renderHtml({\n mainHtml,\n locale: 'en',\n headComponents: [<title>404: Not Found</title>],\n });\n return {html};\n }\n\n /**\n * Parses rendered HTML for custom element tags used on the page and\n * automatically adds the JS/CSS deps to the page.\n */\n private async collectElementDeps(\n html: string,\n jsDeps: Set<string>,\n cssDeps: Set<string>\n ): Promise<{jsDeps: Set<string>; cssDeps: Set<string>}> {\n const assetMap = this.assetMap;\n\n const re = /<(\\w[\\w-]+\\w)/g;\n const matches = Array.from(html.matchAll(re));\n await Promise.all(\n matches.map(async (match) => {\n const tagName = match[1];\n // Custom elements require a dash.\n if (tagName && tagName.includes('-') && tagName in elementsMap) {\n const elementModule = elementsMap[tagName];\n const asset = await assetMap.get(elementModule.src);\n if (!asset) {\n return;\n }\n const assetJsDeps = await asset.getJsDeps();\n assetJsDeps.forEach((dep) => jsDeps.add(dep));\n const assetCssDeps = await asset.getCssDeps();\n assetCssDeps.forEach((dep) => cssDeps.add(dep));\n }\n })\n );\n\n return {jsDeps, cssDeps};\n }\n}\n","import path from 'node:path';\nimport {ComponentType} from 'preact';\nimport {RootConfig} from '../core/config';\nimport {GetStaticPaths, GetStaticProps} from '../core/types';\nimport {RouteTrie} from './route-trie';\n\nexport interface RouteModule {\n default?: ComponentType<unknown>;\n getStaticPaths?: GetStaticPaths;\n getStaticProps?: GetStaticProps;\n}\n\nexport interface Route {\n /** The relative path to the route file, e.g. `routes/index.tsx`. */\n src: string;\n\n /** The imported route module. */\n module: RouteModule;\n\n /** The locale used for the route. */\n locale: string;\n\n /**\n * The mapped URL path for the route, e.g.:\n *\n * routes/index.tsx => `/`.\n * routes/events.tsx => `/events`.\n * routes/blog/[slug].tsx => `/blog/[slug]`.\n *\n * Per the example above, this value may contain placeholder params.\n */\n routePath: string;\n\n /**\n * The localized URL path for the route, e.g. `/[locale]/blog/[slug]`.\n * Per the example above, this value contains placeholder params.\n */\n localeRoutePath: string;\n}\n\nexport function getRoutes(config: RootConfig) {\n const locales = config.i18n?.locales || [];\n const i18nUrlFormat = config.i18n?.urlFormat || '/{locale}/{path}';\n const defaultLocale = config.i18n?.defaultLocale || 'en';\n\n const routes = import.meta.glob(\n ['/routes/*.ts', '/routes/**/*.ts', '/routes/*.tsx', '/routes/**/*.tsx'],\n {\n eager: true,\n }\n );\n const trie = new RouteTrie<Route>();\n Object.keys(routes).forEach((modulePath) => {\n const src = modulePath.slice(1);\n let routePath = modulePath.replace(/^\\/routes/, '');\n const parts = path.parse(routePath);\n if (parts.name.startsWith('_')) {\n return;\n }\n if (parts.name === 'index') {\n routePath = parts.dir;\n } else {\n routePath = path.join(parts.dir, parts.name);\n }\n\n const localeRoutePath = i18nUrlFormat\n .replace('{locale}', '[locale]')\n .replace('{path}', routePath.replace(/^\\/*/, ''));\n\n trie.add(routePath, {\n src,\n module: routes[modulePath] as RouteModule,\n locale: defaultLocale,\n routePath,\n localeRoutePath,\n });\n\n // At the moment, all routes are assumed to use the site-wide i18n config.\n // TODO(stevenle): provide routes with a way to override the default\n // i18n serving behavior.\n locales.forEach((locale) => {\n const localePath = localeRoutePath.replace('[locale]', locale);\n if (localePath !== routePath) {\n trie.add(localePath, {\n src,\n module: routes[modulePath] as RouteModule,\n locale: locale,\n routePath,\n localeRoutePath,\n });\n }\n });\n });\n return trie;\n}\n\nexport async function getAllPathsForRoute(\n urlPathFormat: string,\n route: Route\n): Promise<Array<{urlPath: string; params: Record<string, string>}>> {\n const routeModule = route.module;\n if (!routeModule.default) {\n return [];\n }\n\n const urlPaths: Array<{urlPath: string; params: Record<string, string>}> = [];\n if (routeModule.getStaticPaths) {\n const staticPaths = await routeModule.getStaticPaths();\n if (staticPaths.paths) {\n staticPaths.paths.forEach(\n (pathParams: {params: Record<string, string>}) => {\n const urlPath = replaceParams(urlPathFormat, pathParams.params || {});\n if (pathContainsPlaceholders(urlPath)) {\n console.warn(\n `path contains placeholders: ${urlPathFormat}, double check getStaticPaths() and ensure all params are returned. more info: https://rootjs.dev/guide/routes#getStaticPaths`\n );\n } else {\n urlPaths.push({\n urlPath: replaceParams(urlPathFormat, pathParams.params),\n params: pathParams.params || {},\n });\n }\n }\n );\n }\n } else if (pathContainsPlaceholders(urlPathFormat)) {\n console.warn(\n `path contains placeholders: ${urlPathFormat}, did you forget to define getStaticPaths()? more info: https://rootjs.dev/guide/routes#getStaticPaths`\n );\n } else {\n urlPaths.push({urlPath: urlPathFormat, params: {}});\n }\n return urlPaths;\n}\n\nexport function replaceParams(\n urlPathFormat: string,\n params: Record<string, string>\n) {\n const urlPath = urlPathFormat.replaceAll(\n /\\[(\\.\\.\\.)?([\\w\\-_]*)\\]/g,\n (match: string, _wildcard: string, key: string) => {\n const val = params[key];\n if (!val) {\n throw new Error(`unreplaced param ${match} in url: ${urlPathFormat}`);\n }\n return val;\n }\n );\n return urlPath;\n}\n\nfunction pathContainsPlaceholders(urlPath: string) {\n const segments = urlPath.split('/');\n return segments.some((segment) => {\n return segment.startsWith('[') && segment.endsWith(']');\n });\n}\n","/**\n * A trie data structure that stores routes. The trie supports `:param` and\n * `*wildcard` values.\n */\nexport class RouteTrie<T> {\n private children: Record<string, RouteTrie<T>> = {};\n private paramChild?: ParamChild<T>;\n private wildcardChild?: WildcardChild<T>;\n private route?: T;\n\n /**\n * Adds a route to the trie.\n */\n add(path: string, route: T) {\n path = this.normalizePath(path);\n\n // If the end was reached, save the value to the node.\n if (path === '') {\n this.route = route;\n return;\n }\n\n const [head, tail] = this.splitPath(path);\n if (head.startsWith('[...') && head.endsWith(']')) {\n const paramName = head.slice(4, -1);\n this.wildcardChild = new WildcardChild(paramName, route);\n return;\n }\n\n let nextNode: RouteTrie<T>;\n if (head.startsWith('[') && head.endsWith(']')) {\n if (!this.paramChild) {\n const paramName = head.slice(1, -1);\n this.paramChild = new ParamChild(paramName);\n }\n nextNode = this.paramChild.trie;\n } else {\n nextNode = this.children[head];\n if (!nextNode) {\n nextNode = new RouteTrie();\n this.children[head] = nextNode;\n }\n }\n nextNode.add(tail, route);\n }\n\n /**\n * Returns a route mapped to the given path and any parameter values from the\n * URL.\n */\n get(path: string): [T | undefined, Record<string, string>] {\n const params = {};\n const route = this.getRoute(path, params);\n return [route, params];\n }\n\n /**\n * Walks the route trie and calls a callback function for each route.\n */\n walk(cb: (urlPath: string, route: T) => Promise<void> | void): Promise<void> {\n const promises: Array<Promise<void>> = [];\n const addPromise = (promise: Promise<void> | void) => {\n if (promise) {\n promises.push(promise);\n }\n };\n if (this.route) {\n addPromise(cb('/', this.route));\n }\n if (this.paramChild) {\n const param = `[${this.paramChild.name}]`;\n this.paramChild.trie.walk((childPath: string, route: T) => {\n const paramUrlPath = `/${param}${childPath}`;\n addPromise(cb(paramUrlPath, route));\n });\n }\n if (this.wildcardChild) {\n const wildcardUrlPath = `/[...${this.wildcardChild.name}]`;\n addPromise(cb(wildcardUrlPath, this.wildcardChild.route));\n }\n for (const subpath of Object.keys(this.children)) {\n const childTrie = this.children[subpath];\n childTrie.walk((childPath: string, childRoute: T) => {\n addPromise(cb(`/${subpath}${childPath}`, childRoute));\n });\n }\n return Promise.all(promises).then(() => {});\n }\n\n /**\n * Removes all routes from the trie.\n */\n clear() {\n this.children = {};\n this.paramChild = undefined;\n this.wildcardChild = undefined;\n this.route = undefined;\n }\n\n private getRoute(\n urlPath: string,\n params: Record<string, string>\n ): T | undefined {\n urlPath = this.normalizePath(urlPath);\n if (urlPath === '') {\n return this.route;\n }\n\n const [head, tail] = this.splitPath(urlPath);\n\n const child = this.children[head];\n if (child) {\n const route = child.getRoute(tail, params);\n if (route) {\n return route;\n }\n }\n\n if (this.paramChild) {\n const route = this.paramChild.trie.getRoute(tail, params);\n if (route) {\n params[this.paramChild.name] = head;\n return route;\n }\n }\n\n if (this.wildcardChild) {\n params[this.wildcardChild.name] = urlPath;\n return this.wildcardChild.route;\n }\n\n return undefined;\n }\n\n /**\n * Normalizes a path for inclusion into the route trie.\n */\n private normalizePath(path: string) {\n // Remove leading slashes.\n return path.replace(/^\\/+/g, '');\n }\n\n /**\n * Splits the parent directory from its children, e.g.:\n *\n * splitPath(\"foo/bar/baz\") -> [\"foo\", \"bar/baz\"]\n */\n private splitPath(path: string): [string, string] {\n const i = path.indexOf('/');\n if (i === -1) {\n return [path, ''];\n }\n return [path.slice(0, i), path.slice(i + 1)];\n }\n}\n\n/**\n * A node in the RouteTrie for a :param child.\n */\nclass ParamChild<T> {\n readonly name: string;\n readonly trie: RouteTrie<T> = new RouteTrie();\n\n constructor(name: string) {\n this.name = name;\n }\n}\n\n/**\n * A node in the RouteTrie for a *wildcard child.\n */\nclass WildcardChild<T> {\n readonly name: string;\n readonly route: T;\n\n constructor(name: string, route: T) {\n this.name = name;\n this.route = route;\n }\n}\n","import {Route} from '../../render/router';\n\nconst STYLES = `\nbody {\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif;\n}\n\nh1 {\n margin-bottom: 40px;\n}\n\n.route-list {\n display: grid;\n grid-template-columns: auto 1fr;\n align-items: center;\n column-gap: 24px;\n row-gap: 8px;\n padding: 0 40px;\n}\n\n.route-module {\n text-align: right;\n}\n\nhr {\n margin: 60px 0;\n}\n`;\n\ninterface DevNotFoundPageProps {\n sitemap: Record<string, {route: Route; params: Record<string, string>}>;\n}\n\nexport function DevNotFoundPage(props: DevNotFoundPageProps) {\n const routesList: Array<Route & {urlPath: string}> = [];\n Object.keys(props.sitemap).forEach((urlPath) => {\n const route = props.sitemap[urlPath].route;\n routesList.push(Object.assign({}, route, {urlPath}));\n });\n return (\n <>\n <style dangerouslySetInnerHTML={{__html: STYLES}}></style>\n <div>\n <h1>\n <strong>404:</strong> Not Found\n </h1>\n {routesList.length > 0 ? (\n <>\n <h2>Routes found in the project:</h2>\n <div class=\"route-list\">\n {routesList.map((route) => (\n <>\n <div class=\"route-module\">{route.modulePath}</div>\n <a class=\"route-url\" href={route.urlPath}>\n {route.urlPath}\n </a>\n </>\n ))}\n </div>\n </>\n ) : (\n <>\n <h2>No routes found in the project</h2>\n <p>\n Add your first route at <code>/routes/index.tsx</code>\n </p>\n </>\n )}\n <hr />\n <p>\n Note: This page could use some love! If you're interested in helping\n to style this page, please reach out to the root.js developers!\n </p>\n </div>\n </>\n );\n}\n"],"mappings":"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","names":["path","jsx","jsxs"]}
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core/components/error-page.tsx","../src/core/components/head.ts","../src/core/components/script.ts","../src/core/i18n.ts","../src/core/request-context.ts"],"sourcesContent":["export interface ErrorPageProps {\n error: unknown;\n}\n\nexport function ErrorPage(props: ErrorPageProps) {\n const error = props.error;\n\n let message = undefined;\n if (import.meta.env.DEV) {\n if (error instanceof Error) {\n message = error.stack;\n } else {\n message = String(error);\n }\n }\n\n return (\n <div>\n <div>\n <p>An error occured during route handling or page rendering.</p>\n {message && <pre>{message}</pre>}\n </div>\n </div>\n );\n}\n","import {ComponentChildren, createContext} from 'preact';\nimport {useContext} from 'preact/hooks';\n\nexport const HEAD_CONTEXT = createContext<ComponentChildren[]>([]);\n\nexport interface HeadProps {\n children?: ComponentChildren;\n}\n\n/**\n * The <Head> component can be used for injecting elements into the HTML head\n * tag from any part of a page.\n */\nexport function Head(props: HeadProps) {\n let context: ComponentChildren[];\n try {\n context = useContext(HEAD_CONTEXT);\n } catch (err) {\n console.log(err);\n throw new Error(\n '<Head> component is not supported in the browser, or during suspense renders.',\n {cause: err}\n );\n }\n context.push(props.children);\n return null;\n}\n","import {createContext} from 'preact';\nimport {useContext} from 'preact/hooks';\n\nexport const SCRIPT_CONTEXT = createContext<ScriptProps[]>([]);\n\nexport interface ScriptProps {\n src: string;\n type?: string;\n}\n\n/**\n * The <Script> component is used for rendering any custom script modules. At\n * the moment, the system only pre-renders and bundles files that are in the\n * `/bundles` folder at the root of the project.\n */\nexport function Script(props: ScriptProps) {\n let context: ScriptProps[];\n try {\n context = useContext(SCRIPT_CONTEXT);\n } catch (err) {\n throw new Error(\n '<Script> component is not supported in the browser, or during suspense renders.',\n {cause: err}\n );\n }\n context.push(props);\n return null;\n}\n","import path from 'node:path';\nimport {createContext} from 'preact';\nimport {useContext} from 'preact/hooks';\n\nexport const I18N_CONTEXT = createContext<I18nContext | null>(null);\n\nexport interface I18nContext {\n locale: string;\n translations: Record<string, string>;\n}\n\nexport function getTranslations(locale: string): Record<string, string> {\n const translations: Record<string, Record<string, string>> = {};\n const translationsFiles = import.meta.glob(['/translations/*.json'], {\n eager: true,\n }) as Record<string, {default?: Record<string, string>}>;\n Object.keys(translationsFiles).forEach((translationPath) => {\n const parts = path.parse(translationPath);\n const locale = parts.name;\n const module = translationsFiles[translationPath];\n if (module && module.default) {\n translations[locale] = module.default;\n }\n });\n return translations[locale] || {};\n}\n\nexport function useI18nContext() {\n const context = useContext(I18N_CONTEXT);\n if (!context) {\n throw new Error('could not find i18n context');\n }\n return context;\n}\n\nexport function useTranslations() {\n const context = useI18nContext();\n const translations = context.translations || {};\n const t = (str: string, params?: Record<string, string>) => {\n let translation = translations[str] || str || '';\n if (params) {\n for (const key of Object.keys(params)) {\n const val = String(params[key] || '');\n translation = translation.replaceAll(`{${key}}`, val);\n }\n }\n return translation;\n };\n return t;\n}\n","import {createContext} from 'preact';\nimport {useContext} from 'preact/hooks';\nimport {Route} from '../render/router';\n\nexport interface RequestContext {\n /** The route file. */\n route: Route;\n /**\n * Route param values. E.g. for a route like `routes/blog/[slug].tsx`,\n * visiting `/blog/foo` will pass {slug: 'foo'} here.\n */\n routeParams: Record<string, string>;\n /** Props passed to the route's server component. */\n props: any;\n /** The current locale. */\n locale: string;\n /** Translations map for the current locale. */\n translations: Record<string, string>;\n}\n\nexport const REQUEST_CONTEXT = createContext<RequestContext | null>(null);\n\nexport function useRequestContext() {\n const context = useContext(REQUEST_CONTEXT);\n if (!context) {\n throw new Error('could not find request context');\n }\n return context;\n}\n"],"mappings":";AAkBM,SACE,KADF;AAdC,SAAS,UAAU,OAAuB;AAC/C,QAAM,QAAQ,MAAM;AAEpB,MAAI,UAAU;AACd,MAAI,YAAY,IAAI,KAAK;AACvB,QAAI,iBAAiB,OAAO;AAC1B,gBAAU,MAAM;AAAA,IAClB,OAAO;AACL,gBAAU,OAAO,KAAK;AAAA,IACxB;AAAA,EACF;AAEA,SACE,oBAAC;AAAA,IACC,+BAAC;AAAA,MACC;AAAA,4BAAC;AAAA,UAAE;AAAA,SAAyD;AAAA,QAC3D,WAAW,oBAAC;AAAA,UAAK;AAAA,SAAQ;AAAA;AAAA,KAC5B;AAAA,GACF;AAEJ;;;ACxBA,SAA2B,qBAAoB;AAC/C,SAAQ,kBAAiB;AAElB,IAAM,eAAe,cAAmC,CAAC,CAAC;AAU1D,SAAS,KAAK,OAAkB;AACrC,MAAI;AACJ,MAAI;AACF,cAAU,WAAW,YAAY;AAAA,EACnC,SAAS,KAAP;AACA,YAAQ,IAAI,GAAG;AACf,UAAM,IAAI;AAAA,MACR;AAAA,MACA,EAAC,OAAO,IAAG;AAAA,IACb;AAAA,EACF;AACA,UAAQ,KAAK,MAAM,QAAQ;AAC3B,SAAO;AACT;;;AC1BA,SAAQ,iBAAAA,sBAAoB;AAC5B,SAAQ,cAAAC,mBAAiB;AAElB,IAAM,iBAAiBD,eAA6B,CAAC,CAAC;AAYtD,SAAS,OAAO,OAAoB;AACzC,MAAI;AACJ,MAAI;AACF,cAAUC,YAAW,cAAc;AAAA,EACrC,SAAS,KAAP;AACA,UAAM,IAAI;AAAA,MACR;AAAA,MACA,EAAC,OAAO,IAAG;AAAA,IACb;AAAA,EACF;AACA,UAAQ,KAAK,KAAK;AAClB,SAAO;AACT;;;AC3BA,OAAO,UAAU;AACjB,SAAQ,iBAAAC,sBAAoB;AAC5B,SAAQ,cAAAC,mBAAiB;AAElB,IAAM,eAAeD,eAAkC,IAAI;AAO3D,SAAS,gBAAgB,QAAwC;AACtE,QAAM,eAAuD,CAAC;AAC9D,QAAM,oBAAoB,YAAY,KAAK,CAAC,sBAAsB,GAAG;AAAA,IACnE,OAAO;AAAA,EACT,CAAC;AACD,SAAO,KAAK,iBAAiB,EAAE,QAAQ,CAAC,oBAAoB;AAC1D,UAAM,QAAQ,KAAK,MAAM,eAAe;AACxC,UAAME,UAAS,MAAM;AACrB,UAAM,SAAS,kBAAkB;AACjC,QAAI,UAAU,OAAO,SAAS;AAC5B,mBAAaA,WAAU,OAAO;AAAA,IAChC;AAAA,EACF,CAAC;AACD,SAAO,aAAa,WAAW,CAAC;AAClC;AAEO,SAAS,iBAAiB;AAC/B,QAAM,UAAUD,YAAW,YAAY;AACvC,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,6BAA6B;AAAA,EAC/C;AACA,SAAO;AACT;AAEO,SAAS,kBAAkB;AAChC,QAAM,UAAU,eAAe;AAC/B,QAAM,eAAe,QAAQ,gBAAgB,CAAC;AAC9C,QAAM,IAAI,CAAC,KAAa,WAAoC;AAC1D,QAAI,cAAc,aAAa,QAAQ,OAAO;AAC9C,QAAI,QAAQ;AACV,iBAAW,OAAO,OAAO,KAAK,MAAM,GAAG;AACrC,cAAM,MAAM,OAAO,OAAO,QAAQ,EAAE;AACpC,sBAAc,YAAY,WAAW,IAAI,QAAQ,GAAG;AAAA,MACtD;AAAA,IACF;AACA,WAAO;AAAA,EACT;AACA,SAAO;AACT;;;ACjDA,SAAQ,iBAAAE,sBAAoB;AAC5B,SAAQ,cAAAC,mBAAiB;AAmBlB,IAAM,kBAAkBD,eAAqC,IAAI;AAEjE,SAAS,oBAAoB;AAClC,QAAM,UAAUC,YAAW,eAAe;AAC1C,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,gCAAgC;AAAA,EAClD;AACA,SAAO;AACT;","names":["createContext","useContext","createContext","useContext","locale","createContext","useContext"]}
|