@rangojs/router 0.0.0-experimental.259 → 0.0.0-experimental.25dbaac3
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/{CLAUDE.md → AGENTS.md} +4 -0
- package/README.md +471 -51
- 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 +490 -94
- 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 +3423 -1718
- package/dist/vite/index.js.bak +5448 -0
- package/dist/vite/index.js.map +1 -0
- package/dist/vite/index.named-routes.gen.ts +103 -0
- package/dist/vite/package-resolution.d.ts +43 -0
- package/dist/vite/package-resolution.d.ts.map +1 -0
- package/dist/vite/package-resolution.js +112 -0
- package/dist/vite/package-resolution.js.map +1 -0
- package/dist/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
- package/dist/vite/virtual-entries.d.ts +25 -0
- package/dist/vite/virtual-entries.d.ts.map +1 -0
- package/dist/vite/virtual-entries.js +110 -0
- package/dist/vite/virtual-entries.js.map +1 -0
- package/package.json +21 -18
- package/skills/breadcrumbs/SKILL.md +252 -0
- package/skills/cache-guide/SKILL.md +41 -5
- package/skills/caching/SKILL.md +49 -8
- package/skills/document-cache/SKILL.md +2 -2
- package/skills/handler-use/SKILL.md +362 -0
- package/skills/hooks/SKILL.md +94 -52
- package/skills/host-router/SKILL.md +218 -0
- package/skills/intercept/SKILL.md +99 -0
- package/skills/layout/SKILL.md +84 -2
- package/skills/links/SKILL.md +93 -17
- package/skills/loader/SKILL.md +367 -36
- package/skills/middleware/SKILL.md +145 -33
- package/skills/migrate-nextjs/SKILL.md +562 -0
- package/skills/migrate-react-router/SKILL.md +769 -0
- package/skills/parallel/SKILL.md +249 -2
- package/skills/prerender/SKILL.md +261 -49
- package/skills/rango/SKILL.md +26 -24
- package/skills/response-routes/SKILL.md +11 -3
- package/skills/route/SKILL.md +100 -5
- package/skills/router-setup/SKILL.md +172 -5
- package/skills/server-actions/SKILL.md +739 -0
- package/skills/streams-and-websockets/SKILL.md +283 -0
- package/skills/theme/SKILL.md +5 -4
- package/skills/typesafety/SKILL.md +95 -38
- package/skills/use-cache/SKILL.md +16 -2
- package/src/__internal.ts +93 -1
- package/src/bin/rango.ts +56 -19
- package/src/browser/action-coordinator.ts +97 -0
- package/src/browser/app-shell.ts +52 -0
- package/src/browser/app-version.ts +14 -0
- package/src/browser/event-controller.ts +78 -52
- package/src/browser/history-state.ts +80 -0
- package/src/browser/intercept-utils.ts +1 -1
- package/src/browser/link-interceptor.ts +23 -3
- package/src/browser/merge-segment-loaders.ts +9 -2
- package/src/browser/navigation-bridge.ts +234 -453
- package/src/browser/navigation-client.ts +191 -86
- package/src/browser/navigation-store.ts +71 -41
- package/src/browser/navigation-transaction.ts +297 -0
- package/src/browser/partial-update.ts +215 -167
- 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 +241 -47
- package/src/browser/react/NavigationProvider.tsx +136 -16
- package/src/browser/react/context.ts +11 -0
- package/src/browser/react/filter-segment-order.ts +55 -0
- package/src/browser/react/index.ts +2 -6
- package/src/browser/react/location-state-shared.ts +29 -11
- package/src/browser/react/location-state.ts +6 -4
- 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 +23 -45
- package/src/browser/react/use-client-cache.ts +5 -3
- package/src/browser/react/use-handle.ts +28 -120
- package/src/browser/react/use-navigation.ts +29 -34
- package/src/browser/react/use-params.ts +16 -35
- package/src/browser/react/use-pathname.ts +2 -3
- package/src/browser/react/use-router.ts +31 -14
- package/src/browser/react/use-search-params.ts +2 -1
- package/src/browser/react/use-segments.ts +82 -118
- package/src/browser/response-adapter.ts +73 -0
- package/src/browser/rsc-router.tsx +202 -67
- package/src/browser/scroll-restoration.ts +47 -45
- package/src/browser/segment-reconciler.ts +36 -9
- package/src/browser/server-action-bridge.ts +464 -409
- package/src/browser/types.ts +100 -40
- package/src/browser/validate-redirect-origin.ts +29 -0
- package/src/build/generate-manifest.ts +44 -19
- package/src/build/generate-route-types.ts +7 -0
- package/src/build/index.ts +1 -0
- package/src/build/route-trie.ts +67 -25
- package/src/build/route-types/codegen.ts +13 -4
- package/src/build/route-types/include-resolution.ts +21 -1
- package/src/build/route-types/per-module-writer.ts +15 -3
- package/src/build/route-types/router-processing.ts +391 -90
- package/src/build/route-types/scan-filter.ts +8 -1
- package/src/build/runtime-discovery.ts +13 -1
- 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 +140 -123
- package/src/cache/cache-scope.ts +124 -90
- package/src/cache/cf/cf-cache-store.ts +467 -22
- package/src/cache/cf/index.ts +5 -1
- package/src/cache/document-cache.ts +109 -75
- package/src/cache/handle-capture.ts +81 -0
- package/src/cache/index.ts +1 -15
- package/src/cache/memory-segment-store.ts +43 -69
- package/src/cache/profile-registry.ts +43 -8
- package/src/cache/read-through-swr.ts +134 -0
- package/src/cache/segment-codec.ts +140 -117
- package/src/cache/taint.ts +85 -3
- package/src/cache/types.ts +1 -115
- package/src/client.rsc.tsx +2 -1
- package/src/client.tsx +86 -254
- package/src/context-var.ts +72 -2
- package/src/debug.ts +2 -2
- package/src/errors.ts +6 -1
- package/src/handle.ts +41 -1
- package/src/handles/MetaTags.tsx +5 -2
- package/src/handles/breadcrumbs.ts +66 -0
- package/src/handles/index.ts +1 -0
- package/src/host/cookie-handler.ts +8 -3
- package/src/host/index.ts +0 -3
- package/src/host/router.ts +14 -1
- package/src/href-client.ts +3 -1
- package/src/index.rsc.ts +48 -32
- package/src/index.ts +104 -64
- package/src/loader.rsc.ts +12 -4
- package/src/loader.ts +8 -0
- package/src/outlet-context.ts +1 -1
- package/src/prerender/store.ts +61 -18
- package/src/prerender.ts +207 -88
- package/src/response-utils.ts +28 -0
- package/src/reverse.ts +36 -7
- package/src/root-error-boundary.tsx +30 -26
- package/src/route-definition/dsl-helpers.ts +249 -46
- package/src/route-definition/helpers-types.ts +73 -20
- package/src/route-definition/index.ts +3 -3
- package/src/route-definition/redirect.ts +24 -4
- package/src/route-definition/resolve-handler-use.ts +155 -0
- package/src/route-map-builder.ts +45 -3
- package/src/route-name.ts +53 -0
- package/src/route-types.ts +25 -0
- package/src/router/content-negotiation.ts +101 -2
- package/src/router/debug-manifest.ts +16 -3
- package/src/router/find-match.ts +4 -2
- package/src/router/handler-context.ts +221 -39
- package/src/router/intercept-resolution.ts +17 -8
- package/src/router/lazy-includes.ts +12 -5
- package/src/router/loader-resolution.ts +164 -31
- package/src/router/logging.ts +104 -4
- package/src/router/manifest.ts +53 -9
- package/src/router/match-api.ts +150 -206
- package/src/router/match-context.ts +3 -0
- package/src/router/match-handlers.ts +186 -11
- package/src/router/match-middleware/background-revalidation.ts +94 -86
- package/src/router/match-middleware/cache-lookup.ts +164 -19
- package/src/router/match-middleware/cache-store.ts +55 -10
- package/src/router/match-middleware/intercept-resolution.ts +9 -7
- package/src/router/match-middleware/segment-resolution.ts +61 -5
- package/src/router/match-pipelines.ts +8 -43
- package/src/router/match-result.ts +122 -18
- package/src/router/metrics.ts +238 -13
- package/src/router/middleware-types.ts +64 -61
- package/src/router/middleware.ts +316 -145
- package/src/router/navigation-snapshot.ts +182 -0
- package/src/router/pattern-matching.ts +134 -15
- package/src/router/prerender-match.ts +150 -16
- package/src/router/preview-match.ts +30 -96
- package/src/router/request-classification.ts +310 -0
- package/src/router/revalidation.ts +102 -9
- package/src/router/route-snapshot.ts +245 -0
- package/src/router/router-context.ts +20 -0
- package/src/router/router-interfaces.ts +200 -43
- package/src/router/router-options.ts +265 -12
- package/src/router/router-registry.ts +5 -2
- package/src/router/segment-resolution/fresh.ts +365 -256
- package/src/router/segment-resolution/helpers.ts +268 -0
- package/src/router/segment-resolution/loader-cache.ts +103 -98
- package/src/router/segment-resolution/revalidation.ts +711 -423
- package/src/router/segment-resolution/static-store.ts +2 -2
- package/src/router/segment-resolution.ts +1 -3
- package/src/router/segment-wrappers.ts +5 -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 +30 -6
- package/src/router/types.ts +8 -1
- package/src/router/url-params.ts +49 -0
- package/src/router.ts +269 -25
- package/src/rsc/handler-context.ts +13 -2
- package/src/rsc/handler.ts +784 -629
- package/src/rsc/helpers.ts +168 -20
- package/src/rsc/index.ts +0 -20
- package/src/rsc/loader-fetch.ts +105 -43
- package/src/rsc/manifest-init.ts +7 -2
- package/src/rsc/origin-guard.ts +141 -0
- package/src/rsc/progressive-enhancement.ts +262 -20
- package/src/rsc/response-route-handler.ts +360 -0
- package/src/rsc/rsc-rendering.ts +70 -44
- package/src/rsc/runtime-warnings.ts +42 -0
- package/src/rsc/server-action.ts +178 -66
- package/src/rsc/ssr-setup.ts +128 -0
- package/src/rsc/types.ts +37 -3
- package/src/search-params.ts +38 -23
- package/src/segment-content-promise.ts +67 -0
- package/src/segment-loader-promise.ts +122 -0
- package/src/segment-system.tsx +109 -23
- package/src/server/context.ts +227 -24
- package/src/server/cookie-store.ts +190 -0
- package/src/server/fetchable-loader-store.ts +11 -6
- package/src/server/handle-store.ts +103 -12
- package/src/server/loader-registry.ts +20 -54
- package/src/server/request-context.ts +475 -105
- package/src/server.ts +6 -0
- package/src/ssr/index.tsx +74 -27
- package/src/static-handler.ts +25 -6
- package/src/theme/ThemeProvider.tsx +6 -1
- package/src/theme/index.ts +4 -18
- package/src/theme/theme-context.ts +1 -28
- package/src/theme/theme-script.ts +2 -1
- package/src/types/cache-types.ts +10 -5
- package/src/types/error-types.ts +3 -0
- package/src/types/global-namespace.ts +22 -0
- package/src/types/handler-context.ts +242 -82
- package/src/types/index.ts +1 -1
- package/src/types/loader-types.ts +50 -21
- package/src/types/request-scope.ts +126 -0
- package/src/types/route-config.ts +17 -26
- package/src/types/route-entry.ts +46 -0
- package/src/types/segments.ts +19 -5
- package/src/urls/include-helper.ts +72 -21
- package/src/urls/index.ts +1 -0
- package/src/urls/path-helper-types.ts +69 -18
- package/src/urls/path-helper.ts +65 -15
- package/src/urls/pattern-types.ts +33 -1
- package/src/urls/response-types.ts +47 -23
- package/src/urls/type-extraction.ts +23 -15
- package/src/use-loader.tsx +103 -13
- package/src/vite/debug.ts +184 -0
- package/src/vite/discovery/bundle-postprocess.ts +62 -85
- package/src/vite/discovery/discover-routers.ts +87 -29
- package/src/vite/discovery/gate-state.ts +171 -0
- package/src/vite/discovery/prerender-collection.ts +224 -106
- package/src/vite/discovery/route-types-writer.ts +7 -7
- package/src/vite/discovery/self-gen-tracking.ts +27 -1
- package/src/vite/discovery/state.ts +20 -13
- package/src/vite/discovery/virtual-module-codegen.ts +5 -2
- package/src/vite/index.ts +14 -51
- package/src/vite/plugin-types.ts +51 -79
- package/src/vite/plugins/cjs-to-esm.ts +5 -0
- package/src/vite/plugins/client-ref-dedup.ts +131 -0
- package/src/vite/plugins/client-ref-hashing.ts +19 -7
- 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/plugins/expose-action-id.ts +53 -31
- package/src/vite/plugins/expose-id-utils.ts +12 -0
- package/src/vite/plugins/expose-ids/handler-transform.ts +30 -0
- package/src/vite/plugins/expose-ids/router-transform.ts +20 -3
- package/src/vite/plugins/expose-internal-ids.ts +567 -319
- 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 +139 -38
- package/src/vite/plugins/version-injector.ts +37 -11
- package/src/vite/plugins/version-plugin.ts +200 -18
- package/src/vite/rango.ts +233 -221
- package/src/vite/router-discovery.ts +887 -176
- package/src/vite/utils/banner.ts +4 -4
- package/src/vite/utils/package-resolution.ts +41 -1
- package/src/vite/utils/prerender-utils.ts +113 -0
- package/src/vite/utils/shared-utils.ts +22 -11
- package/skills/testing/SKILL.md +0 -226
- package/src/browser/lru-cache.ts +0 -61
- package/src/browser/react/prefetch.ts +0 -27
- package/src/browser/request-controller.ts +0 -164
- package/src/cache/memory-store.ts +0 -253
- package/src/route-definition/route-function.ts +0 -119
- package/src/router.gen.ts +0 -6
- package/src/static-handler.gen.ts +0 -5
- package/src/urls.gen.ts +0 -8
|
@@ -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 {
|
|
@@ -29,10 +36,15 @@ import type {
|
|
|
29
36
|
CacheItemOptions,
|
|
30
37
|
} from "../types.js";
|
|
31
38
|
import {
|
|
32
|
-
|
|
39
|
+
_getRequestContext,
|
|
33
40
|
type RequestContext,
|
|
34
41
|
} from "../../server/request-context.js";
|
|
35
42
|
import { VERSION } from "@rangojs/router:version";
|
|
43
|
+
import {
|
|
44
|
+
resolveTtl,
|
|
45
|
+
resolveSwrWindow,
|
|
46
|
+
DEFAULT_FUNCTION_TTL,
|
|
47
|
+
} from "../cache-policy.js";
|
|
36
48
|
|
|
37
49
|
// ============================================================================
|
|
38
50
|
// Constants
|
|
@@ -55,12 +67,71 @@ export const MAX_REVALIDATION_INTERVAL = 30;
|
|
|
55
67
|
// Types
|
|
56
68
|
// ============================================================================
|
|
57
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
|
+
|
|
76
|
+
/**
|
|
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
|
|
106
|
+
*/
|
|
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
|
+
|
|
58
118
|
/**
|
|
59
|
-
*
|
|
119
|
+
* KV envelope for document cache entries.
|
|
120
|
+
* @internal
|
|
60
121
|
*/
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
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;
|
|
64
135
|
}
|
|
65
136
|
|
|
66
137
|
export interface CFCacheStoreOptions<TEnv = unknown> {
|
|
@@ -93,6 +164,20 @@ export interface CFCacheStoreOptions<TEnv = unknown> {
|
|
|
93
164
|
*/
|
|
94
165
|
ctx: ExecutionContext;
|
|
95
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
|
+
|
|
96
181
|
/**
|
|
97
182
|
* Cache version string override. When this changes, all cached entries are
|
|
98
183
|
* effectively invalidated (new keys won't match old entries).
|
|
@@ -126,7 +211,7 @@ export interface CFCacheStoreOptions<TEnv = unknown> {
|
|
|
126
211
|
* @example Using cookies for locale-aware caching
|
|
127
212
|
* ```typescript
|
|
128
213
|
* keyGenerator: (ctx, defaultKey) => {
|
|
129
|
-
* const locale =
|
|
214
|
+
* const locale = cookies().get('locale')?.value || 'en';
|
|
130
215
|
* return `${locale}:${defaultKey}`;
|
|
131
216
|
* }
|
|
132
217
|
* ```
|
|
@@ -158,6 +243,7 @@ export class CFCacheStore<TEnv = unknown> implements SegmentCacheStore<TEnv> {
|
|
|
158
243
|
private readonly baseUrl: string;
|
|
159
244
|
private readonly waitUntil?: (fn: () => Promise<void>) => void;
|
|
160
245
|
private readonly version?: string;
|
|
246
|
+
private readonly kv?: KVNamespace;
|
|
161
247
|
|
|
162
248
|
constructor(options: CFCacheStoreOptions<TEnv>) {
|
|
163
249
|
if (!options.ctx) {
|
|
@@ -174,6 +260,7 @@ export class CFCacheStore<TEnv = unknown> implements SegmentCacheStore<TEnv> {
|
|
|
174
260
|
this.version = options.version ?? VERSION;
|
|
175
261
|
this.keyGenerator = options.keyGenerator;
|
|
176
262
|
this.waitUntil = (fn) => options.ctx.waitUntil(fn());
|
|
263
|
+
this.kv = options.kv;
|
|
177
264
|
}
|
|
178
265
|
|
|
179
266
|
/**
|
|
@@ -184,7 +271,7 @@ export class CFCacheStore<TEnv = unknown> implements SegmentCacheStore<TEnv> {
|
|
|
184
271
|
private deriveBaseUrl(): string {
|
|
185
272
|
const fallback = "https://rsc-cache.internal.com/";
|
|
186
273
|
|
|
187
|
-
const ctx =
|
|
274
|
+
const ctx = _getRequestContext();
|
|
188
275
|
if (!ctx?.request) {
|
|
189
276
|
return fallback;
|
|
190
277
|
}
|
|
@@ -227,6 +314,10 @@ export class CFCacheStore<TEnv = unknown> implements SegmentCacheStore<TEnv> {
|
|
|
227
314
|
return caches.default;
|
|
228
315
|
}
|
|
229
316
|
|
|
317
|
+
// ============================================================================
|
|
318
|
+
// Segment Cache Methods
|
|
319
|
+
// ============================================================================
|
|
320
|
+
|
|
230
321
|
/**
|
|
231
322
|
* Get cached entry data by key.
|
|
232
323
|
*
|
|
@@ -235,7 +326,8 @@ export class CFCacheStore<TEnv = unknown> implements SegmentCacheStore<TEnv> {
|
|
|
235
326
|
* - If already REVALIDATING (and recent), returns shouldRevalidate: false
|
|
236
327
|
* - If fresh, returns shouldRevalidate: false
|
|
237
328
|
*
|
|
238
|
-
*
|
|
329
|
+
* On L1 miss, falls back to KV (L2) if configured.
|
|
330
|
+
* KV hits are promoted to L1 in the background.
|
|
239
331
|
*/
|
|
240
332
|
async get(key: string): Promise<CacheGetResult | null> {
|
|
241
333
|
try {
|
|
@@ -244,7 +336,7 @@ export class CFCacheStore<TEnv = unknown> implements SegmentCacheStore<TEnv> {
|
|
|
244
336
|
const response = await cache.match(request);
|
|
245
337
|
|
|
246
338
|
if (!response) {
|
|
247
|
-
return
|
|
339
|
+
return this.kvGetSegment(key);
|
|
248
340
|
}
|
|
249
341
|
|
|
250
342
|
// Read status headers
|
|
@@ -287,6 +379,7 @@ export class CFCacheStore<TEnv = unknown> implements SegmentCacheStore<TEnv> {
|
|
|
287
379
|
/**
|
|
288
380
|
* Store entry data with TTL and optional SWR window.
|
|
289
381
|
* Uses waitUntil for non-blocking write when available.
|
|
382
|
+
* When KV is configured, also persists to L2.
|
|
290
383
|
*/
|
|
291
384
|
async set(
|
|
292
385
|
key: string,
|
|
@@ -299,11 +392,12 @@ export class CFCacheStore<TEnv = unknown> implements SegmentCacheStore<TEnv> {
|
|
|
299
392
|
const request = this.keyToRequest(key);
|
|
300
393
|
|
|
301
394
|
// Extended TTL covers SWR window
|
|
302
|
-
const swrWindow = swr
|
|
395
|
+
const swrWindow = resolveSwrWindow(swr, this.defaults);
|
|
303
396
|
const totalTtl = ttl + swrWindow;
|
|
304
397
|
const staleAt = Date.now() + ttl * 1000;
|
|
305
398
|
|
|
306
|
-
const
|
|
399
|
+
const body = JSON.stringify(data);
|
|
400
|
+
const response = new Response(body, {
|
|
307
401
|
headers: {
|
|
308
402
|
"Content-Type": "application/json",
|
|
309
403
|
"Cache-Control": `public, max-age=${totalTtl}`,
|
|
@@ -323,18 +417,35 @@ export class CFCacheStore<TEnv = unknown> implements SegmentCacheStore<TEnv> {
|
|
|
323
417
|
// Blocking fallback
|
|
324
418
|
await putPromise;
|
|
325
419
|
}
|
|
420
|
+
|
|
421
|
+
// L2: persist to KV
|
|
422
|
+
this.kvSetSegment(key, data, staleAt, totalTtl);
|
|
326
423
|
} catch (error) {
|
|
327
424
|
console.error("[CFCacheStore] set failed:", error);
|
|
328
425
|
}
|
|
329
426
|
}
|
|
330
427
|
|
|
331
428
|
/**
|
|
332
|
-
* Delete a cached entry
|
|
429
|
+
* Delete a cached entry from L1 and L2.
|
|
333
430
|
*/
|
|
334
431
|
async delete(key: string): Promise<boolean> {
|
|
335
432
|
try {
|
|
336
433
|
const cache = await this.getCache();
|
|
337
|
-
|
|
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;
|
|
338
449
|
} catch (error) {
|
|
339
450
|
console.error("[CFCacheStore] delete failed:", error);
|
|
340
451
|
return false;
|
|
@@ -348,6 +459,7 @@ export class CFCacheStore<TEnv = unknown> implements SegmentCacheStore<TEnv> {
|
|
|
348
459
|
/**
|
|
349
460
|
* Get a cached Response by key (for document-level caching).
|
|
350
461
|
* Returns the response and whether it should be revalidated (SWR).
|
|
462
|
+
* Falls back to KV (L2) on L1 miss.
|
|
351
463
|
*/
|
|
352
464
|
async getResponse(
|
|
353
465
|
key: string,
|
|
@@ -358,7 +470,7 @@ export class CFCacheStore<TEnv = unknown> implements SegmentCacheStore<TEnv> {
|
|
|
358
470
|
const response = await cache.match(request);
|
|
359
471
|
|
|
360
472
|
if (!response || response.status !== 200) {
|
|
361
|
-
return
|
|
473
|
+
return this.kvGetResponse(key);
|
|
362
474
|
}
|
|
363
475
|
|
|
364
476
|
// Check staleness
|
|
@@ -377,6 +489,7 @@ export class CFCacheStore<TEnv = unknown> implements SegmentCacheStore<TEnv> {
|
|
|
377
489
|
|
|
378
490
|
/**
|
|
379
491
|
* Store a Response with TTL and optional SWR window (for document-level caching).
|
|
492
|
+
* When KV is configured, also persists to L2.
|
|
380
493
|
*/
|
|
381
494
|
async putResponse(
|
|
382
495
|
key: string,
|
|
@@ -389,16 +502,23 @@ export class CFCacheStore<TEnv = unknown> implements SegmentCacheStore<TEnv> {
|
|
|
389
502
|
const request = this.keyToRequest(`doc:${key}`);
|
|
390
503
|
|
|
391
504
|
// Extended TTL covers SWR window
|
|
392
|
-
const swrWindow = swr
|
|
505
|
+
const swrWindow = resolveSwrWindow(swr, this.defaults);
|
|
393
506
|
const totalTtl = ttl + swrWindow;
|
|
394
507
|
const staleAt = Date.now() + ttl * 1000;
|
|
395
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
|
+
|
|
396
516
|
// Clone and add cache headers
|
|
397
517
|
const headers = new Headers(response.headers);
|
|
398
518
|
headers.set("Cache-Control", `public, max-age=${totalTtl}`);
|
|
399
519
|
headers.set(CACHE_STALE_AT_HEADER, String(staleAt));
|
|
400
520
|
|
|
401
|
-
const toCache = new Response(
|
|
521
|
+
const toCache = new Response(l1Body, {
|
|
402
522
|
status: response.status,
|
|
403
523
|
statusText: response.statusText,
|
|
404
524
|
headers,
|
|
@@ -415,6 +535,36 @@ export class CFCacheStore<TEnv = unknown> implements SegmentCacheStore<TEnv> {
|
|
|
415
535
|
// Blocking fallback
|
|
416
536
|
await putPromise;
|
|
417
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
|
+
}
|
|
418
568
|
} catch (error) {
|
|
419
569
|
console.error("[CFCacheStore] putResponse failed:", error);
|
|
420
570
|
}
|
|
@@ -427,6 +577,7 @@ export class CFCacheStore<TEnv = unknown> implements SegmentCacheStore<TEnv> {
|
|
|
427
577
|
/**
|
|
428
578
|
* Get a cached function result by key.
|
|
429
579
|
* Follows the same SWR pattern as get() for segment caching.
|
|
580
|
+
* Falls back to KV (L2) on L1 miss.
|
|
430
581
|
*/
|
|
431
582
|
async getItem(key: string): Promise<CacheItemResult | null> {
|
|
432
583
|
try {
|
|
@@ -434,7 +585,7 @@ export class CFCacheStore<TEnv = unknown> implements SegmentCacheStore<TEnv> {
|
|
|
434
585
|
const request = this.keyToRequest(`fn:${key}`);
|
|
435
586
|
const response = await cache.match(request);
|
|
436
587
|
|
|
437
|
-
if (!response) return
|
|
588
|
+
if (!response) return this.kvGetItem(key);
|
|
438
589
|
|
|
439
590
|
const staleAt = Number(
|
|
440
591
|
response.headers.get(CACHE_STALE_AT_HEADER) ?? "0",
|
|
@@ -480,6 +631,7 @@ export class CFCacheStore<TEnv = unknown> implements SegmentCacheStore<TEnv> {
|
|
|
480
631
|
|
|
481
632
|
/**
|
|
482
633
|
* Store a function result with TTL and optional SWR window.
|
|
634
|
+
* When KV is configured, also persists to L2.
|
|
483
635
|
*/
|
|
484
636
|
async setItem(
|
|
485
637
|
key: string,
|
|
@@ -490,8 +642,8 @@ export class CFCacheStore<TEnv = unknown> implements SegmentCacheStore<TEnv> {
|
|
|
490
642
|
const cache = await this.getCache();
|
|
491
643
|
const request = this.keyToRequest(`fn:${key}`);
|
|
492
644
|
|
|
493
|
-
const ttl = options?.ttl
|
|
494
|
-
const swrWindow = options?.swr
|
|
645
|
+
const ttl = resolveTtl(options?.ttl, this.defaults, DEFAULT_FUNCTION_TTL);
|
|
646
|
+
const swrWindow = resolveSwrWindow(options?.swr, this.defaults);
|
|
495
647
|
const totalTtl = ttl + swrWindow;
|
|
496
648
|
const staleAt = Date.now() + ttl * 1000;
|
|
497
649
|
|
|
@@ -514,11 +666,35 @@ export class CFCacheStore<TEnv = unknown> implements SegmentCacheStore<TEnv> {
|
|
|
514
666
|
} else {
|
|
515
667
|
await putPromise;
|
|
516
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
|
+
}
|
|
517
689
|
} catch (error) {
|
|
518
690
|
console.error("[CFCacheStore] setItem failed:", error);
|
|
519
691
|
}
|
|
520
692
|
}
|
|
521
693
|
|
|
694
|
+
// ============================================================================
|
|
695
|
+
// Key Helpers
|
|
696
|
+
// ============================================================================
|
|
697
|
+
|
|
522
698
|
/**
|
|
523
699
|
* Convert string key to Request object for CF Cache API.
|
|
524
700
|
* Includes version in URL if specified (for cache invalidation on code changes).
|
|
@@ -532,4 +708,273 @@ export class CFCacheStore<TEnv = unknown> implements SegmentCacheStore<TEnv> {
|
|
|
532
708
|
method: "GET",
|
|
533
709
|
});
|
|
534
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;
|
|
535
980
|
}
|
package/src/cache/cf/index.ts
CHANGED
|
@@ -10,7 +10,11 @@
|
|
|
10
10
|
*/
|
|
11
11
|
|
|
12
12
|
// Public API
|
|
13
|
-
export {
|
|
13
|
+
export {
|
|
14
|
+
CFCacheStore,
|
|
15
|
+
type CFCacheStoreOptions,
|
|
16
|
+
type KVNamespace,
|
|
17
|
+
} from "./cf-cache-store.js";
|
|
14
18
|
|
|
15
19
|
// Header constants for debugging and inspection
|
|
16
20
|
export {
|