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