@timber-js/app 0.2.0-alpha.207 → 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 (526) 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-BndF-3Td.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-DwQBrLBz.js → status-page-marker-gaihi0KZ.js} +140 -28
  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 +20 -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 +95 -108
  132. package/dist/client/internal.js.map +1 -1
  133. package/dist/client/navigation-commit.d.ts +20 -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 +3 -8
  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/segment-cache.d.ts +44 -4
  149. package/dist/client/segment-cache.d.ts.map +1 -1
  150. package/dist/client/ssr-data.d.ts +18 -64
  151. package/dist/client/ssr-data.d.ts.map +1 -1
  152. package/dist/client/state.d.ts +2 -5
  153. package/dist/client/state.d.ts.map +1 -1
  154. package/dist/client/use-pathname.d.ts +1 -1
  155. package/dist/config-types.d.ts +2 -1
  156. package/dist/config-types.d.ts.map +1 -1
  157. package/dist/config-validation.d.ts.map +1 -1
  158. package/dist/cookies/index.js +1 -1
  159. package/dist/dev-tools/dev-page-shell.d.ts +17 -0
  160. package/dist/dev-tools/dev-page-shell.d.ts.map +1 -1
  161. package/dist/dev-tools/index.d.ts +1 -1
  162. package/dist/dev-tools/index.d.ts.map +1 -1
  163. package/dist/dev-tools/instrumentation.d.ts +17 -2
  164. package/dist/dev-tools/instrumentation.d.ts.map +1 -1
  165. package/dist/dev-tools/overlay.d.ts +6 -27
  166. package/dist/dev-tools/overlay.d.ts.map +1 -1
  167. package/dist/index.d.ts.map +1 -1
  168. package/dist/index.js +632 -373
  169. package/dist/index.js.map +1 -1
  170. package/dist/plugin-context.d.ts +26 -40
  171. package/dist/plugin-context.d.ts.map +1 -1
  172. package/dist/plugins/build-manifest.d.ts.map +1 -1
  173. package/dist/plugins/build-report.d.ts +15 -2
  174. package/dist/plugins/build-report.d.ts.map +1 -1
  175. package/dist/plugins/dev-server.d.ts.map +1 -1
  176. package/dist/plugins/entries.d.ts.map +1 -1
  177. package/dist/plugins/fonts.d.ts +19 -1
  178. package/dist/plugins/fonts.d.ts.map +1 -1
  179. package/dist/plugins/post-build.d.ts +110 -0
  180. package/dist/plugins/post-build.d.ts.map +1 -0
  181. package/dist/plugins/prebuilt-capture.d.ts +11 -4
  182. package/dist/plugins/prebuilt-capture.d.ts.map +1 -1
  183. package/dist/plugins/prebuilt.d.ts +17 -1
  184. package/dist/plugins/prebuilt.d.ts.map +1 -1
  185. package/dist/plugins/prerender-sugar.d.ts.map +1 -1
  186. package/dist/plugins/react-resolve.d.ts +49 -0
  187. package/dist/plugins/react-resolve.d.ts.map +1 -0
  188. package/dist/plugins/rsc-assets-manifest.d.ts +33 -0
  189. package/dist/plugins/rsc-assets-manifest.d.ts.map +1 -0
  190. package/dist/plugins/shims.d.ts.map +1 -1
  191. package/dist/plugins/static-build.d.ts +32 -9
  192. package/dist/plugins/static-build.d.ts.map +1 -1
  193. package/dist/routing/codegen-write.d.ts +0 -9
  194. package/dist/routing/codegen-write.d.ts.map +1 -1
  195. package/dist/routing/index.js +2 -2
  196. package/dist/routing/segment-codegen.d.ts.map +1 -1
  197. package/dist/server/access-gate.d.ts.map +1 -1
  198. package/dist/server/action-handler.d.ts +5 -4
  199. package/dist/server/action-handler.d.ts.map +1 -1
  200. package/dist/server/actions.d.ts +46 -7
  201. package/dist/server/actions.d.ts.map +1 -1
  202. package/dist/server/als-registry.d.ts +58 -5
  203. package/dist/server/als-registry.d.ts.map +1 -1
  204. package/dist/server/children-interception.d.ts.map +1 -1
  205. package/dist/server/cookie-context.d.ts +2 -23
  206. package/dist/server/cookie-context.d.ts.map +1 -1
  207. package/dist/server/csp-nonce.d.ts +0 -9
  208. package/dist/server/csp-nonce.d.ts.map +1 -1
  209. package/dist/server/csrf.d.ts +27 -4
  210. package/dist/server/csrf.d.ts.map +1 -1
  211. package/dist/server/debug.d.ts +0 -1
  212. package/dist/server/debug.d.ts.map +1 -1
  213. package/dist/server/default-logger.d.ts +2 -1
  214. package/dist/server/default-logger.d.ts.map +1 -1
  215. package/dist/server/deny-boundary.d.ts +12 -6
  216. package/dist/server/deny-boundary.d.ts.map +1 -1
  217. package/dist/server/deny-renderer.d.ts +2 -2
  218. package/dist/server/deny-renderer.d.ts.map +1 -1
  219. package/dist/server/error-boundary-wrapper.d.ts +7 -3
  220. package/dist/server/error-boundary-wrapper.d.ts.map +1 -1
  221. package/dist/server/fallback-error.d.ts +9 -2
  222. package/dist/server/fallback-error.d.ts.map +1 -1
  223. package/dist/server/head-response.d.ts +4 -4
  224. package/dist/server/html-injectors.d.ts.map +1 -1
  225. package/dist/server/index.d.ts +0 -1
  226. package/dist/server/index.d.ts.map +1 -1
  227. package/dist/server/index.js +3 -4
  228. package/dist/server/index.js.map +1 -1
  229. package/dist/server/instrumentation.d.ts +10 -3
  230. package/dist/server/instrumentation.d.ts.map +1 -1
  231. package/dist/server/internal.d.ts +1 -4
  232. package/dist/server/internal.d.ts.map +1 -1
  233. package/dist/server/internal.js +961 -581
  234. package/dist/server/internal.js.map +1 -1
  235. package/dist/server/json-status-response.d.ts +34 -0
  236. package/dist/server/json-status-response.d.ts.map +1 -0
  237. package/dist/server/logger.d.ts +26 -0
  238. package/dist/server/logger.d.ts.map +1 -1
  239. package/dist/server/param-coercion.d.ts +11 -6
  240. package/dist/server/param-coercion.d.ts.map +1 -1
  241. package/dist/server/pipeline-helpers.d.ts +95 -7
  242. package/dist/server/pipeline-helpers.d.ts.map +1 -1
  243. package/dist/server/pipeline-interception.d.ts +11 -0
  244. package/dist/server/pipeline-interception.d.ts.map +1 -1
  245. package/dist/server/pipeline-outcome.d.ts +11 -1
  246. package/dist/server/pipeline-outcome.d.ts.map +1 -1
  247. package/dist/server/pipeline-phases.d.ts +2 -2
  248. package/dist/server/pipeline-phases.d.ts.map +1 -1
  249. package/dist/server/pipeline.d.ts +23 -35
  250. package/dist/server/pipeline.d.ts.map +1 -1
  251. package/dist/server/prebuilt/capture-render.d.ts +25 -0
  252. package/dist/server/prebuilt/capture-render.d.ts.map +1 -0
  253. package/dist/server/prebuilt/capture-routes.d.ts +37 -0
  254. package/dist/server/prebuilt/capture-routes.d.ts.map +1 -0
  255. package/dist/server/prebuilt/capture-state.d.ts +79 -35
  256. package/dist/server/prebuilt/capture-state.d.ts.map +1 -1
  257. package/dist/server/prebuilt/lifetime.d.ts +38 -0
  258. package/dist/server/prebuilt/lifetime.d.ts.map +1 -0
  259. package/dist/server/prebuilt/slots.d.ts +7 -0
  260. package/dist/server/prebuilt/slots.d.ts.map +1 -1
  261. package/dist/server/prebuilt/synthetic-store.d.ts.map +1 -1
  262. package/dist/server/prebuilt-builder.d.ts.map +1 -1
  263. package/dist/server/prebuilt-runtime.d.ts.map +1 -1
  264. package/dist/server/primitives.d.ts +6 -81
  265. package/dist/server/primitives.d.ts.map +1 -1
  266. package/dist/server/react-cache-bridge.d.ts +59 -0
  267. package/dist/server/react-cache-bridge.d.ts.map +1 -0
  268. package/dist/server/react-cache-scope.d.ts +49 -0
  269. package/dist/server/react-cache-scope.d.ts.map +1 -0
  270. package/dist/server/render-timeout.d.ts +15 -0
  271. package/dist/server/render-timeout.d.ts.map +1 -1
  272. package/dist/server/render-utils.d.ts +9 -0
  273. package/dist/server/render-utils.d.ts.map +1 -1
  274. package/dist/server/request-context.d.ts +26 -5
  275. package/dist/server/request-context.d.ts.map +1 -1
  276. package/dist/server/route-element-builder.d.ts.map +1 -1
  277. package/dist/server/route-handler.d.ts.map +1 -1
  278. package/dist/server/route-matcher.d.ts +7 -0
  279. package/dist/server/route-matcher.d.ts.map +1 -1
  280. package/dist/server/rsc-entry/action-middleware-runner.d.ts +22 -22
  281. package/dist/server/rsc-entry/action-middleware-runner.d.ts.map +1 -1
  282. package/dist/server/rsc-entry/api-handler.d.ts +7 -0
  283. package/dist/server/rsc-entry/api-handler.d.ts.map +1 -1
  284. package/dist/server/rsc-entry/deny-fallback.d.ts +32 -6
  285. package/dist/server/rsc-entry/deny-fallback.d.ts.map +1 -1
  286. package/dist/server/rsc-entry/error-renderer.d.ts +11 -18
  287. package/dist/server/rsc-entry/error-renderer.d.ts.map +1 -1
  288. package/dist/server/rsc-entry/helpers.d.ts +0 -1
  289. package/dist/server/rsc-entry/helpers.d.ts.map +1 -1
  290. package/dist/server/rsc-entry/index.d.ts +5 -15
  291. package/dist/server/rsc-entry/index.d.ts.map +1 -1
  292. package/dist/server/rsc-entry/render-route.d.ts +5 -6
  293. package/dist/server/rsc-entry/render-route.d.ts.map +1 -1
  294. package/dist/server/rsc-entry/render-signals.d.ts +65 -0
  295. package/dist/server/rsc-entry/render-signals.d.ts.map +1 -0
  296. package/dist/server/rsc-entry/revalidate-renderer.d.ts +6 -16
  297. package/dist/server/rsc-entry/revalidate-renderer.d.ts.map +1 -1
  298. package/dist/server/rsc-entry/rsc-payload.d.ts +7 -3
  299. package/dist/server/rsc-entry/rsc-payload.d.ts.map +1 -1
  300. package/dist/server/rsc-entry/rsc-stream.d.ts +8 -53
  301. package/dist/server/rsc-entry/rsc-stream.d.ts.map +1 -1
  302. package/dist/server/rsc-entry/ssr-bridge.d.ts +2 -2
  303. package/dist/server/rsc-entry/ssr-bridge.d.ts.map +1 -1
  304. package/dist/server/rsc-entry/ssr-renderer.d.ts +9 -4
  305. package/dist/server/rsc-entry/ssr-renderer.d.ts.map +1 -1
  306. package/dist/server/rsc-entry/wrap-action-dispatch.d.ts +1 -1
  307. package/dist/server/rsc-entry/wrap-action-dispatch.d.ts.map +1 -1
  308. package/dist/server/signal-identity.d.ts +43 -0
  309. package/dist/server/signal-identity.d.ts.map +1 -0
  310. package/dist/server/slot-resolver.d.ts +4 -3
  311. package/dist/server/slot-resolver.d.ts.map +1 -1
  312. package/dist/server/slot-subtree-contain.d.ts.map +1 -1
  313. package/dist/server/ssr-bridge-types.d.ts +91 -53
  314. package/dist/server/ssr-bridge-types.d.ts.map +1 -1
  315. package/dist/server/ssr-entry.d.ts +8 -5
  316. package/dist/server/ssr-entry.d.ts.map +1 -1
  317. package/dist/server/ssr-render.d.ts +26 -40
  318. package/dist/server/ssr-render.d.ts.map +1 -1
  319. package/dist/server/ssr-wrappers.d.ts +1 -1
  320. package/dist/server/static-generator.d.ts.map +1 -1
  321. package/dist/server/stream-utils.d.ts +12 -0
  322. package/dist/server/stream-utils.d.ts.map +1 -1
  323. package/dist/server/tracing.d.ts +12 -16
  324. package/dist/server/tracing.d.ts.map +1 -1
  325. package/dist/server/types.d.ts +1 -1
  326. package/dist/server/version-skew.d.ts +3 -3
  327. package/dist/shared/csrf-reject.d.ts +16 -0
  328. package/dist/shared/csrf-reject.d.ts.map +1 -0
  329. package/dist/shared/error-digest.d.ts +28 -0
  330. package/dist/shared/error-digest.d.ts.map +1 -0
  331. package/dist/shared/payload-root.d.ts +11 -10
  332. package/dist/shared/payload-root.d.ts.map +1 -1
  333. package/dist/shared/rsc-payload-path.d.ts +6 -0
  334. package/dist/shared/rsc-payload-path.d.ts.map +1 -1
  335. package/dist/utils/write-file-atomic.d.ts +17 -0
  336. package/dist/utils/write-file-atomic.d.ts.map +1 -0
  337. package/docs/api/30-api-server.mdx +17 -14
  338. package/docs/api/32-api-cache.mdx +51 -23
  339. package/docs/api/34-api-config.mdx +34 -6
  340. package/docs/api/36-cli.mdx +11 -1
  341. package/docs/learn/03-fetching-data.mdx +17 -1
  342. package/docs/learn/04-access-control.mdx +1 -1
  343. package/docs/learn/10-caching.mdx +29 -11
  344. package/docs/learn/11-middleware.mdx +8 -2
  345. package/docs/learn/12-error-handling.mdx +6 -1
  346. package/package.json +7 -3
  347. package/src/adapters/build-output-helper.ts +55 -53
  348. package/src/adapters/canonicalize-module.ts +29 -0
  349. package/src/adapters/cloudflare.ts +105 -63
  350. package/src/adapters/compress-module.ts +16 -5
  351. package/src/adapters/fs-identity.ts +2 -3
  352. package/src/adapters/nitro-presets.ts +0 -15
  353. package/src/adapters/nitro-preview.ts +272 -136
  354. package/src/adapters/nitro.ts +119 -82
  355. package/src/adapters/shared.ts +23 -14
  356. package/src/adapters/types.ts +110 -21
  357. package/src/analyze/graph-cache.ts +3 -4
  358. package/src/cache/json-lossy-check.ts +3 -9
  359. package/src/cache/singleflight.ts +5 -2
  360. package/src/cache/sizeof.ts +3 -1
  361. package/src/cache/tag-aware-handler.ts +43 -26
  362. package/src/cli-check.ts +8 -98
  363. package/src/cli-context.ts +119 -0
  364. package/src/cli.ts +19 -28
  365. package/src/client/browser-dev.ts +1 -1
  366. package/src/client/browser-entry/action-dispatch.ts +26 -4
  367. package/src/client/browser-entry/hydrate.ts +53 -58
  368. package/src/client/browser-entry/index.ts +16 -27
  369. package/src/client/browser-entry/post-hydration.ts +6 -40
  370. package/src/client/browser-entry/router-init.ts +66 -84
  371. package/src/client/error-boundary.tsx +9 -41
  372. package/src/client/error-reconstituter.tsx +10 -5
  373. package/src/client/history.ts +35 -21
  374. package/src/client/index.ts +0 -1
  375. package/src/client/internal.ts +2 -7
  376. package/src/client/navigation-commit.ts +41 -18
  377. package/src/client/navigation-context.ts +3 -39
  378. package/src/client/react-root.ts +3 -2
  379. package/src/client/router-pipeline.ts +96 -132
  380. package/src/client/router-types.ts +46 -44
  381. package/src/client/router-url.ts +32 -0
  382. package/src/client/router.ts +62 -21
  383. package/src/client/rsc-fetch.ts +117 -155
  384. package/src/client/segment-cache.ts +110 -11
  385. package/src/client/ssr-data.ts +19 -80
  386. package/src/client/state.ts +2 -9
  387. package/src/client/use-pathname.ts +1 -1
  388. package/src/config-types.ts +2 -1
  389. package/src/config-validation.ts +2 -1
  390. package/src/dev-tools/dev-page-shell.ts +18 -0
  391. package/src/dev-tools/index.ts +0 -2
  392. package/src/dev-tools/instrumentation.ts +50 -2
  393. package/src/dev-tools/overlay.ts +8 -238
  394. package/src/index.ts +26 -14
  395. package/src/plugin-context.ts +39 -40
  396. package/src/plugins/build-manifest.ts +4 -11
  397. package/src/plugins/build-report.ts +70 -70
  398. package/src/plugins/dev-server.ts +24 -44
  399. package/src/plugins/entries.ts +2 -1
  400. package/src/plugins/fonts.ts +35 -7
  401. package/src/plugins/post-build.ts +327 -0
  402. package/src/plugins/prebuilt-capture.ts +28 -32
  403. package/src/plugins/prebuilt.ts +54 -39
  404. package/src/plugins/prerender-sugar.ts +0 -4
  405. package/src/plugins/react-resolve.ts +149 -0
  406. package/src/plugins/{adapter-build.ts → rsc-assets-manifest.ts} +20 -109
  407. package/src/plugins/shims.ts +1 -0
  408. package/src/plugins/static-build.ts +42 -74
  409. package/src/routing/codegen-write.ts +25 -3
  410. package/src/routing/segment-codegen.ts +3 -2
  411. package/src/rsc-runtime/vendor-types.d.ts +8 -0
  412. package/src/server/access-gate.tsx +2 -1
  413. package/src/server/action-client.ts +1 -1
  414. package/src/server/action-handler.ts +253 -110
  415. package/src/server/actions.ts +73 -25
  416. package/src/server/als-registry.ts +73 -5
  417. package/src/server/chain-url-parts.ts +1 -1
  418. package/src/server/children-interception.ts +2 -1
  419. package/src/server/cookie-context.ts +18 -48
  420. package/src/server/csp-nonce.ts +0 -12
  421. package/src/server/csrf.ts +140 -8
  422. package/src/server/debug.ts +0 -1
  423. package/src/server/default-logger.ts +2 -1
  424. package/src/server/deny-boundary.ts +25 -13
  425. package/src/server/deny-renderer.ts +30 -97
  426. package/src/server/error-boundary-wrapper.ts +7 -3
  427. package/src/server/fallback-error.ts +26 -11
  428. package/src/server/flight-scripts.ts +1 -1
  429. package/src/server/head-response.ts +4 -4
  430. package/src/server/html-injector-core.ts +2 -2
  431. package/src/server/html-injectors.ts +2 -4
  432. package/src/server/index.ts +0 -4
  433. package/src/server/instrumentation.ts +10 -3
  434. package/src/server/internal.ts +1 -6
  435. package/src/server/json-status-response.ts +105 -0
  436. package/src/server/logger.ts +39 -3
  437. package/src/server/param-coercion.ts +15 -12
  438. package/src/server/pipeline-helpers.ts +257 -12
  439. package/src/server/pipeline-interception.ts +133 -0
  440. package/src/server/pipeline-outcome.ts +103 -31
  441. package/src/server/pipeline-phases.ts +127 -237
  442. package/src/server/pipeline.ts +204 -207
  443. package/src/server/prebuilt/capture-render.ts +118 -0
  444. package/src/server/prebuilt/capture-routes.ts +104 -0
  445. package/src/server/prebuilt/capture-state.ts +155 -48
  446. package/src/server/prebuilt/lifetime.ts +151 -0
  447. package/src/server/prebuilt/slots.ts +14 -2
  448. package/src/server/prebuilt/synthetic-store.ts +3 -0
  449. package/src/server/prebuilt-builder.ts +30 -320
  450. package/src/server/prebuilt-runtime.ts +125 -129
  451. package/src/server/primitives.ts +8 -168
  452. package/src/server/react-cache-bridge.ts +124 -0
  453. package/src/server/react-cache-scope.ts +104 -0
  454. package/src/server/render-timeout.ts +20 -0
  455. package/src/server/render-utils.ts +11 -1
  456. package/src/server/request-context.ts +36 -9
  457. package/src/server/route-element-builder.ts +11 -6
  458. package/src/server/route-handler.ts +36 -23
  459. package/src/server/route-matcher.ts +15 -1
  460. package/src/server/rsc-entry/action-middleware-runner.ts +79 -123
  461. package/src/server/rsc-entry/api-handler.ts +27 -103
  462. package/src/server/rsc-entry/deny-fallback.ts +93 -26
  463. package/src/server/rsc-entry/error-renderer.ts +39 -91
  464. package/src/server/rsc-entry/helpers.ts +2 -4
  465. package/src/server/rsc-entry/index.ts +64 -58
  466. package/src/server/rsc-entry/render-route.ts +15 -80
  467. package/src/server/rsc-entry/render-signals.ts +108 -0
  468. package/src/server/rsc-entry/revalidate-renderer.ts +56 -57
  469. package/src/server/rsc-entry/rsc-payload.ts +28 -61
  470. package/src/server/rsc-entry/rsc-stream.ts +113 -213
  471. package/src/server/rsc-entry/ssr-bridge.ts +2 -2
  472. package/src/server/rsc-entry/ssr-renderer.ts +182 -263
  473. package/src/server/rsc-entry/wrap-action-dispatch.ts +12 -14
  474. package/src/server/signal-identity.ts +112 -0
  475. package/src/server/slot-resolver.ts +18 -18
  476. package/src/server/slot-subtree-contain.ts +2 -1
  477. package/src/server/ssr-bridge-types.ts +92 -56
  478. package/src/server/ssr-entry.ts +87 -111
  479. package/src/server/ssr-render.ts +55 -64
  480. package/src/server/ssr-wrappers.tsx +2 -2
  481. package/src/server/static-generator.ts +7 -42
  482. package/src/server/static-not-found.ts +3 -3
  483. package/src/server/stream-utils.ts +51 -0
  484. package/src/server/tracing.ts +58 -75
  485. package/src/server/types.ts +1 -1
  486. package/src/server/version-skew.ts +5 -5
  487. package/src/shared/csrf-reject.ts +15 -0
  488. package/src/shared/error-digest.ts +46 -0
  489. package/src/shared/payload-root.ts +11 -10
  490. package/src/shared/rsc-payload-path.ts +8 -1
  491. package/src/utils/write-file-atomic.ts +32 -0
  492. package/dist/_chunks/actions-jNrXdzgs.js +0 -346
  493. package/dist/_chunks/actions-jNrXdzgs.js.map +0 -1
  494. package/dist/_chunks/als-registry-C6kcfprT.js.map +0 -1
  495. package/dist/_chunks/build-manifest-DTmSGLRz.js.map +0 -1
  496. package/dist/_chunks/build-output-helper-9dqCv1pZ.js.map +0 -1
  497. package/dist/_chunks/cache-api-CUD9Ezaq.js.map +0 -1
  498. package/dist/_chunks/cli-check-G8o30ldg.js.map +0 -1
  499. package/dist/_chunks/convention-lint-5KzoMg_A.js.map +0 -1
  500. package/dist/_chunks/dev-server-BzBxgYAV.js.map +0 -1
  501. package/dist/_chunks/error-boundary-BndF-3Td.js.map +0 -1
  502. package/dist/_chunks/fs-identity-D7vb6GdI.js.map +0 -1
  503. package/dist/_chunks/graph-cache-CP4GEmf9.js.map +0 -1
  504. package/dist/_chunks/json-lossy-check-ClNvBM_3.js.map +0 -1
  505. package/dist/_chunks/logger-k2DQ4EUf.js.map +0 -1
  506. package/dist/_chunks/navigation-context-D0TU0Jog.js.map +0 -1
  507. package/dist/_chunks/plugin-context-8idfR3UZ.js.map +0 -1
  508. package/dist/_chunks/primitives-DLAnvsrk.js.map +0 -1
  509. package/dist/_chunks/segment-context-D9_89u34.js +0 -34
  510. package/dist/_chunks/segment-context-D9_89u34.js.map +0 -1
  511. package/dist/_chunks/sizeof-lXffQ1Vr.js.map +0 -1
  512. package/dist/_chunks/ssr-data-D6T6Y3ef.js +0 -60
  513. package/dist/_chunks/ssr-data-D6T6Y3ef.js.map +0 -1
  514. package/dist/_chunks/state-FippDgxN.js.map +0 -1
  515. package/dist/_chunks/status-page-marker-DwQBrLBz.js.map +0 -1
  516. package/dist/client/types.d.ts +0 -14
  517. package/dist/client/types.d.ts.map +0 -1
  518. package/dist/plugins/adapter-build.d.ts +0 -38
  519. package/dist/plugins/adapter-build.d.ts.map +0 -1
  520. package/dist/server/asset-headers.d.ts +0 -32
  521. package/dist/server/asset-headers.d.ts.map +0 -1
  522. package/dist/server/dev-source-map.d.ts +0 -22
  523. package/dist/server/dev-source-map.d.ts.map +0 -1
  524. package/src/client/types.ts +0 -21
  525. package/src/server/asset-headers.ts +0 -59
  526. package/src/server/dev-source-map.ts +0 -31
@@ -1,17 +1,20 @@
1
1
  /**
2
2
  * SSR Data — per-request state for client hooks during server-side rendering.
3
3
  *
4
- * RSC and SSR are separate Vite module graphs (see design/18-build-system.md),
5
- * so the RSC environment's request-context ALS is not visible to SSR modules.
6
- * This module provides getter/setter functions that ssr-entry.ts uses to
7
- * populate per-request data for React's render.
4
+ * `useCookie()` and `<Link preserveSearchParams>` have no React context to
5
+ * read their request values from during SSR, so the SSR entry hands them
6
+ * the request's cookies and search string through this module.
7
+ * `useSearchParams()` reads NavigationContext and uses getSsrData() only to
8
+ * detect that it is rendering on the server. Route
9
+ * params do not travel here — client components read them from
10
+ * `ParamsContext`, decoded from the payload root.
8
11
  *
9
- * Request isolation: On the server, ssr-entry.ts registers an ALS-backed
10
- * provider via registerSsrDataProvider(). getSsrData() reads from the ALS
11
- * store, ensuring correct per-request data even when Suspense boundaries
12
- * resolve asynchronously across concurrent requests. The module-level
13
- * setSsrData/clearSsrData functions are kept as a fallback for tests
14
- * and environments without ALS.
12
+ * Request isolation: ssr-entry.ts registers an ALS-backed provider via
13
+ * registerSsrDataProvider(), so getSsrData() reads the current request's
14
+ * store even when Suspense boundaries resolve asynchronously across
15
+ * concurrent requests. There is no module-level fallback: outside an SSR
16
+ * render (in the browser, or before the provider is registered) there is no
17
+ * request, and getSsrData() returns undefined.
15
18
  *
16
19
  * IMPORTANT: This module must NOT import node:async_hooks or any Node.js-only
17
20
  * APIs, as it's imported by 'use client' hooks that are bundled for the browser.
@@ -22,20 +25,11 @@
22
25
  * See design/18-build-system.md §"Singleton State Registry"
23
26
  */
24
27
 
25
- import {
26
- ssrDataProvider,
27
- currentSsrData,
28
- _setSsrDataProvider,
29
- _setCurrentSsrData,
30
- } from './state.ts';
31
- import type { CoercedParams } from '../shared/param-value.ts';
32
- import type { SlotParamsRecord } from '../shared/slot-params.ts';
28
+ import { ssrDataProvider, _setSsrDataProvider } from './state.ts';
33
29
 
34
30
  // ─── Types ────────────────────────────────────────────────────────
35
31
 
36
32
  export interface SsrData {
37
- /** The request's URL pathname (e.g. '/dashboard/settings') */
38
- pathname: string;
39
33
  /**
40
34
  * The request's raw app-visible query string (`''` or `?…`), matching what
41
35
  * `window.location.search` will hold after hydration. The raw string is
@@ -46,28 +40,6 @@ export interface SsrData {
46
40
  search: string;
47
41
  /** The request's cookies as name→value pairs */
48
42
  cookies: Map<string, string>;
49
- /** The request's route params (e.g. { id: '123' }) */
50
- params: CoercedParams;
51
- /**
52
- * Per-slot params keyed by slot tree path, absent when the request rendered
53
- * no slot with params of its own (TIM-1285).
54
- */
55
- slotParams?: SlotParamsRecord;
56
- /**
57
- * Mutable reference to NavContext for error boundary → pipeline communication.
58
- *
59
- * When TimberErrorBoundary catches a DenySignal during SSR, it:
60
- * 1. Sets `statusCode` to the deny status (e.g., 403) — so the HTTP
61
- * Response has the correct status code without a re-render.
62
- * 2. Sets `_denyHandledByBoundary = true` — so the pipeline skips
63
- * the redundant renderDenyPage() re-render.
64
- *
65
- * This runs synchronously during Fizz rendering, BEFORE onShellReady,
66
- * so the status code is committed before any bytes are sent.
67
- *
68
- * See TIM-664, design/04-authorization.md §"React.cache Scope in Deny/Error Re-renders"
69
- */
70
- _navContext?: { statusCode?: number; _denyHandledByBoundary?: boolean };
71
43
  }
72
44
 
73
45
  // ─── ALS-Backed Provider ─────────────────────────────────────────
@@ -87,53 +59,20 @@ export interface SsrData {
87
59
  // See timber-shims plugin resolveId for details.
88
60
 
89
61
  /**
90
- * Register an ALS-backed SSR data provider. Called once at module load
91
- * by ssr-entry.ts to wire up per-request data via AsyncLocalStorage.
92
- *
93
- * When registered, getSsrData() reads from the provider (ALS store)
94
- * instead of module-level state, ensuring correct isolation for
95
- * concurrent requests with streaming Suspense.
62
+ * Register the SSR data provider. Called once at module load by
63
+ * ssr-entry.ts to wire up per-request data via AsyncLocalStorage; tests
64
+ * register their own provider (and `undefined` to reset).
96
65
  */
97
- export function registerSsrDataProvider(provider: () => SsrData | undefined): void {
66
+ export function registerSsrDataProvider(provider: (() => SsrData | undefined) | undefined): void {
98
67
  _setSsrDataProvider(provider);
99
68
  }
100
69
 
101
- // ─── Module-Level Fallback ────────────────────────────────────────
102
- //
103
- // Used by tests and as a fallback when no ALS provider is registered.
104
-
105
- /**
106
- * Set the SSR data for the current request via module-level state.
107
- *
108
- * In production, ssr-entry.ts uses ALS (runWithSsrData) instead.
109
- * This function is retained for tests and as a fallback.
110
- */
111
- export function setSsrData(data: SsrData): void {
112
- _setCurrentSsrData(data);
113
- }
114
-
115
- /**
116
- * Clear the SSR data after rendering completes.
117
- *
118
- * In production, ALS scope handles cleanup automatically.
119
- * This function is retained for tests and as a fallback.
120
- */
121
- export function clearSsrData(): void {
122
- _setCurrentSsrData(undefined);
123
- }
124
-
125
70
  /**
126
71
  * Read the current request's SSR data. Returns undefined when called
127
72
  * outside an SSR render (i.e. on the client after hydration).
128
73
  *
129
- * Prefers the ALS-backed provider when registered (server-side),
130
- * falling back to module-level state (tests, legacy).
131
- *
132
74
  * Used by client hooks' server snapshot functions.
133
75
  */
134
76
  export function getSsrData(): SsrData | undefined {
135
- if (ssrDataProvider) {
136
- return ssrDataProvider();
137
- }
138
- return currentSsrData;
77
+ return ssrDataProvider?.();
139
78
  }
@@ -34,8 +34,8 @@ export function _setGlobalRouter(router: RouterInstance | null): void {
34
34
  // ─── SSR Data Provider (from ssr-data.ts) ──────────────────────────────────
35
35
 
36
36
  /**
37
- * ALS-backed SSR data provider. When registered, getSsrData() reads from
38
- * this function (ALS store) instead of module-level currentSsrData.
37
+ * ALS-backed SSR data provider, registered by the SSR entry. getSsrData()
38
+ * reads through it; unset in the browser.
39
39
  */
40
40
  export let ssrDataProvider: (() => SsrData | undefined) | undefined;
41
41
 
@@ -43,13 +43,6 @@ export function _setSsrDataProvider(provider: (() => SsrData | undefined) | unde
43
43
  ssrDataProvider = provider;
44
44
  }
45
45
 
46
- /** Fallback SSR data for tests and environments without ALS. */
47
- export let currentSsrData: SsrData | undefined;
48
-
49
- export function _setCurrentSsrData(data: SsrData | undefined): void {
50
- currentSsrData = data;
51
- }
52
-
53
46
  // ─── Search Params Cache (from use-search-params.ts) ────────────────────────
54
47
 
55
48
  /** Cached search string — avoids reparsing when URL hasn't changed. */
@@ -6,7 +6,7 @@
6
6
  *
7
7
  * One unconditional read of NavigationContext, on every side (TIM-1425):
8
8
  *
9
- * - In the browser, the provider wraps the RSC payload in renderRoot(), so
9
+ * - In the browser, the provider wraps the RSC payload in the router's `renderTree`, so
10
10
  * the pathname updates in the same render pass as the new tree.
11
11
  * - During SSR, the wrapper chain mounts the same provider with the request's
12
12
  * pathname (TIM-1424), so this is the identical code path — no ALS read,
@@ -136,7 +136,8 @@ export interface TimberUserConfig {
136
136
  * browser DevTools useful timing without internal details.
137
137
  * - `false` — no Server-Timing header at all.
138
138
  *
139
- * Default: `'detailed'` in dev, `'total'` in production.
139
+ * Default: `'total'` in dev and production. Detailed mode logs a
140
+ * stream-lifecycle line per request, so it is opt-in everywhere.
140
141
  *
141
142
  * This is separate from `debug` / `TIMBER_DEBUG` — it's an intentional
142
143
  * decision to expose timing data to clients, not a side effect of debug
@@ -10,6 +10,7 @@
10
10
 
11
11
  import { createRequire } from 'node:module';
12
12
  import type { TimberUserConfig } from './config-types.ts';
13
+ import { DEFAULT_RENDER_TIMEOUT_MS, RENDER_TIMEOUT_CEILING_MS } from './server/render-timeout.ts';
13
14
 
14
15
  // ─── Types ──────────────────────────────────────────────────────────────────
15
16
 
@@ -126,7 +127,7 @@ export function validateConfig(config: TimberUserConfig): ConfigError[] {
126
127
  field: 'renderTimeoutMs',
127
128
  message: `renderTimeoutMs must be a non-negative number (got ${JSON.stringify(config.renderTimeoutMs)}).`,
128
129
  value: config.renderTimeoutMs,
129
- suggestion: 'Use renderTimeoutMs: 30000 (default). Setting 0 uses a 120s safety ceiling.',
130
+ suggestion: `Use renderTimeoutMs: ${DEFAULT_RENDER_TIMEOUT_MS} (default). Setting 0 uses a ${RENDER_TIMEOUT_CEILING_MS / 1000}s safety ceiling.`,
130
131
  });
131
132
  }
132
133
  }
@@ -31,6 +31,24 @@ export interface DevErrorHmrOptions {
31
31
  token?: string;
32
32
  }
33
33
 
34
+ /**
35
+ * Hooks the dev server hands the RSC environment, which cannot read the
36
+ * Vite server itself (separate module graph). The RSC entry exports
37
+ * `setDevHooks()`; the dev server calls it after importing the entry.
38
+ *
39
+ * Declared here, not in the RSC entry, so the dev-server plugin can name
40
+ * the type without pulling the RSC entry into its type graph.
41
+ */
42
+ export interface DevHooks {
43
+ /** Forwards a pipeline error to the browser error overlay. */
44
+ onPipelineError?: (error: Error, phase: string) => void;
45
+ /**
46
+ * The resolved HMR endpoint for the auto-reload WebSocket on the dev 404
47
+ * page and the fallback error page (TIM-1067).
48
+ */
49
+ hmrOptions?: DevErrorHmrOptions;
50
+ }
51
+
34
52
  /**
35
53
  * Extract HMR connection options from a Vite resolved config.
36
54
  * Used by the dev server to pass HMR config to the dev page generators
@@ -28,11 +28,9 @@ export {
28
28
  // Error overlay (Vite integration)
29
29
  export {
30
30
  sendErrorToOverlay,
31
- fixErrorStacktrace,
32
31
  classifyErrorPhase,
33
32
  extractComponentStack,
34
33
  parseFirstAppFrame,
35
- calculateModuleRunnerOffset,
36
34
  formatTerminalError,
37
35
  PHASE_LABELS,
38
36
  type ErrorPhase,
@@ -8,13 +8,20 @@
8
8
  * 2. Span processing: collects completed spans per-request and drives
9
9
  * dev log output when the root span ends.
10
10
  *
11
- * Only activated in dev mode — zero overhead in production.
11
+ * Activated in dev, and in production only when TIMBER_DEBUG is set
12
+ * (design/13-security.md §"Debug Flag Security Boundary"); otherwise never
13
+ * loaded.
12
14
  *
13
15
  * Design ref: 17-logging.md §"Dev Logging", 21-dev-server.md §"Dev Logging"
14
16
  */
15
17
 
16
18
  import * as api from '@opentelemetry/api';
17
- import type { SpanProcessor, ReadableSpan } from '@opentelemetry/sdk-trace-base';
19
+ import { AsyncLocalStorageContextManager } from '@opentelemetry/context-async-hooks';
20
+ import {
21
+ BasicTracerProvider,
22
+ type SpanProcessor,
23
+ type ReadableSpan,
24
+ } from '@opentelemetry/sdk-trace-base';
18
25
  import type { Span, Context } from '@opentelemetry/api';
19
26
  import {
20
27
  formatSpanTree,
@@ -211,3 +218,44 @@ export class DevSpanProcessor implements SpanProcessor {
211
218
  // Nothing to flush — output happens synchronously in onEnd.
212
219
  }
213
220
  }
221
+
222
+ // ─── SDK Registration ───────────────────────────────────────────────────────
223
+
224
+ /**
225
+ * Register a context manager and a tracer provider feeding DevSpanProcessor
226
+ * as the OTEL globals. Called once by initDevTracing().
227
+ *
228
+ * The SDK packages are imported statically here, and this module is the one
229
+ * initDevTracing() loads dynamically. A dynamic import of the CJS-only
230
+ * @opentelemetry/context-async-hooks bundles into a chunk whose namespace
231
+ * holds the exports on `default`, and loaders that rewrite such namespaces
232
+ * (tsx exposes the named exports and drops `default`) hand back no
233
+ * constructor at all (TIM-1554). A static import calls the bundled CJS
234
+ * factory directly and has no namespace to rewrite.
235
+ */
236
+ export function registerDevTracing(config: DevLoggerConfig): void {
237
+ // Construct everything before registering anything: a constructor that
238
+ // throws must leave no half-registered global state behind.
239
+
240
+ // A minimal TracerProvider with our DevSpanProcessor. If the user also
241
+ // configures an SDK in register(), their provider will coexist — the
242
+ // global provider set last wins for new tracers, but our processor
243
+ // captures all spans from the timber.js tracer.
244
+ const provider = new BasicTracerProvider({
245
+ spanProcessors: [new DevSpanProcessor(config)],
246
+ });
247
+
248
+ // A context manager so OTEL can propagate the active span across async
249
+ // boundaries. Without this, startActiveSpan can't make spans "active" —
250
+ // child spans get random trace IDs and getActiveSpan() returns undefined.
251
+ const contextManager = new AsyncLocalStorageContextManager();
252
+
253
+ contextManager.enable();
254
+ api.context.setGlobalContextManager(contextManager);
255
+ api.trace.setGlobalTracerProvider(provider);
256
+
257
+ // Fetch spans nest under the active component span in the dev log tree.
258
+ // Patched here, not by the caller, so one guarded import of this module
259
+ // covers all of tracing setup (TIM-1554).
260
+ instrumentDevFetch();
261
+ }
@@ -4,51 +4,15 @@
4
4
  * Integrates with Vite's built-in error overlay (`server.hot.send`) rather
5
5
  * than implementing a custom overlay.
6
6
  *
7
- * Stack trace source-mapping uses the correct Vite environment module graph:
8
- * RSC errors use `server.environments.rsc.moduleGraph`, SSR/other errors use
9
- * `server.environments.ssr.moduleGraph`. `server.ssrFixStacktrace()` is NOT
10
- * used because it hardcodes the SSR module graph, which doesn't contain
11
- * source maps for RSC modules (separate Vite environment with its own
12
- * module graph). This caused RSC errors to show transpiled line numbers
13
- * instead of original source positions.
7
+ * Stacks are shown as they arrive: Vite's module runner already reports
8
+ * source positions for the code it runs, and a second mapping pass moves
9
+ * them (TIM-1555).
14
10
  *
15
- * Design doc: 21-dev-server.md §"Error Overlay"
11
+ * Design doc: 21-dev-server.md §"Error Overlay", §"RSC Source-Mapping"
16
12
  */
17
13
 
18
- import type { ViteDevServer, DevEnvironment } from 'vite';
19
- import { createRequire } from 'node:module';
20
- import { resolve, dirname } from 'node:path';
21
- import { classifyFrame, type FrameType } from './stack-classifier.ts';
22
-
23
- // ─── Trace Mapping (lazy-loaded) ─────────────────────────────────────────────
24
-
25
- interface TraceMappingModule {
26
- TraceMap: new (map: unknown) => unknown;
27
- originalPositionFor: (
28
- map: unknown,
29
- needle: { line: number; column: number }
30
- ) => { source: string | null; line: number | null; column: number | null };
31
- }
32
-
33
- let _traceMapping: TraceMappingModule | null = null;
34
-
35
- /**
36
- * Lazy-load @jridgewell/trace-mapping from Vite's dependency tree.
37
- * Vite bundles it internally; we resolve from Vite's package to avoid
38
- * adding a direct dependency.
39
- */
40
- function getTraceMapping(): TraceMappingModule {
41
- if (_traceMapping) return _traceMapping;
42
- // Resolve from Vite's package location so we pick up its transitive
43
- // @jridgewell/trace-mapping without declaring it as a direct dependency.
44
- // createRequire(import.meta.url) gives us ESM-compatible require (TIM-796),
45
- // then we hop to Vite's path to reach its dependency tree (TIM-804).
46
- const esmRequire = createRequire(import.meta.url);
47
- const vitePath = esmRequire.resolve('vite');
48
- const viteRequire = createRequire(vitePath);
49
- _traceMapping = viteRequire('@jridgewell/trace-mapping') as TraceMappingModule;
50
- return _traceMapping;
51
- }
14
+ import type { ViteDevServer } from 'vite';
15
+ import { classifyFrame } from './stack-classifier.ts';
52
16
 
53
17
  // ─── Types ──────────────────────────────────────────────────────────────────
54
18
 
@@ -164,200 +128,13 @@ export function classifyErrorPhase(error: Error, projectRoot: string): ErrorPhas
164
128
  import { formatTerminalError as _formatTerminalError } from './terminal.ts';
165
129
  export const formatTerminalError = _formatTerminalError;
166
130
 
167
- // ─── Module Runner Offset ───────────────────────────────────────────────────
168
-
169
- /**
170
- * Dynamically compute the line offset that Vite's module runner adds
171
- * when wrapping modules in an async function.
172
- *
173
- * Vite's `calculateOffsetOnce()` uses the same technique: create a new
174
- * AsyncFunction, throw from line 1, and check where the engine reports
175
- * the error. The difference between the reported line and 1 is the offset.
176
- *
177
- * This is engine-dependent (currently 2 on Node 18-22) and could change
178
- * in future Node.js or V8 versions. Computing it at runtime ensures we
179
- * always match the actual behavior.
180
- */
181
- let _cachedOffset: number | null = null;
182
-
183
- export function calculateModuleRunnerOffset(): number {
184
- if (_cachedOffset !== null) return _cachedOffset;
185
-
186
- try {
187
- // Parse the AsyncFunction source to count wrapper lines before the body.
188
- // AsyncFunction.toString() returns something like:
189
- // "async function anonymous(\n) {\nBODY\n}"
190
- // The number of newlines before BODY is the offset Vite's module runner adds.
191
- // eslint-disable-next-line no-new-func -- intentional: mirrors Vite's technique
192
- const AsyncFunction = async function () {}.constructor as typeof Function;
193
- const wrapper = new AsyncFunction('BODY');
194
- const src = wrapper.toString();
195
- const bodyIndex = src.indexOf('BODY');
196
- if (bodyIndex === -1) {
197
- _cachedOffset = 2; // fallback
198
- return _cachedOffset;
199
- }
200
- const beforeBody = src.slice(0, bodyIndex);
201
- const newlineCount = (beforeBody.match(/\n/g) || []).length;
202
- _cachedOffset = newlineCount;
203
- } catch (e) {
204
- console.debug(
205
- '[timber] overlay offset calculation failed:',
206
- e instanceof Error ? e.message : e
207
- );
208
- _cachedOffset = 2; // fallback to known-good value
209
- }
210
-
211
- return _cachedOffset;
212
- }
213
-
214
- // ─── Stack Trace Source-Mapping ──────────────────────────────────────────────
215
-
216
- /**
217
- * Phases where the error originated in the RSC environment.
218
- * These use `server.environments.rsc.moduleGraph` for source-mapping.
219
- */
220
- const RSC_PHASES: ReadonlySet<ErrorPhase> = new Set(['render', 'access', 'middleware', 'handler']);
221
-
222
- /**
223
- * Rewrite an error's stack trace using the correct Vite environment module graph.
224
- *
225
- * `server.ssrFixStacktrace()` hardcodes `server.environments.ssr.moduleGraph`,
226
- * but RSC errors have stack frames pointing to modules loaded in the RSC
227
- * environment — a separate Vite module graph with separate transform results
228
- * and source maps. Using the SSR module graph silently fails to find the
229
- * modules, leaving transpiled/bundled line numbers in the stack trace.
230
- *
231
- * This function picks the RSC module graph for render-phase errors and falls
232
- * back to SSR for module-transform/proxy errors. If the first pass doesn't
233
- * rewrite any frames (e.g., mixed RSC+SSR stack), it tries the other graph.
234
- */
235
- function fixStacktraceForEnvironment(server: ViteDevServer, error: Error, phase: ErrorPhase): void {
236
- if (!error.stack) return;
237
-
238
- // Pick the primary environment based on error phase
239
- const primaryEnvName = RSC_PHASES.has(phase) ? 'rsc' : 'ssr';
240
- const fallbackEnvName = primaryEnvName === 'rsc' ? 'ssr' : 'rsc';
241
-
242
- const primaryEnv = server.environments[primaryEnvName] as DevEnvironment | undefined;
243
- const fallbackEnv = server.environments[fallbackEnvName] as DevEnvironment | undefined;
244
-
245
- // Try primary environment first
246
- if (primaryEnv?.moduleGraph) {
247
- const rewritten = rewriteStacktrace(error.stack, primaryEnv.moduleGraph);
248
- if (rewritten.changed) {
249
- error.stack = rewritten.stack;
250
- return;
251
- }
252
- }
253
-
254
- // Fall back to the other environment if primary didn't rewrite anything
255
- if (fallbackEnv?.moduleGraph) {
256
- const rewritten = rewriteStacktrace(error.stack, fallbackEnv.moduleGraph);
257
- if (rewritten.changed) {
258
- error.stack = rewritten.stack;
259
- return;
260
- }
261
- }
262
- }
263
-
264
- /**
265
- * Rewrite stack trace frames using source maps from an environment's module graph.
266
- *
267
- * Mirrors Vite's internal `ssrRewriteStacktrace` logic but works with any
268
- * `EnvironmentModuleGraph`, not just the SSR one.
269
- *
270
- * Returns the rewritten stack and whether any frames were actually changed.
271
- */
272
- function rewriteStacktrace(
273
- stack: string,
274
- moduleGraph: DevEnvironment['moduleGraph']
275
- ): { stack: string; changed: boolean } {
276
- let changed = false;
277
-
278
- const result = stack
279
- .split('\n')
280
- .map((line) => {
281
- return line.replace(
282
- /^ {4}at (?:(\S.*?)\s\()?(.+?):(\d+)(?::(\d+))?\)?/,
283
- (input, varName, id, lineStr, colStr) => {
284
- if (!id) return input;
285
-
286
- const mod = moduleGraph.getModuleById(id);
287
- const rawSourceMap = mod?.transformResult?.map;
288
- if (!rawSourceMap) return input;
289
-
290
- // Vite's module runner wraps each module in an async function,
291
- // adding N lines before the module body. The offset is computed
292
- // dynamically to match the actual engine behavior (see TIM-783).
293
- const OFFSET = calculateModuleRunnerOffset();
294
- const origLine = Number(lineStr) - OFFSET;
295
- const origCol = Number(colStr) - 1;
296
- if (origLine <= 0 || origCol < 0) return input;
297
-
298
- // Use @jridgewell/trace-mapping resolved from Vite's dependency tree.
299
- // Vite bundles it internally; we resolve from Vite's package location
300
- // to avoid adding a direct dependency.
301
- let pos: { source: string | null; line: number | null; column: number | null };
302
- try {
303
- const { TraceMap: TM, originalPositionFor: opf } = getTraceMapping();
304
- const traced = new TM(rawSourceMap);
305
- pos = opf(traced, { line: origLine, column: origCol });
306
- } catch (e) {
307
- console.debug(
308
- '[timber] source map tracing failed:',
309
- e instanceof Error ? e.message : e
310
- );
311
- return input;
312
- }
313
-
314
- if (!pos.source || pos.line == null) return input;
315
-
316
- changed = true;
317
- const source = `${resolve(dirname(id), pos.source)}:${pos.line}:${(pos.column ?? 0) + 1}`;
318
- const trimmedVarName = varName?.trim();
319
- if (!trimmedVarName || trimmedVarName === 'eval') return ` at ${source}`;
320
- return ` at ${trimmedVarName} (${source})`;
321
- }
322
- );
323
- })
324
- .join('\n');
325
-
326
- return { stack: result, changed };
327
- }
328
-
329
- // ─── Error Source-Mapping (exported for use by fallback-error.ts) ────────────
330
-
331
- /**
332
- * Source-map an error's stack trace using the Vite dev server's module graph.
333
- *
334
- * Exported so that the fallback error renderer (fallback-error.ts) can
335
- * source-map errors before rendering the dev error page. Without this,
336
- * the dev error page shows transpiled positions (e.g. page.tsx:1:1 instead
337
- * of page.tsx:4:9).
338
- *
339
- * See TIM-811.
340
- */
341
- export function fixErrorStacktrace(server: ViteDevServer, error: Error, phase?: ErrorPhase): void {
342
- fixStacktraceForEnvironment(
343
- server,
344
- error,
345
- phase ?? classifyErrorPhase(error, server.config.root)
346
- );
347
- }
348
-
349
131
  // ─── Overlay Integration ────────────────────────────────────────────────────
350
132
 
351
133
  /**
352
134
  * Send an error to Vite's browser overlay and log it to stderr.
353
135
  *
354
- * Uses `server.ssrFixStacktrace()` to map stack traces back to source,
355
- * then sends the error via `server.hot.send()` for the browser overlay.
356
- *
357
- * When `rscDebugComponents` is provided (dev mode only), the server
358
- * component tree context is appended to the error message. This helps
359
- * developers identify which server component caused the error without
360
- * exposing source code.
136
+ * Reads `error` and never writes it: the pipeline may render the same object
137
+ * on the fallback error page after reporting it here.
361
138
  *
362
139
  * The dev server remains running — errors are handled, not fatal.
363
140
  */
@@ -367,13 +144,6 @@ export function sendErrorToOverlay(
367
144
  phase: ErrorPhase,
368
145
  projectRoot: string
369
146
  ): void {
370
- // Fix stack trace to use source-mapped positions.
371
- // Use the RSC environment's module graph for render/access/middleware errors
372
- // (which originate in the RSC environment), and fall back to SSR for others.
373
- // server.ssrFixStacktrace() is NOT used — it hardcodes the SSR module graph
374
- // which doesn't contain source maps for RSC-loaded modules.
375
- fixStacktraceForEnvironment(server, error, phase);
376
-
377
147
  // Log to stderr with frame dimming
378
148
  const formatted = formatTerminalError(error, phase, projectRoot);
379
149
  process.stderr.write(`${formatted}\n`);