@timber-js/app 0.2.0-alpha.12 → 0.2.0-alpha.121

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 (760) hide show
  1. package/dist/_chunks/actions-Dy8vOjFt.js +1101 -0
  2. package/dist/_chunks/actions-Dy8vOjFt.js.map +1 -0
  3. package/dist/_chunks/build-output-helper-B1n0sUqj.js +61 -0
  4. package/dist/_chunks/build-output-helper-B1n0sUqj.js.map +1 -0
  5. package/dist/_chunks/cli-schema-sync-ByZPGGmS.js +724 -0
  6. package/dist/_chunks/cli-schema-sync-ByZPGGmS.js.map +1 -0
  7. package/dist/_chunks/cli-schema-sync-DHQLjFu3.js +2 -0
  8. package/dist/_chunks/codec-registry-G9hD5LOq.js +21 -0
  9. package/dist/_chunks/codec-registry-G9hD5LOq.js.map +1 -0
  10. package/dist/_chunks/define-CPVQaWbx.js +124 -0
  11. package/dist/_chunks/define-CPVQaWbx.js.map +1 -0
  12. package/dist/_chunks/define-jeHDXZGq.js +195 -0
  13. package/dist/_chunks/define-jeHDXZGq.js.map +1 -0
  14. package/dist/_chunks/format-BjN9HLu9.js +14 -0
  15. package/dist/_chunks/format-BjN9HLu9.js.map +1 -0
  16. package/dist/_chunks/handler-store-CcwNX-gk.js +54 -0
  17. package/dist/_chunks/handler-store-CcwNX-gk.js.map +1 -0
  18. package/dist/_chunks/logger-DDmK5skc.js +291 -0
  19. package/dist/_chunks/logger-DDmK5skc.js.map +1 -0
  20. package/dist/_chunks/merge-search-params-az6ZiBeU.js +41 -0
  21. package/dist/_chunks/merge-search-params-az6ZiBeU.js.map +1 -0
  22. package/dist/_chunks/navigation-root-DoRTeBm5.js +96 -0
  23. package/dist/_chunks/navigation-root-DoRTeBm5.js.map +1 -0
  24. package/dist/_chunks/registry-BI9cgCt7.js +20 -0
  25. package/dist/_chunks/registry-BI9cgCt7.js.map +1 -0
  26. package/dist/_chunks/resolve-schema-Bf8eC6q6.js +73 -0
  27. package/dist/_chunks/resolve-schema-Bf8eC6q6.js.map +1 -0
  28. package/dist/_chunks/router-ref-CpvjBqdu.js +28 -0
  29. package/dist/_chunks/router-ref-CpvjBqdu.js.map +1 -0
  30. package/dist/_chunks/schema-bridge-o0SwFtXW.js +86 -0
  31. package/dist/_chunks/schema-bridge-o0SwFtXW.js.map +1 -0
  32. package/dist/_chunks/segment-classify-CnfLLvir.js +137 -0
  33. package/dist/_chunks/segment-classify-CnfLLvir.js.map +1 -0
  34. package/dist/_chunks/segment-context-EsfQpS--.js +34 -0
  35. package/dist/_chunks/segment-context-EsfQpS--.js.map +1 -0
  36. package/dist/_chunks/{ssr-data-MjmprTmO.js → ssr-data-m9-cNEIw.js} +1 -1
  37. package/dist/_chunks/ssr-data-m9-cNEIw.js.map +1 -0
  38. package/dist/_chunks/stale-reload-BN2kcE06.js +64 -0
  39. package/dist/_chunks/stale-reload-BN2kcE06.js.map +1 -0
  40. package/dist/_chunks/tracing-DvKLzCFa.js +329 -0
  41. package/dist/_chunks/tracing-DvKLzCFa.js.map +1 -0
  42. package/dist/_chunks/{use-query-states-D5KaffOK.js → use-query-states-C9G6LP0F.js} +7 -20
  43. package/dist/_chunks/use-query-states-C9G6LP0F.js.map +1 -0
  44. package/dist/_chunks/use-segment-params-CtIAjqK0.js +185 -0
  45. package/dist/_chunks/use-segment-params-CtIAjqK0.js.map +1 -0
  46. package/dist/_chunks/validation-BMU5MPzP.js +84 -0
  47. package/dist/_chunks/validation-BMU5MPzP.js.map +1 -0
  48. package/dist/_chunks/walkers-DNp9tHyV.js +719 -0
  49. package/dist/_chunks/walkers-DNp9tHyV.js.map +1 -0
  50. package/dist/_chunks/{format-DviM89f0.js → warnings-B30wpfaS.js} +6 -45
  51. package/dist/_chunks/warnings-B30wpfaS.js.map +1 -0
  52. package/dist/adapters/build-output-helper.d.ts +28 -0
  53. package/dist/adapters/build-output-helper.d.ts.map +1 -0
  54. package/dist/adapters/cloudflare-dev.d.ts +109 -0
  55. package/dist/adapters/cloudflare-dev.d.ts.map +1 -0
  56. package/dist/adapters/cloudflare-dev.js +73 -0
  57. package/dist/adapters/cloudflare-dev.js.map +1 -0
  58. package/dist/adapters/cloudflare-kv-cache.d.ts +64 -0
  59. package/dist/adapters/cloudflare-kv-cache.d.ts.map +1 -0
  60. package/dist/adapters/cloudflare-kv-cache.js +95 -0
  61. package/dist/adapters/cloudflare-kv-cache.js.map +1 -0
  62. package/dist/adapters/cloudflare.d.ts +148 -12
  63. package/dist/adapters/cloudflare.d.ts.map +1 -1
  64. package/dist/adapters/cloudflare.js +142 -38
  65. package/dist/adapters/cloudflare.js.map +1 -1
  66. package/dist/adapters/compress-module.d.ts.map +1 -1
  67. package/dist/adapters/nitro.d.ts +17 -1
  68. package/dist/adapters/nitro.d.ts.map +1 -1
  69. package/dist/adapters/nitro.js +143 -45
  70. package/dist/adapters/nitro.js.map +1 -1
  71. package/dist/adapters/shared.d.ts +16 -0
  72. package/dist/adapters/shared.d.ts.map +1 -0
  73. package/dist/cache/cache-api.d.ts +24 -0
  74. package/dist/cache/cache-api.d.ts.map +1 -0
  75. package/dist/cache/handler-store.d.ts +31 -0
  76. package/dist/cache/handler-store.d.ts.map +1 -0
  77. package/dist/cache/index.d.ts +23 -7
  78. package/dist/cache/index.d.ts.map +1 -1
  79. package/dist/cache/index.js +151 -81
  80. package/dist/cache/index.js.map +1 -1
  81. package/dist/cache/singleflight.d.ts +18 -1
  82. package/dist/cache/singleflight.d.ts.map +1 -1
  83. package/dist/cache/sizeof.d.ts +22 -0
  84. package/dist/cache/sizeof.d.ts.map +1 -0
  85. package/dist/cache/timber-cache.d.ts +1 -1
  86. package/dist/cache/timber-cache.d.ts.map +1 -1
  87. package/dist/cli-schema-sync.d.ts +37 -0
  88. package/dist/cli-schema-sync.d.ts.map +1 -0
  89. package/dist/cli.d.ts +14 -2
  90. package/dist/cli.d.ts.map +1 -1
  91. package/dist/cli.js +42 -6
  92. package/dist/cli.js.map +1 -1
  93. package/dist/client/browser-dev.d.ts +34 -1
  94. package/dist/client/browser-dev.d.ts.map +1 -1
  95. package/dist/client/browser-entry/action-dispatch.d.ts +17 -0
  96. package/dist/client/browser-entry/action-dispatch.d.ts.map +1 -0
  97. package/dist/client/browser-entry/hmr.d.ts +21 -0
  98. package/dist/client/browser-entry/hmr.d.ts.map +1 -0
  99. package/dist/client/browser-entry/hydrate.d.ts +46 -0
  100. package/dist/client/browser-entry/hydrate.d.ts.map +1 -0
  101. package/dist/client/browser-entry/index.d.ts +30 -0
  102. package/dist/client/browser-entry/index.d.ts.map +1 -0
  103. package/dist/client/browser-entry/post-hydration.d.ts +26 -0
  104. package/dist/client/browser-entry/post-hydration.d.ts.map +1 -0
  105. package/dist/client/browser-entry/router-init.d.ts +23 -0
  106. package/dist/client/browser-entry/router-init.d.ts.map +1 -0
  107. package/dist/client/browser-entry/rsc-stream.d.ts +24 -0
  108. package/dist/client/browser-entry/rsc-stream.d.ts.map +1 -0
  109. package/dist/client/browser-entry/scroll.d.ts +19 -0
  110. package/dist/client/browser-entry/scroll.d.ts.map +1 -0
  111. package/dist/client/error-boundary.d.ts +12 -5
  112. package/dist/client/error-boundary.d.ts.map +1 -1
  113. package/dist/client/error-boundary.js +29 -6
  114. package/dist/client/error-boundary.js.map +1 -1
  115. package/dist/client/error-reconstituter.d.ts +54 -0
  116. package/dist/client/error-reconstituter.d.ts.map +1 -0
  117. package/dist/client/form.d.ts +16 -27
  118. package/dist/client/form.d.ts.map +1 -1
  119. package/dist/client/history.d.ts +19 -4
  120. package/dist/client/history.d.ts.map +1 -1
  121. package/dist/client/index.d.ts +9 -24
  122. package/dist/client/index.d.ts.map +1 -1
  123. package/dist/client/index.js +172 -1100
  124. package/dist/client/index.js.map +1 -1
  125. package/dist/client/internal.d.ts +19 -0
  126. package/dist/client/internal.d.ts.map +1 -0
  127. package/dist/client/internal.js +964 -0
  128. package/dist/client/internal.js.map +1 -0
  129. package/dist/client/link-pending-store.d.ts +63 -0
  130. package/dist/client/link-pending-store.d.ts.map +1 -0
  131. package/dist/client/link.d.ts +62 -55
  132. package/dist/client/link.d.ts.map +1 -1
  133. package/dist/client/nav-link-store.d.ts +36 -0
  134. package/dist/client/nav-link-store.d.ts.map +1 -0
  135. package/dist/client/navigation-api-types.d.ts +90 -0
  136. package/dist/client/navigation-api-types.d.ts.map +1 -0
  137. package/dist/client/navigation-api.d.ts +115 -0
  138. package/dist/client/navigation-api.d.ts.map +1 -0
  139. package/dist/client/navigation-context.d.ts +13 -2
  140. package/dist/client/navigation-context.d.ts.map +1 -1
  141. package/dist/client/{transition-root.d.ts → navigation-root.d.ts} +42 -8
  142. package/dist/client/navigation-root.d.ts.map +1 -0
  143. package/dist/client/nuqs-adapter.d.ts.map +1 -1
  144. package/dist/client/router-ref.d.ts +1 -1
  145. package/dist/client/router.d.ts +70 -4
  146. package/dist/client/router.d.ts.map +1 -1
  147. package/dist/client/rsc-fetch.d.ts +38 -3
  148. package/dist/client/rsc-fetch.d.ts.map +1 -1
  149. package/dist/client/segment-cache.d.ts +1 -1
  150. package/dist/client/segment-cache.d.ts.map +1 -1
  151. package/dist/client/segment-outlet.d.ts +63 -0
  152. package/dist/client/segment-outlet.d.ts.map +1 -0
  153. package/dist/client/ssr-data.d.ts +13 -4
  154. package/dist/client/ssr-data.d.ts.map +1 -1
  155. package/dist/client/stale-reload.d.ts +15 -0
  156. package/dist/client/stale-reload.d.ts.map +1 -1
  157. package/dist/client/state.d.ts +1 -1
  158. package/dist/client/top-loader.d.ts +5 -5
  159. package/dist/client/top-loader.d.ts.map +1 -1
  160. package/dist/client/use-cookie.d.ts +12 -0
  161. package/dist/client/use-cookie.d.ts.map +1 -1
  162. package/dist/client/use-link-status.d.ts +5 -5
  163. package/dist/client/use-link-status.d.ts.map +1 -1
  164. package/dist/client/{use-navigation-pending.d.ts → use-pending-navigation.d.ts} +4 -4
  165. package/dist/client/use-pending-navigation.d.ts.map +1 -0
  166. package/dist/client/use-query-states.d.ts +1 -1
  167. package/dist/client/use-query-states.d.ts.map +1 -1
  168. package/dist/client/use-router.d.ts +1 -1
  169. package/dist/client/{use-params.d.ts → use-segment-params.d.ts} +8 -6
  170. package/dist/client/use-segment-params.d.ts.map +1 -0
  171. package/dist/codec.d.ts +69 -0
  172. package/dist/codec.d.ts.map +1 -0
  173. package/dist/codec.js +75 -0
  174. package/dist/codec.js.map +1 -0
  175. package/dist/config-types.d.ts +294 -0
  176. package/dist/config-types.d.ts.map +1 -0
  177. package/dist/config-validation.d.ts +51 -0
  178. package/dist/config-validation.d.ts.map +1 -0
  179. package/dist/content/index.d.ts +1 -10
  180. package/dist/content/index.d.ts.map +1 -1
  181. package/dist/content/index.js +0 -2
  182. package/dist/cookies/define-cookie.d.ts +58 -25
  183. package/dist/cookies/define-cookie.d.ts.map +1 -1
  184. package/dist/cookies/index.d.ts +2 -1
  185. package/dist/cookies/index.d.ts.map +1 -1
  186. package/dist/cookies/index.js +251 -36
  187. package/dist/cookies/index.js.map +1 -1
  188. package/dist/cookies/json-cookie.d.ts +64 -0
  189. package/dist/cookies/json-cookie.d.ts.map +1 -0
  190. package/dist/cookies/validation.d.ts +46 -0
  191. package/dist/cookies/validation.d.ts.map +1 -0
  192. package/dist/dev-tools/404-page.d.ts +46 -0
  193. package/dist/dev-tools/404-page.d.ts.map +1 -0
  194. package/dist/dev-tools/browser-logs.d.ts +84 -0
  195. package/dist/dev-tools/browser-logs.d.ts.map +1 -0
  196. package/dist/dev-tools/error-page.d.ts +58 -0
  197. package/dist/dev-tools/error-page.d.ts.map +1 -0
  198. package/dist/dev-tools/holding-server.d.ts +54 -0
  199. package/dist/dev-tools/holding-server.d.ts.map +1 -0
  200. package/dist/dev-tools/index.d.ts +31 -0
  201. package/dist/dev-tools/index.d.ts.map +1 -0
  202. package/dist/{server/dev-span-processor.d.ts → dev-tools/instrumentation.d.ts} +26 -6
  203. package/dist/dev-tools/instrumentation.d.ts.map +1 -0
  204. package/dist/{server/dev-logger.d.ts → dev-tools/logger.d.ts} +1 -1
  205. package/dist/dev-tools/logger.d.ts.map +1 -0
  206. package/dist/{plugins/dev-logs.d.ts → dev-tools/logs.d.ts} +2 -2
  207. package/dist/dev-tools/logs.d.ts.map +1 -0
  208. package/dist/dev-tools/overlay.d.ts +91 -0
  209. package/dist/dev-tools/overlay.d.ts.map +1 -0
  210. package/dist/dev-tools/stack-classifier.d.ts +34 -0
  211. package/dist/dev-tools/stack-classifier.d.ts.map +1 -0
  212. package/dist/dev-tools/terminal.d.ts +28 -0
  213. package/dist/dev-tools/terminal.d.ts.map +1 -0
  214. package/dist/{server/dev-warnings.d.ts → dev-tools/warnings.d.ts} +2 -22
  215. package/dist/dev-tools/warnings.d.ts.map +1 -0
  216. package/dist/fonts/ast.d.ts +98 -6
  217. package/dist/fonts/ast.d.ts.map +1 -1
  218. package/dist/fonts/bundle.d.ts +48 -0
  219. package/dist/fonts/bundle.d.ts.map +1 -0
  220. package/dist/fonts/dev-middleware.d.ts +22 -0
  221. package/dist/fonts/dev-middleware.d.ts.map +1 -0
  222. package/dist/fonts/local.d.ts +1 -1
  223. package/dist/fonts/pipeline.d.ts +167 -0
  224. package/dist/fonts/pipeline.d.ts.map +1 -0
  225. package/dist/fonts/transform.d.ts +78 -0
  226. package/dist/fonts/transform.d.ts.map +1 -0
  227. package/dist/fonts/types.d.ts +45 -1
  228. package/dist/fonts/types.d.ts.map +1 -1
  229. package/dist/fonts/virtual-modules.d.ts +94 -0
  230. package/dist/fonts/virtual-modules.d.ts.map +1 -0
  231. package/dist/index.d.ts +46 -190
  232. package/dist/index.d.ts.map +1 -1
  233. package/dist/index.js +4807 -12729
  234. package/dist/index.js.map +1 -1
  235. package/dist/params/codec-registry.d.ts +26 -0
  236. package/dist/params/codec-registry.d.ts.map +1 -0
  237. package/dist/params/define-schema.d.ts +81 -0
  238. package/dist/params/define-schema.d.ts.map +1 -0
  239. package/dist/params/index.d.ts +5 -0
  240. package/dist/params/index.d.ts.map +1 -0
  241. package/dist/params/index.js +34 -0
  242. package/dist/params/index.js.map +1 -0
  243. package/dist/params/resolve-schema.d.ts +34 -0
  244. package/dist/params/resolve-schema.d.ts.map +1 -0
  245. package/dist/plugin-context.d.ts +107 -0
  246. package/dist/plugin-context.d.ts.map +1 -0
  247. package/dist/plugins/adapter-build.d.ts +1 -1
  248. package/dist/plugins/adapter-build.d.ts.map +1 -1
  249. package/dist/plugins/build-manifest.d.ts +2 -2
  250. package/dist/plugins/build-manifest.d.ts.map +1 -1
  251. package/dist/plugins/build-report.d.ts +9 -7
  252. package/dist/plugins/build-report.d.ts.map +1 -1
  253. package/dist/plugins/client-chunks.d.ts +32 -0
  254. package/dist/plugins/client-chunks.d.ts.map +1 -0
  255. package/dist/plugins/content.d.ts +1 -1
  256. package/dist/plugins/content.d.ts.map +1 -1
  257. package/dist/plugins/dev-server.d.ts +1 -1
  258. package/dist/plugins/dev-server.d.ts.map +1 -1
  259. package/dist/plugins/entries.d.ts +1 -1
  260. package/dist/plugins/entries.d.ts.map +1 -1
  261. package/dist/plugins/fonts.d.ts +17 -73
  262. package/dist/plugins/fonts.d.ts.map +1 -1
  263. package/dist/plugins/mdx.d.ts +1 -1
  264. package/dist/plugins/mdx.d.ts.map +1 -1
  265. package/dist/plugins/routing.d.ts +1 -1
  266. package/dist/plugins/routing.d.ts.map +1 -1
  267. package/dist/plugins/server-bundle.d.ts.map +1 -1
  268. package/dist/plugins/shims.d.ts +6 -5
  269. package/dist/plugins/shims.d.ts.map +1 -1
  270. package/dist/plugins/static-build.d.ts +5 -26
  271. package/dist/plugins/static-build.d.ts.map +1 -1
  272. package/dist/routing/codegen-shared.d.ts +63 -0
  273. package/dist/routing/codegen-shared.d.ts.map +1 -0
  274. package/dist/routing/codegen-types.d.ts +60 -0
  275. package/dist/routing/codegen-types.d.ts.map +1 -0
  276. package/dist/routing/codegen.d.ts +7 -2
  277. package/dist/routing/codegen.d.ts.map +1 -1
  278. package/dist/routing/convention-lint.d.ts +41 -0
  279. package/dist/routing/convention-lint.d.ts.map +1 -0
  280. package/dist/routing/index.d.ts +7 -1
  281. package/dist/routing/index.d.ts.map +1 -1
  282. package/dist/routing/index.js +4 -2
  283. package/dist/routing/link-codegen.d.ts +90 -0
  284. package/dist/routing/link-codegen.d.ts.map +1 -0
  285. package/dist/routing/scanner.d.ts +1 -10
  286. package/dist/routing/scanner.d.ts.map +1 -1
  287. package/dist/routing/schema-validation.d.ts +35 -0
  288. package/dist/routing/schema-validation.d.ts.map +1 -0
  289. package/dist/routing/segment-classify.d.ts +75 -0
  290. package/dist/routing/segment-classify.d.ts.map +1 -0
  291. package/dist/routing/segment-codegen.d.ts +38 -0
  292. package/dist/routing/segment-codegen.d.ts.map +1 -0
  293. package/dist/routing/types.d.ts +77 -25
  294. package/dist/routing/types.d.ts.map +1 -1
  295. package/dist/routing/walkers.d.ts +51 -0
  296. package/dist/routing/walkers.d.ts.map +1 -0
  297. package/dist/rsc-runtime/rsc.d.ts +1 -1
  298. package/dist/rsc-runtime/rsc.d.ts.map +1 -1
  299. package/dist/rsc-runtime/ssr.d.ts +12 -0
  300. package/dist/rsc-runtime/ssr.d.ts.map +1 -1
  301. package/dist/schema-bridge.d.ts +76 -0
  302. package/dist/schema-bridge.d.ts.map +1 -0
  303. package/dist/search-params/define.d.ts +157 -0
  304. package/dist/search-params/define.d.ts.map +1 -0
  305. package/dist/search-params/index.d.ts +4 -7
  306. package/dist/search-params/index.d.ts.map +1 -1
  307. package/dist/search-params/index.js +34 -441
  308. package/dist/search-params/index.js.map +1 -1
  309. package/dist/search-params/registry.d.ts +2 -2
  310. package/dist/search-params/registry.d.ts.map +1 -1
  311. package/dist/search-params/wrappers.d.ts +53 -0
  312. package/dist/search-params/wrappers.d.ts.map +1 -0
  313. package/dist/segment-params/define.d.ts +95 -0
  314. package/dist/segment-params/define.d.ts.map +1 -0
  315. package/dist/segment-params/index.d.ts +3 -0
  316. package/dist/segment-params/index.d.ts.map +1 -0
  317. package/dist/segment-params/index.js +2 -0
  318. package/dist/server/access-gate.d.ts +8 -3
  319. package/dist/server/access-gate.d.ts.map +1 -1
  320. package/dist/server/action-client.d.ts +41 -6
  321. package/dist/server/action-client.d.ts.map +1 -1
  322. package/dist/server/action-encryption.d.ts +76 -0
  323. package/dist/server/action-encryption.d.ts.map +1 -0
  324. package/dist/server/action-handler.d.ts +35 -1
  325. package/dist/server/action-handler.d.ts.map +1 -1
  326. package/dist/server/actions.d.ts +3 -6
  327. package/dist/server/actions.d.ts.map +1 -1
  328. package/dist/server/als-registry.d.ts +53 -5
  329. package/dist/server/als-registry.d.ts.map +1 -1
  330. package/dist/server/asset-headers.d.ts +1 -15
  331. package/dist/server/asset-headers.d.ts.map +1 -1
  332. package/dist/server/build-manifest.d.ts +2 -2
  333. package/dist/server/build-manifest.d.ts.map +1 -1
  334. package/dist/server/coalesce-tick.d.ts +40 -0
  335. package/dist/server/coalesce-tick.d.ts.map +1 -0
  336. package/dist/server/cookie-context.d.ts +170 -0
  337. package/dist/server/cookie-context.d.ts.map +1 -0
  338. package/dist/server/cookie-parsing.d.ts +51 -0
  339. package/dist/server/cookie-parsing.d.ts.map +1 -0
  340. package/dist/server/debug.d.ts +1 -1
  341. package/dist/server/default-logger.d.ts +22 -0
  342. package/dist/server/default-logger.d.ts.map +1 -0
  343. package/dist/server/deny-boundary.d.ts +90 -0
  344. package/dist/server/deny-boundary.d.ts.map +1 -0
  345. package/dist/server/deny-renderer.d.ts.map +1 -1
  346. package/dist/server/dev-source-map.d.ts +22 -0
  347. package/dist/server/dev-source-map.d.ts.map +1 -0
  348. package/dist/server/early-hints-sender.d.ts.map +1 -1
  349. package/dist/server/early-hints.d.ts +13 -5
  350. package/dist/server/early-hints.d.ts.map +1 -1
  351. package/dist/server/error-boundary-wrapper.d.ts +7 -1
  352. package/dist/server/error-boundary-wrapper.d.ts.map +1 -1
  353. package/dist/server/fallback-error.d.ts +12 -7
  354. package/dist/server/fallback-error.d.ts.map +1 -1
  355. package/dist/server/flight-injection-state.d.ts +66 -0
  356. package/dist/server/flight-injection-state.d.ts.map +1 -0
  357. package/dist/server/flight-scripts.d.ts +42 -0
  358. package/dist/server/flight-scripts.d.ts.map +1 -0
  359. package/dist/server/flush.d.ts.map +1 -1
  360. package/dist/server/form-data.d.ts +29 -0
  361. package/dist/server/form-data.d.ts.map +1 -1
  362. package/dist/server/html-injector-core.d.ts +213 -0
  363. package/dist/server/html-injector-core.d.ts.map +1 -0
  364. package/dist/server/html-injectors.d.ts +81 -41
  365. package/dist/server/html-injectors.d.ts.map +1 -1
  366. package/dist/server/index.d.ts +10 -46
  367. package/dist/server/index.d.ts.map +1 -1
  368. package/dist/server/index.js +155 -2905
  369. package/dist/server/index.js.map +1 -1
  370. package/dist/server/internal.d.ts +48 -0
  371. package/dist/server/internal.d.ts.map +1 -0
  372. package/dist/server/internal.js +2947 -0
  373. package/dist/server/internal.js.map +1 -0
  374. package/dist/server/logger.d.ts +39 -7
  375. package/dist/server/logger.d.ts.map +1 -1
  376. package/dist/server/middleware-runner.d.ts +36 -4
  377. package/dist/server/middleware-runner.d.ts.map +1 -1
  378. package/dist/server/node-stream-transforms.d.ts +112 -0
  379. package/dist/server/node-stream-transforms.d.ts.map +1 -0
  380. package/dist/server/param-coercion.d.ts +54 -0
  381. package/dist/server/param-coercion.d.ts.map +1 -0
  382. package/dist/server/pipeline-helpers.d.ts +95 -0
  383. package/dist/server/pipeline-helpers.d.ts.map +1 -0
  384. package/dist/server/pipeline-interception.d.ts +1 -1
  385. package/dist/server/pipeline-interception.d.ts.map +1 -1
  386. package/dist/server/pipeline-metadata.d.ts +6 -0
  387. package/dist/server/pipeline-metadata.d.ts.map +1 -1
  388. package/dist/server/pipeline-outcome.d.ts +49 -0
  389. package/dist/server/pipeline-outcome.d.ts.map +1 -0
  390. package/dist/server/pipeline-phases.d.ts +52 -0
  391. package/dist/server/pipeline-phases.d.ts.map +1 -0
  392. package/dist/server/pipeline.d.ts +118 -23
  393. package/dist/server/pipeline.d.ts.map +1 -1
  394. package/dist/server/port-resolution.d.ts +117 -0
  395. package/dist/server/port-resolution.d.ts.map +1 -0
  396. package/dist/server/primitives.d.ts +69 -18
  397. package/dist/server/primitives.d.ts.map +1 -1
  398. package/dist/server/render-timeout.d.ts +51 -0
  399. package/dist/server/render-timeout.d.ts.map +1 -0
  400. package/dist/server/request-context.d.ts +62 -107
  401. package/dist/server/request-context.d.ts.map +1 -1
  402. package/dist/server/route-element-builder.d.ts +27 -1
  403. package/dist/server/route-element-builder.d.ts.map +1 -1
  404. package/dist/server/route-handler.d.ts.map +1 -1
  405. package/dist/server/route-matcher.d.ts +21 -34
  406. package/dist/server/route-matcher.d.ts.map +1 -1
  407. package/dist/server/rsc-entry/action-middleware-runner.d.ts +66 -0
  408. package/dist/server/rsc-entry/action-middleware-runner.d.ts.map +1 -0
  409. package/dist/server/rsc-entry/api-handler.d.ts +2 -2
  410. package/dist/server/rsc-entry/api-handler.d.ts.map +1 -1
  411. package/dist/server/rsc-entry/error-renderer.d.ts +26 -13
  412. package/dist/server/rsc-entry/error-renderer.d.ts.map +1 -1
  413. package/dist/server/rsc-entry/helpers.d.ts +49 -6
  414. package/dist/server/rsc-entry/helpers.d.ts.map +1 -1
  415. package/dist/server/rsc-entry/index.d.ts +19 -8
  416. package/dist/server/rsc-entry/index.d.ts.map +1 -1
  417. package/dist/server/rsc-entry/render-route.d.ts +50 -0
  418. package/dist/server/rsc-entry/render-route.d.ts.map +1 -0
  419. package/dist/server/rsc-entry/rsc-payload.d.ts +3 -3
  420. package/dist/server/rsc-entry/rsc-payload.d.ts.map +1 -1
  421. package/dist/server/rsc-entry/rsc-stream.d.ts +17 -1
  422. package/dist/server/rsc-entry/rsc-stream.d.ts.map +1 -1
  423. package/dist/server/rsc-entry/ssr-bridge.d.ts +1 -1
  424. package/dist/server/rsc-entry/ssr-bridge.d.ts.map +1 -1
  425. package/dist/server/rsc-entry/ssr-renderer.d.ts +19 -4
  426. package/dist/server/rsc-entry/ssr-renderer.d.ts.map +1 -1
  427. package/dist/server/rsc-entry/wrap-action-dispatch.d.ts +119 -0
  428. package/dist/server/rsc-entry/wrap-action-dispatch.d.ts.map +1 -0
  429. package/dist/server/safe-load.d.ts +46 -0
  430. package/dist/server/safe-load.d.ts.map +1 -0
  431. package/dist/server/sensitive-fields.d.ts +74 -0
  432. package/dist/server/sensitive-fields.d.ts.map +1 -0
  433. package/dist/server/sitemap-generator.d.ts +129 -0
  434. package/dist/server/sitemap-generator.d.ts.map +1 -0
  435. package/dist/server/sitemap-handler.d.ts +22 -0
  436. package/dist/server/sitemap-handler.d.ts.map +1 -0
  437. package/dist/server/slot-resolver.d.ts +1 -1
  438. package/dist/server/slot-resolver.d.ts.map +1 -1
  439. package/dist/server/ssr-entry.d.ts +30 -0
  440. package/dist/server/ssr-entry.d.ts.map +1 -1
  441. package/dist/server/ssr-render.d.ts +39 -21
  442. package/dist/server/ssr-render.d.ts.map +1 -1
  443. package/dist/server/ssr-wrappers.d.ts +50 -0
  444. package/dist/server/ssr-wrappers.d.ts.map +1 -0
  445. package/dist/server/state-tree-diff.d.ts.map +1 -1
  446. package/dist/server/status-code-resolver.d.ts +16 -11
  447. package/dist/server/status-code-resolver.d.ts.map +1 -1
  448. package/dist/server/stream-utils.d.ts +36 -0
  449. package/dist/server/stream-utils.d.ts.map +1 -0
  450. package/dist/server/tracing.d.ts +5 -5
  451. package/dist/server/tracing.d.ts.map +1 -1
  452. package/dist/server/tree-builder.d.ts +62 -30
  453. package/dist/server/tree-builder.d.ts.map +1 -1
  454. package/dist/server/tree-match.d.ts +41 -0
  455. package/dist/server/tree-match.d.ts.map +1 -0
  456. package/dist/server/types.d.ts +49 -4
  457. package/dist/server/types.d.ts.map +1 -1
  458. package/dist/server/utils/escape-html.d.ts +14 -0
  459. package/dist/server/utils/escape-html.d.ts.map +1 -0
  460. package/dist/server/version-skew.d.ts +61 -0
  461. package/dist/server/version-skew.d.ts.map +1 -0
  462. package/dist/shared/merge-search-params.d.ts +22 -0
  463. package/dist/shared/merge-search-params.d.ts.map +1 -0
  464. package/dist/shims/font-google.d.ts +1 -1
  465. package/dist/shims/font-google.d.ts.map +1 -1
  466. package/dist/shims/font-google.js +42 -0
  467. package/dist/shims/font-google.js.map +1 -0
  468. package/dist/shims/font-local.d.ts +26 -0
  469. package/dist/shims/font-local.d.ts.map +1 -0
  470. package/dist/shims/font-local.js +20 -0
  471. package/dist/shims/font-local.js.map +1 -0
  472. package/dist/shims/headers.d.ts +2 -1
  473. package/dist/shims/headers.d.ts.map +1 -1
  474. package/dist/shims/navigation-client.d.ts +3 -1
  475. package/dist/shims/navigation-client.d.ts.map +1 -1
  476. package/dist/shims/navigation.d.ts +11 -5
  477. package/dist/shims/navigation.d.ts.map +1 -1
  478. package/dist/utils/state-machine.d.ts +80 -0
  479. package/dist/utils/state-machine.d.ts.map +1 -0
  480. package/package.json +62 -21
  481. package/src/adapters/build-output-helper.ts +77 -0
  482. package/src/adapters/cloudflare-dev.ts +177 -0
  483. package/src/adapters/cloudflare-kv-cache.ts +142 -0
  484. package/src/adapters/cloudflare.ts +350 -76
  485. package/src/adapters/compress-module.ts +24 -4
  486. package/src/adapters/nitro.ts +142 -59
  487. package/src/adapters/shared.ts +40 -0
  488. package/src/adapters/wrangler.d.ts +7 -0
  489. package/src/cache/cache-api.ts +38 -0
  490. package/src/cache/handler-store.ts +68 -0
  491. package/src/cache/index.ts +81 -18
  492. package/src/cache/singleflight.ts +62 -4
  493. package/src/cache/sizeof.ts +33 -0
  494. package/src/cache/timber-cache.ts +25 -20
  495. package/src/cli-schema-sync.ts +207 -0
  496. package/src/cli.ts +65 -8
  497. package/src/client/browser-dev.ts +153 -1
  498. package/src/client/browser-entry/action-dispatch.ts +126 -0
  499. package/src/client/browser-entry/hmr.ts +81 -0
  500. package/src/client/browser-entry/hydrate.ts +145 -0
  501. package/src/client/browser-entry/index.ts +149 -0
  502. package/src/client/browser-entry/post-hydration.ts +119 -0
  503. package/src/client/browser-entry/router-init.ts +193 -0
  504. package/src/client/browser-entry/rsc-stream.ts +157 -0
  505. package/src/client/browser-entry/scroll.ts +27 -0
  506. package/src/client/error-boundary.tsx +99 -22
  507. package/src/client/error-reconstituter.tsx +65 -0
  508. package/src/client/form.tsx +31 -32
  509. package/src/client/history.ts +26 -4
  510. package/src/client/index.ts +69 -44
  511. package/src/client/internal.ts +58 -0
  512. package/src/client/link-pending-store.ts +111 -0
  513. package/src/client/link.tsx +366 -113
  514. package/src/client/nav-link-store.ts +47 -0
  515. package/src/client/navigation-api-types.ts +112 -0
  516. package/src/client/navigation-api.ts +332 -0
  517. package/src/client/navigation-context.ts +31 -6
  518. package/src/client/navigation-root.tsx +342 -0
  519. package/src/client/nuqs-adapter.tsx +16 -3
  520. package/src/client/router-ref.ts +1 -1
  521. package/src/client/router.ts +300 -73
  522. package/src/client/rsc-fetch.ts +112 -8
  523. package/src/client/segment-cache.ts +1 -1
  524. package/src/client/segment-outlet.tsx +86 -0
  525. package/src/client/ssr-data.ts +13 -5
  526. package/src/client/stale-reload.ts +72 -3
  527. package/src/client/state.ts +2 -2
  528. package/src/client/top-loader.tsx +18 -6
  529. package/src/client/use-cookie.ts +31 -2
  530. package/src/client/use-link-status.ts +7 -7
  531. package/src/client/{use-navigation-pending.ts → use-pending-navigation.ts} +6 -6
  532. package/src/client/use-query-states.ts +9 -3
  533. package/src/client/use-router.ts +1 -1
  534. package/src/client/{use-params.ts → use-segment-params.ts} +8 -6
  535. package/src/codec.ts +147 -0
  536. package/src/config-types.ts +292 -0
  537. package/src/config-validation.ts +303 -0
  538. package/src/content/index.ts +5 -13
  539. package/src/cookies/define-cookie.ts +233 -53
  540. package/src/cookies/index.ts +12 -1
  541. package/src/cookies/json-cookie.ts +105 -0
  542. package/src/cookies/validation.ts +134 -0
  543. package/src/dev-tools/404-page.ts +387 -0
  544. package/src/dev-tools/browser-logs.ts +291 -0
  545. package/src/dev-tools/error-page.ts +506 -0
  546. package/src/dev-tools/holding-server.ts +187 -0
  547. package/src/dev-tools/index.ts +90 -0
  548. package/src/dev-tools/instrumentation.ts +176 -0
  549. package/src/{plugins/dev-logs.ts → dev-tools/logs.ts} +9 -5
  550. package/src/dev-tools/overlay.ts +469 -0
  551. package/src/dev-tools/stack-classifier.ts +75 -0
  552. package/src/dev-tools/terminal.ts +183 -0
  553. package/src/{server/dev-warnings.ts → dev-tools/warnings.ts} +5 -50
  554. package/src/fonts/ast.ts +525 -16
  555. package/src/fonts/bundle.ts +142 -0
  556. package/src/fonts/dev-middleware.ts +74 -0
  557. package/src/fonts/local.ts +1 -1
  558. package/src/fonts/pipeline.ts +314 -0
  559. package/src/fonts/transform.ts +317 -0
  560. package/src/fonts/types.ts +50 -1
  561. package/src/fonts/virtual-modules.ts +233 -0
  562. package/src/index.ts +409 -357
  563. package/src/params/codec-registry.ts +34 -0
  564. package/src/params/define-schema.ts +114 -0
  565. package/src/params/index.ts +17 -0
  566. package/src/params/resolve-schema.ts +101 -0
  567. package/src/plugin-context.ts +240 -0
  568. package/src/plugins/adapter-build.ts +12 -4
  569. package/src/plugins/build-manifest.ts +13 -2
  570. package/src/plugins/build-report.ts +16 -25
  571. package/src/plugins/client-chunks.ts +65 -0
  572. package/src/plugins/content.ts +1 -1
  573. package/src/plugins/dev-server.ts +175 -35
  574. package/src/plugins/entries.ts +111 -9
  575. package/src/plugins/fonts.ts +157 -654
  576. package/src/plugins/mdx.ts +47 -10
  577. package/src/plugins/routing.ts +371 -45
  578. package/src/plugins/server-bundle.ts +32 -1
  579. package/src/plugins/shims.ts +136 -35
  580. package/src/plugins/static-build.ts +15 -89
  581. package/src/routing/codegen-shared.ts +109 -0
  582. package/src/routing/codegen-types.ts +61 -0
  583. package/src/routing/codegen.ts +316 -177
  584. package/src/routing/convention-lint.ts +357 -0
  585. package/src/routing/index.ts +10 -1
  586. package/src/routing/interception.ts +1 -1
  587. package/src/routing/link-codegen.ts +308 -0
  588. package/src/routing/scanner.ts +165 -110
  589. package/src/routing/schema-validation.ts +149 -0
  590. package/src/routing/segment-classify.ts +188 -0
  591. package/src/routing/segment-codegen.ts +98 -0
  592. package/src/routing/types.ts +78 -25
  593. package/src/routing/walkers.ts +90 -0
  594. package/src/rsc-runtime/rsc.ts +2 -0
  595. package/src/rsc-runtime/ssr.ts +50 -0
  596. package/src/rsc-runtime/vendor-types.d.ts +7 -0
  597. package/src/{search-params/codecs.ts → schema-bridge.ts} +57 -20
  598. package/src/search-params/define.ts +538 -0
  599. package/src/search-params/index.ts +14 -20
  600. package/src/search-params/registry.ts +2 -2
  601. package/src/search-params/wrappers.ts +92 -0
  602. package/src/segment-params/define.ts +336 -0
  603. package/src/segment-params/index.ts +9 -0
  604. package/src/server/access-gate.tsx +76 -34
  605. package/src/server/action-client.ts +88 -15
  606. package/src/server/action-encryption.ts +144 -0
  607. package/src/server/action-handler.ts +112 -14
  608. package/src/server/actions.ts +10 -9
  609. package/src/server/als-registry.ts +55 -7
  610. package/src/server/asset-headers.ts +8 -34
  611. package/src/server/build-manifest.ts +10 -4
  612. package/src/server/coalesce-tick.ts +75 -0
  613. package/src/server/compress.ts +25 -7
  614. package/src/server/cookie-context.ts +468 -0
  615. package/src/server/cookie-parsing.ts +135 -0
  616. package/src/server/debug.ts +1 -1
  617. package/src/server/default-logger.ts +99 -0
  618. package/src/server/deny-boundary.ts +218 -0
  619. package/src/server/deny-renderer.ts +31 -50
  620. package/src/server/dev-source-map.ts +31 -0
  621. package/src/server/early-hints-sender.ts +3 -2
  622. package/src/server/early-hints.ts +36 -15
  623. package/src/server/error-boundary-wrapper.ts +74 -22
  624. package/src/server/fallback-error.ts +74 -102
  625. package/src/server/flight-injection-state.ts +113 -0
  626. package/src/server/flight-scripts.ts +62 -0
  627. package/src/server/flush.ts +2 -1
  628. package/src/server/form-data.ts +76 -0
  629. package/src/server/html-injector-core.ts +417 -0
  630. package/src/server/html-injectors.ts +235 -223
  631. package/src/server/index.ts +29 -183
  632. package/src/server/internal.ts +176 -0
  633. package/src/server/logger.ts +67 -36
  634. package/src/server/middleware-runner.ts +75 -4
  635. package/src/server/node-stream-transforms.ts +361 -0
  636. package/src/server/param-coercion.ts +206 -0
  637. package/src/server/pipeline-helpers.ts +204 -0
  638. package/src/server/pipeline-interception.ts +17 -16
  639. package/src/server/pipeline-metadata.ts +13 -0
  640. package/src/server/pipeline-outcome.ts +176 -0
  641. package/src/server/pipeline-phases.ts +460 -0
  642. package/src/server/pipeline.ts +154 -394
  643. package/src/server/port-resolution.ts +215 -0
  644. package/src/server/primitives.ts +111 -28
  645. package/src/server/render-timeout.ts +108 -0
  646. package/src/server/request-context.ts +168 -333
  647. package/src/server/route-element-builder.ts +309 -195
  648. package/src/server/route-handler.ts +24 -4
  649. package/src/server/route-matcher.ts +50 -231
  650. package/src/server/rsc-entry/action-middleware-runner.ts +167 -0
  651. package/src/server/rsc-entry/api-handler.ts +16 -17
  652. package/src/server/rsc-entry/error-renderer.ts +305 -89
  653. package/src/server/rsc-entry/helpers.ts +137 -12
  654. package/src/server/rsc-entry/index.ts +316 -352
  655. package/src/server/rsc-entry/render-route.ts +307 -0
  656. package/src/server/rsc-entry/rsc-payload.ts +65 -18
  657. package/src/server/rsc-entry/rsc-stream.ts +85 -13
  658. package/src/server/rsc-entry/ssr-bridge.ts +14 -5
  659. package/src/server/rsc-entry/ssr-renderer.ts +187 -38
  660. package/src/server/rsc-entry/wrap-action-dispatch.ts +449 -0
  661. package/src/server/safe-load.ts +60 -0
  662. package/src/server/sensitive-fields.ts +230 -0
  663. package/src/server/sitemap-generator.ts +338 -0
  664. package/src/server/sitemap-handler.ts +126 -0
  665. package/src/server/slot-resolver.ts +228 -246
  666. package/src/server/ssr-entry.ts +229 -32
  667. package/src/server/ssr-render.ts +289 -67
  668. package/src/server/ssr-wrappers.tsx +139 -0
  669. package/src/server/state-tree-diff.ts +4 -1
  670. package/src/server/status-code-resolver.ts +112 -128
  671. package/src/server/stream-utils.ts +213 -0
  672. package/src/server/tracing.ts +21 -10
  673. package/src/server/tree-builder.ts +202 -90
  674. package/src/server/tree-match.ts +198 -0
  675. package/src/server/types.ts +55 -6
  676. package/src/server/utils/escape-html.ts +20 -0
  677. package/src/server/version-skew.ts +104 -0
  678. package/src/shared/merge-search-params.ts +55 -0
  679. package/src/shims/font-google.ts +1 -1
  680. package/src/shims/font-local.ts +34 -0
  681. package/src/shims/headers.ts +5 -1
  682. package/src/shims/navigation-client.ts +4 -3
  683. package/src/shims/navigation.ts +14 -7
  684. package/src/utils/state-machine.ts +111 -0
  685. package/LICENSE +0 -8
  686. package/dist/_chunks/als-registry-B7DbZ2hS.js +0 -41
  687. package/dist/_chunks/als-registry-B7DbZ2hS.js.map +0 -1
  688. package/dist/_chunks/debug-gwlJkDuf.js +0 -108
  689. package/dist/_chunks/debug-gwlJkDuf.js.map +0 -1
  690. package/dist/_chunks/format-DviM89f0.js.map +0 -1
  691. package/dist/_chunks/interception-BOoWmLUA.js +0 -676
  692. package/dist/_chunks/interception-BOoWmLUA.js.map +0 -1
  693. package/dist/_chunks/request-context-DIkVh_jG.js +0 -330
  694. package/dist/_chunks/request-context-DIkVh_jG.js.map +0 -1
  695. package/dist/_chunks/ssr-data-MjmprTmO.js.map +0 -1
  696. package/dist/_chunks/tracing-CemImE6h.js +0 -187
  697. package/dist/_chunks/tracing-CemImE6h.js.map +0 -1
  698. package/dist/_chunks/use-cookie-DX-l1_5E.js +0 -91
  699. package/dist/_chunks/use-cookie-DX-l1_5E.js.map +0 -1
  700. package/dist/_chunks/use-query-states-D5KaffOK.js.map +0 -1
  701. package/dist/cache/register-cached-function.d.ts +0 -17
  702. package/dist/cache/register-cached-function.d.ts.map +0 -1
  703. package/dist/client/browser-entry.d.ts +0 -21
  704. package/dist/client/browser-entry.d.ts.map +0 -1
  705. package/dist/client/link-status-provider.d.ts +0 -11
  706. package/dist/client/link-status-provider.d.ts.map +0 -1
  707. package/dist/client/transition-root.d.ts.map +0 -1
  708. package/dist/client/use-navigation-pending.d.ts.map +0 -1
  709. package/dist/client/use-params.d.ts.map +0 -1
  710. package/dist/plugins/cache-transform.d.ts +0 -36
  711. package/dist/plugins/cache-transform.d.ts.map +0 -1
  712. package/dist/plugins/dev-error-overlay.d.ts +0 -60
  713. package/dist/plugins/dev-error-overlay.d.ts.map +0 -1
  714. package/dist/plugins/dev-logs.d.ts.map +0 -1
  715. package/dist/plugins/dynamic-transform.d.ts +0 -72
  716. package/dist/plugins/dynamic-transform.d.ts.map +0 -1
  717. package/dist/plugins/server-action-exports.d.ts +0 -26
  718. package/dist/plugins/server-action-exports.d.ts.map +0 -1
  719. package/dist/routing/status-file-lint.d.ts +0 -33
  720. package/dist/routing/status-file-lint.d.ts.map +0 -1
  721. package/dist/search-params/analyze.d.ts +0 -54
  722. package/dist/search-params/analyze.d.ts.map +0 -1
  723. package/dist/search-params/builtin-codecs.d.ts +0 -105
  724. package/dist/search-params/builtin-codecs.d.ts.map +0 -1
  725. package/dist/search-params/codecs.d.ts +0 -53
  726. package/dist/search-params/codecs.d.ts.map +0 -1
  727. package/dist/search-params/create.d.ts +0 -106
  728. package/dist/search-params/create.d.ts.map +0 -1
  729. package/dist/server/dev-fetch-instrumentation.d.ts +0 -22
  730. package/dist/server/dev-fetch-instrumentation.d.ts.map +0 -1
  731. package/dist/server/dev-logger.d.ts.map +0 -1
  732. package/dist/server/dev-span-processor.d.ts.map +0 -1
  733. package/dist/server/dev-warnings.d.ts.map +0 -1
  734. package/dist/server/manifest-status-resolver.d.ts +0 -58
  735. package/dist/server/manifest-status-resolver.d.ts.map +0 -1
  736. package/dist/server/prerender.d.ts +0 -77
  737. package/dist/server/prerender.d.ts.map +0 -1
  738. package/dist/server/response-cache.d.ts +0 -54
  739. package/dist/server/response-cache.d.ts.map +0 -1
  740. package/dist/utils/directive-parser.d.ts +0 -70
  741. package/dist/utils/directive-parser.d.ts.map +0 -1
  742. package/src/cache/register-cached-function.ts +0 -103
  743. package/src/client/browser-entry.ts +0 -678
  744. package/src/client/link-status-provider.tsx +0 -30
  745. package/src/client/transition-root.tsx +0 -166
  746. package/src/plugins/cache-transform.ts +0 -199
  747. package/src/plugins/dev-error-overlay.ts +0 -230
  748. package/src/plugins/dynamic-transform.ts +0 -161
  749. package/src/plugins/server-action-exports.ts +0 -220
  750. package/src/routing/status-file-lint.ts +0 -112
  751. package/src/search-params/analyze.ts +0 -192
  752. package/src/search-params/builtin-codecs.ts +0 -228
  753. package/src/search-params/create.ts +0 -321
  754. package/src/server/dev-fetch-instrumentation.ts +0 -96
  755. package/src/server/dev-span-processor.ts +0 -78
  756. package/src/server/manifest-status-resolver.ts +0 -215
  757. package/src/server/prerender.ts +0 -139
  758. package/src/server/response-cache.ts +0 -410
  759. package/src/utils/directive-parser.ts +0 -529
  760. /package/src/{server/dev-logger.ts → dev-tools/logger.ts} +0 -0
@@ -0,0 +1,119 @@
1
+ /**
2
+ * Post-Hydration Wiring — history stack, segment cache, popstate, scroll.
3
+ *
4
+ * Sets up everything that needs to happen after the React root exists:
5
+ * - Stores initial page in history stack for instant back navigation
6
+ * - Initializes scroll state for the initial entry
7
+ * - Populates segment cache from server-embedded metadata
8
+ * - Registers popstate handler for back/forward navigation
9
+ * - Sets up debounced scroll position saving
10
+ *
11
+ * See design/19-client-navigation.md §"History Stack"
12
+ */
13
+
14
+ import { setCurrentParams } from '#client-internal';
15
+ import type { RouterInstance } from '#client-internal';
16
+ import { setNavigationState } from '../navigation-context.js';
17
+ import type { NavigationApiController } from '../navigation-api.js';
18
+ import { getScrollY } from './scroll.js';
19
+
20
+ interface PostHydrationOptions {
21
+ router: RouterInstance;
22
+ navApiController: NavigationApiController | null;
23
+ /** Decoded RSC element from initial SSR (null if no RSC payload) */
24
+ initialElement: unknown;
25
+ }
26
+
27
+ /**
28
+ * Wire up post-hydration event handlers and state.
29
+ */
30
+ export function setupPostHydration({
31
+ router,
32
+ navApiController,
33
+ initialElement,
34
+ }: PostHydrationOptions): void {
35
+ // Store the initial page in the history stack so back-button works
36
+ // after the first navigation. We store the decoded RSC element so
37
+ // back navigation can replay it instantly without a server fetch.
38
+ router.historyStack.push(window.location.pathname + window.location.search, {
39
+ payload: initialElement,
40
+ headElements: null, // SSR already set the correct head
41
+ });
42
+
43
+ // Initialize scroll state for the initial entry.
44
+ // When Navigation API is available, use per-entry state.
45
+ // Otherwise fall back to history.state.
46
+ if (navApiController) {
47
+ navApiController.saveScrollPosition(0);
48
+ } else {
49
+ window.history.replaceState({ timber: true, scrollY: 0 }, '');
50
+ }
51
+
52
+ // Populate the segment cache from server-embedded segment metadata.
53
+ // This enables state tree diffing from the very first client navigation.
54
+ // See design/19-client-navigation.md §"X-Timber-State-Tree Header"
55
+ const timberSegments = (self as unknown as Record<string, unknown>).__timber_segments;
56
+ if (Array.isArray(timberSegments)) {
57
+ router.initSegmentCache(timberSegments);
58
+ delete (self as unknown as Record<string, unknown>).__timber_segments;
59
+ }
60
+
61
+ // NOTE: We do NOT cache segment elements from the initial RSC payload here.
62
+ // The decoded element from createFromReadableStream is a thenable/lazy
63
+ // element that React resolves during render — the segment walker can't
64
+ // traverse it. The element cache is populated lazily after the first SPA
65
+ // navigation (via mergeAndCachePayload in renderViaTransition), when
66
+ // the decoded payload is a fully resolved React element tree.
67
+
68
+ // If the hydration path was skipped (no RSC payload), populate the
69
+ // fallback params from server embed here.
70
+ const lateTimberParams = (self as unknown as Record<string, unknown>).__timber_params;
71
+ if (lateTimberParams && typeof lateTimberParams === 'object') {
72
+ setCurrentParams(lateTimberParams as Record<string, string | string[]>);
73
+ setNavigationState({
74
+ params: lateTimberParams as Record<string, string | string[]>,
75
+ pathname: window.location.pathname,
76
+ });
77
+ delete (self as unknown as Record<string, unknown>).__timber_params;
78
+ }
79
+
80
+ // Register popstate handler for back/forward navigation.
81
+ // When Navigation API is active, the navigate event covers traversals —
82
+ // popstate is a no-op. When unavailable, popstate handles back/forward.
83
+ //
84
+ // Use pathname+search (not full href) to match the URL format used by
85
+ // navigate() — Link hrefs are relative paths like "/scroll-test/page-a".
86
+ // Read scrollY from history.state — the browser maintains per-entry state
87
+ // so duplicate URLs in history each have their own scroll position.
88
+ window.addEventListener('popstate', () => {
89
+ // Navigation API handles traversals via the navigate event.
90
+ if (navApiController) return;
91
+
92
+ const state = window.history.state;
93
+ const scrollY = state && typeof state.scrollY === 'number' ? state.scrollY : 0;
94
+ void router.handlePopState(window.location.pathname + window.location.search, scrollY);
95
+ });
96
+
97
+ // Keep scroll position up to date as the user scrolls.
98
+ // This ensures that when the user presses back/forward, the departing
99
+ // page's scroll position is already saved in its history entry.
100
+ // When Navigation API is available, uses per-entry state via
101
+ // navigation.updateCurrentEntry(). Otherwise falls back to history.state.
102
+ // Debounced to avoid excessive state updates during smooth scrolling.
103
+ let scrollTimer: ReturnType<typeof setTimeout>;
104
+ function saveScrollPosition(): void {
105
+ clearTimeout(scrollTimer);
106
+ scrollTimer = setTimeout(() => {
107
+ const y = getScrollY();
108
+ if (navApiController) {
109
+ navApiController.saveScrollPosition(y);
110
+ } else {
111
+ const state = window.history.state;
112
+ if (state && typeof state === 'object') {
113
+ window.history.replaceState({ ...state, scrollY: y }, '');
114
+ }
115
+ }
116
+ }, 100);
117
+ }
118
+ window.addEventListener('scroll', saveScrollPosition, { passive: true });
119
+ }
@@ -0,0 +1,193 @@
1
+ /**
2
+ * Router Initialization — creates the timber router with all dependencies.
3
+ *
4
+ * Wires up RouterDeps (fetch, history, scroll, RSC decoding, render
5
+ * callbacks) and optionally sets up Navigation API integration.
6
+ *
7
+ * See design/19-client-navigation.md §"Navigation API Integration"
8
+ */
9
+
10
+ import { createElement } from 'react';
11
+ import { createFromFetch } from '../../rsc-runtime/browser.js';
12
+ import { createRouter, setGlobalRouter } from '#client-internal';
13
+ import type { RouterDeps, RouterInstance } from '#client-internal';
14
+ import type { NavigationState } from '#client-internal';
15
+ import { applyHeadElements } from '../head.js';
16
+ import { TimberNuqsAdapter } from '../nuqs-adapter.js';
17
+ import { NavigationProvider } from '../navigation-context.js';
18
+ import { transitionRender, navigateTransition } from '../navigation-root.js';
19
+ import { isStaleClientReference, triggerStaleReload } from '../stale-reload.js';
20
+ import {
21
+ hasNavigationApi,
22
+ setupNavigationApi,
23
+ type NavigationApiController,
24
+ } from '../navigation-api.js';
25
+ import { getScrollY } from './scroll.js';
26
+
27
+ export interface RouterInitResult {
28
+ router: RouterInstance;
29
+ navApiController: NavigationApiController | null;
30
+ }
31
+
32
+ /**
33
+ * Create and register the global timber router.
34
+ *
35
+ * Must be called before hydrateRoot so `useRouter()` works during
36
+ * the initial render (methods lazily resolve the router at invocation,
37
+ * not render time, but initRouter must still run first).
38
+ */
39
+ export function createTimberRouter(): RouterInitResult {
40
+ // Feature-detect Navigation API. When available, the navigate event
41
+ // replaces popstate for back/forward and catches external navigations.
42
+ // See design/19-client-navigation.md §"Navigation API Integration"
43
+ const useNavApi = hasNavigationApi();
44
+
45
+ const deps: RouterDeps = {
46
+ fetch: (url, init) => window.fetch(url, init),
47
+ pushState: (data, unused, url) => window.history.pushState(data, unused, url),
48
+ replaceState: (data, unused, url) => window.history.replaceState(data, unused, url),
49
+ navigationApiActive: useNavApi,
50
+ scrollTo: (x, y) => {
51
+ // Scroll the document viewport.
52
+ window.scrollTo(x, y);
53
+ document.documentElement.scrollTop = y;
54
+ document.body.scrollTop = y;
55
+ // Scroll any element explicitly marked as a scroll container.
56
+ // With segment tree merging, shared layouts (sidebars, nav bars)
57
+ // are reconciled in place via cloneElement — React preserves their
58
+ // DOM and scroll state naturally. We no longer auto-detect overflow
59
+ // containers, which previously found the wrong element (e.g.,
60
+ // scrolling a sidebar instead of the main content area).
61
+ // Use `data-timber-scroll-restoration` to opt in specific containers.
62
+ for (const el of document.querySelectorAll('[data-timber-scroll-restoration]')) {
63
+ (el as HTMLElement).scrollTop = y;
64
+ }
65
+ },
66
+ getCurrentUrl: () => window.location.pathname + window.location.search,
67
+ getScrollY,
68
+
69
+ // Decode RSC Flight stream using createFromFetch.
70
+ // createFromFetch takes a Promise<Response> and progressively
71
+ // parses the RSC stream as chunks arrive.
72
+ //
73
+ // Wrapped with stale client reference detection: if the server
74
+ // has been redeployed with new bundles, the RSC payload may
75
+ // reference module IDs that don't exist in the old client bundle.
76
+ // We catch "Could not find the module" errors and trigger a full
77
+ // page reload so the browser fetches the new bundle.
78
+ decodeRsc: async (fetchPromise: Promise<Response>) => {
79
+ try {
80
+ // Wait for the full RSC stream to arrive before decoding.
81
+ // createFromFetch resolves on the first Flight chunk (the shell),
82
+ // but we need the transition to stay pending for the full response
83
+ // so useOptimistic (per-link pending) persists during slow navigations.
84
+ // Buffer the complete response, then decode from the buffered stream.
85
+ const response = await fetchPromise;
86
+ const body = await response.arrayBuffer();
87
+ const buffered = new Response(body, {
88
+ headers: response.headers,
89
+ status: response.status,
90
+ });
91
+ return await createFromFetch(Promise.resolve(buffered));
92
+ } catch (error) {
93
+ if (isStaleClientReference(error)) {
94
+ triggerStaleReload();
95
+ return new Promise(() => {});
96
+ }
97
+ throw error;
98
+ }
99
+ },
100
+
101
+ // Render decoded RSC tree via NavigationRoot's state-based mechanism.
102
+ // Used for non-navigation renders (popstate cached replay, applyRevalidation).
103
+ // Wraps with NavigationProvider + TimberNuqsAdapter.
104
+ //
105
+ // For navigation renders (navigate, refresh, popstate-with-fetch),
106
+ // navigateTransition is used instead — it wraps the entire navigation
107
+ // in a React transition with useOptimistic for the pending URL.
108
+ //
109
+ // navState is passed explicitly by the router — no temporal coupling
110
+ // with getNavigationState().
111
+ renderRoot: (element: unknown, navState: NavigationState) => {
112
+ const withNav = createElement(
113
+ NavigationProvider,
114
+ { value: navState },
115
+ element as React.ReactNode
116
+ );
117
+ const wrapped = createElement(TimberNuqsAdapter, null, withNav);
118
+ transitionRender(wrapped);
119
+ },
120
+
121
+ // Run a navigation inside a React transition with optimistic pending URL.
122
+ // The entire fetch + state update runs inside startTransition. useOptimistic
123
+ // shows the pending URL immediately and reverts to null when the transition
124
+ // commits (atomic with the new tree + params).
125
+ //
126
+ // The perform callback receives a wrapPayload function that wraps the
127
+ // decoded RSC payload with NavigationProvider + NuqsAdapter. navState
128
+ // is passed explicitly by the router — no getNavigationState() needed.
129
+ navigateTransition: (pendingUrl: string, perform) => {
130
+ return navigateTransition(pendingUrl, async () => {
131
+ const payload = await perform((rawPayload: unknown, navState: NavigationState) => {
132
+ const withNav = createElement(
133
+ NavigationProvider,
134
+ { value: navState },
135
+ rawPayload as React.ReactNode
136
+ );
137
+ return createElement(TimberNuqsAdapter, null, withNav);
138
+ });
139
+ return payload as React.ReactNode;
140
+ });
141
+ },
142
+
143
+ // Schedule a callback after the next paint so scroll operations
144
+ // happen after React commits the new content to the DOM.
145
+ // Double-rAF ensures the browser has painted the new frame.
146
+ afterPaint: (callback: () => void) => {
147
+ requestAnimationFrame(() => {
148
+ requestAnimationFrame(callback);
149
+ });
150
+ },
151
+
152
+ // Apply resolved head elements (title, meta tags) to the DOM after
153
+ // SPA navigation. See design/16-metadata.md.
154
+ applyHead: applyHeadElements,
155
+ };
156
+
157
+ const router = createRouter(deps);
158
+ setGlobalRouter(router);
159
+
160
+ // Set up Navigation API integration after router is created.
161
+ // The navigate event listener delegates to router.navigate and
162
+ // router.handlePopState for external navigations and traversals.
163
+ let navApiController: NavigationApiController | null = null;
164
+ if (useNavApi) {
165
+ navApiController = setupNavigationApi({
166
+ onExternalNavigate: async (url, { replace, signal, scroll }) => {
167
+ // Navigation intercepted by the Navigation API. Covers both
168
+ // Link <a> clicks (user-initiated) and external navigations.
169
+ // The Navigation API handles the URL update via intercept(),
170
+ // so pass _skipHistory to avoid double pushState.
171
+ await router.navigate(url, {
172
+ replace,
173
+ scroll,
174
+ _signal: signal,
175
+ _skipHistory: true,
176
+ });
177
+ },
178
+ onTraverse: async (url, scrollY, signal) => {
179
+ // Back/forward — delegate to the router's popstate handler.
180
+ await router.handlePopState(url, scrollY, signal);
181
+ },
182
+ });
183
+
184
+ // Wire the router-navigating flag into RouterDeps.
185
+ // This must be done after setupNavigationApi returns the controller.
186
+ deps.setRouterNavigating = (v) => navApiController!.setRouterNavigating(v);
187
+ deps.saveNavigationEntryScroll = (y) => navApiController!.saveScrollPosition(y);
188
+ deps.completeRouterNavigation = () => navApiController!.completeRouterNavigation();
189
+ deps.navigationNavigate = (url, replace) => navApiController!.navigate(url, replace);
190
+ }
191
+
192
+ return { router, navApiController };
193
+ }
@@ -0,0 +1,157 @@
1
+ /**
2
+ * RSC Stream Bootstrap — decodes the server-inlined RSC payload.
3
+ *
4
+ * The RSC payload is embedded in the HTML as progressive inline script
5
+ * tags that call `self.__timber_f.push([type, data])` as RSC chunks arrive.
6
+ * Typed tuples: [0] = bootstrap signal, [1, string] = Flight data chunk.
7
+ *
8
+ * This module sets up a ReadableStream fed by those push() calls so
9
+ * `createFromReadableStream` can decode the Flight protocol progressively.
10
+ *
11
+ * See design/18-build-system.md §"Entry Files"
12
+ */
13
+
14
+ import { createFromReadableStream } from '../../rsc-runtime/browser.js';
15
+ import { isPageUnloading } from '../unload-guard.js';
16
+
17
+ type FlightSegment = [isBootstrap: 0] | [isData: 1, data: string];
18
+
19
+ export interface RscStreamResult {
20
+ /** The decoded RSC element (thenable/lazy — resolved by React during render) */
21
+ element: unknown;
22
+ }
23
+
24
+ /**
25
+ * Create the RSC payload stream from server-inlined `__timber_f` chunks.
26
+ *
27
+ * Returns null if no RSC payload was inlined (e.g., JS-only client).
28
+ * When a payload exists, returns the decoded element for hydration.
29
+ */
30
+ export function createRscPayloadStream(): RscStreamResult | null {
31
+ // __timber_f is initialized in <head> via flightInitScript() (see
32
+ // flight-scripts.ts). If it doesn't exist, skip Flight decoding
33
+ // entirely and fall through to the createRoot branch.
34
+ // Do NOT defensively create it here: that would cause
35
+ // createFromReadableStream to be called on an empty stream, producing
36
+ // a "Connection closed" error on hydration. See TIM-552.
37
+ const timberChunks = (self as unknown as Record<string, FlightSegment[] | undefined>).__timber_f;
38
+ if (!timberChunks) return null;
39
+
40
+ const encoder = new TextEncoder();
41
+
42
+ // Buffer to hold string data until the stream writer is ready.
43
+ // Scripts that execute before hydration starts push data here.
44
+ let dataBuffer: string[] | undefined = [];
45
+ let streamWriter: ReadableStreamDefaultController<Uint8Array> | null = null;
46
+ let streamFlushed = false;
47
+
48
+ /** Process a typed tuple from __timber_f. */
49
+ function handleSegment(seg: FlightSegment): void {
50
+ if (seg[0] === 0) {
51
+ // Bootstrap signal — initialize buffer (already done above)
52
+ if (!dataBuffer) dataBuffer = [];
53
+ } else if (seg[0] === 1) {
54
+ // Flight data chunk
55
+ if (streamWriter) {
56
+ streamWriter.enqueue(encoder.encode(seg[1]));
57
+ } else if (dataBuffer) {
58
+ dataBuffer.push(seg[1]);
59
+ }
60
+ }
61
+ }
62
+
63
+ // Process any chunks that arrived before this script executed.
64
+ for (const seg of timberChunks) {
65
+ handleSegment(seg);
66
+ }
67
+ // Clear the array to release memory.
68
+ timberChunks.length = 0;
69
+
70
+ // Patch push() so subsequent script tags feed data in real time.
71
+ (timberChunks as unknown as { push: (seg: FlightSegment) => void }).push = handleSegment;
72
+
73
+ const rscPayload = new ReadableStream<Uint8Array>({
74
+ start(controller) {
75
+ streamWriter = controller;
76
+ // Flush buffered data into the stream.
77
+ if (dataBuffer) {
78
+ for (const data of dataBuffer) {
79
+ controller.enqueue(encoder.encode(data));
80
+ }
81
+ dataBuffer = undefined;
82
+ }
83
+ // If DOM already loaded (non-streaming or fast page), close now.
84
+ if (streamFlushed) {
85
+ controller.close();
86
+ }
87
+ },
88
+ });
89
+
90
+ // Close the stream when the document finishes loading.
91
+ // DOMContentLoaded fires after the HTML parser has processed all
92
+ // inline scripts (including streamed Suspense replacements and
93
+ // RSC data), so all push() calls have completed by this point.
94
+ //
95
+ // If the page is unloading (user refreshed or navigated away),
96
+ // do NOT close the stream. When the connection drops mid-stream,
97
+ // DOMContentLoaded fires because the parser finishes. Closing an
98
+ // incomplete RSC stream causes React's Flight client to throw
99
+ // "Connection closed." — a jarring error on a page being replaced.
100
+ // Leaving the stream open is harmless: the page is being torn down.
101
+ function onDOMContentLoaded(): void {
102
+ if (isPageUnloading()) return;
103
+
104
+ // In dev mode, do NOT close the stream. React's RSC renderer
105
+ // includes debug owner/stack references ($1, $14, etc.) in the
106
+ // Flight payload that point to rows delivered through the debug
107
+ // channel, not the main Flight stream. The browser Flight client
108
+ // tracks these as pending chunks. Closing the stream with
109
+ // unresolved chunks triggers reportGlobalError("Connection closed")
110
+ // which kills the entire React tree.
111
+ //
112
+ // Leaving the stream open is harmless: React has already received
113
+ // all data rows and can hydrate fully. The pending debug chunks
114
+ // just remain unresolved (they're only used for React DevTools
115
+ // component stacks, not rendering).
116
+ //
117
+ // In production, debug rows are not emitted, so closing is safe.
118
+ if (process.env.NODE_ENV === 'development') {
119
+ // Mark as flushed so no more data is buffered, but don't close.
120
+ streamFlushed = true;
121
+ dataBuffer = undefined;
122
+ return;
123
+ }
124
+
125
+ if (streamWriter && !streamFlushed) {
126
+ streamWriter.close();
127
+ streamFlushed = true;
128
+ dataBuffer = undefined;
129
+ }
130
+ streamFlushed = true;
131
+ }
132
+
133
+ if (document.readyState === 'loading') {
134
+ document.addEventListener('DOMContentLoaded', onDOMContentLoaded, false);
135
+ } else {
136
+ // DOM already parsed. All inline RSC <script> tags have already
137
+ // executed and pushed their data into the buffer. The buffer was
138
+ // flushed into the stream during start() above.
139
+ //
140
+ // Close via queueMicrotask rather than setTimeout. setTimeout
141
+ // defers to the next macrotask, which can race with React's
142
+ // Flight client read loop — if React finishes reading all queued
143
+ // chunks and issues a reader.read() that pends, the stream is
144
+ // NOT closed yet (setTimeout hasn't fired), so React sees an
145
+ // open stream and waits. Then setTimeout fires and closes it.
146
+ // This works in theory but some React Flight builds interpret
147
+ // a mid-read close as "Connection closed" rather than clean EOF.
148
+ // queueMicrotask fires at the end of the current microtask
149
+ // checkpoint — after start() and createFromReadableStream
150
+ // initialization but before any macrotask, giving React a
151
+ // consistent close signal. See TIM-524.
152
+ queueMicrotask(onDOMContentLoaded);
153
+ }
154
+
155
+ const element = createFromReadableStream(rscPayload);
156
+ return { element };
157
+ }
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Scroll position helpers for the browser entry.
3
+ *
4
+ * Reads scroll position from the document viewport or explicitly marked
5
+ * `data-timber-scroll-restoration` containers.
6
+ *
7
+ * See design/19-client-navigation.md §"Overflow Scroll Containers".
8
+ */
9
+
10
+ /**
11
+ * Read the current scroll position.
12
+ *
13
+ * Checks window scroll first, then explicit `data-timber-scroll-restoration`
14
+ * containers. With segment tree merging, shared layouts are reconciled in
15
+ * place via `cloneElement` — React preserves their DOM and scroll state
16
+ * naturally. We don't need to auto-detect overflow containers; only
17
+ * explicitly marked containers are tracked.
18
+ */
19
+ export function getScrollY(): number {
20
+ if (window.scrollY || document.documentElement.scrollTop || document.body.scrollTop) {
21
+ return window.scrollY || document.documentElement.scrollTop || document.body.scrollTop;
22
+ }
23
+ for (const el of document.querySelectorAll('[data-timber-scroll-restoration]')) {
24
+ if ((el as HTMLElement).scrollTop > 0) return (el as HTMLElement).scrollTop;
25
+ }
26
+ return 0;
27
+ }
@@ -20,6 +20,7 @@
20
20
 
21
21
  import { Component, createElement, type ReactNode } from 'react';
22
22
  import { getSsrData } from './ssr-data.js';
23
+ import { getRouterOrNull } from './router-ref.js';
23
24
 
24
25
  // ─── Page Unload Detection ───────────────────────────────────────────────────
25
26
  // Track whether the page is being unloaded (user refreshed or navigated away).
@@ -65,17 +66,24 @@ type ParsedDigest = DenyDigest | RenderErrorDigest | RedirectDigest;
65
66
 
66
67
  export interface TimberErrorBoundaryProps {
67
68
  /** The component to render when an error is caught. */
68
- fallbackComponent: (...args: unknown[]) => ReactNode;
69
+ fallbackComponent?: (...args: unknown[]) => ReactNode;
70
+ /**
71
+ * Pre-rendered fallback element. Used for MDX status files which are server
72
+ * components and cannot be passed as function props across the RSC→client
73
+ * boundary. When set, rendered directly instead of calling fallbackComponent.
74
+ *
75
+ * See design/10-error-handling.md §"Status-Code File Variants" — MDX status
76
+ * files are server components by default (zero client JS).
77
+ */
78
+ fallbackElement?: ReactNode;
69
79
  /**
70
80
  * Status code filter. If set, only catches errors matching this status.
71
81
  * 400 = any 4xx, 500 = any 5xx, specific number = exact match.
72
82
  */
73
83
  status?: number;
74
84
  /**
75
- * When true, catching a DenySignal sets _denyHandledByBoundary on the
76
- * nav context to prevent page-level deny promotion. Only slot catch-all
77
- * boundaries should set this — segment boundaries (403.tsx, 4xx.tsx,
78
- * error.tsx) must NOT, otherwise normal page denies get swallowed.
85
+ * When true, this boundary wraps a parallel slot. Slot denials are
86
+ * graceful degradation — they must NOT change the HTTP status code.
79
87
  */
80
88
  isSlotBoundary?: boolean;
81
89
  children: ReactNode;
@@ -86,6 +94,13 @@ interface TimberErrorBoundaryState {
86
94
  error: Error | null;
87
95
  }
88
96
 
97
+ // Module-level guard: the first boundary to catch a given redirect digest
98
+ // schedules the navigation and marks it handled here. Subsequent renders
99
+ // (React retries the error-boundary render path multiple times in dev, and
100
+ // outer boundaries that also see the error) become no-ops, preventing
101
+ // duplicate router.navigate() calls.
102
+ const _handledRedirects = new WeakSet<object>();
103
+
89
104
  // ─── Component ───────────────────────────────────────────────────────────────
90
105
 
91
106
  export class TimberErrorBoundary extends Component<
@@ -131,11 +146,48 @@ export class TimberErrorBoundary extends Component<
131
146
  const error = this.state.error;
132
147
  const parsed = parseDigest(error);
133
148
 
134
- // RedirectSignal errors must propagate through all error boundaries
135
- // so the SSR shell fails and the pipeline catch block can produce a
136
- // proper HTTP redirect response. See design/04-authorization.md.
149
+ // RedirectSignal handling splits by environment:
150
+ //
151
+ // - SSR (no window): re-throw so the Fizz shell fails and the server
152
+ // pipeline catch block can produce a proper HTTP 3xx response. See
153
+ // design/04-authorization.md.
154
+ //
155
+ // - Client (window exists): a RedirectSignal that leaked into the RSC
156
+ // Flight payload during client navigation would otherwise bubble past
157
+ // every error boundary to `window.onerror`, which in dev triggers the
158
+ // Vite error overlay (false positive — navigation itself works).
159
+ // Instead, ask the router to perform an SPA navigation to the target
160
+ // and render nothing while it takes over. The router's own catch path
161
+ // handles cross-origin / hard navigations. See TIM-838.
137
162
  if (parsed?.type === 'redirect') {
138
- throw error;
163
+ if (typeof window === 'undefined') {
164
+ throw error;
165
+ }
166
+ // Dedupe: React may render the error-boundary fallback path more
167
+ // than once for a single caught error (dev-mode double render, and
168
+ // additional boundaries above us in the tree). Only schedule the
169
+ // navigation on the first render that sees this error instance.
170
+ const alreadyHandled = _handledRedirects.has(error);
171
+ if (!alreadyHandled) {
172
+ _handledRedirects.add(error);
173
+ const router = getRouterOrNull();
174
+ if (router) {
175
+ // Schedule the navigation outside the render phase to avoid
176
+ // setState-during-render warnings from router state updates.
177
+ queueMicrotask(() => {
178
+ router.navigate(parsed.location, { replace: true }).catch(() => {
179
+ // Fall back to a hard navigation if the soft navigation fails.
180
+ window.location.href = parsed.location;
181
+ });
182
+ });
183
+ } else {
184
+ // No router available (shouldn't happen post-bootstrap) — fall
185
+ // back to a hard navigation so the user still ends up at the
186
+ // target.
187
+ window.location.href = parsed.location;
188
+ }
189
+ }
190
+ return null;
139
191
  }
140
192
 
141
193
  // If this boundary has a status filter, check whether the error matches.
@@ -148,20 +200,45 @@ export class TimberErrorBoundary extends Component<
148
200
  }
149
201
  }
150
202
 
151
- // Report DenySignal handling to prevent page-level promotion — but only
152
- // for slot boundaries. Segment boundaries (403.tsx, 4xx.tsx, error.tsx)
153
- // must NOT set this flag, otherwise normal page/hold-window denies get
154
- // swallowed as 200 with boundary HTML instead of the intended 4xx.
155
- // Runs here in render() (not getDerivedStateFromError) so the status
156
- // filter has already been applied — non-matching boundaries re-threw above.
157
- // See LOCAL-298.
158
- if (parsed?.type === 'deny' && this.props.isSlotBoundary) {
159
- const ssrData = getSsrData();
160
- if (ssrData?._navContext) {
161
- ssrData._navContext._denyHandledByBoundary = true;
203
+ // Report DenySignal handling so the pipeline skips the redundant
204
+ // renderDenyPage() re-render — but ONLY when this boundary can fully
205
+ // handle the deny in-tree:
206
+ //
207
+ // ✅ TSX boundaries (fallbackComponent) — can receive runtime props
208
+ // (status, dangerouslyPassData) dynamically in render()
209
+ // ❌ MDX boundaries (fallbackElement) — pre-rendered at tree-build time,
210
+ // cannot receive runtime deny props. Must fall through to re-render.
211
+ //
212
+ // For qualifying segment boundaries: also set the HTTP status code from
213
+ // the DenySignal so the Response has the correct 4xx status. This runs
214
+ // synchronously during Fizz rendering, BEFORE onShellReady.
215
+ //
216
+ // For slot boundaries: set _denyHandledByBoundary but do NOT change
217
+ // statusCode — slot denials are graceful degradation.
218
+ //
219
+ // See TIM-664, LOCAL-298.
220
+ if (parsed?.type === 'deny') {
221
+ const canHandleInTree = this.props.fallbackElement == null;
222
+
223
+ if (canHandleInTree || this.props.isSlotBoundary) {
224
+ const ssrData = getSsrData();
225
+ if (ssrData?._navContext) {
226
+ ssrData._navContext._denyHandledByBoundary = true;
227
+ if (!this.props.isSlotBoundary) {
228
+ ssrData._navContext.statusCode = parsed.status;
229
+ }
230
+ }
162
231
  }
163
232
  }
164
233
 
234
+ // Pre-rendered fallback element (MDX status files) — render directly.
235
+ // MDX components are server components that cannot be passed as function
236
+ // props across the RSC→client boundary. Instead, they are pre-rendered
237
+ // as elements in the RSC environment and passed here as fallbackElement.
238
+ if (this.props.fallbackElement != null) {
239
+ return this.props.fallbackElement;
240
+ }
241
+
165
242
  // Render the fallback component with the right props shape.
166
243
  if (parsed?.type === 'deny') {
167
244
  return createElement(this.props.fallbackComponent as never, {
@@ -196,8 +273,8 @@ function parseDigest(error: Error): ParsedDigest | null {
196
273
  if (parsed && typeof parsed === 'object' && typeof parsed.type === 'string') {
197
274
  return parsed as ParsedDigest;
198
275
  }
199
- } catch {
200
- // Not JSON — legacy or unknown digest format
276
+ } catch (e) {
277
+ console.debug('[timber] error digest is not valid JSON:', e instanceof Error ? e.message : e);
201
278
  }
202
279
  return null;
203
280
  }