@rangojs/router 0.0.0-experimental.14 → 0.0.0-experimental.140
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 +17 -0
- package/README.md +432 -7
- package/dist/bin/rango.js +2073 -213
- package/dist/testing/vitest.js +82 -0
- package/dist/vite/index.js +7258 -2714
- package/dist/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
- package/package.json +140 -67
- package/skills/api-client/SKILL.md +211 -0
- package/skills/breadcrumbs/SKILL.md +329 -0
- package/skills/bundle-analysis/SKILL.md +159 -0
- package/skills/cache-guide/SKILL.md +487 -0
- package/skills/caching/SKILL.md +357 -25
- 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 +246 -0
- package/skills/css/SKILL.md +76 -0
- package/skills/debug-manifest/SKILL.md +16 -10
- package/skills/document-cache/SKILL.md +87 -62
- package/skills/fonts/SKILL.md +6 -4
- package/skills/handler-use/SKILL.md +364 -0
- package/skills/hooks/SKILL.md +557 -79
- package/skills/host-router/SKILL.md +320 -0
- package/skills/i18n/SKILL.md +276 -0
- package/skills/intercept/SKILL.md +207 -15
- package/skills/layout/SKILL.md +146 -6
- package/skills/links/SKILL.md +304 -25
- package/skills/loader/SKILL.md +616 -54
- package/skills/middleware/SKILL.md +217 -37
- package/skills/migrate-nextjs/SKILL.md +611 -0
- package/skills/migrate-react-router/SKILL.md +927 -0
- package/skills/mime-routes/SKILL.md +42 -11
- package/skills/observability/SKILL.md +194 -0
- package/skills/parallel/SKILL.md +284 -3
- package/skills/ppr/SKILL.md +426 -0
- package/skills/prerender/SKILL.md +437 -52
- package/skills/rango/SKILL.md +369 -22
- package/skills/react-compiler/SKILL.md +168 -0
- package/skills/response-routes/SKILL.md +263 -121
- package/skills/route/SKILL.md +350 -21
- package/skills/router-setup/SKILL.md +246 -33
- package/skills/scripts/SKILL.md +179 -0
- package/skills/server-actions/SKILL.md +775 -0
- package/skills/shell-manifest/SKILL.md +185 -0
- package/skills/streams-and-websockets/SKILL.md +283 -0
- package/skills/tailwind/SKILL.md +27 -3
- package/skills/testing/SKILL.md +126 -222
- 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 +9 -8
- package/skills/typesafety/SKILL.md +532 -103
- package/skills/use-cache/SKILL.md +367 -0
- package/skills/vercel/SKILL.md +128 -0
- package/skills/view-transitions/SKILL.md +337 -0
- package/src/__augment-tests__/augment.ts +81 -0
- package/src/__augment-tests__/augmented.check.ts +116 -0
- package/src/__internal.ts +77 -44
- package/src/bin/rango.ts +312 -15
- package/src/browser/action-coordinator.ts +114 -0
- package/src/browser/action-fence.ts +47 -0
- package/src/browser/app-shell.ts +39 -0
- package/src/browser/app-version.ts +14 -0
- package/src/browser/connection-warmup.ts +134 -0
- package/src/browser/cookie-name.ts +140 -0
- package/src/browser/event-controller.ts +293 -202
- package/src/browser/history-state.ts +101 -0
- package/src/browser/index.ts +3 -3
- package/src/browser/intercept-utils.ts +52 -0
- package/src/browser/invalidate-client-cache.ts +52 -0
- package/src/browser/link-interceptor.ts +24 -4
- package/src/browser/logging.ts +11 -0
- package/src/browser/merge-segment-loaders.ts +20 -12
- package/src/browser/navigation-bridge.ts +385 -576
- package/src/browser/navigation-client.ts +245 -75
- package/src/browser/navigation-store-handle.ts +38 -0
- package/src/browser/navigation-store.ts +184 -118
- package/src/browser/navigation-transaction.ts +247 -0
- package/src/browser/network-error-handler.ts +88 -0
- package/src/browser/partial-update.ts +412 -364
- package/src/browser/prefetch/cache.ts +359 -0
- package/src/browser/prefetch/fetch.ts +452 -0
- package/src/browser/prefetch/observer.ts +65 -0
- package/src/browser/prefetch/policy.ts +48 -0
- package/src/browser/prefetch/queue.ts +209 -0
- package/src/browser/prefetch/resource-ready.ts +77 -0
- package/src/browser/rango-state.ts +194 -0
- package/src/browser/react/Link.tsx +275 -68
- package/src/browser/react/NavigationProvider.tsx +265 -109
- package/src/browser/react/ScrollRestoration.tsx +10 -6
- package/src/browser/react/context.ts +11 -0
- package/src/browser/react/filter-segment-order.ts +70 -0
- package/src/browser/react/index.ts +0 -48
- package/src/browser/react/location-state-shared.ts +272 -60
- package/src/browser/react/location-state.ts +90 -20
- 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 +35 -66
- package/src/browser/react/use-handle.ts +39 -126
- package/src/browser/react/use-href.tsx +8 -1
- package/src/browser/react/use-link-status.ts +39 -13
- package/src/browser/react/use-navigation.ts +53 -69
- package/src/browser/react/use-params.ts +75 -0
- package/src/browser/react/use-pathname.ts +47 -0
- package/src/browser/react/use-reverse.ts +106 -0
- package/src/browser/react/use-router.ts +98 -0
- package/src/browser/react/use-search-params.ts +51 -0
- package/src/browser/react/use-segments.ts +72 -99
- package/src/browser/response-adapter.ts +164 -0
- package/src/browser/rsc-router.tsx +300 -72
- package/src/browser/scroll-restoration.ts +138 -50
- package/src/browser/segment-reconciler.ts +243 -0
- package/src/browser/segment-structure-assert.ts +17 -1
- package/src/browser/server-action-bridge.ts +668 -613
- package/src/browser/types.ts +223 -51
- package/src/browser/validate-redirect-origin.ts +56 -0
- package/src/build/collect-fallback-refs.ts +107 -0
- package/src/build/generate-manifest.ts +252 -161
- package/src/build/generate-route-types.ts +41 -1038
- package/src/build/index.ts +12 -7
- package/src/build/prefix-tree-utils.ts +123 -0
- package/src/build/route-trie.ts +225 -42
- package/src/build/route-types/ast-helpers.ts +25 -0
- package/src/build/route-types/ast-route-extraction.ts +105 -0
- package/src/build/route-types/codegen.ts +113 -0
- package/src/build/route-types/include-resolution.ts +812 -0
- package/src/build/route-types/param-extraction.ts +51 -0
- package/src/build/route-types/per-module-writer.ts +144 -0
- package/src/build/route-types/router-processing.ts +695 -0
- package/src/build/route-types/scan-filter.ts +85 -0
- package/src/build/route-types/source-scan.ts +216 -0
- package/src/build/runtime-discovery.ts +223 -0
- package/src/cache/background-task.ts +34 -0
- package/src/cache/cache-error.ts +104 -0
- package/src/cache/cache-key-utils.ts +60 -0
- package/src/cache/cache-policy.ts +199 -0
- package/src/cache/cache-runtime.ts +525 -0
- package/src/cache/cache-scope.ts +298 -332
- package/src/cache/cache-tag.ts +103 -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 +2500 -158
- 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 +17 -17
- package/src/cache/document-cache.ts +199 -92
- package/src/cache/handle-capture.ts +81 -0
- package/src/cache/handle-snapshot.ts +111 -0
- package/src/cache/index.ts +29 -35
- package/src/cache/memory-segment-store.ts +363 -30
- package/src/cache/profile-registry.ts +88 -0
- package/src/cache/read-through-swr.ts +178 -0
- package/src/cache/segment-codec.ts +248 -0
- package/src/cache/shell-cache.ts +386 -0
- package/src/cache/tag-invalidation.ts +230 -0
- package/src/cache/taint.ts +153 -0
- package/src/cache/types.ts +156 -211
- package/src/cache/vercel/index.ts +11 -0
- package/src/cache/vercel/vercel-cache-store.ts +1102 -0
- package/src/client.rsc.tsx +43 -21
- package/src/client.tsx +131 -347
- package/src/cloudflare/index.ts +11 -0
- package/src/cloudflare/tracing.ts +109 -0
- package/src/component-utils.ts +23 -4
- package/src/components/DefaultDocument.tsx +13 -3
- package/src/context-var.ts +168 -0
- package/src/debug.ts +19 -9
- package/src/decode-loader-results.ts +52 -0
- package/src/defer.ts +185 -0
- package/src/deps/ssr.ts +0 -1
- package/src/encode-kv.ts +49 -0
- package/src/errors.ts +106 -10
- package/src/escape-script.ts +52 -0
- package/src/handle.ts +110 -35
- package/src/handles/MetaTags.tsx +83 -59
- package/src/handles/Scripts.tsx +183 -0
- package/src/handles/breadcrumbs.ts +93 -0
- package/src/handles/deferred-resolution.ts +127 -0
- package/src/handles/is-thenable.ts +18 -0
- package/src/handles/meta.ts +44 -53
- package/src/handles/script.ts +244 -0
- package/src/host/cookie-handler.ts +20 -65
- package/src/host/errors.ts +21 -30
- package/src/host/index.ts +13 -9
- package/src/host/pattern-matcher.ts +50 -79
- package/src/host/router.ts +151 -121
- package/src/host/testing.ts +45 -32
- package/src/host/types.ts +52 -11
- package/src/host/utils.ts +2 -2
- package/src/href-client.ts +192 -57
- package/src/index.rsc.ts +177 -35
- package/src/index.ts +255 -71
- package/src/internal-debug.ts +9 -2
- package/src/loader-store.ts +500 -0
- package/src/loader.rsc.ts +31 -99
- package/src/loader.ts +30 -12
- package/src/missing-id-error.ts +68 -0
- package/src/outlet-context.ts +1 -1
- package/src/outlet-provider.tsx +41 -0
- package/src/prerender/param-hash.ts +16 -14
- package/src/prerender/store.ts +121 -21
- package/src/prerender.ts +460 -26
- package/src/redirect-origin.ts +100 -0
- package/src/regex-escape.ts +8 -0
- package/src/render-error-thrower.tsx +20 -0
- package/src/response-utils.ts +62 -0
- package/src/reverse.ts +198 -128
- package/src/root-error-boundary.tsx +42 -48
- package/src/route-content-wrapper.tsx +22 -77
- package/src/route-definition/dsl-helpers.ts +1116 -0
- package/src/route-definition/helper-factories.ts +88 -0
- package/src/route-definition/helpers-types.ts +505 -0
- package/src/route-definition/index.ts +54 -0
- package/src/route-definition/redirect.ts +134 -0
- package/src/route-definition/resolve-handler-use.ts +160 -0
- package/src/route-definition/use-item-types.ts +29 -0
- package/src/route-definition.ts +1 -1481
- package/src/route-map-builder.ts +82 -144
- package/src/route-name.ts +53 -0
- package/src/route-types.ts +71 -45
- package/src/router/basename.ts +14 -0
- package/src/router/content-negotiation.ts +263 -0
- package/src/router/debug-manifest.ts +72 -0
- package/src/router/error-handling.ts +54 -27
- package/src/router/find-match.ts +245 -0
- package/src/router/handler-context.ts +377 -125
- package/src/router/instrument.ts +350 -0
- package/src/router/intercept-resolution.ts +59 -28
- package/src/router/lazy-includes.ts +254 -0
- package/src/router/loader-resolution.ts +421 -157
- package/src/router/logging.ts +106 -6
- package/src/router/manifest.ts +131 -57
- package/src/router/match-api.ts +167 -246
- package/src/router/match-context.ts +4 -24
- package/src/router/match-handlers.ts +440 -0
- package/src/router/match-middleware/background-revalidation.ts +117 -93
- package/src/router/match-middleware/cache-lookup.ts +297 -150
- package/src/router/match-middleware/cache-store.ts +123 -51
- package/src/router/match-middleware/intercept-resolution.ts +44 -43
- package/src/router/match-middleware/segment-resolution.ts +64 -22
- package/src/router/match-pipelines.ts +11 -87
- package/src/router/match-result.ts +121 -50
- package/src/router/metrics.ts +219 -28
- package/src/router/middleware-types.ts +93 -0
- package/src/router/middleware.ts +505 -441
- package/src/router/navigation-snapshot.ts +133 -0
- package/src/router/params-util.ts +23 -0
- package/src/router/parse-pattern.ts +115 -0
- package/src/router/pattern-matching.ts +311 -142
- package/src/router/prefetch-cache-ttl.ts +51 -0
- package/src/router/prefetch-limits.ts +37 -0
- package/src/router/prerender-match.ts +547 -0
- package/src/router/preview-match.ts +102 -0
- package/src/router/request-classification.ts +278 -0
- package/src/router/revalidation.ts +203 -62
- package/src/router/route-snapshot.ts +246 -0
- package/src/router/router-context.ts +45 -48
- package/src/router/router-interfaces.ts +554 -0
- package/src/router/router-options.ts +779 -0
- package/src/router/router-registry.ts +21 -0
- package/src/router/segment-resolution/fresh.ts +772 -0
- package/src/router/segment-resolution/helpers.ts +348 -0
- package/src/router/segment-resolution/loader-cache.ts +250 -0
- package/src/router/segment-resolution/loader-mask.ts +44 -0
- package/src/router/segment-resolution/revalidation.ts +1331 -0
- package/src/router/segment-resolution/static-store.ts +81 -0
- package/src/router/segment-resolution/streamed-handler-telemetry.ts +52 -0
- package/src/router/segment-resolution/view-transition-default.ts +56 -0
- package/src/router/segment-resolution.ts +25 -1354
- package/src/router/segment-wrappers.ts +292 -0
- package/src/router/state-cookie-name.ts +33 -0
- package/src/router/substitute-pattern-params.ts +75 -0
- package/src/router/telemetry-otel.ts +261 -0
- package/src/router/telemetry.ts +377 -0
- package/src/router/timeout.ts +128 -0
- package/src/router/tracing.ts +206 -0
- package/src/router/trie-matching.ts +240 -61
- package/src/router/types.ts +23 -70
- package/src/router/url-params.ts +57 -0
- package/src/router.ts +781 -2378
- package/src/rsc/full-payload.ts +70 -0
- package/src/rsc/handler-context.ts +46 -0
- package/src/rsc/handler.ts +905 -1142
- package/src/rsc/helpers.ts +275 -19
- package/src/rsc/index.ts +2 -25
- package/src/rsc/json-route-result.ts +38 -0
- package/src/rsc/loader-fetch.ts +305 -0
- package/src/rsc/manifest-init.ts +77 -0
- package/src/rsc/nonce.ts +14 -0
- package/src/rsc/origin-guard.ts +155 -0
- package/src/rsc/progressive-enhancement.ts +502 -0
- package/src/rsc/redirect-guard.ts +99 -0
- package/src/rsc/response-cache-serve.ts +238 -0
- package/src/rsc/response-error.ts +104 -0
- package/src/rsc/response-route-handler.ts +257 -0
- package/src/rsc/rsc-rendering.ts +337 -0
- package/src/rsc/runtime-warnings.ts +55 -0
- package/src/rsc/server-action.ts +522 -0
- package/src/rsc/shell-capture.ts +439 -0
- package/src/rsc/ssr-setup.ts +144 -0
- package/src/rsc/transition-gate.ts +89 -0
- package/src/rsc/types.ts +95 -12
- package/src/runtime-env.ts +18 -0
- package/src/search-params.ts +99 -82
- package/src/segment-content-promise.ts +67 -0
- package/src/segment-loader-promise.ts +149 -0
- package/src/segment-system.tsx +349 -134
- package/src/serialize.ts +243 -0
- package/src/server/context.ts +452 -85
- package/src/server/cookie-parse.ts +32 -0
- package/src/server/cookie-store.ts +310 -0
- package/src/server/fetchable-loader-store.ts +11 -6
- package/src/server/handle-store.ts +123 -42
- package/src/server/live.ts +130 -0
- package/src/server/loader-registry.ts +51 -100
- package/src/server/request-context.ts +842 -157
- package/src/server.ts +15 -8
- package/src/ssr/index.tsx +412 -136
- package/src/ssr/ssr-root.tsx +228 -0
- package/src/static-handler.ts +45 -18
- package/src/testing/cache-status.ts +162 -0
- package/src/testing/collect-handle.ts +46 -0
- package/src/testing/dispatch.ts +701 -0
- package/src/testing/dom.entry.ts +22 -0
- package/src/testing/e2e/fixture.ts +188 -0
- package/src/testing/e2e/index.ts +128 -0
- package/src/testing/e2e/matchers.ts +35 -0
- package/src/testing/e2e/page-helpers.ts +272 -0
- package/src/testing/e2e/parity.ts +387 -0
- package/src/testing/e2e/server.ts +195 -0
- package/src/testing/flight-matchers.ts +97 -0
- package/src/testing/flight-normalize.ts +11 -0
- package/src/testing/flight-runtime.d.ts +57 -0
- package/src/testing/flight-tree.ts +682 -0
- package/src/testing/flight.entry.ts +52 -0
- package/src/testing/flight.ts +257 -0
- package/src/testing/generated-routes.ts +199 -0
- package/src/testing/index.ts +105 -0
- package/src/testing/internal/context.ts +371 -0
- 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 +584 -0
- package/src/testing/run-loader.ts +385 -0
- package/src/testing/run-middleware.ts +205 -0
- package/src/testing/run-transition-when.ts +164 -0
- package/src/testing/vitest-stubs/cloudflare-email.ts +9 -0
- package/src/testing/vitest-stubs/cloudflare-workers.ts +21 -0
- package/src/testing/vitest-stubs/plugin-rsc.ts +16 -0
- package/src/testing/vitest-stubs/version.ts +5 -0
- package/src/testing/vitest.ts +305 -0
- package/src/theme/ThemeProvider.tsx +40 -72
- package/src/theme/ThemeScript.tsx +12 -14
- package/src/theme/constants.ts +57 -15
- package/src/theme/index.ts +3 -20
- package/src/theme/theme-context.ts +5 -35
- package/src/theme/theme-script.ts +43 -39
- package/src/theme/use-theme.ts +0 -3
- package/src/types/boundaries.ts +123 -0
- package/src/types/cache-types.ts +207 -0
- package/src/types/error-types.ts +132 -0
- package/src/types/global-namespace.ts +113 -0
- package/src/types/handler-context.ts +839 -0
- package/src/types/index.ts +81 -0
- package/src/types/loader-types.ts +212 -0
- package/src/types/request-scope.ts +112 -0
- package/src/types/route-config.ts +138 -0
- package/src/types/route-entry.ts +114 -0
- package/src/types/segments.ts +271 -0
- package/src/types.ts +1 -1795
- package/src/urls/include-helper.ts +162 -0
- package/src/urls/include-provider.ts +71 -0
- package/src/urls/index.ts +43 -0
- package/src/urls/path-helper-types.ts +413 -0
- package/src/urls/path-helper.ts +275 -0
- package/src/urls/pattern-types.ts +124 -0
- package/src/urls/response-types.ts +109 -0
- package/src/urls/type-extraction.ts +316 -0
- package/src/urls/urls-function.ts +80 -0
- package/src/urls.ts +1 -1341
- package/src/use-loader.tsx +406 -141
- package/src/vercel/index.ts +11 -0
- package/src/vercel/tracing.ts +88 -0
- package/src/vite/debug.ts +185 -0
- package/src/vite/discovery/bundle-postprocess.ts +182 -0
- package/src/vite/discovery/discover-routers.ts +389 -0
- package/src/vite/discovery/discovery-errors.ts +255 -0
- package/src/vite/discovery/gate-state.ts +171 -0
- package/src/vite/discovery/prerender-collection.ts +467 -0
- package/src/vite/discovery/route-types-writer.ts +214 -0
- package/src/vite/discovery/self-gen-tracking.ts +73 -0
- package/src/vite/discovery/state.ts +161 -0
- package/src/vite/discovery/virtual-module-codegen.ts +183 -0
- package/src/vite/index.ts +23 -2255
- package/src/vite/inject-client-debug.ts +36 -0
- package/src/vite/plugin-types.ts +303 -0
- package/src/vite/plugins/cjs-to-esm.ts +90 -0
- package/src/vite/plugins/client-ref-dedup.ts +120 -0
- package/src/vite/plugins/client-ref-hashing.ts +118 -0
- package/src/vite/plugins/cloudflare-protocol-loader-hook.d.mts +23 -0
- package/src/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
- package/src/vite/plugins/cloudflare-protocol-stub.ts +194 -0
- package/src/vite/{expose-action-id.ts → plugins/expose-action-id.ts} +88 -110
- package/src/vite/{expose-id-utils.ts → plugins/expose-id-utils.ts} +89 -79
- package/src/vite/plugins/expose-ids/export-analysis.ts +363 -0
- package/src/vite/plugins/expose-ids/handler-transform.ts +130 -0
- package/src/vite/plugins/expose-ids/loader-transform.ts +64 -0
- package/src/vite/plugins/expose-ids/router-transform.ts +199 -0
- package/src/vite/plugins/expose-ids/types.ts +45 -0
- package/src/vite/plugins/expose-internal-ids.ts +805 -0
- package/src/vite/plugins/performance-tracks.ts +89 -0
- package/src/vite/plugins/refresh-cmd.ts +127 -0
- package/src/vite/plugins/use-cache-transform.ts +313 -0
- package/src/vite/plugins/vercel-output.ts +384 -0
- package/src/vite/plugins/version-injector.ts +94 -0
- package/src/vite/plugins/version-plugin.ts +263 -0
- package/src/vite/plugins/virtual-entries.ts +234 -0
- package/src/vite/plugins/virtual-stub-plugin.ts +29 -0
- package/src/vite/rango.ts +560 -0
- package/src/vite/router-discovery.ts +1638 -0
- package/src/vite/{ast-handler-extract.ts → utils/ast-handler-extract.ts} +200 -37
- package/src/vite/utils/banner.ts +36 -0
- package/src/vite/utils/bundle-analysis.ts +132 -0
- package/src/vite/utils/client-chunks.ts +184 -0
- package/src/vite/utils/directive-prologue.ts +40 -0
- package/src/vite/utils/forward-user-plugins.ts +171 -0
- package/src/vite/utils/manifest-utils.ts +15 -0
- package/src/vite/utils/package-resolution.ts +89 -0
- package/src/vite/utils/prerender-utils.ts +249 -0
- package/src/vite/utils/shared-utils.ts +269 -0
- package/CLAUDE.md +0 -43
- package/dist/vite/index.named-routes.gen.ts +0 -103
- package/src/browser/lru-cache.ts +0 -69
- package/src/browser/react/use-client-cache.ts +0 -56
- package/src/browser/request-controller.ts +0 -164
- package/src/browser/shallow.ts +0 -35
- package/src/cache/memory-store.ts +0 -253
- package/src/handles/index.ts +0 -6
- package/src/href-context.ts +0 -33
- package/src/network-error-thrower.tsx +0 -21
- package/src/router.gen.ts +0 -6
- package/src/static-handler.gen.ts +0 -5
- package/src/urls.gen.ts +0 -8
- package/src/vite/expose-internal-ids.ts +0 -1167
- package/src/vite/package-resolution.ts +0 -125
- package/src/vite/virtual-entries.ts +0 -114
- /package/src/vite/{version.d.ts → plugins/version.d.ts} +0 -0
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Route Snapshot
|
|
3
|
+
*
|
|
4
|
+
* Pure data type representing the fully-resolved state of a single route match.
|
|
5
|
+
* Consolidates the duplicated findMatch + loadManifest + collectRouteMiddleware +
|
|
6
|
+
* cacheScope derivation that previously lived separately in preview-match.ts
|
|
7
|
+
* and match-api.ts.
|
|
8
|
+
*
|
|
9
|
+
* resolveRoute() is the factory: given a pathname and dependencies, it returns
|
|
10
|
+
* a RouteSnapshot (or redirect/null). Consumers (createMatchContextForFull,
|
|
11
|
+
* createMatchContextForPartial, previewMatch) read snapshot fields instead of
|
|
12
|
+
* re-deriving them.
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import type { CacheScope } from "../cache/cache-scope.js";
|
|
16
|
+
import { createCacheScope } from "../cache/cache-scope.js";
|
|
17
|
+
import type { EntryData, MetricsStore } from "../server/context.js";
|
|
18
|
+
import { loadManifest } from "./manifest.js";
|
|
19
|
+
import { collectRouteMiddleware } from "./middleware.js";
|
|
20
|
+
import type { CollectedMiddleware } from "./middleware-types.js";
|
|
21
|
+
import { traverseBack } from "./pattern-matching.js";
|
|
22
|
+
import type { RouteMatchResult } from "./pattern-matching.js";
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Immutable snapshot of a resolved route match.
|
|
26
|
+
*
|
|
27
|
+
* Contains everything derivable from (pathname, findMatch, loadManifest)
|
|
28
|
+
* without request context, navigation state, or intercept logic.
|
|
29
|
+
*/
|
|
30
|
+
export interface RouteSnapshot<TEnv = any> {
|
|
31
|
+
/** Raw match result from the trie/pattern matcher */
|
|
32
|
+
matched: RouteMatchResult<TEnv>;
|
|
33
|
+
/** Resolved manifest entry (with loaded handler, loader, etc.) */
|
|
34
|
+
manifestEntry: EntryData;
|
|
35
|
+
/** All entries in the route chain (from traverseBack) */
|
|
36
|
+
entries: EntryData[];
|
|
37
|
+
/** Canonical route key (e.g. "blog.detail") */
|
|
38
|
+
routeKey: string;
|
|
39
|
+
/** Last segment of a dotted route key (e.g. "detail" from "blog.detail") */
|
|
40
|
+
localRouteName: string;
|
|
41
|
+
/** Extracted route params */
|
|
42
|
+
params: Record<string, string>;
|
|
43
|
+
/** Collected route-level middleware from the entry tree */
|
|
44
|
+
routeMiddleware: CollectedMiddleware[];
|
|
45
|
+
/** Merged cache scope from the entry chain */
|
|
46
|
+
cacheScope: CacheScope | null;
|
|
47
|
+
/** Whether the matched route is a passthrough route */
|
|
48
|
+
isPassthrough: boolean;
|
|
49
|
+
/** Response type for non-RSC routes (e.g. "application/json") */
|
|
50
|
+
responseType?: string;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
export type ResolveRouteResult<TEnv = any> =
|
|
54
|
+
| { type: "match"; snapshot: RouteSnapshot<TEnv> }
|
|
55
|
+
| { type: "redirect"; redirectTo: string }
|
|
56
|
+
| null;
|
|
57
|
+
|
|
58
|
+
export interface ResolveRouteDeps<TEnv = any> {
|
|
59
|
+
findMatch: (
|
|
60
|
+
pathname: string,
|
|
61
|
+
) => RouteMatchResult<TEnv> | null | Promise<RouteMatchResult<TEnv> | null>;
|
|
62
|
+
metricsStore?: MetricsStore;
|
|
63
|
+
isSSR?: boolean;
|
|
64
|
+
/**
|
|
65
|
+
* When true, skip entries array and cacheScope chain construction.
|
|
66
|
+
* Used by previewMatch which only needs matched, manifestEntry,
|
|
67
|
+
* routeMiddleware, and responseType — avoids an extra traverseBack
|
|
68
|
+
* allocation and cacheScope composition on the hot classification path.
|
|
69
|
+
*/
|
|
70
|
+
lite?: boolean;
|
|
71
|
+
/**
|
|
72
|
+
* When true, skip pushing the "route-matching" metric internally.
|
|
73
|
+
* Used by createMatchContextForPartial on the fresh path (no snapshot
|
|
74
|
+
* reuse) so it can measure current + prev + intercept-source findMatch
|
|
75
|
+
* calls under one combined "route-matching" metric. On the reuse path,
|
|
76
|
+
* the partial path emits "route-matching:nav" for the prev +
|
|
77
|
+
* intercept-source lookups only (current-route resolution was done
|
|
78
|
+
* during classification without metrics).
|
|
79
|
+
*/
|
|
80
|
+
skipRouteMatchMetric?: boolean;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Resolve a pathname into a RouteSnapshot.
|
|
85
|
+
*
|
|
86
|
+
* This is the single source of truth for route derivation. It performs:
|
|
87
|
+
* 1. findMatch(pathname)
|
|
88
|
+
* 2. Redirect check
|
|
89
|
+
* 3. loadManifest
|
|
90
|
+
* 4. Passthrough detection
|
|
91
|
+
* 5. collectRouteMiddleware
|
|
92
|
+
* 6. Cache scope chain
|
|
93
|
+
* 7. responseType + localRouteName extraction
|
|
94
|
+
*
|
|
95
|
+
* Metrics timing is preserved identically to the previous inline code.
|
|
96
|
+
*/
|
|
97
|
+
export async function resolveRoute<TEnv = any>(
|
|
98
|
+
pathname: string,
|
|
99
|
+
deps: ResolveRouteDeps<TEnv>,
|
|
100
|
+
): Promise<ResolveRouteResult<TEnv>> {
|
|
101
|
+
const {
|
|
102
|
+
metricsStore,
|
|
103
|
+
isSSR = false,
|
|
104
|
+
lite = false,
|
|
105
|
+
skipRouteMatchMetric = false,
|
|
106
|
+
} = deps;
|
|
107
|
+
|
|
108
|
+
const routeMatchStart =
|
|
109
|
+
metricsStore && !skipRouteMatchMetric ? performance.now() : 0;
|
|
110
|
+
const matched = await deps.findMatch(pathname);
|
|
111
|
+
if (metricsStore && !skipRouteMatchMetric) {
|
|
112
|
+
metricsStore.metrics.push({
|
|
113
|
+
label: "route-matching",
|
|
114
|
+
duration: performance.now() - routeMatchStart,
|
|
115
|
+
startTime: routeMatchStart - metricsStore.requestStart,
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
if (!matched) {
|
|
120
|
+
return null;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
if (matched.redirectTo) {
|
|
124
|
+
return { type: "redirect", redirectTo: matched.redirectTo };
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
const manifestStart = metricsStore ? performance.now() : 0;
|
|
128
|
+
const manifestEntry = await loadManifest(
|
|
129
|
+
matched.entry,
|
|
130
|
+
matched.routeKey,
|
|
131
|
+
pathname,
|
|
132
|
+
metricsStore,
|
|
133
|
+
isSSR,
|
|
134
|
+
);
|
|
135
|
+
if (metricsStore) {
|
|
136
|
+
metricsStore.metrics.push({
|
|
137
|
+
label: "manifest-loading",
|
|
138
|
+
duration: performance.now() - manifestStart,
|
|
139
|
+
startTime: manifestStart - metricsStore.requestStart,
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
const isPassthrough =
|
|
144
|
+
manifestEntry.type === "route" && manifestEntry.isPassthrough === true;
|
|
145
|
+
|
|
146
|
+
let entries: EntryData[];
|
|
147
|
+
let cacheScope: CacheScope | null = null;
|
|
148
|
+
if (lite) {
|
|
149
|
+
entries = [];
|
|
150
|
+
} else {
|
|
151
|
+
({ entries, cacheScope } = buildEntriesAndCacheScope(manifestEntry));
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
const routeMiddleware = collectRouteMiddleware(
|
|
155
|
+
lite ? traverseBack(manifestEntry) : entries,
|
|
156
|
+
matched.params,
|
|
157
|
+
);
|
|
158
|
+
|
|
159
|
+
const responseType =
|
|
160
|
+
matched.responseType ||
|
|
161
|
+
(manifestEntry.type === "route" ? manifestEntry.responseType : undefined);
|
|
162
|
+
|
|
163
|
+
const localRouteName = matched.routeKey.includes(".")
|
|
164
|
+
? matched.routeKey.split(".").pop()!
|
|
165
|
+
: matched.routeKey;
|
|
166
|
+
|
|
167
|
+
return {
|
|
168
|
+
type: "match",
|
|
169
|
+
snapshot: {
|
|
170
|
+
matched,
|
|
171
|
+
manifestEntry,
|
|
172
|
+
entries,
|
|
173
|
+
routeKey: matched.routeKey,
|
|
174
|
+
localRouteName,
|
|
175
|
+
params: matched.params,
|
|
176
|
+
routeMiddleware,
|
|
177
|
+
cacheScope,
|
|
178
|
+
isPassthrough,
|
|
179
|
+
responseType,
|
|
180
|
+
},
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
/**
|
|
185
|
+
* Fill in the entries and cacheScope fields on a lite snapshot.
|
|
186
|
+
*
|
|
187
|
+
* When classifyRequest produces a lite snapshot (entries=[], cacheScope=null),
|
|
188
|
+
* this function computes the missing fields from manifestEntry without
|
|
189
|
+
* re-running findMatch, loadManifest, or collectRouteMiddleware.
|
|
190
|
+
*
|
|
191
|
+
* If the snapshot already has entries, returns it as-is.
|
|
192
|
+
*/
|
|
193
|
+
export function ensureFullRouteSnapshot<TEnv = any>(
|
|
194
|
+
snapshot: RouteSnapshot<TEnv>,
|
|
195
|
+
): RouteSnapshot<TEnv> {
|
|
196
|
+
if (snapshot.entries.length > 0) {
|
|
197
|
+
return snapshot;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
const { entries, cacheScope } = buildEntriesAndCacheScope(
|
|
201
|
+
snapshot.manifestEntry,
|
|
202
|
+
);
|
|
203
|
+
return { ...snapshot, entries, cacheScope };
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
/**
|
|
207
|
+
* Materialize the entry chain and derive the merged cache scope.
|
|
208
|
+
* Shared by resolveRoute (non-lite) and ensureFullRouteSnapshot.
|
|
209
|
+
*/
|
|
210
|
+
function buildEntriesAndCacheScope(manifestEntry: EntryData): {
|
|
211
|
+
entries: EntryData[];
|
|
212
|
+
cacheScope: CacheScope | null;
|
|
213
|
+
} {
|
|
214
|
+
const entries = [...traverseBack(manifestEntry)];
|
|
215
|
+
let cacheScope: CacheScope | null = null;
|
|
216
|
+
for (const entry of entries) {
|
|
217
|
+
if (entry.cache) {
|
|
218
|
+
cacheScope = createCacheScope(entry.cache, cacheScope);
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
return { entries, cacheScope };
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
/**
|
|
225
|
+
* Test helper: create a RouteSnapshot with sensible defaults and overrides.
|
|
226
|
+
*/
|
|
227
|
+
export function createRouteSnapshot<TEnv = any>(
|
|
228
|
+
overrides?: Partial<RouteSnapshot<TEnv>>,
|
|
229
|
+
): RouteSnapshot<TEnv> {
|
|
230
|
+
return {
|
|
231
|
+
matched: {
|
|
232
|
+
entry: {} as any,
|
|
233
|
+
routeKey: "test",
|
|
234
|
+
params: {},
|
|
235
|
+
} as RouteMatchResult<TEnv>,
|
|
236
|
+
manifestEntry: { type: "route", shortCode: "R0", parent: null } as any,
|
|
237
|
+
entries: [],
|
|
238
|
+
routeKey: "test",
|
|
239
|
+
localRouteName: "test",
|
|
240
|
+
params: {},
|
|
241
|
+
routeMiddleware: [],
|
|
242
|
+
cacheScope: null,
|
|
243
|
+
isPassthrough: false,
|
|
244
|
+
...overrides,
|
|
245
|
+
};
|
|
246
|
+
}
|
|
@@ -18,6 +18,8 @@ import type {
|
|
|
18
18
|
ShouldRevalidateFn,
|
|
19
19
|
} from "../types.js";
|
|
20
20
|
import type { RouteMatchResult } from "./pattern-matching.js";
|
|
21
|
+
import type { TelemetrySink } from "./telemetry.js";
|
|
22
|
+
import type { ResolveSegmentOptions } from "./segment-resolution.js";
|
|
21
23
|
|
|
22
24
|
/**
|
|
23
25
|
* Revalidation context passed to segment resolution
|
|
@@ -53,22 +55,20 @@ export interface InterceptResult {
|
|
|
53
55
|
* Instead of passing 20+ parameters, middleware calls getRouterContext() to access them.
|
|
54
56
|
*/
|
|
55
57
|
export interface RouterContext<TEnv = any> {
|
|
56
|
-
|
|
57
|
-
|
|
58
|
+
findMatch: (
|
|
59
|
+
pathname: string,
|
|
60
|
+
) => RouteMatchResult | null | Promise<RouteMatchResult | null>;
|
|
58
61
|
|
|
59
|
-
// Manifest loading
|
|
60
62
|
loadManifest: (
|
|
61
63
|
entry: any,
|
|
62
64
|
routeKey: string,
|
|
63
65
|
pathname: string,
|
|
64
66
|
metricsStore?: MetricsStore,
|
|
65
|
-
isSSR?: boolean
|
|
67
|
+
isSSR?: boolean,
|
|
66
68
|
) => Promise<EntryData>;
|
|
67
69
|
|
|
68
|
-
// Entry traversal
|
|
69
70
|
traverseBack: (entry: EntryData) => Generator<EntryData>;
|
|
70
71
|
|
|
71
|
-
// Handler context creation
|
|
72
72
|
createHandlerContext: (
|
|
73
73
|
params: Record<string, string>,
|
|
74
74
|
request: Request,
|
|
@@ -77,49 +77,45 @@ export interface RouterContext<TEnv = any> {
|
|
|
77
77
|
url: URL,
|
|
78
78
|
bindings?: any,
|
|
79
79
|
routeMap?: Record<string, string>,
|
|
80
|
-
routeName?: string
|
|
80
|
+
routeName?: string,
|
|
81
|
+
responseType?: string,
|
|
82
|
+
isPassthroughRoute?: boolean,
|
|
81
83
|
) => HandlerContext<any, TEnv>;
|
|
82
84
|
|
|
83
|
-
// Loader setup
|
|
84
85
|
setupLoaderAccess: (
|
|
85
86
|
ctx: HandlerContext<any, TEnv>,
|
|
86
|
-
loaderPromises: Map<string, Promise<any
|
|
87
|
+
loaderPromises: Map<string, Promise<any>>,
|
|
87
88
|
) => void;
|
|
88
89
|
|
|
89
90
|
setupLoaderAccessSilent: (
|
|
90
91
|
ctx: HandlerContext<any, TEnv>,
|
|
91
|
-
loaderPromises: Map<string, Promise<any
|
|
92
|
+
loaderPromises: Map<string, Promise<any>>,
|
|
92
93
|
) => void;
|
|
93
94
|
|
|
94
|
-
// Context access
|
|
95
95
|
getContext: () => {
|
|
96
96
|
getOrCreateStore: (key: string) => any;
|
|
97
97
|
runWithStore: <T>(
|
|
98
98
|
store: any,
|
|
99
99
|
namespace: string,
|
|
100
100
|
parent: any,
|
|
101
|
-
fn: () => T
|
|
101
|
+
fn: () => T,
|
|
102
102
|
) => T;
|
|
103
103
|
};
|
|
104
104
|
|
|
105
|
-
// Metrics
|
|
106
105
|
getMetricsStore: () => MetricsStore | undefined;
|
|
107
106
|
|
|
108
|
-
// Cache
|
|
109
107
|
createCacheScope: (
|
|
110
108
|
cacheConfig: any,
|
|
111
|
-
parent: CacheScope | null
|
|
109
|
+
parent: CacheScope | null,
|
|
112
110
|
) => CacheScope | null;
|
|
113
111
|
|
|
114
|
-
// Intercept detection
|
|
115
112
|
findInterceptForRoute: (
|
|
116
113
|
routeKey: string,
|
|
117
114
|
parentEntry: EntryData | null,
|
|
118
115
|
selectorContext: InterceptSelectorContext,
|
|
119
|
-
isAction: boolean
|
|
116
|
+
isAction: boolean,
|
|
120
117
|
) => InterceptResult | null;
|
|
121
118
|
|
|
122
|
-
// Segment resolution (with revalidation)
|
|
123
119
|
resolveAllSegmentsWithRevalidation: (
|
|
124
120
|
entries: EntryData[],
|
|
125
121
|
routeKey: string,
|
|
@@ -130,11 +126,11 @@ export interface RouterContext<TEnv = any> {
|
|
|
130
126
|
request: Request,
|
|
131
127
|
prevUrl: URL,
|
|
132
128
|
nextUrl: URL,
|
|
133
|
-
loaderPromises: Map<string, Promise<any>>,
|
|
134
129
|
actionContext: any | undefined,
|
|
135
130
|
interceptResult: InterceptResult | null,
|
|
136
131
|
localRouteName: string,
|
|
137
|
-
pathname: string
|
|
132
|
+
pathname: string,
|
|
133
|
+
stale?: boolean,
|
|
138
134
|
) => Promise<{ segments: ResolvedSegment[]; matchedIds: string[] }>;
|
|
139
135
|
|
|
140
136
|
// Generator-based segment resolution (for pipeline)
|
|
@@ -149,7 +145,7 @@ export interface RouterContext<TEnv = any> {
|
|
|
149
145
|
prevUrl: URL,
|
|
150
146
|
nextUrl: URL,
|
|
151
147
|
loaderPromises: Map<string, Promise<any>>,
|
|
152
|
-
actionContext?: any
|
|
148
|
+
actionContext?: any,
|
|
153
149
|
) => AsyncGenerator<ResolvedSegment | { __type: "id"; id: string }>;
|
|
154
150
|
|
|
155
151
|
// Intercept resolution
|
|
@@ -159,15 +155,14 @@ export interface RouterContext<TEnv = any> {
|
|
|
159
155
|
params: Record<string, string>,
|
|
160
156
|
handlerContext: HandlerContext<any, TEnv>,
|
|
161
157
|
belongsToRoute: boolean,
|
|
162
|
-
revalidationContext?: RevalidationContext
|
|
158
|
+
revalidationContext?: RevalidationContext,
|
|
159
|
+
options?: { skipMiddleware?: boolean },
|
|
163
160
|
) => Promise<ResolvedSegment[]>;
|
|
164
161
|
|
|
165
|
-
// Collect with markers
|
|
166
162
|
collectWithMarkers?: <T>(
|
|
167
|
-
gen: AsyncGenerator<T | { __type: "id"; id: string }
|
|
163
|
+
gen: AsyncGenerator<T | { __type: "id"; id: string }>,
|
|
168
164
|
) => Promise<{ items: T[]; matchedIds: string[] }>;
|
|
169
165
|
|
|
170
|
-
// Revalidation evaluation
|
|
171
166
|
evaluateRevalidation: (params: {
|
|
172
167
|
segment: ResolvedSegment;
|
|
173
168
|
prevParams: Record<string, string>;
|
|
@@ -180,9 +175,17 @@ export interface RouterContext<TEnv = any> {
|
|
|
180
175
|
context: HandlerContext<any, TEnv>;
|
|
181
176
|
actionContext?: any;
|
|
182
177
|
stale?: boolean;
|
|
178
|
+
traceSource?:
|
|
179
|
+
| "segment-resolution"
|
|
180
|
+
| "cache-hit"
|
|
181
|
+
| "loader"
|
|
182
|
+
| "parallel"
|
|
183
|
+
| "orphan-layout"
|
|
184
|
+
| "route-handler"
|
|
185
|
+
| "layout-handler"
|
|
186
|
+
| "intercept-loader";
|
|
183
187
|
}) => Promise<boolean>;
|
|
184
188
|
|
|
185
|
-
// Request context
|
|
186
189
|
getRequestContext: () =>
|
|
187
190
|
| {
|
|
188
191
|
waitUntil: (fn: () => Promise<void>) => void;
|
|
@@ -190,39 +193,34 @@ export interface RouterContext<TEnv = any> {
|
|
|
190
193
|
}
|
|
191
194
|
| undefined;
|
|
192
195
|
|
|
193
|
-
// Simple segment resolution (without revalidation - for full match)
|
|
194
196
|
resolveAllSegments: (
|
|
195
197
|
entries: EntryData[],
|
|
196
198
|
routeKey: string,
|
|
197
199
|
params: Record<string, string>,
|
|
198
200
|
handlerContext: HandlerContext<any, TEnv>,
|
|
199
|
-
loaderPromises: Map<string, Promise<any
|
|
201
|
+
loaderPromises: Map<string, Promise<any>>,
|
|
202
|
+
options?: ResolveSegmentOptions,
|
|
200
203
|
) => Promise<ResolvedSegment[]>;
|
|
201
204
|
|
|
202
|
-
// Generator-based simple resolution
|
|
203
205
|
resolveAllSegmentsGenerator?: (
|
|
204
206
|
entries: EntryData[],
|
|
205
207
|
routeKey: string,
|
|
206
208
|
params: Record<string, string>,
|
|
207
209
|
handlerContext: HandlerContext<any, TEnv>,
|
|
208
|
-
loaderPromises: Map<string, Promise<any
|
|
210
|
+
loaderPromises: Map<string, Promise<any>>,
|
|
209
211
|
) => AsyncGenerator<ResolvedSegment | { __type: "id"; id: string }>;
|
|
210
212
|
|
|
211
|
-
// Collect segments from generator
|
|
212
213
|
collectSegmentsFromGenerator?: <T>(
|
|
213
|
-
gen: AsyncGenerator<T | { __type: "id"; id: string }
|
|
214
|
+
gen: AsyncGenerator<T | { __type: "id"; id: string }>,
|
|
214
215
|
) => Promise<T[]>;
|
|
215
216
|
|
|
216
|
-
// Handle store
|
|
217
217
|
createHandleStore: () => any;
|
|
218
218
|
|
|
219
|
-
// Loaders-only resolution (for full match cache hit - no revalidation)
|
|
220
219
|
resolveLoadersOnly?: (
|
|
221
220
|
entries: EntryData[],
|
|
222
|
-
handlerContext: HandlerContext<any, TEnv
|
|
221
|
+
handlerContext: HandlerContext<any, TEnv>,
|
|
223
222
|
) => Promise<ResolvedSegment[]>;
|
|
224
223
|
|
|
225
|
-
// Loaders-only resolution (for cache hit scenarios)
|
|
226
224
|
resolveLoadersOnlyWithRevalidation?: (
|
|
227
225
|
entries: EntryData[],
|
|
228
226
|
handlerContext: HandlerContext<any, TEnv>,
|
|
@@ -232,15 +230,20 @@ export interface RouterContext<TEnv = any> {
|
|
|
232
230
|
prevUrl: URL,
|
|
233
231
|
nextUrl: URL,
|
|
234
232
|
routeKey: string,
|
|
235
|
-
actionContext?: any
|
|
233
|
+
actionContext?: any,
|
|
234
|
+
stale?: boolean,
|
|
236
235
|
) => Promise<{ segments: ResolvedSegment[]; matchedIds: string[] }>;
|
|
237
236
|
|
|
238
237
|
// Entry revalidation map
|
|
239
238
|
buildEntryRevalidateMap?: (
|
|
240
|
-
entries: EntryData[]
|
|
239
|
+
entries: EntryData[],
|
|
241
240
|
) => Map<string, { revalidate: ShouldRevalidateFn[] }>;
|
|
242
241
|
|
|
243
|
-
//
|
|
242
|
+
// Telemetry sink (optional, no-op when undefined)
|
|
243
|
+
telemetry?: TelemetrySink;
|
|
244
|
+
|
|
245
|
+
requestId?: string;
|
|
246
|
+
|
|
244
247
|
resolveInterceptLoadersOnly?: (
|
|
245
248
|
intercept: InterceptEntry,
|
|
246
249
|
entry: EntryData,
|
|
@@ -256,14 +259,13 @@ export interface RouterContext<TEnv = any> {
|
|
|
256
259
|
routeKey: string;
|
|
257
260
|
actionContext?: any;
|
|
258
261
|
stale?: boolean;
|
|
259
|
-
}
|
|
262
|
+
},
|
|
260
263
|
) => Promise<{
|
|
261
264
|
loaderDataPromise: Promise<any[]> | any[];
|
|
262
265
|
loaderIds: string[];
|
|
263
266
|
} | null>;
|
|
264
267
|
}
|
|
265
268
|
|
|
266
|
-
// AsyncLocalStorage instance for router context
|
|
267
269
|
const routerContext = new AsyncLocalStorage<RouterContext<any>>();
|
|
268
270
|
|
|
269
271
|
/**
|
|
@@ -276,7 +278,7 @@ export function getRouterContext<TEnv = any>(): RouterContext<TEnv> {
|
|
|
276
278
|
if (!deps) {
|
|
277
279
|
throw new Error(
|
|
278
280
|
"getRouterContext() called outside of router context. " +
|
|
279
|
-
"Ensure code is running inside runWithRouterContext()."
|
|
281
|
+
"Ensure code is running inside runWithRouterContext().",
|
|
280
282
|
);
|
|
281
283
|
}
|
|
282
284
|
return deps as RouterContext<TEnv>;
|
|
@@ -287,15 +289,10 @@ export function getRouterContext<TEnv = any>(): RouterContext<TEnv> {
|
|
|
287
289
|
*
|
|
288
290
|
* All async code within fn() can call getRouterContext() to access router closures.
|
|
289
291
|
* This works across async boundaries thanks to AsyncLocalStorage.
|
|
290
|
-
*
|
|
291
|
-
* @param deps Router dependencies to make available
|
|
292
|
-
* @param fn Function to run with dependencies available
|
|
293
|
-
* @returns Result of fn()
|
|
294
292
|
*/
|
|
295
293
|
export function runWithRouterContext<T, TEnv = any>(
|
|
296
294
|
deps: RouterContext<TEnv>,
|
|
297
|
-
fn: () => T
|
|
295
|
+
fn: () => T,
|
|
298
296
|
): T {
|
|
299
297
|
return routerContext.run(deps, fn);
|
|
300
298
|
}
|
|
301
|
-
|