@timber-js/app 0.2.0-alpha.14 → 0.2.0-alpha.140

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 (800) hide show
  1. package/dist/_chunks/actions-DzFMnUAR.js +1147 -0
  2. package/dist/_chunks/actions-DzFMnUAR.js.map +1 -0
  3. package/dist/_chunks/build-output-helper-B20ZuTSA.js +102 -0
  4. package/dist/_chunks/build-output-helper-B20ZuTSA.js.map +1 -0
  5. package/dist/_chunks/cli-schema-sync-D2IpXicg.js +785 -0
  6. package/dist/_chunks/cli-schema-sync-D2IpXicg.js.map +1 -0
  7. package/dist/_chunks/cli-schema-sync-DH-M8Poy.js +2 -0
  8. package/dist/_chunks/codec-registry-oOUxugz3.js +21 -0
  9. package/dist/_chunks/codec-registry-oOUxugz3.js.map +1 -0
  10. package/dist/_chunks/define-C3RvHQPK.js +195 -0
  11. package/dist/_chunks/define-C3RvHQPK.js.map +1 -0
  12. package/dist/_chunks/define-DMVhsipD.js +112 -0
  13. package/dist/_chunks/define-DMVhsipD.js.map +1 -0
  14. package/dist/_chunks/fast-hash-D6hIVt1Y.js +36 -0
  15. package/dist/_chunks/fast-hash-D6hIVt1Y.js.map +1 -0
  16. package/dist/_chunks/format-CfwjgPz9.js +14 -0
  17. package/dist/_chunks/format-CfwjgPz9.js.map +1 -0
  18. package/dist/_chunks/handler-store-DjISKYEB.js +54 -0
  19. package/dist/_chunks/handler-store-DjISKYEB.js.map +1 -0
  20. package/dist/_chunks/href-validation-EZktELp8.js +124 -0
  21. package/dist/_chunks/href-validation-EZktELp8.js.map +1 -0
  22. package/dist/_chunks/logger-Dt-jQaBO.js +291 -0
  23. package/dist/_chunks/logger-Dt-jQaBO.js.map +1 -0
  24. package/dist/_chunks/{metadata-routes-Cjmvi3rQ.js → metadata-routes-BjepjefT.js} +32 -19
  25. package/dist/_chunks/metadata-routes-BjepjefT.js.map +1 -0
  26. package/dist/_chunks/navigation-root-DLc4s4ZC.js +103 -0
  27. package/dist/_chunks/navigation-root-DLc4s4ZC.js.map +1 -0
  28. package/dist/_chunks/registry-DbJPKoBp.js +20 -0
  29. package/dist/_chunks/registry-DbJPKoBp.js.map +1 -0
  30. package/dist/_chunks/resolve-schema-Dj8tQloi.js +77 -0
  31. package/dist/_chunks/resolve-schema-Dj8tQloi.js.map +1 -0
  32. package/dist/_chunks/router-ref-CtmF-aPv.js +28 -0
  33. package/dist/_chunks/router-ref-CtmF-aPv.js.map +1 -0
  34. package/dist/_chunks/schema-bridge-DK_89h8O.js +86 -0
  35. package/dist/_chunks/schema-bridge-DK_89h8O.js.map +1 -0
  36. package/dist/_chunks/segment-classify-CDDRVKs7.js +137 -0
  37. package/dist/_chunks/segment-classify-CDDRVKs7.js.map +1 -0
  38. package/dist/_chunks/segment-context-ZDnXDkbz.js +34 -0
  39. package/dist/_chunks/segment-context-ZDnXDkbz.js.map +1 -0
  40. package/dist/_chunks/{ssr-data-MjmprTmO.js → ssr-data-BOWsq18U.js} +1 -1
  41. package/dist/_chunks/ssr-data-BOWsq18U.js.map +1 -0
  42. package/dist/_chunks/tracing-M_zKubhk.js +358 -0
  43. package/dist/_chunks/tracing-M_zKubhk.js.map +1 -0
  44. package/dist/_chunks/{use-query-states-D5KaffOK.js → use-query-states-CbeQmext.js} +7 -20
  45. package/dist/_chunks/use-query-states-CbeQmext.js.map +1 -0
  46. package/dist/_chunks/use-segment-params-D1CzlgBo.js +151 -0
  47. package/dist/_chunks/use-segment-params-D1CzlgBo.js.map +1 -0
  48. package/dist/_chunks/validation-taUkvA4Q.js +113 -0
  49. package/dist/_chunks/validation-taUkvA4Q.js.map +1 -0
  50. package/dist/_chunks/walkers-7FBPM-hX.js +724 -0
  51. package/dist/_chunks/walkers-7FBPM-hX.js.map +1 -0
  52. package/dist/_chunks/{format-RyoGQL74.js → warnings-CNPXaypM.js} +6 -45
  53. package/dist/_chunks/warnings-CNPXaypM.js.map +1 -0
  54. package/dist/adapters/build-output-helper.d.ts +28 -0
  55. package/dist/adapters/build-output-helper.d.ts.map +1 -0
  56. package/dist/adapters/cloudflare-dev.d.ts +109 -0
  57. package/dist/adapters/cloudflare-dev.d.ts.map +1 -0
  58. package/dist/adapters/cloudflare-dev.js +73 -0
  59. package/dist/adapters/cloudflare-dev.js.map +1 -0
  60. package/dist/adapters/cloudflare-kv-cache.d.ts +64 -0
  61. package/dist/adapters/cloudflare-kv-cache.d.ts.map +1 -0
  62. package/dist/adapters/cloudflare-kv-cache.js +95 -0
  63. package/dist/adapters/cloudflare-kv-cache.js.map +1 -0
  64. package/dist/adapters/cloudflare.d.ts +148 -12
  65. package/dist/adapters/cloudflare.d.ts.map +1 -1
  66. package/dist/adapters/cloudflare.js +142 -38
  67. package/dist/adapters/cloudflare.js.map +1 -1
  68. package/dist/adapters/compress-module.d.ts.map +1 -1
  69. package/dist/adapters/nitro.d.ts +17 -1
  70. package/dist/adapters/nitro.d.ts.map +1 -1
  71. package/dist/adapters/nitro.js +143 -45
  72. package/dist/adapters/nitro.js.map +1 -1
  73. package/dist/adapters/shared.d.ts +16 -0
  74. package/dist/adapters/shared.d.ts.map +1 -0
  75. package/dist/cache/cache-api.d.ts +24 -0
  76. package/dist/cache/cache-api.d.ts.map +1 -0
  77. package/dist/cache/handler-store.d.ts +31 -0
  78. package/dist/cache/handler-store.d.ts.map +1 -0
  79. package/dist/cache/index.d.ts +23 -7
  80. package/dist/cache/index.d.ts.map +1 -1
  81. package/dist/cache/index.js +165 -117
  82. package/dist/cache/index.js.map +1 -1
  83. package/dist/cache/singleflight.d.ts +18 -1
  84. package/dist/cache/singleflight.d.ts.map +1 -1
  85. package/dist/cache/sizeof.d.ts +22 -0
  86. package/dist/cache/sizeof.d.ts.map +1 -0
  87. package/dist/cache/timber-cache.d.ts +1 -1
  88. package/dist/cache/timber-cache.d.ts.map +1 -1
  89. package/dist/cli-schema-sync.d.ts +39 -0
  90. package/dist/cli-schema-sync.d.ts.map +1 -0
  91. package/dist/cli.d.ts +14 -2
  92. package/dist/cli.d.ts.map +1 -1
  93. package/dist/cli.js +48 -6
  94. package/dist/cli.js.map +1 -1
  95. package/dist/client/browser-dev.d.ts +34 -1
  96. package/dist/client/browser-dev.d.ts.map +1 -1
  97. package/dist/client/browser-entry/action-dispatch.d.ts +17 -0
  98. package/dist/client/browser-entry/action-dispatch.d.ts.map +1 -0
  99. package/dist/client/browser-entry/hmr.d.ts +21 -0
  100. package/dist/client/browser-entry/hmr.d.ts.map +1 -0
  101. package/dist/client/browser-entry/hydrate.d.ts +46 -0
  102. package/dist/client/browser-entry/hydrate.d.ts.map +1 -0
  103. package/dist/client/browser-entry/index.d.ts +30 -0
  104. package/dist/client/browser-entry/index.d.ts.map +1 -0
  105. package/dist/client/browser-entry/post-hydration.d.ts +26 -0
  106. package/dist/client/browser-entry/post-hydration.d.ts.map +1 -0
  107. package/dist/client/browser-entry/router-init.d.ts +26 -0
  108. package/dist/client/browser-entry/router-init.d.ts.map +1 -0
  109. package/dist/client/browser-entry/rsc-stream.d.ts +24 -0
  110. package/dist/client/browser-entry/rsc-stream.d.ts.map +1 -0
  111. package/dist/client/browser-entry/scroll.d.ts +19 -0
  112. package/dist/client/browser-entry/scroll.d.ts.map +1 -0
  113. package/dist/client/error-boundary.d.ts +12 -5
  114. package/dist/client/error-boundary.d.ts.map +1 -1
  115. package/dist/client/error-boundary.js +29 -6
  116. package/dist/client/error-boundary.js.map +1 -1
  117. package/dist/client/error-reconstituter.d.ts +54 -0
  118. package/dist/client/error-reconstituter.d.ts.map +1 -0
  119. package/dist/client/form.d.ts +16 -27
  120. package/dist/client/form.d.ts.map +1 -1
  121. package/dist/client/history.d.ts +19 -4
  122. package/dist/client/history.d.ts.map +1 -1
  123. package/dist/client/index.d.ts +10 -24
  124. package/dist/client/index.d.ts.map +1 -1
  125. package/dist/client/index.js +183 -1134
  126. package/dist/client/index.js.map +1 -1
  127. package/dist/client/internal.d.ts +19 -0
  128. package/dist/client/internal.d.ts.map +1 -0
  129. package/dist/client/internal.js +925 -0
  130. package/dist/client/internal.js.map +1 -0
  131. package/dist/client/link-pending-store.d.ts +65 -0
  132. package/dist/client/link-pending-store.d.ts.map +1 -0
  133. package/dist/client/link.d.ts +69 -60
  134. package/dist/client/link.d.ts.map +1 -1
  135. package/dist/client/nav-link-store.d.ts +27 -0
  136. package/dist/client/nav-link-store.d.ts.map +1 -0
  137. package/dist/client/navigation-api-types.d.ts +90 -0
  138. package/dist/client/navigation-api-types.d.ts.map +1 -0
  139. package/dist/client/navigation-api.d.ts +115 -0
  140. package/dist/client/navigation-api.d.ts.map +1 -0
  141. package/dist/client/navigation-context.d.ts +14 -2
  142. package/dist/client/navigation-context.d.ts.map +1 -1
  143. package/dist/client/{transition-root.d.ts → navigation-root.d.ts} +46 -9
  144. package/dist/client/navigation-root.d.ts.map +1 -0
  145. package/dist/client/nuqs-adapter.d.ts.map +1 -1
  146. package/dist/client/router-ref.d.ts +1 -1
  147. package/dist/client/router.d.ts +79 -10
  148. package/dist/client/router.d.ts.map +1 -1
  149. package/dist/client/rsc-fetch.d.ts +46 -3
  150. package/dist/client/rsc-fetch.d.ts.map +1 -1
  151. package/dist/client/segment-cache.d.ts +3 -1
  152. package/dist/client/segment-cache.d.ts.map +1 -1
  153. package/dist/client/segment-outlet.d.ts +49 -0
  154. package/dist/client/segment-outlet.d.ts.map +1 -0
  155. package/dist/client/segment-update-context.d.ts +21 -0
  156. package/dist/client/segment-update-context.d.ts.map +1 -0
  157. package/dist/client/shallow-url.d.ts +10 -0
  158. package/dist/client/shallow-url.d.ts.map +1 -0
  159. package/dist/client/ssr-data.d.ts +13 -4
  160. package/dist/client/ssr-data.d.ts.map +1 -1
  161. package/dist/client/stale-reload.d.ts +15 -0
  162. package/dist/client/stale-reload.d.ts.map +1 -1
  163. package/dist/client/state.d.ts +1 -1
  164. package/dist/client/top-loader.d.ts +5 -5
  165. package/dist/client/top-loader.d.ts.map +1 -1
  166. package/dist/client/use-cookie.d.ts +12 -0
  167. package/dist/client/use-cookie.d.ts.map +1 -1
  168. package/dist/client/use-link-status.d.ts +5 -5
  169. package/dist/client/use-link-status.d.ts.map +1 -1
  170. package/dist/client/use-pathname.d.ts.map +1 -1
  171. package/dist/client/use-pending-navigation.d.ts +23 -0
  172. package/dist/client/use-pending-navigation.d.ts.map +1 -0
  173. package/dist/client/use-query-states.d.ts +1 -1
  174. package/dist/client/use-query-states.d.ts.map +1 -1
  175. package/dist/client/use-router.d.ts +1 -1
  176. package/dist/client/use-router.d.ts.map +1 -1
  177. package/dist/client/use-search-params.d.ts +7 -5
  178. package/dist/client/use-search-params.d.ts.map +1 -1
  179. package/dist/client/{use-params.d.ts → use-segment-params.d.ts} +8 -6
  180. package/dist/client/use-segment-params.d.ts.map +1 -0
  181. package/dist/codec.d.ts +69 -0
  182. package/dist/codec.d.ts.map +1 -0
  183. package/dist/codec.js +75 -0
  184. package/dist/codec.js.map +1 -0
  185. package/dist/config-types.d.ts +294 -0
  186. package/dist/config-types.d.ts.map +1 -0
  187. package/dist/config-validation.d.ts +51 -0
  188. package/dist/config-validation.d.ts.map +1 -0
  189. package/dist/content/index.d.ts +1 -10
  190. package/dist/content/index.d.ts.map +1 -1
  191. package/dist/content/index.js +0 -2
  192. package/dist/cookies/define-cookie.d.ts +58 -25
  193. package/dist/cookies/define-cookie.d.ts.map +1 -1
  194. package/dist/cookies/index.d.ts +2 -1
  195. package/dist/cookies/index.d.ts.map +1 -1
  196. package/dist/cookies/index.js +251 -36
  197. package/dist/cookies/index.js.map +1 -1
  198. package/dist/cookies/json-cookie.d.ts +64 -0
  199. package/dist/cookies/json-cookie.d.ts.map +1 -0
  200. package/dist/cookies/validation.d.ts +34 -0
  201. package/dist/cookies/validation.d.ts.map +1 -0
  202. package/dist/dev-tools/404-page.d.ts +46 -0
  203. package/dist/dev-tools/404-page.d.ts.map +1 -0
  204. package/dist/dev-tools/browser-logs.d.ts +84 -0
  205. package/dist/dev-tools/browser-logs.d.ts.map +1 -0
  206. package/dist/dev-tools/error-page.d.ts +58 -0
  207. package/dist/dev-tools/error-page.d.ts.map +1 -0
  208. package/dist/dev-tools/holding-server.d.ts +54 -0
  209. package/dist/dev-tools/holding-server.d.ts.map +1 -0
  210. package/dist/dev-tools/index.d.ts +31 -0
  211. package/dist/dev-tools/index.d.ts.map +1 -0
  212. package/dist/{server/dev-span-processor.d.ts → dev-tools/instrumentation.d.ts} +26 -6
  213. package/dist/dev-tools/instrumentation.d.ts.map +1 -0
  214. package/dist/{server/dev-logger.d.ts → dev-tools/logger.d.ts} +1 -1
  215. package/dist/dev-tools/logger.d.ts.map +1 -0
  216. package/dist/{plugins/dev-logs.d.ts → dev-tools/logs.d.ts} +2 -2
  217. package/dist/dev-tools/logs.d.ts.map +1 -0
  218. package/dist/dev-tools/overlay.d.ts +91 -0
  219. package/dist/dev-tools/overlay.d.ts.map +1 -0
  220. package/dist/dev-tools/stack-classifier.d.ts +34 -0
  221. package/dist/dev-tools/stack-classifier.d.ts.map +1 -0
  222. package/dist/dev-tools/terminal.d.ts +28 -0
  223. package/dist/dev-tools/terminal.d.ts.map +1 -0
  224. package/dist/{server/dev-warnings.d.ts → dev-tools/warnings.d.ts} +2 -22
  225. package/dist/dev-tools/warnings.d.ts.map +1 -0
  226. package/dist/fonts/ast.d.ts +98 -6
  227. package/dist/fonts/ast.d.ts.map +1 -1
  228. package/dist/fonts/bundle.d.ts +48 -0
  229. package/dist/fonts/bundle.d.ts.map +1 -0
  230. package/dist/fonts/dev-middleware.d.ts +22 -0
  231. package/dist/fonts/dev-middleware.d.ts.map +1 -0
  232. package/dist/fonts/local.d.ts +1 -1
  233. package/dist/fonts/pipeline.d.ts +172 -0
  234. package/dist/fonts/pipeline.d.ts.map +1 -0
  235. package/dist/fonts/transform.d.ts +78 -0
  236. package/dist/fonts/transform.d.ts.map +1 -0
  237. package/dist/fonts/types.d.ts +47 -1
  238. package/dist/fonts/types.d.ts.map +1 -1
  239. package/dist/fonts/virtual-modules.d.ts +94 -0
  240. package/dist/fonts/virtual-modules.d.ts.map +1 -0
  241. package/dist/index.d.ts +46 -180
  242. package/dist/index.d.ts.map +1 -1
  243. package/dist/index.js +5315 -12687
  244. package/dist/index.js.map +1 -1
  245. package/dist/params/codec-registry.d.ts +26 -0
  246. package/dist/params/codec-registry.d.ts.map +1 -0
  247. package/dist/params/define-schema.d.ts +81 -0
  248. package/dist/params/define-schema.d.ts.map +1 -0
  249. package/dist/params/index.d.ts +5 -0
  250. package/dist/params/index.d.ts.map +1 -0
  251. package/dist/params/index.js +34 -0
  252. package/dist/params/index.js.map +1 -0
  253. package/dist/params/resolve-schema.d.ts +34 -0
  254. package/dist/params/resolve-schema.d.ts.map +1 -0
  255. package/dist/plugin-context.d.ts +114 -0
  256. package/dist/plugin-context.d.ts.map +1 -0
  257. package/dist/plugins/adapter-build.d.ts +20 -1
  258. package/dist/plugins/adapter-build.d.ts.map +1 -1
  259. package/dist/plugins/build-manifest.d.ts +7 -3
  260. package/dist/plugins/build-manifest.d.ts.map +1 -1
  261. package/dist/plugins/build-report.d.ts +9 -7
  262. package/dist/plugins/build-report.d.ts.map +1 -1
  263. package/dist/plugins/cache.d.ts +31 -0
  264. package/dist/plugins/cache.d.ts.map +1 -0
  265. package/dist/plugins/client-chunks.d.ts +39 -0
  266. package/dist/plugins/client-chunks.d.ts.map +1 -0
  267. package/dist/plugins/cloudflare-wasm.d.ts +18 -0
  268. package/dist/plugins/cloudflare-wasm.d.ts.map +1 -0
  269. package/dist/plugins/content.d.ts +1 -1
  270. package/dist/plugins/content.d.ts.map +1 -1
  271. package/dist/plugins/dev-server.d.ts +1 -1
  272. package/dist/plugins/dev-server.d.ts.map +1 -1
  273. package/dist/plugins/entries.d.ts +1 -1
  274. package/dist/plugins/entries.d.ts.map +1 -1
  275. package/dist/plugins/fonts.d.ts +17 -73
  276. package/dist/plugins/fonts.d.ts.map +1 -1
  277. package/dist/plugins/mdx.d.ts +1 -1
  278. package/dist/plugins/mdx.d.ts.map +1 -1
  279. package/dist/plugins/routing.d.ts +1 -1
  280. package/dist/plugins/routing.d.ts.map +1 -1
  281. package/dist/plugins/server-bundle.d.ts.map +1 -1
  282. package/dist/plugins/shims.d.ts +6 -5
  283. package/dist/plugins/shims.d.ts.map +1 -1
  284. package/dist/plugins/static-build.d.ts +5 -26
  285. package/dist/plugins/static-build.d.ts.map +1 -1
  286. package/dist/routing/codegen-shared.d.ts +67 -0
  287. package/dist/routing/codegen-shared.d.ts.map +1 -0
  288. package/dist/routing/codegen-types.d.ts +60 -0
  289. package/dist/routing/codegen-types.d.ts.map +1 -0
  290. package/dist/routing/codegen.d.ts +7 -2
  291. package/dist/routing/codegen.d.ts.map +1 -1
  292. package/dist/routing/convention-lint.d.ts +41 -0
  293. package/dist/routing/convention-lint.d.ts.map +1 -0
  294. package/dist/routing/index.d.ts +7 -1
  295. package/dist/routing/index.d.ts.map +1 -1
  296. package/dist/routing/index.js +4 -2
  297. package/dist/routing/link-codegen.d.ts +90 -0
  298. package/dist/routing/link-codegen.d.ts.map +1 -0
  299. package/dist/routing/scanner.d.ts +1 -10
  300. package/dist/routing/scanner.d.ts.map +1 -1
  301. package/dist/routing/schema-validation.d.ts +35 -0
  302. package/dist/routing/schema-validation.d.ts.map +1 -0
  303. package/dist/routing/segment-classify.d.ts +75 -0
  304. package/dist/routing/segment-classify.d.ts.map +1 -0
  305. package/dist/routing/segment-codegen.d.ts +38 -0
  306. package/dist/routing/segment-codegen.d.ts.map +1 -0
  307. package/dist/routing/types.d.ts +77 -25
  308. package/dist/routing/types.d.ts.map +1 -1
  309. package/dist/routing/walkers.d.ts +51 -0
  310. package/dist/routing/walkers.d.ts.map +1 -0
  311. package/dist/rsc-runtime/rsc.d.ts +1 -1
  312. package/dist/rsc-runtime/rsc.d.ts.map +1 -1
  313. package/dist/rsc-runtime/ssr.d.ts +12 -0
  314. package/dist/rsc-runtime/ssr.d.ts.map +1 -1
  315. package/dist/schema-bridge.d.ts +76 -0
  316. package/dist/schema-bridge.d.ts.map +1 -0
  317. package/dist/search-params/define.d.ts +157 -0
  318. package/dist/search-params/define.d.ts.map +1 -0
  319. package/dist/search-params/index.d.ts +4 -7
  320. package/dist/search-params/index.d.ts.map +1 -1
  321. package/dist/search-params/index.js +34 -441
  322. package/dist/search-params/index.js.map +1 -1
  323. package/dist/search-params/registry.d.ts +2 -2
  324. package/dist/search-params/registry.d.ts.map +1 -1
  325. package/dist/search-params/wrappers.d.ts +53 -0
  326. package/dist/search-params/wrappers.d.ts.map +1 -0
  327. package/dist/segment-params/define.d.ts +89 -0
  328. package/dist/segment-params/define.d.ts.map +1 -0
  329. package/dist/segment-params/index.d.ts +3 -0
  330. package/dist/segment-params/index.d.ts.map +1 -0
  331. package/dist/segment-params/index.js +2 -0
  332. package/dist/server/access-gate.d.ts +8 -3
  333. package/dist/server/access-gate.d.ts.map +1 -1
  334. package/dist/server/action-client.d.ts +41 -6
  335. package/dist/server/action-client.d.ts.map +1 -1
  336. package/dist/server/action-encryption.d.ts +76 -0
  337. package/dist/server/action-encryption.d.ts.map +1 -0
  338. package/dist/server/action-handler.d.ts +35 -1
  339. package/dist/server/action-handler.d.ts.map +1 -1
  340. package/dist/server/actions.d.ts +6 -14
  341. package/dist/server/actions.d.ts.map +1 -1
  342. package/dist/server/als-registry.d.ts +70 -11
  343. package/dist/server/als-registry.d.ts.map +1 -1
  344. package/dist/server/asset-headers.d.ts +1 -15
  345. package/dist/server/asset-headers.d.ts.map +1 -1
  346. package/dist/server/body-limits.d.ts.map +1 -1
  347. package/dist/server/build-manifest.d.ts +8 -2
  348. package/dist/server/build-manifest.d.ts.map +1 -1
  349. package/dist/server/coalesce-tick.d.ts +40 -0
  350. package/dist/server/coalesce-tick.d.ts.map +1 -0
  351. package/dist/server/cookie-context.d.ts +170 -0
  352. package/dist/server/cookie-context.d.ts.map +1 -0
  353. package/dist/server/cookie-parsing.d.ts +51 -0
  354. package/dist/server/cookie-parsing.d.ts.map +1 -0
  355. package/dist/server/csrf.d.ts +3 -2
  356. package/dist/server/csrf.d.ts.map +1 -1
  357. package/dist/server/default-logger.d.ts +22 -0
  358. package/dist/server/default-logger.d.ts.map +1 -0
  359. package/dist/server/deny-boundary.d.ts +90 -0
  360. package/dist/server/deny-boundary.d.ts.map +1 -0
  361. package/dist/server/deny-renderer.d.ts +1 -1
  362. package/dist/server/deny-renderer.d.ts.map +1 -1
  363. package/dist/server/dev-source-map.d.ts +22 -0
  364. package/dist/server/dev-source-map.d.ts.map +1 -0
  365. package/dist/server/early-hints-sender.d.ts.map +1 -1
  366. package/dist/server/early-hints.d.ts +13 -11
  367. package/dist/server/early-hints.d.ts.map +1 -1
  368. package/dist/server/error-boundary-wrapper.d.ts +7 -1
  369. package/dist/server/error-boundary-wrapper.d.ts.map +1 -1
  370. package/dist/server/fallback-error.d.ts +12 -7
  371. package/dist/server/fallback-error.d.ts.map +1 -1
  372. package/dist/server/flight-injection-state.d.ts +66 -0
  373. package/dist/server/flight-injection-state.d.ts.map +1 -0
  374. package/dist/server/flight-scripts.d.ts +42 -0
  375. package/dist/server/flight-scripts.d.ts.map +1 -0
  376. package/dist/server/flush.d.ts.map +1 -1
  377. package/dist/server/form-data.d.ts +29 -0
  378. package/dist/server/form-data.d.ts.map +1 -1
  379. package/dist/server/html-injector-core.d.ts +213 -0
  380. package/dist/server/html-injector-core.d.ts.map +1 -0
  381. package/dist/server/html-injectors.d.ts +81 -41
  382. package/dist/server/html-injectors.d.ts.map +1 -1
  383. package/dist/server/index.d.ts +10 -46
  384. package/dist/server/index.d.ts.map +1 -1
  385. package/dist/server/index.js +170 -2911
  386. package/dist/server/index.js.map +1 -1
  387. package/dist/server/internal.d.ts +48 -0
  388. package/dist/server/internal.d.ts.map +1 -0
  389. package/dist/server/internal.js +3126 -0
  390. package/dist/server/internal.js.map +1 -0
  391. package/dist/server/logger.d.ts +39 -7
  392. package/dist/server/logger.d.ts.map +1 -1
  393. package/dist/server/metadata-routes.d.ts +23 -7
  394. package/dist/server/metadata-routes.d.ts.map +1 -1
  395. package/dist/server/middleware-runner.d.ts +36 -4
  396. package/dist/server/middleware-runner.d.ts.map +1 -1
  397. package/dist/server/node-stream-transforms.d.ts +112 -0
  398. package/dist/server/node-stream-transforms.d.ts.map +1 -0
  399. package/dist/server/param-coercion.d.ts +54 -0
  400. package/dist/server/param-coercion.d.ts.map +1 -0
  401. package/dist/server/pipeline-helpers.d.ts +95 -0
  402. package/dist/server/pipeline-helpers.d.ts.map +1 -0
  403. package/dist/server/pipeline-interception.d.ts +1 -1
  404. package/dist/server/pipeline-interception.d.ts.map +1 -1
  405. package/dist/server/pipeline-metadata.d.ts +6 -0
  406. package/dist/server/pipeline-metadata.d.ts.map +1 -1
  407. package/dist/server/pipeline-outcome.d.ts +49 -0
  408. package/dist/server/pipeline-outcome.d.ts.map +1 -0
  409. package/dist/server/pipeline-phases.d.ts +56 -0
  410. package/dist/server/pipeline-phases.d.ts.map +1 -0
  411. package/dist/server/pipeline.d.ts +111 -19
  412. package/dist/server/pipeline.d.ts.map +1 -1
  413. package/dist/server/port-resolution.d.ts +117 -0
  414. package/dist/server/port-resolution.d.ts.map +1 -0
  415. package/dist/server/primitives.d.ts +74 -20
  416. package/dist/server/primitives.d.ts.map +1 -1
  417. package/dist/server/render-timeout.d.ts +51 -0
  418. package/dist/server/render-timeout.d.ts.map +1 -0
  419. package/dist/server/request-context.d.ts +62 -107
  420. package/dist/server/request-context.d.ts.map +1 -1
  421. package/dist/server/route-element-builder.d.ts +28 -2
  422. package/dist/server/route-element-builder.d.ts.map +1 -1
  423. package/dist/server/route-handler.d.ts.map +1 -1
  424. package/dist/server/route-matcher.d.ts +25 -36
  425. package/dist/server/route-matcher.d.ts.map +1 -1
  426. package/dist/server/rsc-entry/action-middleware-runner.d.ts +66 -0
  427. package/dist/server/rsc-entry/action-middleware-runner.d.ts.map +1 -0
  428. package/dist/server/rsc-entry/api-handler.d.ts +12 -3
  429. package/dist/server/rsc-entry/api-handler.d.ts.map +1 -1
  430. package/dist/server/rsc-entry/error-renderer.d.ts +26 -13
  431. package/dist/server/rsc-entry/error-renderer.d.ts.map +1 -1
  432. package/dist/server/rsc-entry/helpers.d.ts +50 -6
  433. package/dist/server/rsc-entry/helpers.d.ts.map +1 -1
  434. package/dist/server/rsc-entry/index.d.ts +19 -8
  435. package/dist/server/rsc-entry/index.d.ts.map +1 -1
  436. package/dist/server/rsc-entry/render-route.d.ts +50 -0
  437. package/dist/server/rsc-entry/render-route.d.ts.map +1 -0
  438. package/dist/server/rsc-entry/revalidate-renderer.d.ts +108 -0
  439. package/dist/server/rsc-entry/revalidate-renderer.d.ts.map +1 -0
  440. package/dist/server/rsc-entry/rsc-payload.d.ts +3 -3
  441. package/dist/server/rsc-entry/rsc-payload.d.ts.map +1 -1
  442. package/dist/server/rsc-entry/rsc-stream.d.ts +17 -1
  443. package/dist/server/rsc-entry/rsc-stream.d.ts.map +1 -1
  444. package/dist/server/rsc-entry/ssr-bridge.d.ts +5 -1
  445. package/dist/server/rsc-entry/ssr-bridge.d.ts.map +1 -1
  446. package/dist/server/rsc-entry/ssr-renderer.d.ts +34 -4
  447. package/dist/server/rsc-entry/ssr-renderer.d.ts.map +1 -1
  448. package/dist/server/rsc-entry/wrap-action-dispatch.d.ts +119 -0
  449. package/dist/server/rsc-entry/wrap-action-dispatch.d.ts.map +1 -0
  450. package/dist/server/safe-load.d.ts +46 -0
  451. package/dist/server/safe-load.d.ts.map +1 -0
  452. package/dist/server/sensitive-fields.d.ts +74 -0
  453. package/dist/server/sensitive-fields.d.ts.map +1 -0
  454. package/dist/server/sitemap-generator.d.ts +129 -0
  455. package/dist/server/sitemap-generator.d.ts.map +1 -0
  456. package/dist/server/sitemap-handler.d.ts +22 -0
  457. package/dist/server/sitemap-handler.d.ts.map +1 -0
  458. package/dist/server/slot-resolver.d.ts +1 -1
  459. package/dist/server/slot-resolver.d.ts.map +1 -1
  460. package/dist/server/ssr-bridge-types.d.ts +121 -0
  461. package/dist/server/ssr-bridge-types.d.ts.map +1 -0
  462. package/dist/server/ssr-entry.d.ts +2 -43
  463. package/dist/server/ssr-entry.d.ts.map +1 -1
  464. package/dist/server/ssr-render.d.ts +64 -21
  465. package/dist/server/ssr-render.d.ts.map +1 -1
  466. package/dist/server/ssr-wrappers.d.ts +50 -0
  467. package/dist/server/ssr-wrappers.d.ts.map +1 -0
  468. package/dist/server/state-tree-diff.d.ts +12 -5
  469. package/dist/server/state-tree-diff.d.ts.map +1 -1
  470. package/dist/server/status-code-resolver.d.ts +16 -11
  471. package/dist/server/status-code-resolver.d.ts.map +1 -1
  472. package/dist/server/stream-utils.d.ts +36 -0
  473. package/dist/server/stream-utils.d.ts.map +1 -0
  474. package/dist/server/tracing.d.ts +5 -5
  475. package/dist/server/tracing.d.ts.map +1 -1
  476. package/dist/server/tree-builder.d.ts +62 -30
  477. package/dist/server/tree-builder.d.ts.map +1 -1
  478. package/dist/server/tree-match.d.ts +49 -0
  479. package/dist/server/tree-match.d.ts.map +1 -0
  480. package/dist/server/types.d.ts +71 -6
  481. package/dist/server/types.d.ts.map +1 -1
  482. package/dist/server/utils/escape-html.d.ts +14 -0
  483. package/dist/server/utils/escape-html.d.ts.map +1 -0
  484. package/dist/server/version-skew.d.ts +61 -0
  485. package/dist/server/version-skew.d.ts.map +1 -0
  486. package/dist/shared/href-validation.d.ts +38 -0
  487. package/dist/shared/href-validation.d.ts.map +1 -0
  488. package/dist/shared/merge-search-params.d.ts +22 -0
  489. package/dist/shared/merge-search-params.d.ts.map +1 -0
  490. package/dist/shims/font-google.d.ts +1 -1
  491. package/dist/shims/font-google.d.ts.map +1 -1
  492. package/dist/shims/font-google.js +42 -0
  493. package/dist/shims/font-google.js.map +1 -0
  494. package/dist/shims/font-local.d.ts +26 -0
  495. package/dist/shims/font-local.d.ts.map +1 -0
  496. package/dist/shims/font-local.js +20 -0
  497. package/dist/shims/font-local.js.map +1 -0
  498. package/dist/shims/headers.d.ts +2 -1
  499. package/dist/shims/headers.d.ts.map +1 -1
  500. package/dist/shims/image.d.ts +1 -1
  501. package/dist/shims/navigation-client.d.ts +3 -1
  502. package/dist/shims/navigation-client.d.ts.map +1 -1
  503. package/dist/shims/navigation.d.ts +11 -5
  504. package/dist/shims/navigation.d.ts.map +1 -1
  505. package/dist/utils/state-machine.d.ts +80 -0
  506. package/dist/utils/state-machine.d.ts.map +1 -0
  507. package/package.json +57 -17
  508. package/src/adapters/build-output-helper.ts +139 -0
  509. package/src/adapters/cloudflare-dev.ts +177 -0
  510. package/src/adapters/cloudflare-kv-cache.ts +142 -0
  511. package/src/adapters/cloudflare.ts +350 -76
  512. package/src/adapters/compress-module.ts +24 -4
  513. package/src/adapters/nitro.ts +142 -59
  514. package/src/adapters/shared.ts +40 -0
  515. package/src/adapters/wrangler.d.ts +7 -0
  516. package/src/cache/cache-api.ts +39 -0
  517. package/src/cache/handler-store.ts +68 -0
  518. package/src/cache/index.ts +81 -18
  519. package/src/cache/singleflight.ts +62 -4
  520. package/src/cache/sizeof.ts +33 -0
  521. package/src/cache/timber-cache.ts +52 -24
  522. package/src/cli-schema-sync.ts +295 -0
  523. package/src/cli.ts +76 -8
  524. package/src/client/browser-dev.ts +153 -1
  525. package/src/client/browser-entry/action-dispatch.ts +125 -0
  526. package/src/client/browser-entry/hmr.ts +81 -0
  527. package/src/client/browser-entry/hydrate.ts +153 -0
  528. package/src/client/browser-entry/index.ts +151 -0
  529. package/src/client/browser-entry/post-hydration.ts +113 -0
  530. package/src/client/browser-entry/router-init.ts +219 -0
  531. package/src/client/browser-entry/rsc-stream.ts +157 -0
  532. package/src/client/browser-entry/scroll.ts +27 -0
  533. package/src/client/error-boundary.tsx +99 -22
  534. package/src/client/error-reconstituter.tsx +65 -0
  535. package/src/client/form.tsx +31 -32
  536. package/src/client/history.ts +26 -4
  537. package/src/client/index.ts +67 -45
  538. package/src/client/internal.ts +58 -0
  539. package/src/client/link-pending-store.ts +116 -0
  540. package/src/client/link.tsx +343 -150
  541. package/src/client/nav-link-store.ts +37 -0
  542. package/src/client/navigation-api-types.ts +112 -0
  543. package/src/client/navigation-api.ts +338 -0
  544. package/src/client/navigation-context.ts +35 -7
  545. package/src/client/navigation-root.tsx +347 -0
  546. package/src/client/nuqs-adapter.tsx +16 -3
  547. package/src/client/router-ref.ts +1 -1
  548. package/src/client/router.ts +418 -128
  549. package/src/client/rsc-fetch.ts +208 -10
  550. package/src/client/segment-cache.ts +6 -3
  551. package/src/client/segment-outlet.tsx +77 -0
  552. package/src/client/segment-update-context.ts +42 -0
  553. package/src/client/shallow-url.ts +22 -0
  554. package/src/client/ssr-data.ts +13 -5
  555. package/src/client/stale-reload.ts +72 -3
  556. package/src/client/state.ts +2 -2
  557. package/src/client/top-loader.tsx +11 -9
  558. package/src/client/use-cookie.ts +31 -2
  559. package/src/client/use-link-status.ts +7 -7
  560. package/src/client/use-pathname.ts +1 -0
  561. package/src/client/use-pending-navigation.ts +40 -0
  562. package/src/client/use-query-states.ts +9 -3
  563. package/src/client/use-router.ts +4 -1
  564. package/src/client/use-search-params.ts +26 -44
  565. package/src/client/{use-params.ts → use-segment-params.ts} +9 -6
  566. package/src/codec.ts +147 -0
  567. package/src/config-types.ts +292 -0
  568. package/src/config-validation.ts +303 -0
  569. package/src/content/index.ts +5 -13
  570. package/src/cookies/define-cookie.ts +233 -53
  571. package/src/cookies/index.ts +12 -1
  572. package/src/cookies/json-cookie.ts +105 -0
  573. package/src/cookies/validation.ts +192 -0
  574. package/src/dev-tools/404-page.ts +387 -0
  575. package/src/dev-tools/browser-logs.ts +291 -0
  576. package/src/dev-tools/error-page.ts +507 -0
  577. package/src/dev-tools/holding-server.ts +187 -0
  578. package/src/dev-tools/index.ts +90 -0
  579. package/src/dev-tools/instrumentation.ts +176 -0
  580. package/src/{plugins/dev-logs.ts → dev-tools/logs.ts} +9 -5
  581. package/src/dev-tools/overlay.ts +469 -0
  582. package/src/dev-tools/stack-classifier.ts +75 -0
  583. package/src/dev-tools/terminal.ts +183 -0
  584. package/src/{server/dev-warnings.ts → dev-tools/warnings.ts} +5 -50
  585. package/src/fonts/ast.ts +525 -16
  586. package/src/fonts/bundle.ts +131 -0
  587. package/src/fonts/dev-middleware.ts +74 -0
  588. package/src/fonts/local.ts +3 -3
  589. package/src/fonts/pipeline.ts +337 -0
  590. package/src/fonts/transform.ts +317 -0
  591. package/src/fonts/types.ts +52 -1
  592. package/src/fonts/virtual-modules.ts +235 -0
  593. package/src/index.ts +415 -345
  594. package/src/params/codec-registry.ts +34 -0
  595. package/src/params/define-schema.ts +115 -0
  596. package/src/params/index.ts +17 -0
  597. package/src/params/resolve-schema.ts +116 -0
  598. package/src/plugin-context.ts +247 -0
  599. package/src/plugins/adapter-build.ts +98 -4
  600. package/src/plugins/build-manifest.ts +168 -23
  601. package/src/plugins/build-report.ts +16 -25
  602. package/src/plugins/cache.ts +180 -0
  603. package/src/plugins/client-chunks.ts +113 -0
  604. package/src/plugins/cloudflare-wasm.ts +103 -0
  605. package/src/plugins/content.ts +1 -1
  606. package/src/plugins/dev-server.ts +179 -37
  607. package/src/plugins/entries.ts +110 -8
  608. package/src/plugins/fonts.ts +167 -655
  609. package/src/plugins/mdx.ts +47 -10
  610. package/src/plugins/routing.ts +386 -47
  611. package/src/plugins/server-bundle.ts +59 -3
  612. package/src/plugins/shims.ts +136 -35
  613. package/src/plugins/static-build.ts +15 -89
  614. package/src/routing/codegen-shared.ts +115 -0
  615. package/src/routing/codegen-types.ts +61 -0
  616. package/src/routing/codegen.ts +321 -177
  617. package/src/routing/convention-lint.ts +357 -0
  618. package/src/routing/index.ts +10 -1
  619. package/src/routing/interception.ts +1 -1
  620. package/src/routing/link-codegen.ts +310 -0
  621. package/src/routing/scanner.ts +165 -110
  622. package/src/routing/schema-validation.ts +149 -0
  623. package/src/routing/segment-classify.ts +188 -0
  624. package/src/routing/segment-codegen.ts +98 -0
  625. package/src/routing/types.ts +78 -25
  626. package/src/routing/walkers.ts +90 -0
  627. package/src/rsc-runtime/rsc.ts +2 -0
  628. package/src/rsc-runtime/ssr.ts +50 -0
  629. package/src/rsc-runtime/vendor-types.d.ts +7 -0
  630. package/src/{search-params/codecs.ts → schema-bridge.ts} +60 -22
  631. package/src/search-params/define.ts +538 -0
  632. package/src/search-params/index.ts +14 -20
  633. package/src/search-params/registry.ts +2 -2
  634. package/src/search-params/wrappers.ts +92 -0
  635. package/src/segment-params/define.ts +309 -0
  636. package/src/segment-params/index.ts +9 -0
  637. package/src/server/access-gate.tsx +76 -34
  638. package/src/server/action-client.ts +119 -28
  639. package/src/server/action-encryption.ts +144 -0
  640. package/src/server/action-handler.ts +112 -14
  641. package/src/server/actions.ts +34 -26
  642. package/src/server/als-registry.ts +108 -20
  643. package/src/server/asset-headers.ts +8 -34
  644. package/src/server/body-limits.ts +10 -2
  645. package/src/server/build-manifest.ts +17 -4
  646. package/src/server/coalesce-tick.ts +75 -0
  647. package/src/server/compress.ts +25 -7
  648. package/src/server/cookie-context.ts +473 -0
  649. package/src/server/cookie-parsing.ts +135 -0
  650. package/src/server/csrf.ts +39 -6
  651. package/src/server/default-logger.ts +99 -0
  652. package/src/server/deny-boundary.ts +218 -0
  653. package/src/server/deny-renderer.ts +32 -52
  654. package/src/server/dev-source-map.ts +31 -0
  655. package/src/server/early-hints-sender.ts +3 -2
  656. package/src/server/early-hints.ts +35 -27
  657. package/src/server/error-boundary-wrapper.ts +74 -22
  658. package/src/server/fallback-error.ts +74 -102
  659. package/src/server/flight-injection-state.ts +113 -0
  660. package/src/server/flight-scripts.ts +62 -0
  661. package/src/server/flush.ts +2 -1
  662. package/src/server/form-data.ts +101 -5
  663. package/src/server/html-injector-core.ts +418 -0
  664. package/src/server/html-injectors.ts +238 -223
  665. package/src/server/index.ts +29 -183
  666. package/src/server/internal.ts +182 -0
  667. package/src/server/logger.ts +67 -36
  668. package/src/server/metadata-routes.ts +44 -19
  669. package/src/server/middleware-runner.ts +75 -4
  670. package/src/server/node-stream-transforms.ts +361 -0
  671. package/src/server/param-coercion.ts +206 -0
  672. package/src/server/pipeline-helpers.ts +204 -0
  673. package/src/server/pipeline-interception.ts +32 -18
  674. package/src/server/pipeline-metadata.ts +13 -0
  675. package/src/server/pipeline-outcome.ts +197 -0
  676. package/src/server/pipeline-phases.ts +527 -0
  677. package/src/server/pipeline.ts +201 -382
  678. package/src/server/port-resolution.ts +215 -0
  679. package/src/server/primitives.ts +130 -46
  680. package/src/server/render-timeout.ts +108 -0
  681. package/src/server/request-context.ts +168 -337
  682. package/src/server/route-element-builder.ts +437 -208
  683. package/src/server/route-handler.ts +31 -4
  684. package/src/server/route-matcher.ts +128 -277
  685. package/src/server/rsc-entry/action-middleware-runner.ts +167 -0
  686. package/src/server/rsc-entry/api-handler.ts +69 -32
  687. package/src/server/rsc-entry/error-renderer.ts +316 -89
  688. package/src/server/rsc-entry/helpers.ts +155 -26
  689. package/src/server/rsc-entry/index.ts +283 -329
  690. package/src/server/rsc-entry/render-route.ts +313 -0
  691. package/src/server/rsc-entry/revalidate-renderer.ts +344 -0
  692. package/src/server/rsc-entry/rsc-payload.ts +65 -22
  693. package/src/server/rsc-entry/rsc-stream.ts +85 -13
  694. package/src/server/rsc-entry/ssr-bridge.ts +18 -5
  695. package/src/server/rsc-entry/ssr-renderer.ts +271 -41
  696. package/src/server/rsc-entry/wrap-action-dispatch.ts +449 -0
  697. package/src/server/safe-load.ts +60 -0
  698. package/src/server/sensitive-fields.ts +230 -0
  699. package/src/server/sitemap-generator.ts +338 -0
  700. package/src/server/sitemap-handler.ts +148 -0
  701. package/src/server/slot-resolver.ts +234 -246
  702. package/src/server/ssr-bridge-types.ts +124 -0
  703. package/src/server/ssr-entry.ts +217 -78
  704. package/src/server/ssr-render.ts +344 -71
  705. package/src/server/ssr-wrappers.tsx +141 -0
  706. package/src/server/state-tree-diff.ts +30 -23
  707. package/src/server/status-code-resolver.ts +112 -128
  708. package/src/server/stream-utils.ts +213 -0
  709. package/src/server/tracing.ts +21 -10
  710. package/src/server/tree-builder.ts +204 -90
  711. package/src/server/tree-match.ts +210 -0
  712. package/src/server/types.ts +78 -9
  713. package/src/server/utils/escape-html.ts +20 -0
  714. package/src/server/version-skew.ts +104 -0
  715. package/src/shared/href-validation.ts +127 -0
  716. package/src/shared/merge-search-params.ts +55 -0
  717. package/src/shims/font-google.ts +1 -1
  718. package/src/shims/font-local.ts +34 -0
  719. package/src/shims/headers.ts +5 -1
  720. package/src/shims/navigation-client.ts +4 -3
  721. package/src/shims/navigation.ts +14 -7
  722. package/src/utils/state-machine.ts +111 -0
  723. package/dist/_chunks/als-registry-B7DbZ2hS.js +0 -41
  724. package/dist/_chunks/als-registry-B7DbZ2hS.js.map +0 -1
  725. package/dist/_chunks/debug-B3Gypr3D.js +0 -108
  726. package/dist/_chunks/debug-B3Gypr3D.js.map +0 -1
  727. package/dist/_chunks/format-RyoGQL74.js.map +0 -1
  728. package/dist/_chunks/interception-BOoWmLUA.js +0 -676
  729. package/dist/_chunks/interception-BOoWmLUA.js.map +0 -1
  730. package/dist/_chunks/metadata-routes-Cjmvi3rQ.js.map +0 -1
  731. package/dist/_chunks/request-context-BQUC8PHn.js +0 -330
  732. package/dist/_chunks/request-context-BQUC8PHn.js.map +0 -1
  733. package/dist/_chunks/ssr-data-MjmprTmO.js.map +0 -1
  734. package/dist/_chunks/tracing-CemImE6h.js +0 -187
  735. package/dist/_chunks/tracing-CemImE6h.js.map +0 -1
  736. package/dist/_chunks/use-cookie-DX-l1_5E.js +0 -91
  737. package/dist/_chunks/use-cookie-DX-l1_5E.js.map +0 -1
  738. package/dist/_chunks/use-query-states-D5KaffOK.js.map +0 -1
  739. package/dist/cache/register-cached-function.d.ts +0 -17
  740. package/dist/cache/register-cached-function.d.ts.map +0 -1
  741. package/dist/client/browser-entry.d.ts +0 -21
  742. package/dist/client/browser-entry.d.ts.map +0 -1
  743. package/dist/client/link-status-provider.d.ts +0 -11
  744. package/dist/client/link-status-provider.d.ts.map +0 -1
  745. package/dist/client/segment-merger.d.ts +0 -119
  746. package/dist/client/segment-merger.d.ts.map +0 -1
  747. package/dist/client/transition-root.d.ts.map +0 -1
  748. package/dist/client/use-navigation-pending.d.ts +0 -26
  749. package/dist/client/use-navigation-pending.d.ts.map +0 -1
  750. package/dist/client/use-params.d.ts.map +0 -1
  751. package/dist/plugins/cache-transform.d.ts +0 -36
  752. package/dist/plugins/cache-transform.d.ts.map +0 -1
  753. package/dist/plugins/dev-error-overlay.d.ts +0 -60
  754. package/dist/plugins/dev-error-overlay.d.ts.map +0 -1
  755. package/dist/plugins/dev-logs.d.ts.map +0 -1
  756. package/dist/plugins/dynamic-transform.d.ts +0 -72
  757. package/dist/plugins/dynamic-transform.d.ts.map +0 -1
  758. package/dist/plugins/server-action-exports.d.ts +0 -26
  759. package/dist/plugins/server-action-exports.d.ts.map +0 -1
  760. package/dist/routing/status-file-lint.d.ts +0 -33
  761. package/dist/routing/status-file-lint.d.ts.map +0 -1
  762. package/dist/search-params/analyze.d.ts +0 -54
  763. package/dist/search-params/analyze.d.ts.map +0 -1
  764. package/dist/search-params/builtin-codecs.d.ts +0 -105
  765. package/dist/search-params/builtin-codecs.d.ts.map +0 -1
  766. package/dist/search-params/codecs.d.ts +0 -53
  767. package/dist/search-params/codecs.d.ts.map +0 -1
  768. package/dist/search-params/create.d.ts +0 -106
  769. package/dist/search-params/create.d.ts.map +0 -1
  770. package/dist/server/dev-fetch-instrumentation.d.ts +0 -22
  771. package/dist/server/dev-fetch-instrumentation.d.ts.map +0 -1
  772. package/dist/server/dev-logger.d.ts.map +0 -1
  773. package/dist/server/dev-span-processor.d.ts.map +0 -1
  774. package/dist/server/dev-warnings.d.ts.map +0 -1
  775. package/dist/server/manifest-status-resolver.d.ts +0 -58
  776. package/dist/server/manifest-status-resolver.d.ts.map +0 -1
  777. package/dist/server/prerender.d.ts +0 -77
  778. package/dist/server/prerender.d.ts.map +0 -1
  779. package/dist/utils/directive-parser.d.ts +0 -70
  780. package/dist/utils/directive-parser.d.ts.map +0 -1
  781. package/src/cache/register-cached-function.ts +0 -103
  782. package/src/client/browser-entry.ts +0 -678
  783. package/src/client/link-status-provider.tsx +0 -30
  784. package/src/client/segment-merger.ts +0 -339
  785. package/src/client/transition-root.tsx +0 -166
  786. package/src/client/use-navigation-pending.ts +0 -38
  787. package/src/plugins/cache-transform.ts +0 -199
  788. package/src/plugins/dev-error-overlay.ts +0 -230
  789. package/src/plugins/dynamic-transform.ts +0 -161
  790. package/src/plugins/server-action-exports.ts +0 -220
  791. package/src/routing/status-file-lint.ts +0 -112
  792. package/src/search-params/analyze.ts +0 -192
  793. package/src/search-params/builtin-codecs.ts +0 -228
  794. package/src/search-params/create.ts +0 -321
  795. package/src/server/dev-fetch-instrumentation.ts +0 -96
  796. package/src/server/dev-span-processor.ts +0 -78
  797. package/src/server/manifest-status-resolver.ts +0 -215
  798. package/src/server/prerender.ts +0 -139
  799. package/src/utils/directive-parser.ts +0 -529
  800. /package/src/{server/dev-logger.ts → dev-tools/logger.ts} +0 -0
@@ -5,6 +5,17 @@
5
5
  * independently of the Vite RSC plugin runtime (which provides
6
6
  * createFromReadableStream for decoding RSC streams).
7
7
  *
8
+ * Uses a platform-adaptive rendering strategy:
9
+ * - **Node.js / Bun**: `renderToPipeableStream` — React pipes HTML chunks
10
+ * through Node.js native streams (C++ implementation). Each chunk flows
11
+ * through libuv buffers with zero Promise overhead.
12
+ * - **Cloudflare Workers / Edge**: `renderToReadableStream` — React outputs
13
+ * to Web Streams which are V8-native C++ built-ins on these platforms.
14
+ *
15
+ * The detection is automatic at runtime. Both paths produce a Web
16
+ * `ReadableStream<Uint8Array>` so downstream transforms (injectHead,
17
+ * injectRscPayload, compression) work identically regardless of platform.
18
+ *
8
19
  * Design docs: 02-rendering-pipeline.md §"Single-Pass Rendering",
9
20
  * 18-build-system.md §"Entry Files"
10
21
  */
@@ -12,7 +23,25 @@
12
23
  import type { ReactNode } from 'react';
13
24
  import { renderToReadableStream } from 'react-dom/server';
14
25
 
15
- import { formatSsrError } from './error-formatter.js';
26
+ import { createRenderTimeout, RenderTimeoutError } from './render-timeout.js';
27
+ import { logRenderError, logStreamingError } from './logger.js';
28
+
29
+ /**
30
+ * React's production error sanitization message. When NODE_ENV=production,
31
+ * React replaces all error messages with this string in renderToReadableStream
32
+ * and renderToPipeableStream. The original error was already logged by the
33
+ * RSC onError handler — logging the sanitized version in SSR is duplicate noise.
34
+ */
35
+ const REACT_PROD_ERROR_PREFIX = 'An error occurred in the Server Components render';
36
+
37
+ /**
38
+ * Returns true if the error is React's sanitized production error.
39
+ * These are duplicates of errors already logged by the RSC onError handler
40
+ * with the full original message — logging them again in SSR adds noise.
41
+ */
42
+ function isReactSanitizedError(error: unknown): boolean {
43
+ return error instanceof Error && error.message.startsWith(REACT_PROD_ERROR_PREFIX);
44
+ }
16
45
 
17
46
  /**
18
47
  * Inline script that injects <meta name="robots" content="noindex"> into <head>.
@@ -28,93 +57,350 @@ import { formatSsrError } from './error-formatter.js';
28
57
  const NOINDEX_SCRIPT =
29
58
  '<script>document.head.appendChild(Object.assign(document.createElement("meta"),{name:"robots",content:"noindex"}))</script>';
30
59
 
60
+ // ─── Platform Detection ──────────────────────────────────────────────────────
61
+ //
62
+ // Detect whether we're running on a platform with native Node.js streams.
63
+ // On Node.js/Bun, `node:stream` is backed by C++ (libuv). On Cloudflare
64
+ // Workers, `node:stream` via nodejs_compat is a JS polyfill — Web Streams
65
+ // are the faster path there (V8-native C++ built-ins).
66
+ //
67
+ // We detect once at module load to avoid per-request overhead.
68
+ // The check: process.versions.node exists AND we can import node:stream.
69
+ // Cloudflare Workers with nodejs_compat may polyfill process.versions but
70
+ // the streams won't be native. The Readable.toWeb check confirms native support.
71
+
72
+ let _useNodeStreams = false;
73
+ let _PassThrough: typeof import('node:stream').PassThrough | null = null;
74
+ let _ReadableToWeb: ((readable: import('node:stream').Readable) => ReadableStream) | null = null;
75
+ let _renderToPipeableStream: typeof import('react-dom/server').renderToPipeableStream | null = null;
76
+
77
+ try {
78
+ // Dynamic imports to avoid bundling node:stream and the Node.js-specific
79
+ // react-dom/server entry for CF Workers builds.
80
+ // On Node.js/Bun this resolves to native C++ streams.
81
+ // On CF Workers this either fails or returns a JS polyfill.
82
+ const nodeStream = await import('node:stream');
83
+ if (
84
+ typeof nodeStream.PassThrough === 'function' &&
85
+ typeof nodeStream.Readable.toWeb === 'function' &&
86
+ // Real Node.js — not a polyfill. Polyfills typically don't set
87
+ // process.release.name to 'node'.
88
+ typeof process !== 'undefined' &&
89
+ process.release?.name === 'node'
90
+ ) {
91
+ // Dynamically import renderToPipeableStream from the Node.js-specific
92
+ // entry point. The SSR bundle resolves react-dom/server to the edge/browser
93
+ // export (which lacks renderToPipeableStream), so we import the .node file
94
+ // directly. This is safe because we're inside a process.release.name === 'node'
95
+ // guard — this code only runs on real Node.js.
96
+ const reactDomServer = await import('react-dom/server.node');
97
+ if (typeof reactDomServer.renderToPipeableStream === 'function') {
98
+ _useNodeStreams = true;
99
+ _PassThrough = nodeStream.PassThrough;
100
+ _ReadableToWeb = nodeStream.Readable.toWeb as (
101
+ readable: import('node:stream').Readable
102
+ ) => ReadableStream;
103
+ _renderToPipeableStream = reactDomServer.renderToPipeableStream;
104
+ }
105
+ }
106
+ } catch {
107
+ // node:stream or renderToPipeableStream not available — use Web Streams path
108
+ }
109
+
31
110
  /**
32
111
  * Render a React element tree to a ReadableStream of HTML.
33
112
  *
34
- * Uses renderToReadableStream (NOT renderToString) for streaming SSR.
113
+ * Automatically selects the optimal rendering path for the platform:
114
+ * - Node.js/Bun: `renderToPipeableStream` → Node.js native streams → `Readable.toWeb()`
115
+ * - CF Workers/Edge: `renderToReadableStream` → native Web Streams
116
+ *
35
117
  * The returned stream begins yielding after onShellReady — everything
36
118
  * outside <Suspense> boundaries is in the shell.
37
119
  *
38
- * With progressive streaming, the RSC stream is piped directly to SSR
39
- * without buffering. If deny() was called outside a Suspense boundary,
40
- * the RSC stream encodes an error in the shell — renderToReadableStream
41
- * rejects, and the RSC entry catches this to render a deny page with
42
- * the correct HTTP status code. If deny() was inside Suspense, the shell
43
- * succeeds (200 committed) and the error streams as an error boundary.
44
- *
45
120
  * @param element - The React element tree decoded from the RSC stream
46
121
  * @param options - Optional configuration
47
- * @param options.bootstrapScriptContent - Inline JS injected by React as a
48
- * non-deferred `<script>` in the shell HTML. Executes immediately during
49
- * parsing — even while Suspense boundaries are still streaming. Used to
50
- * kick off module loading via dynamic `import()` so hydration can start
51
- * before the HTML stream closes.
52
122
  * @returns A ReadableStream of HTML bytes with hydration markers
53
123
  */
54
124
  export async function renderSsrStream(
55
125
  element: ReactNode,
56
- options?: { bootstrapScriptContent?: string; deferSuspenseFor?: number; signal?: AbortSignal }
126
+ options?: {
127
+ bootstrapScriptContent?: string;
128
+ deferSuspenseFor?: number;
129
+ signal?: AbortSignal;
130
+ renderTimeoutMs?: number;
131
+ /** Request info threaded into render-error logs (method/path). */
132
+ requestInfo?: { method: string; path: string };
133
+ /**
134
+ * Fired synchronously when the render function is about to resolve
135
+ * (i.e. at hold-end / shell-ready). `resolved` reports whether Fizz's
136
+ * `stream.allReady` had already settled by that moment. Callers use
137
+ * this to decide whether signal promotion can be short-circuited.
138
+ * See NavContext._fizzAllReadyResolved.
139
+ */
140
+ onFizzAllReadyResolved?: (resolved: boolean) => void;
141
+ }
57
142
  ): Promise<ReadableStream<Uint8Array>> {
143
+ return renderViaReadableStream(element, options);
144
+ }
145
+
146
+ /** Whether the current platform uses native Node.js streams for SSR. */
147
+ export const useNodeStreams = _useNodeStreams;
148
+
149
+ // ─── Node.js Path: renderToPipeableStream ────────────────────────────────────
150
+ //
151
+ // Uses React's Node.js-native API. HTML chunks flow through C++ stream
152
+ // buffers with zero Promise allocations per chunk. Returns a Node.js
153
+ // Readable — the caller (ssr-entry.ts) pipes through Node.js Transform
154
+ // streams for injectHead/injectRscPayload before converting to Web
155
+ // ReadableStream at the Response boundary.
156
+
157
+ /**
158
+ * Render via renderToPipeableStream, returning a Node.js Readable.
159
+ *
160
+ * The entire HTML rendering + post-processing pipeline stays in native
161
+ * Node.js streams (C++ backed). Only converted to Web ReadableStream
162
+ * at the very end for the Response body.
163
+ */
164
+ export async function renderSsrNodeStream(
165
+ element: ReactNode,
166
+ options?: {
167
+ bootstrapScriptContent?: string;
168
+ deferSuspenseFor?: number;
169
+ signal?: AbortSignal;
170
+ renderTimeoutMs?: number;
171
+ /** Request info threaded into render-error logs (method/path). */
172
+ requestInfo?: { method: string; path: string };
173
+ /**
174
+ * Fired synchronously at the moment `renderSsrNodeStream`'s returned
175
+ * Promise is about to resolve. `resolved` reports whether Fizz's
176
+ * `onAllReady` had already fired by then. See the twin callback on
177
+ * `renderSsrStream`.
178
+ */
179
+ onFizzAllReadyResolved?: (resolved: boolean) => void;
180
+ }
181
+ ): Promise<import('node:stream').Readable> {
58
182
  const signal = options?.signal;
59
- const stream = await renderToReadableStream(element, {
60
- bootstrapScriptContent: options?.bootstrapScriptContent || undefined,
61
- signal,
62
- onError(error: unknown) {
63
- // Suppress logging for connection aborts — the user refreshed or
64
- // navigated away, not an application error.
65
- if (isAbortError(error) || signal?.aborted) return;
66
- console.error('[timber] SSR render error:', formatSsrError(error));
67
- },
183
+ const deferMs = options?.deferSuspenseFor;
184
+ const timeoutMs = options?.renderTimeoutMs;
185
+ const requestInfo = options?.requestInfo;
186
+ const onFizzAllReadyResolved = options?.onFizzAllReadyResolved;
187
+
188
+ return new Promise<import('node:stream').Readable>((resolve, reject) => {
189
+ const passthrough = new _PassThrough!();
190
+
191
+ let allReadyResolve: (() => void) | null = null;
192
+ let allReadyReject: ((reason?: unknown) => void) | null = null;
193
+ let allReadyFired = false;
194
+ const allReady = new Promise<void>((resolve, reject) => {
195
+ allReadyResolve = resolve;
196
+ allReadyReject = reject;
197
+ });
198
+ allReady.catch(() => {});
199
+
200
+ const { pipe, abort } = _renderToPipeableStream!(element, {
201
+ bootstrapScriptContent: options?.bootstrapScriptContent || undefined,
202
+
203
+ onShellReady() {
204
+ if (deferMs && deferMs > 0) {
205
+ Promise.race([allReady, new Promise<void>((r) => setTimeout(r, deferMs))]).then(() => {
206
+ onFizzAllReadyResolved?.(allReadyFired);
207
+ pipe(passthrough);
208
+ resolve(passthrough);
209
+ });
210
+ } else {
211
+ // No hold — allReady has almost certainly not fired yet.
212
+ // Report false so the RSC entry runs the microtask retry loop.
213
+ onFizzAllReadyResolved?.(allReadyFired);
214
+ pipe(passthrough);
215
+ resolve(passthrough);
216
+ }
217
+ },
218
+
219
+ onAllReady() {
220
+ allReadyFired = true;
221
+ allReadyResolve?.();
222
+ },
223
+
224
+ onShellError(error: unknown) {
225
+ // Reject allReady so the render timeout is cancelled.
226
+ // Without this, a pre-shell failure leaves the timer
227
+ // running for the full timeout window.
228
+ allReadyReject?.(error);
229
+ reject(error);
230
+ },
231
+
232
+ onError(error: unknown) {
233
+ if (isAbortError(error) || signal?.aborted) return;
234
+ // Skip React's sanitized production errors — the original was
235
+ // already logged by the RSC onError with full details.
236
+ if (isReactSanitizedError(error)) return;
237
+ logRenderError({
238
+ method: requestInfo?.method ?? '',
239
+ path: requestInfo?.path ?? '',
240
+ error,
241
+ });
242
+ },
243
+ });
244
+
245
+ // Wire abort to both request signal AND render timeout.
246
+ // If the client stays connected but a downstream fetch hangs,
247
+ // the timeout ensures abort() is eventually called.
248
+ if (signal) {
249
+ if (signal.aborted) {
250
+ abort();
251
+ } else {
252
+ signal.addEventListener('abort', () => abort(), { once: true });
253
+ }
254
+ }
255
+
256
+ if (timeoutMs && timeoutMs > 0) {
257
+ const renderTimeout = createRenderTimeout(timeoutMs, signal);
258
+ renderTimeout.signal.addEventListener(
259
+ 'abort',
260
+ () => {
261
+ logRenderError({
262
+ method: requestInfo?.method ?? '',
263
+ path: requestInfo?.path ?? '',
264
+ error: new Error(
265
+ `SSR render timed out after ${timeoutMs}ms — aborting. ` +
266
+ 'A Suspense component or downstream fetch may be hanging.'
267
+ ),
268
+ });
269
+ abort(renderTimeout.signal.reason);
270
+ },
271
+ { once: true }
272
+ );
273
+ // Cancel the timeout when the render completes OR on pre-shell
274
+ // failure. Without the catch branch, onShellError → reject()
275
+ // would leave the timer running for the full timeout window.
276
+ allReady.then(
277
+ () => renderTimeout.cancel(),
278
+ () => renderTimeout.cancel()
279
+ );
280
+ }
68
281
  });
282
+ }
283
+
284
+ /** Convert a Node.js Readable to a Web ReadableStream (zero-copy bridge). */
285
+ export function nodeReadableToWeb(
286
+ readable: import('node:stream').Readable
287
+ ): ReadableStream<Uint8Array> {
288
+ return _ReadableToWeb!(readable) as ReadableStream<Uint8Array>;
289
+ }
290
+
291
+ // ─── Web Streams Path: renderToReadableStream ────────────────────────────────
292
+ //
293
+ // Uses React's Web Streams API. On Cloudflare Workers, ReadableStream is a
294
+ // V8-native C++ built-in, making this the fastest path for that platform.
295
+ // On Node.js, Web Streams are a JS reimplementation — slower, but this path
296
+ // is only used as a fallback when Node.js native streams aren't available.
297
+
298
+ async function renderViaReadableStream(
299
+ element: ReactNode,
300
+ options?: {
301
+ bootstrapScriptContent?: string;
302
+ deferSuspenseFor?: number;
303
+ signal?: AbortSignal;
304
+ renderTimeoutMs?: number;
305
+ requestInfo?: { method: string; path: string };
306
+ onFizzAllReadyResolved?: (resolved: boolean) => void;
307
+ }
308
+ ): Promise<ReadableStream<Uint8Array>> {
309
+ const signal = options?.signal;
310
+ const timeoutMs = options?.renderTimeoutMs;
311
+ const requestInfo = options?.requestInfo;
312
+ const onFizzAllReadyResolved = options?.onFizzAllReadyResolved;
313
+
314
+ // If a render timeout is configured, create a combined signal that
315
+ // fires on either request abort OR timeout — whichever comes first.
316
+ let renderTimeout: import('./render-timeout.js').RenderTimeout | null = null;
317
+ let effectiveSignal = signal;
318
+ if (timeoutMs && timeoutMs > 0) {
319
+ renderTimeout = createRenderTimeout(timeoutMs, signal);
320
+ effectiveSignal = renderTimeout.signal;
321
+ }
322
+
323
+ let stream: Awaited<ReturnType<typeof renderToReadableStream>>;
324
+ try {
325
+ stream = await renderToReadableStream(element, {
326
+ bootstrapScriptContent: options?.bootstrapScriptContent || undefined,
327
+ signal: effectiveSignal,
328
+ onError(error: unknown) {
329
+ if (isAbortError(error) || effectiveSignal?.aborted) return;
330
+ if (error instanceof RenderTimeoutError) {
331
+ logRenderError({
332
+ method: requestInfo?.method ?? '',
333
+ path: requestInfo?.path ?? '',
334
+ error: new Error(
335
+ `SSR render timed out after ${timeoutMs}ms — aborting. ` +
336
+ 'A Suspense component or downstream fetch may be hanging.'
337
+ ),
338
+ });
339
+ return;
340
+ }
341
+ // Skip React's sanitized production errors — the original was
342
+ // already logged by the RSC onError with full details.
343
+ if (isReactSanitizedError(error)) return;
344
+ logRenderError({
345
+ method: requestInfo?.method ?? '',
346
+ path: requestInfo?.path ?? '',
347
+ error,
348
+ });
349
+ },
350
+ });
351
+ } catch (error) {
352
+ // Pre-shell failure (e.g. RSC stream error). Cancel the render
353
+ // timeout so it doesn't leak a timer + abort callback for the
354
+ // full timeout window. Under repeated pre-shell failures this
355
+ // would accumulate unnecessary timers.
356
+ renderTimeout?.cancel();
357
+ throw error;
358
+ }
69
359
 
70
360
  // Prevent unhandled promise rejection from streaming-phase errors.
71
- // React DOM Server exposes `allReady` — a promise that resolves when
72
- // ALL content (including Suspense boundaries) has been rendered. If a
73
- // streaming-phase error occurs (e.g. React boundary flush failure),
74
- // `allReady` rejects independently of the stream. Without this catch,
75
- // the rejection becomes an unhandled promise rejection that crashes
76
- // the Node.js process.
77
361
  stream.allReady.catch(() => {});
78
362
 
363
+ // Cancel the render timeout once allReady resolves (render completed).
364
+ if (renderTimeout) {
365
+ stream.allReady.then(() => renderTimeout!.cancel()).catch(() => renderTimeout!.cancel());
366
+ }
367
+
79
368
  // deferSuspenseFor hold: delay the first read so React can resolve
80
369
  // fast-completing Suspense boundaries before we read the shell HTML.
81
- // renderToReadableStream generates HTML lazily on pull — if we wait
82
- // before reading, React resolves pending boundaries and inlines their
83
- // content instead of serializing fallbacks. Race allReady against
84
- // deferSuspenseFor so we don't wait longer than necessary.
85
370
  // See design/05-streaming.md §"deferSuspenseFor"
371
+ //
372
+ // While we're holding, also track whether `stream.allReady` settled
373
+ // before the timer. That boolean is the Option-1 signal-promotion
374
+ // short-circuit key — see NavContext._fizzAllReadyResolved and
375
+ // design/spike-signal-promotion-protocol.md.
376
+ let fizzAllReadyResolved = false;
377
+ const allReadyTap = stream.allReady.then(
378
+ () => {
379
+ fizzAllReadyResolved = true;
380
+ },
381
+ () => {
382
+ // allReady rejections are already swallowed above; keep false.
383
+ }
384
+ );
86
385
  const deferMs = options?.deferSuspenseFor;
87
386
  if (deferMs && deferMs > 0) {
88
- await Promise.race([
89
- stream.allReady,
90
- new Promise<void>((resolve) => setTimeout(resolve, deferMs)),
91
- ]);
387
+ await Promise.race([allReadyTap, new Promise<void>((resolve) => setTimeout(resolve, deferMs))]);
92
388
  }
389
+ onFizzAllReadyResolved?.(fizzAllReadyResolved);
93
390
 
94
- // renderToReadableStream resolves after onShellReady by default.
95
- // The stream is ready to read — the shell (everything outside
96
- // Suspense boundaries) is available. Suspense content streams
97
- // into the open connection as it resolves.
98
- //
99
- // Wrap the stream in an error-resilient transform. With progressive
100
- // streaming, errors inside Suspense boundaries (e.g. deny() or throws
101
- // in async components) cause React's stream to error during the flush
102
- // phase. The onError callback logs the error, but the stream error
103
- // would become an unhandled promise rejection and crash the process.
104
- // The transform catches these post-shell streaming errors and closes
105
- // the stream cleanly — the shell (with correct status code) has
106
- // already been sent.
107
391
  return wrapStreamWithErrorHandling(stream, signal);
108
392
  }
109
393
 
394
+ // ─── Shared Utilities ────────────────────────────────────────────────────────
395
+
110
396
  /**
111
397
  * Wrap an HTML stream with error handling for the streaming phase.
112
398
  *
113
399
  * During progressive RSC→SSR streaming, errors in Suspense boundaries
114
400
  * (e.g. deny() inside Suspense, throws in async components) cause
115
- * React DOM's renderToReadableStream to error after the shell has been
116
- * flushed. Without this wrapper, the stream error becomes an unhandled
117
- * promise rejection that crashes the process.
401
+ * React DOM's stream to error after the shell has been flushed. Without
402
+ * this wrapper, the stream error becomes an unhandled promise rejection
403
+ * that crashes the process.
118
404
  *
119
405
  * The wrapper catches streaming-phase errors, logs them, and closes
120
406
  * the output stream cleanly. The shell (headers, status code, content
@@ -138,18 +424,11 @@ export function wrapStreamWithErrorHandling(
138
424
  }
139
425
  controller.enqueue(value);
140
426
  } catch (error) {
141
- // Connection abort (user refreshed or navigated away) — close
142
- // silently without logging. This is not an application error.
143
427
  if (isAbortError(error) || signal?.aborted) {
144
428
  controller.close();
145
429
  return;
146
430
  }
147
- // Streaming-phase error (e.g. React boundary flush failure,
148
- // deny() or throw inside Suspense after flush).
149
- // The shell has already been sent with status 200. Inject a
150
- // noindex meta tag so search engines don't index this error page,
151
- // then close cleanly. See design/05-streaming.md.
152
- console.error('[timber] SSR streaming error (post-shell):', formatSsrError(error));
431
+ logStreamingError({ error });
153
432
  controller.enqueue(encoder.encode(NOINDEX_SCRIPT));
154
433
  controller.close();
155
434
  }
@@ -162,10 +441,6 @@ export function wrapStreamWithErrorHandling(
162
441
 
163
442
  /**
164
443
  * Check if an error is an abort error (connection closed by client).
165
- *
166
- * When the browser aborts a request (page refresh, navigation away),
167
- * the AbortSignal fires and React/streams throw an AbortError. This
168
- * is not an application error — suppress it from error boundaries and logs.
169
444
  */
170
445
  function isAbortError(error: unknown): boolean {
171
446
  if (error instanceof DOMException && error.name === 'AbortError') return true;
@@ -177,12 +452,10 @@ function isAbortError(error: unknown): boolean {
177
452
  * Build a Response from the SSR HTML stream with the correct
178
453
  * status code and headers from the navigation context.
179
454
  *
180
- * Sets content-type to text/html if not already set by middleware.
455
+ * React 19.3+ automatically emits `<!DOCTYPE html>` when the root
456
+ * element is `<html>`, so no framework-level doctype prepending is needed.
181
457
  *
182
- * @param htmlStream - The HTML stream from renderSsrStream
183
- * @param statusCode - The committed HTTP status code from RSC
184
- * @param responseHeaders - Response headers from middleware/proxy
185
- * @returns A Response ready to send to the client
458
+ * Sets content-type to text/html if not already set by middleware.
186
459
  */
187
460
  export function buildSsrResponse(
188
461
  htmlStream: ReadableStream<Uint8Array>,
@@ -0,0 +1,141 @@
1
+ /**
2
+ * SSR wrapper components that match the client-side component tree depth.
3
+ *
4
+ * During hydration, React's useId() generates deterministic IDs based on
5
+ * the component's position in the fiber tree. If the SSR tree has fewer
6
+ * wrapper components than the client hydration tree, every useId() call
7
+ * produces different IDs — causing hydration mismatches in libraries like
8
+ * Radix UI that rely on useId() internally.
9
+ *
10
+ * The client tree (browser-entry.ts) wraps the RSC element with:
11
+ * NavigationRoot → PendingNavigationProvider → Fragment(TopLoader, ...) →
12
+ * TimberNuqsAdapter → NuqsAdapterProvider → NavigationProvider → element
13
+ *
14
+ * The SSR tree must produce the same component boundaries. These wrappers
15
+ * are no-op components that render children directly but exist as fiber
16
+ * nodes to match the client's tree depth.
17
+ *
18
+ * Related issues: facebook/react#24669, radix-ui/primitives#3700
19
+ * See design/02-rendering-pipeline.md §"RSC → SSR → Client Hydration"
20
+ */
21
+
22
+ import { createElement, Fragment, type ReactNode } from 'react';
23
+ import { withNuqsSsrAdapter } from './nuqs-ssr-provider.js';
24
+
25
+ /**
26
+ * SSR equivalent of NavigationRoot.
27
+ *
28
+ * On the client, NavigationRoot uses useState and standalone startTransition, rendering:
29
+ * PendingNavigationProvider(Fragment(TopLoader, element))
30
+ *
31
+ * This SSR version matches the component boundary depth without client
32
+ * hooks. It renders SsrPendingProvider → Fragment(SsrTopLoader, children).
33
+ */
34
+ function SsrNavigationRoot({
35
+ children,
36
+ hasTopLoader,
37
+ }: {
38
+ children: ReactNode;
39
+ hasTopLoader: boolean;
40
+ }): ReactNode {
41
+ if (hasTopLoader) {
42
+ return createElement(
43
+ SsrPendingProvider,
44
+ null,
45
+ createElement(Fragment, null, createElement(SsrTopLoader, null), children)
46
+ );
47
+ }
48
+ return createElement(SsrPendingProvider, null, children);
49
+ }
50
+
51
+ /**
52
+ * SSR equivalent of PendingNavigationProvider.
53
+ * Matches the context.Provider component boundary on the client.
54
+ */
55
+ function SsrPendingProvider({ children }: { children: ReactNode }): ReactNode {
56
+ return children as ReactNode;
57
+ }
58
+
59
+ /**
60
+ * SSR equivalent of TopLoader.
61
+ * Exists as a fiber node to match the client tree depth; renders nothing.
62
+ */
63
+ function SsrTopLoader(): ReactNode {
64
+ return null;
65
+ }
66
+
67
+ /**
68
+ * SSR equivalent of NavigationProvider.
69
+ * Matches the context.Provider component boundary on the client.
70
+ */
71
+ function SsrNavigationProvider({ children }: { children: ReactNode }): ReactNode {
72
+ return children as ReactNode;
73
+ }
74
+
75
+ /**
76
+ * SSR equivalent of TimberNuqsAdapter component boundary.
77
+ * The actual NuqsAdapterProvider (from createAdapterProvider) is added
78
+ * inside this wrapper via withNuqsSsrAdapter, matching the client's
79
+ * TimberNuqsAdapter → NuqsAdapterProvider nesting.
80
+ */
81
+ function SsrNuqsWrapper({
82
+ searchParams,
83
+ children,
84
+ }: {
85
+ searchParams: Record<string, string>;
86
+ children: ReactNode;
87
+ }): ReactNode {
88
+ // withNuqsSsrAdapter creates a NuqsAdapterProvider (from createAdapterProvider),
89
+ // which is the same component factory used by TimberNuqsAdapter on the client.
90
+ // Both produce the same internal component boundary depth.
91
+ return withNuqsSsrAdapter(searchParams, children);
92
+ }
93
+
94
+ /**
95
+ * Wrap the SSR element tree with the same component boundaries as the
96
+ * client hydration tree. This ensures useId() generates matching IDs
97
+ * on both sides.
98
+ *
99
+ * Client tree (browser-entry.ts):
100
+ * NavigationRoot
101
+ * → PendingNavigationProvider
102
+ * → Fragment(TopLoader, element)
103
+ * → TimberNuqsAdapter
104
+ * → NuqsAdapterProvider (from createAdapterProvider)
105
+ * → NavigationProvider
106
+ * → [RSC element]
107
+ *
108
+ * SSR tree (this function):
109
+ * SsrNavigationRoot
110
+ * → SsrPendingProvider
111
+ * → Fragment(SsrTopLoader, element)
112
+ * → SsrNuqsWrapper
113
+ * → NuqsAdapterProvider (from withNuqsSsrAdapter → createAdapterProvider)
114
+ * → SsrNavigationProvider
115
+ * → [RSC element]
116
+ *
117
+ * @param element - The decoded RSC element
118
+ * @param searchParams - Request search params for nuqs SSR adapter
119
+ * @param hasTopLoader - Whether the top loader is enabled (must match client config)
120
+ */
121
+ export function wrapSsrElement(
122
+ element: ReactNode,
123
+ searchParams: Record<string, string>,
124
+ hasTopLoader: boolean
125
+ ): ReactNode {
126
+ // Build inside-out to match the client's createElement chain:
127
+ // NavigationProvider(TimberNuqsAdapter(element))
128
+ // → passed as initial to NavigationRoot
129
+ // → NavigationRoot renders PendingNavigationProvider(Fragment(TopLoader, initial))
130
+
131
+ // 1. Innermost: NavigationProvider equivalent
132
+ const withNav = createElement(SsrNavigationProvider, null, element);
133
+
134
+ // 2. TimberNuqsAdapter equivalent (wraps withNuqsSsrAdapter for the actual nuqs provider)
135
+ // eslint-disable-next-line react/no-children-prop -- createElement API
136
+ const withNuqs = createElement(SsrNuqsWrapper, { searchParams, children: withNav });
137
+
138
+ // 3. Outermost: NavigationRoot equivalent (PendingNavigationProvider + TopLoader)
139
+ // eslint-disable-next-line react/no-children-prop -- createElement API
140
+ return createElement(SsrNavigationRoot, { hasTopLoader, children: withNuqs });
141
+ }