@timber-js/app 0.2.0-alpha.16 → 0.2.0-alpha.161

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 (998) hide show
  1. package/LICENSE +8 -0
  2. package/agent-skill.md +344 -0
  3. package/dist/_chunks/actions-cjklt63G.js +317 -0
  4. package/dist/_chunks/actions-cjklt63G.js.map +1 -0
  5. package/dist/_chunks/build-output-helper-DF5uScqS.js +158 -0
  6. package/dist/_chunks/build-output-helper-DF5uScqS.js.map +1 -0
  7. package/dist/_chunks/cache-api-CzYUlgXA.js +1125 -0
  8. package/dist/_chunks/cache-api-CzYUlgXA.js.map +1 -0
  9. package/dist/_chunks/{metadata-routes-Cjmvi3rQ.js → canonicalize-P41GR6tY.js} +94 -18
  10. package/dist/_chunks/canonicalize-P41GR6tY.js.map +1 -0
  11. package/dist/_chunks/cli-schema-sync-NfLbLnDw.js +638 -0
  12. package/dist/_chunks/cli-schema-sync-NfLbLnDw.js.map +1 -0
  13. package/dist/_chunks/codec-registry-oOUxugz3.js +21 -0
  14. package/dist/_chunks/codec-registry-oOUxugz3.js.map +1 -0
  15. package/dist/_chunks/define-Bssfp6ot.js +82 -0
  16. package/dist/_chunks/define-Bssfp6ot.js.map +1 -0
  17. package/dist/_chunks/define-CFmvb4Bt.js +203 -0
  18. package/dist/_chunks/define-CFmvb4Bt.js.map +1 -0
  19. package/dist/_chunks/dist-BA3u1z3W.js +423 -0
  20. package/dist/_chunks/dist-BA3u1z3W.js.map +1 -0
  21. package/dist/_chunks/fast-hash-D6hIVt1Y.js +36 -0
  22. package/dist/_chunks/fast-hash-D6hIVt1Y.js.map +1 -0
  23. package/dist/_chunks/format-CfwjgPz9.js +14 -0
  24. package/dist/_chunks/format-CfwjgPz9.js.map +1 -0
  25. package/dist/_chunks/href-validation-CMc5JRls.js +141 -0
  26. package/dist/_chunks/href-validation-CMc5JRls.js.map +1 -0
  27. package/dist/_chunks/logger-B_O6-mdJ.js +1485 -0
  28. package/dist/_chunks/logger-B_O6-mdJ.js.map +1 -0
  29. package/dist/_chunks/navigation-root-bUDZLw74.js +124 -0
  30. package/dist/_chunks/navigation-root-bUDZLw74.js.map +1 -0
  31. package/dist/_chunks/plugin-context-DeAxFRMq.js +280 -0
  32. package/dist/_chunks/plugin-context-DeAxFRMq.js.map +1 -0
  33. package/dist/_chunks/registry-DbJPKoBp.js +20 -0
  34. package/dist/_chunks/registry-DbJPKoBp.js.map +1 -0
  35. package/dist/_chunks/resolve-schema-3iUvBV5T.js +50 -0
  36. package/dist/_chunks/resolve-schema-3iUvBV5T.js.map +1 -0
  37. package/dist/_chunks/router-ref-CtmF-aPv.js +28 -0
  38. package/dist/_chunks/router-ref-CtmF-aPv.js.map +1 -0
  39. package/dist/_chunks/schema-bridge-BY3QLBL7.js +119 -0
  40. package/dist/_chunks/schema-bridge-BY3QLBL7.js.map +1 -0
  41. package/dist/_chunks/segment-classify-CDDRVKs7.js +137 -0
  42. package/dist/_chunks/segment-classify-CDDRVKs7.js.map +1 -0
  43. package/dist/_chunks/segment-context-ZDnXDkbz.js +34 -0
  44. package/dist/_chunks/segment-context-ZDnXDkbz.js.map +1 -0
  45. package/dist/_chunks/sizeof-lXffQ1Vr.js +35 -0
  46. package/dist/_chunks/sizeof-lXffQ1Vr.js.map +1 -0
  47. package/dist/_chunks/{ssr-data-MjmprTmO.js → ssr-data-BOWsq18U.js} +1 -1
  48. package/dist/_chunks/ssr-data-BOWsq18U.js.map +1 -0
  49. package/dist/_chunks/tree-match-D2l830j2.js +102 -0
  50. package/dist/_chunks/tree-match-D2l830j2.js.map +1 -0
  51. package/dist/_chunks/{use-query-states-D5KaffOK.js → use-query-states-CbeQmext.js} +7 -20
  52. package/dist/_chunks/use-query-states-CbeQmext.js.map +1 -0
  53. package/dist/_chunks/use-segment-params-D1CzlgBo.js +151 -0
  54. package/dist/_chunks/use-segment-params-D1CzlgBo.js.map +1 -0
  55. package/dist/_chunks/walkers-9mz9T7mb.js +988 -0
  56. package/dist/_chunks/walkers-9mz9T7mb.js.map +1 -0
  57. package/dist/adapters/build-output-helper.d.ts +29 -0
  58. package/dist/adapters/build-output-helper.d.ts.map +1 -0
  59. package/dist/adapters/cloudflare-dev.d.ts +109 -0
  60. package/dist/adapters/cloudflare-dev.d.ts.map +1 -0
  61. package/dist/adapters/cloudflare-dev.js +73 -0
  62. package/dist/adapters/cloudflare-dev.js.map +1 -0
  63. package/dist/adapters/cloudflare-kv-cache.d.ts +64 -0
  64. package/dist/adapters/cloudflare-kv-cache.d.ts.map +1 -0
  65. package/dist/adapters/cloudflare-kv-cache.js +117 -0
  66. package/dist/adapters/cloudflare-kv-cache.js.map +1 -0
  67. package/dist/adapters/cloudflare.d.ts +177 -20
  68. package/dist/adapters/cloudflare.d.ts.map +1 -1
  69. package/dist/adapters/cloudflare.js +337 -64
  70. package/dist/adapters/cloudflare.js.map +1 -1
  71. package/dist/adapters/compress-module.d.ts +5 -4
  72. package/dist/adapters/compress-module.d.ts.map +1 -1
  73. package/dist/adapters/nitro.d.ts +1 -3
  74. package/dist/adapters/nitro.d.ts.map +1 -1
  75. package/dist/adapters/nitro.js +144 -152
  76. package/dist/adapters/nitro.js.map +1 -1
  77. package/dist/adapters/shared.d.ts +6 -0
  78. package/dist/adapters/shared.d.ts.map +1 -0
  79. package/dist/adapters/types.d.ts +0 -6
  80. package/dist/adapters/types.d.ts.map +1 -1
  81. package/dist/cache/cache-api.d.ts +26 -0
  82. package/dist/cache/cache-api.d.ts.map +1 -0
  83. package/dist/cache/handler-store.d.ts +33 -0
  84. package/dist/cache/handler-store.d.ts.map +1 -0
  85. package/dist/cache/index.d.ts +27 -7
  86. package/dist/cache/index.d.ts.map +1 -1
  87. package/dist/cache/index.js +3 -326
  88. package/dist/cache/invalidation-epoch.d.ts +43 -0
  89. package/dist/cache/invalidation-epoch.d.ts.map +1 -0
  90. package/dist/cache/redis-handler.d.ts +97 -8
  91. package/dist/cache/redis-handler.d.ts.map +1 -1
  92. package/dist/cache/singleflight.d.ts +19 -2
  93. package/dist/cache/singleflight.d.ts.map +1 -1
  94. package/dist/cache/sizeof.d.ts +22 -0
  95. package/dist/cache/sizeof.d.ts.map +1 -0
  96. package/dist/cache/stable-stringify.d.ts +9 -0
  97. package/dist/cache/stable-stringify.d.ts.map +1 -1
  98. package/dist/cache/store.d.ts +53 -0
  99. package/dist/cache/store.d.ts.map +1 -0
  100. package/dist/cache/stores/cloudflare-kv.d.ts +38 -0
  101. package/dist/cache/stores/cloudflare-kv.d.ts.map +1 -0
  102. package/dist/cache/stores/cloudflare-kv.js +29 -0
  103. package/dist/cache/stores/cloudflare-kv.js.map +1 -0
  104. package/dist/cache/stores/memory.d.ts +42 -0
  105. package/dist/cache/stores/memory.d.ts.map +1 -0
  106. package/dist/cache/stores/memory.js +90 -0
  107. package/dist/cache/stores/memory.js.map +1 -0
  108. package/dist/cache/stores/redis.d.ts +69 -0
  109. package/dist/cache/stores/redis.d.ts.map +1 -0
  110. package/dist/cache/stores/redis.js +35 -0
  111. package/dist/cache/stores/redis.js.map +1 -0
  112. package/dist/cache/stores/vercel.d.ts +36 -0
  113. package/dist/cache/stores/vercel.d.ts.map +1 -0
  114. package/dist/cache/stores/vercel.js +33 -0
  115. package/dist/cache/stores/vercel.js.map +1 -0
  116. package/dist/cache/tag-aware-handler.d.ts +51 -0
  117. package/dist/cache/tag-aware-handler.d.ts.map +1 -0
  118. package/dist/cache/timber-cache.d.ts +20 -10
  119. package/dist/cache/timber-cache.d.ts.map +1 -1
  120. package/dist/cdn/cloudflare-purge.d.ts +23 -0
  121. package/dist/cdn/cloudflare-purge.d.ts.map +1 -0
  122. package/dist/cdn/fastly-purge.d.ts +25 -0
  123. package/dist/cdn/fastly-purge.d.ts.map +1 -0
  124. package/dist/cdn/headers.d.ts +97 -0
  125. package/dist/cdn/headers.d.ts.map +1 -0
  126. package/dist/cdn/index.d.ts +5 -0
  127. package/dist/cdn/index.d.ts.map +1 -0
  128. package/dist/cdn/purge-store.d.ts +23 -0
  129. package/dist/cdn/purge-store.d.ts.map +1 -0
  130. package/dist/cdn/workers-cache-purge.d.ts +16 -0
  131. package/dist/cdn/workers-cache-purge.d.ts.map +1 -0
  132. package/dist/cli-schema-sync.d.ts +59 -0
  133. package/dist/cli-schema-sync.d.ts.map +1 -0
  134. package/dist/cli.d.ts +34 -2
  135. package/dist/cli.d.ts.map +1 -1
  136. package/dist/cli.js +107 -33
  137. package/dist/cli.js.map +1 -1
  138. package/dist/client/browser-dev.d.ts +37 -1
  139. package/dist/client/browser-dev.d.ts.map +1 -1
  140. package/dist/client/browser-entry/action-dispatch.d.ts +17 -0
  141. package/dist/client/browser-entry/action-dispatch.d.ts.map +1 -0
  142. package/dist/client/browser-entry/hmr.d.ts +21 -0
  143. package/dist/client/browser-entry/hmr.d.ts.map +1 -0
  144. package/dist/client/browser-entry/hydrate.d.ts +46 -0
  145. package/dist/client/browser-entry/hydrate.d.ts.map +1 -0
  146. package/dist/client/browser-entry/index.d.ts +29 -0
  147. package/dist/client/browser-entry/index.d.ts.map +1 -0
  148. package/dist/client/browser-entry/post-hydration.d.ts +26 -0
  149. package/dist/client/browser-entry/post-hydration.d.ts.map +1 -0
  150. package/dist/client/browser-entry/router-init.d.ts +26 -0
  151. package/dist/client/browser-entry/router-init.d.ts.map +1 -0
  152. package/dist/client/browser-entry/rsc-stream.d.ts +24 -0
  153. package/dist/client/browser-entry/rsc-stream.d.ts.map +1 -0
  154. package/dist/client/browser-entry/scroll.d.ts +28 -0
  155. package/dist/client/browser-entry/scroll.d.ts.map +1 -0
  156. package/dist/client/child-segment-context.d.ts +22 -0
  157. package/dist/client/child-segment-context.d.ts.map +1 -0
  158. package/dist/client/child-segment-outlet.d.ts +18 -0
  159. package/dist/client/child-segment-outlet.d.ts.map +1 -0
  160. package/dist/client/child-segment-provider.d.ts +21 -0
  161. package/dist/client/child-segment-provider.d.ts.map +1 -0
  162. package/dist/client/error-boundary.d.ts +12 -5
  163. package/dist/client/error-boundary.d.ts.map +1 -1
  164. package/dist/client/error-boundary.js +47 -10
  165. package/dist/client/error-boundary.js.map +1 -1
  166. package/dist/client/error-reconstituter.d.ts +61 -0
  167. package/dist/client/error-reconstituter.d.ts.map +1 -0
  168. package/dist/client/form.d.ts +16 -27
  169. package/dist/client/form.d.ts.map +1 -1
  170. package/dist/client/history.d.ts +11 -6
  171. package/dist/client/history.d.ts.map +1 -1
  172. package/dist/client/index.d.ts +10 -24
  173. package/dist/client/index.d.ts.map +1 -1
  174. package/dist/client/index.js +182 -1134
  175. package/dist/client/index.js.map +1 -1
  176. package/dist/client/internal.d.ts +19 -0
  177. package/dist/client/internal.d.ts.map +1 -0
  178. package/dist/client/internal.js +825 -0
  179. package/dist/client/internal.js.map +1 -0
  180. package/dist/client/link.d.ts +69 -60
  181. package/dist/client/link.d.ts.map +1 -1
  182. package/dist/client/navigation-api.d.ts +120 -0
  183. package/dist/client/navigation-api.d.ts.map +1 -0
  184. package/dist/client/navigation-context.d.ts +3 -2
  185. package/dist/client/navigation-context.d.ts.map +1 -1
  186. package/dist/client/navigation-root.d.ts +119 -0
  187. package/dist/client/navigation-root.d.ts.map +1 -0
  188. package/dist/client/nuqs-adapter.d.ts +1 -1
  189. package/dist/client/nuqs-adapter.d.ts.map +1 -1
  190. package/dist/client/router-ref.d.ts +1 -1
  191. package/dist/client/router.d.ts +87 -14
  192. package/dist/client/router.d.ts.map +1 -1
  193. package/dist/client/rsc-fetch.d.ts +47 -14
  194. package/dist/client/rsc-fetch.d.ts.map +1 -1
  195. package/dist/client/segment-cache.d.ts +4 -4
  196. package/dist/client/segment-cache.d.ts.map +1 -1
  197. package/dist/client/segment-outlet.d.ts +49 -0
  198. package/dist/client/segment-outlet.d.ts.map +1 -0
  199. package/dist/client/segment-update-context.d.ts +21 -0
  200. package/dist/client/segment-update-context.d.ts.map +1 -0
  201. package/dist/client/shallow-url.d.ts +10 -0
  202. package/dist/client/shallow-url.d.ts.map +1 -0
  203. package/dist/client/ssr-data.d.ts +13 -4
  204. package/dist/client/ssr-data.d.ts.map +1 -1
  205. package/dist/client/state.d.ts +1 -1
  206. package/dist/client/top-loader.d.ts +5 -5
  207. package/dist/client/top-loader.d.ts.map +1 -1
  208. package/dist/client/use-cookie.d.ts +12 -0
  209. package/dist/client/use-cookie.d.ts.map +1 -1
  210. package/dist/client/use-link-status.d.ts +5 -5
  211. package/dist/client/use-link-status.d.ts.map +1 -1
  212. package/dist/client/use-pathname.d.ts.map +1 -1
  213. package/dist/client/use-pending-navigation.d.ts +23 -0
  214. package/dist/client/use-pending-navigation.d.ts.map +1 -0
  215. package/dist/client/use-query-states.d.ts +1 -1
  216. package/dist/client/use-query-states.d.ts.map +1 -1
  217. package/dist/client/use-router.d.ts +1 -1
  218. package/dist/client/use-router.d.ts.map +1 -1
  219. package/dist/client/use-search-params.d.ts +12 -5
  220. package/dist/client/use-search-params.d.ts.map +1 -1
  221. package/dist/client/{use-params.d.ts → use-segment-params.d.ts} +8 -6
  222. package/dist/client/use-segment-params.d.ts.map +1 -0
  223. package/dist/codec.d.ts +69 -0
  224. package/dist/codec.d.ts.map +1 -0
  225. package/dist/codec.js +75 -0
  226. package/dist/codec.js.map +1 -0
  227. package/dist/config-types.d.ts +304 -0
  228. package/dist/config-types.d.ts.map +1 -0
  229. package/dist/config-validation.d.ts +51 -0
  230. package/dist/config-validation.d.ts.map +1 -0
  231. package/dist/content/index.d.ts +1 -10
  232. package/dist/content/index.d.ts.map +1 -1
  233. package/dist/content/index.js +0 -2
  234. package/dist/cookies/define-cookie.d.ts +58 -25
  235. package/dist/cookies/define-cookie.d.ts.map +1 -1
  236. package/dist/cookies/index.d.ts +2 -1
  237. package/dist/cookies/index.d.ts.map +1 -1
  238. package/dist/cookies/index.js +257 -36
  239. package/dist/cookies/index.js.map +1 -1
  240. package/dist/cookies/json-cookie.d.ts +64 -0
  241. package/dist/cookies/json-cookie.d.ts.map +1 -0
  242. package/dist/cookies/validation.d.ts +34 -0
  243. package/dist/cookies/validation.d.ts.map +1 -0
  244. package/dist/dev-tools/404-page.d.ts +50 -0
  245. package/dist/dev-tools/404-page.d.ts.map +1 -0
  246. package/dist/dev-tools/browser-logs.d.ts +40 -0
  247. package/dist/dev-tools/browser-logs.d.ts.map +1 -0
  248. package/dist/dev-tools/dev-page-shell.d.ts +78 -0
  249. package/dist/dev-tools/dev-page-shell.d.ts.map +1 -0
  250. package/dist/dev-tools/error-page.d.ts +32 -0
  251. package/dist/dev-tools/error-page.d.ts.map +1 -0
  252. package/dist/dev-tools/holding-server.d.ts +54 -0
  253. package/dist/dev-tools/holding-server.d.ts.map +1 -0
  254. package/dist/dev-tools/hydration-overlay.d.ts +11 -0
  255. package/dist/dev-tools/hydration-overlay.d.ts.map +1 -0
  256. package/dist/dev-tools/index.d.ts +31 -0
  257. package/dist/dev-tools/index.d.ts.map +1 -0
  258. package/dist/dev-tools/instrumentation.d.ts +59 -0
  259. package/dist/dev-tools/instrumentation.d.ts.map +1 -0
  260. package/dist/{server/dev-logger.d.ts → dev-tools/logger.d.ts} +1 -1
  261. package/dist/dev-tools/logger.d.ts.map +1 -0
  262. package/dist/{plugins/dev-logs.d.ts → dev-tools/logs.d.ts} +2 -2
  263. package/dist/dev-tools/logs.d.ts.map +1 -0
  264. package/dist/dev-tools/overlay.d.ts +91 -0
  265. package/dist/dev-tools/overlay.d.ts.map +1 -0
  266. package/dist/dev-tools/stack-classifier.d.ts +34 -0
  267. package/dist/dev-tools/stack-classifier.d.ts.map +1 -0
  268. package/dist/dev-tools/terminal.d.ts +28 -0
  269. package/dist/dev-tools/terminal.d.ts.map +1 -0
  270. package/dist/fonts/ast-walk.d.ts +68 -0
  271. package/dist/fonts/ast-walk.d.ts.map +1 -0
  272. package/dist/fonts/ast.d.ts +110 -6
  273. package/dist/fonts/ast.d.ts.map +1 -1
  274. package/dist/fonts/bundle.d.ts +50 -0
  275. package/dist/fonts/bundle.d.ts.map +1 -0
  276. package/dist/fonts/dev-middleware.d.ts +22 -0
  277. package/dist/fonts/dev-middleware.d.ts.map +1 -0
  278. package/dist/fonts/fallbacks.d.ts +0 -7
  279. package/dist/fonts/fallbacks.d.ts.map +1 -1
  280. package/dist/fonts/google.d.ts +4 -2
  281. package/dist/fonts/google.d.ts.map +1 -1
  282. package/dist/fonts/local.d.ts +4 -4
  283. package/dist/fonts/local.d.ts.map +1 -1
  284. package/dist/fonts/paths.d.ts +43 -0
  285. package/dist/fonts/paths.d.ts.map +1 -0
  286. package/dist/fonts/pipeline.d.ts +158 -0
  287. package/dist/fonts/pipeline.d.ts.map +1 -0
  288. package/dist/fonts/transform.d.ts +82 -0
  289. package/dist/fonts/transform.d.ts.map +1 -0
  290. package/dist/fonts/types.d.ts +47 -1
  291. package/dist/fonts/types.d.ts.map +1 -1
  292. package/dist/fonts/virtual-modules.d.ts +77 -0
  293. package/dist/fonts/virtual-modules.d.ts.map +1 -0
  294. package/dist/index.d.ts +46 -180
  295. package/dist/index.d.ts.map +1 -1
  296. package/dist/index.js +8471 -14108
  297. package/dist/index.js.map +1 -1
  298. package/dist/params/codec-registry.d.ts +26 -0
  299. package/dist/params/codec-registry.d.ts.map +1 -0
  300. package/dist/params/define-schema.d.ts +81 -0
  301. package/dist/params/define-schema.d.ts.map +1 -0
  302. package/dist/params/index.d.ts +5 -0
  303. package/dist/params/index.d.ts.map +1 -0
  304. package/dist/params/index.js +34 -0
  305. package/dist/params/index.js.map +1 -0
  306. package/dist/params/resolve-schema.d.ts +34 -0
  307. package/dist/params/resolve-schema.d.ts.map +1 -0
  308. package/dist/plugin-context.d.ts +190 -0
  309. package/dist/plugin-context.d.ts.map +1 -0
  310. package/dist/plugins/adapter-build.d.ts +20 -1
  311. package/dist/plugins/adapter-build.d.ts.map +1 -1
  312. package/dist/plugins/build-manifest.d.ts +7 -3
  313. package/dist/plugins/build-manifest.d.ts.map +1 -1
  314. package/dist/plugins/build-report.d.ts +43 -7
  315. package/dist/plugins/build-report.d.ts.map +1 -1
  316. package/dist/plugins/cache.d.ts +64 -0
  317. package/dist/plugins/cache.d.ts.map +1 -0
  318. package/dist/plugins/callsite-ast.d.ts +117 -0
  319. package/dist/plugins/callsite-ast.d.ts.map +1 -0
  320. package/dist/plugins/callsite-jsx.d.ts +35 -0
  321. package/dist/plugins/callsite-jsx.d.ts.map +1 -0
  322. package/dist/plugins/chunks.d.ts +11 -4
  323. package/dist/plugins/chunks.d.ts.map +1 -1
  324. package/dist/plugins/client-chunks.d.ts +40 -0
  325. package/dist/plugins/client-chunks.d.ts.map +1 -0
  326. package/dist/plugins/cloudflare-wasm.d.ts +21 -0
  327. package/dist/plugins/cloudflare-wasm.d.ts.map +1 -0
  328. package/dist/plugins/content.d.ts +1 -1
  329. package/dist/plugins/content.d.ts.map +1 -1
  330. package/dist/plugins/dev-server.d.ts +17 -1
  331. package/dist/plugins/dev-server.d.ts.map +1 -1
  332. package/dist/plugins/entries.d.ts +1 -1
  333. package/dist/plugins/entries.d.ts.map +1 -1
  334. package/dist/plugins/fonts.d.ts +16 -73
  335. package/dist/plugins/fonts.d.ts.map +1 -1
  336. package/dist/plugins/mdx.d.ts +1 -1
  337. package/dist/plugins/mdx.d.ts.map +1 -1
  338. package/dist/plugins/prebuilt-capture.d.ts +60 -0
  339. package/dist/plugins/prebuilt-capture.d.ts.map +1 -0
  340. package/dist/plugins/prebuilt.d.ts +82 -0
  341. package/dist/plugins/prebuilt.d.ts.map +1 -0
  342. package/dist/plugins/prerender-sugar.d.ts +42 -0
  343. package/dist/plugins/prerender-sugar.d.ts.map +1 -0
  344. package/dist/plugins/routing.d.ts +1 -1
  345. package/dist/plugins/routing.d.ts.map +1 -1
  346. package/dist/plugins/server-bundle.d.ts.map +1 -1
  347. package/dist/plugins/shims.d.ts +29 -5
  348. package/dist/plugins/shims.d.ts.map +1 -1
  349. package/dist/plugins/static-build.d.ts +5 -26
  350. package/dist/plugins/static-build.d.ts.map +1 -1
  351. package/dist/routing/codegen-shared.d.ts +67 -0
  352. package/dist/routing/codegen-shared.d.ts.map +1 -0
  353. package/dist/routing/codegen-types.d.ts +64 -0
  354. package/dist/routing/codegen-types.d.ts.map +1 -0
  355. package/dist/routing/codegen.d.ts +7 -2
  356. package/dist/routing/codegen.d.ts.map +1 -1
  357. package/dist/routing/convention-lint.d.ts +41 -0
  358. package/dist/routing/convention-lint.d.ts.map +1 -0
  359. package/dist/routing/export-detect.d.ts +56 -0
  360. package/dist/routing/export-detect.d.ts.map +1 -0
  361. package/dist/routing/file-cache.d.ts +8 -0
  362. package/dist/routing/file-cache.d.ts.map +1 -0
  363. package/dist/routing/index.d.ts +7 -1
  364. package/dist/routing/index.d.ts.map +1 -1
  365. package/dist/routing/index.js +4 -2
  366. package/dist/routing/interception.d.ts +0 -5
  367. package/dist/routing/interception.d.ts.map +1 -1
  368. package/dist/routing/link-codegen.d.ts +90 -0
  369. package/dist/routing/link-codegen.d.ts.map +1 -0
  370. package/dist/routing/manifest-codegen.d.ts +32 -0
  371. package/dist/routing/manifest-codegen.d.ts.map +1 -0
  372. package/dist/routing/scanner.d.ts +1 -10
  373. package/dist/routing/scanner.d.ts.map +1 -1
  374. package/dist/routing/schema-validation.d.ts +35 -0
  375. package/dist/routing/schema-validation.d.ts.map +1 -0
  376. package/dist/routing/segment-classify.d.ts +75 -0
  377. package/dist/routing/segment-classify.d.ts.map +1 -0
  378. package/dist/routing/segment-codegen.d.ts +38 -0
  379. package/dist/routing/segment-codegen.d.ts.map +1 -0
  380. package/dist/routing/types.d.ts +77 -25
  381. package/dist/routing/types.d.ts.map +1 -1
  382. package/dist/routing/walkers.d.ts +51 -0
  383. package/dist/routing/walkers.d.ts.map +1 -0
  384. package/dist/rsc-runtime/rsc.d.ts +1 -1
  385. package/dist/rsc-runtime/rsc.d.ts.map +1 -1
  386. package/dist/rsc-runtime/ssr.d.ts +12 -0
  387. package/dist/rsc-runtime/ssr.d.ts.map +1 -1
  388. package/dist/schema-bridge.d.ts +91 -0
  389. package/dist/schema-bridge.d.ts.map +1 -0
  390. package/dist/search-params/define.d.ts +157 -0
  391. package/dist/search-params/define.d.ts.map +1 -0
  392. package/dist/search-params/index.d.ts +4 -7
  393. package/dist/search-params/index.d.ts.map +1 -1
  394. package/dist/search-params/index.js +37 -440
  395. package/dist/search-params/index.js.map +1 -1
  396. package/dist/search-params/registry.d.ts +2 -2
  397. package/dist/search-params/registry.d.ts.map +1 -1
  398. package/dist/search-params/wrappers.d.ts +53 -0
  399. package/dist/search-params/wrappers.d.ts.map +1 -0
  400. package/dist/segment-params/define.d.ts +89 -0
  401. package/dist/segment-params/define.d.ts.map +1 -0
  402. package/dist/segment-params/index.d.ts +3 -0
  403. package/dist/segment-params/index.d.ts.map +1 -0
  404. package/dist/segment-params/index.js +2 -0
  405. package/dist/server/access-gate.d.ts +8 -3
  406. package/dist/server/access-gate.d.ts.map +1 -1
  407. package/dist/server/action-client.d.ts +41 -6
  408. package/dist/server/action-client.d.ts.map +1 -1
  409. package/dist/server/action-encryption.d.ts +76 -0
  410. package/dist/server/action-encryption.d.ts.map +1 -0
  411. package/dist/server/action-handler.d.ts +35 -1
  412. package/dist/server/action-handler.d.ts.map +1 -1
  413. package/dist/server/actions.d.ts +6 -30
  414. package/dist/server/actions.d.ts.map +1 -1
  415. package/dist/server/als-registry.d.ts +86 -11
  416. package/dist/server/als-registry.d.ts.map +1 -1
  417. package/dist/server/asset-headers.d.ts +8 -18
  418. package/dist/server/asset-headers.d.ts.map +1 -1
  419. package/dist/server/body-limits.d.ts.map +1 -1
  420. package/dist/server/build-manifest.d.ts +6 -29
  421. package/dist/server/build-manifest.d.ts.map +1 -1
  422. package/dist/server/canonicalize.d.ts +10 -0
  423. package/dist/server/canonicalize.d.ts.map +1 -1
  424. package/dist/server/coalesce-tick.d.ts +40 -0
  425. package/dist/server/coalesce-tick.d.ts.map +1 -0
  426. package/dist/server/cookie-context.d.ts +170 -0
  427. package/dist/server/cookie-context.d.ts.map +1 -0
  428. package/dist/server/cookie-parsing.d.ts +65 -0
  429. package/dist/server/cookie-parsing.d.ts.map +1 -0
  430. package/dist/server/csrf.d.ts +3 -2
  431. package/dist/server/csrf.d.ts.map +1 -1
  432. package/dist/server/default-logger.d.ts +22 -0
  433. package/dist/server/default-logger.d.ts.map +1 -0
  434. package/dist/server/deny-boundary.d.ts +115 -0
  435. package/dist/server/deny-boundary.d.ts.map +1 -0
  436. package/dist/server/deny-renderer.d.ts +2 -2
  437. package/dist/server/deny-renderer.d.ts.map +1 -1
  438. package/dist/server/dev-source-map.d.ts +22 -0
  439. package/dist/server/dev-source-map.d.ts.map +1 -0
  440. package/dist/server/early-hints-sender.d.ts.map +1 -1
  441. package/dist/server/early-hints.d.ts +13 -11
  442. package/dist/server/early-hints.d.ts.map +1 -1
  443. package/dist/server/error-boundary-wrapper.d.ts +7 -1
  444. package/dist/server/error-boundary-wrapper.d.ts.map +1 -1
  445. package/dist/server/fallback-error.d.ts +12 -7
  446. package/dist/server/fallback-error.d.ts.map +1 -1
  447. package/dist/server/flight-injection-state.d.ts +66 -0
  448. package/dist/server/flight-injection-state.d.ts.map +1 -0
  449. package/dist/server/flight-scripts.d.ts +42 -0
  450. package/dist/server/flight-scripts.d.ts.map +1 -0
  451. package/dist/server/form-data.d.ts +41 -0
  452. package/dist/server/form-data.d.ts.map +1 -1
  453. package/dist/server/html-injector-core.d.ts +221 -0
  454. package/dist/server/html-injector-core.d.ts.map +1 -0
  455. package/dist/server/html-injectors.d.ts +82 -41
  456. package/dist/server/html-injectors.d.ts.map +1 -1
  457. package/dist/server/index.d.ts +11 -47
  458. package/dist/server/index.d.ts.map +1 -1
  459. package/dist/server/index.js +170 -2911
  460. package/dist/server/index.js.map +1 -1
  461. package/dist/server/internal.d.ts +49 -0
  462. package/dist/server/internal.d.ts.map +1 -0
  463. package/dist/server/internal.js +3652 -0
  464. package/dist/server/internal.js.map +1 -0
  465. package/dist/server/logger.d.ts +39 -7
  466. package/dist/server/logger.d.ts.map +1 -1
  467. package/dist/server/metadata-routes.d.ts +23 -7
  468. package/dist/server/metadata-routes.d.ts.map +1 -1
  469. package/dist/server/middleware-runner.d.ts +36 -4
  470. package/dist/server/middleware-runner.d.ts.map +1 -1
  471. package/dist/server/node-stream-transforms.d.ts +119 -0
  472. package/dist/server/node-stream-transforms.d.ts.map +1 -0
  473. package/dist/server/param-coercion.d.ts +54 -0
  474. package/dist/server/param-coercion.d.ts.map +1 -0
  475. package/dist/server/pipeline-helpers.d.ts +95 -0
  476. package/dist/server/pipeline-helpers.d.ts.map +1 -0
  477. package/dist/server/pipeline-interception.d.ts +1 -1
  478. package/dist/server/pipeline-interception.d.ts.map +1 -1
  479. package/dist/server/pipeline-metadata.d.ts +6 -0
  480. package/dist/server/pipeline-metadata.d.ts.map +1 -1
  481. package/dist/server/pipeline-outcome.d.ts +49 -0
  482. package/dist/server/pipeline-outcome.d.ts.map +1 -0
  483. package/dist/server/pipeline-phases.d.ts +56 -0
  484. package/dist/server/pipeline-phases.d.ts.map +1 -0
  485. package/dist/server/pipeline.d.ts +122 -19
  486. package/dist/server/pipeline.d.ts.map +1 -1
  487. package/dist/server/port-resolution.d.ts +117 -0
  488. package/dist/server/port-resolution.d.ts.map +1 -0
  489. package/dist/server/prebuilt/cache-key.d.ts +58 -0
  490. package/dist/server/prebuilt/cache-key.d.ts.map +1 -0
  491. package/dist/server/prebuilt/capture-state.d.ts +57 -0
  492. package/dist/server/prebuilt/capture-state.d.ts.map +1 -0
  493. package/dist/server/prebuilt/manifest-tag-index.d.ts +27 -0
  494. package/dist/server/prebuilt/manifest-tag-index.d.ts.map +1 -0
  495. package/dist/server/prebuilt/overlay.d.ts +100 -0
  496. package/dist/server/prebuilt/overlay.d.ts.map +1 -0
  497. package/dist/server/prebuilt/payload-source.d.ts +78 -0
  498. package/dist/server/prebuilt/payload-source.d.ts.map +1 -0
  499. package/dist/server/prebuilt/synthetic-store.d.ts +66 -0
  500. package/dist/server/prebuilt/synthetic-store.d.ts.map +1 -0
  501. package/dist/server/prebuilt-builder.d.ts +120 -0
  502. package/dist/server/prebuilt-builder.d.ts.map +1 -0
  503. package/dist/server/prebuilt-runtime.d.ts +101 -0
  504. package/dist/server/prebuilt-runtime.d.ts.map +1 -0
  505. package/dist/server/primitives.d.ts +88 -43
  506. package/dist/server/primitives.d.ts.map +1 -1
  507. package/dist/server/render-timeout.d.ts +51 -0
  508. package/dist/server/render-timeout.d.ts.map +1 -0
  509. package/dist/server/render-utils.d.ts +25 -0
  510. package/dist/server/render-utils.d.ts.map +1 -0
  511. package/dist/server/request-context.d.ts +62 -107
  512. package/dist/server/request-context.d.ts.map +1 -1
  513. package/dist/server/route-element-builder.d.ts +46 -25
  514. package/dist/server/route-element-builder.d.ts.map +1 -1
  515. package/dist/server/route-handler.d.ts.map +1 -1
  516. package/dist/server/route-matcher.d.ts +25 -36
  517. package/dist/server/route-matcher.d.ts.map +1 -1
  518. package/dist/server/rsc-entry/action-middleware-runner.d.ts +66 -0
  519. package/dist/server/rsc-entry/action-middleware-runner.d.ts.map +1 -0
  520. package/dist/server/rsc-entry/api-handler.d.ts +12 -3
  521. package/dist/server/rsc-entry/api-handler.d.ts.map +1 -1
  522. package/dist/server/rsc-entry/error-renderer.d.ts +26 -13
  523. package/dist/server/rsc-entry/error-renderer.d.ts.map +1 -1
  524. package/dist/server/rsc-entry/helpers.d.ts +51 -28
  525. package/dist/server/rsc-entry/helpers.d.ts.map +1 -1
  526. package/dist/server/rsc-entry/index.d.ts +28 -6
  527. package/dist/server/rsc-entry/index.d.ts.map +1 -1
  528. package/dist/server/rsc-entry/render-route.d.ts +50 -0
  529. package/dist/server/rsc-entry/render-route.d.ts.map +1 -0
  530. package/dist/server/rsc-entry/revalidate-renderer.d.ts +108 -0
  531. package/dist/server/rsc-entry/revalidate-renderer.d.ts.map +1 -0
  532. package/dist/server/rsc-entry/rsc-payload.d.ts +5 -6
  533. package/dist/server/rsc-entry/rsc-payload.d.ts.map +1 -1
  534. package/dist/server/rsc-entry/rsc-stream.d.ts +17 -1
  535. package/dist/server/rsc-entry/rsc-stream.d.ts.map +1 -1
  536. package/dist/server/rsc-entry/ssr-bridge.d.ts +5 -1
  537. package/dist/server/rsc-entry/ssr-bridge.d.ts.map +1 -1
  538. package/dist/server/rsc-entry/ssr-renderer.d.ts +34 -4
  539. package/dist/server/rsc-entry/ssr-renderer.d.ts.map +1 -1
  540. package/dist/server/rsc-entry/wrap-action-dispatch.d.ts +119 -0
  541. package/dist/server/rsc-entry/wrap-action-dispatch.d.ts.map +1 -0
  542. package/dist/server/safe-load.d.ts +46 -0
  543. package/dist/server/safe-load.d.ts.map +1 -0
  544. package/dist/server/sensitive-fields.d.ts +74 -0
  545. package/dist/server/sensitive-fields.d.ts.map +1 -0
  546. package/dist/server/sitemap-generator.d.ts +129 -0
  547. package/dist/server/sitemap-generator.d.ts.map +1 -0
  548. package/dist/server/sitemap-handler.d.ts +22 -0
  549. package/dist/server/sitemap-handler.d.ts.map +1 -0
  550. package/dist/server/slot-resolver.d.ts +7 -5
  551. package/dist/server/slot-resolver.d.ts.map +1 -1
  552. package/dist/server/ssr-bridge-types.d.ts +121 -0
  553. package/dist/server/ssr-bridge-types.d.ts.map +1 -0
  554. package/dist/server/ssr-entry.d.ts +2 -43
  555. package/dist/server/ssr-entry.d.ts.map +1 -1
  556. package/dist/server/ssr-render.d.ts +64 -21
  557. package/dist/server/ssr-render.d.ts.map +1 -1
  558. package/dist/server/ssr-wrappers.d.ts +50 -0
  559. package/dist/server/ssr-wrappers.d.ts.map +1 -0
  560. package/dist/server/state-tree-diff.d.ts +12 -5
  561. package/dist/server/state-tree-diff.d.ts.map +1 -1
  562. package/dist/server/status-code-resolver.d.ts +22 -11
  563. package/dist/server/status-code-resolver.d.ts.map +1 -1
  564. package/dist/server/stream-utils.d.ts +47 -0
  565. package/dist/server/stream-utils.d.ts.map +1 -0
  566. package/dist/server/tracing.d.ts +44 -9
  567. package/dist/server/tracing.d.ts.map +1 -1
  568. package/dist/server/tree-builder.d.ts +62 -30
  569. package/dist/server/tree-builder.d.ts.map +1 -1
  570. package/dist/server/tree-match.d.ts +49 -0
  571. package/dist/server/tree-match.d.ts.map +1 -0
  572. package/dist/server/types.d.ts +71 -6
  573. package/dist/server/types.d.ts.map +1 -1
  574. package/dist/server/utils/escape-html.d.ts +14 -0
  575. package/dist/server/utils/escape-html.d.ts.map +1 -0
  576. package/dist/server/utils/mdx-file.d.ts +15 -0
  577. package/dist/server/utils/mdx-file.d.ts.map +1 -0
  578. package/dist/server/version-skew.d.ts +61 -0
  579. package/dist/server/version-skew.d.ts.map +1 -0
  580. package/dist/server/workers-cache-bridge.d.ts +26 -0
  581. package/dist/server/workers-cache-bridge.d.ts.map +1 -0
  582. package/dist/shared/href-validation.d.ts +49 -0
  583. package/dist/shared/href-validation.d.ts.map +1 -0
  584. package/dist/shared/merge-search-params.d.ts +22 -0
  585. package/dist/shared/merge-search-params.d.ts.map +1 -0
  586. package/dist/shared/redirect-type.d.ts +17 -0
  587. package/dist/shared/redirect-type.d.ts.map +1 -0
  588. package/dist/shims/font-google.d.ts +1 -1
  589. package/dist/shims/font-google.d.ts.map +1 -1
  590. package/dist/shims/font-google.js +42 -0
  591. package/dist/shims/font-google.js.map +1 -0
  592. package/dist/shims/font-local.d.ts +26 -0
  593. package/dist/shims/font-local.d.ts.map +1 -0
  594. package/dist/shims/font-local.js +20 -0
  595. package/dist/shims/font-local.js.map +1 -0
  596. package/dist/shims/headers.d.ts +53 -1
  597. package/dist/shims/headers.d.ts.map +1 -1
  598. package/dist/shims/image.d.ts +16 -16
  599. package/dist/shims/navigation-client.d.ts +35 -11
  600. package/dist/shims/navigation-client.d.ts.map +1 -1
  601. package/dist/shims/navigation.d.ts +11 -5
  602. package/dist/shims/navigation.d.ts.map +1 -1
  603. package/dist/utils/state-machine.d.ts +80 -0
  604. package/dist/utils/state-machine.d.ts.map +1 -0
  605. package/docs/api/30-api-server.mdx +233 -0
  606. package/docs/api/31-api-client.mdx +161 -0
  607. package/docs/api/32-api-cache.mdx +199 -0
  608. package/docs/api/33-api-search-params.mdx +141 -0
  609. package/docs/api/34-api-config.mdx +189 -0
  610. package/docs/api/35-api-typescript.mdx +170 -0
  611. package/docs/api/36-cli.mdx +143 -0
  612. package/docs/learn/00-introduction.mdx +76 -0
  613. package/docs/learn/01-quick-start.mdx +94 -0
  614. package/docs/learn/02-pages-and-layouts.mdx +147 -0
  615. package/docs/learn/03-fetching-data.mdx +211 -0
  616. package/docs/learn/03b-access-control.mdx +130 -0
  617. package/docs/learn/04-loading-states.mdx +67 -0
  618. package/docs/learn/04b-the-flush-point.mdx +115 -0
  619. package/docs/learn/05-typed-params.mdx +275 -0
  620. package/docs/learn/06-forms-and-actions.mdx +146 -0
  621. package/docs/learn/07-typed-routes.mdx +127 -0
  622. package/docs/learn/08-streaming.mdx +146 -0
  623. package/docs/learn/09-caching.mdx +136 -0
  624. package/docs/learn/10-middleware.mdx +157 -0
  625. package/docs/learn/11-error-handling.mdx +156 -0
  626. package/docs/learn/12-client-navigation.mdx +168 -0
  627. package/docs/learn/13-configuration.mdx +145 -0
  628. package/docs/learn/14-deploying.mdx +264 -0
  629. package/docs/more/01-advanced-routing.mdx +139 -0
  630. package/docs/more/02-advanced-forms.mdx +137 -0
  631. package/docs/more/03-coming-from-nextjs.mdx +186 -0
  632. package/docs/more/04-metadata-and-fonts.mdx +193 -0
  633. package/docs/more/04b-mdx.mdx +209 -0
  634. package/docs/more/05-content-collections.mdx +90 -0
  635. package/docs/more/06-instrumentation.mdx +214 -0
  636. package/docs/more/07-security.mdx +129 -0
  637. package/docs/more/08-developer-experience.mdx +134 -0
  638. package/docs/more/40-why-timber.mdx +50 -0
  639. package/docs/more/41-timber-vs-nextjs.mdx +81 -0
  640. package/docs/more/42-timber-vs-others.mdx +68 -0
  641. package/docs/more/50-ai-agent-instructions.mdx +169 -0
  642. package/llms.txt +55 -0
  643. package/package.json +103 -26
  644. package/src/adapters/build-output-helper.ts +199 -0
  645. package/src/adapters/cloudflare-dev.ts +177 -0
  646. package/src/adapters/cloudflare-kv-cache.ts +179 -0
  647. package/src/adapters/cloudflare.ts +571 -118
  648. package/src/adapters/compress-module.ts +27 -92
  649. package/src/adapters/nitro.ts +131 -107
  650. package/src/adapters/raw-imports.d.ts +5 -0
  651. package/src/adapters/shared.ts +68 -0
  652. package/src/adapters/types.ts +0 -7
  653. package/src/adapters/wrangler.d.ts +7 -0
  654. package/src/cache/cache-api.ts +107 -0
  655. package/src/cache/handler-store.ts +76 -0
  656. package/src/cache/index.ts +88 -18
  657. package/src/cache/invalidation-epoch.ts +93 -0
  658. package/src/cache/redis-handler.ts +122 -15
  659. package/src/cache/singleflight.ts +64 -6
  660. package/src/cache/sizeof.ts +33 -0
  661. package/src/cache/stable-stringify.ts +65 -2
  662. package/src/cache/store.ts +71 -0
  663. package/src/cache/stores/cloudflare-kv.ts +52 -0
  664. package/src/cache/stores/memory.ts +125 -0
  665. package/src/cache/stores/redis.ts +97 -0
  666. package/src/cache/stores/vercel.ts +59 -0
  667. package/src/cache/tag-aware-handler.ts +233 -0
  668. package/src/cache/timber-cache.ts +142 -36
  669. package/src/cdn/cloudflare-purge.ts +50 -0
  670. package/src/cdn/fastly-purge.ts +63 -0
  671. package/src/cdn/headers.ts +153 -0
  672. package/src/cdn/index.ts +17 -0
  673. package/src/cdn/purge-store.ts +34 -0
  674. package/src/cdn/workers-cache-purge.ts +30 -0
  675. package/src/cli-schema-sync.ts +388 -0
  676. package/src/cli.ts +157 -34
  677. package/src/client/browser-dev.ts +156 -1
  678. package/src/client/browser-entry/action-dispatch.ts +124 -0
  679. package/src/client/browser-entry/hmr.ts +70 -0
  680. package/src/client/browser-entry/hydrate.ts +187 -0
  681. package/src/client/browser-entry/index.ts +111 -0
  682. package/src/client/browser-entry/post-hydration.ts +103 -0
  683. package/src/client/browser-entry/router-init.ts +287 -0
  684. package/src/client/browser-entry/rsc-stream.ts +157 -0
  685. package/src/client/browser-entry/scroll.ts +50 -0
  686. package/src/client/child-segment-context.ts +40 -0
  687. package/src/client/child-segment-outlet.tsx +25 -0
  688. package/src/client/child-segment-provider.tsx +27 -0
  689. package/src/client/error-boundary.tsx +127 -22
  690. package/src/client/error-reconstituter.tsx +79 -0
  691. package/src/client/form.tsx +31 -32
  692. package/src/client/history.ts +11 -7
  693. package/src/client/index.ts +67 -45
  694. package/src/client/internal.ts +58 -0
  695. package/src/client/link.tsx +346 -150
  696. package/src/client/navigation-api.ts +341 -0
  697. package/src/client/navigation-context.ts +15 -7
  698. package/src/client/navigation-root.tsx +355 -0
  699. package/src/client/nuqs-adapter.tsx +16 -3
  700. package/src/client/router-ref.ts +1 -1
  701. package/src/client/router.ts +482 -166
  702. package/src/client/rsc-fetch.ts +214 -33
  703. package/src/client/segment-cache.ts +7 -7
  704. package/src/client/segment-outlet.tsx +77 -0
  705. package/src/client/segment-update-context.ts +42 -0
  706. package/src/client/shallow-url.ts +22 -0
  707. package/src/client/ssr-data.ts +13 -5
  708. package/src/client/state.ts +2 -2
  709. package/src/client/top-loader.tsx +11 -9
  710. package/src/client/use-cookie.ts +60 -15
  711. package/src/client/use-link-status.ts +7 -7
  712. package/src/client/use-pathname.ts +1 -0
  713. package/src/client/use-pending-navigation.ts +40 -0
  714. package/src/client/use-query-states.ts +9 -3
  715. package/src/client/use-router.ts +4 -1
  716. package/src/client/use-search-params.ts +31 -44
  717. package/src/client/{use-params.ts → use-segment-params.ts} +9 -6
  718. package/src/codec.ts +147 -0
  719. package/src/config-types.ts +302 -0
  720. package/src/config-validation.ts +328 -0
  721. package/src/content/index.ts +5 -13
  722. package/src/cookies/define-cookie.ts +217 -53
  723. package/src/cookies/index.ts +12 -1
  724. package/src/cookies/json-cookie.ts +105 -0
  725. package/src/cookies/validation.ts +192 -0
  726. package/src/dev-tools/404-page.ts +286 -0
  727. package/src/dev-tools/browser-logs.ts +55 -0
  728. package/src/dev-tools/dev-page-shell.ts +260 -0
  729. package/src/dev-tools/error-page.ts +331 -0
  730. package/src/dev-tools/holding-server.ts +187 -0
  731. package/src/dev-tools/hydration-overlay.ts +158 -0
  732. package/src/dev-tools/index.ts +83 -0
  733. package/src/dev-tools/instrumentation.ts +213 -0
  734. package/src/{server/dev-logger.ts → dev-tools/logger.ts} +33 -51
  735. package/src/{plugins/dev-logs.ts → dev-tools/logs.ts} +9 -5
  736. package/src/dev-tools/overlay.ts +469 -0
  737. package/src/dev-tools/stack-classifier.ts +75 -0
  738. package/src/dev-tools/terminal.ts +182 -0
  739. package/src/fonts/ast-walk.ts +235 -0
  740. package/src/fonts/ast.ts +477 -126
  741. package/src/fonts/bundle.ts +138 -0
  742. package/src/fonts/dev-middleware.ts +85 -0
  743. package/src/fonts/fallbacks.ts +0 -23
  744. package/src/fonts/google.ts +63 -8
  745. package/src/fonts/local.ts +9 -8
  746. package/src/fonts/paths.ts +58 -0
  747. package/src/fonts/pipeline.ts +316 -0
  748. package/src/fonts/transform.ts +305 -0
  749. package/src/fonts/types.ts +52 -1
  750. package/src/fonts/virtual-modules.ts +179 -0
  751. package/src/index.ts +431 -352
  752. package/src/params/codec-registry.ts +34 -0
  753. package/src/params/define-schema.ts +115 -0
  754. package/src/params/index.ts +17 -0
  755. package/src/params/resolve-schema.ts +84 -0
  756. package/src/plugin-context.ts +378 -0
  757. package/src/plugins/adapter-build.ts +98 -4
  758. package/src/plugins/build-manifest.ts +168 -23
  759. package/src/plugins/build-report.ts +253 -35
  760. package/src/plugins/cache.ts +229 -0
  761. package/src/plugins/callsite-ast.ts +472 -0
  762. package/src/plugins/callsite-jsx.ts +243 -0
  763. package/src/plugins/chunks.ts +74 -5
  764. package/src/plugins/client-chunks.ts +144 -0
  765. package/src/plugins/cloudflare-wasm.ts +141 -0
  766. package/src/plugins/content.ts +1 -1
  767. package/src/plugins/dev-server.ts +293 -46
  768. package/src/plugins/entries.ts +129 -8
  769. package/src/plugins/fonts.ts +199 -664
  770. package/src/plugins/mdx.ts +47 -10
  771. package/src/plugins/prebuilt-capture.ts +217 -0
  772. package/src/plugins/prebuilt.ts +700 -0
  773. package/src/plugins/prerender-sugar.ts +329 -0
  774. package/src/plugins/routing.ts +237 -241
  775. package/src/plugins/server-bundle.ts +97 -12
  776. package/src/plugins/shims.ts +241 -64
  777. package/src/plugins/static-build.ts +15 -90
  778. package/src/routing/codegen-shared.ts +115 -0
  779. package/src/routing/codegen-types.ts +65 -0
  780. package/src/routing/codegen.ts +360 -178
  781. package/src/routing/convention-lint.ts +394 -0
  782. package/src/routing/export-detect.ts +304 -0
  783. package/src/routing/file-cache.ts +23 -0
  784. package/src/routing/index.ts +10 -1
  785. package/src/routing/interception.ts +3 -22
  786. package/src/routing/link-codegen.ts +310 -0
  787. package/src/routing/manifest-codegen.ts +281 -0
  788. package/src/routing/scanner.ts +248 -188
  789. package/src/routing/schema-validation.ts +149 -0
  790. package/src/routing/segment-classify.ts +188 -0
  791. package/src/routing/segment-codegen.ts +98 -0
  792. package/src/routing/types.ts +78 -25
  793. package/src/routing/walkers.ts +90 -0
  794. package/src/rsc-runtime/rsc.ts +9 -0
  795. package/src/rsc-runtime/ssr.ts +50 -0
  796. package/src/rsc-runtime/vendor-types.d.ts +7 -0
  797. package/src/schema-bridge.ts +252 -0
  798. package/src/search-params/define.ts +570 -0
  799. package/src/search-params/index.ts +14 -20
  800. package/src/search-params/registry.ts +2 -2
  801. package/src/search-params/wrappers.ts +110 -0
  802. package/src/segment-params/define.ts +249 -0
  803. package/src/segment-params/index.ts +9 -0
  804. package/src/server/access-gate.tsx +84 -34
  805. package/src/server/action-client.ts +119 -28
  806. package/src/server/action-encryption.ts +144 -0
  807. package/src/server/action-handler.ts +123 -33
  808. package/src/server/actions.ts +48 -54
  809. package/src/server/als-registry.ts +130 -20
  810. package/src/server/asset-headers.ts +15 -37
  811. package/src/server/body-limits.ts +10 -2
  812. package/src/server/build-manifest.ts +13 -56
  813. package/src/server/canonicalize.ts +6 -3
  814. package/src/server/coalesce-tick.ts +75 -0
  815. package/src/server/compress.ts +34 -7
  816. package/src/server/cookie-context.ts +484 -0
  817. package/src/server/cookie-parsing.ts +163 -0
  818. package/src/server/csrf.ts +39 -6
  819. package/src/server/default-logger.ts +99 -0
  820. package/src/server/deny-boundary.ts +311 -0
  821. package/src/server/deny-renderer.ts +85 -77
  822. package/src/server/dev-source-map.ts +31 -0
  823. package/src/server/early-hints-sender.ts +3 -2
  824. package/src/server/early-hints.ts +37 -27
  825. package/src/server/error-boundary-wrapper.ts +61 -22
  826. package/src/server/fallback-error.ts +79 -102
  827. package/src/server/flight-injection-state.ts +113 -0
  828. package/src/server/flight-scripts.ts +62 -0
  829. package/src/server/form-data.ts +124 -12
  830. package/src/server/html-injector-core.ts +437 -0
  831. package/src/server/html-injectors.ts +267 -254
  832. package/src/server/index.ts +31 -185
  833. package/src/server/internal.ts +181 -0
  834. package/src/server/logger.ts +72 -36
  835. package/src/server/metadata-routes.ts +44 -19
  836. package/src/server/middleware-runner.ts +75 -4
  837. package/src/server/node-stream-transforms.ts +331 -0
  838. package/src/server/param-coercion.ts +206 -0
  839. package/src/server/pipeline-helpers.ts +204 -0
  840. package/src/server/pipeline-interception.ts +32 -18
  841. package/src/server/pipeline-metadata.ts +14 -0
  842. package/src/server/pipeline-outcome.ts +197 -0
  843. package/src/server/pipeline-phases.ts +538 -0
  844. package/src/server/pipeline.ts +226 -382
  845. package/src/server/port-resolution.ts +215 -0
  846. package/src/server/prebuilt/cache-key.ts +224 -0
  847. package/src/server/prebuilt/capture-state.ts +89 -0
  848. package/src/server/prebuilt/manifest-tag-index.ts +46 -0
  849. package/src/server/prebuilt/overlay.ts +256 -0
  850. package/src/server/prebuilt/payload-source.ts +201 -0
  851. package/src/server/prebuilt/synthetic-store.ts +121 -0
  852. package/src/server/prebuilt-builder.ts +774 -0
  853. package/src/server/prebuilt-runtime.ts +731 -0
  854. package/src/server/primitives.ts +160 -83
  855. package/src/server/render-timeout.ts +108 -0
  856. package/src/server/render-utils.ts +31 -0
  857. package/src/server/request-context.ts +168 -337
  858. package/src/server/route-element-builder.ts +548 -233
  859. package/src/server/route-handler.ts +31 -4
  860. package/src/server/route-matcher.ts +144 -277
  861. package/src/server/rsc-entry/action-middleware-runner.ts +167 -0
  862. package/src/server/rsc-entry/api-handler.ts +69 -32
  863. package/src/server/rsc-entry/error-renderer.ts +306 -89
  864. package/src/server/rsc-entry/helpers.ts +160 -76
  865. package/src/server/rsc-entry/index.ts +394 -330
  866. package/src/server/rsc-entry/render-route.ts +288 -0
  867. package/src/server/rsc-entry/revalidate-renderer.ts +349 -0
  868. package/src/server/rsc-entry/rsc-payload.ts +74 -35
  869. package/src/server/rsc-entry/rsc-stream.ts +85 -13
  870. package/src/server/rsc-entry/ssr-bridge.ts +18 -5
  871. package/src/server/rsc-entry/ssr-renderer.ts +273 -43
  872. package/src/server/rsc-entry/wrap-action-dispatch.ts +449 -0
  873. package/src/server/safe-load.ts +60 -0
  874. package/src/server/sensitive-fields.ts +230 -0
  875. package/src/server/server-only-guard-noop.js +3 -0
  876. package/src/server/sitemap-generator.ts +344 -0
  877. package/src/server/sitemap-handler.ts +157 -0
  878. package/src/server/slot-resolver.ts +258 -257
  879. package/src/server/ssr-bridge-types.ts +124 -0
  880. package/src/server/ssr-entry.ts +206 -78
  881. package/src/server/ssr-render.ts +345 -82
  882. package/src/server/ssr-wrappers.tsx +141 -0
  883. package/src/server/state-tree-diff.ts +30 -23
  884. package/src/server/status-code-resolver.ts +115 -130
  885. package/src/server/stream-utils.ts +286 -0
  886. package/src/server/tracing.ts +126 -14
  887. package/src/server/tree-builder.ts +204 -90
  888. package/src/server/tree-match.ts +220 -0
  889. package/src/server/types.ts +78 -9
  890. package/src/server/utils/escape-html.ts +20 -0
  891. package/src/server/utils/mdx-file.ts +22 -0
  892. package/src/server/version-skew.ts +104 -0
  893. package/src/server/workers-cache-bridge.ts +33 -0
  894. package/src/shared/href-validation.ts +159 -0
  895. package/src/shared/merge-search-params.ts +55 -0
  896. package/src/shared/redirect-type.ts +17 -0
  897. package/src/shims/font-google.ts +1 -1
  898. package/src/shims/font-local.ts +34 -0
  899. package/src/shims/headers.ts +122 -1
  900. package/src/shims/navigation-client.ts +51 -29
  901. package/src/shims/navigation.ts +14 -7
  902. package/src/utils/state-machine.ts +111 -0
  903. package/dist/_chunks/als-registry-B7DbZ2hS.js +0 -41
  904. package/dist/_chunks/als-registry-B7DbZ2hS.js.map +0 -1
  905. package/dist/_chunks/debug-B3Gypr3D.js +0 -108
  906. package/dist/_chunks/debug-B3Gypr3D.js.map +0 -1
  907. package/dist/_chunks/format-RyoGQL74.js +0 -164
  908. package/dist/_chunks/format-RyoGQL74.js.map +0 -1
  909. package/dist/_chunks/interception-BOoWmLUA.js +0 -676
  910. package/dist/_chunks/interception-BOoWmLUA.js.map +0 -1
  911. package/dist/_chunks/metadata-routes-Cjmvi3rQ.js.map +0 -1
  912. package/dist/_chunks/request-context-BQUC8PHn.js +0 -330
  913. package/dist/_chunks/request-context-BQUC8PHn.js.map +0 -1
  914. package/dist/_chunks/ssr-data-MjmprTmO.js.map +0 -1
  915. package/dist/_chunks/tracing-CemImE6h.js +0 -187
  916. package/dist/_chunks/tracing-CemImE6h.js.map +0 -1
  917. package/dist/_chunks/use-cookie-DX-l1_5E.js +0 -91
  918. package/dist/_chunks/use-cookie-DX-l1_5E.js.map +0 -1
  919. package/dist/_chunks/use-query-states-D5KaffOK.js.map +0 -1
  920. package/dist/cache/index.js.map +0 -1
  921. package/dist/cache/register-cached-function.d.ts +0 -17
  922. package/dist/cache/register-cached-function.d.ts.map +0 -1
  923. package/dist/client/browser-entry.d.ts +0 -21
  924. package/dist/client/browser-entry.d.ts.map +0 -1
  925. package/dist/client/head.d.ts +0 -16
  926. package/dist/client/head.d.ts.map +0 -1
  927. package/dist/client/link-status-provider.d.ts +0 -11
  928. package/dist/client/link-status-provider.d.ts.map +0 -1
  929. package/dist/client/segment-merger.d.ts +0 -119
  930. package/dist/client/segment-merger.d.ts.map +0 -1
  931. package/dist/client/stale-reload.d.ts +0 -44
  932. package/dist/client/stale-reload.d.ts.map +0 -1
  933. package/dist/client/transition-root.d.ts +0 -74
  934. package/dist/client/transition-root.d.ts.map +0 -1
  935. package/dist/client/use-navigation-pending.d.ts +0 -26
  936. package/dist/client/use-navigation-pending.d.ts.map +0 -1
  937. package/dist/client/use-params.d.ts.map +0 -1
  938. package/dist/plugins/cache-transform.d.ts +0 -36
  939. package/dist/plugins/cache-transform.d.ts.map +0 -1
  940. package/dist/plugins/dev-error-overlay.d.ts +0 -60
  941. package/dist/plugins/dev-error-overlay.d.ts.map +0 -1
  942. package/dist/plugins/dev-logs.d.ts.map +0 -1
  943. package/dist/plugins/dynamic-transform.d.ts +0 -72
  944. package/dist/plugins/dynamic-transform.d.ts.map +0 -1
  945. package/dist/plugins/server-action-exports.d.ts +0 -26
  946. package/dist/plugins/server-action-exports.d.ts.map +0 -1
  947. package/dist/routing/status-file-lint.d.ts +0 -33
  948. package/dist/routing/status-file-lint.d.ts.map +0 -1
  949. package/dist/search-params/analyze.d.ts +0 -54
  950. package/dist/search-params/analyze.d.ts.map +0 -1
  951. package/dist/search-params/builtin-codecs.d.ts +0 -105
  952. package/dist/search-params/builtin-codecs.d.ts.map +0 -1
  953. package/dist/search-params/codecs.d.ts +0 -53
  954. package/dist/search-params/codecs.d.ts.map +0 -1
  955. package/dist/search-params/create.d.ts +0 -106
  956. package/dist/search-params/create.d.ts.map +0 -1
  957. package/dist/server/client-module-map.d.ts +0 -47
  958. package/dist/server/client-module-map.d.ts.map +0 -1
  959. package/dist/server/dev-fetch-instrumentation.d.ts +0 -22
  960. package/dist/server/dev-fetch-instrumentation.d.ts.map +0 -1
  961. package/dist/server/dev-logger.d.ts.map +0 -1
  962. package/dist/server/dev-span-processor.d.ts +0 -29
  963. package/dist/server/dev-span-processor.d.ts.map +0 -1
  964. package/dist/server/dev-warnings.d.ts +0 -129
  965. package/dist/server/dev-warnings.d.ts.map +0 -1
  966. package/dist/server/flush.d.ts +0 -74
  967. package/dist/server/flush.d.ts.map +0 -1
  968. package/dist/server/manifest-status-resolver.d.ts +0 -58
  969. package/dist/server/manifest-status-resolver.d.ts.map +0 -1
  970. package/dist/server/prerender.d.ts +0 -77
  971. package/dist/server/prerender.d.ts.map +0 -1
  972. package/dist/utils/directive-parser.d.ts +0 -70
  973. package/dist/utils/directive-parser.d.ts.map +0 -1
  974. package/src/cache/register-cached-function.ts +0 -103
  975. package/src/client/browser-entry.ts +0 -678
  976. package/src/client/head.ts +0 -61
  977. package/src/client/link-status-provider.tsx +0 -30
  978. package/src/client/segment-merger.ts +0 -339
  979. package/src/client/stale-reload.ts +0 -87
  980. package/src/client/transition-root.tsx +0 -166
  981. package/src/client/use-navigation-pending.ts +0 -38
  982. package/src/plugins/cache-transform.ts +0 -199
  983. package/src/plugins/dev-error-overlay.ts +0 -230
  984. package/src/plugins/dynamic-transform.ts +0 -161
  985. package/src/plugins/server-action-exports.ts +0 -220
  986. package/src/routing/status-file-lint.ts +0 -112
  987. package/src/search-params/analyze.ts +0 -192
  988. package/src/search-params/builtin-codecs.ts +0 -228
  989. package/src/search-params/codecs.ts +0 -153
  990. package/src/search-params/create.ts +0 -321
  991. package/src/server/client-module-map.ts +0 -58
  992. package/src/server/dev-fetch-instrumentation.ts +0 -96
  993. package/src/server/dev-span-processor.ts +0 -78
  994. package/src/server/dev-warnings.ts +0 -283
  995. package/src/server/flush.ts +0 -182
  996. package/src/server/manifest-status-resolver.ts +0 -215
  997. package/src/server/prerender.ts +0 -139
  998. package/src/utils/directive-parser.ts +0 -529
@@ -17,57 +17,56 @@
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';
59
- import {
60
- buildRedirectResponse,
61
- createDebugChannelSink,
62
- escapeHtml,
63
- isRscPayloadRequest,
64
- } 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';
31
+ // @ts-expect-error — virtual module provided by timber-entries plugin
32
+ import loadCacheHandler from 'virtual:timber-cache-handler';
33
+ // @ts-expect-error — virtual module provided by timber-entries plugin
34
+ import { loadCdnPurgeHandler } from 'virtual:timber-cache-handler';
35
+ // @ts-expect-error — virtual module provided by timber-routing plugin
36
+ import globalSchemaCodecs from 'virtual:timber-schema';
37
+
38
+ import { wrapPipelineWithActionDispatch } from './wrap-action-dispatch.js';
39
+ import type { BodyLimitsConfig } from '../body-limits.js';
40
+ import type { BuildManifest } from '../build-manifest.js';
41
+ import type { LayoutEntry } from '../deny-renderer.js';
42
+ import { renderDenyPage, renderDenyPageAsRsc } from '../deny-renderer.js';
43
+ import { resolveLogMode } from '../../dev-tools/logger.js';
44
+ import { sendEarlyHints103 } from '../early-hints-sender.js';
45
+ import { collectEarlyHintHeaders } from '../early-hints.js';
46
+ import { buildClientScripts } from '../html-injectors.js';
47
+ import type { InterceptionContext, PipelineConfig, RouteMatch } from '../pipeline.js';
48
+ import { createPipeline } from '../pipeline.js';
49
+ import { coerceSegmentParams, setGlobalSchemaCodecs } from '../param-coercion.js';
50
+ import type { ManifestSegmentNode } from '../route-matcher.js';
51
+ import { createMetadataRouteMatcher, createRouteMatcher } from '../route-matcher.js';
52
+ import { initDevTracing } from '../tracing.js';
53
+ import { createRevalidateRendererFactory } from './revalidate-renderer.js';
54
+
55
+ import { renderFallbackError as renderFallback } from '../fallback-error.js';
56
+ import { loadInstrumentation } from '../instrumentation.js';
57
+ import { loadModule } from '../safe-load.js';
58
+ import { logRenderError } from '../logger.js';
59
+ import { renderNoMatchPage } from './error-renderer.js';
60
+ import { createDebugChannelSink, isRscPayloadRequest } from './helpers.js';
61
+ import { renderRoute } from './render-route.js';
69
62
  import { callSsr } from './ssr-bridge.js';
70
- import { isDebug, isDevMode, setDebugFromConfig } from '#/server/debug.js';
63
+ import { isDebug, isDevMode, setDebugFromConfig } from '../debug.js';
64
+ import { setSourceMapCallback } from '../dev-source-map.js';
65
+ import { requestContextAls } from '../als-registry.js';
66
+ import { capturePrebuiltPayloads } from '../prebuilt-builder.js';
67
+ import { setPrebuiltPayloadSource } from '../prebuilt/payload-source.js';
68
+ import { setRscFunctions, setComponentRefreshTimeout } from '../prebuilt-runtime.js';
69
+ import { createAutoSitemapHandler } from '../sitemap-handler.js';
71
70
 
72
71
  /**
73
72
  * Resolve the Server-Timing mode from timber.config.ts.
@@ -84,20 +83,24 @@ function resolveServerTimingMode(
84
83
  return isDev ? 'detailed' : 'total';
85
84
  }
86
85
 
87
- // Dev-only pipeline error handler, set by the dev server after import.
88
- // In production this is always undefined — no overhead.
89
- let _devPipelineErrorHandler: ((error: Error, phase: string) => void) | undefined;
90
-
91
86
  /**
92
- * Set the dev pipeline error handler.
87
+ * Set the dev source-map handler.
88
+ *
89
+ * Called by the dev server after importing this module to wire Vite's
90
+ * module graph source-mapping into the error rendering pipeline. Errors
91
+ * rendered by renderErrorPage / renderFallbackError will have their
92
+ * stack traces rewritten to show original source positions.
93
93
  *
94
- * Called by the dev server after importing this module to wire pipeline
95
- * errors into the Vite browser error overlay. No-op in production.
94
+ * No-op in production.
96
95
  */
97
- export function setDevPipelineErrorHandler(handler: (error: Error, phase: string) => void): void {
98
- _devPipelineErrorHandler = handler;
96
+ export function setDevSourceMapHandler(handler: (error: Error) => void): void {
97
+ setSourceMapCallback(handler);
99
98
  }
100
99
 
100
+ // Dev-only: debug components getter is stored per-request in ALS
101
+ // (RequestContextStore.debugComponentsGetter) to avoid cross-request
102
+ // race conditions. See TIM-557.
103
+
101
104
  /**
102
105
  * Create the RSC request handler from the route manifest.
103
106
  *
@@ -105,21 +108,84 @@ export function setDevPipelineErrorHandler(handler: (error: Error, phase: string
105
108
  * 103 Early Hints → middleware.ts → render (RSC → SSR → HTML).
106
109
  */
107
110
  async function createRequestHandler(manifest: typeof routeManifest, runtimeConfig: typeof config) {
108
- // Load the user's instrumentation.ts — register() is awaited before the
109
- // server accepts any requests. The logger and onRequestError hooks are
110
- // wired into the framework. This runs once at startup.
111
- // See design/17-logging.md §"register() — Server Startup"
112
- await loadInstrumentation(loadUserInstrumentation);
113
-
114
- // Initialize cookie signing secrets from config (design/29-cookies.md §"Signed Cookies")
115
- const cookieSecrets = (runtimeConfig as Record<string, unknown>).cookieSecrets as
116
- | string[]
111
+ // Initialize deployment ID for version skew detection (TIM-446).
112
+ // The manifest init module sets globalThis.__TIMBER_DEPLOYMENT_ID__ at startup.
113
+ // In dev mode this is undefined — skew checks are skipped.
114
+ const deploymentId = (globalThis as Record<string, unknown>).__TIMBER_DEPLOYMENT_ID__ as
115
+ | string
117
116
  | undefined;
118
- if (cookieSecrets?.length) {
119
- const { setCookieSecrets } = await import('#/server/request-context.js');
120
- setCookieSecrets(cookieSecrets);
117
+ if (deploymentId) {
118
+ const { setDeploymentId } = await import('../version-skew.js');
119
+ setDeploymentId(deploymentId);
120
+ }
121
+
122
+ // Wire the CDN purge handler so revalidateTag triggers CDN purge (TIM-1166).
123
+ const userCdnPurge = await loadCdnPurgeHandler();
124
+ if (userCdnPurge) {
125
+ const { setCdnPurgeHandler } = await import('../../cdn/purge-store.js');
126
+ setCdnPurgeHandler(userCdnPurge as Parameters<typeof setCdnPurgeHandler>[0]);
127
+ } else if (typeof process !== 'undefined' && process.env?.TIMBER_RUNTIME === 'cloudflare') {
128
+ // Auto-wire Workers Cache purge on Cloudflare — no API token needed,
129
+ // available on all plans via ctx.cache.purge({ tags }) (TIM-1170).
130
+ const { WorkersCachePurge } = await import('../../cdn/workers-cache-purge.js');
131
+ const { setCdnPurgeHandler } = await import('../../cdn/purge-store.js');
132
+ setCdnPurgeHandler(new WorkersCachePurge());
133
+ }
134
+
135
+ // Wire the prebuilt payload source so cache.component wrappers can look
136
+ // up cached flight payloads at request time (TIM-1122). The source is
137
+ // platform-aware: Node/Nitro reads from disk; Cloudflare reads from
138
+ // static assets via globalThis.__TIMBER_PREBUILT_SOURCE__ (set by the
139
+ // generated _worker.js before this module loads).
140
+ // In dev mode there are no prebuilt artifacts — source stays null and
141
+ // all cache.component wrappers render dynamically.
142
+ if (!isDevMode()) {
143
+ const platformSource = (globalThis as Record<string, unknown>).__TIMBER_PREBUILT_SOURCE__ as
144
+ | import('../prebuilt/payload-source.js').PrebuiltPayloadSource
145
+ | undefined;
146
+ if (platformSource) {
147
+ setPrebuiltPayloadSource(platformSource);
148
+ } else {
149
+ // Default: Node/fs-based source — prebuilt/ is alongside rsc/ in the
150
+ // adapter output directory, so resolve relative to this entry.
151
+ try {
152
+ const { readFile: fsReadFile } = await import('node:fs/promises');
153
+ const { join: pathJoin, dirname } = await import('node:path');
154
+ const { fileURLToPath } = await import('node:url');
155
+ const entryDir = dirname(fileURLToPath(import.meta.url));
156
+ const prebuiltDir = pathJoin(entryDir, '..', 'prebuilt');
157
+ setPrebuiltPayloadSource({
158
+ async loadManifest() {
159
+ try {
160
+ const data = await fsReadFile(pathJoin(prebuiltDir, 'manifest.json'), 'utf-8');
161
+ return JSON.parse(data);
162
+ } catch {
163
+ return null;
164
+ }
165
+ },
166
+ async readPayload(file) {
167
+ try {
168
+ return await fsReadFile(pathJoin(prebuiltDir, file));
169
+ } catch {
170
+ return null;
171
+ }
172
+ },
173
+ });
174
+ } catch {
175
+ // node:fs not available (e.g. edge runtimes without the global
176
+ // override) — source stays null, wrappers render dynamically.
177
+ }
178
+ }
121
179
  }
122
180
 
181
+ // Wire RSC flight functions so prebuilt-runtime can revive cached payloads
182
+ // and capture re-renders without a dynamic import (TIM-1165).
183
+ const rscMod = await import('../../rsc-runtime/rsc.js');
184
+ setRscFunctions({
185
+ createFromReadableStream: rscMod.createFromReadableStream,
186
+ renderToReadableStream: rscMod.renderToReadableStream,
187
+ });
188
+
123
189
  const matchRoute = createRouteMatcher(manifest);
124
190
  const matchMetadataRoute = createMetadataRouteMatcher(manifest);
125
191
 
@@ -134,6 +200,7 @@ async function createRequestHandler(manifest: typeof routeManifest, runtimeConfi
134
200
  const clientBootstrap = buildClientScripts({
135
201
  ...runtimeConfig,
136
202
  clientJavascript: clientJsConfig ?? { disabled: false, enableHMRInDev: false },
203
+ devBrowserLogs: (runtimeConfig as Record<string, unknown>).devBrowserLogs as string | undefined,
137
204
  buildManifest: buildManifest as BuildManifest,
138
205
  });
139
206
 
@@ -144,6 +211,18 @@ async function createRequestHandler(manifest: typeof routeManifest, runtimeConfi
144
211
  setDebugFromConfig(true);
145
212
  }
146
213
 
214
+ // Wire the global sensitive-field stripping config so `createActionClient`
215
+ // instances in user code pick up `forms.stripSensitiveFields` from
216
+ // `timber.config.ts` without needing to plumb config through each action.
217
+ // See TIM-816 and design/08-forms-and-actions.md §"Validation errors".
218
+ const formsConfig = (runtimeConfig as Record<string, unknown>).forms as
219
+ | { stripSensitiveFields?: import('../sensitive-fields.js').SensitiveFieldsOption }
220
+ | undefined;
221
+ if (formsConfig) {
222
+ const { setGlobalSensitiveFieldsConfig } = await import('../sensitive-fields.js');
223
+ setGlobalSensitiveFieldsConfig(formsConfig.stripSensitiveFields);
224
+ }
225
+
147
226
  // Two separate flags for two different security levels:
148
227
  //
149
228
  // isDev (isDevMode) — gates client-visible behavior: dev error pages with
@@ -167,15 +246,22 @@ async function createRequestHandler(manifest: typeof routeManifest, runtimeConfi
167
246
  await initDevTracing({ mode: devLogMode, slowPhaseMs });
168
247
  // Patch globalThis.fetch to create OTEL spans for fetch calls.
169
248
  // Spans appear as children of the active component span in the dev log tree.
170
- const { instrumentDevFetch } = await import('../dev-fetch-instrumentation.js');
249
+ const { instrumentDevFetch } = await import('../../dev-tools/instrumentation.js');
171
250
  instrumentDevFetch();
172
251
  }
173
252
  }
174
253
 
175
254
  const typedBuildManifest = buildManifest as BuildManifest;
176
255
 
256
+ // The routing plugin emits `manifest.proxy = { load, filePath }` only when
257
+ // the app has an `app/proxy.ts`. Convert that to the pipeline's lazy variant
258
+ // so HMR re-imports per request; leave it undefined when there's no proxy.
259
+ const proxyConfig: PipelineConfig['proxy'] = manifest.proxy?.load
260
+ ? { kind: 'lazy', loader: manifest.proxy.load }
261
+ : undefined;
262
+
177
263
  const pipelineConfig: PipelineConfig = {
178
- proxyLoader: manifest.proxy?.load,
264
+ proxy: proxyConfig,
179
265
  matchRoute,
180
266
  matchMetadataRoute,
181
267
  // 103 Early Hints — fires after route match, before middleware.
@@ -183,11 +269,7 @@ async function createRequestHandler(manifest: typeof routeManifest, runtimeConfi
183
269
  // so the browser starts fetching critical resources while the server renders.
184
270
  // In dev mode the manifest is empty — no hints are sent.
185
271
  earlyHints: (match: RouteMatch, _req: Request, responseHeaders: Headers) => {
186
- const segments = match.segments as unknown as Array<{
187
- layout?: { filePath: string };
188
- page?: { filePath: string };
189
- }>;
190
- const headers = collectEarlyHintHeaders(segments, typedBuildManifest, {
272
+ const headers = collectEarlyHintHeaders(match.segments, typedBuildManifest, {
191
273
  skipJs: clientJsDisabled,
192
274
  });
193
275
  for (const h of headers) {
@@ -208,13 +290,47 @@ async function createRequestHandler(manifest: typeof routeManifest, runtimeConfi
208
290
  req,
209
291
  match,
210
292
  responseHeaders,
211
- clientBootstrap,
212
- clientJsDisabled,
293
+ {
294
+ clientBootstrap,
295
+ clientJsDisabled,
296
+ rootSegment: manifest.root,
297
+ buildManifest: typedBuildManifest,
298
+ globalError: manifest.globalError,
299
+ },
213
300
  interception
214
301
  );
215
302
  },
216
303
  renderNoMatch: async (req: Request, responseHeaders: Headers) => {
217
- return renderNoMatchPage(req, manifest.root, responseHeaders, clientBootstrap);
304
+ const response = await renderNoMatchPage(
305
+ req,
306
+ manifest.root,
307
+ responseHeaders,
308
+ clientBootstrap
309
+ );
310
+
311
+ // In dev mode, if the pipeline returned a bare 404 (no body — meaning
312
+ // no user-defined 404.tsx was found), replace it with a helpful dev
313
+ // page that lists available routes and suggests similar paths.
314
+ // Only for GET requests that accept HTML — HEAD/API/RSC clients
315
+ // should receive the bare 404 without an HTML body (TIM-793).
316
+ const acceptsHtml = (req.headers.get('accept') ?? '').includes('text/html');
317
+ if (isDev && !response.body && req.method === 'GET' && acceptsHtml) {
318
+ const { generateDev404Page, collectRoutes } = await import('../../dev-tools/404-page.js');
319
+ const routes = collectRoutes(manifest.root);
320
+ const pathname = new URL(req.url).pathname;
321
+ // devHmrOptions is set by the dev server after this module is
322
+ // imported (read at request time, not closure-capture time).
323
+ const html = generateDev404Page(pathname, routes, pipelineConfig.devHmrOptions);
324
+ return new Response(html, {
325
+ status: 404,
326
+ headers: {
327
+ ...Object.fromEntries(responseHeaders.entries()),
328
+ 'content-type': 'text/html; charset=utf-8',
329
+ },
330
+ });
331
+ }
332
+
333
+ return response;
218
334
  },
219
335
  interceptionRewrites: manifest.interceptionRewrites,
220
336
  // Slow request threshold from timber.config.ts. Default 3000ms, 0 to disable.
@@ -223,18 +339,120 @@ async function createRequestHandler(manifest: typeof routeManifest, runtimeConfi
223
339
  serverTiming: resolveServerTimingMode(runtimeConfig, isDev),
224
340
  onPipelineError: isDev
225
341
  ? (error: Error, phase: string) => {
226
- if (_devPipelineErrorHandler) _devPipelineErrorHandler(error, phase);
342
+ if (pipelineConfig.devPipelineErrorHandler) {
343
+ // For render-phase errors, include RSC debug component data
344
+ // from the Flight debug channel (if available from the current request).
345
+ const store = requestContextAls.getStore();
346
+ const debugComponents =
347
+ phase === 'render' && store?.debugComponentsGetter
348
+ ? store.debugComponentsGetter()
349
+ : undefined;
350
+ pipelineConfig.devPipelineErrorHandler(error, phase, debugComponents);
351
+ }
227
352
  }
228
353
  : undefined,
354
+
229
355
  renderFallbackError: (error, req, responseHeaders) =>
230
- renderFallback(error, req, responseHeaders, isDev, manifest.root, clientBootstrap),
356
+ renderFallback(
357
+ error,
358
+ req,
359
+ responseHeaders,
360
+ isDev,
361
+ manifest.root,
362
+ clientBootstrap,
363
+ manifest.globalError,
364
+ // Project root for dev error page frame classification.
365
+ // Not in runtimeConfig (TIM-787: leaked to client bundles).
366
+ // manifest.viteRoot is the resolved Vite root string — correct even
367
+ // when CWD differs from project root (e.g., monorepo custom root)
368
+ // (TIM-807). Passing manifest.root (segment tree object) here would
369
+ // stringify to "[object Object]" and misclassify app frames as
370
+ // internal, dropping source locations from the dev error page (TIM-808).
371
+ isDev ? manifest.viteRoot : undefined,
372
+ // HMR options for the dev error page's auto-reload WebSocket —
373
+ // set by the dev server after import, read at request time.
374
+ isDev ? pipelineConfig.devHmrOptions : undefined
375
+ ),
376
+ renderDenyFallback: async (deny, req, responseHeaders, matchedRoute) => {
377
+ // Render the deny page (403.tsx, 404.tsx, etc.) for DenySignals
378
+ // that escape from middleware or the render phase.
379
+ //
380
+ // When the pipeline already matched a route (the common case — matching
381
+ // runs before middleware and rendering), resolve the status file against
382
+ // the matched chain so colocated files like a nested `403.tsx` or an API
383
+ // route's `401.json` are picked up. Fall back to the root chain when no
384
+ // match is available (e.g. proxy-stage deny before route matching).
385
+ // See TIM-822, design/04-authorization.md, design/10-error-handling.md.
386
+ const chain: ManifestSegmentNode[] = matchedRoute ? matchedRoute.segments : [manifest.root];
387
+ const layoutComponents: LayoutEntry[] = [];
388
+ try {
389
+ for (const segment of chain) {
390
+ if (!segment.layout) continue;
391
+ const mod = await loadModule(segment.layout);
392
+ if (mod.default) {
393
+ layoutComponents.push({
394
+ component: mod.default as (...args: unknown[]) => unknown,
395
+ segment,
396
+ });
397
+ }
398
+ }
399
+ } catch (layoutError) {
400
+ // Layout failed to load — proceed without it. Partial layout chains
401
+ // are acceptable; the deny renderer wraps in whatever loaded.
402
+ logRenderError({ method: req.method, path: new URL(req.url).pathname, error: layoutError });
403
+ }
404
+ // Reuse the matched route's params/middleware metadata when present so
405
+ // downstream rendering sees the real route shape. Otherwise synthesise
406
+ // a root-only stub (no params, no middleware).
407
+ const match: RouteMatch = matchedRoute ?? {
408
+ segments: chain,
409
+ segmentParams: {},
410
+ middlewareChain: [],
411
+ };
412
+ // For client navigation (Accept: text/x-component), the timber router
413
+ // decodes the response as React Flight. Returning HTML to a Flight
414
+ // decoder breaks navigation, so dispatch to the RSC renderer when the
415
+ // request is an RSC payload request — mirroring the normal render path.
416
+ // See design/19-client-navigation.md §"RSC Payload Handling" and TIM-823.
417
+ if (isRscPayloadRequest(req)) {
418
+ return renderDenyPageAsRsc(
419
+ deny,
420
+ chain,
421
+ layoutComponents,
422
+ req,
423
+ responseHeaders,
424
+ createDebugChannelSink
425
+ );
426
+ }
427
+ return renderDenyPage(
428
+ deny,
429
+ chain,
430
+ layoutComponents,
431
+ req,
432
+ match,
433
+ responseHeaders,
434
+ clientBootstrap,
435
+ createDebugChannelSink,
436
+ callSsr
437
+ );
438
+ },
439
+ // Auto-generated sitemap handler — enabled when sitemap.enabled is true
440
+ // and no user-authored sitemap exists at the app root.
441
+ // See design/16-metadata.md §"Auto-generated Sitemap"
442
+ autoSitemapHandler: createAutoSitemapHandler(manifest.root, runtimeConfig),
231
443
  };
232
444
 
233
445
  const pipeline = createPipeline(pipelineConfig);
234
446
 
235
- // Wrap the pipeline to intercept server action requests before rendering.
236
- // Actions bypass the normal pipeline (no route matching, no middleware)
237
- // per design/08-forms-and-actions.md §"Middleware for Server Actions".
447
+ // Wrap the pipeline to enforce CSRF at the request boundary and intercept
448
+ // server action requests. By default, the wrapper also runs the matched
449
+ // route's `middleware.ts` chain on action POSTs, so authentication, rate
450
+ // limiting, tenant isolation, and request-header injection apply to
451
+ // actions just like they do to page renders. See TIM-871 and
452
+ // design/08-forms-and-actions.md §"Middleware for Server Actions".
453
+ //
454
+ // CSRF validation lives in the wrapper (not inside the action handler) so
455
+ // it covers route.ts API handlers as well as server actions. See LOCAL-773.
238
456
  const csrfConfig = {
239
457
  csrf: runtimeConfig.csrf,
240
458
  allowedOrigins: (runtimeConfig as Record<string, unknown>).allowedOrigins as
@@ -242,268 +460,114 @@ async function createRequestHandler(manifest: typeof routeManifest, runtimeConfi
242
460
  | undefined,
243
461
  };
244
462
 
245
- return async (req: Request): Promise<Response> => {
246
- if (isActionRequest(req)) {
247
- const actionResponse = await handleActionRequest(req, {
248
- csrf: csrfConfig,
249
- bodyLimits: {
250
- limits: (runtimeConfig as Record<string, unknown>).limits as BodyLimitsConfig['limits'],
251
- },
252
- revalidateRenderer: async (path: string) => {
253
- // Build the React element tree for the route at `path`.
254
- // Returns the element tree (not serialized) so the action handler can
255
- // combine it with the action result in a single renderToReadableStream call.
256
- // Forward original request headers (cookies, session IDs, etc.).
257
- const revalidateHeaders = new Headers(req.headers);
258
- revalidateHeaders.set('Accept', 'text/x-component');
259
- const revalidateReq = new Request(new URL(path, req.url), {
260
- headers: revalidateHeaders,
261
- });
262
- const revalidateMatch = matchRoute(new URL(revalidateReq.url).pathname);
263
- if (!revalidateMatch) {
264
- throw new Error(`revalidatePath('${path}') — no matching route`);
265
- }
266
- const routeResult = await buildRouteElement(revalidateReq, revalidateMatch);
267
- return {
268
- element: routeResult.element,
269
- headElements: routeResult.headElements,
270
- };
271
- },
272
- });
273
- if (actionResponse) {
274
- // Check if this is a re-render signal (no-JS validation failure)
275
- if ('rerender' in actionResponse) {
276
- const formRerender = actionResponse as FormRerender;
277
- // Re-render the page with the action result as flash data.
278
- // Server components read it via getFormFlash() and pass it to
279
- // client form components as the initial useActionState value.
280
- const response = await runWithFormFlash(formRerender.rerender, () => pipeline(req));
281
- return response;
282
- }
283
- return actionResponse;
284
- }
285
- }
286
- return pipeline(req);
287
- };
288
- }
289
-
290
- /**
291
- * Render a matched route to an HTML Response via RSC → SSR pipeline,
292
- * or return a raw RSC Flight stream for client-side navigation requests.
293
- *
294
- * 1. Load page/layout components from the segment chain
295
- * 2. Resolve metadata
296
- * 3. Render to RSC Flight stream (serializes "use client" as references)
297
- * 4. If Accept: text/x-component → return RSC stream directly
298
- * Otherwise → pass RSC stream to SSR entry for HTML rendering
299
- */
300
- async function renderRoute(
301
- _req: Request,
302
- match: RouteMatch,
303
- responseHeaders: Headers,
304
- clientBootstrap: ClientBootstrapConfig,
305
- clientJsDisabled: boolean,
306
- interception?: InterceptionContext
307
- ): Promise<Response> {
308
- const segments = match.segments as unknown as ManifestSegmentNode[];
309
- const leaf = segments[segments.length - 1];
310
-
311
- // API routes (route.ts) — run access.ts standalone then dispatch to handler.
312
- // No React render pass — AccessGate is not used, React.cache is not active.
313
- // See design/04-authorization.md §"Auth in API Routes".
314
- if (leaf.route && !leaf.page) {
315
- return handleApiRoute(_req, match, segments, responseHeaders);
316
- }
317
-
318
- // Parse X-Timber-State-Tree for RSC payload requests (client navigation).
319
- // The state tree lists sync segments the client has cached — the server
320
- // skips re-rendering those layouts for a smaller, faster RSC payload.
321
- // Only used for RSC requests — HTML requests always get a full render.
322
- // See design/19-client-navigation.md §"X-Timber-State-Tree Header"
323
- const clientStateTree = isRscPayloadRequest(_req) ? parseClientStateTree(_req) : null;
324
-
325
- // Build the React element tree — loads modules, runs access checks,
326
- // resolves metadata. DenySignal/RedirectSignal propagate for HTTP handling.
327
- let routeResult;
328
- try {
329
- routeResult = await buildRouteElement(_req, match, interception, clientStateTree);
330
- } catch (error) {
331
- // RouteSignalWithContext wraps DenySignal/RedirectSignal with layout context
332
- if (error instanceof RouteSignalWithContext) {
333
- const { signal, layoutComponents: lc, segments: segs } = error;
334
- if (signal instanceof DenySignal) {
335
- if (isRscPayloadRequest(_req)) {
336
- return renderDenyPageAsRsc(
337
- signal,
338
- segs,
339
- lc as LayoutEntry[],
340
- responseHeaders,
341
- createDebugChannelSink
342
- );
343
- }
344
- return renderDenyPage(
345
- signal,
346
- segs,
347
- lc as LayoutEntry[],
348
- _req,
349
- match,
350
- responseHeaders,
351
- clientBootstrap,
352
- createDebugChannelSink,
353
- callSsr
354
- );
355
- }
356
- if (signal instanceof RedirectSignal) {
357
- return buildRedirectResponse(_req, signal, responseHeaders);
358
- }
359
- }
360
- // No PageComponent found
361
- if (error instanceof Error && error.message.startsWith('No page component')) {
362
- return new Response(null, { status: 404 });
363
- }
364
- throw error;
365
- }
463
+ const actionsConfig = (runtimeConfig as Record<string, unknown>).actions as
464
+ | { runMiddleware?: boolean }
465
+ | undefined;
366
466
 
367
- const { element, headElements, layoutComponents, deferSuspenseFor, skippedSegments } =
368
- routeResult;
467
+ const handler = wrapPipelineWithActionDispatch(pipeline, {
468
+ csrfConfig,
469
+ bodyLimits: (runtimeConfig as Record<string, unknown>).limits as BodyLimitsConfig['limits'],
470
+ sensitiveFields: formsConfig?.stripSensitiveFields,
471
+ matchRoute,
472
+ coerceSegmentParams,
473
+ renderDenyFallback: pipelineConfig.renderDenyFallback,
474
+ runMiddleware: actionsConfig?.runMiddleware,
475
+ // Thread the pipeline's `stripTrailingSlash` setting into the wrapper
476
+ // so its canonicalization step (applied before `matchRoute` for
477
+ // action POSTs) matches the page pipeline exactly. Defaults to `true`
478
+ // both here and inside the wrapper.
479
+ stripTrailingSlash: pipelineConfig.stripTrailingSlash,
480
+ // Revalidation renderer — runs the target route's `middleware.ts`
481
+ // chain BEFORE building the element tree so a server action that
482
+ // revalidates a protected path honors that path's auth, tenant
483
+ // isolation, and request-header injection. Closes the silent-bypass
484
+ // bug where `revalidatePath('/admin')` from a public action would
485
+ // serialize the admin RSC tree without ever consulting admin's
486
+ // middleware. Also validates the user-supplied `path` as a local
487
+ // root-relative URL to reject `revalidatePath('//evil.com/admin')`
488
+ // and similar scheme/authority injections. See TIM-996 and
489
+ // design/08-forms-and-actions.md §"revalidatePath()".
490
+ buildRevalidateRenderer: createRevalidateRendererFactory({
491
+ matchRoute,
492
+ coerceSegmentParams,
493
+ buildManifest: buildManifest as BuildManifest,
494
+ }),
495
+ });
369
496
 
370
- // Build head HTML for injection into the SSR output.
371
- // Collects CSS, fonts, and modulepreload from the build manifest for matched segments.
372
- // In dev mode the manifest is empty — Vite HMR handles CSS/JS.
373
- //
374
- // Link headers (for 103 Early Hints) are emitted by the earlyHints pipeline
375
- // stage before middleware runs. Here we only emit the <head> HTML fallback tags
376
- // — these ensure resources load even on platforms without Early Hints support.
377
- const typedManifest = buildManifest as BuildManifest;
378
- let headHtml = '';
379
-
380
- const cssUrls = collectRouteCss(segments, typedManifest);
381
- if (cssUrls.length > 0) {
382
- headHtml += buildCssLinkTags(cssUrls);
383
- }
497
+ return { handler, pipelineConfig };
498
+ }
384
499
 
385
- // Inline font CSS as a <style> tag — @font-face rules and scoped classes.
386
- // The font CSS is set on globalThis by the transformed font file's
387
- // side-effect import of virtual:timber-font-css-register.
388
- const fontCss = (globalThis as Record<string, unknown>).__timber_font_css as string | undefined;
389
- if (fontCss) {
390
- headHtml += `<style data-timber-fonts>${fontCss}</style>`;
391
- }
500
+ // Re-export for generated entry points (e.g., Nitro node-server/bun) to wrap
501
+ // the handler with per-request 103 Early Hints sender via ALS.
502
+ export { runWithEarlyHintsSender } from '../early-hints-sender.js';
392
503
 
393
- const fontEntries = collectRouteFonts(segments, typedManifest);
394
- if (fontEntries.length > 0) {
395
- headHtml += buildFontPreloadTags(fontEntries);
396
- }
504
+ // Re-export for generated entry points to wrap the handler with per-request
505
+ // waitUntil support via ALS. See design/11-platform.md §"waitUntil()".
506
+ export { runWithWaitUntil } from '../waituntil-bridge.js';
397
507
 
398
- // Skip modulepreload tags when client JavaScript is disabled — no JS to preload.
399
- if (!clientJsDisabled) {
400
- const preloadUrls = collectRouteModulepreloads(segments, typedManifest);
401
- if (preloadUrls.length > 0) {
402
- headHtml += buildModulepreloadTags(preloadUrls);
403
- }
404
- }
508
+ // Re-export for the Cloudflare adapter's generated _worker.js to bridge
509
+ // ctx.cache from the ExecutionContext into the per-request ALS. The
510
+ // WorkersCachePurge handler reads from this ALS to call ctx.cache.purge().
511
+ export { runWithWorkersCachePurge } from '../workers-cache-bridge.js';
405
512
 
406
- for (const el of headElements) {
407
- if (el.tag === 'title' && el.content) {
408
- headHtml += `<title>${escapeHtml(el.content)}</title>`;
409
- } else if (el.attrs) {
410
- const attrs = Object.entries(el.attrs)
411
- .filter(([, v]) => v != null)
412
- .map(([k, v]) => `${k}="${escapeHtml(v as string)}"`)
413
- .join(' ');
414
- headHtml += `<${el.tag} ${attrs}>`;
415
- }
416
- }
513
+ /**
514
+ * Post-build flight capture entry point (TIM-1119). The capture pass must
515
+ * run inside the built RSC bundle — the prebuilt component registry, the
516
+ * ALS instances, and the flight renderer are module instances in THIS
517
+ * bundle's graph; an outside import of the framework package would get
518
+ * fresh, empty copies. The timber-prebuilt plugin imports the built
519
+ * `rsc/index.js` after the 5-step build and calls this export.
520
+ * See design/44-render-at-build-time.md §Build Phase.
521
+ */
522
+ export function __timber_capturePrebuilt(
523
+ options: import('../prebuilt-builder.js').CaptureOptions
524
+ ): Promise<import('../prebuilt-builder.js').CaptureSummary> {
525
+ return capturePrebuiltPayloads(routeManifest, options);
526
+ }
417
527
 
418
- // Render to RSC Flight stream with signal tracking.
419
- const { rscStream, signals } = renderRscStream(element, _req);
528
+ // Schema codecs are needed by both the capture path (param coercion) and
529
+ // the request handler, so register them unconditionally.
530
+ setGlobalSchemaCodecs(globalSchemaCodecs);
531
+
532
+ // Singleflight timeout protects against deadlocked cache calls — needed
533
+ // in both capture mode (components may call timber.cache) and normal mode.
534
+ const renderTimeoutMs = (config as Record<string, unknown>).renderTimeoutMs as number | undefined;
535
+ if (renderTimeoutMs) {
536
+ const { setDefaultSingleflightTimeout } = await import('../../cache/timber-cache.js');
537
+ setDefaultSingleflightTimeout(renderTimeoutMs);
538
+ setComponentRefreshTimeout(renderTimeoutMs);
539
+ }
420
540
 
421
- // Synchronous redirect — redirect() in access.ts or a non-async component
422
- // throws during renderToReadableStream creation. Return HTTP redirect.
423
- if (signals.redirectSignal) {
424
- return buildRedirectResponse(_req, signals.redirectSignal, responseHeaders);
425
- }
541
+ // Run instrumentation before the capture-mode guard — components may
542
+ // depend on globals or SDKs initialized in register().
543
+ await loadInstrumentation(loadUserInstrumentation);
426
544
 
427
- // Synchronous deny — deny() in a non-async component throws during
428
- // renderToReadableStream creation, caught in the try/catch above.
429
- if (signals.denySignal) {
430
- if (isRscPayloadRequest(_req)) {
431
- return renderDenyPageAsRsc(
432
- signals.denySignal,
433
- segments,
434
- layoutComponents as LayoutEntry[],
435
- responseHeaders,
436
- createDebugChannelSink
437
- );
438
- }
439
- return renderDenyPage(
440
- signals.denySignal,
441
- segments,
442
- layoutComponents as LayoutEntry[],
443
- _req,
444
- match,
445
- responseHeaders,
446
- clientBootstrap,
447
- createDebugChannelSink,
448
- callSsr
449
- );
450
- }
545
+ // Wire the cache handler — prebuilt components may call timber.cache
546
+ // during capture and must see the configured store, not the fallback.
547
+ const userCacheHandler = await loadCacheHandler();
548
+ if (userCacheHandler) {
549
+ const { setCacheHandler } = await import('../../cache/handler-store.js');
550
+ setCacheHandler(userCacheHandler as Parameters<typeof setCacheHandler>[0]);
551
+ }
451
552
 
452
- // Synchronous render error — renderToReadableStream threw before
453
- // creating the stream. Render the error page with correct 5xx status.
454
- // (Async render errors are tracked in onError and handled after SSR.)
455
- if (signals.renderError && !rscStream) {
456
- return renderErrorPage(
457
- signals.renderError.error,
458
- signals.renderError.status,
459
- segments,
460
- layoutComponents as LayoutEntry[],
461
- _req,
462
- match,
463
- responseHeaders,
464
- clientBootstrap
465
- );
466
- }
553
+ // In capture mode the plugin only calls __timber_capturePrebuilt — skip
554
+ // the remaining production startup (CDN purge, OTEL, route matchers)
555
+ // which is expensive and unnecessary.
556
+ const isCaptureMode = !!(globalThis as Record<string, unknown>).__TIMBER_CAPTURE_MODE__;
467
557
 
468
- // For RSC payload requests (client navigation), return the RSC Flight
469
- // stream directly — skip SSR HTML rendering entirely.
470
- // See design/19-client-navigation.md §"RSC Payload Handling"
471
- if (isRscPayloadRequest(_req)) {
472
- return buildRscPayloadResponse(
473
- _req,
474
- rscStream!,
475
- signals,
476
- segments,
477
- layoutComponents,
478
- headElements,
479
- match,
480
- responseHeaders,
481
- skippedSegments
482
- );
483
- }
558
+ let _handler: ((req: Request) => Promise<Response>) | undefined;
559
+ let _pipelineConfig: PipelineConfig | undefined;
484
560
 
485
- // Pipe through SSR for HTML rendering with streaming Suspense support.
486
- return renderSsrResponse({
487
- req: _req,
488
- rscStream: rscStream!,
489
- signals,
490
- segments,
491
- layoutComponents,
492
- match,
493
- responseHeaders,
494
- clientBootstrap,
495
- clientJsDisabled,
496
- headHtml,
497
- deferSuspenseFor,
498
- });
561
+ if (!isCaptureMode) {
562
+ const result = await createRequestHandler(routeManifest, config);
563
+ _handler = result.handler;
564
+ _pipelineConfig = result.pipelineConfig;
499
565
  }
500
566
 
501
- // Re-export for generated entry points (e.g., Nitro node-server/bun) to wrap
502
- // the handler with per-request 103 Early Hints sender via ALS.
503
- export { runWithEarlyHintsSender } from '#/server/early-hints-sender.js';
504
-
505
- // Re-export for generated entry points to wrap the handler with per-request
506
- // waitUntil support via ALS. See design/11-platform.md §"waitUntil()".
507
- export { runWithWaitUntil } from '#/server/waituntil-bridge.js';
567
+ /**
568
+ * The pipeline configuration object. Exported so the dev server can set
569
+ * `devPipelineErrorHandler` after import without a module-level singleton.
570
+ */
571
+ export const pipelineConfig = _pipelineConfig!;
508
572
 
509
- export default await createRequestHandler(routeManifest, config);
573
+ export default _handler!;