@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
@@ -18,11 +18,7 @@ import {
18
18
  RSC_KEY_PARAM,
19
19
  } from '../shared/rsc-cache-key.ts';
20
20
  import type { RscManifest, RscManifestEntry } from '../shared/rsc-manifest.ts';
21
- import {
22
- splitPayloadRoot,
23
- readPublishedParams,
24
- type PublishedParams,
25
- } from '../shared/payload-root.ts';
21
+ import { splitPayloadRoot, type PublishedParams } from '../shared/payload-root.ts';
26
22
  import { normalizeBasePath, stripBasePath, withBasePath } from '../shared/base-path.ts';
27
23
  import { rscPayloadPath } from '../shared/rsc-payload-path.ts';
28
24
  import type { SegmentInfo, StateTree } from '../shared/segment-info.ts';
@@ -401,7 +397,8 @@ export class VersionSkewError extends Error {
401
397
  /**
402
398
  * Thrown when the server returns an error for an RSC payload request.
403
399
  * The server sends X-Timber-Error header and a JSON body instead of a
404
- * broken RSC stream for any RenderError (4xx or 5xx). Caught in
400
+ * RSC stream it cannot answer in-SPA (a deny that needs a fallback page, a
401
+ * broken first read). Caught in
405
402
  * navigate() to trigger a hard navigation so the server can render
406
403
  * the error page as HTML.
407
404
  *
@@ -487,9 +484,12 @@ function trackStreamCompletion(body: ReadableStream<Uint8Array>): {
487
484
  // ─── Fetch ───────────────────────────────────────────────────────
488
485
 
489
486
  /**
490
- * Fetch an RSC payload from the server. If a decodeRsc function is provided,
491
- * the response is decoded into a React element tree via createFromFetch.
492
- * Otherwise, the raw response text is returned (test mode).
487
+ * Fetch an RSC payload from the server and start decoding it.
488
+ *
489
+ * Every response is classified here, once: a version-skew reload, a 204 or
490
+ * 3xx redirect, a server error envelope and a non-RSC body are each turned
491
+ * into their error before `decodeRsc` sees the body. There is no second
492
+ * path — tests decode real Flight bytes through the same code (TIM-1541).
493
493
  */
494
494
  export async function fetchRscPayload(
495
495
  url: string,
@@ -518,156 +518,118 @@ export async function fetchRscPayload(
518
518
  // during that window would otherwise still hit the network with an
519
519
  // already-aborted signal.
520
520
  signal?.throwIfAborted();
521
- if (deps.decodeRsc) {
522
- // Production path: use createFromFetch for streaming RSC decoding.
523
- // createFromFetch takes a Promise<Response> and progressively parses
524
- // the RSC Flight stream as chunks arrive.
525
- //
526
- // Intercept the response to read segment metadata before createFromFetch
527
- // consumes the body. Reading headers does NOT consume the body stream.
528
- const fetchPromise = deps.fetch(rscUrl, { headers, redirect: 'manual', signal });
529
- let segmentInfo: SegmentInfo[] | null = null;
530
- let skippedSegments: string[] | null = null;
531
- // Track when the full RSC body stream is consumed (not just shell).
532
- // Initialized to resolved for bodyless responses; overwritten when
533
- // the response has a body.
534
- let streamDone: Promise<void> = Promise.resolve();
535
-
536
- const wrappedPromise = fetchPromise.then((response) => {
537
- // Version skew detection (TIM-446): if the server signals a reload,
538
- // throw VersionSkewError so the caller (router navigate) can trigger
539
- // a full page reload.
540
- if (checkReloadSignal(response)) {
541
- throw new VersionSkewError();
542
- }
543
- // Detect server-side redirects. The server returns 204 + X-Timber-Redirect
544
- // for RSC payload requests instead of a raw 302, because fetch with
545
- // redirect: "manual" turns 302s into opaque redirects (status 0, null body)
546
- // which crashes createFromFetch when it tries to read the body stream.
547
- const redirectLocation =
548
- response.headers.get('X-Timber-Redirect') ||
549
- (response.status >= 300 && response.status < 400 ? response.headers.get('Location') : null);
550
- if (redirectLocation) {
551
- throw new RedirectError(redirectLocation);
552
- }
553
- // Detect server error responses. The server returns X-Timber-Error header
554
- // with a JSON body instead of a broken RSC stream for any RenderError
555
- // (4xx or 5xx). Hard-navigate so the server renders the error page as HTML.
556
- // See design/10-error-handling.md §"Error Page Rendering for Client Navigation"
557
- if (response.headers.get(TIMBER_ERROR_HEADER) === '1') {
558
- throw new ServerErrorResponse(response.status, url);
559
- }
560
- // Content-Type guard: reject non-RSC responses before createFromFetch
561
- // tries to parse the body as Flight data.
562
- // In static mode, accept octet-stream/text/plain/absent content-type
563
- // (static hosts serve .rsc files with these), but still reject 404s
564
- // and text/html (missing .rsc file → host returns 404 page or SPA
565
- // HTML fallback). See TIM-1231, TIM-1243, TIM-1247.
566
- if (staticMode) {
567
- const contentType = response.headers.get('content-type');
568
- if (
569
- !response.ok ||
570
- (contentType && contentType.split(';')[0].trim().toLowerCase() === 'text/html')
571
- ) {
572
- response.body?.cancel();
573
- throw new NonRscResponse(url);
574
- }
575
- } else {
576
- if (!isRscContentType(response.headers.get('content-type'))) {
577
- response.body?.cancel();
578
- throw new NonRscResponse(url);
579
- }
521
+ // createFromFetch takes a Promise<Response> and progressively parses
522
+ // the RSC Flight stream as chunks arrive.
523
+ //
524
+ // Intercept the response to read segment metadata before createFromFetch
525
+ // consumes the body. Reading headers does NOT consume the body stream.
526
+ const fetchPromise = deps.fetch(rscUrl, { headers, redirect: 'manual', signal });
527
+ let segmentInfo: SegmentInfo[] | null = null;
528
+ let skippedSegments: string[] | null = null;
529
+ // Track when the full RSC body stream is consumed (not just shell).
530
+ // Initialized to resolved for bodyless responses; overwritten when
531
+ // the response has a body.
532
+ let streamDone: Promise<void> = Promise.resolve();
533
+
534
+ const wrappedPromise = fetchPromise.then((response) => {
535
+ // Version skew detection (TIM-446): if the server signals a reload,
536
+ // throw VersionSkewError so the caller (router navigate) can trigger
537
+ // a full page reload.
538
+ if (checkReloadSignal(response)) {
539
+ throw new VersionSkewError();
540
+ }
541
+ // Detect server-side redirects. The server returns 204 + X-Timber-Redirect
542
+ // for RSC payload requests instead of a raw 302, because fetch with
543
+ // redirect: "manual" turns 302s into opaque redirects (status 0, null body)
544
+ // which crashes createFromFetch when it tries to read the body stream.
545
+ const redirectLocation =
546
+ response.headers.get('X-Timber-Redirect') ||
547
+ (response.status >= 300 && response.status < 400 ? response.headers.get('Location') : null);
548
+ if (redirectLocation) {
549
+ throw new RedirectError(redirectLocation);
550
+ }
551
+ // Detect server error responses. The server returns X-Timber-Error header
552
+ // with a JSON body instead of an RSC stream it cannot answer in-SPA.
553
+ // Hard-navigate so the server renders the error page as HTML.
554
+ // See design/10-error-handling.md §"Error Page Rendering for Client Navigation"
555
+ if (response.headers.get(TIMBER_ERROR_HEADER) === '1') {
556
+ throw new ServerErrorResponse(response.status, url);
557
+ }
558
+ // Content-Type guard: reject non-RSC responses before createFromFetch
559
+ // tries to parse the body as Flight data.
560
+ // In static mode, accept octet-stream/text/plain/absent content-type
561
+ // (static hosts serve .rsc files with these), but still reject 404s
562
+ // and text/html (missing .rsc file → host returns 404 page or SPA
563
+ // HTML fallback). See TIM-1231, TIM-1243, TIM-1247.
564
+ if (staticMode) {
565
+ const contentType = response.headers.get('content-type');
566
+ if (
567
+ !response.ok ||
568
+ (contentType && contentType.split(';')[0].trim().toLowerCase() === 'text/html')
569
+ ) {
570
+ response.body?.cancel();
571
+ throw new NonRscResponse(url);
580
572
  }
581
- // Metadata (<title>/<meta>/<link>) now rides the RSC Flight payload
582
- // as React elements — React 19 Float handles them. See TIM-1151.
583
- segmentInfo = extractSegmentInfo(response);
584
- skippedSegments = extractSkippedSegments(response);
585
-
586
- // Wrap the body to track full stream consumption. createFromFetch's
587
- // thenable resolves when the root model (shell) arrives, but we need
588
- // to know when ALL chunks are read — that is what the navigation
589
- // promise resolving means, and what keeps the pending store set.
590
- if (response.body) {
591
- const tracked = trackStreamCompletion(response.body);
592
- streamDone = tracked.done;
593
- streamDone.catch(() => {}); // prevent unhandled rejection
594
- return new Response(tracked.body, {
595
- headers: response.headers,
596
- status: response.status,
597
- });
573
+ } else {
574
+ if (!isRscContentType(response.headers.get('content-type'))) {
575
+ response.body?.cancel();
576
+ throw new NonRscResponse(url);
598
577
  }
599
- return response;
600
- });
601
- // Await headers so segmentInfo is populated.
602
- await wrappedPromise;
603
- // Start decoding but do NOT await — return the in-progress thenable.
604
- // React can render a Flight thenable directly: it suspends on unresolved
605
- // parts and progressively renders as chunks arrive, spreading work across
606
- // frames instead of blocking the main thread in one burst.
607
- const root = deps.decodeRsc(wrappedPromise);
608
- // One split, one root: the tree and the params it was rendered with come
609
- // apart here and nowhere else, so nothing downstream has to keep them
610
- // paired by hand.
611
- const { tree: payload, params } = splitPayloadRoot(root);
612
- // Combine stream completion with payload error propagation.
613
- // streamDone marks the end of the RSC stream, which is what the
614
- // navigation promise resolves on. payloadError propagates
615
- // decode failures (stale client references, Flight parse errors)
616
- // so the router's catch block can trigger recovery (stale reload).
617
- const payloadError = new Promise<void>((_, reject) => {
618
- Promise.resolve(root).then(() => {}, reject);
619
- });
620
- payloadError.catch(() => {});
621
- const decodePromise = Promise.race([streamDone, payloadError]);
622
- // Mark handled, like payloadError above. The same rejection reaches the
623
- // router through `payload`, and a navigation that recovers by hard
624
- // navigating (version skew, non-RSC response) hangs deliberately and never
625
- // awaits this one — leaving it to surface as an unhandled rejection.
626
- decodePromise.catch(() => {});
627
- return {
628
- payload,
629
- params,
630
- decodePromise,
631
- segmentInfo,
632
- skippedSegments,
633
- };
634
- }
635
- // Test/fallback path: return raw text
636
- const response = await deps.fetch(rscUrl, { headers, redirect: 'manual', signal });
637
- // Check for redirect in test path too
638
- if (response.status >= 300 && response.status < 400) {
639
- const location = response.headers.get('Location');
640
- if (location) {
641
- throw new RedirectError(location);
642
- }
643
- }
644
- // Server error guard (same as production path above).
645
- if (response.headers.get(TIMBER_ERROR_HEADER) === '1') {
646
- throw new ServerErrorResponse(response.status, url);
647
- }
648
- // Content-Type guard (same as production path above). See TIM-1231, TIM-1243, TIM-1247.
649
- if (staticMode) {
650
- const fallbackContentType = response.headers.get('content-type');
651
- if (
652
- !response.ok ||
653
- (fallbackContentType &&
654
- fallbackContentType.split(';')[0].trim().toLowerCase() === 'text/html')
655
- ) {
656
- response.body?.cancel();
657
- throw new NonRscResponse(url);
658
578
  }
659
- } else {
660
- if (!isRscContentType(response.headers.get('content-type'))) {
661
- response.body?.cancel();
662
- throw new NonRscResponse(url);
579
+ // Metadata (<title>/<meta>/<link>) now rides the RSC Flight payload
580
+ // as React elements — React 19 Float handles them. See TIM-1151.
581
+ segmentInfo = extractSegmentInfo(response);
582
+ skippedSegments = extractSkippedSegments(response);
583
+
584
+ // Wrap the body to track full stream consumption. createFromFetch's
585
+ // thenable resolves when the root model (shell) arrives, but we need
586
+ // to know when ALL chunks are read — that is what the navigation
587
+ // promise resolving means, and what keeps the pending store set.
588
+ if (response.body) {
589
+ const tracked = trackStreamCompletion(response.body);
590
+ streamDone = tracked.done;
591
+ streamDone.catch(() => {}); // prevent unhandled rejection
592
+ return new Response(tracked.body, {
593
+ headers: response.headers,
594
+ status: response.status,
595
+ });
663
596
  }
664
- }
665
- // Test/fallback path: raw text carries no payload root, so no params.
597
+ return response;
598
+ });
599
+ // Await headers so segmentInfo is populated.
600
+ await wrappedPromise;
601
+ // Start decoding but do NOT await — return the in-progress thenable.
602
+ // React can render a Flight thenable directly: it suspends on unresolved
603
+ // parts and progressively renders as chunks arrive, spreading work across
604
+ // frames instead of blocking the main thread in one burst.
605
+ const root = deps.decodeRsc(wrappedPromise);
606
+ // One split, one root: the tree and the params it was rendered with come
607
+ // apart here and nowhere else, so nothing downstream has to keep them
608
+ // paired by hand.
609
+ const { tree: payload, params } = splitPayloadRoot(root);
610
+ // Settles once the stream has ended AND the root has decoded, and rejects
611
+ // as soon as either fails. streamDone marks the end of the RSC stream,
612
+ // which is what the navigation promise resolves on; the root's rejection
613
+ // carries decode failures (stale client references, Flight parse errors)
614
+ // so the router's catch block can trigger recovery (stale reload).
615
+ //
616
+ // Not a race between the two: a payload that arrives whole — a small
617
+ // static `.rsc` file — ends its stream before Flight rejects the root it
618
+ // could not decode, and a race resolved on the stream, so the failure
619
+ // never reached recovery and the skew was never recorded (TIM-1541).
620
+ const rootDecoded = Promise.resolve(root).then(() => {});
621
+ rootDecoded.catch(() => {});
622
+ const decodePromise = Promise.all([streamDone, rootDecoded]).then(() => {});
623
+ // Mark handled, like rootDecoded above. The same rejection reaches the
624
+ // router through `payload`, and a navigation that recovers by hard
625
+ // navigating (version skew, non-RSC response) hangs deliberately and never
626
+ // awaits this one — leaving it to surface as an unhandled rejection.
627
+ decodePromise.catch(() => {});
666
628
  return {
667
- payload: await response.text(),
668
- params: readPublishedParams(undefined),
669
- decodePromise: null,
670
- segmentInfo: extractSegmentInfo(response),
671
- skippedSegments: extractSkippedSegments(response),
629
+ payload,
630
+ params,
631
+ decodePromise,
632
+ segmentInfo,
633
+ skippedSegments,
672
634
  };
673
635
  }
@@ -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
+ }