@timber-js/app 0.2.0-alpha.17 → 0.2.0-alpha.170

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 (1026) hide show
  1. package/LICENSE +8 -0
  2. package/agent-skill.md +344 -0
  3. package/dist/_chunks/actions-O_LsyCE4.js +317 -0
  4. package/dist/_chunks/actions-O_LsyCE4.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-B-lhk9p4.js +1202 -0
  8. package/dist/_chunks/cache-api-B-lhk9p4.js.map +1 -0
  9. package/dist/_chunks/canonicalize-Du3o_ptW.js +247 -0
  10. package/dist/_chunks/canonicalize-Du3o_ptW.js.map +1 -0
  11. package/dist/_chunks/cli-schema-sync-B5FDplGI.js +688 -0
  12. package/dist/_chunks/cli-schema-sync-B5FDplGI.js.map +1 -0
  13. package/dist/_chunks/cloudflare-AHoWYTYr.js +1188 -0
  14. package/dist/_chunks/cloudflare-AHoWYTYr.js.map +1 -0
  15. package/dist/_chunks/codec-registry-oOUxugz3.js +21 -0
  16. package/dist/_chunks/codec-registry-oOUxugz3.js.map +1 -0
  17. package/dist/_chunks/define-COtkxMRT.js +191 -0
  18. package/dist/_chunks/define-COtkxMRT.js.map +1 -0
  19. package/dist/_chunks/define-c4au4I9R.js +82 -0
  20. package/dist/_chunks/define-c4au4I9R.js.map +1 -0
  21. package/dist/_chunks/dist-BA3u1z3W.js +423 -0
  22. package/dist/_chunks/dist-BA3u1z3W.js.map +1 -0
  23. package/dist/_chunks/fast-hash-D6hIVt1Y.js +36 -0
  24. package/dist/_chunks/fast-hash-D6hIVt1Y.js.map +1 -0
  25. package/dist/_chunks/format-CfwjgPz9.js +14 -0
  26. package/dist/_chunks/format-CfwjgPz9.js.map +1 -0
  27. package/dist/_chunks/href-validation-CMc5JRls.js +141 -0
  28. package/dist/_chunks/href-validation-CMc5JRls.js.map +1 -0
  29. package/dist/_chunks/json-lossy-check-ClNvBM_3.js +63 -0
  30. package/dist/_chunks/json-lossy-check-ClNvBM_3.js.map +1 -0
  31. package/dist/_chunks/logger-AWfuX-KJ.js +1468 -0
  32. package/dist/_chunks/logger-AWfuX-KJ.js.map +1 -0
  33. package/dist/_chunks/navigation-root-bUDZLw74.js +124 -0
  34. package/dist/_chunks/navigation-root-bUDZLw74.js.map +1 -0
  35. package/dist/_chunks/plugin-context---kTF5v8.js +315 -0
  36. package/dist/_chunks/plugin-context---kTF5v8.js.map +1 -0
  37. package/dist/_chunks/registry-DbJPKoBp.js +20 -0
  38. package/dist/_chunks/registry-DbJPKoBp.js.map +1 -0
  39. package/dist/_chunks/resolve-schema-Dz3fcFUo.js +50 -0
  40. package/dist/_chunks/resolve-schema-Dz3fcFUo.js.map +1 -0
  41. package/dist/_chunks/router-ref-CtmF-aPv.js +28 -0
  42. package/dist/_chunks/router-ref-CtmF-aPv.js.map +1 -0
  43. package/dist/_chunks/schema-bridge-DT_Tn0Xf.js +119 -0
  44. package/dist/_chunks/schema-bridge-DT_Tn0Xf.js.map +1 -0
  45. package/dist/_chunks/segment-classify-Byy425ng.js +176 -0
  46. package/dist/_chunks/segment-classify-Byy425ng.js.map +1 -0
  47. package/dist/_chunks/segment-context-ZDnXDkbz.js +34 -0
  48. package/dist/_chunks/segment-context-ZDnXDkbz.js.map +1 -0
  49. package/dist/_chunks/sizeof-lXffQ1Vr.js +35 -0
  50. package/dist/_chunks/sizeof-lXffQ1Vr.js.map +1 -0
  51. package/dist/_chunks/{ssr-data-MjmprTmO.js → ssr-data-BOWsq18U.js} +1 -1
  52. package/dist/_chunks/ssr-data-BOWsq18U.js.map +1 -0
  53. package/dist/_chunks/{use-query-states-D5KaffOK.js → use-query-states-DFvWd-EA.js} +71 -26
  54. package/dist/_chunks/use-query-states-DFvWd-EA.js.map +1 -0
  55. package/dist/_chunks/use-segment-params-D1CzlgBo.js +151 -0
  56. package/dist/_chunks/use-segment-params-D1CzlgBo.js.map +1 -0
  57. package/dist/_chunks/walkers-DCoE-LJf.js +1002 -0
  58. package/dist/_chunks/walkers-DCoE-LJf.js.map +1 -0
  59. package/dist/adapters/build-output-helper.d.ts +29 -0
  60. package/dist/adapters/build-output-helper.d.ts.map +1 -0
  61. package/dist/adapters/cloudflare-dev.d.ts +109 -0
  62. package/dist/adapters/cloudflare-dev.d.ts.map +1 -0
  63. package/dist/adapters/cloudflare-dev.js +73 -0
  64. package/dist/adapters/cloudflare-dev.js.map +1 -0
  65. package/dist/adapters/cloudflare-kv-cache.d.ts +65 -0
  66. package/dist/adapters/cloudflare-kv-cache.d.ts.map +1 -0
  67. package/dist/adapters/cloudflare-kv-cache.js +124 -0
  68. package/dist/adapters/cloudflare-kv-cache.js.map +1 -0
  69. package/dist/adapters/cloudflare.d.ts +189 -21
  70. package/dist/adapters/cloudflare.d.ts.map +1 -1
  71. package/dist/adapters/cloudflare.js +2 -188
  72. package/dist/adapters/compress-module.d.ts +5 -4
  73. package/dist/adapters/compress-module.d.ts.map +1 -1
  74. package/dist/adapters/nitro.d.ts +41 -3
  75. package/dist/adapters/nitro.d.ts.map +1 -1
  76. package/dist/adapters/nitro.js +224 -172
  77. package/dist/adapters/nitro.js.map +1 -1
  78. package/dist/adapters/shared.d.ts +6 -0
  79. package/dist/adapters/shared.d.ts.map +1 -0
  80. package/dist/adapters/types.d.ts +2 -6
  81. package/dist/adapters/types.d.ts.map +1 -1
  82. package/dist/cache/cache-api.d.ts +48 -0
  83. package/dist/cache/cache-api.d.ts.map +1 -0
  84. package/dist/cache/handler-store.d.ts +33 -0
  85. package/dist/cache/handler-store.d.ts.map +1 -0
  86. package/dist/cache/index.d.ts +31 -8
  87. package/dist/cache/index.d.ts.map +1 -1
  88. package/dist/cache/index.js +3 -326
  89. package/dist/cache/invalidation-epoch.d.ts +43 -0
  90. package/dist/cache/invalidation-epoch.d.ts.map +1 -0
  91. package/dist/cache/json-lossy-check.d.ts +11 -0
  92. package/dist/cache/json-lossy-check.d.ts.map +1 -0
  93. package/dist/cache/redis-handler.d.ts +140 -8
  94. package/dist/cache/redis-handler.d.ts.map +1 -1
  95. package/dist/cache/singleflight.d.ts +19 -2
  96. package/dist/cache/singleflight.d.ts.map +1 -1
  97. package/dist/cache/sizeof.d.ts +22 -0
  98. package/dist/cache/sizeof.d.ts.map +1 -0
  99. package/dist/cache/stable-stringify.d.ts +9 -0
  100. package/dist/cache/stable-stringify.d.ts.map +1 -1
  101. package/dist/cache/store.d.ts +53 -0
  102. package/dist/cache/store.d.ts.map +1 -0
  103. package/dist/cache/stores/cloudflare-kv.d.ts +38 -0
  104. package/dist/cache/stores/cloudflare-kv.d.ts.map +1 -0
  105. package/dist/cache/stores/cloudflare-kv.js +29 -0
  106. package/dist/cache/stores/cloudflare-kv.js.map +1 -0
  107. package/dist/cache/stores/memory.d.ts +42 -0
  108. package/dist/cache/stores/memory.d.ts.map +1 -0
  109. package/dist/cache/stores/memory.js +90 -0
  110. package/dist/cache/stores/memory.js.map +1 -0
  111. package/dist/cache/stores/redis.d.ts +69 -0
  112. package/dist/cache/stores/redis.d.ts.map +1 -0
  113. package/dist/cache/stores/redis.js +35 -0
  114. package/dist/cache/stores/redis.js.map +1 -0
  115. package/dist/cache/stores/vercel.d.ts +36 -0
  116. package/dist/cache/stores/vercel.d.ts.map +1 -0
  117. package/dist/cache/stores/vercel.js +33 -0
  118. package/dist/cache/stores/vercel.js.map +1 -0
  119. package/dist/cache/tag-aware-handler.d.ts +52 -0
  120. package/dist/cache/tag-aware-handler.d.ts.map +1 -0
  121. package/dist/cache/timber-cache.d.ts +20 -10
  122. package/dist/cache/timber-cache.d.ts.map +1 -1
  123. package/dist/cdn/cloudflare-purge.d.ts +23 -0
  124. package/dist/cdn/cloudflare-purge.d.ts.map +1 -0
  125. package/dist/cdn/fastly-purge.d.ts +25 -0
  126. package/dist/cdn/fastly-purge.d.ts.map +1 -0
  127. package/dist/cdn/headers.d.ts +97 -0
  128. package/dist/cdn/headers.d.ts.map +1 -0
  129. package/dist/cdn/index.d.ts +5 -0
  130. package/dist/cdn/index.d.ts.map +1 -0
  131. package/dist/cdn/purge-store.d.ts +23 -0
  132. package/dist/cdn/purge-store.d.ts.map +1 -0
  133. package/dist/cdn/workers-cache-purge.d.ts +16 -0
  134. package/dist/cdn/workers-cache-purge.d.ts.map +1 -0
  135. package/dist/cli-schema-sync.d.ts +59 -0
  136. package/dist/cli-schema-sync.d.ts.map +1 -0
  137. package/dist/cli.d.ts +34 -2
  138. package/dist/cli.d.ts.map +1 -1
  139. package/dist/cli.js +109 -34
  140. package/dist/cli.js.map +1 -1
  141. package/dist/client/browser-dev.d.ts +37 -1
  142. package/dist/client/browser-dev.d.ts.map +1 -1
  143. package/dist/client/browser-entry/action-dispatch.d.ts +17 -0
  144. package/dist/client/browser-entry/action-dispatch.d.ts.map +1 -0
  145. package/dist/client/browser-entry/hmr.d.ts +21 -0
  146. package/dist/client/browser-entry/hmr.d.ts.map +1 -0
  147. package/dist/client/browser-entry/hydrate.d.ts +46 -0
  148. package/dist/client/browser-entry/hydrate.d.ts.map +1 -0
  149. package/dist/client/browser-entry/index.d.ts +29 -0
  150. package/dist/client/browser-entry/index.d.ts.map +1 -0
  151. package/dist/client/browser-entry/post-hydration.d.ts +26 -0
  152. package/dist/client/browser-entry/post-hydration.d.ts.map +1 -0
  153. package/dist/client/browser-entry/router-init.d.ts +27 -0
  154. package/dist/client/browser-entry/router-init.d.ts.map +1 -0
  155. package/dist/client/browser-entry/rsc-stream.d.ts +24 -0
  156. package/dist/client/browser-entry/rsc-stream.d.ts.map +1 -0
  157. package/dist/client/browser-entry/scroll.d.ts +28 -0
  158. package/dist/client/browser-entry/scroll.d.ts.map +1 -0
  159. package/dist/client/child-segment-context.d.ts +22 -0
  160. package/dist/client/child-segment-context.d.ts.map +1 -0
  161. package/dist/client/child-segment-outlet.d.ts +18 -0
  162. package/dist/client/child-segment-outlet.d.ts.map +1 -0
  163. package/dist/client/child-segment-provider.d.ts +21 -0
  164. package/dist/client/child-segment-provider.d.ts.map +1 -0
  165. package/dist/client/error-boundary.d.ts +12 -5
  166. package/dist/client/error-boundary.d.ts.map +1 -1
  167. package/dist/client/error-boundary.js +47 -10
  168. package/dist/client/error-boundary.js.map +1 -1
  169. package/dist/client/error-reconstituter.d.ts +61 -0
  170. package/dist/client/error-reconstituter.d.ts.map +1 -0
  171. package/dist/client/form.d.ts +16 -27
  172. package/dist/client/form.d.ts.map +1 -1
  173. package/dist/client/history.d.ts +21 -6
  174. package/dist/client/history.d.ts.map +1 -1
  175. package/dist/client/index.d.ts +10 -24
  176. package/dist/client/index.d.ts.map +1 -1
  177. package/dist/client/index.js +185 -1134
  178. package/dist/client/index.js.map +1 -1
  179. package/dist/client/internal.d.ts +19 -0
  180. package/dist/client/internal.d.ts.map +1 -0
  181. package/dist/client/internal.js +849 -0
  182. package/dist/client/internal.js.map +1 -0
  183. package/dist/client/link.d.ts +69 -60
  184. package/dist/client/link.d.ts.map +1 -1
  185. package/dist/client/navigation-api.d.ts +120 -0
  186. package/dist/client/navigation-api.d.ts.map +1 -0
  187. package/dist/client/navigation-context.d.ts +3 -2
  188. package/dist/client/navigation-context.d.ts.map +1 -1
  189. package/dist/client/navigation-root.d.ts +119 -0
  190. package/dist/client/navigation-root.d.ts.map +1 -0
  191. package/dist/client/nuqs-adapter.d.ts +1 -1
  192. package/dist/client/nuqs-adapter.d.ts.map +1 -1
  193. package/dist/client/router-ref.d.ts +1 -1
  194. package/dist/client/router.d.ts +93 -14
  195. package/dist/client/router.d.ts.map +1 -1
  196. package/dist/client/rsc-fetch.d.ts +47 -14
  197. package/dist/client/rsc-fetch.d.ts.map +1 -1
  198. package/dist/client/segment-cache.d.ts +4 -4
  199. package/dist/client/segment-cache.d.ts.map +1 -1
  200. package/dist/client/segment-outlet.d.ts +49 -0
  201. package/dist/client/segment-outlet.d.ts.map +1 -0
  202. package/dist/client/segment-update-context.d.ts +21 -0
  203. package/dist/client/segment-update-context.d.ts.map +1 -0
  204. package/dist/client/shallow-url.d.ts +10 -0
  205. package/dist/client/shallow-url.d.ts.map +1 -0
  206. package/dist/client/slot-context.d.ts +29 -0
  207. package/dist/client/slot-context.d.ts.map +1 -0
  208. package/dist/client/slot-outlet.d.ts +16 -0
  209. package/dist/client/slot-outlet.d.ts.map +1 -0
  210. package/dist/client/slot-provider.d.ts +20 -0
  211. package/dist/client/slot-provider.d.ts.map +1 -0
  212. package/dist/client/ssr-data.d.ts +13 -4
  213. package/dist/client/ssr-data.d.ts.map +1 -1
  214. package/dist/client/state.d.ts +1 -1
  215. package/dist/client/top-loader.d.ts +5 -5
  216. package/dist/client/top-loader.d.ts.map +1 -1
  217. package/dist/client/use-cookie.d.ts +12 -0
  218. package/dist/client/use-cookie.d.ts.map +1 -1
  219. package/dist/client/use-link-status.d.ts +5 -5
  220. package/dist/client/use-link-status.d.ts.map +1 -1
  221. package/dist/client/use-pathname.d.ts.map +1 -1
  222. package/dist/client/use-pending-navigation.d.ts +23 -0
  223. package/dist/client/use-pending-navigation.d.ts.map +1 -0
  224. package/dist/client/use-query-states.d.ts +1 -1
  225. package/dist/client/use-query-states.d.ts.map +1 -1
  226. package/dist/client/use-router.d.ts +1 -1
  227. package/dist/client/use-router.d.ts.map +1 -1
  228. package/dist/client/use-search-params.d.ts +12 -5
  229. package/dist/client/use-search-params.d.ts.map +1 -1
  230. package/dist/client/{use-params.d.ts → use-segment-params.d.ts} +8 -6
  231. package/dist/client/use-segment-params.d.ts.map +1 -0
  232. package/dist/codec.d.ts +69 -0
  233. package/dist/codec.d.ts.map +1 -0
  234. package/dist/codec.js +76 -0
  235. package/dist/codec.js.map +1 -0
  236. package/dist/config-types.d.ts +284 -0
  237. package/dist/config-types.d.ts.map +1 -0
  238. package/dist/config-validation.d.ts +51 -0
  239. package/dist/config-validation.d.ts.map +1 -0
  240. package/dist/content/index.d.ts +1 -10
  241. package/dist/content/index.d.ts.map +1 -1
  242. package/dist/content/index.js +0 -2
  243. package/dist/cookies/define-cookie.d.ts +58 -25
  244. package/dist/cookies/define-cookie.d.ts.map +1 -1
  245. package/dist/cookies/index.d.ts +2 -1
  246. package/dist/cookies/index.d.ts.map +1 -1
  247. package/dist/cookies/index.js +257 -36
  248. package/dist/cookies/index.js.map +1 -1
  249. package/dist/cookies/json-cookie.d.ts +64 -0
  250. package/dist/cookies/json-cookie.d.ts.map +1 -0
  251. package/dist/cookies/validation.d.ts +34 -0
  252. package/dist/cookies/validation.d.ts.map +1 -0
  253. package/dist/dev-tools/404-page.d.ts +50 -0
  254. package/dist/dev-tools/404-page.d.ts.map +1 -0
  255. package/dist/dev-tools/browser-logs.d.ts +40 -0
  256. package/dist/dev-tools/browser-logs.d.ts.map +1 -0
  257. package/dist/dev-tools/dev-page-shell.d.ts +78 -0
  258. package/dist/dev-tools/dev-page-shell.d.ts.map +1 -0
  259. package/dist/dev-tools/error-page.d.ts +32 -0
  260. package/dist/dev-tools/error-page.d.ts.map +1 -0
  261. package/dist/dev-tools/holding-server.d.ts +54 -0
  262. package/dist/dev-tools/holding-server.d.ts.map +1 -0
  263. package/dist/dev-tools/hydration-overlay.d.ts +11 -0
  264. package/dist/dev-tools/hydration-overlay.d.ts.map +1 -0
  265. package/dist/dev-tools/index.d.ts +31 -0
  266. package/dist/dev-tools/index.d.ts.map +1 -0
  267. package/dist/dev-tools/instrumentation.d.ts +59 -0
  268. package/dist/dev-tools/instrumentation.d.ts.map +1 -0
  269. package/dist/{server/dev-logger.d.ts → dev-tools/logger.d.ts} +1 -1
  270. package/dist/dev-tools/logger.d.ts.map +1 -0
  271. package/dist/{plugins/dev-logs.d.ts → dev-tools/logs.d.ts} +17 -3
  272. package/dist/dev-tools/logs.d.ts.map +1 -0
  273. package/dist/dev-tools/overlay.d.ts +91 -0
  274. package/dist/dev-tools/overlay.d.ts.map +1 -0
  275. package/dist/dev-tools/stack-classifier.d.ts +34 -0
  276. package/dist/dev-tools/stack-classifier.d.ts.map +1 -0
  277. package/dist/dev-tools/terminal.d.ts +28 -0
  278. package/dist/dev-tools/terminal.d.ts.map +1 -0
  279. package/dist/fonts/ast-walk.d.ts +68 -0
  280. package/dist/fonts/ast-walk.d.ts.map +1 -0
  281. package/dist/fonts/ast.d.ts +110 -6
  282. package/dist/fonts/ast.d.ts.map +1 -1
  283. package/dist/fonts/bundle.d.ts +50 -0
  284. package/dist/fonts/bundle.d.ts.map +1 -0
  285. package/dist/fonts/dev-middleware.d.ts +22 -0
  286. package/dist/fonts/dev-middleware.d.ts.map +1 -0
  287. package/dist/fonts/fallbacks.d.ts +0 -7
  288. package/dist/fonts/fallbacks.d.ts.map +1 -1
  289. package/dist/fonts/google.d.ts +4 -2
  290. package/dist/fonts/google.d.ts.map +1 -1
  291. package/dist/fonts/local.d.ts +4 -4
  292. package/dist/fonts/local.d.ts.map +1 -1
  293. package/dist/fonts/paths.d.ts +43 -0
  294. package/dist/fonts/paths.d.ts.map +1 -0
  295. package/dist/fonts/pipeline.d.ts +177 -0
  296. package/dist/fonts/pipeline.d.ts.map +1 -0
  297. package/dist/fonts/transform.d.ts +82 -0
  298. package/dist/fonts/transform.d.ts.map +1 -0
  299. package/dist/fonts/types.d.ts +47 -1
  300. package/dist/fonts/types.d.ts.map +1 -1
  301. package/dist/fonts/virtual-modules.d.ts +77 -0
  302. package/dist/fonts/virtual-modules.d.ts.map +1 -0
  303. package/dist/index.d.ts +46 -180
  304. package/dist/index.d.ts.map +1 -1
  305. package/dist/index.js +8506 -13599
  306. package/dist/index.js.map +1 -1
  307. package/dist/params/codec-registry.d.ts +26 -0
  308. package/dist/params/codec-registry.d.ts.map +1 -0
  309. package/dist/params/define-schema.d.ts +81 -0
  310. package/dist/params/define-schema.d.ts.map +1 -0
  311. package/dist/params/index.d.ts +5 -0
  312. package/dist/params/index.d.ts.map +1 -0
  313. package/dist/params/index.js +34 -0
  314. package/dist/params/index.js.map +1 -0
  315. package/dist/params/resolve-schema.d.ts +34 -0
  316. package/dist/params/resolve-schema.d.ts.map +1 -0
  317. package/dist/plugin-context.d.ts +217 -0
  318. package/dist/plugin-context.d.ts.map +1 -0
  319. package/dist/plugins/adapter-build.d.ts +21 -1
  320. package/dist/plugins/adapter-build.d.ts.map +1 -1
  321. package/dist/plugins/build-manifest.d.ts +7 -3
  322. package/dist/plugins/build-manifest.d.ts.map +1 -1
  323. package/dist/plugins/build-report.d.ts +43 -7
  324. package/dist/plugins/build-report.d.ts.map +1 -1
  325. package/dist/plugins/cache.d.ts +64 -0
  326. package/dist/plugins/cache.d.ts.map +1 -0
  327. package/dist/plugins/callsite-ast.d.ts +117 -0
  328. package/dist/plugins/callsite-ast.d.ts.map +1 -0
  329. package/dist/plugins/callsite-jsx.d.ts +35 -0
  330. package/dist/plugins/callsite-jsx.d.ts.map +1 -0
  331. package/dist/plugins/chunks.d.ts +11 -4
  332. package/dist/plugins/chunks.d.ts.map +1 -1
  333. package/dist/plugins/client-chunks.d.ts +40 -0
  334. package/dist/plugins/client-chunks.d.ts.map +1 -0
  335. package/dist/plugins/cloudflare-wasm.d.ts +21 -0
  336. package/dist/plugins/cloudflare-wasm.d.ts.map +1 -0
  337. package/dist/plugins/content.d.ts +1 -1
  338. package/dist/plugins/content.d.ts.map +1 -1
  339. package/dist/plugins/dev-server.d.ts +17 -1
  340. package/dist/plugins/dev-server.d.ts.map +1 -1
  341. package/dist/plugins/entries.d.ts +28 -4
  342. package/dist/plugins/entries.d.ts.map +1 -1
  343. package/dist/plugins/fonts.d.ts +16 -73
  344. package/dist/plugins/fonts.d.ts.map +1 -1
  345. package/dist/plugins/mdx.d.ts +1 -1
  346. package/dist/plugins/mdx.d.ts.map +1 -1
  347. package/dist/plugins/prebuilt-capture.d.ts +60 -0
  348. package/dist/plugins/prebuilt-capture.d.ts.map +1 -0
  349. package/dist/plugins/prebuilt-options-analysis.d.ts +40 -0
  350. package/dist/plugins/prebuilt-options-analysis.d.ts.map +1 -0
  351. package/dist/plugins/prebuilt.d.ts +82 -0
  352. package/dist/plugins/prebuilt.d.ts.map +1 -0
  353. package/dist/plugins/prerender-sugar.d.ts +42 -0
  354. package/dist/plugins/prerender-sugar.d.ts.map +1 -0
  355. package/dist/plugins/routing.d.ts +1 -1
  356. package/dist/plugins/routing.d.ts.map +1 -1
  357. package/dist/plugins/server-bundle.d.ts.map +1 -1
  358. package/dist/plugins/shims.d.ts +29 -5
  359. package/dist/plugins/shims.d.ts.map +1 -1
  360. package/dist/plugins/static-build.d.ts +5 -26
  361. package/dist/plugins/static-build.d.ts.map +1 -1
  362. package/dist/routing/codegen-shared.d.ts +67 -0
  363. package/dist/routing/codegen-shared.d.ts.map +1 -0
  364. package/dist/routing/codegen-types.d.ts +64 -0
  365. package/dist/routing/codegen-types.d.ts.map +1 -0
  366. package/dist/routing/codegen.d.ts +7 -2
  367. package/dist/routing/codegen.d.ts.map +1 -1
  368. package/dist/routing/convention-lint.d.ts +41 -0
  369. package/dist/routing/convention-lint.d.ts.map +1 -0
  370. package/dist/routing/export-detect.d.ts +56 -0
  371. package/dist/routing/export-detect.d.ts.map +1 -0
  372. package/dist/routing/file-cache.d.ts +8 -0
  373. package/dist/routing/file-cache.d.ts.map +1 -0
  374. package/dist/routing/index.d.ts +7 -1
  375. package/dist/routing/index.d.ts.map +1 -1
  376. package/dist/routing/index.js +4 -2
  377. package/dist/routing/interception.d.ts +0 -5
  378. package/dist/routing/interception.d.ts.map +1 -1
  379. package/dist/routing/link-codegen.d.ts +90 -0
  380. package/dist/routing/link-codegen.d.ts.map +1 -0
  381. package/dist/routing/manifest-codegen.d.ts +32 -0
  382. package/dist/routing/manifest-codegen.d.ts.map +1 -0
  383. package/dist/routing/scanner.d.ts +1 -10
  384. package/dist/routing/scanner.d.ts.map +1 -1
  385. package/dist/routing/schema-validation.d.ts +35 -0
  386. package/dist/routing/schema-validation.d.ts.map +1 -0
  387. package/dist/routing/segment-classify.d.ts +81 -0
  388. package/dist/routing/segment-classify.d.ts.map +1 -0
  389. package/dist/routing/segment-codegen.d.ts +38 -0
  390. package/dist/routing/segment-codegen.d.ts.map +1 -0
  391. package/dist/routing/types.d.ts +81 -25
  392. package/dist/routing/types.d.ts.map +1 -1
  393. package/dist/routing/walkers.d.ts +51 -0
  394. package/dist/routing/walkers.d.ts.map +1 -0
  395. package/dist/rsc-runtime/rsc.d.ts +1 -1
  396. package/dist/rsc-runtime/rsc.d.ts.map +1 -1
  397. package/dist/rsc-runtime/ssr.d.ts +12 -0
  398. package/dist/rsc-runtime/ssr.d.ts.map +1 -1
  399. package/dist/schema-bridge.d.ts +91 -0
  400. package/dist/schema-bridge.d.ts.map +1 -0
  401. package/dist/search-params/define.d.ts +188 -0
  402. package/dist/search-params/define.d.ts.map +1 -0
  403. package/dist/search-params/index.d.ts +4 -7
  404. package/dist/search-params/index.d.ts.map +1 -1
  405. package/dist/search-params/index.js +34 -441
  406. package/dist/search-params/index.js.map +1 -1
  407. package/dist/search-params/registry.d.ts +2 -2
  408. package/dist/search-params/registry.d.ts.map +1 -1
  409. package/dist/search-params/wrappers.d.ts +53 -0
  410. package/dist/search-params/wrappers.d.ts.map +1 -0
  411. package/dist/segment-params/define.d.ts +89 -0
  412. package/dist/segment-params/define.d.ts.map +1 -0
  413. package/dist/segment-params/index.d.ts +3 -0
  414. package/dist/segment-params/index.d.ts.map +1 -0
  415. package/dist/segment-params/index.js +2 -0
  416. package/dist/server/access-gate.d.ts +8 -3
  417. package/dist/server/access-gate.d.ts.map +1 -1
  418. package/dist/server/action-client.d.ts +42 -7
  419. package/dist/server/action-client.d.ts.map +1 -1
  420. package/dist/server/action-encryption.d.ts +76 -0
  421. package/dist/server/action-encryption.d.ts.map +1 -0
  422. package/dist/server/action-handler.d.ts +35 -1
  423. package/dist/server/action-handler.d.ts.map +1 -1
  424. package/dist/server/actions.d.ts +6 -30
  425. package/dist/server/actions.d.ts.map +1 -1
  426. package/dist/server/als-registry.d.ts +93 -11
  427. package/dist/server/als-registry.d.ts.map +1 -1
  428. package/dist/server/asset-headers.d.ts +8 -18
  429. package/dist/server/asset-headers.d.ts.map +1 -1
  430. package/dist/server/body-limits.d.ts.map +1 -1
  431. package/dist/server/build-manifest.d.ts +6 -29
  432. package/dist/server/build-manifest.d.ts.map +1 -1
  433. package/dist/server/canonicalize.d.ts +10 -0
  434. package/dist/server/canonicalize.d.ts.map +1 -1
  435. package/dist/server/coalesce-tick.d.ts +40 -0
  436. package/dist/server/coalesce-tick.d.ts.map +1 -0
  437. package/dist/server/cookie-context.d.ts +170 -0
  438. package/dist/server/cookie-context.d.ts.map +1 -0
  439. package/dist/server/cookie-parsing.d.ts +65 -0
  440. package/dist/server/cookie-parsing.d.ts.map +1 -0
  441. package/dist/server/csrf.d.ts +3 -2
  442. package/dist/server/csrf.d.ts.map +1 -1
  443. package/dist/server/default-logger.d.ts +22 -0
  444. package/dist/server/default-logger.d.ts.map +1 -0
  445. package/dist/server/deny-boundary.d.ts +117 -0
  446. package/dist/server/deny-boundary.d.ts.map +1 -0
  447. package/dist/server/deny-renderer.d.ts +2 -2
  448. package/dist/server/deny-renderer.d.ts.map +1 -1
  449. package/dist/server/dev-source-map.d.ts +22 -0
  450. package/dist/server/dev-source-map.d.ts.map +1 -0
  451. package/dist/server/early-hints-sender.d.ts.map +1 -1
  452. package/dist/server/early-hints.d.ts +13 -11
  453. package/dist/server/early-hints.d.ts.map +1 -1
  454. package/dist/server/error-boundary-wrapper.d.ts +7 -1
  455. package/dist/server/error-boundary-wrapper.d.ts.map +1 -1
  456. package/dist/server/fallback-error.d.ts +12 -7
  457. package/dist/server/fallback-error.d.ts.map +1 -1
  458. package/dist/server/flight-injection-state.d.ts +66 -0
  459. package/dist/server/flight-injection-state.d.ts.map +1 -0
  460. package/dist/server/flight-scripts.d.ts +42 -0
  461. package/dist/server/flight-scripts.d.ts.map +1 -0
  462. package/dist/server/form-data.d.ts +41 -0
  463. package/dist/server/form-data.d.ts.map +1 -1
  464. package/dist/server/html-injector-core.d.ts +242 -0
  465. package/dist/server/html-injector-core.d.ts.map +1 -0
  466. package/dist/server/html-injectors.d.ts +82 -41
  467. package/dist/server/html-injectors.d.ts.map +1 -1
  468. package/dist/server/index.d.ts +11 -47
  469. package/dist/server/index.d.ts.map +1 -1
  470. package/dist/server/index.js +182 -2906
  471. package/dist/server/index.js.map +1 -1
  472. package/dist/server/internal.d.ts +49 -0
  473. package/dist/server/internal.d.ts.map +1 -0
  474. package/dist/server/internal.js +3945 -0
  475. package/dist/server/internal.js.map +1 -0
  476. package/dist/server/logger.d.ts +39 -7
  477. package/dist/server/logger.d.ts.map +1 -1
  478. package/dist/server/metadata-routes.d.ts +47 -11
  479. package/dist/server/metadata-routes.d.ts.map +1 -1
  480. package/dist/server/middleware-runner.d.ts +19 -4
  481. package/dist/server/middleware-runner.d.ts.map +1 -1
  482. package/dist/server/node-stream-transforms.d.ts +119 -0
  483. package/dist/server/node-stream-transforms.d.ts.map +1 -0
  484. package/dist/server/param-coercion.d.ts +54 -0
  485. package/dist/server/param-coercion.d.ts.map +1 -0
  486. package/dist/server/pipeline-helpers.d.ts +95 -0
  487. package/dist/server/pipeline-helpers.d.ts.map +1 -0
  488. package/dist/server/pipeline-interception.d.ts +1 -1
  489. package/dist/server/pipeline-interception.d.ts.map +1 -1
  490. package/dist/server/pipeline-metadata.d.ts +6 -0
  491. package/dist/server/pipeline-metadata.d.ts.map +1 -1
  492. package/dist/server/pipeline-outcome.d.ts +49 -0
  493. package/dist/server/pipeline-outcome.d.ts.map +1 -0
  494. package/dist/server/pipeline-phases.d.ts +59 -0
  495. package/dist/server/pipeline-phases.d.ts.map +1 -0
  496. package/dist/server/pipeline.d.ts +140 -19
  497. package/dist/server/pipeline.d.ts.map +1 -1
  498. package/dist/server/port-resolution.d.ts +117 -0
  499. package/dist/server/port-resolution.d.ts.map +1 -0
  500. package/dist/server/prebuilt/cache-key.d.ts +62 -0
  501. package/dist/server/prebuilt/cache-key.d.ts.map +1 -0
  502. package/dist/server/prebuilt/capture-state.d.ts +57 -0
  503. package/dist/server/prebuilt/capture-state.d.ts.map +1 -0
  504. package/dist/server/prebuilt/key-discipline.d.ts +23 -0
  505. package/dist/server/prebuilt/key-discipline.d.ts.map +1 -0
  506. package/dist/server/prebuilt/manifest-tag-index.d.ts +27 -0
  507. package/dist/server/prebuilt/manifest-tag-index.d.ts.map +1 -0
  508. package/dist/server/prebuilt/overlay.d.ts +100 -0
  509. package/dist/server/prebuilt/overlay.d.ts.map +1 -0
  510. package/dist/server/prebuilt/payload-source.d.ts +78 -0
  511. package/dist/server/prebuilt/payload-source.d.ts.map +1 -0
  512. package/dist/server/prebuilt/slots.d.ts +74 -0
  513. package/dist/server/prebuilt/slots.d.ts.map +1 -0
  514. package/dist/server/prebuilt/synthetic-store.d.ts +66 -0
  515. package/dist/server/prebuilt/synthetic-store.d.ts.map +1 -0
  516. package/dist/server/prebuilt-builder.d.ts +120 -0
  517. package/dist/server/prebuilt-builder.d.ts.map +1 -0
  518. package/dist/server/prebuilt-runtime.d.ts +111 -0
  519. package/dist/server/prebuilt-runtime.d.ts.map +1 -0
  520. package/dist/server/primitives.d.ts +88 -43
  521. package/dist/server/primitives.d.ts.map +1 -1
  522. package/dist/server/render-timeout.d.ts +51 -0
  523. package/dist/server/render-timeout.d.ts.map +1 -0
  524. package/dist/server/render-utils.d.ts +25 -0
  525. package/dist/server/render-utils.d.ts.map +1 -0
  526. package/dist/server/request-context.d.ts +62 -107
  527. package/dist/server/request-context.d.ts.map +1 -1
  528. package/dist/server/route-element-builder.d.ts +55 -25
  529. package/dist/server/route-element-builder.d.ts.map +1 -1
  530. package/dist/server/route-handler.d.ts.map +1 -1
  531. package/dist/server/route-matcher.d.ts +25 -36
  532. package/dist/server/route-matcher.d.ts.map +1 -1
  533. package/dist/server/rsc-entry/action-middleware-runner.d.ts +66 -0
  534. package/dist/server/rsc-entry/action-middleware-runner.d.ts.map +1 -0
  535. package/dist/server/rsc-entry/api-handler.d.ts +12 -3
  536. package/dist/server/rsc-entry/api-handler.d.ts.map +1 -1
  537. package/dist/server/rsc-entry/deny-fallback.d.ts +29 -0
  538. package/dist/server/rsc-entry/deny-fallback.d.ts.map +1 -0
  539. package/dist/server/rsc-entry/error-renderer.d.ts +26 -13
  540. package/dist/server/rsc-entry/error-renderer.d.ts.map +1 -1
  541. package/dist/server/rsc-entry/helpers.d.ts +51 -28
  542. package/dist/server/rsc-entry/helpers.d.ts.map +1 -1
  543. package/dist/server/rsc-entry/index.d.ts +28 -6
  544. package/dist/server/rsc-entry/index.d.ts.map +1 -1
  545. package/dist/server/rsc-entry/render-route.d.ts +51 -0
  546. package/dist/server/rsc-entry/render-route.d.ts.map +1 -0
  547. package/dist/server/rsc-entry/revalidate-renderer.d.ts +108 -0
  548. package/dist/server/rsc-entry/revalidate-renderer.d.ts.map +1 -0
  549. package/dist/server/rsc-entry/rsc-payload.d.ts +5 -6
  550. package/dist/server/rsc-entry/rsc-payload.d.ts.map +1 -1
  551. package/dist/server/rsc-entry/rsc-stream.d.ts +25 -1
  552. package/dist/server/rsc-entry/rsc-stream.d.ts.map +1 -1
  553. package/dist/server/rsc-entry/ssr-bridge.d.ts +5 -1
  554. package/dist/server/rsc-entry/ssr-bridge.d.ts.map +1 -1
  555. package/dist/server/rsc-entry/ssr-renderer.d.ts +34 -4
  556. package/dist/server/rsc-entry/ssr-renderer.d.ts.map +1 -1
  557. package/dist/server/rsc-entry/wrap-action-dispatch.d.ts +89 -0
  558. package/dist/server/rsc-entry/wrap-action-dispatch.d.ts.map +1 -0
  559. package/dist/server/safe-load.d.ts +46 -0
  560. package/dist/server/safe-load.d.ts.map +1 -0
  561. package/dist/server/sensitive-fields.d.ts +74 -0
  562. package/dist/server/sensitive-fields.d.ts.map +1 -0
  563. package/dist/server/sitemap-generator.d.ts +129 -0
  564. package/dist/server/sitemap-generator.d.ts.map +1 -0
  565. package/dist/server/sitemap-handler.d.ts +22 -0
  566. package/dist/server/sitemap-handler.d.ts.map +1 -0
  567. package/dist/server/slot-resolver.d.ts +7 -5
  568. package/dist/server/slot-resolver.d.ts.map +1 -1
  569. package/dist/server/ssr-bridge-types.d.ts +121 -0
  570. package/dist/server/ssr-bridge-types.d.ts.map +1 -0
  571. package/dist/server/ssr-entry.d.ts +2 -43
  572. package/dist/server/ssr-entry.d.ts.map +1 -1
  573. package/dist/server/ssr-render.d.ts +64 -21
  574. package/dist/server/ssr-render.d.ts.map +1 -1
  575. package/dist/server/ssr-wrappers.d.ts +50 -0
  576. package/dist/server/ssr-wrappers.d.ts.map +1 -0
  577. package/dist/server/state-tree-diff.d.ts +36 -6
  578. package/dist/server/state-tree-diff.d.ts.map +1 -1
  579. package/dist/server/status-code-resolver.d.ts +22 -11
  580. package/dist/server/status-code-resolver.d.ts.map +1 -1
  581. package/dist/server/stream-utils.d.ts +47 -0
  582. package/dist/server/stream-utils.d.ts.map +1 -0
  583. package/dist/server/tracing.d.ts +44 -9
  584. package/dist/server/tracing.d.ts.map +1 -1
  585. package/dist/server/tree-builder.d.ts +62 -30
  586. package/dist/server/tree-builder.d.ts.map +1 -1
  587. package/dist/server/tree-match.d.ts +49 -0
  588. package/dist/server/tree-match.d.ts.map +1 -0
  589. package/dist/server/types.d.ts +71 -6
  590. package/dist/server/types.d.ts.map +1 -1
  591. package/dist/server/utils/escape-html.d.ts +14 -0
  592. package/dist/server/utils/escape-html.d.ts.map +1 -0
  593. package/dist/server/utils/mdx-file.d.ts +15 -0
  594. package/dist/server/utils/mdx-file.d.ts.map +1 -0
  595. package/dist/server/version-skew.d.ts +61 -0
  596. package/dist/server/version-skew.d.ts.map +1 -0
  597. package/dist/server/workers-cache-bridge.d.ts +26 -0
  598. package/dist/server/workers-cache-bridge.d.ts.map +1 -0
  599. package/dist/shared/href-validation.d.ts +49 -0
  600. package/dist/shared/href-validation.d.ts.map +1 -0
  601. package/dist/shared/merge-search-params.d.ts +22 -0
  602. package/dist/shared/merge-search-params.d.ts.map +1 -0
  603. package/dist/shared/redirect-type.d.ts +17 -0
  604. package/dist/shared/redirect-type.d.ts.map +1 -0
  605. package/dist/shims/font-google.d.ts +1 -1
  606. package/dist/shims/font-google.d.ts.map +1 -1
  607. package/dist/shims/font-google.js +42 -0
  608. package/dist/shims/font-google.js.map +1 -0
  609. package/dist/shims/font-local.d.ts +26 -0
  610. package/dist/shims/font-local.d.ts.map +1 -0
  611. package/dist/shims/font-local.js +20 -0
  612. package/dist/shims/font-local.js.map +1 -0
  613. package/dist/shims/headers.d.ts +53 -1
  614. package/dist/shims/headers.d.ts.map +1 -1
  615. package/dist/shims/image.d.ts +120 -120
  616. package/dist/shims/image.d.ts.map +1 -1
  617. package/dist/shims/navigation-client.d.ts +35 -11
  618. package/dist/shims/navigation-client.d.ts.map +1 -1
  619. package/dist/shims/navigation.d.ts +11 -5
  620. package/dist/shims/navigation.d.ts.map +1 -1
  621. package/dist/utils/state-machine.d.ts +80 -0
  622. package/dist/utils/state-machine.d.ts.map +1 -0
  623. package/docs/api/30-api-server.mdx +233 -0
  624. package/docs/api/31-api-client.mdx +161 -0
  625. package/docs/api/32-api-cache.mdx +311 -0
  626. package/docs/api/33-api-search-params.mdx +154 -0
  627. package/docs/api/34-api-config.mdx +325 -0
  628. package/docs/api/35-api-typescript.mdx +170 -0
  629. package/docs/api/36-cli.mdx +143 -0
  630. package/docs/learn/00-introduction.mdx +109 -0
  631. package/docs/learn/01-quick-start.mdx +94 -0
  632. package/docs/learn/02-pages-and-layouts.mdx +147 -0
  633. package/docs/learn/03-fetching-data.mdx +211 -0
  634. package/docs/learn/03b-access-control.mdx +130 -0
  635. package/docs/learn/04-loading-states.mdx +67 -0
  636. package/docs/learn/04b-the-flush-point.mdx +115 -0
  637. package/docs/learn/05-typed-params.mdx +275 -0
  638. package/docs/learn/06-forms-and-actions.mdx +146 -0
  639. package/docs/learn/07-typed-routes.mdx +127 -0
  640. package/docs/learn/08-streaming.mdx +146 -0
  641. package/docs/learn/09-caching.mdx +252 -0
  642. package/docs/learn/10-middleware.mdx +157 -0
  643. package/docs/learn/11-error-handling.mdx +156 -0
  644. package/docs/learn/12-client-navigation.mdx +176 -0
  645. package/docs/learn/13-configuration.mdx +162 -0
  646. package/docs/learn/14-deploying.mdx +264 -0
  647. package/docs/more/01-advanced-routing.mdx +173 -0
  648. package/docs/more/02-advanced-forms.mdx +137 -0
  649. package/docs/more/03-coming-from-nextjs.mdx +186 -0
  650. package/docs/more/04-metadata-and-fonts.mdx +193 -0
  651. package/docs/more/04b-mdx.mdx +209 -0
  652. package/docs/more/05-content-collections.mdx +90 -0
  653. package/docs/more/06-instrumentation.mdx +214 -0
  654. package/docs/more/07-security.mdx +129 -0
  655. package/docs/more/08-developer-experience.mdx +134 -0
  656. package/docs/more/40-why-timber.mdx +50 -0
  657. package/docs/more/41-timber-vs-nextjs.mdx +81 -0
  658. package/docs/more/42-timber-vs-others.mdx +68 -0
  659. package/docs/more/50-ai-agent-instructions.mdx +169 -0
  660. package/llms.txt +55 -0
  661. package/package.json +105 -26
  662. package/src/adapters/build-output-helper.ts +199 -0
  663. package/src/adapters/cloudflare-dev.ts +177 -0
  664. package/src/adapters/cloudflare-kv-cache.ts +204 -0
  665. package/src/adapters/cloudflare.ts +620 -129
  666. package/src/adapters/compress-module.ts +27 -92
  667. package/src/adapters/nitro.ts +266 -122
  668. package/src/adapters/raw-imports.d.ts +5 -0
  669. package/src/adapters/shared.ts +68 -0
  670. package/src/adapters/types.ts +2 -7
  671. package/src/adapters/wrangler.d.ts +7 -0
  672. package/src/cache/cache-api.ts +107 -0
  673. package/src/cache/handler-store.ts +76 -0
  674. package/src/cache/index.ts +114 -21
  675. package/src/cache/invalidation-epoch.ts +93 -0
  676. package/src/cache/json-lossy-check.ts +75 -0
  677. package/src/cache/redis-handler.ts +197 -19
  678. package/src/cache/singleflight.ts +64 -6
  679. package/src/cache/sizeof.ts +33 -0
  680. package/src/cache/stable-stringify.ts +65 -2
  681. package/src/cache/store.ts +71 -0
  682. package/src/cache/stores/cloudflare-kv.ts +52 -0
  683. package/src/cache/stores/memory.ts +125 -0
  684. package/src/cache/stores/redis.ts +97 -0
  685. package/src/cache/stores/vercel.ts +59 -0
  686. package/src/cache/tag-aware-handler.ts +237 -0
  687. package/src/cache/timber-cache.ts +161 -36
  688. package/src/cdn/cloudflare-purge.ts +50 -0
  689. package/src/cdn/fastly-purge.ts +63 -0
  690. package/src/cdn/headers.ts +153 -0
  691. package/src/cdn/index.ts +17 -0
  692. package/src/cdn/purge-store.ts +34 -0
  693. package/src/cdn/workers-cache-purge.ts +30 -0
  694. package/src/cli-schema-sync.ts +401 -0
  695. package/src/cli.ts +157 -34
  696. package/src/client/browser-dev.ts +156 -1
  697. package/src/client/browser-entry/action-dispatch.ts +124 -0
  698. package/src/client/browser-entry/hmr.ts +70 -0
  699. package/src/client/browser-entry/hydrate.ts +187 -0
  700. package/src/client/browser-entry/index.ts +113 -0
  701. package/src/client/browser-entry/post-hydration.ts +110 -0
  702. package/src/client/browser-entry/router-init.ts +289 -0
  703. package/src/client/browser-entry/rsc-stream.ts +157 -0
  704. package/src/client/browser-entry/scroll.ts +50 -0
  705. package/src/client/child-segment-context.ts +40 -0
  706. package/src/client/child-segment-outlet.tsx +25 -0
  707. package/src/client/child-segment-provider.tsx +27 -0
  708. package/src/client/error-boundary.tsx +127 -22
  709. package/src/client/error-reconstituter.tsx +79 -0
  710. package/src/client/form.tsx +31 -32
  711. package/src/client/history.ts +21 -6
  712. package/src/client/index.ts +67 -45
  713. package/src/client/internal.ts +58 -0
  714. package/src/client/link.tsx +349 -150
  715. package/src/client/navigation-api.ts +341 -0
  716. package/src/client/navigation-context.ts +15 -7
  717. package/src/client/navigation-root.tsx +355 -0
  718. package/src/client/nuqs-adapter.tsx +16 -3
  719. package/src/client/router-ref.ts +1 -1
  720. package/src/client/router.ts +538 -206
  721. package/src/client/rsc-fetch.ts +214 -33
  722. package/src/client/segment-cache.ts +11 -12
  723. package/src/client/segment-outlet.tsx +77 -0
  724. package/src/client/segment-update-context.ts +42 -0
  725. package/src/client/shallow-url.ts +22 -0
  726. package/src/client/slot-context.ts +48 -0
  727. package/src/client/slot-outlet.tsx +22 -0
  728. package/src/client/slot-provider.tsx +25 -0
  729. package/src/client/ssr-data.ts +13 -5
  730. package/src/client/state.ts +2 -2
  731. package/src/client/top-loader.tsx +11 -9
  732. package/src/client/use-cookie.ts +60 -15
  733. package/src/client/use-link-status.ts +7 -7
  734. package/src/client/use-pathname.ts +1 -0
  735. package/src/client/use-pending-navigation.ts +40 -0
  736. package/src/client/use-query-states.ts +108 -10
  737. package/src/client/use-router.ts +4 -1
  738. package/src/client/use-search-params.ts +31 -44
  739. package/src/client/{use-params.ts → use-segment-params.ts} +9 -6
  740. package/src/codec.ts +149 -0
  741. package/src/config-types.ts +282 -0
  742. package/src/config-validation.ts +330 -0
  743. package/src/content/index.ts +5 -13
  744. package/src/cookies/define-cookie.ts +217 -53
  745. package/src/cookies/index.ts +12 -1
  746. package/src/cookies/json-cookie.ts +105 -0
  747. package/src/cookies/validation.ts +192 -0
  748. package/src/dev-tools/404-page.ts +286 -0
  749. package/src/dev-tools/browser-logs.ts +55 -0
  750. package/src/dev-tools/dev-page-shell.ts +260 -0
  751. package/src/dev-tools/error-page.ts +331 -0
  752. package/src/dev-tools/holding-server.ts +187 -0
  753. package/src/dev-tools/hydration-overlay.ts +158 -0
  754. package/src/dev-tools/index.ts +83 -0
  755. package/src/dev-tools/instrumentation.ts +213 -0
  756. package/src/{server/dev-logger.ts → dev-tools/logger.ts} +33 -51
  757. package/src/{plugins/dev-logs.ts → dev-tools/logs.ts} +122 -26
  758. package/src/dev-tools/overlay.ts +469 -0
  759. package/src/dev-tools/stack-classifier.ts +75 -0
  760. package/src/dev-tools/terminal.ts +182 -0
  761. package/src/fonts/ast-walk.ts +235 -0
  762. package/src/fonts/ast.ts +477 -126
  763. package/src/fonts/bundle.ts +138 -0
  764. package/src/fonts/dev-middleware.ts +85 -0
  765. package/src/fonts/fallbacks.ts +0 -23
  766. package/src/fonts/google.ts +63 -8
  767. package/src/fonts/local.ts +9 -8
  768. package/src/fonts/paths.ts +58 -0
  769. package/src/fonts/pipeline.ts +348 -0
  770. package/src/fonts/transform.ts +311 -0
  771. package/src/fonts/types.ts +52 -1
  772. package/src/fonts/virtual-modules.ts +179 -0
  773. package/src/index.ts +444 -352
  774. package/src/params/codec-registry.ts +34 -0
  775. package/src/params/define-schema.ts +115 -0
  776. package/src/params/index.ts +17 -0
  777. package/src/params/resolve-schema.ts +84 -0
  778. package/src/plugin-context.ts +432 -0
  779. package/src/plugins/adapter-build.ts +220 -7
  780. package/src/plugins/build-manifest.ts +168 -23
  781. package/src/plugins/build-report.ts +253 -35
  782. package/src/plugins/cache.ts +243 -0
  783. package/src/plugins/callsite-ast.ts +472 -0
  784. package/src/plugins/callsite-jsx.ts +243 -0
  785. package/src/plugins/chunks.ts +74 -5
  786. package/src/plugins/client-chunks.ts +185 -0
  787. package/src/plugins/cloudflare-wasm.ts +141 -0
  788. package/src/plugins/content.ts +1 -1
  789. package/src/plugins/dev-server.ts +284 -94
  790. package/src/plugins/entries.ts +134 -16
  791. package/src/plugins/fonts.ts +225 -660
  792. package/src/plugins/mdx.ts +47 -10
  793. package/src/plugins/prebuilt-capture.ts +217 -0
  794. package/src/plugins/prebuilt-options-analysis.ts +175 -0
  795. package/src/plugins/prebuilt.ts +655 -0
  796. package/src/plugins/prerender-sugar.ts +328 -0
  797. package/src/plugins/routing.ts +237 -241
  798. package/src/plugins/server-bundle.ts +89 -12
  799. package/src/plugins/shims.ts +241 -64
  800. package/src/plugins/static-build.ts +15 -90
  801. package/src/routing/codegen-shared.ts +115 -0
  802. package/src/routing/codegen-types.ts +65 -0
  803. package/src/routing/codegen.ts +372 -178
  804. package/src/routing/convention-lint.ts +394 -0
  805. package/src/routing/export-detect.ts +304 -0
  806. package/src/routing/file-cache.ts +23 -0
  807. package/src/routing/index.ts +10 -1
  808. package/src/routing/interception.ts +3 -22
  809. package/src/routing/link-codegen.ts +313 -0
  810. package/src/routing/manifest-codegen.ts +287 -0
  811. package/src/routing/scanner.ts +338 -189
  812. package/src/routing/schema-validation.ts +155 -0
  813. package/src/routing/segment-classify.ts +223 -0
  814. package/src/routing/segment-codegen.ts +98 -0
  815. package/src/routing/types.ts +82 -25
  816. package/src/routing/walkers.ts +90 -0
  817. package/src/rsc-runtime/rsc.ts +9 -0
  818. package/src/rsc-runtime/ssr.ts +50 -0
  819. package/src/rsc-runtime/vendor-types.d.ts +7 -0
  820. package/src/schema-bridge.ts +253 -0
  821. package/src/search-params/define.ts +576 -0
  822. package/src/search-params/index.ts +14 -20
  823. package/src/search-params/registry.ts +2 -2
  824. package/src/search-params/wrappers.ts +101 -0
  825. package/src/segment-params/define.ts +249 -0
  826. package/src/segment-params/index.ts +9 -0
  827. package/src/server/access-gate.tsx +84 -34
  828. package/src/server/action-client.ts +120 -29
  829. package/src/server/action-encryption.ts +144 -0
  830. package/src/server/action-handler.ts +123 -33
  831. package/src/server/actions.ts +48 -54
  832. package/src/server/als-registry.ts +137 -20
  833. package/src/server/asset-headers.ts +15 -37
  834. package/src/server/body-limits.ts +10 -2
  835. package/src/server/build-manifest.ts +13 -56
  836. package/src/server/canonicalize.ts +6 -3
  837. package/src/server/coalesce-tick.ts +75 -0
  838. package/src/server/compress.ts +34 -7
  839. package/src/server/cookie-context.ts +484 -0
  840. package/src/server/cookie-parsing.ts +163 -0
  841. package/src/server/csrf.ts +39 -6
  842. package/src/server/default-logger.ts +99 -0
  843. package/src/server/deny-boundary.ts +314 -0
  844. package/src/server/deny-renderer.ts +85 -77
  845. package/src/server/dev-source-map.ts +31 -0
  846. package/src/server/early-hints-sender.ts +3 -2
  847. package/src/server/early-hints.ts +37 -27
  848. package/src/server/error-boundary-wrapper.ts +61 -22
  849. package/src/server/fallback-error.ts +79 -102
  850. package/src/server/flight-injection-state.ts +113 -0
  851. package/src/server/flight-scripts.ts +62 -0
  852. package/src/server/form-data.ts +124 -12
  853. package/src/server/html-injector-core.ts +495 -0
  854. package/src/server/html-injectors.ts +271 -254
  855. package/src/server/index.ts +31 -185
  856. package/src/server/internal.ts +181 -0
  857. package/src/server/logger.ts +72 -36
  858. package/src/server/metadata-routes.ts +110 -24
  859. package/src/server/middleware-runner.ts +31 -4
  860. package/src/server/node-stream-transforms.ts +336 -0
  861. package/src/server/param-coercion.ts +207 -0
  862. package/src/server/pipeline-helpers.ts +204 -0
  863. package/src/server/pipeline-interception.ts +45 -18
  864. package/src/server/pipeline-metadata.ts +14 -0
  865. package/src/server/pipeline-outcome.ts +197 -0
  866. package/src/server/pipeline-phases.ts +545 -0
  867. package/src/server/pipeline.ts +274 -382
  868. package/src/server/port-resolution.ts +215 -0
  869. package/src/server/prebuilt/cache-key.ts +298 -0
  870. package/src/server/prebuilt/capture-state.ts +89 -0
  871. package/src/server/prebuilt/key-discipline.ts +53 -0
  872. package/src/server/prebuilt/manifest-tag-index.ts +46 -0
  873. package/src/server/prebuilt/overlay.ts +256 -0
  874. package/src/server/prebuilt/payload-source.ts +201 -0
  875. package/src/server/prebuilt/slots.ts +167 -0
  876. package/src/server/prebuilt/synthetic-store.ts +121 -0
  877. package/src/server/prebuilt-builder.ts +808 -0
  878. package/src/server/prebuilt-runtime.ts +815 -0
  879. package/src/server/primitives.ts +160 -83
  880. package/src/server/render-timeout.ts +108 -0
  881. package/src/server/render-utils.ts +31 -0
  882. package/src/server/request-context.ts +168 -337
  883. package/src/server/route-element-builder.ts +661 -278
  884. package/src/server/route-handler.ts +31 -4
  885. package/src/server/route-matcher.ts +158 -277
  886. package/src/server/rsc-entry/action-middleware-runner.ts +167 -0
  887. package/src/server/rsc-entry/api-handler.ts +69 -32
  888. package/src/server/rsc-entry/deny-fallback.ts +92 -0
  889. package/src/server/rsc-entry/error-renderer.ts +306 -89
  890. package/src/server/rsc-entry/helpers.ts +165 -79
  891. package/src/server/rsc-entry/index.ts +332 -341
  892. package/src/server/rsc-entry/render-route.ts +292 -0
  893. package/src/server/rsc-entry/revalidate-renderer.ts +349 -0
  894. package/src/server/rsc-entry/rsc-payload.ts +95 -39
  895. package/src/server/rsc-entry/rsc-stream.ts +93 -13
  896. package/src/server/rsc-entry/ssr-bridge.ts +18 -5
  897. package/src/server/rsc-entry/ssr-renderer.ts +273 -43
  898. package/src/server/rsc-entry/wrap-action-dispatch.ts +186 -0
  899. package/src/server/safe-load.ts +60 -0
  900. package/src/server/sensitive-fields.ts +230 -0
  901. package/src/server/server-only-guard-noop.js +3 -0
  902. package/src/server/sitemap-generator.ts +345 -0
  903. package/src/server/sitemap-handler.ts +157 -0
  904. package/src/server/slot-resolver.ts +264 -257
  905. package/src/server/ssr-bridge-types.ts +124 -0
  906. package/src/server/ssr-entry.ts +206 -78
  907. package/src/server/ssr-render.ts +345 -82
  908. package/src/server/ssr-wrappers.tsx +141 -0
  909. package/src/server/state-tree-diff.ts +76 -24
  910. package/src/server/status-code-resolver.ts +115 -130
  911. package/src/server/stream-utils.ts +288 -0
  912. package/src/server/tracing.ts +126 -14
  913. package/src/server/tree-builder.ts +204 -90
  914. package/src/server/tree-match.ts +262 -0
  915. package/src/server/types.ts +78 -9
  916. package/src/server/utils/escape-html.ts +20 -0
  917. package/src/server/utils/mdx-file.ts +22 -0
  918. package/src/server/version-skew.ts +104 -0
  919. package/src/server/workers-cache-bridge.ts +33 -0
  920. package/src/shared/href-validation.ts +159 -0
  921. package/src/shared/merge-search-params.ts +55 -0
  922. package/src/shared/redirect-type.ts +17 -0
  923. package/src/shims/font-google.ts +1 -1
  924. package/src/shims/font-local.ts +34 -0
  925. package/src/shims/headers.ts +122 -1
  926. package/src/shims/navigation-client.ts +51 -29
  927. package/src/shims/navigation.ts +14 -7
  928. package/src/utils/state-machine.ts +111 -0
  929. package/dist/_chunks/als-registry-B7DbZ2hS.js +0 -41
  930. package/dist/_chunks/als-registry-B7DbZ2hS.js.map +0 -1
  931. package/dist/_chunks/debug-B3Gypr3D.js +0 -108
  932. package/dist/_chunks/debug-B3Gypr3D.js.map +0 -1
  933. package/dist/_chunks/format-RyoGQL74.js +0 -164
  934. package/dist/_chunks/format-RyoGQL74.js.map +0 -1
  935. package/dist/_chunks/interception-BOoWmLUA.js +0 -676
  936. package/dist/_chunks/interception-BOoWmLUA.js.map +0 -1
  937. package/dist/_chunks/metadata-routes-Cjmvi3rQ.js +0 -153
  938. package/dist/_chunks/metadata-routes-Cjmvi3rQ.js.map +0 -1
  939. package/dist/_chunks/request-context-BQUC8PHn.js +0 -330
  940. package/dist/_chunks/request-context-BQUC8PHn.js.map +0 -1
  941. package/dist/_chunks/ssr-data-MjmprTmO.js.map +0 -1
  942. package/dist/_chunks/tracing-CemImE6h.js +0 -187
  943. package/dist/_chunks/tracing-CemImE6h.js.map +0 -1
  944. package/dist/_chunks/use-cookie-DX-l1_5E.js +0 -91
  945. package/dist/_chunks/use-cookie-DX-l1_5E.js.map +0 -1
  946. package/dist/_chunks/use-query-states-D5KaffOK.js.map +0 -1
  947. package/dist/adapters/cloudflare.js.map +0 -1
  948. package/dist/cache/index.js.map +0 -1
  949. package/dist/cache/register-cached-function.d.ts +0 -17
  950. package/dist/cache/register-cached-function.d.ts.map +0 -1
  951. package/dist/client/browser-entry.d.ts +0 -21
  952. package/dist/client/browser-entry.d.ts.map +0 -1
  953. package/dist/client/head.d.ts +0 -16
  954. package/dist/client/head.d.ts.map +0 -1
  955. package/dist/client/link-status-provider.d.ts +0 -11
  956. package/dist/client/link-status-provider.d.ts.map +0 -1
  957. package/dist/client/segment-merger.d.ts +0 -119
  958. package/dist/client/segment-merger.d.ts.map +0 -1
  959. package/dist/client/stale-reload.d.ts +0 -44
  960. package/dist/client/stale-reload.d.ts.map +0 -1
  961. package/dist/client/transition-root.d.ts +0 -74
  962. package/dist/client/transition-root.d.ts.map +0 -1
  963. package/dist/client/use-navigation-pending.d.ts +0 -26
  964. package/dist/client/use-navigation-pending.d.ts.map +0 -1
  965. package/dist/client/use-params.d.ts.map +0 -1
  966. package/dist/plugins/cache-transform.d.ts +0 -36
  967. package/dist/plugins/cache-transform.d.ts.map +0 -1
  968. package/dist/plugins/dev-error-overlay.d.ts +0 -60
  969. package/dist/plugins/dev-error-overlay.d.ts.map +0 -1
  970. package/dist/plugins/dev-logs.d.ts.map +0 -1
  971. package/dist/plugins/dynamic-transform.d.ts +0 -72
  972. package/dist/plugins/dynamic-transform.d.ts.map +0 -1
  973. package/dist/plugins/server-action-exports.d.ts +0 -26
  974. package/dist/plugins/server-action-exports.d.ts.map +0 -1
  975. package/dist/routing/status-file-lint.d.ts +0 -33
  976. package/dist/routing/status-file-lint.d.ts.map +0 -1
  977. package/dist/search-params/analyze.d.ts +0 -54
  978. package/dist/search-params/analyze.d.ts.map +0 -1
  979. package/dist/search-params/builtin-codecs.d.ts +0 -105
  980. package/dist/search-params/builtin-codecs.d.ts.map +0 -1
  981. package/dist/search-params/codecs.d.ts +0 -53
  982. package/dist/search-params/codecs.d.ts.map +0 -1
  983. package/dist/search-params/create.d.ts +0 -106
  984. package/dist/search-params/create.d.ts.map +0 -1
  985. package/dist/server/client-module-map.d.ts +0 -47
  986. package/dist/server/client-module-map.d.ts.map +0 -1
  987. package/dist/server/dev-fetch-instrumentation.d.ts +0 -22
  988. package/dist/server/dev-fetch-instrumentation.d.ts.map +0 -1
  989. package/dist/server/dev-logger.d.ts.map +0 -1
  990. package/dist/server/dev-span-processor.d.ts +0 -29
  991. package/dist/server/dev-span-processor.d.ts.map +0 -1
  992. package/dist/server/dev-warnings.d.ts +0 -129
  993. package/dist/server/dev-warnings.d.ts.map +0 -1
  994. package/dist/server/flush.d.ts +0 -74
  995. package/dist/server/flush.d.ts.map +0 -1
  996. package/dist/server/manifest-status-resolver.d.ts +0 -58
  997. package/dist/server/manifest-status-resolver.d.ts.map +0 -1
  998. package/dist/server/prerender.d.ts +0 -77
  999. package/dist/server/prerender.d.ts.map +0 -1
  1000. package/dist/utils/directive-parser.d.ts +0 -70
  1001. package/dist/utils/directive-parser.d.ts.map +0 -1
  1002. package/src/cache/register-cached-function.ts +0 -103
  1003. package/src/client/browser-entry.ts +0 -678
  1004. package/src/client/head.ts +0 -61
  1005. package/src/client/link-status-provider.tsx +0 -30
  1006. package/src/client/segment-merger.ts +0 -339
  1007. package/src/client/stale-reload.ts +0 -87
  1008. package/src/client/transition-root.tsx +0 -166
  1009. package/src/client/use-navigation-pending.ts +0 -38
  1010. package/src/plugins/cache-transform.ts +0 -199
  1011. package/src/plugins/dev-error-overlay.ts +0 -230
  1012. package/src/plugins/dynamic-transform.ts +0 -161
  1013. package/src/plugins/server-action-exports.ts +0 -220
  1014. package/src/routing/status-file-lint.ts +0 -112
  1015. package/src/search-params/analyze.ts +0 -192
  1016. package/src/search-params/builtin-codecs.ts +0 -228
  1017. package/src/search-params/codecs.ts +0 -153
  1018. package/src/search-params/create.ts +0 -321
  1019. package/src/server/client-module-map.ts +0 -58
  1020. package/src/server/dev-fetch-instrumentation.ts +0 -96
  1021. package/src/server/dev-span-processor.ts +0 -78
  1022. package/src/server/dev-warnings.ts +0 -283
  1023. package/src/server/flush.ts +0 -182
  1024. package/src/server/manifest-status-resolver.ts +0 -215
  1025. package/src/server/prerender.ts +0 -139
  1026. package/src/utils/directive-parser.ts +0 -529
package/src/index.ts CHANGED
@@ -1,10 +1,20 @@
1
+ /**
2
+ * @timber-js/app — Root entry point (public API).
3
+ *
4
+ * User-facing exports: timber(), defineConfig(), TimberUserConfig, Routes.
5
+ *
6
+ * Internal helpers (PluginContext, resolveAppDir, loadTimberConfigFile,
7
+ * warnConfigConflicts, resolveClientJavascript) live in plugin-context.ts
8
+ * and are NOT re-exported here. Sub-plugins import them via relative paths.
9
+ *
10
+ * Design doc: 18-build-system.md §"Plugin Architecture"
11
+ */
12
+
1
13
  import type { Plugin, PluginOption } from 'vite';
2
- import { existsSync } from 'node:fs';
3
- import { join } from 'node:path';
4
- import { pathToFileURL } from 'node:url';
14
+ import { createLogger } from 'vite';
15
+ import { join, relative, resolve } from 'node:path';
5
16
  import { createRequire } from 'node:module';
6
- import react from '@vitejs/plugin-react';
7
- import { cacheTransformPlugin } from './plugins/cache-transform';
17
+ import react, { reactCompilerPreset } from '@vitejs/plugin-react';
8
18
  import { timberContent } from './plugins/content';
9
19
  import { timberDevServer } from './plugins/dev-server';
10
20
  import { timberEntries } from './plugins/entries';
@@ -13,344 +23,269 @@ import { timberRouting } from './plugins/routing';
13
23
  import { timberShims } from './plugins/shims';
14
24
  import { timberFonts } from './plugins/fonts';
15
25
  import { timberStaticBuild } from './plugins/static-build';
16
- import { timberDynamicTransform } from './plugins/dynamic-transform';
17
- import { timberServerActionExports } from './plugins/server-action-exports';
18
26
  import { timberBuildManifest } from './plugins/build-manifest';
19
- import { timberDevLogs } from './plugins/dev-logs';
27
+ import { timberDevLogs, originalConsole, wrapLoggerWithOriginalConsole } from './dev-tools/logs';
28
+ import { resolveForwardConsole } from './dev-tools/browser-logs';
20
29
  import { timberReactProd } from './plugins/react-prod';
21
30
  import { timberChunks } from './plugins/chunks';
31
+ import { clientChunkGroup } from './plugins/client-chunks';
22
32
  import { timberServerBundle } from './plugins/server-bundle';
33
+ import { timberCacheTransform } from './plugins/cache';
34
+ import { timberPrebuilt } from './plugins/prebuilt';
35
+ import { timberPrerenderSugar } from './plugins/prerender-sugar';
36
+ import { timberCloudflareWasm } from './plugins/cloudflare-wasm';
23
37
  import { timberAdapterBuild } from './plugins/adapter-build';
24
38
  import { timberBuildReport } from './plugins/build-report';
25
- import type { RouteTree } from './routing/types';
26
- import type { BuildManifest } from './server/build-manifest';
27
- import type { StartupTimer } from './utils/startup-timer';
28
- import { createStartupTimer, createNoopTimer } from './utils/startup-timer';
29
-
30
- /** Configuration for client-side JavaScript output. */
31
- export interface ClientJavascriptConfig {
32
- /** When true, no client JS bundles are emitted or referenced in HTML. */
33
- disabled: boolean;
34
- /**
35
- * When `disabled` is true, still inject the Vite HMR client in dev mode
36
- * so hot reloading works during development. Default: true.
37
- */
38
- enableHMRInDev?: boolean;
39
- }
39
+ import { createNoopTimer } from './utils/startup-timer';
40
+ import { resolveEncryptionKeyExpression, shouldEnableEncryption } from './server/action-encryption';
41
+ import { createHoldingServer } from './dev-tools/holding-server.js';
42
+ import { resolveStartPort, startDevServerPort } from './server/port-resolution.js';
43
+ import type { TimberUserConfig } from './config-types.js';
44
+ import type { PluginContext } from './plugin-context.js';
45
+ import {
46
+ createPluginContext,
47
+ loadTimberConfigFile,
48
+ mergeFileConfig,
49
+ resolveAppDir,
50
+ resolveClientJavascript,
51
+ resolveBuildDir,
52
+ } from './plugin-context.js';
40
53
 
41
- /** Fully resolved client JavaScript configuration (no optionals). */
42
- export interface ResolvedClientJavascript {
43
- disabled: boolean;
44
- enableHMRInDev: boolean;
45
- }
54
+ // ── Public API ────────────────────────────────────────────────────────────
46
55
 
47
- export interface TimberUserConfig {
48
- output?: 'server' | 'static';
49
- /**
50
- * Enable timber debug logging in production builds.
51
- *
52
- * When `true`, timber's own diagnostics (dev warnings, verbose logging)
53
- * are active even in production mode. React stays in production mode —
54
- * only timber's logs are affected.
55
- *
56
- * Can also be enabled at runtime via the `TIMBER_DEBUG` environment variable.
57
- *
58
- * Default: `false`.
59
- */
60
- debug?: boolean;
61
- /**
62
- * Control client-side JavaScript output.
63
- *
64
- * Boolean shorthand:
65
- * `clientJavascript: false` disables all client JS (equivalent to `{ disabled: true }`).
66
- * `clientJavascript: true` enables client JS (the default).
67
- *
68
- * Object form:
69
- * `clientJavascript: { disabled: true, enableHMRInDev: true }` disables client JS
70
- * in production but preserves Vite HMR in dev mode.
71
- *
72
- * When `disabled` is true, `enableHMRInDev` defaults to `true`.
73
- * Server-side JS still runs — this only affects what is sent to the browser.
74
- */
75
- clientJavascript?: boolean | ClientJavascriptConfig;
76
- adapter?: unknown;
77
- cacheHandler?: unknown;
78
- allowedOrigins?: string[];
79
- csrf?: boolean;
80
- limits?: {
81
- actionBodySize?: string;
82
- uploadBodySize?: string;
83
- maxFields?: number;
84
- };
85
- pageExtensions?: string[];
86
- /**
87
- * Slow request threshold in milliseconds. Requests exceeding this emit
88
- * a warning via the logger. Set to 0 to disable. Default: 3000.
89
- *
90
- * See design/17-logging.md §"slowRequestMs".
91
- */
92
- slowRequestMs?: number;
93
- /** Dev-mode options. These have no effect in production builds. */
94
- dev?: {
95
- /** Threshold in ms to highlight slow phases in dev logging output. Default: 200. */
96
- slowPhaseMs?: number;
97
- };
98
- /**
99
- * Cookie signing configuration. See design/29-cookies.md §"Signed Cookies".
100
- *
101
- * Provide `secret` for a single key, or `secrets` (array) for key rotation.
102
- * When `secrets` is used, index 0 is the signing key; all are tried for verification.
103
- */
104
- cookies?: {
105
- /** Single signing secret. Shorthand for `secrets: [secret]`. */
106
- secret?: string;
107
- /** Array of signing secrets for key rotation. Index 0 signs; all verify. */
108
- secrets?: string[];
109
- };
110
- /**
111
- * Control Server-Timing header output.
112
- *
113
- * - `'detailed'` — per-phase breakdown (proxy, middleware, render). Useful
114
- * for APM / network monitoring. Exposes phase names to clients.
115
- * - `'total'` — single `total;dur=N` entry. Safe to expose, gives
116
- * browser DevTools useful timing without internal details.
117
- * - `false` — no Server-Timing header at all.
118
- *
119
- * Default: `'detailed'` in dev, `'total'` in production.
120
- *
121
- * This is separate from `debug` / `TIMBER_DEBUG` — it's an intentional
122
- * decision to expose timing data to clients, not a side effect of debug
123
- * logging.
124
- */
125
- serverTiming?: 'detailed' | 'total' | false;
126
- /**
127
- * Override the app directory location. By default, timber auto-detects
128
- * `app/` at the project root, falling back to `src/app/`.
129
- *
130
- * Set this to a relative path from the project root (e.g. `'src/app'`)
131
- * to use a custom location.
132
- */
133
- appDir?: string;
134
- /** MDX compilation options passed to @mdx-js/rollup. See design/20-content-collections.md. */
135
- mdx?: {
136
- remarkPlugins?: unknown[];
137
- rehypePlugins?: unknown[];
138
- recmaPlugins?: unknown[];
139
- remarkRehypeOptions?: Record<string, unknown>;
140
- };
141
- /**
142
- * Built-in top-loader progress bar for client navigations.
143
- * Shows an animated bar at the top of the viewport during RSC navigations.
144
- * Enabled by default — set `enabled: false` to opt out.
145
- *
146
- * Users who want a fully custom progress indicator should disable this
147
- * and use `useNavigationPending()` directly.
148
- *
149
- * See LOCAL-336 for design decisions.
150
- */
151
- topLoader?: {
152
- /** Whether the top-loader is enabled. Default: true. */
153
- enabled?: boolean;
154
- /** Bar color. Default: '#2299DD'. */
155
- color?: string;
156
- /** Bar height in pixels. Default: 3. */
157
- height?: number;
158
- /** Show subtle glow/shadow effect. Default: true. */
159
- shadow?: boolean;
160
- /** Delay in ms before showing the bar (avoids flash on fast navs). Default: 0. */
161
- delay?: number;
162
- /** CSS z-index. Default: 1600. */
163
- zIndex?: number;
164
- };
165
- }
56
+ export type { TimberUserConfig } from './config-types.js';
166
57
 
167
- /**
168
- * Resolve `clientJavascript` into a fully resolved config.
169
- */
170
- export function resolveClientJavascript(config: TimberUserConfig): ResolvedClientJavascript {
171
- if (config.clientJavascript !== undefined) {
172
- if (typeof config.clientJavascript === 'boolean') {
173
- // `clientJavascript: false` → disabled
174
- // `clientJavascript: true` → enabled (default)
175
- return {
176
- disabled: !config.clientJavascript,
177
- enableHMRInDev: !config.clientJavascript, // default true when disabled
178
- };
179
- }
180
- // Object form
181
- return {
182
- disabled: config.clientJavascript.disabled,
183
- enableHMRInDev: config.clientJavascript.enableHMRInDev ?? config.clientJavascript.disabled,
184
- };
185
- }
186
-
187
- // Default: client JS enabled
188
- return { disabled: false, enableHMRInDev: false };
189
- }
58
+ // Metadata route handler types — re-exported so user-authored metadata
59
+ // route files (sitemap.ts, robots.ts, manifest.ts, icon.tsx, etc.) can
60
+ // import them from the package root without reaching into ./server.
61
+ // The canonical location for these types is '@timber-js/app/server'; this
62
+ // root re-export is a convenience for typed metadata route handlers.
63
+ // See design/16-metadata.md §"Metadata Routes".
64
+ export type { Metadata, MetadataRoute, MetadataHandler, MetadataResult } from './server/types.js';
190
65
 
191
66
  /**
192
- * Shared context object passed to all sub-plugins via closure.
67
+ * Route map interface — augmented by the generated timber-routes.d.ts.
193
68
  *
194
- * Sub-plugins communicate through this context — not through Vite's
195
- * plugin API or global state.
196
- * See design/18-build-system.md §"Shared Plugin Context".
69
+ * Each key is a route path pattern. Values have:
70
+ * segmentParams: shape of URL segment params (e.g. { id: string })
71
+ * searchParams: parsed type from search-params.ts, or {} if none
72
+ *
73
+ * This interface is empty by default and populated via codegen.
74
+ * See design/09-typescript.md §"Typed Routes".
197
75
  */
198
- export interface PluginContext {
199
- config: TimberUserConfig;
200
- /** Resolved client JavaScript configuration */
201
- clientJavascript: ResolvedClientJavascript;
202
- /** The scanned route tree (populated by timber-routing, consumed by timber-entries) */
203
- routeTree: RouteTree | null;
204
- /** Absolute path to the app/ directory */
205
- appDir: string;
206
- /** Absolute path to the project root */
207
- root: string;
208
- /** Whether the dev server is running (set by timber-root-sync in configResolved) */
209
- dev: boolean;
210
- /** CSS build manifest (populated by adapter after client build, null in dev) */
211
- buildManifest: BuildManifest | null;
212
- /** Startup timer for profiling cold start phases (active in dev, no-op in prod) */
213
- timer: StartupTimer;
214
- }
76
+ // eslint-disable-next-line @typescript-eslint/no-empty-object-type, typescript/no-empty-interface
77
+ export interface Routes {}
215
78
 
216
79
  /**
217
- * Resolve the app directory. Checks (in order):
218
- * 1. Explicit `configAppDir` from timber.config.ts
219
- * 2. `<root>/app`
220
- * 3. `<root>/src/app`
80
+ * Type-safe helper for timber.config.ts files.
81
+ *
82
+ * A pass-through identity function that provides autocomplete and
83
+ * type checking for timber configuration. No runtime validation —
84
+ * purely a DX convenience (same pattern as Vite's defineConfig).
85
+ *
86
+ * @example
87
+ * ```ts
88
+ * // timber.config.ts
89
+ * import { defineConfig } from '@timber-js/app';
221
90
  *
222
- * Throws if none exist.
91
+ * export default defineConfig({
92
+ * output: 'server',
93
+ * pageExtensions: ['tsx', 'ts', 'mdx'],
94
+ * });
95
+ * ```
223
96
  */
224
- export function resolveAppDir(root: string, configAppDir?: string): string {
225
- if (configAppDir) {
226
- const explicit = join(root, configAppDir);
227
- if (!existsSync(explicit)) {
228
- throw new Error(`[timber] Configured appDir "${configAppDir}" does not exist at ${explicit}`);
229
- }
230
- return explicit;
231
- }
232
-
233
- const rootApp = join(root, 'app');
234
- if (existsSync(rootApp)) return rootApp;
235
-
236
- const srcApp = join(root, 'src', 'app');
237
- if (existsSync(srcApp)) return srcApp;
238
-
239
- throw new Error(
240
- `[timber] Could not find app directory. Expected "app/" or "src/app/" in ${root}. ` +
241
- `You can set appDir in timber.config.ts to specify a custom location.`
242
- );
97
+ export function defineConfig(config: TimberUserConfig): TimberUserConfig {
98
+ return config;
243
99
  }
244
100
 
245
- function createPluginContext(config?: TimberUserConfig, root?: string): PluginContext {
246
- const projectRoot = root ?? process.cwd();
247
- const resolvedConfig: TimberUserConfig = { output: 'server', ...config };
248
- // Timer starts as active — swapped to noop in configResolved for production builds
249
- return {
250
- config: resolvedConfig,
251
- clientJavascript: resolveClientJavascript(resolvedConfig),
252
- routeTree: null,
253
- appDir: join(projectRoot, 'app'),
254
- root: projectRoot,
255
- dev: false,
256
- buildManifest: null,
257
- timer: createStartupTimer(),
258
- };
259
- }
101
+ // ── Private helpers ───────────────────────────────────────────────────────
260
102
 
261
103
  /**
262
- * Load timber.config.ts (or .js, .mjs) from the project root.
263
- * Returns the config object or null if no config file is found.
264
- */
265
- async function loadTimberConfigFile(root: string): Promise<TimberUserConfig | null> {
266
- const configNames = ['timber.config.ts', 'timber.config.js', 'timber.config.mjs'];
267
-
268
- for (const name of configNames) {
269
- const configPath = join(root, name);
270
- if (existsSync(configPath)) {
271
- const mod = await import(pathToFileURL(configPath).href);
272
- return (mod.default ?? mod) as TimberUserConfig;
273
- }
274
- }
275
- return null;
276
- }
277
-
278
- /**
279
- * Detect config keys set in both inline (vite.config.ts) and file (timber.config.ts)
280
- * and warn the user. The `output` key is excluded because it defaults to 'server'
281
- * in createPluginContext and would always appear as an inline key.
104
+ * Resolve the React Compiler plugin via @rolldown/plugin-babel.
105
+ *
106
+ * Uses the `reactCompilerPreset` from @vitejs/plugin-react, which:
107
+ * - Uses Babel ONLY for the compiler pass (OXC handles JSX)
108
+ * - Automatically scopes to client environment via applyToEnvironmentHook
109
+ * - Uses react/compiler-runtime built into React 19
282
110
  *
283
- * Returns the list of conflicting key names (for testing).
111
+ * @rolldown/plugin-babel and babel-plugin-react-compiler are optional peer deps.
112
+ * If either is missing, require() fails with a clear error message.
284
113
  */
285
- export function warnConfigConflicts(
286
- inline: TimberUserConfig,
287
- fileConfig: TimberUserConfig
288
- ): string[] {
289
- const conflicts: string[] = [];
290
- for (const key of Object.keys(fileConfig) as (keyof TimberUserConfig)[]) {
291
- if (key === 'output') continue;
292
- if (key in inline && inline[key] !== undefined) {
293
- conflicts.push(key);
294
- }
295
- }
296
- if (conflicts.length > 0) {
297
- console.warn(
298
- `[timber] Config conflict: ${conflicts.map((k) => `"${k}"`).join(', ')} set in both ` +
299
- `vite.config.ts (inline) and timber.config.ts. ` +
300
- `Move all config to timber.config.ts to avoid confusion. ` +
301
- `The inline value from vite.config.ts will be used.`
114
+ function resolveReactCompilerPlugin(
115
+ config: true | { compilationMode?: string; target?: string },
116
+ req: NodeJS.Require
117
+ ): PluginOption {
118
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
119
+ let babel: any;
120
+ try {
121
+ babel = req('@rolldown/plugin-babel');
122
+ } catch {
123
+ throw new Error(
124
+ '[timber] reactCompiler requires @rolldown/plugin-babel. ' +
125
+ 'Install it: pnpm add -D @rolldown/plugin-babel babel-plugin-react-compiler'
302
126
  );
303
127
  }
304
- return conflicts;
128
+ const options = typeof config === 'object' ? config : {};
129
+ const babelPlugin = babel.default ?? babel;
130
+ return babelPlugin({
131
+ presets: [reactCompilerPreset(options as Parameters<typeof reactCompilerPreset>[0])],
132
+ }) as PluginOption;
305
133
  }
306
134
 
307
135
  /**
308
- * Merge file-based config into ctx.config. Inline config (already in ctx.config)
309
- * takes precedence — file config only fills in missing fields.
136
+ * Build the options object for @vitejs/plugin-rsc.
137
+ *
138
+ * Uses a getter for `enableActionEncryption` so the RSC plugin reads
139
+ * the value lazily — after ctx.dev is set in configResolved. This lets
140
+ * `actionEncryption.disableInDev` work correctly even though the RSC
141
+ * plugin is created before Vite resolves the command.
310
142
  */
311
- function mergeFileConfig(ctx: PluginContext, fileConfig: TimberUserConfig): void {
312
- const inline = ctx.config;
313
-
314
- // Warn if the same key is set in both places
315
- warnConfigConflicts(inline, fileConfig);
316
-
317
- // For each top-level key, use inline value if present, otherwise file value
318
- ctx.config = {
319
- ...fileConfig,
320
- ...inline,
321
- // Deep merge for nested objects where both exist
322
- ...(fileConfig.limits && inline.limits
323
- ? { limits: { ...fileConfig.limits, ...inline.limits } }
324
- : {}),
325
- ...(fileConfig.dev && inline.dev ? { dev: { ...fileConfig.dev, ...inline.dev } } : {}),
326
- ...(fileConfig.mdx && inline.mdx ? { mdx: { ...fileConfig.mdx, ...inline.mdx } } : {}),
143
+ function createRscOptions(
144
+ ctx: PluginContext,
145
+ encryptionKeyExpr: string | undefined
146
+ ): Record<string, unknown> {
147
+ const options: Record<string, unknown> = {
148
+ serverHandler: false,
149
+ customClientEntry: true,
150
+ entries: {
151
+ rsc: 'virtual:timber-rsc-entry',
152
+ ssr: 'virtual:timber-ssr-entry',
153
+ client: 'virtual:timber-browser-entry',
154
+ },
155
+ // Group client references by layout boundary to balance route-scoped code
156
+ // splitting with HTTP request count. A constant group name ('client-refs')
157
+ // would collapse all routes into one chunk — any page downloads every
158
+ // client component. Per-serverChunk grouping creates many sub-500B files.
159
+ // Layout-boundary grouping is the middle ground: components under the same
160
+ // layout segment share a chunk. See design/27-chunking-strategy.md, TIM-440, TIM-499.
161
+ clientChunks: (meta: { id: string; normalizedId: string; serverChunk: string }) =>
162
+ clientChunkGroup(meta, ctx.appDir, ctx.root, ctx.sharedModuleFacades),
327
163
  };
328
- }
329
164
 
330
- function timberCache(_ctx: PluginContext): Plugin {
331
- return cacheTransformPlugin();
165
+ // Bound args encryption — AES-256-GCM authenticated encryption for
166
+ // closure variables in 'use server' functions. Always on in production,
167
+ // configurable in dev. See design/08-forms-and-actions.md §"Bound Args Encryption".
168
+ //
169
+ // Uses a getter so the RSC plugin reads the value lazily in its transform
170
+ // hooks, after ctx.dev is set in configResolved. This lets disableInDev
171
+ // work correctly — ctx.dev is false at construction time but true during
172
+ // dev server transforms.
173
+ Object.defineProperty(options, 'enableActionEncryption', {
174
+ get() {
175
+ return shouldEnableEncryption(ctx.dev, ctx.config.actionEncryption);
176
+ },
177
+ enumerable: true,
178
+ });
179
+
180
+ // When TIMBER_ACTIONS_ENCRYPTION_KEY is set, pass it as a runtime expression
181
+ // so the RSC plugin uses it instead of auto-generating a per-build key.
182
+ if (encryptionKeyExpr) {
183
+ options.defineEncryptionKey = encryptionKeyExpr;
184
+ }
185
+
186
+ return options;
332
187
  }
333
188
 
189
+ // NOTE: 'use cache' directive transform removed — future feature pending design doc.
190
+ // The timber.cache() API (createCache) remains available for explicit caching.
191
+ // See design/06-caching.md.
192
+
193
+ // ── Main plugin factory ──────────────────────────────────────────────────
194
+
195
+ /**
196
+ * Create the timber Vite plugin array.
197
+ *
198
+ * Loads timber.config.ts and all dependencies synchronously before
199
+ * constructing the plugin array. This ensures ALL plugins — including
200
+ * the RSC plugin and React Compiler — see the fully merged config
201
+ * (inline + file-based). No async, no deferred config, no stale reads.
202
+ *
203
+ * Requires Node >= 22.12 for synchronous require() of ESM modules
204
+ * (@vitejs/plugin-rsc is ESM-only).
205
+ *
206
+ * Previous versions used async loading and deferred config merging,
207
+ * causing file-based config for reactCompiler, actionEncryption, and
208
+ * output mode to be silently ignored. See TIM-451.
209
+ */
334
210
  export function timber(config?: TimberUserConfig): PluginOption[] {
335
211
  const ctx = createPluginContext(config);
336
- // Sync ctx.root and ctx.appDir with Vite's resolved root, which may
337
- // differ from process.cwd() when --config points to a subdirectory.
338
- // Also loads timber.config.ts and merges it into ctx.config (inline config wins).
212
+
213
+ // Resolve dependencies from the consumer's project (process.cwd()),
214
+ // not from timber's own node_modules. This is critical for pnpm link:
215
+ // when linked, timber's node_modules has a separate vite instance, and
216
+ // the RSC plugin must use the same vite instance as the dev server.
217
+ const consumerRequire = createRequire(join(process.cwd(), 'package.json'));
218
+
219
+ // ── Step 1: Load @vitejs/plugin-rsc ─────────────────────────────────
220
+ // Synchronous require() works for ESM modules on Node 22.12+.
221
+ ctx.timer.start('rsc-plugin-import');
222
+ const rscMod = consumerRequire('@vitejs/plugin-rsc');
223
+ const vitePluginRsc = rscMod.default ?? rscMod;
224
+ ctx.timer.end('rsc-plugin-import');
225
+
226
+ // ── Step 2: Compute config-dependent options ────────────────────────
227
+ // encryptionKeyExpr is env-based and doesn't depend on file config.
228
+ const encryptionKeyExpr = resolveEncryptionKeyExpression();
229
+
230
+ // ── Step 3: Pre-load file config for plugin resolution ──────────────
231
+ // Load timber.config.ts eagerly from process.cwd() so we can resolve
232
+ // plugins (like React Compiler) and add them to the top-level array.
233
+ // Vite's config() hook return type is Omit<UserConfig, 'plugins'> —
234
+ // plugins returned from config() are silently ignored. See TIM-632.
235
+ //
236
+ // The config() hook still loads from the correct Vite root (which may
237
+ // differ from cwd in monorepo setups — see TIM-498), but only for
238
+ // non-plugin config merging.
239
+ const earlyFileConfig = loadTimberConfigFile(process.cwd());
240
+
241
+ // ── Step 4: Build rootSync plugin ───────────────────────────────────
242
+ // rootSync loads timber.config.ts from Vite's resolved root and merges
243
+ // it into ctx.config. Plugin resolution is handled eagerly above — the
244
+ // config() hook must NOT return a `plugins` field (Vite ignores it).
339
245
  const rootSync: Plugin = {
340
246
  name: 'timber-root-sync',
341
- async config(userConfig, { command }) {
342
- // Load timber.config.ts early — before configResolved/buildStart — so
343
- // all plugins (including timber-mdx) see the merged config in their
344
- // buildStart hooks. The config hook runs once and supports async.
345
- const root = userConfig.root ?? process.cwd();
247
+ async config(userConfig, { command, isPreview }) {
248
+ // ── Load timber.config.ts from the correct root ───────────────
249
+ // Vite's `config` hook fires before `configResolved`. The user's
250
+ // `root` option (if set) tells us where the project lives.
251
+ // `resolve()` mirrors Vite's own root resolution logic.
252
+ const viteRoot = resolve(userConfig.root ?? process.cwd());
346
253
  ctx.timer.start('config-load');
347
- const fileConfig = await loadTimberConfigFile(root);
254
+ const fileConfig = loadTimberConfigFile(viteRoot);
348
255
  if (fileConfig) {
349
- mergeFileConfig(ctx, fileConfig);
256
+ ctx.config = mergeFileConfig(ctx.config, fileConfig);
350
257
  ctx.clientJavascript = resolveClientJavascript(ctx.config);
351
258
  }
259
+ // Apply defaults AFTER merge so file-based config isn't overridden
260
+ // by defaults that were baked into the inline config object.
261
+ ctx.config.output ??= 'server';
352
262
  ctx.timer.end('config-load');
353
263
 
264
+ // ── Resolve build output directory ─────────────────────────
265
+ // Priority: timber.config.ts `buildDir` > Vite `build.outDir` > .timber/dist
266
+ // Set Vite's build.outDir so the RSC plugin and all environment
267
+ // builds write to the correct location.
268
+ const viteOutDir = userConfig.build?.outDir;
269
+ const timberBuildDir = ctx.config.buildDir;
270
+ const resolvedRoot = resolve(userConfig.root ?? process.cwd());
271
+ ctx.buildDir = resolveBuildDir(resolvedRoot, timberBuildDir, viteOutDir);
272
+
273
+ // Warn if the Vite root differs from cwd and the re-loaded config
274
+ // has reactCompiler but the early cwd-based load missed it. In this
275
+ // edge case the user must move reactCompiler to inline config.
276
+ if (viteRoot !== process.cwd()) {
277
+ const hasCompilerInReloaded = !config?.reactCompiler && ctx.config.reactCompiler;
278
+ const hadCompilerInEarly = !config?.reactCompiler && earlyFileConfig?.reactCompiler;
279
+ if (hasCompilerInReloaded && !hadCompilerInEarly) {
280
+ console.warn(
281
+ '[timber] reactCompiler is set in timber.config.ts but could not be ' +
282
+ 'registered because the config file is in a non-cwd root directory. ' +
283
+ 'Move reactCompiler to the inline timber() config in vite.config.ts, or ' +
284
+ 'run vite from the project root directory.'
285
+ );
286
+ }
287
+ }
288
+
354
289
  // Force production JSX transform for builds.
355
290
  //
356
291
  // Vite determines dev vs prod JSX via `isProduction`, which checks
@@ -364,8 +299,104 @@ export function timber(config?: TimberUserConfig): PluginOption[] {
364
299
  // We explicitly set `oxc.jsx.development: false` for builds so
365
300
  // the client bundle always uses jsx/jsxs from react/jsx-runtime,
366
301
  // regardless of the ambient NODE_ENV value.
302
+ // ── Resolve dev/preview port (TIM-842) ───────────────────────
303
+ // Default port is 3000 with auto-bump on conflict. Explicit user
304
+ // overrides (`--port`, `PORT` env, `vite.config.ts` server.port)
305
+ // are honored as-is and fail loudly via `strictPort: true`.
306
+ //
307
+ // For dev (`command === 'serve' && !isPreview`) we start the
308
+ // holding server and use its `listen()` as the probe, pairing
309
+ // the probe with the real bind to eliminate TOCTOU races.
310
+ //
311
+ // For `vite preview` (`command === 'serve' && isPreview`) we
312
+ // resolve the config/env port but delegate the actual bind +
313
+ // auto-bump to Vite's own preview server. Starting the holding
314
+ // server in preview mode would self-conflict because the dev
315
+ // plugin's `configureServer` handoff does not run for preview;
316
+ // the holding server would keep the port occupied while Vite's
317
+ // preview tried to bind the same port.
318
+ //
319
+ // See design/21-dev-server.md §"Default Port and Auto-Bump".
320
+ let resolvedDevPort: number | null = null;
321
+ let resolvedDevPortExplicit = false;
322
+ if (command === 'serve' && !isPreview) {
323
+ ctx.holdingServer = createHoldingServer();
324
+ const holdingRef = ctx.holdingServer;
325
+ const result = await startDevServerPort({
326
+ configPort:
327
+ typeof userConfig.server?.port === 'number' ? userConfig.server.port : undefined,
328
+ envPort: process.env.PORT,
329
+ listen: (p) => holdingRef.listen(p),
330
+ });
331
+ if (!result.bound) {
332
+ // Holding server failed to bind. Drop the reference so the
333
+ // dev-server plugin doesn't try to close a server that was
334
+ // never listening.
335
+ ctx.holdingServer = null;
336
+ }
337
+ if (result.bound || result.explicit) {
338
+ // When bound, use the probed port with strictPort so Vite
339
+ // doesn't re-bump. When unbound but explicit, still forward
340
+ // the port so Vite surfaces the conflict via strictPort.
341
+ // When unbound and implicit, skip — let Vite auto-bump.
342
+ resolvedDevPort = result.port;
343
+ resolvedDevPortExplicit = result.explicit;
344
+ }
345
+ } else if (command === 'serve' && isPreview) {
346
+ // Preview mode: resolve the starting port from config/env/
347
+ // default but do NOT probe. Vite's preview server handles the
348
+ // bind itself, with `preview.strictPort` controlling whether
349
+ // an in-use port auto-bumps (implicit) or errors (explicit).
350
+ const previewConfigPort =
351
+ typeof userConfig.preview?.port === 'number'
352
+ ? userConfig.preview.port
353
+ : typeof userConfig.server?.port === 'number'
354
+ ? userConfig.server.port
355
+ : undefined;
356
+ const start = resolveStartPort({
357
+ configPort: previewConfigPort,
358
+ envPort: process.env.PORT,
359
+ });
360
+ resolvedDevPort = start.port;
361
+ resolvedDevPortExplicit = start.explicit;
362
+ }
363
+
364
+ // Derive relative buildOutDir from the absolute ctx.buildDir (set above)
365
+ // so Vite's config receives a root-relative path.
366
+ const buildOutDir = relative(resolvedRoot, ctx.buildDir);
367
+
368
+ // Set per-environment build.outDir so Vite's RSC plugin writes
369
+ // each environment to the correct subdirectory under our buildDir.
370
+ // Without this, the RSC plugin defaults to dist/<envName> instead
371
+ // of <buildOutDir>/<envName>.
372
+ const envOutDirs: Record<string, { build: { outDir: string } }> = {};
373
+ for (const envName of ['rsc', 'ssr', 'client']) {
374
+ envOutDirs[envName] = { build: { outDir: join(buildOutDir, envName) } };
375
+ }
376
+
377
+ // Exclude @timber-js/app packages from the dep optimizer.
378
+ // The shims plugin intercepts @timber-js/app/* imports per-environment
379
+ // (e.g. replacing @timber-js/app/server with a stub in the client env).
380
+ // The dep optimizer runs before per-environment resolution, so it would
381
+ // pre-bundle @timber-js/app/cookies with the real server code inlined,
382
+ // pulling AsyncLocalStorage into the browser bundle.
383
+ const timberOptimizeDepsExclude = [
384
+ '@timber-js/app',
385
+ '@timber-js/app/server',
386
+ '@timber-js/app/client',
387
+ '@timber-js/app/cookies',
388
+ '@timber-js/app/cache',
389
+ '@timber-js/app/search-params',
390
+ '@timber-js/app/segment-params',
391
+ '@timber-js/app/params',
392
+ '@timber-js/app/codec',
393
+ ];
394
+
367
395
  if (command === 'build') {
368
396
  return {
397
+ build: { outDir: buildOutDir },
398
+ environments: envOutDirs,
399
+ optimizeDeps: { exclude: timberOptimizeDepsExclude },
369
400
  oxc: {
370
401
  jsx: {
371
402
  development: false,
@@ -373,11 +404,82 @@ export function timber(config?: TimberUserConfig): PluginOption[] {
373
404
  },
374
405
  };
375
406
  }
407
+
408
+ // Dev/preview mode: set outDir so dev-time references are
409
+ // consistent, and surface the resolved port to Vite.
410
+ //
411
+ // For dev, we set strictPort: true so Vite uses exactly the port
412
+ // the holding server probed for — without strictPort, Vite would
413
+ // run its own auto-bump starting from `port`, which would skip
414
+ // straight past whatever holding-server-bumped port we picked.
415
+ //
416
+ // For `vite preview`, we set `preview.strictPort` based on
417
+ // whether the user explicitly set the port. Implicit (default)
418
+ // preview uses strictPort: false so Vite's preview server can
419
+ // auto-bump from 3000. Explicit preview uses strictPort: true
420
+ // so conflicts fail loudly, matching the dev behavior and the
421
+ // TIM-842 spec.
422
+ const serverConfig: {
423
+ port?: number;
424
+ strictPort?: boolean;
425
+ forwardConsole?: boolean | { unhandledErrors?: boolean; logLevels?: string[] };
426
+ } = {};
427
+ const previewConfig: { port?: number; strictPort?: boolean } = {};
428
+ if (resolvedDevPort != null) {
429
+ if (!isPreview) {
430
+ serverConfig.port = resolvedDevPort;
431
+ serverConfig.strictPort = true;
432
+ }
433
+ previewConfig.port = resolvedDevPort;
434
+ previewConfig.strictPort = resolvedDevPortExplicit;
435
+ }
436
+
437
+ // Enable Vite 8's built-in browser→terminal console forwarding.
438
+ // Vite defaults this OFF for non-agent dev; timber enables it based
439
+ // on the devBrowserLogs config (default: 'warn'). See TIM-1152.
440
+ serverConfig.forwardConsole = resolveForwardConsole(ctx.config.devBrowserLogs);
441
+
442
+ // Provide a customLogger whose output routes through the pre-patched
443
+ // console methods so Vite's forwardConsole output never re-enters our
444
+ // server→browser patch. If the user supplied their own customLogger,
445
+ // wrap it so its console calls also bypass patching.
446
+ const customLogger = userConfig.customLogger
447
+ ? wrapLoggerWithOriginalConsole(userConfig.customLogger)
448
+ : createLogger(userConfig.logLevel ?? 'info', {
449
+ allowClearScreen: userConfig.clearScreen ?? true,
450
+ console: originalConsole as Console,
451
+ });
452
+
453
+ return {
454
+ build: { outDir: buildOutDir },
455
+ environments: envOutDirs,
456
+ optimizeDeps: { exclude: timberOptimizeDepsExclude },
457
+ customLogger,
458
+ server: serverConfig,
459
+ preview: previewConfig,
460
+ };
376
461
  },
377
462
  configResolved(resolved) {
378
463
  ctx.root = resolved.root;
379
464
  ctx.appDir = resolveAppDir(resolved.root, ctx.config.appDir);
380
465
  ctx.dev = resolved.command === 'serve';
466
+
467
+ // Register all timber config file candidates as Vite config file
468
+ // dependencies so Vite's built-in restart-on-change handles them
469
+ // (including atomic writes that emit unlink+add instead of change).
470
+ // All candidates are registered — not just the one that exists — so
471
+ // that creating a config file after server start also triggers a
472
+ // restart. The watcher.add() call in dev-server.ts ensures all
473
+ // candidates are in the watch set.
474
+ // See design/21-dev-server.md §HMR Wiring.
475
+ const configNames = ['timber.config.ts', 'timber.config.js', 'timber.config.mjs'];
476
+ for (const name of configNames) {
477
+ resolved.configFileDependencies.push(resolve(resolved.root, name));
478
+ }
479
+
480
+ // Sync buildDir from Vite's resolved build.outDir. Vite keeps
481
+ // outDir as-is (may be relative), so resolve against root.
482
+ ctx.buildDir = resolve(resolved.root, resolved.build.outDir);
381
483
  // In production builds, swap to a no-op timer to avoid overhead
382
484
  if (!ctx.dev) {
383
485
  ctx.timer = createNoopTimer();
@@ -385,19 +487,49 @@ export function timber(config?: TimberUserConfig): PluginOption[] {
385
487
  // Start the overall dev server setup timer — ends in timber-dev-server
386
488
  ctx.timer.start('dev-server-setup');
387
489
  }
490
+
491
+ // Validate config and check peer dependencies at startup.
492
+ // Errors are logged to stderr but don't block startup — Vite may
493
+ // still work partially, and the errors guide the user to fix things.
494
+ /* eslint-disable no-var-requires -- sync require for startup validation */
495
+ const { validateConfig, formatConfigErrors, checkPeerDependencies, formatMissingPeers } =
496
+ require('./config-validation.js') as typeof import('./config-validation.js');
497
+ /* eslint-enable no-var-requires */
498
+
499
+ const configErrors = validateConfig(ctx.config);
500
+ if (configErrors.length > 0) {
501
+ process.stderr.write(`${formatConfigErrors(configErrors)}\n\n`);
502
+ }
503
+
504
+ const peerResults = checkPeerDependencies(ctx.root);
505
+ const peerWarning = formatMissingPeers(peerResults);
506
+ if (peerWarning) {
507
+ process.stderr.write(`${peerWarning}\n\n`);
508
+ }
388
509
  },
389
510
  };
511
+
512
+ // ── Step 5: Resolve optional plugins ────────────────────────────────
513
+ // React Compiler — resolved eagerly from either inline or file config.
514
+ // Vite's config() hook return type is Omit<UserConfig, 'plugins'>, so
515
+ // plugins MUST be in the top-level array — returning them from config()
516
+ // silently drops them. See TIM-632.
517
+ //
518
+ // Inline config takes precedence. File config (from the early cwd-based
519
+ // load) is used when inline config doesn't set reactCompiler.
520
+ const reactCompilerPlugins: PluginOption[] = [];
521
+ const effectiveReactCompiler = config?.reactCompiler ?? earlyFileConfig?.reactCompiler;
522
+ if (effectiveReactCompiler) {
523
+ reactCompilerPlugins.push(resolveReactCompilerPlugin(effectiveReactCompiler, consumerRequire));
524
+ }
525
+
526
+ // ── Step 6: Assemble plugin array ─────────────────────────────────────
390
527
  // @vitejs/plugin-rsc handles:
391
528
  // - RSC/SSR/client environment setup
392
529
  // - "use client" directive → client reference proxy transformation
393
530
  // - "use server" directive → server reference transformation
394
531
  // - Client reference tracking and module map generation
395
532
  //
396
- // Loaded via dynamic import() because @vitejs/plugin-rsc is ESM-only.
397
- // Vite's config loader uses esbuild to transpile to CJS, which breaks
398
- // static imports of ESM-only packages. The dynamic import() is preserved
399
- // by esbuild and runs natively in ESM at runtime.
400
- //
401
533
  // serverHandler: false — timber has its own dev server (timber-dev-server)
402
534
  // entries — tells the RSC plugin about timber's virtual entry modules so
403
535
  // it correctly wires up the browser entry (needed for React Fast Refresh
@@ -410,35 +542,6 @@ export function timber(config?: TimberUserConfig): PluginOption[] {
410
542
  // We do NOT set customBuildApp — the RSC plugin's orchestration is correct
411
543
  // and handles bundle ordering, asset manifest generation, and environment
412
544
  // imports manifest. See @vitejs/plugin-rsc's buildApp implementation.
413
- // Resolve @vitejs/plugin-rsc from the consumer's project (process.cwd()),
414
- // not from timber's own node_modules. This is critical for pnpm link:
415
- // when linked, timber's node_modules has a separate vite instance, and
416
- // the RSC plugin must use the same vite instance as the dev server.
417
- const consumerRequire = createRequire(join(process.cwd(), 'package.json'));
418
- const rscPluginPath = consumerRequire.resolve('@vitejs/plugin-rsc');
419
- ctx.timer.start('rsc-plugin-import');
420
- const rscPluginsPromise = import(pathToFileURL(rscPluginPath).href).then(
421
- ({ default: vitePluginRsc }) => {
422
- ctx.timer.end('rsc-plugin-import');
423
- return vitePluginRsc({
424
- serverHandler: false,
425
- customClientEntry: true,
426
- entries: {
427
- rsc: 'virtual:timber-rsc-entry',
428
- ssr: 'virtual:timber-ssr-entry',
429
- client: 'virtual:timber-browser-entry',
430
- },
431
- // Group all client reference wrappers into a single chunk instead of
432
- // creating one tiny file per "use client" module. Without this, each
433
- // server chunk's client references become a separate entry point,
434
- // producing many sub-500B wrapper files (e.g., 30-byte re-exports).
435
- // A single group eliminates 10+ unnecessary HTTP requests.
436
- // See design/27-chunking-strategy.md and TIM-440.
437
- clientChunks: () => 'client-refs',
438
- });
439
- }
440
- );
441
-
442
545
  return [
443
546
  rootSync,
444
547
  timberReactProd(),
@@ -447,20 +550,22 @@ export function timber(config?: TimberUserConfig): PluginOption[] {
447
550
  // following Vinext's convention — the RSC plugin's virtual browser entry
448
551
  // coordinates with plugin-react via __vite_plugin_react_preamble_installed__.
449
552
  react(),
450
- timberServerActionExports(),
451
- rscPluginsPromise,
553
+ ...reactCompilerPlugins,
554
+ vitePluginRsc(createRscOptions(ctx, encryptionKeyExpr)),
452
555
  timberShims(ctx),
453
556
  timberRouting(ctx),
454
557
  timberEntries(ctx),
455
558
  timberBuildManifest(ctx),
456
- timberCache(ctx),
457
559
  timberStaticBuild(ctx),
458
- timberDynamicTransform(ctx),
459
560
  timberFonts(ctx),
460
561
  timberMdx(ctx),
562
+ timberCacheTransform(ctx),
563
+ timberPrerenderSugar(ctx), // export const prerender → cache.component() desugaring
564
+ timberPrebuilt(ctx), // cache.component() → __prebuilt() callsite rewrite
461
565
  timberContent(ctx),
462
566
  timberServerBundle(), // Bundle all deps in server environments for prod
463
- timberChunks(),
567
+ timberCloudflareWasm(ctx), // Externalize WASM for Cloudflare Workers
568
+ timberChunks(ctx),
464
569
  timberBuildReport(ctx), // Post-build: route table with bundle sizes
465
570
  timberAdapterBuild(ctx), // Post-build: invoke adapter.buildOutput()
466
571
  timberDevLogs(ctx), // Dev-only: forward server console.* to browser console
@@ -468,17 +573,4 @@ export function timber(config?: TimberUserConfig): PluginOption[] {
468
573
  ];
469
574
  }
470
575
 
471
- /**
472
- * Route map interface — augmented by the generated timber-routes.d.ts.
473
- *
474
- * Each key is a route path pattern. Values have:
475
- * params: shape of URL params (e.g. { id: string })
476
- * searchParams: parsed type from search-params.ts, or {} if none
477
- *
478
- * This interface is empty by default and populated via codegen.
479
- * See design/09-typescript.md §"Typed Routes".
480
- */
481
- // eslint-disable-next-line @typescript-eslint/no-empty-object-type
482
- export interface Routes {}
483
-
484
576
  export default timber;