@timber-js/app 0.2.0-alpha.1 → 0.2.0-alpha.100

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.
Files changed (742) hide show
  1. package/LICENSE +8 -0
  2. package/dist/_chunks/actions-CQ8Z8VGL.js +1061 -0
  3. package/dist/_chunks/actions-CQ8Z8VGL.js.map +1 -0
  4. package/dist/_chunks/build-output-helper-DXnW0qjz.js +61 -0
  5. package/dist/_chunks/build-output-helper-DXnW0qjz.js.map +1 -0
  6. package/dist/_chunks/chunk-BYIpzuS7.js +39 -0
  7. package/dist/_chunks/define-B-Q_UMOD.js +195 -0
  8. package/dist/_chunks/define-B-Q_UMOD.js.map +1 -0
  9. package/dist/_chunks/define-CfBPoJb0.js +123 -0
  10. package/dist/_chunks/define-CfBPoJb0.js.map +1 -0
  11. package/dist/_chunks/define-cookie-BjpIt4UC.js +194 -0
  12. package/dist/_chunks/define-cookie-BjpIt4UC.js.map +1 -0
  13. package/dist/_chunks/format-Bcn-Iv1x.js +14 -0
  14. package/dist/_chunks/format-Bcn-Iv1x.js.map +1 -0
  15. package/dist/_chunks/handler-store-B-lqaGyh.js +54 -0
  16. package/dist/_chunks/handler-store-B-lqaGyh.js.map +1 -0
  17. package/dist/_chunks/logger-0m8MsKdc.js +291 -0
  18. package/dist/_chunks/logger-0m8MsKdc.js.map +1 -0
  19. package/dist/_chunks/merge-search-params-BphMdht_.js +122 -0
  20. package/dist/_chunks/merge-search-params-BphMdht_.js.map +1 -0
  21. package/dist/_chunks/{metadata-routes-CQCnF4VK.js → metadata-routes-BU684ls2.js} +1 -1
  22. package/dist/_chunks/{metadata-routes-CQCnF4VK.js.map → metadata-routes-BU684ls2.js.map} +1 -1
  23. package/dist/_chunks/navigation-root-BCYczjml.js +96 -0
  24. package/dist/_chunks/navigation-root-BCYczjml.js.map +1 -0
  25. package/dist/_chunks/registry-I2ss-lvy.js +20 -0
  26. package/dist/_chunks/registry-I2ss-lvy.js.map +1 -0
  27. package/dist/_chunks/router-ref-h3-UaCQv.js +28 -0
  28. package/dist/_chunks/router-ref-h3-UaCQv.js.map +1 -0
  29. package/dist/_chunks/schema-bridge-Cxu4l-7p.js +86 -0
  30. package/dist/_chunks/schema-bridge-Cxu4l-7p.js.map +1 -0
  31. package/dist/_chunks/segment-classify-BjfuctV2.js +137 -0
  32. package/dist/_chunks/segment-classify-BjfuctV2.js.map +1 -0
  33. package/dist/_chunks/segment-context-Dx_OizxD.js +34 -0
  34. package/dist/_chunks/segment-context-Dx_OizxD.js.map +1 -0
  35. package/dist/_chunks/{ssr-data-DLnbYpj1.js → ssr-data-B4CdH7rE.js} +1 -1
  36. package/dist/_chunks/ssr-data-B4CdH7rE.js.map +1 -0
  37. package/dist/_chunks/stale-reload-Bab885FO.js +64 -0
  38. package/dist/_chunks/stale-reload-Bab885FO.js.map +1 -0
  39. package/dist/_chunks/tracing-C8V-YGsP.js +329 -0
  40. package/dist/_chunks/tracing-C8V-YGsP.js.map +1 -0
  41. package/dist/_chunks/{use-query-states-DAhgj8Gx.js → use-query-states-B2XTqxDR.js} +7 -20
  42. package/dist/_chunks/use-query-states-B2XTqxDR.js.map +1 -0
  43. package/dist/_chunks/use-segment-params-BkpKAQ7D.js +185 -0
  44. package/dist/_chunks/use-segment-params-BkpKAQ7D.js.map +1 -0
  45. package/dist/_chunks/walkers-Tg0Alwcg.js +850 -0
  46. package/dist/_chunks/walkers-Tg0Alwcg.js.map +1 -0
  47. package/dist/_chunks/{format-DNt20Kt8.js → warnings-Cg47l5sk.js} +7 -45
  48. package/dist/_chunks/warnings-Cg47l5sk.js.map +1 -0
  49. package/dist/adapters/build-output-helper.d.ts +28 -0
  50. package/dist/adapters/build-output-helper.d.ts.map +1 -0
  51. package/dist/adapters/cloudflare-dev.d.ts +109 -0
  52. package/dist/adapters/cloudflare-dev.d.ts.map +1 -0
  53. package/dist/adapters/cloudflare-dev.js +73 -0
  54. package/dist/adapters/cloudflare-dev.js.map +1 -0
  55. package/dist/adapters/cloudflare-kv-cache.d.ts +64 -0
  56. package/dist/adapters/cloudflare-kv-cache.d.ts.map +1 -0
  57. package/dist/adapters/cloudflare-kv-cache.js +95 -0
  58. package/dist/adapters/cloudflare-kv-cache.js.map +1 -0
  59. package/dist/adapters/cloudflare.d.ts +148 -12
  60. package/dist/adapters/cloudflare.d.ts.map +1 -1
  61. package/dist/adapters/cloudflare.js +142 -38
  62. package/dist/adapters/cloudflare.js.map +1 -1
  63. package/dist/adapters/compress-module.d.ts.map +1 -1
  64. package/dist/adapters/nitro.d.ts +17 -1
  65. package/dist/adapters/nitro.d.ts.map +1 -1
  66. package/dist/adapters/nitro.js +143 -45
  67. package/dist/adapters/nitro.js.map +1 -1
  68. package/dist/adapters/shared.d.ts +16 -0
  69. package/dist/adapters/shared.d.ts.map +1 -0
  70. package/dist/cache/cache-api.d.ts +24 -0
  71. package/dist/cache/cache-api.d.ts.map +1 -0
  72. package/dist/cache/fast-hash.d.ts +22 -0
  73. package/dist/cache/fast-hash.d.ts.map +1 -0
  74. package/dist/cache/handler-store.d.ts +31 -0
  75. package/dist/cache/handler-store.d.ts.map +1 -0
  76. package/dist/cache/index.d.ts +23 -7
  77. package/dist/cache/index.d.ts.map +1 -1
  78. package/dist/cache/index.js +195 -84
  79. package/dist/cache/index.js.map +1 -1
  80. package/dist/cache/singleflight.d.ts +18 -1
  81. package/dist/cache/singleflight.d.ts.map +1 -1
  82. package/dist/cache/sizeof.d.ts +22 -0
  83. package/dist/cache/sizeof.d.ts.map +1 -0
  84. package/dist/cache/timber-cache.d.ts +1 -1
  85. package/dist/cache/timber-cache.d.ts.map +1 -1
  86. package/dist/cli.d.ts +6 -1
  87. package/dist/cli.d.ts.map +1 -1
  88. package/dist/cli.js +8 -3
  89. package/dist/cli.js.map +1 -1
  90. package/dist/client/browser-dev.d.ts +34 -1
  91. package/dist/client/browser-dev.d.ts.map +1 -1
  92. package/dist/client/browser-entry/action-dispatch.d.ts +17 -0
  93. package/dist/client/browser-entry/action-dispatch.d.ts.map +1 -0
  94. package/dist/client/browser-entry/hmr.d.ts +21 -0
  95. package/dist/client/browser-entry/hmr.d.ts.map +1 -0
  96. package/dist/client/browser-entry/hydrate.d.ts +46 -0
  97. package/dist/client/browser-entry/hydrate.d.ts.map +1 -0
  98. package/dist/client/browser-entry/index.d.ts +30 -0
  99. package/dist/client/browser-entry/index.d.ts.map +1 -0
  100. package/dist/client/browser-entry/post-hydration.d.ts +26 -0
  101. package/dist/client/browser-entry/post-hydration.d.ts.map +1 -0
  102. package/dist/client/browser-entry/router-init.d.ts +23 -0
  103. package/dist/client/browser-entry/router-init.d.ts.map +1 -0
  104. package/dist/client/browser-entry/rsc-stream.d.ts +24 -0
  105. package/dist/client/browser-entry/rsc-stream.d.ts.map +1 -0
  106. package/dist/client/browser-entry/scroll.d.ts +19 -0
  107. package/dist/client/browser-entry/scroll.d.ts.map +1 -0
  108. package/dist/client/error-boundary.d.ts +12 -5
  109. package/dist/client/error-boundary.d.ts.map +1 -1
  110. package/dist/client/error-boundary.js +26 -5
  111. package/dist/client/error-boundary.js.map +1 -1
  112. package/dist/client/error-reconstituter.d.ts +54 -0
  113. package/dist/client/error-reconstituter.d.ts.map +1 -0
  114. package/dist/client/form.d.ts +16 -27
  115. package/dist/client/form.d.ts.map +1 -1
  116. package/dist/client/history.d.ts +19 -4
  117. package/dist/client/history.d.ts.map +1 -1
  118. package/dist/client/index.d.ts +9 -24
  119. package/dist/client/index.d.ts.map +1 -1
  120. package/dist/client/index.js +312 -1109
  121. package/dist/client/index.js.map +1 -1
  122. package/dist/client/internal.d.ts +19 -0
  123. package/dist/client/internal.d.ts.map +1 -0
  124. package/dist/client/internal.js +964 -0
  125. package/dist/client/internal.js.map +1 -0
  126. package/dist/client/link-pending-store.d.ts +63 -0
  127. package/dist/client/link-pending-store.d.ts.map +1 -0
  128. package/dist/client/link.d.ts +73 -63
  129. package/dist/client/link.d.ts.map +1 -1
  130. package/dist/client/nav-link-store.d.ts +36 -0
  131. package/dist/client/nav-link-store.d.ts.map +1 -0
  132. package/dist/client/navigation-api-types.d.ts +90 -0
  133. package/dist/client/navigation-api-types.d.ts.map +1 -0
  134. package/dist/client/navigation-api.d.ts +115 -0
  135. package/dist/client/navigation-api.d.ts.map +1 -0
  136. package/dist/client/navigation-context.d.ts +22 -5
  137. package/dist/client/navigation-context.d.ts.map +1 -1
  138. package/dist/client/{transition-root.d.ts → navigation-root.d.ts} +42 -8
  139. package/dist/client/navigation-root.d.ts.map +1 -0
  140. package/dist/client/nuqs-adapter.d.ts.map +1 -1
  141. package/dist/client/router-ref.d.ts +1 -1
  142. package/dist/client/router.d.ts +70 -4
  143. package/dist/client/router.d.ts.map +1 -1
  144. package/dist/client/rsc-fetch.d.ts +38 -3
  145. package/dist/client/rsc-fetch.d.ts.map +1 -1
  146. package/dist/client/segment-cache.d.ts +1 -1
  147. package/dist/client/segment-cache.d.ts.map +1 -1
  148. package/dist/client/segment-context.d.ts +1 -1
  149. package/dist/client/segment-context.d.ts.map +1 -1
  150. package/dist/client/segment-merger.d.ts.map +1 -1
  151. package/dist/client/segment-outlet.d.ts +63 -0
  152. package/dist/client/segment-outlet.d.ts.map +1 -0
  153. package/dist/client/ssr-data.d.ts +13 -4
  154. package/dist/client/ssr-data.d.ts.map +1 -1
  155. package/dist/client/stale-reload.d.ts +15 -0
  156. package/dist/client/stale-reload.d.ts.map +1 -1
  157. package/dist/client/state.d.ts +1 -1
  158. package/dist/client/top-loader.d.ts +5 -5
  159. package/dist/client/top-loader.d.ts.map +1 -1
  160. package/dist/client/use-cookie.d.ts +8 -0
  161. package/dist/client/use-cookie.d.ts.map +1 -1
  162. package/dist/client/use-link-status.d.ts +5 -5
  163. package/dist/client/use-link-status.d.ts.map +1 -1
  164. package/dist/client/{use-navigation-pending.d.ts → use-pending-navigation.d.ts} +4 -4
  165. package/dist/client/use-pending-navigation.d.ts.map +1 -0
  166. package/dist/client/use-query-states.d.ts +1 -1
  167. package/dist/client/use-query-states.d.ts.map +1 -1
  168. package/dist/client/use-router.d.ts +1 -1
  169. package/dist/client/{use-params.d.ts → use-segment-params.d.ts} +7 -5
  170. package/dist/client/use-segment-params.d.ts.map +1 -0
  171. package/dist/codec.d.ts +33 -0
  172. package/dist/codec.d.ts.map +1 -0
  173. package/dist/codec.js +2 -0
  174. package/dist/config-types.d.ts +294 -0
  175. package/dist/config-types.d.ts.map +1 -0
  176. package/dist/config-validation.d.ts +51 -0
  177. package/dist/config-validation.d.ts.map +1 -0
  178. package/dist/content/index.d.ts +1 -10
  179. package/dist/content/index.d.ts.map +1 -1
  180. package/dist/content/index.js +0 -2
  181. package/dist/cookies/define-cookie.d.ts +98 -25
  182. package/dist/cookies/define-cookie.d.ts.map +1 -1
  183. package/dist/cookies/index.d.ts +2 -1
  184. package/dist/cookies/index.d.ts.map +1 -1
  185. package/dist/cookies/index.js +36 -72
  186. package/dist/cookies/index.js.map +1 -1
  187. package/dist/cookies/json-cookie.d.ts +64 -0
  188. package/dist/cookies/json-cookie.d.ts.map +1 -0
  189. package/dist/cookies/validation.d.ts +46 -0
  190. package/dist/cookies/validation.d.ts.map +1 -0
  191. package/dist/dev-tools/404-page.d.ts +46 -0
  192. package/dist/dev-tools/404-page.d.ts.map +1 -0
  193. package/dist/dev-tools/browser-logs.d.ts +84 -0
  194. package/dist/dev-tools/browser-logs.d.ts.map +1 -0
  195. package/dist/dev-tools/error-page.d.ts +58 -0
  196. package/dist/dev-tools/error-page.d.ts.map +1 -0
  197. package/dist/dev-tools/holding-server.d.ts +54 -0
  198. package/dist/dev-tools/holding-server.d.ts.map +1 -0
  199. package/dist/dev-tools/index.d.ts +31 -0
  200. package/dist/dev-tools/index.d.ts.map +1 -0
  201. package/dist/{server/dev-span-processor.d.ts → dev-tools/instrumentation.d.ts} +26 -6
  202. package/dist/dev-tools/instrumentation.d.ts.map +1 -0
  203. package/dist/{server/dev-logger.d.ts → dev-tools/logger.d.ts} +1 -1
  204. package/dist/dev-tools/logger.d.ts.map +1 -0
  205. package/dist/{plugins/dev-logs.d.ts → dev-tools/logs.d.ts} +2 -2
  206. package/dist/dev-tools/logs.d.ts.map +1 -0
  207. package/dist/dev-tools/overlay.d.ts +91 -0
  208. package/dist/dev-tools/overlay.d.ts.map +1 -0
  209. package/dist/dev-tools/stack-classifier.d.ts +34 -0
  210. package/dist/dev-tools/stack-classifier.d.ts.map +1 -0
  211. package/dist/dev-tools/terminal.d.ts +28 -0
  212. package/dist/dev-tools/terminal.d.ts.map +1 -0
  213. package/dist/{server/dev-warnings.d.ts → dev-tools/warnings.d.ts} +2 -22
  214. package/dist/dev-tools/warnings.d.ts.map +1 -0
  215. package/dist/fonts/bundle.d.ts +48 -0
  216. package/dist/fonts/bundle.d.ts.map +1 -0
  217. package/dist/fonts/css.d.ts +1 -0
  218. package/dist/fonts/css.d.ts.map +1 -1
  219. package/dist/fonts/dev-middleware.d.ts +22 -0
  220. package/dist/fonts/dev-middleware.d.ts.map +1 -0
  221. package/dist/fonts/local.d.ts +4 -2
  222. package/dist/fonts/local.d.ts.map +1 -1
  223. package/dist/fonts/pipeline.d.ts +167 -0
  224. package/dist/fonts/pipeline.d.ts.map +1 -0
  225. package/dist/fonts/transform.d.ts +64 -0
  226. package/dist/fonts/transform.d.ts.map +1 -0
  227. package/dist/fonts/types.d.ts +45 -1
  228. package/dist/fonts/types.d.ts.map +1 -1
  229. package/dist/fonts/virtual-modules.d.ts +103 -0
  230. package/dist/fonts/virtual-modules.d.ts.map +1 -0
  231. package/dist/index.d.ts +46 -152
  232. package/dist/index.d.ts.map +1 -1
  233. package/dist/index.js +14702 -12350
  234. package/dist/index.js.map +1 -1
  235. package/dist/plugin-context.d.ts +107 -0
  236. package/dist/plugin-context.d.ts.map +1 -0
  237. package/dist/plugins/adapter-build.d.ts +1 -1
  238. package/dist/plugins/adapter-build.d.ts.map +1 -1
  239. package/dist/plugins/build-manifest.d.ts +2 -2
  240. package/dist/plugins/build-manifest.d.ts.map +1 -1
  241. package/dist/plugins/build-report.d.ts +16 -4
  242. package/dist/plugins/build-report.d.ts.map +1 -1
  243. package/dist/plugins/chunks.d.ts +9 -1
  244. package/dist/plugins/chunks.d.ts.map +1 -1
  245. package/dist/plugins/client-chunks.d.ts +32 -0
  246. package/dist/plugins/client-chunks.d.ts.map +1 -0
  247. package/dist/plugins/content.d.ts +1 -1
  248. package/dist/plugins/content.d.ts.map +1 -1
  249. package/dist/plugins/dev-server.d.ts +1 -1
  250. package/dist/plugins/dev-server.d.ts.map +1 -1
  251. package/dist/plugins/entries.d.ts +8 -1
  252. package/dist/plugins/entries.d.ts.map +1 -1
  253. package/dist/plugins/fonts.d.ts +17 -65
  254. package/dist/plugins/fonts.d.ts.map +1 -1
  255. package/dist/plugins/mdx.d.ts +7 -1
  256. package/dist/plugins/mdx.d.ts.map +1 -1
  257. package/dist/plugins/routing.d.ts +1 -1
  258. package/dist/plugins/routing.d.ts.map +1 -1
  259. package/dist/plugins/server-bundle.d.ts.map +1 -1
  260. package/dist/plugins/shims.d.ts +6 -5
  261. package/dist/plugins/shims.d.ts.map +1 -1
  262. package/dist/plugins/static-build.d.ts +4 -4
  263. package/dist/plugins/static-build.d.ts.map +1 -1
  264. package/dist/routing/codegen-shared.d.ts +55 -0
  265. package/dist/routing/codegen-shared.d.ts.map +1 -0
  266. package/dist/routing/codegen-types.d.ts +52 -0
  267. package/dist/routing/codegen-types.d.ts.map +1 -0
  268. package/dist/routing/codegen.d.ts +2 -2
  269. package/dist/routing/codegen.d.ts.map +1 -1
  270. package/dist/routing/convention-lint.d.ts +41 -0
  271. package/dist/routing/convention-lint.d.ts.map +1 -0
  272. package/dist/routing/index.d.ts +5 -1
  273. package/dist/routing/index.d.ts.map +1 -1
  274. package/dist/routing/index.js +3 -2
  275. package/dist/routing/link-codegen.d.ts +90 -0
  276. package/dist/routing/link-codegen.d.ts.map +1 -0
  277. package/dist/routing/scanner.d.ts +1 -10
  278. package/dist/routing/scanner.d.ts.map +1 -1
  279. package/dist/routing/segment-classify.d.ts +75 -0
  280. package/dist/routing/segment-classify.d.ts.map +1 -0
  281. package/dist/routing/status-file-lint.d.ts +2 -1
  282. package/dist/routing/status-file-lint.d.ts.map +1 -1
  283. package/dist/routing/types.d.ts +77 -25
  284. package/dist/routing/types.d.ts.map +1 -1
  285. package/dist/routing/walkers.d.ts +51 -0
  286. package/dist/routing/walkers.d.ts.map +1 -0
  287. package/dist/rsc-runtime/rsc.d.ts +1 -1
  288. package/dist/rsc-runtime/rsc.d.ts.map +1 -1
  289. package/dist/rsc-runtime/ssr.d.ts +12 -0
  290. package/dist/rsc-runtime/ssr.d.ts.map +1 -1
  291. package/dist/schema-bridge.d.ts +76 -0
  292. package/dist/schema-bridge.d.ts.map +1 -0
  293. package/dist/search-params/define.d.ts +157 -0
  294. package/dist/search-params/define.d.ts.map +1 -0
  295. package/dist/search-params/index.d.ts +4 -7
  296. package/dist/search-params/index.d.ts.map +1 -1
  297. package/dist/search-params/index.js +34 -441
  298. package/dist/search-params/index.js.map +1 -1
  299. package/dist/search-params/registry.d.ts +2 -2
  300. package/dist/search-params/registry.d.ts.map +1 -1
  301. package/dist/search-params/wrappers.d.ts +53 -0
  302. package/dist/search-params/wrappers.d.ts.map +1 -0
  303. package/dist/segment-params/define.d.ts +95 -0
  304. package/dist/segment-params/define.d.ts.map +1 -0
  305. package/dist/segment-params/index.d.ts +3 -0
  306. package/dist/segment-params/index.d.ts.map +1 -0
  307. package/dist/segment-params/index.js +2 -0
  308. package/dist/server/access-gate.d.ts +8 -3
  309. package/dist/server/access-gate.d.ts.map +1 -1
  310. package/dist/server/action-client.d.ts +41 -6
  311. package/dist/server/action-client.d.ts.map +1 -1
  312. package/dist/server/action-encryption.d.ts +76 -0
  313. package/dist/server/action-encryption.d.ts.map +1 -0
  314. package/dist/server/action-handler.d.ts +35 -1
  315. package/dist/server/action-handler.d.ts.map +1 -1
  316. package/dist/server/actions.d.ts +3 -6
  317. package/dist/server/actions.d.ts.map +1 -1
  318. package/dist/server/als-registry.d.ts +33 -5
  319. package/dist/server/als-registry.d.ts.map +1 -1
  320. package/dist/server/asset-headers.d.ts +1 -15
  321. package/dist/server/asset-headers.d.ts.map +1 -1
  322. package/dist/server/build-manifest.d.ts +2 -2
  323. package/dist/server/build-manifest.d.ts.map +1 -1
  324. package/dist/server/cookie-context.d.ts +170 -0
  325. package/dist/server/cookie-context.d.ts.map +1 -0
  326. package/dist/server/cookie-parsing.d.ts +51 -0
  327. package/dist/server/cookie-parsing.d.ts.map +1 -0
  328. package/dist/server/debug.d.ts +82 -0
  329. package/dist/server/debug.d.ts.map +1 -0
  330. package/dist/server/default-logger.d.ts +22 -0
  331. package/dist/server/default-logger.d.ts.map +1 -0
  332. package/dist/server/deny-boundary.d.ts +90 -0
  333. package/dist/server/deny-boundary.d.ts.map +1 -0
  334. package/dist/server/deny-renderer.d.ts.map +1 -1
  335. package/dist/server/dev-source-map.d.ts +22 -0
  336. package/dist/server/dev-source-map.d.ts.map +1 -0
  337. package/dist/server/early-hints-sender.d.ts.map +1 -1
  338. package/dist/server/early-hints.d.ts +13 -5
  339. package/dist/server/early-hints.d.ts.map +1 -1
  340. package/dist/server/error-boundary-wrapper.d.ts +7 -1
  341. package/dist/server/error-boundary-wrapper.d.ts.map +1 -1
  342. package/dist/server/fallback-error.d.ts +12 -7
  343. package/dist/server/fallback-error.d.ts.map +1 -1
  344. package/dist/server/flight-injection-state.d.ts +66 -0
  345. package/dist/server/flight-injection-state.d.ts.map +1 -0
  346. package/dist/server/flight-scripts.d.ts +42 -0
  347. package/dist/server/flight-scripts.d.ts.map +1 -0
  348. package/dist/server/flush.d.ts.map +1 -1
  349. package/dist/server/form-data.d.ts +29 -0
  350. package/dist/server/form-data.d.ts.map +1 -1
  351. package/dist/server/html-injector-core.d.ts +212 -0
  352. package/dist/server/html-injector-core.d.ts.map +1 -0
  353. package/dist/server/html-injectors.d.ts +81 -41
  354. package/dist/server/html-injectors.d.ts.map +1 -1
  355. package/dist/server/index.d.ts +9 -46
  356. package/dist/server/index.d.ts.map +1 -1
  357. package/dist/server/index.js +158 -2899
  358. package/dist/server/index.js.map +1 -1
  359. package/dist/server/internal.d.ts +48 -0
  360. package/dist/server/internal.d.ts.map +1 -0
  361. package/dist/server/internal.js +2900 -0
  362. package/dist/server/internal.js.map +1 -0
  363. package/dist/server/logger.d.ts +39 -7
  364. package/dist/server/logger.d.ts.map +1 -1
  365. package/dist/server/middleware-runner.d.ts +36 -4
  366. package/dist/server/middleware-runner.d.ts.map +1 -1
  367. package/dist/server/node-stream-transforms.d.ts +110 -0
  368. package/dist/server/node-stream-transforms.d.ts.map +1 -0
  369. package/dist/server/param-coercion.d.ts +26 -0
  370. package/dist/server/param-coercion.d.ts.map +1 -0
  371. package/dist/server/pipeline-helpers.d.ts +95 -0
  372. package/dist/server/pipeline-helpers.d.ts.map +1 -0
  373. package/dist/server/pipeline-interception.d.ts +1 -1
  374. package/dist/server/pipeline-interception.d.ts.map +1 -1
  375. package/dist/server/pipeline-metadata.d.ts +6 -0
  376. package/dist/server/pipeline-metadata.d.ts.map +1 -1
  377. package/dist/server/pipeline-outcome.d.ts +49 -0
  378. package/dist/server/pipeline-outcome.d.ts.map +1 -0
  379. package/dist/server/pipeline-phases.d.ts +52 -0
  380. package/dist/server/pipeline-phases.d.ts.map +1 -0
  381. package/dist/server/pipeline.d.ts +93 -23
  382. package/dist/server/pipeline.d.ts.map +1 -1
  383. package/dist/server/port-resolution.d.ts +117 -0
  384. package/dist/server/port-resolution.d.ts.map +1 -0
  385. package/dist/server/primitives.d.ts +69 -18
  386. package/dist/server/primitives.d.ts.map +1 -1
  387. package/dist/server/render-timeout.d.ts +51 -0
  388. package/dist/server/render-timeout.d.ts.map +1 -0
  389. package/dist/server/request-context.d.ts +41 -109
  390. package/dist/server/request-context.d.ts.map +1 -1
  391. package/dist/server/route-element-builder.d.ts +27 -1
  392. package/dist/server/route-element-builder.d.ts.map +1 -1
  393. package/dist/server/route-handler.d.ts.map +1 -1
  394. package/dist/server/route-matcher.d.ts +21 -34
  395. package/dist/server/route-matcher.d.ts.map +1 -1
  396. package/dist/server/rsc-entry/action-middleware-runner.d.ts +66 -0
  397. package/dist/server/rsc-entry/action-middleware-runner.d.ts.map +1 -0
  398. package/dist/server/rsc-entry/api-handler.d.ts +2 -2
  399. package/dist/server/rsc-entry/api-handler.d.ts.map +1 -1
  400. package/dist/server/rsc-entry/error-renderer.d.ts +26 -13
  401. package/dist/server/rsc-entry/error-renderer.d.ts.map +1 -1
  402. package/dist/server/rsc-entry/helpers.d.ts +49 -6
  403. package/dist/server/rsc-entry/helpers.d.ts.map +1 -1
  404. package/dist/server/rsc-entry/index.d.ts +20 -3
  405. package/dist/server/rsc-entry/index.d.ts.map +1 -1
  406. package/dist/server/rsc-entry/render-route.d.ts +50 -0
  407. package/dist/server/rsc-entry/render-route.d.ts.map +1 -0
  408. package/dist/server/rsc-entry/rsc-payload.d.ts +3 -3
  409. package/dist/server/rsc-entry/rsc-payload.d.ts.map +1 -1
  410. package/dist/server/rsc-entry/rsc-stream.d.ts +20 -1
  411. package/dist/server/rsc-entry/rsc-stream.d.ts.map +1 -1
  412. package/dist/server/rsc-entry/ssr-bridge.d.ts +1 -1
  413. package/dist/server/rsc-entry/ssr-bridge.d.ts.map +1 -1
  414. package/dist/server/rsc-entry/ssr-renderer.d.ts +19 -4
  415. package/dist/server/rsc-entry/ssr-renderer.d.ts.map +1 -1
  416. package/dist/server/rsc-entry/wrap-action-dispatch.d.ts +119 -0
  417. package/dist/server/rsc-entry/wrap-action-dispatch.d.ts.map +1 -0
  418. package/dist/server/rsc-prop-warnings.d.ts.map +1 -1
  419. package/dist/server/safe-load.d.ts +46 -0
  420. package/dist/server/safe-load.d.ts.map +1 -0
  421. package/dist/server/sensitive-fields.d.ts +74 -0
  422. package/dist/server/sensitive-fields.d.ts.map +1 -0
  423. package/dist/server/sitemap-generator.d.ts +129 -0
  424. package/dist/server/sitemap-generator.d.ts.map +1 -0
  425. package/dist/server/sitemap-handler.d.ts +22 -0
  426. package/dist/server/sitemap-handler.d.ts.map +1 -0
  427. package/dist/server/slot-resolver.d.ts +1 -1
  428. package/dist/server/slot-resolver.d.ts.map +1 -1
  429. package/dist/server/ssr-entry.d.ts +23 -0
  430. package/dist/server/ssr-entry.d.ts.map +1 -1
  431. package/dist/server/ssr-render.d.ts +39 -21
  432. package/dist/server/ssr-render.d.ts.map +1 -1
  433. package/dist/server/ssr-wrappers.d.ts +50 -0
  434. package/dist/server/ssr-wrappers.d.ts.map +1 -0
  435. package/dist/server/state-tree-diff.d.ts.map +1 -1
  436. package/dist/server/status-code-resolver.d.ts +16 -11
  437. package/dist/server/status-code-resolver.d.ts.map +1 -1
  438. package/dist/server/stream-utils.d.ts +36 -0
  439. package/dist/server/stream-utils.d.ts.map +1 -0
  440. package/dist/server/tracing.d.ts +15 -5
  441. package/dist/server/tracing.d.ts.map +1 -1
  442. package/dist/server/tree-builder.d.ts +62 -30
  443. package/dist/server/tree-builder.d.ts.map +1 -1
  444. package/dist/server/types.d.ts +49 -4
  445. package/dist/server/types.d.ts.map +1 -1
  446. package/dist/server/utils/escape-html.d.ts +14 -0
  447. package/dist/server/utils/escape-html.d.ts.map +1 -0
  448. package/dist/server/version-skew.d.ts +61 -0
  449. package/dist/server/version-skew.d.ts.map +1 -0
  450. package/dist/server/waituntil-bridge.d.ts.map +1 -1
  451. package/dist/shared/merge-search-params.d.ts +22 -0
  452. package/dist/shared/merge-search-params.d.ts.map +1 -0
  453. package/dist/shims/font-google.d.ts +1 -1
  454. package/dist/shims/font-google.d.ts.map +1 -1
  455. package/dist/shims/font-google.js +42 -0
  456. package/dist/shims/font-google.js.map +1 -0
  457. package/dist/shims/font-local.d.ts +26 -0
  458. package/dist/shims/font-local.d.ts.map +1 -0
  459. package/dist/shims/font-local.js +20 -0
  460. package/dist/shims/font-local.js.map +1 -0
  461. package/dist/shims/headers.d.ts +2 -1
  462. package/dist/shims/headers.d.ts.map +1 -1
  463. package/dist/shims/navigation-client.d.ts +3 -1
  464. package/dist/shims/navigation-client.d.ts.map +1 -1
  465. package/dist/shims/navigation.d.ts +11 -5
  466. package/dist/shims/navigation.d.ts.map +1 -1
  467. package/dist/utils/directive-parser.d.ts +1 -43
  468. package/dist/utils/directive-parser.d.ts.map +1 -1
  469. package/dist/utils/state-machine.d.ts +80 -0
  470. package/dist/utils/state-machine.d.ts.map +1 -0
  471. package/package.json +56 -22
  472. package/src/adapters/build-output-helper.ts +77 -0
  473. package/src/adapters/cloudflare-dev.ts +177 -0
  474. package/src/adapters/cloudflare-kv-cache.ts +142 -0
  475. package/src/adapters/cloudflare.ts +350 -76
  476. package/src/adapters/compress-module.ts +24 -4
  477. package/src/adapters/nitro.ts +148 -60
  478. package/src/adapters/shared.ts +40 -0
  479. package/src/adapters/wrangler.d.ts +7 -0
  480. package/src/cache/cache-api.ts +38 -0
  481. package/src/cache/fast-hash.ts +34 -0
  482. package/src/cache/handler-store.ts +68 -0
  483. package/src/cache/index.ts +81 -18
  484. package/src/cache/singleflight.ts +62 -4
  485. package/src/cache/sizeof.ts +31 -0
  486. package/src/cache/timber-cache.ts +41 -29
  487. package/src/cli.ts +16 -6
  488. package/src/client/browser-dev.ts +153 -1
  489. package/src/client/browser-entry/action-dispatch.ts +116 -0
  490. package/src/client/browser-entry/hmr.ts +81 -0
  491. package/src/client/browser-entry/hydrate.ts +145 -0
  492. package/src/client/browser-entry/index.ts +143 -0
  493. package/src/client/browser-entry/post-hydration.ts +119 -0
  494. package/src/client/browser-entry/router-init.ts +193 -0
  495. package/src/client/browser-entry/rsc-stream.ts +157 -0
  496. package/src/client/browser-entry/scroll.ts +27 -0
  497. package/src/client/error-boundary.tsx +97 -20
  498. package/src/client/error-reconstituter.tsx +65 -0
  499. package/src/client/form.tsx +31 -32
  500. package/src/client/history.ts +26 -4
  501. package/src/client/index.ts +77 -43
  502. package/src/client/internal.ts +58 -0
  503. package/src/client/link-pending-store.ts +111 -0
  504. package/src/client/link.tsx +432 -140
  505. package/src/client/nav-link-store.ts +47 -0
  506. package/src/client/navigation-api-types.ts +112 -0
  507. package/src/client/navigation-api.ts +332 -0
  508. package/src/client/navigation-context.ts +83 -18
  509. package/src/client/navigation-root.tsx +342 -0
  510. package/src/client/nuqs-adapter.tsx +16 -3
  511. package/src/client/router-ref.ts +1 -1
  512. package/src/client/router.ts +303 -78
  513. package/src/client/rsc-fetch.ts +112 -8
  514. package/src/client/segment-cache.ts +1 -1
  515. package/src/client/segment-context.ts +6 -1
  516. package/src/client/segment-merger.ts +2 -8
  517. package/src/client/segment-outlet.tsx +86 -0
  518. package/src/client/ssr-data.ts +13 -5
  519. package/src/client/stale-reload.ts +74 -7
  520. package/src/client/state.ts +2 -2
  521. package/src/client/top-loader.tsx +41 -25
  522. package/src/client/use-cookie.ts +29 -0
  523. package/src/client/use-link-status.ts +7 -7
  524. package/src/client/{use-navigation-pending.ts → use-pending-navigation.ts} +6 -6
  525. package/src/client/use-query-states.ts +9 -3
  526. package/src/client/use-router.ts +1 -1
  527. package/src/client/{use-params.ts → use-segment-params.ts} +7 -5
  528. package/src/codec.ts +45 -0
  529. package/src/config-types.ts +292 -0
  530. package/src/config-validation.ts +303 -0
  531. package/src/content/index.ts +5 -13
  532. package/src/cookies/define-cookie.ts +301 -55
  533. package/src/cookies/index.ts +12 -1
  534. package/src/cookies/json-cookie.ts +105 -0
  535. package/src/cookies/validation.ts +134 -0
  536. package/src/dev-tools/404-page.ts +387 -0
  537. package/src/dev-tools/browser-logs.ts +288 -0
  538. package/src/dev-tools/error-page.ts +509 -0
  539. package/src/dev-tools/holding-server.ts +187 -0
  540. package/src/dev-tools/index.ts +90 -0
  541. package/src/dev-tools/instrumentation.ts +176 -0
  542. package/src/{plugins/dev-logs.ts → dev-tools/logs.ts} +3 -3
  543. package/src/dev-tools/overlay.ts +456 -0
  544. package/src/dev-tools/stack-classifier.ts +75 -0
  545. package/src/dev-tools/terminal.ts +183 -0
  546. package/src/{server/dev-warnings.ts → dev-tools/warnings.ts} +6 -50
  547. package/src/fonts/bundle.ts +142 -0
  548. package/src/fonts/css.ts +2 -1
  549. package/src/fonts/dev-middleware.ts +74 -0
  550. package/src/fonts/local.ts +7 -3
  551. package/src/fonts/pipeline.ts +314 -0
  552. package/src/fonts/transform.ts +406 -0
  553. package/src/fonts/types.ts +50 -1
  554. package/src/fonts/virtual-modules.ts +227 -0
  555. package/src/index.ts +376 -315
  556. package/src/plugin-context.ts +240 -0
  557. package/src/plugins/adapter-build.ts +12 -4
  558. package/src/plugins/build-manifest.ts +13 -2
  559. package/src/plugins/build-report.ts +32 -21
  560. package/src/plugins/chunks.ts +9 -1
  561. package/src/plugins/client-chunks.ts +65 -0
  562. package/src/plugins/content.ts +1 -1
  563. package/src/plugins/dev-server.ts +154 -21
  564. package/src/plugins/entries.ts +119 -12
  565. package/src/plugins/fonts.ts +177 -524
  566. package/src/plugins/mdx.ts +52 -15
  567. package/src/plugins/routing.ts +225 -41
  568. package/src/plugins/server-action-exports.ts +1 -1
  569. package/src/plugins/server-bundle.ts +36 -1
  570. package/src/plugins/shims.ts +136 -35
  571. package/src/plugins/static-build.ts +17 -11
  572. package/src/routing/codegen-shared.ts +98 -0
  573. package/src/routing/codegen-types.ts +53 -0
  574. package/src/routing/codegen.ts +143 -176
  575. package/src/routing/convention-lint.ts +357 -0
  576. package/src/routing/index.ts +5 -1
  577. package/src/routing/interception.ts +1 -1
  578. package/src/routing/link-codegen.ts +294 -0
  579. package/src/routing/scanner.ts +107 -110
  580. package/src/routing/segment-classify.ts +188 -0
  581. package/src/routing/status-file-lint.ts +10 -7
  582. package/src/routing/types.ts +78 -25
  583. package/src/routing/walkers.ts +90 -0
  584. package/src/rsc-runtime/rsc.ts +2 -0
  585. package/src/rsc-runtime/ssr.ts +50 -0
  586. package/src/rsc-runtime/vendor-types.d.ts +7 -0
  587. package/src/{search-params/codecs.ts → schema-bridge.ts} +57 -20
  588. package/src/search-params/define.ts +538 -0
  589. package/src/search-params/index.ts +14 -20
  590. package/src/search-params/registry.ts +2 -2
  591. package/src/search-params/wrappers.ts +92 -0
  592. package/src/segment-params/define.ts +332 -0
  593. package/src/segment-params/index.ts +9 -0
  594. package/src/server/access-gate.tsx +79 -36
  595. package/src/server/action-client.ts +103 -20
  596. package/src/server/action-encryption.ts +144 -0
  597. package/src/server/action-handler.ts +112 -14
  598. package/src/server/actions.ts +10 -9
  599. package/src/server/als-registry.ts +35 -7
  600. package/src/server/asset-headers.ts +8 -34
  601. package/src/server/build-manifest.ts +10 -4
  602. package/src/server/compress.ts +25 -7
  603. package/src/server/cookie-context.ts +468 -0
  604. package/src/server/cookie-parsing.ts +135 -0
  605. package/src/server/debug.ts +137 -0
  606. package/src/server/default-logger.ts +99 -0
  607. package/src/server/deny-boundary.ts +218 -0
  608. package/src/server/deny-renderer.ts +33 -51
  609. package/src/server/dev-source-map.ts +31 -0
  610. package/src/server/early-hints-sender.ts +3 -2
  611. package/src/server/early-hints.ts +36 -15
  612. package/src/server/error-boundary-wrapper.ts +74 -22
  613. package/src/server/fallback-error.ts +74 -102
  614. package/src/server/flight-injection-state.ts +113 -0
  615. package/src/server/flight-scripts.ts +62 -0
  616. package/src/server/flush.ts +2 -1
  617. package/src/server/form-data.ts +76 -0
  618. package/src/server/html-injector-core.ts +403 -0
  619. package/src/server/html-injectors.ts +244 -223
  620. package/src/server/index.ts +31 -184
  621. package/src/server/internal.ts +176 -0
  622. package/src/server/logger.ts +67 -35
  623. package/src/server/middleware-runner.ts +75 -4
  624. package/src/server/node-stream-transforms.ts +369 -0
  625. package/src/server/param-coercion.ts +76 -0
  626. package/src/server/pipeline-helpers.ts +204 -0
  627. package/src/server/pipeline-interception.ts +17 -16
  628. package/src/server/pipeline-metadata.ts +13 -0
  629. package/src/server/pipeline-outcome.ts +167 -0
  630. package/src/server/pipeline-phases.ts +409 -0
  631. package/src/server/pipeline.ts +128 -387
  632. package/src/server/port-resolution.ts +215 -0
  633. package/src/server/primitives.ts +113 -29
  634. package/src/server/render-timeout.ts +108 -0
  635. package/src/server/request-context.ts +94 -337
  636. package/src/server/route-element-builder.ts +289 -198
  637. package/src/server/route-handler.ts +24 -4
  638. package/src/server/route-matcher.ts +44 -65
  639. package/src/server/rsc-entry/action-middleware-runner.ts +167 -0
  640. package/src/server/rsc-entry/api-handler.ts +16 -17
  641. package/src/server/rsc-entry/error-renderer.ts +305 -89
  642. package/src/server/rsc-entry/helpers.ts +136 -12
  643. package/src/server/rsc-entry/index.ts +330 -312
  644. package/src/server/rsc-entry/render-route.ts +304 -0
  645. package/src/server/rsc-entry/rsc-payload.ts +100 -18
  646. package/src/server/rsc-entry/rsc-stream.ts +90 -17
  647. package/src/server/rsc-entry/ssr-bridge.ts +14 -5
  648. package/src/server/rsc-entry/ssr-renderer.ts +177 -37
  649. package/src/server/rsc-entry/wrap-action-dispatch.ts +449 -0
  650. package/src/server/rsc-prop-warnings.ts +3 -1
  651. package/src/server/safe-load.ts +60 -0
  652. package/src/server/sensitive-fields.ts +230 -0
  653. package/src/server/sitemap-generator.ts +338 -0
  654. package/src/server/sitemap-handler.ts +126 -0
  655. package/src/server/slot-resolver.ts +245 -230
  656. package/src/server/ssr-entry.ts +215 -32
  657. package/src/server/ssr-render.ts +289 -67
  658. package/src/server/ssr-wrappers.tsx +139 -0
  659. package/src/server/state-tree-diff.ts +4 -1
  660. package/src/server/status-code-resolver.ts +112 -128
  661. package/src/server/stream-utils.ts +213 -0
  662. package/src/server/tracing.ts +44 -10
  663. package/src/server/tree-builder.ts +202 -90
  664. package/src/server/types.ts +55 -6
  665. package/src/server/utils/escape-html.ts +20 -0
  666. package/src/server/version-skew.ts +104 -0
  667. package/src/server/waituntil-bridge.ts +4 -1
  668. package/src/shared/merge-search-params.ts +55 -0
  669. package/src/shims/font-google.ts +1 -1
  670. package/src/shims/font-local.ts +34 -0
  671. package/src/shims/headers.ts +5 -1
  672. package/src/shims/navigation-client.ts +4 -3
  673. package/src/shims/navigation.ts +14 -7
  674. package/src/utils/directive-parser.ts +1 -390
  675. package/src/utils/state-machine.ts +111 -0
  676. package/dist/_chunks/als-registry-k-AtAQ9R.js +0 -41
  677. package/dist/_chunks/als-registry-k-AtAQ9R.js.map +0 -1
  678. package/dist/_chunks/format-DNt20Kt8.js.map +0 -1
  679. package/dist/_chunks/interception-DGDIjDbR.js +0 -676
  680. package/dist/_chunks/interception-DGDIjDbR.js.map +0 -1
  681. package/dist/_chunks/request-context-CRj2Zh1E.js +0 -329
  682. package/dist/_chunks/request-context-CRj2Zh1E.js.map +0 -1
  683. package/dist/_chunks/ssr-data-DLnbYpj1.js.map +0 -1
  684. package/dist/_chunks/tracing-DF0G3FB7.js +0 -173
  685. package/dist/_chunks/tracing-DF0G3FB7.js.map +0 -1
  686. package/dist/_chunks/use-cookie-dDbpCTx-.js +0 -91
  687. package/dist/_chunks/use-cookie-dDbpCTx-.js.map +0 -1
  688. package/dist/_chunks/use-query-states-DAhgj8Gx.js.map +0 -1
  689. package/dist/cache/register-cached-function.d.ts +0 -17
  690. package/dist/cache/register-cached-function.d.ts.map +0 -1
  691. package/dist/client/browser-entry.d.ts +0 -22
  692. package/dist/client/browser-entry.d.ts.map +0 -1
  693. package/dist/client/browser-links.d.ts +0 -32
  694. package/dist/client/browser-links.d.ts.map +0 -1
  695. package/dist/client/link-navigate-interceptor.d.ts +0 -28
  696. package/dist/client/link-navigate-interceptor.d.ts.map +0 -1
  697. package/dist/client/link-status-provider.d.ts +0 -11
  698. package/dist/client/link-status-provider.d.ts.map +0 -1
  699. package/dist/client/transition-root.d.ts.map +0 -1
  700. package/dist/client/use-navigation-pending.d.ts.map +0 -1
  701. package/dist/client/use-params.d.ts.map +0 -1
  702. package/dist/plugins/cache-transform.d.ts +0 -36
  703. package/dist/plugins/cache-transform.d.ts.map +0 -1
  704. package/dist/plugins/dev-error-overlay.d.ts +0 -60
  705. package/dist/plugins/dev-error-overlay.d.ts.map +0 -1
  706. package/dist/plugins/dev-logs.d.ts.map +0 -1
  707. package/dist/plugins/dynamic-transform.d.ts +0 -72
  708. package/dist/plugins/dynamic-transform.d.ts.map +0 -1
  709. package/dist/search-params/analyze.d.ts +0 -54
  710. package/dist/search-params/analyze.d.ts.map +0 -1
  711. package/dist/search-params/builtin-codecs.d.ts +0 -105
  712. package/dist/search-params/builtin-codecs.d.ts.map +0 -1
  713. package/dist/search-params/codecs.d.ts +0 -53
  714. package/dist/search-params/codecs.d.ts.map +0 -1
  715. package/dist/search-params/create.d.ts +0 -106
  716. package/dist/search-params/create.d.ts.map +0 -1
  717. package/dist/server/dev-fetch-instrumentation.d.ts +0 -22
  718. package/dist/server/dev-fetch-instrumentation.d.ts.map +0 -1
  719. package/dist/server/dev-logger.d.ts.map +0 -1
  720. package/dist/server/dev-span-processor.d.ts.map +0 -1
  721. package/dist/server/dev-warnings.d.ts.map +0 -1
  722. package/dist/server/manifest-status-resolver.d.ts +0 -58
  723. package/dist/server/manifest-status-resolver.d.ts.map +0 -1
  724. package/dist/server/prerender.d.ts +0 -77
  725. package/dist/server/prerender.d.ts.map +0 -1
  726. package/src/cache/register-cached-function.ts +0 -99
  727. package/src/client/browser-entry.ts +0 -686
  728. package/src/client/browser-links.ts +0 -90
  729. package/src/client/link-navigate-interceptor.tsx +0 -62
  730. package/src/client/link-status-provider.tsx +0 -30
  731. package/src/client/transition-root.tsx +0 -160
  732. package/src/plugins/cache-transform.ts +0 -199
  733. package/src/plugins/dev-error-overlay.ts +0 -230
  734. package/src/plugins/dynamic-transform.ts +0 -161
  735. package/src/search-params/analyze.ts +0 -192
  736. package/src/search-params/builtin-codecs.ts +0 -228
  737. package/src/search-params/create.ts +0 -321
  738. package/src/server/dev-fetch-instrumentation.ts +0 -96
  739. package/src/server/dev-span-processor.ts +0 -78
  740. package/src/server/manifest-status-resolver.ts +0 -215
  741. package/src/server/prerender.ts +0 -139
  742. /package/src/{server/dev-logger.ts → dev-tools/logger.ts} +0 -0
@@ -4,24 +4,21 @@
4
4
  * Pipeline stages (in order):
5
5
  * proxy.ts → canonicalize → route match → 103 Early Hints → middleware.ts → render
6
6
  *
7
- * Each stage is a pure function or returns a Response to short-circuit.
8
- * Each request gets a trace ID, structured logging, and OTEL spans.
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 { canonicalize } from './canonicalize.js';
15
- import { runProxy, type ProxyExport } from './proxy.js';
16
- import { runMiddleware, type MiddlewareFn } from './middleware-runner.js';
17
- import { runWithTimingCollector, withTiming, getServerTimingHeader } from './server-timing.js';
18
- import {
19
- runWithRequestContext,
20
- applyRequestHeaderOverlay,
21
- setMutableCookieContext,
22
- getSetCookieHeaders,
23
- markResponseFlushed,
24
- } from './request-context.js';
18
+ import type { ProxyExport } from './proxy.js';
19
+ import type { MiddlewareFn } from './middleware-runner.js';
20
+ import { runWithTimingCollector, getServerTimingHeader } from './server-timing.js';
21
+ import { runWithRequestContext } from './request-context.js';
25
22
  import {
26
23
  generateTraceId,
27
24
  runWithTraceId,
@@ -29,34 +26,32 @@ import {
29
26
  replaceTraceId,
30
27
  withSpan,
31
28
  setSpanAttribute,
32
- traceId,
33
29
  } from './tracing.js';
34
- import {
35
- logRequestReceived,
36
- logRequestCompleted,
37
- logSlowRequest,
38
- logProxyError,
39
- logMiddlewareError,
40
- logMiddlewareShortCircuit,
41
- logRenderError,
42
- } from './logger.js';
43
- import { callOnRequestError } from './instrumentation.js';
44
- import { RedirectSignal, DenySignal } from './primitives.js';
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';
30
+ import { logRequestReceived, logRequestCompleted, logSlowRequest } from './logger.js';
31
+ import { DenySignal } from './primitives.js';
32
+ import type { ManifestSegmentNode } from './route-matcher.js';
33
+ import { makeProxyResolver } from './pipeline-helpers.js';
34
+ import { handleRequest, runProxyPhase } from './pipeline-phases.js';
35
+ import { outcomeToResponse } from './pipeline-outcome.js';
49
36
 
50
37
  // ─── Route Match Result ────────────────────────────────────────────────────
51
38
 
52
- /** Result of matching a canonical pathname against the route tree. */
39
+ /**
40
+ * Result of matching a canonical pathname against the route tree.
41
+ *
42
+ * `segments` is the runtime (`ManifestFile`-specialized) shape — the same
43
+ * nodes carried in the virtual route manifest. TIM-863 unified this: the
44
+ * matcher produces `ManifestSegmentNode[]` directly and every consumer
45
+ * (render, slots, params coercion, early hints, deny fallback) sees the
46
+ * same structural type with no `as unknown as` laundering.
47
+ */
53
48
  export interface RouteMatch {
54
49
  /** The matched segment chain from root to leaf. */
55
- segments: SegmentNode[];
56
- /** Extracted route params (catch-all segments produce string[]). */
57
- params: Record<string, string | string[]>;
58
- /** The leaf segment's middleware.ts export, if any. */
59
- middleware?: MiddlewareFn;
50
+ segments: ManifestSegmentNode[];
51
+ /** Extracted segment params (catch-all segments produce string[]). */
52
+ segmentParams: Record<string, string | string[]>;
53
+ /** Middleware chain from the segment tree, ordered root-to-leaf. */
54
+ middlewareChain: MiddlewareFn[];
60
55
  }
61
56
 
62
57
  /** Function that matches a canonical pathname to a route. */
@@ -91,11 +86,32 @@ export type EarlyHintsEmitter = (
91
86
 
92
87
  // ─── Pipeline Configuration ────────────────────────────────────────────────
93
88
 
89
+ /**
90
+ * Proxy source — a tagged union so the choice between "already-resolved
91
+ * export" and "lazy HMR-friendly loader" is encoded in the type, not
92
+ * inferred per-request.
93
+ *
94
+ * - `static` — the proxy export is already resolved (production, tests).
95
+ * - `lazy` — a loader is called per-request for HMR freshness (dev).
96
+ *
97
+ * `PipelineConfig.proxy` also accepts a bare `ProxyExport` (a function or
98
+ * function array) as shorthand for the static variant — convenient for tests
99
+ * that construct a `createPipeline` config inline. Omit the field entirely
100
+ * when the app has no `proxy.ts`.
101
+ *
102
+ * See design/07-routing.md §"proxy.ts — Global Middleware".
103
+ */
104
+ export type ProxyConfig =
105
+ | { kind: 'static'; export: ProxyExport }
106
+ | { kind: 'lazy'; loader: () => Promise<{ default: ProxyExport }> };
107
+
94
108
  export interface PipelineConfig {
95
- /** The proxy.ts default export (function or array). Undefined if no proxy.ts. */
96
- proxy?: ProxyExport;
97
- /** Lazy loader for proxy.ts — called per-request so HMR updates take effect. */
98
- proxyLoader?: () => Promise<{ default: ProxyExport }>;
109
+ /**
110
+ * proxy.ts source. Undefined if the app has no proxy.ts. Accepts either a
111
+ * tagged `ProxyConfig` (canonical) or a bare `ProxyExport` as sugar for the
112
+ * static variant.
113
+ */
114
+ proxy?: ProxyConfig | ProxyExport;
99
115
  /** Route matcher — resolves a canonical pathname to a RouteMatch. */
100
116
  matchRoute: RouteMatcher;
101
117
  /** Metadata route matcher — resolves metadata route pathnames (sitemap.xml, robots.txt, etc.) */
@@ -115,14 +131,25 @@ export interface PipelineConfig {
115
131
  * Generated at build time from intercepting route directories.
116
132
  * See design/07-routing.md §"Intercepting Routes"
117
133
  */
118
- interceptionRewrites?: import('#/routing/interception.js').InterceptionRewrite[];
134
+ interceptionRewrites?: import('../routing/interception.js').InterceptionRewrite[];
135
+ /**
136
+ * Control Server-Timing header output.
137
+ *
138
+ * - `'detailed'` — per-phase breakdown (proxy, middleware, render).
139
+ * - `'total'` — single `total;dur=N` entry (production-safe).
140
+ * - `false` — no Server-Timing header at all.
141
+ *
142
+ * Default: `'total'`.
143
+ */
144
+ serverTiming?: 'detailed' | 'total' | false;
119
145
  /**
120
- * Emit Server-Timing header on responses for Chrome DevTools visibility.
121
- * Only enable in dev mode — exposes internal timing data.
146
+ * Auto-generated sitemap handler. When provided, the pipeline intercepts
147
+ * `/sitemap.xml` and `/sitemap/N.xml` requests and delegates to this
148
+ * function. Returns a Response or null (pass-through to regular routing).
122
149
  *
123
- * Default: false (production-safe).
150
+ * See design/16-metadata.md §"Auto-generated Sitemap"
124
151
  */
125
- enableServerTiming?: boolean;
152
+ autoSitemapHandler?: (pathname: string) => Promise<Response | null>;
126
153
  /**
127
154
  * Dev pipeline error callback — called when a pipeline phase (proxy,
128
155
  * middleware, render) catches an unhandled error. Used to wire the error
@@ -131,6 +158,7 @@ export interface PipelineConfig {
131
158
  * Undefined in production — zero overhead.
132
159
  */
133
160
  onPipelineError?: (error: Error, phase: string) => void;
161
+
134
162
  /**
135
163
  * Fallback error renderer — called when a catastrophic error escapes the
136
164
  * render phase. Produces an HTML Response instead of a bare empty 500.
@@ -147,6 +175,28 @@ export interface PipelineConfig {
147
175
  req: Request,
148
176
  responseHeaders: Headers
149
177
  ) => Response | Promise<Response>;
178
+ /**
179
+ * Fallback deny page renderer — called when a DenySignal escapes from
180
+ * middleware or the render phase. Renders the appropriate status-code
181
+ * page (403.tsx, 404.tsx, etc.) instead of returning a bare empty response.
182
+ *
183
+ * If this function throws, the pipeline falls back to a bare
184
+ * `new Response(null, { status: denyStatus })`.
185
+ */
186
+ renderDenyFallback?: (
187
+ deny: DenySignal,
188
+ req: Request,
189
+ responseHeaders: Headers,
190
+ /**
191
+ * The matched route, if available. Provided by both the middleware-stage
192
+ * and render-stage catch blocks (matching runs before middleware). When
193
+ * present, the renderer should resolve the deny status file against the
194
+ * matched chain so colocated `403.tsx`/`4xx.tsx`/`401.json` files are
195
+ * picked up. Falls back to the root-only chain when omitted (e.g. for
196
+ * deny()s thrown before route matching could complete). See TIM-822.
197
+ */
198
+ match?: RouteMatch
199
+ ) => Response | Promise<Response>;
150
200
  }
151
201
 
152
202
  // ─── Pipeline ──────────────────────────────────────────────────────────────
@@ -154,20 +204,21 @@ export interface PipelineConfig {
154
204
  /**
155
205
  * Create the request handler from a pipeline configuration.
156
206
  *
157
- * Returns a function that processes an incoming Request through all pipeline stages
158
- * and produces a Response. This is the top-level entry point for the server.
207
+ * Returns a function that processes an incoming Request through all pipeline
208
+ * stages and produces a Response. This is the top-level entry point for the
209
+ * server. The body is intentionally small — phase logic lives in
210
+ * `pipeline-phases.ts`. This function only owns the per-request setup that
211
+ * has to wrap the entire dispatch: trace ID, request context ALS, span
212
+ * scope, Server-Timing header emission, and the active-request counter.
159
213
  */
160
214
  export function createPipeline(config: PipelineConfig): (req: Request) => Promise<Response> {
161
- const {
162
- proxy,
163
- matchRoute,
164
- render,
165
- earlyHints,
166
- stripTrailingSlash = true,
167
- slowRequestMs = 3000,
168
- enableServerTiming = false,
169
- onPipelineError,
170
- } = config;
215
+ // Resolve the proxy source once. The request hot path calls this closure
216
+ // directly with no discriminant check — the branch is taken here during
217
+ // setup. For the lazy variant, `loader()` still runs per-request so HMR
218
+ // continues to re-import the user's proxy.ts.
219
+ const proxyResolver = makeProxyResolver(config.proxy);
220
+ const slowRequestMs = config.slowRequestMs ?? 3000;
221
+ const serverTiming = config.serverTiming ?? 'total';
171
222
 
172
223
  // Concurrent request counter — tracks how many requests are in-flight.
173
224
  // Logged with each request for diagnosing resource contention.
@@ -186,7 +237,7 @@ export function createPipeline(config: PipelineConfig): (req: Request) => Promis
186
237
  const traceIdValue = generateTraceId();
187
238
 
188
239
  return runWithTraceId(traceIdValue, async () => {
189
- // Establish request context ALS scope so headers() and cookies() work
240
+ // Establish request context ALS scope so getHeaders() and getCookies() work
190
241
  // throughout the entire request lifecycle (proxy, middleware, render).
191
242
  return runWithRequestContext(req, async () => {
192
243
  // In dev mode, wrap with timing collector for Server-Timing header.
@@ -206,35 +257,36 @@ export function createPipeline(config: PipelineConfig): (req: Request) => Promis
206
257
  }
207
258
 
208
259
  let result: Response;
209
- if (proxy || config.proxyLoader) {
210
- result = await runProxyPhase(req, method, path);
260
+ if (proxyResolver) {
261
+ const outcome = await runProxyPhase(config, proxyResolver, req, method, path);
262
+ result = await outcomeToResponse(config, outcome, { req, method, path });
211
263
  } else {
212
- result = await handleRequest(req, method, path);
264
+ result = await handleRequest(config, req, method, path);
213
265
  }
214
266
 
215
267
  // Set response status on the root span before it ends —
216
268
  // DevSpanProcessor reads this for tree/summary output.
217
269
  await setSpanAttribute('http.response.status_code', result.status);
218
270
 
219
- // Append Server-Timing header.
220
- // In dev mode: detailed per-phase breakdown (proxy, middleware, render).
221
- // In production: single total duration — safe to expose, no phase names.
222
- // Response.redirect() creates immutable headers, so we must
223
- // ensure mutability before writing Server-Timing.
224
- if (enableServerTiming) {
225
- const serverTiming = getServerTimingHeader();
226
- if (serverTiming) {
227
- result = ensureMutableResponse(result);
228
- result.headers.set('Server-Timing', serverTiming);
271
+ // Append Server-Timing header based on configured mode.
272
+ // Header mutability is guaranteed by the producer-side clone
273
+ // in `outcomeToResponse` and the metadata-route / auto-sitemap
274
+ // user-handler clones in `handleRequest`, so we can write
275
+ // directly without a runtime probe. See TIM-866.
276
+ if (serverTiming === 'detailed') {
277
+ // Detailed: per-phase breakdown (proxy, middleware, render).
278
+ const timingHeader = getServerTimingHeader();
279
+ if (timingHeader) {
280
+ result.headers.set('Server-Timing', timingHeader);
229
281
  }
230
- } else {
231
- // Production: emit total request duration only.
232
- // No phase breakdown — prevents information disclosure
233
- // while giving browser DevTools useful timing data.
282
+ } else if (serverTiming === 'total') {
283
+ // Total only: single `total;dur=N` — no phase names.
284
+ // Prevents information disclosure while giving browser
285
+ // DevTools useful timing data.
234
286
  const totalMs = Math.round(performance.now() - startTime);
235
- result = ensureMutableResponse(result);
236
287
  result.headers.set('Server-Timing', `total;dur=${totalMs}`);
237
288
  }
289
+ // serverTiming === false: no header at all
238
290
 
239
291
  return result;
240
292
  }
@@ -254,319 +306,8 @@ export function createPipeline(config: PipelineConfig): (req: Request) => Promis
254
306
  return response;
255
307
  };
256
308
 
257
- return enableServerTiming ? runWithTimingCollector(runRequest) : runRequest();
309
+ return serverTiming === 'detailed' ? runWithTimingCollector(runRequest) : runRequest();
258
310
  });
259
311
  });
260
312
  };
261
-
262
- async function runProxyPhase(req: Request, method: string, path: string): Promise<Response> {
263
- try {
264
- // Resolve the proxy export. When a proxyLoader is provided (lazy import),
265
- // it is called per-request so HMR updates in dev take effect immediately.
266
- let proxyExport: ProxyExport;
267
- if (config.proxyLoader) {
268
- const mod = await config.proxyLoader();
269
- proxyExport = mod.default;
270
- } else {
271
- proxyExport = config.proxy!;
272
- }
273
- const proxyFn = () => runProxy(proxyExport, req, () => handleRequest(req, method, path));
274
- return await withSpan('timber.proxy', {}, () =>
275
- enableServerTiming ? withTiming('proxy', 'proxy.ts', proxyFn) : proxyFn()
276
- );
277
- } catch (error) {
278
- // Uncaught proxy.ts error → bare HTTP 500
279
- logProxyError({ error });
280
- await fireOnRequestError(error, req, 'proxy');
281
- if (onPipelineError && error instanceof Error) onPipelineError(error, 'proxy');
282
- return new Response(null, { status: 500 });
283
- }
284
- }
285
-
286
- async function handleRequest(req: Request, method: string, path: string): Promise<Response> {
287
- // Stage 1: URL canonicalization
288
- const url = new URL(req.url);
289
- const result = canonicalize(url.pathname, stripTrailingSlash);
290
- if (!result.ok) {
291
- return new Response(null, { status: result.status });
292
- }
293
- const canonicalPathname = result.pathname;
294
-
295
- // Stage 1b: Metadata route matching — runs before regular route matching.
296
- // Metadata routes skip middleware.ts and access.ts (public endpoints for crawlers).
297
- // See design/16-metadata.md §"Pipeline Integration"
298
- if (config.matchMetadataRoute) {
299
- const metaMatch = config.matchMetadataRoute(canonicalPathname);
300
- if (metaMatch) {
301
- try {
302
- // Static metadata files (.xml, .txt, .png, .ico, etc.) are served
303
- // directly from disk. Dynamic metadata routes (.ts, .tsx) export a
304
- // handler function that generates the response.
305
- if (metaMatch.isStatic) {
306
- return await serveStaticMetadataFile(metaMatch);
307
- }
308
-
309
- const mod = (await metaMatch.file.load()) as { default?: Function };
310
- if (typeof mod.default !== 'function') {
311
- return new Response('Metadata route must export a default function', { status: 500 });
312
- }
313
- const handlerResult = await mod.default();
314
- // If the handler returns a Response, use it directly
315
- if (handlerResult instanceof Response) {
316
- return handlerResult;
317
- }
318
- // Otherwise, serialize based on content type
319
- const contentType = metaMatch.contentType;
320
- let body: string;
321
- if (typeof handlerResult === 'string') {
322
- body = handlerResult;
323
- } else if (contentType === 'application/xml') {
324
- body = serializeSitemap(handlerResult);
325
- } else if (contentType === 'application/manifest+json') {
326
- body = JSON.stringify(handlerResult, null, 2);
327
- } else {
328
- body = typeof handlerResult === 'string' ? handlerResult : String(handlerResult);
329
- }
330
- return new Response(body, {
331
- status: 200,
332
- headers: { 'Content-Type': `${contentType}; charset=utf-8` },
333
- });
334
- } catch (error) {
335
- logRenderError({ method, path, error });
336
- if (onPipelineError && error instanceof Error) onPipelineError(error, 'metadata-route');
337
- return new Response(null, { status: 500 });
338
- }
339
- }
340
- }
341
-
342
- // Stage 2: Route matching
343
- let match = matchRoute(canonicalPathname);
344
- let interception: InterceptionContext | undefined;
345
-
346
- // Stage 2a: Intercepting route resolution (modal pattern).
347
- // On soft navigation, check if an intercepting route should render instead.
348
- // The client sends X-Timber-URL with the current pathname (where they're
349
- // navigating FROM). If a rewrite matches, re-route to the source URL so
350
- // the source layout renders with the intercepted content in the slot.
351
- const sourceUrl = req.headers.get('X-Timber-URL');
352
- if (sourceUrl && config.interceptionRewrites?.length) {
353
- const intercepted = findInterceptionMatch(
354
- canonicalPathname,
355
- sourceUrl,
356
- config.interceptionRewrites
357
- );
358
- if (intercepted) {
359
- const sourceMatch = matchRoute(intercepted.sourcePathname);
360
- if (sourceMatch) {
361
- match = sourceMatch;
362
- interception = { targetPathname: canonicalPathname };
363
- }
364
- }
365
- }
366
-
367
- if (!match) {
368
- // No route matched — render 404.tsx in root layout if available,
369
- // otherwise fall back to a bare 404 Response.
370
- if (config.renderNoMatch) {
371
- const responseHeaders = new Headers();
372
- return config.renderNoMatch(req, responseHeaders);
373
- }
374
- return new Response(null, { status: 404 });
375
- }
376
-
377
- // Response and request header containers — created before early hints so
378
- // the emitter can append Link headers (e.g. for Cloudflare CDN → 103).
379
- const responseHeaders = new Headers();
380
- const requestHeaderOverlay = new Headers();
381
-
382
- // Set Cache-Control for dynamic HTML responses. Without this header,
383
- // CDNs (particularly Cloudflare) may attempt to buffer/process the
384
- // response differently, causing intermittent multi-second delays.
385
- // This matches Next.js's default behavior.
386
- responseHeaders.set('Cache-Control', 'private, no-cache, no-store, max-age=0, must-revalidate');
387
-
388
- // Stage 2b: 103 Early Hints (before middleware, after match)
389
- // Fires before middleware so the browser can begin fetching critical
390
- // assets while middleware runs. Non-fatal — a failing emitter never
391
- // blocks the request.
392
- if (earlyHints) {
393
- try {
394
- await earlyHints(match, req, responseHeaders);
395
- } catch {
396
- // Early hints failure is non-fatal
397
- }
398
- }
399
-
400
- // Stage 3: Leaf middleware.ts (only the leaf route's middleware runs)
401
- if (match.middleware) {
402
- const ctx: MiddlewareContext = {
403
- req,
404
- requestHeaders: requestHeaderOverlay,
405
- headers: responseHeaders,
406
- params: match.params,
407
- searchParams: new URL(req.url).searchParams,
408
- earlyHints: (hints) => {
409
- for (const hint of hints) {
410
- let value = `<${hint.href}>; rel=${hint.rel}`;
411
- if (hint.as !== undefined) value += `; as=${hint.as}`;
412
- if (hint.crossOrigin !== undefined) value += `; crossorigin=${hint.crossOrigin}`;
413
- if (hint.fetchPriority !== undefined) value += `; fetchpriority=${hint.fetchPriority}`;
414
- responseHeaders.append('Link', value);
415
- }
416
- },
417
- };
418
-
419
- try {
420
- // Enable cookie mutation during middleware (design/29-cookies.md §"Context Tracking")
421
- setMutableCookieContext(true);
422
- const middlewareFn = () => runMiddleware(match.middleware!, ctx);
423
- const middlewareResponse = await withSpan('timber.middleware', {}, () =>
424
- enableServerTiming ? withTiming('mw', 'middleware.ts', middlewareFn) : middlewareFn()
425
- );
426
- setMutableCookieContext(false);
427
- if (middlewareResponse) {
428
- // Apply cookie jar to short-circuit response.
429
- // Response.redirect() creates immutable headers, so ensure
430
- // mutability before appending Set-Cookie entries.
431
- const finalResponse = ensureMutableResponse(middlewareResponse);
432
- applyCookieJar(finalResponse.headers);
433
- logMiddlewareShortCircuit({ method, path, status: finalResponse.status });
434
- return finalResponse;
435
- }
436
- // Middleware succeeded without short-circuiting — apply any
437
- // injected request headers so headers() returns them downstream.
438
- applyRequestHeaderOverlay(requestHeaderOverlay);
439
- } catch (error) {
440
- setMutableCookieContext(false);
441
- // RedirectSignal from middleware → HTTP redirect (not an error).
442
- // For RSC payload requests (client navigation), return 204 + X-Timber-Redirect
443
- // so the client router can perform a soft SPA redirect. A raw 302 would be
444
- // turned into an opaque redirect by fetch({redirect:'manual'}), crashing
445
- // createFromFetch. See design/19-client-navigation.md.
446
- if (error instanceof RedirectSignal) {
447
- applyCookieJar(responseHeaders);
448
- const isRsc = (req.headers.get('Accept') ?? '').includes('text/x-component');
449
- if (isRsc) {
450
- responseHeaders.set('X-Timber-Redirect', error.location);
451
- return new Response(null, { status: 204, headers: responseHeaders });
452
- }
453
- responseHeaders.set('Location', error.location);
454
- return new Response(null, { status: error.status, headers: responseHeaders });
455
- }
456
- // DenySignal from middleware → HTTP deny status
457
- if (error instanceof DenySignal) {
458
- return new Response(null, { status: error.status });
459
- }
460
- // Middleware throw → HTTP 500 (middleware runs before rendering,
461
- // no error boundary to catch it)
462
- logMiddlewareError({ method, path, error });
463
- await fireOnRequestError(error, req, 'handler');
464
- if (onPipelineError && error instanceof Error) onPipelineError(error, 'middleware');
465
- return new Response(null, { status: 500 });
466
- }
467
- }
468
-
469
- // Apply cookie jar to response headers before render commits them.
470
- // Middleware may have set cookies; they need to be on responseHeaders
471
- // before flushResponse creates the Response object.
472
- applyCookieJar(responseHeaders);
473
-
474
- // Stage 4: Render (access gates + element tree + renderToReadableStream)
475
- try {
476
- const renderFn = () =>
477
- render(req, match, responseHeaders, requestHeaderOverlay, interception);
478
- const response = await withSpan('timber.render', { 'http.route': canonicalPathname }, () =>
479
- enableServerTiming ? withTiming('render', 'RSC + SSR render', renderFn) : renderFn()
480
- );
481
- markResponseFlushed();
482
- return response;
483
- } catch (error) {
484
- // DenySignal leaked from render (e.g. notFound() in metadata()).
485
- // Return the deny status code instead of 500.
486
- if (error instanceof DenySignal) {
487
- return new Response(null, { status: error.status });
488
- }
489
- // RedirectSignal leaked from render — honour the redirect.
490
- if (error instanceof RedirectSignal) {
491
- responseHeaders.set('Location', error.location);
492
- return new Response(null, { status: error.status, headers: responseHeaders });
493
- }
494
- logRenderError({ method, path, error });
495
- await fireOnRequestError(error, req, 'render');
496
- if (onPipelineError && error instanceof Error) onPipelineError(error, 'render');
497
- // Try fallback error page before bare 500
498
- if (config.renderFallbackError) {
499
- try {
500
- return await config.renderFallbackError(error, req, responseHeaders);
501
- } catch {
502
- // Fallback rendering itself failed — fall through to bare 500
503
- }
504
- }
505
- return new Response(null, { status: 500 });
506
- }
507
- }
508
- }
509
-
510
- /**
511
- * Fire the user's onRequestError hook with request context.
512
- * Extracts request info from the Request object and calls the instrumentation hook.
513
- */
514
- async function fireOnRequestError(
515
- error: unknown,
516
- req: Request,
517
- phase: 'proxy' | 'handler' | 'render' | 'action' | 'route'
518
- ): Promise<void> {
519
- const url = new URL(req.url);
520
- const headersObj: Record<string, string> = {};
521
- req.headers.forEach((v, k) => {
522
- headersObj[k] = v;
523
- });
524
-
525
- await callOnRequestError(
526
- error,
527
- { method: req.method, path: url.pathname, headers: headersObj },
528
- { phase, routePath: url.pathname, routeType: 'page', traceId: traceId() }
529
- );
530
- }
531
-
532
- // ─── Cookie Helpers ──────────────────────────────────────────────────────
533
-
534
- /**
535
- * Apply all Set-Cookie headers from the cookie jar to a Headers object.
536
- * Each cookie gets its own Set-Cookie header per RFC 6265 §4.1.
537
- */
538
- function applyCookieJar(headers: Headers): void {
539
- for (const value of getSetCookieHeaders()) {
540
- headers.append('Set-Cookie', value);
541
- }
542
- }
543
-
544
- // ─── Immutable Response Helpers ──────────────────────────────────────────
545
-
546
- /**
547
- * Ensure a Response has mutable headers so the pipeline can safely append
548
- * Set-Cookie and Server-Timing entries.
549
- *
550
- * `Response.redirect()` and some platform-level responses return objects
551
- * with immutable headers. Calling `.set()` or `.append()` on them throws
552
- * `TypeError: immutable`. This helper detects the immutable case by
553
- * attempting a no-op write and, on failure, clones into a fresh Response
554
- * with mutable headers.
555
- */
556
- function ensureMutableResponse(response: Response): Response {
557
- try {
558
- // Probe mutability with a benign operation that we immediately undo.
559
- // We pick a header name that is extremely unlikely to collide with
560
- // anything meaningful and delete it right away.
561
- response.headers.set('X-Timber-Probe', '1');
562
- response.headers.delete('X-Timber-Probe');
563
- return response;
564
- } catch {
565
- // Headers are immutable — rebuild with mutable headers.
566
- return new Response(response.body, {
567
- status: response.status,
568
- statusText: response.statusText,
569
- headers: new Headers(response.headers),
570
- });
571
- }
572
313
  }