@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
|
@@ -0,0 +1,579 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import type { SearchSchemaValue } from "../search-params.js";
|
|
3
|
+
import { getLoaderLazy } from "../server/loader-registry.js";
|
|
4
|
+
import {
|
|
5
|
+
getNamePrefix,
|
|
6
|
+
getUrlPrefix,
|
|
7
|
+
type InterceptSelectorContext,
|
|
8
|
+
} from "../server/context.js";
|
|
9
|
+
import type { LoaderDefinition, TrailingSlashMode } from "../types.js";
|
|
10
|
+
import type { PathOptions, UrlPatterns } from "../urls/pattern-types.js";
|
|
11
|
+
import type { PathHelpers } from "../urls/path-helper-types.js";
|
|
12
|
+
import type { AllUseItems } from "../route-types.js";
|
|
13
|
+
import { urls } from "../urls/urls-function.js";
|
|
14
|
+
import {
|
|
15
|
+
CLIENT_REVALIDATION_HEADER,
|
|
16
|
+
decodeClientRevalidationDecisions,
|
|
17
|
+
type ClientRevalidationDecisions,
|
|
18
|
+
} from "./revalidation-protocol.js";
|
|
19
|
+
import {
|
|
20
|
+
ClientUrlsGroupLayout,
|
|
21
|
+
ClientUrlsInterceptLoading,
|
|
22
|
+
ClientUrlsInterceptSlot,
|
|
23
|
+
ClientUrlsLoading,
|
|
24
|
+
ClientUrlsRoot,
|
|
25
|
+
} from "./client-root.js";
|
|
26
|
+
import type {
|
|
27
|
+
ClientTransitionConfig,
|
|
28
|
+
ClientUrlInterceptRecord,
|
|
29
|
+
ClientUrlPatterns,
|
|
30
|
+
ClientUrlRouteRecord,
|
|
31
|
+
} from "./types.js";
|
|
32
|
+
|
|
33
|
+
const CLIENT_REFERENCE = Symbol.for("react.client.reference");
|
|
34
|
+
|
|
35
|
+
const SEARCH_SCHEMA_VALUES: ReadonlySet<string> = new Set([
|
|
36
|
+
"string",
|
|
37
|
+
"number",
|
|
38
|
+
"boolean",
|
|
39
|
+
"string?",
|
|
40
|
+
"number?",
|
|
41
|
+
"boolean?",
|
|
42
|
+
]);
|
|
43
|
+
|
|
44
|
+
const PROJECTION_OPTIONS = new Set<PropertyKey>([
|
|
45
|
+
"name",
|
|
46
|
+
"search",
|
|
47
|
+
"trailingSlash",
|
|
48
|
+
]);
|
|
49
|
+
|
|
50
|
+
const clientUrlProjections = new Map<string, ClientUrlProjection>();
|
|
51
|
+
|
|
52
|
+
export interface ClientUrlReference {
|
|
53
|
+
readonly $$typeof: symbol;
|
|
54
|
+
readonly $$id: string;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export type ClientUrlDefinitionSource = ClientUrlReference | ClientUrlPatterns;
|
|
58
|
+
|
|
59
|
+
export interface ClientUrlProjectionOptions {
|
|
60
|
+
readonly search?: Readonly<Record<string, SearchSchemaValue>>;
|
|
61
|
+
readonly trailingSlash?: TrailingSlashMode;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export interface ClientUrlProjectionRoute {
|
|
65
|
+
readonly id: string;
|
|
66
|
+
readonly pattern: string;
|
|
67
|
+
readonly name: string | null;
|
|
68
|
+
readonly options: ClientUrlProjectionOptions;
|
|
69
|
+
readonly loaderIds: readonly string[];
|
|
70
|
+
readonly hasLoading: boolean;
|
|
71
|
+
/** Indices into loaderIds of loaders declared loader(Def, { stream:
|
|
72
|
+
* "navigation" }); materialization passes the option through to the server
|
|
73
|
+
* loader() so document renders await them before first flush. Absent (=
|
|
74
|
+
* none) in projections serialized before stream support. */
|
|
75
|
+
readonly awaitedLoaderIndices?: readonly number[];
|
|
76
|
+
/** Data-only transition config (no `when` — server-tree only); absent in
|
|
77
|
+
* projections serialized before transition support. */
|
|
78
|
+
readonly transition?: Readonly<ClientTransitionConfig>;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
export interface ClientUrlProjectionIntercept {
|
|
82
|
+
readonly slotName: `@${string}`;
|
|
83
|
+
/** Bare local target name; materialization re-dots it so the server
|
|
84
|
+
* intercept() helper composes it against the include's name prefix. */
|
|
85
|
+
readonly targetName: string;
|
|
86
|
+
readonly loaderIds: readonly string[];
|
|
87
|
+
readonly hasLoading: boolean;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
export interface ClientUrlProjection {
|
|
91
|
+
readonly version: 1;
|
|
92
|
+
readonly routes: readonly ClientUrlProjectionRoute[];
|
|
93
|
+
/** Absent in projections serialized before intercept support; consumers
|
|
94
|
+
* must treat missing as empty. */
|
|
95
|
+
readonly intercepts?: readonly ClientUrlProjectionIntercept[];
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
function routeDescription(route: ClientUrlRouteRecord): string {
|
|
99
|
+
return `route "${route.pattern}" (${route.id})`;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
function projectionError(route: ClientUrlRouteRecord, message: string): Error {
|
|
103
|
+
return new Error(
|
|
104
|
+
`clientUrls() cannot create a server projection for ${routeDescription(route)}: ${message}`,
|
|
105
|
+
);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
function serializeSearchSchema(
|
|
109
|
+
route: ClientUrlRouteRecord,
|
|
110
|
+
value: unknown,
|
|
111
|
+
): Readonly<Record<string, SearchSchemaValue>> {
|
|
112
|
+
if (typeof value !== "object" || value === null || Array.isArray(value)) {
|
|
113
|
+
throw projectionError(route, 'path option "search" must be an object');
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
const entries: Array<[string, SearchSchemaValue]> = [];
|
|
117
|
+
for (const key of Object.keys(value).sort()) {
|
|
118
|
+
const schemaValue = (value as Record<string, unknown>)[key];
|
|
119
|
+
if (
|
|
120
|
+
typeof schemaValue !== "string" ||
|
|
121
|
+
!SEARCH_SCHEMA_VALUES.has(schemaValue)
|
|
122
|
+
) {
|
|
123
|
+
throw projectionError(
|
|
124
|
+
route,
|
|
125
|
+
`path option "search.${key}" has unsupported value ${JSON.stringify(schemaValue)}`,
|
|
126
|
+
);
|
|
127
|
+
}
|
|
128
|
+
entries.push([key, schemaValue as SearchSchemaValue]);
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
return Object.freeze(Object.fromEntries(entries));
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
function serializeOptions(
|
|
135
|
+
route: ClientUrlRouteRecord,
|
|
136
|
+
): ClientUrlProjectionOptions {
|
|
137
|
+
const source = route.options;
|
|
138
|
+
if (!source) return Object.freeze({});
|
|
139
|
+
|
|
140
|
+
for (const key of Reflect.ownKeys(source)) {
|
|
141
|
+
if (key === "ppr") {
|
|
142
|
+
throw projectionError(route, 'path option "ppr" is not supported');
|
|
143
|
+
}
|
|
144
|
+
if (!PROJECTION_OPTIONS.has(key)) {
|
|
145
|
+
throw projectionError(
|
|
146
|
+
route,
|
|
147
|
+
`path option ${JSON.stringify(String(key))} is not supported`,
|
|
148
|
+
);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
const options: {
|
|
153
|
+
search?: Readonly<Record<string, SearchSchemaValue>>;
|
|
154
|
+
trailingSlash?: TrailingSlashMode;
|
|
155
|
+
} = {};
|
|
156
|
+
if (source.search !== undefined) {
|
|
157
|
+
options.search = serializeSearchSchema(route, source.search);
|
|
158
|
+
}
|
|
159
|
+
if (source.trailingSlash !== undefined) {
|
|
160
|
+
options.trailingSlash = source.trailingSlash;
|
|
161
|
+
}
|
|
162
|
+
return Object.freeze(options);
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
function serializeTransition(
|
|
166
|
+
route: ClientUrlRouteRecord,
|
|
167
|
+
): Readonly<ClientTransitionConfig> | undefined {
|
|
168
|
+
const source = route.transition;
|
|
169
|
+
if (!source) return undefined;
|
|
170
|
+
// The DSL already validated shape and rejected `when`; re-copy defensively
|
|
171
|
+
// so the projection is a plain JSON value (class maps included).
|
|
172
|
+
const config: Record<string, unknown> = {};
|
|
173
|
+
for (const [key, value] of Object.entries(source)) {
|
|
174
|
+
if (value === undefined) continue;
|
|
175
|
+
config[key] =
|
|
176
|
+
typeof value === "object" && value !== null
|
|
177
|
+
? Object.freeze({ ...(value as Record<string, string>) })
|
|
178
|
+
: value;
|
|
179
|
+
}
|
|
180
|
+
return Object.freeze(config) as Readonly<ClientTransitionConfig>;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
function serializeRoute(route: ClientUrlRouteRecord): ClientUrlProjectionRoute {
|
|
184
|
+
const loaderIds = route.loaders.map(({ loader }, index) => {
|
|
185
|
+
if (typeof loader.$$id !== "string" || loader.$$id.length === 0) {
|
|
186
|
+
throw projectionError(
|
|
187
|
+
route,
|
|
188
|
+
`loader at index ${index} is missing a non-empty $$id`,
|
|
189
|
+
);
|
|
190
|
+
}
|
|
191
|
+
return loader.$$id;
|
|
192
|
+
});
|
|
193
|
+
|
|
194
|
+
const awaitedLoaderIndices = route.loaders
|
|
195
|
+
.map(({ stream }, index) => (stream === "navigation" ? index : -1))
|
|
196
|
+
.filter((index) => index >= 0);
|
|
197
|
+
|
|
198
|
+
const transition = serializeTransition(route);
|
|
199
|
+
return Object.freeze({
|
|
200
|
+
id: route.id,
|
|
201
|
+
pattern: route.pattern,
|
|
202
|
+
name: route.name ?? null,
|
|
203
|
+
options: serializeOptions(route),
|
|
204
|
+
loaderIds: Object.freeze(loaderIds),
|
|
205
|
+
hasLoading: route.loading !== undefined,
|
|
206
|
+
...(awaitedLoaderIndices.length > 0
|
|
207
|
+
? { awaitedLoaderIndices: Object.freeze(awaitedLoaderIndices) }
|
|
208
|
+
: {}),
|
|
209
|
+
...(transition ? { transition } : {}),
|
|
210
|
+
});
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
function serializeIntercept(
|
|
214
|
+
record: ClientUrlInterceptRecord,
|
|
215
|
+
index: number,
|
|
216
|
+
): ClientUrlProjectionIntercept {
|
|
217
|
+
const loaderIds = record.loaders.map(({ loader }, loaderIndex) => {
|
|
218
|
+
if (typeof loader.$$id !== "string" || loader.$$id.length === 0) {
|
|
219
|
+
throw new Error(
|
|
220
|
+
`clientUrls() cannot create a server projection for intercept ".${record.targetName}" ` +
|
|
221
|
+
`(index ${index}): loader at index ${loaderIndex} is missing a non-empty $$id`,
|
|
222
|
+
);
|
|
223
|
+
}
|
|
224
|
+
return loader.$$id;
|
|
225
|
+
});
|
|
226
|
+
|
|
227
|
+
return Object.freeze({
|
|
228
|
+
slotName: record.slotName,
|
|
229
|
+
targetName: record.targetName,
|
|
230
|
+
loaderIds: Object.freeze(loaderIds),
|
|
231
|
+
hasLoading: record.loading !== undefined,
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
export function serializeClientUrlPatterns(
|
|
236
|
+
patterns: ClientUrlPatterns,
|
|
237
|
+
): ClientUrlProjection {
|
|
238
|
+
return Object.freeze({
|
|
239
|
+
version: 1 as const,
|
|
240
|
+
routes: Object.freeze(patterns.routes.map(serializeRoute)),
|
|
241
|
+
intercepts: Object.freeze(
|
|
242
|
+
(patterns.intercepts ?? []).map(serializeIntercept),
|
|
243
|
+
),
|
|
244
|
+
});
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
export function isClientUrlPatterns(
|
|
248
|
+
value: unknown,
|
|
249
|
+
): value is ClientUrlPatterns {
|
|
250
|
+
return (
|
|
251
|
+
typeof value === "object" &&
|
|
252
|
+
value !== null &&
|
|
253
|
+
(value as { __brand?: unknown }).__brand === "client-urls" &&
|
|
254
|
+
Array.isArray((value as { routes?: unknown }).routes)
|
|
255
|
+
);
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
export function isClientUrlReference(
|
|
259
|
+
value: unknown,
|
|
260
|
+
): value is ClientUrlReference {
|
|
261
|
+
if (
|
|
262
|
+
(typeof value !== "object" || value === null) &&
|
|
263
|
+
typeof value !== "function"
|
|
264
|
+
) {
|
|
265
|
+
return false;
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
try {
|
|
269
|
+
const reference = value as Partial<ClientUrlReference>;
|
|
270
|
+
return (
|
|
271
|
+
reference.$$typeof === CLIENT_REFERENCE &&
|
|
272
|
+
typeof reference.$$id === "string" &&
|
|
273
|
+
reference.$$id.length > 0
|
|
274
|
+
);
|
|
275
|
+
} catch {
|
|
276
|
+
return false;
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
/**
|
|
281
|
+
* Strip vite's HMR timestamp query from a module id. After an HMR update of
|
|
282
|
+
* a clientUrls module, the RSC graph re-imports it under
|
|
283
|
+
* `<path>?t=<timestamp>#default`, so the include's client reference carries a
|
|
284
|
+
* t-stamped $$id while the projection was registered under the bare id — the
|
|
285
|
+
* lookup missed and every request 500'd until a server restart. Only the
|
|
286
|
+
* `t` param is removed (other queries are part of module identity).
|
|
287
|
+
*/
|
|
288
|
+
function stripHmrTimestamp(id: string): string {
|
|
289
|
+
return id.replace(/([?&])t=\d+(&)?/, (_match, lead: string, trail?: string) =>
|
|
290
|
+
trail ? lead : "",
|
|
291
|
+
);
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
function projectionKey(reference: string | ClientUrlReference): string {
|
|
295
|
+
if (typeof reference === "string" && reference.length > 0) {
|
|
296
|
+
return stripHmrTimestamp(reference);
|
|
297
|
+
}
|
|
298
|
+
if (isClientUrlReference(reference)) {
|
|
299
|
+
return stripHmrTimestamp(reference.$$id);
|
|
300
|
+
}
|
|
301
|
+
throw new Error(
|
|
302
|
+
"Client URL projections require a React client reference with a non-empty $$id",
|
|
303
|
+
);
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
export function setClientUrlProjection(
|
|
307
|
+
reference: string | ClientUrlReference,
|
|
308
|
+
projection: ClientUrlProjection,
|
|
309
|
+
): void {
|
|
310
|
+
clientUrlProjections.set(projectionKey(reference), projection);
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
export function getClientUrlProjection(
|
|
314
|
+
reference: string | ClientUrlReference,
|
|
315
|
+
): ClientUrlProjection | undefined {
|
|
316
|
+
return clientUrlProjections.get(projectionKey(reference));
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
export function clearClientUrlProjections(): void {
|
|
320
|
+
clientUrlProjections.clear();
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
/**
|
|
324
|
+
* Per-request memo for decoded client revalidation decisions: the synthesized
|
|
325
|
+
* predicate below runs once per loader stub per revalidation pass, and every
|
|
326
|
+
* stub reads the same header.
|
|
327
|
+
*/
|
|
328
|
+
const decisionsByRequest = new WeakMap<
|
|
329
|
+
Request,
|
|
330
|
+
ClientRevalidationDecisions | null
|
|
331
|
+
>();
|
|
332
|
+
|
|
333
|
+
function clientDecisionsFor(
|
|
334
|
+
request: Request | undefined,
|
|
335
|
+
): ClientRevalidationDecisions | null {
|
|
336
|
+
if (!request) return null;
|
|
337
|
+
if (decisionsByRequest.has(request)) {
|
|
338
|
+
return decisionsByRequest.get(request) ?? null;
|
|
339
|
+
}
|
|
340
|
+
const decoded = decodeClientRevalidationDecisions(
|
|
341
|
+
request.headers.get(CLIENT_REVALIDATION_HEADER),
|
|
342
|
+
);
|
|
343
|
+
decisionsByRequest.set(request, decoded);
|
|
344
|
+
return decoded;
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
/**
|
|
348
|
+
* The server end of client-run per-loader revalidation: clientUrls()
|
|
349
|
+
* revalidate() predicates EXECUTE in the browser (they are client-module
|
|
350
|
+
* code), and their decisions arrive on the request header. This synthesized
|
|
351
|
+
* predicate — attached to every materialized loader stub — honors a decision
|
|
352
|
+
* addressed to its loader id and otherwise returns the locked default, which
|
|
353
|
+
* is also the behavior for requests that carry no decisions (no-JS, PE,
|
|
354
|
+
* prefetch, document loads). Decisions can only address client-urls stubs;
|
|
355
|
+
* server-tree loaders never see this predicate.
|
|
356
|
+
*/
|
|
357
|
+
function makeClientDecisionRevalidate(
|
|
358
|
+
loaderId: string,
|
|
359
|
+
): (args: {
|
|
360
|
+
defaultShouldRevalidate: boolean;
|
|
361
|
+
context: { request: Request };
|
|
362
|
+
}) => boolean {
|
|
363
|
+
return ({ defaultShouldRevalidate, context }) => {
|
|
364
|
+
const decisions = clientDecisionsFor(context?.request);
|
|
365
|
+
if (decisions) {
|
|
366
|
+
if (decisions.skip.includes(loaderId)) return false;
|
|
367
|
+
if (decisions.force.includes(loaderId)) return true;
|
|
368
|
+
}
|
|
369
|
+
return defaultShouldRevalidate;
|
|
370
|
+
};
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
function createLoaderStub(id: string): LoaderDefinition<unknown> {
|
|
374
|
+
return {
|
|
375
|
+
__brand: "loader",
|
|
376
|
+
$$id: id,
|
|
377
|
+
fn: async (ctx) => {
|
|
378
|
+
const registeredLoader = await getLoaderLazy(id);
|
|
379
|
+
if (!registeredLoader) {
|
|
380
|
+
throw new Error(
|
|
381
|
+
`Projected loader "${id}" was not found in the server loader registry`,
|
|
382
|
+
);
|
|
383
|
+
}
|
|
384
|
+
return registeredLoader.fn(ctx);
|
|
385
|
+
},
|
|
386
|
+
};
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
function materializedPathOptions(route: ClientUrlProjectionRoute): PathOptions {
|
|
390
|
+
return {
|
|
391
|
+
...(route.name === null ? {} : { name: route.name }),
|
|
392
|
+
...(route.options.search ? { search: { ...route.options.search } } : {}),
|
|
393
|
+
...(route.options.trailingSlash
|
|
394
|
+
? { trailingSlash: route.options.trailingSlash }
|
|
395
|
+
: {}),
|
|
396
|
+
};
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
function materializeRouteItems(
|
|
400
|
+
reference: ClientUrlDefinitionSource,
|
|
401
|
+
projection: ClientUrlProjection,
|
|
402
|
+
{
|
|
403
|
+
path,
|
|
404
|
+
layout,
|
|
405
|
+
loader,
|
|
406
|
+
loading,
|
|
407
|
+
intercept,
|
|
408
|
+
transition,
|
|
409
|
+
revalidate,
|
|
410
|
+
}: PathHelpers<any>,
|
|
411
|
+
): AllUseItems[] {
|
|
412
|
+
// The urls() builder runs under the include's prefixes, so the composed
|
|
413
|
+
// route-name prefix is available here. ClientUrlsRoot needs it to compose
|
|
414
|
+
// canonical names for intercept-target coordination in the browser.
|
|
415
|
+
const namePrefix = getNamePrefix();
|
|
416
|
+
|
|
417
|
+
// Helper calls attach to the CURRENT ctx.parent as they execute, so these
|
|
418
|
+
// builders must run where the items belong: at the module top level for the
|
|
419
|
+
// flat (no-intercept) shape, or inside the group layout's children callback
|
|
420
|
+
// when intercepts wrap the group.
|
|
421
|
+
const buildRouteItems = (): AllUseItems[] =>
|
|
422
|
+
projection.routes.map(
|
|
423
|
+
(route) =>
|
|
424
|
+
path(
|
|
425
|
+
route.pattern,
|
|
426
|
+
() =>
|
|
427
|
+
React.createElement(ClientUrlsRoot, {
|
|
428
|
+
definition: reference as ClientUrlPatterns,
|
|
429
|
+
routeId: route.id,
|
|
430
|
+
namePrefix,
|
|
431
|
+
}),
|
|
432
|
+
materializedPathOptions(route),
|
|
433
|
+
() => [
|
|
434
|
+
...route.loaderIds.map((id, loaderIndex) =>
|
|
435
|
+
loader(
|
|
436
|
+
createLoaderStub(id),
|
|
437
|
+
route.awaitedLoaderIndices?.includes(loaderIndex)
|
|
438
|
+
? { stream: "navigation" }
|
|
439
|
+
: undefined,
|
|
440
|
+
() => [revalidate(makeClientDecisionRevalidate(id))],
|
|
441
|
+
),
|
|
442
|
+
),
|
|
443
|
+
...(route.hasLoading
|
|
444
|
+
? [
|
|
445
|
+
loading(
|
|
446
|
+
React.createElement(ClientUrlsLoading, {
|
|
447
|
+
definition: reference as ClientUrlPatterns,
|
|
448
|
+
routeId: route.id,
|
|
449
|
+
}),
|
|
450
|
+
),
|
|
451
|
+
]
|
|
452
|
+
: []),
|
|
453
|
+
// Data-only per-route transition config: same child position as a
|
|
454
|
+
// hand-written server transition(config) — no `when`.
|
|
455
|
+
...(route.transition ? [transition({ ...route.transition })] : []),
|
|
456
|
+
],
|
|
457
|
+
) as AllUseItems,
|
|
458
|
+
);
|
|
459
|
+
|
|
460
|
+
const intercepts = projection.intercepts ?? [];
|
|
461
|
+
if (intercepts.length === 0) return buildRouteItems();
|
|
462
|
+
|
|
463
|
+
// Two server-side mechanics make client-declared intercepts work:
|
|
464
|
+
//
|
|
465
|
+
// 1. GROUP LAYOUT ATTACHMENT. findInterceptForRoute walks the TARGET
|
|
466
|
+
// route's parent chain, so the intercept must live on an entry in that
|
|
467
|
+
// chain that survives evaluation. Emitting intercepts at the module top
|
|
468
|
+
// level attaches them to the lazy expansion's ISOLATED parent clone
|
|
469
|
+
// (getIsolatedLazyParent in server/context.ts), which is discarded.
|
|
470
|
+
// Wrapping the group in one materialized layout gives them a persistent
|
|
471
|
+
// home in the target chain — and the layout renders each declared slot,
|
|
472
|
+
// so the modal presents inside the group's own subtree (the slot segment
|
|
473
|
+
// attaches to the declaring entry; an outer layout's same-named outlet
|
|
474
|
+
// would never receive it).
|
|
475
|
+
//
|
|
476
|
+
// 2. SYNTHESIZED ORIGIN `when`. The target-chain walk is origin-blind: a
|
|
477
|
+
// bare intercept would claim navigations from ANY origin — and for an
|
|
478
|
+
// out-of-group origin the slot's host layout is not in the rendered
|
|
479
|
+
// tree, so the modal would silently vanish. The declaration contract is
|
|
480
|
+
// module-local, so materialization synthesizes the origin check the DSL
|
|
481
|
+
// deliberately does not expose: activate only when the origin pathname
|
|
482
|
+
// is inside this include's mount. This is server-generated code — no
|
|
483
|
+
// function crosses the "use client" projection boundary.
|
|
484
|
+
const mount = getUrlPrefix() || "/";
|
|
485
|
+
const isInGroupOrigin = ({ from }: InterceptSelectorContext): boolean =>
|
|
486
|
+
mount === "/"
|
|
487
|
+
? true
|
|
488
|
+
: from.pathname === mount || from.pathname.startsWith(`${mount}/`);
|
|
489
|
+
const slotNames = [...new Set(intercepts.map((record) => record.slotName))];
|
|
490
|
+
const buildInterceptItems = (): AllUseItems[] =>
|
|
491
|
+
intercepts.map(
|
|
492
|
+
(record, interceptIndex) =>
|
|
493
|
+
intercept(
|
|
494
|
+
record.slotName,
|
|
495
|
+
`.${record.targetName}`,
|
|
496
|
+
() =>
|
|
497
|
+
React.createElement(ClientUrlsInterceptSlot, {
|
|
498
|
+
definition: reference as ClientUrlPatterns,
|
|
499
|
+
interceptIndex,
|
|
500
|
+
}),
|
|
501
|
+
{ when: isInGroupOrigin },
|
|
502
|
+
() => [
|
|
503
|
+
...record.loaderIds.map((id) => loader(createLoaderStub(id))),
|
|
504
|
+
...(record.hasLoading
|
|
505
|
+
? [
|
|
506
|
+
loading(
|
|
507
|
+
React.createElement(ClientUrlsInterceptLoading, {
|
|
508
|
+
definition: reference as ClientUrlPatterns,
|
|
509
|
+
interceptIndex,
|
|
510
|
+
}),
|
|
511
|
+
),
|
|
512
|
+
]
|
|
513
|
+
: []),
|
|
514
|
+
],
|
|
515
|
+
) as AllUseItems,
|
|
516
|
+
);
|
|
517
|
+
|
|
518
|
+
function ClientUrlsGroup(): React.ReactNode {
|
|
519
|
+
return React.createElement(ClientUrlsGroupLayout, { slotNames });
|
|
520
|
+
}
|
|
521
|
+
|
|
522
|
+
return [
|
|
523
|
+
layout(ClientUrlsGroup, () => [
|
|
524
|
+
...buildRouteItems(),
|
|
525
|
+
...buildInterceptItems(),
|
|
526
|
+
]) as AllUseItems,
|
|
527
|
+
];
|
|
528
|
+
}
|
|
529
|
+
|
|
530
|
+
function assertClientUrlSource(
|
|
531
|
+
value: unknown,
|
|
532
|
+
caller: string,
|
|
533
|
+
): asserts value is ClientUrlDefinitionSource {
|
|
534
|
+
if (!isClientUrlReference(value) && !isClientUrlPatterns(value)) {
|
|
535
|
+
throw new Error(
|
|
536
|
+
`${caller} expects clientUrls() patterns or a React client reference with a non-empty $$id`,
|
|
537
|
+
);
|
|
538
|
+
}
|
|
539
|
+
}
|
|
540
|
+
|
|
541
|
+
export function materializeClientUrlPatterns(
|
|
542
|
+
reference: ClientUrlDefinitionSource,
|
|
543
|
+
projection: ClientUrlProjection,
|
|
544
|
+
): UrlPatterns {
|
|
545
|
+
assertClientUrlSource(reference, "materializeClientUrlPatterns()");
|
|
546
|
+
return urls((helpers) =>
|
|
547
|
+
materializeRouteItems(reference, projection, helpers),
|
|
548
|
+
);
|
|
549
|
+
}
|
|
550
|
+
|
|
551
|
+
/**
|
|
552
|
+
* Adapt a clientUrls() source for `include()` mounting inside the canonical
|
|
553
|
+
* urls() tree. Materialization is DEFERRED into the returned handler: it
|
|
554
|
+
* resolves the discovery-installed projection at evaluation time (lazy include
|
|
555
|
+
* expansion, build manifest generation, dev per-request trie rebuild) — by
|
|
556
|
+
* then the routes-manifest bootstrap has installed projections, so registration
|
|
557
|
+
* order never matters. The include machinery applies the URL and route-name
|
|
558
|
+
* prefixes exactly as it does for any urls() module; surrounding RSC layouts,
|
|
559
|
+
* middleware scoping, and boundaries derive from the canonical server tree.
|
|
560
|
+
*/
|
|
561
|
+
export function clientUrlIncludePatterns(
|
|
562
|
+
source: ClientUrlDefinitionSource,
|
|
563
|
+
): UrlPatterns {
|
|
564
|
+
assertClientUrlSource(source, "include() with a clientUrls() definition");
|
|
565
|
+
return urls((helpers) => {
|
|
566
|
+
const projection = isClientUrlPatterns(source)
|
|
567
|
+
? serializeClientUrlPatterns(source)
|
|
568
|
+
: getClientUrlProjection(source);
|
|
569
|
+
if (!projection) {
|
|
570
|
+
const id = isClientUrlReference(source) ? source.$$id : "(inline)";
|
|
571
|
+
throw new Error(
|
|
572
|
+
`include() could not resolve the server projection for clientUrls() module "${id}". ` +
|
|
573
|
+
'The definition must be the default export of a "use client" module so the ' +
|
|
574
|
+
"Vite discovery pass can project it; in unit tests pass the clientUrls() object directly.",
|
|
575
|
+
);
|
|
576
|
+
}
|
|
577
|
+
return materializeRouteItems(source, projection, helpers);
|
|
578
|
+
});
|
|
579
|
+
}
|