@rangojs/router 0.0.0-experimental.ea6d5eec → 0.0.0-experimental.ea9f40f2
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 +8 -4
- package/README.md +303 -741
- 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 +724 -183
- package/dist/bin/rango.js.map +1 -0
- package/dist/browser/event-controller.d.ts +191 -0
- package/dist/browser/event-controller.d.ts.map +1 -0
- package/dist/browser/event-controller.js +559 -0
- package/dist/browser/event-controller.js.map +1 -0
- package/dist/browser/index.d.ts +2 -0
- package/dist/browser/index.d.ts.map +1 -0
- package/dist/browser/index.js +14 -0
- package/dist/browser/index.js.map +1 -0
- package/dist/browser/link-interceptor.d.ts +38 -0
- package/dist/browser/link-interceptor.d.ts.map +1 -0
- package/dist/browser/link-interceptor.js +99 -0
- package/dist/browser/link-interceptor.js.map +1 -0
- package/dist/browser/logging.d.ts +10 -0
- package/dist/browser/logging.d.ts.map +1 -0
- package/dist/browser/logging.js +29 -0
- package/dist/browser/logging.js.map +1 -0
- package/dist/browser/lru-cache.d.ts +17 -0
- package/dist/browser/lru-cache.d.ts.map +1 -0
- package/dist/browser/lru-cache.js +50 -0
- package/dist/browser/lru-cache.js.map +1 -0
- package/dist/browser/merge-segment-loaders.d.ts +39 -0
- package/dist/browser/merge-segment-loaders.d.ts.map +1 -0
- package/dist/browser/merge-segment-loaders.js +102 -0
- package/dist/browser/merge-segment-loaders.js.map +1 -0
- package/dist/browser/navigation-bridge.d.ts +102 -0
- package/dist/browser/navigation-bridge.d.ts.map +1 -0
- package/dist/browser/navigation-bridge.js +708 -0
- package/dist/browser/navigation-bridge.js.map +1 -0
- package/dist/browser/navigation-client.d.ts +25 -0
- package/dist/browser/navigation-client.d.ts.map +1 -0
- package/dist/browser/navigation-client.js +157 -0
- package/dist/browser/navigation-client.js.map +1 -0
- package/dist/browser/navigation-store.d.ts +101 -0
- package/dist/browser/navigation-store.d.ts.map +1 -0
- package/dist/browser/navigation-store.js +625 -0
- package/dist/browser/navigation-store.js.map +1 -0
- package/dist/browser/partial-update.d.ts +75 -0
- package/dist/browser/partial-update.d.ts.map +1 -0
- package/dist/browser/partial-update.js +426 -0
- package/dist/browser/partial-update.js.map +1 -0
- package/dist/browser/react/Link.d.ts +86 -0
- package/dist/browser/react/Link.d.ts.map +1 -0
- package/dist/browser/react/Link.js +128 -0
- package/dist/browser/react/Link.js.map +1 -0
- package/dist/browser/react/NavigationProvider.d.ts +63 -0
- package/dist/browser/react/NavigationProvider.d.ts.map +1 -0
- package/dist/browser/react/NavigationProvider.js +216 -0
- package/dist/browser/react/NavigationProvider.js.map +1 -0
- package/dist/browser/react/ScrollRestoration.d.ts +75 -0
- package/dist/browser/react/ScrollRestoration.d.ts.map +1 -0
- package/dist/browser/react/ScrollRestoration.js +57 -0
- package/dist/browser/react/ScrollRestoration.js.map +1 -0
- package/dist/browser/react/context.d.ts +46 -0
- package/dist/browser/react/context.d.ts.map +1 -0
- package/dist/browser/react/context.js +10 -0
- package/dist/browser/react/context.js.map +1 -0
- package/dist/browser/react/index.d.ts +11 -0
- package/dist/browser/react/index.d.ts.map +1 -0
- package/dist/browser/react/index.js +22 -0
- package/dist/browser/react/index.js.map +1 -0
- package/dist/browser/react/location-state-shared.d.ts +63 -0
- package/dist/browser/react/location-state-shared.d.ts.map +1 -0
- package/dist/browser/react/location-state-shared.js +81 -0
- package/dist/browser/react/location-state-shared.js.map +1 -0
- package/dist/browser/react/location-state.d.ts +23 -0
- package/dist/browser/react/location-state.d.ts.map +1 -0
- package/dist/browser/react/location-state.js +29 -0
- package/dist/browser/react/location-state.js.map +1 -0
- package/dist/browser/react/mount-context.d.ts +24 -0
- package/dist/browser/react/mount-context.d.ts.map +1 -0
- package/dist/browser/react/mount-context.js +24 -0
- package/dist/browser/react/mount-context.js.map +1 -0
- package/dist/browser/react/use-action.d.ts +64 -0
- package/dist/browser/react/use-action.d.ts.map +1 -0
- package/dist/browser/react/use-action.js +134 -0
- package/dist/browser/react/use-action.js.map +1 -0
- package/dist/browser/react/use-client-cache.d.ts +41 -0
- package/dist/browser/react/use-client-cache.d.ts.map +1 -0
- package/{src/browser/react/use-client-cache.ts → dist/browser/react/use-client-cache.js} +9 -28
- 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/{src/handles/index.ts → dist/handles/index.d.ts} +1 -2
- 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/dist/href-context.d.ts +29 -0
- package/dist/href-context.d.ts.map +1 -0
- package/dist/href-context.js +21 -0
- package/dist/href-context.js.map +1 -0
- package/dist/index.d.ts +73 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +91 -0
- package/dist/index.js.map +1 -0
- package/dist/index.rsc.d.ts +32 -0
- package/dist/index.rsc.d.ts.map +1 -0
- package/dist/index.rsc.js +40 -0
- package/dist/index.rsc.js.map +1 -0
- package/dist/internal-debug.d.ts +2 -0
- package/dist/internal-debug.d.ts.map +1 -0
- package/dist/internal-debug.js +5 -0
- package/dist/internal-debug.js.map +1 -0
- package/dist/loader.d.ts +14 -0
- package/dist/loader.d.ts.map +1 -0
- package/dist/loader.js +20 -0
- package/dist/loader.js.map +1 -0
- package/dist/loader.rsc.d.ts +19 -0
- package/dist/loader.rsc.d.ts.map +1 -0
- package/dist/loader.rsc.js +99 -0
- package/dist/loader.rsc.js.map +1 -0
- package/{src/network-error-thrower.tsx → dist/network-error-thrower.d.ts} +4 -10
- 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 +4279 -1209
- package/dist/vite/index.js.bak +5448 -0
- package/dist/vite/index.js.map +1 -0
- package/dist/vite/index.named-routes.gen.ts +103 -0
- package/dist/vite/package-resolution.d.ts +43 -0
- package/dist/vite/package-resolution.d.ts.map +1 -0
- package/dist/vite/package-resolution.js +112 -0
- package/dist/vite/package-resolution.js.map +1 -0
- package/dist/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
- package/dist/vite/virtual-entries.d.ts +25 -0
- package/dist/vite/virtual-entries.d.ts.map +1 -0
- package/dist/vite/virtual-entries.js +110 -0
- package/dist/vite/virtual-entries.js.map +1 -0
- package/package.json +86 -15
- package/skills/api-client/SKILL.md +211 -0
- package/skills/breadcrumbs/SKILL.md +85 -6
- package/skills/bundle-analysis/SKILL.md +159 -0
- package/skills/cache-guide/SKILL.md +251 -24
- package/skills/caching/SKILL.md +338 -13
- package/skills/catalog.json +271 -0
- package/skills/comparison/SKILL.md +50 -0
- package/skills/comparison/agents/openai.yaml +4 -0
- package/skills/comparison/references/framework-comparison.md +837 -0
- package/skills/composability/SKILL.md +110 -4
- package/skills/css/SKILL.md +76 -0
- package/skills/debug-manifest/SKILL.md +5 -3
- package/skills/defer-hydration/SKILL.md +235 -0
- package/skills/document-cache/SKILL.md +87 -56
- package/skills/fonts/SKILL.md +1 -1
- package/skills/handler-use/SKILL.md +364 -0
- package/skills/hooks/SKILL.md +73 -691
- package/skills/hooks/data.md +273 -0
- package/skills/hooks/handle-and-actions.md +103 -0
- package/skills/hooks/navigation.md +110 -0
- package/skills/hooks/outlets.md +41 -0
- package/skills/hooks/state.md +228 -0
- package/skills/hooks/urls.md +135 -0
- package/skills/host-router/SKILL.md +129 -27
- package/skills/i18n/SKILL.md +276 -0
- package/skills/intercept/SKILL.md +94 -18
- package/skills/layout/SKILL.md +62 -19
- package/skills/links/SKILL.md +249 -17
- package/skills/loader/SKILL.md +302 -54
- package/skills/middleware/SKILL.md +59 -16
- package/skills/migrate-nextjs/SKILL.md +745 -0
- package/skills/migrate-react-router/SKILL.md +153 -0
- package/skills/migrate-react-router/cloudflare-workers.md +129 -0
- package/skills/migrate-react-router/component-migration.md +196 -0
- package/skills/migrate-react-router/data-and-actions.md +225 -0
- package/skills/migrate-react-router/route-mapping.md +271 -0
- package/skills/mime-routes/SKILL.md +29 -2
- package/skills/observability/SKILL.md +202 -0
- package/skills/parallel/SKILL.md +225 -10
- package/skills/ppr/SKILL.md +622 -0
- package/skills/prerender/SKILL.md +178 -124
- package/skills/rango/SKILL.md +318 -24
- package/skills/react-compiler/SKILL.md +168 -0
- package/skills/response-routes/SKILL.md +138 -49
- package/skills/route/SKILL.md +172 -9
- package/skills/router-setup/SKILL.md +131 -11
- package/skills/scripts/SKILL.md +179 -0
- package/skills/server-actions/SKILL.md +776 -0
- package/skills/shell-manifest/SKILL.md +185 -0
- package/skills/streams-and-websockets/SKILL.md +283 -0
- package/skills/tailwind/SKILL.md +28 -4
- package/skills/testing/SKILL.md +130 -0
- package/skills/testing/bindings.md +103 -0
- package/skills/testing/cache-prerender.md +127 -0
- package/skills/testing/client-components.md +124 -0
- package/skills/testing/e2e-parity.md +125 -0
- package/skills/testing/flight.md +91 -0
- package/skills/testing/handles.md +131 -0
- package/skills/testing/loader.md +128 -0
- package/skills/testing/middleware.md +99 -0
- package/skills/testing/render-handler.md +122 -0
- package/skills/testing/response-routes.md +95 -0
- package/skills/testing/reverse-and-types.md +85 -0
- package/skills/testing/server-actions.md +107 -0
- package/skills/testing/server-tree.md +128 -0
- package/skills/testing/setup.md +123 -0
- package/skills/theme/SKILL.md +1 -1
- package/skills/typesafety/SKILL.md +45 -616
- package/skills/typesafety/env-and-bindings.md +254 -0
- package/skills/typesafety/generated-files-and-cli.md +335 -0
- package/skills/typesafety/params-and-search.md +153 -0
- package/skills/typesafety/route-types.md +209 -0
- package/skills/use-cache/SKILL.md +74 -15
- package/skills/vercel/SKILL.md +128 -0
- package/skills/view-transitions/SKILL.md +337 -0
- package/src/__augment-tests__/augment.ts +81 -0
- package/src/__augment-tests__/augmented.check.ts +116 -0
- package/src/__internal.ts +1 -66
- package/src/browser/action-coordinator.ts +53 -36
- package/src/browser/action-fence.ts +47 -0
- package/src/browser/app-shell.ts +39 -0
- package/src/browser/app-version.ts +14 -0
- package/src/browser/connection-warmup.ts +134 -0
- package/src/browser/cookie-name.ts +140 -0
- package/src/browser/event-controller.ts +257 -158
- package/src/browser/history-state.ts +21 -0
- package/src/browser/index.ts +3 -3
- package/src/browser/invalidate-client-cache.ts +52 -0
- package/src/browser/logging.ts +28 -0
- package/src/browser/merge-segment-loaders.ts +6 -4
- package/src/browser/navigation-bridge.ts +131 -30
- package/src/browser/navigation-client.ts +202 -105
- package/src/browser/navigation-store-handle.ts +38 -0
- package/src/browser/navigation-store.ts +203 -80
- package/src/browser/navigation-transaction.ts +9 -59
- package/src/browser/network-error-handler.ts +34 -7
- package/src/browser/partial-update.ts +205 -121
- package/src/browser/prefetch/cache.ts +247 -72
- package/src/browser/prefetch/fetch.ts +359 -42
- package/src/browser/prefetch/queue.ts +113 -32
- package/src/browser/prefetch/resource-ready.ts +77 -0
- package/src/browser/rango-state.ts +158 -76
- package/src/browser/react/Link.tsx +112 -15
- package/src/browser/react/NavigationProvider.tsx +213 -122
- package/src/browser/react/ScrollRestoration.tsx +10 -6
- package/src/browser/react/context.ts +7 -2
- package/src/browser/react/filter-segment-order.ts +66 -7
- package/src/browser/react/index.ts +0 -48
- package/src/browser/react/location-state-shared.ts +178 -8
- package/src/browser/react/location-state.ts +39 -14
- package/src/browser/react/use-action.ts +6 -15
- package/src/browser/react/use-handle.ts +23 -69
- package/src/browser/react/use-href.tsx +8 -1
- package/src/browser/react/use-link-status.ts +33 -8
- package/src/browser/react/use-navigation.ts +32 -7
- package/src/browser/react/use-params.ts +20 -10
- package/src/browser/react/use-reverse.ts +106 -0
- package/src/browser/react/use-router.ts +46 -11
- package/src/browser/react/use-search-params.ts +0 -5
- package/src/browser/react/use-segments.ts +11 -21
- package/src/browser/response-adapter.ts +99 -8
- package/src/browser/rsc-router.tsx +186 -27
- package/src/browser/scroll-restoration.ts +44 -27
- package/src/browser/segment-reconciler.ts +44 -7
- package/src/browser/segment-structure-assert.ts +2 -2
- package/src/browser/server-action-bridge.ts +244 -71
- package/src/browser/types.ts +127 -12
- package/src/browser/validate-redirect-origin.ts +43 -16
- package/src/build/collect-fallback-refs.ts +107 -0
- package/src/build/generate-manifest.ts +207 -158
- package/src/build/generate-route-types.ts +6 -1
- package/src/build/index.ts +11 -3
- package/src/build/prefix-tree-utils.ts +123 -0
- package/src/build/route-trie.ts +198 -41
- package/src/build/route-types/ast-route-extraction.ts +15 -8
- package/src/build/route-types/codegen.ts +16 -5
- package/src/build/route-types/include-resolution.ts +464 -63
- package/src/build/route-types/param-extraction.ts +6 -3
- package/src/build/route-types/per-module-writer.ts +22 -6
- package/src/build/route-types/router-processing.ts +333 -117
- package/src/build/route-types/scan-filter.ts +9 -2
- package/src/build/route-types/source-scan.ts +216 -0
- package/src/build/runtime-discovery.ts +13 -21
- package/src/cache/cache-error.ts +104 -0
- package/src/cache/cache-key-utils.ts +58 -13
- package/src/cache/cache-policy.ts +108 -34
- package/src/cache/cache-runtime.ts +454 -97
- package/src/cache/cache-scope.ts +233 -101
- package/src/cache/cache-tag.ts +149 -0
- package/src/cache/cf/cf-base64.ts +33 -0
- package/src/cache/cf/cf-cache-constants.ts +127 -0
- package/src/cache/cf/cf-cache-store.ts +2206 -372
- package/src/cache/cf/cf-cache-types.ts +349 -0
- package/src/cache/cf/cf-kv-utils.ts +46 -0
- package/src/cache/cf/cf-tag-marker-memo.ts +105 -0
- package/src/cache/cf/index.ts +6 -16
- package/src/cache/document-cache.ts +144 -49
- package/src/cache/handle-snapshot.ts +70 -0
- package/src/cache/index.ts +23 -20
- package/src/cache/memory-segment-store.ts +243 -37
- package/src/cache/profile-registry.ts +46 -31
- package/src/cache/read-through-swr.ts +56 -12
- package/src/cache/segment-codec.ts +13 -21
- package/src/cache/shell-snapshot.ts +417 -0
- package/src/cache/tag-invalidation.ts +230 -0
- package/src/cache/taint.ts +55 -0
- package/src/cache/types.ts +194 -99
- package/src/cache/vercel/index.ts +11 -0
- package/src/cache/vercel/vercel-cache-store.ts +1132 -0
- package/src/client.rsc.tsx +41 -21
- package/src/client.tsx +116 -290
- package/src/cloudflare/index.ts +11 -0
- package/src/cloudflare/tracing.ts +108 -0
- package/src/component-utils.ts +19 -0
- package/src/components/DefaultDocument.tsx +8 -2
- package/src/context-var.ts +84 -2
- package/src/debug.ts +2 -2
- package/src/decode-loader-results.ts +52 -0
- package/src/defer.ts +185 -0
- package/src/deps/ssr.ts +0 -1
- package/src/encode-kv.ts +49 -0
- package/src/errors.ts +30 -4
- package/src/escape-script.ts +52 -0
- package/src/handle.ts +104 -34
- package/src/handles/MetaTags.tsx +24 -53
- package/src/handles/Scripts.tsx +183 -0
- package/src/handles/breadcrumbs.ts +35 -8
- package/src/handles/deferred-resolution.ts +127 -0
- package/src/handles/is-thenable.ts +18 -0
- package/src/handles/meta.ts +14 -40
- package/src/handles/script.ts +244 -0
- package/src/host/cookie-handler.ts +9 -60
- package/src/host/errors.ts +13 -22
- package/src/host/index.ts +9 -2
- package/src/host/pattern-matcher.ts +23 -52
- package/src/host/router.ts +107 -99
- package/src/host/testing.ts +40 -27
- package/src/host/types.ts +37 -4
- package/src/host/utils.ts +1 -1
- package/src/href-client.ts +137 -22
- package/src/index.rsc.ts +100 -13
- package/src/index.ts +143 -19
- package/src/internal-debug.ts +11 -10
- package/src/loader-store.ts +500 -0
- package/src/loader.rsc.ts +20 -13
- package/src/loader.ts +12 -11
- package/src/missing-id-error.ts +68 -0
- package/src/outlet-context.ts +1 -1
- package/src/outlet-provider.tsx +1 -5
- package/src/prerender/param-hash.ts +16 -16
- package/src/prerender/store.ts +37 -41
- package/src/prerender.ts +215 -86
- package/src/redirect-origin.ts +114 -0
- package/src/regex-escape.ts +8 -0
- package/src/render-error-thrower.tsx +20 -0
- package/src/response-utils.ts +62 -0
- package/src/reverse.ts +65 -15
- package/src/root-error-boundary.tsx +1 -19
- package/src/route-content-wrapper.tsx +19 -77
- package/src/route-definition/dsl-helpers.ts +485 -303
- package/src/route-definition/helper-factories.ts +28 -140
- package/src/route-definition/helpers-types.ts +153 -77
- package/src/route-definition/index.ts +4 -2
- package/src/route-definition/redirect.ts +51 -10
- package/src/route-definition/resolve-handler-use.ts +160 -0
- package/src/route-definition/use-item-types.ts +29 -0
- package/src/route-map-builder.ts +41 -20
- package/src/route-types.ts +37 -46
- package/src/router/basename.ts +14 -0
- package/src/router/content-negotiation.ts +164 -17
- package/src/router/error-handling.ts +45 -18
- package/src/router/find-match.ts +129 -30
- package/src/router/handler-context.ts +83 -39
- package/src/router/instrument.ts +355 -0
- package/src/router/intercept-resolution.ts +48 -24
- package/src/router/lazy-includes.ts +87 -63
- package/src/router/loader-resolution.ts +286 -56
- package/src/router/logging.ts +1 -7
- package/src/router/manifest.ts +102 -55
- package/src/router/match-api.ts +178 -218
- package/src/router/match-context.ts +0 -22
- package/src/router/match-handlers.ts +211 -165
- package/src/router/match-middleware/background-revalidation.ts +66 -22
- package/src/router/match-middleware/cache-lookup.ts +214 -263
- package/src/router/match-middleware/cache-store.ts +105 -50
- package/src/router/match-middleware/intercept-resolution.ts +8 -28
- package/src/router/match-middleware/segment-resolution.ts +51 -18
- package/src/router/match-pipelines.ts +1 -42
- package/src/router/match-result.ts +128 -44
- package/src/router/metrics.ts +5 -34
- package/src/router/middleware-types.ts +13 -142
- package/src/router/middleware.ts +300 -177
- package/src/router/navigation-snapshot.ts +133 -0
- package/src/router/params-util.ts +23 -0
- package/src/router/parse-pattern.ts +115 -0
- package/src/router/pattern-matching.ts +181 -150
- package/src/router/prefetch-cache-ttl.ts +51 -0
- package/src/router/prefetch-limits.ts +37 -0
- package/src/router/prerender-match.ts +203 -58
- package/src/router/preview-match.ts +35 -103
- package/src/router/request-classification.ts +291 -0
- package/src/router/revalidation.ts +123 -73
- package/src/router/route-snapshot.ts +256 -0
- package/src/router/router-context.ts +6 -28
- package/src/router/router-interfaces.ts +146 -35
- package/src/router/router-options.ts +202 -15
- package/src/router/router-registry.ts +2 -5
- package/src/router/segment-resolution/fresh.ts +301 -78
- package/src/router/segment-resolution/helpers.ts +115 -30
- package/src/router/segment-resolution/loader-cache.ts +156 -39
- package/src/router/segment-resolution/loader-mask.ts +60 -0
- package/src/router/segment-resolution/loader-snapshot.ts +259 -0
- package/src/router/segment-resolution/mask-nested.ts +83 -0
- package/src/router/segment-resolution/revalidation.ts +473 -384
- package/src/router/segment-resolution/static-store.ts +19 -5
- package/src/router/segment-resolution/streamed-handler-telemetry.ts +52 -0
- package/src/router/segment-resolution/view-transition-default.ts +56 -0
- package/src/router/segment-resolution.ts +5 -1
- package/src/router/segment-wrappers.ts +6 -5
- package/src/router/state-cookie-name.ts +33 -0
- package/src/router/substitute-pattern-params.ts +75 -0
- package/src/router/telemetry-otel.ts +160 -200
- package/src/router/telemetry.ts +105 -20
- package/src/router/timeout.ts +0 -20
- package/src/router/tracing.ts +215 -0
- package/src/router/trie-matching.ts +171 -59
- package/src/router/types.ts +10 -63
- package/src/router/url-params.ts +57 -0
- package/src/router.ts +206 -71
- package/src/rsc/full-payload.ts +70 -0
- package/src/rsc/handler-context.ts +3 -2
- package/src/rsc/handler.ts +682 -508
- package/src/rsc/helpers.ts +168 -46
- package/src/rsc/index.ts +2 -5
- package/src/rsc/json-route-result.ts +38 -0
- package/src/rsc/loader-fetch.ts +127 -31
- package/src/rsc/manifest-init.ts +33 -42
- package/src/rsc/nonce.ts +10 -1
- package/src/rsc/origin-guard.ts +39 -25
- package/src/rsc/progressive-enhancement.ts +138 -15
- package/src/rsc/redirect-guard.ts +100 -0
- package/src/rsc/response-cache-serve.ts +238 -0
- package/src/rsc/response-error.ts +79 -12
- package/src/rsc/response-route-handler.ts +99 -189
- package/src/rsc/rsc-rendering.ts +498 -73
- package/src/rsc/runtime-warnings.ts +23 -10
- package/src/rsc/server-action.ts +287 -113
- package/src/rsc/shell-capture.ts +1190 -0
- package/src/rsc/shell-serve.ts +181 -0
- package/src/rsc/ssr-setup.ts +18 -2
- package/src/rsc/transition-gate.ts +89 -0
- package/src/rsc/types.ts +62 -6
- package/src/runtime-env.ts +18 -0
- package/src/search-params.ts +35 -30
- package/src/segment-content-promise.ts +67 -0
- package/src/segment-loader-promise.ts +167 -0
- package/src/segment-system.tsx +418 -131
- package/src/serialize.ts +243 -0
- package/src/server/context.ts +367 -61
- package/src/server/cookie-parse.ts +32 -0
- package/src/server/cookie-store.ts +152 -5
- package/src/server/handle-store.ts +40 -38
- package/src/server/loader-registry.ts +38 -46
- package/src/server/request-context.ts +550 -171
- package/src/ssr/index.tsx +467 -174
- package/src/ssr/inject-rsc-eager.ts +167 -0
- package/src/ssr/ssr-root.tsx +228 -0
- package/src/static-handler.ts +27 -18
- package/src/testing/cache-status.ts +162 -0
- package/src/testing/collect-handle.ts +46 -0
- package/src/testing/dispatch.ts +813 -0
- package/src/testing/dom.entry.ts +22 -0
- package/src/testing/e2e/fixture.ts +188 -0
- package/src/testing/e2e/index.ts +128 -0
- package/src/testing/e2e/matchers.ts +35 -0
- package/src/testing/e2e/page-helpers.ts +272 -0
- package/src/testing/e2e/parity.ts +387 -0
- package/src/testing/e2e/server.ts +195 -0
- package/src/testing/flight-matchers.ts +97 -0
- package/src/testing/flight-normalize.ts +11 -0
- package/src/testing/flight-runtime.d.ts +57 -0
- package/src/testing/flight-tree.ts +682 -0
- package/src/testing/flight.entry.ts +52 -0
- package/src/testing/flight.ts +257 -0
- package/src/testing/generated-routes.ts +199 -0
- package/src/testing/index.ts +105 -0
- package/src/testing/internal/context.ts +371 -0
- package/src/testing/internal/flight-client-globals.ts +30 -0
- package/src/testing/internal/seed-vars.ts +54 -0
- package/src/testing/render-handler.ts +357 -0
- package/src/testing/render-route.tsx +584 -0
- package/src/testing/run-loader.ts +385 -0
- package/src/testing/run-middleware.ts +205 -0
- package/src/testing/run-transition-when.ts +164 -0
- package/src/testing/vitest-stubs/cloudflare-email.ts +9 -0
- package/src/testing/vitest-stubs/cloudflare-workers.ts +21 -0
- package/src/testing/vitest-stubs/plugin-rsc.ts +16 -0
- package/src/testing/vitest-stubs/version.ts +5 -0
- package/src/testing/vitest.ts +305 -0
- package/src/theme/ThemeProvider.tsx +56 -84
- package/src/theme/ThemeScript.tsx +7 -9
- package/src/theme/constants.ts +52 -13
- package/src/theme/index.ts +0 -7
- package/src/theme/theme-context.ts +1 -5
- package/src/theme/theme-script.ts +22 -21
- package/src/theme/use-theme.ts +0 -3
- package/src/types/boundaries.ts +0 -35
- package/src/types/cache-types.ts +17 -8
- package/src/types/error-types.ts +30 -90
- package/src/types/global-namespace.ts +54 -41
- package/src/types/handler-context.ts +234 -82
- package/src/types/index.ts +3 -10
- package/src/types/loader-types.ts +44 -15
- package/src/types/request-scope.ts +112 -0
- package/src/types/route-config.ts +20 -52
- package/src/types/route-entry.ts +12 -7
- package/src/types/segments.ts +137 -14
- package/src/urls/include-helper.ts +40 -75
- package/src/urls/include-provider.ts +71 -0
- package/src/urls/index.ts +2 -11
- package/src/urls/path-helper-types.ts +102 -23
- package/src/urls/path-helper.ts +62 -111
- package/src/urls/pattern-types.ts +84 -19
- package/src/urls/response-types.ts +25 -22
- package/src/urls/type-extraction.ts +98 -154
- package/src/urls/urls-function.ts +1 -19
- package/src/use-loader.tsx +346 -89
- package/src/vercel/index.ts +11 -0
- package/src/vercel/tracing.ts +88 -0
- package/src/vite/debug.ts +185 -0
- package/src/vite/discovery/bundle-postprocess.ts +36 -38
- package/src/vite/discovery/dev-prerender-cache.ts +117 -0
- package/src/vite/discovery/discover-routers.ts +130 -85
- package/src/vite/discovery/discovery-errors.ts +255 -0
- package/src/vite/discovery/gate-state.ts +171 -0
- package/src/vite/discovery/prerender-collection.ts +214 -132
- package/src/vite/discovery/route-types-writer.ts +40 -84
- package/src/vite/discovery/self-gen-tracking.ts +27 -1
- package/src/vite/discovery/state.ts +57 -4
- package/src/vite/discovery/virtual-module-codegen.ts +14 -34
- package/src/vite/index.ts +15 -0
- package/src/vite/inject-client-debug.ts +88 -0
- package/src/vite/plugin-types.ts +261 -6
- package/src/vite/plugins/cjs-to-esm.ts +16 -19
- package/src/vite/plugins/client-ref-dedup.ts +16 -11
- package/src/vite/plugins/client-ref-hashing.ts +28 -15
- package/src/vite/plugins/cloudflare-protocol-loader-hook.d.mts +23 -0
- package/src/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
- package/src/vite/plugins/cloudflare-protocol-stub.ts +194 -0
- package/src/vite/plugins/expose-action-id.ts +48 -95
- package/src/vite/plugins/expose-id-utils.ts +96 -51
- package/src/vite/plugins/expose-ids/export-analysis.ts +101 -34
- package/src/vite/plugins/expose-ids/handler-transform.ts +15 -64
- package/src/vite/plugins/expose-ids/loader-transform.ts +14 -24
- package/src/vite/plugins/expose-ids/router-transform.ts +118 -29
- package/src/vite/plugins/expose-internal-ids.ts +553 -317
- package/src/vite/plugins/performance-tracks.ts +89 -0
- package/src/vite/plugins/refresh-cmd.ts +89 -27
- package/src/vite/plugins/use-cache-transform.ts +73 -83
- package/src/vite/plugins/vercel-output.ts +384 -0
- package/src/vite/plugins/version-injector.ts +40 -29
- package/src/vite/plugins/version-plugin.ts +37 -40
- package/src/vite/plugins/virtual-entries.ts +138 -27
- package/src/vite/rango.ts +247 -132
- package/src/vite/router-discovery.ts +1091 -159
- package/src/vite/utils/ast-handler-extract.ts +26 -35
- package/src/vite/utils/banner.ts +4 -4
- package/src/vite/utils/bundle-analysis.ts +10 -15
- package/src/vite/utils/client-chunks.ts +184 -0
- package/src/vite/utils/directive-prologue.ts +40 -0
- package/src/vite/utils/forward-user-plugins.ts +171 -0
- package/src/vite/utils/manifest-utils.ts +4 -59
- package/src/vite/utils/package-resolution.ts +20 -52
- package/src/vite/utils/prerender-utils.ts +98 -38
- package/src/vite/utils/shared-utils.ts +144 -44
- package/src/browser/action-response-classifier.ts +0 -99
- package/src/browser/shallow.ts +0 -40
- package/src/router/middleware-cookies.ts +0 -55
|
@@ -5,6 +5,7 @@ import React, {
|
|
|
5
5
|
useCallback,
|
|
6
6
|
useContext,
|
|
7
7
|
useEffect,
|
|
8
|
+
useMemo,
|
|
8
9
|
useRef,
|
|
9
10
|
type ForwardRefExoticComponent,
|
|
10
11
|
type RefAttributes,
|
|
@@ -32,15 +33,34 @@ export type LinkState =
|
|
|
32
33
|
| StateOrGetter<Record<string, unknown>>;
|
|
33
34
|
|
|
34
35
|
import { prefetchDirect, prefetchQueued } from "../prefetch/fetch.js";
|
|
36
|
+
import { getAppVersion } from "../app-version.js";
|
|
35
37
|
import {
|
|
36
38
|
observeForPrefetch,
|
|
37
39
|
unobserveForPrefetch,
|
|
38
40
|
} from "../prefetch/observer.js";
|
|
39
41
|
|
|
40
|
-
//
|
|
41
|
-
//
|
|
42
|
-
|
|
43
|
-
|
|
42
|
+
// The (hover: none) MediaQueryList, created lazily on first client read and
|
|
43
|
+
// reused across every Link render. matchMedia allocates and registers a live
|
|
44
|
+
// query object; a fresh one per render (Link renders can be very frequent) is
|
|
45
|
+
// wasteful when the same object's `.matches` is already live. Left null on the
|
|
46
|
+
// server (no window).
|
|
47
|
+
let hoverNoneQuery: MediaQueryList | null = null;
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Read current touch/no-hover capability from the cached MediaQueryList. The
|
|
51
|
+
* `.matches` read is live, so `prefetch="adaptive"` still reacts to
|
|
52
|
+
* input-capability changes on hybrid devices (touch laptops, tablets gaining or
|
|
53
|
+
* losing a pointer) and after SSR -> hydrate. The SSR guard returns a stable
|
|
54
|
+
* `false` (pointer/hover default) so the resolved strategy doesn't drift on the
|
|
55
|
+
* server vs the first client render.
|
|
56
|
+
*/
|
|
57
|
+
function isTouchDevice(): boolean {
|
|
58
|
+
if (typeof window === "undefined") return false;
|
|
59
|
+
if (!hoverNoneQuery) {
|
|
60
|
+
hoverNoneQuery = window.matchMedia("(hover: none)");
|
|
61
|
+
}
|
|
62
|
+
return hoverNoneQuery.matches;
|
|
63
|
+
}
|
|
44
64
|
|
|
45
65
|
/**
|
|
46
66
|
* Prefetch strategy for the Link component
|
|
@@ -57,6 +77,20 @@ export type PrefetchStrategy =
|
|
|
57
77
|
| "adaptive"
|
|
58
78
|
| "none";
|
|
59
79
|
|
|
80
|
+
/**
|
|
81
|
+
* Resolve a prefetch strategy, expanding "adaptive" to the concrete strategy
|
|
82
|
+
* for the CURRENT input capability: "viewport" on touch (no-hover) devices,
|
|
83
|
+
* "hover" on pointer devices. Non-adaptive strategies pass through unchanged.
|
|
84
|
+
* Reads touch capability live (not a module-load snapshot) so the result
|
|
85
|
+
* tracks input-capability changes.
|
|
86
|
+
*/
|
|
87
|
+
export function resolveAdaptiveStrategy(
|
|
88
|
+
prefetch: PrefetchStrategy,
|
|
89
|
+
): PrefetchStrategy {
|
|
90
|
+
if (prefetch !== "adaptive") return prefetch;
|
|
91
|
+
return isTouchDevice() ? "viewport" : "hover";
|
|
92
|
+
}
|
|
93
|
+
|
|
60
94
|
/**
|
|
61
95
|
* Link component props
|
|
62
96
|
*/
|
|
@@ -95,6 +129,31 @@ export interface LinkProps extends Omit<
|
|
|
95
129
|
* @default "none"
|
|
96
130
|
*/
|
|
97
131
|
prefetch?: PrefetchStrategy;
|
|
132
|
+
/**
|
|
133
|
+
* Opt-in override for the prefetch cache scope.
|
|
134
|
+
*
|
|
135
|
+
* The default cache is source-agnostic: one shared entry per target,
|
|
136
|
+
* keyed on Rango state + target URL. This is correct for routes whose
|
|
137
|
+
* response shape doesn't depend on where the user navigates from.
|
|
138
|
+
*
|
|
139
|
+
* Set `":source"` when this Link's response would legitimately differ
|
|
140
|
+
* based on the source page — typically when the target route (or one
|
|
141
|
+
* of its layouts) uses a custom `revalidate()` handler that reads
|
|
142
|
+
* `currentUrl` / `currentParams`, and the wildcard entry would
|
|
143
|
+
* therefore serve the wrong diff to a navigation from a different
|
|
144
|
+
* source.
|
|
145
|
+
*
|
|
146
|
+
* Intercept responses are auto-scoped to the source via a server-side
|
|
147
|
+
* tag, so `":source"` is only needed for custom revalidation logic.
|
|
148
|
+
*
|
|
149
|
+
* @example
|
|
150
|
+
* ```tsx
|
|
151
|
+
* // Route uses a `revalidate()` that branches on currentUrl — opt in
|
|
152
|
+
* // so prefetches don't bleed across source pages.
|
|
153
|
+
* <Link to="/dashboard" prefetch="hover" prefetchKey=":source" />
|
|
154
|
+
* ```
|
|
155
|
+
*/
|
|
156
|
+
prefetchKey?: ":source";
|
|
98
157
|
/**
|
|
99
158
|
* State to pass to history.pushState/replaceState.
|
|
100
159
|
* Accessible via useLocationState() hook.
|
|
@@ -182,6 +241,7 @@ export const Link: ForwardRefExoticComponent<
|
|
|
182
241
|
reloadDocument = false,
|
|
183
242
|
revalidate,
|
|
184
243
|
prefetch = "none",
|
|
244
|
+
prefetchKey,
|
|
185
245
|
state,
|
|
186
246
|
children,
|
|
187
247
|
onClick,
|
|
@@ -192,9 +252,20 @@ export const Link: ForwardRefExoticComponent<
|
|
|
192
252
|
const ctx = useContext(NavigationStoreContext);
|
|
193
253
|
const isExternal = isExternalUrl(to);
|
|
194
254
|
|
|
195
|
-
//
|
|
196
|
-
|
|
197
|
-
|
|
255
|
+
// Auto-prefix with basename for app-local paths.
|
|
256
|
+
// Skip if external, already prefixed, or not a root-relative path.
|
|
257
|
+
const resolvedTo = useMemo(() => {
|
|
258
|
+
if (isExternal) return to;
|
|
259
|
+
const bn = ctx?.basename;
|
|
260
|
+
if (!bn || !to.startsWith("/") || to.startsWith(bn + "/") || to === bn)
|
|
261
|
+
return to;
|
|
262
|
+
return to === "/" ? bn : bn + to;
|
|
263
|
+
}, [to, isExternal, ctx?.basename]);
|
|
264
|
+
|
|
265
|
+
// Resolve adaptive: viewport on touch devices, hover on pointer devices.
|
|
266
|
+
// isTouchDevice() is read here (per render), not from a module-load snapshot,
|
|
267
|
+
// so a device whose input capability changes resolves to the current value.
|
|
268
|
+
const resolvedStrategy = resolveAdaptiveStrategy(prefetch);
|
|
198
269
|
|
|
199
270
|
// Internal ref for viewport observation; merge with forwarded ref
|
|
200
271
|
const internalRef = useRef<HTMLAnchorElement | null>(null);
|
|
@@ -273,9 +344,23 @@ export const Link: ForwardRefExoticComponent<
|
|
|
273
344
|
resolvedState = currentState;
|
|
274
345
|
}
|
|
275
346
|
|
|
276
|
-
ctx.navigate(
|
|
347
|
+
ctx.navigate(resolvedTo, {
|
|
348
|
+
replace,
|
|
349
|
+
scroll,
|
|
350
|
+
state: resolvedState,
|
|
351
|
+
revalidate,
|
|
352
|
+
});
|
|
277
353
|
},
|
|
278
|
-
[
|
|
354
|
+
[
|
|
355
|
+
resolvedTo,
|
|
356
|
+
isExternal,
|
|
357
|
+
reloadDocument,
|
|
358
|
+
replace,
|
|
359
|
+
scroll,
|
|
360
|
+
revalidate,
|
|
361
|
+
ctx,
|
|
362
|
+
onClick,
|
|
363
|
+
],
|
|
279
364
|
);
|
|
280
365
|
|
|
281
366
|
const handleMouseEnter = useCallback(() => {
|
|
@@ -289,9 +374,15 @@ export const Link: ForwardRefExoticComponent<
|
|
|
289
374
|
// prefetch — prefetchDirect bypasses the queue, and hasPrefetch
|
|
290
375
|
// deduplicates if the viewport prefetch already completed.
|
|
291
376
|
const segmentState = ctx.store.getSegmentState();
|
|
292
|
-
prefetchDirect(
|
|
377
|
+
prefetchDirect(
|
|
378
|
+
resolvedTo,
|
|
379
|
+
segmentState.currentSegmentIds,
|
|
380
|
+
getAppVersion(),
|
|
381
|
+
ctx.store.getRouterId?.(),
|
|
382
|
+
prefetchKey,
|
|
383
|
+
);
|
|
293
384
|
}
|
|
294
|
-
}, [resolvedStrategy,
|
|
385
|
+
}, [resolvedStrategy, resolvedTo, isExternal, ctx, prefetchKey]);
|
|
295
386
|
|
|
296
387
|
// Viewport/render prefetch: waits for idle before starting,
|
|
297
388
|
// uses concurrency-limited queue to avoid flooding.
|
|
@@ -308,7 +399,13 @@ export const Link: ForwardRefExoticComponent<
|
|
|
308
399
|
const triggerPrefetch = () => {
|
|
309
400
|
if (cancelled) return;
|
|
310
401
|
const segmentState = ctx.store.getSegmentState();
|
|
311
|
-
prefetchQueued(
|
|
402
|
+
prefetchQueued(
|
|
403
|
+
resolvedTo,
|
|
404
|
+
segmentState.currentSegmentIds,
|
|
405
|
+
getAppVersion(),
|
|
406
|
+
ctx.store.getRouterId?.(),
|
|
407
|
+
prefetchKey,
|
|
408
|
+
);
|
|
312
409
|
};
|
|
313
410
|
|
|
314
411
|
// Schedule prefetch only when the app is idle (no navigation/streaming).
|
|
@@ -347,12 +444,12 @@ export const Link: ForwardRefExoticComponent<
|
|
|
347
444
|
unobserveForPrefetch(observedElement);
|
|
348
445
|
}
|
|
349
446
|
};
|
|
350
|
-
}, [resolvedStrategy,
|
|
447
|
+
}, [resolvedStrategy, resolvedTo, isExternal, ctx, prefetchKey]);
|
|
351
448
|
|
|
352
449
|
return (
|
|
353
450
|
<a
|
|
354
451
|
ref={setRef}
|
|
355
|
-
href={
|
|
452
|
+
href={resolvedTo}
|
|
356
453
|
onClick={handleClick}
|
|
357
454
|
onMouseEnter={handleMouseEnter}
|
|
358
455
|
data-link-component
|
|
@@ -362,7 +459,7 @@ export const Link: ForwardRefExoticComponent<
|
|
|
362
459
|
data-revalidate={revalidate === false ? "false" : undefined}
|
|
363
460
|
{...props}
|
|
364
461
|
>
|
|
365
|
-
<LinkContext.Provider value={
|
|
462
|
+
<LinkContext.Provider value={resolvedTo}>{children}</LinkContext.Provider>
|
|
366
463
|
</a>
|
|
367
464
|
);
|
|
368
465
|
});
|
|
@@ -28,6 +28,14 @@ import { NonceContext } from "./nonce-context.js";
|
|
|
28
28
|
import type { ResolvedThemeConfig, Theme } from "../../theme/types.js";
|
|
29
29
|
import { cancelAllPrefetches } from "../prefetch/queue.js";
|
|
30
30
|
import { handleNavigationEnd } from "../scroll-restoration.js";
|
|
31
|
+
import { createAppShellRef, type AppShellRef } from "../app-shell.js";
|
|
32
|
+
import { startConnectionWarmup } from "../connection-warmup.js";
|
|
33
|
+
import { debugLog } from "../logging.js";
|
|
34
|
+
import { cloneHandleData } from "../navigation-store.js";
|
|
35
|
+
import {
|
|
36
|
+
deferredHandleNames,
|
|
37
|
+
resolveDeferredHandleValues,
|
|
38
|
+
} from "../../handles/deferred-resolution.js";
|
|
31
39
|
|
|
32
40
|
/**
|
|
33
41
|
* Process handles from an async generator, updating the event controller
|
|
@@ -46,10 +54,35 @@ async function processHandles(
|
|
|
46
54
|
store: NavigationStore;
|
|
47
55
|
matched?: string[];
|
|
48
56
|
isPartial?: boolean;
|
|
57
|
+
/** Server's `resolvedIds`: every segment re-resolved this request,
|
|
58
|
+
* including null-component ones excluded from `diff`/`segments`.
|
|
59
|
+
* Drives cleanup of stale handle buckets when a re-resolved segment
|
|
60
|
+
* pushed nothing. */
|
|
61
|
+
resolvedIds?: string[];
|
|
49
62
|
historyKey: string;
|
|
50
63
|
},
|
|
51
64
|
): Promise<void> {
|
|
52
|
-
const {
|
|
65
|
+
const {
|
|
66
|
+
eventController,
|
|
67
|
+
store,
|
|
68
|
+
matched,
|
|
69
|
+
isPartial,
|
|
70
|
+
resolvedIds,
|
|
71
|
+
historyKey,
|
|
72
|
+
} = opts;
|
|
73
|
+
|
|
74
|
+
// This nav's instance token, captured before any await — processHandles runs
|
|
75
|
+
// right after its own commit, so this is that commit's token. generateHistoryKey
|
|
76
|
+
// is URL-only, so an A->B->A revisit reuses the key; the token lets a late
|
|
77
|
+
// resolution tell its own visit apart from a newer same-URL visit, so a stale
|
|
78
|
+
// nav can never clobber a fresher one's live state or cache (P1).
|
|
79
|
+
const myInstance = store.getNavInstance();
|
|
80
|
+
|
|
81
|
+
// True while this nav still owns the live page: same history key AND the most
|
|
82
|
+
// recent commit is still ours (no newer nav has committed since).
|
|
83
|
+
const stillLive = (): boolean =>
|
|
84
|
+
historyKey === store.getHistoryKey() &&
|
|
85
|
+
myInstance === store.getNavInstance();
|
|
53
86
|
|
|
54
87
|
let yieldCount = 0;
|
|
55
88
|
for await (const handleData of handlesGenerator) {
|
|
@@ -57,14 +90,98 @@ async function processHandles(
|
|
|
57
90
|
// This prevents handle data from cancelled navigations polluting
|
|
58
91
|
// the current route's breadcrumbs (e.g., quick popstate after clicking a link).
|
|
59
92
|
if (historyKey !== store.getHistoryKey()) {
|
|
60
|
-
|
|
93
|
+
debugLog(
|
|
61
94
|
"[NavigationProvider] Stopping handle processing - user navigated away",
|
|
62
95
|
);
|
|
63
96
|
return;
|
|
64
97
|
}
|
|
65
98
|
|
|
66
99
|
yieldCount++;
|
|
67
|
-
|
|
100
|
+
|
|
101
|
+
// Resolve-by-default: hold the previous resolved value until this yield's
|
|
102
|
+
// deferred (Promise) handle values settle, then apply the fully-resolved
|
|
103
|
+
// snapshot. The hold needs NO extra state — we simply do not touch the store
|
|
104
|
+
// until the values resolve, so useHandle keeps reading (and showing) the
|
|
105
|
+
// previous data. A yield with no deferred value applies synchronously.
|
|
106
|
+
const hasDeferred = deferredHandleNames(handleData).size > 0;
|
|
107
|
+
|
|
108
|
+
if (!hasDeferred) {
|
|
109
|
+
eventController.setHandleData(
|
|
110
|
+
handleData,
|
|
111
|
+
matched,
|
|
112
|
+
isPartial,
|
|
113
|
+
resolvedIds,
|
|
114
|
+
);
|
|
115
|
+
// Keep the cache fresh. The token guard stops a stale same-URL nav writing
|
|
116
|
+
// a newer entry; the owned-write folds probe + write into one scan.
|
|
117
|
+
store.updateCacheHandleDataIfOwned(
|
|
118
|
+
historyKey,
|
|
119
|
+
eventController.getHandleState().data,
|
|
120
|
+
myInstance,
|
|
121
|
+
false,
|
|
122
|
+
);
|
|
123
|
+
continue;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
// The PREVIOUS (held) snapshot — captured before the await so the cache and
|
|
127
|
+
// the navigate-away merge below reflect what useHandle is still showing.
|
|
128
|
+
const previousSnapshot = cloneHandleData(
|
|
129
|
+
eventController.getHandleState().data,
|
|
130
|
+
);
|
|
131
|
+
|
|
132
|
+
// The route HAS changed even though the handle data is held, so update
|
|
133
|
+
// `routeSegmentIds` (what useSegments reads) now. This leaves `data` /
|
|
134
|
+
// `segmentOrder` (what useHandle collects over) untouched, so useHandle keeps
|
|
135
|
+
// holding its previous value while useSegments reflects the new route.
|
|
136
|
+
eventController.setRouteSegmentIds(matched ?? []);
|
|
137
|
+
|
|
138
|
+
// Deferred-pending: the new values are not applied yet (the previous value is
|
|
139
|
+
// held), so the cache entry must NOT be served as fresh on a popstate return.
|
|
140
|
+
// Mark it STALE + handlesPending (token-guarded), storing the PREVIOUS (held)
|
|
141
|
+
// snapshot. P1 fix: a deferred value is a SERVER-side promise streamed via
|
|
142
|
+
// Flight, so a navigate-away ABORTS the stream and the resolve below never
|
|
143
|
+
// settles. stale makes a popstate return revalidate; handlesPending makes that
|
|
144
|
+
// revalidation a FULL re-render (no client segment IDs) so the server
|
|
145
|
+
// re-streams the handles — a diff-only revalidation would omit the unchanged
|
|
146
|
+
// segments' handles and the deferred value would never land (see the
|
|
147
|
+
// segmentIds branch in navigation-bridge.ts).
|
|
148
|
+
store.updateCacheHandleDataIfOwned(
|
|
149
|
+
historyKey,
|
|
150
|
+
previousSnapshot,
|
|
151
|
+
myInstance,
|
|
152
|
+
true,
|
|
153
|
+
true,
|
|
154
|
+
);
|
|
155
|
+
|
|
156
|
+
// Resolve every deferred value (allSettled; rejected + nullish dropped, sync
|
|
157
|
+
// values pass through). Each stream yield is a full cumulative snapshot.
|
|
158
|
+
const resolved = await resolveDeferredHandleValues(handleData);
|
|
159
|
+
|
|
160
|
+
if (!stillLive()) {
|
|
161
|
+
// Navigated away (or a same-URL nav superseded us) while resolving. We do
|
|
162
|
+
// NOT write `resolved` into the entry. It is THIS yield's snapshot only (on a
|
|
163
|
+
// partial nav, just the re-resolved segments' buckets), and a correct write
|
|
164
|
+
// needs setHandleData's nested per-segment merge + matched/resolvedIds
|
|
165
|
+
// cleanup: HandleData is handleName -> segmentId -> entries[], so a
|
|
166
|
+
// handle-name-level spread would drop a shared layout bucket (e.g. a
|
|
167
|
+
// Breadcrumbs layout crumb under L0 when the route pushed under R0) and would
|
|
168
|
+
// mark stale previous-route buckets fresh. We cannot run that merge here
|
|
169
|
+
// without touching the now-different live page. Instead leave the entry as it
|
|
170
|
+
// was marked before the await — stale + handlesPending — so a popstate return
|
|
171
|
+
// revalidates with a full re-render and re-streams the handles. A newer nav
|
|
172
|
+
// owning the entry has already overwritten it; nothing to do either way.
|
|
173
|
+
continue;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
// Still live: apply the fully-resolved snapshot and refresh the cache fresh.
|
|
177
|
+
eventController.setHandleData(resolved, matched, isPartial, resolvedIds);
|
|
178
|
+
store.updateCacheHandleDataIfOwned(
|
|
179
|
+
historyKey,
|
|
180
|
+
eventController.getHandleState().data,
|
|
181
|
+
myInstance,
|
|
182
|
+
false,
|
|
183
|
+
false,
|
|
184
|
+
);
|
|
68
185
|
}
|
|
69
186
|
|
|
70
187
|
// Check again before final updates
|
|
@@ -72,19 +189,19 @@ async function processHandles(
|
|
|
72
189
|
return;
|
|
73
190
|
}
|
|
74
191
|
|
|
75
|
-
// For partial updates where the generator yielded nothing (
|
|
76
|
-
//
|
|
77
|
-
//
|
|
78
|
-
// route might not push any breadcrumbs, but we still need to remove the old ones.
|
|
192
|
+
// For partial updates where the generator yielded nothing (every
|
|
193
|
+
// re-resolved handler pushed nothing), still call setHandleData so the
|
|
194
|
+
// cleanup pass can clear out stale buckets for those segments.
|
|
79
195
|
if (yieldCount === 0 && matched) {
|
|
80
|
-
eventController.setHandleData({}, matched, true);
|
|
196
|
+
eventController.setHandleData({}, matched, true, resolvedIds);
|
|
81
197
|
}
|
|
82
198
|
|
|
83
199
|
// After handles processing completes, update the cache's handleData.
|
|
84
200
|
// This fixes a race condition where commit() caches stale handleData before
|
|
85
201
|
// the async handles processing completes.
|
|
86
|
-
// Only update if we're still on the same page
|
|
87
|
-
|
|
202
|
+
// Only update if we're still on the same page AND this is still the live nav
|
|
203
|
+
// (the token guard stops a stale same-URL nav writing a newer nav's state).
|
|
204
|
+
if (stillLive()) {
|
|
88
205
|
const finalHandleData = eventController.getHandleState().data;
|
|
89
206
|
store.updateCacheHandleData(historyKey, finalHandleData);
|
|
90
207
|
}
|
|
@@ -133,10 +250,33 @@ export interface NavigationProviderProps {
|
|
|
133
250
|
warmupEnabled?: boolean;
|
|
134
251
|
|
|
135
252
|
/**
|
|
136
|
-
* App version from server payload
|
|
137
|
-
*
|
|
253
|
+
* App version from server payload.
|
|
254
|
+
* Used only as a fallback when `appShellRef` is not supplied.
|
|
138
255
|
*/
|
|
139
256
|
version?: string;
|
|
257
|
+
|
|
258
|
+
/**
|
|
259
|
+
* URL prefix for all routes (from createRouter({ basename })).
|
|
260
|
+
* Used only as a fallback when `appShellRef` is not supplied.
|
|
261
|
+
*/
|
|
262
|
+
basename?: string;
|
|
263
|
+
|
|
264
|
+
/**
|
|
265
|
+
* App-shell ref. When provided, the context's `basename` and `version` are
|
|
266
|
+
* read through it (live getters) so they don't close over a stale snapshot or
|
|
267
|
+
* invalidate the memoized context value. The shell is set once at init and is
|
|
268
|
+
* not swapped within a session — a cross-app navigation is a full document
|
|
269
|
+
* load (X-RSC-Reload), so the target app establishes its own shell on load.
|
|
270
|
+
*/
|
|
271
|
+
appShellRef?: AppShellRef;
|
|
272
|
+
|
|
273
|
+
/**
|
|
274
|
+
* CSP nonce to expose via NonceContext. Production leaves this undefined — the
|
|
275
|
+
* browser has no nonce (it is a server-side HTML concern), and SSR provides the
|
|
276
|
+
* nonce through its own NonceContext.Provider. Test harnesses (renderRoute) set
|
|
277
|
+
* it to seed a nonce so components calling useNonce() can be exercised.
|
|
278
|
+
*/
|
|
279
|
+
nonce?: string;
|
|
140
280
|
}
|
|
141
281
|
|
|
142
282
|
/**
|
|
@@ -169,6 +309,9 @@ export function NavigationProvider({
|
|
|
169
309
|
initialTheme,
|
|
170
310
|
warmupEnabled,
|
|
171
311
|
version,
|
|
312
|
+
basename,
|
|
313
|
+
appShellRef,
|
|
314
|
+
nonce,
|
|
172
315
|
}: NavigationProviderProps): ReactNode {
|
|
173
316
|
// Track current payload for rendering (this triggers re-renders)
|
|
174
317
|
const [payload, setPayload] = useState(initialPayload);
|
|
@@ -190,114 +333,56 @@ export function NavigationProvider({
|
|
|
190
333
|
await bridge.refresh();
|
|
191
334
|
}, []);
|
|
192
335
|
|
|
193
|
-
//
|
|
194
|
-
|
|
195
|
-
|
|
336
|
+
// basename/version are always read through a shell ref so the context value
|
|
337
|
+
// has a single shape. Both are set once: a supplied appShellRef is seeded
|
|
338
|
+
// from the init payload (a cross-app navigation reloads, so it is not swapped
|
|
339
|
+
// in-session), and the standalone fallback wraps the mount-time props.
|
|
340
|
+
const fallbackShellRef = useRef<AppShellRef | null>(null);
|
|
341
|
+
if (!fallbackShellRef.current) {
|
|
342
|
+
fallbackShellRef.current = createAppShellRef({ basename, version });
|
|
343
|
+
}
|
|
344
|
+
const shellRef = appShellRef ?? fallbackShellRef.current;
|
|
345
|
+
|
|
346
|
+
const contextValue = useMemo<NavigationStoreContextValue>(() => {
|
|
347
|
+
const value = {
|
|
196
348
|
store,
|
|
197
349
|
eventController,
|
|
198
350
|
navigate,
|
|
199
351
|
refresh,
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
352
|
+
} as NavigationStoreContextValue;
|
|
353
|
+
Object.defineProperty(value, "basename", {
|
|
354
|
+
configurable: true,
|
|
355
|
+
enumerable: true,
|
|
356
|
+
get: () => shellRef.get().basename,
|
|
357
|
+
});
|
|
358
|
+
Object.defineProperty(value, "version", {
|
|
359
|
+
configurable: true,
|
|
360
|
+
enumerable: true,
|
|
361
|
+
get: () => shellRef.get().version,
|
|
362
|
+
});
|
|
363
|
+
return value;
|
|
364
|
+
}, []);
|
|
204
365
|
|
|
205
|
-
// Connection warmup: keep TLS alive after idle periods.
|
|
206
|
-
//
|
|
207
|
-
//
|
|
208
|
-
//
|
|
366
|
+
// Connection warmup: keep TLS alive after idle periods. After 60s of no
|
|
367
|
+
// interaction the connection is marked cold; the next pointer/touch
|
|
368
|
+
// interaction or visibility change warms TLS via a HEAD request before the
|
|
369
|
+
// user clicks a link. State machine lives in connection-warmup.ts.
|
|
209
370
|
useEffect(() => {
|
|
210
371
|
if (!warmupEnabled) return;
|
|
211
|
-
|
|
212
|
-
const IDLE_TIMEOUT = 60_000;
|
|
213
|
-
const DEBOUNCE_DELAY = 150;
|
|
214
|
-
|
|
215
|
-
let idleTimer: ReturnType<typeof setTimeout> | undefined;
|
|
216
|
-
let debounceTimer: ReturnType<typeof setTimeout> | undefined;
|
|
217
|
-
let isCold = false;
|
|
218
|
-
let warmupListenersAttached = false;
|
|
219
|
-
|
|
220
|
-
function sendWarmup() {
|
|
221
|
-
isCold = false;
|
|
222
|
-
fetch("/?_rsc_warmup", { method: "HEAD" }).catch(() => {});
|
|
223
|
-
}
|
|
224
|
-
|
|
225
|
-
function triggerWarmup() {
|
|
226
|
-
if (!isCold) return;
|
|
227
|
-
clearTimeout(debounceTimer);
|
|
228
|
-
debounceTimer = setTimeout(() => {
|
|
229
|
-
sendWarmup();
|
|
230
|
-
detachWarmupListeners();
|
|
231
|
-
resetIdleTimer();
|
|
232
|
-
}, DEBOUNCE_DELAY);
|
|
233
|
-
}
|
|
234
|
-
|
|
235
|
-
function onVisibilityChange() {
|
|
236
|
-
if (document.visibilityState === "visible" && isCold) {
|
|
237
|
-
triggerWarmup();
|
|
238
|
-
}
|
|
239
|
-
}
|
|
240
|
-
|
|
241
|
-
function attachWarmupListeners() {
|
|
242
|
-
if (warmupListenersAttached) return;
|
|
243
|
-
warmupListenersAttached = true;
|
|
244
|
-
document.addEventListener("visibilitychange", onVisibilityChange);
|
|
245
|
-
document.addEventListener("mousemove", triggerWarmup, { once: true });
|
|
246
|
-
document.addEventListener("touchstart", triggerWarmup, { once: true });
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
function detachWarmupListeners() {
|
|
250
|
-
warmupListenersAttached = false;
|
|
251
|
-
document.removeEventListener("visibilitychange", onVisibilityChange);
|
|
252
|
-
document.removeEventListener("mousemove", triggerWarmup);
|
|
253
|
-
document.removeEventListener("touchstart", triggerWarmup);
|
|
254
|
-
}
|
|
255
|
-
|
|
256
|
-
function markCold() {
|
|
257
|
-
isCold = true;
|
|
258
|
-
attachWarmupListeners();
|
|
259
|
-
}
|
|
260
|
-
|
|
261
|
-
function resetIdleTimer() {
|
|
262
|
-
clearTimeout(idleTimer);
|
|
263
|
-
isCold = false;
|
|
264
|
-
idleTimer = setTimeout(markCold, IDLE_TIMEOUT);
|
|
265
|
-
}
|
|
266
|
-
|
|
267
|
-
// Activity events that reset the idle timer
|
|
268
|
-
const activityEvents = [
|
|
269
|
-
"mousemove",
|
|
270
|
-
"keydown",
|
|
271
|
-
"touchstart",
|
|
272
|
-
"scroll",
|
|
273
|
-
] as const;
|
|
274
|
-
const activityOptions: AddEventListenerOptions = { passive: true };
|
|
275
|
-
|
|
276
|
-
for (const event of activityEvents) {
|
|
277
|
-
document.addEventListener(event, resetIdleTimer, activityOptions);
|
|
278
|
-
}
|
|
279
|
-
|
|
280
|
-
resetIdleTimer();
|
|
281
|
-
|
|
282
|
-
return () => {
|
|
283
|
-
clearTimeout(idleTimer);
|
|
284
|
-
clearTimeout(debounceTimer);
|
|
285
|
-
detachWarmupListeners();
|
|
286
|
-
for (const event of activityEvents) {
|
|
287
|
-
document.removeEventListener(event, resetIdleTimer);
|
|
288
|
-
}
|
|
289
|
-
};
|
|
372
|
+
return startConnectionWarmup();
|
|
290
373
|
}, [warmupEnabled]);
|
|
291
374
|
|
|
292
|
-
// Cancel
|
|
293
|
-
//
|
|
375
|
+
// Cancel non-matching prefetches when navigation starts.
|
|
376
|
+
// Frees connections so the navigation fetch isn't competing with
|
|
377
|
+
// speculative prefetches. The prefetch matching the navigation target
|
|
378
|
+
// is kept alive so it can be reused via consumeInflightPrefetch.
|
|
294
379
|
useEffect(() => {
|
|
295
380
|
let wasIdle = true;
|
|
296
381
|
const unsub = eventController.subscribe(() => {
|
|
297
382
|
const state = eventController.getState();
|
|
298
383
|
const isIdle = state.state === "idle" && !state.isStreaming;
|
|
299
384
|
if (wasIdle && !isIdle) {
|
|
300
|
-
cancelAllPrefetches();
|
|
385
|
+
cancelAllPrefetches(state.pendingUrl);
|
|
301
386
|
}
|
|
302
387
|
wasIdle = isIdle;
|
|
303
388
|
});
|
|
@@ -336,8 +421,12 @@ export function NavigationProvider({
|
|
|
336
421
|
metadata: update.metadata,
|
|
337
422
|
});
|
|
338
423
|
|
|
339
|
-
// Update route params
|
|
340
|
-
|
|
424
|
+
// Update route params. Only reset when the server actually sends a params
|
|
425
|
+
// map — an absent `params` field means "no change" (e.g., legacy action
|
|
426
|
+
// responses that omitted params). Explicit `{}` still clears correctly.
|
|
427
|
+
if (update.metadata.params !== undefined) {
|
|
428
|
+
eventController.setParams(update.metadata.params);
|
|
429
|
+
}
|
|
341
430
|
|
|
342
431
|
// Update handle data progressively as it streams in
|
|
343
432
|
if (update.metadata.handles) {
|
|
@@ -350,24 +439,20 @@ export function NavigationProvider({
|
|
|
350
439
|
store,
|
|
351
440
|
matched: update.metadata.matched,
|
|
352
441
|
isPartial: update.metadata.isPartial,
|
|
442
|
+
resolvedIds: update.metadata.resolvedIds,
|
|
353
443
|
historyKey,
|
|
354
444
|
}).catch((err) =>
|
|
355
445
|
console.error("[NavigationProvider] Error consuming handles:", err),
|
|
356
446
|
);
|
|
357
|
-
} else if (update.metadata.cachedHandleData) {
|
|
358
|
-
// For back/forward navigation from cache, restore the cached handleData
|
|
359
|
-
// This restores breadcrumbs to the exact state they were when the page was cached
|
|
360
|
-
eventController.setHandleData(
|
|
361
|
-
update.metadata.cachedHandleData,
|
|
362
|
-
update.metadata.matched,
|
|
363
|
-
false, // full replace - restore entire cached state
|
|
364
|
-
);
|
|
365
447
|
} else if (update.metadata.matched) {
|
|
366
|
-
//
|
|
448
|
+
// cachedHandleData present -> full restore (back/forward); absent ->
|
|
449
|
+
// partial cleanup of segments no longer matched.
|
|
450
|
+
const cached = update.metadata.cachedHandleData;
|
|
367
451
|
eventController.setHandleData(
|
|
368
|
-
{},
|
|
452
|
+
cached ?? {},
|
|
369
453
|
update.metadata.matched,
|
|
370
|
-
|
|
454
|
+
cached === undefined,
|
|
455
|
+
cached === undefined ? update.metadata.resolvedIds : undefined,
|
|
371
456
|
);
|
|
372
457
|
}
|
|
373
458
|
});
|
|
@@ -380,7 +465,8 @@ export function NavigationProvider({
|
|
|
380
465
|
payload.root instanceof Promise ? use(payload.root) : payload.root;
|
|
381
466
|
|
|
382
467
|
// Wrap content in RootErrorBoundary to catch:
|
|
383
|
-
// 1. Errors from
|
|
468
|
+
// 1. Errors from RenderErrorThrower (network failures and unprocessable
|
|
469
|
+
// navigation responses, routed here by the navigation bridge)
|
|
384
470
|
// 2. Client component errors that occur before/outside the segment tree's error boundary
|
|
385
471
|
// 3. Errors during promise resolution or navigation state updates
|
|
386
472
|
// This acts as a safety net - the segment tree has its own RootErrorBoundary that
|
|
@@ -389,7 +475,11 @@ export function NavigationProvider({
|
|
|
389
475
|
// Build the content tree
|
|
390
476
|
let content = <RootErrorBoundary>{root}</RootErrorBoundary>;
|
|
391
477
|
|
|
392
|
-
// Wrap with ThemeProvider when theme is enabled
|
|
478
|
+
// Wrap with ThemeProvider when theme is enabled. The ThemeProvider is
|
|
479
|
+
// document-lifetime: its config comes from the initial load and persists for
|
|
480
|
+
// the session. It sits above the segment tree and is not remounted in-session;
|
|
481
|
+
// a cross-app navigation is a full document load (X-RSC-Reload), so the target
|
|
482
|
+
// app's theme config takes effect on its own load.
|
|
393
483
|
if (themeConfig) {
|
|
394
484
|
content = (
|
|
395
485
|
<ThemeProvider config={themeConfig} initialTheme={initialTheme}>
|
|
@@ -400,9 +490,10 @@ export function NavigationProvider({
|
|
|
400
490
|
|
|
401
491
|
// Match SSR tree shape: NonceContext.Provider is always present so
|
|
402
492
|
// hydration sees the same component tree. Value is undefined on the
|
|
403
|
-
// client — CSP nonces are a server-side HTML concern
|
|
493
|
+
// client — CSP nonces are a server-side HTML concern — unless a test
|
|
494
|
+
// harness seeded one via the `nonce` prop.
|
|
404
495
|
content = (
|
|
405
|
-
<NonceContext.Provider value={
|
|
496
|
+
<NonceContext.Provider value={nonce}>{content}</NonceContext.Provider>
|
|
406
497
|
);
|
|
407
498
|
|
|
408
499
|
return (
|