@rangojs/router 0.0.0-experimental.bd6e11bc → 0.0.0-experimental.bdaf10aa
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 +8 -4
- package/README.md +296 -887
- package/dist/bin/rango.js +459 -91
- package/dist/testing/vitest.js +36 -2
- package/dist/vite/index.js +1708 -414
- package/package.json +35 -10
- package/skills/api-client/SKILL.md +211 -0
- package/skills/breadcrumbs/SKILL.md +82 -5
- package/skills/bundle-analysis/SKILL.md +2 -2
- package/skills/cache-guide/SKILL.md +14 -9
- package/skills/caching/SKILL.md +221 -12
- package/skills/catalog.json +271 -0
- package/skills/comparison/SKILL.md +50 -0
- package/skills/comparison/agents/openai.yaml +4 -0
- package/skills/comparison/references/framework-comparison.md +837 -0
- package/skills/composability/SKILL.md +83 -2
- package/skills/css/SKILL.md +76 -0
- package/skills/debug-manifest/SKILL.md +5 -3
- package/skills/defer-hydration/SKILL.md +235 -0
- package/skills/document-cache/SKILL.md +11 -3
- package/skills/fonts/SKILL.md +1 -1
- package/skills/handler-use/SKILL.md +9 -9
- package/skills/hooks/SKILL.md +73 -900
- package/skills/hooks/data.md +273 -0
- package/skills/hooks/handle-and-actions.md +103 -0
- package/skills/hooks/navigation.md +110 -0
- package/skills/hooks/outlets.md +41 -0
- package/skills/hooks/state.md +228 -0
- package/skills/hooks/urls.md +135 -0
- package/skills/host-router/SKILL.md +84 -7
- package/skills/i18n/SKILL.md +1 -1
- package/skills/intercept/SKILL.md +51 -17
- package/skills/layout/SKILL.md +38 -16
- package/skills/links/SKILL.md +1 -1
- package/skills/loader/SKILL.md +48 -20
- package/skills/middleware/SKILL.md +11 -5
- package/skills/migrate-nextjs/SKILL.md +203 -20
- package/skills/migrate-react-router/SKILL.md +59 -675
- package/skills/migrate-react-router/cloudflare-workers.md +129 -0
- package/skills/migrate-react-router/component-migration.md +196 -0
- package/skills/migrate-react-router/data-and-actions.md +225 -0
- package/skills/migrate-react-router/route-mapping.md +271 -0
- package/skills/mime-routes/SKILL.md +3 -3
- package/skills/observability/SKILL.md +70 -5
- package/skills/parallel/SKILL.md +32 -8
- package/skills/ppr/SKILL.md +622 -0
- package/skills/prerender/SKILL.md +59 -28
- package/skills/rango/SKILL.md +124 -50
- package/skills/response-routes/SKILL.md +78 -46
- package/skills/route/SKILL.md +85 -6
- package/skills/router-setup/SKILL.md +41 -6
- package/skills/scripts/SKILL.md +179 -0
- package/skills/server-actions/SKILL.md +28 -3
- package/skills/shell-manifest/SKILL.md +185 -0
- package/skills/streams-and-websockets/SKILL.md +1 -1
- package/skills/tailwind/SKILL.md +28 -4
- package/skills/testing/SKILL.md +68 -654
- package/skills/testing/bindings.md +103 -0
- package/skills/testing/cache-prerender.md +127 -0
- package/skills/testing/client-components.md +124 -0
- package/skills/testing/e2e-parity.md +125 -0
- package/skills/testing/flight.md +91 -0
- package/skills/testing/handles.md +131 -0
- package/skills/testing/loader.md +128 -0
- package/skills/testing/middleware.md +99 -0
- package/skills/testing/render-handler.md +122 -0
- package/skills/testing/response-routes.md +95 -0
- package/skills/testing/reverse-and-types.md +85 -0
- package/skills/testing/server-actions.md +107 -0
- package/skills/testing/server-tree.md +128 -0
- package/skills/testing/setup.md +123 -0
- package/skills/theme/SKILL.md +1 -1
- package/skills/typesafety/SKILL.md +45 -918
- package/skills/typesafety/env-and-bindings.md +254 -0
- package/skills/typesafety/generated-files-and-cli.md +335 -0
- package/skills/typesafety/params-and-search.md +153 -0
- package/skills/typesafety/route-types.md +209 -0
- package/skills/use-cache/SKILL.md +47 -17
- package/skills/vercel/SKILL.md +128 -0
- package/skills/view-transitions/SKILL.md +44 -1
- package/src/__augment-tests__/augmented.check.ts +2 -3
- package/src/__internal.ts +0 -65
- package/src/browser/action-coordinator.ts +1 -1
- package/src/browser/action-fence.ts +47 -0
- package/src/browser/app-shell.ts +14 -27
- package/src/browser/connection-warmup.ts +134 -0
- package/src/browser/cookie-name.ts +140 -0
- package/src/browser/event-controller.ts +178 -100
- package/src/browser/invalidate-client-cache.ts +52 -0
- package/src/browser/logging.ts +28 -0
- package/src/browser/merge-segment-loaders.ts +6 -4
- package/src/browser/navigation-bridge.ts +81 -68
- package/src/browser/navigation-client.ts +115 -70
- package/src/browser/navigation-store-handle.ts +38 -0
- package/src/browser/navigation-store.ts +153 -88
- package/src/browser/navigation-transaction.ts +0 -32
- package/src/browser/network-error-handler.ts +34 -7
- package/src/browser/partial-update.ts +157 -144
- package/src/browser/prefetch/cache.ts +148 -81
- package/src/browser/prefetch/fetch.ts +231 -51
- package/src/browser/prefetch/queue.ts +25 -7
- package/src/browser/rango-state.ts +157 -115
- package/src/browser/react/Link.tsx +40 -7
- package/src/browser/react/NavigationProvider.tsx +140 -99
- package/src/browser/react/ScrollRestoration.tsx +10 -6
- package/src/browser/react/filter-segment-order.ts +17 -2
- package/src/browser/react/index.ts +0 -51
- package/src/browser/react/location-state-shared.ts +14 -15
- package/src/browser/react/location-state.ts +0 -1
- package/src/browser/react/use-action.ts +6 -15
- package/src/browser/react/use-handle.ts +0 -5
- package/src/browser/react/use-href.tsx +8 -1
- package/src/browser/react/use-link-status.ts +33 -8
- package/src/browser/react/use-navigation.ts +10 -5
- package/src/browser/react/use-params.ts +0 -2
- package/src/browser/react/use-router.ts +6 -4
- package/src/browser/react/use-search-params.ts +0 -5
- package/src/browser/react/use-segments.ts +0 -13
- package/src/browser/response-adapter.ts +74 -8
- package/src/browser/rsc-router.tsx +97 -22
- package/src/browser/scroll-restoration.ts +15 -8
- package/src/browser/segment-reconciler.ts +31 -21
- package/src/browser/server-action-bridge.ts +216 -38
- package/src/browser/types.ts +94 -22
- package/src/browser/validate-redirect-origin.ts +43 -16
- package/src/build/generate-manifest.ts +155 -131
- package/src/build/generate-route-types.ts +1 -1
- package/src/build/index.ts +11 -5
- package/src/build/prefix-tree-utils.ts +123 -0
- package/src/build/route-trie.ts +152 -22
- package/src/build/route-types/ast-route-extraction.ts +15 -8
- package/src/build/route-types/codegen.ts +12 -1
- package/src/build/route-types/include-resolution.ts +455 -61
- package/src/build/route-types/param-extraction.ts +6 -3
- package/src/build/route-types/per-module-writer.ts +15 -2
- package/src/build/route-types/router-processing.ts +77 -41
- package/src/build/route-types/source-scan.ts +105 -7
- package/src/build/runtime-discovery.ts +4 -1
- package/src/cache/cache-error.ts +104 -0
- package/src/cache/cache-key-utils.ts +58 -13
- package/src/cache/cache-policy.ts +108 -34
- package/src/cache/cache-runtime.ts +454 -101
- package/src/cache/cache-scope.ts +159 -54
- package/src/cache/cache-tag.ts +149 -0
- package/src/cache/cf/cf-base64.ts +33 -0
- package/src/cache/cf/cf-cache-constants.ts +127 -0
- package/src/cache/cf/cf-cache-store.ts +2170 -377
- package/src/cache/cf/cf-cache-types.ts +349 -0
- package/src/cache/cf/cf-kv-utils.ts +46 -0
- package/src/cache/cf/cf-tag-marker-memo.ts +105 -0
- package/src/cache/cf/index.ts +6 -16
- package/src/cache/document-cache.ts +126 -41
- package/src/cache/handle-snapshot.ts +70 -0
- package/src/cache/index.ts +23 -20
- package/src/cache/memory-segment-store.ts +243 -37
- package/src/cache/profile-registry.ts +46 -31
- package/src/cache/read-through-swr.ts +56 -12
- package/src/cache/segment-codec.ts +13 -21
- package/src/cache/shell-snapshot.ts +417 -0
- package/src/cache/tag-invalidation.ts +230 -0
- package/src/cache/types.ts +194 -99
- package/src/cache/vercel/index.ts +11 -0
- package/src/cache/vercel/vercel-cache-store.ts +1132 -0
- package/src/client.rsc.tsx +39 -22
- package/src/client.tsx +28 -58
- package/src/cloudflare/index.ts +11 -0
- package/src/cloudflare/tracing.ts +108 -0
- package/src/component-utils.ts +19 -0
- package/src/components/DefaultDocument.tsx +8 -2
- package/src/context-var.ts +13 -1
- package/src/decode-loader-results.ts +18 -2
- package/src/defer.ts +185 -0
- package/src/deps/ssr.ts +0 -1
- package/src/encode-kv.ts +49 -0
- package/src/errors.ts +0 -3
- package/src/escape-script.ts +52 -0
- package/src/handle.ts +57 -40
- package/src/handles/MetaTags.tsx +24 -53
- package/src/handles/Scripts.tsx +183 -0
- package/src/handles/breadcrumbs.ts +35 -8
- package/src/handles/deferred-resolution.ts +127 -0
- package/src/handles/is-thenable.ts +18 -0
- package/src/handles/meta.ts +14 -40
- package/src/handles/script.ts +244 -0
- package/src/host/cookie-handler.ts +9 -60
- package/src/host/errors.ts +13 -22
- package/src/host/index.ts +7 -0
- package/src/host/pattern-matcher.ts +23 -52
- package/src/host/router.ts +1 -65
- package/src/host/testing.ts +40 -27
- package/src/host/types.ts +6 -2
- package/src/href-client.ts +7 -12
- package/src/index.rsc.ts +88 -8
- package/src/index.ts +90 -16
- package/src/internal-debug.ts +11 -10
- package/src/loader.rsc.ts +19 -9
- package/src/loader.ts +12 -4
- package/src/outlet-provider.tsx +1 -5
- package/src/prerender/param-hash.ts +16 -16
- package/src/prerender/store.ts +32 -37
- package/src/prerender.ts +75 -7
- package/src/redirect-origin.ts +114 -0
- package/src/regex-escape.ts +8 -0
- package/src/render-error-thrower.tsx +20 -0
- package/src/response-utils.ts +25 -0
- package/src/root-error-boundary.tsx +1 -19
- package/src/route-content-wrapper.tsx +13 -49
- package/src/route-definition/dsl-helpers.ts +60 -53
- package/src/route-definition/helper-factories.ts +0 -2
- package/src/route-definition/helpers-types.ts +46 -46
- package/src/route-definition/index.ts +1 -2
- package/src/route-definition/redirect.ts +44 -11
- package/src/route-definition/resolve-handler-use.ts +6 -1
- package/src/route-definition/use-item-types.ts +3 -6
- package/src/route-map-builder.ts +41 -20
- package/src/route-types.ts +0 -5
- package/src/router/content-negotiation.ts +58 -23
- package/src/router/error-handling.ts +44 -17
- package/src/router/find-match.ts +129 -30
- package/src/router/handler-context.ts +6 -1
- package/src/router/instrument.ts +355 -0
- package/src/router/intercept-resolution.ts +35 -2
- package/src/router/lazy-includes.ts +79 -56
- package/src/router/loader-resolution.ts +151 -73
- package/src/router/logging.ts +0 -6
- package/src/router/manifest.ts +74 -40
- package/src/router/match-api.ts +76 -52
- package/src/router/match-context.ts +0 -22
- package/src/router/match-handlers.ts +181 -178
- package/src/router/match-middleware/background-revalidation.ts +40 -24
- package/src/router/match-middleware/cache-lookup.ts +115 -194
- package/src/router/match-middleware/cache-store.ts +61 -50
- package/src/router/match-middleware/intercept-resolution.ts +0 -22
- package/src/router/match-middleware/segment-resolution.ts +0 -22
- package/src/router/match-pipelines.ts +1 -42
- package/src/router/match-result.ts +36 -67
- package/src/router/metrics.ts +0 -34
- package/src/router/middleware-types.ts +0 -116
- package/src/router/middleware.ts +231 -120
- package/src/router/navigation-snapshot.ts +7 -56
- package/src/router/params-util.ts +23 -0
- package/src/router/parse-pattern.ts +115 -0
- package/src/router/pattern-matching.ts +99 -152
- package/src/router/prefetch-cache-ttl.ts +51 -0
- package/src/router/prefetch-limits.ts +37 -0
- package/src/router/prerender-match.ts +111 -66
- package/src/router/preview-match.ts +3 -1
- package/src/router/request-classification.ts +47 -42
- package/src/router/revalidation.ts +75 -81
- package/src/router/route-snapshot.ts +14 -3
- package/src/router/router-context.ts +6 -29
- package/src/router/router-interfaces.ts +70 -8
- package/src/router/router-options.ts +126 -4
- package/src/router/segment-resolution/fresh.ts +104 -80
- package/src/router/segment-resolution/helpers.ts +86 -6
- package/src/router/segment-resolution/loader-cache.ts +155 -39
- package/src/router/segment-resolution/loader-mask.ts +60 -0
- package/src/router/segment-resolution/loader-snapshot.ts +259 -0
- package/src/router/segment-resolution/mask-nested.ts +83 -0
- package/src/router/segment-resolution/revalidation.ts +215 -304
- package/src/router/segment-resolution/static-store.ts +19 -5
- package/src/router/segment-resolution/streamed-handler-telemetry.ts +52 -0
- package/src/router/segment-resolution/view-transition-default.ts +35 -15
- package/src/router/segment-resolution.ts +5 -1
- package/src/router/segment-wrappers.ts +6 -5
- package/src/router/state-cookie-name.ts +33 -0
- package/src/router/substitute-pattern-params.ts +54 -35
- package/src/router/telemetry-otel.ts +160 -200
- package/src/router/telemetry.ts +9 -23
- package/src/router/timeout.ts +0 -20
- package/src/router/tracing.ts +215 -0
- package/src/router/trie-matching.ts +171 -64
- package/src/router/types.ts +1 -63
- package/src/router/url-params.ts +13 -5
- package/src/router.ts +119 -48
- package/src/rsc/full-payload.ts +70 -0
- package/src/rsc/handler-context.ts +1 -0
- package/src/rsc/handler.ts +267 -152
- package/src/rsc/helpers.ts +78 -4
- package/src/rsc/index.ts +1 -4
- package/src/rsc/json-route-result.ts +38 -0
- package/src/rsc/loader-fetch.ts +114 -38
- package/src/rsc/manifest-init.ts +29 -42
- package/src/rsc/nonce.ts +10 -1
- package/src/rsc/origin-guard.ts +11 -15
- package/src/rsc/progressive-enhancement.ts +120 -13
- package/src/rsc/redirect-guard.ts +100 -0
- package/src/rsc/response-cache-serve.ts +238 -0
- package/src/rsc/response-error.ts +79 -12
- package/src/rsc/response-route-handler.ts +58 -141
- package/src/rsc/rsc-rendering.ts +492 -49
- package/src/rsc/runtime-warnings.ts +14 -0
- package/src/rsc/server-action.ts +268 -82
- package/src/rsc/shell-capture.ts +1190 -0
- package/src/rsc/shell-serve.ts +181 -0
- package/src/rsc/transition-gate.ts +89 -0
- package/src/rsc/types.ts +45 -3
- package/src/runtime-env.ts +18 -0
- package/src/search-params.ts +31 -26
- package/src/segment-loader-promise.ts +49 -4
- package/src/segment-system.tsx +260 -95
- package/src/server/context.ts +99 -9
- package/src/server/cookie-parse.ts +32 -0
- package/src/server/cookie-store.ts +125 -2
- package/src/server/handle-store.ts +21 -38
- package/src/server/loader-registry.ts +33 -42
- package/src/server/request-context.ts +379 -138
- package/src/ssr/index.tsx +491 -182
- package/src/ssr/inject-rsc-eager.ts +167 -0
- package/src/ssr/ssr-root.tsx +228 -0
- package/src/static-handler.ts +10 -13
- package/src/testing/cache-status.ts +44 -48
- package/src/testing/collect-handle.ts +14 -31
- package/src/testing/dispatch.ts +533 -160
- package/src/testing/e2e/fixture.ts +45 -11
- package/src/testing/e2e/index.ts +1 -22
- package/src/testing/e2e/matchers.ts +0 -16
- package/src/testing/e2e/parity.ts +85 -4
- package/src/testing/e2e/server.ts +12 -0
- package/src/testing/flight-matchers.ts +7 -14
- package/src/testing/flight-normalize.ts +11 -0
- package/src/testing/flight-runtime.d.ts +36 -0
- package/src/testing/flight-tree.ts +682 -0
- package/src/testing/flight.entry.ts +30 -0
- package/src/testing/flight.ts +145 -70
- package/src/testing/generated-routes.ts +26 -50
- package/src/testing/index.ts +18 -19
- package/src/testing/internal/context.ts +184 -68
- package/src/testing/internal/flight-client-globals.ts +30 -0
- package/src/testing/internal/seed-vars.ts +54 -0
- package/src/testing/render-handler.ts +357 -0
- package/src/testing/render-route.tsx +134 -115
- package/src/testing/run-loader.ts +140 -51
- package/src/testing/run-middleware.ts +59 -33
- package/src/testing/run-transition-when.ts +164 -0
- package/src/testing/vitest-stubs/cloudflare-email.ts +1 -1
- package/src/testing/vitest-stubs/cloudflare-workers.ts +1 -1
- package/src/testing/vitest.ts +138 -16
- package/src/theme/ThemeProvider.tsx +56 -84
- package/src/theme/ThemeScript.tsx +7 -9
- package/src/theme/constants.ts +52 -13
- package/src/theme/index.ts +0 -7
- package/src/theme/theme-context.ts +1 -5
- package/src/theme/theme-script.ts +22 -21
- package/src/theme/use-theme.ts +0 -3
- package/src/types/boundaries.ts +0 -35
- package/src/types/cache-types.ts +13 -4
- package/src/types/error-types.ts +30 -90
- package/src/types/global-namespace.ts +15 -15
- package/src/types/handler-context.ts +45 -15
- package/src/types/index.ts +2 -10
- package/src/types/loader-types.ts +6 -3
- package/src/types/request-scope.ts +8 -22
- package/src/types/route-config.ts +20 -52
- package/src/types/route-entry.ts +0 -6
- package/src/types/segments.ts +100 -13
- package/src/urls/include-helper.ts +10 -12
- package/src/urls/include-provider.ts +71 -0
- package/src/urls/index.ts +2 -8
- package/src/urls/path-helper-types.ts +52 -14
- package/src/urls/path-helper.ts +5 -54
- package/src/urls/pattern-types.ts +36 -0
- package/src/urls/type-extraction.ts +76 -42
- package/src/urls/urls-function.ts +0 -14
- package/src/use-loader.tsx +0 -186
- package/src/vercel/index.ts +11 -0
- package/src/vercel/tracing.ts +88 -0
- package/src/vite/discovery/bundle-postprocess.ts +2 -1
- package/src/vite/discovery/dev-prerender-cache.ts +117 -0
- package/src/vite/discovery/discover-routers.ts +34 -43
- package/src/vite/discovery/discovery-errors.ts +61 -0
- package/src/vite/discovery/prerender-collection.ts +33 -46
- package/src/vite/discovery/state.ts +12 -1
- package/src/vite/discovery/virtual-module-codegen.ts +1 -11
- package/src/vite/index.ts +9 -0
- package/src/vite/inject-client-debug.ts +88 -0
- package/src/vite/plugin-types.ts +143 -10
- package/src/vite/plugins/cjs-to-esm.ts +8 -12
- package/src/vite/plugins/client-ref-dedup.ts +0 -11
- package/src/vite/plugins/client-ref-hashing.ts +0 -10
- package/src/vite/plugins/cloudflare-protocol-stub.ts +0 -20
- package/src/vite/plugins/expose-action-id.ts +2 -73
- package/src/vite/plugins/expose-id-utils.ts +85 -56
- package/src/vite/plugins/expose-ids/export-analysis.ts +30 -43
- package/src/vite/plugins/expose-ids/handler-transform.ts +5 -31
- package/src/vite/plugins/expose-ids/loader-transform.ts +12 -20
- package/src/vite/plugins/expose-ids/router-transform.ts +98 -26
- package/src/vite/plugins/expose-internal-ids.ts +10 -1
- package/src/vite/plugins/performance-tracks.ts +0 -3
- package/src/vite/plugins/refresh-cmd.ts +1 -1
- package/src/vite/plugins/use-cache-transform.ts +21 -46
- package/src/vite/plugins/vercel-output.ts +384 -0
- package/src/vite/plugins/version-injector.ts +22 -27
- package/src/vite/plugins/version-plugin.ts +6 -66
- package/src/vite/plugins/virtual-entries.ts +137 -26
- package/src/vite/rango.ts +146 -135
- package/src/vite/router-discovery.ts +189 -48
- package/src/vite/utils/ast-handler-extract.ts +11 -20
- package/src/vite/utils/bundle-analysis.ts +6 -13
- package/src/vite/utils/client-chunks.ts +0 -6
- package/src/vite/utils/directive-prologue.ts +40 -0
- package/src/vite/utils/forward-user-plugins.ts +0 -22
- package/src/vite/utils/manifest-utils.ts +4 -75
- package/src/vite/utils/package-resolution.ts +1 -73
- package/src/vite/utils/prerender-utils.ts +71 -44
- package/src/vite/utils/shared-utils.ts +55 -37
- package/src/browser/react/use-client-cache.ts +0 -58
- package/src/browser/shallow.ts +0 -40
- package/src/handles/index.ts +0 -7
- package/src/network-error-thrower.tsx +0 -23
- package/src/router/middleware-cookies.ts +0 -55
package/src/index.rsc.ts
CHANGED
|
@@ -65,6 +65,12 @@ export type {
|
|
|
65
65
|
ErrorPhase,
|
|
66
66
|
OnErrorContext,
|
|
67
67
|
OnErrorCallback,
|
|
68
|
+
// View transition types (also exported from the default entry; route
|
|
69
|
+
// definitions resolve to this react-server entry, so they must be here too)
|
|
70
|
+
TransitionConfig,
|
|
71
|
+
TransitionWhenFn,
|
|
72
|
+
TransitionWhenContext,
|
|
73
|
+
ViewTransitionClass,
|
|
68
74
|
} from "./types.js";
|
|
69
75
|
|
|
70
76
|
// Router options type (server-only, so import directly)
|
|
@@ -75,6 +81,13 @@ export type {
|
|
|
75
81
|
ResolveStreamingContext,
|
|
76
82
|
} from "./router.js";
|
|
77
83
|
|
|
84
|
+
// Origin-check callback types (referenced by the RangoOptions.originCheck JSDoc)
|
|
85
|
+
export type {
|
|
86
|
+
OriginCheckConfig,
|
|
87
|
+
OriginCheckContext,
|
|
88
|
+
OriginCheckPhase,
|
|
89
|
+
} from "./rsc/origin-guard.js";
|
|
90
|
+
|
|
78
91
|
// Server-side createLoader and redirect
|
|
79
92
|
export {
|
|
80
93
|
createLoader,
|
|
@@ -90,7 +103,6 @@ export {
|
|
|
90
103
|
loading,
|
|
91
104
|
parallel,
|
|
92
105
|
intercept,
|
|
93
|
-
when,
|
|
94
106
|
errorBoundary,
|
|
95
107
|
notFoundBoundary,
|
|
96
108
|
transition,
|
|
@@ -107,6 +119,12 @@ export type {
|
|
|
107
119
|
|
|
108
120
|
// Handle API
|
|
109
121
|
export { createHandle, isHandle, type Handle } from "./handle.js";
|
|
122
|
+
export {
|
|
123
|
+
DEFAULT_DEFER_TIMEOUT_MS,
|
|
124
|
+
type DeferOptions,
|
|
125
|
+
type HandlePush,
|
|
126
|
+
type HandlePushFn,
|
|
127
|
+
} from "./defer.js";
|
|
110
128
|
|
|
111
129
|
// Context variable API (typed ctx.set/ctx.get tokens)
|
|
112
130
|
export { createVar, type ContextVar } from "./context-var.js";
|
|
@@ -124,22 +142,27 @@ export {
|
|
|
124
142
|
type BuildContext,
|
|
125
143
|
type StaticBuildContext,
|
|
126
144
|
type GetParamsContext,
|
|
145
|
+
type PrerenderPassthroughResult,
|
|
127
146
|
} from "./prerender.js";
|
|
128
147
|
|
|
129
148
|
// Static handler API
|
|
130
|
-
export {
|
|
149
|
+
export {
|
|
150
|
+
Static,
|
|
151
|
+
type StaticHandlerDefinition,
|
|
152
|
+
type StaticHandlerOptions,
|
|
153
|
+
} from "./static-handler.js";
|
|
131
154
|
|
|
132
155
|
// Django-style URL patterns (RSC/server context)
|
|
133
156
|
export {
|
|
134
157
|
urls,
|
|
135
158
|
type PathHelpers,
|
|
136
159
|
type PathOptions,
|
|
160
|
+
type PartialPrerenderProps,
|
|
137
161
|
type UrlPatterns,
|
|
138
162
|
type IncludeOptions,
|
|
139
163
|
type IncludeItem,
|
|
140
164
|
type RouteResponse,
|
|
141
|
-
type
|
|
142
|
-
type ResponseEnvelope,
|
|
165
|
+
type ProblemDetails,
|
|
143
166
|
type ResponseHandler,
|
|
144
167
|
type ResponseHandlerContext,
|
|
145
168
|
type JsonResponseHandler,
|
|
@@ -163,6 +186,11 @@ export type { HandlerCacheConfig } from "./rsc/types.js";
|
|
|
163
186
|
|
|
164
187
|
// Built-in handles (server-side)
|
|
165
188
|
export { Meta } from "./handles/meta.js";
|
|
189
|
+
export {
|
|
190
|
+
Script,
|
|
191
|
+
type ScriptConfig,
|
|
192
|
+
type ScriptAttributes,
|
|
193
|
+
} from "./handles/script.js";
|
|
166
194
|
export { Breadcrumbs, type BreadcrumbItem } from "./handles/breadcrumbs.js";
|
|
167
195
|
|
|
168
196
|
// Request context (for accessing request data in server actions/components).
|
|
@@ -185,16 +213,31 @@ export const getRequestContext: <
|
|
|
185
213
|
export {
|
|
186
214
|
cookies,
|
|
187
215
|
headers,
|
|
216
|
+
invalidateClientCache,
|
|
217
|
+
keepClientCache,
|
|
188
218
|
type CookieStore,
|
|
189
219
|
type Cookie,
|
|
190
220
|
type ReadonlyHeaders,
|
|
191
221
|
} from "./server/cookie-store.js";
|
|
192
222
|
|
|
223
|
+
// Cache tag APIs (server-only)
|
|
224
|
+
// cacheTag: tag the current "use cache" entry at runtime.
|
|
225
|
+
// updateTag: read-your-own-writes invalidation (awaitable, for Server Actions).
|
|
226
|
+
// revalidateTag: background hard-purge invalidation (not awaited, for route handlers / webhooks).
|
|
227
|
+
export { cacheTag } from "./cache/cache-tag.js";
|
|
228
|
+
export { updateTag, revalidateTag } from "./cache/tag-invalidation.js";
|
|
229
|
+
|
|
193
230
|
// Meta types
|
|
194
231
|
export type { MetaDescriptor, MetaDescriptorBase } from "./router/types.js";
|
|
195
232
|
|
|
196
233
|
// Middleware context types
|
|
197
|
-
export type {
|
|
234
|
+
export type {
|
|
235
|
+
MiddlewareContext,
|
|
236
|
+
CookieOptions,
|
|
237
|
+
// The function type of a middleware. Public so the documented "extract the
|
|
238
|
+
// middleware and unit-test it with runMiddleware" pattern has a nameable type.
|
|
239
|
+
MiddlewareFn,
|
|
240
|
+
} from "./router/middleware.js";
|
|
198
241
|
|
|
199
242
|
// Reverse type utilities for type-safe URL generation (Django-style URL reversal)
|
|
200
243
|
export type {
|
|
@@ -225,11 +268,48 @@ export {
|
|
|
225
268
|
// Path and response types are ambient on the `Rango` namespace (`Rango.Path`,
|
|
226
269
|
// `Rango.PathResponse`, declared in href-client.ts) — no import needed.
|
|
227
270
|
|
|
228
|
-
// Telemetry sink
|
|
271
|
+
// Telemetry sink (event-shaped facts)
|
|
229
272
|
export { createConsoleSink } from "./router/telemetry.js";
|
|
230
273
|
export { createOTelSink } from "./router/telemetry-otel.js";
|
|
231
|
-
|
|
232
|
-
export
|
|
274
|
+
// OTel phase-span adapter for the `tracing` slot (the canonical span layer).
|
|
275
|
+
export { createOTelTracing } from "./router/telemetry-otel.js";
|
|
276
|
+
export type {
|
|
277
|
+
OTelTracer,
|
|
278
|
+
OTelActiveSpanTracer,
|
|
279
|
+
OTelSpan,
|
|
280
|
+
OTelTracingOptions,
|
|
281
|
+
} from "./router/telemetry-otel.js";
|
|
282
|
+
// The full TelemetryEvent union PLUS its member types, so a consumer writing a
|
|
283
|
+
// TelemetrySink can annotate a per-`type` handler (or construct an event literal
|
|
284
|
+
// in a test) instead of only narrowing the opaque union.
|
|
285
|
+
export type {
|
|
286
|
+
TelemetrySink,
|
|
287
|
+
TelemetryEvent,
|
|
288
|
+
RequestStartEvent,
|
|
289
|
+
RequestEndEvent,
|
|
290
|
+
RequestErrorEvent,
|
|
291
|
+
LoaderStartEvent,
|
|
292
|
+
LoaderEndEvent,
|
|
293
|
+
LoaderErrorEvent,
|
|
294
|
+
HandlerErrorEvent,
|
|
295
|
+
CacheSegmentStatus,
|
|
296
|
+
CacheSegmentSignal,
|
|
297
|
+
CacheDecisionEvent,
|
|
298
|
+
RevalidationDecisionEvent,
|
|
299
|
+
RequestTimeoutEvent,
|
|
300
|
+
OriginCheckRejectedEvent,
|
|
301
|
+
} from "./router/telemetry.js";
|
|
302
|
+
|
|
303
|
+
// Span tracing config types a consumer annotates. SpanRunner/TraceSpan are the
|
|
304
|
+
// internal runner contract (consumers go through createOTelTracing /
|
|
305
|
+
// createCloudflareTracing, which return a ready RouterTracingConfig) and are not
|
|
306
|
+
// exported.
|
|
307
|
+
export type {
|
|
308
|
+
RouterTracingConfig,
|
|
309
|
+
TracePhase,
|
|
310
|
+
TracePhaseToggles,
|
|
311
|
+
TracingToggleOptions,
|
|
312
|
+
} from "./router/tracing.js";
|
|
233
313
|
|
|
234
314
|
// Timeout types and error class
|
|
235
315
|
export { RouterTimeoutError } from "./router/timeout.js";
|
package/src/index.ts
CHANGED
|
@@ -82,7 +82,12 @@ export { createLoader } from "./loader.js";
|
|
|
82
82
|
|
|
83
83
|
// Route definition types (safe to import anywhere)
|
|
84
84
|
export type { RouteHelpers, RouteHandlers } from "./route-definition.js";
|
|
85
|
-
export type {
|
|
85
|
+
export type {
|
|
86
|
+
TransitionConfig,
|
|
87
|
+
TransitionWhenFn,
|
|
88
|
+
TransitionWhenContext,
|
|
89
|
+
ViewTransitionClass,
|
|
90
|
+
} from "./types.js";
|
|
86
91
|
|
|
87
92
|
// Composition types for reusable callback factories
|
|
88
93
|
export type {
|
|
@@ -104,8 +109,8 @@ export type {
|
|
|
104
109
|
JsonResponsePathFn,
|
|
105
110
|
TextResponsePathFn,
|
|
106
111
|
RouteResponse,
|
|
107
|
-
|
|
108
|
-
|
|
112
|
+
ProblemDetails,
|
|
113
|
+
PartialPrerenderProps,
|
|
109
114
|
} from "./urls.js";
|
|
110
115
|
|
|
111
116
|
// Middleware context types
|
|
@@ -141,6 +146,12 @@ export function redirect(): never {
|
|
|
141
146
|
|
|
142
147
|
// Handle API (universal - works on both server and client)
|
|
143
148
|
export { createHandle, isHandle, type Handle } from "./handle.js";
|
|
149
|
+
export {
|
|
150
|
+
DEFAULT_DEFER_TIMEOUT_MS,
|
|
151
|
+
type DeferOptions,
|
|
152
|
+
type HandlePush,
|
|
153
|
+
type HandlePushFn,
|
|
154
|
+
} from "./defer.js";
|
|
144
155
|
|
|
145
156
|
// Context variable API (typed ctx.set/ctx.get tokens)
|
|
146
157
|
export { createVar, type ContextVar } from "./context-var.js";
|
|
@@ -218,6 +229,17 @@ export function headers(): never {
|
|
|
218
229
|
throw serverOnlyStubError("headers");
|
|
219
230
|
}
|
|
220
231
|
|
|
232
|
+
/**
|
|
233
|
+
* Client implementation of `invalidateClientCache()`. Unlike the server-only
|
|
234
|
+
* stubs above this is a REAL function under the `default` condition (it marks
|
|
235
|
+
* the client's caches stale); the `react-server` condition (index.rsc.ts)
|
|
236
|
+
* selects the server implementation that writes a rotated `Set-Cookie`.
|
|
237
|
+
*/
|
|
238
|
+
export {
|
|
239
|
+
invalidateClientCache,
|
|
240
|
+
keepClientCache,
|
|
241
|
+
} from "./browser/invalidate-client-cache.js";
|
|
242
|
+
|
|
221
243
|
/**
|
|
222
244
|
* Error-throwing stub for server-only `createReverse` function.
|
|
223
245
|
*/
|
|
@@ -238,6 +260,18 @@ export function middleware(): never {
|
|
|
238
260
|
export function revalidate(): never {
|
|
239
261
|
throw serverOnlyStubError("revalidate");
|
|
240
262
|
}
|
|
263
|
+
// Cache tag APIs are server-only (real implementations in index.rsc.ts). These
|
|
264
|
+
// stubs keep the named-export shape identical under the default/non-react-server
|
|
265
|
+
// condition so SSR/client/default bundles that encounter the import link cleanly.
|
|
266
|
+
export function cacheTag(): never {
|
|
267
|
+
throw serverOnlyStubError("cacheTag");
|
|
268
|
+
}
|
|
269
|
+
export function updateTag(): never {
|
|
270
|
+
throw serverOnlyStubError("updateTag");
|
|
271
|
+
}
|
|
272
|
+
export function revalidateTag(): never {
|
|
273
|
+
throw serverOnlyStubError("revalidateTag");
|
|
274
|
+
}
|
|
241
275
|
export function loader(): never {
|
|
242
276
|
throw serverOnlyStubError("loader");
|
|
243
277
|
}
|
|
@@ -250,9 +284,6 @@ export function parallel(): never {
|
|
|
250
284
|
export function intercept(): never {
|
|
251
285
|
throw serverOnlyStubError("intercept");
|
|
252
286
|
}
|
|
253
|
-
export function when(): never {
|
|
254
|
-
throw serverOnlyStubError("when");
|
|
255
|
-
}
|
|
256
287
|
export function errorBoundary(): never {
|
|
257
288
|
throw serverOnlyStubError("errorBoundary");
|
|
258
289
|
}
|
|
@@ -278,6 +309,11 @@ export type {
|
|
|
278
309
|
|
|
279
310
|
// Built-in handles (universal — work on both server and client)
|
|
280
311
|
export { Meta } from "./handles/meta.js";
|
|
312
|
+
export {
|
|
313
|
+
Script,
|
|
314
|
+
type ScriptConfig,
|
|
315
|
+
type ScriptAttributes,
|
|
316
|
+
} from "./handles/script.js";
|
|
281
317
|
export { Breadcrumbs } from "./handles/breadcrumbs.js";
|
|
282
318
|
|
|
283
319
|
// Meta types
|
|
@@ -307,16 +343,54 @@ export {
|
|
|
307
343
|
// Path and response types are ambient on the `Rango` namespace (`Rango.Path`,
|
|
308
344
|
// `Rango.PathResponse`, declared in href-client.ts) — no import needed.
|
|
309
345
|
|
|
310
|
-
// Telemetry types only — the createConsoleSink/createOTelSink
|
|
311
|
-
// server-only and live in index.rsc.ts (the
|
|
312
|
-
// bare `@rangojs/router` import). Re-exporting
|
|
313
|
-
// (default/client) entry would pull telemetry.ts and
|
|
314
|
-
// the client module graph; both tree-shake to zero bytes
|
|
315
|
-
// bundle analysis output and slow build-time module
|
|
316
|
-
//
|
|
317
|
-
//
|
|
318
|
-
|
|
319
|
-
|
|
346
|
+
// Telemetry types only — the createConsoleSink / createOTelSink /
|
|
347
|
+
// createOTelTracing VALUES are server-only and live in index.rsc.ts (the
|
|
348
|
+
// `react-server` condition of the bare `@rangojs/router` import). Re-exporting
|
|
349
|
+
// them as values from this (default/client) entry would pull telemetry.ts and
|
|
350
|
+
// telemetry-otel.ts into the client module graph; both tree-shake to zero bytes
|
|
351
|
+
// but still appear in bundle analysis output and slow build-time module
|
|
352
|
+
// resolution. The factory values are NOT re-exported from `@rangojs/router/server`
|
|
353
|
+
// either — that subpath is internal, not user-facing (see server.ts header).
|
|
354
|
+
// Non-RSC server code imports these TYPES from the root and obtains the factory
|
|
355
|
+
// VALUES from its own router definition module, which resolves to index.rsc.ts
|
|
356
|
+
// under the `react-server` condition.
|
|
357
|
+
export type {
|
|
358
|
+
OTelTracer,
|
|
359
|
+
OTelActiveSpanTracer,
|
|
360
|
+
OTelSpan,
|
|
361
|
+
OTelTracingOptions,
|
|
362
|
+
} from "./router/telemetry-otel.js";
|
|
363
|
+
// The full TelemetryEvent union PLUS its member types, so a consumer writing a
|
|
364
|
+
// TelemetrySink can annotate a per-`type` handler (or construct an event literal
|
|
365
|
+
// in a test) instead of only narrowing the opaque union.
|
|
366
|
+
export type {
|
|
367
|
+
TelemetrySink,
|
|
368
|
+
TelemetryEvent,
|
|
369
|
+
RequestStartEvent,
|
|
370
|
+
RequestEndEvent,
|
|
371
|
+
RequestErrorEvent,
|
|
372
|
+
LoaderStartEvent,
|
|
373
|
+
LoaderEndEvent,
|
|
374
|
+
LoaderErrorEvent,
|
|
375
|
+
HandlerErrorEvent,
|
|
376
|
+
CacheSegmentStatus,
|
|
377
|
+
CacheSegmentSignal,
|
|
378
|
+
CacheDecisionEvent,
|
|
379
|
+
RevalidationDecisionEvent,
|
|
380
|
+
RequestTimeoutEvent,
|
|
381
|
+
OriginCheckRejectedEvent,
|
|
382
|
+
} from "./router/telemetry.js";
|
|
383
|
+
|
|
384
|
+
// Span tracing config types a consumer annotates. SpanRunner/TraceSpan are the
|
|
385
|
+
// internal runner contract (consumers go through createOTelTracing /
|
|
386
|
+
// createCloudflareTracing, which return a ready RouterTracingConfig) and are not
|
|
387
|
+
// exported.
|
|
388
|
+
export type {
|
|
389
|
+
RouterTracingConfig,
|
|
390
|
+
TracePhase,
|
|
391
|
+
TracePhaseToggles,
|
|
392
|
+
TracingToggleOptions,
|
|
393
|
+
} from "./router/tracing.js";
|
|
320
394
|
|
|
321
395
|
// Timeout types and error class
|
|
322
396
|
export { RouterTimeoutError } from "./router/timeout.js";
|
package/src/internal-debug.ts
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
|
-
//
|
|
2
|
-
//
|
|
3
|
-
//
|
|
4
|
-
//
|
|
1
|
+
// Runtime fallback for non-Vite contexts (Node, tests, raw imports). In the Vite
|
|
2
|
+
// pipeline -- dev and build, every environment -- the router discovery plugin's
|
|
3
|
+
// transform replaces this module with the build-time-resolved flag (see
|
|
4
|
+
// vite/inject-client-debug.ts), so the CLIENT debug flag no longer depends on a
|
|
5
|
+
// `__RANGO_DEBUG__` define being delivered to the browser (which dev did only as
|
|
6
|
+
// an injected global whose presence varied across consumer setups).
|
|
7
|
+
//
|
|
8
|
+
// Keep this module to the single INTERNAL_RANGO_DEBUG export: the transform
|
|
9
|
+
// replaces the whole file, so a second export would be dropped from the bundle.
|
|
5
10
|
export const INTERNAL_RANGO_DEBUG: boolean =
|
|
6
|
-
typeof
|
|
7
|
-
|
|
8
|
-
: typeof process !== "undefined" &&
|
|
9
|
-
Boolean((process as any).env?.INTERNAL_RANGO_DEBUG);
|
|
10
|
-
|
|
11
|
-
declare const __RANGO_DEBUG__: boolean;
|
|
11
|
+
typeof process !== "undefined" &&
|
|
12
|
+
Boolean((process as any).env?.INTERNAL_RANGO_DEBUG);
|
package/src/loader.rsc.ts
CHANGED
|
@@ -22,9 +22,13 @@ import {
|
|
|
22
22
|
getFetchableLoader,
|
|
23
23
|
} from "./server/fetchable-loader-store.js";
|
|
24
24
|
import { missingInjectedIdError } from "./missing-id-error.js";
|
|
25
|
+
import { isUnderTestRunner } from "./runtime-env.js";
|
|
25
26
|
|
|
26
27
|
export { getFetchableLoader };
|
|
27
28
|
|
|
29
|
+
// Runtime-fallback counter for bare unit tests (no Vite plugin); process-stable.
|
|
30
|
+
let runtimeLoaderIdCounter = 0;
|
|
31
|
+
|
|
28
32
|
// Overload 1: With function only (not fetchable)
|
|
29
33
|
export function createLoader<T>(
|
|
30
34
|
fn: LoaderFn<T, Record<string, string | undefined>, any>,
|
|
@@ -49,12 +53,21 @@ export function createLoader<T>(
|
|
|
49
53
|
// Hidden parameter injected by Vite exposeInternalIds plugin
|
|
50
54
|
__injectedId?: string,
|
|
51
55
|
): LoaderDefinition<Awaited<T>, Record<string, string | undefined>> {
|
|
52
|
-
|
|
53
|
-
// For fetchable loaders, __injectedId is also passed as a parameter
|
|
54
|
-
const loaderId = __injectedId || "";
|
|
56
|
+
let loaderId = __injectedId || "";
|
|
55
57
|
|
|
56
|
-
|
|
57
|
-
|
|
58
|
+
// Under test runner, fall back to synthetic id (recovers fn from registry by $$id).
|
|
59
|
+
// Otherwise (dev or prod), missing id means unsupported shape — fail loud.
|
|
60
|
+
if (!loaderId) {
|
|
61
|
+
if (isUnderTestRunner()) {
|
|
62
|
+
loaderId = `__rango_runtime_loader_${runtimeLoaderIdCounter++}`;
|
|
63
|
+
} else if (process.env.NODE_ENV !== "production") {
|
|
64
|
+
throw missingInjectedIdError("Loader", "createLoader");
|
|
65
|
+
} else {
|
|
66
|
+
throw new Error(
|
|
67
|
+
"[rango] Loader is missing $$id — the build plugin did not inject one. " +
|
|
68
|
+
"Export it as `export const X = createLoader(...)`.",
|
|
69
|
+
);
|
|
70
|
+
}
|
|
58
71
|
}
|
|
59
72
|
|
|
60
73
|
// If not fetchable, store fn in registry (for SSR ctx.use() resolution)
|
|
@@ -69,12 +82,9 @@ export function createLoader<T>(
|
|
|
69
82
|
};
|
|
70
83
|
}
|
|
71
84
|
|
|
72
|
-
// Fetchable loader - store fn in registry and return a serializable object
|
|
85
|
+
// Fetchable loader - store fn in registry and return a serializable object.
|
|
73
86
|
const middleware: MiddlewareFn[] =
|
|
74
87
|
fetchable === true ? [] : fetchable?.middleware || [];
|
|
75
|
-
|
|
76
|
-
// Register the function in the internal registry by $$id (server-side only)
|
|
77
|
-
// The loader fetch handler looks it up by $$id when load() is called from the client.
|
|
78
88
|
if (fn && loaderId) {
|
|
79
89
|
registerFetchableLoader(loaderId, fn, middleware, true);
|
|
80
90
|
}
|
package/src/loader.ts
CHANGED
|
@@ -19,6 +19,7 @@ import type {
|
|
|
19
19
|
LoaderFn,
|
|
20
20
|
} from "./types.js";
|
|
21
21
|
import { missingInjectedIdError } from "./missing-id-error.js";
|
|
22
|
+
import { isUnderTestRunner } from "./runtime-env.js";
|
|
22
23
|
|
|
23
24
|
// Overload 1: With function only (not fetchable)
|
|
24
25
|
export function createLoader<T>(
|
|
@@ -37,8 +38,7 @@ export function createLoader<T>(
|
|
|
37
38
|
options: FetchableLoaderOptions,
|
|
38
39
|
): LoaderDefinition<Awaited<T>, Record<string, string | undefined>>;
|
|
39
40
|
|
|
40
|
-
// Implementation - client stub
|
|
41
|
-
// The $$id parameter is injected by Vite plugin, not user-provided
|
|
41
|
+
// Implementation - client stub ($$id injected by Vite plugin, not user-provided)
|
|
42
42
|
export function createLoader<T>(
|
|
43
43
|
_fn: LoaderFn<T, Record<string, string | undefined>, any>,
|
|
44
44
|
_fetchable?: true | FetchableLoaderOptions,
|
|
@@ -46,8 +46,16 @@ export function createLoader<T>(
|
|
|
46
46
|
): LoaderDefinition<Awaited<T>, Record<string, string | undefined>> {
|
|
47
47
|
const loaderId = __injectedId || "";
|
|
48
48
|
|
|
49
|
-
|
|
50
|
-
|
|
49
|
+
// Under test runner, no id needed (loaderId stays ""; loader.rsc.ts provides fallback).
|
|
50
|
+
// Otherwise, missing id means unsupported shape — fail loud to avoid wrong key.
|
|
51
|
+
if (!loaderId && !isUnderTestRunner()) {
|
|
52
|
+
if (process.env.NODE_ENV !== "production") {
|
|
53
|
+
throw missingInjectedIdError("Loader", "createLoader");
|
|
54
|
+
}
|
|
55
|
+
throw new Error(
|
|
56
|
+
"[rango] Loader is missing $$id — the build plugin did not inject one. " +
|
|
57
|
+
"Export it as `export const X = createLoader(...)`.",
|
|
58
|
+
);
|
|
51
59
|
}
|
|
52
60
|
|
|
53
61
|
return {
|
package/src/outlet-provider.tsx
CHANGED
|
@@ -5,11 +5,7 @@ import { OutletContext, type OutletContextValue } from "./outlet-context.js";
|
|
|
5
5
|
import type { ResolvedSegment } from "./types.js";
|
|
6
6
|
|
|
7
7
|
/**
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
* Stores a reference to parent context so useLoader can walk up the chain
|
|
11
|
-
* to find loader data from parent layouts. If this segment defines a loading
|
|
12
|
-
* component, Outlet will wrap content with Suspense using that as fallback.
|
|
8
|
+
* Outlet content provider — stores parent context for useLoader chain walking.
|
|
13
9
|
*/
|
|
14
10
|
export function OutletProvider({
|
|
15
11
|
content,
|
|
@@ -1,32 +1,32 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Deterministic param hashing for prerender storage keys.
|
|
3
|
-
*
|
|
4
|
-
*
|
|
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.
|
|
3
|
+
* Used at build time and runtime; both must produce identical hashes.
|
|
4
|
+
* DJB2-based; works in all JS environments without crypto imports.
|
|
10
5
|
*/
|
|
11
6
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
*/
|
|
7
|
+
import { encodeKV } from "../encode-kv.js";
|
|
8
|
+
|
|
9
|
+
// For static routes (no params), returns "_".
|
|
16
10
|
export function hashParams(params: Record<string, string>): string {
|
|
17
11
|
const entries = Object.entries(params);
|
|
18
12
|
if (entries.length === 0) return "_";
|
|
19
13
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
return djb2Hex(str);
|
|
14
|
+
// Byte-order sort + encodeURIComponent join (see encodeKV); output is
|
|
15
|
+
// byte-identical to the prior inline implementation, so build-time and
|
|
16
|
+
// runtime hashes stay stable.
|
|
17
|
+
return djb2Hex(encodeKV(entries, { sort: true }));
|
|
25
18
|
}
|
|
26
19
|
|
|
27
20
|
/**
|
|
28
21
|
* DJB2 hash returning an 8-char hex string.
|
|
29
22
|
* Deterministic across all JS runtimes.
|
|
23
|
+
*
|
|
24
|
+
* 32-bit output: per-route collision probability hits ~50% near ~77k distinct
|
|
25
|
+
* param sets (birthday bound). The production store keys solely on
|
|
26
|
+
* routeName/paramHash and does not verify the canonical param string, so a
|
|
27
|
+
* collision serves the surviving entry for both param sets. Benign for typical
|
|
28
|
+
* catalogs; revisit (wider hash or stored-param verification) before
|
|
29
|
+
* pre-rendering hundreds of thousands of pages per route.
|
|
30
30
|
*/
|
|
31
31
|
function djb2Hex(str: string): string {
|
|
32
32
|
let hash = 5381;
|
package/src/prerender/store.ts
CHANGED
|
@@ -1,21 +1,17 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Prerender Store
|
|
3
|
-
*
|
|
4
|
-
*
|
|
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.
|
|
2
|
+
* Prerender Store — reads pre-rendered segment data from the worker bundle.
|
|
3
|
+
* Manifest module (injected via globalThis.__loadPrerenderManifestModule)
|
|
4
|
+
* contains key-to-specifier map and loadPrerenderAsset for import() resolution.
|
|
9
5
|
*/
|
|
10
6
|
|
|
11
|
-
import type {
|
|
12
|
-
SerializedSegmentData,
|
|
13
|
-
SegmentHandleData,
|
|
14
|
-
} from "../cache/types.js";
|
|
7
|
+
import type { SerializedSegmentData } from "../cache/types.js";
|
|
15
8
|
|
|
16
9
|
export interface PrerenderEntry {
|
|
17
10
|
segments: SerializedSegmentData[];
|
|
18
|
-
|
|
11
|
+
/** RSC-encoded handle map (see handle-snapshot.ts encodeHandles); "" when the
|
|
12
|
+
* route pushed no handles. Encoded so Promise/ReactNode handle values survive
|
|
13
|
+
* the JSON-serialized build artifact / dev wire, identical to the runtime cache. */
|
|
14
|
+
handles: string;
|
|
19
15
|
}
|
|
20
16
|
|
|
21
17
|
export interface PrerenderStore {
|
|
@@ -28,7 +24,9 @@ export interface PrerenderStore {
|
|
|
28
24
|
|
|
29
25
|
export interface StaticEntry {
|
|
30
26
|
encoded: string;
|
|
31
|
-
|
|
27
|
+
/** RSC-encoded single-segment handle data (see encodeHandleValue); "" when the
|
|
28
|
+
* Static handler pushed no handles. */
|
|
29
|
+
handles: string;
|
|
32
30
|
}
|
|
33
31
|
|
|
34
32
|
export interface StaticStore {
|
|
@@ -99,13 +97,20 @@ export function createPrerenderStore(): PrerenderStore | null {
|
|
|
99
97
|
if (!globalThis.__loadPrerenderManifestModule) return null;
|
|
100
98
|
|
|
101
99
|
const cache = new Map<string, Promise<PrerenderEntry | null>>();
|
|
102
|
-
let manifestModulePromise: Promise<PrerenderManifestModule | null
|
|
103
|
-
null;
|
|
100
|
+
let manifestModulePromise: Promise<PrerenderManifestModule> | null = null;
|
|
104
101
|
|
|
105
|
-
function loadManifestModule(): Promise<PrerenderManifestModule
|
|
102
|
+
function loadManifestModule(): Promise<PrerenderManifestModule> {
|
|
106
103
|
if (!manifestModulePromise) {
|
|
104
|
+
// Do not cache a failed manifest-module load: clear the memoized promise
|
|
105
|
+
// on rejection so the next get() retries, and let the error propagate
|
|
106
|
+
// (consistent with the per-asset load policy below) instead of caching a
|
|
107
|
+
// null for the isolate lifetime, which would silently degrade every
|
|
108
|
+
// prerendered route to a miss after one transient failure.
|
|
107
109
|
manifestModulePromise = globalThis.__loadPrerenderManifestModule!().catch(
|
|
108
|
-
() =>
|
|
110
|
+
(err) => {
|
|
111
|
+
manifestModulePromise = null;
|
|
112
|
+
throw err;
|
|
113
|
+
},
|
|
109
114
|
);
|
|
110
115
|
}
|
|
111
116
|
return manifestModulePromise;
|
|
@@ -118,7 +123,6 @@ export function createPrerenderStore(): PrerenderStore | null {
|
|
|
118
123
|
if (cached) return cached;
|
|
119
124
|
|
|
120
125
|
const promise = loadManifestModule().then((mod) => {
|
|
121
|
-
if (!mod) return null;
|
|
122
126
|
const specifier = mod.default[key];
|
|
123
127
|
if (!specifier) return null;
|
|
124
128
|
// Let asset load errors propagate — a missing/corrupted artifact
|
|
@@ -127,29 +131,20 @@ export function createPrerenderStore(): PrerenderStore | null {
|
|
|
127
131
|
// (which the handler stub would misreport as a 404).
|
|
128
132
|
return mod.loadPrerenderAsset(specifier).then((asset) => asset.default);
|
|
129
133
|
});
|
|
130
|
-
|
|
134
|
+
// Only memoize once the manifest module resolved: a manifest-load
|
|
135
|
+
// rejection must not poison the per-key cache, or the retry above is moot.
|
|
136
|
+
cache.set(
|
|
137
|
+
key,
|
|
138
|
+
promise.catch((err) => {
|
|
139
|
+
cache.delete(key);
|
|
140
|
+
throw err;
|
|
141
|
+
}),
|
|
142
|
+
);
|
|
131
143
|
return promise;
|
|
132
144
|
},
|
|
133
145
|
};
|
|
134
146
|
}
|
|
135
147
|
|
|
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
148
|
/**
|
|
154
149
|
* Create a static segment store.
|
|
155
150
|
* Production only: backed by globalThis.__STATIC_MANIFEST injected at build time.
|
|
@@ -174,7 +169,7 @@ export function createStaticStore(): StaticStore | null {
|
|
|
174
169
|
const val = mod.default;
|
|
175
170
|
// Normalize: string-only (no handles) or { encoded, handles }
|
|
176
171
|
if (typeof val === "string") {
|
|
177
|
-
return { encoded: val, handles:
|
|
172
|
+
return { encoded: val, handles: "" } as StaticEntry;
|
|
178
173
|
}
|
|
179
174
|
return val as StaticEntry;
|
|
180
175
|
})
|