@rangojs/router 0.0.0-experimental.15 → 0.0.0-experimental.151
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 +13 -0
- package/README.md +308 -451
- 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 +1844 -237
- 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/{src/network-error-thrower.tsx → dist/network-error-thrower.d.ts} +4 -8
- 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 +7554 -2070
- 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 +142 -61
- package/skills/api-client/SKILL.md +211 -0
- package/skills/breadcrumbs/SKILL.md +329 -0
- package/skills/bundle-analysis/SKILL.md +159 -0
- package/skills/cache-guide/SKILL.md +489 -0
- package/skills/caching/SKILL.md +413 -26
- package/skills/catalog.json +271 -0
- package/skills/comparison/SKILL.md +50 -0
- package/skills/comparison/agents/openai.yaml +4 -0
- package/skills/comparison/references/framework-comparison.md +837 -0
- package/skills/composability/SKILL.md +278 -0
- package/skills/css/SKILL.md +76 -0
- package/skills/debug-manifest/SKILL.md +16 -18
- package/skills/defer-hydration/SKILL.md +235 -0
- package/skills/document-cache/SKILL.md +96 -63
- package/skills/fonts/SKILL.md +7 -5
- package/skills/handler-use/SKILL.md +364 -0
- package/skills/hooks/SKILL.md +76 -436
- package/skills/hooks/data.md +273 -0
- package/skills/hooks/handle-and-actions.md +103 -0
- package/skills/hooks/navigation.md +110 -0
- package/skills/hooks/outlets.md +41 -0
- package/skills/hooks/state.md +228 -0
- package/skills/hooks/urls.md +135 -0
- package/skills/host-router/SKILL.md +320 -0
- package/skills/i18n/SKILL.md +276 -0
- package/skills/intercept/SKILL.md +215 -16
- package/skills/layout/SKILL.md +147 -7
- package/skills/links/SKILL.md +304 -25
- package/skills/loader/SKILL.md +629 -55
- package/skills/middleware/SKILL.md +251 -38
- package/skills/migrate-nextjs/SKILL.md +745 -0
- package/skills/migrate-react-router/SKILL.md +153 -0
- package/skills/migrate-react-router/cloudflare-workers.md +129 -0
- package/skills/migrate-react-router/component-migration.md +196 -0
- package/skills/migrate-react-router/data-and-actions.md +225 -0
- package/skills/migrate-react-router/route-mapping.md +271 -0
- package/skills/mime-routes/SKILL.md +60 -21
- package/skills/observability/SKILL.md +202 -0
- package/skills/parallel/SKILL.md +296 -4
- package/skills/ppr/SKILL.md +658 -0
- package/skills/prerender/SKILL.md +487 -52
- package/skills/rango/SKILL.md +324 -29
- package/skills/react-compiler/SKILL.md +168 -0
- package/skills/response-routes/SKILL.md +264 -122
- package/skills/route/SKILL.md +359 -22
- package/skills/router-setup/SKILL.md +247 -34
- package/skills/scripts/SKILL.md +179 -0
- package/skills/server-actions/SKILL.md +776 -0
- package/skills/shell-manifest/SKILL.md +185 -0
- package/skills/streams-and-websockets/SKILL.md +283 -0
- package/skills/tailwind/SKILL.md +28 -4
- package/skills/testing/SKILL.md +126 -222
- package/skills/testing/bindings.md +103 -0
- package/skills/testing/cache-prerender.md +127 -0
- package/skills/testing/client-components.md +124 -0
- package/skills/testing/e2e-parity.md +125 -0
- package/skills/testing/flight.md +91 -0
- package/skills/testing/handles.md +131 -0
- package/skills/testing/loader.md +128 -0
- package/skills/testing/middleware.md +99 -0
- package/skills/testing/render-handler.md +122 -0
- package/skills/testing/response-routes.md +95 -0
- package/skills/testing/reverse-and-types.md +85 -0
- package/skills/testing/server-actions.md +107 -0
- package/skills/testing/server-tree.md +128 -0
- package/skills/testing/setup.md +123 -0
- package/skills/theme/SKILL.md +10 -9
- package/skills/typesafety/SKILL.md +45 -496
- package/skills/typesafety/env-and-bindings.md +254 -0
- package/skills/typesafety/generated-files-and-cli.md +335 -0
- package/skills/typesafety/params-and-search.md +153 -0
- package/skills/typesafety/route-types.md +209 -0
- package/skills/use-cache/SKILL.md +383 -0
- package/skills/vercel/SKILL.md +128 -0
- package/skills/view-transitions/SKILL.md +337 -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 +275 -29
- 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/connection-warmup.ts +134 -0
- package/src/browser/cookie-name.ts +140 -0
- package/src/browser/event-controller.ts +348 -212
- 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 +39 -0
- package/src/browser/merge-segment-loaders.ts +23 -13
- package/src/browser/navigation-bridge.ts +385 -576
- package/src/browser/navigation-client.ts +249 -75
- package/src/browser/navigation-store-handle.ts +38 -0
- package/src/browser/navigation-store.ts +230 -124
- package/src/browser/navigation-transaction.ts +247 -0
- package/src/browser/network-error-handler.ts +88 -0
- package/src/browser/partial-update.ts +432 -365
- package/src/browser/prefetch/cache.ts +381 -0
- package/src/browser/prefetch/fetch.ts +462 -0
- package/src/browser/prefetch/observer.ts +65 -0
- package/src/browser/prefetch/policy.ts +48 -0
- package/src/browser/prefetch/queue.ts +209 -0
- package/src/browser/prefetch/resource-ready.ts +77 -0
- package/src/browser/rango-state.ts +194 -0
- package/src/browser/react/Link.tsx +284 -67
- package/src/browser/react/NavigationProvider.tsx +267 -109
- package/src/browser/react/ScrollRestoration.tsx +10 -6
- package/src/browser/react/context.ts +11 -0
- package/src/browser/react/filter-segment-order.ts +70 -0
- package/src/browser/react/index.ts +0 -48
- package/src/browser/react/location-state-shared.ts +272 -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-href.tsx +8 -1
- package/src/browser/react/use-link-status.ts +39 -13
- package/src/browser/react/use-navigation.ts +53 -69
- 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 +164 -0
- package/src/browser/rsc-router.tsx +355 -73
- package/src/browser/scroll-restoration.ts +140 -50
- package/src/browser/segment-reconciler.ts +253 -0
- package/src/browser/segment-structure-assert.ts +17 -1
- package/src/browser/server-action-bridge.ts +668 -613
- package/src/browser/types.ts +235 -51
- package/src/browser/validate-redirect-origin.ts +56 -0
- package/src/build/collect-fallback-refs.ts +107 -0
- package/src/build/generate-manifest.ts +243 -183
- package/src/build/generate-route-types.ts +41 -848
- package/src/build/index.ts +12 -7
- package/src/build/prefix-tree-utils.ts +123 -0
- package/src/build/route-trie.ts +218 -80
- package/src/build/route-types/ast-helpers.ts +25 -0
- package/src/build/route-types/ast-route-extraction.ts +105 -0
- package/src/build/route-types/codegen.ts +113 -0
- package/src/build/route-types/include-resolution.ts +812 -0
- package/src/build/route-types/param-extraction.ts +51 -0
- package/src/build/route-types/per-module-writer.ts +144 -0
- package/src/build/route-types/router-processing.ts +695 -0
- package/src/build/route-types/scan-filter.ts +85 -0
- package/src/build/route-types/source-scan.ts +216 -0
- package/src/build/runtime-discovery.ts +223 -0
- package/src/cache/background-task.ts +34 -0
- package/src/cache/cache-error.ts +104 -0
- package/src/cache/cache-key-utils.ts +88 -0
- package/src/cache/cache-policy.ts +199 -0
- package/src/cache/cache-runtime.ts +695 -0
- package/src/cache/cache-scope.ts +324 -335
- package/src/cache/cache-tag.ts +149 -0
- package/src/cache/cf/cf-base64.ts +33 -0
- package/src/cache/cf/cf-cache-constants.ts +127 -0
- package/src/cache/cf/cf-cache-store.ts +2602 -156
- package/src/cache/cf/cf-cache-types.ts +349 -0
- package/src/cache/cf/cf-kv-utils.ts +46 -0
- package/src/cache/cf/cf-tag-marker-memo.ts +105 -0
- package/src/cache/cf/index.ts +17 -17
- package/src/cache/document-cache.ts +226 -102
- package/src/cache/handle-capture.ts +81 -0
- package/src/cache/handle-snapshot.ts +132 -0
- package/src/cache/index.ts +24 -35
- package/src/cache/memory-segment-store.ts +446 -30
- package/src/cache/profile-registry.ts +88 -0
- package/src/cache/read-through-swr.ts +178 -0
- package/src/cache/segment-codec.ts +295 -0
- package/src/cache/shell-snapshot.ts +464 -0
- package/src/cache/tag-invalidation.ts +230 -0
- package/src/cache/taint.ts +153 -0
- package/src/cache/types.ts +283 -211
- package/src/cache/vercel/index.ts +11 -0
- package/src/cache/vercel/vercel-cache-store.ts +1201 -0
- package/src/client.rsc.tsx +43 -21
- package/src/client.tsx +131 -347
- package/src/cloudflare/index.ts +11 -0
- package/src/cloudflare/tracing.ts +108 -0
- package/src/component-utils.ts +23 -4
- package/src/components/DefaultDocument.tsx +13 -3
- package/src/context-var.ts +168 -0
- package/src/debug.ts +19 -9
- package/src/decode-loader-results.ts +52 -0
- package/src/defer.ts +185 -0
- package/src/deps/ssr.ts +4 -2
- package/src/encode-kv.ts +49 -0
- package/src/errors.ts +106 -10
- package/src/escape-script.ts +52 -0
- package/src/handle.ts +110 -35
- package/src/handles/MetaTags.tsx +83 -59
- package/src/handles/Scripts.tsx +183 -0
- package/src/handles/breadcrumbs.ts +93 -0
- package/src/handles/deferred-resolution.ts +127 -0
- package/src/handles/is-thenable.ts +18 -0
- package/src/handles/meta.ts +44 -53
- package/src/handles/script.ts +244 -0
- package/src/host/cookie-handler.ts +20 -65
- package/src/host/errors.ts +21 -30
- package/src/host/index.ts +13 -9
- package/src/host/pattern-matcher.ts +50 -79
- 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 +180 -35
- package/src/index.ts +245 -73
- package/src/internal-debug.ts +9 -2
- 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/outlet-context.ts +1 -1
- package/src/outlet-provider.tsx +41 -0
- package/src/prerender/build-shell-capture.ts +447 -0
- package/src/prerender/param-hash.ts +16 -14
- package/src/prerender/shell-manifest-key.ts +20 -0
- package/src/prerender/store.ts +131 -22
- package/src/prerender.ts +460 -26
- package/src/redirect-origin.ts +114 -0
- package/src/regex-escape.ts +8 -0
- package/src/render-error-thrower.tsx +20 -0
- package/src/response-utils.ts +62 -0
- package/src/reverse.ts +198 -128
- package/src/root-error-boundary.tsx +42 -48
- package/src/route-content-wrapper.tsx +22 -77
- package/src/route-definition/dsl-helpers.ts +1116 -0
- package/src/route-definition/helper-factories.ts +88 -0
- package/src/route-definition/helpers-types.ts +506 -0
- package/src/route-definition/index.ts +54 -0
- package/src/route-definition/redirect.ts +134 -0
- package/src/route-definition/resolve-handler-use.ts +160 -0
- package/src/route-definition/use-item-types.ts +29 -0
- package/src/route-definition.ts +1 -1481
- package/src/route-map-builder.ts +120 -145
- package/src/route-name.ts +53 -0
- package/src/route-types.ts +71 -45
- package/src/router/basename.ts +14 -0
- package/src/router/content-negotiation.ts +305 -0
- package/src/router/debug-manifest.ts +72 -0
- package/src/router/error-handling.ts +54 -27
- package/src/router/find-match.ts +259 -0
- package/src/router/handler-context.ts +385 -125
- package/src/router/instrument.ts +355 -0
- package/src/router/intercept-resolution.ts +88 -28
- package/src/router/lazy-includes.ts +260 -0
- package/src/router/loader-resolution.ts +449 -157
- package/src/router/logging.ts +106 -6
- package/src/router/manifest.ts +144 -62
- package/src/router/match-api.ts +224 -256
- package/src/router/match-context.ts +4 -24
- package/src/router/match-handlers.ts +499 -0
- package/src/router/match-middleware/background-revalidation.ts +117 -93
- package/src/router/match-middleware/cache-lookup.ts +308 -150
- package/src/router/match-middleware/cache-store.ts +123 -51
- 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 +143 -52
- package/src/router/metrics.ts +235 -29
- package/src/router/middleware-types.ts +110 -0
- package/src/router/middleware.ts +526 -441
- package/src/router/navigation-snapshot.ts +133 -0
- package/src/router/params-util.ts +23 -0
- package/src/router/parse-pattern.ts +115 -0
- package/src/router/pattern-matching.ts +311 -142
- package/src/router/prefetch-cache-ttl.ts +51 -0
- package/src/router/prefetch-limits.ts +37 -0
- package/src/router/prerender-match.ts +575 -0
- package/src/router/preview-match.ts +102 -0
- package/src/router/request-classification.ts +291 -0
- package/src/router/revalidation.ts +203 -62
- package/src/router/route-snapshot.ts +256 -0
- package/src/router/router-context.ts +45 -48
- package/src/router/router-interfaces.ts +564 -0
- package/src/router/router-options.ts +784 -0
- package/src/router/router-registry.ts +21 -0
- package/src/router/segment-resolution/fresh.ts +812 -0
- package/src/router/segment-resolution/helpers.ts +348 -0
- package/src/router/segment-resolution/loader-cache.ts +315 -0
- package/src/router/segment-resolution/loader-mask.ts +60 -0
- package/src/router/segment-resolution/loader-snapshot.ts +259 -0
- package/src/router/segment-resolution/mask-nested.ts +99 -0
- package/src/router/segment-resolution/revalidation.ts +1340 -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 +56 -0
- package/src/router/segment-resolution.ts +25 -1354
- package/src/router/segment-wrappers.ts +292 -0
- package/src/router/state-cookie-name.ts +33 -0
- package/src/router/substitute-pattern-params.ts +75 -0
- package/src/router/telemetry-otel.ts +259 -0
- package/src/router/telemetry.ts +385 -0
- package/src/router/timeout.ts +128 -0
- package/src/router/tracing.ts +215 -0
- package/src/router/trie-matching.ts +240 -61
- package/src/router/types.ts +23 -70
- package/src/router/url-params.ts +57 -0
- package/src/router.ts +795 -2390
- package/src/rsc/capture-queue.ts +67 -0
- package/src/rsc/full-payload.ts +70 -0
- package/src/rsc/handler-context.ts +46 -0
- package/src/rsc/handler.ts +956 -1164
- package/src/rsc/helpers.ts +736 -19
- package/src/rsc/index.ts +2 -25
- package/src/rsc/json-route-result.ts +38 -0
- package/src/rsc/loader-fetch.ts +305 -0
- package/src/rsc/manifest-init.ts +77 -0
- package/src/rsc/nonce.ts +23 -0
- package/src/rsc/origin-guard.ts +155 -0
- package/src/rsc/progressive-enhancement.ts +541 -0
- package/src/rsc/redirect-guard.ts +100 -0
- package/src/rsc/response-cache-serve.ts +238 -0
- package/src/rsc/response-error.ts +104 -0
- package/src/rsc/response-route-handler.ts +257 -0
- package/src/rsc/rsc-rendering.ts +856 -0
- package/src/rsc/runtime-warnings.ts +55 -0
- package/src/rsc/server-action.ts +525 -0
- package/src/rsc/shell-build-manifest.ts +316 -0
- package/src/rsc/shell-capture-constants.ts +27 -0
- package/src/rsc/shell-capture.ts +1716 -0
- package/src/rsc/shell-serve.ts +226 -0
- package/src/rsc/ssr-setup.ts +176 -0
- package/src/rsc/transition-gate.ts +89 -0
- package/src/rsc/types.ts +95 -12
- package/src/runtime-env.ts +18 -0
- package/src/search-params.ts +99 -82
- package/src/segment-content-promise.ts +67 -0
- package/src/segment-fragments.ts +124 -0
- package/src/segment-loader-promise.ts +167 -0
- package/src/segment-system.tsx +464 -135
- package/src/serialize.ts +243 -0
- package/src/server/context.ts +640 -85
- package/src/server/cookie-parse.ts +32 -0
- package/src/server/cookie-store.ts +337 -0
- package/src/server/fetchable-loader-store.ts +11 -6
- package/src/server/handle-store.ts +123 -42
- package/src/server/loader-registry.ts +51 -100
- package/src/server/request-context.ts +1069 -152
- package/src/server.ts +15 -8
- package/src/ssr/index.tsx +661 -140
- package/src/ssr/inject-rsc-eager.ts +167 -0
- package/src/ssr/preinit-client-references.ts +106 -0
- package/src/ssr/ssr-root.tsx +261 -0
- package/src/static-handler.ts +45 -18
- package/src/testing/cache-status.ts +162 -0
- package/src/testing/collect-handle.ts +46 -0
- package/src/testing/dispatch.ts +813 -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 +257 -0
- package/src/testing/generated-routes.ts +199 -0
- package/src/testing/index.ts +105 -0
- package/src/testing/internal/context.ts +380 -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 +371 -0
- package/src/testing/render-route.tsx +584 -0
- package/src/testing/run-loader.ts +385 -0
- package/src/testing/run-middleware.ts +219 -0
- package/src/testing/run-transition-when.ts +164 -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 +76 -98
- package/src/theme/ThemeScript.tsx +12 -14
- package/src/theme/constants.ts +57 -15
- package/src/theme/index.ts +3 -20
- package/src/theme/theme-context.ts +5 -35
- package/src/theme/theme-script.ts +43 -39
- 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 +850 -0
- package/src/types/index.ts +81 -0
- package/src/types/loader-types.ts +212 -0
- package/src/types/request-scope.ts +112 -0
- package/src/types/route-config.ts +138 -0
- package/src/types/route-entry.ts +114 -0
- package/src/types/segments.ts +271 -0
- package/src/types.ts +1 -1795
- package/src/urls/include-helper.ts +162 -0
- package/src/urls/include-provider.ts +71 -0
- package/src/urls/index.ts +44 -0
- package/src/urls/path-helper-types.ts +418 -0
- package/src/urls/path-helper.ts +280 -0
- package/src/urls/pattern-types.ts +189 -0
- package/src/urls/response-types.ts +109 -0
- package/src/urls/type-extraction.ts +316 -0
- package/src/urls/urls-function.ts +80 -0
- package/src/urls.ts +1 -1352
- package/src/use-loader.tsx +406 -141
- package/src/vercel/index.ts +11 -0
- package/src/vercel/tracing.ts +88 -0
- package/src/vite/debug.ts +185 -0
- package/src/vite/discovery/bundle-postprocess.ts +182 -0
- package/src/vite/discovery/dev-prerender-cache.ts +117 -0
- package/src/vite/discovery/discover-routers.ts +408 -0
- package/src/vite/discovery/discovery-errors.ts +255 -0
- package/src/vite/discovery/gate-state.ts +171 -0
- package/src/vite/discovery/prerender-collection.ts +483 -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/shell-prerender-phase.ts +397 -0
- package/src/vite/discovery/state.ts +205 -0
- package/src/vite/discovery/virtual-module-codegen.ts +293 -0
- package/src/vite/index.ts +31 -2255
- package/src/vite/inject-client-debug.ts +88 -0
- package/src/vite/plugin-types.ts +336 -0
- package/src/vite/plugins/cjs-to-esm.ts +90 -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} +89 -79
- package/src/vite/plugins/expose-ids/export-analysis.ts +363 -0
- package/src/vite/plugins/expose-ids/handler-transform.ts +130 -0
- package/src/vite/plugins/expose-ids/loader-transform.ts +64 -0
- package/src/vite/plugins/expose-ids/router-transform.ts +199 -0
- package/src/vite/plugins/expose-ids/types.ts +45 -0
- package/src/vite/plugins/expose-internal-ids.ts +805 -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/vercel-output.ts +384 -0
- package/src/vite/plugins/version-injector.ts +94 -0
- package/src/vite/plugins/version-plugin.ts +271 -0
- package/src/vite/plugins/virtual-entries.ts +267 -0
- package/src/vite/plugins/virtual-stub-plugin.ts +29 -0
- package/src/vite/rango.ts +600 -0
- package/src/vite/router-discovery.ts +2120 -0
- package/src/vite/{ast-handler-extract.ts → utils/ast-handler-extract.ts} +200 -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/directive-prologue.ts +40 -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 +268 -0
- package/src/vite/utils/shared-utils.ts +271 -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,47 @@ 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";
|
|
10
23
|
import {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
} from "./
|
|
15
|
-
import {
|
|
16
|
-
|
|
24
|
+
debugLog,
|
|
25
|
+
isBrowserDebugEnabled,
|
|
26
|
+
IS_BROWSER_DEBUG,
|
|
27
|
+
} from "./logging.js";
|
|
28
|
+
import {
|
|
29
|
+
validateRedirectOrigin,
|
|
30
|
+
validateExternalRedirect,
|
|
31
|
+
} from "./validate-redirect-origin.js";
|
|
32
|
+
import type { NavigationUpdate } from "./types.js";
|
|
33
|
+
|
|
34
|
+
function toScrollPayload(
|
|
35
|
+
scroll: boolean | undefined,
|
|
36
|
+
): NonNullable<NavigationUpdate["scroll"]> {
|
|
37
|
+
return { enabled: scroll !== false ? scroll : false };
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
function shouldStartViewTransition(segments: ResolvedSegment[]): boolean {
|
|
41
|
+
let hasIntercept = false;
|
|
42
|
+
let hasTransition = false;
|
|
43
|
+
for (const s of segments) {
|
|
44
|
+
if (isInterceptSegment(s)) hasIntercept = true;
|
|
45
|
+
else if (s.transition) hasTransition = true;
|
|
46
|
+
}
|
|
47
|
+
return !hasIntercept && hasTransition;
|
|
48
|
+
}
|
|
17
49
|
|
|
18
50
|
/**
|
|
19
51
|
* Configuration for creating a partial updater
|
|
@@ -26,8 +58,8 @@ export interface PartialUpdateConfig {
|
|
|
26
58
|
segments: ResolvedSegment[],
|
|
27
59
|
options?: RenderSegmentsOptions,
|
|
28
60
|
) => Promise<ReactNode> | ReactNode;
|
|
29
|
-
/** RSC version
|
|
30
|
-
|
|
61
|
+
/** RSC version getter — returns the current version (may change after HMR) */
|
|
62
|
+
getVersion?: () => string | undefined;
|
|
31
63
|
}
|
|
32
64
|
|
|
33
65
|
/**
|
|
@@ -42,12 +74,30 @@ export interface CommitOverrides {
|
|
|
42
74
|
intercept?: boolean;
|
|
43
75
|
/** Source URL where intercept was triggered from */
|
|
44
76
|
interceptSourceUrl?: string;
|
|
77
|
+
/** Server-set location state to merge into history.pushState */
|
|
78
|
+
serverState?: Record<string, unknown>;
|
|
45
79
|
}
|
|
46
80
|
|
|
47
81
|
/**
|
|
48
|
-
*
|
|
49
|
-
* Transaction encapsulates all store mutations for atomic commit
|
|
82
|
+
* Discriminated update mode for partial updates.
|
|
50
83
|
*/
|
|
84
|
+
export type UpdateMode =
|
|
85
|
+
| {
|
|
86
|
+
type: "navigate";
|
|
87
|
+
/** Cached segments for the target URL. When provided, these are used to build
|
|
88
|
+
* the segment map instead of the current page's segments. This ensures consistency
|
|
89
|
+
* when we send cached segment IDs to the server - if the server returns empty diff,
|
|
90
|
+
* we use the same segments we told the server we have. */
|
|
91
|
+
targetCacheSegments?: ResolvedSegment[];
|
|
92
|
+
/** Cached handle data for the target URL. When server returns empty diff and we're
|
|
93
|
+
* rendering from cache, this is passed to the UI to restore breadcrumbs etc. */
|
|
94
|
+
targetCacheHandleData?: Record<string, Record<string, unknown[]>>;
|
|
95
|
+
/** Source URL for intercept restore (popstate cache miss) */
|
|
96
|
+
interceptSourceUrl?: string;
|
|
97
|
+
}
|
|
98
|
+
| { type: "leave-intercept"; interceptSourceUrl?: string }
|
|
99
|
+
| { type: "stale-revalidation"; interceptSourceUrl?: string }
|
|
100
|
+
| { type: "action"; interceptSourceUrl?: string };
|
|
51
101
|
|
|
52
102
|
/**
|
|
53
103
|
* Type for the fetchPartialUpdate function
|
|
@@ -57,320 +107,276 @@ export type PartialUpdater = (
|
|
|
57
107
|
segmentIds: string[] | undefined,
|
|
58
108
|
isRetry: boolean,
|
|
59
109
|
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>>;
|
|
110
|
+
tx: BoundTransaction,
|
|
111
|
+
mode?: UpdateMode,
|
|
112
|
+
) => Promise<void>;
|
|
78
113
|
|
|
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
114
|
export function createPartialUpdater(
|
|
101
115
|
config: PartialUpdateConfig,
|
|
102
116
|
): PartialUpdater {
|
|
103
|
-
const {
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
117
|
+
const {
|
|
118
|
+
store,
|
|
119
|
+
client,
|
|
120
|
+
onUpdate,
|
|
121
|
+
renderSegments,
|
|
122
|
+
getVersion = () => undefined,
|
|
123
|
+
} = config;
|
|
124
|
+
|
|
125
|
+
function getCurrentCachedSegments(): ResolvedSegment[] {
|
|
109
126
|
const currentKey = store.getHistoryKey();
|
|
110
127
|
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;
|
|
128
|
+
return cached?.segments || [];
|
|
115
129
|
}
|
|
116
130
|
|
|
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
131
|
async function fetchPartialUpdate(
|
|
125
132
|
targetUrl: string,
|
|
126
133
|
segmentIds: string[] | undefined,
|
|
127
134
|
isRetry: boolean,
|
|
128
135
|
signal: AbortSignal | undefined,
|
|
129
136
|
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 || {};
|
|
137
|
+
mode: UpdateMode = { type: "navigate" },
|
|
138
|
+
): Promise<void> {
|
|
147
139
|
const segmentState = store.getSegmentState();
|
|
148
140
|
const url = targetUrl || window.location.href;
|
|
149
141
|
|
|
150
|
-
// Capture history key at start for stale revalidation consistency check
|
|
151
142
|
const historyKeyAtStart = store.getHistoryKey();
|
|
152
143
|
|
|
153
|
-
|
|
154
|
-
|
|
144
|
+
const interceptSourceUrl = mode.interceptSourceUrl;
|
|
145
|
+
|
|
155
146
|
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
|
|
147
|
+
if (mode.type === "leave-intercept") {
|
|
159
148
|
const currentSegments = segmentIds ?? segmentState.currentSegmentIds;
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
console.log(
|
|
164
|
-
`[Browser] Leaving intercept - filtered segments: ${segments.join(", ")}`,
|
|
149
|
+
const currentCached = getCurrentCachedSegments();
|
|
150
|
+
const interceptIds = new Set(
|
|
151
|
+
currentCached.filter(isInterceptSegment).map((s) => s.id),
|
|
165
152
|
);
|
|
153
|
+
segments = currentSegments.filter((id) => !interceptIds.has(id));
|
|
154
|
+
if (IS_BROWSER_DEBUG) {
|
|
155
|
+
debugLog(
|
|
156
|
+
`[Browser] Leaving intercept - filtered segments: ${segments.join(", ")}`,
|
|
157
|
+
);
|
|
158
|
+
}
|
|
166
159
|
} else {
|
|
167
160
|
segments = segmentIds ?? segmentState.currentSegmentIds;
|
|
168
161
|
}
|
|
169
162
|
|
|
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
163
|
const previousUrl =
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
164
|
+
mode.type === "leave-intercept"
|
|
165
|
+
? segmentState.currentUrl || tx.currentUrl
|
|
166
|
+
: interceptSourceUrl || tx.currentUrl || segmentState.currentUrl;
|
|
167
|
+
|
|
168
|
+
if (IS_BROWSER_DEBUG) {
|
|
169
|
+
debugLog(`\n[Browser] >>> NAVIGATION`);
|
|
170
|
+
debugLog(`[Browser] From: ${previousUrl}`);
|
|
171
|
+
debugLog(`[Browser] To: ${url}`);
|
|
172
|
+
debugLog(`[Browser] Segments to send: ${segments.join(", ")}`);
|
|
173
|
+
if (interceptSourceUrl) {
|
|
174
|
+
debugLog(`[Browser] Intercept context from: ${interceptSourceUrl}`);
|
|
175
|
+
}
|
|
181
176
|
}
|
|
182
177
|
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
178
|
+
const targetCache =
|
|
179
|
+
mode.type === "navigate" && mode.targetCacheSegments?.length
|
|
180
|
+
? mode.targetCacheSegments
|
|
181
|
+
: undefined;
|
|
182
|
+
const cachedSegs = targetCache ?? getCurrentCachedSegments();
|
|
183
|
+
const cachedSegsSource = targetCache ? "history-cache" : "current-page";
|
|
184
|
+
if (IS_BROWSER_DEBUG) {
|
|
185
|
+
debugLog(
|
|
186
|
+
`[Browser] cachedSegs source: ${cachedSegsSource} (${cachedSegs.length} segments: ${cachedSegs.map((s) => s.id).join(", ")})`,
|
|
187
|
+
);
|
|
193
188
|
}
|
|
194
|
-
// Mark navigation as streaming (response received, now parsing RSC)
|
|
195
|
-
// The token is ended when the stream completes
|
|
196
|
-
const streamingToken = tx.startStreaming();
|
|
197
|
-
// Fetch partial payload (no abort signal - RSC doesn't support it well)
|
|
198
|
-
const { payload, streamComplete: rawStreamComplete } =
|
|
199
|
-
await client.fetchPartial({
|
|
200
|
-
targetUrl: url,
|
|
201
|
-
segmentIds: segments,
|
|
202
|
-
previousUrl,
|
|
203
|
-
staleRevalidation,
|
|
204
|
-
version,
|
|
205
|
-
});
|
|
206
|
-
console.log("payload.metadata", payload.metadata);
|
|
207
189
|
|
|
208
|
-
|
|
209
|
-
|
|
190
|
+
let fetchResult: Awaited<ReturnType<NavigationClient["fetchPartial"]>>;
|
|
191
|
+
fetchResult = await client.fetchPartial({
|
|
192
|
+
targetUrl: url,
|
|
193
|
+
segmentIds: segments,
|
|
194
|
+
previousUrl,
|
|
195
|
+
staleRevalidation:
|
|
196
|
+
mode.type === "stale-revalidation" || segments.length === 0,
|
|
197
|
+
version: getVersion(),
|
|
198
|
+
routerId: store.getRouterId?.(),
|
|
210
199
|
});
|
|
200
|
+
const streamingToken = tx.startStreaming();
|
|
201
|
+
const {
|
|
202
|
+
payload,
|
|
203
|
+
streamComplete: rawStreamComplete,
|
|
204
|
+
fullyPrefetched,
|
|
205
|
+
} = fetchResult;
|
|
206
|
+
debugLog("payload.metadata", payload.metadata);
|
|
207
|
+
|
|
208
|
+
// Side effect only: end the streaming token once the stream settles.
|
|
209
|
+
// The wrapped promise was never read as a value; only the .end() matters.
|
|
210
|
+
// The .catch keeps an unhandled rejection from leaking if the stream errors.
|
|
211
|
+
rawStreamComplete.then(() => streamingToken.end()).catch(() => {});
|
|
212
|
+
|
|
213
|
+
const currentRouterId = store.getRouterId?.();
|
|
214
|
+
if (
|
|
215
|
+
payload.metadata?.routerId &&
|
|
216
|
+
currentRouterId &&
|
|
217
|
+
payload.metadata.routerId !== currentRouterId
|
|
218
|
+
) {
|
|
219
|
+
console.error(
|
|
220
|
+
`[rango] Partial response router id "${payload.metadata.routerId}" does not ` +
|
|
221
|
+
`match this client ("${currentRouterId}"); discarding it and reloading to re-sync.`,
|
|
222
|
+
);
|
|
223
|
+
window.location.href = url;
|
|
224
|
+
return;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
if (payload.metadata?.redirect) {
|
|
228
|
+
if (signal?.aborted) {
|
|
229
|
+
debugLog("[Browser] Ignoring stale redirect (aborted)");
|
|
230
|
+
return;
|
|
231
|
+
}
|
|
232
|
+
// Explicit off-host redirect (redirect(url, { external: true })):
|
|
233
|
+
// hard-navigate, but still scheme-validate (http/https only). external
|
|
234
|
+
// waives the same-origin check the app opted out of, NOT scheme safety, so
|
|
235
|
+
// a forged payload carrying a javascript:/data: URL cannot script via
|
|
236
|
+
// location.assign.
|
|
237
|
+
if (payload.metadata.redirect.external) {
|
|
238
|
+
const externalUrl = validateExternalRedirect(
|
|
239
|
+
payload.metadata.redirect.url,
|
|
240
|
+
window.location.origin,
|
|
241
|
+
);
|
|
242
|
+
if (!externalUrl) {
|
|
243
|
+
debugLog("[Browser] Ignoring blocked external redirect payload");
|
|
244
|
+
return;
|
|
245
|
+
}
|
|
246
|
+
debugLog("[Browser] External redirect (hard navigation)");
|
|
247
|
+
window.location.assign(externalUrl);
|
|
248
|
+
return;
|
|
249
|
+
}
|
|
250
|
+
const redirectUrl = validateRedirectOrigin(
|
|
251
|
+
payload.metadata.redirect.url,
|
|
252
|
+
window.location.origin,
|
|
253
|
+
);
|
|
254
|
+
if (!redirectUrl) {
|
|
255
|
+
debugLog("[Browser] Ignoring blocked redirect payload");
|
|
256
|
+
return;
|
|
257
|
+
}
|
|
258
|
+
const serverState = payload.metadata.locationState;
|
|
259
|
+
throw new ServerRedirect(redirectUrl, serverState);
|
|
260
|
+
}
|
|
211
261
|
|
|
212
262
|
if (payload.metadata?.isPartial) {
|
|
213
263
|
const { segments: newSegments, matched, diff } = payload.metadata;
|
|
214
264
|
|
|
215
265
|
// Check if this navigation is stale (a newer one started)
|
|
216
266
|
if (signal?.aborted) {
|
|
217
|
-
|
|
218
|
-
return
|
|
267
|
+
debugLog("[Browser] Ignoring stale navigation (aborted)");
|
|
268
|
+
return;
|
|
219
269
|
}
|
|
220
270
|
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
const newSegmentMap = new Map<string, ResolvedSegment>();
|
|
226
|
-
(newSegments || []).forEach((s: ResolvedSegment) =>
|
|
227
|
-
newSegmentMap.set(s.id, s),
|
|
228
|
-
);
|
|
271
|
+
if (IS_BROWSER_DEBUG) {
|
|
272
|
+
debugLog(`[Browser] Partial update - matched: ${matched?.join(", ")}`);
|
|
273
|
+
debugLog(`[Browser] Diff: ${diff?.join(", ")}`);
|
|
274
|
+
}
|
|
229
275
|
|
|
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
276
|
if (!diff || diff.length === 0) {
|
|
234
277
|
const matchedIds = matched || [];
|
|
278
|
+
const cacheMap = new Map(cachedSegs.map((s) => [s.id, s]));
|
|
235
279
|
const existingSegments = matchedIds
|
|
236
|
-
.map((id: string) =>
|
|
280
|
+
.map((id: string) => cacheMap.get(id))
|
|
237
281
|
.filter(Boolean) as ResolvedSegment[];
|
|
238
282
|
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
console.log(
|
|
243
|
-
`[Browser] No diff but navigating with cached segments - rendering target route`,
|
|
283
|
+
if (mode.type === "navigate" && targetCache) {
|
|
284
|
+
debugLog(
|
|
285
|
+
"[Browser] No diff but navigating with cached segments - rendering target route",
|
|
244
286
|
);
|
|
245
287
|
|
|
246
288
|
const newTree = await renderSegments(existingSegments, {
|
|
247
289
|
forceAwait: true,
|
|
248
290
|
});
|
|
249
291
|
|
|
250
|
-
tx.commit(
|
|
292
|
+
const { scroll: commitScroll } = tx.commit(
|
|
293
|
+
matchedIds,
|
|
294
|
+
existingSegments,
|
|
295
|
+
);
|
|
296
|
+
|
|
297
|
+
if (mode.targetCacheHandleData) {
|
|
298
|
+
store.updateCacheHandleData(
|
|
299
|
+
store.getHistoryKey(),
|
|
300
|
+
mode.targetCacheHandleData,
|
|
301
|
+
);
|
|
302
|
+
}
|
|
251
303
|
|
|
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
304
|
const { handles: _unusedHandles, ...metadataWithoutHandles } =
|
|
258
305
|
payload.metadata!;
|
|
259
|
-
|
|
306
|
+
const cachedUpdate = {
|
|
260
307
|
root: newTree,
|
|
261
308
|
metadata: {
|
|
262
309
|
...metadataWithoutHandles,
|
|
263
|
-
cachedHandleData: targetCacheHandleData,
|
|
310
|
+
cachedHandleData: mode.targetCacheHandleData,
|
|
264
311
|
},
|
|
265
|
-
|
|
312
|
+
scroll: toScrollPayload(commitScroll),
|
|
313
|
+
};
|
|
314
|
+
|
|
315
|
+
if (shouldStartViewTransition(existingSegments)) {
|
|
316
|
+
startTransition(() => {
|
|
317
|
+
if (addTransitionType) {
|
|
318
|
+
addTransitionType("navigation");
|
|
319
|
+
}
|
|
320
|
+
onUpdate(cachedUpdate);
|
|
321
|
+
});
|
|
322
|
+
} else {
|
|
323
|
+
onUpdate(cachedUpdate);
|
|
324
|
+
}
|
|
266
325
|
|
|
267
|
-
|
|
268
|
-
return
|
|
326
|
+
debugLog("[Browser] Navigation complete (rendered from cache)");
|
|
327
|
+
return;
|
|
269
328
|
}
|
|
270
329
|
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
if (leavingIntercept) {
|
|
275
|
-
console.log(
|
|
276
|
-
`[Browser] Leaving intercept - forcing re-render to remove modal`,
|
|
330
|
+
if (mode.type === "leave-intercept") {
|
|
331
|
+
debugLog(
|
|
332
|
+
"[Browser] Leaving intercept - forcing re-render to remove modal",
|
|
277
333
|
);
|
|
278
334
|
|
|
279
335
|
const newTree = await renderSegments(existingSegments, {
|
|
280
336
|
forceAwait: true,
|
|
281
337
|
});
|
|
282
338
|
|
|
283
|
-
tx.commit(
|
|
339
|
+
const { scroll: leaveScroll } = tx.commit(
|
|
340
|
+
matchedIds,
|
|
341
|
+
existingSegments,
|
|
342
|
+
);
|
|
284
343
|
|
|
285
344
|
onUpdate({
|
|
286
345
|
root: newTree,
|
|
287
346
|
metadata: payload.metadata,
|
|
347
|
+
scroll: toScrollPayload(leaveScroll),
|
|
288
348
|
});
|
|
289
349
|
|
|
290
|
-
|
|
291
|
-
return
|
|
350
|
+
debugLog("[Browser] Navigation complete (left intercept)");
|
|
351
|
+
return;
|
|
292
352
|
}
|
|
293
353
|
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
`[Browser] No changes - all revalidations returned false, keeping existing UI`,
|
|
354
|
+
debugLog(
|
|
355
|
+
"[Browser] No changes - all revalidations returned false, keeping existing UI",
|
|
297
356
|
);
|
|
298
357
|
tx.commit(matchedIds, existingSegments);
|
|
299
|
-
|
|
300
|
-
return
|
|
358
|
+
debugLog("[Browser] Navigation complete (no re-render)");
|
|
359
|
+
return;
|
|
301
360
|
}
|
|
302
361
|
|
|
303
|
-
// Build full segment list by merging:
|
|
304
|
-
// - New/changed segments from server response (diff)
|
|
305
|
-
// - Unchanged segments from current page's cache
|
|
306
362
|
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);
|
|
363
|
+
const actor: ReconcileActor =
|
|
364
|
+
mode.type === "stale-revalidation" || mode.type === "action"
|
|
365
|
+
? "stale-revalidation"
|
|
366
|
+
: "navigation";
|
|
367
|
+
|
|
368
|
+
const reconciled = reconcileSegments({
|
|
369
|
+
actor,
|
|
370
|
+
matched: matchedIds,
|
|
371
|
+
diff: diff || [],
|
|
372
|
+
serverSegments: newSegments || [],
|
|
373
|
+
cachedSegments: cachedSegs,
|
|
374
|
+
insertMissingDiff: true,
|
|
375
|
+
});
|
|
368
376
|
|
|
369
|
-
|
|
370
|
-
// Note: allSegments may include additional diff segments, so we check matchedIds specifically
|
|
371
|
-
const allSegmentIdSet = new Set(allSegments.map((s) => s.id));
|
|
377
|
+
const reconciledIdSet = new Set(reconciled.segments.map((s) => s.id));
|
|
372
378
|
const missingIds = matchedIds.filter(
|
|
373
|
-
(id: string) => !
|
|
379
|
+
(id: string) => !reconciledIdSet.has(id),
|
|
374
380
|
);
|
|
375
381
|
|
|
376
382
|
if (missingIds.length > 0) {
|
|
@@ -383,213 +389,274 @@ export function createPartialUpdater(
|
|
|
383
389
|
);
|
|
384
390
|
}
|
|
385
391
|
if (signal?.aborted) {
|
|
386
|
-
|
|
387
|
-
|
|
392
|
+
debugLog(
|
|
393
|
+
"[Browser] Ignoring stale navigation (aborted during HMR retry)",
|
|
388
394
|
);
|
|
389
|
-
return
|
|
395
|
+
return;
|
|
390
396
|
}
|
|
391
|
-
if (
|
|
392
|
-
|
|
397
|
+
if (mode.type === "action") {
|
|
398
|
+
// An action refetch that lands on missing segments (navigated away /
|
|
399
|
+
// consolidation / HMR) drops rather than refetch-all: the action flow
|
|
400
|
+
// is storeOnly / skipLoadingState, so a full refetch here would fight
|
|
401
|
+
// it. Keep the stale-but-consistent tree; log so the drop is visible.
|
|
402
|
+
debugLog(
|
|
403
|
+
`[Browser] Action refetch: ${missingCount} segments missing; dropping (stale-but-consistent tree kept).`,
|
|
404
|
+
);
|
|
405
|
+
return;
|
|
393
406
|
}
|
|
394
407
|
console.warn(
|
|
395
408
|
`[Browser] HMR detected: Missing ${missingCount} segments. Refetching all...`,
|
|
396
409
|
);
|
|
397
410
|
|
|
398
|
-
|
|
399
|
-
return fetchPartialUpdate(url, [], true, signal, tx, { isAction });
|
|
411
|
+
return fetchPartialUpdate(url, [], true, signal, tx, mode);
|
|
400
412
|
}
|
|
401
413
|
|
|
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
414
|
if (signal?.aborted) {
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
);
|
|
416
|
-
return streamComplete;
|
|
415
|
+
debugLog("[Browser] Ignoring stale navigation (aborted before render)");
|
|
416
|
+
return;
|
|
417
417
|
}
|
|
418
418
|
|
|
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
419
|
const renderOptions = {
|
|
424
|
-
isAction,
|
|
425
|
-
forceAwait
|
|
420
|
+
isAction: mode.type === "action",
|
|
421
|
+
// forceAwait unwraps the ROUTER loader promises during render so they
|
|
422
|
+
// land without a loading()/fallback frame. A fully-prefetched nav has
|
|
423
|
+
// its router data already resolved (the prefetch stream drained), so
|
|
424
|
+
// awaiting it here is free and lets us commit NORMALLY (not in a
|
|
425
|
+
// transition) below — a normal commit still shows fallbacks for any
|
|
426
|
+
// CLIENT component that suspends on mount, which a transition would
|
|
427
|
+
// wrongly suppress by holding the old UI until that suspense settles.
|
|
428
|
+
forceAwait: mode.type === "stale-revalidation" || fullyPrefetched,
|
|
426
429
|
interceptSegments:
|
|
427
|
-
interceptSegments.length > 0
|
|
430
|
+
reconciled.interceptSegments.length > 0
|
|
431
|
+
? reconciled.interceptSegments
|
|
432
|
+
: undefined,
|
|
428
433
|
};
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
434
|
+
let newTree: Awaited<ReturnType<typeof renderSegments>>;
|
|
435
|
+
if (signal) {
|
|
436
|
+
// Race render against abort. Store the abort handler and register it
|
|
437
|
+
// { once:true } so a non-aborted render (which wins the race) can
|
|
438
|
+
// remove it in finally — otherwise the listener stays attached and the
|
|
439
|
+
// rejecting promise never settles. Mirrors teeWithCompletion in
|
|
440
|
+
// browser/response-adapter.ts.
|
|
441
|
+
let onAbort: (() => void) | undefined;
|
|
442
|
+
const abortPromise = new Promise<never>((_, reject) => {
|
|
443
|
+
if (signal.aborted) {
|
|
444
|
+
reject(new DOMException("Navigation aborted", "AbortError"));
|
|
445
|
+
return;
|
|
446
|
+
}
|
|
447
|
+
onAbort = () =>
|
|
448
|
+
reject(new DOMException("Navigation aborted", "AbortError"));
|
|
449
|
+
signal.addEventListener("abort", onAbort, { once: true });
|
|
450
|
+
});
|
|
451
|
+
try {
|
|
452
|
+
newTree = await Promise.race([
|
|
453
|
+
renderSegments(reconciled.mainSegments, renderOptions),
|
|
454
|
+
abortPromise,
|
|
455
|
+
]);
|
|
456
|
+
} finally {
|
|
457
|
+
if (onAbort) signal.removeEventListener("abort", onAbort);
|
|
458
|
+
}
|
|
459
|
+
} else {
|
|
460
|
+
newTree = await renderSegments(reconciled.mainSegments, renderOptions);
|
|
449
461
|
}
|
|
450
462
|
|
|
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();
|
|
463
|
+
if (signal?.aborted) {
|
|
464
|
+
debugLog("[Browser] Ignoring stale navigation (aborted before commit)");
|
|
465
|
+
return;
|
|
471
466
|
}
|
|
472
467
|
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
468
|
+
const isInterceptResponse = hasActiveInterceptSlots(
|
|
469
|
+
payload.metadata?.slots,
|
|
470
|
+
);
|
|
471
|
+
|
|
472
|
+
const effectiveInterceptSource =
|
|
473
|
+
interceptSourceUrl || segmentState.currentUrl;
|
|
474
|
+
if (mode.type !== "action" && mode.type !== "stale-revalidation") {
|
|
475
|
+
if (isInterceptResponse) {
|
|
476
|
+
store.setInterceptSourceUrl(effectiveInterceptSource);
|
|
478
477
|
} else {
|
|
479
|
-
// Clear intercept context when navigating to a non-intercept route
|
|
480
478
|
store.setInterceptSourceUrl(null);
|
|
481
479
|
}
|
|
482
480
|
}
|
|
483
481
|
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
482
|
+
const allSegmentIds = matchedIds;
|
|
483
|
+
const serverLocationState = payload.metadata?.locationState;
|
|
484
|
+
const overrides: CommitOverrides | undefined = isInterceptResponse
|
|
485
|
+
? {
|
|
486
|
+
scroll: false,
|
|
487
|
+
intercept: true,
|
|
488
|
+
interceptSourceUrl: effectiveInterceptSource,
|
|
489
|
+
...(serverLocationState && { serverState: serverLocationState }),
|
|
490
|
+
}
|
|
491
|
+
: serverLocationState
|
|
492
|
+
? { serverState: serverLocationState }
|
|
493
|
+
: undefined;
|
|
494
|
+
const { scroll: navScroll } = tx.commit(
|
|
490
495
|
allSegmentIds,
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
? {
|
|
494
|
-
scroll: false,
|
|
495
|
-
intercept: true,
|
|
496
|
-
interceptSourceUrl: segmentState.currentUrl,
|
|
497
|
-
}
|
|
498
|
-
: undefined,
|
|
496
|
+
reconciled.segments,
|
|
497
|
+
overrides,
|
|
499
498
|
);
|
|
500
499
|
|
|
501
|
-
|
|
502
|
-
// If user navigated away, skip UI update to avoid corrupting current view
|
|
503
|
-
if (staleRevalidation) {
|
|
500
|
+
if (mode.type === "stale-revalidation") {
|
|
504
501
|
const historyKeyNow = store.getHistoryKey();
|
|
505
502
|
if (historyKeyNow !== historyKeyAtStart) {
|
|
506
|
-
|
|
503
|
+
debugLog(
|
|
507
504
|
`[Browser] Stale revalidation: history key changed (${historyKeyAtStart} -> ${historyKeyNow}), skipping UI update`,
|
|
508
505
|
);
|
|
509
|
-
return
|
|
506
|
+
return;
|
|
510
507
|
}
|
|
511
508
|
}
|
|
512
509
|
|
|
513
|
-
|
|
510
|
+
debugLog("[partial-update] updating document");
|
|
511
|
+
|
|
512
|
+
const hasTransition = shouldStartViewTransition(reconciled.segments);
|
|
513
|
+
// [VT-DIAG] Gated behind INTERNAL_RANGO_DEBUG. Reports which reconciled
|
|
514
|
+
// segment still carries a transition after the server-side when-gate, and
|
|
515
|
+
// whether the commit will be held in a startTransition. If `withTransition`
|
|
516
|
+
// lists an ancestor (layout/root) id rather than the gated leaf, an ungated
|
|
517
|
+
// ancestor transition is holding the subtree (missing loading() fallback).
|
|
518
|
+
if (isBrowserDebugEnabled()) {
|
|
519
|
+
debugLog("[VT-DIAG] commit", {
|
|
520
|
+
mode: mode.type,
|
|
521
|
+
hasTransition,
|
|
522
|
+
withTransition: reconciled.segments
|
|
523
|
+
.filter((s) => s.transition)
|
|
524
|
+
.map((s) => s.id),
|
|
525
|
+
all: reconciled.segments.map((s) => s.id),
|
|
526
|
+
});
|
|
527
|
+
}
|
|
528
|
+
const scrollPayload = toScrollPayload(navScroll);
|
|
514
529
|
|
|
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) {
|
|
530
|
+
if (mode.type === "action" || mode.type === "stale-revalidation") {
|
|
519
531
|
startTransition(() => {
|
|
532
|
+
if (hasTransition && addTransitionType) {
|
|
533
|
+
addTransitionType("action");
|
|
534
|
+
}
|
|
520
535
|
onUpdate({
|
|
521
536
|
root: newTree,
|
|
522
537
|
metadata: payload.metadata!,
|
|
538
|
+
scroll: scrollPayload,
|
|
539
|
+
});
|
|
540
|
+
});
|
|
541
|
+
} else if (hasTransition) {
|
|
542
|
+
startTransition(() => {
|
|
543
|
+
if (addTransitionType) {
|
|
544
|
+
addTransitionType("navigation");
|
|
545
|
+
}
|
|
546
|
+
onUpdate({
|
|
547
|
+
root: newTree,
|
|
548
|
+
metadata: payload.metadata!,
|
|
549
|
+
scroll: scrollPayload,
|
|
523
550
|
});
|
|
524
551
|
});
|
|
525
552
|
} else {
|
|
553
|
+
// Normal commit (cold/partial nav AND fully-prefetched nav). For a
|
|
554
|
+
// fully-prefetched nav, renderOptions.forceAwait (above) unwrapped the
|
|
555
|
+
// already-resolved ROUTER loader data AND route content during render, so
|
|
556
|
+
// the new tree carries it inline with no loading()/fallback frame — yet we
|
|
557
|
+
// still commit NORMALLY here rather than in a transition. A transition
|
|
558
|
+
// holds the OLD UI until ALL suspense in the new tree settles, including a
|
|
559
|
+
// CLIENT component that starts its own data request only when mounted
|
|
560
|
+
// (post-commit) under a persistent boundary; that would retain the
|
|
561
|
+
// previous page indefinitely with no feedback. A normal commit lets such
|
|
562
|
+
// client-initiated suspense reveal a fallback (correct) while the router
|
|
563
|
+
// data — genuinely ready — never flashes. Cold/partial navs
|
|
564
|
+
// (fullyPrefetched=false) do not forceAwait, so they stream their
|
|
565
|
+
// fallbacks. Explicit transition() routes keep the broader content-hold
|
|
566
|
+
// via the hasTransition branch above (the documented opt-in).
|
|
526
567
|
onUpdate({
|
|
527
568
|
root: newTree,
|
|
528
569
|
metadata: payload.metadata!,
|
|
570
|
+
scroll: scrollPayload,
|
|
529
571
|
});
|
|
530
572
|
}
|
|
531
573
|
|
|
532
|
-
|
|
533
|
-
return
|
|
574
|
+
debugLog("[Browser] Navigation complete");
|
|
575
|
+
return;
|
|
534
576
|
} 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
577
|
console.warn(`[Browser] Full update (fallback)`);
|
|
542
578
|
|
|
543
579
|
const segments = payload.metadata?.segments || [];
|
|
544
580
|
|
|
545
|
-
// Check if this navigation is stale (a newer one started)
|
|
546
581
|
if (signal?.aborted) {
|
|
547
|
-
|
|
548
|
-
return
|
|
582
|
+
debugLog("[Browser] Ignoring stale navigation (aborted)");
|
|
583
|
+
return;
|
|
549
584
|
}
|
|
550
585
|
|
|
551
586
|
const segmentIds = segments.map((s: ResolvedSegment) => s.id);
|
|
552
587
|
|
|
553
|
-
// Render on client for consistent component references
|
|
554
588
|
const newTree = await renderSegments(segments);
|
|
555
589
|
|
|
556
|
-
// Final abort check before committing - another navigation may have started
|
|
557
590
|
if (signal?.aborted) {
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
);
|
|
561
|
-
return streamComplete;
|
|
591
|
+
debugLog("[Browser] Ignoring stale navigation (aborted before commit)");
|
|
592
|
+
return;
|
|
562
593
|
}
|
|
563
594
|
|
|
564
|
-
|
|
565
|
-
|
|
595
|
+
const fullUpdateServerState = payload.metadata?.locationState;
|
|
596
|
+
const { scroll: fullScroll } = fullUpdateServerState
|
|
597
|
+
? tx.commit(segmentIds, segments, {
|
|
598
|
+
serverState: fullUpdateServerState,
|
|
599
|
+
})
|
|
600
|
+
: tx.commit(segmentIds, segments);
|
|
566
601
|
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
if (
|
|
602
|
+
const fullHasTransition = shouldStartViewTransition(segments);
|
|
603
|
+
const fullScrollPayload = toScrollPayload(fullScroll);
|
|
604
|
+
|
|
605
|
+
if (mode.type === "stale-revalidation") {
|
|
571
606
|
await rawStreamComplete;
|
|
607
|
+
// Mirror the partial branch's history-key staleness guard (above): the
|
|
608
|
+
// await above is a real async suspension, so the user may have navigated
|
|
609
|
+
// away while this background revalidation was draining. Dropping a late
|
|
610
|
+
// full-update here prevents it from clobbering the freshly committed UI
|
|
611
|
+
// of the page the user moved to.
|
|
612
|
+
const historyKeyNow = store.getHistoryKey();
|
|
613
|
+
if (historyKeyNow !== historyKeyAtStart) {
|
|
614
|
+
debugLog(
|
|
615
|
+
`[Browser] Stale revalidation (full update): history key changed (${historyKeyAtStart} -> ${historyKeyNow}), skipping UI update`,
|
|
616
|
+
);
|
|
617
|
+
return;
|
|
618
|
+
}
|
|
619
|
+
startTransition(() => {
|
|
620
|
+
if (fullHasTransition && addTransitionType) {
|
|
621
|
+
addTransitionType("action");
|
|
622
|
+
}
|
|
623
|
+
onUpdate({
|
|
624
|
+
root: newTree,
|
|
625
|
+
metadata: payload.metadata!,
|
|
626
|
+
scroll: fullScrollPayload,
|
|
627
|
+
});
|
|
628
|
+
});
|
|
629
|
+
} else if (mode.type === "action") {
|
|
572
630
|
startTransition(() => {
|
|
631
|
+
if (fullHasTransition && addTransitionType) {
|
|
632
|
+
addTransitionType("action");
|
|
633
|
+
}
|
|
573
634
|
onUpdate({
|
|
574
635
|
root: newTree,
|
|
575
636
|
metadata: payload.metadata!,
|
|
637
|
+
scroll: fullScrollPayload,
|
|
576
638
|
});
|
|
577
639
|
});
|
|
578
|
-
} else if (
|
|
579
|
-
startTransition(
|
|
640
|
+
} else if (fullHasTransition) {
|
|
641
|
+
startTransition(() => {
|
|
642
|
+
if (addTransitionType) {
|
|
643
|
+
addTransitionType("navigation");
|
|
644
|
+
}
|
|
580
645
|
onUpdate({
|
|
581
646
|
root: newTree,
|
|
582
647
|
metadata: payload.metadata!,
|
|
648
|
+
scroll: fullScrollPayload,
|
|
583
649
|
});
|
|
584
650
|
});
|
|
585
651
|
} else {
|
|
586
652
|
onUpdate({
|
|
587
653
|
root: newTree,
|
|
588
654
|
metadata: payload.metadata!,
|
|
655
|
+
scroll: fullScrollPayload,
|
|
589
656
|
});
|
|
590
657
|
}
|
|
591
658
|
|
|
592
|
-
return
|
|
659
|
+
return;
|
|
593
660
|
}
|
|
594
661
|
}
|
|
595
662
|
|