@rangojs/router 0.0.0-experimental.b9cb8739 → 0.0.0-experimental.bdaf10aa
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +8 -4
- package/README.md +303 -741
- package/dist/bin/rango.js +730 -184
- package/dist/testing/vitest.js +82 -0
- package/dist/vite/index.js +4344 -1335
- package/dist/vite/index.js.bak +5448 -0
- package/dist/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
- package/package.json +86 -15
- package/skills/api-client/SKILL.md +211 -0
- package/skills/breadcrumbs/SKILL.md +85 -6
- package/skills/bundle-analysis/SKILL.md +159 -0
- package/skills/cache-guide/SKILL.md +251 -24
- package/skills/caching/SKILL.md +375 -17
- package/skills/catalog.json +271 -0
- package/skills/comparison/SKILL.md +50 -0
- package/skills/comparison/agents/openai.yaml +4 -0
- package/skills/comparison/references/framework-comparison.md +837 -0
- package/skills/composability/SKILL.md +110 -4
- package/skills/css/SKILL.md +76 -0
- package/skills/debug-manifest/SKILL.md +5 -3
- package/skills/defer-hydration/SKILL.md +235 -0
- package/skills/document-cache/SKILL.md +87 -56
- package/skills/fonts/SKILL.md +1 -1
- package/skills/handler-use/SKILL.md +364 -0
- package/skills/hooks/SKILL.md +73 -691
- package/skills/hooks/data.md +273 -0
- package/skills/hooks/handle-and-actions.md +103 -0
- package/skills/hooks/navigation.md +110 -0
- package/skills/hooks/outlets.md +41 -0
- package/skills/hooks/state.md +228 -0
- package/skills/hooks/urls.md +135 -0
- package/skills/host-router/SKILL.md +129 -27
- package/skills/i18n/SKILL.md +276 -0
- package/skills/intercept/SKILL.md +94 -18
- package/skills/layout/SKILL.md +62 -19
- package/skills/links/SKILL.md +249 -17
- package/skills/loader/SKILL.md +302 -54
- package/skills/middleware/SKILL.md +59 -16
- package/skills/migrate-nextjs/SKILL.md +745 -0
- package/skills/migrate-react-router/SKILL.md +153 -0
- package/skills/migrate-react-router/cloudflare-workers.md +129 -0
- package/skills/migrate-react-router/component-migration.md +196 -0
- package/skills/migrate-react-router/data-and-actions.md +225 -0
- package/skills/migrate-react-router/route-mapping.md +271 -0
- package/skills/mime-routes/SKILL.md +29 -2
- package/skills/observability/SKILL.md +202 -0
- package/skills/parallel/SKILL.md +225 -10
- package/skills/ppr/SKILL.md +622 -0
- package/skills/prerender/SKILL.md +178 -124
- package/skills/rango/SKILL.md +318 -24
- package/skills/react-compiler/SKILL.md +168 -0
- package/skills/response-routes/SKILL.md +138 -49
- package/skills/route/SKILL.md +172 -9
- package/skills/router-setup/SKILL.md +131 -11
- package/skills/scripts/SKILL.md +179 -0
- package/skills/server-actions/SKILL.md +776 -0
- package/skills/shell-manifest/SKILL.md +185 -0
- package/skills/streams-and-websockets/SKILL.md +283 -0
- package/skills/tailwind/SKILL.md +28 -4
- package/skills/testing/SKILL.md +130 -0
- package/skills/testing/bindings.md +103 -0
- package/skills/testing/cache-prerender.md +127 -0
- package/skills/testing/client-components.md +124 -0
- package/skills/testing/e2e-parity.md +125 -0
- package/skills/testing/flight.md +91 -0
- package/skills/testing/handles.md +131 -0
- package/skills/testing/loader.md +128 -0
- package/skills/testing/middleware.md +99 -0
- package/skills/testing/render-handler.md +122 -0
- package/skills/testing/response-routes.md +95 -0
- package/skills/testing/reverse-and-types.md +85 -0
- package/skills/testing/server-actions.md +107 -0
- package/skills/testing/server-tree.md +128 -0
- package/skills/testing/setup.md +123 -0
- package/skills/theme/SKILL.md +1 -1
- package/skills/typesafety/SKILL.md +45 -616
- package/skills/typesafety/env-and-bindings.md +254 -0
- package/skills/typesafety/generated-files-and-cli.md +335 -0
- package/skills/typesafety/params-and-search.md +153 -0
- package/skills/typesafety/route-types.md +209 -0
- package/skills/use-cache/SKILL.md +74 -15
- package/skills/vercel/SKILL.md +128 -0
- package/skills/view-transitions/SKILL.md +337 -0
- package/src/__augment-tests__/augment.ts +81 -0
- package/src/__augment-tests__/augmented.check.ts +116 -0
- package/src/__internal.ts +1 -66
- package/src/browser/action-coordinator.ts +53 -36
- package/src/browser/action-fence.ts +47 -0
- package/src/browser/app-shell.ts +39 -0
- package/src/browser/app-version.ts +14 -0
- package/src/browser/connection-warmup.ts +134 -0
- package/src/browser/cookie-name.ts +140 -0
- package/src/browser/event-controller.ts +257 -158
- package/src/browser/history-state.ts +21 -0
- package/src/browser/index.ts +3 -3
- package/src/browser/invalidate-client-cache.ts +52 -0
- package/src/browser/logging.ts +28 -0
- package/src/browser/merge-segment-loaders.ts +6 -4
- package/src/browser/navigation-bridge.ts +132 -33
- package/src/browser/navigation-client.ts +218 -68
- package/src/browser/navigation-store-handle.ts +38 -0
- package/src/browser/navigation-store.ts +203 -80
- package/src/browser/navigation-transaction.ts +18 -66
- package/src/browser/network-error-handler.ts +34 -7
- package/src/browser/partial-update.ts +241 -127
- package/src/browser/prefetch/cache.ts +271 -44
- package/src/browser/prefetch/fetch.ts +367 -40
- package/src/browser/prefetch/queue.ts +144 -23
- package/src/browser/prefetch/resource-ready.ts +77 -0
- package/src/browser/rango-state.ts +158 -76
- package/src/browser/react/Link.tsx +121 -16
- package/src/browser/react/NavigationProvider.tsx +240 -122
- package/src/browser/react/ScrollRestoration.tsx +10 -6
- package/src/browser/react/context.ts +7 -2
- package/src/browser/react/filter-segment-order.ts +66 -7
- package/src/browser/react/index.ts +0 -48
- package/src/browser/react/location-state-shared.ts +178 -8
- package/src/browser/react/location-state.ts +39 -14
- package/src/browser/react/use-action.ts +6 -15
- package/src/browser/react/use-handle.ts +23 -69
- package/src/browser/react/use-href.tsx +8 -1
- package/src/browser/react/use-link-status.ts +33 -8
- package/src/browser/react/use-navigation.ts +32 -7
- package/src/browser/react/use-params.ts +20 -10
- package/src/browser/react/use-reverse.ts +106 -0
- package/src/browser/react/use-router.ts +46 -11
- package/src/browser/react/use-search-params.ts +0 -5
- package/src/browser/react/use-segments.ts +11 -21
- package/src/browser/response-adapter.ts +99 -8
- package/src/browser/rsc-router.tsx +272 -80
- package/src/browser/scroll-restoration.ts +56 -22
- package/src/browser/segment-reconciler.ts +44 -7
- package/src/browser/segment-structure-assert.ts +2 -2
- package/src/browser/server-action-bridge.ts +244 -71
- package/src/browser/types.ts +136 -12
- package/src/browser/validate-redirect-origin.ts +43 -16
- package/src/build/collect-fallback-refs.ts +107 -0
- package/src/build/generate-manifest.ts +207 -158
- package/src/build/generate-route-types.ts +6 -1
- package/src/build/index.ts +11 -3
- package/src/build/prefix-tree-utils.ts +123 -0
- package/src/build/route-trie.ts +198 -41
- package/src/build/route-types/ast-route-extraction.ts +15 -8
- package/src/build/route-types/codegen.ts +16 -5
- package/src/build/route-types/include-resolution.ts +464 -63
- package/src/build/route-types/param-extraction.ts +6 -3
- package/src/build/route-types/per-module-writer.ts +22 -6
- package/src/build/route-types/router-processing.ts +336 -110
- package/src/build/route-types/scan-filter.ts +9 -2
- package/src/build/route-types/source-scan.ts +216 -0
- package/src/build/runtime-discovery.ts +13 -21
- package/src/cache/cache-error.ts +104 -0
- package/src/cache/cache-key-utils.ts +58 -13
- package/src/cache/cache-policy.ts +108 -34
- package/src/cache/cache-runtime.ts +454 -97
- package/src/cache/cache-scope.ts +235 -103
- package/src/cache/cache-tag.ts +149 -0
- package/src/cache/cf/cf-base64.ts +33 -0
- package/src/cache/cf/cf-cache-constants.ts +127 -0
- package/src/cache/cf/cf-cache-store.ts +2446 -170
- package/src/cache/cf/cf-cache-types.ts +349 -0
- package/src/cache/cf/cf-kv-utils.ts +46 -0
- package/src/cache/cf/cf-tag-marker-memo.ts +105 -0
- package/src/cache/cf/index.ts +11 -17
- package/src/cache/document-cache.ts +144 -49
- package/src/cache/handle-snapshot.ts +70 -0
- package/src/cache/index.ts +24 -20
- package/src/cache/memory-segment-store.ts +243 -37
- package/src/cache/profile-registry.ts +46 -31
- package/src/cache/read-through-swr.ts +56 -12
- package/src/cache/segment-codec.ts +13 -21
- package/src/cache/shell-snapshot.ts +417 -0
- package/src/cache/tag-invalidation.ts +230 -0
- package/src/cache/taint.ts +55 -0
- package/src/cache/types.ts +194 -99
- package/src/cache/vercel/index.ts +11 -0
- package/src/cache/vercel/vercel-cache-store.ts +1132 -0
- package/src/client.rsc.tsx +41 -21
- package/src/client.tsx +116 -290
- package/src/cloudflare/index.ts +11 -0
- package/src/cloudflare/tracing.ts +108 -0
- package/src/component-utils.ts +19 -0
- package/src/components/DefaultDocument.tsx +8 -2
- package/src/context-var.ts +84 -2
- package/src/debug.ts +2 -2
- package/src/decode-loader-results.ts +52 -0
- package/src/defer.ts +185 -0
- package/src/deps/ssr.ts +0 -1
- package/src/encode-kv.ts +49 -0
- package/src/errors.ts +30 -4
- package/src/escape-script.ts +52 -0
- package/src/handle.ts +104 -34
- package/src/handles/MetaTags.tsx +24 -53
- package/src/handles/Scripts.tsx +183 -0
- package/src/handles/breadcrumbs.ts +35 -8
- package/src/handles/deferred-resolution.ts +127 -0
- package/src/handles/is-thenable.ts +18 -0
- package/src/handles/meta.ts +14 -40
- package/src/handles/script.ts +244 -0
- package/src/host/cookie-handler.ts +9 -60
- package/src/host/errors.ts +13 -22
- package/src/host/index.ts +9 -2
- package/src/host/pattern-matcher.ts +23 -52
- package/src/host/router.ts +107 -99
- package/src/host/testing.ts +40 -27
- package/src/host/types.ts +37 -4
- package/src/host/utils.ts +1 -1
- package/src/href-client.ts +137 -22
- package/src/index.rsc.ts +100 -13
- package/src/index.ts +143 -19
- package/src/internal-debug.ts +11 -10
- package/src/loader-store.ts +500 -0
- package/src/loader.rsc.ts +20 -13
- package/src/loader.ts +12 -11
- package/src/missing-id-error.ts +68 -0
- package/src/outlet-context.ts +1 -1
- package/src/outlet-provider.tsx +1 -5
- package/src/prerender/param-hash.ts +16 -16
- package/src/prerender/store.ts +37 -41
- package/src/prerender.ts +215 -86
- package/src/redirect-origin.ts +114 -0
- package/src/regex-escape.ts +8 -0
- package/src/render-error-thrower.tsx +20 -0
- package/src/response-utils.ts +62 -0
- package/src/reverse.ts +65 -15
- package/src/root-error-boundary.tsx +1 -19
- package/src/route-content-wrapper.tsx +19 -77
- package/src/route-definition/dsl-helpers.ts +485 -303
- package/src/route-definition/helper-factories.ts +28 -140
- package/src/route-definition/helpers-types.ts +153 -77
- package/src/route-definition/index.ts +4 -2
- package/src/route-definition/redirect.ts +53 -12
- package/src/route-definition/resolve-handler-use.ts +160 -0
- package/src/route-definition/use-item-types.ts +29 -0
- package/src/route-map-builder.ts +48 -21
- package/src/route-types.ts +37 -46
- package/src/router/basename.ts +14 -0
- package/src/router/content-negotiation.ts +164 -17
- package/src/router/error-handling.ts +45 -18
- package/src/router/find-match.ts +130 -29
- package/src/router/handler-context.ts +83 -39
- package/src/router/instrument.ts +355 -0
- package/src/router/intercept-resolution.ts +50 -24
- package/src/router/lazy-includes.ts +89 -63
- package/src/router/loader-resolution.ts +286 -56
- package/src/router/logging.ts +5 -8
- package/src/router/manifest.ts +105 -56
- package/src/router/match-api.ts +178 -218
- package/src/router/match-context.ts +0 -22
- package/src/router/match-handlers.ts +211 -165
- package/src/router/match-middleware/background-revalidation.ts +66 -22
- package/src/router/match-middleware/cache-lookup.ts +214 -263
- package/src/router/match-middleware/cache-store.ts +105 -50
- package/src/router/match-middleware/intercept-resolution.ts +8 -28
- package/src/router/match-middleware/segment-resolution.ts +52 -18
- package/src/router/match-pipelines.ts +1 -42
- package/src/router/match-result.ts +128 -44
- package/src/router/metrics.ts +5 -34
- package/src/router/middleware-types.ts +13 -142
- package/src/router/middleware.ts +301 -177
- package/src/router/navigation-snapshot.ts +133 -0
- package/src/router/params-util.ts +23 -0
- package/src/router/parse-pattern.ts +115 -0
- package/src/router/pattern-matching.ts +181 -150
- package/src/router/prefetch-cache-ttl.ts +51 -0
- package/src/router/prefetch-limits.ts +37 -0
- package/src/router/prerender-match.ts +203 -58
- package/src/router/preview-match.ts +35 -103
- package/src/router/request-classification.ts +291 -0
- package/src/router/revalidation.ts +123 -73
- package/src/router/route-snapshot.ts +256 -0
- package/src/router/router-context.ts +11 -29
- package/src/router/router-interfaces.ts +146 -35
- package/src/router/router-options.ts +202 -15
- package/src/router/router-registry.ts +2 -5
- package/src/router/segment-resolution/fresh.ts +301 -78
- package/src/router/segment-resolution/helpers.ts +115 -30
- package/src/router/segment-resolution/loader-cache.ts +156 -39
- package/src/router/segment-resolution/loader-mask.ts +60 -0
- package/src/router/segment-resolution/loader-snapshot.ts +259 -0
- package/src/router/segment-resolution/mask-nested.ts +83 -0
- package/src/router/segment-resolution/revalidation.ts +477 -385
- package/src/router/segment-resolution/static-store.ts +19 -5
- package/src/router/segment-resolution/streamed-handler-telemetry.ts +52 -0
- package/src/router/segment-resolution/view-transition-default.ts +56 -0
- package/src/router/segment-resolution.ts +5 -1
- package/src/router/segment-wrappers.ts +8 -5
- package/src/router/state-cookie-name.ts +33 -0
- package/src/router/substitute-pattern-params.ts +75 -0
- package/src/router/telemetry-otel.ts +160 -200
- package/src/router/telemetry.ts +105 -20
- package/src/router/timeout.ts +0 -20
- package/src/router/tracing.ts +215 -0
- package/src/router/trie-matching.ts +171 -59
- package/src/router/types.ts +10 -63
- package/src/router/url-params.ts +57 -0
- package/src/router.ts +210 -71
- package/src/rsc/full-payload.ts +70 -0
- package/src/rsc/handler-context.ts +3 -2
- package/src/rsc/handler.ts +682 -508
- package/src/rsc/helpers.ts +168 -46
- package/src/rsc/index.ts +2 -5
- package/src/rsc/json-route-result.ts +38 -0
- package/src/rsc/loader-fetch.ts +127 -31
- package/src/rsc/manifest-init.ts +33 -42
- package/src/rsc/nonce.ts +10 -1
- package/src/rsc/origin-guard.ts +39 -25
- package/src/rsc/progressive-enhancement.ts +138 -15
- package/src/rsc/redirect-guard.ts +100 -0
- package/src/rsc/response-cache-serve.ts +238 -0
- package/src/rsc/response-error.ts +79 -12
- package/src/rsc/response-route-handler.ts +99 -189
- package/src/rsc/rsc-rendering.ts +509 -73
- package/src/rsc/runtime-warnings.ts +23 -10
- package/src/rsc/server-action.ts +287 -113
- package/src/rsc/shell-capture.ts +1190 -0
- package/src/rsc/shell-serve.ts +181 -0
- package/src/rsc/ssr-setup.ts +18 -2
- package/src/rsc/transition-gate.ts +89 -0
- package/src/rsc/types.ts +62 -6
- package/src/runtime-env.ts +18 -0
- package/src/search-params.ts +35 -30
- package/src/segment-content-promise.ts +67 -0
- package/src/segment-loader-promise.ts +167 -0
- package/src/segment-system.tsx +449 -132
- package/src/serialize.ts +243 -0
- package/src/server/context.ts +367 -61
- package/src/server/cookie-parse.ts +32 -0
- package/src/server/cookie-store.ts +152 -5
- package/src/server/handle-store.ts +40 -38
- package/src/server/loader-registry.ts +38 -46
- package/src/server/request-context.ts +558 -173
- package/src/ssr/index.tsx +491 -174
- package/src/ssr/inject-rsc-eager.ts +167 -0
- package/src/ssr/ssr-root.tsx +228 -0
- package/src/static-handler.ts +27 -18
- package/src/testing/cache-status.ts +162 -0
- package/src/testing/collect-handle.ts +46 -0
- package/src/testing/dispatch.ts +813 -0
- package/src/testing/dom.entry.ts +22 -0
- package/src/testing/e2e/fixture.ts +188 -0
- package/src/testing/e2e/index.ts +128 -0
- package/src/testing/e2e/matchers.ts +35 -0
- package/src/testing/e2e/page-helpers.ts +272 -0
- package/src/testing/e2e/parity.ts +387 -0
- package/src/testing/e2e/server.ts +195 -0
- package/src/testing/flight-matchers.ts +97 -0
- package/src/testing/flight-normalize.ts +11 -0
- package/src/testing/flight-runtime.d.ts +57 -0
- package/src/testing/flight-tree.ts +682 -0
- package/src/testing/flight.entry.ts +52 -0
- package/src/testing/flight.ts +257 -0
- package/src/testing/generated-routes.ts +199 -0
- package/src/testing/index.ts +105 -0
- package/src/testing/internal/context.ts +371 -0
- package/src/testing/internal/flight-client-globals.ts +30 -0
- package/src/testing/internal/seed-vars.ts +54 -0
- package/src/testing/render-handler.ts +357 -0
- package/src/testing/render-route.tsx +584 -0
- package/src/testing/run-loader.ts +385 -0
- package/src/testing/run-middleware.ts +205 -0
- package/src/testing/run-transition-when.ts +164 -0
- package/src/testing/vitest-stubs/cloudflare-email.ts +9 -0
- package/src/testing/vitest-stubs/cloudflare-workers.ts +21 -0
- package/src/testing/vitest-stubs/plugin-rsc.ts +16 -0
- package/src/testing/vitest-stubs/version.ts +5 -0
- package/src/testing/vitest.ts +305 -0
- package/src/theme/ThemeProvider.tsx +56 -84
- package/src/theme/ThemeScript.tsx +7 -9
- package/src/theme/constants.ts +52 -13
- package/src/theme/index.ts +0 -7
- package/src/theme/theme-context.ts +1 -5
- package/src/theme/theme-script.ts +22 -21
- package/src/theme/use-theme.ts +0 -3
- package/src/types/boundaries.ts +0 -35
- package/src/types/cache-types.ts +17 -8
- package/src/types/error-types.ts +30 -90
- package/src/types/global-namespace.ts +54 -41
- package/src/types/handler-context.ts +234 -82
- package/src/types/index.ts +3 -10
- package/src/types/loader-types.ts +44 -15
- package/src/types/request-scope.ts +112 -0
- package/src/types/route-config.ts +20 -52
- package/src/types/route-entry.ts +19 -7
- package/src/types/segments.ts +137 -14
- package/src/urls/include-helper.ts +40 -75
- package/src/urls/include-provider.ts +71 -0
- package/src/urls/index.ts +2 -11
- package/src/urls/path-helper-types.ts +102 -23
- package/src/urls/path-helper.ts +62 -111
- package/src/urls/pattern-types.ts +84 -19
- package/src/urls/response-types.ts +25 -22
- package/src/urls/type-extraction.ts +98 -154
- package/src/urls/urls-function.ts +1 -19
- package/src/use-loader.tsx +346 -89
- package/src/vercel/index.ts +11 -0
- package/src/vercel/tracing.ts +88 -0
- package/src/vite/debug.ts +185 -0
- package/src/vite/discovery/bundle-postprocess.ts +36 -38
- package/src/vite/discovery/dev-prerender-cache.ts +117 -0
- package/src/vite/discovery/discover-routers.ts +130 -85
- package/src/vite/discovery/discovery-errors.ts +255 -0
- package/src/vite/discovery/gate-state.ts +171 -0
- package/src/vite/discovery/prerender-collection.ts +214 -132
- package/src/vite/discovery/route-types-writer.ts +40 -84
- package/src/vite/discovery/self-gen-tracking.ts +27 -1
- package/src/vite/discovery/state.ts +57 -6
- package/src/vite/discovery/virtual-module-codegen.ts +14 -34
- package/src/vite/index.ts +15 -0
- package/src/vite/inject-client-debug.ts +88 -0
- package/src/vite/plugin-types.ts +234 -62
- package/src/vite/plugins/cjs-to-esm.ts +16 -19
- package/src/vite/plugins/client-ref-dedup.ts +16 -11
- package/src/vite/plugins/client-ref-hashing.ts +28 -15
- package/src/vite/plugins/cloudflare-protocol-loader-hook.d.mts +23 -0
- package/src/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
- package/src/vite/plugins/cloudflare-protocol-stub.ts +194 -0
- package/src/vite/plugins/expose-action-id.ts +49 -98
- package/src/vite/plugins/expose-id-utils.ts +96 -51
- package/src/vite/plugins/expose-ids/export-analysis.ts +101 -34
- package/src/vite/plugins/expose-ids/handler-transform.ts +15 -64
- package/src/vite/plugins/expose-ids/loader-transform.ts +14 -24
- package/src/vite/plugins/expose-ids/router-transform.ts +118 -29
- package/src/vite/plugins/expose-internal-ids.ts +553 -317
- package/src/vite/plugins/performance-tracks.ts +89 -0
- package/src/vite/plugins/refresh-cmd.ts +89 -27
- package/src/vite/plugins/use-cache-transform.ts +73 -83
- package/src/vite/plugins/vercel-output.ts +384 -0
- package/src/vite/plugins/version-injector.ts +40 -29
- package/src/vite/plugins/version-plugin.ts +46 -37
- package/src/vite/plugins/virtual-entries.ts +138 -27
- package/src/vite/rango.ts +353 -303
- package/src/vite/router-discovery.ts +1090 -166
- package/src/vite/utils/ast-handler-extract.ts +26 -35
- package/src/vite/utils/banner.ts +4 -4
- package/src/vite/utils/bundle-analysis.ts +10 -15
- package/src/vite/utils/client-chunks.ts +184 -0
- package/src/vite/utils/directive-prologue.ts +40 -0
- package/src/vite/utils/forward-user-plugins.ts +171 -0
- package/src/vite/utils/manifest-utils.ts +4 -59
- package/src/vite/utils/package-resolution.ts +20 -52
- package/src/vite/utils/prerender-utils.ts +98 -38
- package/src/vite/utils/shared-utils.ts +144 -44
- package/src/browser/action-response-classifier.ts +0 -99
- package/src/browser/react/use-client-cache.ts +0 -58
- package/src/browser/shallow.ts +0 -40
- package/src/handles/index.ts +0 -7
- package/src/network-error-thrower.tsx +0 -23
- package/src/router/middleware-cookies.ts +0 -55
|
@@ -12,22 +12,26 @@
|
|
|
12
12
|
*/
|
|
13
13
|
|
|
14
14
|
import type { MiddlewareFn, MiddlewareContext } from "../router/middleware.js";
|
|
15
|
-
import {
|
|
16
|
-
import {
|
|
15
|
+
import { hasPerClientSignal } from "../browser/cookie-name.js";
|
|
16
|
+
import {
|
|
17
|
+
getRequestContext,
|
|
18
|
+
runWithRequestContext,
|
|
19
|
+
type RequestContext,
|
|
20
|
+
} from "../server/request-context.js";
|
|
21
|
+
import { mayNeedSSR } from "../rsc/ssr-setup.js";
|
|
22
|
+
import { cacheKeyBase } from "./cache-key-utils.js";
|
|
17
23
|
import { runBackground } from "./background-task.js";
|
|
24
|
+
import { reportCacheError } from "./cache-error.js";
|
|
18
25
|
|
|
19
|
-
// ============================================================================
|
|
20
|
-
// Constants
|
|
21
|
-
// ============================================================================
|
|
22
|
-
|
|
23
|
-
/** Header indicating cache status for debugging */
|
|
24
26
|
const CACHE_STATUS_HEADER = "x-document-cache-status";
|
|
25
27
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
28
|
+
function collectRequestTags(
|
|
29
|
+
requestCtx: RequestContext | undefined,
|
|
30
|
+
): string[] | undefined {
|
|
31
|
+
const tags = requestCtx?._requestTags;
|
|
32
|
+
return tags && tags.size > 0 ? [...tags] : undefined;
|
|
33
|
+
}
|
|
34
|
+
|
|
31
35
|
function hashSegmentIds(segmentIds: string): string {
|
|
32
36
|
if (!segmentIds) return "";
|
|
33
37
|
|
|
@@ -36,12 +40,9 @@ function hashSegmentIds(segmentIds: string): string {
|
|
|
36
40
|
const char = segmentIds.charCodeAt(i);
|
|
37
41
|
hash = ((hash << 5) - hash + char) | 0;
|
|
38
42
|
}
|
|
39
|
-
// Convert to base36 for shorter string, take absolute value
|
|
40
43
|
return Math.abs(hash).toString(36);
|
|
41
44
|
}
|
|
42
45
|
|
|
43
|
-
// ============================================================================
|
|
44
|
-
// Cache Control Parsing
|
|
45
46
|
// ============================================================================
|
|
46
47
|
|
|
47
48
|
interface CacheDirectives {
|
|
@@ -55,6 +56,27 @@ interface CacheDirectives {
|
|
|
55
56
|
function parseCacheControl(header: string | null): CacheDirectives | null {
|
|
56
57
|
if (!header) return null;
|
|
57
58
|
|
|
59
|
+
// RFC 7234: in a SHARED cache, `private` and `no-store` forbid storage and
|
|
60
|
+
// MUST win over `s-maxage` even though `private, s-maxage` is contradictory.
|
|
61
|
+
// The document cache is a shared edge store, so refuse both regardless of any
|
|
62
|
+
// s-maxage / stale-while-revalidate also present. Match standalone directive
|
|
63
|
+
// tokens (start/end, whitespace, comma, semicolon, or `=` bounded), not a
|
|
64
|
+
// substring, so a value containing "private" cannot false-veto.
|
|
65
|
+
if (/(^|[\s,;])(private|no-store)(?=$|[\s,;=])/i.test(header)) {
|
|
66
|
+
return null;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// RFC 7234 §5.2.2.2: a shared cache MUST NOT serve a stored `no-cache`
|
|
70
|
+
// response without successful origin validation. This store's hit path has no
|
|
71
|
+
// validation step, so serving a stored no-cache response within s-maxage
|
|
72
|
+
// would hand the client content the origin marked must-revalidate. Refuse to
|
|
73
|
+
// store it. Only UNqualified `no-cache` (no `=`) vetoes — the field-name-
|
|
74
|
+
// scoped `no-cache="set-cookie"` form IS storable per the RFC, so the `=`
|
|
75
|
+
// boundary is excluded from the lookahead (unlike private/no-store above).
|
|
76
|
+
if (/(^|[\s,;])no-cache(?=$|[\s,;])/i.test(header)) {
|
|
77
|
+
return null;
|
|
78
|
+
}
|
|
79
|
+
|
|
58
80
|
const directives: CacheDirectives = {};
|
|
59
81
|
|
|
60
82
|
// Parse s-maxage
|
|
@@ -86,6 +108,16 @@ function shouldCacheResponse(response: Response): CacheDirectives | null {
|
|
|
86
108
|
return null;
|
|
87
109
|
}
|
|
88
110
|
|
|
111
|
+
// Never cache a per-client signal into a SHARED response store. A Set-Cookie
|
|
112
|
+
// (e.g. a rango state rotation from invalidateClientCache(), or any cookie a
|
|
113
|
+
// loader set) would be replayed to every client on a hit — pinning them to
|
|
114
|
+
// one value and even rolling a rotated client back to a prior one. The
|
|
115
|
+
// x-rango-keep-cache directive header is the mirror image: a replayed "keep"
|
|
116
|
+
// would suppress invalidation for every replayed client. Refuse both.
|
|
117
|
+
if (hasPerClientSignal(response.headers)) {
|
|
118
|
+
return null;
|
|
119
|
+
}
|
|
120
|
+
|
|
89
121
|
const cacheControl = response.headers.get("Cache-Control");
|
|
90
122
|
return parseCacheControl(cacheControl);
|
|
91
123
|
}
|
|
@@ -95,20 +127,31 @@ function shouldCacheResponse(response: Response): CacheDirectives | null {
|
|
|
95
127
|
// ============================================================================
|
|
96
128
|
|
|
97
129
|
/**
|
|
98
|
-
* Add cache
|
|
130
|
+
* Add the cache-status header (HIT/STALE/MISS) to a response.
|
|
131
|
+
*
|
|
132
|
+
* The response we get here is always a fresh instance — the store rebuilds a
|
|
133
|
+
* new Response per getResponse(), and the miss path wraps a fresh Response
|
|
134
|
+
* around the tee'd body — so mutating its headers in place is safe and avoids
|
|
135
|
+
* cloning every header + allocating a new Response on every cache hit. Only when
|
|
136
|
+
* the headers are immutable (a guarded Response rejects set() with a TypeError)
|
|
137
|
+
* do we fall back to rebuilding the Response with a mutable Headers.
|
|
99
138
|
*/
|
|
100
139
|
function addCacheStatusHeader(
|
|
101
140
|
response: Response,
|
|
102
141
|
status: "HIT" | "STALE" | "MISS",
|
|
103
142
|
): Response {
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
143
|
+
try {
|
|
144
|
+
response.headers.set(CACHE_STATUS_HEADER, status);
|
|
145
|
+
return response;
|
|
146
|
+
} catch {
|
|
147
|
+
const headers = new Headers(response.headers);
|
|
148
|
+
headers.set(CACHE_STATUS_HEADER, status);
|
|
149
|
+
return new Response(response.body, {
|
|
150
|
+
status: response.status,
|
|
151
|
+
statusText: response.statusText,
|
|
152
|
+
headers,
|
|
153
|
+
});
|
|
154
|
+
}
|
|
112
155
|
}
|
|
113
156
|
|
|
114
157
|
/**
|
|
@@ -145,7 +188,13 @@ export interface DocumentCacheOptions<TEnv = any> {
|
|
|
145
188
|
skipPaths?: string[];
|
|
146
189
|
|
|
147
190
|
/**
|
|
148
|
-
* Custom cache key generator
|
|
191
|
+
* Custom cache key generator.
|
|
192
|
+
*
|
|
193
|
+
* Replaces the default `host + pathname + search` key entirely. On a
|
|
194
|
+
* multi-domain deployment served by one function you MUST include `url.host`
|
|
195
|
+
* (or an equivalent tenant discriminator) yourself — the default key is
|
|
196
|
+
* host-namespaced, but a custom generator's output is used verbatim, so
|
|
197
|
+
* omitting host bleeds one hostname's cached response to another.
|
|
149
198
|
*/
|
|
150
199
|
keyGenerator?: (url: URL) => string;
|
|
151
200
|
|
|
@@ -204,18 +253,24 @@ export function createDocumentCacheMiddleware<TEnv = any>(
|
|
|
204
253
|
): Promise<Response> {
|
|
205
254
|
const url = ctx.url;
|
|
206
255
|
|
|
256
|
+
// Use the original request URL for _rsc* param detection and cache key
|
|
257
|
+
// differentiation. ctx.url is stripped of _rsc* params by the middleware
|
|
258
|
+
// pipeline (stripInternalParams), so _rsc_partial, _rsc_segments, etc.
|
|
259
|
+
// are not visible on ctx.url in production.
|
|
260
|
+
const rawUrl = new URL(ctx.request.url);
|
|
261
|
+
|
|
207
262
|
// Only cache GET requests — mutations and other methods must not be cached
|
|
208
263
|
if (ctx.request.method !== "GET") {
|
|
209
264
|
return next();
|
|
210
265
|
}
|
|
211
266
|
|
|
212
267
|
// Skip RSC action requests (mutations shouldn't be cached)
|
|
213
|
-
if (
|
|
268
|
+
if (rawUrl.searchParams.has("_rsc_action")) {
|
|
214
269
|
return next();
|
|
215
270
|
}
|
|
216
271
|
|
|
217
272
|
// Skip loader requests (have their own caching)
|
|
218
|
-
if (
|
|
273
|
+
if (rawUrl.searchParams.has("_rsc_loader")) {
|
|
219
274
|
return next();
|
|
220
275
|
}
|
|
221
276
|
|
|
@@ -241,9 +296,12 @@ export function createDocumentCacheMiddleware<TEnv = any>(
|
|
|
241
296
|
return next();
|
|
242
297
|
}
|
|
243
298
|
|
|
244
|
-
// Determine request type for cache key differentiation
|
|
245
|
-
|
|
246
|
-
|
|
299
|
+
// Determine request type for cache key differentiation.
|
|
300
|
+
// Uses rawUrl for _rsc* param checks and mayNeedSSR for Accept-based
|
|
301
|
+
// detection. Full-document RSC fetches must not share the HTML cache slot.
|
|
302
|
+
const isPartial = rawUrl.searchParams.has("_rsc_partial");
|
|
303
|
+
const isRscRequest = !mayNeedSSR(ctx.request, rawUrl);
|
|
304
|
+
const typeLabel = isRscRequest ? "RSC" : "HTML";
|
|
247
305
|
|
|
248
306
|
// Track whether next() has been called so the catch block knows
|
|
249
307
|
// whether it is safe to fall through to the handler.
|
|
@@ -254,22 +312,22 @@ export function createDocumentCacheMiddleware<TEnv = any>(
|
|
|
254
312
|
// gracefully to the origin handler instead of rejecting the request.
|
|
255
313
|
// This is a deliberate fail-open-to-origin policy: the fallback is
|
|
256
314
|
// "serve uncached from origin", not "use a different cache key".
|
|
257
|
-
const clientSegments =
|
|
315
|
+
const clientSegments = rawUrl.searchParams.get("_rsc_segments") || "";
|
|
258
316
|
const segmentHash =
|
|
259
317
|
isPartial && clientSegments ? `:${hashSegmentIds(clientSegments)}` : "";
|
|
260
|
-
const typeSuffix =
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
}
|
|
269
|
-
|
|
318
|
+
const typeSuffix = isRscRequest ? ":rsc" : ":html";
|
|
319
|
+
|
|
320
|
+
// Default key rides the shared host-namespaced base (cacheKeyBase) so the
|
|
321
|
+
// segment tier (cache-scope.ts) and this document tier cannot drift on the
|
|
322
|
+
// host-namespacing rule -- see the contract on cacheKeyBase.
|
|
323
|
+
// The keyGenerator branch is left untouched: a consumer-supplied generator
|
|
324
|
+
// owns its own namespacing (auto-prefixing host would silently change their
|
|
325
|
+
// existing keys and double any host they already include).
|
|
270
326
|
const cacheKey = keyGenerator
|
|
271
327
|
? keyGenerator(url) + segmentHash + typeSuffix
|
|
272
|
-
:
|
|
328
|
+
: cacheKeyBase(url.host, url.pathname, url.searchParams) +
|
|
329
|
+
segmentHash +
|
|
330
|
+
typeSuffix;
|
|
273
331
|
// 1. Check cache
|
|
274
332
|
const cached = await store.getResponse(cacheKey);
|
|
275
333
|
|
|
@@ -290,20 +348,40 @@ export function createDocumentCacheMiddleware<TEnv = any>(
|
|
|
290
348
|
|
|
291
349
|
runBackground(requestCtx, async () => {
|
|
292
350
|
try {
|
|
293
|
-
|
|
351
|
+
// Re-establish the request-context ALS around the background
|
|
352
|
+
// re-render: next() re-runs the full handler pipeline, and on
|
|
353
|
+
// workerd a waitUntil task runs detached from the request's I/O
|
|
354
|
+
// context, so a handler/component reading getRequestContext() would
|
|
355
|
+
// otherwise throw. Same fix as the route-level/use-cache background
|
|
356
|
+
// revalidation paths.
|
|
357
|
+
const fresh = await runWithRequestContext(requestCtx, () => next());
|
|
294
358
|
const directives = shouldCacheResponse(fresh);
|
|
295
359
|
|
|
296
|
-
if (directives) {
|
|
360
|
+
if (directives && fresh.body) {
|
|
361
|
+
// Background revalidation: nothing streams to a client, so drain
|
|
362
|
+
// the fresh render fully before snapshotting tags (same
|
|
363
|
+
// render-complete barrier as the miss path).
|
|
364
|
+
const body = await new Response(fresh.body).arrayBuffer();
|
|
297
365
|
await store.putResponse!(
|
|
298
366
|
cacheKey,
|
|
299
|
-
fresh,
|
|
367
|
+
new Response(body, fresh),
|
|
300
368
|
directives.sMaxAge!,
|
|
301
369
|
directives.staleWhileRevalidate,
|
|
370
|
+
collectRequestTags(requestCtx),
|
|
302
371
|
);
|
|
303
372
|
log(`[DocumentCache] REVALIDATED ${typeLabel}: ${url.pathname}`);
|
|
304
373
|
}
|
|
305
374
|
} catch (error) {
|
|
306
|
-
|
|
375
|
+
// Pass requestCtx explicitly: this runs in a detached waitUntil task
|
|
376
|
+
// where the ALS context is gone, so onError only fires if we hand it
|
|
377
|
+
// the captured context (reportCacheError falls back to _getRequestContext
|
|
378
|
+
// otherwise, which is null here).
|
|
379
|
+
reportCacheError(
|
|
380
|
+
error,
|
|
381
|
+
"cache-write",
|
|
382
|
+
"[DocumentCache] revalidation",
|
|
383
|
+
requestCtx,
|
|
384
|
+
);
|
|
307
385
|
}
|
|
308
386
|
});
|
|
309
387
|
|
|
@@ -336,14 +414,31 @@ export function createDocumentCacheMiddleware<TEnv = any>(
|
|
|
336
414
|
// Clone response for caching (non-blocking)
|
|
337
415
|
runBackground(requestCtx, async () => {
|
|
338
416
|
try {
|
|
417
|
+
// Drain the cache copy fully BEFORE snapshotting tags. Tags from
|
|
418
|
+
// Suspense-streamed "use cache"/cacheTag and loaders are recorded as
|
|
419
|
+
// each value resolves during the RSC/HTML render, which completes
|
|
420
|
+
// only when the stream ends - the handler-settlement barrier is too
|
|
421
|
+
// early. Buffering the body (the client streams the other tee branch,
|
|
422
|
+
// unaffected) is the render-complete barrier that keeps the cached
|
|
423
|
+
// body and its tag set consistent.
|
|
424
|
+
const body = await new Response(cacheStream).arrayBuffer();
|
|
339
425
|
await store.putResponse!(
|
|
340
426
|
cacheKey,
|
|
341
|
-
new Response(
|
|
427
|
+
new Response(body, originalResponse),
|
|
342
428
|
directives.sMaxAge!,
|
|
343
429
|
directives.staleWhileRevalidate,
|
|
430
|
+
collectRequestTags(requestCtx),
|
|
344
431
|
);
|
|
345
432
|
} catch (error) {
|
|
346
|
-
|
|
433
|
+
// Detached waitUntil task — pass the captured requestCtx so onError
|
|
434
|
+
// fires even though the ALS context is gone (see the revalidation
|
|
435
|
+
// catch above).
|
|
436
|
+
reportCacheError(
|
|
437
|
+
error,
|
|
438
|
+
"cache-write",
|
|
439
|
+
"[DocumentCache] cache write",
|
|
440
|
+
requestCtx,
|
|
441
|
+
);
|
|
347
442
|
}
|
|
348
443
|
});
|
|
349
444
|
|
|
@@ -356,7 +451,7 @@ export function createDocumentCacheMiddleware<TEnv = any>(
|
|
|
356
451
|
// No cache headers - pass through
|
|
357
452
|
return originalResponse;
|
|
358
453
|
} catch (error) {
|
|
359
|
-
|
|
454
|
+
reportCacheError(error, "cache-read", "[DocumentCache] middleware");
|
|
360
455
|
if (handlerCalled) {
|
|
361
456
|
// Post-handler failure (e.g. body.tee()): do not call next() again
|
|
362
457
|
// as that would re-run handler side effects.
|
|
@@ -9,6 +9,76 @@
|
|
|
9
9
|
import type { ResolvedSegment } from "../types.js";
|
|
10
10
|
import type { HandleStore } from "../server/handle-store.js";
|
|
11
11
|
import type { SegmentHandleData } from "./types.js";
|
|
12
|
+
// segment-codec eagerly pulls @vitejs/plugin-rsc (a virtual: module unresolvable
|
|
13
|
+
// in plain node/vitest). It is imported LAZILY inside the two async encode/decode
|
|
14
|
+
// helpers below so that modules which import handle-snapshot only for the
|
|
15
|
+
// plugin-rsc-free captureHandles/restoreHandles (e.g. cache-scope, on dispatch's
|
|
16
|
+
// lazy response-route cache path) do not pull plugin-rsc at module load. Behavior
|
|
17
|
+
// is unchanged: both helpers are async and already awaited the codec.
|
|
18
|
+
|
|
19
|
+
const HANDLE_ENCODE_TIMEOUT_MS = 5000;
|
|
20
|
+
|
|
21
|
+
type HandleRecord = Record<string, SegmentHandleData>;
|
|
22
|
+
|
|
23
|
+
function hasHandleData(handles: HandleRecord): boolean {
|
|
24
|
+
for (const segId in handles) {
|
|
25
|
+
for (const _ in handles[segId]) return true;
|
|
26
|
+
}
|
|
27
|
+
return false;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function withTimeout<T>(p: Promise<T>, ms: number, onTimeout: T): Promise<T> {
|
|
31
|
+
let timer: ReturnType<typeof setTimeout>;
|
|
32
|
+
const timeout = new Promise<T>((resolve) => {
|
|
33
|
+
timer = setTimeout(() => resolve(onTimeout), ms);
|
|
34
|
+
});
|
|
35
|
+
return Promise.race([
|
|
36
|
+
p.then(
|
|
37
|
+
(v) => {
|
|
38
|
+
clearTimeout(timer);
|
|
39
|
+
return v;
|
|
40
|
+
},
|
|
41
|
+
(e) => {
|
|
42
|
+
clearTimeout(timer);
|
|
43
|
+
throw e;
|
|
44
|
+
},
|
|
45
|
+
),
|
|
46
|
+
timeout,
|
|
47
|
+
]);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export async function encodeHandles(handles: HandleRecord): Promise<string> {
|
|
51
|
+
if (!hasHandleData(handles)) return "";
|
|
52
|
+
return encodeHandleValue(handles);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export function decodeHandles(encoded: string): Promise<HandleRecord | null> {
|
|
56
|
+
return decodeHandleValue<HandleRecord>(encoded);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export async function encodeHandleValue(value: unknown): Promise<string> {
|
|
60
|
+
const { serializeResult } = await import("./segment-codec.js");
|
|
61
|
+
const encoded = await withTimeout(
|
|
62
|
+
serializeResult(value),
|
|
63
|
+
HANDLE_ENCODE_TIMEOUT_MS,
|
|
64
|
+
null,
|
|
65
|
+
);
|
|
66
|
+
return encoded ?? "";
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Decode a Flight-encoded handle-data string. Returns null on any decode
|
|
71
|
+
* failure so the caller can skip handle restore without discarding valid
|
|
72
|
+
* cached/prerendered segments.
|
|
73
|
+
*/
|
|
74
|
+
export async function decodeHandleValue<T>(encoded: string): Promise<T | null> {
|
|
75
|
+
try {
|
|
76
|
+
const { deserializeResult } = await import("./segment-codec.js");
|
|
77
|
+
return await deserializeResult<T>(encoded);
|
|
78
|
+
} catch {
|
|
79
|
+
return null;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
12
82
|
|
|
13
83
|
/**
|
|
14
84
|
* Capture handle data for a set of segments from the handle store.
|
package/src/cache/index.ts
CHANGED
|
@@ -1,43 +1,47 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Cache Store
|
|
3
|
-
*
|
|
4
|
-
* Server-side caching for RSC segments and loader data.
|
|
5
|
-
*
|
|
6
|
-
* Main exports for users:
|
|
7
|
-
* - SegmentCacheStore - Interface for implementing custom cache stores
|
|
8
|
-
* - MemorySegmentCacheStore - In-memory cache for development/testing
|
|
9
|
-
* - CFCacheStore - Cloudflare edge cache store for production
|
|
10
|
-
* - CacheScope / createCacheScope - Request-scoped cache provider
|
|
11
|
-
*/
|
|
12
|
-
|
|
13
|
-
// Segment cache store types and implementations
|
|
14
1
|
export type {
|
|
15
2
|
SegmentCacheStore,
|
|
16
|
-
SegmentCacheProvider,
|
|
17
3
|
CachedEntryData,
|
|
18
|
-
CachedEntryResult,
|
|
19
4
|
CacheGetResult,
|
|
5
|
+
CacheItemResult,
|
|
6
|
+
CacheItemOptions,
|
|
7
|
+
ShellCacheEntry,
|
|
20
8
|
SerializedSegmentData,
|
|
21
9
|
SegmentHandleData,
|
|
22
|
-
CacheConfig,
|
|
23
|
-
CacheConfigOrFactory,
|
|
24
10
|
} from "./types.js";
|
|
25
11
|
|
|
26
12
|
export { MemorySegmentCacheStore } from "./memory-segment-store.js";
|
|
27
13
|
|
|
28
|
-
// Cloudflare cache store
|
|
29
14
|
export {
|
|
30
15
|
CFCacheStore,
|
|
31
16
|
type CFCacheStoreOptions,
|
|
17
|
+
type CFCacheDebug,
|
|
18
|
+
type CFCacheReadDebugEvent,
|
|
19
|
+
type KVNamespace,
|
|
32
20
|
CACHE_STALE_AT_HEADER,
|
|
33
21
|
CACHE_STATUS_HEADER,
|
|
22
|
+
CACHE_REVALIDATING_AT_HEADER,
|
|
23
|
+
EDGE_LOOKUP_TIMEOUT_MS,
|
|
24
|
+
EDGE_READ_TIMEOUT_MS,
|
|
25
|
+
KV_READ_TIMEOUT_MS,
|
|
34
26
|
} from "./cf/index.js";
|
|
35
27
|
|
|
36
|
-
|
|
28
|
+
export {
|
|
29
|
+
VercelCacheStore,
|
|
30
|
+
type VercelCacheStoreOptions,
|
|
31
|
+
type VercelRuntimeCache,
|
|
32
|
+
type VercelCacheDebug,
|
|
33
|
+
type VercelCacheReadDebugEvent,
|
|
34
|
+
type VercelCacheReadOutcome,
|
|
35
|
+
VERCEL_MAX_ITEM_BYTES,
|
|
36
|
+
VERCEL_MAX_TAGS_PER_ITEM,
|
|
37
|
+
VERCEL_MAX_TAG_BYTES,
|
|
38
|
+
} from "./vercel/index.js";
|
|
39
|
+
|
|
37
40
|
export { CacheScope, createCacheScope } from "./cache-scope.js";
|
|
38
41
|
|
|
39
|
-
// Document-level cache middleware
|
|
40
42
|
export {
|
|
41
43
|
createDocumentCacheMiddleware,
|
|
42
44
|
type DocumentCacheOptions,
|
|
43
45
|
} from "./document-cache.js";
|
|
46
|
+
|
|
47
|
+
export type { CacheErrorCategory } from "./cache-error.js";
|