@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
@@ -32,7 +32,7 @@ export function getTraceId(): string {
32
32
  'It can only be used in middleware, access checks, server components, and server actions.'
33
33
  );
34
34
  }
35
- return store.traceId;
35
+ return store.request.traceId;
36
36
  }
37
37
 
38
38
  /**
@@ -57,31 +57,35 @@ export function generateTraceId(): string {
57
57
  * per-request ALS scope.
58
58
  */
59
59
  export function runWithTraceId<T>(id: string, fn: () => T): T {
60
- return traceAls.run({ traceId: id }, fn);
60
+ return traceAls.run({ request: { traceId: id } }, fn);
61
61
  }
62
62
 
63
63
  /**
64
- * Replace the trace ID in the current ALS store. Used when OTEL creates
65
- * a root span and we want to switch from the UUID fallback to the real
66
- * OTEL trace ID.
64
+ * Replace the request's trace ID. Used when OTEL creates the root span and
65
+ * we want to switch from the UUID fallback to the real OTEL trace ID. Writes
66
+ * the request's shared trace, so every scope in the request sees it —
67
+ * including the ones outside the span this runs in.
67
68
  */
68
- export function replaceTraceId(newTraceId: string, newSpanId?: string): void {
69
+ export function replaceTraceId(newTraceId: string): void {
69
70
  const store = traceAls.getStore();
70
71
  if (store) {
71
- store.traceId = newTraceId;
72
- store.spanId = newSpanId;
72
+ store.request.traceId = newTraceId;
73
73
  }
74
74
  }
75
75
 
76
76
  /**
77
- * Update the span ID in the current ALS store. Used when entering a new
78
- * OTEL span to keep log–trace correlation accurate.
77
+ * Run `fn` in a new trace scope for one span: the enclosing scope's request
78
+ * trace, with this span's pointers. A scope per span, not a save/restore on
79
+ * a shared store — spans overlap (MetadataCollector does not await
80
+ * `timber.metadata`), and a restore that runs after a sibling's would
81
+ * leave the sibling's pointer behind (TIM-1538).
79
82
  */
80
- export function updateSpanId(newSpanId: string | undefined): void {
83
+ function runInSpanScope<T>(
84
+ pointers: Pick<TraceStore, 'spanId'> | Pick<TraceStore, 'platformSpan'>,
85
+ fn: () => T
86
+ ): T {
81
87
  const store = traceAls.getStore();
82
- if (store) {
83
- store.spanId = newSpanId;
84
- }
88
+ return store ? traceAls.run({ ...store, ...pointers }, fn) : fn();
85
89
  }
86
90
 
87
91
  /**
@@ -113,7 +117,8 @@ const DEV_TRACING_INIT_KEY = Symbol.for('timber.dev.tracing-initialized');
113
117
  * we create a BasicTracerProvider with our processor.
114
118
  *
115
119
  * Idempotent across module re-evaluations (HMR) — only the first call
116
- * registers. Only called in dev mode — zero overhead in production.
120
+ * registers. Called in dev, and in production only when TIMBER_DEBUG is
121
+ * set — otherwise production never loads the OTEL SDK.
117
122
  */
118
123
  export async function initDevTracing(
119
124
  config: import('../dev-tools/logger.ts').DevLoggerConfig
@@ -124,39 +129,17 @@ export async function initDevTracing(
124
129
  const api = await getOtelApi();
125
130
  if (!api) return;
126
131
 
127
- let DevSpanProcessor: typeof import('../dev-tools/instrumentation.ts').DevSpanProcessor;
128
- let BasicTracerProvider: typeof import('@opentelemetry/sdk-trace-base').BasicTracerProvider;
129
- let AsyncLocalStorageContextManager: typeof import('@opentelemetry/context-async-hooks').AsyncLocalStorageContextManager;
130
-
132
+ // Tracing is a diagnostic: any failure to load or construct the SDK
133
+ // disables it with a warning and never fails the server's boot (TIM-1554).
131
134
  try {
132
- ({ DevSpanProcessor } = await import('../dev-tools/instrumentation.ts'));
133
- ({ BasicTracerProvider } = await import('@opentelemetry/sdk-trace-base'));
134
- ({ AsyncLocalStorageContextManager } = await import('@opentelemetry/context-async-hooks'));
135
+ const { registerDevTracing } = await import('../dev-tools/instrumentation.ts');
136
+ registerDevTracing(config);
135
137
  } catch (err) {
136
138
  const msg = err instanceof Error ? err.message : String(err);
137
- console.warn(`[timber] Dev tracing disabled — failed to load OTEL packages:\n ${msg}`);
139
+ console.warn(`[timber] Dev tracing disabled — failed to set up OTEL:\n ${msg}`);
138
140
  return;
139
141
  }
140
142
 
141
- const processor = new DevSpanProcessor(config);
142
-
143
- // Register a context manager so OTEL can propagate the active span
144
- // across async boundaries. Without this, startActiveSpan can't make
145
- // spans "active" — child spans get random trace IDs and getActiveSpan()
146
- // returns undefined.
147
- const contextManager = new AsyncLocalStorageContextManager();
148
- contextManager.enable();
149
- api.context.setGlobalContextManager(contextManager);
150
-
151
- // Create a minimal TracerProvider with our DevSpanProcessor.
152
- // If the user also configures an SDK in register(), their provider
153
- // will coexist — the global provider set last wins for new tracers,
154
- // but our processor captures all spans from the timber.js tracer.
155
- const provider = new BasicTracerProvider({
156
- spanProcessors: [processor],
157
- });
158
- api.trace.setGlobalTracerProvider(provider);
159
-
160
143
  // Reset cached tracer so next getTracer() picks up the new provider
161
144
  _tracer = undefined;
162
145
 
@@ -259,7 +242,8 @@ export async function getTracer(): Promise<import('@opentelemetry/api').Tracer |
259
242
  *
260
243
  * Automatically:
261
244
  * - Creates the span as a child of the current context
262
- * - Updates the ALS span ID for log–trace correlation
245
+ * - Runs fn in its own trace scope carrying the span's IDs, for log–trace
246
+ * correlation and setSpanAttribute()
263
247
  * - Ends the span when the function completes
264
248
  * - Records exceptions on error (OTEL channel)
265
249
  */
@@ -274,21 +258,13 @@ export async function withSpan<T>(
274
258
  }
275
259
 
276
260
  // Native platform span wraps the OTEL emission (dual emission). The
277
- // innermost platform span is tracked on the trace store so
278
- // setSpanAttribute() can reach it after creation — the platform API has
279
- // no getActiveSpan() equivalent.
280
- return platformTracer.enterSpan(name, async (span) => {
261
+ // span is tracked on its own trace scope so setSpanAttribute() can reach
262
+ // it after creation — the platform API has no getActiveSpan() equivalent.
263
+ return platformTracer.enterSpan(name, (span) => {
281
264
  for (const key of Object.keys(attributes)) {
282
265
  span.setAttribute(key, attributes[key]);
283
266
  }
284
- const store = traceAls.getStore();
285
- const prevPlatformSpan = store?.platformSpan;
286
- if (store) store.platformSpan = span;
287
- try {
288
- return await runOtelSpan(name, attributes, fn);
289
- } finally {
290
- if (store) store.platformSpan = prevPlatformSpan;
291
- }
267
+ return runInSpanScope({ platformSpan: span }, () => runOtelSpan(name, attributes, fn));
292
268
  });
293
269
  }
294
270
 
@@ -304,24 +280,30 @@ async function runOtelSpan<T>(
304
280
  }
305
281
 
306
282
  const api = (await getOtelApi())!;
307
- return tracer.startActiveSpan(name, { attributes }, async (span) => {
308
- const prevSpanId = getSpanId();
309
- updateSpanId(span.spanContext().spanId);
310
- try {
311
- const result = await fn();
312
- span.setStatus({ code: api.SpanStatusCode.OK });
313
- return result;
314
- } catch (error) {
315
- span.setStatus({ code: api.SpanStatusCode.ERROR });
316
- if (error instanceof Error) {
317
- span.recordException(error);
318
- }
319
- throw error;
320
- } finally {
321
- span.end();
322
- updateSpanId(prevSpanId);
283
+ return tracer.startActiveSpan(name, { attributes }, (span) =>
284
+ runInSpanScope({ spanId: span.spanContext().spanId }, () => settleOtelSpan(api, span, fn))
285
+ );
286
+ }
287
+
288
+ /** Run `fn` and end `span` with its outcome. */
289
+ async function settleOtelSpan<T>(
290
+ api: typeof import('@opentelemetry/api'),
291
+ span: import('@opentelemetry/api').Span,
292
+ fn: () => T | Promise<T>
293
+ ): Promise<T> {
294
+ try {
295
+ const result = await fn();
296
+ span.setStatus({ code: api.SpanStatusCode.OK });
297
+ return result;
298
+ } catch (error) {
299
+ span.setStatus({ code: api.SpanStatusCode.ERROR });
300
+ if (error instanceof Error) {
301
+ span.recordException(error);
323
302
  }
324
- });
303
+ throw error;
304
+ } finally {
305
+ span.end();
306
+ }
325
307
  }
326
308
 
327
309
  /**
@@ -389,9 +371,10 @@ export function addSpanEventSync(
389
371
 
390
372
  /**
391
373
  * Try to extract the OTEL trace ID from the current active span context.
392
- * Returns undefined if OTEL is not active or no span exists.
374
+ * Returns undefined if OTEL is not active or no span exists. (The span ID
375
+ * reaches logs through the span's own trace scope, not from here.)
393
376
  */
394
- export async function getOtelTraceId(): Promise<{ traceId: string; spanId: string } | undefined> {
377
+ export async function getOtelTraceId(): Promise<string | undefined> {
395
378
  const api = await getOtelApi();
396
379
  if (!api) return undefined;
397
380
 
@@ -404,5 +387,5 @@ export async function getOtelTraceId(): Promise<{ traceId: string; spanId: strin
404
387
  return undefined;
405
388
  }
406
389
 
407
- return { traceId: ctx.traceId, spanId: ctx.spanId };
390
+ return ctx.traceId;
408
391
  }
@@ -6,7 +6,7 @@ import type { EarlyHint } from './early-hints.ts';
6
6
  /**
7
7
  * A value that is safe to pass through `JSON.stringify` without data loss.
8
8
  *
9
- * Used as the constraint for `deny(status, data)` and `RenderError` digest data
9
+ * Used as the constraint for `deny(status, { dangerouslyPassData })` data
10
10
  * because the post-flush path serializes via JSON.stringify, not React Flight.
11
11
  * Types that survive Flight (Date, Map, Set, BigInt) would silently coerce or
12
12
  * throw when serialized as JSON. This type prevents that at compile time.
@@ -32,15 +32,15 @@ export const RELOAD_HEADER = 'X-Timber-Reload';
32
32
  // ─── Deployment ID ───────────────────────────────────────────────
33
33
 
34
34
  /**
35
- * The current build's deployment ID. Set at startup from the manifest init
36
- * module (globalThis.__TIMBER_DEPLOYMENT_ID__). Null in dev mode.
35
+ * The current build's deployment ID. Set at startup from the runtime config
36
+ * (`virtual:timber-config`'s `deploymentId`). Null in dev mode.
37
37
  */
38
38
  let currentDeploymentId: string | null = null;
39
39
 
40
40
  /**
41
- * Set the current deployment ID. Called once at server startup from the
42
- * manifest init module. In dev mode this is never called (deployment ID
43
- * checks are skipped).
41
+ * Set the current deployment ID. Called once at server startup by the RSC
42
+ * entry's `createRequestHandler()`. In dev mode this is never called
43
+ * (deployment ID checks are skipped).
44
44
  */
45
45
  export function setDeploymentId(id: string): void {
46
46
  currentDeploymentId = id;
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Marker header on CSRF rejections.
3
+ *
4
+ * A CSRF rejection is a 403, the same status as an access-control denial.
5
+ * The server stamps this header on every CSRF 403 so callers — the browser
6
+ * action runtime, a same-origin `fetch` in user code, a curl session — can
7
+ * tell the two apart without parsing the body. A cross-origin `fetch` cannot
8
+ * read it: the rejection returns before proxy.ts, so no CORS headers are set
9
+ * and the browser reports a network error instead. Shared so the server writer and the client
10
+ * reader cannot drift.
11
+ *
12
+ * See design/08-forms-and-actions.md §"CSRF Protection" (TIM-1459).
13
+ */
14
+ export const CSRF_REJECT_HEADER = 'X-Timber-Reject';
15
+ export const CSRF_REJECT_VALUE = 'csrf';
@@ -0,0 +1,46 @@
1
+ /**
2
+ * The digest an unhandled render error carries across Flight, and the
3
+ * correlation ID error pages read back out of it.
4
+ *
5
+ * Flight's `onError` (server/rsc-entry/rsc-stream.ts) returns this string for
6
+ * any error that is not a deny or redirect, and React sets it as `digest` on
7
+ * the Error it revives for that row, in SSR and on the client alike. The
8
+ * `errorId` is the one the server logged the error with, so an error page
9
+ * that shows it gives the reader something to quote that an operator can
10
+ * find. It is the `digest` prop every TSX error page receives.
11
+ *
12
+ * `message` is the real message only in dev; production sends a fixed string
13
+ * (design/13-security.md §"Errors don't leak").
14
+ */
15
+
16
+ interface ErrorRowDigest {
17
+ type: 'error';
18
+ message: string;
19
+ errorId: string;
20
+ }
21
+
22
+ export function encodeErrorDigest(digest: Omit<ErrorRowDigest, 'type'>): string {
23
+ const row: ErrorRowDigest = { type: 'error', ...digest };
24
+ return JSON.stringify(row);
25
+ }
26
+
27
+ /**
28
+ * The correlation ID in an error's Flight digest, or `null` when the error
29
+ * carries none — a deny or redirect row, an error that never crossed Flight,
30
+ * or anything that is not an object.
31
+ */
32
+ export function errorDigestId(error: unknown): string | null {
33
+ if (typeof error !== 'object' || error === null) return null;
34
+ const digest: unknown = Reflect.get(error, 'digest');
35
+ if (typeof digest !== 'string') return null;
36
+ let parsed: unknown;
37
+ try {
38
+ parsed = JSON.parse(digest);
39
+ } catch {
40
+ // A digest someone else set (a library's own error): not ours to read.
41
+ return null;
42
+ }
43
+ if (typeof parsed !== 'object' || parsed === null) return null;
44
+ const errorId: unknown = Reflect.get(parsed, 'errorId');
45
+ return Reflect.get(parsed, 'type') === 'error' && typeof errorId === 'string' ? errorId : null;
46
+ }
@@ -67,9 +67,9 @@ export interface RscPayloadRoot extends PublishedParams {
67
67
  * In the browser this is unreachable for a real response: all four producers
68
68
  * of a route payload go through `withPublishedParams`, and a client talking to
69
69
  * a different build is answered with 204 at Stage 1c
70
- * (`server/pipeline-phases.ts`) before any payload exists. It is reachable in
71
- * the router's test/fallback path, where `decodeRsc` is absent and the
72
- * "payload" is the raw response text.
70
+ * (`server/pipeline-phases.ts`) before any payload exists. It is what a page
71
+ * with no payload at all publishes — a document hydrated without an inlined
72
+ * payload, or a prefetch entry that carries no params.
73
73
  */
74
74
  export const NO_PUBLISHED_PARAMS: PublishedParams = { params: {}, slotParams: null };
75
75
 
@@ -99,9 +99,8 @@ export function readPublishedParams(source: unknown): PublishedParams {
99
99
  /**
100
100
  * Read the renderable tree out of a payload root.
101
101
  *
102
- * Returns the value unchanged when it is not a root — the router's fallback
103
- * path stores raw response text under the same name, and a test asserting on
104
- * that text should see the text.
102
+ * Returns the value unchanged when it is not a root, so a malformed value
103
+ * reaches React (and its error boundaries) rather than vanishing here.
105
104
  */
106
105
  export function readPayloadTree(root: unknown): unknown {
107
106
  if (typeof root === 'object' && root !== null && 'tree' in root && hasPublishedParams(root)) {
@@ -118,10 +117,12 @@ export interface SplitPayload {
118
117
  * The params published beside it. Settled when the root already is, so the
119
118
  * hydration path can render without an extra await.
120
119
  *
121
- * **Never rejects.** A decode failure has to surface where React renders
122
- * `tree`, so the error boundary *around the tree* catches it. Rejecting here
123
- * too would take down the provider above every boundary in the app, turning
124
- * a contained failure into a blank page (TIM-1297).
120
+ * **Never rejects.** A decode failure has to surface through `tree`: where
121
+ * React renders it on hydration, so the error boundary *around the tree*
122
+ * catches it, and where the router awaits it before handing a navigation
123
+ * over, so the navigation fails and recovers. Rejecting here too would take
124
+ * down the provider above every boundary in the app, turning a contained
125
+ * failure into a blank page (TIM-1297).
125
126
  */
126
127
  params: ParamsSource;
127
128
  }
@@ -39,7 +39,14 @@
39
39
  * normalize; this function does not, because the two callers normalize from
40
40
  * different sources (a browser URL, a build-time route entry).
41
41
  */
42
+ /**
43
+ * The directory, relative to the site root, that holds every static RSC
44
+ * payload. The one spelling: the build writes, hashes, and reports it as
45
+ * content-hashed from here.
46
+ */
47
+ export const RSC_PAYLOAD_DIR = '_rsc';
48
+
42
49
  export function rscPayloadPath(routePath: string): string {
43
50
  const prefix = routePath === '/' ? '' : routePath;
44
- return `/_rsc${prefix}/index.rsc`;
51
+ return `/${RSC_PAYLOAD_DIR}${prefix}/index.rsc`;
45
52
  }
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Replace a file's contents in one step: write a uniquely named temp sibling,
3
+ * then `rename()` it over the target.
4
+ *
5
+ * `writeFile()` opens its target with `O_TRUNC`, so for the length of the write
6
+ * a concurrent reader sees an empty or half-written file under the real name.
7
+ * `rename()` within one directory swaps the name atomically, so a reader sees
8
+ * either the old file or the new one — never a torn one — and a crashed
9
+ * writer leaves no partial artifact under the final name.
10
+ *
11
+ * The temp name is unique per call, not a fixed `${path}.tmp`: two writers of
12
+ * the same path (a dev server and a `vite build` rewriting the same route
13
+ * types, parallel CLI invocations sharing a cache) would otherwise write into
14
+ * one temp file and rename each other's half-written bytes into place.
15
+ */
16
+
17
+ import { randomUUID } from 'node:crypto';
18
+ import { rename, rm, writeFile } from 'node:fs/promises';
19
+
20
+ export async function writeFileAtomic(path: string, data: Uint8Array | string): Promise<void> {
21
+ const tmp = `${path}.${randomUUID()}.tmp`;
22
+ try {
23
+ await writeFile(tmp, data);
24
+ await rename(tmp, path);
25
+ } catch (err) {
26
+ // Best-effort cleanup. If the directory refuses the write it may refuse
27
+ // the rm too, and that error — naming a random temp path — must not
28
+ // replace the one that says what actually failed.
29
+ await rm(tmp, { force: true }).catch(() => {});
30
+ throw err;
31
+ }
32
+ }