@timber-js/app 0.2.0-alpha.21 → 0.2.0-alpha.211
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/bin/timber.mjs +15 -1
- package/dist/_chunks/actions-Rjk4htmA.js +1199 -0
- package/dist/_chunks/actions-Rjk4htmA.js.map +1 -0
- package/dist/_chunks/als-registry-DaxkVjt5.js +45 -0
- package/dist/_chunks/als-registry-DaxkVjt5.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-DWppEdLB.js +86 -0
- package/dist/_chunks/build-manifest-DWppEdLB.js.map +1 -0
- package/dist/_chunks/build-output-helper-RV_BRcF1.js +367 -0
- package/dist/_chunks/build-output-helper-RV_BRcF1.js.map +1 -0
- package/dist/_chunks/cache-api-DGdYfNJn.js +1182 -0
- package/dist/_chunks/cache-api-DGdYfNJn.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-DGX9zmg9.js +272 -0
- package/dist/_chunks/chains-DGX9zmg9.js.map +1 -0
- package/dist/_chunks/classify-QwG5rxKI.js +147 -0
- package/dist/_chunks/classify-QwG5rxKI.js.map +1 -0
- package/dist/_chunks/cli-check-ajNY3B2e.js +252 -0
- package/dist/_chunks/cli-check-ajNY3B2e.js.map +1 -0
- package/dist/_chunks/cli-context-By7k2xVo.js +70 -0
- package/dist/_chunks/cli-context-By7k2xVo.js.map +1 -0
- package/dist/_chunks/cli-schema-sync-D2eI8jEg.js +299 -0
- package/dist/_chunks/cli-schema-sync-D2eI8jEg.js.map +1 -0
- package/dist/_chunks/client-dep-entries-2HCF09no.js +66 -0
- package/dist/_chunks/client-dep-entries-2HCF09no.js.map +1 -0
- package/dist/_chunks/cloudflare-Byxl8FWP.js +1333 -0
- package/dist/_chunks/cloudflare-Byxl8FWP.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/codegen-Bps1sLKJ.js +432 -0
- package/dist/_chunks/codegen-Bps1sLKJ.js.map +1 -0
- package/dist/_chunks/convention-lint-DLmhGsRS.js +590 -0
- package/dist/_chunks/convention-lint-DLmhGsRS.js.map +1 -0
- package/dist/_chunks/dev-server-TFpEwm3H.js +2039 -0
- package/dist/_chunks/dev-server-TFpEwm3H.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-DsNScGRM.js +1024 -0
- package/dist/_chunks/error-boundary-DsNScGRM.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/format-BKclgVbk.js +14 -0
- package/dist/_chunks/format-BKclgVbk.js.map +1 -0
- package/dist/_chunks/fs-identity-BRKuL215.js +207 -0
- package/dist/_chunks/fs-identity-BRKuL215.js.map +1 -0
- package/dist/_chunks/graph-cache-CYiUS2aS.js +303 -0
- package/dist/_chunks/graph-cache-CYiUS2aS.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-CVuRs2hG.js +66 -0
- package/dist/_chunks/json-lossy-check-CVuRs2hG.js.map +1 -0
- package/dist/_chunks/live-graph-cNuWMYQI.js +151 -0
- package/dist/_chunks/live-graph-cNuWMYQI.js.map +1 -0
- package/dist/_chunks/logger-BP0LN6vP.js +662 -0
- package/dist/_chunks/logger-BP0LN6vP.js.map +1 -0
- package/dist/_chunks/{metadata-routes-Cjmvi3rQ.js → metadata-routes-DSDjM_hJ.js} +71 -27
- package/dist/_chunks/metadata-routes-DSDjM_hJ.js.map +1 -0
- package/dist/_chunks/navigation-root-BQfo1-kG.js +126 -0
- package/dist/_chunks/navigation-root-BQfo1-kG.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-BPBPc3lL.js +345 -0
- package/dist/_chunks/plugin-context-BPBPc3lL.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-CfQ3unZR.js +99 -0
- package/dist/_chunks/poison-scan-CfQ3unZR.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/render-timeout-DOf_BBcO.js +46 -0
- package/dist/_chunks/render-timeout-DOf_BBcO.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-dffcs4jp.js +54 -0
- package/dist/_chunks/rsc-payload-path-dffcs4jp.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-DmqdxzbW.js +2056 -0
- package/dist/_chunks/scanner-DmqdxzbW.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-xtPUGfdq.js +137 -0
- package/dist/_chunks/segment-context-xtPUGfdq.js.map +1 -0
- package/dist/_chunks/segment-keys-D5hu1hz4.js +62 -0
- package/dist/_chunks/segment-keys-D5hu1hz4.js.map +1 -0
- package/dist/_chunks/singleflight-BeVMMKi0.js +55 -0
- package/dist/_chunks/singleflight-BeVMMKi0.js.map +1 -0
- package/dist/_chunks/sizeof-BM1409x2.js +36 -0
- package/dist/_chunks/sizeof-BM1409x2.js.map +1 -0
- package/dist/_chunks/ssr-data-nA3I70_n.js +49 -0
- package/dist/_chunks/ssr-data-nA3I70_n.js.map +1 -0
- package/dist/_chunks/state-BhNGPsdi.js +50 -0
- package/dist/_chunks/state-BhNGPsdi.js.map +1 -0
- package/dist/_chunks/status-page-marker-BRX9Ib-d.js +564 -0
- package/dist/_chunks/status-page-marker-BRX9Ib-d.js.map +1 -0
- package/dist/_chunks/tree-match-6yihorhk.js +169 -0
- package/dist/_chunks/tree-match-6yihorhk.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-Czu2jXFq.js +144 -0
- package/dist/_chunks/walkers-Czu2jXFq.js.map +1 -0
- package/dist/_chunks/write-file-atomic-D1qWqHb4.js +32 -0
- package/dist/_chunks/write-file-atomic-D1qWqHb4.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/canonicalize-module.d.ts +8 -0
- package/dist/adapters/canonicalize-module.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 +224 -24
- package/dist/adapters/cloudflare.d.ts.map +1 -1
- package/dist/adapters/cloudflare.js +2 -188
- package/dist/adapters/compress-module.d.ts +25 -4
- package/dist/adapters/compress-module.d.ts.map +1 -1
- package/dist/adapters/fs-identity.d.ts +63 -0
- package/dist/adapters/fs-identity.d.ts.map +1 -0
- package/dist/adapters/nitro-presets.d.ts +31 -0
- package/dist/adapters/nitro-presets.d.ts.map +1 -0
- package/dist/adapters/nitro-preview.d.ts +64 -0
- package/dist/adapters/nitro-preview.d.ts.map +1 -0
- package/dist/adapters/nitro.d.ts +54 -37
- package/dist/adapters/nitro.d.ts.map +1 -1
- package/dist/adapters/nitro.js +631 -359
- package/dist/adapters/nitro.js.map +1 -1
- package/dist/adapters/shared.d.ts +67 -0
- package/dist/adapters/shared.d.ts.map +1 -0
- package/dist/adapters/types.d.ts +122 -16
- package/dist/adapters/types.d.ts.map +1 -1
- package/dist/adapters/types.js +0 -0
- package/dist/analyze/chains.d.ts +124 -0
- package/dist/analyze/chains.d.ts.map +1 -0
- package/dist/analyze/classify.d.ts +153 -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 +314 -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 +5 -0
- package/dist/cache/fast-hash.d.ts.map +1 -1
- 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 -326
- 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 +133 -0
- package/dist/cli-check.d.ts.map +1 -0
- package/dist/cli-context.d.ts +54 -0
- package/dist/cli-context.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 +85 -13
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +224 -63
- package/dist/cli.js.map +1 -1
- package/dist/client/browser-dev.d.ts +42 -2
- 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 +63 -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 +53 -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 +26 -0
- package/dist/client/browser-entry/post-hydration.d.ts.map +1 -0
- package/dist/client/browser-entry/router-init.d.ts +41 -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 +58 -9
- 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 +55 -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 +330 -1150
- 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 +792 -0
- package/dist/client/internal.js.map +1 -0
- package/dist/client/link.d.ts +85 -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 +133 -0
- package/dist/client/navigation-api.d.ts.map +1 -0
- package/dist/client/navigation-commit.d.ts +111 -0
- package/dist/client/navigation-commit.d.ts.map +1 -0
- package/dist/client/navigation-context.d.ts +54 -36
- package/dist/client/navigation-context.d.ts.map +1 -1
- package/dist/client/navigation-root.d.ts +106 -0
- package/dist/client/navigation-root.d.ts.map +1 -0
- package/dist/client/navigation-transition.d.ts +192 -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 +45 -0
- package/dist/client/react-root.d.ts.map +1 -0
- package/dist/client/router-effects.d.ts +137 -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 +84 -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 +334 -0
- package/dist/client/router-types.d.ts.map +1 -0
- package/dist/client/router-url.d.ts +24 -0
- package/dist/client/router-url.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 +110 -28
- package/dist/client/rsc-fetch.d.ts.map +1 -1
- package/dist/client/segment-cache.d.ts +186 -25
- package/dist/client/segment-cache.d.ts.map +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 +26 -50
- 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 +21 -13
- 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 +15 -8
- 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 +323 -0
- package/dist/config-types.d.ts.map +1 -0
- package/dist/config-validation.d.ts +68 -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 +95 -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 +74 -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/{plugins/dev-error-overlay.d.ts → dev-tools/overlay.d.ts} +15 -25
- 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 +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 +5 -5
- 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 -181
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8871 -14233
- 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 +262 -0
- package/dist/plugin-context.d.ts.map +1 -0
- 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 +61 -11
- 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/client-dep-entries.d.ts +44 -0
- package/dist/plugins/client-dep-entries.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 +24 -1
- package/dist/plugins/dev-server.d.ts.map +1 -1
- package/dist/plugins/entries.d.ts +34 -4
- package/dist/plugins/entries.d.ts.map +1 -1
- package/dist/plugins/fonts.d.ts +35 -74
- 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 +18 -5
- package/dist/plugins/mdx.d.ts.map +1 -1
- package/dist/plugins/post-build.d.ts +110 -0
- package/dist/plugins/post-build.d.ts.map +1 -0
- package/dist/plugins/prebuilt-capture.d.ts +67 -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 +98 -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/react-resolve.d.ts +49 -0
- package/dist/plugins/react-resolve.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/rsc-assets-manifest.d.ts +33 -0
- package/dist/plugins/rsc-assets-manifest.d.ts.map +1 -0
- 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 +246 -26
- 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 +42 -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 +91 -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 +81 -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 +44 -9
- 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 +40 -5
- package/dist/server/action-handler.d.ts.map +1 -1
- package/dist/server/actions.d.ts +78 -40
- package/dist/server/actions.d.ts.map +1 -1
- package/dist/server/als-registry.d.ts +166 -16
- package/dist/server/als-registry.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 +149 -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 +36 -0
- package/dist/server/csp-nonce.d.ts.map +1 -0
- package/dist/server/csrf.d.ts +58 -15
- package/dist/server/csrf.d.ts.map +1 -1
- package/dist/server/debug.d.ts +0 -1
- package/dist/server/debug.d.ts.map +1 -1
- package/dist/server/default-logger.d.ts +23 -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 +257 -0
- package/dist/server/deny-boundary.d.ts.map +1 -0
- package/dist/server/deny-renderer.d.ts +21 -15
- package/dist/server/deny-renderer.d.ts.map +1 -1
- 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 +102 -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 +19 -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 +2 -2
- 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 +17 -54
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +195 -2922
- package/dist/server/index.js.map +1 -1
- package/dist/server/instrumentation.d.ts +11 -4
- package/dist/server/instrumentation.d.ts.map +1 -1
- package/dist/server/internal.d.ts +47 -0
- package/dist/server/internal.d.ts.map +1 -0
- package/dist/server/internal.js +4645 -0
- package/dist/server/internal.js.map +1 -0
- package/dist/server/json-status-response.d.ts +34 -0
- package/dist/server/json-status-response.d.ts.map +1 -0
- package/dist/server/logger.d.ts +78 -7
- package/dist/server/logger.d.ts.map +1 -1
- package/dist/server/metadata-collector.d.ts +73 -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 +71 -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 +83 -0
- package/dist/server/param-coercion.d.ts.map +1 -0
- package/dist/server/pipeline-helpers.d.ts +193 -0
- package/dist/server/pipeline-helpers.d.ts.map +1 -0
- package/dist/server/pipeline-interception.d.ts +70 -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 +59 -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 +147 -23
- 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-render.d.ts +25 -0
- package/dist/server/prebuilt/capture-render.d.ts.map +1 -0
- package/dist/server/prebuilt/capture-routes.d.ts +37 -0
- package/dist/server/prebuilt/capture-routes.d.ts.map +1 -0
- package/dist/server/prebuilt/capture-state.d.ts +101 -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/lifetime.d.ts +38 -0
- package/dist/server/prebuilt/lifetime.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 +106 -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 +101 -90
- 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/react-cache-bridge.d.ts +59 -0
- package/dist/server/react-cache-bridge.d.ts.map +1 -0
- package/dist/server/react-cache-scope.d.ts +49 -0
- package/dist/server/react-cache-scope.d.ts.map +1 -0
- package/dist/server/render-timeout.d.ts +66 -0
- package/dist/server/render-timeout.d.ts.map +1 -0
- package/dist/server/render-utils.d.ts +35 -0
- package/dist/server/render-utils.d.ts.map +1 -0
- package/dist/server/request-context.d.ts +128 -103
- 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 +55 -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-dispatcher.d.ts +67 -0
- package/dist/server/rsc-entry/action-dispatcher.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 +19 -3
- package/dist/server/rsc-entry/api-handler.d.ts.map +1 -1
- package/dist/server/rsc-entry/deny-fallback.d.ts +55 -0
- package/dist/server/rsc-entry/deny-fallback.d.ts.map +1 -0
- package/dist/server/rsc-entry/error-renderer.d.ts +35 -21
- package/dist/server/rsc-entry/error-renderer.d.ts.map +1 -1
- package/dist/server/rsc-entry/helpers.d.ts +14 -59
- package/dist/server/rsc-entry/helpers.d.ts.map +1 -1
- package/dist/server/rsc-entry/index.d.ts +30 -6
- package/dist/server/rsc-entry/index.d.ts.map +1 -1
- package/dist/server/rsc-entry/render-route.d.ts +50 -0
- package/dist/server/rsc-entry/render-route.d.ts.map +1 -0
- package/dist/server/rsc-entry/render-signals.d.ts +65 -0
- package/dist/server/rsc-entry/render-signals.d.ts.map +1 -0
- package/dist/server/rsc-entry/revalidate-renderer.d.ts +98 -0
- package/dist/server/rsc-entry/revalidate-renderer.d.ts.map +1 -0
- package/dist/server/rsc-entry/rsc-payload.d.ts +30 -6
- package/dist/server/rsc-entry/rsc-payload.d.ts.map +1 -1
- package/dist/server/rsc-entry/rsc-stream.d.ts +12 -30
- package/dist/server/rsc-entry/rsc-stream.d.ts.map +1 -1
- package/dist/server/rsc-entry/ssr-bridge.d.ts +6 -2
- package/dist/server/rsc-entry/ssr-bridge.d.ts.map +1 -1
- package/dist/server/rsc-entry/ssr-renderer.d.ts +44 -7
- package/dist/server/rsc-entry/ssr-renderer.d.ts.map +1 -1
- package/dist/server/rsc-error-envelope.d.ts +11 -0
- package/dist/server/rsc-error-envelope.d.ts.map +1 -0
- package/dist/server/safe-load.d.ts +39 -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/signal-identity.d.ts +43 -0
- package/dist/server/signal-identity.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 +138 -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 +198 -0
- package/dist/server/ssr-bridge-types.d.ts.map +1 -0
- package/dist/server/ssr-entry.d.ts +8 -47
- package/dist/server/ssr-entry.d.ts.map +1 -1
- package/dist/server/ssr-render.d.ts +60 -27
- 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 +59 -0
- package/dist/server/stream-utils.d.ts.map +1 -0
- package/dist/server/tracing.d.ts +57 -26
- package/dist/server/tracing.d.ts.map +1 -1
- package/dist/server/tree-match.d.ts +59 -0
- package/dist/server/tree-match.d.ts.map +1 -0
- package/dist/server/types.d.ts +89 -8
- 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/version-skew.d.ts +61 -0
- package/dist/server/version-skew.d.ts.map +1 -0
- 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/csrf-reject.d.ts +16 -0
- package/dist/shared/csrf-reject.d.ts.map +1 -0
- package/dist/shared/error-digest.d.ts +28 -0
- package/dist/shared/error-digest.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 +110 -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 +48 -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/dist/utils/write-file-atomic.d.ts +17 -0
- package/dist/utils/write-file-atomic.d.ts.map +1 -0
- package/docs/api/30-api-server.mdx +239 -0
- package/docs/api/31-api-client.mdx +170 -0
- package/docs/api/32-api-cache.mdx +339 -0
- package/docs/api/33-api-search-params.mdx +176 -0
- package/docs/api/34-api-config.mdx +359 -0
- package/docs/api/35-api-typescript.mdx +91 -0
- package/docs/api/36-cli.mdx +202 -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 +227 -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 +270 -0
- package/docs/learn/11-middleware.mdx +164 -0
- package/docs/learn/12-error-handling.mdx +192 -0
- package/docs/learn/13-deploying.mdx +287 -0
- package/llms.txt +55 -0
- package/package.json +120 -29
- package/src/adapters/build-output-helper.ts +353 -0
- package/src/adapters/canonicalize-module.ts +29 -0
- package/src/adapters/cloudflare-dev.ts +183 -0
- package/src/adapters/cloudflare-kv-cache.ts +207 -0
- package/src/adapters/cloudflare.ts +809 -150
- package/src/adapters/compress-module.ts +110 -86
- package/src/adapters/fs-identity.ts +155 -0
- package/src/adapters/nitro-presets.ts +124 -0
- package/src/adapters/nitro-preview.ts +476 -0
- package/src/adapters/nitro.ts +317 -457
- package/src/adapters/raw-imports.d.ts +5 -0
- package/src/adapters/shared.ts +283 -0
- package/src/adapters/types.ts +127 -17
- package/src/adapters/wrangler.d.ts +7 -0
- package/src/analyze/chains.ts +411 -0
- package/src/analyze/classify.ts +259 -0
- package/src/analyze/crawl-entry.ts +68 -0
- package/src/analyze/crawl.ts +500 -0
- package/src/analyze/graph-cache.ts +331 -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 +159 -0
- package/src/analyze/scan.ts +149 -0
- package/src/cache/cache-api.ts +107 -0
- package/src/cache/fast-hash.ts +5 -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 +69 -0
- package/src/cache/redis-handler.ts +198 -20
- package/src/cache/singleflight.ts +72 -6
- package/src/cache/sizeof.ts +35 -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 +254 -0
- package/src/cache/timber-cache.ts +165 -40
- 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 +417 -0
- package/src/cli-context.ts +119 -0
- package/src/cli-schema-sync.ts +401 -0
- package/src/cli.ts +330 -78
- package/src/client/browser-dev.ts +192 -5
- package/src/client/browser-entry/action-dispatch.ts +237 -0
- package/src/client/browser-entry/action-queue.ts +152 -0
- package/src/client/browser-entry/hmr.ts +70 -0
- package/src/client/browser-entry/hydrate.ts +143 -0
- package/src/client/browser-entry/index.ts +120 -0
- package/src/client/browser-entry/post-hydration.ts +99 -0
- package/src/client/browser-entry/router-init.ts +406 -0
- package/src/client/browser-entry/rsc-stream.ts +145 -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 +279 -61
- package/src/client/error-reconstituter.tsx +84 -0
- package/src/client/form.tsx +36 -32
- package/src/client/global-context.ts +31 -0
- package/src/client/history.ts +74 -11
- package/src/client/index.ts +89 -53
- package/src/client/internal.ts +54 -0
- package/src/client/link.tsx +468 -151
- package/src/client/location-search.ts +15 -0
- package/src/client/navigation-api.ts +380 -0
- package/src/client/navigation-commit.ts +318 -0
- package/src/client/navigation-context.ts +67 -134
- package/src/client/navigation-root.tsx +236 -0
- package/src/client/navigation-transition.ts +337 -0
- package/src/client/nuqs-adapter.tsx +21 -9
- package/src/client/params-context.ts +187 -0
- package/src/client/react-root.ts +82 -0
- package/src/client/router-effects.ts +235 -0
- package/src/client/router-lifecycle.ts +354 -0
- package/src/client/router-pipeline.ts +458 -0
- package/src/client/router-ref.ts +3 -3
- package/src/client/router-skew.ts +30 -0
- package/src/client/router-types.ts +370 -0
- package/src/client/router-url.ts +32 -0
- package/src/client/router.ts +491 -424
- package/src/client/rsc-fetch.ts +510 -109
- package/src/client/segment-cache.ts +362 -41
- package/src/client/segment-context.ts +7 -4
- 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 +27 -67
- package/src/client/stale-client.ts +191 -0
- package/src/client/state.ts +31 -24
- package/src/client/status-page-marker.tsx +32 -0
- package/src/client/top-loader.tsx +13 -10
- 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 +31 -9
- 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 +323 -0
- package/src/config-validation.ts +464 -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 +278 -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 +79 -0
- package/src/dev-tools/instrumentation.ts +261 -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/{plugins/dev-error-overlay.ts → dev-tools/overlay.ts} +25 -80
- 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 +1 -1
- 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 +12 -11
- 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 +513 -380
- 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 +502 -0
- package/src/plugins/build-manifest.ts +204 -36
- package/src/plugins/build-report.ts +299 -87
- 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/client-dep-entries.ts +78 -0
- package/src/plugins/cloudflare-wasm.ts +141 -0
- package/src/plugins/content.ts +31 -2
- package/src/plugins/dev-discovery.ts +218 -0
- package/src/plugins/dev-server.ts +360 -97
- package/src/plugins/entries.ts +149 -16
- package/src/plugins/fonts.ts +260 -657
- package/src/plugins/graph-endpoint.ts +532 -0
- package/src/plugins/mdx.ts +108 -35
- package/src/plugins/post-build.ts +327 -0
- package/src/plugins/prebuilt-capture.ts +213 -0
- package/src/plugins/prebuilt-options-analysis.ts +175 -0
- package/src/plugins/prebuilt.ts +670 -0
- package/src/plugins/prerender-sugar.ts +316 -0
- package/src/plugins/react-resolve.ts +149 -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/rsc-assets-manifest.ts +251 -0
- package/src/plugins/server-bundle.ts +99 -14
- package/src/plugins/shims.ts +260 -97
- package/src/plugins/static-build.ts +681 -71
- 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 +163 -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 +651 -0
- package/src/routing/export-detect.ts +536 -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 +232 -0
- package/src/routing/scanner.ts +417 -223
- package/src/routing/schema-validation.ts +155 -0
- package/src/routing/segment-classify.ts +280 -0
- package/src/routing/segment-codegen.ts +99 -0
- package/src/routing/segment-keys.ts +186 -0
- package/src/routing/slot-placement.ts +97 -0
- package/src/routing/types.ts +82 -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 +27 -0
- package/src/schema-bridge.ts +382 -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 +195 -56
- package/src/server/action-client.ts +126 -33
- package/src/server/action-encryption.ts +144 -0
- package/src/server/action-handler.ts +457 -111
- package/src/server/actions.ts +172 -85
- package/src/server/als-registry.ts +224 -25
- 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 +116 -0
- package/src/server/coalesce-tick.ts +75 -0
- package/src/server/compress.ts +43 -8
- package/src/server/cookie-context.ts +454 -0
- package/src/server/cookie-parsing.ts +163 -0
- package/src/server/csp-nonce.ts +58 -0
- package/src/server/csrf.ts +228 -35
- package/src/server/debug.ts +0 -1
- package/src/server/default-logger.ts +100 -0
- package/src/server/default-status-page.ts +88 -0
- package/src/server/deny-boundary.ts +527 -0
- package/src/server/deny-renderer.ts +201 -179
- package/src/server/early-hints-sender.ts +4 -3
- package/src/server/early-hints.ts +39 -29
- package/src/server/error-boundary-wrapper.ts +160 -44
- package/src/server/error-response-headers.ts +18 -0
- package/src/server/fallback-error.ts +88 -104
- 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 +3 -3
- package/src/server/head-response.ts +54 -0
- package/src/server/html-injector-core.ts +512 -0
- package/src/server/html-injectors.ts +270 -255
- package/src/server/index.ts +36 -192
- package/src/server/instrumentation.ts +11 -4
- package/src/server/internal.ts +168 -0
- package/src/server/json-status-response.ts +105 -0
- package/src/server/logger.ts +126 -38
- package/src/server/metadata-collector.ts +177 -0
- package/src/server/metadata-platform.ts +2 -2
- package/src/server/metadata-render.ts +30 -8
- package/src/server/metadata-routes.ts +220 -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 +201 -0
- package/src/server/pipeline-helpers.ts +485 -0
- package/src/server/pipeline-interception.ts +241 -32
- package/src/server/pipeline-metadata.ts +15 -1
- package/src/server/pipeline-outcome.ts +290 -0
- package/src/server/pipeline-phases.ts +496 -0
- package/src/server/pipeline.ts +385 -427
- package/src/server/port-resolution.ts +53 -0
- package/src/server/prebuilt/cache-key.ts +299 -0
- package/src/server/prebuilt/capture-render.ts +118 -0
- package/src/server/prebuilt/capture-routes.ts +104 -0
- package/src/server/prebuilt/capture-state.ts +196 -0
- package/src/server/prebuilt/key-discipline.ts +122 -0
- package/src/server/prebuilt/lifetime.ts +151 -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 +202 -0
- package/src/server/prebuilt/synthetic-store.ts +125 -0
- package/src/server/prebuilt-builder.ts +514 -0
- package/src/server/prebuilt-runtime.ts +813 -0
- package/src/server/primitives.ts +153 -171
- package/src/server/publish-params.ts +42 -0
- package/src/server/react-cache-bridge.ts +124 -0
- package/src/server/react-cache-scope.ts +104 -0
- package/src/server/render-timeout.ts +128 -0
- package/src/server/render-utils.ts +45 -0
- package/src/server/request-context.ts +269 -332
- package/src/server/request-dep.ts +37 -0
- package/src/server/response-cache-policy.ts +45 -0
- package/src/server/route-element-builder.ts +514 -355
- package/src/server/route-element-helpers.ts +37 -0
- package/src/server/route-handler.ts +67 -27
- package/src/server/route-matcher.ts +238 -267
- 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-dispatcher.ts +142 -0
- package/src/server/rsc-entry/action-middleware-runner.ts +130 -0
- package/src/server/rsc-entry/api-handler.ts +49 -81
- package/src/server/rsc-entry/deny-fallback.ts +151 -0
- package/src/server/rsc-entry/error-renderer.ts +301 -113
- package/src/server/rsc-entry/helpers.ts +90 -115
- package/src/server/rsc-entry/index.ts +370 -350
- package/src/server/rsc-entry/render-route.ts +229 -0
- package/src/server/rsc-entry/render-signals.ts +108 -0
- package/src/server/rsc-entry/revalidate-renderer.ts +349 -0
- package/src/server/rsc-entry/rsc-payload.ts +192 -72
- package/src/server/rsc-entry/rsc-stream.ts +128 -131
- package/src/server/rsc-entry/ssr-bridge.ts +19 -6
- package/src/server/rsc-entry/ssr-renderer.ts +300 -137
- package/src/server/rsc-error-envelope.ts +18 -0
- package/src/server/rsc-prop-warnings.ts +1 -1
- package/src/server/safe-load.ts +53 -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/signal-identity.ts +112 -0
- 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 +273 -0
- package/src/server/ssr-bridge-types.ts +201 -0
- package/src/server/ssr-entry.ts +225 -104
- package/src/server/ssr-render.ts +354 -91
- package/src/server/ssr-wrappers.tsx +162 -0
- package/src/server/state-tree-diff.ts +85 -30
- package/src/server/static-generator.ts +680 -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 +343 -0
- package/src/server/tracing.ts +163 -68
- package/src/server/tree-match.ts +494 -0
- package/src/server/types.ts +96 -11
- package/src/server/utils/element-type.ts +88 -0
- package/src/server/utils/escape-html.ts +20 -0
- package/src/server/version-skew.ts +104 -0
- package/src/server/waituntil-bridge.ts +1 -1
- 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/csrf-reject.ts +15 -0
- package/src/shared/error-digest.ts +46 -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 +153 -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 +52 -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/src/utils/write-file-atomic.ts +32 -0
- package/dist/_chunks/als-registry-B7DbZ2hS.js +0 -41
- package/dist/_chunks/als-registry-B7DbZ2hS.js.map +0 -1
- package/dist/_chunks/debug-B3Gypr3D.js +0 -108
- package/dist/_chunks/debug-B3Gypr3D.js.map +0 -1
- package/dist/_chunks/format-RyoGQL74.js +0 -164
- package/dist/_chunks/format-RyoGQL74.js.map +0 -1
- package/dist/_chunks/interception-BOoWmLUA.js +0 -676
- package/dist/_chunks/interception-BOoWmLUA.js.map +0 -1
- package/dist/_chunks/metadata-routes-Cjmvi3rQ.js.map +0 -1
- package/dist/_chunks/request-context-BQUC8PHn.js +0 -330
- package/dist/_chunks/request-context-BQUC8PHn.js.map +0 -1
- package/dist/_chunks/ssr-data-MjmprTmO.js +0 -88
- package/dist/_chunks/ssr-data-MjmprTmO.js.map +0 -1
- package/dist/_chunks/tracing-CemImE6h.js +0 -187
- package/dist/_chunks/tracing-CemImE6h.js.map +0 -1
- package/dist/_chunks/use-cookie-DX-l1_5E.js +0 -91
- package/dist/_chunks/use-cookie-DX-l1_5E.js.map +0 -1
- package/dist/_chunks/use-query-states-D5KaffOK.js +0 -109
- package/dist/_chunks/use-query-states-D5KaffOK.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/types.d.ts +0 -14
- package/dist/client/types.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/adapter-build.d.ts +0 -18
- package/dist/plugins/adapter-build.d.ts.map +0 -1
- 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.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/asset-headers.d.ts +0 -42
- package/dist/server/asset-headers.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 -103
- package/src/client/browser-entry.ts +0 -678
- package/src/client/head.ts +0 -61
- package/src/client/link-status-provider.tsx +0 -30
- package/src/client/segment-merger.ts +0 -339
- package/src/client/stale-reload.ts +0 -87
- package/src/client/transition-root.tsx +0 -166
- package/src/client/types.ts +0 -21
- 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/adapter-build.ts +0 -118
- package/src/plugins/cache-transform.ts +0 -199
- 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/asset-headers.ts +0 -81
- 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 -283
- 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
package/src/server/pipeline.ts
CHANGED
|
@@ -2,26 +2,25 @@
|
|
|
2
2
|
* Request pipeline — the central dispatch for all timber.js requests.
|
|
3
3
|
*
|
|
4
4
|
* Pipeline stages (in order):
|
|
5
|
-
* proxy.ts →
|
|
5
|
+
* canonicalize → CSRF gate → proxy.ts → route match → 103 Early Hints → middleware.ts → render
|
|
6
6
|
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
7
|
+
* The phase functions live in `pipeline-phases.ts` so each phase can be
|
|
8
|
+
* tested in isolation. The terminal `outcomeToResponse` translator and
|
|
9
|
+
* stateless helpers live in `pipeline-phases.ts` and `pipeline-helpers.ts`
|
|
10
|
+
* respectively. This file owns only the public type surface and the
|
|
11
|
+
* `createPipeline` entry point: trace ID setup, request-context ALS,
|
|
12
|
+
* Server-Timing wrapping, and the activeRequests counter.
|
|
9
13
|
*
|
|
10
14
|
* See design/07-routing.md §"Request Lifecycle", design/02-rendering-pipeline.md §"Request Flow",
|
|
11
15
|
* and design/17-logging.md §"Production Logging"
|
|
12
16
|
*/
|
|
13
17
|
|
|
14
|
-
import {
|
|
15
|
-
import {
|
|
16
|
-
import {
|
|
17
|
-
import { runWithTimingCollector,
|
|
18
|
-
import {
|
|
19
|
-
|
|
20
|
-
applyRequestHeaderOverlay,
|
|
21
|
-
setMutableCookieContext,
|
|
22
|
-
getSetCookieHeaders,
|
|
23
|
-
markResponseFlushed,
|
|
24
|
-
} from './request-context.js';
|
|
18
|
+
import type { CoercedParams } from '../shared/param-value.ts';
|
|
19
|
+
import type { ProxyExport } from './proxy.ts';
|
|
20
|
+
import type { MiddlewareFn } from './middleware-runner.ts';
|
|
21
|
+
import { runWithTimingCollector, getServerTimingHeader } from './server-timing.ts';
|
|
22
|
+
import { wrapResponseWithStreamTiming } from './stream-utils.ts';
|
|
23
|
+
import { runWithRequestContext } from './request-context.ts';
|
|
25
24
|
import {
|
|
26
25
|
generateTraceId,
|
|
27
26
|
runWithTraceId,
|
|
@@ -29,34 +28,49 @@ import {
|
|
|
29
28
|
replaceTraceId,
|
|
30
29
|
withSpan,
|
|
31
30
|
setSpanAttribute,
|
|
32
|
-
|
|
33
|
-
} from './
|
|
34
|
-
import {
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
} from './
|
|
43
|
-
import {
|
|
44
|
-
import {
|
|
45
|
-
import { serveStaticMetadataFile, serializeSitemap } from './pipeline-metadata.js';
|
|
46
|
-
import { findInterceptionMatch } from './pipeline-interception.js';
|
|
47
|
-
import type { MiddlewareContext } from './types.js';
|
|
48
|
-
import type { SegmentNode } from '#/routing/types.js';
|
|
31
|
+
} from './tracing.ts';
|
|
32
|
+
import { logRequestReceived, logRequestCompleted, logSlowRequest } from './logger.ts';
|
|
33
|
+
import { DenySignal } from './primitives.ts';
|
|
34
|
+
import type { ManifestSegmentNode } from './route-matcher.ts';
|
|
35
|
+
import { csrfGate, makeProxyResolver } from './pipeline-helpers.ts';
|
|
36
|
+
import type { CsrfConfig } from './csrf.ts';
|
|
37
|
+
import { handleRequest, runProxyPhase } from './pipeline-phases.ts';
|
|
38
|
+
import { outcomeToResponse } from './pipeline-outcome.ts';
|
|
39
|
+
import { canonicalize } from './canonicalize.ts';
|
|
40
|
+
import { enforceRscCacheKey, hardenRscPayloadResponse } from './rsc-cache-key-guard.ts';
|
|
41
|
+
import { stripHeadBody } from './head-response.ts';
|
|
42
|
+
import { RSC_KEY_HEADERS } from '../shared/rsc-cache-key.ts';
|
|
43
|
+
import { isDebug } from './debug.ts';
|
|
49
44
|
|
|
50
45
|
// ─── Route Match Result ────────────────────────────────────────────────────
|
|
51
46
|
|
|
52
|
-
/**
|
|
47
|
+
/**
|
|
48
|
+
* Result of matching a canonical pathname against the route tree.
|
|
49
|
+
*
|
|
50
|
+
* `segments` is the runtime (`ManifestFile`-specialized) shape — the same
|
|
51
|
+
* nodes carried in the virtual route manifest. TIM-863 unified this: the
|
|
52
|
+
* matcher produces `ManifestSegmentNode[]` directly and every consumer
|
|
53
|
+
* (render, slots, params coercion, early hints, deny fallback) sees the
|
|
54
|
+
* same structural type with no `as unknown as` laundering.
|
|
55
|
+
*/
|
|
53
56
|
export interface RouteMatch {
|
|
54
57
|
/** The matched segment chain from root to leaf. */
|
|
55
|
-
segments:
|
|
56
|
-
/**
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
58
|
+
segments: ManifestSegmentNode[];
|
|
59
|
+
/**
|
|
60
|
+
* Segment params as the page sees them. The matcher sets them to the raw
|
|
61
|
+
* values; whoever runs `coerceSegmentParams()` replaces them with its
|
|
62
|
+
* result, whose values may be non-string (TIM-1347).
|
|
63
|
+
*/
|
|
64
|
+
segmentParams: CoercedParams;
|
|
65
|
+
/**
|
|
66
|
+
* Segment params as the URL carried them (catch-all segments produce
|
|
67
|
+
* string[]). Set by the matcher, which owns them, and never replaced.
|
|
68
|
+
* Slot resolution and URL-part reconstruction read these: coerced values
|
|
69
|
+
* need not round-trip to the URL (`"007"` → `7`).
|
|
70
|
+
*/
|
|
71
|
+
rawSegmentParams: Record<string, string | string[]>;
|
|
72
|
+
/** Middleware chain from the segment tree, ordered root-to-leaf. */
|
|
73
|
+
middlewareChain: MiddlewareFn[];
|
|
60
74
|
}
|
|
61
75
|
|
|
62
76
|
/** Function that matches a canonical pathname to a route. */
|
|
@@ -65,7 +79,7 @@ export type RouteMatcher = (pathname: string) => RouteMatch | null;
|
|
|
65
79
|
/** Function that matches a canonical pathname to a metadata route. */
|
|
66
80
|
export type MetadataRouteMatcher = (
|
|
67
81
|
pathname: string
|
|
68
|
-
) => import('./route-matcher.
|
|
82
|
+
) => import('./route-matcher.ts').MetadataRouteMatch | null;
|
|
69
83
|
|
|
70
84
|
/** Context for intercepting route resolution (modal pattern). */
|
|
71
85
|
export interface InterceptionContext {
|
|
@@ -78,7 +92,6 @@ export type RouteRenderer = (
|
|
|
78
92
|
req: Request,
|
|
79
93
|
match: RouteMatch,
|
|
80
94
|
responseHeaders: Headers,
|
|
81
|
-
requestHeaderOverlay: Headers,
|
|
82
95
|
interception?: InterceptionContext
|
|
83
96
|
) => Response | Promise<Response>;
|
|
84
97
|
|
|
@@ -91,13 +104,40 @@ export type EarlyHintsEmitter = (
|
|
|
91
104
|
|
|
92
105
|
// ─── Pipeline Configuration ────────────────────────────────────────────────
|
|
93
106
|
|
|
107
|
+
/**
|
|
108
|
+
* Proxy source — a tagged union so the choice between "already-resolved
|
|
109
|
+
* export" and "lazy HMR-friendly loader" is encoded in the type, not
|
|
110
|
+
* inferred per-request.
|
|
111
|
+
*
|
|
112
|
+
* - `static` — the proxy export is already resolved (production, tests).
|
|
113
|
+
* - `lazy` — a loader is called per-request for HMR freshness (dev).
|
|
114
|
+
*
|
|
115
|
+
* `PipelineConfig.proxy` also accepts a bare `ProxyExport` (a function or
|
|
116
|
+
* function array) as shorthand for the static variant — convenient for tests
|
|
117
|
+
* that construct a `createPipeline` config inline. Omit the field entirely
|
|
118
|
+
* when the app has no `proxy.ts`.
|
|
119
|
+
*
|
|
120
|
+
* See design/07-routing.md §"proxy.ts — Global Middleware".
|
|
121
|
+
*/
|
|
122
|
+
export type ProxyConfig =
|
|
123
|
+
| { kind: 'static'; export: ProxyExport }
|
|
124
|
+
| { kind: 'lazy'; loader: () => Promise<{ default: ProxyExport }> };
|
|
125
|
+
|
|
94
126
|
export interface PipelineConfig {
|
|
95
|
-
/**
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
127
|
+
/**
|
|
128
|
+
* proxy.ts source. Undefined if the app has no proxy.ts. Accepts either a
|
|
129
|
+
* tagged `ProxyConfig` (canonical) or a bare `ProxyExport` as sugar for the
|
|
130
|
+
* static variant.
|
|
131
|
+
*/
|
|
132
|
+
proxy?: ProxyConfig | ProxyExport;
|
|
99
133
|
/** Route matcher — resolves a canonical pathname to a RouteMatch. */
|
|
100
134
|
matchRoute: RouteMatcher;
|
|
135
|
+
/**
|
|
136
|
+
* CSRF configuration (`allowedOrigins`, the `csrf: false` switch). The
|
|
137
|
+
* gate is on when this is omitted — protection is never opt-in. See
|
|
138
|
+
* design/08-forms-and-actions.md §"CSRF Protection".
|
|
139
|
+
*/
|
|
140
|
+
csrf?: CsrfConfig;
|
|
101
141
|
/** Metadata route matcher — resolves metadata route pathnames (sitemap.xml, robots.txt, etc.) */
|
|
102
142
|
matchMetadataRoute?: MetadataRouteMatcher;
|
|
103
143
|
/** Renderer — produces the final Response for a matched route. */
|
|
@@ -115,7 +155,18 @@ export interface PipelineConfig {
|
|
|
115
155
|
* Generated at build time from intercepting route directories.
|
|
116
156
|
* See design/07-routing.md §"Intercepting Routes"
|
|
117
157
|
*/
|
|
118
|
-
interceptionRewrites?: import('
|
|
158
|
+
interceptionRewrites?: import('../routing/interception.ts').InterceptionRewrite[];
|
|
159
|
+
/**
|
|
160
|
+
* Resolver for children-path interceptions — the sibling layout swap.
|
|
161
|
+
*
|
|
162
|
+
* Separate from `matchRoute` because it addresses the owner directory by
|
|
163
|
+
* tree path rather than by pathname, which needs the manifest tree itself.
|
|
164
|
+
* Omitting it disables the `'children'` interception shape and leaves the
|
|
165
|
+
* canonical route rendering, which is the fail-safe outcome.
|
|
166
|
+
*
|
|
167
|
+
* See design/07-routing.md §"Intercepting Routes"
|
|
168
|
+
*/
|
|
169
|
+
matchInterceptedRoute?: import('./children-interception.ts').InterceptedRouteMatcher;
|
|
119
170
|
/**
|
|
120
171
|
* Control Server-Timing header output.
|
|
121
172
|
*
|
|
@@ -126,6 +177,14 @@ export interface PipelineConfig {
|
|
|
126
177
|
* Default: `'total'`.
|
|
127
178
|
*/
|
|
128
179
|
serverTiming?: 'detailed' | 'total' | false;
|
|
180
|
+
/**
|
|
181
|
+
* Auto-generated sitemap handler. When provided, the pipeline intercepts
|
|
182
|
+
* `/sitemap.xml` and `/sitemap/N.xml` requests and delegates to this
|
|
183
|
+
* function. Returns a Response or null (pass-through to regular routing).
|
|
184
|
+
*
|
|
185
|
+
* See design/16-metadata.md §"Auto-generated Sitemap"
|
|
186
|
+
*/
|
|
187
|
+
autoSitemapHandler?: (pathname: string) => Promise<Response | null>;
|
|
129
188
|
/**
|
|
130
189
|
* Dev pipeline error callback — called when a pipeline phase (proxy,
|
|
131
190
|
* middleware, render) catches an unhandled error. Used to wire the error
|
|
@@ -134,6 +193,7 @@ export interface PipelineConfig {
|
|
|
134
193
|
* Undefined in production — zero overhead.
|
|
135
194
|
*/
|
|
136
195
|
onPipelineError?: (error: Error, phase: string) => void;
|
|
196
|
+
|
|
137
197
|
/**
|
|
138
198
|
* Fallback error renderer — called when a catastrophic error escapes the
|
|
139
199
|
* render phase. Produces an HTML Response instead of a bare empty 500.
|
|
@@ -148,8 +208,62 @@ export interface PipelineConfig {
|
|
|
148
208
|
renderFallbackError?: (
|
|
149
209
|
error: unknown,
|
|
150
210
|
req: Request,
|
|
151
|
-
responseHeaders: Headers
|
|
211
|
+
responseHeaders: Headers,
|
|
212
|
+
/**
|
|
213
|
+
* The matched route, when the error came after matching. A route.ts
|
|
214
|
+
* match is answered in the API route's JSON format, never a page
|
|
215
|
+
* (design/10-error-handling.md §"JSON Error Pages").
|
|
216
|
+
*/
|
|
217
|
+
match?: RouteMatch
|
|
152
218
|
) => Response | Promise<Response>;
|
|
219
|
+
/**
|
|
220
|
+
* Fallback deny page renderer — called when a DenySignal escapes from
|
|
221
|
+
* middleware or the render phase. Renders the appropriate status-code
|
|
222
|
+
* page (403.tsx, 404.tsx, etc.) instead of returning a bare empty response.
|
|
223
|
+
*
|
|
224
|
+
* If this function throws, the pipeline falls back to a bare
|
|
225
|
+
* `new Response(null, { status: denyStatus })`.
|
|
226
|
+
*/
|
|
227
|
+
renderDenyFallback?: (
|
|
228
|
+
deny: DenySignal,
|
|
229
|
+
req: Request,
|
|
230
|
+
responseHeaders: Headers,
|
|
231
|
+
/**
|
|
232
|
+
* The matched route, if available. Provided by both the middleware-stage
|
|
233
|
+
* and render-stage catch blocks (matching runs before middleware). When
|
|
234
|
+
* present, the renderer should resolve the deny status file against the
|
|
235
|
+
* matched chain so colocated `403.tsx`/`4xx.tsx`/`401.json` files are
|
|
236
|
+
* picked up. Falls back to the root-only chain when omitted (e.g. for
|
|
237
|
+
* deny()s thrown before route matching could complete). See TIM-822.
|
|
238
|
+
*/
|
|
239
|
+
match?: RouteMatch
|
|
240
|
+
) => Response | Promise<Response>;
|
|
241
|
+
|
|
242
|
+
/**
|
|
243
|
+
* Server action dispatch — called after proxy.ts runs for POST requests
|
|
244
|
+
* that look like server actions. Returns a Response if the request was
|
|
245
|
+
* handled as an action, or null to fall through to normal routing.
|
|
246
|
+
*
|
|
247
|
+
* `canonicalPath` is the already-decoded canonical pathname — the same
|
|
248
|
+
* value that `handleRequest` and `matchRoute` use. Do NOT re-derive it
|
|
249
|
+
* from `req.url` (which re-encodes).
|
|
250
|
+
*
|
|
251
|
+
* The `reenter` parameter is the full pipeline function (including proxy,
|
|
252
|
+
* ALS, tracing) for the no-JS validation rerender path — the synthetic
|
|
253
|
+
* GET flows through the complete pipeline. Its `cookies` argument becomes
|
|
254
|
+
* that request's parsed cookies (`runWithRequestContext`'s `cookies`
|
|
255
|
+
* option), so the rerender reads the action's post-mutation state without
|
|
256
|
+
* the pipeline needing the same `Request` object to reach it.
|
|
257
|
+
*
|
|
258
|
+
* Moved into the pipeline (TIM-1213) so proxy.ts runs on action POSTs,
|
|
259
|
+
* matching the design doc contract: "proxy.ts runs on every request,
|
|
260
|
+
* no exclusions."
|
|
261
|
+
*/
|
|
262
|
+
dispatchAction?: (
|
|
263
|
+
req: Request,
|
|
264
|
+
canonicalPath: string,
|
|
265
|
+
reenter: (req: Request, cookies: Map<string, string>) => Promise<Response>
|
|
266
|
+
) => Promise<Response | null>;
|
|
153
267
|
}
|
|
154
268
|
|
|
155
269
|
// ─── Pipeline ──────────────────────────────────────────────────────────────
|
|
@@ -157,31 +271,35 @@ export interface PipelineConfig {
|
|
|
157
271
|
/**
|
|
158
272
|
* Create the request handler from a pipeline configuration.
|
|
159
273
|
*
|
|
160
|
-
* Returns a function that processes an incoming Request through all pipeline
|
|
161
|
-
* and produces a Response. This is the top-level entry point for the
|
|
274
|
+
* Returns a function that processes an incoming Request through all pipeline
|
|
275
|
+
* stages and produces a Response. This is the top-level entry point for the
|
|
276
|
+
* server. The body is intentionally small — phase logic lives in
|
|
277
|
+
* `pipeline-phases.ts`. This function only owns the per-request setup that
|
|
278
|
+
* has to wrap the entire dispatch: trace ID, request context ALS, span
|
|
279
|
+
* scope, Server-Timing header emission, and the active-request counter.
|
|
162
280
|
*/
|
|
163
281
|
export function createPipeline(config: PipelineConfig): (req: Request) => Promise<Response> {
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
serverTiming = 'total',
|
|
172
|
-
onPipelineError,
|
|
173
|
-
} = config;
|
|
282
|
+
// Resolve the proxy source once. The request hot path calls this closure
|
|
283
|
+
// directly with no discriminant check — the branch is taken here during
|
|
284
|
+
// setup. For the lazy variant, `loader()` still runs per-request so HMR
|
|
285
|
+
// continues to re-import the user's proxy.ts.
|
|
286
|
+
const proxyResolver = makeProxyResolver(config.proxy);
|
|
287
|
+
const slowRequestMs = config.slowRequestMs ?? 3000;
|
|
288
|
+
const serverTiming = config.serverTiming ?? 'total';
|
|
174
289
|
|
|
175
290
|
// Concurrent request counter — tracks how many requests are in-flight.
|
|
176
291
|
// Logged with each request for diagnosing resource contention.
|
|
177
292
|
let activeRequests = 0;
|
|
178
293
|
|
|
179
|
-
|
|
294
|
+
// Self-reference for re-entry — the no-JS validation rerender path
|
|
295
|
+
// passes a synthetic GET back through the full pipeline (including
|
|
296
|
+
// proxy, ALS, tracing). The inner closure captures `pipelineFn` by
|
|
297
|
+
// name; by the time it's invoked, the const binding is initialized.
|
|
298
|
+
const pipelineFn = async (req: Request, cookies?: Map<string, string>): Promise<Response> => {
|
|
180
299
|
const url = new URL(req.url);
|
|
181
300
|
const method = req.method;
|
|
182
301
|
const path = url.pathname;
|
|
183
302
|
const startTime = performance.now();
|
|
184
|
-
activeRequests++;
|
|
185
303
|
|
|
186
304
|
// Establish per-request trace ID scope (design/17-logging.md §"trace_id is Always Set").
|
|
187
305
|
// This runs before runWithRequestContext so traceId() is available from the
|
|
@@ -189,65 +307,224 @@ export function createPipeline(config: PipelineConfig): (req: Request) => Promis
|
|
|
189
307
|
const traceIdValue = generateTraceId();
|
|
190
308
|
|
|
191
309
|
return runWithTraceId(traceIdValue, async () => {
|
|
192
|
-
//
|
|
193
|
-
// throughout the entire request lifecycle (proxy, middleware, render).
|
|
194
|
-
|
|
310
|
+
// Runs in the request context ALS scope, so getHeaders() and getCookies()
|
|
311
|
+
// work throughout the entire request lifecycle (proxy, middleware, render).
|
|
312
|
+
const inRequestContext = async () => {
|
|
195
313
|
// In dev mode, wrap with timing collector for Server-Timing header.
|
|
196
314
|
// The collector uses ALS so timing entries are per-request.
|
|
197
315
|
const runRequest = async () => {
|
|
198
316
|
logRequestReceived({ method, path });
|
|
199
317
|
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
318
|
+
// Incremented and decremented in one scope, the decrement in
|
|
319
|
+
// `finally`: a rejection that escaped the span used to skip it and
|
|
320
|
+
// leave the request counted as in flight for the life of the
|
|
321
|
+
// process (TIM-1537).
|
|
322
|
+
activeRequests++;
|
|
323
|
+
let concurrency = activeRequests;
|
|
324
|
+
let response: Response;
|
|
325
|
+
try {
|
|
326
|
+
response = await withSpan(
|
|
327
|
+
'http.server.request',
|
|
328
|
+
{ 'http.request.method': method, 'url.path': path },
|
|
329
|
+
async () => {
|
|
330
|
+
// If OTEL is active, the root span now exists — replace the UUID
|
|
331
|
+
// fallback with the real OTEL trace ID for log–trace correlation.
|
|
332
|
+
const otelTraceId = await getOtelTraceId();
|
|
333
|
+
if (otelTraceId) {
|
|
334
|
+
replaceTraceId(otelTraceId);
|
|
335
|
+
}
|
|
210
336
|
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
337
|
+
// Stage 0: Canonicalize URL at the outer boundary — before
|
|
338
|
+
// proxy.ts sees the request. Every layer (proxy, middleware,
|
|
339
|
+
// access, render) must see the same canonical path.
|
|
340
|
+
// See design/07-routing.md §"URL Canonicalization & Security".
|
|
341
|
+
const stripTrailingSlash = config.stripTrailingSlash ?? true;
|
|
342
|
+
const canonResult = canonicalize(url.pathname, stripTrailingSlash);
|
|
343
|
+
if (!canonResult.ok) {
|
|
344
|
+
if (isDebug()) {
|
|
345
|
+
console.warn(
|
|
346
|
+
`[timber] URL canonicalization rejected ${method} ${url.pathname} — responding with ${canonResult.status}\n` +
|
|
347
|
+
` This usually means the URL contains encoded separators (%2f, %5c),\n` +
|
|
348
|
+
` null bytes (%00), path traversal (..), or malformed percent-encoding.`
|
|
349
|
+
);
|
|
350
|
+
}
|
|
351
|
+
// Early returns set the span status themselves: the shared
|
|
352
|
+
// assignment below never runs for them, and a span with
|
|
353
|
+
// none reads as 200 in DevSpanProcessor.
|
|
354
|
+
await setSpanAttribute('http.response.status_code', canonResult.status);
|
|
355
|
+
return new Response(null, { status: canonResult.status });
|
|
356
|
+
}
|
|
357
|
+
const canonicalPath = canonResult.pathname;
|
|
358
|
+
|
|
359
|
+
// Construct a Request with the canonical URL so proxy.ts sees
|
|
360
|
+
// the same path that route matching will use. This prevents
|
|
361
|
+
// auth bypass via /admin/, /%61dmin, etc.
|
|
362
|
+
let canonicalReq = req;
|
|
363
|
+
if (url.pathname !== canonicalPath) {
|
|
364
|
+
const canonicalUrl = new URL(req.url);
|
|
365
|
+
canonicalUrl.pathname = canonicalPath;
|
|
366
|
+
canonicalReq = new Request(canonicalUrl.toString(), req);
|
|
367
|
+
}
|
|
217
368
|
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
result.headers.set('Server-Timing', timingHeader);
|
|
369
|
+
// Stage 0b: CSRF gate — every unsafe-method request, before
|
|
370
|
+
// proxy.ts or any other user code, and before action
|
|
371
|
+
// dispatch, so route.ts handlers are covered too (LOCAL-773).
|
|
372
|
+
const csrfRejection = csrfGate(
|
|
373
|
+
canonicalReq,
|
|
374
|
+
canonicalPath,
|
|
375
|
+
config.csrf ?? {},
|
|
376
|
+
config.matchRoute
|
|
377
|
+
);
|
|
378
|
+
if (csrfRejection) {
|
|
379
|
+
await setSpanAttribute('http.response.status_code', csrfRejection.status);
|
|
380
|
+
return csrfRejection;
|
|
231
381
|
}
|
|
232
|
-
} else if (serverTiming === 'total') {
|
|
233
|
-
// Total only: single `total;dur=N` — no phase names.
|
|
234
|
-
// Prevents information disclosure while giving browser
|
|
235
|
-
// DevTools useful timing data.
|
|
236
|
-
const totalMs = Math.round(performance.now() - startTime);
|
|
237
|
-
result = ensureMutableResponse(result);
|
|
238
|
-
result.headers.set('Server-Timing', `total;dur=${totalMs}`);
|
|
239
|
-
}
|
|
240
|
-
// serverTiming === false: no header at all
|
|
241
382
|
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
383
|
+
// Build the inner handler — runs after proxy, before route
|
|
384
|
+
// matching. Checks for server action POSTs and dispatches them
|
|
385
|
+
// without entering the route match → middleware → render chain.
|
|
386
|
+
// Falls through to handleRequest for normal route handling.
|
|
387
|
+
// TIM-1213: action dispatch is now INSIDE the pipeline so
|
|
388
|
+
// proxy.ts runs on every request, including action POSTs.
|
|
389
|
+
const innerHandler = async (): Promise<Response> => {
|
|
390
|
+
if (config.dispatchAction) {
|
|
391
|
+
const actionResult = await config.dispatchAction(
|
|
392
|
+
canonicalReq,
|
|
393
|
+
canonicalPath,
|
|
394
|
+
pipelineFn
|
|
395
|
+
);
|
|
396
|
+
if (actionResult) return actionResult;
|
|
397
|
+
}
|
|
398
|
+
return handleRequest(config, canonicalReq, method, canonicalPath, true);
|
|
399
|
+
};
|
|
400
|
+
|
|
401
|
+
let result: Response;
|
|
402
|
+
if (proxyResolver) {
|
|
403
|
+
const outcome = await runProxyPhase(
|
|
404
|
+
config,
|
|
405
|
+
proxyResolver,
|
|
406
|
+
canonicalReq,
|
|
407
|
+
method,
|
|
408
|
+
canonicalPath,
|
|
409
|
+
innerHandler
|
|
410
|
+
);
|
|
411
|
+
result = await outcomeToResponse(config, outcome, {
|
|
412
|
+
req: canonicalReq,
|
|
413
|
+
method,
|
|
414
|
+
path: canonicalPath,
|
|
415
|
+
});
|
|
416
|
+
} else {
|
|
417
|
+
result = await innerHandler();
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
// Set response status on the root span before it ends —
|
|
421
|
+
// DevSpanProcessor reads this for tree/summary output.
|
|
422
|
+
await setSpanAttribute('http.response.status_code', result.status);
|
|
423
|
+
|
|
424
|
+
// Vary on exactly the headers the `_rsc` cache key hashes.
|
|
425
|
+
//
|
|
426
|
+
// Those two mechanisms answer the same question — which request
|
|
427
|
+
// headers change this response — so they are the same list, not
|
|
428
|
+
// two lists that happen to agree. A separate hand-written list
|
|
429
|
+
// here drifted from `RSC_KEY_HEADERS` the moment the key set
|
|
430
|
+
// grew, and the drift is invisible: `Vary` is the *fallback*
|
|
431
|
+
// layer, used only when a cache omits the query from its key,
|
|
432
|
+
// which is precisely when nobody is watching (TIM-1268).
|
|
433
|
+
//
|
|
434
|
+
// Why any of it: without `Vary: Accept` a shared cache may serve
|
|
435
|
+
// an RSC Flight payload to a browser expecting HTML, or the
|
|
436
|
+
// reverse (GHSA-wfc6-r584-vfw7, design/13-security.md). The
|
|
437
|
+
// `_rsc` param puts that distinction in the URL, so correctness
|
|
438
|
+
// no longer *depends* on `Vary` — which is opt-in configuration
|
|
439
|
+
// on Cloudflare and CloudFront. `Vary` covers the requests that
|
|
440
|
+
// arrive without the param: a stripped query, a hand-rolled
|
|
441
|
+
// client.
|
|
442
|
+
//
|
|
443
|
+
// It costs no hit rate. Document requests send no `X-Timber-*`
|
|
444
|
+
// header at all, so they collapse to a single cache key; payload
|
|
445
|
+
// requests are already fragmented by these same values via the
|
|
446
|
+
// URL.
|
|
447
|
+
const varyTokens = [...RSC_KEY_HEADERS];
|
|
448
|
+
const existingVary = result.headers.get('Vary');
|
|
449
|
+
const existingTokens = existingVary
|
|
450
|
+
? existingVary
|
|
451
|
+
.toLowerCase()
|
|
452
|
+
.split(',')
|
|
453
|
+
.map((t) => t.trim())
|
|
454
|
+
: [];
|
|
455
|
+
const newTokens = varyTokens.filter(
|
|
456
|
+
(t) => !existingTokens.includes(t.toLowerCase())
|
|
457
|
+
);
|
|
458
|
+
if (newTokens.length > 0) {
|
|
459
|
+
result.headers.set(
|
|
460
|
+
'Vary',
|
|
461
|
+
existingVary ? `${existingVary}, ${newTokens.join(', ')}` : newTokens.join(', ')
|
|
462
|
+
);
|
|
463
|
+
}
|
|
464
|
+
|
|
465
|
+
// A request may only claim an `_rsc` cache key that matches its
|
|
466
|
+
// own headers. The key is predictable by design, so without this
|
|
467
|
+
// a caller could render its own variant under another client's
|
|
468
|
+
// key and have a shared cache store it there (TIM-1268).
|
|
469
|
+
await enforceRscCacheKey(canonicalReq, result);
|
|
470
|
+
|
|
471
|
+
// Flight payloads must never be sniffable into a renderable
|
|
472
|
+
// type — applied at this single exit so every producer is
|
|
473
|
+
// covered, not just the success path (TIM-1268).
|
|
474
|
+
hardenRscPayloadResponse(result);
|
|
475
|
+
|
|
476
|
+
// A HEAD response carries the headers its GET would produce and
|
|
477
|
+
// no content (RFC 9110 §9.3.2). Applied at this single exit so
|
|
478
|
+
// every response shape is covered — page render, API route,
|
|
479
|
+
// metadata route, deny page, error page, proxy short-circuit —
|
|
480
|
+
// rather than per-renderer, where it was missing for page
|
|
481
|
+
// renders entirely (TIM-1324). The render still runs: the
|
|
482
|
+
// headers have to be the ones a GET would have sent.
|
|
483
|
+
result = stripHeadBody(result, method);
|
|
484
|
+
|
|
485
|
+
// Append Server-Timing header based on configured mode.
|
|
486
|
+
// Header mutability is guaranteed by the producer-side clone
|
|
487
|
+
// in `outcomeToResponse` and the metadata-route / auto-sitemap
|
|
488
|
+
// user-handler clones in `handleRequest`, so we can write
|
|
489
|
+
// directly without a runtime probe. See TIM-866.
|
|
490
|
+
if (serverTiming === 'detailed') {
|
|
491
|
+
// Detailed: per-phase breakdown (proxy, middleware, render).
|
|
492
|
+
const timingHeader = getServerTimingHeader();
|
|
493
|
+
if (timingHeader) {
|
|
494
|
+
result.headers.set('Server-Timing', timingHeader);
|
|
495
|
+
}
|
|
496
|
+
} else if (serverTiming === 'total') {
|
|
497
|
+
// Total only: single `total;dur=N` — no phase names.
|
|
498
|
+
// Prevents information disclosure while giving browser
|
|
499
|
+
// DevTools useful timing data.
|
|
500
|
+
const totalMs = Math.round(performance.now() - startTime);
|
|
501
|
+
result.headers.set('Server-Timing', `total;dur=${totalMs}`);
|
|
502
|
+
}
|
|
503
|
+
// serverTiming === false: no header at all
|
|
504
|
+
|
|
505
|
+
// Wrap the response body with stream-lifecycle timing when
|
|
506
|
+
// detailed mode is on. Logs firstChunk/lastChunk/maxGap/close
|
|
507
|
+
// on stream close — measures the post-flush stream tail that
|
|
508
|
+
// the Server-Timing header can't capture (TIM-1106).
|
|
509
|
+
if (serverTiming === 'detailed' && result.body) {
|
|
510
|
+
result = new Response(wrapResponseWithStreamTiming(result.body, startTime), {
|
|
511
|
+
status: result.status,
|
|
512
|
+
statusText: result.statusText,
|
|
513
|
+
headers: result.headers,
|
|
514
|
+
});
|
|
515
|
+
}
|
|
516
|
+
|
|
517
|
+
return result;
|
|
518
|
+
}
|
|
519
|
+
);
|
|
520
|
+
} finally {
|
|
521
|
+
concurrency = activeRequests;
|
|
522
|
+
activeRequests--;
|
|
523
|
+
}
|
|
245
524
|
|
|
246
525
|
// Post-span: structured production logging
|
|
247
526
|
const durationMs = Math.round(performance.now() - startTime);
|
|
248
527
|
const status = response.status;
|
|
249
|
-
const concurrency = activeRequests;
|
|
250
|
-
activeRequests--;
|
|
251
528
|
logRequestCompleted({ method, path, status, durationMs, concurrency });
|
|
252
529
|
|
|
253
530
|
if (slowRequestMs > 0 && durationMs > slowRequestMs) {
|
|
@@ -258,329 +535,10 @@ export function createPipeline(config: PipelineConfig): (req: Request) => Promis
|
|
|
258
535
|
};
|
|
259
536
|
|
|
260
537
|
return serverTiming === 'detailed' ? runWithTimingCollector(runRequest) : runRequest();
|
|
261
|
-
}
|
|
538
|
+
};
|
|
539
|
+
return runWithRequestContext(req, inRequestContext, { cookies });
|
|
262
540
|
});
|
|
263
541
|
};
|
|
264
542
|
|
|
265
|
-
|
|
266
|
-
try {
|
|
267
|
-
// Resolve the proxy export. When a proxyLoader is provided (lazy import),
|
|
268
|
-
// it is called per-request so HMR updates in dev take effect immediately.
|
|
269
|
-
let proxyExport: ProxyExport;
|
|
270
|
-
if (config.proxyLoader) {
|
|
271
|
-
const mod = await config.proxyLoader();
|
|
272
|
-
proxyExport = mod.default;
|
|
273
|
-
} else {
|
|
274
|
-
proxyExport = config.proxy!;
|
|
275
|
-
}
|
|
276
|
-
const proxyFn = () => runProxy(proxyExport, req, () => handleRequest(req, method, path));
|
|
277
|
-
return await withSpan('timber.proxy', {}, () =>
|
|
278
|
-
serverTiming === 'detailed' ? withTiming('proxy', 'proxy.ts', proxyFn) : proxyFn()
|
|
279
|
-
);
|
|
280
|
-
} catch (error) {
|
|
281
|
-
// Uncaught proxy.ts error → bare HTTP 500
|
|
282
|
-
logProxyError({ error });
|
|
283
|
-
await fireOnRequestError(error, req, 'proxy');
|
|
284
|
-
if (onPipelineError && error instanceof Error) onPipelineError(error, 'proxy');
|
|
285
|
-
return new Response(null, { status: 500 });
|
|
286
|
-
}
|
|
287
|
-
}
|
|
288
|
-
|
|
289
|
-
async function handleRequest(req: Request, method: string, path: string): Promise<Response> {
|
|
290
|
-
// Stage 1: URL canonicalization
|
|
291
|
-
const url = new URL(req.url);
|
|
292
|
-
const result = canonicalize(url.pathname, stripTrailingSlash);
|
|
293
|
-
if (!result.ok) {
|
|
294
|
-
return new Response(null, { status: result.status });
|
|
295
|
-
}
|
|
296
|
-
const canonicalPathname = result.pathname;
|
|
297
|
-
|
|
298
|
-
// Stage 1b: Metadata route matching — runs before regular route matching.
|
|
299
|
-
// Metadata routes skip middleware.ts and access.ts (public endpoints for crawlers).
|
|
300
|
-
// See design/16-metadata.md §"Pipeline Integration"
|
|
301
|
-
if (config.matchMetadataRoute) {
|
|
302
|
-
const metaMatch = config.matchMetadataRoute(canonicalPathname);
|
|
303
|
-
if (metaMatch) {
|
|
304
|
-
try {
|
|
305
|
-
// Static metadata files (.xml, .txt, .png, .ico, etc.) are served
|
|
306
|
-
// directly from disk. Dynamic metadata routes (.ts, .tsx) export a
|
|
307
|
-
// handler function that generates the response.
|
|
308
|
-
if (metaMatch.isStatic) {
|
|
309
|
-
return await serveStaticMetadataFile(metaMatch);
|
|
310
|
-
}
|
|
311
|
-
|
|
312
|
-
const mod = (await metaMatch.file.load()) as { default?: Function };
|
|
313
|
-
if (typeof mod.default !== 'function') {
|
|
314
|
-
return new Response('Metadata route must export a default function', { status: 500 });
|
|
315
|
-
}
|
|
316
|
-
const handlerResult = await mod.default();
|
|
317
|
-
// If the handler returns a Response, use it directly
|
|
318
|
-
if (handlerResult instanceof Response) {
|
|
319
|
-
return handlerResult;
|
|
320
|
-
}
|
|
321
|
-
// Otherwise, serialize based on content type
|
|
322
|
-
const contentType = metaMatch.contentType;
|
|
323
|
-
let body: string;
|
|
324
|
-
if (typeof handlerResult === 'string') {
|
|
325
|
-
body = handlerResult;
|
|
326
|
-
} else if (contentType === 'application/xml') {
|
|
327
|
-
body = serializeSitemap(handlerResult);
|
|
328
|
-
} else if (contentType === 'application/manifest+json') {
|
|
329
|
-
body = JSON.stringify(handlerResult, null, 2);
|
|
330
|
-
} else {
|
|
331
|
-
body = typeof handlerResult === 'string' ? handlerResult : String(handlerResult);
|
|
332
|
-
}
|
|
333
|
-
return new Response(body, {
|
|
334
|
-
status: 200,
|
|
335
|
-
headers: { 'Content-Type': `${contentType}; charset=utf-8` },
|
|
336
|
-
});
|
|
337
|
-
} catch (error) {
|
|
338
|
-
logRenderError({ method, path, error });
|
|
339
|
-
if (onPipelineError && error instanceof Error) onPipelineError(error, 'metadata-route');
|
|
340
|
-
return new Response(null, { status: 500 });
|
|
341
|
-
}
|
|
342
|
-
}
|
|
343
|
-
}
|
|
344
|
-
|
|
345
|
-
// Stage 2: Route matching
|
|
346
|
-
let match = matchRoute(canonicalPathname);
|
|
347
|
-
let interception: InterceptionContext | undefined;
|
|
348
|
-
|
|
349
|
-
// Stage 2a: Intercepting route resolution (modal pattern).
|
|
350
|
-
// On soft navigation, check if an intercepting route should render instead.
|
|
351
|
-
// The client sends X-Timber-URL with the current pathname (where they're
|
|
352
|
-
// navigating FROM). If a rewrite matches, re-route to the source URL so
|
|
353
|
-
// the source layout renders with the intercepted content in the slot.
|
|
354
|
-
const sourceUrl = req.headers.get('X-Timber-URL');
|
|
355
|
-
if (sourceUrl && config.interceptionRewrites?.length) {
|
|
356
|
-
const intercepted = findInterceptionMatch(
|
|
357
|
-
canonicalPathname,
|
|
358
|
-
sourceUrl,
|
|
359
|
-
config.interceptionRewrites
|
|
360
|
-
);
|
|
361
|
-
if (intercepted) {
|
|
362
|
-
const sourceMatch = matchRoute(intercepted.sourcePathname);
|
|
363
|
-
if (sourceMatch) {
|
|
364
|
-
match = sourceMatch;
|
|
365
|
-
interception = { targetPathname: canonicalPathname };
|
|
366
|
-
}
|
|
367
|
-
}
|
|
368
|
-
}
|
|
369
|
-
|
|
370
|
-
if (!match) {
|
|
371
|
-
// No route matched — render 404.tsx in root layout if available,
|
|
372
|
-
// otherwise fall back to a bare 404 Response.
|
|
373
|
-
if (config.renderNoMatch) {
|
|
374
|
-
const responseHeaders = new Headers();
|
|
375
|
-
return config.renderNoMatch(req, responseHeaders);
|
|
376
|
-
}
|
|
377
|
-
return new Response(null, { status: 404 });
|
|
378
|
-
}
|
|
379
|
-
|
|
380
|
-
// Response and request header containers — created before early hints so
|
|
381
|
-
// the emitter can append Link headers (e.g. for Cloudflare CDN → 103).
|
|
382
|
-
const responseHeaders = new Headers();
|
|
383
|
-
const requestHeaderOverlay = new Headers();
|
|
384
|
-
|
|
385
|
-
// Set Cache-Control for dynamic HTML responses. Without this header,
|
|
386
|
-
// CDNs (particularly Cloudflare) may attempt to buffer/process the
|
|
387
|
-
// response differently, causing intermittent multi-second delays.
|
|
388
|
-
// This matches Next.js's default behavior.
|
|
389
|
-
responseHeaders.set('Cache-Control', 'private, no-cache, no-store, max-age=0, must-revalidate');
|
|
390
|
-
|
|
391
|
-
// Stage 2b: 103 Early Hints (before middleware, after match)
|
|
392
|
-
// Fires before middleware so the browser can begin fetching critical
|
|
393
|
-
// assets while middleware runs. Non-fatal — a failing emitter never
|
|
394
|
-
// blocks the request.
|
|
395
|
-
if (earlyHints) {
|
|
396
|
-
try {
|
|
397
|
-
await earlyHints(match, req, responseHeaders);
|
|
398
|
-
} catch {
|
|
399
|
-
// Early hints failure is non-fatal
|
|
400
|
-
}
|
|
401
|
-
}
|
|
402
|
-
|
|
403
|
-
// Stage 3: Leaf middleware.ts (only the leaf route's middleware runs)
|
|
404
|
-
if (match.middleware) {
|
|
405
|
-
const ctx: MiddlewareContext = {
|
|
406
|
-
req,
|
|
407
|
-
requestHeaders: requestHeaderOverlay,
|
|
408
|
-
headers: responseHeaders,
|
|
409
|
-
params: match.params,
|
|
410
|
-
searchParams: new URL(req.url).searchParams,
|
|
411
|
-
earlyHints: (hints) => {
|
|
412
|
-
for (const hint of hints) {
|
|
413
|
-
let value = `<${hint.href}>; rel=${hint.rel}`;
|
|
414
|
-
if (hint.as !== undefined) value += `; as=${hint.as}`;
|
|
415
|
-
if (hint.crossOrigin !== undefined) value += `; crossorigin=${hint.crossOrigin}`;
|
|
416
|
-
if (hint.fetchPriority !== undefined) value += `; fetchpriority=${hint.fetchPriority}`;
|
|
417
|
-
responseHeaders.append('Link', value);
|
|
418
|
-
}
|
|
419
|
-
},
|
|
420
|
-
};
|
|
421
|
-
|
|
422
|
-
try {
|
|
423
|
-
// Enable cookie mutation during middleware (design/29-cookies.md §"Context Tracking")
|
|
424
|
-
setMutableCookieContext(true);
|
|
425
|
-
const middlewareFn = () => runMiddleware(match.middleware!, ctx);
|
|
426
|
-
const middlewareResponse = await withSpan('timber.middleware', {}, () =>
|
|
427
|
-
serverTiming === 'detailed'
|
|
428
|
-
? withTiming('mw', 'middleware.ts', middlewareFn)
|
|
429
|
-
: middlewareFn()
|
|
430
|
-
);
|
|
431
|
-
setMutableCookieContext(false);
|
|
432
|
-
if (middlewareResponse) {
|
|
433
|
-
// Apply cookie jar to short-circuit response.
|
|
434
|
-
// Response.redirect() creates immutable headers, so ensure
|
|
435
|
-
// mutability before appending Set-Cookie entries.
|
|
436
|
-
const finalResponse = ensureMutableResponse(middlewareResponse);
|
|
437
|
-
applyCookieJar(finalResponse.headers);
|
|
438
|
-
logMiddlewareShortCircuit({ method, path, status: finalResponse.status });
|
|
439
|
-
return finalResponse;
|
|
440
|
-
}
|
|
441
|
-
// Middleware succeeded without short-circuiting — apply any
|
|
442
|
-
// injected request headers so headers() returns them downstream.
|
|
443
|
-
applyRequestHeaderOverlay(requestHeaderOverlay);
|
|
444
|
-
} catch (error) {
|
|
445
|
-
setMutableCookieContext(false);
|
|
446
|
-
// RedirectSignal from middleware → HTTP redirect (not an error).
|
|
447
|
-
// For RSC payload requests (client navigation), return 204 + X-Timber-Redirect
|
|
448
|
-
// so the client router can perform a soft SPA redirect. A raw 302 would be
|
|
449
|
-
// turned into an opaque redirect by fetch({redirect:'manual'}), crashing
|
|
450
|
-
// createFromFetch. See design/19-client-navigation.md.
|
|
451
|
-
if (error instanceof RedirectSignal) {
|
|
452
|
-
applyCookieJar(responseHeaders);
|
|
453
|
-
const isRsc = (req.headers.get('Accept') ?? '').includes('text/x-component');
|
|
454
|
-
if (isRsc) {
|
|
455
|
-
responseHeaders.set('X-Timber-Redirect', error.location);
|
|
456
|
-
return new Response(null, { status: 204, headers: responseHeaders });
|
|
457
|
-
}
|
|
458
|
-
responseHeaders.set('Location', error.location);
|
|
459
|
-
return new Response(null, { status: error.status, headers: responseHeaders });
|
|
460
|
-
}
|
|
461
|
-
// DenySignal from middleware → HTTP deny status
|
|
462
|
-
if (error instanceof DenySignal) {
|
|
463
|
-
return new Response(null, { status: error.status });
|
|
464
|
-
}
|
|
465
|
-
// Middleware throw → HTTP 500 (middleware runs before rendering,
|
|
466
|
-
// no error boundary to catch it)
|
|
467
|
-
logMiddlewareError({ method, path, error });
|
|
468
|
-
await fireOnRequestError(error, req, 'handler');
|
|
469
|
-
if (onPipelineError && error instanceof Error) onPipelineError(error, 'middleware');
|
|
470
|
-
return new Response(null, { status: 500 });
|
|
471
|
-
}
|
|
472
|
-
}
|
|
473
|
-
|
|
474
|
-
// Apply cookie jar to response headers before render commits them.
|
|
475
|
-
// Middleware may have set cookies; they need to be on responseHeaders
|
|
476
|
-
// before flushResponse creates the Response object.
|
|
477
|
-
applyCookieJar(responseHeaders);
|
|
478
|
-
|
|
479
|
-
// Stage 4: Render (access gates + element tree + renderToReadableStream)
|
|
480
|
-
try {
|
|
481
|
-
const renderFn = () =>
|
|
482
|
-
render(req, match, responseHeaders, requestHeaderOverlay, interception);
|
|
483
|
-
const response = await withSpan('timber.render', { 'http.route': canonicalPathname }, () =>
|
|
484
|
-
serverTiming === 'detailed'
|
|
485
|
-
? withTiming('render', 'RSC + SSR render', renderFn)
|
|
486
|
-
: renderFn()
|
|
487
|
-
);
|
|
488
|
-
markResponseFlushed();
|
|
489
|
-
return response;
|
|
490
|
-
} catch (error) {
|
|
491
|
-
// DenySignal leaked from render (e.g. notFound() in metadata()).
|
|
492
|
-
// Return the deny status code instead of 500.
|
|
493
|
-
if (error instanceof DenySignal) {
|
|
494
|
-
return new Response(null, { status: error.status });
|
|
495
|
-
}
|
|
496
|
-
// RedirectSignal leaked from render — honour the redirect.
|
|
497
|
-
// For RSC payload requests, return 204 + X-Timber-Redirect so the
|
|
498
|
-
// client router can perform a soft SPA redirect (same as middleware path).
|
|
499
|
-
if (error instanceof RedirectSignal) {
|
|
500
|
-
const isRsc = (req.headers.get('Accept') ?? '').includes('text/x-component');
|
|
501
|
-
if (isRsc) {
|
|
502
|
-
responseHeaders.set('X-Timber-Redirect', error.location);
|
|
503
|
-
return new Response(null, { status: 204, headers: responseHeaders });
|
|
504
|
-
}
|
|
505
|
-
responseHeaders.set('Location', error.location);
|
|
506
|
-
return new Response(null, { status: error.status, headers: responseHeaders });
|
|
507
|
-
}
|
|
508
|
-
logRenderError({ method, path, error });
|
|
509
|
-
await fireOnRequestError(error, req, 'render');
|
|
510
|
-
if (onPipelineError && error instanceof Error) onPipelineError(error, 'render');
|
|
511
|
-
// Try fallback error page before bare 500
|
|
512
|
-
if (config.renderFallbackError) {
|
|
513
|
-
try {
|
|
514
|
-
return await config.renderFallbackError(error, req, responseHeaders);
|
|
515
|
-
} catch {
|
|
516
|
-
// Fallback rendering itself failed — fall through to bare 500
|
|
517
|
-
}
|
|
518
|
-
}
|
|
519
|
-
return new Response(null, { status: 500 });
|
|
520
|
-
}
|
|
521
|
-
}
|
|
522
|
-
}
|
|
523
|
-
|
|
524
|
-
/**
|
|
525
|
-
* Fire the user's onRequestError hook with request context.
|
|
526
|
-
* Extracts request info from the Request object and calls the instrumentation hook.
|
|
527
|
-
*/
|
|
528
|
-
async function fireOnRequestError(
|
|
529
|
-
error: unknown,
|
|
530
|
-
req: Request,
|
|
531
|
-
phase: 'proxy' | 'handler' | 'render' | 'action' | 'route'
|
|
532
|
-
): Promise<void> {
|
|
533
|
-
const url = new URL(req.url);
|
|
534
|
-
const headersObj: Record<string, string> = {};
|
|
535
|
-
req.headers.forEach((v, k) => {
|
|
536
|
-
headersObj[k] = v;
|
|
537
|
-
});
|
|
538
|
-
|
|
539
|
-
await callOnRequestError(
|
|
540
|
-
error,
|
|
541
|
-
{ method: req.method, path: url.pathname, headers: headersObj },
|
|
542
|
-
{ phase, routePath: url.pathname, routeType: 'page', traceId: traceId() }
|
|
543
|
-
);
|
|
544
|
-
}
|
|
545
|
-
|
|
546
|
-
// ─── Cookie Helpers ──────────────────────────────────────────────────────
|
|
547
|
-
|
|
548
|
-
/**
|
|
549
|
-
* Apply all Set-Cookie headers from the cookie jar to a Headers object.
|
|
550
|
-
* Each cookie gets its own Set-Cookie header per RFC 6265 §4.1.
|
|
551
|
-
*/
|
|
552
|
-
function applyCookieJar(headers: Headers): void {
|
|
553
|
-
for (const value of getSetCookieHeaders()) {
|
|
554
|
-
headers.append('Set-Cookie', value);
|
|
555
|
-
}
|
|
556
|
-
}
|
|
557
|
-
|
|
558
|
-
// ─── Immutable Response Helpers ──────────────────────────────────────────
|
|
559
|
-
|
|
560
|
-
/**
|
|
561
|
-
* Ensure a Response has mutable headers so the pipeline can safely append
|
|
562
|
-
* Set-Cookie and Server-Timing entries.
|
|
563
|
-
*
|
|
564
|
-
* `Response.redirect()` and some platform-level responses return objects
|
|
565
|
-
* with immutable headers. Calling `.set()` or `.append()` on them throws
|
|
566
|
-
* `TypeError: immutable`. This helper detects the immutable case by
|
|
567
|
-
* attempting a no-op write and, on failure, clones into a fresh Response
|
|
568
|
-
* with mutable headers.
|
|
569
|
-
*/
|
|
570
|
-
function ensureMutableResponse(response: Response): Response {
|
|
571
|
-
try {
|
|
572
|
-
// Probe mutability with a benign operation that we immediately undo.
|
|
573
|
-
// We pick a header name that is extremely unlikely to collide with
|
|
574
|
-
// anything meaningful and delete it right away.
|
|
575
|
-
response.headers.set('X-Timber-Probe', '1');
|
|
576
|
-
response.headers.delete('X-Timber-Probe');
|
|
577
|
-
return response;
|
|
578
|
-
} catch {
|
|
579
|
-
// Headers are immutable — rebuild with mutable headers.
|
|
580
|
-
return new Response(response.body, {
|
|
581
|
-
status: response.status,
|
|
582
|
-
statusText: response.statusText,
|
|
583
|
-
headers: new Headers(response.headers),
|
|
584
|
-
});
|
|
585
|
-
}
|
|
543
|
+
return pipelineFn;
|
|
586
544
|
}
|