@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
@@ -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,34 +90,42 @@ 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
  /**
95
- * Evict all cached payloads (TIM-1476). Called after a server action
96
- * that revalidated data — history entries are equally stale since they
97
- * replay on back/forward without a server check. Clearing forces a
98
- * fresh fetch on the next traversal.
101
+ * Delete all entries whose pathname matches `pathname` (TIM-1465).
102
+ * Used by `invalidatePath` when the invalidation target has no search
103
+ * string — `/products` should evict `/products?page=1` too, because
104
+ * `revalidatePath('/products')` invalidates the route regardless of
105
+ * query.
106
+ */
107
+ deleteByPathname(pathname: string): void {
108
+ pathname = routerUrlKey(pathname);
109
+ for (const url of this.entries.keys()) {
110
+ const qIndex = url.indexOf('?');
111
+ const urlPathname = qIndex === -1 ? url : url.slice(0, qIndex);
112
+ if (urlPathname === pathname) {
113
+ this.entries.delete(url);
114
+ }
115
+ }
116
+ }
117
+
118
+ /**
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.
99
123
  *
100
- * The current URL's `segmentInfo` is preserved (payload nulled) so
101
- * `applyActionResult` can read it to maintain the segment cache
102
- * across the piggybacked revalidation. Other branches (reval.paths-
103
- * only, redirect) do not call `applyActionResult`, so their entries
104
- * 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).
105
127
  */
106
- clearExcept(currentUrl: string): void {
107
- const currentEntry = this.entries.get(currentUrl);
128
+ clear(): void {
108
129
  this.entries.clear();
109
- if (currentEntry) {
110
- this.entries.set(currentUrl, {
111
- payload: null,
112
- params: currentEntry.params,
113
- segmentInfo: currentEntry.segmentInfo,
114
- });
115
- }
116
130
  }
117
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,17 +155,30 @@ 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;
170
+ /** Whether segment reuse is currently suppressed (TIM-1466). */
171
+ isSegmentReuseSuppressed(): boolean;
172
+ /** Lift segment reuse suppression after fresh data has been fetched (TIM-1466). */
173
+ restoreSegmentReuse(): void;
157
174
  }
158
175
 
159
176
  /**
160
177
  * Derive the navigation state (pathname + search) a URL renders with.
161
178
  *
162
- * Pure: publishing it — the module-level fallback for tests and SSR, and the
163
- * globalThis bridge — is `prepareNavigation`'s commit, which runs only once
164
- * the render is known to have won (TIM-1301). Callers pass the returned value
165
- * explicitly to renderRoot/wrapPayload, so a render never depends on the
166
- * 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).
167
182
  */
168
183
  export function deriveNavigationState(url: string): NavigationState {
169
184
  // Params are not part of it. They travel with the payload and are published
@@ -171,7 +186,7 @@ export function deriveNavigationState(url: string): NavigationState {
171
186
  // also what clears the previous route's — a route with no params of its own
172
187
  // still publishes an empty record (TIM-1294/TIM-1297, and the clearing
173
188
  // requirement from TIM-1285).
174
- const parsed = new URL(url, 'http://localhost');
189
+ const parsed = parseRouterUrl(url);
175
190
  return { pathname: parsed.pathname || '/', search: parsed.search };
176
191
  }
177
192
 
@@ -183,6 +198,9 @@ export function createNavigationCommitter(deps: {
183
198
  }): NavigationCommitter {
184
199
  const { segmentCache, historyStack } = deps;
185
200
 
201
+ // See `committedSegmentInfo`. Written only by a commit.
202
+ let committedSegmentInfo: SegmentInfo[] | null = null;
203
+
186
204
  // See `reportStatusPageRendered`: a status page that commits with no
187
205
  // navigation to consume the report still empties the cache.
188
206
  _setOnStatusPageRendered(() => segmentCache.clear());
@@ -195,8 +213,7 @@ export function createNavigationCommitter(deps: {
195
213
  * navigation. What the flag gates is which parts get serialized — see
196
214
  * `currentStateTree`.
197
215
  */
198
- function updateSegmentCache(segmentInfo: SegmentInfo[] | null | undefined): void {
199
- if (!segmentInfo || segmentInfo.length === 0) return;
216
+ function updateSegmentCache(segmentInfo: SegmentInfo[]): void {
200
217
  const tree = buildSegmentTree(segmentInfo);
201
218
  if (tree) {
202
219
  segmentCache.set('/', tree);
@@ -204,7 +221,9 @@ export function createNavigationCommitter(deps: {
204
221
  }
205
222
 
206
223
  return {
207
- updateSegmentCache,
224
+ committedSegmentInfo: () => committedSegmentInfo,
225
+ isSegmentReuseSuppressed: () => segmentCache.isReuseSuppressed(),
226
+ restoreSegmentReuse: () => segmentCache.restoreReuse(),
208
227
 
209
228
  /**
210
229
  * The X-Timber-State-Tree to send with the next RSC request.
@@ -236,9 +255,13 @@ export function createNavigationCommitter(deps: {
236
255
  * the URL and is what the incoming tree is *rendered* with, plus a
237
256
  * `commit` thunk that performs the writes that make a page current:
238
257
  * 1. Segment cache — update from server-provided segment metadata
239
- * 2. Navigation state — pathname/search for usePathname/useSearchParams
258
+ * 2. The current page's segment metadata (`committedSegmentInfo`)
240
259
  * 3. History stack — store the payload for instant back/forward replay
241
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
+ *
242
265
  * Nothing is written until `commit()` runs, and on a transitioned
243
266
  * navigation it runs only once the transition is known to have won — see
244
267
  * `renderViaTransition` and `NavigationRoot`. A navigation superseded
@@ -281,12 +304,12 @@ export function createNavigationCommitter(deps: {
281
304
  segmentCache.clear();
282
305
  }
283
306
 
284
- setNavigationState(navState);
307
+ committedSegmentInfo = storedSegmentInfo(segmentInfo) ?? null;
285
308
 
286
309
  historyStack.push(url, {
287
310
  payload,
288
311
  params: opts.params,
289
- segmentInfo: storedSegmentInfo(segmentInfo),
312
+ segmentInfo: committedSegmentInfo,
290
313
  });
291
314
  },
292
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
  /**