@rangojs/router 0.0.0-experimental.117 → 0.0.0-experimental.119
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/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.map +1 -0
- package/dist/browser/event-controller.d.ts +191 -0
- package/dist/browser/event-controller.d.ts.map +1 -0
- package/dist/browser/event-controller.js +559 -0
- package/dist/browser/event-controller.js.map +1 -0
- package/dist/browser/index.d.ts +2 -0
- package/dist/browser/index.d.ts.map +1 -0
- package/dist/browser/index.js +14 -0
- package/dist/browser/index.js.map +1 -0
- package/dist/browser/link-interceptor.d.ts +38 -0
- package/dist/browser/link-interceptor.d.ts.map +1 -0
- package/dist/browser/link-interceptor.js +99 -0
- package/dist/browser/link-interceptor.js.map +1 -0
- package/dist/browser/logging.d.ts +10 -0
- package/dist/browser/logging.d.ts.map +1 -0
- package/dist/browser/logging.js +29 -0
- package/dist/browser/logging.js.map +1 -0
- package/dist/browser/lru-cache.d.ts +17 -0
- package/dist/browser/lru-cache.d.ts.map +1 -0
- package/dist/browser/lru-cache.js +50 -0
- package/dist/browser/lru-cache.js.map +1 -0
- package/dist/browser/merge-segment-loaders.d.ts +39 -0
- package/dist/browser/merge-segment-loaders.d.ts.map +1 -0
- package/dist/browser/merge-segment-loaders.js +102 -0
- package/dist/browser/merge-segment-loaders.js.map +1 -0
- package/dist/browser/navigation-bridge.d.ts +102 -0
- package/dist/browser/navigation-bridge.d.ts.map +1 -0
- package/dist/browser/navigation-bridge.js +708 -0
- package/dist/browser/navigation-bridge.js.map +1 -0
- package/dist/browser/navigation-client.d.ts +25 -0
- package/dist/browser/navigation-client.d.ts.map +1 -0
- package/dist/browser/navigation-client.js +157 -0
- package/dist/browser/navigation-client.js.map +1 -0
- package/dist/browser/navigation-store.d.ts +101 -0
- package/dist/browser/navigation-store.d.ts.map +1 -0
- package/dist/browser/navigation-store.js +625 -0
- package/dist/browser/navigation-store.js.map +1 -0
- package/dist/browser/partial-update.d.ts +75 -0
- package/dist/browser/partial-update.d.ts.map +1 -0
- package/dist/browser/partial-update.js +426 -0
- package/dist/browser/partial-update.js.map +1 -0
- package/dist/browser/react/Link.d.ts +86 -0
- package/dist/browser/react/Link.d.ts.map +1 -0
- package/dist/browser/react/Link.js +128 -0
- package/dist/browser/react/Link.js.map +1 -0
- package/dist/browser/react/NavigationProvider.d.ts +63 -0
- package/dist/browser/react/NavigationProvider.d.ts.map +1 -0
- package/dist/browser/react/NavigationProvider.js +216 -0
- package/dist/browser/react/NavigationProvider.js.map +1 -0
- package/dist/browser/react/ScrollRestoration.d.ts +75 -0
- package/dist/browser/react/ScrollRestoration.d.ts.map +1 -0
- package/dist/browser/react/ScrollRestoration.js +57 -0
- package/dist/browser/react/ScrollRestoration.js.map +1 -0
- package/dist/browser/react/context.d.ts +46 -0
- package/dist/browser/react/context.d.ts.map +1 -0
- package/dist/browser/react/context.js +10 -0
- package/dist/browser/react/context.js.map +1 -0
- package/dist/browser/react/index.d.ts +11 -0
- package/dist/browser/react/index.d.ts.map +1 -0
- package/dist/browser/react/index.js +22 -0
- package/dist/browser/react/index.js.map +1 -0
- package/dist/browser/react/location-state-shared.d.ts +63 -0
- package/dist/browser/react/location-state-shared.d.ts.map +1 -0
- package/dist/browser/react/location-state-shared.js +81 -0
- package/dist/browser/react/location-state-shared.js.map +1 -0
- package/dist/browser/react/location-state.d.ts +23 -0
- package/dist/browser/react/location-state.d.ts.map +1 -0
- package/dist/browser/react/location-state.js +29 -0
- package/dist/browser/react/location-state.js.map +1 -0
- package/dist/browser/react/mount-context.d.ts +24 -0
- package/dist/browser/react/mount-context.d.ts.map +1 -0
- package/dist/browser/react/mount-context.js +24 -0
- package/dist/browser/react/mount-context.js.map +1 -0
- package/dist/browser/react/use-action.d.ts +64 -0
- package/dist/browser/react/use-action.d.ts.map +1 -0
- package/dist/browser/react/use-action.js +134 -0
- package/dist/browser/react/use-action.js.map +1 -0
- package/dist/browser/react/use-client-cache.d.ts +41 -0
- package/dist/browser/react/use-client-cache.d.ts.map +1 -0
- package/dist/browser/react/use-client-cache.js +39 -0
- package/dist/browser/react/use-client-cache.js.map +1 -0
- package/dist/browser/react/use-handle.d.ts +31 -0
- package/dist/browser/react/use-handle.d.ts.map +1 -0
- package/dist/browser/react/use-handle.js +144 -0
- package/dist/browser/react/use-handle.js.map +1 -0
- package/dist/browser/react/use-href.d.ts +33 -0
- package/dist/browser/react/use-href.d.ts.map +1 -0
- package/dist/browser/react/use-href.js +39 -0
- package/dist/browser/react/use-href.js.map +1 -0
- package/dist/browser/react/use-link-status.d.ts +37 -0
- package/dist/browser/react/use-link-status.d.ts.map +1 -0
- package/dist/browser/react/use-link-status.js +99 -0
- package/dist/browser/react/use-link-status.js.map +1 -0
- package/dist/browser/react/use-mount.d.ts +25 -0
- package/dist/browser/react/use-mount.d.ts.map +1 -0
- package/dist/browser/react/use-mount.js +30 -0
- package/dist/browser/react/use-mount.js.map +1 -0
- package/dist/browser/react/use-navigation.d.ts +27 -0
- package/dist/browser/react/use-navigation.d.ts.map +1 -0
- package/dist/browser/react/use-navigation.js +87 -0
- package/dist/browser/react/use-navigation.js.map +1 -0
- package/dist/browser/react/use-segments.d.ts +38 -0
- package/dist/browser/react/use-segments.d.ts.map +1 -0
- package/dist/browser/react/use-segments.js +130 -0
- package/dist/browser/react/use-segments.js.map +1 -0
- package/dist/browser/request-controller.d.ts +26 -0
- package/dist/browser/request-controller.d.ts.map +1 -0
- package/dist/browser/request-controller.js +147 -0
- package/dist/browser/request-controller.js.map +1 -0
- package/dist/browser/rsc-router.d.ts +129 -0
- package/dist/browser/rsc-router.d.ts.map +1 -0
- package/dist/browser/rsc-router.js +195 -0
- package/dist/browser/rsc-router.js.map +1 -0
- package/dist/browser/scroll-restoration.d.ts +93 -0
- package/dist/browser/scroll-restoration.d.ts.map +1 -0
- package/dist/browser/scroll-restoration.js +321 -0
- package/dist/browser/scroll-restoration.js.map +1 -0
- package/dist/browser/segment-structure-assert.d.ts +17 -0
- package/dist/browser/segment-structure-assert.d.ts.map +1 -0
- package/dist/browser/segment-structure-assert.js +59 -0
- package/dist/browser/segment-structure-assert.js.map +1 -0
- package/dist/browser/server-action-bridge.d.ts +26 -0
- package/dist/browser/server-action-bridge.d.ts.map +1 -0
- package/dist/browser/server-action-bridge.js +668 -0
- package/dist/browser/server-action-bridge.js.map +1 -0
- package/dist/browser/shallow.d.ts +12 -0
- package/dist/browser/shallow.d.ts.map +1 -0
- package/dist/browser/shallow.js +34 -0
- package/dist/browser/shallow.js.map +1 -0
- package/dist/browser/types.d.ts +369 -0
- package/dist/browser/types.d.ts.map +1 -0
- package/dist/browser/types.js +2 -0
- package/dist/browser/types.js.map +1 -0
- package/dist/build/__tests__/generate-cli.test.d.ts +2 -0
- package/dist/build/__tests__/generate-cli.test.d.ts.map +1 -0
- package/dist/build/__tests__/generate-cli.test.js +237 -0
- package/dist/build/__tests__/generate-cli.test.js.map +1 -0
- package/dist/build/__tests__/generate-manifest.test.d.ts +2 -0
- package/dist/build/__tests__/generate-manifest.test.d.ts.map +1 -0
- package/dist/build/__tests__/generate-manifest.test.js +119 -0
- package/dist/build/__tests__/generate-manifest.test.js.map +1 -0
- package/dist/build/__tests__/generate-route-types.test.d.ts +2 -0
- package/dist/build/__tests__/generate-route-types.test.d.ts.map +1 -0
- package/dist/build/__tests__/generate-route-types.test.js +620 -0
- package/dist/build/__tests__/generate-route-types.test.js.map +1 -0
- package/dist/build/__tests__/per-router-manifest.test.d.ts +2 -0
- package/dist/build/__tests__/per-router-manifest.test.d.ts.map +1 -0
- package/dist/build/__tests__/per-router-manifest.test.js +308 -0
- package/dist/build/__tests__/per-router-manifest.test.js.map +1 -0
- package/dist/build/generate-manifest.d.ts +81 -0
- package/dist/build/generate-manifest.d.ts.map +1 -0
- package/dist/build/generate-manifest.js +276 -0
- package/dist/build/generate-manifest.js.map +1 -0
- package/dist/build/generate-route-types.d.ts +115 -0
- package/dist/build/generate-route-types.d.ts.map +1 -0
- package/dist/build/generate-route-types.js +740 -0
- package/dist/build/generate-route-types.js.map +1 -0
- package/dist/build/index.d.ts +21 -0
- package/dist/build/index.d.ts.map +1 -0
- package/dist/build/index.js +21 -0
- package/dist/build/index.js.map +1 -0
- package/dist/build/route-trie.d.ts +71 -0
- package/dist/build/route-trie.d.ts.map +1 -0
- package/dist/build/route-trie.js +175 -0
- package/dist/build/route-trie.js.map +1 -0
- package/dist/cache/__tests__/cache-scope.test.d.ts +2 -0
- package/dist/cache/__tests__/cache-scope.test.d.ts.map +1 -0
- package/dist/cache/__tests__/cache-scope.test.js +208 -0
- package/dist/cache/__tests__/cache-scope.test.js.map +1 -0
- package/dist/cache/__tests__/document-cache.test.d.ts +2 -0
- package/dist/cache/__tests__/document-cache.test.d.ts.map +1 -0
- package/dist/cache/__tests__/document-cache.test.js +345 -0
- package/dist/cache/__tests__/document-cache.test.js.map +1 -0
- package/dist/cache/__tests__/memory-segment-store.test.d.ts +2 -0
- package/dist/cache/__tests__/memory-segment-store.test.d.ts.map +1 -0
- package/dist/cache/__tests__/memory-segment-store.test.js +425 -0
- package/dist/cache/__tests__/memory-segment-store.test.js.map +1 -0
- package/dist/cache/__tests__/memory-store.test.d.ts +2 -0
- package/dist/cache/__tests__/memory-store.test.d.ts.map +1 -0
- package/dist/cache/__tests__/memory-store.test.js +367 -0
- package/dist/cache/__tests__/memory-store.test.js.map +1 -0
- package/dist/cache/cache-scope.d.ts +102 -0
- package/dist/cache/cache-scope.d.ts.map +1 -0
- package/dist/cache/cache-scope.js +440 -0
- package/dist/cache/cache-scope.js.map +1 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts +2 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts.map +1 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.js +330 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.js.map +1 -0
- package/dist/cache/cf/cf-cache-store.d.ts +165 -0
- package/dist/cache/cf/cf-cache-store.d.ts.map +1 -0
- package/dist/cache/cf/cf-cache-store.js +242 -0
- package/dist/cache/cf/cf-cache-store.js.map +1 -0
- package/dist/cache/cf/index.d.ts +14 -0
- package/dist/cache/cf/index.d.ts.map +1 -0
- package/dist/cache/cf/index.js +17 -0
- package/dist/cache/cf/index.js.map +1 -0
- package/dist/cache/document-cache.d.ts +64 -0
- package/dist/cache/document-cache.d.ts.map +1 -0
- package/dist/cache/document-cache.js +228 -0
- package/dist/cache/document-cache.js.map +1 -0
- package/dist/cache/index.d.ts +19 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +21 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/cache/memory-segment-store.d.ts +110 -0
- package/dist/cache/memory-segment-store.d.ts.map +1 -0
- package/dist/cache/memory-segment-store.js +117 -0
- package/dist/cache/memory-segment-store.js.map +1 -0
- package/dist/cache/memory-store.d.ts +41 -0
- package/dist/cache/memory-store.d.ts.map +1 -0
- package/dist/cache/memory-store.js +191 -0
- package/dist/cache/memory-store.js.map +1 -0
- package/dist/cache/types.d.ts +317 -0
- package/dist/cache/types.d.ts.map +1 -0
- package/dist/cache/types.js +12 -0
- package/dist/cache/types.js.map +1 -0
- package/dist/client.d.ts +248 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +367 -0
- package/dist/client.js.map +1 -0
- package/dist/client.rsc.d.ts +26 -0
- package/dist/client.rsc.d.ts.map +1 -0
- package/dist/client.rsc.js +46 -0
- package/dist/client.rsc.js.map +1 -0
- package/dist/component-utils.d.ts +36 -0
- package/dist/component-utils.d.ts.map +1 -0
- package/dist/component-utils.js +61 -0
- package/dist/component-utils.js.map +1 -0
- package/dist/components/DefaultDocument.d.ts +13 -0
- package/dist/components/DefaultDocument.d.ts.map +1 -0
- package/dist/components/DefaultDocument.js +15 -0
- package/dist/components/DefaultDocument.js.map +1 -0
- package/dist/debug.d.ts +58 -0
- package/dist/debug.d.ts.map +1 -0
- package/dist/debug.js +157 -0
- package/dist/debug.js.map +1 -0
- package/dist/default-error-boundary.d.ts +11 -0
- package/dist/default-error-boundary.d.ts.map +1 -0
- package/dist/default-error-boundary.js +45 -0
- package/dist/default-error-boundary.js.map +1 -0
- package/dist/deps/browser.d.ts +2 -0
- package/dist/deps/browser.d.ts.map +1 -0
- package/dist/deps/browser.js +3 -0
- package/dist/deps/browser.js.map +1 -0
- package/dist/deps/html-stream-client.d.ts +2 -0
- package/dist/deps/html-stream-client.d.ts.map +1 -0
- package/dist/deps/html-stream-client.js +3 -0
- package/dist/deps/html-stream-client.js.map +1 -0
- package/dist/deps/html-stream-server.d.ts +2 -0
- package/dist/deps/html-stream-server.d.ts.map +1 -0
- package/dist/deps/html-stream-server.js +3 -0
- package/dist/deps/html-stream-server.js.map +1 -0
- package/dist/deps/rsc.d.ts +2 -0
- package/dist/deps/rsc.d.ts.map +1 -0
- package/dist/deps/rsc.js +4 -0
- package/dist/deps/rsc.js.map +1 -0
- package/dist/deps/ssr.d.ts +2 -0
- package/dist/deps/ssr.d.ts.map +1 -0
- package/dist/deps/ssr.js +3 -0
- package/dist/deps/ssr.js.map +1 -0
- package/dist/errors.d.ts +174 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +241 -0
- package/dist/errors.js.map +1 -0
- package/dist/handle.d.ts +78 -0
- package/dist/handle.d.ts.map +1 -0
- package/dist/handle.js +82 -0
- package/dist/handle.js.map +1 -0
- package/dist/handles/MetaTags.d.ts +14 -0
- package/dist/handles/MetaTags.d.ts.map +1 -0
- package/dist/handles/MetaTags.js +136 -0
- package/dist/handles/MetaTags.js.map +1 -0
- package/dist/handles/index.d.ts +6 -0
- package/dist/handles/index.d.ts.map +1 -0
- package/dist/handles/index.js +6 -0
- package/dist/handles/index.js.map +1 -0
- package/dist/handles/meta.d.ts +39 -0
- package/dist/handles/meta.d.ts.map +1 -0
- package/dist/handles/meta.js +202 -0
- package/dist/handles/meta.js.map +1 -0
- package/dist/host/__tests__/errors.test.d.ts +2 -0
- package/dist/host/__tests__/errors.test.d.ts.map +1 -0
- package/dist/host/__tests__/errors.test.js +76 -0
- package/dist/host/__tests__/errors.test.js.map +1 -0
- package/dist/host/__tests__/pattern-comprehensive.test.d.ts +2 -0
- package/dist/host/__tests__/pattern-comprehensive.test.d.ts.map +1 -0
- package/dist/host/__tests__/pattern-comprehensive.test.js +732 -0
- package/dist/host/__tests__/pattern-comprehensive.test.js.map +1 -0
- package/dist/host/__tests__/pattern-matcher.test.d.ts +2 -0
- package/dist/host/__tests__/pattern-matcher.test.d.ts.map +1 -0
- package/dist/host/__tests__/pattern-matcher.test.js +251 -0
- package/dist/host/__tests__/pattern-matcher.test.js.map +1 -0
- package/dist/host/__tests__/router.test.d.ts +2 -0
- package/dist/host/__tests__/router.test.d.ts.map +1 -0
- package/dist/host/__tests__/router.test.js +241 -0
- package/dist/host/__tests__/router.test.js.map +1 -0
- package/dist/host/__tests__/testing.test.d.ts +2 -0
- package/dist/host/__tests__/testing.test.d.ts.map +1 -0
- package/dist/host/__tests__/testing.test.js +64 -0
- package/dist/host/__tests__/testing.test.js.map +1 -0
- package/dist/host/__tests__/utils.test.d.ts +2 -0
- package/dist/host/__tests__/utils.test.d.ts.map +1 -0
- package/dist/host/__tests__/utils.test.js +29 -0
- package/dist/host/__tests__/utils.test.js.map +1 -0
- package/dist/host/cookie-handler.d.ts +34 -0
- package/dist/host/cookie-handler.d.ts.map +1 -0
- package/dist/host/cookie-handler.js +124 -0
- package/dist/host/cookie-handler.js.map +1 -0
- package/dist/host/errors.d.ts +56 -0
- package/dist/host/errors.d.ts.map +1 -0
- package/dist/host/errors.js +79 -0
- package/dist/host/errors.js.map +1 -0
- package/dist/host/index.d.ts +29 -0
- package/dist/host/index.d.ts.map +1 -0
- package/dist/host/index.js +32 -0
- package/dist/host/index.js.map +1 -0
- package/dist/host/pattern-matcher.d.ts +36 -0
- package/dist/host/pattern-matcher.d.ts.map +1 -0
- package/dist/host/pattern-matcher.js +172 -0
- package/dist/host/pattern-matcher.js.map +1 -0
- package/dist/host/router.d.ts +26 -0
- package/dist/host/router.d.ts.map +1 -0
- package/dist/host/router.js +218 -0
- package/dist/host/router.js.map +1 -0
- package/dist/host/testing.d.ts +36 -0
- package/dist/host/testing.d.ts.map +1 -0
- package/dist/host/testing.js +55 -0
- package/dist/host/testing.js.map +1 -0
- package/dist/host/types.d.ts +115 -0
- package/dist/host/types.d.ts.map +1 -0
- package/dist/host/types.js +7 -0
- package/dist/host/types.js.map +1 -0
- package/dist/host/utils.d.ts +21 -0
- package/dist/host/utils.d.ts.map +1 -0
- package/dist/host/utils.js +23 -0
- package/dist/host/utils.js.map +1 -0
- package/dist/href-client.d.ts +131 -0
- package/dist/href-client.d.ts.map +1 -0
- package/dist/href-client.js +64 -0
- package/dist/href-client.js.map +1 -0
- package/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/dist/network-error-thrower.d.ts +17 -0
- package/dist/network-error-thrower.d.ts.map +1 -0
- package/dist/network-error-thrower.js +14 -0
- package/dist/network-error-thrower.js.map +1 -0
- package/dist/outlet-context.d.ts +13 -0
- package/dist/outlet-context.d.ts.map +1 -0
- package/dist/outlet-context.js +3 -0
- package/dist/outlet-context.js.map +1 -0
- package/dist/prerender/__tests__/param-hash.test.d.ts +2 -0
- package/dist/prerender/__tests__/param-hash.test.d.ts.map +1 -0
- package/dist/prerender/__tests__/param-hash.test.js +148 -0
- package/dist/prerender/__tests__/param-hash.test.js.map +1 -0
- package/dist/prerender/param-hash.d.ts +16 -0
- package/dist/prerender/param-hash.d.ts.map +1 -0
- package/dist/prerender/param-hash.js +36 -0
- package/dist/prerender/param-hash.js.map +1 -0
- package/dist/prerender/store.d.ts +38 -0
- package/dist/prerender/store.d.ts.map +1 -0
- package/dist/prerender/store.js +61 -0
- package/dist/prerender/store.js.map +1 -0
- package/dist/prerender.d.ts +66 -0
- package/dist/prerender.d.ts.map +1 -0
- package/dist/prerender.js +57 -0
- package/dist/prerender.js.map +1 -0
- package/dist/reverse.d.ts +196 -0
- package/dist/reverse.d.ts.map +1 -0
- package/dist/reverse.js +78 -0
- package/dist/reverse.js.map +1 -0
- package/dist/root-error-boundary.d.ts +33 -0
- package/dist/root-error-boundary.d.ts.map +1 -0
- package/dist/root-error-boundary.js +165 -0
- package/dist/root-error-boundary.js.map +1 -0
- package/dist/route-content-wrapper.d.ts +46 -0
- package/dist/route-content-wrapper.d.ts.map +1 -0
- package/dist/route-content-wrapper.js +77 -0
- package/dist/route-content-wrapper.js.map +1 -0
- package/dist/route-definition.d.ts +421 -0
- package/dist/route-definition.d.ts.map +1 -0
- package/dist/route-definition.js +868 -0
- package/dist/route-definition.js.map +1 -0
- package/dist/route-map-builder.d.ts +155 -0
- package/dist/route-map-builder.d.ts.map +1 -0
- package/dist/route-map-builder.js +237 -0
- package/dist/route-map-builder.js.map +1 -0
- package/dist/route-types.d.ts +165 -0
- package/dist/route-types.d.ts.map +1 -0
- package/dist/route-types.js +7 -0
- package/dist/route-types.js.map +1 -0
- package/dist/router/__tests__/handler-context.test.d.ts +2 -0
- package/dist/router/__tests__/handler-context.test.d.ts.map +1 -0
- package/dist/router/__tests__/handler-context.test.js +65 -0
- package/dist/router/__tests__/handler-context.test.js.map +1 -0
- package/dist/router/__tests__/loader-cycle-detection.test.d.ts +2 -0
- package/dist/router/__tests__/loader-cycle-detection.test.d.ts.map +1 -0
- package/dist/router/__tests__/loader-cycle-detection.test.js +221 -0
- package/dist/router/__tests__/loader-cycle-detection.test.js.map +1 -0
- package/dist/router/__tests__/match-context.test.d.ts +2 -0
- package/dist/router/__tests__/match-context.test.d.ts.map +1 -0
- package/dist/router/__tests__/match-context.test.js +92 -0
- package/dist/router/__tests__/match-context.test.js.map +1 -0
- package/dist/router/__tests__/match-pipelines.test.d.ts +2 -0
- package/dist/router/__tests__/match-pipelines.test.d.ts.map +1 -0
- package/dist/router/__tests__/match-pipelines.test.js +417 -0
- package/dist/router/__tests__/match-pipelines.test.js.map +1 -0
- package/dist/router/__tests__/match-result.test.d.ts +2 -0
- package/dist/router/__tests__/match-result.test.d.ts.map +1 -0
- package/dist/router/__tests__/match-result.test.js +457 -0
- package/dist/router/__tests__/match-result.test.js.map +1 -0
- package/dist/router/__tests__/on-error.test.d.ts +2 -0
- package/dist/router/__tests__/on-error.test.d.ts.map +1 -0
- package/dist/router/__tests__/on-error.test.js +678 -0
- package/dist/router/__tests__/on-error.test.js.map +1 -0
- package/dist/router/__tests__/pattern-matching.test.d.ts +2 -0
- package/dist/router/__tests__/pattern-matching.test.d.ts.map +1 -0
- package/dist/router/__tests__/pattern-matching.test.js +629 -0
- package/dist/router/__tests__/pattern-matching.test.js.map +1 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts +2 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts.map +1 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.js +155 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.js.map +1 -0
- package/dist/router/error-handling.d.ts +77 -0
- package/dist/router/error-handling.d.ts.map +1 -0
- package/dist/router/error-handling.js +202 -0
- package/dist/router/error-handling.js.map +1 -0
- package/dist/router/handler-context.d.ts +20 -0
- package/dist/router/handler-context.d.ts.map +1 -0
- package/dist/router/handler-context.js +198 -0
- package/dist/router/handler-context.js.map +1 -0
- package/dist/router/intercept-resolution.d.ts +66 -0
- package/dist/router/intercept-resolution.d.ts.map +1 -0
- package/dist/router/intercept-resolution.js +246 -0
- package/dist/router/intercept-resolution.js.map +1 -0
- package/dist/router/loader-resolution.d.ts +64 -0
- package/dist/router/loader-resolution.d.ts.map +1 -0
- package/dist/router/loader-resolution.js +284 -0
- package/dist/router/loader-resolution.js.map +1 -0
- package/dist/router/logging.d.ts +15 -0
- package/dist/router/logging.d.ts.map +1 -0
- package/dist/router/logging.js +99 -0
- package/dist/router/logging.js.map +1 -0
- package/dist/router/manifest.d.ts +22 -0
- package/dist/router/manifest.d.ts.map +1 -0
- package/dist/router/manifest.js +181 -0
- package/dist/router/manifest.js.map +1 -0
- package/dist/router/match-api.d.ts +35 -0
- package/dist/router/match-api.d.ts.map +1 -0
- package/dist/router/match-api.js +406 -0
- package/dist/router/match-api.js.map +1 -0
- package/dist/router/match-context.d.ts +206 -0
- package/dist/router/match-context.d.ts.map +1 -0
- package/dist/router/match-context.js +17 -0
- package/dist/router/match-context.js.map +1 -0
- package/dist/router/match-middleware/background-revalidation.d.ts +127 -0
- package/dist/router/match-middleware/background-revalidation.d.ts.map +1 -0
- package/dist/router/match-middleware/background-revalidation.js +75 -0
- package/dist/router/match-middleware/background-revalidation.js.map +1 -0
- package/dist/router/match-middleware/cache-lookup.d.ts +112 -0
- package/dist/router/match-middleware/cache-lookup.d.ts.map +1 -0
- package/dist/router/match-middleware/cache-lookup.js +257 -0
- package/dist/router/match-middleware/cache-lookup.js.map +1 -0
- package/dist/router/match-middleware/cache-store.d.ts +113 -0
- package/dist/router/match-middleware/cache-store.d.ts.map +1 -0
- package/dist/router/match-middleware/cache-store.js +108 -0
- package/dist/router/match-middleware/cache-store.js.map +1 -0
- package/dist/router/match-middleware/index.d.ts +81 -0
- package/dist/router/match-middleware/index.d.ts.map +1 -0
- package/dist/router/match-middleware/index.js +80 -0
- package/dist/router/match-middleware/index.js.map +1 -0
- package/dist/router/match-middleware/intercept-resolution.d.ts +117 -0
- package/dist/router/match-middleware/intercept-resolution.d.ts.map +1 -0
- package/dist/router/match-middleware/intercept-resolution.js +134 -0
- package/dist/router/match-middleware/intercept-resolution.js.map +1 -0
- package/dist/router/match-middleware/segment-resolution.d.ts +99 -0
- package/dist/router/match-middleware/segment-resolution.d.ts.map +1 -0
- package/dist/router/match-middleware/segment-resolution.js +53 -0
- package/dist/router/match-middleware/segment-resolution.js.map +1 -0
- package/dist/router/match-pipelines.d.ts +147 -0
- package/dist/router/match-pipelines.d.ts.map +1 -0
- package/dist/router/match-pipelines.js +82 -0
- package/dist/router/match-pipelines.js.map +1 -0
- package/dist/router/match-result.d.ts +126 -0
- package/dist/router/match-result.d.ts.map +1 -0
- package/dist/router/match-result.js +93 -0
- package/dist/router/match-result.js.map +1 -0
- package/dist/router/metrics.d.ts +20 -0
- package/dist/router/metrics.d.ts.map +1 -0
- package/dist/router/metrics.js +47 -0
- package/dist/router/metrics.js.map +1 -0
- package/dist/router/middleware.d.ts +249 -0
- package/dist/router/middleware.d.ts.map +1 -0
- package/dist/router/middleware.js +434 -0
- package/dist/router/middleware.js.map +1 -0
- package/dist/router/middleware.test.d.ts +2 -0
- package/dist/router/middleware.test.d.ts.map +1 -0
- package/dist/router/middleware.test.js +816 -0
- package/dist/router/middleware.test.js.map +1 -0
- package/dist/router/pattern-matching.d.ts +149 -0
- package/dist/router/pattern-matching.d.ts.map +1 -0
- package/dist/router/pattern-matching.js +349 -0
- package/dist/router/pattern-matching.js.map +1 -0
- package/dist/router/revalidation.d.ts +44 -0
- package/dist/router/revalidation.d.ts.map +1 -0
- package/dist/router/revalidation.js +147 -0
- package/dist/router/revalidation.js.map +1 -0
- package/dist/router/router-context.d.ts +135 -0
- package/dist/router/router-context.d.ts.map +1 -0
- package/dist/router/router-context.js +36 -0
- package/dist/router/router-context.js.map +1 -0
- package/dist/router/segment-resolution.d.ts +127 -0
- package/dist/router/segment-resolution.d.ts.map +1 -0
- package/dist/router/segment-resolution.js +919 -0
- package/dist/router/segment-resolution.js.map +1 -0
- package/dist/router/trie-matching.d.ts +40 -0
- package/dist/router/trie-matching.d.ts.map +1 -0
- package/dist/router/trie-matching.js +127 -0
- package/dist/router/trie-matching.js.map +1 -0
- package/dist/router/types.d.ts +136 -0
- package/dist/router/types.d.ts.map +1 -0
- package/dist/router/types.js +7 -0
- package/dist/router/types.js.map +1 -0
- package/dist/router.d.ts +753 -0
- package/dist/router.d.ts.map +1 -0
- package/dist/router.gen.d.ts +6 -0
- package/dist/router.gen.d.ts.map +1 -0
- package/dist/router.gen.js +6 -0
- package/dist/router.gen.js.map +1 -0
- package/dist/router.js +1304 -0
- package/dist/router.js.map +1 -0
- package/dist/rsc/__tests__/helpers.test.d.ts +2 -0
- package/dist/rsc/__tests__/helpers.test.d.ts.map +1 -0
- package/dist/rsc/__tests__/helpers.test.js +140 -0
- package/dist/rsc/__tests__/helpers.test.js.map +1 -0
- package/dist/rsc/handler.d.ts +45 -0
- package/dist/rsc/handler.d.ts.map +1 -0
- package/dist/rsc/handler.js +1172 -0
- package/dist/rsc/handler.js.map +1 -0
- package/dist/rsc/helpers.d.ts +16 -0
- package/dist/rsc/helpers.d.ts.map +1 -0
- package/dist/rsc/helpers.js +55 -0
- package/dist/rsc/helpers.js.map +1 -0
- package/dist/rsc/index.d.ts +22 -0
- package/dist/rsc/index.d.ts.map +1 -0
- package/dist/rsc/index.js +23 -0
- package/dist/rsc/index.js.map +1 -0
- package/dist/rsc/nonce.d.ts +9 -0
- package/dist/rsc/nonce.d.ts.map +1 -0
- package/dist/rsc/nonce.js +18 -0
- package/dist/rsc/nonce.js.map +1 -0
- package/dist/rsc/types.d.ts +206 -0
- package/dist/rsc/types.d.ts.map +1 -0
- package/dist/rsc/types.js +8 -0
- package/dist/rsc/types.js.map +1 -0
- package/dist/search-params.d.ts +103 -0
- package/dist/search-params.d.ts.map +1 -0
- package/dist/search-params.js +74 -0
- package/dist/search-params.js.map +1 -0
- package/dist/segment-system.d.ts +75 -0
- package/dist/segment-system.d.ts.map +1 -0
- package/dist/segment-system.js +336 -0
- package/dist/segment-system.js.map +1 -0
- package/dist/server/context.d.ts +245 -0
- package/dist/server/context.d.ts.map +1 -0
- package/dist/server/context.js +197 -0
- package/dist/server/context.js.map +1 -0
- package/dist/server/fetchable-loader-store.d.ts +18 -0
- package/dist/server/fetchable-loader-store.d.ts.map +1 -0
- package/dist/server/fetchable-loader-store.js +18 -0
- package/dist/server/fetchable-loader-store.js.map +1 -0
- package/dist/server/handle-store.d.ts +85 -0
- package/dist/server/handle-store.d.ts.map +1 -0
- package/dist/server/handle-store.js +142 -0
- package/dist/server/handle-store.js.map +1 -0
- package/dist/server/loader-registry.d.ts +55 -0
- package/dist/server/loader-registry.d.ts.map +1 -0
- package/dist/server/loader-registry.js +132 -0
- package/dist/server/loader-registry.js.map +1 -0
- package/dist/server/request-context.d.ts +226 -0
- package/dist/server/request-context.d.ts.map +1 -0
- package/dist/server/request-context.js +290 -0
- package/dist/server/request-context.js.map +1 -0
- package/dist/server/root-layout.d.ts +4 -0
- package/dist/server/root-layout.d.ts.map +1 -0
- package/dist/server/root-layout.js +5 -0
- package/dist/server/root-layout.js.map +1 -0
- package/dist/server.d.ts +15 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +20 -0
- package/dist/server.js.map +1 -0
- package/dist/ssr/__tests__/ssr-handler.test.d.ts +2 -0
- package/dist/ssr/__tests__/ssr-handler.test.d.ts.map +1 -0
- package/dist/ssr/__tests__/ssr-handler.test.js +132 -0
- package/dist/ssr/__tests__/ssr-handler.test.js.map +1 -0
- package/dist/ssr/index.d.ts +98 -0
- package/dist/ssr/index.d.ts.map +1 -0
- package/dist/ssr/index.js +158 -0
- package/dist/ssr/index.js.map +1 -0
- package/dist/static-handler.d.ts +50 -0
- package/dist/static-handler.d.ts.map +1 -0
- package/dist/static-handler.gen.d.ts +5 -0
- package/dist/static-handler.gen.d.ts.map +1 -0
- package/dist/static-handler.gen.js +5 -0
- package/dist/static-handler.gen.js.map +1 -0
- package/dist/static-handler.js +29 -0
- package/dist/static-handler.js.map +1 -0
- package/dist/testing/vitest.js +82 -0
- package/dist/theme/ThemeProvider.d.ts +20 -0
- package/dist/theme/ThemeProvider.d.ts.map +1 -0
- package/dist/theme/ThemeProvider.js +240 -0
- package/dist/theme/ThemeProvider.js.map +1 -0
- package/dist/theme/ThemeScript.d.ts +48 -0
- package/dist/theme/ThemeScript.d.ts.map +1 -0
- package/dist/theme/ThemeScript.js +13 -0
- package/dist/theme/ThemeScript.js.map +1 -0
- package/dist/theme/__tests__/theme.test.d.ts +2 -0
- package/dist/theme/__tests__/theme.test.d.ts.map +1 -0
- package/dist/theme/__tests__/theme.test.js +103 -0
- package/dist/theme/__tests__/theme.test.js.map +1 -0
- package/dist/theme/constants.d.ts +29 -0
- package/dist/theme/constants.d.ts.map +1 -0
- package/dist/theme/constants.js +48 -0
- package/dist/theme/constants.js.map +1 -0
- package/dist/theme/index.d.ts +31 -0
- package/dist/theme/index.d.ts.map +1 -0
- package/dist/theme/index.js +36 -0
- package/dist/theme/index.js.map +1 -0
- package/dist/theme/theme-context.d.ts +40 -0
- package/dist/theme/theme-context.d.ts.map +1 -0
- package/dist/theme/theme-context.js +60 -0
- package/dist/theme/theme-context.js.map +1 -0
- package/dist/theme/theme-script.d.ts +27 -0
- package/dist/theme/theme-script.d.ts.map +1 -0
- package/dist/theme/theme-script.js +147 -0
- package/dist/theme/theme-script.js.map +1 -0
- package/dist/theme/types.d.ts +163 -0
- package/dist/theme/types.d.ts.map +1 -0
- package/dist/theme/types.js +11 -0
- package/dist/theme/types.js.map +1 -0
- package/dist/theme/use-theme.d.ts +12 -0
- package/dist/theme/use-theme.d.ts.map +1 -0
- package/dist/theme/use-theme.js +40 -0
- package/dist/theme/use-theme.js.map +1 -0
- package/dist/types.d.ts +1479 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +10 -0
- package/dist/types.js.map +1 -0
- package/dist/urls.d.ts +441 -0
- package/dist/urls.d.ts.map +1 -0
- package/dist/urls.gen.d.ts +8 -0
- package/dist/urls.gen.d.ts.map +1 -0
- package/dist/urls.gen.js +8 -0
- package/dist/urls.gen.js.map +1 -0
- package/dist/urls.js +443 -0
- package/dist/urls.js.map +1 -0
- package/dist/use-loader.d.ts +127 -0
- package/dist/use-loader.d.ts.map +1 -0
- package/dist/use-loader.js +237 -0
- package/dist/use-loader.js.map +1 -0
- package/dist/vite/__tests__/ast-handler-extract.test.d.ts +2 -0
- package/dist/vite/__tests__/ast-handler-extract.test.d.ts.map +1 -0
- package/dist/vite/__tests__/ast-handler-extract.test.js +294 -0
- package/dist/vite/__tests__/ast-handler-extract.test.js.map +1 -0
- package/dist/vite/__tests__/expose-id-utils.test.d.ts +2 -0
- package/dist/vite/__tests__/expose-id-utils.test.d.ts.map +1 -0
- package/dist/vite/__tests__/expose-id-utils.test.js +224 -0
- package/dist/vite/__tests__/expose-id-utils.test.js.map +1 -0
- package/dist/vite/__tests__/expose-internal-ids.test.d.ts +2 -0
- package/dist/vite/__tests__/expose-internal-ids.test.d.ts.map +1 -0
- package/dist/vite/__tests__/expose-internal-ids.test.js +647 -0
- package/dist/vite/__tests__/expose-internal-ids.test.js.map +1 -0
- package/dist/vite/__tests__/expose-router-id.test.d.ts +2 -0
- package/dist/vite/__tests__/expose-router-id.test.d.ts.map +1 -0
- package/dist/vite/__tests__/expose-router-id.test.js +39 -0
- package/dist/vite/__tests__/expose-router-id.test.js.map +1 -0
- package/dist/vite/ast-handler-extract.d.ts +49 -0
- package/dist/vite/ast-handler-extract.d.ts.map +1 -0
- package/dist/vite/ast-handler-extract.js +249 -0
- package/dist/vite/ast-handler-extract.js.map +1 -0
- package/dist/vite/expose-action-id.d.ts +19 -0
- package/dist/vite/expose-action-id.d.ts.map +1 -0
- package/dist/vite/expose-action-id.js +250 -0
- package/dist/vite/expose-action-id.js.map +1 -0
- package/dist/vite/expose-id-utils.d.ts +69 -0
- package/dist/vite/expose-id-utils.d.ts.map +1 -0
- package/dist/vite/expose-id-utils.js +289 -0
- package/dist/vite/expose-id-utils.js.map +1 -0
- package/dist/vite/expose-internal-ids.d.ts +22 -0
- package/dist/vite/expose-internal-ids.d.ts.map +1 -0
- package/dist/vite/expose-internal-ids.js +886 -0
- package/dist/vite/expose-internal-ids.js.map +1 -0
- package/dist/vite/index.d.ts +149 -0
- package/dist/vite/index.d.ts.map +1 -0
- package/dist/vite/index.js +8 -10
- 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 +1 -1
- package/skills/css/SKILL.md +76 -0
- package/skills/host-router/SKILL.md +21 -0
- package/skills/rango/SKILL.md +1 -0
- package/skills/tailwind/SKILL.md +27 -3
- package/src/browser/app-shell.ts +14 -27
- package/src/browser/navigation-bridge.ts +2 -51
- package/src/browser/navigation-client.ts +14 -0
- package/src/browser/navigation-store.ts +1 -25
- package/src/browser/partial-update.ts +19 -32
- package/src/browser/prefetch/cache.ts +39 -21
- package/src/browser/prefetch/fetch.ts +10 -1
- package/src/browser/rango-state.ts +6 -22
- package/src/browser/react/NavigationProvider.tsx +12 -9
- package/src/browser/react/use-router.ts +4 -3
- package/src/browser/response-adapter.ts +20 -0
- package/src/browser/rsc-router.tsx +15 -13
- package/src/browser/server-action-bridge.ts +21 -0
- package/src/browser/types.ts +4 -15
- package/src/cache/cache-runtime.ts +17 -5
- package/src/cache/cache-scope.ts +23 -7
- package/src/cache/cf/cf-cache-store.ts +25 -7
- package/src/cache/handle-snapshot.ts +103 -0
- package/src/cache/memory-segment-store.ts +3 -2
- package/src/cache/types.ts +10 -6
- package/src/prerender/store.ts +9 -7
- package/src/router/match-middleware/cache-lookup.ts +13 -4
- package/src/router/prerender-match.ts +39 -14
- package/src/router/request-classification.ts +36 -9
- package/src/router/router-interfaces.ts +6 -7
- package/src/router/segment-resolution/static-store.ts +19 -5
- package/src/rsc/handler.ts +30 -8
- package/src/rsc/origin-guard.ts +2 -0
- package/src/rsc/response-route-handler.ts +20 -1
- package/src/rsc/rsc-rendering.ts +10 -0
- package/src/rsc/server-action.ts +16 -2
- package/src/urls/path-helper-types.ts +6 -0
- package/src/vite/discovery/prerender-collection.ts +5 -5
- package/src/vite/router-discovery.ts +3 -4
|
@@ -24,6 +24,26 @@ export function emptyResponse(): Response {
|
|
|
24
24
|
return new Response(null, { status: 200 });
|
|
25
25
|
}
|
|
26
26
|
|
|
27
|
+
/**
|
|
28
|
+
* Whether an RSC content response carries a server-stamped router identity
|
|
29
|
+
* (`X-RSC-Router-Id`) that DIFFERS from the id this client expects (its own
|
|
30
|
+
* routerId, also sent as `_rsc_rid`). Pre-decode integrity check: lets a caller
|
|
31
|
+
* refuse a foreign app's payload before `createFromFetch` imports its chunks.
|
|
32
|
+
*
|
|
33
|
+
* True ONLY when both the header and the expected id are present and differ. An
|
|
34
|
+
* absent header (control-only reload/redirect responses are not stamped) or an
|
|
35
|
+
* absent expected id (e.g. before the client is seeded) is a pass-through —
|
|
36
|
+
* never a false reject.
|
|
37
|
+
*/
|
|
38
|
+
export function isForeignRouterId(
|
|
39
|
+
response: Response,
|
|
40
|
+
expectedId: string | undefined,
|
|
41
|
+
): boolean {
|
|
42
|
+
const got = response.headers.get("X-RSC-Router-Id");
|
|
43
|
+
if (!got || !expectedId) return false;
|
|
44
|
+
return got !== expectedId;
|
|
45
|
+
}
|
|
46
|
+
|
|
27
47
|
/**
|
|
28
48
|
* Handle the X-RSC-Reload control header (server requests a full page reload on
|
|
29
49
|
* a version mismatch). Returns a short-circuit response when the header is
|
|
@@ -117,10 +117,12 @@ export interface BrowserAppContext {
|
|
|
117
117
|
/** App version for prefetch version mismatch detection */
|
|
118
118
|
version?: string;
|
|
119
119
|
/**
|
|
120
|
-
*
|
|
121
|
-
* NavigationProvider
|
|
122
|
-
*
|
|
123
|
-
*
|
|
120
|
+
* App-shell ref, read through on each render so renderSegments and the
|
|
121
|
+
* NavigationProvider see rootLayout/basename/version without closing over a
|
|
122
|
+
* stale snapshot. Set once from the initial payload and not swapped within a
|
|
123
|
+
* session: a cross-app navigation is a full document load (X-RSC-Reload), so
|
|
124
|
+
* the target app establishes its own shell on load. Theme, warmup, and
|
|
125
|
+
* prefetch TTL are document-lifetime too (see AppShell).
|
|
124
126
|
*/
|
|
125
127
|
appShellRef?: import("./app-shell.js").AppShellRef;
|
|
126
128
|
}
|
|
@@ -213,11 +215,11 @@ export async function initBrowserApp(
|
|
|
213
215
|
// Create composable utilities
|
|
214
216
|
const client = createNavigationClient(deps);
|
|
215
217
|
|
|
216
|
-
// Capture the per-router app-shell
|
|
217
|
-
//
|
|
218
|
-
//
|
|
219
|
-
//
|
|
220
|
-
//
|
|
218
|
+
// Capture the per-router app-shell. rootLayout, basename, and version live
|
|
219
|
+
// here and are read through the ref at call time rather than closed over.
|
|
220
|
+
// It is set once from the initial payload and not swapped within a session:
|
|
221
|
+
// a cross-app navigation is a full document load (X-RSC-Reload), so the
|
|
222
|
+
// target app establishes its own shell on load.
|
|
221
223
|
const version = initialPayload.metadata?.version;
|
|
222
224
|
const appShellRef = createAppShellRef({
|
|
223
225
|
routerId: initialPayload.metadata?.routerId,
|
|
@@ -243,9 +245,10 @@ export async function initBrowserApp(
|
|
|
243
245
|
// client chunks (same createFromFetch the navigation client uses).
|
|
244
246
|
setPrefetchDecoder((response) => deps.createFromFetch<RscPayload>(response));
|
|
245
247
|
|
|
246
|
-
// Create a bound renderSegments that reads rootLayout through the shell
|
|
247
|
-
//
|
|
248
|
-
//
|
|
248
|
+
// Create a bound renderSegments that reads rootLayout through the shell ref.
|
|
249
|
+
// The shell is set once at init and not swapped within a session (a cross-app
|
|
250
|
+
// navigation is a full document load), so this always renders this app's
|
|
251
|
+
// Document; reading through the ref just avoids closing over a stale value.
|
|
249
252
|
const renderSegments = (
|
|
250
253
|
segments: ResolvedSegment[],
|
|
251
254
|
options?: RenderSegmentsOptions,
|
|
@@ -285,7 +288,6 @@ export async function initBrowserApp(
|
|
|
285
288
|
onUpdate: (update) => store.emitUpdate(update),
|
|
286
289
|
renderSegments,
|
|
287
290
|
version: version,
|
|
288
|
-
appShellRef,
|
|
289
291
|
});
|
|
290
292
|
|
|
291
293
|
// Connect action redirect → navigation bridge (now that both are initialized)
|
|
@@ -27,6 +27,7 @@ import {
|
|
|
27
27
|
emptyResponse,
|
|
28
28
|
handleReloadHeader,
|
|
29
29
|
teeWithCompletion,
|
|
30
|
+
isForeignRouterId,
|
|
30
31
|
} from "./response-adapter.js";
|
|
31
32
|
import { mergeLocationState } from "./history-state.js";
|
|
32
33
|
import { classifyActionOutcome } from "./action-coordinator.js";
|
|
@@ -260,6 +261,26 @@ export function createServerActionBridge(
|
|
|
260
261
|
return emptyResponse();
|
|
261
262
|
}
|
|
262
263
|
|
|
264
|
+
// Integrity check (pre-decode): a foreign app's action response must
|
|
265
|
+
// not be decoded + applied here. This is the one decode-and-apply path
|
|
266
|
+
// the post-decode partial-update guard does NOT cover (the action
|
|
267
|
+
// bridge has its own createFromFetch -> onUpdate). Ordered after the
|
|
268
|
+
// reload/redirect handlers, which steer control responses first.
|
|
269
|
+
// Reloads via window.location.reload() rather than navigating to a
|
|
270
|
+
// target (as the navigation-client guard does): an action has no
|
|
271
|
+
// navigation target, so reloading the current URL re-syncs the
|
|
272
|
+
// document against the server-applied action effect.
|
|
273
|
+
if (
|
|
274
|
+
!handle.signal.aborted &&
|
|
275
|
+
isForeignRouterId(response, store.getRouterId?.())
|
|
276
|
+
) {
|
|
277
|
+
log("action router id mismatch, reloading to re-sync");
|
|
278
|
+
handle.complete(undefined);
|
|
279
|
+
resolveStreamComplete();
|
|
280
|
+
window.location.reload();
|
|
281
|
+
return new Promise<Response>(() => {});
|
|
282
|
+
}
|
|
283
|
+
|
|
263
284
|
// Start streaming immediately when response arrives
|
|
264
285
|
if (!handle.signal.aborted) {
|
|
265
286
|
streamingToken = handle.startStreaming();
|
package/src/browser/types.ts
CHANGED
|
@@ -32,8 +32,10 @@ export type HandleData = Record<string, Record<string, unknown[]>>;
|
|
|
32
32
|
export interface RscMetadata {
|
|
33
33
|
pathname: string;
|
|
34
34
|
segments: ResolvedSegment[];
|
|
35
|
-
/** Router instance ID
|
|
36
|
-
*
|
|
35
|
+
/** Router instance ID — the current app's identity. A mismatch with the
|
|
36
|
+
* client's id (sent as _rsc_rid) is detected server-side and answered with
|
|
37
|
+
* X-RSC-Reload (full document load), so the client never swaps apps
|
|
38
|
+
* in-session; within a session this always equals the current app. */
|
|
37
39
|
routerId?: string;
|
|
38
40
|
isPartial?: boolean;
|
|
39
41
|
isError?: boolean;
|
|
@@ -433,12 +435,6 @@ export interface NavigationStore {
|
|
|
433
435
|
markCacheAsStale(): void;
|
|
434
436
|
markCacheAsStaleAndBroadcast(): void;
|
|
435
437
|
clearHistoryCache(): void;
|
|
436
|
-
/**
|
|
437
|
-
* Clear this tab's nav + prefetch caches without broadcasting or rotating
|
|
438
|
-
* shared state. Intended for app-switch transitions that affect only this
|
|
439
|
-
* tab's session.
|
|
440
|
-
*/
|
|
441
|
-
clearHistoryCacheLocal(): void;
|
|
442
438
|
broadcastCacheInvalidation(): void;
|
|
443
439
|
|
|
444
440
|
// Cross-tab refresh callback (set by navigation bridge)
|
|
@@ -556,13 +552,6 @@ export interface NavigationBridge {
|
|
|
556
552
|
getVersion(): string | undefined;
|
|
557
553
|
/** Update the RSC version (e.g. after HMR). Clears prefetch cache. */
|
|
558
554
|
updateVersion(newVersion: string): void;
|
|
559
|
-
/**
|
|
560
|
-
* Replace the active app-shell snapshot (rootLayout, basename, version)
|
|
561
|
-
* atomically. Used on cross-app navigations when the response's routerId
|
|
562
|
-
* indicates the user entered a different app. Theme, warmup, and prefetch
|
|
563
|
-
* TTL are document-lifetime and not part of the shell.
|
|
564
|
-
*/
|
|
565
|
-
updateAppShell(next: import("./app-shell.js").AppShell): void;
|
|
566
555
|
}
|
|
567
556
|
|
|
568
557
|
/**
|
|
@@ -32,7 +32,11 @@ import {
|
|
|
32
32
|
export { isCachedFunction };
|
|
33
33
|
import { serializeResult, deserializeResult } from "./segment-codec.js";
|
|
34
34
|
import { createHandleStore } from "../server/handle-store.js";
|
|
35
|
-
import {
|
|
35
|
+
import {
|
|
36
|
+
restoreHandles,
|
|
37
|
+
encodeHandles,
|
|
38
|
+
decodeHandles,
|
|
39
|
+
} from "./handle-snapshot.js";
|
|
36
40
|
import { startHandleCapture, type HandleCapture } from "./handle-capture.js";
|
|
37
41
|
import { sortedSearchString } from "./cache-key-utils.js";
|
|
38
42
|
import { runBackground } from "./background-task.js";
|
|
@@ -170,7 +174,8 @@ export function registerCachedFunction<T extends (...args: any[]) => any>(
|
|
|
170
174
|
if (cached.handles && hasTaintedArgs) {
|
|
171
175
|
const handleStore = requestCtx?._handleStore;
|
|
172
176
|
if (handleStore) {
|
|
173
|
-
|
|
177
|
+
const r = await decodeHandles(cached.handles);
|
|
178
|
+
if (r) restoreHandles(r, handleStore);
|
|
174
179
|
}
|
|
175
180
|
}
|
|
176
181
|
return result;
|
|
@@ -186,7 +191,8 @@ export function registerCachedFunction<T extends (...args: any[]) => any>(
|
|
|
186
191
|
if (cached.handles && hasTaintedArgs) {
|
|
187
192
|
const handleStore = requestCtx?._handleStore;
|
|
188
193
|
if (handleStore) {
|
|
189
|
-
|
|
194
|
+
const r = await decodeHandles(cached.handles);
|
|
195
|
+
if (r) restoreHandles(r, handleStore);
|
|
190
196
|
}
|
|
191
197
|
}
|
|
192
198
|
// Background revalidation — must capture handles if tainted args present.
|
|
@@ -242,8 +248,11 @@ export function registerCachedFunction<T extends (...args: any[]) => any>(
|
|
|
242
248
|
bgStopCapture?.();
|
|
243
249
|
const serialized = await serializeResult(freshResult);
|
|
244
250
|
if (serialized !== null) {
|
|
251
|
+
const encodedHandles = bgCapture?.data
|
|
252
|
+
? await encodeHandles(bgCapture.data)
|
|
253
|
+
: undefined;
|
|
245
254
|
await store.setItem!(cacheKey, serialized, {
|
|
246
|
-
handles:
|
|
255
|
+
handles: encodedHandles,
|
|
247
256
|
ttl: profile.ttl,
|
|
248
257
|
swr: profile.swr,
|
|
249
258
|
tags: profile.tags,
|
|
@@ -317,8 +326,11 @@ export function registerCachedFunction<T extends (...args: any[]) => any>(
|
|
|
317
326
|
try {
|
|
318
327
|
const serialized = await serializeResult(result);
|
|
319
328
|
if (serialized !== null) {
|
|
329
|
+
const encodedHandles = capture?.data
|
|
330
|
+
? await encodeHandles(capture.data)
|
|
331
|
+
: undefined;
|
|
320
332
|
await store.setItem!(cacheKey, serialized, {
|
|
321
|
-
handles:
|
|
333
|
+
handles: encodedHandles,
|
|
322
334
|
ttl: profile.ttl,
|
|
323
335
|
swr: profile.swr,
|
|
324
336
|
tags: profile.tags,
|
package/src/cache/cache-scope.ts
CHANGED
|
@@ -17,7 +17,12 @@ import {
|
|
|
17
17
|
_getRequestContext,
|
|
18
18
|
} from "../server/request-context.js";
|
|
19
19
|
import { serializeSegments, deserializeSegments } from "./segment-codec.js";
|
|
20
|
-
import {
|
|
20
|
+
import {
|
|
21
|
+
captureHandles,
|
|
22
|
+
restoreHandles,
|
|
23
|
+
encodeHandles,
|
|
24
|
+
decodeHandles,
|
|
25
|
+
} from "./handle-snapshot.js";
|
|
21
26
|
import { sortedSearchString, sortedRouteParams } from "./cache-key-utils.js";
|
|
22
27
|
import {
|
|
23
28
|
DEFAULT_ROUTE_TTL,
|
|
@@ -251,10 +256,16 @@ export class CacheScope {
|
|
|
251
256
|
// Deserialize segments
|
|
252
257
|
const segments = await deserializeSegments(cached.segments);
|
|
253
258
|
|
|
254
|
-
// Replay handle data
|
|
259
|
+
// Replay handle data. An empty string means the route pushed no handles —
|
|
260
|
+
// skip the decode entirely (the common case). Otherwise decode the
|
|
261
|
+
// Flight-encoded blob; a decode failure skips handle restore but keeps the
|
|
262
|
+
// valid cached segments.
|
|
255
263
|
const handleStore = _getRequestContext()?._handleStore;
|
|
256
|
-
if (handleStore) {
|
|
257
|
-
|
|
264
|
+
if (handleStore && cached.handles) {
|
|
265
|
+
const handlesRecord = await decodeHandles(cached.handles);
|
|
266
|
+
if (handlesRecord) {
|
|
267
|
+
restoreHandles(handlesRecord, handleStore);
|
|
268
|
+
}
|
|
258
269
|
}
|
|
259
270
|
|
|
260
271
|
if (INTERNAL_RANGO_DEBUG) {
|
|
@@ -367,12 +378,17 @@ export class CacheScope {
|
|
|
367
378
|
);
|
|
368
379
|
}
|
|
369
380
|
|
|
370
|
-
// Serialize
|
|
371
|
-
|
|
381
|
+
// Serialize segments and Flight-encode handles in parallel. Handles go
|
|
382
|
+
// through the codec (not raw into the entry) so Promise/ReactNode handle
|
|
383
|
+
// values survive a JSON-serializing store — see encodeHandles.
|
|
384
|
+
const [serializedSegments, encodedHandles] = await Promise.all([
|
|
385
|
+
serializeSegments(nonLoaderSegments),
|
|
386
|
+
encodeHandles(handles),
|
|
387
|
+
]);
|
|
372
388
|
|
|
373
389
|
const data: CachedEntryData = {
|
|
374
390
|
segments: serializedSegments,
|
|
375
|
-
handles,
|
|
391
|
+
handles: encodedHandles,
|
|
376
392
|
expiresAt: Date.now() + ttl * 1000,
|
|
377
393
|
};
|
|
378
394
|
|
|
@@ -116,8 +116,8 @@ interface KVSegmentEnvelope {
|
|
|
116
116
|
interface KVItemEnvelope {
|
|
117
117
|
/** RSC-serialized return value */
|
|
118
118
|
v: string;
|
|
119
|
-
/**
|
|
120
|
-
h?:
|
|
119
|
+
/** RSC-encoded handle data (see handle-snapshot.ts encodeHandles) */
|
|
120
|
+
h?: string;
|
|
121
121
|
/** When entry becomes stale (ms epoch) */
|
|
122
122
|
s: number;
|
|
123
123
|
/** When entry hard-expires (ms epoch) */
|
|
@@ -249,7 +249,7 @@ export class CFCacheStore<TEnv = unknown> implements SegmentCacheStore<TEnv> {
|
|
|
249
249
|
) => string | Promise<string>;
|
|
250
250
|
|
|
251
251
|
private readonly namespace?: string;
|
|
252
|
-
private readonly
|
|
252
|
+
private readonly explicitBaseUrl?: string;
|
|
253
253
|
private readonly waitUntil?: (fn: () => Promise<void>) => void;
|
|
254
254
|
private readonly version?: string;
|
|
255
255
|
private readonly kv?: KVNamespace;
|
|
@@ -264,7 +264,12 @@ export class CFCacheStore<TEnv = unknown> implements SegmentCacheStore<TEnv> {
|
|
|
264
264
|
}
|
|
265
265
|
|
|
266
266
|
this.namespace = options.namespace;
|
|
267
|
-
|
|
267
|
+
// Base URL is resolved lazily per cache operation (see resolveBaseUrl).
|
|
268
|
+
// The store is constructed before the per-request context ALS is entered
|
|
269
|
+
// (the cache factory runs ahead of runWithRequestContext in the handler),
|
|
270
|
+
// so deriving the host here would always miss the request and fall back to
|
|
271
|
+
// the internal host. Only the explicit override can be captured eagerly.
|
|
272
|
+
this.explicitBaseUrl = options.baseUrl;
|
|
268
273
|
this.defaults = options.defaults;
|
|
269
274
|
this.version = options.version ?? VERSION;
|
|
270
275
|
this.keyGenerator = options.keyGenerator;
|
|
@@ -272,13 +277,26 @@ export class CFCacheStore<TEnv = unknown> implements SegmentCacheStore<TEnv> {
|
|
|
272
277
|
this.kv = options.kv;
|
|
273
278
|
}
|
|
274
279
|
|
|
280
|
+
/**
|
|
281
|
+
* Resolve the cache-key base URL for the current cache operation.
|
|
282
|
+
* Prefers an explicit `baseUrl` option; otherwise derives it from the live
|
|
283
|
+
* request. Called per operation (from keyToRequest), which runs inside the
|
|
284
|
+
* request-context ALS, so deriveBaseUrl sees the request and can use the
|
|
285
|
+
* production host instead of the internal fallback.
|
|
286
|
+
* @internal
|
|
287
|
+
*/
|
|
288
|
+
private resolveBaseUrl(): string {
|
|
289
|
+
return this.explicitBaseUrl ?? this.deriveBaseUrl();
|
|
290
|
+
}
|
|
291
|
+
|
|
275
292
|
/**
|
|
276
293
|
* Derive base URL from request hostname via requestContext.
|
|
277
294
|
* Uses internal fallback for dev/preview environments and untrusted hostnames.
|
|
295
|
+
* Must run inside the request context (invoked lazily via resolveBaseUrl).
|
|
278
296
|
* @internal
|
|
279
297
|
*/
|
|
280
298
|
private deriveBaseUrl(): string {
|
|
281
|
-
const fallback = "https://rsc-
|
|
299
|
+
const fallback = "https://rsc-dummy-host-1.com/";
|
|
282
300
|
|
|
283
301
|
const ctx = _getRequestContext();
|
|
284
302
|
if (!ctx?.request) {
|
|
@@ -638,7 +656,7 @@ export class CFCacheStore<TEnv = unknown> implements SegmentCacheStore<TEnv> {
|
|
|
638
656
|
|
|
639
657
|
const data = (await response.json()) as {
|
|
640
658
|
value: string;
|
|
641
|
-
handles?:
|
|
659
|
+
handles?: string;
|
|
642
660
|
};
|
|
643
661
|
|
|
644
662
|
if (!isStale || isRevalidating) {
|
|
@@ -743,7 +761,7 @@ export class CFCacheStore<TEnv = unknown> implements SegmentCacheStore<TEnv> {
|
|
|
743
761
|
const encodedKey = encodeURIComponent(key);
|
|
744
762
|
// Include version in URL path to invalidate cache when version changes
|
|
745
763
|
const versionPath = this.version ? `v/${this.version}/` : "";
|
|
746
|
-
return new Request(`${this.
|
|
764
|
+
return new Request(`${this.resolveBaseUrl()}${versionPath}${encodedKey}`, {
|
|
747
765
|
method: "GET",
|
|
748
766
|
});
|
|
749
767
|
}
|
|
@@ -9,6 +9,109 @@
|
|
|
9
9
|
import type { ResolvedSegment } from "../types.js";
|
|
10
10
|
import type { HandleStore } from "../server/handle-store.js";
|
|
11
11
|
import type { SegmentHandleData } from "./types.js";
|
|
12
|
+
import { serializeResult, deserializeResult } from "./segment-codec.js";
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Bound on the background cache-write encode of handle data. A pushed handle
|
|
16
|
+
* value can be a Promise (request-context push-a-promise) or a Promise<ReactNode>
|
|
17
|
+
* (Breadcrumbs content), which the Flight encoder awaits while draining. The
|
|
18
|
+
* encode runs in waitUntil/runBackground, so a never-resolving handle value
|
|
19
|
+
* would otherwise pin a background slot indefinitely; on timeout the entry's
|
|
20
|
+
* handles coalesce to empty rather than hanging or poisoning the whole write.
|
|
21
|
+
*/
|
|
22
|
+
const HANDLE_ENCODE_TIMEOUT_MS = 5000;
|
|
23
|
+
|
|
24
|
+
type HandleRecord = Record<string, SegmentHandleData>;
|
|
25
|
+
|
|
26
|
+
// captureHandles builds a per-segment map keyed by every cached segment id, even
|
|
27
|
+
// segments that pushed nothing (their entry is an empty object). "No handle data"
|
|
28
|
+
// means no segment has any handle, in which case we skip the Flight encode and
|
|
29
|
+
// store an empty string — so the common handle-free route pays neither an encode
|
|
30
|
+
// on write nor a decode on every cache hit.
|
|
31
|
+
function hasHandleData(handles: HandleRecord): boolean {
|
|
32
|
+
for (const segId in handles) {
|
|
33
|
+
for (const _ in handles[segId]) return true;
|
|
34
|
+
}
|
|
35
|
+
return false;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function withTimeout<T>(p: Promise<T>, ms: number, onTimeout: T): Promise<T> {
|
|
39
|
+
let timer: ReturnType<typeof setTimeout>;
|
|
40
|
+
const timeout = new Promise<T>((resolve) => {
|
|
41
|
+
timer = setTimeout(() => resolve(onTimeout), ms);
|
|
42
|
+
});
|
|
43
|
+
return Promise.race([
|
|
44
|
+
p.then(
|
|
45
|
+
(v) => {
|
|
46
|
+
clearTimeout(timer);
|
|
47
|
+
return v;
|
|
48
|
+
},
|
|
49
|
+
(e) => {
|
|
50
|
+
clearTimeout(timer);
|
|
51
|
+
throw e;
|
|
52
|
+
},
|
|
53
|
+
),
|
|
54
|
+
timeout,
|
|
55
|
+
]);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Encode a captured handle map to a string for cache storage.
|
|
60
|
+
*
|
|
61
|
+
* Handle values can be Promises or React elements (e.g. Breadcrumbs `content`).
|
|
62
|
+
* JSON.stringify destroys those (Promise -> {}, ReactNode non-representable), so
|
|
63
|
+
* persisting the raw map silently corrupts non-scalar handle values on stores
|
|
64
|
+
* that serialize to JSON (the Cloudflare cache). Routing the map through the same
|
|
65
|
+
* RSC-Flight codec the segments/value already use awaits Promises and serializes
|
|
66
|
+
* React elements, so the stored field is a lossless, JSON-safe string. The
|
|
67
|
+
* in-memory store keeps the same string by reference, so both backends replay
|
|
68
|
+
* identical decoded values.
|
|
69
|
+
*/
|
|
70
|
+
export async function encodeHandles(handles: HandleRecord): Promise<string> {
|
|
71
|
+
// No handle was pushed anywhere — store an empty marker (decoded as "skip").
|
|
72
|
+
if (!hasHandleData(handles)) return "";
|
|
73
|
+
return encodeHandleValue(handles);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Decode a stored handle string back to a handle map. Returns null on any
|
|
78
|
+
* decode failure (e.g. a cross-version entry read under a pinned static
|
|
79
|
+
* version), so the caller can skip handle restore without discarding the
|
|
80
|
+
* otherwise-valid cached segments alongside it.
|
|
81
|
+
*/
|
|
82
|
+
export function decodeHandles(encoded: string): Promise<HandleRecord | null> {
|
|
83
|
+
return decodeHandleValue<HandleRecord>(encoded);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Encode an arbitrary handle-data value to a Flight string. Used directly by the
|
|
88
|
+
* prerender/static pipeline, whose static path holds a single segment's
|
|
89
|
+
* `SegmentHandleData` (not a segId-keyed map). Bounded by the same timeout as
|
|
90
|
+
* encodeHandles; failure/timeout coalesces to "". The caller owns the empty
|
|
91
|
+
* check (an empty value still encodes to a non-empty Flight string, so skip the
|
|
92
|
+
* call when there is nothing to store).
|
|
93
|
+
*/
|
|
94
|
+
export async function encodeHandleValue(value: unknown): Promise<string> {
|
|
95
|
+
const encoded = await withTimeout(
|
|
96
|
+
serializeResult(value),
|
|
97
|
+
HANDLE_ENCODE_TIMEOUT_MS,
|
|
98
|
+
null,
|
|
99
|
+
);
|
|
100
|
+
return encoded ?? "";
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Decode a Flight-encoded handle-data string. Returns null on any decode
|
|
105
|
+
* failure so the caller can skip handle restore without discarding valid
|
|
106
|
+
* cached/prerendered segments.
|
|
107
|
+
*/
|
|
108
|
+
export async function decodeHandleValue<T>(encoded: string): Promise<T | null> {
|
|
109
|
+
try {
|
|
110
|
+
return await deserializeResult<T>(encoded);
|
|
111
|
+
} catch {
|
|
112
|
+
return null;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
12
115
|
|
|
13
116
|
/**
|
|
14
117
|
* Capture handle data for a set of segments from the handle store.
|
|
@@ -12,7 +12,6 @@ import type {
|
|
|
12
12
|
CacheGetResult,
|
|
13
13
|
CacheItemResult,
|
|
14
14
|
CacheItemOptions,
|
|
15
|
-
SegmentHandleData,
|
|
16
15
|
} from "./types.js";
|
|
17
16
|
import type { RequestContext } from "../server/request-context.js";
|
|
18
17
|
import {
|
|
@@ -56,7 +55,9 @@ interface CachedResponseEntry {
|
|
|
56
55
|
|
|
57
56
|
interface CachedItemEntry {
|
|
58
57
|
value: string;
|
|
59
|
-
|
|
58
|
+
/** RSC-encoded handle data (see handle-snapshot.ts encodeHandles). Stored as
|
|
59
|
+
* the encoded string by reference, identical to the JSON-serializing stores. */
|
|
60
|
+
handles?: string;
|
|
60
61
|
expiresAt: number;
|
|
61
62
|
staleAt: number;
|
|
62
63
|
}
|
package/src/cache/types.ts
CHANGED
|
@@ -175,8 +175,10 @@ export interface SegmentCacheStore<TEnv = unknown> {
|
|
|
175
175
|
export interface CacheItemResult {
|
|
176
176
|
/** RSC-serialized return value */
|
|
177
177
|
value: string;
|
|
178
|
-
/**
|
|
179
|
-
|
|
178
|
+
/** RSC-encoded handle data captured during execution (breadcrumbs, metadata,
|
|
179
|
+
* etc.). Encoded via the Flight codec so Promise/ReactNode handle values
|
|
180
|
+
* survive JSON-serializing stores — see handle-snapshot.ts encodeHandles. */
|
|
181
|
+
handles?: string;
|
|
180
182
|
/** Whether the entry is stale and should be revalidated */
|
|
181
183
|
shouldRevalidate: boolean;
|
|
182
184
|
}
|
|
@@ -185,8 +187,8 @@ export interface CacheItemResult {
|
|
|
185
187
|
* Options for setItem() for function-level caching ("use cache").
|
|
186
188
|
*/
|
|
187
189
|
export interface CacheItemOptions {
|
|
188
|
-
/**
|
|
189
|
-
handles?:
|
|
190
|
+
/** RSC-encoded handle data to store alongside the value (see encodeHandles). */
|
|
191
|
+
handles?: string;
|
|
190
192
|
/** Time-to-live in seconds */
|
|
191
193
|
ttl?: number;
|
|
192
194
|
/** Stale-while-revalidate window in seconds */
|
|
@@ -227,8 +229,10 @@ export interface SerializedSegmentData {
|
|
|
227
229
|
export interface CachedEntryData {
|
|
228
230
|
/** Serialized segments for this entry */
|
|
229
231
|
segments: SerializedSegmentData[];
|
|
230
|
-
/**
|
|
231
|
-
|
|
232
|
+
/** RSC-encoded handle data keyed by segment ID. Encoded via the Flight codec
|
|
233
|
+
* (see handle-snapshot.ts encodeHandles) so Promise/ReactNode handle values
|
|
234
|
+
* round-trip through JSON-serializing stores instead of being flattened. */
|
|
235
|
+
handles: string;
|
|
232
236
|
/** Expiration timestamp (ms since epoch) */
|
|
233
237
|
expiresAt: number;
|
|
234
238
|
}
|
package/src/prerender/store.ts
CHANGED
|
@@ -8,14 +8,14 @@
|
|
|
8
8
|
* that anchors import() resolution relative to the manifest file.
|
|
9
9
|
*/
|
|
10
10
|
|
|
11
|
-
import type {
|
|
12
|
-
SerializedSegmentData,
|
|
13
|
-
SegmentHandleData,
|
|
14
|
-
} from "../cache/types.js";
|
|
11
|
+
import type { SerializedSegmentData } from "../cache/types.js";
|
|
15
12
|
|
|
16
13
|
export interface PrerenderEntry {
|
|
17
14
|
segments: SerializedSegmentData[];
|
|
18
|
-
|
|
15
|
+
/** RSC-encoded handle map (see handle-snapshot.ts encodeHandles); "" when the
|
|
16
|
+
* route pushed no handles. Encoded so Promise/ReactNode handle values survive
|
|
17
|
+
* the JSON-serialized build artifact / dev wire, identical to the runtime cache. */
|
|
18
|
+
handles: string;
|
|
19
19
|
}
|
|
20
20
|
|
|
21
21
|
export interface PrerenderStore {
|
|
@@ -28,7 +28,9 @@ export interface PrerenderStore {
|
|
|
28
28
|
|
|
29
29
|
export interface StaticEntry {
|
|
30
30
|
encoded: string;
|
|
31
|
-
|
|
31
|
+
/** RSC-encoded single-segment handle data (see encodeHandleValue); "" when the
|
|
32
|
+
* Static handler pushed no handles. */
|
|
33
|
+
handles: string;
|
|
32
34
|
}
|
|
33
35
|
|
|
34
36
|
export interface StaticStore {
|
|
@@ -174,7 +176,7 @@ export function createStaticStore(): StaticStore | null {
|
|
|
174
176
|
const val = mod.default;
|
|
175
177
|
// Normalize: string-only (no handles) or { encoded, handles }
|
|
176
178
|
if (typeof val === "string") {
|
|
177
|
-
return { encoded: val, handles:
|
|
179
|
+
return { encoded: val, handles: "" } as StaticEntry;
|
|
178
180
|
}
|
|
179
181
|
return val as StaticEntry;
|
|
180
182
|
})
|
|
@@ -114,6 +114,9 @@ let _deserializeSegments:
|
|
|
114
114
|
let _restoreHandles:
|
|
115
115
|
| typeof import("../../cache/handle-snapshot.js").restoreHandles
|
|
116
116
|
| undefined;
|
|
117
|
+
let _decodeHandles:
|
|
118
|
+
| typeof import("../../cache/handle-snapshot.js").decodeHandles
|
|
119
|
+
| undefined;
|
|
117
120
|
let _hashParams:
|
|
118
121
|
| typeof import("../../prerender/param-hash.js").hashParams
|
|
119
122
|
| undefined;
|
|
@@ -148,6 +151,7 @@ async function ensurePrerenderDeps() {
|
|
|
148
151
|
]);
|
|
149
152
|
_deserializeSegments = codec.deserializeSegments;
|
|
150
153
|
_restoreHandles = snapshot.restoreHandles;
|
|
154
|
+
_decodeHandles = snapshot.decodeHandles;
|
|
151
155
|
_hashParams = paramHash.hashParams;
|
|
152
156
|
_lazyGetRequestContext = reqCtx.getRequestContext;
|
|
153
157
|
if (prerenderStoreInstance === undefined) {
|
|
@@ -174,6 +178,7 @@ async function* yieldFromStore<TEnv>(
|
|
|
174
178
|
if (
|
|
175
179
|
!_deserializeSegments ||
|
|
176
180
|
!_restoreHandles ||
|
|
181
|
+
!_decodeHandles ||
|
|
177
182
|
!_hashParams ||
|
|
178
183
|
!_lazyGetRequestContext
|
|
179
184
|
) {
|
|
@@ -182,11 +187,15 @@ async function* yieldFromStore<TEnv>(
|
|
|
182
187
|
|
|
183
188
|
const segments = await _deserializeSegments(entry.segments);
|
|
184
189
|
|
|
185
|
-
// Replay handle data (same as runtime cache hit path).
|
|
186
|
-
//
|
|
190
|
+
// Replay handle data (same as runtime cache hit path). entry.handles is a
|
|
191
|
+
// Flight-encoded string ("" when none) — decode before restore so
|
|
192
|
+
// Promise/ReactNode handle values are revived, not the corrupted JSON form.
|
|
187
193
|
const handleStore = handleStoreRef ?? _lazyGetRequestContext()?._handleStore;
|
|
188
|
-
if (handleStore) {
|
|
189
|
-
|
|
194
|
+
if (handleStore && entry.handles) {
|
|
195
|
+
const handlesRecord = await _decodeHandles(entry.handles);
|
|
196
|
+
if (handlesRecord) {
|
|
197
|
+
_restoreHandles(handlesRecord, handleStore);
|
|
198
|
+
}
|
|
190
199
|
}
|
|
191
200
|
|
|
192
201
|
state.cacheHit = true;
|