@rangojs/router 0.0.0-experimental.141 → 0.0.0-experimental.142
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 +6 -10
- package/README.md +17 -0
- 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/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 +82 -15
- 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 +19 -18
- package/skills/api-client/SKILL.md +1 -1
- package/skills/breadcrumbs/SKILL.md +1 -1
- package/skills/cache-guide/SKILL.md +1 -1
- package/skills/caching/SKILL.md +17 -1
- package/skills/catalog.json +265 -0
- package/skills/comparison/references/framework-comparison.md +1 -1
- package/skills/composability/SKILL.md +1 -1
- package/skills/debug-manifest/SKILL.md +1 -1
- package/skills/document-cache/SKILL.md +9 -1
- package/skills/fonts/SKILL.md +1 -1
- package/skills/handler-use/SKILL.md +1 -1
- package/skills/hooks/SKILL.md +54 -892
- package/skills/hooks/data.md +273 -0
- package/skills/hooks/handle-and-actions.md +103 -0
- package/skills/hooks/navigation.md +110 -0
- package/skills/hooks/outlets.md +41 -0
- package/skills/hooks/state.md +228 -0
- package/skills/hooks/urls.md +135 -0
- package/skills/host-router/SKILL.md +1 -1
- package/skills/i18n/SKILL.md +1 -1
- package/skills/intercept/SKILL.md +8 -1
- package/skills/layout/SKILL.md +1 -1
- package/skills/links/SKILL.md +1 -1
- package/skills/loader/SKILL.md +8 -1
- package/skills/middleware/SKILL.md +1 -1
- package/skills/migrate-nextjs/SKILL.md +133 -1
- package/skills/migrate-react-router/SKILL.md +42 -816
- package/skills/migrate-react-router/cloudflare-workers.md +129 -0
- package/skills/migrate-react-router/component-migration.md +196 -0
- package/skills/migrate-react-router/data-and-actions.md +225 -0
- package/skills/migrate-react-router/route-mapping.md +271 -0
- package/skills/mime-routes/SKILL.md +1 -1
- package/skills/observability/SKILL.md +1 -1
- package/skills/parallel/SKILL.md +8 -1
- package/skills/ppr/SKILL.md +261 -28
- package/skills/prerender/SKILL.md +8 -1
- package/skills/rango/SKILL.md +12 -12
- package/skills/response-routes/SKILL.md +1 -1
- package/skills/route/SKILL.md +1 -1
- package/skills/router-setup/SKILL.md +1 -1
- package/skills/scripts/SKILL.md +1 -1
- package/skills/server-actions/SKILL.md +3 -2
- package/skills/shell-manifest/SKILL.md +1 -1
- package/skills/streams-and-websockets/SKILL.md +1 -1
- package/skills/tailwind/SKILL.md +1 -1
- package/skills/testing/SKILL.md +1 -1
- package/skills/theme/SKILL.md +1 -1
- package/skills/typesafety/SKILL.md +44 -919
- package/skills/typesafety/env-and-bindings.md +254 -0
- package/skills/typesafety/generated-files-and-cli.md +305 -0
- package/skills/typesafety/params-and-search.md +153 -0
- package/skills/typesafety/route-types.md +209 -0
- package/skills/use-cache/SKILL.md +7 -1
- package/skills/vercel/SKILL.md +1 -1
- package/skills/view-transitions/SKILL.md +1 -1
- package/src/browser/event-controller.ts +41 -10
- package/src/browser/logging.ts +10 -0
- package/src/browser/merge-segment-loaders.ts +6 -4
- package/src/browser/navigation-client.ts +5 -1
- package/src/browser/navigation-store.ts +46 -6
- package/src/browser/partial-update.ts +27 -15
- package/src/browser/prefetch/cache.ts +26 -4
- package/src/browser/prefetch/fetch.ts +27 -17
- package/src/browser/react/Link.tsx +13 -3
- package/src/browser/react/NavigationProvider.tsx +21 -19
- package/src/browser/scroll-restoration.ts +7 -5
- package/src/browser/segment-reconciler.ts +31 -21
- package/src/browser/types.ts +12 -0
- package/src/cache/cache-runtime.ts +203 -23
- package/src/cache/document-cache.ts +20 -9
- package/src/cache/memory-segment-store.ts +53 -2
- package/src/cache/segment-codec.ts +4 -4
- package/src/cache/shell-snapshot.ts +50 -1
- package/src/cache/types.ts +25 -5
- package/src/cache/vercel/vercel-cache-store.ts +131 -107
- package/src/router/manifest.ts +13 -5
- package/src/router/match-api.ts +70 -30
- package/src/router/match-handlers.ts +6 -2
- package/src/router/match-result.ts +35 -15
- package/src/router/middleware.ts +10 -3
- package/src/router/request-classification.ts +20 -7
- package/src/router/route-snapshot.ts +10 -0
- package/src/router/segment-resolution/fresh.ts +25 -4
- package/src/router/segment-resolution/loader-cache.ts +57 -8
- package/src/router/segment-resolution/loader-mask.ts +26 -3
- package/src/router/segment-resolution/loader-snapshot.ts +170 -0
- package/src/rsc/nonce.ts +10 -1
- package/src/rsc/rsc-rendering.ts +39 -8
- package/src/rsc/shell-capture.ts +196 -13
- package/src/rsc/shell-serve.ts +26 -0
- package/src/server/cookie-store.ts +6 -0
- package/src/server/request-context.ts +33 -0
- package/src/ssr/index.tsx +7 -0
- package/src/vite/discovery/dev-prerender-cache.ts +117 -0
- package/src/vite/router-discovery.ts +78 -15
|
@@ -127,6 +127,86 @@ export async function replyToCacheKey(
|
|
|
127
127
|
// the test-ergonomics warning fires once per fn rather than once per call.
|
|
128
128
|
const warnedUncachedUnderTest = new Set<string>();
|
|
129
129
|
|
|
130
|
+
/**
|
|
131
|
+
* Fast-path cache-key builder for JSON-safe key args. Returns a deterministic
|
|
132
|
+
* string (object keys recursively sorted so insertion order can't change the
|
|
133
|
+
* key) when EVERY part is a primitive or a plain object/array of the same, and
|
|
134
|
+
* `undefined` otherwise so the caller falls back to the Flight reply encoder.
|
|
135
|
+
*
|
|
136
|
+
* Strings are always quoted via JSON.stringify, so they can never collide with
|
|
137
|
+
* the bareword encodings of null/true/false/undefined/numbers. Anything the
|
|
138
|
+
* reply encoder must handle instead — functions, symbols, bigint, non-finite
|
|
139
|
+
* numbers, Dates, Maps, class instances, promises, and React elements (whose
|
|
140
|
+
* `$$typeof` symbol value trips the symbol reject) — yields `undefined`.
|
|
141
|
+
*/
|
|
142
|
+
function jsonSafeKeyPart(value: unknown): string | undefined {
|
|
143
|
+
if (value === null) return "null";
|
|
144
|
+
switch (typeof value) {
|
|
145
|
+
case "string":
|
|
146
|
+
return JSON.stringify(value);
|
|
147
|
+
case "boolean":
|
|
148
|
+
return value ? "true" : "false";
|
|
149
|
+
case "number":
|
|
150
|
+
return Number.isFinite(value) ? String(value) : undefined;
|
|
151
|
+
case "undefined":
|
|
152
|
+
return "undefined";
|
|
153
|
+
case "object": {
|
|
154
|
+
if (Array.isArray(value)) {
|
|
155
|
+
const parts: string[] = [];
|
|
156
|
+
for (const item of value) {
|
|
157
|
+
const encoded = jsonSafeKeyPart(item);
|
|
158
|
+
if (encoded === undefined) return undefined;
|
|
159
|
+
parts.push(encoded);
|
|
160
|
+
}
|
|
161
|
+
return `[${parts.join(",")}]`;
|
|
162
|
+
}
|
|
163
|
+
// Only plain objects (Object.prototype or null proto) are fast-path safe.
|
|
164
|
+
// Dates, Maps, class instances, promises, etc. carry a different prototype
|
|
165
|
+
// and fall back to the encoder.
|
|
166
|
+
const proto = Object.getPrototypeOf(value);
|
|
167
|
+
if (proto !== Object.prototype && proto !== null) return undefined;
|
|
168
|
+
const obj = value as Record<string, unknown>;
|
|
169
|
+
const parts: string[] = [];
|
|
170
|
+
for (const key of Object.keys(obj).sort()) {
|
|
171
|
+
const encoded = jsonSafeKeyPart(obj[key]);
|
|
172
|
+
if (encoded === undefined) return undefined;
|
|
173
|
+
parts.push(`${JSON.stringify(key)}:${encoded}`);
|
|
174
|
+
}
|
|
175
|
+
return `{${parts.join(",")}}`;
|
|
176
|
+
}
|
|
177
|
+
default:
|
|
178
|
+
// bigint, symbol, function
|
|
179
|
+
return undefined;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
/**
|
|
184
|
+
* The serialized product of one "use cache" execution: exactly what the store
|
|
185
|
+
* write persists. Followers that dedup onto an in-flight execution (see
|
|
186
|
+
* inFlightExecutions) await this and serve it as a synthetic cache hit — each
|
|
187
|
+
* deserializing its OWN copy of `serialized` and replaying `handles`/`tags`
|
|
188
|
+
* against its OWN request. A deserialized result object is never shared.
|
|
189
|
+
*/
|
|
190
|
+
interface CacheEnvelope {
|
|
191
|
+
/** RSC-serialized return value (never null — a null serialize rejects). */
|
|
192
|
+
serialized: string;
|
|
193
|
+
/** Merged profile/DSL + runtime cacheTag() tags. */
|
|
194
|
+
tags: string[];
|
|
195
|
+
/** RSC-encoded handle blob captured during execution, if any. */
|
|
196
|
+
handles?: string;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
/**
|
|
200
|
+
* In-flight "use cache" executions keyed by cache key. When N concurrent calls
|
|
201
|
+
* miss on the same key, only the first (the leader) runs the function; the rest
|
|
202
|
+
* await its {@link CacheEnvelope} and serve it as a synthetic hit rather than
|
|
203
|
+
* re-running the function and re-writing the store. Isolate-scoped (module
|
|
204
|
+
* singleton), and cleared for a key as soon as the leader settles: a rejected
|
|
205
|
+
* leader (function threw, or the result was not serializable) propagates to
|
|
206
|
+
* current waiters, which then retry fresh.
|
|
207
|
+
*/
|
|
208
|
+
const inFlightExecutions = new Map<string, Promise<CacheEnvelope>>();
|
|
209
|
+
|
|
130
210
|
// ============================================================================
|
|
131
211
|
// Core: registerCachedFunction
|
|
132
212
|
// ============================================================================
|
|
@@ -253,12 +333,23 @@ export function registerCachedFunction<T extends (...args: any[]) => any>(
|
|
|
253
333
|
let cacheKey: string;
|
|
254
334
|
try {
|
|
255
335
|
if (keyArgs.length > 0) {
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
336
|
+
// Fast path: when every key arg is JSON-safe, build the key with a
|
|
337
|
+
// deterministic stable-stringify and skip encodeReply (the Flight reply
|
|
338
|
+
// encoder runs on EVERY call, including hits). The `:j:` namespace keeps
|
|
339
|
+
// these keys disjoint from the encoder path so the two can never collide
|
|
340
|
+
// for one fn id. Entries cached under the old encoder key for JSON-safe
|
|
341
|
+
// args cold-start once after this upgrade.
|
|
342
|
+
const fastKey = jsonSafeKeyPart(keyArgs);
|
|
343
|
+
if (fastKey !== undefined) {
|
|
344
|
+
cacheKey = `use-cache:${id}:j:${fastKey}`;
|
|
345
|
+
} else {
|
|
346
|
+
const tempRefs = createClientTemporaryReferenceSet();
|
|
347
|
+
const encoded = await encodeReply(keyArgs as unknown[], {
|
|
348
|
+
temporaryReferences: tempRefs,
|
|
349
|
+
});
|
|
350
|
+
const argsKey = await replyToCacheKey(encoded);
|
|
351
|
+
cacheKey = `use-cache:${id}:${argsKey}`;
|
|
352
|
+
}
|
|
262
353
|
} else {
|
|
263
354
|
cacheKey = `use-cache:${id}`;
|
|
264
355
|
}
|
|
@@ -438,7 +529,65 @@ export function registerCachedFunction<T extends (...args: any[]) => any>(
|
|
|
438
529
|
}
|
|
439
530
|
}
|
|
440
531
|
|
|
441
|
-
// Cache miss
|
|
532
|
+
// Cache miss.
|
|
533
|
+
//
|
|
534
|
+
// In-flight dedup: if a concurrent call for this key is already executing,
|
|
535
|
+
// await its envelope and serve it as a synthetic hit rather than re-running
|
|
536
|
+
// the function. Each follower deserializes its OWN copy, replays handles
|
|
537
|
+
// against its OWN handle store (gated on ITS hasTaintedArgs), and records
|
|
538
|
+
// tags into its OWN request — no deserialized result is shared across
|
|
539
|
+
// requests. The store write stays exactly once (the leader's).
|
|
540
|
+
const existing = inFlightExecutions.get(cacheKey);
|
|
541
|
+
if (existing) {
|
|
542
|
+
let envelope: CacheEnvelope | undefined;
|
|
543
|
+
try {
|
|
544
|
+
envelope = await existing;
|
|
545
|
+
} catch {
|
|
546
|
+
// Leader rejected (function threw or its result was not serializable);
|
|
547
|
+
// its map entry is already cleared, so fall through to a fresh run.
|
|
548
|
+
envelope = undefined;
|
|
549
|
+
}
|
|
550
|
+
if (envelope) {
|
|
551
|
+
try {
|
|
552
|
+
return await serveCached({
|
|
553
|
+
value: envelope.serialized,
|
|
554
|
+
handles: envelope.handles,
|
|
555
|
+
tags: envelope.tags,
|
|
556
|
+
shouldRevalidate: false,
|
|
557
|
+
});
|
|
558
|
+
} catch (error) {
|
|
559
|
+
reportCacheError(
|
|
560
|
+
error,
|
|
561
|
+
"cache-corrupt",
|
|
562
|
+
`[use cache] "${id}" inflight-hit`,
|
|
563
|
+
);
|
|
564
|
+
// Fall through to a fresh execution below.
|
|
565
|
+
}
|
|
566
|
+
}
|
|
567
|
+
}
|
|
568
|
+
|
|
569
|
+
// This call becomes the leader. Register a deferred envelope so concurrent
|
|
570
|
+
// callers dedup onto it; it is resolved/rejected exactly once below (or on a
|
|
571
|
+
// function throw). clearSelf only deletes the map slot if it still holds
|
|
572
|
+
// THIS promise, so a fall-through retry (rare rejected-leader path) can't
|
|
573
|
+
// evict a newer leader's entry.
|
|
574
|
+
let resolveEnvelope!: (env: CacheEnvelope) => void;
|
|
575
|
+
let rejectEnvelope!: (err: unknown) => void;
|
|
576
|
+
const envelopePromise = new Promise<CacheEnvelope>((res, rej) => {
|
|
577
|
+
resolveEnvelope = res;
|
|
578
|
+
rejectEnvelope = rej;
|
|
579
|
+
});
|
|
580
|
+
// Followers attach their own catch; guard the map's own reference so a
|
|
581
|
+
// rejected envelope with no waiter is not an unhandled rejection.
|
|
582
|
+
envelopePromise.catch(() => {});
|
|
583
|
+
inFlightExecutions.set(cacheKey, envelopePromise);
|
|
584
|
+
const clearSelf = (): void => {
|
|
585
|
+
if (inFlightExecutions.get(cacheKey) === envelopePromise) {
|
|
586
|
+
inFlightExecutions.delete(cacheKey);
|
|
587
|
+
}
|
|
588
|
+
};
|
|
589
|
+
|
|
590
|
+
// execute, serialize, store
|
|
442
591
|
const handleStore = hasTaintedArgs ? requestCtx?._handleStore : undefined;
|
|
443
592
|
let capture: HandleCapture | undefined;
|
|
444
593
|
let stopCapture: (() => void) | undefined;
|
|
@@ -471,6 +620,12 @@ export function registerCachedFunction<T extends (...args: any[]) => any>(
|
|
|
471
620
|
try {
|
|
472
621
|
scoped = runWithCacheTagScope(() => fn.apply(this, args));
|
|
473
622
|
result = await scoped.result;
|
|
623
|
+
} catch (execError) {
|
|
624
|
+
// The function threw: drop the in-flight entry and reject any waiters so
|
|
625
|
+
// they retry fresh, then propagate to this caller.
|
|
626
|
+
clearSelf();
|
|
627
|
+
rejectEnvelope(execError);
|
|
628
|
+
throw execError;
|
|
474
629
|
} finally {
|
|
475
630
|
// Decrement ref count; symbol is deleted when it reaches zero
|
|
476
631
|
for (const arg of taintedArgs) {
|
|
@@ -491,28 +646,53 @@ export function registerCachedFunction<T extends (...args: any[]) => any>(
|
|
|
491
646
|
];
|
|
492
647
|
recordRequestTags(allTags, requestCtx);
|
|
493
648
|
|
|
494
|
-
// Serialize
|
|
495
|
-
//
|
|
496
|
-
|
|
649
|
+
// Serialize + encode handles ONCE, resolve the in-flight envelope so any
|
|
650
|
+
// concurrent followers can serve a synthetic hit, then persist to the store.
|
|
651
|
+
// Fully non-blocking when waitUntil is available — the leader's response
|
|
652
|
+
// waits on neither serialization nor the store write.
|
|
653
|
+
const finalizeAndWrite = async (): Promise<void> => {
|
|
654
|
+
let serialized: string | null;
|
|
655
|
+
let encodedHandles: string | undefined;
|
|
497
656
|
try {
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
657
|
+
serialized = await serializeResult(result);
|
|
658
|
+
encodedHandles = capture?.data
|
|
659
|
+
? await encodeHandles(capture.data)
|
|
660
|
+
: undefined;
|
|
661
|
+
} catch (buildError) {
|
|
662
|
+
// Serialize/handle-encode failed: no envelope for followers (they run
|
|
663
|
+
// fresh) and nothing to write.
|
|
664
|
+
clearSelf();
|
|
665
|
+
rejectEnvelope(buildError);
|
|
666
|
+
requestCtx?._reportBackgroundError?.(buildError, "cache-write");
|
|
667
|
+
return;
|
|
668
|
+
}
|
|
669
|
+
clearSelf();
|
|
670
|
+
if (serialized === null) {
|
|
671
|
+
// Non-serializable result: no store write (matches the prior silent
|
|
672
|
+
// skip); reject so any waiter falls through to a fresh execution.
|
|
673
|
+
rejectEnvelope(
|
|
674
|
+
new Error(
|
|
675
|
+
`[use cache] "${id}" result is not serializable; not cached`,
|
|
676
|
+
),
|
|
677
|
+
);
|
|
678
|
+
return;
|
|
679
|
+
}
|
|
680
|
+
// Hand followers the envelope before the store write so a slow/failed
|
|
681
|
+
// write never stalls them.
|
|
682
|
+
resolveEnvelope({ serialized, tags: allTags, handles: encodedHandles });
|
|
683
|
+
try {
|
|
684
|
+
await store.setItem!(cacheKey, serialized, {
|
|
685
|
+
handles: encodedHandles,
|
|
686
|
+
ttl: profile.ttl,
|
|
687
|
+
swr: profile.swr,
|
|
688
|
+
tags: allTags.length > 0 ? allTags : undefined,
|
|
689
|
+
});
|
|
510
690
|
} catch (writeError) {
|
|
511
691
|
requestCtx?._reportBackgroundError?.(writeError, "cache-write");
|
|
512
692
|
}
|
|
513
693
|
};
|
|
514
694
|
|
|
515
|
-
await runBackground(requestCtx,
|
|
695
|
+
await runBackground(requestCtx, finalizeAndWrite, true);
|
|
516
696
|
|
|
517
697
|
return result;
|
|
518
698
|
};
|
|
@@ -127,20 +127,31 @@ function shouldCacheResponse(response: Response): CacheDirectives | null {
|
|
|
127
127
|
// ============================================================================
|
|
128
128
|
|
|
129
129
|
/**
|
|
130
|
-
* Add cache
|
|
130
|
+
* Add the cache-status header (HIT/STALE/MISS) to a response.
|
|
131
|
+
*
|
|
132
|
+
* The response we get here is always a fresh instance — the store rebuilds a
|
|
133
|
+
* new Response per getResponse(), and the miss path wraps a fresh Response
|
|
134
|
+
* around the tee'd body — so mutating its headers in place is safe and avoids
|
|
135
|
+
* cloning every header + allocating a new Response on every cache hit. Only when
|
|
136
|
+
* the headers are immutable (a guarded Response rejects set() with a TypeError)
|
|
137
|
+
* do we fall back to rebuilding the Response with a mutable Headers.
|
|
131
138
|
*/
|
|
132
139
|
function addCacheStatusHeader(
|
|
133
140
|
response: Response,
|
|
134
141
|
status: "HIT" | "STALE" | "MISS",
|
|
135
142
|
): Response {
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
143
|
+
try {
|
|
144
|
+
response.headers.set(CACHE_STATUS_HEADER, status);
|
|
145
|
+
return response;
|
|
146
|
+
} catch {
|
|
147
|
+
const headers = new Headers(response.headers);
|
|
148
|
+
headers.set(CACHE_STATUS_HEADER, status);
|
|
149
|
+
return new Response(response.body, {
|
|
150
|
+
status: response.status,
|
|
151
|
+
statusText: response.statusText,
|
|
152
|
+
headers,
|
|
153
|
+
});
|
|
154
|
+
}
|
|
144
155
|
}
|
|
145
156
|
|
|
146
157
|
/**
|
|
@@ -130,8 +130,25 @@ export interface MemorySegmentCacheStoreOptions<TEnv = unknown> {
|
|
|
130
130
|
ctx: RequestContext<TEnv>,
|
|
131
131
|
defaultKey: string,
|
|
132
132
|
) => string | Promise<string>;
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* Maximum number of entries kept per internal family (segment, response,
|
|
136
|
+
* item, shell). On insert, once a family reaches the cap its oldest entry is
|
|
137
|
+
* evicted FIFO (insertion order) and its tag-index entries are cleaned up, so
|
|
138
|
+
* a long-lived instance can't grow without bound. Lazy TTL expiry still runs
|
|
139
|
+
* independently. Defaults to DEFAULT_MAX_ENTRIES (1000).
|
|
140
|
+
*
|
|
141
|
+
* @example
|
|
142
|
+
* ```typescript
|
|
143
|
+
* const store = new MemorySegmentCacheStore({ maxEntries: 500 });
|
|
144
|
+
* ```
|
|
145
|
+
*/
|
|
146
|
+
maxEntries?: number;
|
|
133
147
|
}
|
|
134
148
|
|
|
149
|
+
/** Default per-family entry cap for MemorySegmentCacheStore (FIFO eviction). */
|
|
150
|
+
const DEFAULT_MAX_ENTRIES = 1000;
|
|
151
|
+
|
|
135
152
|
/**
|
|
136
153
|
* In-memory segment cache store.
|
|
137
154
|
*
|
|
@@ -139,10 +156,16 @@ export interface MemorySegmentCacheStoreOptions<TEnv = unknown> {
|
|
|
139
156
|
* For production with multiple instances, use a distributed store
|
|
140
157
|
* like Cloudflare KV or Redis.
|
|
141
158
|
*
|
|
159
|
+
* Each family is size-capped at `maxEntries` (default 1000) with FIFO eviction
|
|
160
|
+
* on insert, so a long-lived instance can't grow unbounded; TTL expiry stays
|
|
161
|
+
* lazy on top of that.
|
|
162
|
+
*
|
|
142
163
|
* Tag-index cleanup is lazy, mirroring the data maps: a tagged entry that
|
|
143
164
|
* expires but is never re-read or invalidated leaves its forward+reverse index
|
|
144
|
-
* entries resident until the key is reused or
|
|
145
|
-
* the distinct-tag count and acceptable for a dev/single-instance
|
|
165
|
+
* entries resident until the key is reused, invalidated, or FIFO-evicted. This
|
|
166
|
+
* is bounded by the distinct-tag count and acceptable for a dev/single-instance
|
|
167
|
+
* store. FIFO eviction unregisters the evicted key's tags, so the tag maps do
|
|
168
|
+
* not outlive the capped data maps.
|
|
146
169
|
*
|
|
147
170
|
* @example
|
|
148
171
|
* ```typescript
|
|
@@ -176,6 +199,8 @@ export class MemorySegmentCacheStore<
|
|
|
176
199
|
ctx: RequestContext<TEnv>,
|
|
177
200
|
defaultKey: string,
|
|
178
201
|
) => string | Promise<string>;
|
|
202
|
+
/** Per-family FIFO entry cap. */
|
|
203
|
+
readonly maxEntries: number;
|
|
179
204
|
|
|
180
205
|
constructor(options?: MemorySegmentCacheStoreOptions<TEnv>) {
|
|
181
206
|
if (options?.name != null) {
|
|
@@ -213,6 +238,28 @@ export class MemorySegmentCacheStore<
|
|
|
213
238
|
}
|
|
214
239
|
this.defaults = options?.defaults;
|
|
215
240
|
this.keyGenerator = options?.keyGenerator;
|
|
241
|
+
this.maxEntries = options?.maxEntries ?? DEFAULT_MAX_ENTRIES;
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
/**
|
|
245
|
+
* FIFO cap enforcement, called before inserting `incomingKey` into `map`.
|
|
246
|
+
* When the key is new and the family is at capacity, the oldest entries are
|
|
247
|
+
* evicted in insertion order and their tag-index entries unregistered (so the
|
|
248
|
+
* tag maps don't outlive the capped data map). Overwriting an existing key
|
|
249
|
+
* grows nothing, so it is a no-op.
|
|
250
|
+
*/
|
|
251
|
+
private evictIfNeeded<V>(
|
|
252
|
+
map: Map<string, V>,
|
|
253
|
+
incomingKey: string,
|
|
254
|
+
prefix: string,
|
|
255
|
+
): void {
|
|
256
|
+
if (map.has(incomingKey)) return;
|
|
257
|
+
while (map.size >= this.maxEntries) {
|
|
258
|
+
const oldest = map.keys().next().value;
|
|
259
|
+
if (oldest === undefined) break;
|
|
260
|
+
map.delete(oldest);
|
|
261
|
+
this.unregisterTags(`${prefix}:${oldest}`);
|
|
262
|
+
}
|
|
216
263
|
}
|
|
217
264
|
|
|
218
265
|
async get(key: string): Promise<CacheGetResult | null> {
|
|
@@ -245,6 +292,7 @@ export class MemorySegmentCacheStore<
|
|
|
245
292
|
};
|
|
246
293
|
const prefixedKey = `seg:${key}`;
|
|
247
294
|
this.unregisterTags(prefixedKey);
|
|
295
|
+
this.evictIfNeeded(this.cache, key, "seg");
|
|
248
296
|
this.cache.set(key, entry);
|
|
249
297
|
if (data.tags && data.tags.length > 0) {
|
|
250
298
|
this.registerTags(data.tags, prefixedKey);
|
|
@@ -308,6 +356,7 @@ export class MemorySegmentCacheStore<
|
|
|
308
356
|
|
|
309
357
|
const prefixedKey = `res:${key}`;
|
|
310
358
|
this.unregisterTags(prefixedKey);
|
|
359
|
+
this.evictIfNeeded(this.responseCache, key, "res");
|
|
311
360
|
this.responseCache.set(key, {
|
|
312
361
|
body,
|
|
313
362
|
status: response.status,
|
|
@@ -357,6 +406,7 @@ export class MemorySegmentCacheStore<
|
|
|
357
406
|
const { staleAt, expiresAt } = computeExpiration(ttl, swrWindow);
|
|
358
407
|
const prefixedKey = `item:${key}`;
|
|
359
408
|
this.unregisterTags(prefixedKey);
|
|
409
|
+
this.evictIfNeeded(this.itemCache, key, "item");
|
|
360
410
|
this.itemCache.set(key, {
|
|
361
411
|
value,
|
|
362
412
|
handles: options?.handles,
|
|
@@ -400,6 +450,7 @@ export class MemorySegmentCacheStore<
|
|
|
400
450
|
const { staleAt, expiresAt } = computeExpiration(ttl, swrWindow);
|
|
401
451
|
const prefixedKey = `shell:${key}`;
|
|
402
452
|
this.unregisterTags(prefixedKey);
|
|
453
|
+
this.evictIfNeeded(this.shellCache, key, "shell");
|
|
403
454
|
this.shellCache.set(key, { entry, expiresAt, staleAt, tags });
|
|
404
455
|
if (tags && tags.length > 0) {
|
|
405
456
|
this.registerTags(tags, prefixedKey);
|
|
@@ -25,16 +25,16 @@ export async function streamToString(
|
|
|
25
25
|
): Promise<string> {
|
|
26
26
|
const reader = stream.getReader();
|
|
27
27
|
const decoder = new TextDecoder();
|
|
28
|
-
|
|
28
|
+
const chunks: string[] = [];
|
|
29
29
|
|
|
30
30
|
while (true) {
|
|
31
31
|
const { done, value } = await reader.read();
|
|
32
32
|
if (done) break;
|
|
33
|
-
|
|
33
|
+
chunks.push(decoder.decode(value, { stream: true }));
|
|
34
34
|
}
|
|
35
35
|
|
|
36
|
-
|
|
37
|
-
return
|
|
36
|
+
chunks.push(decoder.decode()); // flush
|
|
37
|
+
return chunks.join("");
|
|
38
38
|
}
|
|
39
39
|
|
|
40
40
|
/**
|
|
@@ -33,6 +33,7 @@ import type {
|
|
|
33
33
|
ShellSnapshotRecord,
|
|
34
34
|
ShellSnapshotItemValue,
|
|
35
35
|
ShellSnapshotResponseValue,
|
|
36
|
+
ShellSnapshotLoaderValue,
|
|
36
37
|
} from "./types.js";
|
|
37
38
|
import { bufferToBase64, base64ToBuffer } from "./cf/cf-base64.js";
|
|
38
39
|
import { isPerClientSignalHeader } from "../browser/cookie-name.js";
|
|
@@ -244,6 +245,51 @@ export function getRecordingStore<TEnv>(
|
|
|
244
245
|
return store instanceof RecordingShellStore ? store : undefined;
|
|
245
246
|
}
|
|
246
247
|
|
|
248
|
+
/**
|
|
249
|
+
* Materialize the loader-family seed from a shell snapshot for a HIT's tail
|
|
250
|
+
* render: Flight-deserialize each recorded (promise-elided) bake-lane
|
|
251
|
+
* container into a segment-key -> container Map, which serveShellHit assigns
|
|
252
|
+
* to the tail context's `_shellLoaderSeed` for the resolveLoaderData overlay.
|
|
253
|
+
* Lives here so every snapshot family is decoded in this module (the
|
|
254
|
+
* item/segment/response families via {@link SeededShellStore}); the loader
|
|
255
|
+
* family is not a store read, so it seeds the context instead of a store.
|
|
256
|
+
*
|
|
257
|
+
* Deserializations run in parallel; a record that fails to decode is skipped
|
|
258
|
+
* (that loader drifts — the pre-snapshot behavior — instead of failing the
|
|
259
|
+
* HIT). Returns undefined when the snapshot carries no loader records, without
|
|
260
|
+
* touching the Flight codec (kept lazy for cold paths and non-RSC configs).
|
|
261
|
+
*/
|
|
262
|
+
export async function buildShellLoaderSeed(
|
|
263
|
+
snapshot: ShellSnapshotRecord[],
|
|
264
|
+
): Promise<Map<string, unknown> | undefined> {
|
|
265
|
+
const loaderRecords: ShellSnapshotRecord[] = [];
|
|
266
|
+
for (const rec of snapshot) {
|
|
267
|
+
if (rec.family === "loader") loaderRecords.push(rec);
|
|
268
|
+
}
|
|
269
|
+
if (loaderRecords.length === 0) return undefined;
|
|
270
|
+
|
|
271
|
+
const { deserializeResult } = await import("./segment-codec.js");
|
|
272
|
+
const entries = await Promise.all(
|
|
273
|
+
loaderRecords.map(async (rec): Promise<[string, unknown] | null> => {
|
|
274
|
+
try {
|
|
275
|
+
return [
|
|
276
|
+
rec.key,
|
|
277
|
+
await deserializeResult(
|
|
278
|
+
(rec.value as ShellSnapshotLoaderValue).value,
|
|
279
|
+
),
|
|
280
|
+
];
|
|
281
|
+
} catch {
|
|
282
|
+
return null;
|
|
283
|
+
}
|
|
284
|
+
}),
|
|
285
|
+
);
|
|
286
|
+
const seed = new Map<string, unknown>();
|
|
287
|
+
for (const entry of entries) {
|
|
288
|
+
if (entry) seed.set(entry[0], entry[1]);
|
|
289
|
+
}
|
|
290
|
+
return seed.size > 0 ? seed : undefined;
|
|
291
|
+
}
|
|
292
|
+
|
|
247
293
|
/**
|
|
248
294
|
* A read-through overlay the HIT tail render reads through. For a key present in
|
|
249
295
|
* the snapshot it serves the recorded value AS FRESH (shouldRevalidate: false —
|
|
@@ -269,9 +315,12 @@ export class SeededShellStore<
|
|
|
269
315
|
this.items.set(rec.key, rec.value as ShellSnapshotItemValue);
|
|
270
316
|
} else if (rec.family === "segment") {
|
|
271
317
|
this.segments.set(rec.key, rec.value as CachedEntryData);
|
|
272
|
-
} else {
|
|
318
|
+
} else if (rec.family === "response") {
|
|
273
319
|
this.responses.set(rec.key, rec.value as ShellSnapshotResponseValue);
|
|
274
320
|
}
|
|
321
|
+
// "loader" family records are not store reads — serveShellHit seeds them
|
|
322
|
+
// onto the tail context (_shellLoaderSeed) for the resolveLoaderData
|
|
323
|
+
// overlay instead.
|
|
275
324
|
}
|
|
276
325
|
}
|
|
277
326
|
|
package/src/cache/types.ts
CHANGED
|
@@ -271,11 +271,27 @@ export interface ShellCacheEntry {
|
|
|
271
271
|
}
|
|
272
272
|
|
|
273
273
|
/**
|
|
274
|
-
* The
|
|
275
|
-
*
|
|
276
|
-
*
|
|
274
|
+
* The families a shell snapshot pins. The item/segment/response families are
|
|
275
|
+
* cache-store reads/writes (recorded by RecordingShellStore); the loader family
|
|
276
|
+
* pins the settled CONTAINER of a bake-lane loader (a loader on an entry with
|
|
277
|
+
* no renderable loading(), executed during capture — see
|
|
278
|
+
* docs/design/loader-container-bake.md). Excludes the shell family itself
|
|
279
|
+
* (getShell/putShell) — the snapshot rides INSIDE a shell entry, so recording
|
|
280
|
+
* it would be self-referential.
|
|
277
281
|
*/
|
|
278
|
-
export type ShellSnapshotFamily = "item" | "segment" | "response";
|
|
282
|
+
export type ShellSnapshotFamily = "item" | "segment" | "response" | "loader";
|
|
283
|
+
|
|
284
|
+
/**
|
|
285
|
+
* The stored form of a loader-family snapshot value: the bake-lane loader's
|
|
286
|
+
* settled container, Flight-serialized AFTER eliding every still-pending nested
|
|
287
|
+
* promise to a hole marker (the marker paths are holes, not shell material; on
|
|
288
|
+
* a HIT the overlay re-slots the fresh run's promises there). Flight (not JSON)
|
|
289
|
+
* so typed values (Date/Map) survive the round trip.
|
|
290
|
+
*/
|
|
291
|
+
export interface ShellSnapshotLoaderValue {
|
|
292
|
+
/** RSC-serialized elided container (see loader-snapshot.ts). */
|
|
293
|
+
value: string;
|
|
294
|
+
}
|
|
279
295
|
|
|
280
296
|
/** A serialized cached Response for the response family of a shell snapshot. */
|
|
281
297
|
export interface ShellSnapshotResponseValue {
|
|
@@ -307,7 +323,11 @@ export interface ShellSnapshotItemValue {
|
|
|
307
323
|
export interface ShellSnapshotRecord {
|
|
308
324
|
family: ShellSnapshotFamily;
|
|
309
325
|
key: string;
|
|
310
|
-
value:
|
|
326
|
+
value:
|
|
327
|
+
| ShellSnapshotItemValue
|
|
328
|
+
| CachedEntryData
|
|
329
|
+
| ShellSnapshotResponseValue
|
|
330
|
+
| ShellSnapshotLoaderValue;
|
|
311
331
|
}
|
|
312
332
|
|
|
313
333
|
/**
|