@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
@@ -6,8 +6,8 @@
6
6
  * Catches errors thrown by children and renders a fallback component
7
7
  * with the appropriate props based on error type:
8
8
  * - DenySignal (4xx) → { status, data }
9
- * - RenderError (5xx) → { error, digest, reset }
10
- * - Unhandled error → { error, digest: null, reset }
9
+ * - Unhandled error (500) → { error, digest, reset }, where `digest` is the
10
+ * ID the server logged the error with (shared/error-digest.ts)
11
11
  *
12
12
  * The `status` prop controls which errors this boundary catches:
13
13
  * - Specific code (e.g. 403) → only that status
@@ -19,10 +19,10 @@
19
19
  */
20
20
 
21
21
  import { Component, createContext, createElement, useContext, type ReactNode } from 'react';
22
- import { getSsrData } from './ssr-data.ts';
23
22
  import { getRouterOrNull } from './router-ref.ts';
24
23
  import { markStaleFromError } from './stale-client.ts';
25
24
  import { StatusPageMarker } from './status-page-marker.tsx';
25
+ import { errorDigestId } from '../shared/error-digest.ts';
26
26
  import { leaveSpa } from './router-effects.ts';
27
27
  // Page unload detection: when the page is being torn down, error boundaries
28
28
  // suppress activation — the error is from the aborted connection, not the
@@ -60,14 +60,6 @@ interface DenyDigest {
60
60
  owners?: string[];
61
61
  }
62
62
 
63
- /** Structured digest returned by RSC onError for RenderError. */
64
- interface RenderErrorDigest {
65
- type: 'render-error';
66
- code: string;
67
- data: unknown;
68
- status: number;
69
- }
70
-
71
63
  /** Structured digest returned by RSC onError for RedirectSignal. */
72
64
  interface RedirectDigest {
73
65
  type: 'redirect';
@@ -75,7 +67,7 @@ interface RedirectDigest {
75
67
  status: number;
76
68
  }
77
69
 
78
- type ParsedDigest = DenyDigest | RenderErrorDigest | RedirectDigest;
70
+ type ParsedDigest = DenyDigest | RedirectDigest;
79
71
 
80
72
  // ─── Props & State ───────────────────────────────────────────────────────────
81
73
 
@@ -89,7 +81,8 @@ export interface TimberErrorBoundaryProps {
89
81
  status?: number;
90
82
  /**
91
83
  * When true, this boundary wraps a parallel slot. Slot denials are
92
- * graceful degradation — they must NOT change the HTTP status code.
84
+ * graceful degradation: the boundary claims any addressed deny that
85
+ * reaches it and leaves the page's segment chain unmarked.
93
86
  */
94
87
  isSlotBoundary?: boolean;
95
88
  /**
@@ -297,7 +290,7 @@ export class TimberErrorBoundary extends Component<
297
290
  throw error;
298
291
  }
299
292
  // The terminal is where that flow ends on the client. A non-deny row
300
- // nothing claimed — a RenderError or a plain crash on a route with no
293
+ // nothing claimed — a crash on a route with no
301
294
  // matching `error.tsx` — has no page to render in-SPA; React would
302
295
  // unmount the root. So the terminal does what the router does for an
303
296
  // error envelope (design/10 §"Error Page Rendering for Client
@@ -335,27 +328,6 @@ export class TimberErrorBoundary extends Component<
335
328
  }
336
329
  }
337
330
 
338
- // Report DenySignal handling so the pipeline skips the redundant
339
- // renderDenyPage() re-render.
340
- //
341
- // For segment boundaries: also set the HTTP status code from the
342
- // DenySignal so the Response has the correct 4xx status. This runs
343
- // synchronously during Fizz rendering, BEFORE onShellReady.
344
- //
345
- // For slot boundaries: set _denyHandledByBoundary but do NOT change
346
- // statusCode — slot denials are graceful degradation.
347
- //
348
- // See TIM-664, LOCAL-298.
349
- if (parsed?.type === 'deny') {
350
- const ssrData = getSsrData();
351
- if (ssrData?._navContext) {
352
- ssrData._navContext._denyHandledByBoundary = true;
353
- if (!this.props.isSlotBoundary) {
354
- ssrData._navContext.statusCode = parsed.status;
355
- }
356
- }
357
- }
358
-
359
331
  return this.markStatusPage(this.renderFallback(parsed, error));
360
332
  }
361
333
 
@@ -383,13 +355,10 @@ export class TimberErrorBoundary extends Component<
383
355
  });
384
356
  }
385
357
 
386
- // 5xx / RenderError / unhandled error
387
- const digest =
388
- parsed?.type === 'render-error' ? { code: parsed.code, data: parsed.data } : null;
389
-
358
+ // Unhandled error (500)
390
359
  return createElement(this.props.fallbackComponent as never, {
391
360
  error,
392
- digest,
361
+ digest: errorDigestId(error),
393
362
  reset: this.reset,
394
363
  });
395
364
  }
@@ -458,7 +427,6 @@ function denyError(status: number, original: Error): Error {
458
427
  */
459
428
  function getErrorStatus(parsed: ParsedDigest | null, error: Error): number | null {
460
429
  if (parsed?.type === 'deny') return parsed.status;
461
- if (parsed?.type === 'render-error') return parsed.status;
462
430
  if (parsed?.type === 'redirect') return parsed.status;
463
431
 
464
432
  // Fallback: parse DenySignal message pattern for errors that lost their digest
@@ -30,7 +30,7 @@ export interface SerializableError {
30
30
  * Props for the ErrorReconstituter wrapper component.
31
31
  * All props are RSC-serializable:
32
32
  * - error: plain object (SerializableError)
33
- * - digest: plain JSON or null
33
+ * - digest: the server log's correlation ID for the error, or null
34
34
  * - reset: undefined (only meaningful on client after boundary catch)
35
35
  * - component: client module reference (RSC Flight serializes as opaque ref)
36
36
  * - status / data: set only when error.tsx serves a deny()
@@ -39,11 +39,11 @@ export interface SerializableError {
39
39
  */
40
40
  interface ErrorReconstituterProps {
41
41
  error: SerializableError;
42
- digest: { code: string; data: unknown } | null;
42
+ digest: string | null;
43
43
  reset: undefined;
44
44
  component: ComponentType<{
45
45
  error: Error;
46
- digest: { code: string; data: unknown } | null;
46
+ digest: string | null;
47
47
  reset: (() => void) | undefined;
48
48
  status?: number;
49
49
  data?: unknown;
@@ -64,10 +64,15 @@ export function ErrorReconstituter({
64
64
  status,
65
65
  data,
66
66
  }: ErrorReconstituterProps): ReactNode {
67
- // Reconstitute a real Error so instanceof checks work in user code
67
+ // Reconstitute a real Error so instanceof checks work in user code.
68
+ // `new Error()` captures a stack of wherever this component renders — in
69
+ // SSR that is the server's bundle paths and React internals. Production
70
+ // serializes no stack (design/13-security.md), so the stack is set to the
71
+ // header line alone: nothing about the server, and the same string in SSR
72
+ // and on the client (TIM-1551).
68
73
  const error = Object.assign(new Error(serialized.message), {
69
74
  name: serialized.name,
70
- ...(serialized.stack != null ? { stack: serialized.stack } : {}),
75
+ stack: serialized.stack ?? `${serialized.name}: ${serialized.message}`,
71
76
  });
72
77
 
73
78
  return createElement(component, {
@@ -3,6 +3,7 @@
3
3
 
4
4
  import type { ParamsSource } from '../shared/payload-root.ts';
5
5
  import type { SegmentInfo } from '../shared/segment-info.ts';
6
+ import { routerUrlKey } from './router-url.ts';
6
7
 
7
8
  // ─── Types ───────────────────────────────────────────────────────
8
9
 
@@ -42,7 +43,10 @@ export interface HistoryEntry {
42
43
  * On forward navigation, the new page's payload is pushed onto the stack.
43
44
  * On popstate, the cached payload is replayed instantly.
44
45
  *
45
- * Entries are keyed by pathname + search. Used with the History API
46
+ * Entries are keyed by pathname + search in the browser's own spelling
47
+ * (`routerUrlKey`), whatever spelling a caller passes: an entry stored by
48
+ * `navigate('/café')` is found by a traversal that reads `/caf%C3%A9` off
49
+ * the address bar, and `/a?` is `/a` (TIM-1541). Used with the History API
46
50
  * fallback and the Navigation API.
47
51
  *
48
52
  * Scroll positions are stored in history.state or Navigation API entry
@@ -63,6 +67,7 @@ export class HistoryStack {
63
67
  }
64
68
 
65
69
  push(url: string, entry: HistoryEntry): void {
70
+ url = routerUrlKey(url);
66
71
  // Push runs when a page becomes current (or hydration seeds it). Promote
67
72
  // replacements too, so the current page always survives overflow.
68
73
  this.entries.delete(url);
@@ -74,6 +79,7 @@ export class HistoryStack {
74
79
  }
75
80
 
76
81
  get(url: string): HistoryEntry | undefined {
82
+ url = routerUrlKey(url);
77
83
  const entry = this.entries.get(url);
78
84
  if (entry) {
79
85
  this.entries.delete(url);
@@ -84,11 +90,11 @@ export class HistoryStack {
84
90
 
85
91
  /** Presence checks (such as hover prefetch probes) do not promote entries. */
86
92
  has(url: string): boolean {
87
- return this.entries.has(url);
93
+ return this.entries.has(routerUrlKey(url));
88
94
  }
89
95
 
90
96
  delete(url: string): boolean {
91
- return this.entries.delete(url);
97
+ return this.entries.delete(routerUrlKey(url));
92
98
  }
93
99
 
94
100
  /**
@@ -99,6 +105,7 @@ export class HistoryStack {
99
105
  * query.
100
106
  */
101
107
  deleteByPathname(pathname: string): void {
108
+ pathname = routerUrlKey(pathname);
102
109
  for (const url of this.entries.keys()) {
103
110
  const qIndex = url.indexOf('?');
104
111
  const urlPathname = qIndex === -1 ? url : url.slice(0, qIndex);
@@ -109,26 +116,16 @@ export class HistoryStack {
109
116
  }
110
117
 
111
118
  /**
112
- * Evict all cached payloads (TIM-1476). Called after a server action
113
- * that revalidated data — history entries are equally stale since they
114
- * replay on back/forward without a server check. Clearing forces a
115
- * fresh fetch on the next traversal.
119
+ * Evict every entry (TIM-1476). Called after a server action that
120
+ * revalidated data — history entries are equally stale since they replay
121
+ * on back/forward without a server check. Clearing forces a fresh fetch on
122
+ * the next traversal.
116
123
  *
117
- * The current URL's `segmentInfo` is preserved (payload nulled) so
118
- * `applyActionResult` can read it to maintain the segment cache
119
- * across the piggybacked revalidation. Other branches (reval.paths-
120
- * only, redirect) do not call `applyActionResult`, so their entries
121
- * are fully removed (codex on #1131 round 2).
124
+ * The current page's entry goes too. Nothing reads it for anything but a
125
+ * replay: the segment metadata a revalidation needs is the committer's
126
+ * record of the current page, not this stack's (TIM-1541).
122
127
  */
123
- clearExcept(currentUrl: string): void {
124
- const currentEntry = this.entries.get(currentUrl);
128
+ clear(): void {
125
129
  this.entries.clear();
126
- if (currentEntry) {
127
- this.entries.set(currentUrl, {
128
- payload: null,
129
- params: currentEntry.params,
130
- segmentInfo: currentEntry.segmentInfo,
131
- });
132
- }
133
130
  }
134
131
  }
@@ -7,7 +7,6 @@
7
7
 
8
8
  // JsonSerializable moved to @timber-js/app/codec as the single canonical path.
9
9
  // Re-export removed per TIM-721.
10
- export type { RenderErrorDigest } from './types.ts';
11
10
 
12
11
  // Navigation
13
12
  export { Link, interpolateParams, resolveHref, validateLinkHref, buildLinkProps } from './link.tsx';
@@ -18,13 +18,12 @@ export type {
18
18
  RouterDeps,
19
19
  RouterPhase,
20
20
  RscDecoder,
21
- RootRenderer,
22
21
  } from './router-types.ts';
23
22
  export { getRouter, getRouterOrNull, setGlobalRouter } from './router-ref.ts';
24
23
  export type { NavigationEpoch } from './router-lifecycle.ts';
25
24
 
26
25
  // ── SSR bridge ───────────────────────────────────────────────────────────
27
- export { setSsrData, clearSsrData, getSsrData } from './ssr-data.ts';
26
+ export { registerSsrDataProvider, getSsrData } from './ssr-data.ts';
28
27
  export type { SsrData } from './ssr-data.ts';
29
28
 
30
29
  // ── Segment context ──────────────────────────────────────────────────────
@@ -44,11 +43,7 @@ export type { HistoryEntry } from './history.ts';
44
43
  export { useSearchParams } from './use-search-params.ts';
45
44
 
46
45
  // ── Navigation context ───────────────────────────────────────────────────
47
- export {
48
- NavigationProvider,
49
- getNavigationState,
50
- setNavigationState,
51
- } from './navigation-context.ts';
46
+ export { NavigationProvider } from './navigation-context.ts';
52
47
  export type { NavigationState } from './navigation-context.ts';
53
48
 
54
49
  // ── Query states (internal binder) ───────────────────────────────────────
@@ -14,7 +14,8 @@ import { buildSegmentTree, type SegmentCache } from './segment-cache.ts';
14
14
  import type { HistoryStack } from './history.ts';
15
15
  import type { SegmentInfo, StateTree } from '../shared/segment-info.ts';
16
16
  import type { ParamsSource } from '../shared/payload-root.ts';
17
- import { setNavigationState, type NavigationState } from './navigation-context.ts';
17
+ import type { NavigationState } from './navigation-context.ts';
18
+ import { parseRouterUrl } from './router-url.ts';
18
19
  import {
19
20
  statusPageRendered,
20
21
  _setStatusPageRendered,
@@ -128,10 +129,11 @@ function hasSkippedSlot(segmentInfo: SegmentInfo[] | null | undefined): boolean
128
129
  }
129
130
 
130
131
  /**
131
- * The metadata a history entry keeps. `skipped` describes the *response*
132
- * — "this slot's content was omitted" — and the entry stores no such
133
- * payload (it stores null). Left on the entry, the flag outlives the
134
- * response: `applyActionResult()` reuses the entry's metadata beside a full
132
+ * The metadata a committed page keeps — on its history entry, and as the
133
+ * current page's `committedSegmentInfo()`. `skipped` describes the
134
+ * *response* — "this slot's content was omitted" — and neither stores such
135
+ * a payload (the entry stores null). Kept, the flag outlives the response:
136
+ * `applyActionResult()` reuses the current page's metadata beside a full
135
137
  * re-render and would have that judged non-replayable too.
136
138
  */
137
139
  function storedSegmentInfo(segmentInfo: SegmentInfo[] | null | undefined) {
@@ -153,7 +155,18 @@ export interface PreparedNavigation {
153
155
  export interface NavigationCommitter {
154
156
  prepareNavigation(url: string, opts: NavigationCommitInput): PreparedNavigation;
155
157
  currentStateTree(): StateTree | undefined;
156
- updateSegmentCache(segmentInfo: SegmentInfo[] | null | undefined): void;
158
+ /**
159
+ * The segment metadata of the page the last commit made current, as that
160
+ * commit recorded it — null when it carried none.
161
+ *
162
+ * Server-action responses carry no segment metadata, so a revalidation
163
+ * re-renders the current page with this. It is the committer's own record
164
+ * rather than a history-stack lookup: the stack is keyed by the URL string
165
+ * a navigation was asked for, and the current page is known by
166
+ * `window.location`'s spelling of it, and the two need not agree
167
+ * (`/a?` against `/a`, a percent-encoded path against a decoded one).
168
+ */
169
+ committedSegmentInfo(): SegmentInfo[] | null;
157
170
  /** Whether segment reuse is currently suppressed (TIM-1466). */
158
171
  isSegmentReuseSuppressed(): boolean;
159
172
  /** Lift segment reuse suppression after fresh data has been fetched (TIM-1466). */
@@ -163,11 +176,9 @@ export interface NavigationCommitter {
163
176
  /**
164
177
  * Derive the navigation state (pathname + search) a URL renders with.
165
178
  *
166
- * Pure: publishing it — the module-level fallback for tests and SSR, and the
167
- * globalThis bridge — is `prepareNavigation`'s commit, which runs only once
168
- * the render is known to have won (TIM-1301). Callers pass the returned value
169
- * explicitly to renderRoot/wrapPayload, so a render never depends on the
170
- * publish having happened first.
179
+ * Pure. The value travels with the tree it describes — callers pass it to
180
+ * `wrapPayload`, and the router's record of the displayed tree keeps it
181
+ * beside that tree — so there is no store to publish it to (TIM-1541).
171
182
  */
172
183
  export function deriveNavigationState(url: string): NavigationState {
173
184
  // Params are not part of it. They travel with the payload and are published
@@ -175,7 +186,7 @@ export function deriveNavigationState(url: string): NavigationState {
175
186
  // also what clears the previous route's — a route with no params of its own
176
187
  // still publishes an empty record (TIM-1294/TIM-1297, and the clearing
177
188
  // requirement from TIM-1285).
178
- const parsed = new URL(url, 'http://localhost');
189
+ const parsed = parseRouterUrl(url);
179
190
  return { pathname: parsed.pathname || '/', search: parsed.search };
180
191
  }
181
192
 
@@ -187,6 +198,9 @@ export function createNavigationCommitter(deps: {
187
198
  }): NavigationCommitter {
188
199
  const { segmentCache, historyStack } = deps;
189
200
 
201
+ // See `committedSegmentInfo`. Written only by a commit.
202
+ let committedSegmentInfo: SegmentInfo[] | null = null;
203
+
190
204
  // See `reportStatusPageRendered`: a status page that commits with no
191
205
  // navigation to consume the report still empties the cache.
192
206
  _setOnStatusPageRendered(() => segmentCache.clear());
@@ -199,8 +213,7 @@ export function createNavigationCommitter(deps: {
199
213
  * navigation. What the flag gates is which parts get serialized — see
200
214
  * `currentStateTree`.
201
215
  */
202
- function updateSegmentCache(segmentInfo: SegmentInfo[] | null | undefined): void {
203
- if (!segmentInfo || segmentInfo.length === 0) return;
216
+ function updateSegmentCache(segmentInfo: SegmentInfo[]): void {
204
217
  const tree = buildSegmentTree(segmentInfo);
205
218
  if (tree) {
206
219
  segmentCache.set('/', tree);
@@ -208,7 +221,7 @@ export function createNavigationCommitter(deps: {
208
221
  }
209
222
 
210
223
  return {
211
- updateSegmentCache,
224
+ committedSegmentInfo: () => committedSegmentInfo,
212
225
  isSegmentReuseSuppressed: () => segmentCache.isReuseSuppressed(),
213
226
  restoreSegmentReuse: () => segmentCache.restoreReuse(),
214
227
 
@@ -242,9 +255,13 @@ export function createNavigationCommitter(deps: {
242
255
  * the URL and is what the incoming tree is *rendered* with, plus a
243
256
  * `commit` thunk that performs the writes that make a page current:
244
257
  * 1. Segment cache — update from server-provided segment metadata
245
- * 2. Navigation state — pathname/search for usePathname/useSearchParams
258
+ * 2. The current page's segment metadata (`committedSegmentInfo`)
246
259
  * 3. History stack — store the payload for instant back/forward replay
247
260
  *
261
+ * Pathname and search are not written here: they are the returned
262
+ * `navState`, which the tree renders with and the router's record of the
263
+ * displayed tree keeps (browser-entry/router-init.ts `publishTree`).
264
+ *
248
265
  * Nothing is written until `commit()` runs, and on a transitioned
249
266
  * navigation it runs only once the transition is known to have won — see
250
267
  * `renderViaTransition` and `NavigationRoot`. A navigation superseded
@@ -287,12 +304,12 @@ export function createNavigationCommitter(deps: {
287
304
  segmentCache.clear();
288
305
  }
289
306
 
290
- setNavigationState(navState);
307
+ committedSegmentInfo = storedSegmentInfo(segmentInfo) ?? null;
291
308
 
292
309
  historyStack.push(url, {
293
310
  payload,
294
311
  params: opts.params,
295
- segmentInfo: storedSegmentInfo(segmentInfo),
312
+ segmentInfo: committedSegmentInfo,
296
313
  });
297
314
  },
298
315
  };
@@ -12,8 +12,8 @@
12
12
  *
13
13
  * Segment params are NOT here — see the note on NavigationState below.
14
14
  *
15
- * By wrapping the RSC payload element in NavigationProvider inside
16
- * renderRoot(), the context value and the element tree are passed to
15
+ * By wrapping the RSC payload element in NavigationProvider inside the
16
+ * router's `renderTree` (browser-entry/router-init.ts), the context value and the element tree are passed to
17
17
  * reactRoot.render() in the same call — atomic by construction.
18
18
  * All consumers (usePathname, useSearchParams) see the new values in the
19
19
  * same render pass as the new tree.
@@ -43,7 +43,6 @@
43
43
  */
44
44
 
45
45
  import { createContext, useContext, createElement, type ReactNode } from 'react';
46
- import type { SlotParamsRecord } from '../shared/slot-params.ts';
47
46
 
48
47
  // ---------------------------------------------------------------------------
49
48
  // Context type
@@ -118,7 +117,7 @@ export interface NavigationProviderProps {
118
117
  /**
119
118
  * Wraps children with NavigationContext.Provider.
120
119
  *
121
- * Used in browser-entry.ts renderRoot to wrap the RSC payload element
120
+ * Used in browser-entry/router-init.ts `renderTree` to wrap the RSC payload element
122
121
  * so that navigation state updates atomically with the tree render.
123
122
  */
124
123
  export function NavigationProvider({
@@ -128,41 +127,6 @@ export function NavigationProvider({
128
127
  return createElement(getOrCreateContext().Provider, { value }, children);
129
128
  }
130
129
 
131
- // ---------------------------------------------------------------------------
132
- // Module-level state for renderRoot to read
133
- // ---------------------------------------------------------------------------
134
-
135
- /**
136
- * Navigation state communicated between the router and renderRoot.
137
- *
138
- * The router calls setNavigationState() before renderRoot(). The
139
- * renderRoot callback reads via getNavigationState() to create the
140
- * NavigationProvider with the correct params/pathname.
141
- *
142
- * This is NOT used by hooks directly — hooks read from React context.
143
- *
144
- * Stored on globalThis (like the context instances above) because the
145
- * router lives in one chunk while renderRoot lives in another. Module-
146
- * level variables would be separate per chunk.
147
- */
148
- const NAV_STATE_KEY = Symbol.for('__timber_nav_state');
149
-
150
- function _getNavStateStore(): { current: NavigationState } {
151
- const g = globalThis as Record<symbol, unknown>;
152
- if (!g[NAV_STATE_KEY]) {
153
- g[NAV_STATE_KEY] = { current: { pathname: '/', search: '' } };
154
- }
155
- return g[NAV_STATE_KEY] as { current: NavigationState };
156
- }
157
-
158
- export function setNavigationState(state: NavigationState): void {
159
- _getNavStateStore().current = state;
160
- }
161
-
162
- export function getNavigationState(): NavigationState {
163
- return _getNavStateStore().current;
164
- }
165
-
166
130
  // ---------------------------------------------------------------------------
167
131
  // Pending navigation state lives in the router, not here
168
132
  // ---------------------------------------------------------------------------
@@ -27,8 +27,9 @@ import type { TopLoaderConfig } from './top-loader.tsx';
27
27
  export interface ReactRootHost {
28
28
  /**
29
29
  * Hydrate the server HTML with `element` as the initial tree. Nothing is
30
- * published on that commit — the address bar, pathname and history already
31
- * describe the page the server sent.
30
+ * published on that commit — the router made the page current before
31
+ * handing it over (`RouterInstance.hydrate`), and React may never commit
32
+ * it: an early render switches the root to client rendering.
32
33
  */
33
34
  hydrate(element: ReactNode, options?: HydrationOptions): void;
34
35
  /**