@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
@@ -14,11 +14,25 @@
14
14
 
15
15
  import type { Plugin, ViteDevServer, DevEnvironment } from 'vite';
16
16
  import type { IncomingMessage, ServerResponse } from 'node:http';
17
+ import type { TLSSocket } from 'node:tls';
18
+ import { existsSync, statSync } from 'node:fs';
17
19
  import { join } from 'node:path';
18
- import type { PluginContext } from '#/index.js';
19
- import { setViteServer } from '#/server/dev-warnings.js';
20
- import { sendErrorToOverlay, classifyErrorPhase, parseFirstAppFrame } from './dev-error-overlay.js';
21
- import { compressResponse } from '#/server/compress.js';
20
+ import type { PluginContext } from '../plugin-context.js';
21
+ import {
22
+ sendErrorToOverlay,
23
+ classifyErrorPhase,
24
+ fixErrorStacktrace,
25
+ parseFirstAppFrame,
26
+ type ErrorPhase,
27
+ } from '../dev-tools/overlay.js';
28
+ import { generateDevErrorPage } from '../dev-tools/error-page.js';
29
+ import { extractHmrOptions, type DevErrorHmrOptions } from '../dev-tools/dev-page-shell.js';
30
+ import { addVirtualModuleContext } from '../config-validation.js';
31
+ import { compressResponse } from '../server/compress.js';
32
+ import { isMetadataRouteServePath } from '../server/metadata-routes.js';
33
+ import { canonicalize } from '../server/canonicalize.js';
34
+ import { matchUrlParts } from '../server/tree-match.js';
35
+ import type { RouteTree } from '../routing/types.js';
22
36
 
23
37
  // ─── Constants ────────────────────────────────────────────────────────────
24
38
 
@@ -72,20 +86,15 @@ export function timberDevServer(ctx: PluginContext): Plugin {
72
86
  * filtered out explicitly and passed through to Vite.
73
87
  */
74
88
  configureServer(server: ViteDevServer) {
75
- // Watch config files for full restart.
76
- // timber.config.ts is loaded once at startup — any change requires
77
- // a full dev server restart. See 21-dev-server.md §HMR Wiring.
89
+ // Ensure config files are in the watch set. Vite's watcher covers
90
+ // the project root, but `server.watcher.add()` is a no-op for files
91
+ // already watched, and ensures newly-created config files (e.g. from
92
+ // create-timber-app) are picked up. The actual restart logic is
93
+ // handled by Vite's built-in configFileDependencies check — see the
94
+ // configResolved hook in index.ts where we register the config path.
95
+ // See 21-dev-server.md §HMR Wiring.
78
96
  const configPaths = CONFIG_FILE_NAMES.map((name) => join(ctx.root, name));
79
-
80
- server.watcher.on('change', (filePath: string) => {
81
- if (configPaths.includes(filePath)) {
82
- server.restart();
83
- }
84
- });
85
-
86
- // Register Vite server for browser console warning forwarding.
87
- // See 21-dev-server.md §Dev-Mode Warnings.
88
- setViteServer(server);
97
+ server.watcher.add(configPaths);
89
98
 
90
99
  // Listen for client-side errors forwarded from the browser.
91
100
  // The browser entry sends 'timber:client-error' events via HMR
@@ -94,7 +103,22 @@ export function timberDevServer(ctx: PluginContext): Plugin {
94
103
  listenForClientErrors(server, ctx.root);
95
104
 
96
105
  // Pre-hook — registers middleware before Vite's internals
97
- server.middlewares.use(createTimberMiddleware(server, ctx.root));
106
+ server.middlewares.use(createTimberMiddleware(server, ctx));
107
+
108
+ // Wrap server.listen() to close the holding server immediately
109
+ // before Vite binds the port — no gap where nothing is listening.
110
+ // The holding server was started in rootSync's config() hook to
111
+ // serve a loading page during initialization.
112
+ // See design/21-dev-server.md §"Startup Holding Server", TIM-665.
113
+ if (ctx.holdingServer) {
114
+ const originalListen = server.listen.bind(server);
115
+ const holdingRef = ctx.holdingServer;
116
+ ctx.holdingServer = null;
117
+ server.listen = async (port?: number, isRestart?: boolean) => {
118
+ await holdingRef.close().catch(() => {});
119
+ return originalListen(port, isRestart);
120
+ };
121
+ }
98
122
 
99
123
  // Log startup timing summary. configureServer runs on all plugins
100
124
  // before the server listens, so this captures the full cold start.
@@ -121,7 +145,12 @@ export function timberDevServer(ctx: PluginContext): Plugin {
121
145
  * For non-route requests (assets, Vite internals, HMR), the middleware
122
146
  * calls next() to let Vite handle them.
123
147
  */
124
- function createTimberMiddleware(server: ViteDevServer, projectRoot: string) {
148
+ function createTimberMiddleware(server: ViteDevServer, ctx: PluginContext) {
149
+ const projectRoot = ctx.root;
150
+ // Extract HMR connection options once so the error page can construct
151
+ // a correct WebSocket URL (TIM-789).
152
+ const hmrOptions = extractHmrOptions(server.config);
153
+
125
154
  return async (req: IncomingMessage, res: ServerResponse, next: () => void): Promise<void> => {
126
155
  const url = req.url;
127
156
  if (!url) {
@@ -135,8 +164,27 @@ function createTimberMiddleware(server: ViteDevServer, projectRoot: string) {
135
164
  return;
136
165
  }
137
166
 
138
- // Pass through static asset requests
139
- if (isAssetRequest(url)) {
167
+ // Files that exist in public/ are always served by Vite's static
168
+ // middleware, regardless of extension. Without this, extensions like
169
+ // .ico, .txt, .xml, .html either get caught by the metadata route
170
+ // check or aren't in ASSET_EXTENSIONS, so they fall through to the
171
+ // app router where a dynamic segment like [artistSlug] 404s them.
172
+ if (isPublicFile(server, url)) {
173
+ next();
174
+ return;
175
+ }
176
+
177
+ // Pass through static asset requests — but not metadata routes like
178
+ // /favicon.ico that match asset extensions but are handled by timber,
179
+ // and not registered routes like app/feed.json/route.ts whose URL ends
180
+ // in an asset extension. Production serves these through the RSC
181
+ // handler, so letting them fall through to Vite would 404 in dev only
182
+ // (TIM-1038).
183
+ if (
184
+ isAssetRequest(url) &&
185
+ !isMetadataRouteServePath(url) &&
186
+ !isRouteOwnedAsset(ctx.routeTree, server, url)
187
+ ) {
140
188
  next();
141
189
  return;
142
190
  }
@@ -160,13 +208,50 @@ function createTimberMiddleware(server: ViteDevServer, projectRoot: string) {
160
208
  handler = rscModule.default as (req: Request) => Promise<Response>;
161
209
 
162
210
  // Wire pipeline errors into the browser error overlay.
163
- // setDevPipelineErrorHandler is only defined in dev (rsc-entry.ts exports it).
164
- const setHandler = rscModule.setDevPipelineErrorHandler as
165
- | ((fn: (error: Error, phase: string) => void) => void)
211
+ // Set devPipelineErrorHandler directly on the pipeline config —
212
+ // no module-level singleton. The handler receives optional RSC debug
213
+ // component data (component names, environments, stack frames) from
214
+ // the Flight debug channel for render errors.
215
+ const config = rscModule.pipelineConfig as
216
+ | {
217
+ devPipelineErrorHandler?: (
218
+ error: Error,
219
+ phase: string,
220
+ debugComponents?: Array<{
221
+ name: string;
222
+ env: string | null;
223
+ stack: unknown[] | null;
224
+ }>
225
+ ) => void;
226
+ devHmrOptions?: DevErrorHmrOptions;
227
+ }
228
+ | undefined;
229
+ if (config) {
230
+ config.devPipelineErrorHandler = (error, _phase, debugComponents) => {
231
+ sendErrorToOverlay(
232
+ server,
233
+ error,
234
+ classifyErrorPhase(error, projectRoot),
235
+ projectRoot,
236
+ debugComponents
237
+ );
238
+ };
239
+ // Plumb the resolved HMR options into the RSC environment. The RSC
240
+ // entry can't read the Vite server config (separate module graph),
241
+ // but its dev 404 page and fallback error page need the HMR endpoint
242
+ // (including Vite 8's required WS token) for auto-reload (TIM-1067).
243
+ config.devHmrOptions = hmrOptions;
244
+ }
245
+
246
+ // Wire source-map handler so error pages show original positions.
247
+ // fixErrorStacktrace rewrites the error's stack trace in-place using
248
+ // the Vite dev server's module graph. See TIM-811.
249
+ const setSourceMap = rscModule.setDevSourceMapHandler as
250
+ | ((fn: (error: Error) => void) => void)
166
251
  | undefined;
167
- if (typeof setHandler === 'function') {
168
- setHandler((error) => {
169
- sendErrorToOverlay(server, error, classifyErrorPhase(error, projectRoot), projectRoot);
252
+ if (typeof setSourceMap === 'function') {
253
+ setSourceMap((error: Error) => {
254
+ fixErrorStacktrace(server, error);
170
255
  });
171
256
  }
172
257
  } catch (error) {
@@ -174,9 +259,11 @@ function createTimberMiddleware(server: ViteDevServer, projectRoot: string) {
174
259
  // Vite may already show its own overlay for these, but we still
175
260
  // log to stderr with frame dimming for the terminal.
176
261
  if (error instanceof Error) {
262
+ // Add context for virtual:timber-* module errors
263
+ addTimberContext(error);
177
264
  sendErrorToOverlay(server, error, 'module-transform', projectRoot);
178
265
  }
179
- respond500(res, error);
266
+ respond500(res, error, 'module-transform', projectRoot, hmrOptions);
180
267
  return;
181
268
  }
182
269
 
@@ -191,8 +278,20 @@ function createTimberMiddleware(server: ViteDevServer, projectRoot: string) {
191
278
  // Convert Node IncomingMessage → Web Request
192
279
  const webRequest = toWebRequest(req);
193
280
 
194
- // Run the full pipeline
195
- const webResponse = await handler(webRequest);
281
+ // Check for a platform-specific request wrapper (e.g., Cloudflare
282
+ // dev bindings). The cloudflareDevBindings() plugin stores a wrapper
283
+ // function on the server instance using a well-known Symbol. The
284
+ // wrapper runs the handler inside an ALS context so platform APIs
285
+ // like getCloudflareBindings() work during dev.
286
+ // See design/35-cloudflare-primitives.md §"Dev Experience".
287
+ const wrapper = (server as any)[Symbol.for('timber:dev-request-wrapper')] as
288
+ | (<T>(fn: () => T) => T)
289
+ | undefined;
290
+
291
+ // Run the full pipeline (wrapped if a platform dev plugin is active)
292
+ const webResponse = wrapper
293
+ ? await wrapper(() => handler(webRequest))
294
+ : await handler(webRequest);
196
295
 
197
296
  // Compress the response if the client supports it.
198
297
  // In dev mode, compression is always enabled for parity with production.
@@ -205,26 +304,71 @@ function createTimberMiddleware(server: ViteDevServer, projectRoot: string) {
205
304
  // Pipeline error — classify the phase, send to overlay, respond 500.
206
305
  // The dev server remains running for recovery on file fix + HMR.
207
306
  if (error instanceof Error) {
208
- const phase = classifyErrorPhase(error, projectRoot);
209
- sendErrorToOverlay(server, error, phase, projectRoot);
307
+ // Unwrap SsrStreamError to show the real cause in the error overlay.
308
+ // SsrStreamError wraps the original RSC render error with a generic
309
+ // message; the developer needs to see the actual error (e.g.,
310
+ // "useSegmentParams is not a function"), not the wrapper.
311
+ const displayError =
312
+ error.name === 'SsrStreamError' && error.cause instanceof Error ? error.cause : error;
313
+ const phase = classifyErrorPhase(displayError, projectRoot);
314
+ sendErrorToOverlay(server, displayError, phase, projectRoot);
315
+ respond500(res, displayError, phase, projectRoot, hmrOptions);
210
316
  } else {
211
317
  process.stderr.write(`\x1b[31m[timber] Dev server error:\x1b[0m ${String(error)}\n`);
318
+ respond500(res, error, 'render', projectRoot, hmrOptions);
212
319
  }
213
- respond500(res, error);
214
320
  }
215
321
  };
216
322
  }
217
323
 
218
324
  /**
219
325
  * Send a 500 response without crashing the dev server.
326
+ *
327
+ * In dev mode, renders a styled HTML error page with source context,
328
+ * classified stack trace, and auto-reload on HMR. Falls back to
329
+ * text/plain if the HTML generator fails (must never crash).
220
330
  */
221
- function respond500(res: ServerResponse, error: unknown): void {
222
- if (!res.headersSent) {
223
- res.statusCode = 500;
224
- res.setHeader('content-type', 'text/plain');
225
- res.end(
226
- `[timber] Internal server error\n\n${error instanceof Error ? (error.stack ?? error.message) : String(error)}`
227
- );
331
+ function respond500(
332
+ res: ServerResponse,
333
+ error: unknown,
334
+ phase: ErrorPhase,
335
+ projectRoot: string,
336
+ hmrOptions?: DevErrorHmrOptions
337
+ ): void {
338
+ if (res.headersSent) return;
339
+
340
+ // Try to render the rich HTML error page
341
+ if (error instanceof Error) {
342
+ try {
343
+ const html = generateDevErrorPage(error, phase, projectRoot, hmrOptions);
344
+ res.statusCode = 500;
345
+ res.setHeader('content-type', 'text/html; charset=utf-8');
346
+ res.end(html);
347
+ return;
348
+ } catch (e) {
349
+ console.debug(
350
+ '[timber] dev error page generation failed, falling back to text/plain:',
351
+ e instanceof Error ? e.message : e
352
+ );
353
+ }
354
+ }
355
+
356
+ // Fallback: plain text (same as before)
357
+ res.statusCode = 500;
358
+ res.setHeader('content-type', 'text/plain');
359
+ res.end(
360
+ `[timber] Internal server error\n\n${error instanceof Error ? (error.stack ?? error.message) : String(error)}`
361
+ );
362
+ }
363
+
364
+ /**
365
+ * Add timber-specific context to an error's message if it references
366
+ * internal virtual modules (virtual:timber-*). Mutates the error in place.
367
+ */
368
+ function addTimberContext(error: Error): void {
369
+ const enriched = addVirtualModuleContext(error.message);
370
+ if (enriched !== error.message) {
371
+ error.message = enriched;
228
372
  }
229
373
  }
230
374
 
@@ -235,15 +379,30 @@ function respond500(res: ServerResponse, error: unknown): void {
235
379
  *
236
380
  * Constructs the full URL from the Host header and request URL,
237
381
  * and forwards the method, headers, and body.
382
+ *
383
+ * The scheme comes from the socket's TLS state — with `server.https` the
384
+ * browser sends `Origin: https://host`, and a hardcoded `http://` would
385
+ * fail CSRF origin comparison on every POST. X-Forwarded-Proto is NOT
386
+ * consulted: dev connections are direct, so the header would be
387
+ * attacker-controlled. (TIM-1067, B32)
388
+ *
389
+ * Exported for tests.
238
390
  */
239
- function toWebRequest(nodeReq: IncomingMessage): Request {
240
- const protocol = 'http';
241
- const host = nodeReq.headers.host ?? 'localhost';
391
+ export function toWebRequest(nodeReq: IncomingMessage): Request {
392
+ const protocol = (nodeReq.socket as TLSSocket | undefined)?.encrypted ? 'https' : 'http';
393
+ // Under HTTP/2 there is no Host header — the authority lives in the
394
+ // `:authority` pseudo-header.
395
+ const host =
396
+ nodeReq.headers.host ?? (nodeReq.headers[':authority'] as string | undefined) ?? 'localhost';
242
397
  const url = `${protocol}://${host}${nodeReq.url}`;
243
398
 
244
399
  const headers = new Headers();
245
400
  for (const [key, value] of Object.entries(nodeReq.headers)) {
246
401
  if (value === undefined) continue;
402
+ // HTTP/2 pseudo-headers (:method, :path, :authority, :scheme) are not
403
+ // valid Headers names — Headers.set() throws on them. They're already
404
+ // reflected in the request URL/method above.
405
+ if (key.startsWith(':')) continue;
247
406
  if (Array.isArray(value)) {
248
407
  for (const v of value) {
249
408
  headers.append(key, v);
@@ -252,6 +411,11 @@ function toWebRequest(nodeReq: IncomingMessage): Request {
252
411
  headers.set(key, value);
253
412
  }
254
413
  }
414
+ // HTTP/2 requests carry the authority in `:authority`, not Host — but
415
+ // downstream consumers (CSRF origin validation) read the Host header.
416
+ if (!headers.has('host')) {
417
+ headers.set('host', host);
418
+ }
255
419
 
256
420
  const method = nodeReq.method ?? 'GET';
257
421
  const hasBody = method !== 'GET' && method !== 'HEAD';
@@ -317,6 +481,17 @@ async function sendWebResponse(nodeRes: ServerResponse, webResponse: Response):
317
481
  nodeRes.flushHeaders();
318
482
 
319
483
  const reader = webResponse.body.getReader();
484
+
485
+ // Cancel the reader when the client disconnects. This causes any pending
486
+ // reader.read() to reject, breaking the pump loop. Critical for SSE and
487
+ // other infinite streams — without this, disconnected clients leak readers.
488
+ let clientDisconnected = false;
489
+ const onClose = () => {
490
+ clientDisconnected = true;
491
+ reader.cancel('Client disconnected').catch(() => {});
492
+ };
493
+ nodeRes.on('close', onClose);
494
+
320
495
  try {
321
496
  while (true) {
322
497
  const { done, value } = await reader.read();
@@ -325,9 +500,18 @@ async function sendWebResponse(nodeRes: ServerResponse, webResponse: Response):
325
500
  // don't need back-pressure here — just keep pushing chunks.
326
501
  nodeRes.write(value);
327
502
  }
503
+ } catch (err) {
504
+ // reader.cancel() from the close handler causes read() to reject.
505
+ // This is expected on client disconnect — not an error.
506
+ if (!clientDisconnected) {
507
+ throw err;
508
+ }
328
509
  } finally {
510
+ nodeRes.off('close', onClose);
329
511
  reader.releaseLock();
330
- nodeRes.end();
512
+ if (!nodeRes.writableEnded) {
513
+ nodeRes.end();
514
+ }
331
515
  }
332
516
  }
333
517
 
@@ -347,6 +531,69 @@ function isAssetRequest(url: string): boolean {
347
531
  return ASSET_EXTENSIONS.test(url);
348
532
  }
349
533
 
534
+ /**
535
+ * Check if a URL maps to a real file in the project's public/ directory.
536
+ * Vite serves public/ files as static assets — if a file exists there it
537
+ * must be passed through to Vite regardless of extension.
538
+ */
539
+ function isPublicFile(server: ViteDevServer, url: string): boolean {
540
+ const { publicDir } = server.config;
541
+ if (!publicDir) return false;
542
+ const pathname = url.split('?')[0];
543
+ const relativePath = pathname.startsWith('/') ? pathname.slice(1) : pathname;
544
+ if (!relativePath) return false;
545
+ const fullPath = join(publicDir, relativePath);
546
+ try {
547
+ return statSync(fullPath).isFile();
548
+ } catch {
549
+ return false;
550
+ }
551
+ }
552
+
553
+ /**
554
+ * Check whether an asset-extension URL belongs to a scanned route rather
555
+ * than a static file.
556
+ *
557
+ * Route handlers may live at paths ending in asset-like extensions
558
+ * (app/feed.json/route.ts → /feed.json), which the asset bypass would
559
+ * otherwise hand to Vite — 404ing in dev while working in production.
560
+ * Uses the same canonicalization and tree walker as the runtime matcher
561
+ * so dev classification agrees with what the pipeline would match.
562
+ *
563
+ * A file that actually exists on disk wins over the route match: the
564
+ * production server serves public/ statics before the RSC handler (see
565
+ * adapters/nitro.ts), and Vite serves root-relative source files (e.g.
566
+ * /app/global.css) in dev. Without this, a broad catch-all route like
567
+ * app/[...slug] would shadow every static asset. Joining the canonical
568
+ * pathname is traversal-safe — canonicalize() resolves `..` segments and
569
+ * rejects root escapes and encoded separators.
570
+ *
571
+ * Reads ctx.routeTree per request — the routing plugin rescans it on
572
+ * file add/unlink/change, so newly created routes are picked up live.
573
+ */
574
+ function isRouteOwnedAsset(
575
+ routeTree: RouteTree | null,
576
+ server: ViteDevServer,
577
+ url: string
578
+ ): boolean {
579
+ if (!routeTree) return false;
580
+ const rawPathname = url.split('?')[0];
581
+ const result = canonicalize(rawPathname);
582
+ // Malformed URLs can't match a route — let Vite handle them as before.
583
+ if (!result.ok) return false;
584
+ const parts = result.pathname === '/' ? [] : result.pathname.slice(1).split('/');
585
+ if (matchUrlParts(routeTree.root, parts) === null) return false;
586
+
587
+ // Real static files win over the route match (dev/prod parity: the
588
+ // production server tries public/ before the RSC handler).
589
+ const relativePath = result.pathname.slice(1);
590
+ const { publicDir, root } = server.config;
591
+ if (publicDir && existsSync(join(publicDir, relativePath))) return false;
592
+ if (existsSync(join(root, relativePath))) return false;
593
+
594
+ return true;
595
+ }
596
+
350
597
  // ─── Client Error Listener ─────────────────────────────────────────────
351
598
 
352
599
  interface ClientErrorPayload {
@@ -392,8 +639,8 @@ function listenForClientErrors(server: ViteDevServer, projectRoot: string): void
392
639
  loc: loc ? { file: loc.file, line: loc.line, column: loc.column } : undefined,
393
640
  },
394
641
  });
395
- } catch {
396
- // Overlay send must never crash the dev server
642
+ } catch (e) {
643
+ console.debug('[timber] overlay send failed:', e instanceof Error ? e.message : e);
397
644
  }
398
645
  });
399
646
  }
@@ -15,7 +15,7 @@ import type { Plugin } from 'vite';
15
15
  import { resolve, dirname } from 'node:path';
16
16
  import { fileURLToPath } from 'node:url';
17
17
  import { existsSync } from 'node:fs';
18
- import type { PluginContext } from '#/index.js';
18
+ import type { PluginContext } from '../plugin-context.js';
19
19
 
20
20
  const __dirname = dirname(fileURLToPath(import.meta.url));
21
21
 
@@ -34,6 +34,7 @@ const VIRTUAL_IDS = {
34
34
  browserEntry: 'virtual:timber-browser-entry',
35
35
  config: 'virtual:timber-config',
36
36
  instrumentation: 'virtual:timber-instrumentation',
37
+ cacheHandler: 'virtual:timber-cache-handler',
37
38
  } as const;
38
39
 
39
40
  /**
@@ -48,7 +49,7 @@ const VIRTUAL_IDS = {
48
49
  const ENTRY_FILE_MAP: Record<string, string> = {
49
50
  [VIRTUAL_IDS.rscEntry]: resolve(SRC_DIR, 'server', 'rsc-entry', 'index.ts'),
50
51
  [VIRTUAL_IDS.ssrEntry]: resolve(SRC_DIR, 'server', 'ssr-entry.ts'),
51
- [VIRTUAL_IDS.browserEntry]: resolve(SRC_DIR, 'client', 'browser-entry.ts'),
52
+ [VIRTUAL_IDS.browserEntry]: resolve(SRC_DIR, 'client', 'browser-entry', 'index.ts'),
52
53
  };
53
54
 
54
55
  /** The \0-prefixed resolved ID for virtual:timber-config */
@@ -57,6 +58,9 @@ const RESOLVED_CONFIG_ID = `\0${VIRTUAL_IDS.config}`;
57
58
  /** The \0-prefixed resolved ID for virtual:timber-instrumentation */
58
59
  const RESOLVED_INSTRUMENTATION_ID = `\0${VIRTUAL_IDS.instrumentation}`;
59
60
 
61
+ /** The \0-prefixed resolved ID for virtual:timber-cache-handler */
62
+ const RESOLVED_CACHE_HANDLER_ID = `\0${VIRTUAL_IDS.cacheHandler}`;
63
+
60
64
  /**
61
65
  * Strip the \0 prefix from a module ID.
62
66
  *
@@ -94,12 +98,39 @@ function stripRootPrefix(id: string, root: string): string {
94
98
  *
95
99
  * Serializes output mode and feature flags for runtime consumption.
96
100
  */
97
- function generateConfigModule(ctx: PluginContext): string {
98
- // Resolve cookie secrets: `secret` shorthand expands to `secrets: [secret]`
99
- const cookieSecrets =
100
- ctx.config.cookies?.secrets ??
101
- (ctx.config.cookies?.secret ? [ctx.config.cookies.secret] : undefined);
101
+ /**
102
+ * Extract the JSON-serializable subset of `forms` config.
103
+ *
104
+ * Drops function-valued `stripSensitiveFields` with a build-time warning —
105
+ * functions cannot cross the JSON boundary to the runtime, so users must
106
+ * configure function predicates per-action via `createActionClient` instead.
107
+ */
108
+ function serializeFormsConfig(
109
+ forms: { stripSensitiveFields?: unknown } | undefined
110
+ ): { stripSensitiveFields?: boolean | readonly string[] } | undefined {
111
+ if (!forms) return undefined;
112
+ const opt = forms.stripSensitiveFields;
113
+ if (opt === undefined) return {};
114
+ if (typeof opt === 'boolean') return { stripSensitiveFields: opt };
115
+ if (Array.isArray(opt)) {
116
+ // Coerce to a string array and drop any non-string entries.
117
+ const names = opt.filter((v): v is string => typeof v === 'string');
118
+ return { stripSensitiveFields: names };
119
+ }
120
+ if (typeof opt === 'function') {
121
+ console.warn(
122
+ '[timber] forms.stripSensitiveFields was set to a function in timber.config.ts — ' +
123
+ 'this is not supported at the global level (functions cannot be serialized ' +
124
+ 'into the runtime config). Use a per-action override via ' +
125
+ '`createActionClient({ stripSensitiveFields: (name) => ... })` instead. ' +
126
+ 'The built-in deny-list will be used globally.'
127
+ );
128
+ return {};
129
+ }
130
+ return {};
131
+ }
102
132
 
133
+ function generateConfigModule(ctx: PluginContext): string {
103
134
  const runtimeConfig = {
104
135
  output: ctx.config.output ?? 'server',
105
136
  csrf: ctx.config.csrf ?? true,
@@ -108,10 +139,28 @@ function generateConfigModule(ctx: PluginContext): string {
108
139
  dev: ctx.dev ?? false,
109
140
  slowPhaseMs: ctx.config.dev?.slowPhaseMs ?? 200,
110
141
  slowRequestMs: ctx.config.slowRequestMs ?? 3000,
111
- cookieSecrets,
112
142
  topLoader: ctx.config.topLoader,
113
143
  debug: ctx.config.debug ?? false,
114
144
  serverTiming: ctx.config.serverTiming,
145
+ renderTimeoutMs: ctx.config.renderTimeoutMs ?? 30_000,
146
+ // Auto-generated sitemap config — opt-in via timber.config.ts.
147
+ // See design/16-metadata.md §"Auto-generated Sitemap"
148
+ sitemap: ctx.config.sitemap,
149
+ // Forms config — only the serializable subset. `stripSensitiveFields`
150
+ // accepts boolean | string[] at the global level. Functions must be
151
+ // configured per-action via `createActionClient({ stripSensitiveFields })`
152
+ // because JSON.stringify would silently drop them here. See TIM-816.
153
+ forms: serializeFormsConfig(ctx.config.forms),
154
+ // Per-build deployment ID for version skew detection (TIM-446).
155
+ // Null in dev mode — HMR handles code updates without full reloads.
156
+ deploymentId: ctx.deploymentId ?? null,
157
+ // Browser log forwarding threshold — used by buildClientScripts to
158
+ // decide whether /@vite/client is needed when clientJavascript is
159
+ // disabled. See TIM-1152.
160
+ devBrowserLogs: ctx.config.devBrowserLogs,
161
+ // Note: project root is NOT included here — it was leaking server
162
+ // filesystem paths to client bundles (TIM-787). Dev error pages get
163
+ // the root through the dev server, not the runtime config.
115
164
  };
116
165
 
117
166
  return [
@@ -177,6 +226,67 @@ export function generateInstrumentationModule(instrumentationPath: string | null
177
226
  ].join('\n');
178
227
  }
179
228
 
229
+ /**
230
+ * Detect the user's timber.config file at the project root.
231
+ * Returns the absolute path or null if not found.
232
+ */
233
+ function detectConfigFile(root: string): string | null {
234
+ const names = ['timber.config.ts', 'timber.config.js', 'timber.config.mjs'];
235
+ for (const name of names) {
236
+ const candidate = resolve(root, name);
237
+ if (existsSync(candidate)) return candidate;
238
+ }
239
+ return null;
240
+ }
241
+
242
+ /**
243
+ * Generate the virtual:timber-cache-handler module source.
244
+ *
245
+ * When the user's config has a cacheHandler, generates a module that
246
+ * dynamically imports the config file and extracts the cacheHandler.
247
+ * The cacheHandler is a class instance (e.g. RedisCacheHandler) that
248
+ * cannot be JSON-serialized into virtual:timber-config, so it must
249
+ * be loaded at runtime via dynamic import. See TIM-599.
250
+ */
251
+ function generateCacheHandlerModule(
252
+ configPath: string | null,
253
+ hasCacheHandler: boolean,
254
+ hasCdnPurge: boolean
255
+ ): string {
256
+ if (configPath && (hasCacheHandler || hasCdnPurge)) {
257
+ return [
258
+ '// Auto-generated cache handler loader — do not edit.',
259
+ '// Generated by timber-entries plugin.',
260
+ '',
261
+ `export default async function loadCacheHandler() {`,
262
+ ` const mod = await import(${JSON.stringify(configPath)});`,
263
+ ` const config = mod.default ?? mod;`,
264
+ ` return config.cacheHandler ?? null;`,
265
+ `}`,
266
+ '',
267
+ `export async function loadCdnPurgeHandler() {`,
268
+ ` const mod = await import(${JSON.stringify(configPath)});`,
269
+ ` const config = mod.default ?? mod;`,
270
+ ` return config.cdnPurge ?? null;`,
271
+ `}`,
272
+ ].join('\n');
273
+ }
274
+
275
+ return [
276
+ '// Auto-generated cache handler loader — do not edit.',
277
+ '// Generated by timber-entries plugin.',
278
+ '// No cacheHandler or cdnPurge configured in timber.config.',
279
+ '',
280
+ `export default async function loadCacheHandler() {`,
281
+ ` return null;`,
282
+ `}`,
283
+ '',
284
+ `export async function loadCdnPurgeHandler() {`,
285
+ ` return null;`,
286
+ `}`,
287
+ ].join('\n');
288
+ }
289
+
180
290
  /**
181
291
  * Create the timber-entries Vite plugin.
182
292
  *
@@ -219,6 +329,11 @@ export function timberEntries(ctx: PluginContext): Plugin {
219
329
  return RESOLVED_INSTRUMENTATION_ID;
220
330
  }
221
331
 
332
+ // Check cache handler virtual module
333
+ if (cleanId === VIRTUAL_IDS.cacheHandler) {
334
+ return RESOLVED_CACHE_HANDLER_ID;
335
+ }
336
+
222
337
  return null;
223
338
  },
224
339
 
@@ -236,6 +351,12 @@ export function timberEntries(ctx: PluginContext): Plugin {
236
351
  const instrumentationPath = detectInstrumentationFile(ctx.root);
237
352
  return generateInstrumentationModule(instrumentationPath);
238
353
  }
354
+ if (id === RESOLVED_CACHE_HANDLER_ID) {
355
+ const configPath = detectConfigFile(ctx.root);
356
+ const hasCacheHandler = ctx.config.cacheHandler != null;
357
+ const hasCdnPurge = ctx.config.cdnPurge != null;
358
+ return generateCacheHandlerModule(configPath, hasCacheHandler, hasCdnPurge);
359
+ }
239
360
  return null;
240
361
  },
241
362