@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,1484 @@
|
|
|
1
|
+
import { o as traceAls, r as requestContextAls, s as waitUntilAls } from "./als-registry-C6kcfprT.js";
|
|
2
|
+
import { n as _setGetSegmentParamsFn, t as _setGetSearchParamsFn } from "./als-slots-BEEIPKYm.js";
|
|
3
|
+
import { a as assertValidCookieOptions, i as assertValidCookieName, n as parseSetCookie$1, o as assertValidCookieValue, r as stringifySetCookie, t as parseCookie } from "./dist-DtrJyBbw.js";
|
|
4
|
+
import { r as appVisibleSearch } from "./rsc-cache-key-ClUiXQnK.js";
|
|
5
|
+
import { a as mergePreservedSearchParams, o as resolveSegmentParams, r as validateExternalRedirectUrl, t as assertRelativeRedirectPath } from "./href-validation-BIrxavIy.js";
|
|
6
|
+
import { randomUUID } from "node:crypto";
|
|
7
|
+
//#region src/server/waituntil-bridge.ts
|
|
8
|
+
/**
|
|
9
|
+
* Per-request waitUntil bridge — ALS bridge for platform adapters.
|
|
10
|
+
*
|
|
11
|
+
* The generated entry point (Nitro, Cloudflare) wraps the handler with
|
|
12
|
+
* `runWithWaitUntil`, binding the platform's lifecycle extension function
|
|
13
|
+
* (e.g., h3's `event.waitUntil()` or CF's `ctx.waitUntil()`) for the
|
|
14
|
+
* request duration. The `waitUntil()` primitive reads from this ALS to
|
|
15
|
+
* dispatch background work to the correct platform API.
|
|
16
|
+
*
|
|
17
|
+
* Design doc: design/11-platform.md §"waitUntil()"
|
|
18
|
+
*/
|
|
19
|
+
/**
|
|
20
|
+
* Get the current request's waitUntil function, if available.
|
|
21
|
+
*
|
|
22
|
+
* Returns undefined when no platform adapter has installed a waitUntil
|
|
23
|
+
* handler for the current request (e.g., on platforms that don't support
|
|
24
|
+
* lifecycle extension, or outside a request context).
|
|
25
|
+
*/
|
|
26
|
+
function getWaitUntil() {
|
|
27
|
+
return waitUntilAls.getStore();
|
|
28
|
+
}
|
|
29
|
+
//#endregion
|
|
30
|
+
//#region src/server/debug.ts
|
|
31
|
+
/**
|
|
32
|
+
* Runtime debug flag for timber.js.
|
|
33
|
+
*
|
|
34
|
+
* Two distinct functions for two distinct security levels:
|
|
35
|
+
*
|
|
36
|
+
* ## `isDebug()` — server-side logging only
|
|
37
|
+
*
|
|
38
|
+
* Returns true when timber's debug/warning messages should be written to
|
|
39
|
+
* stderr / the server console. This NEVER affects what is sent to the
|
|
40
|
+
* client (no error details, no timing headers, no stack traces).
|
|
41
|
+
*
|
|
42
|
+
* Active when any of:
|
|
43
|
+
* - `NODE_ENV !== 'production'` (standard dev mode)
|
|
44
|
+
* - `TIMBER_DEBUG` env var is set to a truthy value at runtime
|
|
45
|
+
* - `timber.config.ts` has `debug: true`
|
|
46
|
+
*
|
|
47
|
+
* ## `isDevMode()` — client-visible dev behavior
|
|
48
|
+
*
|
|
49
|
+
* Returns true ONLY when `NODE_ENV !== 'production'`. This gates anything
|
|
50
|
+
* that changes what clients can observe:
|
|
51
|
+
* - Dev error pages with stack traces (fallback-error.ts)
|
|
52
|
+
* - Detailed Server-Timing headers (pipeline.ts)
|
|
53
|
+
* - Error messages in action INTERNAL_ERROR payloads (action-client.ts)
|
|
54
|
+
* - Pipeline error handler wiring (Vite overlay)
|
|
55
|
+
*
|
|
56
|
+
* `isDevMode()` is statically replaced in production builds → the guarded
|
|
57
|
+
* code is tree-shaken to zero bytes. TIMBER_DEBUG cannot enable it.
|
|
58
|
+
*
|
|
59
|
+
* Usage:
|
|
60
|
+
* In Cloudflare Workers wrangler.toml:
|
|
61
|
+
* [vars]
|
|
62
|
+
* TIMBER_DEBUG = "1"
|
|
63
|
+
*
|
|
64
|
+
* In Node.js:
|
|
65
|
+
* TIMBER_DEBUG=1 node server.js
|
|
66
|
+
*
|
|
67
|
+
* In timber.config.ts:
|
|
68
|
+
* export default { debug: true }
|
|
69
|
+
*
|
|
70
|
+
* See design/13-security.md for the security taxonomy.
|
|
71
|
+
* See design/18-build-system.md for build pipeline details.
|
|
72
|
+
*/
|
|
73
|
+
/**
|
|
74
|
+
* Check if the application is running in development mode.
|
|
75
|
+
*
|
|
76
|
+
* This is the ONLY function that should gate client-visible dev behavior:
|
|
77
|
+
* - Dev error pages with stack traces
|
|
78
|
+
* - Server-Timing mode default (`'detailed'` in dev, `'total'` in prod)
|
|
79
|
+
* - Error messages in action `INTERNAL_ERROR` payloads
|
|
80
|
+
* - Pipeline error handler wiring (Vite overlay)
|
|
81
|
+
*
|
|
82
|
+
* Returns `process.env.NODE_ENV !== 'production'`, which is statically
|
|
83
|
+
* replaced by the bundler in production builds. Code guarded by this
|
|
84
|
+
* function is tree-shaken to zero bytes in production.
|
|
85
|
+
*
|
|
86
|
+
* TIMBER_DEBUG does NOT enable this — that would leak server internals
|
|
87
|
+
* to clients. Use `isDebug()` for server-side-only logging.
|
|
88
|
+
*/
|
|
89
|
+
function isDevMode() {
|
|
90
|
+
return process.env.NODE_ENV !== "production";
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Config-level debug override. Set via `setDebugFromConfig()` during
|
|
94
|
+
* initialization when timber.config.ts has `debug: true`.
|
|
95
|
+
*/
|
|
96
|
+
var _configDebug = false;
|
|
97
|
+
/**
|
|
98
|
+
* Check if timber debug logging is active (server-side only).
|
|
99
|
+
*
|
|
100
|
+
* Returns true if ANY of these conditions hold:
|
|
101
|
+
* - NODE_ENV is not 'production' (standard dev mode)
|
|
102
|
+
* - TIMBER_DEBUG environment variable is set to a truthy value at runtime
|
|
103
|
+
* - timber.config.ts has `debug: true`
|
|
104
|
+
*
|
|
105
|
+
* This function controls ONLY server-side logging — messages written to
|
|
106
|
+
* stderr or the server console. It NEVER affects client-visible behavior
|
|
107
|
+
* (error pages, response headers, action payloads). For client-visible
|
|
108
|
+
* behavior, use `isDevMode()`.
|
|
109
|
+
*
|
|
110
|
+
* The TIMBER_DEBUG check is deliberately written as a dynamic property
|
|
111
|
+
* access so bundlers cannot statically replace it.
|
|
112
|
+
*/
|
|
113
|
+
function isDebug() {
|
|
114
|
+
if (process.env.NODE_ENV !== "production") return true;
|
|
115
|
+
if (_configDebug) return true;
|
|
116
|
+
return _readTimberDebugEnv();
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Read TIMBER_DEBUG from the environment at runtime.
|
|
120
|
+
*
|
|
121
|
+
* Extracted to a separate function to:
|
|
122
|
+
* 1. Prevent bundler inlining (cross-module function calls are not inlined)
|
|
123
|
+
* 2. Handle platforms where `process` may not exist (Cloudflare Workers)
|
|
124
|
+
* 3. Support globalThis.__TIMBER_DEBUG for programmatic control
|
|
125
|
+
*/
|
|
126
|
+
function _readTimberDebugEnv() {
|
|
127
|
+
if (globalThis.__TIMBER_DEBUG) return true;
|
|
128
|
+
try {
|
|
129
|
+
const val = typeof process !== "undefined" && process.env ? process.env["TIMBER_DEBUG"] : void 0;
|
|
130
|
+
if (val && val !== "0" && val !== "false") return true;
|
|
131
|
+
} catch {}
|
|
132
|
+
return false;
|
|
133
|
+
}
|
|
134
|
+
//#endregion
|
|
135
|
+
//#region src/server/cookie-parsing.ts
|
|
136
|
+
/**
|
|
137
|
+
* Cookie parsing and serialization helpers — pure string ↔ structure
|
|
138
|
+
* functions with no ALS dependency. Split out of `cookie-context.ts`
|
|
139
|
+
* (TIM-853) so the API surface and the wire-format codecs can each be
|
|
140
|
+
* read on their own.
|
|
141
|
+
*
|
|
142
|
+
* The functions in this module are total over arbitrary input. They
|
|
143
|
+
* never throw and never call `assertValid*` (the security validators
|
|
144
|
+
* live in the API surface — `cookie-context.ts` invokes them at every
|
|
145
|
+
* jar entry point so the smuggling-primitive invariant from TIM-868
|
|
146
|
+
* is enforced regardless of which path produced the bytes).
|
|
147
|
+
*
|
|
148
|
+
* Delegates to the `cookie` package (RFC 6265, dependency-free,
|
|
149
|
+
* browser-safe) for wire codecs. Adapts at the boundary to preserve
|
|
150
|
+
* timber's Map-based API and never-throw contract.
|
|
151
|
+
*/
|
|
152
|
+
/**
|
|
153
|
+
* Parse a Cookie header string into a Map of name → value pairs.
|
|
154
|
+
* Follows RFC 6265 §4.2.1: cookies are semicolon-separated key=value pairs.
|
|
155
|
+
*
|
|
156
|
+
* Values are auto-decoded with `decodeURIComponent` so they round-trip
|
|
157
|
+
* losslessly with `getCookies().set()` (which auto-encodes). Malformed
|
|
158
|
+
* `%`-escapes from third-party cookies fall back to the raw byte sequence
|
|
159
|
+
* — the parser must be total over arbitrary inbound headers, including
|
|
160
|
+
* non-conforming values from other servers, browser extensions, etc.
|
|
161
|
+
*/
|
|
162
|
+
function parseCookieHeader(header) {
|
|
163
|
+
const map = /* @__PURE__ */ new Map();
|
|
164
|
+
if (!header) return map;
|
|
165
|
+
const parsed = parseCookie(header);
|
|
166
|
+
for (const name in parsed) {
|
|
167
|
+
const value = parsed[name];
|
|
168
|
+
if (value !== void 0) map.set(name, value);
|
|
169
|
+
}
|
|
170
|
+
return map;
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Decode a single cookie value with `decodeURIComponent`, falling back to
|
|
174
|
+
* the raw byte sequence if the input contains a malformed `%`-escape.
|
|
175
|
+
*
|
|
176
|
+
* Used by both `parseCookieHeader` (incoming Cookie: header) and the
|
|
177
|
+
* `setRaw` forwarding path (outgoing Set-Cookie from upstream services).
|
|
178
|
+
* Total — never throws.
|
|
179
|
+
*
|
|
180
|
+
* cookie's internal decode has identical semantics but is not exported,
|
|
181
|
+
* so we keep this standalone helper.
|
|
182
|
+
*/
|
|
183
|
+
function safeDecodeCookieValue(raw) {
|
|
184
|
+
try {
|
|
185
|
+
return decodeURIComponent(raw);
|
|
186
|
+
} catch {
|
|
187
|
+
return raw;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Serialize a CookieEntry into a Set-Cookie header value.
|
|
192
|
+
*
|
|
193
|
+
* Total — never throws. If the cookie package's serializer rejects
|
|
194
|
+
* the input (e.g. non-integer maxAge, forbidden chars in name/value),
|
|
195
|
+
* falls back to a minimal hand-rolled serialization so the response
|
|
196
|
+
* path is never interrupted by a codec error.
|
|
197
|
+
*/
|
|
198
|
+
function serializeCookieEntry(entry) {
|
|
199
|
+
try {
|
|
200
|
+
return stringifySetCookie({
|
|
201
|
+
name: entry.name,
|
|
202
|
+
value: entry.value,
|
|
203
|
+
domain: entry.options.domain,
|
|
204
|
+
path: entry.options.path,
|
|
205
|
+
expires: entry.options.expires,
|
|
206
|
+
maxAge: entry.options.maxAge,
|
|
207
|
+
httpOnly: entry.options.httpOnly,
|
|
208
|
+
secure: entry.options.secure,
|
|
209
|
+
sameSite: entry.options.sameSite,
|
|
210
|
+
partitioned: entry.options.partitioned
|
|
211
|
+
}, { encode: (v) => v });
|
|
212
|
+
} catch {
|
|
213
|
+
return serializeCookieEntryFallback(entry);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
function serializeCookieEntryFallback(entry) {
|
|
217
|
+
const parts = [`${entry.name}=${entry.value}`];
|
|
218
|
+
const opts = entry.options;
|
|
219
|
+
if (opts.domain) parts.push(`Domain=${opts.domain}`);
|
|
220
|
+
if (opts.path) parts.push(`Path=${opts.path}`);
|
|
221
|
+
if (opts.expires) parts.push(`Expires=${opts.expires.toUTCString()}`);
|
|
222
|
+
if (opts.maxAge !== void 0) parts.push(`Max-Age=${opts.maxAge}`);
|
|
223
|
+
if (opts.httpOnly) parts.push("HttpOnly");
|
|
224
|
+
if (opts.secure) parts.push("Secure");
|
|
225
|
+
if (opts.sameSite) parts.push(`SameSite=${opts.sameSite.charAt(0).toUpperCase()}${opts.sameSite.slice(1)}`);
|
|
226
|
+
if (opts.partitioned) parts.push("Partitioned");
|
|
227
|
+
return parts.join("; ");
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* Parse a raw `Set-Cookie` header string into name, value, and options.
|
|
231
|
+
* Handles all standard attributes: Path, Domain, Max-Age, Expires,
|
|
232
|
+
* SameSite, Secure, HttpOnly, Partitioned.
|
|
233
|
+
*
|
|
234
|
+
* Does NOT apply DEFAULT_COOKIE_OPTIONS — the caller decides whether
|
|
235
|
+
* to merge defaults (e.g. `set()` does, but `setRaw()` should preserve
|
|
236
|
+
* the original header's intent).
|
|
237
|
+
*/
|
|
238
|
+
function parseSetCookie(header) {
|
|
239
|
+
const parsed = parseSetCookie$1(header, { decode: (v) => v });
|
|
240
|
+
if (!parsed.name) return null;
|
|
241
|
+
const options = {};
|
|
242
|
+
if (parsed.path !== void 0) options.path = parsed.path || "/";
|
|
243
|
+
if (parsed.domain !== void 0) options.domain = parsed.domain;
|
|
244
|
+
if (parsed.maxAge !== void 0 && Number.isFinite(parsed.maxAge)) options.maxAge = parsed.maxAge;
|
|
245
|
+
if (parsed.expires !== void 0) options.expires = parsed.expires;
|
|
246
|
+
if (parsed.sameSite !== void 0 && parsed.sameSite !== true) {
|
|
247
|
+
const sameSite = parsed.sameSite.toLowerCase();
|
|
248
|
+
if (sameSite === "strict" || sameSite === "lax" || sameSite === "none") options.sameSite = sameSite;
|
|
249
|
+
}
|
|
250
|
+
if (parsed.secure) options.secure = true;
|
|
251
|
+
if (parsed.httpOnly) options.httpOnly = true;
|
|
252
|
+
if (parsed.partitioned) options.partitioned = true;
|
|
253
|
+
return {
|
|
254
|
+
name: parsed.name,
|
|
255
|
+
value: parsed.value ?? "",
|
|
256
|
+
options
|
|
257
|
+
};
|
|
258
|
+
}
|
|
259
|
+
//#endregion
|
|
260
|
+
//#region src/server/cookie-context.ts
|
|
261
|
+
/**
|
|
262
|
+
* Cookie Context — per-request cookie API and on-the-wire helpers.
|
|
263
|
+
*
|
|
264
|
+
* Split out of `request-context.ts` (TIM-853) so the cookie subsystem
|
|
265
|
+
* — encoding contract, options grammar, parser, serializer, RYW map,
|
|
266
|
+
* and rerender seed — lives in one file. The headers/scope/params APIs
|
|
267
|
+
* stay in `request-context.ts` and call into this module via the
|
|
268
|
+
* exported helpers.
|
|
269
|
+
*
|
|
270
|
+
* See design/29-cookies.md for the encoding contract and read-your-own-
|
|
271
|
+
* writes semantics. See ONGOING_SECURITY.md H-3 (TIM-868) for the
|
|
272
|
+
* smuggling primitive that the encoding contract closes.
|
|
273
|
+
*/
|
|
274
|
+
/**
|
|
275
|
+
* Returns a cookie accessor for the current request.
|
|
276
|
+
*
|
|
277
|
+
* Available in middleware, access checks, server components, and server actions.
|
|
278
|
+
* Throws if called outside a request context (security principle #2: no global fallback).
|
|
279
|
+
*
|
|
280
|
+
* Read methods (.get, .has, .getAll) are always available and reflect
|
|
281
|
+
* read-your-own-writes from .set() calls in the same request.
|
|
282
|
+
*
|
|
283
|
+
* Mutation methods (.set, .delete, .clear) are only available in mutable
|
|
284
|
+
* contexts (middleware.ts, server actions, route.ts handlers). Calling them
|
|
285
|
+
* in read-only contexts (access.ts, server components) throws.
|
|
286
|
+
*
|
|
287
|
+
* This is the escape hatch for direct cookie jar operations. For typed
|
|
288
|
+
* cookie access, use `defineCookie()` instead.
|
|
289
|
+
*
|
|
290
|
+
* See design/29-cookies.md
|
|
291
|
+
*/
|
|
292
|
+
function getCookieJar() {
|
|
293
|
+
const store = requestContextAls.getStore();
|
|
294
|
+
if (!store) throw new Error("[timber] getCookieJar() called outside of a request context. It can only be used in middleware, access checks, server components, and server actions.");
|
|
295
|
+
if (!store.parsedCookies) store.parsedCookies = parseCookieHeader(store.cookieHeader);
|
|
296
|
+
const map = store.parsedCookies;
|
|
297
|
+
return {
|
|
298
|
+
get(name) {
|
|
299
|
+
return map.get(name);
|
|
300
|
+
},
|
|
301
|
+
has(name) {
|
|
302
|
+
return map.has(name);
|
|
303
|
+
},
|
|
304
|
+
getAll() {
|
|
305
|
+
return Array.from(map.entries()).map(([name, value]) => ({
|
|
306
|
+
name,
|
|
307
|
+
value
|
|
308
|
+
}));
|
|
309
|
+
},
|
|
310
|
+
get size() {
|
|
311
|
+
return map.size;
|
|
312
|
+
},
|
|
313
|
+
set(name, value, options) {
|
|
314
|
+
assertMutable(store, "set");
|
|
315
|
+
assertValidCookieName(name);
|
|
316
|
+
if (typeof value !== "string") throw new Error(`[timber] getCookieJar().set(${JSON.stringify(name)}, …): value must be a string, got ${typeof value}.\n To store a JSON-serializable value, use defineCookie + jsonCookieCodec:\n\n import { defineCookie, jsonCookieCodec } from '@timber-js/app/cookies';\n\n export const ${name}Cookie = defineCookie(${JSON.stringify(name)}, {\n codec: jsonCookieCodec(),\n });\n\n ${name}Cookie.set(value);\n\n See design/29-cookies.md §"Typed Cookies with Schema Validation".`);
|
|
317
|
+
const raw = options?.raw === true;
|
|
318
|
+
const wireValue = raw ? value : encodeURIComponent(value);
|
|
319
|
+
if (raw) assertValidCookieValue(name, wireValue);
|
|
320
|
+
if (store.flushed) {
|
|
321
|
+
if (isDebug()) console.warn(`[timber] warn: getCookieJar().set('${name}') called after response headers were committed.\n The cookie will NOT be sent. Move cookie mutations to middleware.ts, a server action,\n or a route.ts handler.`);
|
|
322
|
+
return;
|
|
323
|
+
}
|
|
324
|
+
const { raw: _raw, ...attributeOptions } = options ?? {};
|
|
325
|
+
const opts = {
|
|
326
|
+
...DEFAULT_COOKIE_OPTIONS,
|
|
327
|
+
...attributeOptions
|
|
328
|
+
};
|
|
329
|
+
assertValidCookieOptions(opts);
|
|
330
|
+
store.cookieJar.set(name, {
|
|
331
|
+
name,
|
|
332
|
+
value: wireValue,
|
|
333
|
+
options: opts
|
|
334
|
+
});
|
|
335
|
+
map.set(name, raw ? wireValue : value);
|
|
336
|
+
},
|
|
337
|
+
setFromHeaders(headers) {
|
|
338
|
+
assertMutable(store, "setFromHeaders");
|
|
339
|
+
if (store.flushed) {
|
|
340
|
+
console.warn("[timber] warn: getCookieJar().setFromHeaders() called after response headers were committed.\n The cookies will NOT be sent. Move cookie mutations to middleware.ts, a server action,\n or a route.ts handler.");
|
|
341
|
+
return;
|
|
342
|
+
}
|
|
343
|
+
for (const raw of headers.getSetCookie()) {
|
|
344
|
+
const parsed = parseSetCookie(raw);
|
|
345
|
+
if (parsed) setRaw(store, map, parsed.name, parsed.value, parsed.options);
|
|
346
|
+
}
|
|
347
|
+
},
|
|
348
|
+
delete(name, options) {
|
|
349
|
+
assertMutable(store, "delete");
|
|
350
|
+
assertValidCookieName(name);
|
|
351
|
+
if (store.flushed) {
|
|
352
|
+
if (isDebug()) console.warn(`[timber] warn: getCookieJar().delete('${name}') called after response headers were committed.\n The cookie will NOT be deleted. Move cookie mutations to middleware.ts, a server action,\n or a route.ts handler.`);
|
|
353
|
+
return;
|
|
354
|
+
}
|
|
355
|
+
const opts = {
|
|
356
|
+
...DEFAULT_COOKIE_OPTIONS,
|
|
357
|
+
...options,
|
|
358
|
+
maxAge: 0,
|
|
359
|
+
expires: /* @__PURE__ */ new Date(0)
|
|
360
|
+
};
|
|
361
|
+
assertValidCookieOptions(opts);
|
|
362
|
+
store.cookieJar.set(name, {
|
|
363
|
+
name,
|
|
364
|
+
value: "",
|
|
365
|
+
options: opts
|
|
366
|
+
});
|
|
367
|
+
map.delete(name);
|
|
368
|
+
},
|
|
369
|
+
clear() {
|
|
370
|
+
assertMutable(store, "clear");
|
|
371
|
+
if (store.flushed) return;
|
|
372
|
+
for (const name of Array.from(map.keys())) store.cookieJar.set(name, {
|
|
373
|
+
name,
|
|
374
|
+
value: "",
|
|
375
|
+
options: {
|
|
376
|
+
...DEFAULT_COOKIE_OPTIONS,
|
|
377
|
+
maxAge: 0,
|
|
378
|
+
expires: /* @__PURE__ */ new Date(0)
|
|
379
|
+
}
|
|
380
|
+
});
|
|
381
|
+
map.clear();
|
|
382
|
+
},
|
|
383
|
+
toString() {
|
|
384
|
+
return Array.from(map.entries()).map(([name, value]) => `${name}=${encodeURIComponent(value)}`).join("; ");
|
|
385
|
+
}
|
|
386
|
+
};
|
|
387
|
+
}
|
|
388
|
+
/**
|
|
389
|
+
* Returns the value of a single cookie, or undefined if absent.
|
|
390
|
+
*
|
|
391
|
+
* @internal — not part of the public API. Use `defineCookie().get()` or `getCookieJar().get()` instead.
|
|
392
|
+
*/
|
|
393
|
+
function getCookie(name) {
|
|
394
|
+
return getCookieJar().get(name);
|
|
395
|
+
}
|
|
396
|
+
var DEFAULT_COOKIE_OPTIONS = {
|
|
397
|
+
path: "/",
|
|
398
|
+
httpOnly: true,
|
|
399
|
+
secure: true,
|
|
400
|
+
sameSite: "lax"
|
|
401
|
+
};
|
|
402
|
+
/**
|
|
403
|
+
* Per-request seed map of cookie name → value, registered out-of-band so the
|
|
404
|
+
* pipeline's `runWithRequestContext` call can pick it up without changing
|
|
405
|
+
* the function's calling convention. Stored in a WeakMap keyed by the
|
|
406
|
+
* synthetic Request object built for the rerender path, so the seed lives
|
|
407
|
+
* exactly as long as the request and is collected with it.
|
|
408
|
+
*
|
|
409
|
+
* The seed exists to eliminate the parse/serialize round-trip on the no-JS
|
|
410
|
+
* form-rerender path — see ONGOING_SECURITY.md H-3 (TIM-868). The action's
|
|
411
|
+
* post-mutation RYW snapshot is threaded directly into the rerender scope's
|
|
412
|
+
* `parsedCookies` map, bypassing `parseCookieHeader` entirely.
|
|
413
|
+
*/
|
|
414
|
+
var seededRequestCookies = /* @__PURE__ */ new WeakMap();
|
|
415
|
+
/**
|
|
416
|
+
* Pop the seed (if any) for `req` and return it. Called from
|
|
417
|
+
* `runWithRequestContext` exactly once per request — the seed is consumed
|
|
418
|
+
* eagerly so it cannot leak into a hypothetical future re-use of the same
|
|
419
|
+
* Request reference.
|
|
420
|
+
*
|
|
421
|
+
* @internal — framework use only.
|
|
422
|
+
*/
|
|
423
|
+
function consumeSeededCookies(req) {
|
|
424
|
+
const seed = seededRequestCookies.get(req);
|
|
425
|
+
if (seed) seededRequestCookies.delete(req);
|
|
426
|
+
return seed;
|
|
427
|
+
}
|
|
428
|
+
/**
|
|
429
|
+
* Collect all Set-Cookie headers from the cookie jar.
|
|
430
|
+
* Called by the framework at flush time to apply cookies to the response.
|
|
431
|
+
*
|
|
432
|
+
* Returns an array of serialized Set-Cookie header values.
|
|
433
|
+
*/
|
|
434
|
+
function getSetCookieHeaders() {
|
|
435
|
+
const store = requestContextAls.getStore();
|
|
436
|
+
if (!store) return [];
|
|
437
|
+
return Array.from(store.cookieJar.values()).map(serializeCookieEntry);
|
|
438
|
+
}
|
|
439
|
+
/** Throw if cookie mutation is attempted in a read-only context. */
|
|
440
|
+
function assertMutable(store, method) {
|
|
441
|
+
if (!store.mutableContext) throw new Error(`[timber] getCookieJar().${method}() cannot be called in this context.\n Set cookies in middleware.ts, server actions, or route.ts handlers.`);
|
|
442
|
+
}
|
|
443
|
+
/**
|
|
444
|
+
* Write a cookie to the jar WITHOUT merging DEFAULT_COOKIE_OPTIONS.
|
|
445
|
+
* Used by setFromHeaders to preserve the original header's attributes exactly.
|
|
446
|
+
*
|
|
447
|
+
* For deletion cookies (maxAge=0), the jar entry is still created so the
|
|
448
|
+
* Set-Cookie header is emitted, but the cookie is NOT added to the read map
|
|
449
|
+
* (it would be misleading — the cookie is being deleted).
|
|
450
|
+
*/
|
|
451
|
+
function setRaw(store, readMap, name, value, options) {
|
|
452
|
+
assertValidCookieName(name);
|
|
453
|
+
assertValidCookieValue(name, value);
|
|
454
|
+
assertValidCookieOptions(options);
|
|
455
|
+
store.cookieJar.set(name, {
|
|
456
|
+
name,
|
|
457
|
+
value,
|
|
458
|
+
options
|
|
459
|
+
});
|
|
460
|
+
if (options.maxAge === 0) readMap.delete(name);
|
|
461
|
+
else readMap.set(name, safeDecodeCookieValue(value));
|
|
462
|
+
}
|
|
463
|
+
//#endregion
|
|
464
|
+
//#region src/server/request-context.ts
|
|
465
|
+
/**
|
|
466
|
+
* Returns a read-only view of the current request's headers.
|
|
467
|
+
*
|
|
468
|
+
* Available in middleware, access checks, server components, and server actions.
|
|
469
|
+
* Throws if called outside a request context (security principle #2: no global fallback).
|
|
470
|
+
*/
|
|
471
|
+
function getHeaders() {
|
|
472
|
+
const store = requestContextAls.getStore();
|
|
473
|
+
if (!store) throw new Error("[timber] getHeaders() called outside of a request context. It can only be used in middleware, access checks, server components, and server actions.");
|
|
474
|
+
return store.headers;
|
|
475
|
+
}
|
|
476
|
+
/**
|
|
477
|
+
* Returns the value of a single request header, or undefined if absent.
|
|
478
|
+
*
|
|
479
|
+
* Thin wrapper over `getHeaders().get(name)` for the common case where
|
|
480
|
+
* you need exactly one header.
|
|
481
|
+
*
|
|
482
|
+
* @internal — not part of the public API. Use `getHeaders().get(name)` instead.
|
|
483
|
+
*/
|
|
484
|
+
function getHeader(name) {
|
|
485
|
+
return getHeaders().get(name) ?? void 0;
|
|
486
|
+
}
|
|
487
|
+
/**
|
|
488
|
+
* Returns the current request's raw URLSearchParams.
|
|
489
|
+
*
|
|
490
|
+
* @internal — not part of the public API. Use `defineSearchParams().get()` instead.
|
|
491
|
+
*/
|
|
492
|
+
function getSearchParams() {
|
|
493
|
+
const store = requestContextAls.getStore();
|
|
494
|
+
if (!store) throw new Error("[timber] getSearchParams() called outside of a request context. It can only be used in middleware, access checks, server components, and server actions.");
|
|
495
|
+
return store.searchParams;
|
|
496
|
+
}
|
|
497
|
+
_setGetSearchParamsFn(getSearchParams);
|
|
498
|
+
_setGetSegmentParamsFn(getSegmentParams);
|
|
499
|
+
/**
|
|
500
|
+
* Returns the current request's coerced segment params.
|
|
501
|
+
*
|
|
502
|
+
* The optional `segmentPath` argument exists only for TypeScript narrowing —
|
|
503
|
+
* it does not affect the runtime return value. Pass a segment path
|
|
504
|
+
* (e.g. `'/(browse)/[artistSlug]/[year]'`) to narrow the return type to the
|
|
505
|
+
* exact params shape for that segment.
|
|
506
|
+
*
|
|
507
|
+
* Without an argument, returns all coerced params with optional types.
|
|
508
|
+
*
|
|
509
|
+
* See design/41-global-params.md §Function Signatures
|
|
510
|
+
*/
|
|
511
|
+
function getSegmentParams(segmentPath) {
|
|
512
|
+
const store = requestContextAls.getStore();
|
|
513
|
+
if (!store) throw new Error("[timber] getSegmentParams() called outside of a request context. It can only be used in middleware, access checks, server components, and server actions.");
|
|
514
|
+
if (!store.segmentParams) throw new Error("[timber] getSegmentParams() called before route matching completed. Segment params are not available until after the route is matched.");
|
|
515
|
+
const slotResolved = resolveSegmentParams(store.segmentParams, store.slotParams, segmentPath);
|
|
516
|
+
if (slotResolved !== store.segmentParams) return slotResolved;
|
|
517
|
+
if (segmentPath && isDebug() && store.matchedSegmentPath) {
|
|
518
|
+
const expected = extractDynamicSegments(segmentPath);
|
|
519
|
+
const actual = extractDynamicSegments(store.matchedSegmentPath);
|
|
520
|
+
const missing = expected.filter((s) => !actual.includes(s));
|
|
521
|
+
if (missing.length > 0) console.warn(`[timber] getSegmentParams('${segmentPath}') called but current segment is '${store.matchedSegmentPath}'\n Missing params: ${missing.join(", ")}\n These will be undefined at runtime despite the type annotation.`);
|
|
522
|
+
}
|
|
523
|
+
return store.segmentParams;
|
|
524
|
+
}
|
|
525
|
+
/**
|
|
526
|
+
* Set the segment params on the current request context.
|
|
527
|
+
* Called by the pipeline after route matching and param coercion.
|
|
528
|
+
*
|
|
529
|
+
* @internal — framework use only
|
|
530
|
+
*/
|
|
531
|
+
function setSegmentParams(params) {
|
|
532
|
+
const store = requestContextAls.getStore();
|
|
533
|
+
if (!store) throw new Error("[timber] setSegmentParams() called outside of a request context.");
|
|
534
|
+
store.segmentParams = params;
|
|
535
|
+
}
|
|
536
|
+
/**
|
|
537
|
+
* Store the matched segment path (e.g. '/(browse)/[artistSlug]/[year]') for
|
|
538
|
+
* dev-mode validation in getSegmentParams().
|
|
539
|
+
*
|
|
540
|
+
* @internal — framework use only
|
|
541
|
+
*/
|
|
542
|
+
function setMatchedSegmentPath(segmentPath) {
|
|
543
|
+
const store = requestContextAls.getStore();
|
|
544
|
+
if (!store) return;
|
|
545
|
+
store.matchedSegmentPath = segmentPath;
|
|
546
|
+
}
|
|
547
|
+
/**
|
|
548
|
+
* Extract dynamic segment names from a route pattern.
|
|
549
|
+
* '/[artistSlug]/[year]' → ['artistSlug', 'year']
|
|
550
|
+
* '/docs/[...slug]' → ['slug']
|
|
551
|
+
*/
|
|
552
|
+
function extractDynamicSegments(route) {
|
|
553
|
+
const segments = [];
|
|
554
|
+
const re = /\[{1,2}\.{0,3}(\w+)\]{1,2}/g;
|
|
555
|
+
let m;
|
|
556
|
+
while ((m = re.exec(route)) !== null) segments.push(m[1]);
|
|
557
|
+
return segments;
|
|
558
|
+
}
|
|
559
|
+
/**
|
|
560
|
+
* Returns the raw search string from the current request URL (e.g. "?foo=bar").
|
|
561
|
+
* Synchronous — safe for use in `redirect()` which throws synchronously.
|
|
562
|
+
*
|
|
563
|
+
* Returns empty string if called outside a request context (non-throwing for
|
|
564
|
+
* use in redirect's optional preserveSearchParams path).
|
|
565
|
+
*
|
|
566
|
+
* @internal — used by redirect() for preserveSearchParams support.
|
|
567
|
+
*/
|
|
568
|
+
function getRequestSearchString() {
|
|
569
|
+
return requestContextAls.getStore()?.searchString ?? "";
|
|
570
|
+
}
|
|
571
|
+
/**
|
|
572
|
+
* Run a callback within a request context. Used by the pipeline to establish
|
|
573
|
+
* per-request ALS scope so that `getHeaders()` and `getCookies()` work.
|
|
574
|
+
*
|
|
575
|
+
* If the request was previously registered via `seedRequestCookies`, the
|
|
576
|
+
* resulting context's `parsedCookies` map is initialized from the seed and
|
|
577
|
+
* the raw `cookieHeader` is left empty — `parseCookieHeader` is never called
|
|
578
|
+
* for that request. This is the no-JS form-rerender path. See TIM-868.
|
|
579
|
+
*
|
|
580
|
+
* @param req - The incoming Request object.
|
|
581
|
+
* @param fn - The function to run within the request context.
|
|
582
|
+
*/
|
|
583
|
+
function runWithRequestContext(req, fn) {
|
|
584
|
+
const originalCopy = new Headers(req.headers);
|
|
585
|
+
const appVisible = appVisibleSearch(new URL(req.url));
|
|
586
|
+
const seed = consumeSeededCookies(req);
|
|
587
|
+
const store = {
|
|
588
|
+
headers: freezeHeaders(req.headers),
|
|
589
|
+
originalHeaders: originalCopy,
|
|
590
|
+
cookieHeader: seed ? "" : req.headers.get("cookie") ?? "",
|
|
591
|
+
parsedCookies: seed,
|
|
592
|
+
searchParams: appVisible.params,
|
|
593
|
+
searchString: appVisible.search,
|
|
594
|
+
cookieJar: /* @__PURE__ */ new Map(),
|
|
595
|
+
flushed: false,
|
|
596
|
+
mutableContext: false
|
|
597
|
+
};
|
|
598
|
+
return requestContextAls.run(store, fn);
|
|
599
|
+
}
|
|
600
|
+
/**
|
|
601
|
+
* Enable cookie mutation for the current context. Called by the framework
|
|
602
|
+
* when entering middleware.ts, server actions, or route.ts handlers.
|
|
603
|
+
*
|
|
604
|
+
* See design/29-cookies.md §"Context Tracking"
|
|
605
|
+
*/
|
|
606
|
+
function setMutableCookieContext(mutable) {
|
|
607
|
+
const store = requestContextAls.getStore();
|
|
608
|
+
if (store) store.mutableContext = mutable;
|
|
609
|
+
}
|
|
610
|
+
/**
|
|
611
|
+
* Mark the response as flushed (headers committed). After this point,
|
|
612
|
+
* cookie mutations log a warning instead of throwing.
|
|
613
|
+
*
|
|
614
|
+
* See design/29-cookies.md §"Streaming Constraint: Post-Flush Cookie Warning"
|
|
615
|
+
*/
|
|
616
|
+
function markResponseFlushed() {
|
|
617
|
+
const store = requestContextAls.getStore();
|
|
618
|
+
if (store) store.flushed = true;
|
|
619
|
+
}
|
|
620
|
+
/**
|
|
621
|
+
* Apply middleware-injected request headers to the current request context.
|
|
622
|
+
*
|
|
623
|
+
* Called by the pipeline after middleware.ts runs. Merges overlay headers
|
|
624
|
+
* on top of the original request headers so downstream code (access.ts,
|
|
625
|
+
* server components, server actions) sees them via `getHeaders()`.
|
|
626
|
+
*
|
|
627
|
+
* The original request headers are never mutated — a new frozen Headers
|
|
628
|
+
* object is created with the overlay applied on top.
|
|
629
|
+
*
|
|
630
|
+
* See design/07-routing.md §"Request Header Injection"
|
|
631
|
+
*/
|
|
632
|
+
function applyRequestHeaderOverlay(overlay) {
|
|
633
|
+
const store = requestContextAls.getStore();
|
|
634
|
+
if (!store) throw new Error("[timber] applyRequestHeaderOverlay() called outside of a request context.");
|
|
635
|
+
let hasOverlay = false;
|
|
636
|
+
overlay.forEach(() => {
|
|
637
|
+
hasOverlay = true;
|
|
638
|
+
});
|
|
639
|
+
if (!hasOverlay) return;
|
|
640
|
+
const merged = new Headers(store.originalHeaders);
|
|
641
|
+
overlay.forEach((value, key) => {
|
|
642
|
+
merged.set(key, value);
|
|
643
|
+
});
|
|
644
|
+
store.headers = freezeHeaders(merged);
|
|
645
|
+
}
|
|
646
|
+
var MUTATING_METHODS = /* @__PURE__ */ new Set([
|
|
647
|
+
"set",
|
|
648
|
+
"append",
|
|
649
|
+
"delete"
|
|
650
|
+
]);
|
|
651
|
+
/**
|
|
652
|
+
* Wrap a Headers object in a Proxy that throws on mutating methods.
|
|
653
|
+
* Object.freeze doesn't work on Headers (native internal slots), so we
|
|
654
|
+
* intercept property access and reject set/append/delete at runtime.
|
|
655
|
+
*
|
|
656
|
+
* Read methods (get, has, entries, etc.) must be bound to the underlying
|
|
657
|
+
* Headers instance because they access private #headersList slots.
|
|
658
|
+
*/
|
|
659
|
+
function freezeHeaders(source) {
|
|
660
|
+
const copy = new Headers(source);
|
|
661
|
+
return new Proxy(copy, { get(target, prop) {
|
|
662
|
+
if (typeof prop === "string" && MUTATING_METHODS.has(prop)) return () => {
|
|
663
|
+
throw new Error(`[timber] getHeaders() returns a read-only Headers object. Calling .${prop}() is not allowed. Use ctx.requestHeaders in middleware to inject headers for downstream components.`);
|
|
664
|
+
};
|
|
665
|
+
const value = Reflect.get(target, prop);
|
|
666
|
+
if (typeof value === "function") return value.bind(target);
|
|
667
|
+
return value;
|
|
668
|
+
} });
|
|
669
|
+
}
|
|
670
|
+
//#endregion
|
|
671
|
+
//#region src/server/primitives.ts
|
|
672
|
+
/**
|
|
673
|
+
* Check if a value is JSON-serializable without data loss.
|
|
674
|
+
* Returns a description of the first non-serializable value found, or null if OK.
|
|
675
|
+
*
|
|
676
|
+
* @internal Exported for testing only.
|
|
677
|
+
*/
|
|
678
|
+
function findNonSerializable(value, path = "data") {
|
|
679
|
+
if (value === null || value === void 0) return null;
|
|
680
|
+
switch (typeof value) {
|
|
681
|
+
case "string":
|
|
682
|
+
case "number":
|
|
683
|
+
case "boolean": return null;
|
|
684
|
+
case "bigint": return `${path} contains a BigInt — BigInt throws in JSON.stringify`;
|
|
685
|
+
case "function": return `${path} is a function — functions are not JSON-serializable`;
|
|
686
|
+
case "symbol": return `${path} is a symbol — symbols are not JSON-serializable`;
|
|
687
|
+
case "object": break;
|
|
688
|
+
default: return `${path} has unsupported type "${typeof value}"`;
|
|
689
|
+
}
|
|
690
|
+
if (value instanceof Date) return `${path} is a Date — Dates silently coerce to strings in JSON.stringify`;
|
|
691
|
+
if (value instanceof Map) return `${path} is a Map — Maps serialize as {} in JSON.stringify (data loss)`;
|
|
692
|
+
if (value instanceof Set) return `${path} is a Set — Sets serialize as {} in JSON.stringify (data loss)`;
|
|
693
|
+
if (value instanceof RegExp) return `${path} is a RegExp — RegExps serialize as {} in JSON.stringify`;
|
|
694
|
+
if (value instanceof Error) return `${path} is an Error — Errors serialize as {} in JSON.stringify`;
|
|
695
|
+
if (Array.isArray(value)) {
|
|
696
|
+
for (let i = 0; i < value.length; i++) {
|
|
697
|
+
const result = findNonSerializable(value[i], `${path}[${i}]`);
|
|
698
|
+
if (result) return result;
|
|
699
|
+
}
|
|
700
|
+
return null;
|
|
701
|
+
}
|
|
702
|
+
const proto = Object.getPrototypeOf(value);
|
|
703
|
+
if (proto === null) return `${path} is a null-prototype object — React Flight rejects null prototypes`;
|
|
704
|
+
if (proto !== Object.prototype) return `${path} is a ${value.constructor?.name ?? "unknown"} instance — class instances may lose data in JSON.stringify`;
|
|
705
|
+
for (const key of Object.keys(value)) {
|
|
706
|
+
const result = findNonSerializable(value[key], `${path}.${key}`);
|
|
707
|
+
if (result) return result;
|
|
708
|
+
}
|
|
709
|
+
return null;
|
|
710
|
+
}
|
|
711
|
+
/**
|
|
712
|
+
* Emit a dev-mode warning if data is not JSON-serializable.
|
|
713
|
+
* No-op in production.
|
|
714
|
+
*/
|
|
715
|
+
function warnIfNotSerializable(data, callerName) {
|
|
716
|
+
if (!isDebug()) return;
|
|
717
|
+
if (data === void 0) return;
|
|
718
|
+
const issue = findNonSerializable(data);
|
|
719
|
+
if (issue) console.warn(`[timber] ${callerName}: ${issue}. Data passed to deny() or RenderError must be JSON-serializable because the post-flush path uses JSON.stringify, not React Flight.`);
|
|
720
|
+
}
|
|
721
|
+
var DENY_BRAND = Symbol.for("timber:signal.deny");
|
|
722
|
+
var REDIRECT_BRAND = Symbol.for("timber:signal.redirect");
|
|
723
|
+
var RENDER_ERROR_BRAND = Symbol.for("timber:signal.render-error");
|
|
724
|
+
var SSR_STREAM_ERROR_BRAND = Symbol.for("timber:signal.ssr-stream-error");
|
|
725
|
+
function hasBrand(value, brand) {
|
|
726
|
+
return typeof value === "object" && value !== null && brand in value;
|
|
727
|
+
}
|
|
728
|
+
/** True for any `DenySignal`, regardless of which module evaluation created it. */
|
|
729
|
+
function isDenySignal(error) {
|
|
730
|
+
return hasBrand(error, DENY_BRAND);
|
|
731
|
+
}
|
|
732
|
+
/** True for any `RedirectSignal`, regardless of which module evaluation created it. */
|
|
733
|
+
function isRedirectSignal(error) {
|
|
734
|
+
return hasBrand(error, REDIRECT_BRAND);
|
|
735
|
+
}
|
|
736
|
+
/**
|
|
737
|
+
* True for any `SsrStreamError`. This one also crosses Vite environments:
|
|
738
|
+
* it is thrown in SSR and caught in RSC, which are separate module graphs in
|
|
739
|
+
* the same process — the brand is the only identity the two share.
|
|
740
|
+
*/
|
|
741
|
+
function isSsrStreamError(error) {
|
|
742
|
+
return hasBrand(error, SSR_STREAM_ERROR_BRAND);
|
|
743
|
+
}
|
|
744
|
+
/**
|
|
745
|
+
* Render-phase signal thrown by `deny()`. Caught by the framework to produce
|
|
746
|
+
* the correct HTTP status code (segment context) or graceful degradation (slot context).
|
|
747
|
+
*
|
|
748
|
+
* Detect with `isDenySignal()`, never `instanceof` — see "Signal branding" above.
|
|
749
|
+
*/
|
|
750
|
+
var DenySignal = class extends Error {
|
|
751
|
+
[DENY_BRAND] = true;
|
|
752
|
+
status;
|
|
753
|
+
data;
|
|
754
|
+
/**
|
|
755
|
+
* Ordered list of segment keys that own matching deny pages for this
|
|
756
|
+
* signal, best match first. Present = addressed (a boundary should
|
|
757
|
+
* render it); absent = unplaced (the re-render fallback serves it).
|
|
758
|
+
*
|
|
759
|
+
* In-tree hoists stamp a single-element list (`[entry.ownerKey]`) —
|
|
760
|
+
* identical to the pre-TIM-1450 `ownerKey`. Late addressing (TIM-1450)
|
|
761
|
+
* stamps the full candidate list so the client can find the first
|
|
762
|
+
* *reachable* owner via its ancestry context, eliminating the
|
|
763
|
+
* owner-below-throw-site escape.
|
|
764
|
+
*
|
|
765
|
+
* See design/04-authorization.md §"Where a Deny Page Renders", TIM-1356.
|
|
766
|
+
*/
|
|
767
|
+
owners;
|
|
768
|
+
/**
|
|
769
|
+
* When true, the pipeline must respond with `rscErrorEnvelope` so the
|
|
770
|
+
* client hard-navigates instead of attempting to render a deny page
|
|
771
|
+
* from the RSC payload. Set by AccessGate when a skipped segment
|
|
772
|
+
* denies — rendering the deny page in-tree would appear inside the
|
|
773
|
+
* client's cached layout chrome (TIM-1074). See TIM-1363.
|
|
774
|
+
*/
|
|
775
|
+
_hardNavigate;
|
|
776
|
+
constructor(status, data) {
|
|
777
|
+
super(`Access denied with status ${status}`);
|
|
778
|
+
this.name = "DenySignal";
|
|
779
|
+
this.status = status;
|
|
780
|
+
this.data = data;
|
|
781
|
+
}
|
|
782
|
+
/**
|
|
783
|
+
* Extract the file that called deny() from the stack trace.
|
|
784
|
+
* Returns a short path (e.g. "app/auth/access.ts") or undefined if
|
|
785
|
+
* the stack can't be parsed. Dev-only — used for dev log output.
|
|
786
|
+
*/
|
|
787
|
+
get sourceFile() {
|
|
788
|
+
if (!this.stack) return void 0;
|
|
789
|
+
const frames = this.stack.split("\n");
|
|
790
|
+
for (let i = 2; i < frames.length; i++) {
|
|
791
|
+
const frame = frames[i];
|
|
792
|
+
if (!frame) continue;
|
|
793
|
+
if (frame.includes("primitives.ts") || frame.includes("node_modules")) continue;
|
|
794
|
+
const match = frame.match(/\(([^)]+?)(?::\d+:\d+)\)/) ?? frame.match(/at\s+([^\s]+?)(?::\d+:\d+)/);
|
|
795
|
+
if (match?.[1]) {
|
|
796
|
+
const full = match[1];
|
|
797
|
+
const appIdx = full.indexOf("/app/");
|
|
798
|
+
return appIdx >= 0 ? full.slice(appIdx + 1) : full;
|
|
799
|
+
}
|
|
800
|
+
}
|
|
801
|
+
}
|
|
802
|
+
};
|
|
803
|
+
/**
|
|
804
|
+
* Universal denial/error primitive. Throws a `DenySignal` that the framework catches.
|
|
805
|
+
*
|
|
806
|
+
* - In segment context (outside Suspense): produces HTTP status code
|
|
807
|
+
* - In slot context: graceful degradation → denied.tsx → default.tsx → null
|
|
808
|
+
* - Inside Suspense (hold window): promoted to pre-flush behavior
|
|
809
|
+
* - Inside Suspense (after flush): error boundary + noindex meta
|
|
810
|
+
*
|
|
811
|
+
* Supports both positional and object signatures:
|
|
812
|
+
* ```ts
|
|
813
|
+
* deny() // 403 (default)
|
|
814
|
+
* deny(404) // 404
|
|
815
|
+
* deny(503, { retry: true }) // 503 with data
|
|
816
|
+
* deny({ status: 503, message: 'Maintenance' }) // object form
|
|
817
|
+
* ```
|
|
818
|
+
*
|
|
819
|
+
* Accepts any 4xx or 5xx status code. This replaces the need for
|
|
820
|
+
* `throw new RenderError(...)` in user code — RenderError is now an
|
|
821
|
+
* internal pipeline detail.
|
|
822
|
+
*
|
|
823
|
+
* @param statusOrOptions - Status code (number) or options object. Default: 403.
|
|
824
|
+
* @param data - Optional JSON-serializable data (positional form only).
|
|
825
|
+
*/
|
|
826
|
+
function deny(statusOrOptions, data) {
|
|
827
|
+
let status;
|
|
828
|
+
let resolvedData;
|
|
829
|
+
if (typeof statusOrOptions === "object" && statusOrOptions !== null) {
|
|
830
|
+
status = statusOrOptions.status ?? 403;
|
|
831
|
+
resolvedData = statusOrOptions.data;
|
|
832
|
+
} else {
|
|
833
|
+
status = statusOrOptions ?? 403;
|
|
834
|
+
resolvedData = data;
|
|
835
|
+
}
|
|
836
|
+
if (status < 400 || status > 599) throw new Error(`deny() requires a 4xx or 5xx status code, got ${status}.`);
|
|
837
|
+
warnIfNotSerializable(resolvedData, "deny()");
|
|
838
|
+
throw new DenySignal(status, resolvedData);
|
|
839
|
+
}
|
|
840
|
+
/**
|
|
841
|
+
* Render-phase signal thrown by `redirect()` and `redirectExternal()`.
|
|
842
|
+
* Caught by the framework to produce a 3xx response or client-side navigation.
|
|
843
|
+
*
|
|
844
|
+
* Detect with `isRedirectSignal()`, never `instanceof` — see "Signal branding" above.
|
|
845
|
+
*/
|
|
846
|
+
var RedirectSignal = class extends Error {
|
|
847
|
+
[REDIRECT_BRAND] = true;
|
|
848
|
+
location;
|
|
849
|
+
status;
|
|
850
|
+
constructor(location, status) {
|
|
851
|
+
super(`Redirect to ${location}`);
|
|
852
|
+
this.name = "RedirectSignal";
|
|
853
|
+
this.location = location;
|
|
854
|
+
this.status = status;
|
|
855
|
+
}
|
|
856
|
+
};
|
|
857
|
+
/**
|
|
858
|
+
* Returns true if the error is a framework control-flow signal (RedirectSignal
|
|
859
|
+
* or DenySignal) rather than a genuine application error. Works both for direct
|
|
860
|
+
* instances (RSC-side) and deserialized digest errors (SSR cross-boundary).
|
|
861
|
+
*
|
|
862
|
+
* See also: isFrameworkSignalError() in client/browser-dev.ts (client-only).
|
|
863
|
+
*/
|
|
864
|
+
function isControlFlowSignal(error) {
|
|
865
|
+
if (isDenySignal(error) || isRedirectSignal(error)) return true;
|
|
866
|
+
if (error && typeof error === "object") {
|
|
867
|
+
const digest = error.digest;
|
|
868
|
+
if (typeof digest === "string") try {
|
|
869
|
+
const parsed = JSON.parse(digest);
|
|
870
|
+
if (parsed && typeof parsed === "object") return parsed.type === "redirect" || parsed.type === "deny";
|
|
871
|
+
} catch {}
|
|
872
|
+
}
|
|
873
|
+
return false;
|
|
874
|
+
}
|
|
875
|
+
/**
|
|
876
|
+
* Redirect to a relative path. Rejects absolute and protocol-relative URLs.
|
|
877
|
+
* Use `redirectExternal()` for external redirects with an allow-list.
|
|
878
|
+
*
|
|
879
|
+
* @param path - Relative path (e.g. '/login', 'settings', '/login?returnTo=/dash')
|
|
880
|
+
* @param statusOrOptions - HTTP status code (3xx, default 302) or options object.
|
|
881
|
+
*
|
|
882
|
+
* @example
|
|
883
|
+
* // Simple redirect
|
|
884
|
+
* redirect('/login');
|
|
885
|
+
*
|
|
886
|
+
* // With status code
|
|
887
|
+
* redirect('/login', 301);
|
|
888
|
+
*
|
|
889
|
+
* // With preserved search params
|
|
890
|
+
* redirect(`/docs/${version}/${slug}`, { preserveSearchParams: ['foo'] });
|
|
891
|
+
*/
|
|
892
|
+
function redirect(path, statusOrOptions) {
|
|
893
|
+
let status;
|
|
894
|
+
let preserveSearchParams;
|
|
895
|
+
if (typeof statusOrOptions === "number") status = statusOrOptions;
|
|
896
|
+
else if (statusOrOptions) {
|
|
897
|
+
status = statusOrOptions.status ?? (statusOrOptions.permanent ? 308 : 302);
|
|
898
|
+
preserveSearchParams = statusOrOptions.preserveSearchParams;
|
|
899
|
+
} else status = 302;
|
|
900
|
+
if (status < 300 || status > 399) throw new Error(`redirect() requires a 3xx status code, got ${status}.`);
|
|
901
|
+
assertRelativeRedirectPath(path);
|
|
902
|
+
let resolvedPath = path;
|
|
903
|
+
if (preserveSearchParams) {
|
|
904
|
+
const currentSearch = getRequestSearchString();
|
|
905
|
+
resolvedPath = mergePreservedSearchParams(path, currentSearch, preserveSearchParams);
|
|
906
|
+
}
|
|
907
|
+
throw new RedirectSignal(resolvedPath, status);
|
|
908
|
+
}
|
|
909
|
+
/**
|
|
910
|
+
* Redirect to an external URL. The origin must be in the provided allow-list.
|
|
911
|
+
*
|
|
912
|
+
* Only http: and https: schemes are permitted. The allow-list is matched
|
|
913
|
+
* against full origins (scheme + host + port), not bare hostnames.
|
|
914
|
+
*
|
|
915
|
+
* @param url - Absolute URL to redirect to.
|
|
916
|
+
* @param allowList - Array of allowed origins (e.g. ['https://example.com', 'https://auth.example.com']).
|
|
917
|
+
* @param status - HTTP redirect status code (3xx). Defaults to 302.
|
|
918
|
+
*/
|
|
919
|
+
function redirectExternal(url, allowList, status = 302) {
|
|
920
|
+
if (status < 300 || status > 399) throw new Error(`redirectExternal() requires a 3xx status code, got ${status}.`);
|
|
921
|
+
throw new RedirectSignal(validateExternalRedirectUrl(url, allowList), status);
|
|
922
|
+
}
|
|
923
|
+
/**
|
|
924
|
+
* Typed throw for render-phase errors that carry structured context to error boundaries.
|
|
925
|
+
*
|
|
926
|
+
* The `digest` (code + data) is serialized into the RSC stream separately from the
|
|
927
|
+
* Error instance — only the digest crosses the RSC → client boundary.
|
|
928
|
+
*
|
|
929
|
+
* @example
|
|
930
|
+
* ```ts
|
|
931
|
+
* throw new RenderError('PRODUCT_NOT_FOUND', {
|
|
932
|
+
* title: 'Product not found',
|
|
933
|
+
* resourceId: params.id,
|
|
934
|
+
* })
|
|
935
|
+
* ```
|
|
936
|
+
*
|
|
937
|
+
* Detect with `isRenderError()`, never `instanceof` — see "Signal branding" above.
|
|
938
|
+
*/
|
|
939
|
+
var RenderError = class extends Error {
|
|
940
|
+
[RENDER_ERROR_BRAND] = true;
|
|
941
|
+
code;
|
|
942
|
+
digest;
|
|
943
|
+
status;
|
|
944
|
+
constructor(code, data, options) {
|
|
945
|
+
super(`RenderError: ${code}`);
|
|
946
|
+
this.name = "RenderError";
|
|
947
|
+
this.code = code;
|
|
948
|
+
this.digest = {
|
|
949
|
+
code,
|
|
950
|
+
data
|
|
951
|
+
};
|
|
952
|
+
warnIfNotSerializable(data, "RenderError");
|
|
953
|
+
const status = options?.status ?? 500;
|
|
954
|
+
if (status < 400 || status > 599) throw new Error(`RenderError status must be 4xx or 5xx, got ${status}.`);
|
|
955
|
+
this.status = status;
|
|
956
|
+
}
|
|
957
|
+
};
|
|
958
|
+
var _waitUntilWarned = false;
|
|
959
|
+
/**
|
|
960
|
+
* Register a promise to be kept alive after the response is sent.
|
|
961
|
+
* Maps to `ctx.waitUntil()` on Cloudflare Workers and similar platforms.
|
|
962
|
+
*
|
|
963
|
+
* The platform adapter installs a per-request waitUntil function via ALS
|
|
964
|
+
* (see waituntil-bridge.ts). If no ALS handler is available, a warning
|
|
965
|
+
* is logged once and the promise is left to resolve (or reject) without
|
|
966
|
+
* being tracked.
|
|
967
|
+
*
|
|
968
|
+
* @param promise - The background work to keep alive.
|
|
969
|
+
*/
|
|
970
|
+
function waitUntil(promise) {
|
|
971
|
+
const alsFn = getWaitUntil();
|
|
972
|
+
if (alsFn) {
|
|
973
|
+
alsFn(promise);
|
|
974
|
+
return;
|
|
975
|
+
}
|
|
976
|
+
if (!_waitUntilWarned) {
|
|
977
|
+
_waitUntilWarned = true;
|
|
978
|
+
console.warn("[timber] waitUntil() is not supported by the current adapter. Background work will not be tracked. This warning is shown once.");
|
|
979
|
+
}
|
|
980
|
+
}
|
|
981
|
+
//#endregion
|
|
982
|
+
//#region src/server/tracing.ts
|
|
983
|
+
/**
|
|
984
|
+
* Tracing — per-request trace ID via AsyncLocalStorage, OTEL span helpers.
|
|
985
|
+
*
|
|
986
|
+
* getTraceId() is always available in server code (middleware, access, components, actions).
|
|
987
|
+
* Returns a 32-char lowercase hex string — the OTEL trace ID when an SDK is active,
|
|
988
|
+
* or a crypto.randomUUID()-derived fallback otherwise.
|
|
989
|
+
*
|
|
990
|
+
* See design/17-logging.md §"trace_id is Always Set"
|
|
991
|
+
*/
|
|
992
|
+
/**
|
|
993
|
+
* Returns the current request's trace ID — always a 32-char lowercase hex string.
|
|
994
|
+
*
|
|
995
|
+
* With OTEL: the real OTEL trace ID (matches Jaeger/Honeycomb/Datadog).
|
|
996
|
+
* Without OTEL: crypto.randomUUID() with hyphens stripped.
|
|
997
|
+
*
|
|
998
|
+
* Throws if called outside a request context (no ALS store).
|
|
999
|
+
*/
|
|
1000
|
+
function getTraceId() {
|
|
1001
|
+
const store = traceAls.getStore();
|
|
1002
|
+
if (!store) throw new Error("[timber] getTraceId() called outside of a request context. It can only be used in middleware, access checks, server components, and server actions.");
|
|
1003
|
+
return store.traceId;
|
|
1004
|
+
}
|
|
1005
|
+
/**
|
|
1006
|
+
* Returns the current OTEL span ID if available, undefined otherwise.
|
|
1007
|
+
*/
|
|
1008
|
+
function getSpanId() {
|
|
1009
|
+
return traceAls.getStore()?.spanId;
|
|
1010
|
+
}
|
|
1011
|
+
/**
|
|
1012
|
+
* Generate a 32-char lowercase hex ID from crypto.randomUUID().
|
|
1013
|
+
* Same format as OTEL trace IDs — zero-friction upgrade path.
|
|
1014
|
+
*/
|
|
1015
|
+
function generateTraceId() {
|
|
1016
|
+
return randomUUID().replace(/-/g, "");
|
|
1017
|
+
}
|
|
1018
|
+
/**
|
|
1019
|
+
* Run a callback within a trace context. Used by the pipeline to establish
|
|
1020
|
+
* per-request ALS scope.
|
|
1021
|
+
*/
|
|
1022
|
+
function runWithTraceId(id, fn) {
|
|
1023
|
+
return traceAls.run({ traceId: id }, fn);
|
|
1024
|
+
}
|
|
1025
|
+
/**
|
|
1026
|
+
* Replace the trace ID in the current ALS store. Used when OTEL creates
|
|
1027
|
+
* a root span and we want to switch from the UUID fallback to the real
|
|
1028
|
+
* OTEL trace ID.
|
|
1029
|
+
*/
|
|
1030
|
+
function replaceTraceId(newTraceId, newSpanId) {
|
|
1031
|
+
const store = traceAls.getStore();
|
|
1032
|
+
if (store) {
|
|
1033
|
+
store.traceId = newTraceId;
|
|
1034
|
+
store.spanId = newSpanId;
|
|
1035
|
+
}
|
|
1036
|
+
}
|
|
1037
|
+
/**
|
|
1038
|
+
* Update the span ID in the current ALS store. Used when entering a new
|
|
1039
|
+
* OTEL span to keep log–trace correlation accurate.
|
|
1040
|
+
*/
|
|
1041
|
+
function updateSpanId(newSpanId) {
|
|
1042
|
+
const store = traceAls.getStore();
|
|
1043
|
+
if (store) store.spanId = newSpanId;
|
|
1044
|
+
}
|
|
1045
|
+
/**
|
|
1046
|
+
* Get the current trace store, or undefined if outside a request context.
|
|
1047
|
+
* Framework-internal — use getTraceId()/getSpanId() in user code.
|
|
1048
|
+
*/
|
|
1049
|
+
function getTraceStore() {
|
|
1050
|
+
return traceAls.getStore();
|
|
1051
|
+
}
|
|
1052
|
+
var PLATFORM_TRACER_KEY = Symbol.for("timber:platform-tracer");
|
|
1053
|
+
/** The registered native platform tracer, if any. */
|
|
1054
|
+
function getPlatformTracer() {
|
|
1055
|
+
return globalThis[PLATFORM_TRACER_KEY];
|
|
1056
|
+
}
|
|
1057
|
+
/**
|
|
1058
|
+
* Attempt to get the @opentelemetry/api tracer. Returns undefined if the
|
|
1059
|
+
* package is not installed or no SDK is registered.
|
|
1060
|
+
*
|
|
1061
|
+
* timber.js depends on @opentelemetry/api as the vendor-neutral interface.
|
|
1062
|
+
* The API is a no-op by default — spans are only emitted when the developer
|
|
1063
|
+
* initializes an SDK in register().
|
|
1064
|
+
*/
|
|
1065
|
+
var _otelApi;
|
|
1066
|
+
async function getOtelApi() {
|
|
1067
|
+
if (_otelApi === void 0) try {
|
|
1068
|
+
_otelApi = await import("@opentelemetry/api");
|
|
1069
|
+
} catch {
|
|
1070
|
+
_otelApi = null;
|
|
1071
|
+
}
|
|
1072
|
+
return _otelApi;
|
|
1073
|
+
}
|
|
1074
|
+
/** OTEL tracer instance, lazily created. */
|
|
1075
|
+
var _tracer;
|
|
1076
|
+
/**
|
|
1077
|
+
* Get the timber.js OTEL tracer. Returns null if @opentelemetry/api is not available.
|
|
1078
|
+
*/
|
|
1079
|
+
async function getTracer() {
|
|
1080
|
+
if (_tracer === void 0) {
|
|
1081
|
+
const api = await getOtelApi();
|
|
1082
|
+
if (api) _tracer = api.trace.getTracer("timber.js");
|
|
1083
|
+
else _tracer = null;
|
|
1084
|
+
}
|
|
1085
|
+
return _tracer;
|
|
1086
|
+
}
|
|
1087
|
+
/**
|
|
1088
|
+
* Run a function within a framework span. Composes two emission channels:
|
|
1089
|
+
*
|
|
1090
|
+
* - **Native platform span** — when an adapter registered a PlatformTracer
|
|
1091
|
+
* (Cloudflare Workers), the fn is wrapped in platformTracer.enterSpan()
|
|
1092
|
+
* so it appears in the platform's native trace view.
|
|
1093
|
+
* - **OTEL span** — when an OTEL SDK is active, the fn also runs inside an
|
|
1094
|
+
* OTEL span (dual emission). No SDK and no platform tracer = zero overhead.
|
|
1095
|
+
*
|
|
1096
|
+
* Automatically:
|
|
1097
|
+
* - Creates the span as a child of the current context
|
|
1098
|
+
* - Updates the ALS span ID for log–trace correlation
|
|
1099
|
+
* - Ends the span when the function completes
|
|
1100
|
+
* - Records exceptions on error (OTEL channel)
|
|
1101
|
+
*/
|
|
1102
|
+
async function withSpan(name, attributes, fn) {
|
|
1103
|
+
const platformTracer = getPlatformTracer();
|
|
1104
|
+
if (!platformTracer) return runOtelSpan(name, attributes, fn);
|
|
1105
|
+
return platformTracer.enterSpan(name, async (span) => {
|
|
1106
|
+
for (const key of Object.keys(attributes)) span.setAttribute(key, attributes[key]);
|
|
1107
|
+
const store = traceAls.getStore();
|
|
1108
|
+
const prevPlatformSpan = store?.platformSpan;
|
|
1109
|
+
if (store) store.platformSpan = span;
|
|
1110
|
+
try {
|
|
1111
|
+
return await runOtelSpan(name, attributes, fn);
|
|
1112
|
+
} finally {
|
|
1113
|
+
if (store) store.platformSpan = prevPlatformSpan;
|
|
1114
|
+
}
|
|
1115
|
+
});
|
|
1116
|
+
}
|
|
1117
|
+
/** The OTEL half of withSpan() — no-op passthrough when no SDK is active. */
|
|
1118
|
+
async function runOtelSpan(name, attributes, fn) {
|
|
1119
|
+
const tracer = await getTracer();
|
|
1120
|
+
if (!tracer) return fn();
|
|
1121
|
+
const api = await getOtelApi();
|
|
1122
|
+
return tracer.startActiveSpan(name, { attributes }, async (span) => {
|
|
1123
|
+
const prevSpanId = getSpanId();
|
|
1124
|
+
updateSpanId(span.spanContext().spanId);
|
|
1125
|
+
try {
|
|
1126
|
+
const result = await fn();
|
|
1127
|
+
span.setStatus({ code: api.SpanStatusCode.OK });
|
|
1128
|
+
return result;
|
|
1129
|
+
} catch (error) {
|
|
1130
|
+
span.setStatus({ code: api.SpanStatusCode.ERROR });
|
|
1131
|
+
if (error instanceof Error) span.recordException(error);
|
|
1132
|
+
throw error;
|
|
1133
|
+
} finally {
|
|
1134
|
+
span.end();
|
|
1135
|
+
updateSpanId(prevSpanId);
|
|
1136
|
+
}
|
|
1137
|
+
});
|
|
1138
|
+
}
|
|
1139
|
+
/**
|
|
1140
|
+
* Set an attribute on the current active span (if any).
|
|
1141
|
+
* Used for setting span attributes after span creation (e.g. timber.result on access spans).
|
|
1142
|
+
*/
|
|
1143
|
+
async function setSpanAttribute(key, value) {
|
|
1144
|
+
const platformSpan = traceAls.getStore()?.platformSpan;
|
|
1145
|
+
if (platformSpan) platformSpan.setAttribute(key, value);
|
|
1146
|
+
const api = await getOtelApi();
|
|
1147
|
+
if (!api) return;
|
|
1148
|
+
const activeSpan = api.trace.getActiveSpan();
|
|
1149
|
+
if (activeSpan) activeSpan.setAttribute(key, value);
|
|
1150
|
+
}
|
|
1151
|
+
/**
|
|
1152
|
+
* Add a span event to the current active span (if any).
|
|
1153
|
+
* Used for timber.cache HIT/MISS events — recorded as span events, not child spans.
|
|
1154
|
+
*/
|
|
1155
|
+
async function addSpanEvent(name, attributes) {
|
|
1156
|
+
const api = await getOtelApi();
|
|
1157
|
+
if (!api) return;
|
|
1158
|
+
const activeSpan = api.trace.getActiveSpan();
|
|
1159
|
+
if (activeSpan) activeSpan.addEvent(name, attributes);
|
|
1160
|
+
}
|
|
1161
|
+
/**
|
|
1162
|
+
* Fire-and-forget span event — no await, no microtask overhead.
|
|
1163
|
+
*
|
|
1164
|
+
* Used on the cache hot path where awaiting addSpanEvent creates an
|
|
1165
|
+
* unnecessary microtask per cache operation. If OTEL is not loaded yet,
|
|
1166
|
+
* the event is silently dropped (acceptable for diagnostics).
|
|
1167
|
+
*
|
|
1168
|
+
* See TIM-370 for perf motivation.
|
|
1169
|
+
*/
|
|
1170
|
+
function addSpanEventSync(name, attributes) {
|
|
1171
|
+
if (!_otelApi) return;
|
|
1172
|
+
const activeSpan = _otelApi.trace.getActiveSpan();
|
|
1173
|
+
if (activeSpan) activeSpan.addEvent(name, attributes);
|
|
1174
|
+
}
|
|
1175
|
+
/**
|
|
1176
|
+
* Try to extract the OTEL trace ID from the current active span context.
|
|
1177
|
+
* Returns undefined if OTEL is not active or no span exists.
|
|
1178
|
+
*/
|
|
1179
|
+
async function getOtelTraceId() {
|
|
1180
|
+
const api = await getOtelApi();
|
|
1181
|
+
if (!api) return void 0;
|
|
1182
|
+
const activeSpan = api.trace.getActiveSpan();
|
|
1183
|
+
if (!activeSpan) return void 0;
|
|
1184
|
+
const ctx = activeSpan.spanContext();
|
|
1185
|
+
if (!ctx.traceId || ctx.traceId === "00000000000000000000000000000000") return;
|
|
1186
|
+
return {
|
|
1187
|
+
traceId: ctx.traceId,
|
|
1188
|
+
spanId: ctx.spanId
|
|
1189
|
+
};
|
|
1190
|
+
}
|
|
1191
|
+
//#endregion
|
|
1192
|
+
//#region src/server/error-formatter.ts
|
|
1193
|
+
/**
|
|
1194
|
+
* Error Formatter — rewrites SSR/RSC error messages to surface user code.
|
|
1195
|
+
*
|
|
1196
|
+
* When React or Vite throw errors during SSR, stack traces reference
|
|
1197
|
+
* vendored dependency paths (e.g. `.vite/deps_ssr/@vitejs_plugin-rsc_vendor_...`)
|
|
1198
|
+
* and mangled export names (`__vite_ssr_export_default__`). This module
|
|
1199
|
+
* rewrites error messages and stack traces to point at user code instead.
|
|
1200
|
+
*
|
|
1201
|
+
* Dev-only — in production, errors go through the structured logger
|
|
1202
|
+
* without formatting.
|
|
1203
|
+
*/
|
|
1204
|
+
/**
|
|
1205
|
+
* Patterns that identify internal Vite/RSC vendor paths in stack traces.
|
|
1206
|
+
* These are replaced with human-readable labels.
|
|
1207
|
+
*/
|
|
1208
|
+
var VENDOR_PATH_PATTERNS = [
|
|
1209
|
+
{
|
|
1210
|
+
pattern: /node_modules\/\.vite\/deps_ssr\/@vitejs_plugin-rsc_vendor_react-server-dom[^\s)]+/g,
|
|
1211
|
+
replacement: "<react-server-dom>"
|
|
1212
|
+
},
|
|
1213
|
+
{
|
|
1214
|
+
pattern: /node_modules\/\.vite\/deps_ssr\/@vitejs_plugin-rsc_vendor[^\s)]+/g,
|
|
1215
|
+
replacement: "<rsc-vendor>"
|
|
1216
|
+
},
|
|
1217
|
+
{
|
|
1218
|
+
pattern: /node_modules\/\.vite\/deps_ssr\/[^\s)]+/g,
|
|
1219
|
+
replacement: "<vite-dep>"
|
|
1220
|
+
},
|
|
1221
|
+
{
|
|
1222
|
+
pattern: /node_modules\/\.vite\/deps\/[^\s)]+/g,
|
|
1223
|
+
replacement: "<vite-dep>"
|
|
1224
|
+
}
|
|
1225
|
+
];
|
|
1226
|
+
/**
|
|
1227
|
+
* Patterns that identify Vite-mangled export names in error messages.
|
|
1228
|
+
*/
|
|
1229
|
+
var MANGLED_NAME_PATTERNS = [{
|
|
1230
|
+
pattern: /__vite_ssr_export_default__/g,
|
|
1231
|
+
replacement: "<default export>"
|
|
1232
|
+
}, {
|
|
1233
|
+
pattern: /__vite_ssr_export_(\w+)__/g,
|
|
1234
|
+
replacement: "<export $1>"
|
|
1235
|
+
}];
|
|
1236
|
+
/**
|
|
1237
|
+
* Rewrite an error's message and stack to replace internal Vite paths
|
|
1238
|
+
* and mangled names with human-readable labels.
|
|
1239
|
+
*/
|
|
1240
|
+
function formatSsrError(error) {
|
|
1241
|
+
if (!(error instanceof Error)) return String(error);
|
|
1242
|
+
let message = error.message;
|
|
1243
|
+
let stack = error.stack ?? "";
|
|
1244
|
+
for (const { pattern, replacement } of MANGLED_NAME_PATTERNS) message = message.replace(pattern, replacement);
|
|
1245
|
+
for (const { pattern, replacement } of VENDOR_PATH_PATTERNS) stack = stack.replace(pattern, replacement);
|
|
1246
|
+
for (const { pattern, replacement } of MANGLED_NAME_PATTERNS) stack = stack.replace(pattern, replacement);
|
|
1247
|
+
const hint = extractErrorHint(error.message);
|
|
1248
|
+
const parts = [];
|
|
1249
|
+
parts.push(message);
|
|
1250
|
+
if (hint) parts.push(` → ${hint}`);
|
|
1251
|
+
const userFrames = extractUserFrames(stack);
|
|
1252
|
+
if (userFrames.length > 0) {
|
|
1253
|
+
parts.push("");
|
|
1254
|
+
parts.push(" User code in stack:");
|
|
1255
|
+
for (const frame of userFrames) parts.push(` ${frame}`);
|
|
1256
|
+
}
|
|
1257
|
+
return parts.join("\n");
|
|
1258
|
+
}
|
|
1259
|
+
/**
|
|
1260
|
+
* Extract a human-readable hint from common React/RSC error messages.
|
|
1261
|
+
*
|
|
1262
|
+
* React error messages contain useful information but the surrounding
|
|
1263
|
+
* context (vendor paths, mangled names) obscures it. This extracts the
|
|
1264
|
+
* actionable part as a one-line hint.
|
|
1265
|
+
*/
|
|
1266
|
+
function extractErrorHint(message) {
|
|
1267
|
+
if (message.match(/Functions cannot be passed directly to Client Components/)) {
|
|
1268
|
+
const propMatch = message.match(/<[^>]*?\s(\w+)=\{function/);
|
|
1269
|
+
if (propMatch) return `Prop "${propMatch[1]}" is a function — mark it "use server" or call it before passing`;
|
|
1270
|
+
return "A function prop was passed to a Client Component — mark it \"use server\" or call it before passing";
|
|
1271
|
+
}
|
|
1272
|
+
if (message.includes("Objects are not valid as a React child")) return "An object was rendered as JSX children — convert to string or extract the value";
|
|
1273
|
+
const nullRefMatch = message.match(/Cannot read propert(?:y|ies) of (undefined|null) \(reading '(\w+)'\)/);
|
|
1274
|
+
if (nullRefMatch) return `Accessed .${nullRefMatch[2]} on ${nullRefMatch[1]} — check that the value exists`;
|
|
1275
|
+
const notFnMatch = message.match(/(\w+) is not a function/);
|
|
1276
|
+
if (notFnMatch) return `"${notFnMatch[1]}" is not a function — check imports and exports`;
|
|
1277
|
+
if (message.includes("Element type is invalid")) return "A component resolved to undefined/null — check default exports and import paths";
|
|
1278
|
+
if (message.includes("Invalid hook call")) return "A hook was called outside of a React component render. If this is a 'use client' component, ensure the directive is at the very top of the file (before any imports) and that @vitejs/plugin-rsc is loaded correctly. Barrel re-exports from non-'use client' files do not propagate the directive.";
|
|
1279
|
+
return null;
|
|
1280
|
+
}
|
|
1281
|
+
/**
|
|
1282
|
+
* Extract stack frames that reference user code (not node_modules,
|
|
1283
|
+
* not framework internals).
|
|
1284
|
+
*
|
|
1285
|
+
* Returns at most 5 frames to keep output concise.
|
|
1286
|
+
*/
|
|
1287
|
+
function extractUserFrames(stack) {
|
|
1288
|
+
const lines = stack.split("\n");
|
|
1289
|
+
const userFrames = [];
|
|
1290
|
+
for (const line of lines) {
|
|
1291
|
+
const trimmed = line.trim();
|
|
1292
|
+
if (!trimmed.startsWith("at ")) continue;
|
|
1293
|
+
if (trimmed.includes("node_modules") || trimmed.includes("<react-server-dom>") || trimmed.includes("<rsc-vendor>") || trimmed.includes("<vite-dep>") || trimmed.includes("node:internal")) continue;
|
|
1294
|
+
userFrames.push(trimmed);
|
|
1295
|
+
if (userFrames.length >= 5) break;
|
|
1296
|
+
}
|
|
1297
|
+
return userFrames;
|
|
1298
|
+
}
|
|
1299
|
+
//#endregion
|
|
1300
|
+
//#region src/server/default-logger.ts
|
|
1301
|
+
/**
|
|
1302
|
+
* DefaultLogger — human-readable stderr logging when no custom logger is configured.
|
|
1303
|
+
*
|
|
1304
|
+
* Ships as the fallback so production deployments always have error visibility,
|
|
1305
|
+
* even without an `instrumentation.ts` logger export. Output is one line per
|
|
1306
|
+
* event, designed for `fly logs`, `kubectl logs`, Cloudflare dashboard tails, etc.
|
|
1307
|
+
*
|
|
1308
|
+
* Format:
|
|
1309
|
+
* [timber] ERROR message key=value key=value trace_id=4bf92f35
|
|
1310
|
+
* [timber] WARN message key=value key=value trace_id=4bf92f35
|
|
1311
|
+
* [timber] INFO message method=GET path=/dashboard status=200 durationMs=43 trace_id=4bf92f35
|
|
1312
|
+
*
|
|
1313
|
+
* Behavior:
|
|
1314
|
+
* - Suppressed entirely in dev mode (dev logging handles all output)
|
|
1315
|
+
* - `debug` suppressed unless TIMBER_DEBUG is set
|
|
1316
|
+
* - Replaced entirely when a custom logger is set via `setLogger()`
|
|
1317
|
+
*
|
|
1318
|
+
* See design/17-logging.md §"DefaultLogger"
|
|
1319
|
+
*/
|
|
1320
|
+
/**
|
|
1321
|
+
* Format data fields as `key=value` pairs for human-readable output.
|
|
1322
|
+
* - `error` key is serialized via formatSsrError for stack trace cleanup
|
|
1323
|
+
* - `trace_id` is truncated to 8 chars for readability (full ID in OTEL)
|
|
1324
|
+
* - Other values are stringified inline
|
|
1325
|
+
*/
|
|
1326
|
+
function formatDataFields(data) {
|
|
1327
|
+
if (!data) return "";
|
|
1328
|
+
const parts = [];
|
|
1329
|
+
let traceId;
|
|
1330
|
+
for (const [key, value] of Object.entries(data)) {
|
|
1331
|
+
if (key === "trace_id") {
|
|
1332
|
+
traceId = typeof value === "string" ? value : String(value);
|
|
1333
|
+
continue;
|
|
1334
|
+
}
|
|
1335
|
+
if (key === "error") {
|
|
1336
|
+
parts.push(`error=${formatSsrError(value)}`);
|
|
1337
|
+
continue;
|
|
1338
|
+
}
|
|
1339
|
+
if (value === void 0 || value === null) continue;
|
|
1340
|
+
parts.push(`${key}=${value}`);
|
|
1341
|
+
}
|
|
1342
|
+
if (traceId) parts.push(`trace_id=${traceId.slice(0, 8)}`);
|
|
1343
|
+
return parts.length > 0 ? " " + parts.join(" ") : "";
|
|
1344
|
+
}
|
|
1345
|
+
/** Pad level string to fixed width for alignment. */
|
|
1346
|
+
function padLevel(level) {
|
|
1347
|
+
return level.padEnd(5);
|
|
1348
|
+
}
|
|
1349
|
+
function createDefaultLogger() {
|
|
1350
|
+
return {
|
|
1351
|
+
error(msg, data) {
|
|
1352
|
+
const fields = formatDataFields(data);
|
|
1353
|
+
process.stderr.write(`[timber] ${padLevel("ERROR")} ${msg}${fields}\n`);
|
|
1354
|
+
},
|
|
1355
|
+
warn(msg, data) {
|
|
1356
|
+
const fields = formatDataFields(data);
|
|
1357
|
+
process.stderr.write(`[timber] ${padLevel("WARN")} ${msg}${fields}\n`);
|
|
1358
|
+
},
|
|
1359
|
+
info(msg, data) {
|
|
1360
|
+
if (isDevMode()) return;
|
|
1361
|
+
if (!isDebug()) return;
|
|
1362
|
+
const fields = formatDataFields(data);
|
|
1363
|
+
process.stderr.write(`[timber] ${padLevel("INFO")} ${msg}${fields}\n`);
|
|
1364
|
+
},
|
|
1365
|
+
debug(msg, data) {
|
|
1366
|
+
if (isDevMode()) return;
|
|
1367
|
+
if (!isDebug()) return;
|
|
1368
|
+
const fields = formatDataFields(data);
|
|
1369
|
+
process.stderr.write(`[timber] ${padLevel("DEBUG")} ${msg}${fields}\n`);
|
|
1370
|
+
}
|
|
1371
|
+
};
|
|
1372
|
+
}
|
|
1373
|
+
//#endregion
|
|
1374
|
+
//#region src/server/logger.ts
|
|
1375
|
+
/**
|
|
1376
|
+
* Logger — structured logging with environment-aware formatting.
|
|
1377
|
+
*
|
|
1378
|
+
* timber.js ships a DefaultLogger that writes human-readable lines to stderr
|
|
1379
|
+
* in production. Users can export a custom logger from instrumentation.ts to
|
|
1380
|
+
* replace it with pino, winston, or any TimberLogger-compatible object.
|
|
1381
|
+
*
|
|
1382
|
+
* See design/17-logging.md §"Production Logging"
|
|
1383
|
+
*/
|
|
1384
|
+
var _logger = createDefaultLogger();
|
|
1385
|
+
/**
|
|
1386
|
+
* Set the user-provided logger. Called by the instrumentation loader
|
|
1387
|
+
* when it finds a `logger` export in instrumentation.ts. Replaces
|
|
1388
|
+
* the DefaultLogger entirely.
|
|
1389
|
+
*/
|
|
1390
|
+
function setLogger(logger) {
|
|
1391
|
+
_logger = logger;
|
|
1392
|
+
}
|
|
1393
|
+
/**
|
|
1394
|
+
* Get the current logger. Always non-null — returns DefaultLogger when
|
|
1395
|
+
* no custom logger is configured.
|
|
1396
|
+
*/
|
|
1397
|
+
function getLogger() {
|
|
1398
|
+
return _logger;
|
|
1399
|
+
}
|
|
1400
|
+
/**
|
|
1401
|
+
* Inject trace_id and span_id into log data for log–trace correlation.
|
|
1402
|
+
* Always injects trace_id (never undefined). Injects span_id only when OTEL is active.
|
|
1403
|
+
*/
|
|
1404
|
+
function withTraceContext(data) {
|
|
1405
|
+
const store = getTraceStore();
|
|
1406
|
+
const enriched = { ...data };
|
|
1407
|
+
if (store) {
|
|
1408
|
+
enriched.trace_id = store.traceId;
|
|
1409
|
+
if (store.spanId) enriched.span_id = store.spanId;
|
|
1410
|
+
}
|
|
1411
|
+
return enriched;
|
|
1412
|
+
}
|
|
1413
|
+
/** Log a completed request. Level: info. */
|
|
1414
|
+
function logRequestCompleted(data) {
|
|
1415
|
+
_logger.info("request completed", withTraceContext(data));
|
|
1416
|
+
}
|
|
1417
|
+
/** Log request received. Level: debug. */
|
|
1418
|
+
function logRequestReceived(data) {
|
|
1419
|
+
_logger.debug("request received", withTraceContext(data));
|
|
1420
|
+
}
|
|
1421
|
+
/** Log a slow request warning. Level: warn. */
|
|
1422
|
+
function logSlowRequest(data) {
|
|
1423
|
+
_logger.warn("slow request exceeded threshold", withTraceContext(data));
|
|
1424
|
+
}
|
|
1425
|
+
/** Log middleware short-circuit. Level: debug. */
|
|
1426
|
+
function logMiddlewareShortCircuit(data) {
|
|
1427
|
+
_logger.debug("middleware short-circuited", withTraceContext(data));
|
|
1428
|
+
}
|
|
1429
|
+
/** Log unhandled error in middleware phase. Level: error. */
|
|
1430
|
+
function logMiddlewareError(data) {
|
|
1431
|
+
if (isControlFlowSignal(data.error)) return;
|
|
1432
|
+
_logger.error("unhandled error in middleware phase", withTraceContext(data));
|
|
1433
|
+
}
|
|
1434
|
+
/** Log unhandled render-phase error. Level: error. */
|
|
1435
|
+
function logRenderError(data) {
|
|
1436
|
+
if (isControlFlowSignal(data.error)) return;
|
|
1437
|
+
_logger.error("unhandled render-phase error", withTraceContext(data));
|
|
1438
|
+
}
|
|
1439
|
+
/** Log proxy.ts uncaught error. Level: error. */
|
|
1440
|
+
function logProxyError(data) {
|
|
1441
|
+
_logger.error("proxy.ts threw uncaught error", withTraceContext(data));
|
|
1442
|
+
}
|
|
1443
|
+
/** Log unhandled error in route handler. Level: error. */
|
|
1444
|
+
function logRouteError(data) {
|
|
1445
|
+
if (isControlFlowSignal(data.error)) return;
|
|
1446
|
+
_logger.error("unhandled route handler error", withTraceContext(data));
|
|
1447
|
+
}
|
|
1448
|
+
/** Log waitUntil() adapter missing (once at startup). Level: warn. */
|
|
1449
|
+
function logWaitUntilUnsupported() {
|
|
1450
|
+
_logger.warn("adapter does not support waitUntil()");
|
|
1451
|
+
}
|
|
1452
|
+
/** Log waitUntil() promise rejection. Level: warn. */
|
|
1453
|
+
function logWaitUntilRejected(data) {
|
|
1454
|
+
_logger.warn("waitUntil() promise rejected", withTraceContext(data));
|
|
1455
|
+
}
|
|
1456
|
+
/** Log staleWhileRevalidate refetch failure. Level: warn. */
|
|
1457
|
+
function logSwrRefetchFailed(data) {
|
|
1458
|
+
_logger.warn("staleWhileRevalidate refetch failed", withTraceContext(data));
|
|
1459
|
+
}
|
|
1460
|
+
/** Log cache miss. Level: debug. */
|
|
1461
|
+
function logCacheMiss(data) {
|
|
1462
|
+
_logger.debug("timber.cache MISS", withTraceContext(data));
|
|
1463
|
+
}
|
|
1464
|
+
/**
|
|
1465
|
+
* Log an intentionally swallowed error. Provides observability into catch
|
|
1466
|
+
* blocks that are deliberately empty — the error is consumed, never rethrown.
|
|
1467
|
+
*
|
|
1468
|
+
* Default level: `warn` in dev (so the overlay surfaces patterns), `debug`
|
|
1469
|
+
* in production (low noise unless TIMBER_DEBUG is set). Pass `opts.level`
|
|
1470
|
+
* to override.
|
|
1471
|
+
*
|
|
1472
|
+
* **Infallible** — swallow() itself never throws, even if the logger is
|
|
1473
|
+
* broken. A thrown swallow would turn a benign catch into a crash.
|
|
1474
|
+
*/
|
|
1475
|
+
function swallow(err, reason, opts) {
|
|
1476
|
+
try {
|
|
1477
|
+
const level = opts?.level ?? (isDevMode() ? "warn" : "debug");
|
|
1478
|
+
_logger[level](`swallowed: ${reason}`, withTraceContext({ error: err }));
|
|
1479
|
+
} catch {}
|
|
1480
|
+
}
|
|
1481
|
+
//#endregion
|
|
1482
|
+
export { isDenySignal as A, getSegmentParams as B, runWithTraceId as C, RedirectSignal as D, DenySignal as E, waitUntil as F, setSegmentParams as G, runWithRequestContext as H, applyRequestHeaderOverlay as I, getSetCookieHeaders as J, getCookie as K, getHeader as L, isSsrStreamError as M, redirect as N, RenderError as O, redirectExternal as P, getHeaders as R, replaceTraceId as S, withSpan as T, setMatchedSegmentPath as U, markResponseFlushed as V, setMutableCookieContext as W, isDevMode as X, isDebug as Y, getWaitUntil as Z, addSpanEventSync as _, logProxyError as a, getSpanId as b, logRequestReceived as c, logSwrRefetchFailed as d, logWaitUntilRejected as f, addSpanEvent as g, swallow as h, logMiddlewareShortCircuit as i, isRedirectSignal as j, deny as k, logRouteError as l, setLogger as m, logCacheMiss as n, logRenderError as o, logWaitUntilUnsupported as p, getCookieJar as q, logMiddlewareError as r, logRequestCompleted as s, getLogger as t, logSlowRequest as u, generateTraceId as v, setSpanAttribute as w, getTraceId as x, getOtelTraceId as y, getSearchParams as z };
|
|
1483
|
+
|
|
1484
|
+
//# sourceMappingURL=logger-uLBuGKDI.js.map
|