@rangojs/router 0.0.0-experimental.259 → 0.0.0-experimental.25dbaac3
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/{CLAUDE.md → AGENTS.md} +4 -0
- package/README.md +471 -51
- 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 +490 -94
- package/dist/bin/rango.js.map +1 -0
- package/dist/browser/event-controller.d.ts +191 -0
- package/dist/browser/event-controller.d.ts.map +1 -0
- package/dist/browser/event-controller.js +559 -0
- package/dist/browser/event-controller.js.map +1 -0
- package/dist/browser/index.d.ts +2 -0
- package/dist/browser/index.d.ts.map +1 -0
- package/dist/browser/index.js +14 -0
- package/dist/browser/index.js.map +1 -0
- package/dist/browser/link-interceptor.d.ts +38 -0
- package/dist/browser/link-interceptor.d.ts.map +1 -0
- package/dist/browser/link-interceptor.js +99 -0
- package/dist/browser/link-interceptor.js.map +1 -0
- package/dist/browser/logging.d.ts +10 -0
- package/dist/browser/logging.d.ts.map +1 -0
- package/dist/browser/logging.js +29 -0
- package/dist/browser/logging.js.map +1 -0
- package/dist/browser/lru-cache.d.ts +17 -0
- package/dist/browser/lru-cache.d.ts.map +1 -0
- package/dist/browser/lru-cache.js +50 -0
- package/dist/browser/lru-cache.js.map +1 -0
- package/dist/browser/merge-segment-loaders.d.ts +39 -0
- package/dist/browser/merge-segment-loaders.d.ts.map +1 -0
- package/dist/browser/merge-segment-loaders.js +102 -0
- package/dist/browser/merge-segment-loaders.js.map +1 -0
- package/dist/browser/navigation-bridge.d.ts +102 -0
- package/dist/browser/navigation-bridge.d.ts.map +1 -0
- package/dist/browser/navigation-bridge.js +708 -0
- package/dist/browser/navigation-bridge.js.map +1 -0
- package/dist/browser/navigation-client.d.ts +25 -0
- package/dist/browser/navigation-client.d.ts.map +1 -0
- package/dist/browser/navigation-client.js +157 -0
- package/dist/browser/navigation-client.js.map +1 -0
- package/dist/browser/navigation-store.d.ts +101 -0
- package/dist/browser/navigation-store.d.ts.map +1 -0
- package/dist/browser/navigation-store.js +625 -0
- package/dist/browser/navigation-store.js.map +1 -0
- package/dist/browser/partial-update.d.ts +75 -0
- package/dist/browser/partial-update.d.ts.map +1 -0
- package/dist/browser/partial-update.js +426 -0
- package/dist/browser/partial-update.js.map +1 -0
- package/dist/browser/react/Link.d.ts +86 -0
- package/dist/browser/react/Link.d.ts.map +1 -0
- package/dist/browser/react/Link.js +128 -0
- package/dist/browser/react/Link.js.map +1 -0
- package/dist/browser/react/NavigationProvider.d.ts +63 -0
- package/dist/browser/react/NavigationProvider.d.ts.map +1 -0
- package/dist/browser/react/NavigationProvider.js +216 -0
- package/dist/browser/react/NavigationProvider.js.map +1 -0
- package/dist/browser/react/ScrollRestoration.d.ts +75 -0
- package/dist/browser/react/ScrollRestoration.d.ts.map +1 -0
- package/dist/browser/react/ScrollRestoration.js +57 -0
- package/dist/browser/react/ScrollRestoration.js.map +1 -0
- package/dist/browser/react/context.d.ts +46 -0
- package/dist/browser/react/context.d.ts.map +1 -0
- package/dist/browser/react/context.js +10 -0
- package/dist/browser/react/context.js.map +1 -0
- package/dist/browser/react/index.d.ts +11 -0
- package/dist/browser/react/index.d.ts.map +1 -0
- package/dist/browser/react/index.js +22 -0
- package/dist/browser/react/index.js.map +1 -0
- package/dist/browser/react/location-state-shared.d.ts +63 -0
- package/dist/browser/react/location-state-shared.d.ts.map +1 -0
- package/dist/browser/react/location-state-shared.js +81 -0
- package/dist/browser/react/location-state-shared.js.map +1 -0
- package/dist/browser/react/location-state.d.ts +23 -0
- package/dist/browser/react/location-state.d.ts.map +1 -0
- package/dist/browser/react/location-state.js +29 -0
- package/dist/browser/react/location-state.js.map +1 -0
- package/dist/browser/react/mount-context.d.ts +24 -0
- package/dist/browser/react/mount-context.d.ts.map +1 -0
- package/dist/browser/react/mount-context.js +24 -0
- package/dist/browser/react/mount-context.js.map +1 -0
- package/dist/browser/react/use-action.d.ts +64 -0
- package/dist/browser/react/use-action.d.ts.map +1 -0
- package/dist/browser/react/use-action.js +134 -0
- package/dist/browser/react/use-action.js.map +1 -0
- package/dist/browser/react/use-client-cache.d.ts +41 -0
- package/dist/browser/react/use-client-cache.d.ts.map +1 -0
- package/dist/browser/react/use-client-cache.js +39 -0
- package/dist/browser/react/use-client-cache.js.map +1 -0
- package/dist/browser/react/use-handle.d.ts +31 -0
- package/dist/browser/react/use-handle.d.ts.map +1 -0
- package/dist/browser/react/use-handle.js +144 -0
- package/dist/browser/react/use-handle.js.map +1 -0
- package/dist/browser/react/use-href.d.ts +33 -0
- package/dist/browser/react/use-href.d.ts.map +1 -0
- package/dist/browser/react/use-href.js +39 -0
- package/dist/browser/react/use-href.js.map +1 -0
- package/dist/browser/react/use-link-status.d.ts +37 -0
- package/dist/browser/react/use-link-status.d.ts.map +1 -0
- package/dist/browser/react/use-link-status.js +99 -0
- package/dist/browser/react/use-link-status.js.map +1 -0
- package/dist/browser/react/use-mount.d.ts +25 -0
- package/dist/browser/react/use-mount.d.ts.map +1 -0
- package/dist/browser/react/use-mount.js +30 -0
- package/dist/browser/react/use-mount.js.map +1 -0
- package/dist/browser/react/use-navigation.d.ts +27 -0
- package/dist/browser/react/use-navigation.d.ts.map +1 -0
- package/dist/browser/react/use-navigation.js +87 -0
- package/dist/browser/react/use-navigation.js.map +1 -0
- package/dist/browser/react/use-segments.d.ts +38 -0
- package/dist/browser/react/use-segments.d.ts.map +1 -0
- package/dist/browser/react/use-segments.js +130 -0
- package/dist/browser/react/use-segments.js.map +1 -0
- package/dist/browser/request-controller.d.ts +26 -0
- package/dist/browser/request-controller.d.ts.map +1 -0
- package/dist/browser/request-controller.js +147 -0
- package/dist/browser/request-controller.js.map +1 -0
- package/dist/browser/rsc-router.d.ts +129 -0
- package/dist/browser/rsc-router.d.ts.map +1 -0
- package/dist/browser/rsc-router.js +195 -0
- package/dist/browser/rsc-router.js.map +1 -0
- package/dist/browser/scroll-restoration.d.ts +93 -0
- package/dist/browser/scroll-restoration.d.ts.map +1 -0
- package/dist/browser/scroll-restoration.js +321 -0
- package/dist/browser/scroll-restoration.js.map +1 -0
- package/dist/browser/segment-structure-assert.d.ts +17 -0
- package/dist/browser/segment-structure-assert.d.ts.map +1 -0
- package/dist/browser/segment-structure-assert.js +59 -0
- package/dist/browser/segment-structure-assert.js.map +1 -0
- package/dist/browser/server-action-bridge.d.ts +26 -0
- package/dist/browser/server-action-bridge.d.ts.map +1 -0
- package/dist/browser/server-action-bridge.js +668 -0
- package/dist/browser/server-action-bridge.js.map +1 -0
- package/dist/browser/shallow.d.ts +12 -0
- package/dist/browser/shallow.d.ts.map +1 -0
- package/dist/browser/shallow.js +34 -0
- package/dist/browser/shallow.js.map +1 -0
- package/dist/browser/types.d.ts +369 -0
- package/dist/browser/types.d.ts.map +1 -0
- package/dist/browser/types.js +2 -0
- package/dist/browser/types.js.map +1 -0
- package/dist/build/__tests__/generate-cli.test.d.ts +2 -0
- package/dist/build/__tests__/generate-cli.test.d.ts.map +1 -0
- package/dist/build/__tests__/generate-cli.test.js +237 -0
- package/dist/build/__tests__/generate-cli.test.js.map +1 -0
- package/dist/build/__tests__/generate-manifest.test.d.ts +2 -0
- package/dist/build/__tests__/generate-manifest.test.d.ts.map +1 -0
- package/dist/build/__tests__/generate-manifest.test.js +119 -0
- package/dist/build/__tests__/generate-manifest.test.js.map +1 -0
- package/dist/build/__tests__/generate-route-types.test.d.ts +2 -0
- package/dist/build/__tests__/generate-route-types.test.d.ts.map +1 -0
- package/dist/build/__tests__/generate-route-types.test.js +620 -0
- package/dist/build/__tests__/generate-route-types.test.js.map +1 -0
- package/dist/build/__tests__/per-router-manifest.test.d.ts +2 -0
- package/dist/build/__tests__/per-router-manifest.test.d.ts.map +1 -0
- package/dist/build/__tests__/per-router-manifest.test.js +308 -0
- package/dist/build/__tests__/per-router-manifest.test.js.map +1 -0
- package/dist/build/generate-manifest.d.ts +81 -0
- package/dist/build/generate-manifest.d.ts.map +1 -0
- package/dist/build/generate-manifest.js +276 -0
- package/dist/build/generate-manifest.js.map +1 -0
- package/dist/build/generate-route-types.d.ts +115 -0
- package/dist/build/generate-route-types.d.ts.map +1 -0
- package/dist/build/generate-route-types.js +740 -0
- package/dist/build/generate-route-types.js.map +1 -0
- package/dist/build/index.d.ts +21 -0
- package/dist/build/index.d.ts.map +1 -0
- package/dist/build/index.js +21 -0
- package/dist/build/index.js.map +1 -0
- package/dist/build/route-trie.d.ts +71 -0
- package/dist/build/route-trie.d.ts.map +1 -0
- package/dist/build/route-trie.js +175 -0
- package/dist/build/route-trie.js.map +1 -0
- package/dist/cache/__tests__/cache-scope.test.d.ts +2 -0
- package/dist/cache/__tests__/cache-scope.test.d.ts.map +1 -0
- package/dist/cache/__tests__/cache-scope.test.js +208 -0
- package/dist/cache/__tests__/cache-scope.test.js.map +1 -0
- package/dist/cache/__tests__/document-cache.test.d.ts +2 -0
- package/dist/cache/__tests__/document-cache.test.d.ts.map +1 -0
- package/dist/cache/__tests__/document-cache.test.js +345 -0
- package/dist/cache/__tests__/document-cache.test.js.map +1 -0
- package/dist/cache/__tests__/memory-segment-store.test.d.ts +2 -0
- package/dist/cache/__tests__/memory-segment-store.test.d.ts.map +1 -0
- package/dist/cache/__tests__/memory-segment-store.test.js +425 -0
- package/dist/cache/__tests__/memory-segment-store.test.js.map +1 -0
- package/dist/cache/__tests__/memory-store.test.d.ts +2 -0
- package/dist/cache/__tests__/memory-store.test.d.ts.map +1 -0
- package/dist/cache/__tests__/memory-store.test.js +367 -0
- package/dist/cache/__tests__/memory-store.test.js.map +1 -0
- package/dist/cache/cache-scope.d.ts +102 -0
- package/dist/cache/cache-scope.d.ts.map +1 -0
- package/dist/cache/cache-scope.js +440 -0
- package/dist/cache/cache-scope.js.map +1 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts +2 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts.map +1 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.js +330 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.js.map +1 -0
- package/dist/cache/cf/cf-cache-store.d.ts +165 -0
- package/dist/cache/cf/cf-cache-store.d.ts.map +1 -0
- package/dist/cache/cf/cf-cache-store.js +242 -0
- package/dist/cache/cf/cf-cache-store.js.map +1 -0
- package/dist/cache/cf/index.d.ts +14 -0
- package/dist/cache/cf/index.d.ts.map +1 -0
- package/dist/cache/cf/index.js +17 -0
- package/dist/cache/cf/index.js.map +1 -0
- package/dist/cache/document-cache.d.ts +64 -0
- package/dist/cache/document-cache.d.ts.map +1 -0
- package/dist/cache/document-cache.js +228 -0
- package/dist/cache/document-cache.js.map +1 -0
- package/dist/cache/index.d.ts +19 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +21 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/cache/memory-segment-store.d.ts +110 -0
- package/dist/cache/memory-segment-store.d.ts.map +1 -0
- package/dist/cache/memory-segment-store.js +117 -0
- package/dist/cache/memory-segment-store.js.map +1 -0
- package/dist/cache/memory-store.d.ts +41 -0
- package/dist/cache/memory-store.d.ts.map +1 -0
- package/dist/cache/memory-store.js +191 -0
- package/dist/cache/memory-store.js.map +1 -0
- package/dist/cache/types.d.ts +317 -0
- package/dist/cache/types.d.ts.map +1 -0
- package/dist/cache/types.js +12 -0
- package/dist/cache/types.js.map +1 -0
- package/dist/client.d.ts +248 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +367 -0
- package/dist/client.js.map +1 -0
- package/dist/client.rsc.d.ts +26 -0
- package/dist/client.rsc.d.ts.map +1 -0
- package/dist/client.rsc.js +46 -0
- package/dist/client.rsc.js.map +1 -0
- package/dist/component-utils.d.ts +36 -0
- package/dist/component-utils.d.ts.map +1 -0
- package/dist/component-utils.js +61 -0
- package/dist/component-utils.js.map +1 -0
- package/dist/components/DefaultDocument.d.ts +13 -0
- package/dist/components/DefaultDocument.d.ts.map +1 -0
- package/dist/components/DefaultDocument.js +15 -0
- package/dist/components/DefaultDocument.js.map +1 -0
- package/dist/debug.d.ts +58 -0
- package/dist/debug.d.ts.map +1 -0
- package/dist/debug.js +157 -0
- package/dist/debug.js.map +1 -0
- package/dist/default-error-boundary.d.ts +11 -0
- package/dist/default-error-boundary.d.ts.map +1 -0
- package/dist/default-error-boundary.js +45 -0
- package/dist/default-error-boundary.js.map +1 -0
- package/dist/deps/browser.d.ts +2 -0
- package/dist/deps/browser.d.ts.map +1 -0
- package/dist/deps/browser.js +3 -0
- package/dist/deps/browser.js.map +1 -0
- package/dist/deps/html-stream-client.d.ts +2 -0
- package/dist/deps/html-stream-client.d.ts.map +1 -0
- package/dist/deps/html-stream-client.js +3 -0
- package/dist/deps/html-stream-client.js.map +1 -0
- package/dist/deps/html-stream-server.d.ts +2 -0
- package/dist/deps/html-stream-server.d.ts.map +1 -0
- package/dist/deps/html-stream-server.js +3 -0
- package/dist/deps/html-stream-server.js.map +1 -0
- package/dist/deps/rsc.d.ts +2 -0
- package/dist/deps/rsc.d.ts.map +1 -0
- package/dist/deps/rsc.js +4 -0
- package/dist/deps/rsc.js.map +1 -0
- package/dist/deps/ssr.d.ts +2 -0
- package/dist/deps/ssr.d.ts.map +1 -0
- package/dist/deps/ssr.js +3 -0
- package/dist/deps/ssr.js.map +1 -0
- package/dist/errors.d.ts +174 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +241 -0
- package/dist/errors.js.map +1 -0
- package/dist/handle.d.ts +78 -0
- package/dist/handle.d.ts.map +1 -0
- package/dist/handle.js +82 -0
- package/dist/handle.js.map +1 -0
- package/dist/handles/MetaTags.d.ts +14 -0
- package/dist/handles/MetaTags.d.ts.map +1 -0
- package/dist/handles/MetaTags.js +136 -0
- package/dist/handles/MetaTags.js.map +1 -0
- package/dist/handles/index.d.ts +6 -0
- package/dist/handles/index.d.ts.map +1 -0
- package/dist/handles/index.js +6 -0
- package/dist/handles/index.js.map +1 -0
- package/dist/handles/meta.d.ts +39 -0
- package/dist/handles/meta.d.ts.map +1 -0
- package/dist/handles/meta.js +202 -0
- package/dist/handles/meta.js.map +1 -0
- package/dist/host/__tests__/errors.test.d.ts +2 -0
- package/dist/host/__tests__/errors.test.d.ts.map +1 -0
- package/dist/host/__tests__/errors.test.js +76 -0
- package/dist/host/__tests__/errors.test.js.map +1 -0
- package/dist/host/__tests__/pattern-comprehensive.test.d.ts +2 -0
- package/dist/host/__tests__/pattern-comprehensive.test.d.ts.map +1 -0
- package/dist/host/__tests__/pattern-comprehensive.test.js +732 -0
- package/dist/host/__tests__/pattern-comprehensive.test.js.map +1 -0
- package/dist/host/__tests__/pattern-matcher.test.d.ts +2 -0
- package/dist/host/__tests__/pattern-matcher.test.d.ts.map +1 -0
- package/dist/host/__tests__/pattern-matcher.test.js +251 -0
- package/dist/host/__tests__/pattern-matcher.test.js.map +1 -0
- package/dist/host/__tests__/router.test.d.ts +2 -0
- package/dist/host/__tests__/router.test.d.ts.map +1 -0
- package/dist/host/__tests__/router.test.js +241 -0
- package/dist/host/__tests__/router.test.js.map +1 -0
- package/dist/host/__tests__/testing.test.d.ts +2 -0
- package/dist/host/__tests__/testing.test.d.ts.map +1 -0
- package/dist/host/__tests__/testing.test.js +64 -0
- package/dist/host/__tests__/testing.test.js.map +1 -0
- package/dist/host/__tests__/utils.test.d.ts +2 -0
- package/dist/host/__tests__/utils.test.d.ts.map +1 -0
- package/dist/host/__tests__/utils.test.js +29 -0
- package/dist/host/__tests__/utils.test.js.map +1 -0
- package/dist/host/cookie-handler.d.ts +34 -0
- package/dist/host/cookie-handler.d.ts.map +1 -0
- package/dist/host/cookie-handler.js +124 -0
- package/dist/host/cookie-handler.js.map +1 -0
- package/dist/host/errors.d.ts +56 -0
- package/dist/host/errors.d.ts.map +1 -0
- package/dist/host/errors.js +79 -0
- package/dist/host/errors.js.map +1 -0
- package/dist/host/index.d.ts +29 -0
- package/dist/host/index.d.ts.map +1 -0
- package/dist/host/index.js +32 -0
- package/dist/host/index.js.map +1 -0
- package/dist/host/pattern-matcher.d.ts +36 -0
- package/dist/host/pattern-matcher.d.ts.map +1 -0
- package/dist/host/pattern-matcher.js +172 -0
- package/dist/host/pattern-matcher.js.map +1 -0
- package/dist/host/router.d.ts +26 -0
- package/dist/host/router.d.ts.map +1 -0
- package/dist/host/router.js +218 -0
- package/dist/host/router.js.map +1 -0
- package/dist/host/testing.d.ts +36 -0
- package/dist/host/testing.d.ts.map +1 -0
- package/dist/host/testing.js +55 -0
- package/dist/host/testing.js.map +1 -0
- package/dist/host/types.d.ts +115 -0
- package/dist/host/types.d.ts.map +1 -0
- package/dist/host/types.js +7 -0
- package/dist/host/types.js.map +1 -0
- package/dist/host/utils.d.ts +21 -0
- package/dist/host/utils.d.ts.map +1 -0
- package/dist/host/utils.js +23 -0
- package/dist/host/utils.js.map +1 -0
- package/dist/href-client.d.ts +131 -0
- package/dist/href-client.d.ts.map +1 -0
- package/dist/href-client.js +64 -0
- package/dist/href-client.js.map +1 -0
- package/{src/href-context.ts → dist/href-context.d.ts} +7 -11
- package/dist/href-context.d.ts.map +1 -0
- package/dist/href-context.js +21 -0
- package/dist/href-context.js.map +1 -0
- package/dist/index.d.ts +73 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +91 -0
- package/dist/index.js.map +1 -0
- package/dist/index.rsc.d.ts +32 -0
- package/dist/index.rsc.d.ts.map +1 -0
- package/dist/index.rsc.js +40 -0
- package/dist/index.rsc.js.map +1 -0
- package/dist/internal-debug.d.ts +2 -0
- package/dist/internal-debug.d.ts.map +1 -0
- package/dist/internal-debug.js +5 -0
- package/dist/internal-debug.js.map +1 -0
- package/dist/loader.d.ts +14 -0
- package/dist/loader.d.ts.map +1 -0
- package/dist/loader.js +20 -0
- package/dist/loader.js.map +1 -0
- package/dist/loader.rsc.d.ts +19 -0
- package/dist/loader.rsc.d.ts.map +1 -0
- package/dist/loader.rsc.js +99 -0
- package/dist/loader.rsc.js.map +1 -0
- package/dist/network-error-thrower.d.ts +17 -0
- package/dist/network-error-thrower.d.ts.map +1 -0
- package/dist/network-error-thrower.js +14 -0
- package/dist/network-error-thrower.js.map +1 -0
- package/dist/outlet-context.d.ts +13 -0
- package/dist/outlet-context.d.ts.map +1 -0
- package/dist/outlet-context.js +3 -0
- package/dist/outlet-context.js.map +1 -0
- package/dist/prerender/__tests__/param-hash.test.d.ts +2 -0
- package/dist/prerender/__tests__/param-hash.test.d.ts.map +1 -0
- package/dist/prerender/__tests__/param-hash.test.js +148 -0
- package/dist/prerender/__tests__/param-hash.test.js.map +1 -0
- package/dist/prerender/param-hash.d.ts +16 -0
- package/dist/prerender/param-hash.d.ts.map +1 -0
- package/dist/prerender/param-hash.js +36 -0
- package/dist/prerender/param-hash.js.map +1 -0
- package/dist/prerender/store.d.ts +38 -0
- package/dist/prerender/store.d.ts.map +1 -0
- package/dist/prerender/store.js +61 -0
- package/dist/prerender/store.js.map +1 -0
- package/dist/prerender.d.ts +66 -0
- package/dist/prerender.d.ts.map +1 -0
- package/dist/prerender.js +57 -0
- package/dist/prerender.js.map +1 -0
- package/dist/reverse.d.ts +196 -0
- package/dist/reverse.d.ts.map +1 -0
- package/dist/reverse.js +78 -0
- package/dist/reverse.js.map +1 -0
- package/dist/root-error-boundary.d.ts +33 -0
- package/dist/root-error-boundary.d.ts.map +1 -0
- package/dist/root-error-boundary.js +165 -0
- package/dist/root-error-boundary.js.map +1 -0
- package/dist/route-content-wrapper.d.ts +46 -0
- package/dist/route-content-wrapper.d.ts.map +1 -0
- package/dist/route-content-wrapper.js +77 -0
- package/dist/route-content-wrapper.js.map +1 -0
- package/dist/route-definition.d.ts +421 -0
- package/dist/route-definition.d.ts.map +1 -0
- package/dist/route-definition.js +868 -0
- package/dist/route-definition.js.map +1 -0
- package/dist/route-map-builder.d.ts +155 -0
- package/dist/route-map-builder.d.ts.map +1 -0
- package/dist/route-map-builder.js +237 -0
- package/dist/route-map-builder.js.map +1 -0
- package/dist/route-types.d.ts +165 -0
- package/dist/route-types.d.ts.map +1 -0
- package/dist/route-types.js +7 -0
- package/dist/route-types.js.map +1 -0
- package/dist/router/__tests__/handler-context.test.d.ts +2 -0
- package/dist/router/__tests__/handler-context.test.d.ts.map +1 -0
- package/dist/router/__tests__/handler-context.test.js +65 -0
- package/dist/router/__tests__/handler-context.test.js.map +1 -0
- package/dist/router/__tests__/loader-cycle-detection.test.d.ts +2 -0
- package/dist/router/__tests__/loader-cycle-detection.test.d.ts.map +1 -0
- package/dist/router/__tests__/loader-cycle-detection.test.js +221 -0
- package/dist/router/__tests__/loader-cycle-detection.test.js.map +1 -0
- package/dist/router/__tests__/match-context.test.d.ts +2 -0
- package/dist/router/__tests__/match-context.test.d.ts.map +1 -0
- package/dist/router/__tests__/match-context.test.js +92 -0
- package/dist/router/__tests__/match-context.test.js.map +1 -0
- package/dist/router/__tests__/match-pipelines.test.d.ts +2 -0
- package/dist/router/__tests__/match-pipelines.test.d.ts.map +1 -0
- package/dist/router/__tests__/match-pipelines.test.js +417 -0
- package/dist/router/__tests__/match-pipelines.test.js.map +1 -0
- package/dist/router/__tests__/match-result.test.d.ts +2 -0
- package/dist/router/__tests__/match-result.test.d.ts.map +1 -0
- package/dist/router/__tests__/match-result.test.js +457 -0
- package/dist/router/__tests__/match-result.test.js.map +1 -0
- package/dist/router/__tests__/on-error.test.d.ts +2 -0
- package/dist/router/__tests__/on-error.test.d.ts.map +1 -0
- package/dist/router/__tests__/on-error.test.js +678 -0
- package/dist/router/__tests__/on-error.test.js.map +1 -0
- package/dist/router/__tests__/pattern-matching.test.d.ts +2 -0
- package/dist/router/__tests__/pattern-matching.test.d.ts.map +1 -0
- package/dist/router/__tests__/pattern-matching.test.js +629 -0
- package/dist/router/__tests__/pattern-matching.test.js.map +1 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts +2 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts.map +1 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.js +155 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.js.map +1 -0
- package/dist/router/error-handling.d.ts +77 -0
- package/dist/router/error-handling.d.ts.map +1 -0
- package/dist/router/error-handling.js +202 -0
- package/dist/router/error-handling.js.map +1 -0
- package/dist/router/handler-context.d.ts +20 -0
- package/dist/router/handler-context.d.ts.map +1 -0
- package/dist/router/handler-context.js +198 -0
- package/dist/router/handler-context.js.map +1 -0
- package/dist/router/intercept-resolution.d.ts +66 -0
- package/dist/router/intercept-resolution.d.ts.map +1 -0
- package/dist/router/intercept-resolution.js +246 -0
- package/dist/router/intercept-resolution.js.map +1 -0
- package/dist/router/loader-resolution.d.ts +64 -0
- package/dist/router/loader-resolution.d.ts.map +1 -0
- package/dist/router/loader-resolution.js +284 -0
- package/dist/router/loader-resolution.js.map +1 -0
- package/dist/router/logging.d.ts +15 -0
- package/dist/router/logging.d.ts.map +1 -0
- package/dist/router/logging.js +99 -0
- package/dist/router/logging.js.map +1 -0
- package/dist/router/manifest.d.ts +22 -0
- package/dist/router/manifest.d.ts.map +1 -0
- package/dist/router/manifest.js +181 -0
- package/dist/router/manifest.js.map +1 -0
- package/dist/router/match-api.d.ts +35 -0
- package/dist/router/match-api.d.ts.map +1 -0
- package/dist/router/match-api.js +406 -0
- package/dist/router/match-api.js.map +1 -0
- package/dist/router/match-context.d.ts +206 -0
- package/dist/router/match-context.d.ts.map +1 -0
- package/dist/router/match-context.js +17 -0
- package/dist/router/match-context.js.map +1 -0
- package/dist/router/match-middleware/background-revalidation.d.ts +127 -0
- package/dist/router/match-middleware/background-revalidation.d.ts.map +1 -0
- package/dist/router/match-middleware/background-revalidation.js +75 -0
- package/dist/router/match-middleware/background-revalidation.js.map +1 -0
- package/dist/router/match-middleware/cache-lookup.d.ts +112 -0
- package/dist/router/match-middleware/cache-lookup.d.ts.map +1 -0
- package/dist/router/match-middleware/cache-lookup.js +257 -0
- package/dist/router/match-middleware/cache-lookup.js.map +1 -0
- package/dist/router/match-middleware/cache-store.d.ts +113 -0
- package/dist/router/match-middleware/cache-store.d.ts.map +1 -0
- package/dist/router/match-middleware/cache-store.js +108 -0
- package/dist/router/match-middleware/cache-store.js.map +1 -0
- package/dist/router/match-middleware/index.d.ts +81 -0
- package/dist/router/match-middleware/index.d.ts.map +1 -0
- package/dist/router/match-middleware/index.js +80 -0
- package/dist/router/match-middleware/index.js.map +1 -0
- package/dist/router/match-middleware/intercept-resolution.d.ts +117 -0
- package/dist/router/match-middleware/intercept-resolution.d.ts.map +1 -0
- package/dist/router/match-middleware/intercept-resolution.js +134 -0
- package/dist/router/match-middleware/intercept-resolution.js.map +1 -0
- package/dist/router/match-middleware/segment-resolution.d.ts +99 -0
- package/dist/router/match-middleware/segment-resolution.d.ts.map +1 -0
- package/dist/router/match-middleware/segment-resolution.js +53 -0
- package/dist/router/match-middleware/segment-resolution.js.map +1 -0
- package/dist/router/match-pipelines.d.ts +147 -0
- package/dist/router/match-pipelines.d.ts.map +1 -0
- package/dist/router/match-pipelines.js +82 -0
- package/dist/router/match-pipelines.js.map +1 -0
- package/dist/router/match-result.d.ts +126 -0
- package/dist/router/match-result.d.ts.map +1 -0
- package/dist/router/match-result.js +93 -0
- package/dist/router/match-result.js.map +1 -0
- package/dist/router/metrics.d.ts +20 -0
- package/dist/router/metrics.d.ts.map +1 -0
- package/dist/router/metrics.js +47 -0
- package/dist/router/metrics.js.map +1 -0
- package/dist/router/middleware.d.ts +249 -0
- package/dist/router/middleware.d.ts.map +1 -0
- package/dist/router/middleware.js +434 -0
- package/dist/router/middleware.js.map +1 -0
- package/dist/router/middleware.test.d.ts +2 -0
- package/dist/router/middleware.test.d.ts.map +1 -0
- package/dist/router/middleware.test.js +816 -0
- package/dist/router/middleware.test.js.map +1 -0
- package/dist/router/pattern-matching.d.ts +149 -0
- package/dist/router/pattern-matching.d.ts.map +1 -0
- package/dist/router/pattern-matching.js +349 -0
- package/dist/router/pattern-matching.js.map +1 -0
- package/dist/router/revalidation.d.ts +44 -0
- package/dist/router/revalidation.d.ts.map +1 -0
- package/dist/router/revalidation.js +147 -0
- package/dist/router/revalidation.js.map +1 -0
- package/dist/router/router-context.d.ts +135 -0
- package/dist/router/router-context.d.ts.map +1 -0
- package/dist/router/router-context.js +36 -0
- package/dist/router/router-context.js.map +1 -0
- package/dist/router/segment-resolution.d.ts +127 -0
- package/dist/router/segment-resolution.d.ts.map +1 -0
- package/dist/router/segment-resolution.js +919 -0
- package/dist/router/segment-resolution.js.map +1 -0
- package/dist/router/trie-matching.d.ts +40 -0
- package/dist/router/trie-matching.d.ts.map +1 -0
- package/dist/router/trie-matching.js +127 -0
- package/dist/router/trie-matching.js.map +1 -0
- package/dist/router/types.d.ts +136 -0
- package/dist/router/types.d.ts.map +1 -0
- package/dist/router/types.js +7 -0
- package/dist/router/types.js.map +1 -0
- package/dist/router.d.ts +753 -0
- package/dist/router.d.ts.map +1 -0
- package/dist/router.gen.d.ts +6 -0
- package/dist/router.gen.d.ts.map +1 -0
- package/dist/router.gen.js +6 -0
- package/dist/router.gen.js.map +1 -0
- package/dist/router.js +1304 -0
- package/dist/router.js.map +1 -0
- package/dist/rsc/__tests__/helpers.test.d.ts +2 -0
- package/dist/rsc/__tests__/helpers.test.d.ts.map +1 -0
- package/dist/rsc/__tests__/helpers.test.js +140 -0
- package/dist/rsc/__tests__/helpers.test.js.map +1 -0
- package/dist/rsc/handler.d.ts +45 -0
- package/dist/rsc/handler.d.ts.map +1 -0
- package/dist/rsc/handler.js +1172 -0
- package/dist/rsc/handler.js.map +1 -0
- package/dist/rsc/helpers.d.ts +16 -0
- package/dist/rsc/helpers.d.ts.map +1 -0
- package/dist/rsc/helpers.js +55 -0
- package/dist/rsc/helpers.js.map +1 -0
- package/dist/rsc/index.d.ts +22 -0
- package/dist/rsc/index.d.ts.map +1 -0
- package/dist/rsc/index.js +23 -0
- package/dist/rsc/index.js.map +1 -0
- package/dist/rsc/nonce.d.ts +9 -0
- package/dist/rsc/nonce.d.ts.map +1 -0
- package/dist/rsc/nonce.js +18 -0
- package/dist/rsc/nonce.js.map +1 -0
- package/dist/rsc/types.d.ts +206 -0
- package/dist/rsc/types.d.ts.map +1 -0
- package/dist/rsc/types.js +8 -0
- package/dist/rsc/types.js.map +1 -0
- package/dist/search-params.d.ts +103 -0
- package/dist/search-params.d.ts.map +1 -0
- package/dist/search-params.js +74 -0
- package/dist/search-params.js.map +1 -0
- package/dist/segment-system.d.ts +75 -0
- package/dist/segment-system.d.ts.map +1 -0
- package/dist/segment-system.js +336 -0
- package/dist/segment-system.js.map +1 -0
- package/dist/server/context.d.ts +245 -0
- package/dist/server/context.d.ts.map +1 -0
- package/dist/server/context.js +197 -0
- package/dist/server/context.js.map +1 -0
- package/dist/server/fetchable-loader-store.d.ts +18 -0
- package/dist/server/fetchable-loader-store.d.ts.map +1 -0
- package/dist/server/fetchable-loader-store.js +18 -0
- package/dist/server/fetchable-loader-store.js.map +1 -0
- package/dist/server/handle-store.d.ts +85 -0
- package/dist/server/handle-store.d.ts.map +1 -0
- package/dist/server/handle-store.js +142 -0
- package/dist/server/handle-store.js.map +1 -0
- package/dist/server/loader-registry.d.ts +55 -0
- package/dist/server/loader-registry.d.ts.map +1 -0
- package/dist/server/loader-registry.js +132 -0
- package/dist/server/loader-registry.js.map +1 -0
- package/dist/server/request-context.d.ts +226 -0
- package/dist/server/request-context.d.ts.map +1 -0
- package/dist/server/request-context.js +290 -0
- package/dist/server/request-context.js.map +1 -0
- package/dist/server/root-layout.d.ts +4 -0
- package/dist/server/root-layout.d.ts.map +1 -0
- package/dist/server/root-layout.js +5 -0
- package/dist/server/root-layout.js.map +1 -0
- package/dist/server.d.ts +15 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +20 -0
- package/dist/server.js.map +1 -0
- package/dist/ssr/__tests__/ssr-handler.test.d.ts +2 -0
- package/dist/ssr/__tests__/ssr-handler.test.d.ts.map +1 -0
- package/dist/ssr/__tests__/ssr-handler.test.js +132 -0
- package/dist/ssr/__tests__/ssr-handler.test.js.map +1 -0
- package/dist/ssr/index.d.ts +98 -0
- package/dist/ssr/index.d.ts.map +1 -0
- package/dist/ssr/index.js +158 -0
- package/dist/ssr/index.js.map +1 -0
- package/dist/static-handler.d.ts +50 -0
- package/dist/static-handler.d.ts.map +1 -0
- package/dist/static-handler.gen.d.ts +5 -0
- package/dist/static-handler.gen.d.ts.map +1 -0
- package/dist/static-handler.gen.js +5 -0
- package/dist/static-handler.gen.js.map +1 -0
- package/dist/static-handler.js +29 -0
- package/dist/static-handler.js.map +1 -0
- package/dist/theme/ThemeProvider.d.ts +20 -0
- package/dist/theme/ThemeProvider.d.ts.map +1 -0
- package/dist/theme/ThemeProvider.js +240 -0
- package/dist/theme/ThemeProvider.js.map +1 -0
- package/dist/theme/ThemeScript.d.ts +48 -0
- package/dist/theme/ThemeScript.d.ts.map +1 -0
- package/dist/theme/ThemeScript.js +13 -0
- package/dist/theme/ThemeScript.js.map +1 -0
- package/dist/theme/__tests__/theme.test.d.ts +2 -0
- package/dist/theme/__tests__/theme.test.d.ts.map +1 -0
- package/dist/theme/__tests__/theme.test.js +103 -0
- package/dist/theme/__tests__/theme.test.js.map +1 -0
- package/dist/theme/constants.d.ts +29 -0
- package/dist/theme/constants.d.ts.map +1 -0
- package/dist/theme/constants.js +48 -0
- package/dist/theme/constants.js.map +1 -0
- package/dist/theme/index.d.ts +31 -0
- package/dist/theme/index.d.ts.map +1 -0
- package/dist/theme/index.js +36 -0
- package/dist/theme/index.js.map +1 -0
- package/dist/theme/theme-context.d.ts +40 -0
- package/dist/theme/theme-context.d.ts.map +1 -0
- package/dist/theme/theme-context.js +60 -0
- package/dist/theme/theme-context.js.map +1 -0
- package/dist/theme/theme-script.d.ts +27 -0
- package/dist/theme/theme-script.d.ts.map +1 -0
- package/dist/theme/theme-script.js +147 -0
- package/dist/theme/theme-script.js.map +1 -0
- package/dist/theme/types.d.ts +163 -0
- package/dist/theme/types.d.ts.map +1 -0
- package/dist/theme/types.js +11 -0
- package/dist/theme/types.js.map +1 -0
- package/dist/theme/use-theme.d.ts +12 -0
- package/dist/theme/use-theme.d.ts.map +1 -0
- package/dist/theme/use-theme.js +40 -0
- package/dist/theme/use-theme.js.map +1 -0
- package/dist/types.d.ts +1479 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +10 -0
- package/dist/types.js.map +1 -0
- package/dist/urls.d.ts +441 -0
- package/dist/urls.d.ts.map +1 -0
- package/dist/urls.gen.d.ts +8 -0
- package/dist/urls.gen.d.ts.map +1 -0
- package/dist/urls.gen.js +8 -0
- package/dist/urls.gen.js.map +1 -0
- package/dist/urls.js +443 -0
- package/dist/urls.js.map +1 -0
- package/dist/use-loader.d.ts +127 -0
- package/dist/use-loader.d.ts.map +1 -0
- package/dist/use-loader.js +237 -0
- package/dist/use-loader.js.map +1 -0
- package/dist/vite/__tests__/ast-handler-extract.test.d.ts +2 -0
- package/dist/vite/__tests__/ast-handler-extract.test.d.ts.map +1 -0
- package/dist/vite/__tests__/ast-handler-extract.test.js +294 -0
- package/dist/vite/__tests__/ast-handler-extract.test.js.map +1 -0
- package/dist/vite/__tests__/expose-id-utils.test.d.ts +2 -0
- package/dist/vite/__tests__/expose-id-utils.test.d.ts.map +1 -0
- package/dist/vite/__tests__/expose-id-utils.test.js +224 -0
- package/dist/vite/__tests__/expose-id-utils.test.js.map +1 -0
- package/dist/vite/__tests__/expose-internal-ids.test.d.ts +2 -0
- package/dist/vite/__tests__/expose-internal-ids.test.d.ts.map +1 -0
- package/dist/vite/__tests__/expose-internal-ids.test.js +647 -0
- package/dist/vite/__tests__/expose-internal-ids.test.js.map +1 -0
- package/dist/vite/__tests__/expose-router-id.test.d.ts +2 -0
- package/dist/vite/__tests__/expose-router-id.test.d.ts.map +1 -0
- package/dist/vite/__tests__/expose-router-id.test.js +39 -0
- package/dist/vite/__tests__/expose-router-id.test.js.map +1 -0
- package/dist/vite/ast-handler-extract.d.ts +49 -0
- package/dist/vite/ast-handler-extract.d.ts.map +1 -0
- package/dist/vite/ast-handler-extract.js +249 -0
- package/dist/vite/ast-handler-extract.js.map +1 -0
- package/dist/vite/expose-action-id.d.ts +19 -0
- package/dist/vite/expose-action-id.d.ts.map +1 -0
- package/dist/vite/expose-action-id.js +250 -0
- package/dist/vite/expose-action-id.js.map +1 -0
- package/dist/vite/expose-id-utils.d.ts +69 -0
- package/dist/vite/expose-id-utils.d.ts.map +1 -0
- package/dist/vite/expose-id-utils.js +289 -0
- package/dist/vite/expose-id-utils.js.map +1 -0
- package/dist/vite/expose-internal-ids.d.ts +22 -0
- package/dist/vite/expose-internal-ids.d.ts.map +1 -0
- package/dist/vite/expose-internal-ids.js +886 -0
- package/dist/vite/expose-internal-ids.js.map +1 -0
- package/dist/vite/index.d.ts +149 -0
- package/dist/vite/index.d.ts.map +1 -0
- package/dist/vite/index.js +3423 -1718
- package/dist/vite/index.js.bak +5448 -0
- package/dist/vite/index.js.map +1 -0
- package/dist/vite/index.named-routes.gen.ts +103 -0
- package/dist/vite/package-resolution.d.ts +43 -0
- package/dist/vite/package-resolution.d.ts.map +1 -0
- package/dist/vite/package-resolution.js +112 -0
- 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/dist/vite/virtual-entries.js +110 -0
- package/dist/vite/virtual-entries.js.map +1 -0
- package/package.json +21 -18
- package/skills/breadcrumbs/SKILL.md +252 -0
- package/skills/cache-guide/SKILL.md +41 -5
- package/skills/caching/SKILL.md +49 -8
- package/skills/document-cache/SKILL.md +2 -2
- package/skills/handler-use/SKILL.md +362 -0
- package/skills/hooks/SKILL.md +94 -52
- package/skills/host-router/SKILL.md +218 -0
- package/skills/intercept/SKILL.md +99 -0
- package/skills/layout/SKILL.md +84 -2
- package/skills/links/SKILL.md +93 -17
- package/skills/loader/SKILL.md +367 -36
- package/skills/middleware/SKILL.md +145 -33
- package/skills/migrate-nextjs/SKILL.md +562 -0
- package/skills/migrate-react-router/SKILL.md +769 -0
- package/skills/parallel/SKILL.md +249 -2
- package/skills/prerender/SKILL.md +261 -49
- package/skills/rango/SKILL.md +26 -24
- package/skills/response-routes/SKILL.md +11 -3
- package/skills/route/SKILL.md +100 -5
- package/skills/router-setup/SKILL.md +172 -5
- package/skills/server-actions/SKILL.md +739 -0
- package/skills/streams-and-websockets/SKILL.md +283 -0
- package/skills/theme/SKILL.md +5 -4
- package/skills/typesafety/SKILL.md +95 -38
- package/skills/use-cache/SKILL.md +16 -2
- package/src/__internal.ts +93 -1
- package/src/bin/rango.ts +56 -19
- package/src/browser/action-coordinator.ts +97 -0
- package/src/browser/app-shell.ts +52 -0
- package/src/browser/app-version.ts +14 -0
- package/src/browser/event-controller.ts +78 -52
- package/src/browser/history-state.ts +80 -0
- package/src/browser/intercept-utils.ts +1 -1
- package/src/browser/link-interceptor.ts +23 -3
- package/src/browser/merge-segment-loaders.ts +9 -2
- package/src/browser/navigation-bridge.ts +234 -453
- package/src/browser/navigation-client.ts +191 -86
- package/src/browser/navigation-store.ts +71 -41
- package/src/browser/navigation-transaction.ts +297 -0
- package/src/browser/partial-update.ts +215 -167
- package/src/browser/prefetch/cache.ts +314 -0
- package/src/browser/prefetch/fetch.ts +282 -0
- package/src/browser/prefetch/observer.ts +65 -0
- package/src/browser/prefetch/policy.ts +48 -0
- package/src/browser/prefetch/queue.ts +191 -0
- package/src/browser/prefetch/resource-ready.ts +77 -0
- package/src/browser/rango-state.ts +152 -0
- package/src/browser/react/Link.tsx +241 -47
- package/src/browser/react/NavigationProvider.tsx +136 -16
- package/src/browser/react/context.ts +11 -0
- package/src/browser/react/filter-segment-order.ts +55 -0
- package/src/browser/react/index.ts +2 -6
- package/src/browser/react/location-state-shared.ts +29 -11
- package/src/browser/react/location-state.ts +6 -4
- 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 +23 -45
- package/src/browser/react/use-client-cache.ts +5 -3
- package/src/browser/react/use-handle.ts +28 -120
- package/src/browser/react/use-navigation.ts +29 -34
- package/src/browser/react/use-params.ts +16 -35
- package/src/browser/react/use-pathname.ts +2 -3
- package/src/browser/react/use-router.ts +31 -14
- package/src/browser/react/use-search-params.ts +2 -1
- package/src/browser/react/use-segments.ts +82 -118
- package/src/browser/response-adapter.ts +73 -0
- package/src/browser/rsc-router.tsx +202 -67
- package/src/browser/scroll-restoration.ts +47 -45
- package/src/browser/segment-reconciler.ts +36 -9
- package/src/browser/server-action-bridge.ts +464 -409
- package/src/browser/types.ts +100 -40
- package/src/browser/validate-redirect-origin.ts +29 -0
- package/src/build/generate-manifest.ts +44 -19
- package/src/build/generate-route-types.ts +7 -0
- package/src/build/index.ts +1 -0
- package/src/build/route-trie.ts +67 -25
- package/src/build/route-types/codegen.ts +13 -4
- package/src/build/route-types/include-resolution.ts +21 -1
- package/src/build/route-types/per-module-writer.ts +15 -3
- package/src/build/route-types/router-processing.ts +391 -90
- package/src/build/route-types/scan-filter.ts +8 -1
- package/src/build/runtime-discovery.ts +13 -1
- package/src/cache/background-task.ts +34 -0
- package/src/cache/cache-key-utils.ts +44 -0
- package/src/cache/cache-policy.ts +125 -0
- package/src/cache/cache-runtime.ts +140 -123
- package/src/cache/cache-scope.ts +124 -90
- package/src/cache/cf/cf-cache-store.ts +467 -22
- package/src/cache/cf/index.ts +5 -1
- package/src/cache/document-cache.ts +109 -75
- package/src/cache/handle-capture.ts +81 -0
- package/src/cache/index.ts +1 -15
- package/src/cache/memory-segment-store.ts +43 -69
- package/src/cache/profile-registry.ts +43 -8
- package/src/cache/read-through-swr.ts +134 -0
- package/src/cache/segment-codec.ts +140 -117
- package/src/cache/taint.ts +85 -3
- package/src/cache/types.ts +1 -115
- package/src/client.rsc.tsx +2 -1
- package/src/client.tsx +86 -254
- package/src/context-var.ts +72 -2
- package/src/debug.ts +2 -2
- package/src/errors.ts +6 -1
- package/src/handle.ts +41 -1
- package/src/handles/MetaTags.tsx +5 -2
- package/src/handles/breadcrumbs.ts +66 -0
- package/src/handles/index.ts +1 -0
- package/src/host/cookie-handler.ts +8 -3
- package/src/host/index.ts +0 -3
- package/src/host/router.ts +14 -1
- package/src/href-client.ts +3 -1
- package/src/index.rsc.ts +48 -32
- package/src/index.ts +104 -64
- package/src/loader.rsc.ts +12 -4
- package/src/loader.ts +8 -0
- package/src/outlet-context.ts +1 -1
- package/src/prerender/store.ts +61 -18
- package/src/prerender.ts +207 -88
- package/src/response-utils.ts +28 -0
- package/src/reverse.ts +36 -7
- package/src/root-error-boundary.tsx +30 -26
- package/src/route-definition/dsl-helpers.ts +249 -46
- package/src/route-definition/helpers-types.ts +73 -20
- package/src/route-definition/index.ts +3 -3
- package/src/route-definition/redirect.ts +24 -4
- package/src/route-definition/resolve-handler-use.ts +155 -0
- package/src/route-map-builder.ts +45 -3
- package/src/route-name.ts +53 -0
- package/src/route-types.ts +25 -0
- package/src/router/content-negotiation.ts +101 -2
- package/src/router/debug-manifest.ts +16 -3
- package/src/router/find-match.ts +4 -2
- package/src/router/handler-context.ts +221 -39
- package/src/router/intercept-resolution.ts +17 -8
- package/src/router/lazy-includes.ts +12 -5
- package/src/router/loader-resolution.ts +164 -31
- package/src/router/logging.ts +104 -4
- package/src/router/manifest.ts +53 -9
- package/src/router/match-api.ts +150 -206
- package/src/router/match-context.ts +3 -0
- package/src/router/match-handlers.ts +186 -11
- package/src/router/match-middleware/background-revalidation.ts +94 -86
- package/src/router/match-middleware/cache-lookup.ts +164 -19
- package/src/router/match-middleware/cache-store.ts +55 -10
- package/src/router/match-middleware/intercept-resolution.ts +9 -7
- package/src/router/match-middleware/segment-resolution.ts +61 -5
- package/src/router/match-pipelines.ts +8 -43
- package/src/router/match-result.ts +122 -18
- package/src/router/metrics.ts +238 -13
- package/src/router/middleware-types.ts +64 -61
- package/src/router/middleware.ts +316 -145
- package/src/router/navigation-snapshot.ts +182 -0
- package/src/router/pattern-matching.ts +134 -15
- package/src/router/prerender-match.ts +150 -16
- package/src/router/preview-match.ts +30 -96
- package/src/router/request-classification.ts +310 -0
- package/src/router/revalidation.ts +102 -9
- package/src/router/route-snapshot.ts +245 -0
- package/src/router/router-context.ts +20 -0
- package/src/router/router-interfaces.ts +200 -43
- package/src/router/router-options.ts +265 -12
- package/src/router/router-registry.ts +5 -2
- package/src/router/segment-resolution/fresh.ts +365 -256
- package/src/router/segment-resolution/helpers.ts +268 -0
- package/src/router/segment-resolution/loader-cache.ts +103 -98
- package/src/router/segment-resolution/revalidation.ts +711 -423
- package/src/router/segment-resolution/static-store.ts +2 -2
- package/src/router/segment-resolution.ts +1 -3
- package/src/router/segment-wrappers.ts +5 -0
- package/src/router/telemetry-otel.ts +299 -0
- package/src/router/telemetry.ts +300 -0
- package/src/router/timeout.ts +148 -0
- package/src/router/trie-matching.ts +30 -6
- package/src/router/types.ts +8 -1
- package/src/router/url-params.ts +49 -0
- package/src/router.ts +269 -25
- package/src/rsc/handler-context.ts +13 -2
- package/src/rsc/handler.ts +784 -629
- package/src/rsc/helpers.ts +168 -20
- package/src/rsc/index.ts +0 -20
- package/src/rsc/loader-fetch.ts +105 -43
- package/src/rsc/manifest-init.ts +7 -2
- package/src/rsc/origin-guard.ts +141 -0
- package/src/rsc/progressive-enhancement.ts +262 -20
- package/src/rsc/response-route-handler.ts +360 -0
- package/src/rsc/rsc-rendering.ts +70 -44
- package/src/rsc/runtime-warnings.ts +42 -0
- package/src/rsc/server-action.ts +178 -66
- package/src/rsc/ssr-setup.ts +128 -0
- package/src/rsc/types.ts +37 -3
- package/src/search-params.ts +38 -23
- package/src/segment-content-promise.ts +67 -0
- package/src/segment-loader-promise.ts +122 -0
- package/src/segment-system.tsx +109 -23
- package/src/server/context.ts +227 -24
- package/src/server/cookie-store.ts +190 -0
- package/src/server/fetchable-loader-store.ts +11 -6
- package/src/server/handle-store.ts +103 -12
- package/src/server/loader-registry.ts +20 -54
- package/src/server/request-context.ts +475 -105
- package/src/server.ts +6 -0
- package/src/ssr/index.tsx +74 -27
- package/src/static-handler.ts +25 -6
- package/src/theme/ThemeProvider.tsx +6 -1
- package/src/theme/index.ts +4 -18
- package/src/theme/theme-context.ts +1 -28
- package/src/theme/theme-script.ts +2 -1
- package/src/types/cache-types.ts +10 -5
- package/src/types/error-types.ts +3 -0
- package/src/types/global-namespace.ts +22 -0
- package/src/types/handler-context.ts +242 -82
- package/src/types/index.ts +1 -1
- package/src/types/loader-types.ts +50 -21
- package/src/types/request-scope.ts +126 -0
- package/src/types/route-config.ts +17 -26
- package/src/types/route-entry.ts +46 -0
- package/src/types/segments.ts +19 -5
- package/src/urls/include-helper.ts +72 -21
- package/src/urls/index.ts +1 -0
- package/src/urls/path-helper-types.ts +69 -18
- package/src/urls/path-helper.ts +65 -15
- package/src/urls/pattern-types.ts +33 -1
- package/src/urls/response-types.ts +47 -23
- package/src/urls/type-extraction.ts +23 -15
- package/src/use-loader.tsx +103 -13
- package/src/vite/debug.ts +184 -0
- package/src/vite/discovery/bundle-postprocess.ts +62 -85
- package/src/vite/discovery/discover-routers.ts +87 -29
- package/src/vite/discovery/gate-state.ts +171 -0
- package/src/vite/discovery/prerender-collection.ts +224 -106
- package/src/vite/discovery/route-types-writer.ts +7 -7
- package/src/vite/discovery/self-gen-tracking.ts +27 -1
- package/src/vite/discovery/state.ts +20 -13
- package/src/vite/discovery/virtual-module-codegen.ts +5 -2
- package/src/vite/index.ts +14 -51
- package/src/vite/plugin-types.ts +51 -79
- package/src/vite/plugins/cjs-to-esm.ts +5 -0
- package/src/vite/plugins/client-ref-dedup.ts +131 -0
- package/src/vite/plugins/client-ref-hashing.ts +19 -7
- package/src/vite/plugins/cloudflare-protocol-loader-hook.d.mts +23 -0
- package/src/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
- package/src/vite/plugins/cloudflare-protocol-stub.ts +214 -0
- package/src/vite/plugins/expose-action-id.ts +53 -31
- package/src/vite/plugins/expose-id-utils.ts +12 -0
- package/src/vite/plugins/expose-ids/handler-transform.ts +30 -0
- package/src/vite/plugins/expose-ids/router-transform.ts +20 -3
- package/src/vite/plugins/expose-internal-ids.ts +567 -319
- package/src/vite/plugins/performance-tracks.ts +96 -0
- package/src/vite/plugins/refresh-cmd.ts +127 -0
- package/src/vite/plugins/use-cache-transform.ts +139 -38
- package/src/vite/plugins/version-injector.ts +37 -11
- package/src/vite/plugins/version-plugin.ts +200 -18
- package/src/vite/rango.ts +233 -221
- package/src/vite/router-discovery.ts +887 -176
- package/src/vite/utils/banner.ts +4 -4
- package/src/vite/utils/package-resolution.ts +41 -1
- package/src/vite/utils/prerender-utils.ts +113 -0
- package/src/vite/utils/shared-utils.ts +22 -11
- package/skills/testing/SKILL.md +0 -226
- package/src/browser/lru-cache.ts +0 -61
- package/src/browser/react/prefetch.ts +0 -27
- package/src/browser/request-controller.ts +0 -164
- package/src/cache/memory-store.ts +0 -253
- package/src/route-definition/route-function.ts +0 -119
- package/src/router.gen.ts +0 -6
- package/src/static-handler.gen.ts +0 -5
- package/src/urls.gen.ts +0 -8
|
@@ -1,95 +1,33 @@
|
|
|
1
1
|
import type {
|
|
2
2
|
NavigationBridge,
|
|
3
3
|
NavigationBridgeConfig,
|
|
4
|
-
NavigateOptions,
|
|
5
4
|
NavigateOptionsInternal,
|
|
6
|
-
NavigationStore,
|
|
7
5
|
ResolvedSegment,
|
|
8
6
|
} from "./types.js";
|
|
7
|
+
import { setAppVersion } from "./app-version.js";
|
|
8
|
+
import { setRangoStateLocal } from "./rango-state.js";
|
|
9
|
+
import type { AppShell, AppShellRef } from "./app-shell.js";
|
|
9
10
|
import * as React from "react";
|
|
10
11
|
import { startTransition } from "react";
|
|
11
12
|
import {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
} from "./
|
|
13
|
+
createNavigationTransaction,
|
|
14
|
+
resolveNavigationState,
|
|
15
|
+
} from "./navigation-transaction.js";
|
|
16
|
+
import { buildHistoryState } from "./history-state.js";
|
|
17
|
+
import {
|
|
18
|
+
handleNavigationStart,
|
|
19
|
+
handleNavigationEnd,
|
|
20
|
+
ensureHistoryKey,
|
|
21
|
+
} from "./scroll-restoration.js";
|
|
15
22
|
|
|
16
23
|
// addTransitionType is only available in React experimental
|
|
17
24
|
const addTransitionType: ((type: string) => void) | undefined =
|
|
18
25
|
"addTransitionType" in React ? (React as any).addTransitionType : undefined;
|
|
19
26
|
|
|
20
|
-
/**
|
|
21
|
-
* Check if state is from typed LocationStateEntry[] (has __rsc_ls_ keys)
|
|
22
|
-
*/
|
|
23
|
-
function isTypedLocationState(
|
|
24
|
-
state: unknown,
|
|
25
|
-
): state is Record<string, unknown> {
|
|
26
|
-
if (state === null || typeof state !== "object") return false;
|
|
27
|
-
return Object.keys(state).some((key) => key.startsWith("__rsc_ls_"));
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
/**
|
|
31
|
-
* Resolve navigation state - handles both LocationStateEntry[] and legacy formats
|
|
32
|
-
*/
|
|
33
|
-
function resolveNavigationState(state: unknown): unknown {
|
|
34
|
-
// Check if it's an array of LocationStateEntry
|
|
35
|
-
if (
|
|
36
|
-
Array.isArray(state) &&
|
|
37
|
-
state.length > 0 &&
|
|
38
|
-
isLocationStateEntry(state[0])
|
|
39
|
-
) {
|
|
40
|
-
return resolveLocationStateEntries(state);
|
|
41
|
-
}
|
|
42
|
-
// Return as-is for legacy formats
|
|
43
|
-
return state;
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
/**
|
|
47
|
-
* Build history state object from user state
|
|
48
|
-
* - Typed state: spread directly into history.state
|
|
49
|
-
* - Legacy state: store in history.state.state
|
|
50
|
-
*/
|
|
51
|
-
function buildHistoryState(
|
|
52
|
-
userState: unknown,
|
|
53
|
-
routerState?: { intercept?: boolean; sourceUrl?: string },
|
|
54
|
-
serverState?: Record<string, unknown>,
|
|
55
|
-
): Record<string, unknown> | null {
|
|
56
|
-
const result: Record<string, unknown> = {};
|
|
57
|
-
|
|
58
|
-
// Add router internal state
|
|
59
|
-
if (routerState?.intercept) {
|
|
60
|
-
result.intercept = true;
|
|
61
|
-
if (routerState.sourceUrl) {
|
|
62
|
-
result.sourceUrl = routerState.sourceUrl;
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
// Add user state
|
|
67
|
-
if (userState !== undefined) {
|
|
68
|
-
if (isTypedLocationState(userState)) {
|
|
69
|
-
// Typed state: spread directly
|
|
70
|
-
Object.assign(result, userState);
|
|
71
|
-
} else {
|
|
72
|
-
// Legacy state: store in .state
|
|
73
|
-
result.state = userState;
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
// Merge server-set location state (from ctx.setLocationState on non-redirect responses)
|
|
78
|
-
if (serverState) {
|
|
79
|
-
Object.assign(result, serverState);
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
return Object.keys(result).length > 0 ? result : null;
|
|
83
|
-
}
|
|
84
27
|
import { setupLinkInterception } from "./link-interceptor.js";
|
|
85
28
|
import { createPartialUpdater } from "./partial-update.js";
|
|
86
29
|
import { generateHistoryKey } from "./navigation-store.js";
|
|
87
|
-
import {
|
|
88
|
-
handleNavigationStart,
|
|
89
|
-
handleNavigationEnd,
|
|
90
|
-
ensureHistoryKey,
|
|
91
|
-
} from "./scroll-restoration.js";
|
|
92
|
-
import type { EventController, NavigationHandle } from "./event-controller.js";
|
|
30
|
+
import type { EventController } from "./event-controller.js";
|
|
93
31
|
import { isInterceptOnlyCache } from "./intercept-utils.js";
|
|
94
32
|
import {
|
|
95
33
|
toNetworkError,
|
|
@@ -98,359 +36,13 @@ import {
|
|
|
98
36
|
} from "./network-error-handler.js";
|
|
99
37
|
import { debugLog } from "./logging.js";
|
|
100
38
|
import { ServerRedirect } from "../errors.js";
|
|
39
|
+
import { validateRedirectOrigin } from "./validate-redirect-origin.js";
|
|
101
40
|
|
|
102
41
|
// Polyfill Symbol.dispose for Safari and older browsers
|
|
103
42
|
if (typeof Symbol.dispose === "undefined") {
|
|
104
43
|
(Symbol as any).dispose = Symbol("Symbol.dispose");
|
|
105
44
|
}
|
|
106
45
|
|
|
107
|
-
/**
|
|
108
|
-
* Options for committing a navigation transaction
|
|
109
|
-
*/
|
|
110
|
-
interface CommitOptions {
|
|
111
|
-
url: string;
|
|
112
|
-
segmentIds: string[];
|
|
113
|
-
segments: ResolvedSegment[];
|
|
114
|
-
replace?: boolean;
|
|
115
|
-
scroll?: boolean;
|
|
116
|
-
/** User-provided state to store in history.state */
|
|
117
|
-
state?: unknown;
|
|
118
|
-
/** If true, only update store without changing URL/history (for server actions) */
|
|
119
|
-
storeOnly?: boolean;
|
|
120
|
-
/** If true, this is an intercept route - store in history.state for popstate handling */
|
|
121
|
-
intercept?: boolean;
|
|
122
|
-
/** Source URL where the intercept was triggered from (stored in history.state) */
|
|
123
|
-
interceptSourceUrl?: string;
|
|
124
|
-
/** If true, only update cache without touching store or history (for background stale revalidation) */
|
|
125
|
-
cacheOnly?: boolean;
|
|
126
|
-
/** Server-set location state to merge into history.pushState */
|
|
127
|
-
serverState?: Record<string, unknown>;
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
/**
|
|
131
|
-
* Options that can override the pre-configured commit settings
|
|
132
|
-
*/
|
|
133
|
-
interface BoundCommitOverrides {
|
|
134
|
-
/** Override scroll behavior (e.g., disable for intercepts) */
|
|
135
|
-
scroll?: boolean;
|
|
136
|
-
/** Override replace behavior (e.g., force replace for intercepts) */
|
|
137
|
-
replace?: boolean;
|
|
138
|
-
/** Override user-provided state */
|
|
139
|
-
state?: unknown;
|
|
140
|
-
/** Mark this as an intercept route */
|
|
141
|
-
intercept?: boolean;
|
|
142
|
-
/** Source URL where intercept was triggered from */
|
|
143
|
-
interceptSourceUrl?: string;
|
|
144
|
-
/** If true, only update cache (for stale revalidation) */
|
|
145
|
-
cacheOnly?: boolean;
|
|
146
|
-
/** Server-set location state to merge into history.pushState */
|
|
147
|
-
serverState?: Record<string, unknown>;
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
/**
|
|
151
|
-
* Token for tracking an active stream - call end() when stream completes
|
|
152
|
-
*/
|
|
153
|
-
export interface StreamingToken {
|
|
154
|
-
end(): void;
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
/**
|
|
158
|
-
* Bound transaction with pre-configured commit options (without segmentIds/segments)
|
|
159
|
-
*/
|
|
160
|
-
export interface BoundTransaction {
|
|
161
|
-
readonly currentUrl: string;
|
|
162
|
-
/** Start streaming and get a token to end it when the stream completes */
|
|
163
|
-
startStreaming(): StreamingToken;
|
|
164
|
-
commit(
|
|
165
|
-
segmentIds: string[],
|
|
166
|
-
segments: ResolvedSegment[],
|
|
167
|
-
overrides?: BoundCommitOverrides,
|
|
168
|
-
): void;
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
/**
|
|
172
|
-
* Navigation transaction for managing state during navigation
|
|
173
|
-
* Uses the event controller handle for lifecycle management
|
|
174
|
-
*/
|
|
175
|
-
interface NavigationTransaction extends Disposable {
|
|
176
|
-
/** Optimistically commit from cache - instant render before revalidation */
|
|
177
|
-
optimisticCommit(options: CommitOptions): void;
|
|
178
|
-
/** Final commit with server data (or reconciliation after optimistic) */
|
|
179
|
-
commit(options: CommitOptions): void;
|
|
180
|
-
with(
|
|
181
|
-
options: Omit<CommitOptions, "segmentIds" | "segments">,
|
|
182
|
-
): BoundTransaction;
|
|
183
|
-
/** The navigation handle from the event controller */
|
|
184
|
-
handle: NavigationHandle;
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
/**
|
|
188
|
-
* Creates a navigation transaction that coordinates with the event controller.
|
|
189
|
-
* Handles loading state transitions and cleanup on completion/abort.
|
|
190
|
-
*
|
|
191
|
-
* Supports optimistic navigation: render from cache immediately,
|
|
192
|
-
* then revalidate in background and reconcile if data changed.
|
|
193
|
-
*/
|
|
194
|
-
function createNavigationTransaction(
|
|
195
|
-
store: NavigationStore,
|
|
196
|
-
eventController: EventController,
|
|
197
|
-
url: string,
|
|
198
|
-
options?: NavigateOptions & { skipLoadingState?: boolean },
|
|
199
|
-
): NavigationTransaction {
|
|
200
|
-
let committed = false;
|
|
201
|
-
let optimisticallyCommitted = false;
|
|
202
|
-
let earlyStatePushed = false;
|
|
203
|
-
const currentUrl = window.location.href;
|
|
204
|
-
|
|
205
|
-
// Start navigation in event controller (this sets loading state)
|
|
206
|
-
const handle = eventController.startNavigation(url, options);
|
|
207
|
-
|
|
208
|
-
// If state is provided, push it to history immediately so loading UI can access it
|
|
209
|
-
// This enables "optimistic state" - showing product names in skeletons etc.
|
|
210
|
-
if (options?.state !== undefined && !options?.replace) {
|
|
211
|
-
const earlyHistoryState = buildHistoryState(options.state);
|
|
212
|
-
window.history.pushState(earlyHistoryState, "", url);
|
|
213
|
-
earlyStatePushed = true;
|
|
214
|
-
}
|
|
215
|
-
|
|
216
|
-
/**
|
|
217
|
-
* Optimistically commit from cache - renders immediately before revalidation
|
|
218
|
-
* Sets optimisticallyCommitted flag so final commit() knows to reconcile
|
|
219
|
-
*/
|
|
220
|
-
function optimisticCommit(opts: CommitOptions): void {
|
|
221
|
-
optimisticallyCommitted = true;
|
|
222
|
-
|
|
223
|
-
const { url, segmentIds, segments, replace, scroll } = opts;
|
|
224
|
-
const parsedUrl = new URL(url, window.location.origin);
|
|
225
|
-
|
|
226
|
-
// Save current scroll position before navigating
|
|
227
|
-
handleNavigationStart();
|
|
228
|
-
|
|
229
|
-
// Update segment state
|
|
230
|
-
store.setSegmentIds(segmentIds);
|
|
231
|
-
store.setCurrentUrl(url);
|
|
232
|
-
store.setPath(parsedUrl.pathname);
|
|
233
|
-
|
|
234
|
-
// Generate history key from URL
|
|
235
|
-
const historyKey = generateHistoryKey(url);
|
|
236
|
-
store.setHistoryKey(historyKey);
|
|
237
|
-
|
|
238
|
-
// Cache segments with current handleData (will be overwritten by fresh data on final commit)
|
|
239
|
-
const currentHandleData = eventController.getHandleState().data;
|
|
240
|
-
store.cacheSegmentsForHistory(historyKey, segments, currentHandleData);
|
|
241
|
-
|
|
242
|
-
// Build history state with user state if provided
|
|
243
|
-
const historyState = buildHistoryState(opts.state);
|
|
244
|
-
|
|
245
|
-
// Update browser URL
|
|
246
|
-
// Use replaceState if we already pushed early (for optimistic state access)
|
|
247
|
-
if (replace || earlyStatePushed) {
|
|
248
|
-
window.history.replaceState(historyState, "", url);
|
|
249
|
-
} else {
|
|
250
|
-
window.history.pushState(historyState, "", url);
|
|
251
|
-
}
|
|
252
|
-
|
|
253
|
-
// Ensure new history entry has a scroll restoration key
|
|
254
|
-
ensureHistoryKey();
|
|
255
|
-
|
|
256
|
-
// Complete the navigation in event controller (sets idle state)
|
|
257
|
-
handle.complete(parsedUrl);
|
|
258
|
-
|
|
259
|
-
// Handle scroll after navigation
|
|
260
|
-
handleNavigationEnd({ scroll });
|
|
261
|
-
|
|
262
|
-
debugLog("[Browser] Optimistic commit from cache, historyKey:", historyKey);
|
|
263
|
-
}
|
|
264
|
-
|
|
265
|
-
/**
|
|
266
|
-
* Commit the navigation - updates store and URL atomically
|
|
267
|
-
* If optimisticCommit was called, this becomes a reconciliation
|
|
268
|
-
*/
|
|
269
|
-
function commit(opts: CommitOptions): void {
|
|
270
|
-
committed = true;
|
|
271
|
-
|
|
272
|
-
// If optimistic commit already done, adjust options for reconciliation
|
|
273
|
-
const isReconciliation = optimisticallyCommitted;
|
|
274
|
-
const {
|
|
275
|
-
url,
|
|
276
|
-
segmentIds,
|
|
277
|
-
segments,
|
|
278
|
-
storeOnly,
|
|
279
|
-
intercept,
|
|
280
|
-
interceptSourceUrl,
|
|
281
|
-
cacheOnly,
|
|
282
|
-
serverState,
|
|
283
|
-
} = opts;
|
|
284
|
-
// For reconciliation: always replace (URL already pushed), no scroll
|
|
285
|
-
const replace = isReconciliation ? true : opts.replace;
|
|
286
|
-
const scroll = isReconciliation ? false : opts.scroll;
|
|
287
|
-
|
|
288
|
-
const parsedUrl = new URL(url, window.location.origin);
|
|
289
|
-
|
|
290
|
-
// Generate history key from URL (with intercept suffix for separate caching)
|
|
291
|
-
const historyKey = generateHistoryKey(url, { intercept });
|
|
292
|
-
|
|
293
|
-
// For cache-only commits (stale revalidation), only update cache and return
|
|
294
|
-
// Don't touch store state or history - user may have navigated elsewhere
|
|
295
|
-
if (cacheOnly) {
|
|
296
|
-
const currentHandleData = eventController.getHandleState().data;
|
|
297
|
-
store.cacheSegmentsForHistory(historyKey, segments, currentHandleData);
|
|
298
|
-
debugLog("[Browser] Cache-only commit, historyKey:", historyKey);
|
|
299
|
-
return;
|
|
300
|
-
}
|
|
301
|
-
|
|
302
|
-
// Save current scroll position before navigating (only for non-reconciliation)
|
|
303
|
-
if (!isReconciliation) {
|
|
304
|
-
handleNavigationStart();
|
|
305
|
-
}
|
|
306
|
-
|
|
307
|
-
// Update segment state atomically
|
|
308
|
-
store.setSegmentIds(segmentIds);
|
|
309
|
-
store.setCurrentUrl(url);
|
|
310
|
-
store.setPath(parsedUrl.pathname);
|
|
311
|
-
|
|
312
|
-
store.setHistoryKey(historyKey);
|
|
313
|
-
|
|
314
|
-
// Cache segments with current handleData for this history entry (fresh data overwrites optimistic)
|
|
315
|
-
const currentHandleData = eventController.getHandleState().data;
|
|
316
|
-
store.cacheSegmentsForHistory(historyKey, segments, currentHandleData);
|
|
317
|
-
|
|
318
|
-
// For server actions, skip URL/history updates but still complete navigation
|
|
319
|
-
if (storeOnly) {
|
|
320
|
-
debugLog("[Browser] Store updated (action)");
|
|
321
|
-
// Complete navigation to clear loading state
|
|
322
|
-
handle.complete(parsedUrl);
|
|
323
|
-
return;
|
|
324
|
-
}
|
|
325
|
-
|
|
326
|
-
// Build history state - include user state, intercept info, and server-set state
|
|
327
|
-
const historyState = buildHistoryState(
|
|
328
|
-
opts.state,
|
|
329
|
-
{ intercept, sourceUrl: interceptSourceUrl },
|
|
330
|
-
serverState,
|
|
331
|
-
);
|
|
332
|
-
|
|
333
|
-
// Update browser URL (skip if reconciliation - already done in optimisticCommit)
|
|
334
|
-
if (!isReconciliation) {
|
|
335
|
-
// Use replaceState if we already pushed early (for optimistic state access) or replace requested
|
|
336
|
-
if (replace || earlyStatePushed) {
|
|
337
|
-
window.history.replaceState(historyState, "", url);
|
|
338
|
-
} else {
|
|
339
|
-
window.history.pushState(historyState, "", url);
|
|
340
|
-
}
|
|
341
|
-
// Ensure new history entry has a scroll restoration key
|
|
342
|
-
ensureHistoryKey();
|
|
343
|
-
|
|
344
|
-
// Notify location state hooks when history state includes typed entries.
|
|
345
|
-
// Needed for same-page redirects where components don't remount and
|
|
346
|
-
// useState initializers don't re-run, even though history.state was updated.
|
|
347
|
-
if (
|
|
348
|
-
historyState &&
|
|
349
|
-
Object.keys(historyState).some((k) => k.startsWith("__rsc_ls_"))
|
|
350
|
-
) {
|
|
351
|
-
window.dispatchEvent(new Event("__rsc_locationstate"));
|
|
352
|
-
}
|
|
353
|
-
}
|
|
354
|
-
|
|
355
|
-
// Complete the navigation in event controller (sets idle state, updates location)
|
|
356
|
-
handle.complete(parsedUrl);
|
|
357
|
-
|
|
358
|
-
// Handle scroll after navigation (skip if reconciliation)
|
|
359
|
-
if (!isReconciliation) {
|
|
360
|
-
handleNavigationEnd({ scroll });
|
|
361
|
-
}
|
|
362
|
-
|
|
363
|
-
if (isReconciliation) {
|
|
364
|
-
debugLog("[Browser] Reconciliation commit, historyKey:", historyKey);
|
|
365
|
-
} else {
|
|
366
|
-
debugLog(
|
|
367
|
-
"[Browser] Navigation committed, historyKey:",
|
|
368
|
-
historyKey,
|
|
369
|
-
intercept ? "(intercept)" : "",
|
|
370
|
-
);
|
|
371
|
-
}
|
|
372
|
-
}
|
|
373
|
-
|
|
374
|
-
return {
|
|
375
|
-
handle,
|
|
376
|
-
optimisticCommit,
|
|
377
|
-
commit,
|
|
378
|
-
|
|
379
|
-
/**
|
|
380
|
-
* Create a bound transaction with pre-configured URL options
|
|
381
|
-
* segmentIds and segments provided at commit time (after they're resolved)
|
|
382
|
-
*/
|
|
383
|
-
with(
|
|
384
|
-
opts: Omit<CommitOptions, "segmentIds" | "segments">,
|
|
385
|
-
): BoundTransaction {
|
|
386
|
-
return {
|
|
387
|
-
get currentUrl() {
|
|
388
|
-
return currentUrl;
|
|
389
|
-
},
|
|
390
|
-
startStreaming() {
|
|
391
|
-
return handle.startStreaming();
|
|
392
|
-
},
|
|
393
|
-
commit: (
|
|
394
|
-
segmentIds: string[],
|
|
395
|
-
segments: ResolvedSegment[],
|
|
396
|
-
overrides?: BoundCommitOverrides,
|
|
397
|
-
) => {
|
|
398
|
-
// Allow overrides to disable scroll (e.g., for intercepts)
|
|
399
|
-
const finalScroll =
|
|
400
|
-
overrides?.scroll !== undefined ? overrides.scroll : opts.scroll;
|
|
401
|
-
// Allow overrides to force replace (e.g., for intercepts)
|
|
402
|
-
const finalReplace =
|
|
403
|
-
overrides?.replace !== undefined ? overrides.replace : opts.replace;
|
|
404
|
-
// Intercept info: overrides take precedence, fallback to opts
|
|
405
|
-
const intercept =
|
|
406
|
-
overrides?.intercept !== undefined
|
|
407
|
-
? overrides.intercept
|
|
408
|
-
: opts.intercept;
|
|
409
|
-
const interceptSourceUrl =
|
|
410
|
-
overrides?.interceptSourceUrl !== undefined
|
|
411
|
-
? overrides.interceptSourceUrl
|
|
412
|
-
: opts.interceptSourceUrl;
|
|
413
|
-
// Cache-only mode: overrides take precedence, fallback to opts
|
|
414
|
-
const cacheOnly =
|
|
415
|
-
overrides?.cacheOnly !== undefined
|
|
416
|
-
? overrides.cacheOnly
|
|
417
|
-
: opts.cacheOnly;
|
|
418
|
-
// User state: overrides take precedence, fallback to opts
|
|
419
|
-
const state =
|
|
420
|
-
overrides?.state !== undefined ? overrides.state : opts.state;
|
|
421
|
-
// Server-set location state: only from overrides (set by partial-update)
|
|
422
|
-
const serverState = overrides?.serverState;
|
|
423
|
-
commit({
|
|
424
|
-
...opts,
|
|
425
|
-
segmentIds,
|
|
426
|
-
segments,
|
|
427
|
-
scroll: finalScroll,
|
|
428
|
-
replace: finalReplace,
|
|
429
|
-
state,
|
|
430
|
-
intercept,
|
|
431
|
-
interceptSourceUrl,
|
|
432
|
-
cacheOnly,
|
|
433
|
-
serverState,
|
|
434
|
-
});
|
|
435
|
-
},
|
|
436
|
-
};
|
|
437
|
-
},
|
|
438
|
-
|
|
439
|
-
[Symbol.dispose]() {
|
|
440
|
-
// If aborted, another navigation took over - don't touch state
|
|
441
|
-
if (handle.signal.aborted) return;
|
|
442
|
-
|
|
443
|
-
// If not committed (and not optimistically committed), the handle's dispose
|
|
444
|
-
// will reset state to idle via the event controller
|
|
445
|
-
if (!committed && !optimisticallyCommitted) {
|
|
446
|
-
handle[Symbol.dispose]();
|
|
447
|
-
// The NavigationHandle's [Symbol.dispose] handles this
|
|
448
|
-
}
|
|
449
|
-
},
|
|
450
|
-
};
|
|
451
|
-
}
|
|
452
|
-
|
|
453
|
-
// Export for use by server-action-bridge
|
|
454
46
|
export { createNavigationTransaction };
|
|
455
47
|
|
|
456
48
|
/**
|
|
@@ -458,8 +50,13 @@ export { createNavigationTransaction };
|
|
|
458
50
|
*/
|
|
459
51
|
export interface NavigationBridgeConfigWithController extends NavigationBridgeConfig {
|
|
460
52
|
eventController: EventController;
|
|
461
|
-
/** RSC version from initial payload metadata */
|
|
53
|
+
/** RSC version from initial payload metadata (fallback when appShellRef is not provided) */
|
|
462
54
|
version?: string;
|
|
55
|
+
/**
|
|
56
|
+
* Live app-shell ref. When supplied, the bridge reads version/basename
|
|
57
|
+
* from this ref so cross-app navigations propagate correctly.
|
|
58
|
+
*/
|
|
59
|
+
appShellRef?: AppShellRef;
|
|
463
60
|
}
|
|
464
61
|
|
|
465
62
|
/**
|
|
@@ -478,8 +75,45 @@ export interface NavigationBridgeConfigWithController extends NavigationBridgeCo
|
|
|
478
75
|
export function createNavigationBridge(
|
|
479
76
|
config: NavigationBridgeConfigWithController,
|
|
480
77
|
): NavigationBridge {
|
|
481
|
-
const {
|
|
482
|
-
|
|
78
|
+
const {
|
|
79
|
+
store,
|
|
80
|
+
client,
|
|
81
|
+
eventController,
|
|
82
|
+
onUpdate,
|
|
83
|
+
renderSegments,
|
|
84
|
+
appShellRef,
|
|
85
|
+
} = config;
|
|
86
|
+
let version = config.version;
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Replace the active app-shell snapshot atomically. Called by the partial
|
|
90
|
+
* updater when a response's routerId indicates the navigation crossed
|
|
91
|
+
* into a different app. Runs the local-only side-effects tied to
|
|
92
|
+
* app-shell fields (app version, rango-state namespace) so the new app
|
|
93
|
+
* owns them after the swap. Theme, warmup, and prefetch TTL are
|
|
94
|
+
* document-lifetime and are NOT touched here.
|
|
95
|
+
*/
|
|
96
|
+
function applyAppShell(next: AppShell): void {
|
|
97
|
+
if (appShellRef) {
|
|
98
|
+
appShellRef.update(next);
|
|
99
|
+
}
|
|
100
|
+
if (next.version !== undefined) {
|
|
101
|
+
version = next.version;
|
|
102
|
+
setAppVersion(next.version);
|
|
103
|
+
// Use the local-only setter — initRangoState writes the shared
|
|
104
|
+
// localStorage key and fires a storage event in other tabs still in
|
|
105
|
+
// the old app. setRangoStateLocal only mutates this tab's in-memory
|
|
106
|
+
// cache and rebinds it to the target app's routerId-scoped key,
|
|
107
|
+
// preserving the "local-only, no broadcast/rotation" contract for
|
|
108
|
+
// smooth app-switch transitions.
|
|
109
|
+
setRangoStateLocal(next.version, next.routerId);
|
|
110
|
+
}
|
|
111
|
+
// Cross-app: prior cache entries belong to a different app's segments.
|
|
112
|
+
// Drop them locally only — do NOT broadcast invalidation or rotate the
|
|
113
|
+
// shared X-Rango-State token, since other tabs still in the old app are
|
|
114
|
+
// unaffected by this tab's transition.
|
|
115
|
+
store.clearHistoryCacheLocal();
|
|
116
|
+
}
|
|
483
117
|
|
|
484
118
|
// Create shared partial updater
|
|
485
119
|
const fetchPartialUpdate = createPartialUpdater({
|
|
@@ -487,13 +121,14 @@ export function createNavigationBridge(
|
|
|
487
121
|
client,
|
|
488
122
|
onUpdate,
|
|
489
123
|
renderSegments,
|
|
490
|
-
version,
|
|
124
|
+
getVersion: () => version,
|
|
125
|
+
applyAppShell,
|
|
491
126
|
});
|
|
492
127
|
|
|
493
128
|
return {
|
|
494
129
|
/**
|
|
495
130
|
* Navigate to a URL
|
|
496
|
-
* Uses
|
|
131
|
+
* Uses cached segments for SWR revalidation when available
|
|
497
132
|
*/
|
|
498
133
|
async navigate(
|
|
499
134
|
url: string,
|
|
@@ -505,10 +140,109 @@ export function createNavigationBridge(
|
|
|
505
140
|
? resolveNavigationState(options.state)
|
|
506
141
|
: undefined;
|
|
507
142
|
|
|
143
|
+
// Cross-origin URLs are not handled by SPA navigation.
|
|
144
|
+
// Fall back to a full browser navigation for http/https only.
|
|
145
|
+
let targetUrl: URL;
|
|
146
|
+
try {
|
|
147
|
+
targetUrl = new URL(url, window.location.origin);
|
|
148
|
+
} catch {
|
|
149
|
+
console.warn(`[rango] navigate() ignored: malformed URL "${url}"`);
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
if (targetUrl.origin !== window.location.origin) {
|
|
153
|
+
if (targetUrl.protocol !== "http:" && targetUrl.protocol !== "https:") {
|
|
154
|
+
console.error(
|
|
155
|
+
`[rango] navigate() blocked: unsupported scheme "${targetUrl.protocol}"`,
|
|
156
|
+
);
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
window.location.href = targetUrl.href;
|
|
160
|
+
return;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
// Shallow navigation: skip RSC fetch when revalidate is false
|
|
164
|
+
// and the pathname hasn't changed (search param / hash only change).
|
|
165
|
+
if (
|
|
166
|
+
options?.revalidate === false &&
|
|
167
|
+
targetUrl.pathname === new URL(window.location.href).pathname
|
|
168
|
+
) {
|
|
169
|
+
// Preserve intercept context from the current history entry so that
|
|
170
|
+
// popstate uses the correct cache key (:intercept suffix) and restores
|
|
171
|
+
// the right full-page vs modal semantics.
|
|
172
|
+
const currentHistoryState = window.history.state;
|
|
173
|
+
const isIntercept = currentHistoryState?.intercept === true;
|
|
174
|
+
const interceptSourceUrl = isIntercept
|
|
175
|
+
? currentHistoryState?.sourceUrl
|
|
176
|
+
: undefined;
|
|
177
|
+
|
|
178
|
+
const historyKey = generateHistoryKey(url, { intercept: isIntercept });
|
|
179
|
+
|
|
180
|
+
// Copy current segments to the new history key so back/forward restores instantly
|
|
181
|
+
const currentKey = store.getHistoryKey();
|
|
182
|
+
const currentCache = store.getCachedSegments(currentKey);
|
|
183
|
+
if (currentCache?.segments) {
|
|
184
|
+
const currentHandleData = eventController.getHandleState().data;
|
|
185
|
+
store.cacheSegmentsForHistory(
|
|
186
|
+
historyKey,
|
|
187
|
+
currentCache.segments,
|
|
188
|
+
currentHandleData,
|
|
189
|
+
);
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
// Save current scroll position before changing URL
|
|
193
|
+
handleNavigationStart();
|
|
194
|
+
|
|
195
|
+
// Snapshot old state before pushState/replaceState overwrites it
|
|
196
|
+
const oldState = window.history.state;
|
|
197
|
+
|
|
198
|
+
// Update browser URL (carry intercept context into history state)
|
|
199
|
+
const historyState = buildHistoryState(
|
|
200
|
+
resolvedState,
|
|
201
|
+
{
|
|
202
|
+
intercept: isIntercept || undefined,
|
|
203
|
+
sourceUrl: interceptSourceUrl,
|
|
204
|
+
},
|
|
205
|
+
{},
|
|
206
|
+
);
|
|
207
|
+
if (options.replace) {
|
|
208
|
+
window.history.replaceState(historyState, "", url);
|
|
209
|
+
} else {
|
|
210
|
+
window.history.pushState(historyState, "", url);
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
// Ensure new history entry has a scroll restoration key
|
|
214
|
+
ensureHistoryKey();
|
|
215
|
+
|
|
216
|
+
// Notify useLocationState() hooks when state changes
|
|
217
|
+
const hasOldState =
|
|
218
|
+
oldState &&
|
|
219
|
+
typeof oldState === "object" &&
|
|
220
|
+
("state" in oldState ||
|
|
221
|
+
Object.keys(oldState).some((k) => k.startsWith("__rsc_ls_")));
|
|
222
|
+
const hasNewState =
|
|
223
|
+
historyState &&
|
|
224
|
+
("state" in historyState ||
|
|
225
|
+
Object.keys(historyState).some((k) => k.startsWith("__rsc_ls_")));
|
|
226
|
+
if (hasOldState || hasNewState) {
|
|
227
|
+
window.dispatchEvent(new Event("__rsc_locationstate"));
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
// Update store history key so future navigations reference the right cache
|
|
231
|
+
store.setHistoryKey(historyKey);
|
|
232
|
+
store.setCurrentUrl(url);
|
|
233
|
+
|
|
234
|
+
// Notify hooks — location updates, state stays idle
|
|
235
|
+
eventController.setLocation(targetUrl);
|
|
236
|
+
|
|
237
|
+
// Handle post-navigation scroll
|
|
238
|
+
handleNavigationEnd({ scroll: options.scroll });
|
|
239
|
+
return;
|
|
240
|
+
}
|
|
241
|
+
|
|
508
242
|
// Only abort pending requests when navigating to a different route
|
|
509
243
|
// Same-route navigation (e.g., /todos -> /todos) should not cancel in-flight actions
|
|
510
244
|
const currentPath = new URL(window.location.href).pathname;
|
|
511
|
-
const targetPath =
|
|
245
|
+
const targetPath = targetUrl.pathname;
|
|
512
246
|
if (currentPath !== targetPath) {
|
|
513
247
|
eventController.abortNavigation();
|
|
514
248
|
}
|
|
@@ -567,23 +301,29 @@ export function createNavigationBridge(
|
|
|
567
301
|
const interceptHistoryKey = generateHistoryKey(url, { intercept: true });
|
|
568
302
|
const hasInterceptCache = store.hasHistoryCache(interceptHistoryKey);
|
|
569
303
|
|
|
570
|
-
// Skip
|
|
304
|
+
// Skip cached SWR for:
|
|
571
305
|
// 1. intercept caches - interception depends on source page context
|
|
572
306
|
// 2. routes that CAN be intercepted - we don't know if this navigation will intercept
|
|
573
307
|
// 3. when leaving intercept - we need fresh non-intercept segments from server
|
|
574
308
|
// 4. redirect-with-state - force re-render so hooks read fresh state
|
|
309
|
+
// 5. stale cache - server action invalidated it, need fresh data with loading state
|
|
575
310
|
const hasUsableCache =
|
|
576
311
|
cachedSegments &&
|
|
577
312
|
cachedSegments.length > 0 &&
|
|
578
313
|
!isInterceptOnlyCache(cachedSegments) &&
|
|
579
314
|
!hasInterceptCache &&
|
|
580
315
|
!isLeavingIntercept &&
|
|
316
|
+
!cached?.stale &&
|
|
581
317
|
!options?._skipCache;
|
|
582
318
|
|
|
583
|
-
|
|
319
|
+
// Forward navigations always await fetchPartialUpdate before rendering,
|
|
320
|
+
// so useNavigation should always report "loading". skipLoadingState is
|
|
321
|
+
// only used for popstate background revalidation (line ~526) where
|
|
322
|
+
// cached content renders instantly without a network wait.
|
|
323
|
+
const tx = createNavigationTransaction(store, eventController, url, {
|
|
584
324
|
...options,
|
|
585
325
|
state: resolvedState,
|
|
586
|
-
skipLoadingState:
|
|
326
|
+
skipLoadingState: false,
|
|
587
327
|
});
|
|
588
328
|
|
|
589
329
|
// REVALIDATE: Fetch fresh data from server
|
|
@@ -591,9 +331,7 @@ export function createNavigationBridge(
|
|
|
591
331
|
await fetchPartialUpdate(
|
|
592
332
|
url,
|
|
593
333
|
hasUsableCache
|
|
594
|
-
? cachedSegments
|
|
595
|
-
.filter((s) => s.type !== "loader")
|
|
596
|
-
.map((s) => s.id)
|
|
334
|
+
? cachedSegments!.map((s) => s.id)
|
|
597
335
|
: options?._skipCache
|
|
598
336
|
? [] // Action redirect: send no segments so server renders everything fresh
|
|
599
337
|
: undefined,
|
|
@@ -605,27 +343,29 @@ export function createNavigationBridge(
|
|
|
605
343
|
scroll: options?.scroll,
|
|
606
344
|
state: resolvedState,
|
|
607
345
|
}),
|
|
608
|
-
// Pass cached segments (merged with current page's fresh segments for shared IDs)
|
|
609
|
-
// so the segment map is consistent with what we tell the server we have.
|
|
610
|
-
// Server decides what needs revalidation based on route matching and custom functions.
|
|
611
|
-
// No need for staleRevalidation flag - we're sending the freshest segments we have.
|
|
612
|
-
// Also pass cached handle data for restoring breadcrumbs when server returns empty diff.
|
|
613
|
-
// When leaving intercept, pass the flag so fetchPartialUpdate knows to filter segments.
|
|
614
346
|
hasUsableCache
|
|
615
347
|
? {
|
|
348
|
+
type: "navigate" as const,
|
|
616
349
|
targetCacheSegments: cachedSegments,
|
|
617
350
|
targetCacheHandleData: cachedHandleData,
|
|
618
351
|
}
|
|
619
352
|
: isLeavingIntercept
|
|
620
|
-
? {
|
|
353
|
+
? { type: "leave-intercept" as const }
|
|
621
354
|
: undefined,
|
|
622
355
|
);
|
|
623
356
|
} catch (error) {
|
|
624
357
|
// Server-side redirect with location state: the current transaction's
|
|
625
|
-
//
|
|
358
|
+
// cleanup resets loading state. Re-navigate to the redirect
|
|
626
359
|
// target carrying the server-set state into history.pushState.
|
|
627
360
|
if (error instanceof ServerRedirect) {
|
|
628
|
-
|
|
361
|
+
const redirectUrl = validateRedirectOrigin(
|
|
362
|
+
error.url,
|
|
363
|
+
window.location.origin,
|
|
364
|
+
);
|
|
365
|
+
if (!redirectUrl) {
|
|
366
|
+
return;
|
|
367
|
+
}
|
|
368
|
+
return this.navigate(redirectUrl, {
|
|
629
369
|
state: error.state,
|
|
630
370
|
replace: options?.replace,
|
|
631
371
|
_skipCache: true,
|
|
@@ -651,6 +391,8 @@ export function createNavigationBridge(
|
|
|
651
391
|
}
|
|
652
392
|
|
|
653
393
|
throw error;
|
|
394
|
+
} finally {
|
|
395
|
+
tx[Symbol.dispose]();
|
|
654
396
|
}
|
|
655
397
|
},
|
|
656
398
|
|
|
@@ -660,7 +402,7 @@ export function createNavigationBridge(
|
|
|
660
402
|
async refresh(): Promise<void> {
|
|
661
403
|
eventController.abortNavigation();
|
|
662
404
|
|
|
663
|
-
|
|
405
|
+
const tx = createNavigationTransaction(
|
|
664
406
|
store,
|
|
665
407
|
eventController,
|
|
666
408
|
window.location.href,
|
|
@@ -690,6 +432,8 @@ export function createNavigationBridge(
|
|
|
690
432
|
return;
|
|
691
433
|
}
|
|
692
434
|
throw error;
|
|
435
|
+
} finally {
|
|
436
|
+
tx[Symbol.dispose]();
|
|
693
437
|
}
|
|
694
438
|
},
|
|
695
439
|
|
|
@@ -719,6 +463,15 @@ export function createNavigationBridge(
|
|
|
719
463
|
eventController.abortAllActions();
|
|
720
464
|
}
|
|
721
465
|
|
|
466
|
+
// Popstate that exits an intercept to a non-intercept destination. The
|
|
467
|
+
// fallback fetch path below needs `leave-intercept` mode so it filters
|
|
468
|
+
// the cached @modal segment from the request and forces a re-render —
|
|
469
|
+
// otherwise a cache-miss popstate whose server response has an empty
|
|
470
|
+
// diff hits the "no changes" branch in partial-update and the modal
|
|
471
|
+
// stays on screen.
|
|
472
|
+
const isLeavingIntercept =
|
|
473
|
+
!isIntercept && currentInterceptSource !== null;
|
|
474
|
+
|
|
722
475
|
// Compute history key from URL (with intercept suffix if applicable)
|
|
723
476
|
const historyKey = generateHistoryKey(url, { intercept: isIntercept });
|
|
724
477
|
|
|
@@ -755,6 +508,12 @@ export function createNavigationBridge(
|
|
|
755
508
|
store.setCurrentUrl(url);
|
|
756
509
|
store.setPath(new URL(url).pathname);
|
|
757
510
|
|
|
511
|
+
// Restore router identity from cache so subsequent navigations
|
|
512
|
+
// don't falsely detect an app switch.
|
|
513
|
+
if (cached?.routerId) {
|
|
514
|
+
store.setRouterId?.(cached.routerId);
|
|
515
|
+
}
|
|
516
|
+
|
|
758
517
|
// Render from cache - force await to skip loading fallbacks
|
|
759
518
|
try {
|
|
760
519
|
const root = await renderSegments(cachedSegments, {
|
|
@@ -780,6 +539,7 @@ export function createNavigationBridge(
|
|
|
780
539
|
cachedHandleData,
|
|
781
540
|
params: cachedParams,
|
|
782
541
|
},
|
|
542
|
+
scroll: { restore: true, isStreaming },
|
|
783
543
|
};
|
|
784
544
|
const hasTransition = cachedSegments.some((s) => s.transition);
|
|
785
545
|
if (hasTransition) {
|
|
@@ -793,16 +553,11 @@ export function createNavigationBridge(
|
|
|
793
553
|
onUpdate(popstateUpdate);
|
|
794
554
|
}
|
|
795
555
|
|
|
796
|
-
// Restore scroll position for back/forward navigation
|
|
797
|
-
handleNavigationEnd({ restore: true, isStreaming });
|
|
798
|
-
|
|
799
556
|
// SWR: If stale, trigger background revalidation
|
|
800
557
|
if (isStale) {
|
|
801
558
|
debugLog("[Browser] Cache is stale, background revalidating...");
|
|
802
559
|
// Background revalidation - don't await, just fire and forget
|
|
803
|
-
const segmentIds = cachedSegments
|
|
804
|
-
.filter((s) => s.type !== "loader")
|
|
805
|
-
.map((s) => s.id);
|
|
560
|
+
const segmentIds = cachedSegments.map((s) => s.id);
|
|
806
561
|
|
|
807
562
|
const tx = createNavigationTransaction(
|
|
808
563
|
store,
|
|
@@ -824,7 +579,7 @@ export function createNavigationBridge(
|
|
|
824
579
|
interceptSourceUrl,
|
|
825
580
|
cacheOnly: true,
|
|
826
581
|
}),
|
|
827
|
-
{
|
|
582
|
+
{ type: "stale-revalidation", interceptSourceUrl },
|
|
828
583
|
)
|
|
829
584
|
.catch((error) => {
|
|
830
585
|
if (isBackgroundSuppressible(error)) return;
|
|
@@ -850,7 +605,7 @@ export function createNavigationBridge(
|
|
|
850
605
|
}
|
|
851
606
|
|
|
852
607
|
// Fetch if not cached
|
|
853
|
-
|
|
608
|
+
const tx = createNavigationTransaction(store, eventController, url, {
|
|
854
609
|
replace: true,
|
|
855
610
|
});
|
|
856
611
|
|
|
@@ -860,7 +615,18 @@ export function createNavigationBridge(
|
|
|
860
615
|
undefined,
|
|
861
616
|
false,
|
|
862
617
|
tx.handle.signal,
|
|
863
|
-
tx.with({
|
|
618
|
+
tx.with({
|
|
619
|
+
url,
|
|
620
|
+
replace: true,
|
|
621
|
+
scroll: false,
|
|
622
|
+
intercept: isIntercept,
|
|
623
|
+
interceptSourceUrl,
|
|
624
|
+
}),
|
|
625
|
+
isIntercept
|
|
626
|
+
? { type: "navigate", interceptSourceUrl }
|
|
627
|
+
: isLeavingIntercept
|
|
628
|
+
? { type: "leave-intercept" }
|
|
629
|
+
: undefined,
|
|
864
630
|
);
|
|
865
631
|
// Restore scroll position after fetch completes
|
|
866
632
|
handleNavigationEnd({ restore: true, isStreaming });
|
|
@@ -884,6 +650,8 @@ export function createNavigationBridge(
|
|
|
884
650
|
}
|
|
885
651
|
|
|
886
652
|
throw error;
|
|
653
|
+
} finally {
|
|
654
|
+
tx[Symbol.dispose]();
|
|
887
655
|
}
|
|
888
656
|
},
|
|
889
657
|
|
|
@@ -914,6 +682,9 @@ export function createNavigationBridge(
|
|
|
914
682
|
"[Browser] Page restored from bfcache, resetting navigation state",
|
|
915
683
|
);
|
|
916
684
|
eventController.abortNavigation();
|
|
685
|
+
// pagehide flips scrollRestoration to "auto" for bfcache compat;
|
|
686
|
+
// restore "manual" so the router controls scroll on SPA navigations.
|
|
687
|
+
window.history.scrollRestoration = "manual";
|
|
917
688
|
}
|
|
918
689
|
};
|
|
919
690
|
|
|
@@ -932,6 +703,16 @@ export function createNavigationBridge(
|
|
|
932
703
|
window.removeEventListener("pageshow", handlePageShow);
|
|
933
704
|
};
|
|
934
705
|
},
|
|
706
|
+
|
|
707
|
+
updateVersion(newVersion: string): void {
|
|
708
|
+
version = newVersion;
|
|
709
|
+
setAppVersion(newVersion);
|
|
710
|
+
store.clearHistoryCache();
|
|
711
|
+
},
|
|
712
|
+
|
|
713
|
+
updateAppShell(next: AppShell): void {
|
|
714
|
+
applyAppShell(next);
|
|
715
|
+
},
|
|
935
716
|
};
|
|
936
717
|
}
|
|
937
718
|
|