@rangojs/router 0.0.0-experimental.13 → 0.0.0-experimental.135c6902
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +9 -0
- package/README.md +884 -4
- package/dist/__internal.d.ts +83 -0
- package/dist/__internal.d.ts.map +1 -0
- package/dist/__internal.js +19 -0
- package/dist/__internal.js.map +1 -0
- package/dist/__mocks__/version.d.ts +7 -0
- package/dist/__mocks__/version.d.ts.map +1 -0
- package/dist/__mocks__/version.js +7 -0
- package/dist/__mocks__/version.js.map +1 -0
- package/dist/__tests__/client-href.test.d.ts +2 -0
- package/dist/__tests__/client-href.test.d.ts.map +1 -0
- package/dist/__tests__/client-href.test.js +74 -0
- package/dist/__tests__/client-href.test.js.map +1 -0
- package/dist/__tests__/component-utils.test.d.ts +2 -0
- package/dist/__tests__/component-utils.test.d.ts.map +1 -0
- package/dist/__tests__/component-utils.test.js +51 -0
- package/dist/__tests__/component-utils.test.js.map +1 -0
- package/dist/__tests__/event-controller.test.d.ts +2 -0
- package/dist/__tests__/event-controller.test.d.ts.map +1 -0
- package/dist/__tests__/event-controller.test.js +538 -0
- package/dist/__tests__/event-controller.test.js.map +1 -0
- package/dist/__tests__/helpers/route-tree.d.ts +118 -0
- package/dist/__tests__/helpers/route-tree.d.ts.map +1 -0
- package/dist/__tests__/helpers/route-tree.js +374 -0
- package/dist/__tests__/helpers/route-tree.js.map +1 -0
- package/dist/__tests__/match-result.test.d.ts +2 -0
- package/dist/__tests__/match-result.test.d.ts.map +1 -0
- package/dist/__tests__/match-result.test.js +154 -0
- package/dist/__tests__/match-result.test.js.map +1 -0
- package/dist/__tests__/navigation-store.test.d.ts +2 -0
- package/dist/__tests__/navigation-store.test.d.ts.map +1 -0
- package/dist/__tests__/navigation-store.test.js +440 -0
- package/dist/__tests__/navigation-store.test.js.map +1 -0
- package/dist/__tests__/partial-update.test.d.ts +2 -0
- package/dist/__tests__/partial-update.test.d.ts.map +1 -0
- package/dist/__tests__/partial-update.test.js +1009 -0
- package/dist/__tests__/partial-update.test.js.map +1 -0
- package/dist/__tests__/reverse-types.test.d.ts +8 -0
- package/dist/__tests__/reverse-types.test.d.ts.map +1 -0
- package/dist/__tests__/reverse-types.test.js +656 -0
- package/dist/__tests__/reverse-types.test.js.map +1 -0
- package/dist/__tests__/route-definition.test.d.ts +2 -0
- package/dist/__tests__/route-definition.test.d.ts.map +1 -0
- package/dist/__tests__/route-definition.test.js +55 -0
- package/dist/__tests__/route-definition.test.js.map +1 -0
- package/dist/__tests__/router-helpers.test.d.ts +2 -0
- package/dist/__tests__/router-helpers.test.d.ts.map +1 -0
- package/dist/__tests__/router-helpers.test.js +377 -0
- package/dist/__tests__/router-helpers.test.js.map +1 -0
- package/dist/__tests__/router-integration-2.test.d.ts +2 -0
- package/dist/__tests__/router-integration-2.test.d.ts.map +1 -0
- package/dist/__tests__/router-integration-2.test.js +426 -0
- package/dist/__tests__/router-integration-2.test.js.map +1 -0
- package/dist/__tests__/router-integration.test.d.ts +2 -0
- package/dist/__tests__/router-integration.test.d.ts.map +1 -0
- package/dist/__tests__/router-integration.test.js +1051 -0
- package/dist/__tests__/router-integration.test.js.map +1 -0
- package/dist/__tests__/search-params.test.d.ts +5 -0
- package/dist/__tests__/search-params.test.d.ts.map +1 -0
- package/dist/__tests__/search-params.test.js +306 -0
- package/dist/__tests__/search-params.test.js.map +1 -0
- package/dist/__tests__/segment-system.test.d.ts +2 -0
- package/dist/__tests__/segment-system.test.d.ts.map +1 -0
- package/dist/__tests__/segment-system.test.js +627 -0
- package/dist/__tests__/segment-system.test.js.map +1 -0
- package/dist/__tests__/static-handler-types.test.d.ts +8 -0
- package/dist/__tests__/static-handler-types.test.d.ts.map +1 -0
- package/dist/__tests__/static-handler-types.test.js +63 -0
- package/dist/__tests__/static-handler-types.test.js.map +1 -0
- package/dist/__tests__/urls.test.d.ts +2 -0
- package/dist/__tests__/urls.test.d.ts.map +1 -0
- package/dist/__tests__/urls.test.js +421 -0
- package/dist/__tests__/urls.test.js.map +1 -0
- package/dist/__tests__/use-mount.test.d.ts +2 -0
- package/dist/__tests__/use-mount.test.d.ts.map +1 -0
- package/dist/__tests__/use-mount.test.js +35 -0
- package/dist/__tests__/use-mount.test.js.map +1 -0
- package/dist/bin/rango.d.ts +2 -0
- package/dist/bin/rango.d.ts.map +1 -0
- package/dist/bin/rango.js +1531 -212
- package/dist/bin/rango.js.map +1 -0
- package/dist/browser/event-controller.d.ts +191 -0
- package/dist/browser/event-controller.d.ts.map +1 -0
- package/dist/browser/event-controller.js +559 -0
- package/dist/browser/event-controller.js.map +1 -0
- package/dist/browser/index.d.ts +2 -0
- package/dist/browser/index.d.ts.map +1 -0
- package/dist/browser/index.js +14 -0
- package/dist/browser/index.js.map +1 -0
- package/dist/browser/link-interceptor.d.ts +38 -0
- package/dist/browser/link-interceptor.d.ts.map +1 -0
- package/dist/browser/link-interceptor.js +99 -0
- package/dist/browser/link-interceptor.js.map +1 -0
- package/dist/browser/logging.d.ts +10 -0
- package/dist/browser/logging.d.ts.map +1 -0
- package/dist/browser/logging.js +29 -0
- package/dist/browser/logging.js.map +1 -0
- package/dist/browser/lru-cache.d.ts +17 -0
- package/dist/browser/lru-cache.d.ts.map +1 -0
- package/dist/browser/lru-cache.js +50 -0
- package/dist/browser/lru-cache.js.map +1 -0
- package/dist/browser/merge-segment-loaders.d.ts +39 -0
- package/dist/browser/merge-segment-loaders.d.ts.map +1 -0
- package/dist/browser/merge-segment-loaders.js +102 -0
- package/dist/browser/merge-segment-loaders.js.map +1 -0
- package/dist/browser/navigation-bridge.d.ts +102 -0
- package/dist/browser/navigation-bridge.d.ts.map +1 -0
- package/dist/browser/navigation-bridge.js +708 -0
- package/dist/browser/navigation-bridge.js.map +1 -0
- package/dist/browser/navigation-client.d.ts +25 -0
- package/dist/browser/navigation-client.d.ts.map +1 -0
- package/dist/browser/navigation-client.js +157 -0
- package/dist/browser/navigation-client.js.map +1 -0
- package/dist/browser/navigation-store.d.ts +101 -0
- package/dist/browser/navigation-store.d.ts.map +1 -0
- package/dist/browser/navigation-store.js +625 -0
- package/dist/browser/navigation-store.js.map +1 -0
- package/dist/browser/partial-update.d.ts +75 -0
- package/dist/browser/partial-update.d.ts.map +1 -0
- package/dist/browser/partial-update.js +426 -0
- package/dist/browser/partial-update.js.map +1 -0
- package/dist/browser/react/Link.d.ts +86 -0
- package/dist/browser/react/Link.d.ts.map +1 -0
- package/dist/browser/react/Link.js +128 -0
- package/dist/browser/react/Link.js.map +1 -0
- package/dist/browser/react/NavigationProvider.d.ts +63 -0
- package/dist/browser/react/NavigationProvider.d.ts.map +1 -0
- package/dist/browser/react/NavigationProvider.js +216 -0
- package/dist/browser/react/NavigationProvider.js.map +1 -0
- package/dist/browser/react/ScrollRestoration.d.ts +75 -0
- package/dist/browser/react/ScrollRestoration.d.ts.map +1 -0
- package/dist/browser/react/ScrollRestoration.js +57 -0
- package/dist/browser/react/ScrollRestoration.js.map +1 -0
- package/dist/browser/react/context.d.ts +46 -0
- package/dist/browser/react/context.d.ts.map +1 -0
- package/dist/browser/react/context.js +10 -0
- package/dist/browser/react/context.js.map +1 -0
- package/dist/browser/react/index.d.ts +11 -0
- package/dist/browser/react/index.d.ts.map +1 -0
- package/dist/browser/react/index.js +22 -0
- package/dist/browser/react/index.js.map +1 -0
- package/dist/browser/react/location-state-shared.d.ts +63 -0
- package/dist/browser/react/location-state-shared.d.ts.map +1 -0
- package/dist/browser/react/location-state-shared.js +81 -0
- package/dist/browser/react/location-state-shared.js.map +1 -0
- package/dist/browser/react/location-state.d.ts +23 -0
- package/dist/browser/react/location-state.d.ts.map +1 -0
- package/dist/browser/react/location-state.js +29 -0
- package/dist/browser/react/location-state.js.map +1 -0
- package/dist/browser/react/mount-context.d.ts +24 -0
- package/dist/browser/react/mount-context.d.ts.map +1 -0
- package/dist/browser/react/mount-context.js +24 -0
- package/dist/browser/react/mount-context.js.map +1 -0
- package/dist/browser/react/use-action.d.ts +64 -0
- package/dist/browser/react/use-action.d.ts.map +1 -0
- package/dist/browser/react/use-action.js +134 -0
- package/dist/browser/react/use-action.js.map +1 -0
- package/dist/browser/react/use-client-cache.d.ts +41 -0
- package/dist/browser/react/use-client-cache.d.ts.map +1 -0
- package/dist/browser/react/use-client-cache.js +39 -0
- package/dist/browser/react/use-client-cache.js.map +1 -0
- package/dist/browser/react/use-handle.d.ts +31 -0
- package/dist/browser/react/use-handle.d.ts.map +1 -0
- package/dist/browser/react/use-handle.js +144 -0
- package/dist/browser/react/use-handle.js.map +1 -0
- package/dist/browser/react/use-href.d.ts +33 -0
- package/dist/browser/react/use-href.d.ts.map +1 -0
- package/dist/browser/react/use-href.js +39 -0
- package/dist/browser/react/use-href.js.map +1 -0
- package/dist/browser/react/use-link-status.d.ts +37 -0
- package/dist/browser/react/use-link-status.d.ts.map +1 -0
- package/dist/browser/react/use-link-status.js +99 -0
- package/dist/browser/react/use-link-status.js.map +1 -0
- package/dist/browser/react/use-mount.d.ts +25 -0
- package/dist/browser/react/use-mount.d.ts.map +1 -0
- package/dist/browser/react/use-mount.js +30 -0
- package/dist/browser/react/use-mount.js.map +1 -0
- package/dist/browser/react/use-navigation.d.ts +27 -0
- package/dist/browser/react/use-navigation.d.ts.map +1 -0
- package/dist/browser/react/use-navigation.js +87 -0
- package/dist/browser/react/use-navigation.js.map +1 -0
- package/dist/browser/react/use-segments.d.ts +38 -0
- package/dist/browser/react/use-segments.d.ts.map +1 -0
- package/dist/browser/react/use-segments.js +130 -0
- package/dist/browser/react/use-segments.js.map +1 -0
- package/dist/browser/request-controller.d.ts +26 -0
- package/dist/browser/request-controller.d.ts.map +1 -0
- package/dist/browser/request-controller.js +147 -0
- package/dist/browser/request-controller.js.map +1 -0
- package/dist/browser/rsc-router.d.ts +129 -0
- package/dist/browser/rsc-router.d.ts.map +1 -0
- package/dist/browser/rsc-router.js +195 -0
- package/dist/browser/rsc-router.js.map +1 -0
- package/dist/browser/scroll-restoration.d.ts +93 -0
- package/dist/browser/scroll-restoration.d.ts.map +1 -0
- package/dist/browser/scroll-restoration.js +321 -0
- package/dist/browser/scroll-restoration.js.map +1 -0
- package/dist/browser/segment-structure-assert.d.ts +17 -0
- package/dist/browser/segment-structure-assert.d.ts.map +1 -0
- package/dist/browser/segment-structure-assert.js +59 -0
- package/dist/browser/segment-structure-assert.js.map +1 -0
- package/dist/browser/server-action-bridge.d.ts +26 -0
- package/dist/browser/server-action-bridge.d.ts.map +1 -0
- package/dist/browser/server-action-bridge.js +668 -0
- package/dist/browser/server-action-bridge.js.map +1 -0
- package/dist/browser/shallow.d.ts +12 -0
- package/dist/browser/shallow.d.ts.map +1 -0
- package/dist/browser/shallow.js +34 -0
- package/dist/browser/shallow.js.map +1 -0
- package/dist/browser/types.d.ts +369 -0
- package/dist/browser/types.d.ts.map +1 -0
- package/dist/browser/types.js +2 -0
- package/dist/browser/types.js.map +1 -0
- package/dist/build/__tests__/generate-cli.test.d.ts +2 -0
- package/dist/build/__tests__/generate-cli.test.d.ts.map +1 -0
- package/dist/build/__tests__/generate-cli.test.js +237 -0
- package/dist/build/__tests__/generate-cli.test.js.map +1 -0
- package/dist/build/__tests__/generate-manifest.test.d.ts +2 -0
- package/dist/build/__tests__/generate-manifest.test.d.ts.map +1 -0
- package/dist/build/__tests__/generate-manifest.test.js +119 -0
- package/dist/build/__tests__/generate-manifest.test.js.map +1 -0
- package/dist/build/__tests__/generate-route-types.test.d.ts +2 -0
- package/dist/build/__tests__/generate-route-types.test.d.ts.map +1 -0
- package/dist/build/__tests__/generate-route-types.test.js +620 -0
- package/dist/build/__tests__/generate-route-types.test.js.map +1 -0
- package/dist/build/__tests__/per-router-manifest.test.d.ts +2 -0
- package/dist/build/__tests__/per-router-manifest.test.d.ts.map +1 -0
- package/dist/build/__tests__/per-router-manifest.test.js +308 -0
- package/dist/build/__tests__/per-router-manifest.test.js.map +1 -0
- package/dist/build/generate-manifest.d.ts +81 -0
- package/dist/build/generate-manifest.d.ts.map +1 -0
- package/dist/build/generate-manifest.js +276 -0
- package/dist/build/generate-manifest.js.map +1 -0
- package/dist/build/generate-route-types.d.ts +115 -0
- package/dist/build/generate-route-types.d.ts.map +1 -0
- package/dist/build/generate-route-types.js +740 -0
- package/dist/build/generate-route-types.js.map +1 -0
- package/dist/build/index.d.ts +21 -0
- package/dist/build/index.d.ts.map +1 -0
- package/dist/build/index.js +21 -0
- package/dist/build/index.js.map +1 -0
- package/dist/build/route-trie.d.ts +71 -0
- package/dist/build/route-trie.d.ts.map +1 -0
- package/dist/build/route-trie.js +175 -0
- package/dist/build/route-trie.js.map +1 -0
- package/dist/cache/__tests__/cache-scope.test.d.ts +2 -0
- package/dist/cache/__tests__/cache-scope.test.d.ts.map +1 -0
- package/dist/cache/__tests__/cache-scope.test.js +208 -0
- package/dist/cache/__tests__/cache-scope.test.js.map +1 -0
- package/dist/cache/__tests__/document-cache.test.d.ts +2 -0
- package/dist/cache/__tests__/document-cache.test.d.ts.map +1 -0
- package/dist/cache/__tests__/document-cache.test.js +345 -0
- package/dist/cache/__tests__/document-cache.test.js.map +1 -0
- package/dist/cache/__tests__/memory-segment-store.test.d.ts +2 -0
- package/dist/cache/__tests__/memory-segment-store.test.d.ts.map +1 -0
- package/dist/cache/__tests__/memory-segment-store.test.js +425 -0
- package/dist/cache/__tests__/memory-segment-store.test.js.map +1 -0
- package/dist/cache/__tests__/memory-store.test.d.ts +2 -0
- package/dist/cache/__tests__/memory-store.test.d.ts.map +1 -0
- package/dist/cache/__tests__/memory-store.test.js +367 -0
- package/dist/cache/__tests__/memory-store.test.js.map +1 -0
- package/dist/cache/cache-scope.d.ts +102 -0
- package/dist/cache/cache-scope.d.ts.map +1 -0
- package/dist/cache/cache-scope.js +440 -0
- package/dist/cache/cache-scope.js.map +1 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts +2 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts.map +1 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.js +330 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.js.map +1 -0
- package/dist/cache/cf/cf-cache-store.d.ts +165 -0
- package/dist/cache/cf/cf-cache-store.d.ts.map +1 -0
- package/dist/cache/cf/cf-cache-store.js +242 -0
- package/dist/cache/cf/cf-cache-store.js.map +1 -0
- package/dist/cache/cf/index.d.ts +14 -0
- package/dist/cache/cf/index.d.ts.map +1 -0
- package/dist/cache/cf/index.js +17 -0
- package/dist/cache/cf/index.js.map +1 -0
- package/dist/cache/document-cache.d.ts +64 -0
- package/dist/cache/document-cache.d.ts.map +1 -0
- package/dist/cache/document-cache.js +228 -0
- package/dist/cache/document-cache.js.map +1 -0
- package/dist/cache/index.d.ts +19 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +21 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/cache/memory-segment-store.d.ts +110 -0
- package/dist/cache/memory-segment-store.d.ts.map +1 -0
- package/dist/cache/memory-segment-store.js +117 -0
- package/dist/cache/memory-segment-store.js.map +1 -0
- package/dist/cache/memory-store.d.ts +41 -0
- package/dist/cache/memory-store.d.ts.map +1 -0
- package/dist/cache/memory-store.js +191 -0
- package/dist/cache/memory-store.js.map +1 -0
- package/dist/cache/types.d.ts +317 -0
- package/dist/cache/types.d.ts.map +1 -0
- package/dist/cache/types.js +12 -0
- package/dist/cache/types.js.map +1 -0
- package/dist/client.d.ts +248 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +367 -0
- package/dist/client.js.map +1 -0
- package/dist/client.rsc.d.ts +26 -0
- package/dist/client.rsc.d.ts.map +1 -0
- package/dist/client.rsc.js +46 -0
- package/dist/client.rsc.js.map +1 -0
- package/dist/component-utils.d.ts +36 -0
- package/dist/component-utils.d.ts.map +1 -0
- package/dist/component-utils.js +61 -0
- package/dist/component-utils.js.map +1 -0
- package/dist/components/DefaultDocument.d.ts +13 -0
- package/dist/components/DefaultDocument.d.ts.map +1 -0
- package/dist/components/DefaultDocument.js +15 -0
- package/dist/components/DefaultDocument.js.map +1 -0
- package/dist/debug.d.ts +58 -0
- package/dist/debug.d.ts.map +1 -0
- package/dist/debug.js +157 -0
- package/dist/debug.js.map +1 -0
- package/dist/default-error-boundary.d.ts +11 -0
- package/dist/default-error-boundary.d.ts.map +1 -0
- package/dist/default-error-boundary.js +45 -0
- package/dist/default-error-boundary.js.map +1 -0
- package/dist/deps/browser.d.ts +2 -0
- package/dist/deps/browser.d.ts.map +1 -0
- package/dist/deps/browser.js +3 -0
- package/dist/deps/browser.js.map +1 -0
- package/dist/deps/html-stream-client.d.ts +2 -0
- package/dist/deps/html-stream-client.d.ts.map +1 -0
- package/dist/deps/html-stream-client.js +3 -0
- package/dist/deps/html-stream-client.js.map +1 -0
- package/dist/deps/html-stream-server.d.ts +2 -0
- package/dist/deps/html-stream-server.d.ts.map +1 -0
- package/dist/deps/html-stream-server.js +3 -0
- package/dist/deps/html-stream-server.js.map +1 -0
- package/dist/deps/rsc.d.ts +2 -0
- package/dist/deps/rsc.d.ts.map +1 -0
- package/dist/deps/rsc.js +4 -0
- package/dist/deps/rsc.js.map +1 -0
- package/dist/deps/ssr.d.ts +2 -0
- package/dist/deps/ssr.d.ts.map +1 -0
- package/dist/deps/ssr.js +3 -0
- package/dist/deps/ssr.js.map +1 -0
- package/dist/errors.d.ts +174 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +241 -0
- package/dist/errors.js.map +1 -0
- package/dist/handle.d.ts +78 -0
- package/dist/handle.d.ts.map +1 -0
- package/dist/handle.js +82 -0
- package/dist/handle.js.map +1 -0
- package/dist/handles/MetaTags.d.ts +14 -0
- package/dist/handles/MetaTags.d.ts.map +1 -0
- package/dist/handles/MetaTags.js +136 -0
- package/dist/handles/MetaTags.js.map +1 -0
- package/dist/handles/index.d.ts +6 -0
- package/dist/handles/index.d.ts.map +1 -0
- package/dist/handles/index.js +6 -0
- package/dist/handles/index.js.map +1 -0
- package/dist/handles/meta.d.ts +39 -0
- package/dist/handles/meta.d.ts.map +1 -0
- package/dist/handles/meta.js +202 -0
- package/dist/handles/meta.js.map +1 -0
- package/dist/host/__tests__/errors.test.d.ts +2 -0
- package/dist/host/__tests__/errors.test.d.ts.map +1 -0
- package/dist/host/__tests__/errors.test.js +76 -0
- package/dist/host/__tests__/errors.test.js.map +1 -0
- package/dist/host/__tests__/pattern-comprehensive.test.d.ts +2 -0
- package/dist/host/__tests__/pattern-comprehensive.test.d.ts.map +1 -0
- package/dist/host/__tests__/pattern-comprehensive.test.js +732 -0
- package/dist/host/__tests__/pattern-comprehensive.test.js.map +1 -0
- package/dist/host/__tests__/pattern-matcher.test.d.ts +2 -0
- package/dist/host/__tests__/pattern-matcher.test.d.ts.map +1 -0
- package/dist/host/__tests__/pattern-matcher.test.js +251 -0
- package/dist/host/__tests__/pattern-matcher.test.js.map +1 -0
- package/dist/host/__tests__/router.test.d.ts +2 -0
- package/dist/host/__tests__/router.test.d.ts.map +1 -0
- package/dist/host/__tests__/router.test.js +241 -0
- package/dist/host/__tests__/router.test.js.map +1 -0
- package/dist/host/__tests__/testing.test.d.ts +2 -0
- package/dist/host/__tests__/testing.test.d.ts.map +1 -0
- package/dist/host/__tests__/testing.test.js +64 -0
- package/dist/host/__tests__/testing.test.js.map +1 -0
- package/dist/host/__tests__/utils.test.d.ts +2 -0
- package/dist/host/__tests__/utils.test.d.ts.map +1 -0
- package/dist/host/__tests__/utils.test.js +29 -0
- package/dist/host/__tests__/utils.test.js.map +1 -0
- package/dist/host/cookie-handler.d.ts +34 -0
- package/dist/host/cookie-handler.d.ts.map +1 -0
- package/dist/host/cookie-handler.js +124 -0
- package/dist/host/cookie-handler.js.map +1 -0
- package/dist/host/errors.d.ts +56 -0
- package/dist/host/errors.d.ts.map +1 -0
- package/dist/host/errors.js +79 -0
- package/dist/host/errors.js.map +1 -0
- package/dist/host/index.d.ts +29 -0
- package/dist/host/index.d.ts.map +1 -0
- package/dist/host/index.js +32 -0
- package/dist/host/index.js.map +1 -0
- package/dist/host/pattern-matcher.d.ts +36 -0
- package/dist/host/pattern-matcher.d.ts.map +1 -0
- package/dist/host/pattern-matcher.js +172 -0
- package/dist/host/pattern-matcher.js.map +1 -0
- package/dist/host/router.d.ts +26 -0
- package/dist/host/router.d.ts.map +1 -0
- package/dist/host/router.js +218 -0
- package/dist/host/router.js.map +1 -0
- package/dist/host/testing.d.ts +36 -0
- package/dist/host/testing.d.ts.map +1 -0
- package/dist/host/testing.js +55 -0
- package/dist/host/testing.js.map +1 -0
- package/dist/host/types.d.ts +115 -0
- package/dist/host/types.d.ts.map +1 -0
- package/dist/host/types.js +7 -0
- package/dist/host/types.js.map +1 -0
- package/dist/host/utils.d.ts +21 -0
- package/dist/host/utils.d.ts.map +1 -0
- package/dist/host/utils.js +23 -0
- package/dist/host/utils.js.map +1 -0
- package/dist/href-client.d.ts +131 -0
- package/dist/href-client.d.ts.map +1 -0
- package/dist/href-client.js +64 -0
- package/dist/href-client.js.map +1 -0
- package/{src/href-context.ts → dist/href-context.d.ts} +7 -11
- package/dist/href-context.d.ts.map +1 -0
- package/dist/href-context.js +21 -0
- package/dist/href-context.js.map +1 -0
- package/dist/index.d.ts +73 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +91 -0
- package/dist/index.js.map +1 -0
- package/dist/index.rsc.d.ts +32 -0
- package/dist/index.rsc.d.ts.map +1 -0
- package/dist/index.rsc.js +40 -0
- package/dist/index.rsc.js.map +1 -0
- package/dist/internal-debug.d.ts +2 -0
- package/dist/internal-debug.d.ts.map +1 -0
- package/dist/internal-debug.js +5 -0
- package/dist/internal-debug.js.map +1 -0
- package/dist/loader.d.ts +14 -0
- package/dist/loader.d.ts.map +1 -0
- package/dist/loader.js +20 -0
- package/dist/loader.js.map +1 -0
- package/dist/loader.rsc.d.ts +19 -0
- package/dist/loader.rsc.d.ts.map +1 -0
- package/dist/loader.rsc.js +99 -0
- package/dist/loader.rsc.js.map +1 -0
- package/dist/network-error-thrower.d.ts +17 -0
- package/dist/network-error-thrower.d.ts.map +1 -0
- package/dist/network-error-thrower.js +14 -0
- package/dist/network-error-thrower.js.map +1 -0
- package/dist/outlet-context.d.ts +13 -0
- package/dist/outlet-context.d.ts.map +1 -0
- package/dist/outlet-context.js +3 -0
- package/dist/outlet-context.js.map +1 -0
- package/dist/prerender/__tests__/param-hash.test.d.ts +2 -0
- package/dist/prerender/__tests__/param-hash.test.d.ts.map +1 -0
- package/dist/prerender/__tests__/param-hash.test.js +148 -0
- package/dist/prerender/__tests__/param-hash.test.js.map +1 -0
- package/dist/prerender/param-hash.d.ts +16 -0
- package/dist/prerender/param-hash.d.ts.map +1 -0
- package/dist/prerender/param-hash.js +36 -0
- package/dist/prerender/param-hash.js.map +1 -0
- package/dist/prerender/store.d.ts +38 -0
- package/dist/prerender/store.d.ts.map +1 -0
- package/dist/prerender/store.js +61 -0
- package/dist/prerender/store.js.map +1 -0
- package/dist/prerender.d.ts +66 -0
- package/dist/prerender.d.ts.map +1 -0
- package/dist/prerender.js +57 -0
- package/dist/prerender.js.map +1 -0
- package/dist/reverse.d.ts +196 -0
- package/dist/reverse.d.ts.map +1 -0
- package/dist/reverse.js +78 -0
- package/dist/reverse.js.map +1 -0
- package/dist/root-error-boundary.d.ts +33 -0
- package/dist/root-error-boundary.d.ts.map +1 -0
- package/dist/root-error-boundary.js +165 -0
- package/dist/root-error-boundary.js.map +1 -0
- package/dist/route-content-wrapper.d.ts +46 -0
- package/dist/route-content-wrapper.d.ts.map +1 -0
- package/dist/route-content-wrapper.js +77 -0
- package/dist/route-content-wrapper.js.map +1 -0
- package/dist/route-definition.d.ts +421 -0
- package/dist/route-definition.d.ts.map +1 -0
- package/dist/route-definition.js +868 -0
- package/dist/route-definition.js.map +1 -0
- package/dist/route-map-builder.d.ts +155 -0
- package/dist/route-map-builder.d.ts.map +1 -0
- package/dist/route-map-builder.js +237 -0
- package/dist/route-map-builder.js.map +1 -0
- package/dist/route-types.d.ts +165 -0
- package/dist/route-types.d.ts.map +1 -0
- package/dist/route-types.js +7 -0
- package/dist/route-types.js.map +1 -0
- package/dist/router/__tests__/handler-context.test.d.ts +2 -0
- package/dist/router/__tests__/handler-context.test.d.ts.map +1 -0
- package/dist/router/__tests__/handler-context.test.js +65 -0
- package/dist/router/__tests__/handler-context.test.js.map +1 -0
- package/dist/router/__tests__/loader-cycle-detection.test.d.ts +2 -0
- package/dist/router/__tests__/loader-cycle-detection.test.d.ts.map +1 -0
- package/dist/router/__tests__/loader-cycle-detection.test.js +221 -0
- package/dist/router/__tests__/loader-cycle-detection.test.js.map +1 -0
- package/dist/router/__tests__/match-context.test.d.ts +2 -0
- package/dist/router/__tests__/match-context.test.d.ts.map +1 -0
- package/dist/router/__tests__/match-context.test.js +92 -0
- package/dist/router/__tests__/match-context.test.js.map +1 -0
- package/dist/router/__tests__/match-pipelines.test.d.ts +2 -0
- package/dist/router/__tests__/match-pipelines.test.d.ts.map +1 -0
- package/dist/router/__tests__/match-pipelines.test.js +417 -0
- package/dist/router/__tests__/match-pipelines.test.js.map +1 -0
- package/dist/router/__tests__/match-result.test.d.ts +2 -0
- package/dist/router/__tests__/match-result.test.d.ts.map +1 -0
- package/dist/router/__tests__/match-result.test.js +457 -0
- package/dist/router/__tests__/match-result.test.js.map +1 -0
- package/dist/router/__tests__/on-error.test.d.ts +2 -0
- package/dist/router/__tests__/on-error.test.d.ts.map +1 -0
- package/dist/router/__tests__/on-error.test.js +678 -0
- package/dist/router/__tests__/on-error.test.js.map +1 -0
- package/dist/router/__tests__/pattern-matching.test.d.ts +2 -0
- package/dist/router/__tests__/pattern-matching.test.d.ts.map +1 -0
- package/dist/router/__tests__/pattern-matching.test.js +629 -0
- package/dist/router/__tests__/pattern-matching.test.js.map +1 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts +2 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts.map +1 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.js +155 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.js.map +1 -0
- package/dist/router/error-handling.d.ts +77 -0
- package/dist/router/error-handling.d.ts.map +1 -0
- package/dist/router/error-handling.js +202 -0
- package/dist/router/error-handling.js.map +1 -0
- package/dist/router/handler-context.d.ts +20 -0
- package/dist/router/handler-context.d.ts.map +1 -0
- package/dist/router/handler-context.js +198 -0
- package/dist/router/handler-context.js.map +1 -0
- package/dist/router/intercept-resolution.d.ts +66 -0
- package/dist/router/intercept-resolution.d.ts.map +1 -0
- package/dist/router/intercept-resolution.js +246 -0
- package/dist/router/intercept-resolution.js.map +1 -0
- package/dist/router/loader-resolution.d.ts +64 -0
- package/dist/router/loader-resolution.d.ts.map +1 -0
- package/dist/router/loader-resolution.js +284 -0
- package/dist/router/loader-resolution.js.map +1 -0
- package/dist/router/logging.d.ts +15 -0
- package/dist/router/logging.d.ts.map +1 -0
- package/dist/router/logging.js +99 -0
- package/dist/router/logging.js.map +1 -0
- package/dist/router/manifest.d.ts +22 -0
- package/dist/router/manifest.d.ts.map +1 -0
- package/dist/router/manifest.js +181 -0
- package/dist/router/manifest.js.map +1 -0
- package/dist/router/match-api.d.ts +35 -0
- package/dist/router/match-api.d.ts.map +1 -0
- package/dist/router/match-api.js +406 -0
- package/dist/router/match-api.js.map +1 -0
- package/dist/router/match-context.d.ts +206 -0
- package/dist/router/match-context.d.ts.map +1 -0
- package/dist/router/match-context.js +17 -0
- package/dist/router/match-context.js.map +1 -0
- package/dist/router/match-middleware/background-revalidation.d.ts +127 -0
- package/dist/router/match-middleware/background-revalidation.d.ts.map +1 -0
- package/dist/router/match-middleware/background-revalidation.js +75 -0
- package/dist/router/match-middleware/background-revalidation.js.map +1 -0
- package/dist/router/match-middleware/cache-lookup.d.ts +112 -0
- package/dist/router/match-middleware/cache-lookup.d.ts.map +1 -0
- package/dist/router/match-middleware/cache-lookup.js +257 -0
- package/dist/router/match-middleware/cache-lookup.js.map +1 -0
- package/dist/router/match-middleware/cache-store.d.ts +113 -0
- package/dist/router/match-middleware/cache-store.d.ts.map +1 -0
- package/dist/router/match-middleware/cache-store.js +108 -0
- package/dist/router/match-middleware/cache-store.js.map +1 -0
- package/dist/router/match-middleware/index.d.ts +81 -0
- package/dist/router/match-middleware/index.d.ts.map +1 -0
- package/dist/router/match-middleware/index.js +80 -0
- package/dist/router/match-middleware/index.js.map +1 -0
- package/dist/router/match-middleware/intercept-resolution.d.ts +117 -0
- package/dist/router/match-middleware/intercept-resolution.d.ts.map +1 -0
- package/dist/router/match-middleware/intercept-resolution.js +134 -0
- package/dist/router/match-middleware/intercept-resolution.js.map +1 -0
- package/dist/router/match-middleware/segment-resolution.d.ts +99 -0
- package/dist/router/match-middleware/segment-resolution.d.ts.map +1 -0
- package/dist/router/match-middleware/segment-resolution.js +53 -0
- package/dist/router/match-middleware/segment-resolution.js.map +1 -0
- package/dist/router/match-pipelines.d.ts +147 -0
- package/dist/router/match-pipelines.d.ts.map +1 -0
- package/dist/router/match-pipelines.js +82 -0
- package/dist/router/match-pipelines.js.map +1 -0
- package/dist/router/match-result.d.ts +126 -0
- package/dist/router/match-result.d.ts.map +1 -0
- package/dist/router/match-result.js +93 -0
- package/dist/router/match-result.js.map +1 -0
- package/dist/router/metrics.d.ts +20 -0
- package/dist/router/metrics.d.ts.map +1 -0
- package/dist/router/metrics.js +47 -0
- package/dist/router/metrics.js.map +1 -0
- package/dist/router/middleware.d.ts +249 -0
- package/dist/router/middleware.d.ts.map +1 -0
- package/dist/router/middleware.js +434 -0
- package/dist/router/middleware.js.map +1 -0
- package/dist/router/middleware.test.d.ts +2 -0
- package/dist/router/middleware.test.d.ts.map +1 -0
- package/dist/router/middleware.test.js +816 -0
- package/dist/router/middleware.test.js.map +1 -0
- package/dist/router/pattern-matching.d.ts +149 -0
- package/dist/router/pattern-matching.d.ts.map +1 -0
- package/dist/router/pattern-matching.js +349 -0
- package/dist/router/pattern-matching.js.map +1 -0
- package/dist/router/revalidation.d.ts +44 -0
- package/dist/router/revalidation.d.ts.map +1 -0
- package/dist/router/revalidation.js +147 -0
- package/dist/router/revalidation.js.map +1 -0
- package/dist/router/router-context.d.ts +135 -0
- package/dist/router/router-context.d.ts.map +1 -0
- package/dist/router/router-context.js +36 -0
- package/dist/router/router-context.js.map +1 -0
- package/dist/router/segment-resolution.d.ts +127 -0
- package/dist/router/segment-resolution.d.ts.map +1 -0
- package/dist/router/segment-resolution.js +919 -0
- package/dist/router/segment-resolution.js.map +1 -0
- package/dist/router/trie-matching.d.ts +40 -0
- package/dist/router/trie-matching.d.ts.map +1 -0
- package/dist/router/trie-matching.js +127 -0
- package/dist/router/trie-matching.js.map +1 -0
- package/dist/router/types.d.ts +136 -0
- package/dist/router/types.d.ts.map +1 -0
- package/dist/router/types.js +7 -0
- package/dist/router/types.js.map +1 -0
- package/dist/router.d.ts +753 -0
- package/dist/router.d.ts.map +1 -0
- package/dist/router.gen.d.ts +6 -0
- package/dist/router.gen.d.ts.map +1 -0
- package/dist/router.gen.js +6 -0
- package/dist/router.gen.js.map +1 -0
- package/dist/router.js +1304 -0
- package/dist/router.js.map +1 -0
- package/dist/rsc/__tests__/helpers.test.d.ts +2 -0
- package/dist/rsc/__tests__/helpers.test.d.ts.map +1 -0
- package/dist/rsc/__tests__/helpers.test.js +140 -0
- package/dist/rsc/__tests__/helpers.test.js.map +1 -0
- package/dist/rsc/handler.d.ts +45 -0
- package/dist/rsc/handler.d.ts.map +1 -0
- package/dist/rsc/handler.js +1172 -0
- package/dist/rsc/handler.js.map +1 -0
- package/dist/rsc/helpers.d.ts +16 -0
- package/dist/rsc/helpers.d.ts.map +1 -0
- package/dist/rsc/helpers.js +55 -0
- package/dist/rsc/helpers.js.map +1 -0
- package/dist/rsc/index.d.ts +22 -0
- package/dist/rsc/index.d.ts.map +1 -0
- package/dist/rsc/index.js +23 -0
- package/dist/rsc/index.js.map +1 -0
- package/dist/rsc/nonce.d.ts +9 -0
- package/dist/rsc/nonce.d.ts.map +1 -0
- package/dist/rsc/nonce.js +18 -0
- package/dist/rsc/nonce.js.map +1 -0
- package/dist/rsc/types.d.ts +206 -0
- package/dist/rsc/types.d.ts.map +1 -0
- package/dist/rsc/types.js +8 -0
- package/dist/rsc/types.js.map +1 -0
- package/dist/search-params.d.ts +103 -0
- package/dist/search-params.d.ts.map +1 -0
- package/dist/search-params.js +74 -0
- package/dist/search-params.js.map +1 -0
- package/dist/segment-system.d.ts +75 -0
- package/dist/segment-system.d.ts.map +1 -0
- package/dist/segment-system.js +336 -0
- package/dist/segment-system.js.map +1 -0
- package/dist/server/context.d.ts +245 -0
- package/dist/server/context.d.ts.map +1 -0
- package/dist/server/context.js +197 -0
- package/dist/server/context.js.map +1 -0
- package/dist/server/fetchable-loader-store.d.ts +18 -0
- package/dist/server/fetchable-loader-store.d.ts.map +1 -0
- package/dist/server/fetchable-loader-store.js +18 -0
- package/dist/server/fetchable-loader-store.js.map +1 -0
- package/dist/server/handle-store.d.ts +85 -0
- package/dist/server/handle-store.d.ts.map +1 -0
- package/dist/server/handle-store.js +142 -0
- package/dist/server/handle-store.js.map +1 -0
- package/dist/server/loader-registry.d.ts +55 -0
- package/dist/server/loader-registry.d.ts.map +1 -0
- package/dist/server/loader-registry.js +132 -0
- package/dist/server/loader-registry.js.map +1 -0
- package/dist/server/request-context.d.ts +226 -0
- package/dist/server/request-context.d.ts.map +1 -0
- package/dist/server/request-context.js +290 -0
- package/dist/server/request-context.js.map +1 -0
- package/dist/server/root-layout.d.ts +4 -0
- package/dist/server/root-layout.d.ts.map +1 -0
- package/dist/server/root-layout.js +5 -0
- package/dist/server/root-layout.js.map +1 -0
- package/dist/server.d.ts +15 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +20 -0
- package/dist/server.js.map +1 -0
- package/dist/ssr/__tests__/ssr-handler.test.d.ts +2 -0
- package/dist/ssr/__tests__/ssr-handler.test.d.ts.map +1 -0
- package/dist/ssr/__tests__/ssr-handler.test.js +132 -0
- package/dist/ssr/__tests__/ssr-handler.test.js.map +1 -0
- package/dist/ssr/index.d.ts +98 -0
- package/dist/ssr/index.d.ts.map +1 -0
- package/dist/ssr/index.js +158 -0
- package/dist/ssr/index.js.map +1 -0
- package/dist/static-handler.d.ts +50 -0
- package/dist/static-handler.d.ts.map +1 -0
- package/dist/static-handler.gen.d.ts +5 -0
- package/dist/static-handler.gen.d.ts.map +1 -0
- package/dist/static-handler.gen.js +5 -0
- package/dist/static-handler.gen.js.map +1 -0
- package/dist/static-handler.js +29 -0
- package/dist/static-handler.js.map +1 -0
- package/dist/theme/ThemeProvider.d.ts +20 -0
- package/dist/theme/ThemeProvider.d.ts.map +1 -0
- package/dist/theme/ThemeProvider.js +240 -0
- package/dist/theme/ThemeProvider.js.map +1 -0
- package/dist/theme/ThemeScript.d.ts +48 -0
- package/dist/theme/ThemeScript.d.ts.map +1 -0
- package/dist/theme/ThemeScript.js +13 -0
- package/dist/theme/ThemeScript.js.map +1 -0
- package/dist/theme/__tests__/theme.test.d.ts +2 -0
- package/dist/theme/__tests__/theme.test.d.ts.map +1 -0
- package/dist/theme/__tests__/theme.test.js +103 -0
- package/dist/theme/__tests__/theme.test.js.map +1 -0
- package/dist/theme/constants.d.ts +29 -0
- package/dist/theme/constants.d.ts.map +1 -0
- package/dist/theme/constants.js +48 -0
- package/dist/theme/constants.js.map +1 -0
- package/dist/theme/index.d.ts +31 -0
- package/dist/theme/index.d.ts.map +1 -0
- package/dist/theme/index.js +36 -0
- package/dist/theme/index.js.map +1 -0
- package/dist/theme/theme-context.d.ts +40 -0
- package/dist/theme/theme-context.d.ts.map +1 -0
- package/dist/theme/theme-context.js +60 -0
- package/dist/theme/theme-context.js.map +1 -0
- package/dist/theme/theme-script.d.ts +27 -0
- package/dist/theme/theme-script.d.ts.map +1 -0
- package/dist/theme/theme-script.js +147 -0
- package/dist/theme/theme-script.js.map +1 -0
- package/dist/theme/types.d.ts +163 -0
- package/dist/theme/types.d.ts.map +1 -0
- package/dist/theme/types.js +11 -0
- package/dist/theme/types.js.map +1 -0
- package/dist/theme/use-theme.d.ts +12 -0
- package/dist/theme/use-theme.d.ts.map +1 -0
- package/dist/theme/use-theme.js +40 -0
- package/dist/theme/use-theme.js.map +1 -0
- package/dist/types.d.ts +1479 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +10 -0
- package/dist/types.js.map +1 -0
- package/dist/urls.d.ts +441 -0
- package/dist/urls.d.ts.map +1 -0
- package/dist/urls.gen.d.ts +8 -0
- package/dist/urls.gen.d.ts.map +1 -0
- package/dist/urls.gen.js +8 -0
- package/dist/urls.gen.js.map +1 -0
- package/dist/urls.js +443 -0
- package/dist/urls.js.map +1 -0
- package/dist/use-loader.d.ts +127 -0
- package/dist/use-loader.d.ts.map +1 -0
- package/dist/use-loader.js +237 -0
- package/dist/use-loader.js.map +1 -0
- package/dist/vite/__tests__/ast-handler-extract.test.d.ts +2 -0
- package/dist/vite/__tests__/ast-handler-extract.test.d.ts.map +1 -0
- package/dist/vite/__tests__/ast-handler-extract.test.js +294 -0
- package/dist/vite/__tests__/ast-handler-extract.test.js.map +1 -0
- package/dist/vite/__tests__/expose-id-utils.test.d.ts +2 -0
- package/dist/vite/__tests__/expose-id-utils.test.d.ts.map +1 -0
- package/dist/vite/__tests__/expose-id-utils.test.js +224 -0
- package/dist/vite/__tests__/expose-id-utils.test.js.map +1 -0
- package/dist/vite/__tests__/expose-internal-ids.test.d.ts +2 -0
- package/dist/vite/__tests__/expose-internal-ids.test.d.ts.map +1 -0
- package/dist/vite/__tests__/expose-internal-ids.test.js +647 -0
- package/dist/vite/__tests__/expose-internal-ids.test.js.map +1 -0
- package/dist/vite/__tests__/expose-router-id.test.d.ts +2 -0
- package/dist/vite/__tests__/expose-router-id.test.d.ts.map +1 -0
- package/dist/vite/__tests__/expose-router-id.test.js +39 -0
- package/dist/vite/__tests__/expose-router-id.test.js.map +1 -0
- package/dist/vite/ast-handler-extract.d.ts +49 -0
- package/dist/vite/ast-handler-extract.d.ts.map +1 -0
- package/dist/vite/ast-handler-extract.js +249 -0
- package/dist/vite/ast-handler-extract.js.map +1 -0
- package/dist/vite/expose-action-id.d.ts +19 -0
- package/dist/vite/expose-action-id.d.ts.map +1 -0
- package/dist/vite/expose-action-id.js +250 -0
- package/dist/vite/expose-action-id.js.map +1 -0
- package/dist/vite/expose-id-utils.d.ts +69 -0
- package/dist/vite/expose-id-utils.d.ts.map +1 -0
- package/dist/vite/expose-id-utils.js +289 -0
- package/dist/vite/expose-id-utils.js.map +1 -0
- package/dist/vite/expose-internal-ids.d.ts +22 -0
- package/dist/vite/expose-internal-ids.d.ts.map +1 -0
- package/dist/vite/expose-internal-ids.js +886 -0
- package/dist/vite/expose-internal-ids.js.map +1 -0
- package/dist/vite/index.d.ts +149 -0
- package/dist/vite/index.d.ts.map +1 -0
- package/dist/vite/index.js +3995 -2489
- package/dist/vite/index.js.map +1 -0
- package/dist/vite/package-resolution.d.ts +43 -0
- package/dist/vite/package-resolution.d.ts.map +1 -0
- package/dist/vite/package-resolution.js +112 -0
- package/dist/vite/package-resolution.js.map +1 -0
- package/dist/vite/virtual-entries.d.ts +25 -0
- package/dist/vite/virtual-entries.d.ts.map +1 -0
- package/{src/vite/virtual-entries.ts → dist/vite/virtual-entries.js} +12 -16
- package/dist/vite/virtual-entries.js.map +1 -0
- package/package.json +57 -52
- package/skills/breadcrumbs/SKILL.md +250 -0
- package/skills/cache-guide/SKILL.md +262 -0
- package/skills/caching/SKILL.md +85 -23
- package/skills/composability/SKILL.md +172 -0
- package/skills/debug-manifest/SKILL.md +12 -8
- package/skills/document-cache/SKILL.md +18 -16
- package/skills/fonts/SKILL.md +6 -4
- package/skills/hooks/SKILL.md +328 -70
- package/skills/host-router/SKILL.md +218 -0
- package/skills/intercept/SKILL.md +131 -8
- package/skills/layout/SKILL.md +100 -3
- package/skills/links/SKILL.md +62 -15
- package/skills/loader/SKILL.md +368 -42
- package/skills/middleware/SKILL.md +171 -34
- package/skills/mime-routes/SKILL.md +14 -10
- package/skills/parallel/SKILL.md +137 -1
- package/skills/prerender/SKILL.md +366 -28
- package/skills/rango/SKILL.md +85 -21
- package/skills/response-routes/SKILL.md +136 -83
- package/skills/route/SKILL.md +195 -21
- package/skills/router-setup/SKILL.md +123 -30
- package/skills/theme/SKILL.md +9 -8
- package/skills/typesafety/SKILL.md +240 -102
- package/skills/use-cache/SKILL.md +324 -0
- package/src/__internal.ts +102 -4
- package/src/bin/rango.ts +312 -15
- package/src/browser/action-coordinator.ts +97 -0
- package/src/browser/action-response-classifier.ts +99 -0
- package/src/browser/event-controller.ts +92 -64
- package/src/browser/history-state.ts +80 -0
- package/src/browser/intercept-utils.ts +52 -0
- package/src/browser/link-interceptor.ts +24 -4
- package/src/browser/logging.ts +11 -0
- package/src/browser/merge-segment-loaders.ts +20 -12
- package/src/browser/navigation-bridge.ts +266 -558
- package/src/browser/navigation-client.ts +132 -75
- package/src/browser/navigation-store.ts +33 -50
- package/src/browser/navigation-transaction.ts +297 -0
- package/src/browser/network-error-handler.ts +61 -0
- package/src/browser/partial-update.ts +292 -309
- package/src/browser/prefetch/cache.ts +206 -0
- package/src/browser/prefetch/fetch.ts +144 -0
- package/src/browser/prefetch/observer.ts +65 -0
- package/src/browser/prefetch/policy.ts +48 -0
- package/src/browser/prefetch/queue.ts +128 -0
- package/src/browser/rango-state.ts +112 -0
- package/src/browser/react/Link.tsx +190 -70
- package/src/browser/react/NavigationProvider.tsx +78 -11
- package/src/browser/react/context.ts +6 -0
- package/src/browser/react/filter-segment-order.ts +11 -0
- package/src/browser/react/index.ts +12 -12
- package/src/browser/react/location-state-shared.ts +95 -53
- package/src/browser/react/location-state.ts +60 -15
- package/src/browser/react/mount-context.ts +6 -1
- package/src/browser/react/nonce-context.ts +23 -0
- package/src/browser/react/shallow-equal.ts +27 -0
- package/src/browser/react/use-action.ts +29 -51
- package/src/browser/react/use-client-cache.ts +5 -3
- package/src/browser/react/use-handle.ts +29 -70
- package/src/browser/react/use-link-status.ts +6 -5
- package/src/browser/react/use-navigation.ts +22 -63
- package/src/browser/react/use-params.ts +65 -0
- package/src/browser/react/use-pathname.ts +47 -0
- package/src/browser/react/use-router.ts +63 -0
- package/src/browser/react/use-search-params.ts +56 -0
- package/src/browser/react/use-segments.ts +80 -97
- package/src/browser/response-adapter.ts +73 -0
- package/src/browser/rsc-router.tsx +188 -57
- package/src/browser/scroll-restoration.ts +117 -44
- package/src/browser/segment-reconciler.ts +221 -0
- package/src/browser/segment-structure-assert.ts +16 -0
- package/src/browser/server-action-bridge.ts +488 -606
- package/src/browser/shallow.ts +6 -1
- package/src/browser/types.ts +116 -47
- package/src/browser/validate-redirect-origin.ts +29 -0
- package/src/build/generate-manifest.ts +63 -21
- package/src/build/generate-route-types.ts +36 -1038
- package/src/build/index.ts +2 -5
- package/src/build/route-trie.ts +38 -12
- package/src/build/route-types/ast-helpers.ts +25 -0
- package/src/build/route-types/ast-route-extraction.ts +98 -0
- package/src/build/route-types/codegen.ts +102 -0
- package/src/build/route-types/include-resolution.ts +411 -0
- package/src/build/route-types/param-extraction.ts +48 -0
- package/src/build/route-types/per-module-writer.ts +128 -0
- package/src/build/route-types/router-processing.ts +479 -0
- package/src/build/route-types/scan-filter.ts +78 -0
- package/src/build/runtime-discovery.ts +231 -0
- package/src/cache/background-task.ts +34 -0
- package/src/cache/cache-key-utils.ts +44 -0
- package/src/cache/cache-policy.ts +125 -0
- package/src/cache/cache-runtime.ts +338 -0
- package/src/cache/cache-scope.ts +122 -303
- package/src/cache/cf/cf-cache-store.ts +571 -17
- package/src/cache/cf/index.ts +13 -3
- package/src/cache/document-cache.ts +116 -77
- package/src/cache/handle-capture.ts +81 -0
- package/src/cache/handle-snapshot.ts +41 -0
- package/src/cache/index.ts +1 -15
- package/src/cache/memory-segment-store.ts +191 -13
- package/src/cache/profile-registry.ts +73 -0
- package/src/cache/read-through-swr.ts +134 -0
- package/src/cache/segment-codec.ts +256 -0
- package/src/cache/taint.ts +98 -0
- package/src/cache/types.ts +72 -122
- package/src/client.rsc.tsx +3 -1
- package/src/client.tsx +84 -126
- package/src/component-utils.ts +4 -4
- package/src/components/DefaultDocument.tsx +5 -1
- package/src/context-var.ts +86 -0
- package/src/debug.ts +19 -9
- package/src/errors.ts +77 -7
- package/src/handle.ts +12 -7
- package/src/handles/MetaTags.tsx +73 -20
- package/src/handles/breadcrumbs.ts +66 -0
- package/src/handles/index.ts +1 -0
- package/src/handles/meta.ts +30 -13
- package/src/host/cookie-handler.ts +21 -15
- package/src/host/errors.ts +8 -8
- package/src/host/index.ts +4 -7
- package/src/host/pattern-matcher.ts +27 -27
- package/src/host/router.ts +61 -39
- package/src/host/testing.ts +8 -8
- package/src/host/types.ts +15 -7
- package/src/host/utils.ts +1 -1
- package/src/href-client.ts +65 -45
- package/src/index.rsc.ts +104 -40
- package/src/index.ts +122 -67
- package/src/internal-debug.ts +9 -3
- package/src/loader.rsc.ts +18 -93
- package/src/loader.ts +26 -9
- package/src/network-error-thrower.tsx +3 -1
- package/src/outlet-provider.tsx +45 -0
- package/src/prerender/param-hash.ts +4 -2
- package/src/prerender/store.ts +121 -17
- package/src/prerender.ts +325 -20
- package/src/reverse.ts +144 -124
- package/src/root-error-boundary.tsx +41 -29
- package/src/route-content-wrapper.tsx +7 -4
- package/src/route-definition/dsl-helpers.ts +959 -0
- package/src/route-definition/helper-factories.ts +200 -0
- package/src/route-definition/helpers-types.ts +430 -0
- package/src/route-definition/index.ts +52 -0
- package/src/route-definition/redirect.ts +93 -0
- package/src/route-definition.ts +1 -1450
- package/src/route-map-builder.ts +87 -133
- package/src/route-name.ts +53 -0
- package/src/route-types.ts +41 -6
- package/src/router/content-negotiation.ts +116 -0
- package/src/router/debug-manifest.ts +72 -0
- package/src/router/error-handling.ts +9 -9
- package/src/router/find-match.ts +160 -0
- package/src/router/handler-context.ts +324 -116
- package/src/router/intercept-resolution.ts +11 -4
- package/src/router/lazy-includes.ts +237 -0
- package/src/router/loader-resolution.ts +179 -133
- package/src/router/logging.ts +112 -6
- package/src/router/manifest.ts +58 -19
- package/src/router/match-api.ts +89 -88
- package/src/router/match-context.ts +4 -2
- package/src/router/match-handlers.ts +440 -0
- package/src/router/match-middleware/background-revalidation.ts +84 -89
- package/src/router/match-middleware/cache-lookup.ts +261 -48
- package/src/router/match-middleware/cache-store.ts +54 -13
- package/src/router/match-middleware/intercept-resolution.ts +45 -22
- package/src/router/match-middleware/segment-resolution.ts +20 -9
- package/src/router/match-pipelines.ts +10 -45
- package/src/router/match-result.ts +34 -17
- package/src/router/metrics.ts +235 -15
- package/src/router/middleware-cookies.ts +55 -0
- package/src/router/middleware-types.ts +222 -0
- package/src/router/middleware.ts +327 -369
- package/src/router/pattern-matching.ts +169 -31
- package/src/router/prerender-match.ts +402 -0
- package/src/router/preview-match.ts +170 -0
- package/src/router/revalidation.ts +105 -14
- package/src/router/router-context.ts +40 -21
- package/src/router/router-interfaces.ts +452 -0
- package/src/router/router-options.ts +592 -0
- package/src/router/router-registry.ts +24 -0
- package/src/router/segment-resolution/fresh.ts +656 -0
- package/src/router/segment-resolution/helpers.ts +263 -0
- package/src/router/segment-resolution/loader-cache.ts +199 -0
- package/src/router/segment-resolution/revalidation.ts +1277 -0
- package/src/router/segment-resolution/static-store.ts +67 -0
- package/src/router/segment-resolution.ts +21 -1354
- package/src/router/segment-wrappers.ts +291 -0
- package/src/router/telemetry-otel.ts +299 -0
- package/src/router/telemetry.ts +300 -0
- package/src/router/timeout.ts +148 -0
- package/src/router/trie-matching.ts +96 -29
- package/src/router/types.ts +15 -9
- package/src/router.ts +642 -2366
- package/src/rsc/handler-context.ts +45 -0
- package/src/rsc/handler.ts +646 -1027
- package/src/rsc/helpers.ts +140 -6
- package/src/rsc/index.ts +0 -20
- package/src/rsc/loader-fetch.ts +209 -0
- package/src/rsc/manifest-init.ts +86 -0
- package/src/rsc/nonce.ts +14 -0
- package/src/rsc/origin-guard.ts +141 -0
- package/src/rsc/progressive-enhancement.ts +379 -0
- package/src/rsc/response-error.ts +37 -0
- package/src/rsc/response-route-handler.ts +347 -0
- package/src/rsc/rsc-rendering.ts +237 -0
- package/src/rsc/runtime-warnings.ts +42 -0
- package/src/rsc/server-action.ts +348 -0
- package/src/rsc/ssr-setup.ts +128 -0
- package/src/rsc/types.ts +38 -11
- package/src/search-params.ts +66 -54
- package/src/segment-system.tsx +165 -17
- package/src/server/context.ts +237 -54
- package/src/server/cookie-store.ts +190 -0
- package/src/server/fetchable-loader-store.ts +11 -6
- package/src/server/handle-store.ts +94 -15
- package/src/server/loader-registry.ts +15 -56
- package/src/server/request-context.ts +438 -71
- package/src/server.ts +26 -164
- package/src/ssr/index.tsx +101 -31
- package/src/static-handler.ts +22 -4
- package/src/theme/ThemeProvider.tsx +21 -15
- package/src/theme/ThemeScript.tsx +5 -5
- package/src/theme/constants.ts +5 -2
- package/src/theme/index.ts +4 -14
- package/src/theme/theme-context.ts +4 -30
- package/src/theme/theme-script.ts +21 -18
- package/src/types/boundaries.ts +158 -0
- package/src/types/cache-types.ts +198 -0
- package/src/types/error-types.ts +192 -0
- package/src/types/global-namespace.ts +100 -0
- package/src/types/handler-context.ts +687 -0
- package/src/types/index.ts +88 -0
- package/src/types/loader-types.ts +183 -0
- package/src/types/route-config.ts +170 -0
- package/src/types/route-entry.ts +109 -0
- package/src/types/segments.ts +150 -0
- package/src/types.ts +1 -1795
- package/src/urls/include-helper.ts +197 -0
- package/src/urls/index.ts +53 -0
- package/src/urls/path-helper-types.ts +339 -0
- package/src/urls/path-helper.ts +329 -0
- package/src/urls/pattern-types.ts +95 -0
- package/src/urls/response-types.ts +106 -0
- package/src/urls/type-extraction.ts +372 -0
- package/src/urls/urls-function.ts +98 -0
- package/src/urls.ts +1 -1323
- package/src/use-loader.tsx +85 -77
- package/src/vite/discovery/bundle-postprocess.ts +184 -0
- package/src/vite/discovery/discover-routers.ts +344 -0
- package/src/vite/discovery/prerender-collection.ts +385 -0
- package/src/vite/discovery/route-types-writer.ts +258 -0
- package/src/vite/discovery/self-gen-tracking.ts +47 -0
- package/src/vite/discovery/state.ts +108 -0
- package/src/vite/discovery/virtual-module-codegen.ts +203 -0
- package/src/vite/index.ts +11 -2259
- package/src/vite/plugin-types.ts +48 -0
- package/src/vite/plugins/cjs-to-esm.ts +93 -0
- package/src/vite/plugins/client-ref-dedup.ts +115 -0
- package/src/vite/plugins/client-ref-hashing.ts +105 -0
- package/src/vite/{expose-action-id.ts → plugins/expose-action-id.ts} +72 -47
- package/src/vite/{expose-id-utils.ts → plugins/expose-id-utils.ts} +8 -43
- package/src/vite/plugins/expose-ids/export-analysis.ts +296 -0
- package/src/vite/plugins/expose-ids/handler-transform.ts +179 -0
- package/src/vite/plugins/expose-ids/loader-transform.ts +74 -0
- package/src/vite/plugins/expose-ids/router-transform.ts +110 -0
- package/src/vite/plugins/expose-ids/types.ts +45 -0
- package/src/vite/plugins/expose-internal-ids.ts +569 -0
- package/src/vite/plugins/refresh-cmd.ts +65 -0
- package/src/vite/plugins/use-cache-transform.ts +323 -0
- package/src/vite/plugins/version-injector.ts +83 -0
- package/src/vite/plugins/version-plugin.ts +266 -0
- package/src/vite/plugins/virtual-entries.ts +123 -0
- package/src/vite/plugins/virtual-stub-plugin.ts +29 -0
- package/src/vite/rango.ts +445 -0
- package/src/vite/router-discovery.ts +777 -0
- package/src/vite/{ast-handler-extract.ts → utils/ast-handler-extract.ts} +181 -9
- package/src/vite/utils/banner.ts +36 -0
- package/src/vite/utils/bundle-analysis.ts +137 -0
- package/src/vite/utils/manifest-utils.ts +70 -0
- package/src/vite/{package-resolution.ts → utils/package-resolution.ts} +25 -29
- package/src/vite/utils/prerender-utils.ts +189 -0
- package/src/vite/utils/shared-utils.ts +169 -0
- package/CLAUDE.md +0 -43
- package/src/browser/lru-cache.ts +0 -69
- package/src/browser/request-controller.ts +0 -164
- package/src/cache/memory-store.ts +0 -253
- package/src/router.gen.ts +0 -6
- package/src/static-handler.gen.ts +0 -5
- package/src/urls.gen.ts +0 -8
- package/src/vite/expose-internal-ids.ts +0 -1167
- /package/src/vite/{version.d.ts → plugins/version.d.ts} +0 -0
|
@@ -5,15 +5,28 @@ import type {
|
|
|
5
5
|
ResolvedSegment,
|
|
6
6
|
} from "./types.js";
|
|
7
7
|
import type { ReactNode } from "react";
|
|
8
|
+
import * as React from "react";
|
|
8
9
|
import { startTransition } from "react";
|
|
10
|
+
|
|
11
|
+
// addTransitionType is only available in React experimental
|
|
12
|
+
const addTransitionType: ((type: string) => void) | undefined =
|
|
13
|
+
"addTransitionType" in React ? (React as any).addTransitionType : undefined;
|
|
9
14
|
import type { RenderSegmentsOptions } from "../segment-system.js";
|
|
10
|
-
import {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
} from "
|
|
15
|
-
import {
|
|
16
|
-
import
|
|
15
|
+
import { reconcileSegments } from "./segment-reconciler.js";
|
|
16
|
+
import type { ReconcileActor } from "./segment-reconciler.js";
|
|
17
|
+
import { hasActiveIntercept as hasActiveInterceptSlots } from "./intercept-utils.js";
|
|
18
|
+
import type { BoundTransaction } from "./navigation-transaction.js";
|
|
19
|
+
import { ServerRedirect } from "../errors.js";
|
|
20
|
+
import { debugLog } from "./logging.js";
|
|
21
|
+
import { validateRedirectOrigin } from "./validate-redirect-origin.js";
|
|
22
|
+
import type { NavigationUpdate } from "./types.js";
|
|
23
|
+
|
|
24
|
+
/** Build a scroll payload from the commit's scroll option */
|
|
25
|
+
function toScrollPayload(
|
|
26
|
+
scroll: boolean | undefined,
|
|
27
|
+
): NonNullable<NavigationUpdate["scroll"]> {
|
|
28
|
+
return { enabled: scroll !== false ? scroll : false };
|
|
29
|
+
}
|
|
17
30
|
|
|
18
31
|
/**
|
|
19
32
|
* Configuration for creating a partial updater
|
|
@@ -42,12 +55,30 @@ export interface CommitOverrides {
|
|
|
42
55
|
intercept?: boolean;
|
|
43
56
|
/** Source URL where intercept was triggered from */
|
|
44
57
|
interceptSourceUrl?: string;
|
|
58
|
+
/** Server-set location state to merge into history.pushState */
|
|
59
|
+
serverState?: Record<string, unknown>;
|
|
45
60
|
}
|
|
46
61
|
|
|
47
62
|
/**
|
|
48
|
-
*
|
|
49
|
-
* Transaction encapsulates all store mutations for atomic commit
|
|
63
|
+
* Discriminated update mode for partial updates.
|
|
50
64
|
*/
|
|
65
|
+
export type UpdateMode =
|
|
66
|
+
| {
|
|
67
|
+
type: "navigate";
|
|
68
|
+
/** Cached segments for the target URL. When provided, these are used to build
|
|
69
|
+
* the segment map instead of the current page's segments. This ensures consistency
|
|
70
|
+
* when we send cached segment IDs to the server - if the server returns empty diff,
|
|
71
|
+
* we use the same segments we told the server we have. */
|
|
72
|
+
targetCacheSegments?: ResolvedSegment[];
|
|
73
|
+
/** Cached handle data for the target URL. When server returns empty diff and we're
|
|
74
|
+
* rendering from cache, this is passed to the UI to restore breadcrumbs etc. */
|
|
75
|
+
targetCacheHandleData?: Record<string, Record<string, unknown[]>>;
|
|
76
|
+
/** Source URL for intercept restore (popstate cache miss) */
|
|
77
|
+
interceptSourceUrl?: string;
|
|
78
|
+
}
|
|
79
|
+
| { type: "leave-intercept" }
|
|
80
|
+
| { type: "stale-revalidation"; interceptSourceUrl?: string }
|
|
81
|
+
| { type: "action"; interceptSourceUrl?: string };
|
|
51
82
|
|
|
52
83
|
/**
|
|
53
84
|
* Type for the fetchPartialUpdate function
|
|
@@ -57,24 +88,9 @@ export type PartialUpdater = (
|
|
|
57
88
|
segmentIds: string[] | undefined,
|
|
58
89
|
isRetry: boolean,
|
|
59
90
|
signal: AbortSignal | undefined,
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
staleRevalidation?: boolean;
|
|
64
|
-
interceptSourceUrl?: string;
|
|
65
|
-
/** Cached segments for the target URL. When provided, these are used to build
|
|
66
|
-
* the segment map instead of the current page's segments. This ensures consistency
|
|
67
|
-
* when we send cached segment IDs to the server - if the server returns empty diff,
|
|
68
|
-
* we use the same segments we told the server we have. */
|
|
69
|
-
targetCacheSegments?: ResolvedSegment[];
|
|
70
|
-
/** Cached handle data for the target URL. When server returns empty diff and we're
|
|
71
|
-
* rendering from cache, this is passed to the UI to restore breadcrumbs etc. */
|
|
72
|
-
targetCacheHandleData?: Record<string, Record<string, unknown[]>>;
|
|
73
|
-
/** When true, we're leaving an intercept state - don't use current segment IDs
|
|
74
|
-
* as fallback and force a fresh render from server */
|
|
75
|
-
leavingIntercept?: boolean;
|
|
76
|
-
},
|
|
77
|
-
) => Promise<Promise<void>>;
|
|
91
|
+
tx: BoundTransaction,
|
|
92
|
+
mode?: UpdateMode,
|
|
93
|
+
) => Promise<void>;
|
|
78
94
|
|
|
79
95
|
/**
|
|
80
96
|
* Create a partial updater for fetching and applying RSC partial updates
|
|
@@ -84,18 +100,6 @@ export type PartialUpdater = (
|
|
|
84
100
|
*
|
|
85
101
|
* @param config - Partial update configuration
|
|
86
102
|
* @returns fetchPartialUpdate function
|
|
87
|
-
*
|
|
88
|
-
* @example
|
|
89
|
-
* ```typescript
|
|
90
|
-
* const fetchPartialUpdate = createPartialUpdater({
|
|
91
|
-
* store,
|
|
92
|
-
* client,
|
|
93
|
-
* onUpdate: (update) => store.emit(update),
|
|
94
|
-
* renderSegments,
|
|
95
|
-
* });
|
|
96
|
-
*
|
|
97
|
-
* await fetchPartialUpdate('/new-page');
|
|
98
|
-
* ```
|
|
99
103
|
*/
|
|
100
104
|
export function createPartialUpdater(
|
|
101
105
|
config: PartialUpdateConfig,
|
|
@@ -103,20 +107,16 @@ export function createPartialUpdater(
|
|
|
103
107
|
const { store, client, onUpdate, renderSegments, version } = config;
|
|
104
108
|
|
|
105
109
|
/**
|
|
106
|
-
*
|
|
110
|
+
* Get current page's cached segments as an array
|
|
107
111
|
*/
|
|
108
|
-
function
|
|
112
|
+
function getCurrentCachedSegments(): ResolvedSegment[] {
|
|
109
113
|
const currentKey = store.getHistoryKey();
|
|
110
114
|
const cached = store.getCachedSegments(currentKey);
|
|
111
|
-
|
|
112
|
-
const map = new Map<string, ResolvedSegment>();
|
|
113
|
-
cachedSegments.forEach((s) => map.set(s.id, s));
|
|
114
|
-
return map;
|
|
115
|
+
return cached?.segments || [];
|
|
115
116
|
}
|
|
116
117
|
|
|
117
118
|
/**
|
|
118
119
|
* Fetch partial update and trigger UI update
|
|
119
|
-
* Returns a promise that resolves when the RSC stream is fully consumed
|
|
120
120
|
*
|
|
121
121
|
* @param tx - Transaction for committing segment state (required)
|
|
122
122
|
* @param signal - AbortSignal to check if navigation is stale (not for aborting fetch)
|
|
@@ -127,40 +127,34 @@ export function createPartialUpdater(
|
|
|
127
127
|
isRetry: boolean,
|
|
128
128
|
signal: AbortSignal | undefined,
|
|
129
129
|
tx: BoundTransaction,
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
staleRevalidation?: boolean;
|
|
133
|
-
interceptSourceUrl?: string;
|
|
134
|
-
targetCacheSegments?: ResolvedSegment[];
|
|
135
|
-
targetCacheHandleData?: Record<string, Record<string, unknown[]>>;
|
|
136
|
-
leavingIntercept?: boolean;
|
|
137
|
-
},
|
|
138
|
-
): Promise<Promise<void>> {
|
|
139
|
-
const {
|
|
140
|
-
isAction = false,
|
|
141
|
-
staleRevalidation = false,
|
|
142
|
-
interceptSourceUrl,
|
|
143
|
-
targetCacheSegments,
|
|
144
|
-
targetCacheHandleData,
|
|
145
|
-
leavingIntercept = false,
|
|
146
|
-
} = options || {};
|
|
130
|
+
mode: UpdateMode = { type: "navigate" },
|
|
131
|
+
): Promise<void> {
|
|
147
132
|
const segmentState = store.getSegmentState();
|
|
148
133
|
const url = targetUrl || window.location.href;
|
|
149
134
|
|
|
150
135
|
// Capture history key at start for stale revalidation consistency check
|
|
151
136
|
const historyKeyAtStart = store.getHistoryKey();
|
|
152
137
|
|
|
153
|
-
//
|
|
154
|
-
|
|
138
|
+
// Derive interceptSourceUrl from modes that carry it
|
|
139
|
+
const interceptSourceUrl =
|
|
140
|
+
mode.type === "stale-revalidation" ||
|
|
141
|
+
mode.type === "action" ||
|
|
142
|
+
mode.type === "navigate"
|
|
143
|
+
? mode.interceptSourceUrl
|
|
144
|
+
: undefined;
|
|
145
|
+
|
|
146
|
+
// When leaving intercept, filter out intercept-specific segments
|
|
155
147
|
let segments: string[];
|
|
156
|
-
if (
|
|
157
|
-
// When leaving intercept, only send segments that aren't intercept-specific
|
|
158
|
-
// The server will return the non-intercept version of the route
|
|
148
|
+
if (mode.type === "leave-intercept") {
|
|
159
149
|
const currentSegments = segmentIds ?? segmentState.currentSegmentIds;
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
150
|
+
const currentCached = getCurrentCachedSegments();
|
|
151
|
+
const interceptIds = new Set(
|
|
152
|
+
currentCached
|
|
153
|
+
.filter((s) => s.namespace?.startsWith("intercept:"))
|
|
154
|
+
.map((s) => s.id),
|
|
155
|
+
);
|
|
156
|
+
segments = currentSegments.filter((id) => !interceptIds.has(id));
|
|
157
|
+
debugLog(
|
|
164
158
|
`[Browser] Leaving intercept - filtered segments: ${segments.join(", ")}`,
|
|
165
159
|
);
|
|
166
160
|
} else {
|
|
@@ -168,209 +162,190 @@ export function createPartialUpdater(
|
|
|
168
162
|
}
|
|
169
163
|
|
|
170
164
|
// For intercept revalidation, use the intercept source URL as previousUrl
|
|
171
|
-
// This tells the server the route should be treated as an intercept
|
|
172
165
|
const previousUrl =
|
|
173
166
|
interceptSourceUrl || tx.currentUrl || segmentState.currentUrl;
|
|
174
167
|
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
168
|
+
debugLog(`\n[Browser] >>> NAVIGATION`);
|
|
169
|
+
debugLog(`[Browser] From: ${previousUrl}`);
|
|
170
|
+
debugLog(`[Browser] To: ${url}`);
|
|
171
|
+
debugLog(`[Browser] Segments to send: ${segments.join(", ")}`);
|
|
179
172
|
if (interceptSourceUrl) {
|
|
180
|
-
|
|
173
|
+
debugLog(`[Browser] Intercept context from: ${interceptSourceUrl}`);
|
|
181
174
|
}
|
|
182
175
|
|
|
183
|
-
//
|
|
184
|
-
// When
|
|
185
|
-
// to ensure consistency - we use the same segments we told the server we have.
|
|
176
|
+
// Get cached segments for merging with server diff.
|
|
177
|
+
// When navigating with targetCacheSegments, use those for consistency.
|
|
186
178
|
// Otherwise fall back to current page's segments (for same-route revalidation).
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
// Mark navigation as streaming (response received, now parsing RSC)
|
|
195
|
-
// The token is ended when the stream completes
|
|
196
|
-
const streamingToken = tx.startStreaming();
|
|
179
|
+
const targetCache =
|
|
180
|
+
mode.type === "navigate" ? mode.targetCacheSegments : undefined;
|
|
181
|
+
const cachedSegs =
|
|
182
|
+
targetCache && targetCache.length > 0
|
|
183
|
+
? targetCache
|
|
184
|
+
: getCurrentCachedSegments();
|
|
185
|
+
|
|
197
186
|
// Fetch partial payload (no abort signal - RSC doesn't support it well)
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
187
|
+
let fetchResult: Awaited<ReturnType<NavigationClient["fetchPartial"]>>;
|
|
188
|
+
fetchResult = await client.fetchPartial({
|
|
189
|
+
targetUrl: url,
|
|
190
|
+
segmentIds: segments,
|
|
191
|
+
previousUrl,
|
|
192
|
+
// Mark stale when explicitly requested OR when no segments are sent
|
|
193
|
+
// (action redirect sends empty segments for a fresh render).
|
|
194
|
+
staleRevalidation:
|
|
195
|
+
mode.type === "stale-revalidation" || segments.length === 0,
|
|
196
|
+
version,
|
|
197
|
+
});
|
|
198
|
+
// Mark navigation as streaming (response received, now parsing RSC).
|
|
199
|
+
// Called after fetchPartial so pendingUrl stays set during the network wait,
|
|
200
|
+
// allowing useLinkStatus to show per-link pending indicators.
|
|
201
|
+
const streamingToken = tx.startStreaming();
|
|
202
|
+
const { payload, streamComplete: rawStreamComplete } = fetchResult;
|
|
203
|
+
debugLog("payload.metadata", payload.metadata);
|
|
207
204
|
|
|
208
205
|
const streamComplete = rawStreamComplete.then(() => {
|
|
209
206
|
streamingToken.end();
|
|
210
207
|
});
|
|
211
208
|
|
|
209
|
+
// Handle server-side redirect with state
|
|
210
|
+
if (payload.metadata?.redirect) {
|
|
211
|
+
if (signal?.aborted) {
|
|
212
|
+
debugLog("[Browser] Ignoring stale redirect (aborted)");
|
|
213
|
+
return;
|
|
214
|
+
}
|
|
215
|
+
const redirectUrl = validateRedirectOrigin(
|
|
216
|
+
payload.metadata.redirect.url,
|
|
217
|
+
window.location.origin,
|
|
218
|
+
);
|
|
219
|
+
if (!redirectUrl) {
|
|
220
|
+
debugLog("[Browser] Ignoring blocked redirect payload");
|
|
221
|
+
return;
|
|
222
|
+
}
|
|
223
|
+
const serverState = payload.metadata.locationState;
|
|
224
|
+
throw new ServerRedirect(redirectUrl, serverState);
|
|
225
|
+
}
|
|
226
|
+
|
|
212
227
|
if (payload.metadata?.isPartial) {
|
|
213
228
|
const { segments: newSegments, matched, diff } = payload.metadata;
|
|
214
229
|
|
|
215
230
|
// Check if this navigation is stale (a newer one started)
|
|
216
231
|
if (signal?.aborted) {
|
|
217
|
-
|
|
218
|
-
return
|
|
232
|
+
debugLog("[Browser] Ignoring stale navigation (aborted)");
|
|
233
|
+
return;
|
|
219
234
|
}
|
|
220
235
|
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
// Create lookup for new segments from server
|
|
225
|
-
const newSegmentMap = new Map<string, ResolvedSegment>();
|
|
226
|
-
(newSegments || []).forEach((s: ResolvedSegment) =>
|
|
227
|
-
newSegmentMap.set(s.id, s),
|
|
228
|
-
);
|
|
236
|
+
debugLog(`[Browser] Partial update - matched: ${matched?.join(", ")}`);
|
|
237
|
+
debugLog(`[Browser] Diff: ${diff?.join(", ")}`);
|
|
229
238
|
|
|
230
239
|
// If diff is empty, nothing changed on server side.
|
|
231
|
-
// However, if we're navigating with targetCacheSegments (to a different route),
|
|
232
|
-
// we still need to render those segments since the UI is showing the old route.
|
|
233
240
|
if (!diff || diff.length === 0) {
|
|
234
241
|
const matchedIds = matched || [];
|
|
242
|
+
const cacheMap = new Map(cachedSegs.map((s) => [s.id, s]));
|
|
235
243
|
const existingSegments = matchedIds
|
|
236
|
-
.map((id: string) =>
|
|
244
|
+
.map((id: string) => cacheMap.get(id))
|
|
237
245
|
.filter(Boolean) as ResolvedSegment[];
|
|
238
246
|
|
|
239
247
|
// When navigating with cached segments to a different route, render them.
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
`[Browser] No diff but navigating with cached segments - rendering target route`,
|
|
248
|
+
if (mode.type === "navigate" && targetCache && targetCache.length > 0) {
|
|
249
|
+
debugLog(
|
|
250
|
+
"[Browser] No diff but navigating with cached segments - rendering target route",
|
|
244
251
|
);
|
|
245
252
|
|
|
246
253
|
const newTree = await renderSegments(existingSegments, {
|
|
247
254
|
forceAwait: true,
|
|
248
255
|
});
|
|
249
256
|
|
|
250
|
-
tx.commit(
|
|
257
|
+
const { scroll: commitScroll } = tx.commit(
|
|
258
|
+
matchedIds,
|
|
259
|
+
existingSegments,
|
|
260
|
+
);
|
|
251
261
|
|
|
252
262
|
// Include cachedHandleData in metadata so NavigationProvider can restore
|
|
253
263
|
// breadcrumbs and other handle data from cache.
|
|
254
|
-
//
|
|
264
|
+
// Remove `handles` from metadata to prevent NavigationProvider from
|
|
255
265
|
// processing an empty handles stream, which would clear the cached breadcrumbs.
|
|
256
|
-
// When rendering from cache with empty diff, we want to use cachedHandleData instead.
|
|
257
266
|
const { handles: _unusedHandles, ...metadataWithoutHandles } =
|
|
258
267
|
payload.metadata!;
|
|
259
|
-
|
|
268
|
+
const cachedUpdate = {
|
|
260
269
|
root: newTree,
|
|
261
270
|
metadata: {
|
|
262
271
|
...metadataWithoutHandles,
|
|
263
|
-
cachedHandleData: targetCacheHandleData,
|
|
272
|
+
cachedHandleData: mode.targetCacheHandleData,
|
|
264
273
|
},
|
|
265
|
-
|
|
274
|
+
scroll: toScrollPayload(commitScroll),
|
|
275
|
+
};
|
|
266
276
|
|
|
267
|
-
|
|
268
|
-
|
|
277
|
+
const cachedHasTransition = existingSegments.some(
|
|
278
|
+
(s) => s.transition,
|
|
279
|
+
);
|
|
280
|
+
if (cachedHasTransition) {
|
|
281
|
+
startTransition(() => {
|
|
282
|
+
if (addTransitionType) {
|
|
283
|
+
addTransitionType("navigation");
|
|
284
|
+
}
|
|
285
|
+
onUpdate(cachedUpdate);
|
|
286
|
+
});
|
|
287
|
+
} else {
|
|
288
|
+
onUpdate(cachedUpdate);
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
debugLog("[Browser] Navigation complete (rendered from cache)");
|
|
292
|
+
return;
|
|
269
293
|
}
|
|
270
294
|
|
|
271
295
|
// When leaving intercept, force re-render even with empty diff
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
console.log(
|
|
276
|
-
`[Browser] Leaving intercept - forcing re-render to remove modal`,
|
|
296
|
+
if (mode.type === "leave-intercept") {
|
|
297
|
+
debugLog(
|
|
298
|
+
"[Browser] Leaving intercept - forcing re-render to remove modal",
|
|
277
299
|
);
|
|
278
300
|
|
|
279
301
|
const newTree = await renderSegments(existingSegments, {
|
|
280
302
|
forceAwait: true,
|
|
281
303
|
});
|
|
282
304
|
|
|
283
|
-
tx.commit(
|
|
305
|
+
const { scroll: leaveScroll } = tx.commit(
|
|
306
|
+
matchedIds,
|
|
307
|
+
existingSegments,
|
|
308
|
+
);
|
|
284
309
|
|
|
285
310
|
onUpdate({
|
|
286
311
|
root: newTree,
|
|
287
312
|
metadata: payload.metadata,
|
|
313
|
+
scroll: toScrollPayload(leaveScroll),
|
|
288
314
|
});
|
|
289
315
|
|
|
290
|
-
|
|
291
|
-
return
|
|
316
|
+
debugLog("[Browser] Navigation complete (left intercept)");
|
|
317
|
+
return;
|
|
292
318
|
}
|
|
293
319
|
|
|
294
320
|
// Same route revalidation with no changes - skip UI update
|
|
295
|
-
|
|
296
|
-
|
|
321
|
+
debugLog(
|
|
322
|
+
"[Browser] No changes - all revalidations returned false, keeping existing UI",
|
|
297
323
|
);
|
|
298
324
|
tx.commit(matchedIds, existingSegments);
|
|
299
|
-
|
|
300
|
-
return
|
|
325
|
+
debugLog("[Browser] Navigation complete (no re-render)");
|
|
326
|
+
return;
|
|
301
327
|
}
|
|
302
328
|
|
|
303
|
-
//
|
|
304
|
-
// - New/changed segments from server response (diff)
|
|
305
|
-
// - Unchanged segments from current page's cache
|
|
329
|
+
// Reconcile server segments with cached segments (single source of truth)
|
|
306
330
|
const matchedIds = matched || [];
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
// First check server response (new/updated segments)
|
|
321
|
-
const fromServer = newSegmentMap.get(id);
|
|
322
|
-
if (fromServer) {
|
|
323
|
-
// For partial revalidation (stale or action), merge server's new loader data
|
|
324
|
-
// with cached loader data when server returns fewer loaders than cached
|
|
325
|
-
const fromCache = currentSegmentMap.get(id);
|
|
326
|
-
// Dev-mode assertion: warn if tree structure would change
|
|
327
|
-
if (fromCache) {
|
|
328
|
-
assertSegmentStructure(fromCache, fromServer, "partial-update");
|
|
329
|
-
}
|
|
330
|
-
if (
|
|
331
|
-
(staleRevalidation || isAction) &&
|
|
332
|
-
needsLoaderMerge(fromServer, fromCache)
|
|
333
|
-
) {
|
|
334
|
-
return mergeSegmentLoaders(fromServer, fromCache);
|
|
335
|
-
}
|
|
336
|
-
// When server returns component: null for a layout segment, it means
|
|
337
|
-
// "this segment doesn't need re-rendering" - preserve the cached component
|
|
338
|
-
// to maintain the outlet chain and prevent React tree changes
|
|
339
|
-
if (
|
|
340
|
-
fromServer.component === null &&
|
|
341
|
-
fromServer.type === "layout" &&
|
|
342
|
-
fromCache?.component != null
|
|
343
|
-
) {
|
|
344
|
-
console.log(
|
|
345
|
-
`[Browser] Preserving cached component for layout ${id} (server returned null)`,
|
|
346
|
-
);
|
|
347
|
-
return { ...fromServer, component: fromCache.component };
|
|
348
|
-
}
|
|
349
|
-
return fromServer;
|
|
350
|
-
}
|
|
351
|
-
// Fall back to current page's cached segments
|
|
352
|
-
const fromCache = currentSegmentMap.get(id);
|
|
353
|
-
if (!fromCache) {
|
|
354
|
-
console.warn(`[Browser] Missing segment: ${id}`);
|
|
355
|
-
return fromCache;
|
|
356
|
-
}
|
|
357
|
-
// Clear loading for cached segments to prevent suspense - server decided
|
|
358
|
-
// this segment doesn't need re-rendering, so show content as-is
|
|
359
|
-
if (fromCache.loading !== undefined) {
|
|
360
|
-
return { ...fromCache, loading: undefined };
|
|
361
|
-
}
|
|
362
|
-
return fromCache;
|
|
363
|
-
})
|
|
364
|
-
.filter(Boolean) as ResolvedSegment[];
|
|
365
|
-
|
|
366
|
-
// Insert diff segments not in matchedIds (e.g., loader segments from consolidation fetch)
|
|
367
|
-
insertMissingDiffSegments(allSegments, diff, matchedIdSet, newSegmentMap);
|
|
331
|
+
const actor: ReconcileActor =
|
|
332
|
+
mode.type === "stale-revalidation" || mode.type === "action"
|
|
333
|
+
? "stale-revalidation"
|
|
334
|
+
: "navigation";
|
|
335
|
+
|
|
336
|
+
const reconciled = reconcileSegments({
|
|
337
|
+
actor,
|
|
338
|
+
matched: matchedIds,
|
|
339
|
+
diff: diff || [],
|
|
340
|
+
serverSegments: newSegments || [],
|
|
341
|
+
cachedSegments: cachedSegs,
|
|
342
|
+
insertMissingDiff: true,
|
|
343
|
+
});
|
|
368
344
|
|
|
369
345
|
// HMR RESILIENCE: Check if we're missing any matched segments
|
|
370
|
-
|
|
371
|
-
const allSegmentIdSet = new Set(allSegments.map((s) => s.id));
|
|
346
|
+
const reconciledIdSet = new Set(reconciled.segments.map((s) => s.id));
|
|
372
347
|
const missingIds = matchedIds.filter(
|
|
373
|
-
(id: string) => !
|
|
348
|
+
(id: string) => !reconciledIdSet.has(id),
|
|
374
349
|
);
|
|
375
350
|
|
|
376
351
|
if (missingIds.length > 0) {
|
|
@@ -383,52 +358,39 @@ export function createPartialUpdater(
|
|
|
383
358
|
);
|
|
384
359
|
}
|
|
385
360
|
if (signal?.aborted) {
|
|
386
|
-
|
|
387
|
-
|
|
361
|
+
debugLog(
|
|
362
|
+
"[Browser] Ignoring stale navigation (aborted during HMR retry)",
|
|
388
363
|
);
|
|
389
|
-
return
|
|
364
|
+
return;
|
|
390
365
|
}
|
|
391
|
-
if (
|
|
392
|
-
return
|
|
366
|
+
if (mode.type === "action") {
|
|
367
|
+
return;
|
|
393
368
|
}
|
|
394
369
|
console.warn(
|
|
395
370
|
`[Browser] HMR detected: Missing ${missingCount} segments. Refetching all...`,
|
|
396
371
|
);
|
|
397
372
|
|
|
398
373
|
// Refetch with empty segments = server sends everything
|
|
399
|
-
return fetchPartialUpdate(url, [], true, signal, tx,
|
|
374
|
+
return fetchPartialUpdate(url, [], true, signal, tx, mode);
|
|
400
375
|
}
|
|
401
376
|
|
|
402
|
-
// INTERCEPT HANDLING: Separate intercept segments for explicit injection
|
|
403
|
-
// Intercept segments have namespace starting with "intercept:" or ID containing .@
|
|
404
|
-
// This makes the flow clearer and easier to debug
|
|
405
|
-
const isInterceptSegment = (s: ResolvedSegment) =>
|
|
406
|
-
s.namespace?.startsWith("intercept:") ||
|
|
407
|
-
(s.type === "parallel" && s.id.includes(".@"));
|
|
408
|
-
|
|
409
|
-
const interceptSegments = allSegments.filter(isInterceptSegment);
|
|
410
|
-
const mainSegments = allSegments.filter((s) => !isInterceptSegment(s));
|
|
411
|
-
|
|
412
377
|
if (signal?.aborted) {
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
);
|
|
416
|
-
return streamComplete;
|
|
378
|
+
debugLog("[Browser] Ignoring stale navigation (aborted before render)");
|
|
379
|
+
return;
|
|
417
380
|
}
|
|
418
381
|
|
|
419
382
|
// Rebuild tree on client (await for loader data resolution)
|
|
420
|
-
// Race against abort signal to allow cancellation during loader awaiting
|
|
421
|
-
// Pass intercept segments separately for explicit handling
|
|
422
|
-
// For stale revalidation, use forceAwait to ensure no loading fallbacks
|
|
423
383
|
const renderOptions = {
|
|
424
|
-
isAction,
|
|
425
|
-
forceAwait:
|
|
384
|
+
isAction: mode.type === "action",
|
|
385
|
+
forceAwait: mode.type === "stale-revalidation",
|
|
426
386
|
interceptSegments:
|
|
427
|
-
interceptSegments.length > 0
|
|
387
|
+
reconciled.interceptSegments.length > 0
|
|
388
|
+
? reconciled.interceptSegments
|
|
389
|
+
: undefined,
|
|
428
390
|
};
|
|
429
391
|
const newTree = await (signal
|
|
430
392
|
? Promise.race([
|
|
431
|
-
renderSegments(mainSegments, renderOptions),
|
|
393
|
+
renderSegments(reconciled.mainSegments, renderOptions),
|
|
432
394
|
new Promise<never>((_, reject) => {
|
|
433
395
|
if (signal.aborted) {
|
|
434
396
|
reject(new DOMException("Navigation aborted", "AbortError"));
|
|
@@ -438,158 +400,179 @@ export function createPartialUpdater(
|
|
|
438
400
|
});
|
|
439
401
|
}),
|
|
440
402
|
])
|
|
441
|
-
: renderSegments(mainSegments, renderOptions));
|
|
403
|
+
: renderSegments(reconciled.mainSegments, renderOptions));
|
|
442
404
|
|
|
443
405
|
// Final abort check before committing - another navigation may have started
|
|
444
406
|
if (signal?.aborted) {
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
);
|
|
448
|
-
return streamComplete;
|
|
407
|
+
debugLog("[Browser] Ignoring stale navigation (aborted before commit)");
|
|
408
|
+
return;
|
|
449
409
|
}
|
|
450
410
|
|
|
451
411
|
// Check if this is an intercept response (any slot is active)
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
: false;
|
|
456
|
-
|
|
457
|
-
// BUG FIX: When navigating with cached target segments but receiving an intercept response,
|
|
458
|
-
// the background segments should come from the SOURCE page (where we navigated from),
|
|
459
|
-
// not the TARGET cache. This happens when:
|
|
460
|
-
// 1. User visits /product/xxx (detail page) - cached under key "/product/xxx"
|
|
461
|
-
// 2. User navigates back to /
|
|
462
|
-
// 3. User clicks product link → cache hit for "/product/xxx" (detail page)
|
|
463
|
-
// 4. But server returns intercept response (modal with index background)
|
|
464
|
-
// 5. Without this fix: background uses detail page segments (wrong!)
|
|
465
|
-
// 6. With this fix: rebuild currentSegmentMap from source page
|
|
466
|
-
if (hasActiveIntercept && targetCacheSegments) {
|
|
467
|
-
console.log(
|
|
468
|
-
`[Browser] Intercept response with target cache - rebuilding segment map from source page`,
|
|
469
|
-
);
|
|
470
|
-
currentSegmentMap = getCurrentSegmentMap();
|
|
471
|
-
}
|
|
412
|
+
const isInterceptResponse = hasActiveInterceptSlots(
|
|
413
|
+
payload.metadata?.slots,
|
|
414
|
+
);
|
|
472
415
|
|
|
473
|
-
// Track intercept context
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
416
|
+
// Track intercept context (only on navigation, not actions or stale revalidation)
|
|
417
|
+
// Use the authoritative source from mode/history state when restoring an
|
|
418
|
+
// intercept via popstate cache miss; fall back to the current URL for fresh
|
|
419
|
+
// intercept navigations.
|
|
420
|
+
const effectiveInterceptSource =
|
|
421
|
+
interceptSourceUrl || segmentState.currentUrl;
|
|
422
|
+
if (mode.type !== "action" && mode.type !== "stale-revalidation") {
|
|
423
|
+
if (isInterceptResponse) {
|
|
424
|
+
store.setInterceptSourceUrl(effectiveInterceptSource);
|
|
478
425
|
} else {
|
|
479
|
-
// Clear intercept context when navigating to a non-intercept route
|
|
480
426
|
store.setInterceptSourceUrl(null);
|
|
481
427
|
}
|
|
482
428
|
}
|
|
483
429
|
|
|
484
|
-
// Commit navigation -
|
|
485
|
-
//
|
|
486
|
-
//
|
|
487
|
-
|
|
488
|
-
const
|
|
489
|
-
|
|
430
|
+
// Commit navigation - use server's matched as the authoritative segment ID list.
|
|
431
|
+
// reconciled.segments may be missing IDs (e.g., loader segments not in diff or cache)
|
|
432
|
+
// but the server's matched always includes all expected segment IDs.
|
|
433
|
+
const allSegmentIds = matchedIds;
|
|
434
|
+
const serverLocationState = payload.metadata?.locationState;
|
|
435
|
+
const overrides: CommitOverrides | undefined = isInterceptResponse
|
|
436
|
+
? {
|
|
437
|
+
scroll: false,
|
|
438
|
+
intercept: true,
|
|
439
|
+
interceptSourceUrl: effectiveInterceptSource,
|
|
440
|
+
...(serverLocationState && { serverState: serverLocationState }),
|
|
441
|
+
}
|
|
442
|
+
: serverLocationState
|
|
443
|
+
? { serverState: serverLocationState }
|
|
444
|
+
: undefined;
|
|
445
|
+
const { scroll: navScroll } = tx.commit(
|
|
490
446
|
allSegmentIds,
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
? {
|
|
494
|
-
scroll: false,
|
|
495
|
-
intercept: true,
|
|
496
|
-
interceptSourceUrl: segmentState.currentUrl,
|
|
497
|
-
}
|
|
498
|
-
: undefined,
|
|
447
|
+
reconciled.segments,
|
|
448
|
+
overrides,
|
|
499
449
|
);
|
|
500
450
|
|
|
501
451
|
// For stale revalidation: verify history key hasn't changed before updating UI
|
|
502
|
-
|
|
503
|
-
if (staleRevalidation) {
|
|
452
|
+
if (mode.type === "stale-revalidation") {
|
|
504
453
|
const historyKeyNow = store.getHistoryKey();
|
|
505
454
|
if (historyKeyNow !== historyKeyAtStart) {
|
|
506
|
-
|
|
455
|
+
debugLog(
|
|
507
456
|
`[Browser] Stale revalidation: history key changed (${historyKeyAtStart} -> ${historyKeyNow}), skipping UI update`,
|
|
508
457
|
);
|
|
509
|
-
return
|
|
458
|
+
return;
|
|
510
459
|
}
|
|
511
460
|
}
|
|
512
461
|
|
|
513
|
-
|
|
462
|
+
debugLog("[partial-update] updating document");
|
|
463
|
+
|
|
464
|
+
// Emit update to trigger React render.
|
|
465
|
+
// Scroll info is included so NavigationProvider applies it after React commits.
|
|
466
|
+
const hasTransition = reconciled.mainSegments.some((s) => s.transition);
|
|
467
|
+
const scrollPayload = toScrollPayload(navScroll);
|
|
514
468
|
|
|
515
|
-
|
|
516
|
-
// For stale revalidation: wait for stream to complete (loaders resolved), then update
|
|
517
|
-
// For actions: wrap in startTransition to avoid UI flickering
|
|
518
|
-
if (isAction || staleRevalidation) {
|
|
469
|
+
if (mode.type === "action" || mode.type === "stale-revalidation") {
|
|
519
470
|
startTransition(() => {
|
|
471
|
+
if (hasTransition && addTransitionType) {
|
|
472
|
+
addTransitionType("action");
|
|
473
|
+
}
|
|
520
474
|
onUpdate({
|
|
521
475
|
root: newTree,
|
|
522
476
|
metadata: payload.metadata!,
|
|
477
|
+
scroll: scrollPayload,
|
|
478
|
+
});
|
|
479
|
+
});
|
|
480
|
+
} else if (hasTransition) {
|
|
481
|
+
startTransition(() => {
|
|
482
|
+
if (addTransitionType) {
|
|
483
|
+
addTransitionType("navigation");
|
|
484
|
+
}
|
|
485
|
+
onUpdate({
|
|
486
|
+
root: newTree,
|
|
487
|
+
metadata: payload.metadata!,
|
|
488
|
+
scroll: scrollPayload,
|
|
523
489
|
});
|
|
524
490
|
});
|
|
525
491
|
} else {
|
|
526
492
|
onUpdate({
|
|
527
493
|
root: newTree,
|
|
528
494
|
metadata: payload.metadata!,
|
|
495
|
+
scroll: scrollPayload,
|
|
529
496
|
});
|
|
530
497
|
}
|
|
531
498
|
|
|
532
|
-
|
|
533
|
-
return
|
|
499
|
+
debugLog("[Browser] Navigation complete");
|
|
500
|
+
return;
|
|
534
501
|
} else {
|
|
535
502
|
// Full update (fallback)
|
|
536
|
-
// Use client-side renderSegments instead of payload.root to ensure
|
|
537
|
-
// consistent component references with action revalidation.
|
|
538
|
-
// Server-rendered RSC tree has different component references than
|
|
539
|
-
// client-created tree, which causes React to remount LoaderBoundary
|
|
540
|
-
// when actions trigger revalidation.
|
|
541
503
|
console.warn(`[Browser] Full update (fallback)`);
|
|
542
504
|
|
|
543
505
|
const segments = payload.metadata?.segments || [];
|
|
544
506
|
|
|
545
|
-
// Check if this navigation is stale (a newer one started)
|
|
546
507
|
if (signal?.aborted) {
|
|
547
|
-
|
|
548
|
-
return
|
|
508
|
+
debugLog("[Browser] Ignoring stale navigation (aborted)");
|
|
509
|
+
return;
|
|
549
510
|
}
|
|
550
511
|
|
|
551
512
|
const segmentIds = segments.map((s: ResolvedSegment) => s.id);
|
|
552
513
|
|
|
553
|
-
// Render on client for consistent component references
|
|
554
514
|
const newTree = await renderSegments(segments);
|
|
555
515
|
|
|
556
|
-
// Final abort check before committing - another navigation may have started
|
|
557
516
|
if (signal?.aborted) {
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
);
|
|
561
|
-
return streamComplete;
|
|
517
|
+
debugLog("[Browser] Ignoring stale navigation (aborted before commit)");
|
|
518
|
+
return;
|
|
562
519
|
}
|
|
563
520
|
|
|
564
|
-
|
|
565
|
-
|
|
521
|
+
const fullUpdateServerState = payload.metadata?.locationState;
|
|
522
|
+
const { scroll: fullScroll } = fullUpdateServerState
|
|
523
|
+
? tx.commit(segmentIds, segments, {
|
|
524
|
+
serverState: fullUpdateServerState,
|
|
525
|
+
})
|
|
526
|
+
: tx.commit(segmentIds, segments);
|
|
527
|
+
|
|
528
|
+
const fullHasTransition = segments.some(
|
|
529
|
+
(s: ResolvedSegment) => s.transition,
|
|
530
|
+
);
|
|
531
|
+
const fullScrollPayload = toScrollPayload(fullScroll);
|
|
566
532
|
|
|
567
|
-
|
|
568
|
-
// For stale revalidation: wait for stream to complete, then update
|
|
569
|
-
// For actions: wrap in startTransition to avoid UI flickering
|
|
570
|
-
if (staleRevalidation) {
|
|
533
|
+
if (mode.type === "stale-revalidation") {
|
|
571
534
|
await rawStreamComplete;
|
|
572
535
|
startTransition(() => {
|
|
536
|
+
if (fullHasTransition && addTransitionType) {
|
|
537
|
+
addTransitionType("action");
|
|
538
|
+
}
|
|
573
539
|
onUpdate({
|
|
574
540
|
root: newTree,
|
|
575
541
|
metadata: payload.metadata!,
|
|
542
|
+
scroll: fullScrollPayload,
|
|
576
543
|
});
|
|
577
544
|
});
|
|
578
|
-
} else if (
|
|
545
|
+
} else if (mode.type === "action") {
|
|
579
546
|
startTransition(async () => {
|
|
547
|
+
if (fullHasTransition && addTransitionType) {
|
|
548
|
+
addTransitionType("action");
|
|
549
|
+
}
|
|
550
|
+
onUpdate({
|
|
551
|
+
root: newTree,
|
|
552
|
+
metadata: payload.metadata!,
|
|
553
|
+
scroll: fullScrollPayload,
|
|
554
|
+
});
|
|
555
|
+
});
|
|
556
|
+
} else if (fullHasTransition) {
|
|
557
|
+
startTransition(() => {
|
|
558
|
+
if (addTransitionType) {
|
|
559
|
+
addTransitionType("navigation");
|
|
560
|
+
}
|
|
580
561
|
onUpdate({
|
|
581
562
|
root: newTree,
|
|
582
563
|
metadata: payload.metadata!,
|
|
564
|
+
scroll: fullScrollPayload,
|
|
583
565
|
});
|
|
584
566
|
});
|
|
585
567
|
} else {
|
|
586
568
|
onUpdate({
|
|
587
569
|
root: newTree,
|
|
588
570
|
metadata: payload.metadata!,
|
|
571
|
+
scroll: fullScrollPayload,
|
|
589
572
|
});
|
|
590
573
|
}
|
|
591
574
|
|
|
592
|
-
return
|
|
575
|
+
return;
|
|
593
576
|
}
|
|
594
577
|
}
|
|
595
578
|
|