@rangojs/router 0.0.0-experimental.18 → 0.0.0-experimental.1878aa49
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 +91 -19
- 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 +348 -80
- 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 +883 -444
- package/dist/vite/index.js.map +1 -0
- package/dist/vite/index.named-routes.gen.ts +103 -0
- package/dist/vite/package-resolution.d.ts +43 -0
- package/dist/vite/package-resolution.d.ts.map +1 -0
- package/dist/vite/package-resolution.js +112 -0
- package/dist/vite/package-resolution.js.map +1 -0
- package/dist/vite/virtual-entries.d.ts +25 -0
- package/dist/vite/virtual-entries.d.ts.map +1 -0
- package/dist/vite/virtual-entries.js +110 -0
- package/dist/vite/virtual-entries.js.map +1 -0
- package/package.json +17 -16
- package/skills/breadcrumbs/SKILL.md +250 -0
- package/skills/cache-guide/SKILL.md +32 -0
- package/skills/caching/SKILL.md +49 -8
- package/skills/document-cache/SKILL.md +2 -2
- package/skills/hooks/SKILL.md +34 -32
- package/skills/host-router/SKILL.md +218 -0
- package/skills/intercept/SKILL.md +79 -0
- package/skills/layout/SKILL.md +62 -2
- package/skills/links/SKILL.md +3 -1
- package/skills/loader/SKILL.md +166 -23
- package/skills/middleware/SKILL.md +83 -0
- package/skills/parallel/SKILL.md +183 -2
- package/skills/prerender/SKILL.md +189 -19
- package/skills/rango/SKILL.md +0 -1
- package/skills/route/SKILL.md +76 -5
- package/skills/router-setup/SKILL.md +172 -5
- package/skills/typesafety/SKILL.md +35 -23
- 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-version.ts +14 -0
- package/src/browser/event-controller.ts +30 -27
- package/src/browser/history-state.ts +80 -0
- package/src/browser/intercept-utils.ts +1 -1
- package/src/browser/link-interceptor.ts +4 -3
- package/src/browser/merge-segment-loaders.ts +9 -2
- package/src/browser/navigation-bridge.ts +160 -31
- package/src/browser/navigation-client.ts +141 -88
- package/src/browser/navigation-store.ts +44 -39
- package/src/browser/navigation-transaction.ts +55 -214
- package/src/browser/partial-update.ts +181 -164
- package/src/browser/prefetch/cache.ts +206 -0
- package/src/browser/prefetch/fetch.ts +150 -0
- package/src/browser/prefetch/policy.ts +48 -0
- package/src/browser/prefetch/queue.ts +160 -0
- package/src/browser/prefetch/resource-ready.ts +77 -0
- package/src/browser/react/Link.tsx +97 -36
- package/src/browser/react/NavigationProvider.tsx +49 -5
- package/src/browser/react/context.ts +7 -2
- package/src/browser/react/index.ts +2 -6
- package/src/browser/react/location-state-shared.ts +1 -1
- package/src/browser/react/location-state.ts +2 -0
- package/src/browser/react/nonce-context.ts +23 -0
- package/src/browser/react/use-action.ts +9 -1
- package/src/browser/react/use-handle.ts +3 -25
- package/src/browser/react/use-params.ts +2 -4
- package/src/browser/react/use-pathname.ts +2 -3
- package/src/browser/react/use-router.ts +22 -9
- package/src/browser/react/use-search-params.ts +2 -1
- package/src/browser/react/use-segments.ts +7 -60
- package/src/browser/response-adapter.ts +73 -0
- package/src/browser/rsc-router.tsx +154 -64
- package/src/browser/scroll-restoration.ts +37 -37
- package/src/browser/segment-reconciler.ts +6 -1
- package/src/browser/server-action-bridge.ts +463 -426
- package/src/browser/types.ts +61 -36
- package/src/browser/validate-redirect-origin.ts +29 -0
- package/src/build/generate-manifest.ts +8 -0
- package/src/build/generate-route-types.ts +7 -0
- package/src/build/route-trie.ts +19 -3
- 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/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 +136 -96
- package/src/cache/cache-scope.ts +119 -80
- package/src/cache/cf/cf-cache-store.ts +462 -15
- package/src/cache/cf/index.ts +5 -1
- package/src/cache/document-cache.ts +88 -53
- package/src/cache/handle-capture.ts +81 -0
- package/src/cache/index.ts +1 -0
- package/src/cache/memory-segment-store.ts +18 -7
- package/src/cache/profile-registry.ts +43 -8
- package/src/cache/read-through-swr.ts +134 -0
- package/src/cache/segment-codec.ts +101 -112
- package/src/cache/taint.ts +81 -0
- package/src/client.rsc.tsx +2 -1
- package/src/client.tsx +54 -76
- package/src/context-var.ts +72 -2
- package/src/debug.ts +2 -2
- package/src/errors.ts +6 -1
- package/src/handle.ts +1 -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 +24 -23
- package/src/index.ts +45 -52
- package/src/loader.rsc.ts +12 -4
- package/src/loader.ts +8 -0
- package/src/prerender/store.ts +60 -18
- package/src/prerender.ts +76 -18
- package/src/reverse.ts +11 -7
- package/src/root-error-boundary.tsx +30 -26
- package/src/route-definition/dsl-helpers.ts +41 -13
- package/src/route-definition/helpers-types.ts +6 -5
- package/src/route-definition/index.ts +0 -3
- package/src/route-definition/redirect.ts +24 -4
- package/src/route-map-builder.ts +45 -3
- package/src/route-name.ts +53 -0
- package/src/route-types.ts +7 -0
- package/src/router/content-negotiation.ts +1 -1
- package/src/router/debug-manifest.ts +16 -3
- package/src/router/find-match.ts +4 -2
- package/src/router/handler-context.ts +159 -34
- package/src/router/intercept-resolution.ts +17 -8
- package/src/router/lazy-includes.ts +8 -1
- package/src/router/loader-resolution.ts +11 -3
- package/src/router/logging.ts +104 -4
- package/src/router/manifest.ts +45 -7
- package/src/router/match-api.ts +62 -8
- package/src/router/match-context.ts +3 -0
- package/src/router/match-handlers.ts +185 -11
- package/src/router/match-middleware/background-revalidation.ts +94 -86
- package/src/router/match-middleware/cache-lookup.ts +138 -13
- 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 +8 -5
- package/src/router/match-pipelines.ts +8 -43
- package/src/router/match-result.ts +22 -15
- package/src/router/metrics.ts +238 -13
- package/src/router/middleware-types.ts +60 -12
- package/src/router/middleware.ts +214 -42
- package/src/router/pattern-matching.ts +61 -10
- package/src/router/prerender-match.ts +40 -8
- package/src/router/preview-match.ts +7 -1
- package/src/router/revalidation.ts +87 -8
- package/src/router/router-context.ts +20 -0
- package/src/router/router-interfaces.ts +73 -5
- package/src/router/router-options.ts +250 -19
- package/src/router/segment-resolution/fresh.ts +277 -45
- package/src/router/segment-resolution/helpers.ts +49 -25
- package/src/router/segment-resolution/loader-cache.ts +38 -146
- package/src/router/segment-resolution/revalidation.ts +619 -275
- 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 +20 -2
- package/src/router/types.ts +8 -1
- package/src/router.ts +230 -25
- package/src/rsc/handler-context.ts +11 -0
- package/src/rsc/handler.ts +492 -96
- package/src/rsc/helpers.ts +25 -16
- package/src/rsc/index.ts +0 -20
- package/src/rsc/loader-fetch.ts +84 -42
- package/src/rsc/manifest-init.ts +5 -1
- package/src/rsc/origin-guard.ts +141 -0
- package/src/rsc/progressive-enhancement.ts +249 -19
- package/src/rsc/response-route-handler.ts +37 -26
- package/src/rsc/rsc-rendering.ts +40 -41
- package/src/rsc/runtime-warnings.ts +42 -0
- package/src/rsc/server-action.ts +150 -68
- package/src/rsc/ssr-setup.ts +128 -0
- package/src/rsc/types.ts +18 -1
- package/src/search-params.ts +38 -23
- package/src/segment-system.tsx +140 -4
- package/src/server/context.ts +187 -20
- package/src/server/fetchable-loader-store.ts +11 -6
- package/src/server/handle-store.ts +66 -9
- package/src/server/loader-registry.ts +20 -54
- package/src/server/request-context.ts +188 -41
- package/src/server.ts +6 -0
- package/src/ssr/index.tsx +66 -26
- package/src/static-handler.ts +7 -0
- 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 +9 -4
- package/src/types/error-types.ts +3 -0
- package/src/types/global-namespace.ts +9 -0
- package/src/types/handler-context.ts +167 -55
- package/src/types/loader-types.ts +11 -5
- package/src/types/route-config.ts +17 -8
- package/src/types/route-entry.ts +35 -0
- package/src/types/segments.ts +2 -5
- package/src/urls/include-helper.ts +49 -8
- package/src/urls/index.ts +1 -0
- package/src/urls/path-helper-types.ts +30 -12
- package/src/urls/path-helper.ts +18 -3
- package/src/urls/pattern-types.ts +33 -1
- package/src/urls/response-types.ts +27 -2
- package/src/urls/type-extraction.ts +23 -15
- package/src/use-loader.tsx +12 -4
- package/src/vite/discovery/bundle-postprocess.ts +32 -52
- package/src/vite/discovery/discover-routers.ts +53 -23
- package/src/vite/discovery/prerender-collection.ts +58 -41
- package/src/vite/discovery/route-types-writer.ts +7 -7
- package/src/vite/discovery/state.ts +4 -9
- package/src/vite/discovery/virtual-module-codegen.ts +5 -2
- package/src/vite/index.ts +4 -3
- package/src/vite/plugin-types.ts +0 -83
- package/src/vite/plugins/client-ref-dedup.ts +115 -0
- package/src/vite/plugins/client-ref-hashing.ts +3 -3
- package/src/vite/plugins/expose-action-id.ts +1 -3
- package/src/vite/plugins/performance-tracks.ts +88 -0
- package/src/vite/plugins/refresh-cmd.ts +65 -0
- package/src/vite/plugins/use-cache-transform.ts +91 -3
- package/src/vite/plugins/version-plugin.ts +13 -1
- package/src/vite/rango.ts +172 -210
- package/src/vite/router-discovery.ts +115 -44
- package/src/vite/utils/banner.ts +3 -3
- package/src/vite/utils/prerender-utils.ts +81 -0
- package/src/vite/utils/shared-utils.ts +6 -3
- package/skills/testing/SKILL.md +0 -226
- package/src/browser/prefetch-cache.ts +0 -48
- package/src/browser/prefetch-fetch.ts +0 -109
- package/src/browser/prefetch-queue.ts +0 -81
- package/src/browser/request-controller.ts +0 -164
- 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
- /package/src/browser/{prefetch-observer.ts → prefetch/observer.ts} +0 -0
|
@@ -4,12 +4,19 @@ import type {
|
|
|
4
4
|
NavigateOptionsInternal,
|
|
5
5
|
ResolvedSegment,
|
|
6
6
|
} from "./types.js";
|
|
7
|
+
import { setAppVersion } from "./app-version.js";
|
|
7
8
|
import * as React from "react";
|
|
8
9
|
import { startTransition } from "react";
|
|
9
10
|
import {
|
|
10
11
|
createNavigationTransaction,
|
|
11
12
|
resolveNavigationState,
|
|
12
13
|
} from "./navigation-transaction.js";
|
|
14
|
+
import { buildHistoryState } from "./history-state.js";
|
|
15
|
+
import {
|
|
16
|
+
handleNavigationStart,
|
|
17
|
+
handleNavigationEnd,
|
|
18
|
+
ensureHistoryKey,
|
|
19
|
+
} from "./scroll-restoration.js";
|
|
13
20
|
|
|
14
21
|
// addTransitionType is only available in React experimental
|
|
15
22
|
const addTransitionType: ((type: string) => void) | undefined =
|
|
@@ -18,7 +25,6 @@ const addTransitionType: ((type: string) => void) | undefined =
|
|
|
18
25
|
import { setupLinkInterception } from "./link-interceptor.js";
|
|
19
26
|
import { createPartialUpdater } from "./partial-update.js";
|
|
20
27
|
import { generateHistoryKey } from "./navigation-store.js";
|
|
21
|
-
import { handleNavigationEnd } from "./scroll-restoration.js";
|
|
22
28
|
import type { EventController } from "./event-controller.js";
|
|
23
29
|
import { isInterceptOnlyCache } from "./intercept-utils.js";
|
|
24
30
|
import {
|
|
@@ -28,17 +34,13 @@ import {
|
|
|
28
34
|
} from "./network-error-handler.js";
|
|
29
35
|
import { debugLog } from "./logging.js";
|
|
30
36
|
import { ServerRedirect } from "../errors.js";
|
|
37
|
+
import { validateRedirectOrigin } from "./validate-redirect-origin.js";
|
|
31
38
|
|
|
32
39
|
// Polyfill Symbol.dispose for Safari and older browsers
|
|
33
40
|
if (typeof Symbol.dispose === "undefined") {
|
|
34
41
|
(Symbol as any).dispose = Symbol("Symbol.dispose");
|
|
35
42
|
}
|
|
36
43
|
|
|
37
|
-
/** Get IDs of non-loader segments (layouts, routes, parallels). */
|
|
38
|
-
function getNonLoaderSegmentIds(segments: ResolvedSegment[]): string[] {
|
|
39
|
-
return segments.filter((s) => s.type !== "loader").map((s) => s.id);
|
|
40
|
-
}
|
|
41
|
-
|
|
42
44
|
export { createNavigationTransaction };
|
|
43
45
|
|
|
44
46
|
/**
|
|
@@ -66,8 +68,8 @@ export interface NavigationBridgeConfigWithController extends NavigationBridgeCo
|
|
|
66
68
|
export function createNavigationBridge(
|
|
67
69
|
config: NavigationBridgeConfigWithController,
|
|
68
70
|
): NavigationBridge {
|
|
69
|
-
const { store, client, eventController, onUpdate, renderSegments
|
|
70
|
-
|
|
71
|
+
const { store, client, eventController, onUpdate, renderSegments } = config;
|
|
72
|
+
let version = config.version;
|
|
71
73
|
|
|
72
74
|
// Create shared partial updater
|
|
73
75
|
const fetchPartialUpdate = createPartialUpdater({
|
|
@@ -75,13 +77,13 @@ export function createNavigationBridge(
|
|
|
75
77
|
client,
|
|
76
78
|
onUpdate,
|
|
77
79
|
renderSegments,
|
|
78
|
-
version,
|
|
80
|
+
getVersion: () => version,
|
|
79
81
|
});
|
|
80
82
|
|
|
81
83
|
return {
|
|
82
84
|
/**
|
|
83
85
|
* Navigate to a URL
|
|
84
|
-
* Uses
|
|
86
|
+
* Uses cached segments for SWR revalidation when available
|
|
85
87
|
*/
|
|
86
88
|
async navigate(
|
|
87
89
|
url: string,
|
|
@@ -93,10 +95,109 @@ export function createNavigationBridge(
|
|
|
93
95
|
? resolveNavigationState(options.state)
|
|
94
96
|
: undefined;
|
|
95
97
|
|
|
98
|
+
// Cross-origin URLs are not handled by SPA navigation.
|
|
99
|
+
// Fall back to a full browser navigation for http/https only.
|
|
100
|
+
let targetUrl: URL;
|
|
101
|
+
try {
|
|
102
|
+
targetUrl = new URL(url, window.location.origin);
|
|
103
|
+
} catch {
|
|
104
|
+
console.warn(`[rango] navigate() ignored: malformed URL "${url}"`);
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
if (targetUrl.origin !== window.location.origin) {
|
|
108
|
+
if (targetUrl.protocol !== "http:" && targetUrl.protocol !== "https:") {
|
|
109
|
+
console.error(
|
|
110
|
+
`[rango] navigate() blocked: unsupported scheme "${targetUrl.protocol}"`,
|
|
111
|
+
);
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
window.location.href = targetUrl.href;
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
// Shallow navigation: skip RSC fetch when revalidate is false
|
|
119
|
+
// and the pathname hasn't changed (search param / hash only change).
|
|
120
|
+
if (
|
|
121
|
+
options?.revalidate === false &&
|
|
122
|
+
targetUrl.pathname === new URL(window.location.href).pathname
|
|
123
|
+
) {
|
|
124
|
+
// Preserve intercept context from the current history entry so that
|
|
125
|
+
// popstate uses the correct cache key (:intercept suffix) and restores
|
|
126
|
+
// the right full-page vs modal semantics.
|
|
127
|
+
const currentHistoryState = window.history.state;
|
|
128
|
+
const isIntercept = currentHistoryState?.intercept === true;
|
|
129
|
+
const interceptSourceUrl = isIntercept
|
|
130
|
+
? currentHistoryState?.sourceUrl
|
|
131
|
+
: undefined;
|
|
132
|
+
|
|
133
|
+
const historyKey = generateHistoryKey(url, { intercept: isIntercept });
|
|
134
|
+
|
|
135
|
+
// Copy current segments to the new history key so back/forward restores instantly
|
|
136
|
+
const currentKey = store.getHistoryKey();
|
|
137
|
+
const currentCache = store.getCachedSegments(currentKey);
|
|
138
|
+
if (currentCache?.segments) {
|
|
139
|
+
const currentHandleData = eventController.getHandleState().data;
|
|
140
|
+
store.cacheSegmentsForHistory(
|
|
141
|
+
historyKey,
|
|
142
|
+
currentCache.segments,
|
|
143
|
+
currentHandleData,
|
|
144
|
+
);
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
// Save current scroll position before changing URL
|
|
148
|
+
handleNavigationStart();
|
|
149
|
+
|
|
150
|
+
// Snapshot old state before pushState/replaceState overwrites it
|
|
151
|
+
const oldState = window.history.state;
|
|
152
|
+
|
|
153
|
+
// Update browser URL (carry intercept context into history state)
|
|
154
|
+
const historyState = buildHistoryState(
|
|
155
|
+
resolvedState,
|
|
156
|
+
{
|
|
157
|
+
intercept: isIntercept || undefined,
|
|
158
|
+
sourceUrl: interceptSourceUrl,
|
|
159
|
+
},
|
|
160
|
+
{},
|
|
161
|
+
);
|
|
162
|
+
if (options.replace) {
|
|
163
|
+
window.history.replaceState(historyState, "", url);
|
|
164
|
+
} else {
|
|
165
|
+
window.history.pushState(historyState, "", url);
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
// Ensure new history entry has a scroll restoration key
|
|
169
|
+
ensureHistoryKey();
|
|
170
|
+
|
|
171
|
+
// Notify useLocationState() hooks when state changes
|
|
172
|
+
const hasOldState =
|
|
173
|
+
oldState &&
|
|
174
|
+
typeof oldState === "object" &&
|
|
175
|
+
("state" in oldState ||
|
|
176
|
+
Object.keys(oldState).some((k) => k.startsWith("__rsc_ls_")));
|
|
177
|
+
const hasNewState =
|
|
178
|
+
historyState &&
|
|
179
|
+
("state" in historyState ||
|
|
180
|
+
Object.keys(historyState).some((k) => k.startsWith("__rsc_ls_")));
|
|
181
|
+
if (hasOldState || hasNewState) {
|
|
182
|
+
window.dispatchEvent(new Event("__rsc_locationstate"));
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
// Update store history key so future navigations reference the right cache
|
|
186
|
+
store.setHistoryKey(historyKey);
|
|
187
|
+
store.setCurrentUrl(url);
|
|
188
|
+
|
|
189
|
+
// Notify hooks — location updates, state stays idle
|
|
190
|
+
eventController.setLocation(targetUrl);
|
|
191
|
+
|
|
192
|
+
// Handle post-navigation scroll
|
|
193
|
+
handleNavigationEnd({ scroll: options.scroll });
|
|
194
|
+
return;
|
|
195
|
+
}
|
|
196
|
+
|
|
96
197
|
// Only abort pending requests when navigating to a different route
|
|
97
198
|
// Same-route navigation (e.g., /todos -> /todos) should not cancel in-flight actions
|
|
98
199
|
const currentPath = new URL(window.location.href).pathname;
|
|
99
|
-
const targetPath =
|
|
200
|
+
const targetPath = targetUrl.pathname;
|
|
100
201
|
if (currentPath !== targetPath) {
|
|
101
202
|
eventController.abortNavigation();
|
|
102
203
|
}
|
|
@@ -155,7 +256,7 @@ export function createNavigationBridge(
|
|
|
155
256
|
const interceptHistoryKey = generateHistoryKey(url, { intercept: true });
|
|
156
257
|
const hasInterceptCache = store.hasHistoryCache(interceptHistoryKey);
|
|
157
258
|
|
|
158
|
-
// Skip
|
|
259
|
+
// Skip cached SWR for:
|
|
159
260
|
// 1. intercept caches - interception depends on source page context
|
|
160
261
|
// 2. routes that CAN be intercepted - we don't know if this navigation will intercept
|
|
161
262
|
// 3. when leaving intercept - we need fresh non-intercept segments from server
|
|
@@ -168,7 +269,7 @@ export function createNavigationBridge(
|
|
|
168
269
|
!isLeavingIntercept &&
|
|
169
270
|
!options?._skipCache;
|
|
170
271
|
|
|
171
|
-
|
|
272
|
+
const tx = createNavigationTransaction(store, eventController, url, {
|
|
172
273
|
...options,
|
|
173
274
|
state: resolvedState,
|
|
174
275
|
skipLoadingState: hasUsableCache,
|
|
@@ -179,7 +280,7 @@ export function createNavigationBridge(
|
|
|
179
280
|
await fetchPartialUpdate(
|
|
180
281
|
url,
|
|
181
282
|
hasUsableCache
|
|
182
|
-
?
|
|
283
|
+
? cachedSegments!.map((s) => s.id)
|
|
183
284
|
: options?._skipCache
|
|
184
285
|
? [] // Action redirect: send no segments so server renders everything fresh
|
|
185
286
|
: undefined,
|
|
@@ -191,27 +292,29 @@ export function createNavigationBridge(
|
|
|
191
292
|
scroll: options?.scroll,
|
|
192
293
|
state: resolvedState,
|
|
193
294
|
}),
|
|
194
|
-
// Pass cached segments (merged with current page's fresh segments for shared IDs)
|
|
195
|
-
// so the segment map is consistent with what we tell the server we have.
|
|
196
|
-
// Server decides what needs revalidation based on route matching and custom functions.
|
|
197
|
-
// No need for staleRevalidation flag - we're sending the freshest segments we have.
|
|
198
|
-
// Also pass cached handle data for restoring breadcrumbs when server returns empty diff.
|
|
199
|
-
// When leaving intercept, pass the flag so fetchPartialUpdate knows to filter segments.
|
|
200
295
|
hasUsableCache
|
|
201
296
|
? {
|
|
297
|
+
type: "navigate" as const,
|
|
202
298
|
targetCacheSegments: cachedSegments,
|
|
203
299
|
targetCacheHandleData: cachedHandleData,
|
|
204
300
|
}
|
|
205
301
|
: isLeavingIntercept
|
|
206
|
-
? {
|
|
302
|
+
? { type: "leave-intercept" as const }
|
|
207
303
|
: undefined,
|
|
208
304
|
);
|
|
209
305
|
} catch (error) {
|
|
210
306
|
// Server-side redirect with location state: the current transaction's
|
|
211
|
-
//
|
|
307
|
+
// cleanup resets loading state. Re-navigate to the redirect
|
|
212
308
|
// target carrying the server-set state into history.pushState.
|
|
213
309
|
if (error instanceof ServerRedirect) {
|
|
214
|
-
|
|
310
|
+
const redirectUrl = validateRedirectOrigin(
|
|
311
|
+
error.url,
|
|
312
|
+
window.location.origin,
|
|
313
|
+
);
|
|
314
|
+
if (!redirectUrl) {
|
|
315
|
+
return;
|
|
316
|
+
}
|
|
317
|
+
return this.navigate(redirectUrl, {
|
|
215
318
|
state: error.state,
|
|
216
319
|
replace: options?.replace,
|
|
217
320
|
_skipCache: true,
|
|
@@ -237,6 +340,8 @@ export function createNavigationBridge(
|
|
|
237
340
|
}
|
|
238
341
|
|
|
239
342
|
throw error;
|
|
343
|
+
} finally {
|
|
344
|
+
tx[Symbol.dispose]();
|
|
240
345
|
}
|
|
241
346
|
},
|
|
242
347
|
|
|
@@ -246,7 +351,7 @@ export function createNavigationBridge(
|
|
|
246
351
|
async refresh(): Promise<void> {
|
|
247
352
|
eventController.abortNavigation();
|
|
248
353
|
|
|
249
|
-
|
|
354
|
+
const tx = createNavigationTransaction(
|
|
250
355
|
store,
|
|
251
356
|
eventController,
|
|
252
357
|
window.location.href,
|
|
@@ -276,6 +381,8 @@ export function createNavigationBridge(
|
|
|
276
381
|
return;
|
|
277
382
|
}
|
|
278
383
|
throw error;
|
|
384
|
+
} finally {
|
|
385
|
+
tx[Symbol.dispose]();
|
|
279
386
|
}
|
|
280
387
|
},
|
|
281
388
|
|
|
@@ -341,6 +448,12 @@ export function createNavigationBridge(
|
|
|
341
448
|
store.setCurrentUrl(url);
|
|
342
449
|
store.setPath(new URL(url).pathname);
|
|
343
450
|
|
|
451
|
+
// Restore router identity from cache so subsequent navigations
|
|
452
|
+
// don't falsely detect an app switch.
|
|
453
|
+
if (cached?.routerId) {
|
|
454
|
+
store.setRouterId?.(cached.routerId);
|
|
455
|
+
}
|
|
456
|
+
|
|
344
457
|
// Render from cache - force await to skip loading fallbacks
|
|
345
458
|
try {
|
|
346
459
|
const root = await renderSegments(cachedSegments, {
|
|
@@ -366,6 +479,7 @@ export function createNavigationBridge(
|
|
|
366
479
|
cachedHandleData,
|
|
367
480
|
params: cachedParams,
|
|
368
481
|
},
|
|
482
|
+
scroll: { restore: true, isStreaming },
|
|
369
483
|
};
|
|
370
484
|
const hasTransition = cachedSegments.some((s) => s.transition);
|
|
371
485
|
if (hasTransition) {
|
|
@@ -379,14 +493,11 @@ export function createNavigationBridge(
|
|
|
379
493
|
onUpdate(popstateUpdate);
|
|
380
494
|
}
|
|
381
495
|
|
|
382
|
-
// Restore scroll position for back/forward navigation
|
|
383
|
-
handleNavigationEnd({ restore: true, isStreaming });
|
|
384
|
-
|
|
385
496
|
// SWR: If stale, trigger background revalidation
|
|
386
497
|
if (isStale) {
|
|
387
498
|
debugLog("[Browser] Cache is stale, background revalidating...");
|
|
388
499
|
// Background revalidation - don't await, just fire and forget
|
|
389
|
-
const segmentIds =
|
|
500
|
+
const segmentIds = cachedSegments.map((s) => s.id);
|
|
390
501
|
|
|
391
502
|
const tx = createNavigationTransaction(
|
|
392
503
|
store,
|
|
@@ -408,7 +519,7 @@ export function createNavigationBridge(
|
|
|
408
519
|
interceptSourceUrl,
|
|
409
520
|
cacheOnly: true,
|
|
410
521
|
}),
|
|
411
|
-
{
|
|
522
|
+
{ type: "stale-revalidation", interceptSourceUrl },
|
|
412
523
|
)
|
|
413
524
|
.catch((error) => {
|
|
414
525
|
if (isBackgroundSuppressible(error)) return;
|
|
@@ -434,7 +545,7 @@ export function createNavigationBridge(
|
|
|
434
545
|
}
|
|
435
546
|
|
|
436
547
|
// Fetch if not cached
|
|
437
|
-
|
|
548
|
+
const tx = createNavigationTransaction(store, eventController, url, {
|
|
438
549
|
replace: true,
|
|
439
550
|
});
|
|
440
551
|
|
|
@@ -444,7 +555,14 @@ export function createNavigationBridge(
|
|
|
444
555
|
undefined,
|
|
445
556
|
false,
|
|
446
557
|
tx.handle.signal,
|
|
447
|
-
tx.with({
|
|
558
|
+
tx.with({
|
|
559
|
+
url,
|
|
560
|
+
replace: true,
|
|
561
|
+
scroll: false,
|
|
562
|
+
intercept: isIntercept,
|
|
563
|
+
interceptSourceUrl,
|
|
564
|
+
}),
|
|
565
|
+
isIntercept ? { type: "navigate", interceptSourceUrl } : undefined,
|
|
448
566
|
);
|
|
449
567
|
// Restore scroll position after fetch completes
|
|
450
568
|
handleNavigationEnd({ restore: true, isStreaming });
|
|
@@ -468,6 +586,8 @@ export function createNavigationBridge(
|
|
|
468
586
|
}
|
|
469
587
|
|
|
470
588
|
throw error;
|
|
589
|
+
} finally {
|
|
590
|
+
tx[Symbol.dispose]();
|
|
471
591
|
}
|
|
472
592
|
},
|
|
473
593
|
|
|
@@ -498,6 +618,9 @@ export function createNavigationBridge(
|
|
|
498
618
|
"[Browser] Page restored from bfcache, resetting navigation state",
|
|
499
619
|
);
|
|
500
620
|
eventController.abortNavigation();
|
|
621
|
+
// pagehide flips scrollRestoration to "auto" for bfcache compat;
|
|
622
|
+
// restore "manual" so the router controls scroll on SPA navigations.
|
|
623
|
+
window.history.scrollRestoration = "manual";
|
|
501
624
|
}
|
|
502
625
|
};
|
|
503
626
|
|
|
@@ -516,6 +639,12 @@ export function createNavigationBridge(
|
|
|
516
639
|
window.removeEventListener("pageshow", handlePageShow);
|
|
517
640
|
};
|
|
518
641
|
},
|
|
642
|
+
|
|
643
|
+
updateVersion(newVersion: string): void {
|
|
644
|
+
version = newVersion;
|
|
645
|
+
setAppVersion(newVersion);
|
|
646
|
+
store.clearHistoryCache();
|
|
647
|
+
},
|
|
519
648
|
};
|
|
520
649
|
}
|
|
521
650
|
|
|
@@ -12,6 +12,16 @@ import {
|
|
|
12
12
|
startBrowserTransaction,
|
|
13
13
|
} from "./logging.js";
|
|
14
14
|
import { getRangoState } from "./rango-state.js";
|
|
15
|
+
import {
|
|
16
|
+
extractRscHeaderUrl,
|
|
17
|
+
emptyResponse,
|
|
18
|
+
teeWithCompletion,
|
|
19
|
+
} from "./response-adapter.js";
|
|
20
|
+
import {
|
|
21
|
+
buildPrefetchKey,
|
|
22
|
+
consumeInflightPrefetch,
|
|
23
|
+
consumePrefetch,
|
|
24
|
+
} from "./prefetch/cache.js";
|
|
15
25
|
|
|
16
26
|
/**
|
|
17
27
|
* Create a navigation client for fetching RSC payloads
|
|
@@ -19,21 +29,12 @@ import { getRangoState } from "./rango-state.js";
|
|
|
19
29
|
* The client handles building URLs with RSC parameters and
|
|
20
30
|
* deserializing the response using the RSC runtime.
|
|
21
31
|
*
|
|
32
|
+
* Checks the in-memory prefetch cache before making a network request.
|
|
33
|
+
* The cache key is source-dependent (includes the previous URL) so
|
|
34
|
+
* prefetch responses match the exact diff the server would produce.
|
|
35
|
+
*
|
|
22
36
|
* @param deps - RSC browser dependencies (createFromFetch)
|
|
23
37
|
* @returns NavigationClient instance
|
|
24
|
-
*
|
|
25
|
-
* @example
|
|
26
|
-
* ```typescript
|
|
27
|
-
* import { createFromFetch } from "@vitejs/plugin-rsc/browser";
|
|
28
|
-
*
|
|
29
|
-
* const client = createNavigationClient({ createFromFetch });
|
|
30
|
-
*
|
|
31
|
-
* const payload = await client.fetchPartial({
|
|
32
|
-
* targetUrl: "/shop/products",
|
|
33
|
-
* segmentIds: ["root", "shop"],
|
|
34
|
-
* previousUrl: "/",
|
|
35
|
-
* });
|
|
36
|
-
* ```
|
|
37
38
|
*/
|
|
38
39
|
export function createNavigationClient(
|
|
39
40
|
deps: Pick<RscBrowserDependencies, "createFromFetch">,
|
|
@@ -42,8 +43,9 @@ export function createNavigationClient(
|
|
|
42
43
|
/**
|
|
43
44
|
* Fetch a partial RSC payload for navigation
|
|
44
45
|
*
|
|
45
|
-
*
|
|
46
|
-
*
|
|
46
|
+
* First checks the in-memory prefetch cache for a matching entry.
|
|
47
|
+
* If found, uses the cached response instantly. Otherwise sends
|
|
48
|
+
* current segment IDs to the server for diff-based rendering.
|
|
47
49
|
*
|
|
48
50
|
* @param options - Fetch options
|
|
49
51
|
* @returns RSC payload with segments and metadata, plus stream completion promise
|
|
@@ -59,6 +61,7 @@ export function createNavigationClient(
|
|
|
59
61
|
staleRevalidation,
|
|
60
62
|
interceptSourceUrl,
|
|
61
63
|
version,
|
|
64
|
+
routerId,
|
|
62
65
|
hmr,
|
|
63
66
|
} = options;
|
|
64
67
|
|
|
@@ -75,7 +78,8 @@ export function createNavigationClient(
|
|
|
75
78
|
});
|
|
76
79
|
}
|
|
77
80
|
|
|
78
|
-
// Build fetch URL with partial rendering params
|
|
81
|
+
// Build fetch URL with partial rendering params (used for both
|
|
82
|
+
// cache key lookup and actual fetch if cache misses)
|
|
79
83
|
const fetchUrl = new URL(targetUrl, window.location.origin);
|
|
80
84
|
fetchUrl.searchParams.set("_rsc_partial", "true");
|
|
81
85
|
fetchUrl.searchParams.set("_rsc_segments", segmentIds.join(","));
|
|
@@ -85,51 +89,51 @@ export function createNavigationClient(
|
|
|
85
89
|
if (version) {
|
|
86
90
|
fetchUrl.searchParams.set("_rsc_v", version);
|
|
87
91
|
}
|
|
88
|
-
if (
|
|
89
|
-
|
|
90
|
-
path: `${fetchUrl.pathname}${fetchUrl.search}`,
|
|
91
|
-
});
|
|
92
|
+
if (routerId) {
|
|
93
|
+
fetchUrl.searchParams.set("_rsc_rid", routerId);
|
|
92
94
|
}
|
|
93
95
|
|
|
96
|
+
// Check completed in-memory prefetch cache before making a network request.
|
|
97
|
+
// The cache key includes the source URL (previousUrl) because the
|
|
98
|
+
// server's diff response depends on the source page context.
|
|
99
|
+
// Skip cache for stale revalidation (needs fresh data), HMR (needs
|
|
100
|
+
// fresh modules), and intercept contexts (source-dependent responses).
|
|
101
|
+
//
|
|
102
|
+
const canUsePrefetch = !staleRevalidation && !hmr && !interceptSourceUrl;
|
|
103
|
+
const cacheKey = buildPrefetchKey(previousUrl, fetchUrl);
|
|
104
|
+
const cachedResponse = canUsePrefetch ? consumePrefetch(cacheKey) : null;
|
|
105
|
+
const inflightResponsePromise = canUsePrefetch
|
|
106
|
+
? consumeInflightPrefetch(cacheKey)
|
|
107
|
+
: null;
|
|
94
108
|
// Track when the stream completes
|
|
95
109
|
let resolveStreamComplete: () => void;
|
|
96
110
|
const streamComplete = new Promise<void>((resolve) => {
|
|
97
111
|
resolveStreamComplete = resolve;
|
|
98
112
|
});
|
|
99
113
|
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
if (
|
|
116
|
-
// Validate origin to prevent open redirect via crafted headers
|
|
117
|
-
try {
|
|
118
|
-
const target = new URL(reloadUrl, window.location.origin);
|
|
119
|
-
if (target.origin !== window.location.origin) {
|
|
120
|
-
throw new Error(
|
|
121
|
-
`X-RSC-Reload blocked: origin mismatch (${target.origin})`,
|
|
122
|
-
);
|
|
123
|
-
}
|
|
124
|
-
} catch (e) {
|
|
125
|
-
console.error("[rango]", e);
|
|
126
|
-
return response;
|
|
127
|
-
}
|
|
114
|
+
/**
|
|
115
|
+
* Validate RSC control headers on any response (fresh, cached, or
|
|
116
|
+
* in-flight). Handles version-mismatch reloads and server redirects.
|
|
117
|
+
* Returns the response unchanged when no control header is present.
|
|
118
|
+
*/
|
|
119
|
+
const validateRscHeaders = (
|
|
120
|
+
response: Response,
|
|
121
|
+
source: string,
|
|
122
|
+
): Response | Promise<Response> => {
|
|
123
|
+
// Version mismatch — server wants a full page reload
|
|
124
|
+
const reload = extractRscHeaderUrl(response, "X-RSC-Reload");
|
|
125
|
+
if (reload === "blocked") {
|
|
126
|
+
resolveStreamComplete();
|
|
127
|
+
return emptyResponse();
|
|
128
|
+
}
|
|
129
|
+
if (reload) {
|
|
128
130
|
if (tx) {
|
|
129
|
-
browserDebugLog(tx,
|
|
131
|
+
browserDebugLog(tx, `version mismatch, reloading (${source})`, {
|
|
132
|
+
reloadUrl: reload.url,
|
|
133
|
+
});
|
|
130
134
|
}
|
|
131
|
-
window.location.href =
|
|
132
|
-
//
|
|
135
|
+
window.location.href = reload.url;
|
|
136
|
+
// Block further processing — page is reloading
|
|
133
137
|
return new Promise<Response>(() => {});
|
|
134
138
|
}
|
|
135
139
|
|
|
@@ -137,61 +141,110 @@ export function createNavigationClient(
|
|
|
137
141
|
// X-RSC-Redirect instead of a 3xx (which fetch would auto-follow
|
|
138
142
|
// to a URL rendering full HTML). Throw ServerRedirect so the
|
|
139
143
|
// navigation bridge catches it and re-navigates with _skipCache.
|
|
140
|
-
const
|
|
141
|
-
if (
|
|
144
|
+
const redirect = extractRscHeaderUrl(response, "X-RSC-Redirect");
|
|
145
|
+
if (redirect === "blocked") {
|
|
146
|
+
resolveStreamComplete();
|
|
147
|
+
return emptyResponse();
|
|
148
|
+
}
|
|
149
|
+
if (redirect) {
|
|
142
150
|
if (tx) {
|
|
143
|
-
browserDebugLog(tx,
|
|
151
|
+
browserDebugLog(tx, `server redirect (${source})`, {
|
|
152
|
+
redirectUrl: redirect.url,
|
|
153
|
+
});
|
|
144
154
|
}
|
|
145
155
|
resolveStreamComplete();
|
|
146
|
-
throw new ServerRedirect(
|
|
156
|
+
throw new ServerRedirect(redirect.url, undefined);
|
|
147
157
|
}
|
|
148
158
|
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
159
|
+
return response;
|
|
160
|
+
};
|
|
161
|
+
|
|
162
|
+
/** Start a fresh navigation fetch (no cache / inflight hit). */
|
|
163
|
+
const doFreshFetch = (): Promise<Response> => {
|
|
164
|
+
if (tx) {
|
|
165
|
+
browserDebugLog(tx, "fetching", {
|
|
166
|
+
path: `${fetchUrl.pathname}${fetchUrl.search}`,
|
|
167
|
+
});
|
|
153
168
|
}
|
|
154
169
|
|
|
155
|
-
|
|
156
|
-
|
|
170
|
+
return fetch(fetchUrl, {
|
|
171
|
+
headers: {
|
|
172
|
+
"X-RSC-Router-Client-Path": previousUrl,
|
|
173
|
+
"X-Rango-State": getRangoState(),
|
|
174
|
+
...(tx && { "X-RSC-Router-Request-Id": tx.requestId }),
|
|
175
|
+
...(interceptSourceUrl && {
|
|
176
|
+
"X-RSC-Router-Intercept-Source": interceptSourceUrl,
|
|
177
|
+
}),
|
|
178
|
+
...(hmr && { "X-RSC-HMR": "1" }),
|
|
179
|
+
},
|
|
180
|
+
signal,
|
|
181
|
+
}).then((response) => {
|
|
182
|
+
const validated = validateRscHeaders(response, "fetch");
|
|
183
|
+
if (validated instanceof Promise) return validated;
|
|
157
184
|
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
185
|
+
return teeWithCompletion(
|
|
186
|
+
validated,
|
|
187
|
+
() => {
|
|
188
|
+
if (tx) browserDebugLog(tx, "stream complete");
|
|
189
|
+
resolveStreamComplete();
|
|
190
|
+
},
|
|
191
|
+
signal,
|
|
192
|
+
);
|
|
193
|
+
});
|
|
194
|
+
};
|
|
161
195
|
|
|
162
|
-
|
|
163
|
-
const onAbort = reader.cancel.bind(reader);
|
|
164
|
-
signal?.addEventListener("abort", onAbort, { once: true });
|
|
196
|
+
let responsePromise: Promise<Response>;
|
|
165
197
|
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
198
|
+
if (cachedResponse) {
|
|
199
|
+
if (tx) {
|
|
200
|
+
browserDebugLog(tx, "prefetch cache hit", { key: cacheKey });
|
|
201
|
+
}
|
|
202
|
+
responsePromise = Promise.resolve(cachedResponse).then((response) => {
|
|
203
|
+
const validated = validateRscHeaders(response, "prefetch cache");
|
|
204
|
+
if (validated instanceof Promise) return validated;
|
|
205
|
+
|
|
206
|
+
return teeWithCompletion(
|
|
207
|
+
validated,
|
|
208
|
+
() => {
|
|
209
|
+
if (tx) browserDebugLog(tx, "stream complete (from cache)");
|
|
210
|
+
resolveStreamComplete();
|
|
211
|
+
},
|
|
212
|
+
signal,
|
|
213
|
+
);
|
|
214
|
+
});
|
|
215
|
+
} else if (inflightResponsePromise) {
|
|
216
|
+
if (tx) {
|
|
217
|
+
browserDebugLog(tx, "reusing inflight prefetch", { key: cacheKey });
|
|
218
|
+
}
|
|
219
|
+
responsePromise = inflightResponsePromise.then(async (response) => {
|
|
220
|
+
if (!response) {
|
|
174
221
|
if (tx) {
|
|
175
|
-
browserDebugLog(tx, "
|
|
222
|
+
browserDebugLog(tx, "inflight prefetch unavailable, refetching");
|
|
176
223
|
}
|
|
177
|
-
|
|
224
|
+
return doFreshFetch();
|
|
178
225
|
}
|
|
179
|
-
})().catch((error) => {
|
|
180
|
-
console.error("[Browser] Error reading tracking stream:", error);
|
|
181
|
-
resolveStreamComplete();
|
|
182
|
-
});
|
|
183
226
|
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
227
|
+
const validated = validateRscHeaders(response, "inflight prefetch");
|
|
228
|
+
if (validated instanceof Promise) return validated;
|
|
229
|
+
|
|
230
|
+
return teeWithCompletion(
|
|
231
|
+
validated,
|
|
232
|
+
() => {
|
|
233
|
+
if (tx) {
|
|
234
|
+
browserDebugLog(tx, "stream complete (from inflight prefetch)");
|
|
235
|
+
}
|
|
236
|
+
resolveStreamComplete();
|
|
237
|
+
},
|
|
238
|
+
signal,
|
|
239
|
+
);
|
|
189
240
|
});
|
|
190
|
-
}
|
|
241
|
+
} else {
|
|
242
|
+
responsePromise = doFreshFetch();
|
|
243
|
+
}
|
|
191
244
|
|
|
192
245
|
try {
|
|
193
|
-
// Deserialize RSC payload
|
|
194
246
|
const payload = await deps.createFromFetch<RscPayload>(responsePromise);
|
|
247
|
+
|
|
195
248
|
if (tx) {
|
|
196
249
|
browserDebugLog(tx, "response received", {
|
|
197
250
|
isPartial: payload.metadata?.isPartial,
|