@timber-js/app 0.2.0-alpha.2 → 0.2.0-alpha.200
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/LICENSE +8 -0
- package/agent-skill.md +346 -0
- package/dist/_chunks/actions-d1hCqnU3.js +345 -0
- package/dist/_chunks/actions-d1hCqnU3.js.map +1 -0
- package/dist/_chunks/als-registry-C6kcfprT.js +41 -0
- package/dist/_chunks/als-registry-C6kcfprT.js.map +1 -0
- package/dist/_chunks/als-slots-BEEIPKYm.js +26 -0
- package/dist/_chunks/als-slots-BEEIPKYm.js.map +1 -0
- package/dist/_chunks/base-path-DaQrzbez.js +80 -0
- package/dist/_chunks/base-path-DaQrzbez.js.map +1 -0
- package/dist/_chunks/build-manifest-DTmSGLRz.js +135 -0
- package/dist/_chunks/build-manifest-DTmSGLRz.js.map +1 -0
- package/dist/_chunks/build-output-helper-9dqCv1pZ.js +370 -0
- package/dist/_chunks/build-output-helper-9dqCv1pZ.js.map +1 -0
- package/dist/_chunks/cache-api-ByagcC-J.js +1149 -0
- package/dist/_chunks/cache-api-ByagcC-J.js.map +1 -0
- package/dist/_chunks/canonicalize-CgHoscYO.js +66 -0
- package/dist/_chunks/canonicalize-CgHoscYO.js.map +1 -0
- package/dist/_chunks/chains-Bpb0W4ax.js +412 -0
- package/dist/_chunks/chains-Bpb0W4ax.js.map +1 -0
- package/dist/_chunks/cli-check-D6VolrDV.js +293 -0
- package/dist/_chunks/cli-check-D6VolrDV.js.map +1 -0
- package/dist/_chunks/cli-schema-sync-D6rO-VcS.js +299 -0
- package/dist/_chunks/cli-schema-sync-D6rO-VcS.js.map +1 -0
- package/dist/_chunks/cloudflare-BFb__LYG.js +1290 -0
- package/dist/_chunks/cloudflare-BFb__LYG.js.map +1 -0
- package/dist/_chunks/codec-registry-oOUxugz3.js +21 -0
- package/dist/_chunks/codec-registry-oOUxugz3.js.map +1 -0
- package/dist/_chunks/convention-lint-fRkwVwEH.js +893 -0
- package/dist/_chunks/convention-lint-fRkwVwEH.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-BfPHZjm0.js +1050 -0
- package/dist/_chunks/error-boundary-BfPHZjm0.js.map +1 -0
- package/dist/_chunks/fast-hash-C-tVYrLb.js +41 -0
- package/dist/_chunks/fast-hash-C-tVYrLb.js.map +1 -0
- package/dist/_chunks/file-cache-Dw6BJPG7.js +458 -0
- package/dist/_chunks/file-cache-Dw6BJPG7.js.map +1 -0
- package/dist/_chunks/format-BKclgVbk.js +14 -0
- package/dist/_chunks/format-BKclgVbk.js.map +1 -0
- package/dist/_chunks/fs-identity-D7vb6GdI.js +208 -0
- package/dist/_chunks/fs-identity-D7vb6GdI.js.map +1 -0
- package/dist/_chunks/graph-cache-CP4GEmf9.js +304 -0
- package/dist/_chunks/graph-cache-CP4GEmf9.js.map +1 -0
- package/dist/_chunks/href-validation-BIrxavIy.js +213 -0
- package/dist/_chunks/href-validation-BIrxavIy.js.map +1 -0
- package/dist/_chunks/json-lossy-check-ClNvBM_3.js +63 -0
- package/dist/_chunks/json-lossy-check-ClNvBM_3.js.map +1 -0
- package/dist/_chunks/live-graph-D_2D32Ad.js +150 -0
- package/dist/_chunks/live-graph-D_2D32Ad.js.map +1 -0
- package/dist/_chunks/logger-uLBuGKDI.js +1484 -0
- package/dist/_chunks/logger-uLBuGKDI.js.map +1 -0
- package/dist/_chunks/navigation-context-D0TU0Jog.js +135 -0
- package/dist/_chunks/navigation-context-D0TU0Jog.js.map +1 -0
- package/dist/_chunks/navigation-root-mHSK9psY.js +126 -0
- package/dist/_chunks/navigation-root-mHSK9psY.js.map +1 -0
- package/dist/_chunks/param-value-C8TNYchQ.js +66 -0
- package/dist/_chunks/param-value-C8TNYchQ.js.map +1 -0
- package/dist/_chunks/plugin-context-8idfR3UZ.js +321 -0
- 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-Bm9Yyqk9.js +101 -0
- package/dist/_chunks/poison-scan-Bm9Yyqk9.js.map +1 -0
- package/dist/_chunks/purge-store-Byr8XOjU.js +14 -0
- package/dist/_chunks/purge-store-Byr8XOjU.js.map +1 -0
- package/dist/_chunks/resolve-schema-CBR6Lm4i.js +50 -0
- package/dist/_chunks/resolve-schema-CBR6Lm4i.js.map +1 -0
- package/dist/_chunks/rolldown-runtime-D7D4PA-g.js +13 -0
- package/dist/_chunks/rsc-cache-key-ClUiXQnK.js +243 -0
- package/dist/_chunks/rsc-cache-key-ClUiXQnK.js.map +1 -0
- package/dist/_chunks/rsc-media-type-DDc7duTD.js +61 -0
- package/dist/_chunks/rsc-media-type-DDc7duTD.js.map +1 -0
- package/dist/_chunks/rsc-payload-path-B_LBodc2.js +48 -0
- package/dist/_chunks/rsc-payload-path-B_LBodc2.js.map +1 -0
- package/dist/_chunks/scan-BoP17W3w.js +140 -0
- package/dist/_chunks/scan-BoP17W3w.js.map +1 -0
- package/dist/_chunks/scanner-AiazgH_f.js +1771 -0
- package/dist/_chunks/scanner-AiazgH_f.js.map +1 -0
- package/dist/_chunks/schema-bridge-C83xa9lT.js +199 -0
- package/dist/_chunks/schema-bridge-C83xa9lT.js.map +1 -0
- package/dist/_chunks/segment-classify-C539Pa2O.js +197 -0
- package/dist/_chunks/segment-classify-C539Pa2O.js.map +1 -0
- package/dist/_chunks/segment-context-D9_89u34.js +34 -0
- package/dist/_chunks/segment-context-D9_89u34.js.map +1 -0
- package/dist/_chunks/segment-keys-lqtdookO.js +256 -0
- package/dist/_chunks/segment-keys-lqtdookO.js.map +1 -0
- package/dist/_chunks/singleflight-2lUWfcAk.js +54 -0
- package/dist/_chunks/singleflight-2lUWfcAk.js.map +1 -0
- package/dist/_chunks/sizeof-lXffQ1Vr.js +35 -0
- package/dist/_chunks/sizeof-lXffQ1Vr.js.map +1 -0
- package/dist/_chunks/{ssr-data-DLnbYpj1.js → ssr-data-D6T6Y3ef.js} +3 -31
- package/dist/_chunks/ssr-data-D6T6Y3ef.js.map +1 -0
- package/dist/_chunks/state-FippDgxN.js +52 -0
- package/dist/_chunks/state-FippDgxN.js.map +1 -0
- package/dist/_chunks/status-page-marker-DwQBrLBz.js +496 -0
- package/dist/_chunks/status-page-marker-DwQBrLBz.js.map +1 -0
- package/dist/_chunks/use-query-states-I3JMng6J.js +226 -0
- package/dist/_chunks/use-query-states-I3JMng6J.js.map +1 -0
- package/dist/_chunks/walkers-B6XUtmqK.js +144 -0
- package/dist/_chunks/walkers-B6XUtmqK.js.map +1 -0
- package/dist/adapters/build-output-helper.d.ts +72 -0
- package/dist/adapters/build-output-helper.d.ts.map +1 -0
- package/dist/adapters/cloudflare-dev.d.ts +109 -0
- package/dist/adapters/cloudflare-dev.d.ts.map +1 -0
- package/dist/adapters/cloudflare-dev.js +74 -0
- package/dist/adapters/cloudflare-dev.js.map +1 -0
- package/dist/adapters/cloudflare-kv-cache.d.ts +65 -0
- package/dist/adapters/cloudflare-kv-cache.d.ts.map +1 -0
- package/dist/adapters/cloudflare-kv-cache.js +123 -0
- package/dist/adapters/cloudflare-kv-cache.js.map +1 -0
- package/dist/adapters/cloudflare.d.ts +200 -22
- package/dist/adapters/cloudflare.d.ts.map +1 -1
- package/dist/adapters/cloudflare.js +2 -188
- package/dist/adapters/compress-module.d.ts +17 -4
- package/dist/adapters/compress-module.d.ts.map +1 -1
- package/dist/adapters/fs-identity.d.ts +64 -0
- package/dist/adapters/fs-identity.d.ts.map +1 -0
- 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 +82 -37
- package/dist/adapters/nitro.d.ts.map +1 -1
- package/dist/adapters/nitro.js +457 -288
- package/dist/adapters/nitro.js.map +1 -1
- package/dist/adapters/shared.d.ts +62 -0
- package/dist/adapters/shared.d.ts.map +1 -0
- package/dist/adapters/types.d.ts +28 -6
- package/dist/adapters/types.d.ts.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 +48 -0
- package/dist/cache/cache-api.d.ts.map +1 -0
- package/dist/cache/fast-hash.d.ts +27 -0
- package/dist/cache/fast-hash.d.ts.map +1 -0
- package/dist/cache/handler-store.d.ts +33 -0
- package/dist/cache/handler-store.d.ts.map +1 -0
- package/dist/cache/index.d.ts +32 -9
- package/dist/cache/index.d.ts.map +1 -1
- package/dist/cache/index.js +3 -284
- package/dist/cache/invalidation-epoch.d.ts +43 -0
- package/dist/cache/invalidation-epoch.d.ts.map +1 -0
- package/dist/cache/json-lossy-check.d.ts +11 -0
- package/dist/cache/json-lossy-check.d.ts.map +1 -0
- package/dist/cache/redis-handler.d.ts +141 -9
- package/dist/cache/redis-handler.d.ts.map +1 -1
- package/dist/cache/singleflight.d.ts +21 -2
- package/dist/cache/singleflight.d.ts.map +1 -1
- package/dist/cache/sizeof.d.ts +22 -0
- package/dist/cache/sizeof.d.ts.map +1 -0
- package/dist/cache/stable-stringify.d.ts +9 -0
- package/dist/cache/stable-stringify.d.ts.map +1 -1
- package/dist/cache/store.d.ts +53 -0
- package/dist/cache/store.d.ts.map +1 -0
- package/dist/cache/stores/cloudflare-kv.d.ts +38 -0
- package/dist/cache/stores/cloudflare-kv.d.ts.map +1 -0
- package/dist/cache/stores/cloudflare-kv.js +29 -0
- package/dist/cache/stores/cloudflare-kv.js.map +1 -0
- package/dist/cache/stores/memory.d.ts +42 -0
- package/dist/cache/stores/memory.d.ts.map +1 -0
- package/dist/cache/stores/memory.js +90 -0
- package/dist/cache/stores/memory.js.map +1 -0
- package/dist/cache/stores/redis.d.ts +69 -0
- package/dist/cache/stores/redis.d.ts.map +1 -0
- package/dist/cache/stores/redis.js +35 -0
- package/dist/cache/stores/redis.js.map +1 -0
- package/dist/cache/stores/vercel.d.ts +36 -0
- package/dist/cache/stores/vercel.d.ts.map +1 -0
- package/dist/cache/stores/vercel.js +33 -0
- package/dist/cache/stores/vercel.js.map +1 -0
- package/dist/cache/tag-aware-handler.d.ts +52 -0
- package/dist/cache/tag-aware-handler.d.ts.map +1 -0
- package/dist/cache/timber-cache.d.ts +21 -11
- package/dist/cache/timber-cache.d.ts.map +1 -1
- package/dist/cdn/cloudflare-purge.d.ts +23 -0
- package/dist/cdn/cloudflare-purge.d.ts.map +1 -0
- package/dist/cdn/cloudflare-purge.js +30 -0
- package/dist/cdn/cloudflare-purge.js.map +1 -0
- package/dist/cdn/fastly-purge.d.ts +25 -0
- package/dist/cdn/fastly-purge.d.ts.map +1 -0
- package/dist/cdn/fastly-purge.js +33 -0
- package/dist/cdn/fastly-purge.js.map +1 -0
- package/dist/cdn/headers.d.ts +97 -0
- package/dist/cdn/headers.d.ts.map +1 -0
- package/dist/cdn/index.d.ts +5 -0
- package/dist/cdn/index.d.ts.map +1 -0
- package/dist/cdn/index.js +94 -0
- package/dist/cdn/index.js.map +1 -0
- package/dist/cdn/purge-store.d.ts +23 -0
- package/dist/cdn/purge-store.d.ts.map +1 -0
- package/dist/cdn/workers-cache-purge.d.ts +20 -0
- package/dist/cdn/workers-cache-purge.d.ts.map +1 -0
- package/dist/cdn/workers-cache-purge.js +35 -0
- package/dist/cdn/workers-cache-purge.js.map +1 -0
- package/dist/cli-check.d.ts +163 -0
- package/dist/cli-check.d.ts.map +1 -0
- package/dist/cli-schema-sync.d.ts +59 -0
- package/dist/cli-schema-sync.d.ts.map +1 -0
- package/dist/cli.d.ts +75 -8
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +175 -47
- package/dist/cli.js.map +1 -1
- package/dist/client/browser-dev.d.ts +37 -1
- package/dist/client/browser-dev.d.ts.map +1 -1
- package/dist/client/browser-entry/action-dispatch.d.ts +19 -0
- package/dist/client/browser-entry/action-dispatch.d.ts.map +1 -0
- package/dist/client/browser-entry/action-queue.d.ts +44 -0
- package/dist/client/browser-entry/action-queue.d.ts.map +1 -0
- package/dist/client/browser-entry/hmr.d.ts +21 -0
- package/dist/client/browser-entry/hmr.d.ts.map +1 -0
- package/dist/client/browser-entry/hydrate.d.ts +63 -0
- package/dist/client/browser-entry/hydrate.d.ts.map +1 -0
- package/dist/client/browser-entry/index.d.ts +30 -0
- package/dist/client/browser-entry/index.d.ts.map +1 -0
- package/dist/client/browser-entry/post-hydration.d.ts +29 -0
- package/dist/client/browser-entry/post-hydration.d.ts.map +1 -0
- package/dist/client/browser-entry/router-init.d.ts +46 -0
- package/dist/client/browser-entry/router-init.d.ts.map +1 -0
- package/dist/client/browser-entry/rsc-stream.d.ts +32 -0
- package/dist/client/browser-entry/rsc-stream.d.ts.map +1 -0
- package/dist/client/browser-entry/scroll.d.ts +28 -0
- package/dist/client/browser-entry/scroll.d.ts.map +1 -0
- package/dist/client/deny-last-resort.d.ts +29 -0
- package/dist/client/deny-last-resort.d.ts.map +1 -0
- package/dist/client/error-boundary.d.ts +66 -6
- package/dist/client/error-boundary.d.ts.map +1 -1
- package/dist/client/error-boundary.js +2 -126
- package/dist/client/error-reconstituter.d.ts +61 -0
- package/dist/client/error-reconstituter.d.ts.map +1 -0
- package/dist/client/form.d.ts +16 -27
- package/dist/client/form.d.ts.map +1 -1
- package/dist/client/global-context.d.ts +15 -0
- package/dist/client/global-context.d.ts.map +1 -0
- package/dist/client/history.d.ts +50 -9
- package/dist/client/history.d.ts.map +1 -1
- package/dist/client/index.d.ts +20 -33
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +323 -1148
- package/dist/client/index.js.map +1 -1
- package/dist/client/internal.d.ts +20 -0
- package/dist/client/internal.d.ts.map +1 -0
- package/dist/client/internal.js +818 -0
- package/dist/client/internal.js.map +1 -0
- package/dist/client/link.d.ts +63 -60
- package/dist/client/link.d.ts.map +1 -1
- package/dist/client/location-search.d.ts +12 -0
- package/dist/client/location-search.d.ts.map +1 -0
- package/dist/client/navigation-api.d.ts +121 -0
- package/dist/client/navigation-api.d.ts.map +1 -0
- package/dist/client/navigation-commit.d.ts +98 -0
- package/dist/client/navigation-commit.d.ts.map +1 -0
- package/dist/client/navigation-context.d.ts +51 -31
- package/dist/client/navigation-context.d.ts.map +1 -1
- package/dist/client/navigation-root.d.ts +98 -0
- package/dist/client/navigation-root.d.ts.map +1 -0
- package/dist/client/navigation-transition.d.ts +187 -0
- package/dist/client/navigation-transition.d.ts.map +1 -0
- package/dist/client/nuqs-adapter.d.ts +1 -1
- package/dist/client/nuqs-adapter.d.ts.map +1 -1
- package/dist/client/params-context.d.ts +81 -0
- package/dist/client/params-context.d.ts.map +1 -0
- package/dist/client/react-root.d.ts +44 -0
- package/dist/client/react-root.d.ts.map +1 -0
- package/dist/client/router-effects.d.ts +130 -0
- package/dist/client/router-effects.d.ts.map +1 -0
- package/dist/client/router-lifecycle.d.ts +98 -0
- package/dist/client/router-lifecycle.d.ts.map +1 -0
- package/dist/client/router-pipeline.d.ts +87 -0
- package/dist/client/router-pipeline.d.ts.map +1 -0
- package/dist/client/router-ref.d.ts +2 -2
- package/dist/client/router-ref.d.ts.map +1 -1
- package/dist/client/router-skew.d.ts +21 -0
- package/dist/client/router-skew.d.ts.map +1 -0
- package/dist/client/router-types.d.ts +272 -0
- package/dist/client/router-types.d.ts.map +1 -0
- package/dist/client/router.d.ts +1 -97
- package/dist/client/router.d.ts.map +1 -1
- package/dist/client/rsc-fetch.d.ts +104 -26
- package/dist/client/rsc-fetch.d.ts.map +1 -1
- package/dist/client/segment-cache.d.ts +161 -25
- package/dist/client/segment-cache.d.ts.map +1 -1
- package/dist/client/segment-context.d.ts +1 -1
- package/dist/client/segment-context.d.ts.map +1 -1
- package/dist/client/segment-outlet.d.ts +68 -0
- package/dist/client/segment-outlet.d.ts.map +1 -0
- package/dist/client/segment-update-context.d.ts +15 -0
- package/dist/client/segment-update-context.d.ts.map +1 -0
- package/dist/client/shallow-url.d.ts +10 -0
- package/dist/client/shallow-url.d.ts.map +1 -0
- package/dist/client/slot-content-cache-context.d.ts +35 -0
- package/dist/client/slot-content-cache-context.d.ts.map +1 -0
- package/dist/client/slot-context.d.ts +31 -0
- package/dist/client/slot-context.d.ts.map +1 -0
- package/dist/client/slot-outlet.d.ts +16 -0
- package/dist/client/slot-outlet.d.ts.map +1 -0
- package/dist/client/slot-provider.d.ts +25 -0
- package/dist/client/slot-provider.d.ts.map +1 -0
- package/dist/client/ssr-data.d.ts +29 -7
- package/dist/client/ssr-data.d.ts.map +1 -1
- package/dist/client/stale-client.d.ts +69 -0
- package/dist/client/stale-client.d.ts.map +1 -0
- package/dist/client/state.d.ts +19 -8
- package/dist/client/state.d.ts.map +1 -1
- package/dist/client/status-page-marker.d.ts +25 -0
- package/dist/client/status-page-marker.d.ts.map +1 -0
- package/dist/client/top-loader.d.ts +7 -6
- package/dist/client/top-loader.d.ts.map +1 -1
- package/dist/client/unload-guard.d.ts +5 -0
- package/dist/client/unload-guard.d.ts.map +1 -1
- package/dist/client/use-cookie.d.ts +12 -0
- package/dist/client/use-cookie.d.ts.map +1 -1
- package/dist/client/use-link-status.d.ts +5 -5
- package/dist/client/use-link-status.d.ts.map +1 -1
- package/dist/client/use-pathname.d.ts +13 -11
- package/dist/client/use-pathname.d.ts.map +1 -1
- package/dist/client/use-pending-navigation.d.ts +23 -0
- package/dist/client/use-pending-navigation.d.ts.map +1 -0
- package/dist/client/use-query-states.d.ts +10 -4
- package/dist/client/use-query-states.d.ts.map +1 -1
- package/dist/client/use-router.d.ts +2 -2
- package/dist/client/use-router.d.ts.map +1 -1
- package/dist/client/use-search-params.d.ts +15 -8
- package/dist/client/use-search-params.d.ts.map +1 -1
- package/dist/client/use-segment-params.d.ts +55 -0
- package/dist/client/use-segment-params.d.ts.map +1 -0
- package/dist/codec.d.ts +69 -0
- package/dist/codec.d.ts.map +1 -0
- package/dist/codec.js +76 -0
- package/dist/codec.js.map +1 -0
- package/dist/config-types.d.ts +322 -0
- package/dist/config-types.d.ts.map +1 -0
- package/dist/config-validation.d.ts +51 -0
- package/dist/config-validation.d.ts.map +1 -0
- package/dist/cookies/define-cookie.d.ts +58 -25
- package/dist/cookies/define-cookie.d.ts.map +1 -1
- package/dist/cookies/index.d.ts +3 -2
- package/dist/cookies/index.d.ts.map +1 -1
- package/dist/cookies/index.js +256 -36
- package/dist/cookies/index.js.map +1 -1
- package/dist/cookies/json-cookie.d.ts +64 -0
- package/dist/cookies/json-cookie.d.ts.map +1 -0
- package/dist/cookies/validation.d.ts +34 -0
- package/dist/cookies/validation.d.ts.map +1 -0
- package/dist/dev-tools/404-page.d.ts +50 -0
- package/dist/dev-tools/404-page.d.ts.map +1 -0
- package/dist/dev-tools/browser-logs.d.ts +40 -0
- package/dist/dev-tools/browser-logs.d.ts.map +1 -0
- package/dist/dev-tools/dev-page-shell.d.ts +78 -0
- package/dist/dev-tools/dev-page-shell.d.ts.map +1 -0
- package/dist/dev-tools/error-page.d.ts +32 -0
- package/dist/dev-tools/error-page.d.ts.map +1 -0
- package/dist/dev-tools/holding-server.d.ts +46 -0
- package/dist/dev-tools/holding-server.d.ts.map +1 -0
- package/dist/dev-tools/hydration-overlay.d.ts +11 -0
- package/dist/dev-tools/hydration-overlay.d.ts.map +1 -0
- package/dist/dev-tools/index.d.ts +31 -0
- package/dist/dev-tools/index.d.ts.map +1 -0
- package/dist/dev-tools/instrumentation.d.ts +59 -0
- package/dist/dev-tools/instrumentation.d.ts.map +1 -0
- package/dist/{server/dev-logger.d.ts → dev-tools/logger.d.ts} +1 -1
- package/dist/dev-tools/logger.d.ts.map +1 -0
- package/dist/{plugins/dev-logs.d.ts → dev-tools/logs.d.ts} +17 -3
- package/dist/dev-tools/logs.d.ts.map +1 -0
- package/dist/dev-tools/overlay.d.ts +91 -0
- package/dist/dev-tools/overlay.d.ts.map +1 -0
- package/dist/dev-tools/stack-classifier.d.ts +34 -0
- package/dist/dev-tools/stack-classifier.d.ts.map +1 -0
- package/dist/dev-tools/terminal.d.ts +28 -0
- package/dist/dev-tools/terminal.d.ts.map +1 -0
- package/dist/fonts/ast-walk.d.ts +68 -0
- package/dist/fonts/ast-walk.d.ts.map +1 -0
- package/dist/fonts/ast.d.ts +112 -8
- package/dist/fonts/ast.d.ts.map +1 -1
- package/dist/fonts/bundle.d.ts +50 -0
- package/dist/fonts/bundle.d.ts.map +1 -0
- package/dist/fonts/css.d.ts +2 -1
- package/dist/fonts/css.d.ts.map +1 -1
- package/dist/fonts/dev-middleware.d.ts +22 -0
- package/dist/fonts/dev-middleware.d.ts.map +1 -0
- package/dist/fonts/fallbacks.d.ts +0 -7
- package/dist/fonts/fallbacks.d.ts.map +1 -1
- package/dist/fonts/google.d.ts +5 -3
- package/dist/fonts/google.d.ts.map +1 -1
- package/dist/fonts/local.d.ts +6 -4
- package/dist/fonts/local.d.ts.map +1 -1
- package/dist/fonts/paths.d.ts +43 -0
- package/dist/fonts/paths.d.ts.map +1 -0
- package/dist/fonts/pipeline.d.ts +177 -0
- package/dist/fonts/pipeline.d.ts.map +1 -0
- package/dist/fonts/transform.d.ts +82 -0
- package/dist/fonts/transform.d.ts.map +1 -0
- package/dist/fonts/types.d.ts +47 -1
- package/dist/fonts/types.d.ts.map +1 -1
- package/dist/fonts/virtual-modules.d.ts +77 -0
- package/dist/fonts/virtual-modules.d.ts.map +1 -0
- package/dist/index.d.ts +35 -153
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10488 -13975
- package/dist/index.js.map +1 -1
- package/dist/params/codec-registry.d.ts +26 -0
- package/dist/params/codec-registry.d.ts.map +1 -0
- package/dist/params/define-schema.d.ts +81 -0
- package/dist/params/define-schema.d.ts.map +1 -0
- package/dist/params/index.d.ts +5 -0
- package/dist/params/index.d.ts.map +1 -0
- package/dist/params/index.js +34 -0
- package/dist/params/index.js.map +1 -0
- package/dist/params/resolve-schema.d.ts +34 -0
- package/dist/params/resolve-schema.d.ts.map +1 -0
- package/dist/plugin-context.d.ts +276 -0
- package/dist/plugin-context.d.ts.map +1 -0
- package/dist/plugins/adapter-build.d.ts +21 -1
- package/dist/plugins/adapter-build.d.ts.map +1 -1
- package/dist/plugins/build-manifest.d.ts +7 -3
- package/dist/plugins/build-manifest.d.ts.map +1 -1
- package/dist/plugins/build-report.d.ts +54 -7
- package/dist/plugins/build-report.d.ts.map +1 -1
- package/dist/plugins/cache.d.ts +64 -0
- package/dist/plugins/cache.d.ts.map +1 -0
- package/dist/plugins/callsite-ast.d.ts +117 -0
- package/dist/plugins/callsite-ast.d.ts.map +1 -0
- package/dist/plugins/callsite-jsx.d.ts +35 -0
- package/dist/plugins/callsite-jsx.d.ts.map +1 -0
- package/dist/plugins/chunks.d.ts +11 -4
- package/dist/plugins/chunks.d.ts.map +1 -1
- package/dist/plugins/client-chunks.d.ts +40 -0
- package/dist/plugins/client-chunks.d.ts.map +1 -0
- package/dist/plugins/cloudflare-wasm.d.ts +21 -0
- package/dist/plugins/cloudflare-wasm.d.ts.map +1 -0
- 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 +17 -1
- package/dist/plugins/dev-server.d.ts.map +1 -1
- package/dist/plugins/entries.d.ts +32 -1
- package/dist/plugins/entries.d.ts.map +1 -1
- package/dist/plugins/fonts.d.ts +16 -65
- 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 +24 -5
- package/dist/plugins/mdx.d.ts.map +1 -1
- package/dist/plugins/prebuilt-capture.d.ts +60 -0
- package/dist/plugins/prebuilt-capture.d.ts.map +1 -0
- package/dist/plugins/prebuilt-options-analysis.d.ts +40 -0
- package/dist/plugins/prebuilt-options-analysis.d.ts.map +1 -0
- package/dist/plugins/prebuilt.d.ts +82 -0
- package/dist/plugins/prebuilt.d.ts.map +1 -0
- package/dist/plugins/prerender-sugar.d.ts +39 -0
- package/dist/plugins/prerender-sugar.d.ts.map +1 -0
- package/dist/plugins/request-dep/analysis.d.ts +106 -0
- package/dist/plugins/request-dep/analysis.d.ts.map +1 -0
- package/dist/plugins/request-dep/index.d.ts +75 -0
- package/dist/plugins/request-dep/index.d.ts.map +1 -0
- package/dist/plugins/request-dep/origin.d.ts +61 -0
- package/dist/plugins/request-dep/origin.d.ts.map +1 -0
- 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 +29 -5
- package/dist/plugins/shims.d.ts.map +1 -1
- package/dist/plugins/static-build.d.ts +218 -21
- package/dist/plugins/static-build.d.ts.map +1 -1
- package/dist/routing/codegen-shared.d.ts +26 -0
- package/dist/routing/codegen-shared.d.ts.map +1 -0
- package/dist/routing/codegen-types.d.ts +61 -0
- package/dist/routing/codegen-types.d.ts.map +1 -0
- package/dist/routing/codegen-write.d.ts +51 -0
- package/dist/routing/codegen-write.d.ts.map +1 -0
- package/dist/routing/codegen.d.ts +8 -3
- package/dist/routing/codegen.d.ts.map +1 -1
- package/dist/routing/collision-probe.d.ts +104 -0
- package/dist/routing/collision-probe.d.ts.map +1 -0
- package/dist/routing/collision-spaces.d.ts +26 -0
- package/dist/routing/collision-spaces.d.ts.map +1 -0
- package/dist/routing/convention-lint.d.ts +55 -0
- package/dist/routing/convention-lint.d.ts.map +1 -0
- package/dist/routing/export-detect.d.ts +72 -0
- package/dist/routing/export-detect.d.ts.map +1 -0
- package/dist/routing/file-cache.d.ts +8 -0
- package/dist/routing/file-cache.d.ts.map +1 -0
- package/dist/routing/index.d.ts +13 -7
- package/dist/routing/index.d.ts.map +1 -1
- package/dist/routing/index.js +5 -2
- package/dist/routing/interception-overlap.d.ts +35 -0
- package/dist/routing/interception-overlap.d.ts.map +1 -0
- package/dist/routing/interception.d.ts +234 -10
- package/dist/routing/interception.d.ts.map +1 -1
- package/dist/routing/link-codegen.d.ts +105 -0
- package/dist/routing/link-codegen.d.ts.map +1 -0
- package/dist/routing/manifest-codegen.d.ts +26 -0
- package/dist/routing/manifest-codegen.d.ts.map +1 -0
- package/dist/routing/scanner.d.ts +14 -10
- package/dist/routing/scanner.d.ts.map +1 -1
- package/dist/routing/schema-validation.d.ts +35 -0
- package/dist/routing/schema-validation.d.ts.map +1 -0
- package/dist/routing/segment-classify.d.ts +114 -0
- package/dist/routing/segment-classify.d.ts.map +1 -0
- package/dist/routing/segment-codegen.d.ts +38 -0
- package/dist/routing/segment-codegen.d.ts.map +1 -0
- package/dist/routing/segment-keys.d.ts +118 -0
- package/dist/routing/segment-keys.d.ts.map +1 -0
- package/dist/routing/slot-placement.d.ts +48 -0
- package/dist/routing/slot-placement.d.ts.map +1 -0
- package/dist/routing/types.d.ts +74 -26
- package/dist/routing/types.d.ts.map +1 -1
- package/dist/routing/walkers.d.ts +57 -0
- package/dist/routing/walkers.d.ts.map +1 -0
- package/dist/rsc-runtime/rsc.d.ts +1 -1
- package/dist/rsc-runtime/rsc.d.ts.map +1 -1
- package/dist/rsc-runtime/ssr.d.ts +14 -0
- package/dist/rsc-runtime/ssr.d.ts.map +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 +145 -0
- package/dist/schema-bridge.d.ts.map +1 -0
- package/dist/search-params/define.d.ts +262 -0
- package/dist/search-params/define.d.ts.map +1 -0
- package/dist/search-params/index.d.ts +3 -7
- package/dist/search-params/index.d.ts.map +1 -1
- package/dist/search-params/index.js +179 -360
- package/dist/search-params/index.js.map +1 -1
- package/dist/search-params/parse-total.d.ts +81 -0
- package/dist/search-params/parse-total.d.ts.map +1 -0
- package/dist/search-params/serialize-equal.d.ts +9 -0
- package/dist/search-params/serialize-equal.d.ts.map +1 -0
- package/dist/search-params/wrappers.d.ts +76 -0
- package/dist/search-params/wrappers.d.ts.map +1 -0
- package/dist/server/access-gate.d.ts +98 -10
- package/dist/server/access-gate.d.ts.map +1 -1
- package/dist/server/action-client.d.ts +42 -7
- package/dist/server/action-client.d.ts.map +1 -1
- package/dist/server/action-encryption.d.ts +76 -0
- package/dist/server/action-encryption.d.ts.map +1 -0
- package/dist/server/action-handler.d.ts +39 -5
- package/dist/server/action-handler.d.ts.map +1 -1
- package/dist/server/actions.d.ts +29 -35
- package/dist/server/actions.d.ts.map +1 -1
- package/dist/server/als-registry.d.ts +117 -13
- package/dist/server/als-registry.d.ts.map +1 -1
- package/dist/server/asset-headers.d.ts +8 -18
- package/dist/server/asset-headers.d.ts.map +1 -1
- package/dist/server/body-limits.d.ts.map +1 -1
- package/dist/server/build-manifest.d.ts +25 -30
- package/dist/server/build-manifest.d.ts.map +1 -1
- package/dist/server/canonicalize.d.ts +10 -0
- package/dist/server/canonicalize.d.ts.map +1 -1
- package/dist/server/chain-url-parts.d.ts +82 -0
- package/dist/server/chain-url-parts.d.ts.map +1 -0
- package/dist/server/children-interception.d.ts +49 -0
- package/dist/server/children-interception.d.ts.map +1 -0
- package/dist/server/coalesce-tick.d.ts +40 -0
- package/dist/server/coalesce-tick.d.ts.map +1 -0
- package/dist/server/compress.d.ts.map +1 -1
- package/dist/server/cookie-context.d.ts +170 -0
- package/dist/server/cookie-context.d.ts.map +1 -0
- package/dist/server/cookie-parsing.d.ts +65 -0
- package/dist/server/cookie-parsing.d.ts.map +1 -0
- package/dist/server/csp-nonce.d.ts +45 -0
- package/dist/server/csp-nonce.d.ts.map +1 -0
- package/dist/server/csrf.d.ts +3 -2
- package/dist/server/csrf.d.ts.map +1 -1
- package/dist/server/debug.d.ts +82 -0
- package/dist/server/debug.d.ts.map +1 -0
- package/dist/server/default-logger.d.ts +22 -0
- package/dist/server/default-logger.d.ts.map +1 -0
- package/dist/server/default-status-page.d.ts +45 -0
- package/dist/server/default-status-page.d.ts.map +1 -0
- package/dist/server/deny-boundary.d.ts +253 -0
- package/dist/server/deny-boundary.d.ts.map +1 -0
- package/dist/server/deny-renderer.d.ts +20 -9
- package/dist/server/deny-renderer.d.ts.map +1 -1
- package/dist/server/dev-source-map.d.ts +22 -0
- package/dist/server/dev-source-map.d.ts.map +1 -0
- package/dist/server/early-hints-sender.d.ts.map +1 -1
- package/dist/server/early-hints.d.ts +14 -12
- package/dist/server/early-hints.d.ts.map +1 -1
- package/dist/server/error-boundary-wrapper.d.ts +101 -10
- package/dist/server/error-boundary-wrapper.d.ts.map +1 -1
- package/dist/server/error-response-headers.d.ts +3 -0
- package/dist/server/error-response-headers.d.ts.map +1 -0
- package/dist/server/fallback-error.d.ts +12 -7
- package/dist/server/fallback-error.d.ts.map +1 -1
- package/dist/server/flight-injection-state.d.ts +66 -0
- package/dist/server/flight-injection-state.d.ts.map +1 -0
- package/dist/server/flight-scripts.d.ts +45 -0
- package/dist/server/flight-scripts.d.ts.map +1 -0
- package/dist/server/form-data.d.ts +41 -0
- package/dist/server/form-data.d.ts.map +1 -1
- package/dist/server/form-flash.d.ts +1 -1
- package/dist/server/head-response.d.ts +35 -0
- package/dist/server/head-response.d.ts.map +1 -0
- package/dist/server/html-injector-core.d.ts +257 -0
- package/dist/server/html-injector-core.d.ts.map +1 -0
- package/dist/server/html-injectors.d.ts +84 -42
- package/dist/server/html-injectors.d.ts.map +1 -1
- package/dist/server/index.d.ts +18 -54
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +212 -2930
- package/dist/server/index.js.map +1 -1
- package/dist/server/instrumentation.d.ts +1 -1
- package/dist/server/internal.d.ts +50 -0
- package/dist/server/internal.d.ts.map +1 -0
- package/dist/server/internal.js +4034 -0
- package/dist/server/internal.js.map +1 -0
- package/dist/server/logger.d.ts +39 -7
- package/dist/server/logger.d.ts.map +1 -1
- package/dist/server/metadata-collector.d.ts +71 -0
- package/dist/server/metadata-collector.d.ts.map +1 -0
- package/dist/server/metadata-platform.d.ts +2 -2
- package/dist/server/metadata-render.d.ts +2 -2
- package/dist/server/metadata-render.d.ts.map +1 -1
- package/dist/server/metadata-routes.d.ts +60 -11
- package/dist/server/metadata-routes.d.ts.map +1 -1
- package/dist/server/metadata-social.d.ts +2 -2
- package/dist/server/metadata.d.ts +10 -2
- package/dist/server/metadata.d.ts.map +1 -1
- package/dist/server/middleware-runner.d.ts +20 -5
- package/dist/server/middleware-runner.d.ts.map +1 -1
- package/dist/server/node-stream-transforms.d.ts +105 -0
- package/dist/server/node-stream-transforms.d.ts.map +1 -0
- package/dist/server/nuqs-ssr-provider.d.ts +7 -3
- package/dist/server/nuqs-ssr-provider.d.ts.map +1 -1
- package/dist/server/param-coercion.d.ts +78 -0
- package/dist/server/param-coercion.d.ts.map +1 -0
- package/dist/server/pipeline-helpers.d.ts +77 -0
- package/dist/server/pipeline-helpers.d.ts.map +1 -0
- package/dist/server/pipeline-interception.d.ts +59 -9
- package/dist/server/pipeline-interception.d.ts.map +1 -1
- package/dist/server/pipeline-metadata.d.ts +7 -1
- package/dist/server/pipeline-metadata.d.ts.map +1 -1
- package/dist/server/pipeline-outcome.d.ts +49 -0
- package/dist/server/pipeline-outcome.d.ts.map +1 -0
- package/dist/server/pipeline-phases.d.ts +70 -0
- package/dist/server/pipeline-phases.d.ts.map +1 -0
- package/dist/server/pipeline.d.ts +160 -24
- package/dist/server/pipeline.d.ts.map +1 -1
- package/dist/server/port-resolution.d.ts +31 -0
- package/dist/server/port-resolution.d.ts.map +1 -0
- package/dist/server/prebuilt/cache-key.d.ts +63 -0
- package/dist/server/prebuilt/cache-key.d.ts.map +1 -0
- package/dist/server/prebuilt/capture-state.d.ts +57 -0
- package/dist/server/prebuilt/capture-state.d.ts.map +1 -0
- package/dist/server/prebuilt/key-discipline.d.ts +52 -0
- package/dist/server/prebuilt/key-discipline.d.ts.map +1 -0
- package/dist/server/prebuilt/manifest-tag-index.d.ts +27 -0
- package/dist/server/prebuilt/manifest-tag-index.d.ts.map +1 -0
- package/dist/server/prebuilt/overlay.d.ts +100 -0
- package/dist/server/prebuilt/overlay.d.ts.map +1 -0
- package/dist/server/prebuilt/payload-source.d.ts +79 -0
- package/dist/server/prebuilt/payload-source.d.ts.map +1 -0
- package/dist/server/prebuilt/slots.d.ts +99 -0
- package/dist/server/prebuilt/slots.d.ts.map +1 -0
- package/dist/server/prebuilt/synthetic-store.d.ts +67 -0
- package/dist/server/prebuilt/synthetic-store.d.ts.map +1 -0
- package/dist/server/prebuilt-builder.d.ts +121 -0
- package/dist/server/prebuilt-builder.d.ts.map +1 -0
- package/dist/server/prebuilt-runtime.d.ts +111 -0
- package/dist/server/prebuilt-runtime.d.ts.map +1 -0
- package/dist/server/primitives.d.ts +129 -45
- package/dist/server/primitives.d.ts.map +1 -1
- package/dist/server/publish-params.d.ts +33 -0
- package/dist/server/publish-params.d.ts.map +1 -0
- package/dist/server/render-timeout.d.ts +51 -0
- package/dist/server/render-timeout.d.ts.map +1 -0
- package/dist/server/render-utils.d.ts +26 -0
- package/dist/server/render-utils.d.ts.map +1 -0
- package/dist/server/request-context.d.ts +111 -107
- package/dist/server/request-context.d.ts.map +1 -1
- package/dist/server/request-dep.d.ts +15 -0
- package/dist/server/request-dep.d.ts.map +1 -0
- package/dist/server/response-cache-policy.d.ts +3 -0
- package/dist/server/response-cache-policy.d.ts.map +1 -0
- package/dist/server/route-element-builder.d.ts +57 -30
- package/dist/server/route-element-builder.d.ts.map +1 -1
- package/dist/server/route-element-helpers.d.ts +12 -0
- package/dist/server/route-element-helpers.d.ts.map +1 -0
- package/dist/server/route-handler.d.ts +1 -1
- package/dist/server/route-handler.d.ts.map +1 -1
- package/dist/server/route-matcher.d.ts +40 -38
- package/dist/server/route-matcher.d.ts.map +1 -1
- package/dist/server/route-module-loader.d.ts +37 -0
- package/dist/server/route-module-loader.d.ts.map +1 -0
- package/dist/server/rsc-cache-key-guard.d.ts +78 -0
- package/dist/server/rsc-cache-key-guard.d.ts.map +1 -0
- package/dist/server/rsc-entry/action-middleware-runner.d.ts +66 -0
- package/dist/server/rsc-entry/action-middleware-runner.d.ts.map +1 -0
- package/dist/server/rsc-entry/api-handler.d.ts +12 -3
- package/dist/server/rsc-entry/api-handler.d.ts.map +1 -1
- package/dist/server/rsc-entry/deny-fallback.d.ts +29 -0
- package/dist/server/rsc-entry/deny-fallback.d.ts.map +1 -0
- package/dist/server/rsc-entry/error-renderer.d.ts +38 -13
- package/dist/server/rsc-entry/error-renderer.d.ts.map +1 -1
- package/dist/server/rsc-entry/helpers.d.ts +59 -42
- package/dist/server/rsc-entry/helpers.d.ts.map +1 -1
- package/dist/server/rsc-entry/index.d.ts +40 -6
- package/dist/server/rsc-entry/index.d.ts.map +1 -1
- package/dist/server/rsc-entry/render-route.d.ts +51 -0
- package/dist/server/rsc-entry/render-route.d.ts.map +1 -0
- package/dist/server/rsc-entry/revalidate-renderer.d.ts +108 -0
- package/dist/server/rsc-entry/revalidate-renderer.d.ts.map +1 -0
- package/dist/server/rsc-entry/rsc-payload.d.ts +26 -6
- package/dist/server/rsc-entry/rsc-payload.d.ts.map +1 -1
- package/dist/server/rsc-entry/rsc-stream.d.ts +39 -3
- package/dist/server/rsc-entry/rsc-stream.d.ts.map +1 -1
- package/dist/server/rsc-entry/ssr-bridge.d.ts +5 -1
- package/dist/server/rsc-entry/ssr-bridge.d.ts.map +1 -1
- package/dist/server/rsc-entry/ssr-renderer.d.ts +37 -5
- package/dist/server/rsc-entry/ssr-renderer.d.ts.map +1 -1
- package/dist/server/rsc-entry/wrap-action-dispatch.d.ts +89 -0
- package/dist/server/rsc-entry/wrap-action-dispatch.d.ts.map +1 -0
- package/dist/server/rsc-error-envelope.d.ts +11 -0
- package/dist/server/rsc-error-envelope.d.ts.map +1 -0
- package/dist/server/rsc-prop-warnings.d.ts.map +1 -1
- package/dist/server/safe-load.d.ts +46 -0
- package/dist/server/safe-load.d.ts.map +1 -0
- package/dist/server/sensitive-fields.d.ts +74 -0
- package/dist/server/sensitive-fields.d.ts.map +1 -0
- package/dist/server/sitemap-generator.d.ts +130 -0
- package/dist/server/sitemap-generator.d.ts.map +1 -0
- package/dist/server/sitemap-handler.d.ts +22 -0
- package/dist/server/sitemap-handler.d.ts.map +1 -0
- package/dist/server/skippable-prefix.d.ts +29 -0
- package/dist/server/skippable-prefix.d.ts.map +1 -0
- package/dist/server/slot-interception.d.ts +80 -0
- package/dist/server/slot-interception.d.ts.map +1 -0
- package/dist/server/slot-resolver.d.ts +137 -7
- package/dist/server/slot-resolver.d.ts.map +1 -1
- package/dist/server/slot-subtree-contain.d.ts +54 -0
- package/dist/server/slot-subtree-contain.d.ts.map +1 -0
- package/dist/server/ssr-bridge-types.d.ts +160 -0
- package/dist/server/ssr-bridge-types.d.ts.map +1 -0
- package/dist/server/ssr-entry.d.ts +1 -43
- package/dist/server/ssr-entry.d.ts.map +1 -1
- package/dist/server/ssr-render.d.ts +69 -22
- package/dist/server/ssr-render.d.ts.map +1 -1
- package/dist/server/ssr-wrappers.d.ts +93 -0
- package/dist/server/ssr-wrappers.d.ts.map +1 -0
- package/dist/server/state-tree-diff.d.ts +44 -9
- package/dist/server/state-tree-diff.d.ts.map +1 -1
- package/dist/server/static-generator.d.ts +112 -0
- package/dist/server/static-generator.d.ts.map +1 -0
- package/dist/server/static-not-found.d.ts +52 -0
- package/dist/server/static-not-found.d.ts.map +1 -0
- package/dist/server/status-code-resolver.d.ts +26 -15
- package/dist/server/status-code-resolver.d.ts.map +1 -1
- package/dist/server/stream-utils.d.ts +47 -0
- package/dist/server/stream-utils.d.ts.map +1 -0
- package/dist/server/tracing.d.ts +56 -11
- package/dist/server/tracing.d.ts.map +1 -1
- package/dist/server/tree-match.d.ts +49 -0
- package/dist/server/tree-match.d.ts.map +1 -0
- package/dist/server/types.d.ts +88 -7
- package/dist/server/types.d.ts.map +1 -1
- package/dist/server/utils/element-type.d.ts +50 -0
- package/dist/server/utils/element-type.d.ts.map +1 -0
- package/dist/server/utils/escape-html.d.ts +14 -0
- package/dist/server/utils/escape-html.d.ts.map +1 -0
- package/dist/server/utils/mdx-file.d.ts +17 -0
- package/dist/server/utils/mdx-file.d.ts.map +1 -0
- package/dist/server/version-skew.d.ts +61 -0
- package/dist/server/version-skew.d.ts.map +1 -0
- package/dist/server/waituntil-bridge.d.ts.map +1 -1
- package/dist/server/workers-cache-bridge.d.ts +26 -0
- package/dist/server/workers-cache-bridge.d.ts.map +1 -0
- package/dist/shared/als-slots.d.ts +42 -0
- package/dist/shared/als-slots.d.ts.map +1 -0
- package/dist/shared/base-path.d.ts +56 -0
- package/dist/shared/base-path.d.ts.map +1 -0
- package/dist/shared/href-validation.d.ts +49 -0
- package/dist/shared/href-validation.d.ts.map +1 -0
- package/dist/shared/merge-search-params.d.ts +22 -0
- package/dist/shared/merge-search-params.d.ts.map +1 -0
- package/dist/shared/param-value.d.ts +104 -0
- package/dist/shared/param-value.d.ts.map +1 -0
- package/dist/shared/payload-root.d.ts +109 -0
- package/dist/shared/payload-root.d.ts.map +1 -0
- package/dist/shared/redirect-type.d.ts +17 -0
- package/dist/shared/redirect-type.d.ts.map +1 -0
- package/dist/shared/rsc-cache-key.d.ts +163 -0
- package/dist/shared/rsc-cache-key.d.ts.map +1 -0
- package/dist/shared/rsc-error-envelope.d.ts +16 -0
- package/dist/shared/rsc-error-envelope.d.ts.map +1 -0
- package/dist/shared/rsc-manifest.d.ts +28 -0
- package/dist/shared/rsc-manifest.d.ts.map +1 -0
- package/dist/shared/rsc-media-type.d.ts +52 -0
- package/dist/shared/rsc-media-type.d.ts.map +1 -0
- package/dist/shared/rsc-payload-path.d.ts +42 -0
- package/dist/shared/rsc-payload-path.d.ts.map +1 -0
- package/dist/shared/segment-info.d.ts +66 -0
- package/dist/shared/segment-info.d.ts.map +1 -0
- package/dist/shared/slot-params.d.ts +52 -0
- package/dist/shared/slot-params.d.ts.map +1 -0
- package/dist/shared/static-platform-files.d.ts +71 -0
- package/dist/shared/static-platform-files.d.ts.map +1 -0
- package/dist/shared/status-reason-phrase.d.ts +26 -0
- package/dist/shared/status-reason-phrase.d.ts.map +1 -0
- package/dist/shims/font-google.d.ts +1 -1
- package/dist/shims/font-google.d.ts.map +1 -1
- package/dist/shims/font-google.js +42 -0
- package/dist/shims/font-google.js.map +1 -0
- package/dist/shims/font-local.d.ts +26 -0
- package/dist/shims/font-local.d.ts.map +1 -0
- package/dist/shims/font-local.js +20 -0
- package/dist/shims/font-local.js.map +1 -0
- package/dist/shims/headers.d.ts +53 -1
- package/dist/shims/headers.d.ts.map +1 -1
- package/dist/shims/image.d.ts +120 -120
- package/dist/shims/image.d.ts.map +1 -1
- package/dist/shims/navigation-client.d.ts +25 -12
- package/dist/shims/navigation-client.d.ts.map +1 -1
- package/dist/shims/navigation-rsc.d.ts +21 -0
- package/dist/shims/navigation-rsc.d.ts.map +1 -0
- package/dist/shims/navigation.d.ts +10 -5
- package/dist/shims/navigation.d.ts.map +1 -1
- package/dist/utils/state-machine.d.ts +80 -0
- package/dist/utils/state-machine.d.ts.map +1 -0
- package/docs/api/30-api-server.mdx +236 -0
- package/docs/api/31-api-client.mdx +167 -0
- package/docs/api/32-api-cache.mdx +311 -0
- package/docs/api/33-api-search-params.mdx +176 -0
- package/docs/api/34-api-config.mdx +329 -0
- package/docs/api/35-api-typescript.mdx +91 -0
- package/docs/api/36-cli.mdx +192 -0
- package/docs/learn/00-introduction.mdx +109 -0
- package/docs/learn/01-quick-start.mdx +94 -0
- package/docs/learn/02-pages-and-layouts.mdx +147 -0
- package/docs/learn/03-fetching-data.mdx +211 -0
- package/docs/learn/04-access-control.mdx +115 -0
- package/docs/learn/05-the-flush-point.mdx +175 -0
- package/docs/learn/06-typed-params.mdx +275 -0
- package/docs/learn/07-typed-routes.mdx +108 -0
- package/docs/learn/08-forms-and-actions.mdx +146 -0
- package/docs/learn/09-streaming.mdx +140 -0
- package/docs/learn/10-caching.mdx +252 -0
- package/docs/learn/11-middleware.mdx +158 -0
- package/docs/learn/12-error-handling.mdx +188 -0
- package/docs/learn/13-deploying.mdx +287 -0
- package/llms.txt +55 -0
- package/package.json +117 -29
- package/src/adapters/build-output-helper.ts +351 -0
- package/src/adapters/cloudflare-dev.ts +183 -0
- package/src/adapters/cloudflare-kv-cache.ts +207 -0
- package/src/adapters/cloudflare.ts +747 -130
- package/src/adapters/compress-module.ts +101 -88
- package/src/adapters/fs-identity.ts +156 -0
- package/src/adapters/nitro-presets.ts +139 -0
- package/src/adapters/nitro-preview.ts +340 -0
- package/src/adapters/nitro.ts +279 -418
- package/src/adapters/raw-imports.d.ts +5 -0
- package/src/adapters/shared.ts +274 -0
- package/src/adapters/types.ts +28 -7
- package/src/adapters/wrangler.d.ts +7 -0
- 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 +107 -0
- package/src/cache/fast-hash.ts +39 -0
- package/src/cache/handler-store.ts +76 -0
- package/src/cache/index.ts +115 -22
- package/src/cache/invalidation-epoch.ts +93 -0
- package/src/cache/json-lossy-check.ts +75 -0
- package/src/cache/redis-handler.ts +198 -20
- package/src/cache/singleflight.ts +69 -6
- package/src/cache/sizeof.ts +33 -0
- package/src/cache/stable-stringify.ts +65 -2
- package/src/cache/store.ts +71 -0
- package/src/cache/stores/cloudflare-kv.ts +52 -0
- package/src/cache/stores/memory.ts +125 -0
- package/src/cache/stores/redis.ts +97 -0
- package/src/cache/stores/vercel.ts +59 -0
- package/src/cache/tag-aware-handler.ts +237 -0
- package/src/cache/timber-cache.ts +180 -48
- package/src/cdn/cloudflare-purge.ts +50 -0
- package/src/cdn/fastly-purge.ts +63 -0
- package/src/cdn/headers.ts +153 -0
- package/src/cdn/index.ts +23 -0
- package/src/cdn/purge-store.ts +34 -0
- package/src/cdn/workers-cache-purge.ts +34 -0
- package/src/cli-check.ts +507 -0
- package/src/cli-schema-sync.ts +401 -0
- package/src/cli.ts +262 -55
- package/src/client/browser-dev.ts +157 -2
- package/src/client/browser-entry/action-dispatch.ts +197 -0
- package/src/client/browser-entry/action-queue.ts +90 -0
- package/src/client/browser-entry/hmr.ts +70 -0
- package/src/client/browser-entry/hydrate.ts +148 -0
- package/src/client/browser-entry/index.ts +131 -0
- package/src/client/browser-entry/post-hydration.ts +123 -0
- package/src/client/browser-entry/router-init.ts +418 -0
- package/src/client/browser-entry/rsc-stream.ts +166 -0
- package/src/client/browser-entry/scroll.ts +50 -0
- package/src/client/deny-last-resort.tsx +54 -0
- package/src/client/error-boundary.tsx +316 -40
- package/src/client/error-reconstituter.tsx +79 -0
- package/src/client/form.tsx +36 -32
- package/src/client/global-context.ts +31 -0
- package/src/client/history.ts +81 -10
- package/src/client/index.ts +89 -53
- package/src/client/internal.ts +59 -0
- package/src/client/link.tsx +452 -159
- package/src/client/location-search.ts +15 -0
- package/src/client/navigation-api.ts +347 -0
- package/src/client/navigation-commit.ts +295 -0
- package/src/client/navigation-context.ts +67 -98
- package/src/client/navigation-root.tsx +224 -0
- package/src/client/navigation-transition.ts +327 -0
- package/src/client/nuqs-adapter.tsx +21 -9
- package/src/client/params-context.ts +187 -0
- package/src/client/react-root.ts +72 -0
- package/src/client/router-effects.ts +228 -0
- package/src/client/router-lifecycle.ts +354 -0
- package/src/client/router-pipeline.ts +490 -0
- package/src/client/router-ref.ts +3 -3
- package/src/client/router-skew.ts +30 -0
- package/src/client/router-types.ts +294 -0
- package/src/client/router.ts +436 -424
- package/src/client/rsc-fetch.ts +512 -73
- package/src/client/segment-cache.ts +327 -40
- package/src/client/segment-context.ts +13 -5
- package/src/client/segment-outlet.tsx +96 -0
- package/src/client/segment-update-context.ts +23 -0
- package/src/client/shallow-url.ts +22 -0
- package/src/client/slot-content-cache-context.ts +43 -0
- package/src/client/slot-context.ts +50 -0
- package/src/client/slot-outlet.tsx +22 -0
- package/src/client/slot-provider.tsx +32 -0
- package/src/client/ssr-data.ts +30 -9
- package/src/client/stale-client.ts +191 -0
- package/src/client/state.ts +29 -15
- package/src/client/status-page-marker.tsx +32 -0
- package/src/client/top-loader.tsx +36 -29
- package/src/client/unload-guard.ts +35 -3
- package/src/client/use-cookie.ts +70 -18
- package/src/client/use-link-status.ts +7 -7
- package/src/client/use-pathname.ts +22 -31
- package/src/client/use-pending-navigation.ts +40 -0
- package/src/client/use-query-states.ts +206 -36
- package/src/client/use-router.ts +6 -3
- package/src/client/use-search-params.ts +38 -49
- package/src/client/use-segment-params.ts +69 -0
- package/src/client/use-selected-layout-segment.ts +2 -2
- package/src/codec.ts +149 -0
- package/src/config-types.ts +322 -0
- package/src/config-validation.ts +347 -0
- package/src/cookies/define-cookie.ts +222 -53
- package/src/cookies/index.ts +13 -2
- package/src/cookies/json-cookie.ts +105 -0
- package/src/cookies/validation.ts +192 -0
- package/src/dev-tools/404-page.ts +286 -0
- package/src/dev-tools/browser-logs.ts +55 -0
- package/src/dev-tools/dev-page-shell.ts +260 -0
- package/src/dev-tools/error-page.ts +331 -0
- package/src/dev-tools/holding-server.ts +185 -0
- package/src/dev-tools/hydration-overlay.ts +158 -0
- package/src/dev-tools/index.ts +83 -0
- package/src/dev-tools/instrumentation.ts +213 -0
- package/src/{server/dev-logger.ts → dev-tools/logger.ts} +33 -51
- package/src/{plugins/dev-logs.ts → dev-tools/logs.ts} +122 -26
- package/src/dev-tools/overlay.ts +469 -0
- package/src/dev-tools/stack-classifier.ts +75 -0
- package/src/dev-tools/terminal.ts +182 -0
- package/src/fonts/ast-walk.ts +235 -0
- package/src/fonts/ast.ts +479 -128
- package/src/fonts/bundle.ts +138 -0
- package/src/fonts/css.ts +3 -2
- package/src/fonts/dev-middleware.ts +85 -0
- package/src/fonts/fallbacks.ts +0 -23
- package/src/fonts/google.ts +101 -19
- package/src/fonts/local.ts +13 -8
- package/src/fonts/paths.ts +58 -0
- package/src/fonts/pipeline.ts +348 -0
- package/src/fonts/transform.ts +311 -0
- package/src/fonts/types.ts +52 -1
- package/src/fonts/virtual-modules.ts +179 -0
- package/src/index.ts +486 -344
- package/src/params/codec-registry.ts +34 -0
- package/src/params/define-schema.ts +115 -0
- package/src/params/index.ts +17 -0
- package/src/params/resolve-schema.ts +84 -0
- package/src/plugin-context.ts +503 -0
- package/src/plugins/adapter-build.ts +229 -7
- package/src/plugins/build-manifest.ts +201 -26
- package/src/plugins/build-report.ts +275 -43
- package/src/plugins/cache.ts +243 -0
- package/src/plugins/callsite-ast.ts +472 -0
- package/src/plugins/callsite-jsx.ts +243 -0
- package/src/plugins/chunks.ts +74 -5
- package/src/plugins/client-chunks.ts +185 -0
- package/src/plugins/cloudflare-wasm.ts +141 -0
- package/src/plugins/content.ts +5 -1
- package/src/plugins/dev-discovery.ts +218 -0
- package/src/plugins/dev-server.ts +369 -96
- package/src/plugins/entries.ts +148 -18
- package/src/plugins/fonts.ts +251 -524
- package/src/plugins/graph-endpoint.ts +532 -0
- package/src/plugins/mdx.ts +116 -40
- package/src/plugins/prebuilt-capture.ts +217 -0
- package/src/plugins/prebuilt-options-analysis.ts +175 -0
- package/src/plugins/prebuilt.ts +655 -0
- package/src/plugins/prerender-sugar.ts +320 -0
- package/src/plugins/request-dep/analysis.ts +447 -0
- package/src/plugins/request-dep/index.ts +376 -0
- package/src/plugins/request-dep/origin.ts +310 -0
- package/src/plugins/routing.ts +273 -277
- package/src/plugins/server-bundle.ts +103 -14
- package/src/plugins/shims.ts +259 -97
- package/src/plugins/static-build.ts +708 -66
- package/src/react-canary.d.ts +2 -0
- package/src/routing/codegen-shared.ts +39 -0
- package/src/routing/codegen-types.ts +62 -0
- package/src/routing/codegen-write.ts +141 -0
- package/src/routing/codegen.ts +349 -232
- package/src/routing/collision-probe.ts +438 -0
- package/src/routing/collision-spaces.ts +281 -0
- package/src/routing/convention-lint.ts +623 -0
- package/src/routing/export-detect.ts +448 -0
- package/src/routing/file-cache.ts +23 -0
- package/src/routing/index.ts +16 -7
- package/src/routing/interception-overlap.ts +141 -0
- package/src/routing/interception.ts +1044 -67
- package/src/routing/link-codegen.ts +280 -0
- package/src/routing/manifest-codegen.ts +226 -0
- package/src/routing/scanner.ts +393 -219
- package/src/routing/schema-validation.ts +155 -0
- package/src/routing/segment-classify.ts +280 -0
- package/src/routing/segment-codegen.ts +98 -0
- package/src/routing/segment-keys.ts +186 -0
- package/src/routing/slot-placement.ts +97 -0
- package/src/routing/types.ts +75 -26
- package/src/routing/walkers.ts +98 -0
- package/src/rsc-runtime/rsc.ts +9 -0
- package/src/rsc-runtime/ssr.ts +51 -0
- package/src/rsc-runtime/transforms.ts +13 -0
- package/src/rsc-runtime/vendor-types.d.ts +19 -0
- package/src/schema-bridge.ts +380 -0
- package/src/search-params/define.ts +677 -0
- package/src/search-params/index.ts +14 -20
- package/src/search-params/parse-total.ts +91 -0
- package/src/search-params/serialize-equal.ts +14 -0
- package/src/search-params/wrappers.ts +150 -0
- package/src/server/access-gate.tsx +196 -57
- package/src/server/action-client.ts +136 -35
- package/src/server/action-encryption.ts +144 -0
- package/src/server/action-handler.ts +256 -56
- package/src/server/actions.ts +112 -68
- package/src/server/als-registry.ts +160 -21
- package/src/server/asset-headers.ts +15 -37
- package/src/server/body-limits.ts +10 -2
- package/src/server/build-manifest.ts +33 -57
- package/src/server/canonicalize.ts +6 -3
- package/src/server/chain-url-parts.ts +163 -0
- package/src/server/children-interception.ts +115 -0
- package/src/server/coalesce-tick.ts +75 -0
- package/src/server/compress.ts +43 -8
- package/src/server/cookie-context.ts +484 -0
- package/src/server/cookie-parsing.ts +163 -0
- package/src/server/csp-nonce.ts +70 -0
- package/src/server/csrf.ts +39 -6
- package/src/server/debug.ts +137 -0
- package/src/server/default-logger.ts +99 -0
- package/src/server/default-status-page.ts +88 -0
- package/src/server/deny-boundary.ts +533 -0
- package/src/server/deny-renderer.ts +214 -112
- package/src/server/dev-source-map.ts +31 -0
- package/src/server/early-hints-sender.ts +4 -3
- package/src/server/early-hints.ts +39 -29
- package/src/server/error-boundary-wrapper.ts +181 -44
- package/src/server/error-response-headers.ts +18 -0
- package/src/server/fallback-error.ts +79 -102
- package/src/server/flight-injection-state.ts +113 -0
- package/src/server/flight-scripts.ts +67 -0
- package/src/server/form-data.ts +124 -12
- package/src/server/form-flash.ts +2 -2
- package/src/server/head-response.ts +54 -0
- package/src/server/html-injector-core.ts +512 -0
- package/src/server/html-injectors.ts +272 -235
- package/src/server/index.ts +40 -192
- package/src/server/instrumentation.ts +1 -1
- package/src/server/internal.ts +173 -0
- package/src/server/logger.ts +73 -36
- package/src/server/metadata-collector.ts +174 -0
- package/src/server/metadata-platform.ts +2 -2
- package/src/server/metadata-render.ts +30 -8
- package/src/server/metadata-routes.ts +205 -24
- package/src/server/metadata-social.ts +2 -2
- package/src/server/metadata.ts +23 -2
- package/src/server/middleware-runner.ts +32 -5
- package/src/server/node-stream-transforms.ts +323 -0
- package/src/server/nuqs-ssr-provider.tsx +8 -7
- package/src/server/param-coercion.ts +198 -0
- package/src/server/pipeline-helpers.ts +159 -0
- package/src/server/pipeline-interception.ts +109 -33
- package/src/server/pipeline-metadata.ts +15 -1
- package/src/server/pipeline-outcome.ts +218 -0
- package/src/server/pipeline-phases.ts +606 -0
- package/src/server/pipeline.ts +343 -389
- package/src/server/port-resolution.ts +53 -0
- package/src/server/prebuilt/cache-key.ts +299 -0
- package/src/server/prebuilt/capture-state.ts +89 -0
- package/src/server/prebuilt/key-discipline.ts +122 -0
- package/src/server/prebuilt/manifest-tag-index.ts +46 -0
- package/src/server/prebuilt/overlay.ts +256 -0
- package/src/server/prebuilt/payload-source.ts +202 -0
- package/src/server/prebuilt/slots.ts +190 -0
- package/src/server/prebuilt/synthetic-store.ts +122 -0
- package/src/server/prebuilt-builder.ts +804 -0
- package/src/server/prebuilt-runtime.ts +817 -0
- package/src/server/primitives.ts +246 -97
- package/src/server/publish-params.ts +42 -0
- package/src/server/render-timeout.ts +108 -0
- package/src/server/render-utils.ts +35 -0
- package/src/server/request-context.ts +244 -333
- package/src/server/request-dep.ts +37 -0
- package/src/server/response-cache-policy.ts +45 -0
- package/src/server/route-element-builder.ts +508 -360
- package/src/server/route-element-helpers.ts +37 -0
- package/src/server/route-handler.ts +40 -13
- package/src/server/route-matcher.ts +165 -272
- package/src/server/route-module-loader.ts +161 -0
- package/src/server/rsc-cache-key-guard.ts +122 -0
- package/src/server/rsc-entry/action-middleware-runner.ts +174 -0
- package/src/server/rsc-entry/api-handler.ts +78 -34
- package/src/server/rsc-entry/deny-fallback.ts +93 -0
- package/src/server/rsc-entry/error-renderer.ts +373 -95
- package/src/server/rsc-entry/helpers.ts +226 -95
- package/src/server/rsc-entry/index.ts +405 -323
- package/src/server/rsc-entry/render-route.ts +304 -0
- package/src/server/rsc-entry/revalidate-renderer.ts +350 -0
- package/src/server/rsc-entry/rsc-payload.ts +239 -50
- package/src/server/rsc-entry/rsc-stream.ts +160 -30
- package/src/server/rsc-entry/ssr-bridge.ts +18 -5
- package/src/server/rsc-entry/ssr-renderer.ts +315 -57
- package/src/server/rsc-entry/wrap-action-dispatch.ts +186 -0
- package/src/server/rsc-error-envelope.ts +18 -0
- package/src/server/rsc-prop-warnings.ts +3 -1
- package/src/server/safe-load.ts +60 -0
- package/src/server/sensitive-fields.ts +230 -0
- package/src/server/server-only-guard-noop.js +3 -0
- package/src/server/server-timing.ts +1 -1
- package/src/server/sitemap-generator.ts +337 -0
- package/src/server/sitemap-handler.ts +157 -0
- package/src/server/skippable-prefix.ts +172 -0
- package/src/server/slot-interception.ts +168 -0
- package/src/server/slot-resolver.ts +707 -300
- package/src/server/slot-subtree-contain.ts +255 -0
- package/src/server/ssr-bridge-types.ts +165 -0
- package/src/server/ssr-entry.ts +230 -85
- package/src/server/ssr-render.ts +357 -85
- package/src/server/ssr-wrappers.tsx +162 -0
- package/src/server/state-tree-diff.ts +85 -30
- package/src/server/static-generator.ts +715 -0
- package/src/server/static-not-found.ts +134 -0
- package/src/server/status-code-resolver.ts +107 -148
- package/src/server/stream-utils.ts +292 -0
- package/src/server/tracing.ts +151 -16
- package/src/server/tree-match.ts +262 -0
- package/src/server/types.ts +95 -10
- package/src/server/utils/element-type.ts +88 -0
- package/src/server/utils/escape-html.ts +20 -0
- package/src/server/utils/mdx-file.ts +22 -0
- package/src/server/version-skew.ts +104 -0
- package/src/server/waituntil-bridge.ts +5 -2
- package/src/server/workers-cache-bridge.ts +33 -0
- package/src/shared/als-slots.ts +74 -0
- package/src/shared/base-path.ts +80 -0
- package/src/shared/href-validation.ts +159 -0
- package/src/shared/merge-search-params.ts +55 -0
- package/src/shared/param-value.ts +281 -0
- package/src/shared/payload-root.ts +152 -0
- package/src/shared/redirect-type.ts +17 -0
- package/src/shared/rsc-cache-key.ts +269 -0
- package/src/shared/rsc-error-envelope.ts +16 -0
- package/src/shared/rsc-manifest.ts +29 -0
- package/src/shared/rsc-media-type.ts +59 -0
- package/src/shared/rsc-payload-path.ts +45 -0
- package/src/shared/segment-info.ts +67 -0
- package/src/shared/slot-params.ts +109 -0
- package/src/shared/static-platform-files.ts +75 -0
- package/src/shared/status-reason-phrase.ts +61 -0
- package/src/shims/font-google.ts +1 -1
- package/src/shims/font-local.ts +34 -0
- package/src/shims/headers.ts +122 -1
- package/src/shims/navigation-client.ts +36 -32
- package/src/shims/navigation-rsc.ts +47 -0
- package/src/shims/navigation.ts +10 -7
- package/src/utils/state-machine.ts +111 -0
- package/dist/_chunks/als-registry-k-AtAQ9R.js +0 -41
- package/dist/_chunks/als-registry-k-AtAQ9R.js.map +0 -1
- package/dist/_chunks/format-DNt20Kt8.js +0 -163
- package/dist/_chunks/format-DNt20Kt8.js.map +0 -1
- package/dist/_chunks/interception-DGDIjDbR.js +0 -676
- package/dist/_chunks/interception-DGDIjDbR.js.map +0 -1
- package/dist/_chunks/metadata-routes-CQCnF4VK.js +0 -153
- package/dist/_chunks/metadata-routes-CQCnF4VK.js.map +0 -1
- package/dist/_chunks/request-context-CRj2Zh1E.js +0 -329
- package/dist/_chunks/request-context-CRj2Zh1E.js.map +0 -1
- package/dist/_chunks/ssr-data-DLnbYpj1.js.map +0 -1
- package/dist/_chunks/tracing-DF0G3FB7.js +0 -173
- package/dist/_chunks/tracing-DF0G3FB7.js.map +0 -1
- package/dist/_chunks/use-cookie-dDbpCTx-.js +0 -91
- package/dist/_chunks/use-cookie-dDbpCTx-.js.map +0 -1
- package/dist/_chunks/use-query-states-DAhgj8Gx.js +0 -109
- package/dist/_chunks/use-query-states-DAhgj8Gx.js.map +0 -1
- package/dist/adapters/cloudflare.js.map +0 -1
- package/dist/cache/index.js.map +0 -1
- package/dist/cache/register-cached-function.d.ts +0 -17
- package/dist/cache/register-cached-function.d.ts.map +0 -1
- package/dist/client/browser-entry.d.ts +0 -21
- package/dist/client/browser-entry.d.ts.map +0 -1
- package/dist/client/error-boundary.js.map +0 -1
- package/dist/client/head.d.ts +0 -16
- package/dist/client/head.d.ts.map +0 -1
- package/dist/client/link-status-provider.d.ts +0 -11
- package/dist/client/link-status-provider.d.ts.map +0 -1
- package/dist/client/segment-merger.d.ts +0 -119
- package/dist/client/segment-merger.d.ts.map +0 -1
- package/dist/client/stale-reload.d.ts +0 -44
- package/dist/client/stale-reload.d.ts.map +0 -1
- package/dist/client/transition-root.d.ts +0 -74
- package/dist/client/transition-root.d.ts.map +0 -1
- package/dist/client/use-navigation-pending.d.ts +0 -26
- package/dist/client/use-navigation-pending.d.ts.map +0 -1
- package/dist/client/use-params.d.ts +0 -92
- package/dist/client/use-params.d.ts.map +0 -1
- package/dist/content/index.d.ts +0 -11
- package/dist/content/index.d.ts.map +0 -1
- package/dist/content/index.js +0 -2
- package/dist/plugins/cache-transform.d.ts +0 -36
- package/dist/plugins/cache-transform.d.ts.map +0 -1
- package/dist/plugins/dev-error-overlay.d.ts +0 -60
- package/dist/plugins/dev-error-overlay.d.ts.map +0 -1
- package/dist/plugins/dev-logs.d.ts.map +0 -1
- package/dist/plugins/dynamic-transform.d.ts +0 -72
- package/dist/plugins/dynamic-transform.d.ts.map +0 -1
- package/dist/plugins/server-action-exports.d.ts +0 -26
- package/dist/plugins/server-action-exports.d.ts.map +0 -1
- package/dist/routing/status-file-lint.d.ts +0 -33
- package/dist/routing/status-file-lint.d.ts.map +0 -1
- package/dist/search-params/analyze.d.ts +0 -54
- package/dist/search-params/analyze.d.ts.map +0 -1
- package/dist/search-params/builtin-codecs.d.ts +0 -105
- package/dist/search-params/builtin-codecs.d.ts.map +0 -1
- package/dist/search-params/codecs.d.ts +0 -53
- package/dist/search-params/codecs.d.ts.map +0 -1
- package/dist/search-params/create.d.ts +0 -106
- package/dist/search-params/create.d.ts.map +0 -1
- package/dist/search-params/registry.d.ts +0 -20
- package/dist/search-params/registry.d.ts.map +0 -1
- package/dist/server/client-module-map.d.ts +0 -47
- package/dist/server/client-module-map.d.ts.map +0 -1
- package/dist/server/dev-fetch-instrumentation.d.ts +0 -22
- package/dist/server/dev-fetch-instrumentation.d.ts.map +0 -1
- package/dist/server/dev-logger.d.ts.map +0 -1
- package/dist/server/dev-span-processor.d.ts +0 -29
- package/dist/server/dev-span-processor.d.ts.map +0 -1
- package/dist/server/dev-warnings.d.ts +0 -129
- package/dist/server/dev-warnings.d.ts.map +0 -1
- package/dist/server/flush.d.ts +0 -74
- package/dist/server/flush.d.ts.map +0 -1
- package/dist/server/manifest-status-resolver.d.ts +0 -58
- package/dist/server/manifest-status-resolver.d.ts.map +0 -1
- package/dist/server/prerender.d.ts +0 -77
- package/dist/server/prerender.d.ts.map +0 -1
- package/dist/server/tree-builder.d.ts +0 -126
- package/dist/server/tree-builder.d.ts.map +0 -1
- package/dist/utils/directive-parser.d.ts +0 -70
- package/dist/utils/directive-parser.d.ts.map +0 -1
- package/src/cache/register-cached-function.ts +0 -99
- package/src/client/browser-entry.ts +0 -674
- package/src/client/head.ts +0 -61
- package/src/client/link-status-provider.tsx +0 -30
- package/src/client/segment-merger.ts +0 -345
- package/src/client/stale-reload.ts +0 -89
- package/src/client/transition-root.tsx +0 -160
- package/src/client/use-navigation-pending.ts +0 -38
- package/src/client/use-params.ts +0 -141
- package/src/content/index.ts +0 -13
- package/src/plugins/cache-transform.ts +0 -199
- package/src/plugins/dev-error-overlay.ts +0 -230
- package/src/plugins/dynamic-transform.ts +0 -161
- package/src/plugins/server-action-exports.ts +0 -220
- package/src/routing/status-file-lint.ts +0 -112
- package/src/search-params/analyze.ts +0 -192
- package/src/search-params/builtin-codecs.ts +0 -228
- package/src/search-params/codecs.ts +0 -153
- package/src/search-params/create.ts +0 -321
- package/src/search-params/registry.ts +0 -31
- package/src/server/client-module-map.ts +0 -58
- package/src/server/dev-fetch-instrumentation.ts +0 -96
- package/src/server/dev-span-processor.ts +0 -78
- package/src/server/dev-warnings.ts +0 -282
- package/src/server/flush.ts +0 -182
- package/src/server/manifest-status-resolver.ts +0 -215
- package/src/server/prerender.ts +0 -139
- package/src/server/tree-builder.ts +0 -382
- package/src/shims/server-only-noop.js +0 -6
- package/src/utils/directive-parser.ts +0 -529
|
@@ -0,0 +1,1149 @@
|
|
|
1
|
+
import { Z as getWaitUntil, _ as addSpanEventSync, d as logSwrRefetchFailed, h as swallow } from "./logger-uLBuGKDI.js";
|
|
2
|
+
import { t as fnv1aHash } from "./fast-hash-C-tVYrLb.js";
|
|
3
|
+
import { n as createSingleflight } from "./singleflight-2lUWfcAk.js";
|
|
4
|
+
import { t as estimateByteSize } from "./sizeof-lXffQ1Vr.js";
|
|
5
|
+
import { t as warnLossyJsonValue } from "./json-lossy-check-ClNvBM_3.js";
|
|
6
|
+
import { t as getCdnPurgeHandler } from "./purge-store-Byr8XOjU.js";
|
|
7
|
+
//#region src/cache/stable-stringify.ts
|
|
8
|
+
/**
|
|
9
|
+
* Deterministic JSON serialization with sorted object keys.
|
|
10
|
+
* Used for cache key generation — ensures { a: 1, b: 2 } and { b: 2, a: 1 }
|
|
11
|
+
* produce the same string.
|
|
12
|
+
*
|
|
13
|
+
* Matches JSON.stringify semantics for toJSON: Date serializes to its ISO
|
|
14
|
+
* string, URL to its href, and class instances with a custom toJSON use it.
|
|
15
|
+
* Map and Set serialize their entries explicitly (insertion-order
|
|
16
|
+
* independent). Values that would serialize lossily — functions, symbols,
|
|
17
|
+
* and non-plain objects with no enumerable own state (RegExp, class
|
|
18
|
+
* instances holding data behind getters or internal slots) — throw instead:
|
|
19
|
+
* every such value would collapse to the same cache key, silently returning
|
|
20
|
+
* one argument's cached data for another (TIM-1020).
|
|
21
|
+
*/
|
|
22
|
+
function stableStringify(value) {
|
|
23
|
+
if (value === null || value === void 0) return String(value);
|
|
24
|
+
const type = typeof value;
|
|
25
|
+
if (type === "function" || type === "symbol") throw new TypeError(`stableStringify: cannot serialize a ${type} into a stable cache key — all such values would collide. Provide an explicit \`key\` option to cache().`);
|
|
26
|
+
if (type !== "object") return JSON.stringify(value);
|
|
27
|
+
if (Array.isArray(value)) return "[" + value.map((item) => stableStringify(item)).join(",") + "]";
|
|
28
|
+
const withToJSON = value;
|
|
29
|
+
if (typeof withToJSON.toJSON === "function") {
|
|
30
|
+
const json = withToJSON.toJSON();
|
|
31
|
+
if (json !== value) return stableStringify(json);
|
|
32
|
+
}
|
|
33
|
+
if (value instanceof Map) return "Map(" + [...value.entries()].map(([k, v]) => stableStringify(k) + "=>" + stableStringify(v)).sort().join(",") + ")";
|
|
34
|
+
if (value instanceof Set) return "Set(" + [...value].map((member) => stableStringify(member)).sort().join(",") + ")";
|
|
35
|
+
const obj = value;
|
|
36
|
+
const keys = Object.keys(obj).sort();
|
|
37
|
+
const pairs = [];
|
|
38
|
+
for (const key of keys) {
|
|
39
|
+
if (obj[key] === void 0) continue;
|
|
40
|
+
if (key === "toJSON" && typeof obj[key] === "function") continue;
|
|
41
|
+
pairs.push(JSON.stringify(key) + ":" + stableStringify(obj[key]));
|
|
42
|
+
}
|
|
43
|
+
if (pairs.length === 0) {
|
|
44
|
+
const proto = Object.getPrototypeOf(value);
|
|
45
|
+
if (proto !== Object.prototype && proto !== null) {
|
|
46
|
+
const name = value.constructor?.name || "Object";
|
|
47
|
+
throw new TypeError(`stableStringify: ${name} instance has no serializable own state — all instances would share one cache key. Provide an explicit \`key\` option to cache(), or add a toJSON() method.`);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return "{" + pairs.join(",") + "}";
|
|
51
|
+
}
|
|
52
|
+
//#endregion
|
|
53
|
+
//#region src/cache/invalidation-epoch.ts
|
|
54
|
+
/**
|
|
55
|
+
* Per-process invalidation epoch tracking for timber.cache (TIM-1028).
|
|
56
|
+
*
|
|
57
|
+
* handler.set for a cache miss runs after `fn()` resolves. An explicit
|
|
58
|
+
* `cache.invalidate({ tag })` / `revalidateTag` that lands while fn is in
|
|
59
|
+
* flight would otherwise be silently undone — the just-invalidated value
|
|
60
|
+
* re-stored as fresh for the full TTL, resurrecting pre-mutation data.
|
|
61
|
+
*
|
|
62
|
+
* Every invalidation bumps a monotonic epoch and records it against the
|
|
63
|
+
* invalidated key/tag. Before storing a result, the cache wrapper checks
|
|
64
|
+
* whether its key or any of its tags were invalidated after fn started and
|
|
65
|
+
* skips the write if so. Skipping is always safe: the only cost is one
|
|
66
|
+
* extra cache miss on the next call.
|
|
67
|
+
*
|
|
68
|
+
* Scope: per-process, like the singleflight map. An invalidation issued by
|
|
69
|
+
* another instance against a shared handler (Redis/KV) during fn flight is
|
|
70
|
+
* not observable here — closing that window fully would require store-level
|
|
71
|
+
* versioning, which no CacheHandler backend offers.
|
|
72
|
+
*/
|
|
73
|
+
var epoch = 0;
|
|
74
|
+
/**
|
|
75
|
+
* Last-invalidated epoch per `key:<k>` / `tag:<t>` entry. Insertion order is
|
|
76
|
+
* epoch order (entries are re-inserted on update), so the oldest entry is
|
|
77
|
+
* always first — pruning evicts lowest epochs.
|
|
78
|
+
*/
|
|
79
|
+
var lastInvalidated = /* @__PURE__ */ new Map();
|
|
80
|
+
/**
|
|
81
|
+
* Bound on tracked entries so high-cardinality tag invalidation (e.g.
|
|
82
|
+
* per-user tags) cannot grow this map without limit.
|
|
83
|
+
*/
|
|
84
|
+
var MAX_TRACKED_ENTRIES = 1e4;
|
|
85
|
+
/**
|
|
86
|
+
* Highest epoch evicted from the map. Any execution that started at or
|
|
87
|
+
* before this epoch conservatively counts as invalidated — history was
|
|
88
|
+
* truncated, so we can no longer prove it wasn't.
|
|
89
|
+
*/
|
|
90
|
+
var evictedEpochFloor = 0;
|
|
91
|
+
/** The current epoch. Capture before running fn(), pass to wasInvalidatedSince. */
|
|
92
|
+
function currentInvalidationEpoch() {
|
|
93
|
+
return epoch;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Record an invalidation. Call BEFORE handler.invalidate() so an execution
|
|
97
|
+
* whose set-check races the invalidation errs toward skipping the write.
|
|
98
|
+
*/
|
|
99
|
+
function recordInvalidation(opts) {
|
|
100
|
+
epoch++;
|
|
101
|
+
if (opts.key) track(`key:${opts.key}`);
|
|
102
|
+
if (opts.tag) track(`tag:${opts.tag}`);
|
|
103
|
+
}
|
|
104
|
+
function track(entry) {
|
|
105
|
+
lastInvalidated.delete(entry);
|
|
106
|
+
lastInvalidated.set(entry, epoch);
|
|
107
|
+
while (lastInvalidated.size > MAX_TRACKED_ENTRIES) {
|
|
108
|
+
const oldest = lastInvalidated.entries().next().value;
|
|
109
|
+
if (oldest === void 0) break;
|
|
110
|
+
evictedEpochFloor = Math.max(evictedEpochFloor, oldest[1]);
|
|
111
|
+
lastInvalidated.delete(oldest[0]);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Whether the key or any tag was invalidated after `startEpoch` (the epoch
|
|
116
|
+
* captured when fn started executing).
|
|
117
|
+
*/
|
|
118
|
+
function wasInvalidatedSince(startEpoch, key, tags) {
|
|
119
|
+
return lastInvalidationEpochFor(key, tags) > startEpoch;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* The highest epoch at which the key or any of the tags was invalidated
|
|
123
|
+
* (0 if never). Used to scope the singleflight key: callers arriving after
|
|
124
|
+
* an invalidation must not coalesce onto a flight that started before it —
|
|
125
|
+
* they would receive the pre-invalidation result the invalidation was
|
|
126
|
+
* issued to discard.
|
|
127
|
+
*/
|
|
128
|
+
function lastInvalidationEpochFor(key, tags) {
|
|
129
|
+
let last = evictedEpochFloor;
|
|
130
|
+
const keyEpoch = lastInvalidated.get(`key:${key}`);
|
|
131
|
+
if (keyEpoch !== void 0 && keyEpoch > last) last = keyEpoch;
|
|
132
|
+
for (const tag of tags) {
|
|
133
|
+
const tagEpoch = lastInvalidated.get(`tag:${tag}`);
|
|
134
|
+
if (tagEpoch !== void 0 && tagEpoch > last) last = tagEpoch;
|
|
135
|
+
}
|
|
136
|
+
return last;
|
|
137
|
+
}
|
|
138
|
+
//#endregion
|
|
139
|
+
//#region src/cache/timber-cache.ts
|
|
140
|
+
var defaultSingleflight = createSingleflight();
|
|
141
|
+
/**
|
|
142
|
+
* Per-key monotonic generation counter for CAS writes (TIM-1158).
|
|
143
|
+
*
|
|
144
|
+
* Unbounded, like the singleflight map — the key space is the same set of
|
|
145
|
+
* cache keys the handler already tracks. Pruning was removed because it
|
|
146
|
+
* desyncs from MemoryCacheHandler.generations: a pruned key restarts at 1
|
|
147
|
+
* while the handler still holds the old higher generation, causing fresh
|
|
148
|
+
* writes to be rejected as stale.
|
|
149
|
+
*/
|
|
150
|
+
var writeGenerations = /* @__PURE__ */ new Map();
|
|
151
|
+
function nextGeneration(key) {
|
|
152
|
+
const gen = (writeGenerations.get(key) ?? 0) + 1;
|
|
153
|
+
writeGenerations.set(key, gen);
|
|
154
|
+
return gen;
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Set the timeout for the module-level default singleflight.
|
|
158
|
+
* Called at framework boot with renderTimeoutMs from timber.config.ts so that
|
|
159
|
+
* cache calls without a per-call timeoutMs still get deadlock protection.
|
|
160
|
+
* See design/06-caching.md §"Singleflight Timeout — Deadlock Risk".
|
|
161
|
+
*/
|
|
162
|
+
function setDefaultSingleflightTimeout(timeoutMs) {
|
|
163
|
+
defaultSingleflight = createSingleflight({ timeoutMs });
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Generate a cache key from function identity and serialized args.
|
|
167
|
+
*
|
|
168
|
+
* Uses FNV-1a (fast non-crypto hash) instead of SHA-256. Cache keys don't
|
|
169
|
+
* need collision resistance — they need speed. The fnId prefix provides
|
|
170
|
+
* namespace isolation; the hash covers the args.
|
|
171
|
+
*
|
|
172
|
+
* See TIM-370 for perf motivation.
|
|
173
|
+
*/
|
|
174
|
+
function defaultKeyGenerator(fnId, args) {
|
|
175
|
+
const raw = fnId + ":" + stableStringify(args);
|
|
176
|
+
return fnId + ":" + fnv1aHash(raw);
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Resolve tags from the options — supports static array or function form.
|
|
180
|
+
*/
|
|
181
|
+
function resolveTags(opts, args) {
|
|
182
|
+
if (!opts.tags) return [];
|
|
183
|
+
if (Array.isArray(opts.tags)) return opts.tags;
|
|
184
|
+
return opts.tags(...args);
|
|
185
|
+
}
|
|
186
|
+
/** Per-process count of byte-identical fn sources seen by deriveFallbackFnId. */
|
|
187
|
+
var fallbackIdOccurrences = /* @__PURE__ */ new Map();
|
|
188
|
+
var hasWarnedFallbackId = false;
|
|
189
|
+
/**
|
|
190
|
+
* Derive a fallback fnId for callsites the timber-cache-transform Vite plugin
|
|
191
|
+
* could not statically detect (aliased bindings, user re-export wrappers).
|
|
192
|
+
*
|
|
193
|
+
* The base is fnv1a(fn.toString()) — deterministic across instances and cold
|
|
194
|
+
* starts of the same build, so two *different* functions can never swap fnIds
|
|
195
|
+
* by module-evaluation order (the TIM-997 poisoning scenario that the old
|
|
196
|
+
* process-local counter allowed; see TIM-1054). A per-process occurrence
|
|
197
|
+
* suffix disambiguates byte-identical duplicate sources. That residue is the
|
|
198
|
+
* one remaining hazard: closures produced by the same factory share source
|
|
199
|
+
* text but capture different values, and their occurrence order may differ
|
|
200
|
+
* across instances — such callsites need an explicit `key` option.
|
|
201
|
+
*/
|
|
202
|
+
function deriveFallbackFnId(fn) {
|
|
203
|
+
const sourceHash = fnv1aHash(fn.toString());
|
|
204
|
+
const occurrence = fallbackIdOccurrences.get(sourceHash) ?? 0;
|
|
205
|
+
fallbackIdOccurrences.set(sourceHash, occurrence + 1);
|
|
206
|
+
if (!hasWarnedFallbackId && typeof process !== "undefined" && process.env.NODE_ENV !== "test") {
|
|
207
|
+
hasWarnedFallbackId = true;
|
|
208
|
+
console.warn("[timber] cache() callsite has no build-time stable ID and no explicit `key` option — the call is not statically visible to the timber Vite plugin (e.g. an aliased binding like `const c = cache` or a re-export wrapper module). Falling back to a function-source hash for the cache key. With a shared CacheHandler (Redis/KV) this is safe for distinct functions, but byte-identical closures from a factory can swap cache entries across instances. Provide an explicit `key` option to make the cache key contract stable and auditable.");
|
|
209
|
+
}
|
|
210
|
+
return `timber-cache:fn:${sourceHash}:${occurrence}`;
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Creates a cached wrapper around an async function.
|
|
214
|
+
*
|
|
215
|
+
* - FNV-1a default keys with normalized JSON args
|
|
216
|
+
* - Singleflight: concurrent misses → single execution AND single
|
|
217
|
+
* handler.set — the write happens inside the coalesced callback (TIM-1028)
|
|
218
|
+
* - Writes are skipped when the key/tags were invalidated while fn was in
|
|
219
|
+
* flight, so explicit invalidation is never silently undone (TIM-1028)
|
|
220
|
+
* - SWR: serve stale immediately, background refetch
|
|
221
|
+
* - Tags as string[] or function of args
|
|
222
|
+
* - The handler is resolved per invocation via `getHandler`, never captured
|
|
223
|
+
* at wrapper-creation time — module-scope cache() wrappers created before
|
|
224
|
+
* the framework's boot wiring calls setCacheHandler() still use the
|
|
225
|
+
* configured handler once it arrives (TIM-1029)
|
|
226
|
+
* - No ALS dependency for correctness — cache() works outside a request
|
|
227
|
+
* context. The waitUntil ALS bridge is read optionally so the SWR
|
|
228
|
+
* background refetch survives handler return on Workers/Lambda.
|
|
229
|
+
*
|
|
230
|
+
* Cache hits/misses are recorded as OTEL span events on the enclosing
|
|
231
|
+
* span (not child spans). The DevSpanProcessor reads these for dev log output.
|
|
232
|
+
*/
|
|
233
|
+
function createCache(fn, opts, getHandler, stableId) {
|
|
234
|
+
const fnId = stableId ?? (opts.key ? void 0 : deriveFallbackFnId(fn));
|
|
235
|
+
const perCallSf = opts.timeoutMs !== void 0 ? createSingleflight({ timeoutMs: opts.timeoutMs }) : void 0;
|
|
236
|
+
return (async (...args) => {
|
|
237
|
+
const sf = perCallSf ?? defaultSingleflight;
|
|
238
|
+
const key = opts.key ? opts.key(...args) : defaultKeyGenerator(fnId, args);
|
|
239
|
+
const cacheStart = performance.now();
|
|
240
|
+
const cached = await getHandler().get(key);
|
|
241
|
+
if (cached && !cached.stale) {
|
|
242
|
+
addSpanEventSync("timber.cache.hit", {
|
|
243
|
+
key,
|
|
244
|
+
duration_ms: Math.round(performance.now() - cacheStart)
|
|
245
|
+
});
|
|
246
|
+
return cached.value;
|
|
247
|
+
}
|
|
248
|
+
const tags = resolveTags(opts, args);
|
|
249
|
+
const flightKey = `${key}\u0000${lastInvalidationEpochFor(key, tags)}`;
|
|
250
|
+
/**
|
|
251
|
+
* Run fn and store the result — exactly once per coalesced execution,
|
|
252
|
+
* inside the singleflight callback. The write is skipped when:
|
|
253
|
+
* - the key/tags were invalidated after fn started (TIM-1028), or
|
|
254
|
+
* - the singleflight timed out (signal aborted) — the timed-out
|
|
255
|
+
* flight's write could overwrite a newer value from a subsequent
|
|
256
|
+
* flight (TIM-1092), or
|
|
257
|
+
* - the handler rejects the write because a newer generation has
|
|
258
|
+
* already been stored (TIM-1158 CAS guard).
|
|
259
|
+
*/
|
|
260
|
+
const executeAndStore = async (signal) => {
|
|
261
|
+
const startEpoch = currentInvalidationEpoch();
|
|
262
|
+
const generation = nextGeneration(key);
|
|
263
|
+
const result = await fn(...args);
|
|
264
|
+
if (!signal.aborted && !wasInvalidatedSince(startEpoch, key, tags)) try {
|
|
265
|
+
await getHandler().set(key, result, {
|
|
266
|
+
ttl: opts.ttl,
|
|
267
|
+
tags,
|
|
268
|
+
generation
|
|
269
|
+
});
|
|
270
|
+
} catch (err) {
|
|
271
|
+
swallow(err, `cache set failed for key "${key}"`);
|
|
272
|
+
}
|
|
273
|
+
return result;
|
|
274
|
+
};
|
|
275
|
+
if (cached && cached.stale && opts.staleWhileRevalidate) {
|
|
276
|
+
addSpanEventSync("timber.cache.hit", {
|
|
277
|
+
key,
|
|
278
|
+
duration_ms: Math.round(performance.now() - cacheStart),
|
|
279
|
+
stale: true
|
|
280
|
+
});
|
|
281
|
+
const refetch = sf.do(`swr:${flightKey}`, async (signal) => {
|
|
282
|
+
try {
|
|
283
|
+
await executeAndStore(signal);
|
|
284
|
+
} catch (err) {
|
|
285
|
+
logSwrRefetchFailed({
|
|
286
|
+
cacheKey: key,
|
|
287
|
+
error: err
|
|
288
|
+
});
|
|
289
|
+
}
|
|
290
|
+
}).catch(() => {});
|
|
291
|
+
getWaitUntil()?.(refetch);
|
|
292
|
+
return cached.value;
|
|
293
|
+
}
|
|
294
|
+
const result = await sf.do(flightKey, executeAndStore);
|
|
295
|
+
addSpanEventSync("timber.cache.miss", {
|
|
296
|
+
key,
|
|
297
|
+
duration_ms: Math.round(performance.now() - cacheStart)
|
|
298
|
+
});
|
|
299
|
+
return result;
|
|
300
|
+
});
|
|
301
|
+
}
|
|
302
|
+
//#endregion
|
|
303
|
+
//#region src/cache/handler-store.ts
|
|
304
|
+
var handler = null;
|
|
305
|
+
var explicitlyConfigured = false;
|
|
306
|
+
/** Replace the active cache handler. Called by the framework at boot. */
|
|
307
|
+
function setCacheHandler(h) {
|
|
308
|
+
handler = h;
|
|
309
|
+
explicitlyConfigured = true;
|
|
310
|
+
}
|
|
311
|
+
/** Whether the handler was explicitly configured (vs the default in-memory fallback). */
|
|
312
|
+
function isCacheHandlerConfigured() {
|
|
313
|
+
return explicitlyConfigured;
|
|
314
|
+
}
|
|
315
|
+
/**
|
|
316
|
+
* Get the active cache handler. Creates a default MemoryCacheHandler on
|
|
317
|
+
* first access if none has been set via setCacheHandler().
|
|
318
|
+
*/
|
|
319
|
+
function getCacheHandler() {
|
|
320
|
+
if (!handler) handler = createDefaultHandler();
|
|
321
|
+
return handler;
|
|
322
|
+
}
|
|
323
|
+
function createDefaultHandler() {
|
|
324
|
+
const store = /* @__PURE__ */ new Map();
|
|
325
|
+
const maxEntries = 1e3;
|
|
326
|
+
return {
|
|
327
|
+
async get(key) {
|
|
328
|
+
const entry = store.get(key);
|
|
329
|
+
if (!entry) return null;
|
|
330
|
+
store.delete(key);
|
|
331
|
+
store.set(key, entry);
|
|
332
|
+
const stale = Date.now() > entry.expiresAt;
|
|
333
|
+
return {
|
|
334
|
+
value: entry.value,
|
|
335
|
+
stale
|
|
336
|
+
};
|
|
337
|
+
},
|
|
338
|
+
async set(key, value, opts) {
|
|
339
|
+
if (store.has(key)) store.delete(key);
|
|
340
|
+
while (store.size >= maxEntries) {
|
|
341
|
+
const oldest = store.keys().next().value;
|
|
342
|
+
if (oldest !== void 0) store.delete(oldest);
|
|
343
|
+
else break;
|
|
344
|
+
}
|
|
345
|
+
store.set(key, {
|
|
346
|
+
value,
|
|
347
|
+
expiresAt: Date.now() + opts.ttl * 1e3,
|
|
348
|
+
tags: opts.tags
|
|
349
|
+
});
|
|
350
|
+
},
|
|
351
|
+
async invalidate(opts) {
|
|
352
|
+
if (opts.key) store.delete(opts.key);
|
|
353
|
+
if (opts.tag) {
|
|
354
|
+
for (const [key, entry] of store) if (entry.tags.includes(opts.tag)) store.delete(key);
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
};
|
|
358
|
+
}
|
|
359
|
+
//#endregion
|
|
360
|
+
//#region src/cache/redis-handler.ts
|
|
361
|
+
var KEY_PREFIX = "timber:cache:";
|
|
362
|
+
var TAG_PREFIX = "timber:tag:";
|
|
363
|
+
/**
|
|
364
|
+
* Redis-backed CacheHandler for distributed caching.
|
|
365
|
+
*
|
|
366
|
+
* All instances sharing the same Redis see each other's cache entries and
|
|
367
|
+
* invalidations. Tag-based invalidation uses Redis Sets to track which keys
|
|
368
|
+
* belong to which tags.
|
|
369
|
+
*
|
|
370
|
+
* Bring your own Redis client wrapped to the {@link RedisClient} contract —
|
|
371
|
+
* see the adapter examples on the interface for ioredis, node-redis v4, and
|
|
372
|
+
* @upstash/redis.
|
|
373
|
+
*/
|
|
374
|
+
var RedisCacheHandler = class {
|
|
375
|
+
client;
|
|
376
|
+
prefix;
|
|
377
|
+
constructor(client, opts) {
|
|
378
|
+
this.client = client;
|
|
379
|
+
this.prefix = opts?.prefix ?? "";
|
|
380
|
+
}
|
|
381
|
+
cacheKey(key) {
|
|
382
|
+
return `${this.prefix}${KEY_PREFIX}${key}`;
|
|
383
|
+
}
|
|
384
|
+
tagKey(tag) {
|
|
385
|
+
return `${this.prefix}${TAG_PREFIX}${tag}`;
|
|
386
|
+
}
|
|
387
|
+
async get(key) {
|
|
388
|
+
const raw = await this.client.get(this.cacheKey(key));
|
|
389
|
+
if (raw === null) return null;
|
|
390
|
+
const entry = JSON.parse(raw);
|
|
391
|
+
const stale = Date.now() > entry.expiresAt;
|
|
392
|
+
return {
|
|
393
|
+
value: entry.value,
|
|
394
|
+
stale
|
|
395
|
+
};
|
|
396
|
+
}
|
|
397
|
+
async set(key, value, opts) {
|
|
398
|
+
warnLossyJsonValue(value, key);
|
|
399
|
+
const ck = this.cacheKey(key);
|
|
400
|
+
const expiresAt = Date.now() + opts.ttl * 1e3;
|
|
401
|
+
const payload = JSON.stringify({
|
|
402
|
+
value,
|
|
403
|
+
expiresAt,
|
|
404
|
+
tags: opts.tags
|
|
405
|
+
});
|
|
406
|
+
const redisTtlSeconds = Math.max(opts.ttl * 2 + 60, 120);
|
|
407
|
+
const writeOps = [];
|
|
408
|
+
for (const tag of opts.tags) {
|
|
409
|
+
writeOps.push({
|
|
410
|
+
op: "sadd",
|
|
411
|
+
key: this.tagKey(tag),
|
|
412
|
+
members: [key]
|
|
413
|
+
});
|
|
414
|
+
writeOps.push({
|
|
415
|
+
op: "expireNX",
|
|
416
|
+
key: this.tagKey(tag),
|
|
417
|
+
seconds: redisTtlSeconds
|
|
418
|
+
});
|
|
419
|
+
writeOps.push({
|
|
420
|
+
op: "expireGT",
|
|
421
|
+
key: this.tagKey(tag),
|
|
422
|
+
seconds: redisTtlSeconds
|
|
423
|
+
});
|
|
424
|
+
}
|
|
425
|
+
writeOps.push({
|
|
426
|
+
op: "set",
|
|
427
|
+
key: ck,
|
|
428
|
+
value: payload,
|
|
429
|
+
ttlSeconds: redisTtlSeconds
|
|
430
|
+
});
|
|
431
|
+
if (this.client.execMulti) await this.client.execMulti(writeOps);
|
|
432
|
+
else for (const op of writeOps) await this.execOp(op);
|
|
433
|
+
}
|
|
434
|
+
async execOp(op) {
|
|
435
|
+
switch (op.op) {
|
|
436
|
+
case "set":
|
|
437
|
+
await this.client.set(op.key, op.value, op.ttlSeconds);
|
|
438
|
+
break;
|
|
439
|
+
case "sadd":
|
|
440
|
+
await this.client.sadd(op.key, ...op.members);
|
|
441
|
+
break;
|
|
442
|
+
case "expireNX":
|
|
443
|
+
await this.client.expireNX(op.key, op.seconds);
|
|
444
|
+
break;
|
|
445
|
+
case "expireGT":
|
|
446
|
+
await this.client.expireGT(op.key, op.seconds);
|
|
447
|
+
break;
|
|
448
|
+
case "del": await this.client.del(op.key);
|
|
449
|
+
}
|
|
450
|
+
}
|
|
451
|
+
async invalidate(opts) {
|
|
452
|
+
if (opts.key) {
|
|
453
|
+
const raw = await this.client.get(this.cacheKey(opts.key));
|
|
454
|
+
if (raw !== null) {
|
|
455
|
+
const entry = JSON.parse(raw);
|
|
456
|
+
if (entry.tags) await Promise.all(entry.tags.map((tag) => this.client.srem(this.tagKey(tag), opts.key)));
|
|
457
|
+
}
|
|
458
|
+
await this.client.del(this.cacheKey(opts.key));
|
|
459
|
+
}
|
|
460
|
+
if (opts.tag) {
|
|
461
|
+
const tk = this.tagKey(opts.tag);
|
|
462
|
+
const keys = await this.client.smembers(tk);
|
|
463
|
+
await Promise.all(keys.map(async (k) => {
|
|
464
|
+
const raw = await this.client.get(this.cacheKey(k));
|
|
465
|
+
if (raw === null) {
|
|
466
|
+
await this.client.srem(tk, k);
|
|
467
|
+
return;
|
|
468
|
+
}
|
|
469
|
+
if (JSON.parse(raw).tags?.includes(opts.tag)) await this.client.del(this.cacheKey(k));
|
|
470
|
+
await this.client.srem(tk, k);
|
|
471
|
+
}));
|
|
472
|
+
if ((await this.client.smembers(tk)).length === 0) await this.client.del(tk);
|
|
473
|
+
}
|
|
474
|
+
}
|
|
475
|
+
};
|
|
476
|
+
//#endregion
|
|
477
|
+
//#region src/cache/tag-aware-handler.ts
|
|
478
|
+
var DATA_PREFIX = "d:";
|
|
479
|
+
var TAG_SET_PREFIX = "ts:";
|
|
480
|
+
var TAG_VERSION_PREFIX = "tv:";
|
|
481
|
+
function detectStrategy(store) {
|
|
482
|
+
if (store.setWithTags && store.invalidateTag) return "native";
|
|
483
|
+
if (store.sadd && store.smembers && store.srem && store.sdel) return "eager";
|
|
484
|
+
return "lazy";
|
|
485
|
+
}
|
|
486
|
+
var TagAwareCacheHandler = class {
|
|
487
|
+
store;
|
|
488
|
+
prefix;
|
|
489
|
+
strategy;
|
|
490
|
+
constructor(store, opts) {
|
|
491
|
+
this.store = store;
|
|
492
|
+
this.prefix = opts?.prefix ?? "timber:";
|
|
493
|
+
this.strategy = detectStrategy(store);
|
|
494
|
+
}
|
|
495
|
+
get consistency() {
|
|
496
|
+
return this.store.consistency;
|
|
497
|
+
}
|
|
498
|
+
dataKey(key) {
|
|
499
|
+
return `${this.prefix}${DATA_PREFIX}${key}`;
|
|
500
|
+
}
|
|
501
|
+
/** Namespace tags for native stores so prefix isolates shared stores. */
|
|
502
|
+
prefixTags(tags) {
|
|
503
|
+
return tags.map((t) => `${this.prefix}${t}`);
|
|
504
|
+
}
|
|
505
|
+
tagSetKey(tag) {
|
|
506
|
+
return `${this.prefix}${TAG_SET_PREFIX}${tag}`;
|
|
507
|
+
}
|
|
508
|
+
tagVersionKey(tag) {
|
|
509
|
+
return `${this.prefix}${TAG_VERSION_PREFIX}${tag}`;
|
|
510
|
+
}
|
|
511
|
+
async get(key) {
|
|
512
|
+
const raw = await this.store.get(this.dataKey(key));
|
|
513
|
+
if (raw === null) return null;
|
|
514
|
+
if (this.strategy === "native" || this.strategy === "eager") {
|
|
515
|
+
const entry = JSON.parse(raw);
|
|
516
|
+
const stale = Date.now() > entry.expiresAt;
|
|
517
|
+
return {
|
|
518
|
+
value: entry.value,
|
|
519
|
+
stale
|
|
520
|
+
};
|
|
521
|
+
}
|
|
522
|
+
const entry = JSON.parse(raw);
|
|
523
|
+
if (entry.tags.length > 0) {
|
|
524
|
+
const currentVersions = await this.getTagVersions(entry.tags);
|
|
525
|
+
for (const tag of entry.tags) {
|
|
526
|
+
const stored = entry.tagVersions[tag] ?? 0;
|
|
527
|
+
if ((currentVersions[tag] ?? 0) > stored) return null;
|
|
528
|
+
}
|
|
529
|
+
}
|
|
530
|
+
const stale = Date.now() > entry.expiresAt;
|
|
531
|
+
return {
|
|
532
|
+
value: entry.value,
|
|
533
|
+
stale
|
|
534
|
+
};
|
|
535
|
+
}
|
|
536
|
+
async set(key, value, opts) {
|
|
537
|
+
const physicalTtl = Math.max(opts.ttl * 2 + 60, 120);
|
|
538
|
+
if (this.strategy === "native") {
|
|
539
|
+
const entry = {
|
|
540
|
+
value,
|
|
541
|
+
expiresAt: Date.now() + opts.ttl * 1e3,
|
|
542
|
+
tags: opts.tags
|
|
543
|
+
};
|
|
544
|
+
const payload = JSON.stringify(entry);
|
|
545
|
+
if (opts.tags.length > 0) await this.store.setWithTags(this.dataKey(key), payload, physicalTtl, this.prefixTags(opts.tags));
|
|
546
|
+
else await this.store.set(this.dataKey(key), payload, physicalTtl);
|
|
547
|
+
return;
|
|
548
|
+
}
|
|
549
|
+
if (this.strategy === "eager") {
|
|
550
|
+
const entry = {
|
|
551
|
+
value,
|
|
552
|
+
expiresAt: Date.now() + opts.ttl * 1e3,
|
|
553
|
+
tags: opts.tags
|
|
554
|
+
};
|
|
555
|
+
await this.store.set(this.dataKey(key), JSON.stringify(entry), physicalTtl);
|
|
556
|
+
if (opts.tags.length > 0) await Promise.all(opts.tags.map((tag) => this.store.sadd(this.tagSetKey(tag), [key], physicalTtl)));
|
|
557
|
+
return;
|
|
558
|
+
}
|
|
559
|
+
const tagVersions = opts.tags.length > 0 ? await this.getTagVersions(opts.tags) : {};
|
|
560
|
+
const entry = {
|
|
561
|
+
value,
|
|
562
|
+
expiresAt: Date.now() + opts.ttl * 1e3,
|
|
563
|
+
tags: opts.tags,
|
|
564
|
+
tagVersions
|
|
565
|
+
};
|
|
566
|
+
await this.store.set(this.dataKey(key), JSON.stringify(entry), physicalTtl);
|
|
567
|
+
}
|
|
568
|
+
async invalidate(opts) {
|
|
569
|
+
if (opts.key) {
|
|
570
|
+
if (this.strategy === "eager") {
|
|
571
|
+
const raw = await this.store.get(this.dataKey(opts.key));
|
|
572
|
+
if (raw !== null) {
|
|
573
|
+
const entry = JSON.parse(raw);
|
|
574
|
+
if (entry.tags.length > 0) await Promise.all(entry.tags.map((tag) => this.store.srem(this.tagSetKey(tag), [opts.key])));
|
|
575
|
+
}
|
|
576
|
+
}
|
|
577
|
+
await this.store.del(this.dataKey(opts.key));
|
|
578
|
+
}
|
|
579
|
+
if (opts.tag) {
|
|
580
|
+
const tag = opts.tag;
|
|
581
|
+
if (this.strategy === "native") await this.store.invalidateTag(`${this.prefix}${tag}`);
|
|
582
|
+
else if (this.strategy === "eager") {
|
|
583
|
+
const members = await this.store.smembers(this.tagSetKey(tag));
|
|
584
|
+
await Promise.all(members.map(async (k) => {
|
|
585
|
+
const raw = await this.store.get(this.dataKey(k));
|
|
586
|
+
if (raw === null) {
|
|
587
|
+
await this.store.srem(this.tagSetKey(tag), [k]);
|
|
588
|
+
return;
|
|
589
|
+
}
|
|
590
|
+
if (JSON.parse(raw).tags.includes(tag)) {
|
|
591
|
+
await this.store.del(this.dataKey(k));
|
|
592
|
+
await this.store.srem(this.tagSetKey(tag), [k]);
|
|
593
|
+
} else await this.store.srem(this.tagSetKey(tag), [k]);
|
|
594
|
+
}));
|
|
595
|
+
} else await this.bumpTagVersion(opts.tag);
|
|
596
|
+
}
|
|
597
|
+
}
|
|
598
|
+
async getTagVersions(tags) {
|
|
599
|
+
const versions = {};
|
|
600
|
+
await Promise.all(tags.map(async (tag) => {
|
|
601
|
+
const raw = await this.store.get(this.tagVersionKey(tag));
|
|
602
|
+
versions[tag] = raw !== null ? parseInt(raw, 10) : 0;
|
|
603
|
+
}));
|
|
604
|
+
return versions;
|
|
605
|
+
}
|
|
606
|
+
async bumpTagVersion(tag) {
|
|
607
|
+
const key = this.tagVersionKey(tag);
|
|
608
|
+
const raw = await this.store.get(key);
|
|
609
|
+
const version = Math.max(raw !== null ? parseInt(raw, 10) : 0, Date.now()) + 1;
|
|
610
|
+
await this.store.set(key, String(version), 31536e3);
|
|
611
|
+
}
|
|
612
|
+
};
|
|
613
|
+
//#endregion
|
|
614
|
+
//#region src/cache/index.ts
|
|
615
|
+
var MemoryCacheHandler = class {
|
|
616
|
+
store = /* @__PURE__ */ new Map();
|
|
617
|
+
generations = /* @__PURE__ */ new Map();
|
|
618
|
+
maxEntries;
|
|
619
|
+
maxBytes;
|
|
620
|
+
maxEntryBytes;
|
|
621
|
+
currentBytes = 0;
|
|
622
|
+
_trackBytes;
|
|
623
|
+
constructor(opts) {
|
|
624
|
+
this.maxEntries = opts?.maxEntries ?? opts?.maxSize ?? 1e3;
|
|
625
|
+
this.maxBytes = opts?.maxBytes;
|
|
626
|
+
this.maxEntryBytes = opts?.maxEntryBytes;
|
|
627
|
+
this._trackBytes = this.maxBytes !== void 0 || this.maxEntryBytes !== void 0;
|
|
628
|
+
}
|
|
629
|
+
async get(key) {
|
|
630
|
+
const entry = this.store.get(key);
|
|
631
|
+
if (!entry) return null;
|
|
632
|
+
this.store.delete(key);
|
|
633
|
+
this.store.set(key, entry);
|
|
634
|
+
const stale = Date.now() > entry.expiresAt;
|
|
635
|
+
return {
|
|
636
|
+
value: entry.value,
|
|
637
|
+
stale
|
|
638
|
+
};
|
|
639
|
+
}
|
|
640
|
+
async set(key, value, opts) {
|
|
641
|
+
if (opts.generation !== void 0) {
|
|
642
|
+
const current = this.generations.get(key) ?? 0;
|
|
643
|
+
if (opts.generation < current) return;
|
|
644
|
+
}
|
|
645
|
+
const byteSize = this._trackBytes ? estimateByteSize(value) : 0;
|
|
646
|
+
if (this.maxEntryBytes !== void 0 && byteSize > this.maxEntryBytes) return;
|
|
647
|
+
if (this.store.has(key)) {
|
|
648
|
+
const existing = this.store.get(key);
|
|
649
|
+
this.currentBytes -= existing.byteSize;
|
|
650
|
+
this.store.delete(key);
|
|
651
|
+
}
|
|
652
|
+
while (this.store.size >= this.maxEntries) this.evictOldest();
|
|
653
|
+
if (this.maxBytes !== void 0) {
|
|
654
|
+
while (this.currentBytes + byteSize > this.maxBytes && this.store.size > 0) this.evictOldest();
|
|
655
|
+
if (this.currentBytes + byteSize > this.maxBytes) return;
|
|
656
|
+
}
|
|
657
|
+
if (opts.generation !== void 0) this.generations.set(key, opts.generation);
|
|
658
|
+
this.store.set(key, {
|
|
659
|
+
value,
|
|
660
|
+
expiresAt: Date.now() + opts.ttl * 1e3,
|
|
661
|
+
tags: opts.tags,
|
|
662
|
+
byteSize
|
|
663
|
+
});
|
|
664
|
+
this.currentBytes += byteSize;
|
|
665
|
+
}
|
|
666
|
+
async invalidate(opts) {
|
|
667
|
+
if (opts.key) {
|
|
668
|
+
const entry = this.store.get(opts.key);
|
|
669
|
+
if (entry) {
|
|
670
|
+
this.currentBytes -= entry.byteSize;
|
|
671
|
+
this.store.delete(opts.key);
|
|
672
|
+
}
|
|
673
|
+
this.generations.delete(opts.key);
|
|
674
|
+
}
|
|
675
|
+
if (opts.tag) {
|
|
676
|
+
for (const [key, entry] of this.store) if (entry.tags.includes(opts.tag)) {
|
|
677
|
+
this.currentBytes -= entry.byteSize;
|
|
678
|
+
this.store.delete(key);
|
|
679
|
+
this.generations.delete(key);
|
|
680
|
+
}
|
|
681
|
+
}
|
|
682
|
+
}
|
|
683
|
+
/** Number of entries currently in the cache. */
|
|
684
|
+
get size() {
|
|
685
|
+
return this.store.size;
|
|
686
|
+
}
|
|
687
|
+
/** Estimated total byte size of all cached values. Only tracked when maxBytes or maxEntryBytes is configured; returns 0 otherwise. */
|
|
688
|
+
get bytes() {
|
|
689
|
+
return this.currentBytes;
|
|
690
|
+
}
|
|
691
|
+
/** Evict the oldest entry (front of Map). */
|
|
692
|
+
evictOldest() {
|
|
693
|
+
const oldest = this.store.keys().next().value;
|
|
694
|
+
if (oldest !== void 0) {
|
|
695
|
+
const entry = this.store.get(oldest);
|
|
696
|
+
this.currentBytes -= entry.byteSize;
|
|
697
|
+
this.store.delete(oldest);
|
|
698
|
+
this.generations.delete(oldest);
|
|
699
|
+
}
|
|
700
|
+
}
|
|
701
|
+
};
|
|
702
|
+
//#endregion
|
|
703
|
+
//#region src/server/version-skew.ts
|
|
704
|
+
/**
|
|
705
|
+
* Version Skew Detection — graceful recovery when stale clients hit new deployments.
|
|
706
|
+
*
|
|
707
|
+
* When a new version of the app is deployed, clients with open tabs still have
|
|
708
|
+
* the old JavaScript bundle. Without version skew handling, these stale clients
|
|
709
|
+
* will experience:
|
|
710
|
+
*
|
|
711
|
+
* 1. Server action calls that crash (action IDs are content-hashed)
|
|
712
|
+
* 2. Chunk load failures (old filenames gone from CDN)
|
|
713
|
+
* 3. RSC payload mismatches (component references differ between builds)
|
|
714
|
+
*
|
|
715
|
+
* This module implements deployment ID comparison:
|
|
716
|
+
* - A per-build deployment ID is generated at build time (see build-manifest.ts)
|
|
717
|
+
* - The client sends it via `X-Timber-Deployment-Id` header on every RSC/action request
|
|
718
|
+
* - The server compares it against the current build's ID
|
|
719
|
+
* - On mismatch: signal the client to reload (not crash)
|
|
720
|
+
*
|
|
721
|
+
* The deployment ID is always-on in production. Dev mode skips the check
|
|
722
|
+
* (HMR handles code updates without full reloads).
|
|
723
|
+
*
|
|
724
|
+
* See design/25-production-deployments.md, TIM-446
|
|
725
|
+
*/
|
|
726
|
+
/** Header sent by the client with every RSC/action request. */
|
|
727
|
+
var DEPLOYMENT_ID_HEADER = "X-Timber-Deployment-Id";
|
|
728
|
+
/** Response header that signals the client to do a full page reload. */
|
|
729
|
+
var RELOAD_HEADER = "X-Timber-Reload";
|
|
730
|
+
/**
|
|
731
|
+
* The current build's deployment ID. Set at startup from the manifest init
|
|
732
|
+
* module (globalThis.__TIMBER_DEPLOYMENT_ID__). Null in dev mode.
|
|
733
|
+
*/
|
|
734
|
+
var currentDeploymentId = null;
|
|
735
|
+
/**
|
|
736
|
+
* Get the current deployment ID. Returns null in dev mode.
|
|
737
|
+
*/
|
|
738
|
+
function getDeploymentId() {
|
|
739
|
+
return currentDeploymentId;
|
|
740
|
+
}
|
|
741
|
+
/**
|
|
742
|
+
* Check if a request's deployment ID matches the current build.
|
|
743
|
+
*
|
|
744
|
+
* Returns `{ ok: true }` when:
|
|
745
|
+
* - Dev mode (no deployment ID set — HMR handles updates)
|
|
746
|
+
* - No deployment ID header (initial page load, non-RSC request)
|
|
747
|
+
* - Deployment IDs match
|
|
748
|
+
*
|
|
749
|
+
* Returns `{ ok: false }` when:
|
|
750
|
+
* - Client sends a deployment ID that differs from the current build
|
|
751
|
+
*/
|
|
752
|
+
function checkVersionSkew(req) {
|
|
753
|
+
if (!currentDeploymentId) return {
|
|
754
|
+
ok: true,
|
|
755
|
+
clientId: null
|
|
756
|
+
};
|
|
757
|
+
const clientId = req.headers.get(DEPLOYMENT_ID_HEADER);
|
|
758
|
+
if (!clientId) return {
|
|
759
|
+
ok: true,
|
|
760
|
+
clientId: null
|
|
761
|
+
};
|
|
762
|
+
if (clientId === currentDeploymentId) return {
|
|
763
|
+
ok: true,
|
|
764
|
+
clientId
|
|
765
|
+
};
|
|
766
|
+
return {
|
|
767
|
+
ok: false,
|
|
768
|
+
clientId
|
|
769
|
+
};
|
|
770
|
+
}
|
|
771
|
+
/**
|
|
772
|
+
* Apply version skew reload headers to a response.
|
|
773
|
+
* Sets X-Timber-Reload: 1 to signal the client to do a full page reload.
|
|
774
|
+
*/
|
|
775
|
+
function applyReloadHeaders(headers) {
|
|
776
|
+
headers.set(RELOAD_HEADER, "1");
|
|
777
|
+
}
|
|
778
|
+
//#endregion
|
|
779
|
+
//#region src/server/prebuilt/manifest-tag-index.ts
|
|
780
|
+
/**
|
|
781
|
+
* Build the inverted tag → seed key index from the manifest.
|
|
782
|
+
*
|
|
783
|
+
* Returns a Map where each tag maps to the set of (componentId, cacheKey)
|
|
784
|
+
* pairs whose manifest entries carry that tag. Only entries with non-empty
|
|
785
|
+
* `tags` arrays participate.
|
|
786
|
+
*/
|
|
787
|
+
function buildTagIndex(manifest) {
|
|
788
|
+
const index = /* @__PURE__ */ new Map();
|
|
789
|
+
for (const [componentId, component] of Object.entries(manifest)) {
|
|
790
|
+
if (!component || typeof component !== "object" || !("entries" in component)) continue;
|
|
791
|
+
for (const [cacheKey, entry] of Object.entries(component.entries)) {
|
|
792
|
+
if (!entry.tags || entry.tags.length === 0) continue;
|
|
793
|
+
for (const tag of entry.tags) {
|
|
794
|
+
let list = index.get(tag);
|
|
795
|
+
if (!list) {
|
|
796
|
+
list = [];
|
|
797
|
+
index.set(tag, list);
|
|
798
|
+
}
|
|
799
|
+
list.push({
|
|
800
|
+
componentId,
|
|
801
|
+
cacheKey
|
|
802
|
+
});
|
|
803
|
+
}
|
|
804
|
+
}
|
|
805
|
+
}
|
|
806
|
+
return index;
|
|
807
|
+
}
|
|
808
|
+
//#endregion
|
|
809
|
+
//#region src/server/prebuilt/payload-source.ts
|
|
810
|
+
/**
|
|
811
|
+
* Prebuilt payload source — the adapter seam through which the runtime
|
|
812
|
+
* reads build-time flight artifacts (`.timber/dist/prebuilt/`).
|
|
813
|
+
*
|
|
814
|
+
* The runtime never touches the filesystem directly: adapters register a
|
|
815
|
+
* source at startup (Node: fs reads; Cloudflare: the assets binding —
|
|
816
|
+
* design/44-render-at-build-time.md §Adapter Integration). Artifacts are
|
|
817
|
+
* produced by the post-build capture pass (TIM-1119, prebuilt-builder.ts);
|
|
818
|
+
* adapter registration of the source is TIM-1122. Until a source is
|
|
819
|
+
* registered (adapter not wired yet, dev mode, no artifacts built), every
|
|
820
|
+
* lookup misses and cache.component wrappers render live — the designed
|
|
821
|
+
* dynamic-fallback behavior.
|
|
822
|
+
*
|
|
823
|
+
* Phase 3 (design/45 runtime tier) inserts the CacheHandler overlay lookup
|
|
824
|
+
* in front of `lookupPrebuiltPayload` — overlay first, then artifact. The
|
|
825
|
+
* single-lookup-function shape here is that seam.
|
|
826
|
+
*/
|
|
827
|
+
var source = null;
|
|
828
|
+
var manifestPromise = null;
|
|
829
|
+
/**
|
|
830
|
+
* Ceiling on the memoized manifest load. Without it, a stalled
|
|
831
|
+
* `loadManifest()` would leave `manifestPromise` pending forever and every
|
|
832
|
+
* subsequent cache.component render would await the same hung promise —
|
|
833
|
+
* the coalesced-promise deadlock class from design/13-security.md (A5).
|
|
834
|
+
* On expiry the load memoizes as null (permanent dynamic fallback, same
|
|
835
|
+
* policy as a failed load) and callers proceed immediately.
|
|
836
|
+
*/
|
|
837
|
+
var MANIFEST_LOAD_TIMEOUT_MS = 5e3;
|
|
838
|
+
/**
|
|
839
|
+
* Per-read ceiling on payload reads. The read is awaited inside a server
|
|
840
|
+
* component render — a stalled adapter promise would otherwise hang the
|
|
841
|
+
* RSC stream until the render timeout kills the whole page, when the
|
|
842
|
+
* correct degradation is a miss → live render (codex review round 4 on
|
|
843
|
+
* PR #835).
|
|
844
|
+
*/
|
|
845
|
+
var PAYLOAD_READ_TIMEOUT_MS = 5e3;
|
|
846
|
+
/** Race a source promise against a timeout that resolves to `fallback`. */
|
|
847
|
+
async function withTimeout(work, timeoutMs, fallback, onTimeout) {
|
|
848
|
+
let timer;
|
|
849
|
+
try {
|
|
850
|
+
return await Promise.race([work, new Promise((resolve) => {
|
|
851
|
+
timer = setTimeout(() => {
|
|
852
|
+
onTimeout();
|
|
853
|
+
resolve(fallback);
|
|
854
|
+
}, timeoutMs);
|
|
855
|
+
})]);
|
|
856
|
+
} finally {
|
|
857
|
+
clearTimeout(timer);
|
|
858
|
+
}
|
|
859
|
+
}
|
|
860
|
+
async function loadManifestWithTimeout(src) {
|
|
861
|
+
let manifest;
|
|
862
|
+
try {
|
|
863
|
+
manifest = await withTimeout(src.loadManifest(), MANIFEST_LOAD_TIMEOUT_MS, null, () => {
|
|
864
|
+
console.error(`[timber] prebuilt manifest load exceeded ${MANIFEST_LOAD_TIMEOUT_MS}ms — all cache.component lookups will render dynamically`);
|
|
865
|
+
});
|
|
866
|
+
} catch (error) {
|
|
867
|
+
console.error("[timber] failed to load prebuilt manifest — all cache.component lookups will miss:", error);
|
|
868
|
+
return null;
|
|
869
|
+
}
|
|
870
|
+
if (manifest) initTagIndex(manifest);
|
|
871
|
+
return manifest;
|
|
872
|
+
}
|
|
873
|
+
/**
|
|
874
|
+
* Register the payload source. Called once at server startup by the
|
|
875
|
+
* adapter/entry wiring (TIM-1122); tests inject fakes. Passing null
|
|
876
|
+
* unregisters (and drops the memoized manifest).
|
|
877
|
+
*/
|
|
878
|
+
function setPrebuiltPayloadSource(next) {
|
|
879
|
+
source = next;
|
|
880
|
+
manifestPromise = null;
|
|
881
|
+
if (!next) resetTagIndex();
|
|
882
|
+
}
|
|
883
|
+
/**
|
|
884
|
+
* Whether a source is registered — the gate for both marker emission and
|
|
885
|
+
* splice-transform installation. False means zero prebuilt overhead.
|
|
886
|
+
*/
|
|
887
|
+
function hasPrebuiltPayloadSource() {
|
|
888
|
+
return source !== null;
|
|
889
|
+
}
|
|
890
|
+
/**
|
|
891
|
+
* Ensure the manifest is loaded (and the tag index initialized). No-op
|
|
892
|
+
* when no source is registered. Used by the tombstone path to avoid
|
|
893
|
+
* skipping tombstones on cold processes where the first request is an
|
|
894
|
+
* action rather than a page render.
|
|
895
|
+
*/
|
|
896
|
+
async function ensureManifestLoaded() {
|
|
897
|
+
if (source === null) return;
|
|
898
|
+
manifestPromise ??= loadManifestWithTimeout(source);
|
|
899
|
+
await manifestPromise;
|
|
900
|
+
}
|
|
901
|
+
/**
|
|
902
|
+
* Look up a manifest entry (metadata only, no payload read).
|
|
903
|
+
* Used by the overlay to check seed existence and freshness.
|
|
904
|
+
*/
|
|
905
|
+
async function isParamIndependent(componentId) {
|
|
906
|
+
if (source === null) return false;
|
|
907
|
+
manifestPromise ??= loadManifestWithTimeout(source);
|
|
908
|
+
return (await manifestPromise)?.[componentId]?.paramIndependent === true;
|
|
909
|
+
}
|
|
910
|
+
async function getManifestEntry(componentId, cacheKey) {
|
|
911
|
+
if (source === null) return null;
|
|
912
|
+
manifestPromise ??= loadManifestWithTimeout(source);
|
|
913
|
+
return (await manifestPromise)?.[componentId]?.entries?.[cacheKey] ?? null;
|
|
914
|
+
}
|
|
915
|
+
/**
|
|
916
|
+
* Look up a cached payload: manifest entry → payload bytes.
|
|
917
|
+
* Null on any miss or read failure — callers fall back to live render.
|
|
918
|
+
*
|
|
919
|
+
* The manifest is loaded once and memoized (design/44 §manifest.json:
|
|
920
|
+
* loaded at startup, held in memory; payloads read on demand). A failed
|
|
921
|
+
* manifest load is memoized as null rather than retried per-request — a
|
|
922
|
+
* broken artifact should degrade to dynamic rendering, not add a failing
|
|
923
|
+
* read to every request.
|
|
924
|
+
*/
|
|
925
|
+
async function lookupPrebuiltPayload(componentId, cacheKey) {
|
|
926
|
+
if (source === null) return null;
|
|
927
|
+
manifestPromise ??= loadManifestWithTimeout(source);
|
|
928
|
+
const entry = (await manifestPromise)?.[componentId]?.entries?.[cacheKey];
|
|
929
|
+
if (!entry) return null;
|
|
930
|
+
try {
|
|
931
|
+
return await withTimeout(source.readPayload(entry.file), PAYLOAD_READ_TIMEOUT_MS, null, () => {
|
|
932
|
+
console.error(`[timber] prebuilt payload read for "${entry.file}" exceeded ${PAYLOAD_READ_TIMEOUT_MS}ms — rendering dynamically`);
|
|
933
|
+
});
|
|
934
|
+
} catch (error) {
|
|
935
|
+
console.error(`[timber] failed to read prebuilt payload "${entry.file}" for ${componentId} — rendering dynamically:`, error);
|
|
936
|
+
return null;
|
|
937
|
+
}
|
|
938
|
+
}
|
|
939
|
+
//#endregion
|
|
940
|
+
//#region src/server/prebuilt/overlay.ts
|
|
941
|
+
/**
|
|
942
|
+
* Component cache overlay — runtime CacheHandler layer for ISR.
|
|
943
|
+
*
|
|
944
|
+
* Sits in front of the immutable build artifact (`.flight` files) and
|
|
945
|
+
* stores replacement payloads and tombstones via the configured
|
|
946
|
+
* CacheHandler. Overlay entries are per-deploy namespaced:
|
|
947
|
+
* `timber:c:{deploymentId}:{componentId}:{hash}`
|
|
948
|
+
*
|
|
949
|
+
* The CacheHandler contract is untouched — tombstones and the tag index
|
|
950
|
+
* live above the interface as value conventions. Redis, KV, and custom
|
|
951
|
+
* handlers work unmodified.
|
|
952
|
+
*
|
|
953
|
+
* See design/45-cache-lifetimes.md §ISR mechanics.
|
|
954
|
+
*/
|
|
955
|
+
/** Default ceiling TTL for tag-only entries (24 hours), in seconds. */
|
|
956
|
+
var CEILING_TTL_SECONDS = 86400;
|
|
957
|
+
/** Deploy-long physical TTL for seed-backed overlay records (90 days). */
|
|
958
|
+
var DEPLOY_LONG_TTL_SECONDS = 7776e3;
|
|
959
|
+
function isOverlayRecord(v) {
|
|
960
|
+
return v !== null && typeof v === "object" && v._t === "co";
|
|
961
|
+
}
|
|
962
|
+
function isTombstone(v) {
|
|
963
|
+
return v !== null && typeof v === "object" && v._t === "ct";
|
|
964
|
+
}
|
|
965
|
+
function overlayKey(componentId, cacheKey) {
|
|
966
|
+
return `timber:c:${getDeploymentId() ?? "dev"}:${componentId}:${cacheKey}`;
|
|
967
|
+
}
|
|
968
|
+
/**
|
|
969
|
+
* Look up an overlay entry in the cache handler.
|
|
970
|
+
* Returns null on a clean miss (no overlay entry at all).
|
|
971
|
+
*/
|
|
972
|
+
async function lookupOverlay(componentId, cacheKey) {
|
|
973
|
+
const handler = getCacheHandler();
|
|
974
|
+
const key = overlayKey(componentId, cacheKey);
|
|
975
|
+
const result = await handler.get(key);
|
|
976
|
+
if (!result) return null;
|
|
977
|
+
const value = result.value;
|
|
978
|
+
if (isTombstone(value)) return {
|
|
979
|
+
kind: "tombstone",
|
|
980
|
+
record: null,
|
|
981
|
+
payload: null
|
|
982
|
+
};
|
|
983
|
+
if (isOverlayRecord(value)) return {
|
|
984
|
+
kind: Date.now() > value.fu ? "stale" : "fresh",
|
|
985
|
+
record: value,
|
|
986
|
+
payload: base64ToBytes(value.p)
|
|
987
|
+
};
|
|
988
|
+
return null;
|
|
989
|
+
}
|
|
990
|
+
/**
|
|
991
|
+
* Resolve the effective TTL for a component's runtime lifetime.
|
|
992
|
+
* Tag-only entries (no explicit ttl) get the ceiling TTL (design/45
|
|
993
|
+
* §Tag-only entries carry a ceiling TTL).
|
|
994
|
+
*/
|
|
995
|
+
function effectiveTtl(ttl) {
|
|
996
|
+
return ttl ?? CEILING_TTL_SECONDS;
|
|
997
|
+
}
|
|
998
|
+
/**
|
|
999
|
+
* Store a component flight payload in the overlay.
|
|
1000
|
+
*/
|
|
1001
|
+
async function storeOverlayEntry(componentId, cacheKey, payloadBytes, opts) {
|
|
1002
|
+
const handler = getCacheHandler();
|
|
1003
|
+
const key = overlayKey(componentId, cacheKey);
|
|
1004
|
+
const logicalTtl = effectiveTtl(opts.ttl);
|
|
1005
|
+
const physicalTtl = opts.hasSeed ? DEPLOY_LONG_TTL_SECONDS : logicalTtl;
|
|
1006
|
+
const record = {
|
|
1007
|
+
_t: "co",
|
|
1008
|
+
p: bytesToBase64(payloadBytes),
|
|
1009
|
+
fu: Date.now() + logicalTtl * 1e3,
|
|
1010
|
+
s: opts.hasSeed
|
|
1011
|
+
};
|
|
1012
|
+
await handler.set(key, record, {
|
|
1013
|
+
ttl: physicalTtl,
|
|
1014
|
+
tags: opts.tags
|
|
1015
|
+
});
|
|
1016
|
+
}
|
|
1017
|
+
var tagIndex = null;
|
|
1018
|
+
/**
|
|
1019
|
+
* Initialize the tag index from the prebuilt manifest. Called once when the
|
|
1020
|
+
* manifest is loaded. Without a manifest (no prebuilt components), this is
|
|
1021
|
+
* never called and revalidateTag skips the tombstone path entirely.
|
|
1022
|
+
*/
|
|
1023
|
+
function initTagIndex(manifest) {
|
|
1024
|
+
tagIndex = buildTagIndex(manifest);
|
|
1025
|
+
emitIsrDiagnosticIfNeeded(manifest);
|
|
1026
|
+
}
|
|
1027
|
+
/**
|
|
1028
|
+
* Reset the tag index (for tests).
|
|
1029
|
+
* @internal
|
|
1030
|
+
*/
|
|
1031
|
+
function resetTagIndex() {
|
|
1032
|
+
tagIndex = null;
|
|
1033
|
+
}
|
|
1034
|
+
/**
|
|
1035
|
+
* Write tombstones for all seed entries carrying the given tag.
|
|
1036
|
+
* Called from cache.invalidate (cache-api.ts) AFTER the handler's own
|
|
1037
|
+
* invalidation clears overlay entries.
|
|
1038
|
+
*
|
|
1039
|
+
* The tombstone prevents the immutable seed from being served after
|
|
1040
|
+
* invalidation — without it, a handler.invalidate that clears the overlay
|
|
1041
|
+
* would expose the (now-stale) build artifact on the next request.
|
|
1042
|
+
*
|
|
1043
|
+
* Ensures the manifest is loaded first so cold-process actions that
|
|
1044
|
+
* invalidate before any page render still write tombstones.
|
|
1045
|
+
*/
|
|
1046
|
+
async function writeTombstonesForTag(tag) {
|
|
1047
|
+
if (!tagIndex) await ensureManifestLoaded();
|
|
1048
|
+
if (!tagIndex) return;
|
|
1049
|
+
const seeds = tagIndex.get(tag);
|
|
1050
|
+
if (!seeds || seeds.length === 0) return;
|
|
1051
|
+
const handler = getCacheHandler();
|
|
1052
|
+
const tombstone = { _t: "ct" };
|
|
1053
|
+
await Promise.all(seeds.map((seed) => {
|
|
1054
|
+
const key = overlayKey(seed.componentId, seed.cacheKey);
|
|
1055
|
+
return handler.set(key, tombstone, {
|
|
1056
|
+
ttl: DEPLOY_LONG_TTL_SECONDS,
|
|
1057
|
+
tags: [tag]
|
|
1058
|
+
});
|
|
1059
|
+
}));
|
|
1060
|
+
}
|
|
1061
|
+
var isrDiagnosticEmitted = false;
|
|
1062
|
+
function emitIsrDiagnosticIfNeeded(manifest) {
|
|
1063
|
+
if (isrDiagnosticEmitted) return;
|
|
1064
|
+
if (!(getCacheHandler() instanceof MemoryCacheHandler || !isCacheHandlerConfigured())) return;
|
|
1065
|
+
for (const [, component] of Object.entries(manifest)) {
|
|
1066
|
+
if (!component || typeof component !== "object" || !("entries" in component)) continue;
|
|
1067
|
+
for (const [, entry] of Object.entries(component.entries)) if (entry.tags && entry.tags.length > 0) {
|
|
1068
|
+
isrDiagnosticEmitted = true;
|
|
1069
|
+
console.warn("[timber] tag revalidation of prerendered components requires a shared cache handler in multi-instance deployments. The current MemoryCacheHandler is per-process — revalidateTag on one instance will not purge the build seed on others. Configure a shared handler (Redis, KV) for production ISR.");
|
|
1070
|
+
return;
|
|
1071
|
+
}
|
|
1072
|
+
}
|
|
1073
|
+
}
|
|
1074
|
+
function bytesToBase64(bytes) {
|
|
1075
|
+
return Buffer.from(bytes).toString("base64");
|
|
1076
|
+
}
|
|
1077
|
+
function base64ToBytes(b64) {
|
|
1078
|
+
return new Uint8Array(Buffer.from(b64, "base64"));
|
|
1079
|
+
}
|
|
1080
|
+
//#endregion
|
|
1081
|
+
//#region src/cache/cache-api.ts
|
|
1082
|
+
var componentFallbackWarned = /* @__PURE__ */ new WeakSet();
|
|
1083
|
+
/**
|
|
1084
|
+
* Cache namespace — `cache.data`, `cache.component`, `cache.invalidate`.
|
|
1085
|
+
*
|
|
1086
|
+
* ```ts
|
|
1087
|
+
* import { cache } from '@timber-js/app/cache';
|
|
1088
|
+
*
|
|
1089
|
+
* const getUser = cache.data(
|
|
1090
|
+
* async (id: string) => db.users.findUnique({ where: { id } }),
|
|
1091
|
+
* { ttl: 60, tags: (id) => [`user:${id}`] }
|
|
1092
|
+
* );
|
|
1093
|
+
* ```
|
|
1094
|
+
*/
|
|
1095
|
+
var cache = {
|
|
1096
|
+
/**
|
|
1097
|
+
* Wrap an async function with cross-request caching.
|
|
1098
|
+
*
|
|
1099
|
+
* The configured cache handler (defaults to MemoryCacheHandler, overridable
|
|
1100
|
+
* via timber.config.ts) is re-resolved on every call, so module-scope
|
|
1101
|
+
* wrappers created before `setCacheHandler()` still pick up the configured
|
|
1102
|
+
* handler (TIM-1029).
|
|
1103
|
+
*/
|
|
1104
|
+
data(fn, opts, stableId) {
|
|
1105
|
+
return createCache(fn, opts, getCacheHandler, stableId);
|
|
1106
|
+
},
|
|
1107
|
+
/**
|
|
1108
|
+
* Invalidate cache entries by tag or key.
|
|
1109
|
+
*
|
|
1110
|
+
* ```ts
|
|
1111
|
+
* cache.invalidate({ tag: 'products' });
|
|
1112
|
+
* cache.invalidate({ key: 'user:abc' });
|
|
1113
|
+
* ```
|
|
1114
|
+
*/
|
|
1115
|
+
async invalidate(opts) {
|
|
1116
|
+
recordInvalidation(opts);
|
|
1117
|
+
await getCacheHandler().invalidate(opts);
|
|
1118
|
+
if (opts.tag) await writeTombstonesForTag(opts.tag);
|
|
1119
|
+
if (opts.tag) {
|
|
1120
|
+
const purgeHandler = getCdnPurgeHandler();
|
|
1121
|
+
if (purgeHandler) try {
|
|
1122
|
+
await Promise.race([purgeHandler.purgeTags([opts.tag]), new Promise((_, reject) => setTimeout(() => reject(/* @__PURE__ */ new Error("CDN purge timed out (10s)")), 1e4))]);
|
|
1123
|
+
} catch (err) {
|
|
1124
|
+
console.error("[timber] CDN purge failed for tag:", err);
|
|
1125
|
+
}
|
|
1126
|
+
}
|
|
1127
|
+
},
|
|
1128
|
+
/**
|
|
1129
|
+
* Runtime fallback for `cache.component(...)` callsites the timber-prebuilt
|
|
1130
|
+
* transform does not rewrite — nested/computed/argument-position forms (see
|
|
1131
|
+
* plugins/prebuilt.ts). Only module-scope `const X = cache.component(...)`
|
|
1132
|
+
* declarations are transformed and eligible for prebuilding; everything else
|
|
1133
|
+
* lands here, warns once per component, and renders dynamically. Same
|
|
1134
|
+
* safety-net pattern as the data cache's runtime fnId fallback (TIM-1054):
|
|
1135
|
+
* an untraceable callsite degrades in performance, never in correctness.
|
|
1136
|
+
*/
|
|
1137
|
+
component(componentFn, _options) {
|
|
1138
|
+
if (!componentFallbackWarned.has(componentFn)) {
|
|
1139
|
+
componentFallbackWarned.add(componentFn);
|
|
1140
|
+
const name = componentFn.name || "anonymous component";
|
|
1141
|
+
console.warn(`[timber] cache.component: "${name}" was not transformed at build time — rendering dynamically. Only module-scope declarations (const X = cache.component(...)) are prebuilt.`);
|
|
1142
|
+
}
|
|
1143
|
+
return componentFn;
|
|
1144
|
+
}
|
|
1145
|
+
};
|
|
1146
|
+
//#endregion
|
|
1147
|
+
export { setDefaultSingleflightTimeout as _, getManifestEntry as a, wasInvalidatedSince as b, lookupPrebuiltPayload as c, checkVersionSkew as d, MemoryCacheHandler as f, setCacheHandler as g, getCacheHandler as h, storeOverlayEntry as i, setPrebuiltPayloadSource as l, RedisCacheHandler as m, lookupOverlay as n, hasPrebuiltPayloadSource as o, TagAwareCacheHandler as p, overlayKey as r, isParamIndependent as s, cache as t, applyReloadHeaders as u, currentInvalidationEpoch as v, lastInvalidationEpochFor as y };
|
|
1148
|
+
|
|
1149
|
+
//# sourceMappingURL=cache-api-ByagcC-J.js.map
|