@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
package/src/router/match-api.ts
CHANGED
|
@@ -1,46 +1,42 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Match API
|
|
3
|
-
*
|
|
4
|
-
* Extracted from createRouter closure. Contains match context creation functions
|
|
5
|
-
* and the matchError function for error boundary resolution.
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
1
|
import { CacheScope, createCacheScope } from "../cache/cache-scope.js";
|
|
9
|
-
import {
|
|
10
|
-
RouteNotFoundError,
|
|
11
|
-
} from "../errors";
|
|
2
|
+
import { RouteNotFoundError } from "../errors";
|
|
12
3
|
import {
|
|
13
4
|
createErrorInfo,
|
|
14
5
|
createErrorSegment,
|
|
15
6
|
findNearestErrorBoundary as findErrorBoundary,
|
|
16
7
|
} from "./error-handling.js";
|
|
17
|
-
import {
|
|
8
|
+
import {
|
|
9
|
+
createHandlerContext,
|
|
10
|
+
stripInternalParams,
|
|
11
|
+
} from "./handler-context.js";
|
|
18
12
|
import { setupLoaderAccess } from "./loader-resolution.js";
|
|
19
13
|
import { loadManifest, clearManifestCache } from "./manifest.js";
|
|
20
14
|
import { collectRouteMiddleware } from "./middleware.js";
|
|
21
15
|
import { traverseBack } from "./pattern-matching.js";
|
|
22
16
|
import { DefaultErrorFallback } from "../default-error-boundary.js";
|
|
23
17
|
import {
|
|
24
|
-
EntryData,
|
|
25
|
-
LoaderEntry,
|
|
18
|
+
type EntryData,
|
|
19
|
+
type LoaderEntry,
|
|
26
20
|
getContext,
|
|
27
|
-
InterceptSelectorContext,
|
|
28
|
-
type MetricsStore,
|
|
21
|
+
type InterceptSelectorContext,
|
|
29
22
|
} from "../server/context";
|
|
30
|
-
import type {
|
|
31
|
-
ErrorBoundaryHandler,
|
|
32
|
-
ErrorInfo,
|
|
33
|
-
HandlerContext,
|
|
34
|
-
MatchResult,
|
|
35
|
-
ResolvedSegment,
|
|
36
|
-
} from "../types";
|
|
23
|
+
import type { ErrorBoundaryHandler, ErrorInfo, MatchResult } from "../types";
|
|
37
24
|
import type { ReactNode } from "react";
|
|
38
|
-
import type { MatchContext
|
|
25
|
+
import type { MatchContext } from "./match-context.js";
|
|
39
26
|
import type { MatchApiDeps, ActionContext } from "./types.js";
|
|
40
|
-
import
|
|
41
|
-
|
|
42
|
-
|
|
27
|
+
import {
|
|
28
|
+
getRequestContext,
|
|
29
|
+
setRequestContextPrevRouteKey,
|
|
30
|
+
} from "../server/request-context.js";
|
|
31
|
+
import { isAutoGeneratedRouteName } from "../route-name.js";
|
|
32
|
+
import type { DefaultRouteName } from "../types/global-namespace.js";
|
|
43
33
|
import { debugLog, debugWarn } from "./logging.js";
|
|
34
|
+
import {
|
|
35
|
+
resolveRoute,
|
|
36
|
+
ensureFullRouteSnapshot,
|
|
37
|
+
type RouteSnapshot,
|
|
38
|
+
} from "./route-snapshot.js";
|
|
39
|
+
import { resolveNavigation } from "./navigation-snapshot.js";
|
|
44
40
|
|
|
45
41
|
/**
|
|
46
42
|
* Create match context for full requests (document/SSR).
|
|
@@ -56,61 +52,46 @@ export async function createMatchContextForFull<TEnv>(
|
|
|
56
52
|
|
|
57
53
|
const metricsStore = deps.getMetricsStore();
|
|
58
54
|
|
|
59
|
-
const
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
duration: performance.now() - routeMatchStart,
|
|
65
|
-
startTime: routeMatchStart - metricsStore.requestStart,
|
|
66
|
-
});
|
|
67
|
-
}
|
|
55
|
+
const result = await resolveRoute<TEnv>(pathname, {
|
|
56
|
+
findMatch: (p) => deps.findMatch(p, metricsStore),
|
|
57
|
+
metricsStore,
|
|
58
|
+
isSSR: true,
|
|
59
|
+
});
|
|
68
60
|
|
|
69
|
-
if (!
|
|
61
|
+
if (!result) {
|
|
70
62
|
throw new RouteNotFoundError(`No route matched for ${pathname}`, {
|
|
71
63
|
cause: { pathname, method: request.method },
|
|
72
64
|
});
|
|
73
65
|
}
|
|
74
66
|
|
|
75
|
-
if (
|
|
67
|
+
if (result.type === "redirect") {
|
|
76
68
|
return {
|
|
77
69
|
type: "redirect",
|
|
78
|
-
redirectUrl:
|
|
70
|
+
redirectUrl: result.redirectTo + url.search,
|
|
79
71
|
};
|
|
80
72
|
}
|
|
81
73
|
|
|
82
|
-
const
|
|
83
|
-
const manifestEntry = await loadManifest(
|
|
84
|
-
matched.entry,
|
|
85
|
-
matched.routeKey,
|
|
86
|
-
pathname,
|
|
87
|
-
metricsStore,
|
|
88
|
-
true,
|
|
89
|
-
);
|
|
90
|
-
if (metricsStore) {
|
|
91
|
-
metricsStore.metrics.push({
|
|
92
|
-
label: "manifest-loading",
|
|
93
|
-
duration: performance.now() - manifestStart,
|
|
94
|
-
startTime: manifestStart - metricsStore.requestStart,
|
|
95
|
-
});
|
|
96
|
-
}
|
|
74
|
+
const snapshot = result.snapshot;
|
|
97
75
|
|
|
98
|
-
const
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
76
|
+
const { matched } = snapshot;
|
|
77
|
+
|
|
78
|
+
if (snapshot.isPassthrough) {
|
|
79
|
+
matched.pt = true;
|
|
80
|
+
}
|
|
102
81
|
|
|
103
|
-
const
|
|
82
|
+
const cleanUrl = stripInternalParams(url);
|
|
104
83
|
|
|
105
84
|
const handlerContext = createHandlerContext(
|
|
106
85
|
matched.params,
|
|
107
86
|
request,
|
|
108
|
-
|
|
87
|
+
cleanUrl.searchParams,
|
|
109
88
|
pathname,
|
|
110
|
-
|
|
111
|
-
|
|
89
|
+
cleanUrl,
|
|
90
|
+
env,
|
|
112
91
|
deps.getRouteMap(),
|
|
113
92
|
matched.routeKey,
|
|
93
|
+
matched.responseType,
|
|
94
|
+
matched.pt === true,
|
|
114
95
|
);
|
|
115
96
|
|
|
116
97
|
const loaderPromises = new Map<string, Promise<any>>();
|
|
@@ -128,33 +109,22 @@ export async function createMatchContextForFull<TEnv>(
|
|
|
128
109
|
Store.metrics = metricsStore;
|
|
129
110
|
}
|
|
130
111
|
|
|
131
|
-
const entries = [...traverseBack(manifestEntry)];
|
|
132
|
-
let cacheScope: CacheScope | null = null;
|
|
133
|
-
for (const entry of entries) {
|
|
134
|
-
if (entry.cache) {
|
|
135
|
-
cacheScope = createCacheScope(entry.cache, cacheScope);
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
|
|
139
112
|
return {
|
|
140
113
|
request,
|
|
141
|
-
url,
|
|
114
|
+
url: cleanUrl,
|
|
142
115
|
pathname,
|
|
143
116
|
env,
|
|
144
|
-
bindings,
|
|
145
117
|
clientSegmentIds: [],
|
|
146
118
|
clientSegmentSet: new Set(),
|
|
147
119
|
stale: false,
|
|
148
|
-
prevUrl:
|
|
120
|
+
prevUrl: cleanUrl,
|
|
149
121
|
prevParams: {},
|
|
150
122
|
prevMatch: null,
|
|
151
123
|
matched,
|
|
152
|
-
manifestEntry,
|
|
153
|
-
entries,
|
|
124
|
+
manifestEntry: snapshot.manifestEntry,
|
|
125
|
+
entries: snapshot.entries,
|
|
154
126
|
routeKey: matched.routeKey,
|
|
155
|
-
localRouteName:
|
|
156
|
-
? matched.routeKey.split(".").pop()!
|
|
157
|
-
: matched.routeKey,
|
|
127
|
+
localRouteName: snapshot.localRouteName,
|
|
158
128
|
handlerContext,
|
|
159
129
|
loaderPromises,
|
|
160
130
|
routeMap: deps.getRouteMap(),
|
|
@@ -162,20 +132,24 @@ export async function createMatchContextForFull<TEnv>(
|
|
|
162
132
|
Store,
|
|
163
133
|
interceptContextMatch: null,
|
|
164
134
|
interceptSelectorContext: {
|
|
165
|
-
from:
|
|
166
|
-
to:
|
|
135
|
+
from: cleanUrl,
|
|
136
|
+
to: cleanUrl,
|
|
167
137
|
params: matched.params,
|
|
168
138
|
request,
|
|
169
139
|
env,
|
|
170
140
|
segments: { path: [], ids: [] },
|
|
141
|
+
toRouteName:
|
|
142
|
+
matched.routeKey && !isAutoGeneratedRouteName(matched.routeKey)
|
|
143
|
+
? (matched.routeKey as DefaultRouteName)
|
|
144
|
+
: undefined,
|
|
171
145
|
},
|
|
172
146
|
isSameRouteNavigation: false,
|
|
173
147
|
interceptResult: null,
|
|
174
|
-
cacheScope,
|
|
148
|
+
cacheScope: snapshot.cacheScope,
|
|
175
149
|
isIntercept: false,
|
|
176
150
|
actionContext: undefined,
|
|
177
151
|
isAction: false,
|
|
178
|
-
routeMiddleware,
|
|
152
|
+
routeMiddleware: snapshot.routeMiddleware,
|
|
179
153
|
isFullMatch: true,
|
|
180
154
|
};
|
|
181
155
|
}
|
|
@@ -193,103 +167,99 @@ export async function createMatchContextForPartial<TEnv>(
|
|
|
193
167
|
const url = new URL(request.url);
|
|
194
168
|
const pathname = url.pathname;
|
|
195
169
|
|
|
196
|
-
const requestStartTime = performance.now();
|
|
197
170
|
const metricsStore = deps.getMetricsStore();
|
|
198
171
|
|
|
199
|
-
const
|
|
200
|
-
url.searchParams.get("_rsc_segments")?.split(",").filter(Boolean) || [];
|
|
201
|
-
const stale = url.searchParams.get("_rsc_stale") === "true";
|
|
202
|
-
const previousUrl =
|
|
203
|
-
request.headers.get("X-RSC-Router-Client-Path") ||
|
|
204
|
-
request.headers.get("Referer");
|
|
205
|
-
const interceptSourceUrl = request.headers.get(
|
|
206
|
-
"X-RSC-Router-Intercept-Source",
|
|
207
|
-
);
|
|
172
|
+
const isHmr = !!request.headers.get("X-RSC-HMR");
|
|
208
173
|
|
|
209
174
|
// HMR: clear manifest cache so stale handler references are discarded
|
|
210
|
-
if (
|
|
175
|
+
if (isHmr) {
|
|
211
176
|
clearManifestCache();
|
|
212
177
|
}
|
|
213
178
|
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
179
|
+
// Reuse the classified snapshot when available and not invalidated by HMR.
|
|
180
|
+
// classifyRequest already called resolveRoute(lite) with isSSR=false, which
|
|
181
|
+
// matches the partial path. On HMR, discard to pick up manifest changes.
|
|
182
|
+
const classifiedRoute = isHmr
|
|
183
|
+
? undefined
|
|
184
|
+
: getRequestContext()?._classifiedRoute;
|
|
185
|
+
|
|
186
|
+
// Time route matching. On the reuse path, only nav findMatch calls are new
|
|
187
|
+
// (current-route findMatch and manifest-loading were already timed during
|
|
188
|
+
// classifyRequest via its metricsStore). On the fresh path, all findMatch
|
|
189
|
+
// calls are measured together.
|
|
190
|
+
const routeMatchStart = metricsStore ? performance.now() : 0;
|
|
217
191
|
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
192
|
+
let snapshot: RouteSnapshot<TEnv>;
|
|
193
|
+
if (classifiedRoute && classifiedRoute.manifestEntry) {
|
|
194
|
+
snapshot = ensureFullRouteSnapshot(classifiedRoute);
|
|
195
|
+
} else {
|
|
196
|
+
const result = await resolveRoute<TEnv>(pathname, {
|
|
197
|
+
findMatch: (p) => deps.findMatch(p, metricsStore),
|
|
198
|
+
metricsStore,
|
|
199
|
+
isSSR: false,
|
|
200
|
+
skipRouteMatchMetric: true,
|
|
201
|
+
});
|
|
222
202
|
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
: prevMatch;
|
|
203
|
+
if (!result) {
|
|
204
|
+
throw new RouteNotFoundError(`No route matched for ${pathname}`, {
|
|
205
|
+
cause: { pathname, method: request.method },
|
|
206
|
+
});
|
|
207
|
+
}
|
|
229
208
|
|
|
230
|
-
|
|
209
|
+
if (result.type === "redirect") {
|
|
210
|
+
return null;
|
|
211
|
+
}
|
|
231
212
|
|
|
232
|
-
|
|
233
|
-
metricsStore.metrics.push({
|
|
234
|
-
label: "route-matching",
|
|
235
|
-
duration: performance.now() - routeMatchStart,
|
|
236
|
-
startTime: routeMatchStart - metricsStore.requestStart,
|
|
237
|
-
});
|
|
213
|
+
snapshot = result.snapshot;
|
|
238
214
|
}
|
|
239
215
|
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
216
|
+
const { matched } = snapshot;
|
|
217
|
+
|
|
218
|
+
// Backward compat: downstream middleware reads matched.pt
|
|
219
|
+
if (snapshot.isPassthrough) {
|
|
220
|
+
matched.pt = true;
|
|
244
221
|
}
|
|
245
222
|
|
|
246
|
-
|
|
223
|
+
const nav = await resolveNavigation(request, url, matched.routeKey, {
|
|
224
|
+
findMatch: deps.findMatch,
|
|
225
|
+
});
|
|
226
|
+
if (!nav) {
|
|
247
227
|
return null;
|
|
248
228
|
}
|
|
249
229
|
|
|
250
|
-
if (
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
230
|
+
if (metricsStore) {
|
|
231
|
+
const isReuse = !!classifiedRoute;
|
|
232
|
+
metricsStore.metrics.push({
|
|
233
|
+
label: isReuse ? "route-matching:nav" : "route-matching",
|
|
234
|
+
duration: performance.now() - routeMatchStart,
|
|
235
|
+
startTime: routeMatchStart - metricsStore.requestStart,
|
|
254
236
|
});
|
|
255
237
|
}
|
|
256
238
|
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
pathname,
|
|
262
|
-
metricsStore,
|
|
263
|
-
false,
|
|
264
|
-
);
|
|
265
|
-
if (metricsStore) {
|
|
266
|
-
metricsStore.metrics.push({
|
|
267
|
-
label: "manifest-loading",
|
|
268
|
-
duration: performance.now() - manifestStart,
|
|
269
|
-
startTime: manifestStart - metricsStore.requestStart,
|
|
239
|
+
if (nav.prevMatch && nav.prevMatch.entry !== matched.entry && !matched.pr) {
|
|
240
|
+
debugLog("matchPartial", "route group changed", {
|
|
241
|
+
from: nav.prevMatch.routeKey,
|
|
242
|
+
to: matched.routeKey,
|
|
270
243
|
});
|
|
271
244
|
}
|
|
272
245
|
|
|
273
|
-
const
|
|
274
|
-
traverseBack(manifestEntry),
|
|
275
|
-
matched.params,
|
|
276
|
-
);
|
|
246
|
+
const cleanUrl = stripInternalParams(url);
|
|
277
247
|
|
|
278
|
-
const bindings = (env as any)?.Bindings ?? env;
|
|
279
248
|
const handlerContext = createHandlerContext(
|
|
280
249
|
matched.params,
|
|
281
250
|
request,
|
|
282
|
-
|
|
251
|
+
cleanUrl.searchParams,
|
|
283
252
|
pathname,
|
|
284
|
-
|
|
285
|
-
|
|
253
|
+
cleanUrl,
|
|
254
|
+
env,
|
|
286
255
|
deps.getRouteMap(),
|
|
287
256
|
matched.routeKey,
|
|
257
|
+
matched.responseType,
|
|
258
|
+
matched.pt === true,
|
|
288
259
|
);
|
|
289
260
|
|
|
290
|
-
const clientSegmentSet = new Set(clientSegmentIds);
|
|
291
261
|
debugLog("matchPartial", "client segments", {
|
|
292
|
-
segments: Array.from(clientSegmentSet),
|
|
262
|
+
segments: Array.from(nav.clientSegmentSet),
|
|
293
263
|
});
|
|
294
264
|
|
|
295
265
|
const loaderPromises = new Map<string, Promise<any>>();
|
|
@@ -307,117 +277,113 @@ export async function createMatchContextForPartial<TEnv>(
|
|
|
307
277
|
Store.metrics = metricsStore;
|
|
308
278
|
}
|
|
309
279
|
|
|
310
|
-
|
|
311
|
-
interceptContextMatch &&
|
|
312
|
-
interceptContextMatch.routeKey === matched.routeKey
|
|
313
|
-
);
|
|
314
|
-
|
|
315
|
-
if (interceptSourceUrl) {
|
|
280
|
+
if (nav.hasInterceptSource) {
|
|
316
281
|
debugLog("matchPartial.intercept", "intercept context detected", {
|
|
317
282
|
currentUrl: pathname,
|
|
318
|
-
interceptSource:
|
|
319
|
-
contextRoute: interceptContextMatch?.routeKey,
|
|
283
|
+
interceptSource: nav.interceptContextUrl.href,
|
|
284
|
+
contextRoute: nav.interceptContextMatch?.routeKey,
|
|
320
285
|
currentRoute: matched.routeKey,
|
|
321
|
-
sameRouteNavigation: isSameRouteNavigation,
|
|
286
|
+
sameRouteNavigation: nav.isSameRouteNavigation,
|
|
322
287
|
});
|
|
323
288
|
}
|
|
324
289
|
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
290
|
+
setRequestContextPrevRouteKey(
|
|
291
|
+
nav.effectiveFromMatch?.routeKey,
|
|
292
|
+
nav.effectiveFromUrl,
|
|
293
|
+
nav.effectiveFromMatch?.params ?? nav.prevParams,
|
|
294
|
+
);
|
|
328
295
|
|
|
329
|
-
const filteredSegmentIds = clientSegmentIds.filter((id) => {
|
|
330
|
-
if (id.includes(".@")) return false;
|
|
331
|
-
if (/D\d+\./.test(id)) return false;
|
|
332
|
-
return true;
|
|
333
|
-
});
|
|
334
296
|
const interceptSelectorContext: InterceptSelectorContext = {
|
|
335
|
-
from:
|
|
336
|
-
to:
|
|
297
|
+
from: nav.effectiveFromUrl,
|
|
298
|
+
to: cleanUrl,
|
|
337
299
|
params: matched.params,
|
|
338
300
|
request,
|
|
339
301
|
env,
|
|
340
302
|
segments: {
|
|
341
|
-
path:
|
|
342
|
-
ids: filteredSegmentIds,
|
|
303
|
+
path: nav.effectiveFromUrl.pathname.split("/").filter(Boolean),
|
|
304
|
+
ids: nav.filteredSegmentIds,
|
|
343
305
|
},
|
|
306
|
+
fromRouteName:
|
|
307
|
+
nav.effectiveFromMatch?.routeKey &&
|
|
308
|
+
!isAutoGeneratedRouteName(nav.effectiveFromMatch.routeKey)
|
|
309
|
+
? (nav.effectiveFromMatch.routeKey as DefaultRouteName)
|
|
310
|
+
: undefined,
|
|
311
|
+
toRouteName:
|
|
312
|
+
matched.routeKey && !isAutoGeneratedRouteName(matched.routeKey)
|
|
313
|
+
? (matched.routeKey as DefaultRouteName)
|
|
314
|
+
: undefined,
|
|
344
315
|
};
|
|
345
316
|
const isAction = !!actionContext;
|
|
346
317
|
|
|
347
|
-
const clientHasInterceptSegments = [...clientSegmentSet].some((id) =>
|
|
318
|
+
const clientHasInterceptSegments = [...nav.clientSegmentSet].some((id) =>
|
|
348
319
|
id.includes(".@"),
|
|
349
320
|
);
|
|
350
321
|
const skipInterceptForAction = isAction && !clientHasInterceptSegments;
|
|
351
322
|
const interceptResult =
|
|
352
|
-
isSameRouteNavigation || skipInterceptForAction
|
|
323
|
+
nav.isSameRouteNavigation || skipInterceptForAction
|
|
353
324
|
? null
|
|
354
325
|
: findInterceptForRoute(
|
|
355
326
|
matched.routeKey,
|
|
356
|
-
manifestEntry.parent,
|
|
327
|
+
snapshot.manifestEntry.parent,
|
|
357
328
|
interceptSelectorContext,
|
|
358
329
|
isAction,
|
|
359
330
|
) ||
|
|
360
|
-
(localRouteName !== matched.routeKey
|
|
331
|
+
(snapshot.localRouteName !== matched.routeKey
|
|
361
332
|
? findInterceptForRoute(
|
|
362
|
-
localRouteName,
|
|
363
|
-
manifestEntry.parent,
|
|
333
|
+
snapshot.localRouteName,
|
|
334
|
+
snapshot.manifestEntry.parent,
|
|
364
335
|
interceptSelectorContext,
|
|
365
336
|
isAction,
|
|
366
337
|
)
|
|
367
338
|
: null);
|
|
368
339
|
|
|
340
|
+
// Make a mutable copy of clientSegmentSet so we can delete entries
|
|
341
|
+
// for same-route navigation forcing
|
|
342
|
+
const clientSegmentSet = new Set(nav.clientSegmentSet);
|
|
343
|
+
|
|
369
344
|
if (
|
|
370
|
-
isSameRouteNavigation &&
|
|
371
|
-
manifestEntry.type === "route" &&
|
|
372
|
-
|
|
345
|
+
nav.isSameRouteNavigation &&
|
|
346
|
+
snapshot.manifestEntry.type === "route" &&
|
|
347
|
+
nav.hasInterceptSource
|
|
373
348
|
) {
|
|
374
349
|
debugLog("matchPartial.intercept", "forcing route segment render", {
|
|
375
|
-
segmentId: manifestEntry.shortCode,
|
|
350
|
+
segmentId: snapshot.manifestEntry.shortCode,
|
|
376
351
|
});
|
|
377
|
-
clientSegmentSet.delete(manifestEntry.shortCode);
|
|
378
|
-
}
|
|
379
|
-
|
|
380
|
-
const entries = [...traverseBack(manifestEntry)];
|
|
381
|
-
let cacheScope: CacheScope | null = null;
|
|
382
|
-
for (const entry of entries) {
|
|
383
|
-
if (entry.cache) {
|
|
384
|
-
cacheScope = createCacheScope(entry.cache, cacheScope);
|
|
385
|
-
}
|
|
352
|
+
clientSegmentSet.delete(snapshot.manifestEntry.shortCode);
|
|
386
353
|
}
|
|
387
354
|
|
|
388
355
|
const isIntercept = !!interceptResult;
|
|
389
356
|
|
|
390
357
|
return {
|
|
391
358
|
request,
|
|
392
|
-
url,
|
|
359
|
+
url: cleanUrl,
|
|
393
360
|
pathname,
|
|
394
361
|
env,
|
|
395
|
-
|
|
396
|
-
clientSegmentIds,
|
|
362
|
+
clientSegmentIds: nav.clientSegmentIds,
|
|
397
363
|
clientSegmentSet,
|
|
398
|
-
stale,
|
|
399
|
-
prevUrl,
|
|
400
|
-
prevParams,
|
|
401
|
-
prevMatch,
|
|
364
|
+
stale: nav.stale,
|
|
365
|
+
prevUrl: nav.prevUrl,
|
|
366
|
+
prevParams: nav.prevParams,
|
|
367
|
+
prevMatch: nav.prevMatch,
|
|
402
368
|
matched,
|
|
403
|
-
manifestEntry,
|
|
404
|
-
entries,
|
|
369
|
+
manifestEntry: snapshot.manifestEntry,
|
|
370
|
+
entries: snapshot.entries,
|
|
405
371
|
routeKey: matched.routeKey,
|
|
406
|
-
localRouteName,
|
|
372
|
+
localRouteName: snapshot.localRouteName,
|
|
407
373
|
handlerContext,
|
|
408
374
|
loaderPromises,
|
|
409
375
|
routeMap: deps.getRouteMap(),
|
|
410
376
|
metricsStore,
|
|
411
377
|
Store,
|
|
412
|
-
interceptContextMatch,
|
|
378
|
+
interceptContextMatch: nav.interceptContextMatch,
|
|
413
379
|
interceptSelectorContext,
|
|
414
|
-
isSameRouteNavigation,
|
|
380
|
+
isSameRouteNavigation: nav.isSameRouteNavigation,
|
|
415
381
|
interceptResult,
|
|
416
|
-
cacheScope,
|
|
382
|
+
cacheScope: snapshot.cacheScope,
|
|
417
383
|
isIntercept,
|
|
418
384
|
actionContext,
|
|
419
385
|
isAction,
|
|
420
|
-
routeMiddleware,
|
|
386
|
+
routeMiddleware: snapshot.routeMiddleware,
|
|
421
387
|
isFullMatch: false,
|
|
422
388
|
};
|
|
423
389
|
}
|
|
@@ -438,7 +404,7 @@ export async function matchError<TEnv>(
|
|
|
438
404
|
|
|
439
405
|
debugLog("matchError", "matching error", { pathname });
|
|
440
406
|
|
|
441
|
-
const matched = deps.findMatch(pathname);
|
|
407
|
+
const matched = await deps.findMatch(pathname);
|
|
442
408
|
if (!matched) {
|
|
443
409
|
debugWarn("matchError", "no route matched", { pathname });
|
|
444
410
|
return null;
|
|
@@ -544,10 +510,7 @@ export async function matchError<TEnv>(
|
|
|
544
510
|
|
|
545
511
|
const reqCtx = getRequestContext();
|
|
546
512
|
if (reqCtx) {
|
|
547
|
-
reqCtx.
|
|
548
|
-
status: 500,
|
|
549
|
-
headers: reqCtx.res.headers,
|
|
550
|
-
});
|
|
513
|
+
reqCtx._setStatus(500);
|
|
551
514
|
}
|
|
552
515
|
|
|
553
516
|
const effectiveFallback = fallback || DefaultErrorFallback;
|
|
@@ -571,49 +534,7 @@ export async function matchError<TEnv>(
|
|
|
571
534
|
segments: [errorSegment],
|
|
572
535
|
matched: matchedIds,
|
|
573
536
|
diff: [errorSegment.id],
|
|
537
|
+
resolvedIds: [errorSegment.id],
|
|
574
538
|
params: matched.params,
|
|
575
539
|
};
|
|
576
540
|
}
|
|
577
|
-
|
|
578
|
-
/**
|
|
579
|
-
* Preview match - returns route middleware without segment resolution.
|
|
580
|
-
*/
|
|
581
|
-
export async function previewMatch<TEnv>(
|
|
582
|
-
request: Request,
|
|
583
|
-
context: TEnv,
|
|
584
|
-
deps: MatchApiDeps<TEnv>,
|
|
585
|
-
): Promise<{
|
|
586
|
-
routeMiddleware?: Array<{
|
|
587
|
-
handler: import("./middleware.js").MiddlewareFn;
|
|
588
|
-
params: Record<string, string>;
|
|
589
|
-
}>;
|
|
590
|
-
} | null> {
|
|
591
|
-
const url = new URL(request.url);
|
|
592
|
-
const pathname = url.pathname;
|
|
593
|
-
|
|
594
|
-
const matched = deps.findMatch(pathname);
|
|
595
|
-
if (!matched) {
|
|
596
|
-
return null;
|
|
597
|
-
}
|
|
598
|
-
|
|
599
|
-
if (matched.redirectTo) {
|
|
600
|
-
return { routeMiddleware: undefined };
|
|
601
|
-
}
|
|
602
|
-
|
|
603
|
-
const manifestEntry = await loadManifest(
|
|
604
|
-
matched.entry,
|
|
605
|
-
matched.routeKey,
|
|
606
|
-
pathname,
|
|
607
|
-
undefined,
|
|
608
|
-
false,
|
|
609
|
-
);
|
|
610
|
-
|
|
611
|
-
const routeMiddleware = collectRouteMiddleware(
|
|
612
|
-
traverseBack(manifestEntry),
|
|
613
|
-
matched.params,
|
|
614
|
-
);
|
|
615
|
-
|
|
616
|
-
return {
|
|
617
|
-
routeMiddleware: routeMiddleware.length > 0 ? routeMiddleware : undefined,
|
|
618
|
-
};
|
|
619
|
-
}
|
|
@@ -45,7 +45,7 @@
|
|
|
45
45
|
* - request, url, pathname: The incoming HTTP request
|
|
46
46
|
*
|
|
47
47
|
* Environment:
|
|
48
|
-
* - env
|
|
48
|
+
* - env: Server environment (Cloudflare bindings, etc.)
|
|
49
49
|
*
|
|
50
50
|
* Client State (from RSC request headers):
|
|
51
51
|
* - clientSegmentIds: Segments the client currently has
|
|
@@ -140,7 +140,6 @@ export interface MatchContext<TEnv = any> {
|
|
|
140
140
|
|
|
141
141
|
// Environment
|
|
142
142
|
env: TEnv;
|
|
143
|
-
bindings: TEnv;
|
|
144
143
|
|
|
145
144
|
// Client state
|
|
146
145
|
clientSegmentIds: string[];
|
|
@@ -211,6 +210,9 @@ export interface MatchPipelineState {
|
|
|
211
210
|
// Whether cache should be revalidated (SWR)
|
|
212
211
|
shouldRevalidate?: boolean;
|
|
213
212
|
|
|
213
|
+
// Source of cache hit ("runtime" or "prerender")
|
|
214
|
+
cacheSource?: "runtime" | "prerender";
|
|
215
|
+
|
|
214
216
|
// Resolved segments from pipeline
|
|
215
217
|
segments: ResolvedSegment[];
|
|
216
218
|
matchedIds: string[];
|
|
@@ -240,25 +242,3 @@ export function createPipelineState(): MatchPipelineState {
|
|
|
240
242
|
slots: {},
|
|
241
243
|
};
|
|
242
244
|
}
|
|
243
|
-
|
|
244
|
-
/**
|
|
245
|
-
* Input parameters for createMatchContext
|
|
246
|
-
*/
|
|
247
|
-
export interface CreateMatchContextInput<TEnv = any> {
|
|
248
|
-
request: Request;
|
|
249
|
-
env: TEnv;
|
|
250
|
-
actionContext?: ActionContext;
|
|
251
|
-
}
|
|
252
|
-
|
|
253
|
-
/**
|
|
254
|
-
* Result from createMatchContext - either a context or null (fall back to full match)
|
|
255
|
-
*/
|
|
256
|
-
export type CreateMatchContextResult<TEnv = any> =
|
|
257
|
-
| { type: "context"; ctx: MatchContext<TEnv> }
|
|
258
|
-
| { type: "fallback"; reason: string }
|
|
259
|
-
| { type: "error"; error: Error };
|
|
260
|
-
|
|
261
|
-
// Note: createMatchContext() will be implemented in Step J10 when we wire everything together.
|
|
262
|
-
// It requires access to RouterContext (findMatch, loadManifest, etc.) which are closure
|
|
263
|
-
// functions from createRouter(). The implementation will live in router.ts initially
|
|
264
|
-
// and call getRouterContext() to access these dependencies.
|