@rangojs/router 0.0.0-experimental.2 → 0.0.0-experimental.21
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 +5 -0
- package/README.md +850 -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/{src/__mocks__/version.ts → dist/__mocks__/version.js} +1 -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 +1601 -0
- 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 +4630 -749
- 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/{src/vite/virtual-entries.ts → dist/vite/virtual-entries.js} +18 -17
- package/dist/vite/virtual-entries.js.map +1 -0
- package/package.json +82 -46
- package/skills/cache-guide/SKILL.md +262 -0
- package/skills/caching/SKILL.md +139 -238
- package/skills/composability/SKILL.md +172 -0
- package/skills/debug-manifest/SKILL.md +112 -0
- package/skills/document-cache/SKILL.md +87 -57
- package/skills/fonts/SKILL.md +167 -0
- package/skills/hooks/SKILL.md +403 -60
- package/skills/intercept/SKILL.md +224 -203
- package/skills/layout/SKILL.md +243 -149
- package/skills/links/SKILL.md +239 -0
- package/skills/loader/SKILL.md +444 -253
- package/skills/middleware/SKILL.md +222 -325
- package/skills/mime-routes/SKILL.md +128 -0
- package/skills/parallel/SKILL.md +220 -170
- package/skills/prerender/SKILL.md +643 -0
- package/skills/rango/SKILL.md +119 -0
- package/skills/response-routes/SKILL.md +411 -0
- package/skills/route/SKILL.md +334 -89
- package/skills/router-setup/SKILL.md +305 -274
- package/skills/tailwind/SKILL.md +129 -0
- package/skills/testing/SKILL.md +226 -0
- package/skills/theme/SKILL.md +36 -11
- package/skills/typesafety/SKILL.md +437 -168
- package/skills/use-cache/SKILL.md +324 -0
- package/src/__internal.ts +181 -0
- package/src/bin/rango.ts +321 -0
- package/src/browser/action-coordinator.ts +97 -0
- package/src/browser/action-response-classifier.ts +99 -0
- package/src/browser/event-controller.ts +87 -64
- package/src/browser/history-state.ts +80 -0
- package/src/browser/intercept-utils.ts +52 -0
- package/src/browser/link-interceptor.ts +20 -4
- package/src/browser/logging.ts +55 -0
- package/src/browser/merge-segment-loaders.ts +20 -12
- package/src/browser/navigation-bridge.ts +217 -549
- package/src/browser/navigation-client.ts +74 -46
- package/src/browser/navigation-store.ts +33 -50
- package/src/browser/navigation-transaction.ts +295 -0
- package/src/browser/network-error-handler.ts +61 -0
- package/src/browser/partial-update.ts +288 -297
- package/src/browser/prefetch/cache.ts +67 -0
- package/src/browser/prefetch/fetch.ts +137 -0
- package/src/browser/prefetch/observer.ts +65 -0
- package/src/browser/prefetch/policy.ts +42 -0
- package/src/browser/prefetch/queue.ts +88 -0
- package/src/browser/rango-state.ts +112 -0
- package/src/browser/react/Link.tsx +173 -73
- package/src/browser/react/NavigationProvider.tsx +138 -27
- package/src/browser/react/context.ts +6 -0
- package/src/browser/react/filter-segment-order.ts +11 -0
- package/src/browser/react/index.ts +12 -12
- package/src/browser/react/location-state-shared.ts +95 -53
- package/src/browser/react/location-state.ts +60 -15
- package/src/browser/react/mount-context.ts +37 -0
- 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 +49 -65
- package/src/browser/react/use-href.tsx +20 -188
- package/src/browser/react/use-link-status.ts +6 -5
- package/src/browser/react/use-mount.ts +31 -0
- package/src/browser/react/use-navigation.ts +27 -78
- package/src/browser/react/use-params.ts +65 -0
- package/src/browser/react/use-pathname.ts +47 -0
- package/src/browser/react/use-router.ts +63 -0
- package/src/browser/react/use-search-params.ts +56 -0
- package/src/browser/react/use-segments.ts +80 -97
- package/src/browser/response-adapter.ts +73 -0
- package/src/browser/rsc-router.tsx +104 -34
- package/src/browser/scroll-restoration.ts +92 -16
- package/src/browser/segment-reconciler.ts +216 -0
- package/src/browser/segment-structure-assert.ts +83 -0
- package/src/browser/server-action-bridge.ts +504 -584
- package/src/browser/shallow.ts +6 -1
- package/src/browser/types.ts +107 -57
- package/src/browser/validate-redirect-origin.ts +29 -0
- package/src/build/generate-manifest.ts +438 -0
- package/src/build/generate-route-types.ts +36 -0
- package/src/build/index.ts +35 -0
- package/src/build/route-trie.ts +249 -0
- 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 +411 -0
- package/src/build/route-types/param-extraction.ts +48 -0
- package/src/build/route-types/per-module-writer.ts +128 -0
- package/src/build/route-types/router-processing.ts +469 -0
- package/src/build/route-types/scan-filter.ts +78 -0
- package/src/build/runtime-discovery.ts +231 -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 +338 -0
- package/src/cache/cache-scope.ts +120 -303
- package/src/cache/cf/cf-cache-store.ts +119 -7
- package/src/cache/cf/index.ts +8 -2
- package/src/cache/document-cache.ts +101 -72
- package/src/cache/handle-capture.ts +81 -0
- package/src/cache/handle-snapshot.ts +41 -0
- package/src/cache/index.ts +0 -15
- package/src/cache/memory-segment-store.ts +191 -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 +98 -0
- package/src/cache/types.ts +76 -121
- package/src/client.rsc.tsx +10 -14
- package/src/client.tsx +114 -89
- package/src/component-utils.ts +4 -4
- package/src/components/DefaultDocument.tsx +6 -2
- package/src/context-var.ts +86 -0
- package/src/debug.ts +243 -0
- package/src/errors.ts +108 -2
- package/src/handle.ts +34 -19
- package/src/handles/MetaTags.tsx +76 -23
- package/src/handles/meta.ts +32 -15
- package/src/host/cookie-handler.ts +165 -0
- package/src/host/errors.ts +97 -0
- package/src/host/index.ts +56 -0
- package/src/host/pattern-matcher.ts +214 -0
- package/src/host/router.ts +352 -0
- package/src/host/testing.ts +79 -0
- package/src/host/types.ts +146 -0
- package/src/host/utils.ts +25 -0
- package/src/href-client.ts +141 -47
- package/src/index.rsc.ts +209 -23
- package/src/index.ts +256 -32
- package/src/internal-debug.ts +11 -0
- package/src/loader.rsc.ts +27 -142
- package/src/loader.ts +27 -10
- package/src/network-error-thrower.tsx +3 -1
- package/src/outlet-provider.tsx +45 -0
- package/src/prerender/param-hash.ts +37 -0
- package/src/prerender/store.ts +185 -0
- package/src/prerender.ts +463 -0
- package/src/reverse.ts +330 -0
- package/src/root-error-boundary.tsx +41 -29
- package/src/route-content-wrapper.tsx +9 -11
- package/src/route-definition/dsl-helpers.ts +934 -0
- package/src/route-definition/helper-factories.ts +200 -0
- package/src/route-definition/helpers-types.ts +430 -0
- package/src/route-definition/index.ts +55 -0
- package/src/route-definition/redirect.ts +93 -0
- package/src/route-definition/route-function.ts +119 -0
- package/src/route-definition.ts +1 -1371
- package/src/route-map-builder.ts +241 -112
- package/src/route-name.ts +53 -0
- package/src/route-types.ts +70 -9
- package/src/router/content-negotiation.ts +116 -0
- package/src/router/debug-manifest.ts +72 -0
- package/src/router/error-handling.ts +9 -9
- package/src/router/find-match.ts +158 -0
- package/src/router/handler-context.ts +348 -82
- package/src/router/intercept-resolution.ts +395 -0
- package/src/router/lazy-includes.ts +234 -0
- package/src/router/loader-resolution.ts +215 -121
- package/src/router/logging.ts +248 -0
- package/src/router/manifest.ts +172 -43
- package/src/router/match-api.ts +620 -0
- package/src/router/match-context.ts +6 -4
- package/src/router/match-handlers.ts +440 -0
- package/src/router/match-middleware/background-revalidation.ts +80 -93
- package/src/router/match-middleware/cache-lookup.ts +382 -9
- package/src/router/match-middleware/cache-store.ts +51 -22
- package/src/router/match-middleware/intercept-resolution.ts +55 -17
- package/src/router/match-middleware/segment-resolution.ts +24 -6
- package/src/router/match-pipelines.ts +10 -45
- package/src/router/match-result.ts +34 -20
- package/src/router/metrics.ts +3 -3
- package/src/router/middleware-cookies.ts +55 -0
- package/src/router/middleware-types.ts +179 -0
- package/src/router/middleware.ts +239 -328
- package/src/router/pattern-matching.ts +302 -26
- package/src/router/prerender-match.ts +398 -0
- package/src/router/preview-match.ts +170 -0
- package/src/router/revalidation.ts +112 -33
- package/src/router/router-context.ts +40 -23
- package/src/router/router-interfaces.ts +439 -0
- package/src/router/router-options.ts +587 -0
- package/src/router/router-registry.ts +24 -0
- package/src/router/segment-resolution/fresh.ts +552 -0
- package/src/router/segment-resolution/helpers.ts +263 -0
- package/src/router/segment-resolution/loader-cache.ts +198 -0
- package/src/router/segment-resolution/revalidation.ts +1226 -0
- package/src/router/segment-resolution/static-store.ts +67 -0
- package/src/router/segment-resolution.ts +21 -0
- package/src/router/segment-wrappers.ts +289 -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 +221 -0
- package/src/router/types.ts +78 -4
- package/src/router.ts +672 -3566
- package/src/rsc/handler-context.ts +45 -0
- package/src/rsc/handler.ts +691 -757
- package/src/rsc/helpers.ts +140 -6
- package/src/rsc/index.ts +5 -5
- package/src/rsc/loader-fetch.ts +209 -0
- package/src/rsc/manifest-init.ts +86 -0
- package/src/rsc/nonce.ts +14 -0
- package/src/rsc/origin-guard.ts +141 -0
- package/src/rsc/progressive-enhancement.ts +366 -0
- package/src/rsc/response-error.ts +37 -0
- package/src/rsc/response-route-handler.ts +347 -0
- package/src/rsc/rsc-rendering.ts +250 -0
- package/src/rsc/runtime-warnings.ts +42 -0
- package/src/rsc/server-action.ts +344 -0
- package/src/rsc/types.ts +38 -14
- package/src/search-params.ts +227 -0
- package/src/segment-system.tsx +59 -61
- package/src/server/context.ts +217 -49
- package/src/server/cookie-store.ts +190 -0
- package/src/server/fetchable-loader-store.ts +37 -0
- package/src/server/handle-store.ts +98 -20
- package/src/server/loader-registry.ts +15 -56
- package/src/server/request-context.ts +406 -65
- package/src/server.ts +32 -133
- package/src/ssr/index.tsx +157 -26
- package/src/static-handler.ts +114 -0
- package/src/theme/ThemeProvider.tsx +21 -15
- package/src/theme/ThemeScript.tsx +5 -5
- package/src/theme/constants.ts +11 -4
- package/src/theme/index.ts +6 -7
- package/src/theme/theme-context.ts +5 -31
- package/src/theme/theme-script.ts +21 -18
- package/src/theme/types.ts +1 -1
- 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 +100 -0
- package/src/types/handler-context.ts +691 -0
- package/src/types/index.ts +88 -0
- package/src/types/loader-types.ts +183 -0
- package/src/types/route-config.ts +161 -0
- package/src/types/route-entry.ts +102 -0
- package/src/types/segments.ts +153 -0
- package/src/types.ts +1 -1561
- package/src/urls/include-helper.ts +197 -0
- package/src/urls/index.ts +53 -0
- package/src/urls/path-helper-types.ts +339 -0
- package/src/urls/path-helper.ts +329 -0
- package/src/urls/pattern-types.ts +95 -0
- package/src/urls/response-types.ts +106 -0
- package/src/urls/type-extraction.ts +372 -0
- package/src/urls/urls-function.ts +98 -0
- package/src/urls.ts +1 -726
- package/src/use-loader.tsx +85 -77
- package/src/vite/discovery/bundle-postprocess.ts +184 -0
- package/src/vite/discovery/discover-routers.ts +345 -0
- package/src/vite/discovery/prerender-collection.ts +385 -0
- package/src/vite/discovery/route-types-writer.ts +258 -0
- package/src/vite/discovery/self-gen-tracking.ts +47 -0
- package/src/vite/discovery/state.ts +110 -0
- package/src/vite/discovery/virtual-module-codegen.ts +203 -0
- package/src/vite/index.ts +10 -782
- package/src/vite/plugin-types.ts +131 -0
- package/src/vite/plugins/cjs-to-esm.ts +93 -0
- package/src/vite/plugins/client-ref-dedup.ts +115 -0
- package/src/vite/plugins/client-ref-hashing.ts +105 -0
- package/src/vite/{expose-action-id.ts → plugins/expose-action-id.ts} +72 -51
- package/src/vite/plugins/expose-id-utils.ts +287 -0
- package/src/vite/plugins/expose-ids/export-analysis.ts +296 -0
- package/src/vite/plugins/expose-ids/handler-transform.ts +179 -0
- package/src/vite/plugins/expose-ids/loader-transform.ts +74 -0
- package/src/vite/plugins/expose-ids/router-transform.ts +110 -0
- package/src/vite/plugins/expose-ids/types.ts +45 -0
- package/src/vite/plugins/expose-internal-ids.ts +569 -0
- package/src/vite/plugins/use-cache-transform.ts +323 -0
- package/src/vite/plugins/version-injector.ts +83 -0
- package/src/vite/plugins/version-plugin.ts +254 -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 +510 -0
- package/src/vite/router-discovery.ts +785 -0
- package/src/vite/utils/ast-handler-extract.ts +517 -0
- package/src/vite/utils/banner.ts +36 -0
- package/src/vite/utils/bundle-analysis.ts +137 -0
- package/src/vite/utils/manifest-utils.ts +70 -0
- package/src/vite/{package-resolution.ts → utils/package-resolution.ts} +25 -29
- package/src/vite/utils/prerender-utils.ts +189 -0
- package/src/vite/utils/shared-utils.ts +169 -0
- package/CLAUDE.md +0 -7
- package/src/__tests__/component-utils.test.ts +0 -76
- package/src/__tests__/route-definition.test.ts +0 -63
- package/src/__tests__/urls.test.tsx +0 -436
- package/src/browser/lru-cache.ts +0 -69
- package/src/browser/request-controller.ts +0 -164
- package/src/cache/__tests__/document-cache.test.ts +0 -522
- package/src/cache/__tests__/memory-segment-store.test.ts +0 -487
- package/src/cache/__tests__/memory-store.test.ts +0 -484
- package/src/cache/cf/__tests__/cf-cache-store.test.ts +0 -428
- package/src/cache/memory-store.ts +0 -253
- package/src/href.ts +0 -177
- package/src/route-utils.ts +0 -89
- package/src/router/__tests__/match-context.test.ts +0 -104
- package/src/router/__tests__/match-pipelines.test.ts +0 -537
- package/src/router/__tests__/match-result.test.ts +0 -566
- package/src/router/__tests__/on-error.test.ts +0 -935
- package/src/router/__tests__/pattern-matching.test.ts +0 -577
- package/src/router/middleware.test.ts +0 -1355
- package/src/rsc/__tests__/helpers.test.ts +0 -175
- package/src/server/__tests__/request-context.test.ts +0 -171
- package/src/ssr/__tests__/ssr-handler.test.tsx +0 -188
- package/src/theme/__tests__/theme.test.ts +0 -120
- package/src/vite/__tests__/expose-loader-id.test.ts +0 -117
- package/src/vite/expose-handle-id.ts +0 -209
- package/src/vite/expose-loader-id.ts +0 -357
- package/src/vite/expose-location-state-id.ts +0 -177
- /package/src/vite/{version.d.ts → plugins/version.d.ts} +0 -0
|
@@ -0,0 +1,708 @@
|
|
|
1
|
+
var __addDisposableResource = (this && this.__addDisposableResource) || function (env, value, async) {
|
|
2
|
+
if (value !== null && value !== void 0) {
|
|
3
|
+
if (typeof value !== "object" && typeof value !== "function") throw new TypeError("Object expected.");
|
|
4
|
+
var dispose, inner;
|
|
5
|
+
if (async) {
|
|
6
|
+
if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined.");
|
|
7
|
+
dispose = value[Symbol.asyncDispose];
|
|
8
|
+
}
|
|
9
|
+
if (dispose === void 0) {
|
|
10
|
+
if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined.");
|
|
11
|
+
dispose = value[Symbol.dispose];
|
|
12
|
+
if (async) inner = dispose;
|
|
13
|
+
}
|
|
14
|
+
if (typeof dispose !== "function") throw new TypeError("Object not disposable.");
|
|
15
|
+
if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };
|
|
16
|
+
env.stack.push({ value: value, dispose: dispose, async: async });
|
|
17
|
+
}
|
|
18
|
+
else if (async) {
|
|
19
|
+
env.stack.push({ async: true });
|
|
20
|
+
}
|
|
21
|
+
return value;
|
|
22
|
+
};
|
|
23
|
+
var __disposeResources = (this && this.__disposeResources) || (function (SuppressedError) {
|
|
24
|
+
return function (env) {
|
|
25
|
+
function fail(e) {
|
|
26
|
+
env.error = env.hasError ? new SuppressedError(e, env.error, "An error was suppressed during disposal.") : e;
|
|
27
|
+
env.hasError = true;
|
|
28
|
+
}
|
|
29
|
+
var r, s = 0;
|
|
30
|
+
function next() {
|
|
31
|
+
while (r = env.stack.pop()) {
|
|
32
|
+
try {
|
|
33
|
+
if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);
|
|
34
|
+
if (r.dispose) {
|
|
35
|
+
var result = r.dispose.call(r.value);
|
|
36
|
+
if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });
|
|
37
|
+
}
|
|
38
|
+
else s |= 1;
|
|
39
|
+
}
|
|
40
|
+
catch (e) {
|
|
41
|
+
fail(e);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();
|
|
45
|
+
if (env.hasError) throw env.error;
|
|
46
|
+
}
|
|
47
|
+
return next();
|
|
48
|
+
};
|
|
49
|
+
})(typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
|
|
50
|
+
var e = new Error(message);
|
|
51
|
+
return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
|
|
52
|
+
});
|
|
53
|
+
import { isLocationStateEntry, resolveLocationStateEntries, } from "./react/location-state-shared.js";
|
|
54
|
+
/**
|
|
55
|
+
* Check if state is from typed LocationStateEntry[] (has __rsc_ls_ keys)
|
|
56
|
+
*/
|
|
57
|
+
function isTypedLocationState(state) {
|
|
58
|
+
if (state === null || typeof state !== "object")
|
|
59
|
+
return false;
|
|
60
|
+
return Object.keys(state).some((key) => key.startsWith("__rsc_ls_"));
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Resolve navigation state - handles both LocationStateEntry[] and legacy formats
|
|
64
|
+
*/
|
|
65
|
+
function resolveNavigationState(state) {
|
|
66
|
+
// Check if it's an array of LocationStateEntry
|
|
67
|
+
if (Array.isArray(state) &&
|
|
68
|
+
state.length > 0 &&
|
|
69
|
+
isLocationStateEntry(state[0])) {
|
|
70
|
+
return resolveLocationStateEntries(state);
|
|
71
|
+
}
|
|
72
|
+
// Return as-is for legacy formats
|
|
73
|
+
return state;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Build history state object from user state
|
|
77
|
+
* - Typed state: spread directly into history.state
|
|
78
|
+
* - Legacy state: store in history.state.state
|
|
79
|
+
*/
|
|
80
|
+
function buildHistoryState(userState, routerState) {
|
|
81
|
+
const result = {};
|
|
82
|
+
// Add router internal state
|
|
83
|
+
if (routerState?.intercept) {
|
|
84
|
+
result.intercept = true;
|
|
85
|
+
if (routerState.sourceUrl) {
|
|
86
|
+
result.sourceUrl = routerState.sourceUrl;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
// Add user state
|
|
90
|
+
if (userState !== undefined) {
|
|
91
|
+
if (isTypedLocationState(userState)) {
|
|
92
|
+
// Typed state: spread directly
|
|
93
|
+
Object.assign(result, userState);
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
// Legacy state: store in .state
|
|
97
|
+
result.state = userState;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
return Object.keys(result).length > 0 ? result : null;
|
|
101
|
+
}
|
|
102
|
+
import { setupLinkInterception } from "./link-interceptor.js";
|
|
103
|
+
import { createPartialUpdater } from "./partial-update.js";
|
|
104
|
+
import { generateHistoryKey } from "./navigation-store.js";
|
|
105
|
+
import { handleNavigationStart, handleNavigationEnd, ensureHistoryKey, } from "./scroll-restoration.js";
|
|
106
|
+
import { NetworkError, isNetworkError } from "../errors.js";
|
|
107
|
+
import { NetworkErrorThrower } from "../network-error-thrower.js";
|
|
108
|
+
import { createElement, startTransition } from "react";
|
|
109
|
+
// Polyfill Symbol.dispose for Safari and older browsers
|
|
110
|
+
if (typeof Symbol.dispose === "undefined") {
|
|
111
|
+
Symbol.dispose = Symbol("Symbol.dispose");
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Check if a segment is an intercept segment
|
|
115
|
+
* Intercept segments have namespace starting with "intercept:" or ID containing .@
|
|
116
|
+
*/
|
|
117
|
+
function isInterceptSegment(s) {
|
|
118
|
+
return (s.namespace?.startsWith("intercept:") ||
|
|
119
|
+
(s.type === "parallel" && s.id.includes(".@")));
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Check if cached segments are intercept-only (no main route segments)
|
|
123
|
+
* Intercept responses shouldn't be used for optimistic rendering since
|
|
124
|
+
* whether interception happens depends on the current page context
|
|
125
|
+
*/
|
|
126
|
+
function isInterceptOnlyCache(segments) {
|
|
127
|
+
return segments.some(isInterceptSegment);
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Creates a navigation transaction that coordinates with the event controller.
|
|
131
|
+
* Handles loading state transitions and cleanup on completion/abort.
|
|
132
|
+
*
|
|
133
|
+
* Supports optimistic navigation: render from cache immediately,
|
|
134
|
+
* then revalidate in background and reconcile if data changed.
|
|
135
|
+
*/
|
|
136
|
+
function createNavigationTransaction(store, eventController, url, options) {
|
|
137
|
+
let committed = false;
|
|
138
|
+
let optimisticallyCommitted = false;
|
|
139
|
+
let earlyStatePushed = false;
|
|
140
|
+
const currentUrl = window.location.href;
|
|
141
|
+
// Start navigation in event controller (this sets loading state)
|
|
142
|
+
const handle = eventController.startNavigation(url, options);
|
|
143
|
+
// If state is provided, push it to history immediately so loading UI can access it
|
|
144
|
+
// This enables "optimistic state" - showing product names in skeletons etc.
|
|
145
|
+
if (options?.state !== undefined && !options?.replace) {
|
|
146
|
+
const earlyHistoryState = buildHistoryState(options.state);
|
|
147
|
+
window.history.pushState(earlyHistoryState, "", url);
|
|
148
|
+
earlyStatePushed = true;
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Optimistically commit from cache - renders immediately before revalidation
|
|
152
|
+
* Sets optimisticallyCommitted flag so final commit() knows to reconcile
|
|
153
|
+
*/
|
|
154
|
+
function optimisticCommit(opts) {
|
|
155
|
+
optimisticallyCommitted = true;
|
|
156
|
+
const { url, segmentIds, segments, replace, scroll } = opts;
|
|
157
|
+
const parsedUrl = new URL(url, window.location.origin);
|
|
158
|
+
// Save current scroll position before navigating
|
|
159
|
+
handleNavigationStart();
|
|
160
|
+
// Update segment state
|
|
161
|
+
store.setSegmentIds(segmentIds);
|
|
162
|
+
store.setCurrentUrl(url);
|
|
163
|
+
store.setPath(parsedUrl.pathname);
|
|
164
|
+
// Generate history key from URL
|
|
165
|
+
const historyKey = generateHistoryKey(url);
|
|
166
|
+
store.setHistoryKey(historyKey);
|
|
167
|
+
// Cache segments with current handleData (will be overwritten by fresh data on final commit)
|
|
168
|
+
const currentHandleData = eventController.getHandleState().data;
|
|
169
|
+
store.cacheSegmentsForHistory(historyKey, segments, currentHandleData);
|
|
170
|
+
// Build history state with user state if provided
|
|
171
|
+
const historyState = buildHistoryState(opts.state);
|
|
172
|
+
// Update browser URL
|
|
173
|
+
// Use replaceState if we already pushed early (for optimistic state access)
|
|
174
|
+
if (replace || earlyStatePushed) {
|
|
175
|
+
window.history.replaceState(historyState, "", url);
|
|
176
|
+
}
|
|
177
|
+
else {
|
|
178
|
+
window.history.pushState(historyState, "", url);
|
|
179
|
+
}
|
|
180
|
+
// Ensure new history entry has a scroll restoration key
|
|
181
|
+
ensureHistoryKey();
|
|
182
|
+
// Complete the navigation in event controller (sets idle state)
|
|
183
|
+
handle.complete(parsedUrl);
|
|
184
|
+
// Handle scroll after navigation
|
|
185
|
+
handleNavigationEnd({ scroll });
|
|
186
|
+
console.log("[Browser] Optimistic commit from cache, historyKey:", historyKey);
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Commit the navigation - updates store and URL atomically
|
|
190
|
+
* If optimisticCommit was called, this becomes a reconciliation
|
|
191
|
+
*/
|
|
192
|
+
function commit(opts) {
|
|
193
|
+
committed = true;
|
|
194
|
+
// If optimistic commit already done, adjust options for reconciliation
|
|
195
|
+
const isReconciliation = optimisticallyCommitted;
|
|
196
|
+
const { url, segmentIds, segments, storeOnly, intercept, interceptSourceUrl, cacheOnly, } = opts;
|
|
197
|
+
// For reconciliation: always replace (URL already pushed), no scroll
|
|
198
|
+
const replace = isReconciliation ? true : opts.replace;
|
|
199
|
+
const scroll = isReconciliation ? false : opts.scroll;
|
|
200
|
+
const parsedUrl = new URL(url, window.location.origin);
|
|
201
|
+
// Generate history key from URL (with intercept suffix for separate caching)
|
|
202
|
+
const historyKey = generateHistoryKey(url, { intercept });
|
|
203
|
+
// For cache-only commits (stale revalidation), only update cache and return
|
|
204
|
+
// Don't touch store state or history - user may have navigated elsewhere
|
|
205
|
+
if (cacheOnly) {
|
|
206
|
+
const currentHandleData = eventController.getHandleState().data;
|
|
207
|
+
store.cacheSegmentsForHistory(historyKey, segments, currentHandleData);
|
|
208
|
+
console.log("[Browser] Cache-only commit, historyKey:", historyKey);
|
|
209
|
+
return;
|
|
210
|
+
}
|
|
211
|
+
// Save current scroll position before navigating (only for non-reconciliation)
|
|
212
|
+
if (!isReconciliation) {
|
|
213
|
+
handleNavigationStart();
|
|
214
|
+
}
|
|
215
|
+
// Update segment state atomically
|
|
216
|
+
store.setSegmentIds(segmentIds);
|
|
217
|
+
store.setCurrentUrl(url);
|
|
218
|
+
store.setPath(parsedUrl.pathname);
|
|
219
|
+
store.setHistoryKey(historyKey);
|
|
220
|
+
// Cache segments with current handleData for this history entry (fresh data overwrites optimistic)
|
|
221
|
+
const currentHandleData = eventController.getHandleState().data;
|
|
222
|
+
store.cacheSegmentsForHistory(historyKey, segments, currentHandleData);
|
|
223
|
+
// For server actions, skip URL/history updates but still complete navigation
|
|
224
|
+
if (storeOnly) {
|
|
225
|
+
console.log("[Browser] Store updated (action)");
|
|
226
|
+
// Complete navigation to clear loading state
|
|
227
|
+
handle.complete(parsedUrl);
|
|
228
|
+
return;
|
|
229
|
+
}
|
|
230
|
+
// Build history state - include user state and intercept info for popstate handling
|
|
231
|
+
const historyState = buildHistoryState(opts.state, {
|
|
232
|
+
intercept,
|
|
233
|
+
sourceUrl: interceptSourceUrl,
|
|
234
|
+
});
|
|
235
|
+
// Update browser URL (skip if reconciliation - already done in optimisticCommit)
|
|
236
|
+
if (!isReconciliation) {
|
|
237
|
+
// Use replaceState if we already pushed early (for optimistic state access) or replace requested
|
|
238
|
+
if (replace || earlyStatePushed) {
|
|
239
|
+
window.history.replaceState(historyState, "", url);
|
|
240
|
+
}
|
|
241
|
+
else {
|
|
242
|
+
window.history.pushState(historyState, "", url);
|
|
243
|
+
}
|
|
244
|
+
// Ensure new history entry has a scroll restoration key
|
|
245
|
+
ensureHistoryKey();
|
|
246
|
+
}
|
|
247
|
+
// Complete the navigation in event controller (sets idle state, updates location)
|
|
248
|
+
handle.complete(parsedUrl);
|
|
249
|
+
// Handle scroll after navigation (skip if reconciliation)
|
|
250
|
+
if (!isReconciliation) {
|
|
251
|
+
handleNavigationEnd({ scroll });
|
|
252
|
+
}
|
|
253
|
+
if (isReconciliation) {
|
|
254
|
+
console.log("[Browser] Reconciliation commit, historyKey:", historyKey);
|
|
255
|
+
}
|
|
256
|
+
else {
|
|
257
|
+
console.log("[Browser] Navigation committed, historyKey:", historyKey, intercept ? "(intercept)" : "");
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
return {
|
|
261
|
+
handle,
|
|
262
|
+
optimisticCommit,
|
|
263
|
+
commit,
|
|
264
|
+
/**
|
|
265
|
+
* Create a bound transaction with pre-configured URL options
|
|
266
|
+
* segmentIds and segments provided at commit time (after they're resolved)
|
|
267
|
+
*/
|
|
268
|
+
with(opts) {
|
|
269
|
+
return {
|
|
270
|
+
get currentUrl() {
|
|
271
|
+
return currentUrl;
|
|
272
|
+
},
|
|
273
|
+
startStreaming() {
|
|
274
|
+
return handle.startStreaming();
|
|
275
|
+
},
|
|
276
|
+
commit: (segmentIds, segments, overrides) => {
|
|
277
|
+
// Allow overrides to disable scroll (e.g., for intercepts)
|
|
278
|
+
const finalScroll = overrides?.scroll !== undefined ? overrides.scroll : opts.scroll;
|
|
279
|
+
// Allow overrides to force replace (e.g., for intercepts)
|
|
280
|
+
const finalReplace = overrides?.replace !== undefined ? overrides.replace : opts.replace;
|
|
281
|
+
// Intercept info: overrides take precedence, fallback to opts
|
|
282
|
+
const intercept = overrides?.intercept !== undefined
|
|
283
|
+
? overrides.intercept
|
|
284
|
+
: opts.intercept;
|
|
285
|
+
const interceptSourceUrl = overrides?.interceptSourceUrl !== undefined
|
|
286
|
+
? overrides.interceptSourceUrl
|
|
287
|
+
: opts.interceptSourceUrl;
|
|
288
|
+
// Cache-only mode: overrides take precedence, fallback to opts
|
|
289
|
+
const cacheOnly = overrides?.cacheOnly !== undefined
|
|
290
|
+
? overrides.cacheOnly
|
|
291
|
+
: opts.cacheOnly;
|
|
292
|
+
// User state: overrides take precedence, fallback to opts
|
|
293
|
+
const state = overrides?.state !== undefined ? overrides.state : opts.state;
|
|
294
|
+
commit({
|
|
295
|
+
...opts,
|
|
296
|
+
segmentIds,
|
|
297
|
+
segments,
|
|
298
|
+
scroll: finalScroll,
|
|
299
|
+
replace: finalReplace,
|
|
300
|
+
state,
|
|
301
|
+
intercept,
|
|
302
|
+
interceptSourceUrl,
|
|
303
|
+
cacheOnly,
|
|
304
|
+
});
|
|
305
|
+
},
|
|
306
|
+
};
|
|
307
|
+
},
|
|
308
|
+
[Symbol.dispose]() {
|
|
309
|
+
// If aborted, another navigation took over - don't touch state
|
|
310
|
+
if (handle.signal.aborted)
|
|
311
|
+
return;
|
|
312
|
+
// If not committed (and not optimistically committed), the handle's dispose
|
|
313
|
+
// will reset state to idle via the event controller
|
|
314
|
+
if (!committed && !optimisticallyCommitted) {
|
|
315
|
+
handle[Symbol.dispose]();
|
|
316
|
+
// The NavigationHandle's [Symbol.dispose] handles this
|
|
317
|
+
}
|
|
318
|
+
},
|
|
319
|
+
};
|
|
320
|
+
}
|
|
321
|
+
// Export for use by server-action-bridge
|
|
322
|
+
export { createNavigationTransaction };
|
|
323
|
+
/**
|
|
324
|
+
* Create a navigation bridge for handling client-side navigation
|
|
325
|
+
*
|
|
326
|
+
* The bridge coordinates all navigation operations:
|
|
327
|
+
* - Link click interception
|
|
328
|
+
* - Browser back/forward (popstate)
|
|
329
|
+
* - Programmatic navigation
|
|
330
|
+
*
|
|
331
|
+
* Uses the event controller for reactive state management.
|
|
332
|
+
*
|
|
333
|
+
* @param config - Bridge configuration
|
|
334
|
+
* @returns NavigationBridge instance
|
|
335
|
+
*/
|
|
336
|
+
export function createNavigationBridge(config) {
|
|
337
|
+
const { store, client, eventController, onUpdate, renderSegments, version } = config;
|
|
338
|
+
// Create shared partial updater
|
|
339
|
+
const fetchPartialUpdate = createPartialUpdater({
|
|
340
|
+
store,
|
|
341
|
+
client,
|
|
342
|
+
onUpdate,
|
|
343
|
+
renderSegments,
|
|
344
|
+
version,
|
|
345
|
+
});
|
|
346
|
+
return {
|
|
347
|
+
/**
|
|
348
|
+
* Navigate to a URL
|
|
349
|
+
* Uses optimistic rendering from cache when available (SWR pattern)
|
|
350
|
+
*/
|
|
351
|
+
async navigate(url, options) {
|
|
352
|
+
const env_1 = { stack: [], error: void 0, hasError: false };
|
|
353
|
+
try {
|
|
354
|
+
// Resolve LocationStateEntry[] to flat object if needed
|
|
355
|
+
const resolvedState = options?.state !== undefined
|
|
356
|
+
? resolveNavigationState(options.state)
|
|
357
|
+
: undefined;
|
|
358
|
+
// Only abort pending requests when navigating to a different route
|
|
359
|
+
// Same-route navigation (e.g., /todos -> /todos) should not cancel in-flight actions
|
|
360
|
+
const currentPath = new URL(window.location.href).pathname;
|
|
361
|
+
const targetPath = new URL(url, window.location.origin).pathname;
|
|
362
|
+
if (currentPath !== targetPath) {
|
|
363
|
+
eventController.abortNavigation();
|
|
364
|
+
}
|
|
365
|
+
// Check if we're "leaving intercept" - navigating from intercept to same URL without intercept
|
|
366
|
+
// This happens when clicking "View Full Details" in an intercept modal
|
|
367
|
+
const currentHistoryState = window.history.state;
|
|
368
|
+
const isCurrentlyIntercept = currentHistoryState?.intercept === true;
|
|
369
|
+
const isSamePathNavigation = currentPath === targetPath;
|
|
370
|
+
const isLeavingIntercept = isCurrentlyIntercept && isSamePathNavigation;
|
|
371
|
+
if (isLeavingIntercept) {
|
|
372
|
+
console.log(`[Browser] Leaving intercept - same URL navigation from intercept`);
|
|
373
|
+
// Clear intercept source URL to ensure server doesn't treat this as intercept
|
|
374
|
+
store.setInterceptSourceUrl(null);
|
|
375
|
+
}
|
|
376
|
+
// Before navigating away, update the source page's cache with the latest handleData.
|
|
377
|
+
// This ensures the cache has correct handleData even if handles were streaming.
|
|
378
|
+
const sourceHistoryKey = store.getHistoryKey();
|
|
379
|
+
const sourceCached = store.getCachedSegments(sourceHistoryKey);
|
|
380
|
+
if (sourceCached?.segments && sourceCached.segments.length > 0) {
|
|
381
|
+
const currentHandleData = eventController.getHandleState().data;
|
|
382
|
+
store.cacheSegmentsForHistory(sourceHistoryKey, sourceCached.segments, currentHandleData);
|
|
383
|
+
}
|
|
384
|
+
// Check if we have cached segments for target URL
|
|
385
|
+
const historyKey = generateHistoryKey(url);
|
|
386
|
+
const cached = store.getCachedSegments(historyKey);
|
|
387
|
+
// For shared segments (same ID on current and target), use current page's version
|
|
388
|
+
// since it may have fresher data after an action revalidation.
|
|
389
|
+
// This avoids unnecessary server round-trips for shared layout loaders.
|
|
390
|
+
let cachedSegments = cached?.segments;
|
|
391
|
+
const cachedHandleData = cached?.handleData;
|
|
392
|
+
if (cachedSegments && sourceCached?.segments) {
|
|
393
|
+
const sourceSegmentMap = new Map(sourceCached.segments.map((s) => [s.id, s]));
|
|
394
|
+
cachedSegments = cachedSegments.map((targetSeg) => {
|
|
395
|
+
const sourceSeg = sourceSegmentMap.get(targetSeg.id);
|
|
396
|
+
// Use source (current page) version for shared segments - it's fresher
|
|
397
|
+
return sourceSeg || targetSeg;
|
|
398
|
+
});
|
|
399
|
+
}
|
|
400
|
+
// Also check if there's an intercept cache entry for this URL
|
|
401
|
+
// If so, this URL CAN be intercepted, and we shouldn't use the non-intercept cache
|
|
402
|
+
// because the navigation might result in an intercept (depending on source URL)
|
|
403
|
+
const interceptHistoryKey = generateHistoryKey(url, { intercept: true });
|
|
404
|
+
const hasInterceptCache = store.hasHistoryCache(interceptHistoryKey);
|
|
405
|
+
// Skip optimistic rendering for:
|
|
406
|
+
// 1. intercept caches - interception depends on source page context
|
|
407
|
+
// 2. routes that CAN be intercepted - we don't know if this navigation will intercept
|
|
408
|
+
// 3. when leaving intercept - we need fresh non-intercept segments from server
|
|
409
|
+
const hasUsableCache = cachedSegments &&
|
|
410
|
+
cachedSegments.length > 0 &&
|
|
411
|
+
!isInterceptOnlyCache(cachedSegments) &&
|
|
412
|
+
!hasInterceptCache &&
|
|
413
|
+
!isLeavingIntercept;
|
|
414
|
+
const tx = __addDisposableResource(env_1, createNavigationTransaction(store, eventController, url, {
|
|
415
|
+
...options,
|
|
416
|
+
state: resolvedState,
|
|
417
|
+
skipLoadingState: hasUsableCache,
|
|
418
|
+
}), false);
|
|
419
|
+
// REVALIDATE: Fetch fresh data from server
|
|
420
|
+
try {
|
|
421
|
+
await fetchPartialUpdate(url, hasUsableCache ? cachedSegments.map((s) => s.id) : undefined, false, tx.handle.signal, tx.with({
|
|
422
|
+
url,
|
|
423
|
+
replace: options?.replace,
|
|
424
|
+
scroll: options?.scroll,
|
|
425
|
+
state: resolvedState,
|
|
426
|
+
}),
|
|
427
|
+
// Pass cached segments (merged with current page's fresh segments for shared IDs)
|
|
428
|
+
// so the segment map is consistent with what we tell the server we have.
|
|
429
|
+
// Server decides what needs revalidation based on route matching and custom functions.
|
|
430
|
+
// No need for staleRevalidation flag - we're sending the freshest segments we have.
|
|
431
|
+
// Also pass cached handle data for restoring breadcrumbs when server returns empty diff.
|
|
432
|
+
// When leaving intercept, pass the flag so fetchPartialUpdate knows to filter segments.
|
|
433
|
+
hasUsableCache
|
|
434
|
+
? { targetCacheSegments: cachedSegments, targetCacheHandleData: cachedHandleData }
|
|
435
|
+
: isLeavingIntercept
|
|
436
|
+
? { leavingIntercept: true }
|
|
437
|
+
: undefined);
|
|
438
|
+
}
|
|
439
|
+
catch (error) {
|
|
440
|
+
// Ignore AbortError - navigation was cancelled by a newer navigation
|
|
441
|
+
if (error instanceof DOMException && error.name === "AbortError") {
|
|
442
|
+
console.log("[Browser] Navigation aborted by newer navigation");
|
|
443
|
+
return;
|
|
444
|
+
}
|
|
445
|
+
// Handle network errors by triggering root error boundary
|
|
446
|
+
if (error instanceof NetworkError || isNetworkError(error)) {
|
|
447
|
+
const networkError = error instanceof NetworkError
|
|
448
|
+
? error
|
|
449
|
+
: new NetworkError("Unable to connect to server. Please check your connection.", { cause: error, url, operation: "navigation" });
|
|
450
|
+
console.error("[Browser] Network error during navigation:", networkError);
|
|
451
|
+
// Emit update with NetworkErrorThrower to trigger root error boundary
|
|
452
|
+
startTransition(() => {
|
|
453
|
+
onUpdate({
|
|
454
|
+
root: createElement(NetworkErrorThrower, { error: networkError }),
|
|
455
|
+
metadata: {
|
|
456
|
+
pathname: url,
|
|
457
|
+
segments: [],
|
|
458
|
+
isError: true,
|
|
459
|
+
},
|
|
460
|
+
});
|
|
461
|
+
});
|
|
462
|
+
return;
|
|
463
|
+
}
|
|
464
|
+
throw error;
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
catch (e_1) {
|
|
468
|
+
env_1.error = e_1;
|
|
469
|
+
env_1.hasError = true;
|
|
470
|
+
}
|
|
471
|
+
finally {
|
|
472
|
+
__disposeResources(env_1);
|
|
473
|
+
}
|
|
474
|
+
},
|
|
475
|
+
/**
|
|
476
|
+
* Refresh current route
|
|
477
|
+
*/
|
|
478
|
+
async refresh() {
|
|
479
|
+
const env_2 = { stack: [], error: void 0, hasError: false };
|
|
480
|
+
try {
|
|
481
|
+
eventController.abortNavigation();
|
|
482
|
+
const tx = __addDisposableResource(env_2, createNavigationTransaction(store, eventController, window.location.href, { replace: true }), false);
|
|
483
|
+
try {
|
|
484
|
+
// Refetch with empty segments to get everything fresh
|
|
485
|
+
await fetchPartialUpdate(window.location.href, [], false, tx.handle.signal, tx.with({ url: window.location.href, replace: true, scroll: false }));
|
|
486
|
+
}
|
|
487
|
+
catch (error) {
|
|
488
|
+
// Handle network errors by triggering root error boundary
|
|
489
|
+
if (error instanceof NetworkError || isNetworkError(error)) {
|
|
490
|
+
const networkError = error instanceof NetworkError
|
|
491
|
+
? error
|
|
492
|
+
: new NetworkError("Unable to connect to server. Please check your connection.", {
|
|
493
|
+
cause: error,
|
|
494
|
+
url: window.location.href,
|
|
495
|
+
operation: "revalidation",
|
|
496
|
+
});
|
|
497
|
+
console.error("[Browser] Network error during refresh:", networkError);
|
|
498
|
+
startTransition(() => {
|
|
499
|
+
onUpdate({
|
|
500
|
+
root: createElement(NetworkErrorThrower, { error: networkError }),
|
|
501
|
+
metadata: {
|
|
502
|
+
pathname: window.location.href,
|
|
503
|
+
segments: [],
|
|
504
|
+
isError: true,
|
|
505
|
+
},
|
|
506
|
+
});
|
|
507
|
+
});
|
|
508
|
+
return;
|
|
509
|
+
}
|
|
510
|
+
throw error;
|
|
511
|
+
}
|
|
512
|
+
}
|
|
513
|
+
catch (e_2) {
|
|
514
|
+
env_2.error = e_2;
|
|
515
|
+
env_2.hasError = true;
|
|
516
|
+
}
|
|
517
|
+
finally {
|
|
518
|
+
__disposeResources(env_2);
|
|
519
|
+
}
|
|
520
|
+
},
|
|
521
|
+
/**
|
|
522
|
+
* Handle browser back/forward navigation
|
|
523
|
+
* Uses cached segments when available for instant restoration
|
|
524
|
+
*/
|
|
525
|
+
async handlePopstate() {
|
|
526
|
+
const env_3 = { stack: [], error: void 0, hasError: false };
|
|
527
|
+
try {
|
|
528
|
+
// Abort any pending navigation to prevent race conditions
|
|
529
|
+
eventController.abortNavigation();
|
|
530
|
+
const url = window.location.href;
|
|
531
|
+
// Check if this history entry is an intercept
|
|
532
|
+
const historyState = window.history.state;
|
|
533
|
+
const isIntercept = historyState?.intercept === true;
|
|
534
|
+
const interceptSourceUrl = historyState?.sourceUrl;
|
|
535
|
+
// Check if intercept context is changing (same URL, different intercept state)
|
|
536
|
+
// If so, abort in-flight actions - their results would be for wrong context
|
|
537
|
+
const currentInterceptSource = store.getInterceptSourceUrl();
|
|
538
|
+
const newInterceptSource = interceptSourceUrl ?? null;
|
|
539
|
+
if (currentInterceptSource !== newInterceptSource) {
|
|
540
|
+
console.log(`[Browser] Intercept context changing (${currentInterceptSource} -> ${newInterceptSource}), aborting in-flight actions`);
|
|
541
|
+
eventController.abortAllActions();
|
|
542
|
+
}
|
|
543
|
+
// Compute history key from URL (with intercept suffix if applicable)
|
|
544
|
+
const historyKey = generateHistoryKey(url, { intercept: isIntercept });
|
|
545
|
+
console.log("[Browser] Popstate -", isIntercept ? "intercept" : "normal", "key:", historyKey);
|
|
546
|
+
// Update location in event controller
|
|
547
|
+
eventController.setLocation(new URL(url));
|
|
548
|
+
// If this is an intercept, restore the intercept context
|
|
549
|
+
if (isIntercept && interceptSourceUrl) {
|
|
550
|
+
store.setInterceptSourceUrl(interceptSourceUrl);
|
|
551
|
+
}
|
|
552
|
+
else {
|
|
553
|
+
store.setInterceptSourceUrl(null);
|
|
554
|
+
}
|
|
555
|
+
// Helper to check if streaming is in progress
|
|
556
|
+
const isStreaming = () => eventController.getState().isStreaming;
|
|
557
|
+
// Check if we can restore from history cache
|
|
558
|
+
const cached = store.getCachedSegments(historyKey);
|
|
559
|
+
const cachedSegments = cached?.segments;
|
|
560
|
+
const cachedHandleData = cached?.handleData;
|
|
561
|
+
const isStale = cached?.stale ?? false;
|
|
562
|
+
if (cachedSegments && cachedSegments.length > 0) {
|
|
563
|
+
// Update store to point to this history entry
|
|
564
|
+
store.setHistoryKey(historyKey);
|
|
565
|
+
store.setSegmentIds(cachedSegments.map((s) => s.id));
|
|
566
|
+
store.setCurrentUrl(url);
|
|
567
|
+
store.setPath(new URL(url).pathname);
|
|
568
|
+
// Render from cache - force await to skip loading fallbacks
|
|
569
|
+
try {
|
|
570
|
+
const root = await renderSegments(cachedSegments, {
|
|
571
|
+
forceAwait: true,
|
|
572
|
+
});
|
|
573
|
+
onUpdate({
|
|
574
|
+
root,
|
|
575
|
+
metadata: {
|
|
576
|
+
pathname: new URL(url).pathname,
|
|
577
|
+
segments: cachedSegments,
|
|
578
|
+
isPartial: true,
|
|
579
|
+
matched: cachedSegments.map((s) => s.id),
|
|
580
|
+
diff: [],
|
|
581
|
+
cachedHandleData,
|
|
582
|
+
},
|
|
583
|
+
});
|
|
584
|
+
// Restore scroll position for back/forward navigation
|
|
585
|
+
handleNavigationEnd({ restore: true, isStreaming });
|
|
586
|
+
// SWR: If stale, trigger background revalidation
|
|
587
|
+
if (isStale) {
|
|
588
|
+
console.log("[Browser] Cache is stale, background revalidating...");
|
|
589
|
+
// Background revalidation - don't await, just fire and forget
|
|
590
|
+
const segmentIds = cachedSegments.map((s) => s.id);
|
|
591
|
+
const tx = createNavigationTransaction(store, eventController, url, { skipLoadingState: true, replace: true });
|
|
592
|
+
fetchPartialUpdate(url, segmentIds, false, tx.handle.signal, tx.with({
|
|
593
|
+
url,
|
|
594
|
+
replace: true,
|
|
595
|
+
scroll: false,
|
|
596
|
+
intercept: isIntercept,
|
|
597
|
+
interceptSourceUrl,
|
|
598
|
+
cacheOnly: true,
|
|
599
|
+
}), { staleRevalidation: true, interceptSourceUrl }).catch((error) => {
|
|
600
|
+
if (error instanceof DOMException &&
|
|
601
|
+
error.name === "AbortError") {
|
|
602
|
+
console.log("[Browser] Background revalidation aborted");
|
|
603
|
+
return;
|
|
604
|
+
}
|
|
605
|
+
if (error instanceof NetworkError || isNetworkError(error)) {
|
|
606
|
+
console.warn("[Browser] Background revalidation network error (cached content preserved):", error.message);
|
|
607
|
+
return;
|
|
608
|
+
}
|
|
609
|
+
console.error("[Browser] Background revalidation failed:", error);
|
|
610
|
+
}).finally(() => {
|
|
611
|
+
tx[Symbol.dispose]();
|
|
612
|
+
});
|
|
613
|
+
}
|
|
614
|
+
return;
|
|
615
|
+
}
|
|
616
|
+
catch (error) {
|
|
617
|
+
console.warn("[Browser] Failed to render from cache, fetching:", error);
|
|
618
|
+
// Fall through to fetch
|
|
619
|
+
}
|
|
620
|
+
}
|
|
621
|
+
else {
|
|
622
|
+
console.log("[Browser] History cache miss for key:", historyKey);
|
|
623
|
+
}
|
|
624
|
+
// Fetch if not cached
|
|
625
|
+
const tx = __addDisposableResource(env_3, createNavigationTransaction(store, eventController, url, {
|
|
626
|
+
replace: true,
|
|
627
|
+
}), false);
|
|
628
|
+
try {
|
|
629
|
+
await fetchPartialUpdate(url, undefined, false, tx.handle.signal, tx.with({ url, replace: true, scroll: false }));
|
|
630
|
+
// Restore scroll position after fetch completes
|
|
631
|
+
handleNavigationEnd({ restore: true, isStreaming });
|
|
632
|
+
}
|
|
633
|
+
catch (error) {
|
|
634
|
+
if (error instanceof DOMException && error.name === "AbortError") {
|
|
635
|
+
console.log("[Browser] Popstate navigation aborted");
|
|
636
|
+
return;
|
|
637
|
+
}
|
|
638
|
+
// Handle network errors by triggering root error boundary
|
|
639
|
+
if (error instanceof NetworkError || isNetworkError(error)) {
|
|
640
|
+
const networkError = error instanceof NetworkError
|
|
641
|
+
? error
|
|
642
|
+
: new NetworkError("Unable to connect to server. Please check your connection.", { cause: error, url, operation: "navigation" });
|
|
643
|
+
console.error("[Browser] Network error during popstate navigation:", networkError);
|
|
644
|
+
startTransition(() => {
|
|
645
|
+
onUpdate({
|
|
646
|
+
root: createElement(NetworkErrorThrower, { error: networkError }),
|
|
647
|
+
metadata: {
|
|
648
|
+
pathname: url,
|
|
649
|
+
segments: [],
|
|
650
|
+
isError: true,
|
|
651
|
+
},
|
|
652
|
+
});
|
|
653
|
+
});
|
|
654
|
+
return;
|
|
655
|
+
}
|
|
656
|
+
throw error;
|
|
657
|
+
}
|
|
658
|
+
}
|
|
659
|
+
catch (e_3) {
|
|
660
|
+
env_3.error = e_3;
|
|
661
|
+
env_3.hasError = true;
|
|
662
|
+
}
|
|
663
|
+
finally {
|
|
664
|
+
__disposeResources(env_3);
|
|
665
|
+
}
|
|
666
|
+
},
|
|
667
|
+
/**
|
|
668
|
+
* Register link interception
|
|
669
|
+
* @returns Cleanup function
|
|
670
|
+
*/
|
|
671
|
+
registerLinkInterception() {
|
|
672
|
+
const cleanupLinks = setupLinkInterception((url, options) => {
|
|
673
|
+
this.navigate(url, options);
|
|
674
|
+
});
|
|
675
|
+
const handlePopstate = () => {
|
|
676
|
+
this.handlePopstate();
|
|
677
|
+
};
|
|
678
|
+
// When the browser restores a page from bfcache (back-forward cache),
|
|
679
|
+
// any in-flight navigation state is stale. This happens when:
|
|
680
|
+
// 1. A navigation triggers X-RSC-Reload (e.g., response route hit via SPA)
|
|
681
|
+
// 2. window.location.href does a hard navigation
|
|
682
|
+
// 3. The user presses back and the browser restores from bfcache
|
|
683
|
+
// At that point, currentNavigation is still set from step 1, so
|
|
684
|
+
// getState() returns "loading" and the progress bar shows.
|
|
685
|
+
// Abort the stale navigation to reset state to idle.
|
|
686
|
+
const handlePageShow = (event) => {
|
|
687
|
+
if (event.persisted) {
|
|
688
|
+
console.log("[Browser] Page restored from bfcache, resetting navigation state");
|
|
689
|
+
eventController.abortNavigation();
|
|
690
|
+
}
|
|
691
|
+
};
|
|
692
|
+
// Register cross-tab refresh callback with the store
|
|
693
|
+
store.setCrossTabRefreshCallback(() => {
|
|
694
|
+
this.refresh();
|
|
695
|
+
});
|
|
696
|
+
window.addEventListener("popstate", handlePopstate);
|
|
697
|
+
window.addEventListener("pageshow", handlePageShow);
|
|
698
|
+
console.log("[Browser] Navigation bridge ready");
|
|
699
|
+
return () => {
|
|
700
|
+
cleanupLinks();
|
|
701
|
+
window.removeEventListener("popstate", handlePopstate);
|
|
702
|
+
window.removeEventListener("pageshow", handlePageShow);
|
|
703
|
+
};
|
|
704
|
+
},
|
|
705
|
+
};
|
|
706
|
+
}
|
|
707
|
+
export { createNavigationBridge as default };
|
|
708
|
+
//# sourceMappingURL=navigation-bridge.js.map
|