@rangojs/router 0.0.0-experimental.12 → 0.0.0-experimental.120
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +9 -0
- package/README.md +1037 -4
- package/dist/__internal.d.ts +83 -0
- package/dist/__internal.d.ts.map +1 -0
- package/dist/__internal.js +19 -0
- package/dist/__internal.js.map +1 -0
- package/dist/__mocks__/version.d.ts +7 -0
- package/dist/__mocks__/version.d.ts.map +1 -0
- package/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 +1704 -212
- package/dist/bin/rango.js.map +1 -0
- package/dist/browser/event-controller.d.ts +191 -0
- package/dist/browser/event-controller.d.ts.map +1 -0
- package/dist/browser/event-controller.js +559 -0
- package/dist/browser/event-controller.js.map +1 -0
- package/dist/browser/index.d.ts +2 -0
- package/dist/browser/index.d.ts.map +1 -0
- package/dist/browser/index.js +14 -0
- package/dist/browser/index.js.map +1 -0
- package/dist/browser/link-interceptor.d.ts +38 -0
- package/dist/browser/link-interceptor.d.ts.map +1 -0
- package/dist/browser/link-interceptor.js +99 -0
- package/dist/browser/link-interceptor.js.map +1 -0
- package/dist/browser/logging.d.ts +10 -0
- package/dist/browser/logging.d.ts.map +1 -0
- package/dist/browser/logging.js +29 -0
- package/dist/browser/logging.js.map +1 -0
- package/dist/browser/lru-cache.d.ts +17 -0
- package/dist/browser/lru-cache.d.ts.map +1 -0
- package/dist/browser/lru-cache.js +50 -0
- package/dist/browser/lru-cache.js.map +1 -0
- package/dist/browser/merge-segment-loaders.d.ts +39 -0
- package/dist/browser/merge-segment-loaders.d.ts.map +1 -0
- package/dist/browser/merge-segment-loaders.js +102 -0
- package/dist/browser/merge-segment-loaders.js.map +1 -0
- package/dist/browser/navigation-bridge.d.ts +102 -0
- package/dist/browser/navigation-bridge.d.ts.map +1 -0
- package/dist/browser/navigation-bridge.js +708 -0
- package/dist/browser/navigation-bridge.js.map +1 -0
- package/dist/browser/navigation-client.d.ts +25 -0
- package/dist/browser/navigation-client.d.ts.map +1 -0
- package/dist/browser/navigation-client.js +157 -0
- package/dist/browser/navigation-client.js.map +1 -0
- package/dist/browser/navigation-store.d.ts +101 -0
- package/dist/browser/navigation-store.d.ts.map +1 -0
- package/dist/browser/navigation-store.js +625 -0
- package/dist/browser/navigation-store.js.map +1 -0
- package/dist/browser/partial-update.d.ts +75 -0
- package/dist/browser/partial-update.d.ts.map +1 -0
- package/dist/browser/partial-update.js +426 -0
- package/dist/browser/partial-update.js.map +1 -0
- package/dist/browser/react/Link.d.ts +86 -0
- package/dist/browser/react/Link.d.ts.map +1 -0
- package/dist/browser/react/Link.js +128 -0
- package/dist/browser/react/Link.js.map +1 -0
- package/dist/browser/react/NavigationProvider.d.ts +63 -0
- package/dist/browser/react/NavigationProvider.d.ts.map +1 -0
- package/dist/browser/react/NavigationProvider.js +216 -0
- package/dist/browser/react/NavigationProvider.js.map +1 -0
- package/dist/browser/react/ScrollRestoration.d.ts +75 -0
- package/dist/browser/react/ScrollRestoration.d.ts.map +1 -0
- package/dist/browser/react/ScrollRestoration.js +57 -0
- package/dist/browser/react/ScrollRestoration.js.map +1 -0
- package/dist/browser/react/context.d.ts +46 -0
- package/dist/browser/react/context.d.ts.map +1 -0
- package/dist/browser/react/context.js +10 -0
- package/dist/browser/react/context.js.map +1 -0
- package/dist/browser/react/index.d.ts +11 -0
- package/dist/browser/react/index.d.ts.map +1 -0
- package/dist/browser/react/index.js +22 -0
- package/dist/browser/react/index.js.map +1 -0
- package/dist/browser/react/location-state-shared.d.ts +63 -0
- package/dist/browser/react/location-state-shared.d.ts.map +1 -0
- package/dist/browser/react/location-state-shared.js +81 -0
- package/dist/browser/react/location-state-shared.js.map +1 -0
- package/dist/browser/react/location-state.d.ts +23 -0
- package/dist/browser/react/location-state.d.ts.map +1 -0
- package/dist/browser/react/location-state.js +29 -0
- package/dist/browser/react/location-state.js.map +1 -0
- package/dist/browser/react/mount-context.d.ts +24 -0
- package/dist/browser/react/mount-context.d.ts.map +1 -0
- package/dist/browser/react/mount-context.js +24 -0
- package/dist/browser/react/mount-context.js.map +1 -0
- package/dist/browser/react/use-action.d.ts +64 -0
- package/dist/browser/react/use-action.d.ts.map +1 -0
- package/dist/browser/react/use-action.js +134 -0
- package/dist/browser/react/use-action.js.map +1 -0
- package/dist/browser/react/use-client-cache.d.ts +41 -0
- package/dist/browser/react/use-client-cache.d.ts.map +1 -0
- package/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/testing/vitest.js +82 -0
- package/dist/theme/ThemeProvider.d.ts +20 -0
- package/dist/theme/ThemeProvider.d.ts.map +1 -0
- package/dist/theme/ThemeProvider.js +240 -0
- package/dist/theme/ThemeProvider.js.map +1 -0
- package/dist/theme/ThemeScript.d.ts +48 -0
- package/dist/theme/ThemeScript.d.ts.map +1 -0
- package/dist/theme/ThemeScript.js +13 -0
- package/dist/theme/ThemeScript.js.map +1 -0
- package/dist/theme/__tests__/theme.test.d.ts +2 -0
- package/dist/theme/__tests__/theme.test.d.ts.map +1 -0
- package/dist/theme/__tests__/theme.test.js +103 -0
- package/dist/theme/__tests__/theme.test.js.map +1 -0
- package/dist/theme/constants.d.ts +29 -0
- package/dist/theme/constants.d.ts.map +1 -0
- package/dist/theme/constants.js +48 -0
- package/dist/theme/constants.js.map +1 -0
- package/dist/theme/index.d.ts +31 -0
- package/dist/theme/index.d.ts.map +1 -0
- package/dist/theme/index.js +36 -0
- package/dist/theme/index.js.map +1 -0
- package/dist/theme/theme-context.d.ts +40 -0
- package/dist/theme/theme-context.d.ts.map +1 -0
- package/dist/theme/theme-context.js +60 -0
- package/dist/theme/theme-context.js.map +1 -0
- package/dist/theme/theme-script.d.ts +27 -0
- package/dist/theme/theme-script.d.ts.map +1 -0
- package/dist/theme/theme-script.js +147 -0
- package/dist/theme/theme-script.js.map +1 -0
- package/dist/theme/types.d.ts +163 -0
- package/dist/theme/types.d.ts.map +1 -0
- package/dist/theme/types.js +11 -0
- package/dist/theme/types.js.map +1 -0
- package/dist/theme/use-theme.d.ts +12 -0
- package/dist/theme/use-theme.d.ts.map +1 -0
- package/dist/theme/use-theme.js +40 -0
- package/dist/theme/use-theme.js.map +1 -0
- package/dist/types.d.ts +1479 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +10 -0
- package/dist/types.js.map +1 -0
- package/dist/urls.d.ts +441 -0
- package/dist/urls.d.ts.map +1 -0
- package/dist/urls.gen.d.ts +8 -0
- package/dist/urls.gen.d.ts.map +1 -0
- package/dist/urls.gen.js +8 -0
- package/dist/urls.gen.js.map +1 -0
- package/dist/urls.js +443 -0
- package/dist/urls.js.map +1 -0
- package/dist/use-loader.d.ts +127 -0
- package/dist/use-loader.d.ts.map +1 -0
- package/dist/use-loader.js +237 -0
- package/dist/use-loader.js.map +1 -0
- package/dist/vite/__tests__/ast-handler-extract.test.d.ts +2 -0
- package/dist/vite/__tests__/ast-handler-extract.test.d.ts.map +1 -0
- package/dist/vite/__tests__/ast-handler-extract.test.js +294 -0
- package/dist/vite/__tests__/ast-handler-extract.test.js.map +1 -0
- package/dist/vite/__tests__/expose-id-utils.test.d.ts +2 -0
- package/dist/vite/__tests__/expose-id-utils.test.d.ts.map +1 -0
- package/dist/vite/__tests__/expose-id-utils.test.js +224 -0
- package/dist/vite/__tests__/expose-id-utils.test.js.map +1 -0
- package/dist/vite/__tests__/expose-internal-ids.test.d.ts +2 -0
- package/dist/vite/__tests__/expose-internal-ids.test.d.ts.map +1 -0
- package/dist/vite/__tests__/expose-internal-ids.test.js +647 -0
- package/dist/vite/__tests__/expose-internal-ids.test.js.map +1 -0
- package/dist/vite/__tests__/expose-router-id.test.d.ts +2 -0
- package/dist/vite/__tests__/expose-router-id.test.d.ts.map +1 -0
- package/dist/vite/__tests__/expose-router-id.test.js +39 -0
- package/dist/vite/__tests__/expose-router-id.test.js.map +1 -0
- package/dist/vite/ast-handler-extract.d.ts +49 -0
- package/dist/vite/ast-handler-extract.d.ts.map +1 -0
- package/dist/vite/ast-handler-extract.js +249 -0
- package/dist/vite/ast-handler-extract.js.map +1 -0
- package/dist/vite/expose-action-id.d.ts +19 -0
- package/dist/vite/expose-action-id.d.ts.map +1 -0
- package/dist/vite/expose-action-id.js +250 -0
- package/dist/vite/expose-action-id.js.map +1 -0
- package/dist/vite/expose-id-utils.d.ts +69 -0
- package/dist/vite/expose-id-utils.d.ts.map +1 -0
- package/dist/vite/expose-id-utils.js +289 -0
- package/dist/vite/expose-id-utils.js.map +1 -0
- package/dist/vite/expose-internal-ids.d.ts +22 -0
- package/dist/vite/expose-internal-ids.d.ts.map +1 -0
- package/dist/vite/expose-internal-ids.js +886 -0
- package/dist/vite/expose-internal-ids.js.map +1 -0
- package/dist/vite/index.d.ts +149 -0
- package/dist/vite/index.d.ts.map +1 -0
- package/dist/vite/index.js +5994 -2763
- package/dist/vite/index.js.bak +5448 -0
- package/dist/vite/index.js.map +1 -0
- package/dist/vite/index.named-routes.gen.ts +103 -0
- package/dist/vite/package-resolution.d.ts +43 -0
- package/dist/vite/package-resolution.d.ts.map +1 -0
- package/{src/vite/package-resolution.ts → dist/vite/package-resolution.js} +53 -66
- package/dist/vite/package-resolution.js.map +1 -0
- package/dist/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
- package/dist/vite/virtual-entries.d.ts +25 -0
- package/dist/vite/virtual-entries.d.ts.map +1 -0
- package/{src/vite/virtual-entries.ts → dist/vite/virtual-entries.js} +12 -16
- package/dist/vite/virtual-entries.js.map +1 -0
- package/package.json +64 -54
- package/skills/api-client/SKILL.md +211 -0
- package/skills/breadcrumbs/SKILL.md +252 -0
- package/skills/bundle-analysis/SKILL.md +159 -0
- package/skills/cache-guide/SKILL.md +484 -0
- package/skills/caching/SKILL.md +202 -24
- package/skills/composability/SKILL.md +197 -0
- package/skills/css/SKILL.md +76 -0
- package/skills/debug-manifest/SKILL.md +12 -8
- package/skills/document-cache/SKILL.md +87 -62
- package/skills/fonts/SKILL.md +6 -4
- package/skills/handler-use/SKILL.md +364 -0
- package/skills/hooks/SKILL.md +537 -70
- package/skills/host-router/SKILL.md +264 -0
- package/skills/i18n/SKILL.md +276 -0
- package/skills/intercept/SKILL.md +173 -8
- package/skills/layout/SKILL.md +123 -5
- package/skills/links/SKILL.md +304 -25
- package/skills/loader/SKILL.md +600 -54
- package/skills/middleware/SKILL.md +211 -37
- package/skills/migrate-nextjs/SKILL.md +562 -0
- package/skills/migrate-react-router/SKILL.md +769 -0
- package/skills/mime-routes/SKILL.md +41 -10
- package/skills/observability/SKILL.md +137 -0
- package/skills/parallel/SKILL.md +271 -3
- package/skills/prerender/SKILL.md +413 -52
- package/skills/rango/SKILL.md +301 -21
- package/skills/react-compiler/SKILL.md +168 -0
- package/skills/response-routes/SKILL.md +248 -120
- package/skills/route/SKILL.md +279 -21
- package/skills/router-setup/SKILL.md +211 -33
- package/skills/server-actions/SKILL.md +751 -0
- package/skills/streams-and-websockets/SKILL.md +283 -0
- package/skills/tailwind/SKILL.md +27 -3
- package/skills/theme/SKILL.md +9 -8
- package/skills/typesafety/SKILL.md +547 -107
- package/skills/use-cache/SKILL.md +353 -0
- package/skills/view-transitions/SKILL.md +294 -0
- package/src/__augment-tests__/augment.ts +81 -0
- package/src/__augment-tests__/augmented.check.ts +116 -0
- package/src/__internal.ts +102 -4
- package/src/bin/rango.ts +312 -15
- package/src/browser/action-coordinator.ts +114 -0
- package/src/browser/app-shell.ts +39 -0
- package/src/browser/app-version.ts +14 -0
- package/src/browser/event-controller.ts +172 -128
- package/src/browser/history-state.ts +101 -0
- package/src/browser/index.ts +3 -3
- package/src/browser/intercept-utils.ts +52 -0
- package/src/browser/link-interceptor.ts +24 -4
- package/src/browser/logging.ts +11 -0
- package/src/browser/merge-segment-loaders.ts +20 -12
- package/src/browser/navigation-bridge.ts +309 -562
- package/src/browser/navigation-client.ts +206 -75
- package/src/browser/navigation-store.ts +80 -63
- package/src/browser/navigation-transaction.ts +279 -0
- package/src/browser/network-error-handler.ts +61 -0
- package/src/browser/partial-update.ts +355 -314
- package/src/browser/prefetch/cache.ts +363 -0
- package/src/browser/prefetch/fetch.ts +350 -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 +136 -0
- package/src/browser/react/Link.tsx +255 -71
- package/src/browser/react/NavigationProvider.tsx +153 -33
- package/src/browser/react/context.ts +11 -0
- package/src/browser/react/filter-segment-order.ts +55 -0
- package/src/browser/react/index.ts +15 -12
- package/src/browser/react/location-state-shared.ts +269 -56
- package/src/browser/react/location-state.ts +90 -19
- package/src/browser/react/mount-context.ts +6 -1
- package/src/browser/react/nonce-context.ts +23 -0
- package/src/browser/react/shallow-equal.ts +27 -0
- package/src/browser/react/use-action.ts +29 -51
- package/src/browser/react/use-client-cache.ts +5 -3
- package/src/browser/react/use-handle.ts +41 -123
- package/src/browser/react/use-link-status.ts +6 -5
- package/src/browser/react/use-navigation.ts +44 -65
- package/src/browser/react/use-params.ts +77 -0
- package/src/browser/react/use-pathname.ts +47 -0
- package/src/browser/react/use-reverse.ts +106 -0
- package/src/browser/react/use-router.ts +97 -0
- package/src/browser/react/use-search-params.ts +56 -0
- package/src/browser/react/use-segments.ts +85 -99
- package/src/browser/response-adapter.ts +124 -0
- package/src/browser/rsc-router.tsx +275 -72
- package/src/browser/scroll-restoration.ts +132 -49
- package/src/browser/segment-reconciler.ts +243 -0
- package/src/browser/segment-structure-assert.ts +17 -1
- package/src/browser/server-action-bridge.ts +508 -610
- package/src/browser/shallow.ts +6 -1
- package/src/browser/types.ts +149 -48
- package/src/browser/validate-redirect-origin.ts +29 -0
- package/src/build/collect-fallback-refs.ts +107 -0
- package/src/build/generate-manifest.ts +123 -56
- package/src/build/generate-route-types.ts +41 -1029
- package/src/build/index.ts +4 -0
- package/src/build/prefix-tree-utils.ts +123 -0
- package/src/build/route-trie.ts +127 -31
- package/src/build/route-types/ast-helpers.ts +25 -0
- package/src/build/route-types/ast-route-extraction.ts +98 -0
- package/src/build/route-types/codegen.ts +102 -0
- package/src/build/route-types/include-resolution.ts +418 -0
- package/src/build/route-types/param-extraction.ts +48 -0
- package/src/build/route-types/per-module-writer.ts +131 -0
- package/src/build/route-types/router-processing.ts +659 -0
- package/src/build/route-types/scan-filter.ts +85 -0
- package/src/build/route-types/source-scan.ts +118 -0
- package/src/build/runtime-discovery.ts +220 -0
- package/src/cache/background-task.ts +34 -0
- package/src/cache/cache-key-utils.ts +44 -0
- package/src/cache/cache-policy.ts +125 -0
- package/src/cache/cache-runtime.ts +354 -0
- package/src/cache/cache-scope.ts +170 -308
- package/src/cache/cf/cf-cache-store.ts +696 -30
- package/src/cache/cf/index.ts +13 -3
- package/src/cache/document-cache.ts +116 -77
- package/src/cache/handle-capture.ts +81 -0
- package/src/cache/handle-snapshot.ts +144 -0
- package/src/cache/index.ts +1 -15
- package/src/cache/memory-segment-store.ts +192 -13
- package/src/cache/profile-registry.ts +73 -0
- package/src/cache/read-through-swr.ts +134 -0
- package/src/cache/segment-codec.ts +256 -0
- package/src/cache/taint.ts +153 -0
- package/src/cache/types.ts +78 -124
- package/src/client.rsc.tsx +6 -1
- package/src/client.tsx +117 -322
- package/src/component-utils.ts +4 -4
- package/src/components/DefaultDocument.tsx +5 -1
- package/src/context-var.ts +156 -0
- package/src/debug.ts +19 -9
- package/src/decode-loader-results.ts +36 -0
- package/src/errors.ts +106 -10
- package/src/handle.ts +54 -11
- package/src/handles/MetaTags.tsx +73 -20
- package/src/handles/breadcrumbs.ts +66 -0
- package/src/handles/index.ts +1 -0
- package/src/handles/meta.ts +30 -13
- package/src/host/cookie-handler.ts +21 -15
- package/src/host/errors.ts +8 -8
- package/src/host/index.ts +6 -9
- package/src/host/pattern-matcher.ts +27 -27
- package/src/host/router.ts +176 -82
- package/src/host/testing.ts +8 -8
- package/src/host/types.ts +46 -9
- package/src/host/utils.ts +2 -2
- package/src/href-client.ts +196 -57
- package/src/index.rsc.ts +112 -42
- package/src/index.ts +178 -74
- package/src/internal-debug.ts +9 -3
- package/src/loader-store.ts +500 -0
- package/src/loader.rsc.ts +15 -93
- package/src/loader.ts +20 -10
- package/src/missing-id-error.ts +68 -0
- package/src/network-error-thrower.tsx +3 -1
- package/src/outlet-context.ts +1 -1
- package/src/outlet-provider.tsx +45 -0
- package/src/prerender/param-hash.ts +4 -2
- package/src/prerender/store.ts +125 -18
- package/src/prerender.ts +389 -23
- package/src/response-utils.ts +37 -0
- package/src/reverse.ts +198 -128
- package/src/root-error-boundary.tsx +41 -29
- package/src/route-content-wrapper.tsx +13 -32
- package/src/route-definition/dsl-helpers.ts +1109 -0
- package/src/route-definition/helper-factories.ts +90 -0
- package/src/route-definition/helpers-types.ts +506 -0
- package/src/route-definition/index.ts +55 -0
- package/src/route-definition/redirect.ts +101 -0
- package/src/route-definition/resolve-handler-use.ts +155 -0
- package/src/route-definition/use-item-types.ts +32 -0
- package/src/route-definition.ts +1 -1450
- package/src/route-map-builder.ts +87 -133
- package/src/route-name.ts +53 -0
- package/src/route-types.ts +72 -41
- package/src/router/content-negotiation.ts +228 -0
- package/src/router/debug-manifest.ts +72 -0
- package/src/router/error-handling.ts +10 -10
- package/src/router/find-match.ts +208 -0
- package/src/router/handler-context.ts +372 -125
- package/src/router/intercept-resolution.ts +24 -26
- package/src/router/lazy-includes.ts +256 -0
- package/src/router/loader-resolution.ts +367 -140
- package/src/router/logging.ts +112 -6
- package/src/router/manifest.ts +89 -28
- package/src/router/match-api.ts +175 -238
- package/src/router/match-context.ts +4 -2
- package/src/router/match-handlers.ts +441 -0
- package/src/router/match-middleware/background-revalidation.ts +97 -89
- package/src/router/match-middleware/cache-lookup.ts +289 -54
- package/src/router/match-middleware/cache-store.ts +78 -17
- package/src/router/match-middleware/intercept-resolution.ts +45 -22
- package/src/router/match-middleware/segment-resolution.ts +73 -9
- package/src/router/match-pipelines.ts +10 -45
- package/src/router/match-result.ts +146 -24
- package/src/router/metrics.ts +241 -16
- package/src/router/middleware-cookies.ts +55 -0
- package/src/router/middleware-types.ts +209 -0
- package/src/router/middleware.ts +354 -384
- package/src/router/navigation-snapshot.ts +182 -0
- package/src/router/pattern-matching.ts +279 -44
- package/src/router/prerender-match.ts +527 -0
- package/src/router/preview-match.ts +100 -0
- package/src/router/request-classification.ts +313 -0
- package/src/router/revalidation.ts +163 -16
- package/src/router/route-snapshot.ts +245 -0
- package/src/router/router-context.ts +41 -21
- package/src/router/router-interfaces.ts +500 -0
- package/src/router/router-options.ts +642 -0
- package/src/router/router-registry.ts +21 -0
- package/src/router/segment-resolution/fresh.ts +769 -0
- package/src/router/segment-resolution/helpers.ts +268 -0
- package/src/router/segment-resolution/loader-cache.ts +199 -0
- package/src/router/segment-resolution/revalidation.ts +1420 -0
- package/src/router/segment-resolution/static-store.ts +81 -0
- package/src/router/segment-resolution/view-transition-default.ts +36 -0
- package/src/router/segment-resolution.ts +21 -1354
- package/src/router/segment-wrappers.ts +291 -0
- package/src/router/substitute-pattern-params.ts +56 -0
- package/src/router/telemetry-otel.ts +299 -0
- package/src/router/telemetry.ts +300 -0
- package/src/router/timeout.ts +148 -0
- package/src/router/trie-matching.ts +133 -42
- package/src/router/types.ts +24 -9
- package/src/router/url-params.ts +49 -0
- package/src/router.ts +710 -2373
- package/src/rsc/handler-context.ts +45 -0
- package/src/rsc/handler.ts +821 -1128
- package/src/rsc/helpers.ts +182 -19
- package/src/rsc/index.ts +1 -21
- package/src/rsc/loader-fetch.ts +229 -0
- package/src/rsc/manifest-init.ts +77 -0
- package/src/rsc/nonce.ts +14 -0
- package/src/rsc/origin-guard.ts +161 -0
- package/src/rsc/progressive-enhancement.ts +395 -0
- package/src/rsc/response-error.ts +104 -0
- package/src/rsc/response-route-handler.ts +362 -0
- package/src/rsc/rsc-rendering.ts +240 -0
- package/src/rsc/runtime-warnings.ts +41 -0
- package/src/rsc/server-action.ts +350 -0
- package/src/rsc/ssr-setup.ts +144 -0
- package/src/rsc/types.ts +52 -11
- package/src/search-params.ts +70 -58
- package/src/segment-content-promise.ts +67 -0
- package/src/segment-loader-promise.ts +122 -0
- package/src/segment-system.tsx +237 -73
- package/src/serialize.ts +243 -0
- package/src/server/context.ts +439 -85
- package/src/server/cookie-store.ts +214 -0
- package/src/server/fetchable-loader-store.ts +11 -6
- package/src/server/handle-store.ts +113 -15
- package/src/server/loader-registry.ts +24 -64
- package/src/server/request-context.ts +640 -107
- package/src/server.ts +26 -164
- package/src/ssr/index.tsx +107 -30
- package/src/static-handler.ts +39 -9
- package/src/theme/ThemeProvider.tsx +21 -15
- package/src/theme/ThemeScript.tsx +5 -5
- package/src/theme/constants.ts +5 -2
- package/src/theme/index.ts +4 -14
- package/src/theme/theme-context.ts +4 -30
- package/src/theme/theme-script.ts +21 -18
- package/src/types/boundaries.ts +158 -0
- package/src/types/cache-types.ts +198 -0
- package/src/types/error-types.ts +192 -0
- package/src/types/global-namespace.ts +113 -0
- package/src/types/handler-context.ts +809 -0
- package/src/types/index.ts +89 -0
- package/src/types/loader-types.ts +212 -0
- package/src/types/request-scope.ts +126 -0
- package/src/types/route-config.ts +170 -0
- package/src/types/route-entry.ts +120 -0
- package/src/types/segments.ts +184 -0
- package/src/types.ts +1 -1795
- package/src/urls/include-helper.ts +164 -0
- package/src/urls/index.ts +49 -0
- package/src/urls/path-helper-types.ts +386 -0
- package/src/urls/path-helper.ts +329 -0
- package/src/urls/pattern-types.ts +124 -0
- package/src/urls/response-types.ts +109 -0
- package/src/urls/type-extraction.ts +291 -0
- package/src/urls/urls-function.ts +94 -0
- package/src/urls.ts +1 -1323
- package/src/use-loader.tsx +559 -108
- package/src/vite/debug.ts +185 -0
- package/src/vite/discovery/bundle-postprocess.ts +181 -0
- package/src/vite/discovery/discover-routers.ts +379 -0
- package/src/vite/discovery/discovery-errors.ts +194 -0
- package/src/vite/discovery/gate-state.ts +171 -0
- package/src/vite/discovery/prerender-collection.ts +480 -0
- package/src/vite/discovery/route-types-writer.ts +214 -0
- package/src/vite/discovery/self-gen-tracking.ts +73 -0
- package/src/vite/discovery/state.ts +150 -0
- package/src/vite/discovery/virtual-module-codegen.ts +193 -0
- package/src/vite/index.ts +17 -2261
- package/src/vite/plugin-types.ts +170 -0
- package/src/vite/plugins/cjs-to-esm.ts +94 -0
- package/src/vite/plugins/client-ref-dedup.ts +131 -0
- package/src/vite/plugins/client-ref-hashing.ts +128 -0
- package/src/vite/plugins/cloudflare-protocol-loader-hook.d.mts +23 -0
- package/src/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
- package/src/vite/plugins/cloudflare-protocol-stub.ts +214 -0
- package/src/vite/{expose-action-id.ts → plugins/expose-action-id.ts} +109 -60
- package/src/vite/{expose-id-utils.ts → plugins/expose-id-utils.ts} +32 -51
- package/src/vite/plugins/expose-ids/export-analysis.ts +376 -0
- package/src/vite/plugins/expose-ids/handler-transform.ts +156 -0
- package/src/vite/plugins/expose-ids/loader-transform.ts +72 -0
- package/src/vite/plugins/expose-ids/router-transform.ts +127 -0
- package/src/vite/plugins/expose-ids/types.ts +45 -0
- package/src/vite/plugins/expose-internal-ids.ts +796 -0
- package/src/vite/plugins/performance-tracks.ts +92 -0
- package/src/vite/plugins/refresh-cmd.ts +127 -0
- package/src/vite/plugins/use-cache-transform.ts +338 -0
- package/src/vite/plugins/version-injector.ts +99 -0
- package/src/vite/plugins/version-plugin.ts +323 -0
- package/src/vite/plugins/virtual-entries.ts +123 -0
- package/src/vite/plugins/virtual-stub-plugin.ts +29 -0
- package/src/vite/rango.ts +549 -0
- package/src/vite/router-discovery.ts +1567 -0
- package/src/vite/{ast-handler-extract.ts → utils/ast-handler-extract.ts} +194 -22
- package/src/vite/utils/banner.ts +36 -0
- package/src/vite/utils/bundle-analysis.ts +139 -0
- package/src/vite/utils/client-chunks.ts +190 -0
- package/src/vite/utils/forward-user-plugins.ts +193 -0
- package/src/vite/utils/manifest-utils.ts +19 -0
- package/src/vite/utils/package-resolution.ts +161 -0
- package/src/vite/utils/prerender-utils.ts +222 -0
- package/src/vite/utils/shared-utils.ts +251 -0
- package/CLAUDE.md +0 -43
- package/src/browser/lru-cache.ts +0 -69
- package/src/browser/request-controller.ts +0 -164
- package/src/cache/memory-store.ts +0 -253
- package/src/router.gen.ts +0 -6
- package/src/static-handler.gen.ts +0 -5
- package/src/urls.gen.ts +0 -8
- package/src/vite/expose-internal-ids.ts +0 -1167
- /package/src/vite/{version.d.ts → plugins/version.d.ts} +0 -0
|
@@ -12,6 +12,7 @@ import type {
|
|
|
12
12
|
ActionStateListener,
|
|
13
13
|
HandleData,
|
|
14
14
|
} from "./types.js";
|
|
15
|
+
import { clearPrefetchCache } from "./prefetch/cache.js";
|
|
15
16
|
|
|
16
17
|
/**
|
|
17
18
|
* Default action state (idle with no payload)
|
|
@@ -27,9 +28,15 @@ const DEFAULT_ACTION_STATE: TrackedActionState = {
|
|
|
27
28
|
// Maximum number of history entries to cache (URLs visited)
|
|
28
29
|
const HISTORY_CACHE_SIZE = 20;
|
|
29
30
|
|
|
30
|
-
// Cache entry: [url-key, segments, stale, handleData?]
|
|
31
|
+
// Cache entry: [url-key, segments, stale, handleData?, routerId?]
|
|
31
32
|
// stale=true means the data may be outdated and should be revalidated on access
|
|
32
|
-
type HistoryCacheEntry = [
|
|
33
|
+
type HistoryCacheEntry = [
|
|
34
|
+
string,
|
|
35
|
+
ResolvedSegment[],
|
|
36
|
+
boolean,
|
|
37
|
+
HandleData?,
|
|
38
|
+
string?,
|
|
39
|
+
];
|
|
33
40
|
|
|
34
41
|
/**
|
|
35
42
|
* Shallow clone handleData to avoid reference sharing between cache entries.
|
|
@@ -88,7 +95,7 @@ export interface HistoryKeyOptions {
|
|
|
88
95
|
*/
|
|
89
96
|
export function generateHistoryKey(
|
|
90
97
|
url?: string,
|
|
91
|
-
options?: HistoryKeyOptions
|
|
98
|
+
options?: HistoryKeyOptions,
|
|
92
99
|
): string {
|
|
93
100
|
if (!url) {
|
|
94
101
|
url = typeof window !== "undefined" ? window.location.href : "/";
|
|
@@ -182,7 +189,7 @@ function createLocation(loc: { href: string }): NavigationLocation {
|
|
|
182
189
|
* ```
|
|
183
190
|
*/
|
|
184
191
|
export function createNavigationStore(
|
|
185
|
-
config?: NavigationStoreConfig
|
|
192
|
+
config?: NavigationStoreConfig,
|
|
186
193
|
): NavigationStore {
|
|
187
194
|
// Default location from window or config
|
|
188
195
|
const defaultLocation: NavigationLocation =
|
|
@@ -257,6 +264,11 @@ export function createNavigationStore(
|
|
|
257
264
|
// Used to maintain intercept context during action revalidation
|
|
258
265
|
let interceptSourceUrl: string | null = null;
|
|
259
266
|
|
|
267
|
+
// Router identity - tracks which router is currently active.
|
|
268
|
+
// When this changes on a partial response, the client forces a full
|
|
269
|
+
// tree replacement instead of reconciling with stale segments.
|
|
270
|
+
let currentRouterId: string | undefined;
|
|
271
|
+
|
|
260
272
|
// Action state tracking (for useAction hook)
|
|
261
273
|
// Maps action function ID to its tracked state
|
|
262
274
|
const actionStates = new Map<string, TrackedActionState>();
|
|
@@ -268,18 +280,17 @@ export function createNavigationStore(
|
|
|
268
280
|
/**
|
|
269
281
|
* Create a debounced function that batches rapid calls
|
|
270
282
|
*/
|
|
283
|
+
// A non-keyed notifier is the keyed one restricted to a single constant key;
|
|
284
|
+
// its own keyed instance means the "" key never collides with action keys.
|
|
271
285
|
function createDebouncedNotifier<T extends (...args: any[]) => void>(
|
|
272
286
|
fn: T,
|
|
273
|
-
ms: number = 20
|
|
287
|
+
ms: number = 20,
|
|
274
288
|
): T {
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
fn(...args);
|
|
281
|
-
}, ms);
|
|
282
|
-
}) as T;
|
|
289
|
+
const keyed = createKeyedDebouncedNotifier(
|
|
290
|
+
(_key: string, ...args: any[]) => fn(...args),
|
|
291
|
+
ms,
|
|
292
|
+
);
|
|
293
|
+
return ((...args: Parameters<T>) => keyed("", ...args)) as T;
|
|
283
294
|
}
|
|
284
295
|
|
|
285
296
|
/**
|
|
@@ -297,7 +308,7 @@ export function createNavigationStore(
|
|
|
297
308
|
setTimeout(() => {
|
|
298
309
|
timeouts.delete(key);
|
|
299
310
|
fn(key, ...args);
|
|
300
|
-
}, ms)
|
|
311
|
+
}, ms),
|
|
301
312
|
);
|
|
302
313
|
}) as T;
|
|
303
314
|
}
|
|
@@ -312,7 +323,7 @@ export function createNavigationStore(
|
|
|
312
323
|
if (listeners) {
|
|
313
324
|
listeners.forEach((listener) => listener(state));
|
|
314
325
|
}
|
|
315
|
-
}
|
|
326
|
+
},
|
|
316
327
|
);
|
|
317
328
|
|
|
318
329
|
/**
|
|
@@ -320,6 +331,7 @@ export function createNavigationStore(
|
|
|
320
331
|
*/
|
|
321
332
|
function clearCacheInternal(): void {
|
|
322
333
|
historyCache.length = 0;
|
|
334
|
+
clearPrefetchCache();
|
|
323
335
|
}
|
|
324
336
|
|
|
325
337
|
/**
|
|
@@ -329,13 +341,13 @@ export function createNavigationStore(
|
|
|
329
341
|
for (let i = 0; i < historyCache.length; i++) {
|
|
330
342
|
historyCache[i][2] = true;
|
|
331
343
|
}
|
|
344
|
+
clearPrefetchCache();
|
|
332
345
|
}
|
|
333
346
|
|
|
334
347
|
/**
|
|
335
348
|
* Clear the history cache and broadcast to other tabs
|
|
336
349
|
*/
|
|
337
350
|
function clearCacheAndBroadcast(): void {
|
|
338
|
-
console.log("[Browser] Clearing cache and broadcasting to other tabs");
|
|
339
351
|
clearCacheInternal();
|
|
340
352
|
broadcastInvalidation();
|
|
341
353
|
}
|
|
@@ -344,9 +356,6 @@ export function createNavigationStore(
|
|
|
344
356
|
* Mark cache as stale and broadcast to other tabs
|
|
345
357
|
*/
|
|
346
358
|
function markStaleAndBroadcast(): void {
|
|
347
|
-
console.log(
|
|
348
|
-
"[Browser] Marking cache as stale and broadcasting to other tabs"
|
|
349
|
-
);
|
|
350
359
|
markCacheAsStaleInternal();
|
|
351
360
|
broadcastInvalidation();
|
|
352
361
|
}
|
|
@@ -369,14 +378,6 @@ export function createNavigationStore(
|
|
|
369
378
|
path: currentPath,
|
|
370
379
|
segmentIds: currentSegmentIds,
|
|
371
380
|
});
|
|
372
|
-
console.log(
|
|
373
|
-
"[Browser] Broadcast sent for path:",
|
|
374
|
-
currentPath,
|
|
375
|
-
"segments:",
|
|
376
|
-
currentSegmentIds.join(", ")
|
|
377
|
-
);
|
|
378
|
-
} else {
|
|
379
|
-
console.warn("[Browser] No BroadcastChannel available");
|
|
380
381
|
}
|
|
381
382
|
}
|
|
382
383
|
|
|
@@ -393,7 +394,7 @@ export function createNavigationStore(
|
|
|
393
394
|
// Check for shared segments between tabs
|
|
394
395
|
// Routes sharing any segment (layout, loader, etc.) should invalidate together
|
|
395
396
|
const hasSharedSegment = mutatedSegmentIds.some((id) =>
|
|
396
|
-
currentSegmentIds.includes(id)
|
|
397
|
+
currentSegmentIds.includes(id),
|
|
397
398
|
);
|
|
398
399
|
|
|
399
400
|
if (!hasSharedSegment) {
|
|
@@ -401,34 +402,21 @@ export function createNavigationStore(
|
|
|
401
402
|
return;
|
|
402
403
|
}
|
|
403
404
|
|
|
404
|
-
console.log(
|
|
405
|
-
"[Browser] Cache marked stale by another tab, shared segments:",
|
|
406
|
-
mutatedSegmentIds
|
|
407
|
-
.filter((id) => currentSegmentIds.includes(id))
|
|
408
|
-
.join(", ")
|
|
409
|
-
);
|
|
410
405
|
markCacheAsStaleInternal();
|
|
411
406
|
|
|
412
407
|
// Auto-refresh if enabled and callback is registered
|
|
413
408
|
if (crossTabAutoRefresh && crossTabRefreshCallback) {
|
|
414
409
|
// If idle, refresh immediately. If loading, wait for idle then refresh.
|
|
415
410
|
if (navState.state === "idle") {
|
|
416
|
-
console.log("[Browser] Cross-tab refresh triggered (idle)");
|
|
417
411
|
crossTabRefreshCallback();
|
|
418
412
|
} else if (!pendingCrossTabRefresh) {
|
|
419
413
|
// Only queue one refresh, ignore subsequent events while loading
|
|
420
414
|
pendingCrossTabRefresh = true;
|
|
421
|
-
console.log(
|
|
422
|
-
"[Browser] Navigation in progress, deferring cross-tab refresh"
|
|
423
|
-
);
|
|
424
415
|
// Subscribe to state changes, refresh when idle
|
|
425
416
|
const listener: StateListener = () => {
|
|
426
417
|
if (navState.state === "idle") {
|
|
427
418
|
stateListeners.delete(listener);
|
|
428
419
|
pendingCrossTabRefresh = false;
|
|
429
|
-
console.log(
|
|
430
|
-
"[Browser] Cross-tab refresh triggered (deferred)"
|
|
431
|
-
);
|
|
432
420
|
crossTabRefreshCallback?.();
|
|
433
421
|
}
|
|
434
422
|
};
|
|
@@ -574,7 +562,7 @@ export function createNavigationStore(
|
|
|
574
562
|
cacheSegmentsForHistory(
|
|
575
563
|
historyKey: string,
|
|
576
564
|
segments: ResolvedSegment[],
|
|
577
|
-
handleData?: HandleData
|
|
565
|
+
handleData?: HandleData,
|
|
578
566
|
): void {
|
|
579
567
|
// Shallow clone handleData arrays to avoid reference sharing between cache entries
|
|
580
568
|
// We only clone the structure (objects and arrays), not the data items themselves,
|
|
@@ -585,13 +573,25 @@ export function createNavigationStore(
|
|
|
585
573
|
|
|
586
574
|
// Check if entry already exists and update it
|
|
587
575
|
const existingIndex = historyCache.findIndex(
|
|
588
|
-
([key]) => key === historyKey
|
|
576
|
+
([key]) => key === historyKey,
|
|
589
577
|
);
|
|
590
578
|
if (existingIndex !== -1) {
|
|
591
|
-
historyCache[existingIndex] = [
|
|
579
|
+
historyCache[existingIndex] = [
|
|
580
|
+
historyKey,
|
|
581
|
+
segments,
|
|
582
|
+
false,
|
|
583
|
+
clonedHandleData,
|
|
584
|
+
currentRouterId,
|
|
585
|
+
];
|
|
592
586
|
} else {
|
|
593
587
|
// Add new entry at the end (not stale)
|
|
594
|
-
historyCache.push([
|
|
588
|
+
historyCache.push([
|
|
589
|
+
historyKey,
|
|
590
|
+
segments,
|
|
591
|
+
false,
|
|
592
|
+
clonedHandleData,
|
|
593
|
+
currentRouterId,
|
|
594
|
+
]);
|
|
595
595
|
// Remove oldest entries if over limit
|
|
596
596
|
while (historyCache.length > cacheSize) {
|
|
597
597
|
historyCache.shift();
|
|
@@ -603,12 +603,22 @@ export function createNavigationStore(
|
|
|
603
603
|
* Get cached segments for a history entry
|
|
604
604
|
* Returns { segments, stale, handleData } or undefined if not cached
|
|
605
605
|
*/
|
|
606
|
-
getCachedSegments(
|
|
607
|
-
|
|
608
|
-
|
|
606
|
+
getCachedSegments(historyKey: string):
|
|
607
|
+
| {
|
|
608
|
+
segments: ResolvedSegment[];
|
|
609
|
+
stale: boolean;
|
|
610
|
+
handleData?: HandleData;
|
|
611
|
+
routerId?: string;
|
|
612
|
+
}
|
|
613
|
+
| undefined {
|
|
609
614
|
const entry = historyCache.find(([key]) => key === historyKey);
|
|
610
615
|
if (!entry) return undefined;
|
|
611
|
-
return {
|
|
616
|
+
return {
|
|
617
|
+
segments: entry[1],
|
|
618
|
+
stale: entry[2],
|
|
619
|
+
handleData: entry[3],
|
|
620
|
+
routerId: entry[4],
|
|
621
|
+
};
|
|
612
622
|
},
|
|
613
623
|
|
|
614
624
|
/**
|
|
@@ -625,13 +635,19 @@ export function createNavigationStore(
|
|
|
625
635
|
*/
|
|
626
636
|
updateCacheHandleData(historyKey: string, handleData: HandleData): void {
|
|
627
637
|
const existingIndex = historyCache.findIndex(
|
|
628
|
-
([key]) => key === historyKey
|
|
638
|
+
([key]) => key === historyKey,
|
|
629
639
|
);
|
|
630
640
|
if (existingIndex !== -1) {
|
|
631
641
|
const entry = historyCache[existingIndex];
|
|
632
642
|
// Shallow clone handleData arrays to avoid reference sharing
|
|
633
643
|
const clonedHandleData = cloneHandleData(handleData);
|
|
634
|
-
historyCache[existingIndex] = [
|
|
644
|
+
historyCache[existingIndex] = [
|
|
645
|
+
entry[0],
|
|
646
|
+
entry[1],
|
|
647
|
+
entry[2],
|
|
648
|
+
clonedHandleData,
|
|
649
|
+
entry[4], // preserve routerId
|
|
650
|
+
];
|
|
635
651
|
}
|
|
636
652
|
},
|
|
637
653
|
|
|
@@ -640,14 +656,7 @@ export function createNavigationStore(
|
|
|
640
656
|
* Called after server actions to indicate data may be outdated
|
|
641
657
|
*/
|
|
642
658
|
markCacheAsStale(): void {
|
|
643
|
-
|
|
644
|
-
historyCache[i][2] = true;
|
|
645
|
-
}
|
|
646
|
-
console.log(
|
|
647
|
-
"[Browser] Marked",
|
|
648
|
-
historyCache.length,
|
|
649
|
-
"cache entries as stale"
|
|
650
|
-
);
|
|
659
|
+
markCacheAsStaleInternal();
|
|
651
660
|
},
|
|
652
661
|
|
|
653
662
|
/**
|
|
@@ -704,6 +713,14 @@ export function createNavigationStore(
|
|
|
704
713
|
interceptSourceUrl = url;
|
|
705
714
|
},
|
|
706
715
|
|
|
716
|
+
getRouterId(): string | undefined {
|
|
717
|
+
return currentRouterId;
|
|
718
|
+
},
|
|
719
|
+
|
|
720
|
+
setRouterId(id: string): void {
|
|
721
|
+
currentRouterId = id;
|
|
722
|
+
},
|
|
723
|
+
|
|
707
724
|
// ========================================================================
|
|
708
725
|
// UI Update Notifications
|
|
709
726
|
// ========================================================================
|
|
@@ -745,7 +762,7 @@ export function createNavigationStore(
|
|
|
745
762
|
*/
|
|
746
763
|
setActionState(
|
|
747
764
|
actionId: string,
|
|
748
|
-
partial: Partial<TrackedActionState
|
|
765
|
+
partial: Partial<TrackedActionState>,
|
|
749
766
|
): void {
|
|
750
767
|
const current = actionStates.get(actionId) ?? { ...DEFAULT_ACTION_STATE };
|
|
751
768
|
const updated: TrackedActionState = {
|
|
@@ -763,7 +780,7 @@ export function createNavigationStore(
|
|
|
763
780
|
*/
|
|
764
781
|
subscribeToAction(
|
|
765
782
|
actionId: string,
|
|
766
|
-
listener: ActionStateListener
|
|
783
|
+
listener: ActionStateListener,
|
|
767
784
|
): () => void {
|
|
768
785
|
let listeners = actionListeners.get(actionId);
|
|
769
786
|
if (!listeners) {
|
|
@@ -793,7 +810,7 @@ let storeInstance: NavigationStore | null = null;
|
|
|
793
810
|
* Subsequent calls return the existing instance.
|
|
794
811
|
*/
|
|
795
812
|
export function initNavigationStore(
|
|
796
|
-
config?: NavigationStoreConfig
|
|
813
|
+
config?: NavigationStoreConfig,
|
|
797
814
|
): NavigationStore {
|
|
798
815
|
if (!storeInstance) {
|
|
799
816
|
storeInstance = createNavigationStore(config);
|
|
@@ -809,7 +826,7 @@ export function initNavigationStore(
|
|
|
809
826
|
export function getNavigationStore(): NavigationStore {
|
|
810
827
|
if (!storeInstance) {
|
|
811
828
|
throw new Error(
|
|
812
|
-
"Navigation store not initialized. Call initNavigationStore first."
|
|
829
|
+
"Navigation store not initialized. Call initNavigationStore first.",
|
|
813
830
|
);
|
|
814
831
|
}
|
|
815
832
|
return storeInstance;
|
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
NavigateOptions,
|
|
3
|
+
NavigationStore,
|
|
4
|
+
ResolvedSegment,
|
|
5
|
+
StreamingToken,
|
|
6
|
+
} from "./types.js";
|
|
7
|
+
import { generateHistoryKey } from "./navigation-store.js";
|
|
8
|
+
import {
|
|
9
|
+
handleNavigationStart,
|
|
10
|
+
ensureHistoryKey,
|
|
11
|
+
} from "./scroll-restoration.js";
|
|
12
|
+
import type { EventController, NavigationHandle } from "./event-controller.js";
|
|
13
|
+
import { debugLog } from "./logging.js";
|
|
14
|
+
import { buildHistoryState, pushHistoryWithIdx } from "./history-state.js";
|
|
15
|
+
|
|
16
|
+
// Re-export for consumers that import from navigation-transaction
|
|
17
|
+
export { resolveNavigationState } from "./history-state.js";
|
|
18
|
+
|
|
19
|
+
/** Check if a history state object contains location state keys. */
|
|
20
|
+
function hasLocationState(state: unknown): boolean {
|
|
21
|
+
if (!state || typeof state !== "object") return false;
|
|
22
|
+
return (
|
|
23
|
+
"state" in state ||
|
|
24
|
+
Object.keys(state).some((k) => k.startsWith("__rsc_ls_"))
|
|
25
|
+
);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// Polyfill Symbol.dispose for Safari and older browsers
|
|
29
|
+
if (typeof Symbol.dispose === "undefined") {
|
|
30
|
+
(Symbol as any).dispose = Symbol("Symbol.dispose");
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Options for committing a navigation transaction
|
|
35
|
+
*/
|
|
36
|
+
interface CommitOptions {
|
|
37
|
+
url: string;
|
|
38
|
+
segmentIds: string[];
|
|
39
|
+
segments: ResolvedSegment[];
|
|
40
|
+
replace?: boolean;
|
|
41
|
+
scroll?: boolean;
|
|
42
|
+
/** User-provided state to store in history.state */
|
|
43
|
+
state?: unknown;
|
|
44
|
+
/** If true, only update store without changing URL/history (for server actions) */
|
|
45
|
+
storeOnly?: boolean;
|
|
46
|
+
/** If true, this is an intercept route - store in history.state for popstate handling */
|
|
47
|
+
intercept?: boolean;
|
|
48
|
+
/** Source URL where the intercept was triggered from (stored in history.state) */
|
|
49
|
+
interceptSourceUrl?: string;
|
|
50
|
+
/** If true, only update cache without touching store or history (for background stale revalidation) */
|
|
51
|
+
cacheOnly?: boolean;
|
|
52
|
+
/** Server-set location state to merge into history.pushState */
|
|
53
|
+
serverState?: Record<string, unknown>;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Options that can override the pre-configured commit settings
|
|
58
|
+
*/
|
|
59
|
+
interface BoundCommitOverrides {
|
|
60
|
+
/** Override scroll behavior (e.g., disable for intercepts) */
|
|
61
|
+
scroll?: boolean;
|
|
62
|
+
/** Override replace behavior (e.g., force replace for intercepts) */
|
|
63
|
+
replace?: boolean;
|
|
64
|
+
/** Override user-provided state */
|
|
65
|
+
state?: unknown;
|
|
66
|
+
/** Mark this as an intercept route */
|
|
67
|
+
intercept?: boolean;
|
|
68
|
+
/** Source URL where intercept was triggered from */
|
|
69
|
+
interceptSourceUrl?: string;
|
|
70
|
+
/** If true, only update cache (for stale revalidation) */
|
|
71
|
+
cacheOnly?: boolean;
|
|
72
|
+
/** Server-set location state to merge into history.pushState */
|
|
73
|
+
serverState?: Record<string, unknown>;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Bound transaction with pre-configured commit options (without segmentIds/segments)
|
|
78
|
+
*/
|
|
79
|
+
export interface BoundTransaction {
|
|
80
|
+
readonly currentUrl: string;
|
|
81
|
+
/** Start streaming and get a token to end it when the stream completes */
|
|
82
|
+
startStreaming(): StreamingToken;
|
|
83
|
+
/** Commit the navigation. Returns the effective scroll option for the caller to handle. */
|
|
84
|
+
commit(
|
|
85
|
+
segmentIds: string[],
|
|
86
|
+
segments: ResolvedSegment[],
|
|
87
|
+
overrides?: BoundCommitOverrides,
|
|
88
|
+
): { scroll?: boolean };
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* Navigation transaction for managing state during navigation
|
|
93
|
+
* Uses the event controller handle for lifecycle management
|
|
94
|
+
*/
|
|
95
|
+
interface NavigationTransaction extends Disposable {
|
|
96
|
+
commit(options: CommitOptions): { scroll?: boolean };
|
|
97
|
+
with(
|
|
98
|
+
options: Omit<CommitOptions, "segmentIds" | "segments">,
|
|
99
|
+
): BoundTransaction;
|
|
100
|
+
/** The navigation handle from the event controller */
|
|
101
|
+
handle: NavigationHandle;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* Creates a navigation transaction that coordinates with the event controller.
|
|
106
|
+
* Handles loading state transitions and cleanup on completion/abort.
|
|
107
|
+
*/
|
|
108
|
+
export function createNavigationTransaction(
|
|
109
|
+
store: NavigationStore,
|
|
110
|
+
eventController: EventController,
|
|
111
|
+
url: string,
|
|
112
|
+
options?: NavigateOptions & { skipLoadingState?: boolean },
|
|
113
|
+
): NavigationTransaction {
|
|
114
|
+
let committed = false;
|
|
115
|
+
const currentUrl = window.location.href;
|
|
116
|
+
|
|
117
|
+
// Start navigation in event controller (this sets loading state)
|
|
118
|
+
const handle = eventController.startNavigation(url, options);
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* Commit the navigation - updates store and URL atomically
|
|
122
|
+
*/
|
|
123
|
+
function commit(opts: CommitOptions): { scroll?: boolean } {
|
|
124
|
+
committed = true;
|
|
125
|
+
|
|
126
|
+
const {
|
|
127
|
+
url,
|
|
128
|
+
segmentIds,
|
|
129
|
+
segments,
|
|
130
|
+
replace,
|
|
131
|
+
scroll,
|
|
132
|
+
storeOnly,
|
|
133
|
+
intercept,
|
|
134
|
+
interceptSourceUrl,
|
|
135
|
+
cacheOnly,
|
|
136
|
+
serverState,
|
|
137
|
+
} = opts;
|
|
138
|
+
|
|
139
|
+
const parsedUrl = new URL(url, window.location.origin);
|
|
140
|
+
|
|
141
|
+
// Generate history key from URL (with intercept suffix for separate caching)
|
|
142
|
+
const historyKey = generateHistoryKey(url, { intercept });
|
|
143
|
+
|
|
144
|
+
// For cache-only commits (stale revalidation), only update cache and return
|
|
145
|
+
// Don't touch store state or history - user may have navigated elsewhere
|
|
146
|
+
if (cacheOnly) {
|
|
147
|
+
const currentHandleData = eventController.getHandleState().data;
|
|
148
|
+
store.cacheSegmentsForHistory(historyKey, segments, currentHandleData);
|
|
149
|
+
// Complete the navigation handle so currentNavigation is cleared.
|
|
150
|
+
// Without this, the entry lingers and weakens state-machine invariants.
|
|
151
|
+
handle.complete(parsedUrl);
|
|
152
|
+
debugLog("[Browser] Cache-only commit, historyKey:", historyKey);
|
|
153
|
+
return { scroll: false };
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
// Save current scroll position before navigating
|
|
157
|
+
handleNavigationStart();
|
|
158
|
+
|
|
159
|
+
// Update segment state atomically
|
|
160
|
+
store.setSegmentIds(segmentIds);
|
|
161
|
+
store.setCurrentUrl(url);
|
|
162
|
+
store.setPath(parsedUrl.pathname);
|
|
163
|
+
|
|
164
|
+
store.setHistoryKey(historyKey);
|
|
165
|
+
|
|
166
|
+
// Cache segments with current handleData for this history entry
|
|
167
|
+
const currentHandleData = eventController.getHandleState().data;
|
|
168
|
+
store.cacheSegmentsForHistory(historyKey, segments, currentHandleData);
|
|
169
|
+
|
|
170
|
+
// For server actions, skip URL/history updates but still complete navigation
|
|
171
|
+
if (storeOnly) {
|
|
172
|
+
debugLog("[Browser] Store updated (action)");
|
|
173
|
+
// Complete navigation to clear loading state
|
|
174
|
+
handle.complete(parsedUrl);
|
|
175
|
+
return { scroll: false };
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
// Build history state - include user state, intercept info, and server-set state
|
|
179
|
+
const historyState = buildHistoryState(
|
|
180
|
+
opts.state,
|
|
181
|
+
{ intercept, sourceUrl: interceptSourceUrl },
|
|
182
|
+
serverState,
|
|
183
|
+
);
|
|
184
|
+
|
|
185
|
+
// Snapshot old state before pushState/replaceState overwrites it.
|
|
186
|
+
// Used to detect when location state is being cleared.
|
|
187
|
+
const oldState = window.history.state;
|
|
188
|
+
|
|
189
|
+
// Update browser URL (stamps history.state.idx for back() first-entry detection)
|
|
190
|
+
pushHistoryWithIdx(historyState, url, replace ?? false);
|
|
191
|
+
// Ensure new history entry has a scroll restoration key
|
|
192
|
+
ensureHistoryKey();
|
|
193
|
+
|
|
194
|
+
// Notify location state hooks when either old or new state carries
|
|
195
|
+
// location state. This covers both "set new state" and "clear old state"
|
|
196
|
+
// for same-page navigations where components don't remount.
|
|
197
|
+
if (hasLocationState(oldState) || hasLocationState(historyState)) {
|
|
198
|
+
window.dispatchEvent(new Event("__rsc_locationstate"));
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
// Complete the navigation in event controller (sets idle state, updates location)
|
|
202
|
+
handle.complete(parsedUrl);
|
|
203
|
+
|
|
204
|
+
// NOTE: Scroll is NOT handled here. The caller (partial-update.ts) handles
|
|
205
|
+
// scroll AFTER onUpdate() so React has the new content before we scroll.
|
|
206
|
+
|
|
207
|
+
debugLog(
|
|
208
|
+
"[Browser] Navigation committed, historyKey:",
|
|
209
|
+
historyKey,
|
|
210
|
+
intercept ? "(intercept)" : "",
|
|
211
|
+
);
|
|
212
|
+
|
|
213
|
+
return { scroll };
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
return {
|
|
217
|
+
handle,
|
|
218
|
+
commit,
|
|
219
|
+
|
|
220
|
+
/**
|
|
221
|
+
* Create a bound transaction with pre-configured URL options
|
|
222
|
+
* segmentIds and segments provided at commit time (after they're resolved)
|
|
223
|
+
*/
|
|
224
|
+
with(
|
|
225
|
+
opts: Omit<CommitOptions, "segmentIds" | "segments">,
|
|
226
|
+
): BoundTransaction {
|
|
227
|
+
return {
|
|
228
|
+
get currentUrl() {
|
|
229
|
+
return currentUrl;
|
|
230
|
+
},
|
|
231
|
+
startStreaming() {
|
|
232
|
+
return handle.startStreaming();
|
|
233
|
+
},
|
|
234
|
+
commit: (
|
|
235
|
+
segmentIds: string[],
|
|
236
|
+
segments: ResolvedSegment[],
|
|
237
|
+
overrides?: BoundCommitOverrides,
|
|
238
|
+
) => {
|
|
239
|
+
const finalScroll = overrides?.scroll ?? opts.scroll;
|
|
240
|
+
const finalReplace = overrides?.replace ?? opts.replace;
|
|
241
|
+
const intercept = overrides?.intercept ?? opts.intercept;
|
|
242
|
+
const interceptSourceUrl =
|
|
243
|
+
overrides?.interceptSourceUrl ?? opts.interceptSourceUrl;
|
|
244
|
+
const cacheOnly = overrides?.cacheOnly ?? opts.cacheOnly;
|
|
245
|
+
// state is `unknown` (null is meaningful) so `??` would wrongly drop a
|
|
246
|
+
// null override; serverState always comes from overrides, never opts.
|
|
247
|
+
const state =
|
|
248
|
+
overrides?.state !== undefined ? overrides.state : opts.state;
|
|
249
|
+
const serverState = overrides?.serverState;
|
|
250
|
+
return commit({
|
|
251
|
+
...opts,
|
|
252
|
+
segmentIds,
|
|
253
|
+
segments,
|
|
254
|
+
scroll: finalScroll,
|
|
255
|
+
replace: finalReplace,
|
|
256
|
+
state,
|
|
257
|
+
intercept,
|
|
258
|
+
interceptSourceUrl,
|
|
259
|
+
cacheOnly,
|
|
260
|
+
serverState,
|
|
261
|
+
});
|
|
262
|
+
},
|
|
263
|
+
};
|
|
264
|
+
},
|
|
265
|
+
|
|
266
|
+
[Symbol.dispose]() {
|
|
267
|
+
// Superseded: another navigation took over.
|
|
268
|
+
if (handle.signal.aborted) {
|
|
269
|
+
return;
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
// Failed (not committed): keep the target URL -- the error UI owns it.
|
|
273
|
+
// Just reset the event controller to idle.
|
|
274
|
+
if (!committed) {
|
|
275
|
+
handle[Symbol.dispose]();
|
|
276
|
+
}
|
|
277
|
+
},
|
|
278
|
+
};
|
|
279
|
+
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { NetworkError, isNetworkError } from "../errors.js";
|
|
2
|
+
import { NetworkErrorThrower } from "../network-error-thrower.js";
|
|
3
|
+
import type { UpdateSubscriber } from "./types.js";
|
|
4
|
+
import { createElement, startTransition } from "react";
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Convert an unknown error to a NetworkError, or return null if not network-related.
|
|
8
|
+
*
|
|
9
|
+
* Pure function: extracts the "is this a network error?" decision from
|
|
10
|
+
* navigation-bridge and server-action-bridge so it can be unit tested.
|
|
11
|
+
*/
|
|
12
|
+
export function toNetworkError(
|
|
13
|
+
error: unknown,
|
|
14
|
+
context: { url: string; operation: "action" | "navigation" | "revalidation" },
|
|
15
|
+
): NetworkError | null {
|
|
16
|
+
if (error instanceof NetworkError) return error;
|
|
17
|
+
if (isNetworkError(error)) {
|
|
18
|
+
return new NetworkError(
|
|
19
|
+
"Unable to connect to server. Please check your connection.",
|
|
20
|
+
{ cause: error, url: context.url, operation: context.operation },
|
|
21
|
+
);
|
|
22
|
+
}
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Emit a NetworkError to the UI via the onUpdate subscriber.
|
|
28
|
+
* Wraps in startTransition and renders a NetworkErrorThrower component
|
|
29
|
+
* that throws during render to trigger the nearest error boundary.
|
|
30
|
+
*/
|
|
31
|
+
export function emitNetworkError(
|
|
32
|
+
onUpdate: UpdateSubscriber,
|
|
33
|
+
error: NetworkError,
|
|
34
|
+
pathname: string,
|
|
35
|
+
): void {
|
|
36
|
+
startTransition(() => {
|
|
37
|
+
onUpdate({
|
|
38
|
+
root: createElement(NetworkErrorThrower, { error }),
|
|
39
|
+
metadata: {
|
|
40
|
+
pathname,
|
|
41
|
+
segments: [],
|
|
42
|
+
isError: true,
|
|
43
|
+
},
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Check if an error is safe to suppress in background operations.
|
|
50
|
+
*
|
|
51
|
+
* Background revalidation (SWR, navigated-away refetch) should silently
|
|
52
|
+
* swallow AbortErrors and network errors since the user has already moved
|
|
53
|
+
* on and showing an error would be disruptive.
|
|
54
|
+
*
|
|
55
|
+
* Pure function, easily unit tested.
|
|
56
|
+
*/
|
|
57
|
+
export function isBackgroundSuppressible(error: unknown): boolean {
|
|
58
|
+
if (error instanceof DOMException && error.name === "AbortError") return true;
|
|
59
|
+
if (error instanceof NetworkError || isNetworkError(error)) return true;
|
|
60
|
+
return false;
|
|
61
|
+
}
|