@rangojs/router 0.0.0-experimental.133 → 0.0.0-experimental.134
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/dist/vite/index.js +22 -9
- package/package.json +1 -1
- package/skills/composability/SKILL.md +0 -1
- package/skills/handler-use/SKILL.md +7 -7
- package/skills/intercept/SKILL.md +38 -13
- package/skills/migrate-nextjs/SKILL.md +3 -3
- package/skills/prerender/SKILL.md +20 -17
- package/skills/router-setup/SKILL.md +1 -2
- package/skills/testing/SKILL.md +1 -0
- package/skills/view-transitions/SKILL.md +43 -0
- package/src/browser/navigation-bridge.ts +65 -16
- package/src/browser/navigation-client.ts +15 -1
- package/src/browser/navigation-store.ts +82 -8
- package/src/browser/network-error-handler.ts +34 -7
- package/src/browser/partial-update.ts +27 -2
- package/src/browser/prefetch/cache.ts +8 -0
- package/src/browser/prefetch/fetch.ts +32 -4
- package/src/browser/react/NavigationProvider.tsx +195 -4
- package/src/browser/react/deferred-handle-resolution.ts +75 -0
- package/src/browser/response-adapter.ts +38 -9
- package/src/browser/types.ts +32 -1
- package/src/handles/MetaTags.tsx +6 -0
- package/src/index.rsc.ts +6 -1
- package/src/index.ts +6 -4
- package/src/internal-debug.ts +11 -8
- package/src/render-error-thrower.tsx +20 -0
- package/src/route-content-wrapper.tsx +12 -5
- package/src/route-definition/dsl-helpers.ts +21 -32
- package/src/route-definition/helper-factories.ts +0 -2
- package/src/route-definition/helpers-types.ts +38 -39
- package/src/route-definition/index.ts +1 -2
- package/src/route-definition/resolve-handler-use.ts +0 -1
- package/src/route-definition/use-item-types.ts +3 -6
- package/src/route-types.ts +0 -5
- package/src/router/match-api.ts +5 -1
- package/src/router/segment-resolution/fresh.ts +4 -0
- package/src/router/segment-resolution/revalidation.ts +3 -0
- package/src/router/segment-resolution/view-transition-default.ts +35 -15
- package/src/rsc/progressive-enhancement.ts +31 -2
- package/src/rsc/rsc-rendering.ts +7 -2
- package/src/rsc/server-action.ts +19 -2
- package/src/rsc/transition-gate.ts +89 -0
- package/src/segment-system.tsx +26 -8
- package/src/server/context.ts +13 -0
- package/src/server/request-context.ts +41 -3
- package/src/testing/index.ts +6 -0
- package/src/testing/run-transition-when.ts +164 -0
- package/src/types/handler-context.ts +1 -1
- package/src/types/index.ts +2 -0
- package/src/types/segments.ts +100 -0
- package/src/urls/path-helper-types.ts +10 -7
- package/src/urls/urls-function.ts +0 -1
- package/src/vite/inject-client-debug.ts +36 -0
- package/src/vite/router-discovery.ts +8 -13
- package/dist/__internal.d.ts +0 -83
- package/dist/__internal.d.ts.map +0 -1
- package/dist/__internal.js +0 -19
- package/dist/__internal.js.map +0 -1
- package/dist/__mocks__/version.d.ts +0 -7
- package/dist/__mocks__/version.d.ts.map +0 -1
- package/dist/__mocks__/version.js +0 -7
- package/dist/__mocks__/version.js.map +0 -1
- package/dist/__tests__/client-href.test.d.ts +0 -2
- package/dist/__tests__/client-href.test.d.ts.map +0 -1
- package/dist/__tests__/client-href.test.js +0 -74
- package/dist/__tests__/client-href.test.js.map +0 -1
- package/dist/__tests__/component-utils.test.d.ts +0 -2
- package/dist/__tests__/component-utils.test.d.ts.map +0 -1
- package/dist/__tests__/component-utils.test.js +0 -51
- package/dist/__tests__/component-utils.test.js.map +0 -1
- package/dist/__tests__/event-controller.test.d.ts +0 -2
- package/dist/__tests__/event-controller.test.d.ts.map +0 -1
- package/dist/__tests__/event-controller.test.js +0 -538
- package/dist/__tests__/event-controller.test.js.map +0 -1
- package/dist/__tests__/helpers/route-tree.d.ts +0 -118
- package/dist/__tests__/helpers/route-tree.d.ts.map +0 -1
- package/dist/__tests__/helpers/route-tree.js +0 -374
- package/dist/__tests__/helpers/route-tree.js.map +0 -1
- package/dist/__tests__/match-result.test.d.ts +0 -2
- package/dist/__tests__/match-result.test.d.ts.map +0 -1
- package/dist/__tests__/match-result.test.js +0 -154
- package/dist/__tests__/match-result.test.js.map +0 -1
- package/dist/__tests__/navigation-store.test.d.ts +0 -2
- package/dist/__tests__/navigation-store.test.d.ts.map +0 -1
- package/dist/__tests__/navigation-store.test.js +0 -440
- package/dist/__tests__/navigation-store.test.js.map +0 -1
- package/dist/__tests__/partial-update.test.d.ts +0 -2
- package/dist/__tests__/partial-update.test.d.ts.map +0 -1
- package/dist/__tests__/partial-update.test.js +0 -1009
- package/dist/__tests__/partial-update.test.js.map +0 -1
- package/dist/__tests__/reverse-types.test.d.ts +0 -8
- package/dist/__tests__/reverse-types.test.d.ts.map +0 -1
- package/dist/__tests__/reverse-types.test.js +0 -656
- package/dist/__tests__/reverse-types.test.js.map +0 -1
- package/dist/__tests__/route-definition.test.d.ts +0 -2
- package/dist/__tests__/route-definition.test.d.ts.map +0 -1
- package/dist/__tests__/route-definition.test.js +0 -55
- package/dist/__tests__/route-definition.test.js.map +0 -1
- package/dist/__tests__/router-helpers.test.d.ts +0 -2
- package/dist/__tests__/router-helpers.test.d.ts.map +0 -1
- package/dist/__tests__/router-helpers.test.js +0 -377
- package/dist/__tests__/router-helpers.test.js.map +0 -1
- package/dist/__tests__/router-integration-2.test.d.ts +0 -2
- package/dist/__tests__/router-integration-2.test.d.ts.map +0 -1
- package/dist/__tests__/router-integration-2.test.js +0 -426
- package/dist/__tests__/router-integration-2.test.js.map +0 -1
- package/dist/__tests__/router-integration.test.d.ts +0 -2
- package/dist/__tests__/router-integration.test.d.ts.map +0 -1
- package/dist/__tests__/router-integration.test.js +0 -1051
- package/dist/__tests__/router-integration.test.js.map +0 -1
- package/dist/__tests__/search-params.test.d.ts +0 -5
- package/dist/__tests__/search-params.test.d.ts.map +0 -1
- package/dist/__tests__/search-params.test.js +0 -306
- package/dist/__tests__/search-params.test.js.map +0 -1
- package/dist/__tests__/segment-system.test.d.ts +0 -2
- package/dist/__tests__/segment-system.test.d.ts.map +0 -1
- package/dist/__tests__/segment-system.test.js +0 -627
- package/dist/__tests__/segment-system.test.js.map +0 -1
- package/dist/__tests__/static-handler-types.test.d.ts +0 -8
- package/dist/__tests__/static-handler-types.test.d.ts.map +0 -1
- package/dist/__tests__/static-handler-types.test.js +0 -63
- package/dist/__tests__/static-handler-types.test.js.map +0 -1
- package/dist/__tests__/urls.test.d.ts +0 -2
- package/dist/__tests__/urls.test.d.ts.map +0 -1
- package/dist/__tests__/urls.test.js +0 -421
- package/dist/__tests__/urls.test.js.map +0 -1
- package/dist/__tests__/use-mount.test.d.ts +0 -2
- package/dist/__tests__/use-mount.test.d.ts.map +0 -1
- package/dist/__tests__/use-mount.test.js +0 -35
- package/dist/__tests__/use-mount.test.js.map +0 -1
- package/dist/bin/rango.d.ts +0 -2
- package/dist/bin/rango.d.ts.map +0 -1
- package/dist/bin/rango.js.map +0 -1
- package/dist/browser/event-controller.d.ts +0 -191
- package/dist/browser/event-controller.d.ts.map +0 -1
- package/dist/browser/event-controller.js +0 -559
- package/dist/browser/event-controller.js.map +0 -1
- package/dist/browser/index.d.ts +0 -2
- package/dist/browser/index.d.ts.map +0 -1
- package/dist/browser/index.js +0 -14
- package/dist/browser/index.js.map +0 -1
- package/dist/browser/link-interceptor.d.ts +0 -38
- package/dist/browser/link-interceptor.d.ts.map +0 -1
- package/dist/browser/link-interceptor.js +0 -99
- package/dist/browser/link-interceptor.js.map +0 -1
- package/dist/browser/logging.d.ts +0 -10
- package/dist/browser/logging.d.ts.map +0 -1
- package/dist/browser/logging.js +0 -29
- package/dist/browser/logging.js.map +0 -1
- package/dist/browser/lru-cache.d.ts +0 -17
- package/dist/browser/lru-cache.d.ts.map +0 -1
- package/dist/browser/lru-cache.js +0 -50
- package/dist/browser/lru-cache.js.map +0 -1
- package/dist/browser/merge-segment-loaders.d.ts +0 -39
- package/dist/browser/merge-segment-loaders.d.ts.map +0 -1
- package/dist/browser/merge-segment-loaders.js +0 -102
- package/dist/browser/merge-segment-loaders.js.map +0 -1
- package/dist/browser/navigation-bridge.d.ts +0 -102
- package/dist/browser/navigation-bridge.d.ts.map +0 -1
- package/dist/browser/navigation-bridge.js +0 -708
- package/dist/browser/navigation-bridge.js.map +0 -1
- package/dist/browser/navigation-client.d.ts +0 -25
- package/dist/browser/navigation-client.d.ts.map +0 -1
- package/dist/browser/navigation-client.js +0 -157
- package/dist/browser/navigation-client.js.map +0 -1
- package/dist/browser/navigation-store.d.ts +0 -101
- package/dist/browser/navigation-store.d.ts.map +0 -1
- package/dist/browser/navigation-store.js +0 -625
- package/dist/browser/navigation-store.js.map +0 -1
- package/dist/browser/partial-update.d.ts +0 -75
- package/dist/browser/partial-update.d.ts.map +0 -1
- package/dist/browser/partial-update.js +0 -426
- package/dist/browser/partial-update.js.map +0 -1
- package/dist/browser/react/Link.d.ts +0 -86
- package/dist/browser/react/Link.d.ts.map +0 -1
- package/dist/browser/react/Link.js +0 -128
- package/dist/browser/react/Link.js.map +0 -1
- package/dist/browser/react/NavigationProvider.d.ts +0 -63
- package/dist/browser/react/NavigationProvider.d.ts.map +0 -1
- package/dist/browser/react/NavigationProvider.js +0 -216
- package/dist/browser/react/NavigationProvider.js.map +0 -1
- package/dist/browser/react/ScrollRestoration.d.ts +0 -75
- package/dist/browser/react/ScrollRestoration.d.ts.map +0 -1
- package/dist/browser/react/ScrollRestoration.js +0 -57
- package/dist/browser/react/ScrollRestoration.js.map +0 -1
- package/dist/browser/react/context.d.ts +0 -46
- package/dist/browser/react/context.d.ts.map +0 -1
- package/dist/browser/react/context.js +0 -10
- package/dist/browser/react/context.js.map +0 -1
- package/dist/browser/react/index.d.ts +0 -11
- package/dist/browser/react/index.d.ts.map +0 -1
- package/dist/browser/react/index.js +0 -22
- package/dist/browser/react/index.js.map +0 -1
- package/dist/browser/react/location-state-shared.d.ts +0 -63
- package/dist/browser/react/location-state-shared.d.ts.map +0 -1
- package/dist/browser/react/location-state-shared.js +0 -81
- package/dist/browser/react/location-state-shared.js.map +0 -1
- package/dist/browser/react/location-state.d.ts +0 -23
- package/dist/browser/react/location-state.d.ts.map +0 -1
- package/dist/browser/react/location-state.js +0 -29
- package/dist/browser/react/location-state.js.map +0 -1
- package/dist/browser/react/mount-context.d.ts +0 -24
- package/dist/browser/react/mount-context.d.ts.map +0 -1
- package/dist/browser/react/mount-context.js +0 -24
- package/dist/browser/react/mount-context.js.map +0 -1
- package/dist/browser/react/use-action.d.ts +0 -64
- package/dist/browser/react/use-action.d.ts.map +0 -1
- package/dist/browser/react/use-action.js +0 -134
- package/dist/browser/react/use-action.js.map +0 -1
- package/dist/browser/react/use-client-cache.d.ts +0 -41
- package/dist/browser/react/use-client-cache.d.ts.map +0 -1
- package/dist/browser/react/use-client-cache.js +0 -39
- package/dist/browser/react/use-client-cache.js.map +0 -1
- package/dist/browser/react/use-handle.d.ts +0 -31
- package/dist/browser/react/use-handle.d.ts.map +0 -1
- package/dist/browser/react/use-handle.js +0 -144
- package/dist/browser/react/use-handle.js.map +0 -1
- package/dist/browser/react/use-href.d.ts +0 -33
- package/dist/browser/react/use-href.d.ts.map +0 -1
- package/dist/browser/react/use-href.js +0 -39
- package/dist/browser/react/use-href.js.map +0 -1
- package/dist/browser/react/use-link-status.d.ts +0 -37
- package/dist/browser/react/use-link-status.d.ts.map +0 -1
- package/dist/browser/react/use-link-status.js +0 -99
- package/dist/browser/react/use-link-status.js.map +0 -1
- package/dist/browser/react/use-mount.d.ts +0 -25
- package/dist/browser/react/use-mount.d.ts.map +0 -1
- package/dist/browser/react/use-mount.js +0 -30
- package/dist/browser/react/use-mount.js.map +0 -1
- package/dist/browser/react/use-navigation.d.ts +0 -27
- package/dist/browser/react/use-navigation.d.ts.map +0 -1
- package/dist/browser/react/use-navigation.js +0 -87
- package/dist/browser/react/use-navigation.js.map +0 -1
- package/dist/browser/react/use-segments.d.ts +0 -38
- package/dist/browser/react/use-segments.d.ts.map +0 -1
- package/dist/browser/react/use-segments.js +0 -130
- package/dist/browser/react/use-segments.js.map +0 -1
- package/dist/browser/request-controller.d.ts +0 -26
- package/dist/browser/request-controller.d.ts.map +0 -1
- package/dist/browser/request-controller.js +0 -147
- package/dist/browser/request-controller.js.map +0 -1
- package/dist/browser/rsc-router.d.ts +0 -129
- package/dist/browser/rsc-router.d.ts.map +0 -1
- package/dist/browser/rsc-router.js +0 -195
- package/dist/browser/rsc-router.js.map +0 -1
- package/dist/browser/scroll-restoration.d.ts +0 -93
- package/dist/browser/scroll-restoration.d.ts.map +0 -1
- package/dist/browser/scroll-restoration.js +0 -321
- package/dist/browser/scroll-restoration.js.map +0 -1
- package/dist/browser/segment-structure-assert.d.ts +0 -17
- package/dist/browser/segment-structure-assert.d.ts.map +0 -1
- package/dist/browser/segment-structure-assert.js +0 -59
- package/dist/browser/segment-structure-assert.js.map +0 -1
- package/dist/browser/server-action-bridge.d.ts +0 -26
- package/dist/browser/server-action-bridge.d.ts.map +0 -1
- package/dist/browser/server-action-bridge.js +0 -668
- package/dist/browser/server-action-bridge.js.map +0 -1
- package/dist/browser/shallow.d.ts +0 -12
- package/dist/browser/shallow.d.ts.map +0 -1
- package/dist/browser/shallow.js +0 -34
- package/dist/browser/shallow.js.map +0 -1
- package/dist/browser/types.d.ts +0 -369
- package/dist/browser/types.d.ts.map +0 -1
- package/dist/browser/types.js +0 -2
- package/dist/browser/types.js.map +0 -1
- package/dist/build/__tests__/generate-cli.test.d.ts +0 -2
- package/dist/build/__tests__/generate-cli.test.d.ts.map +0 -1
- package/dist/build/__tests__/generate-cli.test.js +0 -237
- package/dist/build/__tests__/generate-cli.test.js.map +0 -1
- package/dist/build/__tests__/generate-manifest.test.d.ts +0 -2
- package/dist/build/__tests__/generate-manifest.test.d.ts.map +0 -1
- package/dist/build/__tests__/generate-manifest.test.js +0 -119
- package/dist/build/__tests__/generate-manifest.test.js.map +0 -1
- package/dist/build/__tests__/generate-route-types.test.d.ts +0 -2
- package/dist/build/__tests__/generate-route-types.test.d.ts.map +0 -1
- package/dist/build/__tests__/generate-route-types.test.js +0 -620
- package/dist/build/__tests__/generate-route-types.test.js.map +0 -1
- package/dist/build/__tests__/per-router-manifest.test.d.ts +0 -2
- package/dist/build/__tests__/per-router-manifest.test.d.ts.map +0 -1
- package/dist/build/__tests__/per-router-manifest.test.js +0 -308
- package/dist/build/__tests__/per-router-manifest.test.js.map +0 -1
- package/dist/build/generate-manifest.d.ts +0 -81
- package/dist/build/generate-manifest.d.ts.map +0 -1
- package/dist/build/generate-manifest.js +0 -276
- package/dist/build/generate-manifest.js.map +0 -1
- package/dist/build/generate-route-types.d.ts +0 -115
- package/dist/build/generate-route-types.d.ts.map +0 -1
- package/dist/build/generate-route-types.js +0 -740
- package/dist/build/generate-route-types.js.map +0 -1
- package/dist/build/index.d.ts +0 -21
- package/dist/build/index.d.ts.map +0 -1
- package/dist/build/index.js +0 -21
- package/dist/build/index.js.map +0 -1
- package/dist/build/route-trie.d.ts +0 -71
- package/dist/build/route-trie.d.ts.map +0 -1
- package/dist/build/route-trie.js +0 -175
- package/dist/build/route-trie.js.map +0 -1
- package/dist/cache/__tests__/cache-scope.test.d.ts +0 -2
- package/dist/cache/__tests__/cache-scope.test.d.ts.map +0 -1
- package/dist/cache/__tests__/cache-scope.test.js +0 -208
- package/dist/cache/__tests__/cache-scope.test.js.map +0 -1
- package/dist/cache/__tests__/document-cache.test.d.ts +0 -2
- package/dist/cache/__tests__/document-cache.test.d.ts.map +0 -1
- package/dist/cache/__tests__/document-cache.test.js +0 -345
- package/dist/cache/__tests__/document-cache.test.js.map +0 -1
- package/dist/cache/__tests__/memory-segment-store.test.d.ts +0 -2
- package/dist/cache/__tests__/memory-segment-store.test.d.ts.map +0 -1
- package/dist/cache/__tests__/memory-segment-store.test.js +0 -425
- package/dist/cache/__tests__/memory-segment-store.test.js.map +0 -1
- package/dist/cache/__tests__/memory-store.test.d.ts +0 -2
- package/dist/cache/__tests__/memory-store.test.d.ts.map +0 -1
- package/dist/cache/__tests__/memory-store.test.js +0 -367
- package/dist/cache/__tests__/memory-store.test.js.map +0 -1
- package/dist/cache/cache-scope.d.ts +0 -102
- package/dist/cache/cache-scope.d.ts.map +0 -1
- package/dist/cache/cache-scope.js +0 -440
- package/dist/cache/cache-scope.js.map +0 -1
- package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts +0 -2
- package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts.map +0 -1
- package/dist/cache/cf/__tests__/cf-cache-store.test.js +0 -330
- package/dist/cache/cf/__tests__/cf-cache-store.test.js.map +0 -1
- package/dist/cache/cf/cf-cache-store.d.ts +0 -165
- package/dist/cache/cf/cf-cache-store.d.ts.map +0 -1
- package/dist/cache/cf/cf-cache-store.js +0 -242
- package/dist/cache/cf/cf-cache-store.js.map +0 -1
- package/dist/cache/cf/index.d.ts +0 -14
- package/dist/cache/cf/index.d.ts.map +0 -1
- package/dist/cache/cf/index.js +0 -17
- package/dist/cache/cf/index.js.map +0 -1
- package/dist/cache/document-cache.d.ts +0 -64
- package/dist/cache/document-cache.d.ts.map +0 -1
- package/dist/cache/document-cache.js +0 -228
- package/dist/cache/document-cache.js.map +0 -1
- package/dist/cache/index.d.ts +0 -19
- package/dist/cache/index.d.ts.map +0 -1
- package/dist/cache/index.js +0 -21
- package/dist/cache/index.js.map +0 -1
- package/dist/cache/memory-segment-store.d.ts +0 -110
- package/dist/cache/memory-segment-store.d.ts.map +0 -1
- package/dist/cache/memory-segment-store.js +0 -117
- package/dist/cache/memory-segment-store.js.map +0 -1
- package/dist/cache/memory-store.d.ts +0 -41
- package/dist/cache/memory-store.d.ts.map +0 -1
- package/dist/cache/memory-store.js +0 -191
- package/dist/cache/memory-store.js.map +0 -1
- package/dist/cache/types.d.ts +0 -317
- package/dist/cache/types.d.ts.map +0 -1
- package/dist/cache/types.js +0 -12
- package/dist/cache/types.js.map +0 -1
- package/dist/client.d.ts +0 -248
- package/dist/client.d.ts.map +0 -1
- package/dist/client.js +0 -367
- package/dist/client.js.map +0 -1
- package/dist/client.rsc.d.ts +0 -26
- package/dist/client.rsc.d.ts.map +0 -1
- package/dist/client.rsc.js +0 -46
- package/dist/client.rsc.js.map +0 -1
- package/dist/component-utils.d.ts +0 -36
- package/dist/component-utils.d.ts.map +0 -1
- package/dist/component-utils.js +0 -61
- package/dist/component-utils.js.map +0 -1
- package/dist/components/DefaultDocument.d.ts +0 -13
- package/dist/components/DefaultDocument.d.ts.map +0 -1
- package/dist/components/DefaultDocument.js +0 -15
- package/dist/components/DefaultDocument.js.map +0 -1
- package/dist/debug.d.ts +0 -58
- package/dist/debug.d.ts.map +0 -1
- package/dist/debug.js +0 -157
- package/dist/debug.js.map +0 -1
- package/dist/default-error-boundary.d.ts +0 -11
- package/dist/default-error-boundary.d.ts.map +0 -1
- package/dist/default-error-boundary.js +0 -45
- package/dist/default-error-boundary.js.map +0 -1
- package/dist/deps/browser.d.ts +0 -2
- package/dist/deps/browser.d.ts.map +0 -1
- package/dist/deps/browser.js +0 -3
- package/dist/deps/browser.js.map +0 -1
- package/dist/deps/html-stream-client.d.ts +0 -2
- package/dist/deps/html-stream-client.d.ts.map +0 -1
- package/dist/deps/html-stream-client.js +0 -3
- package/dist/deps/html-stream-client.js.map +0 -1
- package/dist/deps/html-stream-server.d.ts +0 -2
- package/dist/deps/html-stream-server.d.ts.map +0 -1
- package/dist/deps/html-stream-server.js +0 -3
- package/dist/deps/html-stream-server.js.map +0 -1
- package/dist/deps/rsc.d.ts +0 -2
- package/dist/deps/rsc.d.ts.map +0 -1
- package/dist/deps/rsc.js +0 -4
- package/dist/deps/rsc.js.map +0 -1
- package/dist/deps/ssr.d.ts +0 -2
- package/dist/deps/ssr.d.ts.map +0 -1
- package/dist/deps/ssr.js +0 -3
- package/dist/deps/ssr.js.map +0 -1
- package/dist/errors.d.ts +0 -174
- package/dist/errors.d.ts.map +0 -1
- package/dist/errors.js +0 -241
- package/dist/errors.js.map +0 -1
- package/dist/handle.d.ts +0 -78
- package/dist/handle.d.ts.map +0 -1
- package/dist/handle.js +0 -82
- package/dist/handle.js.map +0 -1
- package/dist/handles/MetaTags.d.ts +0 -14
- package/dist/handles/MetaTags.d.ts.map +0 -1
- package/dist/handles/MetaTags.js +0 -136
- package/dist/handles/MetaTags.js.map +0 -1
- package/dist/handles/index.d.ts +0 -6
- package/dist/handles/index.d.ts.map +0 -1
- package/dist/handles/index.js +0 -6
- package/dist/handles/index.js.map +0 -1
- package/dist/handles/meta.d.ts +0 -39
- package/dist/handles/meta.d.ts.map +0 -1
- package/dist/handles/meta.js +0 -202
- package/dist/handles/meta.js.map +0 -1
- package/dist/host/__tests__/errors.test.d.ts +0 -2
- package/dist/host/__tests__/errors.test.d.ts.map +0 -1
- package/dist/host/__tests__/errors.test.js +0 -76
- package/dist/host/__tests__/errors.test.js.map +0 -1
- package/dist/host/__tests__/pattern-comprehensive.test.d.ts +0 -2
- package/dist/host/__tests__/pattern-comprehensive.test.d.ts.map +0 -1
- package/dist/host/__tests__/pattern-comprehensive.test.js +0 -732
- package/dist/host/__tests__/pattern-comprehensive.test.js.map +0 -1
- package/dist/host/__tests__/pattern-matcher.test.d.ts +0 -2
- package/dist/host/__tests__/pattern-matcher.test.d.ts.map +0 -1
- package/dist/host/__tests__/pattern-matcher.test.js +0 -251
- package/dist/host/__tests__/pattern-matcher.test.js.map +0 -1
- package/dist/host/__tests__/router.test.d.ts +0 -2
- package/dist/host/__tests__/router.test.d.ts.map +0 -1
- package/dist/host/__tests__/router.test.js +0 -241
- package/dist/host/__tests__/router.test.js.map +0 -1
- package/dist/host/__tests__/testing.test.d.ts +0 -2
- package/dist/host/__tests__/testing.test.d.ts.map +0 -1
- package/dist/host/__tests__/testing.test.js +0 -64
- package/dist/host/__tests__/testing.test.js.map +0 -1
- package/dist/host/__tests__/utils.test.d.ts +0 -2
- package/dist/host/__tests__/utils.test.d.ts.map +0 -1
- package/dist/host/__tests__/utils.test.js +0 -29
- package/dist/host/__tests__/utils.test.js.map +0 -1
- package/dist/host/cookie-handler.d.ts +0 -34
- package/dist/host/cookie-handler.d.ts.map +0 -1
- package/dist/host/cookie-handler.js +0 -124
- package/dist/host/cookie-handler.js.map +0 -1
- package/dist/host/errors.d.ts +0 -56
- package/dist/host/errors.d.ts.map +0 -1
- package/dist/host/errors.js +0 -79
- package/dist/host/errors.js.map +0 -1
- package/dist/host/index.d.ts +0 -29
- package/dist/host/index.d.ts.map +0 -1
- package/dist/host/index.js +0 -32
- package/dist/host/index.js.map +0 -1
- package/dist/host/pattern-matcher.d.ts +0 -36
- package/dist/host/pattern-matcher.d.ts.map +0 -1
- package/dist/host/pattern-matcher.js +0 -172
- package/dist/host/pattern-matcher.js.map +0 -1
- package/dist/host/router.d.ts +0 -26
- package/dist/host/router.d.ts.map +0 -1
- package/dist/host/router.js +0 -218
- package/dist/host/router.js.map +0 -1
- package/dist/host/testing.d.ts +0 -36
- package/dist/host/testing.d.ts.map +0 -1
- package/dist/host/testing.js +0 -55
- package/dist/host/testing.js.map +0 -1
- package/dist/host/types.d.ts +0 -115
- package/dist/host/types.d.ts.map +0 -1
- package/dist/host/types.js +0 -7
- package/dist/host/types.js.map +0 -1
- package/dist/host/utils.d.ts +0 -21
- package/dist/host/utils.d.ts.map +0 -1
- package/dist/host/utils.js +0 -23
- package/dist/host/utils.js.map +0 -1
- package/dist/href-client.d.ts +0 -131
- package/dist/href-client.d.ts.map +0 -1
- package/dist/href-client.js +0 -64
- package/dist/href-client.js.map +0 -1
- package/dist/href-context.d.ts +0 -29
- package/dist/href-context.d.ts.map +0 -1
- package/dist/href-context.js +0 -21
- package/dist/href-context.js.map +0 -1
- package/dist/index.d.ts +0 -73
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -91
- package/dist/index.js.map +0 -1
- package/dist/index.rsc.d.ts +0 -32
- package/dist/index.rsc.d.ts.map +0 -1
- package/dist/index.rsc.js +0 -40
- package/dist/index.rsc.js.map +0 -1
- package/dist/internal-debug.d.ts +0 -2
- package/dist/internal-debug.d.ts.map +0 -1
- package/dist/internal-debug.js +0 -5
- package/dist/internal-debug.js.map +0 -1
- package/dist/loader.d.ts +0 -14
- package/dist/loader.d.ts.map +0 -1
- package/dist/loader.js +0 -20
- package/dist/loader.js.map +0 -1
- package/dist/loader.rsc.d.ts +0 -19
- package/dist/loader.rsc.d.ts.map +0 -1
- package/dist/loader.rsc.js +0 -99
- package/dist/loader.rsc.js.map +0 -1
- package/dist/network-error-thrower.d.ts +0 -17
- package/dist/network-error-thrower.d.ts.map +0 -1
- package/dist/network-error-thrower.js +0 -14
- package/dist/network-error-thrower.js.map +0 -1
- package/dist/outlet-context.d.ts +0 -13
- package/dist/outlet-context.d.ts.map +0 -1
- package/dist/outlet-context.js +0 -3
- package/dist/outlet-context.js.map +0 -1
- package/dist/prerender/__tests__/param-hash.test.d.ts +0 -2
- package/dist/prerender/__tests__/param-hash.test.d.ts.map +0 -1
- package/dist/prerender/__tests__/param-hash.test.js +0 -148
- package/dist/prerender/__tests__/param-hash.test.js.map +0 -1
- package/dist/prerender/param-hash.d.ts +0 -16
- package/dist/prerender/param-hash.d.ts.map +0 -1
- package/dist/prerender/param-hash.js +0 -36
- package/dist/prerender/param-hash.js.map +0 -1
- package/dist/prerender/store.d.ts +0 -38
- package/dist/prerender/store.d.ts.map +0 -1
- package/dist/prerender/store.js +0 -61
- package/dist/prerender/store.js.map +0 -1
- package/dist/prerender.d.ts +0 -66
- package/dist/prerender.d.ts.map +0 -1
- package/dist/prerender.js +0 -57
- package/dist/prerender.js.map +0 -1
- package/dist/reverse.d.ts +0 -196
- package/dist/reverse.d.ts.map +0 -1
- package/dist/reverse.js +0 -78
- package/dist/reverse.js.map +0 -1
- package/dist/root-error-boundary.d.ts +0 -33
- package/dist/root-error-boundary.d.ts.map +0 -1
- package/dist/root-error-boundary.js +0 -165
- package/dist/root-error-boundary.js.map +0 -1
- package/dist/route-content-wrapper.d.ts +0 -46
- package/dist/route-content-wrapper.d.ts.map +0 -1
- package/dist/route-content-wrapper.js +0 -77
- package/dist/route-content-wrapper.js.map +0 -1
- package/dist/route-definition.d.ts +0 -421
- package/dist/route-definition.d.ts.map +0 -1
- package/dist/route-definition.js +0 -868
- package/dist/route-definition.js.map +0 -1
- package/dist/route-map-builder.d.ts +0 -155
- package/dist/route-map-builder.d.ts.map +0 -1
- package/dist/route-map-builder.js +0 -237
- package/dist/route-map-builder.js.map +0 -1
- package/dist/route-types.d.ts +0 -165
- package/dist/route-types.d.ts.map +0 -1
- package/dist/route-types.js +0 -7
- package/dist/route-types.js.map +0 -1
- package/dist/router/__tests__/handler-context.test.d.ts +0 -2
- package/dist/router/__tests__/handler-context.test.d.ts.map +0 -1
- package/dist/router/__tests__/handler-context.test.js +0 -65
- package/dist/router/__tests__/handler-context.test.js.map +0 -1
- package/dist/router/__tests__/loader-cycle-detection.test.d.ts +0 -2
- package/dist/router/__tests__/loader-cycle-detection.test.d.ts.map +0 -1
- package/dist/router/__tests__/loader-cycle-detection.test.js +0 -221
- package/dist/router/__tests__/loader-cycle-detection.test.js.map +0 -1
- package/dist/router/__tests__/match-context.test.d.ts +0 -2
- package/dist/router/__tests__/match-context.test.d.ts.map +0 -1
- package/dist/router/__tests__/match-context.test.js +0 -92
- package/dist/router/__tests__/match-context.test.js.map +0 -1
- package/dist/router/__tests__/match-pipelines.test.d.ts +0 -2
- package/dist/router/__tests__/match-pipelines.test.d.ts.map +0 -1
- package/dist/router/__tests__/match-pipelines.test.js +0 -417
- package/dist/router/__tests__/match-pipelines.test.js.map +0 -1
- package/dist/router/__tests__/match-result.test.d.ts +0 -2
- package/dist/router/__tests__/match-result.test.d.ts.map +0 -1
- package/dist/router/__tests__/match-result.test.js +0 -457
- package/dist/router/__tests__/match-result.test.js.map +0 -1
- package/dist/router/__tests__/on-error.test.d.ts +0 -2
- package/dist/router/__tests__/on-error.test.d.ts.map +0 -1
- package/dist/router/__tests__/on-error.test.js +0 -678
- package/dist/router/__tests__/on-error.test.js.map +0 -1
- package/dist/router/__tests__/pattern-matching.test.d.ts +0 -2
- package/dist/router/__tests__/pattern-matching.test.d.ts.map +0 -1
- package/dist/router/__tests__/pattern-matching.test.js +0 -629
- package/dist/router/__tests__/pattern-matching.test.js.map +0 -1
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts +0 -2
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts.map +0 -1
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.js +0 -155
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.js.map +0 -1
- package/dist/router/error-handling.d.ts +0 -77
- package/dist/router/error-handling.d.ts.map +0 -1
- package/dist/router/error-handling.js +0 -202
- package/dist/router/error-handling.js.map +0 -1
- package/dist/router/handler-context.d.ts +0 -20
- package/dist/router/handler-context.d.ts.map +0 -1
- package/dist/router/handler-context.js +0 -198
- package/dist/router/handler-context.js.map +0 -1
- package/dist/router/intercept-resolution.d.ts +0 -66
- package/dist/router/intercept-resolution.d.ts.map +0 -1
- package/dist/router/intercept-resolution.js +0 -246
- package/dist/router/intercept-resolution.js.map +0 -1
- package/dist/router/loader-resolution.d.ts +0 -64
- package/dist/router/loader-resolution.d.ts.map +0 -1
- package/dist/router/loader-resolution.js +0 -284
- package/dist/router/loader-resolution.js.map +0 -1
- package/dist/router/logging.d.ts +0 -15
- package/dist/router/logging.d.ts.map +0 -1
- package/dist/router/logging.js +0 -99
- package/dist/router/logging.js.map +0 -1
- package/dist/router/manifest.d.ts +0 -22
- package/dist/router/manifest.d.ts.map +0 -1
- package/dist/router/manifest.js +0 -181
- package/dist/router/manifest.js.map +0 -1
- package/dist/router/match-api.d.ts +0 -35
- package/dist/router/match-api.d.ts.map +0 -1
- package/dist/router/match-api.js +0 -406
- package/dist/router/match-api.js.map +0 -1
- package/dist/router/match-context.d.ts +0 -206
- package/dist/router/match-context.d.ts.map +0 -1
- package/dist/router/match-context.js +0 -17
- package/dist/router/match-context.js.map +0 -1
- package/dist/router/match-middleware/background-revalidation.d.ts +0 -127
- package/dist/router/match-middleware/background-revalidation.d.ts.map +0 -1
- package/dist/router/match-middleware/background-revalidation.js +0 -75
- package/dist/router/match-middleware/background-revalidation.js.map +0 -1
- package/dist/router/match-middleware/cache-lookup.d.ts +0 -112
- package/dist/router/match-middleware/cache-lookup.d.ts.map +0 -1
- package/dist/router/match-middleware/cache-lookup.js +0 -257
- package/dist/router/match-middleware/cache-lookup.js.map +0 -1
- package/dist/router/match-middleware/cache-store.d.ts +0 -113
- package/dist/router/match-middleware/cache-store.d.ts.map +0 -1
- package/dist/router/match-middleware/cache-store.js +0 -108
- package/dist/router/match-middleware/cache-store.js.map +0 -1
- package/dist/router/match-middleware/index.d.ts +0 -81
- package/dist/router/match-middleware/index.d.ts.map +0 -1
- package/dist/router/match-middleware/index.js +0 -80
- package/dist/router/match-middleware/index.js.map +0 -1
- package/dist/router/match-middleware/intercept-resolution.d.ts +0 -117
- package/dist/router/match-middleware/intercept-resolution.d.ts.map +0 -1
- package/dist/router/match-middleware/intercept-resolution.js +0 -134
- package/dist/router/match-middleware/intercept-resolution.js.map +0 -1
- package/dist/router/match-middleware/segment-resolution.d.ts +0 -99
- package/dist/router/match-middleware/segment-resolution.d.ts.map +0 -1
- package/dist/router/match-middleware/segment-resolution.js +0 -53
- package/dist/router/match-middleware/segment-resolution.js.map +0 -1
- package/dist/router/match-pipelines.d.ts +0 -147
- package/dist/router/match-pipelines.d.ts.map +0 -1
- package/dist/router/match-pipelines.js +0 -82
- package/dist/router/match-pipelines.js.map +0 -1
- package/dist/router/match-result.d.ts +0 -126
- package/dist/router/match-result.d.ts.map +0 -1
- package/dist/router/match-result.js +0 -93
- package/dist/router/match-result.js.map +0 -1
- package/dist/router/metrics.d.ts +0 -20
- package/dist/router/metrics.d.ts.map +0 -1
- package/dist/router/metrics.js +0 -47
- package/dist/router/metrics.js.map +0 -1
- package/dist/router/middleware.d.ts +0 -249
- package/dist/router/middleware.d.ts.map +0 -1
- package/dist/router/middleware.js +0 -434
- package/dist/router/middleware.js.map +0 -1
- package/dist/router/middleware.test.d.ts +0 -2
- package/dist/router/middleware.test.d.ts.map +0 -1
- package/dist/router/middleware.test.js +0 -816
- package/dist/router/middleware.test.js.map +0 -1
- package/dist/router/pattern-matching.d.ts +0 -149
- package/dist/router/pattern-matching.d.ts.map +0 -1
- package/dist/router/pattern-matching.js +0 -349
- package/dist/router/pattern-matching.js.map +0 -1
- package/dist/router/revalidation.d.ts +0 -44
- package/dist/router/revalidation.d.ts.map +0 -1
- package/dist/router/revalidation.js +0 -147
- package/dist/router/revalidation.js.map +0 -1
- package/dist/router/router-context.d.ts +0 -135
- package/dist/router/router-context.d.ts.map +0 -1
- package/dist/router/router-context.js +0 -36
- package/dist/router/router-context.js.map +0 -1
- package/dist/router/segment-resolution.d.ts +0 -127
- package/dist/router/segment-resolution.d.ts.map +0 -1
- package/dist/router/segment-resolution.js +0 -919
- package/dist/router/segment-resolution.js.map +0 -1
- package/dist/router/trie-matching.d.ts +0 -40
- package/dist/router/trie-matching.d.ts.map +0 -1
- package/dist/router/trie-matching.js +0 -127
- package/dist/router/trie-matching.js.map +0 -1
- package/dist/router/types.d.ts +0 -136
- package/dist/router/types.d.ts.map +0 -1
- package/dist/router/types.js +0 -7
- package/dist/router/types.js.map +0 -1
- package/dist/router.d.ts +0 -753
- package/dist/router.d.ts.map +0 -1
- package/dist/router.gen.d.ts +0 -6
- package/dist/router.gen.d.ts.map +0 -1
- package/dist/router.gen.js +0 -6
- package/dist/router.gen.js.map +0 -1
- package/dist/router.js +0 -1304
- package/dist/router.js.map +0 -1
- package/dist/rsc/__tests__/helpers.test.d.ts +0 -2
- package/dist/rsc/__tests__/helpers.test.d.ts.map +0 -1
- package/dist/rsc/__tests__/helpers.test.js +0 -140
- package/dist/rsc/__tests__/helpers.test.js.map +0 -1
- package/dist/rsc/handler.d.ts +0 -45
- package/dist/rsc/handler.d.ts.map +0 -1
- package/dist/rsc/handler.js +0 -1172
- package/dist/rsc/handler.js.map +0 -1
- package/dist/rsc/helpers.d.ts +0 -16
- package/dist/rsc/helpers.d.ts.map +0 -1
- package/dist/rsc/helpers.js +0 -55
- package/dist/rsc/helpers.js.map +0 -1
- package/dist/rsc/index.d.ts +0 -22
- package/dist/rsc/index.d.ts.map +0 -1
- package/dist/rsc/index.js +0 -23
- package/dist/rsc/index.js.map +0 -1
- package/dist/rsc/nonce.d.ts +0 -9
- package/dist/rsc/nonce.d.ts.map +0 -1
- package/dist/rsc/nonce.js +0 -18
- package/dist/rsc/nonce.js.map +0 -1
- package/dist/rsc/types.d.ts +0 -206
- package/dist/rsc/types.d.ts.map +0 -1
- package/dist/rsc/types.js +0 -8
- package/dist/rsc/types.js.map +0 -1
- package/dist/search-params.d.ts +0 -103
- package/dist/search-params.d.ts.map +0 -1
- package/dist/search-params.js +0 -74
- package/dist/search-params.js.map +0 -1
- package/dist/segment-system.d.ts +0 -75
- package/dist/segment-system.d.ts.map +0 -1
- package/dist/segment-system.js +0 -336
- package/dist/segment-system.js.map +0 -1
- package/dist/server/context.d.ts +0 -245
- package/dist/server/context.d.ts.map +0 -1
- package/dist/server/context.js +0 -197
- package/dist/server/context.js.map +0 -1
- package/dist/server/fetchable-loader-store.d.ts +0 -18
- package/dist/server/fetchable-loader-store.d.ts.map +0 -1
- package/dist/server/fetchable-loader-store.js +0 -18
- package/dist/server/fetchable-loader-store.js.map +0 -1
- package/dist/server/handle-store.d.ts +0 -85
- package/dist/server/handle-store.d.ts.map +0 -1
- package/dist/server/handle-store.js +0 -142
- package/dist/server/handle-store.js.map +0 -1
- package/dist/server/loader-registry.d.ts +0 -55
- package/dist/server/loader-registry.d.ts.map +0 -1
- package/dist/server/loader-registry.js +0 -132
- package/dist/server/loader-registry.js.map +0 -1
- package/dist/server/request-context.d.ts +0 -226
- package/dist/server/request-context.d.ts.map +0 -1
- package/dist/server/request-context.js +0 -290
- package/dist/server/request-context.js.map +0 -1
- package/dist/server/root-layout.d.ts +0 -4
- package/dist/server/root-layout.d.ts.map +0 -1
- package/dist/server/root-layout.js +0 -5
- package/dist/server/root-layout.js.map +0 -1
- package/dist/server.d.ts +0 -15
- package/dist/server.d.ts.map +0 -1
- package/dist/server.js +0 -20
- package/dist/server.js.map +0 -1
- package/dist/ssr/__tests__/ssr-handler.test.d.ts +0 -2
- package/dist/ssr/__tests__/ssr-handler.test.d.ts.map +0 -1
- package/dist/ssr/__tests__/ssr-handler.test.js +0 -132
- package/dist/ssr/__tests__/ssr-handler.test.js.map +0 -1
- package/dist/ssr/index.d.ts +0 -98
- package/dist/ssr/index.d.ts.map +0 -1
- package/dist/ssr/index.js +0 -158
- package/dist/ssr/index.js.map +0 -1
- package/dist/static-handler.d.ts +0 -50
- package/dist/static-handler.d.ts.map +0 -1
- package/dist/static-handler.gen.d.ts +0 -5
- package/dist/static-handler.gen.d.ts.map +0 -1
- package/dist/static-handler.gen.js +0 -5
- package/dist/static-handler.gen.js.map +0 -1
- package/dist/static-handler.js +0 -29
- package/dist/static-handler.js.map +0 -1
- package/dist/theme/ThemeProvider.d.ts +0 -20
- package/dist/theme/ThemeProvider.d.ts.map +0 -1
- package/dist/theme/ThemeProvider.js +0 -240
- package/dist/theme/ThemeProvider.js.map +0 -1
- package/dist/theme/ThemeScript.d.ts +0 -48
- package/dist/theme/ThemeScript.d.ts.map +0 -1
- package/dist/theme/ThemeScript.js +0 -13
- package/dist/theme/ThemeScript.js.map +0 -1
- package/dist/theme/__tests__/theme.test.d.ts +0 -2
- package/dist/theme/__tests__/theme.test.d.ts.map +0 -1
- package/dist/theme/__tests__/theme.test.js +0 -103
- package/dist/theme/__tests__/theme.test.js.map +0 -1
- package/dist/theme/constants.d.ts +0 -29
- package/dist/theme/constants.d.ts.map +0 -1
- package/dist/theme/constants.js +0 -48
- package/dist/theme/constants.js.map +0 -1
- package/dist/theme/index.d.ts +0 -31
- package/dist/theme/index.d.ts.map +0 -1
- package/dist/theme/index.js +0 -36
- package/dist/theme/index.js.map +0 -1
- package/dist/theme/theme-context.d.ts +0 -40
- package/dist/theme/theme-context.d.ts.map +0 -1
- package/dist/theme/theme-context.js +0 -60
- package/dist/theme/theme-context.js.map +0 -1
- package/dist/theme/theme-script.d.ts +0 -27
- package/dist/theme/theme-script.d.ts.map +0 -1
- package/dist/theme/theme-script.js +0 -147
- package/dist/theme/theme-script.js.map +0 -1
- package/dist/theme/types.d.ts +0 -163
- package/dist/theme/types.d.ts.map +0 -1
- package/dist/theme/types.js +0 -11
- package/dist/theme/types.js.map +0 -1
- package/dist/theme/use-theme.d.ts +0 -12
- package/dist/theme/use-theme.d.ts.map +0 -1
- package/dist/theme/use-theme.js +0 -40
- package/dist/theme/use-theme.js.map +0 -1
- package/dist/types.d.ts +0 -1479
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js +0 -10
- package/dist/types.js.map +0 -1
- package/dist/urls.d.ts +0 -441
- package/dist/urls.d.ts.map +0 -1
- package/dist/urls.gen.d.ts +0 -8
- package/dist/urls.gen.d.ts.map +0 -1
- package/dist/urls.gen.js +0 -8
- package/dist/urls.gen.js.map +0 -1
- package/dist/urls.js +0 -443
- package/dist/urls.js.map +0 -1
- package/dist/use-loader.d.ts +0 -127
- package/dist/use-loader.d.ts.map +0 -1
- package/dist/use-loader.js +0 -237
- package/dist/use-loader.js.map +0 -1
- package/dist/vite/__tests__/ast-handler-extract.test.d.ts +0 -2
- package/dist/vite/__tests__/ast-handler-extract.test.d.ts.map +0 -1
- package/dist/vite/__tests__/ast-handler-extract.test.js +0 -294
- package/dist/vite/__tests__/ast-handler-extract.test.js.map +0 -1
- package/dist/vite/__tests__/expose-id-utils.test.d.ts +0 -2
- package/dist/vite/__tests__/expose-id-utils.test.d.ts.map +0 -1
- package/dist/vite/__tests__/expose-id-utils.test.js +0 -224
- package/dist/vite/__tests__/expose-id-utils.test.js.map +0 -1
- package/dist/vite/__tests__/expose-internal-ids.test.d.ts +0 -2
- package/dist/vite/__tests__/expose-internal-ids.test.d.ts.map +0 -1
- package/dist/vite/__tests__/expose-internal-ids.test.js +0 -647
- package/dist/vite/__tests__/expose-internal-ids.test.js.map +0 -1
- package/dist/vite/__tests__/expose-router-id.test.d.ts +0 -2
- package/dist/vite/__tests__/expose-router-id.test.d.ts.map +0 -1
- package/dist/vite/__tests__/expose-router-id.test.js +0 -39
- package/dist/vite/__tests__/expose-router-id.test.js.map +0 -1
- package/dist/vite/ast-handler-extract.d.ts +0 -49
- package/dist/vite/ast-handler-extract.d.ts.map +0 -1
- package/dist/vite/ast-handler-extract.js +0 -249
- package/dist/vite/ast-handler-extract.js.map +0 -1
- package/dist/vite/expose-action-id.d.ts +0 -19
- package/dist/vite/expose-action-id.d.ts.map +0 -1
- package/dist/vite/expose-action-id.js +0 -250
- package/dist/vite/expose-action-id.js.map +0 -1
- package/dist/vite/expose-id-utils.d.ts +0 -69
- package/dist/vite/expose-id-utils.d.ts.map +0 -1
- package/dist/vite/expose-id-utils.js +0 -289
- package/dist/vite/expose-id-utils.js.map +0 -1
- package/dist/vite/expose-internal-ids.d.ts +0 -22
- package/dist/vite/expose-internal-ids.d.ts.map +0 -1
- package/dist/vite/expose-internal-ids.js +0 -886
- package/dist/vite/expose-internal-ids.js.map +0 -1
- package/dist/vite/index.d.ts +0 -149
- package/dist/vite/index.d.ts.map +0 -1
- package/dist/vite/index.js.bak +0 -5448
- package/dist/vite/index.js.map +0 -1
- package/dist/vite/index.named-routes.gen.ts +0 -103
- package/dist/vite/package-resolution.d.ts +0 -43
- package/dist/vite/package-resolution.d.ts.map +0 -1
- package/dist/vite/package-resolution.js +0 -112
- package/dist/vite/package-resolution.js.map +0 -1
- package/dist/vite/virtual-entries.d.ts +0 -25
- package/dist/vite/virtual-entries.d.ts.map +0 -1
- package/dist/vite/virtual-entries.js +0 -110
- package/dist/vite/virtual-entries.js.map +0 -1
- package/src/network-error-thrower.tsx +0 -18
|
@@ -28,14 +28,28 @@ const DEFAULT_ACTION_STATE: TrackedActionState = {
|
|
|
28
28
|
// Maximum number of history entries to cache (URLs visited)
|
|
29
29
|
const HISTORY_CACHE_SIZE = 20;
|
|
30
30
|
|
|
31
|
-
// Cache entry:
|
|
32
|
-
// stale
|
|
31
|
+
// Cache entry:
|
|
32
|
+
// [url-key, segments, stale, handleData?, routerId?, navInstance?, handlesPending?]
|
|
33
|
+
// stale=true means the data may be outdated and should be revalidated on access.
|
|
34
|
+
// navInstance is the monotonic nav-instance token (see navInstance below): it
|
|
35
|
+
// identifies the per-commit visit that owns this entry. generateHistoryKey is
|
|
36
|
+
// URL-only, so A->B->A reuses the same key; the token lets a late async
|
|
37
|
+
// resolution tell its own visit's entry apart from a newer same-URL visit's, so
|
|
38
|
+
// a stale nav can never clobber a fresher one.
|
|
39
|
+
// handlesPending=true means the entry's handle data is INCOMPLETE (a deferred
|
|
40
|
+
// Meta was still pending when the user navigated away, so it never streamed). A
|
|
41
|
+
// popstate return must REVALIDATE WITH A FULL RE-RENDER (no client segment IDs)
|
|
42
|
+
// to re-stream the handles — a diff-only revalidation omits unchanged segments'
|
|
43
|
+
// handles, so the deferred Meta would never land. Cleared once the deferred Meta
|
|
44
|
+
// resolves while the entry is still owned.
|
|
33
45
|
type HistoryCacheEntry = [
|
|
34
46
|
string,
|
|
35
47
|
ResolvedSegment[],
|
|
36
48
|
boolean,
|
|
37
49
|
HandleData?,
|
|
38
50
|
string?,
|
|
51
|
+
number?,
|
|
52
|
+
boolean?,
|
|
39
53
|
];
|
|
40
54
|
|
|
41
55
|
/**
|
|
@@ -44,7 +58,7 @@ type HistoryCacheEntry = [
|
|
|
44
58
|
* since mutations happen at the array level, not on individual data objects.
|
|
45
59
|
* This preserves any non-serializable types (React elements, functions, etc.)
|
|
46
60
|
*/
|
|
47
|
-
function cloneHandleData(handleData: HandleData): HandleData {
|
|
61
|
+
export function cloneHandleData(handleData: HandleData): HandleData {
|
|
48
62
|
const cloned: HandleData = {};
|
|
49
63
|
for (const [handleKey, segmentMap] of Object.entries(handleData)) {
|
|
50
64
|
cloned[handleKey] = {};
|
|
@@ -239,6 +253,14 @@ export function createNavigationStore(
|
|
|
239
253
|
// Oldest entries (at front) are removed when over cacheSize limit
|
|
240
254
|
const historyCache: HistoryCacheEntry[] = [];
|
|
241
255
|
|
|
256
|
+
// Monotonic nav-instance token. Bumped each time a cache entry is created or
|
|
257
|
+
// replaced in cacheSegmentsForHistory (i.e. once per commit). Because
|
|
258
|
+
// generateHistoryKey is URL-only, two visits to the same URL share a key; this
|
|
259
|
+
// token gives each visit a distinct identity so a late async handle resolution
|
|
260
|
+
// can tell whether it still owns the live page / the target cache entry, and
|
|
261
|
+
// never overwrite a newer same-URL visit's state.
|
|
262
|
+
let navInstance = 0;
|
|
263
|
+
|
|
242
264
|
// Current history key (set on navigation, stored in history.state)
|
|
243
265
|
let currentHistoryKey = config?.initialHistoryKey || generateHistoryKey();
|
|
244
266
|
|
|
@@ -248,6 +270,10 @@ export function createNavigationStore(
|
|
|
248
270
|
config.initialHistoryKey,
|
|
249
271
|
config.initialSegments,
|
|
250
272
|
false,
|
|
273
|
+
undefined,
|
|
274
|
+
undefined,
|
|
275
|
+
++navInstance,
|
|
276
|
+
false,
|
|
251
277
|
]);
|
|
252
278
|
}
|
|
253
279
|
|
|
@@ -565,6 +591,29 @@ export function createNavigationStore(
|
|
|
565
591
|
currentHistoryKey = key;
|
|
566
592
|
},
|
|
567
593
|
|
|
594
|
+
/**
|
|
595
|
+
* Current nav-instance token: the instance of the most recently committed
|
|
596
|
+
* navigation (the value last written by cacheSegmentsForHistory). A late
|
|
597
|
+
* async handle resolution captures this at the start of its own nav and
|
|
598
|
+
* compares it back here to detect whether a NEWER navigation has since
|
|
599
|
+
* committed (token advanced), guarding against a stale nav writing a fresher
|
|
600
|
+
* nav's live state.
|
|
601
|
+
*/
|
|
602
|
+
getNavInstance(): number {
|
|
603
|
+
return navInstance;
|
|
604
|
+
},
|
|
605
|
+
|
|
606
|
+
/**
|
|
607
|
+
* The nav-instance token recorded on a specific cache entry, or undefined if
|
|
608
|
+
* no entry exists for that key. Because the history key is URL-only, this is
|
|
609
|
+
* how a late resolution tells "the entry I seeded is still mine" from "a
|
|
610
|
+
* newer same-URL visit replaced my entry".
|
|
611
|
+
*/
|
|
612
|
+
getCacheEntryInstance(historyKey: string): number | undefined {
|
|
613
|
+
const entry = historyCache.find(([key]) => key === historyKey);
|
|
614
|
+
return entry ? entry[5] : undefined;
|
|
615
|
+
},
|
|
616
|
+
|
|
568
617
|
/**
|
|
569
618
|
* Store segments for a history entry
|
|
570
619
|
* Updates existing entry if key exists, otherwise adds new entry
|
|
@@ -583,6 +632,11 @@ export function createNavigationStore(
|
|
|
583
632
|
? cloneHandleData(handleData)
|
|
584
633
|
: undefined;
|
|
585
634
|
|
|
635
|
+
// Each commit (create or replace) is a new nav instance. The bump happens
|
|
636
|
+
// here, exactly once per cacheSegmentsForHistory call, so getNavInstance()
|
|
637
|
+
// reflects the visit whose entry this is.
|
|
638
|
+
const instance = ++navInstance;
|
|
639
|
+
|
|
586
640
|
// Check if entry already exists and update it
|
|
587
641
|
const existingIndex = historyCache.findIndex(
|
|
588
642
|
([key]) => key === historyKey,
|
|
@@ -594,6 +648,8 @@ export function createNavigationStore(
|
|
|
594
648
|
false,
|
|
595
649
|
clonedHandleData,
|
|
596
650
|
currentRouterId,
|
|
651
|
+
instance,
|
|
652
|
+
false, // fresh commit: handles complete unless a deferred apply marks it
|
|
597
653
|
];
|
|
598
654
|
} else {
|
|
599
655
|
// Add new entry at the end (not stale)
|
|
@@ -603,6 +659,8 @@ export function createNavigationStore(
|
|
|
603
659
|
false,
|
|
604
660
|
clonedHandleData,
|
|
605
661
|
currentRouterId,
|
|
662
|
+
instance,
|
|
663
|
+
false,
|
|
606
664
|
]);
|
|
607
665
|
// Remove oldest entries if over limit
|
|
608
666
|
while (historyCache.length > cacheSize) {
|
|
@@ -621,6 +679,7 @@ export function createNavigationStore(
|
|
|
621
679
|
stale: boolean;
|
|
622
680
|
handleData?: HandleData;
|
|
623
681
|
routerId?: string;
|
|
682
|
+
handlesPending?: boolean;
|
|
624
683
|
}
|
|
625
684
|
| undefined {
|
|
626
685
|
const entry = historyCache.find(([key]) => key === historyKey);
|
|
@@ -630,6 +689,7 @@ export function createNavigationStore(
|
|
|
630
689
|
stale: entry[2],
|
|
631
690
|
handleData: entry[3],
|
|
632
691
|
routerId: entry[4],
|
|
692
|
+
handlesPending: entry[6],
|
|
633
693
|
};
|
|
634
694
|
},
|
|
635
695
|
|
|
@@ -641,11 +701,23 @@ export function createNavigationStore(
|
|
|
641
701
|
},
|
|
642
702
|
|
|
643
703
|
/**
|
|
644
|
-
* Update only the handleData for an existing
|
|
645
|
-
* Does nothing if the cache entry doesn't exist
|
|
646
|
-
*
|
|
704
|
+
* Update only the handleData (and optionally the stale flag) for an existing
|
|
705
|
+
* cache entry. Does nothing if the cache entry doesn't exist.
|
|
706
|
+
*
|
|
707
|
+
* Used to fix stale handleData after async handles processing AND to flip an
|
|
708
|
+
* entry's stale / handlesPending bits for the deferred-Meta
|
|
709
|
+
* invalidate+revalidate path: while a nav's Meta is deferred-pending its
|
|
710
|
+
* entry is marked stale + handlesPending (a popstate return then revalidates
|
|
711
|
+
* with a full re-render instead of serving the carry/seed as fresh), and once
|
|
712
|
+
* the deferred Meta resolves both are cleared. When a flag is omitted the
|
|
713
|
+
* entry's current value is preserved.
|
|
647
714
|
*/
|
|
648
|
-
updateCacheHandleData(
|
|
715
|
+
updateCacheHandleData(
|
|
716
|
+
historyKey: string,
|
|
717
|
+
handleData: HandleData,
|
|
718
|
+
stale?: boolean,
|
|
719
|
+
handlesPending?: boolean,
|
|
720
|
+
): void {
|
|
649
721
|
const existingIndex = historyCache.findIndex(
|
|
650
722
|
([key]) => key === historyKey,
|
|
651
723
|
);
|
|
@@ -656,9 +728,11 @@ export function createNavigationStore(
|
|
|
656
728
|
historyCache[existingIndex] = [
|
|
657
729
|
entry[0],
|
|
658
730
|
entry[1],
|
|
659
|
-
entry[2],
|
|
731
|
+
stale ?? entry[2], // set stale when provided, else preserve current
|
|
660
732
|
clonedHandleData,
|
|
661
733
|
entry[4], // preserve routerId
|
|
734
|
+
entry[5], // preserve navInstance (entry ownership identity)
|
|
735
|
+
handlesPending ?? entry[6], // set when provided, else preserve current
|
|
662
736
|
];
|
|
663
737
|
}
|
|
664
738
|
},
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { NetworkError, isNetworkError } from "../errors.js";
|
|
2
|
-
import {
|
|
2
|
+
import { RenderErrorThrower } from "../render-error-thrower.js";
|
|
3
3
|
import type { UpdateSubscriber } from "./types.js";
|
|
4
4
|
import { createElement, startTransition } from "react";
|
|
5
5
|
|
|
@@ -24,18 +24,18 @@ export function toNetworkError(
|
|
|
24
24
|
}
|
|
25
25
|
|
|
26
26
|
/**
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
*
|
|
27
|
+
* Render an error into the segment tree via the onUpdate subscriber so the
|
|
28
|
+
* nearest error boundary catches it. Wrapped in startTransition; RenderErrorThrower
|
|
29
|
+
* throws during render (async rejections do not reach boundaries on their own).
|
|
30
30
|
*/
|
|
31
|
-
|
|
31
|
+
function emitErrorToBoundary(
|
|
32
32
|
onUpdate: UpdateSubscriber,
|
|
33
|
-
error:
|
|
33
|
+
error: unknown,
|
|
34
34
|
pathname: string,
|
|
35
35
|
): void {
|
|
36
36
|
startTransition(() => {
|
|
37
37
|
onUpdate({
|
|
38
|
-
root: createElement(
|
|
38
|
+
root: createElement(RenderErrorThrower, { error }),
|
|
39
39
|
metadata: {
|
|
40
40
|
pathname,
|
|
41
41
|
segments: [],
|
|
@@ -45,6 +45,33 @@ export function emitNetworkError(
|
|
|
45
45
|
});
|
|
46
46
|
}
|
|
47
47
|
|
|
48
|
+
/**
|
|
49
|
+
* Emit a NetworkError to the nearest error boundary (offline, failed fetch).
|
|
50
|
+
*/
|
|
51
|
+
export function emitNetworkError(
|
|
52
|
+
onUpdate: UpdateSubscriber,
|
|
53
|
+
error: NetworkError,
|
|
54
|
+
pathname: string,
|
|
55
|
+
): void {
|
|
56
|
+
emitErrorToBoundary(onUpdate, error, pathname);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Emit a navigation processing error to the nearest error boundary. Used when a
|
|
61
|
+
* navigation response cannot be processed (an undecodable Flight body, or any
|
|
62
|
+
* unanticipated failure while building the response) -- for both fresh and
|
|
63
|
+
* prefetched responses, since both funnel through the navigation catch. Without
|
|
64
|
+
* this, such a failure becomes an uncaught rejection that silently aborts the
|
|
65
|
+
* navigation instead of surfacing the route's error boundary.
|
|
66
|
+
*/
|
|
67
|
+
export function emitNavigationError(
|
|
68
|
+
onUpdate: UpdateSubscriber,
|
|
69
|
+
error: unknown,
|
|
70
|
+
pathname: string,
|
|
71
|
+
): void {
|
|
72
|
+
emitErrorToBoundary(onUpdate, error, pathname);
|
|
73
|
+
}
|
|
74
|
+
|
|
48
75
|
/**
|
|
49
76
|
* Check if an error is safe to suppress in background operations.
|
|
50
77
|
*
|
|
@@ -188,7 +188,11 @@ export function createPartialUpdater(
|
|
|
188
188
|
routerId: store.getRouterId?.(),
|
|
189
189
|
});
|
|
190
190
|
const streamingToken = tx.startStreaming();
|
|
191
|
-
const {
|
|
191
|
+
const {
|
|
192
|
+
payload,
|
|
193
|
+
streamComplete: rawStreamComplete,
|
|
194
|
+
fullyPrefetched,
|
|
195
|
+
} = fetchResult;
|
|
192
196
|
debugLog("payload.metadata", payload.metadata);
|
|
193
197
|
|
|
194
198
|
// Side effect only: end the streaming token once the stream settles.
|
|
@@ -395,7 +399,14 @@ export function createPartialUpdater(
|
|
|
395
399
|
|
|
396
400
|
const renderOptions = {
|
|
397
401
|
isAction: mode.type === "action",
|
|
398
|
-
forceAwait
|
|
402
|
+
// forceAwait unwraps the ROUTER loader promises during render so they
|
|
403
|
+
// land without a loading()/fallback frame. A fully-prefetched nav has
|
|
404
|
+
// its router data already resolved (the prefetch stream drained), so
|
|
405
|
+
// awaiting it here is free and lets us commit NORMALLY (not in a
|
|
406
|
+
// transition) below — a normal commit still shows fallbacks for any
|
|
407
|
+
// CLIENT component that suspends on mount, which a transition would
|
|
408
|
+
// wrongly suppress by holding the old UI until that suspense settles.
|
|
409
|
+
forceAwait: mode.type === "stale-revalidation" || fullyPrefetched,
|
|
399
410
|
interceptSegments:
|
|
400
411
|
reconciled.interceptSegments.length > 0
|
|
401
412
|
? reconciled.interceptSegments
|
|
@@ -505,6 +516,20 @@ export function createPartialUpdater(
|
|
|
505
516
|
});
|
|
506
517
|
});
|
|
507
518
|
} else {
|
|
519
|
+
// Normal commit (cold/partial nav AND fully-prefetched nav). For a
|
|
520
|
+
// fully-prefetched nav, renderOptions.forceAwait (above) unwrapped the
|
|
521
|
+
// already-resolved ROUTER loader data AND route content during render, so
|
|
522
|
+
// the new tree carries it inline with no loading()/fallback frame — yet we
|
|
523
|
+
// still commit NORMALLY here rather than in a transition. A transition
|
|
524
|
+
// holds the OLD UI until ALL suspense in the new tree settles, including a
|
|
525
|
+
// CLIENT component that starts its own data request only when mounted
|
|
526
|
+
// (post-commit) under a persistent boundary; that would retain the
|
|
527
|
+
// previous page indefinitely with no feedback. A normal commit lets such
|
|
528
|
+
// client-initiated suspense reveal a fallback (correct) while the router
|
|
529
|
+
// data — genuinely ready — never flashes. Cold/partial navs
|
|
530
|
+
// (fullyPrefetched=false) do not forceAwait, so they stream their
|
|
531
|
+
// fallbacks. Explicit transition() routes keep the broader content-hold
|
|
532
|
+
// via the hasTransition branch above (the documented opt-in).
|
|
508
533
|
onUpdate({
|
|
509
534
|
root: newTree,
|
|
510
535
|
metadata: payload.metadata!,
|
|
@@ -65,6 +65,14 @@ export interface DecodedPrefetch {
|
|
|
65
65
|
* when it adopted an inflight entry through the wildcard key.
|
|
66
66
|
*/
|
|
67
67
|
scope: "source" | "wildcard";
|
|
68
|
+
/**
|
|
69
|
+
* Synchronously-readable flag, flipped to true when `streamComplete` resolves
|
|
70
|
+
* (the entire RSC stream has drained). Navigation reads this at click time to
|
|
71
|
+
* tell a FULLY warmed prefetch (payload commits without suspending → safe to
|
|
72
|
+
* commit in a startTransition, no fallback flash) from a partially-warmed one
|
|
73
|
+
* (still streaming → stream its fallbacks like a cold load). Starts false.
|
|
74
|
+
*/
|
|
75
|
+
complete: boolean;
|
|
68
76
|
}
|
|
69
77
|
|
|
70
78
|
let cacheTTL = 300_000;
|
|
@@ -244,14 +244,21 @@ function executePrefetchFetch(
|
|
|
244
244
|
const storageKey = scope === "source" ? sourceKey : wildcardKey;
|
|
245
245
|
|
|
246
246
|
// Track stream completion off a tee so navigation's scroll/revalidation
|
|
247
|
-
// gating matches the fresh-fetch path; decode the other branch.
|
|
247
|
+
// gating matches the fresh-fetch path; decode the other branch. The
|
|
248
|
+
// completion callback reports whether the stream ended on a clean EOF
|
|
249
|
+
// (true) or was aborted/errored (false) — only a clean end can mark the
|
|
250
|
+
// entry complete (see below).
|
|
248
251
|
let resolveStreamComplete!: () => void;
|
|
252
|
+
let endedCleanly = false;
|
|
249
253
|
const streamComplete = new Promise<void>((resolve) => {
|
|
250
254
|
resolveStreamComplete = resolve;
|
|
251
255
|
});
|
|
252
256
|
const tracked = teeWithCompletion(
|
|
253
257
|
response,
|
|
254
|
-
() =>
|
|
258
|
+
(clean) => {
|
|
259
|
+
endedCleanly = clean;
|
|
260
|
+
resolveStreamComplete();
|
|
261
|
+
},
|
|
255
262
|
effectiveSignal,
|
|
256
263
|
// Speculative prefetch: a never-consumed/aborted stream error is benign.
|
|
257
264
|
true,
|
|
@@ -264,7 +271,12 @@ function executePrefetchFetch(
|
|
|
264
271
|
// error is still surfaced to navigation if it consumes the entry.
|
|
265
272
|
payload.catch(() => {});
|
|
266
273
|
|
|
267
|
-
const entry: DecodedPrefetch = {
|
|
274
|
+
const entry: DecodedPrefetch = {
|
|
275
|
+
payload,
|
|
276
|
+
streamComplete,
|
|
277
|
+
scope,
|
|
278
|
+
complete: false,
|
|
279
|
+
};
|
|
268
280
|
storePrefetch(storageKey, entry, gen);
|
|
269
281
|
// The stall timeout now owns the body stream: arm eviction (publishedKey)
|
|
270
282
|
// and clear the timer once the stream completes. The tee's finally resolves
|
|
@@ -272,7 +284,23 @@ function executePrefetchFetch(
|
|
|
272
284
|
// no lingering timer while a stalled one is evicted when the timer fires.
|
|
273
285
|
publishedKey = storageKey;
|
|
274
286
|
publishedEntry = entry;
|
|
275
|
-
|
|
287
|
+
// Evict a broken prefetch IMMEDIATELY on the earliest failure signal — do not
|
|
288
|
+
// wait for both branches to settle. A decode that rejects while the tracking
|
|
289
|
+
// stream is still draining (or hung) would otherwise leave the rejected payload
|
|
290
|
+
// consumable (navigation reads entry.payload regardless of `complete`) until EOF
|
|
291
|
+
// or the stall timeout. removePrefetch is identity-guarded, so a fresh entry
|
|
292
|
+
// republished under the same key is never dropped, and a double call is a no-op.
|
|
293
|
+
payload.catch(() => removePrefetch(storageKey, entry));
|
|
294
|
+
streamComplete.then(() => {
|
|
295
|
+
if (!endedCleanly) removePrefetch(storageKey, entry);
|
|
296
|
+
});
|
|
297
|
+
// Mark complete ONLY on a fully-healthy prefetch (decode resolved AND clean EOF).
|
|
298
|
+
Promise.allSettled([payload, streamComplete]).then(([decode]) => {
|
|
299
|
+
if (decode.status === "fulfilled" && endedCleanly) {
|
|
300
|
+
entry.complete = true;
|
|
301
|
+
}
|
|
302
|
+
clearTimeout(timeoutId);
|
|
303
|
+
});
|
|
276
304
|
return entry;
|
|
277
305
|
})
|
|
278
306
|
.catch(() => null)
|
|
@@ -31,6 +31,57 @@ import { handleNavigationEnd } from "../scroll-restoration.js";
|
|
|
31
31
|
import { createAppShellRef, type AppShellRef } from "../app-shell.js";
|
|
32
32
|
import { startConnectionWarmup } from "../connection-warmup.js";
|
|
33
33
|
import { debugLog } from "../logging.js";
|
|
34
|
+
import { cloneHandleData } from "../navigation-store.js";
|
|
35
|
+
import { collectHandleData } from "../../handle.js";
|
|
36
|
+
import { Meta } from "../../handles/meta.js";
|
|
37
|
+
import type { MetaDescriptor } from "../../router/types.js";
|
|
38
|
+
import {
|
|
39
|
+
HEAD_RESOLVE_HANDLE_NAMES,
|
|
40
|
+
hasDeferredHandleValue,
|
|
41
|
+
resolveDeferredHandleValues,
|
|
42
|
+
} from "./deferred-handle-resolution.js";
|
|
43
|
+
|
|
44
|
+
/** Meta handle-name key. Meta is the only head-placed handle whose consumer
|
|
45
|
+
* use()s a deferred value above the route <Suspense>, so it must be resolved in
|
|
46
|
+
* the store before apply; every other handle keeps the promise contract. */
|
|
47
|
+
const META = "__rsc_router_meta__";
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Carry the previous page's COLLECTED Meta forward so the title is kept (no
|
|
51
|
+
* blank) while a deferred Meta resolves on a soft navigation.
|
|
52
|
+
*
|
|
53
|
+
* Why a carry-forward and not just preserving the previous Meta data: handle
|
|
54
|
+
* collection (useHandle/MetaTags) is driven by the event controller's
|
|
55
|
+
* `segmentOrder`, which becomes the NEW route's order so the synchronous
|
|
56
|
+
* breadcrumbs render immediately. The previous route's title lives under a
|
|
57
|
+
* segment that is NOT in the new order, so it would stop being collected — the
|
|
58
|
+
* title would fall back to the layout default. Re-keying the previous COLLECTED
|
|
59
|
+
* descriptors under a segment that IS in the new order keeps them visible.
|
|
60
|
+
*
|
|
61
|
+
* Title descriptors are wrapped as `{ title: { absolute } }` so re-collection
|
|
62
|
+
* under a (possibly template-bearing) new layout does not re-apply a title
|
|
63
|
+
* template to an already-final title. Promise and default (charSet/viewport)
|
|
64
|
+
* descriptors are dropped: Promise ones would suspend MetaTags, and the defaults
|
|
65
|
+
* are re-added by collectMeta.
|
|
66
|
+
*/
|
|
67
|
+
function carriedPreviousMeta(prev: MetaDescriptor[]): MetaDescriptor[] {
|
|
68
|
+
const out: MetaDescriptor[] = [];
|
|
69
|
+
for (const d of prev) {
|
|
70
|
+
if (d && typeof (d as { then?: unknown }).then === "function") continue;
|
|
71
|
+
const base = d as Exclude<MetaDescriptor, Promise<unknown>>;
|
|
72
|
+
if ("charSet" in base) continue;
|
|
73
|
+
if ("name" in base && (base as { name?: unknown }).name === "viewport") {
|
|
74
|
+
continue;
|
|
75
|
+
}
|
|
76
|
+
if ("title" in base) {
|
|
77
|
+
const t = (base as { title: unknown }).title;
|
|
78
|
+
out.push({ title: { absolute: typeof t === "string" ? t : String(t) } });
|
|
79
|
+
continue;
|
|
80
|
+
}
|
|
81
|
+
out.push(base);
|
|
82
|
+
}
|
|
83
|
+
return out;
|
|
84
|
+
}
|
|
34
85
|
|
|
35
86
|
/**
|
|
36
87
|
* Process handles from an async generator, updating the event controller
|
|
@@ -66,6 +117,19 @@ async function processHandles(
|
|
|
66
117
|
historyKey,
|
|
67
118
|
} = opts;
|
|
68
119
|
|
|
120
|
+
// This nav's instance token, captured before any await — processHandles runs
|
|
121
|
+
// right after its own commit, so this is that commit's token. generateHistoryKey
|
|
122
|
+
// is URL-only, so an A->B->A revisit reuses the key; the token lets a late
|
|
123
|
+
// resolution tell its own visit apart from a newer same-URL visit, so a stale
|
|
124
|
+
// nav can never clobber a fresher one's live state or cache (P1).
|
|
125
|
+
const myInstance = store.getNavInstance();
|
|
126
|
+
|
|
127
|
+
// True while this nav still owns the live page: same history key AND the most
|
|
128
|
+
// recent commit is still ours (no newer nav has committed since).
|
|
129
|
+
const stillLive = (): boolean =>
|
|
130
|
+
historyKey === store.getHistoryKey() &&
|
|
131
|
+
myInstance === store.getNavInstance();
|
|
132
|
+
|
|
69
133
|
let yieldCount = 0;
|
|
70
134
|
for await (const handleData of handlesGenerator) {
|
|
71
135
|
// Check if user navigated away before each update.
|
|
@@ -79,7 +143,132 @@ async function processHandles(
|
|
|
79
143
|
}
|
|
80
144
|
|
|
81
145
|
yieldCount++;
|
|
82
|
-
|
|
146
|
+
|
|
147
|
+
// Resolve ONLY Meta in the store before applying. Meta is the sole
|
|
148
|
+
// head-placed handle whose consumer use()s a deferred value above the route
|
|
149
|
+
// <Suspense>; an uncontained suspension there would revert the just-committed
|
|
150
|
+
// route and hide its loading fallback. Every other handle (Breadcrumbs,
|
|
151
|
+
// custom handles) keeps the DeferredHandleEntry contract: its deferred values
|
|
152
|
+
// reach the consumer AS A PROMISE and are narrowed via isThenable(). So sync
|
|
153
|
+
// handles AND non-Meta deferred promises apply/stream through immediately —
|
|
154
|
+
// only Meta is held back and swapped in once resolved.
|
|
155
|
+
const metaDeferred = hasDeferredHandleValue(
|
|
156
|
+
handleData,
|
|
157
|
+
HEAD_RESOLVE_HANDLE_NAMES,
|
|
158
|
+
);
|
|
159
|
+
|
|
160
|
+
// Apply now. The non-deferred-Meta case applies the whole snapshot in one
|
|
161
|
+
// call (Meta included). When Meta IS deferred, replace the deferred Meta with
|
|
162
|
+
// the previous page's COLLECTED Meta (stale-while-revalidate — never a blank
|
|
163
|
+
// title) keyed under one of the NEW route's Meta segments, so it stays
|
|
164
|
+
// collected under the new segment order while the synchronous and non-Meta
|
|
165
|
+
// deferred handles update with normal cleanup. The resolved Meta is swapped
|
|
166
|
+
// in by the partial merge below.
|
|
167
|
+
if (metaDeferred) {
|
|
168
|
+
const immediate: HandleData = { ...handleData };
|
|
169
|
+
const metaSegments = handleData[META] ?? {};
|
|
170
|
+
// Anchor: the last new Meta segment in matched order (collected after the
|
|
171
|
+
// shared layout, so its carried title wins). Falls back to any new Meta
|
|
172
|
+
// segment if matched ordering does not surface one.
|
|
173
|
+
const metaSegmentIds = Object.keys(metaSegments);
|
|
174
|
+
const ordered = (matched ?? []).filter((id) =>
|
|
175
|
+
metaSegmentIds.includes(id),
|
|
176
|
+
);
|
|
177
|
+
const anchor = ordered.at(-1) ?? metaSegmentIds.at(-1);
|
|
178
|
+
|
|
179
|
+
const prevState = eventController.getHandleState();
|
|
180
|
+
const prevCollected = collectHandleData(
|
|
181
|
+
Meta,
|
|
182
|
+
prevState.data,
|
|
183
|
+
prevState.segmentOrder,
|
|
184
|
+
) as MetaDescriptor[];
|
|
185
|
+
const carried = carriedPreviousMeta(prevCollected);
|
|
186
|
+
|
|
187
|
+
if (anchor && carried.length > 0) {
|
|
188
|
+
immediate[META] = { [anchor]: carried };
|
|
189
|
+
} else {
|
|
190
|
+
// No previous Meta to carry and/or no anchor: leave Meta unset until it
|
|
191
|
+
// resolves (the documented no-previous-Meta behavior).
|
|
192
|
+
delete immediate[META];
|
|
193
|
+
}
|
|
194
|
+
eventController.setHandleData(immediate, matched, isPartial, resolvedIds);
|
|
195
|
+
} else {
|
|
196
|
+
eventController.setHandleData(
|
|
197
|
+
handleData,
|
|
198
|
+
matched,
|
|
199
|
+
isPartial,
|
|
200
|
+
resolvedIds,
|
|
201
|
+
);
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
// Snapshot of the nav's full applied handle state (sync handles, non-Meta
|
|
205
|
+
// deferred promises, and — when Meta is deferred — the carried previous Meta).
|
|
206
|
+
// Captured AFTER applying so it reflects what is actually on screen now.
|
|
207
|
+
const baseSnapshot = cloneHandleData(eventController.getHandleState().data);
|
|
208
|
+
|
|
209
|
+
if (!metaDeferred) {
|
|
210
|
+
// Non-deferred: the applied snapshot is final. Keep the cache in sync and
|
|
211
|
+
// fresh. The token guard stops a stale same-URL nav writing a newer entry.
|
|
212
|
+
if (store.getCacheEntryInstance(historyKey) === myInstance) {
|
|
213
|
+
store.updateCacheHandleData(historyKey, baseSnapshot, false);
|
|
214
|
+
}
|
|
215
|
+
continue;
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
// Meta is deferred-pending. The applied snapshot carries the PREVIOUS page's
|
|
219
|
+
// Meta (or none), not this route's final title, so the cache entry must NOT
|
|
220
|
+
// be served as fresh on a popstate return. Mark it STALE and handlesPending
|
|
221
|
+
// (token-guarded). This is the P1 fix: the deferred Meta is a SERVER-side
|
|
222
|
+
// promise streamed via Flight, so a navigate-away ABORTS the stream and the
|
|
223
|
+
// client's deferred-Meta promise never resolves — the .then below never
|
|
224
|
+
// fires. stale makes a popstate return revalidate; handlesPending makes that
|
|
225
|
+
// revalidation a FULL re-render (no client segment IDs) so the server
|
|
226
|
+
// re-streams the handles. A diff-only revalidation would omit the unchanged
|
|
227
|
+
// segments' handles and the deferred Meta would never land — see the
|
|
228
|
+
// segmentIds branch in navigation-bridge.ts.
|
|
229
|
+
if (store.getCacheEntryInstance(historyKey) === myInstance) {
|
|
230
|
+
store.updateCacheHandleData(historyKey, baseSnapshot, true, true);
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
// Resolve Meta late, then swap it in. The swap is a PARTIAL merge with
|
|
234
|
+
// resolvedIds=undefined so the stale-clear loop (which scans all handle
|
|
235
|
+
// names under resolvedIds) cannot wipe the non-Meta buckets we already
|
|
236
|
+
// applied. When the deferred Meta DOES resolve while this nav still owns the
|
|
237
|
+
// entry (no navigate-away abort), write the resolved handle data and clear
|
|
238
|
+
// stale + handlesPending — the entry is now complete, so a popstate return
|
|
239
|
+
// serves it without revalidating.
|
|
240
|
+
//
|
|
241
|
+
// Order-safety: each stream yield is a full cumulative snapshot and a
|
|
242
|
+
// segment's handle array is atomic, so concurrent Meta resolutions of
|
|
243
|
+
// different yields write identical per-segment arrays or touch disjoint
|
|
244
|
+
// segments — neither can clobber the other.
|
|
245
|
+
void resolveDeferredHandleValues(
|
|
246
|
+
handleData,
|
|
247
|
+
HEAD_RESOLVE_HANDLE_NAMES,
|
|
248
|
+
).then((resolved) => {
|
|
249
|
+
const cacheValue = { ...baseSnapshot, [META]: resolved[META] };
|
|
250
|
+
if (stillLive()) {
|
|
251
|
+
// Still on the live page: swap Meta in and refresh the cache as fresh.
|
|
252
|
+
eventController.setHandleData(
|
|
253
|
+
{ [META]: resolved[META] },
|
|
254
|
+
matched,
|
|
255
|
+
true,
|
|
256
|
+
undefined,
|
|
257
|
+
);
|
|
258
|
+
store.updateCacheHandleData(
|
|
259
|
+
historyKey,
|
|
260
|
+
eventController.getHandleState().data,
|
|
261
|
+
false,
|
|
262
|
+
false,
|
|
263
|
+
);
|
|
264
|
+
} else if (store.getCacheEntryInstance(historyKey) === myInstance) {
|
|
265
|
+
// Navigated away, but THIS nav still owns the target cache entry: write
|
|
266
|
+
// the resolved data and clear stale + handlesPending so a popstate return
|
|
267
|
+
// is fresh.
|
|
268
|
+
store.updateCacheHandleData(historyKey, cacheValue, false, false);
|
|
269
|
+
}
|
|
270
|
+
// else: a newer nav to the same URL superseded us — do nothing.
|
|
271
|
+
});
|
|
83
272
|
}
|
|
84
273
|
|
|
85
274
|
// Check again before final updates
|
|
@@ -97,8 +286,9 @@ async function processHandles(
|
|
|
97
286
|
// After handles processing completes, update the cache's handleData.
|
|
98
287
|
// This fixes a race condition where commit() caches stale handleData before
|
|
99
288
|
// the async handles processing completes.
|
|
100
|
-
// Only update if we're still on the same page
|
|
101
|
-
|
|
289
|
+
// Only update if we're still on the same page AND this is still the live nav
|
|
290
|
+
// (the token guard stops a stale same-URL nav writing a newer nav's state).
|
|
291
|
+
if (stillLive()) {
|
|
102
292
|
const finalHandleData = eventController.getHandleState().data;
|
|
103
293
|
store.updateCacheHandleData(historyKey, finalHandleData);
|
|
104
294
|
}
|
|
@@ -362,7 +552,8 @@ export function NavigationProvider({
|
|
|
362
552
|
payload.root instanceof Promise ? use(payload.root) : payload.root;
|
|
363
553
|
|
|
364
554
|
// Wrap content in RootErrorBoundary to catch:
|
|
365
|
-
// 1. Errors from
|
|
555
|
+
// 1. Errors from RenderErrorThrower (network failures and unprocessable
|
|
556
|
+
// navigation responses, routed here by the navigation bridge)
|
|
366
557
|
// 2. Client component errors that occur before/outside the segment tree's error boundary
|
|
367
558
|
// 3. Errors during promise resolution or navigation state updates
|
|
368
559
|
// This acts as a safety net - the segment tree has its own RootErrorBoundary that
|