reroute-js 0.9.3 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/_/basic/src/index.ts +1 -8
- package/_/blog/src/client/index.html +0 -1
- package/_/blog/src/client/routes/blog/[layout].tsx +53 -3
- package/_/blog/src/client/routes/docs.tsx +1 -1
- package/_/blog/src/index.ts +1 -8
- package/_/store/src/index.ts +1 -8
- package/cli/bin.d.ts +1 -1
- package/cli/bin.js +3662 -2681
- package/cli/bin.js.map +40 -29
- package/cli/index.d.ts +2 -2
- package/cli/index.d.ts.map +1 -1
- package/cli/index.js +74 -10
- package/cli/index.js.map +7 -5
- package/cli/src/cli.d.ts +1 -1
- package/cli/src/commands/analyze.d.ts +1 -1
- package/cli/src/commands/build.d.ts +1 -1
- package/cli/src/commands/build.d.ts.map +1 -1
- package/cli/src/commands/dev.d.ts +1 -1
- package/cli/src/commands/gen.d.ts +1 -1
- package/cli/src/commands/gen.d.ts.map +1 -1
- package/{core/src/template → cli/src/commands}/index.d.ts +2 -2
- package/cli/src/commands/index.d.ts.map +1 -0
- package/cli/src/commands/init.d.ts +1 -1
- package/cli/src/{libs → commands/lib}/command.d.ts +1 -1
- package/cli/src/commands/lib/command.d.ts.map +1 -0
- package/cli/src/{libs → commands/lib}/index.d.ts +3 -2
- package/cli/src/commands/lib/index.d.ts.map +1 -0
- package/cli/src/{libs → commands/lib}/log.d.ts +1 -1
- package/cli/src/commands/lib/log.d.ts.map +1 -0
- package/cli/src/{libs/markdown.d.ts → commands/lib/markdown/availability.d.ts} +2 -2
- package/cli/src/commands/lib/markdown/availability.d.ts.map +1 -0
- package/cli/src/commands/lib/markdown/index.d.ts +12 -0
- package/cli/src/commands/lib/markdown/index.d.ts.map +1 -0
- package/cli/src/{libs/markdown-processor.d.ts → commands/lib/markdown/processor.d.ts} +2 -2
- package/cli/src/commands/lib/markdown/processor.d.ts.map +1 -0
- package/cli/src/{libs → commands/lib}/production.d.ts +1 -1
- package/cli/src/commands/lib/production.d.ts.map +1 -0
- package/cli/src/{libs → commands/lib}/server.d.ts +1 -1
- package/cli/src/commands/lib/server.d.ts.map +1 -0
- package/cli/src/commands/lib/streaming/analyzer.d.ts +26 -0
- package/cli/src/commands/lib/streaming/analyzer.d.ts.map +1 -0
- package/cli/src/commands/lib/streaming/suspense.d.ts +20 -0
- package/cli/src/commands/lib/streaming/suspense.d.ts.map +1 -0
- package/cli/src/{libs → commands/lib}/tailwind.d.ts +1 -1
- package/cli/src/commands/lib/tailwind.d.ts.map +1 -0
- package/cli/src/{libs → commands/lib}/version.d.ts +1 -1
- package/cli/src/commands/lib/version.d.ts.map +1 -0
- package/cli/src/commands/start.d.ts +2 -2
- package/cli/src/commands/start.d.ts.map +1 -1
- package/cli/src/index.d.ts +11 -0
- package/cli/src/index.d.ts.map +1 -0
- package/core/index.d.ts +1 -1
- package/core/index.js +1169 -471
- package/core/index.js.map +22 -13
- package/core/src/bundler/hash.d.ts +1 -1
- package/core/src/bundler/index.d.ts +1 -1
- package/core/src/config.d.ts +42 -0
- package/core/src/config.d.ts.map +1 -0
- package/core/src/content/discovery.d.ts +1 -1
- package/core/src/content/index.d.ts +1 -1
- package/core/src/content/metadata.d.ts +2 -2
- package/core/src/content/metadata.d.ts.map +1 -1
- package/core/src/index.d.ts +2 -4
- package/core/src/index.d.ts.map +1 -1
- package/core/src/ssr/index.d.ts +3 -3
- package/core/src/ssr/index.d.ts.map +1 -1
- package/core/src/ssr/lib/cache.d.ts +67 -0
- package/core/src/ssr/lib/cache.d.ts.map +1 -0
- package/core/src/ssr/lib/collections.d.ts +18 -0
- package/core/src/ssr/lib/collections.d.ts.map +1 -0
- package/core/src/{utils → ssr/lib}/compression.d.ts +9 -2
- package/core/src/ssr/lib/compression.d.ts.map +1 -0
- package/core/src/ssr/lib/compute.d.ts +28 -0
- package/core/src/ssr/lib/compute.d.ts.map +1 -0
- package/core/src/ssr/{data.d.ts → lib/data.d.ts} +1 -1
- package/core/src/ssr/lib/data.d.ts.map +1 -0
- package/core/src/{template → ssr/lib}/html.d.ts +2 -2
- package/core/src/ssr/lib/html.d.ts.map +1 -0
- package/core/src/ssr/lib/index.d.ts +26 -0
- package/core/src/ssr/lib/index.d.ts.map +1 -0
- package/core/src/ssr/lib/metadata.d.ts +20 -0
- package/core/src/ssr/lib/metadata.d.ts.map +1 -0
- package/core/src/{utils → ssr/lib}/mime.d.ts +1 -1
- package/core/src/ssr/lib/mime.d.ts.map +1 -0
- package/core/src/ssr/{modules.d.ts → lib/modules.d.ts} +2 -2
- package/core/src/ssr/lib/modules.d.ts.map +1 -0
- package/core/src/{utils → ssr/lib}/path.d.ts +1 -1
- package/core/src/ssr/lib/path.d.ts.map +1 -0
- package/core/src/ssr/lib/preload.d.ts +29 -0
- package/core/src/ssr/lib/preload.d.ts.map +1 -0
- package/core/src/ssr/lib/scripts.d.ts +31 -0
- package/core/src/ssr/lib/scripts.d.ts.map +1 -0
- package/core/src/ssr/{seed.d.ts → lib/seed.d.ts} +1 -1
- package/core/src/ssr/lib/seed.d.ts.map +1 -0
- package/core/src/ssr/lib/styles.d.ts +14 -0
- package/core/src/ssr/lib/styles.d.ts.map +1 -0
- package/core/src/ssr/lib/template.d.ts +19 -0
- package/core/src/ssr/lib/template.d.ts.map +1 -0
- package/core/src/{types.d.ts → ssr/lib/types.d.ts} +1 -1
- package/core/src/ssr/lib/types.d.ts.map +1 -0
- package/core/src/ssr/render.d.ts +2 -1
- package/core/src/ssr/render.d.ts.map +1 -1
- package/core/src/ssr/stream.d.ts +30 -0
- package/core/src/ssr/stream.d.ts.map +1 -0
- package/elysia/index.d.ts +1 -1
- package/elysia/index.js +1917 -794
- package/elysia/index.js.map +34 -19
- package/elysia/src/index.d.ts +1 -1
- package/elysia/src/libs/cache.d.ts +1 -1
- package/elysia/src/libs/http.d.ts +1 -1
- package/elysia/src/libs/image.d.ts +1 -1
- package/elysia/src/plugin.d.ts +1 -1
- package/elysia/src/plugin.d.ts.map +1 -1
- package/elysia/src/routes/artifacts.d.ts +1 -1
- package/elysia/src/routes/content.d.ts +1 -1
- package/elysia/src/routes/image.d.ts +2 -1
- package/elysia/src/routes/image.d.ts.map +1 -1
- package/elysia/src/routes/internal.d.ts +36 -0
- package/elysia/src/routes/internal.d.ts.map +1 -0
- package/elysia/src/routes/ssr.d.ts +3 -1
- package/elysia/src/routes/ssr.d.ts.map +1 -1
- package/elysia/src/routes/static.d.ts +2 -1
- package/elysia/src/routes/static.d.ts.map +1 -1
- package/elysia/src/types.d.ts +11 -4
- package/elysia/src/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/react/index.d.ts +1 -1
- package/react/index.js +295 -53
- package/react/index.js.map +10 -9
- package/react/src/components/ClientOnly.d.ts +1 -1
- package/react/src/components/ContentRoute.d.ts +1 -1
- package/react/src/components/ContentRoute.d.ts.map +1 -1
- package/react/src/components/Image.d.ts +1 -1
- package/react/src/components/LazyRoute.d.ts +26 -0
- package/react/src/components/LazyRoute.d.ts.map +1 -0
- package/react/src/components/Link.d.ts +1 -1
- package/react/src/components/Link.d.ts.map +1 -1
- package/react/src/components/Markdown.d.ts +1 -1
- package/react/src/components/Outlet.d.ts +1 -1
- package/react/src/components/index.d.ts +1 -1
- package/react/src/hooks/index.d.ts +2 -1
- package/react/src/hooks/index.d.ts.map +1 -1
- package/react/src/hooks/useContent.d.ts +1 -1
- package/react/src/hooks/useData.d.ts +1 -1
- package/react/src/hooks/useData.d.ts.map +1 -1
- package/react/src/hooks/useLayoutData.d.ts +18 -0
- package/react/src/hooks/useLayoutData.d.ts.map +1 -0
- package/react/src/hooks/useNavigate.d.ts +1 -1
- package/react/src/hooks/useParams.d.ts +1 -1
- package/react/src/hooks/useRouter.d.ts +1 -1
- package/react/src/hooks/useSearchParams.d.ts +1 -1
- package/react/src/index.d.ts +2 -2
- package/react/src/index.d.ts.map +1 -1
- package/react/src/{utils → lib}/content.d.ts +1 -1
- package/react/src/lib/content.d.ts.map +1 -0
- package/react/src/{utils → lib}/head.d.ts +1 -1
- package/react/src/lib/head.d.ts.map +1 -0
- package/react/src/{utils → lib}/index.d.ts +2 -2
- package/react/src/lib/index.d.ts.map +1 -0
- package/react/src/{utils → lib}/lazy-route.d.ts +1 -1
- package/react/src/lib/lazy-route.d.ts.map +1 -0
- package/react/src/lib/route-loader.d.ts +31 -0
- package/react/src/lib/route-loader.d.ts.map +1 -0
- package/react/src/providers/ContentProvider.d.ts +1 -1
- package/react/src/providers/ContentProvider.d.ts.map +1 -1
- package/react/src/providers/RerouteProvider.d.ts +1 -1
- package/react/src/providers/RerouteProvider.d.ts.map +1 -1
- package/react/src/providers/RouterProvider.d.ts +1 -1
- package/react/src/providers/RouterProvider.d.ts.map +1 -1
- package/react/src/providers/index.d.ts +1 -1
- package/react/src/types/any.d.ts +1 -1
- package/react/src/types/index.d.ts +1 -1
- package/react/src/types/router.d.ts +1 -1
- package/cli/src/libs/command.d.ts.map +0 -1
- package/cli/src/libs/index.d.ts.map +0 -1
- package/cli/src/libs/log.d.ts.map +0 -1
- package/cli/src/libs/markdown-processor.d.ts.map +0 -1
- package/cli/src/libs/markdown.d.ts.map +0 -1
- package/cli/src/libs/production.d.ts.map +0 -1
- package/cli/src/libs/server.d.ts.map +0 -1
- package/cli/src/libs/tailwind.d.ts.map +0 -1
- package/cli/src/libs/version.d.ts.map +0 -1
- package/core/src/ssr/data.d.ts.map +0 -1
- package/core/src/ssr/modules.d.ts.map +0 -1
- package/core/src/ssr/seed.d.ts.map +0 -1
- package/core/src/template/html.d.ts.map +0 -1
- package/core/src/template/index.d.ts.map +0 -1
- package/core/src/types.d.ts.map +0 -1
- package/core/src/utils/cache.d.ts +0 -21
- package/core/src/utils/cache.d.ts.map +0 -1
- package/core/src/utils/compression.d.ts.map +0 -1
- package/core/src/utils/index.d.ts +0 -14
- package/core/src/utils/index.d.ts.map +0 -1
- package/core/src/utils/mime.d.ts.map +0 -1
- package/core/src/utils/path.d.ts.map +0 -1
- package/elysia/src/routes/dev.d.ts +0 -18
- package/elysia/src/routes/dev.d.ts.map +0 -1
- package/react/src/utils/content.d.ts.map +0 -1
- package/react/src/utils/head.d.ts.map +0 -1
- package/react/src/utils/index.d.ts.map +0 -1
- package/react/src/utils/lazy-route.d.ts.map +0 -1
package/elysia/index.js.map
CHANGED
|
@@ -1,31 +1,46 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../../packages/core/src/
|
|
3
|
+
"sources": ["../../packages/core/src/bundler/hash.ts", "../../packages/core/src/config.ts", "../../packages/core/src/ssr/lib/path.ts", "../../packages/core/src/content/discovery.ts", "../../packages/core/src/content/metadata.ts", "../../packages/core/src/content/index.ts", "../../packages/core/src/ssr/lib/cache.ts", "../../packages/core/src/ssr/lib/collections.ts", "../../packages/core/src/ssr/lib/mime.ts", "../../packages/core/src/ssr/lib/compression.ts", "../../packages/core/src/ssr/lib/compute.ts", "../../packages/core/src/ssr/lib/modules.ts", "../../packages/core/src/ssr/lib/seed.ts", "../../packages/core/src/ssr/lib/data.ts", "../../packages/core/src/ssr/lib/html.ts", "../../packages/core/src/ssr/lib/metadata.ts", "../../packages/core/src/ssr/lib/preload.ts", "../../packages/core/src/ssr/lib/scripts.ts", "../../packages/core/src/ssr/lib/styles.ts", "../../packages/core/src/ssr/lib/template.ts", "../../packages/core/src/ssr/lib/index.ts", "../../node_modules/.bun/dedent@1.7.0/node_modules/dedent/dist/dedent.mjs", "../../packages/core/src/ssr/render.ts", "../../packages/core/src/ssr/stream.ts", "../../packages/core/src/ssr/index.ts", "../../packages/core/src/index.ts", "../../packages/core/index.ts", "../../packages/elysia/src/plugin.ts", "../../packages/elysia/src/libs/image.ts", "../../packages/elysia/src/routes/artifacts.ts", "../../packages/elysia/src/libs/cache.ts", "../../packages/elysia/src/routes/content.ts", "../../packages/elysia/src/routes/image.ts", "../../packages/elysia/src/routes/internal.ts", "../../packages/elysia/src/libs/http.ts", "../../packages/elysia/src/routes/ssr.ts", "../../packages/elysia/src/routes/static.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"
|
|
5
|
+
"export async function generateContentHash(content: string): Promise<string> {\n\tconst data = new TextEncoder().encode(content);\n\tconst buf = await crypto.subtle.digest('SHA-256', data);\n\tlet hex = '';\n\tfor (const b of new Uint8Array(buf)) hex += b.toString(16).padStart(2, '0');\n\treturn hex.slice(0, 8);\n}\n",
|
|
6
|
+
"import { pathToFileURL } from 'node:url';\nimport type { ComponentType } from 'react';\n\nexport interface StreamingOptions {\n\tenabled?: boolean;\n\tdefaultSkeleton?: ComponentType | string;\n\tdefaultLayoutSkeleton?: ComponentType | string;\n}\n\nexport interface ConfigOptions {\n\t// App component - must be string path in config (not ReactElement)\n\tapp?: string;\n\n\t// SSR options\n\thead?: string;\n\tlang?: string;\n\tappId?: string;\n\n\t// Static serving options\n\tassets?: string;\n\tprefix?: string;\n\tignorePatterns?: (string | RegExp)[];\n\tstaticHeaders?: Record<string, string>;\n\tmaxAge?: number;\n\tdirective?: string;\n\tindexHTML?: boolean;\n\n\t// Build options\n\tminify?: boolean;\n\n\t// Compression (applies to both sync and streaming SSR)\n\tcompression?: boolean;\n\n\t// Image optimization options\n\timageMaxAge?: number;\n\timageAllowedDomains?: string[];\n\timageMaxWidth?: number;\n\timageMaxHeight?: number;\n\n\t// Bundle caching options\n\tbundleMaxAge?: number;\n}\n\nexport interface RerouteConfig {\n\toptions?: ConfigOptions;\n\tstreaming?: StreamingOptions;\n}\n\nexport function defineConfig(config: RerouteConfig): RerouteConfig {\n\treturn config;\n}\n\nexport async function loadConfig(cwd: string): Promise<RerouteConfig> {\n\tconst configPath = `${cwd}/reroute.config.ts`;\n\tconst configFile = Bun.file(configPath);\n\n\tif (!(await configFile.exists())) {\n\t\treturn {};\n\t}\n\n\ttry {\n\t\tconst mod = await import(\n\t\t\t`${pathToFileURL(configPath).href}?t=${Date.now()}`\n\t\t);\n\t\treturn (mod.default || mod) as RerouteConfig;\n\t} catch (error) {\n\t\tconsole.warn('[reroute] Failed to load reroute.config.ts:', error);\n\t\treturn {};\n\t}\n}\n",
|
|
6
7
|
"export function join(...parts: string[]): string {\n\treturn parts.join('/').replace(/\\/+/g, '/');\n}\n\nexport function extname(p: string): string {\n\tconst i = p.lastIndexOf('.');\n\treturn i >= 0 ? p.slice(i) : '';\n}\n\nexport function basename(p: string, ext?: string): string {\n\tconst name = p.replace(/\\\\/g, '/').split('/').pop() || p;\n\treturn ext && name.endsWith(ext) ? name.slice(0, -ext.length) : name;\n}\n\nexport function stripStart(p: string, ch: string): string {\n\treturn p.startsWith(ch) ? p.slice(ch.length) : p;\n}\n\nexport function stripEnd(p: string, ch: string): string {\n\treturn p.endsWith(ch) ? p.slice(0, -ch.length) : p;\n}\n",
|
|
7
|
-
"import { stat } from 'node:fs/promises';\nimport {
|
|
8
|
-
"import {
|
|
9
|
-
"
|
|
10
|
-
"
|
|
11
|
-
"import { readdir, stat } from 'node:fs/promises';\nimport { pathToFileURL } from 'node:url';\nimport dedent from 'dedent';\nimport { cloneElement, type ReactElement } from 'react';\nimport { renderToString } from 'react-dom/server';\nimport { buildHeadFromMeta } from '../content/metadata';\nimport { applyIndexTemplate, loadIndexHtml } from '../template';\nimport type { Doc } from '../types';\nimport { join } from '../utils/path';\nimport { seedSSRModuleForPath } from './seed';\n\ntype SSRRenderOptions = {\n\tpathname: string;\n\trootComponent: ReactElement;\n\tclientDir: string;\n\tcwd: string;\n\tisWatchMode: boolean;\n\tbundleUrl: string;\n\thead?: string;\n\tlang?: string;\n\tappId?: string;\n\t// When true, also attempt to minify inlined assets like CSS\n\tminify?: boolean;\n};\n\ntype SSRRenderResult = {\n\thtml: string;\n\tstatus: number;\n};\n\nasync function renderSSRDocument(\n\toptions: SSRRenderOptions,\n): Promise<SSRRenderResult> {\n\tconst {\n\t\tpathname,\n\t\trootComponent,\n\t\tclientDir,\n\t\tcwd,\n\t\tisWatchMode,\n\t\tbundleUrl,\n\t\thead = '',\n\t\tlang = 'en',\n\t\tappId = 'root',\n\t\tminify = false,\n\t} = options;\n\n\tconst scripts = [bundleUrl];\n\tlet hydrationScript = '';\n\tlet extraHead = '';\n\n\t// Preload the main client entry for earlier fetch start\n\ttry {\n\t\tif (typeof bundleUrl === 'string' && bundleUrl.endsWith('.js')) {\n\t\t\textraHead += `\\n<link rel=\"modulepreload\" href=\"${bundleUrl}\" />`;\n\t\t}\n\t} catch {}\n\n\t// Track HTTP status override (e.g., 404 when content entry missing)\n\tlet statusOverride: number | undefined;\n\n\t// Reset per-request SSR access tracking to avoid cross-request leakage\n\t// Shape: { [collection]: { limit: number|Infinity, sort: 'date-desc'|'date-asc'|'none'|'custom' } }\n\ttry {\n\t\t(globalThis as Doc).__REROUTE_SSR_ACCESSED__ = {} as unknown as Doc;\n\t} catch {}\n\n\t// If current page is a content page (/collection/name) AND the collection exists,\n\t// preload its module for instant hydration. Avoid treating non-content dynamic\n\t// routes (e.g., /products/19) as missing content, which would set 404.\n\ttry {\n\t\tconst parts = pathname.split('/').filter(Boolean);\n\t\tif (parts.length >= 2) {\n\t\t\tconst collection = parts[0];\n\t\t\tconst name = parts[1];\n\t\t\tlet modulePath = '';\n\n\t\t\t// Only consider this a content collection if routes/<collection>/content exists\n\t\t\tlet isContentCollection = false;\n\t\t\ttry {\n\t\t\t\tconst maybeDir = join(clientDir, 'routes', collection, 'content');\n\t\t\t\tconst s = await stat(maybeDir);\n\t\t\t\tisContentCollection =\n\t\t\t\t\ttypeof s?.isDirectory === 'function' ? s.isDirectory() : true;\n\t\t\t} catch {\n\t\t\t\tisContentCollection = false;\n\t\t\t}\n\n\t\t\tif (!isContentCollection) {\n\t\t\t\t// Not a content collection path; skip content preloading logic\n\t\t\t\t// to avoid incorrectly marking the request as 404.\n\t\t\t\tthrow new Error('skip-content-preload');\n\t\t\t}\n\n\t\t\t// Prefer registry mapping from .reroute/content.ts for exact chunk\n\t\t\ttry {\n\t\t\t\tconst registryPath = join(cwd, '.reroute', 'content.ts');\n\t\t\t\tconst reg = (await import(\n\t\t\t\t\tpathToFileURL(registryPath).href +\n\t\t\t\t\t\t(isWatchMode ? `?t=${Date.now()}` : '')\n\t\t\t\t)) as Doc;\n\t\t\t\tconst get = (reg as Doc)?.getContentEntry as\n\t\t\t\t\t| ((c: string, n: string) => { module?: string } | undefined)\n\t\t\t\t\t| undefined;\n\t\t\t\tconst entry =\n\t\t\t\t\ttypeof get === 'function' ? get(collection, name) : undefined;\n\t\t\t\tconst moduleUrl = (entry as Doc)?.module as string | undefined;\n\t\t\t\tif (moduleUrl?.endsWith('.js')) {\n\t\t\t\t\tmodulePath = moduleUrl;\n\t\t\t\t}\n\t\t\t} catch {}\n\n\t\t\t// Fallback: pick newest chunk if registry unavailable\n\t\t\tif (!modulePath) {\n\t\t\t\ttry {\n\t\t\t\t\tconst chunkDir = join(cwd, '.reroute', 'chunks', collection);\n\t\t\t\t\tconst files = await readdir(chunkDir);\n\t\t\t\t\tconst candidates = files.filter(\n\t\t\t\t\t\t(n) => n.startsWith(`${name}.`) && n.endsWith('.js'),\n\t\t\t\t\t);\n\t\t\t\t\tif (candidates.length) {\n\t\t\t\t\t\tlet latest = candidates[0];\n\t\t\t\t\t\tlet latestM = 0;\n\t\t\t\t\t\tfor (const candidateName of candidates) {\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tconst s = await stat(join(chunkDir, candidateName));\n\t\t\t\t\t\t\t\tif (s.mtimeMs >= latestM) {\n\t\t\t\t\t\t\t\t\tlatestM = s.mtimeMs;\n\t\t\t\t\t\t\t\t\tlatest = candidateName;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} catch {}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tmodulePath = `/${join('.reroute', 'chunks', collection, latest).replace(/\\\\+/g, '/')}`;\n\t\t\t\t\t}\n\t\t\t\t} catch {}\n\t\t\t}\n\n\t\t\t// Fallback to raw source if chunk missing\n\t\t\tif (!modulePath) {\n\t\t\t\tconst tsx = join(\n\t\t\t\t\tclientDir,\n\t\t\t\t\t'routes',\n\t\t\t\t\tcollection,\n\t\t\t\t\t'content',\n\t\t\t\t\t`${name}.tsx`,\n\t\t\t\t);\n\t\t\t\tconst ts = join(\n\t\t\t\t\tclientDir,\n\t\t\t\t\t'routes',\n\t\t\t\t\tcollection,\n\t\t\t\t\t'content',\n\t\t\t\t\t`${name}.ts`,\n\t\t\t\t);\n\t\t\t\tlet srcUrl = '';\n\t\t\t\tif (await Bun.file(tsx).exists()) {\n\t\t\t\t\tsrcUrl = `/${join('routes', collection, 'content', `${name}.tsx`).replace(/\\\\+/g, '/')}`;\n\t\t\t\t} else if (await Bun.file(ts).exists()) {\n\t\t\t\t\tsrcUrl = `/${join('routes', collection, 'content', `${name}.ts`).replace(/\\\\+/g, '/')}`;\n\t\t\t\t}\n\t\t\t\tif (srcUrl) {\n\t\t\t\t\tmodulePath = srcUrl;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (!modulePath) {\n\t\t\t\tstatusOverride = 404;\n\t\t\t}\n\n\t\t\tif (modulePath) {\n\t\t\t\tconst key = `${collection}:${name}`;\n\t\t\t\t// Hint the browser to fetch the module ASAP\n\t\t\t\textraHead += `\\n<link rel=\"modulepreload\" href=\"${modulePath}\" />`;\n\t\t\t\t// Ensure the module is evaluated before the main app module runs via external module\n\t\t\t\tconst qs = `src=${encodeURIComponent(modulePath)}&key=${encodeURIComponent(key)}`;\n\t\t\t\thydrationScript += `<script type=\"module\" src=\"/__reroute_preload?${qs}\"></script>`;\n\t\t\t}\n\t\t}\n\t} catch {}\n\n\t// Seed SSR store with content component so BlogPost can render on server\n\tawait seedSSRModuleForPath(pathname, clientDir, cwd, isWatchMode);\n\n\t// Route component module preload removed to avoid extra requests.\n\n\t// Execute optional route/content ssr.data and expose per-request store\n\tconst __SSR_DATA__: Record<string, unknown> = {};\n\ttry {\n\t\t// Content page ssr.data exported from the content module (if any)\n\t\ttry {\n\t\t\tconst parts = pathname.split('/').filter(Boolean);\n\t\t\tif (parts.length >= 2) {\n\t\t\t\tconst g = globalThis as Doc;\n\t\t\t\tconst key = `${parts[0]}:${parts[1]}`;\n\t\t\t\tconst exp = g.__REROUTE_SSR_EXPORTS__?.[key] as\n\t\t\t\t\t| { ssr?: { data?: (ctx: Doc) => unknown | Promise<unknown> } }\n\t\t\t\t\t| undefined;\n\t\t\t\tconst dataFn = (exp as Doc)?.ssr?.data as\n\t\t\t\t\t| ((ctx: Doc) => unknown | Promise<unknown>)\n\t\t\t\t\t| undefined;\n\t\t\t\tif (typeof dataFn === 'function') {\n\t\t\t\t\tconst out = await dataFn({\n\t\t\t\t\t\tpathname,\n\t\t\t\t\t\tparams: { name: parts[1] },\n\t\t\t\t\t} as Doc);\n\t\t\t\t\t__SSR_DATA__[pathname] = out as unknown;\n\t\t\t\t}\n\t\t\t}\n\t\t} catch {}\n\n\t\t// Route-level ssr.data from route module (non-content routes)\n\t\ttry {\n\t\t\tconst routesPath = join(cwd, '.reroute', 'routes.ts');\n\t\t\tconst m = await import(\n\t\t\t\tpathToFileURL(routesPath).href + (isWatchMode ? `?t=${Date.now()}` : '')\n\t\t\t);\n\t\t\tconst match =\n\t\t\t\ttypeof m.matchRoute === 'function' ? m.matchRoute(pathname) : null;\n\t\t\tconst r = match?.route as Doc | undefined;\n\t\t\tconst params = (match?.params || {}) as Record<string, string>;\n\n\t\t\tif (r && typeof r.path === 'string') {\n\t\t\t\ttry {\n\t\t\t\t\tconst abs = join(clientDir, 'routes', String(r.path));\n\t\t\t\t\tconst mod = (await import(\n\t\t\t\t\t\tpathToFileURL(abs).href + (isWatchMode ? `?t=${Date.now()}` : '')\n\t\t\t\t\t)) as Doc;\n\t\t\t\t\tconst ssr = (mod as Doc)?.ssr as Doc | undefined;\n\t\t\t\t\tconst dataFn = (ssr as Doc)?.data as\n\t\t\t\t\t\t| ((ctx: Doc) => unknown | Promise<unknown>)\n\t\t\t\t\t\t| undefined;\n\t\t\t\t\tif (typeof dataFn === 'function') {\n\t\t\t\t\t\tconst out = await dataFn({ pathname, params } as Doc);\n\t\t\t\t\t\t__SSR_DATA__[pathname] = out as unknown;\n\t\t\t\t\t}\n\t\t\t\t} catch {}\n\t\t\t}\n\t\t} catch {}\n\t} catch {}\n\n\ttry {\n\t\t(globalThis as Doc).__REROUTE_DATA__ = __SSR_DATA__ as Doc;\n\t} catch {}\n\n\t// Seed content collections on the server for SSR rendering (no client delivery yet).\n\t// We'll only inline the collections actually accessed during this render, captured\n\t// via the hook-level tracker.\n\tlet __byCollectionForSSR: Record<string, unknown[]> = {};\n\ttry {\n\t\tconst p = join(cwd, '.reroute', 'content.ts');\n\t\tconst mod = await import(\n\t\t\tpathToFileURL(p).href + (isWatchMode ? `?t=${Date.now()}` : '')\n\t\t);\n\t\t__byCollectionForSSR = ((mod as Doc)?.byCollection || {}) as Record<\n\t\t\tstring,\n\t\t\tunknown[]\n\t\t>;\n\t\ttry {\n\t\t\t(globalThis as Doc).__REROUTE_COLLECTIONS__ = __byCollectionForSSR as Doc;\n\t\t} catch {}\n\t} catch {}\n\n\t// (moved) Entry + dev watcher scripts are appended later, after we inline\n\t// any accessed collections so data is available before app boot.\n\n\tconst componentWithPathname = cloneElement<Doc>(rootComponent, {\n\t\tpathname,\n\t});\n\tconst appHtml = renderToString(componentWithPathname);\n\tconst baseTemplate = await loadIndexHtml(clientDir);\n\n\t// Inline compiled Tailwind CSS output if present (generated by CLI):\n\t// Prefer theme.css relative to clientDir (e.g., src/client/theme.css -> ../../.reroute/theme.css)\n\tlet inlineStyleTag = '';\n\ttry {\n\t\tconst candidates = [\n\t\t\tjoin(clientDir, '..', '.reroute', 'theme.css'),\n\t\t\tjoin(clientDir, '..', '..', '.reroute', 'theme.css'),\n\t\t\tjoin(clientDir, '..', '..', '..', '.reroute', 'theme.css'),\n\t\t\tjoin(clientDir, '..', '..', '..', '..', '.reroute', 'theme.css'),\n\t\t];\n\t\tlet cssPath = '';\n\t\tfor (const p of candidates) {\n\t\t\tif (await Bun.file(p).exists()) {\n\t\t\t\tcssPath = p;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif (cssPath) {\n\t\t\tlet css = await Bun.file(cssPath).text();\n\t\t\tif (minify) {\n\t\t\t\t// Best-effort, safe-ish CSS minification without external deps\n\t\t\t\tcss = css\n\t\t\t\t\t// Remove /* block comments */\n\t\t\t\t\t.replace(/\\/\\*[\\s\\S]*?\\*\\//g, '')\n\t\t\t\t\t// Collapse whitespace\n\t\t\t\t\t.replace(/\\s+/g, ' ')\n\t\t\t\t\t// Remove space around selectors, braces, colons and semicolons\n\t\t\t\t\t.replace(/\\s*([{}:;,>+~])\\s*/g, '$1')\n\t\t\t\t\t// Remove final semicolons before closing brace\n\t\t\t\t\t.replace(/;}/g, '}')\n\t\t\t\t\t// Trim\n\t\t\t\t\t.trim();\n\t\t\t}\n\t\t\tinlineStyleTag = `<style data-reroute=\"tailwind\">${css}</style>`;\n\t\t}\n\t} catch {}\n\n\t// After rendering, inline only the content collections that were actually\n\t// accessed during this SSR render. This preserves SSR for static routes that\n\t// use useContent(), while avoiding shipping the entire content index to pages\n\t// that don't need it (e.g., a single post entry without lists).\n\ttry {\n\t\tconst g = globalThis as unknown as { __REROUTE_SSR_ACCESSED__?: unknown };\n\t\tconst acc = g.__REROUTE_SSR_ACCESSED__ as Doc;\n\n\t\t// Helper for date ordering\n\t\tconst sortByDate = (order: 'asc' | 'desc') => (a: Doc, b: Doc) => {\n\t\t\tconst da = a?.meta?.date ? Date.parse(String(a.meta.date)) : 0;\n\t\t\tconst db = b?.meta?.date ? Date.parse(String(b.meta.date)) : 0;\n\t\t\treturn order === 'asc' ? da - db : db - da;\n\t\t};\n\n\t\t// Normalize tracker into a map of collection -> { limit, sort }\n\t\tconst usage: Record<string, { limit: number; sort: string }> = {};\n\t\tif (acc && typeof acc.forEach === 'function') {\n\t\t\t// Back-compat with old Set<string> form: treat as full list\n\t\t\t(acc as Set<string>).forEach((c) => {\n\t\t\t\tif (typeof c === 'string')\n\t\t\t\t\tusage[c] = { limit: Number.POSITIVE_INFINITY, sort: 'custom' };\n\t\t\t});\n\t\t} else if (acc && typeof acc === 'object') {\n\t\t\tfor (const [k, v] of Object.entries(acc as Record<string, Doc>)) {\n\t\t\t\tconst lim =\n\t\t\t\t\ttypeof v?.limit === 'number' ? v.limit : Number.POSITIVE_INFINITY;\n\t\t\t\tconst s = typeof v?.sort === 'string' ? v.sort : 'custom';\n\t\t\t\tusage[k] = { limit: lim, sort: s };\n\t\t\t}\n\t\t}\n\n\t\tconst collections = Object.keys(usage);\n\t\tif (collections.length) {\n\t\t\tconst subset: Record<string, unknown[]> = {};\n\t\t\tconst partial: Record<string, boolean> = {};\n\t\t\tfor (const c of collections) {\n\t\t\t\tconst conf = usage[c];\n\t\t\t\tconst full = __byCollectionForSSR?.[c] || [];\n\t\t\t\tlet arr: unknown[] = full;\n\t\t\t\tif (\n\t\t\t\t\tNumber.isFinite(conf.limit) &&\n\t\t\t\t\tconf.limit > 0 &&\n\t\t\t\t\tconf.sort !== 'custom'\n\t\t\t\t) {\n\t\t\t\t\tif (conf.sort === 'date-desc') {\n\t\t\t\t\t\tarr = [...full].sort(sortByDate('desc')).slice(0, conf.limit);\n\t\t\t\t\t} else if (conf.sort === 'date-asc') {\n\t\t\t\t\t\tarr = [...full].sort(sortByDate('asc')).slice(0, conf.limit);\n\t\t\t\t\t} else if (conf.sort === 'none') {\n\t\t\t\t\t\tarr = full.slice(0, conf.limit);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tsubset[c] = arr;\n\t\t\t\tpartial[c] =\n\t\t\t\t\tArray.isArray(arr) && Array.isArray(full)\n\t\t\t\t\t\t? arr.length < full.length\n\t\t\t\t\t\t: false;\n\t\t\t}\n\t\t\tconst subsetJson = JSON.stringify(subset);\n\t\t\tconst partialJson = JSON.stringify(partial);\n\t\t\thydrationScript += `\\n<script>\\n (function(){ try {\\n var w = (typeof window!== 'undefined'? window : globalThis);\\n w.__REROUTE_COLLECTIONS__ = w.__REROUTE_COLLECTIONS__ || {};\\n Object.assign(w.__REROUTE_COLLECTIONS__, ${subsetJson});\\n w.__REROUTE_COLLECTIONS_PARTIAL__ = w.__REROUTE_COLLECTIONS_PARTIAL__ || {};\\n Object.assign(w.__REROUTE_COLLECTIONS_PARTIAL__, ${partialJson});\\n } catch(e){} })();\\n</script>`;\n\t\t}\n\t} catch {}\n\n\t// Inline SSR data before client entry loads\n\ttry {\n\t\tconst seededJson = JSON.stringify(__SSR_DATA__);\n\t\thydrationScript += `\\n<script>\\n (function(){ try {\\n var w = (typeof window!== 'undefined'? window : globalThis);\\n w.__REROUTE_DATA__ = Object.assign({}, w.__REROUTE_DATA__ || {}, ${seededJson});\\n } catch(e){} })();\\n</script>`;\n\t} catch {}\n\n\t// Append client entry module only after inlining accessed collections\n\thydrationScript += scripts\n\t\t.map((src) => `<script type=\"module\" src=\"${src}\"></script>`)\n\t\t.join('');\n\n\t// (Dev) Load live reload module (no inline script)\n\tif (isWatchMode) {\n\t\thydrationScript += `<script type=\"module\" src=\"/__reroute_watch.js\"></script>`;\n\t}\n\n\t// Derive per-page head from exported meta/ssr if available\n\tlet perPageHead = '';\n\tlet pageLang: string | undefined;\n\ttry {\n\t\tconst parts = pathname.split('/').filter(Boolean);\n\t\tif (parts.length >= 2) {\n\t\t\tconst key = `${parts[0]}:${parts[1]}`;\n\t\t\tconst g = globalThis as Doc;\n\t\t\tconst exp = g.__REROUTE_SSR_EXPORTS__?.[key] as\n\t\t\t\t| { meta?: unknown; ssr?: unknown }\n\t\t\t\t| undefined;\n\t\t\tconst meta = (exp as Doc)?.meta;\n\t\t\tconst ssr = (exp as Doc)?.ssr;\n\t\t\tperPageHead += buildHeadFromMeta(meta);\n\t\t\tconst ssrHead =\n\t\t\t\ttypeof ssr?.head === 'string'\n\t\t\t\t\t? ssr.head\n\t\t\t\t\t: Array.isArray(ssr?.head)\n\t\t\t\t\t\t? String(ssr.head.join('\\n'))\n\t\t\t\t\t\t: '';\n\t\t\tif (ssrHead) perPageHead += `\\n${ssrHead}`;\n\t\t\tif (typeof ssr?.lang === 'string' && ssr.lang.trim()) {\n\t\t\t\tpageLang = ssr.lang.trim();\n\t\t\t}\n\t\t}\n\t} catch {}\n\n\t// Additionally, import the matched route module to apply route-level meta/ssr for non-content routes\n\ttry {\n\t\tconst routesPath = join(cwd, '.reroute', 'routes.ts');\n\t\tconst m = await import(\n\t\t\tpathToFileURL(routesPath).href + (isWatchMode ? `?t=${Date.now()}` : '')\n\t\t);\n\t\tconst match =\n\t\t\ttypeof m.matchRoute === 'function' ? m.matchRoute(pathname) : null;\n\t\tconst r = match?.route as Doc | undefined;\n\t\tif (!r) {\n\t\t\t// No route matched; mark as 404 for status\n\t\t\tstatusOverride = statusOverride || 404;\n\t\t}\n\t\tif (r && typeof r.path === 'string') {\n\t\t\ttry {\n\t\t\t\tconst abs = join(clientDir, 'routes', String(r.path));\n\t\t\t\tconst mod = (await import(\n\t\t\t\t\tpathToFileURL(abs).href + (isWatchMode ? `?t=${Date.now()}` : '')\n\t\t\t\t)) as Doc;\n\t\t\t\tconst meta = (mod as Doc)?.meta;\n\t\t\t\tconst ssr = (mod as Doc)?.ssr as Doc | undefined;\n\t\t\t\tif (meta) perPageHead += buildHeadFromMeta(meta);\n\t\t\t\tif (ssr) {\n\t\t\t\t\tconst ssrHead =\n\t\t\t\t\t\ttypeof ssr.head === 'string'\n\t\t\t\t\t\t\t? ssr.head\n\t\t\t\t\t\t\t: Array.isArray(ssr.head)\n\t\t\t\t\t\t\t\t? String((ssr.head as unknown[]).join('\\n'))\n\t\t\t\t\t\t\t\t: '';\n\t\t\t\t\tif (ssrHead) perPageHead += `\\n${ssrHead}`;\n\t\t\t\t\tif (typeof ssr.lang === 'string' && ssr.lang.trim()) {\n\t\t\t\t\t\tpageLang = ssr.lang.trim();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} catch {}\n\t\t\t// If route matched but we will render a custom 404 (e.g., content missing),\n\t\t\t// try to also apply the closest notFound meta if available.\n\t\t} else {\n\t\t\ttry {\n\t\t\t\tconst list = (m as Doc)?.notFoundRoutes as Doc[] | undefined;\n\t\t\t\tif (Array.isArray(list)) {\n\t\t\t\t\t// choose most specific by longest pattern prefix\n\t\t\t\t\tlet chosen: Doc | undefined;\n\t\t\t\t\tlet bestLen = -1;\n\t\t\t\t\tfor (const nf of list) {\n\t\t\t\t\t\tconst pat = String((nf as Doc)?.pattern || '/');\n\t\t\t\t\t\tif (!pathname.startsWith(pat)) continue;\n\t\t\t\t\t\tconst len = pat.split('/').filter(Boolean).length;\n\t\t\t\t\t\tif (len >= bestLen) {\n\t\t\t\t\t\t\tbestLen = len;\n\t\t\t\t\t\t\tchosen = nf;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (chosen && typeof (chosen as Doc).path === 'string') {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst abs = join(\n\t\t\t\t\t\t\t\tclientDir,\n\t\t\t\t\t\t\t\t'routes',\n\t\t\t\t\t\t\t\tString((chosen as Doc).path),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tconst mod = (await import(\n\t\t\t\t\t\t\t\tpathToFileURL(abs).href +\n\t\t\t\t\t\t\t\t\t(isWatchMode ? `?t=${Date.now()}` : '')\n\t\t\t\t\t\t\t)) as Doc;\n\t\t\t\t\t\t\tconst meta = (mod as Doc)?.meta;\n\t\t\t\t\t\t\tconst ssr = (mod as Doc)?.ssr as Doc | undefined;\n\t\t\t\t\t\t\tif (meta) perPageHead += buildHeadFromMeta(meta);\n\t\t\t\t\t\t\tconst ssrHead =\n\t\t\t\t\t\t\t\ttypeof ssr?.head === 'string'\n\t\t\t\t\t\t\t\t\t? ssr.head\n\t\t\t\t\t\t\t\t\t: Array.isArray(ssr?.head)\n\t\t\t\t\t\t\t\t\t\t? String((ssr.head as unknown[]).join('\\n'))\n\t\t\t\t\t\t\t\t\t\t: '';\n\t\t\t\t\t\t\tif (ssrHead) perPageHead += `\\n${ssrHead}`;\n\t\t\t\t\t\t\tif (typeof ssr?.lang === 'string' && ssr.lang?.trim()) {\n\t\t\t\t\t\t\t\tpageLang = String(ssr.lang).trim();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} catch {}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} catch {}\n\t\t}\n\t} catch {}\n\n\tconst combinedHead = dedent(\n\t\t[dedent(head) || '', dedent(extraHead), dedent(perPageHead)]\n\t\t\t.filter(Boolean)\n\t\t\t.join('\\n'),\n\t);\n\tconst html = applyIndexTemplate(baseTemplate, appHtml, {\n\t\thead: [inlineStyleTag, combinedHead].filter(Boolean).join('\\n'),\n\t\thydrationScript,\n\t\tlang: pageLang || lang,\n\t\tappId,\n\t});\n\n\treturn {\n\t\thtml,\n\t\tstatus: statusOverride || 200,\n\t};\n}\n\nexport { renderSSRDocument, type SSRRenderOptions, type SSRRenderResult };\n",
|
|
8
|
+
"import { readdir, stat } from 'node:fs/promises';\nimport { join } from '../ssr/lib/path';\n\nexport async function listContentFiles(\n\tdir: string,\n\tbaseRel: string,\n): Promise<string[]> {\n\tconst out: string[] = [];\n\ttry {\n\t\tconst entries = await readdir(dir, { withFileTypes: true });\n\t\tfor (const entry of entries) {\n\t\t\tconst full = join(dir, entry.name);\n\t\t\tconst rel = join(baseRel, entry.name);\n\t\t\tif (entry.isDirectory()) {\n\t\t\t\tconst nested = await listContentFiles(full, rel);\n\t\t\t\tout.push(...nested);\n\t\t\t} else if (entry.isFile()) {\n\t\t\t\tif (/\\.(tsx|ts)$/.test(entry.name) && !entry.name.startsWith('_')) {\n\t\t\t\t\tout.push(rel);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t} catch {\n\t\t// ignore missing dirs\n\t}\n\treturn out;\n}\n\n// buildContentDTOs removed - content is now fully pre-generated at build time\n\nexport async function discoverCollections(\n\tclientDir: string,\n): Promise<string[]> {\n\tconst root = join(clientDir, 'routes');\n\tconst collections = new Set<string>();\n\ttry {\n\t\tconst entries = await readdir(root, { withFileTypes: true });\n\t\tfor (const entry of entries) {\n\t\t\tif (entry.isDirectory()) {\n\t\t\t\tconst contentDir = join(root, entry.name, 'content');\n\t\t\t\ttry {\n\t\t\t\t\tawait stat(contentDir);\n\t\t\t\t\tcollections.add(entry.name);\n\t\t\t\t} catch {\n\t\t\t\t\t// content directory doesn't exist, skip\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t} catch {\n\t\t// routes directory doesn't exist\n\t}\n\treturn Array.from(collections);\n}\n",
|
|
9
|
+
"import { stat } from 'node:fs/promises';\nimport { pathToFileURL } from 'node:url';\nimport type { ContentMeta, Doc } from '../ssr/lib/types';\n\nexport async function getContentMeta(\n\tabsPath: string,\n\tisWatchMode: boolean,\n): Promise<ContentMeta> {\n\ttry {\n\t\tconst url = pathToFileURL(absPath).href;\n\t\tconst mod = await import(`${url}${isWatchMode ? `?t=${Date.now()}` : ''}`);\n\t\tconst meta: unknown = (mod as Doc).meta || (mod as Doc).frontmatter || {};\n\t\tif (meta && typeof meta === 'object') return meta as ContentMeta;\n\t\treturn {};\n\t} catch {\n\t\ttry {\n\t\t\tconst s = await stat(absPath);\n\t\t\treturn { date: new Date(s.mtimeMs).toISOString() };\n\t\t} catch {\n\t\t\treturn {};\n\t\t}\n\t}\n}\n\n/**\n * Build a minimal <head> snippet from content metadata.\n * - <title>\n * - <meta name=\"description\">\n */\nexport function buildHeadFromMeta(\n\tmeta: ContentMeta | undefined | null,\n): string {\n\tif (!meta || typeof meta !== 'object') return '';\n\tconst parts: string[] = [];\n\tconst title = typeof meta.title === 'string' ? meta.title : undefined;\n\tconst description =\n\t\ttypeof meta.description === 'string'\n\t\t\t? meta.description\n\t\t\t: typeof meta.excerpt === 'string'\n\t\t\t\t? meta.excerpt\n\t\t\t\t: undefined;\n\tif (title) parts.push(`<title>${escapeHtml(title)}</title>`);\n\tif (description)\n\t\tparts.push(\n\t\t\t`<meta name=\"description\" content=\"${escapeHtml(description)}\" />`,\n\t\t);\n\treturn parts.length ? `\\n${parts.join('\\n')}` : '';\n}\n\nfunction escapeHtml(input: string): string {\n\treturn input\n\t\t.replace(/&/g, '&')\n\t\t.replace(/</g, '<')\n\t\t.replace(/>/g, '>')\n\t\t.replace(/\"/g, '"')\n\t\t.replace(/'/g, ''');\n}\n",
|
|
10
|
+
"export * from './discovery';\nexport * from './metadata';\n",
|
|
11
|
+
"type CacheEntry<T> = {\n\tdata: T;\n\ttimestamp: number;\n\tmaxAge: number;\n};\n\n/**\n * Simple in-memory cache for SSR data\n * Thread-safe for single-process usage\n */\nclass SSRDataCache {\n\tprivate cache: Map<string, CacheEntry<unknown>> = new Map();\n\tprivate static cleanupInterval: NodeJS.Timeout | null = null;\n\n\tconstructor() {\n\t\t// Run cleanup every 60 seconds to remove expired entries\n\t\t// Only start interval once globally\n\t\tif (!SSRDataCache.cleanupInterval) {\n\t\t\tSSRDataCache.cleanupInterval = setInterval(() => {\n\t\t\t\tthis.cleanup();\n\t\t\t}, 60_000);\n\t\t}\n\t}\n\n\t/**\n\t * Get cached data if available and not expired\n\t */\n\tget<T>(key: string): T | undefined {\n\t\tconst entry = this.cache.get(key);\n\t\tif (!entry) return undefined;\n\n\t\tconst age = Date.now() - entry.timestamp;\n\t\tif (age > entry.maxAge) {\n\t\t\tthis.cache.delete(key);\n\t\t\treturn undefined;\n\t\t}\n\n\t\treturn entry.data as T;\n\t}\n\n\t/**\n\t * Set data in cache with maxAge (in milliseconds)\n\t */\n\tset<T>(key: string, data: T, maxAge: number): void {\n\t\tif (maxAge <= 0) return; // Don't cache if maxAge is 0 or negative\n\n\t\tthis.cache.set(key, {\n\t\t\tdata,\n\t\t\ttimestamp: Date.now(),\n\t\t\tmaxAge, // maxAge should be in milliseconds\n\t\t});\n\t}\n\n\t/**\n\t * Check if key exists and is not expired\n\t */\n\thas(key: string): boolean {\n\t\treturn this.get(key) !== undefined;\n\t}\n\n\t/**\n\t * Clear all cached data\n\t */\n\tclear(): void {\n\t\tthis.cache.clear();\n\t}\n\n\t/**\n\t * Remove expired entries\n\t */\n\tprivate cleanup(): void {\n\t\tconst now = Date.now();\n\t\tfor (const [key, entry] of this.cache.entries()) {\n\t\t\tif (now - entry.timestamp > entry.maxAge) {\n\t\t\t\tthis.cache.delete(key);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Get cache stats (useful for debugging)\n\t */\n\tstats(): { size: number; keys: string[] } {\n\t\treturn {\n\t\t\tsize: this.cache.size,\n\t\t\tkeys: Array.from(this.cache.keys()),\n\t\t};\n\t}\n\n\t/**\n\t * Cleanup interval on shutdown\n\t */\n\tdestroy(): void {\n\t\tif (SSRDataCache.cleanupInterval) {\n\t\t\tclearInterval(SSRDataCache.cleanupInterval);\n\t\t\tSSRDataCache.cleanupInterval = null;\n\t\t}\n\t\tthis.clear();\n\t}\n}\n\n// Simple LRU Cache implementation for backward compatibility\nexport class LRUCache<K, V> {\n\tprivate cache: Map<K, V> = new Map();\n\tprivate maxSize: number;\n\n\tconstructor(maxSize: number = 100) {\n\t\tthis.maxSize = maxSize;\n\t}\n\n\tget(key: K): V | undefined {\n\t\tconst value = this.cache.get(key);\n\t\tif (value !== undefined) {\n\t\t\t// Move to end (most recently used)\n\t\t\tthis.cache.delete(key);\n\t\t\tthis.cache.set(key, value);\n\t\t}\n\t\treturn value;\n\t}\n\n\tset(key: K, value: V): void {\n\t\t// Delete if exists (to update position)\n\t\tthis.cache.delete(key);\n\n\t\t// Evict oldest if at capacity\n\t\tif (this.cache.size >= this.maxSize) {\n\t\t\tconst firstKey = this.cache.keys().next().value;\n\t\t\tthis.cache.delete(firstKey as K);\n\t\t}\n\n\t\tthis.cache.set(key, value);\n\t}\n\n\thas(key: K): boolean {\n\t\treturn this.cache.has(key);\n\t}\n\n\tclear(): void {\n\t\tthis.cache.clear();\n\t}\n}\n\n// Global singleton instance - persist across module reloads in dev mode\n// Use globalThis to ensure cache survives hot reloads\nconst getGlobalCache = (): SSRDataCache => {\n\tconst g = globalThis as typeof globalThis & {\n\t\t__REROUTE_SSR_CACHE__?: SSRDataCache;\n\t\t__REROUTE_SSR_CACHE_INIT__?: boolean;\n\t};\n\n\tif (!g.__REROUTE_SSR_CACHE__) {\n\t\tg.__REROUTE_SSR_CACHE__ = new SSRDataCache();\n\t\tg.__REROUTE_SSR_CACHE_INIT__ = true;\n\t}\n\n\treturn g.__REROUTE_SSR_CACHE__;\n};\n\nconst ssrCache = getGlobalCache();\n\nexport { ssrCache, SSRDataCache };\nexport type { CacheEntry };\n",
|
|
12
|
+
"import { pathToFileURL } from 'node:url';\nimport { join } from './path';\n\n// biome-ignore lint/suspicious/noExplicitAny: flexible types\ntype Doc = any;\n\n/**\n * Load content collections for SSR rendering\n */\nexport async function loadCollections(\n\tcwd: string,\n\tisWatchMode: boolean,\n): Promise<Record<string, unknown[]>> {\n\ttry {\n\t\tconst p = join(cwd, '.reroute', 'content.ts');\n\t\tconst mod = await import(\n\t\t\tpathToFileURL(p).href + (isWatchMode ? `?t=${Date.now()}` : '')\n\t\t);\n\t\treturn (mod?.byCollection || {}) as Record<string, unknown[]>;\n\t} catch {\n\t\treturn {};\n\t}\n}\n\n/**\n * Set global collections for SSR\n */\nexport function setGlobalCollections(\n\tbyCollectionForSSR: Record<string, unknown[]>,\n): void {\n\ttry {\n\t\t(globalThis as Doc).__REROUTE_COLLECTIONS__ = byCollectionForSSR as Doc;\n\t} catch {}\n}\n",
|
|
13
|
+
"export function getMimeType(filePath: string): string {\n\tconst ext = filePath.split('.').pop()?.toLowerCase();\n\tconst mimeTypes: Record<string, string> = {\n\t\thtml: 'text/html',\n\t\tcss: 'text/css',\n\t\tjs: 'application/javascript',\n\t\tts: 'application/javascript',\n\t\tjson: 'application/json',\n\t\tpng: 'image/png',\n\t\tjpg: 'image/jpeg',\n\t\tjpeg: 'image/jpeg',\n\t\tgif: 'image/gif',\n\t\tsvg: 'image/svg+xml',\n\t\tico: 'image/x-icon',\n\t\twoff: 'font/woff',\n\t\twoff2: 'font/woff2',\n\t\tttf: 'font/ttf',\n\t};\n\treturn mimeTypes[ext || ''] || 'application/octet-stream';\n}\n\nexport function isCompressible(contentType: string): boolean {\n\tif (!contentType) return false;\n\tconst ct = contentType.split(';')[0].trim();\n\treturn (\n\t\tct.startsWith('text/') ||\n\t\tct === 'application/javascript' ||\n\t\tct === 'application/json' ||\n\t\tct === 'application/xml' ||\n\t\tct === 'image/svg+xml' ||\n\t\t// Compress TTF and WOFF fonts (50-60% reduction for TTF)\n\t\t// WOFF2 is already highly compressed, so skip it to avoid overhead\n\t\tct === 'font/ttf' ||\n\t\tct === 'font/woff'\n\t);\n}\n",
|
|
14
|
+
"import { brotliCompressSync } from 'node:zlib';\nimport { isCompressible } from './mime';\nimport type { CompressionResult } from './types';\n\nexport function acceptsGzip(acceptEncoding?: string): boolean {\n\treturn Boolean(acceptEncoding && /gzip/i.test(acceptEncoding));\n}\n\nexport function acceptsBrotli(acceptEncoding?: string): boolean {\n\treturn Boolean(acceptEncoding && /\\bbr\\b/i.test(acceptEncoding));\n}\n\nexport function toBytes(\n\tinput: string | Uint8Array,\n): Uint8Array<ArrayBuffer> | string {\n\treturn typeof input === 'string'\n\t\t? new TextEncoder().encode(input)\n\t\t: (input as Uint8Array<ArrayBuffer>);\n}\n\nexport function gzipIfAccepted(\n\tbody: string | Uint8Array,\n\tcontentType: string,\n\tacceptEncoding?: string,\n): CompressionResult {\n\tconst extraHeaders: Record<string, string> = {};\n\tif (isCompressible(contentType)) {\n\t\t// Prefer Brotli if supported by the client\n\t\tif (acceptsBrotli(acceptEncoding)) {\n\t\t\ttry {\n\t\t\t\t// Bun doesn't have native brotli sync API, use Node.js zlib\n\t\t\t\tconst compressed = brotliCompressSync(toBytes(body) as Uint8Array);\n\t\t\t\textraHeaders['Content-Encoding'] = 'br';\n\t\t\t\textraHeaders.Vary = 'Accept-Encoding';\n\t\t\t\treturn { body: compressed, extraHeaders };\n\t\t\t} catch {\n\t\t\t\t// ignore and fallthrough to gzip\n\t\t\t}\n\t\t}\n\t\t// Fallback to gzip\n\t\tif (acceptsGzip(acceptEncoding)) {\n\t\t\ttry {\n\t\t\t\tconst compressed = Bun.gzipSync(toBytes(body));\n\t\t\t\textraHeaders['Content-Encoding'] = 'gzip';\n\t\t\t\textraHeaders.Vary = 'Accept-Encoding';\n\t\t\t\treturn { body: compressed, extraHeaders };\n\t\t\t} catch {\n\t\t\t\t// ignore and fallthrough\n\t\t\t}\n\t\t}\n\t}\n\treturn { body, extraHeaders };\n}\n\nfunction compressStreamIfAccepted(\n\tstream: ReadableStream<Uint8Array>,\n\tcontentType: string,\n\t_acceptEncoding?: string,\n): StreamCompressionResult {\n\tconst extraHeaders: Record<string, string> = {};\n\n\tif (!isCompressible(contentType)) {\n\t\treturn { stream, extraHeaders };\n\t}\n\n\t// Streaming compression not supported in Bun yet\n\t// CompressionStream API is not available, and per-chunk gzipping breaks the format\n\t// Return uncompressed stream for now\n\treturn { stream, extraHeaders };\n}\n\ntype StreamCompressionResult = {\n\tstream: ReadableStream<Uint8Array>;\n\textraHeaders: Record<string, string>;\n};\n\nexport { compressStreamIfAccepted };\nexport type { StreamCompressionResult };\n",
|
|
15
|
+
"import { pathToFileURL } from 'node:url';\nimport { ssrCache } from './cache';\nimport { join } from './path';\n\n// biome-ignore lint/suspicious/noExplicitAny: flexible types\ntype Doc = any;\n\ntype ComputeResult = {\n\tdata: Record<string, unknown>;\n\terror?: string;\n\tpending?: Promise<void>;\n};\n\ntype ComputeOptions = {\n\tstreaming?: boolean;\n\tmaxAge?: number;\n};\n\n/**\n * Check if a value is a thenable (Promise-like)\n */\nconst isThenable = (value: unknown): value is Promise<unknown> => {\n\treturn (\n\t\ttypeof value === 'object' &&\n\t\tvalue !== null &&\n\t\ttypeof (value as { then?: unknown }).then === 'function'\n\t);\n};\n\n/**\n * Compute SSR data by executing ssr.data() from layouts (hierarchical) and route/content modules\n */\nexport async function computeSSRData(\n\tpathname: string,\n\tclientDir: string,\n\tcwd: string,\n\tisWatchMode: boolean,\n\toptions: ComputeOptions = {},\n): Promise<ComputeResult> {\n\tconst ssrData: Record<string, unknown> = {};\n\tlet error: string | undefined;\n\tconst pendingTasks: Promise<unknown>[] = [];\n\tconst streaming = options.streaming === true;\n\tconst maxAge = options.maxAge || 0; // maxAge in seconds from config\n\tconst maxAgeMs = maxAge * 1000; // Convert to milliseconds for cache\n\n\tconst toPromise = <T>(input: T | Promise<T>): Promise<T> =>\n\t\tinput instanceof Promise ? input : Promise.resolve(input);\n\n\tconst storeResult = (key: string, task: Promise<unknown>) => {\n\t\tpendingTasks.push(\n\t\t\ttask\n\t\t\t\t.then((value) => {\n\t\t\t\t\tssrData[key] = value as unknown;\n\t\t\t\t})\n\t\t\t\t.catch(() => {}),\n\t\t);\n\t};\n\n\ttry {\n\t\tconst routesPath = join(cwd, '.reroute', 'routes.ts');\n\t\tconst m = await import(\n\t\t\tpathToFileURL(routesPath).href + (isWatchMode ? `?t=${Date.now()}` : '')\n\t\t);\n\n\t\t// 1. Compute layout data hierarchically (root → nested)\n\t\ttry {\n\t\t\tconst layouts = (m as Doc)?.layouts as Doc[] | undefined;\n\n\t\t\tif (Array.isArray(layouts)) {\n\t\t\t\t// Filter layouts matching the pathname\n\t\t\t\tconst matchingLayouts = layouts\n\t\t\t\t\t.filter((layout: Doc) => {\n\t\t\t\t\t\tconst pattern = String(layout?.pattern || '/');\n\t\t\t\t\t\tif (pattern === '/') return true;\n\t\t\t\t\t\treturn pathname.startsWith(pattern);\n\t\t\t\t\t})\n\t\t\t\t\t.sort((a: Doc, b: Doc) => {\n\t\t\t\t\t\t// Sort by depth (shallow first, so root layout comes before nested)\n\t\t\t\t\t\tconst aDepth = String(a?.pattern || '/')\n\t\t\t\t\t\t\t.split('/')\n\t\t\t\t\t\t\t.filter(Boolean).length;\n\t\t\t\t\t\tconst bDepth = String(b?.pattern || '/')\n\t\t\t\t\t\t\t.split('/')\n\t\t\t\t\t\t\t.filter(Boolean).length;\n\t\t\t\t\t\treturn aDepth - bDepth;\n\t\t\t\t\t});\n\n\t\t\t\t// Execute ssr.data for each matching layout in hierarchical order\n\t\t\t\tfor (const layout of matchingLayouts) {\n\t\t\t\t\tif (typeof layout?.path === 'string') {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst abs = join(clientDir, 'routes', String(layout.path));\n\t\t\t\t\t\t\tconst mod = (await import(\n\t\t\t\t\t\t\t\tpathToFileURL(abs).href +\n\t\t\t\t\t\t\t\t\t(isWatchMode ? `?t=${Date.now()}` : '')\n\t\t\t\t\t\t\t)) as Doc;\n\t\t\t\t\t\t\tconst ssr = (mod as Doc)?.ssr as Doc | undefined;\n\t\t\t\t\t\t\tconst dataFn = (ssr as Doc)?.data as\n\t\t\t\t\t\t\t\t| ((ctx: Doc) => unknown | Promise<unknown>)\n\t\t\t\t\t\t\t\t| undefined;\n\t\t\t\t\t\t\tif (typeof dataFn === 'function') {\n\t\t\t\t\t\t\t\tconst pattern = String(layout.pattern || '/');\n\t\t\t\t\t\t\t\tconst layoutKey = `__layout:${pattern}`;\n\t\t\t\t\t\t\t\tconst cacheKey = `layout:${pattern}:${pathname}`;\n\n\t\t\t\t\t\t\t\t// Check cache first (if maxAge > 0)\n\t\t\t\t\t\t\t\tconst cached =\n\t\t\t\t\t\t\t\t\tmaxAgeMs > 0 ? ssrCache.get(cacheKey) : undefined;\n\n\t\t\t\t\t\t\t\tif (cached !== undefined) {\n\t\t\t\t\t\t\t\t\t// Cache hit! Use cached data\n\t\t\t\t\t\t\t\t\tif (streaming) {\n\t\t\t\t\t\t\t\t\t\tssrData[layoutKey] = cached;\n\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\tssrData[layoutKey] = cached;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t// Cache miss - execute data function\n\t\t\t\t\t\t\t\t\tconst task = toPromise(\n\t\t\t\t\t\t\t\t\t\tdataFn({ pathname, params: {} } as Doc),\n\t\t\t\t\t\t\t\t\t).catch((err) => {\n\t\t\t\t\t\t\t\t\t\tconst msg =\n\t\t\t\t\t\t\t\t\t\t\terr instanceof Error ? err.message : String(err);\n\t\t\t\t\t\t\t\t\t\tconsole.error(\n\t\t\t\t\t\t\t\t\t\t\t`[reroute] Layout SSR data() failed for ${layout.pattern}:`,\n\t\t\t\t\t\t\t\t\t\t\tmsg,\n\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\tthrow err;\n\t\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\t\tif (streaming) {\n\t\t\t\t\t\t\t\t\t\tssrData[layoutKey] = task as unknown;\n\t\t\t\t\t\t\t\t\t\t// Cache only the resolved value, not the promise\n\t\t\t\t\t\t\t\t\t\tstoreResult(\n\t\t\t\t\t\t\t\t\t\t\tlayoutKey,\n\t\t\t\t\t\t\t\t\t\t\ttask.then((value) => {\n\t\t\t\t\t\t\t\t\t\t\t\tif (maxAgeMs > 0) {\n\t\t\t\t\t\t\t\t\t\t\t\t\tssrCache.set(cacheKey, value, maxAgeMs);\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\treturn value;\n\t\t\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\tconst result = await task;\n\t\t\t\t\t\t\t\t\t\tssrData[layoutKey] = result;\n\t\t\t\t\t\t\t\t\t\t// Cache the resolved value\n\t\t\t\t\t\t\t\t\t\tif (maxAgeMs > 0) {\n\t\t\t\t\t\t\t\t\t\t\tssrCache.set(cacheKey, result, maxAgeMs);\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} catch {}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} catch {}\n\n\t\t// 2. Content page ssr.data\n\t\ttry {\n\t\t\tconst parts = pathname.split('/').filter(Boolean);\n\t\t\tif (parts.length >= 2) {\n\t\t\t\tconst g = globalThis as Doc;\n\t\t\t\tconst key = `${parts[0]}:${parts[1]}`;\n\t\t\t\tconst exp = g.__REROUTE_SSR_EXPORTS__?.[key] as\n\t\t\t\t\t| { ssr?: { data?: (ctx: Doc) => unknown | Promise<unknown> } }\n\t\t\t\t\t| undefined;\n\t\t\t\tconst dataFn = (exp as Doc)?.ssr?.data as\n\t\t\t\t\t| ((ctx: Doc) => unknown | Promise<unknown>)\n\t\t\t\t\t| undefined;\n\t\t\t\tif (typeof dataFn === 'function') {\n\t\t\t\t\tconst cacheKey = `content:${pathname}:${parts[1]}`;\n\n\t\t\t\t\t// Check cache first (if maxAge > 0)\n\t\t\t\t\tconst cached = maxAgeMs > 0 ? ssrCache.get(cacheKey) : undefined;\n\n\t\t\t\t\tif (cached !== undefined) {\n\t\t\t\t\t\t// Cache hit! Use cached data\n\t\t\t\t\t\tssrData[pathname] = cached;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Cache miss - execute data function\n\t\t\t\t\t\tconst task = toPromise(\n\t\t\t\t\t\t\tdataFn({\n\t\t\t\t\t\t\t\tpathname,\n\t\t\t\t\t\t\t\tparams: { name: parts[1] },\n\t\t\t\t\t\t\t} as Doc),\n\t\t\t\t\t\t).catch((err) => {\n\t\t\t\t\t\t\tconst msg = err instanceof Error ? err.message : String(err);\n\t\t\t\t\t\t\terror = `SSR data() failed: ${msg}`;\n\t\t\t\t\t\t\tconsole.error(`[reroute] ${error}`);\n\t\t\t\t\t\t\tthrow err;\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tif (streaming) {\n\t\t\t\t\t\t\tssrData[pathname] = task as unknown;\n\t\t\t\t\t\t\t// Cache only the resolved value, not the promise\n\t\t\t\t\t\t\tstoreResult(\n\t\t\t\t\t\t\t\tpathname,\n\t\t\t\t\t\t\t\ttask.then((value) => {\n\t\t\t\t\t\t\t\t\tif (maxAgeMs > 0) {\n\t\t\t\t\t\t\t\t\t\tssrCache.set(cacheKey, value, maxAgeMs);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\treturn value;\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconst result = await task;\n\t\t\t\t\t\t\tssrData[pathname] = result;\n\t\t\t\t\t\t\t// Cache the resolved value\n\t\t\t\t\t\t\tif (maxAgeMs > 0) {\n\t\t\t\t\t\t\t\tssrCache.set(cacheKey, result, maxAgeMs);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} catch {}\n\n\t\t// 3. Route-level ssr.data\n\t\ttry {\n\t\t\tconst match =\n\t\t\t\ttypeof m.matchRoute === 'function' ? m.matchRoute(pathname) : null;\n\t\t\tconst r = match?.route as Doc | undefined;\n\t\t\tconst params = (match?.params || {}) as Record<string, string>;\n\n\t\t\tif (r && typeof r.path === 'string') {\n\t\t\t\ttry {\n\t\t\t\t\tconst abs = join(clientDir, 'routes', String(r.path));\n\t\t\t\t\tconst mod = (await import(\n\t\t\t\t\t\tpathToFileURL(abs).href + (isWatchMode ? `?t=${Date.now()}` : '')\n\t\t\t\t\t)) as Doc;\n\t\t\t\t\tconst ssr = (mod as Doc)?.ssr as Doc | undefined;\n\t\t\t\t\tconst dataFn = (ssr as Doc)?.data as\n\t\t\t\t\t\t| ((ctx: Doc) => unknown | Promise<unknown>)\n\t\t\t\t\t\t| undefined;\n\t\t\t\t\tif (typeof dataFn === 'function') {\n\t\t\t\t\t\tconst cacheKey = `route:${pathname}:${JSON.stringify(params)}`;\n\n\t\t\t\t\t\t// Check cache first (if maxAge > 0)\n\t\t\t\t\t\tconst cached = maxAgeMs > 0 ? ssrCache.get(cacheKey) : undefined;\n\n\t\t\t\t\t\tif (cached !== undefined) {\n\t\t\t\t\t\t\t// Cache hit! Use cached data\n\t\t\t\t\t\t\t// If the cached result is an object with multiple keys, flatten it\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\tstreaming &&\n\t\t\t\t\t\t\t\ttypeof cached === 'object' &&\n\t\t\t\t\t\t\t\tcached !== null &&\n\t\t\t\t\t\t\t\t!Array.isArray(cached)\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t// Flatten object keys into top-level SSR data for progressive streaming\n\t\t\t\t\t\t\t\tfor (const [key, value] of Object.entries(cached)) {\n\t\t\t\t\t\t\t\t\tssrData[key] = value;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tssrData[pathname] = cached;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Cache miss - execute data function\n\t\t\t\t\t\t\tconst rawResult = dataFn({ pathname, params } as Doc);\n\n\t\t\t\t\t\t\tif (streaming) {\n\t\t\t\t\t\t\t\t// In streaming mode, check if the result is an object with promises immediately\n\t\t\t\t\t\t\t\t// This allows progressive streaming of individual promises\n\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\ttypeof rawResult === 'object' &&\n\t\t\t\t\t\t\t\t\trawResult !== null &&\n\t\t\t\t\t\t\t\t\t!Array.isArray(rawResult) &&\n\t\t\t\t\t\t\t\t\t!(rawResult instanceof Promise)\n\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\t// Check if this is an object with promise values\n\t\t\t\t\t\t\t\t\tconst entries = Object.entries(\n\t\t\t\t\t\t\t\t\t\trawResult as Record<string, unknown>,\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\tconst hasMultipleKeys = entries.length > 1;\n\t\t\t\t\t\t\t\t\tconst hasPromises = entries.some(([_, v]) => isThenable(v));\n\n\t\t\t\t\t\t\t\t\tif (hasMultipleKeys || hasPromises) {\n\t\t\t\t\t\t\t\t\t\t// Flatten: each key becomes a top-level SSR data key\n\t\t\t\t\t\t\t\t\t\t// This allows each promise to resolve and stream independently\n\n\t\t\t\t\t\t\t\t\t\t// Build a promise that resolves when all data is ready (for caching)\n\t\t\t\t\t\t\t\t\t\tconst promisesToResolve: Promise<[string, unknown]>[] = [];\n\n\t\t\t\t\t\t\t\t\t\tfor (const [key, val] of entries) {\n\t\t\t\t\t\t\t\t\t\t\tif (isThenable(val)) {\n\t\t\t\t\t\t\t\t\t\t\t\t// Handle promise values\n\t\t\t\t\t\t\t\t\t\t\t\tconst wrappedPromise = (val as Promise<unknown>)\n\t\t\t\t\t\t\t\t\t\t\t\t\t.then((resolved) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn resolved;\n\t\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\t\t.catch((err) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tconst msg =\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\terr instanceof Error ? err.message : String(err);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\terror = `SSR data() failed for key ${key}: ${msg}`;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tconsole.error(`[reroute] ${error}`);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tthrow err;\n\t\t\t\t\t\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\t\t\t\t\tssrData[key] = wrappedPromise;\n\t\t\t\t\t\t\t\t\t\t\t\tstoreResult(key, wrappedPromise);\n\n\t\t\t\t\t\t\t\t\t\t\t\t// Track for caching\n\t\t\t\t\t\t\t\t\t\t\t\tpromisesToResolve.push(\n\t\t\t\t\t\t\t\t\t\t\t\t\twrappedPromise.then(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t(resolved) => [key, resolved] as [string, unknown],\n\t\t\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\t\t\t// Handle synchronous values\n\t\t\t\t\t\t\t\t\t\t\t\tssrData[key] = val;\n\t\t\t\t\t\t\t\t\t\t\t\tpromisesToResolve.push(\n\t\t\t\t\t\t\t\t\t\t\t\t\tPromise.resolve([key, val] as [string, unknown]),\n\t\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t// Cache the result when all promises resolve\n\t\t\t\t\t\t\t\t\t\tif (maxAgeMs > 0) {\n\t\t\t\t\t\t\t\t\t\t\tPromise.all(promisesToResolve)\n\t\t\t\t\t\t\t\t\t\t\t\t.then((resolvedEntries) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\tconst resolvedResult: Record<string, unknown> = {};\n\t\t\t\t\t\t\t\t\t\t\t\t\tfor (const [key, value] of resolvedEntries) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tresolvedResult[key] = value;\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\tssrCache.set(cacheKey, resolvedResult, maxAgeMs);\n\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\t.catch(() => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t// If any promise fails, don't cache\n\t\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t// Skip to next - we've already handled this case\n\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\t// Object but not suitable for flattening - handle as single promise\n\t\t\t\t\t\t\t\t\t\tconst task = toPromise(rawResult).catch((err) => {\n\t\t\t\t\t\t\t\t\t\t\tconst msg =\n\t\t\t\t\t\t\t\t\t\t\t\terr instanceof Error ? err.message : String(err);\n\t\t\t\t\t\t\t\t\t\t\terror = `SSR data() failed: ${msg}`;\n\t\t\t\t\t\t\t\t\t\t\tconsole.error(`[reroute] ${error}`);\n\t\t\t\t\t\t\t\t\t\t\tthrow err;\n\t\t\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\t\t\tssrData[pathname] = task as unknown;\n\t\t\t\t\t\t\t\t\t\tstoreResult(\n\t\t\t\t\t\t\t\t\t\t\tpathname,\n\t\t\t\t\t\t\t\t\t\t\ttask.then((value) => {\n\t\t\t\t\t\t\t\t\t\t\t\tif (maxAgeMs > 0) {\n\t\t\t\t\t\t\t\t\t\t\t\t\tssrCache.set(cacheKey, value, maxAgeMs);\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\treturn value;\n\t\t\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t// Single value, promise, or array - handle normally\n\t\t\t\t\t\t\t\t\tconst task = toPromise(rawResult).catch((err) => {\n\t\t\t\t\t\t\t\t\t\tconst msg =\n\t\t\t\t\t\t\t\t\t\t\terr instanceof Error ? err.message : String(err);\n\t\t\t\t\t\t\t\t\t\terror = `SSR data() failed: ${msg}`;\n\t\t\t\t\t\t\t\t\t\tconsole.error(`[reroute] ${error}`);\n\t\t\t\t\t\t\t\t\t\tthrow err;\n\t\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\t\tssrData[pathname] = task as unknown;\n\t\t\t\t\t\t\t\t\tstoreResult(\n\t\t\t\t\t\t\t\t\t\tpathname,\n\t\t\t\t\t\t\t\t\t\ttask.then((value) => {\n\t\t\t\t\t\t\t\t\t\t\tif (maxAgeMs > 0) {\n\t\t\t\t\t\t\t\t\t\t\t\tssrCache.set(cacheKey, value, maxAgeMs);\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\treturn value;\n\t\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t// Non-streaming mode - await the result\n\t\t\t\t\t\t\t\tconst task = toPromise(rawResult).catch((err) => {\n\t\t\t\t\t\t\t\t\tconst msg = err instanceof Error ? err.message : String(err);\n\t\t\t\t\t\t\t\t\terror = `SSR data() failed: ${msg}`;\n\t\t\t\t\t\t\t\t\tconsole.error(`[reroute] ${error}`);\n\t\t\t\t\t\t\t\t\tthrow err;\n\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\tconst result = await task;\n\t\t\t\t\t\t\t\tssrData[pathname] = result;\n\t\t\t\t\t\t\t\t// Cache the resolved value\n\t\t\t\t\t\t\t\tif (maxAgeMs > 0) {\n\t\t\t\t\t\t\t\t\tssrCache.set(cacheKey, result, maxAgeMs);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} catch {}\n\t\t\t}\n\t\t} catch {}\n\t} catch {}\n\n\tconst layoutKeys = Object.keys(ssrData).filter((key) =>\n\t\tkey.startsWith('__layout:'),\n\t);\n\n\tif (streaming) {\n\t\t// In streaming mode, keep layout and route data separate so they can resolve independently\n\t\t// Layout data stays at __layout:${pattern} keys\n\t\t// Route data stays at pathname key\n\t\t// Each resolves as soon as its own data is ready (not waiting for the other)\n\t\t// Don't combine them - this allows progressive streaming!\n\t\t// Components can access layout data via __layout: keys if needed\n\t} else {\n\t\t// Merge layout data into the route data for the current pathname\n\t\t// So users can just call useData() without knowing about layout keys\n\t\tconst layoutData: Record<string, unknown> = {};\n\t\tfor (const key of layoutKeys) {\n\t\t\tObject.assign(layoutData, ssrData[key] as Record<string, unknown>);\n\t\t}\n\n\t\t// If we have route data for this pathname, merge layout data into it\n\t\tif (pathname in ssrData) {\n\t\t\tssrData[pathname] = {\n\t\t\t\t...layoutData,\n\t\t\t\t...(typeof ssrData[pathname] === 'object' && ssrData[pathname] !== null\n\t\t\t\t\t? (ssrData[pathname] as Record<string, unknown>)\n\t\t\t\t\t: {}),\n\t\t\t};\n\t\t} else if (Object.keys(layoutData).length > 0) {\n\t\t\t// If no route data but we have layout data, use layout data\n\t\t\tssrData[pathname] = layoutData;\n\t\t}\n\t}\n\n\tconst pending =\n\t\tstreaming && pendingTasks.length\n\t\t\t? Promise.allSettled(pendingTasks).then(() => undefined)\n\t\t\t: undefined;\n\n\treturn { data: ssrData, error, pending };\n}\n\n/**\n * Set global SSR data\n */\nexport function setGlobalSSRData(data: Record<string, unknown>): void {\n\ttry {\n\t\t(globalThis as Doc).__REROUTE_DATA__ = data as Doc;\n\t} catch {}\n}\n\nexport type { ComputeResult };\n",
|
|
16
|
+
"import { readdir, stat } from 'node:fs/promises';\nimport { pathToFileURL } from 'node:url';\nimport { join } from './path';\nimport type { Doc } from './types';\n\n/**\n * Import a content module for a given pathname like \"/collection/name\".\n * Prefer the latest built chunk in .reroute to align with the client preload,\n * then fall back to source TS/TSX if no chunk exists.\n */\nexport async function importContentModuleForPath(\n\tpathname: string,\n\tclientDir: string,\n\tcwd: string,\n\tisWatchMode: boolean,\n): Promise<Doc | null> {\n\ttry {\n\t\tconst parts = pathname.split('/').filter(Boolean);\n\t\tif (parts.length < 2) return null;\n\t\tconst collection = parts[0];\n\t\tconst name = parts[1];\n\n\t\t// 1) Prefer registry mapping from .reroute/content.ts to get exact chunk path\n\t\ttry {\n\t\t\tconst registryPath = join(cwd, '.reroute', 'content.ts');\n\t\t\tconst reg = (await import(\n\t\t\t\tpathToFileURL(registryPath).href +\n\t\t\t\t\t(isWatchMode ? `?t=${Date.now()}` : '')\n\t\t\t)) as Doc;\n\t\t\tconst get = (reg as Doc)?.getContentEntry as\n\t\t\t\t| ((c: string, n: string) => { module?: string } | undefined)\n\t\t\t\t| undefined;\n\t\t\tconst entry =\n\t\t\t\ttypeof get === 'function' ? get(collection, name) : undefined;\n\t\t\tconst moduleUrl = (entry as Doc)?.module as string | undefined;\n\t\t\tif (moduleUrl?.endsWith('.js')) {\n\t\t\t\tconst raw = moduleUrl.split('?')[0] || '';\n\t\t\t\tconst normalized = raw.replace(/^\\/+/, '');\n\t\t\t\tconst candidates: string[] = [];\n\t\t\t\tif (normalized) {\n\t\t\t\t\tcandidates.push(join(cwd, normalized));\n\t\t\t\t\tif (!normalized.startsWith('.reroute/')) {\n\t\t\t\t\t\tcandidates.push(join(cwd, '.reroute', normalized));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tfor (const abs of candidates) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tif (!(await Bun.file(abs).exists())) continue;\n\t\t\t\t\t\tconst href =\n\t\t\t\t\t\t\tpathToFileURL(abs).href + (isWatchMode ? `?t=${Date.now()}` : '');\n\t\t\t\t\t\tconst mod = await import(href);\n\t\t\t\t\t\treturn mod as Doc;\n\t\t\t\t\t} catch {}\n\t\t\t\t}\n\t\t\t}\n\t\t} catch {}\n\n\t\t// 2) Try latest prebuilt chunk from .reroute (fallback)\n\t\ttry {\n\t\t\tconst chunkDir = join(cwd, '.reroute', 'chunks', collection);\n\t\t\tconst files = await readdir(chunkDir);\n\t\t\tconst matches = files.filter(\n\t\t\t\t(n) => n.startsWith(`${name}.`) && n.endsWith('.js'),\n\t\t\t);\n\t\t\tif (matches.length) {\n\t\t\t\tlet latest = matches[0];\n\t\t\t\tlet latestM = 0;\n\t\t\t\tfor (const f of matches) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst s = await stat(join(chunkDir, f));\n\t\t\t\t\t\tif (s.mtimeMs >= latestM) {\n\t\t\t\t\t\t\tlatestM = s.mtimeMs;\n\t\t\t\t\t\t\tlatest = f;\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch {}\n\t\t\t\t}\n\t\t\t\tconst absChunk = join(chunkDir, latest);\n\t\t\t\tconst href =\n\t\t\t\t\tpathToFileURL(absChunk).href +\n\t\t\t\t\t(isWatchMode ? `?t=${Date.now()}` : '');\n\t\t\t\tconst mod = await import(href);\n\t\t\t\treturn mod as Doc;\n\t\t\t}\n\t\t} catch {}\n\n\t\t// 3) Fallback to source (TSX/TS)\n\t\ttry {\n\t\t\tconst srcTsx = join(\n\t\t\t\tclientDir,\n\t\t\t\t'routes',\n\t\t\t\tcollection,\n\t\t\t\t'content',\n\t\t\t\t`${name}.tsx`,\n\t\t\t);\n\t\t\tconst srcTs = join(\n\t\t\t\tclientDir,\n\t\t\t\t'routes',\n\t\t\t\tcollection,\n\t\t\t\t'content',\n\t\t\t\t`${name}.ts`,\n\t\t\t);\n\t\t\tlet absSrc: string | null = null;\n\t\t\tif (await Bun.file(srcTsx).exists()) absSrc = srcTsx;\n\t\t\telse if (await Bun.file(srcTs).exists()) absSrc = srcTs;\n\t\t\tif (absSrc) {\n\t\t\t\tconst href = pathToFileURL(absSrc).href;\n\t\t\t\tconst mod = await import(\n\t\t\t\t\tisWatchMode ? `${href}?t=${Date.now()}` : href\n\t\t\t\t);\n\t\t\t\treturn mod as Doc;\n\t\t\t}\n\t\t} catch {}\n\t} catch {}\n\treturn null;\n}\n",
|
|
17
|
+
"import { importContentModuleForPath } from './modules';\nimport type { Doc } from './types';\n\nexport async function seedSSRModuleForPath(\n\tpathname: string,\n\tclientDir: string,\n\tcwd: string,\n\tisWatchMode: boolean,\n): Promise<void> {\n\ttry {\n\t\tconst parts = pathname.split('/').filter(Boolean);\n\t\tif (parts.length < 2) return;\n\t\tconst collection = parts[0];\n\t\tconst name = parts[1];\n\t\tconst key = `${collection}:${name}`;\n\n\t\tconst mod = await importContentModuleForPath(\n\t\t\tpathname,\n\t\t\tclientDir,\n\t\t\tcwd,\n\t\t\tisWatchMode,\n\t\t);\n\n\t\tif (!mod) return;\n\n\t\tconst C = (mod as Doc).default || (mod as Doc);\n\t\t(globalThis as Doc).__REROUTE_SSR_MODULES__ =\n\t\t\t(globalThis as Doc).__REROUTE_SSR_MODULES__ || {};\n\t\t(globalThis as Doc).__REROUTE_SSR_MODULES__[key] = C;\n\n\t\t// Also capture exported meta/frontmatter and optional ssr config for head injection\n\t\ttry {\n\t\t\tconst pageMeta = (mod as Doc).meta || (mod as Doc).frontmatter || {};\n\t\t\tconst pageSSR = (mod as Doc).ssr || {};\n\t\t\t(globalThis as Doc).__REROUTE_SSR_EXPORTS__ =\n\t\t\t\t(globalThis as Doc).__REROUTE_SSR_EXPORTS__ || {};\n\t\t\t(globalThis as Doc).__REROUTE_SSR_EXPORTS__[key] = {\n\t\t\t\tmeta: pageMeta,\n\t\t\t\tssr: pageSSR,\n\t\t\t};\n\t\t} catch {}\n\t} catch {}\n}\n",
|
|
18
|
+
"import { pathToFileURL } from 'node:url';\nimport { join } from './path';\nimport { seedSSRModuleForPath } from './seed';\nimport type { Doc } from './types';\n\ntype ComputeParams = {\n\tpathname: string;\n\tclientDir: string;\n\tcwd: string;\n\tisWatchMode: boolean;\n};\n\nexport async function computeSSRDataForPath(\n\tparams: ComputeParams,\n): Promise<unknown> {\n\tconst { pathname, clientDir, cwd, isWatchMode } = params;\n\tconst allData: Record<string, unknown> = {};\n\n\t// Seed content modules for potential content pages\n\ttry {\n\t\tawait seedSSRModuleForPath(pathname, clientDir, cwd, isWatchMode);\n\t} catch {}\n\n\t// 1) Compute layout data (for routes with layouts)\n\ttry {\n\t\tconst routesPath = join(cwd, '.reroute', 'routes.ts');\n\t\tconst m = await import(\n\t\t\tpathToFileURL(routesPath).href + (isWatchMode ? `?t=${Date.now()}` : '')\n\t\t);\n\t\tconst layouts = (m as Doc)?.layouts as Doc[] | undefined;\n\n\t\tif (Array.isArray(layouts)) {\n\t\t\t// Filter layouts matching the pathname\n\t\t\tconst matchingLayouts = layouts\n\t\t\t\t.filter((layout: Doc) => {\n\t\t\t\t\tconst pattern = String(layout?.pattern || '/');\n\t\t\t\t\tif (pattern === '/') return true;\n\t\t\t\t\treturn pathname.startsWith(pattern);\n\t\t\t\t})\n\t\t\t\t.sort((a: Doc, b: Doc) => {\n\t\t\t\t\t// Sort by depth (shallow first, so root layout comes before nested)\n\t\t\t\t\tconst aDepth = String(a?.pattern || '/')\n\t\t\t\t\t\t.split('/')\n\t\t\t\t\t\t.filter(Boolean).length;\n\t\t\t\t\tconst bDepth = String(b?.pattern || '/')\n\t\t\t\t\t\t.split('/')\n\t\t\t\t\t\t.filter(Boolean).length;\n\t\t\t\t\treturn aDepth - bDepth;\n\t\t\t\t});\n\n\t\t\t// Execute ssr.data for each matching layout\n\t\t\tfor (const layout of matchingLayouts) {\n\t\t\t\tif (typeof layout?.path === 'string') {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst abs = join(clientDir, 'routes', String(layout.path));\n\t\t\t\t\t\tconst mod = (await import(\n\t\t\t\t\t\t\tpathToFileURL(abs).href + (isWatchMode ? `?t=${Date.now()}` : '')\n\t\t\t\t\t\t)) as Doc;\n\t\t\t\t\t\tconst ssr = (mod as Doc)?.ssr as Doc | undefined;\n\t\t\t\t\t\tconst dataFn = (ssr as Doc)?.data as\n\t\t\t\t\t\t\t| ((ctx: Doc) => unknown | Promise<unknown>)\n\t\t\t\t\t\t\t| undefined;\n\t\t\t\t\t\tif (typeof dataFn === 'function') {\n\t\t\t\t\t\t\tconst pattern = String(layout.pattern || '/');\n\t\t\t\t\t\t\tconst layoutKey = `__layout:${pattern}`;\n\t\t\t\t\t\t\t// Don't await - check if it's a promise first\n\t\t\t\t\t\t\tconst rawResult = dataFn({ pathname, params: {} } as Doc);\n\n\t\t\t\t\t\t\t// Check if the result is a promise\n\t\t\t\t\t\t\tif (rawResult instanceof Promise) {\n\t\t\t\t\t\t\t\t// Single promise - create lazy marker\n\t\t\t\t\t\t\t\tallData[layoutKey] = {\n\t\t\t\t\t\t\t\t\t__lazy__: true,\n\t\t\t\t\t\t\t\t\t__fetch__: `/__reroute_data?path=${encodeURIComponent(pathname)}&key=${encodeURIComponent(layoutKey)}`,\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t} else if (\n\t\t\t\t\t\t\t\ttypeof rawResult === 'object' &&\n\t\t\t\t\t\t\t\trawResult !== null &&\n\t\t\t\t\t\t\t\t!Array.isArray(rawResult)\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t// Object - check for promises inside\n\t\t\t\t\t\t\t\tconst entries = Object.entries(\n\t\t\t\t\t\t\t\t\trawResult as Record<string, unknown>,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\tconst hasPromises = entries.some(\n\t\t\t\t\t\t\t\t\t([_, v]) => v instanceof Promise,\n\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t\tif (hasPromises) {\n\t\t\t\t\t\t\t\t\t// Object with promises - create lazy markers\n\t\t\t\t\t\t\t\t\tconst flattened: Record<string, unknown> = {\n\t\t\t\t\t\t\t\t\t\t__flatten__: true,\n\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t\tfor (const [key, value] of entries) {\n\t\t\t\t\t\t\t\t\t\tif (value instanceof Promise) {\n\t\t\t\t\t\t\t\t\t\t\tflattened[key] = {\n\t\t\t\t\t\t\t\t\t\t\t\t__lazy__: true,\n\t\t\t\t\t\t\t\t\t\t\t\t__fetch__: `/__reroute_data?path=${encodeURIComponent(pathname)}&key=${encodeURIComponent(key)}`,\n\t\t\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\t\tflattened[key] = value;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tallData[layoutKey] = flattened;\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tallData[layoutKey] = rawResult;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t// Synchronous non-object result\n\t\t\t\t\t\t\t\tallData[layoutKey] = rawResult;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch {}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t} catch {}\n\n\t// 2) Try content-level export ssr.data if available\n\ttry {\n\t\tconst parts = pathname.split('/').filter(Boolean);\n\t\tif (parts.length >= 2) {\n\t\t\tconst key = `${parts[0]}:${parts[1]}`;\n\t\t\tconst g = globalThis as Doc;\n\t\t\tconst exp = g.__REROUTE_SSR_EXPORTS__?.[key] as\n\t\t\t\t| { ssr?: { data?: (ctx: Doc) => unknown | Promise<unknown> } }\n\t\t\t\t| undefined;\n\t\t\tconst dataFn = (exp as Doc)?.ssr?.data as\n\t\t\t\t| ((ctx: Doc) => unknown | Promise<unknown>)\n\t\t\t\t| undefined;\n\t\t\tif (typeof dataFn === 'function') {\n\t\t\t\t// Don't await - check if it's a promise first\n\t\t\t\tconst rawResult = dataFn({\n\t\t\t\t\tpathname,\n\t\t\t\t\tparams: { name: parts[1] },\n\t\t\t\t} as Doc);\n\n\t\t\t\t// Check if the result is a promise\n\t\t\t\tif (rawResult instanceof Promise) {\n\t\t\t\t\t// Single promise - create lazy marker\n\t\t\t\t\treturn {\n\t\t\t\t\t\t__lazy__: true,\n\t\t\t\t\t\t__fetch__: `/__reroute_data?path=${encodeURIComponent(pathname)}&key=${encodeURIComponent(pathname)}`,\n\t\t\t\t\t};\n\t\t\t\t} else if (\n\t\t\t\t\ttypeof rawResult === 'object' &&\n\t\t\t\t\trawResult !== null &&\n\t\t\t\t\t!Array.isArray(rawResult)\n\t\t\t\t) {\n\t\t\t\t\t// Object - check for promises inside\n\t\t\t\t\tconst entries = Object.entries(rawResult as Record<string, unknown>);\n\t\t\t\t\tconst hasPromises = entries.some(([_, v]) => v instanceof Promise);\n\n\t\t\t\t\tif (hasPromises) {\n\t\t\t\t\t\t// Object with promises - create lazy markers\n\t\t\t\t\t\tconst flattened: Record<string, unknown> = { __flatten__: true };\n\t\t\t\t\t\tfor (const [key, value] of entries) {\n\t\t\t\t\t\t\tif (value instanceof Promise) {\n\t\t\t\t\t\t\t\tflattened[key] = {\n\t\t\t\t\t\t\t\t\t__lazy__: true,\n\t\t\t\t\t\t\t\t\t__fetch__: `/__reroute_data?path=${encodeURIComponent(pathname)}&key=${encodeURIComponent(key)}`,\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tflattened[key] = value;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn flattened;\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn rawResult;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// Synchronous non-object result\n\t\t\t\t\treturn rawResult;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t} catch {}\n\n\t// 3) Route-level export ssr.data (non-content routes)\n\ttry {\n\t\tconst routesPath = join(cwd, '.reroute', 'routes.ts');\n\t\tconst m = await import(\n\t\t\tpathToFileURL(routesPath).href + (isWatchMode ? `?t=${Date.now()}` : '')\n\t\t);\n\t\tconst match =\n\t\t\ttypeof (m as Doc).matchRoute === 'function'\n\t\t\t\t? (m as Doc).matchRoute(pathname)\n\t\t\t\t: null;\n\t\tconst r = (match as Doc | null | undefined)?.route as Doc | undefined;\n\t\tconst paramsValue = ((match as Doc | null | undefined)?.params ||\n\t\t\t{}) as Record<string, string>;\n\t\tif (r && typeof (r as Doc).path === 'string') {\n\t\t\ttry {\n\t\t\t\tconst abs = join(clientDir, 'routes', String((r as Doc).path));\n\t\t\t\tconst mod = (await import(\n\t\t\t\t\tpathToFileURL(abs).href + (isWatchMode ? `?t=${Date.now()}` : '')\n\t\t\t\t)) as Doc;\n\t\t\t\tconst ssr = (mod as Doc)?.ssr as Doc | undefined;\n\t\t\t\tconst dataFn = (ssr as Doc)?.data as\n\t\t\t\t\t| ((ctx: Doc) => unknown | Promise<unknown>)\n\t\t\t\t\t| undefined;\n\t\t\t\tif (typeof dataFn === 'function') {\n\t\t\t\t\t// Call dataFn but DON'T await yet - we need to check if it's a promise\n\t\t\t\t\tconst rawResult = dataFn({\n\t\t\t\t\t\tpathname,\n\t\t\t\t\t\tparams: paramsValue,\n\t\t\t\t\t} as Doc);\n\n\t\t\t\t\t// Check if the result is a promise (without awaiting it)\n\t\t\t\t\tif (rawResult instanceof Promise) {\n\t\t\t\t\t\t// Single promise - create lazy marker\n\t\t\t\t\t\tallData[pathname] = {\n\t\t\t\t\t\t\t__lazy__: true,\n\t\t\t\t\t\t\t__fetch__: `/__reroute_data?path=${encodeURIComponent(pathname)}&key=${encodeURIComponent(pathname)}`,\n\t\t\t\t\t\t};\n\t\t\t\t\t} else if (\n\t\t\t\t\t\ttypeof rawResult === 'object' &&\n\t\t\t\t\t\trawResult !== null &&\n\t\t\t\t\t\t!Array.isArray(rawResult)\n\t\t\t\t\t) {\n\t\t\t\t\t\t// Object result - check if it contains promises\n\t\t\t\t\t\tconst obj = rawResult as Record<string, unknown>;\n\t\t\t\t\t\tconst entries = Object.entries(obj);\n\t\t\t\t\t\tconst hasPromises = entries.some(([_, v]) => v instanceof Promise);\n\n\t\t\t\t\t\tif (hasPromises) {\n\t\t\t\t\t\t\t// Object with promises - create lazy markers for each promise key\n\t\t\t\t\t\t\tconst flattened: Record<string, unknown> = { __flatten__: true };\n\t\t\t\t\t\t\tfor (const [key, value] of entries) {\n\t\t\t\t\t\t\t\tif (value instanceof Promise) {\n\t\t\t\t\t\t\t\t\tflattened[key] = {\n\t\t\t\t\t\t\t\t\t\t__lazy__: true,\n\t\t\t\t\t\t\t\t\t\t__fetch__: `/__reroute_data?path=${encodeURIComponent(pathname)}&key=${encodeURIComponent(key)}`,\n\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tflattened[key] = value;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tallData[pathname] = flattened;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Plain object with no promises\n\t\t\t\t\t\t\tallData[pathname] = rawResult;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Synchronous non-object result\n\t\t\t\t\t\tallData[pathname] = rawResult;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} catch {}\n\t\t}\n\t} catch {}\n\n\t// If we have both layout and route data, return them together\n\t// Otherwise return just the single data piece\n\tconst dataKeys = Object.keys(allData);\n\tif (dataKeys.length > 1) {\n\t\t// Multiple data sources (layout + route)\n\t\treturn {\n\t\t\t__reroute_multiple__: true,\n\t\t\t...allData,\n\t\t};\n\t} else if (dataKeys.length === 1) {\n\t\t// Single data source\n\t\treturn allData[dataKeys[0]];\n\t}\n\n\treturn null;\n}\n",
|
|
19
|
+
"import { join } from './path';\nimport type { TemplateContext } from './types';\n\nexport async function loadIndexHtml(clientDir: string): Promise<string> {\n\tconst templatePath = join(clientDir, 'index.html');\n\ttry {\n\t\tconst content = await Bun.file(templatePath).text();\n\t\treturn content;\n\t} catch (error) {\n\t\tconsole.error(\n\t\t\t`[reroute] Failed to load template from ${templatePath}:`,\n\t\t\terror,\n\t\t);\n\t\t// Minimal fallback (kept simple; will still be transformed below)\n\t\treturn `<!doctype html>\\n<html lang=\"en\">\\n <head>\\n <meta charset=\"UTF-8\" />\\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\\n <title>Reroute</title>\\n </head>\\n <body>\\n <div id=\"root\"></div>\\n </body>\\n</html>`;\n\t}\n}\n\nexport function applyIndexTemplate(\n\ttemplateHtml: string,\n\tappHtml: string,\n\t{\n\t\thead = '',\n\t\thydrationScript = '',\n\t\tlang = 'en',\n\t\tappId = 'root',\n\t}: TemplateContext,\n): string {\n\tlet html = templateHtml;\n\n\t// Ensure <html> has correct lang attribute\n\thtml = html.replace(/<html([^>]*)>/i, (_m, attrs: string) => {\n\t\tconst hasLang = /(^|\\s)lang\\s*=/.test(attrs);\n\t\tconst newAttrs = hasLang\n\t\t\t? attrs.replace(/lang\\s*=\\s*(\"[^\"]*\"|'[^']*'|[^\\s>]+)/i, `lang=\"${lang}\"`)\n\t\t\t: `${attrs} lang=\"${lang}\"`;\n\t\treturn `<html${newAttrs}>`;\n\t});\n\n\t// If incoming head contains <title> or a description meta, prefer replacing\n\t// existing ones in the template instead of duplicating.\n\tlet headToInject = head || '';\n\ttry {\n\t\tconst titleMatch = headToInject.match(/<title[\\s\\S]*?<\\/title>/i);\n\t\tif (titleMatch) {\n\t\t\tconst titleTag = titleMatch[0];\n\t\t\tif (/<title[\\s\\S]*?<\\/title>/i.test(html)) {\n\t\t\t\thtml = html.replace(/<title[\\s\\S]*?<\\/title>/i, titleTag);\n\t\t\t} else {\n\t\t\t\t// No title in template; will be injected below\n\t\t\t\t// keep titleTag in headToInject\n\t\t\t}\n\t\t\t// Remove the title from the extra head to avoid duplication when injecting\n\t\t\theadToInject = headToInject.replace(titleTag, '');\n\t\t}\n\n\t\tconst descRe = /<meta\\s+name\\s*=\\s*['\"]description['\"][^>]*>/i;\n\t\tconst descMatch = headToInject.match(descRe);\n\t\tif (descMatch) {\n\t\t\tconst descTag = descMatch[0];\n\t\t\tif (descRe.test(html)) {\n\t\t\t\thtml = html.replace(descRe, descTag);\n\t\t\t}\n\t\t\theadToInject = headToInject.replace(descTag, '');\n\t\t}\n\t} catch {}\n\n\t// Inject remaining head content before </head>\n\tif (headToInject) {\n\t\thtml = html.replace(/<\\/head>/i, `${headToInject}\\n\\t</head>`);\n\t}\n\n\t// Remove any TS/TSX script tags to avoid double-loading in SSR\n\thtml = html.replace(\n\t\t/<script\\b[^>]*src\\s*=\\s*[\"'][^\"']+\\.(ts|tsx)(?:[?#][^\"']*)?[\"'][^>]*>\\s*<\\/script>/gi,\n\t\t'',\n\t);\n\n\t// Extract React preload hints from appHtml and move them to head\n\t// React 19 outputs <link> tags at the start of SSR output\n\tlet cleanAppHtml = appHtml;\n\tconst preloadLinks: string[] = [];\n\n\t// Only extract link tags from the very beginning of the HTML (before first non-whitespace element)\n\tconst linkPrefixRegex = /^(\\s*(?:<link\\b[^>]*>\\s*)+)/;\n\tconst prefixMatch = appHtml.match(linkPrefixRegex);\n\tif (prefixMatch?.[1]) {\n\t\tconst linkMatches = prefixMatch[1].match(/<link\\b[^>]*>/g);\n\t\tif (linkMatches) {\n\t\t\tpreloadLinks.push(...linkMatches);\n\t\t\t// Remove only the prefix link tags\n\t\t\tcleanAppHtml = appHtml.slice(prefixMatch[1].length);\n\t\t}\n\t}\n\n\t// Add extracted preload links to head\n\tif (preloadLinks.length > 0) {\n\t\tconst preloadHtml = preloadLinks.join('\\n\\t\\t');\n\t\thtml = html.replace(/<\\/head>/i, `\\t\\t${preloadHtml}\\n\\t</head>`);\n\t}\n\n\t// Replace content of the app root (e.g., <div id=\"root\"></div>)\n\tconst appIdEscaped = appId.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n\tconst rootDivRegex = new RegExp(\n\t\t`(<div[^>]*\\\\bid=(\\\\\"|')${appIdEscaped}\\\\2[^>]*>)([\\\\s\\\\S]*?)(<\\\\/div>)`,\n\t\t'i',\n\t);\n\tif (rootDivRegex.test(html)) {\n\t\t// Escape $ in cleanAppHtml to prevent it from being interpreted as backreferences\n\t\tconst escapedAppHtml = cleanAppHtml.replace(/\\$/g, '$$$$');\n\t\thtml = html.replace(rootDivRegex, `$1${escapedAppHtml}$4`);\n\t} else {\n\t\t// If missing, inject just before </body>\n\t\thtml = html.replace(\n\t\t\t/<\\/body>/i,\n\t\t\t`\\t\\t<div id=\"${appId}\">${cleanAppHtml}</div>\\n\\t</body>`,\n\t\t);\n\t}\n\n\t// Append hydration scripts just before </body>\n\tif (hydrationScript) {\n\t\thtml = html.replace(/<\\/body>/i, `\\t\\t${hydrationScript}\\n\\t</body>`);\n\t}\n\n\treturn html;\n}\n",
|
|
20
|
+
"import { pathToFileURL } from 'node:url';\nimport { buildHeadFromMeta } from '../../content/metadata';\nimport { join } from './path';\n\n// biome-ignore lint/suspicious/noExplicitAny: flexible types\ntype Doc = any;\n\ntype MetadataResult = {\n\tperPageHead: string;\n\tpageLang?: string;\n\tstatusOverride?: number;\n};\n\n/**\n * Extract per-page head and metadata from layouts (hierarchical), routes, and content modules\n */\nexport async function extractPageMetadata(\n\tpathname: string,\n\tclientDir: string,\n\tcwd: string,\n\tisWatchMode: boolean,\n\tcurrentStatusOverride?: number,\n): Promise<MetadataResult> {\n\tlet perPageHead = '';\n\tlet pageLang: string | undefined;\n\tlet statusOverride = currentStatusOverride;\n\n\t// 1. Extract layout metadata hierarchically (root → nested)\n\ttry {\n\t\tconst routesPath = join(cwd, '.reroute', 'routes.ts');\n\t\tconst m = await import(\n\t\t\tpathToFileURL(routesPath).href + (isWatchMode ? `?t=${Date.now()}` : '')\n\t\t);\n\t\tconst layouts = (m as Doc)?.layouts as Doc[] | undefined;\n\t\tif (Array.isArray(layouts)) {\n\t\t\t// Filter and sort layouts matching the pathname\n\t\t\tconst matchingLayouts = layouts\n\t\t\t\t.filter((layout: Doc) => {\n\t\t\t\t\tconst pattern = String(layout?.pattern || '/');\n\t\t\t\t\tif (pattern === '/') return true;\n\t\t\t\t\treturn pathname.startsWith(pattern);\n\t\t\t\t})\n\t\t\t\t.sort((a: Doc, b: Doc) => {\n\t\t\t\t\t// Sort by depth (shallow first, so root layout comes before nested)\n\t\t\t\t\tconst aDepth = String(a?.pattern || '/')\n\t\t\t\t\t\t.split('/')\n\t\t\t\t\t\t.filter(Boolean).length;\n\t\t\t\t\tconst bDepth = String(b?.pattern || '/')\n\t\t\t\t\t\t.split('/')\n\t\t\t\t\t\t.filter(Boolean).length;\n\t\t\t\t\treturn aDepth - bDepth;\n\t\t\t\t});\n\n\t\t\t// Extract metadata from each matching layout in hierarchical order\n\t\t\tfor (const layout of matchingLayouts) {\n\t\t\t\tif (typeof layout?.path === 'string') {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst abs = join(clientDir, 'routes', String(layout.path));\n\t\t\t\t\t\tconst mod = (await import(\n\t\t\t\t\t\t\tpathToFileURL(abs).href + (isWatchMode ? `?t=${Date.now()}` : '')\n\t\t\t\t\t\t)) as Doc;\n\t\t\t\t\t\tconst meta = (mod as Doc)?.meta;\n\t\t\t\t\t\tconst ssr = (mod as Doc)?.ssr as Doc | undefined;\n\t\t\t\t\t\tif (meta) perPageHead += buildHeadFromMeta(meta);\n\t\t\t\t\t\tif (ssr) {\n\t\t\t\t\t\t\tconst ssrHead =\n\t\t\t\t\t\t\t\ttypeof ssr.head === 'string'\n\t\t\t\t\t\t\t\t\t? ssr.head\n\t\t\t\t\t\t\t\t\t: Array.isArray(ssr.head)\n\t\t\t\t\t\t\t\t\t\t? String((ssr.head as unknown[]).join('\\n'))\n\t\t\t\t\t\t\t\t\t\t: '';\n\t\t\t\t\t\t\tif (ssrHead) perPageHead += `\\n${ssrHead}`;\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\ttypeof ssr.lang === 'string' &&\n\t\t\t\t\t\t\t\tssr.lang.trim() &&\n\t\t\t\t\t\t\t\t!pageLang\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\tpageLang = ssr.lang.trim();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch {}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t} catch {}\n\n\t// 2. Content page metadata\n\ttry {\n\t\tconst parts = pathname.split('/').filter(Boolean);\n\t\tif (parts.length >= 2) {\n\t\t\tconst key = `${parts[0]}:${parts[1]}`;\n\t\t\tconst g = globalThis as Doc;\n\t\t\tconst exp = g.__REROUTE_SSR_EXPORTS__?.[key] as\n\t\t\t\t| { meta?: unknown; ssr?: unknown }\n\t\t\t\t| undefined;\n\t\t\tconst meta = (exp as Doc)?.meta;\n\t\t\tconst ssr = (exp as Doc)?.ssr;\n\t\t\tperPageHead += buildHeadFromMeta(meta);\n\t\t\tconst ssrHead =\n\t\t\t\ttypeof ssr?.head === 'string'\n\t\t\t\t\t? ssr.head\n\t\t\t\t\t: Array.isArray(ssr?.head)\n\t\t\t\t\t\t? String(ssr.head.join('\\n'))\n\t\t\t\t\t\t: '';\n\t\t\tif (ssrHead) perPageHead += `\\n${ssrHead}`;\n\t\t\tif (typeof ssr?.lang === 'string' && ssr.lang.trim()) {\n\t\t\t\tpageLang = ssr.lang.trim();\n\t\t\t}\n\t\t}\n\t} catch {}\n\n\t// 3. Route-level metadata\n\ttry {\n\t\tconst routesPath = join(cwd, '.reroute', 'routes.ts');\n\t\tconst m = await import(\n\t\t\tpathToFileURL(routesPath).href + (isWatchMode ? `?t=${Date.now()}` : '')\n\t\t);\n\t\tconst match =\n\t\t\ttypeof m.matchRoute === 'function' ? m.matchRoute(pathname) : null;\n\t\tconst r = match?.route as Doc | undefined;\n\n\t\tif (!r) {\n\t\t\t// No route matched; mark as 404 for status\n\t\t\tstatusOverride = statusOverride || 404;\n\t\t}\n\n\t\tif (r && typeof r.path === 'string') {\n\t\t\ttry {\n\t\t\t\tconst abs = join(clientDir, 'routes', String(r.path));\n\t\t\t\tconst mod = (await import(\n\t\t\t\t\tpathToFileURL(abs).href + (isWatchMode ? `?t=${Date.now()}` : '')\n\t\t\t\t)) as Doc;\n\t\t\t\tconst meta = (mod as Doc)?.meta;\n\t\t\t\tconst ssr = (mod as Doc)?.ssr as Doc | undefined;\n\t\t\t\tif (meta) perPageHead += buildHeadFromMeta(meta);\n\t\t\t\tif (ssr) {\n\t\t\t\t\tconst ssrHead =\n\t\t\t\t\t\ttypeof ssr.head === 'string'\n\t\t\t\t\t\t\t? ssr.head\n\t\t\t\t\t\t\t: Array.isArray(ssr.head)\n\t\t\t\t\t\t\t\t? String((ssr.head as unknown[]).join('\\n'))\n\t\t\t\t\t\t\t\t: '';\n\t\t\t\t\tif (ssrHead) perPageHead += `\\n${ssrHead}`;\n\t\t\t\t\tif (typeof ssr.lang === 'string' && ssr.lang.trim()) {\n\t\t\t\t\t\tpageLang = ssr.lang.trim();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} catch {}\n\t\t} else {\n\t\t\t// Try to find notFound route metadata\n\t\t\ttry {\n\t\t\t\tconst list = (m as Doc)?.notFoundRoutes as Doc[] | undefined;\n\t\t\t\tif (Array.isArray(list)) {\n\t\t\t\t\t// choose most specific by longest pattern prefix\n\t\t\t\t\tlet chosen: Doc | undefined;\n\t\t\t\t\tlet bestLen = -1;\n\t\t\t\t\tfor (const nf of list) {\n\t\t\t\t\t\tconst pat = String((nf as Doc)?.pattern || '/');\n\t\t\t\t\t\tif (!pathname.startsWith(pat)) continue;\n\t\t\t\t\t\tconst len = pat.split('/').filter(Boolean).length;\n\t\t\t\t\t\tif (len >= bestLen) {\n\t\t\t\t\t\t\tbestLen = len;\n\t\t\t\t\t\t\tchosen = nf;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (chosen && typeof (chosen as Doc).path === 'string') {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst abs = join(\n\t\t\t\t\t\t\t\tclientDir,\n\t\t\t\t\t\t\t\t'routes',\n\t\t\t\t\t\t\t\tString((chosen as Doc).path),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tconst mod = (await import(\n\t\t\t\t\t\t\t\tpathToFileURL(abs).href +\n\t\t\t\t\t\t\t\t\t(isWatchMode ? `?t=${Date.now()}` : '')\n\t\t\t\t\t\t\t)) as Doc;\n\t\t\t\t\t\t\tconst meta = (mod as Doc)?.meta;\n\t\t\t\t\t\t\tconst ssr = (mod as Doc)?.ssr as Doc | undefined;\n\t\t\t\t\t\t\tif (meta) perPageHead += buildHeadFromMeta(meta);\n\t\t\t\t\t\t\tconst ssrHead =\n\t\t\t\t\t\t\t\ttypeof ssr?.head === 'string'\n\t\t\t\t\t\t\t\t\t? ssr.head\n\t\t\t\t\t\t\t\t\t: Array.isArray(ssr?.head)\n\t\t\t\t\t\t\t\t\t\t? String((ssr.head as unknown[]).join('\\n'))\n\t\t\t\t\t\t\t\t\t\t: '';\n\t\t\t\t\t\t\tif (ssrHead) perPageHead += `\\n${ssrHead}`;\n\t\t\t\t\t\t\tif (typeof ssr?.lang === 'string' && ssr.lang?.trim()) {\n\t\t\t\t\t\t\t\tpageLang = String(ssr.lang).trim();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} catch {}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} catch {}\n\t\t}\n\t} catch {}\n\n\treturn { perPageHead, pageLang, statusOverride };\n}\n\nexport type { MetadataResult };\n",
|
|
21
|
+
"import { readdir, stat } from 'node:fs/promises';\nimport { pathToFileURL } from 'node:url';\nimport { join } from './path';\n\n// biome-ignore lint/suspicious/noExplicitAny: flexible types\ntype Doc = any;\n\ntype PreloadResult = {\n\tmodulePath?: string;\n\textraHead: string;\n\thydrationScript: string;\n\tstatusOverride?: number;\n};\n\n/**\n * Handle content module preloading for content pages\n */\nexport async function preloadContentModule(\n\tpathname: string,\n\tclientDir: string,\n\tcwd: string,\n\tisWatchMode: boolean,\n): Promise<PreloadResult> {\n\tlet extraHead = '';\n\tlet hydrationScript = '';\n\tlet statusOverride: number | undefined;\n\n\ttry {\n\t\tconst parts = pathname.split('/').filter(Boolean);\n\t\tif (parts.length >= 2) {\n\t\t\tconst collection = parts[0];\n\t\t\tconst name = parts[1];\n\t\t\tlet modulePath = '';\n\n\t\t\t// Only consider this a content collection if routes/<collection>/content exists\n\t\t\tlet isContentCollection = false;\n\t\t\ttry {\n\t\t\t\tconst maybeDir = join(clientDir, 'routes', collection, 'content');\n\t\t\t\tconst s = await stat(maybeDir);\n\t\t\t\tisContentCollection =\n\t\t\t\t\ttypeof s?.isDirectory === 'function' ? s.isDirectory() : true;\n\t\t\t} catch {\n\t\t\t\tisContentCollection = false;\n\t\t\t}\n\n\t\t\tif (!isContentCollection) {\n\t\t\t\t// Not a content collection path; skip content preloading logic\n\t\t\t\tthrow new Error('skip-content-preload');\n\t\t\t}\n\n\t\t\t// Prefer registry mapping from .reroute/content.ts for exact chunk\n\t\t\ttry {\n\t\t\t\tconst registryPath = join(cwd, '.reroute', 'content.ts');\n\t\t\t\tconst reg = (await import(\n\t\t\t\t\tpathToFileURL(registryPath).href +\n\t\t\t\t\t\t(isWatchMode ? `?t=${Date.now()}` : '')\n\t\t\t\t)) as Doc;\n\t\t\t\tconst get = (reg as Doc)?.getContentEntry as\n\t\t\t\t\t| ((c: string, n: string) => { module?: string } | undefined)\n\t\t\t\t\t| undefined;\n\t\t\t\tconst entry =\n\t\t\t\t\ttypeof get === 'function' ? get(collection, name) : undefined;\n\t\t\t\tconst moduleUrl = (entry as Doc)?.module as string | undefined;\n\t\t\t\tif (moduleUrl?.endsWith('.js')) {\n\t\t\t\t\tmodulePath = moduleUrl;\n\t\t\t\t}\n\t\t\t} catch {}\n\n\t\t\t// Fallback: pick newest chunk if registry unavailable\n\t\t\tif (!modulePath) {\n\t\t\t\ttry {\n\t\t\t\t\tconst chunkDir = join(cwd, '.reroute', 'chunks', collection);\n\t\t\t\t\tconst files = await readdir(chunkDir);\n\t\t\t\t\tconst candidates = files.filter(\n\t\t\t\t\t\t(n) => n.startsWith(`${name}.`) && n.endsWith('.js'),\n\t\t\t\t\t);\n\t\t\t\t\tif (candidates.length) {\n\t\t\t\t\t\tlet latest = candidates[0];\n\t\t\t\t\t\tlet latestM = 0;\n\t\t\t\t\t\tfor (const candidateName of candidates) {\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tconst s = await stat(join(chunkDir, candidateName));\n\t\t\t\t\t\t\t\tif (s.mtimeMs >= latestM) {\n\t\t\t\t\t\t\t\t\tlatestM = s.mtimeMs;\n\t\t\t\t\t\t\t\t\tlatest = candidateName;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} catch {}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tmodulePath = `/${join('.reroute', 'chunks', collection, latest).replace(/\\\\+/g, '/')}`;\n\t\t\t\t\t}\n\t\t\t\t} catch {}\n\t\t\t}\n\n\t\t\t// Fallback to raw source if chunk missing\n\t\t\tif (!modulePath) {\n\t\t\t\tconst tsx = join(\n\t\t\t\t\tclientDir,\n\t\t\t\t\t'routes',\n\t\t\t\t\tcollection,\n\t\t\t\t\t'content',\n\t\t\t\t\t`${name}.tsx`,\n\t\t\t\t);\n\t\t\t\tconst ts = join(\n\t\t\t\t\tclientDir,\n\t\t\t\t\t'routes',\n\t\t\t\t\tcollection,\n\t\t\t\t\t'content',\n\t\t\t\t\t`${name}.ts`,\n\t\t\t\t);\n\t\t\t\tlet srcUrl = '';\n\t\t\t\tif (await Bun.file(tsx).exists()) {\n\t\t\t\t\tsrcUrl = `/${join('routes', collection, 'content', `${name}.tsx`).replace(/\\\\+/g, '/')}`;\n\t\t\t\t} else if (await Bun.file(ts).exists()) {\n\t\t\t\t\tsrcUrl = `/${join('routes', collection, 'content', `${name}.ts`).replace(/\\\\+/g, '/')}`;\n\t\t\t\t}\n\t\t\t\tif (srcUrl) {\n\t\t\t\t\tmodulePath = srcUrl;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (!modulePath) {\n\t\t\t\tstatusOverride = 404;\n\t\t\t}\n\n\t\t\tif (modulePath) {\n\t\t\t\tconst key = `${collection}:${name}`;\n\t\t\t\t// Hint the browser to fetch the module ASAP\n\t\t\t\textraHead += `\\n<link rel=\"modulepreload\" href=\"${modulePath}\" />`;\n\t\t\t\t// Ensure the module is evaluated before the main app module runs via external module\n\t\t\t\tconst qs = `src=${encodeURIComponent(modulePath)}&key=${encodeURIComponent(key)}`;\n\t\t\t\thydrationScript += `<script type=\"module\" src=\"/__reroute_preload?${qs}\"></script>`;\n\t\t\t}\n\t\t}\n\t} catch {}\n\n\treturn { modulePath: undefined, extraHead, hydrationScript, statusOverride };\n}\n\n/**\n * Reset SSR access tracking for a new request\n */\nexport function resetSSRAccessTracking(): void {\n\ttry {\n\t\t(globalThis as Doc).__REROUTE_SSR_ACCESSED__ = {} as unknown as Doc;\n\t} catch {}\n}\n\n/**\n * Create bundle preload link\n */\nexport function createBundlePreload(bundleUrl: string): string {\n\ttry {\n\t\tif (typeof bundleUrl === 'string' && bundleUrl.endsWith('.js')) {\n\t\t\treturn `\\n<link rel=\"modulepreload\" href=\"${bundleUrl}\" />`;\n\t\t}\n\t} catch {}\n\treturn '';\n}\n\nexport type { PreloadResult };\n",
|
|
22
|
+
"// biome-ignore lint/suspicious/noExplicitAny: flexible types\ntype Doc = any;\n\n/**\n * Escape JSON for safe embedding in HTML script tags\n */\nexport function escapeJsonForScript(json: string): string {\n\treturn json\n\t\t.replace(/</g, '\\\\u003c')\n\t\t.replace(/>/g, '\\\\u003e')\n\t\t.replace(/&/g, '\\\\u0026');\n}\n\n/**\n * Create inline script for SSR data\n */\nexport function createDataScript(\n\tssrData: Record<string, unknown>,\n\terrorMsg?: string,\n): string {\n\tlet script = '';\n\n\t// Add data if present\n\tif (ssrData && Object.keys(ssrData).length > 0) {\n\t\ttry {\n\t\t\tconst dataJson = escapeJsonForScript(JSON.stringify(ssrData));\n\t\t\tscript += `<script>(function(){try{var w=(typeof window!=='undefined'?window:globalThis);w.__REROUTE_DATA__=Object.assign({},w.__REROUTE_DATA__||{},${dataJson});try{w.dispatchEvent(new CustomEvent('__reroute_data__',{detail:{keys:Object.keys(${dataJson})}}));}catch(e){}}catch(e){}})();</script>`;\n\t\t} catch (error) {\n\t\t\tconsole.error('[reroute] Failed to serialize SSR data:', error);\n\t\t}\n\t}\n\n\t// Add dev warning for SSR data errors\n\tif (errorMsg) {\n\t\tconst escapedMsg = JSON.stringify(errorMsg);\n\t\tscript += `<script>(function(){try{console.warn('%c[reroute] SSR Data Error','background: #ff5555; color: white; padding: 2px 6px; border-radius: 3px;',${escapedMsg});}catch(e){}})();</script>`;\n\t}\n\n\treturn script;\n}\n\n/**\n * Create inline script for collection data\n */\nexport function createCollectionScript(\n\tsubset: Record<string, unknown[]>,\n\tpartial: Record<string, boolean>,\n): string {\n\tconst subsetJson = escapeJsonForScript(JSON.stringify(subset));\n\tconst partialJson = escapeJsonForScript(JSON.stringify(partial));\n\treturn `<script>(function(){try{var w=(typeof window!=='undefined'?window:globalThis);w.__REROUTE_COLLECTIONS__=w.__REROUTE_COLLECTIONS__||{};Object.assign(w.__REROUTE_COLLECTIONS__,${subsetJson});w.__REROUTE_COLLECTIONS_PARTIAL__=w.__REROUTE_COLLECTIONS_PARTIAL__||{};Object.assign(w.__REROUTE_COLLECTIONS_PARTIAL__,${partialJson});}catch(e){}})();</script>`;\n}\n\n/**\n * Process collections based on SSR access tracking\n */\nexport function processCollections(\n\taccessedCollections: Doc,\n\tbyCollectionForSSR: Record<string, unknown[]>,\n): { subset: Record<string, unknown[]>; partial: Record<string, boolean> } {\n\tconst sortByDate = (order: 'asc' | 'desc') => (a: Doc, b: Doc) => {\n\t\tconst da = a?.meta?.date ? Date.parse(String(a.meta.date)) : 0;\n\t\tconst db = b?.meta?.date ? Date.parse(String(b.meta.date)) : 0;\n\t\treturn order === 'asc' ? da - db : db - da;\n\t};\n\n\tconst usage: Record<string, { limit: number; sort: string }> = {};\n\tif (\n\t\taccessedCollections &&\n\t\ttypeof accessedCollections.forEach === 'function'\n\t) {\n\t\t(accessedCollections as Set<string>).forEach((c) => {\n\t\t\tif (typeof c === 'string')\n\t\t\t\tusage[c] = { limit: Number.POSITIVE_INFINITY, sort: 'custom' };\n\t\t});\n\t} else if (accessedCollections && typeof accessedCollections === 'object') {\n\t\tfor (const [k, v] of Object.entries(\n\t\t\taccessedCollections as Record<string, Doc>,\n\t\t)) {\n\t\t\tconst lim =\n\t\t\t\ttypeof v?.limit === 'number' ? v.limit : Number.POSITIVE_INFINITY;\n\t\t\tconst s = typeof v?.sort === 'string' ? v.sort : 'custom';\n\t\t\tusage[k] = { limit: lim, sort: s };\n\t\t}\n\t}\n\n\tconst collections = Object.keys(usage);\n\tconst subset: Record<string, unknown[]> = {};\n\tconst partial: Record<string, boolean> = {};\n\n\tfor (const c of collections) {\n\t\tconst conf = usage[c];\n\t\tconst full = byCollectionForSSR?.[c] || [];\n\t\tlet arr: unknown[] = full;\n\n\t\tif (\n\t\t\tNumber.isFinite(conf.limit) &&\n\t\t\tconf.limit > 0 &&\n\t\t\tconf.sort !== 'custom'\n\t\t) {\n\t\t\tif (conf.sort === 'date-desc') {\n\t\t\t\tarr = [...full].sort(sortByDate('desc')).slice(0, conf.limit);\n\t\t\t} else if (conf.sort === 'date-asc') {\n\t\t\t\tarr = [...full].sort(sortByDate('asc')).slice(0, conf.limit);\n\t\t\t} else if (conf.sort === 'none') {\n\t\t\t\tarr = full.slice(0, conf.limit);\n\t\t\t}\n\t\t}\n\n\t\tsubset[c] = arr;\n\t\tpartial[c] =\n\t\t\tArray.isArray(arr) && Array.isArray(full)\n\t\t\t\t? arr.length < full.length\n\t\t\t\t: false;\n\t}\n\n\treturn { subset, partial };\n}\n",
|
|
23
|
+
"import { join } from './path';\n\n/**\n * Find and inline Tailwind CSS from .reroute directory\n */\nexport async function inlineTailwindCSS(\n\tclientDir: string,\n\tminify = false,\n): Promise<string> {\n\ttry {\n\t\tconst candidates = [\n\t\t\tjoin(clientDir, '..', '.reroute', 'theme.css'),\n\t\t\tjoin(clientDir, '..', '..', '.reroute', 'theme.css'),\n\t\t\tjoin(clientDir, '..', '..', '..', '.reroute', 'theme.css'),\n\t\t\tjoin(clientDir, '..', '..', '..', '..', '.reroute', 'theme.css'),\n\t\t];\n\n\t\tlet cssPath = '';\n\t\tfor (const p of candidates) {\n\t\t\tif (await Bun.file(p).exists()) {\n\t\t\t\tcssPath = p;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif (!cssPath) return '';\n\n\t\tlet css = await Bun.file(cssPath).text();\n\n\t\tif (minify) {\n\t\t\t// Best-effort, safe-ish CSS minification without external deps\n\t\t\tcss = css\n\t\t\t\t// Remove /* block comments */\n\t\t\t\t.replace(/\\/\\*[\\s\\S]*?\\*\\//g, '')\n\t\t\t\t// Collapse whitespace\n\t\t\t\t.replace(/\\s+/g, ' ')\n\t\t\t\t// Remove space around selectors, braces, colons and semicolons\n\t\t\t\t.replace(/\\s*([{}:;,>+~])\\s*/g, '$1')\n\t\t\t\t// Remove final semicolons before closing brace\n\t\t\t\t.replace(/;}/g, '}')\n\t\t\t\t// Trim\n\t\t\t\t.trim();\n\t\t}\n\n\t\treturn `<style data-reroute=\"tailwind\">${css}</style>`;\n\t} catch {\n\t\treturn '';\n\t}\n}\n",
|
|
24
|
+
"function splitTemplate(html: string, appId: string = 'root'): TemplateParts {\n\t// Escape special regex characters in appId\n\tconst appIdEscaped = appId.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n\n\t// Match the root div with the specified id\n\tconst rootDivRegex = new RegExp(\n\t\t`(<div[^>]*\\\\bid=[\"']${appIdEscaped}[\"'][^>]*>)([\\\\s\\\\S]*?)(<\\\\/div>)`,\n\t\t'i',\n\t);\n\n\tconst match = html.match(rootDivRegex);\n\tif (!match || match.index === undefined) {\n\t\tthrow new Error(`Could not find app root div with id=\"${appId}\"`);\n\t}\n\n\tconst [fullMatch, rootStart, , rootEnd] = match;\n\tconst matchIndex = match.index;\n\n\treturn {\n\t\thtmlHead: html.substring(0, matchIndex),\n\t\trootStart,\n\t\trootEnd,\n\t\thtmlTail: html.substring(matchIndex + fullMatch.length),\n\t};\n}\n\ntype TemplateParts = {\n\thtmlHead: string;\n\trootStart: string;\n\trootEnd: string;\n\thtmlTail: string;\n};\n\nexport { splitTemplate };\nexport type { TemplateParts };\n",
|
|
25
|
+
"export * from './cache';\nexport * from './collections';\nexport * from './compression';\nexport * from './compute';\nexport * from './data';\nexport * from './html';\nexport * from './metadata';\nexport * from './mime';\nexport * from './modules';\nexport * from './path';\nexport * from './preload';\nexport * from './scripts';\nexport * from './seed';\nexport * from './styles';\nexport * from './template';\nexport * from './types';\n",
|
|
12
26
|
"function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\nfunction _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\nfunction _toPropertyKey(arg) { var key = _toPrimitive(arg, \"string\"); return typeof key === \"symbol\" ? key : String(key); }\nfunction _toPrimitive(input, hint) { if (typeof input !== \"object\" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || \"default\"); if (typeof res !== \"object\") return res; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (hint === \"string\" ? String : Number)(input); }\nconst dedent = createDedent({});\nexport default dedent;\nfunction createDedent(options) {\n dedent.withOptions = newOptions => createDedent(_objectSpread(_objectSpread({}, options), newOptions));\n return dedent;\n function dedent(strings, ...values) {\n const raw = typeof strings === \"string\" ? [strings] : strings.raw;\n const {\n alignValues = false,\n escapeSpecialCharacters = Array.isArray(strings),\n trimWhitespace = true\n } = options;\n\n // first, perform interpolation\n let result = \"\";\n for (let i = 0; i < raw.length; i++) {\n let next = raw[i];\n if (escapeSpecialCharacters) {\n // handle escaped newlines, backticks, and interpolation characters\n next = next.replace(/\\\\\\n[ \\t]*/g, \"\").replace(/\\\\`/g, \"`\").replace(/\\\\\\$/g, \"$\").replace(/\\\\\\{/g, \"{\");\n }\n result += next;\n if (i < values.length) {\n const value = alignValues ? alignValue(values[i], result) : values[i];\n\n // eslint-disable-next-line @typescript-eslint/restrict-plus-operands\n result += value;\n }\n }\n\n // now strip indentation\n const lines = result.split(\"\\n\");\n let mindent = null;\n for (const l of lines) {\n const m = l.match(/^(\\s+)\\S+/);\n if (m) {\n const indent = m[1].length;\n if (!mindent) {\n // this is the first indented line\n mindent = indent;\n } else {\n mindent = Math.min(mindent, indent);\n }\n }\n }\n if (mindent !== null) {\n const m = mindent; // appease TypeScript\n result = lines\n // https://github.com/typescript-eslint/typescript-eslint/issues/7140\n // eslint-disable-next-line @typescript-eslint/prefer-string-starts-ends-with\n .map(l => l[0] === \" \" || l[0] === \"\\t\" ? l.slice(m) : l).join(\"\\n\");\n }\n\n // dedent eats leading and trailing whitespace too\n if (trimWhitespace) {\n result = result.trim();\n }\n\n // handle escaped newlines at the end to ensure they don't get stripped too\n if (escapeSpecialCharacters) {\n result = result.replace(/\\\\n/g, \"\\n\");\n }\n return result;\n }\n}\n\n/**\n * Adjusts the indentation of a multi-line interpolated value to match the current line.\n */\nfunction alignValue(value, precedingText) {\n if (typeof value !== \"string\" || !value.includes(\"\\n\")) {\n return value;\n }\n const currentLine = precedingText.slice(precedingText.lastIndexOf(\"\\n\") + 1);\n const indentMatch = currentLine.match(/^(\\s+)/);\n if (indentMatch) {\n const indent = indentMatch[1];\n return value.replace(/\\n/g, `\\n${indent}`);\n }\n return value;\n}\n",
|
|
13
|
-
"import
|
|
14
|
-
"
|
|
15
|
-
"
|
|
16
|
-
"export
|
|
17
|
-
"
|
|
27
|
+
"import dedent from 'dedent';\nimport { cloneElement, type ReactElement } from 'react';\nimport { renderToString } from 'react-dom/server';\nimport { applyIndexTemplate, loadIndexHtml } from './lib';\nimport { loadCollections, setGlobalCollections } from './lib/collections';\nimport { computeSSRData, setGlobalSSRData } from './lib/compute';\nimport { extractPageMetadata } from './lib/metadata';\nimport {\n\tcreateBundlePreload,\n\tpreloadContentModule,\n\tresetSSRAccessTracking,\n} from './lib/preload';\nimport {\n\tcreateCollectionScript,\n\tcreateDataScript,\n\tprocessCollections,\n} from './lib/scripts';\nimport { seedSSRModuleForPath } from './lib/seed';\nimport { inlineTailwindCSS } from './lib/styles';\nimport type { Doc } from './lib/types';\n\ntype SSRRenderOptions = {\n\tpathname: string;\n\trootComponent: ReactElement;\n\tclientDir: string;\n\tcwd: string;\n\tisWatchMode: boolean;\n\tbundleUrl: string;\n\thead?: string;\n\tlang?: string;\n\tappId?: string;\n\t// When true, also attempt to minify inlined assets like CSS\n\tminify?: boolean;\n\tmaxAge?: number;\n};\n\ntype SSRRenderResult = {\n\thtml: string;\n\tstatus: number;\n};\n\nasync function renderSSRDocument(\n\toptions: SSRRenderOptions,\n): Promise<SSRRenderResult> {\n\tconst {\n\t\tpathname,\n\t\trootComponent,\n\t\tclientDir,\n\t\tcwd,\n\t\tisWatchMode,\n\t\tbundleUrl,\n\t\thead = '',\n\t\tlang = 'en',\n\t\tappId = 'root',\n\t\tminify = false,\n\t\tmaxAge = 0,\n\t} = options;\n\n\tconst scripts = [bundleUrl];\n\n\t// Content module preloading\n\tresetSSRAccessTracking();\n\tconst bundlePreload = createBundlePreload(bundleUrl);\n\tconst preloadResult = await preloadContentModule(\n\t\tpathname,\n\t\tclientDir,\n\t\tcwd,\n\t\tisWatchMode,\n\t);\n\n\tconst extraHead = bundlePreload + preloadResult.extraHead;\n\tlet hydrationScript = preloadResult.hydrationScript;\n\tlet statusOverride = preloadResult.statusOverride;\n\n\t// Seed SSR store with content component so BlogPost can render on server\n\tawait seedSSRModuleForPath(pathname, clientDir, cwd, isWatchMode);\n\n\t// Route component module preload removed to avoid extra requests.\n\n\t// Execute optional route/content ssr.data and expose per-request store\n\tconst { data: __SSR_DATA__, error: __SSR_DATA_ERROR__ } =\n\t\tawait computeSSRData(pathname, clientDir, cwd, isWatchMode, { maxAge });\n\tsetGlobalSSRData(__SSR_DATA__);\n\n\t// Seed content collections on the server for SSR rendering (no client delivery yet).\n\t// We'll only inline the collections actually accessed during this render, captured\n\t// via the hook-level tracker.\n\tconst __byCollectionForSSR = await loadCollections(cwd, isWatchMode);\n\tsetGlobalCollections(__byCollectionForSSR);\n\n\t// (moved) Entry + dev watcher scripts are appended later, after we inline\n\t// any accessed collections so data is available before app boot.\n\n\tconst componentWithPathname = cloneElement<Doc>(rootComponent, {\n\t\tpathname,\n\t});\n\tconst appHtml = renderToString(componentWithPathname);\n\tconst baseTemplate = await loadIndexHtml(clientDir);\n\n\t// Inline compiled Tailwind CSS output if present (generated by CLI)\n\tconst inlineStyleTag = await inlineTailwindCSS(clientDir, minify);\n\n\t// After rendering, inline only the content collections that were actually\n\t// accessed during this SSR render. This preserves SSR for static routes that\n\t// use useContent(), while avoiding shipping the entire content index to pages\n\t// that don't need it (e.g., a single post entry without lists).\n\ttry {\n\t\tconst g = globalThis as unknown as { __REROUTE_SSR_ACCESSED__?: unknown };\n\t\tconst acc = g.__REROUTE_SSR_ACCESSED__;\n\n\t\tif (acc) {\n\t\t\tconst { subset, partial } = processCollections(acc, __byCollectionForSSR);\n\t\t\tif (Object.keys(subset).length > 0) {\n\t\t\t\thydrationScript += createCollectionScript(subset, partial);\n\t\t\t}\n\t\t}\n\t} catch {}\n\n\t// Inline SSR data and error warnings\n\thydrationScript += createDataScript(\n\t\t__SSR_DATA__,\n\t\tisWatchMode ? __SSR_DATA_ERROR__ : undefined,\n\t);\n\n\t// Append client entry module only after inlining accessed collections\n\thydrationScript += scripts\n\t\t.map((src) => `<script type=\"module\" src=\"${src}\"></script>`)\n\t\t.join('');\n\n\t// (Dev) Load live reload module (no inline script)\n\tif (isWatchMode) {\n\t\thydrationScript += `<script type=\"module\" src=\"/__reroute_watch.js\"></script>`;\n\t}\n\n\t// Derive per-page head from exported meta/ssr if available\n\tconst metadataResult = await extractPageMetadata(\n\t\tpathname,\n\t\tclientDir,\n\t\tcwd,\n\t\tisWatchMode,\n\t\tstatusOverride,\n\t);\n\tconst perPageHead = metadataResult.perPageHead;\n\tconst pageLang = metadataResult.pageLang;\n\tstatusOverride = metadataResult.statusOverride;\n\n\tconst combinedHead = dedent(\n\t\t[dedent(head) || '', dedent(extraHead), dedent(perPageHead)]\n\t\t\t.filter(Boolean)\n\t\t\t.join('\\n'),\n\t);\n\tconst html = applyIndexTemplate(baseTemplate, appHtml, {\n\t\thead: [inlineStyleTag, combinedHead].filter(Boolean).join('\\n'),\n\t\thydrationScript,\n\t\tlang: pageLang || lang,\n\t\tappId,\n\t});\n\n\treturn {\n\t\thtml,\n\t\tstatus: statusOverride || 200,\n\t};\n}\n\nexport { renderSSRDocument, type SSRRenderOptions, type SSRRenderResult };\n",
|
|
28
|
+
"import { cloneElement, type ReactElement } from 'react';\nimport { renderToReadableStream } from 'react-dom/server';\nimport { loadCollections, setGlobalCollections } from './lib/collections';\nimport { computeSSRData, setGlobalSSRData } from './lib/compute';\nimport { loadIndexHtml } from './lib/html';\nimport { extractPageMetadata } from './lib/metadata';\nimport {\n\tcreateBundlePreload,\n\tpreloadContentModule,\n\tresetSSRAccessTracking,\n} from './lib/preload';\nimport {\n\tcreateCollectionScript,\n\tcreateDataScript,\n\tprocessCollections,\n} from './lib/scripts';\nimport { seedSSRModuleForPath } from './lib/seed';\nimport { inlineTailwindCSS } from './lib/styles';\nimport { splitTemplate } from './lib/template';\n\n// biome-ignore lint/suspicious/noExplicitAny: flexible types\ntype Doc = any;\n\nconst isThenable = (value: unknown): value is Promise<unknown> => {\n\treturn (\n\t\ttypeof value === 'object' &&\n\t\tvalue !== null &&\n\t\ttypeof (value as { then?: unknown }).then === 'function'\n\t);\n};\n\nasync function renderSSRDocumentStream(\n\toptions: StreamingSSROptions,\n): Promise<StreamingSSRResult> {\n\tconst {\n\t\tpathname,\n\t\trootComponent,\n\t\tclientDir,\n\t\tcwd,\n\t\tisWatchMode,\n\t\tbundleUrl,\n\t\thead = '',\n\t\tlang = 'en',\n\t\tappId = 'root',\n\t\tmaxAge = 0,\n\t} = options;\n\n\t// IMPORTANT: Seed content modules before rendering (same as sync version)\n\tawait seedSSRModuleForPath(pathname, clientDir, cwd, isWatchMode);\n\n\t// Compute SSR data\n\tconst { data: __SSR_DATA__, error: __SSR_DATA_ERROR__ } =\n\t\tawait computeSSRData(pathname, clientDir, cwd, isWatchMode, {\n\t\t\tstreaming: true,\n\t\t\tmaxAge,\n\t\t});\n\tsetGlobalSSRData(__SSR_DATA__);\n\n\t// Load content collections for SSR rendering\n\tconst __byCollectionForSSR = await loadCollections(cwd, isWatchMode);\n\tsetGlobalCollections(__byCollectionForSSR);\n\n\t// Content module preloading\n\tresetSSRAccessTracking();\n\tconst bundlePreload = createBundlePreload(bundleUrl);\n\tconst preloadResult = await preloadContentModule(\n\t\tpathname,\n\t\tclientDir,\n\t\tcwd,\n\t\tisWatchMode,\n\t);\n\n\tlet extraHead = bundlePreload + preloadResult.extraHead;\n\tconst hydrationScript = preloadResult.hydrationScript;\n\tlet statusOverride = preloadResult.statusOverride;\n\n\tconst encoder = new TextEncoder();\n\tconst { readable, writable } = new TransformStream<Uint8Array>();\n\tconst writer = writable.getWriter();\n\n\t// Load and split template\n\tconst baseTemplate = await loadIndexHtml(clientDir);\n\tconst { htmlHead, rootStart, rootEnd, htmlTail } = splitTemplate(\n\t\tbaseTemplate,\n\t\tappId,\n\t);\n\n\t// Build head with lang attribute\n\tconst headWithLang = htmlHead.replace(\n\t\t/<html([^>]*)>/i,\n\t\t`<html$1 lang=\"${lang}\">`,\n\t);\n\n\t// Inline compiled Tailwind CSS output if present (generated by CLI)\n\tconst inlineStyleTag = await inlineTailwindCSS(clientDir, false);\n\n\t// Extract page metadata\n\tconst metadataResult = await extractPageMetadata(\n\t\tpathname,\n\t\tclientDir,\n\t\tcwd,\n\t\tisWatchMode,\n\t\tstatusOverride,\n\t);\n\textraHead += metadataResult.perPageHead;\n\tconst pageLang = metadataResult.pageLang;\n\tstatusOverride = metadataResult.statusOverride;\n\n\t// Start streaming in the background\n\t(async () => {\n\t\ttry {\n\t\t\t// 1. Send HTML head immediately (shell) with all preload links\n\t\t\tconst combinedHead = [inlineStyleTag, head, extraHead]\n\t\t\t\t.filter(Boolean)\n\t\t\t\t.join('\\n');\n\t\t\tconst headContent = `${headWithLang.replace(/<html([^>]*)>/i, `<html$1 lang=\"${pageLang || lang}\">`)}${combinedHead ? `\\n${combinedHead}` : ''}</head><body>`;\n\t\t\tawait writer.write(encoder.encode(headContent));\n\n\t\t\t// 2. Send root div start\n\t\t\tawait writer.write(encoder.encode(rootStart));\n\n\t\t\t// 3. Stream React content (starts immediately, Suspense boundaries stream progressively)\n\t\t\tconst componentWithPathname = cloneElement(rootComponent, {\n\t\t\t\tpathname,\n\t\t\t} as Doc);\n\n\t\t\t// Use React 19's streaming with progressive Suspense resolution\n\t\t\t// We start streaming as soon as the shell is ready, not waiting for all Suspense boundaries\n\t\t\tlet streamError: Error | null = null;\n\n\t\t\tconst streamPromise = renderToReadableStream(componentWithPathname, {\n\t\t\t\tonError(error) {\n\t\t\t\t\tconsole.error('[reroute] SSR stream error:', error);\n\t\t\t\t\tstreamError =\n\t\t\t\t\t\terror instanceof Error ? error : new Error(String(error));\n\t\t\t\t},\n\t\t\t}).catch((err) => {\n\t\t\t\tstreamError = err;\n\t\t\t\tthrow err;\n\t\t\t});\n\n\t\t\t// Wait for the stream to be ready (this happens quickly - just the initial setup)\n\t\t\tconst reactStream = await streamPromise;\n\t\t\tif (streamError) {\n\t\t\t\tthrow streamError;\n\t\t\t}\n\n\t\t\t// Now pipe the React stream to our writer\n\t\t\t// This will stream progressively as Suspense boundaries resolve\n\t\t\tconst reader = reactStream.getReader();\n\t\t\twhile (true) {\n\t\t\t\tconst { done, value } = await reader.read();\n\t\t\t\tif (done) break;\n\t\t\t\tawait writer.write(value);\n\t\t\t}\n\n\t\t\t// 4. Close root div\n\t\t\tawait writer.write(encoder.encode(rootEnd));\n\n\t\t\t// 5. Inline accessed collections script\n\t\t\tlet collectionScripts = '';\n\t\t\ttry {\n\t\t\t\tconst g = globalThis as unknown as {\n\t\t\t\t\t__REROUTE_SSR_ACCESSED__?: unknown;\n\t\t\t\t};\n\t\t\t\tconst acc = g.__REROUTE_SSR_ACCESSED__ as Doc;\n\n\t\t\t\tif (acc) {\n\t\t\t\t\tconst { subset, partial } = processCollections(\n\t\t\t\t\t\tacc,\n\t\t\t\t\t\t__byCollectionForSSR,\n\t\t\t\t\t);\n\t\t\t\t\tif (Object.keys(subset).length > 0) {\n\t\t\t\t\t\tcollectionScripts = createCollectionScript(subset, partial);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} catch {}\n\n\t\t\t// 6. Create a snapshot of current SSR data state for hydration\n\t\t\t// Use a copy to avoid race conditions with pending promises\n\t\t\tconst ssrDataSnapshot: Record<string, unknown> = {};\n\t\t\tfor (const key of Object.keys(__SSR_DATA__)) {\n\t\t\t\tconst value = __SSR_DATA__[key];\n\t\t\t\t// Only include resolved values, not promises\n\t\t\t\tif (!isThenable(value)) {\n\t\t\t\t\tssrDataSnapshot[key] = value;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// 7. Add SSR data snapshot and preload scripts\n\t\t\tconst dataScript = createDataScript(\n\t\t\t\tssrDataSnapshot,\n\t\t\t\tisWatchMode ? __SSR_DATA_ERROR__ : undefined,\n\t\t\t);\n\t\t\tlet allScripts = dataScript + collectionScripts + hydrationScript;\n\n\t\t\t// 8. Add bundle script with type=\"module\"\n\t\t\tallScripts += `<script type=\"module\" src=\"${bundleUrl}\"></script>`;\n\n\t\t\t// (Dev) Load live reload module\n\t\t\tif (isWatchMode) {\n\t\t\t\tallScripts += `<script type=\"module\" src=\"/__reroute_watch.js\"></script>`;\n\t\t\t}\n\n\t\t\tawait writer.write(encoder.encode(allScripts + htmlTail));\n\t\t\tawait writer.close();\n\t\t} catch (error) {\n\t\t\tconsole.error('[reroute] Stream error:', error);\n\t\t\tawait writer.abort(error);\n\t\t}\n\t})();\n\n\treturn { stream: readable, status: statusOverride || 200 };\n}\n\ntype StreamingSSROptions = {\n\tpathname: string;\n\trootComponent: ReactElement;\n\tclientDir: string;\n\tcwd: string;\n\tisWatchMode: boolean;\n\tbundleUrl: string;\n\thead?: string;\n\tlang?: string;\n\tappId?: string;\n\tmaxAge?: number;\n};\n\ntype StreamingSSRResult = {\n\tstream: ReadableStream<Uint8Array>;\n\tstatus: number;\n};\n\nexport { renderSSRDocumentStream };\nexport type { StreamingSSROptions, StreamingSSRResult };\n",
|
|
29
|
+
"export * from './lib';\nexport * from './render';\nexport * from './stream';\n",
|
|
30
|
+
"export * from './bundler';\nexport * from './config';\nexport * from './content';\nexport * from './ssr';\n",
|
|
31
|
+
"export * from './src';\n",
|
|
32
|
+
"// All file watching happens in the CLI (reroute gen --watch)\n\nimport { pathToFileURL } from 'node:url';\nimport type { Elysia } from 'elysia';\nimport { createElement, type ReactElement } from 'react';\nimport { discoverCollections, LRUCache, loadConfig } from 'reroute-js/core';\nimport { initImageCache } from './libs/image';\nimport { registerArtifactsRoutes } from './routes/artifacts';\nimport { registerContentRoutes } from './routes/content';\nimport { registerImageRoutes } from './routes/image';\nimport {\n\tregisterInternalRoutes,\n\tregisterLiveReloadRoutes,\n} from './routes/internal';\nimport { registerSSRRoutes } from './routes/ssr';\nimport { registerStaticRoutes } from './routes/static';\nimport type { RerouteOptions } from './types';\n\nconst reroute =\n\t(options: RerouteOptions = {}) =>\n\tasync (app: Elysia) => {\n\t\tconst cwd =\n\t\t\ttypeof process !== 'undefined' && typeof process.cwd === 'function'\n\t\t\t\t? process.cwd()\n\t\t\t\t: '/';\n\n\t\t// Load global config\n\t\tconst globalConfig = await loadConfig(cwd);\n\n\t\t// Handle App component (can be ReactElement in plugin or string path in config)\n\t\tlet rootComponent: ReactElement | undefined;\n\t\tif (options.app) {\n\t\t\t// Plugin provided app\n\t\t\tif (typeof options.app === 'string') {\n\t\t\t\t// Plugin provided path - load and createElement\n\t\t\t\tconst appPath = options.app.startsWith('/')\n\t\t\t\t\t? options.app\n\t\t\t\t\t: `${cwd}/${options.app.replace(/^\\.\\//, '')}`;\n\t\t\t\tconst AppModule = await import(\n\t\t\t\t\t`${pathToFileURL(appPath).href}?t=${Date.now()}`\n\t\t\t\t);\n\t\t\t\trootComponent = createElement(AppModule.default);\n\t\t\t} else {\n\t\t\t\t// Plugin provided ReactElement - use directly\n\t\t\t\trootComponent = options.app;\n\t\t\t}\n\t\t} else if (globalConfig.options?.app) {\n\t\t\t// Config provided path - load and createElement\n\t\t\tconst appPath = globalConfig.options.app.startsWith('/')\n\t\t\t\t? globalConfig.options.app\n\t\t\t\t: `${cwd}/${globalConfig.options.app.replace(/^\\.\\//, '')}`;\n\t\t\tconst AppModule = await import(\n\t\t\t\t`${pathToFileURL(appPath).href}?t=${Date.now()}`\n\t\t\t);\n\t\t\trootComponent = createElement(AppModule.default);\n\t\t}\n\n\t\tif (!rootComponent) {\n\t\t\tconsole.warn(\n\t\t\t\t'[reroute] No app component provided. SSR routes will not be registered.',\n\t\t\t);\n\t\t}\n\n\t\t// Merge: plugin options > global config.options > defaults\n\t\tconst ssrHead = options.head ?? globalConfig.options?.head ?? '';\n\t\tconst ssrLang = options.lang ?? globalConfig.options?.lang ?? 'en';\n\t\tconst ssrAppId = options.appId ?? globalConfig.options?.appId ?? 'root';\n\n\t\t// Static serving configuration (plugin > config > defaults)\n\t\tconst assets =\n\t\t\toptions.assets ?? globalConfig.options?.assets ?? 'src/client';\n\t\tlet prefix = options.prefix ?? globalConfig.options?.prefix ?? '/';\n\t\tconst ignorePatterns = options.ignorePatterns ??\n\t\t\tglobalConfig.options?.ignorePatterns ?? [\n\t\t\t\t'.DS_Store',\n\t\t\t\t'.git',\n\t\t\t\t'.env',\n\t\t\t\t'index.html', // Template file, not a static asset\n\t\t\t\t/favicon\\.ico/,\n\t\t\t\t/\\.well-known/,\n\t\t\t];\n\t\tconst staticHeaders =\n\t\t\toptions.staticHeaders ?? globalConfig.options?.staticHeaders;\n\t\tconst maxAge = options.maxAge ?? globalConfig.options?.maxAge ?? 3600;\n\t\tconst directive =\n\t\t\toptions.directive ?? globalConfig.options?.directive ?? 'public';\n\t\tconst indexHTML =\n\t\t\toptions.indexHTML ?? globalConfig.options?.indexHTML ?? true;\n\n\t\t// Build configuration (plugin > config > auto-detect)\n\t\tconst minify =\n\t\t\toptions.minify ??\n\t\t\tglobalConfig.options?.minify ??\n\t\t\tprocess.env.NODE_ENV === 'production';\n\n\t\t// Compression configuration (plugin > config > default: true)\n\t\tconst compression =\n\t\t\toptions.compression ?? globalConfig.options?.compression ?? true;\n\n\t\t// Image optimization configuration (plugin > config > defaults)\n\t\tconst imageMaxAge =\n\t\t\toptions.imageMaxAge ?? globalConfig.options?.imageMaxAge ?? 31536000; // 1 year\n\t\tconst imageAllowedDomains =\n\t\t\toptions.imageAllowedDomains ??\n\t\t\tglobalConfig.options?.imageAllowedDomains ??\n\t\t\t[];\n\t\tconst imageMaxWidth =\n\t\t\toptions.imageMaxWidth ?? globalConfig.options?.imageMaxWidth ?? 3840;\n\t\tconst imageMaxHeight =\n\t\t\toptions.imageMaxHeight ?? globalConfig.options?.imageMaxHeight ?? 2160;\n\n\t\t// Bundle caching configuration (plugin > config > default)\n\t\tconst bundleMaxAge =\n\t\t\toptions.bundleMaxAge ?? globalConfig.options?.bundleMaxAge ?? 3600; // 1 hour default for main bundle\n\n\t\t// Streaming configuration (plugin > config > default: disabled)\n\t\tconst streamingEnabled =\n\t\t\toptions.streaming?.enabled ?? globalConfig.streaming?.enabled ?? false;\n\n\t\t// Normalize prefix\n\t\tif (prefix === '/') prefix = '';\n\n\t\tconst fileCache = new LRUCache<string, Response>(100);\n\t\tconst dataCache = new LRUCache<string, unknown>(100);\n\t\tconst collectionCache = new LRUCache<string, Response>(50);\n\n\t\t// Live reload SSE clients + pending reload if no clients connected\n\t\tconst liveReloadState = {\n\t\t\tclients: new Set<ReadableStreamDefaultController>(),\n\t\t\tpendingReload: false,\n\t\t};\n\t\tconst reloadEncoder = new TextEncoder();\n\t\tconst reloadMessage = reloadEncoder.encode('data: reload\\n\\n');\n\t\tconst notifyReload = () => {\n\t\t\tlet delivered = false;\n\t\t\tfor (const controller of liveReloadState.clients) {\n\t\t\t\ttry {\n\t\t\t\t\tcontroller.enqueue(reloadMessage);\n\t\t\t\t\tdelivered = true;\n\t\t\t\t} catch {\n\t\t\t\t\tliveReloadState.clients.delete(controller);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!delivered) {\n\t\t\t\t// Remember to reload once the next client connects\n\t\t\t\tliveReloadState.pendingReload = true;\n\t\t\t}\n\t\t};\n\n\t\tconst clientDir: string = assets.startsWith('/')\n\t\t\t? assets\n\t\t\t: `${cwd.replace(/\\/$/, '')}/${assets.replace(/^\\.\\//, '')}`;\n\n\t\tconst shouldIgnore = !ignorePatterns.length\n\t\t\t? () => false\n\t\t\t: (file: string) =>\n\t\t\t\t\tignorePatterns.find((pattern) =>\n\t\t\t\t\t\ttypeof pattern === 'string'\n\t\t\t\t\t\t\t? file.includes(pattern)\n\t\t\t\t\t\t\t: pattern.test(file),\n\t\t\t\t\t);\n\n\t\tconst isWatchMode =\n\t\t\t(Array.isArray(process.execArgv) &&\n\t\t\t\tprocess.execArgv.includes('--watch')) ||\n\t\t\t(Array.isArray(process.argv) && process.argv.includes('--watch'));\n\n\t\t// Shared cache-control for data responses (prefetch + client navigations)\n\t\t// Align with static caching to reduce repeated XHRs even in dev.\n\t\tconst dataCacheControl = `${directive}, max-age=${maxAge}`;\n\n\t\tif (isWatchMode) console.log(`[reroute] Live reload enabled`);\n\n\t\t// Find bundle URL by scanning bundles directory\n\t\tconst readBundleUrl = async (): Promise<string> => {\n\t\t\tconst bundlesDir = `${cwd}/.reroute/bundles`;\n\t\t\tconst maxAttempts = isWatchMode ? 50 : 5;\n\t\t\tconst sleepMs = isWatchMode ? 100 : 250;\n\n\t\t\tfor (let attempt = 0; attempt < maxAttempts; attempt++) {\n\t\t\t\ttry {\n\t\t\t\t\tconst glob = new Bun.Glob('index.*.js');\n\t\t\t\t\tconst files = await Array.fromAsync(glob.scan(bundlesDir));\n\t\t\t\t\tconst indexFile =\n\t\t\t\t\t\tfiles.find((f) => !f.includes('.stub.')) || files[0];\n\t\t\t\t\tif (indexFile) {\n\t\t\t\t\t\treturn `/bundles/${indexFile}`;\n\t\t\t\t\t}\n\t\t\t\t} catch {\n\t\t\t\t\t// Directory might not exist yet or be empty during rebuild\n\t\t\t\t}\n\n\t\t\t\tif (attempt === 0) {\n\t\t\t\t\tconsole.warn('[reroute] Waiting for bundles to be generated...');\n\t\t\t\t}\n\t\t\t\tawait Bun.sleep(sleepMs);\n\t\t\t}\n\n\t\t\tthrow new Error('Bundle not found. Run `reroute gen` first.');\n\t\t};\n\n\t\t// Read bundle URL at startup and verify it works\n\t\tconst initialBundleUrl = await readBundleUrl();\n\t\tconsole.log(`[reroute] Using pre-built bundle: ${initialBundleUrl}`);\n\n\t\t// Global HEAD request handler (Elysia has a bug with automatic HEAD handling)\n\t\t// Catch the error in onError and return proper response\n\t\tapp.onError(({ request, set, error }) => {\n\t\t\tif ('status' in error && error.status === 404) {\n\t\t\t\tset.status = 404;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (request.method === 'HEAD') {\n\t\t\t\tconsole.log('[reroute] HEAD request received');\n\t\t\t\tset.status = 200;\n\t\t\t\tset.headers['Content-Type'] = 'text/plain';\n\t\t\t\treturn '';\n\t\t\t}\n\t\t\tconsole.error('[reroute] 🚨 Server error:', error);\n\t\t});\n\n\t\t// Register content routes\n\t\tregisterContentRoutes(\n\t\t\tapp,\n\t\t\tcwd,\n\t\t\tcollectionCache,\n\t\t\tdirective,\n\t\t\tmaxAge,\n\t\t\tisWatchMode,\n\t\t);\n\n\t\t// Register internal routes (preload, data endpoints - always needed)\n\t\tregisterInternalRoutes(app, {\n\t\t\tclientDir,\n\t\t\tcwd,\n\t\t\tdataCacheControl,\n\t\t\tdataCache,\n\t\t\tisWatchMode,\n\t\t});\n\n\t\t// Register live reload routes (dev mode only)\n\t\tif (isWatchMode) {\n\t\t\tregisterLiveReloadRoutes(app, liveReloadState);\n\t\t}\n\n\t\t// Reload endpoint: notify browser clients to reload and clear caches\n\t\tif (isWatchMode) {\n\t\t\tapp.post('/__reroute_reload', () => {\n\t\t\t\t// Clear file cache to ensure fresh bundles are served\n\t\t\t\tfileCache.clear();\n\t\t\t\t// Clear data cache to ensure fresh SSR data\n\t\t\t\tdataCache.clear();\n\n\t\t\t\tnotifyReload();\n\t\t\t\treturn new Response(JSON.stringify({ ok: true }), {\n\t\t\t\t\theaders: { 'content-type': 'application/json' },\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\n\t\t// Register artifacts routes (.reroute directory)\n\t\tregisterArtifactsRoutes(app, cwd, fileCache, {\n\t\t\tbundleMaxAge,\n\t\t\tdirective,\n\t\t\tisWatchMode,\n\t\t});\n\n\t\t// Initialize and register image optimization routes\n\t\tconst imageCacheDir = `${cwd}/.reroute/image-cache`;\n\t\tinitImageCache(imageCacheDir);\n\t\tregisterImageRoutes(app, {\n\t\t\tclientDir,\n\t\t\tmaxAge: imageMaxAge,\n\t\t\tallowedDomains: imageAllowedDomains,\n\t\t\tmaxWidth: imageMaxWidth,\n\t\t\tmaxHeight: imageMaxHeight,\n\t\t\tcompression,\n\t\t});\n\n\t\t// Register SSR routes if root component is provided\n\t\tif (rootComponent) {\n\t\t\ttry {\n\t\t\t\tconst collections = await discoverCollections(clientDir);\n\t\t\t\tif (collections.length > 0) {\n\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t`[reroute] Discovered collections: ${collections.join(', ')}`,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tregisterSSRRoutes(app, {\n\t\t\t\t\trootComponent: rootComponent as ReactElement,\n\t\t\t\t\tclientDir,\n\t\t\t\t\tcwd,\n\t\t\t\t\tisWatchMode,\n\t\t\t\t\tgetBundleUrl: readBundleUrl,\n\t\t\t\t\thead: ssrHead,\n\t\t\t\t\tlang: ssrLang,\n\t\t\t\t\tappId: ssrAppId,\n\t\t\t\t\tcollections,\n\t\t\t\t\tminify,\n\t\t\t\t\tmaxAge,\n\t\t\t\t\tdirective,\n\t\t\t\t\tdataCacheControl,\n\t\t\t\t\tdataCache,\n\t\t\t\t\tcompression,\n\t\t\t\t\tstreamingEnabled,\n\t\t\t\t\tshouldIgnorePathname: (pathname: string) => {\n\t\t\t\t\t\t// Honor ignorePatterns for SSR fallback as well\n\t\t\t\t\t\tif (!ignorePatterns.length) return false;\n\t\t\t\t\t\treturn Boolean(\n\t\t\t\t\t\t\tignorePatterns.find((pattern) =>\n\t\t\t\t\t\t\t\ttypeof pattern === 'string'\n\t\t\t\t\t\t\t\t\t? pathname.includes(pattern)\n\t\t\t\t\t\t\t\t\t: pattern.test(pathname),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error('[reroute] Failed to register SSR routes:', error);\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t}\n\n\t\t// Register static file serving (must be last as it's a catch-all)\n\t\tregisterStaticRoutes(app, {\n\t\t\tclientDir,\n\t\t\tprefix,\n\t\t\tmaxAge,\n\t\t\tdirective,\n\t\t\tindexHTML,\n\t\t\tstaticHeaders,\n\t\t\tshouldIgnore: shouldIgnore as () => boolean,\n\t\t\tfileCache,\n\t\t\tisWatchMode,\n\t\t\tcompression,\n\t\t});\n\n\t\treturn app;\n\t};\n\nexport { reroute };\n",
|
|
18
33
|
"import { existsSync } from 'node:fs';\nimport { join } from 'node:path';\nimport sharp from 'sharp';\n\ninterface ImageTransformOptions {\n\twidth?: number;\n\theight?: number;\n\tquality?: number;\n\tformat?: 'webp' | 'avif' | 'jpeg' | 'png' | 'auto';\n\tfit?: 'cover' | 'contain' | 'fill' | 'inside' | 'outside';\n}\n\ninterface ImageOptimizationResult {\n\tbuffer: Buffer;\n\tcontentType: string;\n\tformat: string;\n\twidth: number;\n\theight: number;\n\tsize: number;\n}\n\n// In-memory cache for transformed images\nconst imageCache = new Map<string, ImageOptimizationResult>();\nconst MAX_CACHE_SIZE = 100; // Maximum number of images to cache in memory\n\n// Disk cache directory\nlet diskCacheDir: string | null = null;\n\n/**\n * Initialize disk cache directory\n */\nexport function initImageCache(cacheDir: string) {\n\tdiskCacheDir = cacheDir;\n}\n\n/**\n * Generate cache key for image transformation\n */\nfunction getCacheKey(\n\timagePath: string,\n\toptions: ImageTransformOptions,\n): string {\n\tconst optionsString = JSON.stringify(options);\n\tconst hasher = new Bun.CryptoHasher('sha256');\n\thasher.update(`${imagePath}:${optionsString}`);\n\tconst hash = hasher.digest('hex');\n\treturn hash;\n}\n\n/**\n * Get content type for image format\n */\nfunction getContentType(format: string): string {\n\tconst contentTypes: Record<string, string> = {\n\t\twebp: 'image/webp',\n\t\tavif: 'image/avif',\n\t\tjpeg: 'image/jpeg',\n\t\tjpg: 'image/jpeg',\n\t\tpng: 'image/png',\n\t\tgif: 'image/gif',\n\t};\n\treturn contentTypes[format] || 'image/jpeg';\n}\n\n/**\n * Determine optimal format based on Accept header\n */\nfunction negotiateFormat(\n\tacceptHeader: string | undefined,\n\trequestedFormat: string | undefined,\n): 'webp' | 'avif' | 'jpeg' | 'png' {\n\t// If format is explicitly requested, use it\n\tif (\n\t\trequestedFormat &&\n\t\t['webp', 'avif', 'jpeg', 'png'].includes(requestedFormat)\n\t) {\n\t\treturn requestedFormat as 'webp' | 'avif' | 'jpeg' | 'png';\n\t}\n\n\t// Parse Accept header\n\tconst accept = acceptHeader?.toLowerCase() || '';\n\n\t// Check for AVIF support (best compression)\n\tif (accept.includes('image/avif')) {\n\t\treturn 'avif';\n\t}\n\n\t// Check for WebP support (good compression, wide support)\n\tif (accept.includes('image/webp')) {\n\t\treturn 'webp';\n\t}\n\n\t// Default to JPEG\n\treturn 'jpeg';\n}\n\n/**\n * Load image from disk cache\n */\nasync function loadFromDiskCache(\n\tcacheKey: string,\n): Promise<ImageOptimizationResult | null> {\n\tif (!diskCacheDir) return null;\n\n\ttry {\n\t\tconst cachePath = join(diskCacheDir, `${cacheKey}.json`);\n\t\tconst imagePath = join(diskCacheDir, `${cacheKey}.img`);\n\n\t\tif (!existsSync(cachePath) || !existsSync(imagePath)) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst metadata = JSON.parse(await Bun.file(cachePath).text());\n\t\tconst buffer = Buffer.from(await Bun.file(imagePath).arrayBuffer());\n\n\t\treturn {\n\t\t\tbuffer,\n\t\t\tcontentType: metadata.contentType,\n\t\t\tformat: metadata.format,\n\t\t\twidth: metadata.width,\n\t\t\theight: metadata.height,\n\t\t\tsize: metadata.size,\n\t\t};\n\t} catch {\n\t\treturn null;\n\t}\n}\n\n/**\n * Save image to disk cache\n */\nasync function saveToDiskCache(\n\tcacheKey: string,\n\tresult: ImageOptimizationResult,\n): Promise<void> {\n\tif (!diskCacheDir) return;\n\n\ttry {\n\t\tconst cachePath = join(diskCacheDir, `${cacheKey}.json`);\n\t\tconst imagePath = join(diskCacheDir, `${cacheKey}.img`);\n\n\t\t// Save metadata\n\t\tawait Bun.write(\n\t\t\tcachePath,\n\t\t\tJSON.stringify({\n\t\t\t\tcontentType: result.contentType,\n\t\t\t\tformat: result.format,\n\t\t\t\twidth: result.width,\n\t\t\t\theight: result.height,\n\t\t\t\tsize: result.size,\n\t\t\t}),\n\t\t);\n\n\t\t// Save image buffer\n\t\tawait Bun.write(imagePath, result.buffer);\n\t} catch (error) {\n\t\tconsole.error('Failed to save image to disk cache:', error);\n\t}\n}\n\n/**\n * Optimize and transform image using Sharp\n */\nexport async function optimizeImage(\n\timagePath: string,\n\toptions: ImageTransformOptions,\n\tacceptHeader?: string,\n): Promise<ImageOptimizationResult> {\n\t// Generate cache key\n\tconst cacheKey = getCacheKey(imagePath, options);\n\n\t// Check in-memory cache first\n\tconst memCached = imageCache.get(cacheKey);\n\tif (memCached) {\n\t\treturn memCached;\n\t}\n\n\t// Check disk cache\n\tconst diskCached = await loadFromDiskCache(cacheKey);\n\tif (diskCached) {\n\t\t// Add to memory cache\n\t\tif (imageCache.size >= MAX_CACHE_SIZE) {\n\t\t\t// Remove oldest entry\n\t\t\tconst firstKey = imageCache.keys().next().value;\n\t\t\tif (firstKey) {\n\t\t\t\timageCache.delete(firstKey);\n\t\t\t}\n\t\t}\n\t\timageCache.set(cacheKey, diskCached);\n\t\treturn diskCached;\n\t}\n\n\t// Read source image\n\tlet sourceBuffer: Buffer;\n\tif (imagePath.startsWith('http://') || imagePath.startsWith('https://')) {\n\t\t// Fetch remote image\n\t\tconst response = await fetch(imagePath);\n\t\tif (!response.ok) {\n\t\t\tthrow new Error(\n\t\t\t\t`Failed to fetch image: ${response.status} ${response.statusText}`,\n\t\t\t);\n\t\t}\n\t\tconst arrayBuffer = await response.arrayBuffer();\n\t\tsourceBuffer = Buffer.from(arrayBuffer);\n\t} else {\n\t\t// Read local file\n\t\tsourceBuffer = Buffer.from(await Bun.file(imagePath).arrayBuffer());\n\t}\n\n\t// Determine output format\n\tconst format =\n\t\toptions.format === 'auto' || !options.format\n\t\t\t? negotiateFormat(acceptHeader, undefined)\n\t\t\t: options.format;\n\n\t// Initialize sharp instance\n\tlet transformer = sharp(sourceBuffer);\n\n\t// Get source metadata\n\tconst metadata = await transformer.metadata();\n\n\t// Apply resize if width or height is specified\n\tif (options.width || options.height) {\n\t\tconst resizeOptions: sharp.ResizeOptions = {\n\t\t\twidth: options.width,\n\t\t\theight: options.height,\n\t\t\tfit: options.fit || 'cover',\n\t\t\twithoutEnlargement: true, // Don't upscale images\n\t\t};\n\t\ttransformer = transformer.resize(resizeOptions);\n\t}\n\n\t// Apply format-specific optimizations\n\tconst quality = options.quality ?? 75;\n\n\tswitch (format) {\n\t\tcase 'webp':\n\t\t\ttransformer = transformer.webp({\n\t\t\t\tquality,\n\t\t\t\teffort: 4, // Balance between speed and compression\n\t\t\t});\n\t\t\tbreak;\n\t\tcase 'avif':\n\t\t\ttransformer = transformer.avif({\n\t\t\t\tquality,\n\t\t\t\teffort: 4,\n\t\t\t});\n\t\t\tbreak;\n\t\tcase 'png':\n\t\t\ttransformer = transformer.png({\n\t\t\t\tquality,\n\t\t\t\tcompressionLevel: 9,\n\t\t\t\tadaptiveFiltering: true,\n\t\t\t});\n\t\t\tbreak;\n\t\tdefault:\n\t\t\ttransformer = transformer.jpeg({\n\t\t\t\tquality,\n\t\t\t\tmozjpeg: true, // Use mozjpeg for better compression\n\t\t\t});\n\t\t\tbreak;\n\t}\n\n\t// Execute transformation\n\tconst buffer = await transformer.toBuffer();\n\tconst info = await sharp(buffer).metadata();\n\n\tconst result: ImageOptimizationResult = {\n\t\tbuffer,\n\t\tcontentType: getContentType(format),\n\t\tformat,\n\t\twidth: info.width || metadata.width || options.width || 0,\n\t\theight: info.height || metadata.height || options.height || 0,\n\t\tsize: buffer.length,\n\t};\n\n\t// Save to disk cache\n\tawait saveToDiskCache(cacheKey, result);\n\n\t// Add to memory cache\n\tif (imageCache.size >= MAX_CACHE_SIZE) {\n\t\tconst firstKey = imageCache.keys().next().value;\n\t\tif (firstKey) {\n\t\t\timageCache.delete(firstKey);\n\t\t}\n\t}\n\timageCache.set(cacheKey, result);\n\n\treturn result;\n}\n\n/**\n * Check if path is an image file\n */\nexport function isImageFile(path: string): boolean {\n\tconst imageExtensions = ['.jpg', '.jpeg', '.png', '.webp', '.avif', '.gif'];\n\tconst ext = path.toLowerCase().split('.').pop();\n\treturn ext ? imageExtensions.includes(`.${ext}`) : false;\n}\n",
|
|
19
34
|
"import type { Elysia } from 'elysia';\nimport { NotFoundError } from 'elysia';\nimport {\n\tgetMimeType,\n\tgzipIfAccepted,\n\tjoin,\n\ttype LRUCache,\n} from 'reroute-js/core';\nimport { getEncoding } from '../libs/cache';\n\ntype ArtifactsOptions = {\n\tbundleMaxAge: number;\n\tdirective: string;\n\tisWatchMode?: boolean;\n};\n\n/**\n * Serve a static file with caching and compression\n */\nasync function serveStaticFile(\n\tfilePath: string,\n\theaders: Record<string, string>,\n\tfileCache: LRUCache<string, Response>,\n\tcacheControl: string,\n): Promise<Response> {\n\t// Determine encoding and create cache key\n\tconst acceptEncoding = headers['accept-encoding'] || '';\n\tconst encoding = getEncoding(acceptEncoding);\n\tconst cacheKey = `${filePath}:${encoding}`;\n\n\t// Check cache FIRST (before any filesystem I/O)\n\tconst cached = fileCache.get(cacheKey);\n\tif (cached) return cached.clone();\n\n\t// Cache miss - check if file exists\n\tconst exists = await Bun.file(filePath).exists();\n\tif (!exists) throw new NotFoundError();\n\n\t// Read and compress file\n\tconst buf = await Bun.file(filePath).arrayBuffer();\n\tconst content = new Uint8Array(buf);\n\tconst contentType = getMimeType(filePath);\n\tconst { body, extraHeaders } = gzipIfAccepted(\n\t\tcontent,\n\t\tcontentType,\n\t\theaders['accept-encoding'],\n\t);\n\n\t// Create response with appropriate headers\n\tconst response = new Response(body as string, {\n\t\theaders: {\n\t\t\t'Content-Type': contentType,\n\t\t\t'Cache-Control': cacheControl,\n\t\t\t...extraHeaders,\n\t\t},\n\t});\n\n\t// Cache with encoding-aware key\n\tfileCache.set(cacheKey, response);\n\n\treturn response.clone();\n}\n\nexport function registerArtifactsRoutes(\n\tapp: Elysia,\n\tcwd: string,\n\tfileCache: LRUCache<string, Response>,\n\toptions: ArtifactsOptions,\n): Elysia {\n\tconst { bundleMaxAge, directive, isWatchMode = false } = options;\n\t// Serve pre-built bundles and chunks from .reroute/bundles/\n\tapp.get('/bundles/*', async ({ params, headers }) => {\n\t\tconst fileName = String(params['*'] || '').replace(/^\\/+/, '');\n\t\tif (!fileName) throw new NotFoundError();\n\n\t\tconst filePath = join(cwd, '.reroute', 'bundles', fileName);\n\n\t\ttry {\n\t\t\t// In watch mode, disable browser caching to ensure fresh bundles\n\t\t\t// In production, content-hashed files get long-term caching\n\t\t\tlet cacheControl: string;\n\t\t\tif (isWatchMode) {\n\t\t\t\tcacheControl = 'no-cache, no-store, must-revalidate';\n\t\t\t} else {\n\t\t\t\t// Files matching pattern: [name].[hash].[ext] or chunk.[hash].[ext]\n\t\t\t\t// Bun uses alphanumeric hashes (not just hex), so match [a-z0-9]\n\t\t\t\tconst isContentHashed = /\\.([a-z0-9]{8,})\\.(js|css)$/i.test(fileName);\n\t\t\t\tcacheControl = isContentHashed\n\t\t\t\t\t? 'public, max-age=31536000, immutable'\n\t\t\t\t\t: bundleMaxAge > 0\n\t\t\t\t\t\t? `${directive}, max-age=${bundleMaxAge}`\n\t\t\t\t\t\t: 'no-cache';\n\t\t\t}\n\n\t\t\treturn await serveStaticFile(\n\t\t\t\tfilePath,\n\t\t\t\theaders as Record<string, string>,\n\t\t\t\tfileCache,\n\t\t\t\tcacheControl,\n\t\t\t);\n\t\t} catch (e) {\n\t\t\tif (e instanceof NotFoundError) throw e;\n\t\t\tconsole.error('[reroute] Failed to serve bundle:', filePath, e);\n\t\t\tthrow new NotFoundError();\n\t\t}\n\t});\n\n\t// Serve generated collections from .reroute/collections/\n\tapp.get('/.reroute/collections/*', async ({ params, headers }) => {\n\t\tconst fileName = String(params['*'] || '').replace(/^\\/+/, '');\n\t\tif (!fileName) throw new NotFoundError();\n\n\t\tconst filePath = join(cwd, '.reroute', 'collections', fileName);\n\n\t\ttry {\n\t\t\t// Collections: no-cache in watch mode, immutable in production\n\t\t\tconst cacheControl = isWatchMode\n\t\t\t\t? 'no-cache, no-store, must-revalidate'\n\t\t\t\t: 'public, max-age=31536000, immutable';\n\n\t\t\treturn await serveStaticFile(\n\t\t\t\tfilePath,\n\t\t\t\theaders as Record<string, string>,\n\t\t\t\tfileCache,\n\t\t\t\tcacheControl,\n\t\t\t);\n\t\t} catch (e) {\n\t\t\tif (e instanceof NotFoundError) throw e;\n\t\t\tconsole.error('[reroute] Failed to serve collection file:', filePath, e);\n\t\t\tthrow new NotFoundError();\n\t\t}\n\t});\n\n\treturn app;\n}\n",
|
|
20
35
|
"/**\n * Determine encoding that will be used (matches gzipIfAccepted priority: Brotli > Gzip > Raw)\n */\nexport function getEncoding(acceptEncoding: string): 'br' | 'gz' | 'raw' {\n\treturn /\\bbr\\b/i.test(acceptEncoding)\n\t\t? 'br'\n\t\t: /gzip/i.test(acceptEncoding)\n\t\t\t? 'gz'\n\t\t\t: 'raw';\n}\n",
|
|
21
36
|
"import type { Elysia } from 'elysia';\nimport { NotFoundError } from 'elysia';\nimport type { LRUCache } from 'reroute-js/core';\nimport { join } from 'reroute-js/core';\n\nexport function registerContentRoutes(\n\tapp: Elysia,\n\tcwd: string,\n\tcollectionCache: LRUCache<string, Response>,\n\tdirective: string,\n\tmaxAge: number,\n\tisWatchMode: boolean,\n): Elysia {\n\t// Content manifest endpoint (JSON) - serves pre-generated collection files\n\tapp.get('/__content/*', async ({ params }) => {\n\t\tconst collectionPath = String(params['*'] || '').trim();\n\t\tif (!collectionPath) throw new NotFoundError();\n\n\t\tconst cacheKey = `content:${collectionPath}`;\n\n\t\t// Check cache first (consistent in all modes)\n\t\tconst cached = collectionCache.get(cacheKey);\n\t\tif (cached) return cached.clone();\n\n\t\ttry {\n\t\t\t// Load pre-generated collection module\n\t\t\tconst collectionFile = join(\n\t\t\t\tcwd,\n\t\t\t\t'.reroute',\n\t\t\t\t'collections',\n\t\t\t\t`${collectionPath}.js`,\n\t\t\t);\n\t\t\tconst exists = await Bun.file(collectionFile).exists();\n\t\t\tif (!exists) throw new NotFoundError();\n\n\t\t\t// Import the collection module\n\t\t\tconst url = `${Bun.pathToFileURL(collectionFile).href}${isWatchMode ? `?t=${Date.now()}` : ''}`;\n\t\t\tconst mod = await import(url);\n\t\t\tconst items = mod.items || [];\n\n\t\t\tconst body = JSON.stringify({ collection: collectionPath, items });\n\t\t\tconst response = new Response(body, {\n\t\t\t\tstatus: 200,\n\t\t\t\theaders: {\n\t\t\t\t\t'content-type': 'application/json; charset=utf-8',\n\t\t\t\t\t'cache-control': `${directive}, max-age=${maxAge}`,\n\t\t\t\t},\n\t\t\t});\n\n\t\t\t// Cache the response\n\t\t\tcollectionCache.set(cacheKey, response);\n\n\t\t\treturn response.clone();\n\t\t} catch (e) {\n\t\t\tif (e instanceof NotFoundError) throw e;\n\t\t\tconsole.error(\n\t\t\t\t`[reroute] Failed to serve collection ${collectionPath}:`,\n\t\t\t\te,\n\t\t\t);\n\t\t\tthrow new NotFoundError();\n\t\t}\n\t});\n\n\treturn app;\n}\n",
|
|
22
|
-
"import
|
|
23
|
-
"import {
|
|
24
|
-
"import type { Elysia } from 'elysia';\nimport { NotFoundError } from 'elysia';\nimport type { ReactElement } from 'react';\nimport {\n\tcomputeSSRDataForPath,\n\tgzipIfAccepted,\n\tLRUCache,\n\trenderSSRDocument,\n} from 'reroute-js/core';\nimport { jsonError, jsonWithCache } from '../libs/http';\n\ntype SSRRouteOptions = {\n\trootComponent: ReactElement;\n\tclientDir: string;\n\tcwd: string;\n\tisWatchMode: boolean;\n\tgetBundleUrl: () => Promise<string>;\n\thead?: string;\n\tlang?: string;\n\tappId?: string;\n\tcollections: string[];\n\tminify?: boolean;\n\tmaxAge?: number;\n\tdirective?: string;\n\tdataCacheControl?: string;\n\tdataCache?: LRUCache<string, unknown>;\n\tshouldIgnorePathname?: (pathname: string) => boolean;\n};\n\nfunction registerSSRRoutes(app: Elysia, options: SSRRouteOptions): Elysia {\n\tconst {\n\t\trootComponent,\n\t\tclientDir,\n\t\tcwd,\n\t\tisWatchMode,\n\t\tgetBundleUrl,\n\t\thead = '',\n\t\tlang = 'en',\n\t\tappId = 'root',\n\t\tcollections,\n\t\tminify = false,\n\t\tmaxAge = 3600,\n\t\tdirective = 'public',\n\t\tdataCacheControl,\n\t\tdataCache,\n\t\tshouldIgnorePathname,\n\t} = options;\n\n\t// Cache SSR HTML in-memory for 5 minutes (consistent in all modes)\n\tconst SSR_HTML_TTL_MS = 5 * 60 * 1000;\n\tconst htmlCache = new LRUCache<\n\t\tstring,\n\t\t{\n\t\t\tstatus: number;\n\t\t\theaders: Record<string, string>;\n\t\t\tbody: BodyInit;\n\t\t\texp: number;\n\t\t}\n\t>(200);\n\tconst makeKey = (pathname: string, acceptEncoding: string | undefined) =>\n\t\t`${pathname}::${acceptEncoding || 'identity'}`;\n\n\t// Register SSR routes for each collection\n\tfor (const collection of collections) {\n\t\tapp.get(`/${collection}/*`, async ({ request, headers }) => {\n\t\t\tconst method = request.method || 'GET';\n\n\t\t\t// Reject HEAD requests early to avoid Elysia bug\n\t\t\tif (method === 'HEAD') {\n\t\t\t\treturn new Response(null, {\n\t\t\t\t\tstatus: 200,\n\t\t\t\t\theaders: { 'content-type': 'text/html; charset=utf-8' },\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (method !== 'GET') throw new NotFoundError();\n\t\t\tconst accept = request.headers.get?.('accept') || '';\n\t\t\tif (!/text\\/html/i.test(String(accept))) throw new NotFoundError();\n\t\t\ttry {\n\t\t\t\tconst url = new URL(request.url);\n\t\t\t\tconst pathname = url.pathname;\n\t\t\t\tconst acceptEncoding = headers['accept-encoding'] || '';\n\n\t\t\t\t// Serve cached HTML if fresh (skip cache in watch mode)\n\t\t\t\tif (!isWatchMode && SSR_HTML_TTL_MS > 0) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst ck = makeKey(pathname, acceptEncoding);\n\t\t\t\t\t\tconst cached = htmlCache.get(ck);\n\t\t\t\t\t\tif (cached && cached.exp > Date.now()) {\n\t\t\t\t\t\t\treturn new Response(cached.body, {\n\t\t\t\t\t\t\t\tstatus: cached.status,\n\t\t\t\t\t\t\t\theaders: cached.headers,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch {}\n\t\t\t\t}\n\n\t\t\t\tconst bundleUrl = await getBundleUrl();\n\t\t\t\t// Compose Early Hints (103) and Link header for main bundle\n\t\t\t\ttry {\n\t\t\t\t\tconst linkValue = `<${bundleUrl}>; rel=modulepreload; as=script`;\n\t\t\t\t\t// Best-effort Early Hints (if supported by runtime)\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst hints = new Headers({ Link: linkValue });\n\t\t\t\t\t\t// @ts-expect-error runtime specific hook\n\t\t\t\t\t\t(request as Any)?.sendEarlyHints?.(hints);\n\t\t\t\t\t} catch {}\n\t\t\t\t\t// Also attach Link on final response\n\t\t\t\t\theaders.link = headers.link\n\t\t\t\t\t\t? `${headers.link}, ${linkValue}`\n\t\t\t\t\t\t: linkValue;\n\t\t\t\t} catch {}\n\t\t\t\tconst result = await renderSSRDocument({\n\t\t\t\t\tpathname,\n\t\t\t\t\trootComponent,\n\t\t\t\t\tclientDir,\n\t\t\t\t\tcwd,\n\t\t\t\t\tisWatchMode,\n\t\t\t\t\tbundleUrl,\n\t\t\t\t\thead,\n\t\t\t\t\tlang,\n\t\t\t\t\tappId,\n\t\t\t\t\tminify,\n\t\t\t\t});\n\n\t\t\t\tconst { body, extraHeaders } = gzipIfAccepted(\n\t\t\t\t\tresult.html,\n\t\t\t\t\t'text/html; charset=utf-8',\n\t\t\t\t\tacceptEncoding,\n\t\t\t\t);\n\n\t\t\t\t// Use no-cache headers in watch mode to ensure fresh content\n\t\t\t\tconst cacheControlHeader = isWatchMode\n\t\t\t\t\t? 'no-cache, no-store, must-revalidate'\n\t\t\t\t\t: `${directive}, max-age=${maxAge}`;\n\n\t\t\t\tconst resHeaders: Record<string, string> = {\n\t\t\t\t\t'content-type': 'text/html; charset=utf-8',\n\t\t\t\t\t'cache-control': cacheControlHeader,\n\t\t\t\t\t...(headers.link ? { link: headers.link } : {}),\n\t\t\t\t\t...extraHeaders,\n\t\t\t\t};\n\n\t\t\t\tconst response = new Response(body as BodyInit, {\n\t\t\t\t\tstatus: result.status,\n\t\t\t\t\theaders: resHeaders,\n\t\t\t\t});\n\n\t\t\t\t// Cache successful renders (skip in watch mode)\n\t\t\t\tif (!isWatchMode && SSR_HTML_TTL_MS > 0 && result.status === 200) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst ck = makeKey(pathname, acceptEncoding);\n\t\t\t\t\t\thtmlCache.set(ck, {\n\t\t\t\t\t\t\tstatus: result.status,\n\t\t\t\t\t\t\theaders: resHeaders,\n\t\t\t\t\t\t\tbody: body as BodyInit,\n\t\t\t\t\t\t\texp: Date.now() + SSR_HTML_TTL_MS,\n\t\t\t\t\t\t});\n\t\t\t\t\t} catch {}\n\t\t\t\t}\n\n\t\t\t\treturn response;\n\t\t\t} catch (e) {\n\t\t\t\tconsole.error(`[reroute] SSR ${collection} render error:`, e);\n\t\t\t\tthrow new NotFoundError();\n\t\t\t}\n\t\t});\n\t}\n\n\t// Global error handler for SSR fallback\n\tapp.onError(async ({ code, request, set }) => {\n\t\tif (code === 'NOT_FOUND') {\n\t\t\tconst url = new URL(request.url);\n\t\t\tconst pathname = url.pathname;\n\t\t\tconst method = request.method || 'GET';\n\t\t\tconst isInternal =\n\t\t\t\tpathname.startsWith('/__reroute_watch') ||\n\t\t\t\tpathname.startsWith('/__content/') ||\n\t\t\t\tpathname.startsWith('/__reroute_preload') ||\n\t\t\t\tpathname.startsWith('/__reroute_data') ||\n\t\t\t\tpathname.startsWith('/__reroute_watch.js');\n\n\t\t\tif (!isInternal && typeof shouldIgnorePathname === 'function') {\n\t\t\t\ttry {\n\t\t\t\t\tif (shouldIgnorePathname(pathname)) {\n\t\t\t\t\t\treturn new Response('Not Found', { status: 404 });\n\t\t\t\t\t}\n\t\t\t\t} catch {}\n\t\t\t}\n\n\t\t\tif (pathname === '/__reroute_data' && method === 'GET') {\n\t\t\t\ttry {\n\t\t\t\t\tconst p = url.searchParams.get('path') || '/';\n\n\t\t\t\t\t// Check cache first (consistent in all modes)\n\t\t\t\t\tlet data = dataCache?.get(p);\n\n\t\t\t\t\tif (data === undefined) {\n\t\t\t\t\t\tdata = await computeSSRDataForPath({\n\t\t\t\t\t\t\tpathname: p,\n\t\t\t\t\t\t\tclientDir,\n\t\t\t\t\t\t\tcwd,\n\t\t\t\t\t\t\tisWatchMode,\n\t\t\t\t\t\t});\n\t\t\t\t\t\t// Cache the result (even in watch mode for request deduplication)\n\t\t\t\t\t\tdataCache?.set(p, data);\n\t\t\t\t\t}\n\n\t\t\t\t\treturn jsonWithCache(\n\t\t\t\t\t\t{ data },\n\t\t\t\t\t\tdataCacheControl || 'no-cache',\n\t\t\t\t\t\trequest.headers,\n\t\t\t\t\t);\n\t\t\t\t} catch (_e) {\n\t\t\t\t\treturn jsonError('failed', 500);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ((method === 'GET' || method === 'HEAD') && !isInternal) {\n\t\t\t\t// Reject HEAD requests early to avoid Elysia bug\n\t\t\t\tif (method === 'HEAD') {\n\t\t\t\t\tset.status = 200;\n\t\t\t\t\tset.headers['content-type'] = 'text/html; charset=utf-8';\n\t\t\t\t\treturn new Response(null);\n\t\t\t\t}\n\n\t\t\t\ttry {\n\t\t\t\t\tconst acceptEncoding = request.headers.get('accept-encoding') || '';\n\t\t\t\t\t// Serve cached HTML if fresh (skip cache in watch mode)\n\t\t\t\t\tif (!isWatchMode && SSR_HTML_TTL_MS > 0) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst ck = makeKey(pathname, acceptEncoding);\n\t\t\t\t\t\t\tconst cached = htmlCache.get(ck);\n\t\t\t\t\t\t\tif (cached && cached.exp > Date.now()) {\n\t\t\t\t\t\t\t\tset.status = cached.status;\n\t\t\t\t\t\t\t\tObject.assign(set.headers, cached.headers);\n\t\t\t\t\t\t\t\treturn new Response(cached.body);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} catch {}\n\t\t\t\t\t}\n\n\t\t\t\t\tconst bundleUrl = await getBundleUrl();\n\t\t\t\t\t// Compose Early Hints (103) and Link header for main bundle\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst linkValue = `<${bundleUrl}>; rel=modulepreload; as=script`;\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst hints = new Headers({ Link: linkValue });\n\t\t\t\t\t\t\t// @ts-expect-error runtime specific hook\n\t\t\t\t\t\t\t(request as Any)?.sendEarlyHints?.(hints);\n\t\t\t\t\t\t} catch {}\n\t\t\t\t\t\tset.headers.link = set.headers.link\n\t\t\t\t\t\t\t? `${set.headers.link}, ${linkValue}`\n\t\t\t\t\t\t\t: linkValue;\n\t\t\t\t\t} catch {}\n\t\t\t\t\tconst result = await renderSSRDocument({\n\t\t\t\t\t\tpathname,\n\t\t\t\t\t\trootComponent,\n\t\t\t\t\t\tclientDir,\n\t\t\t\t\t\tcwd,\n\t\t\t\t\t\tisWatchMode,\n\t\t\t\t\t\tbundleUrl,\n\t\t\t\t\t\thead,\n\t\t\t\t\t\tlang,\n\t\t\t\t\t\tappId,\n\t\t\t\t\t\tminify,\n\t\t\t\t\t});\n\n\t\t\t\t\tconst { body, extraHeaders } = gzipIfAccepted(\n\t\t\t\t\t\tresult.html,\n\t\t\t\t\t\t'text/html; charset=utf-8',\n\t\t\t\t\t\tacceptEncoding,\n\t\t\t\t\t);\n\n\t\t\t\t\tset.status = result.status;\n\t\t\t\t\tset.headers['content-type'] = 'text/html; charset=utf-8';\n\t\t\t\t\t// Use no-cache headers in watch mode to ensure fresh content\n\t\t\t\t\tset.headers['cache-control'] = isWatchMode\n\t\t\t\t\t\t? 'no-cache, no-store, must-revalidate'\n\t\t\t\t\t\t: `${directive}, max-age=${maxAge}`;\n\n\t\t\t\t\tif (extraHeaders['Content-Encoding']) {\n\t\t\t\t\t\tset.headers['content-encoding'] = extraHeaders['Content-Encoding'];\n\t\t\t\t\t}\n\t\t\t\t\tif (extraHeaders.Vary) {\n\t\t\t\t\t\tset.headers.vary = extraHeaders.Vary;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst response = new Response(body as BodyInit);\n\n\t\t\t\t\t// Cache successful renders (skip in watch mode)\n\t\t\t\t\tif (!isWatchMode && SSR_HTML_TTL_MS > 0 && result.status === 200) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst ck = makeKey(pathname, acceptEncoding);\n\t\t\t\t\t\t\thtmlCache.set(ck, {\n\t\t\t\t\t\t\t\tstatus: result.status,\n\t\t\t\t\t\t\t\theaders: Object.fromEntries(\n\t\t\t\t\t\t\t\t\tObject.entries(set.headers).map(([k, v]) => [k, String(v)]),\n\t\t\t\t\t\t\t\t) as Record<string, string>,\n\t\t\t\t\t\t\t\tbody: body as BodyInit,\n\t\t\t\t\t\t\t\texp: Date.now() + SSR_HTML_TTL_MS,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t} catch {}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn response;\n\t\t\t\t} catch {\n\t\t\t\t\t// fallthrough to default 404 if template fails\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n\n\treturn app;\n}\n\nexport { registerSSRRoutes };\n",
|
|
25
|
-
"import type { Elysia } from 'elysia';\nimport { NotFoundError } from 'elysia';\nimport {\n\tgetMimeType,\n\tgzipIfAccepted,\n\tjoin,\n\ttype LRUCache,\n} from 'reroute-js/core';\nimport { getEncoding } from '../libs/cache';\n\ntype StaticRouteOptions = {\n\tclientDir: string;\n\tprefix: string;\n\tmaxAge: number;\n\tdirective: string;\n\tindexHTML: boolean;\n\tstaticHeaders?: Record<string, string>;\n\tshouldIgnore: (file: string) => boolean;\n\tfileCache: LRUCache<string, Response>;\n\tisWatchMode?: boolean;\n};\n\nfunction registerStaticRoutes(\n\tapp: Elysia,\n\toptions: StaticRouteOptions,\n): Elysia {\n\tconst {\n\t\tclientDir,\n\t\tprefix,\n\t\tmaxAge,\n\t\tdirective,\n\t\tindexHTML,\n\t\tstaticHeaders,\n\t\tshouldIgnore,\n\t\tfileCache,\n\t\tisWatchMode = false,\n\t} = options;\n\n\t// Static files route (scoped under prefix, e.g. '/assets/*')\n\tapp.get(`${prefix}/*`, async ({ params, headers }) => {\n\t\tconst requestPath = params['*'];\n\n\t\tconst filePath = join(clientDir, requestPath);\n\n\t\ttry {\n\t\t\t// Determine encoding and create cache key\n\t\t\tconst acceptEncoding = headers['accept-encoding'] || '';\n\t\t\tconst encoding = getEncoding(acceptEncoding);\n\t\t\tconst cacheKey = `${filePath}:${encoding}`;\n\n\t\t\t// Check cache FIRST (before any filesystem I/O)\n\t\t\tconst cached = fileCache.get(cacheKey);\n\t\t\tif (cached) return cached.clone();\n\n\t\t\t// Cache miss - resolve file path\n\t\t\tlet actualFilePath = filePath;\n\t\t\tlet exists = await Bun.file(actualFilePath).exists();\n\n\t\t\tif (!exists && indexHTML) {\n\t\t\t\tactualFilePath = join(filePath, 'index.html');\n\t\t\t\texists = await Bun.file(actualFilePath).exists();\n\t\t\t}\n\n\t\t\tif (!exists) throw new NotFoundError();\n\n\t\t\t// Check if the resolved file should be ignored (e.g., index.html)\n\t\t\tif (shouldIgnore(actualFilePath)) throw new NotFoundError();\n\n\t\t\tconst contentBuf = await Bun.file(actualFilePath).arrayBuffer();\n\t\t\tconst content = new Uint8Array(contentBuf);\n\t\t\tconst contentType = getMimeType(actualFilePath);\n\n\t\t\tconst { body, extraHeaders } = gzipIfAccepted(\n\t\t\t\tcontent,\n\t\t\t\tcontentType,\n\t\t\t\theaders['accept-encoding'],\n\t\t\t);\n\n\t\t\t// Determine cache duration based on content type and watch mode\n\t\t\t// In watch mode, use no-cache for all source files (tsx, ts, js, css)\n\t\t\tlet cacheControl: string;\n\n\t\t\tif (isWatchMode) {\n\t\t\t\t// Source files like routes/*.tsx should never be cached in dev\n\t\t\t\tconst isSourceFile = /\\.(tsx?|jsx?|css)$/i.test(actualFilePath);\n\t\t\t\tcacheControl = isSourceFile\n\t\t\t\t\t? 'no-cache, no-store, must-revalidate'\n\t\t\t\t\t: `${directive}, max-age=${maxAge}`;\n\t\t\t} else {\n\t\t\t\tconst isLongLivedAsset =\n\t\t\t\t\tcontentType.startsWith('image/') ||\n\t\t\t\t\tcontentType.startsWith('font/') ||\n\t\t\t\t\tcontentType.includes('woff') ||\n\t\t\t\t\tcontentType.includes('ttf') ||\n\t\t\t\t\tcontentType.includes('otf');\n\n\t\t\t\tconst cacheMaxAge =\n\t\t\t\t\tmaxAge === 0 ? 0 : isLongLivedAsset ? 365 * 24 * 60 * 60 : maxAge;\n\n\t\t\t\tcacheControl =\n\t\t\t\t\tcacheMaxAge > 0\n\t\t\t\t\t\t? `${directive}, max-age=${cacheMaxAge}${isLongLivedAsset ? ', immutable' : ''}`\n\t\t\t\t\t\t: 'no-cache';\n\t\t\t}\n\n\t\t\tconst response = new Response(body as string, {\n\t\t\t\theaders: {\n\t\t\t\t\t'Content-Type': contentType,\n\t\t\t\t\t'Cache-Control': cacheControl,\n\t\t\t\t\t...extraHeaders,\n\t\t\t\t\t...staticHeaders,\n\t\t\t\t},\n\t\t\t});\n\n\t\t\tfileCache.set(cacheKey, response);\n\n\t\t\treturn response.clone();\n\t\t} catch (error) {\n\t\t\tif (error instanceof NotFoundError) throw error;\n\t\t\tconsole.error(`[reroute] Error serving ${filePath}:`, error);\n\t\t\tthrow new NotFoundError();\n\t\t}\n\t});\n\n\treturn app;\n}\n\nexport { registerStaticRoutes };\n",
|
|
26
|
-
"
|
|
37
|
+
"import { existsSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { Elysia } from 'elysia';\nimport { gzipIfAccepted } from 'reroute-js/core';\nimport { isImageFile, optimizeImage } from '../libs/image';\n\ninterface ImageRouteOptions {\n\tclientDir: string;\n\tmaxAge?: number;\n\tallowedDomains?: string[];\n\tmaxWidth?: number;\n\tmaxHeight?: number;\n\tcompression?: boolean;\n}\n\n/**\n * Register image optimization routes\n */\nexport function registerImageRoutes(\n\tapp: Elysia,\n\toptions: ImageRouteOptions,\n): void {\n\tconst {\n\t\tclientDir,\n\t\tmaxAge = 31536000, // 1 year in seconds\n\t\tallowedDomains = [],\n\t\tmaxWidth = 3840,\n\t\tmaxHeight = 2160,\n\t\tcompression = true,\n\t} = options;\n\n\tapp.get('/_reroute_image', async ({ query, headers, set }) => {\n\t\ttry {\n\t\t\t// Parse query parameters\n\t\t\tconst url = query.url as string | undefined;\n\t\t\tconst widthParam = query.w as string | undefined;\n\t\t\tconst heightParam = query.h as string | undefined;\n\t\t\tconst qualityParam = query.q as string | undefined;\n\t\t\tconst formatParam = query.f as string | undefined;\n\n\t\t\t// Validate required parameters\n\t\t\tif (!url) {\n\t\t\t\tset.status = 400;\n\t\t\t\treturn { error: 'Missing required parameter: url' };\n\t\t\t}\n\n\t\t\t// Parse numeric parameters\n\t\t\tconst width = widthParam ? Number.parseInt(widthParam, 10) : undefined;\n\t\t\tconst height = heightParam ? Number.parseInt(heightParam, 10) : undefined;\n\t\t\tconst quality = qualityParam\n\t\t\t\t? Number.parseInt(qualityParam, 10)\n\t\t\t\t: undefined;\n\n\t\t\t// Validate numeric parameters\n\t\t\tif (width !== undefined && (Number.isNaN(width) || width <= 0)) {\n\t\t\t\tset.status = 400;\n\t\t\t\treturn { error: 'Invalid width parameter' };\n\t\t\t}\n\n\t\t\tif (height !== undefined && (Number.isNaN(height) || height <= 0)) {\n\t\t\t\tset.status = 400;\n\t\t\t\treturn { error: 'Invalid height parameter' };\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\tquality !== undefined &&\n\t\t\t\t(Number.isNaN(quality) || quality < 1 || quality > 100)\n\t\t\t) {\n\t\t\t\tset.status = 400;\n\t\t\t\treturn { error: 'Invalid quality parameter (must be 1-100)' };\n\t\t\t}\n\n\t\t\t// Enforce maximum dimensions\n\t\t\tconst finalWidth = width && width > maxWidth ? maxWidth : width;\n\t\t\tconst finalHeight = height && height > maxHeight ? maxHeight : height;\n\n\t\t\t// Resolve image path\n\t\t\tlet imagePath: string;\n\n\t\t\t// Check if URL is external or internal\n\t\t\tif (url.startsWith('http://') || url.startsWith('https://')) {\n\t\t\t\t// External URL - check if domain is allowed\n\t\t\t\tconst urlObj = new URL(url);\n\t\t\t\tconst isAllowed = allowedDomains.some(\n\t\t\t\t\t(domain) =>\n\t\t\t\t\t\turlObj.hostname === domain ||\n\t\t\t\t\t\turlObj.hostname.endsWith(`.${domain}`),\n\t\t\t\t);\n\n\t\t\t\tif (!isAllowed) {\n\t\t\t\t\tset.status = 403;\n\t\t\t\t\treturn { error: 'Domain not allowed' };\n\t\t\t\t}\n\n\t\t\t\t// Use URL as cache key - don't fetch until cache miss\n\t\t\t\timagePath = url;\n\t\t\t} else {\n\t\t\t\t// Internal path - resolve relative to clientDir\n\t\t\t\tconst cleanUrl = url.startsWith('/') ? url.slice(1) : url;\n\t\t\t\timagePath = join(clientDir, cleanUrl);\n\n\t\t\t\t// Security check: ensure path is within clientDir\n\t\t\t\tconst normalizedPath = join(clientDir, cleanUrl);\n\t\t\t\tif (!normalizedPath.startsWith(clientDir)) {\n\t\t\t\t\tset.status = 403;\n\t\t\t\t\treturn { error: 'Access denied' };\n\t\t\t\t}\n\n\t\t\t\t// Check if file exists\n\t\t\t\tif (!existsSync(imagePath)) {\n\t\t\t\t\tset.status = 404;\n\t\t\t\t\treturn { error: 'Image not found' };\n\t\t\t\t}\n\n\t\t\t\t// Check if file is an image\n\t\t\t\tif (!isImageFile(imagePath)) {\n\t\t\t\t\tset.status = 400;\n\t\t\t\t\treturn { error: 'File is not a supported image format' };\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Determine output format\n\t\t\tconst acceptHeader = headers.accept;\n\t\t\tconst format = formatParam || 'auto';\n\n\t\t\t// Optimize image\n\t\t\tconst result = await optimizeImage(\n\t\t\t\timagePath,\n\t\t\t\t{\n\t\t\t\t\twidth: finalWidth,\n\t\t\t\t\theight: finalHeight,\n\t\t\t\t\tquality,\n\t\t\t\t\tformat: format as 'webp' | 'avif' | 'jpeg' | 'png' | 'auto',\n\t\t\t\t\tfit: 'cover',\n\t\t\t\t},\n\t\t\t\tacceptHeader,\n\t\t\t);\n\n\t\t\t// Apply compression if enabled\n\t\t\tconst { body, extraHeaders } = compression\n\t\t\t\t? gzipIfAccepted(\n\t\t\t\t\t\tnew Uint8Array(result.buffer),\n\t\t\t\t\t\tresult.contentType,\n\t\t\t\t\t\theaders['accept-encoding'],\n\t\t\t\t\t)\n\t\t\t\t: { body: result.buffer, extraHeaders: {} };\n\n\t\t\t// Set response headers\n\t\t\tset.headers = {\n\t\t\t\t'Content-Type': result.contentType,\n\t\t\t\t'Cache-Control': `public, max-age=${maxAge}, immutable`,\n\t\t\t\t'X-Image-Width': result.width.toString(),\n\t\t\t\t'X-Image-Height': result.height.toString(),\n\t\t\t\t'X-Image-Format': result.format,\n\t\t\t\tVary: 'Accept',\n\t\t\t\t...extraHeaders,\n\t\t\t};\n\n\t\t\treturn new Response(body as BodyInit);\n\t\t} catch (error) {\n\t\t\tconsole.error('Image optimization error:', error);\n\t\t\tset.status = 500;\n\t\t\treturn { error: 'Failed to optimize image' };\n\t\t}\n\t});\n}\n",
|
|
38
|
+
"import type { Elysia } from 'elysia';\nimport { NotFoundError } from 'elysia';\nimport { computeSSRDataForPath, type LRUCache } from 'reroute-js/core';\nimport { jsonError, jsonWithCache } from '../libs/http';\n\ntype InternalRouteOptions = {\n\tclientDir: string;\n\tcwd: string;\n\tdataCacheControl?: string;\n\tdataCache?: LRUCache<string, unknown>;\n\tisWatchMode: boolean;\n};\n\n/**\n * Register internal Reroute routes (production-critical)\n * - /__reroute_preload: Content module preloading for SSR hydration\n * - /__reroute_data: Client-side navigation data fetching\n */\nexport function registerInternalRoutes(\n\tapp: Elysia,\n\topts: InternalRouteOptions,\n): Elysia {\n\tconst { clientDir, cwd, dataCacheControl, dataCache, isWatchMode } = opts;\n\n\t// Content module preload endpoint (used in SSR for hydration - ALWAYS needed)\n\tapp.get('/__reroute_preload', async ({ query }) => {\n\t\tconst rawSrc = String(query.src || '').trim();\n\t\tconst key = String(query.key || '').trim();\n\t\tlet src = rawSrc;\n\t\ttry {\n\t\t\tsrc = decodeURIComponent(rawSrc);\n\t\t} catch {}\n\t\tconst safeChunk =\n\t\t\tsrc.startsWith('/.reroute/chunks/') && /^[A-Za-z0-9_./-]+\\.js$/.test(src);\n\t\tconst safeBundle =\n\t\t\tsrc.startsWith('/bundles/') && /^[A-Za-z0-9_./-]+\\.js$/.test(src);\n\t\tconst safeSource =\n\t\t\tsrc.startsWith('/routes/') &&\n\t\t\t/^[A-Za-z0-9_./\\-[\\]]+\\.(tsx?|js)$/.test(src);\n\t\tconst safe = (safeChunk || safeBundle || safeSource) && !src.includes('..');\n\t\tif (!safe || !key) throw new NotFoundError();\n\n\t\t// Use static import to guarantee execution ordering and avoid race during hydration\n\t\tconst code =\n\t\t\t`// preload for ${key}\\n` +\n\t\t\t`import * as __m from '${src}';\\n` +\n\t\t\t`const __C = __m.default || __m;\\n` +\n\t\t\t`(globalThis.__REROUTE_MODULES__ ||= {});\\n` +\n\t\t\t`globalThis.__REROUTE_MODULES__['${key}'] = __C;\\n` +\n\t\t\t`export {};`;\n\n\t\t// Use no-cache in watch mode to ensure fresh modules\n\t\tconst cacheControl = isWatchMode\n\t\t\t? 'no-cache, no-store, must-revalidate'\n\t\t\t: 'public, max-age=31536000, immutable';\n\n\t\treturn new Response(code, {\n\t\t\theaders: {\n\t\t\t\t'content-type': 'application/javascript; charset=utf-8',\n\t\t\t\t'cache-control': cacheControl,\n\t\t\t},\n\t\t});\n\t});\n\n\t// Data endpoint for client Link prefetch and client navigations (ALWAYS needed)\n\tapp.get('/__reroute_data', async ({ query, headers }) => {\n\t\tconst p = String(query.path || query.p || '/');\n\t\tconst dataKey = String(query.key || '');\n\t\tlet pathname = '/';\n\t\ttry {\n\t\t\tconst u = new URL(p, 'http://localhost');\n\t\t\tpathname = u.pathname + u.search;\n\t\t} catch {\n\t\t\tpathname = String(p);\n\t\t}\n\t\ttry {\n\t\t\t// If a specific key is requested, we need to fetch and resolve just that key\n\t\t\t// This is used for progressive loading during SPA navigation\n\t\t\tif (dataKey) {\n\t\t\t\t// Import the necessary function to get the raw promise-based data\n\t\t\t\tconst { computeSSRData } = await import('reroute-js/core');\n\n\t\t\t\tconst cacheKey = `${pathname}:promises`;\n\t\t\t\tlet promiseData = dataCache?.get(cacheKey) as\n\t\t\t\t\t| Record<string, unknown>\n\t\t\t\t\t| undefined;\n\n\t\t\t\tif (!promiseData) {\n\t\t\t\t\t// Get the raw data with promises (streaming mode)\n\t\t\t\t\tconst { data } = await computeSSRData(\n\t\t\t\t\t\tpathname,\n\t\t\t\t\t\tclientDir,\n\t\t\t\t\t\tcwd,\n\t\t\t\t\t\tisWatchMode,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tstreaming: true,\n\t\t\t\t\t\t\tmaxAge: 0,\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\t\t\t\t\tpromiseData = data as Record<string, unknown>;\n\t\t\t\t\t// Cache the promise-based data\n\t\t\t\t\tdataCache?.set(cacheKey, promiseData);\n\t\t\t\t}\n\n\t\t\t\t// Extract the specific key's promise and await it\n\t\t\t\tif (promiseData && typeof promiseData === 'object') {\n\t\t\t\t\tconst value = promiseData[dataKey];\n\t\t\t\t\tif (value instanceof Promise) {\n\t\t\t\t\t\tconst resolved = await value;\n\t\t\t\t\t\t// Cache the resolved value\n\t\t\t\t\t\tconst resolvedCacheKey = `${pathname}:${dataKey}:resolved`;\n\t\t\t\t\t\tdataCache?.set(resolvedCacheKey, resolved);\n\t\t\t\t\t\treturn jsonWithCache(\n\t\t\t\t\t\t\t{ data: resolved },\n\t\t\t\t\t\t\tdataCacheControl || 'no-cache',\n\t\t\t\t\t\t\theaders as Record<string, string>,\n\t\t\t\t\t\t);\n\t\t\t\t\t} else if (value !== undefined) {\n\t\t\t\t\t\treturn jsonWithCache(\n\t\t\t\t\t\t\t{ data: value },\n\t\t\t\t\t\t\tdataCacheControl || 'no-cache',\n\t\t\t\t\t\t\theaders as Record<string, string>,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Fallback: key not found\n\t\t\t\treturn jsonError('key not found', 404);\n\t\t\t}\n\n\t\t\t// Check cache first (consistent in all modes)\n\t\t\tlet data = dataCache?.get(pathname);\n\n\t\t\tif (data === undefined) {\n\t\t\t\tdata = await computeSSRDataForPath({\n\t\t\t\t\tpathname,\n\t\t\t\t\tclientDir,\n\t\t\t\t\tcwd,\n\t\t\t\t\tisWatchMode,\n\t\t\t\t});\n\t\t\t\t// Cache the result (even in watch mode for request deduplication)\n\t\t\t\tdataCache?.set(pathname, data);\n\t\t\t}\n\n\t\t\treturn jsonWithCache(\n\t\t\t\t{ data },\n\t\t\t\tdataCacheControl || 'no-cache',\n\t\t\t\theaders as Record<string, string>,\n\t\t\t);\n\t\t} catch (_e) {\n\t\t\treturn jsonError('failed', 500);\n\t\t}\n\t});\n\n\treturn app;\n}\n\n/**\n * Register live reload routes (dev-only)\n * - /__reroute_watch: SSE endpoint for live reload notifications\n * - /__reroute_watch.js: Client-side watch module\n */\ntype LiveReloadState = {\n\tclients: Set<ReadableStreamDefaultController>;\n\tpendingReload: boolean;\n};\n\nexport function registerLiveReloadRoutes(\n\tapp: Elysia,\n\tstate: LiveReloadState,\n): Elysia {\n\t// SSE endpoint for live reload\n\tconsole.log('[reroute] Registering SSE endpoint at /__reroute_watch');\n\tapp.get('/__reroute_watch', () => {\n\t\tconst encoder = new TextEncoder();\n\t\tlet interval: NodeJS.Timeout;\n\t\tlet currentController: ReadableStreamDefaultController | null = null;\n\t\tconst stream = new ReadableStream({\n\t\t\tstart(controller) {\n\t\t\t\tcurrentController = controller;\n\t\t\t\tstate.clients.add(controller);\n\t\t\t\tconsole.log('[reroute] Browser connected for live reload');\n\t\t\t\t// Send connect + retry hint\n\t\t\t\tcontroller.enqueue(encoder.encode('retry: 1000\\n'));\n\t\t\t\tcontroller.enqueue(encoder.encode('data: connected\\n\\n'));\n\t\t\t\tif (state.pendingReload) {\n\t\t\t\t\tcontroller.enqueue(encoder.encode('data: reload\\n\\n'));\n\t\t\t\t\tstate.pendingReload = false;\n\t\t\t\t}\n\t\t\t\t// Heartbeat every 25s to keep connections alive behind proxies\n\t\t\t\tinterval = setInterval(() => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tcontroller.enqueue(encoder.encode(': ping\\n\\n'));\n\t\t\t\t\t} catch {}\n\t\t\t\t}, 25000);\n\t\t\t},\n\t\t\tcancel() {\n\t\t\t\tif (interval) clearInterval(interval);\n\t\t\t\tif (currentController) {\n\t\t\t\t\tstate.clients.delete(currentController);\n\t\t\t\t}\n\t\t\t\tconsole.log('[reroute] Browser disconnected from live reload');\n\t\t\t},\n\t\t});\n\n\t\treturn new Response(stream, {\n\t\t\theaders: {\n\t\t\t\t'Content-Type': 'text/event-stream',\n\t\t\t\t'Cache-Control': 'no-cache',\n\t\t\t\tConnection: 'keep-alive',\n\t\t\t},\n\t\t});\n\t});\n\n\t// External preload module: imports a content chunk and seeds client store\n\tapp.get('/__reroute_watch.js', () => {\n\t\tconst code = `// Reroute live reload client\nlet eventSource = null;\nlet hasConnected = false;\nlet wasDisconnected = false;\nlet reloadTriggered = false;\n\nfunction connect() {\n if (reloadTriggered) return; // Don't reconnect if reload is pending\n \n eventSource = new EventSource('/__reroute_watch');\n \n eventSource.addEventListener('message', (e) => {\n if (e.data === 'connected') {\n // If this is a reconnection (not the first connection), reload the page\n if (hasConnected && wasDisconnected && !reloadTriggered) {\n console.log('[reroute] Reconnected after server restart, reloading...');\n reloadTriggered = true;\n eventSource?.close();\n window.location.reload();\n return;\n }\n hasConnected = true;\n wasDisconnected = false;\n console.log('[reroute] Live reload connected');\n } else if (e.data === 'reload') {\n console.log('[reroute] Reloading...');\n reloadTriggered = true;\n eventSource?.close();\n window.location.reload();\n }\n });\n\n eventSource.addEventListener('error', () => {\n if (reloadTriggered) return;\n wasDisconnected = true;\n eventSource?.close();\n // Retry connection after a delay\n setTimeout(connect, 1000);\n });\n}\n\nconnect();\n`;\n\n\t\treturn new Response(code, {\n\t\t\theaders: {\n\t\t\t\t'content-type': 'application/javascript; charset=utf-8',\n\t\t\t\t'cache-control': 'no-cache',\n\t\t\t},\n\t\t});\n\t});\n\n\treturn app;\n}\n",
|
|
39
|
+
"// Small helpers for JSON responses with caching/ETag\n// Keep local to Elysia package to avoid core dependency surface changes\n\n// biome-ignore lint/suspicious/noExplicitAny: Bun env types vary\ntype Any = any;\n\nconst makeETag = (s: string) => {\n\ttry {\n\t\t// Prefer Bun.hash if available (fast)\n\t\tconst h = (globalThis as Any)?.Bun?.hash?.(s) ?? 0;\n\t\treturn `W/\"${s.length.toString(16)}-${Number(h).toString(36)}\"`;\n\t} catch {\n\t\t// Fallback: length-based weak tag\n\t\treturn `W/\"${s.length.toString(16)}-0\"`;\n\t}\n};\n\nconst getIfNoneMatch = (headers?: Headers | Record<string, string>) => {\n\ttry {\n\t\tif (!headers) return undefined;\n\t\t// Elysia provides Headers-like and plain-record in different hooks\n\t\t// Try .get first, then record access in lower/normal case\n\t\tconst h: Any = headers as Any;\n\t\tif (typeof h?.get === 'function')\n\t\t\treturn String(h.get('if-none-match') || '');\n\t\treturn String((h['if-none-match'] || h['If-None-Match'] || '') as string);\n\t} catch {\n\t\treturn undefined;\n\t}\n};\n\nexport function jsonWithCache(\n\tpayload: Any,\n\tcacheControl: string,\n\treqHeaders?: Headers | Record<string, string>,\n): Response {\n\tconst body = typeof payload === 'string' ? payload : JSON.stringify(payload);\n\tconst etag = makeETag(body);\n\tconst inm = getIfNoneMatch(reqHeaders) || '';\n\n\tif (etag && inm && inm === etag) {\n\t\treturn new Response(null, {\n\t\t\tstatus: 304,\n\t\t\theaders: {\n\t\t\t\tETag: etag,\n\t\t\t\t'Cache-Control': cacheControl,\n\t\t\t},\n\t\t});\n\t}\n\n\treturn new Response(body, {\n\t\theaders: {\n\t\t\t'Content-Type': 'application/json; charset=utf-8',\n\t\t\t'Cache-Control': cacheControl,\n\t\t\tETag: etag,\n\t\t},\n\t});\n}\n\nexport function jsonError(message: string, status = 500): Response {\n\treturn new Response(JSON.stringify({ error: message }), {\n\t\tstatus,\n\t\theaders: { 'Content-Type': 'application/json; charset=utf-8' },\n\t});\n}\n",
|
|
40
|
+
"import type { Elysia } from 'elysia';\nimport { NotFoundError } from 'elysia';\nimport type { ReactElement } from 'react';\nimport {\n\tcomputeSSRDataForPath,\n\tgzipIfAccepted,\n\tLRUCache,\n\trenderSSRDocument,\n\trenderSSRDocumentStream,\n} from 'reroute-js/core';\nimport { jsonError, jsonWithCache } from '../libs/http';\n\ntype SSRRouteOptions = {\n\trootComponent: ReactElement;\n\tclientDir: string;\n\tcwd: string;\n\tisWatchMode: boolean;\n\tgetBundleUrl: () => Promise<string>;\n\thead?: string;\n\tlang?: string;\n\tappId?: string;\n\tcollections: string[];\n\tminify?: boolean;\n\tmaxAge?: number;\n\tdirective?: string;\n\tdataCacheControl?: string;\n\tdataCache?: LRUCache<string, unknown>;\n\tcompression?: boolean;\n\tstreamingEnabled?: boolean;\n\tshouldIgnorePathname?: (pathname: string) => boolean;\n};\n\nfunction registerSSRRoutes(app: Elysia, options: SSRRouteOptions): Elysia {\n\tconst {\n\t\trootComponent,\n\t\tclientDir,\n\t\tcwd,\n\t\tisWatchMode,\n\t\tgetBundleUrl,\n\t\thead = '',\n\t\tlang = 'en',\n\t\tappId = 'root',\n\t\tcollections,\n\t\tminify = false,\n\t\tmaxAge = 3600,\n\t\tdirective = 'public',\n\t\tdataCacheControl,\n\t\tdataCache,\n\t\tcompression = true,\n\t\tstreamingEnabled = false,\n\t\tshouldIgnorePathname,\n\t} = options;\n\n\t// Cache SSR HTML in-memory based on maxAge config\n\t// If maxAge is 0, don't cache at all (user wants fresh data)\n\t// Otherwise use maxAge or default to 5 minutes\n\tconst SSR_HTML_TTL_MS = maxAge === 0 ? 0 : maxAge * 1000 || 5 * 60 * 1000;\n\tconst htmlCache = new LRUCache<\n\t\tstring,\n\t\t{\n\t\t\tstatus: number;\n\t\t\theaders: Record<string, string>;\n\t\t\tbody: BodyInit;\n\t\t\texp: number;\n\t\t}\n\t>(200);\n\tconst makeKey = (pathname: string, acceptEncoding: string | undefined) =>\n\t\t`${pathname}::${acceptEncoding || 'identity'}`;\n\n\t// Register SSR routes for each collection\n\tfor (const collection of collections) {\n\t\tapp.get(`/${collection}/*`, async ({ request, headers }) => {\n\t\t\tconst method = request.method || 'GET';\n\n\t\t\t// Reject HEAD requests early to avoid Elysia bug\n\t\t\tif (method === 'HEAD') {\n\t\t\t\treturn new Response(null, {\n\t\t\t\t\tstatus: 200,\n\t\t\t\t\theaders: { 'content-type': 'text/html; charset=utf-8' },\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (method !== 'GET') throw new NotFoundError();\n\t\t\tconst accept = request.headers.get?.('accept') || '';\n\t\t\tif (!/text\\/html/i.test(String(accept))) throw new NotFoundError();\n\t\t\ttry {\n\t\t\t\tconst url = new URL(request.url);\n\t\t\t\tconst pathname = url.pathname;\n\t\t\t\tconst acceptEncoding = headers['accept-encoding'] || '';\n\n\t\t\t\t// Serve cached HTML if fresh (skip cache in watch mode)\n\t\t\t\tif (!isWatchMode && SSR_HTML_TTL_MS > 0) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst ck = makeKey(pathname, acceptEncoding);\n\t\t\t\t\t\tconst cached = htmlCache.get(ck);\n\t\t\t\t\t\tif (cached && cached.exp > Date.now()) {\n\t\t\t\t\t\t\treturn new Response(cached.body, {\n\t\t\t\t\t\t\t\tstatus: cached.status,\n\t\t\t\t\t\t\t\theaders: cached.headers,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch {}\n\t\t\t\t}\n\n\t\t\t\tconst bundleUrl = await getBundleUrl();\n\t\t\t\t// Compose Early Hints (103) and Link header for main bundle\n\t\t\t\ttry {\n\t\t\t\t\tconst linkValue = `<${bundleUrl}>; rel=modulepreload; as=script`;\n\t\t\t\t\t// Best-effort Early Hints (if supported by runtime)\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst hints = new Headers({ Link: linkValue });\n\t\t\t\t\t\t// @ts-expect-error runtime specific hook\n\t\t\t\t\t\t(request as Any)?.sendEarlyHints?.(hints);\n\t\t\t\t\t} catch {}\n\t\t\t\t\t// Also attach Link on final response\n\t\t\t\t\theaders.link = headers.link\n\t\t\t\t\t\t? `${headers.link}, ${linkValue}`\n\t\t\t\t\t\t: linkValue;\n\t\t\t\t} catch {}\n\n\t\t\t\t// Use no-cache headers in watch mode to ensure fresh content\n\t\t\t\tconst cacheControlHeader = isWatchMode\n\t\t\t\t\t? 'no-cache, no-store, must-revalidate'\n\t\t\t\t\t: `${directive}, max-age=${maxAge}`;\n\n\t\t\t\tlet response: Response;\n\n\t\t\t\tif (streamingEnabled) {\n\t\t\t\t\t// Streaming SSR path\n\t\t\t\t\tconst { stream, status } = await renderSSRDocumentStream({\n\t\t\t\t\t\tpathname,\n\t\t\t\t\t\trootComponent,\n\t\t\t\t\t\tclientDir,\n\t\t\t\t\t\tcwd,\n\t\t\t\t\t\tisWatchMode,\n\t\t\t\t\t\tbundleUrl,\n\t\t\t\t\t\thead,\n\t\t\t\t\t\tlang,\n\t\t\t\t\t\tappId,\n\t\t\t\t\t\tmaxAge,\n\t\t\t\t\t});\n\n\t\t\t\t\t// Capture chunks while streaming for caching (if not in watch mode)\n\t\t\t\t\tconst chunks: Uint8Array[] = [];\n\t\t\t\t\tconst shouldCache =\n\t\t\t\t\t\t!isWatchMode && SSR_HTML_TTL_MS > 0 && status === 200;\n\n\t\t\t\t\tconst cachingStream = shouldCache\n\t\t\t\t\t\t? stream.pipeThrough(\n\t\t\t\t\t\t\t\tnew TransformStream({\n\t\t\t\t\t\t\t\t\ttransform(chunk, controller) {\n\t\t\t\t\t\t\t\t\t\tchunks.push(new Uint8Array(chunk));\n\t\t\t\t\t\t\t\t\t\tcontroller.enqueue(chunk);\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\tflush() {\n\t\t\t\t\t\t\t\t\t\t// Cache the complete HTML after streaming finishes\n\t\t\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\t\t\tconst totalLength = chunks.reduce(\n\t\t\t\t\t\t\t\t\t\t\t\t(sum, c) => sum + c.length,\n\t\t\t\t\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t\tconst fullHtml = new Uint8Array(totalLength);\n\t\t\t\t\t\t\t\t\t\t\tlet offset = 0;\n\t\t\t\t\t\t\t\t\t\t\tfor (const chunk of chunks) {\n\t\t\t\t\t\t\t\t\t\t\t\tfullHtml.set(chunk, offset);\n\t\t\t\t\t\t\t\t\t\t\t\toffset += chunk.length;\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\tconst ck = makeKey(pathname, acceptEncoding);\n\t\t\t\t\t\t\t\t\t\t\thtmlCache.set(ck, {\n\t\t\t\t\t\t\t\t\t\t\t\tstatus,\n\t\t\t\t\t\t\t\t\t\t\t\theaders: {\n\t\t\t\t\t\t\t\t\t\t\t\t\t'content-type': 'text/html; charset=utf-8',\n\t\t\t\t\t\t\t\t\t\t\t\t\t'cache-control': cacheControlHeader,\n\t\t\t\t\t\t\t\t\t\t\t\t\t...(headers.link ? { link: headers.link } : {}),\n\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\tbody: fullHtml,\n\t\t\t\t\t\t\t\t\t\t\t\texp: Date.now() + SSR_HTML_TTL_MS,\n\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t\t\t\t\t\tconsole.error('[reroute] Failed to cache stream:', e);\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t: stream;\n\n\t\t\t\t\t// Note: Streaming responses are NOT compressed because Bun doesn't support\n\t\t\t\t\t// CompressionStream yet. Per-chunk compression breaks gzip format.\n\t\t\t\t\t// Trade-off: Streaming performance > compression for now.\n\t\t\t\t\tconst finalStream = cachingStream;\n\t\t\t\t\tconst extraHeaders: Record<string, string> = {};\n\n\t\t\t\t\tresponse = new Response(finalStream, {\n\t\t\t\t\t\tstatus,\n\t\t\t\t\t\theaders: {\n\t\t\t\t\t\t\t'content-type': 'text/html; charset=utf-8',\n\t\t\t\t\t\t\t'cache-control': cacheControlHeader,\n\t\t\t\t\t\t\t'transfer-encoding': 'chunked',\n\t\t\t\t\t\t\t...(headers.link ? { link: headers.link } : {}),\n\t\t\t\t\t\t\t...extraHeaders,\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\t// Synchronous SSR path\n\t\t\t\t\tconst result = await renderSSRDocument({\n\t\t\t\t\t\tpathname,\n\t\t\t\t\t\trootComponent,\n\t\t\t\t\t\tclientDir,\n\t\t\t\t\t\tcwd,\n\t\t\t\t\t\tisWatchMode,\n\t\t\t\t\t\tbundleUrl,\n\t\t\t\t\t\thead,\n\t\t\t\t\t\tlang,\n\t\t\t\t\t\tappId,\n\t\t\t\t\t\tminify,\n\t\t\t\t\t\tmaxAge,\n\t\t\t\t\t});\n\n\t\t\t\t\tconst { body, extraHeaders } = compression\n\t\t\t\t\t\t? gzipIfAccepted(\n\t\t\t\t\t\t\t\tresult.html,\n\t\t\t\t\t\t\t\t'text/html; charset=utf-8',\n\t\t\t\t\t\t\t\tacceptEncoding,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t: { body: result.html, extraHeaders: {} };\n\n\t\t\t\t\tconst resHeaders: Record<string, string> = {\n\t\t\t\t\t\t'content-type': 'text/html; charset=utf-8',\n\t\t\t\t\t\t'cache-control': cacheControlHeader,\n\t\t\t\t\t\t...(headers.link ? { link: headers.link } : {}),\n\t\t\t\t\t\t...extraHeaders,\n\t\t\t\t\t};\n\n\t\t\t\t\tresponse = new Response(body as BodyInit, {\n\t\t\t\t\t\tstatus: result.status,\n\t\t\t\t\t\theaders: resHeaders,\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\t// Cache successful renders (skip in watch mode and streaming mode)\n\t\t\t\t// Streaming responses cannot be cached as they are consumed once\n\t\t\t\tif (\n\t\t\t\t\t!isWatchMode &&\n\t\t\t\t\t!streamingEnabled &&\n\t\t\t\t\tSSR_HTML_TTL_MS > 0 &&\n\t\t\t\t\tresponse.status === 200\n\t\t\t\t) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst ck = makeKey(pathname, acceptEncoding);\n\t\t\t\t\t\t// Clone response body for caching\n\t\t\t\t\t\tconst clonedResponse = response.clone();\n\t\t\t\t\t\tconst body = await clonedResponse.arrayBuffer();\n\t\t\t\t\t\thtmlCache.set(ck, {\n\t\t\t\t\t\t\tstatus: response.status,\n\t\t\t\t\t\t\theaders: Object.fromEntries(response.headers.entries()),\n\t\t\t\t\t\t\tbody: body,\n\t\t\t\t\t\t\texp: Date.now() + SSR_HTML_TTL_MS,\n\t\t\t\t\t\t});\n\t\t\t\t\t} catch {}\n\t\t\t\t}\n\n\t\t\t\treturn response;\n\t\t\t} catch (e) {\n\t\t\t\tconsole.error(`[reroute] SSR ${collection} render error:`, e);\n\t\t\t\tthrow new NotFoundError();\n\t\t\t}\n\t\t});\n\t}\n\n\t// Global error handler for SSR fallback\n\tapp.onError(async ({ code, request, set }) => {\n\t\tif (code === 'NOT_FOUND') {\n\t\t\tconst url = new URL(request.url);\n\t\t\tconst pathname = url.pathname;\n\t\t\tconst method = request.method || 'GET';\n\t\t\tconst isInternal =\n\t\t\t\tpathname.startsWith('/__reroute_watch') ||\n\t\t\t\tpathname.startsWith('/__content/') ||\n\t\t\t\tpathname.startsWith('/__reroute_preload') ||\n\t\t\t\tpathname.startsWith('/__reroute_data') ||\n\t\t\t\tpathname.startsWith('/__reroute_watch.js');\n\n\t\t\tif (!isInternal && typeof shouldIgnorePathname === 'function') {\n\t\t\t\ttry {\n\t\t\t\t\tif (shouldIgnorePathname(pathname)) {\n\t\t\t\t\t\treturn new Response('Not Found', { status: 404 });\n\t\t\t\t\t}\n\t\t\t\t} catch {}\n\t\t\t}\n\n\t\t\tif (pathname === '/__reroute_data' && method === 'GET') {\n\t\t\t\ttry {\n\t\t\t\t\tconst p = url.searchParams.get('path') || '/';\n\n\t\t\t\t\t// Check cache first (consistent in all modes)\n\t\t\t\t\tlet data = dataCache?.get(p);\n\n\t\t\t\t\tif (data === undefined) {\n\t\t\t\t\t\tdata = await computeSSRDataForPath({\n\t\t\t\t\t\t\tpathname: p,\n\t\t\t\t\t\t\tclientDir,\n\t\t\t\t\t\t\tcwd,\n\t\t\t\t\t\t\tisWatchMode,\n\t\t\t\t\t\t});\n\t\t\t\t\t\t// Cache the result (even in watch mode for request deduplication)\n\t\t\t\t\t\tdataCache?.set(p, data);\n\t\t\t\t\t}\n\n\t\t\t\t\treturn jsonWithCache(\n\t\t\t\t\t\t{ data },\n\t\t\t\t\t\tdataCacheControl || 'no-cache',\n\t\t\t\t\t\trequest.headers,\n\t\t\t\t\t);\n\t\t\t\t} catch (_e) {\n\t\t\t\t\treturn jsonError('failed', 500);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ((method === 'GET' || method === 'HEAD') && !isInternal) {\n\t\t\t\t// Reject HEAD requests early to avoid Elysia bug\n\t\t\t\tif (method === 'HEAD') {\n\t\t\t\t\tset.status = 200;\n\t\t\t\t\tset.headers['content-type'] = 'text/html; charset=utf-8';\n\t\t\t\t\treturn new Response(null);\n\t\t\t\t}\n\n\t\t\t\ttry {\n\t\t\t\t\tconst acceptEncoding = request.headers.get('accept-encoding') || '';\n\t\t\t\t\t// Serve cached HTML if fresh (skip cache in watch mode)\n\t\t\t\t\tif (!isWatchMode && SSR_HTML_TTL_MS > 0) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst ck = makeKey(pathname, acceptEncoding);\n\t\t\t\t\t\t\tconst cached = htmlCache.get(ck);\n\t\t\t\t\t\t\tif (cached && cached.exp > Date.now()) {\n\t\t\t\t\t\t\t\tset.status = cached.status;\n\t\t\t\t\t\t\t\tObject.assign(set.headers, cached.headers);\n\t\t\t\t\t\t\t\treturn new Response(cached.body);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} catch {}\n\t\t\t\t\t}\n\n\t\t\t\t\tconst bundleUrl = await getBundleUrl();\n\t\t\t\t\t// Compose Early Hints (103) and Link header for main bundle\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst linkValue = `<${bundleUrl}>; rel=modulepreload; as=script`;\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst hints = new Headers({ Link: linkValue });\n\t\t\t\t\t\t\t// @ts-expect-error runtime specific hook\n\t\t\t\t\t\t\t(request as Any)?.sendEarlyHints?.(hints);\n\t\t\t\t\t\t} catch {}\n\t\t\t\t\t\tset.headers.link = set.headers.link\n\t\t\t\t\t\t\t? `${set.headers.link}, ${linkValue}`\n\t\t\t\t\t\t\t: linkValue;\n\t\t\t\t\t} catch {}\n\n\t\t\t\t\t// Use no-cache headers in watch mode to ensure fresh content\n\t\t\t\t\tconst cacheControlHeader = isWatchMode\n\t\t\t\t\t\t? 'no-cache, no-store, must-revalidate'\n\t\t\t\t\t\t: `${directive}, max-age=${maxAge}`;\n\n\t\t\t\t\tlet response: Response;\n\n\t\t\t\t\tif (streamingEnabled) {\n\t\t\t\t\t\t// Streaming SSR path\n\t\t\t\t\t\tconst { stream, status } = await renderSSRDocumentStream({\n\t\t\t\t\t\t\tpathname,\n\t\t\t\t\t\t\trootComponent,\n\t\t\t\t\t\t\tclientDir,\n\t\t\t\t\t\t\tcwd,\n\t\t\t\t\t\t\tisWatchMode,\n\t\t\t\t\t\t\tbundleUrl,\n\t\t\t\t\t\t\thead,\n\t\t\t\t\t\t\tlang,\n\t\t\t\t\t\t\tappId,\n\t\t\t\t\t\t\tmaxAge,\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\t// Capture chunks while streaming for caching (if not in watch mode)\n\t\t\t\t\t\tconst chunks: Uint8Array[] = [];\n\t\t\t\t\t\tconst shouldCache =\n\t\t\t\t\t\t\t!isWatchMode && SSR_HTML_TTL_MS > 0 && status === 200;\n\n\t\t\t\t\t\tconst cachingStream = shouldCache\n\t\t\t\t\t\t\t? stream.pipeThrough(\n\t\t\t\t\t\t\t\t\tnew TransformStream({\n\t\t\t\t\t\t\t\t\t\ttransform(chunk, controller) {\n\t\t\t\t\t\t\t\t\t\t\tchunks.push(new Uint8Array(chunk));\n\t\t\t\t\t\t\t\t\t\t\tcontroller.enqueue(chunk);\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\tflush() {\n\t\t\t\t\t\t\t\t\t\t\t// Cache the complete HTML after streaming finishes\n\t\t\t\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\t\t\t\tconst totalLength = chunks.reduce(\n\t\t\t\t\t\t\t\t\t\t\t\t\t(sum, c) => sum + c.length,\n\t\t\t\t\t\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t\t\tconst fullHtml = new Uint8Array(totalLength);\n\t\t\t\t\t\t\t\t\t\t\t\tlet offset = 0;\n\t\t\t\t\t\t\t\t\t\t\t\tfor (const chunk of chunks) {\n\t\t\t\t\t\t\t\t\t\t\t\t\tfullHtml.set(chunk, offset);\n\t\t\t\t\t\t\t\t\t\t\t\t\toffset += chunk.length;\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\tconst ck = makeKey(pathname, acceptEncoding);\n\t\t\t\t\t\t\t\t\t\t\t\thtmlCache.set(ck, {\n\t\t\t\t\t\t\t\t\t\t\t\t\tstatus,\n\t\t\t\t\t\t\t\t\t\t\t\t\theaders: {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t'content-type': 'text/html; charset=utf-8',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t'cache-control': cacheControlHeader,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t...(set.headers.link\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? { link: set.headers.link as string }\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: {}),\n\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\tbody: fullHtml,\n\t\t\t\t\t\t\t\t\t\t\t\t\texp: Date.now() + SSR_HTML_TTL_MS,\n\t\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t\t\t\t\t\t\tconsole.error('[reroute] Failed to cache stream:', e);\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t: stream;\n\n\t\t\t\t\t\t// Note: Streaming responses are NOT compressed because Bun doesn't support\n\t\t\t\t\t\t// CompressionStream yet. Per-chunk compression breaks gzip format.\n\t\t\t\t\t\t// Trade-off: Streaming performance > compression for now.\n\t\t\t\t\t\tconst finalStream = cachingStream;\n\n\t\t\t\t\t\tresponse = new Response(finalStream, {\n\t\t\t\t\t\t\tstatus,\n\t\t\t\t\t\t\theaders: {\n\t\t\t\t\t\t\t\t'content-type': 'text/html; charset=utf-8',\n\t\t\t\t\t\t\t\t'cache-control': cacheControlHeader,\n\t\t\t\t\t\t\t\t'transfer-encoding': 'chunked',\n\t\t\t\t\t\t\t\t...(set.headers.link\n\t\t\t\t\t\t\t\t\t? { link: set.headers.link as string }\n\t\t\t\t\t\t\t\t\t: {}),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tset.status = status;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Synchronous SSR path\n\t\t\t\t\t\tconst result = await renderSSRDocument({\n\t\t\t\t\t\t\tpathname,\n\t\t\t\t\t\t\trootComponent,\n\t\t\t\t\t\t\tclientDir,\n\t\t\t\t\t\t\tcwd,\n\t\t\t\t\t\t\tisWatchMode,\n\t\t\t\t\t\t\tbundleUrl,\n\t\t\t\t\t\t\thead,\n\t\t\t\t\t\t\tlang,\n\t\t\t\t\t\t\tappId,\n\t\t\t\t\t\t\tminify,\n\t\t\t\t\t\t\tmaxAge,\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tconst { body, extraHeaders } = compression\n\t\t\t\t\t\t\t? gzipIfAccepted(\n\t\t\t\t\t\t\t\t\tresult.html,\n\t\t\t\t\t\t\t\t\t'text/html; charset=utf-8',\n\t\t\t\t\t\t\t\t\tacceptEncoding,\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t: { body: result.html, extraHeaders: {} };\n\n\t\t\t\t\t\tconst resHeaders: Record<string, string> = {\n\t\t\t\t\t\t\t'content-type': 'text/html; charset=utf-8',\n\t\t\t\t\t\t\t'cache-control': cacheControlHeader,\n\t\t\t\t\t\t\t...(set.headers.link ? { link: set.headers.link as string } : {}),\n\t\t\t\t\t\t\t...extraHeaders,\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tresponse = new Response(body as BodyInit, {\n\t\t\t\t\t\t\tstatus: result.status,\n\t\t\t\t\t\t\theaders: resHeaders,\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tset.status = result.status;\n\n\t\t\t\t\t\t// Cache successful renders (skip in watch mode)\n\t\t\t\t\t\tif (!isWatchMode && SSR_HTML_TTL_MS > 0 && result.status === 200) {\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tconst ck = makeKey(pathname, acceptEncoding);\n\t\t\t\t\t\t\t\thtmlCache.set(ck, {\n\t\t\t\t\t\t\t\t\tstatus: result.status,\n\t\t\t\t\t\t\t\t\theaders: Object.fromEntries(\n\t\t\t\t\t\t\t\t\t\tObject.entries(set.headers).map(([k, v]) => [k, String(v)]),\n\t\t\t\t\t\t\t\t\t) as Record<string, string>,\n\t\t\t\t\t\t\t\t\tbody: body as BodyInit,\n\t\t\t\t\t\t\t\t\texp: Date.now() + SSR_HTML_TTL_MS,\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t} catch {}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn response;\n\t\t\t\t} catch {\n\t\t\t\t\t// fallthrough to default 404 if template fails\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n\n\treturn app;\n}\n\nexport { registerSSRRoutes };\n",
|
|
41
|
+
"import type { Elysia } from 'elysia';\nimport { NotFoundError } from 'elysia';\nimport {\n\tgetMimeType,\n\tgzipIfAccepted,\n\tjoin,\n\ttype LRUCache,\n} from 'reroute-js/core';\nimport { getEncoding } from '../libs/cache';\n\ntype StaticRouteOptions = {\n\tclientDir: string;\n\tprefix: string;\n\tmaxAge: number;\n\tdirective: string;\n\tindexHTML: boolean;\n\tstaticHeaders?: Record<string, string>;\n\tshouldIgnore: (file: string) => boolean;\n\tfileCache: LRUCache<string, Response>;\n\tisWatchMode?: boolean;\n\tcompression?: boolean;\n};\n\nfunction registerStaticRoutes(\n\tapp: Elysia,\n\toptions: StaticRouteOptions,\n): Elysia {\n\tconst {\n\t\tclientDir,\n\t\tprefix,\n\t\tmaxAge,\n\t\tdirective,\n\t\tindexHTML,\n\t\tstaticHeaders,\n\t\tshouldIgnore,\n\t\tfileCache,\n\t\tisWatchMode = false,\n\t\tcompression = true,\n\t} = options;\n\n\t// Static files route (scoped under prefix, e.g. '/assets/*')\n\tapp.get(`${prefix}/*`, async ({ params, headers }) => {\n\t\tconst requestPath = params['*'];\n\n\t\tconst filePath = join(clientDir, requestPath);\n\n\t\ttry {\n\t\t\t// Determine encoding and create cache key\n\t\t\tconst acceptEncoding = headers['accept-encoding'] || '';\n\t\t\tconst encoding = getEncoding(acceptEncoding);\n\t\t\tconst cacheKey = `${filePath}:${encoding}`;\n\n\t\t\t// Check cache FIRST (before any filesystem I/O)\n\t\t\tconst cached = fileCache.get(cacheKey);\n\t\t\tif (cached) return cached.clone();\n\n\t\t\t// Cache miss - resolve file path\n\t\t\tlet actualFilePath = filePath;\n\t\t\tlet exists = await Bun.file(actualFilePath).exists();\n\n\t\t\tif (!exists && indexHTML) {\n\t\t\t\tactualFilePath = join(filePath, 'index.html');\n\t\t\t\texists = await Bun.file(actualFilePath).exists();\n\t\t\t}\n\n\t\t\tif (!exists) throw new NotFoundError();\n\n\t\t\t// Check if the resolved file should be ignored (e.g., index.html)\n\t\t\tif (shouldIgnore(actualFilePath)) throw new NotFoundError();\n\n\t\t\tconst contentBuf = await Bun.file(actualFilePath).arrayBuffer();\n\t\t\tconst content = new Uint8Array(contentBuf);\n\t\t\tconst contentType = getMimeType(actualFilePath);\n\n\t\t\t// Apply compression if enabled\n\t\t\tconst { body, extraHeaders } = compression\n\t\t\t\t? gzipIfAccepted(content, contentType, headers['accept-encoding'])\n\t\t\t\t: { body: content, extraHeaders: {} };\n\n\t\t\t// Determine cache duration based on content type and watch mode\n\t\t\t// In watch mode, use no-cache for all source files (tsx, ts, js, css)\n\t\t\tlet cacheControl: string;\n\n\t\t\tif (isWatchMode) {\n\t\t\t\t// Source files like routes/*.tsx should never be cached in dev\n\t\t\t\tconst isSourceFile = /\\.(tsx?|jsx?|css)$/i.test(actualFilePath);\n\t\t\t\tcacheControl = isSourceFile\n\t\t\t\t\t? 'no-cache, no-store, must-revalidate'\n\t\t\t\t\t: `${directive}, max-age=${maxAge}`;\n\t\t\t} else {\n\t\t\t\tconst isLongLivedAsset =\n\t\t\t\t\tcontentType.startsWith('image/') ||\n\t\t\t\t\tcontentType.startsWith('font/') ||\n\t\t\t\t\tcontentType.includes('woff') ||\n\t\t\t\t\tcontentType.includes('ttf') ||\n\t\t\t\t\tcontentType.includes('otf');\n\n\t\t\t\tconst cacheMaxAge =\n\t\t\t\t\tmaxAge === 0 ? 0 : isLongLivedAsset ? 365 * 24 * 60 * 60 : maxAge;\n\n\t\t\t\tcacheControl =\n\t\t\t\t\tcacheMaxAge > 0\n\t\t\t\t\t\t? `${directive}, max-age=${cacheMaxAge}${isLongLivedAsset ? ', immutable' : ''}`\n\t\t\t\t\t\t: 'no-cache';\n\t\t\t}\n\n\t\t\tconst response = new Response(body as string, {\n\t\t\t\theaders: {\n\t\t\t\t\t'Content-Type': contentType,\n\t\t\t\t\t'Cache-Control': cacheControl,\n\t\t\t\t\t...extraHeaders,\n\t\t\t\t\t...staticHeaders,\n\t\t\t\t},\n\t\t\t});\n\n\t\t\tfileCache.set(cacheKey, response);\n\n\t\t\treturn response.clone();\n\t\t} catch (error) {\n\t\t\tif (error instanceof NotFoundError) throw error;\n\t\t\tconsole.error(`[reroute] Error serving ${filePath}:`, error);\n\t\t\tthrow new NotFoundError();\n\t\t}\n\t});\n\n\treturn app;\n}\n\nexport { registerStaticRoutes };\n"
|
|
27
42
|
],
|
|
28
|
-
"mappings": "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",
|
|
29
|
-
"debugId": "
|
|
43
|
+
"mappings": "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",
|
|
44
|
+
"debugId": "D897FC5BD62B7AE964756E2164756E21",
|
|
30
45
|
"names": []
|
|
31
46
|
}
|