@timber-js/app 0.2.0-alpha.12 → 0.2.0-alpha.120

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 (758) hide show
  1. package/dist/_chunks/actions-Cw-7NfJJ.js +1101 -0
  2. package/dist/_chunks/actions-Cw-7NfJJ.js.map +1 -0
  3. package/dist/_chunks/build-output-helper-DhxiT18k.js +61 -0
  4. package/dist/_chunks/build-output-helper-DhxiT18k.js.map +1 -0
  5. package/dist/_chunks/cli-schema-sync-XV0I47Gj.js +2 -0
  6. package/dist/_chunks/cli-schema-sync-q2wB0DyJ.js +358 -0
  7. package/dist/_chunks/cli-schema-sync-q2wB0DyJ.js.map +1 -0
  8. package/dist/_chunks/codec-registry-V7ARyeLN.js +21 -0
  9. package/dist/_chunks/codec-registry-V7ARyeLN.js.map +1 -0
  10. package/dist/_chunks/define-8zQ8Vm7x.js +195 -0
  11. package/dist/_chunks/define-8zQ8Vm7x.js.map +1 -0
  12. package/dist/_chunks/define-zQX6e1tN.js +124 -0
  13. package/dist/_chunks/define-zQX6e1tN.js.map +1 -0
  14. package/dist/_chunks/format-CR6v1pWE.js +14 -0
  15. package/dist/_chunks/format-CR6v1pWE.js.map +1 -0
  16. package/dist/_chunks/handler-store-iqnt2ghN.js +54 -0
  17. package/dist/_chunks/handler-store-iqnt2ghN.js.map +1 -0
  18. package/dist/_chunks/logger-DDmK5skc.js +291 -0
  19. package/dist/_chunks/logger-DDmK5skc.js.map +1 -0
  20. package/dist/_chunks/merge-search-params-CwxJzBLS.js +41 -0
  21. package/dist/_chunks/merge-search-params-CwxJzBLS.js.map +1 -0
  22. package/dist/_chunks/navigation-root-DKsJ5Di7.js +96 -0
  23. package/dist/_chunks/navigation-root-DKsJ5Di7.js.map +1 -0
  24. package/dist/_chunks/registry-Dp_hJL4s.js +20 -0
  25. package/dist/_chunks/registry-Dp_hJL4s.js.map +1 -0
  26. package/dist/_chunks/resolve-schema-23Mc8aLi.js +65 -0
  27. package/dist/_chunks/resolve-schema-23Mc8aLi.js.map +1 -0
  28. package/dist/_chunks/router-ref-sektkr-t.js +28 -0
  29. package/dist/_chunks/router-ref-sektkr-t.js.map +1 -0
  30. package/dist/_chunks/scanner-DmfoB7iK.js +336 -0
  31. package/dist/_chunks/scanner-DmfoB7iK.js.map +1 -0
  32. package/dist/_chunks/schema-bridge-eL5vQDSA.js +86 -0
  33. package/dist/_chunks/schema-bridge-eL5vQDSA.js.map +1 -0
  34. package/dist/_chunks/segment-classify-CnfLLvir.js +137 -0
  35. package/dist/_chunks/segment-classify-CnfLLvir.js.map +1 -0
  36. package/dist/_chunks/segment-context-Bg0pFbLT.js +34 -0
  37. package/dist/_chunks/segment-context-Bg0pFbLT.js.map +1 -0
  38. package/dist/_chunks/{ssr-data-MjmprTmO.js → ssr-data-BO5OvEvg.js} +1 -1
  39. package/dist/_chunks/ssr-data-BO5OvEvg.js.map +1 -0
  40. package/dist/_chunks/stale-reload-BCPRG0Cv.js +64 -0
  41. package/dist/_chunks/stale-reload-BCPRG0Cv.js.map +1 -0
  42. package/dist/_chunks/tracing-DvKLzCFa.js +329 -0
  43. package/dist/_chunks/tracing-DvKLzCFa.js.map +1 -0
  44. package/dist/_chunks/{use-query-states-D5KaffOK.js → use-query-states-D9SBlAfp.js} +7 -20
  45. package/dist/_chunks/use-query-states-D9SBlAfp.js.map +1 -0
  46. package/dist/_chunks/use-segment-params-CskiK-59.js +185 -0
  47. package/dist/_chunks/use-segment-params-CskiK-59.js.map +1 -0
  48. package/dist/_chunks/validation-Bm3Je-09.js +84 -0
  49. package/dist/_chunks/validation-Bm3Je-09.js.map +1 -0
  50. package/dist/_chunks/walkers-DgOXkTts.js +609 -0
  51. package/dist/_chunks/walkers-DgOXkTts.js.map +1 -0
  52. package/dist/_chunks/{format-DviM89f0.js → warnings-B30wpfaS.js} +6 -45
  53. package/dist/_chunks/warnings-B30wpfaS.js.map +1 -0
  54. package/dist/adapters/build-output-helper.d.ts +28 -0
  55. package/dist/adapters/build-output-helper.d.ts.map +1 -0
  56. package/dist/adapters/cloudflare-dev.d.ts +109 -0
  57. package/dist/adapters/cloudflare-dev.d.ts.map +1 -0
  58. package/dist/adapters/cloudflare-dev.js +73 -0
  59. package/dist/adapters/cloudflare-dev.js.map +1 -0
  60. package/dist/adapters/cloudflare-kv-cache.d.ts +64 -0
  61. package/dist/adapters/cloudflare-kv-cache.d.ts.map +1 -0
  62. package/dist/adapters/cloudflare-kv-cache.js +95 -0
  63. package/dist/adapters/cloudflare-kv-cache.js.map +1 -0
  64. package/dist/adapters/cloudflare.d.ts +148 -12
  65. package/dist/adapters/cloudflare.d.ts.map +1 -1
  66. package/dist/adapters/cloudflare.js +142 -38
  67. package/dist/adapters/cloudflare.js.map +1 -1
  68. package/dist/adapters/compress-module.d.ts.map +1 -1
  69. package/dist/adapters/nitro.d.ts +17 -1
  70. package/dist/adapters/nitro.d.ts.map +1 -1
  71. package/dist/adapters/nitro.js +143 -45
  72. package/dist/adapters/nitro.js.map +1 -1
  73. package/dist/adapters/shared.d.ts +16 -0
  74. package/dist/adapters/shared.d.ts.map +1 -0
  75. package/dist/cache/cache-api.d.ts +24 -0
  76. package/dist/cache/cache-api.d.ts.map +1 -0
  77. package/dist/cache/handler-store.d.ts +31 -0
  78. package/dist/cache/handler-store.d.ts.map +1 -0
  79. package/dist/cache/index.d.ts +23 -7
  80. package/dist/cache/index.d.ts.map +1 -1
  81. package/dist/cache/index.js +151 -81
  82. package/dist/cache/index.js.map +1 -1
  83. package/dist/cache/singleflight.d.ts +18 -1
  84. package/dist/cache/singleflight.d.ts.map +1 -1
  85. package/dist/cache/sizeof.d.ts +22 -0
  86. package/dist/cache/sizeof.d.ts.map +1 -0
  87. package/dist/cache/timber-cache.d.ts +1 -1
  88. package/dist/cache/timber-cache.d.ts.map +1 -1
  89. package/dist/cli-schema-sync.d.ts +37 -0
  90. package/dist/cli-schema-sync.d.ts.map +1 -0
  91. package/dist/cli.d.ts +14 -2
  92. package/dist/cli.d.ts.map +1 -1
  93. package/dist/cli.js +42 -6
  94. package/dist/cli.js.map +1 -1
  95. package/dist/client/browser-dev.d.ts +34 -1
  96. package/dist/client/browser-dev.d.ts.map +1 -1
  97. package/dist/client/browser-entry/action-dispatch.d.ts +17 -0
  98. package/dist/client/browser-entry/action-dispatch.d.ts.map +1 -0
  99. package/dist/client/browser-entry/hmr.d.ts +21 -0
  100. package/dist/client/browser-entry/hmr.d.ts.map +1 -0
  101. package/dist/client/browser-entry/hydrate.d.ts +46 -0
  102. package/dist/client/browser-entry/hydrate.d.ts.map +1 -0
  103. package/dist/client/browser-entry/index.d.ts +30 -0
  104. package/dist/client/browser-entry/index.d.ts.map +1 -0
  105. package/dist/client/browser-entry/post-hydration.d.ts +26 -0
  106. package/dist/client/browser-entry/post-hydration.d.ts.map +1 -0
  107. package/dist/client/browser-entry/router-init.d.ts +23 -0
  108. package/dist/client/browser-entry/router-init.d.ts.map +1 -0
  109. package/dist/client/browser-entry/rsc-stream.d.ts +24 -0
  110. package/dist/client/browser-entry/rsc-stream.d.ts.map +1 -0
  111. package/dist/client/browser-entry/scroll.d.ts +19 -0
  112. package/dist/client/browser-entry/scroll.d.ts.map +1 -0
  113. package/dist/client/error-boundary.d.ts +12 -5
  114. package/dist/client/error-boundary.d.ts.map +1 -1
  115. package/dist/client/error-boundary.js +29 -6
  116. package/dist/client/error-boundary.js.map +1 -1
  117. package/dist/client/error-reconstituter.d.ts +54 -0
  118. package/dist/client/error-reconstituter.d.ts.map +1 -0
  119. package/dist/client/form.d.ts +16 -27
  120. package/dist/client/form.d.ts.map +1 -1
  121. package/dist/client/history.d.ts +19 -4
  122. package/dist/client/history.d.ts.map +1 -1
  123. package/dist/client/index.d.ts +9 -24
  124. package/dist/client/index.d.ts.map +1 -1
  125. package/dist/client/index.js +172 -1100
  126. package/dist/client/index.js.map +1 -1
  127. package/dist/client/internal.d.ts +19 -0
  128. package/dist/client/internal.d.ts.map +1 -0
  129. package/dist/client/internal.js +964 -0
  130. package/dist/client/internal.js.map +1 -0
  131. package/dist/client/link-pending-store.d.ts +63 -0
  132. package/dist/client/link-pending-store.d.ts.map +1 -0
  133. package/dist/client/link.d.ts +62 -55
  134. package/dist/client/link.d.ts.map +1 -1
  135. package/dist/client/nav-link-store.d.ts +36 -0
  136. package/dist/client/nav-link-store.d.ts.map +1 -0
  137. package/dist/client/navigation-api-types.d.ts +90 -0
  138. package/dist/client/navigation-api-types.d.ts.map +1 -0
  139. package/dist/client/navigation-api.d.ts +115 -0
  140. package/dist/client/navigation-api.d.ts.map +1 -0
  141. package/dist/client/navigation-context.d.ts +13 -2
  142. package/dist/client/navigation-context.d.ts.map +1 -1
  143. package/dist/client/{transition-root.d.ts → navigation-root.d.ts} +42 -8
  144. package/dist/client/navigation-root.d.ts.map +1 -0
  145. package/dist/client/nuqs-adapter.d.ts.map +1 -1
  146. package/dist/client/router-ref.d.ts +1 -1
  147. package/dist/client/router.d.ts +70 -4
  148. package/dist/client/router.d.ts.map +1 -1
  149. package/dist/client/rsc-fetch.d.ts +38 -3
  150. package/dist/client/rsc-fetch.d.ts.map +1 -1
  151. package/dist/client/segment-cache.d.ts +1 -1
  152. package/dist/client/segment-cache.d.ts.map +1 -1
  153. package/dist/client/segment-outlet.d.ts +63 -0
  154. package/dist/client/segment-outlet.d.ts.map +1 -0
  155. package/dist/client/ssr-data.d.ts +13 -4
  156. package/dist/client/ssr-data.d.ts.map +1 -1
  157. package/dist/client/stale-reload.d.ts +15 -0
  158. package/dist/client/stale-reload.d.ts.map +1 -1
  159. package/dist/client/state.d.ts +1 -1
  160. package/dist/client/top-loader.d.ts +5 -5
  161. package/dist/client/top-loader.d.ts.map +1 -1
  162. package/dist/client/use-cookie.d.ts +12 -0
  163. package/dist/client/use-cookie.d.ts.map +1 -1
  164. package/dist/client/use-link-status.d.ts +5 -5
  165. package/dist/client/use-link-status.d.ts.map +1 -1
  166. package/dist/client/{use-navigation-pending.d.ts → use-pending-navigation.d.ts} +4 -4
  167. package/dist/client/use-pending-navigation.d.ts.map +1 -0
  168. package/dist/client/use-query-states.d.ts +1 -1
  169. package/dist/client/use-query-states.d.ts.map +1 -1
  170. package/dist/client/use-router.d.ts +1 -1
  171. package/dist/client/{use-params.d.ts → use-segment-params.d.ts} +8 -6
  172. package/dist/client/use-segment-params.d.ts.map +1 -0
  173. package/dist/codec.d.ts +51 -0
  174. package/dist/codec.d.ts.map +1 -0
  175. package/dist/codec.js +46 -0
  176. package/dist/codec.js.map +1 -0
  177. package/dist/config-types.d.ts +294 -0
  178. package/dist/config-types.d.ts.map +1 -0
  179. package/dist/config-validation.d.ts +51 -0
  180. package/dist/config-validation.d.ts.map +1 -0
  181. package/dist/content/index.d.ts +1 -10
  182. package/dist/content/index.d.ts.map +1 -1
  183. package/dist/content/index.js +0 -2
  184. package/dist/cookies/define-cookie.d.ts +58 -25
  185. package/dist/cookies/define-cookie.d.ts.map +1 -1
  186. package/dist/cookies/index.d.ts +2 -1
  187. package/dist/cookies/index.d.ts.map +1 -1
  188. package/dist/cookies/index.js +251 -36
  189. package/dist/cookies/index.js.map +1 -1
  190. package/dist/cookies/json-cookie.d.ts +64 -0
  191. package/dist/cookies/json-cookie.d.ts.map +1 -0
  192. package/dist/cookies/validation.d.ts +46 -0
  193. package/dist/cookies/validation.d.ts.map +1 -0
  194. package/dist/dev-tools/404-page.d.ts +46 -0
  195. package/dist/dev-tools/404-page.d.ts.map +1 -0
  196. package/dist/dev-tools/browser-logs.d.ts +84 -0
  197. package/dist/dev-tools/browser-logs.d.ts.map +1 -0
  198. package/dist/dev-tools/error-page.d.ts +58 -0
  199. package/dist/dev-tools/error-page.d.ts.map +1 -0
  200. package/dist/dev-tools/holding-server.d.ts +54 -0
  201. package/dist/dev-tools/holding-server.d.ts.map +1 -0
  202. package/dist/dev-tools/index.d.ts +31 -0
  203. package/dist/dev-tools/index.d.ts.map +1 -0
  204. package/dist/{server/dev-span-processor.d.ts → dev-tools/instrumentation.d.ts} +26 -6
  205. package/dist/dev-tools/instrumentation.d.ts.map +1 -0
  206. package/dist/{server/dev-logger.d.ts → dev-tools/logger.d.ts} +1 -1
  207. package/dist/dev-tools/logger.d.ts.map +1 -0
  208. package/dist/{plugins/dev-logs.d.ts → dev-tools/logs.d.ts} +2 -2
  209. package/dist/dev-tools/logs.d.ts.map +1 -0
  210. package/dist/dev-tools/overlay.d.ts +91 -0
  211. package/dist/dev-tools/overlay.d.ts.map +1 -0
  212. package/dist/dev-tools/stack-classifier.d.ts +34 -0
  213. package/dist/dev-tools/stack-classifier.d.ts.map +1 -0
  214. package/dist/dev-tools/terminal.d.ts +28 -0
  215. package/dist/dev-tools/terminal.d.ts.map +1 -0
  216. package/dist/{server/dev-warnings.d.ts → dev-tools/warnings.d.ts} +2 -22
  217. package/dist/dev-tools/warnings.d.ts.map +1 -0
  218. package/dist/fonts/ast.d.ts +98 -6
  219. package/dist/fonts/ast.d.ts.map +1 -1
  220. package/dist/fonts/bundle.d.ts +48 -0
  221. package/dist/fonts/bundle.d.ts.map +1 -0
  222. package/dist/fonts/dev-middleware.d.ts +22 -0
  223. package/dist/fonts/dev-middleware.d.ts.map +1 -0
  224. package/dist/fonts/local.d.ts +1 -1
  225. package/dist/fonts/pipeline.d.ts +167 -0
  226. package/dist/fonts/pipeline.d.ts.map +1 -0
  227. package/dist/fonts/transform.d.ts +78 -0
  228. package/dist/fonts/transform.d.ts.map +1 -0
  229. package/dist/fonts/types.d.ts +45 -1
  230. package/dist/fonts/types.d.ts.map +1 -1
  231. package/dist/fonts/virtual-modules.d.ts +94 -0
  232. package/dist/fonts/virtual-modules.d.ts.map +1 -0
  233. package/dist/index.d.ts +46 -190
  234. package/dist/index.d.ts.map +1 -1
  235. package/dist/index.js +4799 -12730
  236. package/dist/index.js.map +1 -1
  237. package/dist/params/codec-registry.d.ts +26 -0
  238. package/dist/params/codec-registry.d.ts.map +1 -0
  239. package/dist/params/define-schema.d.ts +53 -0
  240. package/dist/params/define-schema.d.ts.map +1 -0
  241. package/dist/params/index.d.ts +5 -0
  242. package/dist/params/index.d.ts.map +1 -0
  243. package/dist/params/index.js +34 -0
  244. package/dist/params/index.js.map +1 -0
  245. package/dist/params/resolve-schema.d.ts +34 -0
  246. package/dist/params/resolve-schema.d.ts.map +1 -0
  247. package/dist/plugin-context.d.ts +107 -0
  248. package/dist/plugin-context.d.ts.map +1 -0
  249. package/dist/plugins/adapter-build.d.ts +1 -1
  250. package/dist/plugins/adapter-build.d.ts.map +1 -1
  251. package/dist/plugins/build-manifest.d.ts +2 -2
  252. package/dist/plugins/build-manifest.d.ts.map +1 -1
  253. package/dist/plugins/build-report.d.ts +9 -7
  254. package/dist/plugins/build-report.d.ts.map +1 -1
  255. package/dist/plugins/client-chunks.d.ts +32 -0
  256. package/dist/plugins/client-chunks.d.ts.map +1 -0
  257. package/dist/plugins/content.d.ts +1 -1
  258. package/dist/plugins/content.d.ts.map +1 -1
  259. package/dist/plugins/dev-server.d.ts +1 -1
  260. package/dist/plugins/dev-server.d.ts.map +1 -1
  261. package/dist/plugins/entries.d.ts +1 -1
  262. package/dist/plugins/entries.d.ts.map +1 -1
  263. package/dist/plugins/fonts.d.ts +17 -73
  264. package/dist/plugins/fonts.d.ts.map +1 -1
  265. package/dist/plugins/mdx.d.ts +1 -1
  266. package/dist/plugins/mdx.d.ts.map +1 -1
  267. package/dist/plugins/routing.d.ts +1 -1
  268. package/dist/plugins/routing.d.ts.map +1 -1
  269. package/dist/plugins/server-bundle.d.ts.map +1 -1
  270. package/dist/plugins/shims.d.ts +6 -5
  271. package/dist/plugins/shims.d.ts.map +1 -1
  272. package/dist/plugins/static-build.d.ts +5 -26
  273. package/dist/plugins/static-build.d.ts.map +1 -1
  274. package/dist/routing/codegen-shared.d.ts +63 -0
  275. package/dist/routing/codegen-shared.d.ts.map +1 -0
  276. package/dist/routing/codegen-types.d.ts +60 -0
  277. package/dist/routing/codegen-types.d.ts.map +1 -0
  278. package/dist/routing/codegen.d.ts +7 -2
  279. package/dist/routing/codegen.d.ts.map +1 -1
  280. package/dist/routing/convention-lint.d.ts +41 -0
  281. package/dist/routing/convention-lint.d.ts.map +1 -0
  282. package/dist/routing/index.d.ts +5 -1
  283. package/dist/routing/index.d.ts.map +1 -1
  284. package/dist/routing/index.js +4 -2
  285. package/dist/routing/link-codegen.d.ts +90 -0
  286. package/dist/routing/link-codegen.d.ts.map +1 -0
  287. package/dist/routing/scanner.d.ts +1 -10
  288. package/dist/routing/scanner.d.ts.map +1 -1
  289. package/dist/routing/segment-classify.d.ts +75 -0
  290. package/dist/routing/segment-classify.d.ts.map +1 -0
  291. package/dist/routing/segment-codegen.d.ts +38 -0
  292. package/dist/routing/segment-codegen.d.ts.map +1 -0
  293. package/dist/routing/types.d.ts +77 -25
  294. package/dist/routing/types.d.ts.map +1 -1
  295. package/dist/routing/walkers.d.ts +51 -0
  296. package/dist/routing/walkers.d.ts.map +1 -0
  297. package/dist/rsc-runtime/rsc.d.ts +1 -1
  298. package/dist/rsc-runtime/rsc.d.ts.map +1 -1
  299. package/dist/rsc-runtime/ssr.d.ts +12 -0
  300. package/dist/rsc-runtime/ssr.d.ts.map +1 -1
  301. package/dist/schema-bridge.d.ts +76 -0
  302. package/dist/schema-bridge.d.ts.map +1 -0
  303. package/dist/search-params/define.d.ts +157 -0
  304. package/dist/search-params/define.d.ts.map +1 -0
  305. package/dist/search-params/index.d.ts +4 -7
  306. package/dist/search-params/index.d.ts.map +1 -1
  307. package/dist/search-params/index.js +34 -441
  308. package/dist/search-params/index.js.map +1 -1
  309. package/dist/search-params/registry.d.ts +2 -2
  310. package/dist/search-params/registry.d.ts.map +1 -1
  311. package/dist/search-params/wrappers.d.ts +53 -0
  312. package/dist/search-params/wrappers.d.ts.map +1 -0
  313. package/dist/segment-params/define.d.ts +95 -0
  314. package/dist/segment-params/define.d.ts.map +1 -0
  315. package/dist/segment-params/index.d.ts +3 -0
  316. package/dist/segment-params/index.d.ts.map +1 -0
  317. package/dist/segment-params/index.js +2 -0
  318. package/dist/server/access-gate.d.ts +8 -3
  319. package/dist/server/access-gate.d.ts.map +1 -1
  320. package/dist/server/action-client.d.ts +41 -6
  321. package/dist/server/action-client.d.ts.map +1 -1
  322. package/dist/server/action-encryption.d.ts +76 -0
  323. package/dist/server/action-encryption.d.ts.map +1 -0
  324. package/dist/server/action-handler.d.ts +35 -1
  325. package/dist/server/action-handler.d.ts.map +1 -1
  326. package/dist/server/actions.d.ts +3 -6
  327. package/dist/server/actions.d.ts.map +1 -1
  328. package/dist/server/als-registry.d.ts +53 -5
  329. package/dist/server/als-registry.d.ts.map +1 -1
  330. package/dist/server/asset-headers.d.ts +1 -15
  331. package/dist/server/asset-headers.d.ts.map +1 -1
  332. package/dist/server/build-manifest.d.ts +2 -2
  333. package/dist/server/build-manifest.d.ts.map +1 -1
  334. package/dist/server/coalesce-tick.d.ts +40 -0
  335. package/dist/server/coalesce-tick.d.ts.map +1 -0
  336. package/dist/server/cookie-context.d.ts +170 -0
  337. package/dist/server/cookie-context.d.ts.map +1 -0
  338. package/dist/server/cookie-parsing.d.ts +51 -0
  339. package/dist/server/cookie-parsing.d.ts.map +1 -0
  340. package/dist/server/debug.d.ts +1 -1
  341. package/dist/server/default-logger.d.ts +22 -0
  342. package/dist/server/default-logger.d.ts.map +1 -0
  343. package/dist/server/deny-boundary.d.ts +90 -0
  344. package/dist/server/deny-boundary.d.ts.map +1 -0
  345. package/dist/server/deny-renderer.d.ts.map +1 -1
  346. package/dist/server/dev-source-map.d.ts +22 -0
  347. package/dist/server/dev-source-map.d.ts.map +1 -0
  348. package/dist/server/early-hints-sender.d.ts.map +1 -1
  349. package/dist/server/early-hints.d.ts +13 -5
  350. package/dist/server/early-hints.d.ts.map +1 -1
  351. package/dist/server/error-boundary-wrapper.d.ts +7 -1
  352. package/dist/server/error-boundary-wrapper.d.ts.map +1 -1
  353. package/dist/server/fallback-error.d.ts +12 -7
  354. package/dist/server/fallback-error.d.ts.map +1 -1
  355. package/dist/server/flight-injection-state.d.ts +66 -0
  356. package/dist/server/flight-injection-state.d.ts.map +1 -0
  357. package/dist/server/flight-scripts.d.ts +42 -0
  358. package/dist/server/flight-scripts.d.ts.map +1 -0
  359. package/dist/server/flush.d.ts.map +1 -1
  360. package/dist/server/form-data.d.ts +29 -0
  361. package/dist/server/form-data.d.ts.map +1 -1
  362. package/dist/server/html-injector-core.d.ts +213 -0
  363. package/dist/server/html-injector-core.d.ts.map +1 -0
  364. package/dist/server/html-injectors.d.ts +81 -41
  365. package/dist/server/html-injectors.d.ts.map +1 -1
  366. package/dist/server/index.d.ts +10 -46
  367. package/dist/server/index.d.ts.map +1 -1
  368. package/dist/server/index.js +155 -2905
  369. package/dist/server/index.js.map +1 -1
  370. package/dist/server/internal.d.ts +48 -0
  371. package/dist/server/internal.d.ts.map +1 -0
  372. package/dist/server/internal.js +2947 -0
  373. package/dist/server/internal.js.map +1 -0
  374. package/dist/server/logger.d.ts +39 -7
  375. package/dist/server/logger.d.ts.map +1 -1
  376. package/dist/server/middleware-runner.d.ts +36 -4
  377. package/dist/server/middleware-runner.d.ts.map +1 -1
  378. package/dist/server/node-stream-transforms.d.ts +112 -0
  379. package/dist/server/node-stream-transforms.d.ts.map +1 -0
  380. package/dist/server/param-coercion.d.ts +54 -0
  381. package/dist/server/param-coercion.d.ts.map +1 -0
  382. package/dist/server/pipeline-helpers.d.ts +95 -0
  383. package/dist/server/pipeline-helpers.d.ts.map +1 -0
  384. package/dist/server/pipeline-interception.d.ts +1 -1
  385. package/dist/server/pipeline-interception.d.ts.map +1 -1
  386. package/dist/server/pipeline-metadata.d.ts +6 -0
  387. package/dist/server/pipeline-metadata.d.ts.map +1 -1
  388. package/dist/server/pipeline-outcome.d.ts +49 -0
  389. package/dist/server/pipeline-outcome.d.ts.map +1 -0
  390. package/dist/server/pipeline-phases.d.ts +52 -0
  391. package/dist/server/pipeline-phases.d.ts.map +1 -0
  392. package/dist/server/pipeline.d.ts +118 -23
  393. package/dist/server/pipeline.d.ts.map +1 -1
  394. package/dist/server/port-resolution.d.ts +117 -0
  395. package/dist/server/port-resolution.d.ts.map +1 -0
  396. package/dist/server/primitives.d.ts +69 -18
  397. package/dist/server/primitives.d.ts.map +1 -1
  398. package/dist/server/render-timeout.d.ts +51 -0
  399. package/dist/server/render-timeout.d.ts.map +1 -0
  400. package/dist/server/request-context.d.ts +62 -107
  401. package/dist/server/request-context.d.ts.map +1 -1
  402. package/dist/server/route-element-builder.d.ts +27 -1
  403. package/dist/server/route-element-builder.d.ts.map +1 -1
  404. package/dist/server/route-handler.d.ts.map +1 -1
  405. package/dist/server/route-matcher.d.ts +21 -34
  406. package/dist/server/route-matcher.d.ts.map +1 -1
  407. package/dist/server/rsc-entry/action-middleware-runner.d.ts +66 -0
  408. package/dist/server/rsc-entry/action-middleware-runner.d.ts.map +1 -0
  409. package/dist/server/rsc-entry/api-handler.d.ts +2 -2
  410. package/dist/server/rsc-entry/api-handler.d.ts.map +1 -1
  411. package/dist/server/rsc-entry/error-renderer.d.ts +26 -13
  412. package/dist/server/rsc-entry/error-renderer.d.ts.map +1 -1
  413. package/dist/server/rsc-entry/helpers.d.ts +49 -6
  414. package/dist/server/rsc-entry/helpers.d.ts.map +1 -1
  415. package/dist/server/rsc-entry/index.d.ts +19 -8
  416. package/dist/server/rsc-entry/index.d.ts.map +1 -1
  417. package/dist/server/rsc-entry/render-route.d.ts +50 -0
  418. package/dist/server/rsc-entry/render-route.d.ts.map +1 -0
  419. package/dist/server/rsc-entry/rsc-payload.d.ts +3 -3
  420. package/dist/server/rsc-entry/rsc-payload.d.ts.map +1 -1
  421. package/dist/server/rsc-entry/rsc-stream.d.ts +17 -1
  422. package/dist/server/rsc-entry/rsc-stream.d.ts.map +1 -1
  423. package/dist/server/rsc-entry/ssr-bridge.d.ts +1 -1
  424. package/dist/server/rsc-entry/ssr-bridge.d.ts.map +1 -1
  425. package/dist/server/rsc-entry/ssr-renderer.d.ts +19 -4
  426. package/dist/server/rsc-entry/ssr-renderer.d.ts.map +1 -1
  427. package/dist/server/rsc-entry/wrap-action-dispatch.d.ts +119 -0
  428. package/dist/server/rsc-entry/wrap-action-dispatch.d.ts.map +1 -0
  429. package/dist/server/safe-load.d.ts +46 -0
  430. package/dist/server/safe-load.d.ts.map +1 -0
  431. package/dist/server/sensitive-fields.d.ts +74 -0
  432. package/dist/server/sensitive-fields.d.ts.map +1 -0
  433. package/dist/server/sitemap-generator.d.ts +129 -0
  434. package/dist/server/sitemap-generator.d.ts.map +1 -0
  435. package/dist/server/sitemap-handler.d.ts +22 -0
  436. package/dist/server/sitemap-handler.d.ts.map +1 -0
  437. package/dist/server/slot-resolver.d.ts +1 -1
  438. package/dist/server/slot-resolver.d.ts.map +1 -1
  439. package/dist/server/ssr-entry.d.ts +30 -0
  440. package/dist/server/ssr-entry.d.ts.map +1 -1
  441. package/dist/server/ssr-render.d.ts +39 -21
  442. package/dist/server/ssr-render.d.ts.map +1 -1
  443. package/dist/server/ssr-wrappers.d.ts +50 -0
  444. package/dist/server/ssr-wrappers.d.ts.map +1 -0
  445. package/dist/server/state-tree-diff.d.ts.map +1 -1
  446. package/dist/server/status-code-resolver.d.ts +16 -11
  447. package/dist/server/status-code-resolver.d.ts.map +1 -1
  448. package/dist/server/stream-utils.d.ts +36 -0
  449. package/dist/server/stream-utils.d.ts.map +1 -0
  450. package/dist/server/tracing.d.ts +5 -5
  451. package/dist/server/tracing.d.ts.map +1 -1
  452. package/dist/server/tree-builder.d.ts +62 -30
  453. package/dist/server/tree-builder.d.ts.map +1 -1
  454. package/dist/server/tree-match.d.ts +41 -0
  455. package/dist/server/tree-match.d.ts.map +1 -0
  456. package/dist/server/types.d.ts +49 -4
  457. package/dist/server/types.d.ts.map +1 -1
  458. package/dist/server/utils/escape-html.d.ts +14 -0
  459. package/dist/server/utils/escape-html.d.ts.map +1 -0
  460. package/dist/server/version-skew.d.ts +61 -0
  461. package/dist/server/version-skew.d.ts.map +1 -0
  462. package/dist/shared/merge-search-params.d.ts +22 -0
  463. package/dist/shared/merge-search-params.d.ts.map +1 -0
  464. package/dist/shims/font-google.d.ts +1 -1
  465. package/dist/shims/font-google.d.ts.map +1 -1
  466. package/dist/shims/font-google.js +42 -0
  467. package/dist/shims/font-google.js.map +1 -0
  468. package/dist/shims/font-local.d.ts +26 -0
  469. package/dist/shims/font-local.d.ts.map +1 -0
  470. package/dist/shims/font-local.js +20 -0
  471. package/dist/shims/font-local.js.map +1 -0
  472. package/dist/shims/headers.d.ts +2 -1
  473. package/dist/shims/headers.d.ts.map +1 -1
  474. package/dist/shims/navigation-client.d.ts +3 -1
  475. package/dist/shims/navigation-client.d.ts.map +1 -1
  476. package/dist/shims/navigation.d.ts +11 -5
  477. package/dist/shims/navigation.d.ts.map +1 -1
  478. package/dist/utils/state-machine.d.ts +80 -0
  479. package/dist/utils/state-machine.d.ts.map +1 -0
  480. package/package.json +56 -16
  481. package/src/adapters/build-output-helper.ts +77 -0
  482. package/src/adapters/cloudflare-dev.ts +177 -0
  483. package/src/adapters/cloudflare-kv-cache.ts +142 -0
  484. package/src/adapters/cloudflare.ts +350 -76
  485. package/src/adapters/compress-module.ts +24 -4
  486. package/src/adapters/nitro.ts +142 -59
  487. package/src/adapters/shared.ts +40 -0
  488. package/src/adapters/wrangler.d.ts +7 -0
  489. package/src/cache/cache-api.ts +38 -0
  490. package/src/cache/handler-store.ts +68 -0
  491. package/src/cache/index.ts +81 -18
  492. package/src/cache/singleflight.ts +62 -4
  493. package/src/cache/sizeof.ts +33 -0
  494. package/src/cache/timber-cache.ts +25 -20
  495. package/src/cli-schema-sync.ts +207 -0
  496. package/src/cli.ts +65 -8
  497. package/src/client/browser-dev.ts +153 -1
  498. package/src/client/browser-entry/action-dispatch.ts +126 -0
  499. package/src/client/browser-entry/hmr.ts +81 -0
  500. package/src/client/browser-entry/hydrate.ts +145 -0
  501. package/src/client/browser-entry/index.ts +149 -0
  502. package/src/client/browser-entry/post-hydration.ts +119 -0
  503. package/src/client/browser-entry/router-init.ts +193 -0
  504. package/src/client/browser-entry/rsc-stream.ts +157 -0
  505. package/src/client/browser-entry/scroll.ts +27 -0
  506. package/src/client/error-boundary.tsx +99 -22
  507. package/src/client/error-reconstituter.tsx +65 -0
  508. package/src/client/form.tsx +31 -32
  509. package/src/client/history.ts +26 -4
  510. package/src/client/index.ts +69 -44
  511. package/src/client/internal.ts +58 -0
  512. package/src/client/link-pending-store.ts +111 -0
  513. package/src/client/link.tsx +366 -113
  514. package/src/client/nav-link-store.ts +47 -0
  515. package/src/client/navigation-api-types.ts +112 -0
  516. package/src/client/navigation-api.ts +332 -0
  517. package/src/client/navigation-context.ts +31 -6
  518. package/src/client/navigation-root.tsx +342 -0
  519. package/src/client/nuqs-adapter.tsx +16 -3
  520. package/src/client/router-ref.ts +1 -1
  521. package/src/client/router.ts +300 -73
  522. package/src/client/rsc-fetch.ts +112 -8
  523. package/src/client/segment-cache.ts +1 -1
  524. package/src/client/segment-outlet.tsx +86 -0
  525. package/src/client/ssr-data.ts +13 -5
  526. package/src/client/stale-reload.ts +72 -3
  527. package/src/client/state.ts +2 -2
  528. package/src/client/top-loader.tsx +18 -6
  529. package/src/client/use-cookie.ts +31 -2
  530. package/src/client/use-link-status.ts +7 -7
  531. package/src/client/{use-navigation-pending.ts → use-pending-navigation.ts} +6 -6
  532. package/src/client/use-query-states.ts +9 -3
  533. package/src/client/use-router.ts +1 -1
  534. package/src/client/{use-params.ts → use-segment-params.ts} +8 -6
  535. package/src/codec.ts +97 -0
  536. package/src/config-types.ts +292 -0
  537. package/src/config-validation.ts +303 -0
  538. package/src/content/index.ts +5 -13
  539. package/src/cookies/define-cookie.ts +233 -53
  540. package/src/cookies/index.ts +12 -1
  541. package/src/cookies/json-cookie.ts +105 -0
  542. package/src/cookies/validation.ts +134 -0
  543. package/src/dev-tools/404-page.ts +387 -0
  544. package/src/dev-tools/browser-logs.ts +291 -0
  545. package/src/dev-tools/error-page.ts +506 -0
  546. package/src/dev-tools/holding-server.ts +187 -0
  547. package/src/dev-tools/index.ts +90 -0
  548. package/src/dev-tools/instrumentation.ts +176 -0
  549. package/src/{plugins/dev-logs.ts → dev-tools/logs.ts} +9 -5
  550. package/src/dev-tools/overlay.ts +469 -0
  551. package/src/dev-tools/stack-classifier.ts +75 -0
  552. package/src/dev-tools/terminal.ts +183 -0
  553. package/src/{server/dev-warnings.ts → dev-tools/warnings.ts} +5 -50
  554. package/src/fonts/ast.ts +525 -16
  555. package/src/fonts/bundle.ts +142 -0
  556. package/src/fonts/dev-middleware.ts +74 -0
  557. package/src/fonts/local.ts +1 -1
  558. package/src/fonts/pipeline.ts +314 -0
  559. package/src/fonts/transform.ts +317 -0
  560. package/src/fonts/types.ts +50 -1
  561. package/src/fonts/virtual-modules.ts +233 -0
  562. package/src/index.ts +409 -357
  563. package/src/params/codec-registry.ts +34 -0
  564. package/src/params/define-schema.ts +73 -0
  565. package/src/params/index.ts +11 -0
  566. package/src/params/resolve-schema.ts +88 -0
  567. package/src/plugin-context.ts +240 -0
  568. package/src/plugins/adapter-build.ts +12 -4
  569. package/src/plugins/build-manifest.ts +13 -2
  570. package/src/plugins/build-report.ts +16 -25
  571. package/src/plugins/client-chunks.ts +65 -0
  572. package/src/plugins/content.ts +1 -1
  573. package/src/plugins/dev-server.ts +175 -35
  574. package/src/plugins/entries.ts +111 -9
  575. package/src/plugins/fonts.ts +157 -654
  576. package/src/plugins/mdx.ts +47 -10
  577. package/src/plugins/routing.ts +374 -45
  578. package/src/plugins/server-bundle.ts +32 -1
  579. package/src/plugins/shims.ts +136 -35
  580. package/src/plugins/static-build.ts +15 -89
  581. package/src/routing/codegen-shared.ts +109 -0
  582. package/src/routing/codegen-types.ts +61 -0
  583. package/src/routing/codegen.ts +269 -179
  584. package/src/routing/convention-lint.ts +357 -0
  585. package/src/routing/index.ts +5 -1
  586. package/src/routing/interception.ts +1 -1
  587. package/src/routing/link-codegen.ts +308 -0
  588. package/src/routing/scanner.ts +107 -110
  589. package/src/routing/segment-classify.ts +188 -0
  590. package/src/routing/segment-codegen.ts +98 -0
  591. package/src/routing/types.ts +78 -25
  592. package/src/routing/walkers.ts +90 -0
  593. package/src/rsc-runtime/rsc.ts +2 -0
  594. package/src/rsc-runtime/ssr.ts +50 -0
  595. package/src/rsc-runtime/vendor-types.d.ts +7 -0
  596. package/src/{search-params/codecs.ts → schema-bridge.ts} +57 -20
  597. package/src/search-params/define.ts +538 -0
  598. package/src/search-params/index.ts +14 -20
  599. package/src/search-params/registry.ts +2 -2
  600. package/src/search-params/wrappers.ts +92 -0
  601. package/src/segment-params/define.ts +336 -0
  602. package/src/segment-params/index.ts +9 -0
  603. package/src/server/access-gate.tsx +76 -34
  604. package/src/server/action-client.ts +88 -15
  605. package/src/server/action-encryption.ts +144 -0
  606. package/src/server/action-handler.ts +112 -14
  607. package/src/server/actions.ts +10 -9
  608. package/src/server/als-registry.ts +55 -7
  609. package/src/server/asset-headers.ts +8 -34
  610. package/src/server/build-manifest.ts +10 -4
  611. package/src/server/coalesce-tick.ts +75 -0
  612. package/src/server/compress.ts +25 -7
  613. package/src/server/cookie-context.ts +468 -0
  614. package/src/server/cookie-parsing.ts +135 -0
  615. package/src/server/debug.ts +1 -1
  616. package/src/server/default-logger.ts +99 -0
  617. package/src/server/deny-boundary.ts +218 -0
  618. package/src/server/deny-renderer.ts +31 -50
  619. package/src/server/dev-source-map.ts +31 -0
  620. package/src/server/early-hints-sender.ts +3 -2
  621. package/src/server/early-hints.ts +36 -15
  622. package/src/server/error-boundary-wrapper.ts +74 -22
  623. package/src/server/fallback-error.ts +74 -102
  624. package/src/server/flight-injection-state.ts +113 -0
  625. package/src/server/flight-scripts.ts +62 -0
  626. package/src/server/flush.ts +2 -1
  627. package/src/server/form-data.ts +76 -0
  628. package/src/server/html-injector-core.ts +417 -0
  629. package/src/server/html-injectors.ts +235 -223
  630. package/src/server/index.ts +29 -183
  631. package/src/server/internal.ts +176 -0
  632. package/src/server/logger.ts +67 -36
  633. package/src/server/middleware-runner.ts +75 -4
  634. package/src/server/node-stream-transforms.ts +361 -0
  635. package/src/server/param-coercion.ts +206 -0
  636. package/src/server/pipeline-helpers.ts +204 -0
  637. package/src/server/pipeline-interception.ts +17 -16
  638. package/src/server/pipeline-metadata.ts +13 -0
  639. package/src/server/pipeline-outcome.ts +176 -0
  640. package/src/server/pipeline-phases.ts +460 -0
  641. package/src/server/pipeline.ts +154 -394
  642. package/src/server/port-resolution.ts +215 -0
  643. package/src/server/primitives.ts +111 -28
  644. package/src/server/render-timeout.ts +108 -0
  645. package/src/server/request-context.ts +168 -333
  646. package/src/server/route-element-builder.ts +309 -195
  647. package/src/server/route-handler.ts +24 -4
  648. package/src/server/route-matcher.ts +50 -231
  649. package/src/server/rsc-entry/action-middleware-runner.ts +167 -0
  650. package/src/server/rsc-entry/api-handler.ts +16 -17
  651. package/src/server/rsc-entry/error-renderer.ts +305 -89
  652. package/src/server/rsc-entry/helpers.ts +137 -12
  653. package/src/server/rsc-entry/index.ts +316 -352
  654. package/src/server/rsc-entry/render-route.ts +307 -0
  655. package/src/server/rsc-entry/rsc-payload.ts +65 -18
  656. package/src/server/rsc-entry/rsc-stream.ts +85 -13
  657. package/src/server/rsc-entry/ssr-bridge.ts +14 -5
  658. package/src/server/rsc-entry/ssr-renderer.ts +187 -38
  659. package/src/server/rsc-entry/wrap-action-dispatch.ts +449 -0
  660. package/src/server/safe-load.ts +60 -0
  661. package/src/server/sensitive-fields.ts +230 -0
  662. package/src/server/sitemap-generator.ts +338 -0
  663. package/src/server/sitemap-handler.ts +126 -0
  664. package/src/server/slot-resolver.ts +228 -246
  665. package/src/server/ssr-entry.ts +229 -32
  666. package/src/server/ssr-render.ts +289 -67
  667. package/src/server/ssr-wrappers.tsx +139 -0
  668. package/src/server/state-tree-diff.ts +4 -1
  669. package/src/server/status-code-resolver.ts +112 -128
  670. package/src/server/stream-utils.ts +213 -0
  671. package/src/server/tracing.ts +21 -10
  672. package/src/server/tree-builder.ts +202 -90
  673. package/src/server/tree-match.ts +198 -0
  674. package/src/server/types.ts +55 -6
  675. package/src/server/utils/escape-html.ts +20 -0
  676. package/src/server/version-skew.ts +104 -0
  677. package/src/shared/merge-search-params.ts +55 -0
  678. package/src/shims/font-google.ts +1 -1
  679. package/src/shims/font-local.ts +34 -0
  680. package/src/shims/headers.ts +5 -1
  681. package/src/shims/navigation-client.ts +4 -3
  682. package/src/shims/navigation.ts +14 -7
  683. package/src/utils/state-machine.ts +111 -0
  684. package/dist/_chunks/als-registry-B7DbZ2hS.js +0 -41
  685. package/dist/_chunks/als-registry-B7DbZ2hS.js.map +0 -1
  686. package/dist/_chunks/debug-gwlJkDuf.js +0 -108
  687. package/dist/_chunks/debug-gwlJkDuf.js.map +0 -1
  688. package/dist/_chunks/format-DviM89f0.js.map +0 -1
  689. package/dist/_chunks/interception-BOoWmLUA.js +0 -676
  690. package/dist/_chunks/interception-BOoWmLUA.js.map +0 -1
  691. package/dist/_chunks/request-context-DIkVh_jG.js +0 -330
  692. package/dist/_chunks/request-context-DIkVh_jG.js.map +0 -1
  693. package/dist/_chunks/ssr-data-MjmprTmO.js.map +0 -1
  694. package/dist/_chunks/tracing-CemImE6h.js +0 -187
  695. package/dist/_chunks/tracing-CemImE6h.js.map +0 -1
  696. package/dist/_chunks/use-cookie-DX-l1_5E.js +0 -91
  697. package/dist/_chunks/use-cookie-DX-l1_5E.js.map +0 -1
  698. package/dist/_chunks/use-query-states-D5KaffOK.js.map +0 -1
  699. package/dist/cache/register-cached-function.d.ts +0 -17
  700. package/dist/cache/register-cached-function.d.ts.map +0 -1
  701. package/dist/client/browser-entry.d.ts +0 -21
  702. package/dist/client/browser-entry.d.ts.map +0 -1
  703. package/dist/client/link-status-provider.d.ts +0 -11
  704. package/dist/client/link-status-provider.d.ts.map +0 -1
  705. package/dist/client/transition-root.d.ts.map +0 -1
  706. package/dist/client/use-navigation-pending.d.ts.map +0 -1
  707. package/dist/client/use-params.d.ts.map +0 -1
  708. package/dist/plugins/cache-transform.d.ts +0 -36
  709. package/dist/plugins/cache-transform.d.ts.map +0 -1
  710. package/dist/plugins/dev-error-overlay.d.ts +0 -60
  711. package/dist/plugins/dev-error-overlay.d.ts.map +0 -1
  712. package/dist/plugins/dev-logs.d.ts.map +0 -1
  713. package/dist/plugins/dynamic-transform.d.ts +0 -72
  714. package/dist/plugins/dynamic-transform.d.ts.map +0 -1
  715. package/dist/plugins/server-action-exports.d.ts +0 -26
  716. package/dist/plugins/server-action-exports.d.ts.map +0 -1
  717. package/dist/routing/status-file-lint.d.ts +0 -33
  718. package/dist/routing/status-file-lint.d.ts.map +0 -1
  719. package/dist/search-params/analyze.d.ts +0 -54
  720. package/dist/search-params/analyze.d.ts.map +0 -1
  721. package/dist/search-params/builtin-codecs.d.ts +0 -105
  722. package/dist/search-params/builtin-codecs.d.ts.map +0 -1
  723. package/dist/search-params/codecs.d.ts +0 -53
  724. package/dist/search-params/codecs.d.ts.map +0 -1
  725. package/dist/search-params/create.d.ts +0 -106
  726. package/dist/search-params/create.d.ts.map +0 -1
  727. package/dist/server/dev-fetch-instrumentation.d.ts +0 -22
  728. package/dist/server/dev-fetch-instrumentation.d.ts.map +0 -1
  729. package/dist/server/dev-logger.d.ts.map +0 -1
  730. package/dist/server/dev-span-processor.d.ts.map +0 -1
  731. package/dist/server/dev-warnings.d.ts.map +0 -1
  732. package/dist/server/manifest-status-resolver.d.ts +0 -58
  733. package/dist/server/manifest-status-resolver.d.ts.map +0 -1
  734. package/dist/server/prerender.d.ts +0 -77
  735. package/dist/server/prerender.d.ts.map +0 -1
  736. package/dist/server/response-cache.d.ts +0 -54
  737. package/dist/server/response-cache.d.ts.map +0 -1
  738. package/dist/utils/directive-parser.d.ts +0 -70
  739. package/dist/utils/directive-parser.d.ts.map +0 -1
  740. package/src/cache/register-cached-function.ts +0 -103
  741. package/src/client/browser-entry.ts +0 -678
  742. package/src/client/link-status-provider.tsx +0 -30
  743. package/src/client/transition-root.tsx +0 -166
  744. package/src/plugins/cache-transform.ts +0 -199
  745. package/src/plugins/dev-error-overlay.ts +0 -230
  746. package/src/plugins/dynamic-transform.ts +0 -161
  747. package/src/plugins/server-action-exports.ts +0 -220
  748. package/src/routing/status-file-lint.ts +0 -112
  749. package/src/search-params/analyze.ts +0 -192
  750. package/src/search-params/builtin-codecs.ts +0 -228
  751. package/src/search-params/create.ts +0 -321
  752. package/src/server/dev-fetch-instrumentation.ts +0 -96
  753. package/src/server/dev-span-processor.ts +0 -78
  754. package/src/server/manifest-status-resolver.ts +0 -215
  755. package/src/server/prerender.ts +0 -139
  756. package/src/server/response-cache.ts +0 -410
  757. package/src/utils/directive-parser.ts +0 -529
  758. /package/src/{server/dev-logger.ts → dev-tools/logger.ts} +0 -0
package/src/index.ts CHANGED
@@ -1,10 +1,19 @@
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 { join, resolve } from 'node:path';
5
15
  import { createRequire } from 'node:module';
6
- import react from '@vitejs/plugin-react';
7
- import { cacheTransformPlugin } from './plugins/cache-transform';
16
+ import react, { reactCompilerPreset } from '@vitejs/plugin-react';
8
17
  import { timberContent } from './plugins/content';
9
18
  import { timberDevServer } from './plugins/dev-server';
10
19
  import { timberEntries } from './plugins/entries';
@@ -13,356 +22,266 @@ import { timberRouting } from './plugins/routing';
13
22
  import { timberShims } from './plugins/shims';
14
23
  import { timberFonts } from './plugins/fonts';
15
24
  import { timberStaticBuild } from './plugins/static-build';
16
- import { timberDynamicTransform } from './plugins/dynamic-transform';
17
- import { timberServerActionExports } from './plugins/server-action-exports';
18
25
  import { timberBuildManifest } from './plugins/build-manifest';
19
- import { timberDevLogs } from './plugins/dev-logs';
26
+ import { timberDevLogs } from './dev-tools/logs';
27
+ import { timberDevBrowserLogs } from './dev-tools/browser-logs';
20
28
  import { timberReactProd } from './plugins/react-prod';
21
29
  import { timberChunks } from './plugins/chunks';
30
+ import { clientChunkGroup } from './plugins/client-chunks';
22
31
  import { timberServerBundle } from './plugins/server-bundle';
23
32
  import { timberAdapterBuild } from './plugins/adapter-build';
24
33
  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
- }
34
+ import { createNoopTimer } from './utils/startup-timer';
35
+ import { resolveEncryptionKeyExpression, shouldEnableEncryption } from './server/action-encryption';
36
+ import { createHoldingServer } from './dev-tools/holding-server.js';
37
+ import { resolveStartPort, startDevServerPort } from './server/port-resolution.js';
38
+ import type { TimberUserConfig } from './config-types.js';
39
+ import type { PluginContext } from './plugin-context.js';
40
+ import {
41
+ createPluginContext,
42
+ loadTimberConfigFile,
43
+ mergeFileConfig,
44
+ resolveAppDir,
45
+ resolveClientJavascript,
46
+ resolveBuildDir,
47
+ DEFAULT_BUILD_DIR,
48
+ } from './plugin-context.js';
40
49
 
41
- /** Fully resolved client JavaScript configuration (no optionals). */
42
- export interface ResolvedClientJavascript {
43
- disabled: boolean;
44
- enableHMRInDev: boolean;
45
- }
50
+ // ── Public API ────────────────────────────────────────────────────────────
46
51
 
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
- * Override the app directory location. By default, timber auto-detects
112
- * `app/` at the project root, falling back to `src/app/`.
113
- *
114
- * Set this to a relative path from the project root (e.g. `'src/app'`)
115
- * to use a custom location.
116
- */
117
- appDir?: string;
118
- /** MDX compilation options passed to @mdx-js/rollup. See design/20-content-collections.md. */
119
- mdx?: {
120
- remarkPlugins?: unknown[];
121
- rehypePlugins?: unknown[];
122
- recmaPlugins?: unknown[];
123
- remarkRehypeOptions?: Record<string, unknown>;
124
- };
125
- /**
126
- * Built-in top-loader progress bar for client navigations.
127
- * Shows an animated bar at the top of the viewport during RSC navigations.
128
- * Enabled by default — set `enabled: false` to opt out.
129
- *
130
- * Users who want a fully custom progress indicator should disable this
131
- * and use `useNavigationPending()` directly.
132
- *
133
- * See LOCAL-336 for design decisions.
134
- */
135
- topLoader?: {
136
- /** Whether the top-loader is enabled. Default: true. */
137
- enabled?: boolean;
138
- /** Bar color. Default: '#2299DD'. */
139
- color?: string;
140
- /** Bar height in pixels. Default: 3. */
141
- height?: number;
142
- /** Show subtle glow/shadow effect. Default: true. */
143
- shadow?: boolean;
144
- /** Delay in ms before showing the bar (avoids flash on fast navs). Default: 0. */
145
- delay?: number;
146
- /** CSS z-index. Default: 1600. */
147
- zIndex?: number;
148
- };
149
- /**
150
- * Response-level caching and deduplication.
151
- *
152
- * When enabled, concurrent requests to the same URL share a single render
153
- * (singleflight), and recently rendered responses are reused from a short-TTL
154
- * LRU cache without re-executing the RSC-to-SSR pipeline.
155
- *
156
- * Set to `false` to disable entirely. Default: enabled with sensible defaults.
157
- *
158
- * See design/31-benchmarking.md for performance context.
159
- */
160
- responseCache?:
161
- | false
162
- | {
163
- /** Maximum number of entries in the LRU cache. Default: 150. */
164
- maxSize?: number;
165
- /** TTL for cached entries in milliseconds. Default: 5000 (5s). */
166
- ttlMs?: number;
167
- /**
168
- * When true (default), requests with Cookie or Authorization headers
169
- * bypass the cache entirely. This prevents sharing user-specific
170
- * responses across requests.
171
- *
172
- * Set to false to cache all responses regardless of auth state.
173
- * Only do this if your pages are truly public and don't vary by user.
174
- */
175
- publicOnly?: boolean;
176
- };
177
- }
52
+ export type { TimberUserConfig } from './config-types.js';
178
53
 
179
- /**
180
- * Resolve `clientJavascript` into a fully resolved config.
181
- */
182
- export function resolveClientJavascript(config: TimberUserConfig): ResolvedClientJavascript {
183
- if (config.clientJavascript !== undefined) {
184
- if (typeof config.clientJavascript === 'boolean') {
185
- // `clientJavascript: false` → disabled
186
- // `clientJavascript: true` → enabled (default)
187
- return {
188
- disabled: !config.clientJavascript,
189
- enableHMRInDev: !config.clientJavascript, // default true when disabled
190
- };
191
- }
192
- // Object form
193
- return {
194
- disabled: config.clientJavascript.disabled,
195
- enableHMRInDev: config.clientJavascript.enableHMRInDev ?? config.clientJavascript.disabled,
196
- };
197
- }
198
-
199
- // Default: client JS enabled
200
- return { disabled: false, enableHMRInDev: false };
201
- }
54
+ // Metadata route handler types — re-exported so user-authored metadata
55
+ // route files (sitemap.ts, robots.ts, manifest.ts, icon.tsx, etc.) can
56
+ // import them from the package root without reaching into ./server.
57
+ // The canonical location for these types is '@timber-js/app/server'; this
58
+ // root re-export is a convenience for typed metadata route handlers.
59
+ // See design/16-metadata.md §"Metadata Routes".
60
+ export type { Metadata, MetadataRoute, MetadataHandler, MetadataResult } from './server/types.js';
202
61
 
203
62
  /**
204
- * Shared context object passed to all sub-plugins via closure.
63
+ * Route map interface — augmented by the generated timber-routes.d.ts.
205
64
  *
206
- * Sub-plugins communicate through this context — not through Vite's
207
- * plugin API or global state.
208
- * See design/18-build-system.md §"Shared Plugin Context".
65
+ * Each key is a route path pattern. Values have:
66
+ * segmentParams: shape of URL segment params (e.g. { id: string })
67
+ * searchParams: parsed type from search-params.ts, or {} if none
68
+ *
69
+ * This interface is empty by default and populated via codegen.
70
+ * See design/09-typescript.md §"Typed Routes".
209
71
  */
210
- export interface PluginContext {
211
- config: TimberUserConfig;
212
- /** Resolved client JavaScript configuration */
213
- clientJavascript: ResolvedClientJavascript;
214
- /** The scanned route tree (populated by timber-routing, consumed by timber-entries) */
215
- routeTree: RouteTree | null;
216
- /** Absolute path to the app/ directory */
217
- appDir: string;
218
- /** Absolute path to the project root */
219
- root: string;
220
- /** Whether the dev server is running (set by timber-root-sync in configResolved) */
221
- dev: boolean;
222
- /** CSS build manifest (populated by adapter after client build, null in dev) */
223
- buildManifest: BuildManifest | null;
224
- /** Startup timer for profiling cold start phases (active in dev, no-op in prod) */
225
- timer: StartupTimer;
226
- }
72
+ // eslint-disable-next-line @typescript-eslint/no-empty-object-type
73
+ export interface Routes {}
227
74
 
228
75
  /**
229
- * Resolve the app directory. Checks (in order):
230
- * 1. Explicit `configAppDir` from timber.config.ts
231
- * 2. `<root>/app`
232
- * 3. `<root>/src/app`
76
+ * Type-safe helper for timber.config.ts files.
233
77
  *
234
- * Throws if none exist.
78
+ * A pass-through identity function that provides autocomplete and
79
+ * type checking for timber configuration. No runtime validation —
80
+ * purely a DX convenience (same pattern as Vite's defineConfig).
81
+ *
82
+ * @example
83
+ * ```ts
84
+ * // timber.config.ts
85
+ * import { defineConfig } from '@timber-js/app';
86
+ *
87
+ * export default defineConfig({
88
+ * output: 'server',
89
+ * pageExtensions: ['tsx', 'ts', 'mdx'],
90
+ * });
91
+ * ```
235
92
  */
236
- export function resolveAppDir(root: string, configAppDir?: string): string {
237
- if (configAppDir) {
238
- const explicit = join(root, configAppDir);
239
- if (!existsSync(explicit)) {
240
- throw new Error(`[timber] Configured appDir "${configAppDir}" does not exist at ${explicit}`);
241
- }
242
- return explicit;
243
- }
244
-
245
- const rootApp = join(root, 'app');
246
- if (existsSync(rootApp)) return rootApp;
247
-
248
- const srcApp = join(root, 'src', 'app');
249
- if (existsSync(srcApp)) return srcApp;
250
-
251
- throw new Error(
252
- `[timber] Could not find app directory. Expected "app/" or "src/app/" in ${root}. ` +
253
- `You can set appDir in timber.config.ts to specify a custom location.`
254
- );
93
+ export function defineConfig(config: TimberUserConfig): TimberUserConfig {
94
+ return config;
255
95
  }
256
96
 
257
- function createPluginContext(config?: TimberUserConfig, root?: string): PluginContext {
258
- const projectRoot = root ?? process.cwd();
259
- const resolvedConfig: TimberUserConfig = { output: 'server', ...config };
260
- // Timer starts as active — swapped to noop in configResolved for production builds
261
- return {
262
- config: resolvedConfig,
263
- clientJavascript: resolveClientJavascript(resolvedConfig),
264
- routeTree: null,
265
- appDir: join(projectRoot, 'app'),
266
- root: projectRoot,
267
- dev: false,
268
- buildManifest: null,
269
- timer: createStartupTimer(),
270
- };
271
- }
97
+ // ── Private helpers ───────────────────────────────────────────────────────
272
98
 
273
99
  /**
274
- * Load timber.config.ts (or .js, .mjs) from the project root.
275
- * Returns the config object or null if no config file is found.
276
- */
277
- async function loadTimberConfigFile(root: string): Promise<TimberUserConfig | null> {
278
- const configNames = ['timber.config.ts', 'timber.config.js', 'timber.config.mjs'];
279
-
280
- for (const name of configNames) {
281
- const configPath = join(root, name);
282
- if (existsSync(configPath)) {
283
- const mod = await import(pathToFileURL(configPath).href);
284
- return (mod.default ?? mod) as TimberUserConfig;
285
- }
286
- }
287
- return null;
288
- }
289
-
290
- /**
291
- * Detect config keys set in both inline (vite.config.ts) and file (timber.config.ts)
292
- * and warn the user. The `output` key is excluded because it defaults to 'server'
293
- * in createPluginContext and would always appear as an inline key.
100
+ * Resolve the React Compiler plugin via @rolldown/plugin-babel.
101
+ *
102
+ * Uses the `reactCompilerPreset` from @vitejs/plugin-react, which:
103
+ * - Uses Babel ONLY for the compiler pass (OXC handles JSX)
104
+ * - Automatically scopes to client environment via applyToEnvironmentHook
105
+ * - Uses react/compiler-runtime built into React 19
294
106
  *
295
- * Returns the list of conflicting key names (for testing).
107
+ * @rolldown/plugin-babel and babel-plugin-react-compiler are optional peer deps.
108
+ * If either is missing, require() fails with a clear error message.
296
109
  */
297
- export function warnConfigConflicts(
298
- inline: TimberUserConfig,
299
- fileConfig: TimberUserConfig
300
- ): string[] {
301
- const conflicts: string[] = [];
302
- for (const key of Object.keys(fileConfig) as (keyof TimberUserConfig)[]) {
303
- if (key === 'output') continue;
304
- if (key in inline && inline[key] !== undefined) {
305
- conflicts.push(key);
306
- }
307
- }
308
- if (conflicts.length > 0) {
309
- console.warn(
310
- `[timber] Config conflict: ${conflicts.map((k) => `"${k}"`).join(', ')} set in both ` +
311
- `vite.config.ts (inline) and timber.config.ts. ` +
312
- `Move all config to timber.config.ts to avoid confusion. ` +
313
- `The inline value from vite.config.ts will be used.`
110
+ function resolveReactCompilerPlugin(
111
+ config: true | { compilationMode?: string; target?: string },
112
+ req: NodeJS.Require
113
+ ): PluginOption {
114
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
115
+ let babel: any;
116
+ try {
117
+ babel = req('@rolldown/plugin-babel');
118
+ } catch {
119
+ throw new Error(
120
+ '[timber] reactCompiler requires @rolldown/plugin-babel. ' +
121
+ 'Install it: pnpm add -D @rolldown/plugin-babel babel-plugin-react-compiler'
314
122
  );
315
123
  }
316
- return conflicts;
124
+ const options = typeof config === 'object' ? config : {};
125
+ const babelPlugin = babel.default ?? babel;
126
+ return babelPlugin({
127
+ presets: [reactCompilerPreset(options as Parameters<typeof reactCompilerPreset>[0])],
128
+ }) as PluginOption;
317
129
  }
318
130
 
319
131
  /**
320
- * Merge file-based config into ctx.config. Inline config (already in ctx.config)
321
- * takes precedence — file config only fills in missing fields.
132
+ * Build the options object for @vitejs/plugin-rsc.
133
+ *
134
+ * Uses a getter for `enableActionEncryption` so the RSC plugin reads
135
+ * the value lazily — after ctx.dev is set in configResolved. This lets
136
+ * `actionEncryption.disableInDev` work correctly even though the RSC
137
+ * plugin is created before Vite resolves the command.
322
138
  */
323
- function mergeFileConfig(ctx: PluginContext, fileConfig: TimberUserConfig): void {
324
- const inline = ctx.config;
325
-
326
- // Warn if the same key is set in both places
327
- warnConfigConflicts(inline, fileConfig);
328
-
329
- // For each top-level key, use inline value if present, otherwise file value
330
- ctx.config = {
331
- ...fileConfig,
332
- ...inline,
333
- // Deep merge for nested objects where both exist
334
- ...(fileConfig.limits && inline.limits
335
- ? { limits: { ...fileConfig.limits, ...inline.limits } }
336
- : {}),
337
- ...(fileConfig.dev && inline.dev ? { dev: { ...fileConfig.dev, ...inline.dev } } : {}),
338
- ...(fileConfig.mdx && inline.mdx ? { mdx: { ...fileConfig.mdx, ...inline.mdx } } : {}),
139
+ function createRscOptions(
140
+ ctx: PluginContext,
141
+ encryptionKeyExpr: string | undefined
142
+ ): Record<string, unknown> {
143
+ const options: Record<string, unknown> = {
144
+ serverHandler: false,
145
+ customClientEntry: true,
146
+ entries: {
147
+ rsc: 'virtual:timber-rsc-entry',
148
+ ssr: 'virtual:timber-ssr-entry',
149
+ client: 'virtual:timber-browser-entry',
150
+ },
151
+ // Group client references by layout boundary to balance route-scoped code
152
+ // splitting with HTTP request count. A constant group name ('client-refs')
153
+ // would collapse all routes into one chunk — any page downloads every
154
+ // client component. Per-serverChunk grouping creates many sub-500B files.
155
+ // Layout-boundary grouping is the middle ground: components under the same
156
+ // layout segment share a chunk. See design/27-chunking-strategy.md, TIM-440, TIM-499.
157
+ clientChunks: (meta: { id: string; normalizedId: string; serverChunk: string }) =>
158
+ clientChunkGroup(meta, ctx.appDir),
339
159
  };
340
- }
341
160
 
342
- function timberCache(_ctx: PluginContext): Plugin {
343
- return cacheTransformPlugin();
161
+ // Bound args encryption — AES-256-GCM authenticated encryption for
162
+ // closure variables in 'use server' functions. Always on in production,
163
+ // configurable in dev. See design/08-forms-and-actions.md §"Bound Args Encryption".
164
+ //
165
+ // Uses a getter so the RSC plugin reads the value lazily in its transform
166
+ // hooks, after ctx.dev is set in configResolved. This lets disableInDev
167
+ // work correctly — ctx.dev is false at construction time but true during
168
+ // dev server transforms.
169
+ Object.defineProperty(options, 'enableActionEncryption', {
170
+ get() {
171
+ return shouldEnableEncryption(ctx.dev, ctx.config.actionEncryption);
172
+ },
173
+ enumerable: true,
174
+ });
175
+
176
+ // When TIMBER_ACTIONS_ENCRYPTION_KEY is set, pass it as a runtime expression
177
+ // so the RSC plugin uses it instead of auto-generating a per-build key.
178
+ if (encryptionKeyExpr) {
179
+ options.defineEncryptionKey = encryptionKeyExpr;
180
+ }
181
+
182
+ return options;
344
183
  }
345
184
 
185
+ // NOTE: 'use cache' directive transform removed — future feature pending design doc.
186
+ // The timber.cache() API (createCache) remains available for explicit caching.
187
+ // See design/06-caching.md.
188
+
189
+ // ── Main plugin factory ──────────────────────────────────────────────────
190
+
191
+ /**
192
+ * Create the timber Vite plugin array.
193
+ *
194
+ * Loads timber.config.ts and all dependencies synchronously before
195
+ * constructing the plugin array. This ensures ALL plugins — including
196
+ * the RSC plugin and React Compiler — see the fully merged config
197
+ * (inline + file-based). No async, no deferred config, no stale reads.
198
+ *
199
+ * Requires Node >= 22.12 for synchronous require() of ESM modules
200
+ * (@vitejs/plugin-rsc is ESM-only).
201
+ *
202
+ * Previous versions used async loading and deferred config merging,
203
+ * causing file-based config for reactCompiler, actionEncryption, and
204
+ * output mode to be silently ignored. See TIM-451.
205
+ */
346
206
  export function timber(config?: TimberUserConfig): PluginOption[] {
347
207
  const ctx = createPluginContext(config);
348
- // Sync ctx.root and ctx.appDir with Vite's resolved root, which may
349
- // differ from process.cwd() when --config points to a subdirectory.
350
- // Also loads timber.config.ts and merges it into ctx.config (inline config wins).
208
+
209
+ // Resolve dependencies from the consumer's project (process.cwd()),
210
+ // not from timber's own node_modules. This is critical for pnpm link:
211
+ // when linked, timber's node_modules has a separate vite instance, and
212
+ // the RSC plugin must use the same vite instance as the dev server.
213
+ const consumerRequire = createRequire(join(process.cwd(), 'package.json'));
214
+
215
+ // ── Step 1: Load @vitejs/plugin-rsc ─────────────────────────────────
216
+ // Synchronous require() works for ESM modules on Node 22.12+.
217
+ ctx.timer.start('rsc-plugin-import');
218
+ const rscMod = consumerRequire('@vitejs/plugin-rsc');
219
+ const vitePluginRsc = rscMod.default ?? rscMod;
220
+ ctx.timer.end('rsc-plugin-import');
221
+
222
+ // ── Step 2: Compute config-dependent options ────────────────────────
223
+ // encryptionKeyExpr is env-based and doesn't depend on file config.
224
+ const encryptionKeyExpr = resolveEncryptionKeyExpression();
225
+
226
+ // ── Step 3: Pre-load file config for plugin resolution ──────────────
227
+ // Load timber.config.ts eagerly from process.cwd() so we can resolve
228
+ // plugins (like React Compiler) and add them to the top-level array.
229
+ // Vite's config() hook return type is Omit<UserConfig, 'plugins'> —
230
+ // plugins returned from config() are silently ignored. See TIM-632.
231
+ //
232
+ // The config() hook still loads from the correct Vite root (which may
233
+ // differ from cwd in monorepo setups — see TIM-498), but only for
234
+ // non-plugin config merging.
235
+ const earlyFileConfig = loadTimberConfigFile(process.cwd());
236
+
237
+ // ── Step 4: Build rootSync plugin ───────────────────────────────────
238
+ // rootSync loads timber.config.ts from Vite's resolved root and merges
239
+ // it into ctx.config. Plugin resolution is handled eagerly above — the
240
+ // config() hook must NOT return a `plugins` field (Vite ignores it).
351
241
  const rootSync: Plugin = {
352
242
  name: 'timber-root-sync',
353
- async config(userConfig, { command }) {
354
- // Load timber.config.ts early — before configResolved/buildStart — so
355
- // all plugins (including timber-mdx) see the merged config in their
356
- // buildStart hooks. The config hook runs once and supports async.
357
- const root = userConfig.root ?? process.cwd();
243
+ async config(userConfig, { command, isPreview }) {
244
+ // ── Load timber.config.ts from the correct root ───────────────
245
+ // Vite's `config` hook fires before `configResolved`. The user's
246
+ // `root` option (if set) tells us where the project lives.
247
+ // `resolve()` mirrors Vite's own root resolution logic.
248
+ const viteRoot = resolve(userConfig.root ?? process.cwd());
358
249
  ctx.timer.start('config-load');
359
- const fileConfig = await loadTimberConfigFile(root);
250
+ const fileConfig = loadTimberConfigFile(viteRoot);
360
251
  if (fileConfig) {
361
252
  mergeFileConfig(ctx, fileConfig);
362
253
  ctx.clientJavascript = resolveClientJavascript(ctx.config);
363
254
  }
255
+ // Apply defaults AFTER merge so file-based config isn't overridden
256
+ // by defaults that were baked into the inline config object.
257
+ ctx.config.output ??= 'server';
364
258
  ctx.timer.end('config-load');
365
259
 
260
+ // ── Resolve build output directory ─────────────────────────
261
+ // Priority: timber.config.ts `buildDir` > Vite `build.outDir` > .timber/dist
262
+ // Set Vite's build.outDir so the RSC plugin and all environment
263
+ // builds write to the correct location.
264
+ const viteOutDir = userConfig.build?.outDir;
265
+ const timberBuildDir = ctx.config.buildDir;
266
+ const resolvedRoot = resolve(userConfig.root ?? process.cwd());
267
+ ctx.buildDir = resolveBuildDir(resolvedRoot, timberBuildDir, viteOutDir);
268
+
269
+ // Warn if the Vite root differs from cwd and the re-loaded config
270
+ // has reactCompiler but the early cwd-based load missed it. In this
271
+ // edge case the user must move reactCompiler to inline config.
272
+ if (viteRoot !== process.cwd()) {
273
+ const hasCompilerInReloaded = !config?.reactCompiler && ctx.config.reactCompiler;
274
+ const hadCompilerInEarly = !config?.reactCompiler && earlyFileConfig?.reactCompiler;
275
+ if (hasCompilerInReloaded && !hadCompilerInEarly) {
276
+ console.warn(
277
+ '[timber] reactCompiler is set in timber.config.ts but could not be ' +
278
+ 'registered because the config file is in a non-cwd root directory. ' +
279
+ 'Move reactCompiler to the inline timber() config in vite.config.ts, or ' +
280
+ 'run vite from the project root directory.'
281
+ );
282
+ }
283
+ }
284
+
366
285
  // Force production JSX transform for builds.
367
286
  //
368
287
  // Vite determines dev vs prod JSX via `isProduction`, which checks
@@ -376,8 +295,102 @@ export function timber(config?: TimberUserConfig): PluginOption[] {
376
295
  // We explicitly set `oxc.jsx.development: false` for builds so
377
296
  // the client bundle always uses jsx/jsxs from react/jsx-runtime,
378
297
  // regardless of the ambient NODE_ENV value.
298
+ // ── Resolve dev/preview port (TIM-842) ───────────────────────
299
+ // Default port is 3000 with auto-bump on conflict. Explicit user
300
+ // overrides (`--port`, `PORT` env, `vite.config.ts` server.port)
301
+ // are honored as-is and fail loudly via `strictPort: true`.
302
+ //
303
+ // For dev (`command === 'serve' && !isPreview`) we start the
304
+ // holding server and use its `listen()` as the probe, pairing
305
+ // the probe with the real bind to eliminate TOCTOU races.
306
+ //
307
+ // For `vite preview` (`command === 'serve' && isPreview`) we
308
+ // resolve the config/env port but delegate the actual bind +
309
+ // auto-bump to Vite's own preview server. Starting the holding
310
+ // server in preview mode would self-conflict because the dev
311
+ // plugin's `configureServer` handoff does not run for preview;
312
+ // the holding server would keep the port occupied while Vite's
313
+ // preview tried to bind the same port.
314
+ //
315
+ // See design/21-dev-server.md §"Default Port and Auto-Bump".
316
+ let resolvedDevPort: number | null = null;
317
+ let resolvedDevPortExplicit = false;
318
+ if (command === 'serve' && !isPreview) {
319
+ ctx.holdingServer = createHoldingServer();
320
+ const holdingRef = ctx.holdingServer;
321
+ const result = await startDevServerPort({
322
+ configPort:
323
+ typeof userConfig.server?.port === 'number' ? userConfig.server.port : undefined,
324
+ envPort: process.env.PORT,
325
+ listen: (p) => holdingRef.listen(p),
326
+ });
327
+ resolvedDevPort = result.port;
328
+ resolvedDevPortExplicit = result.explicit;
329
+ if (!result.bound) {
330
+ // Holding server failed to bind. Drop the reference so the
331
+ // dev-server plugin doesn't try to close a server that was
332
+ // never listening, and let Vite surface the conflict.
333
+ ctx.holdingServer = null;
334
+ }
335
+ } else if (command === 'serve' && isPreview) {
336
+ // Preview mode: resolve the starting port from config/env/
337
+ // default but do NOT probe. Vite's preview server handles the
338
+ // bind itself, with `preview.strictPort` controlling whether
339
+ // an in-use port auto-bumps (implicit) or errors (explicit).
340
+ const previewConfigPort =
341
+ typeof userConfig.preview?.port === 'number'
342
+ ? userConfig.preview.port
343
+ : typeof userConfig.server?.port === 'number'
344
+ ? userConfig.server.port
345
+ : undefined;
346
+ const start = resolveStartPort({
347
+ configPort: previewConfigPort,
348
+ envPort: process.env.PORT,
349
+ });
350
+ resolvedDevPort = start.port;
351
+ resolvedDevPortExplicit = start.explicit;
352
+ }
353
+
354
+ // Return the resolved buildDir as Vite's build.outDir so the RSC
355
+ // plugin and all environment builds write to the correct location.
356
+ // This is always set — either from timber config, Vite config, or default.
357
+ const buildOutDir = timberBuildDir
358
+ ? timberBuildDir
359
+ : viteOutDir && viteOutDir !== 'dist'
360
+ ? viteOutDir
361
+ : DEFAULT_BUILD_DIR;
362
+
363
+ // Set per-environment build.outDir so Vite's RSC plugin writes
364
+ // each environment to the correct subdirectory under our buildDir.
365
+ // Without this, the RSC plugin defaults to dist/<envName> instead
366
+ // of <buildOutDir>/<envName>.
367
+ const envOutDirs: Record<string, { build: { outDir: string } }> = {};
368
+ for (const envName of ['rsc', 'ssr', 'client']) {
369
+ envOutDirs[envName] = { build: { outDir: join(buildOutDir, envName) } };
370
+ }
371
+
372
+ // Exclude @timber-js/app packages from the dep optimizer.
373
+ // The shims plugin intercepts @timber-js/app/* imports per-environment
374
+ // (e.g. replacing @timber-js/app/server with a stub in the client env).
375
+ // The dep optimizer runs before per-environment resolution, so it would
376
+ // pre-bundle @timber-js/app/cookies with the real server code inlined,
377
+ // pulling AsyncLocalStorage into the browser bundle.
378
+ const timberOptimizeDepsExclude = [
379
+ '@timber-js/app',
380
+ '@timber-js/app/server',
381
+ '@timber-js/app/client',
382
+ '@timber-js/app/cookies',
383
+ '@timber-js/app/cache',
384
+ '@timber-js/app/search-params',
385
+ '@timber-js/app/segment-params',
386
+ '@timber-js/app/codec',
387
+ ];
388
+
379
389
  if (command === 'build') {
380
390
  return {
391
+ build: { outDir: buildOutDir },
392
+ environments: envOutDirs,
393
+ optimizeDeps: { exclude: timberOptimizeDepsExclude },
381
394
  oxc: {
382
395
  jsx: {
383
396
  development: false,
@@ -385,11 +398,60 @@ export function timber(config?: TimberUserConfig): PluginOption[] {
385
398
  },
386
399
  };
387
400
  }
401
+
402
+ // Dev/preview mode: set outDir so dev-time references are
403
+ // consistent, and surface the resolved port to Vite.
404
+ //
405
+ // For dev, we set strictPort: true so Vite uses exactly the port
406
+ // the holding server probed for — without strictPort, Vite would
407
+ // run its own auto-bump starting from `port`, which would skip
408
+ // straight past whatever holding-server-bumped port we picked.
409
+ //
410
+ // For `vite preview`, we set `preview.strictPort` based on
411
+ // whether the user explicitly set the port. Implicit (default)
412
+ // preview uses strictPort: false so Vite's preview server can
413
+ // auto-bump from 3000. Explicit preview uses strictPort: true
414
+ // so conflicts fail loudly, matching the dev behavior and the
415
+ // TIM-842 spec.
416
+ const serverConfig: { port?: number; strictPort?: boolean } = {};
417
+ const previewConfig: { port?: number; strictPort?: boolean } = {};
418
+ if (resolvedDevPort != null) {
419
+ if (!isPreview) {
420
+ serverConfig.port = resolvedDevPort;
421
+ serverConfig.strictPort = true;
422
+ }
423
+ previewConfig.port = resolvedDevPort;
424
+ previewConfig.strictPort = resolvedDevPortExplicit;
425
+ }
426
+ return {
427
+ build: { outDir: buildOutDir },
428
+ environments: envOutDirs,
429
+ optimizeDeps: { exclude: timberOptimizeDepsExclude },
430
+ server: serverConfig,
431
+ preview: previewConfig,
432
+ };
388
433
  },
389
434
  configResolved(resolved) {
390
435
  ctx.root = resolved.root;
391
436
  ctx.appDir = resolveAppDir(resolved.root, ctx.config.appDir);
392
437
  ctx.dev = resolved.command === 'serve';
438
+
439
+ // Register all timber config file candidates as Vite config file
440
+ // dependencies so Vite's built-in restart-on-change handles them
441
+ // (including atomic writes that emit unlink+add instead of change).
442
+ // All candidates are registered — not just the one that exists — so
443
+ // that creating a config file after server start also triggers a
444
+ // restart. The watcher.add() call in dev-server.ts ensures all
445
+ // candidates are in the watch set.
446
+ // See design/21-dev-server.md §HMR Wiring.
447
+ const configNames = ['timber.config.ts', 'timber.config.js', 'timber.config.mjs'];
448
+ for (const name of configNames) {
449
+ resolved.configFileDependencies.push(resolve(resolved.root, name));
450
+ }
451
+
452
+ // Sync buildDir from Vite's resolved build.outDir. Vite keeps
453
+ // outDir as-is (may be relative), so resolve against root.
454
+ ctx.buildDir = resolve(resolved.root, resolved.build.outDir);
393
455
  // In production builds, swap to a no-op timer to avoid overhead
394
456
  if (!ctx.dev) {
395
457
  ctx.timer = createNoopTimer();
@@ -397,19 +459,47 @@ export function timber(config?: TimberUserConfig): PluginOption[] {
397
459
  // Start the overall dev server setup timer — ends in timber-dev-server
398
460
  ctx.timer.start('dev-server-setup');
399
461
  }
462
+
463
+ // Validate config and check peer dependencies at startup.
464
+ // Errors are logged to stderr but don't block startup — Vite may
465
+ // still work partially, and the errors guide the user to fix things.
466
+ const { validateConfig, formatConfigErrors, checkPeerDependencies, formatMissingPeers } =
467
+ require('./config-validation.js') as typeof import('./config-validation.js');
468
+
469
+ const configErrors = validateConfig(ctx.config);
470
+ if (configErrors.length > 0) {
471
+ process.stderr.write(`${formatConfigErrors(configErrors)}\n\n`);
472
+ }
473
+
474
+ const peerResults = checkPeerDependencies(ctx.root);
475
+ const peerWarning = formatMissingPeers(peerResults);
476
+ if (peerWarning) {
477
+ process.stderr.write(`${peerWarning}\n\n`);
478
+ }
400
479
  },
401
480
  };
481
+
482
+ // ── Step 5: Resolve optional plugins ────────────────────────────────
483
+ // React Compiler — resolved eagerly from either inline or file config.
484
+ // Vite's config() hook return type is Omit<UserConfig, 'plugins'>, so
485
+ // plugins MUST be in the top-level array — returning them from config()
486
+ // silently drops them. See TIM-632.
487
+ //
488
+ // Inline config takes precedence. File config (from the early cwd-based
489
+ // load) is used when inline config doesn't set reactCompiler.
490
+ const reactCompilerPlugins: PluginOption[] = [];
491
+ const effectiveReactCompiler = config?.reactCompiler ?? earlyFileConfig?.reactCompiler;
492
+ if (effectiveReactCompiler) {
493
+ reactCompilerPlugins.push(resolveReactCompilerPlugin(effectiveReactCompiler, consumerRequire));
494
+ }
495
+
496
+ // ── Step 6: Assemble plugin array ─────────────────────────────────────
402
497
  // @vitejs/plugin-rsc handles:
403
498
  // - RSC/SSR/client environment setup
404
499
  // - "use client" directive → client reference proxy transformation
405
500
  // - "use server" directive → server reference transformation
406
501
  // - Client reference tracking and module map generation
407
502
  //
408
- // Loaded via dynamic import() because @vitejs/plugin-rsc is ESM-only.
409
- // Vite's config loader uses esbuild to transpile to CJS, which breaks
410
- // static imports of ESM-only packages. The dynamic import() is preserved
411
- // by esbuild and runs natively in ESM at runtime.
412
- //
413
503
  // serverHandler: false — timber has its own dev server (timber-dev-server)
414
504
  // entries — tells the RSC plugin about timber's virtual entry modules so
415
505
  // it correctly wires up the browser entry (needed for React Fast Refresh
@@ -422,30 +512,6 @@ export function timber(config?: TimberUserConfig): PluginOption[] {
422
512
  // We do NOT set customBuildApp — the RSC plugin's orchestration is correct
423
513
  // and handles bundle ordering, asset manifest generation, and environment
424
514
  // imports manifest. See @vitejs/plugin-rsc's buildApp implementation.
425
- // Resolve @vitejs/plugin-rsc from the consumer's project (process.cwd()),
426
- // not from timber's own node_modules. This is critical for pnpm link:
427
- // when linked, timber's node_modules has a separate vite instance, and
428
- // the RSC plugin must use the same vite instance as the dev server.
429
- const consumerRequire = createRequire(join(process.cwd(), 'package.json'));
430
- const rscPluginPath = consumerRequire.resolve('@vitejs/plugin-rsc');
431
- ctx.timer.start('rsc-plugin-import');
432
- const rscPluginsPromise = import(pathToFileURL(rscPluginPath).href).then(
433
- ({ default: vitePluginRsc }) => {
434
- ctx.timer.end('rsc-plugin-import');
435
- return vitePluginRsc({
436
- serverHandler: false,
437
- customClientEntry: true,
438
- entries: {
439
- rsc: 'virtual:timber-rsc-entry',
440
- ssr: 'virtual:timber-ssr-entry',
441
- client: 'virtual:timber-browser-entry',
442
- },
443
- // No custom clientChunks — Rolldown handles natural code splitting.
444
- // See design/27-chunking-strategy.md and LOCAL-337.
445
- });
446
- }
447
- );
448
-
449
515
  return [
450
516
  rootSync,
451
517
  timberReactProd(),
@@ -454,15 +520,13 @@ export function timber(config?: TimberUserConfig): PluginOption[] {
454
520
  // following Vinext's convention — the RSC plugin's virtual browser entry
455
521
  // coordinates with plugin-react via __vite_plugin_react_preamble_installed__.
456
522
  react(),
457
- timberServerActionExports(),
458
- rscPluginsPromise,
523
+ ...reactCompilerPlugins,
524
+ vitePluginRsc(createRscOptions(ctx, encryptionKeyExpr)),
459
525
  timberShims(ctx),
460
526
  timberRouting(ctx),
461
527
  timberEntries(ctx),
462
528
  timberBuildManifest(ctx),
463
- timberCache(ctx),
464
529
  timberStaticBuild(ctx),
465
- timberDynamicTransform(ctx),
466
530
  timberFonts(ctx),
467
531
  timberMdx(ctx),
468
532
  timberContent(ctx),
@@ -471,21 +535,9 @@ export function timber(config?: TimberUserConfig): PluginOption[] {
471
535
  timberBuildReport(ctx), // Post-build: route table with bundle sizes
472
536
  timberAdapterBuild(ctx), // Post-build: invoke adapter.buildOutput()
473
537
  timberDevLogs(ctx), // Dev-only: forward server console.* to browser console
538
+ timberDevBrowserLogs(ctx), // Dev-only: forward browser console.* to server terminal
474
539
  timberDevServer(ctx), // Must be last — configureServer post-hook runs after all watchers
475
540
  ];
476
541
  }
477
542
 
478
- /**
479
- * Route map interface — augmented by the generated timber-routes.d.ts.
480
- *
481
- * Each key is a route path pattern. Values have:
482
- * params: shape of URL params (e.g. { id: string })
483
- * searchParams: parsed type from search-params.ts, or {} if none
484
- *
485
- * This interface is empty by default and populated via codegen.
486
- * See design/09-typescript.md §"Typed Routes".
487
- */
488
- // eslint-disable-next-line @typescript-eslint/no-empty-object-type
489
- export interface Routes {}
490
-
491
543
  export default timber;