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