@timber-js/app 0.2.0-alpha.192 → 0.2.0-alpha.194
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/agent-skill.md +2 -0
- package/dist/_chunks/{actions-BjbbNRFN.js → actions-CWYtq6ii.js} +3 -3
- package/dist/_chunks/actions-CWYtq6ii.js.map +1 -0
- package/dist/_chunks/als-registry-C6kcfprT.js.map +1 -1
- package/dist/_chunks/als-slots-BEEIPKYm.js.map +1 -1
- package/dist/_chunks/{build-output-helper-C3DrfzZR.js → build-output-helper-9dqCv1pZ.js} +3 -2
- package/dist/_chunks/build-output-helper-9dqCv1pZ.js.map +1 -0
- package/dist/_chunks/{cache-api-DllJ-Lyw.js → cache-api-CQeYzA5g.js} +6 -8
- package/dist/_chunks/cache-api-CQeYzA5g.js.map +1 -0
- package/dist/_chunks/chains-h7EO-u3n.js +412 -0
- package/dist/_chunks/chains-h7EO-u3n.js.map +1 -0
- package/dist/_chunks/{cli-check-DJZDc22E.js → cli-check-BVthpfLS.js} +43 -6
- package/dist/_chunks/cli-check-BVthpfLS.js.map +1 -0
- package/dist/_chunks/{cli-schema-sync-D4_AZVUb.js → cli-schema-sync-ZwM9u_ob.js} +6 -5
- package/dist/_chunks/{cli-schema-sync-D4_AZVUb.js.map → cli-schema-sync-ZwM9u_ob.js.map} +1 -1
- package/dist/_chunks/{cloudflare-CGP6BZKO.js → cloudflare-BKJC3SC_.js} +28 -22
- package/dist/_chunks/{cloudflare-CGP6BZKO.js.map → cloudflare-BKJC3SC_.js.map} +1 -1
- package/dist/_chunks/codec-registry-oOUxugz3.js.map +1 -1
- package/dist/_chunks/{convention-lint-CpteIpTm.js → convention-lint-DO10_pVl.js} +93 -7
- package/dist/_chunks/convention-lint-DO10_pVl.js.map +1 -0
- package/dist/_chunks/dist-DtrJyBbw.js +386 -0
- package/dist/_chunks/dist-DtrJyBbw.js.map +1 -0
- package/dist/_chunks/error-boundary-D-ODYX41.js.map +1 -1
- package/dist/_chunks/{file-cache-DmX7OqZP.js → file-cache-Dw6BJPG7.js} +5 -1
- package/dist/_chunks/{file-cache-DmX7OqZP.js.map → file-cache-Dw6BJPG7.js.map} +1 -1
- package/dist/_chunks/{format-CfwjgPz9.js → format-BKclgVbk.js} +3 -3
- package/dist/_chunks/{format-CfwjgPz9.js.map → format-BKclgVbk.js.map} +1 -1
- package/dist/_chunks/graph-cache-CP4GEmf9.js +304 -0
- package/dist/_chunks/graph-cache-CP4GEmf9.js.map +1 -0
- package/dist/_chunks/href-validation-CMc5JRls.js.map +1 -1
- package/dist/_chunks/live-graph-Bx4HodF1.js +150 -0
- package/dist/_chunks/live-graph-Bx4HodF1.js.map +1 -0
- package/dist/_chunks/{logger-CH7IcMmg.js → logger-pumCm3Il.js} +25 -7
- package/dist/_chunks/{logger-CH7IcMmg.js.map → logger-pumCm3Il.js.map} +1 -1
- package/dist/_chunks/{mdx-file-C005ay-P.js → mdx-file-CXyHGUpS.js} +3 -3
- package/dist/_chunks/mdx-file-CXyHGUpS.js.map +1 -0
- package/dist/_chunks/{plugin-context-rCinWLiE.js → plugin-context-8idfR3UZ.js} +2 -2
- package/dist/_chunks/plugin-context-8idfR3UZ.js.map +1 -0
- package/dist/_chunks/poison-rules-DoEhbqaY.js +110 -0
- package/dist/_chunks/poison-rules-DoEhbqaY.js.map +1 -0
- package/dist/_chunks/poison-scan-BAxfTT5L.js +101 -0
- package/dist/_chunks/poison-scan-BAxfTT5L.js.map +1 -0
- package/dist/_chunks/resolve-schema-CBR6Lm4i.js.map +1 -1
- package/dist/_chunks/rolldown-runtime-D7D4PA-g.js +13 -0
- package/dist/_chunks/router-ref-DuYuV_0Q.js.map +1 -1
- package/dist/_chunks/{rsc-media-type-DRqE_lD_.js → rsc-media-type-DDc7duTD.js} +17 -2
- package/dist/_chunks/{rsc-media-type-DRqE_lD_.js.map → rsc-media-type-DDc7duTD.js.map} +1 -1
- package/dist/_chunks/scan-BoP17W3w.js +140 -0
- package/dist/_chunks/scan-BoP17W3w.js.map +1 -0
- package/dist/_chunks/{scanner-CAietmj4.js → scanner-BRIOmHE2.js} +43 -4
- package/dist/_chunks/scanner-BRIOmHE2.js.map +1 -0
- package/dist/_chunks/schema-bridge-C83xa9lT.js.map +1 -1
- package/dist/_chunks/segment-classify-C539Pa2O.js.map +1 -1
- package/dist/_chunks/{segment-keys-BawYuNFO.js → segment-keys-BhqoHiLc.js} +14 -2
- package/dist/_chunks/{segment-keys-BawYuNFO.js.map → segment-keys-BhqoHiLc.js.map} +1 -1
- package/dist/_chunks/slot-params-BCTmZkQB.js.map +1 -1
- package/dist/_chunks/ssr-data-14MXm7Pj.js.map +1 -1
- package/dist/_chunks/use-query-states-I3JMng6J.js.map +1 -1
- package/dist/_chunks/use-segment-params-C4r4BD9T.js.map +1 -1
- package/dist/_chunks/{walkers-BsVLmD1S.js → walkers-uCu3WW6_.js} +9 -6
- package/dist/_chunks/{walkers-BsVLmD1S.js.map → walkers-uCu3WW6_.js.map} +1 -1
- package/dist/adapters/build-output-helper.d.ts +1 -1
- package/dist/adapters/build-output-helper.d.ts.map +1 -1
- package/dist/adapters/cloudflare-dev.d.ts.map +1 -1
- package/dist/adapters/cloudflare-dev.js +2 -1
- package/dist/adapters/cloudflare-dev.js.map +1 -1
- package/dist/adapters/cloudflare-kv-cache.d.ts +1 -1
- package/dist/adapters/cloudflare-kv-cache.d.ts.map +1 -1
- package/dist/adapters/cloudflare-kv-cache.js +7 -8
- package/dist/adapters/cloudflare-kv-cache.js.map +1 -1
- package/dist/adapters/cloudflare.d.ts +1 -1
- package/dist/adapters/cloudflare.d.ts.map +1 -1
- package/dist/adapters/cloudflare.js +1 -1
- package/dist/adapters/nitro-presets.d.ts +37 -0
- package/dist/adapters/nitro-presets.d.ts.map +1 -0
- package/dist/adapters/nitro-preview.d.ts +32 -0
- package/dist/adapters/nitro-preview.d.ts.map +1 -0
- package/dist/adapters/nitro.d.ts +28 -51
- package/dist/adapters/nitro.d.ts.map +1 -1
- package/dist/adapters/nitro.js +224 -171
- package/dist/adapters/nitro.js.map +1 -1
- package/dist/analyze/chains.d.ts +124 -0
- package/dist/analyze/chains.d.ts.map +1 -0
- package/dist/analyze/classify.d.ts +150 -0
- package/dist/analyze/classify.d.ts.map +1 -0
- package/dist/analyze/crawl-entry.d.ts +17 -0
- package/dist/analyze/crawl-entry.d.ts.map +1 -0
- package/dist/analyze/crawl-entry.js +313 -0
- package/dist/analyze/crawl-entry.js.map +1 -0
- package/dist/analyze/crawl.d.ts +134 -0
- package/dist/analyze/crawl.d.ts.map +1 -0
- package/dist/analyze/graph-cache.d.ts +104 -0
- package/dist/analyze/graph-cache.d.ts.map +1 -0
- package/dist/analyze/graph-command.d.ts +43 -0
- package/dist/analyze/graph-command.d.ts.map +1 -0
- package/dist/analyze/graph-command.js +472 -0
- package/dist/analyze/graph-command.js.map +1 -0
- package/dist/analyze/live-graph.d.ts +81 -0
- package/dist/analyze/live-graph.d.ts.map +1 -0
- package/dist/analyze/poison-rules.d.ts +72 -0
- package/dist/analyze/poison-rules.d.ts.map +1 -0
- package/dist/analyze/poison-scan.d.ts +48 -0
- package/dist/analyze/poison-scan.d.ts.map +1 -0
- package/dist/analyze/scan.d.ts +73 -0
- package/dist/analyze/scan.d.ts.map +1 -0
- package/dist/cache/cache-api.d.ts +2 -2
- package/dist/cache/cache-api.d.ts.map +1 -1
- package/dist/cache/index.d.ts +8 -8
- package/dist/cache/index.d.ts.map +1 -1
- package/dist/cache/index.js +1 -1
- package/dist/cache/redis-handler.d.ts +1 -1
- package/dist/cache/redis-handler.d.ts.map +1 -1
- package/dist/cache/stores/cloudflare-kv.d.ts +1 -1
- package/dist/cache/stores/cloudflare-kv.d.ts.map +1 -1
- package/dist/cache/stores/cloudflare-kv.js.map +1 -1
- package/dist/cache/stores/memory.d.ts +1 -1
- package/dist/cache/stores/memory.d.ts.map +1 -1
- package/dist/cache/stores/memory.js.map +1 -1
- package/dist/cache/stores/redis.d.ts +1 -1
- package/dist/cache/stores/redis.d.ts.map +1 -1
- package/dist/cache/stores/redis.js.map +1 -1
- package/dist/cache/stores/vercel.d.ts +1 -1
- package/dist/cache/stores/vercel.d.ts.map +1 -1
- package/dist/cache/stores/vercel.js.map +1 -1
- package/dist/cache/tag-aware-handler.d.ts +2 -2
- package/dist/cache/tag-aware-handler.d.ts.map +1 -1
- package/dist/cache/timber-cache.d.ts +1 -1
- package/dist/cache/timber-cache.d.ts.map +1 -1
- package/dist/cdn/cloudflare-purge.d.ts +1 -1
- package/dist/cdn/cloudflare-purge.d.ts.map +1 -1
- package/dist/cdn/cloudflare-purge.js.map +1 -1
- package/dist/cdn/fastly-purge.d.ts +1 -1
- package/dist/cdn/fastly-purge.d.ts.map +1 -1
- package/dist/cdn/fastly-purge.js.map +1 -1
- package/dist/cdn/index.d.ts +4 -4
- package/dist/cdn/index.d.ts.map +1 -1
- package/dist/cdn/workers-cache-purge.d.ts +5 -1
- package/dist/cdn/workers-cache-purge.d.ts.map +1 -1
- package/dist/cdn/workers-cache-purge.js.map +1 -1
- package/dist/cli-check.d.ts +10 -0
- package/dist/cli-check.d.ts.map +1 -1
- package/dist/cli.d.ts +12 -4
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +30 -6
- package/dist/cli.js.map +1 -1
- package/dist/client/browser-entry/hydrate.d.ts +2 -2
- package/dist/client/browser-entry/hydrate.d.ts.map +1 -1
- package/dist/client/browser-entry/post-hydration.d.ts +2 -2
- package/dist/client/browser-entry/router-init.d.ts +2 -2
- package/dist/client/browser-entry/rsc-stream.d.ts +1 -1
- package/dist/client/form.d.ts +2 -2
- package/dist/client/form.d.ts.map +1 -1
- package/dist/client/history.d.ts +2 -2
- package/dist/client/index.d.ts +18 -18
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js.map +1 -1
- package/dist/client/internal.d.ts +19 -19
- package/dist/client/internal.d.ts.map +1 -1
- package/dist/client/internal.js +11 -15
- package/dist/client/internal.js.map +1 -1
- package/dist/client/link.d.ts +3 -3
- package/dist/client/navigation-commit.d.ts +5 -5
- package/dist/client/navigation-root.d.ts +1 -1
- package/dist/client/navigation-root.d.ts.map +1 -1
- package/dist/client/params-context.d.ts +3 -3
- package/dist/client/router-pipeline.d.ts +7 -7
- package/dist/client/router-ref.d.ts +1 -1
- package/dist/client/router-types.d.ts +6 -6
- package/dist/client/router-types.d.ts.map +1 -1
- package/dist/client/router.d.ts +1 -1
- package/dist/client/rsc-fetch.d.ts +4 -4
- package/dist/client/rsc-fetch.d.ts.map +1 -1
- package/dist/client/segment-cache.d.ts +2 -2
- package/dist/client/slot-provider.d.ts +1 -1
- package/dist/client/ssr-data.d.ts +2 -2
- package/dist/client/state.d.ts +4 -4
- package/dist/client/use-query-states.d.ts +1 -1
- package/dist/client/use-segment-params.d.ts +3 -3
- package/dist/codec.d.ts +2 -2
- package/dist/codec.js.map +1 -1
- package/dist/config-validation.d.ts +1 -1
- package/dist/cookies/define-cookie.d.ts +3 -3
- package/dist/cookies/index.d.ts +3 -3
- package/dist/cookies/index.js +3 -4
- package/dist/cookies/index.js.map +1 -1
- package/dist/cookies/json-cookie.d.ts +1 -1
- package/dist/dev-tools/404-page.d.ts +2 -2
- package/dist/dev-tools/error-page.d.ts +2 -2
- package/dist/dev-tools/index.d.ts +12 -12
- package/dist/dev-tools/instrumentation.d.ts +1 -1
- package/dist/dev-tools/logs.d.ts +1 -1
- package/dist/dev-tools/overlay.d.ts +2 -2
- package/dist/dev-tools/terminal.d.ts +1 -1
- package/dist/fonts/ast.d.ts +4 -4
- package/dist/fonts/bundle.d.ts +3 -3
- package/dist/fonts/css.d.ts +1 -1
- package/dist/fonts/dev-middleware.d.ts +1 -1
- package/dist/fonts/google.d.ts +1 -1
- package/dist/fonts/local.d.ts +1 -1
- package/dist/fonts/pipeline.d.ts +3 -3
- package/dist/fonts/transform.d.ts +2 -2
- package/dist/fonts/types.d.ts +1 -1
- package/dist/fonts/virtual-modules.d.ts +1 -1
- package/dist/index.d.ts +3 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +785 -282
- package/dist/index.js.map +1 -1
- package/dist/params/codec-registry.d.ts +1 -1
- package/dist/params/define-schema.d.ts +2 -2
- package/dist/params/index.d.ts +4 -4
- package/dist/params/index.js.map +1 -1
- package/dist/params/resolve-schema.d.ts +1 -1
- package/dist/plugin-context.d.ts +9 -9
- package/dist/plugin-context.d.ts.map +1 -1
- package/dist/plugins/adapter-build.d.ts +2 -2
- package/dist/plugins/build-manifest.d.ts +2 -2
- package/dist/plugins/build-report.d.ts +5 -5
- package/dist/plugins/cache.d.ts +1 -1
- package/dist/plugins/callsite-jsx.d.ts +2 -2
- package/dist/plugins/chunks.d.ts +1 -1
- package/dist/plugins/chunks.d.ts.map +1 -1
- package/dist/plugins/cloudflare-wasm.d.ts +1 -1
- package/dist/plugins/content.d.ts +1 -1
- package/dist/plugins/content.d.ts.map +1 -1
- package/dist/plugins/dev-discovery.d.ts +123 -0
- package/dist/plugins/dev-discovery.d.ts.map +1 -0
- package/dist/plugins/dev-server.d.ts +1 -1
- package/dist/plugins/dev-server.d.ts.map +1 -1
- package/dist/plugins/entries.d.ts +1 -1
- package/dist/plugins/fonts.d.ts +3 -3
- package/dist/plugins/fonts.d.ts.map +1 -1
- package/dist/plugins/graph-endpoint.d.ts +112 -0
- package/dist/plugins/graph-endpoint.d.ts.map +1 -0
- package/dist/plugins/mdx.d.ts +1 -1
- package/dist/plugins/mdx.d.ts.map +1 -1
- package/dist/plugins/prebuilt-capture.d.ts +2 -2
- package/dist/plugins/prebuilt-options-analysis.d.ts +1 -1
- package/dist/plugins/prebuilt.d.ts +1 -1
- package/dist/plugins/prerender-sugar.d.ts +11 -14
- package/dist/plugins/prerender-sugar.d.ts.map +1 -1
- package/dist/plugins/request-dep/analysis.d.ts +1 -1
- package/dist/plugins/request-dep/index.d.ts +5 -5
- package/dist/plugins/request-dep/origin.d.ts +1 -1
- package/dist/plugins/routing.d.ts +1 -1
- package/dist/plugins/routing.d.ts.map +1 -1
- package/dist/plugins/server-bundle.d.ts.map +1 -1
- package/dist/plugins/shims.d.ts +1 -1
- package/dist/plugins/shims.d.ts.map +1 -1
- package/dist/plugins/static-build.d.ts +5 -5
- package/dist/routing/codegen-shared.d.ts +1 -1
- package/dist/routing/codegen-write.d.ts +1 -1
- package/dist/routing/codegen.d.ts +1 -1
- package/dist/routing/collision-probe.d.ts +1 -1
- package/dist/routing/collision-spaces.d.ts +1 -1
- package/dist/routing/convention-lint.d.ts +1 -1
- package/dist/routing/convention-lint.d.ts.map +1 -1
- package/dist/routing/index.d.ts +13 -13
- package/dist/routing/index.js +3 -3
- package/dist/routing/interception.d.ts +1 -1
- package/dist/routing/interception.d.ts.map +1 -1
- package/dist/routing/link-codegen.d.ts +1 -1
- package/dist/routing/manifest-codegen.d.ts +1 -1
- package/dist/routing/scanner.d.ts +14 -1
- package/dist/routing/scanner.d.ts.map +1 -1
- package/dist/routing/schema-validation.d.ts +1 -1
- package/dist/routing/segment-classify.d.ts +1 -1
- package/dist/routing/segment-codegen.d.ts +1 -1
- package/dist/routing/segment-keys.d.ts +1 -1
- package/dist/routing/slot-placement.d.ts +1 -1
- package/dist/routing/walkers.d.ts +1 -1
- package/dist/rsc-runtime/transforms.d.ts +13 -0
- package/dist/rsc-runtime/transforms.d.ts.map +1 -0
- package/dist/schema-bridge.d.ts +1 -1
- package/dist/search-params/define.d.ts +3 -3
- package/dist/search-params/index.d.ts +3 -3
- package/dist/search-params/index.js.map +1 -1
- package/dist/search-params/wrappers.d.ts +1 -1
- package/dist/server/access-gate.d.ts +1 -1
- package/dist/server/action-client.d.ts +1 -1
- package/dist/server/action-handler.d.ts +5 -5
- package/dist/server/actions.d.ts +2 -2
- package/dist/server/als-registry.d.ts +8 -8
- package/dist/server/asset-headers.d.ts +1 -1
- package/dist/server/chain-url-parts.d.ts +3 -3
- package/dist/server/children-interception.d.ts +2 -2
- package/dist/server/cookie-context.d.ts +1 -1
- package/dist/server/cookie-parsing.d.ts +2 -2
- package/dist/server/default-logger.d.ts +1 -1
- package/dist/server/deny-boundary.d.ts +2 -2
- package/dist/server/deny-renderer.d.ts +5 -5
- package/dist/server/early-hints.d.ts +1 -1
- package/dist/server/error-boundary-wrapper.d.ts +2 -4
- package/dist/server/error-boundary-wrapper.d.ts.map +1 -1
- package/dist/server/fallback-error.d.ts +5 -5
- package/dist/server/flight-injection-state.d.ts +1 -1
- package/dist/server/form-flash.d.ts +1 -1
- package/dist/server/html-injector-core.d.ts +2 -2
- package/dist/server/html-injectors.d.ts +1 -1
- package/dist/server/index.d.ts +18 -18
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +33 -32
- package/dist/server/index.js.map +1 -1
- package/dist/server/instrumentation.d.ts +1 -1
- package/dist/server/internal.d.ts +50 -50
- package/dist/server/internal.d.ts.map +1 -1
- package/dist/server/internal.js +1023 -1025
- package/dist/server/internal.js.map +1 -1
- package/dist/server/metadata-collector.d.ts +2 -2
- package/dist/server/metadata-platform.d.ts +2 -2
- package/dist/server/metadata-render.d.ts +2 -2
- package/dist/server/metadata-routes.d.ts +3 -3
- package/dist/server/metadata-social.d.ts +2 -2
- package/dist/server/metadata.d.ts +2 -2
- package/dist/server/middleware-runner.d.ts +1 -1
- package/dist/server/node-stream-transforms.d.ts +1 -1
- package/dist/server/param-coercion.d.ts +4 -4
- package/dist/server/pipeline-helpers.d.ts +3 -3
- package/dist/server/pipeline-interception.d.ts +1 -1
- package/dist/server/pipeline-metadata.d.ts +1 -1
- package/dist/server/pipeline-outcome.d.ts +2 -2
- package/dist/server/pipeline-phases.d.ts +3 -3
- package/dist/server/pipeline-phases.d.ts.map +1 -1
- package/dist/server/pipeline.d.ts +9 -9
- package/dist/server/prebuilt/cache-key.d.ts +1 -1
- package/dist/server/prebuilt/capture-state.d.ts +1 -1
- package/dist/server/prebuilt/key-discipline.d.ts +1 -1
- package/dist/server/prebuilt/manifest-tag-index.d.ts +1 -1
- package/dist/server/prebuilt/overlay.d.ts +2 -2
- package/dist/server/prebuilt/payload-source.d.ts +1 -1
- package/dist/server/prebuilt/slots.d.ts +1 -1
- package/dist/server/prebuilt/synthetic-store.d.ts +2 -2
- package/dist/server/prebuilt-builder.d.ts +2 -2
- package/dist/server/primitives.d.ts +2 -2
- package/dist/server/publish-params.d.ts +1 -1
- package/dist/server/request-context.d.ts +3 -3
- package/dist/server/route-element-builder.d.ts +16 -6
- package/dist/server/route-element-builder.d.ts.map +1 -1
- package/dist/server/route-handler.d.ts +1 -1
- package/dist/server/route-matcher.d.ts +4 -4
- package/dist/server/rsc-cache-key-guard.d.ts.map +1 -1
- package/dist/server/rsc-entry/action-middleware-runner.d.ts +2 -2
- package/dist/server/rsc-entry/api-handler.d.ts +1 -1
- package/dist/server/rsc-entry/api-handler.d.ts.map +1 -1
- package/dist/server/rsc-entry/deny-fallback.d.ts +3 -3
- package/dist/server/rsc-entry/error-renderer.d.ts +4 -4
- package/dist/server/rsc-entry/helpers.d.ts +6 -6
- package/dist/server/rsc-entry/index.d.ts +7 -6
- package/dist/server/rsc-entry/index.d.ts.map +1 -1
- package/dist/server/rsc-entry/render-route.d.ts +4 -4
- package/dist/server/rsc-entry/revalidate-renderer.d.ts +4 -4
- package/dist/server/rsc-entry/rsc-payload.d.ts +4 -4
- package/dist/server/rsc-entry/rsc-payload.d.ts.map +1 -1
- package/dist/server/rsc-entry/rsc-stream.d.ts +3 -3
- package/dist/server/rsc-entry/ssr-bridge.d.ts +1 -1
- package/dist/server/rsc-entry/ssr-renderer.d.ts +7 -7
- package/dist/server/rsc-entry/wrap-action-dispatch.d.ts +5 -5
- package/dist/server/sitemap-generator.d.ts +2 -2
- package/dist/server/sitemap-handler.d.ts +1 -1
- package/dist/server/skippable-prefix.d.ts +3 -3
- package/dist/server/slot-interception.d.ts +2 -2
- package/dist/server/slot-resolver.d.ts +3 -7
- package/dist/server/slot-resolver.d.ts.map +1 -1
- package/dist/server/ssr-bridge-types.d.ts +2 -2
- package/dist/server/ssr-entry.d.ts +1 -1
- package/dist/server/static-generator.d.ts +1 -1
- package/dist/server/static-not-found.d.ts +1 -1
- package/dist/server/status-code-resolver.d.ts +1 -1
- package/dist/server/tracing.d.ts +3 -3
- package/dist/server/tree-builder.d.ts +3 -3
- package/dist/server/tree-match.d.ts +1 -1
- package/dist/server/types.d.ts +2 -2
- package/dist/server/utils/mdx-file.d.ts +2 -0
- package/dist/server/utils/mdx-file.d.ts.map +1 -1
- package/dist/server/workers-cache-bridge.d.ts +1 -1
- package/dist/shared/als-slots.d.ts +1 -1
- package/dist/shared/payload-root.d.ts +2 -2
- package/dist/shared/rsc-media-type.d.ts +12 -0
- package/dist/shared/rsc-media-type.d.ts.map +1 -1
- package/dist/shared/slot-params.d.ts +1 -1
- package/dist/shims/font-google.d.ts +1 -1
- package/dist/shims/font-google.js.map +1 -1
- package/dist/shims/font-local.d.ts +1 -1
- package/dist/shims/font-local.js.map +1 -1
- package/dist/shims/navigation-client.d.ts +4 -4
- package/dist/shims/navigation.d.ts +2 -2
- package/docs/api/36-cli.mdx +23 -3
- package/docs/learn/11-error-handling.mdx +11 -0
- package/docs/more/01-advanced-routing.mdx +1 -0
- package/package.json +17 -16
- package/src/adapters/build-output-helper.ts +4 -4
- package/src/adapters/cloudflare-dev.ts +7 -1
- package/src/adapters/cloudflare-kv-cache.ts +11 -8
- package/src/adapters/cloudflare.ts +21 -15
- package/src/adapters/compress-module.ts +2 -2
- package/src/adapters/nitro-presets.ts +139 -0
- package/src/adapters/nitro-preview.ts +340 -0
- package/src/adapters/nitro.ts +100 -465
- package/src/adapters/shared.ts +1 -1
- package/src/analyze/chains.ts +411 -0
- package/src/analyze/classify.ts +258 -0
- package/src/analyze/crawl-entry.ts +68 -0
- package/src/analyze/crawl.ts +500 -0
- package/src/analyze/graph-cache.ts +332 -0
- package/src/analyze/graph-command.ts +762 -0
- package/src/analyze/live-graph.ts +232 -0
- package/src/analyze/poison-rules.ts +165 -0
- package/src/analyze/poison-scan.ts +162 -0
- package/src/analyze/scan.ts +149 -0
- package/src/cache/cache-api.ts +7 -7
- package/src/cache/index.ts +9 -9
- package/src/cache/redis-handler.ts +2 -2
- package/src/cache/stores/cloudflare-kv.ts +1 -1
- package/src/cache/stores/memory.ts +2 -2
- package/src/cache/stores/redis.ts +1 -1
- package/src/cache/stores/vercel.ts +1 -1
- package/src/cache/tag-aware-handler.ts +2 -2
- package/src/cache/timber-cache.ts +8 -8
- package/src/cdn/cloudflare-purge.ts +1 -1
- package/src/cdn/fastly-purge.ts +1 -1
- package/src/cdn/index.ts +10 -4
- package/src/cdn/workers-cache-purge.ts +6 -2
- package/src/cli-check.ts +53 -4
- package/src/cli-schema-sync.ts +3 -3
- package/src/cli.ts +50 -11
- package/src/client/browser-dev.ts +1 -1
- package/src/client/browser-entry/action-dispatch.ts +5 -5
- package/src/client/browser-entry/hmr.ts +1 -1
- package/src/client/browser-entry/hydrate.ts +9 -9
- package/src/client/browser-entry/index.ts +10 -10
- package/src/client/browser-entry/post-hydration.ts +5 -5
- package/src/client/browser-entry/router-init.ts +9 -9
- package/src/client/browser-entry/rsc-stream.ts +3 -3
- package/src/client/error-boundary.tsx +4 -4
- package/src/client/form.tsx +7 -2
- package/src/client/history.ts +2 -2
- package/src/client/index.ts +21 -18
- package/src/client/internal.ts +19 -19
- package/src/client/link.tsx +9 -9
- package/src/client/navigation-api.ts +1 -1
- package/src/client/navigation-commit.ts +5 -5
- package/src/client/navigation-context.ts +1 -1
- package/src/client/navigation-root.tsx +1 -1
- package/src/client/nuqs-adapter.tsx +2 -2
- package/src/client/params-context.ts +4 -4
- package/src/client/router-effects.ts +3 -3
- package/src/client/router-lifecycle.ts +2 -2
- package/src/client/router-pipeline.ts +10 -10
- package/src/client/router-ref.ts +2 -2
- package/src/client/router-skew.ts +2 -2
- package/src/client/router-types.ts +6 -6
- package/src/client/router.ts +13 -13
- package/src/client/rsc-fetch.ts +11 -16
- package/src/client/segment-cache.ts +2 -2
- package/src/client/segment-outlet.tsx +1 -1
- package/src/client/shallow-url.ts +1 -1
- package/src/client/slot-outlet.tsx +1 -1
- package/src/client/slot-provider.tsx +1 -1
- package/src/client/ssr-data.ts +3 -3
- package/src/client/stale-client.ts +1 -1
- package/src/client/state.ts +4 -4
- package/src/client/top-loader.tsx +1 -1
- package/src/client/unload-guard.ts +1 -1
- package/src/client/use-cookie.ts +2 -2
- package/src/client/use-pathname.ts +2 -2
- package/src/client/use-pending-navigation.ts +1 -1
- package/src/client/use-query-states.ts +3 -3
- package/src/client/use-router.ts +2 -2
- package/src/client/use-search-params.ts +3 -3
- package/src/client/use-segment-params.ts +6 -6
- package/src/client/use-selected-layout-segment.ts +2 -2
- package/src/codec.ts +2 -2
- package/src/config-validation.ts +1 -1
- package/src/cookies/define-cookie.ts +6 -6
- package/src/cookies/index.ts +3 -3
- package/src/cookies/json-cookie.ts +1 -1
- package/src/dev-tools/404-page.ts +4 -4
- package/src/dev-tools/dev-page-shell.ts +1 -1
- package/src/dev-tools/error-page.ts +4 -4
- package/src/dev-tools/index.ts +12 -12
- package/src/dev-tools/instrumentation.ts +1 -1
- package/src/dev-tools/logs.ts +1 -1
- package/src/dev-tools/overlay.ts +3 -3
- package/src/dev-tools/terminal.ts +2 -2
- package/src/fonts/ast.ts +5 -5
- package/src/fonts/bundle.ts +5 -5
- package/src/fonts/css.ts +1 -1
- package/src/fonts/dev-middleware.ts +2 -2
- package/src/fonts/google.ts +2 -2
- package/src/fonts/local.ts +4 -4
- package/src/fonts/pipeline.ts +8 -8
- package/src/fonts/transform.ts +5 -5
- package/src/fonts/types.ts +1 -1
- package/src/fonts/virtual-modules.ts +1 -1
- package/src/index.ts +46 -37
- package/src/params/codec-registry.ts +1 -1
- package/src/params/define-schema.ts +2 -2
- package/src/params/index.ts +4 -4
- package/src/params/resolve-schema.ts +2 -2
- package/src/plugin-context.ts +10 -10
- package/src/plugins/adapter-build.ts +5 -5
- package/src/plugins/build-manifest.ts +4 -4
- package/src/plugins/build-report.ts +6 -6
- package/src/plugins/cache.ts +3 -3
- package/src/plugins/callsite-ast.ts +1 -1
- package/src/plugins/callsite-jsx.ts +2 -2
- package/src/plugins/chunks.ts +1 -1
- package/src/plugins/cloudflare-wasm.ts +1 -1
- package/src/plugins/content.ts +5 -1
- package/src/plugins/dev-discovery.ts +218 -0
- package/src/plugins/dev-server.ts +97 -12
- package/src/plugins/entries.ts +1 -1
- package/src/plugins/fonts.ts +17 -10
- package/src/plugins/graph-endpoint.ts +532 -0
- package/src/plugins/mdx.ts +4 -3
- package/src/plugins/prebuilt-capture.ts +3 -3
- package/src/plugins/prebuilt-options-analysis.ts +1 -1
- package/src/plugins/prebuilt.ts +7 -7
- package/src/plugins/prerender-sugar.ts +11 -19
- package/src/plugins/request-dep/analysis.ts +1 -1
- package/src/plugins/request-dep/index.ts +8 -8
- package/src/plugins/request-dep/origin.ts +1 -1
- package/src/plugins/routing.ts +12 -7
- package/src/plugins/server-bundle.ts +9 -2
- package/src/plugins/shims.ts +16 -31
- package/src/plugins/static-build.ts +10 -10
- package/src/routing/codegen-shared.ts +1 -1
- package/src/routing/codegen-write.ts +3 -3
- package/src/routing/codegen.ts +14 -5
- package/src/routing/collision-probe.ts +3 -3
- package/src/routing/collision-spaces.ts +3 -3
- package/src/routing/convention-lint.ts +136 -6
- package/src/routing/export-detect.ts +1 -1
- package/src/routing/index.ts +13 -13
- package/src/routing/interception.ts +41 -4
- package/src/routing/link-codegen.ts +3 -3
- package/src/routing/manifest-codegen.ts +2 -2
- package/src/routing/scanner.ts +33 -9
- package/src/routing/schema-validation.ts +4 -4
- package/src/routing/segment-classify.ts +2 -2
- package/src/routing/segment-codegen.ts +1 -1
- package/src/routing/segment-keys.ts +1 -1
- package/src/routing/slot-placement.ts +1 -1
- package/src/routing/walkers.ts +1 -1
- package/src/rsc-runtime/transforms.ts +13 -0
- package/src/rsc-runtime/vendor-types.d.ts +12 -0
- package/src/schema-bridge.ts +1 -1
- package/src/search-params/define.ts +8 -8
- package/src/search-params/index.ts +3 -3
- package/src/search-params/wrappers.ts +3 -3
- package/src/server/access-gate.tsx +6 -6
- package/src/server/action-client.ts +5 -5
- package/src/server/action-handler.ts +16 -16
- package/src/server/actions.ts +5 -5
- package/src/server/als-registry.ts +8 -8
- package/src/server/asset-headers.ts +2 -2
- package/src/server/chain-url-parts.ts +5 -5
- package/src/server/children-interception.ts +4 -4
- package/src/server/compress.ts +1 -1
- package/src/server/cookie-context.ts +4 -4
- package/src/server/cookie-parsing.ts +2 -2
- package/src/server/default-logger.ts +3 -3
- package/src/server/deny-boundary.ts +10 -10
- package/src/server/deny-renderer.ts +38 -25
- package/src/server/early-hints-sender.ts +2 -2
- package/src/server/early-hints.ts +2 -2
- package/src/server/error-boundary-wrapper.ts +4 -12
- package/src/server/fallback-error.ts +13 -13
- package/src/server/flight-injection-state.ts +1 -1
- package/src/server/form-flash.ts +2 -2
- package/src/server/html-injector-core.ts +4 -4
- package/src/server/html-injectors.ts +5 -5
- package/src/server/index.ts +18 -18
- package/src/server/instrumentation.ts +1 -1
- package/src/server/internal.ts +50 -50
- package/src/server/logger.ts +4 -4
- package/src/server/metadata-collector.ts +7 -7
- package/src/server/metadata-platform.ts +2 -2
- package/src/server/metadata-render.ts +4 -4
- package/src/server/metadata-routes.ts +3 -3
- package/src/server/metadata-social.ts +2 -2
- package/src/server/metadata.ts +2 -2
- package/src/server/middleware-runner.ts +1 -1
- package/src/server/node-stream-transforms.ts +4 -4
- package/src/server/param-coercion.ts +8 -8
- package/src/server/pipeline-helpers.ts +7 -7
- package/src/server/pipeline-interception.ts +2 -2
- package/src/server/pipeline-metadata.ts +1 -1
- package/src/server/pipeline-outcome.ts +8 -8
- package/src/server/pipeline-phases.ts +24 -28
- package/src/server/pipeline.ts +22 -22
- package/src/server/prebuilt/cache-key.ts +1 -1
- package/src/server/prebuilt/capture-state.ts +1 -1
- package/src/server/prebuilt/key-discipline.ts +1 -1
- package/src/server/prebuilt/manifest-tag-index.ts +1 -1
- package/src/server/prebuilt/overlay.ts +6 -6
- package/src/server/prebuilt/payload-source.ts +2 -2
- package/src/server/prebuilt/slots.ts +5 -5
- package/src/server/prebuilt/synthetic-store.ts +2 -2
- package/src/server/prebuilt-builder.ts +16 -16
- package/src/server/prebuilt-runtime.ts +12 -12
- package/src/server/primitives.ts +7 -7
- package/src/server/publish-params.ts +3 -3
- package/src/server/request-context.ts +7 -7
- package/src/server/route-element-builder.ts +108 -50
- package/src/server/route-handler.ts +4 -4
- package/src/server/route-matcher.ts +5 -5
- package/src/server/rsc-cache-key-guard.ts +3 -5
- package/src/server/rsc-entry/action-middleware-runner.ts +7 -7
- package/src/server/rsc-entry/api-handler.ts +18 -9
- package/src/server/rsc-entry/deny-fallback.ts +10 -10
- package/src/server/rsc-entry/error-renderer.ts +27 -27
- package/src/server/rsc-entry/helpers.ts +10 -10
- package/src/server/rsc-entry/index.ts +51 -47
- package/src/server/rsc-entry/render-route.ts +20 -20
- package/src/server/rsc-entry/revalidate-renderer.ts +12 -12
- package/src/server/rsc-entry/rsc-payload.ts +19 -15
- package/src/server/rsc-entry/rsc-stream.ts +8 -8
- package/src/server/rsc-entry/ssr-bridge.ts +3 -3
- package/src/server/rsc-entry/ssr-renderer.ts +23 -23
- package/src/server/rsc-entry/wrap-action-dispatch.ts +9 -9
- package/src/server/rsc-prop-warnings.ts +1 -1
- package/src/server/sensitive-fields.ts +1 -1
- package/src/server/server-timing.ts +1 -1
- package/src/server/sitemap-generator.ts +3 -3
- package/src/server/sitemap-handler.ts +3 -3
- package/src/server/skippable-prefix.ts +7 -7
- package/src/server/slot-interception.ts +5 -5
- package/src/server/slot-resolver.ts +20 -28
- package/src/server/ssr-bridge-types.ts +2 -2
- package/src/server/ssr-entry.ts +18 -18
- package/src/server/ssr-render.ts +4 -4
- package/src/server/ssr-wrappers.tsx +1 -1
- package/src/server/state-tree-diff.ts +1 -1
- package/src/server/static-generator.ts +6 -6
- package/src/server/static-not-found.ts +3 -3
- package/src/server/status-code-resolver.ts +1 -1
- package/src/server/tracing.ts +5 -5
- package/src/server/tree-builder.ts +4 -4
- package/src/server/tree-match.ts +1 -1
- package/src/server/types.ts +2 -2
- package/src/server/utils/mdx-file.ts +2 -2
- package/src/server/waituntil-bridge.ts +1 -1
- package/src/server/workers-cache-bridge.ts +2 -2
- package/src/shared/als-slots.ts +1 -1
- package/src/shared/payload-root.ts +2 -2
- package/src/shared/rsc-media-type.ts +16 -0
- package/src/shared/slot-params.ts +1 -1
- package/src/shims/font-google.ts +1 -1
- package/src/shims/font-local.ts +1 -1
- package/src/shims/navigation-client.ts +5 -5
- package/src/shims/navigation.ts +2 -2
- package/LICENSE +0 -8
- package/dist/_chunks/actions-BjbbNRFN.js.map +0 -1
- package/dist/_chunks/build-output-helper-C3DrfzZR.js.map +0 -1
- package/dist/_chunks/cache-api-DllJ-Lyw.js.map +0 -1
- package/dist/_chunks/cli-check-DJZDc22E.js.map +0 -1
- package/dist/_chunks/convention-lint-CpteIpTm.js.map +0 -1
- package/dist/_chunks/dist-BA3u1z3W.js +0 -423
- package/dist/_chunks/dist-BA3u1z3W.js.map +0 -1
- package/dist/_chunks/mdx-file-C005ay-P.js.map +0 -1
- package/dist/_chunks/plugin-context-rCinWLiE.js.map +0 -1
- package/dist/_chunks/scanner-CAietmj4.js.map +0 -1
- package/dist/content/index.d.ts +0 -2
- package/dist/content/index.d.ts.map +0 -1
- package/dist/content/index.js +0 -0
- package/src/content/index.ts +0 -5
- package/src/shims/server-only-noop.js +0 -6
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* live-graph — classification from a running dev server's environment
|
|
3
|
+
* module graphs (the fast path).
|
|
4
|
+
*
|
|
5
|
+
* When a dev server runs, the env module graphs are already resident —
|
|
6
|
+
* classification is a lookup, not a crawl. This module adapts those
|
|
7
|
+
* graphs to the SAME classification pipeline the cold crawl uses
|
|
8
|
+
* (classify.ts + chains.ts + poison-scan.ts — design/47's "one
|
|
9
|
+
* classification module, thin frontends" requirement), so the
|
|
10
|
+
* dev-server endpoint and the CLI can never disagree about a file.
|
|
11
|
+
*
|
|
12
|
+
* Differences from the crawl, both inherent to the live source:
|
|
13
|
+
*
|
|
14
|
+
* - The browser (`client`) graph can be non-empty here (a real browser
|
|
15
|
+
* has requested modules), so `envs.client` is confirmable.
|
|
16
|
+
* - Rendering populates graphs lazily — only visited routes' code is
|
|
17
|
+
* present, and modules behind unexecuted dynamic imports carry
|
|
18
|
+
* `transformResult == null` (the §8 frontier). Those are reported as
|
|
19
|
+
* `subtreeUnknown` rather than transformed on demand: a hint must
|
|
20
|
+
* never mutate the dev server's graphs as a side effect of asking.
|
|
21
|
+
*
|
|
22
|
+
* Design docs: 47-module-environment-tooling.md §8, §"Dev-server
|
|
23
|
+
* endpoint".
|
|
24
|
+
*/
|
|
25
|
+
import { type Directive } from './classify.ts';
|
|
26
|
+
import type { GraphModuleReport } from './crawl.ts';
|
|
27
|
+
import { type ChainGraph } from './chains.ts';
|
|
28
|
+
/**
|
|
29
|
+
* Duck-typed node view for liveness checks — the `transformResult`
|
|
30
|
+
* member ChainModuleNode deliberately omits (§8 detection is a
|
|
31
|
+
* classification concern, not a chain concern).
|
|
32
|
+
*/
|
|
33
|
+
interface LiveModuleNode {
|
|
34
|
+
transformResult: unknown;
|
|
35
|
+
}
|
|
36
|
+
import type { ChainModuleNode } from './chains.ts';
|
|
37
|
+
/** Duck-typed module graph — structural supertype of Vite's. */
|
|
38
|
+
export interface LiveGraph extends ChainGraph {
|
|
39
|
+
getModulesByFile(file: string): Set<ChainModuleNode & LiveModuleNode> | undefined;
|
|
40
|
+
}
|
|
41
|
+
export interface LiveGraphContext {
|
|
42
|
+
rsc: LiveGraph;
|
|
43
|
+
ssr: LiveGraph;
|
|
44
|
+
client: LiveGraph;
|
|
45
|
+
/** Realpath'd project root. */
|
|
46
|
+
root: string;
|
|
47
|
+
appDir: string;
|
|
48
|
+
pageExtensions?: readonly string[];
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Per-module answer — the crawl's shape, aliased rather than restated
|
|
52
|
+
* so a field added to one frontend cannot silently miss the other.
|
|
53
|
+
*/
|
|
54
|
+
export type LiveModuleReport = GraphModuleReport;
|
|
55
|
+
/**
|
|
56
|
+
* Classify one file from the live graphs. `file` must be an absolute
|
|
57
|
+
* realpath (graph nodes carry realpaths); it is slash-normalized here
|
|
58
|
+
* to match Vite's node keying.
|
|
59
|
+
*/
|
|
60
|
+
export declare function classifyLiveFile(rawFile: string, ctx: LiveGraphContext, getDirective?: (file: string) => Directive, errors?: LiveGraphError[]): Promise<LiveModuleReport>;
|
|
61
|
+
/** Live-source error entry — the crawl's error vocabulary. */
|
|
62
|
+
export interface LiveGraphError {
|
|
63
|
+
environment: 'scan';
|
|
64
|
+
id: string;
|
|
65
|
+
message: string;
|
|
66
|
+
}
|
|
67
|
+
export interface LiveProjectReport {
|
|
68
|
+
root: string;
|
|
69
|
+
modules: LiveModuleReport[];
|
|
70
|
+
errors: LiveGraphError[];
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Classify every project source file from the live graphs. Files on
|
|
74
|
+
* disk that no graph reached get the §2 provisional/pending
|
|
75
|
+
* classification — on a lazily-warmed dev server that includes routes
|
|
76
|
+
* nobody has visited yet, which is honest: the graphs genuinely have
|
|
77
|
+
* not confirmed them.
|
|
78
|
+
*/
|
|
79
|
+
export declare function classifyLiveProject(ctx: LiveGraphContext): Promise<LiveProjectReport>;
|
|
80
|
+
export {};
|
|
81
|
+
//# sourceMappingURL=live-graph.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"live-graph.d.ts","sourceRoot":"","sources":["../../src/analyze/live-graph.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAKH,OAAO,EAIL,KAAK,SAAS,EACf,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AACpD,OAAO,EAAsB,KAAK,UAAU,EAAoB,MAAM,aAAa,CAAC;AASpF;;;;GAIG;AACH,UAAU,cAAc;IACtB,eAAe,EAAE,OAAO,CAAC;CAC1B;AAED,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEnD,gEAAgE;AAChE,MAAM,WAAW,SAAU,SAAQ,UAAU;IAC3C,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG,CAAC,eAAe,GAAG,cAAc,CAAC,GAAG,SAAS,CAAC;CACnF;AAED,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,SAAS,CAAC;IACf,GAAG,EAAE,SAAS,CAAC;IACf,MAAM,EAAE,SAAS,CAAC;IAClB,+BAA+B;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACpC;AAED;;;GAGG;AACH,MAAM,MAAM,gBAAgB,GAAG,iBAAiB,CAAC;AA8BjD;;;;GAIG;AACH,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,gBAAgB,EAIrB,YAAY,GAAE,CAAC,IAAI,EAAE,MAAM,KAAK,SAAiC,EAIjE,MAAM,CAAC,EAAE,cAAc,EAAE,GACxB,OAAO,CAAC,gBAAgB,CAAC,CAiD3B;AAuBD,8DAA8D;AAC9D,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,gBAAgB,EAAE,CAAC;IAC5B,MAAM,EAAE,cAAc,EAAE,CAAC;CAC1B;AAED;;;;;;GAMG;AACH,wBAAsB,mBAAmB,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAmB3F"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* poison-rules — single source of truth for server-only / client-only
|
|
3
|
+
* module rules.
|
|
4
|
+
*
|
|
5
|
+
* Two tiers with different enforcement policies (design/47 §3):
|
|
6
|
+
*
|
|
7
|
+
* 1. **Explicit markers** (`server-only`, `client-only`) — evaluation-time
|
|
8
|
+
* poison pills. `plugins/shims.ts` resolves them to virtual modules
|
|
9
|
+
* whose body is a top-level `throw` in the wrong environment and a
|
|
10
|
+
* silent no-op in the right one. The error fires when the module is
|
|
11
|
+
* evaluated, not at resolve time.
|
|
12
|
+
*
|
|
13
|
+
* 2. **Inferred rules** (`node:*` imports, timber's ALS modules, browser
|
|
14
|
+
* globals) — report-only. They have legitimate false positives
|
|
15
|
+
* (`import.meta.env.SSR`-guarded `node:*` use, conditionally-imported
|
|
16
|
+
* packages), so erroring the build on them would refuse working apps.
|
|
17
|
+
* The `timber graph` reporter surfaces them as hints.
|
|
18
|
+
*
|
|
19
|
+
* Both shims.ts and the reporter consume this module so the two surfaces
|
|
20
|
+
* can never disagree. Promoting inferred rules to build errors is a
|
|
21
|
+
* policy flip on this list, never a new rule set.
|
|
22
|
+
*
|
|
23
|
+
* Design doc: 47-module-environment-tooling.md §3.
|
|
24
|
+
*/
|
|
25
|
+
/** Vite environment names the dev server / build run. */
|
|
26
|
+
export type EnvironmentName = 'rsc' | 'ssr' | 'client';
|
|
27
|
+
export interface ExplicitMarker {
|
|
28
|
+
/** The bare specifier user code imports (`server-only` / `client-only`). */
|
|
29
|
+
readonly specifier: string;
|
|
30
|
+
/** Virtual module ID the specifier resolves to in shims.ts. */
|
|
31
|
+
readonly virtualId: string;
|
|
32
|
+
/**
|
|
33
|
+
* True when evaluating the marker in `env` is a violation (the virtual
|
|
34
|
+
* module body must throw). `undefined` means "no environment context"
|
|
35
|
+
* (e.g. a non-environment-aware build) and is treated as a server
|
|
36
|
+
* environment — matching the historical shims.ts behavior.
|
|
37
|
+
*/
|
|
38
|
+
readonly violatesIn: (env: EnvironmentName | string | undefined) => boolean;
|
|
39
|
+
/** Exact runtime error message thrown in the wrong environment. */
|
|
40
|
+
readonly errorMessage: string;
|
|
41
|
+
readonly enforcement: 'poison-pill';
|
|
42
|
+
}
|
|
43
|
+
export declare const EXPLICIT_MARKERS: readonly ExplicitMarker[];
|
|
44
|
+
/**
|
|
45
|
+
* Look up an explicit marker by its import specifier. Throws on an
|
|
46
|
+
* unknown specifier — callers reference rules that must exist, and a
|
|
47
|
+
* silent undefined would just defer the failure.
|
|
48
|
+
*/
|
|
49
|
+
export declare function markerFor(specifier: string): ExplicitMarker;
|
|
50
|
+
/**
|
|
51
|
+
* Generate the virtual module body for an explicit marker in `env`:
|
|
52
|
+
* a top-level throw in the wrong environment, a no-op otherwise.
|
|
53
|
+
*/
|
|
54
|
+
export declare function poisonPillSource(marker: ExplicitMarker, env: EnvironmentName | string | undefined): string;
|
|
55
|
+
export interface InferredRule {
|
|
56
|
+
readonly id: string;
|
|
57
|
+
/** Which exclusivity the signal implies for the containing module. */
|
|
58
|
+
readonly implies: 'server-only' | 'client-only';
|
|
59
|
+
readonly enforcement: 'report-only';
|
|
60
|
+
/** Human-readable description for reporter output. */
|
|
61
|
+
readonly description: string;
|
|
62
|
+
/** Import-specifier signal — matches static import sources. */
|
|
63
|
+
readonly matchesImport?: (specifier: string) => boolean;
|
|
64
|
+
/**
|
|
65
|
+
* Identifier signal — global names whose use implies the exclusivity.
|
|
66
|
+
* Consumers must apply shadow-safe matching (an allowlisted-position
|
|
67
|
+
* AST check, not a text search).
|
|
68
|
+
*/
|
|
69
|
+
readonly identifiers?: readonly string[];
|
|
70
|
+
}
|
|
71
|
+
export declare const INFERRED_RULES: readonly InferredRule[];
|
|
72
|
+
//# sourceMappingURL=poison-rules.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"poison-rules.d.ts","sourceRoot":"","sources":["../../src/analyze/poison-rules.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAIH,yDAAyD;AACzD,MAAM,MAAM,eAAe,GAAG,KAAK,GAAG,KAAK,GAAG,QAAQ,CAAC;AAIvD,MAAM,WAAW,cAAc;IAC7B,4EAA4E;IAC5E,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,+DAA+D;IAC/D,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B;;;;;OAKG;IACH,QAAQ,CAAC,UAAU,EAAE,CAAC,GAAG,EAAE,eAAe,GAAG,MAAM,GAAG,SAAS,KAAK,OAAO,CAAC;IAC5E,mEAAmE;IACnE,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,WAAW,EAAE,aAAa,CAAC;CACrC;AAED,eAAO,MAAM,gBAAgB,EAAE,SAAS,cAAc,EAmBrD,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,cAAc,CAI3D;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,cAAc,EACtB,GAAG,EAAE,eAAe,GAAG,MAAM,GAAG,SAAS,GACxC,MAAM,CAKR;AAID,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,sEAAsE;IACtE,QAAQ,CAAC,OAAO,EAAE,aAAa,GAAG,aAAa,CAAC;IAChD,QAAQ,CAAC,WAAW,EAAE,aAAa,CAAC;IACpC,sDAAsD;IACtD,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,+DAA+D;IAC/D,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC;IACxD;;;;OAIG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC1C;AAwBD,eAAO,MAAM,cAAc,EAAE,SAAS,YAAY,EA4BjD,CAAC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* poison-scan — report-only poisoning detection for `timber graph`.
|
|
3
|
+
*
|
|
4
|
+
* Matches a module's static import specifiers against the shared rule
|
|
5
|
+
* lists in poison-rules.ts (the single source of truth — design/47 §3)
|
|
6
|
+
* and reports a poisoning only when the implied exclusivity CONFLICTS
|
|
7
|
+
* with where the module actually runs: a server-only signal in a
|
|
8
|
+
* client-reachable module, or a client-only signal in a server-reachable
|
|
9
|
+
* one. A `node:fs` import in a file only the RSC environment loads is
|
|
10
|
+
* working code, not a finding.
|
|
11
|
+
*
|
|
12
|
+
* Scope: import-specifier signals only (explicit markers + the inferred
|
|
13
|
+
* rules' `matchesImport`). The inferred browser-global identifier rules
|
|
14
|
+
* need shadow-safe allowlisted-position AST matching and are a separate
|
|
15
|
+
* ticket — reporting them from a text scan would flag legitimate code.
|
|
16
|
+
*
|
|
17
|
+
* Design docs: 47-module-environment-tooling.md §3.
|
|
18
|
+
*/
|
|
19
|
+
import { type ModuleKind } from './classify.ts';
|
|
20
|
+
/** One poisoning finding on a module, in the JSON-contract shape. */
|
|
21
|
+
export interface Poisoning {
|
|
22
|
+
/** Rule id — an inferred rule's id, or the explicit marker specifier. */
|
|
23
|
+
rule: string;
|
|
24
|
+
/** The import specifier that matched. */
|
|
25
|
+
specifier: string;
|
|
26
|
+
/** Which exclusivity the signal implies for the containing module. */
|
|
27
|
+
implies: 'server-only' | 'client-only';
|
|
28
|
+
/** Human-readable description for reporter output. */
|
|
29
|
+
description: string;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Collect every static import/export source and string-literal dynamic
|
|
33
|
+
* import from a module's original source. Sources that fail to parse
|
|
34
|
+
* (or are not JS/TS at all) return [] — no specifiers is a safe
|
|
35
|
+
* default for a report-only scan.
|
|
36
|
+
*/
|
|
37
|
+
export declare function collectImportSpecifiers(code: string, file: string): string[];
|
|
38
|
+
/** Exclusivity signals a module's import specifiers carry. */
|
|
39
|
+
export declare function importSignals(specifiers: string[]): Poisoning[];
|
|
40
|
+
/**
|
|
41
|
+
* Filter a module's signals down to actual conflicts with its
|
|
42
|
+
* classification. Environment reach follows the taxonomy: boundary /
|
|
43
|
+
* client-internal / shared modules run client-side; server / shared /
|
|
44
|
+
* server-action modules run server-side. Pending (provisional) modules
|
|
45
|
+
* run nowhere confirmed, so nothing conflicts yet.
|
|
46
|
+
*/
|
|
47
|
+
export declare function poisoningsFor(kind: ModuleKind, pending: boolean, signals: Poisoning[]): Poisoning[];
|
|
48
|
+
//# sourceMappingURL=poison-scan.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"poison-scan.d.ts","sourceRoot":"","sources":["../../src/analyze/poison-scan.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAIH,OAAO,EAAe,KAAK,UAAU,EAAE,MAAM,eAAe,CAAC;AAE7D,qEAAqE;AACrE,MAAM,WAAW,SAAS;IACxB,yEAAyE;IACzE,IAAI,EAAE,MAAM,CAAC;IACb,yCAAyC;IACzC,SAAS,EAAE,MAAM,CAAC;IAClB,sEAAsE;IACtE,OAAO,EAAE,aAAa,GAAG,aAAa,CAAC;IACvC,sDAAsD;IACtD,WAAW,EAAE,MAAM,CAAC;CACrB;AAiBD;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAsD5E;AAED,8DAA8D;AAC9D,wBAAgB,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,SAAS,EAAE,CAyB/D;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAC3B,IAAI,EAAE,UAAU,EAChB,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,SAAS,EAAE,GACnB,SAAS,EAAE,CAUb"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* scan — project source-file disk scan shared by the crawl and the
|
|
3
|
+
* graph cache.
|
|
4
|
+
*
|
|
5
|
+
* One walker, one rule set: the crawl uses it to find files no graph
|
|
6
|
+
* reached (the provisional/pending set) and to bound graph membership,
|
|
7
|
+
* and the mtime-keyed graph cache fingerprints exactly the same file
|
|
8
|
+
* set — the three can never disagree about what "the project" is (a
|
|
9
|
+
* file the crawl classifies but the fingerprint ignores would make the
|
|
10
|
+
* cache silently stale).
|
|
11
|
+
*
|
|
12
|
+
* Skip rules are deliberately shallow: timber's router excludes only
|
|
13
|
+
* `_`-prefixed directories, so `app/.well-known/page.tsx` and
|
|
14
|
+
* `app/dist/page.tsx` are REAL routes — a rule that skipped `dist` or
|
|
15
|
+
* dot-directories at any depth would hide legitimate route files from
|
|
16
|
+
* the scan while the module graph still reached them (codex review,
|
|
17
|
+
* PR #1056). Therefore:
|
|
18
|
+
*
|
|
19
|
+
* - `node_modules` is skipped at ANY depth (never project source, and
|
|
20
|
+
* graph membership excludes it identically)
|
|
21
|
+
* - dot-prefixed and build-output directories (`dist`, `coverage`, …)
|
|
22
|
+
* are skipped only as the FIRST path segment under the root — that
|
|
23
|
+
* is where `.git`, `.timber`, `.wrangler`, and real build outputs
|
|
24
|
+
* live; deeper occurrences are walked
|
|
25
|
+
*
|
|
26
|
+
* Deliberately vite-free: the cache-hit path of `timber graph` reads
|
|
27
|
+
* this module without booting (or even importing) Vite.
|
|
28
|
+
*
|
|
29
|
+
* Design docs: 47-module-environment-tooling.md §2, §Cold-path policy.
|
|
30
|
+
*/
|
|
31
|
+
/**
|
|
32
|
+
* Slash-normalize a Windows path — Vite's `normalizePath` for the
|
|
33
|
+
* vite-free callers (the graph cache-hit path must not import Vite).
|
|
34
|
+
* Same platform guard as Vite's: posix paths pass through untouched,
|
|
35
|
+
* so a filename containing a literal backslash is never corrupted.
|
|
36
|
+
*/
|
|
37
|
+
export declare const normalizeSlashes: (path: string) => string;
|
|
38
|
+
/** A scan failure the caller records instead of swallowing. */
|
|
39
|
+
export interface ScanFailure {
|
|
40
|
+
dir: string;
|
|
41
|
+
message: string;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Directories never scanned when they are the first path segment under
|
|
45
|
+
* the root. `node_modules` is additionally skipped at any depth.
|
|
46
|
+
*/
|
|
47
|
+
export declare const SCAN_IGNORED_DIRS: Set<string>;
|
|
48
|
+
/** Regex form of BUILTIN_EXTENSIONS for file-basename matching. */
|
|
49
|
+
export declare const SOURCE_EXTENSIONS: RegExp;
|
|
50
|
+
/**
|
|
51
|
+
* Build a regex that matches SOURCE_EXTENSIONS plus any extra
|
|
52
|
+
* extensions from the user's pageExtensions config. Returns the
|
|
53
|
+
* builtin regex unchanged when nothing new is added.
|
|
54
|
+
*/
|
|
55
|
+
export declare function buildSourceExtensions(pageExtensions?: readonly string[]): RegExp;
|
|
56
|
+
/**
|
|
57
|
+
* Whether an absolute, slash-normalized path is one the scanner WOULD
|
|
58
|
+
* admit — the same segment rules the walker applies, so a
|
|
59
|
+
* directly-addressed path (`package.json`, `<root>/dist/generated.js`,
|
|
60
|
+
* `types.d.ts`, a nested node_modules file) is answered exactly the
|
|
61
|
+
* way the scan-based sweep would answer it: by exclusion. Existence
|
|
62
|
+
* and is-a-file checks remain the caller's (this is pure path logic).
|
|
63
|
+
*/
|
|
64
|
+
export declare function isScannableSourceFile(file: string, root: string, extensions?: RegExp): boolean;
|
|
65
|
+
/**
|
|
66
|
+
* Recursively list project source files on disk.
|
|
67
|
+
*
|
|
68
|
+
* Unreadable directories are reported through `onFailure`, not thrown
|
|
69
|
+
* and not swallowed — this walker exists to keep files from silently
|
|
70
|
+
* vanishing, so a directory it cannot see must be visible too.
|
|
71
|
+
*/
|
|
72
|
+
export declare function scanProjectSourceFiles(dir: string, out: string[], onFailure: (failure: ScanFailure) => void, depth?: number, extensions?: RegExp): Promise<void>;
|
|
73
|
+
//# sourceMappingURL=scan.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scan.d.ts","sourceRoot":"","sources":["../../src/analyze/scan.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAKH;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MACmC,CAAC;AAErF,+DAA+D;AAC/D,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;GAGG;AACH,eAAO,MAAM,iBAAiB,aAAgE,CAAC;AAS/F,mEAAmE;AACnE,eAAO,MAAM,iBAAiB,QAAwD,CAAC;AAKvF;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,cAAc,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAMhF;AAkBD;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAQ9F;AAED;;;;;;GAMG;AACH,wBAAsB,sBAAsB,CAC1C,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,MAAM,EAAE,EACb,SAAS,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,IAAI,EACzC,KAAK,SAAI,EACT,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,IAAI,CAAC,CAoBf"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type { CacheOptions } from './index';
|
|
2
|
-
import type { PrebuiltComponentOptions } from '../server/prebuilt-runtime';
|
|
1
|
+
import type { CacheOptions } from './index.ts';
|
|
2
|
+
import type { PrebuiltComponentOptions } from '../server/prebuilt-runtime.ts';
|
|
3
3
|
/**
|
|
4
4
|
* Cache namespace — `cache.data`, `cache.component`, `cache.invalidate`.
|
|
5
5
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cache-api.d.ts","sourceRoot":"","sources":["../../src/cache/cache-api.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"cache-api.d.ts","sourceRoot":"","sources":["../../src/cache/cache-api.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AAS9E;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,KAAK;IAChB;;;;;;;OAOG;IAEH,IAAI,CAAC,EAAE,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,OAAO,CAAC,GAAG,CAAC,MAC1C,EAAE,QACA,YAAY,CAAC,EAAE,CAAC,aACX,MAAM,GAChB,EAAE;IAIL;;;;;;;OAOG;IACG,UAAU,OAAO;QAAE,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAiCrE;;;;;;;;OAQG;IAEH,SAAS,CAAC,CAAC,SAAS,CAAC,KAAK,EAAE,GAAG,KAAK,OAAO,eAC5B,CAAC,aACH,wBAAwB,GAClC,CAAC;CAYL,CAAC"}
|
package/dist/cache/index.d.ts
CHANGED
|
@@ -64,12 +64,12 @@ export declare class MemoryCacheHandler implements CacheHandler {
|
|
|
64
64
|
/** Evict the oldest entry (front of Map). */
|
|
65
65
|
private evictOldest;
|
|
66
66
|
}
|
|
67
|
-
export { RedisCacheHandler } from './redis-handler';
|
|
68
|
-
export type { RedisClient, RedisWriteOp } from './redis-handler';
|
|
69
|
-
export { cache } from './cache-api';
|
|
70
|
-
export { setCacheHandler, getCacheHandler } from './handler-store';
|
|
71
|
-
export { setDefaultSingleflightTimeout } from './timber-cache';
|
|
72
|
-
export { estimateByteSize } from './sizeof';
|
|
73
|
-
export { TagAwareCacheHandler } from './tag-aware-handler';
|
|
74
|
-
export type { CacheStore } from './store';
|
|
67
|
+
export { RedisCacheHandler } from './redis-handler.ts';
|
|
68
|
+
export type { RedisClient, RedisWriteOp } from './redis-handler.ts';
|
|
69
|
+
export { cache } from './cache-api.ts';
|
|
70
|
+
export { setCacheHandler, getCacheHandler } from './handler-store.ts';
|
|
71
|
+
export { setDefaultSingleflightTimeout } from './timber-cache.ts';
|
|
72
|
+
export { estimateByteSize } from './sizeof.ts';
|
|
73
|
+
export { TagAwareCacheHandler } from './tag-aware-handler.ts';
|
|
74
|
+
export type { CacheStore } from './store.ts';
|
|
75
75
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cache/index.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,YAAY;IAC3B,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,KAAK,EAAE,OAAO,CAAC;QAAC,KAAK,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI,CAAC,CAAC;IACrE,GAAG,CACD,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,OAAO,EACd,IAAI,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,EAAE,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,GACzD,OAAO,CAAC,IAAI,CAAC,CAAC;IACjB,UAAU,CAAC,IAAI,EAAE;QAAE,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACjE;AAGD,MAAM,WAAW,YAAY,CAAC,EAAE,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG;IAC9D,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,UAAU,CAAC,EAAE,CAAC,KAAK,MAAM,CAAC;IAC1C,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC,GAAG,IAAI,EAAE,UAAU,CAAC,EAAE,CAAC,KAAK,MAAM,EAAE,CAAC,CAAC;IAC1D;uFACmF;IACnF,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,yBAAyB;IACxC,2FAA2F;IAC3F,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,oHAAoH;IACpH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,kHAAkH;IAClH,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,qBAAa,kBAAmB,YAAW,YAAY;IACrD,OAAO,CAAC,KAAK,CAGT;IACJ,OAAO,CAAC,WAAW,CAA6B;IAChD,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,QAAQ,CAAqB;IACrC,OAAO,CAAC,aAAa,CAAqB;IAC1C,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAU;IAEtC,YAAY,IAAI,CAAC,EAAE,yBAAyB,EAM3C;IAEK,GAAG,CAAC,GAAG,EAAE,MAAM;;;cAUpB;IAEK,GAAG,CACP,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,OAAO,EACd,IAAI,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,EAAE,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,iBAkD3D;IAEK,UAAU,CAAC,IAAI,EAAE;QAAE,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,iBAkBpD;IAED,gDAAgD;IAChD,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,sIAAsI;IACtI,IAAI,KAAK,IAAI,MAAM,CAElB;IAED,6CAA6C;IAC7C,OAAO,CAAC,WAAW;CASpB;AAED,OAAO,EAAE,iBAAiB,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cache/index.ts"],"names":[],"mappings":"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"}
|
package/dist/cache/index.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import { _ as setDefaultSingleflightTimeout, f as MemoryCacheHandler, g as setCacheHandler, h as getCacheHandler, m as RedisCacheHandler, p as TagAwareCacheHandler, t as cache } from "../_chunks/cache-api-
|
|
1
|
+
import { _ as setDefaultSingleflightTimeout, f as MemoryCacheHandler, g as setCacheHandler, h as getCacheHandler, m as RedisCacheHandler, p as TagAwareCacheHandler, t as cache } from "../_chunks/cache-api-CQeYzA5g.js";
|
|
2
2
|
import { t as estimateByteSize } from "../_chunks/sizeof-lXffQ1Vr.js";
|
|
3
3
|
export { MemoryCacheHandler, RedisCacheHandler, TagAwareCacheHandler, cache, estimateByteSize, getCacheHandler, setCacheHandler, setDefaultSingleflightTimeout };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"redis-handler.d.ts","sourceRoot":"","sources":["../../src/cache/redis-handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"redis-handler.d.ts","sourceRoot":"","sources":["../../src/cache/redis-handler.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
* against the old version and serve stale data. This is acceptable for KV's
|
|
12
12
|
* consistency model (use short TTLs for security-critical invalidation).
|
|
13
13
|
*/
|
|
14
|
-
import type { CacheStore } from '../store';
|
|
14
|
+
import type { CacheStore } from '../store.ts';
|
|
15
15
|
export interface CloudflareKVNamespace {
|
|
16
16
|
get(key: string, options?: {
|
|
17
17
|
type?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cloudflare-kv.d.ts","sourceRoot":"","sources":["../../../src/cache/stores/cloudflare-kv.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"cloudflare-kv.d.ts","sourceRoot":"","sources":["../../../src/cache/stores/cloudflare-kv.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C,MAAM,WAAW,qBAAqB;IACpC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACtE,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,aAAa,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrF,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACpC;AAED,qBAAa,iBAAkB,YAAW,UAAU;IAClD,OAAO,CAAC,EAAE,CAAwD;IAClE,QAAQ,CAAC,WAAW,EAAG,UAAU,CAAU;IAE3C;;;;OAIG;IACH,YAAY,EAAE,EAAE,qBAAqB,GAAG,CAAC,MAAM,qBAAqB,CAAC,EAEpE;IAED,OAAO,CAAC,KAAK;IAIP,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAE7C;IAEK,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAGvE;IAEK,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAEpC;CACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cloudflare-kv.js","names":[],"sources":["../../../src/cache/stores/cloudflare-kv.ts"],"sourcesContent":["/**\n * Cloudflare Workers KV CacheStore — eventually-consistent, no set operations.\n *\n * The TagAwareCacheHandler uses the lazy (version-stamp) strategy for this\n * store: tag invalidation bumps a version counter (O(1) write), and reads\n * validate stored tag versions against current. No enumeration, no\n * read-modify-write races, correct under eventual consistency.\n *\n * Consistency: KV propagates writes in ~60s. A tag version bump propagates\n * like any other write — during the window, some reads may still validate\n * against the old version and serve stale data. This is acceptable for KV's\n * consistency model (use short TTLs for security-critical invalidation).\n */\n\nimport type { CacheStore } from '../store';\n\nexport interface CloudflareKVNamespace {\n get(key: string, options?: { type?: string }): Promise<string | null>;\n put(key: string, value: string, options?: { expirationTtl?: number }): Promise<void>;\n delete(key: string): Promise<void>;\n}\n\nexport class CloudflareKVStore implements CacheStore {\n private kv: CloudflareKVNamespace | (() => CloudflareKVNamespace);\n readonly consistency = 'eventual' as const;\n\n /**\n * @param kv - Either a KVNamespace instance or a factory function that\n * resolves it from the current request context (for Workers where bindings\n * are per-request).\n */\n constructor(kv: CloudflareKVNamespace | (() => CloudflareKVNamespace)) {\n this.kv = kv;\n }\n\n private getKV(): CloudflareKVNamespace {\n return typeof this.kv === 'function' ? this.kv() : this.kv;\n }\n\n async get(key: string): Promise<string | null> {\n return this.getKV().get(key);\n }\n\n async set(key: string, value: string, ttlSeconds: number): Promise<void> {\n // KV expirationTtl minimum is 60s\n await this.getKV().put(key, value, { expirationTtl: Math.max(ttlSeconds, 60) });\n }\n\n async del(key: string): Promise<void> {\n await this.getKV().delete(key);\n }\n}\n"],"mappings":";AAsBA,IAAa,oBAAb,MAAqD;CACnD;CACA,cAAuB;;;;;;CAOvB,YAAY,IAA2D;EACrE,KAAK,KAAK;CACZ;CAEA,QAAuC;EACrC,OAAO,OAAO,KAAK,OAAO,aAAa,KAAK,GAAG,IAAI,KAAK;CAC1D;CAEA,MAAM,IAAI,KAAqC;EAC7C,OAAO,KAAK,MAAM,CAAC,CAAC,IAAI,GAAG;CAC7B;CAEA,MAAM,IAAI,KAAa,OAAe,YAAmC;EAEvE,MAAM,KAAK,MAAM,CAAC,CAAC,IAAI,KAAK,OAAO,EAAE,eAAe,KAAK,IAAI,YAAY,EAAE,EAAE,CAAC;CAChF;CAEA,MAAM,IAAI,KAA4B;EACpC,MAAM,KAAK,MAAM,CAAC,CAAC,OAAO,GAAG;CAC/B;AACF"}
|
|
1
|
+
{"version":3,"file":"cloudflare-kv.js","names":[],"sources":["../../../src/cache/stores/cloudflare-kv.ts"],"sourcesContent":["/**\n * Cloudflare Workers KV CacheStore — eventually-consistent, no set operations.\n *\n * The TagAwareCacheHandler uses the lazy (version-stamp) strategy for this\n * store: tag invalidation bumps a version counter (O(1) write), and reads\n * validate stored tag versions against current. No enumeration, no\n * read-modify-write races, correct under eventual consistency.\n *\n * Consistency: KV propagates writes in ~60s. A tag version bump propagates\n * like any other write — during the window, some reads may still validate\n * against the old version and serve stale data. This is acceptable for KV's\n * consistency model (use short TTLs for security-critical invalidation).\n */\n\nimport type { CacheStore } from '../store.ts';\n\nexport interface CloudflareKVNamespace {\n get(key: string, options?: { type?: string }): Promise<string | null>;\n put(key: string, value: string, options?: { expirationTtl?: number }): Promise<void>;\n delete(key: string): Promise<void>;\n}\n\nexport class CloudflareKVStore implements CacheStore {\n private kv: CloudflareKVNamespace | (() => CloudflareKVNamespace);\n readonly consistency = 'eventual' as const;\n\n /**\n * @param kv - Either a KVNamespace instance or a factory function that\n * resolves it from the current request context (for Workers where bindings\n * are per-request).\n */\n constructor(kv: CloudflareKVNamespace | (() => CloudflareKVNamespace)) {\n this.kv = kv;\n }\n\n private getKV(): CloudflareKVNamespace {\n return typeof this.kv === 'function' ? this.kv() : this.kv;\n }\n\n async get(key: string): Promise<string | null> {\n return this.getKV().get(key);\n }\n\n async set(key: string, value: string, ttlSeconds: number): Promise<void> {\n // KV expirationTtl minimum is 60s\n await this.getKV().put(key, value, { expirationTtl: Math.max(ttlSeconds, 60) });\n }\n\n async del(key: string): Promise<void> {\n await this.getKV().delete(key);\n }\n}\n"],"mappings":";AAsBA,IAAa,oBAAb,MAAqD;CACnD;CACA,cAAuB;;;;;;CAOvB,YAAY,IAA2D;EACrE,KAAK,KAAK;CACZ;CAEA,QAAuC;EACrC,OAAO,OAAO,KAAK,OAAO,aAAa,KAAK,GAAG,IAAI,KAAK;CAC1D;CAEA,MAAM,IAAI,KAAqC;EAC7C,OAAO,KAAK,MAAM,CAAC,CAAC,IAAI,GAAG;CAC7B;CAEA,MAAM,IAAI,KAAa,OAAe,YAAmC;EAEvE,MAAM,KAAK,MAAM,CAAC,CAAC,IAAI,KAAK,OAAO,EAAE,eAAe,KAAK,IAAI,YAAY,EAAE,EAAE,CAAC;CAChF;CAEA,MAAM,IAAI,KAA4B;EACpC,MAAM,KAAK,MAAM,CAAC,CAAC,OAAO,GAAG;CAC/B;AACF"}
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
* member before deleting and prunes stale entries. The cost is proportional to
|
|
12
12
|
* set size on invalidation, not to memory — stale memberships are just strings.
|
|
13
13
|
*/
|
|
14
|
-
import type { CacheStore } from '../store';
|
|
14
|
+
import type { CacheStore } from '../store.ts';
|
|
15
15
|
export interface MemoryStoreOptions {
|
|
16
16
|
maxEntries?: number;
|
|
17
17
|
maxBytes?: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../../src/cache/stores/memory.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../../src/cache/stores/memory.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAG9C,MAAM,WAAW,kBAAkB;IACjC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,qBAAa,gBAAiB,YAAW,UAAU;IACjD,OAAO,CAAC,KAAK,CAA6E;IAC1F,OAAO,CAAC,IAAI,CAAkC;IAC9C,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,QAAQ,CAAqB;IACrC,OAAO,CAAC,aAAa,CAAqB;IAC1C,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAU;IACrC,QAAQ,CAAC,WAAW,EAAG,OAAO,CAAU;IAExC,YAAY,IAAI,CAAC,EAAE,kBAAkB,EAKpC;IAEK,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAW7C;IAEK,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAkBvE;IAEK,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAEpC;IAIK,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAO7E;IAEK,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAKxD;IAEK,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAG7C;IAEK,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAErC;IAED,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,IAAI,KAAK,IAAI,MAAM,CAElB;IAED,OAAO,CAAC,WAAW;IAQnB,OAAO,CAAC,WAAW;CAIpB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memory.js","names":[],"sources":["../../../src/cache/stores/memory.ts"],"sourcesContent":["/**\n * In-memory CacheStore — local consistency only.\n *\n * LRU eviction by entry count and optional byte budget. The TagAwareCacheHandler\n * uses the Set-based strategy here (we implement sadd/smembers/srem/sdel with\n * plain Maps — atomic within a single process).\n *\n * Tag sets may accumulate stale memberships when data entries expire via TTL or\n * LRU eviction (the store layer cannot know which sets reference a given key).\n * This is harmless: TagAwareCacheHandler's eager invalidation path reads each\n * member before deleting and prunes stale entries. The cost is proportional to\n * set size on invalidation, not to memory — stale memberships are just strings.\n */\n\nimport type { CacheStore } from '../store';\nimport { estimateByteSize } from '../sizeof.
|
|
1
|
+
{"version":3,"file":"memory.js","names":[],"sources":["../../../src/cache/stores/memory.ts"],"sourcesContent":["/**\n * In-memory CacheStore — local consistency only.\n *\n * LRU eviction by entry count and optional byte budget. The TagAwareCacheHandler\n * uses the Set-based strategy here (we implement sadd/smembers/srem/sdel with\n * plain Maps — atomic within a single process).\n *\n * Tag sets may accumulate stale memberships when data entries expire via TTL or\n * LRU eviction (the store layer cannot know which sets reference a given key).\n * This is harmless: TagAwareCacheHandler's eager invalidation path reads each\n * member before deleting and prunes stale entries. The cost is proportional to\n * set size on invalidation, not to memory — stale memberships are just strings.\n */\n\nimport type { CacheStore } from '../store.ts';\nimport { estimateByteSize } from '../sizeof.ts';\n\nexport interface MemoryStoreOptions {\n maxEntries?: number;\n maxBytes?: number;\n maxEntryBytes?: number;\n}\n\nexport class MemoryCacheStore implements CacheStore {\n private store = new Map<string, { value: string; expiresAt: number; byteSize: number }>();\n private sets = new Map<string, Set<string>>();\n private maxEntries: number;\n private maxBytes: number | undefined;\n private maxEntryBytes: number | undefined;\n private currentBytes = 0;\n private readonly trackBytes: boolean;\n readonly consistency = 'local' as const;\n\n constructor(opts?: MemoryStoreOptions) {\n this.maxEntries = Math.max(opts?.maxEntries ?? 1000, 1);\n this.maxBytes = opts?.maxBytes;\n this.maxEntryBytes = opts?.maxEntryBytes;\n this.trackBytes = this.maxBytes !== undefined || this.maxEntryBytes !== undefined;\n }\n\n async get(key: string): Promise<string | null> {\n const entry = this.store.get(key);\n if (!entry) return null;\n if (Date.now() > entry.expiresAt) {\n this.removeEntry(key);\n return null;\n }\n // LRU: move to end\n this.store.delete(key);\n this.store.set(key, entry);\n return entry.value;\n }\n\n async set(key: string, value: string, ttlSeconds: number): Promise<void> {\n const byteSize = this.trackBytes ? estimateByteSize(value) : 0;\n\n if (this.maxEntryBytes !== undefined && byteSize > this.maxEntryBytes) return;\n\n if (this.store.has(key)) this.removeEntry(key);\n\n while (this.store.size >= this.maxEntries) this.evictOldest();\n\n if (this.maxBytes !== undefined) {\n while (this.currentBytes + byteSize > this.maxBytes && this.store.size > 0) {\n this.evictOldest();\n }\n if (this.currentBytes + byteSize > this.maxBytes) return;\n }\n\n this.store.set(key, { value, expiresAt: Date.now() + ttlSeconds * 1000, byteSize });\n this.currentBytes += byteSize;\n }\n\n async del(key: string): Promise<void> {\n this.removeEntry(key);\n }\n\n // Set operations — trivial in-process implementations.\n\n async sadd(key: string, members: string[], _ttlSeconds: number): Promise<void> {\n let set = this.sets.get(key);\n if (!set) {\n set = new Set();\n this.sets.set(key, set);\n }\n for (const m of members) set.add(m);\n }\n\n async srem(key: string, members: string[]): Promise<void> {\n const set = this.sets.get(key);\n if (!set) return;\n for (const m of members) set.delete(m);\n if (set.size === 0) this.sets.delete(key);\n }\n\n async smembers(key: string): Promise<string[]> {\n const set = this.sets.get(key);\n return set ? [...set] : [];\n }\n\n async sdel(key: string): Promise<void> {\n this.sets.delete(key);\n }\n\n get size(): number {\n return this.store.size;\n }\n\n get bytes(): number {\n return this.currentBytes;\n }\n\n private removeEntry(key: string): void {\n const entry = this.store.get(key);\n if (entry) {\n this.currentBytes -= entry.byteSize;\n this.store.delete(key);\n }\n }\n\n private evictOldest(): void {\n const oldest = this.store.keys().next().value;\n if (oldest !== undefined) this.removeEntry(oldest);\n }\n}\n"],"mappings":";;AAuBA,IAAa,mBAAb,MAAoD;CAClD,wBAAgB,IAAI,IAAoE;CACxF,uBAAe,IAAI,IAAyB;CAC5C;CACA;CACA;CACA,eAAuB;CACvB;CACA,cAAuB;CAEvB,YAAY,MAA2B;EACrC,KAAK,aAAa,KAAK,IAAI,MAAM,cAAc,KAAM,CAAC;EACtD,KAAK,WAAW,MAAM;EACtB,KAAK,gBAAgB,MAAM;EAC3B,KAAK,aAAa,KAAK,aAAa,KAAA,KAAa,KAAK,kBAAkB,KAAA;CAC1E;CAEA,MAAM,IAAI,KAAqC;EAC7C,MAAM,QAAQ,KAAK,MAAM,IAAI,GAAG;EAChC,IAAI,CAAC,OAAO,OAAO;EACnB,IAAI,KAAK,IAAI,IAAI,MAAM,WAAW;GAChC,KAAK,YAAY,GAAG;GACpB,OAAO;EACT;EAEA,KAAK,MAAM,OAAO,GAAG;EACrB,KAAK,MAAM,IAAI,KAAK,KAAK;EACzB,OAAO,MAAM;CACf;CAEA,MAAM,IAAI,KAAa,OAAe,YAAmC;EACvE,MAAM,WAAW,KAAK,aAAa,iBAAiB,KAAK,IAAI;EAE7D,IAAI,KAAK,kBAAkB,KAAA,KAAa,WAAW,KAAK,eAAe;EAEvE,IAAI,KAAK,MAAM,IAAI,GAAG,GAAG,KAAK,YAAY,GAAG;EAE7C,OAAO,KAAK,MAAM,QAAQ,KAAK,YAAY,KAAK,YAAY;EAE5D,IAAI,KAAK,aAAa,KAAA,GAAW;GAC/B,OAAO,KAAK,eAAe,WAAW,KAAK,YAAY,KAAK,MAAM,OAAO,GACvE,KAAK,YAAY;GAEnB,IAAI,KAAK,eAAe,WAAW,KAAK,UAAU;EACpD;EAEA,KAAK,MAAM,IAAI,KAAK;GAAE;GAAO,WAAW,KAAK,IAAI,IAAI,aAAa;GAAM;EAAS,CAAC;EAClF,KAAK,gBAAgB;CACvB;CAEA,MAAM,IAAI,KAA4B;EACpC,KAAK,YAAY,GAAG;CACtB;CAIA,MAAM,KAAK,KAAa,SAAmB,aAAoC;EAC7E,IAAI,MAAM,KAAK,KAAK,IAAI,GAAG;EAC3B,IAAI,CAAC,KAAK;GACR,sBAAM,IAAI,IAAI;GACd,KAAK,KAAK,IAAI,KAAK,GAAG;EACxB;EACA,KAAK,MAAM,KAAK,SAAS,IAAI,IAAI,CAAC;CACpC;CAEA,MAAM,KAAK,KAAa,SAAkC;EACxD,MAAM,MAAM,KAAK,KAAK,IAAI,GAAG;EAC7B,IAAI,CAAC,KAAK;EACV,KAAK,MAAM,KAAK,SAAS,IAAI,OAAO,CAAC;EACrC,IAAI,IAAI,SAAS,GAAG,KAAK,KAAK,OAAO,GAAG;CAC1C;CAEA,MAAM,SAAS,KAAgC;EAC7C,MAAM,MAAM,KAAK,KAAK,IAAI,GAAG;EAC7B,OAAO,MAAM,CAAC,GAAG,GAAG,IAAI,CAAC;CAC3B;CAEA,MAAM,KAAK,KAA4B;EACrC,KAAK,KAAK,OAAO,GAAG;CACtB;CAEA,IAAI,OAAe;EACjB,OAAO,KAAK,MAAM;CACpB;CAEA,IAAI,QAAgB;EAClB,OAAO,KAAK;CACd;CAEA,YAAoB,KAAmB;EACrC,MAAM,QAAQ,KAAK,MAAM,IAAI,GAAG;EAChC,IAAI,OAAO;GACT,KAAK,gBAAgB,MAAM;GAC3B,KAAK,MAAM,OAAO,GAAG;EACvB;CACF;CAEA,cAA4B;EAC1B,MAAM,SAAS,KAAK,MAAM,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC;EACxC,IAAI,WAAW,KAAA,GAAW,KAAK,YAAY,MAAM;CACnD;AACF"}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* The TagAwareCacheHandler will use the Set-based strategy automatically
|
|
5
5
|
* because this store provides sadd/smembers/srem/sdel.
|
|
6
6
|
*/
|
|
7
|
-
import type { CacheStore } from '../store';
|
|
7
|
+
import type { CacheStore } from '../store.ts';
|
|
8
8
|
/**
|
|
9
9
|
* Minimal Redis client contract. Same philosophy as the old RedisClient
|
|
10
10
|
* interface — deliberately NOT the native shape of any library. TTL is a
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"redis.d.ts","sourceRoot":"","sources":["../../../src/cache/stores/redis.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"redis.d.ts","sourceRoot":"","sources":["../../../src/cache/stores/redis.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,MAAM,WAAW,gBAAgB;IAC/B,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACzC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACtE,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACnC,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1D,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1D,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACzC,6FAA6F;IAC7F,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACzD,sFAAsF;IACtF,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC1D;AAED,qBAAa,eAAgB,YAAW,UAAU;IAChD,OAAO,CAAC,MAAM,CAAmB;IACjC,QAAQ,CAAC,WAAW,EAAG,QAAQ,CAAU;IAEzC,YAAY,MAAM,EAAE,gBAAgB,EAEnC;IAEK,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAE7C;IAEK,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAEvE;IAEK,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAEpC;IAEK,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAI5E;IAEK,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAExD;IAEK,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAE7C;IAEK,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAErC;CACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"redis.js","names":[],"sources":["../../../src/cache/stores/redis.ts"],"sourcesContent":["/**\n * Redis CacheStore — strongly-consistent, supports native Set operations.\n *\n * The TagAwareCacheHandler will use the Set-based strategy automatically\n * because this store provides sadd/smembers/srem/sdel.\n */\n\nimport type { CacheStore } from '../store';\n\n/**\n * Minimal Redis client contract. Same philosophy as the old RedisClient\n * interface — deliberately NOT the native shape of any library. TTL is a\n * required positional argument so no adapter can forget it.\n *\n * @example ioredis\n * ```ts\n * import Redis from 'ioredis';\n * const redis = new Redis(process.env.REDIS_URL);\n * const client: RedisStoreClient = {\n * get: (k) => redis.get(k),\n * set: (k, v, ttl) => redis.set(k, v, 'EX', ttl),\n * del: (k) => redis.del(k).then(() => {}),\n * sadd: (k, ...m) => redis.sadd(k, ...m).then(() => {}),\n * srem: (k, ...m) => redis.srem(k, ...m).then(() => {}),\n * smembers: (k) => redis.smembers(k),\n * expireNX: (k, s) => redis.expire(k, s, 'NX').then(() => {}),\n * expireGT: (k, s) => redis.expire(k, s, 'GT').then(() => {}),\n * };\n * ```\n *\n * @example @upstash/redis\n * ```ts\n * import { Redis } from '@upstash/redis';\n * const redis = new Redis({ url, token, automaticDeserialization: false });\n * const client: RedisStoreClient = {\n * get: (k) => redis.get(k),\n * set: (k, v, ttl) => redis.set(k, v, { ex: ttl }).then(() => {}),\n * del: (k) => redis.del(k).then(() => {}),\n * sadd: (k, ...m) => redis.sadd(k, ...m).then(() => {}),\n * srem: (k, ...m) => redis.srem(k, ...m).then(() => {}),\n * smembers: (k) => redis.smembers(k),\n * expireNX: (k, s) => redis.expire(k, s, 'NX').then(() => {}),\n * expireGT: (k, s) => redis.expire(k, s, 'GT').then(() => {}),\n * };\n * ```\n */\nexport interface RedisStoreClient {\n get(key: string): Promise<string | null>;\n set(key: string, value: string, ttlSeconds: number): Promise<unknown>;\n del(key: string): Promise<unknown>;\n sadd(key: string, ...members: string[]): Promise<unknown>;\n srem(key: string, ...members: string[]): Promise<unknown>;\n smembers(key: string): Promise<string[]>;\n /** `EXPIRE key seconds NX` — set TTL only if the key has no existing expiry (Redis 7.0+). */\n expireNX(key: string, seconds: number): Promise<unknown>;\n /** `EXPIRE key seconds GT` — extend TTL only if new value is greater (Redis 7.0+). */\n expireGT(key: string, seconds: number): Promise<unknown>;\n}\n\nexport class RedisCacheStore implements CacheStore {\n private client: RedisStoreClient;\n readonly consistency = 'strong' as const;\n\n constructor(client: RedisStoreClient) {\n this.client = client;\n }\n\n async get(key: string): Promise<string | null> {\n return this.client.get(key);\n }\n\n async set(key: string, value: string, ttlSeconds: number): Promise<void> {\n await this.client.set(key, value, ttlSeconds);\n }\n\n async del(key: string): Promise<void> {\n await this.client.del(key);\n }\n\n async sadd(key: string, members: string[], ttlSeconds: number): Promise<void> {\n await this.client.sadd(key, ...members);\n await this.client.expireNX(key, ttlSeconds);\n await this.client.expireGT(key, ttlSeconds);\n }\n\n async srem(key: string, members: string[]): Promise<void> {\n await this.client.srem(key, ...members);\n }\n\n async smembers(key: string): Promise<string[]> {\n return this.client.smembers(key);\n }\n\n async sdel(key: string): Promise<void> {\n await this.client.del(key);\n }\n}\n"],"mappings":";AA2DA,IAAa,kBAAb,MAAmD;CACjD;CACA,cAAuB;CAEvB,YAAY,QAA0B;EACpC,KAAK,SAAS;CAChB;CAEA,MAAM,IAAI,KAAqC;EAC7C,OAAO,KAAK,OAAO,IAAI,GAAG;CAC5B;CAEA,MAAM,IAAI,KAAa,OAAe,YAAmC;EACvE,MAAM,KAAK,OAAO,IAAI,KAAK,OAAO,UAAU;CAC9C;CAEA,MAAM,IAAI,KAA4B;EACpC,MAAM,KAAK,OAAO,IAAI,GAAG;CAC3B;CAEA,MAAM,KAAK,KAAa,SAAmB,YAAmC;EAC5E,MAAM,KAAK,OAAO,KAAK,KAAK,GAAG,OAAO;EACtC,MAAM,KAAK,OAAO,SAAS,KAAK,UAAU;EAC1C,MAAM,KAAK,OAAO,SAAS,KAAK,UAAU;CAC5C;CAEA,MAAM,KAAK,KAAa,SAAkC;EACxD,MAAM,KAAK,OAAO,KAAK,KAAK,GAAG,OAAO;CACxC;CAEA,MAAM,SAAS,KAAgC;EAC7C,OAAO,KAAK,OAAO,SAAS,GAAG;CACjC;CAEA,MAAM,KAAK,KAA4B;EACrC,MAAM,KAAK,OAAO,IAAI,GAAG;CAC3B;AACF"}
|
|
1
|
+
{"version":3,"file":"redis.js","names":[],"sources":["../../../src/cache/stores/redis.ts"],"sourcesContent":["/**\n * Redis CacheStore — strongly-consistent, supports native Set operations.\n *\n * The TagAwareCacheHandler will use the Set-based strategy automatically\n * because this store provides sadd/smembers/srem/sdel.\n */\n\nimport type { CacheStore } from '../store.ts';\n\n/**\n * Minimal Redis client contract. Same philosophy as the old RedisClient\n * interface — deliberately NOT the native shape of any library. TTL is a\n * required positional argument so no adapter can forget it.\n *\n * @example ioredis\n * ```ts\n * import Redis from 'ioredis';\n * const redis = new Redis(process.env.REDIS_URL);\n * const client: RedisStoreClient = {\n * get: (k) => redis.get(k),\n * set: (k, v, ttl) => redis.set(k, v, 'EX', ttl),\n * del: (k) => redis.del(k).then(() => {}),\n * sadd: (k, ...m) => redis.sadd(k, ...m).then(() => {}),\n * srem: (k, ...m) => redis.srem(k, ...m).then(() => {}),\n * smembers: (k) => redis.smembers(k),\n * expireNX: (k, s) => redis.expire(k, s, 'NX').then(() => {}),\n * expireGT: (k, s) => redis.expire(k, s, 'GT').then(() => {}),\n * };\n * ```\n *\n * @example @upstash/redis\n * ```ts\n * import { Redis } from '@upstash/redis';\n * const redis = new Redis({ url, token, automaticDeserialization: false });\n * const client: RedisStoreClient = {\n * get: (k) => redis.get(k),\n * set: (k, v, ttl) => redis.set(k, v, { ex: ttl }).then(() => {}),\n * del: (k) => redis.del(k).then(() => {}),\n * sadd: (k, ...m) => redis.sadd(k, ...m).then(() => {}),\n * srem: (k, ...m) => redis.srem(k, ...m).then(() => {}),\n * smembers: (k) => redis.smembers(k),\n * expireNX: (k, s) => redis.expire(k, s, 'NX').then(() => {}),\n * expireGT: (k, s) => redis.expire(k, s, 'GT').then(() => {}),\n * };\n * ```\n */\nexport interface RedisStoreClient {\n get(key: string): Promise<string | null>;\n set(key: string, value: string, ttlSeconds: number): Promise<unknown>;\n del(key: string): Promise<unknown>;\n sadd(key: string, ...members: string[]): Promise<unknown>;\n srem(key: string, ...members: string[]): Promise<unknown>;\n smembers(key: string): Promise<string[]>;\n /** `EXPIRE key seconds NX` — set TTL only if the key has no existing expiry (Redis 7.0+). */\n expireNX(key: string, seconds: number): Promise<unknown>;\n /** `EXPIRE key seconds GT` — extend TTL only if new value is greater (Redis 7.0+). */\n expireGT(key: string, seconds: number): Promise<unknown>;\n}\n\nexport class RedisCacheStore implements CacheStore {\n private client: RedisStoreClient;\n readonly consistency = 'strong' as const;\n\n constructor(client: RedisStoreClient) {\n this.client = client;\n }\n\n async get(key: string): Promise<string | null> {\n return this.client.get(key);\n }\n\n async set(key: string, value: string, ttlSeconds: number): Promise<void> {\n await this.client.set(key, value, ttlSeconds);\n }\n\n async del(key: string): Promise<void> {\n await this.client.del(key);\n }\n\n async sadd(key: string, members: string[], ttlSeconds: number): Promise<void> {\n await this.client.sadd(key, ...members);\n await this.client.expireNX(key, ttlSeconds);\n await this.client.expireGT(key, ttlSeconds);\n }\n\n async srem(key: string, members: string[]): Promise<void> {\n await this.client.srem(key, ...members);\n }\n\n async smembers(key: string): Promise<string[]> {\n return this.client.smembers(key);\n }\n\n async sdel(key: string): Promise<void> {\n await this.client.del(key);\n }\n}\n"],"mappings":";AA2DA,IAAa,kBAAb,MAAmD;CACjD;CACA,cAAuB;CAEvB,YAAY,QAA0B;EACpC,KAAK,SAAS;CAChB;CAEA,MAAM,IAAI,KAAqC;EAC7C,OAAO,KAAK,OAAO,IAAI,GAAG;CAC5B;CAEA,MAAM,IAAI,KAAa,OAAe,YAAmC;EACvE,MAAM,KAAK,OAAO,IAAI,KAAK,OAAO,UAAU;CAC9C;CAEA,MAAM,IAAI,KAA4B;EACpC,MAAM,KAAK,OAAO,IAAI,GAAG;CAC3B;CAEA,MAAM,KAAK,KAAa,SAAmB,YAAmC;EAC5E,MAAM,KAAK,OAAO,KAAK,KAAK,GAAG,OAAO;EACtC,MAAM,KAAK,OAAO,SAAS,KAAK,UAAU;EAC1C,MAAM,KAAK,OAAO,SAAS,KAAK,UAAU;CAC5C;CAEA,MAAM,KAAK,KAAa,SAAkC;EACxD,MAAM,KAAK,OAAO,KAAK,KAAK,GAAG,OAAO;CACxC;CAEA,MAAM,SAAS,KAAgC;EAC7C,OAAO,KAAK,OAAO,SAAS,GAAG;CACjC;CAEA,MAAM,KAAK,KAA4B;EACrC,MAAM,KAAK,OAAO,IAAI,GAAG;CAC3B;AACF"}
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
* Vercel handles tag purging across CDN, Runtime Cache, and Data Cache layers
|
|
9
9
|
* simultaneously. Available on all plans.
|
|
10
10
|
*/
|
|
11
|
-
import type { CacheStore } from '../store';
|
|
11
|
+
import type { CacheStore } from '../store.ts';
|
|
12
12
|
/**
|
|
13
13
|
* Vercel Runtime Cache contract — the subset we depend on.
|
|
14
14
|
* Resolved from `@vercel/functions` at runtime.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vercel.d.ts","sourceRoot":"","sources":["../../../src/cache/stores/vercel.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"vercel.d.ts","sourceRoot":"","sources":["../../../src/cache/stores/vercel.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C;;;GAGG;AACH,MAAM,WAAW,WAAW;IAC1B,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IAC9C,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1F,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACvC;AAED,qBAAa,gBAAiB,YAAW,UAAU;IACjD,OAAO,CAAC,KAAK,CAAoC;IACjD,QAAQ,CAAC,WAAW,EAAG,QAAQ,CAAU;IAEzC,YAAY,KAAK,EAAE,WAAW,GAAG,CAAC,MAAM,WAAW,CAAC,EAEnD;IAED,OAAO,CAAC,QAAQ;IAIV,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAG7C;IAEK,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAEvE;IAEK,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAEpC;IAIK,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAE/F;IAEK,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE9C;CACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vercel.js","names":[],"sources":["../../../src/cache/stores/vercel.ts"],"sourcesContent":["/**\n * Vercel Runtime Cache CacheStore — native tag support.\n *\n * Delegates tag operations to Vercel's infrastructure via their Runtime Cache\n * API (getCache/expireTag). The TagAwareCacheHandler detects setWithTags +\n * invalidateTag and delegates entirely — no inverted index, no version stamps.\n *\n * Vercel handles tag purging across CDN, Runtime Cache, and Data Cache layers\n * simultaneously. Available on all plans.\n */\n\nimport type { CacheStore } from '../store';\n\n/**\n * Vercel Runtime Cache contract — the subset we depend on.\n * Resolved from `@vercel/functions` at runtime.\n */\nexport interface VercelCache {\n get(key: string): Promise<string | undefined>;\n set(key: string, value: string, options: { ttl: number; tags?: string[] }): Promise<void>;\n delete(key: string): Promise<void>;\n expireTag(tag: string): Promise<void>;\n}\n\nexport class VercelCacheStore implements CacheStore {\n private cache: VercelCache | (() => VercelCache);\n readonly consistency = 'strong' as const;\n\n constructor(cache: VercelCache | (() => VercelCache)) {\n this.cache = cache;\n }\n\n private getCache(): VercelCache {\n return typeof this.cache === 'function' ? this.cache() : this.cache;\n }\n\n async get(key: string): Promise<string | null> {\n const result = await this.getCache().get(key);\n return result ?? null;\n }\n\n async set(key: string, value: string, ttlSeconds: number): Promise<void> {\n await this.getCache().set(key, value, { ttl: ttlSeconds });\n }\n\n async del(key: string): Promise<void> {\n await this.getCache().delete(key);\n }\n\n // --- Native tag support ---\n\n async setWithTags(key: string, value: string, ttlSeconds: number, tags: string[]): Promise<void> {\n await this.getCache().set(key, value, { ttl: ttlSeconds, tags });\n }\n\n async invalidateTag(tag: string): Promise<void> {\n await this.getCache().expireTag(tag);\n }\n}\n"],"mappings":";AAwBA,IAAa,mBAAb,MAAoD;CAClD;CACA,cAAuB;CAEvB,YAAY,OAA0C;EACpD,KAAK,QAAQ;CACf;CAEA,WAAgC;EAC9B,OAAO,OAAO,KAAK,UAAU,aAAa,KAAK,MAAM,IAAI,KAAK;CAChE;CAEA,MAAM,IAAI,KAAqC;EAE7C,OAAO,MADc,KAAK,SAAS,CAAC,CAAC,IAAI,GAAG,KAC3B;CACnB;CAEA,MAAM,IAAI,KAAa,OAAe,YAAmC;EACvE,MAAM,KAAK,SAAS,CAAC,CAAC,IAAI,KAAK,OAAO,EAAE,KAAK,WAAW,CAAC;CAC3D;CAEA,MAAM,IAAI,KAA4B;EACpC,MAAM,KAAK,SAAS,CAAC,CAAC,OAAO,GAAG;CAClC;CAIA,MAAM,YAAY,KAAa,OAAe,YAAoB,MAA+B;EAC/F,MAAM,KAAK,SAAS,CAAC,CAAC,IAAI,KAAK,OAAO;GAAE,KAAK;GAAY;EAAK,CAAC;CACjE;CAEA,MAAM,cAAc,KAA4B;EAC9C,MAAM,KAAK,SAAS,CAAC,CAAC,UAAU,GAAG;CACrC;AACF"}
|
|
1
|
+
{"version":3,"file":"vercel.js","names":[],"sources":["../../../src/cache/stores/vercel.ts"],"sourcesContent":["/**\n * Vercel Runtime Cache CacheStore — native tag support.\n *\n * Delegates tag operations to Vercel's infrastructure via their Runtime Cache\n * API (getCache/expireTag). The TagAwareCacheHandler detects setWithTags +\n * invalidateTag and delegates entirely — no inverted index, no version stamps.\n *\n * Vercel handles tag purging across CDN, Runtime Cache, and Data Cache layers\n * simultaneously. Available on all plans.\n */\n\nimport type { CacheStore } from '../store.ts';\n\n/**\n * Vercel Runtime Cache contract — the subset we depend on.\n * Resolved from `@vercel/functions` at runtime.\n */\nexport interface VercelCache {\n get(key: string): Promise<string | undefined>;\n set(key: string, value: string, options: { ttl: number; tags?: string[] }): Promise<void>;\n delete(key: string): Promise<void>;\n expireTag(tag: string): Promise<void>;\n}\n\nexport class VercelCacheStore implements CacheStore {\n private cache: VercelCache | (() => VercelCache);\n readonly consistency = 'strong' as const;\n\n constructor(cache: VercelCache | (() => VercelCache)) {\n this.cache = cache;\n }\n\n private getCache(): VercelCache {\n return typeof this.cache === 'function' ? this.cache() : this.cache;\n }\n\n async get(key: string): Promise<string | null> {\n const result = await this.getCache().get(key);\n return result ?? null;\n }\n\n async set(key: string, value: string, ttlSeconds: number): Promise<void> {\n await this.getCache().set(key, value, { ttl: ttlSeconds });\n }\n\n async del(key: string): Promise<void> {\n await this.getCache().delete(key);\n }\n\n // --- Native tag support ---\n\n async setWithTags(key: string, value: string, ttlSeconds: number, tags: string[]): Promise<void> {\n await this.getCache().set(key, value, { ttl: ttlSeconds, tags });\n }\n\n async invalidateTag(tag: string): Promise<void> {\n await this.getCache().expireTag(tag);\n }\n}\n"],"mappings":";AAwBA,IAAa,mBAAb,MAAoD;CAClD;CACA,cAAuB;CAEvB,YAAY,OAA0C;EACpD,KAAK,QAAQ;CACf;CAEA,WAAgC;EAC9B,OAAO,OAAO,KAAK,UAAU,aAAa,KAAK,MAAM,IAAI,KAAK;CAChE;CAEA,MAAM,IAAI,KAAqC;EAE7C,OAAO,MADc,KAAK,SAAS,CAAC,CAAC,IAAI,GAAG,KAC3B;CACnB;CAEA,MAAM,IAAI,KAAa,OAAe,YAAmC;EACvE,MAAM,KAAK,SAAS,CAAC,CAAC,IAAI,KAAK,OAAO,EAAE,KAAK,WAAW,CAAC;CAC3D;CAEA,MAAM,IAAI,KAA4B;EACpC,MAAM,KAAK,SAAS,CAAC,CAAC,OAAO,GAAG;CAClC;CAIA,MAAM,YAAY,KAAa,OAAe,YAAoB,MAA+B;EAC/F,MAAM,KAAK,SAAS,CAAC,CAAC,IAAI,KAAK,OAAO;GAAE,KAAK;GAAY;EAAK,CAAC;CACjE;CAEA,MAAM,cAAc,KAA4B;EAC9C,MAAM,KAAK,SAAS,CAAC,CAAC,UAAU,GAAG;CACrC;AACF"}
|
|
@@ -18,8 +18,8 @@
|
|
|
18
18
|
*
|
|
19
19
|
* Implements the CacheHandler interface consumed by timber-cache.ts.
|
|
20
20
|
*/
|
|
21
|
-
import type { CacheHandler } from './index';
|
|
22
|
-
import type { CacheStore } from './store';
|
|
21
|
+
import type { CacheHandler } from './index.ts';
|
|
22
|
+
import type { CacheStore } from './store.ts';
|
|
23
23
|
export declare class TagAwareCacheHandler implements CacheHandler {
|
|
24
24
|
private store;
|
|
25
25
|
private prefix;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tag-aware-handler.d.ts","sourceRoot":"","sources":["../../src/cache/tag-aware-handler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"tag-aware-handler.d.ts","sourceRoot":"","sources":["../../src/cache/tag-aware-handler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AA6B7C,qBAAa,oBAAqB,YAAW,YAAY;IACvD,OAAO,CAAC,KAAK,CAAa;IAC1B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,QAAQ,CAAW;IAE3B,YAAY,KAAK,EAAE,UAAU,EAAE,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,EAIxD;IAED,IAAI,WAAW,IAAI,QAAQ,GAAG,UAAU,GAAG,OAAO,CAEjD;IAED,OAAO,CAAC,OAAO;IAIf,yEAAyE;IACzE,OAAO,CAAC,UAAU;IAIlB,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,aAAa;IAIf,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,KAAK,EAAE,OAAO,CAAC;QAAC,KAAK,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI,CAAC,CAsBzE;IAEK,GAAG,CACP,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,OAAO,EACd,IAAI,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,EAAE,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,GACzD,OAAO,CAAC,IAAI,CAAC,CA+Cf;IAEK,UAAU,CAAC,IAAI,EAAE;QAAE,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA8CpE;YAIa,cAAc;YAWd,cAAc;CAe7B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"timber-cache.d.ts","sourceRoot":"","sources":["../../src/cache/timber-cache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"timber-cache.d.ts","sourceRoot":"","sources":["../../src/cache/timber-cache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AA+B7D;;;;;GAKG;AACH,wBAAgB,6BAA6B,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAErE;AAoED;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,wBAAgB,WAAW,CAAC,EAAE,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,OAAO,CAAC,GAAG,CAAC,EACrE,EAAE,EAAE,EAAE,EACN,IAAI,EAAE,YAAY,CAAC,EAAE,CAAC,EACtB,UAAU,EAAE,MAAM,YAAY,EAC9B,QAAQ,CAAC,EAAE,MAAM,GAChB,EAAE,CAiHJ"}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* Requires Cloudflare Enterprise for tag-based purging.
|
|
5
5
|
* See https://developers.cloudflare.com/cache/how-to/purge-cache/purge-by-tags/
|
|
6
6
|
*/
|
|
7
|
-
import type { CdnPurgeHandler } from './purge-store';
|
|
7
|
+
import type { CdnPurgeHandler } from './purge-store.ts';
|
|
8
8
|
export interface CloudflarePurgeOptions {
|
|
9
9
|
/** Cloudflare zone ID. */
|
|
10
10
|
zoneId: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cloudflare-purge.d.ts","sourceRoot":"","sources":["../../src/cdn/cloudflare-purge.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"cloudflare-purge.d.ts","sourceRoot":"","sources":["../../src/cdn/cloudflare-purge.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAExD,MAAM,WAAW,sBAAsB;IACrC,0BAA0B;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,6CAA6C;IAC7C,QAAQ,EAAE,MAAM,CAAC;IACjB,kCAAkC;IAClC,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;CACjC;AAED,qBAAa,eAAgB,YAAW,eAAe;IACrD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA0B;IAEjD,YAAY,IAAI,EAAE,sBAAsB,EAIvC;IAEK,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAmB7C;CACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cloudflare-purge.js","names":[],"sources":["../../src/cdn/cloudflare-purge.ts"],"sourcesContent":["/**\n * Cloudflare CDN purge handler — purges by cache tag via the Cloudflare API.\n *\n * Requires Cloudflare Enterprise for tag-based purging.\n * See https://developers.cloudflare.com/cache/how-to/purge-cache/purge-by-tags/\n */\n\nimport type { CdnPurgeHandler } from './purge-store';\n\nexport interface CloudflarePurgeOptions {\n /** Cloudflare zone ID. */\n zoneId: string;\n /** API token with Cache Purge permission. */\n apiToken: string;\n /** Override fetch for testing. */\n fetch?: typeof globalThis.fetch;\n}\n\nexport class CloudflarePurge implements CdnPurgeHandler {\n private readonly zoneId: string;\n private readonly apiToken: string;\n private readonly _fetch: typeof globalThis.fetch;\n\n constructor(opts: CloudflarePurgeOptions) {\n this.zoneId = opts.zoneId;\n this.apiToken = opts.apiToken;\n this._fetch = opts.fetch ?? globalThis.fetch;\n }\n\n async purgeTags(tags: string[]): Promise<void> {\n if (tags.length === 0) return;\n\n const res = await this._fetch(\n `https://api.cloudflare.com/client/v4/zones/${this.zoneId}/purge_cache`,\n {\n method: 'POST',\n headers: {\n 'Authorization': `Bearer ${this.apiToken}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ tags }),\n }\n );\n\n if (!res.ok) {\n const body = await res.text();\n throw new Error(`Cloudflare purge failed (${res.status}): ${body}`);\n }\n }\n}\n"],"mappings":";AAkBA,IAAa,kBAAb,MAAwD;CACtD;CACA;CACA;CAEA,YAAY,MAA8B;EACxC,KAAK,SAAS,KAAK;EACnB,KAAK,WAAW,KAAK;EACrB,KAAK,SAAS,KAAK,SAAS,WAAW;CACzC;CAEA,MAAM,UAAU,MAA+B;EAC7C,IAAI,KAAK,WAAW,GAAG;EAEvB,MAAM,MAAM,MAAM,KAAK,OACrB,8CAA8C,KAAK,OAAO,eAC1D;GACE,QAAQ;GACR,SAAS;IACP,iBAAiB,UAAU,KAAK;IAChC,gBAAgB;GAClB;GACA,MAAM,KAAK,UAAU,EAAE,KAAK,CAAC;EAC/B,CACF;EAEA,IAAI,CAAC,IAAI,IAAI;GACX,MAAM,OAAO,MAAM,IAAI,KAAK;GAC5B,MAAM,IAAI,MAAM,4BAA4B,IAAI,OAAO,KAAK,MAAM;EACpE;CACF;AACF"}
|
|
1
|
+
{"version":3,"file":"cloudflare-purge.js","names":[],"sources":["../../src/cdn/cloudflare-purge.ts"],"sourcesContent":["/**\n * Cloudflare CDN purge handler — purges by cache tag via the Cloudflare API.\n *\n * Requires Cloudflare Enterprise for tag-based purging.\n * See https://developers.cloudflare.com/cache/how-to/purge-cache/purge-by-tags/\n */\n\nimport type { CdnPurgeHandler } from './purge-store.ts';\n\nexport interface CloudflarePurgeOptions {\n /** Cloudflare zone ID. */\n zoneId: string;\n /** API token with Cache Purge permission. */\n apiToken: string;\n /** Override fetch for testing. */\n fetch?: typeof globalThis.fetch;\n}\n\nexport class CloudflarePurge implements CdnPurgeHandler {\n private readonly zoneId: string;\n private readonly apiToken: string;\n private readonly _fetch: typeof globalThis.fetch;\n\n constructor(opts: CloudflarePurgeOptions) {\n this.zoneId = opts.zoneId;\n this.apiToken = opts.apiToken;\n this._fetch = opts.fetch ?? globalThis.fetch;\n }\n\n async purgeTags(tags: string[]): Promise<void> {\n if (tags.length === 0) return;\n\n const res = await this._fetch(\n `https://api.cloudflare.com/client/v4/zones/${this.zoneId}/purge_cache`,\n {\n method: 'POST',\n headers: {\n 'Authorization': `Bearer ${this.apiToken}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ tags }),\n }\n );\n\n if (!res.ok) {\n const body = await res.text();\n throw new Error(`Cloudflare purge failed (${res.status}): ${body}`);\n }\n }\n}\n"],"mappings":";AAkBA,IAAa,kBAAb,MAAwD;CACtD;CACA;CACA;CAEA,YAAY,MAA8B;EACxC,KAAK,SAAS,KAAK;EACnB,KAAK,WAAW,KAAK;EACrB,KAAK,SAAS,KAAK,SAAS,WAAW;CACzC;CAEA,MAAM,UAAU,MAA+B;EAC7C,IAAI,KAAK,WAAW,GAAG;EAEvB,MAAM,MAAM,MAAM,KAAK,OACrB,8CAA8C,KAAK,OAAO,eAC1D;GACE,QAAQ;GACR,SAAS;IACP,iBAAiB,UAAU,KAAK;IAChC,gBAAgB;GAClB;GACA,MAAM,KAAK,UAAU,EAAE,KAAK,CAAC;EAC/B,CACF;EAEA,IAAI,CAAC,IAAI,IAAI;GACX,MAAM,OAAO,MAAM,IAAI,KAAK;GAC5B,MAAM,IAAI,MAAM,4BAA4B,IAAI,OAAO,KAAK,MAAM;EACpE;CACF;AACF"}
|