@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
|
@@ -1,34 +1,129 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
|
|
3
|
-
import {
|
|
3
|
+
import {
|
|
4
|
+
useCallback,
|
|
5
|
+
useContext,
|
|
6
|
+
useEffect,
|
|
7
|
+
useMemo,
|
|
8
|
+
useRef,
|
|
9
|
+
useState,
|
|
10
|
+
} from "react";
|
|
4
11
|
import { NavigationStoreContext } from "./context.js";
|
|
5
12
|
import type { ReadonlyURLSearchParams } from "../types.js";
|
|
6
13
|
|
|
7
14
|
/**
|
|
8
|
-
*
|
|
15
|
+
* Accepted shapes for the setter: a full replacement for the search string.
|
|
16
|
+
* Record values are stringified; array values append one entry per element;
|
|
17
|
+
* null/undefined values are skipped (ergonomic conditional spreads).
|
|
18
|
+
*/
|
|
19
|
+
export type SearchParamsInit =
|
|
20
|
+
| string
|
|
21
|
+
| URLSearchParams
|
|
22
|
+
| ReadonlyURLSearchParams
|
|
23
|
+
| Record<
|
|
24
|
+
string,
|
|
25
|
+
| string
|
|
26
|
+
| number
|
|
27
|
+
| boolean
|
|
28
|
+
| readonly (string | number | boolean)[]
|
|
29
|
+
| null
|
|
30
|
+
| undefined
|
|
31
|
+
>;
|
|
32
|
+
|
|
33
|
+
export interface SetSearchParamsOptions {
|
|
34
|
+
/** Replace the current history entry instead of pushing (default false). */
|
|
35
|
+
replace?: boolean;
|
|
36
|
+
/** Scroll behavior for the navigation (default: router default, scroll). */
|
|
37
|
+
scroll?: boolean;
|
|
38
|
+
/**
|
|
39
|
+
* Set false to skip the server fetch and only update the URL (default
|
|
40
|
+
* true). Purely client-derived search state (open accordions, view modes)
|
|
41
|
+
* needs no loader re-run; all location-aware hooks still update. Same
|
|
42
|
+
* contract as NavigateOptions.revalidate — it only applies because the
|
|
43
|
+
* setter never changes the pathname.
|
|
44
|
+
*/
|
|
45
|
+
revalidate?: boolean;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export type SetSearchParams = (
|
|
49
|
+
init: SearchParamsInit | ((prev: URLSearchParams) => SearchParamsInit),
|
|
50
|
+
options?: SetSearchParamsOptions,
|
|
51
|
+
) => Promise<void>;
|
|
52
|
+
|
|
53
|
+
function normalizeInit(init: SearchParamsInit): URLSearchParams {
|
|
54
|
+
if (typeof init === "string") return new URLSearchParams(init);
|
|
55
|
+
if (init instanceof URLSearchParams) return new URLSearchParams(init);
|
|
56
|
+
const params = new URLSearchParams();
|
|
57
|
+
for (const [key, value] of Object.entries(init)) {
|
|
58
|
+
if (value == null) continue;
|
|
59
|
+
if (Array.isArray(value)) {
|
|
60
|
+
for (const entry of value) params.append(key, String(entry));
|
|
61
|
+
} else {
|
|
62
|
+
params.append(key, String(value));
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
return params;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Hook to read and write the current URL search params
|
|
70
|
+
* (React Router-style tuple).
|
|
9
71
|
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
72
|
+
* The first element is a read-only URLSearchParams from the COMMITTED
|
|
73
|
+
* location — it updates when navigation completes, not during a pending
|
|
74
|
+
* navigation. During document SSR it carries the LIVE request's search (the
|
|
75
|
+
* SSR store is seeded from SSRRenderOptions.search), and the browser's
|
|
76
|
+
* first render seeds from its own store location (window.location) — the
|
|
77
|
+
* same URL, so hydration matches. Ppr capture/resume renders seed the SHELL
|
|
78
|
+
* KEY's search (sorted, cache.searchParams filter applied — search is part
|
|
79
|
+
* of shell identity like every other ppr key), so static-part reads bake
|
|
80
|
+
* markup consistent with the shell's own key. Two edges: a param EXCLUDED
|
|
81
|
+
* by cache.searchParams is absent in shell renders but present in the
|
|
82
|
+
* browser (exclusion declares "does not affect markup" — reading one
|
|
83
|
+
* anyway hydration-mismatches), and toString() renders sorted order while
|
|
84
|
+
* the browser holds the raw URL order.
|
|
12
85
|
*
|
|
13
|
-
*
|
|
14
|
-
* the pathname
|
|
15
|
-
*
|
|
86
|
+
* The setter REPLACES the whole search string (React Router semantics) and
|
|
87
|
+
* navigates to the current pathname with the new params — a same-route
|
|
88
|
+
* navigation, so route loaders re-evaluate per their revalidate() contract
|
|
89
|
+
* and the commit holds previous content (the same-structure transition
|
|
90
|
+
* lane). Pass a function to merge with the current params: it receives a
|
|
91
|
+
* MUTABLE copy read at call time. The hash is dropped, like React Router.
|
|
16
92
|
*
|
|
17
93
|
* @example
|
|
18
94
|
* ```tsx
|
|
19
|
-
* const searchParams = useSearchParams();
|
|
20
|
-
* const
|
|
21
|
-
*
|
|
95
|
+
* const [searchParams, setSearchParams] = useSearchParams();
|
|
96
|
+
* const category = searchParams.get("category");
|
|
97
|
+
*
|
|
98
|
+
* // Replace the whole search string
|
|
99
|
+
* setSearchParams({ category: "electronics" });
|
|
100
|
+
*
|
|
101
|
+
* // Merge with what's there now
|
|
102
|
+
* setSearchParams((prev) => {
|
|
103
|
+
* prev.set("page", "2");
|
|
104
|
+
* return prev;
|
|
105
|
+
* });
|
|
106
|
+
*
|
|
107
|
+
* // Filter UIs usually want replace + preserved scroll
|
|
108
|
+
* setSearchParams({ category: "home" }, { replace: true, scroll: false });
|
|
22
109
|
* ```
|
|
23
110
|
*/
|
|
24
|
-
export function useSearchParams(): ReadonlyURLSearchParams {
|
|
111
|
+
export function useSearchParams(): [ReadonlyURLSearchParams, SetSearchParams] {
|
|
25
112
|
const ctx = useContext(NavigationStoreContext);
|
|
26
113
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
114
|
+
// Seed from the store location on BOTH sides (mirrors usePathname): the
|
|
115
|
+
// SSR store carries the live request's search, the browser store carries
|
|
116
|
+
// window.location — same URL, so the hydration renders agree. No ctx
|
|
117
|
+
// (no provider) seeds empty.
|
|
118
|
+
const [searchParams, setSearchParamsState] =
|
|
119
|
+
useState<ReadonlyURLSearchParams>(() => {
|
|
120
|
+
const location = ctx?.eventController.getState().location as
|
|
121
|
+
| URL
|
|
122
|
+
| undefined;
|
|
123
|
+
return new URLSearchParams(location?.searchParams);
|
|
124
|
+
});
|
|
30
125
|
|
|
31
|
-
const prevSearch = useRef(
|
|
126
|
+
const prevSearch = useRef(searchParams.toString());
|
|
32
127
|
|
|
33
128
|
useEffect(() => {
|
|
34
129
|
if (!ctx) return;
|
|
@@ -38,7 +133,7 @@ export function useSearchParams(): ReadonlyURLSearchParams {
|
|
|
38
133
|
const nextSearch = location.searchParams.toString();
|
|
39
134
|
if (nextSearch !== prevSearch.current) {
|
|
40
135
|
prevSearch.current = nextSearch;
|
|
41
|
-
|
|
136
|
+
setSearchParamsState(new URLSearchParams(nextSearch));
|
|
42
137
|
}
|
|
43
138
|
};
|
|
44
139
|
|
|
@@ -47,5 +142,33 @@ export function useSearchParams(): ReadonlyURLSearchParams {
|
|
|
47
142
|
return ctx.eventController.subscribe(update);
|
|
48
143
|
}, []);
|
|
49
144
|
|
|
50
|
-
|
|
145
|
+
// Reads the committed location at CALL time (not the render closure), so a
|
|
146
|
+
// functional init always merges against fresh params even when the caller's
|
|
147
|
+
// closure is stale.
|
|
148
|
+
const setSearchParams = useCallback<SetSearchParams>((init, options) => {
|
|
149
|
+
if (!ctx) {
|
|
150
|
+
throw new Error(
|
|
151
|
+
"useSearchParams setter must be used within NavigationProvider",
|
|
152
|
+
);
|
|
153
|
+
}
|
|
154
|
+
const location = ctx.eventController.getState().location as URL;
|
|
155
|
+
const resolved =
|
|
156
|
+
typeof init === "function"
|
|
157
|
+
? init(new URLSearchParams(location.searchParams))
|
|
158
|
+
: init;
|
|
159
|
+
const search = normalizeInit(resolved).toString();
|
|
160
|
+
const url = search ? `${location.pathname}?${search}` : location.pathname;
|
|
161
|
+
return ctx.navigate(url, {
|
|
162
|
+
replace: options?.replace ?? false,
|
|
163
|
+
...(options?.scroll !== undefined ? { scroll: options.scroll } : {}),
|
|
164
|
+
...(options?.revalidate !== undefined
|
|
165
|
+
? { revalidate: options.revalidate }
|
|
166
|
+
: {}),
|
|
167
|
+
});
|
|
168
|
+
}, []);
|
|
169
|
+
|
|
170
|
+
return useMemo(
|
|
171
|
+
() => [searchParams, setSearchParams],
|
|
172
|
+
[searchParams, setSearchParams],
|
|
173
|
+
);
|
|
51
174
|
}
|
|
@@ -8,6 +8,7 @@ import {
|
|
|
8
8
|
generateHistoryKey,
|
|
9
9
|
} from "./navigation-store.js";
|
|
10
10
|
import { createEventController } from "./event-controller.js";
|
|
11
|
+
import { resolveDeferredHandleValues } from "../handles/deferred-resolution.js";
|
|
11
12
|
import { validateRedirectOrigin } from "./validate-redirect-origin.js";
|
|
12
13
|
import { createNavigationClient } from "./navigation-client.js";
|
|
13
14
|
import { createServerActionBridge } from "./server-action-bridge.js";
|
|
@@ -38,6 +39,7 @@ import {
|
|
|
38
39
|
} from "./intercept-utils.js";
|
|
39
40
|
import { createAppShellRef } from "./app-shell.js";
|
|
40
41
|
import { bootLog, IS_BROWSER_DEBUG } from "./logging.js";
|
|
42
|
+
import { setActiveInterceptTargets } from "../client-urls/navigation.js";
|
|
41
43
|
|
|
42
44
|
// Vite HMR types are provided by vite/client
|
|
43
45
|
|
|
@@ -205,6 +207,11 @@ export async function initBrowserApp(
|
|
|
205
207
|
const version = initialPayload.metadata?.version;
|
|
206
208
|
initRangoState(version ?? "0", initialPayload.metadata?.stateCookieName);
|
|
207
209
|
|
|
210
|
+
// Seed the intercept-target set for the initial location so the FIRST
|
|
211
|
+
// clientUrls navigation already declines intercepted targets (refreshed on
|
|
212
|
+
// every commit in partial-update.ts).
|
|
213
|
+
setActiveInterceptTargets(initialPayload.metadata?.interceptTargets);
|
|
214
|
+
|
|
208
215
|
// Create navigation store with history-based caching
|
|
209
216
|
const store = createNavigationStore({
|
|
210
217
|
initialLocation: window.location,
|
|
@@ -268,6 +275,43 @@ export async function initBrowserApp(
|
|
|
268
275
|
// Update the initial cache entry with the processed handleData
|
|
269
276
|
// The cache entry was created by createNavigationStore but without handleData
|
|
270
277
|
store.updateCacheHandleData(initialHistoryKey, lastHandleData);
|
|
278
|
+
|
|
279
|
+
// Late handle channel: pushes from streaming loader bodies that missed the
|
|
280
|
+
// handler barrier (ctx.handle() writes mid-body). Consumed NON-BLOCKING —
|
|
281
|
+
// hydration must not wait on loader bodies — and applied through the same
|
|
282
|
+
// controller/cache path as the initial snapshot, so useHandle readers
|
|
283
|
+
// re-render as meta/breadcrumbs stream in.
|
|
284
|
+
const lateGenerator = initialPayload.metadata?.handlesLate;
|
|
285
|
+
if (lateGenerator) {
|
|
286
|
+
void (async () => {
|
|
287
|
+
try {
|
|
288
|
+
// Never apply before React commits hydration — a pre-commit
|
|
289
|
+
// application mutates the state useHandle initializers read during
|
|
290
|
+
// the hydration render (mismatch). Yields buffer in the generator
|
|
291
|
+
// meanwhile; nothing is lost.
|
|
292
|
+
await hydrationCommitted;
|
|
293
|
+
for await (const rawLateData of lateGenerator) {
|
|
294
|
+
// Handles are async by design: a push(promise) value resolves
|
|
295
|
+
// whenever it resolves — only SSR'd handles are awaited server-
|
|
296
|
+
// side. The main document snapshot arrives server-resolved
|
|
297
|
+
// (resolvedHandleStream); this late channel is raw, so resolve
|
|
298
|
+
// deferred values here exactly like the nav lane's processHandles
|
|
299
|
+
// does before applying.
|
|
300
|
+
const lateData = await resolveDeferredHandleValues(rawLateData);
|
|
301
|
+
bootLog("handles: late push applied", {
|
|
302
|
+
segments: Object.keys(lateData),
|
|
303
|
+
});
|
|
304
|
+
eventController.setHandleData(
|
|
305
|
+
lateData,
|
|
306
|
+
initialPayload.metadata?.matched,
|
|
307
|
+
);
|
|
308
|
+
store.updateCacheHandleData(initialHistoryKey, lateData);
|
|
309
|
+
}
|
|
310
|
+
} catch (err) {
|
|
311
|
+
console.error("[rsc-router] Error consuming late handles:", err);
|
|
312
|
+
}
|
|
313
|
+
})();
|
|
314
|
+
}
|
|
271
315
|
} else {
|
|
272
316
|
bootLog("handles: none in payload");
|
|
273
317
|
}
|
|
@@ -568,6 +612,18 @@ export async function initBrowserApp(
|
|
|
568
612
|
// re-runs the root effect; the second flush is not a second hydration).
|
|
569
613
|
let hydrationCommitLogged = false;
|
|
570
614
|
|
|
615
|
+
// Hydration-commit barrier for the late handle channel. useHandle's useState
|
|
616
|
+
// initializer reads the eventController's LIVE state during the hydration
|
|
617
|
+
// render, so applying a late handle update BEFORE hydration commits changes
|
|
618
|
+
// that state out from under React — the classic "external changing data"
|
|
619
|
+
// hydration mismatch (seen when a loader's push lost the handler-barrier race
|
|
620
|
+
// by milliseconds and its late yield landed mid-hydration). The root effect
|
|
621
|
+
// below resolves this; the late consumer awaits it before applying anything.
|
|
622
|
+
let resolveHydrationCommitted!: () => void;
|
|
623
|
+
const hydrationCommitted: Promise<void> = new Promise((resolve) => {
|
|
624
|
+
resolveHydrationCommitted = resolve;
|
|
625
|
+
});
|
|
626
|
+
|
|
571
627
|
/**
|
|
572
628
|
* Get the browser app context. Throws if initBrowserApp hasn't been called.
|
|
573
629
|
*/
|
|
@@ -643,6 +699,9 @@ export function Rango(_props: RangoProps): React.ReactElement {
|
|
|
643
699
|
hydrationCommitLogged = true;
|
|
644
700
|
bootLog("hydration commit (root effect flushed)");
|
|
645
701
|
}
|
|
702
|
+
// Release the late handle channel (see hydrationCommitted above).
|
|
703
|
+
// StrictMode double-invoke: resolving twice is a no-op.
|
|
704
|
+
resolveHydrationCommitted();
|
|
646
705
|
return cleanupPrefetch;
|
|
647
706
|
}, [bridge, linkInterceptionEnabled]);
|
|
648
707
|
|
|
@@ -37,6 +37,8 @@ import {
|
|
|
37
37
|
import { mergeLocationState } from "./history-state.js";
|
|
38
38
|
import { classifyActionOutcome } from "./action-coordinator.js";
|
|
39
39
|
import { getAppVersion } from "./app-version.js";
|
|
40
|
+
import { collectClientRevalidationDecisions } from "../client-urls/navigation.js";
|
|
41
|
+
import { CLIENT_REVALIDATION_HEADER } from "../client-urls/revalidation-protocol.js";
|
|
40
42
|
|
|
41
43
|
// Polyfill Symbol.dispose/asyncDispose for Safari and older browsers
|
|
42
44
|
if (typeof Symbol.dispose === "undefined") {
|
|
@@ -294,12 +296,36 @@ export function createServerActionBridge(
|
|
|
294
296
|
const onHandleAbort = () => fetchAbort.abort();
|
|
295
297
|
handle.signal.addEventListener("abort", onHandleAbort, { once: true });
|
|
296
298
|
|
|
299
|
+
// Client-run per-loader revalidation for the action follow-up render:
|
|
300
|
+
// run the held clientUrls route's revalidate() predicates with the
|
|
301
|
+
// action context and ship their decisions. Fails soft to null (locked
|
|
302
|
+
// server defaults).
|
|
303
|
+
let clientRevalidation: string | null = null;
|
|
304
|
+
try {
|
|
305
|
+
const actionPageUrl = new URL(
|
|
306
|
+
segmentState.currentUrl,
|
|
307
|
+
window.location.origin,
|
|
308
|
+
);
|
|
309
|
+
clientRevalidation = collectClientRevalidationDecisions({
|
|
310
|
+
currentUrl: actionPageUrl,
|
|
311
|
+
nextUrl: actionPageUrl,
|
|
312
|
+
isAction: true,
|
|
313
|
+
actionId: id,
|
|
314
|
+
stale: false,
|
|
315
|
+
});
|
|
316
|
+
} catch {
|
|
317
|
+
clientRevalidation = null;
|
|
318
|
+
}
|
|
319
|
+
|
|
297
320
|
// Send action request with stream tracking
|
|
298
321
|
const responsePromise = fetch(url, {
|
|
299
322
|
method: "POST",
|
|
300
323
|
headers: {
|
|
301
324
|
"rsc-action": id,
|
|
302
325
|
"X-RSC-Router-Client-Path": segmentState.currentUrl,
|
|
326
|
+
...(clientRevalidation && {
|
|
327
|
+
[CLIENT_REVALIDATION_HEADER]: clientRevalidation,
|
|
328
|
+
}),
|
|
303
329
|
...(tx && { "X-RSC-Router-Request-Id": tx.requestId }),
|
|
304
330
|
...(interceptSourceUrl && {
|
|
305
331
|
"X-RSC-Router-Intercept-Source": interceptSourceUrl,
|
package/src/browser/types.ts
CHANGED
|
@@ -54,10 +54,25 @@ export interface RscMetadata {
|
|
|
54
54
|
* Slots are used for intercepting routes during soft navigation
|
|
55
55
|
*/
|
|
56
56
|
slots?: Record<string, SlotState>;
|
|
57
|
+
/**
|
|
58
|
+
* Intercept TARGET route names reachable from this location as a
|
|
59
|
+
* navigation origin. The browser-local clientUrls matcher declines its
|
|
60
|
+
* optimistic presentation for these targets (the canonical response would
|
|
61
|
+
* commit the intercept over the ORIGIN page, so destination loading would
|
|
62
|
+
* flash and revert). Missing/empty means no targets.
|
|
63
|
+
*/
|
|
64
|
+
interceptTargets?: string[];
|
|
57
65
|
/** Root layout component for browser-side re-renders */
|
|
58
66
|
rootLayout?: ComponentType<{ children: ReactNode }>;
|
|
59
67
|
/** Handle data accumulated across route segments (async generator that yields on each push) */
|
|
60
68
|
handles?: AsyncGenerator<HandleData, void, unknown>;
|
|
69
|
+
/**
|
|
70
|
+
* Document-lane late handle channel: pushes landing after the handler
|
|
71
|
+
* barrier (streaming loader ctx.use(Handle) writes). Consumed non-blocking
|
|
72
|
+
* post-hydration (rsc-router.tsx); `handles` above is drained in blocking
|
|
73
|
+
* positions and must complete at the handler barrier.
|
|
74
|
+
*/
|
|
75
|
+
handlesLate?: AsyncGenerator<HandleData, void, unknown>;
|
|
61
76
|
/** Cached handle data (for back/forward navigation from cache) */
|
|
62
77
|
cachedHandleData?: HandleData;
|
|
63
78
|
/**
|
|
@@ -531,6 +546,13 @@ export interface FetchPartialOptions {
|
|
|
531
546
|
signal?: AbortSignal;
|
|
532
547
|
/** If true, this is a stale cache revalidation request - server should force revalidators */
|
|
533
548
|
staleRevalidation?: boolean;
|
|
549
|
+
/**
|
|
550
|
+
* Encoded client-run per-loader revalidation decisions
|
|
551
|
+
* (clientUrls revalidate() predicates executed in the browser); sent as
|
|
552
|
+
* X-Rango-Client-Reval and honored only by materialized client-urls loader
|
|
553
|
+
* stubs. Null/absent = locked server defaults.
|
|
554
|
+
*/
|
|
555
|
+
clientRevalidation?: string | null;
|
|
534
556
|
interceptSourceUrl?: string;
|
|
535
557
|
/** RSC version for cache invalidation detection */
|
|
536
558
|
version?: string;
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
import type { FullManifest, PrefixTreeNode } from "./generate-manifest.js";
|
|
2
|
+
|
|
3
|
+
function clonePrefixNode(node: PrefixTreeNode): PrefixTreeNode {
|
|
4
|
+
return {
|
|
5
|
+
staticPrefix: node.staticPrefix,
|
|
6
|
+
fullPrefix: node.fullPrefix,
|
|
7
|
+
...(node.namePrefix === undefined ? {} : { namePrefix: node.namePrefix }),
|
|
8
|
+
children: clonePrefixTree(node.children),
|
|
9
|
+
routes: [...node.routes],
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
function clonePrefixTree(
|
|
14
|
+
tree: Record<string, PrefixTreeNode>,
|
|
15
|
+
): Record<string, PrefixTreeNode> {
|
|
16
|
+
return Object.fromEntries(
|
|
17
|
+
Object.entries(tree).map(([prefix, node]) => [
|
|
18
|
+
prefix,
|
|
19
|
+
clonePrefixNode(node),
|
|
20
|
+
]),
|
|
21
|
+
);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
function removeRoutesFromPrefixTree(
|
|
25
|
+
tree: Record<string, PrefixTreeNode>,
|
|
26
|
+
routeNames: ReadonlySet<string>,
|
|
27
|
+
): Record<string, PrefixTreeNode> {
|
|
28
|
+
return Object.fromEntries(
|
|
29
|
+
Object.entries(tree).map(([prefix, node]) => [
|
|
30
|
+
prefix,
|
|
31
|
+
{
|
|
32
|
+
staticPrefix: node.staticPrefix,
|
|
33
|
+
fullPrefix: node.fullPrefix,
|
|
34
|
+
...(node.namePrefix === undefined
|
|
35
|
+
? {}
|
|
36
|
+
: { namePrefix: node.namePrefix }),
|
|
37
|
+
children: removeRoutesFromPrefixTree(node.children, routeNames),
|
|
38
|
+
routes: node.routes.filter((name) => !routeNames.has(name)),
|
|
39
|
+
},
|
|
40
|
+
]),
|
|
41
|
+
);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function mergePrefixTrees(
|
|
45
|
+
earlier: Record<string, PrefixTreeNode>,
|
|
46
|
+
later: Record<string, PrefixTreeNode>,
|
|
47
|
+
): Record<string, PrefixTreeNode> {
|
|
48
|
+
const merged = clonePrefixTree(earlier);
|
|
49
|
+
for (const [prefix, laterNode] of Object.entries(later)) {
|
|
50
|
+
const earlierNode = merged[prefix];
|
|
51
|
+
if (!earlierNode) {
|
|
52
|
+
merged[prefix] = clonePrefixNode(laterNode);
|
|
53
|
+
continue;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
merged[prefix] = {
|
|
57
|
+
staticPrefix: laterNode.staticPrefix,
|
|
58
|
+
fullPrefix: laterNode.fullPrefix,
|
|
59
|
+
...(laterNode.namePrefix === undefined
|
|
60
|
+
? {}
|
|
61
|
+
: { namePrefix: laterNode.namePrefix }),
|
|
62
|
+
children: mergePrefixTrees(earlierNode.children, laterNode.children),
|
|
63
|
+
routes: [...new Set([...earlierNode.routes, ...laterNode.routes])],
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
return merged;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
function mergeRouteRecord<T>(
|
|
70
|
+
earlier: Record<string, T> | undefined,
|
|
71
|
+
later: Record<string, T> | undefined,
|
|
72
|
+
overwrittenRoutes: ReadonlySet<string>,
|
|
73
|
+
cloneValue: (value: T) => T,
|
|
74
|
+
): Record<string, T> | undefined {
|
|
75
|
+
const merged: Record<string, T> = {};
|
|
76
|
+
for (const [name, value] of Object.entries(earlier ?? {})) {
|
|
77
|
+
if (!overwrittenRoutes.has(name)) merged[name] = cloneValue(value);
|
|
78
|
+
}
|
|
79
|
+
for (const [name, value] of Object.entries(later ?? {})) {
|
|
80
|
+
merged[name] = cloneValue(value);
|
|
81
|
+
}
|
|
82
|
+
return Object.keys(merged).length > 0 ? merged : undefined;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
function mergeRouteList(
|
|
86
|
+
earlier: readonly string[] | undefined,
|
|
87
|
+
later: readonly string[] | undefined,
|
|
88
|
+
overwrittenRoutes: ReadonlySet<string>,
|
|
89
|
+
): string[] | undefined {
|
|
90
|
+
const merged = [
|
|
91
|
+
...(earlier ?? []).filter((name) => !overwrittenRoutes.has(name)),
|
|
92
|
+
...(later ?? []),
|
|
93
|
+
];
|
|
94
|
+
const unique = [...new Set(merged)];
|
|
95
|
+
return unique.length > 0 ? unique : undefined;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/** Merge ordered per-mount manifests without mutating any input manifest. */
|
|
99
|
+
export function mergeFullManifests(
|
|
100
|
+
manifests: readonly FullManifest[],
|
|
101
|
+
): FullManifest {
|
|
102
|
+
let merged: FullManifest = {
|
|
103
|
+
prefixTree: {},
|
|
104
|
+
routeManifest: {},
|
|
105
|
+
};
|
|
106
|
+
|
|
107
|
+
for (const manifest of manifests) {
|
|
108
|
+
const overwrittenRoutes = new Set(Object.keys(manifest.routeManifest));
|
|
109
|
+
const prefixTreeWithoutOverwrites = removeRoutesFromPrefixTree(
|
|
110
|
+
merged.prefixTree,
|
|
111
|
+
overwrittenRoutes,
|
|
112
|
+
);
|
|
113
|
+
|
|
114
|
+
merged = {
|
|
115
|
+
prefixTree: mergePrefixTrees(
|
|
116
|
+
prefixTreeWithoutOverwrites,
|
|
117
|
+
manifest.prefixTree,
|
|
118
|
+
),
|
|
119
|
+
routeManifest: {
|
|
120
|
+
...merged.routeManifest,
|
|
121
|
+
...manifest.routeManifest,
|
|
122
|
+
},
|
|
123
|
+
routeTrailingSlash: mergeRouteRecord(
|
|
124
|
+
merged.routeTrailingSlash,
|
|
125
|
+
manifest.routeTrailingSlash,
|
|
126
|
+
overwrittenRoutes,
|
|
127
|
+
(value) => value,
|
|
128
|
+
),
|
|
129
|
+
prerenderRoutes: mergeRouteList(
|
|
130
|
+
merged.prerenderRoutes,
|
|
131
|
+
manifest.prerenderRoutes,
|
|
132
|
+
overwrittenRoutes,
|
|
133
|
+
),
|
|
134
|
+
passthroughRoutes: mergeRouteList(
|
|
135
|
+
merged.passthroughRoutes,
|
|
136
|
+
manifest.passthroughRoutes,
|
|
137
|
+
overwrittenRoutes,
|
|
138
|
+
),
|
|
139
|
+
responseTypeRoutes: mergeRouteRecord(
|
|
140
|
+
merged.responseTypeRoutes,
|
|
141
|
+
manifest.responseTypeRoutes,
|
|
142
|
+
overwrittenRoutes,
|
|
143
|
+
(value) => value,
|
|
144
|
+
),
|
|
145
|
+
routeSearchSchemas: mergeRouteRecord(
|
|
146
|
+
merged.routeSearchSchemas,
|
|
147
|
+
manifest.routeSearchSchemas,
|
|
148
|
+
overwrittenRoutes,
|
|
149
|
+
(value) => ({ ...value }),
|
|
150
|
+
),
|
|
151
|
+
_prerenderDefs: mergeRouteRecord(
|
|
152
|
+
merged._prerenderDefs,
|
|
153
|
+
manifest._prerenderDefs,
|
|
154
|
+
overwrittenRoutes,
|
|
155
|
+
(value) => value,
|
|
156
|
+
),
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
return merged;
|
|
161
|
+
}
|