@timber-js/app 0.2.0-alpha.1 → 0.2.0-alpha.100

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 (742) hide show
  1. package/LICENSE +8 -0
  2. package/dist/_chunks/actions-CQ8Z8VGL.js +1061 -0
  3. package/dist/_chunks/actions-CQ8Z8VGL.js.map +1 -0
  4. package/dist/_chunks/build-output-helper-DXnW0qjz.js +61 -0
  5. package/dist/_chunks/build-output-helper-DXnW0qjz.js.map +1 -0
  6. package/dist/_chunks/chunk-BYIpzuS7.js +39 -0
  7. package/dist/_chunks/define-B-Q_UMOD.js +195 -0
  8. package/dist/_chunks/define-B-Q_UMOD.js.map +1 -0
  9. package/dist/_chunks/define-CfBPoJb0.js +123 -0
  10. package/dist/_chunks/define-CfBPoJb0.js.map +1 -0
  11. package/dist/_chunks/define-cookie-BjpIt4UC.js +194 -0
  12. package/dist/_chunks/define-cookie-BjpIt4UC.js.map +1 -0
  13. package/dist/_chunks/format-Bcn-Iv1x.js +14 -0
  14. package/dist/_chunks/format-Bcn-Iv1x.js.map +1 -0
  15. package/dist/_chunks/handler-store-B-lqaGyh.js +54 -0
  16. package/dist/_chunks/handler-store-B-lqaGyh.js.map +1 -0
  17. package/dist/_chunks/logger-0m8MsKdc.js +291 -0
  18. package/dist/_chunks/logger-0m8MsKdc.js.map +1 -0
  19. package/dist/_chunks/merge-search-params-BphMdht_.js +122 -0
  20. package/dist/_chunks/merge-search-params-BphMdht_.js.map +1 -0
  21. package/dist/_chunks/{metadata-routes-CQCnF4VK.js → metadata-routes-BU684ls2.js} +1 -1
  22. package/dist/_chunks/{metadata-routes-CQCnF4VK.js.map → metadata-routes-BU684ls2.js.map} +1 -1
  23. package/dist/_chunks/navigation-root-BCYczjml.js +96 -0
  24. package/dist/_chunks/navigation-root-BCYczjml.js.map +1 -0
  25. package/dist/_chunks/registry-I2ss-lvy.js +20 -0
  26. package/dist/_chunks/registry-I2ss-lvy.js.map +1 -0
  27. package/dist/_chunks/router-ref-h3-UaCQv.js +28 -0
  28. package/dist/_chunks/router-ref-h3-UaCQv.js.map +1 -0
  29. package/dist/_chunks/schema-bridge-Cxu4l-7p.js +86 -0
  30. package/dist/_chunks/schema-bridge-Cxu4l-7p.js.map +1 -0
  31. package/dist/_chunks/segment-classify-BjfuctV2.js +137 -0
  32. package/dist/_chunks/segment-classify-BjfuctV2.js.map +1 -0
  33. package/dist/_chunks/segment-context-Dx_OizxD.js +34 -0
  34. package/dist/_chunks/segment-context-Dx_OizxD.js.map +1 -0
  35. package/dist/_chunks/{ssr-data-DLnbYpj1.js → ssr-data-B4CdH7rE.js} +1 -1
  36. package/dist/_chunks/ssr-data-B4CdH7rE.js.map +1 -0
  37. package/dist/_chunks/stale-reload-Bab885FO.js +64 -0
  38. package/dist/_chunks/stale-reload-Bab885FO.js.map +1 -0
  39. package/dist/_chunks/tracing-C8V-YGsP.js +329 -0
  40. package/dist/_chunks/tracing-C8V-YGsP.js.map +1 -0
  41. package/dist/_chunks/{use-query-states-DAhgj8Gx.js → use-query-states-B2XTqxDR.js} +7 -20
  42. package/dist/_chunks/use-query-states-B2XTqxDR.js.map +1 -0
  43. package/dist/_chunks/use-segment-params-BkpKAQ7D.js +185 -0
  44. package/dist/_chunks/use-segment-params-BkpKAQ7D.js.map +1 -0
  45. package/dist/_chunks/walkers-Tg0Alwcg.js +850 -0
  46. package/dist/_chunks/walkers-Tg0Alwcg.js.map +1 -0
  47. package/dist/_chunks/{format-DNt20Kt8.js → warnings-Cg47l5sk.js} +7 -45
  48. package/dist/_chunks/warnings-Cg47l5sk.js.map +1 -0
  49. package/dist/adapters/build-output-helper.d.ts +28 -0
  50. package/dist/adapters/build-output-helper.d.ts.map +1 -0
  51. package/dist/adapters/cloudflare-dev.d.ts +109 -0
  52. package/dist/adapters/cloudflare-dev.d.ts.map +1 -0
  53. package/dist/adapters/cloudflare-dev.js +73 -0
  54. package/dist/adapters/cloudflare-dev.js.map +1 -0
  55. package/dist/adapters/cloudflare-kv-cache.d.ts +64 -0
  56. package/dist/adapters/cloudflare-kv-cache.d.ts.map +1 -0
  57. package/dist/adapters/cloudflare-kv-cache.js +95 -0
  58. package/dist/adapters/cloudflare-kv-cache.js.map +1 -0
  59. package/dist/adapters/cloudflare.d.ts +148 -12
  60. package/dist/adapters/cloudflare.d.ts.map +1 -1
  61. package/dist/adapters/cloudflare.js +142 -38
  62. package/dist/adapters/cloudflare.js.map +1 -1
  63. package/dist/adapters/compress-module.d.ts.map +1 -1
  64. package/dist/adapters/nitro.d.ts +17 -1
  65. package/dist/adapters/nitro.d.ts.map +1 -1
  66. package/dist/adapters/nitro.js +143 -45
  67. package/dist/adapters/nitro.js.map +1 -1
  68. package/dist/adapters/shared.d.ts +16 -0
  69. package/dist/adapters/shared.d.ts.map +1 -0
  70. package/dist/cache/cache-api.d.ts +24 -0
  71. package/dist/cache/cache-api.d.ts.map +1 -0
  72. package/dist/cache/fast-hash.d.ts +22 -0
  73. package/dist/cache/fast-hash.d.ts.map +1 -0
  74. package/dist/cache/handler-store.d.ts +31 -0
  75. package/dist/cache/handler-store.d.ts.map +1 -0
  76. package/dist/cache/index.d.ts +23 -7
  77. package/dist/cache/index.d.ts.map +1 -1
  78. package/dist/cache/index.js +195 -84
  79. package/dist/cache/index.js.map +1 -1
  80. package/dist/cache/singleflight.d.ts +18 -1
  81. package/dist/cache/singleflight.d.ts.map +1 -1
  82. package/dist/cache/sizeof.d.ts +22 -0
  83. package/dist/cache/sizeof.d.ts.map +1 -0
  84. package/dist/cache/timber-cache.d.ts +1 -1
  85. package/dist/cache/timber-cache.d.ts.map +1 -1
  86. package/dist/cli.d.ts +6 -1
  87. package/dist/cli.d.ts.map +1 -1
  88. package/dist/cli.js +8 -3
  89. package/dist/cli.js.map +1 -1
  90. package/dist/client/browser-dev.d.ts +34 -1
  91. package/dist/client/browser-dev.d.ts.map +1 -1
  92. package/dist/client/browser-entry/action-dispatch.d.ts +17 -0
  93. package/dist/client/browser-entry/action-dispatch.d.ts.map +1 -0
  94. package/dist/client/browser-entry/hmr.d.ts +21 -0
  95. package/dist/client/browser-entry/hmr.d.ts.map +1 -0
  96. package/dist/client/browser-entry/hydrate.d.ts +46 -0
  97. package/dist/client/browser-entry/hydrate.d.ts.map +1 -0
  98. package/dist/client/browser-entry/index.d.ts +30 -0
  99. package/dist/client/browser-entry/index.d.ts.map +1 -0
  100. package/dist/client/browser-entry/post-hydration.d.ts +26 -0
  101. package/dist/client/browser-entry/post-hydration.d.ts.map +1 -0
  102. package/dist/client/browser-entry/router-init.d.ts +23 -0
  103. package/dist/client/browser-entry/router-init.d.ts.map +1 -0
  104. package/dist/client/browser-entry/rsc-stream.d.ts +24 -0
  105. package/dist/client/browser-entry/rsc-stream.d.ts.map +1 -0
  106. package/dist/client/browser-entry/scroll.d.ts +19 -0
  107. package/dist/client/browser-entry/scroll.d.ts.map +1 -0
  108. package/dist/client/error-boundary.d.ts +12 -5
  109. package/dist/client/error-boundary.d.ts.map +1 -1
  110. package/dist/client/error-boundary.js +26 -5
  111. package/dist/client/error-boundary.js.map +1 -1
  112. package/dist/client/error-reconstituter.d.ts +54 -0
  113. package/dist/client/error-reconstituter.d.ts.map +1 -0
  114. package/dist/client/form.d.ts +16 -27
  115. package/dist/client/form.d.ts.map +1 -1
  116. package/dist/client/history.d.ts +19 -4
  117. package/dist/client/history.d.ts.map +1 -1
  118. package/dist/client/index.d.ts +9 -24
  119. package/dist/client/index.d.ts.map +1 -1
  120. package/dist/client/index.js +312 -1109
  121. package/dist/client/index.js.map +1 -1
  122. package/dist/client/internal.d.ts +19 -0
  123. package/dist/client/internal.d.ts.map +1 -0
  124. package/dist/client/internal.js +964 -0
  125. package/dist/client/internal.js.map +1 -0
  126. package/dist/client/link-pending-store.d.ts +63 -0
  127. package/dist/client/link-pending-store.d.ts.map +1 -0
  128. package/dist/client/link.d.ts +73 -63
  129. package/dist/client/link.d.ts.map +1 -1
  130. package/dist/client/nav-link-store.d.ts +36 -0
  131. package/dist/client/nav-link-store.d.ts.map +1 -0
  132. package/dist/client/navigation-api-types.d.ts +90 -0
  133. package/dist/client/navigation-api-types.d.ts.map +1 -0
  134. package/dist/client/navigation-api.d.ts +115 -0
  135. package/dist/client/navigation-api.d.ts.map +1 -0
  136. package/dist/client/navigation-context.d.ts +22 -5
  137. package/dist/client/navigation-context.d.ts.map +1 -1
  138. package/dist/client/{transition-root.d.ts → navigation-root.d.ts} +42 -8
  139. package/dist/client/navigation-root.d.ts.map +1 -0
  140. package/dist/client/nuqs-adapter.d.ts.map +1 -1
  141. package/dist/client/router-ref.d.ts +1 -1
  142. package/dist/client/router.d.ts +70 -4
  143. package/dist/client/router.d.ts.map +1 -1
  144. package/dist/client/rsc-fetch.d.ts +38 -3
  145. package/dist/client/rsc-fetch.d.ts.map +1 -1
  146. package/dist/client/segment-cache.d.ts +1 -1
  147. package/dist/client/segment-cache.d.ts.map +1 -1
  148. package/dist/client/segment-context.d.ts +1 -1
  149. package/dist/client/segment-context.d.ts.map +1 -1
  150. package/dist/client/segment-merger.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 +8 -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} +7 -5
  170. package/dist/client/use-segment-params.d.ts.map +1 -0
  171. package/dist/codec.d.ts +33 -0
  172. package/dist/codec.d.ts.map +1 -0
  173. package/dist/codec.js +2 -0
  174. package/dist/config-types.d.ts +294 -0
  175. package/dist/config-types.d.ts.map +1 -0
  176. package/dist/config-validation.d.ts +51 -0
  177. package/dist/config-validation.d.ts.map +1 -0
  178. package/dist/content/index.d.ts +1 -10
  179. package/dist/content/index.d.ts.map +1 -1
  180. package/dist/content/index.js +0 -2
  181. package/dist/cookies/define-cookie.d.ts +98 -25
  182. package/dist/cookies/define-cookie.d.ts.map +1 -1
  183. package/dist/cookies/index.d.ts +2 -1
  184. package/dist/cookies/index.d.ts.map +1 -1
  185. package/dist/cookies/index.js +36 -72
  186. package/dist/cookies/index.js.map +1 -1
  187. package/dist/cookies/json-cookie.d.ts +64 -0
  188. package/dist/cookies/json-cookie.d.ts.map +1 -0
  189. package/dist/cookies/validation.d.ts +46 -0
  190. package/dist/cookies/validation.d.ts.map +1 -0
  191. package/dist/dev-tools/404-page.d.ts +46 -0
  192. package/dist/dev-tools/404-page.d.ts.map +1 -0
  193. package/dist/dev-tools/browser-logs.d.ts +84 -0
  194. package/dist/dev-tools/browser-logs.d.ts.map +1 -0
  195. package/dist/dev-tools/error-page.d.ts +58 -0
  196. package/dist/dev-tools/error-page.d.ts.map +1 -0
  197. package/dist/dev-tools/holding-server.d.ts +54 -0
  198. package/dist/dev-tools/holding-server.d.ts.map +1 -0
  199. package/dist/dev-tools/index.d.ts +31 -0
  200. package/dist/dev-tools/index.d.ts.map +1 -0
  201. package/dist/{server/dev-span-processor.d.ts → dev-tools/instrumentation.d.ts} +26 -6
  202. package/dist/dev-tools/instrumentation.d.ts.map +1 -0
  203. package/dist/{server/dev-logger.d.ts → dev-tools/logger.d.ts} +1 -1
  204. package/dist/dev-tools/logger.d.ts.map +1 -0
  205. package/dist/{plugins/dev-logs.d.ts → dev-tools/logs.d.ts} +2 -2
  206. package/dist/dev-tools/logs.d.ts.map +1 -0
  207. package/dist/dev-tools/overlay.d.ts +91 -0
  208. package/dist/dev-tools/overlay.d.ts.map +1 -0
  209. package/dist/dev-tools/stack-classifier.d.ts +34 -0
  210. package/dist/dev-tools/stack-classifier.d.ts.map +1 -0
  211. package/dist/dev-tools/terminal.d.ts +28 -0
  212. package/dist/dev-tools/terminal.d.ts.map +1 -0
  213. package/dist/{server/dev-warnings.d.ts → dev-tools/warnings.d.ts} +2 -22
  214. package/dist/dev-tools/warnings.d.ts.map +1 -0
  215. package/dist/fonts/bundle.d.ts +48 -0
  216. package/dist/fonts/bundle.d.ts.map +1 -0
  217. package/dist/fonts/css.d.ts +1 -0
  218. package/dist/fonts/css.d.ts.map +1 -1
  219. package/dist/fonts/dev-middleware.d.ts +22 -0
  220. package/dist/fonts/dev-middleware.d.ts.map +1 -0
  221. package/dist/fonts/local.d.ts +4 -2
  222. package/dist/fonts/local.d.ts.map +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 +64 -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 +103 -0
  230. package/dist/fonts/virtual-modules.d.ts.map +1 -0
  231. package/dist/index.d.ts +46 -152
  232. package/dist/index.d.ts.map +1 -1
  233. package/dist/index.js +14702 -12350
  234. package/dist/index.js.map +1 -1
  235. package/dist/plugin-context.d.ts +107 -0
  236. package/dist/plugin-context.d.ts.map +1 -0
  237. package/dist/plugins/adapter-build.d.ts +1 -1
  238. package/dist/plugins/adapter-build.d.ts.map +1 -1
  239. package/dist/plugins/build-manifest.d.ts +2 -2
  240. package/dist/plugins/build-manifest.d.ts.map +1 -1
  241. package/dist/plugins/build-report.d.ts +16 -4
  242. package/dist/plugins/build-report.d.ts.map +1 -1
  243. package/dist/plugins/chunks.d.ts +9 -1
  244. package/dist/plugins/chunks.d.ts.map +1 -1
  245. package/dist/plugins/client-chunks.d.ts +32 -0
  246. package/dist/plugins/client-chunks.d.ts.map +1 -0
  247. package/dist/plugins/content.d.ts +1 -1
  248. package/dist/plugins/content.d.ts.map +1 -1
  249. package/dist/plugins/dev-server.d.ts +1 -1
  250. package/dist/plugins/dev-server.d.ts.map +1 -1
  251. package/dist/plugins/entries.d.ts +8 -1
  252. package/dist/plugins/entries.d.ts.map +1 -1
  253. package/dist/plugins/fonts.d.ts +17 -65
  254. package/dist/plugins/fonts.d.ts.map +1 -1
  255. package/dist/plugins/mdx.d.ts +7 -1
  256. package/dist/plugins/mdx.d.ts.map +1 -1
  257. package/dist/plugins/routing.d.ts +1 -1
  258. package/dist/plugins/routing.d.ts.map +1 -1
  259. package/dist/plugins/server-bundle.d.ts.map +1 -1
  260. package/dist/plugins/shims.d.ts +6 -5
  261. package/dist/plugins/shims.d.ts.map +1 -1
  262. package/dist/plugins/static-build.d.ts +4 -4
  263. package/dist/plugins/static-build.d.ts.map +1 -1
  264. package/dist/routing/codegen-shared.d.ts +55 -0
  265. package/dist/routing/codegen-shared.d.ts.map +1 -0
  266. package/dist/routing/codegen-types.d.ts +52 -0
  267. package/dist/routing/codegen-types.d.ts.map +1 -0
  268. package/dist/routing/codegen.d.ts +2 -2
  269. package/dist/routing/codegen.d.ts.map +1 -1
  270. package/dist/routing/convention-lint.d.ts +41 -0
  271. package/dist/routing/convention-lint.d.ts.map +1 -0
  272. package/dist/routing/index.d.ts +5 -1
  273. package/dist/routing/index.d.ts.map +1 -1
  274. package/dist/routing/index.js +3 -2
  275. package/dist/routing/link-codegen.d.ts +90 -0
  276. package/dist/routing/link-codegen.d.ts.map +1 -0
  277. package/dist/routing/scanner.d.ts +1 -10
  278. package/dist/routing/scanner.d.ts.map +1 -1
  279. package/dist/routing/segment-classify.d.ts +75 -0
  280. package/dist/routing/segment-classify.d.ts.map +1 -0
  281. package/dist/routing/status-file-lint.d.ts +2 -1
  282. package/dist/routing/status-file-lint.d.ts.map +1 -1
  283. package/dist/routing/types.d.ts +77 -25
  284. package/dist/routing/types.d.ts.map +1 -1
  285. package/dist/routing/walkers.d.ts +51 -0
  286. package/dist/routing/walkers.d.ts.map +1 -0
  287. package/dist/rsc-runtime/rsc.d.ts +1 -1
  288. package/dist/rsc-runtime/rsc.d.ts.map +1 -1
  289. package/dist/rsc-runtime/ssr.d.ts +12 -0
  290. package/dist/rsc-runtime/ssr.d.ts.map +1 -1
  291. package/dist/schema-bridge.d.ts +76 -0
  292. package/dist/schema-bridge.d.ts.map +1 -0
  293. package/dist/search-params/define.d.ts +157 -0
  294. package/dist/search-params/define.d.ts.map +1 -0
  295. package/dist/search-params/index.d.ts +4 -7
  296. package/dist/search-params/index.d.ts.map +1 -1
  297. package/dist/search-params/index.js +34 -441
  298. package/dist/search-params/index.js.map +1 -1
  299. package/dist/search-params/registry.d.ts +2 -2
  300. package/dist/search-params/registry.d.ts.map +1 -1
  301. package/dist/search-params/wrappers.d.ts +53 -0
  302. package/dist/search-params/wrappers.d.ts.map +1 -0
  303. package/dist/segment-params/define.d.ts +95 -0
  304. package/dist/segment-params/define.d.ts.map +1 -0
  305. package/dist/segment-params/index.d.ts +3 -0
  306. package/dist/segment-params/index.d.ts.map +1 -0
  307. package/dist/segment-params/index.js +2 -0
  308. package/dist/server/access-gate.d.ts +8 -3
  309. package/dist/server/access-gate.d.ts.map +1 -1
  310. package/dist/server/action-client.d.ts +41 -6
  311. package/dist/server/action-client.d.ts.map +1 -1
  312. package/dist/server/action-encryption.d.ts +76 -0
  313. package/dist/server/action-encryption.d.ts.map +1 -0
  314. package/dist/server/action-handler.d.ts +35 -1
  315. package/dist/server/action-handler.d.ts.map +1 -1
  316. package/dist/server/actions.d.ts +3 -6
  317. package/dist/server/actions.d.ts.map +1 -1
  318. package/dist/server/als-registry.d.ts +33 -5
  319. package/dist/server/als-registry.d.ts.map +1 -1
  320. package/dist/server/asset-headers.d.ts +1 -15
  321. package/dist/server/asset-headers.d.ts.map +1 -1
  322. package/dist/server/build-manifest.d.ts +2 -2
  323. package/dist/server/build-manifest.d.ts.map +1 -1
  324. package/dist/server/cookie-context.d.ts +170 -0
  325. package/dist/server/cookie-context.d.ts.map +1 -0
  326. package/dist/server/cookie-parsing.d.ts +51 -0
  327. package/dist/server/cookie-parsing.d.ts.map +1 -0
  328. package/dist/server/debug.d.ts +82 -0
  329. package/dist/server/debug.d.ts.map +1 -0
  330. package/dist/server/default-logger.d.ts +22 -0
  331. package/dist/server/default-logger.d.ts.map +1 -0
  332. package/dist/server/deny-boundary.d.ts +90 -0
  333. package/dist/server/deny-boundary.d.ts.map +1 -0
  334. package/dist/server/deny-renderer.d.ts.map +1 -1
  335. package/dist/server/dev-source-map.d.ts +22 -0
  336. package/dist/server/dev-source-map.d.ts.map +1 -0
  337. package/dist/server/early-hints-sender.d.ts.map +1 -1
  338. package/dist/server/early-hints.d.ts +13 -5
  339. package/dist/server/early-hints.d.ts.map +1 -1
  340. package/dist/server/error-boundary-wrapper.d.ts +7 -1
  341. package/dist/server/error-boundary-wrapper.d.ts.map +1 -1
  342. package/dist/server/fallback-error.d.ts +12 -7
  343. package/dist/server/fallback-error.d.ts.map +1 -1
  344. package/dist/server/flight-injection-state.d.ts +66 -0
  345. package/dist/server/flight-injection-state.d.ts.map +1 -0
  346. package/dist/server/flight-scripts.d.ts +42 -0
  347. package/dist/server/flight-scripts.d.ts.map +1 -0
  348. package/dist/server/flush.d.ts.map +1 -1
  349. package/dist/server/form-data.d.ts +29 -0
  350. package/dist/server/form-data.d.ts.map +1 -1
  351. package/dist/server/html-injector-core.d.ts +212 -0
  352. package/dist/server/html-injector-core.d.ts.map +1 -0
  353. package/dist/server/html-injectors.d.ts +81 -41
  354. package/dist/server/html-injectors.d.ts.map +1 -1
  355. package/dist/server/index.d.ts +9 -46
  356. package/dist/server/index.d.ts.map +1 -1
  357. package/dist/server/index.js +158 -2899
  358. package/dist/server/index.js.map +1 -1
  359. package/dist/server/internal.d.ts +48 -0
  360. package/dist/server/internal.d.ts.map +1 -0
  361. package/dist/server/internal.js +2900 -0
  362. package/dist/server/internal.js.map +1 -0
  363. package/dist/server/logger.d.ts +39 -7
  364. package/dist/server/logger.d.ts.map +1 -1
  365. package/dist/server/middleware-runner.d.ts +36 -4
  366. package/dist/server/middleware-runner.d.ts.map +1 -1
  367. package/dist/server/node-stream-transforms.d.ts +110 -0
  368. package/dist/server/node-stream-transforms.d.ts.map +1 -0
  369. package/dist/server/param-coercion.d.ts +26 -0
  370. package/dist/server/param-coercion.d.ts.map +1 -0
  371. package/dist/server/pipeline-helpers.d.ts +95 -0
  372. package/dist/server/pipeline-helpers.d.ts.map +1 -0
  373. package/dist/server/pipeline-interception.d.ts +1 -1
  374. package/dist/server/pipeline-interception.d.ts.map +1 -1
  375. package/dist/server/pipeline-metadata.d.ts +6 -0
  376. package/dist/server/pipeline-metadata.d.ts.map +1 -1
  377. package/dist/server/pipeline-outcome.d.ts +49 -0
  378. package/dist/server/pipeline-outcome.d.ts.map +1 -0
  379. package/dist/server/pipeline-phases.d.ts +52 -0
  380. package/dist/server/pipeline-phases.d.ts.map +1 -0
  381. package/dist/server/pipeline.d.ts +93 -23
  382. package/dist/server/pipeline.d.ts.map +1 -1
  383. package/dist/server/port-resolution.d.ts +117 -0
  384. package/dist/server/port-resolution.d.ts.map +1 -0
  385. package/dist/server/primitives.d.ts +69 -18
  386. package/dist/server/primitives.d.ts.map +1 -1
  387. package/dist/server/render-timeout.d.ts +51 -0
  388. package/dist/server/render-timeout.d.ts.map +1 -0
  389. package/dist/server/request-context.d.ts +41 -109
  390. package/dist/server/request-context.d.ts.map +1 -1
  391. package/dist/server/route-element-builder.d.ts +27 -1
  392. package/dist/server/route-element-builder.d.ts.map +1 -1
  393. package/dist/server/route-handler.d.ts.map +1 -1
  394. package/dist/server/route-matcher.d.ts +21 -34
  395. package/dist/server/route-matcher.d.ts.map +1 -1
  396. package/dist/server/rsc-entry/action-middleware-runner.d.ts +66 -0
  397. package/dist/server/rsc-entry/action-middleware-runner.d.ts.map +1 -0
  398. package/dist/server/rsc-entry/api-handler.d.ts +2 -2
  399. package/dist/server/rsc-entry/api-handler.d.ts.map +1 -1
  400. package/dist/server/rsc-entry/error-renderer.d.ts +26 -13
  401. package/dist/server/rsc-entry/error-renderer.d.ts.map +1 -1
  402. package/dist/server/rsc-entry/helpers.d.ts +49 -6
  403. package/dist/server/rsc-entry/helpers.d.ts.map +1 -1
  404. package/dist/server/rsc-entry/index.d.ts +20 -3
  405. package/dist/server/rsc-entry/index.d.ts.map +1 -1
  406. package/dist/server/rsc-entry/render-route.d.ts +50 -0
  407. package/dist/server/rsc-entry/render-route.d.ts.map +1 -0
  408. package/dist/server/rsc-entry/rsc-payload.d.ts +3 -3
  409. package/dist/server/rsc-entry/rsc-payload.d.ts.map +1 -1
  410. package/dist/server/rsc-entry/rsc-stream.d.ts +20 -1
  411. package/dist/server/rsc-entry/rsc-stream.d.ts.map +1 -1
  412. package/dist/server/rsc-entry/ssr-bridge.d.ts +1 -1
  413. package/dist/server/rsc-entry/ssr-bridge.d.ts.map +1 -1
  414. package/dist/server/rsc-entry/ssr-renderer.d.ts +19 -4
  415. package/dist/server/rsc-entry/ssr-renderer.d.ts.map +1 -1
  416. package/dist/server/rsc-entry/wrap-action-dispatch.d.ts +119 -0
  417. package/dist/server/rsc-entry/wrap-action-dispatch.d.ts.map +1 -0
  418. package/dist/server/rsc-prop-warnings.d.ts.map +1 -1
  419. package/dist/server/safe-load.d.ts +46 -0
  420. package/dist/server/safe-load.d.ts.map +1 -0
  421. package/dist/server/sensitive-fields.d.ts +74 -0
  422. package/dist/server/sensitive-fields.d.ts.map +1 -0
  423. package/dist/server/sitemap-generator.d.ts +129 -0
  424. package/dist/server/sitemap-generator.d.ts.map +1 -0
  425. package/dist/server/sitemap-handler.d.ts +22 -0
  426. package/dist/server/sitemap-handler.d.ts.map +1 -0
  427. package/dist/server/slot-resolver.d.ts +1 -1
  428. package/dist/server/slot-resolver.d.ts.map +1 -1
  429. package/dist/server/ssr-entry.d.ts +23 -0
  430. package/dist/server/ssr-entry.d.ts.map +1 -1
  431. package/dist/server/ssr-render.d.ts +39 -21
  432. package/dist/server/ssr-render.d.ts.map +1 -1
  433. package/dist/server/ssr-wrappers.d.ts +50 -0
  434. package/dist/server/ssr-wrappers.d.ts.map +1 -0
  435. package/dist/server/state-tree-diff.d.ts.map +1 -1
  436. package/dist/server/status-code-resolver.d.ts +16 -11
  437. package/dist/server/status-code-resolver.d.ts.map +1 -1
  438. package/dist/server/stream-utils.d.ts +36 -0
  439. package/dist/server/stream-utils.d.ts.map +1 -0
  440. package/dist/server/tracing.d.ts +15 -5
  441. package/dist/server/tracing.d.ts.map +1 -1
  442. package/dist/server/tree-builder.d.ts +62 -30
  443. package/dist/server/tree-builder.d.ts.map +1 -1
  444. package/dist/server/types.d.ts +49 -4
  445. package/dist/server/types.d.ts.map +1 -1
  446. package/dist/server/utils/escape-html.d.ts +14 -0
  447. package/dist/server/utils/escape-html.d.ts.map +1 -0
  448. package/dist/server/version-skew.d.ts +61 -0
  449. package/dist/server/version-skew.d.ts.map +1 -0
  450. package/dist/server/waituntil-bridge.d.ts.map +1 -1
  451. package/dist/shared/merge-search-params.d.ts +22 -0
  452. package/dist/shared/merge-search-params.d.ts.map +1 -0
  453. package/dist/shims/font-google.d.ts +1 -1
  454. package/dist/shims/font-google.d.ts.map +1 -1
  455. package/dist/shims/font-google.js +42 -0
  456. package/dist/shims/font-google.js.map +1 -0
  457. package/dist/shims/font-local.d.ts +26 -0
  458. package/dist/shims/font-local.d.ts.map +1 -0
  459. package/dist/shims/font-local.js +20 -0
  460. package/dist/shims/font-local.js.map +1 -0
  461. package/dist/shims/headers.d.ts +2 -1
  462. package/dist/shims/headers.d.ts.map +1 -1
  463. package/dist/shims/navigation-client.d.ts +3 -1
  464. package/dist/shims/navigation-client.d.ts.map +1 -1
  465. package/dist/shims/navigation.d.ts +11 -5
  466. package/dist/shims/navigation.d.ts.map +1 -1
  467. package/dist/utils/directive-parser.d.ts +1 -43
  468. package/dist/utils/directive-parser.d.ts.map +1 -1
  469. package/dist/utils/state-machine.d.ts +80 -0
  470. package/dist/utils/state-machine.d.ts.map +1 -0
  471. package/package.json +56 -22
  472. package/src/adapters/build-output-helper.ts +77 -0
  473. package/src/adapters/cloudflare-dev.ts +177 -0
  474. package/src/adapters/cloudflare-kv-cache.ts +142 -0
  475. package/src/adapters/cloudflare.ts +350 -76
  476. package/src/adapters/compress-module.ts +24 -4
  477. package/src/adapters/nitro.ts +148 -60
  478. package/src/adapters/shared.ts +40 -0
  479. package/src/adapters/wrangler.d.ts +7 -0
  480. package/src/cache/cache-api.ts +38 -0
  481. package/src/cache/fast-hash.ts +34 -0
  482. package/src/cache/handler-store.ts +68 -0
  483. package/src/cache/index.ts +81 -18
  484. package/src/cache/singleflight.ts +62 -4
  485. package/src/cache/sizeof.ts +31 -0
  486. package/src/cache/timber-cache.ts +41 -29
  487. package/src/cli.ts +16 -6
  488. package/src/client/browser-dev.ts +153 -1
  489. package/src/client/browser-entry/action-dispatch.ts +116 -0
  490. package/src/client/browser-entry/hmr.ts +81 -0
  491. package/src/client/browser-entry/hydrate.ts +145 -0
  492. package/src/client/browser-entry/index.ts +143 -0
  493. package/src/client/browser-entry/post-hydration.ts +119 -0
  494. package/src/client/browser-entry/router-init.ts +193 -0
  495. package/src/client/browser-entry/rsc-stream.ts +157 -0
  496. package/src/client/browser-entry/scroll.ts +27 -0
  497. package/src/client/error-boundary.tsx +97 -20
  498. package/src/client/error-reconstituter.tsx +65 -0
  499. package/src/client/form.tsx +31 -32
  500. package/src/client/history.ts +26 -4
  501. package/src/client/index.ts +77 -43
  502. package/src/client/internal.ts +58 -0
  503. package/src/client/link-pending-store.ts +111 -0
  504. package/src/client/link.tsx +432 -140
  505. package/src/client/nav-link-store.ts +47 -0
  506. package/src/client/navigation-api-types.ts +112 -0
  507. package/src/client/navigation-api.ts +332 -0
  508. package/src/client/navigation-context.ts +83 -18
  509. package/src/client/navigation-root.tsx +342 -0
  510. package/src/client/nuqs-adapter.tsx +16 -3
  511. package/src/client/router-ref.ts +1 -1
  512. package/src/client/router.ts +303 -78
  513. package/src/client/rsc-fetch.ts +112 -8
  514. package/src/client/segment-cache.ts +1 -1
  515. package/src/client/segment-context.ts +6 -1
  516. package/src/client/segment-merger.ts +2 -8
  517. package/src/client/segment-outlet.tsx +86 -0
  518. package/src/client/ssr-data.ts +13 -5
  519. package/src/client/stale-reload.ts +74 -7
  520. package/src/client/state.ts +2 -2
  521. package/src/client/top-loader.tsx +41 -25
  522. package/src/client/use-cookie.ts +29 -0
  523. package/src/client/use-link-status.ts +7 -7
  524. package/src/client/{use-navigation-pending.ts → use-pending-navigation.ts} +6 -6
  525. package/src/client/use-query-states.ts +9 -3
  526. package/src/client/use-router.ts +1 -1
  527. package/src/client/{use-params.ts → use-segment-params.ts} +7 -5
  528. package/src/codec.ts +45 -0
  529. package/src/config-types.ts +292 -0
  530. package/src/config-validation.ts +303 -0
  531. package/src/content/index.ts +5 -13
  532. package/src/cookies/define-cookie.ts +301 -55
  533. package/src/cookies/index.ts +12 -1
  534. package/src/cookies/json-cookie.ts +105 -0
  535. package/src/cookies/validation.ts +134 -0
  536. package/src/dev-tools/404-page.ts +387 -0
  537. package/src/dev-tools/browser-logs.ts +288 -0
  538. package/src/dev-tools/error-page.ts +509 -0
  539. package/src/dev-tools/holding-server.ts +187 -0
  540. package/src/dev-tools/index.ts +90 -0
  541. package/src/dev-tools/instrumentation.ts +176 -0
  542. package/src/{plugins/dev-logs.ts → dev-tools/logs.ts} +3 -3
  543. package/src/dev-tools/overlay.ts +456 -0
  544. package/src/dev-tools/stack-classifier.ts +75 -0
  545. package/src/dev-tools/terminal.ts +183 -0
  546. package/src/{server/dev-warnings.ts → dev-tools/warnings.ts} +6 -50
  547. package/src/fonts/bundle.ts +142 -0
  548. package/src/fonts/css.ts +2 -1
  549. package/src/fonts/dev-middleware.ts +74 -0
  550. package/src/fonts/local.ts +7 -3
  551. package/src/fonts/pipeline.ts +314 -0
  552. package/src/fonts/transform.ts +406 -0
  553. package/src/fonts/types.ts +50 -1
  554. package/src/fonts/virtual-modules.ts +227 -0
  555. package/src/index.ts +376 -315
  556. package/src/plugin-context.ts +240 -0
  557. package/src/plugins/adapter-build.ts +12 -4
  558. package/src/plugins/build-manifest.ts +13 -2
  559. package/src/plugins/build-report.ts +32 -21
  560. package/src/plugins/chunks.ts +9 -1
  561. package/src/plugins/client-chunks.ts +65 -0
  562. package/src/plugins/content.ts +1 -1
  563. package/src/plugins/dev-server.ts +154 -21
  564. package/src/plugins/entries.ts +119 -12
  565. package/src/plugins/fonts.ts +177 -524
  566. package/src/plugins/mdx.ts +52 -15
  567. package/src/plugins/routing.ts +225 -41
  568. package/src/plugins/server-action-exports.ts +1 -1
  569. package/src/plugins/server-bundle.ts +36 -1
  570. package/src/plugins/shims.ts +136 -35
  571. package/src/plugins/static-build.ts +17 -11
  572. package/src/routing/codegen-shared.ts +98 -0
  573. package/src/routing/codegen-types.ts +53 -0
  574. package/src/routing/codegen.ts +143 -176
  575. package/src/routing/convention-lint.ts +357 -0
  576. package/src/routing/index.ts +5 -1
  577. package/src/routing/interception.ts +1 -1
  578. package/src/routing/link-codegen.ts +294 -0
  579. package/src/routing/scanner.ts +107 -110
  580. package/src/routing/segment-classify.ts +188 -0
  581. package/src/routing/status-file-lint.ts +10 -7
  582. package/src/routing/types.ts +78 -25
  583. package/src/routing/walkers.ts +90 -0
  584. package/src/rsc-runtime/rsc.ts +2 -0
  585. package/src/rsc-runtime/ssr.ts +50 -0
  586. package/src/rsc-runtime/vendor-types.d.ts +7 -0
  587. package/src/{search-params/codecs.ts → schema-bridge.ts} +57 -20
  588. package/src/search-params/define.ts +538 -0
  589. package/src/search-params/index.ts +14 -20
  590. package/src/search-params/registry.ts +2 -2
  591. package/src/search-params/wrappers.ts +92 -0
  592. package/src/segment-params/define.ts +332 -0
  593. package/src/segment-params/index.ts +9 -0
  594. package/src/server/access-gate.tsx +79 -36
  595. package/src/server/action-client.ts +103 -20
  596. package/src/server/action-encryption.ts +144 -0
  597. package/src/server/action-handler.ts +112 -14
  598. package/src/server/actions.ts +10 -9
  599. package/src/server/als-registry.ts +35 -7
  600. package/src/server/asset-headers.ts +8 -34
  601. package/src/server/build-manifest.ts +10 -4
  602. package/src/server/compress.ts +25 -7
  603. package/src/server/cookie-context.ts +468 -0
  604. package/src/server/cookie-parsing.ts +135 -0
  605. package/src/server/debug.ts +137 -0
  606. package/src/server/default-logger.ts +99 -0
  607. package/src/server/deny-boundary.ts +218 -0
  608. package/src/server/deny-renderer.ts +33 -51
  609. package/src/server/dev-source-map.ts +31 -0
  610. package/src/server/early-hints-sender.ts +3 -2
  611. package/src/server/early-hints.ts +36 -15
  612. package/src/server/error-boundary-wrapper.ts +74 -22
  613. package/src/server/fallback-error.ts +74 -102
  614. package/src/server/flight-injection-state.ts +113 -0
  615. package/src/server/flight-scripts.ts +62 -0
  616. package/src/server/flush.ts +2 -1
  617. package/src/server/form-data.ts +76 -0
  618. package/src/server/html-injector-core.ts +403 -0
  619. package/src/server/html-injectors.ts +244 -223
  620. package/src/server/index.ts +31 -184
  621. package/src/server/internal.ts +176 -0
  622. package/src/server/logger.ts +67 -35
  623. package/src/server/middleware-runner.ts +75 -4
  624. package/src/server/node-stream-transforms.ts +369 -0
  625. package/src/server/param-coercion.ts +76 -0
  626. package/src/server/pipeline-helpers.ts +204 -0
  627. package/src/server/pipeline-interception.ts +17 -16
  628. package/src/server/pipeline-metadata.ts +13 -0
  629. package/src/server/pipeline-outcome.ts +167 -0
  630. package/src/server/pipeline-phases.ts +409 -0
  631. package/src/server/pipeline.ts +128 -387
  632. package/src/server/port-resolution.ts +215 -0
  633. package/src/server/primitives.ts +113 -29
  634. package/src/server/render-timeout.ts +108 -0
  635. package/src/server/request-context.ts +94 -337
  636. package/src/server/route-element-builder.ts +289 -198
  637. package/src/server/route-handler.ts +24 -4
  638. package/src/server/route-matcher.ts +44 -65
  639. package/src/server/rsc-entry/action-middleware-runner.ts +167 -0
  640. package/src/server/rsc-entry/api-handler.ts +16 -17
  641. package/src/server/rsc-entry/error-renderer.ts +305 -89
  642. package/src/server/rsc-entry/helpers.ts +136 -12
  643. package/src/server/rsc-entry/index.ts +330 -312
  644. package/src/server/rsc-entry/render-route.ts +304 -0
  645. package/src/server/rsc-entry/rsc-payload.ts +100 -18
  646. package/src/server/rsc-entry/rsc-stream.ts +90 -17
  647. package/src/server/rsc-entry/ssr-bridge.ts +14 -5
  648. package/src/server/rsc-entry/ssr-renderer.ts +177 -37
  649. package/src/server/rsc-entry/wrap-action-dispatch.ts +449 -0
  650. package/src/server/rsc-prop-warnings.ts +3 -1
  651. package/src/server/safe-load.ts +60 -0
  652. package/src/server/sensitive-fields.ts +230 -0
  653. package/src/server/sitemap-generator.ts +338 -0
  654. package/src/server/sitemap-handler.ts +126 -0
  655. package/src/server/slot-resolver.ts +245 -230
  656. package/src/server/ssr-entry.ts +215 -32
  657. package/src/server/ssr-render.ts +289 -67
  658. package/src/server/ssr-wrappers.tsx +139 -0
  659. package/src/server/state-tree-diff.ts +4 -1
  660. package/src/server/status-code-resolver.ts +112 -128
  661. package/src/server/stream-utils.ts +213 -0
  662. package/src/server/tracing.ts +44 -10
  663. package/src/server/tree-builder.ts +202 -90
  664. package/src/server/types.ts +55 -6
  665. package/src/server/utils/escape-html.ts +20 -0
  666. package/src/server/version-skew.ts +104 -0
  667. package/src/server/waituntil-bridge.ts +4 -1
  668. package/src/shared/merge-search-params.ts +55 -0
  669. package/src/shims/font-google.ts +1 -1
  670. package/src/shims/font-local.ts +34 -0
  671. package/src/shims/headers.ts +5 -1
  672. package/src/shims/navigation-client.ts +4 -3
  673. package/src/shims/navigation.ts +14 -7
  674. package/src/utils/directive-parser.ts +1 -390
  675. package/src/utils/state-machine.ts +111 -0
  676. package/dist/_chunks/als-registry-k-AtAQ9R.js +0 -41
  677. package/dist/_chunks/als-registry-k-AtAQ9R.js.map +0 -1
  678. package/dist/_chunks/format-DNt20Kt8.js.map +0 -1
  679. package/dist/_chunks/interception-DGDIjDbR.js +0 -676
  680. package/dist/_chunks/interception-DGDIjDbR.js.map +0 -1
  681. package/dist/_chunks/request-context-CRj2Zh1E.js +0 -329
  682. package/dist/_chunks/request-context-CRj2Zh1E.js.map +0 -1
  683. package/dist/_chunks/ssr-data-DLnbYpj1.js.map +0 -1
  684. package/dist/_chunks/tracing-DF0G3FB7.js +0 -173
  685. package/dist/_chunks/tracing-DF0G3FB7.js.map +0 -1
  686. package/dist/_chunks/use-cookie-dDbpCTx-.js +0 -91
  687. package/dist/_chunks/use-cookie-dDbpCTx-.js.map +0 -1
  688. package/dist/_chunks/use-query-states-DAhgj8Gx.js.map +0 -1
  689. package/dist/cache/register-cached-function.d.ts +0 -17
  690. package/dist/cache/register-cached-function.d.ts.map +0 -1
  691. package/dist/client/browser-entry.d.ts +0 -22
  692. package/dist/client/browser-entry.d.ts.map +0 -1
  693. package/dist/client/browser-links.d.ts +0 -32
  694. package/dist/client/browser-links.d.ts.map +0 -1
  695. package/dist/client/link-navigate-interceptor.d.ts +0 -28
  696. package/dist/client/link-navigate-interceptor.d.ts.map +0 -1
  697. package/dist/client/link-status-provider.d.ts +0 -11
  698. package/dist/client/link-status-provider.d.ts.map +0 -1
  699. package/dist/client/transition-root.d.ts.map +0 -1
  700. package/dist/client/use-navigation-pending.d.ts.map +0 -1
  701. package/dist/client/use-params.d.ts.map +0 -1
  702. package/dist/plugins/cache-transform.d.ts +0 -36
  703. package/dist/plugins/cache-transform.d.ts.map +0 -1
  704. package/dist/plugins/dev-error-overlay.d.ts +0 -60
  705. package/dist/plugins/dev-error-overlay.d.ts.map +0 -1
  706. package/dist/plugins/dev-logs.d.ts.map +0 -1
  707. package/dist/plugins/dynamic-transform.d.ts +0 -72
  708. package/dist/plugins/dynamic-transform.d.ts.map +0 -1
  709. package/dist/search-params/analyze.d.ts +0 -54
  710. package/dist/search-params/analyze.d.ts.map +0 -1
  711. package/dist/search-params/builtin-codecs.d.ts +0 -105
  712. package/dist/search-params/builtin-codecs.d.ts.map +0 -1
  713. package/dist/search-params/codecs.d.ts +0 -53
  714. package/dist/search-params/codecs.d.ts.map +0 -1
  715. package/dist/search-params/create.d.ts +0 -106
  716. package/dist/search-params/create.d.ts.map +0 -1
  717. package/dist/server/dev-fetch-instrumentation.d.ts +0 -22
  718. package/dist/server/dev-fetch-instrumentation.d.ts.map +0 -1
  719. package/dist/server/dev-logger.d.ts.map +0 -1
  720. package/dist/server/dev-span-processor.d.ts.map +0 -1
  721. package/dist/server/dev-warnings.d.ts.map +0 -1
  722. package/dist/server/manifest-status-resolver.d.ts +0 -58
  723. package/dist/server/manifest-status-resolver.d.ts.map +0 -1
  724. package/dist/server/prerender.d.ts +0 -77
  725. package/dist/server/prerender.d.ts.map +0 -1
  726. package/src/cache/register-cached-function.ts +0 -99
  727. package/src/client/browser-entry.ts +0 -686
  728. package/src/client/browser-links.ts +0 -90
  729. package/src/client/link-navigate-interceptor.tsx +0 -62
  730. package/src/client/link-status-provider.tsx +0 -30
  731. package/src/client/transition-root.tsx +0 -160
  732. package/src/plugins/cache-transform.ts +0 -199
  733. package/src/plugins/dev-error-overlay.ts +0 -230
  734. package/src/plugins/dynamic-transform.ts +0 -161
  735. package/src/search-params/analyze.ts +0 -192
  736. package/src/search-params/builtin-codecs.ts +0 -228
  737. package/src/search-params/create.ts +0 -321
  738. package/src/server/dev-fetch-instrumentation.ts +0 -96
  739. package/src/server/dev-span-processor.ts +0 -78
  740. package/src/server/manifest-status-resolver.ts +0 -215
  741. package/src/server/prerender.ts +0 -139
  742. /package/src/{server/dev-logger.ts → dev-tools/logger.ts} +0 -0
@@ -17,71 +17,113 @@
17
17
 
18
18
  // @ts-expect-error — virtual module provided by timber-routing plugin
19
19
  import routeManifest from 'virtual:timber-route-manifest';
20
+ // TIM-830: Populate the search-params registry eagerly so <Link> can
21
+ // serialize flat `Partial<T>` values synchronously in RSC renders.
22
+ // The module has side effects only — no exports consumed here.
23
+ // @ts-expect-error — virtual module provided by timber-routing plugin
24
+ import 'virtual:timber-search-params-registry';
20
25
  // @ts-expect-error — virtual module provided by timber-entries plugin
21
26
  import config from 'virtual:timber-config';
22
27
  // @ts-expect-error — virtual module provided by timber-build-manifest plugin
23
28
  import buildManifest from 'virtual:timber-build-manifest';
24
29
  // @ts-expect-error — virtual module provided by timber-entries plugin
25
30
  import loadUserInstrumentation from 'virtual:timber-instrumentation';
26
-
27
- import type { FormRerender } from '#/server/action-handler.js';
28
- import { handleActionRequest, isActionRequest } from '#/server/action-handler.js';
29
- import type { BodyLimitsConfig } from '#/server/body-limits.js';
30
- import type { BuildManifest } from '#/server/build-manifest.js';
31
- import {
32
- buildCssLinkTags,
33
- buildFontPreloadTags,
34
- buildModulepreloadTags,
35
- collectRouteCss,
36
- collectRouteFonts,
37
- collectRouteModulepreloads,
38
- } from '#/server/build-manifest.js';
39
- import type { LayoutEntry } from '#/server/deny-renderer.js';
40
- import { renderDenyPage, renderDenyPageAsRsc } from '#/server/deny-renderer.js';
41
- import { resolveLogMode } from '#/server/dev-logger.js';
42
- import { sendEarlyHints103 } from '#/server/early-hints-sender.js';
43
- import { collectEarlyHintHeaders } from '#/server/early-hints.js';
44
- import { runWithFormFlash } from '#/server/form-flash.js';
45
- import type { ClientBootstrapConfig } from '#/server/html-injectors.js';
46
- import { buildClientScripts } from '#/server/html-injectors.js';
47
- import type { InterceptionContext, PipelineConfig, RouteMatch } from '#/server/pipeline.js';
48
- import { createPipeline } from '#/server/pipeline.js';
49
- import { DenySignal, RedirectSignal } from '#/server/primitives.js';
50
- import { buildRouteElement, RouteSignalWithContext } from '#/server/route-element-builder.js';
51
- import type { ManifestSegmentNode } from '#/server/route-matcher.js';
52
- import { createMetadataRouteMatcher, createRouteMatcher } from '#/server/route-matcher.js';
53
- import { initDevTracing } from '#/server/tracing.js';
54
-
55
- import { renderFallbackError as renderFallback } from '#/server/fallback-error.js';
56
- import { loadInstrumentation } from '#/server/instrumentation.js';
57
- import { handleApiRoute } from './api-handler.js';
58
- import { renderErrorPage, renderNoMatchPage } from './error-renderer.js';
31
+ // @ts-expect-error — virtual module provided by timber-entries plugin
32
+ import loadCacheHandler from 'virtual:timber-cache-handler';
33
+
34
+ import { wrapPipelineWithActionDispatch } from './wrap-action-dispatch.js';
35
+ import type { BodyLimitsConfig } from '../body-limits.js';
36
+ import type { BuildManifest } from '../build-manifest.js';
37
+ import type { LayoutEntry } from '../deny-renderer.js';
38
+ import { renderDenyPage, renderDenyPageAsRsc } from '../deny-renderer.js';
39
+ import { resolveLogMode } from '../../dev-tools/logger.js';
40
+ import { sendEarlyHints103 } from '../early-hints-sender.js';
41
+ import { collectEarlyHintHeaders } from '../early-hints.js';
42
+ import { buildClientScripts } from '../html-injectors.js';
43
+ import type { InterceptionContext, PipelineConfig, RouteMatch } from '../pipeline.js';
44
+ import { createPipeline } from '../pipeline.js';
45
+ import { coerceSegmentParams } from '../param-coercion.js';
46
+ import { setSegmentParams } from '../request-context.js';
47
+ import { buildRouteElement } from '../route-element-builder.js';
48
+ import type { ManifestSegmentNode } from '../route-matcher.js';
49
+ import { createMetadataRouteMatcher, createRouteMatcher } from '../route-matcher.js';
50
+ import { initDevTracing } from '../tracing.js';
51
+
52
+ import { renderFallbackError as renderFallback } from '../fallback-error.js';
53
+ import { loadInstrumentation } from '../instrumentation.js';
54
+ import { loadModule } from '../safe-load.js';
55
+ import { logRenderError } from '../logger.js';
56
+ import { renderNoMatchPage } from './error-renderer.js';
59
57
  import {
60
- buildRedirectResponse,
61
58
  createDebugChannelSink,
62
- escapeHtml,
63
59
  isRscPayloadRequest,
60
+ type DebugComponentEntry,
64
61
  } from './helpers.js';
65
- import { parseClientStateTree } from '#/server/state-tree-diff.js';
66
- import { buildRscPayloadResponse } from './rsc-payload.js';
67
- import { renderRscStream } from './rsc-stream.js';
68
- import { renderSsrResponse } from './ssr-renderer.js';
62
+ import { renderRoute } from './render-route.js';
69
63
  import { callSsr } from './ssr-bridge.js';
64
+ import { isDebug, isDevMode, setDebugFromConfig } from '../debug.js';
65
+ import { setSourceMapCallback } from '../dev-source-map.js';
66
+ import { requestContextAls } from '../als-registry.js';
67
+ import { createAutoSitemapHandler } from '../sitemap-handler.js';
68
+
69
+ /**
70
+ * Resolve the Server-Timing mode from timber.config.ts.
71
+ *
72
+ * If the user set `serverTiming` explicitly, use that value.
73
+ * Otherwise: `'detailed'` in dev, `'total'` in production.
74
+ */
75
+ function resolveServerTimingMode(
76
+ config: Record<string, unknown>,
77
+ isDev: boolean
78
+ ): 'detailed' | 'total' | false {
79
+ const userValue = config.serverTiming as 'detailed' | 'total' | false | undefined;
80
+ if (userValue !== undefined) return userValue;
81
+ return isDev ? 'detailed' : 'total';
82
+ }
70
83
 
71
84
  // Dev-only pipeline error handler, set by the dev server after import.
72
85
  // In production this is always undefined — no overhead.
73
- let _devPipelineErrorHandler: ((error: Error, phase: string) => void) | undefined;
86
+ // The third argument provides RSC debug component data (from the Flight
87
+ // debug channel) when available — used by the error overlay to show the
88
+ // server component tree context for render errors.
89
+ let _devPipelineErrorHandler:
90
+ | ((error: Error, phase: string, debugComponents?: DebugComponentEntry[]) => void)
91
+ | undefined;
74
92
 
75
93
  /**
76
94
  * Set the dev pipeline error handler.
77
95
  *
78
96
  * Called by the dev server after importing this module to wire pipeline
79
97
  * errors into the Vite browser error overlay. No-op in production.
98
+ *
99
+ * The handler receives an optional third argument with RSC debug component
100
+ * info — component names, environments, and stack frames from the Flight
101
+ * debug channel. This is only populated for render-phase errors.
80
102
  */
81
- export function setDevPipelineErrorHandler(handler: (error: Error, phase: string) => void): void {
103
+ export function setDevPipelineErrorHandler(
104
+ handler: (error: Error, phase: string, debugComponents?: DebugComponentEntry[]) => void
105
+ ): void {
82
106
  _devPipelineErrorHandler = handler;
83
107
  }
84
108
 
109
+ /**
110
+ * Set the dev source-map handler.
111
+ *
112
+ * Called by the dev server after importing this module to wire Vite's
113
+ * module graph source-mapping into the error rendering pipeline. Errors
114
+ * rendered by renderErrorPage / renderFallbackError will have their
115
+ * stack traces rewritten to show original source positions.
116
+ *
117
+ * No-op in production.
118
+ */
119
+ export function setDevSourceMapHandler(handler: (error: Error) => void): void {
120
+ setSourceMapCallback(handler);
121
+ }
122
+
123
+ // Dev-only: debug components getter is stored per-request in ALS
124
+ // (RequestContextStore.debugComponentsGetter) to avoid cross-request
125
+ // race conditions. See TIM-557.
126
+
85
127
  /**
86
128
  * Create the RSC request handler from the route manifest.
87
129
  *
@@ -95,13 +137,25 @@ async function createRequestHandler(manifest: typeof routeManifest, runtimeConfi
95
137
  // See design/17-logging.md §"register() — Server Startup"
96
138
  await loadInstrumentation(loadUserInstrumentation);
97
139
 
98
- // Initialize cookie signing secrets from config (design/29-cookies.md §"Signed Cookies")
99
- const cookieSecrets = (runtimeConfig as Record<string, unknown>).cookieSecrets as
100
- | string[]
140
+ // Initialize deployment ID for version skew detection (TIM-446).
141
+ // The manifest init module sets globalThis.__TIMBER_DEPLOYMENT_ID__ at startup.
142
+ // In dev mode this is undefined — skew checks are skipped.
143
+ const deploymentId = (globalThis as Record<string, unknown>).__TIMBER_DEPLOYMENT_ID__ as
144
+ | string
101
145
  | undefined;
102
- if (cookieSecrets?.length) {
103
- const { setCookieSecrets } = await import('#/server/request-context.js');
104
- setCookieSecrets(cookieSecrets);
146
+ if (deploymentId) {
147
+ const { setDeploymentId } = await import('../version-skew.js');
148
+ setDeploymentId(deploymentId);
149
+ }
150
+
151
+ // Wire the configured cache handler into the module-level singleton (TIM-599).
152
+ // The cacheHandler is a class instance (e.g. RedisCacheHandler) that can't be
153
+ // JSON-serialized into virtual:timber-config. Instead, virtual:timber-cache-handler
154
+ // dynamically imports the user's timber.config.ts and extracts the handler.
155
+ const userCacheHandler = await loadCacheHandler();
156
+ if (userCacheHandler) {
157
+ const { setCacheHandler } = await import('../../cache/handler-store.js');
158
+ setCacheHandler(userCacheHandler as Parameters<typeof setCacheHandler>[0]);
105
159
  }
106
160
 
107
161
  const matchRoute = createRouteMatcher(manifest);
@@ -121,27 +175,64 @@ async function createRequestHandler(manifest: typeof routeManifest, runtimeConfi
121
175
  buildManifest: buildManifest as BuildManifest,
122
176
  });
123
177
 
124
- // Dev logging — initialize OTEL-based dev tracing once at handler creation.
125
- // In production, isDev is false — no tracing, no overhead.
126
- // The DevSpanProcessor handles all formatting and stderr output.
127
- const isDev = process.env.NODE_ENV !== 'production';
178
+ // Initialize debug flag from config before anything else.
179
+ // This allows timber.config.ts `debug: true` to enable debug logging
180
+ // in production without the TIMBER_DEBUG env var.
181
+ if ((runtimeConfig as Record<string, unknown>).debug) {
182
+ setDebugFromConfig(true);
183
+ }
184
+
185
+ // Wire the global sensitive-field stripping config so `createActionClient`
186
+ // instances in user code pick up `forms.stripSensitiveFields` from
187
+ // `timber.config.ts` without needing to plumb config through each action.
188
+ // See TIM-816 and design/08-forms-and-actions.md §"Validation errors".
189
+ const formsConfig = (runtimeConfig as Record<string, unknown>).forms as
190
+ | { stripSensitiveFields?: import('../sensitive-fields.js').SensitiveFieldsOption }
191
+ | undefined;
192
+ if (formsConfig) {
193
+ const { setGlobalSensitiveFieldsConfig } = await import('../sensitive-fields.js');
194
+ setGlobalSensitiveFieldsConfig(formsConfig.stripSensitiveFields);
195
+ }
196
+
197
+ // Two separate flags for two different security levels:
198
+ //
199
+ // isDev (isDevMode) — gates client-visible behavior: dev error pages with
200
+ // stack traces, detailed Server-Timing headers, error messages in action
201
+ // payloads. Statically replaced in production → tree-shaken to zero.
202
+ // TIMBER_DEBUG cannot enable this.
203
+ //
204
+ // debugEnabled (isDebug) — gates server-side logging only: stderr warnings,
205
+ // OTEL dev tracing, console.error fallbacks. TIMBER_DEBUG enables this.
206
+ // Never affects what clients see.
207
+ const isDev = isDevMode();
208
+ const debugEnabled = isDebug();
128
209
  const slowPhaseMs = (runtimeConfig as Record<string, unknown>).slowPhaseMs as number | undefined;
129
210
 
130
- if (isDev) {
211
+ // Dev logging — initialize OTEL-based dev tracing once at handler creation.
212
+ // In production with TIMBER_DEBUG, this enables server-side tracing output
213
+ // without exposing anything to clients.
214
+ if (debugEnabled) {
131
215
  const devLogMode = resolveLogMode();
132
216
  if (devLogMode !== 'quiet') {
133
217
  await initDevTracing({ mode: devLogMode, slowPhaseMs });
134
218
  // Patch globalThis.fetch to create OTEL spans for fetch calls.
135
219
  // Spans appear as children of the active component span in the dev log tree.
136
- const { instrumentDevFetch } = await import('../dev-fetch-instrumentation.js');
220
+ const { instrumentDevFetch } = await import('../../dev-tools/instrumentation.js');
137
221
  instrumentDevFetch();
138
222
  }
139
223
  }
140
224
 
141
225
  const typedBuildManifest = buildManifest as BuildManifest;
142
226
 
227
+ // The routing plugin emits `manifest.proxy = { load, filePath }` only when
228
+ // the app has an `app/proxy.ts`. Convert that to the pipeline's lazy variant
229
+ // so HMR re-imports per request; leave it undefined when there's no proxy.
230
+ const proxyConfig: PipelineConfig['proxy'] = manifest.proxy?.load
231
+ ? { kind: 'lazy', loader: manifest.proxy.load }
232
+ : undefined;
233
+
143
234
  const pipelineConfig: PipelineConfig = {
144
- proxyLoader: manifest.proxy?.load,
235
+ proxy: proxyConfig,
145
236
  matchRoute,
146
237
  matchMetadataRoute,
147
238
  // 103 Early Hints — fires after route match, before middleware.
@@ -149,11 +240,7 @@ async function createRequestHandler(manifest: typeof routeManifest, runtimeConfi
149
240
  // so the browser starts fetching critical resources while the server renders.
150
241
  // In dev mode the manifest is empty — no hints are sent.
151
242
  earlyHints: (match: RouteMatch, _req: Request, responseHeaders: Headers) => {
152
- const segments = match.segments as unknown as Array<{
153
- layout?: { filePath: string };
154
- page?: { filePath: string };
155
- }>;
156
- const headers = collectEarlyHintHeaders(segments, typedBuildManifest, {
243
+ const headers = collectEarlyHintHeaders(match.segments, typedBuildManifest, {
157
244
  skipJs: clientJsDisabled,
158
245
  });
159
246
  for (const h of headers) {
@@ -174,33 +261,163 @@ async function createRequestHandler(manifest: typeof routeManifest, runtimeConfi
174
261
  req,
175
262
  match,
176
263
  responseHeaders,
177
- clientBootstrap,
178
- clientJsDisabled,
264
+ {
265
+ clientBootstrap,
266
+ clientJsDisabled,
267
+ rootSegment: manifest.root,
268
+ buildManifest: typedBuildManifest,
269
+ globalError: manifest.globalError,
270
+ },
179
271
  interception
180
272
  );
181
273
  },
182
274
  renderNoMatch: async (req: Request, responseHeaders: Headers) => {
183
- return renderNoMatchPage(req, manifest.root, responseHeaders, clientBootstrap);
275
+ const response = await renderNoMatchPage(
276
+ req,
277
+ manifest.root,
278
+ responseHeaders,
279
+ clientBootstrap
280
+ );
281
+
282
+ // In dev mode, if the pipeline returned a bare 404 (no body — meaning
283
+ // no user-defined 404.tsx was found), replace it with a helpful dev
284
+ // page that lists available routes and suggests similar paths.
285
+ // Only for GET requests that accept HTML — HEAD/API/RSC clients
286
+ // should receive the bare 404 without an HTML body (TIM-793).
287
+ const acceptsHtml = (req.headers.get('accept') ?? '').includes('text/html');
288
+ if (isDev && !response.body && req.method === 'GET' && acceptsHtml) {
289
+ const { generateDev404Page, collectRoutes } = await import('../../dev-tools/404-page.js');
290
+ const routes = collectRoutes(manifest.root);
291
+ const pathname = new URL(req.url).pathname;
292
+ const html = generateDev404Page(pathname, routes);
293
+ return new Response(html, {
294
+ status: 404,
295
+ headers: {
296
+ ...Object.fromEntries(responseHeaders.entries()),
297
+ 'content-type': 'text/html; charset=utf-8',
298
+ },
299
+ });
300
+ }
301
+
302
+ return response;
184
303
  },
185
304
  interceptionRewrites: manifest.interceptionRewrites,
186
305
  // Slow request threshold from timber.config.ts. Default 3000ms, 0 to disable.
187
306
  // See design/17-logging.md §"slowRequestMs"
188
307
  slowRequestMs: (runtimeConfig as Record<string, unknown>).slowRequestMs as number | undefined,
189
- enableServerTiming: isDev,
308
+ serverTiming: resolveServerTimingMode(runtimeConfig, isDev),
190
309
  onPipelineError: isDev
191
310
  ? (error: Error, phase: string) => {
192
- if (_devPipelineErrorHandler) _devPipelineErrorHandler(error, phase);
311
+ if (_devPipelineErrorHandler) {
312
+ // For render-phase errors, include RSC debug component data
313
+ // from the Flight debug channel (if available from the current request).
314
+ const store = requestContextAls.getStore();
315
+ const debugComponents =
316
+ phase === 'render' && store?.debugComponentsGetter
317
+ ? store.debugComponentsGetter()
318
+ : undefined;
319
+ _devPipelineErrorHandler(error, phase, debugComponents);
320
+ }
193
321
  }
194
322
  : undefined,
323
+
195
324
  renderFallbackError: (error, req, responseHeaders) =>
196
- renderFallback(error, req, responseHeaders, isDev, manifest.root, clientBootstrap),
325
+ renderFallback(
326
+ error,
327
+ req,
328
+ responseHeaders,
329
+ isDev,
330
+ manifest.root,
331
+ clientBootstrap,
332
+ manifest.globalError,
333
+ // Project root for dev error page frame classification.
334
+ // Not in runtimeConfig (TIM-787: leaked to client bundles).
335
+ // manifest.viteRoot is the resolved Vite root string — correct even
336
+ // when CWD differs from project root (e.g., monorepo custom root)
337
+ // (TIM-807). Passing manifest.root (segment tree object) here would
338
+ // stringify to "[object Object]" and misclassify app frames as
339
+ // internal, dropping source locations from the dev error page (TIM-808).
340
+ isDev ? manifest.viteRoot : undefined
341
+ ),
342
+ renderDenyFallback: async (deny, req, responseHeaders, matchedRoute) => {
343
+ // Render the deny page (403.tsx, 404.tsx, etc.) for DenySignals
344
+ // that escape from middleware or the render phase.
345
+ //
346
+ // When the pipeline already matched a route (the common case — matching
347
+ // runs before middleware and rendering), resolve the status file against
348
+ // the matched chain so colocated files like a nested `403.tsx` or an API
349
+ // route's `401.json` are picked up. Fall back to the root chain when no
350
+ // match is available (e.g. proxy-stage deny before route matching).
351
+ // See TIM-822, design/04-authorization.md, design/10-error-handling.md.
352
+ const chain: ManifestSegmentNode[] = matchedRoute ? matchedRoute.segments : [manifest.root];
353
+ const layoutComponents: LayoutEntry[] = [];
354
+ try {
355
+ for (const segment of chain) {
356
+ if (!segment.layout) continue;
357
+ const mod = await loadModule(segment.layout);
358
+ if (mod.default) {
359
+ layoutComponents.push({
360
+ component: mod.default as (...args: unknown[]) => unknown,
361
+ segment,
362
+ });
363
+ }
364
+ }
365
+ } catch (layoutError) {
366
+ // Layout failed to load — proceed without it. Partial layout chains
367
+ // are acceptable; the deny renderer wraps in whatever loaded.
368
+ logRenderError({ method: req.method, path: new URL(req.url).pathname, error: layoutError });
369
+ }
370
+ // Reuse the matched route's params/middleware metadata when present so
371
+ // downstream rendering sees the real route shape. Otherwise synthesise
372
+ // a root-only stub (no params, no middleware).
373
+ const match: RouteMatch = matchedRoute ?? {
374
+ segments: chain,
375
+ segmentParams: {},
376
+ middlewareChain: [],
377
+ };
378
+ // For client navigation (Accept: text/x-component), the timber router
379
+ // decodes the response as React Flight. Returning HTML to a Flight
380
+ // decoder breaks navigation, so dispatch to the RSC renderer when the
381
+ // request is an RSC payload request — mirroring the normal render path.
382
+ // See design/19-client-navigation.md §"RSC Payload Handling" and TIM-823.
383
+ if (isRscPayloadRequest(req)) {
384
+ return renderDenyPageAsRsc(
385
+ deny,
386
+ chain,
387
+ layoutComponents,
388
+ responseHeaders,
389
+ createDebugChannelSink
390
+ );
391
+ }
392
+ return renderDenyPage(
393
+ deny,
394
+ chain,
395
+ layoutComponents,
396
+ req,
397
+ match,
398
+ responseHeaders,
399
+ clientBootstrap,
400
+ createDebugChannelSink,
401
+ callSsr
402
+ );
403
+ },
404
+ // Auto-generated sitemap handler — enabled when sitemap.enabled is true
405
+ // and no user-authored sitemap exists at the app root.
406
+ // See design/16-metadata.md §"Auto-generated Sitemap"
407
+ autoSitemapHandler: createAutoSitemapHandler(manifest.root, runtimeConfig),
197
408
  };
198
409
 
199
410
  const pipeline = createPipeline(pipelineConfig);
200
411
 
201
- // Wrap the pipeline to intercept server action requests before rendering.
202
- // Actions bypass the normal pipeline (no route matching, no middleware)
203
- // per design/08-forms-and-actions.md §"Middleware for Server Actions".
412
+ // Wrap the pipeline to enforce CSRF at the request boundary and intercept
413
+ // server action requests. By default, the wrapper also runs the matched
414
+ // route's `middleware.ts` chain on action POSTs, so authentication, rate
415
+ // limiting, tenant isolation, and request-header injection apply to
416
+ // actions just like they do to page renders. See TIM-871 and
417
+ // design/08-forms-and-actions.md §"Middleware for Server Actions".
418
+ //
419
+ // CSRF validation lives in the wrapper (not inside the action handler) so
420
+ // it covers route.ts API handlers as well as server actions. See LOCAL-773.
204
421
  const csrfConfig = {
205
422
  csrf: runtimeConfig.csrf,
206
423
  allowedOrigins: (runtimeConfig as Record<string, unknown>).allowedOrigins as
@@ -208,259 +425,60 @@ async function createRequestHandler(manifest: typeof routeManifest, runtimeConfi
208
425
  | undefined,
209
426
  };
210
427
 
211
- return async (req: Request): Promise<Response> => {
212
- if (isActionRequest(req)) {
213
- const actionResponse = await handleActionRequest(req, {
214
- csrf: csrfConfig,
215
- bodyLimits: {
216
- limits: (runtimeConfig as Record<string, unknown>).limits as BodyLimitsConfig['limits'],
217
- },
218
- revalidateRenderer: async (path: string) => {
219
- // Build the React element tree for the route at `path`.
220
- // Returns the element tree (not serialized) so the action handler can
221
- // combine it with the action result in a single renderToReadableStream call.
222
- // Forward original request headers (cookies, session IDs, etc.).
223
- const revalidateHeaders = new Headers(req.headers);
224
- revalidateHeaders.set('Accept', 'text/x-component');
225
- const revalidateReq = new Request(new URL(path, req.url), {
226
- headers: revalidateHeaders,
227
- });
228
- const revalidateMatch = matchRoute(new URL(revalidateReq.url).pathname);
229
- if (!revalidateMatch) {
230
- throw new Error(`revalidatePath('${path}') — no matching route`);
231
- }
232
- const routeResult = await buildRouteElement(revalidateReq, revalidateMatch);
233
- return {
234
- element: routeResult.element,
235
- headElements: routeResult.headElements,
236
- };
237
- },
238
- });
239
- if (actionResponse) {
240
- // Check if this is a re-render signal (no-JS validation failure)
241
- if ('rerender' in actionResponse) {
242
- const formRerender = actionResponse as FormRerender;
243
- // Re-render the page with the action result as flash data.
244
- // Server components read it via getFormFlash() and pass it to
245
- // client form components as the initial useActionState value.
246
- const response = await runWithFormFlash(formRerender.rerender, () => pipeline(req));
247
- return response;
248
- }
249
- return actionResponse;
250
- }
251
- }
252
- return pipeline(req);
253
- };
254
- }
255
-
256
- /**
257
- * Render a matched route to an HTML Response via RSC → SSR pipeline,
258
- * or return a raw RSC Flight stream for client-side navigation requests.
259
- *
260
- * 1. Load page/layout components from the segment chain
261
- * 2. Resolve metadata
262
- * 3. Render to RSC Flight stream (serializes "use client" as references)
263
- * 4. If Accept: text/x-component → return RSC stream directly
264
- * Otherwise → pass RSC stream to SSR entry for HTML rendering
265
- */
266
- async function renderRoute(
267
- _req: Request,
268
- match: RouteMatch,
269
- responseHeaders: Headers,
270
- clientBootstrap: ClientBootstrapConfig,
271
- clientJsDisabled: boolean,
272
- interception?: InterceptionContext
273
- ): Promise<Response> {
274
- const segments = match.segments as unknown as ManifestSegmentNode[];
275
- const leaf = segments[segments.length - 1];
276
-
277
- // API routes (route.ts) — run access.ts standalone then dispatch to handler.
278
- // No React render pass — AccessGate is not used, React.cache is not active.
279
- // See design/04-authorization.md §"Auth in API Routes".
280
- if (leaf.route && !leaf.page) {
281
- return handleApiRoute(_req, match, segments, responseHeaders);
282
- }
283
-
284
- // Parse X-Timber-State-Tree for RSC payload requests (client navigation).
285
- // The state tree lists sync segments the client has cached — the server
286
- // skips re-rendering those layouts for a smaller, faster RSC payload.
287
- // Only used for RSC requests — HTML requests always get a full render.
288
- // See design/19-client-navigation.md §"X-Timber-State-Tree Header"
289
- const clientStateTree = isRscPayloadRequest(_req) ? parseClientStateTree(_req) : null;
428
+ const actionsConfig = (runtimeConfig as Record<string, unknown>).actions as
429
+ | { runMiddleware?: boolean }
430
+ | undefined;
290
431
 
291
- // Build the React element tree — loads modules, runs access checks,
292
- // resolves metadata. DenySignal/RedirectSignal propagate for HTTP handling.
293
- let routeResult;
294
- try {
295
- routeResult = await buildRouteElement(_req, match, interception, clientStateTree);
296
- } catch (error) {
297
- // RouteSignalWithContext wraps DenySignal/RedirectSignal with layout context
298
- if (error instanceof RouteSignalWithContext) {
299
- const { signal, layoutComponents: lc, segments: segs } = error;
300
- if (signal instanceof DenySignal) {
301
- if (isRscPayloadRequest(_req)) {
302
- return renderDenyPageAsRsc(
303
- signal,
304
- segs,
305
- lc as LayoutEntry[],
306
- responseHeaders,
307
- createDebugChannelSink
308
- );
309
- }
310
- return renderDenyPage(
311
- signal,
312
- segs,
313
- lc as LayoutEntry[],
314
- _req,
315
- match,
316
- responseHeaders,
317
- clientBootstrap,
318
- createDebugChannelSink,
319
- callSsr
320
- );
321
- }
322
- if (signal instanceof RedirectSignal) {
323
- return buildRedirectResponse(_req, signal, responseHeaders);
432
+ return wrapPipelineWithActionDispatch(pipeline, {
433
+ csrfConfig,
434
+ bodyLimits: (runtimeConfig as Record<string, unknown>).limits as BodyLimitsConfig['limits'],
435
+ sensitiveFields: formsConfig?.stripSensitiveFields,
436
+ matchRoute,
437
+ coerceSegmentParams,
438
+ renderDenyFallback: pipelineConfig.renderDenyFallback,
439
+ runMiddleware: actionsConfig?.runMiddleware,
440
+ // Thread the pipeline's `stripTrailingSlash` setting into the wrapper
441
+ // so its canonicalization step (applied before `matchRoute` for
442
+ // action POSTs) matches the page pipeline exactly. Defaults to `true`
443
+ // both here and inside the wrapper.
444
+ stripTrailingSlash: pipelineConfig.stripTrailingSlash,
445
+ buildRevalidateRenderer: (req) => async (path: string) => {
446
+ // Build the React element tree for the route at `path`.
447
+ // Returns the element tree (not serialized) so the action handler can
448
+ // combine it with the action result in a single renderToReadableStream call.
449
+ // Forward original request headers (cookies, session IDs, etc.).
450
+ const revalidateHeaders = new Headers(req.headers);
451
+ revalidateHeaders.set('Accept', 'text/x-component');
452
+ const revalidateReq = new Request(new URL(path, req.url), {
453
+ headers: revalidateHeaders,
454
+ });
455
+ const revalidateMatch = matchRoute(new URL(revalidateReq.url).pathname);
456
+ if (!revalidateMatch) {
457
+ throw new Error(`revalidatePath('${path}') — no matching route`);
324
458
  }
325
- }
326
- // No PageComponent found
327
- if (error instanceof Error && error.message.startsWith('No page component')) {
328
- return new Response(null, { status: 404 });
329
- }
330
- throw error;
331
- }
332
-
333
- const { element, headElements, layoutComponents, deferSuspenseFor, skippedSegments } = routeResult;
334
-
335
- // Build head HTML for injection into the SSR output.
336
- // Collects CSS, fonts, and modulepreload from the build manifest for matched segments.
337
- // In dev mode the manifest is empty — Vite HMR handles CSS/JS.
338
- //
339
- // Link headers (for 103 Early Hints) are emitted by the earlyHints pipeline
340
- // stage before middleware runs. Here we only emit the <head> HTML fallback tags
341
- // — these ensure resources load even on platforms without Early Hints support.
342
- const typedManifest = buildManifest as BuildManifest;
343
- let headHtml = '';
344
-
345
- const cssUrls = collectRouteCss(segments, typedManifest);
346
- if (cssUrls.length > 0) {
347
- headHtml += buildCssLinkTags(cssUrls);
348
- }
349
-
350
- const fontEntries = collectRouteFonts(segments, typedManifest);
351
- if (fontEntries.length > 0) {
352
- headHtml += buildFontPreloadTags(fontEntries);
353
- }
354
-
355
- // Skip modulepreload tags when client JavaScript is disabled — no JS to preload.
356
- if (!clientJsDisabled) {
357
- const preloadUrls = collectRouteModulepreloads(segments, typedManifest);
358
- if (preloadUrls.length > 0) {
359
- headHtml += buildModulepreloadTags(preloadUrls);
360
- }
361
- }
362
-
363
- for (const el of headElements) {
364
- if (el.tag === 'title' && el.content) {
365
- headHtml += `<title>${escapeHtml(el.content)}</title>`;
366
- } else if (el.attrs) {
367
- const attrs = Object.entries(el.attrs)
368
- .filter(([, v]) => v != null)
369
- .map(([k, v]) => `${k}="${escapeHtml(v as string)}"`)
370
- .join(' ');
371
- headHtml += `<${el.tag} ${attrs}>`;
372
- }
373
- }
374
-
375
- // Render to RSC Flight stream with signal tracking.
376
- const { rscStream, signals } = renderRscStream(element, _req);
377
-
378
- // Synchronous redirect — redirect() in access.ts or a non-async component
379
- // throws during renderToReadableStream creation. Return HTTP redirect.
380
- if (signals.redirectSignal) {
381
- return buildRedirectResponse(_req, signals.redirectSignal, responseHeaders);
382
- }
383
-
384
- // Synchronous deny — deny() in a non-async component throws during
385
- // renderToReadableStream creation, caught in the try/catch above.
386
- if (signals.denySignal) {
387
- if (isRscPayloadRequest(_req)) {
388
- return renderDenyPageAsRsc(
389
- signals.denySignal,
390
- segments,
391
- layoutComponents as LayoutEntry[],
392
- responseHeaders,
393
- createDebugChannelSink
394
- );
395
- }
396
- return renderDenyPage(
397
- signals.denySignal,
398
- segments,
399
- layoutComponents as LayoutEntry[],
400
- _req,
401
- match,
402
- responseHeaders,
403
- clientBootstrap,
404
- createDebugChannelSink,
405
- callSsr
406
- );
407
- }
408
-
409
- // Synchronous render error — renderToReadableStream threw before
410
- // creating the stream. Render the error page with correct 5xx status.
411
- // (Async render errors are tracked in onError and handled after SSR.)
412
- if (signals.renderError && !rscStream) {
413
- return renderErrorPage(
414
- signals.renderError.error,
415
- signals.renderError.status,
416
- segments,
417
- layoutComponents as LayoutEntry[],
418
- _req,
419
- match,
420
- responseHeaders,
421
- clientBootstrap
422
- );
423
- }
424
-
425
- // For RSC payload requests (client navigation), return the RSC Flight
426
- // stream directly — skip SSR HTML rendering entirely.
427
- // See design/19-client-navigation.md §"RSC Payload Handling"
428
- if (isRscPayloadRequest(_req)) {
429
- return buildRscPayloadResponse(
430
- _req,
431
- rscStream!,
432
- signals,
433
- segments,
434
- layoutComponents,
435
- headElements,
436
- match,
437
- responseHeaders,
438
- skippedSegments
439
- );
440
- }
441
-
442
- // Pipe through SSR for HTML rendering with streaming Suspense support.
443
- return renderSsrResponse({
444
- req: _req,
445
- rscStream: rscStream!,
446
- signals,
447
- segments,
448
- layoutComponents,
449
- match,
450
- responseHeaders,
451
- clientBootstrap,
452
- clientJsDisabled,
453
- headHtml,
454
- deferSuspenseFor,
459
+ // Coerce segment params (params.ts) before building the element tree.
460
+ // Without this, components receive raw strings instead of typed values.
461
+ await coerceSegmentParams(revalidateMatch);
462
+ // Set coerced params in ALS so getSegmentParams() works during the
463
+ // revalidation render (AccessGate reads params via ALS). Without this,
464
+ // AccessGate → getSegmentParams() throws because segmentParams
465
+ // is never set. See TIM-667.
466
+ setSegmentParams(revalidateMatch.segmentParams);
467
+ const routeResult = await buildRouteElement(revalidateReq, revalidateMatch);
468
+ return {
469
+ element: routeResult.element,
470
+ headElements: routeResult.headElements,
471
+ };
472
+ },
455
473
  });
456
474
  }
457
475
 
458
476
  // Re-export for generated entry points (e.g., Nitro node-server/bun) to wrap
459
477
  // the handler with per-request 103 Early Hints sender via ALS.
460
- export { runWithEarlyHintsSender } from '#/server/early-hints-sender.js';
478
+ export { runWithEarlyHintsSender } from '../early-hints-sender.js';
461
479
 
462
480
  // Re-export for generated entry points to wrap the handler with per-request
463
481
  // waitUntil support via ALS. See design/11-platform.md §"waitUntil()".
464
- export { runWithWaitUntil } from '#/server/waituntil-bridge.js';
482
+ export { runWithWaitUntil } from '../waituntil-bridge.js';
465
483
 
466
484
  export default await createRequestHandler(routeManifest, config);