@rangojs/router 0.0.0-experimental.9eb4192e → 0.0.0-experimental.a014d2b7
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 -0
- package/README.md +123 -15
- 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 +319 -95
- 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 +2011 -783
- 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/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 +67 -15
- package/skills/api-client/SKILL.md +211 -0
- package/skills/breadcrumbs/SKILL.md +61 -1
- package/skills/bundle-analysis/SKILL.md +159 -0
- package/skills/cache-guide/SKILL.md +224 -32
- package/skills/caching/SKILL.md +279 -17
- package/skills/composability/SKILL.md +27 -3
- package/skills/css/SKILL.md +76 -0
- package/skills/debug-manifest/SKILL.md +4 -2
- package/skills/document-cache/SKILL.md +78 -55
- package/skills/handler-use/SKILL.md +11 -9
- package/skills/hooks/SKILL.md +240 -28
- package/skills/host-router/SKILL.md +83 -23
- package/skills/i18n/SKILL.md +276 -0
- package/skills/intercept/SKILL.md +68 -19
- package/skills/layout/SKILL.md +13 -9
- package/skills/links/SKILL.md +175 -17
- package/skills/loader/SKILL.md +217 -24
- package/skills/middleware/SKILL.md +18 -10
- package/skills/migrate-nextjs/SKILL.md +43 -19
- package/skills/migrate-react-router/SKILL.md +8 -2
- package/skills/mime-routes/SKILL.md +28 -1
- package/skills/observability/SKILL.md +172 -0
- package/skills/parallel/SKILL.md +18 -7
- package/skills/prerender/SKILL.md +65 -60
- package/skills/rango/SKILL.md +251 -24
- package/skills/react-compiler/SKILL.md +168 -0
- package/skills/response-routes/SKILL.md +115 -48
- package/skills/route/SKILL.md +46 -5
- package/skills/router-setup/SKILL.md +30 -8
- package/skills/scripts/SKILL.md +179 -0
- package/skills/server-actions/SKILL.md +775 -0
- package/skills/tailwind/SKILL.md +27 -3
- 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 +129 -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 +84 -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/typesafety/SKILL.md +319 -28
- package/skills/use-cache/SKILL.md +57 -14
- 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 +0 -65
- package/src/browser/action-coordinator.ts +53 -36
- package/src/browser/action-fence.ts +47 -0
- package/src/browser/app-shell.ts +14 -27
- package/src/browser/connection-warmup.ts +134 -0
- package/src/browser/cookie-name.ts +140 -0
- package/src/browser/event-controller.ts +192 -150
- 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/navigation-bridge.ts +95 -75
- package/src/browser/navigation-client.ts +110 -84
- package/src/browser/navigation-store-handle.ts +38 -0
- package/src/browser/navigation-store.ts +114 -90
- package/src/browser/navigation-transaction.ts +9 -59
- package/src/browser/network-error-handler.ts +34 -7
- package/src/browser/partial-update.ts +147 -147
- package/src/browser/prefetch/cache.ts +107 -72
- package/src/browser/prefetch/fetch.ts +204 -34
- package/src/browser/prefetch/queue.ts +6 -3
- package/src/browser/rango-state.ts +157 -115
- package/src/browser/react/Link.tsx +30 -7
- package/src/browser/react/NavigationProvider.tsx +272 -142
- package/src/browser/react/ScrollRestoration.tsx +10 -6
- package/src/browser/react/deferred-handle-resolution.ts +75 -0
- 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 +17 -14
- 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 +10 -5
- package/src/browser/react/use-params.ts +11 -11
- package/src/browser/react/use-reverse.ts +106 -0
- package/src/browser/react/use-router.ts +20 -5
- 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 +73 -34
- package/src/browser/scroll-restoration.ts +30 -17
- package/src/browser/segment-structure-assert.ts +2 -2
- package/src/browser/server-action-bridge.ts +214 -55
- package/src/browser/types.ts +80 -22
- package/src/browser/validate-redirect-origin.ts +43 -16
- package/src/build/collect-fallback-refs.ts +107 -0
- package/src/build/generate-manifest.ts +60 -35
- package/src/build/generate-route-types.ts +2 -1
- package/src/build/index.ts +8 -2
- package/src/build/prefix-tree-utils.ts +123 -0
- package/src/build/route-trie.ts +117 -14
- 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 +117 -23
- 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 +55 -28
- package/src/build/route-types/scan-filter.ts +1 -1
- package/src/build/route-types/source-scan.ts +216 -0
- package/src/build/runtime-discovery.ts +9 -20
- package/src/cache/cache-error.ts +104 -0
- package/src/cache/cache-key-utils.ts +29 -13
- package/src/cache/cache-policy.ts +108 -34
- package/src/cache/cache-runtime.ts +224 -41
- package/src/cache/cache-scope.ts +188 -82
- package/src/cache/cache-tag.ts +103 -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 +1990 -377
- 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 +89 -21
- package/src/cache/handle-snapshot.ts +70 -0
- package/src/cache/index.ts +10 -20
- package/src/cache/memory-segment-store.ts +136 -37
- package/src/cache/profile-registry.ts +46 -31
- package/src/cache/read-through-swr.ts +56 -12
- package/src/cache/segment-codec.ts +9 -17
- package/src/cache/tag-invalidation.ts +230 -0
- package/src/cache/types.ts +37 -100
- package/src/client.rsc.tsx +44 -21
- package/src/client.tsx +36 -61
- package/src/cloudflare/index.ts +11 -0
- package/src/cloudflare/tracing.ts +109 -0
- package/src/component-utils.ts +19 -0
- package/src/components/DefaultDocument.tsx +8 -2
- package/src/context-var.ts +18 -6
- package/src/decode-loader-results.ts +52 -0
- package/src/defer.ts +196 -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 +31 -23
- package/src/handles/MetaTags.tsx +62 -19
- package/src/handles/Scripts.tsx +183 -0
- package/src/handles/breadcrumbs.ts +37 -8
- package/src/handles/is-thenable.ts +19 -0
- package/src/handles/meta.ts +51 -40
- package/src/handles/script.ts +244 -0
- package/src/host/cookie-handler.ts +9 -60
- package/src/host/errors.ts +0 -24
- package/src/host/index.ts +8 -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 +93 -12
- package/src/index.ts +91 -14
- 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-provider.tsx +1 -5
- package/src/prerender/param-hash.ts +16 -16
- package/src/prerender/store.ts +32 -37
- package/src/prerender.ts +61 -6
- package/src/redirect-origin.ts +100 -0
- package/src/regex-escape.ts +8 -0
- package/src/render-error-thrower.tsx +20 -0
- package/src/response-utils.ts +34 -0
- package/src/reverse.ts +65 -40
- package/src/root-error-boundary.tsx +1 -19
- package/src/route-content-wrapper.tsx +19 -77
- package/src/route-definition/dsl-helpers.ts +293 -311
- package/src/route-definition/helper-factories.ts +28 -140
- package/src/route-definition/helpers-types.ts +82 -55
- package/src/route-definition/index.ts +1 -2
- package/src/route-definition/redirect.ts +44 -11
- package/src/route-definition/resolve-handler-use.ts +6 -1
- package/src/route-definition/use-item-types.ts +29 -0
- package/src/route-map-builder.ts +0 -16
- package/src/route-types.ts +19 -46
- package/src/router/basename.ts +14 -0
- package/src/router/content-negotiation.ts +73 -25
- package/src/router/error-handling.ts +45 -18
- package/src/router/find-match.ts +44 -23
- package/src/router/handler-context.ts +10 -42
- package/src/router/instrument.ts +350 -0
- package/src/router/intercept-resolution.ts +39 -20
- package/src/router/lazy-includes.ts +9 -46
- package/src/router/loader-resolution.ts +152 -72
- package/src/router/logging.ts +0 -6
- package/src/router/manifest.ts +18 -29
- package/src/router/match-api.ts +6 -21
- package/src/router/match-context.ts +0 -22
- package/src/router/match-handlers.ts +58 -58
- package/src/router/match-middleware/background-revalidation.ts +40 -24
- package/src/router/match-middleware/cache-lookup.ts +159 -285
- package/src/router/match-middleware/cache-store.ts +64 -52
- package/src/router/match-middleware/intercept-resolution.ts +0 -22
- package/src/router/match-middleware/segment-resolution.ts +0 -22
- package/src/router/match-pipelines.ts +1 -42
- package/src/router/match-result.ts +44 -74
- package/src/router/metrics.ts +0 -34
- package/src/router/middleware-types.ts +5 -112
- package/src/router/middleware.ts +237 -165
- package/src/router/navigation-snapshot.ts +0 -51
- package/src/router/params-util.ts +23 -0
- package/src/router/pattern-matching.ts +85 -94
- package/src/router/prefetch-cache-ttl.ts +51 -0
- package/src/router/prerender-match.ts +104 -65
- package/src/router/preview-match.ts +3 -1
- package/src/router/request-classification.ts +28 -62
- package/src/router/revalidation.ts +123 -73
- package/src/router/route-snapshot.ts +0 -1
- package/src/router/router-context.ts +3 -28
- package/src/router/router-interfaces.ts +83 -35
- package/src/router/router-options.ts +136 -5
- package/src/router/router-registry.ts +2 -5
- package/src/router/segment-resolution/fresh.ts +97 -84
- package/src/router/segment-resolution/helpers.ts +86 -6
- package/src/router/segment-resolution/loader-cache.ts +76 -39
- package/src/router/segment-resolution/revalidation.ts +272 -320
- 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 +56 -0
- package/src/router/telemetry-otel.ts +161 -199
- package/src/router/telemetry.ts +96 -19
- package/src/router/timeout.ts +0 -20
- package/src/router/tracing.ts +206 -0
- package/src/router/trie-matching.ts +162 -64
- package/src/router/types.ts +9 -63
- package/src/router/url-params.ts +0 -5
- package/src/router.ts +109 -53
- package/src/rsc/handler-context.ts +3 -2
- package/src/rsc/handler.ts +262 -219
- package/src/rsc/helpers.ts +100 -6
- package/src/rsc/index.ts +2 -5
- package/src/rsc/json-route-result.ts +38 -0
- package/src/rsc/loader-fetch.ts +114 -38
- package/src/rsc/manifest-init.ts +28 -41
- package/src/rsc/origin-guard.ts +39 -25
- package/src/rsc/progressive-enhancement.ts +117 -11
- package/src/rsc/redirect-guard.ts +99 -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 +85 -188
- package/src/rsc/rsc-rendering.ts +98 -76
- package/src/rsc/runtime-warnings.ts +23 -10
- package/src/rsc/server-action.ts +281 -117
- package/src/rsc/ssr-setup.ts +16 -0
- package/src/rsc/transition-gate.ts +89 -0
- package/src/rsc/types.ts +23 -5
- package/src/runtime-env.ts +18 -0
- package/src/search-params.ts +35 -30
- package/src/segment-loader-promise.ts +31 -4
- package/src/segment-system.tsx +227 -143
- package/src/serialize.ts +243 -0
- package/src/server/context.ts +163 -51
- package/src/server/cookie-parse.ts +32 -0
- package/src/server/cookie-store.ts +80 -5
- package/src/server/handle-store.ts +21 -38
- package/src/server/loader-registry.ts +33 -42
- package/src/server/request-context.ts +277 -136
- package/src/ssr/index.tsx +21 -16
- package/src/static-handler.ts +10 -13
- package/src/testing/cache-status.ts +162 -0
- package/src/testing/collect-handle.ts +40 -0
- package/src/testing/dispatch.ts +701 -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 +183 -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 +581 -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 +20 -58
- 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 +13 -4
- package/src/types/error-types.ts +30 -90
- package/src/types/global-namespace.ts +54 -41
- package/src/types/handler-context.ts +108 -28
- package/src/types/index.ts +3 -10
- package/src/types/loader-types.ts +6 -3
- package/src/types/request-scope.ts +8 -22
- package/src/types/route-config.ts +6 -50
- package/src/types/route-entry.ts +0 -6
- package/src/types/segments.ts +135 -14
- package/src/urls/include-helper.ts +9 -56
- package/src/urls/index.ts +1 -11
- package/src/urls/path-helper-types.ts +29 -12
- package/src/urls/path-helper.ts +17 -106
- package/src/urls/pattern-types.ts +36 -19
- package/src/urls/response-types.ts +20 -19
- package/src/urls/type-extraction.ts +58 -139
- package/src/urls/urls-function.ts +1 -19
- package/src/use-loader.tsx +292 -107
- package/src/vite/debug.ts +58 -13
- package/src/vite/discovery/bundle-postprocess.ts +8 -7
- package/src/vite/discovery/discover-routers.ts +97 -84
- package/src/vite/discovery/discovery-errors.ts +194 -0
- package/src/vite/discovery/gate-state.ts +171 -0
- package/src/vite/discovery/prerender-collection.ts +50 -69
- 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 +44 -0
- package/src/vite/discovery/virtual-module-codegen.ts +14 -34
- package/src/vite/index.ts +2 -0
- package/src/vite/inject-client-debug.ts +36 -0
- package/src/vite/plugin-types.ts +126 -8
- package/src/vite/plugins/cjs-to-esm.ts +14 -28
- package/src/vite/plugins/client-ref-dedup.ts +5 -21
- package/src/vite/plugins/client-ref-hashing.ts +14 -13
- package/src/vite/plugins/cloudflare-protocol-stub.ts +1 -21
- package/src/vite/plugins/expose-action-id.ts +6 -77
- package/src/vite/plugins/expose-id-utils.ts +88 -55
- package/src/vite/plugins/expose-ids/export-analysis.ts +101 -34
- package/src/vite/plugins/expose-ids/handler-transform.ts +11 -90
- package/src/vite/plugins/expose-ids/loader-transform.ts +14 -24
- package/src/vite/plugins/expose-ids/router-transform.ts +100 -28
- package/src/vite/plugins/expose-internal-ids.ts +59 -70
- package/src/vite/plugins/performance-tracks.ts +11 -18
- package/src/vite/plugins/refresh-cmd.ts +1 -1
- package/src/vite/plugins/use-cache-transform.ts +28 -52
- 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 +39 -25
- package/src/vite/rango.ts +62 -106
- package/src/vite/router-discovery.ts +591 -122
- package/src/vite/utils/ast-handler-extract.ts +26 -35
- 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 +1 -73
- package/src/vite/utils/prerender-utils.ts +54 -39
- package/src/vite/utils/shared-utils.ts +90 -41
- package/src/browser/action-response-classifier.ts +0 -99
- package/src/browser/shallow.ts +0 -40
- package/src/router/middleware-cookies.ts +0 -55
|
@@ -28,7 +28,60 @@ 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 type
|
|
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 { collectHandleData } from "../../handle.js";
|
|
36
|
+
import { Meta } from "../../handles/meta.js";
|
|
37
|
+
import type { MetaDescriptor } from "../../router/types.js";
|
|
38
|
+
import {
|
|
39
|
+
HEAD_RESOLVE_HANDLE_NAMES,
|
|
40
|
+
hasDeferredHandleValue,
|
|
41
|
+
resolveDeferredHandleValues,
|
|
42
|
+
} from "./deferred-handle-resolution.js";
|
|
43
|
+
|
|
44
|
+
/** Meta handle-name key. Meta is the only head-placed handle whose consumer
|
|
45
|
+
* use()s a deferred value above the route <Suspense>, so it must be resolved in
|
|
46
|
+
* the store before apply; every other handle keeps the promise contract. */
|
|
47
|
+
const META = "__rsc_router_meta__";
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Carry the previous page's COLLECTED Meta forward so the title is kept (no
|
|
51
|
+
* blank) while a deferred Meta resolves on a soft navigation.
|
|
52
|
+
*
|
|
53
|
+
* Why a carry-forward and not just preserving the previous Meta data: handle
|
|
54
|
+
* collection (useHandle/MetaTags) is driven by the event controller's
|
|
55
|
+
* `segmentOrder`, which becomes the NEW route's order so the synchronous
|
|
56
|
+
* breadcrumbs render immediately. The previous route's title lives under a
|
|
57
|
+
* segment that is NOT in the new order, so it would stop being collected — the
|
|
58
|
+
* title would fall back to the layout default. Re-keying the previous COLLECTED
|
|
59
|
+
* descriptors under a segment that IS in the new order keeps them visible.
|
|
60
|
+
*
|
|
61
|
+
* Title descriptors are wrapped as `{ title: { absolute } }` so re-collection
|
|
62
|
+
* under a (possibly template-bearing) new layout does not re-apply a title
|
|
63
|
+
* template to an already-final title. Promise and default (charSet/viewport)
|
|
64
|
+
* descriptors are dropped: Promise ones would suspend MetaTags, and the defaults
|
|
65
|
+
* are re-added by collectMeta.
|
|
66
|
+
*/
|
|
67
|
+
function carriedPreviousMeta(prev: MetaDescriptor[]): MetaDescriptor[] {
|
|
68
|
+
const out: MetaDescriptor[] = [];
|
|
69
|
+
for (const d of prev) {
|
|
70
|
+
if (d && typeof (d as { then?: unknown }).then === "function") continue;
|
|
71
|
+
const base = d as Exclude<MetaDescriptor, Promise<unknown>>;
|
|
72
|
+
if ("charSet" in base) continue;
|
|
73
|
+
if ("name" in base && (base as { name?: unknown }).name === "viewport") {
|
|
74
|
+
continue;
|
|
75
|
+
}
|
|
76
|
+
if ("title" in base) {
|
|
77
|
+
const t = (base as { title: unknown }).title;
|
|
78
|
+
out.push({ title: { absolute: typeof t === "string" ? t : String(t) } });
|
|
79
|
+
continue;
|
|
80
|
+
}
|
|
81
|
+
out.push(base);
|
|
82
|
+
}
|
|
83
|
+
return out;
|
|
84
|
+
}
|
|
32
85
|
|
|
33
86
|
/**
|
|
34
87
|
* Process handles from an async generator, updating the event controller
|
|
@@ -47,10 +100,35 @@ async function processHandles(
|
|
|
47
100
|
store: NavigationStore;
|
|
48
101
|
matched?: string[];
|
|
49
102
|
isPartial?: boolean;
|
|
103
|
+
/** Server's `resolvedIds`: every segment re-resolved this request,
|
|
104
|
+
* including null-component ones excluded from `diff`/`segments`.
|
|
105
|
+
* Drives cleanup of stale handle buckets when a re-resolved segment
|
|
106
|
+
* pushed nothing. */
|
|
107
|
+
resolvedIds?: string[];
|
|
50
108
|
historyKey: string;
|
|
51
109
|
},
|
|
52
110
|
): Promise<void> {
|
|
53
|
-
const {
|
|
111
|
+
const {
|
|
112
|
+
eventController,
|
|
113
|
+
store,
|
|
114
|
+
matched,
|
|
115
|
+
isPartial,
|
|
116
|
+
resolvedIds,
|
|
117
|
+
historyKey,
|
|
118
|
+
} = opts;
|
|
119
|
+
|
|
120
|
+
// This nav's instance token, captured before any await — processHandles runs
|
|
121
|
+
// right after its own commit, so this is that commit's token. generateHistoryKey
|
|
122
|
+
// is URL-only, so an A->B->A revisit reuses the key; the token lets a late
|
|
123
|
+
// resolution tell its own visit apart from a newer same-URL visit, so a stale
|
|
124
|
+
// nav can never clobber a fresher one's live state or cache (P1).
|
|
125
|
+
const myInstance = store.getNavInstance();
|
|
126
|
+
|
|
127
|
+
// True while this nav still owns the live page: same history key AND the most
|
|
128
|
+
// recent commit is still ours (no newer nav has committed since).
|
|
129
|
+
const stillLive = (): boolean =>
|
|
130
|
+
historyKey === store.getHistoryKey() &&
|
|
131
|
+
myInstance === store.getNavInstance();
|
|
54
132
|
|
|
55
133
|
let yieldCount = 0;
|
|
56
134
|
for await (const handleData of handlesGenerator) {
|
|
@@ -58,14 +136,139 @@ async function processHandles(
|
|
|
58
136
|
// This prevents handle data from cancelled navigations polluting
|
|
59
137
|
// the current route's breadcrumbs (e.g., quick popstate after clicking a link).
|
|
60
138
|
if (historyKey !== store.getHistoryKey()) {
|
|
61
|
-
|
|
139
|
+
debugLog(
|
|
62
140
|
"[NavigationProvider] Stopping handle processing - user navigated away",
|
|
63
141
|
);
|
|
64
142
|
return;
|
|
65
143
|
}
|
|
66
144
|
|
|
67
145
|
yieldCount++;
|
|
68
|
-
|
|
146
|
+
|
|
147
|
+
// Resolve ONLY Meta in the store before applying. Meta is the sole
|
|
148
|
+
// head-placed handle whose consumer use()s a deferred value above the route
|
|
149
|
+
// <Suspense>; an uncontained suspension there would revert the just-committed
|
|
150
|
+
// route and hide its loading fallback. Every other handle (Breadcrumbs,
|
|
151
|
+
// custom handles) keeps the DeferredHandleEntry contract: its deferred values
|
|
152
|
+
// reach the consumer AS A PROMISE and are narrowed via isThenable(). So sync
|
|
153
|
+
// handles AND non-Meta deferred promises apply/stream through immediately —
|
|
154
|
+
// only Meta is held back and swapped in once resolved.
|
|
155
|
+
const metaDeferred = hasDeferredHandleValue(
|
|
156
|
+
handleData,
|
|
157
|
+
HEAD_RESOLVE_HANDLE_NAMES,
|
|
158
|
+
);
|
|
159
|
+
|
|
160
|
+
// Apply now. The non-deferred-Meta case applies the whole snapshot in one
|
|
161
|
+
// call (Meta included). When Meta IS deferred, replace the deferred Meta with
|
|
162
|
+
// the previous page's COLLECTED Meta (stale-while-revalidate — never a blank
|
|
163
|
+
// title) keyed under one of the NEW route's Meta segments, so it stays
|
|
164
|
+
// collected under the new segment order while the synchronous and non-Meta
|
|
165
|
+
// deferred handles update with normal cleanup. The resolved Meta is swapped
|
|
166
|
+
// in by the partial merge below.
|
|
167
|
+
if (metaDeferred) {
|
|
168
|
+
const immediate: HandleData = { ...handleData };
|
|
169
|
+
const metaSegments = handleData[META] ?? {};
|
|
170
|
+
// Anchor: the last new Meta segment in matched order (collected after the
|
|
171
|
+
// shared layout, so its carried title wins). Falls back to any new Meta
|
|
172
|
+
// segment if matched ordering does not surface one.
|
|
173
|
+
const metaSegmentIds = Object.keys(metaSegments);
|
|
174
|
+
const ordered = (matched ?? []).filter((id) =>
|
|
175
|
+
metaSegmentIds.includes(id),
|
|
176
|
+
);
|
|
177
|
+
const anchor = ordered.at(-1) ?? metaSegmentIds.at(-1);
|
|
178
|
+
|
|
179
|
+
const prevState = eventController.getHandleState();
|
|
180
|
+
const prevCollected = collectHandleData(
|
|
181
|
+
Meta,
|
|
182
|
+
prevState.data,
|
|
183
|
+
prevState.segmentOrder,
|
|
184
|
+
) as MetaDescriptor[];
|
|
185
|
+
const carried = carriedPreviousMeta(prevCollected);
|
|
186
|
+
|
|
187
|
+
if (anchor && carried.length > 0) {
|
|
188
|
+
immediate[META] = { [anchor]: carried };
|
|
189
|
+
} else {
|
|
190
|
+
// No previous Meta to carry and/or no anchor: leave Meta unset until it
|
|
191
|
+
// resolves (the documented no-previous-Meta behavior).
|
|
192
|
+
delete immediate[META];
|
|
193
|
+
}
|
|
194
|
+
eventController.setHandleData(immediate, matched, isPartial, resolvedIds);
|
|
195
|
+
} else {
|
|
196
|
+
eventController.setHandleData(
|
|
197
|
+
handleData,
|
|
198
|
+
matched,
|
|
199
|
+
isPartial,
|
|
200
|
+
resolvedIds,
|
|
201
|
+
);
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
// Snapshot of the nav's full applied handle state (sync handles, non-Meta
|
|
205
|
+
// deferred promises, and — when Meta is deferred — the carried previous Meta).
|
|
206
|
+
// Captured AFTER applying so it reflects what is actually on screen now.
|
|
207
|
+
const baseSnapshot = cloneHandleData(eventController.getHandleState().data);
|
|
208
|
+
|
|
209
|
+
if (!metaDeferred) {
|
|
210
|
+
// Non-deferred: the applied snapshot is final. Keep the cache in sync and
|
|
211
|
+
// fresh. The token guard stops a stale same-URL nav writing a newer entry.
|
|
212
|
+
if (store.getCacheEntryInstance(historyKey) === myInstance) {
|
|
213
|
+
store.updateCacheHandleData(historyKey, baseSnapshot, false);
|
|
214
|
+
}
|
|
215
|
+
continue;
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
// Meta is deferred-pending. The applied snapshot carries the PREVIOUS page's
|
|
219
|
+
// Meta (or none), not this route's final title, so the cache entry must NOT
|
|
220
|
+
// be served as fresh on a popstate return. Mark it STALE and handlesPending
|
|
221
|
+
// (token-guarded). This is the P1 fix: the deferred Meta is a SERVER-side
|
|
222
|
+
// promise streamed via Flight, so a navigate-away ABORTS the stream and the
|
|
223
|
+
// client's deferred-Meta promise never resolves — the .then below never
|
|
224
|
+
// fires. stale makes a popstate return revalidate; handlesPending makes that
|
|
225
|
+
// revalidation a FULL re-render (no client segment IDs) so the server
|
|
226
|
+
// re-streams the handles. A diff-only revalidation would omit the unchanged
|
|
227
|
+
// segments' handles and the deferred Meta would never land — see the
|
|
228
|
+
// segmentIds branch in navigation-bridge.ts.
|
|
229
|
+
if (store.getCacheEntryInstance(historyKey) === myInstance) {
|
|
230
|
+
store.updateCacheHandleData(historyKey, baseSnapshot, true, true);
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
// Resolve Meta late, then swap it in. The swap is a PARTIAL merge with
|
|
234
|
+
// resolvedIds=undefined so the stale-clear loop (which scans all handle
|
|
235
|
+
// names under resolvedIds) cannot wipe the non-Meta buckets we already
|
|
236
|
+
// applied. When the deferred Meta DOES resolve while this nav still owns the
|
|
237
|
+
// entry (no navigate-away abort), write the resolved handle data and clear
|
|
238
|
+
// stale + handlesPending — the entry is now complete, so a popstate return
|
|
239
|
+
// serves it without revalidating.
|
|
240
|
+
//
|
|
241
|
+
// Order-safety: each stream yield is a full cumulative snapshot and a
|
|
242
|
+
// segment's handle array is atomic, so concurrent Meta resolutions of
|
|
243
|
+
// different yields write identical per-segment arrays or touch disjoint
|
|
244
|
+
// segments — neither can clobber the other.
|
|
245
|
+
void resolveDeferredHandleValues(
|
|
246
|
+
handleData,
|
|
247
|
+
HEAD_RESOLVE_HANDLE_NAMES,
|
|
248
|
+
).then((resolved) => {
|
|
249
|
+
const cacheValue = { ...baseSnapshot, [META]: resolved[META] };
|
|
250
|
+
if (stillLive()) {
|
|
251
|
+
// Still on the live page: swap Meta in and refresh the cache as fresh.
|
|
252
|
+
eventController.setHandleData(
|
|
253
|
+
{ [META]: resolved[META] },
|
|
254
|
+
matched,
|
|
255
|
+
true,
|
|
256
|
+
undefined,
|
|
257
|
+
);
|
|
258
|
+
store.updateCacheHandleData(
|
|
259
|
+
historyKey,
|
|
260
|
+
eventController.getHandleState().data,
|
|
261
|
+
false,
|
|
262
|
+
false,
|
|
263
|
+
);
|
|
264
|
+
} else if (store.getCacheEntryInstance(historyKey) === myInstance) {
|
|
265
|
+
// Navigated away, but THIS nav still owns the target cache entry: write
|
|
266
|
+
// the resolved data and clear stale + handlesPending so a popstate return
|
|
267
|
+
// is fresh.
|
|
268
|
+
store.updateCacheHandleData(historyKey, cacheValue, false, false);
|
|
269
|
+
}
|
|
270
|
+
// else: a newer nav to the same URL superseded us — do nothing.
|
|
271
|
+
});
|
|
69
272
|
}
|
|
70
273
|
|
|
71
274
|
// Check again before final updates
|
|
@@ -73,19 +276,19 @@ async function processHandles(
|
|
|
73
276
|
return;
|
|
74
277
|
}
|
|
75
278
|
|
|
76
|
-
// For partial updates where the generator yielded nothing (
|
|
77
|
-
//
|
|
78
|
-
//
|
|
79
|
-
// route might not push any breadcrumbs, but we still need to remove the old ones.
|
|
279
|
+
// For partial updates where the generator yielded nothing (every
|
|
280
|
+
// re-resolved handler pushed nothing), still call setHandleData so the
|
|
281
|
+
// cleanup pass can clear out stale buckets for those segments.
|
|
80
282
|
if (yieldCount === 0 && matched) {
|
|
81
|
-
eventController.setHandleData({}, matched, true);
|
|
283
|
+
eventController.setHandleData({}, matched, true, resolvedIds);
|
|
82
284
|
}
|
|
83
285
|
|
|
84
286
|
// After handles processing completes, update the cache's handleData.
|
|
85
287
|
// This fixes a race condition where commit() caches stale handleData before
|
|
86
288
|
// the async handles processing completes.
|
|
87
|
-
// Only update if we're still on the same page
|
|
88
|
-
|
|
289
|
+
// Only update if we're still on the same page AND this is still the live nav
|
|
290
|
+
// (the token guard stops a stale same-URL nav writing a newer nav's state).
|
|
291
|
+
if (stillLive()) {
|
|
89
292
|
const finalHandleData = eventController.getHandleState().data;
|
|
90
293
|
store.updateCacheHandleData(historyKey, finalHandleData);
|
|
91
294
|
}
|
|
@@ -146,11 +349,21 @@ export interface NavigationProviderProps {
|
|
|
146
349
|
basename?: string;
|
|
147
350
|
|
|
148
351
|
/**
|
|
149
|
-
*
|
|
150
|
-
*
|
|
151
|
-
*
|
|
352
|
+
* App-shell ref. When provided, the context's `basename` and `version` are
|
|
353
|
+
* read through it (live getters) so they don't close over a stale snapshot or
|
|
354
|
+
* invalidate the memoized context value. The shell is set once at init and is
|
|
355
|
+
* not swapped within a session — a cross-app navigation is a full document
|
|
356
|
+
* load (X-RSC-Reload), so the target app establishes its own shell on load.
|
|
152
357
|
*/
|
|
153
358
|
appShellRef?: AppShellRef;
|
|
359
|
+
|
|
360
|
+
/**
|
|
361
|
+
* CSP nonce to expose via NonceContext. Production leaves this undefined — the
|
|
362
|
+
* browser has no nonce (it is a server-side HTML concern), and SSR provides the
|
|
363
|
+
* nonce through its own NonceContext.Provider. Test harnesses (renderRoute) set
|
|
364
|
+
* it to seed a nonce so components calling useNonce() can be exercised.
|
|
365
|
+
*/
|
|
366
|
+
nonce?: string;
|
|
154
367
|
}
|
|
155
368
|
|
|
156
369
|
/**
|
|
@@ -185,6 +398,7 @@ export function NavigationProvider({
|
|
|
185
398
|
version,
|
|
186
399
|
basename,
|
|
187
400
|
appShellRef,
|
|
401
|
+
nonce,
|
|
188
402
|
}: NavigationProviderProps): ReactNode {
|
|
189
403
|
// Track current payload for rendering (this triggers re-renders)
|
|
190
404
|
const [payload, setPayload] = useState(initialPayload);
|
|
@@ -206,125 +420,43 @@ export function NavigationProvider({
|
|
|
206
420
|
await bridge.refresh();
|
|
207
421
|
}, []);
|
|
208
422
|
|
|
209
|
-
//
|
|
210
|
-
//
|
|
211
|
-
//
|
|
212
|
-
//
|
|
423
|
+
// basename/version are always read through a shell ref so the context value
|
|
424
|
+
// has a single shape. Both are set once: a supplied appShellRef is seeded
|
|
425
|
+
// from the init payload (a cross-app navigation reloads, so it is not swapped
|
|
426
|
+
// in-session), and the standalone fallback wraps the mount-time props.
|
|
427
|
+
const fallbackShellRef = useRef<AppShellRef | null>(null);
|
|
428
|
+
if (!fallbackShellRef.current) {
|
|
429
|
+
fallbackShellRef.current = createAppShellRef({ basename, version });
|
|
430
|
+
}
|
|
431
|
+
const shellRef = appShellRef ?? fallbackShellRef.current;
|
|
432
|
+
|
|
213
433
|
const contextValue = useMemo<NavigationStoreContextValue>(() => {
|
|
214
|
-
|
|
215
|
-
const value = {
|
|
216
|
-
store,
|
|
217
|
-
eventController,
|
|
218
|
-
navigate,
|
|
219
|
-
refresh,
|
|
220
|
-
} as NavigationStoreContextValue;
|
|
221
|
-
Object.defineProperty(value, "basename", {
|
|
222
|
-
configurable: true,
|
|
223
|
-
enumerable: true,
|
|
224
|
-
get: () => appShellRef.get().basename,
|
|
225
|
-
});
|
|
226
|
-
Object.defineProperty(value, "version", {
|
|
227
|
-
configurable: true,
|
|
228
|
-
enumerable: true,
|
|
229
|
-
get: () => appShellRef.get().version,
|
|
230
|
-
});
|
|
231
|
-
return value;
|
|
232
|
-
}
|
|
233
|
-
return {
|
|
434
|
+
const value = {
|
|
234
435
|
store,
|
|
235
436
|
eventController,
|
|
236
437
|
navigate,
|
|
237
438
|
refresh,
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
439
|
+
} as NavigationStoreContextValue;
|
|
440
|
+
Object.defineProperty(value, "basename", {
|
|
441
|
+
configurable: true,
|
|
442
|
+
enumerable: true,
|
|
443
|
+
get: () => shellRef.get().basename,
|
|
444
|
+
});
|
|
445
|
+
Object.defineProperty(value, "version", {
|
|
446
|
+
configurable: true,
|
|
447
|
+
enumerable: true,
|
|
448
|
+
get: () => shellRef.get().version,
|
|
449
|
+
});
|
|
450
|
+
return value;
|
|
241
451
|
}, []);
|
|
242
452
|
|
|
243
|
-
// Connection warmup: keep TLS alive after idle periods.
|
|
244
|
-
//
|
|
245
|
-
//
|
|
246
|
-
//
|
|
453
|
+
// Connection warmup: keep TLS alive after idle periods. After 60s of no
|
|
454
|
+
// interaction the connection is marked cold; the next pointer/touch
|
|
455
|
+
// interaction or visibility change warms TLS via a HEAD request before the
|
|
456
|
+
// user clicks a link. State machine lives in connection-warmup.ts.
|
|
247
457
|
useEffect(() => {
|
|
248
458
|
if (!warmupEnabled) return;
|
|
249
|
-
|
|
250
|
-
const IDLE_TIMEOUT = 60_000;
|
|
251
|
-
const DEBOUNCE_DELAY = 150;
|
|
252
|
-
|
|
253
|
-
let idleTimer: ReturnType<typeof setTimeout> | undefined;
|
|
254
|
-
let debounceTimer: ReturnType<typeof setTimeout> | undefined;
|
|
255
|
-
let isCold = false;
|
|
256
|
-
let warmupListenersAttached = false;
|
|
257
|
-
|
|
258
|
-
function sendWarmup() {
|
|
259
|
-
isCold = false;
|
|
260
|
-
fetch("/?_rsc_warmup", { method: "HEAD" }).catch(() => {});
|
|
261
|
-
}
|
|
262
|
-
|
|
263
|
-
function triggerWarmup() {
|
|
264
|
-
if (!isCold) return;
|
|
265
|
-
clearTimeout(debounceTimer);
|
|
266
|
-
debounceTimer = setTimeout(() => {
|
|
267
|
-
sendWarmup();
|
|
268
|
-
detachWarmupListeners();
|
|
269
|
-
resetIdleTimer();
|
|
270
|
-
}, DEBOUNCE_DELAY);
|
|
271
|
-
}
|
|
272
|
-
|
|
273
|
-
function onVisibilityChange() {
|
|
274
|
-
if (document.visibilityState === "visible" && isCold) {
|
|
275
|
-
triggerWarmup();
|
|
276
|
-
}
|
|
277
|
-
}
|
|
278
|
-
|
|
279
|
-
function attachWarmupListeners() {
|
|
280
|
-
if (warmupListenersAttached) return;
|
|
281
|
-
warmupListenersAttached = true;
|
|
282
|
-
document.addEventListener("visibilitychange", onVisibilityChange);
|
|
283
|
-
document.addEventListener("mousemove", triggerWarmup, { once: true });
|
|
284
|
-
document.addEventListener("touchstart", triggerWarmup, { once: true });
|
|
285
|
-
}
|
|
286
|
-
|
|
287
|
-
function detachWarmupListeners() {
|
|
288
|
-
warmupListenersAttached = false;
|
|
289
|
-
document.removeEventListener("visibilitychange", onVisibilityChange);
|
|
290
|
-
document.removeEventListener("mousemove", triggerWarmup);
|
|
291
|
-
document.removeEventListener("touchstart", triggerWarmup);
|
|
292
|
-
}
|
|
293
|
-
|
|
294
|
-
function markCold() {
|
|
295
|
-
isCold = true;
|
|
296
|
-
attachWarmupListeners();
|
|
297
|
-
}
|
|
298
|
-
|
|
299
|
-
function resetIdleTimer() {
|
|
300
|
-
clearTimeout(idleTimer);
|
|
301
|
-
isCold = false;
|
|
302
|
-
idleTimer = setTimeout(markCold, IDLE_TIMEOUT);
|
|
303
|
-
}
|
|
304
|
-
|
|
305
|
-
// Activity events that reset the idle timer
|
|
306
|
-
const activityEvents = [
|
|
307
|
-
"mousemove",
|
|
308
|
-
"keydown",
|
|
309
|
-
"touchstart",
|
|
310
|
-
"scroll",
|
|
311
|
-
] as const;
|
|
312
|
-
const activityOptions: AddEventListenerOptions = { passive: true };
|
|
313
|
-
|
|
314
|
-
for (const event of activityEvents) {
|
|
315
|
-
document.addEventListener(event, resetIdleTimer, activityOptions);
|
|
316
|
-
}
|
|
317
|
-
|
|
318
|
-
resetIdleTimer();
|
|
319
|
-
|
|
320
|
-
return () => {
|
|
321
|
-
clearTimeout(idleTimer);
|
|
322
|
-
clearTimeout(debounceTimer);
|
|
323
|
-
detachWarmupListeners();
|
|
324
|
-
for (const event of activityEvents) {
|
|
325
|
-
document.removeEventListener(event, resetIdleTimer);
|
|
326
|
-
}
|
|
327
|
-
};
|
|
459
|
+
return startConnectionWarmup();
|
|
328
460
|
}, [warmupEnabled]);
|
|
329
461
|
|
|
330
462
|
// Cancel non-matching prefetches when navigation starts.
|
|
@@ -394,24 +526,20 @@ export function NavigationProvider({
|
|
|
394
526
|
store,
|
|
395
527
|
matched: update.metadata.matched,
|
|
396
528
|
isPartial: update.metadata.isPartial,
|
|
529
|
+
resolvedIds: update.metadata.resolvedIds,
|
|
397
530
|
historyKey,
|
|
398
531
|
}).catch((err) =>
|
|
399
532
|
console.error("[NavigationProvider] Error consuming handles:", err),
|
|
400
533
|
);
|
|
401
|
-
} else if (update.metadata.cachedHandleData) {
|
|
402
|
-
// For back/forward navigation from cache, restore the cached handleData
|
|
403
|
-
// This restores breadcrumbs to the exact state they were when the page was cached
|
|
404
|
-
eventController.setHandleData(
|
|
405
|
-
update.metadata.cachedHandleData,
|
|
406
|
-
update.metadata.matched,
|
|
407
|
-
false, // full replace - restore entire cached state
|
|
408
|
-
);
|
|
409
534
|
} else if (update.metadata.matched) {
|
|
410
|
-
//
|
|
535
|
+
// cachedHandleData present -> full restore (back/forward); absent ->
|
|
536
|
+
// partial cleanup of segments no longer matched.
|
|
537
|
+
const cached = update.metadata.cachedHandleData;
|
|
411
538
|
eventController.setHandleData(
|
|
412
|
-
{},
|
|
539
|
+
cached ?? {},
|
|
413
540
|
update.metadata.matched,
|
|
414
|
-
|
|
541
|
+
cached === undefined,
|
|
542
|
+
cached === undefined ? update.metadata.resolvedIds : undefined,
|
|
415
543
|
);
|
|
416
544
|
}
|
|
417
545
|
});
|
|
@@ -424,7 +552,8 @@ export function NavigationProvider({
|
|
|
424
552
|
payload.root instanceof Promise ? use(payload.root) : payload.root;
|
|
425
553
|
|
|
426
554
|
// Wrap content in RootErrorBoundary to catch:
|
|
427
|
-
// 1. Errors from
|
|
555
|
+
// 1. Errors from RenderErrorThrower (network failures and unprocessable
|
|
556
|
+
// navigation responses, routed here by the navigation bridge)
|
|
428
557
|
// 2. Client component errors that occur before/outside the segment tree's error boundary
|
|
429
558
|
// 3. Errors during promise resolution or navigation state updates
|
|
430
559
|
// This acts as a safety net - the segment tree has its own RootErrorBoundary that
|
|
@@ -434,10 +563,10 @@ export function NavigationProvider({
|
|
|
434
563
|
let content = <RootErrorBoundary>{root}</RootErrorBoundary>;
|
|
435
564
|
|
|
436
565
|
// Wrap with ThemeProvider when theme is enabled. The ThemeProvider is
|
|
437
|
-
// document-lifetime: its config comes from the initial load and
|
|
438
|
-
//
|
|
439
|
-
//
|
|
440
|
-
//
|
|
566
|
+
// document-lifetime: its config comes from the initial load and persists for
|
|
567
|
+
// the session. It sits above the segment tree and is not remounted in-session;
|
|
568
|
+
// a cross-app navigation is a full document load (X-RSC-Reload), so the target
|
|
569
|
+
// app's theme config takes effect on its own load.
|
|
441
570
|
if (themeConfig) {
|
|
442
571
|
content = (
|
|
443
572
|
<ThemeProvider config={themeConfig} initialTheme={initialTheme}>
|
|
@@ -448,9 +577,10 @@ export function NavigationProvider({
|
|
|
448
577
|
|
|
449
578
|
// Match SSR tree shape: NonceContext.Provider is always present so
|
|
450
579
|
// hydration sees the same component tree. Value is undefined on the
|
|
451
|
-
// client — CSP nonces are a server-side HTML concern
|
|
580
|
+
// client — CSP nonces are a server-side HTML concern — unless a test
|
|
581
|
+
// harness seeded one via the `nonce` prop.
|
|
452
582
|
content = (
|
|
453
|
-
<NonceContext.Provider value={
|
|
583
|
+
<NonceContext.Provider value={nonce}>{content}</NonceContext.Provider>
|
|
454
584
|
);
|
|
455
585
|
|
|
456
586
|
return (
|
|
@@ -14,17 +14,21 @@ export interface ScrollRestorationProps {
|
|
|
14
14
|
* Return location.pathname to restore scroll based on path
|
|
15
15
|
* (useful for keeping scroll position on the same page).
|
|
16
16
|
*
|
|
17
|
+
* Provide a stable reference: a module-level function or one wrapped in
|
|
18
|
+
* useCallback. The init effect re-runs when getKey's identity changes, and
|
|
19
|
+
* teardown clears in-memory scroll positions — a fresh inline arrow on every
|
|
20
|
+
* parent render would discard unpersisted positions mid-session.
|
|
21
|
+
*
|
|
17
22
|
* @example
|
|
18
23
|
* ```tsx
|
|
24
|
+
* // Stable module-level getKey (recommended)
|
|
25
|
+
* const byPathname = (location) => location.pathname;
|
|
26
|
+
*
|
|
19
27
|
* // Restore based on pathname (same URL = same scroll)
|
|
20
|
-
* <ScrollRestoration
|
|
21
|
-
* getKey={(location) => location.pathname}
|
|
22
|
-
* />
|
|
28
|
+
* <ScrollRestoration getKey={byPathname} />
|
|
23
29
|
*
|
|
24
30
|
* // Restore based on unique history entry (default)
|
|
25
|
-
* <ScrollRestoration
|
|
26
|
-
* getKey={(location) => location.key}
|
|
27
|
-
* />
|
|
31
|
+
* // <ScrollRestoration /> — omit getKey to use location.key
|
|
28
32
|
* ```
|
|
29
33
|
*/
|
|
30
34
|
getKey?: (location: {
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import type { HandleData } from "../types.js";
|
|
2
|
+
import { isThenable } from "../../handles/is-thenable.js";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* The set of handle names whose deferred (Promise) values MUST be resolved in
|
|
6
|
+
* the store BEFORE the snapshot is applied during client navigation.
|
|
7
|
+
*
|
|
8
|
+
* The boundary: a handle belongs here only if its consumer `use()`s a promise in
|
|
9
|
+
* <head>, above the route's <Suspense>. Suspending there would revert the
|
|
10
|
+
* just-committed route and hide its loading fallback. Today that is Meta alone
|
|
11
|
+
* (MetaTags lives in <head> and use()s deferred descriptors). Every OTHER handle
|
|
12
|
+
* keeps the public DeferredHandleEntry contract: its deferred value reaches the
|
|
13
|
+
* consumer AS A PROMISE during soft navigation, narrowed via isThenable().
|
|
14
|
+
*
|
|
15
|
+
* If a future head-placed handle starts use()-ing promises, add its name here.
|
|
16
|
+
*/
|
|
17
|
+
export const HEAD_RESOLVE_HANDLE_NAMES: readonly string[] = [
|
|
18
|
+
"__rsc_router_meta__",
|
|
19
|
+
];
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* True when a handle value in this snapshot is a deferred (Promise) value.
|
|
23
|
+
*
|
|
24
|
+
* When `onlyHandleNames` is given, only those handle buckets are considered;
|
|
25
|
+
* deferred values under any other handle are ignored (they pass through to the
|
|
26
|
+
* consumer as promises, by contract).
|
|
27
|
+
*/
|
|
28
|
+
export function hasDeferredHandleValue(
|
|
29
|
+
data: HandleData,
|
|
30
|
+
onlyHandleNames?: readonly string[],
|
|
31
|
+
): boolean {
|
|
32
|
+
const scope = onlyHandleNames ? new Set(onlyHandleNames) : null;
|
|
33
|
+
for (const [handleName, segments] of Object.entries(data)) {
|
|
34
|
+
if (scope && !scope.has(handleName)) continue;
|
|
35
|
+
for (const values of Object.values(segments)) {
|
|
36
|
+
if (values.some(isThenable)) return true;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Snapshot with deferred (Promise) values awaited; a rejected deferred is
|
|
44
|
+
* dropped (it contributes nothing), mirroring the render-side REJECTED_META.
|
|
45
|
+
* Promise.allSettled treats non-promise values as already-fulfilled, so plain
|
|
46
|
+
* values pass through unchanged.
|
|
47
|
+
*
|
|
48
|
+
* When `onlyHandleNames` is given, ONLY those handle buckets are resolved; every
|
|
49
|
+
* other bucket is copied through by reference (its deferred values keep their
|
|
50
|
+
* promise identity so the consumer can narrow them).
|
|
51
|
+
*/
|
|
52
|
+
export async function resolveDeferredHandleValues(
|
|
53
|
+
data: HandleData,
|
|
54
|
+
onlyHandleNames?: readonly string[],
|
|
55
|
+
): Promise<HandleData> {
|
|
56
|
+
const scope = onlyHandleNames ? new Set(onlyHandleNames) : null;
|
|
57
|
+
const out: HandleData = {};
|
|
58
|
+
await Promise.all(
|
|
59
|
+
Object.entries(data).flatMap(([handleName, segments]) => {
|
|
60
|
+
// Out-of-scope buckets pass through untouched (promise identity kept).
|
|
61
|
+
if (scope && !scope.has(handleName)) {
|
|
62
|
+
out[handleName] = segments;
|
|
63
|
+
return [];
|
|
64
|
+
}
|
|
65
|
+
out[handleName] = {};
|
|
66
|
+
return Object.entries(segments).map(async ([segmentId, values]) => {
|
|
67
|
+
const settled = await Promise.allSettled(values);
|
|
68
|
+
out[handleName][segmentId] = settled
|
|
69
|
+
.filter((r) => r.status === "fulfilled")
|
|
70
|
+
.map((r) => (r as PromiseFulfilledResult<unknown>).value);
|
|
71
|
+
});
|
|
72
|
+
}),
|
|
73
|
+
);
|
|
74
|
+
return out;
|
|
75
|
+
}
|