@rangojs/router 0.5.1 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -1
- package/dist/bin/rango.js +343 -125
- package/dist/types/browser/event-controller.d.ts +6 -0
- package/dist/types/browser/react/use-router.d.ts +10 -3
- package/dist/types/browser/react/use-search-params.d.ts +57 -10
- package/dist/types/browser/types.d.ts +22 -0
- package/dist/types/build/merge-full-manifests.d.ts +3 -0
- package/dist/types/build/route-trie.d.ts +4 -73
- package/dist/types/build/route-types/per-module-writer.d.ts +6 -4
- package/dist/types/build/route-types/router-processing.d.ts +2 -3
- package/dist/types/cache/cache-exec-scope.d.ts +31 -0
- package/dist/types/cache/cf/cf-cache-constants.d.ts +8 -1
- package/dist/types/cache/cf/cf-cache-store.d.ts +15 -1
- package/dist/types/cache/cf/cf-cache-types.d.ts +1 -1
- package/dist/types/cache/cf/cf-kv-utils.d.ts +21 -0
- package/dist/types/cache/taint.d.ts +12 -6
- package/dist/types/client-urls/client-root.d.ts +38 -0
- package/dist/types/client-urls/client-urls.d.ts +5 -0
- package/dist/types/client-urls/navigation.d.ts +38 -0
- package/dist/types/client-urls/revalidation-protocol.d.ts +25 -0
- package/dist/types/client-urls/server-projection.d.ts +62 -0
- package/dist/types/client-urls/types.d.ts +144 -0
- package/dist/types/client.d.ts +12 -4
- package/dist/types/client.rsc.d.ts +4 -1
- package/dist/types/decode-loader-results.d.ts +37 -0
- package/dist/types/errors.d.ts +1 -0
- package/dist/types/handles/is-thenable.d.ts +2 -4
- package/dist/types/index.d.ts +1 -1
- package/dist/types/loader-redirect.d.ts +27 -0
- package/dist/types/outlet-context.d.ts +12 -0
- package/dist/types/outlet-provider.d.ts +3 -1
- package/dist/types/redirect-origin.d.ts +4 -0
- package/dist/types/route-content-wrapper.d.ts +42 -1
- package/dist/types/route-definition/helpers-types.d.ts +13 -2
- package/dist/types/router/error-handling.d.ts +35 -1
- package/dist/types/router/intercept-resolution.d.ts +12 -0
- package/dist/types/router/loader-resolution.d.ts +24 -2
- package/dist/types/router/revalidation.d.ts +7 -0
- package/dist/{types.backup/build/route-trie.d.ts → types/router/route-trie-builder.d.ts} +4 -16
- package/dist/types/router/router-interfaces.d.ts +20 -0
- package/dist/types/router/segment-resolution/helpers.d.ts +1 -1
- package/dist/types/router/trie-matching.d.ts +1 -1
- package/dist/types/rsc/helpers.d.ts +3 -0
- package/dist/types/rsc/manifest-init.d.ts +5 -5
- package/dist/types/rsc/render-pipeline.d.ts +9 -0
- package/dist/types/rsc/routine-plan.d.ts +124 -0
- package/dist/types/rsc/shell-capture-constants.d.ts +17 -0
- package/dist/types/rsc/shell-capture.d.ts +9 -0
- package/dist/types/rsc/shell-serve.d.ts +11 -0
- package/dist/types/rsc/types.d.ts +30 -0
- package/dist/types/segment-system.d.ts +2 -0
- package/dist/types/server/context.d.ts +10 -0
- package/dist/types/server/handle-store.d.ts +34 -3
- package/dist/types/server/request-context.d.ts +14 -1
- package/dist/types/server.d.ts +1 -0
- package/dist/types/ssr/index.d.ts +22 -0
- package/dist/types/ssr/ssr-root.d.ts +10 -0
- package/dist/types/testing/dom.entry.d.ts +1 -1
- package/dist/types/testing/render-route.d.ts +16 -6
- package/dist/types/testing/run-loader.d.ts +9 -0
- package/dist/types/types/boundaries.d.ts +22 -0
- package/dist/types/types/index.d.ts +1 -1
- package/dist/types/types/loader-types.d.ts +57 -5
- package/dist/types/types/segments.d.ts +7 -0
- package/dist/types/urls/path-helper-types.d.ts +10 -4
- package/dist/types/vite/discovery/client-urls-projection.d.ts +53 -0
- package/dist/types/vite/discovery/discover-routers.d.ts +1 -1
- package/dist/types/vite/discovery/state.d.ts +8 -1
- package/dist/types/vite/encryption-key.d.ts +2 -0
- package/dist/types/vite/plugins/expose-internal-ids.d.ts +10 -0
- package/dist/types/vite/plugins/server-ref-hashing.d.ts +24 -0
- package/dist/types/vite/plugins/server-reference-pattern.d.ts +1 -0
- package/dist/types/vite/utils/shared-utils.d.ts +12 -0
- package/dist/vite/index.js +5101 -2056
- package/package.json +3 -3
- package/skills/breadcrumbs/SKILL.md +39 -9
- package/skills/caching/SKILL.md +1 -1
- package/skills/catalog.json +7 -1
- package/skills/client-urls/SKILL.md +338 -0
- package/skills/comparison/references/framework-comparison.md +23 -9
- package/skills/hooks/SKILL.md +2 -2
- package/skills/hooks/data.md +11 -2
- package/skills/hooks/handle-and-actions.md +7 -0
- package/skills/hooks/outlets.md +26 -5
- package/skills/hooks/urls.md +40 -3
- package/skills/loader/SKILL.md +132 -20
- package/skills/migrate-nextjs/SKILL.md +70 -10
- package/skills/migrate-react-router/SKILL.md +49 -13
- package/skills/migrate-react-router/component-migration.md +18 -13
- package/skills/migrate-react-router/data-and-actions.md +14 -3
- package/skills/migrate-react-router/route-mapping.md +15 -2
- package/skills/mime-routes/SKILL.md +3 -1
- package/skills/parallel/SKILL.md +32 -1
- package/skills/ppr/SKILL.md +16 -6
- package/skills/prerender/SKILL.md +8 -4
- package/skills/rango/SKILL.md +21 -17
- package/skills/react-compiler/SKILL.md +3 -3
- package/skills/response-routes/SKILL.md +4 -2
- package/skills/route/SKILL.md +5 -2
- package/skills/router-setup/SKILL.md +16 -2
- package/skills/scripts/SKILL.md +16 -6
- package/skills/shell-manifest/SKILL.md +16 -7
- package/skills/testing/SKILL.md +2 -2
- package/skills/testing/client-components.md +6 -0
- package/skills/testing/handles.md +30 -8
- package/skills/testing/loader.md +51 -49
- package/skills/testing/middleware.md +1 -1
- package/skills/theme/SKILL.md +8 -5
- package/skills/typesafety/generated-files-and-cli.md +16 -9
- package/skills/typesafety/route-types.md +5 -1
- package/skills/use-cache/SKILL.md +47 -0
- package/src/bin/rango.ts +7 -3
- package/src/browser/event-controller.ts +40 -15
- package/src/browser/navigation-bridge.ts +6 -0
- package/src/browser/navigation-client.ts +5 -0
- package/src/browser/partial-update.ts +77 -10
- package/src/browser/react/NavigationProvider.tsx +7 -0
- package/src/browser/react/use-router.ts +40 -11
- package/src/browser/react/use-search-params.ts +140 -17
- package/src/browser/rsc-router.tsx +59 -0
- package/src/browser/server-action-bridge.ts +26 -0
- package/src/browser/types.ts +22 -0
- package/src/build/merge-full-manifests.ts +161 -0
- package/src/build/route-trie.ts +9 -332
- package/src/build/route-types/include-resolution.ts +66 -11
- package/src/build/route-types/per-module-writer.ts +11 -6
- package/src/build/route-types/router-processing.ts +184 -153
- package/src/build/runtime-discovery.ts +23 -12
- package/src/cache/cache-exec-scope.ts +47 -0
- package/src/cache/cache-runtime.ts +113 -40
- package/src/cache/cf/cf-cache-constants.ts +8 -1
- package/src/cache/cf/cf-cache-store.ts +41 -64
- package/src/cache/cf/cf-cache-types.ts +1 -1
- package/src/cache/cf/cf-kv-utils.ts +38 -0
- package/src/cache/segment-codec.ts +21 -5
- package/src/cache/taint.ts +28 -9
- package/src/client-urls/client-root.tsx +168 -0
- package/src/client-urls/client-urls.ts +698 -0
- package/src/client-urls/navigation.ts +237 -0
- package/src/client-urls/revalidation-protocol.ts +56 -0
- package/src/client-urls/server-projection.ts +579 -0
- package/src/client-urls/types.ts +195 -0
- package/src/client.rsc.tsx +12 -0
- package/src/client.tsx +49 -6
- package/src/decode-loader-results.ts +113 -0
- package/src/errors.ts +14 -0
- package/src/handles/deferred-resolution.ts +14 -7
- package/src/handles/is-thenable.ts +2 -4
- package/src/index.ts +1 -0
- package/src/loader-redirect.tsx +64 -0
- package/src/outlet-context.ts +12 -0
- package/src/outlet-provider.tsx +15 -1
- package/src/redirect-origin.ts +29 -0
- package/src/route-content-wrapper.tsx +96 -3
- package/src/route-definition/dsl-helpers.ts +28 -3
- package/src/route-definition/helpers-types.ts +13 -0
- package/src/route-definition/redirect.ts +17 -18
- package/src/router/error-handling.ts +65 -11
- package/src/router/intercept-resolution.ts +29 -0
- package/src/router/loader-resolution.ts +261 -28
- package/src/router/match-middleware/cache-lookup.ts +24 -15
- package/src/router/match-result.ts +7 -0
- package/src/router/revalidation.ts +24 -11
- package/src/router/route-trie-builder.ts +334 -0
- package/src/router/router-interfaces.ts +38 -0
- package/src/router/segment-resolution/fresh.ts +47 -0
- package/src/router/segment-resolution/helpers.ts +9 -11
- package/src/router/segment-resolution/loader-cache.ts +14 -24
- package/src/router/segment-resolution/revalidation.ts +20 -1
- package/src/router/trie-matching.ts +3 -3
- package/src/router.ts +46 -1
- package/src/rsc/full-payload.ts +6 -0
- package/src/rsc/handler.ts +36 -12
- package/src/rsc/helpers.ts +13 -0
- package/src/rsc/loader-fetch.ts +2 -2
- package/src/rsc/manifest-init.ts +28 -9
- package/src/rsc/progressive-enhancement.ts +247 -70
- package/src/rsc/render-pipeline.ts +68 -24
- package/src/rsc/routine-plan.ts +359 -0
- package/src/rsc/rsc-rendering.ts +569 -302
- package/src/rsc/server-action.ts +180 -71
- package/src/rsc/shell-capture-constants.ts +18 -0
- package/src/rsc/shell-capture.ts +104 -21
- package/src/rsc/shell-serve.ts +15 -2
- package/src/rsc/ssr-setup.ts +10 -1
- package/src/rsc/types.ts +31 -2
- package/src/segment-system.tsx +83 -26
- package/src/server/context.ts +10 -0
- package/src/server/cookie-store.ts +19 -19
- package/src/server/handle-store.ts +185 -48
- package/src/server/request-context.ts +36 -6
- package/src/server.ts +7 -0
- package/src/ssr/index.tsx +37 -2
- package/src/ssr/ssr-root.tsx +30 -2
- package/src/testing/dom.entry.ts +1 -1
- package/src/testing/render-route.tsx +22 -8
- package/src/testing/run-loader.ts +51 -13
- package/src/types/boundaries.ts +19 -0
- package/src/types/index.ts +1 -0
- package/src/types/loader-types.ts +60 -5
- package/src/types/segments.ts +7 -0
- package/src/urls/include-helper.ts +22 -4
- package/src/urls/path-helper-types.ts +14 -1
- package/src/use-loader.tsx +67 -6
- package/src/vite/discovery/client-urls-projection.ts +322 -0
- package/src/vite/discovery/discover-routers.ts +43 -17
- package/src/vite/discovery/state.ts +11 -1
- package/src/vite/discovery/virtual-module-codegen.ts +20 -0
- package/src/vite/encryption-key.ts +29 -0
- package/src/vite/plugins/expose-action-id.ts +2 -2
- package/src/vite/plugins/expose-internal-ids.ts +46 -0
- package/src/vite/plugins/server-ref-hashing.ts +74 -0
- package/src/vite/plugins/server-reference-pattern.ts +10 -0
- package/src/vite/plugins/virtual-entries.ts +12 -3
- package/src/vite/rango.ts +9 -0
- package/src/vite/router-discovery.ts +184 -14
- package/src/vite/utils/shared-utils.ts +12 -7
- package/dist/types.backup/__internal.d.ts +0 -127
- package/dist/types.backup/bin/rango.d.ts +0 -1
- package/dist/types.backup/browser/action-coordinator.d.ts +0 -57
- package/dist/types.backup/browser/action-fence.d.ts +0 -33
- package/dist/types.backup/browser/app-shell.d.ts +0 -34
- package/dist/types.backup/browser/app-version.d.ts +0 -6
- package/dist/types.backup/browser/connection-warmup.d.ts +0 -31
- package/dist/types.backup/browser/cookie-name.d.ts +0 -66
- package/dist/types.backup/browser/event-controller.d.ts +0 -221
- package/dist/types.backup/browser/history-state.d.ts +0 -26
- package/dist/types.backup/browser/index.d.ts +0 -1
- package/dist/types.backup/browser/intercept-utils.d.ts +0 -30
- package/dist/types.backup/browser/invalidate-client-cache.d.ts +0 -17
- package/dist/types.backup/browser/link-interceptor.d.ts +0 -43
- package/dist/types.backup/browser/logging.d.ts +0 -33
- package/dist/types.backup/browser/merge-segment-loaders.d.ts +0 -38
- package/dist/types.backup/browser/navigation-bridge.d.ts +0 -27
- package/dist/types.backup/browser/navigation-client.d.ts +0 -17
- package/dist/types.backup/browser/navigation-store-handle.d.ts +0 -25
- package/dist/types.backup/browser/navigation-store.d.ts +0 -95
- package/dist/types.backup/browser/navigation-transaction.d.ts +0 -75
- package/dist/types.backup/browser/network-error-handler.d.ts +0 -35
- package/dist/types.backup/browser/partial-update.d.ts +0 -61
- package/dist/types.backup/browser/prefetch/cache.d.ts +0 -183
- package/dist/types.backup/browser/prefetch/fetch.d.ts +0 -52
- package/dist/types.backup/browser/prefetch/observer.d.ts +0 -27
- package/dist/types.backup/browser/prefetch/policy.d.ts +0 -13
- package/dist/types.backup/browser/prefetch/queue.d.ts +0 -48
- package/dist/types.backup/browser/prefetch/resource-ready.d.ts +0 -28
- package/dist/types.backup/browser/rango-state.d.ts +0 -52
- package/dist/types.backup/browser/react/Link.d.ts +0 -140
- package/dist/types.backup/browser/react/NavigationProvider.d.ts +0 -88
- package/dist/types.backup/browser/react/ScrollRestoration.d.ts +0 -78
- package/dist/types.backup/browser/react/context.d.ts +0 -54
- package/dist/types.backup/browser/react/filter-segment-order.d.ts +0 -35
- package/dist/types.backup/browser/react/index.d.ts +0 -1
- package/dist/types.backup/browser/react/location-state-shared.d.ts +0 -162
- package/dist/types.backup/browser/react/location-state.d.ts +0 -29
- package/dist/types.backup/browser/react/mount-context.d.ts +0 -23
- package/dist/types.backup/browser/react/nonce-context.d.ts +0 -14
- package/dist/types.backup/browser/react/shallow-equal.d.ts +0 -5
- package/dist/types.backup/browser/react/use-action.d.ts +0 -61
- package/dist/types.backup/browser/react/use-handle.d.ts +0 -21
- package/dist/types.backup/browser/react/use-href.d.ts +0 -32
- package/dist/types.backup/browser/react/use-link-status.d.ts +0 -36
- package/dist/types.backup/browser/react/use-mount.d.ts +0 -24
- package/dist/types.backup/browser/react/use-navigation.d.ts +0 -15
- package/dist/types.backup/browser/react/use-params.d.ts +0 -21
- package/dist/types.backup/browser/react/use-pathname.d.ts +0 -13
- package/dist/types.backup/browser/react/use-reverse.d.ts +0 -40
- package/dist/types.backup/browser/react/use-router.d.ts +0 -23
- package/dist/types.backup/browser/react/use-search-params.d.ts +0 -19
- package/dist/types.backup/browser/react/use-segments.d.ts +0 -29
- package/dist/types.backup/browser/response-adapter.d.ts +0 -58
- package/dist/types.backup/browser/rsc-router.d.ts +0 -141
- package/dist/types.backup/browser/scroll-restoration.d.ts +0 -103
- package/dist/types.backup/browser/segment-reconciler.d.ts +0 -74
- package/dist/types.backup/browser/segment-structure-assert.d.ts +0 -16
- package/dist/types.backup/browser/server-action-bridge.d.ts +0 -29
- package/dist/types.backup/browser/types.d.ts +0 -530
- package/dist/types.backup/browser/validate-redirect-origin.d.ts +0 -28
- package/dist/types.backup/build/collect-fallback-refs.d.ts +0 -5
- package/dist/types.backup/build/generate-manifest.d.ts +0 -100
- package/dist/types.backup/build/generate-route-types.d.ts +0 -8
- package/dist/types.backup/build/index.d.ts +0 -21
- package/dist/types.backup/build/prefix-tree-utils.d.ts +0 -56
- package/dist/types.backup/build/route-types/ast-helpers.d.ts +0 -3
- package/dist/types.backup/build/route-types/ast-route-extraction.d.ts +0 -13
- package/dist/types.backup/build/route-types/codegen.d.ts +0 -16
- package/dist/types.backup/build/route-types/include-resolution.d.ts +0 -74
- package/dist/types.backup/build/route-types/param-extraction.d.ts +0 -13
- package/dist/types.backup/build/route-types/per-module-writer.d.ts +0 -18
- package/dist/types.backup/build/route-types/router-processing.d.ts +0 -82
- package/dist/types.backup/build/route-types/scan-filter.d.ts +0 -17
- package/dist/types.backup/build/route-types/source-scan.d.ts +0 -13
- package/dist/types.backup/build/runtime-discovery.d.ts +0 -24
- package/dist/types.backup/cache/background-task.d.ts +0 -21
- package/dist/types.backup/cache/cache-error.d.ts +0 -71
- package/dist/types.backup/cache/cache-key-utils.d.ts +0 -35
- package/dist/types.backup/cache/cache-policy.d.ts +0 -59
- package/dist/types.backup/cache/cache-runtime.d.ts +0 -51
- package/dist/types.backup/cache/cache-scope.d.ts +0 -134
- package/dist/types.backup/cache/cache-tag.d.ts +0 -79
- package/dist/types.backup/cache/cf/cf-base64.d.ts +0 -4
- package/dist/types.backup/cache/cf/cf-cache-constants.d.ts +0 -105
- package/dist/types.backup/cache/cf/cf-cache-store.d.ts +0 -481
- package/dist/types.backup/cache/cf/cf-cache-types.d.ts +0 -300
- package/dist/types.backup/cache/cf/cf-kv-utils.d.ts +0 -22
- package/dist/types.backup/cache/cf/cf-tag-marker-memo.d.ts +0 -15
- package/dist/types.backup/cache/cf/index.d.ts +0 -3
- package/dist/types.backup/cache/document-cache.d.ts +0 -69
- package/dist/types.backup/cache/handle-capture.d.ts +0 -23
- package/dist/types.backup/cache/handle-snapshot.d.ts +0 -39
- package/dist/types.backup/cache/index.d.ts +0 -7
- package/dist/types.backup/cache/memory-segment-store.d.ts +0 -163
- package/dist/types.backup/cache/profile-registry.d.ts +0 -40
- package/dist/types.backup/cache/read-through-swr.d.ts +0 -60
- package/dist/types.backup/cache/segment-codec.d.ts +0 -78
- package/dist/types.backup/cache/shell-snapshot.d.ts +0 -162
- package/dist/types.backup/cache/tag-invalidation.d.ts +0 -74
- package/dist/types.backup/cache/taint.d.ts +0 -71
- package/dist/types.backup/cache/types.d.ts +0 -407
- package/dist/types.backup/cache/vercel/index.d.ts +0 -1
- package/dist/types.backup/cache/vercel/vercel-cache-store.d.ts +0 -267
- package/dist/types.backup/client.d.ts +0 -184
- package/dist/types.backup/client.rsc.d.ts +0 -39
- package/dist/types.backup/cloudflare/index.d.ts +0 -7
- package/dist/types.backup/cloudflare/tracing.d.ts +0 -53
- package/dist/types.backup/component-utils.d.ts +0 -46
- package/dist/types.backup/components/DefaultDocument.d.ts +0 -13
- package/dist/types.backup/context-var.d.ts +0 -84
- package/dist/types.backup/debug.d.ts +0 -57
- package/dist/types.backup/decode-loader-results.d.ts +0 -5
- package/dist/types.backup/default-error-boundary.d.ts +0 -10
- package/dist/types.backup/defer.d.ts +0 -89
- package/dist/types.backup/deps/browser.d.ts +0 -1
- package/dist/types.backup/deps/html-stream-client.d.ts +0 -1
- package/dist/types.backup/deps/html-stream-server.d.ts +0 -1
- package/dist/types.backup/deps/rsc.d.ts +0 -1
- package/dist/types.backup/deps/ssr.d.ts +0 -1
- package/dist/types.backup/encode-kv.d.ts +0 -35
- package/dist/types.backup/errors.d.ts +0 -226
- package/dist/types.backup/escape-script.d.ts +0 -44
- package/dist/types.backup/handle.d.ts +0 -93
- package/dist/types.backup/handles/MetaTags.d.ts +0 -17
- package/dist/types.backup/handles/Scripts.d.ts +0 -38
- package/dist/types.backup/handles/breadcrumbs.d.ts +0 -43
- package/dist/types.backup/handles/deferred-resolution.d.ts +0 -53
- package/dist/types.backup/handles/is-thenable.d.ts +0 -12
- package/dist/types.backup/handles/meta.d.ts +0 -43
- package/dist/types.backup/handles/script.d.ts +0 -139
- package/dist/types.backup/host/cookie-handler.d.ts +0 -8
- package/dist/types.backup/host/errors.d.ts +0 -40
- package/dist/types.backup/host/index.d.ts +0 -33
- package/dist/types.backup/host/pattern-matcher.d.ts +0 -30
- package/dist/types.backup/host/router.d.ts +0 -12
- package/dist/types.backup/host/testing.d.ts +0 -41
- package/dist/types.backup/host/types.d.ts +0 -148
- package/dist/types.backup/host/utils.d.ts +0 -20
- package/dist/types.backup/href-client.d.ts +0 -214
- package/dist/types.backup/index.d.ts +0 -112
- package/dist/types.backup/index.rsc.d.ts +0 -51
- package/dist/types.backup/internal-debug.d.ts +0 -1
- package/dist/types.backup/loader-store.d.ts +0 -193
- package/dist/types.backup/loader.d.ts +0 -18
- package/dist/types.backup/loader.rsc.d.ts +0 -18
- package/dist/types.backup/missing-id-error.d.ts +0 -1
- package/dist/types.backup/outlet-context.d.ts +0 -12
- package/dist/types.backup/outlet-provider.d.ts +0 -12
- package/dist/types.backup/prerender/build-shell-capture.d.ts +0 -104
- package/dist/types.backup/prerender/param-hash.d.ts +0 -6
- package/dist/types.backup/prerender/shell-manifest-key.d.ts +0 -18
- package/dist/types.backup/prerender/store.d.ts +0 -62
- package/dist/types.backup/prerender.d.ts +0 -292
- package/dist/types.backup/redirect-origin.d.ts +0 -55
- package/dist/types.backup/regex-escape.d.ts +0 -6
- package/dist/types.backup/render-error-thrower.d.ts +0 -13
- package/dist/types.backup/response-utils.d.ts +0 -35
- package/dist/types.backup/reverse.d.ts +0 -206
- package/dist/types.backup/root-error-boundary.d.ts +0 -32
- package/dist/types.backup/route-content-wrapper.d.ts +0 -40
- package/dist/types.backup/route-definition/dsl-helpers.d.ts +0 -130
- package/dist/types.backup/route-definition/helper-factories.d.ts +0 -22
- package/dist/types.backup/route-definition/helpers-types.d.ts +0 -392
- package/dist/types.backup/route-definition/index.d.ts +0 -7
- package/dist/types.backup/route-definition/redirect.d.ts +0 -48
- package/dist/types.backup/route-definition/resolve-handler-use.d.ts +0 -19
- package/dist/types.backup/route-definition/use-item-types.d.ts +0 -1
- package/dist/types.backup/route-definition.d.ts +0 -1
- package/dist/types.backup/route-map-builder.d.ts +0 -127
- package/dist/types.backup/route-name.d.ts +0 -27
- package/dist/types.backup/route-types.d.ts +0 -172
- package/dist/types.backup/router/basename.d.ts +0 -10
- package/dist/types.backup/router/content-negotiation.d.ts +0 -91
- package/dist/types.backup/router/debug-manifest.d.ts +0 -7
- package/dist/types.backup/router/error-handling.d.ts +0 -76
- package/dist/types.backup/router/find-match.d.ts +0 -19
- package/dist/types.backup/router/handler-context.d.ts +0 -41
- package/dist/types.backup/router/instrument.d.ts +0 -161
- package/dist/types.backup/router/intercept-resolution.d.ts +0 -79
- package/dist/types.backup/router/lazy-includes.d.ts +0 -26
- package/dist/types.backup/router/loader-resolution.d.ts +0 -63
- package/dist/types.backup/router/logging.d.ts +0 -41
- package/dist/types.backup/router/manifest.d.ts +0 -8
- package/dist/types.backup/router/match-api.d.ts +0 -19
- package/dist/types.backup/router/match-context.d.ts +0 -184
- package/dist/types.backup/router/match-handlers.d.ts +0 -49
- package/dist/types.backup/router/match-middleware/background-revalidation.d.ts +0 -113
- package/dist/types.backup/router/match-middleware/cache-lookup.d.ts +0 -113
- package/dist/types.backup/router/match-middleware/cache-store.d.ts +0 -112
- package/dist/types.backup/router/match-middleware/index.d.ts +0 -80
- package/dist/types.backup/router/match-middleware/intercept-resolution.d.ts +0 -116
- package/dist/types.backup/router/match-middleware/segment-resolution.d.ts +0 -94
- package/dist/types.backup/router/match-pipelines.d.ts +0 -103
- package/dist/types.backup/router/match-result.d.ts +0 -114
- package/dist/types.backup/router/metrics.d.ts +0 -6
- package/dist/types.backup/router/middleware-types.d.ts +0 -74
- package/dist/types.backup/router/middleware.d.ts +0 -116
- package/dist/types.backup/router/navigation-snapshot.d.ts +0 -22
- package/dist/types.backup/router/params-util.d.ts +0 -8
- package/dist/types.backup/router/parse-pattern.d.ts +0 -38
- package/dist/types.backup/router/pattern-matching.d.ts +0 -169
- package/dist/types.backup/router/prefetch-cache-ttl.d.ts +0 -27
- package/dist/types.backup/router/prefetch-limits.d.ts +0 -20
- package/dist/types.backup/router/prerender-match.d.ts +0 -50
- package/dist/types.backup/router/preview-match.d.ts +0 -22
- package/dist/types.backup/router/request-classification.d.ts +0 -104
- package/dist/types.backup/router/revalidation.d.ts +0 -57
- package/dist/types.backup/router/route-snapshot.d.ts +0 -112
- package/dist/types.backup/router/router-context.d.ts +0 -137
- package/dist/types.backup/router/router-interfaces.d.ts +0 -432
- package/dist/types.backup/router/router-options.d.ts +0 -738
- package/dist/types.backup/router/router-registry.d.ts +0 -15
- package/dist/types.backup/router/segment-resolution/fresh.d.ts +0 -55
- package/dist/types.backup/router/segment-resolution/helpers.d.ts +0 -93
- package/dist/types.backup/router/segment-resolution/loader-cache.d.ts +0 -33
- package/dist/types.backup/router/segment-resolution/loader-mask.d.ts +0 -44
- package/dist/types.backup/router/segment-resolution/loader-snapshot.d.ts +0 -90
- package/dist/types.backup/router/segment-resolution/mask-nested.d.ts +0 -53
- package/dist/types.backup/router/segment-resolution/revalidation.d.ts +0 -85
- package/dist/types.backup/router/segment-resolution/static-store.d.ts +0 -17
- package/dist/types.backup/router/segment-resolution/streamed-handler-telemetry.d.ts +0 -16
- package/dist/types.backup/router/segment-resolution/view-transition-default.d.ts +0 -28
- package/dist/types.backup/router/segment-resolution.d.ts +0 -3
- package/dist/types.backup/router/segment-wrappers.d.ts +0 -53
- package/dist/types.backup/router/state-cookie-name.d.ts +0 -1
- package/dist/types.backup/router/substitute-pattern-params.d.ts +0 -23
- package/dist/types.backup/router/telemetry-otel.d.ts +0 -113
- package/dist/types.backup/router/telemetry.d.ts +0 -215
- package/dist/types.backup/router/timeout.d.ts +0 -68
- package/dist/types.backup/router/tracing.d.ts +0 -125
- package/dist/types.backup/router/trie-matching.d.ts +0 -32
- package/dist/types.backup/router/types.d.ts +0 -98
- package/dist/types.backup/router/url-params.d.ts +0 -26
- package/dist/types.backup/router.d.ts +0 -7
- package/dist/types.backup/rsc/capture-queue.d.ts +0 -6
- package/dist/types.backup/rsc/full-payload.d.ts +0 -22
- package/dist/types.backup/rsc/handler-context.d.ts +0 -31
- package/dist/types.backup/rsc/handler.d.ts +0 -9
- package/dist/types.backup/rsc/helpers.d.ts +0 -213
- package/dist/types.backup/rsc/index.d.ts +0 -17
- package/dist/types.backup/rsc/json-route-result.d.ts +0 -20
- package/dist/types.backup/rsc/loader-fetch.d.ts +0 -14
- package/dist/types.backup/rsc/manifest-init.d.ts +0 -18
- package/dist/types.backup/rsc/nonce.d.ts +0 -28
- package/dist/types.backup/rsc/origin-guard.d.ts +0 -50
- package/dist/types.backup/rsc/progressive-enhancement.d.ts +0 -19
- package/dist/types.backup/rsc/redirect-guard.d.ts +0 -35
- package/dist/types.backup/rsc/response-cache-serve.d.ts +0 -46
- package/dist/types.backup/rsc/response-error.d.ts +0 -19
- package/dist/types.backup/rsc/response-route-handler.d.ts +0 -29
- package/dist/types.backup/rsc/rsc-rendering.d.ts +0 -23
- package/dist/types.backup/rsc/runtime-warnings.d.ts +0 -22
- package/dist/types.backup/rsc/server-action.d.ts +0 -68
- package/dist/types.backup/rsc/shell-build-manifest.d.ts +0 -84
- package/dist/types.backup/rsc/shell-capture-constants.d.ts +0 -27
- package/dist/types.backup/rsc/shell-capture.d.ts +0 -374
- package/dist/types.backup/rsc/shell-serve.d.ts +0 -136
- package/dist/types.backup/rsc/ssr-setup.d.ts +0 -48
- package/dist/types.backup/rsc/transition-gate.d.ts +0 -27
- package/dist/types.backup/rsc/types.d.ts +0 -290
- package/dist/types.backup/runtime-env.d.ts +0 -1
- package/dist/types.backup/search-params.d.ts +0 -125
- package/dist/types.backup/segment-content-promise.d.ts +0 -13
- package/dist/types.backup/segment-fragments.d.ts +0 -56
- package/dist/types.backup/segment-loader-promise.d.ts +0 -22
- package/dist/types.backup/segment-system.d.ts +0 -84
- package/dist/types.backup/serialize.d.ts +0 -164
- package/dist/types.backup/server/context.d.ts +0 -494
- package/dist/types.backup/server/cookie-parse.d.ts +0 -10
- package/dist/types.backup/server/cookie-store.d.ts +0 -107
- package/dist/types.backup/server/fetchable-loader-store.d.ts +0 -20
- package/dist/types.backup/server/handle-store.d.ts +0 -100
- package/dist/types.backup/server/loader-registry.d.ts +0 -32
- package/dist/types.backup/server/request-context.d.ts +0 -596
- package/dist/types.backup/server/root-layout.d.ts +0 -3
- package/dist/types.backup/server.d.ts +0 -15
- package/dist/types.backup/ssr/index.d.ts +0 -233
- package/dist/types.backup/ssr/inject-rsc-eager.d.ts +0 -3
- package/dist/types.backup/ssr/preinit-client-references.d.ts +0 -71
- package/dist/types.backup/ssr/ssr-root.d.ts +0 -69
- package/dist/types.backup/static-handler.d.ts +0 -57
- package/dist/types.backup/testing/cache-status.d.ts +0 -63
- package/dist/types.backup/testing/collect-handle.d.ts +0 -20
- package/dist/types.backup/testing/dispatch.d.ts +0 -123
- package/dist/types.backup/testing/dom.entry.d.ts +0 -15
- package/dist/types.backup/testing/e2e/fixture.d.ts +0 -37
- package/dist/types.backup/testing/e2e/index.d.ts +0 -30
- package/dist/types.backup/testing/e2e/matchers.d.ts +0 -17
- package/dist/types.backup/testing/e2e/page-helpers.d.ts +0 -62
- package/dist/types.backup/testing/e2e/parity.d.ts +0 -111
- package/dist/types.backup/testing/e2e/server.d.ts +0 -35
- package/dist/types.backup/testing/flight-matchers.d.ts +0 -55
- package/dist/types.backup/testing/flight-normalize.d.ts +0 -1
- package/dist/types.backup/testing/flight-tree.d.ts +0 -192
- package/dist/types.backup/testing/flight.d.ts +0 -115
- package/dist/types.backup/testing/flight.entry.d.ts +0 -27
- package/dist/types.backup/testing/generated-routes.d.ts +0 -66
- package/dist/types.backup/testing/index.d.ts +0 -52
- package/dist/types.backup/testing/internal/context.d.ts +0 -225
- package/dist/types.backup/testing/internal/flight-client-globals.d.ts +0 -1
- package/dist/types.backup/testing/internal/seed-vars.d.ts +0 -30
- package/dist/types.backup/testing/render-handler.d.ts +0 -160
- package/dist/types.backup/testing/render-route.d.ts +0 -246
- package/dist/types.backup/testing/run-loader.d.ts +0 -186
- package/dist/types.backup/testing/run-middleware.d.ts +0 -132
- package/dist/types.backup/testing/run-transition-when.d.ts +0 -77
- package/dist/types.backup/testing/vitest-stubs/cloudflare-email.d.ts +0 -6
- package/dist/types.backup/testing/vitest-stubs/cloudflare-workers.d.ts +0 -13
- package/dist/types.backup/testing/vitest-stubs/plugin-rsc.d.ts +0 -7
- package/dist/types.backup/testing/vitest-stubs/version.d.ts +0 -1
- package/dist/types.backup/testing/vitest.d.ts +0 -205
- package/dist/types.backup/theme/ThemeProvider.d.ts +0 -13
- package/dist/types.backup/theme/ThemeScript.d.ts +0 -45
- package/dist/types.backup/theme/constants.d.ts +0 -39
- package/dist/types.backup/theme/index.d.ts +0 -29
- package/dist/types.backup/theme/theme-context.d.ts +0 -21
- package/dist/types.backup/theme/theme-script.d.ts +0 -26
- package/dist/types.backup/theme/types.d.ts +0 -162
- package/dist/types.backup/theme/use-theme.d.ts +0 -8
- package/dist/types.backup/types/boundaries.d.ts +0 -93
- package/dist/types.backup/types/cache-types.d.ts +0 -191
- package/dist/types.backup/types/error-types.d.ts +0 -114
- package/dist/types.backup/types/global-namespace.d.ts +0 -90
- package/dist/types.backup/types/handler-context.d.ts +0 -658
- package/dist/types.backup/types/index.d.ts +0 -11
- package/dist/types.backup/types/loader-types.d.ts +0 -182
- package/dist/types.backup/types/request-scope.d.ts +0 -93
- package/dist/types.backup/types/route-config.d.ts +0 -105
- package/dist/types.backup/types/route-entry.d.ts +0 -95
- package/dist/types.backup/types/segments.d.ts +0 -234
- package/dist/types.backup/types.d.ts +0 -1
- package/dist/types.backup/urls/include-helper.d.ts +0 -17
- package/dist/types.backup/urls/include-provider.d.ts +0 -27
- package/dist/types.backup/urls/index.d.ts +0 -6
- package/dist/types.backup/urls/path-helper-types.d.ts +0 -197
- package/dist/types.backup/urls/path-helper.d.ts +0 -12
- package/dist/types.backup/urls/pattern-types.d.ts +0 -166
- package/dist/types.backup/urls/response-types.d.ts +0 -67
- package/dist/types.backup/urls/type-extraction.d.ts +0 -157
- package/dist/types.backup/urls/urls-function.d.ts +0 -24
- package/dist/types.backup/urls.d.ts +0 -1
- package/dist/types.backup/use-loader.d.ts +0 -150
- package/dist/types.backup/vercel/index.d.ts +0 -10
- package/dist/types.backup/vercel/tracing.d.ts +0 -70
- package/dist/types.backup/vite/debug.d.ts +0 -80
- package/dist/types.backup/vite/discovery/bundle-postprocess.d.ts +0 -12
- package/dist/types.backup/vite/discovery/dev-prerender-cache.d.ts +0 -65
- package/dist/types.backup/vite/discovery/discover-routers.d.ts +0 -17
- package/dist/types.backup/vite/discovery/discovery-errors.d.ts +0 -113
- package/dist/types.backup/vite/discovery/gate-state.d.ts +0 -79
- package/dist/types.backup/vite/discovery/prerender-collection.d.ts +0 -24
- package/dist/types.backup/vite/discovery/route-types-writer.d.ts +0 -32
- package/dist/types.backup/vite/discovery/self-gen-tracking.d.ts +0 -22
- package/dist/types.backup/vite/discovery/shell-prerender-phase.d.ts +0 -40
- package/dist/types.backup/vite/discovery/state.d.ts +0 -162
- package/dist/types.backup/vite/discovery/virtual-module-codegen.d.ts +0 -15
- package/dist/types.backup/vite/index.d.ts +0 -11
- package/dist/types.backup/vite/inject-client-debug.d.ts +0 -56
- package/dist/types.backup/vite/plugin-types.d.ts +0 -298
- package/dist/types.backup/vite/plugins/cjs-to-esm.d.ts +0 -6
- package/dist/types.backup/vite/plugins/client-ref-dedup.d.ts +0 -40
- package/dist/types.backup/vite/plugins/client-ref-hashing.d.ts +0 -35
- package/dist/types.backup/vite/plugins/cloudflare-protocol-stub.d.ts +0 -64
- package/dist/types.backup/vite/plugins/expose-action-id.d.ts +0 -18
- package/dist/types.backup/vite/plugins/expose-id-utils.d.ts +0 -37
- package/dist/types.backup/vite/plugins/expose-ids/export-analysis.d.ts +0 -19
- package/dist/types.backup/vite/plugins/expose-ids/handler-transform.d.ts +0 -10
- package/dist/types.backup/vite/plugins/expose-ids/loader-transform.d.ts +0 -8
- package/dist/types.backup/vite/plugins/expose-ids/router-transform.d.ts +0 -13
- package/dist/types.backup/vite/plugins/expose-ids/types.d.ts +0 -29
- package/dist/types.backup/vite/plugins/expose-internal-ids.d.ts +0 -6
- package/dist/types.backup/vite/plugins/performance-tracks.d.ts +0 -25
- package/dist/types.backup/vite/plugins/refresh-cmd.d.ts +0 -20
- package/dist/types.backup/vite/plugins/use-cache-transform.d.ts +0 -20
- package/dist/types.backup/vite/plugins/vercel-output.d.ts +0 -85
- package/dist/types.backup/vite/plugins/version-injector.d.ts +0 -21
- package/dist/types.backup/vite/plugins/version-plugin.d.ts +0 -19
- package/dist/types.backup/vite/plugins/virtual-entries.d.ts +0 -36
- package/dist/types.backup/vite/plugins/virtual-stub-plugin.d.ts +0 -7
- package/dist/types.backup/vite/rango.d.ts +0 -29
- package/dist/types.backup/vite/router-discovery.d.ts +0 -23
- package/dist/types.backup/vite/utils/ast-handler-extract.d.ts +0 -64
- package/dist/types.backup/vite/utils/banner.d.ts +0 -2
- package/dist/types.backup/vite/utils/bundle-analysis.d.ts +0 -28
- package/dist/types.backup/vite/utils/client-chunks.d.ts +0 -55
- package/dist/types.backup/vite/utils/directive-prologue.d.ts +0 -16
- package/dist/types.backup/vite/utils/forward-user-plugins.d.ts +0 -37
- package/dist/types.backup/vite/utils/manifest-utils.d.ts +0 -7
- package/dist/types.backup/vite/utils/package-resolution.d.ts +0 -6
- package/dist/types.backup/vite/utils/prerender-utils.d.ts +0 -32
- package/dist/types.backup/vite/utils/shared-utils.d.ts +0 -55
|
@@ -18,10 +18,28 @@ import type {
|
|
|
18
18
|
ErrorBoundaryHandler,
|
|
19
19
|
ErrorBoundaryFallbackProps,
|
|
20
20
|
ErrorInfo,
|
|
21
|
+
NotFoundBoundaryHandler,
|
|
22
|
+
NotFoundBoundaryFallbackProps,
|
|
21
23
|
} from "../types";
|
|
24
|
+
import { createElement } from "react";
|
|
25
|
+
import { isDataNotFoundError } from "../errors.js";
|
|
26
|
+
import { isRedirectResponse } from "../response-utils.js";
|
|
27
|
+
import {
|
|
28
|
+
resolveSoftRedirectUrl,
|
|
29
|
+
getRedirectState,
|
|
30
|
+
isExternalRedirect,
|
|
31
|
+
} from "../redirect-origin.js";
|
|
32
|
+
import {
|
|
33
|
+
createNotFoundInfo,
|
|
34
|
+
renderNotFoundFallback,
|
|
35
|
+
resolveNotFoundFallback,
|
|
36
|
+
} from "./error-handling.js";
|
|
22
37
|
import { isHandle, collectHandleData, type Handle } from "../handle.js";
|
|
23
38
|
import { withDefer } from "../defer.js";
|
|
24
|
-
import {
|
|
39
|
+
import {
|
|
40
|
+
buildHandleSnapshot,
|
|
41
|
+
type HandleStore,
|
|
42
|
+
} from "../server/handle-store.js";
|
|
25
43
|
import { getFetchableLoader } from "../server/fetchable-loader-store.js";
|
|
26
44
|
import { _getRequestContext } from "../server/request-context.js";
|
|
27
45
|
import {
|
|
@@ -46,11 +64,66 @@ export type LoaderErrorCallback = (
|
|
|
46
64
|
},
|
|
47
65
|
) => void;
|
|
48
66
|
|
|
67
|
+
/**
|
|
68
|
+
* Loader-thrown authority signals (notFound()/redirect()) are detected by the
|
|
69
|
+
* shape a consumer can actually throw: DataNotFoundError via the shared
|
|
70
|
+
* cross-realm-safe isDataNotFoundError, redirect by 3xx Response.
|
|
71
|
+
*/
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Deliver one `ctx.use(Handle)(value)` push to the owning segment.
|
|
75
|
+
*
|
|
76
|
+
* Shared by the handler lane (setupLoaderAccess) and the loader-body lane
|
|
77
|
+
* (createLoaderExecutor) so a loader push attributes and scopes EXACTLY like a
|
|
78
|
+
* handler push — that parity is the contract `ctx.use` in a loader promises.
|
|
79
|
+
*
|
|
80
|
+
* A function value runs inside the push-callback scope so `ctx.use(loader)`
|
|
81
|
+
* calls it makes — including after its own awaits, for an async callback — are
|
|
82
|
+
* not registered as handler-to-loader deps and do not trip the deadlock guard.
|
|
83
|
+
* A pushed promise value is not tracked by handleStore.settled and does not
|
|
84
|
+
* block segment resolution, so it cannot form a rendered() deadlock. The ALS
|
|
85
|
+
* scope (not a plain boolean) is what survives the callback's awaits.
|
|
86
|
+
*/
|
|
87
|
+
function pushHandleValue(
|
|
88
|
+
store: HandleStore | undefined,
|
|
89
|
+
segmentId: string | undefined,
|
|
90
|
+
handleId: string,
|
|
91
|
+
dataOrFn: unknown | Promise<unknown> | (() => Promise<unknown>),
|
|
92
|
+
): void {
|
|
93
|
+
if (!store || !segmentId) return;
|
|
94
|
+
if (typeof dataOrFn === "function") {
|
|
95
|
+
store.push(
|
|
96
|
+
handleId,
|
|
97
|
+
segmentId,
|
|
98
|
+
runInsidePushCallbackScope(() => (dataOrFn as () => Promise<unknown>)()),
|
|
99
|
+
);
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
store.push(handleId, segmentId, dataOrFn);
|
|
103
|
+
}
|
|
104
|
+
|
|
49
105
|
/**
|
|
50
106
|
* Wrap a loader promise with error handling for deferred client-side resolution.
|
|
51
107
|
* Catches errors and converts them to LoaderDataResult objects that include
|
|
52
108
|
* error info and pre-rendered fallback UI when an error boundary is available.
|
|
53
109
|
*
|
|
110
|
+
* Loader-thrown SIGNALS are routed before error handling — they are control
|
|
111
|
+
* flow, not failures (onError is not invoked for them):
|
|
112
|
+
* - notFound(): the not-found UI is resolved and rendered HERE, server-side
|
|
113
|
+
* (nearest notFoundBoundary → router notFound option → default), exactly
|
|
114
|
+
* like the consumption lane (segment-resolution/helpers.ts), and rides the
|
|
115
|
+
* envelope's `fallback` — the client swaps with zero extra fetches. The
|
|
116
|
+
* response status is opportunistically set to 404 via the request stub: if
|
|
117
|
+
* the rejection settles before the document Response is constructed the
|
|
118
|
+
* status is a real 404; after, the stub write is inert (streamed fix-up
|
|
119
|
+
* only). Nav-lane payloads are 200 either way — the client owns 404
|
|
120
|
+
* presentation there.
|
|
121
|
+
* - redirect() (thrown 3xx Response): the target is resolved through the
|
|
122
|
+
* soft-redirect same-origin rules NOW so unsafe targets never leave the
|
|
123
|
+
* server; the client navigates when the entry decodes. No document-lane
|
|
124
|
+
* 302 — pre-stream redirect authority belongs to middleware (doctrine);
|
|
125
|
+
* a loader redirect is always a client-side navigate.
|
|
126
|
+
*
|
|
54
127
|
* @param onError - Optional callback invoked when loader errors occur.
|
|
55
128
|
* This has a simplified signature for internal use - the caller (typically
|
|
56
129
|
* wrapLoaderPromise in router.ts) is responsible for bridging to the full
|
|
@@ -70,6 +143,14 @@ export function wrapLoaderWithErrorHandling<T>(
|
|
|
70
143
|
segmentType: ErrorInfo["segmentType"],
|
|
71
144
|
) => ErrorInfo,
|
|
72
145
|
onError?: LoaderErrorCallback,
|
|
146
|
+
notFoundDeps?: {
|
|
147
|
+
findNearestNotFoundBoundary: (
|
|
148
|
+
entry: EntryData | null,
|
|
149
|
+
) => ReactNode | NotFoundBoundaryHandler | null;
|
|
150
|
+
notFoundComponent?:
|
|
151
|
+
| ReactNode
|
|
152
|
+
| ((props: { pathname: string }) => ReactNode);
|
|
153
|
+
},
|
|
73
154
|
): Promise<LoaderDataResult<T>> {
|
|
74
155
|
// Extract the trailing token from segmentId (format: "<shortCode>D<i>.<loaderId>").
|
|
75
156
|
// The token is the loader's $$id (hash#export in prod, pathfrag#export in dev),
|
|
@@ -85,6 +166,92 @@ export function wrapLoaderWithErrorHandling<T>(
|
|
|
85
166
|
}),
|
|
86
167
|
)
|
|
87
168
|
.catch((error): LoaderDataResult<T> => {
|
|
169
|
+
if (isDataNotFoundError(error)) {
|
|
170
|
+
// Opportunistic document 404: the stub status is read once when the
|
|
171
|
+
// document Response is constructed (createResponseWithMergedHeaders);
|
|
172
|
+
// a pre-construction write becomes the real status, a later write is
|
|
173
|
+
// harmless. Same mechanism as the consumption lane's setResponseStatus.
|
|
174
|
+
_getRequestContext()?._setStatus(404);
|
|
175
|
+
|
|
176
|
+
const effective = resolveNotFoundFallback(
|
|
177
|
+
notFoundDeps?.findNearestNotFoundBoundary(entry),
|
|
178
|
+
notFoundDeps?.notFoundComponent,
|
|
179
|
+
pathname,
|
|
180
|
+
);
|
|
181
|
+
|
|
182
|
+
const notFoundInfo = createNotFoundInfo(
|
|
183
|
+
error as { message: string },
|
|
184
|
+
segmentId,
|
|
185
|
+
"loader",
|
|
186
|
+
pathname,
|
|
187
|
+
);
|
|
188
|
+
let renderedNotFound: ReactNode;
|
|
189
|
+
try {
|
|
190
|
+
renderedNotFound = renderNotFoundFallback(effective, notFoundInfo);
|
|
191
|
+
} catch {
|
|
192
|
+
// A throwing boundary must not collapse the envelope (the wrapped
|
|
193
|
+
// promise is contracted to never reject); degrade to the default.
|
|
194
|
+
// Deliberately NOT shared with the consumption lane
|
|
195
|
+
// (segment-resolution/helpers.ts), which lets a throwing boundary
|
|
196
|
+
// propagate to the error boundary — only this lane is contracted to
|
|
197
|
+
// never reject.
|
|
198
|
+
renderedNotFound = createElement("h1", null, "Not Found");
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
debugLog("loader", "loader threw notFound()", {
|
|
202
|
+
segmentId,
|
|
203
|
+
pathname,
|
|
204
|
+
});
|
|
205
|
+
|
|
206
|
+
return {
|
|
207
|
+
__loaderResult: true,
|
|
208
|
+
ok: false,
|
|
209
|
+
notFound: true,
|
|
210
|
+
error: createErrorInfo(error, segmentId, "loader"),
|
|
211
|
+
fallback: renderedNotFound ?? null,
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
if (error instanceof Response && isRedirectResponse(error)) {
|
|
216
|
+
const reqCtx = _getRequestContext();
|
|
217
|
+
const requestOrigin = reqCtx?.originalUrl?.origin ?? reqCtx?.url.origin;
|
|
218
|
+
const location = error.headers.get("Location")!;
|
|
219
|
+
// Same-origin policy applied server-side; the wire never carries an
|
|
220
|
+
// unresolved target. redirect(url, { external: true })'s WeakSet brand
|
|
221
|
+
// survives (the thrown Response IS the branded object).
|
|
222
|
+
const to = requestOrigin
|
|
223
|
+
? resolveSoftRedirectUrl(
|
|
224
|
+
location,
|
|
225
|
+
requestOrigin,
|
|
226
|
+
reqCtx?._basename,
|
|
227
|
+
isExternalRedirect(error),
|
|
228
|
+
)
|
|
229
|
+
: location;
|
|
230
|
+
|
|
231
|
+
debugLog("loader", "loader threw redirect()", {
|
|
232
|
+
segmentId,
|
|
233
|
+
to,
|
|
234
|
+
});
|
|
235
|
+
|
|
236
|
+
// redirect(url, { state }): the resolved state rides the thrown
|
|
237
|
+
// Response (attachRedirectState), NOT payload metadata — a streaming
|
|
238
|
+
// loader settles after the metadata flush, so the marker is the only
|
|
239
|
+
// carrier that reaches the client. LoaderRedirect navigates with it.
|
|
240
|
+
const redirectState = getRedirectState(error);
|
|
241
|
+
|
|
242
|
+
return {
|
|
243
|
+
__loaderResult: true,
|
|
244
|
+
ok: false,
|
|
245
|
+
redirect: { to, ...(redirectState && { state: redirectState }) },
|
|
246
|
+
error: createErrorInfo(
|
|
247
|
+
new Error(`Loader redirected to ${to}`),
|
|
248
|
+
segmentId,
|
|
249
|
+
"loader",
|
|
250
|
+
),
|
|
251
|
+
fallback: null,
|
|
252
|
+
};
|
|
253
|
+
}
|
|
254
|
+
|
|
88
255
|
// Find nearest error boundary
|
|
89
256
|
const fallback = findNearestErrorBoundary(entry);
|
|
90
257
|
|
|
@@ -210,12 +377,23 @@ function detectLoaderCycle(
|
|
|
210
377
|
function createLoaderExecutor<TEnv>(
|
|
211
378
|
ctx: HandlerContext<any, TEnv>,
|
|
212
379
|
loaderPromises: Map<string, Promise<any>>,
|
|
380
|
+
executorOptions?: {
|
|
381
|
+
/**
|
|
382
|
+
* Background proactive-caching mode: ctx.handle() pushes become no-ops
|
|
383
|
+
* (mirroring setupLoaderAccessSilent's handler-handle no-op) and loader
|
|
384
|
+
* bodies are NOT aux-tracked into the foreground handle store — a
|
|
385
|
+
* background run must neither duplicate handle data nor extend the live
|
|
386
|
+
* payload's handle-stream lifetime.
|
|
387
|
+
*/
|
|
388
|
+
silentHandles?: boolean;
|
|
389
|
+
},
|
|
213
390
|
): (
|
|
214
391
|
loader: LoaderDefinition<any, any>,
|
|
215
392
|
callerLoaderId: string | null,
|
|
216
393
|
) => Promise<any> {
|
|
217
394
|
// Capture RequestContext eagerly for cookie access (ALS protection on Cloudflare)
|
|
218
395
|
const reqCtxRef = _getRequestContext();
|
|
396
|
+
const silentHandles = executorOptions?.silentHandles === true;
|
|
219
397
|
|
|
220
398
|
// Dependency graph: loaderId -> set of loader IDs it directly depends on.
|
|
221
399
|
const dependsOn = new Map<string, Set<string>>();
|
|
@@ -281,6 +459,16 @@ function createLoaderExecutor<TEnv>(
|
|
|
281
459
|
// inside loader scope. This determines whether rendered() is allowed.
|
|
282
460
|
const isDslLoader = isInsideLoaderScope();
|
|
283
461
|
|
|
462
|
+
// Owning segment for ctx.handle() attribution, captured SYNCHRONOUSLY at
|
|
463
|
+
// kickoff: segment resolution sets _currentSegmentId while resolving the
|
|
464
|
+
// segment that declares this loader (fresh.ts), and the value moves on as
|
|
465
|
+
// resolution continues — by the time the async body pushes, it would be
|
|
466
|
+
// stale. Attributing to the owning route/layout segment gives handle
|
|
467
|
+
// pushes the same granularity handler pushes have (segmentOrder-correct
|
|
468
|
+
// for breadcrumb accumulation).
|
|
469
|
+
const owningSegmentId = (ctx as InternalHandlerContext<any, TEnv>)
|
|
470
|
+
._currentSegmentId;
|
|
471
|
+
|
|
284
472
|
let renderedResolved = false;
|
|
285
473
|
let renderedPromise: Promise<void> | null = null;
|
|
286
474
|
|
|
@@ -301,20 +489,20 @@ function createLoaderExecutor<TEnv>(
|
|
|
301
489
|
env: ctx.env,
|
|
302
490
|
waitUntil: ctx.waitUntil.bind(ctx),
|
|
303
491
|
executionContext: ctx.executionContext,
|
|
304
|
-
get: ((keyOrVar: any) =>
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
if (isHandle(
|
|
492
|
+
get: ((keyOrVar: any) => {
|
|
493
|
+
// Handle READ (moved from ctx.use(handle)): collected data, available
|
|
494
|
+
// after `await ctx.rendered()` — the rendered-barrier contract.
|
|
495
|
+
if (isHandle(keyOrVar)) {
|
|
308
496
|
if (!renderedResolved) {
|
|
309
497
|
throw new Error(
|
|
310
|
-
`ctx.
|
|
311
|
-
`Handle "${
|
|
498
|
+
`ctx.get(handle) in a loader requires "await ctx.rendered()" first. ` +
|
|
499
|
+
`Handle "${keyOrVar.$$id}" cannot be read until the render tree has settled.`,
|
|
312
500
|
);
|
|
313
501
|
}
|
|
314
502
|
const reqCtx = reqCtxRef ?? _getRequestContext();
|
|
315
503
|
if (!reqCtx) {
|
|
316
504
|
throw new Error(
|
|
317
|
-
`ctx.
|
|
505
|
+
`ctx.get(handle) failed: request context not available.`,
|
|
318
506
|
);
|
|
319
507
|
}
|
|
320
508
|
const segmentOrder = reqCtx._renderBarrierSegmentOrder ?? [];
|
|
@@ -327,7 +515,35 @@ function createLoaderExecutor<TEnv>(
|
|
|
327
515
|
const snapshot =
|
|
328
516
|
reqCtx._renderBarrierHandleSnapshot ??
|
|
329
517
|
buildHandleSnapshot(reqCtx._handleStore, segmentOrder);
|
|
330
|
-
return collectHandleData(
|
|
518
|
+
return collectHandleData(keyOrVar, snapshot, segmentOrder);
|
|
519
|
+
}
|
|
520
|
+
return contextGet(variables, keyOrVar);
|
|
521
|
+
}) as typeof ctx.get,
|
|
522
|
+
use: ((item: LoaderDefinition<any, any> | Handle<any, any>) => {
|
|
523
|
+
if (isHandle(item)) {
|
|
524
|
+
// Handle WRITE — handler parity: `ctx.use(Meta)({...})` pushes from
|
|
525
|
+
// the loader body exactly like a handler push. Reads moved to
|
|
526
|
+
// ctx.get(handle) (rendered()-gated). Pushes attribute to the OWNING
|
|
527
|
+
// segment and are legal for the whole body: the body is tracked on
|
|
528
|
+
// the handle store's auxiliary lane, so the store stays open past
|
|
529
|
+
// the handler barrier. Delivery follows the race: pushes that beat
|
|
530
|
+
// the handler barrier ride the SSR snapshot, later ones stream via
|
|
531
|
+
// metadata.handlesLate (document) or the still-open handles
|
|
532
|
+
// generator (nav/action lanes).
|
|
533
|
+
const handleDef = item;
|
|
534
|
+
if (silentHandles) {
|
|
535
|
+
return withDefer((_dataOrFn: unknown) => {});
|
|
536
|
+
}
|
|
537
|
+
const store =
|
|
538
|
+
reqCtxRef?._handleStore ?? _getRequestContext()?._handleStore;
|
|
539
|
+
const segmentId = owningSegmentId;
|
|
540
|
+
return withDefer(
|
|
541
|
+
(
|
|
542
|
+
dataOrFn: unknown | Promise<unknown> | (() => Promise<unknown>),
|
|
543
|
+
) => {
|
|
544
|
+
pushHandleValue(store, segmentId, handleDef.$$id, dataOrFn);
|
|
545
|
+
},
|
|
546
|
+
);
|
|
331
547
|
}
|
|
332
548
|
|
|
333
549
|
// Loader case
|
|
@@ -355,6 +571,24 @@ function createLoaderExecutor<TEnv>(
|
|
|
355
571
|
);
|
|
356
572
|
}
|
|
357
573
|
|
|
574
|
+
// awaitBeforeFlush cycle: segment resolution awaits this loader
|
|
575
|
+
// (loader(Def, { stream: "navigation" })), the barrier awaits segment
|
|
576
|
+
// resolution, and rendered() awaits the barrier — waiting here can
|
|
577
|
+
// never complete. Fail fast with the cause instead of hanging the
|
|
578
|
+
// document render. Only document renders populate the set (the flag is
|
|
579
|
+
// stamped per-isSSR), so the same loader may still use rendered() on
|
|
580
|
+
// navigation renders.
|
|
581
|
+
if (reqCtx._awaitBeforeFlushLoaderIds?.has(currentLoaderId)) {
|
|
582
|
+
throw new Error(
|
|
583
|
+
`Deadlock: loader "${currentLoaderId}" is registered with ` +
|
|
584
|
+
`stream: "navigation", so the document render awaits it before ` +
|
|
585
|
+
`the render barrier resolves — ctx.rendered() (and the ` +
|
|
586
|
+
`ctx.get(handle) read it gates) can never settle here. Drop ` +
|
|
587
|
+
`stream: "navigation" on this loader or move the handle read to ` +
|
|
588
|
+
`a component.`,
|
|
589
|
+
);
|
|
590
|
+
}
|
|
591
|
+
|
|
358
592
|
// Bidirectional deadlock check: if a handler already started
|
|
359
593
|
// awaiting this loader, calling rendered() would deadlock. This is the
|
|
360
594
|
// real cycle guard (it holds for both streaming and non-streaming): the
|
|
@@ -458,6 +692,20 @@ function createLoaderExecutor<TEnv>(
|
|
|
458
692
|
}),
|
|
459
693
|
);
|
|
460
694
|
|
|
695
|
+
// Auxiliary-lane tracking: keeps the handle store open for this body's
|
|
696
|
+
// ctx.handle() pushes without joining `settled` (the handler barrier that
|
|
697
|
+
// gates SSR/hydration and rendered()-readers — joining it would block the
|
|
698
|
+
// document on the slowest loader and self-deadlock rendered() callers).
|
|
699
|
+
// DSL loaders only: handler-invoked loaders are awaited by their handler,
|
|
700
|
+
// so they complete inside the handler lane already. A nested DSL kickoff
|
|
701
|
+
// mid-body registers while its parent is still tracked, so the lane can
|
|
702
|
+
// never re-open after draining.
|
|
703
|
+
if (isDslLoader && !silentHandles) {
|
|
704
|
+
(reqCtxRef ?? _getRequestContext())?._handleStore?.trackAuxiliary(
|
|
705
|
+
promise,
|
|
706
|
+
);
|
|
707
|
+
}
|
|
708
|
+
|
|
461
709
|
loaderPromises.set(loader.$$id, promise);
|
|
462
710
|
return promise;
|
|
463
711
|
}
|
|
@@ -504,24 +752,7 @@ export function setupLoaderAccess<TEnv>(
|
|
|
504
752
|
|
|
505
753
|
return withDefer(
|
|
506
754
|
(dataOrFn: unknown | Promise<unknown> | (() => Promise<unknown>)) => {
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
if (typeof dataOrFn === "function") {
|
|
510
|
-
// Run the callback inside the push-callback scope so ctx.use(loader)
|
|
511
|
-
// calls it makes — including after its own awaits, for an async
|
|
512
|
-
// callback — are not registered as handler-to-loader deps and do not
|
|
513
|
-
// trip the deadlock guard. A pushed promise value is not tracked by
|
|
514
|
-
// handleStore.settled and does not block segment resolution, so it
|
|
515
|
-
// cannot form a rendered() deadlock. The ALS scope (not a plain
|
|
516
|
-
// boolean) is what survives the callback's awaits.
|
|
517
|
-
const result = runInsidePushCallbackScope(() =>
|
|
518
|
-
(dataOrFn as () => Promise<unknown>)(),
|
|
519
|
-
);
|
|
520
|
-
store.push(handle.$$id, segmentId, result);
|
|
521
|
-
return;
|
|
522
|
-
}
|
|
523
|
-
|
|
524
|
-
store.push(handle.$$id, segmentId, dataOrFn);
|
|
755
|
+
pushHandleValue(store, segmentId, handle.$$id, dataOrFn);
|
|
525
756
|
},
|
|
526
757
|
);
|
|
527
758
|
}
|
|
@@ -632,7 +863,9 @@ export function setupLoaderAccessSilent<TEnv>(
|
|
|
632
863
|
ctx: HandlerContext<any, TEnv>,
|
|
633
864
|
loaderPromises: Map<string, Promise<any>>,
|
|
634
865
|
): void {
|
|
635
|
-
const useLoader = createLoaderExecutor(ctx, loaderPromises
|
|
866
|
+
const useLoader = createLoaderExecutor(ctx, loaderPromises, {
|
|
867
|
+
silentHandles: true,
|
|
868
|
+
});
|
|
636
869
|
|
|
637
870
|
ctx.use = ((item: LoaderDefinition<any, any> | Handle<any, any>) => {
|
|
638
871
|
if (isHandle(item)) {
|
|
@@ -450,21 +450,30 @@ export function withCacheLookup<TEnv>(
|
|
|
450
450
|
resolveLoadersOnly,
|
|
451
451
|
} = getRouterContext<TEnv>();
|
|
452
452
|
|
|
453
|
-
if (
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
)
|
|
467
|
-
|
|
453
|
+
if (prerenderStoreShortCircuits(ctx.matched.pr, ctx.request)) {
|
|
454
|
+
// Actions normally re-render fresh and skip the prerender store. But a pure
|
|
455
|
+
// Prerender route's handler is evicted at build, so there is no fresh
|
|
456
|
+
// handler to run on an action re-render -- without the fallback the
|
|
457
|
+
// re-render falls through to the evicted handler and throws "No prerender
|
|
458
|
+
// data found". Serve the prerendered entry instead (the action ran already;
|
|
459
|
+
// its result is applied client-side via useActionState). Passthrough routes
|
|
460
|
+
// keep a liveHandler, so they still re-render fresh on actions.
|
|
461
|
+
const isPassthroughPrerenderRoute = ctx.entries.some(
|
|
462
|
+
(entry) => entry.type === "route" && entry.isPassthrough === true,
|
|
463
|
+
);
|
|
464
|
+
if (!ctx.isAction || !isPassthroughPrerenderRoute) {
|
|
465
|
+
await ensurePrerenderDeps();
|
|
466
|
+
if (prerenderStoreInstance) {
|
|
467
|
+
const served = yield* tryPrerenderLookup(
|
|
468
|
+
ctx,
|
|
469
|
+
state,
|
|
470
|
+
pipelineStart,
|
|
471
|
+
pipelineReqCtx,
|
|
472
|
+
resolveLoadersOnly,
|
|
473
|
+
resolveLoadersOnlyWithRevalidation,
|
|
474
|
+
);
|
|
475
|
+
if (served) return;
|
|
476
|
+
}
|
|
468
477
|
}
|
|
469
478
|
}
|
|
470
479
|
|
|
@@ -111,6 +111,7 @@ import type { MatchResult, ResolvedSegment } from "../types.js";
|
|
|
111
111
|
import type { MatchContext, MatchPipelineState } from "./match-context.js";
|
|
112
112
|
import { debugLog } from "./logging.js";
|
|
113
113
|
import { appendMetric } from "./metrics.js";
|
|
114
|
+
import { collectInterceptTargetNames } from "./intercept-resolution.js";
|
|
114
115
|
|
|
115
116
|
export async function collectSegments(
|
|
116
117
|
generator: AsyncGenerator<ResolvedSegment>,
|
|
@@ -266,6 +267,11 @@ export function buildMatchResult<TEnv>(
|
|
|
266
267
|
diff.push(s.id);
|
|
267
268
|
}
|
|
268
269
|
|
|
270
|
+
// Intercept targets reachable when THIS location becomes a navigation
|
|
271
|
+
// origin — the browser-local clientUrls matcher declines its optimistic
|
|
272
|
+
// presentation for these (see collectInterceptTargetNames).
|
|
273
|
+
const interceptTargets = collectInterceptTargetNames(ctx.manifestEntry);
|
|
274
|
+
|
|
269
275
|
return {
|
|
270
276
|
segments: cleanedSegments,
|
|
271
277
|
matched: matchedIds,
|
|
@@ -274,6 +280,7 @@ export function buildMatchResult<TEnv>(
|
|
|
274
280
|
params: ctx.matched.params,
|
|
275
281
|
routeName: ctx.routeKey,
|
|
276
282
|
slots: Object.keys(state.slots).length > 0 ? state.slots : undefined,
|
|
283
|
+
...(interceptTargets.length > 0 ? { interceptTargets } : {}),
|
|
277
284
|
routeMiddleware:
|
|
278
285
|
ctx.routeMiddleware.length > 0 ? ctx.routeMiddleware : undefined,
|
|
279
286
|
};
|
|
@@ -96,8 +96,14 @@ interface EvaluateRevalidationOptions<TEnv> {
|
|
|
96
96
|
* reason flows into the trace. Callers use this when client-knowledge
|
|
97
97
|
* (e.g. parallel slot not in clientSegmentIds) should dictate the seed
|
|
98
98
|
* instead of the params/method-based heuristic.
|
|
99
|
+
*
|
|
100
|
+
* `floor` makes a `true` seed a guarantee rather than a suggestion: user fns
|
|
101
|
+
* may raise the decision but never lower it. Set it when the segment has no
|
|
102
|
+
* client-side content to fall back on, so a `false` would render nothing
|
|
103
|
+
* instead of keeping a cached copy — see the parallel-slot call site in
|
|
104
|
+
* segment-resolution/revalidation.ts.
|
|
99
105
|
*/
|
|
100
|
-
defaultOverride?: { value: boolean; reason: string };
|
|
106
|
+
defaultOverride?: { value: boolean; reason: string; floor?: boolean };
|
|
101
107
|
}
|
|
102
108
|
|
|
103
109
|
/**
|
|
@@ -144,6 +150,20 @@ export async function evaluateRevalidation<TEnv>(
|
|
|
144
150
|
});
|
|
145
151
|
}
|
|
146
152
|
|
|
153
|
+
// A floored seed can only be raised, never lowered (see `defaultOverride`).
|
|
154
|
+
// Applied at every exit so one trace entry carries the real decision — a
|
|
155
|
+
// second, contradicting entry would let flushRevalidationTrace count the
|
|
156
|
+
// segment as both revalidated and skipped.
|
|
157
|
+
const floorTrue = defaultOverride?.floor === true && defaultOverride.value;
|
|
158
|
+
function decide(finalVal: boolean, reason: string): boolean {
|
|
159
|
+
if (floorTrue && !finalVal) {
|
|
160
|
+
pushTrace(defaultShouldRevalidate, true, `${reason}:floored`);
|
|
161
|
+
return true;
|
|
162
|
+
}
|
|
163
|
+
pushTrace(defaultShouldRevalidate, finalVal, reason);
|
|
164
|
+
return finalVal;
|
|
165
|
+
}
|
|
166
|
+
|
|
147
167
|
let defaultShouldRevalidate: boolean;
|
|
148
168
|
let defaultReason: string;
|
|
149
169
|
|
|
@@ -213,8 +233,7 @@ export async function evaluateRevalidation<TEnv>(
|
|
|
213
233
|
segmentId: segment.id,
|
|
214
234
|
});
|
|
215
235
|
}
|
|
216
|
-
|
|
217
|
-
return defaultShouldRevalidate;
|
|
236
|
+
return decide(defaultShouldRevalidate, defaultReason);
|
|
218
237
|
}
|
|
219
238
|
|
|
220
239
|
const prevSegment = getPrevSegment ? await getPrevSegment() : null;
|
|
@@ -303,8 +322,7 @@ export async function evaluateRevalidation<TEnv>(
|
|
|
303
322
|
revalidator: name,
|
|
304
323
|
revalidate: result,
|
|
305
324
|
});
|
|
306
|
-
|
|
307
|
-
return result;
|
|
325
|
+
return decide(result, `hard:${name}`);
|
|
308
326
|
} else if (
|
|
309
327
|
result &&
|
|
310
328
|
typeof result === "object" &&
|
|
@@ -330,10 +348,5 @@ export async function evaluateRevalidation<TEnv>(
|
|
|
330
348
|
revalidate: currentSuggestion,
|
|
331
349
|
});
|
|
332
350
|
const softNames = revalidations.map((r) => r.name).join(",");
|
|
333
|
-
|
|
334
|
-
defaultShouldRevalidate,
|
|
335
|
-
currentSuggestion,
|
|
336
|
-
`soft-chain:${softNames}`,
|
|
337
|
-
);
|
|
338
|
-
return currentSuggestion;
|
|
351
|
+
return decide(currentSuggestion, `soft-chain:${softNames}`);
|
|
339
352
|
}
|