@rangojs/router 0.0.0-experimental.tapabs3 → 0.1.1
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 +19 -41
- 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/dev-discovery.d.ts +11 -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 +85 -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/loader.d.ts +10 -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/prefetch/runtime.d.ts +3 -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 +518 -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 +106 -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 +136 -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 +589 -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 +186 -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 +435 -0
- package/dist/types/cache/vercel/index.d.ts +1 -0
- package/dist/types/cache/vercel/vercel-cache-store.d.ts +268 -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/dev-discovery-protocol.d.ts +5 -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 +63 -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 +102 -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 +53 -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 +434 -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 +32 -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 +139 -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 +18 -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 +370 -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 +292 -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 +510 -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 +628 -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 +98 -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 +163 -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 +1208 -431
- package/package.json +45 -34
- package/skills/caching/SKILL.md +1 -1
- 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 +148 -19
- 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/dev-discovery.ts +66 -0
- package/src/browser/event-controller.ts +16 -2
- package/src/browser/navigation-client.ts +6 -0
- package/src/browser/navigation-store.ts +4 -271
- package/src/browser/partial-update.ts +7 -14
- package/src/browser/prefetch/cache.ts +1 -1
- package/src/browser/prefetch/loader.ts +110 -0
- package/src/browser/prefetch/runtime.ts +7 -0
- package/src/browser/react/Link.tsx +7 -10
- package/src/browser/react/NavigationProvider.tsx +1 -1
- package/src/browser/react/use-router.ts +1 -1
- package/src/browser/rsc-router.tsx +15 -2
- package/src/browser/types.ts +4 -27
- package/src/build/generate-manifest.ts +16 -36
- package/src/build/route-trie.ts +5 -50
- package/src/cache/cache-key-utils.ts +0 -1
- package/src/cache/cache-scope.ts +54 -5
- package/src/cache/cf/cf-cache-store.ts +522 -89
- 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 +44 -1
- package/src/cache/segment-codec.ts +47 -0
- package/src/cache/shell-snapshot.ts +124 -29
- package/src/cache/types.ts +57 -2
- package/src/cache/vercel/vercel-cache-store.ts +113 -14
- package/src/deps/ssr.ts +4 -1
- package/src/dev-discovery-protocol.ts +11 -0
- package/src/index.rsc.ts +7 -0
- package/src/index.ts +1 -0
- package/src/prerender/build-shell-capture.ts +453 -0
- package/src/prerender/shell-manifest-key.ts +20 -0
- package/src/prerender/store.ts +15 -1
- package/src/prerender.ts +3 -3
- package/src/redirect-origin.ts +37 -8
- package/src/route-definition/dsl-helpers.ts +7 -2
- package/src/route-map-builder.ts +61 -54
- package/src/router/content-negotiation.ts +47 -5
- package/src/router/handler-context.ts +31 -15
- package/src/router/intercept-resolution.ts +30 -1
- package/src/router/lazy-includes.ts +1 -0
- package/src/router/loader-resolution.ts +16 -0
- package/src/router/match-api.ts +14 -3
- 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 +47 -2
- package/src/router/router-interfaces.ts +11 -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/segment-resolution/static-store.ts +36 -10
- 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 +39 -7
- package/src/rsc/capture-queue.ts +67 -0
- package/src/rsc/handler-context.ts +1 -0
- package/src/rsc/handler.ts +153 -77
- package/src/rsc/helpers.ts +67 -4
- package/src/rsc/loader-fetch.ts +2 -2
- package/src/rsc/manifest-init.ts +4 -11
- package/src/rsc/progressive-enhancement.ts +66 -54
- package/src/rsc/redirect-guard.ts +3 -1
- package/src/rsc/render-pipeline.ts +567 -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 +455 -194
- 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 +622 -73
- package/src/rsc/shell-serve.ts +133 -3
- package/src/rsc/ssr-setup.ts +102 -23
- package/src/rsc/types.ts +2 -0
- package/src/segment-fragments.ts +124 -0
- package/src/server/context.ts +212 -8
- package/src/server/request-context.ts +322 -48
- package/src/server.ts +0 -2
- 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 +133 -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/types/route-entry.ts +3 -0
- package/src/urls/include-helper.ts +1 -0
- package/src/urls/path-helper-types.ts +1 -1
- package/src/urls/path-helper.ts +8 -4
- package/src/urls/pattern-types.ts +29 -0
- package/src/vite/discovery/bundle-postprocess.ts +10 -7
- package/src/vite/discovery/discover-routers.ts +39 -79
- package/src/vite/discovery/prerender-collection.ts +29 -2
- package/src/vite/discovery/shell-prerender-phase.ts +397 -0
- package/src/vite/discovery/state.ts +48 -4
- package/src/vite/discovery/virtual-module-codegen.ts +201 -62
- package/src/vite/index.ts +1 -0
- package/src/vite/plugin-types.ts +33 -0
- package/src/vite/plugins/version-injector.ts +0 -1
- package/src/vite/plugins/version-plugin.ts +8 -0
- package/src/vite/plugins/virtual-entries.ts +48 -5
- package/src/vite/rango.ts +42 -2
- package/src/vite/router-discovery.ts +564 -43
- package/src/vite/utils/manifest-utils.ts +1 -4
- 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 +11 -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
|
// ============================================================================
|
|
@@ -213,7 +272,7 @@ interface KVShellEnvelope {
|
|
|
213
272
|
rv: string;
|
|
214
273
|
/** Build version captured at prerender time (ShellCacheEntry.buildVersion) */
|
|
215
274
|
bv?: string;
|
|
216
|
-
/**
|
|
275
|
+
/** Capture-generation start time (ms epoch), used by tag marker checks. */
|
|
217
276
|
c: number;
|
|
218
277
|
/** When entry becomes stale (ms epoch) */
|
|
219
278
|
s: number;
|
|
@@ -227,6 +286,15 @@ 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;
|
|
296
|
+
/** ShellCacheEntry.transitionWhen; conditional transitions must re-run. */
|
|
297
|
+
tw?: true;
|
|
230
298
|
}
|
|
231
299
|
|
|
232
300
|
/**
|
|
@@ -257,6 +325,7 @@ interface KVResponseEnvelope {
|
|
|
257
325
|
// ============================================================================
|
|
258
326
|
|
|
259
327
|
export class CFCacheStore<TEnv = unknown> implements SegmentCacheStore<TEnv> {
|
|
328
|
+
readonly supportsPassiveShellReads: true = true;
|
|
260
329
|
readonly defaults?: CacheDefaults;
|
|
261
330
|
readonly keyGenerator?: (
|
|
262
331
|
ctx: RequestContext<TEnv>,
|
|
@@ -273,6 +342,7 @@ export class CFCacheStore<TEnv = unknown> implements SegmentCacheStore<TEnv> {
|
|
|
273
342
|
private readonly debug?: (event: CFCacheReadDebugEvent) => void;
|
|
274
343
|
private readonly kv?: KVNamespace;
|
|
275
344
|
private readonly onRevalidateTag?: (tags: string[]) => Promise<void>;
|
|
345
|
+
private readonly tagPurge?: (cacheTags: string[]) => Promise<void>;
|
|
276
346
|
private readonly tagInvalidationTtl?: number;
|
|
277
347
|
private readonly tagCacheTtl: number;
|
|
278
348
|
|
|
@@ -328,6 +398,16 @@ export class CFCacheStore<TEnv = unknown> implements SegmentCacheStore<TEnv> {
|
|
|
328
398
|
this.waitUntil = (fn) => options.ctx.waitUntil(fn());
|
|
329
399
|
this.kv = options.kv;
|
|
330
400
|
this.onRevalidateTag = options.onRevalidateTag;
|
|
401
|
+
// tagPurge accepts a ready purge function or a credentials object; the
|
|
402
|
+
// object form is normalized through the built-in zone purge client, which
|
|
403
|
+
// validates zoneId/apiToken eagerly so an unset env var fails at
|
|
404
|
+
// construction instead of on the first updateTag().
|
|
405
|
+
this.tagPurge =
|
|
406
|
+
typeof options.tagPurge === "function"
|
|
407
|
+
? options.tagPurge
|
|
408
|
+
: options.tagPurge
|
|
409
|
+
? createCloudflareZonePurge(options.tagPurge)
|
|
410
|
+
: undefined;
|
|
331
411
|
// tagInvalidationTtl feeds KV's expirationTtl, which CF rejects below
|
|
332
412
|
// KV_MIN_EXPIRATION_TTL (60s) -- a too-small finite value would make EVERY
|
|
333
413
|
// marker write throw and break ALL invalidation. Floor it (and warn once);
|
|
@@ -350,8 +430,14 @@ export class CFCacheStore<TEnv = unknown> implements SegmentCacheStore<TEnv> {
|
|
|
350
430
|
// tag machinery (tagCacheTtl for L1 markers, or onRevalidateTag for CDN purge)
|
|
351
431
|
// but omits kv gets only the purge fired - marker writes are skipped without
|
|
352
432
|
// kv - yet every tagged read still serves stale data with no other signal.
|
|
353
|
-
// Surface that misconfiguration.
|
|
354
|
-
|
|
433
|
+
// Surface that misconfiguration. Exception: with tagPurge configured (purge
|
|
434
|
+
// mode) L1 eviction is the purge itself, so a KV-less store is a supported
|
|
435
|
+
// L1-only configuration, not a silent no-op.
|
|
436
|
+
if (
|
|
437
|
+
!this.kv &&
|
|
438
|
+
!this.tagPurge &&
|
|
439
|
+
(this.tagCacheTtl > 0 || this.onRevalidateTag)
|
|
440
|
+
) {
|
|
355
441
|
this.warnOncePerNamespace(
|
|
356
442
|
warnedNoKvReadInvalidation,
|
|
357
443
|
`[CFCacheStore] tagCacheTtl/onRevalidateTag is configured without a KV ` +
|
|
@@ -867,9 +953,10 @@ export class CFCacheStore<TEnv = unknown> implements SegmentCacheStore<TEnv> {
|
|
|
867
953
|
// when debug is on, so the hot path pays nothing. It is the serial read
|
|
868
954
|
// that sits between matchMs and bodyReadMs for a tagged entry.
|
|
869
955
|
const markerStart = this.debug ? Date.now() : 0;
|
|
870
|
-
const invalidated = await this.
|
|
956
|
+
const invalidated = await this.isL1Invalidated(
|
|
871
957
|
tagInfo.tags,
|
|
872
958
|
tagInfo.taggedAt,
|
|
959
|
+
response.headers,
|
|
873
960
|
);
|
|
874
961
|
const markerMs = this.debug ? Date.now() - markerStart : undefined;
|
|
875
962
|
if (invalidated) {
|
|
@@ -1025,6 +1112,7 @@ export class CFCacheStore<TEnv = unknown> implements SegmentCacheStore<TEnv> {
|
|
|
1025
1112
|
swr?: number,
|
|
1026
1113
|
): Promise<void> {
|
|
1027
1114
|
if (this.isReservedSegmentKey(key, "cache-write")) return;
|
|
1115
|
+
if (this.skipUncacheableTagSet(data.tags)) return;
|
|
1028
1116
|
try {
|
|
1029
1117
|
const cache = await this.getCache();
|
|
1030
1118
|
const request = this.keyToRequest(key);
|
|
@@ -1045,6 +1133,9 @@ export class CFCacheStore<TEnv = unknown> implements SegmentCacheStore<TEnv> {
|
|
|
1045
1133
|
? { ...data, taggedAt }
|
|
1046
1134
|
: data;
|
|
1047
1135
|
|
|
1136
|
+
// Serialize the segment payload exactly once: L1 stores the JSON body
|
|
1137
|
+
// directly, and kvSetSegment embeds the same string as envelope.d so the
|
|
1138
|
+
// (potentially large) Flight/segment tree is not walked a second time.
|
|
1048
1139
|
const body = JSON.stringify(dataToStore);
|
|
1049
1140
|
const response = new Response(body, {
|
|
1050
1141
|
headers: {
|
|
@@ -1081,8 +1172,8 @@ export class CFCacheStore<TEnv = unknown> implements SegmentCacheStore<TEnv> {
|
|
|
1081
1172
|
await putPromise;
|
|
1082
1173
|
}
|
|
1083
1174
|
|
|
1084
|
-
// L2: persist to KV
|
|
1085
|
-
this.kvSetSegment(key,
|
|
1175
|
+
// L2: persist to KV (reuses `body` as envelope.d)
|
|
1176
|
+
this.kvSetSegment(key, body, staleAt, totalTtl, swrWindow);
|
|
1086
1177
|
} catch (error) {
|
|
1087
1178
|
reportCacheError(error, "cache-write", "[CFCacheStore] set");
|
|
1088
1179
|
}
|
|
@@ -1156,7 +1247,13 @@ export class CFCacheStore<TEnv = unknown> implements SegmentCacheStore<TEnv> {
|
|
|
1156
1247
|
|
|
1157
1248
|
// Tag invalidation check (treat invalidated entry as a miss).
|
|
1158
1249
|
const tagInfo = this.readTagInfo(response.headers);
|
|
1159
|
-
if (
|
|
1250
|
+
if (
|
|
1251
|
+
await this.isL1Invalidated(
|
|
1252
|
+
tagInfo.tags,
|
|
1253
|
+
tagInfo.taggedAt,
|
|
1254
|
+
response.headers,
|
|
1255
|
+
)
|
|
1256
|
+
) {
|
|
1160
1257
|
return null;
|
|
1161
1258
|
}
|
|
1162
1259
|
|
|
@@ -1232,6 +1329,11 @@ export class CFCacheStore<TEnv = unknown> implements SegmentCacheStore<TEnv> {
|
|
|
1232
1329
|
headers.delete(CACHE_STATUS_HEADER);
|
|
1233
1330
|
headers.delete(CACHE_TAGS_HEADER);
|
|
1234
1331
|
headers.delete(CACHE_TAGGED_AT_HEADER);
|
|
1332
|
+
// Remove OUR namespaced tokens from Cache-Tag while preserving any the
|
|
1333
|
+
// document author set (setTagHeaders appended ours onto theirs). The
|
|
1334
|
+
// author's tags may be load-bearing for their own CDN purging; ours are
|
|
1335
|
+
// internal storage bookkeeping and must not leak to clients.
|
|
1336
|
+
this.stripInternalCacheTags(headers);
|
|
1235
1337
|
// Internal stale-path bookkeeping (hard-expiry deadline + REVALIDATING
|
|
1236
1338
|
// stamp). Carried on doc L1 entries for the herd guard; never serve them.
|
|
1237
1339
|
headers.delete(CACHE_EXPIRES_AT_HEADER);
|
|
@@ -1257,6 +1359,7 @@ export class CFCacheStore<TEnv = unknown> implements SegmentCacheStore<TEnv> {
|
|
|
1257
1359
|
swr?: number,
|
|
1258
1360
|
tags?: string[],
|
|
1259
1361
|
): Promise<void> {
|
|
1362
|
+
if (this.skipUncacheableTagSet(tags)) return;
|
|
1260
1363
|
try {
|
|
1261
1364
|
const cache = await this.getCache();
|
|
1262
1365
|
const request = this.keyToRequest(`doc:${key}`);
|
|
@@ -1424,9 +1527,10 @@ export class CFCacheStore<TEnv = unknown> implements SegmentCacheStore<TEnv> {
|
|
|
1424
1527
|
// marker-resolution tail only under debug (see get()).
|
|
1425
1528
|
const tagInfo = this.readTagInfo(response.headers);
|
|
1426
1529
|
const markerStart = this.debug ? Date.now() : 0;
|
|
1427
|
-
const invalidated = await this.
|
|
1530
|
+
const invalidated = await this.isL1Invalidated(
|
|
1428
1531
|
tagInfo.tags,
|
|
1429
1532
|
tagInfo.taggedAt,
|
|
1533
|
+
response.headers,
|
|
1430
1534
|
);
|
|
1431
1535
|
const markerMs = this.debug ? Date.now() - markerStart : undefined;
|
|
1432
1536
|
if (invalidated) {
|
|
@@ -1554,6 +1658,7 @@ export class CFCacheStore<TEnv = unknown> implements SegmentCacheStore<TEnv> {
|
|
|
1554
1658
|
value: string,
|
|
1555
1659
|
options?: CacheItemOptions,
|
|
1556
1660
|
): Promise<void> {
|
|
1661
|
+
if (this.skipUncacheableTagSet(options?.tags)) return;
|
|
1557
1662
|
try {
|
|
1558
1663
|
const cache = await this.getCache();
|
|
1559
1664
|
const request = this.keyToRequest(`fn:${key}`);
|
|
@@ -1567,7 +1672,17 @@ export class CFCacheStore<TEnv = unknown> implements SegmentCacheStore<TEnv> {
|
|
|
1567
1672
|
const taggedAt =
|
|
1568
1673
|
Array.isArray(tags) && tags.length > 0 ? Date.now() : undefined;
|
|
1569
1674
|
|
|
1570
|
-
|
|
1675
|
+
// Serialize value/handles once; L1 body and KV envelope.v/h share the
|
|
1676
|
+
// escaped strings so a large RSC payload is not re-escaped for L2.
|
|
1677
|
+
const valueJson = JSON.stringify(value);
|
|
1678
|
+
const handlesJson =
|
|
1679
|
+
options?.handles !== undefined
|
|
1680
|
+
? JSON.stringify(options.handles)
|
|
1681
|
+
: undefined;
|
|
1682
|
+
const body =
|
|
1683
|
+
handlesJson !== undefined
|
|
1684
|
+
? `{"value":${valueJson},"handles":${handlesJson}}`
|
|
1685
|
+
: `{"value":${valueJson}}`;
|
|
1571
1686
|
const response = new Response(body, {
|
|
1572
1687
|
headers: {
|
|
1573
1688
|
"Content-Type": "application/json",
|
|
@@ -1594,24 +1709,24 @@ export class CFCacheStore<TEnv = unknown> implements SegmentCacheStore<TEnv> {
|
|
|
1594
1709
|
await putPromise;
|
|
1595
1710
|
}
|
|
1596
1711
|
|
|
1597
|
-
// L2: persist to KV (KV requires expirationTtl >= 60s)
|
|
1712
|
+
// L2: persist to KV (KV requires expirationTtl >= 60s). Wire shape matches
|
|
1713
|
+
// JSON.stringify(KVItemEnvelope); field names differ from L1 so we assemble
|
|
1714
|
+
// from the pre-escaped value/handles pieces rather than re-stringifying.
|
|
1598
1715
|
if (this.kv && this.waitUntil && totalTtl >= 60) {
|
|
1599
1716
|
const kvKey = this.toKVKey(`fn:${key}`);
|
|
1717
|
+
const expiresAt = staleAt + swrWindow * 1000;
|
|
1718
|
+
let envelopeJson = `{"v":${valueJson}`;
|
|
1719
|
+
if (handlesJson !== undefined) envelopeJson += `,"h":${handlesJson}`;
|
|
1720
|
+
envelopeJson += `,"s":${staleAt},"e":${expiresAt}`;
|
|
1721
|
+
if (tags !== undefined) envelopeJson += `,"t":${JSON.stringify(tags)}`;
|
|
1722
|
+
if (taggedAt !== undefined) envelopeJson += `,"ta":${taggedAt}`;
|
|
1723
|
+
envelopeJson += `}`;
|
|
1600
1724
|
this.waitUntil(() =>
|
|
1601
1725
|
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), {
|
|
1726
|
+
() =>
|
|
1727
|
+
this.kv!.put(kvKey, envelopeJson, {
|
|
1612
1728
|
expirationTtl: totalTtl,
|
|
1613
|
-
})
|
|
1614
|
-
},
|
|
1729
|
+
}),
|
|
1615
1730
|
"cache-write",
|
|
1616
1731
|
"[CFCacheStore] kvSetItem",
|
|
1617
1732
|
),
|
|
@@ -1631,21 +1746,45 @@ export class CFCacheStore<TEnv = unknown> implements SegmentCacheStore<TEnv> {
|
|
|
1631
1746
|
// per-colo L1 for them is a deliberate follow-up (see the PPR shell-resume
|
|
1632
1747
|
// design doc). Shell entries live only in KV (the global tier), so the family
|
|
1633
1748
|
// requires a configured KV namespace; without one, getShell/putShell no-op and
|
|
1634
|
-
// the
|
|
1749
|
+
// the integrated PPR serve path fails open to a full HTML render. Tag invalidation
|
|
1635
1750
|
// still applies: shell entries carry tags/taggedAt and are checked against the
|
|
1636
1751
|
// same KV markers isGloballyInvalidated() reads for every other tier.
|
|
1637
1752
|
|
|
1753
|
+
/**
|
|
1754
|
+
* Warn once per isolate that the shell family is inert: getShell/putShell
|
|
1755
|
+
* are ONLY called for routes that declared the `ppr` path option, so firing
|
|
1756
|
+
* here (not in the constructor) scopes the warning to apps that actually
|
|
1757
|
+
* use PPR — a KV-less CFCacheStore is a perfectly fine config otherwise.
|
|
1758
|
+
* Without it, the correctness-first fail-open (issue #651) is invisible:
|
|
1759
|
+
* every ppr route is a permanent MISS with zero diagnostics.
|
|
1760
|
+
* @internal
|
|
1761
|
+
*/
|
|
1762
|
+
private warnShellFamilyInertOnce(): void {
|
|
1763
|
+
this.warnOncePerNamespace(
|
|
1764
|
+
warnedShellFamilyInert,
|
|
1765
|
+
`[CFCacheStore] a ppr route resolved to this store, but no KV namespace ` +
|
|
1766
|
+
`is configured, so the shell family (getShell/putShell) is a no-op: ` +
|
|
1767
|
+
`every ppr route stays a permanent shell MISS (the page still serves ` +
|
|
1768
|
+
`via a full render). Bind a KV namespace and pass it — ` +
|
|
1769
|
+
`new CFCacheStore({ ctx, kv: env.CACHE_KV }) — or use a shell-capable ` +
|
|
1770
|
+
`store via createRouter({ cache }).`,
|
|
1771
|
+
);
|
|
1772
|
+
}
|
|
1773
|
+
|
|
1638
1774
|
/**
|
|
1639
1775
|
* Get a cached PPR shell entry by key from KV (no L1). Applies the KV read
|
|
1640
1776
|
* budget, corrupt-entry eviction, hard-expiry, and tag invalidation exactly
|
|
1641
1777
|
* like kvGetItem, minus the L1 promote. SWR is a plain staleness flag — KV has
|
|
1642
|
-
* no REVALIDATING herd guard, so the
|
|
1778
|
+
* no REVALIDATING herd guard, so the capture scheduler's module-level
|
|
1643
1779
|
* in-flight set is the recapture stampede guard.
|
|
1644
1780
|
*/
|
|
1645
1781
|
async getShell(
|
|
1646
1782
|
key: string,
|
|
1647
1783
|
): Promise<{ entry: ShellCacheEntry; shouldRevalidate?: boolean } | null> {
|
|
1648
|
-
if (!this.kv)
|
|
1784
|
+
if (!this.kv) {
|
|
1785
|
+
this.warnShellFamilyInertOnce();
|
|
1786
|
+
return null;
|
|
1787
|
+
}
|
|
1649
1788
|
try {
|
|
1650
1789
|
const kvKey = this.toKVKey(`shell:${key}`);
|
|
1651
1790
|
const { value: envelope, timedOut } =
|
|
@@ -1678,6 +1817,8 @@ export class CFCacheStore<TEnv = unknown> implements SegmentCacheStore<TEnv> {
|
|
|
1678
1817
|
buildVersion: envelope.bv,
|
|
1679
1818
|
initialTheme: envelope.i,
|
|
1680
1819
|
snapshot: envelope.sn,
|
|
1820
|
+
handlerLiveHoles: envelope.lh,
|
|
1821
|
+
transitionWhen: envelope.tw,
|
|
1681
1822
|
createdAt: envelope.c,
|
|
1682
1823
|
},
|
|
1683
1824
|
shouldRevalidate,
|
|
@@ -1689,8 +1830,9 @@ export class CFCacheStore<TEnv = unknown> implements SegmentCacheStore<TEnv> {
|
|
|
1689
1830
|
}
|
|
1690
1831
|
|
|
1691
1832
|
/**
|
|
1692
|
-
* Store a PPR shell entry in KV with TTL and optional SWR window.
|
|
1693
|
-
*
|
|
1833
|
+
* Store a PPR shell entry in KV with TTL and optional SWR window. The write is
|
|
1834
|
+
* registered with waitUntil and awaited so invalidation rejection can be
|
|
1835
|
+
* acknowledged to the capture scheduler. The tags/taggedAt ride in the envelope
|
|
1694
1836
|
* so isGloballyInvalidated() can invalidate the shell via the shared KV markers.
|
|
1695
1837
|
*/
|
|
1696
1838
|
async putShell(
|
|
@@ -1699,9 +1841,15 @@ export class CFCacheStore<TEnv = unknown> implements SegmentCacheStore<TEnv> {
|
|
|
1699
1841
|
ttlSeconds?: number,
|
|
1700
1842
|
swrSeconds?: number,
|
|
1701
1843
|
tags?: string[],
|
|
1702
|
-
): Promise<void> {
|
|
1703
|
-
// KV-only tier: needs a KV namespace and waitUntil
|
|
1704
|
-
|
|
1844
|
+
): Promise<"stored" | "invalidated" | void> {
|
|
1845
|
+
// KV-only tier: needs a KV namespace and waitUntil. The same write promise is
|
|
1846
|
+
// registered for isolate lifetime and awaited so invalidation rejection can
|
|
1847
|
+
// be acknowledged to the capture scheduler.
|
|
1848
|
+
if (!this.kv) {
|
|
1849
|
+
this.warnShellFamilyInertOnce();
|
|
1850
|
+
return;
|
|
1851
|
+
}
|
|
1852
|
+
if (!this.waitUntil) return;
|
|
1705
1853
|
try {
|
|
1706
1854
|
const ttl = resolveTtl(ttlSeconds, this.defaults, DEFAULT_FUNCTION_TTL);
|
|
1707
1855
|
const swrWindow = resolveSwrWindow(swrSeconds, this.defaults);
|
|
@@ -1710,9 +1858,15 @@ export class CFCacheStore<TEnv = unknown> implements SegmentCacheStore<TEnv> {
|
|
|
1710
1858
|
// letting kv.put reject inside waitUntil (mirrors setItem/kvSetSegment).
|
|
1711
1859
|
if (totalTtl < 60) return;
|
|
1712
1860
|
|
|
1713
|
-
const
|
|
1861
|
+
const retentionTtl =
|
|
1862
|
+
tags && tags.length > 0 && this.tagInvalidationTtl
|
|
1863
|
+
? Math.min(totalTtl, this.tagInvalidationTtl)
|
|
1864
|
+
: totalTtl;
|
|
1865
|
+
const now = Date.now();
|
|
1866
|
+
const staleAt = now + ttl * 1000;
|
|
1867
|
+
const expiresAt = now + retentionTtl * 1000;
|
|
1714
1868
|
const taggedAt =
|
|
1715
|
-
Array.isArray(tags) && tags.length > 0 ?
|
|
1869
|
+
Array.isArray(tags) && tags.length > 0 ? entry.createdAt : undefined;
|
|
1716
1870
|
|
|
1717
1871
|
const kvKey = this.toKVKey(`shell:${key}`);
|
|
1718
1872
|
// A key over the KV limit makes kv.put reject deep inside waitUntil; report
|
|
@@ -1730,30 +1884,43 @@ export class CFCacheStore<TEnv = unknown> implements SegmentCacheStore<TEnv> {
|
|
|
1730
1884
|
return;
|
|
1731
1885
|
}
|
|
1732
1886
|
|
|
1733
|
-
|
|
1734
|
-
|
|
1735
|
-
(
|
|
1736
|
-
|
|
1737
|
-
|
|
1738
|
-
|
|
1739
|
-
|
|
1740
|
-
|
|
1741
|
-
|
|
1742
|
-
|
|
1743
|
-
|
|
1744
|
-
|
|
1745
|
-
|
|
1746
|
-
|
|
1747
|
-
|
|
1748
|
-
|
|
1749
|
-
|
|
1750
|
-
|
|
1751
|
-
|
|
1752
|
-
|
|
1753
|
-
|
|
1754
|
-
|
|
1755
|
-
|
|
1756
|
-
|
|
1887
|
+
const write = (async (): Promise<"stored" | "invalidated" | void> => {
|
|
1888
|
+
try {
|
|
1889
|
+
if (
|
|
1890
|
+
tags &&
|
|
1891
|
+
tags.length > 0 &&
|
|
1892
|
+
(await this.isGloballyInvalidated(tags, entry.createdAt))
|
|
1893
|
+
) {
|
|
1894
|
+
return "invalidated";
|
|
1895
|
+
}
|
|
1896
|
+
const envelope: KVShellEnvelope = {
|
|
1897
|
+
p: entry.prelude,
|
|
1898
|
+
po: entry.postponed,
|
|
1899
|
+
rv: entry.reactVersion,
|
|
1900
|
+
bv: entry.buildVersion,
|
|
1901
|
+
c: entry.createdAt,
|
|
1902
|
+
s: staleAt,
|
|
1903
|
+
e: expiresAt,
|
|
1904
|
+
t: tags,
|
|
1905
|
+
ta: taggedAt,
|
|
1906
|
+
i: entry.initialTheme,
|
|
1907
|
+
sn: entry.snapshot,
|
|
1908
|
+
lh: entry.handlerLiveHoles,
|
|
1909
|
+
tw: entry.transitionWhen,
|
|
1910
|
+
};
|
|
1911
|
+
await this.kv!.put(kvKey, JSON.stringify(envelope), {
|
|
1912
|
+
expirationTtl: retentionTtl,
|
|
1913
|
+
});
|
|
1914
|
+
return "stored";
|
|
1915
|
+
} catch (error) {
|
|
1916
|
+
reportCacheError(error, "cache-write", "[CFCacheStore] putShell");
|
|
1917
|
+
return undefined;
|
|
1918
|
+
}
|
|
1919
|
+
})();
|
|
1920
|
+
this.waitUntil(async () => {
|
|
1921
|
+
await write;
|
|
1922
|
+
});
|
|
1923
|
+
return await write;
|
|
1757
1924
|
} catch (error) {
|
|
1758
1925
|
reportCacheError(error, "cache-write", "[CFCacheStore] putShell");
|
|
1759
1926
|
}
|
|
@@ -1938,13 +2105,19 @@ export class CFCacheStore<TEnv = unknown> implements SegmentCacheStore<TEnv> {
|
|
|
1938
2105
|
* Header entries carrying an entry's tags (JSON-encoded, comma-safe) and the
|
|
1939
2106
|
* timestamp they were attached. Returns an empty object when there are no
|
|
1940
2107
|
* tags so untagged entries stay header-free and skip the invalidation check.
|
|
2108
|
+
*
|
|
2109
|
+
* Also stamps the namespaced `Cache-Tag` header (see entryCacheTags) so a
|
|
2110
|
+
* Cloudflare purge-by-tag can evict the entry — the mechanism purge mode
|
|
2111
|
+
* (tagPurge) relies on. Written unconditionally (not only in purge mode):
|
|
2112
|
+
* it costs a small header and makes existing entries purgeable the moment a
|
|
2113
|
+
* consumer turns purge mode on, with no re-render needed.
|
|
1941
2114
|
*/
|
|
1942
2115
|
private tagHeaderEntries(
|
|
1943
2116
|
tags: string[] | undefined,
|
|
1944
2117
|
taggedAt: number | undefined,
|
|
1945
2118
|
): Record<string, string> {
|
|
1946
2119
|
if (!Array.isArray(tags) || tags.length === 0 || !taggedAt) return {};
|
|
1947
|
-
|
|
2120
|
+
const entries: Record<string, string> = {
|
|
1948
2121
|
// encodeURIComponent so the value is pure ASCII: HTTP header values are
|
|
1949
2122
|
// ByteStrings, but JSON.stringify leaves codepoints > U+00FF (emoji/CJK)
|
|
1950
2123
|
// verbatim, which makes new Response({ headers }) throw and the outer
|
|
@@ -1953,13 +2126,78 @@ export class CFCacheStore<TEnv = unknown> implements SegmentCacheStore<TEnv> {
|
|
|
1953
2126
|
[CACHE_TAGS_HEADER]: encodeURIComponent(JSON.stringify(tags)),
|
|
1954
2127
|
[CACHE_TAGGED_AT_HEADER]: String(taggedAt),
|
|
1955
2128
|
};
|
|
2129
|
+
// Over Cloudflare's aggregate Cache-Tag limit the header is OMITTED — the
|
|
2130
|
+
// entry still caches and stays marker-invalidatable; it just cannot be
|
|
2131
|
+
// purge-evicted per tag (isL1Invalidated falls back to the marker check
|
|
2132
|
+
// for such entries, so purge mode stays correct). Emitting a header over
|
|
2133
|
+
// the limit would instead risk failing the whole L1 write. The KV-LESS
|
|
2134
|
+
// purge-mode combination never reaches here: there the marker fallback
|
|
2135
|
+
// has no KV to consult, so skipUncacheableTagSet rejects the write first.
|
|
2136
|
+
const cacheTag = this.entryCacheTagHeader(tags);
|
|
2137
|
+
if (cacheTag !== null) {
|
|
2138
|
+
entries["Cache-Tag"] = cacheTag;
|
|
2139
|
+
} else {
|
|
2140
|
+
this.warnOncePerNamespace(
|
|
2141
|
+
warnedCacheTagHeaderOverflow,
|
|
2142
|
+
`[CFCacheStore] an entry's ${tags.length} tags produce a Cache-Tag ` +
|
|
2143
|
+
`header over Cloudflare's ${CACHE_TAG_HEADER_MAX_BYTES}-byte ` +
|
|
2144
|
+
`limit; the header was omitted. The entry stays cacheable and ` +
|
|
2145
|
+
`marker-invalidatable, but a purge-by-tag cannot evict it (purge ` +
|
|
2146
|
+
`mode falls back to the marker check for it). Reduce the number ` +
|
|
2147
|
+
`of tags per entry.`,
|
|
2148
|
+
);
|
|
2149
|
+
}
|
|
2150
|
+
return entries;
|
|
2151
|
+
}
|
|
2152
|
+
|
|
2153
|
+
/**
|
|
2154
|
+
* Joined entry Cache-Tag header value for `tags`, or null when it would
|
|
2155
|
+
* exceed Cloudflare's aggregate header limit. Tokens are pure ASCII
|
|
2156
|
+
* (encodeURIComponent output), so .length is bytes.
|
|
2157
|
+
* @internal
|
|
2158
|
+
*/
|
|
2159
|
+
private entryCacheTagHeader(tags: string[]): string | null {
|
|
2160
|
+
const joined = this.entryCacheTags(tags).join(",");
|
|
2161
|
+
return joined.length <= CACHE_TAG_HEADER_MAX_BYTES ? joined : null;
|
|
2162
|
+
}
|
|
2163
|
+
|
|
2164
|
+
/**
|
|
2165
|
+
* Write-path gate for the one configuration where an over-limit tag set has
|
|
2166
|
+
* NO invalidation path: purge mode WITHOUT KV. There the entry Cache-Tag
|
|
2167
|
+
* tokens are the only eviction mechanism, and a tag set whose header
|
|
2168
|
+
* overflows CACHE_TAG_HEADER_MAX_BYTES gets no tokens — a purge could never
|
|
2169
|
+
* evict the entry and there is no KV marker fallback, so it would serve
|
|
2170
|
+
* stale until TTL while updateTag() reports success. Returns true (and
|
|
2171
|
+
* warns once) so the caller SKIPS caching: the route simply renders fresh,
|
|
2172
|
+
* which is the fail-safe direction. With KV configured the omitted-header
|
|
2173
|
+
* entry falls back to the marker check (see tagHeaderEntries), and KV-less
|
|
2174
|
+
* MARKER mode keeps its documented no-read-side-invalidation semantics —
|
|
2175
|
+
* neither is gated.
|
|
2176
|
+
* @internal
|
|
2177
|
+
*/
|
|
2178
|
+
private skipUncacheableTagSet(tags: string[] | undefined): boolean {
|
|
2179
|
+
if (!this.tagPurge || this.kv) return false;
|
|
2180
|
+
if (!Array.isArray(tags) || tags.length === 0) return false;
|
|
2181
|
+
if (this.entryCacheTagHeader(tags) !== null) return false;
|
|
2182
|
+
this.warnOncePerNamespace(
|
|
2183
|
+
warnedCacheTagOverflowUncacheable,
|
|
2184
|
+
`[CFCacheStore] an entry's ${tags.length} tags produce a Cache-Tag ` +
|
|
2185
|
+
`header over Cloudflare's ${CACHE_TAG_HEADER_MAX_BYTES}-byte limit. ` +
|
|
2186
|
+
`In purge mode without KV those tokens are the only invalidation ` +
|
|
2187
|
+
`path, so the entry was NOT cached (it renders fresh instead of ` +
|
|
2188
|
+
`becoming un-invalidatable). Reduce the number of tags per entry, ` +
|
|
2189
|
+
`or configure { kv } to get the marker fallback.`,
|
|
2190
|
+
);
|
|
2191
|
+
return true;
|
|
1956
2192
|
}
|
|
1957
2193
|
|
|
1958
2194
|
/**
|
|
1959
2195
|
* Merge the internal tag headers onto an existing Headers instance. The
|
|
1960
2196
|
* from-scratch paths spread tagHeaderEntries() into an object-literal init;
|
|
1961
2197
|
* the document put/promote paths build a Headers first, so they .set() each
|
|
1962
|
-
* entry instead
|
|
2198
|
+
* entry instead — except `Cache-Tag`, which is APPENDED: a document author
|
|
2199
|
+
* may have set their own Cache-Tag, and clobbering it would break their CDN
|
|
2200
|
+
* purging. Append produces the comma-merged list CF expects.
|
|
1963
2201
|
*/
|
|
1964
2202
|
private setTagHeaders(
|
|
1965
2203
|
headers: Headers,
|
|
@@ -1969,7 +2207,8 @@ export class CFCacheStore<TEnv = unknown> implements SegmentCacheStore<TEnv> {
|
|
|
1969
2207
|
for (const [name, value] of Object.entries(
|
|
1970
2208
|
this.tagHeaderEntries(tags, taggedAt),
|
|
1971
2209
|
)) {
|
|
1972
|
-
headers.
|
|
2210
|
+
if (name === "Cache-Tag") headers.append(name, value);
|
|
2211
|
+
else headers.set(name, value);
|
|
1973
2212
|
}
|
|
1974
2213
|
}
|
|
1975
2214
|
|
|
@@ -2037,6 +2276,46 @@ export class CFCacheStore<TEnv = unknown> implements SegmentCacheStore<TEnv> {
|
|
|
2037
2276
|
}
|
|
2038
2277
|
}
|
|
2039
2278
|
|
|
2279
|
+
/**
|
|
2280
|
+
* Tag-invalidation check for an L1 (Cache API) hit. In purge mode (tagPurge
|
|
2281
|
+
* configured), invalidateTags() evicts L1 entries via a Cloudflare
|
|
2282
|
+
* purge-by-tag call, so a hit that SURVIVED is trusted without a per-read
|
|
2283
|
+
* marker lookup — that skipped lookup is the entire point of purge mode.
|
|
2284
|
+
* Only the per-request memo is consulted (synchronous, no KV read) so a
|
|
2285
|
+
* request that ran updateTag() still masks its own entries during the purge
|
|
2286
|
+
* propagation window (read-your-own-writes).
|
|
2287
|
+
*
|
|
2288
|
+
* The trust is conditional on the entry actually CARRYING this store's
|
|
2289
|
+
* entry Cache-Tag tokens (`headers`): an entry a purge cannot reach — one
|
|
2290
|
+
* written before the tokens existed, or whose tag set overflowed the
|
|
2291
|
+
* Cache-Tag header limit — keeps the full marker check, or purge mode
|
|
2292
|
+
* would serve it stale until TTL with no eviction path.
|
|
2293
|
+
*
|
|
2294
|
+
* Without tagPurge this is the full marker cascade. KV-tier reads and
|
|
2295
|
+
* shells always use isGloballyInvalidated directly: purge cannot reach KV,
|
|
2296
|
+
* so the markers stay their invalidation mechanism.
|
|
2297
|
+
* @internal
|
|
2298
|
+
*/
|
|
2299
|
+
private async isL1Invalidated(
|
|
2300
|
+
tags: string[] | undefined,
|
|
2301
|
+
taggedAt: number | undefined,
|
|
2302
|
+
headers: Headers,
|
|
2303
|
+
): Promise<boolean> {
|
|
2304
|
+
if (!this.tagPurge) return this.isGloballyInvalidated(tags, taggedAt);
|
|
2305
|
+
if (!Array.isArray(tags) || tags.length === 0 || !taggedAt) return false;
|
|
2306
|
+
if (!this.hasEntryCacheTags(headers)) {
|
|
2307
|
+
return this.isGloballyInvalidated(tags, taggedAt);
|
|
2308
|
+
}
|
|
2309
|
+
const ctx = _getRequestContext();
|
|
2310
|
+
if (!ctx) return false;
|
|
2311
|
+
const memo = getTagMarkerMemo(ctx, this);
|
|
2312
|
+
for (const tag of tags) {
|
|
2313
|
+
const marker = memo.get(tag);
|
|
2314
|
+
if (marker != null && marker >= taggedAt) return true;
|
|
2315
|
+
}
|
|
2316
|
+
return false;
|
|
2317
|
+
}
|
|
2318
|
+
|
|
2040
2319
|
/** Synthetic Cache API request for a tag's L1-cached invalidation marker. */
|
|
2041
2320
|
private tagMarkerRequest(tag: string): Request {
|
|
2042
2321
|
return this.keyToRequest(`${TAG_MARKER_CACHE_PREFIX}${tag}`);
|
|
@@ -2166,6 +2445,18 @@ export class CFCacheStore<TEnv = unknown> implements SegmentCacheStore<TEnv> {
|
|
|
2166
2445
|
return resolved;
|
|
2167
2446
|
}
|
|
2168
2447
|
|
|
2448
|
+
/**
|
|
2449
|
+
* Namespace token used inside every `rg:*` Cache-Tag. encodeURIComponent'd
|
|
2450
|
+
* like the tag values: a raw namespace containing a comma would split into
|
|
2451
|
+
* bogus tokens inside the comma-delimited Cache-Tag header — breaking both
|
|
2452
|
+
* stripInternalCacheTags (internal tokens would leak to clients) and the
|
|
2453
|
+
* purge match (the purged tag string never equals any stored token).
|
|
2454
|
+
* @internal
|
|
2455
|
+
*/
|
|
2456
|
+
private nsToken(): string {
|
|
2457
|
+
return encodeURIComponent(this.namespace ?? "default");
|
|
2458
|
+
}
|
|
2459
|
+
|
|
2169
2460
|
/**
|
|
2170
2461
|
* Cloudflare Cache-Tags written on a tag's L1 marker entry, namespaced per
|
|
2171
2462
|
* store so purges never collide with other Cache-Tags in the zone. Three
|
|
@@ -2173,19 +2464,99 @@ export class CFCacheStore<TEnv = unknown> implements SegmentCacheStore<TEnv> {
|
|
|
2173
2464
|
* rg:{ns} - everything this store cached (deploy/nuclear reset)
|
|
2174
2465
|
* rg:{ns}:lk - all tag-lookup markers
|
|
2175
2466
|
* rg:{ns}:lk:{tag} - this tag's lookup (the normal updateTag purge target)
|
|
2176
|
-
* The tag value
|
|
2177
|
-
* comma-delimited Cache-Tag header.
|
|
2467
|
+
* The namespace and tag value are encodeURIComponent'd so commas/spaces
|
|
2468
|
+
* can't corrupt the comma-delimited Cache-Tag header.
|
|
2178
2469
|
* @internal
|
|
2179
2470
|
*/
|
|
2180
2471
|
private lookupCacheTags(tag: string): string[] {
|
|
2181
|
-
const ns = this.
|
|
2472
|
+
const ns = this.nsToken();
|
|
2182
2473
|
return [`rg:${ns}`, `rg:${ns}:lk`, this.lookupPurgeTag(tag)];
|
|
2183
2474
|
}
|
|
2184
2475
|
|
|
2476
|
+
/**
|
|
2477
|
+
* Build one `{prefix}{tag}` Cache-Tag token, bounded to CACHE_TAG_TOKEN_MAX:
|
|
2478
|
+
* an over-long encoded tag collapses to `{prefix}h:{fnv1a64(tag)}` so a
|
|
2479
|
+
* legally-long application tag can never blow Cloudflare's per-tag purge
|
|
2480
|
+
* limit (1,024 chars) or bloat the header. Deterministic, so the write-time
|
|
2481
|
+
* token and the invalidate-time purge token always agree.
|
|
2482
|
+
* @internal
|
|
2483
|
+
*/
|
|
2484
|
+
private boundedTagToken(prefix: string, tag: string): string {
|
|
2485
|
+
const token = `${prefix}${encodeURIComponent(tag)}`;
|
|
2486
|
+
if (token.length <= CACHE_TAG_TOKEN_MAX) return token;
|
|
2487
|
+
return `${prefix}h:${fnv1a64(tag)}`;
|
|
2488
|
+
}
|
|
2489
|
+
|
|
2185
2490
|
/** The specific Cache-Tag a consumer purges to evict tag `tag`'s lookup. */
|
|
2186
2491
|
private lookupPurgeTag(tag: string): string {
|
|
2187
|
-
|
|
2188
|
-
|
|
2492
|
+
return this.boundedTagToken(`rg:${this.nsToken()}:lk:`, tag);
|
|
2493
|
+
}
|
|
2494
|
+
|
|
2495
|
+
/**
|
|
2496
|
+
* Cloudflare Cache-Tags written on a tagged DATA entry (segment/item/doc),
|
|
2497
|
+
* mirroring the lookup-marker tiers but under `:e` (entry):
|
|
2498
|
+
* rg:{ns} - everything this store cached (deploy/nuclear reset)
|
|
2499
|
+
* rg:{ns}:e - all data entries
|
|
2500
|
+
* rg:{ns}:e:{t} - entries carrying tag `t` (the purge-mode invalidation
|
|
2501
|
+
* target; see CFCacheStoreOptions.tagPurge)
|
|
2502
|
+
* Namespace and tag value encodeURIComponent'd like the lookup tier.
|
|
2503
|
+
* @internal
|
|
2504
|
+
*/
|
|
2505
|
+
private entryCacheTags(tags: string[]): string[] {
|
|
2506
|
+
const ns = this.nsToken();
|
|
2507
|
+
return [
|
|
2508
|
+
`rg:${ns}`,
|
|
2509
|
+
`rg:${ns}:e`,
|
|
2510
|
+
...tags.map((tag) => this.entryPurgeTag(tag)),
|
|
2511
|
+
];
|
|
2512
|
+
}
|
|
2513
|
+
|
|
2514
|
+
/** The specific Cache-Tag purged to evict entries carrying tag `tag`. */
|
|
2515
|
+
private entryPurgeTag(tag: string): string {
|
|
2516
|
+
return this.boundedTagToken(`rg:${this.nsToken()}:e:`, tag);
|
|
2517
|
+
}
|
|
2518
|
+
|
|
2519
|
+
/**
|
|
2520
|
+
* Whether an L1 entry's stored headers carry this store's entry Cache-Tag
|
|
2521
|
+
* tokens — i.e. whether a purge-by-tag can actually evict it. False for an
|
|
2522
|
+
* entry written before this feature existed, or one whose tag set exceeded
|
|
2523
|
+
* CACHE_TAG_HEADER_MAX_BYTES (header omitted). Purge mode only trusts
|
|
2524
|
+
* entries a purge can reach; the rest keep the marker check.
|
|
2525
|
+
* @internal
|
|
2526
|
+
*/
|
|
2527
|
+
private hasEntryCacheTags(headers: Headers): boolean {
|
|
2528
|
+
const raw = headers.get("Cache-Tag");
|
|
2529
|
+
if (raw === null) return false;
|
|
2530
|
+
const tier = `rg:${this.nsToken()}:e`;
|
|
2531
|
+
return raw.split(",").some((token) => {
|
|
2532
|
+
const trimmed = token.trim();
|
|
2533
|
+
return trimmed === tier || trimmed.startsWith(`${tier}:`);
|
|
2534
|
+
});
|
|
2535
|
+
}
|
|
2536
|
+
|
|
2537
|
+
/**
|
|
2538
|
+
* Drop this store's namespaced tokens (`rg:{ns}` and `rg:{ns}:*`) from a
|
|
2539
|
+
* Cache-Tag header, keeping author-set tokens intact. Deletes the header
|
|
2540
|
+
* when nothing remains. Serve-path counterpart of setTagHeaders' append.
|
|
2541
|
+
* An author token that exactly equals a reserved `rg:{ns}` tier is stripped
|
|
2542
|
+
* too — `rg:` is this store's documented-reserved Cache-Tag prefix.
|
|
2543
|
+
* @internal
|
|
2544
|
+
*/
|
|
2545
|
+
private stripInternalCacheTags(headers: Headers): void {
|
|
2546
|
+
const raw = headers.get("Cache-Tag");
|
|
2547
|
+
if (raw === null) return;
|
|
2548
|
+
const ns = this.nsToken();
|
|
2549
|
+
const kept = raw
|
|
2550
|
+
.split(",")
|
|
2551
|
+
.map((token) => token.trim())
|
|
2552
|
+
.filter(
|
|
2553
|
+
(token) =>
|
|
2554
|
+
token.length > 0 &&
|
|
2555
|
+
token !== `rg:${ns}` &&
|
|
2556
|
+
!token.startsWith(`rg:${ns}:`),
|
|
2557
|
+
);
|
|
2558
|
+
if (kept.length > 0) headers.set("Cache-Tag", kept.join(","));
|
|
2559
|
+
else headers.delete("Cache-Tag");
|
|
2189
2560
|
}
|
|
2190
2561
|
|
|
2191
2562
|
/**
|
|
@@ -2249,9 +2620,12 @@ export class CFCacheStore<TEnv = unknown> implements SegmentCacheStore<TEnv> {
|
|
|
2249
2620
|
* writes the fresh marker straight into this colo's L1 (write-through, NOT
|
|
2250
2621
|
* delete - a delete would let the next read re-read a not-yet-converged KV
|
|
2251
2622
|
* value and re-arm the stale window), and memoizes it for same-request
|
|
2252
|
-
* read-your-own-writes.
|
|
2253
|
-
*
|
|
2254
|
-
*
|
|
2623
|
+
* read-your-own-writes. In purge mode (tagPurge) it then AWAITS the
|
|
2624
|
+
* consumer's purge-by-tag call with the entry Cache-Tags — the eviction the
|
|
2625
|
+
* per-read marker skip on L1 hits relies on. Finally fires onRevalidateTag
|
|
2626
|
+
* with the namespaced lookup Cache-Tags so a consumer purge evicts the
|
|
2627
|
+
* cached lookups in other colos promptly (otherwise they converge within
|
|
2628
|
+
* tagCacheTtl).
|
|
2255
2629
|
*
|
|
2256
2630
|
* Durable-write integrity: the in-memory write-through (memo + L1) for a tag
|
|
2257
2631
|
* runs ONLY after that tag's KV marker write is confirmed. If any KV write
|
|
@@ -2260,16 +2634,30 @@ export class CFCacheStore<TEnv = unknown> implements SegmentCacheStore<TEnv> {
|
|
|
2260
2634
|
* silently reporting success while other requests/colos serve stale data. The
|
|
2261
2635
|
* eager purge still fires for the whole batch first (it is additive).
|
|
2262
2636
|
*/
|
|
2637
|
+
/**
|
|
2638
|
+
* Shell tag-generation gate (SegmentCacheStore.isTagsInvalidatedSince): the
|
|
2639
|
+
* SAME KV markers used by runtime envelopes also evict immutable build shells
|
|
2640
|
+
* and captures whose write races updateTag(). Thin public wrapper over the
|
|
2641
|
+
* private envelope check (marker >= since, fail open).
|
|
2642
|
+
*/
|
|
2643
|
+
async isTagsInvalidatedSince(
|
|
2644
|
+
tags: string[],
|
|
2645
|
+
sinceMs: number,
|
|
2646
|
+
): Promise<boolean> {
|
|
2647
|
+
return this.isGloballyInvalidated(tags, sinceMs);
|
|
2648
|
+
}
|
|
2649
|
+
|
|
2263
2650
|
async invalidateTags(tags: string[]): Promise<void> {
|
|
2264
2651
|
if (tags.length === 0) return;
|
|
2265
2652
|
const invalidatedAt = Date.now();
|
|
2266
2653
|
const ctx = _getRequestContext();
|
|
2267
2654
|
const memo = ctx ? getTagMarkerMemo(ctx, this) : undefined;
|
|
2268
2655
|
|
|
2269
|
-
if (!this.kv && !this.onRevalidateTag) {
|
|
2656
|
+
if (!this.kv && !this.onRevalidateTag && !this.tagPurge) {
|
|
2270
2657
|
console.warn(
|
|
2271
2658
|
`[CFCacheStore] invalidateTags had no effect: configure a KV namespace ` +
|
|
2272
|
-
`for distributed invalidation,
|
|
2659
|
+
`for distributed invalidation, a tagPurge hook for purge-by-tag ` +
|
|
2660
|
+
`eviction, or an onRevalidateTag hook.`,
|
|
2273
2661
|
);
|
|
2274
2662
|
}
|
|
2275
2663
|
|
|
@@ -2324,16 +2712,20 @@ export class CFCacheStore<TEnv = unknown> implements SegmentCacheStore<TEnv> {
|
|
|
2324
2712
|
// only when KV is configured. Markers are read exclusively through
|
|
2325
2713
|
// isGloballyInvalidated(), which short-circuits to "not invalidated" when
|
|
2326
2714
|
// !this.kv; writing memo/L1 markers without KV would be dead state no read
|
|
2327
|
-
// path ever consults
|
|
2328
|
-
//
|
|
2329
|
-
//
|
|
2330
|
-
//
|
|
2331
|
-
|
|
2715
|
+
// path ever consults — EXCEPT the memo in purge mode: isL1Invalidated()
|
|
2716
|
+
// consults it (and only it) on every L1 hit, so a KV-less purge-mode store
|
|
2717
|
+
// still writes the memo for same-request read-your-own-writes. The
|
|
2718
|
+
// onRevalidateTag purge below still fires regardless (it is additive and
|
|
2719
|
+
// external to the marker cascade). The memo write is synchronous
|
|
2720
|
+
// (read-your-own-writes); the L1 Cache API writes are independent, so fan
|
|
2721
|
+
// them out in parallel rather than awaiting each.
|
|
2722
|
+
const lookupMarkerCacheActive = Boolean(this.kv) && this.tagCacheTtl > 0;
|
|
2723
|
+
if (this.kv || this.tagPurge) {
|
|
2332
2724
|
const l1Writes: Promise<void>[] = [];
|
|
2333
2725
|
for (const tag of tags) {
|
|
2334
2726
|
if (failedTags.has(tag)) continue;
|
|
2335
2727
|
memo?.set(tag, invalidatedAt);
|
|
2336
|
-
if (
|
|
2728
|
+
if (lookupMarkerCacheActive) {
|
|
2337
2729
|
l1Writes.push(
|
|
2338
2730
|
this.putTagMarkerL1(tag, invalidatedAt, { critical: true }),
|
|
2339
2731
|
);
|
|
@@ -2342,6 +2734,35 @@ export class CFCacheStore<TEnv = unknown> implements SegmentCacheStore<TEnv> {
|
|
|
2342
2734
|
if (l1Writes.length > 0) await Promise.all(l1Writes);
|
|
2343
2735
|
}
|
|
2344
2736
|
|
|
2737
|
+
// Purge mode: evict the tagged L1 entries across every colo via the
|
|
2738
|
+
// consumer's purge-by-tag call. AWAITED, and a failure is correctness-
|
|
2739
|
+
// bearing (unlike onRevalidateTag): with the per-read marker lookup skipped
|
|
2740
|
+
// on L1 hits, a dropped purge leaves L1 serving stale until TTL — so it
|
|
2741
|
+
// surfaces through updateTag() like a failed marker write. Fired for the
|
|
2742
|
+
// whole batch regardless of marker outcome (purging is additive and
|
|
2743
|
+
// idempotent; a retry re-runs both). Lookup Cache-Tags ride along when the
|
|
2744
|
+
// L1 marker cache is active (tagCacheTtl > 0 AND kv — without kv no lookup
|
|
2745
|
+
// entries are ever written) so a single purge call also converges other
|
|
2746
|
+
// colos' cached lookups (no separate onRevalidateTag needed).
|
|
2747
|
+
let purgeError: unknown;
|
|
2748
|
+
if (this.tagPurge) {
|
|
2749
|
+
const purgeTags = tags.flatMap((tag) =>
|
|
2750
|
+
lookupMarkerCacheActive
|
|
2751
|
+
? [this.entryPurgeTag(tag), this.lookupPurgeTag(tag)]
|
|
2752
|
+
: [this.entryPurgeTag(tag)],
|
|
2753
|
+
);
|
|
2754
|
+
try {
|
|
2755
|
+
await this.tagPurge(purgeTags);
|
|
2756
|
+
} catch (error) {
|
|
2757
|
+
purgeError = error ?? new Error("tagPurge rejected");
|
|
2758
|
+
reportCacheError(
|
|
2759
|
+
purgeError,
|
|
2760
|
+
"cache-invalidate",
|
|
2761
|
+
"[CFCacheStore] tagPurge hook",
|
|
2762
|
+
);
|
|
2763
|
+
}
|
|
2764
|
+
}
|
|
2765
|
+
|
|
2345
2766
|
// One batched eager purge of the lookup markers for the whole call. Fired
|
|
2346
2767
|
// regardless of KV write outcome (it is additive and uses pure string ops).
|
|
2347
2768
|
if (this.onRevalidateTag) {
|
|
@@ -2356,13 +2777,25 @@ export class CFCacheStore<TEnv = unknown> implements SegmentCacheStore<TEnv> {
|
|
|
2356
2777
|
}
|
|
2357
2778
|
}
|
|
2358
2779
|
|
|
2359
|
-
if (failedTags.size > 0) {
|
|
2780
|
+
if (failedTags.size > 0 || purgeError) {
|
|
2781
|
+
const parts: string[] = [];
|
|
2782
|
+
if (failedTags.size > 0) {
|
|
2783
|
+
parts.push(
|
|
2784
|
+
`${failedTags.size}/${tags.length} tag marker write(s) failed: ` +
|
|
2785
|
+
`${[...failedTags].join(", ")}`,
|
|
2786
|
+
);
|
|
2787
|
+
}
|
|
2788
|
+
if (purgeError) {
|
|
2789
|
+
parts.push(
|
|
2790
|
+
`the tagPurge purge-by-tag call failed (tagged L1 entries stay ` +
|
|
2791
|
+
`stale until TTL)`,
|
|
2792
|
+
);
|
|
2793
|
+
}
|
|
2360
2794
|
const err = new Error(
|
|
2361
|
-
`[CFCacheStore] ${
|
|
2362
|
-
`failed: ${[...failedTags].join(", ")}. Those tags may still serve ` +
|
|
2795
|
+
`[CFCacheStore] ${parts.join("; ")}. Those tags may still serve ` +
|
|
2363
2796
|
`stale data across requests/colos; retry the invalidation.`,
|
|
2364
2797
|
);
|
|
2365
|
-
(err as Error & { cause?: unknown }).cause = errors[0];
|
|
2798
|
+
(err as Error & { cause?: unknown }).cause = errors[0] ?? purgeError;
|
|
2366
2799
|
throw err;
|
|
2367
2800
|
}
|
|
2368
2801
|
}
|
|
@@ -2455,11 +2888,14 @@ export class CFCacheStore<TEnv = unknown> implements SegmentCacheStore<TEnv> {
|
|
|
2455
2888
|
|
|
2456
2889
|
/**
|
|
2457
2890
|
* Write segment data to KV.
|
|
2891
|
+
*
|
|
2892
|
+
* `dataJson` is the already-serialized CachedEntryData body also stored in
|
|
2893
|
+
* L1 — embedded as envelope.d without a second JSON.stringify walk.
|
|
2458
2894
|
* @internal
|
|
2459
2895
|
*/
|
|
2460
2896
|
private kvSetSegment(
|
|
2461
2897
|
key: string,
|
|
2462
|
-
|
|
2898
|
+
dataJson: string,
|
|
2463
2899
|
staleAt: number,
|
|
2464
2900
|
totalTtl: number,
|
|
2465
2901
|
swrWindow: number,
|
|
@@ -2491,19 +2927,16 @@ export class CFCacheStore<TEnv = unknown> implements SegmentCacheStore<TEnv> {
|
|
|
2491
2927
|
}
|
|
2492
2928
|
|
|
2493
2929
|
const expiresAt = staleAt + swrWindow * 1000;
|
|
2930
|
+
// Same wire shape as JSON.stringify({ d, s, e }) — dataJson is already
|
|
2931
|
+
// valid JSON for CachedEntryData, so embedding it avoids re-walking the tree.
|
|
2932
|
+
const envelopeJson = `{"d":${dataJson},"s":${staleAt},"e":${expiresAt}}`;
|
|
2494
2933
|
|
|
2495
2934
|
this.waitUntil(() =>
|
|
2496
2935
|
reportingAsync(
|
|
2497
|
-
() =>
|
|
2498
|
-
|
|
2499
|
-
d: data,
|
|
2500
|
-
s: staleAt,
|
|
2501
|
-
e: expiresAt,
|
|
2502
|
-
};
|
|
2503
|
-
return this.kv!.put(kvKey, JSON.stringify(envelope), {
|
|
2936
|
+
() =>
|
|
2937
|
+
this.kv!.put(kvKey, envelopeJson, {
|
|
2504
2938
|
expirationTtl: totalTtl,
|
|
2505
|
-
})
|
|
2506
|
-
},
|
|
2939
|
+
}),
|
|
2507
2940
|
"cache-write",
|
|
2508
2941
|
"[CFCacheStore] kvSetSegment",
|
|
2509
2942
|
),
|