@timber-js/app 0.2.0-alpha.185 → 0.2.0-alpha.187

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 (570) hide show
  1. package/dist/_chunks/{actions-O_LsyCE4.js → actions-35jnMdeJ.js} +4 -3
  2. package/dist/_chunks/{actions-O_LsyCE4.js.map → actions-35jnMdeJ.js.map} +1 -1
  3. package/dist/_chunks/als-registry-C6kcfprT.js +41 -0
  4. package/dist/_chunks/als-registry-C6kcfprT.js.map +1 -0
  5. package/dist/_chunks/als-slots-BEEIPKYm.js +26 -0
  6. package/dist/_chunks/als-slots-BEEIPKYm.js.map +1 -0
  7. package/dist/_chunks/base-path-DaQrzbez.js +80 -0
  8. package/dist/_chunks/base-path-DaQrzbez.js.map +1 -0
  9. package/dist/_chunks/build-manifest-DWppEdLB.js +86 -0
  10. package/dist/_chunks/build-manifest-DWppEdLB.js.map +1 -0
  11. package/dist/_chunks/build-output-helper-C3DrfzZR.js +369 -0
  12. package/dist/_chunks/build-output-helper-C3DrfzZR.js.map +1 -0
  13. package/dist/_chunks/{cache-api-B-lhk9p4.js → cache-api-DjNrIWRR.js} +8 -14
  14. package/dist/_chunks/cache-api-DjNrIWRR.js.map +1 -0
  15. package/dist/_chunks/cli-check-CpmN7Nh-.js +256 -0
  16. package/dist/_chunks/cli-check-CpmN7Nh-.js.map +1 -0
  17. package/dist/_chunks/cli-schema-sync-CGMp_Psg.js +298 -0
  18. package/dist/_chunks/cli-schema-sync-CGMp_Psg.js.map +1 -0
  19. package/dist/_chunks/{cloudflare-CnT5Lr7U.js → cloudflare-CGP6BZKO.js} +92 -14
  20. package/dist/_chunks/{cloudflare-CnT5Lr7U.js.map → cloudflare-CGP6BZKO.js.map} +1 -1
  21. package/dist/_chunks/convention-lint-kXsgc_-7.js +784 -0
  22. package/dist/_chunks/convention-lint-kXsgc_-7.js.map +1 -0
  23. package/dist/_chunks/error-boundary-D-ODYX41.js +353 -0
  24. package/dist/_chunks/error-boundary-D-ODYX41.js.map +1 -0
  25. package/dist/_chunks/{fast-hash-D6hIVt1Y.js → fast-hash-C-tVYrLb.js} +6 -1
  26. package/dist/_chunks/fast-hash-C-tVYrLb.js.map +1 -0
  27. package/dist/_chunks/file-cache-DmX7OqZP.js +454 -0
  28. package/dist/_chunks/file-cache-DmX7OqZP.js.map +1 -0
  29. package/dist/_chunks/fs-identity-D7vb6GdI.js +208 -0
  30. package/dist/_chunks/fs-identity-D7vb6GdI.js.map +1 -0
  31. package/dist/_chunks/{logger-AWfuX-KJ.js → logger-D8xJZXIN.js} +34 -51
  32. package/dist/_chunks/logger-D8xJZXIN.js.map +1 -0
  33. package/dist/_chunks/mdx-file-C005ay-P.js +25 -0
  34. package/dist/_chunks/mdx-file-C005ay-P.js.map +1 -0
  35. package/dist/_chunks/{plugin-context---kTF5v8.js → plugin-context-rCinWLiE.js} +8 -2
  36. package/dist/_chunks/plugin-context-rCinWLiE.js.map +1 -0
  37. package/dist/_chunks/purge-store-Byr8XOjU.js +14 -0
  38. package/dist/_chunks/purge-store-Byr8XOjU.js.map +1 -0
  39. package/dist/_chunks/{resolve-schema-Dz3fcFUo.js → resolve-schema-5ma5pp1b.js} +2 -2
  40. package/dist/_chunks/{resolve-schema-Dz3fcFUo.js.map → resolve-schema-5ma5pp1b.js.map} +1 -1
  41. package/dist/_chunks/{router-ref-CtmF-aPv.js → router-ref-DuYuV_0Q.js} +2 -2
  42. package/dist/_chunks/router-ref-DuYuV_0Q.js.map +1 -0
  43. package/dist/_chunks/rsc-cache-key-DD0fl_-s.js +243 -0
  44. package/dist/_chunks/rsc-cache-key-DD0fl_-s.js.map +1 -0
  45. package/dist/_chunks/rsc-error-envelope-tT5PJs4q.js +40 -0
  46. package/dist/_chunks/rsc-error-envelope-tT5PJs4q.js.map +1 -0
  47. package/dist/_chunks/rsc-media-type-DRqE_lD_.js +46 -0
  48. package/dist/_chunks/rsc-media-type-DRqE_lD_.js.map +1 -0
  49. package/dist/_chunks/rsc-payload-path-B_LBodc2.js +48 -0
  50. package/dist/_chunks/rsc-payload-path-B_LBodc2.js.map +1 -0
  51. package/dist/_chunks/scanner-C8b0Gcw3.js +1564 -0
  52. package/dist/_chunks/scanner-C8b0Gcw3.js.map +1 -0
  53. package/dist/_chunks/schema-bridge-Cc2Gngu1.js +199 -0
  54. package/dist/_chunks/schema-bridge-Cc2Gngu1.js.map +1 -0
  55. package/dist/_chunks/{segment-classify-Byy425ng.js → segment-classify-C539Pa2O.js} +23 -2
  56. package/dist/_chunks/segment-classify-C539Pa2O.js.map +1 -0
  57. package/dist/_chunks/segment-context-CjOlyB8Y.js +97 -0
  58. package/dist/_chunks/segment-context-CjOlyB8Y.js.map +1 -0
  59. package/dist/_chunks/{canonicalize-DQHyFClh.js → segment-keys-BawYuNFO.js} +61 -2
  60. package/dist/_chunks/segment-keys-BawYuNFO.js.map +1 -0
  61. package/dist/_chunks/slot-params-BCTmZkQB.js +76 -0
  62. package/dist/_chunks/slot-params-BCTmZkQB.js.map +1 -0
  63. package/dist/_chunks/{ssr-data-BOWsq18U.js → ssr-data-14MXm7Pj.js} +17 -2
  64. package/dist/_chunks/ssr-data-14MXm7Pj.js.map +1 -0
  65. package/dist/_chunks/{use-query-states-DFvWd-EA.js → use-query-states-BbU5Ge1V.js} +74 -26
  66. package/dist/_chunks/use-query-states-BbU5Ge1V.js.map +1 -0
  67. package/dist/_chunks/use-segment-params-C4r4BD9T.js +398 -0
  68. package/dist/_chunks/use-segment-params-C4r4BD9T.js.map +1 -0
  69. package/dist/_chunks/walkers-RzN6AFjr.js +141 -0
  70. package/dist/_chunks/walkers-RzN6AFjr.js.map +1 -0
  71. package/dist/adapters/build-output-helper.d.ts +37 -0
  72. package/dist/adapters/build-output-helper.d.ts.map +1 -1
  73. package/dist/adapters/cloudflare-dev.js +1 -1
  74. package/dist/adapters/cloudflare-kv-cache.js +1 -1
  75. package/dist/adapters/cloudflare.d.ts.map +1 -1
  76. package/dist/adapters/cloudflare.js +1 -1
  77. package/dist/adapters/compress-module.d.ts +12 -0
  78. package/dist/adapters/compress-module.d.ts.map +1 -1
  79. package/dist/adapters/fs-identity.d.ts +64 -0
  80. package/dist/adapters/fs-identity.d.ts.map +1 -0
  81. package/dist/adapters/nitro.d.ts.map +1 -1
  82. package/dist/adapters/nitro.js +56 -5
  83. package/dist/adapters/nitro.js.map +1 -1
  84. package/dist/adapters/shared.d.ts +57 -1
  85. package/dist/adapters/shared.d.ts.map +1 -1
  86. package/dist/adapters/types.d.ts +13 -1
  87. package/dist/adapters/types.d.ts.map +1 -1
  88. package/dist/cache/fast-hash.d.ts +5 -0
  89. package/dist/cache/fast-hash.d.ts.map +1 -1
  90. package/dist/cache/index.js +1 -1
  91. package/dist/cdn/cloudflare-purge.js +30 -0
  92. package/dist/cdn/cloudflare-purge.js.map +1 -0
  93. package/dist/cdn/fastly-purge.js +33 -0
  94. package/dist/cdn/fastly-purge.js.map +1 -0
  95. package/dist/cdn/index.js +94 -0
  96. package/dist/cdn/index.js.map +1 -0
  97. package/dist/cdn/workers-cache-purge.js +35 -0
  98. package/dist/cdn/workers-cache-purge.js.map +1 -0
  99. package/dist/cli-check.d.ts +153 -0
  100. package/dist/cli-check.d.ts.map +1 -0
  101. package/dist/cli.d.ts +34 -8
  102. package/dist/cli.d.ts.map +1 -1
  103. package/dist/cli.js +46 -21
  104. package/dist/cli.js.map +1 -1
  105. package/dist/client/browser-entry/action-dispatch.d.ts.map +1 -1
  106. package/dist/client/browser-entry/hydrate.d.ts +20 -9
  107. package/dist/client/browser-entry/hydrate.d.ts.map +1 -1
  108. package/dist/client/browser-entry/index.d.ts +1 -1
  109. package/dist/client/browser-entry/index.d.ts.map +1 -1
  110. package/dist/client/browser-entry/post-hydration.d.ts +4 -1
  111. package/dist/client/browser-entry/post-hydration.d.ts.map +1 -1
  112. package/dist/client/browser-entry/router-init.d.ts +3 -0
  113. package/dist/client/browser-entry/router-init.d.ts.map +1 -1
  114. package/dist/client/browser-entry/rsc-stream.d.ts +8 -0
  115. package/dist/client/browser-entry/rsc-stream.d.ts.map +1 -1
  116. package/dist/client/error-boundary.d.ts +7 -0
  117. package/dist/client/error-boundary.d.ts.map +1 -1
  118. package/dist/client/error-boundary.js +1 -162
  119. package/dist/client/history.d.ts +13 -6
  120. package/dist/client/history.d.ts.map +1 -1
  121. package/dist/client/index.d.ts +1 -0
  122. package/dist/client/index.d.ts.map +1 -1
  123. package/dist/client/index.js +42 -41
  124. package/dist/client/index.js.map +1 -1
  125. package/dist/client/internal.d.ts +4 -3
  126. package/dist/client/internal.d.ts.map +1 -1
  127. package/dist/client/internal.js +877 -311
  128. package/dist/client/internal.js.map +1 -1
  129. package/dist/client/link.d.ts +1 -7
  130. package/dist/client/link.d.ts.map +1 -1
  131. package/dist/client/navigation-api.d.ts +2 -2
  132. package/dist/client/navigation-commit.d.ts +87 -0
  133. package/dist/client/navigation-commit.d.ts.map +1 -0
  134. package/dist/client/navigation-context.d.ts +37 -20
  135. package/dist/client/navigation-context.d.ts.map +1 -1
  136. package/dist/client/navigation-root.d.ts +63 -23
  137. package/dist/client/navigation-root.d.ts.map +1 -1
  138. package/dist/client/params-context.d.ts +81 -0
  139. package/dist/client/params-context.d.ts.map +1 -0
  140. package/dist/client/router-effects.d.ts +129 -0
  141. package/dist/client/router-effects.d.ts.map +1 -0
  142. package/dist/client/router-lifecycle.d.ts +55 -0
  143. package/dist/client/router-lifecycle.d.ts.map +1 -0
  144. package/dist/client/router-pipeline.d.ts +84 -0
  145. package/dist/client/router-pipeline.d.ts.map +1 -0
  146. package/dist/client/router-ref.d.ts +1 -1
  147. package/dist/client/router-ref.d.ts.map +1 -1
  148. package/dist/client/router-skew.d.ts +21 -0
  149. package/dist/client/router-skew.d.ts.map +1 -0
  150. package/dist/client/router-types.d.ts +207 -0
  151. package/dist/client/router-types.d.ts.map +1 -0
  152. package/dist/client/router.d.ts +1 -182
  153. package/dist/client/router.d.ts.map +1 -1
  154. package/dist/client/rsc-fetch.d.ts +47 -26
  155. package/dist/client/rsc-fetch.d.ts.map +1 -1
  156. package/dist/client/segment-cache.d.ts +87 -34
  157. package/dist/client/segment-cache.d.ts.map +1 -1
  158. package/dist/client/ssr-data.d.ts +6 -0
  159. package/dist/client/ssr-data.d.ts.map +1 -1
  160. package/dist/client/stale-client.d.ts +69 -0
  161. package/dist/client/stale-client.d.ts.map +1 -0
  162. package/dist/client/state.d.ts +10 -1
  163. package/dist/client/state.d.ts.map +1 -1
  164. package/dist/client/top-loader.d.ts +2 -1
  165. package/dist/client/top-loader.d.ts.map +1 -1
  166. package/dist/client/unload-guard.d.ts +5 -0
  167. package/dist/client/unload-guard.d.ts.map +1 -1
  168. package/dist/client/use-cookie.d.ts.map +1 -1
  169. package/dist/client/use-query-states.d.ts +9 -3
  170. package/dist/client/use-query-states.d.ts.map +1 -1
  171. package/dist/client/use-router.d.ts +1 -1
  172. package/dist/client/use-segment-params.d.ts +18 -8
  173. package/dist/client/use-segment-params.d.ts.map +1 -1
  174. package/dist/codec.js +1 -1
  175. package/dist/cookies/define-cookie.d.ts.map +1 -1
  176. package/dist/cookies/index.js +5 -5
  177. package/dist/cookies/index.js.map +1 -1
  178. package/dist/index.d.ts +4 -1
  179. package/dist/index.d.ts.map +1 -1
  180. package/dist/index.js +1009 -759
  181. package/dist/index.js.map +1 -1
  182. package/dist/params/index.js +1 -1
  183. package/dist/plugin-context.d.ts +46 -0
  184. package/dist/plugin-context.d.ts.map +1 -1
  185. package/dist/plugins/adapter-build.d.ts.map +1 -1
  186. package/dist/plugins/build-manifest.d.ts +1 -1
  187. package/dist/plugins/build-manifest.d.ts.map +1 -1
  188. package/dist/plugins/entries.d.ts.map +1 -1
  189. package/dist/plugins/fonts.d.ts.map +1 -1
  190. package/dist/plugins/request-dep/analysis.d.ts +106 -0
  191. package/dist/plugins/request-dep/analysis.d.ts.map +1 -0
  192. package/dist/plugins/request-dep/index.d.ts +75 -0
  193. package/dist/plugins/request-dep/index.d.ts.map +1 -0
  194. package/dist/plugins/request-dep/origin.d.ts +61 -0
  195. package/dist/plugins/request-dep/origin.d.ts.map +1 -0
  196. package/dist/plugins/routing.d.ts.map +1 -1
  197. package/dist/plugins/shims.d.ts.map +1 -1
  198. package/dist/plugins/static-build.d.ts +160 -8
  199. package/dist/plugins/static-build.d.ts.map +1 -1
  200. package/dist/routing/codegen-shared.d.ts +3 -44
  201. package/dist/routing/codegen-shared.d.ts.map +1 -1
  202. package/dist/routing/codegen-types.d.ts +28 -31
  203. package/dist/routing/codegen-types.d.ts.map +1 -1
  204. package/dist/routing/codegen-write.d.ts +51 -0
  205. package/dist/routing/codegen-write.d.ts.map +1 -0
  206. package/dist/routing/codegen.d.ts.map +1 -1
  207. package/dist/routing/collision-probe.d.ts +104 -0
  208. package/dist/routing/collision-probe.d.ts.map +1 -0
  209. package/dist/routing/collision-spaces.d.ts +26 -0
  210. package/dist/routing/collision-spaces.d.ts.map +1 -0
  211. package/dist/routing/convention-lint.d.ts +18 -4
  212. package/dist/routing/convention-lint.d.ts.map +1 -1
  213. package/dist/routing/export-detect.d.ts +16 -0
  214. package/dist/routing/export-detect.d.ts.map +1 -1
  215. package/dist/routing/index.js +4 -3
  216. package/dist/routing/interception.d.ts +235 -6
  217. package/dist/routing/interception.d.ts.map +1 -1
  218. package/dist/routing/link-codegen.d.ts +19 -4
  219. package/dist/routing/link-codegen.d.ts.map +1 -1
  220. package/dist/routing/manifest-codegen.d.ts +1 -7
  221. package/dist/routing/manifest-codegen.d.ts.map +1 -1
  222. package/dist/routing/scanner.d.ts.map +1 -1
  223. package/dist/routing/segment-classify.d.ts +33 -0
  224. package/dist/routing/segment-classify.d.ts.map +1 -1
  225. package/dist/routing/segment-keys.d.ts +95 -0
  226. package/dist/routing/segment-keys.d.ts.map +1 -0
  227. package/dist/routing/slot-placement.d.ts +48 -0
  228. package/dist/routing/slot-placement.d.ts.map +1 -0
  229. package/dist/routing/types.d.ts +0 -6
  230. package/dist/routing/types.d.ts.map +1 -1
  231. package/dist/routing/walkers.d.ts +6 -0
  232. package/dist/routing/walkers.d.ts.map +1 -1
  233. package/dist/schema-bridge.d.ts +60 -9
  234. package/dist/schema-bridge.d.ts.map +1 -1
  235. package/dist/search-params/define.d.ts +62 -14
  236. package/dist/search-params/define.d.ts.map +1 -1
  237. package/dist/search-params/index.d.ts +0 -1
  238. package/dist/search-params/index.d.ts.map +1 -1
  239. package/dist/search-params/index.js +221 -10
  240. package/dist/search-params/index.js.map +1 -1
  241. package/dist/search-params/parse-total.d.ts +70 -0
  242. package/dist/search-params/parse-total.d.ts.map +1 -0
  243. package/dist/search-params/wrappers.d.ts +26 -3
  244. package/dist/search-params/wrappers.d.ts.map +1 -1
  245. package/dist/server/access-gate.d.ts +19 -8
  246. package/dist/server/access-gate.d.ts.map +1 -1
  247. package/dist/server/action-handler.d.ts.map +1 -1
  248. package/dist/server/actions.d.ts +6 -3
  249. package/dist/server/actions.d.ts.map +1 -1
  250. package/dist/server/als-registry.d.ts +18 -1
  251. package/dist/server/als-registry.d.ts.map +1 -1
  252. package/dist/server/build-manifest.d.ts +13 -1
  253. package/dist/server/build-manifest.d.ts.map +1 -1
  254. package/dist/server/chain-url-parts.d.ts +82 -0
  255. package/dist/server/chain-url-parts.d.ts.map +1 -0
  256. package/dist/server/children-interception.d.ts +49 -0
  257. package/dist/server/children-interception.d.ts.map +1 -0
  258. package/dist/server/compress.d.ts.map +1 -1
  259. package/dist/server/default-status-page.d.ts +45 -0
  260. package/dist/server/default-status-page.d.ts.map +1 -0
  261. package/dist/server/deny-boundary.d.ts +148 -15
  262. package/dist/server/deny-boundary.d.ts.map +1 -1
  263. package/dist/server/deny-renderer.d.ts +15 -4
  264. package/dist/server/deny-renderer.d.ts.map +1 -1
  265. package/dist/server/error-boundary-wrapper.d.ts +85 -15
  266. package/dist/server/error-boundary-wrapper.d.ts.map +1 -1
  267. package/dist/server/head-response.d.ts +35 -0
  268. package/dist/server/head-response.d.ts.map +1 -0
  269. package/dist/server/index.d.ts +0 -1
  270. package/dist/server/index.d.ts.map +1 -1
  271. package/dist/server/index.js +3 -2
  272. package/dist/server/index.js.map +1 -1
  273. package/dist/server/internal.d.ts +3 -1
  274. package/dist/server/internal.d.ts.map +1 -1
  275. package/dist/server/internal.js +712 -418
  276. package/dist/server/internal.js.map +1 -1
  277. package/dist/server/metadata-collector.d.ts +52 -0
  278. package/dist/server/metadata-collector.d.ts.map +1 -0
  279. package/dist/server/param-coercion.d.ts +22 -6
  280. package/dist/server/param-coercion.d.ts.map +1 -1
  281. package/dist/server/pipeline-helpers.d.ts +0 -18
  282. package/dist/server/pipeline-helpers.d.ts.map +1 -1
  283. package/dist/server/pipeline-interception.d.ts +59 -9
  284. package/dist/server/pipeline-interception.d.ts.map +1 -1
  285. package/dist/server/pipeline-outcome.d.ts.map +1 -1
  286. package/dist/server/pipeline-phases.d.ts.map +1 -1
  287. package/dist/server/pipeline.d.ts +11 -0
  288. package/dist/server/pipeline.d.ts.map +1 -1
  289. package/dist/server/primitives.d.ts +23 -0
  290. package/dist/server/primitives.d.ts.map +1 -1
  291. package/dist/server/publish-params.d.ts +33 -0
  292. package/dist/server/publish-params.d.ts.map +1 -0
  293. package/dist/server/request-context.d.ts +48 -0
  294. package/dist/server/request-context.d.ts.map +1 -1
  295. package/dist/server/route-element-builder.d.ts +22 -3
  296. package/dist/server/route-element-builder.d.ts.map +1 -1
  297. package/dist/server/route-handler.d.ts.map +1 -1
  298. package/dist/server/route-matcher.d.ts +13 -0
  299. package/dist/server/route-matcher.d.ts.map +1 -1
  300. package/dist/server/rsc-cache-key-guard.d.ts +78 -0
  301. package/dist/server/rsc-cache-key-guard.d.ts.map +1 -0
  302. package/dist/server/rsc-entry/api-handler.d.ts.map +1 -1
  303. package/dist/server/rsc-entry/deny-fallback.d.ts.map +1 -1
  304. package/dist/server/rsc-entry/error-renderer.d.ts +15 -3
  305. package/dist/server/rsc-entry/error-renderer.d.ts.map +1 -1
  306. package/dist/server/rsc-entry/helpers.d.ts +2 -17
  307. package/dist/server/rsc-entry/helpers.d.ts.map +1 -1
  308. package/dist/server/rsc-entry/index.d.ts +0 -1
  309. package/dist/server/rsc-entry/index.d.ts.map +1 -1
  310. package/dist/server/rsc-entry/render-route.d.ts.map +1 -1
  311. package/dist/server/rsc-entry/revalidate-renderer.d.ts.map +1 -1
  312. package/dist/server/rsc-entry/rsc-payload.d.ts +1 -2
  313. package/dist/server/rsc-entry/rsc-payload.d.ts.map +1 -1
  314. package/dist/server/rsc-entry/rsc-stream.d.ts +15 -2
  315. package/dist/server/rsc-entry/rsc-stream.d.ts.map +1 -1
  316. package/dist/server/rsc-entry/ssr-renderer.d.ts.map +1 -1
  317. package/dist/server/skippable-prefix.d.ts +23 -0
  318. package/dist/server/skippable-prefix.d.ts.map +1 -0
  319. package/dist/server/slot-interception.d.ts +80 -0
  320. package/dist/server/slot-interception.d.ts.map +1 -0
  321. package/dist/server/slot-resolver.d.ts +70 -8
  322. package/dist/server/slot-resolver.d.ts.map +1 -1
  323. package/dist/server/ssr-bridge-types.d.ts +17 -0
  324. package/dist/server/ssr-bridge-types.d.ts.map +1 -1
  325. package/dist/server/ssr-entry.d.ts +0 -1
  326. package/dist/server/ssr-entry.d.ts.map +1 -1
  327. package/dist/server/ssr-wrappers.d.ts +24 -13
  328. package/dist/server/ssr-wrappers.d.ts.map +1 -1
  329. package/dist/server/state-tree-diff.d.ts +6 -27
  330. package/dist/server/state-tree-diff.d.ts.map +1 -1
  331. package/dist/server/static-generator.d.ts +6 -0
  332. package/dist/server/static-generator.d.ts.map +1 -1
  333. package/dist/server/static-not-found.d.ts +52 -0
  334. package/dist/server/static-not-found.d.ts.map +1 -0
  335. package/dist/server/status-code-resolver.d.ts +8 -1
  336. package/dist/server/status-code-resolver.d.ts.map +1 -1
  337. package/dist/server/tree-builder.d.ts +28 -36
  338. package/dist/server/tree-builder.d.ts.map +1 -1
  339. package/dist/server/types.d.ts +12 -7
  340. package/dist/server/types.d.ts.map +1 -1
  341. package/dist/server/utils/element-type.d.ts +40 -0
  342. package/dist/server/utils/element-type.d.ts.map +1 -0
  343. package/dist/shared/als-slots.d.ts +41 -0
  344. package/dist/shared/als-slots.d.ts.map +1 -0
  345. package/dist/shared/base-path.d.ts +56 -0
  346. package/dist/shared/base-path.d.ts.map +1 -0
  347. package/dist/shared/param-value.d.ts +80 -0
  348. package/dist/shared/param-value.d.ts.map +1 -0
  349. package/dist/shared/payload-root.d.ts +108 -0
  350. package/dist/shared/payload-root.d.ts.map +1 -0
  351. package/dist/shared/rsc-cache-key.d.ts +163 -0
  352. package/dist/shared/rsc-cache-key.d.ts.map +1 -0
  353. package/dist/shared/rsc-error-envelope.d.ts +25 -0
  354. package/dist/shared/rsc-error-envelope.d.ts.map +1 -0
  355. package/dist/shared/rsc-manifest.d.ts +28 -0
  356. package/dist/shared/rsc-manifest.d.ts.map +1 -0
  357. package/dist/shared/rsc-media-type.d.ts +40 -0
  358. package/dist/shared/rsc-media-type.d.ts.map +1 -0
  359. package/dist/shared/rsc-payload-path.d.ts +42 -0
  360. package/dist/shared/rsc-payload-path.d.ts.map +1 -0
  361. package/dist/shared/segment-info.d.ts +59 -0
  362. package/dist/shared/segment-info.d.ts.map +1 -0
  363. package/dist/shared/slot-params.d.ts +51 -0
  364. package/dist/shared/slot-params.d.ts.map +1 -0
  365. package/dist/shared/static-platform-files.d.ts +71 -0
  366. package/dist/shared/static-platform-files.d.ts.map +1 -0
  367. package/docs/api/30-api-server.mdx +1 -1
  368. package/docs/api/31-api-client.mdx +4 -2
  369. package/docs/api/33-api-search-params.mdx +38 -16
  370. package/docs/api/35-api-typescript.mdx +3 -3
  371. package/docs/api/36-cli.mdx +34 -7
  372. package/docs/learn/00-introduction.mdx +1 -1
  373. package/docs/learn/02-pages-and-layouts.mdx +2 -2
  374. package/docs/learn/05-typed-params.mdx +8 -8
  375. package/docs/learn/07-typed-routes.mdx +12 -7
  376. package/docs/learn/11-error-handling.mdx +18 -0
  377. package/docs/learn/12-client-navigation.mdx +2 -2
  378. package/docs/learn/14-deploying.mdx +23 -0
  379. package/docs/more/01-advanced-routing.mdx +173 -3
  380. package/docs/more/03-coming-from-nextjs.mdx +2 -2
  381. package/docs/more/04-metadata-and-fonts.mdx +1 -1
  382. package/docs/more/50-ai-agent-instructions.mdx +6 -4
  383. package/package.json +9 -6
  384. package/src/adapters/build-output-helper.ts +116 -3
  385. package/src/adapters/cloudflare.ts +90 -12
  386. package/src/adapters/compress-module.ts +79 -1
  387. package/src/adapters/fs-identity.ts +156 -0
  388. package/src/adapters/nitro.ts +6 -6
  389. package/src/adapters/shared.ts +196 -21
  390. package/src/adapters/types.ts +13 -1
  391. package/src/cache/fast-hash.ts +5 -0
  392. package/src/cli-check.ts +458 -0
  393. package/src/cli.ts +59 -24
  394. package/src/client/browser-entry/action-dispatch.ts +11 -5
  395. package/src/client/browser-entry/hydrate.ts +40 -29
  396. package/src/client/browser-entry/index.ts +15 -6
  397. package/src/client/browser-entry/post-hydration.ts +10 -9
  398. package/src/client/browser-entry/router-init.ts +104 -48
  399. package/src/client/browser-entry/rsc-stream.ts +11 -2
  400. package/src/client/error-boundary.tsx +85 -16
  401. package/src/client/history.ts +13 -6
  402. package/src/client/index.ts +14 -3
  403. package/src/client/internal.ts +4 -3
  404. package/src/client/link.tsx +120 -72
  405. package/src/client/navigation-api.ts +3 -3
  406. package/src/client/navigation-commit.ts +197 -0
  407. package/src/client/navigation-context.ts +40 -67
  408. package/src/client/navigation-root.tsx +326 -101
  409. package/src/client/params-context.ts +192 -0
  410. package/src/client/router-effects.ts +231 -0
  411. package/src/client/router-lifecycle.ts +288 -0
  412. package/src/client/router-pipeline.ts +393 -0
  413. package/src/client/router-ref.ts +1 -1
  414. package/src/client/router-skew.ts +30 -0
  415. package/src/client/router-types.ts +230 -0
  416. package/src/client/router.ts +243 -707
  417. package/src/client/rsc-fetch.ts +183 -106
  418. package/src/client/segment-cache.ts +129 -44
  419. package/src/client/ssr-data.ts +6 -0
  420. package/src/client/stale-client.ts +191 -0
  421. package/src/client/state.ts +14 -1
  422. package/src/client/top-loader.tsx +2 -1
  423. package/src/client/unload-guard.ts +34 -2
  424. package/src/client/use-cookie.ts +9 -2
  425. package/src/client/use-query-states.ts +102 -39
  426. package/src/client/use-router.ts +1 -1
  427. package/src/client/use-segment-params.ts +41 -18
  428. package/src/cookies/define-cookie.ts +6 -1
  429. package/src/index.ts +25 -4
  430. package/src/plugin-context.ts +58 -0
  431. package/src/plugins/adapter-build.ts +4 -0
  432. package/src/plugins/build-manifest.ts +34 -13
  433. package/src/plugins/entries.ts +4 -0
  434. package/src/plugins/fonts.ts +11 -8
  435. package/src/plugins/request-dep/analysis.ts +447 -0
  436. package/src/plugins/request-dep/index.ts +376 -0
  437. package/src/plugins/request-dep/origin.ts +310 -0
  438. package/src/plugins/routing.ts +97 -102
  439. package/src/plugins/shims.ts +0 -1
  440. package/src/plugins/static-build.ts +391 -95
  441. package/src/routing/codegen-shared.ts +3 -79
  442. package/src/routing/codegen-types.ts +28 -31
  443. package/src/routing/codegen-write.ts +139 -0
  444. package/src/routing/codegen.ts +86 -172
  445. package/src/routing/collision-probe.ts +438 -0
  446. package/src/routing/collision-spaces.ts +281 -0
  447. package/src/routing/convention-lint.ts +139 -40
  448. package/src/routing/export-detect.ts +151 -7
  449. package/src/routing/interception.ts +896 -50
  450. package/src/routing/link-codegen.ts +32 -65
  451. package/src/routing/manifest-codegen.ts +6 -62
  452. package/src/routing/scanner.ts +117 -92
  453. package/src/routing/segment-classify.ts +57 -0
  454. package/src/routing/segment-keys.ts +146 -0
  455. package/src/routing/slot-placement.ts +97 -0
  456. package/src/routing/types.ts +0 -6
  457. package/src/routing/walkers.ts +8 -0
  458. package/src/schema-bridge.ts +180 -58
  459. package/src/search-params/define.ts +108 -66
  460. package/src/search-params/index.ts +0 -1
  461. package/src/search-params/parse-total.ts +78 -0
  462. package/src/search-params/wrappers.ts +60 -11
  463. package/src/server/access-gate.tsx +60 -40
  464. package/src/server/action-handler.ts +4 -5
  465. package/src/server/actions.ts +6 -3
  466. package/src/server/als-registry.ts +18 -1
  467. package/src/server/build-manifest.ts +14 -1
  468. package/src/server/chain-url-parts.ts +163 -0
  469. package/src/server/children-interception.ts +115 -0
  470. package/src/server/compress.ts +9 -1
  471. package/src/server/default-status-page.ts +127 -0
  472. package/src/server/deny-boundary.ts +269 -41
  473. package/src/server/deny-renderer.ts +111 -39
  474. package/src/server/error-boundary-wrapper.ts +166 -79
  475. package/src/server/head-response.ts +54 -0
  476. package/src/server/index.ts +1 -3
  477. package/src/server/internal.ts +2 -2
  478. package/src/server/metadata-collector.ts +115 -0
  479. package/src/server/param-coercion.ts +51 -69
  480. package/src/server/pipeline-helpers.ts +2 -47
  481. package/src/server/pipeline-interception.ts +81 -32
  482. package/src/server/pipeline-outcome.ts +4 -5
  483. package/src/server/pipeline-phases.ts +77 -25
  484. package/src/server/pipeline.ts +57 -10
  485. package/src/server/prebuilt-runtime.ts +4 -4
  486. package/src/server/primitives.ts +25 -0
  487. package/src/server/publish-params.ts +42 -0
  488. package/src/server/request-context.ts +97 -18
  489. package/src/server/route-element-builder.ts +241 -253
  490. package/src/server/route-handler.ts +8 -8
  491. package/src/server/route-matcher.ts +21 -9
  492. package/src/server/rsc-cache-key-guard.ts +164 -0
  493. package/src/server/rsc-entry/api-handler.ts +6 -8
  494. package/src/server/rsc-entry/deny-fallback.ts +3 -2
  495. package/src/server/rsc-entry/error-renderer.ts +94 -35
  496. package/src/server/rsc-entry/helpers.ts +33 -28
  497. package/src/server/rsc-entry/index.ts +36 -33
  498. package/src/server/rsc-entry/render-route.ts +18 -10
  499. package/src/server/rsc-entry/revalidate-renderer.ts +3 -2
  500. package/src/server/rsc-entry/rsc-payload.ts +113 -40
  501. package/src/server/rsc-entry/rsc-stream.ts +29 -5
  502. package/src/server/rsc-entry/ssr-renderer.ts +38 -22
  503. package/src/server/skippable-prefix.ts +92 -0
  504. package/src/server/slot-interception.ts +168 -0
  505. package/src/server/slot-resolver.ts +263 -158
  506. package/src/server/ssr-bridge-types.ts +18 -0
  507. package/src/server/ssr-entry.ts +20 -10
  508. package/src/server/ssr-wrappers.tsx +33 -32
  509. package/src/server/state-tree-diff.ts +14 -55
  510. package/src/server/static-generator.ts +68 -29
  511. package/src/server/static-not-found.ts +134 -0
  512. package/src/server/status-code-resolver.ts +28 -11
  513. package/src/server/tree-builder.ts +35 -218
  514. package/src/server/types.ts +12 -7
  515. package/src/server/utils/element-type.ts +72 -0
  516. package/src/shared/als-slots.ts +72 -0
  517. package/src/shared/base-path.ts +80 -0
  518. package/src/shared/param-value.ts +244 -0
  519. package/src/shared/payload-root.ts +151 -0
  520. package/src/shared/rsc-cache-key.ts +269 -0
  521. package/src/shared/rsc-error-envelope.ts +31 -0
  522. package/src/shared/rsc-manifest.ts +29 -0
  523. package/src/shared/rsc-media-type.ts +43 -0
  524. package/src/shared/rsc-payload-path.ts +45 -0
  525. package/src/shared/segment-info.ts +60 -0
  526. package/src/shared/slot-params.ts +111 -0
  527. package/src/shared/static-platform-files.ts +75 -0
  528. package/dist/_chunks/build-output-helper-DOGYFb_X.js +0 -196
  529. package/dist/_chunks/build-output-helper-DOGYFb_X.js.map +0 -1
  530. package/dist/_chunks/cache-api-B-lhk9p4.js.map +0 -1
  531. package/dist/_chunks/canonicalize-DQHyFClh.js.map +0 -1
  532. package/dist/_chunks/cli-schema-sync-BTWEKJXo.js +0 -668
  533. package/dist/_chunks/cli-schema-sync-BTWEKJXo.js.map +0 -1
  534. package/dist/_chunks/define-COtkxMRT.js +0 -191
  535. package/dist/_chunks/define-COtkxMRT.js.map +0 -1
  536. package/dist/_chunks/define-c4au4I9R.js +0 -82
  537. package/dist/_chunks/define-c4au4I9R.js.map +0 -1
  538. package/dist/_chunks/fast-hash-D6hIVt1Y.js.map +0 -1
  539. package/dist/_chunks/logger-AWfuX-KJ.js.map +0 -1
  540. package/dist/_chunks/navigation-root-bUDZLw74.js +0 -124
  541. package/dist/_chunks/navigation-root-bUDZLw74.js.map +0 -1
  542. package/dist/_chunks/plugin-context---kTF5v8.js.map +0 -1
  543. package/dist/_chunks/registry-DbJPKoBp.js +0 -20
  544. package/dist/_chunks/registry-DbJPKoBp.js.map +0 -1
  545. package/dist/_chunks/router-ref-CtmF-aPv.js.map +0 -1
  546. package/dist/_chunks/schema-bridge-DT_Tn0Xf.js +0 -119
  547. package/dist/_chunks/schema-bridge-DT_Tn0Xf.js.map +0 -1
  548. package/dist/_chunks/segment-classify-Byy425ng.js.map +0 -1
  549. package/dist/_chunks/segment-context-ZDnXDkbz.js +0 -34
  550. package/dist/_chunks/segment-context-ZDnXDkbz.js.map +0 -1
  551. package/dist/_chunks/ssr-data-BOWsq18U.js.map +0 -1
  552. package/dist/_chunks/use-query-states-DFvWd-EA.js.map +0 -1
  553. package/dist/_chunks/use-segment-params-D1CzlgBo.js +0 -151
  554. package/dist/_chunks/use-segment-params-D1CzlgBo.js.map +0 -1
  555. package/dist/_chunks/walkers-_6zKFlch.js +0 -1002
  556. package/dist/_chunks/walkers-_6zKFlch.js.map +0 -1
  557. package/dist/client/error-boundary.js.map +0 -1
  558. package/dist/plugins/request-dep.d.ts +0 -32
  559. package/dist/plugins/request-dep.d.ts.map +0 -1
  560. package/dist/search-params/registry.d.ts +0 -20
  561. package/dist/search-params/registry.d.ts.map +0 -1
  562. package/dist/segment-params/define.d.ts +0 -89
  563. package/dist/segment-params/define.d.ts.map +0 -1
  564. package/dist/segment-params/index.d.ts +0 -3
  565. package/dist/segment-params/index.d.ts.map +0 -1
  566. package/dist/segment-params/index.js +0 -2
  567. package/src/plugins/request-dep.ts +0 -499
  568. package/src/search-params/registry.ts +0 -31
  569. package/src/segment-params/define.ts +0 -249
  570. package/src/segment-params/index.ts +0 -9
@@ -0,0 +1,94 @@
1
+ import { n as setCdnPurgeHandler, t as getCdnPurgeHandler } from "../_chunks/purge-store-Byr8XOjU.js";
2
+ //#region src/cdn/headers.ts
3
+ /**
4
+ * Build a `Cache-Control` header value.
5
+ *
6
+ * ```ts
7
+ * ctx.headers.set('Cache-Control', cacheControl({
8
+ * public: true,
9
+ * maxAge: 300,
10
+ * staleWhileRevalidate: 60,
11
+ * }));
12
+ * ```
13
+ */
14
+ function cacheControl(opts) {
15
+ if (opts.public && opts.private) throw new Error("cacheControl: public and private are mutually exclusive");
16
+ if (opts.noStore && opts.maxAge !== void 0) throw new Error("cacheControl: noStore makes maxAge meaningless — remove one");
17
+ const parts = [];
18
+ parts.push(opts.public ? "public" : "private");
19
+ if (opts.noStore) parts.push("no-store");
20
+ if (opts.noCache) parts.push("no-cache");
21
+ if (opts.maxAge !== void 0) parts.push(`max-age=${opts.maxAge}`);
22
+ if (opts.sMaxAge !== void 0) parts.push(`s-maxage=${opts.sMaxAge}`);
23
+ if (opts.staleWhileRevalidate !== void 0) parts.push(`stale-while-revalidate=${opts.staleWhileRevalidate}`);
24
+ if (opts.staleIfError !== void 0) parts.push(`stale-if-error=${opts.staleIfError}`);
25
+ if (opts.mustRevalidate) parts.push("must-revalidate");
26
+ if (opts.immutable) parts.push("immutable");
27
+ return parts.join(", ");
28
+ }
29
+ /**
30
+ * Build a `Surrogate-Control` header value (Fastly, Akamai, Varnish).
31
+ *
32
+ * ```ts
33
+ * ctx.headers.set('Surrogate-Control', surrogateControl({ maxAge: 3600 }));
34
+ * ```
35
+ */
36
+ function surrogateControl(opts) {
37
+ const parts = [];
38
+ if (opts.noStore) parts.push("no-store");
39
+ if (opts.maxAge !== void 0) parts.push(`max-age=${opts.maxAge}`);
40
+ if (opts.staleWhileRevalidate !== void 0) parts.push(`stale-while-revalidate=${opts.staleWhileRevalidate}`);
41
+ if (opts.staleIfError !== void 0) parts.push(`stale-if-error=${opts.staleIfError}`);
42
+ return parts.join(", ");
43
+ }
44
+ /**
45
+ * Build a `CDN-Cache-Control` header value (Cloudflare).
46
+ * Same directive syntax as Surrogate-Control but recognized by Cloudflare.
47
+ *
48
+ * ```ts
49
+ * ctx.headers.set('CDN-Cache-Control', cdnCacheControl({ maxAge: 3600 }));
50
+ * ```
51
+ */
52
+ function cdnCacheControl(opts) {
53
+ return surrogateControl(opts);
54
+ }
55
+ /**
56
+ * Build a `Surrogate-Key` header value — space-separated tags for CDN
57
+ * tag-based purging (Fastly, Cloudflare Enterprise, Akamai).
58
+ *
59
+ * Tags are deduplicated. Tags must not contain spaces or double quotes
60
+ * (these are separators/delimiters in the header format).
61
+ *
62
+ * ```ts
63
+ * ctx.headers.set('Surrogate-Key', surrogateKey(['products', `product:${id}`]));
64
+ * ```
65
+ */
66
+ function surrogateKey(tags) {
67
+ for (const tag of tags) if (tag.includes(" ") || tag.includes("\"")) throw new Error(`surrogateKey: tag "${tag}" must not contain spaces or double quotes`);
68
+ return [...new Set(tags)].join(" ");
69
+ }
70
+ /**
71
+ * Build a `Cache-Tag` header value — comma-separated tags for Cloudflare
72
+ * Workers Cache tag-based purging. Available on ALL Cloudflare plans.
73
+ *
74
+ * Tags are deduplicated. Tags must not contain commas (the delimiter).
75
+ * Maximum tag length is 1024 characters per Cloudflare's limits.
76
+ *
77
+ * Use this instead of `surrogateKey()` when using Cloudflare Workers Cache
78
+ * (ctx.cache.purge). Workers Cache reads `Cache-Tag`, not `Surrogate-Key`.
79
+ *
80
+ * ```ts
81
+ * ctx.headers.set('Cache-Tag', cacheTag(['products', `product:${id}`]));
82
+ * ```
83
+ */
84
+ function cacheTag(tags) {
85
+ for (const tag of tags) {
86
+ if (tag.includes(",")) throw new Error(`cacheTag: tag "${tag}" must not contain commas`);
87
+ if (tag.length > 1024) throw new Error(`cacheTag: tag "${tag}" exceeds 1024-character limit`);
88
+ }
89
+ return [...new Set(tags)].join(",");
90
+ }
91
+ //#endregion
92
+ export { cacheControl, cacheTag, cdnCacheControl, getCdnPurgeHandler, setCdnPurgeHandler, surrogateControl, surrogateKey };
93
+
94
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../src/cdn/headers.ts"],"sourcesContent":["/**\n * CDN header helpers — pure functions that build Cache-Control,\n * CDN-Cache-Control, Surrogate-Control, and Surrogate-Key header values.\n *\n * These are developer-elected utilities for wiring CDN caching in\n * proxy.ts / middleware.ts. The framework never sets these automatically.\n * See design/25-production-deployments.md §Layer 2.\n */\n\nexport interface CacheControlOptions {\n /** Mark the response as publicly cacheable (CDN, shared caches). */\n public?: boolean;\n /** Mark the response as private (browser cache only, not CDN). */\n private?: boolean;\n /** Max freshness in seconds for the browser/client. */\n maxAge?: number;\n /** Max freshness in seconds for shared caches (CDN, proxy). Overrides maxAge for CDNs. */\n sMaxAge?: number;\n /** Serve stale while revalidating in the background (seconds). */\n staleWhileRevalidate?: number;\n /** Serve stale on upstream error (seconds). */\n staleIfError?: number;\n /** Response must not be stored by any cache. */\n noStore?: boolean;\n /** Caches must revalidate before using a stored response. */\n noCache?: boolean;\n /** Caches must revalidate once stale — no serving stale without checking origin. */\n mustRevalidate?: boolean;\n /** Response will not change — allows aggressive caching. Pair with hashed URLs. */\n immutable?: boolean;\n}\n\n/**\n * Build a `Cache-Control` header value.\n *\n * ```ts\n * ctx.headers.set('Cache-Control', cacheControl({\n * public: true,\n * maxAge: 300,\n * staleWhileRevalidate: 60,\n * }));\n * ```\n */\nexport function cacheControl(opts: CacheControlOptions): string {\n if (opts.public && opts.private) {\n throw new Error('cacheControl: public and private are mutually exclusive');\n }\n if (opts.noStore && opts.maxAge !== undefined) {\n throw new Error('cacheControl: noStore makes maxAge meaningless — remove one');\n }\n\n const parts: string[] = [];\n\n parts.push(opts.public ? 'public' : 'private');\n\n if (opts.noStore) parts.push('no-store');\n if (opts.noCache) parts.push('no-cache');\n if (opts.maxAge !== undefined) parts.push(`max-age=${opts.maxAge}`);\n if (opts.sMaxAge !== undefined) parts.push(`s-maxage=${opts.sMaxAge}`);\n if (opts.staleWhileRevalidate !== undefined)\n parts.push(`stale-while-revalidate=${opts.staleWhileRevalidate}`);\n if (opts.staleIfError !== undefined) parts.push(`stale-if-error=${opts.staleIfError}`);\n if (opts.mustRevalidate) parts.push('must-revalidate');\n if (opts.immutable) parts.push('immutable');\n\n return parts.join(', ');\n}\n\nexport interface SurrogateControlOptions {\n /** Max freshness in seconds for the surrogate (CDN). */\n maxAge?: number;\n /** Do not store in surrogate cache. */\n noStore?: boolean;\n /** Serve stale while revalidating (seconds). */\n staleWhileRevalidate?: number;\n /** Serve stale on error (seconds). */\n staleIfError?: number;\n}\n\n/**\n * Build a `Surrogate-Control` header value (Fastly, Akamai, Varnish).\n *\n * ```ts\n * ctx.headers.set('Surrogate-Control', surrogateControl({ maxAge: 3600 }));\n * ```\n */\nexport function surrogateControl(opts: SurrogateControlOptions): string {\n const parts: string[] = [];\n if (opts.noStore) parts.push('no-store');\n if (opts.maxAge !== undefined) parts.push(`max-age=${opts.maxAge}`);\n if (opts.staleWhileRevalidate !== undefined)\n parts.push(`stale-while-revalidate=${opts.staleWhileRevalidate}`);\n if (opts.staleIfError !== undefined) parts.push(`stale-if-error=${opts.staleIfError}`);\n return parts.join(', ');\n}\n\n/**\n * Build a `CDN-Cache-Control` header value (Cloudflare).\n * Same directive syntax as Surrogate-Control but recognized by Cloudflare.\n *\n * ```ts\n * ctx.headers.set('CDN-Cache-Control', cdnCacheControl({ maxAge: 3600 }));\n * ```\n */\nexport function cdnCacheControl(opts: SurrogateControlOptions): string {\n return surrogateControl(opts);\n}\n\n/**\n * Build a `Surrogate-Key` header value — space-separated tags for CDN\n * tag-based purging (Fastly, Cloudflare Enterprise, Akamai).\n *\n * Tags are deduplicated. Tags must not contain spaces or double quotes\n * (these are separators/delimiters in the header format).\n *\n * ```ts\n * ctx.headers.set('Surrogate-Key', surrogateKey(['products', `product:${id}`]));\n * ```\n */\nexport function surrogateKey(tags: string[]): string {\n for (const tag of tags) {\n if (tag.includes(' ') || tag.includes('\"')) {\n throw new Error(`surrogateKey: tag \"${tag}\" must not contain spaces or double quotes`);\n }\n }\n return [...new Set(tags)].join(' ');\n}\n\n/**\n * Build a `Cache-Tag` header value — comma-separated tags for Cloudflare\n * Workers Cache tag-based purging. Available on ALL Cloudflare plans.\n *\n * Tags are deduplicated. Tags must not contain commas (the delimiter).\n * Maximum tag length is 1024 characters per Cloudflare's limits.\n *\n * Use this instead of `surrogateKey()` when using Cloudflare Workers Cache\n * (ctx.cache.purge). Workers Cache reads `Cache-Tag`, not `Surrogate-Key`.\n *\n * ```ts\n * ctx.headers.set('Cache-Tag', cacheTag(['products', `product:${id}`]));\n * ```\n */\nexport function cacheTag(tags: string[]): string {\n for (const tag of tags) {\n if (tag.includes(',')) {\n throw new Error(`cacheTag: tag \"${tag}\" must not contain commas`);\n }\n if (tag.length > 1024) {\n throw new Error(`cacheTag: tag \"${tag}\" exceeds 1024-character limit`);\n }\n }\n return [...new Set(tags)].join(',');\n}\n"],"mappings":";;;;;;;;;;;;;AA2CA,SAAgB,aAAa,MAAmC;CAC9D,IAAI,KAAK,UAAU,KAAK,SACtB,MAAM,IAAI,MAAM,yDAAyD;CAE3E,IAAI,KAAK,WAAW,KAAK,WAAW,KAAA,GAClC,MAAM,IAAI,MAAM,6DAA6D;CAG/E,MAAM,QAAkB,CAAC;CAEzB,MAAM,KAAK,KAAK,SAAS,WAAW,SAAS;CAE7C,IAAI,KAAK,SAAS,MAAM,KAAK,UAAU;CACvC,IAAI,KAAK,SAAS,MAAM,KAAK,UAAU;CACvC,IAAI,KAAK,WAAW,KAAA,GAAW,MAAM,KAAK,WAAW,KAAK,QAAQ;CAClE,IAAI,KAAK,YAAY,KAAA,GAAW,MAAM,KAAK,YAAY,KAAK,SAAS;CACrE,IAAI,KAAK,yBAAyB,KAAA,GAChC,MAAM,KAAK,0BAA0B,KAAK,sBAAsB;CAClE,IAAI,KAAK,iBAAiB,KAAA,GAAW,MAAM,KAAK,kBAAkB,KAAK,cAAc;CACrF,IAAI,KAAK,gBAAgB,MAAM,KAAK,iBAAiB;CACrD,IAAI,KAAK,WAAW,MAAM,KAAK,WAAW;CAE1C,OAAO,MAAM,KAAK,IAAI;AACxB;;;;;;;;AAoBA,SAAgB,iBAAiB,MAAuC;CACtE,MAAM,QAAkB,CAAC;CACzB,IAAI,KAAK,SAAS,MAAM,KAAK,UAAU;CACvC,IAAI,KAAK,WAAW,KAAA,GAAW,MAAM,KAAK,WAAW,KAAK,QAAQ;CAClE,IAAI,KAAK,yBAAyB,KAAA,GAChC,MAAM,KAAK,0BAA0B,KAAK,sBAAsB;CAClE,IAAI,KAAK,iBAAiB,KAAA,GAAW,MAAM,KAAK,kBAAkB,KAAK,cAAc;CACrF,OAAO,MAAM,KAAK,IAAI;AACxB;;;;;;;;;AAUA,SAAgB,gBAAgB,MAAuC;CACrE,OAAO,iBAAiB,IAAI;AAC9B;;;;;;;;;;;;AAaA,SAAgB,aAAa,MAAwB;CACnD,KAAK,MAAM,OAAO,MAChB,IAAI,IAAI,SAAS,GAAG,KAAK,IAAI,SAAS,IAAG,GACvC,MAAM,IAAI,MAAM,sBAAsB,IAAI,2CAA2C;CAGzF,OAAO,CAAC,GAAG,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG;AACpC;;;;;;;;;;;;;;;AAgBA,SAAgB,SAAS,MAAwB;CAC/C,KAAK,MAAM,OAAO,MAAM;EACtB,IAAI,IAAI,SAAS,GAAG,GAClB,MAAM,IAAI,MAAM,kBAAkB,IAAI,0BAA0B;EAElE,IAAI,IAAI,SAAS,MACf,MAAM,IAAI,MAAM,kBAAkB,IAAI,+BAA+B;CAEzE;CACA,OAAO,CAAC,GAAG,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG;AACpC"}
@@ -0,0 +1,35 @@
1
+ import { c as workersCachePurgeAls } from "../_chunks/als-registry-C6kcfprT.js";
2
+ //#region src/server/workers-cache-bridge.ts
3
+ /**
4
+ * Per-request Workers Cache purge bridge — ALS bridge for Cloudflare adapter.
5
+ *
6
+ * The generated _worker.js wraps each request with `runWithWorkersCachePurge`,
7
+ * binding `ctx.cache` from the Cloudflare ExecutionContext. The
8
+ * `WorkersCachePurge` CDN purge handler reads from this ALS to call
9
+ * `ctx.cache.purge({ tags })` without needing an API token.
10
+ *
11
+ * Design doc: design/06-caching.md, design/25-production-deployments.md
12
+ */
13
+ /**
14
+ * Get the current request's Workers Cache context, if available.
15
+ *
16
+ * Returns undefined outside a Cloudflare Workers request context
17
+ * or on platforms without Workers Cache support.
18
+ */
19
+ function getWorkersCachePurgeCtx() {
20
+ return workersCachePurgeAls.getStore();
21
+ }
22
+ //#endregion
23
+ //#region src/cdn/workers-cache-purge.ts
24
+ var WorkersCachePurge = class {
25
+ async purgeTags(tags) {
26
+ if (tags.length === 0) return;
27
+ const ctx = getWorkersCachePurgeCtx();
28
+ if (!ctx) throw new Error("WorkersCachePurge: no Workers Cache context available. This handler can only be used within a Cloudflare Workers request context.");
29
+ await ctx.purge({ tags });
30
+ }
31
+ };
32
+ //#endregion
33
+ export { WorkersCachePurge };
34
+
35
+ //# sourceMappingURL=workers-cache-purge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workers-cache-purge.js","names":[],"sources":["../../src/server/workers-cache-bridge.ts","../../src/cdn/workers-cache-purge.ts"],"sourcesContent":["/**\n * Per-request Workers Cache purge bridge — ALS bridge for Cloudflare adapter.\n *\n * The generated _worker.js wraps each request with `runWithWorkersCachePurge`,\n * binding `ctx.cache` from the Cloudflare ExecutionContext. The\n * `WorkersCachePurge` CDN purge handler reads from this ALS to call\n * `ctx.cache.purge({ tags })` without needing an API token.\n *\n * Design doc: design/06-caching.md, design/25-production-deployments.md\n */\n\nimport { workersCachePurgeAls } from './als-registry.js';\nimport type { WorkersCachePurgeCtx } from './als-registry.js';\n\n/**\n * Run a function with Workers Cache purge context available.\n *\n * Called by the generated Cloudflare _worker.js entry to bind\n * `ctx.cache` for the request duration.\n */\nexport function runWithWorkersCachePurge<T>(ctx: WorkersCachePurgeCtx, fn: () => T): T {\n return workersCachePurgeAls.run(ctx, fn);\n}\n\n/**\n * Get the current request's Workers Cache context, if available.\n *\n * Returns undefined outside a Cloudflare Workers request context\n * or on platforms without Workers Cache support.\n */\nexport function getWorkersCachePurgeCtx(): WorkersCachePurgeCtx | undefined {\n return workersCachePurgeAls.getStore();\n}\n","/**\n * Cloudflare Workers Cache purge handler — purges by cache tag via\n * ctx.cache.purge() on the ExecutionContext.\n *\n * Available on ALL Cloudflare plans (no Enterprise requirement).\n * No API token needed — uses the Workers runtime's built-in cache API.\n *\n * Auto-wired by the Cloudflare adapter when no user-configured CDN\n * purge handler is set. Uses the Workers Cache ALS bridge to access\n * ctx.cache from within the request context.\n */\n\nimport type { CdnPurgeHandler } from './purge-store';\nimport { getWorkersCachePurgeCtx } from '../server/workers-cache-bridge.js';\n\nexport class WorkersCachePurge implements CdnPurgeHandler {\n async purgeTags(tags: string[]): Promise<void> {\n if (tags.length === 0) return;\n\n const ctx = getWorkersCachePurgeCtx();\n if (!ctx) {\n throw new Error(\n 'WorkersCachePurge: no Workers Cache context available. ' +\n 'This handler can only be used within a Cloudflare Workers request context.'\n );\n }\n\n await ctx.purge({ tags });\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AA8BA,SAAgB,0BAA4D;CAC1E,OAAO,qBAAqB,SAAS;AACvC;;;ACjBA,IAAa,oBAAb,MAA0D;CACxD,MAAM,UAAU,MAA+B;EAC7C,IAAI,KAAK,WAAW,GAAG;EAEvB,MAAM,MAAM,wBAAwB;EACpC,IAAI,CAAC,KACH,MAAM,IAAI,MACR,mIAEF;EAGF,MAAM,IAAI,MAAM,EAAE,KAAK,CAAC;CAC1B;AACF"}
@@ -0,0 +1,153 @@
1
+ /**
2
+ * `timber check` — the implementation behind the CLI command.
3
+ *
4
+ * Two passes, in order:
5
+ *
6
+ * 1. **Routes.** Resolve the project through Vite — so root, `appDir`, and
7
+ * `pageExtensions` are the ones `timber build` uses, including config
8
+ * passed inline to `timber()` — then scan, run the convention linter, and
9
+ * write the route codegen (`.timber/timber-routes.d.ts`,
10
+ * `.timber/segment-types.d.ts`, `timber-env.d.ts`).
11
+ *
12
+ * Codegen runs *before* the type pass on purpose: those
13
+ * files are what give `<Link href>`, `useSegmentParams()` and
14
+ * `MiddlewareContext` their per-route types (design/09-typescript.md
15
+ * §"Typed Routes"), and they are build artifacts — a fresh clone that has
16
+ * never run `timber dev` or `timber build` does not have them, so a type
17
+ * pass on its own would report errors about correct code. A clone whose
18
+ * routes changed since the last build has the same problem with stale ones.
19
+ * 2. **Types.** `tsgo --noEmit` over the project.
20
+ *
21
+ * tsgo is spawned as `node <@typescript/native-preview>/lib/tsgo.js`, never as
22
+ * a bare `tsgo` off PATH — the package is an *optional peer dependency*, so
23
+ * there is no reason for its shim to be on a user's PATH, and the shim is a
24
+ * `.cmd` on Windows which cannot be spawned without a shell. `shell: true`
25
+ * would then concatenate the argv into an unescaped command string, so a
26
+ * project path containing a space would break on exactly the platform the
27
+ * shell was there to support. This mirrors `scripts/build-types.js`, whose
28
+ * header comment is the specification for the pattern.
29
+ *
30
+ * Design docs: 11-platform.md §CLI, 09-typescript.md, 28-npm-packaging.md
31
+ */
32
+ /**
33
+ * Run the compiler to completion.
34
+ *
35
+ * Resolves with its exit status (`null` when a signal killed it) and rejects
36
+ * only when the process could not be started — the two outcomes `runTypeCheck`
37
+ * has to keep apart. The seam is this narrow on purpose: a test double is a
38
+ * plain async function, with no `ChildProcess` shape to imitate.
39
+ */
40
+ export type RunTsgo = (command: string, args: string[], cwd: string) => Promise<number | null>;
41
+ /**
42
+ * Run the compiler and capture its stdout — used for `--showConfig`, whose
43
+ * output is data we read rather than diagnostics the user reads.
44
+ */
45
+ export type ReadTsgoConfig = (command: string, args: string[], cwd: string) => Promise<string>;
46
+ /**
47
+ * Vite's own `resolveConfig`, narrowed to what this module passes and reads.
48
+ *
49
+ * The seam sits at `resolveConfig` rather than at "give me the plugins" so the
50
+ * *arguments* are the thing under test: which config file, which command, and
51
+ * which mode defaults. Those arguments have been wrong three separate times
52
+ * (TIM-1332 rounds 4-6), and a double that answered "here are the plugins"
53
+ * could not see any of it. The double returns what Vite returns — plugins with
54
+ * an opaque `api` — so the lookup and narrowing under test stay the real ones.
55
+ */
56
+ export type ResolveViteConfig = (inlineConfig: {
57
+ configFile: string | undefined;
58
+ }, command: 'build', defaultMode: string, defaultNodeEnv: string) => Promise<{
59
+ plugins: readonly PluginWithApi[];
60
+ }>;
61
+ /** @internal Dependency injection for testing. */
62
+ export interface CheckDeps {
63
+ /**
64
+ * Resolve tsgo's own JS entry point. Throws when the package is not
65
+ * installed — the caller turns that into an install instruction.
66
+ */
67
+ resolveTsgoEntry?: () => string;
68
+ runTsgo?: RunTsgo;
69
+ readTsgoConfig?: ReadTsgoConfig;
70
+ resolveViteConfig?: ResolveViteConfig;
71
+ }
72
+ export interface CheckOptions {
73
+ /** Project root, for resolving tsgo. Defaults to `process.cwd()`. */
74
+ root?: string;
75
+ /**
76
+ * Path to a **tsconfig**, forwarded to tsgo as `--project` and sourced from
77
+ * the CLI's own `--project`. The route pass takes no part in it: it resolves
78
+ * the app's configuration through Vite, as `timber build` does.
79
+ */
80
+ config?: string;
81
+ }
82
+ /**
83
+ * Locate `@typescript/native-preview`'s JS entry.
84
+ *
85
+ * Resolution is attempted from this package first (it is declared an optional
86
+ * peer dependency, so a package manager links it here when the user installs
87
+ * it) and then from the project root (covering a hoisted install, or a user who
88
+ * added it without the peer link). Throws if neither finds it.
89
+ */
90
+ export declare function resolveTsgoEntry(root: string, resolveFrom?: (from: string, specifier: string) => string): string;
91
+ /** What the route pass needs from the command line. */
92
+ export interface RouteOptions {
93
+ /**
94
+ * Path to a **Vite** config file, from `--config`. Undefined means Vite's own
95
+ * discovery, the same as `timber dev`/`build` without the flag. A project
96
+ * that builds with a custom Vite config has to be checkable with it too, or
97
+ * `check` resolves a different app than `build` does (TIM-1332, round 4).
98
+ */
99
+ viteConfigFile?: string;
100
+ }
101
+ /** Everything the route scan needs, as the build itself resolves it. */
102
+ export interface RouteInputs {
103
+ root: string;
104
+ appDir: string;
105
+ pageExtensions: string[] | undefined;
106
+ }
107
+ /** The subset of a resolved Vite plugin this module reads. */
108
+ export interface PluginWithApi {
109
+ name: string;
110
+ api?: unknown;
111
+ }
112
+ /**
113
+ * Resolve root, appDir and pageExtensions the way `timber build` resolves them.
114
+ *
115
+ * Reading `timber.config.ts` directly is **not** equivalent, which is the whole
116
+ * reason this goes through Vite (TIM-1332, review round 3):
117
+ *
118
+ * - Config passed inline — `timber({ pageExtensions: [...] })` in
119
+ * `vite.config.ts` — lives only in the plugin's closure. Nothing that
120
+ * re-reads the config file can see it, so a scan built that way silently uses
121
+ * default page extensions and writes a route map missing the app's pages.
122
+ * `examples/next-playground-migration` is exactly this shape.
123
+ * - `root` is Vite's resolved root, not the caller's cwd, and the two differ in
124
+ * the monorepo layouts TIM-498 describes. `appDir` resolves against it.
125
+ *
126
+ * There is no fallback to a second, hand-rolled resolution. A project whose
127
+ * Vite config does not produce the timber plugin cannot be built either, so a
128
+ * check that quietly proceeded on a guessed tree would report a verdict about
129
+ * an app that does not exist.
130
+ */
131
+ export declare function resolveRouteInputs(options?: RouteOptions, deps?: CheckDeps): Promise<RouteInputs>;
132
+ /**
133
+ * Resolve the app directory, scan it, fail on proven-fatal route
134
+ * misconfigurations, print warnings, and write the route codegen the type pass
135
+ * depends on.
136
+ *
137
+ * Error-level lint findings throw rather than print, matching what
138
+ * `plugins/routing.ts` does at build time: the tree is not fit to publish, so
139
+ * it must not reach codegen either. Warnings are printed and do not fail the
140
+ * command — same severity contract as dev and build, so `timber check` cannot
141
+ * disagree with them about what a valid app is.
142
+ */
143
+ export declare function checkRoutes(options?: RouteOptions, deps?: CheckDeps): Promise<RouteInputs>;
144
+ /**
145
+ * Run `tsgo --noEmit`, streaming its output.
146
+ *
147
+ * Rejects with the real numeric exit status on type errors. A failure to *start*
148
+ * the compiler is reported separately — the historical bug this replaces
149
+ * surfaced ENOENT as "Type check failed with exit code undefined", which read
150
+ * as a type error and sent users looking at their own code.
151
+ */
152
+ export declare function runTypeCheck(options?: CheckOptions, deps?: CheckDeps): Promise<void>;
153
+ //# sourceMappingURL=cli-check.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-check.d.ts","sourceRoot":"","sources":["../src/cli-check.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAuBH;;;;;;;GAOG;AACH,MAAM,MAAM,OAAO,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;AAE/F;;;GAGG;AACH,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;AAE/F;;;;;;;;;GASG;AACH,MAAM,MAAM,iBAAiB,GAAG,CAC9B,YAAY,EAAE;IAAE,UAAU,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,EAChD,OAAO,EAAE,OAAO,EAChB,WAAW,EAAE,MAAM,EACnB,cAAc,EAAE,MAAM,KACnB,OAAO,CAAC;IAAE,OAAO,EAAE,SAAS,aAAa,EAAE,CAAA;CAAE,CAAC,CAAC;AAEpD,kDAAkD;AAClD,MAAM,WAAW,SAAS;IACxB;;;OAGG;IACH,gBAAgB,CAAC,EAAE,MAAM,MAAM,CAAC;IAChC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;CACvC;AAED,MAAM,WAAW,YAAY;IAC3B,qEAAqE;IACrE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,MAAM,EACZ,WAAW,GAAE,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,MACV,GACvC,MAAM,CAwBR;AAED,uDAAuD;AACvD,MAAM,WAAW,YAAY;IAC3B;;;;;OAKG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,wEAAwE;AACxE,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;CACtC;AAED,8DAA8D;AAC9D,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAkCD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,GAAE,YAAiB,EAC1B,IAAI,GAAE,SAAc,GACnB,OAAO,CAAC,WAAW,CAAC,CAwBtB;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,WAAW,CAC/B,OAAO,GAAE,YAAiB,EAC1B,IAAI,GAAE,SAAc,GACnB,OAAO,CAAC,WAAW,CAAC,CA+BtB;AAqGD;;;;;;;GAOG;AACH,wBAAsB,YAAY,CAChC,OAAO,GAAE,YAAiB,EAC1B,IAAI,GAAE,SAAc,GACnB,OAAO,CAAC,IAAI,CAAC,CAiDf"}
package/dist/cli.d.ts CHANGED
@@ -1,23 +1,40 @@
1
1
  #!/usr/bin/env node
2
+ import type { CheckDeps } from './cli-check.js';
3
+ export type { CheckDeps };
2
4
  declare const COMMANDS: readonly ['dev', 'build', 'preview', 'check', 'schema', 'init'];
3
5
  type Command = (typeof COMMANDS)[number];
4
6
  export interface ParsedArgs {
5
7
  command: Command;
6
8
  config: string | undefined;
9
+ /** `--project`: the tsconfig `timber check` passes to tsgo. */
10
+ project: string | undefined;
7
11
  /** Positional arguments after the command (used by `timber schema sync`). */
8
12
  rest: string[];
9
13
  }
10
14
  export interface CommandOptions {
15
+ /** Path to a Vite config file. Means the same thing for every command. */
11
16
  config?: string;
17
+ /** `timber check` only: the tsconfig to type-check. */
18
+ project?: string;
12
19
  }
13
20
  /**
14
21
  * Parse CLI arguments into a structured command + options.
15
- * Accepts: timber <command> [--config|-c <path>]
22
+ * Accepts: timber <command> [--config|-c <path>] [--project <path>]
23
+ *
24
+ * `--config` names a **Vite** config file for every command, `check` included
25
+ * (TIM-1332): `check` resolves the project through Vite, so a project that
26
+ * builds with `--config ./custom.vite.config.ts` has to be checkable the same
27
+ * way. `--project` names the tsconfig, spelled as tsgo and tsc spell it, and
28
+ * is meaningful only for `check`.
29
+ *
30
+ * Before TIM-1332 `--config` meant the tsconfig for `check` alone — one flag
31
+ * with two meanings, which the docs had to carry a note to explain and which
32
+ * left custom Vite configs unreachable from `check` entirely.
16
33
  *
17
34
  * Unknown flags are an error, not silently ignored — `timber dev --port 4000`
18
- * starting on the default port would contradict fail-loudly. The CLI surface
19
- * is intentionally --config-only (design/11-platform.md §CLI); port selection
20
- * goes through the PORT env var or server.port in vite.config.ts.
35
+ * starting on the default port would contradict fail-loudly. The surface stays
36
+ * deliberately small (design/11-platform.md §CLI); port selection goes through
37
+ * the PORT env var or server.port in vite.config.ts.
21
38
  */
22
39
  export declare function parseArgs(args: string[]): ParsedArgs;
23
40
  /** @internal Dependency injection for testing. */
@@ -59,10 +76,20 @@ export declare function resolvePreviewStrategy(adapter: import('./adapters/types
59
76
  */
60
77
  export declare function runPreview(options: CommandOptions, _deps?: ViteDeps): Promise<void>;
61
78
  /**
62
- * Validate types and routes without producing build output.
63
- * Runs tsgo --noEmit for type checking.
79
+ * Validate routes and types without producing build output.
80
+ *
81
+ * Runs the route pass first — resolve the project through Vite, scan it, fail
82
+ * on proven-fatal convention errors, print warnings, and regenerate the route
83
+ * types — then `tsgo --noEmit`. Codegen has to precede the type pass: the
84
+ * generated `.timber/*.d.ts` files are what type `<Link href>` and
85
+ * `useSegmentParams()`, and a fresh clone has never produced them. See
86
+ * `cli-check.ts` for the full reasoning.
87
+ *
88
+ * `--config` names the **Vite** config, as it does for every other command, so
89
+ * an app that builds with a custom one is checkable the same way.
90
+ * `--project` names the tsconfig handed to tsgo.
64
91
  */
65
- export declare function runCheck(options: CommandOptions): Promise<void>;
92
+ export declare function runCheck(options: CommandOptions, _deps?: CheckDeps): Promise<void>;
66
93
  /**
67
94
  * `timber schema sync` — scan filesystem for dynamic segments, diff against
68
95
  * app/schema.ts, and append missing entries with type-appropriate codec defaults.
@@ -79,5 +106,4 @@ export declare function runSchema(args: string[]): Promise<void>;
79
106
  * stays in sync with the installed version.
80
107
  */
81
108
  export declare function runInit(): Promise<void>;
82
- export {};
83
109
  //# sourceMappingURL=cli.d.ts.map
package/dist/cli.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAaA,QAAA,MAAM,QAAQ,YAAI,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAU,CAAC;AACjF,KAAK,OAAO,GAAG,CAAC,OAAO,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC;AAEzC,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,6EAA6E;IAC7E,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;GAQG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,UAAU,CAsCpD;AAID,kDAAkD;AAClD,MAAM,WAAW,QAAQ;IACvB,YAAY,CAAC,EAAE,cAAc,MAAM,EAAE,YAAY,CAAC;IAClD,aAAa,CAAC,EAAE,cAAc,MAAM,EAAE,aAAa,CAAC;IACpD,OAAO,CAAC,EAAE,cAAc,MAAM,EAAE,OAAO,CAAC;CACzC;AAED;;;;;;;;GAQG;AACH,wBAAsB,MAAM,CAAC,OAAO,EAAE,cAAc,EAAE,KAAK,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAOrF;AAED;;;;GAIG;AACH,wBAAsB,QAAQ,CAAC,OAAO,EAAE,cAAc,EAAE,KAAK,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAMvF;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,OAAO,kBAAkB,EAAE,qBAAqB,GAAG,SAAS,GACpE,SAAS,GAAG,MAAM,CAKpB;AAED;;;;;;;;;GASG;AACH,wBAAsB,UAAU,CAAC,OAAO,EAAE,cAAc,EAAE,KAAK,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAoBzF;AAED;;;GAGG;AACH,wBAAsB,QAAQ,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAerE;AAID;;;;;GAKG;AACH,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA6C7D;AAID;;;;;;;GAOG;AACH,wBAAsB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAsD7C"}
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAeA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhD,YAAY,EAAE,SAAS,EAAE,CAAC;AAE1B,QAAA,MAAM,QAAQ,YAAI,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAU,CAAC;AACjF,KAAK,OAAO,GAAG,CAAC,OAAO,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC;AAEzC,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,+DAA+D;IAC/D,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,6EAA6E;IAC7E,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAED,MAAM,WAAW,cAAc;IAC7B,0EAA0E;IAC1E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,uDAAuD;IACvD,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,UAAU,CAmDpD;AAID,kDAAkD;AAClD,MAAM,WAAW,QAAQ;IACvB,YAAY,CAAC,EAAE,cAAc,MAAM,EAAE,YAAY,CAAC;IAClD,aAAa,CAAC,EAAE,cAAc,MAAM,EAAE,aAAa,CAAC;IACpD,OAAO,CAAC,EAAE,cAAc,MAAM,EAAE,OAAO,CAAC;CACzC;AAED;;;;;;;;GAQG;AACH,wBAAsB,MAAM,CAAC,OAAO,EAAE,cAAc,EAAE,KAAK,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAOrF;AAED;;;;GAIG;AACH,wBAAsB,QAAQ,CAAC,OAAO,EAAE,cAAc,EAAE,KAAK,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAMvF;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,OAAO,kBAAkB,EAAE,qBAAqB,GAAG,SAAS,GACpE,SAAS,GAAG,MAAM,CAKpB;AAED;;;;;;;;;GASG;AACH,wBAAsB,UAAU,CAAC,OAAO,EAAE,cAAc,EAAE,KAAK,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAoBzF;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,QAAQ,CAAC,OAAO,EAAE,cAAc,EAAE,KAAK,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAMxF;AAID;;;;;GAKG;AACH,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA6C7D;AAID;;;;;;;GAOG;AACH,wBAAsB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAsD7C"}
package/dist/cli.js CHANGED
@@ -10,31 +10,47 @@ var COMMANDS = [
10
10
  ];
11
11
  /**
12
12
  * Parse CLI arguments into a structured command + options.
13
- * Accepts: timber <command> [--config|-c <path>]
13
+ * Accepts: timber <command> [--config|-c <path>] [--project <path>]
14
+ *
15
+ * `--config` names a **Vite** config file for every command, `check` included
16
+ * (TIM-1332): `check` resolves the project through Vite, so a project that
17
+ * builds with `--config ./custom.vite.config.ts` has to be checkable the same
18
+ * way. `--project` names the tsconfig, spelled as tsgo and tsc spell it, and
19
+ * is meaningful only for `check`.
20
+ *
21
+ * Before TIM-1332 `--config` meant the tsconfig for `check` alone — one flag
22
+ * with two meanings, which the docs had to carry a note to explain and which
23
+ * left custom Vite configs unreachable from `check` entirely.
14
24
  *
15
25
  * Unknown flags are an error, not silently ignored — `timber dev --port 4000`
16
- * starting on the default port would contradict fail-loudly. The CLI surface
17
- * is intentionally --config-only (design/11-platform.md §CLI); port selection
18
- * goes through the PORT env var or server.port in vite.config.ts.
26
+ * starting on the default port would contradict fail-loudly. The surface stays
27
+ * deliberately small (design/11-platform.md §CLI); port selection goes through
28
+ * the PORT env var or server.port in vite.config.ts.
19
29
  */
20
30
  function parseArgs(args) {
21
31
  if (args.length === 0) throw new Error("No command provided. Usage: timber <dev|build|preview|check|schema|init> [--config <path>]");
22
32
  const command = args[0];
23
33
  if (!COMMANDS.includes(command)) throw new Error(`Unknown command: ${command}. Available commands: ${COMMANDS.join(", ")}`);
24
34
  let config;
35
+ let project;
25
36
  const rest = [];
26
37
  for (let i = 1; i < args.length; i++) {
27
38
  const arg = args[i];
28
39
  if (arg === "--config" || arg === "-c") {
29
40
  config = args[++i];
30
41
  if (!config) throw new Error("--config requires a path argument");
31
- } else if (arg.startsWith("-")) throw new Error(`Unknown option: ${arg}. The timber CLI only accepts --config <path>.${arg === "--port" || arg === "-p" ? " To change the port, set the PORT environment variable (PORT=4000 timber dev) or server.port in vite.config.ts." : ""}`);
42
+ } else if (arg === "--project") {
43
+ if (command !== "check") throw new Error(`--project is only valid for \`timber check\` (it names the tsconfig to type-check). To point \`timber ${command}\` at a different Vite config, use --config <path>.`);
44
+ project = args[++i];
45
+ if (!project) throw new Error("--project requires a path argument");
46
+ } else if (arg.startsWith("-")) throw new Error(`Unknown option: ${arg}. The timber CLI accepts --config <path> (and --project <path> for \`check\`).${arg === "--port" || arg === "-p" ? " To change the port, set the PORT environment variable (PORT=4000 timber dev) or server.port in vite.config.ts." : ""}`);
32
47
  else if (command === "schema" || command === "init") rest.push(arg);
33
48
  else throw new Error(`Unexpected argument: ${arg}. Usage: timber ${command} [--config <path>]`);
34
49
  }
35
50
  return {
36
51
  command,
37
52
  config,
53
+ project,
38
54
  rest
39
55
  };
40
56
  }
@@ -79,7 +95,7 @@ function resolvePreviewStrategy(adapter) {
79
95
  * Vite preview. See TIM-1066.
80
96
  */
81
97
  async function runPreview(options, _deps) {
82
- const { loadTimberConfigFile, resolveBuildDir } = await import("./_chunks/plugin-context---kTF5v8.js").then((n) => n.i);
98
+ const { loadTimberConfigFile, resolveBuildDir } = await import("./_chunks/plugin-context-rCinWLiE.js").then((n) => n.a);
83
99
  const root = process.cwd();
84
100
  const config = loadTimberConfigFile(root);
85
101
  const adapter = config?.adapter;
@@ -92,20 +108,26 @@ async function runPreview(options, _deps) {
92
108
  (await (_deps?.preview ?? (await import("vite")).preview)({ configFile: options.config })).printUrls();
93
109
  }
94
110
  /**
95
- * Validate types and routes without producing build output.
96
- * Runs tsgo --noEmit for type checking.
111
+ * Validate routes and types without producing build output.
112
+ *
113
+ * Runs the route pass first — resolve the project through Vite, scan it, fail
114
+ * on proven-fatal convention errors, print warnings, and regenerate the route
115
+ * types — then `tsgo --noEmit`. Codegen has to precede the type pass: the
116
+ * generated `.timber/*.d.ts` files are what type `<Link href>` and
117
+ * `useSegmentParams()`, and a fresh clone has never produced them. See
118
+ * `cli-check.ts` for the full reasoning.
119
+ *
120
+ * `--config` names the **Vite** config, as it does for every other command, so
121
+ * an app that builds with a custom one is checkable the same way.
122
+ * `--project` names the tsconfig handed to tsgo.
97
123
  */
98
- async function runCheck(options) {
99
- const { execFile } = await import("node:child_process");
100
- await new Promise((resolve, reject) => {
101
- const configArgs = options.config ? ["--project", options.config] : [];
102
- execFile("tsgo", ["--noEmit", ...configArgs], (err, stdout, stderr) => {
103
- if (stdout) process.stdout.write(stdout);
104
- if (stderr) process.stderr.write(stderr);
105
- if (err) reject(/* @__PURE__ */ new Error(`Type check failed with exit code ${err.code}`));
106
- else resolve();
107
- });
108
- });
124
+ async function runCheck(options, _deps) {
125
+ const { checkRoutes, runTypeCheck } = await import("./_chunks/cli-check-CpmN7Nh-.js");
126
+ const { root } = await checkRoutes({ viteConfigFile: options.config }, _deps);
127
+ await runTypeCheck({
128
+ root,
129
+ config: options.project
130
+ }, _deps);
109
131
  }
110
132
  /**
111
133
  * `timber schema sync` — scan filesystem for dynamic segments, diff against
@@ -116,7 +138,7 @@ async function runCheck(options) {
116
138
  async function runSchema(args) {
117
139
  const subcommand = args[0];
118
140
  if (subcommand !== "sync") throw new Error(`Unknown schema subcommand: ${subcommand ?? "(none)"}. Usage: timber schema sync`);
119
- const { runSchemaSync, defaultCodecForSegment } = await import("./_chunks/cli-schema-sync-BTWEKJXo.js").then((n) => n.t);
141
+ const { runSchemaSync, defaultCodecForSegment } = await import("./_chunks/cli-schema-sync-CGMp_Psg.js").then((n) => n.t);
120
142
  const result = runSchemaSync(process.cwd());
121
143
  if (result.filesystemSegments.length === 0) {
122
144
  console.log("[timber] No dynamic segments found in app/.");
@@ -179,7 +201,10 @@ async function runInit() {
179
201
  }
180
202
  async function main() {
181
203
  const parsed = parseArgs(process.argv.slice(2));
182
- const options = { config: parsed.config };
204
+ const options = {
205
+ config: parsed.config,
206
+ project: parsed.project
207
+ };
183
208
  switch (parsed.command) {
184
209
  case "dev":
185
210
  await runDev(options);
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","names":[],"sources":["../src/cli.ts"],"sourcesContent":["#!/usr/bin/env node\n\n// timber.js CLI\n//\n// Wraps Vite commands with timber-specific behavior.\n// See design/18-build-system.md §\"CLI\".\n//\n// Commands:\n// timber dev — Start Vite dev server with HMR\n// timber build — Run multi-environment build via createBuilder/buildApp\n// timber preview — Serve the production build\n// timber check — Validate types + routes without building\n\nconst COMMANDS = ['dev', 'build', 'preview', 'check', 'schema', 'init'] as const;\ntype Command = (typeof COMMANDS)[number];\n\nexport interface ParsedArgs {\n command: Command;\n config: string | undefined;\n /** Positional arguments after the command (used by `timber schema sync`). */\n rest: string[];\n}\n\nexport interface CommandOptions {\n config?: string;\n}\n\n/**\n * Parse CLI arguments into a structured command + options.\n * Accepts: timber <command> [--config|-c <path>]\n *\n * Unknown flags are an error, not silently ignored — `timber dev --port 4000`\n * starting on the default port would contradict fail-loudly. The CLI surface\n * is intentionally --config-only (design/11-platform.md §CLI); port selection\n * goes through the PORT env var or server.port in vite.config.ts.\n */\nexport function parseArgs(args: string[]): ParsedArgs {\n if (args.length === 0) {\n throw new Error(\n 'No command provided. Usage: timber <dev|build|preview|check|schema|init> [--config <path>]'\n );\n }\n\n const command = args[0];\n if (!COMMANDS.includes(command as Command)) {\n throw new Error(`Unknown command: ${command}. Available commands: ${COMMANDS.join(', ')}`);\n }\n\n let config: string | undefined;\n const rest: string[] = [];\n for (let i = 1; i < args.length; i++) {\n const arg = args[i];\n if (arg === '--config' || arg === '-c') {\n config = args[++i];\n if (!config) {\n throw new Error('--config requires a path argument');\n }\n } else if (arg.startsWith('-')) {\n const portHint =\n arg === '--port' || arg === '-p'\n ? ' To change the port, set the PORT environment variable (PORT=4000 timber dev) ' +\n 'or server.port in vite.config.ts.'\n : '';\n throw new Error(\n `Unknown option: ${arg}. The timber CLI only accepts --config <path>.${portHint}`\n );\n } else if (command === 'schema' || command === 'init') {\n rest.push(arg);\n } else {\n throw new Error(`Unexpected argument: ${arg}. Usage: timber ${command} [--config <path>]`);\n }\n }\n\n return { command: command as Command, config, rest };\n}\n\n// ─── Command Implementations ─────────────────────────────────────────────────\n\n/** @internal Dependency injection for testing. */\nexport interface ViteDeps {\n createServer?: typeof import('vite').createServer;\n createBuilder?: typeof import('vite').createBuilder;\n preview?: typeof import('vite').preview;\n}\n\n/**\n * Start the Vite dev server.\n *\n * The timber plugin binds the port immediately with a holding page\n * (in rootSync's config hook) so browsers see a \"starting...\" page\n * instead of ERR_CONNECTION_REFUSED during initialization.\n *\n * See design/21-dev-server.md, TIM-665.\n */\nexport async function runDev(options: CommandOptions, _deps?: ViteDeps): Promise<void> {\n const createServer = _deps?.createServer ?? (await import('vite')).createServer;\n const server = await createServer({\n configFile: options.config,\n });\n await server.listen();\n server.printUrls();\n}\n\n/**\n * Run the production build using createBuilder + buildApp.\n * Direct build() calls do NOT trigger the RSC plugin's multi-environment\n * pipeline — createBuilder/buildApp is required.\n */\nexport async function runBuild(options: CommandOptions, _deps?: ViteDeps): Promise<void> {\n const createBuilder = _deps?.createBuilder ?? (await import('vite')).createBuilder;\n const builder = await createBuilder({\n configFile: options.config,\n });\n await builder.buildApp();\n}\n\n/**\n * Determine whether to use the adapter's preview or Vite's built-in preview.\n * Exported for testing — the actual runPreview function uses this internally.\n */\nexport function resolvePreviewStrategy(\n adapter: import('./adapters/types').TimberPlatformAdapter | undefined\n): 'adapter' | 'vite' {\n if (adapter && typeof adapter.preview === 'function') {\n return 'adapter';\n }\n return 'vite';\n}\n\n/**\n * Serve the production build for local testing.\n * If the adapter provides a preview() method, it takes priority.\n * Otherwise falls back to Vite's built-in preview server.\n *\n * Uses the same loadTimberConfigFile loader as dev/build — one loader,\n * one set of module semantics. A config file that exists but fails to\n * load throws (naming the file) instead of silently degrading to plain\n * Vite preview. See TIM-1066.\n */\nexport async function runPreview(options: CommandOptions, _deps?: ViteDeps): Promise<void> {\n const { loadTimberConfigFile, resolveBuildDir } = await import('./plugin-context.js');\n\n const root = process.cwd();\n const config = loadTimberConfigFile(root);\n const adapter = config?.adapter as import('./adapters/types').TimberPlatformAdapter | undefined;\n\n if (resolvePreviewStrategy(adapter) === 'adapter') {\n const buildDir = resolveBuildDir(root, config?.buildDir);\n const timberConfig = { output: (config?.output ?? 'server') as 'server' | 'static' };\n await adapter!.preview!(timberConfig, buildDir);\n return;\n }\n\n // Fallback: Vite's built-in preview server\n const preview = _deps?.preview ?? (await import('vite')).preview;\n const server = await preview({\n configFile: options.config,\n });\n server.printUrls();\n}\n\n/**\n * Validate types and routes without producing build output.\n * Runs tsgo --noEmit for type checking.\n */\nexport async function runCheck(options: CommandOptions): Promise<void> {\n const { execFile } = await import('node:child_process');\n\n await new Promise<void>((resolve, reject) => {\n const configArgs = options.config ? ['--project', options.config] : [];\n execFile('tsgo', ['--noEmit', ...configArgs], (err, stdout, stderr) => {\n if (stdout) process.stdout.write(stdout);\n if (stderr) process.stderr.write(stderr);\n if (err) {\n reject(new Error(`Type check failed with exit code ${err.code}`));\n } else {\n resolve();\n }\n });\n });\n}\n\n// ─── Schema Subcommand ───────────────────────────────────────────────────────\n\n/**\n * `timber schema sync` — scan filesystem for dynamic segments, diff against\n * app/schema.ts, and append missing entries with type-appropriate codec defaults.\n *\n * See design/41-global-params.md §Auto-Scaffolding\n */\nexport async function runSchema(args: string[]): Promise<void> {\n const subcommand = args[0];\n\n if (subcommand !== 'sync') {\n throw new Error(\n `Unknown schema subcommand: ${subcommand ?? '(none)'}. Usage: timber schema sync`\n );\n }\n\n const { runSchemaSync, defaultCodecForSegment } = await import('./cli-schema-sync.js');\n const result = runSchemaSync(process.cwd());\n\n if (result.filesystemSegments.length === 0) {\n console.log('[timber] No dynamic segments found in app/.');\n return;\n }\n\n if (result.created) {\n console.log(`[timber] Created app/schema.ts with ${result.addedSegments.length} segment(s):`);\n for (const seg of result.addedSegments) {\n console.log(` + ${seg}: ${defaultCodecForSegment(seg)}`);\n }\n return;\n }\n\n if (result.addedSegments.length === 0 && result.removedSegments.length === 0) {\n console.log('[timber] Schema is up to date — all segments are registered.');\n return;\n }\n\n if (result.addedSegments.length > 0) {\n console.log(`[timber] Added ${result.addedSegments.length} segment(s) to app/schema.ts:`);\n for (const seg of result.addedSegments) {\n console.log(` + ${seg}: ${defaultCodecForSegment(seg)}`);\n }\n }\n\n if (result.removedSegments.length > 0) {\n console.log(\n `[timber] Removed ${result.removedSegments.length} stale segment(s) from app/schema.ts:`\n );\n for (const seg of result.removedSegments) {\n console.log(` - ${seg}`);\n }\n }\n}\n\n// ─── Init Subcommand ─────────────────────────────────────────────────────────\n\n/**\n * `timber init` — write AGENTS.md (and a CLAUDE.md symlink to it) to the\n * project root so AI coding agents can discover timber.js documentation and\n * conventions.\n *\n * The content is read from the installed @timber-js/app package itself, so it\n * stays in sync with the installed version.\n */\nexport async function runInit(): Promise<void> {\n const { readFileSync, writeFileSync, existsSync, symlinkSync } = await import('node:fs');\n const { resolve, dirname } = await import('node:path');\n const { fileURLToPath } = await import('node:url');\n\n const root = process.cwd();\n const packageRoot = resolve(dirname(fileURLToPath(import.meta.url)), '..');\n\n const agentSkillPath = resolve(packageRoot, 'agent-skill.md');\n if (!existsSync(agentSkillPath)) {\n throw new Error(\n 'agent-skill.md not found in @timber-js/app package. ' +\n 'This may be a development install — try reinstalling.'\n );\n }\n\n const agentSkill = readFileSync(agentSkillPath, 'utf-8');\n\n const agentsPath = resolve(root, 'AGENTS.md');\n const claudePath = resolve(root, 'CLAUDE.md');\n\n const wrote: string[] = [];\n\n if (existsSync(agentsPath)) {\n console.log('[timber] AGENTS.md already exists — skipping (delete it first to regenerate)');\n } else {\n writeFileSync(agentsPath, agentSkill);\n wrote.push('AGENTS.md');\n }\n\n if (existsSync(claudePath)) {\n console.log('[timber] CLAUDE.md already exists — skipping (delete it first to regenerate)');\n } else {\n try {\n // Relative target so the link survives the project directory moving.\n // The 'file' type argument is required for Windows (ignored elsewhere).\n symlinkSync('AGENTS.md', claudePath, 'file');\n wrote.push('CLAUDE.md (symlink)');\n } catch {\n // Windows without Developer Mode or admin rights can't create symlinks\n // (EPERM) — fall back to a plain pointer file.\n writeFileSync(claudePath, 'Read AGENTS.md for project context and conventions.\\n');\n wrote.push('CLAUDE.md');\n }\n }\n\n if (wrote.length > 0) {\n console.log(\n `[timber] Created ${wrote.join(' and ')} — AI agents can now discover timber.js docs.`\n );\n console.log('[timber] Full documentation: node_modules/@timber-js/app/docs/');\n } else {\n console.log('[timber] Nothing to do — both files already exist.');\n }\n}\n\n// ─── Main Entry Point ────────────────────────────────────────────────────────\n\nasync function main(): Promise<void> {\n const parsed = parseArgs(process.argv.slice(2));\n const options: CommandOptions = { config: parsed.config };\n\n switch (parsed.command) {\n case 'dev':\n await runDev(options);\n break;\n case 'build':\n await runBuild(options);\n break;\n case 'preview':\n await runPreview(options);\n break;\n case 'check':\n await runCheck(options);\n break;\n case 'schema':\n await runSchema(parsed.rest);\n break;\n case 'init':\n await runInit();\n break;\n }\n}\n\n// Run main when executed as a CLI (not imported in tests).\n// The bin shim (bin/timber.mjs) does `import '../dist/cli.js'`, so\n// process.argv[1] points to the shim, not this file. We check both:\n// direct execution AND being imported by the timber bin shim.\nconst isDirectExecution =\n typeof process !== 'undefined' &&\n process.argv[1] &&\n (import.meta.url.endsWith(process.argv[1]) ||\n process.argv[1].endsWith('bin/timber.mjs') ||\n process.argv[1].endsWith('bin/timber'));\n\nif (isDirectExecution) {\n main().catch((err) => {\n console.error(err.message);\n process.exit(1);\n });\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","names":[],"sources":["../src/cli.ts"],"sourcesContent":["#!/usr/bin/env node\n\n// timber.js CLI\n//\n// Wraps Vite commands with timber-specific behavior.\n// See design/18-build-system.md §\"CLI\".\n//\n// Commands:\n// timber dev — Start Vite dev server with HMR\n// timber build — Run multi-environment build via createBuilder/buildApp\n// timber preview — Serve the production build\n// timber check — Validate types + routes without building\n\n// Type-only — the implementation is imported dynamically inside runCheck so the\n// CLI's other commands never load the route scanner.\nimport type { CheckDeps } from './cli-check.js';\n\nexport type { CheckDeps };\n\nconst COMMANDS = ['dev', 'build', 'preview', 'check', 'schema', 'init'] as const;\ntype Command = (typeof COMMANDS)[number];\n\nexport interface ParsedArgs {\n command: Command;\n config: string | undefined;\n /** `--project`: the tsconfig `timber check` passes to tsgo. */\n project: string | undefined;\n /** Positional arguments after the command (used by `timber schema sync`). */\n rest: string[];\n}\n\nexport interface CommandOptions {\n /** Path to a Vite config file. Means the same thing for every command. */\n config?: string;\n /** `timber check` only: the tsconfig to type-check. */\n project?: string;\n}\n\n/**\n * Parse CLI arguments into a structured command + options.\n * Accepts: timber <command> [--config|-c <path>] [--project <path>]\n *\n * `--config` names a **Vite** config file for every command, `check` included\n * (TIM-1332): `check` resolves the project through Vite, so a project that\n * builds with `--config ./custom.vite.config.ts` has to be checkable the same\n * way. `--project` names the tsconfig, spelled as tsgo and tsc spell it, and\n * is meaningful only for `check`.\n *\n * Before TIM-1332 `--config` meant the tsconfig for `check` alone — one flag\n * with two meanings, which the docs had to carry a note to explain and which\n * left custom Vite configs unreachable from `check` entirely.\n *\n * Unknown flags are an error, not silently ignored — `timber dev --port 4000`\n * starting on the default port would contradict fail-loudly. The surface stays\n * deliberately small (design/11-platform.md §CLI); port selection goes through\n * the PORT env var or server.port in vite.config.ts.\n */\nexport function parseArgs(args: string[]): ParsedArgs {\n if (args.length === 0) {\n throw new Error(\n 'No command provided. Usage: timber <dev|build|preview|check|schema|init> [--config <path>]'\n );\n }\n\n const command = args[0];\n if (!COMMANDS.includes(command as Command)) {\n throw new Error(`Unknown command: ${command}. Available commands: ${COMMANDS.join(', ')}`);\n }\n\n let config: string | undefined;\n let project: string | undefined;\n const rest: string[] = [];\n for (let i = 1; i < args.length; i++) {\n const arg = args[i];\n if (arg === '--config' || arg === '-c') {\n config = args[++i];\n if (!config) {\n throw new Error('--config requires a path argument');\n }\n } else if (arg === '--project') {\n if (command !== 'check') {\n throw new Error(\n `--project is only valid for \\`timber check\\` (it names the tsconfig to type-check). ` +\n `To point \\`timber ${command}\\` at a different Vite config, use --config <path>.`\n );\n }\n project = args[++i];\n if (!project) {\n throw new Error('--project requires a path argument');\n }\n } else if (arg.startsWith('-')) {\n const portHint =\n arg === '--port' || arg === '-p'\n ? ' To change the port, set the PORT environment variable (PORT=4000 timber dev) ' +\n 'or server.port in vite.config.ts.'\n : '';\n throw new Error(\n `Unknown option: ${arg}. The timber CLI accepts --config <path>` +\n ` (and --project <path> for \\`check\\`).${portHint}`\n );\n } else if (command === 'schema' || command === 'init') {\n rest.push(arg);\n } else {\n throw new Error(`Unexpected argument: ${arg}. Usage: timber ${command} [--config <path>]`);\n }\n }\n\n return { command: command as Command, config, project, rest };\n}\n\n// ─── Command Implementations ─────────────────────────────────────────────────\n\n/** @internal Dependency injection for testing. */\nexport interface ViteDeps {\n createServer?: typeof import('vite').createServer;\n createBuilder?: typeof import('vite').createBuilder;\n preview?: typeof import('vite').preview;\n}\n\n/**\n * Start the Vite dev server.\n *\n * The timber plugin binds the port immediately with a holding page\n * (in rootSync's config hook) so browsers see a \"starting...\" page\n * instead of ERR_CONNECTION_REFUSED during initialization.\n *\n * See design/21-dev-server.md, TIM-665.\n */\nexport async function runDev(options: CommandOptions, _deps?: ViteDeps): Promise<void> {\n const createServer = _deps?.createServer ?? (await import('vite')).createServer;\n const server = await createServer({\n configFile: options.config,\n });\n await server.listen();\n server.printUrls();\n}\n\n/**\n * Run the production build using createBuilder + buildApp.\n * Direct build() calls do NOT trigger the RSC plugin's multi-environment\n * pipeline — createBuilder/buildApp is required.\n */\nexport async function runBuild(options: CommandOptions, _deps?: ViteDeps): Promise<void> {\n const createBuilder = _deps?.createBuilder ?? (await import('vite')).createBuilder;\n const builder = await createBuilder({\n configFile: options.config,\n });\n await builder.buildApp();\n}\n\n/**\n * Determine whether to use the adapter's preview or Vite's built-in preview.\n * Exported for testing — the actual runPreview function uses this internally.\n */\nexport function resolvePreviewStrategy(\n adapter: import('./adapters/types').TimberPlatformAdapter | undefined\n): 'adapter' | 'vite' {\n if (adapter && typeof adapter.preview === 'function') {\n return 'adapter';\n }\n return 'vite';\n}\n\n/**\n * Serve the production build for local testing.\n * If the adapter provides a preview() method, it takes priority.\n * Otherwise falls back to Vite's built-in preview server.\n *\n * Uses the same loadTimberConfigFile loader as dev/build — one loader,\n * one set of module semantics. A config file that exists but fails to\n * load throws (naming the file) instead of silently degrading to plain\n * Vite preview. See TIM-1066.\n */\nexport async function runPreview(options: CommandOptions, _deps?: ViteDeps): Promise<void> {\n const { loadTimberConfigFile, resolveBuildDir } = await import('./plugin-context.js');\n\n const root = process.cwd();\n const config = loadTimberConfigFile(root);\n const adapter = config?.adapter as import('./adapters/types').TimberPlatformAdapter | undefined;\n\n if (resolvePreviewStrategy(adapter) === 'adapter') {\n const buildDir = resolveBuildDir(root, config?.buildDir);\n const timberConfig = { output: (config?.output ?? 'server') as 'server' | 'static' };\n await adapter!.preview!(timberConfig, buildDir);\n return;\n }\n\n // Fallback: Vite's built-in preview server\n const preview = _deps?.preview ?? (await import('vite')).preview;\n const server = await preview({\n configFile: options.config,\n });\n server.printUrls();\n}\n\n/**\n * Validate routes and types without producing build output.\n *\n * Runs the route pass first — resolve the project through Vite, scan it, fail\n * on proven-fatal convention errors, print warnings, and regenerate the route\n * types — then `tsgo --noEmit`. Codegen has to precede the type pass: the\n * generated `.timber/*.d.ts` files are what type `<Link href>` and\n * `useSegmentParams()`, and a fresh clone has never produced them. See\n * `cli-check.ts` for the full reasoning.\n *\n * `--config` names the **Vite** config, as it does for every other command, so\n * an app that builds with a custom one is checkable the same way.\n * `--project` names the tsconfig handed to tsgo.\n */\nexport async function runCheck(options: CommandOptions, _deps?: CheckDeps): Promise<void> {\n const { checkRoutes, runTypeCheck } = await import('./cli-check.js');\n const { root } = await checkRoutes({ viteConfigFile: options.config }, _deps);\n // tsgo runs from the root the route pass resolved, not from cwd — that is\n // where it just wrote the declarations tsgo has to read.\n await runTypeCheck({ root, config: options.project }, _deps);\n}\n\n// ─── Schema Subcommand ───────────────────────────────────────────────────────\n\n/**\n * `timber schema sync` — scan filesystem for dynamic segments, diff against\n * app/schema.ts, and append missing entries with type-appropriate codec defaults.\n *\n * See design/41-global-params.md §Auto-Scaffolding\n */\nexport async function runSchema(args: string[]): Promise<void> {\n const subcommand = args[0];\n\n if (subcommand !== 'sync') {\n throw new Error(\n `Unknown schema subcommand: ${subcommand ?? '(none)'}. Usage: timber schema sync`\n );\n }\n\n const { runSchemaSync, defaultCodecForSegment } = await import('./cli-schema-sync.js');\n const result = runSchemaSync(process.cwd());\n\n if (result.filesystemSegments.length === 0) {\n console.log('[timber] No dynamic segments found in app/.');\n return;\n }\n\n if (result.created) {\n console.log(`[timber] Created app/schema.ts with ${result.addedSegments.length} segment(s):`);\n for (const seg of result.addedSegments) {\n console.log(` + ${seg}: ${defaultCodecForSegment(seg)}`);\n }\n return;\n }\n\n if (result.addedSegments.length === 0 && result.removedSegments.length === 0) {\n console.log('[timber] Schema is up to date — all segments are registered.');\n return;\n }\n\n if (result.addedSegments.length > 0) {\n console.log(`[timber] Added ${result.addedSegments.length} segment(s) to app/schema.ts:`);\n for (const seg of result.addedSegments) {\n console.log(` + ${seg}: ${defaultCodecForSegment(seg)}`);\n }\n }\n\n if (result.removedSegments.length > 0) {\n console.log(\n `[timber] Removed ${result.removedSegments.length} stale segment(s) from app/schema.ts:`\n );\n for (const seg of result.removedSegments) {\n console.log(` - ${seg}`);\n }\n }\n}\n\n// ─── Init Subcommand ─────────────────────────────────────────────────────────\n\n/**\n * `timber init` — write AGENTS.md (and a CLAUDE.md symlink to it) to the\n * project root so AI coding agents can discover timber.js documentation and\n * conventions.\n *\n * The content is read from the installed @timber-js/app package itself, so it\n * stays in sync with the installed version.\n */\nexport async function runInit(): Promise<void> {\n const { readFileSync, writeFileSync, existsSync, symlinkSync } = await import('node:fs');\n const { resolve, dirname } = await import('node:path');\n const { fileURLToPath } = await import('node:url');\n\n const root = process.cwd();\n const packageRoot = resolve(dirname(fileURLToPath(import.meta.url)), '..');\n\n const agentSkillPath = resolve(packageRoot, 'agent-skill.md');\n if (!existsSync(agentSkillPath)) {\n throw new Error(\n 'agent-skill.md not found in @timber-js/app package. ' +\n 'This may be a development install — try reinstalling.'\n );\n }\n\n const agentSkill = readFileSync(agentSkillPath, 'utf-8');\n\n const agentsPath = resolve(root, 'AGENTS.md');\n const claudePath = resolve(root, 'CLAUDE.md');\n\n const wrote: string[] = [];\n\n if (existsSync(agentsPath)) {\n console.log('[timber] AGENTS.md already exists — skipping (delete it first to regenerate)');\n } else {\n writeFileSync(agentsPath, agentSkill);\n wrote.push('AGENTS.md');\n }\n\n if (existsSync(claudePath)) {\n console.log('[timber] CLAUDE.md already exists — skipping (delete it first to regenerate)');\n } else {\n try {\n // Relative target so the link survives the project directory moving.\n // The 'file' type argument is required for Windows (ignored elsewhere).\n symlinkSync('AGENTS.md', claudePath, 'file');\n wrote.push('CLAUDE.md (symlink)');\n } catch {\n // Windows without Developer Mode or admin rights can't create symlinks\n // (EPERM) — fall back to a plain pointer file.\n writeFileSync(claudePath, 'Read AGENTS.md for project context and conventions.\\n');\n wrote.push('CLAUDE.md');\n }\n }\n\n if (wrote.length > 0) {\n console.log(\n `[timber] Created ${wrote.join(' and ')} — AI agents can now discover timber.js docs.`\n );\n console.log('[timber] Full documentation: node_modules/@timber-js/app/docs/');\n } else {\n console.log('[timber] Nothing to do — both files already exist.');\n }\n}\n\n// ─── Main Entry Point ────────────────────────────────────────────────────────\n\nasync function main(): Promise<void> {\n const parsed = parseArgs(process.argv.slice(2));\n const options: CommandOptions = { config: parsed.config, project: parsed.project };\n\n switch (parsed.command) {\n case 'dev':\n await runDev(options);\n break;\n case 'build':\n await runBuild(options);\n break;\n case 'preview':\n await runPreview(options);\n break;\n case 'check':\n await runCheck(options);\n break;\n case 'schema':\n await runSchema(parsed.rest);\n break;\n case 'init':\n await runInit();\n break;\n }\n}\n\n// Run main when executed as a CLI (not imported in tests).\n// The bin shim (bin/timber.mjs) does `import '../dist/cli.js'`, so\n// process.argv[1] points to the shim, not this file. We check both:\n// direct execution AND being imported by the timber bin shim.\nconst isDirectExecution =\n typeof process !== 'undefined' &&\n process.argv[1] &&\n (import.meta.url.endsWith(process.argv[1]) ||\n process.argv[1].endsWith('bin/timber.mjs') ||\n process.argv[1].endsWith('bin/timber'));\n\nif (isDirectExecution) {\n main().catch((err) => {\n console.error(err.message);\n process.exit(1);\n });\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"action-dispatch.d.ts","sourceRoot":"","sources":["../../../src/client/browser-entry/action-dispatch.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAMH,wBAAgB,kBAAkB,IAAI,IAAI,CAuGzC"}
1
+ {"version":3,"file":"action-dispatch.d.ts","sourceRoot":"","sources":["../../../src/client/browser-entry/action-dispatch.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAQH,wBAAgB,kBAAkB,IAAI,IAAI,CA2GzC"}