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