@rangojs/router 0.0.0-experimental.7 → 0.0.0-experimental.70
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/AGENTS.md +9 -0
- package/README.md +942 -4
- package/dist/bin/rango.js +1689 -0
- package/dist/vite/index.js +4951 -930
- package/package.json +70 -60
- package/skills/breadcrumbs/SKILL.md +250 -0
- package/skills/cache-guide/SKILL.md +294 -0
- package/skills/caching/SKILL.md +93 -23
- package/skills/composability/SKILL.md +172 -0
- package/skills/debug-manifest/SKILL.md +12 -8
- package/skills/document-cache/SKILL.md +18 -16
- package/skills/fonts/SKILL.md +167 -0
- package/skills/hooks/SKILL.md +334 -72
- package/skills/host-router/SKILL.md +218 -0
- package/skills/intercept/SKILL.md +131 -8
- package/skills/layout/SKILL.md +100 -3
- package/skills/links/SKILL.md +92 -31
- package/skills/loader/SKILL.md +404 -44
- package/skills/middleware/SKILL.md +173 -34
- package/skills/mime-routes/SKILL.md +128 -0
- package/skills/parallel/SKILL.md +204 -1
- package/skills/prerender/SKILL.md +685 -0
- package/skills/rango/SKILL.md +85 -16
- package/skills/response-routes/SKILL.md +411 -0
- package/skills/route/SKILL.md +257 -14
- package/skills/router-setup/SKILL.md +210 -32
- package/skills/tailwind/SKILL.md +129 -0
- package/skills/theme/SKILL.md +9 -8
- package/skills/typesafety/SKILL.md +328 -89
- package/skills/use-cache/SKILL.md +324 -0
- package/src/__internal.ts +102 -4
- package/src/bin/rango.ts +321 -0
- package/src/browser/action-coordinator.ts +97 -0
- package/src/browser/action-response-classifier.ts +99 -0
- package/src/browser/app-version.ts +14 -0
- package/src/browser/event-controller.ts +92 -64
- package/src/browser/history-state.ts +80 -0
- package/src/browser/intercept-utils.ts +52 -0
- package/src/browser/link-interceptor.ts +24 -4
- package/src/browser/logging.ts +55 -0
- package/src/browser/merge-segment-loaders.ts +20 -12
- package/src/browser/navigation-bridge.ts +296 -558
- package/src/browser/navigation-client.ts +179 -69
- package/src/browser/navigation-store.ts +73 -55
- package/src/browser/navigation-transaction.ts +297 -0
- package/src/browser/network-error-handler.ts +61 -0
- package/src/browser/partial-update.ts +328 -313
- package/src/browser/prefetch/cache.ts +206 -0
- package/src/browser/prefetch/fetch.ts +150 -0
- package/src/browser/prefetch/observer.ts +65 -0
- package/src/browser/prefetch/policy.ts +48 -0
- package/src/browser/prefetch/queue.ts +160 -0
- package/src/browser/prefetch/resource-ready.ts +77 -0
- package/src/browser/rango-state.ts +112 -0
- package/src/browser/react/Link.tsx +230 -74
- package/src/browser/react/NavigationProvider.tsx +87 -11
- package/src/browser/react/context.ts +11 -0
- package/src/browser/react/filter-segment-order.ts +11 -0
- package/src/browser/react/index.ts +12 -12
- package/src/browser/react/location-state-shared.ts +95 -53
- package/src/browser/react/location-state.ts +60 -15
- package/src/browser/react/mount-context.ts +6 -1
- package/src/browser/react/nonce-context.ts +23 -0
- package/src/browser/react/shallow-equal.ts +27 -0
- package/src/browser/react/use-action.ts +29 -51
- package/src/browser/react/use-client-cache.ts +5 -3
- package/src/browser/react/use-handle.ts +30 -126
- package/src/browser/react/use-href.tsx +2 -2
- package/src/browser/react/use-link-status.ts +6 -5
- package/src/browser/react/use-navigation.ts +22 -63
- package/src/browser/react/use-params.ts +65 -0
- package/src/browser/react/use-pathname.ts +47 -0
- package/src/browser/react/use-router.ts +76 -0
- package/src/browser/react/use-search-params.ts +56 -0
- package/src/browser/react/use-segments.ts +80 -97
- package/src/browser/response-adapter.ts +73 -0
- package/src/browser/rsc-router.tsx +214 -58
- package/src/browser/scroll-restoration.ts +127 -52
- package/src/browser/segment-reconciler.ts +221 -0
- package/src/browser/segment-structure-assert.ts +16 -0
- package/src/browser/server-action-bridge.ts +510 -603
- package/src/browser/shallow.ts +6 -1
- package/src/browser/types.ts +141 -48
- package/src/browser/validate-redirect-origin.ts +29 -0
- package/src/build/generate-manifest.ts +235 -24
- package/src/build/generate-route-types.ts +39 -0
- package/src/build/index.ts +13 -0
- package/src/build/route-trie.ts +265 -0
- package/src/build/route-types/ast-helpers.ts +25 -0
- package/src/build/route-types/ast-route-extraction.ts +98 -0
- package/src/build/route-types/codegen.ts +102 -0
- package/src/build/route-types/include-resolution.ts +418 -0
- package/src/build/route-types/param-extraction.ts +48 -0
- package/src/build/route-types/per-module-writer.ts +128 -0
- package/src/build/route-types/router-processing.ts +618 -0
- package/src/build/route-types/scan-filter.ts +85 -0
- package/src/build/runtime-discovery.ts +231 -0
- package/src/cache/background-task.ts +34 -0
- package/src/cache/cache-key-utils.ts +44 -0
- package/src/cache/cache-policy.ts +125 -0
- package/src/cache/cache-runtime.ts +342 -0
- package/src/cache/cache-scope.ts +167 -309
- package/src/cache/cf/cf-cache-store.ts +571 -17
- package/src/cache/cf/index.ts +13 -3
- package/src/cache/document-cache.ts +116 -77
- package/src/cache/handle-capture.ts +81 -0
- package/src/cache/handle-snapshot.ts +41 -0
- package/src/cache/index.ts +1 -15
- package/src/cache/memory-segment-store.ts +191 -13
- package/src/cache/profile-registry.ts +73 -0
- package/src/cache/read-through-swr.ts +134 -0
- package/src/cache/segment-codec.ts +256 -0
- package/src/cache/taint.ts +153 -0
- package/src/cache/types.ts +72 -122
- package/src/client.rsc.tsx +3 -1
- package/src/client.tsx +105 -179
- package/src/component-utils.ts +4 -4
- package/src/components/DefaultDocument.tsx +5 -1
- package/src/context-var.ts +156 -0
- package/src/debug.ts +19 -9
- package/src/errors.ts +108 -2
- package/src/handle.ts +55 -29
- package/src/handles/MetaTags.tsx +73 -20
- package/src/handles/breadcrumbs.ts +66 -0
- package/src/handles/index.ts +1 -0
- package/src/handles/meta.ts +30 -13
- package/src/host/cookie-handler.ts +21 -15
- package/src/host/errors.ts +8 -8
- package/src/host/index.ts +4 -7
- package/src/host/pattern-matcher.ts +27 -27
- package/src/host/router.ts +61 -39
- package/src/host/testing.ts +8 -8
- package/src/host/types.ts +15 -7
- package/src/host/utils.ts +1 -1
- package/src/href-client.ts +119 -29
- package/src/index.rsc.ts +155 -19
- package/src/index.ts +223 -30
- package/src/internal-debug.ts +11 -0
- package/src/loader.rsc.ts +26 -157
- package/src/loader.ts +27 -10
- package/src/network-error-thrower.tsx +3 -1
- package/src/outlet-provider.tsx +45 -0
- package/src/prerender/param-hash.ts +37 -0
- package/src/prerender/store.ts +186 -0
- package/src/prerender.ts +524 -0
- package/src/reverse.ts +351 -0
- package/src/root-error-boundary.tsx +41 -29
- package/src/route-content-wrapper.tsx +7 -4
- package/src/route-definition/dsl-helpers.ts +982 -0
- package/src/route-definition/helper-factories.ts +200 -0
- package/src/route-definition/helpers-types.ts +434 -0
- package/src/route-definition/index.ts +55 -0
- package/src/route-definition/redirect.ts +101 -0
- package/src/route-definition/resolve-handler-use.ts +149 -0
- package/src/route-definition.ts +1 -1428
- package/src/route-map-builder.ts +217 -123
- package/src/route-name.ts +53 -0
- package/src/route-types.ts +70 -8
- package/src/router/content-negotiation.ts +215 -0
- package/src/router/debug-manifest.ts +72 -0
- package/src/router/error-handling.ts +9 -9
- package/src/router/find-match.ts +160 -0
- package/src/router/handler-context.ts +435 -86
- package/src/router/intercept-resolution.ts +402 -0
- package/src/router/lazy-includes.ts +237 -0
- package/src/router/loader-resolution.ts +356 -128
- package/src/router/logging.ts +251 -0
- package/src/router/manifest.ts +154 -35
- package/src/router/match-api.ts +555 -0
- package/src/router/match-context.ts +5 -3
- package/src/router/match-handlers.ts +440 -0
- package/src/router/match-middleware/background-revalidation.ts +108 -93
- package/src/router/match-middleware/cache-lookup.ts +459 -10
- package/src/router/match-middleware/cache-store.ts +98 -26
- package/src/router/match-middleware/intercept-resolution.ts +57 -17
- package/src/router/match-middleware/segment-resolution.ts +80 -6
- package/src/router/match-pipelines.ts +10 -45
- package/src/router/match-result.ts +55 -33
- package/src/router/metrics.ts +240 -15
- package/src/router/middleware-cookies.ts +55 -0
- package/src/router/middleware-types.ts +220 -0
- package/src/router/middleware.ts +324 -369
- package/src/router/navigation-snapshot.ts +182 -0
- package/src/router/pattern-matching.ts +211 -43
- package/src/router/prerender-match.ts +502 -0
- package/src/router/preview-match.ts +98 -0
- package/src/router/request-classification.ts +310 -0
- package/src/router/revalidation.ts +137 -38
- package/src/router/route-snapshot.ts +245 -0
- package/src/router/router-context.ts +41 -21
- package/src/router/router-interfaces.ts +484 -0
- package/src/router/router-options.ts +618 -0
- package/src/router/router-registry.ts +24 -0
- package/src/router/segment-resolution/fresh.ts +743 -0
- package/src/router/segment-resolution/helpers.ts +268 -0
- package/src/router/segment-resolution/loader-cache.ts +199 -0
- package/src/router/segment-resolution/revalidation.ts +1373 -0
- package/src/router/segment-resolution/static-store.ts +67 -0
- package/src/router/segment-resolution.ts +21 -0
- package/src/router/segment-wrappers.ts +291 -0
- package/src/router/telemetry-otel.ts +299 -0
- package/src/router/telemetry.ts +300 -0
- package/src/router/timeout.ts +148 -0
- package/src/router/trie-matching.ts +239 -0
- package/src/router/types.ts +78 -3
- package/src/router.ts +740 -4252
- package/src/rsc/handler-context.ts +45 -0
- package/src/rsc/handler.ts +907 -797
- package/src/rsc/helpers.ts +140 -6
- package/src/rsc/index.ts +0 -20
- package/src/rsc/loader-fetch.ts +229 -0
- package/src/rsc/manifest-init.ts +90 -0
- package/src/rsc/nonce.ts +14 -0
- package/src/rsc/origin-guard.ts +141 -0
- package/src/rsc/progressive-enhancement.ts +391 -0
- package/src/rsc/response-error.ts +37 -0
- package/src/rsc/response-route-handler.ts +347 -0
- package/src/rsc/rsc-rendering.ts +246 -0
- package/src/rsc/runtime-warnings.ts +42 -0
- package/src/rsc/server-action.ts +356 -0
- package/src/rsc/ssr-setup.ts +128 -0
- package/src/rsc/types.ts +46 -11
- package/src/search-params.ts +230 -0
- package/src/segment-system.tsx +165 -17
- package/src/server/context.ts +315 -58
- package/src/server/cookie-store.ts +190 -0
- package/src/server/fetchable-loader-store.ts +37 -0
- package/src/server/handle-store.ts +113 -15
- package/src/server/loader-registry.ts +24 -64
- package/src/server/request-context.ts +607 -81
- package/src/server.ts +35 -130
- package/src/ssr/index.tsx +103 -30
- package/src/static-handler.ts +126 -0
- package/src/theme/ThemeProvider.tsx +21 -15
- package/src/theme/ThemeScript.tsx +5 -5
- package/src/theme/constants.ts +5 -2
- package/src/theme/index.ts +4 -14
- package/src/theme/theme-context.ts +4 -30
- package/src/theme/theme-script.ts +21 -18
- package/src/types/boundaries.ts +158 -0
- package/src/types/cache-types.ts +198 -0
- package/src/types/error-types.ts +192 -0
- package/src/types/global-namespace.ts +100 -0
- package/src/types/handler-context.ts +791 -0
- package/src/types/index.ts +88 -0
- package/src/types/loader-types.ts +210 -0
- package/src/types/route-config.ts +170 -0
- package/src/types/route-entry.ts +109 -0
- package/src/types/segments.ts +150 -0
- package/src/types.ts +1 -1623
- package/src/urls/include-helper.ts +197 -0
- package/src/urls/index.ts +53 -0
- package/src/urls/path-helper-types.ts +346 -0
- package/src/urls/path-helper.ts +364 -0
- package/src/urls/pattern-types.ts +107 -0
- package/src/urls/response-types.ts +116 -0
- package/src/urls/type-extraction.ts +372 -0
- package/src/urls/urls-function.ts +98 -0
- package/src/urls.ts +1 -802
- package/src/use-loader.tsx +161 -81
- package/src/vite/discovery/bundle-postprocess.ts +181 -0
- package/src/vite/discovery/discover-routers.ts +348 -0
- package/src/vite/discovery/prerender-collection.ts +439 -0
- package/src/vite/discovery/route-types-writer.ts +258 -0
- package/src/vite/discovery/self-gen-tracking.ts +47 -0
- package/src/vite/discovery/state.ts +117 -0
- package/src/vite/discovery/virtual-module-codegen.ts +203 -0
- package/src/vite/index.ts +15 -1129
- package/src/vite/plugin-types.ts +103 -0
- package/src/vite/plugins/cjs-to-esm.ts +93 -0
- package/src/vite/plugins/client-ref-dedup.ts +115 -0
- package/src/vite/plugins/client-ref-hashing.ts +105 -0
- package/src/vite/{expose-action-id.ts → plugins/expose-action-id.ts} +72 -53
- package/src/vite/plugins/expose-id-utils.ts +299 -0
- package/src/vite/plugins/expose-ids/export-analysis.ts +296 -0
- package/src/vite/plugins/expose-ids/handler-transform.ts +209 -0
- package/src/vite/plugins/expose-ids/loader-transform.ts +74 -0
- package/src/vite/plugins/expose-ids/router-transform.ts +110 -0
- package/src/vite/plugins/expose-ids/types.ts +45 -0
- package/src/vite/plugins/expose-internal-ids.ts +786 -0
- package/src/vite/plugins/performance-tracks.ts +88 -0
- package/src/vite/plugins/refresh-cmd.ts +127 -0
- package/src/vite/plugins/use-cache-transform.ts +323 -0
- package/src/vite/plugins/version-injector.ts +83 -0
- package/src/vite/plugins/version-plugin.ts +266 -0
- package/src/vite/{virtual-entries.ts → plugins/virtual-entries.ts} +23 -14
- package/src/vite/plugins/virtual-stub-plugin.ts +29 -0
- package/src/vite/rango.ts +462 -0
- package/src/vite/router-discovery.ts +918 -0
- package/src/vite/utils/ast-handler-extract.ts +517 -0
- package/src/vite/utils/banner.ts +36 -0
- package/src/vite/utils/bundle-analysis.ts +137 -0
- package/src/vite/utils/manifest-utils.ts +70 -0
- package/src/vite/{package-resolution.ts → utils/package-resolution.ts} +25 -29
- package/src/vite/utils/prerender-utils.ts +207 -0
- package/src/vite/utils/shared-utils.ts +170 -0
- package/CLAUDE.md +0 -43
- package/src/browser/lru-cache.ts +0 -69
- package/src/browser/request-controller.ts +0 -164
- package/src/cache/memory-store.ts +0 -253
- package/src/href-context.ts +0 -33
- package/src/href.ts +0 -255
- package/src/server/route-manifest-cache.ts +0 -173
- package/src/vite/expose-handle-id.ts +0 -209
- package/src/vite/expose-loader-id.ts +0 -426
- package/src/vite/expose-location-state-id.ts +0 -177
- /package/src/vite/{version.d.ts → plugins/version.d.ts} +0 -0
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Deterministic param hashing for prerender storage keys.
|
|
3
|
+
*
|
|
4
|
+
* Used at build time (child process) to generate filenames and at
|
|
5
|
+
* runtime (worker) to look up pre-rendered data. Both environments
|
|
6
|
+
* must produce identical hashes for the same params.
|
|
7
|
+
*
|
|
8
|
+
* Uses a simple DJB2-based hash that works in all JS environments
|
|
9
|
+
* (Node.js, Cloudflare Workers, browsers) without crypto imports.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Compute a deterministic hash string from route params.
|
|
14
|
+
* For static routes (no params), returns "_".
|
|
15
|
+
*/
|
|
16
|
+
export function hashParams(params: Record<string, string>): string {
|
|
17
|
+
const entries = Object.entries(params);
|
|
18
|
+
if (entries.length === 0) return "_";
|
|
19
|
+
|
|
20
|
+
const sorted = entries.sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0));
|
|
21
|
+
const str = sorted
|
|
22
|
+
.map(([k, v]) => `${encodeURIComponent(k)}=${encodeURIComponent(v)}`)
|
|
23
|
+
.join("&");
|
|
24
|
+
return djb2Hex(str);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* DJB2 hash returning an 8-char hex string.
|
|
29
|
+
* Deterministic across all JS runtimes.
|
|
30
|
+
*/
|
|
31
|
+
function djb2Hex(str: string): string {
|
|
32
|
+
let hash = 5381;
|
|
33
|
+
for (let i = 0; i < str.length; i++) {
|
|
34
|
+
hash = ((hash << 5) + hash + str.charCodeAt(i)) >>> 0;
|
|
35
|
+
}
|
|
36
|
+
return hash.toString(16).padStart(8, "0");
|
|
37
|
+
}
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Prerender Store
|
|
3
|
+
*
|
|
4
|
+
* Reads pre-rendered segment data from the worker bundle at build time.
|
|
5
|
+
* The manifest module is lazily loaded via globalThis.__loadPrerenderManifestModule,
|
|
6
|
+
* a function injected into the RSC entry that returns the manifest module
|
|
7
|
+
* containing a key-to-specifier map and a `loadPrerenderAsset` function
|
|
8
|
+
* that anchors import() resolution relative to the manifest file.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import type {
|
|
12
|
+
SerializedSegmentData,
|
|
13
|
+
SegmentHandleData,
|
|
14
|
+
} from "../cache/types.js";
|
|
15
|
+
|
|
16
|
+
export interface PrerenderEntry {
|
|
17
|
+
segments: SerializedSegmentData[];
|
|
18
|
+
handles: Record<string, SegmentHandleData>;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export interface PrerenderStore {
|
|
22
|
+
get(
|
|
23
|
+
routeName: string,
|
|
24
|
+
paramHash: string,
|
|
25
|
+
meta?: { pathname: string; isPassthroughRoute?: boolean },
|
|
26
|
+
): PrerenderEntry | null | Promise<PrerenderEntry | null>;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export interface StaticEntry {
|
|
30
|
+
encoded: string;
|
|
31
|
+
handles: Record<string, unknown[]>;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export interface StaticStore {
|
|
35
|
+
get(handlerId: string): Promise<StaticEntry | null>;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
interface PrerenderManifestModule {
|
|
39
|
+
default: Record<string, string>;
|
|
40
|
+
loadPrerenderAsset: (
|
|
41
|
+
specifier: string,
|
|
42
|
+
) => Promise<{ default: PrerenderEntry }>;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
declare global {
|
|
46
|
+
// Injected by closeBundle post-processing: lazy loader for the prerender
|
|
47
|
+
// manifest module. The module exports a key→specifier map and a
|
|
48
|
+
// loadPrerenderAsset function that anchors import() relative to the manifest.
|
|
49
|
+
// eslint-disable-next-line no-var
|
|
50
|
+
var __loadPrerenderManifestModule:
|
|
51
|
+
| (() => Promise<PrerenderManifestModule>)
|
|
52
|
+
| undefined;
|
|
53
|
+
// Injected by closeBundle post-processing: map of handlerId -> () => import("./assets/__st-*.js")
|
|
54
|
+
// Asset default export is either a string (no handles) or { encoded, handles } object.
|
|
55
|
+
// eslint-disable-next-line no-var
|
|
56
|
+
var __STATIC_MANIFEST:
|
|
57
|
+
| Record<string, () => Promise<{ default: string | StaticEntry }>>
|
|
58
|
+
| undefined;
|
|
59
|
+
// Injected by virtual module in dev mode for on-demand prerender
|
|
60
|
+
// eslint-disable-next-line no-var
|
|
61
|
+
var __PRERENDER_DEV_URL: string | undefined;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Create a dev-mode prerender store that fetches on-demand from the
|
|
66
|
+
* Vite dev server's /__rsc_prerender endpoint (runs in Node.js where
|
|
67
|
+
* node:fs works, unlike workerd).
|
|
68
|
+
*/
|
|
69
|
+
export function createDevPrerenderStore(devUrl: string): PrerenderStore {
|
|
70
|
+
return {
|
|
71
|
+
async get(routeName, paramHash, meta) {
|
|
72
|
+
if (!meta?.pathname) return null;
|
|
73
|
+
const isIntercept = paramHash.endsWith("/i");
|
|
74
|
+
let url = `${devUrl}/__rsc_prerender?pathname=${encodeURIComponent(meta.pathname)}&routeName=${encodeURIComponent(routeName)}`;
|
|
75
|
+
if (isIntercept) url += "&intercept=1";
|
|
76
|
+
if (meta.isPassthroughRoute) url += "&passthrough=1";
|
|
77
|
+
try {
|
|
78
|
+
const res = await fetch(url);
|
|
79
|
+
if (!res.ok) return null;
|
|
80
|
+
return res.json();
|
|
81
|
+
} catch {
|
|
82
|
+
return null;
|
|
83
|
+
}
|
|
84
|
+
},
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Create a prerender store.
|
|
90
|
+
* Dev mode: on-demand fetch from Vite dev server (node:fs works there).
|
|
91
|
+
* Production: backed by globalThis.__loadPrerenderManifestModule which lazily
|
|
92
|
+
* loads the manifest module on first access.
|
|
93
|
+
* Returns null if no prerender data is available.
|
|
94
|
+
*/
|
|
95
|
+
export function createPrerenderStore(): PrerenderStore | null {
|
|
96
|
+
if (globalThis.__PRERENDER_DEV_URL) {
|
|
97
|
+
return createDevPrerenderStore(globalThis.__PRERENDER_DEV_URL);
|
|
98
|
+
}
|
|
99
|
+
if (!globalThis.__loadPrerenderManifestModule) return null;
|
|
100
|
+
|
|
101
|
+
const cache = new Map<string, Promise<PrerenderEntry | null>>();
|
|
102
|
+
let manifestModulePromise: Promise<PrerenderManifestModule | null> | null =
|
|
103
|
+
null;
|
|
104
|
+
|
|
105
|
+
function loadManifestModule(): Promise<PrerenderManifestModule | null> {
|
|
106
|
+
if (!manifestModulePromise) {
|
|
107
|
+
manifestModulePromise = globalThis.__loadPrerenderManifestModule!().catch(
|
|
108
|
+
() => null,
|
|
109
|
+
);
|
|
110
|
+
}
|
|
111
|
+
return manifestModulePromise;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
return {
|
|
115
|
+
get(routeName: string, paramHash: string): Promise<PrerenderEntry | null> {
|
|
116
|
+
const key = `${routeName}/${paramHash}`;
|
|
117
|
+
const cached = cache.get(key);
|
|
118
|
+
if (cached) return cached;
|
|
119
|
+
|
|
120
|
+
const promise = loadManifestModule().then((mod) => {
|
|
121
|
+
if (!mod) return null;
|
|
122
|
+
const specifier = mod.default[key];
|
|
123
|
+
if (!specifier) return null;
|
|
124
|
+
// Let asset load errors propagate — a missing/corrupted artifact
|
|
125
|
+
// for a key that exists in the manifest is a build/deploy error
|
|
126
|
+
// and should surface as a 500, not be silently swallowed as null
|
|
127
|
+
// (which the handler stub would misreport as a 404).
|
|
128
|
+
return mod.loadPrerenderAsset(specifier).then((asset) => asset.default);
|
|
129
|
+
});
|
|
130
|
+
cache.set(key, promise);
|
|
131
|
+
return promise;
|
|
132
|
+
},
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/**
|
|
137
|
+
* Load the prerender manifest index for test introspection.
|
|
138
|
+
* Returns the key→specifier map or null if unavailable.
|
|
139
|
+
*/
|
|
140
|
+
export async function loadPrerenderManifestIndex(): Promise<Record<
|
|
141
|
+
string,
|
|
142
|
+
string
|
|
143
|
+
> | null> {
|
|
144
|
+
if (!globalThis.__loadPrerenderManifestModule) return null;
|
|
145
|
+
try {
|
|
146
|
+
const mod = await globalThis.__loadPrerenderManifestModule();
|
|
147
|
+
return mod.default;
|
|
148
|
+
} catch {
|
|
149
|
+
return null;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
* Create a static segment store.
|
|
155
|
+
* Production only: backed by globalThis.__STATIC_MANIFEST injected at build time.
|
|
156
|
+
* Returns null if no static data is available (dev mode or no Static handlers).
|
|
157
|
+
*/
|
|
158
|
+
export function createStaticStore(): StaticStore | null {
|
|
159
|
+
const manifest = globalThis.__STATIC_MANIFEST;
|
|
160
|
+
if (!manifest || Object.keys(manifest).length === 0) return null;
|
|
161
|
+
|
|
162
|
+
const cache = new Map<string, Promise<StaticEntry | null>>();
|
|
163
|
+
|
|
164
|
+
return {
|
|
165
|
+
get(handlerId: string): Promise<StaticEntry | null> {
|
|
166
|
+
const cached = cache.get(handlerId);
|
|
167
|
+
if (cached) return cached;
|
|
168
|
+
|
|
169
|
+
const importFn = manifest[handlerId];
|
|
170
|
+
if (!importFn) return Promise.resolve(null);
|
|
171
|
+
|
|
172
|
+
const promise = importFn()
|
|
173
|
+
.then((mod) => {
|
|
174
|
+
const val = mod.default;
|
|
175
|
+
// Normalize: string-only (no handles) or { encoded, handles }
|
|
176
|
+
if (typeof val === "string") {
|
|
177
|
+
return { encoded: val, handles: {} } as StaticEntry;
|
|
178
|
+
}
|
|
179
|
+
return val as StaticEntry;
|
|
180
|
+
})
|
|
181
|
+
.catch(() => null);
|
|
182
|
+
cache.set(handlerId, promise);
|
|
183
|
+
return promise;
|
|
184
|
+
},
|
|
185
|
+
};
|
|
186
|
+
}
|