reroute-js 0.0.1
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/README.md +144 -0
- package/cli/bin.d.ts +3 -0
- package/cli/bin.d.ts.map +1 -0
- package/cli/bin.js +812 -0
- package/cli/bin.js.map +15 -0
- package/cli/src/commands/build.d.ts +8 -0
- package/cli/src/commands/build.d.ts.map +1 -0
- package/cli/src/commands/dev.d.ts +8 -0
- package/cli/src/commands/dev.d.ts.map +1 -0
- package/cli/src/commands/gen.d.ts +3 -0
- package/cli/src/commands/gen.d.ts.map +1 -0
- package/cli/src/commands/init.d.ts +8 -0
- package/cli/src/commands/init.d.ts.map +1 -0
- package/cli/src/index.d.ts +8 -0
- package/cli/src/index.d.ts.map +1 -0
- package/cli/src/libs/tailwind.d.ts +18 -0
- package/cli/src/libs/tailwind.d.ts.map +1 -0
- package/core/index.d.ts +2 -0
- package/core/index.d.ts.map +1 -0
- package/core/index.js +1174 -0
- package/core/index.js.map +25 -0
- package/core/src/bundler/hash.d.ts +2 -0
- package/core/src/bundler/hash.d.ts.map +1 -0
- package/core/src/bundler/index.d.ts +3 -0
- package/core/src/bundler/index.d.ts.map +1 -0
- package/core/src/bundler/transpile.d.ts +4 -0
- package/core/src/bundler/transpile.d.ts.map +1 -0
- package/core/src/content/builder.d.ts +2 -0
- package/core/src/content/builder.d.ts.map +1 -0
- package/core/src/content/discovery.d.ts +5 -0
- package/core/src/content/discovery.d.ts.map +1 -0
- package/core/src/content/index.d.ts +5 -0
- package/core/src/content/index.d.ts.map +1 -0
- package/core/src/content/metadata.d.ts +9 -0
- package/core/src/content/metadata.d.ts.map +1 -0
- package/core/src/content/registry.d.ts +2 -0
- package/core/src/content/registry.d.ts.map +1 -0
- package/core/src/index.d.ts +7 -0
- package/core/src/index.d.ts.map +1 -0
- package/core/src/ssr/data.d.ts +9 -0
- package/core/src/ssr/data.d.ts.map +1 -0
- package/core/src/ssr/index.d.ts +4 -0
- package/core/src/ssr/index.d.ts.map +1 -0
- package/core/src/ssr/modules.d.ts +8 -0
- package/core/src/ssr/modules.d.ts.map +1 -0
- package/core/src/ssr/render.d.ts +20 -0
- package/core/src/ssr/render.d.ts.map +1 -0
- package/core/src/ssr/seed.d.ts +2 -0
- package/core/src/ssr/seed.d.ts.map +1 -0
- package/core/src/template/html.d.ts +4 -0
- package/core/src/template/html.d.ts.map +1 -0
- package/core/src/template/index.d.ts +2 -0
- package/core/src/template/index.d.ts.map +1 -0
- package/core/src/types.d.ts +50 -0
- package/core/src/types.d.ts.map +1 -0
- package/core/src/utils/cache.d.ts +12 -0
- package/core/src/utils/cache.d.ts.map +1 -0
- package/core/src/utils/compression.d.ts +5 -0
- package/core/src/utils/compression.d.ts.map +1 -0
- package/core/src/utils/index.d.ts +5 -0
- package/core/src/utils/index.d.ts.map +1 -0
- package/core/src/utils/mime.d.ts +3 -0
- package/core/src/utils/mime.d.ts.map +1 -0
- package/core/src/utils/path.d.ts +6 -0
- package/core/src/utils/path.d.ts.map +1 -0
- package/elysia/index.d.ts +2 -0
- package/elysia/index.d.ts.map +1 -0
- package/elysia/index.js +1829 -0
- package/elysia/index.js.map +32 -0
- package/elysia/src/index.d.ts +3 -0
- package/elysia/src/index.d.ts.map +1 -0
- package/elysia/src/plugin.d.ts +32 -0
- package/elysia/src/plugin.d.ts.map +1 -0
- package/elysia/src/routes/artifacts.d.ts +3 -0
- package/elysia/src/routes/artifacts.d.ts.map +1 -0
- package/elysia/src/routes/content.d.ts +3 -0
- package/elysia/src/routes/content.d.ts.map +1 -0
- package/elysia/src/routes/dev.d.ts +7 -0
- package/elysia/src/routes/dev.d.ts.map +1 -0
- package/elysia/src/routes/ssr.d.ts +18 -0
- package/elysia/src/routes/ssr.d.ts.map +1 -0
- package/elysia/src/routes/static.d.ts +19 -0
- package/elysia/src/routes/static.d.ts.map +1 -0
- package/elysia/src/types.d.ts +31 -0
- package/elysia/src/types.d.ts.map +1 -0
- package/elysia/src/utils/http.d.ts +5 -0
- package/elysia/src/utils/http.d.ts.map +1 -0
- package/package.json +74 -0
- package/react/index.d.ts +2 -0
- package/react/index.d.ts.map +1 -0
- package/react/index.js +1152 -0
- package/react/index.js.map +23 -0
- package/react/src/components/ContentRoute.d.ts +13 -0
- package/react/src/components/ContentRoute.d.ts.map +1 -0
- package/react/src/components/Link.d.ts +8 -0
- package/react/src/components/Link.d.ts.map +1 -0
- package/react/src/components/Outlet.d.ts +7 -0
- package/react/src/components/Outlet.d.ts.map +1 -0
- package/react/src/components/index.d.ts +4 -0
- package/react/src/components/index.d.ts.map +1 -0
- package/react/src/hooks/index.d.ts +7 -0
- package/react/src/hooks/index.d.ts.map +1 -0
- package/react/src/hooks/useContent.d.ts +26 -0
- package/react/src/hooks/useContent.d.ts.map +1 -0
- package/react/src/hooks/useData.d.ts +10 -0
- package/react/src/hooks/useData.d.ts.map +1 -0
- package/react/src/hooks/useNavigate.d.ts +6 -0
- package/react/src/hooks/useNavigate.d.ts.map +1 -0
- package/react/src/hooks/useParams.d.ts +6 -0
- package/react/src/hooks/useParams.d.ts.map +1 -0
- package/react/src/hooks/useRouter.d.ts +7 -0
- package/react/src/hooks/useRouter.d.ts.map +1 -0
- package/react/src/hooks/useSearchParams.d.ts +6 -0
- package/react/src/hooks/useSearchParams.d.ts.map +1 -0
- package/react/src/index.d.ts +6 -0
- package/react/src/index.d.ts.map +1 -0
- package/react/src/providers/ContentProvider.d.ts +35 -0
- package/react/src/providers/ContentProvider.d.ts.map +1 -0
- package/react/src/providers/RerouteProvider.d.ts +25 -0
- package/react/src/providers/RerouteProvider.d.ts.map +1 -0
- package/react/src/providers/RouterProvider.d.ts +23 -0
- package/react/src/providers/RouterProvider.d.ts.map +1 -0
- package/react/src/providers/index.d.ts +4 -0
- package/react/src/providers/index.d.ts.map +1 -0
- package/react/src/types/any.d.ts +3 -0
- package/react/src/types/any.d.ts.map +1 -0
- package/react/src/types/index.d.ts +3 -0
- package/react/src/types/index.d.ts.map +1 -0
- package/react/src/types/router.d.ts +32 -0
- package/react/src/types/router.d.ts.map +1 -0
- package/react/src/utils/content.d.ts +8 -0
- package/react/src/utils/content.d.ts.map +1 -0
- package/react/src/utils/head.d.ts +6 -0
- package/react/src/utils/head.d.ts.map +1 -0
- package/react/src/utils/index.d.ts +3 -0
- package/react/src/utils/index.d.ts.map +1 -0
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../packages/core/src/utils/path.ts", "../../packages/elysia/src/plugin.ts", "../../packages/core/src/bundler/hash.ts", "../../packages/core/src/bundler/transpile.ts", "../../packages/core/src/content/builder.ts", "../../packages/core/src/content/discovery.ts", "../../packages/core/src/content/metadata.ts", "../../packages/core/src/content/registry.ts", "../../packages/core/src/ssr/data.ts", "../../packages/core/src/ssr/modules.ts", "../../packages/core/src/ssr/seed.ts", "../../packages/core/src/ssr/render.ts", "../../node_modules/dedent/dist/dedent.mjs", "../../packages/core/src/template/html.ts", "../../packages/core/src/utils/cache.ts", "../../packages/core/src/utils/mime.ts", "../../packages/core/src/utils/compression.ts", "../../packages/elysia/src/routes/artifacts.ts", "../../packages/elysia/src/routes/content.ts", "../../packages/elysia/src/routes/dev.ts", "../../packages/elysia/src/utils/http.ts", "../../packages/elysia/src/routes/ssr.ts", "../../packages/elysia/src/routes/static.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"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",
|
|
6
|
+
"import { watch as fsWatch } from 'node:fs';\nimport type { Elysia } from 'elysia';\nimport type { ReactElement } from 'react';\nimport {\n\ttype BundleInfo,\n\tcomputeSSRDataForPath,\n\tdiscoverCollections,\n\tgenerateContentRegistry,\n\tgetBundleUrlsFor,\n\tLRUCache,\n\trebuildContentArtifacts,\n} from 'reroute-js/core';\nimport { registerArtifactsRoutes } from './routes/artifacts';\nimport { registerContentRoutes } from './routes/content';\nimport { registerDevRoutes } from './routes/dev';\nimport { registerSSRRoutes } from './routes/ssr';\nimport { registerStaticRoutes } from './routes/static';\nimport type { RerouteOptions } from './types';\nimport { jsonError, jsonWithCache } from './utils/http';\n\nconst reroute =\n\t(options: RerouteOptions = {}) =>\n\tasync (app: Elysia) => {\n\t\t// SSR configuration\n\t\tconst ssrHead = options.head || '';\n\t\tconst ssrLang = options.lang || 'en';\n\t\tconst ssrAppId = options.appId || 'root';\n\t\tconst entrypoint = options.entrypoint || 'index.tsx';\n\t\tconst rootComponent = options.app;\n\n\t\t// Static serving configuration\n\t\tconst assets = options.assets || 'src/client';\n\t\tlet prefix = options.prefix || '/';\n\t\tconst ignorePatterns = options.ignorePatterns || [\n\t\t\t'.DS_Store',\n\t\t\t'.git',\n\t\t\t'.env',\n\t\t\t'index.html', // Template file, not a static asset\n\t\t\t/favicon\\.ico/,\n\t\t\t/\\.well-known/,\n\t\t];\n\t\tconst staticHeaders = options.staticHeaders;\n\t\tconst maxAge = options.maxAge ?? 3600;\n\t\tconst directive = options.directive || 'public';\n\t\tconst indexHTML = options.indexHTML ?? true;\n\n\t\t// Build configuration\n\t\tconst minify = options.minify ?? process.env.NODE_ENV === 'production';\n\t\tconst sourcemap = options.sourcemap ?? true;\n\n\t\t// Normalize prefix\n\t\tif (prefix === '/') prefix = '';\n\n\t\tconst fileCache = new LRUCache<string, Response>(100);\n\t\tconst bundleCache = new Map<string, BundleInfo>();\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// Live reload SSE clients\n\t\tconst liveReloadClients = new Set<ReadableStreamDefaultController>();\n\t\tconst notifyReload = () => {\n\t\t\tconst encoder = new TextEncoder();\n\t\t\tconst message = encoder.encode('data: reload\\n\\n');\n\t\t\tfor (const controller of liveReloadClients) {\n\t\t\t\ttry {\n\t\t\t\t\tcontroller.enqueue(message);\n\t\t\t\t} catch {\n\t\t\t\t\tliveReloadClients.delete(controller);\n\t\t\t\t}\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 join = (...parts: string[]) => parts.join('/').replace(/\\/+/g, '/');\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 = process.execArgv[0] === '--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) {\n\t\t\tconsole.log(`[reroute] Live reload enabled`);\n\t\t}\n\n\t\t// Generate content registry at startup (write-only-if-changed)\n\t\tawait generateContentRegistry(cwd);\n\n\t\t// Lazy compute default bundle URL on first usage\n\t\tlet cachedBundleUrlPromise: Promise<string> | null = null;\n\t\tconst ensureBundleUrl = () => {\n\t\t\tif (!cachedBundleUrlPromise) {\n\t\t\t\tcachedBundleUrlPromise = getBundleUrlsFor(\n\t\t\t\t\tentrypoint,\n\t\t\t\t\tclientDir,\n\t\t\t\t\tprefix,\n\t\t\t\t\t{ minify, sourcemap },\n\t\t\t\t\tbundleCache,\n\t\t\t\t).then((u) => u[0]);\n\t\t\t}\n\t\t\treturn cachedBundleUrlPromise;\n\t\t};\n\n\t\t// Register content routes\n\t\tregisterContentRoutes(app, clientDir, prefix, isWatchMode);\n\n\t\t// Register dev mode routes (SSE, live reload, preload)\n\t\tregisterDevRoutes(app, liveReloadClients, isWatchMode, {\n\t\t\tclientDir,\n\t\t\tcwd,\n\t\t\tdataCacheControl,\n\t\t});\n\n\t\t// Data prefetch endpoint for client Link prefetch (all modes)\n\t\tapp.get('/__reroute_data', async ({ query, headers }) => {\n\t\t\tconst p = String(query.path || query.p || '/');\n\t\t\tlet pathname = '/';\n\t\t\ttry {\n\t\t\t\tconst u = new URL(p, 'http://localhost');\n\t\t\t\tpathname = u.pathname + u.search;\n\t\t\t} catch {\n\t\t\t\tpathname = String(p);\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tconst data = 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\treturn jsonWithCache(\n\t\t\t\t\t{ data },\n\t\t\t\t\tdataCacheControl,\n\t\t\t\t\theaders as Record<string, string>,\n\t\t\t\t);\n\t\t\t} catch (_e) {\n\t\t\t\treturn jsonError('failed', 500);\n\t\t\t}\n\t\t});\n\n\t\t// File system watcher (dev): trigger build + client reload on changes under assets\n\t\tif (isWatchMode) {\n\t\t\ttry {\n\t\t\t\tlet debounce: NodeJS.Timeout;\n\t\t\t\tconst schedule = () => {\n\t\t\t\t\tclearTimeout(debounce);\n\t\t\t\t\tdebounce = setTimeout(async () => {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tbundleCache.clear();\n\t\t\t\t\t\t\tcachedBundleUrlPromise = null;\n\t\t\t\t\t\t\tawait rebuildContentArtifacts(cwd, clientDir, true);\n\t\t\t\t\t\t\tnotifyReload();\n\t\t\t\t\t\t\tconsole.log('[reroute] Rebuilt on change and notified clients');\n\t\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t\tconsole.error('[reroute] Dev rebuild failed:', e);\n\t\t\t\t\t\t}\n\t\t\t\t\t}, 120);\n\t\t\t\t};\n\n\t\t\t\tfsWatch(clientDir, { recursive: true }, (_event, filename) => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst name = String(filename || '');\n\t\t\t\t\t\tif (!name) return;\n\t\t\t\t\t\tif (!/\\.(ts|tsx|js|jsx|html|css|json)$/i.test(name)) return;\n\t\t\t\t\t\tif (shouldIgnore(join(clientDir, name))) return;\n\t\t\t\t\t\tschedule();\n\t\t\t\t\t} catch {}\n\t\t\t\t});\n\t\t\t\tconsole.log(`[reroute] Watching ${clientDir} for changes`);\n\t\t\t} catch (e) {\n\t\t\t\tconsole.warn('[reroute] Failed to start dev file watcher:', e);\n\t\t\t}\n\t\t}\n\n\t\t// Register artifacts routes (.reroute directory)\n\t\tregisterArtifactsRoutes(app, cwd);\n\n\t\t// Register SSR routes if root component is provided\n\t\tif (rootComponent) {\n\t\t\tconst collections = await discoverCollections(clientDir);\n\t\t\tif (collections.length > 0) {\n\t\t\t\tconsole.log(\n\t\t\t\t\t`[reroute] Discovered collections: ${collections.join(', ')}`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tregisterSSRRoutes(app, {\n\t\t\t\trootComponent: rootComponent as ReactElement,\n\t\t\t\tclientDir,\n\t\t\t\tcwd,\n\t\t\t\tisWatchMode,\n\t\t\t\tgetBundleUrl: ensureBundleUrl,\n\t\t\t\thead: ssrHead,\n\t\t\t\tlang: ssrLang,\n\t\t\t\tappId: ssrAppId,\n\t\t\t\tcollections,\n\t\t\t\tminify,\n\t\t\t\tdataCacheControl,\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\tminify,\n\t\t\tsourcemap,\n\t\t\tshouldIgnore: shouldIgnore as () => boolean,\n\t\t\tbundleCache,\n\t\t\tfileCache,\n\t\t\tisWatchMode,\n\t\t});\n\n\t\treturn app;\n\t};\n\nexport { reroute };\n",
|
|
7
|
+
"export async function generateContentHash(content: string): Promise<string> {\n\tconst data = new TextEncoder().encode(content);\n\tconst buf = await crypto.subtle.digest('SHA-256', data);\n\tlet hex = '';\n\tfor (const b of new Uint8Array(buf)) hex += b.toString(16).padStart(2, '0');\n\treturn hex.slice(0, 8);\n}\n",
|
|
8
|
+
"import type { BuildOutput } from 'bun';\nimport type { BundleInfo, BundleOptions } from '../types';\nimport { basename, extname } from '../utils/path';\nimport { generateContentHash } from './hash';\n\nexport async function transpileFile(\n\tfilePath: string,\n\toriginalPath: string,\n\toptions: BundleOptions,\n\tbundleCache: Map<string, BundleInfo>,\n): Promise<BundleInfo> {\n\tconst src = await Bun.file(filePath).text();\n\tconst cacheKey = `${filePath}-${await generateContentHash(src)}`;\n\n\tif (bundleCache.has(cacheKey)) {\n\t\t// biome-ignore lint/style/noNonNullAssertion: it's okay\n\t\treturn bundleCache.get(cacheKey)!;\n\t}\n\n\tconsole.log(\n\t\t`[reroute] Building ${originalPath}${options.minify ? ' (minified)' : ''}...`,\n\t);\n\n\tasync function doBuild(sm: 'external' | 'none') {\n\t\treturn await Bun.build({\n\t\t\tentrypoints: [filePath],\n\t\t\ttarget: 'browser',\n\t\t\tformat: 'esm',\n\t\t\tminify: options.minify,\n\t\t\tsplitting: false,\n\t\t\tsourcemap: sm,\n\t\t\tdefine: {\n\t\t\t\t'process.env.NODE_ENV': options.minify\n\t\t\t\t\t? '\"production\"'\n\t\t\t\t\t: '\"development\"',\n\t\t\t},\n\t\t});\n\t}\n\n\tlet result: BuildOutput;\n\ttry {\n\t\tresult = await doBuild(options.sourcemap ? 'external' : 'none');\n\t\tif (!result.success) {\n\t\t\tconsole.warn(\n\t\t\t\t`[reroute] Build failed for ${originalPath}, retrying without sourcemap...`,\n\t\t\t);\n\t\t\tresult = await doBuild('none');\n\t\t}\n\t} catch (error) {\n\t\t// Bun.build may throw (e.g., EISDIR) instead of returning success=false\n\t\tconsole.warn(\n\t\t\t`[reroute] Build errored for ${originalPath} (sourcemap external). Retrying without sourcemap...`,\n\t\t\terror,\n\t\t);\n\t\tresult = await doBuild('none');\n\t}\n\n\tif (!result.success) {\n\t\tconsole.error(`[reroute] Failed to build ${filePath}`);\n\t\tfor (const log of result.logs) console.error(log);\n\t\tthrow new Error(`Failed to transpile ${filePath}`);\n\t}\n\n\tconst output = result.outputs[0];\n\tconst code = await output.text();\n\n\tlet sourceMap: string | undefined;\n\tif (options.sourcemap && result.outputs.length > 1) {\n\t\tconst mapOutput = result.outputs.find((o) => o.path.endsWith('.map'));\n\t\tif (mapOutput) {\n\t\t\tsourceMap = await mapOutput.text();\n\t\t}\n\t}\n\n\tconst contentHash = await generateContentHash(code);\n\n\tconst bundleInfo: BundleInfo = {\n\t\thash: contentHash,\n\t\tcode,\n\t\tsourceMap,\n\t};\n\n\tbundleCache.set(cacheKey, bundleInfo);\n\n\tconst sizeKB = (code.length / 1024).toFixed(2);\n\tconst gzippedSize = Bun.gzipSync(new TextEncoder().encode(code)).length;\n\tconst gzippedKB = (gzippedSize / 1024).toFixed(2);\n\tconsole.log(\n\t\t`[reroute] Built ${originalPath} -> ${sizeKB} KB (${gzippedKB} KB gzipped)`,\n\t);\n\n\treturn bundleInfo;\n}\n\n// (no helpers)\n\nexport async function getBundleUrlsFor(\n\tmodules: string | string[],\n\tclientDir: string,\n\tprefix: string,\n\toptions: BundleOptions,\n\tbundleCache: Map<string, BundleInfo>,\n): Promise<string[]> {\n\tconst mods = Array.isArray(modules) ? modules : [modules];\n\tconst urls: string[] = [];\n\tconst { join } = await import('../utils/path');\n\n\tfor (const mod of mods) {\n\t\tconst rel = mod.replace(/^\\.\\//, '');\n\t\tconst fullPath = join(clientDir, rel);\n\t\ttry {\n\t\t\tconst bundleInfo = await transpileFile(\n\t\t\t\tfullPath,\n\t\t\t\trel,\n\t\t\t\toptions,\n\t\t\t\tbundleCache,\n\t\t\t);\n\t\t\tconst base = basename(rel, extname(rel));\n\t\t\turls.push(`${prefix}/${base}.${bundleInfo.hash}.js`);\n\t\t} catch (error) {\n\t\t\tconsole.error(`[reroute] Error getting bundle URL for ${rel}:`, error);\n\t\t\turls.push(`${prefix}/${rel}`);\n\t\t}\n\t}\n\treturn urls;\n}\n",
|
|
9
|
+
"import { mkdir, readdir } from 'node:fs/promises';\nimport { pathToFileURL } from 'node:url';\nimport type { Doc } from '../types';\nimport { join } from '../utils/path';\n\nasync function sha8(text: string): Promise<string> {\n\tconst data = new TextEncoder().encode(text);\n\tconst buf = await crypto.subtle.digest('SHA-256', data);\n\tlet hex = '';\n\tfor (const b of new Uint8Array(buf)) hex += b.toString(16).padStart(2, '0');\n\treturn hex.slice(0, 8);\n}\n\nasync function buildChunkFor(\n\tabsSrc: string,\n\tcwd: string,\n\tcollection: string,\n\tname: string,\n): Promise<{ outPath: string; url: string; code: string } | null> {\n\ttry {\n\t\tconst result = await Bun.build({\n\t\t\tentrypoints: [absSrc],\n\t\t\ttarget: 'browser',\n\t\t\tformat: 'esm',\n\t\t\tsplitting: false,\n\t\t\tsourcemap: 'none',\n\t\t\tminify: false,\n\t\t\tdefine: { 'process.env.NODE_ENV': '\"production\"' },\n\t\t});\n\t\tif (!result.success) return null;\n\t\tconst code = await result.outputs[0]?.text();\n\t\tconst hash = await sha8(code);\n\t\tconst relDir = join('.reroute', 'chunks', collection);\n\t\tconst absDir = join(cwd, relDir);\n\t\tconst outFile = `${name}.${hash}.js`;\n\t\tconst outPath = join(absDir, outFile);\n\t\tawait mkdir(absDir, { recursive: true });\n\t\tconst exists = await Bun.file(outPath).exists();\n\t\tif (!exists) await Bun.write(outPath, code);\n\t\tconst url = `/${join(relDir, outFile).replace(/\\\\+/g, '/')}`;\n\t\treturn { outPath, url, code };\n\t} catch (e) {\n\t\tconsole.error('[reroute] Failed to build content chunk:', absSrc, e);\n\t\treturn null;\n\t}\n}\n\nasync function getMetaFor(absSrc: string, isWatchMode: boolean): Promise<Doc> {\n\ttry {\n\t\tconst url =\n\t\t\tpathToFileURL(absSrc).href + (isWatchMode ? `?t=${Date.now()}` : '');\n\t\tconst m = (await import(url)) as Doc;\n\t\treturn (m as Doc).meta || (m as Doc).frontmatter || {};\n\t} catch {\n\t\treturn {} as Doc;\n\t}\n}\n\nexport async function rebuildContentArtifacts(\n\tcwd: string,\n\tclientDir: string,\n\tisWatchMode = true,\n): Promise<void> {\n\tconst routesRoot = join(clientDir, 'routes');\n\tconst items: Array<{\n\t\tcollection: string;\n\t\tname: string;\n\t\tslug: string;\n\t\thref: string;\n\t\tmoduleUrl: string;\n\t\tmeta: Doc;\n\t}> = [];\n\n\ttry {\n\t\tconst entries = await readdir(routesRoot, { withFileTypes: true });\n\t\tfor (const dir of entries) {\n\t\t\tif (!dir.isDirectory()) continue;\n\t\t\tconst collection = dir.name;\n\t\t\tconst contentDir = join(routesRoot, collection, 'content');\n\t\t\tlet contentFiles: string[] = [];\n\t\t\ttry {\n\t\t\t\tconst list = await readdir(contentDir, { withFileTypes: true });\n\t\t\t\tcontentFiles = list\n\t\t\t\t\t.filter(\n\t\t\t\t\t\t(e) =>\n\t\t\t\t\t\t\te.isFile() &&\n\t\t\t\t\t\t\t/\\.(tsx|ts)$/.test(e.name) &&\n\t\t\t\t\t\t\t!e.name.startsWith('_'),\n\t\t\t\t\t)\n\t\t\t\t\t.map((e) => e.name);\n\t\t\t} catch {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tfor (const file of contentFiles) {\n\t\t\t\tconst name = file.replace(/\\.(tsx|ts)$/, '');\n\t\t\t\tconst absSrc = join(contentDir, file);\n\t\t\t\tconst chunk = await buildChunkFor(absSrc, cwd, collection, name);\n\t\t\t\tif (!chunk) continue;\n\t\t\t\tconst meta = await getMetaFor(absSrc, isWatchMode);\n\t\t\t\titems.push({\n\t\t\t\t\tcollection,\n\t\t\t\t\tname,\n\t\t\t\t\tslug: name,\n\t\t\t\t\thref: `/${collection}/${name}`,\n\t\t\t\t\tmoduleUrl: chunk.url,\n\t\t\t\t\tmeta,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t} catch (e) {\n\t\tconsole.error('[reroute] Failed to scan content routes:', e);\n\t\treturn;\n\t}\n\n\t// Write .reroute/content.ts\n\ttry {\n\t\tconst lines: string[] = [];\n\t\tlines.push('// 🚨 Auto-generated by Reroute - DO NOT EDIT 🚨');\n\t\tlines.push('/* eslint-disable */');\n\t\tlines.push('// @ts-nocheck');\n\t\tlines.push('');\n\t\tlines.push('export const contents = [');\n\t\tfor (const e of items) {\n\t\t\tlines.push(\n\t\t\t\t\" { collection: '\" +\n\t\t\t\t\te.collection +\n\t\t\t\t\t\"', slug: '\" +\n\t\t\t\t\te.slug +\n\t\t\t\t\t\"', name: '\" +\n\t\t\t\t\te.name +\n\t\t\t\t\t\"', href: '\" +\n\t\t\t\t\te.href +\n\t\t\t\t\t\"', module: '\" +\n\t\t\t\t\te.moduleUrl +\n\t\t\t\t\t\"', meta: \" +\n\t\t\t\t\tJSON.stringify(e.meta || {}) +\n\t\t\t\t\t' },',\n\t\t\t);\n\t\t}\n\t\tlines.push('] as const;');\n\t\tlines.push('');\n\t\tlines.push('export const byCollection: Record<string, any[]> = {};');\n\t\tlines.push(\n\t\t\t'for (const c of contents) { (byCollection[c.collection] ||= []).push(c as any); }',\n\t\t);\n\t\tlines.push('');\n\t\tlines.push(\n\t\t\t'export const byCollectionAndName: Record<string, Record<string, any>> = {};',\n\t\t);\n\t\tlines.push(\n\t\t\t'for (const c of contents) { ((byCollectionAndName[c.collection] ||= {})[c.name] = c as any); }',\n\t\t);\n\t\tlines.push('');\n\t\tlines.push('export type Collections = keyof typeof byCollection;');\n\t\tlines.push(\n\t\t\t'export type Names<C extends Collections> = keyof (typeof byCollectionAndName)[C];',\n\t\t);\n\t\tlines.push('export type ContentEntry = (typeof contents)[number];');\n\t\tlines.push('');\n\t\tlines.push(\n\t\t\t'export function getContentEntry<C extends string, N extends string>(collection: C, name: N) {',\n\t\t);\n\t\tlines.push(' const m = (byCollectionAndName as any)[collection];');\n\t\tlines.push(' return m ? (m as Record<string, any>)[name] : undefined;');\n\t\tlines.push('}');\n\t\tlines.push('');\n\n\t\tawait mkdir(join(cwd, '.reroute'), { recursive: true });\n\t\tawait Bun.write(join(cwd, '.reroute', 'content.ts'), lines.join('\\n'));\n\t} catch (e) {\n\t\tconsole.error('[reroute] Failed to write .reroute/content.ts:', e);\n\t}\n\n\t// Write per-collection files\n\ttry {\n\t\tconst byCol = new Map<string, typeof items>();\n\t\tfor (const it of items) {\n\t\t\tconst arr = byCol.get(it.collection) || ([] as typeof items);\n\t\t\tarr.push(it);\n\t\t\tbyCol.set(it.collection, arr);\n\t\t}\n\t\tawait mkdir(join(cwd, '.reroute', 'collections'), { recursive: true });\n\t\tfor (const [collection, list] of byCol) {\n\t\t\tconst js: string[] = [];\n\t\t\tjs.push('// 🚨 Auto-generated by Reroute - DO NOT EDIT 🚨');\n\t\t\tjs.push('');\n\t\t\tjs.push('export const items = [');\n\t\t\tfor (const e of list) {\n\t\t\t\tjs.push(\n\t\t\t\t\t` { collection: '${e.collection}', slug: '${e.slug}', name: '${e.name}', href: '${e.href}', module: '${e.moduleUrl}', meta: ${JSON.stringify(e.meta || {})} },`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tjs.push('];');\n\t\t\tjs.push('');\n\t\t\tjs.push('export const byName = {};');\n\t\t\tjs.push('for (const it of items) { byName[it.name] = it; }');\n\t\t\tjs.push('');\n\t\t\tjs.push('export function get(collectionName, name) {');\n\t\t\tjs.push(` if (collectionName !== '${collection}') return undefined;`);\n\t\t\tjs.push(' return byName[name];');\n\t\t\tjs.push('}');\n\t\t\tjs.push('');\n\t\t\tawait Bun.write(\n\t\t\t\tjoin(cwd, '.reroute', 'collections', `${collection}.js`),\n\t\t\t\tjs.join('\\n'),\n\t\t\t);\n\t\t}\n\t} catch (e) {\n\t\tconsole.error('[reroute] Failed to write .reroute/collections/*:', e);\n\t}\n\n\tconsole.log('[reroute] Content artifacts up-to-date');\n}\n",
|
|
10
|
+
"import { readdir, stat } from 'node:fs/promises';\nimport type { ContentItemDTO } from '../types';\nimport { basename, join, stripEnd, stripStart } from '../utils/path';\nimport { getContentMeta } from './metadata';\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\nexport async function buildContentDTOs(\n\tcollectionPath: string,\n\tclientDir: string,\n\tprefix: string,\n\tisWatchMode: boolean,\n): Promise<ContentItemDTO[]> {\n\tconst normalized = stripStart(stripEnd(collectionPath, '/'), '/');\n\tconst contentRelDir = join('routes', normalized, 'content');\n\tconst contentAbsDir = join(clientDir, contentRelDir);\n\n\tconst files = await listContentFiles(contentAbsDir, '');\n\tconst items: ContentItemDTO[] = [];\n\tfor (const rel of files) {\n\t\tconst fullRelPath = join(contentRelDir, rel);\n\t\tconst absPath = join(clientDir, fullRelPath);\n\t\tconst noExt = rel.replace(/\\.(tsx|ts)$/, '');\n\t\tconst name = basename(noExt);\n\n\t\t// Use raw TSX path; served and transpiled on-demand by static route\n\t\tconst moduleUrl = `${prefix}/${fullRelPath}`.replace(/\\/+/g, '/');\n\t\tconst meta = await getContentMeta(absPath, isWatchMode);\n\t\t// Use the last path segment for href to fit current '/blog/:slug' route\n\t\tconst href = `/${normalized}/${name}`.replace(/\\\\+/g, '/');\n\n\t\titems.push({\n\t\t\tslug: noExt,\n\t\t\tname,\n\t\t\tpath: fullRelPath,\n\t\t\tmodule: moduleUrl,\n\t\t\tmeta,\n\t\t\thref,\n\t\t});\n\t}\n\treturn items;\n}\n\nexport async function discoverCollections(\n\tclientDir: string,\n): Promise<string[]> {\n\tconst root = join(clientDir, 'routes');\n\tconst collections = new Set<string>();\n\ttry {\n\t\tconst entries = await readdir(root, { withFileTypes: true });\n\t\tfor (const entry of entries) {\n\t\t\tif (entry.isDirectory()) {\n\t\t\t\tconst contentDir = join(root, entry.name, 'content');\n\t\t\t\ttry {\n\t\t\t\t\tawait stat(contentDir);\n\t\t\t\t\tcollections.add(entry.name);\n\t\t\t\t} catch {\n\t\t\t\t\t// content directory doesn't exist, skip\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t} catch {\n\t\t// routes directory doesn't exist\n\t}\n\treturn Array.from(collections);\n}\n",
|
|
11
|
+
"import { stat } from 'node:fs/promises';\nimport { pathToFileURL } from 'node:url';\nimport type { ContentMeta, Doc } from '../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",
|
|
12
|
+
"import { join } from '../utils/path';\n\nexport async function generateContentRegistry(cwd: string): Promise<void> {\n\t// Use pre-built routes written by the example build step (.reroute/content.ts)\n\t// Avoid generating at runtime to prevent dev loops.\n\ttry {\n\t\tconst p = join(cwd, '.reroute', 'content.ts');\n\t\tconst exists = await Bun.file(p).exists();\n\t\tconsole.log(\n\t\t\texists\n\t\t\t\t? '[reroute] Content registry up-to-date'\n\t\t\t\t: '[reroute] Warning: .reroute/content.ts not found',\n\t\t);\n\t} catch {}\n}\n",
|
|
13
|
+
"import { pathToFileURL } from 'node:url';\nimport type { Doc } from '../types';\nimport { join } from '../utils/path';\nimport { seedSSRModuleForPath } from './seed';\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\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) 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\treturn await dataFn({ pathname, params: { name: parts[1] } } as Doc);\n\t\t\t}\n\t\t}\n\t} catch {}\n\n\t// 2) 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\treturn await dataFn({ pathname, params: paramsValue } as Doc);\n\t\t\t\t}\n\t\t\t} catch {}\n\t\t}\n\t} catch {}\n\n\treturn null;\n}\n",
|
|
14
|
+
"import { readdir, stat } from 'node:fs/promises';\nimport { pathToFileURL } from 'node:url';\nimport type { Doc } from '../types';\nimport { join } from '../utils/path';\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 abs = join(cwd, moduleUrl.replace(/^\\//, ''));\n\t\t\t\tconst href =\n\t\t\t\t\tpathToFileURL(abs).href + (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// 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",
|
|
15
|
+
"import type { Doc } from '../types';\nimport { importContentModuleForPath } from './modules';\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",
|
|
16
|
+
"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// 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",
|
|
17
|
+
"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",
|
|
18
|
+
"import type { TemplateContext } from '../types';\nimport { join } from '../utils/path';\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// 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\thtml = html.replace(rootDivRegex, `$1${appHtml}$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}\">${appHtml}</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",
|
|
19
|
+
"class LRUCache<K, V> {\n\tprivate cache: Map<K, V>;\n\tprivate maxSize: number;\n\n\tconstructor(maxSize: number = 100) {\n\t\tthis.cache = new Map();\n\t\tthis.maxSize = maxSize;\n\t}\n\n\tget(key: K): V | undefined {\n\t\tif (!this.cache.has(key)) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\t// Move to end (most recently used)\n\t\t// biome-ignore lint/style/noNonNullAssertion: it's all good\n\t\tconst value = this.cache.get(key)!;\n\t\tthis.cache.delete(key);\n\t\tthis.cache.set(key, value);\n\n\t\treturn value;\n\t}\n\n\tset(key: K, value: V): void {\n\t\t// Delete if exists to reinsert at end\n\t\tif (this.cache.has(key)) {\n\t\t\tthis.cache.delete(key);\n\t\t}\n\n\t\tthis.cache.set(key, value);\n\n\t\t// Evict least recently used if over size\n\t\tif (this.cache.size > this.maxSize) {\n\t\t\tconst firstKey = this.cache.keys().next().value;\n\t\t\tthis.cache.delete(firstKey as K);\n\t\t}\n\t}\n\n\thas(key: K): boolean {\n\t\treturn this.cache.has(key);\n\t}\n\n\tclear(): void {\n\t\tthis.cache.clear();\n\t}\n\n\tget size(): number {\n\t\treturn this.cache.size;\n\t}\n}\n\nexport { LRUCache };\n",
|
|
20
|
+
"export function getMimeType(filePath: string): string {\n\tconst ext = filePath.split('.').pop()?.toLowerCase();\n\tconst mimeTypes: Record<string, string> = {\n\t\thtml: 'text/html',\n\t\tcss: 'text/css',\n\t\tjs: 'application/javascript',\n\t\tts: 'application/javascript',\n\t\tjson: 'application/json',\n\t\tpng: 'image/png',\n\t\tjpg: 'image/jpeg',\n\t\tjpeg: 'image/jpeg',\n\t\tgif: 'image/gif',\n\t\tsvg: 'image/svg+xml',\n\t\tico: 'image/x-icon',\n\t\twoff: 'font/woff',\n\t\twoff2: 'font/woff2',\n\t\tttf: 'font/ttf',\n\t};\n\treturn mimeTypes[ext || ''] || 'application/octet-stream';\n}\n\nexport function isCompressible(contentType: string): boolean {\n\tif (!contentType) return false;\n\tconst ct = contentType.split(';')[0].trim();\n\treturn (\n\t\tct.startsWith('text/') ||\n\t\tct === 'application/javascript' ||\n\t\tct === 'application/json' ||\n\t\tct === 'application/xml' ||\n\t\tct === 'image/svg+xml'\n\t);\n}\n",
|
|
21
|
+
"import type { CompressionResult } from '../types';\nimport { isCompressible } from './mime';\n\nexport function acceptsGzip(acceptEncoding?: string): boolean {\n\treturn Boolean(acceptEncoding && /gzip/i.test(acceptEncoding));\n}\n\nexport function 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 (acceptsGzip(acceptEncoding) && isCompressible(contentType)) {\n\t\ttry {\n\t\t\tconst compressed = Bun.gzipSync(toBytes(body));\n\t\t\textraHeaders['Content-Encoding'] = 'gzip';\n\t\t\textraHeaders.Vary = 'Accept-Encoding';\n\t\t\treturn { body: compressed, extraHeaders };\n\t\t} catch {\n\t\t\t// ignore and fallthrough\n\t\t}\n\t}\n\treturn { body, extraHeaders };\n}\n",
|
|
22
|
+
"import type { Elysia } from 'elysia';\nimport { NotFoundError } from 'elysia';\nimport { getMimeType, gzipIfAccepted, join } from 'reroute-js/core';\n\nexport function registerArtifactsRoutes(app: Elysia, cwd: string): Elysia {\n\t// Serve generated routes and content chunks from project root .reroute\n\tapp.get('/.reroute/*', async ({ params, headers }) => {\n\t\tconst sub = String(params['*'] || '').replace(/^\\/+/, '');\n\t\tif (!sub) throw new NotFoundError();\n\t\tconst abs = join(cwd, '.reroute', sub);\n\t\ttry {\n\t\t\tconst exists = await Bun.file(abs).exists();\n\t\t\tif (!exists) throw new NotFoundError();\n\t\t\tconst buf = await Bun.file(abs).arrayBuffer();\n\t\t\tconst content = new Uint8Array(buf);\n\t\t\tconst contentType = getMimeType(abs);\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\t\t\treturn 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// Artifacts/chunks are hashed; cache aggressively\n\t\t\t\t\t'Cache-Control': 'public, max-age=31536000, immutable',\n\t\t\t\t\t...extraHeaders,\n\t\t\t\t},\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 .reroute file:', abs, e);\n\t\t\tthrow new NotFoundError();\n\t\t}\n\t});\n\n\treturn app;\n}\n",
|
|
23
|
+
"import type { Elysia } from 'elysia';\nimport { NotFoundError } from 'elysia';\nimport { buildContentDTOs } from 'reroute-js/core';\n\nexport function registerContentRoutes(\n\tapp: Elysia,\n\tclientDir: string,\n\tprefix: string,\n\tisWatchMode: boolean,\n): Elysia {\n\t// Content manifest endpoint (JSON)\n\tapp.get('/__content/*', async ({ params, set }) => {\n\t\tconst collectionPath = String(params['*'] || '').trim();\n\t\tif (!collectionPath) throw new NotFoundError();\n\t\tconst items = await buildContentDTOs(\n\t\t\tcollectionPath,\n\t\t\tclientDir,\n\t\t\tprefix,\n\t\t\tisWatchMode,\n\t\t);\n\t\tconst body = JSON.stringify({ collection: collectionPath, items });\n\t\tset.status = 200;\n\t\tset.headers['content-type'] = 'application/json; charset=utf-8';\n\t\treturn new Response(body);\n\t});\n\n\treturn app;\n}\n",
|
|
24
|
+
"import type { Elysia } from 'elysia';\nimport { NotFoundError } from 'elysia';\nimport { computeSSRDataForPath } from 'reroute-js/core';\nimport { jsonError, jsonWithCache } from '../utils/http';\n\nexport function registerDevRoutes(\n\tapp: Elysia,\n\tliveReloadClients: Set<ReadableStreamDefaultController>,\n\tisWatchMode: boolean,\n\topts?: { clientDir: string; cwd: string; dataCacheControl?: string },\n): Elysia {\n\t// Always register preload endpoint (used in SSR in all modes)\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 safeSource =\n\t\t\tsrc.startsWith('/routes/') &&\n\t\t\t/^[A-Za-z0-9_./\\-[\\]]+\\.(tsx?|js)$/.test(src);\n\t\tconst safe = (safeChunk || 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\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': isWatchMode\n\t\t\t\t\t? 'no-cache'\n\t\t\t\t\t: 'public, max-age=31536000, immutable',\n\t\t\t},\n\t\t});\n\t});\n\n\t// Lightweight data endpoint used by Link prefetch and client navigations\n\tapp.get('/__reroute_data', async ({ query, headers }) => {\n\t\tconst p = String(query.path || query.p || '/');\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\tconst data = await computeSSRDataForPath({\n\t\t\t\tpathname,\n\t\t\t\tclientDir: opts?.clientDir || '',\n\t\t\t\tcwd: opts?.cwd || '',\n\t\t\t\tisWatchMode,\n\t\t\t});\n\t\t\treturn jsonWithCache(\n\t\t\t\t{ data },\n\t\t\t\topts?.dataCacheControl || '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\tif (!isWatchMode) return app;\n\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\tconst stream = new ReadableStream({\n\t\t\tstart(controller) {\n\t\t\t\tliveReloadClients.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\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\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\t// Dev live-reload client as a separate module\n\tapp.get('/__reroute_watch.js', () => {\n\t\tconst code =\n\t\t\t`// live-reload client\\n` +\n\t\t\t`const url='/__reroute_watch';\\n` +\n\t\t\t`let es; let reloading=false;\\n` +\n\t\t\t`function waitServerThenReload(){\\n` +\n\t\t\t` const ping = () => fetch(location.origin, { cache: 'no-store' })\\n` +\n\t\t\t` .then(()=>location.reload())\\n` +\n\t\t\t` .catch(()=>setTimeout(ping, 300));\\n` +\n\t\t\t` ping();\\n` +\n\t\t\t`}\\n` +\n\t\t\t`function connect(){\\n` +\n\t\t\t` es=new EventSource(url);\\n` +\n\t\t\t` es.onopen=()=>console.log('[reroute] watching changes');\\n` +\n\t\t\t` es.onmessage=(e)=>{ if(e.data==='reload'){ reloading=true; try{ es.close(); }catch{} waitServerThenReload(); } };\\n` +\n\t\t\t` es.onerror=()=>{ if(!reloading){ reloading=true; try{ es.close(); }catch{} waitServerThenReload(); } };\\n` +\n\t\t\t`}\\n` +\n\t\t\t`connect();\\nexport {};`;\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",
|
|
25
|
+
"// 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",
|
|
26
|
+
"import type { Elysia } from 'elysia';\nimport { NotFoundError } from 'elysia';\nimport type { ReactElement } from 'react';\nimport {\n\tcomputeSSRDataForPath,\n\tgenerateContentRegistry,\n\trenderSSRDocument,\n} from 'reroute-js/core';\nimport { jsonError, jsonWithCache } from '../utils/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\t// Cache-Control header value for data responses\n\tdataCacheControl?: string;\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\tdataCacheControl,\n\t} = options;\n\n\t// Register SSR routes for each collection\n\tfor (const collection of collections) {\n\t\tapp.get(`/${collection}/*`, async ({ request }) => {\n\t\t\tconst method = request.method || 'GET';\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\t// Use the full request pathname to avoid losing the collection prefix\n\t\t\t\tconst pathname = new URL(request.url).pathname;\n\t\t\t\tconst bundleUrl = await getBundleUrl();\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\t\t\t\treturn new Response(result.html, {\n\t\t\t\t\tstatus: result.status,\n\t\t\t\t\theaders: {\n\t\t\t\t\t\t'content-type': 'text/html; charset=utf-8',\n\t\t\t\t\t\tVary: 'Accept',\n\t\t\t\t\t},\n\t\t\t\t});\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\t// Serve data prefetch endpoint here if not explicitly matched\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\t\t\t\t\tconst data = await computeSSRDataForPath({\n\t\t\t\t\t\tpathname: p,\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});\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' && !isInternal) {\n\t\t\t\ttry {\n\t\t\t\t\t// In watch mode, regenerate content registry to pick up new files\n\t\t\t\t\tif (isWatchMode) {\n\t\t\t\t\t\tawait generateContentRegistry(cwd);\n\t\t\t\t\t}\n\n\t\t\t\t\t// Unified SSR rendering path (handles content and static routes with meta/ssr)\n\t\t\t\t\tconst bundleUrl = await getBundleUrl();\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\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\treturn new Response(result.html);\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",
|
|
27
|
+
"import type { Elysia } from 'elysia';\nimport { NotFoundError } from 'elysia';\nimport {\n\ttype BundleInfo,\n\tgetMimeType,\n\tgzipIfAccepted,\n\tjoin,\n\ttype LRUCache,\n\ttranspileFile,\n} from 'reroute-js/core';\n\ntype StaticRouteOptions = {\n\tclientDir: string;\n\tprefix: string;\n\tmaxAge: number;\n\tdirective: string;\n\tindexHTML: boolean;\n\tstaticHeaders?: Record<string, string>;\n\tminify: boolean;\n\tsourcemap: boolean;\n\tshouldIgnore: (file: string) => boolean;\n\tbundleCache: Map<string, BundleInfo>;\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\tminify,\n\t\tsourcemap,\n\t\tshouldIgnore,\n\t\tbundleCache,\n\t\tfileCache,\n\t\tisWatchMode,\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\t// Handle hashed JS bundles (e.g., index.abc123.js)\n\t\tconst hashedJsMatch = requestPath.match(/^(.+)\\.([a-f0-9]{8})\\.js$/);\n\t\tif (hashedJsMatch) {\n\t\t\tconst [, filename, hash] = hashedJsMatch;\n\n\t\t\tconst tsxPath = join(clientDir, `${filename}.tsx`);\n\t\t\tconst tsPath = join(clientDir, `${filename}.ts`);\n\n\t\t\tlet filePath: string | null = null;\n\t\t\tif (await Bun.file(tsxPath).exists()) {\n\t\t\t\tfilePath = tsxPath;\n\t\t\t} else if (await Bun.file(tsPath).exists()) {\n\t\t\t\tfilePath = tsPath;\n\t\t\t}\n\n\t\t\tif (filePath) {\n\t\t\t\ttry {\n\t\t\t\t\tconst bundleInfo = await transpileFile(\n\t\t\t\t\t\tfilePath,\n\t\t\t\t\t\t`${filename}.tsx`,\n\t\t\t\t\t\t{ minify, sourcemap },\n\t\t\t\t\t\tbundleCache,\n\t\t\t\t\t);\n\n\t\t\t\t\tif (bundleInfo.hash === hash) {\n\t\t\t\t\t\tconst contentType = 'application/javascript; charset=utf-8';\n\t\t\t\t\t\tconst { body, extraHeaders } = gzipIfAccepted(\n\t\t\t\t\t\t\tbundleInfo.code,\n\t\t\t\t\t\t\tcontentType,\n\t\t\t\t\t\t\theaders['accept-encoding'],\n\t\t\t\t\t\t);\n\t\t\t\t\t\treturn new Response(body as string, {\n\t\t\t\t\t\t\theaders: {\n\t\t\t\t\t\t\t\t'Content-Type': contentType,\n\t\t\t\t\t\t\t\t'Cache-Control': `${directive}, max-age=${365 * 24 * 60 * 60}, immutable`,\n\t\t\t\t\t\t\t\t...extraHeaders,\n\t\t\t\t\t\t\t\t...staticHeaders,\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 (error) {\n\t\t\t\t\tconsole.error(`[reroute] Error serving bundle:`, error);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Handle sourcemaps (e.g., index.abc123.js.map)\n\t\tconst sourceMapMatch = requestPath.match(/^(.+)\\.([a-f0-9]{8})\\.js\\.map$/);\n\t\tif (sourceMapMatch) {\n\t\t\tconst [, filename, hash] = sourceMapMatch;\n\n\t\t\tconst tsxPath = join(clientDir, `${filename}.tsx`);\n\t\t\tconst tsPath = join(clientDir, `${filename}.ts`);\n\n\t\t\tlet filePath: string | null = null;\n\t\t\tif (await Bun.file(tsxPath).exists()) {\n\t\t\t\tfilePath = tsxPath;\n\t\t\t} else if (await Bun.file(tsPath).exists()) {\n\t\t\t\tfilePath = tsPath;\n\t\t\t}\n\n\t\t\tif (filePath) {\n\t\t\t\ttry {\n\t\t\t\t\tconst bundleInfo = await transpileFile(\n\t\t\t\t\t\tfilePath,\n\t\t\t\t\t\t`${filename}.tsx`,\n\t\t\t\t\t\t{ minify, sourcemap },\n\t\t\t\t\t\tbundleCache,\n\t\t\t\t\t);\n\n\t\t\t\t\tif (bundleInfo.hash === hash && bundleInfo.sourceMap) {\n\t\t\t\t\t\tconst contentType = 'application/json; charset=utf-8';\n\t\t\t\t\t\tconst { body, extraHeaders } = gzipIfAccepted(\n\t\t\t\t\t\t\tbundleInfo.sourceMap,\n\t\t\t\t\t\t\tcontentType,\n\t\t\t\t\t\t\theaders['accept-encoding'],\n\t\t\t\t\t\t);\n\t\t\t\t\t\treturn new Response(body as string, {\n\t\t\t\t\t\t\theaders: {\n\t\t\t\t\t\t\t\t'Content-Type': contentType,\n\t\t\t\t\t\t\t\t'Cache-Control': `${directive}, max-age=${365 * 24 * 60 * 60}, immutable`,\n\t\t\t\t\t\t\t\t...extraHeaders,\n\t\t\t\t\t\t\t\t...staticHeaders,\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 (error) {\n\t\t\t\t\tconsole.error(`[reroute] Error serving sourcemap:`, error);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Handle .tsx/.ts files\n\t\tif (requestPath.endsWith('.tsx') || requestPath.endsWith('.ts')) {\n\t\t\t// Special-case content modules: redirect to prebuilt chunk to avoid on-the-fly bundling in dev\n\t\t\ttry {\n\t\t\t\tconst m = requestPath.match(\n\t\t\t\t\t/^routes\\/([^/]+)\\/content\\/([^/]+)\\.(tsx|ts)$/,\n\t\t\t\t);\n\t\t\t\tif (m) {\n\t\t\t\t\tconst collection = m[1];\n\t\t\t\t\tconst name = m[2];\n\t\t\t\t\t// Use registry mapping if available for exact chunk selection\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst cwd = process.cwd();\n\t\t\t\t\t\tconst regPath = join(cwd, '.reroute', 'content.ts');\n\t\t\t\t\t\tconst reg = await import(\n\t\t\t\t\t\t\t(await import('node:url')).pathToFileURL(regPath).href +\n\t\t\t\t\t\t\t\t`?t=${Date.now()}`\n\t\t\t\t\t\t);\n\t\t\t\t\t\tconst get = reg?.getContentEntry as (\n\t\t\t\t\t\t\tc: string,\n\t\t\t\t\t\t\tn: string,\n\t\t\t\t\t\t) => { module?: string } | undefined;\n\t\t\t\t\t\tconst entry =\n\t\t\t\t\t\t\ttypeof get === 'function' ? get(collection, name) : undefined;\n\t\t\t\t\t\tconst mod = entry?.module as string | undefined;\n\t\t\t\t\t\tif (mod?.endsWith('.js')) {\n\t\t\t\t\t\t\treturn new Response(null, {\n\t\t\t\t\t\t\t\tstatus: 302,\n\t\t\t\t\t\t\t\theaders: { Location: mod },\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch {}\n\n\t\t\t\t\t// Fallback: choose newest by mtime\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst chunkDir = join(\n\t\t\t\t\t\t\tprocess.cwd(),\n\t\t\t\t\t\t\t'.reroute',\n\t\t\t\t\t\t\t'chunks',\n\t\t\t\t\t\t\tcollection,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tconst files = await (await import('node:fs/promises')).readdir(\n\t\t\t\t\t\t\tchunkDir,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tconst candidates = files.filter(\n\t\t\t\t\t\t\t(n) => n.startsWith(`${name}.`) && n.endsWith('.js'),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (candidates.length) {\n\t\t\t\t\t\t\tlet latest = candidates[0];\n\t\t\t\t\t\t\tlet latestM = 0;\n\t\t\t\t\t\t\tconst { stat } = await import('node:fs/promises');\n\t\t\t\t\t\t\tfor (const f of candidates) {\n\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\tconst s = await stat(join(chunkDir, f));\n\t\t\t\t\t\t\t\t\tif (s.mtimeMs >= latestM) {\n\t\t\t\t\t\t\t\t\t\tlatestM = s.mtimeMs;\n\t\t\t\t\t\t\t\t\t\tlatest = f;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t} catch {}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tconst loc = `/${join('.reroute', 'chunks', collection, latest).replace(/\\\\+/g, '/')}`;\n\t\t\t\t\t\t\treturn new Response(null, {\n\t\t\t\t\t\t\t\tstatus: 302,\n\t\t\t\t\t\t\t\theaders: { Location: loc },\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} catch {}\n\n\t\t\tconst filePath = join(clientDir, requestPath);\n\n\t\t\tif (shouldIgnore(filePath)) throw new NotFoundError();\n\n\t\t\ttry {\n\t\t\t\tconst exists = await Bun.file(filePath).exists();\n\t\t\t\tif (!exists) throw new NotFoundError();\n\n\t\t\t\tconst bundleInfo = await transpileFile(\n\t\t\t\t\tfilePath,\n\t\t\t\t\trequestPath,\n\t\t\t\t\t{ minify, sourcemap },\n\t\t\t\t\tbundleCache,\n\t\t\t\t);\n\n\t\t\t\tconst contentType = 'application/javascript; charset=utf-8';\n\t\t\t\tconst { body, extraHeaders } = gzipIfAccepted(\n\t\t\t\t\tbundleInfo.code,\n\t\t\t\t\tcontentType,\n\t\t\t\t\theaders['accept-encoding'],\n\t\t\t\t);\n\t\t\t\treturn new Response(body as string, {\n\t\t\t\t\theaders: {\n\t\t\t\t\t\t'Content-Type': contentType,\n\t\t\t\t\t\t'Cache-Control': isWatchMode\n\t\t\t\t\t\t\t? 'no-cache'\n\t\t\t\t\t\t\t: `${directive}, max-age=${maxAge}`,\n\t\t\t\t\t\t...extraHeaders,\n\t\t\t\t\t\t...staticHeaders,\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t} catch (error) {\n\t\t\t\tif (error instanceof NotFoundError) throw error;\n\t\t\t\tconsole.error(`[reroute] Error:`, error);\n\t\t\t\tthrow new NotFoundError();\n\t\t\t}\n\t\t}\n\n\t\tconst filePath = join(clientDir, requestPath);\n\n\t\ttry {\n\t\t\tlet actualFilePath = filePath;\n\t\t\tlet exists = await Bun.file(actualFilePath).exists();\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\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\t// Check cache after resolving and validating the file\n\t\t\tconst cached = fileCache.get(filePath);\n\t\t\tif (cached) return cached.clone();\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\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': maxAge\n\t\t\t\t\t\t? `${directive}, max-age=${maxAge}`\n\t\t\t\t\t\t: directive,\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(filePath, 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"
|
|
28
|
+
],
|
|
29
|
+
"mappings": "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",
|
|
30
|
+
"debugId": "E29EB407CD742AE464756E2164756E21",
|
|
31
|
+
"names": []
|
|
32
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../packages/elysia/src/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,SAAS,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { Elysia } from 'elysia';
|
|
2
|
+
import type { RerouteOptions } from './types';
|
|
3
|
+
declare const reroute: (options?: RerouteOptions) => (app: Elysia) => Promise<Elysia<"", {
|
|
4
|
+
decorator: {};
|
|
5
|
+
store: {};
|
|
6
|
+
derive: {};
|
|
7
|
+
resolve: {};
|
|
8
|
+
}, {
|
|
9
|
+
typebox: {};
|
|
10
|
+
error: {};
|
|
11
|
+
}, {
|
|
12
|
+
schema: {};
|
|
13
|
+
standaloneSchema: {};
|
|
14
|
+
macro: {};
|
|
15
|
+
macroFn: {};
|
|
16
|
+
parser: {};
|
|
17
|
+
response: {};
|
|
18
|
+
}, {}, {
|
|
19
|
+
derive: {};
|
|
20
|
+
resolve: {};
|
|
21
|
+
schema: {};
|
|
22
|
+
standaloneSchema: {};
|
|
23
|
+
response: {};
|
|
24
|
+
}, {
|
|
25
|
+
derive: {};
|
|
26
|
+
resolve: {};
|
|
27
|
+
schema: {};
|
|
28
|
+
standaloneSchema: {};
|
|
29
|
+
response: {};
|
|
30
|
+
}>>;
|
|
31
|
+
export { reroute };
|
|
32
|
+
//# sourceMappingURL=plugin.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../../../../packages/elysia/src/plugin.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAgBrC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAG9C,QAAA,MAAM,OAAO,GACX,UAAS,cAAmB,MACtB,KAAK,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkNjB,CAAC;AAEH,OAAO,EAAE,OAAO,EAAE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"artifacts.d.ts","sourceRoot":"","sources":["../../../../../../packages/elysia/src/routes/artifacts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAIrC,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAiCxE"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"content.d.ts","sourceRoot":"","sources":["../../../../../../packages/elysia/src/routes/content.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAIrC,wBAAgB,qBAAqB,CACpC,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,OAAO,GAClB,MAAM,CAkBR"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { Elysia } from 'elysia';
|
|
2
|
+
export declare function registerDevRoutes(app: Elysia, liveReloadClients: Set<ReadableStreamDefaultController>, isWatchMode: boolean, opts?: {
|
|
3
|
+
clientDir: string;
|
|
4
|
+
cwd: string;
|
|
5
|
+
dataCacheControl?: string;
|
|
6
|
+
}): Elysia;
|
|
7
|
+
//# sourceMappingURL=dev.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dev.d.ts","sourceRoot":"","sources":["../../../../../../packages/elysia/src/routes/dev.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAKrC,wBAAgB,iBAAiB,CAChC,GAAG,EAAE,MAAM,EACX,iBAAiB,EAAE,GAAG,CAAC,+BAA+B,CAAC,EACvD,WAAW,EAAE,OAAO,EACpB,IAAI,CAAC,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAAE,GAClE,MAAM,CA+HR"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { Elysia } from 'elysia';
|
|
2
|
+
import type { ReactElement } from 'react';
|
|
3
|
+
type SSRRouteOptions = {
|
|
4
|
+
rootComponent: ReactElement;
|
|
5
|
+
clientDir: string;
|
|
6
|
+
cwd: string;
|
|
7
|
+
isWatchMode: boolean;
|
|
8
|
+
getBundleUrl: () => Promise<string>;
|
|
9
|
+
head?: string;
|
|
10
|
+
lang?: string;
|
|
11
|
+
appId?: string;
|
|
12
|
+
collections: string[];
|
|
13
|
+
minify?: boolean;
|
|
14
|
+
dataCacheControl?: string;
|
|
15
|
+
};
|
|
16
|
+
declare function registerSSRRoutes(app: Elysia, options: SSRRouteOptions): Elysia;
|
|
17
|
+
export { registerSSRRoutes };
|
|
18
|
+
//# sourceMappingURL=ssr.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ssr.d.ts","sourceRoot":"","sources":["../../../../../../packages/elysia/src/routes/ssr.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAErC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAQ1C,KAAK,eAAe,GAAG;IACtB,aAAa,EAAE,YAAY,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,EAAE,OAAO,CAAC;IACrB,YAAY,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IACpC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,MAAM,CAAC,EAAE,OAAO,CAAC;IAEjB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEF,iBAAS,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,GAAG,MAAM,CAqHxE;AAED,OAAO,EAAE,iBAAiB,EAAE,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { Elysia } from 'elysia';
|
|
2
|
+
import { type BundleInfo, type LRUCache } from 'reroute-js/core';
|
|
3
|
+
type StaticRouteOptions = {
|
|
4
|
+
clientDir: string;
|
|
5
|
+
prefix: string;
|
|
6
|
+
maxAge: number;
|
|
7
|
+
directive: string;
|
|
8
|
+
indexHTML: boolean;
|
|
9
|
+
staticHeaders?: Record<string, string>;
|
|
10
|
+
minify: boolean;
|
|
11
|
+
sourcemap: boolean;
|
|
12
|
+
shouldIgnore: (file: string) => boolean;
|
|
13
|
+
bundleCache: Map<string, BundleInfo>;
|
|
14
|
+
fileCache: LRUCache<string, Response>;
|
|
15
|
+
isWatchMode?: boolean;
|
|
16
|
+
};
|
|
17
|
+
declare function registerStaticRoutes(app: Elysia, options: StaticRouteOptions): Elysia;
|
|
18
|
+
export { registerStaticRoutes };
|
|
19
|
+
//# sourceMappingURL=static.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"static.d.ts","sourceRoot":"","sources":["../../../../../../packages/elysia/src/routes/static.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAErC,OAAO,EACN,KAAK,UAAU,EAIf,KAAK,QAAQ,EAEb,MAAM,iBAAiB,CAAC;AAEzB,KAAK,kBAAkB,GAAG;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;IACnB,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IACxC,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACrC,SAAS,EAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACtC,WAAW,CAAC,EAAE,OAAO,CAAC;CACtB,CAAC;AAEF,iBAAS,oBAAoB,CAC5B,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,kBAAkB,GACzB,MAAM,CA8QR;AAED,OAAO,EAAE,oBAAoB,EAAE,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { ReactElement } from 'react';
|
|
2
|
+
type Any = any;
|
|
3
|
+
type RerouteOptions = {
|
|
4
|
+
head?: string;
|
|
5
|
+
lang?: string;
|
|
6
|
+
appId?: string;
|
|
7
|
+
entrypoint?: string;
|
|
8
|
+
/**
|
|
9
|
+
* Component to render for all HTML document requests.
|
|
10
|
+
*
|
|
11
|
+
* Enables automatic SSR for all routes that don't have explicit handlers.
|
|
12
|
+
* The component will be server-rendered and sent with hydration scripts.
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* ```ts
|
|
16
|
+
* reroute({ app: createElement(App) })
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
app?: ReactElement;
|
|
20
|
+
assets?: string;
|
|
21
|
+
prefix?: string;
|
|
22
|
+
ignorePatterns?: (string | RegExp)[];
|
|
23
|
+
staticHeaders?: Record<string, string>;
|
|
24
|
+
maxAge?: number;
|
|
25
|
+
directive?: string;
|
|
26
|
+
indexHTML?: boolean;
|
|
27
|
+
minify?: boolean;
|
|
28
|
+
sourcemap?: boolean;
|
|
29
|
+
};
|
|
30
|
+
export type { Any, RerouteOptions };
|
|
31
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../../packages/elysia/src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAG1C,KAAK,GAAG,GAAG,GAAG,CAAC;AAEf,KAAK,cAAc,GAAG;IAErB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;;;;;;;OAUG;IACH,GAAG,CAAC,EAAE,YAAY,CAAC;IAGnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC;IACrC,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,CAAC;IAGpB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF,YAAY,EAAE,GAAG,EAAE,cAAc,EAAE,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
type Any = any;
|
|
2
|
+
export declare function jsonWithCache(payload: Any, cacheControl: string, reqHeaders?: Headers | Record<string, string>): Response;
|
|
3
|
+
export declare function jsonError(message: string, status?: number): Response;
|
|
4
|
+
export {};
|
|
5
|
+
//# sourceMappingURL=http.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../../../../../packages/elysia/src/utils/http.ts"],"names":[],"mappings":"AAIA,KAAK,GAAG,GAAG,GAAG,CAAC;AA2Bf,wBAAgB,aAAa,CAC5B,OAAO,EAAE,GAAG,EACZ,YAAY,EAAE,MAAM,EACpB,UAAU,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC3C,QAAQ,CAsBV;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,SAAM,GAAG,QAAQ,CAKjE"}
|
package/package.json
ADDED
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "reroute-js",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"scripts": {
|
|
6
|
+
"types": "tsc --noEmit",
|
|
7
|
+
"lint": "biome check",
|
|
8
|
+
"format": "biome check --write --unsafe",
|
|
9
|
+
"knip": "knip --no-config-hints",
|
|
10
|
+
"build": "bun format && bun lint --write && bun ./scripts/build",
|
|
11
|
+
"release": "semantic-release",
|
|
12
|
+
"test": "vitest run",
|
|
13
|
+
"test:watch": "vitest",
|
|
14
|
+
"test:ui": "vitest --ui",
|
|
15
|
+
"test:coverage": "vitest run --coverage --config=vitest.config.ts",
|
|
16
|
+
"coverage": "bun test:coverage && open coverage/index.html"
|
|
17
|
+
},
|
|
18
|
+
"repository": {
|
|
19
|
+
"type": "git",
|
|
20
|
+
"url": "https://github.com/stewones/reroute.git"
|
|
21
|
+
},
|
|
22
|
+
"exports": {
|
|
23
|
+
"./": {
|
|
24
|
+
"types": "./cli/index.d.ts",
|
|
25
|
+
"default": "./cli/index.js"
|
|
26
|
+
},
|
|
27
|
+
"./core": {
|
|
28
|
+
"types": "./core/index.d.ts",
|
|
29
|
+
"default": "./core/index.js"
|
|
30
|
+
},
|
|
31
|
+
"./react": {
|
|
32
|
+
"types": "./react/index.d.ts",
|
|
33
|
+
"default": "./react/index.js"
|
|
34
|
+
},
|
|
35
|
+
"./elysia": {
|
|
36
|
+
"types": "./elysia/index.d.ts",
|
|
37
|
+
"default": "./elysia/index.js"
|
|
38
|
+
}
|
|
39
|
+
},
|
|
40
|
+
"bin": {
|
|
41
|
+
"reroute": "./packages/cli/bin.ts"
|
|
42
|
+
},
|
|
43
|
+
"files": [
|
|
44
|
+
"cli",
|
|
45
|
+
"core",
|
|
46
|
+
"react",
|
|
47
|
+
"elysia",
|
|
48
|
+
"README.md",
|
|
49
|
+
"CHANGELOG.md"
|
|
50
|
+
],
|
|
51
|
+
"devDependencies": {
|
|
52
|
+
"@biomejs/biome": "^2.3.1",
|
|
53
|
+
"@semantic-release/changelog": "^6.0.3",
|
|
54
|
+
"@semantic-release/git": "^10.0.1",
|
|
55
|
+
"@types/bun": "latest",
|
|
56
|
+
"@types/react-dom": "^19.2.2",
|
|
57
|
+
"@vitest/coverage-v8": "^3.2.4",
|
|
58
|
+
"dedent": "^1.7.0",
|
|
59
|
+
"knip": "^5.66.3",
|
|
60
|
+
"semantic-release": "^24.2.8",
|
|
61
|
+
"vite-tsconfig-paths": "^5.1.4",
|
|
62
|
+
"vitest": "^3.2.4",
|
|
63
|
+
"@tailwindcss/cli": "^4.1.16",
|
|
64
|
+
"tailwindcss": "^4.1.16"
|
|
65
|
+
},
|
|
66
|
+
"peerDependencies": {
|
|
67
|
+
"typescript": "^5"
|
|
68
|
+
},
|
|
69
|
+
"dependencies": {
|
|
70
|
+
"elysia": "^1.4.12",
|
|
71
|
+
"react": "^19.2.0",
|
|
72
|
+
"react-dom": "^19.2.0"
|
|
73
|
+
}
|
|
74
|
+
}
|
package/react/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../packages/react/index.ts"],"names":[],"mappings":"AAAA,cAAc,OAAO,CAAC"}
|