@rangojs/router 0.0.0-experimental.9 → 0.0.0-experimental.90
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 +9 -0
- package/README.md +972 -4
- package/dist/__internal.d.ts +83 -0
- package/dist/__internal.d.ts.map +1 -0
- package/dist/__internal.js +19 -0
- package/dist/__internal.js.map +1 -0
- package/dist/__mocks__/version.d.ts +7 -0
- package/dist/__mocks__/version.d.ts.map +1 -0
- package/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 +1619 -155
- package/dist/bin/rango.js.map +1 -0
- package/dist/browser/event-controller.d.ts +191 -0
- package/dist/browser/event-controller.d.ts.map +1 -0
- package/dist/browser/event-controller.js +559 -0
- package/dist/browser/event-controller.js.map +1 -0
- package/dist/browser/index.d.ts +2 -0
- package/dist/browser/index.d.ts.map +1 -0
- package/dist/browser/index.js +14 -0
- package/dist/browser/index.js.map +1 -0
- package/dist/browser/link-interceptor.d.ts +38 -0
- package/dist/browser/link-interceptor.d.ts.map +1 -0
- package/dist/browser/link-interceptor.js +99 -0
- package/dist/browser/link-interceptor.js.map +1 -0
- package/dist/browser/logging.d.ts +10 -0
- package/dist/browser/logging.d.ts.map +1 -0
- package/dist/browser/logging.js +29 -0
- package/dist/browser/logging.js.map +1 -0
- package/dist/browser/lru-cache.d.ts +17 -0
- package/dist/browser/lru-cache.d.ts.map +1 -0
- package/dist/browser/lru-cache.js +50 -0
- package/dist/browser/lru-cache.js.map +1 -0
- package/dist/browser/merge-segment-loaders.d.ts +39 -0
- package/dist/browser/merge-segment-loaders.d.ts.map +1 -0
- package/dist/browser/merge-segment-loaders.js +102 -0
- package/dist/browser/merge-segment-loaders.js.map +1 -0
- package/dist/browser/navigation-bridge.d.ts +102 -0
- package/dist/browser/navigation-bridge.d.ts.map +1 -0
- package/dist/browser/navigation-bridge.js +708 -0
- package/dist/browser/navigation-bridge.js.map +1 -0
- package/dist/browser/navigation-client.d.ts +25 -0
- package/dist/browser/navigation-client.d.ts.map +1 -0
- package/dist/browser/navigation-client.js +157 -0
- package/dist/browser/navigation-client.js.map +1 -0
- package/dist/browser/navigation-store.d.ts +101 -0
- package/dist/browser/navigation-store.d.ts.map +1 -0
- package/dist/browser/navigation-store.js +625 -0
- package/dist/browser/navigation-store.js.map +1 -0
- package/dist/browser/partial-update.d.ts +75 -0
- package/dist/browser/partial-update.d.ts.map +1 -0
- package/dist/browser/partial-update.js +426 -0
- package/dist/browser/partial-update.js.map +1 -0
- package/dist/browser/react/Link.d.ts +86 -0
- package/dist/browser/react/Link.d.ts.map +1 -0
- package/dist/browser/react/Link.js +128 -0
- package/dist/browser/react/Link.js.map +1 -0
- package/dist/browser/react/NavigationProvider.d.ts +63 -0
- package/dist/browser/react/NavigationProvider.d.ts.map +1 -0
- package/dist/browser/react/NavigationProvider.js +216 -0
- package/dist/browser/react/NavigationProvider.js.map +1 -0
- package/dist/browser/react/ScrollRestoration.d.ts +75 -0
- package/dist/browser/react/ScrollRestoration.d.ts.map +1 -0
- package/dist/browser/react/ScrollRestoration.js +57 -0
- package/dist/browser/react/ScrollRestoration.js.map +1 -0
- package/dist/browser/react/context.d.ts +46 -0
- package/dist/browser/react/context.d.ts.map +1 -0
- package/dist/browser/react/context.js +10 -0
- package/dist/browser/react/context.js.map +1 -0
- package/dist/browser/react/index.d.ts +11 -0
- package/dist/browser/react/index.d.ts.map +1 -0
- package/dist/browser/react/index.js +22 -0
- package/dist/browser/react/index.js.map +1 -0
- package/dist/browser/react/location-state-shared.d.ts +63 -0
- package/dist/browser/react/location-state-shared.d.ts.map +1 -0
- package/dist/browser/react/location-state-shared.js +81 -0
- package/dist/browser/react/location-state-shared.js.map +1 -0
- package/dist/browser/react/location-state.d.ts +23 -0
- package/dist/browser/react/location-state.d.ts.map +1 -0
- package/dist/browser/react/location-state.js +29 -0
- package/dist/browser/react/location-state.js.map +1 -0
- package/dist/browser/react/mount-context.d.ts +24 -0
- package/dist/browser/react/mount-context.d.ts.map +1 -0
- package/dist/browser/react/mount-context.js +24 -0
- package/dist/browser/react/mount-context.js.map +1 -0
- package/dist/browser/react/use-action.d.ts +64 -0
- package/dist/browser/react/use-action.d.ts.map +1 -0
- package/dist/browser/react/use-action.js +134 -0
- package/dist/browser/react/use-action.js.map +1 -0
- package/dist/browser/react/use-client-cache.d.ts +41 -0
- package/dist/browser/react/use-client-cache.d.ts.map +1 -0
- package/dist/browser/react/use-client-cache.js +39 -0
- package/dist/browser/react/use-client-cache.js.map +1 -0
- package/dist/browser/react/use-handle.d.ts +31 -0
- package/dist/browser/react/use-handle.d.ts.map +1 -0
- package/dist/browser/react/use-handle.js +144 -0
- package/dist/browser/react/use-handle.js.map +1 -0
- package/dist/browser/react/use-href.d.ts +33 -0
- package/dist/browser/react/use-href.d.ts.map +1 -0
- package/dist/browser/react/use-href.js +39 -0
- package/dist/browser/react/use-href.js.map +1 -0
- package/dist/browser/react/use-link-status.d.ts +37 -0
- package/dist/browser/react/use-link-status.d.ts.map +1 -0
- package/dist/browser/react/use-link-status.js +99 -0
- package/dist/browser/react/use-link-status.js.map +1 -0
- package/dist/browser/react/use-mount.d.ts +25 -0
- package/dist/browser/react/use-mount.d.ts.map +1 -0
- package/dist/browser/react/use-mount.js +30 -0
- package/dist/browser/react/use-mount.js.map +1 -0
- package/dist/browser/react/use-navigation.d.ts +27 -0
- package/dist/browser/react/use-navigation.d.ts.map +1 -0
- package/dist/browser/react/use-navigation.js +87 -0
- package/dist/browser/react/use-navigation.js.map +1 -0
- package/dist/browser/react/use-segments.d.ts +38 -0
- package/dist/browser/react/use-segments.d.ts.map +1 -0
- package/dist/browser/react/use-segments.js +130 -0
- package/dist/browser/react/use-segments.js.map +1 -0
- package/dist/browser/request-controller.d.ts +26 -0
- package/dist/browser/request-controller.d.ts.map +1 -0
- package/dist/browser/request-controller.js +147 -0
- package/dist/browser/request-controller.js.map +1 -0
- package/dist/browser/rsc-router.d.ts +129 -0
- package/dist/browser/rsc-router.d.ts.map +1 -0
- package/dist/browser/rsc-router.js +195 -0
- package/dist/browser/rsc-router.js.map +1 -0
- package/dist/browser/scroll-restoration.d.ts +93 -0
- package/dist/browser/scroll-restoration.d.ts.map +1 -0
- package/dist/browser/scroll-restoration.js +321 -0
- package/dist/browser/scroll-restoration.js.map +1 -0
- package/dist/browser/segment-structure-assert.d.ts +17 -0
- package/dist/browser/segment-structure-assert.d.ts.map +1 -0
- package/dist/browser/segment-structure-assert.js +59 -0
- package/dist/browser/segment-structure-assert.js.map +1 -0
- package/dist/browser/server-action-bridge.d.ts +26 -0
- package/dist/browser/server-action-bridge.d.ts.map +1 -0
- package/dist/browser/server-action-bridge.js +668 -0
- package/dist/browser/server-action-bridge.js.map +1 -0
- package/dist/browser/shallow.d.ts +12 -0
- package/dist/browser/shallow.d.ts.map +1 -0
- package/dist/browser/shallow.js +34 -0
- package/dist/browser/shallow.js.map +1 -0
- package/dist/browser/types.d.ts +369 -0
- package/dist/browser/types.d.ts.map +1 -0
- package/dist/browser/types.js +2 -0
- package/dist/browser/types.js.map +1 -0
- package/dist/build/__tests__/generate-cli.test.d.ts +2 -0
- package/dist/build/__tests__/generate-cli.test.d.ts.map +1 -0
- package/dist/build/__tests__/generate-cli.test.js +237 -0
- package/dist/build/__tests__/generate-cli.test.js.map +1 -0
- package/dist/build/__tests__/generate-manifest.test.d.ts +2 -0
- package/dist/build/__tests__/generate-manifest.test.d.ts.map +1 -0
- package/dist/build/__tests__/generate-manifest.test.js +119 -0
- package/dist/build/__tests__/generate-manifest.test.js.map +1 -0
- package/dist/build/__tests__/generate-route-types.test.d.ts +2 -0
- package/dist/build/__tests__/generate-route-types.test.d.ts.map +1 -0
- package/dist/build/__tests__/generate-route-types.test.js +620 -0
- package/dist/build/__tests__/generate-route-types.test.js.map +1 -0
- package/dist/build/__tests__/per-router-manifest.test.d.ts +2 -0
- package/dist/build/__tests__/per-router-manifest.test.d.ts.map +1 -0
- package/dist/build/__tests__/per-router-manifest.test.js +308 -0
- package/dist/build/__tests__/per-router-manifest.test.js.map +1 -0
- package/dist/build/generate-manifest.d.ts +81 -0
- package/dist/build/generate-manifest.d.ts.map +1 -0
- package/dist/build/generate-manifest.js +276 -0
- package/dist/build/generate-manifest.js.map +1 -0
- package/dist/build/generate-route-types.d.ts +115 -0
- package/dist/build/generate-route-types.d.ts.map +1 -0
- package/dist/build/generate-route-types.js +740 -0
- package/dist/build/generate-route-types.js.map +1 -0
- package/dist/build/index.d.ts +21 -0
- package/dist/build/index.d.ts.map +1 -0
- package/dist/build/index.js +21 -0
- package/dist/build/index.js.map +1 -0
- package/dist/build/route-trie.d.ts +71 -0
- package/dist/build/route-trie.d.ts.map +1 -0
- package/dist/build/route-trie.js +175 -0
- package/dist/build/route-trie.js.map +1 -0
- package/dist/cache/__tests__/cache-scope.test.d.ts +2 -0
- package/dist/cache/__tests__/cache-scope.test.d.ts.map +1 -0
- package/dist/cache/__tests__/cache-scope.test.js +208 -0
- package/dist/cache/__tests__/cache-scope.test.js.map +1 -0
- package/dist/cache/__tests__/document-cache.test.d.ts +2 -0
- package/dist/cache/__tests__/document-cache.test.d.ts.map +1 -0
- package/dist/cache/__tests__/document-cache.test.js +345 -0
- package/dist/cache/__tests__/document-cache.test.js.map +1 -0
- package/dist/cache/__tests__/memory-segment-store.test.d.ts +2 -0
- package/dist/cache/__tests__/memory-segment-store.test.d.ts.map +1 -0
- package/dist/cache/__tests__/memory-segment-store.test.js +425 -0
- package/dist/cache/__tests__/memory-segment-store.test.js.map +1 -0
- package/dist/cache/__tests__/memory-store.test.d.ts +2 -0
- package/dist/cache/__tests__/memory-store.test.d.ts.map +1 -0
- package/dist/cache/__tests__/memory-store.test.js +367 -0
- package/dist/cache/__tests__/memory-store.test.js.map +1 -0
- package/dist/cache/cache-scope.d.ts +102 -0
- package/dist/cache/cache-scope.d.ts.map +1 -0
- package/dist/cache/cache-scope.js +440 -0
- package/dist/cache/cache-scope.js.map +1 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts +2 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts.map +1 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.js +330 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.js.map +1 -0
- package/dist/cache/cf/cf-cache-store.d.ts +165 -0
- package/dist/cache/cf/cf-cache-store.d.ts.map +1 -0
- package/dist/cache/cf/cf-cache-store.js +242 -0
- package/dist/cache/cf/cf-cache-store.js.map +1 -0
- package/dist/cache/cf/index.d.ts +14 -0
- package/dist/cache/cf/index.d.ts.map +1 -0
- package/dist/cache/cf/index.js +17 -0
- package/dist/cache/cf/index.js.map +1 -0
- package/dist/cache/document-cache.d.ts +64 -0
- package/dist/cache/document-cache.d.ts.map +1 -0
- package/dist/cache/document-cache.js +228 -0
- package/dist/cache/document-cache.js.map +1 -0
- package/dist/cache/index.d.ts +19 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +21 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/cache/memory-segment-store.d.ts +110 -0
- package/dist/cache/memory-segment-store.d.ts.map +1 -0
- package/dist/cache/memory-segment-store.js +117 -0
- package/dist/cache/memory-segment-store.js.map +1 -0
- package/dist/cache/memory-store.d.ts +41 -0
- package/dist/cache/memory-store.d.ts.map +1 -0
- package/dist/cache/memory-store.js +191 -0
- package/dist/cache/memory-store.js.map +1 -0
- package/dist/cache/types.d.ts +317 -0
- package/dist/cache/types.d.ts.map +1 -0
- package/dist/cache/types.js +12 -0
- package/dist/cache/types.js.map +1 -0
- package/dist/client.d.ts +248 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +367 -0
- package/dist/client.js.map +1 -0
- package/dist/client.rsc.d.ts +26 -0
- package/dist/client.rsc.d.ts.map +1 -0
- package/dist/client.rsc.js +46 -0
- package/dist/client.rsc.js.map +1 -0
- package/dist/component-utils.d.ts +36 -0
- package/dist/component-utils.d.ts.map +1 -0
- package/dist/component-utils.js +61 -0
- package/dist/component-utils.js.map +1 -0
- package/dist/components/DefaultDocument.d.ts +13 -0
- package/dist/components/DefaultDocument.d.ts.map +1 -0
- package/dist/components/DefaultDocument.js +15 -0
- package/dist/components/DefaultDocument.js.map +1 -0
- package/dist/debug.d.ts +58 -0
- package/dist/debug.d.ts.map +1 -0
- package/dist/debug.js +157 -0
- package/dist/debug.js.map +1 -0
- package/dist/default-error-boundary.d.ts +11 -0
- package/dist/default-error-boundary.d.ts.map +1 -0
- package/dist/default-error-boundary.js +45 -0
- package/dist/default-error-boundary.js.map +1 -0
- package/dist/deps/browser.d.ts +2 -0
- package/dist/deps/browser.d.ts.map +1 -0
- package/dist/deps/browser.js +3 -0
- package/dist/deps/browser.js.map +1 -0
- package/dist/deps/html-stream-client.d.ts +2 -0
- package/dist/deps/html-stream-client.d.ts.map +1 -0
- package/dist/deps/html-stream-client.js +3 -0
- package/dist/deps/html-stream-client.js.map +1 -0
- package/dist/deps/html-stream-server.d.ts +2 -0
- package/dist/deps/html-stream-server.d.ts.map +1 -0
- package/dist/deps/html-stream-server.js +3 -0
- package/dist/deps/html-stream-server.js.map +1 -0
- package/dist/deps/rsc.d.ts +2 -0
- package/dist/deps/rsc.d.ts.map +1 -0
- package/dist/deps/rsc.js +4 -0
- package/dist/deps/rsc.js.map +1 -0
- package/dist/deps/ssr.d.ts +2 -0
- package/dist/deps/ssr.d.ts.map +1 -0
- package/dist/deps/ssr.js +3 -0
- package/dist/deps/ssr.js.map +1 -0
- package/dist/errors.d.ts +174 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +241 -0
- package/dist/errors.js.map +1 -0
- package/dist/handle.d.ts +78 -0
- package/dist/handle.d.ts.map +1 -0
- package/dist/handle.js +82 -0
- package/dist/handle.js.map +1 -0
- package/dist/handles/MetaTags.d.ts +14 -0
- package/dist/handles/MetaTags.d.ts.map +1 -0
- package/dist/handles/MetaTags.js +136 -0
- package/dist/handles/MetaTags.js.map +1 -0
- package/dist/handles/index.d.ts +6 -0
- package/dist/handles/index.d.ts.map +1 -0
- package/dist/handles/index.js +6 -0
- package/dist/handles/index.js.map +1 -0
- package/dist/handles/meta.d.ts +39 -0
- package/dist/handles/meta.d.ts.map +1 -0
- package/dist/handles/meta.js +202 -0
- package/dist/handles/meta.js.map +1 -0
- package/dist/host/__tests__/errors.test.d.ts +2 -0
- package/dist/host/__tests__/errors.test.d.ts.map +1 -0
- package/dist/host/__tests__/errors.test.js +76 -0
- package/dist/host/__tests__/errors.test.js.map +1 -0
- package/dist/host/__tests__/pattern-comprehensive.test.d.ts +2 -0
- package/dist/host/__tests__/pattern-comprehensive.test.d.ts.map +1 -0
- package/dist/host/__tests__/pattern-comprehensive.test.js +732 -0
- package/dist/host/__tests__/pattern-comprehensive.test.js.map +1 -0
- package/dist/host/__tests__/pattern-matcher.test.d.ts +2 -0
- package/dist/host/__tests__/pattern-matcher.test.d.ts.map +1 -0
- package/dist/host/__tests__/pattern-matcher.test.js +251 -0
- package/dist/host/__tests__/pattern-matcher.test.js.map +1 -0
- package/dist/host/__tests__/router.test.d.ts +2 -0
- package/dist/host/__tests__/router.test.d.ts.map +1 -0
- package/dist/host/__tests__/router.test.js +241 -0
- package/dist/host/__tests__/router.test.js.map +1 -0
- package/dist/host/__tests__/testing.test.d.ts +2 -0
- package/dist/host/__tests__/testing.test.d.ts.map +1 -0
- package/dist/host/__tests__/testing.test.js +64 -0
- package/dist/host/__tests__/testing.test.js.map +1 -0
- package/dist/host/__tests__/utils.test.d.ts +2 -0
- package/dist/host/__tests__/utils.test.d.ts.map +1 -0
- package/dist/host/__tests__/utils.test.js +29 -0
- package/dist/host/__tests__/utils.test.js.map +1 -0
- package/dist/host/cookie-handler.d.ts +34 -0
- package/dist/host/cookie-handler.d.ts.map +1 -0
- package/dist/host/cookie-handler.js +124 -0
- package/dist/host/cookie-handler.js.map +1 -0
- package/dist/host/errors.d.ts +56 -0
- package/dist/host/errors.d.ts.map +1 -0
- package/dist/host/errors.js +79 -0
- package/dist/host/errors.js.map +1 -0
- package/dist/host/index.d.ts +29 -0
- package/dist/host/index.d.ts.map +1 -0
- package/dist/host/index.js +32 -0
- package/dist/host/index.js.map +1 -0
- package/dist/host/pattern-matcher.d.ts +36 -0
- package/dist/host/pattern-matcher.d.ts.map +1 -0
- package/dist/host/pattern-matcher.js +172 -0
- package/dist/host/pattern-matcher.js.map +1 -0
- package/dist/host/router.d.ts +26 -0
- package/dist/host/router.d.ts.map +1 -0
- package/dist/host/router.js +218 -0
- package/dist/host/router.js.map +1 -0
- package/dist/host/testing.d.ts +36 -0
- package/dist/host/testing.d.ts.map +1 -0
- package/dist/host/testing.js +55 -0
- package/dist/host/testing.js.map +1 -0
- package/dist/host/types.d.ts +115 -0
- package/dist/host/types.d.ts.map +1 -0
- package/dist/host/types.js +7 -0
- package/dist/host/types.js.map +1 -0
- package/dist/host/utils.d.ts +21 -0
- package/dist/host/utils.d.ts.map +1 -0
- package/dist/host/utils.js +23 -0
- package/dist/host/utils.js.map +1 -0
- package/dist/href-client.d.ts +131 -0
- package/dist/href-client.d.ts.map +1 -0
- package/dist/href-client.js +64 -0
- package/dist/href-client.js.map +1 -0
- package/{src/href-context.ts → dist/href-context.d.ts} +7 -11
- package/dist/href-context.d.ts.map +1 -0
- package/dist/href-context.js +21 -0
- package/dist/href-context.js.map +1 -0
- package/dist/index.d.ts +73 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +91 -0
- package/dist/index.js.map +1 -0
- package/dist/index.rsc.d.ts +32 -0
- package/dist/index.rsc.d.ts.map +1 -0
- package/dist/index.rsc.js +40 -0
- package/dist/index.rsc.js.map +1 -0
- package/dist/internal-debug.d.ts +2 -0
- package/dist/internal-debug.d.ts.map +1 -0
- package/dist/internal-debug.js +5 -0
- package/dist/internal-debug.js.map +1 -0
- package/dist/loader.d.ts +14 -0
- package/dist/loader.d.ts.map +1 -0
- package/dist/loader.js +20 -0
- package/dist/loader.js.map +1 -0
- package/dist/loader.rsc.d.ts +19 -0
- package/dist/loader.rsc.d.ts.map +1 -0
- package/dist/loader.rsc.js +99 -0
- package/dist/loader.rsc.js.map +1 -0
- package/dist/network-error-thrower.d.ts +17 -0
- package/dist/network-error-thrower.d.ts.map +1 -0
- package/dist/network-error-thrower.js +14 -0
- package/dist/network-error-thrower.js.map +1 -0
- package/dist/outlet-context.d.ts +13 -0
- package/dist/outlet-context.d.ts.map +1 -0
- package/dist/outlet-context.js +3 -0
- package/dist/outlet-context.js.map +1 -0
- package/dist/prerender/__tests__/param-hash.test.d.ts +2 -0
- package/dist/prerender/__tests__/param-hash.test.d.ts.map +1 -0
- package/dist/prerender/__tests__/param-hash.test.js +148 -0
- package/dist/prerender/__tests__/param-hash.test.js.map +1 -0
- package/dist/prerender/param-hash.d.ts +16 -0
- package/dist/prerender/param-hash.d.ts.map +1 -0
- package/dist/prerender/param-hash.js +36 -0
- package/dist/prerender/param-hash.js.map +1 -0
- package/dist/prerender/store.d.ts +38 -0
- package/dist/prerender/store.d.ts.map +1 -0
- package/dist/prerender/store.js +61 -0
- package/dist/prerender/store.js.map +1 -0
- package/dist/prerender.d.ts +66 -0
- package/dist/prerender.d.ts.map +1 -0
- package/dist/prerender.js +57 -0
- package/dist/prerender.js.map +1 -0
- package/dist/reverse.d.ts +196 -0
- package/dist/reverse.d.ts.map +1 -0
- package/dist/reverse.js +78 -0
- package/dist/reverse.js.map +1 -0
- package/dist/root-error-boundary.d.ts +33 -0
- package/dist/root-error-boundary.d.ts.map +1 -0
- package/dist/root-error-boundary.js +165 -0
- package/dist/root-error-boundary.js.map +1 -0
- package/dist/route-content-wrapper.d.ts +46 -0
- package/dist/route-content-wrapper.d.ts.map +1 -0
- package/dist/route-content-wrapper.js +77 -0
- package/dist/route-content-wrapper.js.map +1 -0
- package/dist/route-definition.d.ts +421 -0
- package/dist/route-definition.d.ts.map +1 -0
- package/dist/route-definition.js +868 -0
- package/dist/route-definition.js.map +1 -0
- package/dist/route-map-builder.d.ts +155 -0
- package/dist/route-map-builder.d.ts.map +1 -0
- package/dist/route-map-builder.js +237 -0
- package/dist/route-map-builder.js.map +1 -0
- package/dist/route-types.d.ts +165 -0
- package/dist/route-types.d.ts.map +1 -0
- package/dist/route-types.js +7 -0
- package/dist/route-types.js.map +1 -0
- package/dist/router/__tests__/handler-context.test.d.ts +2 -0
- package/dist/router/__tests__/handler-context.test.d.ts.map +1 -0
- package/dist/router/__tests__/handler-context.test.js +65 -0
- package/dist/router/__tests__/handler-context.test.js.map +1 -0
- package/dist/router/__tests__/loader-cycle-detection.test.d.ts +2 -0
- package/dist/router/__tests__/loader-cycle-detection.test.d.ts.map +1 -0
- package/dist/router/__tests__/loader-cycle-detection.test.js +221 -0
- package/dist/router/__tests__/loader-cycle-detection.test.js.map +1 -0
- package/dist/router/__tests__/match-context.test.d.ts +2 -0
- package/dist/router/__tests__/match-context.test.d.ts.map +1 -0
- package/dist/router/__tests__/match-context.test.js +92 -0
- package/dist/router/__tests__/match-context.test.js.map +1 -0
- package/dist/router/__tests__/match-pipelines.test.d.ts +2 -0
- package/dist/router/__tests__/match-pipelines.test.d.ts.map +1 -0
- package/dist/router/__tests__/match-pipelines.test.js +417 -0
- package/dist/router/__tests__/match-pipelines.test.js.map +1 -0
- package/dist/router/__tests__/match-result.test.d.ts +2 -0
- package/dist/router/__tests__/match-result.test.d.ts.map +1 -0
- package/dist/router/__tests__/match-result.test.js +457 -0
- package/dist/router/__tests__/match-result.test.js.map +1 -0
- package/dist/router/__tests__/on-error.test.d.ts +2 -0
- package/dist/router/__tests__/on-error.test.d.ts.map +1 -0
- package/dist/router/__tests__/on-error.test.js +678 -0
- package/dist/router/__tests__/on-error.test.js.map +1 -0
- package/dist/router/__tests__/pattern-matching.test.d.ts +2 -0
- package/dist/router/__tests__/pattern-matching.test.d.ts.map +1 -0
- package/dist/router/__tests__/pattern-matching.test.js +629 -0
- package/dist/router/__tests__/pattern-matching.test.js.map +1 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts +2 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts.map +1 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.js +155 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.js.map +1 -0
- package/dist/router/error-handling.d.ts +77 -0
- package/dist/router/error-handling.d.ts.map +1 -0
- package/dist/router/error-handling.js +202 -0
- package/dist/router/error-handling.js.map +1 -0
- package/dist/router/handler-context.d.ts +20 -0
- package/dist/router/handler-context.d.ts.map +1 -0
- package/dist/router/handler-context.js +198 -0
- package/dist/router/handler-context.js.map +1 -0
- package/dist/router/intercept-resolution.d.ts +66 -0
- package/dist/router/intercept-resolution.d.ts.map +1 -0
- package/dist/router/intercept-resolution.js +246 -0
- package/dist/router/intercept-resolution.js.map +1 -0
- package/dist/router/loader-resolution.d.ts +64 -0
- package/dist/router/loader-resolution.d.ts.map +1 -0
- package/dist/router/loader-resolution.js +284 -0
- package/dist/router/loader-resolution.js.map +1 -0
- package/dist/router/logging.d.ts +15 -0
- package/dist/router/logging.d.ts.map +1 -0
- package/dist/router/logging.js +99 -0
- package/dist/router/logging.js.map +1 -0
- package/dist/router/manifest.d.ts +22 -0
- package/dist/router/manifest.d.ts.map +1 -0
- package/dist/router/manifest.js +181 -0
- package/dist/router/manifest.js.map +1 -0
- package/dist/router/match-api.d.ts +35 -0
- package/dist/router/match-api.d.ts.map +1 -0
- package/dist/router/match-api.js +406 -0
- package/dist/router/match-api.js.map +1 -0
- package/dist/router/match-context.d.ts +206 -0
- package/dist/router/match-context.d.ts.map +1 -0
- package/dist/router/match-context.js +17 -0
- package/dist/router/match-context.js.map +1 -0
- package/dist/router/match-middleware/background-revalidation.d.ts +127 -0
- package/dist/router/match-middleware/background-revalidation.d.ts.map +1 -0
- package/dist/router/match-middleware/background-revalidation.js +75 -0
- package/dist/router/match-middleware/background-revalidation.js.map +1 -0
- package/dist/router/match-middleware/cache-lookup.d.ts +112 -0
- package/dist/router/match-middleware/cache-lookup.d.ts.map +1 -0
- package/dist/router/match-middleware/cache-lookup.js +257 -0
- package/dist/router/match-middleware/cache-lookup.js.map +1 -0
- package/dist/router/match-middleware/cache-store.d.ts +113 -0
- package/dist/router/match-middleware/cache-store.d.ts.map +1 -0
- package/dist/router/match-middleware/cache-store.js +108 -0
- package/dist/router/match-middleware/cache-store.js.map +1 -0
- package/dist/router/match-middleware/index.d.ts +81 -0
- package/dist/router/match-middleware/index.d.ts.map +1 -0
- package/dist/router/match-middleware/index.js +80 -0
- package/dist/router/match-middleware/index.js.map +1 -0
- package/dist/router/match-middleware/intercept-resolution.d.ts +117 -0
- package/dist/router/match-middleware/intercept-resolution.d.ts.map +1 -0
- package/dist/router/match-middleware/intercept-resolution.js +134 -0
- package/dist/router/match-middleware/intercept-resolution.js.map +1 -0
- package/dist/router/match-middleware/segment-resolution.d.ts +99 -0
- package/dist/router/match-middleware/segment-resolution.d.ts.map +1 -0
- package/dist/router/match-middleware/segment-resolution.js +53 -0
- package/dist/router/match-middleware/segment-resolution.js.map +1 -0
- package/dist/router/match-pipelines.d.ts +147 -0
- package/dist/router/match-pipelines.d.ts.map +1 -0
- package/dist/router/match-pipelines.js +82 -0
- package/dist/router/match-pipelines.js.map +1 -0
- package/dist/router/match-result.d.ts +126 -0
- package/dist/router/match-result.d.ts.map +1 -0
- package/dist/router/match-result.js +93 -0
- package/dist/router/match-result.js.map +1 -0
- package/dist/router/metrics.d.ts +20 -0
- package/dist/router/metrics.d.ts.map +1 -0
- package/dist/router/metrics.js +47 -0
- package/dist/router/metrics.js.map +1 -0
- package/dist/router/middleware.d.ts +249 -0
- package/dist/router/middleware.d.ts.map +1 -0
- package/dist/router/middleware.js +434 -0
- package/dist/router/middleware.js.map +1 -0
- package/dist/router/middleware.test.d.ts +2 -0
- package/dist/router/middleware.test.d.ts.map +1 -0
- package/dist/router/middleware.test.js +816 -0
- package/dist/router/middleware.test.js.map +1 -0
- package/dist/router/pattern-matching.d.ts +149 -0
- package/dist/router/pattern-matching.d.ts.map +1 -0
- package/dist/router/pattern-matching.js +349 -0
- package/dist/router/pattern-matching.js.map +1 -0
- package/dist/router/revalidation.d.ts +44 -0
- package/dist/router/revalidation.d.ts.map +1 -0
- package/dist/router/revalidation.js +147 -0
- package/dist/router/revalidation.js.map +1 -0
- package/dist/router/router-context.d.ts +135 -0
- package/dist/router/router-context.d.ts.map +1 -0
- package/dist/router/router-context.js +36 -0
- package/dist/router/router-context.js.map +1 -0
- package/dist/router/segment-resolution.d.ts +127 -0
- package/dist/router/segment-resolution.d.ts.map +1 -0
- package/dist/router/segment-resolution.js +919 -0
- package/dist/router/segment-resolution.js.map +1 -0
- package/dist/router/trie-matching.d.ts +40 -0
- package/dist/router/trie-matching.d.ts.map +1 -0
- package/dist/router/trie-matching.js +127 -0
- package/dist/router/trie-matching.js.map +1 -0
- package/dist/router/types.d.ts +136 -0
- package/dist/router/types.d.ts.map +1 -0
- package/dist/router/types.js +7 -0
- package/dist/router/types.js.map +1 -0
- package/dist/router.d.ts +753 -0
- package/dist/router.d.ts.map +1 -0
- package/dist/router.gen.d.ts +6 -0
- package/dist/router.gen.d.ts.map +1 -0
- package/dist/router.gen.js +6 -0
- package/dist/router.gen.js.map +1 -0
- package/dist/router.js +1304 -0
- package/dist/router.js.map +1 -0
- package/dist/rsc/__tests__/helpers.test.d.ts +2 -0
- package/dist/rsc/__tests__/helpers.test.d.ts.map +1 -0
- package/dist/rsc/__tests__/helpers.test.js +140 -0
- package/dist/rsc/__tests__/helpers.test.js.map +1 -0
- package/dist/rsc/handler.d.ts +45 -0
- package/dist/rsc/handler.d.ts.map +1 -0
- package/dist/rsc/handler.js +1172 -0
- package/dist/rsc/handler.js.map +1 -0
- package/dist/rsc/helpers.d.ts +16 -0
- package/dist/rsc/helpers.d.ts.map +1 -0
- package/dist/rsc/helpers.js +55 -0
- package/dist/rsc/helpers.js.map +1 -0
- package/dist/rsc/index.d.ts +22 -0
- package/dist/rsc/index.d.ts.map +1 -0
- package/dist/rsc/index.js +23 -0
- package/dist/rsc/index.js.map +1 -0
- package/dist/rsc/nonce.d.ts +9 -0
- package/dist/rsc/nonce.d.ts.map +1 -0
- package/dist/rsc/nonce.js +18 -0
- package/dist/rsc/nonce.js.map +1 -0
- package/dist/rsc/types.d.ts +206 -0
- package/dist/rsc/types.d.ts.map +1 -0
- package/dist/rsc/types.js +8 -0
- package/dist/rsc/types.js.map +1 -0
- package/dist/search-params.d.ts +103 -0
- package/dist/search-params.d.ts.map +1 -0
- package/dist/search-params.js +74 -0
- package/dist/search-params.js.map +1 -0
- package/dist/segment-system.d.ts +75 -0
- package/dist/segment-system.d.ts.map +1 -0
- package/dist/segment-system.js +336 -0
- package/dist/segment-system.js.map +1 -0
- package/dist/server/context.d.ts +245 -0
- package/dist/server/context.d.ts.map +1 -0
- package/dist/server/context.js +197 -0
- package/dist/server/context.js.map +1 -0
- package/dist/server/fetchable-loader-store.d.ts +18 -0
- package/dist/server/fetchable-loader-store.d.ts.map +1 -0
- package/dist/server/fetchable-loader-store.js +18 -0
- package/dist/server/fetchable-loader-store.js.map +1 -0
- package/dist/server/handle-store.d.ts +85 -0
- package/dist/server/handle-store.d.ts.map +1 -0
- package/dist/server/handle-store.js +142 -0
- package/dist/server/handle-store.js.map +1 -0
- package/dist/server/loader-registry.d.ts +55 -0
- package/dist/server/loader-registry.d.ts.map +1 -0
- package/dist/server/loader-registry.js +132 -0
- package/dist/server/loader-registry.js.map +1 -0
- package/dist/server/request-context.d.ts +226 -0
- package/dist/server/request-context.d.ts.map +1 -0
- package/dist/server/request-context.js +290 -0
- package/dist/server/request-context.js.map +1 -0
- package/dist/server/root-layout.d.ts +4 -0
- package/dist/server/root-layout.d.ts.map +1 -0
- package/dist/server/root-layout.js +5 -0
- package/dist/server/root-layout.js.map +1 -0
- package/dist/server.d.ts +15 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +20 -0
- package/dist/server.js.map +1 -0
- package/dist/ssr/__tests__/ssr-handler.test.d.ts +2 -0
- package/dist/ssr/__tests__/ssr-handler.test.d.ts.map +1 -0
- package/dist/ssr/__tests__/ssr-handler.test.js +132 -0
- package/dist/ssr/__tests__/ssr-handler.test.js.map +1 -0
- package/dist/ssr/index.d.ts +98 -0
- package/dist/ssr/index.d.ts.map +1 -0
- package/dist/ssr/index.js +158 -0
- package/dist/ssr/index.js.map +1 -0
- package/dist/static-handler.d.ts +50 -0
- package/dist/static-handler.d.ts.map +1 -0
- package/dist/static-handler.gen.d.ts +5 -0
- package/dist/static-handler.gen.d.ts.map +1 -0
- package/dist/static-handler.gen.js +5 -0
- package/dist/static-handler.gen.js.map +1 -0
- package/dist/static-handler.js +29 -0
- package/dist/static-handler.js.map +1 -0
- package/dist/theme/ThemeProvider.d.ts +20 -0
- package/dist/theme/ThemeProvider.d.ts.map +1 -0
- package/dist/theme/ThemeProvider.js +240 -0
- package/dist/theme/ThemeProvider.js.map +1 -0
- package/dist/theme/ThemeScript.d.ts +48 -0
- package/dist/theme/ThemeScript.d.ts.map +1 -0
- package/dist/theme/ThemeScript.js +13 -0
- package/dist/theme/ThemeScript.js.map +1 -0
- package/dist/theme/__tests__/theme.test.d.ts +2 -0
- package/dist/theme/__tests__/theme.test.d.ts.map +1 -0
- package/dist/theme/__tests__/theme.test.js +103 -0
- package/dist/theme/__tests__/theme.test.js.map +1 -0
- package/dist/theme/constants.d.ts +29 -0
- package/dist/theme/constants.d.ts.map +1 -0
- package/dist/theme/constants.js +48 -0
- package/dist/theme/constants.js.map +1 -0
- package/dist/theme/index.d.ts +31 -0
- package/dist/theme/index.d.ts.map +1 -0
- package/dist/theme/index.js +36 -0
- package/dist/theme/index.js.map +1 -0
- package/dist/theme/theme-context.d.ts +40 -0
- package/dist/theme/theme-context.d.ts.map +1 -0
- package/dist/theme/theme-context.js +60 -0
- package/dist/theme/theme-context.js.map +1 -0
- package/dist/theme/theme-script.d.ts +27 -0
- package/dist/theme/theme-script.d.ts.map +1 -0
- package/dist/theme/theme-script.js +147 -0
- package/dist/theme/theme-script.js.map +1 -0
- package/dist/theme/types.d.ts +163 -0
- package/dist/theme/types.d.ts.map +1 -0
- package/dist/theme/types.js +11 -0
- package/dist/theme/types.js.map +1 -0
- package/dist/theme/use-theme.d.ts +12 -0
- package/dist/theme/use-theme.d.ts.map +1 -0
- package/dist/theme/use-theme.js +40 -0
- package/dist/theme/use-theme.js.map +1 -0
- package/dist/types.d.ts +1479 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +10 -0
- package/dist/types.js.map +1 -0
- package/dist/urls.d.ts +441 -0
- package/dist/urls.d.ts.map +1 -0
- package/dist/urls.gen.d.ts +8 -0
- package/dist/urls.gen.d.ts.map +1 -0
- package/dist/urls.gen.js +8 -0
- package/dist/urls.gen.js.map +1 -0
- package/dist/urls.js +443 -0
- package/dist/urls.js.map +1 -0
- package/dist/use-loader.d.ts +127 -0
- package/dist/use-loader.d.ts.map +1 -0
- package/dist/use-loader.js +237 -0
- package/dist/use-loader.js.map +1 -0
- package/dist/vite/__tests__/ast-handler-extract.test.d.ts +2 -0
- package/dist/vite/__tests__/ast-handler-extract.test.d.ts.map +1 -0
- package/dist/vite/__tests__/ast-handler-extract.test.js +294 -0
- package/dist/vite/__tests__/ast-handler-extract.test.js.map +1 -0
- package/dist/vite/__tests__/expose-id-utils.test.d.ts +2 -0
- package/dist/vite/__tests__/expose-id-utils.test.d.ts.map +1 -0
- package/dist/vite/__tests__/expose-id-utils.test.js +224 -0
- package/dist/vite/__tests__/expose-id-utils.test.js.map +1 -0
- package/dist/vite/__tests__/expose-internal-ids.test.d.ts +2 -0
- package/dist/vite/__tests__/expose-internal-ids.test.d.ts.map +1 -0
- package/dist/vite/__tests__/expose-internal-ids.test.js +647 -0
- package/dist/vite/__tests__/expose-internal-ids.test.js.map +1 -0
- package/dist/vite/__tests__/expose-router-id.test.d.ts +2 -0
- package/dist/vite/__tests__/expose-router-id.test.d.ts.map +1 -0
- package/dist/vite/__tests__/expose-router-id.test.js +39 -0
- package/dist/vite/__tests__/expose-router-id.test.js.map +1 -0
- package/dist/vite/ast-handler-extract.d.ts +49 -0
- package/dist/vite/ast-handler-extract.d.ts.map +1 -0
- package/dist/vite/ast-handler-extract.js +249 -0
- package/dist/vite/ast-handler-extract.js.map +1 -0
- package/dist/vite/expose-action-id.d.ts +19 -0
- package/dist/vite/expose-action-id.d.ts.map +1 -0
- package/dist/vite/expose-action-id.js +250 -0
- package/dist/vite/expose-action-id.js.map +1 -0
- package/dist/vite/expose-id-utils.d.ts +69 -0
- package/dist/vite/expose-id-utils.d.ts.map +1 -0
- package/dist/vite/expose-id-utils.js +289 -0
- package/dist/vite/expose-id-utils.js.map +1 -0
- package/dist/vite/expose-internal-ids.d.ts +22 -0
- package/dist/vite/expose-internal-ids.d.ts.map +1 -0
- package/dist/vite/expose-internal-ids.js +886 -0
- package/dist/vite/expose-internal-ids.js.map +1 -0
- package/dist/vite/index.d.ts +149 -0
- package/dist/vite/index.d.ts.map +1 -0
- package/dist/vite/index.js +5565 -2291
- 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/{src/vite/package-resolution.ts → dist/vite/package-resolution.js} +53 -66
- package/dist/vite/package-resolution.js.map +1 -0
- package/dist/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
- package/dist/vite/virtual-entries.d.ts +25 -0
- package/dist/vite/virtual-entries.d.ts.map +1 -0
- package/{src/vite/virtual-entries.ts → dist/vite/virtual-entries.js} +12 -16
- package/dist/vite/virtual-entries.js.map +1 -0
- package/package.json +64 -56
- package/skills/breadcrumbs/SKILL.md +252 -0
- package/skills/cache-guide/SKILL.md +294 -0
- package/skills/caching/SKILL.md +93 -23
- package/skills/composability/SKILL.md +172 -0
- package/skills/debug-manifest/SKILL.md +12 -8
- package/skills/document-cache/SKILL.md +18 -16
- package/skills/fonts/SKILL.md +6 -4
- package/skills/handler-use/SKILL.md +362 -0
- package/skills/hooks/SKILL.md +341 -71
- package/skills/host-router/SKILL.md +218 -0
- package/skills/intercept/SKILL.md +151 -8
- package/skills/layout/SKILL.md +122 -3
- package/skills/links/SKILL.md +158 -25
- package/skills/loader/SKILL.md +439 -46
- package/skills/middleware/SKILL.md +205 -37
- package/skills/migrate-nextjs/SKILL.md +560 -0
- package/skills/migrate-react-router/SKILL.md +765 -0
- package/skills/mime-routes/SKILL.md +15 -11
- package/skills/parallel/SKILL.md +263 -1
- package/skills/prerender/SKILL.md +467 -65
- package/skills/rango/SKILL.md +87 -21
- package/skills/response-routes/SKILL.md +152 -91
- package/skills/route/SKILL.md +281 -14
- package/skills/router-setup/SKILL.md +210 -32
- package/skills/streams-and-websockets/SKILL.md +283 -0
- package/skills/theme/SKILL.md +9 -8
- package/skills/typesafety/SKILL.md +327 -86
- package/skills/use-cache/SKILL.md +324 -0
- package/src/__internal.ts +102 -4
- package/src/bin/rango.ts +312 -15
- package/src/browser/action-coordinator.ts +97 -0
- package/src/browser/action-response-classifier.ts +99 -0
- package/src/browser/app-shell.ts +52 -0
- package/src/browser/app-version.ts +14 -0
- package/src/browser/event-controller.ts +92 -64
- package/src/browser/history-state.ts +80 -0
- package/src/browser/intercept-utils.ts +52 -0
- package/src/browser/link-interceptor.ts +24 -4
- package/src/browser/logging.ts +55 -0
- package/src/browser/merge-segment-loaders.ts +20 -12
- package/src/browser/navigation-bridge.ts +367 -561
- package/src/browser/navigation-client.ts +228 -70
- package/src/browser/navigation-store.ts +97 -55
- package/src/browser/navigation-transaction.ts +297 -0
- package/src/browser/network-error-handler.ts +61 -0
- package/src/browser/partial-update.ts +362 -316
- package/src/browser/prefetch/cache.ts +314 -0
- package/src/browser/prefetch/fetch.ts +282 -0
- package/src/browser/prefetch/observer.ts +65 -0
- package/src/browser/prefetch/policy.ts +48 -0
- package/src/browser/prefetch/queue.ts +191 -0
- package/src/browser/prefetch/resource-ready.ts +77 -0
- package/src/browser/rango-state.ts +152 -0
- package/src/browser/react/Link.tsx +255 -71
- package/src/browser/react/NavigationProvider.tsx +132 -17
- package/src/browser/react/context.ts +11 -0
- package/src/browser/react/filter-segment-order.ts +11 -0
- package/src/browser/react/index.ts +12 -12
- package/src/browser/react/location-state-shared.ts +95 -53
- package/src/browser/react/location-state.ts +60 -15
- package/src/browser/react/mount-context.ts +6 -1
- package/src/browser/react/nonce-context.ts +23 -0
- package/src/browser/react/shallow-equal.ts +27 -0
- package/src/browser/react/use-action.ts +29 -51
- package/src/browser/react/use-client-cache.ts +5 -3
- package/src/browser/react/use-handle.ts +30 -120
- package/src/browser/react/use-link-status.ts +6 -5
- package/src/browser/react/use-navigation.ts +44 -65
- package/src/browser/react/use-params.ts +75 -0
- package/src/browser/react/use-pathname.ts +47 -0
- package/src/browser/react/use-router.ts +83 -0
- package/src/browser/react/use-search-params.ts +56 -0
- package/src/browser/react/use-segments.ts +80 -97
- package/src/browser/response-adapter.ts +73 -0
- package/src/browser/rsc-router.tsx +246 -64
- package/src/browser/scroll-restoration.ts +127 -52
- package/src/browser/segment-reconciler.ts +243 -0
- package/src/browser/segment-structure-assert.ts +16 -0
- package/src/browser/server-action-bridge.ts +510 -603
- package/src/browser/shallow.ts +6 -1
- package/src/browser/types.ts +152 -48
- package/src/browser/validate-redirect-origin.ts +29 -0
- package/src/build/generate-manifest.ts +84 -23
- package/src/build/generate-route-types.ts +39 -752
- package/src/build/index.ts +6 -5
- package/src/build/route-trie.ts +83 -31
- package/src/build/route-types/ast-helpers.ts +25 -0
- package/src/build/route-types/ast-route-extraction.ts +98 -0
- package/src/build/route-types/codegen.ts +102 -0
- package/src/build/route-types/include-resolution.ts +418 -0
- package/src/build/route-types/param-extraction.ts +48 -0
- package/src/build/route-types/per-module-writer.ts +128 -0
- package/src/build/route-types/router-processing.ts +618 -0
- package/src/build/route-types/scan-filter.ts +85 -0
- package/src/build/runtime-discovery.ts +231 -0
- package/src/cache/background-task.ts +34 -0
- package/src/cache/cache-key-utils.ts +44 -0
- package/src/cache/cache-policy.ts +125 -0
- package/src/cache/cache-runtime.ts +342 -0
- package/src/cache/cache-scope.ts +167 -307
- package/src/cache/cf/cf-cache-store.ts +573 -21
- package/src/cache/cf/index.ts +13 -3
- package/src/cache/document-cache.ts +116 -77
- package/src/cache/handle-capture.ts +81 -0
- package/src/cache/handle-snapshot.ts +41 -0
- package/src/cache/index.ts +1 -15
- package/src/cache/memory-segment-store.ts +191 -13
- package/src/cache/profile-registry.ts +73 -0
- package/src/cache/read-through-swr.ts +134 -0
- package/src/cache/segment-codec.ts +256 -0
- package/src/cache/taint.ts +153 -0
- package/src/cache/types.ts +72 -122
- package/src/client.rsc.tsx +3 -1
- package/src/client.tsx +113 -301
- package/src/component-utils.ts +4 -4
- package/src/components/DefaultDocument.tsx +5 -1
- package/src/context-var.ts +156 -0
- package/src/debug.ts +19 -9
- package/src/errors.ts +77 -7
- package/src/handle.ts +55 -10
- package/src/handles/MetaTags.tsx +73 -20
- package/src/handles/breadcrumbs.ts +66 -0
- package/src/handles/index.ts +1 -0
- package/src/handles/meta.ts +30 -13
- package/src/host/cookie-handler.ts +21 -15
- package/src/host/errors.ts +8 -8
- package/src/host/index.ts +4 -7
- package/src/host/pattern-matcher.ts +27 -27
- package/src/host/router.ts +61 -39
- package/src/host/testing.ts +8 -8
- package/src/host/types.ts +15 -7
- package/src/host/utils.ts +1 -1
- package/src/href-client.ts +65 -45
- package/src/index.rsc.ts +138 -21
- package/src/index.ts +206 -51
- package/src/internal-debug.ts +11 -0
- package/src/loader.rsc.ts +25 -143
- package/src/loader.ts +27 -10
- package/src/network-error-thrower.tsx +3 -1
- package/src/outlet-context.ts +1 -1
- package/src/outlet-provider.tsx +45 -0
- package/src/prerender/param-hash.ts +4 -2
- package/src/prerender/store.ts +159 -13
- package/src/prerender.ts +397 -29
- package/src/response-utils.ts +28 -0
- package/src/reverse.ts +209 -121
- package/src/root-error-boundary.tsx +41 -29
- package/src/route-content-wrapper.tsx +7 -4
- package/src/route-definition/dsl-helpers.ts +1134 -0
- package/src/route-definition/helper-factories.ts +200 -0
- package/src/route-definition/helpers-types.ts +478 -0
- package/src/route-definition/index.ts +55 -0
- package/src/route-definition/redirect.ts +101 -0
- package/src/route-definition/resolve-handler-use.ts +155 -0
- package/src/route-definition.ts +1 -1431
- package/src/route-map-builder.ts +162 -123
- package/src/route-name.ts +53 -0
- package/src/route-types.ts +66 -9
- package/src/router/content-negotiation.ts +215 -0
- package/src/router/debug-manifest.ts +72 -0
- package/src/router/error-handling.ts +9 -9
- package/src/router/find-match.ts +160 -0
- package/src/router/handler-context.ts +455 -86
- package/src/router/intercept-resolution.ts +35 -20
- package/src/router/lazy-includes.ts +237 -0
- package/src/router/loader-resolution.ts +359 -128
- package/src/router/logging.ts +251 -0
- package/src/router/manifest.ts +98 -32
- package/src/router/match-api.ts +195 -261
- package/src/router/match-context.ts +4 -2
- package/src/router/match-handlers.ts +440 -0
- package/src/router/match-middleware/background-revalidation.ts +108 -93
- package/src/router/match-middleware/cache-lookup.ts +415 -86
- package/src/router/match-middleware/cache-store.ts +91 -29
- package/src/router/match-middleware/intercept-resolution.ts +48 -21
- package/src/router/match-middleware/segment-resolution.ts +73 -9
- package/src/router/match-pipelines.ts +10 -45
- package/src/router/match-result.ts +135 -35
- package/src/router/metrics.ts +240 -15
- package/src/router/middleware-cookies.ts +55 -0
- package/src/router/middleware-types.ts +200 -0
- package/src/router/middleware.ts +373 -371
- package/src/router/navigation-snapshot.ts +182 -0
- package/src/router/pattern-matching.ts +251 -44
- package/src/router/prerender-match.ts +502 -0
- package/src/router/preview-match.ts +98 -0
- package/src/router/request-classification.ts +310 -0
- package/src/router/revalidation.ts +137 -38
- package/src/router/route-snapshot.ts +245 -0
- package/src/router/router-context.ts +41 -21
- package/src/router/router-interfaces.ts +484 -0
- package/src/router/router-options.ts +618 -0
- package/src/router/router-registry.ts +24 -0
- package/src/router/segment-resolution/fresh.ts +748 -0
- package/src/router/segment-resolution/helpers.ts +268 -0
- package/src/router/segment-resolution/loader-cache.ts +199 -0
- package/src/router/segment-resolution/revalidation.ts +1379 -0
- package/src/router/segment-resolution/static-store.ts +67 -0
- package/src/router/segment-resolution.ts +21 -1315
- package/src/router/segment-wrappers.ts +291 -0
- package/src/router/telemetry-otel.ts +299 -0
- package/src/router/telemetry.ts +300 -0
- package/src/router/timeout.ts +148 -0
- package/src/router/trie-matching.ts +103 -30
- package/src/router/types.ts +17 -9
- package/src/router/url-params.ts +49 -0
- package/src/router.ts +647 -1988
- package/src/rsc/handler-context.ts +45 -0
- package/src/rsc/handler.ts +864 -1114
- package/src/rsc/helpers.ts +181 -19
- package/src/rsc/index.ts +0 -20
- package/src/rsc/loader-fetch.ts +229 -0
- package/src/rsc/manifest-init.ts +90 -0
- package/src/rsc/nonce.ts +14 -0
- package/src/rsc/origin-guard.ts +141 -0
- package/src/rsc/progressive-enhancement.ts +393 -0
- package/src/rsc/response-error.ts +37 -0
- package/src/rsc/response-route-handler.ts +360 -0
- package/src/rsc/rsc-rendering.ts +253 -0
- package/src/rsc/runtime-warnings.ts +42 -0
- package/src/rsc/server-action.ts +358 -0
- package/src/rsc/ssr-setup.ts +128 -0
- package/src/rsc/types.ts +46 -11
- package/src/search-params.ts +230 -0
- package/src/segment-content-promise.ts +67 -0
- package/src/segment-loader-promise.ts +122 -0
- package/src/segment-system.tsx +134 -36
- package/src/server/context.ts +333 -59
- package/src/server/cookie-store.ts +190 -0
- package/src/server/fetchable-loader-store.ts +37 -0
- package/src/server/handle-store.ts +113 -15
- package/src/server/loader-registry.ts +24 -64
- package/src/server/request-context.ts +603 -109
- package/src/server.ts +35 -155
- package/src/ssr/index.tsx +103 -30
- package/src/static-handler.ts +126 -0
- package/src/theme/ThemeProvider.tsx +21 -15
- package/src/theme/ThemeScript.tsx +5 -5
- package/src/theme/constants.ts +5 -2
- package/src/theme/index.ts +4 -14
- package/src/theme/theme-context.ts +4 -30
- package/src/theme/theme-script.ts +21 -18
- package/src/types/boundaries.ts +158 -0
- package/src/types/cache-types.ts +198 -0
- package/src/types/error-types.ts +192 -0
- package/src/types/global-namespace.ts +100 -0
- package/src/types/handler-context.ts +759 -0
- package/src/types/index.ts +88 -0
- package/src/types/loader-types.ts +209 -0
- package/src/types/request-scope.ts +126 -0
- package/src/types/route-config.ts +170 -0
- package/src/types/route-entry.ts +120 -0
- package/src/types/segments.ts +150 -0
- package/src/types.ts +1 -1757
- package/src/urls/include-helper.ts +207 -0
- package/src/urls/index.ts +53 -0
- package/src/urls/path-helper-types.ts +372 -0
- package/src/urls/path-helper.ts +364 -0
- package/src/urls/pattern-types.ts +107 -0
- package/src/urls/response-types.ts +108 -0
- package/src/urls/type-extraction.ts +372 -0
- package/src/urls/urls-function.ts +98 -0
- package/src/urls.ts +1 -1282
- package/src/use-loader.tsx +161 -81
- package/src/vite/debug.ts +184 -0
- package/src/vite/discovery/bundle-postprocess.ts +181 -0
- package/src/vite/discovery/discover-routers.ts +376 -0
- package/src/vite/discovery/prerender-collection.ts +486 -0
- package/src/vite/discovery/route-types-writer.ts +258 -0
- package/src/vite/discovery/self-gen-tracking.ts +47 -0
- package/src/vite/discovery/state.ts +117 -0
- package/src/vite/discovery/virtual-module-codegen.ts +203 -0
- package/src/vite/index.ts +15 -1963
- package/src/vite/plugin-types.ts +103 -0
- package/src/vite/plugins/cjs-to-esm.ts +98 -0
- package/src/vite/plugins/client-ref-dedup.ts +131 -0
- package/src/vite/plugins/client-ref-hashing.ts +117 -0
- package/src/vite/plugins/cloudflare-protocol-loader-hook.d.mts +23 -0
- package/src/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
- package/src/vite/plugins/cloudflare-protocol-stub.ts +214 -0
- package/src/vite/{expose-action-id.ts → plugins/expose-action-id.ts} +107 -64
- package/src/vite/plugins/expose-id-utils.ts +299 -0
- package/src/vite/plugins/expose-ids/export-analysis.ts +296 -0
- package/src/vite/plugins/expose-ids/handler-transform.ts +209 -0
- package/src/vite/plugins/expose-ids/loader-transform.ts +74 -0
- package/src/vite/plugins/expose-ids/router-transform.ts +127 -0
- package/src/vite/plugins/expose-ids/types.ts +45 -0
- package/src/vite/plugins/expose-internal-ids.ts +816 -0
- package/src/vite/plugins/performance-tracks.ts +96 -0
- package/src/vite/plugins/refresh-cmd.ts +127 -0
- package/src/vite/plugins/use-cache-transform.ts +336 -0
- package/src/vite/plugins/version-injector.ts +83 -0
- package/src/vite/plugins/version-plugin.ts +266 -0
- package/src/vite/plugins/virtual-entries.ts +123 -0
- package/src/vite/plugins/virtual-stub-plugin.ts +29 -0
- package/src/vite/rango.ts +497 -0
- package/src/vite/router-discovery.ts +1111 -0
- package/src/vite/utils/ast-handler-extract.ts +517 -0
- package/src/vite/utils/banner.ts +36 -0
- package/src/vite/utils/bundle-analysis.ts +137 -0
- package/src/vite/utils/manifest-utils.ts +70 -0
- package/src/vite/utils/package-resolution.ts +161 -0
- package/src/vite/utils/prerender-utils.ts +221 -0
- package/src/vite/utils/shared-utils.ts +170 -0
- package/CLAUDE.md +0 -43
- package/src/browser/lru-cache.ts +0 -69
- package/src/browser/request-controller.ts +0 -164
- package/src/cache/memory-store.ts +0 -253
- package/src/router.gen.ts +0 -6
- package/src/urls.gen.ts +0 -8
- package/src/vite/expose-handle-id.ts +0 -209
- package/src/vite/expose-loader-id.ts +0 -426
- package/src/vite/expose-location-state-id.ts +0 -177
- package/src/vite/expose-prerender-handler-id.ts +0 -429
- /package/src/vite/{version.d.ts → plugins/version.d.ts} +0 -0
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/// <reference path="../../vite/version.d.ts" />
|
|
1
|
+
/// <reference path="../../vite/plugins/version.d.ts" />
|
|
2
2
|
|
|
3
3
|
// Extend CacheStorage with Cloudflare's default cache property
|
|
4
4
|
declare global {
|
|
@@ -10,14 +10,21 @@ declare global {
|
|
|
10
10
|
/**
|
|
11
11
|
* Cloudflare Edge Cache Store
|
|
12
12
|
*
|
|
13
|
-
* Production cache store using Cloudflare's Cache API
|
|
14
|
-
*
|
|
13
|
+
* Production cache store using Cloudflare's Cache API (L1) with optional
|
|
14
|
+
* KV persistence (L2).
|
|
15
|
+
*
|
|
16
|
+
* L1 (Cache API): Per-colo, fast, ephemeral. Handles SWR atomically.
|
|
17
|
+
* L2 (KV): Global, persistent, ~50ms reads. Auto-warms cold colos.
|
|
18
|
+
*
|
|
19
|
+
* Read flow: L1 hit → serve | L1 miss → L2 hit → serve + promote to L1 | both miss → render
|
|
20
|
+
* Write flow: L1 write + L2 write (both via waitUntil)
|
|
15
21
|
*
|
|
16
22
|
* Features:
|
|
17
23
|
* - Extended TTL for SWR window (max-age = ttl + swr)
|
|
18
24
|
* - Staleness via x-edge-cache-stale-at header
|
|
19
|
-
* - Atomic REVALIDATING status for thundering herd prevention
|
|
25
|
+
* - Atomic REVALIDATING status for thundering herd prevention (L1 only)
|
|
20
26
|
* - Non-blocking writes via waitUntil
|
|
27
|
+
* - KV L2 for cross-colo cache persistence
|
|
21
28
|
*/
|
|
22
29
|
|
|
23
30
|
import type {
|
|
@@ -25,12 +32,19 @@ import type {
|
|
|
25
32
|
CachedEntryData,
|
|
26
33
|
CacheDefaults,
|
|
27
34
|
CacheGetResult,
|
|
35
|
+
CacheItemResult,
|
|
36
|
+
CacheItemOptions,
|
|
28
37
|
} from "../types.js";
|
|
29
38
|
import {
|
|
30
|
-
|
|
39
|
+
_getRequestContext,
|
|
31
40
|
type RequestContext,
|
|
32
41
|
} from "../../server/request-context.js";
|
|
33
42
|
import { VERSION } from "@rangojs/router:version";
|
|
43
|
+
import {
|
|
44
|
+
resolveTtl,
|
|
45
|
+
resolveSwrWindow,
|
|
46
|
+
DEFAULT_FUNCTION_TTL,
|
|
47
|
+
} from "../cache-policy.js";
|
|
34
48
|
|
|
35
49
|
// ============================================================================
|
|
36
50
|
// Constants
|
|
@@ -53,12 +67,71 @@ export const MAX_REVALIDATION_INTERVAL = 30;
|
|
|
53
67
|
// Types
|
|
54
68
|
// ============================================================================
|
|
55
69
|
|
|
70
|
+
// Re-exported from the canonical home so cf-cache-store consumers keep
|
|
71
|
+
// importing `ExecutionContext` from this module without a second interface
|
|
72
|
+
// drifting over time.
|
|
73
|
+
export type { ExecutionContext } from "../../types/request-scope.js";
|
|
74
|
+
import type { ExecutionContext } from "../../types/request-scope.js";
|
|
75
|
+
|
|
56
76
|
/**
|
|
57
|
-
* Cloudflare
|
|
77
|
+
* Minimal Cloudflare KV Namespace interface.
|
|
78
|
+
* Avoids hard dependency on @cloudflare/workers-types.
|
|
79
|
+
*/
|
|
80
|
+
export interface KVNamespace {
|
|
81
|
+
get(key: string, options?: { type?: string }): Promise<any>;
|
|
82
|
+
put(
|
|
83
|
+
key: string,
|
|
84
|
+
value: string,
|
|
85
|
+
options?: { expirationTtl?: number },
|
|
86
|
+
): Promise<void>;
|
|
87
|
+
delete(key: string): Promise<void>;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* KV envelope for segment cache entries.
|
|
92
|
+
* @internal
|
|
93
|
+
*/
|
|
94
|
+
interface KVSegmentEnvelope {
|
|
95
|
+
/** Cached segment data */
|
|
96
|
+
d: CachedEntryData;
|
|
97
|
+
/** When entry becomes stale (ms epoch) */
|
|
98
|
+
s: number;
|
|
99
|
+
/** When entry hard-expires (ms epoch) */
|
|
100
|
+
e: number;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* KV envelope for function cache entries ("use cache").
|
|
105
|
+
* @internal
|
|
58
106
|
*/
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
107
|
+
interface KVItemEnvelope {
|
|
108
|
+
/** RSC-serialized return value */
|
|
109
|
+
v: string;
|
|
110
|
+
/** Handle data */
|
|
111
|
+
h?: Record<string, Record<string, unknown[]>>;
|
|
112
|
+
/** When entry becomes stale (ms epoch) */
|
|
113
|
+
s: number;
|
|
114
|
+
/** When entry hard-expires (ms epoch) */
|
|
115
|
+
e: number;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* KV envelope for document cache entries.
|
|
120
|
+
* @internal
|
|
121
|
+
*/
|
|
122
|
+
interface KVResponseEnvelope {
|
|
123
|
+
/** Response body as base64-encoded string (safe for binary payloads) */
|
|
124
|
+
b: string;
|
|
125
|
+
/** HTTP status code */
|
|
126
|
+
st: number;
|
|
127
|
+
/** HTTP status text */
|
|
128
|
+
stx: string;
|
|
129
|
+
/** Serialized headers as key-value pairs */
|
|
130
|
+
hd: [string, string][];
|
|
131
|
+
/** When entry becomes stale (ms epoch) */
|
|
132
|
+
s: number;
|
|
133
|
+
/** When entry hard-expires (ms epoch) */
|
|
134
|
+
e: number;
|
|
62
135
|
}
|
|
63
136
|
|
|
64
137
|
export interface CFCacheStoreOptions<TEnv = unknown> {
|
|
@@ -91,6 +164,20 @@ export interface CFCacheStoreOptions<TEnv = unknown> {
|
|
|
91
164
|
*/
|
|
92
165
|
ctx: ExecutionContext;
|
|
93
166
|
|
|
167
|
+
/**
|
|
168
|
+
* Optional KV namespace for L2 cache persistence.
|
|
169
|
+
*
|
|
170
|
+
* When provided, KV acts as a global fallback behind the per-colo Cache API.
|
|
171
|
+
* On L1 miss, KV is checked and hits are promoted back to L1.
|
|
172
|
+
* On writes, data is persisted to both L1 and KV.
|
|
173
|
+
*
|
|
174
|
+
* @example
|
|
175
|
+
* ```typescript
|
|
176
|
+
* new CFCacheStore({ ctx: env.ctx, kv: env.CACHE_KV })
|
|
177
|
+
* ```
|
|
178
|
+
*/
|
|
179
|
+
kv?: KVNamespace;
|
|
180
|
+
|
|
94
181
|
/**
|
|
95
182
|
* Cache version string override. When this changes, all cached entries are
|
|
96
183
|
* effectively invalidated (new keys won't match old entries).
|
|
@@ -124,7 +211,7 @@ export interface CFCacheStoreOptions<TEnv = unknown> {
|
|
|
124
211
|
* @example Using cookies for locale-aware caching
|
|
125
212
|
* ```typescript
|
|
126
213
|
* keyGenerator: (ctx, defaultKey) => {
|
|
127
|
-
* const locale =
|
|
214
|
+
* const locale = cookies().get('locale')?.value || 'en';
|
|
128
215
|
* return `${locale}:${defaultKey}`;
|
|
129
216
|
* }
|
|
130
217
|
* ```
|
|
@@ -156,6 +243,7 @@ export class CFCacheStore<TEnv = unknown> implements SegmentCacheStore<TEnv> {
|
|
|
156
243
|
private readonly baseUrl: string;
|
|
157
244
|
private readonly waitUntil?: (fn: () => Promise<void>) => void;
|
|
158
245
|
private readonly version?: string;
|
|
246
|
+
private readonly kv?: KVNamespace;
|
|
159
247
|
|
|
160
248
|
constructor(options: CFCacheStoreOptions<TEnv>) {
|
|
161
249
|
if (!options.ctx) {
|
|
@@ -172,17 +260,18 @@ export class CFCacheStore<TEnv = unknown> implements SegmentCacheStore<TEnv> {
|
|
|
172
260
|
this.version = options.version ?? VERSION;
|
|
173
261
|
this.keyGenerator = options.keyGenerator;
|
|
174
262
|
this.waitUntil = (fn) => options.ctx.waitUntil(fn());
|
|
263
|
+
this.kv = options.kv;
|
|
175
264
|
}
|
|
176
265
|
|
|
177
266
|
/**
|
|
178
267
|
* Derive base URL from request hostname via requestContext.
|
|
179
|
-
* Uses internal fallback for dev/preview environments.
|
|
268
|
+
* Uses internal fallback for dev/preview environments and untrusted hostnames.
|
|
180
269
|
* @internal
|
|
181
270
|
*/
|
|
182
271
|
private deriveBaseUrl(): string {
|
|
183
272
|
const fallback = "https://rsc-cache.internal.com/";
|
|
184
273
|
|
|
185
|
-
const ctx =
|
|
274
|
+
const ctx = _getRequestContext();
|
|
186
275
|
if (!ctx?.request) {
|
|
187
276
|
return fallback;
|
|
188
277
|
}
|
|
@@ -201,6 +290,12 @@ export class CFCacheStore<TEnv = unknown> implements SegmentCacheStore<TEnv> {
|
|
|
201
290
|
return fallback;
|
|
202
291
|
}
|
|
203
292
|
|
|
293
|
+
// Validate hostname: must be a valid domain (alphanumeric, hyphens, dots)
|
|
294
|
+
// to prevent host header injection into cache keys
|
|
295
|
+
if (!/^[a-zA-Z0-9.-]+$/.test(hostname) || hostname.length > 253) {
|
|
296
|
+
return fallback;
|
|
297
|
+
}
|
|
298
|
+
|
|
204
299
|
// Use actual hostname for production
|
|
205
300
|
return `https://${hostname}/`;
|
|
206
301
|
} catch {
|
|
@@ -219,6 +314,10 @@ export class CFCacheStore<TEnv = unknown> implements SegmentCacheStore<TEnv> {
|
|
|
219
314
|
return caches.default;
|
|
220
315
|
}
|
|
221
316
|
|
|
317
|
+
// ============================================================================
|
|
318
|
+
// Segment Cache Methods
|
|
319
|
+
// ============================================================================
|
|
320
|
+
|
|
222
321
|
/**
|
|
223
322
|
* Get cached entry data by key.
|
|
224
323
|
*
|
|
@@ -227,7 +326,8 @@ export class CFCacheStore<TEnv = unknown> implements SegmentCacheStore<TEnv> {
|
|
|
227
326
|
* - If already REVALIDATING (and recent), returns shouldRevalidate: false
|
|
228
327
|
* - If fresh, returns shouldRevalidate: false
|
|
229
328
|
*
|
|
230
|
-
*
|
|
329
|
+
* On L1 miss, falls back to KV (L2) if configured.
|
|
330
|
+
* KV hits are promoted to L1 in the background.
|
|
231
331
|
*/
|
|
232
332
|
async get(key: string): Promise<CacheGetResult | null> {
|
|
233
333
|
try {
|
|
@@ -236,7 +336,7 @@ export class CFCacheStore<TEnv = unknown> implements SegmentCacheStore<TEnv> {
|
|
|
236
336
|
const response = await cache.match(request);
|
|
237
337
|
|
|
238
338
|
if (!response) {
|
|
239
|
-
return
|
|
339
|
+
return this.kvGetSegment(key);
|
|
240
340
|
}
|
|
241
341
|
|
|
242
342
|
// Read status headers
|
|
@@ -279,6 +379,7 @@ export class CFCacheStore<TEnv = unknown> implements SegmentCacheStore<TEnv> {
|
|
|
279
379
|
/**
|
|
280
380
|
* Store entry data with TTL and optional SWR window.
|
|
281
381
|
* Uses waitUntil for non-blocking write when available.
|
|
382
|
+
* When KV is configured, also persists to L2.
|
|
282
383
|
*/
|
|
283
384
|
async set(
|
|
284
385
|
key: string,
|
|
@@ -291,11 +392,12 @@ export class CFCacheStore<TEnv = unknown> implements SegmentCacheStore<TEnv> {
|
|
|
291
392
|
const request = this.keyToRequest(key);
|
|
292
393
|
|
|
293
394
|
// Extended TTL covers SWR window
|
|
294
|
-
const swrWindow = swr
|
|
395
|
+
const swrWindow = resolveSwrWindow(swr, this.defaults);
|
|
295
396
|
const totalTtl = ttl + swrWindow;
|
|
296
397
|
const staleAt = Date.now() + ttl * 1000;
|
|
297
398
|
|
|
298
|
-
const
|
|
399
|
+
const body = JSON.stringify(data);
|
|
400
|
+
const response = new Response(body, {
|
|
299
401
|
headers: {
|
|
300
402
|
"Content-Type": "application/json",
|
|
301
403
|
"Cache-Control": `public, max-age=${totalTtl}`,
|
|
@@ -315,18 +417,35 @@ export class CFCacheStore<TEnv = unknown> implements SegmentCacheStore<TEnv> {
|
|
|
315
417
|
// Blocking fallback
|
|
316
418
|
await putPromise;
|
|
317
419
|
}
|
|
420
|
+
|
|
421
|
+
// L2: persist to KV
|
|
422
|
+
this.kvSetSegment(key, data, staleAt, totalTtl);
|
|
318
423
|
} catch (error) {
|
|
319
424
|
console.error("[CFCacheStore] set failed:", error);
|
|
320
425
|
}
|
|
321
426
|
}
|
|
322
427
|
|
|
323
428
|
/**
|
|
324
|
-
* Delete a cached entry
|
|
429
|
+
* Delete a cached entry from L1 and L2.
|
|
325
430
|
*/
|
|
326
431
|
async delete(key: string): Promise<boolean> {
|
|
327
432
|
try {
|
|
328
433
|
const cache = await this.getCache();
|
|
329
|
-
|
|
434
|
+
const result = await cache.delete(this.keyToRequest(key));
|
|
435
|
+
|
|
436
|
+
// L2: delete from KV
|
|
437
|
+
if (this.kv && this.waitUntil) {
|
|
438
|
+
const kvKey = this.toKVKey(key);
|
|
439
|
+
this.waitUntil(async () => {
|
|
440
|
+
try {
|
|
441
|
+
await this.kv!.delete(kvKey);
|
|
442
|
+
} catch {
|
|
443
|
+
// KV delete failures are non-critical
|
|
444
|
+
}
|
|
445
|
+
});
|
|
446
|
+
}
|
|
447
|
+
|
|
448
|
+
return result;
|
|
330
449
|
} catch (error) {
|
|
331
450
|
console.error("[CFCacheStore] delete failed:", error);
|
|
332
451
|
return false;
|
|
@@ -340,6 +459,7 @@ export class CFCacheStore<TEnv = unknown> implements SegmentCacheStore<TEnv> {
|
|
|
340
459
|
/**
|
|
341
460
|
* Get a cached Response by key (for document-level caching).
|
|
342
461
|
* Returns the response and whether it should be revalidated (SWR).
|
|
462
|
+
* Falls back to KV (L2) on L1 miss.
|
|
343
463
|
*/
|
|
344
464
|
async getResponse(
|
|
345
465
|
key: string,
|
|
@@ -350,7 +470,7 @@ export class CFCacheStore<TEnv = unknown> implements SegmentCacheStore<TEnv> {
|
|
|
350
470
|
const response = await cache.match(request);
|
|
351
471
|
|
|
352
472
|
if (!response || response.status !== 200) {
|
|
353
|
-
return
|
|
473
|
+
return this.kvGetResponse(key);
|
|
354
474
|
}
|
|
355
475
|
|
|
356
476
|
// Check staleness
|
|
@@ -369,6 +489,7 @@ export class CFCacheStore<TEnv = unknown> implements SegmentCacheStore<TEnv> {
|
|
|
369
489
|
|
|
370
490
|
/**
|
|
371
491
|
* Store a Response with TTL and optional SWR window (for document-level caching).
|
|
492
|
+
* When KV is configured, also persists to L2.
|
|
372
493
|
*/
|
|
373
494
|
async putResponse(
|
|
374
495
|
key: string,
|
|
@@ -381,16 +502,23 @@ export class CFCacheStore<TEnv = unknown> implements SegmentCacheStore<TEnv> {
|
|
|
381
502
|
const request = this.keyToRequest(`doc:${key}`);
|
|
382
503
|
|
|
383
504
|
// Extended TTL covers SWR window
|
|
384
|
-
const swrWindow = swr
|
|
505
|
+
const swrWindow = resolveSwrWindow(swr, this.defaults);
|
|
385
506
|
const totalTtl = ttl + swrWindow;
|
|
386
507
|
const staleAt = Date.now() + ttl * 1000;
|
|
387
508
|
|
|
509
|
+
// Clone body for potential KV write before consuming it for L1
|
|
510
|
+
const [l1Body, kvBody] = this.kv
|
|
511
|
+
? response.body
|
|
512
|
+
? response.body.tee()
|
|
513
|
+
: [null, null]
|
|
514
|
+
: [response.body, null];
|
|
515
|
+
|
|
388
516
|
// Clone and add cache headers
|
|
389
517
|
const headers = new Headers(response.headers);
|
|
390
518
|
headers.set("Cache-Control", `public, max-age=${totalTtl}`);
|
|
391
519
|
headers.set(CACHE_STALE_AT_HEADER, String(staleAt));
|
|
392
520
|
|
|
393
|
-
const toCache = new Response(
|
|
521
|
+
const toCache = new Response(l1Body, {
|
|
394
522
|
status: response.status,
|
|
395
523
|
statusText: response.statusText,
|
|
396
524
|
headers,
|
|
@@ -407,11 +535,166 @@ export class CFCacheStore<TEnv = unknown> implements SegmentCacheStore<TEnv> {
|
|
|
407
535
|
// Blocking fallback
|
|
408
536
|
await putPromise;
|
|
409
537
|
}
|
|
538
|
+
|
|
539
|
+
// L2: persist to KV (KV requires expirationTtl >= 60s)
|
|
540
|
+
if (this.kv && this.waitUntil && totalTtl >= 60) {
|
|
541
|
+
const kvKey = this.toKVKey(`doc:${key}`);
|
|
542
|
+
const headersArray: [string, string][] = [];
|
|
543
|
+
response.headers.forEach((v, k) => headersArray.push([k, v]));
|
|
544
|
+
// Read body as ArrayBuffer and encode to base64 to preserve binary payloads
|
|
545
|
+
const bodyBuf = kvBody
|
|
546
|
+
? await new Response(kvBody).arrayBuffer()
|
|
547
|
+
: new ArrayBuffer(0);
|
|
548
|
+
const bodyBase64 = bufferToBase64(bodyBuf);
|
|
549
|
+
|
|
550
|
+
this.waitUntil(async () => {
|
|
551
|
+
try {
|
|
552
|
+
const envelope: KVResponseEnvelope = {
|
|
553
|
+
b: bodyBase64,
|
|
554
|
+
st: response.status,
|
|
555
|
+
stx: response.statusText,
|
|
556
|
+
hd: headersArray,
|
|
557
|
+
s: staleAt,
|
|
558
|
+
e: staleAt + swrWindow * 1000,
|
|
559
|
+
};
|
|
560
|
+
await this.kv!.put(kvKey, JSON.stringify(envelope), {
|
|
561
|
+
expirationTtl: totalTtl,
|
|
562
|
+
});
|
|
563
|
+
} catch (error) {
|
|
564
|
+
console.error("[CFCacheStore] KV putResponse failed:", error);
|
|
565
|
+
}
|
|
566
|
+
});
|
|
567
|
+
}
|
|
410
568
|
} catch (error) {
|
|
411
569
|
console.error("[CFCacheStore] putResponse failed:", error);
|
|
412
570
|
}
|
|
413
571
|
}
|
|
414
572
|
|
|
573
|
+
// ============================================================================
|
|
574
|
+
// Function Cache Methods (for "use cache" directive)
|
|
575
|
+
// ============================================================================
|
|
576
|
+
|
|
577
|
+
/**
|
|
578
|
+
* Get a cached function result by key.
|
|
579
|
+
* Follows the same SWR pattern as get() for segment caching.
|
|
580
|
+
* Falls back to KV (L2) on L1 miss.
|
|
581
|
+
*/
|
|
582
|
+
async getItem(key: string): Promise<CacheItemResult | null> {
|
|
583
|
+
try {
|
|
584
|
+
const cache = await this.getCache();
|
|
585
|
+
const request = this.keyToRequest(`fn:${key}`);
|
|
586
|
+
const response = await cache.match(request);
|
|
587
|
+
|
|
588
|
+
if (!response) return this.kvGetItem(key);
|
|
589
|
+
|
|
590
|
+
const staleAt = Number(
|
|
591
|
+
response.headers.get(CACHE_STALE_AT_HEADER) ?? "0",
|
|
592
|
+
);
|
|
593
|
+
const status = response.headers.get(CACHE_STATUS_HEADER);
|
|
594
|
+
const age = Number(response.headers.get("age") ?? "0");
|
|
595
|
+
|
|
596
|
+
const isStale = staleAt > 0 && Date.now() > staleAt;
|
|
597
|
+
const isRevalidating =
|
|
598
|
+
status === "REVALIDATING" && age < MAX_REVALIDATION_INTERVAL;
|
|
599
|
+
|
|
600
|
+
const data = (await response.json()) as {
|
|
601
|
+
value: string;
|
|
602
|
+
handles?: Record<string, Record<string, unknown[]>>;
|
|
603
|
+
};
|
|
604
|
+
|
|
605
|
+
if (!isStale || isRevalidating) {
|
|
606
|
+
return {
|
|
607
|
+
value: data.value,
|
|
608
|
+
handles: data.handles,
|
|
609
|
+
shouldRevalidate: false,
|
|
610
|
+
};
|
|
611
|
+
}
|
|
612
|
+
|
|
613
|
+
// Stale and needs revalidation — mark REVALIDATING atomically
|
|
614
|
+
const headers = new Headers(response.headers);
|
|
615
|
+
headers.set(CACHE_STATUS_HEADER, "REVALIDATING");
|
|
616
|
+
await cache.put(
|
|
617
|
+
request,
|
|
618
|
+
new Response(JSON.stringify(data), { status: 200, headers }),
|
|
619
|
+
);
|
|
620
|
+
|
|
621
|
+
return {
|
|
622
|
+
value: data.value,
|
|
623
|
+
handles: data.handles,
|
|
624
|
+
shouldRevalidate: true,
|
|
625
|
+
};
|
|
626
|
+
} catch (error) {
|
|
627
|
+
console.error("[CFCacheStore] getItem failed:", error);
|
|
628
|
+
return null;
|
|
629
|
+
}
|
|
630
|
+
}
|
|
631
|
+
|
|
632
|
+
/**
|
|
633
|
+
* Store a function result with TTL and optional SWR window.
|
|
634
|
+
* When KV is configured, also persists to L2.
|
|
635
|
+
*/
|
|
636
|
+
async setItem(
|
|
637
|
+
key: string,
|
|
638
|
+
value: string,
|
|
639
|
+
options?: CacheItemOptions,
|
|
640
|
+
): Promise<void> {
|
|
641
|
+
try {
|
|
642
|
+
const cache = await this.getCache();
|
|
643
|
+
const request = this.keyToRequest(`fn:${key}`);
|
|
644
|
+
|
|
645
|
+
const ttl = resolveTtl(options?.ttl, this.defaults, DEFAULT_FUNCTION_TTL);
|
|
646
|
+
const swrWindow = resolveSwrWindow(options?.swr, this.defaults);
|
|
647
|
+
const totalTtl = ttl + swrWindow;
|
|
648
|
+
const staleAt = Date.now() + ttl * 1000;
|
|
649
|
+
|
|
650
|
+
const body = JSON.stringify({ value, handles: options?.handles });
|
|
651
|
+
const response = new Response(body, {
|
|
652
|
+
headers: {
|
|
653
|
+
"Content-Type": "application/json",
|
|
654
|
+
"Cache-Control": `public, max-age=${totalTtl}`,
|
|
655
|
+
[CACHE_STALE_AT_HEADER]: String(staleAt),
|
|
656
|
+
[CACHE_STATUS_HEADER]: "HIT",
|
|
657
|
+
},
|
|
658
|
+
});
|
|
659
|
+
|
|
660
|
+
const putPromise = cache.put(request, response);
|
|
661
|
+
|
|
662
|
+
if (this.waitUntil) {
|
|
663
|
+
this.waitUntil(async () => {
|
|
664
|
+
await putPromise;
|
|
665
|
+
});
|
|
666
|
+
} else {
|
|
667
|
+
await putPromise;
|
|
668
|
+
}
|
|
669
|
+
|
|
670
|
+
// L2: persist to KV (KV requires expirationTtl >= 60s)
|
|
671
|
+
if (this.kv && this.waitUntil && totalTtl >= 60) {
|
|
672
|
+
const kvKey = this.toKVKey(`fn:${key}`);
|
|
673
|
+
this.waitUntil(async () => {
|
|
674
|
+
try {
|
|
675
|
+
const envelope: KVItemEnvelope = {
|
|
676
|
+
v: value,
|
|
677
|
+
h: options?.handles,
|
|
678
|
+
s: staleAt,
|
|
679
|
+
e: staleAt + swrWindow * 1000,
|
|
680
|
+
};
|
|
681
|
+
await this.kv!.put(kvKey, JSON.stringify(envelope), {
|
|
682
|
+
expirationTtl: totalTtl,
|
|
683
|
+
});
|
|
684
|
+
} catch (error) {
|
|
685
|
+
console.error("[CFCacheStore] KV setItem failed:", error);
|
|
686
|
+
}
|
|
687
|
+
});
|
|
688
|
+
}
|
|
689
|
+
} catch (error) {
|
|
690
|
+
console.error("[CFCacheStore] setItem failed:", error);
|
|
691
|
+
}
|
|
692
|
+
}
|
|
693
|
+
|
|
694
|
+
// ============================================================================
|
|
695
|
+
// Key Helpers
|
|
696
|
+
// ============================================================================
|
|
697
|
+
|
|
415
698
|
/**
|
|
416
699
|
* Convert string key to Request object for CF Cache API.
|
|
417
700
|
* Includes version in URL if specified (for cache invalidation on code changes).
|
|
@@ -425,4 +708,273 @@ export class CFCacheStore<TEnv = unknown> implements SegmentCacheStore<TEnv> {
|
|
|
425
708
|
method: "GET",
|
|
426
709
|
});
|
|
427
710
|
}
|
|
711
|
+
|
|
712
|
+
/**
|
|
713
|
+
* Convert string key to KV key string.
|
|
714
|
+
* Uses same version prefix as Cache API for consistent invalidation.
|
|
715
|
+
* @internal
|
|
716
|
+
*/
|
|
717
|
+
private toKVKey(key: string): string {
|
|
718
|
+
const versionPath = this.version ? `v/${this.version}/` : "";
|
|
719
|
+
return `${versionPath}${key}`;
|
|
720
|
+
}
|
|
721
|
+
|
|
722
|
+
// ============================================================================
|
|
723
|
+
// KV L2 Helpers
|
|
724
|
+
// ============================================================================
|
|
725
|
+
|
|
726
|
+
/**
|
|
727
|
+
* KV fallback for segment cache reads.
|
|
728
|
+
* Returns null if KV is not configured, entry is missing, or expired.
|
|
729
|
+
* Promotes hits to L1 via waitUntil.
|
|
730
|
+
* @internal
|
|
731
|
+
*/
|
|
732
|
+
private async kvGetSegment(key: string): Promise<CacheGetResult | null> {
|
|
733
|
+
if (!this.kv) return null;
|
|
734
|
+
|
|
735
|
+
try {
|
|
736
|
+
const kvKey = this.toKVKey(key);
|
|
737
|
+
const raw = await this.kv.get(kvKey, { type: "json" });
|
|
738
|
+
if (!raw) return null;
|
|
739
|
+
|
|
740
|
+
const envelope = raw as KVSegmentEnvelope;
|
|
741
|
+
const now = Date.now();
|
|
742
|
+
|
|
743
|
+
// Hard-expired — treat as miss
|
|
744
|
+
if (now > envelope.e) return null;
|
|
745
|
+
|
|
746
|
+
const shouldRevalidate = now > envelope.s;
|
|
747
|
+
|
|
748
|
+
// Promote to L1 in background
|
|
749
|
+
this.promoteSegmentToL1(key, envelope);
|
|
750
|
+
|
|
751
|
+
return { data: envelope.d, shouldRevalidate };
|
|
752
|
+
} catch (error) {
|
|
753
|
+
console.error("[CFCacheStore] KV get failed:", error);
|
|
754
|
+
return null;
|
|
755
|
+
}
|
|
756
|
+
}
|
|
757
|
+
|
|
758
|
+
/**
|
|
759
|
+
* Write segment data to KV.
|
|
760
|
+
* @internal
|
|
761
|
+
*/
|
|
762
|
+
private kvSetSegment(
|
|
763
|
+
key: string,
|
|
764
|
+
data: CachedEntryData,
|
|
765
|
+
staleAt: number,
|
|
766
|
+
totalTtl: number,
|
|
767
|
+
): void {
|
|
768
|
+
// KV requires expirationTtl >= 60s. Skip write for short-lived entries.
|
|
769
|
+
if (!this.kv || !this.waitUntil || totalTtl < 60) return;
|
|
770
|
+
|
|
771
|
+
const kvKey = this.toKVKey(key);
|
|
772
|
+
const swrWindow = totalTtl * 1000 - (staleAt - Date.now());
|
|
773
|
+
const expiresAt = staleAt + swrWindow;
|
|
774
|
+
|
|
775
|
+
this.waitUntil(async () => {
|
|
776
|
+
try {
|
|
777
|
+
const envelope: KVSegmentEnvelope = {
|
|
778
|
+
d: data,
|
|
779
|
+
s: staleAt,
|
|
780
|
+
e: expiresAt,
|
|
781
|
+
};
|
|
782
|
+
await this.kv!.put(kvKey, JSON.stringify(envelope), {
|
|
783
|
+
expirationTtl: totalTtl,
|
|
784
|
+
});
|
|
785
|
+
} catch (error) {
|
|
786
|
+
console.error("[CFCacheStore] KV set failed:", error);
|
|
787
|
+
}
|
|
788
|
+
});
|
|
789
|
+
}
|
|
790
|
+
|
|
791
|
+
/**
|
|
792
|
+
* Promote segment data from KV to L1 Cache API.
|
|
793
|
+
* @internal
|
|
794
|
+
*/
|
|
795
|
+
private promoteSegmentToL1(key: string, envelope: KVSegmentEnvelope): void {
|
|
796
|
+
if (!this.waitUntil) return;
|
|
797
|
+
|
|
798
|
+
this.waitUntil(async () => {
|
|
799
|
+
try {
|
|
800
|
+
const now = Date.now();
|
|
801
|
+
const remainingTtl = Math.max(1, Math.floor((envelope.e - now) / 1000));
|
|
802
|
+
const cache = await this.getCache();
|
|
803
|
+
const request = this.keyToRequest(key);
|
|
804
|
+
|
|
805
|
+
const response = new Response(JSON.stringify(envelope.d), {
|
|
806
|
+
headers: {
|
|
807
|
+
"Content-Type": "application/json",
|
|
808
|
+
"Cache-Control": `public, max-age=${remainingTtl}`,
|
|
809
|
+
[CACHE_STALE_AT_HEADER]: String(envelope.s),
|
|
810
|
+
[CACHE_STATUS_HEADER]: "HIT",
|
|
811
|
+
},
|
|
812
|
+
});
|
|
813
|
+
|
|
814
|
+
await cache.put(request, response);
|
|
815
|
+
} catch (error) {
|
|
816
|
+
console.error("[CFCacheStore] L1 promote failed:", error);
|
|
817
|
+
}
|
|
818
|
+
});
|
|
819
|
+
}
|
|
820
|
+
|
|
821
|
+
/**
|
|
822
|
+
* KV fallback for function cache reads.
|
|
823
|
+
* @internal
|
|
824
|
+
*/
|
|
825
|
+
private async kvGetItem(key: string): Promise<CacheItemResult | null> {
|
|
826
|
+
if (!this.kv) return null;
|
|
827
|
+
|
|
828
|
+
try {
|
|
829
|
+
const kvKey = this.toKVKey(`fn:${key}`);
|
|
830
|
+
const raw = await this.kv.get(kvKey, { type: "json" });
|
|
831
|
+
if (!raw) return null;
|
|
832
|
+
|
|
833
|
+
const envelope = raw as KVItemEnvelope;
|
|
834
|
+
const now = Date.now();
|
|
835
|
+
|
|
836
|
+
if (now > envelope.e) return null;
|
|
837
|
+
|
|
838
|
+
const shouldRevalidate = now > envelope.s;
|
|
839
|
+
|
|
840
|
+
// Promote to L1
|
|
841
|
+
this.promoteItemToL1(key, envelope);
|
|
842
|
+
|
|
843
|
+
return {
|
|
844
|
+
value: envelope.v,
|
|
845
|
+
handles: envelope.h,
|
|
846
|
+
shouldRevalidate,
|
|
847
|
+
};
|
|
848
|
+
} catch (error) {
|
|
849
|
+
console.error("[CFCacheStore] KV getItem failed:", error);
|
|
850
|
+
return null;
|
|
851
|
+
}
|
|
852
|
+
}
|
|
853
|
+
|
|
854
|
+
/**
|
|
855
|
+
* Promote function cache data from KV to L1.
|
|
856
|
+
* @internal
|
|
857
|
+
*/
|
|
858
|
+
private promoteItemToL1(key: string, envelope: KVItemEnvelope): void {
|
|
859
|
+
if (!this.waitUntil) return;
|
|
860
|
+
|
|
861
|
+
this.waitUntil(async () => {
|
|
862
|
+
try {
|
|
863
|
+
const now = Date.now();
|
|
864
|
+
const remainingTtl = Math.max(1, Math.floor((envelope.e - now) / 1000));
|
|
865
|
+
const cache = await this.getCache();
|
|
866
|
+
const request = this.keyToRequest(`fn:${key}`);
|
|
867
|
+
|
|
868
|
+
const body = JSON.stringify({ value: envelope.v, handles: envelope.h });
|
|
869
|
+
const response = new Response(body, {
|
|
870
|
+
headers: {
|
|
871
|
+
"Content-Type": "application/json",
|
|
872
|
+
"Cache-Control": `public, max-age=${remainingTtl}`,
|
|
873
|
+
[CACHE_STALE_AT_HEADER]: String(envelope.s),
|
|
874
|
+
[CACHE_STATUS_HEADER]: "HIT",
|
|
875
|
+
},
|
|
876
|
+
});
|
|
877
|
+
|
|
878
|
+
await cache.put(request, response);
|
|
879
|
+
} catch (error) {
|
|
880
|
+
console.error("[CFCacheStore] L1 item promote failed:", error);
|
|
881
|
+
}
|
|
882
|
+
});
|
|
883
|
+
}
|
|
884
|
+
|
|
885
|
+
/**
|
|
886
|
+
* KV fallback for document cache reads.
|
|
887
|
+
* @internal
|
|
888
|
+
*/
|
|
889
|
+
private async kvGetResponse(
|
|
890
|
+
key: string,
|
|
891
|
+
): Promise<{ response: Response; shouldRevalidate: boolean } | null> {
|
|
892
|
+
if (!this.kv) return null;
|
|
893
|
+
|
|
894
|
+
try {
|
|
895
|
+
const kvKey = this.toKVKey(`doc:${key}`);
|
|
896
|
+
const raw = await this.kv.get(kvKey, { type: "json" });
|
|
897
|
+
if (!raw) return null;
|
|
898
|
+
|
|
899
|
+
const envelope = raw as KVResponseEnvelope;
|
|
900
|
+
const now = Date.now();
|
|
901
|
+
|
|
902
|
+
if (now > envelope.e) return null;
|
|
903
|
+
|
|
904
|
+
const shouldRevalidate = now > envelope.s;
|
|
905
|
+
|
|
906
|
+
// Reconstruct Response (decode base64 → binary)
|
|
907
|
+
const headers = new Headers(envelope.hd);
|
|
908
|
+
const bodyBuffer = base64ToBuffer(envelope.b);
|
|
909
|
+
const response = new Response(bodyBuffer, {
|
|
910
|
+
status: envelope.st,
|
|
911
|
+
statusText: envelope.stx,
|
|
912
|
+
headers,
|
|
913
|
+
});
|
|
914
|
+
|
|
915
|
+
// Promote to L1
|
|
916
|
+
this.promoteResponseToL1(key, envelope);
|
|
917
|
+
|
|
918
|
+
return { response, shouldRevalidate };
|
|
919
|
+
} catch (error) {
|
|
920
|
+
console.error("[CFCacheStore] KV getResponse failed:", error);
|
|
921
|
+
return null;
|
|
922
|
+
}
|
|
923
|
+
}
|
|
924
|
+
|
|
925
|
+
/**
|
|
926
|
+
* Promote document cache data from KV to L1.
|
|
927
|
+
* @internal
|
|
928
|
+
*/
|
|
929
|
+
private promoteResponseToL1(key: string, envelope: KVResponseEnvelope): void {
|
|
930
|
+
if (!this.waitUntil) return;
|
|
931
|
+
|
|
932
|
+
this.waitUntil(async () => {
|
|
933
|
+
try {
|
|
934
|
+
const now = Date.now();
|
|
935
|
+
const remainingTtl = Math.max(1, Math.floor((envelope.e - now) / 1000));
|
|
936
|
+
const cache = await this.getCache();
|
|
937
|
+
const request = this.keyToRequest(`doc:${key}`);
|
|
938
|
+
|
|
939
|
+
const headers = new Headers(envelope.hd);
|
|
940
|
+
headers.set("Cache-Control", `public, max-age=${remainingTtl}`);
|
|
941
|
+
headers.set(CACHE_STALE_AT_HEADER, String(envelope.s));
|
|
942
|
+
|
|
943
|
+
const bodyBuffer = base64ToBuffer(envelope.b);
|
|
944
|
+
const response = new Response(bodyBuffer, {
|
|
945
|
+
status: envelope.st,
|
|
946
|
+
statusText: envelope.stx,
|
|
947
|
+
headers,
|
|
948
|
+
});
|
|
949
|
+
|
|
950
|
+
await cache.put(request, response);
|
|
951
|
+
} catch (error) {
|
|
952
|
+
console.error("[CFCacheStore] L1 response promote failed:", error);
|
|
953
|
+
}
|
|
954
|
+
});
|
|
955
|
+
}
|
|
956
|
+
}
|
|
957
|
+
|
|
958
|
+
// ============================================================================
|
|
959
|
+
// Base64 Helpers (binary-safe response body encoding for KV)
|
|
960
|
+
// ============================================================================
|
|
961
|
+
|
|
962
|
+
/** Encode ArrayBuffer to base64 string. */
|
|
963
|
+
function bufferToBase64(buffer: ArrayBuffer): string {
|
|
964
|
+
const bytes = new Uint8Array(buffer);
|
|
965
|
+
let binary = "";
|
|
966
|
+
for (let i = 0; i < bytes.length; i++) {
|
|
967
|
+
binary += String.fromCharCode(bytes[i]!);
|
|
968
|
+
}
|
|
969
|
+
return btoa(binary);
|
|
970
|
+
}
|
|
971
|
+
|
|
972
|
+
/** Decode base64 string to ArrayBuffer. */
|
|
973
|
+
function base64ToBuffer(base64: string): ArrayBuffer {
|
|
974
|
+
const binary = atob(base64);
|
|
975
|
+
const bytes = new Uint8Array(binary.length);
|
|
976
|
+
for (let i = 0; i < binary.length; i++) {
|
|
977
|
+
bytes[i] = binary.charCodeAt(i);
|
|
978
|
+
}
|
|
979
|
+
return bytes.buffer;
|
|
428
980
|
}
|