@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
@@ -20,6 +20,7 @@ import type { Plugin, Logger } from 'vite';
20
20
  import type { PluginContext } from '../plugin-context.ts';
21
21
  import type { SegmentNode, RouteTree } from '../routing/types.ts';
22
22
  import type { CaptureSummary } from '../server/prebuilt-builder.ts';
23
+ import type { PrebuiltCaptureResult } from './prebuilt-capture.ts';
23
24
  import type { PrebuiltManifest } from '../server/prebuilt/payload-source.ts';
24
25
  import { collectLeafRoutes } from '../routing/walkers.ts';
25
26
  import { formatSize } from '../utils/format.ts';
@@ -199,13 +200,10 @@ export interface PrebuiltReportData {
199
200
  skippedReasons: Array<{ componentId: string; route: string; message: string }>;
200
201
  }
201
202
 
202
- export function loadPrebuiltManifest(buildDir: string): PrebuiltManifest | null {
203
- try {
204
- const raw = readFileSync(join(buildDir, 'prebuilt', 'manifest.json'), 'utf-8');
205
- return JSON.parse(raw) as PrebuiltManifest;
206
- } catch {
207
- return null;
208
- }
203
+ /** Read the manifest of the prebuilt artifact this build recorded, if any. */
204
+ export function loadPrebuiltManifest(prebuiltDir: string | undefined): PrebuiltManifest | null {
205
+ if (!prebuiltDir) return null;
206
+ return JSON.parse(readFileSync(join(prebuiltDir, 'manifest.json'), 'utf-8')) as PrebuiltManifest;
209
207
  }
210
208
 
211
209
  export function buildPrebuiltReportData(
@@ -488,17 +486,79 @@ function suppressNonClientLogs(config: { command: string; logger: Logger }): voi
488
486
  };
489
487
  }
490
488
 
491
- export function timberBuildReport(ctx: PluginContext): Plugin {
489
+ /**
490
+ * What the post-build phase asks of the build report (plugins/post-build.ts).
491
+ * Printed from there, once, after every environment is built and after the
492
+ * prebuilt capture pass — so nothing here depends on the order in which
493
+ * Vite closes each environment's bundle.
494
+ */
495
+ export interface BuildReportStep {
496
+ print(prebuilt: PrebuiltCaptureResult | null): void;
497
+ }
498
+
499
+ export function timberBuildReport(ctx: PluginContext): Plugin & { api: BuildReportStep } {
492
500
  let logger: Logger | null = null;
493
501
  let chunkSizes: Map<string, ChunkSize> | null = null;
494
502
  let clientBundle: Record<string, OutputChunkLike> | null = null;
495
- let reported = false;
496
- let deferReport = false;
497
503
  const buildStart = performance.now();
498
504
 
505
+ function printRouteTable(): void {
506
+ if (!ctx.routeTree || !chunkSizes || !clientBundle || !logger) return;
507
+
508
+ const outputMode = ctx.config.output ?? 'server';
509
+ const clientJsDisabled = ctx.clientJavascript.disabled;
510
+ const { entries, sharedGzip } = clientJsDisabled
511
+ ? {
512
+ entries: collectRoutes(ctx.routeTree).map((info) => ({
513
+ path: info.path,
514
+ type: classifyRoute(info.segments, outputMode),
515
+ size: 0,
516
+ firstLoadSize: 0,
517
+ })),
518
+ sharedGzip: 0,
519
+ }
520
+ : buildEntries(ctx.routeTree, chunkSizes, clientBundle, outputMode, ctx.appDir, ctx.root);
521
+ const elapsed = ((performance.now() - buildStart) / 1000).toFixed(2);
522
+ const lines = buildRouteReport(entries, sharedGzip);
523
+
524
+ logger.info('');
525
+ for (const line of lines) logger.info(line);
526
+
527
+ const warnings = buildWarnings(entries, ctx.config.budget);
528
+ if (warnings.length > 0) {
529
+ logger.info('');
530
+ for (const w of warnings) logger.warn(w);
531
+ }
532
+
533
+ logger.info('');
534
+ logger.info(
535
+ `✓ built ${entries.length} routes for all three environments (rsc, ssr, client) in ${elapsed}s`
536
+ );
537
+ logger.info('');
538
+ }
539
+
540
+ function printPrebuiltReport(prebuilt: PrebuiltCaptureResult | null): void {
541
+ if (!logger || !prebuilt) return;
542
+ const manifest = loadPrebuiltManifest(prebuilt.artifact?.path);
543
+ const prebuiltData = buildPrebuiltReportData(manifest, prebuilt.summary);
544
+ if (!prebuiltData) return;
545
+
546
+ logger.info('');
547
+ for (const line of buildPrebuiltReport(prebuiltData)) logger.info(line);
548
+ logger.info('');
549
+ }
550
+
499
551
  return {
500
552
  name: 'timber-build-report',
501
553
 
554
+ api: {
555
+ print(prebuilt) {
556
+ if (ctx.dev) return;
557
+ printRouteTable();
558
+ printPrebuiltReport(prebuilt);
559
+ },
560
+ },
561
+
502
562
  config(_cfg, { command }) {
503
563
  if (command !== 'build') return;
504
564
  return {
@@ -520,66 +580,6 @@ export function timberBuildReport(ctx: PluginContext): Plugin {
520
580
 
521
581
  chunkSizes = collectChunkSizes(bundle as Record<string, OutputChunkLike>);
522
582
  clientBundle = { ...bundle } as Record<string, OutputChunkLike>;
523
- deferReport = true; // skip client's closeBundle; emit after SSR's
524
- },
525
-
526
- closeBundle() {
527
- if (ctx.dev || reported) return;
528
-
529
- // The client build's closeBundle fires before SSR starts.
530
- // Defer one cycle so the report appears after all builds complete.
531
- if (deferReport) {
532
- deferReport = false;
533
- return;
534
- }
535
- if (!ctx.routeTree || !chunkSizes || !clientBundle || !logger) return;
536
-
537
- reported = true;
538
- const outputMode = ctx.config.output ?? 'server';
539
- const clientJsDisabled = ctx.clientJavascript.disabled;
540
- const { entries, sharedGzip } = clientJsDisabled
541
- ? {
542
- entries: collectRoutes(ctx.routeTree).map((info) => ({
543
- path: info.path,
544
- type: classifyRoute(info.segments, outputMode),
545
- size: 0,
546
- firstLoadSize: 0,
547
- })),
548
- sharedGzip: 0,
549
- }
550
- : buildEntries(ctx.routeTree, chunkSizes, clientBundle, outputMode, ctx.appDir, ctx.root);
551
- const elapsed = ((performance.now() - buildStart) / 1000).toFixed(2);
552
- const lines = buildRouteReport(entries, sharedGzip);
553
-
554
- logger.info('');
555
- for (const line of lines) logger.info(line);
556
-
557
- const warnings = buildWarnings(entries, ctx.config.budget);
558
- if (warnings.length > 0) {
559
- logger.info('');
560
- for (const w of warnings) logger.warn(w);
561
- }
562
-
563
- logger.info('');
564
- logger.info(
565
- `✓ built ${entries.length} routes for all three environments (rsc, ssr, client) in ${elapsed}s`
566
- );
567
- logger.info('');
568
- },
569
-
570
- buildApp: {
571
- order: 'post' as const,
572
- async handler() {
573
- if (ctx.dev || !logger) return;
574
- const manifest = loadPrebuiltManifest(ctx.buildDir);
575
- const prebuiltData = buildPrebuiltReportData(manifest, ctx.captureSummary);
576
- if (!prebuiltData) return;
577
-
578
- logger.info('');
579
- const prebuiltLines = buildPrebuiltReport(prebuiltData);
580
- for (const line of prebuiltLines) logger.info(line);
581
- logger.info('');
582
- },
583
583
  },
584
584
  };
585
585
  }
@@ -22,12 +22,15 @@ import type { PluginContext } from '../plugin-context.ts';
22
22
  import {
23
23
  sendErrorToOverlay,
24
24
  classifyErrorPhase,
25
- fixErrorStacktrace,
26
25
  parseFirstAppFrame,
27
26
  type ErrorPhase,
28
27
  } from '../dev-tools/overlay.ts';
29
28
  import { generateDevErrorPage } from '../dev-tools/error-page.ts';
30
- import { extractHmrOptions, type DevErrorHmrOptions } from '../dev-tools/dev-page-shell.ts';
29
+ import {
30
+ extractHmrOptions,
31
+ type DevErrorHmrOptions,
32
+ type DevHooks,
33
+ } from '../dev-tools/dev-page-shell.ts';
31
34
  import { addVirtualModuleContext } from '../config-validation.ts';
32
35
  import { registerDevDiscovery } from './dev-discovery.ts';
33
36
  import {
@@ -36,7 +39,6 @@ import {
36
39
  type GraphUpdateChannel,
37
40
  } from './graph-endpoint.ts';
38
41
  import { compressResponse } from '../server/compress.ts';
39
- import { isSsrStreamError } from '../server/primitives.ts';
40
42
  import { isMetadataRouteServePath } from '../server/metadata-routes.ts';
41
43
  import { canonicalize } from '../server/canonicalize.ts';
42
44
  import { matchUrlParts } from '../server/tree-match.ts';
@@ -317,37 +319,18 @@ function createTimberMiddleware(server: ViteDevServer, ctx: PluginContext) {
317
319
  const rscModule = await rscEnv.runner.import(RSC_ENTRY_ID);
318
320
  handler = rscModule.default as (req: Request) => Promise<Response>;
319
321
 
320
- // Wire pipeline errors into the browser error overlay.
321
- // Set devPipelineErrorHandler directly on the pipeline config —
322
- // no module-level singleton.
323
- const config = rscModule.pipelineConfig as
324
- | {
325
- devPipelineErrorHandler?: (error: Error, phase: string) => void;
326
- devHmrOptions?: DevErrorHmrOptions;
327
- }
328
- | undefined;
329
- if (config) {
330
- config.devPipelineErrorHandler = (error) => {
322
+ // Wire pipeline errors into the browser error overlay, and plumb the
323
+ // resolved HMR options into the RSC environment. The RSC entry can't
324
+ // read the Vite server config (separate module graph), but its dev 404
325
+ // page and fallback error page need the HMR endpoint (including Vite
326
+ // 8's required WS token) for auto-reload (TIM-1067).
327
+ const setDevHooks = rscModule.setDevHooks as ((hooks: DevHooks) => void) | undefined;
328
+ setDevHooks?.({
329
+ onPipelineError: (error) => {
331
330
  sendErrorToOverlay(server, error, classifyErrorPhase(error, projectRoot), projectRoot);
332
- };
333
- // Plumb the resolved HMR options into the RSC environment. The RSC
334
- // entry can't read the Vite server config (separate module graph),
335
- // but its dev 404 page and fallback error page need the HMR endpoint
336
- // (including Vite 8's required WS token) for auto-reload (TIM-1067).
337
- config.devHmrOptions = hmrOptions;
338
- }
339
-
340
- // Wire source-map handler so error pages show original positions.
341
- // fixErrorStacktrace rewrites the error's stack trace in-place using
342
- // the Vite dev server's module graph. See TIM-811.
343
- const setSourceMap = rscModule.setDevSourceMapHandler as
344
- | ((fn: (error: Error) => void) => void)
345
- | undefined;
346
- if (typeof setSourceMap === 'function') {
347
- setSourceMap((error: Error) => {
348
- fixErrorStacktrace(server, error);
349
- });
350
- }
331
+ },
332
+ hmrOptions,
333
+ });
351
334
  } catch (error) {
352
335
  // Module transform error — syntax error, missing import, etc.
353
336
  // Vite may already show its own overlay for these, but we still
@@ -404,18 +387,15 @@ function createTimberMiddleware(server: ViteDevServer, ctx: PluginContext) {
404
387
  // srvx skips its own writeHead since headers are already sent.
405
388
  await sendNodeResponse(res, finalResponse);
406
389
  } catch (error) {
407
- // Pipeline error — classify the phase, send to overlay, respond 500.
408
- // The dev server remains running for recovery on file fix + HMR.
390
+ // An error the pipeline did not turn into a response, or one sending
391
+ // the response threw — classify the phase, send to overlay, respond
392
+ // 500. The pipeline answers render errors itself (an SsrStreamError
393
+ // never gets here), so this sees the error as thrown. The dev server
394
+ // remains running for recovery on file fix + HMR.
409
395
  if (error instanceof Error) {
410
- // Unwrap SsrStreamError to show the real cause in the error overlay.
411
- // SsrStreamError wraps the original RSC render error with a generic
412
- // message; the developer needs to see the actual error (e.g.,
413
- // "useSegmentParams is not a function"), not the wrapper.
414
- const displayError =
415
- isSsrStreamError(error) && error.cause instanceof Error ? error.cause : error;
416
- const phase = classifyErrorPhase(displayError, projectRoot);
417
- sendErrorToOverlay(server, displayError, phase, projectRoot);
418
- respond500(res, displayError, phase, projectRoot, hmrOptions);
396
+ const phase = classifyErrorPhase(error, projectRoot);
397
+ sendErrorToOverlay(server, error, phase, projectRoot);
398
+ respond500(res, error, phase, projectRoot, hmrOptions);
419
399
  } else {
420
400
  process.stderr.write(`\x1b[31m[timber] Dev server error:\x1b[0m ${String(error)}\n`);
421
401
  respond500(res, error, 'render', projectRoot, hmrOptions);
@@ -16,6 +16,7 @@ import { resolve, dirname } from 'node:path';
16
16
  import { fileURLToPath } from 'node:url';
17
17
  import { existsSync } from 'node:fs';
18
18
  import type { PluginContext } from '../plugin-context.ts';
19
+ import { resolveRenderTimeoutMs } from '../server/render-timeout.ts';
19
20
 
20
21
  const __dirname = dirname(fileURLToPath(import.meta.url));
21
22
 
@@ -146,7 +147,7 @@ function generateConfigModule(ctx: PluginContext): string {
146
147
  topLoader: ctx.config.topLoader,
147
148
  debug: ctx.config.debug ?? false,
148
149
  serverTiming: ctx.config.serverTiming,
149
- renderTimeoutMs: ctx.config.renderTimeoutMs ?? 30_000,
150
+ renderTimeoutMs: resolveRenderTimeoutMs(ctx.config.renderTimeoutMs),
150
151
  // Auto-generated sitemap config — opt-in via timber.config.ts.
151
152
  // See design/16-metadata.md §"Auto-generated Sitemap"
152
153
  sitemap: ctx.config.sitemap,
@@ -21,12 +21,13 @@
21
21
  import { parseAst } from 'vite';
22
22
  import type { Plugin, ResolvedConfig, ViteDevServer } from 'vite';
23
23
  import type { PluginContext } from '../plugin-context.ts';
24
+ import type { BuildManifest } from '../server/build-manifest.ts';
24
25
  import {
25
26
  downloadAndCacheFonts,
26
27
  generateProductionFontFaces,
27
28
  resolveDevFontFaces,
28
29
  } from '../fonts/google.ts';
29
- import { fontUrlPrefix } from '../fonts/paths.ts';
30
+ import { FONT_OUTPUT_DIR, fontUrlPrefix } from '../fonts/paths.ts';
30
31
  import { FontPipeline } from '../fonts/pipeline.ts';
31
32
  import { runFontsTransform } from '../fonts/transform.ts';
32
33
  import { installFontDevMiddleware } from '../fonts/dev-middleware.ts';
@@ -57,15 +58,38 @@ export {
57
58
  parseLocalFontImportName,
58
59
  } from '../fonts/transform.ts';
59
60
 
61
+ /**
62
+ * What the post-build phase asks of the font plugin (plugins/post-build.ts).
63
+ * Called after every environment has been built, so the font entries are
64
+ * complete — no environment's `generateBundle` has to run after the build
65
+ * manifest exists.
66
+ */
67
+ export interface FontsBuildStep {
68
+ /** Write this build's font entries into the build manifest. */
69
+ contributeManifest(manifest: BuildManifest): void;
70
+ /**
71
+ * Directories of the client bundle this build filled with content-hashed
72
+ * font binaries — `[FONT_OUTPUT_DIR]` when any were emitted, else none.
73
+ */
74
+ immutableDirs(): string[];
75
+ }
76
+
60
77
  /**
61
78
  * Create the timber-fonts Vite plugin.
62
79
  */
63
- export function timberFonts(ctx: PluginContext): Plugin {
80
+ export function timberFonts(ctx: PluginContext): Plugin & { api: FontsBuildStep } {
64
81
  const pipeline = new FontPipeline({ hashOnRegister: !ctx.dev });
82
+ /** Whether the client environment emitted a binary this build. */
83
+ let emittedToClient = false;
65
84
 
66
85
  return {
67
86
  name: 'timber-fonts',
68
87
 
88
+ api: {
89
+ contributeManifest: (manifest) => writeFontManifest(pipeline, manifest, ctx.base),
90
+ immutableDirs: () => (emittedToClient ? [FONT_OUTPUT_DIR] : []),
91
+ },
92
+
69
93
  /**
70
94
  * Push Vite's resolved `base` into the pipeline so every font URL it
71
95
  * emits (@font-face src, manifest hrefs, dev middleware matching)
@@ -289,20 +313,24 @@ export function timberFonts(ctx: PluginContext): Plugin {
289
313
  },
290
314
 
291
315
  /**
292
- * Emit font binaries and build-manifest entries.
316
+ * Emit font binaries.
293
317
  *
294
318
  * All font binaries (Google and local) use content-hashed filenames
295
319
  * for immutable caching. Font CSS is handled by Vite's CSS pipeline
296
- * via virtual modules — we only emit binaries here.
320
+ * via virtual modules — we only emit binaries here. Manifest entries are
321
+ * written by the post-build phase through `api.contributeManifest`.
297
322
  */
298
323
  generateBundle() {
324
+ let emitted = 0;
299
325
  emitFontAssets(
300
326
  pipeline,
301
- (asset) => this.emitFile(asset),
327
+ (asset) => {
328
+ emitted++;
329
+ return this.emitFile(asset);
330
+ },
302
331
  (msg) => this.warn(msg)
303
332
  );
304
- if (!ctx.buildManifest) return;
305
- writeFontManifest(pipeline, ctx.buildManifest, ctx.base);
333
+ if (this.environment?.name === 'client') emittedToClient = emitted > 0;
306
334
  },
307
335
  };
308
336
  }