@timber-js/app 0.2.0-alpha.208 → 0.2.0-alpha.209

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 (520) hide show
  1. package/dist/_chunks/{primitives-DLAnvsrk.js → actions-BerlqoXA.js} +640 -410
  2. package/dist/_chunks/actions-BerlqoXA.js.map +1 -0
  3. package/dist/_chunks/{als-registry-C6kcfprT.js → als-registry-DaxkVjt5.js} +6 -2
  4. package/dist/_chunks/als-registry-DaxkVjt5.js.map +1 -0
  5. package/dist/_chunks/{build-manifest-DTmSGLRz.js → build-manifest-DWppEdLB.js} +2 -51
  6. package/dist/_chunks/build-manifest-DWppEdLB.js.map +1 -0
  7. package/dist/_chunks/{build-output-helper-9dqCv1pZ.js → build-output-helper-RV_BRcF1.js} +50 -53
  8. package/dist/_chunks/build-output-helper-RV_BRcF1.js.map +1 -0
  9. package/dist/_chunks/{cache-api-CUD9Ezaq.js → cache-api-CR23J_NC.js} +64 -32
  10. package/dist/_chunks/cache-api-CR23J_NC.js.map +1 -0
  11. package/dist/_chunks/{chains-B4bgOl2g.js → chains-CpFg56UB.js} +2 -2
  12. package/dist/_chunks/{chains-B4bgOl2g.js.map → chains-CpFg56UB.js.map} +1 -1
  13. package/dist/_chunks/{cli-check-G8o30ldg.js → cli-check-C6Ev6wBO.js} +11 -52
  14. package/dist/_chunks/cli-check-C6Ev6wBO.js.map +1 -0
  15. package/dist/_chunks/cli-context-By7k2xVo.js +70 -0
  16. package/dist/_chunks/cli-context-By7k2xVo.js.map +1 -0
  17. package/dist/_chunks/{cli-schema-sync--LZKs8Zn.js → cli-schema-sync-CbT2AUUI.js} +3 -3
  18. package/dist/_chunks/{cli-schema-sync--LZKs8Zn.js.map → cli-schema-sync-CbT2AUUI.js.map} +1 -1
  19. package/dist/_chunks/{cloudflare-BFb__LYG.js → cloudflare-Byxl8FWP.js} +96 -53
  20. package/dist/_chunks/{cloudflare-BFb__LYG.js.map → cloudflare-Byxl8FWP.js.map} +1 -1
  21. package/dist/_chunks/{convention-lint-5KzoMg_A.js → convention-lint-jKTwKwPe.js} +21 -6
  22. package/dist/_chunks/convention-lint-jKTwKwPe.js.map +1 -0
  23. package/dist/_chunks/{dev-server-BzBxgYAV.js → dev-server-C4WZdB7L.js} +15 -167
  24. package/dist/_chunks/dev-server-C4WZdB7L.js.map +1 -0
  25. package/dist/_chunks/{error-boundary-BrHmG-2X.js → error-boundary-tA7kVfs4.js} +84 -104
  26. package/dist/_chunks/error-boundary-tA7kVfs4.js.map +1 -0
  27. package/dist/_chunks/{fs-identity-D7vb6GdI.js → fs-identity-BRKuL215.js} +3 -4
  28. package/dist/_chunks/fs-identity-BRKuL215.js.map +1 -0
  29. package/dist/_chunks/{graph-cache-CP4GEmf9.js → graph-cache-CYiUS2aS.js} +4 -5
  30. package/dist/_chunks/graph-cache-CYiUS2aS.js.map +1 -0
  31. package/dist/_chunks/{json-lossy-check-ClNvBM_3.js → json-lossy-check-ip0Qi0MT.js} +6 -3
  32. package/dist/_chunks/json-lossy-check-ip0Qi0MT.js.map +1 -0
  33. package/dist/_chunks/{live-graph-Bm5WTvcr.js → live-graph-Dv-JJCZw.js} +3 -3
  34. package/dist/_chunks/{live-graph-Bm5WTvcr.js.map → live-graph-Dv-JJCZw.js.map} +1 -1
  35. package/dist/_chunks/{logger-k2DQ4EUf.js → logger-DiDt5ppH.js} +192 -51
  36. package/dist/_chunks/logger-DiDt5ppH.js.map +1 -0
  37. package/dist/_chunks/{navigation-root-mHSK9psY.js → navigation-root-BQfo1-kG.js} +2 -2
  38. package/dist/_chunks/{navigation-root-mHSK9psY.js.map → navigation-root-BQfo1-kG.js.map} +1 -1
  39. package/dist/_chunks/{plugin-context-8idfR3UZ.js → plugin-context-BPBPc3lL.js} +28 -4
  40. package/dist/_chunks/plugin-context-BPBPc3lL.js.map +1 -0
  41. package/dist/_chunks/{poison-scan-DG5eI2_z.js → poison-scan-CpeT6_OJ.js} +2 -2
  42. package/dist/_chunks/{poison-scan-DG5eI2_z.js.map → poison-scan-CpeT6_OJ.js.map} +1 -1
  43. package/dist/_chunks/render-timeout-DOf_BBcO.js +46 -0
  44. package/dist/_chunks/render-timeout-DOf_BBcO.js.map +1 -0
  45. package/dist/_chunks/{rsc-payload-path-B_LBodc2.js → rsc-payload-path-dffcs4jp.js} +9 -3
  46. package/dist/_chunks/{rsc-payload-path-B_LBodc2.js.map → rsc-payload-path-dffcs4jp.js.map} +1 -1
  47. package/dist/_chunks/{scanner-BQ5sPIJ7.js → scanner-Bw0oq1HB.js} +2 -2
  48. package/dist/_chunks/{scanner-BQ5sPIJ7.js.map → scanner-Bw0oq1HB.js.map} +1 -1
  49. package/dist/_chunks/{navigation-context-D0TU0Jog.js → segment-context-xtPUGfdq.js} +36 -34
  50. package/dist/_chunks/segment-context-xtPUGfdq.js.map +1 -0
  51. package/dist/_chunks/{singleflight-2lUWfcAk.js → singleflight-BeVMMKi0.js} +4 -3
  52. package/dist/_chunks/{singleflight-2lUWfcAk.js.map → singleflight-BeVMMKi0.js.map} +1 -1
  53. package/dist/_chunks/{sizeof-lXffQ1Vr.js → sizeof-UwzwB1uM.js} +3 -2
  54. package/dist/_chunks/sizeof-UwzwB1uM.js.map +1 -0
  55. package/dist/_chunks/ssr-data-nA3I70_n.js +49 -0
  56. package/dist/_chunks/ssr-data-nA3I70_n.js.map +1 -0
  57. package/dist/_chunks/{state-FippDgxN.js → state-BhNGPsdi.js} +6 -8
  58. package/dist/_chunks/state-BhNGPsdi.js.map +1 -0
  59. package/dist/_chunks/{status-page-marker-CNbpUOPB.js → status-page-marker-gaihi0KZ.js} +53 -20
  60. package/dist/_chunks/status-page-marker-gaihi0KZ.js.map +1 -0
  61. package/dist/_chunks/{walkers-CN2N_bA-.js → walkers-BXExhzzk.js} +2 -2
  62. package/dist/_chunks/{walkers-CN2N_bA-.js.map → walkers-BXExhzzk.js.map} +1 -1
  63. package/dist/_chunks/write-file-atomic-D1qWqHb4.js +32 -0
  64. package/dist/_chunks/write-file-atomic-D1qWqHb4.js.map +1 -0
  65. package/dist/adapters/build-output-helper.d.ts +7 -7
  66. package/dist/adapters/build-output-helper.d.ts.map +1 -1
  67. package/dist/adapters/canonicalize-module.d.ts +8 -0
  68. package/dist/adapters/canonicalize-module.d.ts.map +1 -0
  69. package/dist/adapters/cloudflare-dev.js +1 -1
  70. package/dist/adapters/cloudflare-kv-cache.js +2 -2
  71. package/dist/adapters/cloudflare.d.ts +30 -8
  72. package/dist/adapters/cloudflare.d.ts.map +1 -1
  73. package/dist/adapters/cloudflare.js +2 -2
  74. package/dist/adapters/compress-module.d.ts +8 -0
  75. package/dist/adapters/compress-module.d.ts.map +1 -1
  76. package/dist/adapters/fs-identity.d.ts +2 -3
  77. package/dist/adapters/fs-identity.d.ts.map +1 -1
  78. package/dist/adapters/nitro-presets.d.ts +0 -6
  79. package/dist/adapters/nitro-presets.d.ts.map +1 -1
  80. package/dist/adapters/nitro-preview.d.ts +43 -11
  81. package/dist/adapters/nitro-preview.d.ts.map +1 -1
  82. package/dist/adapters/nitro.d.ts +1 -13
  83. package/dist/adapters/nitro.d.ts.map +1 -1
  84. package/dist/adapters/nitro.js +291 -176
  85. package/dist/adapters/nitro.js.map +1 -1
  86. package/dist/adapters/shared.d.ts +7 -2
  87. package/dist/adapters/shared.d.ts.map +1 -1
  88. package/dist/adapters/types.d.ts +105 -21
  89. package/dist/adapters/types.d.ts.map +1 -1
  90. package/dist/adapters/types.js +0 -0
  91. package/dist/analyze/crawl-entry.js +3 -3
  92. package/dist/analyze/graph-cache.d.ts.map +1 -1
  93. package/dist/analyze/graph-command.js +4 -4
  94. package/dist/cache/index.js +2 -2
  95. package/dist/cache/json-lossy-check.d.ts.map +1 -1
  96. package/dist/cache/singleflight.d.ts.map +1 -1
  97. package/dist/cache/sizeof.d.ts.map +1 -1
  98. package/dist/cache/stores/memory.js +1 -1
  99. package/dist/cache/tag-aware-handler.d.ts.map +1 -1
  100. package/dist/cdn/workers-cache-purge.js +1 -1
  101. package/dist/cli-check.d.ts +7 -37
  102. package/dist/cli-check.d.ts.map +1 -1
  103. package/dist/cli-context.d.ts +54 -0
  104. package/dist/cli-context.d.ts.map +1 -0
  105. package/dist/cli.d.ts +9 -9
  106. package/dist/cli.d.ts.map +1 -1
  107. package/dist/cli.js +20 -24
  108. package/dist/cli.js.map +1 -1
  109. package/dist/client/browser-dev.d.ts +1 -1
  110. package/dist/client/browser-entry/action-dispatch.d.ts.map +1 -1
  111. package/dist/client/browser-entry/hydrate.d.ts +19 -29
  112. package/dist/client/browser-entry/hydrate.d.ts.map +1 -1
  113. package/dist/client/browser-entry/index.d.ts +7 -7
  114. package/dist/client/browser-entry/post-hydration.d.ts +6 -9
  115. package/dist/client/browser-entry/post-hydration.d.ts.map +1 -1
  116. package/dist/client/browser-entry/router-init.d.ts +6 -11
  117. package/dist/client/browser-entry/router-init.d.ts.map +1 -1
  118. package/dist/client/error-boundary.d.ts +4 -3
  119. package/dist/client/error-boundary.d.ts.map +1 -1
  120. package/dist/client/error-boundary.js +1 -1
  121. package/dist/client/error-reconstituter.d.ts +3 -9
  122. package/dist/client/error-reconstituter.d.ts.map +1 -1
  123. package/dist/client/history.d.ts +12 -11
  124. package/dist/client/history.d.ts.map +1 -1
  125. package/dist/client/index.d.ts +0 -1
  126. package/dist/client/index.d.ts.map +1 -1
  127. package/dist/client/index.js +5 -6
  128. package/dist/client/index.js.map +1 -1
  129. package/dist/client/internal.d.ts +3 -3
  130. package/dist/client/internal.d.ts.map +1 -1
  131. package/dist/client/internal.js +68 -104
  132. package/dist/client/internal.js.map +1 -1
  133. package/dist/client/navigation-commit.d.ts +16 -7
  134. package/dist/client/navigation-commit.d.ts.map +1 -1
  135. package/dist/client/navigation-context.d.ts +3 -5
  136. package/dist/client/navigation-context.d.ts.map +1 -1
  137. package/dist/client/react-root.d.ts +3 -2
  138. package/dist/client/react-root.d.ts.map +1 -1
  139. package/dist/client/router-pipeline.d.ts +1 -6
  140. package/dist/client/router-pipeline.d.ts.map +1 -1
  141. package/dist/client/router-types.d.ts +45 -39
  142. package/dist/client/router-types.d.ts.map +1 -1
  143. package/dist/client/router-url.d.ts +24 -0
  144. package/dist/client/router-url.d.ts.map +1 -0
  145. package/dist/client/router.d.ts.map +1 -1
  146. package/dist/client/rsc-fetch.d.ts +8 -4
  147. package/dist/client/rsc-fetch.d.ts.map +1 -1
  148. package/dist/client/ssr-data.d.ts +18 -64
  149. package/dist/client/ssr-data.d.ts.map +1 -1
  150. package/dist/client/state.d.ts +2 -5
  151. package/dist/client/state.d.ts.map +1 -1
  152. package/dist/client/use-pathname.d.ts +1 -1
  153. package/dist/config-types.d.ts +2 -1
  154. package/dist/config-types.d.ts.map +1 -1
  155. package/dist/config-validation.d.ts.map +1 -1
  156. package/dist/cookies/index.js +1 -1
  157. package/dist/dev-tools/dev-page-shell.d.ts +17 -0
  158. package/dist/dev-tools/dev-page-shell.d.ts.map +1 -1
  159. package/dist/dev-tools/index.d.ts +1 -1
  160. package/dist/dev-tools/index.d.ts.map +1 -1
  161. package/dist/dev-tools/instrumentation.d.ts +17 -2
  162. package/dist/dev-tools/instrumentation.d.ts.map +1 -1
  163. package/dist/dev-tools/overlay.d.ts +6 -27
  164. package/dist/dev-tools/overlay.d.ts.map +1 -1
  165. package/dist/index.d.ts.map +1 -1
  166. package/dist/index.js +531 -373
  167. package/dist/index.js.map +1 -1
  168. package/dist/plugin-context.d.ts +26 -40
  169. package/dist/plugin-context.d.ts.map +1 -1
  170. package/dist/plugins/build-manifest.d.ts.map +1 -1
  171. package/dist/plugins/build-report.d.ts +15 -2
  172. package/dist/plugins/build-report.d.ts.map +1 -1
  173. package/dist/plugins/dev-server.d.ts.map +1 -1
  174. package/dist/plugins/entries.d.ts.map +1 -1
  175. package/dist/plugins/fonts.d.ts +19 -1
  176. package/dist/plugins/fonts.d.ts.map +1 -1
  177. package/dist/plugins/post-build.d.ts +110 -0
  178. package/dist/plugins/post-build.d.ts.map +1 -0
  179. package/dist/plugins/prebuilt-capture.d.ts +11 -4
  180. package/dist/plugins/prebuilt-capture.d.ts.map +1 -1
  181. package/dist/plugins/prebuilt.d.ts +17 -1
  182. package/dist/plugins/prebuilt.d.ts.map +1 -1
  183. package/dist/plugins/prerender-sugar.d.ts.map +1 -1
  184. package/dist/plugins/rsc-assets-manifest.d.ts +33 -0
  185. package/dist/plugins/rsc-assets-manifest.d.ts.map +1 -0
  186. package/dist/plugins/shims.d.ts.map +1 -1
  187. package/dist/plugins/static-build.d.ts +32 -9
  188. package/dist/plugins/static-build.d.ts.map +1 -1
  189. package/dist/routing/codegen-write.d.ts +0 -9
  190. package/dist/routing/codegen-write.d.ts.map +1 -1
  191. package/dist/routing/index.js +2 -2
  192. package/dist/routing/segment-codegen.d.ts.map +1 -1
  193. package/dist/server/access-gate.d.ts.map +1 -1
  194. package/dist/server/action-handler.d.ts +5 -4
  195. package/dist/server/action-handler.d.ts.map +1 -1
  196. package/dist/server/actions.d.ts +46 -7
  197. package/dist/server/actions.d.ts.map +1 -1
  198. package/dist/server/als-registry.d.ts +58 -5
  199. package/dist/server/als-registry.d.ts.map +1 -1
  200. package/dist/server/children-interception.d.ts.map +1 -1
  201. package/dist/server/cookie-context.d.ts +2 -23
  202. package/dist/server/cookie-context.d.ts.map +1 -1
  203. package/dist/server/csp-nonce.d.ts +0 -9
  204. package/dist/server/csp-nonce.d.ts.map +1 -1
  205. package/dist/server/csrf.d.ts +27 -4
  206. package/dist/server/csrf.d.ts.map +1 -1
  207. package/dist/server/debug.d.ts +0 -1
  208. package/dist/server/debug.d.ts.map +1 -1
  209. package/dist/server/default-logger.d.ts +2 -1
  210. package/dist/server/default-logger.d.ts.map +1 -1
  211. package/dist/server/deny-boundary.d.ts +12 -6
  212. package/dist/server/deny-boundary.d.ts.map +1 -1
  213. package/dist/server/deny-renderer.d.ts +2 -2
  214. package/dist/server/deny-renderer.d.ts.map +1 -1
  215. package/dist/server/error-boundary-wrapper.d.ts +7 -3
  216. package/dist/server/error-boundary-wrapper.d.ts.map +1 -1
  217. package/dist/server/fallback-error.d.ts +9 -2
  218. package/dist/server/fallback-error.d.ts.map +1 -1
  219. package/dist/server/head-response.d.ts +4 -4
  220. package/dist/server/html-injectors.d.ts.map +1 -1
  221. package/dist/server/index.d.ts +0 -1
  222. package/dist/server/index.d.ts.map +1 -1
  223. package/dist/server/index.js +3 -4
  224. package/dist/server/index.js.map +1 -1
  225. package/dist/server/instrumentation.d.ts +10 -3
  226. package/dist/server/instrumentation.d.ts.map +1 -1
  227. package/dist/server/internal.d.ts +1 -4
  228. package/dist/server/internal.d.ts.map +1 -1
  229. package/dist/server/internal.js +961 -581
  230. package/dist/server/internal.js.map +1 -1
  231. package/dist/server/json-status-response.d.ts +34 -0
  232. package/dist/server/json-status-response.d.ts.map +1 -0
  233. package/dist/server/logger.d.ts +26 -0
  234. package/dist/server/logger.d.ts.map +1 -1
  235. package/dist/server/param-coercion.d.ts +11 -6
  236. package/dist/server/param-coercion.d.ts.map +1 -1
  237. package/dist/server/pipeline-helpers.d.ts +95 -7
  238. package/dist/server/pipeline-helpers.d.ts.map +1 -1
  239. package/dist/server/pipeline-interception.d.ts +11 -0
  240. package/dist/server/pipeline-interception.d.ts.map +1 -1
  241. package/dist/server/pipeline-outcome.d.ts +11 -1
  242. package/dist/server/pipeline-outcome.d.ts.map +1 -1
  243. package/dist/server/pipeline-phases.d.ts +2 -2
  244. package/dist/server/pipeline-phases.d.ts.map +1 -1
  245. package/dist/server/pipeline.d.ts +23 -35
  246. package/dist/server/pipeline.d.ts.map +1 -1
  247. package/dist/server/prebuilt/capture-render.d.ts +25 -0
  248. package/dist/server/prebuilt/capture-render.d.ts.map +1 -0
  249. package/dist/server/prebuilt/capture-routes.d.ts +37 -0
  250. package/dist/server/prebuilt/capture-routes.d.ts.map +1 -0
  251. package/dist/server/prebuilt/capture-state.d.ts +79 -35
  252. package/dist/server/prebuilt/capture-state.d.ts.map +1 -1
  253. package/dist/server/prebuilt/lifetime.d.ts +38 -0
  254. package/dist/server/prebuilt/lifetime.d.ts.map +1 -0
  255. package/dist/server/prebuilt/slots.d.ts +7 -0
  256. package/dist/server/prebuilt/slots.d.ts.map +1 -1
  257. package/dist/server/prebuilt/synthetic-store.d.ts.map +1 -1
  258. package/dist/server/prebuilt-builder.d.ts.map +1 -1
  259. package/dist/server/prebuilt-runtime.d.ts.map +1 -1
  260. package/dist/server/primitives.d.ts +6 -81
  261. package/dist/server/primitives.d.ts.map +1 -1
  262. package/dist/server/react-cache-bridge.d.ts +59 -0
  263. package/dist/server/react-cache-bridge.d.ts.map +1 -0
  264. package/dist/server/react-cache-scope.d.ts +49 -0
  265. package/dist/server/react-cache-scope.d.ts.map +1 -0
  266. package/dist/server/render-timeout.d.ts +15 -0
  267. package/dist/server/render-timeout.d.ts.map +1 -1
  268. package/dist/server/render-utils.d.ts +9 -0
  269. package/dist/server/render-utils.d.ts.map +1 -1
  270. package/dist/server/request-context.d.ts +26 -5
  271. package/dist/server/request-context.d.ts.map +1 -1
  272. package/dist/server/route-element-builder.d.ts.map +1 -1
  273. package/dist/server/route-handler.d.ts.map +1 -1
  274. package/dist/server/route-matcher.d.ts +7 -0
  275. package/dist/server/route-matcher.d.ts.map +1 -1
  276. package/dist/server/rsc-entry/action-middleware-runner.d.ts +22 -22
  277. package/dist/server/rsc-entry/action-middleware-runner.d.ts.map +1 -1
  278. package/dist/server/rsc-entry/api-handler.d.ts +7 -0
  279. package/dist/server/rsc-entry/api-handler.d.ts.map +1 -1
  280. package/dist/server/rsc-entry/deny-fallback.d.ts +32 -6
  281. package/dist/server/rsc-entry/deny-fallback.d.ts.map +1 -1
  282. package/dist/server/rsc-entry/error-renderer.d.ts +11 -18
  283. package/dist/server/rsc-entry/error-renderer.d.ts.map +1 -1
  284. package/dist/server/rsc-entry/helpers.d.ts +0 -1
  285. package/dist/server/rsc-entry/helpers.d.ts.map +1 -1
  286. package/dist/server/rsc-entry/index.d.ts +5 -15
  287. package/dist/server/rsc-entry/index.d.ts.map +1 -1
  288. package/dist/server/rsc-entry/render-route.d.ts +5 -6
  289. package/dist/server/rsc-entry/render-route.d.ts.map +1 -1
  290. package/dist/server/rsc-entry/render-signals.d.ts +65 -0
  291. package/dist/server/rsc-entry/render-signals.d.ts.map +1 -0
  292. package/dist/server/rsc-entry/revalidate-renderer.d.ts +6 -16
  293. package/dist/server/rsc-entry/revalidate-renderer.d.ts.map +1 -1
  294. package/dist/server/rsc-entry/rsc-payload.d.ts +7 -3
  295. package/dist/server/rsc-entry/rsc-payload.d.ts.map +1 -1
  296. package/dist/server/rsc-entry/rsc-stream.d.ts +8 -53
  297. package/dist/server/rsc-entry/rsc-stream.d.ts.map +1 -1
  298. package/dist/server/rsc-entry/ssr-bridge.d.ts +2 -2
  299. package/dist/server/rsc-entry/ssr-bridge.d.ts.map +1 -1
  300. package/dist/server/rsc-entry/ssr-renderer.d.ts +9 -4
  301. package/dist/server/rsc-entry/ssr-renderer.d.ts.map +1 -1
  302. package/dist/server/rsc-entry/wrap-action-dispatch.d.ts +1 -1
  303. package/dist/server/rsc-entry/wrap-action-dispatch.d.ts.map +1 -1
  304. package/dist/server/signal-identity.d.ts +43 -0
  305. package/dist/server/signal-identity.d.ts.map +1 -0
  306. package/dist/server/slot-resolver.d.ts +4 -3
  307. package/dist/server/slot-resolver.d.ts.map +1 -1
  308. package/dist/server/slot-subtree-contain.d.ts.map +1 -1
  309. package/dist/server/ssr-bridge-types.d.ts +91 -53
  310. package/dist/server/ssr-bridge-types.d.ts.map +1 -1
  311. package/dist/server/ssr-entry.d.ts +8 -5
  312. package/dist/server/ssr-entry.d.ts.map +1 -1
  313. package/dist/server/ssr-render.d.ts +26 -40
  314. package/dist/server/ssr-render.d.ts.map +1 -1
  315. package/dist/server/ssr-wrappers.d.ts +1 -1
  316. package/dist/server/static-generator.d.ts.map +1 -1
  317. package/dist/server/stream-utils.d.ts +12 -0
  318. package/dist/server/stream-utils.d.ts.map +1 -1
  319. package/dist/server/tracing.d.ts +12 -16
  320. package/dist/server/tracing.d.ts.map +1 -1
  321. package/dist/server/types.d.ts +1 -1
  322. package/dist/server/version-skew.d.ts +3 -3
  323. package/dist/shared/csrf-reject.d.ts +16 -0
  324. package/dist/shared/csrf-reject.d.ts.map +1 -0
  325. package/dist/shared/error-digest.d.ts +28 -0
  326. package/dist/shared/error-digest.d.ts.map +1 -0
  327. package/dist/shared/payload-root.d.ts +11 -10
  328. package/dist/shared/payload-root.d.ts.map +1 -1
  329. package/dist/shared/rsc-payload-path.d.ts +6 -0
  330. package/dist/shared/rsc-payload-path.d.ts.map +1 -1
  331. package/dist/utils/write-file-atomic.d.ts +17 -0
  332. package/dist/utils/write-file-atomic.d.ts.map +1 -0
  333. package/docs/api/30-api-server.mdx +17 -14
  334. package/docs/api/32-api-cache.mdx +51 -23
  335. package/docs/api/34-api-config.mdx +34 -6
  336. package/docs/api/36-cli.mdx +11 -1
  337. package/docs/learn/03-fetching-data.mdx +17 -1
  338. package/docs/learn/04-access-control.mdx +1 -1
  339. package/docs/learn/10-caching.mdx +29 -11
  340. package/docs/learn/11-middleware.mdx +8 -2
  341. package/docs/learn/12-error-handling.mdx +6 -1
  342. package/package.json +5 -1
  343. package/src/adapters/build-output-helper.ts +55 -53
  344. package/src/adapters/canonicalize-module.ts +29 -0
  345. package/src/adapters/cloudflare.ts +105 -63
  346. package/src/adapters/compress-module.ts +16 -5
  347. package/src/adapters/fs-identity.ts +2 -3
  348. package/src/adapters/nitro-presets.ts +0 -15
  349. package/src/adapters/nitro-preview.ts +272 -136
  350. package/src/adapters/nitro.ts +119 -82
  351. package/src/adapters/shared.ts +23 -14
  352. package/src/adapters/types.ts +110 -21
  353. package/src/analyze/graph-cache.ts +3 -4
  354. package/src/cache/json-lossy-check.ts +3 -9
  355. package/src/cache/singleflight.ts +5 -2
  356. package/src/cache/sizeof.ts +3 -1
  357. package/src/cache/tag-aware-handler.ts +43 -26
  358. package/src/cli-check.ts +8 -98
  359. package/src/cli-context.ts +119 -0
  360. package/src/cli.ts +19 -28
  361. package/src/client/browser-dev.ts +1 -1
  362. package/src/client/browser-entry/action-dispatch.ts +26 -4
  363. package/src/client/browser-entry/hydrate.ts +53 -58
  364. package/src/client/browser-entry/index.ts +16 -27
  365. package/src/client/browser-entry/post-hydration.ts +6 -40
  366. package/src/client/browser-entry/router-init.ts +66 -84
  367. package/src/client/error-boundary.tsx +9 -41
  368. package/src/client/error-reconstituter.tsx +10 -5
  369. package/src/client/history.ts +18 -21
  370. package/src/client/index.ts +0 -1
  371. package/src/client/internal.ts +2 -7
  372. package/src/client/navigation-commit.ts +35 -18
  373. package/src/client/navigation-context.ts +3 -39
  374. package/src/client/react-root.ts +3 -2
  375. package/src/client/router-pipeline.ts +65 -128
  376. package/src/client/router-types.ts +46 -44
  377. package/src/client/router-url.ts +32 -0
  378. package/src/client/router.ts +43 -22
  379. package/src/client/rsc-fetch.ts +117 -155
  380. package/src/client/ssr-data.ts +19 -80
  381. package/src/client/state.ts +2 -9
  382. package/src/client/use-pathname.ts +1 -1
  383. package/src/config-types.ts +2 -1
  384. package/src/config-validation.ts +2 -1
  385. package/src/dev-tools/dev-page-shell.ts +18 -0
  386. package/src/dev-tools/index.ts +0 -2
  387. package/src/dev-tools/instrumentation.ts +50 -2
  388. package/src/dev-tools/overlay.ts +8 -238
  389. package/src/index.ts +24 -14
  390. package/src/plugin-context.ts +39 -40
  391. package/src/plugins/build-manifest.ts +4 -11
  392. package/src/plugins/build-report.ts +70 -70
  393. package/src/plugins/dev-server.ts +24 -44
  394. package/src/plugins/entries.ts +2 -1
  395. package/src/plugins/fonts.ts +35 -7
  396. package/src/plugins/post-build.ts +327 -0
  397. package/src/plugins/prebuilt-capture.ts +28 -32
  398. package/src/plugins/prebuilt.ts +54 -39
  399. package/src/plugins/prerender-sugar.ts +0 -4
  400. package/src/plugins/{adapter-build.ts → rsc-assets-manifest.ts} +20 -109
  401. package/src/plugins/shims.ts +1 -0
  402. package/src/plugins/static-build.ts +42 -74
  403. package/src/routing/codegen-write.ts +25 -3
  404. package/src/routing/segment-codegen.ts +3 -2
  405. package/src/rsc-runtime/vendor-types.d.ts +8 -0
  406. package/src/server/access-gate.tsx +2 -1
  407. package/src/server/action-client.ts +1 -1
  408. package/src/server/action-handler.ts +253 -110
  409. package/src/server/actions.ts +73 -25
  410. package/src/server/als-registry.ts +73 -5
  411. package/src/server/chain-url-parts.ts +1 -1
  412. package/src/server/children-interception.ts +2 -1
  413. package/src/server/cookie-context.ts +18 -48
  414. package/src/server/csp-nonce.ts +0 -12
  415. package/src/server/csrf.ts +140 -8
  416. package/src/server/debug.ts +0 -1
  417. package/src/server/default-logger.ts +2 -1
  418. package/src/server/deny-boundary.ts +25 -13
  419. package/src/server/deny-renderer.ts +30 -97
  420. package/src/server/error-boundary-wrapper.ts +7 -3
  421. package/src/server/fallback-error.ts +26 -11
  422. package/src/server/flight-scripts.ts +1 -1
  423. package/src/server/head-response.ts +4 -4
  424. package/src/server/html-injector-core.ts +2 -2
  425. package/src/server/html-injectors.ts +2 -4
  426. package/src/server/index.ts +0 -4
  427. package/src/server/instrumentation.ts +10 -3
  428. package/src/server/internal.ts +1 -6
  429. package/src/server/json-status-response.ts +105 -0
  430. package/src/server/logger.ts +39 -3
  431. package/src/server/param-coercion.ts +15 -12
  432. package/src/server/pipeline-helpers.ts +257 -12
  433. package/src/server/pipeline-interception.ts +133 -0
  434. package/src/server/pipeline-outcome.ts +103 -31
  435. package/src/server/pipeline-phases.ts +127 -237
  436. package/src/server/pipeline.ts +204 -207
  437. package/src/server/prebuilt/capture-render.ts +118 -0
  438. package/src/server/prebuilt/capture-routes.ts +104 -0
  439. package/src/server/prebuilt/capture-state.ts +155 -48
  440. package/src/server/prebuilt/lifetime.ts +151 -0
  441. package/src/server/prebuilt/slots.ts +14 -2
  442. package/src/server/prebuilt/synthetic-store.ts +3 -0
  443. package/src/server/prebuilt-builder.ts +30 -320
  444. package/src/server/prebuilt-runtime.ts +125 -129
  445. package/src/server/primitives.ts +8 -168
  446. package/src/server/react-cache-bridge.ts +124 -0
  447. package/src/server/react-cache-scope.ts +104 -0
  448. package/src/server/render-timeout.ts +20 -0
  449. package/src/server/render-utils.ts +11 -1
  450. package/src/server/request-context.ts +36 -9
  451. package/src/server/route-element-builder.ts +11 -6
  452. package/src/server/route-handler.ts +36 -23
  453. package/src/server/route-matcher.ts +15 -1
  454. package/src/server/rsc-entry/action-middleware-runner.ts +79 -123
  455. package/src/server/rsc-entry/api-handler.ts +27 -103
  456. package/src/server/rsc-entry/deny-fallback.ts +93 -26
  457. package/src/server/rsc-entry/error-renderer.ts +39 -91
  458. package/src/server/rsc-entry/helpers.ts +2 -4
  459. package/src/server/rsc-entry/index.ts +64 -58
  460. package/src/server/rsc-entry/render-route.ts +15 -80
  461. package/src/server/rsc-entry/render-signals.ts +108 -0
  462. package/src/server/rsc-entry/revalidate-renderer.ts +56 -57
  463. package/src/server/rsc-entry/rsc-payload.ts +28 -61
  464. package/src/server/rsc-entry/rsc-stream.ts +113 -213
  465. package/src/server/rsc-entry/ssr-bridge.ts +2 -2
  466. package/src/server/rsc-entry/ssr-renderer.ts +182 -263
  467. package/src/server/rsc-entry/wrap-action-dispatch.ts +12 -14
  468. package/src/server/signal-identity.ts +112 -0
  469. package/src/server/slot-resolver.ts +18 -18
  470. package/src/server/slot-subtree-contain.ts +2 -1
  471. package/src/server/ssr-bridge-types.ts +92 -56
  472. package/src/server/ssr-entry.ts +87 -111
  473. package/src/server/ssr-render.ts +55 -64
  474. package/src/server/ssr-wrappers.tsx +2 -2
  475. package/src/server/static-generator.ts +7 -42
  476. package/src/server/static-not-found.ts +3 -3
  477. package/src/server/stream-utils.ts +51 -0
  478. package/src/server/tracing.ts +58 -75
  479. package/src/server/types.ts +1 -1
  480. package/src/server/version-skew.ts +5 -5
  481. package/src/shared/csrf-reject.ts +15 -0
  482. package/src/shared/error-digest.ts +46 -0
  483. package/src/shared/payload-root.ts +11 -10
  484. package/src/shared/rsc-payload-path.ts +8 -1
  485. package/src/utils/write-file-atomic.ts +32 -0
  486. package/dist/_chunks/actions-jNrXdzgs.js +0 -346
  487. package/dist/_chunks/actions-jNrXdzgs.js.map +0 -1
  488. package/dist/_chunks/als-registry-C6kcfprT.js.map +0 -1
  489. package/dist/_chunks/build-manifest-DTmSGLRz.js.map +0 -1
  490. package/dist/_chunks/build-output-helper-9dqCv1pZ.js.map +0 -1
  491. package/dist/_chunks/cache-api-CUD9Ezaq.js.map +0 -1
  492. package/dist/_chunks/cli-check-G8o30ldg.js.map +0 -1
  493. package/dist/_chunks/convention-lint-5KzoMg_A.js.map +0 -1
  494. package/dist/_chunks/dev-server-BzBxgYAV.js.map +0 -1
  495. package/dist/_chunks/error-boundary-BrHmG-2X.js.map +0 -1
  496. package/dist/_chunks/fs-identity-D7vb6GdI.js.map +0 -1
  497. package/dist/_chunks/graph-cache-CP4GEmf9.js.map +0 -1
  498. package/dist/_chunks/json-lossy-check-ClNvBM_3.js.map +0 -1
  499. package/dist/_chunks/logger-k2DQ4EUf.js.map +0 -1
  500. package/dist/_chunks/navigation-context-D0TU0Jog.js.map +0 -1
  501. package/dist/_chunks/plugin-context-8idfR3UZ.js.map +0 -1
  502. package/dist/_chunks/primitives-DLAnvsrk.js.map +0 -1
  503. package/dist/_chunks/segment-context-D9_89u34.js +0 -34
  504. package/dist/_chunks/segment-context-D9_89u34.js.map +0 -1
  505. package/dist/_chunks/sizeof-lXffQ1Vr.js.map +0 -1
  506. package/dist/_chunks/ssr-data-D6T6Y3ef.js +0 -60
  507. package/dist/_chunks/ssr-data-D6T6Y3ef.js.map +0 -1
  508. package/dist/_chunks/state-FippDgxN.js.map +0 -1
  509. package/dist/_chunks/status-page-marker-CNbpUOPB.js.map +0 -1
  510. package/dist/client/types.d.ts +0 -14
  511. package/dist/client/types.d.ts.map +0 -1
  512. package/dist/plugins/adapter-build.d.ts +0 -38
  513. package/dist/plugins/adapter-build.d.ts.map +0 -1
  514. package/dist/server/asset-headers.d.ts +0 -32
  515. package/dist/server/asset-headers.d.ts.map +0 -1
  516. package/dist/server/dev-source-map.d.ts +0 -22
  517. package/dist/server/dev-source-map.d.ts.map +0 -1
  518. package/src/client/types.ts +0 -21
  519. package/src/server/asset-headers.ts +0 -59
  520. package/src/server/dev-source-map.ts +0 -31
@@ -1,5 +1,6 @@
1
1
  /**
2
- * RSC Error & No-Match Renderers — handles error pages and 404s.
2
+ * RSC Error Renderer — handles error pages. (The 404 page for an unmatched
3
+ * URL is a deny page, assembled by `deny-fallback.ts`.)
3
4
  *
4
5
  * Error pages are 'use client' components rendered through the RSC → SSR
5
6
  * pipeline: the Error is converted to SerializableError, wrapped with
@@ -13,15 +14,14 @@ import { renderToReadableStream } from '../../rsc-runtime/rsc.ts';
13
14
 
14
15
  import type { RouteMatch } from '../pipeline.ts';
15
16
  import { logRenderError } from '../logger.ts';
17
+ import { loadFallbackModule, reportRenderError } from '../pipeline-helpers.ts';
16
18
  import { appVisibleSearch } from '../../shared/rsc-cache-key.ts';
17
- import { getSlotParamsForClient } from '../request-context.ts';
18
19
  import type { ManifestSegmentNode } from '../route-matcher.ts';
19
- import { isRenderError, DenySignal, RenderError } from '../primitives.ts';
20
+ import { errorDigestId } from '../../shared/error-digest.ts';
20
21
  import type { ClientBootstrapConfig } from '../html-injectors.ts';
21
22
  import { flightInitScript, htmlEscapeJsonString } from '../flight-scripts.ts';
22
23
  import { getCspNonce } from '../csp-nonce.ts';
23
- import { renderDenyPage, renderDenyPageAsRsc } from '../deny-renderer.ts';
24
- import type { DefaultPageRenderer, LayoutEntry } from '../deny-renderer.ts';
24
+ import type { LayoutEntry } from '../deny-renderer.ts';
25
25
  import type { NavContext } from '../ssr-bridge-types.ts';
26
26
  import { isRscRequest } from '../../shared/rsc-media-type.ts';
27
27
  import { withPublishedParams } from '../publish-params.ts';
@@ -31,8 +31,7 @@ import { teeWithErrorPropagation } from '../stream-utils.ts';
31
31
  import { isDevMode } from '../debug.ts';
32
32
  import { ErrorReconstituter } from '../../client/error-reconstituter.tsx';
33
33
  import type { SerializableError } from '../../client/error-reconstituter.tsx';
34
- import { loadModule } from '../safe-load.ts';
35
- import { sourceMapError } from '../dev-source-map.ts';
34
+ import type { ManifestLoader } from '../safe-load.ts';
36
35
  import { defaultStatusPageResponse } from '../default-status-page.ts';
37
36
  import { rscErrorEnvelope } from '../rsc-error-envelope.ts';
38
37
 
@@ -67,6 +66,7 @@ interface ErrorFileResolution {
67
66
  async function resolveErrorFile(
68
67
  status: number,
69
68
  segments: ManifestSegmentNode[],
69
+ load: (file: ManifestLoader) => Promise<Record<string, unknown> | null>,
70
70
  maxIndex?: number
71
71
  ): Promise<ErrorFileResolution | null> {
72
72
  const start =
@@ -79,10 +79,11 @@ async function resolveErrorFile(
79
79
  const statusKey = String(status);
80
80
  const specificFile = segment.statusFiles[statusKey];
81
81
  if (specificFile) {
82
- // .catch: if the error page module itself fails to load (syntax error,
83
- // missing file), fall through to next tier instead of recursive failure.
82
+ // `load` returns null when the error page module itself fails to
83
+ // load (syntax error, missing file), after reporting it, so the next
84
+ // tier answers instead of a recursive failure.
84
85
  // See TIM-584, design/spike-TIM-551-dynamic-import-audit.md §H1.
85
- const mod = await loadModule(specificFile).catch(() => null);
86
+ const mod = await load(specificFile);
86
87
  if (mod?.default) {
87
88
  return {
88
89
  component: mod.default as (...args: unknown[]) => unknown,
@@ -94,7 +95,7 @@ async function resolveErrorFile(
94
95
  // Check 5xx.tsx category catch-all
95
96
  const categoryFile = segment.statusFiles['5xx'];
96
97
  if (categoryFile && status >= 500 && status <= 599) {
97
- const mod = await loadModule(categoryFile).catch(() => null);
98
+ const mod = await load(categoryFile);
98
99
  if (mod?.default) {
99
100
  return {
100
101
  component: mod.default as (...args: unknown[]) => unknown,
@@ -106,7 +107,7 @@ async function resolveErrorFile(
106
107
 
107
108
  // Check error.tsx
108
109
  if (segment.error) {
109
- const mod = await loadModule(segment.error).catch(() => null);
110
+ const mod = await load(segment.error);
110
111
  if (mod?.default) {
111
112
  return {
112
113
  component: mod.default as (...args: unknown[]) => unknown,
@@ -154,7 +155,7 @@ function toSerializableError(error: unknown): SerializableError {
154
155
  }
155
156
 
156
157
  /**
157
- * Render an error page for unhandled throws or RenderError outside Suspense.
158
+ * Render an error page for an unhandled throw outside Suspense.
158
159
  *
159
160
  * All error pages (TSX and MDX) go through RSC → SSR:
160
161
  * - TSX: ErrorReconstituter wrapper converts SerializableError → real Error
@@ -164,13 +165,13 @@ function toSerializableError(error: unknown): SerializableError {
164
165
  * envelope instead. Every tier below produces an HTML document, and the
165
166
  * client's Flight decoder is waiting for `text/x-component`; handing it HTML
166
167
  * crashes the decode. The check lives here rather than at the call sites
167
- * because it holds for all five of them, and the deny path's equivalent split
168
- * (`renderDenyPage` / `renderDenyPageAsRsc`) had already been forgotten at one
169
- * of this function's — the synchronous render-error exit in `render-route.ts`
170
- * (TIM-1322). Four of the five are unreachable for an RSC request today
171
- * (`render-route.ts` returns the payload before it reaches SSR, and
172
- * `outcomeToResponse` answers RSC errors itself), so this fires on one path
173
- * and guards the rest against drift.
168
+ * because it holds for every one of them, and the deny path's equivalent split
169
+ * (the deny fallback's page / Flight branches) had already been forgotten at one
170
+ * of this function's — a since-deleted synchronous render-error exit in
171
+ * `render-route.ts` (TIM-1322). Neither remaining caller is reachable for an
172
+ * RSC request today (`render-route.ts` returns the payload before it reaches
173
+ * SSR, and `outcomeToResponse` answers RSC errors itself), so this guards
174
+ * against drift rather than firing on a live path.
174
175
  */
175
176
  export async function renderErrorPage(
176
177
  error: unknown,
@@ -184,24 +185,25 @@ export async function renderErrorPage(
184
185
  globalError?: GlobalErrorFile,
185
186
  firstDeniedIndex = Infinity
186
187
  ): Promise<Response> {
187
- // The error itself is not logged here — every producer of a `renderError`
188
- // signal already logged it at the point it was caught (`rsc-stream.ts`'s
189
- // `onError`, `outcomeToResponse`), so a log on this exit would double up.
188
+ // The error itself is not logged here — every producer already logged it
189
+ // where it was caught, so a log on this exit would double up: `rsc-stream.ts`'s
190
+ // `onError` for an error the RSC render threw, Fizz's `onError`
191
+ // (`ssr-render.ts`) for a shell error SSR threw itself, `outcomeToResponse`
192
+ // for a pipeline error. Each of them is also the error's one
193
+ // `onRequestError` report, except Fizz's, which reaches no hook; see
194
+ // design/17 §"Which errors reach it".
190
195
  if (isRscRequest(req)) {
191
196
  return rscErrorEnvelope(status, responseHeaders);
192
197
  }
193
198
 
194
- // Source-map the error's stack trace in dev mode so the error page
195
- // shows original source positions instead of transpiled/bundled ones.
196
- // See TIM-811.
197
- sourceMapError(error);
198
199
  // Walk segments from leaf to root to find the error component.
199
200
  // When firstDeniedIndex is finite, bound the walk so error files below
200
201
  // the denied segment are not selected — matching the deny renderer's
201
202
  // behavior. For plain errors (firstDeniedIndex = Infinity), the full
202
203
  // chain is searched. See TIM-1358.
203
204
  const errorMaxIndex = firstDeniedIndex < Infinity ? firstDeniedIndex : undefined;
204
- const resolution = await resolveErrorFile(status, segments, errorMaxIndex);
205
+ const load = (file: ManifestLoader) => loadFallbackModule(file, req, segments);
206
+ const resolution = await resolveErrorFile(status, segments, load, errorMaxIndex);
205
207
 
206
208
  // Tier 2: No segment-level error file — try global-error.tsx
207
209
  if (!resolution && globalError) {
@@ -265,7 +267,9 @@ async function renderErrorPageViaRsc(
265
267
  const url = new URL(req.url);
266
268
 
267
269
  const serializedError = toSerializableError(error);
268
- const digest = isRenderError(error) ? { code: error.code, data: error.digest.data } : null;
270
+ // The ID the server logged this error with, when it crossed Flight — a
271
+ // shell crash SSR relays here. A pipeline error has none.
272
+ const digest = errorDigestId(error);
269
273
 
270
274
  let element: React.ReactElement = h(ErrorReconstituter, {
271
275
  error: serializedError,
@@ -288,22 +292,16 @@ async function renderErrorPageViaRsc(
288
292
  const rscStream = renderToReadableStream(withPublishedParams(element), {
289
293
  signal: req.signal,
290
294
  onError(err: unknown) {
291
- logRenderError({ method: req.method, path: url.pathname, error: err });
295
+ reportRenderError(err, req, { segments: match.segments });
292
296
  },
293
297
  });
294
298
 
295
299
  const [ssrStream, inlineStream] = teeWithErrorPropagation(rscStream);
296
300
 
297
- // Params ride the payload root, beside the tree, so there is no
298
- // bootstrap script. Read here for the SSR-side ALS context below.
299
- const slotParams = getSlotParamsForClient();
300
-
301
301
  const nonce = getCspNonce();
302
302
  const navContext: NavContext = {
303
303
  pathname: url.pathname,
304
304
  search: appVisibleSearch(url).search,
305
- segmentParams: match.segmentParams,
306
- slotParams,
307
305
  statusCode: status,
308
306
  responseHeaders,
309
307
  headHtml: flightInitScript(nonce),
@@ -317,7 +315,7 @@ async function renderErrorPageViaRsc(
317
315
  // `await` inside the try on purpose: SSR of the error page fails
318
316
  // asynchronously far more often than synchronously, and returning the
319
317
  // promise bare let every such rejection escape this guard.
320
- return await callSsr(ssrStream, navContext);
318
+ return (await callSsr(ssrStream, navContext)).response;
321
319
  } catch (renderError) {
322
320
  // The error page itself failed to render — guards against recursive
323
321
  // errors in user error page code. Terminates in the framework default
@@ -344,10 +342,10 @@ async function renderGlobalErrorPage(
344
342
  responseHeaders: Headers,
345
343
  clientBootstrap: ClientBootstrapConfig
346
344
  ): Promise<Response> {
347
- // .catch: if global-error.tsx fails to load or exports no component, it is
348
- // not a usable Tier 2 match — fall through to the framework default page
349
- // rather than a blank body. See TIM-584, TIM-1258.
350
- const mod = await loadModule(globalError).catch(() => null);
345
+ // If global-error.tsx fails to load (reported) or exports no component, it
346
+ // is not a usable Tier 2 match — fall through to the framework default
347
+ // page rather than a blank body. See TIM-584, TIM-1258.
348
+ const mod = await loadFallbackModule(globalError, req, match.segments);
351
349
  if (!mod?.default) {
352
350
  return defaultStatusPageResponse(status, responseHeaders);
353
351
  }
@@ -365,53 +363,3 @@ async function renderGlobalErrorPage(
365
363
  clientBootstrap
366
364
  );
367
365
  }
368
-
369
- /**
370
- * Render a 404 page for URLs that don't match any route.
371
- *
372
- * Uses the root segment's 404.tsx (or 4xx.tsx / error.tsx fallback)
373
- * wrapped in the root layout, via the same renderDenyPage path
374
- * used for in-route deny() calls.
375
- */
376
- export async function renderNoMatchPage(
377
- req: Request,
378
- rootSegment: ManifestSegmentNode,
379
- responseHeaders: Headers,
380
- clientBootstrap: ClientBootstrapConfig,
381
- defaultPage?: DefaultPageRenderer
382
- ): Promise<Response> {
383
- const segments = [rootSegment];
384
-
385
- // Load root layout if present. A layout that fails to import or evaluate
386
- // must not take the 404 down with it — render the status page unwrapped,
387
- // as renderFallbackError does for the same reason.
388
- const layoutComponents: LayoutEntry[] = [];
389
- if (rootSegment.layout) {
390
- const mod = await loadModule(rootSegment.layout).catch(() => null);
391
- if (mod?.default) {
392
- layoutComponents.push({
393
- component: mod.default as (...args: unknown[]) => unknown,
394
- segment: rootSegment,
395
- });
396
- }
397
- }
398
-
399
- const deny = new DenySignal(404);
400
- const match: RouteMatch = { segments, segmentParams: {}, middlewareChain: [] };
401
-
402
- if (isRscRequest(req)) {
403
- return renderDenyPageAsRsc(deny, segments, layoutComponents, req, responseHeaders);
404
- }
405
-
406
- return renderDenyPage(
407
- deny,
408
- segments,
409
- layoutComponents,
410
- req,
411
- match,
412
- responseHeaders,
413
- clientBootstrap,
414
- callSsr,
415
- defaultPage
416
- );
417
- }
@@ -106,10 +106,8 @@ export function buildSegmentInfo(
106
106
  }
107
107
 
108
108
  // Re-export consolidated helpers from their single source of truth.
109
- // Callers within rsc-entry/ import from this file; the implementations
110
- // live in pipeline-helpers.ts (buildRedirectResponse) and render-utils.ts
111
- // (isAbortError). See TIM-1071 item 1.
112
- export { buildRedirectResponse } from '../pipeline-helpers.ts';
109
+ // Callers within rsc-entry/ import from this file; the implementation
110
+ // lives in render-utils.ts. See TIM-1071 item 1.
113
111
  export { isAbortError } from '../render-utils.ts';
114
112
 
115
113
  // escapeHtml is now imported from server/utils/escape-html.ts
@@ -40,6 +40,7 @@ import globalSchemaCodecs from 'virtual:timber-schema';
40
40
 
41
41
  import { wrapPipelineWithActionDispatch, buildActionDispatcher } from './wrap-action-dispatch.ts';
42
42
  import type { BodyLimitsConfig } from '../body-limits.ts';
43
+ import type { DevHooks } from '../../dev-tools/dev-page-shell.ts';
43
44
  import type { BuildManifest } from '../build-manifest.ts';
44
45
  import { resolveLogMode } from '../../dev-tools/logger.ts';
45
46
  import { sendEarlyHints103 } from '../early-hints-sender.ts';
@@ -56,13 +57,13 @@ import { createRevalidateRendererFactory } from './revalidate-renderer.ts';
56
57
  import { renderFallbackError as renderFallback } from '../fallback-error.ts';
57
58
  import { loadInstrumentation } from '../instrumentation.ts';
58
59
  import { createDenyFallbackRenderer } from './deny-fallback.ts';
59
- import { renderNoMatchPage } from './error-renderer.ts';
60
+ import { DenySignal } from '../primitives.ts';
60
61
  import { renderRoute } from './render-route.ts';
61
62
  import { isDebug, isDevMode, setDebugFromConfig } from '../debug.ts';
62
- import { setSourceMapCallback } from '../dev-source-map.ts';
63
63
  import { capturePrebuiltPayloads } from '../prebuilt-builder.ts';
64
64
  import { setPrebuiltPayloadSource } from '../prebuilt/payload-source.ts';
65
65
  import { setRscFunctions, setComponentRefreshTimeout } from '../prebuilt-runtime.ts';
66
+ import { installReactCacheBridge } from '../react-cache-bridge.ts';
66
67
  import { setKeyDisciplineStrict } from '../prebuilt/key-discipline.ts';
67
68
  import { createAutoSitemapHandler } from '../sitemap-handler.ts';
68
69
  import { generateStaticSite } from '../static-generator.ts';
@@ -82,18 +83,16 @@ function resolveServerTimingMode(
82
83
  return 'total';
83
84
  }
84
85
 
86
+ /** The dev server's hooks. Empty in production. */
87
+ let devHooks: DevHooks = {};
88
+
85
89
  /**
86
- * Set the dev source-map handler.
87
- *
88
- * Called by the dev server after importing this module to wire Vite's
89
- * module graph source-mapping into the error rendering pipeline. Errors
90
- * rendered by renderErrorPage / renderFallbackError will have their
91
- * stack traces rewritten to show original source positions.
92
- *
93
- * No-op in production.
90
+ * Set the dev hooks. Called by the dev server after it imports this module;
91
+ * the handler reads them at request time, so a later call takes effect on
92
+ * the next request.
94
93
  */
95
- export function setDevSourceMapHandler(handler: (error: Error) => void): void {
96
- setSourceMapCallback(handler);
94
+ export function setDevHooks(hooks: DevHooks): void {
95
+ devHooks = hooks;
97
96
  }
98
97
 
99
98
  /**
@@ -103,12 +102,11 @@ export function setDevSourceMapHandler(handler: (error: Error) => void): void {
103
102
  * 103 Early Hints → middleware.ts → render (RSC → SSR → HTML).
104
103
  */
105
104
  async function createRequestHandler(manifest: typeof routeManifest, runtimeConfig: typeof config) {
106
- // Initialize deployment ID for version skew detection (TIM-446).
107
- // The manifest init module sets globalThis.__TIMBER_DEPLOYMENT_ID__ at startup.
108
- // In dev mode this is undefined — skew checks are skipped.
109
- const deploymentId = (globalThis as Record<string, unknown>).__TIMBER_DEPLOYMENT_ID__ as
110
- | string
111
- | undefined;
105
+ // Initialize deployment ID for version skew detection (TIM-446). It is
106
+ // serialized into virtual:timber-config at build time — the same value the
107
+ // browser entry sends back — and is null in dev, where skew checks are
108
+ // skipped.
109
+ const deploymentId = (runtimeConfig as Record<string, unknown>).deploymentId as string | null;
112
110
  if (deploymentId) {
113
111
  const { setDeploymentId } = await import('../version-skew.ts');
114
112
  setDeploymentId(deploymentId);
@@ -181,6 +179,19 @@ async function createRequestHandler(manifest: typeof routeManifest, runtimeConfi
181
179
  renderToReadableStream: rscMod.renderToReadableStream,
182
180
  });
183
181
 
182
+ // One React.cache scope per request, shared by proxy.ts, middleware.ts,
183
+ // route handlers, and the render (TIM-1529). Flight installs its
184
+ // dispatcher lazily, so the warm-up constructs one throwaway render.
185
+ const bridge = installReactCacheBridge(() => {
186
+ rscMod.renderToReadableStream(null, { onError() {} }).cancel();
187
+ });
188
+ if (!bridge.installed) {
189
+ console.warn(
190
+ `[timber] React.cache bridge not installed (${bridge.reason}) — React.cache ` +
191
+ `will not dedupe between middleware.ts and the render.`
192
+ );
193
+ }
194
+
184
195
  const matchRoute = createRouteMatcher(manifest);
185
196
  const matchMetadataRoute = createMetadataRouteMatcher(manifest);
186
197
 
@@ -196,7 +207,10 @@ async function createRequestHandler(manifest: typeof routeManifest, runtimeConfi
196
207
  ((runtimeConfig as Record<string, unknown>).clientSegmentCache as boolean) ?? false;
197
208
  const clientBootstrap = buildClientScripts({
198
209
  ...runtimeConfig,
199
- clientJavascript: clientJsConfig ?? { disabled: false, enableHMRInDev: false },
210
+ clientJavascript: clientJsConfig ?? {
211
+ disabled: false,
212
+ enableHMRInDev: false,
213
+ },
200
214
  devBrowserLogs: (runtimeConfig as Record<string, unknown>).devBrowserLogs as string | undefined,
201
215
  buildManifest: buildManifest as BuildManifest,
202
216
  });
@@ -213,7 +227,9 @@ async function createRequestHandler(manifest: typeof routeManifest, runtimeConfi
213
227
  // `timber.config.ts` without needing to plumb config through each action.
214
228
  // See TIM-816 and design/08-forms-and-actions.md §"Validation errors".
215
229
  const formsConfig = (runtimeConfig as Record<string, unknown>).forms as
216
- | { stripSensitiveFields?: import('../sensitive-fields.ts').SensitiveFieldsOption }
230
+ | {
231
+ stripSensitiveFields?: import('../sensitive-fields.ts').SensitiveFieldsOption;
232
+ }
217
233
  | undefined;
218
234
  if (formsConfig) {
219
235
  const { setGlobalSensitiveFieldsConfig } = await import('../sensitive-fields.ts');
@@ -241,10 +257,6 @@ async function createRequestHandler(manifest: typeof routeManifest, runtimeConfi
241
257
  const devLogMode = resolveLogMode();
242
258
  if (devLogMode !== 'quiet') {
243
259
  await initDevTracing({ mode: devLogMode, slowPhaseMs });
244
- // Patch globalThis.fetch to create OTEL spans for fetch calls.
245
- // Spans appear as children of the active component span in the dev log tree.
246
- const { instrumentDevFetch } = await import('../../dev-tools/instrumentation.ts');
247
- instrumentDevFetch();
248
260
  }
249
261
  }
250
262
 
@@ -257,6 +269,14 @@ async function createRequestHandler(manifest: typeof routeManifest, runtimeConfi
257
269
  ? { kind: 'lazy', loader: manifest.proxy.load }
258
270
  : undefined;
259
271
 
272
+ // The one assembler of deny pages: signals that escape a phase, the
273
+ // no-match 404, and the missing-page 404. See deny-fallback.ts,
274
+ // design/04-authorization.md, design/10-error-handling.md.
275
+ const renderDenyFallback = createDenyFallbackRenderer({
276
+ rootSegment: manifest.root,
277
+ clientBootstrap,
278
+ });
279
+
260
280
  const pipelineConfig: PipelineConfig = {
261
281
  proxy: proxyConfig,
262
282
  matchRoute,
@@ -280,7 +300,6 @@ async function createRequestHandler(manifest: typeof routeManifest, runtimeConfi
280
300
  req: Request,
281
301
  match: RouteMatch,
282
302
  responseHeaders: Headers,
283
- _requestHeaderOverlay: Headers,
284
303
  interception?: InterceptionContext
285
304
  ) => {
286
305
  return renderRoute(
@@ -291,7 +310,7 @@ async function createRequestHandler(manifest: typeof routeManifest, runtimeConfi
291
310
  clientBootstrap,
292
311
  clientJsDisabled,
293
312
  clientSegmentCache,
294
- rootSegment: manifest.root,
313
+ renderDenyFallback,
295
314
  buildManifest: typedBuildManifest,
296
315
  globalError: manifest.globalError,
297
316
  },
@@ -321,9 +340,9 @@ async function createRequestHandler(manifest: typeof routeManifest, runtimeConfi
321
340
  ? (_status: number, headers: Headers) => {
322
341
  const routes = devPage.collectRoutes(manifest.root);
323
342
  const pathname = new URL(req.url).pathname;
324
- // devHmrOptions is set by the dev server after this module is
325
- // imported (read at request time, not closure-capture time).
326
- const html = devPage.generateDev404Page(pathname, routes, pipelineConfig.devHmrOptions);
343
+ // Read at request time: the dev server sets the hooks after
344
+ // this module is imported.
345
+ const html = devPage.generateDev404Page(pathname, routes, devHooks.hmrOptions);
327
346
  return new Response(html, {
328
347
  status: 404,
329
348
  headers: {
@@ -334,7 +353,8 @@ async function createRequestHandler(manifest: typeof routeManifest, runtimeConfi
334
353
  }
335
354
  : undefined;
336
355
 
337
- return renderNoMatchPage(req, manifest.root, responseHeaders, clientBootstrap, defaultPage);
356
+ // With no match, the fallback renders the root chain's 404 page.
357
+ return renderDenyFallback(new DenySignal(404), req, responseHeaders, undefined, defaultPage);
338
358
  },
339
359
  interceptionRewrites: manifest.interceptionRewrites,
340
360
  matchInterceptedRoute: createInterceptedRouteMatcher(manifest.root),
@@ -343,18 +363,15 @@ async function createRequestHandler(manifest: typeof routeManifest, runtimeConfi
343
363
  slowRequestMs: (runtimeConfig as Record<string, unknown>).slowRequestMs as number | undefined,
344
364
  serverTiming: resolveServerTimingMode(runtimeConfig, isDev),
345
365
  onPipelineError: isDev
346
- ? (error: Error, phase: string) => {
347
- if (pipelineConfig.devPipelineErrorHandler) {
348
- pipelineConfig.devPipelineErrorHandler(error, phase);
349
- }
350
- }
366
+ ? (error: Error, phase: string) => devHooks.onPipelineError?.(error, phase)
351
367
  : undefined,
352
368
 
353
- renderFallbackError: (error, req, responseHeaders) =>
369
+ renderFallbackError: (error, req, responseHeaders, match) =>
354
370
  renderFallback(
355
371
  error,
356
372
  req,
357
373
  responseHeaders,
374
+ match,
358
375
  isDev,
359
376
  manifest.root,
360
377
  clientBootstrap,
@@ -369,15 +386,12 @@ async function createRequestHandler(manifest: typeof routeManifest, runtimeConfi
369
386
  isDev ? manifest.viteRoot : undefined,
370
387
  // HMR options for the dev error page's auto-reload WebSocket —
371
388
  // set by the dev server after import, read at request time.
372
- isDev ? pipelineConfig.devHmrOptions : undefined
389
+ isDev ? devHooks.hmrOptions : undefined
373
390
  ),
374
391
  // Deny fallback — renders the deny page (403.tsx, 404.tsx, etc.) for
375
392
  // DenySignals that escape from middleware or the render phase.
376
393
  // See deny-fallback.ts, design/04-authorization.md, design/10-error-handling.md.
377
- renderDenyFallback: createDenyFallbackRenderer({
378
- rootSegment: manifest.root,
379
- clientBootstrap,
380
- }),
394
+ renderDenyFallback,
381
395
  // Auto-generated sitemap handler — enabled when sitemap.enabled is true
382
396
  // and no user-authored sitemap exists at the app root.
383
397
  // See design/16-metadata.md §"Auto-generated Sitemap"
@@ -423,7 +437,7 @@ async function createRequestHandler(manifest: typeof routeManifest, runtimeConfi
423
437
  csrfConfig,
424
438
  });
425
439
 
426
- return { handler, pipelineConfig };
440
+ return handler;
427
441
  }
428
442
 
429
443
  // Re-export for generated entry points (e.g., Nitro node-server/bun) to wrap
@@ -487,12 +501,13 @@ setGlobalSchemaCodecs(globalSchemaCodecs);
487
501
 
488
502
  // Singleflight timeout protects against deadlocked cache calls — needed
489
503
  // in both capture mode (components may call timber.cache) and normal mode.
490
- const renderTimeoutMs = (config as Record<string, unknown>).renderTimeoutMs as number | undefined;
491
- if (renderTimeoutMs) {
492
- const { setDefaultSingleflightTimeout } = await import('../../cache/timber-cache.ts');
493
- setDefaultSingleflightTimeout(renderTimeoutMs);
494
- setComponentRefreshTimeout(renderTimeoutMs);
495
- }
504
+ // Always wired: an unbounded singleflight deadlocks a key forever
505
+ // (TIM-1440). plugins/entries.ts resolves the value (0 → ceiling) before
506
+ // it reaches the runtime config.
507
+ const renderTimeoutMs = (config as Record<string, unknown>).renderTimeoutMs as number;
508
+ const { setDefaultSingleflightTimeout } = await import('../../cache/timber-cache.ts');
509
+ setDefaultSingleflightTimeout(renderTimeoutMs);
510
+ setComponentRefreshTimeout(renderTimeoutMs);
496
511
 
497
512
  const cacheConfig = (config as Record<string, unknown>).cache as
498
513
  | { strictKeyDiscipline?: boolean }
@@ -519,18 +534,9 @@ if (userCacheHandler) {
519
534
  const isCaptureMode = !!(globalThis as Record<string, unknown>).__TIMBER_CAPTURE_MODE__;
520
535
 
521
536
  let _handler: ((req: Request) => Promise<Response>) | undefined;
522
- let _pipelineConfig: PipelineConfig | undefined;
523
537
 
524
538
  if (!isCaptureMode) {
525
- const result = await createRequestHandler(routeManifest, config);
526
- _handler = result.handler;
527
- _pipelineConfig = result.pipelineConfig;
539
+ _handler = await createRequestHandler(routeManifest, config);
528
540
  }
529
541
 
530
- /**
531
- * The pipeline configuration object. Exported so the dev server can set
532
- * `devPipelineErrorHandler` after import without a module-level singleton.
533
- */
534
- export const pipelineConfig = _pipelineConfig!;
535
-
536
542
  export default _handler!;