@rangojs/router 0.0.0-experimental.tapabs2 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bin/rango.js +8 -40
- package/dist/types/__internal.d.ts +127 -0
- package/dist/types/bin/rango.d.ts +1 -0
- package/dist/types/browser/action-coordinator.d.ts +57 -0
- package/dist/types/browser/action-fence.d.ts +33 -0
- package/dist/types/browser/app-shell.d.ts +34 -0
- package/dist/types/browser/app-version.d.ts +6 -0
- package/dist/types/browser/connection-warmup.d.ts +31 -0
- package/dist/types/browser/cookie-name.d.ts +66 -0
- package/dist/types/browser/event-controller.d.ts +221 -0
- package/dist/types/browser/history-state.d.ts +26 -0
- package/dist/types/browser/index.d.ts +1 -0
- package/dist/types/browser/intercept-utils.d.ts +30 -0
- package/dist/types/browser/invalidate-client-cache.d.ts +17 -0
- package/dist/types/browser/link-interceptor.d.ts +43 -0
- package/dist/types/browser/logging.d.ts +33 -0
- package/dist/types/browser/merge-segment-loaders.d.ts +38 -0
- package/dist/types/browser/navigation-bridge.d.ts +27 -0
- package/dist/types/browser/navigation-client.d.ts +17 -0
- package/dist/types/browser/navigation-store-handle.d.ts +25 -0
- package/dist/types/browser/navigation-store.d.ts +95 -0
- package/dist/types/browser/navigation-transaction.d.ts +75 -0
- package/dist/types/browser/network-error-handler.d.ts +35 -0
- package/dist/types/browser/partial-update.d.ts +61 -0
- package/dist/types/browser/prefetch/cache.d.ts +183 -0
- package/dist/types/browser/prefetch/fetch.d.ts +52 -0
- package/dist/types/browser/prefetch/observer.d.ts +27 -0
- package/dist/types/browser/prefetch/policy.d.ts +13 -0
- package/dist/types/browser/prefetch/queue.d.ts +48 -0
- package/dist/types/browser/prefetch/resource-ready.d.ts +28 -0
- package/dist/types/browser/rango-state.d.ts +52 -0
- package/dist/types/browser/react/Link.d.ts +140 -0
- package/dist/types/browser/react/NavigationProvider.d.ts +88 -0
- package/dist/types/browser/react/ScrollRestoration.d.ts +78 -0
- package/dist/types/browser/react/context.d.ts +54 -0
- package/dist/types/browser/react/filter-segment-order.d.ts +35 -0
- package/dist/types/browser/react/index.d.ts +1 -0
- package/dist/types/browser/react/location-state-shared.d.ts +162 -0
- package/dist/types/browser/react/location-state.d.ts +29 -0
- package/dist/types/browser/react/mount-context.d.ts +23 -0
- package/dist/types/browser/react/nonce-context.d.ts +14 -0
- package/dist/types/browser/react/shallow-equal.d.ts +5 -0
- package/dist/types/browser/react/use-action.d.ts +61 -0
- package/dist/types/browser/react/use-handle.d.ts +21 -0
- package/dist/types/browser/react/use-href.d.ts +32 -0
- package/dist/types/browser/react/use-link-status.d.ts +36 -0
- package/dist/types/browser/react/use-mount.d.ts +24 -0
- package/dist/types/browser/react/use-navigation.d.ts +15 -0
- package/dist/types/browser/react/use-params.d.ts +21 -0
- package/dist/types/browser/react/use-pathname.d.ts +13 -0
- package/dist/types/browser/react/use-reverse.d.ts +40 -0
- package/dist/types/browser/react/use-router.d.ts +23 -0
- package/dist/types/browser/react/use-search-params.d.ts +19 -0
- package/dist/types/browser/react/use-segments.d.ts +29 -0
- package/dist/types/browser/response-adapter.d.ts +58 -0
- package/dist/types/browser/rsc-router.d.ts +141 -0
- package/dist/types/browser/scroll-restoration.d.ts +103 -0
- package/dist/types/browser/segment-reconciler.d.ts +74 -0
- package/dist/types/browser/segment-structure-assert.d.ts +16 -0
- package/dist/types/browser/server-action-bridge.d.ts +29 -0
- package/dist/types/browser/types.d.ts +530 -0
- package/dist/types/browser/validate-redirect-origin.d.ts +28 -0
- package/dist/types/build/collect-fallback-refs.d.ts +5 -0
- package/dist/types/build/generate-manifest.d.ts +100 -0
- package/dist/types/build/generate-route-types.d.ts +8 -0
- package/dist/types/build/index.d.ts +21 -0
- package/dist/types/build/prefix-tree-utils.d.ts +56 -0
- package/dist/types/build/route-trie.d.ts +89 -0
- package/dist/types/build/route-types/ast-helpers.d.ts +3 -0
- package/dist/types/build/route-types/ast-route-extraction.d.ts +13 -0
- package/dist/types/build/route-types/codegen.d.ts +16 -0
- package/dist/types/build/route-types/include-resolution.d.ts +74 -0
- package/dist/types/build/route-types/param-extraction.d.ts +13 -0
- package/dist/types/build/route-types/per-module-writer.d.ts +18 -0
- package/dist/types/build/route-types/router-processing.d.ts +82 -0
- package/dist/types/build/route-types/scan-filter.d.ts +17 -0
- package/dist/types/build/route-types/source-scan.d.ts +13 -0
- package/dist/types/build/runtime-discovery.d.ts +24 -0
- package/dist/types/cache/background-task.d.ts +21 -0
- package/dist/types/cache/cache-error.d.ts +71 -0
- package/dist/types/cache/cache-key-utils.d.ts +35 -0
- package/dist/types/cache/cache-policy.d.ts +59 -0
- package/dist/types/cache/cache-runtime.d.ts +51 -0
- package/dist/types/cache/cache-scope.d.ts +134 -0
- package/dist/types/cache/cache-tag.d.ts +79 -0
- package/dist/types/cache/cf/cf-base64.d.ts +4 -0
- package/dist/types/cache/cf/cf-cache-constants.d.ts +105 -0
- package/dist/types/cache/cf/cf-cache-store.d.ts +588 -0
- package/dist/types/cache/cf/cf-cache-types.d.ts +363 -0
- package/dist/types/cache/cf/cf-kv-utils.d.ts +22 -0
- package/dist/types/cache/cf/cf-tag-marker-memo.d.ts +15 -0
- package/dist/types/cache/cf/cf-zone-purge.d.ts +31 -0
- package/dist/types/cache/cf/index.d.ts +4 -0
- package/dist/types/cache/document-cache.d.ts +69 -0
- package/dist/types/cache/handle-capture.d.ts +23 -0
- package/dist/types/cache/handle-snapshot.d.ts +39 -0
- package/dist/types/cache/index.d.ts +7 -0
- package/dist/types/cache/memory-segment-store.d.ts +163 -0
- package/dist/types/cache/profile-registry.d.ts +40 -0
- package/dist/types/cache/read-through-swr.d.ts +60 -0
- package/dist/types/cache/segment-codec.d.ts +78 -0
- package/dist/types/cache/shell-snapshot.d.ts +173 -0
- package/dist/types/cache/tag-invalidation.d.ts +74 -0
- package/dist/types/cache/taint.d.ts +71 -0
- package/dist/types/cache/types.d.ts +418 -0
- package/dist/types/cache/vercel/index.d.ts +1 -0
- package/dist/types/cache/vercel/vercel-cache-store.d.ts +267 -0
- package/dist/types/client.d.ts +184 -0
- package/dist/types/client.rsc.d.ts +39 -0
- package/dist/types/cloudflare/index.d.ts +7 -0
- package/dist/types/cloudflare/tracing.d.ts +53 -0
- package/dist/types/component-utils.d.ts +46 -0
- package/dist/types/components/DefaultDocument.d.ts +13 -0
- package/dist/types/context-var.d.ts +84 -0
- package/dist/types/debug.d.ts +57 -0
- package/dist/types/decode-loader-results.d.ts +5 -0
- package/dist/types/default-error-boundary.d.ts +10 -0
- package/dist/types/defer.d.ts +89 -0
- package/dist/types/deps/browser.d.ts +1 -0
- package/dist/types/deps/html-stream-client.d.ts +1 -0
- package/dist/types/deps/html-stream-server.d.ts +1 -0
- package/dist/types/deps/rsc.d.ts +1 -0
- package/dist/types/deps/ssr.d.ts +1 -0
- package/dist/types/encode-kv.d.ts +35 -0
- package/dist/types/errors.d.ts +226 -0
- package/dist/types/escape-script.d.ts +44 -0
- package/dist/types/handle.d.ts +93 -0
- package/dist/types/handles/MetaTags.d.ts +17 -0
- package/dist/types/handles/Scripts.d.ts +38 -0
- package/dist/types/handles/breadcrumbs.d.ts +43 -0
- package/dist/types/handles/deferred-resolution.d.ts +53 -0
- package/dist/types/handles/is-thenable.d.ts +12 -0
- package/dist/types/handles/meta.d.ts +43 -0
- package/dist/types/handles/script.d.ts +139 -0
- package/dist/types/host/cookie-handler.d.ts +8 -0
- package/dist/types/host/errors.d.ts +40 -0
- package/dist/types/host/index.d.ts +33 -0
- package/dist/types/host/pattern-matcher.d.ts +30 -0
- package/dist/types/host/router.d.ts +12 -0
- package/dist/types/host/testing.d.ts +41 -0
- package/dist/types/host/types.d.ts +148 -0
- package/dist/types/host/utils.d.ts +20 -0
- package/dist/types/href-client.d.ts +214 -0
- package/dist/types/index.d.ts +112 -0
- package/dist/types/index.rsc.d.ts +51 -0
- package/dist/types/internal-debug.d.ts +1 -0
- package/dist/types/loader-store.d.ts +193 -0
- package/dist/types/loader.d.ts +18 -0
- package/dist/types/loader.rsc.d.ts +18 -0
- package/dist/types/missing-id-error.d.ts +1 -0
- package/dist/types/outlet-context.d.ts +12 -0
- package/dist/types/outlet-provider.d.ts +12 -0
- package/dist/types/prerender/build-shell-capture.d.ts +104 -0
- package/dist/types/prerender/param-hash.d.ts +6 -0
- package/dist/types/prerender/shell-manifest-key.d.ts +18 -0
- package/dist/types/prerender/store.d.ts +62 -0
- package/dist/types/prerender.d.ts +292 -0
- package/dist/types/redirect-origin.d.ts +67 -0
- package/dist/types/regex-escape.d.ts +6 -0
- package/dist/types/render-error-thrower.d.ts +13 -0
- package/dist/types/response-utils.d.ts +35 -0
- package/dist/types/reverse.d.ts +206 -0
- package/dist/types/root-error-boundary.d.ts +32 -0
- package/dist/types/route-content-wrapper.d.ts +40 -0
- package/dist/types/route-definition/dsl-helpers.d.ts +130 -0
- package/dist/types/route-definition/helper-factories.d.ts +22 -0
- package/dist/types/route-definition/helpers-types.d.ts +392 -0
- package/dist/types/route-definition/index.d.ts +7 -0
- package/dist/types/route-definition/redirect.d.ts +48 -0
- package/dist/types/route-definition/resolve-handler-use.d.ts +19 -0
- package/dist/types/route-definition/use-item-types.d.ts +1 -0
- package/dist/types/route-definition.d.ts +1 -0
- package/dist/types/route-map-builder.d.ts +127 -0
- package/dist/types/route-name.d.ts +27 -0
- package/dist/types/route-types.d.ts +172 -0
- package/dist/types/router/basename.d.ts +10 -0
- package/dist/types/router/content-negotiation.d.ts +91 -0
- package/dist/types/router/debug-manifest.d.ts +7 -0
- package/dist/types/router/error-handling.d.ts +76 -0
- package/dist/types/router/find-match.d.ts +19 -0
- package/dist/types/router/handler-context.d.ts +41 -0
- package/dist/types/router/instrument.d.ts +161 -0
- package/dist/types/router/intercept-resolution.d.ts +79 -0
- package/dist/types/router/lazy-includes.d.ts +26 -0
- package/dist/types/router/loader-resolution.d.ts +63 -0
- package/dist/types/router/logging.d.ts +41 -0
- package/dist/types/router/manifest.d.ts +8 -0
- package/dist/types/router/match-api.d.ts +19 -0
- package/dist/types/router/match-context.d.ts +184 -0
- package/dist/types/router/match-handlers.d.ts +49 -0
- package/dist/types/router/match-middleware/background-revalidation.d.ts +113 -0
- package/dist/types/router/match-middleware/cache-lookup.d.ts +113 -0
- package/dist/types/router/match-middleware/cache-store.d.ts +112 -0
- package/dist/types/router/match-middleware/index.d.ts +80 -0
- package/dist/types/router/match-middleware/intercept-resolution.d.ts +116 -0
- package/dist/types/router/match-middleware/segment-resolution.d.ts +94 -0
- package/dist/types/router/match-pipelines.d.ts +103 -0
- package/dist/types/router/match-result.d.ts +114 -0
- package/dist/types/router/metrics.d.ts +6 -0
- package/dist/types/router/middleware-types.d.ts +74 -0
- package/dist/types/router/middleware.d.ts +116 -0
- package/dist/types/router/navigation-snapshot.d.ts +22 -0
- package/dist/types/router/params-util.d.ts +8 -0
- package/dist/types/router/parse-pattern.d.ts +38 -0
- package/dist/types/router/pattern-matching.d.ts +169 -0
- package/dist/types/router/prefetch-cache-ttl.d.ts +27 -0
- package/dist/types/router/prefetch-limits.d.ts +20 -0
- package/dist/types/router/prerender-match.d.ts +50 -0
- package/dist/types/router/preview-match.d.ts +22 -0
- package/dist/types/router/request-classification.d.ts +104 -0
- package/dist/types/router/revalidation.d.ts +57 -0
- package/dist/types/router/route-snapshot.d.ts +112 -0
- package/dist/types/router/router-context.d.ts +137 -0
- package/dist/types/router/router-interfaces.d.ts +432 -0
- package/dist/types/router/router-options.d.ts +738 -0
- package/dist/types/router/router-registry.d.ts +15 -0
- package/dist/types/router/segment-resolution/fresh.d.ts +55 -0
- package/dist/types/router/segment-resolution/helpers.d.ts +93 -0
- package/dist/types/router/segment-resolution/loader-cache.d.ts +33 -0
- package/dist/types/router/segment-resolution/loader-mask.d.ts +44 -0
- package/dist/types/router/segment-resolution/loader-snapshot.d.ts +90 -0
- package/dist/types/router/segment-resolution/mask-nested.d.ts +53 -0
- package/dist/types/router/segment-resolution/revalidation.d.ts +85 -0
- package/dist/types/router/segment-resolution/static-store.d.ts +17 -0
- package/dist/types/router/segment-resolution/streamed-handler-telemetry.d.ts +16 -0
- package/dist/types/router/segment-resolution/view-transition-default.d.ts +28 -0
- package/dist/types/router/segment-resolution.d.ts +3 -0
- package/dist/types/router/segment-wrappers.d.ts +53 -0
- package/dist/types/router/state-cookie-name.d.ts +1 -0
- package/dist/types/router/substitute-pattern-params.d.ts +23 -0
- package/dist/types/router/telemetry-otel.d.ts +113 -0
- package/dist/types/router/telemetry.d.ts +216 -0
- package/dist/types/router/timeout.d.ts +96 -0
- package/dist/types/router/tracing.d.ts +125 -0
- package/dist/types/router/trie-matching.d.ts +32 -0
- package/dist/types/router/types.d.ts +98 -0
- package/dist/types/router/url-params.d.ts +26 -0
- package/dist/types/router.d.ts +7 -0
- package/dist/types/rsc/capture-queue.d.ts +6 -0
- package/dist/types/rsc/full-payload.d.ts +22 -0
- package/dist/types/rsc/handler-context.d.ts +31 -0
- package/dist/types/rsc/handler.d.ts +9 -0
- package/dist/types/rsc/helpers.d.ts +124 -0
- package/dist/types/rsc/index.d.ts +17 -0
- package/dist/types/rsc/json-route-result.d.ts +20 -0
- package/dist/types/rsc/loader-fetch.d.ts +14 -0
- package/dist/types/rsc/manifest-init.d.ts +18 -0
- package/dist/types/rsc/nonce.d.ts +28 -0
- package/dist/types/rsc/origin-guard.d.ts +50 -0
- package/dist/types/rsc/progressive-enhancement.d.ts +19 -0
- package/dist/types/rsc/redirect-guard.d.ts +37 -0
- package/dist/types/rsc/render-pipeline.d.ts +138 -0
- package/dist/types/rsc/response-cache-serve.d.ts +46 -0
- package/dist/types/rsc/response-error.d.ts +19 -0
- package/dist/types/rsc/response-route-handler.d.ts +29 -0
- package/dist/types/rsc/rsc-rendering.d.ts +23 -0
- package/dist/types/rsc/runtime-warnings.d.ts +22 -0
- package/dist/types/rsc/server-action.d.ts +68 -0
- package/dist/types/rsc/shell-build-manifest.d.ts +84 -0
- package/dist/types/rsc/shell-capture-constants.d.ts +27 -0
- package/dist/types/rsc/shell-capture.d.ts +374 -0
- package/dist/types/rsc/shell-serve.d.ts +174 -0
- package/dist/types/rsc/ssr-setup.d.ts +73 -0
- package/dist/types/rsc/transition-gate.d.ts +27 -0
- package/dist/types/rsc/types.d.ts +290 -0
- package/dist/types/runtime-env.d.ts +1 -0
- package/dist/types/search-params.d.ts +125 -0
- package/dist/types/segment-content-promise.d.ts +13 -0
- package/dist/types/segment-fragments.d.ts +56 -0
- package/dist/types/segment-loader-promise.d.ts +22 -0
- package/dist/types/segment-system.d.ts +84 -0
- package/dist/types/serialize.d.ts +164 -0
- package/dist/types/server/context.d.ts +494 -0
- package/dist/types/server/cookie-parse.d.ts +10 -0
- package/dist/types/server/cookie-store.d.ts +107 -0
- package/dist/types/server/fetchable-loader-store.d.ts +20 -0
- package/dist/types/server/handle-store.d.ts +100 -0
- package/dist/types/server/loader-registry.d.ts +32 -0
- package/dist/types/server/request-context.d.ts +618 -0
- package/dist/types/server/root-layout.d.ts +3 -0
- package/dist/types/server.d.ts +15 -0
- package/dist/types/ssr/index.d.ts +233 -0
- package/dist/types/ssr/inject-rsc-eager.d.ts +3 -0
- package/dist/types/ssr/preinit-client-references.d.ts +71 -0
- package/dist/types/ssr/ssr-root.d.ts +69 -0
- package/dist/types/static-handler.d.ts +57 -0
- package/dist/types/testing/cache-status.d.ts +63 -0
- package/dist/types/testing/collect-handle.d.ts +20 -0
- package/dist/types/testing/dispatch.d.ts +127 -0
- package/dist/types/testing/dom.entry.d.ts +15 -0
- package/dist/types/testing/e2e/fixture.d.ts +37 -0
- package/dist/types/testing/e2e/index.d.ts +31 -0
- package/dist/types/testing/e2e/matchers.d.ts +17 -0
- package/dist/types/testing/e2e/page-helpers.d.ts +62 -0
- package/dist/types/testing/e2e/parity.d.ts +111 -0
- package/dist/types/testing/e2e/server.d.ts +35 -0
- package/dist/types/testing/flight-matchers.d.ts +55 -0
- package/dist/types/testing/flight-normalize.d.ts +1 -0
- package/dist/types/testing/flight-tree.d.ts +192 -0
- package/dist/types/testing/flight.d.ts +115 -0
- package/dist/types/testing/flight.entry.d.ts +27 -0
- package/dist/types/testing/generated-routes.d.ts +66 -0
- package/dist/types/testing/index.d.ts +54 -0
- package/dist/types/testing/internal/context.d.ts +225 -0
- package/dist/types/testing/internal/flight-client-globals.d.ts +1 -0
- package/dist/types/testing/internal/seed-vars.d.ts +30 -0
- package/dist/types/testing/render-handler.d.ts +160 -0
- package/dist/types/testing/render-route.d.ts +246 -0
- package/dist/types/testing/run-loader.d.ts +186 -0
- package/dist/types/testing/run-middleware.d.ts +132 -0
- package/dist/types/testing/run-transition-when.d.ts +77 -0
- package/dist/types/testing/shell-status.d.ts +58 -0
- package/dist/types/testing/vitest-stubs/cloudflare-email.d.ts +6 -0
- package/dist/types/testing/vitest-stubs/cloudflare-workers.d.ts +13 -0
- package/dist/types/testing/vitest-stubs/plugin-rsc.d.ts +7 -0
- package/dist/types/testing/vitest-stubs/version.d.ts +1 -0
- package/dist/types/testing/vitest.d.ts +205 -0
- package/dist/types/theme/ThemeProvider.d.ts +13 -0
- package/dist/types/theme/ThemeScript.d.ts +45 -0
- package/dist/types/theme/constants.d.ts +39 -0
- package/dist/types/theme/index.d.ts +29 -0
- package/dist/types/theme/theme-context.d.ts +21 -0
- package/dist/types/theme/theme-script.d.ts +26 -0
- package/dist/types/theme/types.d.ts +162 -0
- package/dist/types/theme/use-theme.d.ts +8 -0
- package/dist/types/types/boundaries.d.ts +93 -0
- package/dist/types/types/cache-types.d.ts +191 -0
- package/dist/types/types/error-types.d.ts +114 -0
- package/dist/types/types/global-namespace.d.ts +90 -0
- package/dist/types/types/handler-context.d.ts +658 -0
- package/dist/types/types/index.d.ts +11 -0
- package/dist/types/types/loader-types.d.ts +182 -0
- package/dist/types/types/request-scope.d.ts +93 -0
- package/dist/types/types/route-config.d.ts +105 -0
- package/dist/types/types/route-entry.d.ts +95 -0
- package/dist/types/types/segments.d.ts +234 -0
- package/dist/types/types.d.ts +1 -0
- package/dist/types/urls/include-helper.d.ts +17 -0
- package/dist/types/urls/include-provider.d.ts +27 -0
- package/dist/types/urls/index.d.ts +6 -0
- package/dist/types/urls/path-helper-types.d.ts +197 -0
- package/dist/types/urls/path-helper.d.ts +12 -0
- package/dist/types/urls/pattern-types.d.ts +166 -0
- package/dist/types/urls/response-types.d.ts +67 -0
- package/dist/types/urls/type-extraction.d.ts +157 -0
- package/dist/types/urls/urls-function.d.ts +24 -0
- package/dist/types/urls.d.ts +1 -0
- package/dist/types/use-loader.d.ts +150 -0
- package/dist/types/vercel/index.d.ts +10 -0
- package/dist/types/vercel/tracing.d.ts +70 -0
- package/dist/types/vite/debug.d.ts +80 -0
- package/dist/types/vite/discovery/bundle-postprocess.d.ts +12 -0
- package/dist/types/vite/discovery/dev-prerender-cache.d.ts +65 -0
- package/dist/types/vite/discovery/discover-routers.d.ts +17 -0
- package/dist/types/vite/discovery/discovery-errors.d.ts +113 -0
- package/dist/types/vite/discovery/gate-state.d.ts +79 -0
- package/dist/types/vite/discovery/prerender-collection.d.ts +24 -0
- package/dist/types/vite/discovery/route-types-writer.d.ts +32 -0
- package/dist/types/vite/discovery/self-gen-tracking.d.ts +22 -0
- package/dist/types/vite/discovery/shell-prerender-phase.d.ts +40 -0
- package/dist/types/vite/discovery/state.d.ts +162 -0
- package/dist/types/vite/discovery/virtual-module-codegen.d.ts +15 -0
- package/dist/types/vite/index.d.ts +11 -0
- package/dist/types/vite/inject-client-debug.d.ts +56 -0
- package/dist/types/vite/plugin-types.d.ts +298 -0
- package/dist/types/vite/plugins/cjs-to-esm.d.ts +6 -0
- package/dist/types/vite/plugins/client-ref-dedup.d.ts +40 -0
- package/dist/types/vite/plugins/client-ref-hashing.d.ts +35 -0
- package/dist/types/vite/plugins/cloudflare-protocol-stub.d.ts +64 -0
- package/dist/types/vite/plugins/expose-action-id.d.ts +18 -0
- package/dist/types/vite/plugins/expose-id-utils.d.ts +37 -0
- package/dist/types/vite/plugins/expose-ids/export-analysis.d.ts +19 -0
- package/dist/types/vite/plugins/expose-ids/handler-transform.d.ts +10 -0
- package/dist/types/vite/plugins/expose-ids/loader-transform.d.ts +8 -0
- package/dist/types/vite/plugins/expose-ids/router-transform.d.ts +13 -0
- package/dist/types/vite/plugins/expose-ids/types.d.ts +29 -0
- package/dist/types/vite/plugins/expose-internal-ids.d.ts +6 -0
- package/dist/types/vite/plugins/performance-tracks.d.ts +25 -0
- package/dist/types/vite/plugins/refresh-cmd.d.ts +20 -0
- package/dist/types/vite/plugins/use-cache-transform.d.ts +20 -0
- package/dist/types/vite/plugins/vercel-output.d.ts +85 -0
- package/dist/types/vite/plugins/version-injector.d.ts +21 -0
- package/dist/types/vite/plugins/version-plugin.d.ts +19 -0
- package/dist/types/vite/plugins/virtual-entries.d.ts +36 -0
- package/dist/types/vite/plugins/virtual-stub-plugin.d.ts +7 -0
- package/dist/types/vite/rango.d.ts +29 -0
- package/dist/types/vite/router-discovery.d.ts +23 -0
- package/dist/types/vite/utils/ast-handler-extract.d.ts +64 -0
- package/dist/types/vite/utils/banner.d.ts +2 -0
- package/dist/types/vite/utils/bundle-analysis.d.ts +28 -0
- package/dist/types/vite/utils/client-chunks.d.ts +55 -0
- package/dist/types/vite/utils/directive-prologue.d.ts +16 -0
- package/dist/types/vite/utils/forward-user-plugins.d.ts +37 -0
- package/dist/types/vite/utils/manifest-utils.d.ts +7 -0
- package/dist/types/vite/utils/package-resolution.d.ts +6 -0
- package/dist/types/vite/utils/prerender-utils.d.ts +32 -0
- package/dist/types/vite/utils/shared-utils.d.ts +55 -0
- package/dist/vite/index.js +1051 -361
- package/package.json +39 -33
- package/skills/catalog.json +6 -0
- package/skills/cloudflare/SKILL.md +149 -0
- package/skills/cloudflare/agents/openai.yaml +4 -0
- package/skills/cloudflare/references/d1-and-local-dev.md +131 -0
- package/skills/cloudflare/references/streaming-and-deploy.md +107 -0
- package/skills/cloudflare/references/webhooks-and-crypto.md +147 -0
- package/skills/composability/SKILL.md +14 -0
- package/skills/debug-manifest/SKILL.md +2 -10
- package/skills/links/SKILL.md +12 -0
- package/skills/middleware/SKILL.md +33 -0
- package/skills/migrate-nextjs/SKILL.md +65 -16
- package/skills/migrate-nextjs/backend-host-swap.md +120 -0
- package/skills/migrate-react-router/SKILL.md +6 -6
- package/skills/mime-routes/SKILL.md +25 -17
- package/skills/ppr/SKILL.md +100 -15
- package/skills/prerender/SKILL.md +44 -1
- package/skills/rango/SKILL.md +10 -10
- package/skills/response-routes/SKILL.md +41 -4
- package/skills/route/SKILL.md +6 -0
- package/skills/testing/SKILL.md +1 -0
- package/skills/testing/cache-prerender.md +43 -2
- package/skills/testing/response-routes.md +2 -2
- package/src/browser/event-controller.ts +16 -2
- package/src/browser/rsc-router.tsx +11 -0
- package/src/build/generate-manifest.ts +5 -36
- package/src/build/route-trie.ts +5 -50
- package/src/cache/cache-key-utils.ts +0 -1
- package/src/cache/cache-scope.ts +41 -3
- package/src/cache/cf/cf-cache-store.ts +465 -56
- package/src/cache/cf/cf-cache-types.ts +66 -0
- package/src/cache/cf/cf-tag-marker-memo.ts +5 -2
- package/src/cache/cf/cf-zone-purge.ts +101 -0
- package/src/cache/cf/index.ts +5 -0
- package/src/cache/handle-snapshot.ts +22 -1
- package/src/cache/index.ts +2 -0
- package/src/cache/memory-segment-store.ts +32 -0
- package/src/cache/segment-codec.ts +47 -0
- package/src/cache/shell-snapshot.ts +79 -14
- package/src/cache/types.ts +38 -0
- package/src/cache/vercel/vercel-cache-store.ts +71 -2
- package/src/deps/ssr.ts +4 -1
- package/src/index.rsc.ts +7 -0
- package/src/index.ts +1 -0
- package/src/prerender/build-shell-capture.ts +447 -0
- package/src/prerender/shell-manifest-key.ts +20 -0
- package/src/prerender/store.ts +10 -1
- package/src/prerender.ts +3 -3
- package/src/redirect-origin.ts +37 -8
- package/src/route-map-builder.ts +8 -8
- package/src/router/content-negotiation.ts +47 -5
- package/src/router/handler-context.ts +18 -10
- package/src/router/intercept-resolution.ts +30 -1
- package/src/router/loader-resolution.ts +16 -0
- package/src/router/match-api.ts +9 -2
- package/src/router/match-handlers.ts +13 -0
- package/src/router/match-middleware/cache-lookup.ts +12 -1
- package/src/router/metrics.ts +17 -2
- package/src/router/middleware-types.ts +17 -0
- package/src/router/middleware.ts +4 -0
- package/src/router/prerender-match.ts +28 -0
- package/src/router/router-interfaces.ts +7 -6
- package/src/router/router-options.ts +13 -8
- package/src/router/segment-resolution/fresh.ts +21 -2
- package/src/router/segment-resolution/helpers.ts +1 -1
- package/src/router/segment-resolution/loader-cache.ts +38 -7
- package/src/router/segment-resolution/mask-nested.ts +19 -3
- package/src/router/segment-resolution/revalidation.ts +9 -0
- package/src/router/telemetry-otel.ts +11 -0
- package/src/router/telemetry.ts +1 -0
- package/src/router/timeout.ts +41 -1
- package/src/router.ts +5 -4
- package/src/rsc/capture-queue.ts +67 -0
- package/src/rsc/handler.ts +151 -77
- package/src/rsc/helpers.ts +67 -4
- package/src/rsc/progressive-enhancement.ts +66 -54
- package/src/rsc/redirect-guard.ts +3 -1
- package/src/rsc/render-pipeline.ts +559 -0
- package/src/rsc/response-cache-serve.ts +39 -18
- package/src/rsc/response-route-handler.ts +9 -45
- package/src/rsc/rsc-rendering.ts +303 -103
- package/src/rsc/server-action.ts +50 -42
- package/src/rsc/shell-build-manifest.ts +316 -0
- package/src/rsc/shell-capture-constants.ts +27 -0
- package/src/rsc/shell-capture.ts +595 -69
- package/src/rsc/shell-serve.ts +133 -3
- package/src/rsc/ssr-setup.ts +102 -23
- package/src/segment-fragments.ts +124 -0
- package/src/server/context.ts +184 -8
- package/src/server/request-context.ts +297 -45
- package/src/ssr/index.tsx +167 -32
- package/src/ssr/preinit-client-references.ts +106 -0
- package/src/ssr/ssr-root.tsx +35 -2
- package/src/testing/dispatch.ts +132 -67
- package/src/testing/e2e/index.ts +8 -0
- package/src/testing/index.ts +9 -1
- package/src/testing/internal/context.ts +9 -0
- package/src/testing/render-handler.ts +15 -1
- package/src/testing/run-middleware.ts +14 -0
- package/src/testing/shell-status.ts +100 -0
- package/src/types/handler-context.ts +13 -2
- package/src/urls/path-helper-types.ts +1 -1
- package/src/urls/pattern-types.ts +29 -0
- package/src/vite/discovery/discover-routers.ts +71 -52
- package/src/vite/discovery/prerender-collection.ts +16 -0
- package/src/vite/discovery/shell-prerender-phase.ts +397 -0
- package/src/vite/discovery/state.ts +44 -0
- package/src/vite/discovery/virtual-module-codegen.ts +126 -20
- package/src/vite/index.ts +1 -0
- package/src/vite/plugin-types.ts +33 -0
- package/src/vite/plugins/version-plugin.ts +8 -0
- package/src/vite/plugins/virtual-entries.ts +37 -4
- package/src/vite/rango.ts +42 -2
- package/src/vite/router-discovery.ts +432 -21
- package/src/vite/utils/package-resolution.ts +1 -0
- package/src/vite/utils/prerender-utils.ts +25 -6
- package/src/vite/utils/shared-utils.ts +4 -2
- package/dist/__internal.d.ts +0 -83
- package/dist/__internal.d.ts.map +0 -1
- package/dist/__internal.js +0 -19
- package/dist/__internal.js.map +0 -1
- package/dist/__mocks__/version.d.ts +0 -7
- package/dist/__mocks__/version.d.ts.map +0 -1
- package/dist/__mocks__/version.js +0 -7
- package/dist/__mocks__/version.js.map +0 -1
- package/dist/__tests__/client-href.test.d.ts +0 -2
- package/dist/__tests__/client-href.test.d.ts.map +0 -1
- package/dist/__tests__/client-href.test.js +0 -74
- package/dist/__tests__/client-href.test.js.map +0 -1
- package/dist/__tests__/component-utils.test.d.ts +0 -2
- package/dist/__tests__/component-utils.test.d.ts.map +0 -1
- package/dist/__tests__/component-utils.test.js +0 -51
- package/dist/__tests__/component-utils.test.js.map +0 -1
- package/dist/__tests__/event-controller.test.d.ts +0 -2
- package/dist/__tests__/event-controller.test.d.ts.map +0 -1
- package/dist/__tests__/event-controller.test.js +0 -538
- package/dist/__tests__/event-controller.test.js.map +0 -1
- package/dist/__tests__/helpers/route-tree.d.ts +0 -118
- package/dist/__tests__/helpers/route-tree.d.ts.map +0 -1
- package/dist/__tests__/helpers/route-tree.js +0 -374
- package/dist/__tests__/helpers/route-tree.js.map +0 -1
- package/dist/__tests__/match-result.test.d.ts +0 -2
- package/dist/__tests__/match-result.test.d.ts.map +0 -1
- package/dist/__tests__/match-result.test.js +0 -154
- package/dist/__tests__/match-result.test.js.map +0 -1
- package/dist/__tests__/navigation-store.test.d.ts +0 -2
- package/dist/__tests__/navigation-store.test.d.ts.map +0 -1
- package/dist/__tests__/navigation-store.test.js +0 -440
- package/dist/__tests__/navigation-store.test.js.map +0 -1
- package/dist/__tests__/partial-update.test.d.ts +0 -2
- package/dist/__tests__/partial-update.test.d.ts.map +0 -1
- package/dist/__tests__/partial-update.test.js +0 -1009
- package/dist/__tests__/partial-update.test.js.map +0 -1
- package/dist/__tests__/reverse-types.test.d.ts +0 -8
- package/dist/__tests__/reverse-types.test.d.ts.map +0 -1
- package/dist/__tests__/reverse-types.test.js +0 -656
- package/dist/__tests__/reverse-types.test.js.map +0 -1
- package/dist/__tests__/route-definition.test.d.ts +0 -2
- package/dist/__tests__/route-definition.test.d.ts.map +0 -1
- package/dist/__tests__/route-definition.test.js +0 -55
- package/dist/__tests__/route-definition.test.js.map +0 -1
- package/dist/__tests__/router-helpers.test.d.ts +0 -2
- package/dist/__tests__/router-helpers.test.d.ts.map +0 -1
- package/dist/__tests__/router-helpers.test.js +0 -377
- package/dist/__tests__/router-helpers.test.js.map +0 -1
- package/dist/__tests__/router-integration-2.test.d.ts +0 -2
- package/dist/__tests__/router-integration-2.test.d.ts.map +0 -1
- package/dist/__tests__/router-integration-2.test.js +0 -426
- package/dist/__tests__/router-integration-2.test.js.map +0 -1
- package/dist/__tests__/router-integration.test.d.ts +0 -2
- package/dist/__tests__/router-integration.test.d.ts.map +0 -1
- package/dist/__tests__/router-integration.test.js +0 -1051
- package/dist/__tests__/router-integration.test.js.map +0 -1
- package/dist/__tests__/search-params.test.d.ts +0 -5
- package/dist/__tests__/search-params.test.d.ts.map +0 -1
- package/dist/__tests__/search-params.test.js +0 -306
- package/dist/__tests__/search-params.test.js.map +0 -1
- package/dist/__tests__/segment-system.test.d.ts +0 -2
- package/dist/__tests__/segment-system.test.d.ts.map +0 -1
- package/dist/__tests__/segment-system.test.js +0 -627
- package/dist/__tests__/segment-system.test.js.map +0 -1
- package/dist/__tests__/static-handler-types.test.d.ts +0 -8
- package/dist/__tests__/static-handler-types.test.d.ts.map +0 -1
- package/dist/__tests__/static-handler-types.test.js +0 -63
- package/dist/__tests__/static-handler-types.test.js.map +0 -1
- package/dist/__tests__/urls.test.d.ts +0 -2
- package/dist/__tests__/urls.test.d.ts.map +0 -1
- package/dist/__tests__/urls.test.js +0 -421
- package/dist/__tests__/urls.test.js.map +0 -1
- package/dist/__tests__/use-mount.test.d.ts +0 -2
- package/dist/__tests__/use-mount.test.d.ts.map +0 -1
- package/dist/__tests__/use-mount.test.js +0 -35
- package/dist/__tests__/use-mount.test.js.map +0 -1
- package/dist/bin/rango.d.ts +0 -2
- package/dist/bin/rango.d.ts.map +0 -1
- package/dist/bin/rango.js.map +0 -1
- package/dist/browser/event-controller.d.ts +0 -191
- package/dist/browser/event-controller.d.ts.map +0 -1
- package/dist/browser/event-controller.js +0 -559
- package/dist/browser/event-controller.js.map +0 -1
- package/dist/browser/index.d.ts +0 -2
- package/dist/browser/index.d.ts.map +0 -1
- package/dist/browser/index.js +0 -14
- package/dist/browser/index.js.map +0 -1
- package/dist/browser/link-interceptor.d.ts +0 -38
- package/dist/browser/link-interceptor.d.ts.map +0 -1
- package/dist/browser/link-interceptor.js +0 -99
- package/dist/browser/link-interceptor.js.map +0 -1
- package/dist/browser/logging.d.ts +0 -10
- package/dist/browser/logging.d.ts.map +0 -1
- package/dist/browser/logging.js +0 -29
- package/dist/browser/logging.js.map +0 -1
- package/dist/browser/lru-cache.d.ts +0 -17
- package/dist/browser/lru-cache.d.ts.map +0 -1
- package/dist/browser/lru-cache.js +0 -50
- package/dist/browser/lru-cache.js.map +0 -1
- package/dist/browser/merge-segment-loaders.d.ts +0 -39
- package/dist/browser/merge-segment-loaders.d.ts.map +0 -1
- package/dist/browser/merge-segment-loaders.js +0 -102
- package/dist/browser/merge-segment-loaders.js.map +0 -1
- package/dist/browser/navigation-bridge.d.ts +0 -102
- package/dist/browser/navigation-bridge.d.ts.map +0 -1
- package/dist/browser/navigation-bridge.js +0 -708
- package/dist/browser/navigation-bridge.js.map +0 -1
- package/dist/browser/navigation-client.d.ts +0 -25
- package/dist/browser/navigation-client.d.ts.map +0 -1
- package/dist/browser/navigation-client.js +0 -157
- package/dist/browser/navigation-client.js.map +0 -1
- package/dist/browser/navigation-store.d.ts +0 -101
- package/dist/browser/navigation-store.d.ts.map +0 -1
- package/dist/browser/navigation-store.js +0 -625
- package/dist/browser/navigation-store.js.map +0 -1
- package/dist/browser/partial-update.d.ts +0 -75
- package/dist/browser/partial-update.d.ts.map +0 -1
- package/dist/browser/partial-update.js +0 -426
- package/dist/browser/partial-update.js.map +0 -1
- package/dist/browser/react/Link.d.ts +0 -86
- package/dist/browser/react/Link.d.ts.map +0 -1
- package/dist/browser/react/Link.js +0 -128
- package/dist/browser/react/Link.js.map +0 -1
- package/dist/browser/react/NavigationProvider.d.ts +0 -63
- package/dist/browser/react/NavigationProvider.d.ts.map +0 -1
- package/dist/browser/react/NavigationProvider.js +0 -216
- package/dist/browser/react/NavigationProvider.js.map +0 -1
- package/dist/browser/react/ScrollRestoration.d.ts +0 -75
- package/dist/browser/react/ScrollRestoration.d.ts.map +0 -1
- package/dist/browser/react/ScrollRestoration.js +0 -57
- package/dist/browser/react/ScrollRestoration.js.map +0 -1
- package/dist/browser/react/context.d.ts +0 -46
- package/dist/browser/react/context.d.ts.map +0 -1
- package/dist/browser/react/context.js +0 -10
- package/dist/browser/react/context.js.map +0 -1
- package/dist/browser/react/index.d.ts +0 -11
- package/dist/browser/react/index.d.ts.map +0 -1
- package/dist/browser/react/index.js +0 -22
- package/dist/browser/react/index.js.map +0 -1
- package/dist/browser/react/location-state-shared.d.ts +0 -63
- package/dist/browser/react/location-state-shared.d.ts.map +0 -1
- package/dist/browser/react/location-state-shared.js +0 -81
- package/dist/browser/react/location-state-shared.js.map +0 -1
- package/dist/browser/react/location-state.d.ts +0 -23
- package/dist/browser/react/location-state.d.ts.map +0 -1
- package/dist/browser/react/location-state.js +0 -29
- package/dist/browser/react/location-state.js.map +0 -1
- package/dist/browser/react/mount-context.d.ts +0 -24
- package/dist/browser/react/mount-context.d.ts.map +0 -1
- package/dist/browser/react/mount-context.js +0 -24
- package/dist/browser/react/mount-context.js.map +0 -1
- package/dist/browser/react/use-action.d.ts +0 -64
- package/dist/browser/react/use-action.d.ts.map +0 -1
- package/dist/browser/react/use-action.js +0 -134
- package/dist/browser/react/use-action.js.map +0 -1
- package/dist/browser/react/use-client-cache.d.ts +0 -41
- package/dist/browser/react/use-client-cache.d.ts.map +0 -1
- package/dist/browser/react/use-client-cache.js +0 -39
- package/dist/browser/react/use-client-cache.js.map +0 -1
- package/dist/browser/react/use-handle.d.ts +0 -31
- package/dist/browser/react/use-handle.d.ts.map +0 -1
- package/dist/browser/react/use-handle.js +0 -144
- package/dist/browser/react/use-handle.js.map +0 -1
- package/dist/browser/react/use-href.d.ts +0 -33
- package/dist/browser/react/use-href.d.ts.map +0 -1
- package/dist/browser/react/use-href.js +0 -39
- package/dist/browser/react/use-href.js.map +0 -1
- package/dist/browser/react/use-link-status.d.ts +0 -37
- package/dist/browser/react/use-link-status.d.ts.map +0 -1
- package/dist/browser/react/use-link-status.js +0 -99
- package/dist/browser/react/use-link-status.js.map +0 -1
- package/dist/browser/react/use-mount.d.ts +0 -25
- package/dist/browser/react/use-mount.d.ts.map +0 -1
- package/dist/browser/react/use-mount.js +0 -30
- package/dist/browser/react/use-mount.js.map +0 -1
- package/dist/browser/react/use-navigation.d.ts +0 -27
- package/dist/browser/react/use-navigation.d.ts.map +0 -1
- package/dist/browser/react/use-navigation.js +0 -87
- package/dist/browser/react/use-navigation.js.map +0 -1
- package/dist/browser/react/use-segments.d.ts +0 -38
- package/dist/browser/react/use-segments.d.ts.map +0 -1
- package/dist/browser/react/use-segments.js +0 -130
- package/dist/browser/react/use-segments.js.map +0 -1
- package/dist/browser/request-controller.d.ts +0 -26
- package/dist/browser/request-controller.d.ts.map +0 -1
- package/dist/browser/request-controller.js +0 -147
- package/dist/browser/request-controller.js.map +0 -1
- package/dist/browser/rsc-router.d.ts +0 -129
- package/dist/browser/rsc-router.d.ts.map +0 -1
- package/dist/browser/rsc-router.js +0 -195
- package/dist/browser/rsc-router.js.map +0 -1
- package/dist/browser/scroll-restoration.d.ts +0 -93
- package/dist/browser/scroll-restoration.d.ts.map +0 -1
- package/dist/browser/scroll-restoration.js +0 -321
- package/dist/browser/scroll-restoration.js.map +0 -1
- package/dist/browser/segment-structure-assert.d.ts +0 -17
- package/dist/browser/segment-structure-assert.d.ts.map +0 -1
- package/dist/browser/segment-structure-assert.js +0 -59
- package/dist/browser/segment-structure-assert.js.map +0 -1
- package/dist/browser/server-action-bridge.d.ts +0 -26
- package/dist/browser/server-action-bridge.d.ts.map +0 -1
- package/dist/browser/server-action-bridge.js +0 -668
- package/dist/browser/server-action-bridge.js.map +0 -1
- package/dist/browser/shallow.d.ts +0 -12
- package/dist/browser/shallow.d.ts.map +0 -1
- package/dist/browser/shallow.js +0 -34
- package/dist/browser/shallow.js.map +0 -1
- package/dist/browser/types.d.ts +0 -369
- package/dist/browser/types.d.ts.map +0 -1
- package/dist/browser/types.js +0 -2
- package/dist/browser/types.js.map +0 -1
- package/dist/build/__tests__/generate-cli.test.d.ts +0 -2
- package/dist/build/__tests__/generate-cli.test.d.ts.map +0 -1
- package/dist/build/__tests__/generate-cli.test.js +0 -237
- package/dist/build/__tests__/generate-cli.test.js.map +0 -1
- package/dist/build/__tests__/generate-manifest.test.d.ts +0 -2
- package/dist/build/__tests__/generate-manifest.test.d.ts.map +0 -1
- package/dist/build/__tests__/generate-manifest.test.js +0 -119
- package/dist/build/__tests__/generate-manifest.test.js.map +0 -1
- package/dist/build/__tests__/generate-route-types.test.d.ts +0 -2
- package/dist/build/__tests__/generate-route-types.test.d.ts.map +0 -1
- package/dist/build/__tests__/generate-route-types.test.js +0 -620
- package/dist/build/__tests__/generate-route-types.test.js.map +0 -1
- package/dist/build/__tests__/per-router-manifest.test.d.ts +0 -2
- package/dist/build/__tests__/per-router-manifest.test.d.ts.map +0 -1
- package/dist/build/__tests__/per-router-manifest.test.js +0 -308
- package/dist/build/__tests__/per-router-manifest.test.js.map +0 -1
- package/dist/build/generate-manifest.d.ts +0 -81
- package/dist/build/generate-manifest.d.ts.map +0 -1
- package/dist/build/generate-manifest.js +0 -276
- package/dist/build/generate-manifest.js.map +0 -1
- package/dist/build/generate-route-types.d.ts +0 -115
- package/dist/build/generate-route-types.d.ts.map +0 -1
- package/dist/build/generate-route-types.js +0 -740
- package/dist/build/generate-route-types.js.map +0 -1
- package/dist/build/index.d.ts +0 -21
- package/dist/build/index.d.ts.map +0 -1
- package/dist/build/index.js +0 -21
- package/dist/build/index.js.map +0 -1
- package/dist/build/route-trie.d.ts +0 -71
- package/dist/build/route-trie.d.ts.map +0 -1
- package/dist/build/route-trie.js +0 -175
- package/dist/build/route-trie.js.map +0 -1
- package/dist/cache/__tests__/cache-scope.test.d.ts +0 -2
- package/dist/cache/__tests__/cache-scope.test.d.ts.map +0 -1
- package/dist/cache/__tests__/cache-scope.test.js +0 -208
- package/dist/cache/__tests__/cache-scope.test.js.map +0 -1
- package/dist/cache/__tests__/document-cache.test.d.ts +0 -2
- package/dist/cache/__tests__/document-cache.test.d.ts.map +0 -1
- package/dist/cache/__tests__/document-cache.test.js +0 -345
- package/dist/cache/__tests__/document-cache.test.js.map +0 -1
- package/dist/cache/__tests__/memory-segment-store.test.d.ts +0 -2
- package/dist/cache/__tests__/memory-segment-store.test.d.ts.map +0 -1
- package/dist/cache/__tests__/memory-segment-store.test.js +0 -425
- package/dist/cache/__tests__/memory-segment-store.test.js.map +0 -1
- package/dist/cache/__tests__/memory-store.test.d.ts +0 -2
- package/dist/cache/__tests__/memory-store.test.d.ts.map +0 -1
- package/dist/cache/__tests__/memory-store.test.js +0 -367
- package/dist/cache/__tests__/memory-store.test.js.map +0 -1
- package/dist/cache/cache-scope.d.ts +0 -102
- package/dist/cache/cache-scope.d.ts.map +0 -1
- package/dist/cache/cache-scope.js +0 -440
- package/dist/cache/cache-scope.js.map +0 -1
- package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts +0 -2
- package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts.map +0 -1
- package/dist/cache/cf/__tests__/cf-cache-store.test.js +0 -330
- package/dist/cache/cf/__tests__/cf-cache-store.test.js.map +0 -1
- package/dist/cache/cf/cf-cache-store.d.ts +0 -165
- package/dist/cache/cf/cf-cache-store.d.ts.map +0 -1
- package/dist/cache/cf/cf-cache-store.js +0 -242
- package/dist/cache/cf/cf-cache-store.js.map +0 -1
- package/dist/cache/cf/index.d.ts +0 -14
- package/dist/cache/cf/index.d.ts.map +0 -1
- package/dist/cache/cf/index.js +0 -17
- package/dist/cache/cf/index.js.map +0 -1
- package/dist/cache/document-cache.d.ts +0 -64
- package/dist/cache/document-cache.d.ts.map +0 -1
- package/dist/cache/document-cache.js +0 -228
- package/dist/cache/document-cache.js.map +0 -1
- package/dist/cache/index.d.ts +0 -19
- package/dist/cache/index.d.ts.map +0 -1
- package/dist/cache/index.js +0 -21
- package/dist/cache/index.js.map +0 -1
- package/dist/cache/memory-segment-store.d.ts +0 -110
- package/dist/cache/memory-segment-store.d.ts.map +0 -1
- package/dist/cache/memory-segment-store.js +0 -117
- package/dist/cache/memory-segment-store.js.map +0 -1
- package/dist/cache/memory-store.d.ts +0 -41
- package/dist/cache/memory-store.d.ts.map +0 -1
- package/dist/cache/memory-store.js +0 -191
- package/dist/cache/memory-store.js.map +0 -1
- package/dist/cache/types.d.ts +0 -317
- package/dist/cache/types.d.ts.map +0 -1
- package/dist/cache/types.js +0 -12
- package/dist/cache/types.js.map +0 -1
- package/dist/client.d.ts +0 -248
- package/dist/client.d.ts.map +0 -1
- package/dist/client.js +0 -367
- package/dist/client.js.map +0 -1
- package/dist/client.rsc.d.ts +0 -26
- package/dist/client.rsc.d.ts.map +0 -1
- package/dist/client.rsc.js +0 -46
- package/dist/client.rsc.js.map +0 -1
- package/dist/component-utils.d.ts +0 -36
- package/dist/component-utils.d.ts.map +0 -1
- package/dist/component-utils.js +0 -61
- package/dist/component-utils.js.map +0 -1
- package/dist/components/DefaultDocument.d.ts +0 -13
- package/dist/components/DefaultDocument.d.ts.map +0 -1
- package/dist/components/DefaultDocument.js +0 -15
- package/dist/components/DefaultDocument.js.map +0 -1
- package/dist/debug.d.ts +0 -58
- package/dist/debug.d.ts.map +0 -1
- package/dist/debug.js +0 -157
- package/dist/debug.js.map +0 -1
- package/dist/default-error-boundary.d.ts +0 -11
- package/dist/default-error-boundary.d.ts.map +0 -1
- package/dist/default-error-boundary.js +0 -45
- package/dist/default-error-boundary.js.map +0 -1
- package/dist/deps/browser.d.ts +0 -2
- package/dist/deps/browser.d.ts.map +0 -1
- package/dist/deps/browser.js +0 -3
- package/dist/deps/browser.js.map +0 -1
- package/dist/deps/html-stream-client.d.ts +0 -2
- package/dist/deps/html-stream-client.d.ts.map +0 -1
- package/dist/deps/html-stream-client.js +0 -3
- package/dist/deps/html-stream-client.js.map +0 -1
- package/dist/deps/html-stream-server.d.ts +0 -2
- package/dist/deps/html-stream-server.d.ts.map +0 -1
- package/dist/deps/html-stream-server.js +0 -3
- package/dist/deps/html-stream-server.js.map +0 -1
- package/dist/deps/rsc.d.ts +0 -2
- package/dist/deps/rsc.d.ts.map +0 -1
- package/dist/deps/rsc.js +0 -4
- package/dist/deps/rsc.js.map +0 -1
- package/dist/deps/ssr.d.ts +0 -2
- package/dist/deps/ssr.d.ts.map +0 -1
- package/dist/deps/ssr.js +0 -3
- package/dist/deps/ssr.js.map +0 -1
- package/dist/errors.d.ts +0 -174
- package/dist/errors.d.ts.map +0 -1
- package/dist/errors.js +0 -241
- package/dist/errors.js.map +0 -1
- package/dist/handle.d.ts +0 -78
- package/dist/handle.d.ts.map +0 -1
- package/dist/handle.js +0 -82
- package/dist/handle.js.map +0 -1
- package/dist/handles/MetaTags.d.ts +0 -14
- package/dist/handles/MetaTags.d.ts.map +0 -1
- package/dist/handles/MetaTags.js +0 -136
- package/dist/handles/MetaTags.js.map +0 -1
- package/dist/handles/index.d.ts +0 -6
- package/dist/handles/index.d.ts.map +0 -1
- package/dist/handles/index.js +0 -6
- package/dist/handles/index.js.map +0 -1
- package/dist/handles/meta.d.ts +0 -39
- package/dist/handles/meta.d.ts.map +0 -1
- package/dist/handles/meta.js +0 -202
- package/dist/handles/meta.js.map +0 -1
- package/dist/host/__tests__/errors.test.d.ts +0 -2
- package/dist/host/__tests__/errors.test.d.ts.map +0 -1
- package/dist/host/__tests__/errors.test.js +0 -76
- package/dist/host/__tests__/errors.test.js.map +0 -1
- package/dist/host/__tests__/pattern-comprehensive.test.d.ts +0 -2
- package/dist/host/__tests__/pattern-comprehensive.test.d.ts.map +0 -1
- package/dist/host/__tests__/pattern-comprehensive.test.js +0 -732
- package/dist/host/__tests__/pattern-comprehensive.test.js.map +0 -1
- package/dist/host/__tests__/pattern-matcher.test.d.ts +0 -2
- package/dist/host/__tests__/pattern-matcher.test.d.ts.map +0 -1
- package/dist/host/__tests__/pattern-matcher.test.js +0 -251
- package/dist/host/__tests__/pattern-matcher.test.js.map +0 -1
- package/dist/host/__tests__/router.test.d.ts +0 -2
- package/dist/host/__tests__/router.test.d.ts.map +0 -1
- package/dist/host/__tests__/router.test.js +0 -241
- package/dist/host/__tests__/router.test.js.map +0 -1
- package/dist/host/__tests__/testing.test.d.ts +0 -2
- package/dist/host/__tests__/testing.test.d.ts.map +0 -1
- package/dist/host/__tests__/testing.test.js +0 -64
- package/dist/host/__tests__/testing.test.js.map +0 -1
- package/dist/host/__tests__/utils.test.d.ts +0 -2
- package/dist/host/__tests__/utils.test.d.ts.map +0 -1
- package/dist/host/__tests__/utils.test.js +0 -29
- package/dist/host/__tests__/utils.test.js.map +0 -1
- package/dist/host/cookie-handler.d.ts +0 -34
- package/dist/host/cookie-handler.d.ts.map +0 -1
- package/dist/host/cookie-handler.js +0 -124
- package/dist/host/cookie-handler.js.map +0 -1
- package/dist/host/errors.d.ts +0 -56
- package/dist/host/errors.d.ts.map +0 -1
- package/dist/host/errors.js +0 -79
- package/dist/host/errors.js.map +0 -1
- package/dist/host/index.d.ts +0 -29
- package/dist/host/index.d.ts.map +0 -1
- package/dist/host/index.js +0 -32
- package/dist/host/index.js.map +0 -1
- package/dist/host/pattern-matcher.d.ts +0 -36
- package/dist/host/pattern-matcher.d.ts.map +0 -1
- package/dist/host/pattern-matcher.js +0 -172
- package/dist/host/pattern-matcher.js.map +0 -1
- package/dist/host/router.d.ts +0 -26
- package/dist/host/router.d.ts.map +0 -1
- package/dist/host/router.js +0 -218
- package/dist/host/router.js.map +0 -1
- package/dist/host/testing.d.ts +0 -36
- package/dist/host/testing.d.ts.map +0 -1
- package/dist/host/testing.js +0 -55
- package/dist/host/testing.js.map +0 -1
- package/dist/host/types.d.ts +0 -115
- package/dist/host/types.d.ts.map +0 -1
- package/dist/host/types.js +0 -7
- package/dist/host/types.js.map +0 -1
- package/dist/host/utils.d.ts +0 -21
- package/dist/host/utils.d.ts.map +0 -1
- package/dist/host/utils.js +0 -23
- package/dist/host/utils.js.map +0 -1
- package/dist/href-client.d.ts +0 -131
- package/dist/href-client.d.ts.map +0 -1
- package/dist/href-client.js +0 -64
- package/dist/href-client.js.map +0 -1
- package/dist/href-context.d.ts +0 -29
- package/dist/href-context.d.ts.map +0 -1
- package/dist/href-context.js +0 -21
- package/dist/href-context.js.map +0 -1
- package/dist/index.d.ts +0 -73
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -91
- package/dist/index.js.map +0 -1
- package/dist/index.rsc.d.ts +0 -32
- package/dist/index.rsc.d.ts.map +0 -1
- package/dist/index.rsc.js +0 -40
- package/dist/index.rsc.js.map +0 -1
- package/dist/internal-debug.d.ts +0 -2
- package/dist/internal-debug.d.ts.map +0 -1
- package/dist/internal-debug.js +0 -5
- package/dist/internal-debug.js.map +0 -1
- package/dist/loader.d.ts +0 -14
- package/dist/loader.d.ts.map +0 -1
- package/dist/loader.js +0 -20
- package/dist/loader.js.map +0 -1
- package/dist/loader.rsc.d.ts +0 -19
- package/dist/loader.rsc.d.ts.map +0 -1
- package/dist/loader.rsc.js +0 -99
- package/dist/loader.rsc.js.map +0 -1
- package/dist/network-error-thrower.d.ts +0 -17
- package/dist/network-error-thrower.d.ts.map +0 -1
- package/dist/network-error-thrower.js +0 -14
- package/dist/network-error-thrower.js.map +0 -1
- package/dist/outlet-context.d.ts +0 -13
- package/dist/outlet-context.d.ts.map +0 -1
- package/dist/outlet-context.js +0 -3
- package/dist/outlet-context.js.map +0 -1
- package/dist/prerender/__tests__/param-hash.test.d.ts +0 -2
- package/dist/prerender/__tests__/param-hash.test.d.ts.map +0 -1
- package/dist/prerender/__tests__/param-hash.test.js +0 -148
- package/dist/prerender/__tests__/param-hash.test.js.map +0 -1
- package/dist/prerender/param-hash.d.ts +0 -16
- package/dist/prerender/param-hash.d.ts.map +0 -1
- package/dist/prerender/param-hash.js +0 -36
- package/dist/prerender/param-hash.js.map +0 -1
- package/dist/prerender/store.d.ts +0 -38
- package/dist/prerender/store.d.ts.map +0 -1
- package/dist/prerender/store.js +0 -61
- package/dist/prerender/store.js.map +0 -1
- package/dist/prerender.d.ts +0 -66
- package/dist/prerender.d.ts.map +0 -1
- package/dist/prerender.js +0 -57
- package/dist/prerender.js.map +0 -1
- package/dist/reverse.d.ts +0 -196
- package/dist/reverse.d.ts.map +0 -1
- package/dist/reverse.js +0 -78
- package/dist/reverse.js.map +0 -1
- package/dist/root-error-boundary.d.ts +0 -33
- package/dist/root-error-boundary.d.ts.map +0 -1
- package/dist/root-error-boundary.js +0 -165
- package/dist/root-error-boundary.js.map +0 -1
- package/dist/route-content-wrapper.d.ts +0 -46
- package/dist/route-content-wrapper.d.ts.map +0 -1
- package/dist/route-content-wrapper.js +0 -77
- package/dist/route-content-wrapper.js.map +0 -1
- package/dist/route-definition.d.ts +0 -421
- package/dist/route-definition.d.ts.map +0 -1
- package/dist/route-definition.js +0 -868
- package/dist/route-definition.js.map +0 -1
- package/dist/route-map-builder.d.ts +0 -155
- package/dist/route-map-builder.d.ts.map +0 -1
- package/dist/route-map-builder.js +0 -237
- package/dist/route-map-builder.js.map +0 -1
- package/dist/route-types.d.ts +0 -165
- package/dist/route-types.d.ts.map +0 -1
- package/dist/route-types.js +0 -7
- package/dist/route-types.js.map +0 -1
- package/dist/router/__tests__/handler-context.test.d.ts +0 -2
- package/dist/router/__tests__/handler-context.test.d.ts.map +0 -1
- package/dist/router/__tests__/handler-context.test.js +0 -65
- package/dist/router/__tests__/handler-context.test.js.map +0 -1
- package/dist/router/__tests__/loader-cycle-detection.test.d.ts +0 -2
- package/dist/router/__tests__/loader-cycle-detection.test.d.ts.map +0 -1
- package/dist/router/__tests__/loader-cycle-detection.test.js +0 -221
- package/dist/router/__tests__/loader-cycle-detection.test.js.map +0 -1
- package/dist/router/__tests__/match-context.test.d.ts +0 -2
- package/dist/router/__tests__/match-context.test.d.ts.map +0 -1
- package/dist/router/__tests__/match-context.test.js +0 -92
- package/dist/router/__tests__/match-context.test.js.map +0 -1
- package/dist/router/__tests__/match-pipelines.test.d.ts +0 -2
- package/dist/router/__tests__/match-pipelines.test.d.ts.map +0 -1
- package/dist/router/__tests__/match-pipelines.test.js +0 -417
- package/dist/router/__tests__/match-pipelines.test.js.map +0 -1
- package/dist/router/__tests__/match-result.test.d.ts +0 -2
- package/dist/router/__tests__/match-result.test.d.ts.map +0 -1
- package/dist/router/__tests__/match-result.test.js +0 -457
- package/dist/router/__tests__/match-result.test.js.map +0 -1
- package/dist/router/__tests__/on-error.test.d.ts +0 -2
- package/dist/router/__tests__/on-error.test.d.ts.map +0 -1
- package/dist/router/__tests__/on-error.test.js +0 -678
- package/dist/router/__tests__/on-error.test.js.map +0 -1
- package/dist/router/__tests__/pattern-matching.test.d.ts +0 -2
- package/dist/router/__tests__/pattern-matching.test.d.ts.map +0 -1
- package/dist/router/__tests__/pattern-matching.test.js +0 -629
- package/dist/router/__tests__/pattern-matching.test.js.map +0 -1
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts +0 -2
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts.map +0 -1
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.js +0 -155
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.js.map +0 -1
- package/dist/router/error-handling.d.ts +0 -77
- package/dist/router/error-handling.d.ts.map +0 -1
- package/dist/router/error-handling.js +0 -202
- package/dist/router/error-handling.js.map +0 -1
- package/dist/router/handler-context.d.ts +0 -20
- package/dist/router/handler-context.d.ts.map +0 -1
- package/dist/router/handler-context.js +0 -198
- package/dist/router/handler-context.js.map +0 -1
- package/dist/router/intercept-resolution.d.ts +0 -66
- package/dist/router/intercept-resolution.d.ts.map +0 -1
- package/dist/router/intercept-resolution.js +0 -246
- package/dist/router/intercept-resolution.js.map +0 -1
- package/dist/router/loader-resolution.d.ts +0 -64
- package/dist/router/loader-resolution.d.ts.map +0 -1
- package/dist/router/loader-resolution.js +0 -284
- package/dist/router/loader-resolution.js.map +0 -1
- package/dist/router/logging.d.ts +0 -15
- package/dist/router/logging.d.ts.map +0 -1
- package/dist/router/logging.js +0 -99
- package/dist/router/logging.js.map +0 -1
- package/dist/router/manifest.d.ts +0 -22
- package/dist/router/manifest.d.ts.map +0 -1
- package/dist/router/manifest.js +0 -181
- package/dist/router/manifest.js.map +0 -1
- package/dist/router/match-api.d.ts +0 -35
- package/dist/router/match-api.d.ts.map +0 -1
- package/dist/router/match-api.js +0 -406
- package/dist/router/match-api.js.map +0 -1
- package/dist/router/match-context.d.ts +0 -206
- package/dist/router/match-context.d.ts.map +0 -1
- package/dist/router/match-context.js +0 -17
- package/dist/router/match-context.js.map +0 -1
- package/dist/router/match-middleware/background-revalidation.d.ts +0 -127
- package/dist/router/match-middleware/background-revalidation.d.ts.map +0 -1
- package/dist/router/match-middleware/background-revalidation.js +0 -75
- package/dist/router/match-middleware/background-revalidation.js.map +0 -1
- package/dist/router/match-middleware/cache-lookup.d.ts +0 -112
- package/dist/router/match-middleware/cache-lookup.d.ts.map +0 -1
- package/dist/router/match-middleware/cache-lookup.js +0 -257
- package/dist/router/match-middleware/cache-lookup.js.map +0 -1
- package/dist/router/match-middleware/cache-store.d.ts +0 -113
- package/dist/router/match-middleware/cache-store.d.ts.map +0 -1
- package/dist/router/match-middleware/cache-store.js +0 -108
- package/dist/router/match-middleware/cache-store.js.map +0 -1
- package/dist/router/match-middleware/index.d.ts +0 -81
- package/dist/router/match-middleware/index.d.ts.map +0 -1
- package/dist/router/match-middleware/index.js +0 -80
- package/dist/router/match-middleware/index.js.map +0 -1
- package/dist/router/match-middleware/intercept-resolution.d.ts +0 -117
- package/dist/router/match-middleware/intercept-resolution.d.ts.map +0 -1
- package/dist/router/match-middleware/intercept-resolution.js +0 -134
- package/dist/router/match-middleware/intercept-resolution.js.map +0 -1
- package/dist/router/match-middleware/segment-resolution.d.ts +0 -99
- package/dist/router/match-middleware/segment-resolution.d.ts.map +0 -1
- package/dist/router/match-middleware/segment-resolution.js +0 -53
- package/dist/router/match-middleware/segment-resolution.js.map +0 -1
- package/dist/router/match-pipelines.d.ts +0 -147
- package/dist/router/match-pipelines.d.ts.map +0 -1
- package/dist/router/match-pipelines.js +0 -82
- package/dist/router/match-pipelines.js.map +0 -1
- package/dist/router/match-result.d.ts +0 -126
- package/dist/router/match-result.d.ts.map +0 -1
- package/dist/router/match-result.js +0 -93
- package/dist/router/match-result.js.map +0 -1
- package/dist/router/metrics.d.ts +0 -20
- package/dist/router/metrics.d.ts.map +0 -1
- package/dist/router/metrics.js +0 -47
- package/dist/router/metrics.js.map +0 -1
- package/dist/router/middleware.d.ts +0 -249
- package/dist/router/middleware.d.ts.map +0 -1
- package/dist/router/middleware.js +0 -434
- package/dist/router/middleware.js.map +0 -1
- package/dist/router/middleware.test.d.ts +0 -2
- package/dist/router/middleware.test.d.ts.map +0 -1
- package/dist/router/middleware.test.js +0 -816
- package/dist/router/middleware.test.js.map +0 -1
- package/dist/router/pattern-matching.d.ts +0 -149
- package/dist/router/pattern-matching.d.ts.map +0 -1
- package/dist/router/pattern-matching.js +0 -349
- package/dist/router/pattern-matching.js.map +0 -1
- package/dist/router/revalidation.d.ts +0 -44
- package/dist/router/revalidation.d.ts.map +0 -1
- package/dist/router/revalidation.js +0 -147
- package/dist/router/revalidation.js.map +0 -1
- package/dist/router/router-context.d.ts +0 -135
- package/dist/router/router-context.d.ts.map +0 -1
- package/dist/router/router-context.js +0 -36
- package/dist/router/router-context.js.map +0 -1
- package/dist/router/segment-resolution.d.ts +0 -127
- package/dist/router/segment-resolution.d.ts.map +0 -1
- package/dist/router/segment-resolution.js +0 -919
- package/dist/router/segment-resolution.js.map +0 -1
- package/dist/router/trie-matching.d.ts +0 -40
- package/dist/router/trie-matching.d.ts.map +0 -1
- package/dist/router/trie-matching.js +0 -127
- package/dist/router/trie-matching.js.map +0 -1
- package/dist/router/types.d.ts +0 -136
- package/dist/router/types.d.ts.map +0 -1
- package/dist/router/types.js +0 -7
- package/dist/router/types.js.map +0 -1
- package/dist/router.d.ts +0 -753
- package/dist/router.d.ts.map +0 -1
- package/dist/router.gen.d.ts +0 -6
- package/dist/router.gen.d.ts.map +0 -1
- package/dist/router.gen.js +0 -6
- package/dist/router.gen.js.map +0 -1
- package/dist/router.js +0 -1304
- package/dist/router.js.map +0 -1
- package/dist/rsc/__tests__/helpers.test.d.ts +0 -2
- package/dist/rsc/__tests__/helpers.test.d.ts.map +0 -1
- package/dist/rsc/__tests__/helpers.test.js +0 -140
- package/dist/rsc/__tests__/helpers.test.js.map +0 -1
- package/dist/rsc/handler.d.ts +0 -45
- package/dist/rsc/handler.d.ts.map +0 -1
- package/dist/rsc/handler.js +0 -1172
- package/dist/rsc/handler.js.map +0 -1
- package/dist/rsc/helpers.d.ts +0 -16
- package/dist/rsc/helpers.d.ts.map +0 -1
- package/dist/rsc/helpers.js +0 -55
- package/dist/rsc/helpers.js.map +0 -1
- package/dist/rsc/index.d.ts +0 -22
- package/dist/rsc/index.d.ts.map +0 -1
- package/dist/rsc/index.js +0 -23
- package/dist/rsc/index.js.map +0 -1
- package/dist/rsc/nonce.d.ts +0 -9
- package/dist/rsc/nonce.d.ts.map +0 -1
- package/dist/rsc/nonce.js +0 -18
- package/dist/rsc/nonce.js.map +0 -1
- package/dist/rsc/types.d.ts +0 -206
- package/dist/rsc/types.d.ts.map +0 -1
- package/dist/rsc/types.js +0 -8
- package/dist/rsc/types.js.map +0 -1
- package/dist/search-params.d.ts +0 -103
- package/dist/search-params.d.ts.map +0 -1
- package/dist/search-params.js +0 -74
- package/dist/search-params.js.map +0 -1
- package/dist/segment-system.d.ts +0 -75
- package/dist/segment-system.d.ts.map +0 -1
- package/dist/segment-system.js +0 -336
- package/dist/segment-system.js.map +0 -1
- package/dist/server/context.d.ts +0 -245
- package/dist/server/context.d.ts.map +0 -1
- package/dist/server/context.js +0 -197
- package/dist/server/context.js.map +0 -1
- package/dist/server/fetchable-loader-store.d.ts +0 -18
- package/dist/server/fetchable-loader-store.d.ts.map +0 -1
- package/dist/server/fetchable-loader-store.js +0 -18
- package/dist/server/fetchable-loader-store.js.map +0 -1
- package/dist/server/handle-store.d.ts +0 -85
- package/dist/server/handle-store.d.ts.map +0 -1
- package/dist/server/handle-store.js +0 -142
- package/dist/server/handle-store.js.map +0 -1
- package/dist/server/loader-registry.d.ts +0 -55
- package/dist/server/loader-registry.d.ts.map +0 -1
- package/dist/server/loader-registry.js +0 -132
- package/dist/server/loader-registry.js.map +0 -1
- package/dist/server/request-context.d.ts +0 -226
- package/dist/server/request-context.d.ts.map +0 -1
- package/dist/server/request-context.js +0 -290
- package/dist/server/request-context.js.map +0 -1
- package/dist/server/root-layout.d.ts +0 -4
- package/dist/server/root-layout.d.ts.map +0 -1
- package/dist/server/root-layout.js +0 -5
- package/dist/server/root-layout.js.map +0 -1
- package/dist/server.d.ts +0 -15
- package/dist/server.d.ts.map +0 -1
- package/dist/server.js +0 -20
- package/dist/server.js.map +0 -1
- package/dist/ssr/__tests__/ssr-handler.test.d.ts +0 -2
- package/dist/ssr/__tests__/ssr-handler.test.d.ts.map +0 -1
- package/dist/ssr/__tests__/ssr-handler.test.js +0 -132
- package/dist/ssr/__tests__/ssr-handler.test.js.map +0 -1
- package/dist/ssr/index.d.ts +0 -98
- package/dist/ssr/index.d.ts.map +0 -1
- package/dist/ssr/index.js +0 -158
- package/dist/ssr/index.js.map +0 -1
- package/dist/static-handler.d.ts +0 -50
- package/dist/static-handler.d.ts.map +0 -1
- package/dist/static-handler.gen.d.ts +0 -5
- package/dist/static-handler.gen.d.ts.map +0 -1
- package/dist/static-handler.gen.js +0 -5
- package/dist/static-handler.gen.js.map +0 -1
- package/dist/static-handler.js +0 -29
- package/dist/static-handler.js.map +0 -1
- package/dist/theme/ThemeProvider.d.ts +0 -20
- package/dist/theme/ThemeProvider.d.ts.map +0 -1
- package/dist/theme/ThemeProvider.js +0 -240
- package/dist/theme/ThemeProvider.js.map +0 -1
- package/dist/theme/ThemeScript.d.ts +0 -48
- package/dist/theme/ThemeScript.d.ts.map +0 -1
- package/dist/theme/ThemeScript.js +0 -13
- package/dist/theme/ThemeScript.js.map +0 -1
- package/dist/theme/__tests__/theme.test.d.ts +0 -2
- package/dist/theme/__tests__/theme.test.d.ts.map +0 -1
- package/dist/theme/__tests__/theme.test.js +0 -103
- package/dist/theme/__tests__/theme.test.js.map +0 -1
- package/dist/theme/constants.d.ts +0 -29
- package/dist/theme/constants.d.ts.map +0 -1
- package/dist/theme/constants.js +0 -48
- package/dist/theme/constants.js.map +0 -1
- package/dist/theme/index.d.ts +0 -31
- package/dist/theme/index.d.ts.map +0 -1
- package/dist/theme/index.js +0 -36
- package/dist/theme/index.js.map +0 -1
- package/dist/theme/theme-context.d.ts +0 -40
- package/dist/theme/theme-context.d.ts.map +0 -1
- package/dist/theme/theme-context.js +0 -60
- package/dist/theme/theme-context.js.map +0 -1
- package/dist/theme/theme-script.d.ts +0 -27
- package/dist/theme/theme-script.d.ts.map +0 -1
- package/dist/theme/theme-script.js +0 -147
- package/dist/theme/theme-script.js.map +0 -1
- package/dist/theme/types.d.ts +0 -163
- package/dist/theme/types.d.ts.map +0 -1
- package/dist/theme/types.js +0 -11
- package/dist/theme/types.js.map +0 -1
- package/dist/theme/use-theme.d.ts +0 -12
- package/dist/theme/use-theme.d.ts.map +0 -1
- package/dist/theme/use-theme.js +0 -40
- package/dist/theme/use-theme.js.map +0 -1
- package/dist/types.d.ts +0 -1479
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js +0 -10
- package/dist/types.js.map +0 -1
- package/dist/urls.d.ts +0 -441
- package/dist/urls.d.ts.map +0 -1
- package/dist/urls.gen.d.ts +0 -8
- package/dist/urls.gen.d.ts.map +0 -1
- package/dist/urls.gen.js +0 -8
- package/dist/urls.gen.js.map +0 -1
- package/dist/urls.js +0 -443
- package/dist/urls.js.map +0 -1
- package/dist/use-loader.d.ts +0 -127
- package/dist/use-loader.d.ts.map +0 -1
- package/dist/use-loader.js +0 -237
- package/dist/use-loader.js.map +0 -1
- package/dist/vite/__tests__/ast-handler-extract.test.d.ts +0 -2
- package/dist/vite/__tests__/ast-handler-extract.test.d.ts.map +0 -1
- package/dist/vite/__tests__/ast-handler-extract.test.js +0 -294
- package/dist/vite/__tests__/ast-handler-extract.test.js.map +0 -1
- package/dist/vite/__tests__/expose-id-utils.test.d.ts +0 -2
- package/dist/vite/__tests__/expose-id-utils.test.d.ts.map +0 -1
- package/dist/vite/__tests__/expose-id-utils.test.js +0 -224
- package/dist/vite/__tests__/expose-id-utils.test.js.map +0 -1
- package/dist/vite/__tests__/expose-internal-ids.test.d.ts +0 -2
- package/dist/vite/__tests__/expose-internal-ids.test.d.ts.map +0 -1
- package/dist/vite/__tests__/expose-internal-ids.test.js +0 -647
- package/dist/vite/__tests__/expose-internal-ids.test.js.map +0 -1
- package/dist/vite/__tests__/expose-router-id.test.d.ts +0 -2
- package/dist/vite/__tests__/expose-router-id.test.d.ts.map +0 -1
- package/dist/vite/__tests__/expose-router-id.test.js +0 -39
- package/dist/vite/__tests__/expose-router-id.test.js.map +0 -1
- package/dist/vite/ast-handler-extract.d.ts +0 -49
- package/dist/vite/ast-handler-extract.d.ts.map +0 -1
- package/dist/vite/ast-handler-extract.js +0 -249
- package/dist/vite/ast-handler-extract.js.map +0 -1
- package/dist/vite/expose-action-id.d.ts +0 -19
- package/dist/vite/expose-action-id.d.ts.map +0 -1
- package/dist/vite/expose-action-id.js +0 -250
- package/dist/vite/expose-action-id.js.map +0 -1
- package/dist/vite/expose-id-utils.d.ts +0 -69
- package/dist/vite/expose-id-utils.d.ts.map +0 -1
- package/dist/vite/expose-id-utils.js +0 -289
- package/dist/vite/expose-id-utils.js.map +0 -1
- package/dist/vite/expose-internal-ids.d.ts +0 -22
- package/dist/vite/expose-internal-ids.d.ts.map +0 -1
- package/dist/vite/expose-internal-ids.js +0 -886
- package/dist/vite/expose-internal-ids.js.map +0 -1
- package/dist/vite/index.d.ts +0 -149
- package/dist/vite/index.d.ts.map +0 -1
- package/dist/vite/index.js.bak +0 -5448
- package/dist/vite/index.js.map +0 -1
- package/dist/vite/index.named-routes.gen.ts +0 -103
- package/dist/vite/package-resolution.d.ts +0 -43
- package/dist/vite/package-resolution.d.ts.map +0 -1
- package/dist/vite/package-resolution.js +0 -112
- package/dist/vite/package-resolution.js.map +0 -1
- package/dist/vite/virtual-entries.d.ts +0 -25
- package/dist/vite/virtual-entries.d.ts.map +0 -1
- package/dist/vite/virtual-entries.js +0 -110
- package/dist/vite/virtual-entries.js.map +0 -1
- package/skills/migrate-react-router/cloudflare-workers.md +0 -129
|
@@ -65,6 +65,7 @@ import {
|
|
|
65
65
|
getTagMarkerMemo,
|
|
66
66
|
getTagMarkerInflight,
|
|
67
67
|
} from "./cf-tag-marker-memo.js";
|
|
68
|
+
import { createCloudflareZonePurge } from "./cf-zone-purge.js";
|
|
68
69
|
|
|
69
70
|
// ============================================================================
|
|
70
71
|
// Constants
|
|
@@ -137,6 +138,13 @@ const warnedNoKvReadInvalidation = new Set<string>();
|
|
|
137
138
|
*/
|
|
138
139
|
const warnedTagInvalidationTtlFloor = new Set<string>();
|
|
139
140
|
|
|
141
|
+
/**
|
|
142
|
+
* Stores (by namespace) already warned about the shell family being inert
|
|
143
|
+
* (getShell/putShell no-op without a KV namespace), so a ppr route hitting the
|
|
144
|
+
* silent fail-open warns once per isolate instead of on every request.
|
|
145
|
+
*/
|
|
146
|
+
const warnedShellFamilyInert = new Set<string>();
|
|
147
|
+
|
|
140
148
|
/**
|
|
141
149
|
* Stores (by namespace) already warned that tag invalidation is writing KV
|
|
142
150
|
* markers with no expiry (tagInvalidationTtl unset), so the unbounded-growth
|
|
@@ -147,6 +155,57 @@ const warnedTagInvalidationTtlFloor = new Set<string>();
|
|
|
147
155
|
*/
|
|
148
156
|
const warnedNoTagInvalidationTtl = new Set<string>();
|
|
149
157
|
|
|
158
|
+
/**
|
|
159
|
+
* Stores (by namespace) already warned that an entry's tag set produced a
|
|
160
|
+
* Cache-Tag header over Cloudflare's aggregate limit, so the header was
|
|
161
|
+
* omitted (the entry stays cacheable and marker-invalidatable; it just cannot
|
|
162
|
+
* be evicted per-tag by a purge). Once per process, not per write.
|
|
163
|
+
*/
|
|
164
|
+
const warnedCacheTagHeaderOverflow = new Set<string>();
|
|
165
|
+
|
|
166
|
+
/**
|
|
167
|
+
* Stores (by namespace) already warned that an over-limit tag set made an
|
|
168
|
+
* entry UNCACHEABLE in KV-less purge mode: with no Cache-Tag tokens a purge
|
|
169
|
+
* cannot evict it, and with no KV there is no marker fallback either, so
|
|
170
|
+
* caching it would serve stale until TTL while updateTag() reports success.
|
|
171
|
+
* Once per process, not per write.
|
|
172
|
+
*/
|
|
173
|
+
const warnedCacheTagOverflowUncacheable = new Set<string>();
|
|
174
|
+
|
|
175
|
+
/**
|
|
176
|
+
* Max length of one emitted `rg:*` Cache-Tag token. Cloudflare caps a purge
|
|
177
|
+
* API tag value at 1,024 characters and the aggregate Cache-Tag header at
|
|
178
|
+
* 16 KB; an application tag is unbounded, so an over-long token is collapsed
|
|
179
|
+
* to a deterministic hash (see boundedTagToken) instead of being allowed to
|
|
180
|
+
* fail the whole L1 write. 256 keeps headers compact while leaving room for
|
|
181
|
+
* long-but-reasonable tag names under any namespace.
|
|
182
|
+
*/
|
|
183
|
+
const CACHE_TAG_TOKEN_MAX = 256;
|
|
184
|
+
|
|
185
|
+
/**
|
|
186
|
+
* Cloudflare's documented aggregate Cache-Tag header limit (16 KB). A tagged
|
|
187
|
+
* entry whose tokens would exceed it gets NO Cache-Tag header (plus a
|
|
188
|
+
* once-per-namespace warning) rather than a failed cache write; the read path
|
|
189
|
+
* then falls back to the marker check for that entry (see isL1Invalidated).
|
|
190
|
+
*/
|
|
191
|
+
const CACHE_TAG_HEADER_MAX_BYTES = 16 * 1024;
|
|
192
|
+
|
|
193
|
+
/**
|
|
194
|
+
* FNV-1a 64-bit hash of a tag value, hex-encoded. Used to bound over-long
|
|
195
|
+
* Cache-Tag tokens: deterministic (write-time token === purge-time token) and
|
|
196
|
+
* collision-safe in the failure direction — a collision over-purges (an extra
|
|
197
|
+
* eviction, healed by the next render), never serves stale.
|
|
198
|
+
* @internal
|
|
199
|
+
*/
|
|
200
|
+
function fnv1a64(input: string): string {
|
|
201
|
+
let hash = 0xcbf29ce484222325n;
|
|
202
|
+
for (let i = 0; i < input.length; i++) {
|
|
203
|
+
hash ^= BigInt(input.charCodeAt(i));
|
|
204
|
+
hash = (hash * 0x100000001b3n) & 0xffffffffffffffffn;
|
|
205
|
+
}
|
|
206
|
+
return hash.toString(16).padStart(16, "0");
|
|
207
|
+
}
|
|
208
|
+
|
|
150
209
|
// ============================================================================
|
|
151
210
|
// Types
|
|
152
211
|
// ============================================================================
|
|
@@ -227,6 +286,13 @@ interface KVShellEnvelope {
|
|
|
227
286
|
i?: string;
|
|
228
287
|
/** Capture data snapshot: recorded cache-store hits/writes for HIT parity */
|
|
229
288
|
sn?: import("../types.js").ShellSnapshotRecord[];
|
|
289
|
+
/**
|
|
290
|
+
* ShellCacheEntry.handlerLiveHoles. Must round-trip: the serve side arms the
|
|
291
|
+
* handler-free fast path on `!entry.handlerLiveHoles`, so dropping the flag
|
|
292
|
+
* here silently fast-pathed handler-live entries after a KV round trip —
|
|
293
|
+
* their holes only a handler re-run can fill.
|
|
294
|
+
*/
|
|
295
|
+
lh?: boolean;
|
|
230
296
|
}
|
|
231
297
|
|
|
232
298
|
/**
|
|
@@ -273,6 +339,7 @@ export class CFCacheStore<TEnv = unknown> implements SegmentCacheStore<TEnv> {
|
|
|
273
339
|
private readonly debug?: (event: CFCacheReadDebugEvent) => void;
|
|
274
340
|
private readonly kv?: KVNamespace;
|
|
275
341
|
private readonly onRevalidateTag?: (tags: string[]) => Promise<void>;
|
|
342
|
+
private readonly tagPurge?: (cacheTags: string[]) => Promise<void>;
|
|
276
343
|
private readonly tagInvalidationTtl?: number;
|
|
277
344
|
private readonly tagCacheTtl: number;
|
|
278
345
|
|
|
@@ -328,6 +395,16 @@ export class CFCacheStore<TEnv = unknown> implements SegmentCacheStore<TEnv> {
|
|
|
328
395
|
this.waitUntil = (fn) => options.ctx.waitUntil(fn());
|
|
329
396
|
this.kv = options.kv;
|
|
330
397
|
this.onRevalidateTag = options.onRevalidateTag;
|
|
398
|
+
// tagPurge accepts a ready purge function or a credentials object; the
|
|
399
|
+
// object form is normalized through the built-in zone purge client, which
|
|
400
|
+
// validates zoneId/apiToken eagerly so an unset env var fails at
|
|
401
|
+
// construction instead of on the first updateTag().
|
|
402
|
+
this.tagPurge =
|
|
403
|
+
typeof options.tagPurge === "function"
|
|
404
|
+
? options.tagPurge
|
|
405
|
+
: options.tagPurge
|
|
406
|
+
? createCloudflareZonePurge(options.tagPurge)
|
|
407
|
+
: undefined;
|
|
331
408
|
// tagInvalidationTtl feeds KV's expirationTtl, which CF rejects below
|
|
332
409
|
// KV_MIN_EXPIRATION_TTL (60s) -- a too-small finite value would make EVERY
|
|
333
410
|
// marker write throw and break ALL invalidation. Floor it (and warn once);
|
|
@@ -350,8 +427,14 @@ export class CFCacheStore<TEnv = unknown> implements SegmentCacheStore<TEnv> {
|
|
|
350
427
|
// tag machinery (tagCacheTtl for L1 markers, or onRevalidateTag for CDN purge)
|
|
351
428
|
// but omits kv gets only the purge fired - marker writes are skipped without
|
|
352
429
|
// kv - yet every tagged read still serves stale data with no other signal.
|
|
353
|
-
// Surface that misconfiguration.
|
|
354
|
-
|
|
430
|
+
// Surface that misconfiguration. Exception: with tagPurge configured (purge
|
|
431
|
+
// mode) L1 eviction is the purge itself, so a KV-less store is a supported
|
|
432
|
+
// L1-only configuration, not a silent no-op.
|
|
433
|
+
if (
|
|
434
|
+
!this.kv &&
|
|
435
|
+
!this.tagPurge &&
|
|
436
|
+
(this.tagCacheTtl > 0 || this.onRevalidateTag)
|
|
437
|
+
) {
|
|
355
438
|
this.warnOncePerNamespace(
|
|
356
439
|
warnedNoKvReadInvalidation,
|
|
357
440
|
`[CFCacheStore] tagCacheTtl/onRevalidateTag is configured without a KV ` +
|
|
@@ -867,9 +950,10 @@ export class CFCacheStore<TEnv = unknown> implements SegmentCacheStore<TEnv> {
|
|
|
867
950
|
// when debug is on, so the hot path pays nothing. It is the serial read
|
|
868
951
|
// that sits between matchMs and bodyReadMs for a tagged entry.
|
|
869
952
|
const markerStart = this.debug ? Date.now() : 0;
|
|
870
|
-
const invalidated = await this.
|
|
953
|
+
const invalidated = await this.isL1Invalidated(
|
|
871
954
|
tagInfo.tags,
|
|
872
955
|
tagInfo.taggedAt,
|
|
956
|
+
response.headers,
|
|
873
957
|
);
|
|
874
958
|
const markerMs = this.debug ? Date.now() - markerStart : undefined;
|
|
875
959
|
if (invalidated) {
|
|
@@ -1025,6 +1109,7 @@ export class CFCacheStore<TEnv = unknown> implements SegmentCacheStore<TEnv> {
|
|
|
1025
1109
|
swr?: number,
|
|
1026
1110
|
): Promise<void> {
|
|
1027
1111
|
if (this.isReservedSegmentKey(key, "cache-write")) return;
|
|
1112
|
+
if (this.skipUncacheableTagSet(data.tags)) return;
|
|
1028
1113
|
try {
|
|
1029
1114
|
const cache = await this.getCache();
|
|
1030
1115
|
const request = this.keyToRequest(key);
|
|
@@ -1045,6 +1130,9 @@ export class CFCacheStore<TEnv = unknown> implements SegmentCacheStore<TEnv> {
|
|
|
1045
1130
|
? { ...data, taggedAt }
|
|
1046
1131
|
: data;
|
|
1047
1132
|
|
|
1133
|
+
// Serialize the segment payload exactly once: L1 stores the JSON body
|
|
1134
|
+
// directly, and kvSetSegment embeds the same string as envelope.d so the
|
|
1135
|
+
// (potentially large) Flight/segment tree is not walked a second time.
|
|
1048
1136
|
const body = JSON.stringify(dataToStore);
|
|
1049
1137
|
const response = new Response(body, {
|
|
1050
1138
|
headers: {
|
|
@@ -1081,8 +1169,8 @@ export class CFCacheStore<TEnv = unknown> implements SegmentCacheStore<TEnv> {
|
|
|
1081
1169
|
await putPromise;
|
|
1082
1170
|
}
|
|
1083
1171
|
|
|
1084
|
-
// L2: persist to KV
|
|
1085
|
-
this.kvSetSegment(key,
|
|
1172
|
+
// L2: persist to KV (reuses `body` as envelope.d)
|
|
1173
|
+
this.kvSetSegment(key, body, staleAt, totalTtl, swrWindow);
|
|
1086
1174
|
} catch (error) {
|
|
1087
1175
|
reportCacheError(error, "cache-write", "[CFCacheStore] set");
|
|
1088
1176
|
}
|
|
@@ -1156,7 +1244,13 @@ export class CFCacheStore<TEnv = unknown> implements SegmentCacheStore<TEnv> {
|
|
|
1156
1244
|
|
|
1157
1245
|
// Tag invalidation check (treat invalidated entry as a miss).
|
|
1158
1246
|
const tagInfo = this.readTagInfo(response.headers);
|
|
1159
|
-
if (
|
|
1247
|
+
if (
|
|
1248
|
+
await this.isL1Invalidated(
|
|
1249
|
+
tagInfo.tags,
|
|
1250
|
+
tagInfo.taggedAt,
|
|
1251
|
+
response.headers,
|
|
1252
|
+
)
|
|
1253
|
+
) {
|
|
1160
1254
|
return null;
|
|
1161
1255
|
}
|
|
1162
1256
|
|
|
@@ -1232,6 +1326,11 @@ export class CFCacheStore<TEnv = unknown> implements SegmentCacheStore<TEnv> {
|
|
|
1232
1326
|
headers.delete(CACHE_STATUS_HEADER);
|
|
1233
1327
|
headers.delete(CACHE_TAGS_HEADER);
|
|
1234
1328
|
headers.delete(CACHE_TAGGED_AT_HEADER);
|
|
1329
|
+
// Remove OUR namespaced tokens from Cache-Tag while preserving any the
|
|
1330
|
+
// document author set (setTagHeaders appended ours onto theirs). The
|
|
1331
|
+
// author's tags may be load-bearing for their own CDN purging; ours are
|
|
1332
|
+
// internal storage bookkeeping and must not leak to clients.
|
|
1333
|
+
this.stripInternalCacheTags(headers);
|
|
1235
1334
|
// Internal stale-path bookkeeping (hard-expiry deadline + REVALIDATING
|
|
1236
1335
|
// stamp). Carried on doc L1 entries for the herd guard; never serve them.
|
|
1237
1336
|
headers.delete(CACHE_EXPIRES_AT_HEADER);
|
|
@@ -1257,6 +1356,7 @@ export class CFCacheStore<TEnv = unknown> implements SegmentCacheStore<TEnv> {
|
|
|
1257
1356
|
swr?: number,
|
|
1258
1357
|
tags?: string[],
|
|
1259
1358
|
): Promise<void> {
|
|
1359
|
+
if (this.skipUncacheableTagSet(tags)) return;
|
|
1260
1360
|
try {
|
|
1261
1361
|
const cache = await this.getCache();
|
|
1262
1362
|
const request = this.keyToRequest(`doc:${key}`);
|
|
@@ -1424,9 +1524,10 @@ export class CFCacheStore<TEnv = unknown> implements SegmentCacheStore<TEnv> {
|
|
|
1424
1524
|
// marker-resolution tail only under debug (see get()).
|
|
1425
1525
|
const tagInfo = this.readTagInfo(response.headers);
|
|
1426
1526
|
const markerStart = this.debug ? Date.now() : 0;
|
|
1427
|
-
const invalidated = await this.
|
|
1527
|
+
const invalidated = await this.isL1Invalidated(
|
|
1428
1528
|
tagInfo.tags,
|
|
1429
1529
|
tagInfo.taggedAt,
|
|
1530
|
+
response.headers,
|
|
1430
1531
|
);
|
|
1431
1532
|
const markerMs = this.debug ? Date.now() - markerStart : undefined;
|
|
1432
1533
|
if (invalidated) {
|
|
@@ -1554,6 +1655,7 @@ export class CFCacheStore<TEnv = unknown> implements SegmentCacheStore<TEnv> {
|
|
|
1554
1655
|
value: string,
|
|
1555
1656
|
options?: CacheItemOptions,
|
|
1556
1657
|
): Promise<void> {
|
|
1658
|
+
if (this.skipUncacheableTagSet(options?.tags)) return;
|
|
1557
1659
|
try {
|
|
1558
1660
|
const cache = await this.getCache();
|
|
1559
1661
|
const request = this.keyToRequest(`fn:${key}`);
|
|
@@ -1567,7 +1669,17 @@ export class CFCacheStore<TEnv = unknown> implements SegmentCacheStore<TEnv> {
|
|
|
1567
1669
|
const taggedAt =
|
|
1568
1670
|
Array.isArray(tags) && tags.length > 0 ? Date.now() : undefined;
|
|
1569
1671
|
|
|
1570
|
-
|
|
1672
|
+
// Serialize value/handles once; L1 body and KV envelope.v/h share the
|
|
1673
|
+
// escaped strings so a large RSC payload is not re-escaped for L2.
|
|
1674
|
+
const valueJson = JSON.stringify(value);
|
|
1675
|
+
const handlesJson =
|
|
1676
|
+
options?.handles !== undefined
|
|
1677
|
+
? JSON.stringify(options.handles)
|
|
1678
|
+
: undefined;
|
|
1679
|
+
const body =
|
|
1680
|
+
handlesJson !== undefined
|
|
1681
|
+
? `{"value":${valueJson},"handles":${handlesJson}}`
|
|
1682
|
+
: `{"value":${valueJson}}`;
|
|
1571
1683
|
const response = new Response(body, {
|
|
1572
1684
|
headers: {
|
|
1573
1685
|
"Content-Type": "application/json",
|
|
@@ -1594,24 +1706,24 @@ export class CFCacheStore<TEnv = unknown> implements SegmentCacheStore<TEnv> {
|
|
|
1594
1706
|
await putPromise;
|
|
1595
1707
|
}
|
|
1596
1708
|
|
|
1597
|
-
// L2: persist to KV (KV requires expirationTtl >= 60s)
|
|
1709
|
+
// L2: persist to KV (KV requires expirationTtl >= 60s). Wire shape matches
|
|
1710
|
+
// JSON.stringify(KVItemEnvelope); field names differ from L1 so we assemble
|
|
1711
|
+
// from the pre-escaped value/handles pieces rather than re-stringifying.
|
|
1598
1712
|
if (this.kv && this.waitUntil && totalTtl >= 60) {
|
|
1599
1713
|
const kvKey = this.toKVKey(`fn:${key}`);
|
|
1714
|
+
const expiresAt = staleAt + swrWindow * 1000;
|
|
1715
|
+
let envelopeJson = `{"v":${valueJson}`;
|
|
1716
|
+
if (handlesJson !== undefined) envelopeJson += `,"h":${handlesJson}`;
|
|
1717
|
+
envelopeJson += `,"s":${staleAt},"e":${expiresAt}`;
|
|
1718
|
+
if (tags !== undefined) envelopeJson += `,"t":${JSON.stringify(tags)}`;
|
|
1719
|
+
if (taggedAt !== undefined) envelopeJson += `,"ta":${taggedAt}`;
|
|
1720
|
+
envelopeJson += `}`;
|
|
1600
1721
|
this.waitUntil(() =>
|
|
1601
1722
|
reportingAsync(
|
|
1602
|
-
() =>
|
|
1603
|
-
|
|
1604
|
-
v: value,
|
|
1605
|
-
h: options?.handles,
|
|
1606
|
-
s: staleAt,
|
|
1607
|
-
e: staleAt + swrWindow * 1000,
|
|
1608
|
-
t: tags,
|
|
1609
|
-
ta: taggedAt,
|
|
1610
|
-
};
|
|
1611
|
-
return this.kv!.put(kvKey, JSON.stringify(envelope), {
|
|
1723
|
+
() =>
|
|
1724
|
+
this.kv!.put(kvKey, envelopeJson, {
|
|
1612
1725
|
expirationTtl: totalTtl,
|
|
1613
|
-
})
|
|
1614
|
-
},
|
|
1726
|
+
}),
|
|
1615
1727
|
"cache-write",
|
|
1616
1728
|
"[CFCacheStore] kvSetItem",
|
|
1617
1729
|
),
|
|
@@ -1635,6 +1747,27 @@ export class CFCacheStore<TEnv = unknown> implements SegmentCacheStore<TEnv> {
|
|
|
1635
1747
|
// still applies: shell entries carry tags/taggedAt and are checked against the
|
|
1636
1748
|
// same KV markers isGloballyInvalidated() reads for every other tier.
|
|
1637
1749
|
|
|
1750
|
+
/**
|
|
1751
|
+
* Warn once per isolate that the shell family is inert: getShell/putShell
|
|
1752
|
+
* are ONLY called for routes that declared the `ppr` path option, so firing
|
|
1753
|
+
* here (not in the constructor) scopes the warning to apps that actually
|
|
1754
|
+
* use PPR — a KV-less CFCacheStore is a perfectly fine config otherwise.
|
|
1755
|
+
* Without it, the correctness-first fail-open (issue #651) is invisible:
|
|
1756
|
+
* every ppr route is a permanent MISS with zero diagnostics.
|
|
1757
|
+
* @internal
|
|
1758
|
+
*/
|
|
1759
|
+
private warnShellFamilyInertOnce(): void {
|
|
1760
|
+
this.warnOncePerNamespace(
|
|
1761
|
+
warnedShellFamilyInert,
|
|
1762
|
+
`[CFCacheStore] a ppr route resolved to this store, but no KV namespace ` +
|
|
1763
|
+
`is configured, so the shell family (getShell/putShell) is a no-op: ` +
|
|
1764
|
+
`every ppr route stays a permanent shell MISS (the page still serves ` +
|
|
1765
|
+
`via a full render). Bind a KV namespace and pass it — ` +
|
|
1766
|
+
`new CFCacheStore({ ctx, kv: env.CACHE_KV }) — or use a shell-capable ` +
|
|
1767
|
+
`store via createRouter({ cache }).`,
|
|
1768
|
+
);
|
|
1769
|
+
}
|
|
1770
|
+
|
|
1638
1771
|
/**
|
|
1639
1772
|
* Get a cached PPR shell entry by key from KV (no L1). Applies the KV read
|
|
1640
1773
|
* budget, corrupt-entry eviction, hard-expiry, and tag invalidation exactly
|
|
@@ -1645,7 +1778,10 @@ export class CFCacheStore<TEnv = unknown> implements SegmentCacheStore<TEnv> {
|
|
|
1645
1778
|
async getShell(
|
|
1646
1779
|
key: string,
|
|
1647
1780
|
): Promise<{ entry: ShellCacheEntry; shouldRevalidate?: boolean } | null> {
|
|
1648
|
-
if (!this.kv)
|
|
1781
|
+
if (!this.kv) {
|
|
1782
|
+
this.warnShellFamilyInertOnce();
|
|
1783
|
+
return null;
|
|
1784
|
+
}
|
|
1649
1785
|
try {
|
|
1650
1786
|
const kvKey = this.toKVKey(`shell:${key}`);
|
|
1651
1787
|
const { value: envelope, timedOut } =
|
|
@@ -1678,6 +1814,7 @@ export class CFCacheStore<TEnv = unknown> implements SegmentCacheStore<TEnv> {
|
|
|
1678
1814
|
buildVersion: envelope.bv,
|
|
1679
1815
|
initialTheme: envelope.i,
|
|
1680
1816
|
snapshot: envelope.sn,
|
|
1817
|
+
handlerLiveHoles: envelope.lh,
|
|
1681
1818
|
createdAt: envelope.c,
|
|
1682
1819
|
},
|
|
1683
1820
|
shouldRevalidate,
|
|
@@ -1701,7 +1838,11 @@ export class CFCacheStore<TEnv = unknown> implements SegmentCacheStore<TEnv> {
|
|
|
1701
1838
|
tags?: string[],
|
|
1702
1839
|
): Promise<void> {
|
|
1703
1840
|
// KV-only tier: needs a KV namespace and waitUntil (writes are non-blocking).
|
|
1704
|
-
if (!this.kv
|
|
1841
|
+
if (!this.kv) {
|
|
1842
|
+
this.warnShellFamilyInertOnce();
|
|
1843
|
+
return;
|
|
1844
|
+
}
|
|
1845
|
+
if (!this.waitUntil) return;
|
|
1705
1846
|
try {
|
|
1706
1847
|
const ttl = resolveTtl(ttlSeconds, this.defaults, DEFAULT_FUNCTION_TTL);
|
|
1707
1848
|
const swrWindow = resolveSwrWindow(swrSeconds, this.defaults);
|
|
@@ -1745,6 +1886,7 @@ export class CFCacheStore<TEnv = unknown> implements SegmentCacheStore<TEnv> {
|
|
|
1745
1886
|
ta: taggedAt,
|
|
1746
1887
|
i: entry.initialTheme,
|
|
1747
1888
|
sn: entry.snapshot,
|
|
1889
|
+
lh: entry.handlerLiveHoles,
|
|
1748
1890
|
};
|
|
1749
1891
|
return this.kv!.put(kvKey, JSON.stringify(envelope), {
|
|
1750
1892
|
expirationTtl: totalTtl,
|
|
@@ -1938,13 +2080,19 @@ export class CFCacheStore<TEnv = unknown> implements SegmentCacheStore<TEnv> {
|
|
|
1938
2080
|
* Header entries carrying an entry's tags (JSON-encoded, comma-safe) and the
|
|
1939
2081
|
* timestamp they were attached. Returns an empty object when there are no
|
|
1940
2082
|
* tags so untagged entries stay header-free and skip the invalidation check.
|
|
2083
|
+
*
|
|
2084
|
+
* Also stamps the namespaced `Cache-Tag` header (see entryCacheTags) so a
|
|
2085
|
+
* Cloudflare purge-by-tag can evict the entry — the mechanism purge mode
|
|
2086
|
+
* (tagPurge) relies on. Written unconditionally (not only in purge mode):
|
|
2087
|
+
* it costs a small header and makes existing entries purgeable the moment a
|
|
2088
|
+
* consumer turns purge mode on, with no re-render needed.
|
|
1941
2089
|
*/
|
|
1942
2090
|
private tagHeaderEntries(
|
|
1943
2091
|
tags: string[] | undefined,
|
|
1944
2092
|
taggedAt: number | undefined,
|
|
1945
2093
|
): Record<string, string> {
|
|
1946
2094
|
if (!Array.isArray(tags) || tags.length === 0 || !taggedAt) return {};
|
|
1947
|
-
|
|
2095
|
+
const entries: Record<string, string> = {
|
|
1948
2096
|
// encodeURIComponent so the value is pure ASCII: HTTP header values are
|
|
1949
2097
|
// ByteStrings, but JSON.stringify leaves codepoints > U+00FF (emoji/CJK)
|
|
1950
2098
|
// verbatim, which makes new Response({ headers }) throw and the outer
|
|
@@ -1953,13 +2101,78 @@ export class CFCacheStore<TEnv = unknown> implements SegmentCacheStore<TEnv> {
|
|
|
1953
2101
|
[CACHE_TAGS_HEADER]: encodeURIComponent(JSON.stringify(tags)),
|
|
1954
2102
|
[CACHE_TAGGED_AT_HEADER]: String(taggedAt),
|
|
1955
2103
|
};
|
|
2104
|
+
// Over Cloudflare's aggregate Cache-Tag limit the header is OMITTED — the
|
|
2105
|
+
// entry still caches and stays marker-invalidatable; it just cannot be
|
|
2106
|
+
// purge-evicted per tag (isL1Invalidated falls back to the marker check
|
|
2107
|
+
// for such entries, so purge mode stays correct). Emitting a header over
|
|
2108
|
+
// the limit would instead risk failing the whole L1 write. The KV-LESS
|
|
2109
|
+
// purge-mode combination never reaches here: there the marker fallback
|
|
2110
|
+
// has no KV to consult, so skipUncacheableTagSet rejects the write first.
|
|
2111
|
+
const cacheTag = this.entryCacheTagHeader(tags);
|
|
2112
|
+
if (cacheTag !== null) {
|
|
2113
|
+
entries["Cache-Tag"] = cacheTag;
|
|
2114
|
+
} else {
|
|
2115
|
+
this.warnOncePerNamespace(
|
|
2116
|
+
warnedCacheTagHeaderOverflow,
|
|
2117
|
+
`[CFCacheStore] an entry's ${tags.length} tags produce a Cache-Tag ` +
|
|
2118
|
+
`header over Cloudflare's ${CACHE_TAG_HEADER_MAX_BYTES}-byte ` +
|
|
2119
|
+
`limit; the header was omitted. The entry stays cacheable and ` +
|
|
2120
|
+
`marker-invalidatable, but a purge-by-tag cannot evict it (purge ` +
|
|
2121
|
+
`mode falls back to the marker check for it). Reduce the number ` +
|
|
2122
|
+
`of tags per entry.`,
|
|
2123
|
+
);
|
|
2124
|
+
}
|
|
2125
|
+
return entries;
|
|
2126
|
+
}
|
|
2127
|
+
|
|
2128
|
+
/**
|
|
2129
|
+
* Joined entry Cache-Tag header value for `tags`, or null when it would
|
|
2130
|
+
* exceed Cloudflare's aggregate header limit. Tokens are pure ASCII
|
|
2131
|
+
* (encodeURIComponent output), so .length is bytes.
|
|
2132
|
+
* @internal
|
|
2133
|
+
*/
|
|
2134
|
+
private entryCacheTagHeader(tags: string[]): string | null {
|
|
2135
|
+
const joined = this.entryCacheTags(tags).join(",");
|
|
2136
|
+
return joined.length <= CACHE_TAG_HEADER_MAX_BYTES ? joined : null;
|
|
2137
|
+
}
|
|
2138
|
+
|
|
2139
|
+
/**
|
|
2140
|
+
* Write-path gate for the one configuration where an over-limit tag set has
|
|
2141
|
+
* NO invalidation path: purge mode WITHOUT KV. There the entry Cache-Tag
|
|
2142
|
+
* tokens are the only eviction mechanism, and a tag set whose header
|
|
2143
|
+
* overflows CACHE_TAG_HEADER_MAX_BYTES gets no tokens — a purge could never
|
|
2144
|
+
* evict the entry and there is no KV marker fallback, so it would serve
|
|
2145
|
+
* stale until TTL while updateTag() reports success. Returns true (and
|
|
2146
|
+
* warns once) so the caller SKIPS caching: the route simply renders fresh,
|
|
2147
|
+
* which is the fail-safe direction. With KV configured the omitted-header
|
|
2148
|
+
* entry falls back to the marker check (see tagHeaderEntries), and KV-less
|
|
2149
|
+
* MARKER mode keeps its documented no-read-side-invalidation semantics —
|
|
2150
|
+
* neither is gated.
|
|
2151
|
+
* @internal
|
|
2152
|
+
*/
|
|
2153
|
+
private skipUncacheableTagSet(tags: string[] | undefined): boolean {
|
|
2154
|
+
if (!this.tagPurge || this.kv) return false;
|
|
2155
|
+
if (!Array.isArray(tags) || tags.length === 0) return false;
|
|
2156
|
+
if (this.entryCacheTagHeader(tags) !== null) return false;
|
|
2157
|
+
this.warnOncePerNamespace(
|
|
2158
|
+
warnedCacheTagOverflowUncacheable,
|
|
2159
|
+
`[CFCacheStore] an entry's ${tags.length} tags produce a Cache-Tag ` +
|
|
2160
|
+
`header over Cloudflare's ${CACHE_TAG_HEADER_MAX_BYTES}-byte limit. ` +
|
|
2161
|
+
`In purge mode without KV those tokens are the only invalidation ` +
|
|
2162
|
+
`path, so the entry was NOT cached (it renders fresh instead of ` +
|
|
2163
|
+
`becoming un-invalidatable). Reduce the number of tags per entry, ` +
|
|
2164
|
+
`or configure { kv } to get the marker fallback.`,
|
|
2165
|
+
);
|
|
2166
|
+
return true;
|
|
1956
2167
|
}
|
|
1957
2168
|
|
|
1958
2169
|
/**
|
|
1959
2170
|
* Merge the internal tag headers onto an existing Headers instance. The
|
|
1960
2171
|
* from-scratch paths spread tagHeaderEntries() into an object-literal init;
|
|
1961
2172
|
* the document put/promote paths build a Headers first, so they .set() each
|
|
1962
|
-
* entry instead
|
|
2173
|
+
* entry instead — except `Cache-Tag`, which is APPENDED: a document author
|
|
2174
|
+
* may have set their own Cache-Tag, and clobbering it would break their CDN
|
|
2175
|
+
* purging. Append produces the comma-merged list CF expects.
|
|
1963
2176
|
*/
|
|
1964
2177
|
private setTagHeaders(
|
|
1965
2178
|
headers: Headers,
|
|
@@ -1969,7 +2182,8 @@ export class CFCacheStore<TEnv = unknown> implements SegmentCacheStore<TEnv> {
|
|
|
1969
2182
|
for (const [name, value] of Object.entries(
|
|
1970
2183
|
this.tagHeaderEntries(tags, taggedAt),
|
|
1971
2184
|
)) {
|
|
1972
|
-
headers.
|
|
2185
|
+
if (name === "Cache-Tag") headers.append(name, value);
|
|
2186
|
+
else headers.set(name, value);
|
|
1973
2187
|
}
|
|
1974
2188
|
}
|
|
1975
2189
|
|
|
@@ -2037,6 +2251,46 @@ export class CFCacheStore<TEnv = unknown> implements SegmentCacheStore<TEnv> {
|
|
|
2037
2251
|
}
|
|
2038
2252
|
}
|
|
2039
2253
|
|
|
2254
|
+
/**
|
|
2255
|
+
* Tag-invalidation check for an L1 (Cache API) hit. In purge mode (tagPurge
|
|
2256
|
+
* configured), invalidateTags() evicts L1 entries via a Cloudflare
|
|
2257
|
+
* purge-by-tag call, so a hit that SURVIVED is trusted without a per-read
|
|
2258
|
+
* marker lookup — that skipped lookup is the entire point of purge mode.
|
|
2259
|
+
* Only the per-request memo is consulted (synchronous, no KV read) so a
|
|
2260
|
+
* request that ran updateTag() still masks its own entries during the purge
|
|
2261
|
+
* propagation window (read-your-own-writes).
|
|
2262
|
+
*
|
|
2263
|
+
* The trust is conditional on the entry actually CARRYING this store's
|
|
2264
|
+
* entry Cache-Tag tokens (`headers`): an entry a purge cannot reach — one
|
|
2265
|
+
* written before the tokens existed, or whose tag set overflowed the
|
|
2266
|
+
* Cache-Tag header limit — keeps the full marker check, or purge mode
|
|
2267
|
+
* would serve it stale until TTL with no eviction path.
|
|
2268
|
+
*
|
|
2269
|
+
* Without tagPurge this is the full marker cascade. KV-tier reads and
|
|
2270
|
+
* shells always use isGloballyInvalidated directly: purge cannot reach KV,
|
|
2271
|
+
* so the markers stay their invalidation mechanism.
|
|
2272
|
+
* @internal
|
|
2273
|
+
*/
|
|
2274
|
+
private async isL1Invalidated(
|
|
2275
|
+
tags: string[] | undefined,
|
|
2276
|
+
taggedAt: number | undefined,
|
|
2277
|
+
headers: Headers,
|
|
2278
|
+
): Promise<boolean> {
|
|
2279
|
+
if (!this.tagPurge) return this.isGloballyInvalidated(tags, taggedAt);
|
|
2280
|
+
if (!Array.isArray(tags) || tags.length === 0 || !taggedAt) return false;
|
|
2281
|
+
if (!this.hasEntryCacheTags(headers)) {
|
|
2282
|
+
return this.isGloballyInvalidated(tags, taggedAt);
|
|
2283
|
+
}
|
|
2284
|
+
const ctx = _getRequestContext();
|
|
2285
|
+
if (!ctx) return false;
|
|
2286
|
+
const memo = getTagMarkerMemo(ctx, this);
|
|
2287
|
+
for (const tag of tags) {
|
|
2288
|
+
const marker = memo.get(tag);
|
|
2289
|
+
if (marker != null && marker >= taggedAt) return true;
|
|
2290
|
+
}
|
|
2291
|
+
return false;
|
|
2292
|
+
}
|
|
2293
|
+
|
|
2040
2294
|
/** Synthetic Cache API request for a tag's L1-cached invalidation marker. */
|
|
2041
2295
|
private tagMarkerRequest(tag: string): Request {
|
|
2042
2296
|
return this.keyToRequest(`${TAG_MARKER_CACHE_PREFIX}${tag}`);
|
|
@@ -2166,6 +2420,18 @@ export class CFCacheStore<TEnv = unknown> implements SegmentCacheStore<TEnv> {
|
|
|
2166
2420
|
return resolved;
|
|
2167
2421
|
}
|
|
2168
2422
|
|
|
2423
|
+
/**
|
|
2424
|
+
* Namespace token used inside every `rg:*` Cache-Tag. encodeURIComponent'd
|
|
2425
|
+
* like the tag values: a raw namespace containing a comma would split into
|
|
2426
|
+
* bogus tokens inside the comma-delimited Cache-Tag header — breaking both
|
|
2427
|
+
* stripInternalCacheTags (internal tokens would leak to clients) and the
|
|
2428
|
+
* purge match (the purged tag string never equals any stored token).
|
|
2429
|
+
* @internal
|
|
2430
|
+
*/
|
|
2431
|
+
private nsToken(): string {
|
|
2432
|
+
return encodeURIComponent(this.namespace ?? "default");
|
|
2433
|
+
}
|
|
2434
|
+
|
|
2169
2435
|
/**
|
|
2170
2436
|
* Cloudflare Cache-Tags written on a tag's L1 marker entry, namespaced per
|
|
2171
2437
|
* store so purges never collide with other Cache-Tags in the zone. Three
|
|
@@ -2173,19 +2439,99 @@ export class CFCacheStore<TEnv = unknown> implements SegmentCacheStore<TEnv> {
|
|
|
2173
2439
|
* rg:{ns} - everything this store cached (deploy/nuclear reset)
|
|
2174
2440
|
* rg:{ns}:lk - all tag-lookup markers
|
|
2175
2441
|
* rg:{ns}:lk:{tag} - this tag's lookup (the normal updateTag purge target)
|
|
2176
|
-
* The tag value
|
|
2177
|
-
* comma-delimited Cache-Tag header.
|
|
2442
|
+
* The namespace and tag value are encodeURIComponent'd so commas/spaces
|
|
2443
|
+
* can't corrupt the comma-delimited Cache-Tag header.
|
|
2178
2444
|
* @internal
|
|
2179
2445
|
*/
|
|
2180
2446
|
private lookupCacheTags(tag: string): string[] {
|
|
2181
|
-
const ns = this.
|
|
2447
|
+
const ns = this.nsToken();
|
|
2182
2448
|
return [`rg:${ns}`, `rg:${ns}:lk`, this.lookupPurgeTag(tag)];
|
|
2183
2449
|
}
|
|
2184
2450
|
|
|
2451
|
+
/**
|
|
2452
|
+
* Build one `{prefix}{tag}` Cache-Tag token, bounded to CACHE_TAG_TOKEN_MAX:
|
|
2453
|
+
* an over-long encoded tag collapses to `{prefix}h:{fnv1a64(tag)}` so a
|
|
2454
|
+
* legally-long application tag can never blow Cloudflare's per-tag purge
|
|
2455
|
+
* limit (1,024 chars) or bloat the header. Deterministic, so the write-time
|
|
2456
|
+
* token and the invalidate-time purge token always agree.
|
|
2457
|
+
* @internal
|
|
2458
|
+
*/
|
|
2459
|
+
private boundedTagToken(prefix: string, tag: string): string {
|
|
2460
|
+
const token = `${prefix}${encodeURIComponent(tag)}`;
|
|
2461
|
+
if (token.length <= CACHE_TAG_TOKEN_MAX) return token;
|
|
2462
|
+
return `${prefix}h:${fnv1a64(tag)}`;
|
|
2463
|
+
}
|
|
2464
|
+
|
|
2185
2465
|
/** The specific Cache-Tag a consumer purges to evict tag `tag`'s lookup. */
|
|
2186
2466
|
private lookupPurgeTag(tag: string): string {
|
|
2187
|
-
|
|
2188
|
-
|
|
2467
|
+
return this.boundedTagToken(`rg:${this.nsToken()}:lk:`, tag);
|
|
2468
|
+
}
|
|
2469
|
+
|
|
2470
|
+
/**
|
|
2471
|
+
* Cloudflare Cache-Tags written on a tagged DATA entry (segment/item/doc),
|
|
2472
|
+
* mirroring the lookup-marker tiers but under `:e` (entry):
|
|
2473
|
+
* rg:{ns} - everything this store cached (deploy/nuclear reset)
|
|
2474
|
+
* rg:{ns}:e - all data entries
|
|
2475
|
+
* rg:{ns}:e:{t} - entries carrying tag `t` (the purge-mode invalidation
|
|
2476
|
+
* target; see CFCacheStoreOptions.tagPurge)
|
|
2477
|
+
* Namespace and tag value encodeURIComponent'd like the lookup tier.
|
|
2478
|
+
* @internal
|
|
2479
|
+
*/
|
|
2480
|
+
private entryCacheTags(tags: string[]): string[] {
|
|
2481
|
+
const ns = this.nsToken();
|
|
2482
|
+
return [
|
|
2483
|
+
`rg:${ns}`,
|
|
2484
|
+
`rg:${ns}:e`,
|
|
2485
|
+
...tags.map((tag) => this.entryPurgeTag(tag)),
|
|
2486
|
+
];
|
|
2487
|
+
}
|
|
2488
|
+
|
|
2489
|
+
/** The specific Cache-Tag purged to evict entries carrying tag `tag`. */
|
|
2490
|
+
private entryPurgeTag(tag: string): string {
|
|
2491
|
+
return this.boundedTagToken(`rg:${this.nsToken()}:e:`, tag);
|
|
2492
|
+
}
|
|
2493
|
+
|
|
2494
|
+
/**
|
|
2495
|
+
* Whether an L1 entry's stored headers carry this store's entry Cache-Tag
|
|
2496
|
+
* tokens — i.e. whether a purge-by-tag can actually evict it. False for an
|
|
2497
|
+
* entry written before this feature existed, or one whose tag set exceeded
|
|
2498
|
+
* CACHE_TAG_HEADER_MAX_BYTES (header omitted). Purge mode only trusts
|
|
2499
|
+
* entries a purge can reach; the rest keep the marker check.
|
|
2500
|
+
* @internal
|
|
2501
|
+
*/
|
|
2502
|
+
private hasEntryCacheTags(headers: Headers): boolean {
|
|
2503
|
+
const raw = headers.get("Cache-Tag");
|
|
2504
|
+
if (raw === null) return false;
|
|
2505
|
+
const tier = `rg:${this.nsToken()}:e`;
|
|
2506
|
+
return raw.split(",").some((token) => {
|
|
2507
|
+
const trimmed = token.trim();
|
|
2508
|
+
return trimmed === tier || trimmed.startsWith(`${tier}:`);
|
|
2509
|
+
});
|
|
2510
|
+
}
|
|
2511
|
+
|
|
2512
|
+
/**
|
|
2513
|
+
* Drop this store's namespaced tokens (`rg:{ns}` and `rg:{ns}:*`) from a
|
|
2514
|
+
* Cache-Tag header, keeping author-set tokens intact. Deletes the header
|
|
2515
|
+
* when nothing remains. Serve-path counterpart of setTagHeaders' append.
|
|
2516
|
+
* An author token that exactly equals a reserved `rg:{ns}` tier is stripped
|
|
2517
|
+
* too — `rg:` is this store's documented-reserved Cache-Tag prefix.
|
|
2518
|
+
* @internal
|
|
2519
|
+
*/
|
|
2520
|
+
private stripInternalCacheTags(headers: Headers): void {
|
|
2521
|
+
const raw = headers.get("Cache-Tag");
|
|
2522
|
+
if (raw === null) return;
|
|
2523
|
+
const ns = this.nsToken();
|
|
2524
|
+
const kept = raw
|
|
2525
|
+
.split(",")
|
|
2526
|
+
.map((token) => token.trim())
|
|
2527
|
+
.filter(
|
|
2528
|
+
(token) =>
|
|
2529
|
+
token.length > 0 &&
|
|
2530
|
+
token !== `rg:${ns}` &&
|
|
2531
|
+
!token.startsWith(`rg:${ns}:`),
|
|
2532
|
+
);
|
|
2533
|
+
if (kept.length > 0) headers.set("Cache-Tag", kept.join(","));
|
|
2534
|
+
else headers.delete("Cache-Tag");
|
|
2189
2535
|
}
|
|
2190
2536
|
|
|
2191
2537
|
/**
|
|
@@ -2249,9 +2595,12 @@ export class CFCacheStore<TEnv = unknown> implements SegmentCacheStore<TEnv> {
|
|
|
2249
2595
|
* writes the fresh marker straight into this colo's L1 (write-through, NOT
|
|
2250
2596
|
* delete - a delete would let the next read re-read a not-yet-converged KV
|
|
2251
2597
|
* value and re-arm the stale window), and memoizes it for same-request
|
|
2252
|
-
* read-your-own-writes.
|
|
2253
|
-
*
|
|
2254
|
-
*
|
|
2598
|
+
* read-your-own-writes. In purge mode (tagPurge) it then AWAITS the
|
|
2599
|
+
* consumer's purge-by-tag call with the entry Cache-Tags — the eviction the
|
|
2600
|
+
* per-read marker skip on L1 hits relies on. Finally fires onRevalidateTag
|
|
2601
|
+
* with the namespaced lookup Cache-Tags so a consumer purge evicts the
|
|
2602
|
+
* cached lookups in other colos promptly (otherwise they converge within
|
|
2603
|
+
* tagCacheTtl).
|
|
2255
2604
|
*
|
|
2256
2605
|
* Durable-write integrity: the in-memory write-through (memo + L1) for a tag
|
|
2257
2606
|
* runs ONLY after that tag's KV marker write is confirmed. If any KV write
|
|
@@ -2260,16 +2609,31 @@ export class CFCacheStore<TEnv = unknown> implements SegmentCacheStore<TEnv> {
|
|
|
2260
2609
|
* silently reporting success while other requests/colos serve stale data. The
|
|
2261
2610
|
* eager purge still fires for the whole batch first (it is additive).
|
|
2262
2611
|
*/
|
|
2612
|
+
/**
|
|
2613
|
+
* Build-shell read-through gate (SegmentCacheStore.isTagsInvalidatedSince):
|
|
2614
|
+
* a baked shell entry is immutable in the build manifest, so eviction is
|
|
2615
|
+
* answered by the SAME KV tag markers updateTag() writes, compared against
|
|
2616
|
+
* the entry's build-time createdAt. Thin public wrapper over the private
|
|
2617
|
+
* envelope check (identical semantics: marker >= since, fail open).
|
|
2618
|
+
*/
|
|
2619
|
+
async isTagsInvalidatedSince(
|
|
2620
|
+
tags: string[],
|
|
2621
|
+
sinceMs: number,
|
|
2622
|
+
): Promise<boolean> {
|
|
2623
|
+
return this.isGloballyInvalidated(tags, sinceMs);
|
|
2624
|
+
}
|
|
2625
|
+
|
|
2263
2626
|
async invalidateTags(tags: string[]): Promise<void> {
|
|
2264
2627
|
if (tags.length === 0) return;
|
|
2265
2628
|
const invalidatedAt = Date.now();
|
|
2266
2629
|
const ctx = _getRequestContext();
|
|
2267
2630
|
const memo = ctx ? getTagMarkerMemo(ctx, this) : undefined;
|
|
2268
2631
|
|
|
2269
|
-
if (!this.kv && !this.onRevalidateTag) {
|
|
2632
|
+
if (!this.kv && !this.onRevalidateTag && !this.tagPurge) {
|
|
2270
2633
|
console.warn(
|
|
2271
2634
|
`[CFCacheStore] invalidateTags had no effect: configure a KV namespace ` +
|
|
2272
|
-
`for distributed invalidation,
|
|
2635
|
+
`for distributed invalidation, a tagPurge hook for purge-by-tag ` +
|
|
2636
|
+
`eviction, or an onRevalidateTag hook.`,
|
|
2273
2637
|
);
|
|
2274
2638
|
}
|
|
2275
2639
|
|
|
@@ -2324,16 +2688,20 @@ export class CFCacheStore<TEnv = unknown> implements SegmentCacheStore<TEnv> {
|
|
|
2324
2688
|
// only when KV is configured. Markers are read exclusively through
|
|
2325
2689
|
// isGloballyInvalidated(), which short-circuits to "not invalidated" when
|
|
2326
2690
|
// !this.kv; writing memo/L1 markers without KV would be dead state no read
|
|
2327
|
-
// path ever consults
|
|
2328
|
-
//
|
|
2329
|
-
//
|
|
2330
|
-
//
|
|
2331
|
-
|
|
2691
|
+
// path ever consults — EXCEPT the memo in purge mode: isL1Invalidated()
|
|
2692
|
+
// consults it (and only it) on every L1 hit, so a KV-less purge-mode store
|
|
2693
|
+
// still writes the memo for same-request read-your-own-writes. The
|
|
2694
|
+
// onRevalidateTag purge below still fires regardless (it is additive and
|
|
2695
|
+
// external to the marker cascade). The memo write is synchronous
|
|
2696
|
+
// (read-your-own-writes); the L1 Cache API writes are independent, so fan
|
|
2697
|
+
// them out in parallel rather than awaiting each.
|
|
2698
|
+
const lookupMarkerCacheActive = Boolean(this.kv) && this.tagCacheTtl > 0;
|
|
2699
|
+
if (this.kv || this.tagPurge) {
|
|
2332
2700
|
const l1Writes: Promise<void>[] = [];
|
|
2333
2701
|
for (const tag of tags) {
|
|
2334
2702
|
if (failedTags.has(tag)) continue;
|
|
2335
2703
|
memo?.set(tag, invalidatedAt);
|
|
2336
|
-
if (
|
|
2704
|
+
if (lookupMarkerCacheActive) {
|
|
2337
2705
|
l1Writes.push(
|
|
2338
2706
|
this.putTagMarkerL1(tag, invalidatedAt, { critical: true }),
|
|
2339
2707
|
);
|
|
@@ -2342,6 +2710,35 @@ export class CFCacheStore<TEnv = unknown> implements SegmentCacheStore<TEnv> {
|
|
|
2342
2710
|
if (l1Writes.length > 0) await Promise.all(l1Writes);
|
|
2343
2711
|
}
|
|
2344
2712
|
|
|
2713
|
+
// Purge mode: evict the tagged L1 entries across every colo via the
|
|
2714
|
+
// consumer's purge-by-tag call. AWAITED, and a failure is correctness-
|
|
2715
|
+
// bearing (unlike onRevalidateTag): with the per-read marker lookup skipped
|
|
2716
|
+
// on L1 hits, a dropped purge leaves L1 serving stale until TTL — so it
|
|
2717
|
+
// surfaces through updateTag() like a failed marker write. Fired for the
|
|
2718
|
+
// whole batch regardless of marker outcome (purging is additive and
|
|
2719
|
+
// idempotent; a retry re-runs both). Lookup Cache-Tags ride along when the
|
|
2720
|
+
// L1 marker cache is active (tagCacheTtl > 0 AND kv — without kv no lookup
|
|
2721
|
+
// entries are ever written) so a single purge call also converges other
|
|
2722
|
+
// colos' cached lookups (no separate onRevalidateTag needed).
|
|
2723
|
+
let purgeError: unknown;
|
|
2724
|
+
if (this.tagPurge) {
|
|
2725
|
+
const purgeTags = tags.flatMap((tag) =>
|
|
2726
|
+
lookupMarkerCacheActive
|
|
2727
|
+
? [this.entryPurgeTag(tag), this.lookupPurgeTag(tag)]
|
|
2728
|
+
: [this.entryPurgeTag(tag)],
|
|
2729
|
+
);
|
|
2730
|
+
try {
|
|
2731
|
+
await this.tagPurge(purgeTags);
|
|
2732
|
+
} catch (error) {
|
|
2733
|
+
purgeError = error ?? new Error("tagPurge rejected");
|
|
2734
|
+
reportCacheError(
|
|
2735
|
+
purgeError,
|
|
2736
|
+
"cache-invalidate",
|
|
2737
|
+
"[CFCacheStore] tagPurge hook",
|
|
2738
|
+
);
|
|
2739
|
+
}
|
|
2740
|
+
}
|
|
2741
|
+
|
|
2345
2742
|
// One batched eager purge of the lookup markers for the whole call. Fired
|
|
2346
2743
|
// regardless of KV write outcome (it is additive and uses pure string ops).
|
|
2347
2744
|
if (this.onRevalidateTag) {
|
|
@@ -2356,13 +2753,25 @@ export class CFCacheStore<TEnv = unknown> implements SegmentCacheStore<TEnv> {
|
|
|
2356
2753
|
}
|
|
2357
2754
|
}
|
|
2358
2755
|
|
|
2359
|
-
if (failedTags.size > 0) {
|
|
2756
|
+
if (failedTags.size > 0 || purgeError) {
|
|
2757
|
+
const parts: string[] = [];
|
|
2758
|
+
if (failedTags.size > 0) {
|
|
2759
|
+
parts.push(
|
|
2760
|
+
`${failedTags.size}/${tags.length} tag marker write(s) failed: ` +
|
|
2761
|
+
`${[...failedTags].join(", ")}`,
|
|
2762
|
+
);
|
|
2763
|
+
}
|
|
2764
|
+
if (purgeError) {
|
|
2765
|
+
parts.push(
|
|
2766
|
+
`the tagPurge purge-by-tag call failed (tagged L1 entries stay ` +
|
|
2767
|
+
`stale until TTL)`,
|
|
2768
|
+
);
|
|
2769
|
+
}
|
|
2360
2770
|
const err = new Error(
|
|
2361
|
-
`[CFCacheStore] ${
|
|
2362
|
-
`failed: ${[...failedTags].join(", ")}. Those tags may still serve ` +
|
|
2771
|
+
`[CFCacheStore] ${parts.join("; ")}. Those tags may still serve ` +
|
|
2363
2772
|
`stale data across requests/colos; retry the invalidation.`,
|
|
2364
2773
|
);
|
|
2365
|
-
(err as Error & { cause?: unknown }).cause = errors[0];
|
|
2774
|
+
(err as Error & { cause?: unknown }).cause = errors[0] ?? purgeError;
|
|
2366
2775
|
throw err;
|
|
2367
2776
|
}
|
|
2368
2777
|
}
|
|
@@ -2455,11 +2864,14 @@ export class CFCacheStore<TEnv = unknown> implements SegmentCacheStore<TEnv> {
|
|
|
2455
2864
|
|
|
2456
2865
|
/**
|
|
2457
2866
|
* Write segment data to KV.
|
|
2867
|
+
*
|
|
2868
|
+
* `dataJson` is the already-serialized CachedEntryData body also stored in
|
|
2869
|
+
* L1 — embedded as envelope.d without a second JSON.stringify walk.
|
|
2458
2870
|
* @internal
|
|
2459
2871
|
*/
|
|
2460
2872
|
private kvSetSegment(
|
|
2461
2873
|
key: string,
|
|
2462
|
-
|
|
2874
|
+
dataJson: string,
|
|
2463
2875
|
staleAt: number,
|
|
2464
2876
|
totalTtl: number,
|
|
2465
2877
|
swrWindow: number,
|
|
@@ -2491,19 +2903,16 @@ export class CFCacheStore<TEnv = unknown> implements SegmentCacheStore<TEnv> {
|
|
|
2491
2903
|
}
|
|
2492
2904
|
|
|
2493
2905
|
const expiresAt = staleAt + swrWindow * 1000;
|
|
2906
|
+
// Same wire shape as JSON.stringify({ d, s, e }) — dataJson is already
|
|
2907
|
+
// valid JSON for CachedEntryData, so embedding it avoids re-walking the tree.
|
|
2908
|
+
const envelopeJson = `{"d":${dataJson},"s":${staleAt},"e":${expiresAt}}`;
|
|
2494
2909
|
|
|
2495
2910
|
this.waitUntil(() =>
|
|
2496
2911
|
reportingAsync(
|
|
2497
|
-
() =>
|
|
2498
|
-
|
|
2499
|
-
d: data,
|
|
2500
|
-
s: staleAt,
|
|
2501
|
-
e: expiresAt,
|
|
2502
|
-
};
|
|
2503
|
-
return this.kv!.put(kvKey, JSON.stringify(envelope), {
|
|
2912
|
+
() =>
|
|
2913
|
+
this.kv!.put(kvKey, envelopeJson, {
|
|
2504
2914
|
expirationTtl: totalTtl,
|
|
2505
|
-
})
|
|
2506
|
-
},
|
|
2915
|
+
}),
|
|
2507
2916
|
"cache-write",
|
|
2508
2917
|
"[CFCacheStore] kvSetSegment",
|
|
2509
2918
|
),
|