alepha 0.23.0 → 0.24.0

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 (845) hide show
  1. package/assets/swagger-ui/swagger-ui-bundle.js +1 -1
  2. package/assets/swagger-ui/swagger-ui-standalone-preset.js +1 -1
  3. package/dist/api/audits/index.browser.js +49 -52
  4. package/dist/api/audits/index.browser.js.map +1 -1
  5. package/dist/api/audits/index.d.ts +629 -565
  6. package/dist/api/audits/index.d.ts.map +1 -1
  7. package/dist/api/audits/index.js +206 -98
  8. package/dist/api/audits/index.js.map +1 -1
  9. package/dist/api/files/index.browser.js +44 -44
  10. package/dist/api/files/index.browser.js.map +1 -1
  11. package/dist/api/files/index.d.ts +292 -293
  12. package/dist/api/files/index.d.ts.map +1 -1
  13. package/dist/api/files/index.js +61 -64
  14. package/dist/api/files/index.js.map +1 -1
  15. package/dist/api/jobs/index.browser.js +61 -59
  16. package/dist/api/jobs/index.browser.js.map +1 -1
  17. package/dist/api/jobs/index.d.ts +546 -347
  18. package/dist/api/jobs/index.d.ts.map +1 -1
  19. package/dist/api/jobs/index.js +165 -86
  20. package/dist/api/jobs/index.js.map +1 -1
  21. package/dist/api/keys/index.d.ts +247 -235
  22. package/dist/api/keys/index.d.ts.map +1 -1
  23. package/dist/api/keys/index.js +63 -66
  24. package/dist/api/keys/index.js.map +1 -1
  25. package/dist/api/notifications/index.browser.js +40 -38
  26. package/dist/api/notifications/index.browser.js.map +1 -1
  27. package/dist/api/notifications/index.d.ts +339 -209
  28. package/dist/api/notifications/index.d.ts.map +1 -1
  29. package/dist/api/notifications/index.js +108 -60
  30. package/dist/api/notifications/index.js.map +1 -1
  31. package/dist/api/oauth/index.d.ts +190 -78
  32. package/dist/api/oauth/index.d.ts.map +1 -1
  33. package/dist/api/oauth/index.js +290 -68
  34. package/dist/api/oauth/index.js.map +1 -1
  35. package/dist/api/organizations/index.browser.js +14 -14
  36. package/dist/api/organizations/index.browser.js.map +1 -1
  37. package/dist/api/organizations/index.d.ts +158 -134
  38. package/dist/api/organizations/index.d.ts.map +1 -1
  39. package/dist/api/organizations/index.js +18 -18
  40. package/dist/api/organizations/index.js.map +1 -1
  41. package/dist/api/parameters/index.browser.js +74 -53
  42. package/dist/api/parameters/index.browser.js.map +1 -1
  43. package/dist/api/parameters/index.d.ts +607 -513
  44. package/dist/api/parameters/index.d.ts.map +1 -1
  45. package/dist/api/parameters/index.js +205 -127
  46. package/dist/api/parameters/index.js.map +1 -1
  47. package/dist/api/payments/index.d.ts +652 -449
  48. package/dist/api/payments/index.d.ts.map +1 -1
  49. package/dist/api/payments/index.js +159 -93
  50. package/dist/api/payments/index.js.map +1 -1
  51. package/dist/api/subscriptions/index.d.ts +1032 -762
  52. package/dist/api/subscriptions/index.d.ts.map +1 -1
  53. package/dist/api/subscriptions/index.js +166 -185
  54. package/dist/api/subscriptions/index.js.map +1 -1
  55. package/dist/api/users/index.browser.js +48 -71
  56. package/dist/api/users/index.browser.js.map +1 -1
  57. package/dist/api/users/index.d.ts +1297 -1143
  58. package/dist/api/users/index.d.ts.map +1 -1
  59. package/dist/api/users/index.js +456 -392
  60. package/dist/api/users/index.js.map +1 -1
  61. package/dist/api/verifications/index.browser.js +17 -17
  62. package/dist/api/verifications/index.browser.js.map +1 -1
  63. package/dist/api/verifications/index.d.ts +167 -155
  64. package/dist/api/verifications/index.d.ts.map +1 -1
  65. package/dist/api/verifications/index.js +47 -95
  66. package/dist/api/verifications/index.js.map +1 -1
  67. package/dist/background/index.d.ts +0 -1
  68. package/dist/background/index.d.ts.map +1 -1
  69. package/dist/background/index.js.map +1 -1
  70. package/dist/background/index.workerd.js.map +1 -1
  71. package/dist/batch/index.d.ts +0 -1
  72. package/dist/batch/index.d.ts.map +1 -1
  73. package/dist/batch/index.js.map +1 -1
  74. package/dist/bin/index.js +1 -1
  75. package/dist/bin/index.js.map +1 -1
  76. package/dist/bucket/index.d.ts +27 -32
  77. package/dist/bucket/index.d.ts.map +1 -1
  78. package/dist/bucket/index.js +56 -26
  79. package/dist/bucket/index.js.map +1 -1
  80. package/dist/bucket/index.workerd.js +52 -24
  81. package/dist/bucket/index.workerd.js.map +1 -1
  82. package/dist/cache/core/index.d.ts +4 -6
  83. package/dist/cache/core/index.d.ts.map +1 -1
  84. package/dist/cache/core/index.js +4 -10
  85. package/dist/cache/core/index.js.map +1 -1
  86. package/dist/cache/core/index.workerd.js +4 -10
  87. package/dist/cache/core/index.workerd.js.map +1 -1
  88. package/dist/cache/database/index.d.ts +22 -23
  89. package/dist/cache/database/index.d.ts.map +1 -1
  90. package/dist/cache/database/index.js +11 -20
  91. package/dist/cache/database/index.js.map +1 -1
  92. package/dist/cache/redis/index.d.ts +3 -4
  93. package/dist/cache/redis/index.d.ts.map +1 -1
  94. package/dist/cache/redis/index.js +2 -2
  95. package/dist/cache/redis/index.js.map +1 -1
  96. package/dist/captcha/index.d.ts.map +1 -1
  97. package/dist/captcha/index.js +4 -4
  98. package/dist/captcha/index.js.map +1 -1
  99. package/dist/cli/config/index.d.ts +0 -1
  100. package/dist/cli/config/index.d.ts.map +1 -1
  101. package/dist/cli/core/index.d.ts +205 -442
  102. package/dist/cli/core/index.d.ts.map +1 -1
  103. package/dist/cli/core/index.js +259 -284
  104. package/dist/cli/core/index.js.map +1 -1
  105. package/dist/cli/devtools/index.d.ts +3 -9
  106. package/dist/cli/devtools/index.d.ts.map +1 -1
  107. package/dist/cli/devtools/index.js +3 -3
  108. package/dist/cli/devtools/index.js.map +1 -1
  109. package/dist/cli/i18n/index.d.ts +8 -34
  110. package/dist/cli/i18n/index.d.ts.map +1 -1
  111. package/dist/cli/i18n/index.js +6 -6
  112. package/dist/cli/i18n/index.js.map +1 -1
  113. package/dist/cli/platform/index.d.ts +89 -82
  114. package/dist/cli/platform/index.d.ts.map +1 -1
  115. package/dist/cli/platform/index.js +27 -33
  116. package/dist/cli/platform/index.js.map +1 -1
  117. package/dist/cli/platform-lib/index.d.ts +351 -404
  118. package/dist/cli/platform-lib/index.d.ts.map +1 -1
  119. package/dist/cli/platform-lib/index.js +218 -239
  120. package/dist/cli/platform-lib/index.js.map +1 -1
  121. package/dist/cli/vendor/index.d.ts +17 -41
  122. package/dist/cli/vendor/index.d.ts.map +1 -1
  123. package/dist/cli/vendor/index.js +10 -13
  124. package/dist/cli/vendor/index.js.map +1 -1
  125. package/dist/command/index.d.ts +83 -195
  126. package/dist/command/index.d.ts.map +1 -1
  127. package/dist/command/index.js +160 -563
  128. package/dist/command/index.js.map +1 -1
  129. package/dist/core/index.browser.js +845 -859
  130. package/dist/core/index.browser.js.map +1 -1
  131. package/dist/core/index.d.ts +787 -527
  132. package/dist/core/index.d.ts.map +1 -1
  133. package/dist/core/index.js +845 -859
  134. package/dist/core/index.js.map +1 -1
  135. package/dist/core/index.native.js +845 -859
  136. package/dist/core/index.native.js.map +1 -1
  137. package/dist/core/index.workerd.js +845 -859
  138. package/dist/core/index.workerd.js.map +1 -1
  139. package/dist/crypto/index.browser.js +1 -1
  140. package/dist/crypto/index.browser.js.map +1 -1
  141. package/dist/crypto/index.d.ts +3 -4
  142. package/dist/crypto/index.d.ts.map +1 -1
  143. package/dist/crypto/index.js +6 -3
  144. package/dist/crypto/index.js.map +1 -1
  145. package/dist/datetime/index.d.ts +12 -2
  146. package/dist/datetime/index.d.ts.map +1 -1
  147. package/dist/datetime/index.js +6 -1
  148. package/dist/datetime/index.js.map +1 -1
  149. package/dist/email/brevo/index.d.ts +0 -1
  150. package/dist/email/brevo/index.d.ts.map +1 -1
  151. package/dist/email/brevo/index.js +4 -4
  152. package/dist/email/brevo/index.js.map +1 -1
  153. package/dist/email/cloudflare/index.d.ts +0 -1
  154. package/dist/email/cloudflare/index.d.ts.map +1 -1
  155. package/dist/email/cloudflare/index.js +2 -2
  156. package/dist/email/cloudflare/index.js.map +1 -1
  157. package/dist/email/core/index.d.ts +15 -7
  158. package/dist/email/core/index.d.ts.map +1 -1
  159. package/dist/email/core/index.js +14 -5
  160. package/dist/email/core/index.js.map +1 -1
  161. package/dist/email/core/index.workerd.js +5 -1
  162. package/dist/email/core/index.workerd.js.map +1 -1
  163. package/dist/email/smtp/index.d.ts +8 -9
  164. package/dist/email/smtp/index.d.ts.map +1 -1
  165. package/dist/email/smtp/index.js +702 -479
  166. package/dist/email/smtp/index.js.map +1 -1
  167. package/dist/fake/index.d.ts +1580 -1238
  168. package/dist/fake/index.d.ts.map +1 -1
  169. package/dist/fake/index.js +11728 -32131
  170. package/dist/fake/index.js.map +1 -1
  171. package/dist/lock/core/index.d.ts +13 -9
  172. package/dist/lock/core/index.d.ts.map +1 -1
  173. package/dist/lock/core/index.js +5 -5
  174. package/dist/lock/core/index.js.map +1 -1
  175. package/dist/lock/redis/index.d.ts +0 -1
  176. package/dist/lock/redis/index.d.ts.map +1 -1
  177. package/dist/lock/redis/index.js.map +1 -1
  178. package/dist/logger/index.d.ts +81 -69
  179. package/dist/logger/index.d.ts.map +1 -1
  180. package/dist/logger/index.js +123 -56
  181. package/dist/logger/index.js.map +1 -1
  182. package/dist/mcp/index.d.ts +27 -90
  183. package/dist/mcp/index.d.ts.map +1 -1
  184. package/dist/mcp/index.js +42 -70
  185. package/dist/mcp/index.js.map +1 -1
  186. package/dist/orm/core/index.browser.js +54 -40
  187. package/dist/orm/core/index.browser.js.map +1 -1
  188. package/dist/orm/core/index.bun.js +140 -106
  189. package/dist/orm/core/index.bun.js.map +1 -1
  190. package/dist/orm/core/index.d.ts +145 -150
  191. package/dist/orm/core/index.d.ts.map +1 -1
  192. package/dist/orm/core/index.js +144 -109
  193. package/dist/orm/core/index.js.map +1 -1
  194. package/dist/orm/postgres/index.bun.js +64 -54
  195. package/dist/orm/postgres/index.bun.js.map +1 -1
  196. package/dist/orm/postgres/index.d.ts +36 -76
  197. package/dist/orm/postgres/index.d.ts.map +1 -1
  198. package/dist/orm/postgres/index.js +67 -57
  199. package/dist/orm/postgres/index.js.map +1 -1
  200. package/dist/queue/core/index.d.ts +62 -75
  201. package/dist/queue/core/index.d.ts.map +1 -1
  202. package/dist/queue/core/index.js +48 -71
  203. package/dist/queue/core/index.js.map +1 -1
  204. package/dist/queue/core/index.workerd.js +48 -71
  205. package/dist/queue/core/index.workerd.js.map +1 -1
  206. package/dist/queue/redis/index.d.ts +3 -4
  207. package/dist/queue/redis/index.d.ts.map +1 -1
  208. package/dist/queue/redis/index.js +2 -2
  209. package/dist/queue/redis/index.js.map +1 -1
  210. package/dist/react/auth/index.browser.js.map +1 -1
  211. package/dist/react/auth/index.d.ts +7 -4
  212. package/dist/react/auth/index.d.ts.map +1 -1
  213. package/dist/react/auth/index.js.map +1 -1
  214. package/dist/react/core/index.d.ts +87 -5
  215. package/dist/react/core/index.d.ts.map +1 -1
  216. package/dist/react/core/index.js +170 -23
  217. package/dist/react/core/index.js.map +1 -1
  218. package/dist/react/form/index.d.ts +4 -5
  219. package/dist/react/form/index.d.ts.map +1 -1
  220. package/dist/react/form/index.js +91 -56
  221. package/dist/react/form/index.js.map +1 -1
  222. package/dist/react/head/index.browser.js.map +1 -1
  223. package/dist/react/head/index.d.ts +0 -1
  224. package/dist/react/head/index.d.ts.map +1 -1
  225. package/dist/react/head/index.js.map +1 -1
  226. package/dist/react/i18n/index.d.ts +4 -5
  227. package/dist/react/i18n/index.d.ts.map +1 -1
  228. package/dist/react/i18n/index.js +2 -2
  229. package/dist/react/i18n/index.js.map +1 -1
  230. package/dist/react/intro/index.d.ts +1 -4
  231. package/dist/react/intro/index.d.ts.map +1 -1
  232. package/dist/react/intro/index.js.map +1 -1
  233. package/dist/react/router/index.browser.js +60 -24
  234. package/dist/react/router/index.browser.js.map +1 -1
  235. package/dist/react/router/index.d.ts +378 -377
  236. package/dist/react/router/index.d.ts.map +1 -1
  237. package/dist/react/router/index.js +77 -41
  238. package/dist/react/router/index.js.map +1 -1
  239. package/dist/react/sitemap/index.d.ts +0 -1
  240. package/dist/react/sitemap/index.d.ts.map +1 -1
  241. package/dist/react/sitemap/index.js.map +1 -1
  242. package/dist/react/testing/index.d.ts +4 -5
  243. package/dist/react/testing/index.d.ts.map +1 -1
  244. package/dist/react/testing/index.js +41 -15
  245. package/dist/react/testing/index.js.map +1 -1
  246. package/dist/react/testing/{chunk-BpyX8vjI.js → rolldown-runtime-Bl3dcgcQ.js} +1 -1
  247. package/dist/react/ui/index.d.ts +35 -34
  248. package/dist/react/ui/index.d.ts.map +1 -1
  249. package/dist/react/ui/index.js +12 -17
  250. package/dist/react/ui/index.js.map +1 -1
  251. package/dist/redis/index.bun.js +5 -5
  252. package/dist/redis/index.bun.js.map +1 -1
  253. package/dist/redis/index.d.ts +6 -7
  254. package/dist/redis/index.d.ts.map +1 -1
  255. package/dist/redis/index.js +6 -6
  256. package/dist/redis/index.js.map +1 -1
  257. package/dist/retry/index.d.ts +0 -1
  258. package/dist/retry/index.d.ts.map +1 -1
  259. package/dist/retry/index.js.map +1 -1
  260. package/dist/router/index.d.ts.map +1 -1
  261. package/dist/router/index.js.map +1 -1
  262. package/dist/scheduler/index.d.ts +4 -12
  263. package/dist/scheduler/index.d.ts.map +1 -1
  264. package/dist/scheduler/index.js +9 -4
  265. package/dist/scheduler/index.js.map +1 -1
  266. package/dist/scheduler/index.workerd.js +9 -4
  267. package/dist/scheduler/index.workerd.js.map +1 -1
  268. package/dist/security/index.browser.js +30 -28
  269. package/dist/security/index.browser.js.map +1 -1
  270. package/dist/security/index.d.ts +113 -44
  271. package/dist/security/index.d.ts.map +1 -1
  272. package/dist/security/index.js +452 -37
  273. package/dist/security/index.js.map +1 -1
  274. package/dist/server/auth/index.browser.js +19 -19
  275. package/dist/server/auth/index.browser.js.map +1 -1
  276. package/dist/server/auth/index.d.ts +198 -274
  277. package/dist/server/auth/index.d.ts.map +1 -1
  278. package/dist/server/auth/index.js +83 -621
  279. package/dist/server/auth/index.js.map +1 -1
  280. package/dist/server/cookies/index.browser.js +103 -5
  281. package/dist/server/cookies/index.browser.js.map +1 -1
  282. package/dist/server/cookies/index.d.ts +72 -5
  283. package/dist/server/cookies/index.d.ts.map +1 -1
  284. package/dist/server/cookies/index.js +103 -9
  285. package/dist/server/cookies/index.js.map +1 -1
  286. package/dist/server/core/index.browser.js +22 -27
  287. package/dist/server/core/index.browser.js.map +1 -1
  288. package/dist/server/core/index.d.ts +116 -85
  289. package/dist/server/core/index.d.ts.map +1 -1
  290. package/dist/server/core/index.js +105 -118
  291. package/dist/server/core/index.js.map +1 -1
  292. package/dist/server/cors/index.d.ts +9 -10
  293. package/dist/server/cors/index.d.ts.map +1 -1
  294. package/dist/server/cors/index.js +14 -26
  295. package/dist/server/cors/index.js.map +1 -1
  296. package/dist/server/etag/index.d.ts +2 -3
  297. package/dist/server/etag/index.d.ts.map +1 -1
  298. package/dist/server/etag/index.js.map +1 -1
  299. package/dist/server/health/index.d.ts +18 -19
  300. package/dist/server/health/index.d.ts.map +1 -1
  301. package/dist/server/health/index.js +6 -6
  302. package/dist/server/health/index.js.map +1 -1
  303. package/dist/server/links/index.browser.js +15 -18
  304. package/dist/server/links/index.browser.js.map +1 -1
  305. package/dist/server/links/index.d.ts +66 -67
  306. package/dist/server/links/index.d.ts.map +1 -1
  307. package/dist/server/links/index.js +29 -32
  308. package/dist/server/links/index.js.map +1 -1
  309. package/dist/server/metrics/index.d.ts +0 -1
  310. package/dist/server/metrics/index.d.ts.map +1 -1
  311. package/dist/server/metrics/index.js +10 -3
  312. package/dist/server/metrics/index.js.map +1 -1
  313. package/dist/server/proxy/index.d.ts +0 -1
  314. package/dist/server/proxy/index.d.ts.map +1 -1
  315. package/dist/server/proxy/index.js.map +1 -1
  316. package/dist/server/rate-limit/index.d.ts +8 -9
  317. package/dist/server/rate-limit/index.d.ts.map +1 -1
  318. package/dist/server/rate-limit/index.js +6 -12
  319. package/dist/server/rate-limit/index.js.map +1 -1
  320. package/dist/server/static/index.d.ts +0 -1
  321. package/dist/server/static/index.d.ts.map +1 -1
  322. package/dist/server/static/index.js.map +1 -1
  323. package/dist/server/swagger/index.d.ts +4 -4
  324. package/dist/server/swagger/index.d.ts.map +1 -1
  325. package/dist/server/swagger/index.js +37 -25
  326. package/dist/server/swagger/index.js.map +1 -1
  327. package/dist/sms/index.d.ts +0 -1
  328. package/dist/sms/index.d.ts.map +1 -1
  329. package/dist/sms/index.js.map +1 -1
  330. package/dist/system/index.browser.js.map +1 -1
  331. package/dist/system/index.d.ts +0 -1
  332. package/dist/system/index.d.ts.map +1 -1
  333. package/dist/system/index.js +2 -1
  334. package/dist/system/index.js.map +1 -1
  335. package/dist/system/index.workerd.js.map +1 -1
  336. package/dist/topic/core/index.d.ts +19 -20
  337. package/dist/topic/core/index.d.ts.map +1 -1
  338. package/dist/topic/core/index.js +8 -8
  339. package/dist/topic/core/index.js.map +1 -1
  340. package/dist/topic/redis/index.d.ts +3 -4
  341. package/dist/topic/redis/index.d.ts.map +1 -1
  342. package/dist/topic/redis/index.js +2 -2
  343. package/dist/topic/redis/index.js.map +1 -1
  344. package/package.json +22 -35
  345. package/src/api/audits/__tests__/AuditJobs.spec.ts +83 -0
  346. package/src/api/audits/__tests__/AuditService.spec.ts +139 -1
  347. package/src/api/audits/controllers/AdminAuditController.ts +41 -41
  348. package/src/api/audits/entities/audits.ts +22 -22
  349. package/src/api/audits/index.ts +6 -1
  350. package/src/api/audits/jobs/AuditJobs.ts +29 -0
  351. package/src/api/audits/parameters/AuditParameters.ts +51 -0
  352. package/src/api/audits/primitives/$audit.ts +24 -0
  353. package/src/api/audits/schemas/auditQuerySchema.ts +13 -13
  354. package/src/api/audits/schemas/createAuditSchema.ts +18 -18
  355. package/src/api/audits/services/AuditService.ts +79 -7
  356. package/src/api/files/__tests__/FileController.spec.ts +5 -5
  357. package/src/api/files/__tests__/FileJobs.spec.ts +6 -0
  358. package/src/api/files/controllers/FileController.ts +25 -25
  359. package/src/api/files/entities/files.ts +15 -15
  360. package/src/api/files/schemas/fileCreatorSummarySchema.ts +7 -7
  361. package/src/api/files/schemas/fileQuerySchema.ts +9 -9
  362. package/src/api/files/schemas/fileResourceSchema.ts +7 -9
  363. package/src/api/files/schemas/storageStatsSchema.ts +13 -13
  364. package/src/api/jobs/__tests__/$job-hardening.spec.ts +289 -0
  365. package/src/api/jobs/__tests__/$job.spec.ts +18 -18
  366. package/src/api/jobs/controllers/AdminJobController.ts +8 -8
  367. package/src/api/jobs/entities/jobExecutionEntity.ts +29 -19
  368. package/src/api/jobs/providers/JobProvider.ts +128 -12
  369. package/src/api/jobs/providers/JobQueueProvider.ts +2 -2
  370. package/src/api/jobs/schemas/jobConfigAtom.ts +22 -22
  371. package/src/api/jobs/schemas/jobExecutionQuerySchema.ts +6 -6
  372. package/src/api/jobs/schemas/jobExecutionResourceSchema.ts +11 -15
  373. package/src/api/jobs/schemas/jobRegistrationSchema.ts +20 -19
  374. package/src/api/jobs/schemas/triggerJobSchema.ts +3 -3
  375. package/src/api/jobs/services/JobService.ts +6 -6
  376. package/src/api/keys/__tests__/ApiKeyService.spec.ts +2 -2
  377. package/src/api/keys/controllers/AdminApiKeyController.ts +10 -10
  378. package/src/api/keys/entities/apiKeyEntity.ts +15 -15
  379. package/src/api/keys/schemas/adminApiKeyQuerySchema.ts +4 -4
  380. package/src/api/keys/schemas/adminApiKeyResourceSchema.ts +15 -15
  381. package/src/api/keys/schemas/createApiKeyBodySchema.ts +5 -5
  382. package/src/api/keys/schemas/createApiKeyResponseSchema.ts +9 -9
  383. package/src/api/keys/schemas/listApiKeyResponseSchema.ts +13 -13
  384. package/src/api/keys/schemas/revokeApiKeyParamsSchema.ts +3 -3
  385. package/src/api/keys/schemas/revokeApiKeyResponseSchema.ts +3 -3
  386. package/src/api/notifications/__tests__/AlephaApiNotifications.spec.ts +2 -2
  387. package/src/api/notifications/controllers/AdminNotificationController.ts +38 -14
  388. package/src/api/notifications/jobs/NotificationJobs.ts +7 -6
  389. package/src/api/notifications/primitives/$notification.ts +43 -4
  390. package/src/api/notifications/schemas/notificationContactPreferencesSchema.ts +4 -4
  391. package/src/api/notifications/schemas/notificationContactSchema.ts +7 -7
  392. package/src/api/notifications/schemas/notificationDetailResourceSchema.ts +9 -11
  393. package/src/api/notifications/schemas/notificationPayloadSchema.ts +11 -9
  394. package/src/api/notifications/schemas/notificationQuerySchema.ts +6 -6
  395. package/src/api/notifications/schemas/notificationResourceSchema.ts +14 -14
  396. package/src/api/notifications/services/NotificationSenderService.ts +38 -2
  397. package/src/api/oauth/__tests__/OAuthClientService.spec.ts +42 -0
  398. package/src/api/oauth/__tests__/OAuthController.spec.ts +128 -0
  399. package/src/api/oauth/controllers/OAuthController.ts +132 -12
  400. package/src/api/oauth/entities/oauthClientEntity.ts +29 -12
  401. package/src/api/oauth/helpers/oauthMetadata.ts +1 -0
  402. package/src/api/oauth/helpers/oidcMetadata.ts +19 -0
  403. package/src/api/oauth/index.ts +1 -0
  404. package/src/api/oauth/schemas/authorizeDecisionBodySchema.ts +12 -11
  405. package/src/api/oauth/schemas/authorizeQuerySchema.ts +12 -10
  406. package/src/api/oauth/schemas/registerClientBodySchema.ts +10 -11
  407. package/src/api/oauth/schemas/tokenRequestBodySchema.ts +9 -8
  408. package/src/api/oauth/services/OAuthClientService.ts +228 -15
  409. package/src/api/organizations/controllers/AdminOrganizationController.ts +8 -8
  410. package/src/api/organizations/entities/organizations.ts +6 -6
  411. package/src/api/organizations/schemas/createOrganizationSchema.ts +5 -5
  412. package/src/api/organizations/schemas/organizationQuerySchema.ts +4 -4
  413. package/src/api/organizations/schemas/updateOrganizationSchema.ts +1 -2
  414. package/src/api/parameters/__tests__/$parameter.spec.ts +229 -50
  415. package/src/api/parameters/controllers/AdminParameterController.ts +9 -12
  416. package/src/api/parameters/entities/parameters.ts +29 -16
  417. package/src/api/parameters/primitives/$parameter.ts +3 -3
  418. package/src/api/parameters/schemas/activateParameterBodySchema.ts +4 -4
  419. package/src/api/parameters/schemas/createParameterVersionBodySchema.ts +15 -15
  420. package/src/api/parameters/schemas/parameterCreatorSummarySchema.ts +7 -7
  421. package/src/api/parameters/schemas/parameterCurrentResponseSchema.ts +7 -7
  422. package/src/api/parameters/schemas/parameterHistoryResponseSchema.ts +3 -3
  423. package/src/api/parameters/schemas/parameterNameParamSchema.ts +2 -3
  424. package/src/api/parameters/schemas/parameterNamesResponseSchema.ts +3 -3
  425. package/src/api/parameters/schemas/parameterResponseSchema.ts +3 -3
  426. package/src/api/parameters/schemas/parameterStatusSchema.ts +2 -2
  427. package/src/api/parameters/schemas/parameterTreeNodeSchema.ts +6 -6
  428. package/src/api/parameters/schemas/parameterVersionParamSchema.ts +5 -6
  429. package/src/api/parameters/schemas/parameterVersionResponseSchema.ts +3 -3
  430. package/src/api/parameters/schemas/rollbackParameterBodySchema.ts +6 -9
  431. package/src/api/parameters/services/ParameterProvider.ts +152 -65
  432. package/src/api/payments/controllers/AdminPaymentController.ts +7 -7
  433. package/src/api/payments/controllers/MockCheckoutController.ts +79 -28
  434. package/src/api/payments/controllers/PaymentController.ts +4 -4
  435. package/src/api/payments/entities/paymentIntents.ts +11 -11
  436. package/src/api/payments/entities/paymentMethods.ts +11 -11
  437. package/src/api/payments/entities/refunds.ts +9 -9
  438. package/src/api/payments/providers/PaymentProvider.ts +18 -0
  439. package/src/api/payments/schemas/intentSchemas.ts +25 -25
  440. package/src/api/payments/schemas/paymentMethodSchemas.ts +3 -3
  441. package/src/api/payments/services/PaymentService.ts +60 -3
  442. package/src/api/subscriptions/__tests__/SubscriptionService.spec.ts +14 -0
  443. package/src/api/subscriptions/controllers/AdminSubscriptionController.ts +11 -11
  444. package/src/api/subscriptions/controllers/SubscriptionController.ts +5 -4
  445. package/src/api/subscriptions/entities/subscriptionEvents.ts +15 -15
  446. package/src/api/subscriptions/entities/subscriptions.ts +22 -22
  447. package/src/api/subscriptions/notifications/SubscriptionNotifications.ts +22 -22
  448. package/src/api/subscriptions/schemas/cancelSubscriptionSchema.ts +4 -4
  449. package/src/api/subscriptions/schemas/changePlanSchema.ts +5 -5
  450. package/src/api/subscriptions/schemas/createSubscriptionSchema.ts +14 -7
  451. package/src/api/subscriptions/schemas/entitlementsSchema.ts +10 -10
  452. package/src/api/subscriptions/schemas/mrrSchema.ts +9 -9
  453. package/src/api/subscriptions/schemas/planDefinitionSchema.ts +21 -21
  454. package/src/api/subscriptions/schemas/planResourceSchema.ts +19 -19
  455. package/src/api/subscriptions/schemas/subscriptionQuerySchema.ts +8 -8
  456. package/src/api/subscriptions/schemas/subscriptionSettingsSchema.ts +7 -7
  457. package/src/api/subscriptions/schemas/subscriptionStatsSchema.ts +17 -17
  458. package/src/api/subscriptions/services/SubscriptionConfig.ts +2 -2
  459. package/src/api/users/__tests__/ApiKeys-integration.spec.ts +11 -11
  460. package/src/api/users/atoms/realmAuthSettingsAtom.ts +111 -119
  461. package/src/api/users/controllers/AdminIdentityController.ts +29 -19
  462. package/src/api/users/controllers/AdminSessionController.ts +37 -27
  463. package/src/api/users/controllers/AdminUserController.ts +75 -53
  464. package/src/api/users/controllers/MySessionController.ts +125 -0
  465. package/src/api/users/controllers/RealmController.ts +9 -10
  466. package/src/api/users/controllers/UserController.ts +55 -55
  467. package/src/api/users/entities/identities.ts +8 -8
  468. package/src/api/users/entities/sessions.ts +17 -17
  469. package/src/api/users/entities/users.ts +17 -17
  470. package/src/api/users/index.ts +3 -0
  471. package/src/api/users/notifications/UserNotifications.ts +76 -24
  472. package/src/api/users/primitives/$realm.ts +12 -26
  473. package/src/api/users/providers/RealmProvider.ts +0 -15
  474. package/src/api/users/schemas/completePasswordResetRequestSchema.ts +8 -12
  475. package/src/api/users/schemas/completeRegistrationRequestSchema.ts +17 -20
  476. package/src/api/users/schemas/createUserSchema.ts +2 -2
  477. package/src/api/users/schemas/identityQuerySchema.ts +4 -4
  478. package/src/api/users/schemas/identityResourceSchema.ts +3 -2
  479. package/src/api/users/schemas/loginSchema.ts +4 -4
  480. package/src/api/users/schemas/passwordResetIntentResponseSchema.ts +6 -8
  481. package/src/api/users/schemas/realmConfigSchema.ts +10 -24
  482. package/src/api/users/schemas/registerQuerySchema.ts +6 -6
  483. package/src/api/users/schemas/registerRequestSchema.ts +21 -43
  484. package/src/api/users/schemas/registerResponseSchema.ts +2 -2
  485. package/src/api/users/schemas/registerSchema.ts +13 -31
  486. package/src/api/users/schemas/registrationIntentResponseSchema.ts +19 -23
  487. package/src/api/users/schemas/resetPasswordSchema.ts +10 -17
  488. package/src/api/users/schemas/sessionQuerySchema.ts +3 -3
  489. package/src/api/users/schemas/sessionResourceSchema.ts +25 -25
  490. package/src/api/users/schemas/updateUserSchema.ts +3 -4
  491. package/src/api/users/schemas/userQuerySchema.ts +7 -7
  492. package/src/api/users/services/RegistrationService.ts +25 -11
  493. package/src/api/users/services/UserService.ts +12 -6
  494. package/src/api/verifications/__tests__/CodeVerification.spec.ts +63 -101
  495. package/src/api/verifications/__tests__/LinkVerification.spec.ts +23 -92
  496. package/src/api/verifications/controllers/VerificationController.ts +13 -27
  497. package/src/api/verifications/entities/verifications.ts +13 -14
  498. package/src/api/verifications/schemas/requestVerificationCodeResponseSchema.ts +17 -14
  499. package/src/api/verifications/schemas/validateVerificationCodeResponseSchema.ts +9 -10
  500. package/src/api/verifications/schemas/verificationSettingsSchema.ts +65 -66
  501. package/src/api/verifications/schemas/verificationTypeEnumSchema.ts +2 -2
  502. package/src/api/verifications/services/VerificationService.ts +12 -0
  503. package/src/background/__tests__/BackgroundTaskProvider.spec.ts +36 -0
  504. package/src/batch/__tests__/$batch.spec.ts +22 -22
  505. package/src/batch/__tests__/startup-buffering.spec.ts +9 -9
  506. package/src/bin/index.ts +1 -1
  507. package/src/bucket/__tests__/TenantScopedBucket.spec.ts +60 -0
  508. package/src/bucket/providers/LocalFileStorageProvider.ts +14 -6
  509. package/src/bucket/providers/MemoryFileStorageProvider.ts +18 -7
  510. package/src/bucket/providers/R2FileStorageProvider.ts +14 -6
  511. package/src/bucket/providers/S3FileStorageProvider.ts +31 -15
  512. package/src/cache/core/primitives/$cache.ts +7 -10
  513. package/src/cache/database/entities/cacheEntries.ts +16 -27
  514. package/src/cache/database/providers/DatabaseCacheProvider.ts +15 -13
  515. package/src/cache/redis/providers/RedisCacheProvider.ts +6 -6
  516. package/src/captcha/providers/TurnstileCaptchaProvider.ts +4 -4
  517. package/src/cli/core/__tests__/BuildCloudflareTask.spec.ts +178 -0
  518. package/src/cli/core/__tests__/BuildDockerTask.spec.ts +0 -2
  519. package/src/cli/core/__tests__/DbCommand.spec.ts +108 -0
  520. package/src/cli/core/atoms/appEntryOptions.ts +5 -5
  521. package/src/cli/core/atoms/buildOptions.ts +76 -76
  522. package/src/cli/core/atoms/changelogOptions.ts +3 -3
  523. package/src/cli/core/atoms/devOptions.ts +3 -3
  524. package/src/cli/core/commands/build.ts +36 -39
  525. package/src/cli/core/commands/db.ts +171 -83
  526. package/src/cli/core/commands/dev.ts +8 -8
  527. package/src/cli/core/commands/gen/changelog.ts +12 -14
  528. package/src/cli/core/commands/gen/env.ts +6 -6
  529. package/src/cli/core/commands/gen/openapi.ts +6 -6
  530. package/src/cli/core/commands/init.ts +28 -33
  531. package/src/cli/core/commands/pack.ts +10 -10
  532. package/src/cli/core/commands/root.ts +7 -8
  533. package/src/cli/core/commands/test.ts +17 -20
  534. package/src/cli/core/tasks/BuildCloudflareTask.ts +103 -230
  535. package/src/cli/core/templates/apiHelloResponseSchemaTs.ts +4 -4
  536. package/src/cli/devtools/atoms/devtoolsOptions.ts +6 -6
  537. package/src/cli/i18n/atoms/i18nOptions.ts +8 -8
  538. package/src/cli/platform/commands/SecretsCommand.ts +24 -25
  539. package/src/cli/platform/commands/platform.ts +40 -46
  540. package/src/cli/platform/index.ts +1 -1
  541. package/src/cli/platform-lib/__tests__/CloudflareAdapter.spec.ts +0 -4
  542. package/src/cli/platform-lib/__tests__/PlatformInspector.spec.ts +10 -3
  543. package/src/cli/platform-lib/__tests__/VercelAdapter.spec.ts +0 -2
  544. package/src/cli/platform-lib/adapters/CloudflareAdapter.ts +13 -14
  545. package/src/cli/platform-lib/adapters/VercelAdapter.ts +6 -11
  546. package/src/cli/platform-lib/atoms/platformOptions.ts +46 -25
  547. package/src/cli/platform-lib/schemas/cloudflare.ts +87 -87
  548. package/src/cli/platform-lib/schemas/platform.ts +51 -51
  549. package/src/cli/platform-lib/schemas/vercel.ts +28 -28
  550. package/src/cli/platform-lib/services/CloudflareApi.ts +5 -5
  551. package/src/cli/platform-lib/services/VercelApi.ts +4 -4
  552. package/src/cli/platform-lib/services/VercelCli.ts +6 -15
  553. package/src/cli/platform-lib/services/WranglerApi.ts +6 -15
  554. package/src/cli/vendor/atoms/vendorOptions.ts +9 -9
  555. package/src/cli/vendor/commands/VendorCommand.ts +11 -12
  556. package/src/command/__tests__/$command.spec.ts +82 -83
  557. package/src/command/__tests__/Asker.spec.ts +6 -13
  558. package/src/command/__tests__/CliProvider.spec.ts +136 -149
  559. package/src/command/__tests__/Runner.spec.ts +86 -110
  560. package/src/command/helpers/Asker.ts +23 -58
  561. package/src/command/helpers/Runner.ts +34 -110
  562. package/src/command/index.ts +4 -9
  563. package/src/command/primitives/$command.ts +10 -10
  564. package/src/command/providers/CliProvider.ts +183 -161
  565. package/src/core/Alepha.ts +62 -13
  566. package/src/core/__tests__/$atom.spec.ts +52 -3
  567. package/src/core/__tests__/$computed.spec.ts +129 -0
  568. package/src/core/__tests__/$env.spec.ts +13 -13
  569. package/src/core/__tests__/$inject.spec.ts +4 -4
  570. package/src/core/__tests__/$module.spec.ts +1 -1
  571. package/src/core/__tests__/Alepha-graph.spec.ts +1 -1
  572. package/src/core/__tests__/Alepha-parseEnv.spec.ts +32 -32
  573. package/src/core/__tests__/Alepha-start.spec.ts +3 -3
  574. package/src/core/__tests__/CodecManager.spec.ts +113 -94
  575. package/src/core/__tests__/KeylessJsonSchemaCodec.spec.ts +138 -138
  576. package/src/core/__tests__/SchemaValidator.spec.ts +43 -44
  577. package/src/core/__tests__/StateManager.persist.browser.spec.ts +87 -0
  578. package/src/core/__tests__/StateManager.spec.ts +423 -0
  579. package/src/core/__tests__/TypeBox-usecases.spec.ts +8 -8
  580. package/src/core/__tests__/TypeProvider.spec.ts +314 -309
  581. package/src/core/__tests__/dump.spec.ts +6 -6
  582. package/src/core/__tests__/pagination.spec.ts +4 -4
  583. package/src/core/__tests__/scoped-after-start.spec.ts +43 -0
  584. package/src/core/errors/TypeBoxError.ts +10 -4
  585. package/src/core/helpers/FileLike.ts +5 -5
  586. package/src/core/helpers/coerceStrings.ts +70 -0
  587. package/src/core/helpers/jsonSchemaToZod.ts +112 -0
  588. package/src/core/index.shared.ts +4 -1
  589. package/src/core/primitives/$atom.ts +95 -27
  590. package/src/core/primitives/$computed.ts +148 -0
  591. package/src/core/primitives/$env.ts +5 -5
  592. package/src/core/primitives/$state.ts +1 -1
  593. package/src/core/providers/AlsProvider.ts +26 -0
  594. package/src/core/providers/CodecManager.ts +1 -2
  595. package/src/core/providers/JsonSchemaCodec.ts +1 -2
  596. package/src/core/providers/KeylessJsonSchemaCodec.ts +82 -57
  597. package/src/core/providers/SchemaValidator.ts +48 -158
  598. package/src/core/providers/StateManager.ts +383 -9
  599. package/src/core/providers/TypeProvider.ts +80 -734
  600. package/src/core/providers/ZodProvider.ts +380 -0
  601. package/src/core/providers/zodAugment.ts +69 -0
  602. package/src/core/schemas/pageQuerySchema.ts +19 -21
  603. package/src/core/schemas/pageSchema.ts +47 -57
  604. package/src/crypto/__tests__/SecretProvider.spec.ts +31 -0
  605. package/src/crypto/providers/SecretProvider.ts +16 -10
  606. package/src/datetime/primitives/$throttle.ts +6 -1
  607. package/src/email/brevo/providers/BrevoEmailProvider.ts +4 -4
  608. package/src/email/cloudflare/providers/CloudflareEmailProvider.ts +6 -6
  609. package/src/email/core/index.ts +7 -2
  610. package/src/email/core/primitives/$email.ts +5 -1
  611. package/src/email/core/providers/LocalEmailProvider.ts +5 -5
  612. package/src/email/smtp/providers/NodemailerEmailProvider.ts +41 -52
  613. package/src/fake/__tests__/FakeProvider.spec.ts +110 -110
  614. package/src/fake/__tests__/keyName.example.ts +21 -21
  615. package/src/fake/__tests__/keyName.spec.ts +41 -41
  616. package/src/fake/__tests__/module.example.ts +8 -8
  617. package/src/fake/providers/FakeProvider.ts +122 -121
  618. package/src/lock/core/__tests__/lock-mutual-exclusion.spec.ts +44 -0
  619. package/src/lock/core/index.ts +1 -0
  620. package/src/lock/core/primitives/$lock.ts +13 -6
  621. package/src/logger/__tests__/CliFormatterProvider.spec.ts +76 -0
  622. package/src/logger/__tests__/Logger.spec.ts +49 -0
  623. package/src/logger/index.ts +25 -18
  624. package/src/logger/providers/CliFormatterProvider.ts +75 -0
  625. package/src/logger/schemas/logEntrySchema.ts +10 -10
  626. package/src/logger/services/Logger.ts +18 -0
  627. package/src/mcp/__tests__/$prompt.spec.ts +21 -23
  628. package/src/mcp/__tests__/$tool.spec.ts +22 -22
  629. package/src/mcp/__tests__/McpServerProvider.spec.ts +11 -11
  630. package/src/mcp/__tests__/StreamableHttpMcpTransport.spec.ts +2 -2
  631. package/src/mcp/__tests__/integration.spec.ts +33 -33
  632. package/src/mcp/primitives/$prompt.ts +11 -9
  633. package/src/mcp/primitives/$tool.ts +27 -86
  634. package/src/mcp/transports/StreamableHttpMcpTransport.ts +7 -7
  635. package/src/orm/__tests__/$repository-tests.ts +133 -27
  636. package/src/orm/__tests__/$repository.spec.ts +23 -0
  637. package/src/orm/__tests__/$transactional-tests.ts +4 -4
  638. package/src/orm/__tests__/ModelBuilder-tests.ts +28 -28
  639. package/src/orm/__tests__/ModelBuilder.spec.ts +124 -106
  640. package/src/orm/__tests__/QueryManager.spec.ts +5 -5
  641. package/src/orm/__tests__/delete-returning-tests.ts +11 -11
  642. package/src/orm/__tests__/deletedAt-tests.ts +3 -3
  643. package/src/orm/__tests__/enums.spec.ts +29 -25
  644. package/src/orm/__tests__/execute-tests.ts +8 -8
  645. package/src/orm/__tests__/fixtures/bigEntitySchema.ts +48 -48
  646. package/src/orm/__tests__/fixtures/userEntitySchema.ts +6 -6
  647. package/src/orm/__tests__/joins-tests.ts +30 -30
  648. package/src/orm/__tests__/organization-tests.ts +105 -3
  649. package/src/orm/__tests__/organization.spec.ts +46 -0
  650. package/src/orm/__tests__/orm-errors.spec.ts +10 -10
  651. package/src/orm/__tests__/orm-next-tests.ts +29 -29
  652. package/src/orm/__tests__/orm-showcase-tests.ts +9 -9
  653. package/src/orm/__tests__/primaryKey.spec.ts +4 -4
  654. package/src/orm/__tests__/query-date-encoding-tests.ts +17 -17
  655. package/src/orm/__tests__/ref-auto-onDelete.spec.ts +14 -14
  656. package/src/orm/__tests__/references.spec.ts +7 -7
  657. package/src/orm/__tests__/security.spec.ts +17 -17
  658. package/src/orm/__tests__/string-operators-tests.ts +5 -5
  659. package/src/orm/__tests__/timestamps-tests.ts +14 -14
  660. package/src/orm/__tests__/validation-tests.ts +5 -5
  661. package/src/orm/core/__tests__/BunSqliteProvider.bun.spec.ts +8 -8
  662. package/src/orm/core/constants/PG_SYMBOLS.ts +13 -1
  663. package/src/orm/core/entities/alephaSequences.ts +8 -8
  664. package/src/orm/core/helpers/pgAttr.ts +4 -4
  665. package/src/orm/core/primitives/$entity.ts +10 -6
  666. package/src/orm/core/providers/DatabaseTypeProvider.ts +46 -53
  667. package/src/orm/core/providers/drivers/BunSqliteProvider.ts +8 -8
  668. package/src/orm/core/providers/drivers/CloudflareD1Provider.ts +3 -5
  669. package/src/orm/core/providers/drivers/NodeSqliteProvider.ts +8 -8
  670. package/src/orm/core/schemas/databaseEnvSchema.ts +4 -4
  671. package/src/orm/core/schemas/insertSchema.ts +14 -18
  672. package/src/orm/core/schemas/legacyIdSchema.ts +2 -2
  673. package/src/orm/core/schemas/updateSchema.ts +10 -16
  674. package/src/orm/core/services/PgRelationManager.ts +2 -2
  675. package/src/orm/core/services/QueryManager.ts +13 -2
  676. package/src/orm/core/services/Repository.ts +88 -33
  677. package/src/orm/core/services/SqliteModelBuilder.ts +38 -45
  678. package/src/orm/postgres/__tests__/BunPostgresProvider.bun.spec.ts +4 -4
  679. package/src/orm/postgres/providers/CloudflareHyperdriveProvider.ts +4 -6
  680. package/src/orm/postgres/schemas/postgresEnvSchema.ts +6 -6
  681. package/src/orm/postgres/services/PostgresModelBuilder.ts +127 -114
  682. package/src/queue/core/__tests__/$consumer.spec.ts +4 -4
  683. package/src/queue/core/__tests__/WorkerProvider.spec.ts +4 -4
  684. package/src/queue/core/__tests__/shared.ts +6 -6
  685. package/src/queue/core/primitives/$consumer.ts +5 -5
  686. package/src/queue/core/primitives/$queue.ts +44 -61
  687. package/src/queue/core/providers/CloudflareQueueProvider.ts +6 -0
  688. package/src/queue/core/providers/WorkerProvider.ts +17 -14
  689. package/src/queue/redis/providers/RedisQueueProvider.ts +3 -3
  690. package/src/react/core/__tests__/ErrorBoundary.browser.spec.tsx +92 -0
  691. package/src/react/core/__tests__/Router.spec.tsx +4 -4
  692. package/src/react/core/__tests__/useComputed.browser.spec.tsx +192 -0
  693. package/src/react/core/__tests__/useQuery.browser.spec.tsx +48 -0
  694. package/src/react/core/__tests__/useSelector.browser.spec.tsx +105 -0
  695. package/src/react/core/__tests__/useStore.browser.spec.tsx +113 -0
  696. package/src/react/core/components/ErrorBoundary.tsx +42 -0
  697. package/src/react/core/hooks/useAction.ts +56 -19
  698. package/src/react/core/hooks/useComputed.ts +91 -0
  699. package/src/react/core/hooks/useSelector.ts +67 -0
  700. package/src/react/core/hooks/useStore.ts +36 -17
  701. package/src/react/core/index.ts +3 -0
  702. package/src/react/core/utils/shallowEqual.ts +36 -0
  703. package/src/react/form/__tests__/FormModel-submit-loading.spec.ts +2 -2
  704. package/src/react/form/__tests__/form-submitting-reactive.browser.spec.tsx +5 -5
  705. package/src/react/form/__tests__/useForm.browser.spec.tsx +54 -54
  706. package/src/react/form/errors/FormValidationError.ts +0 -2
  707. package/src/react/form/hooks/useForm.ts +19 -4
  708. package/src/react/form/hooks/useFormQuerySync.ts +0 -0
  709. package/src/react/form/services/FormModel.ts +67 -47
  710. package/src/react/form/services/parseField.ts +66 -27
  711. package/src/react/i18n/__tests__/Localize.spec.tsx +1 -1
  712. package/src/react/i18n/providers/I18nProvider.ts +2 -2
  713. package/src/react/router/__tests__/$page.browser.spec.tsx +19 -19
  714. package/src/react/router/__tests__/$page.spec.tsx +21 -21
  715. package/src/react/router/__tests__/ReactBrowserProvider.browser.spec.ts +87 -1
  716. package/src/react/router/atoms/ssrManifestAtom.ts +16 -16
  717. package/src/react/router/components/NestedView.tsx +11 -3
  718. package/src/react/router/hooks/useQueryParams.ts +1 -1
  719. package/src/react/router/primitives/$page.ts +2 -2
  720. package/src/react/router/providers/ReactBrowserProvider.ts +64 -13
  721. package/src/react/router/providers/ReactPageProvider.ts +26 -12
  722. package/src/react/router/providers/ReactServerProvider.ts +13 -15
  723. package/src/react/sitemap/__tests__/$sitemap.spec.ts +2 -2
  724. package/src/react/ui/atoms/uiAtom.ts +6 -6
  725. package/src/react/ui/atoms/uiThemeListAtom.ts +7 -7
  726. package/src/react/ui/hooks/useColorMode.ts +11 -4
  727. package/src/react/ui/services/SchemaControl.ts +4 -4
  728. package/src/redis/providers/BunRedisProvider.ts +19 -11
  729. package/src/redis/providers/NodeRedisProvider.ts +3 -3
  730. package/src/scheduler/primitives/$scheduler.ts +21 -8
  731. package/src/security/__tests__/assertRealmScope.spec.ts +29 -0
  732. package/src/security/atoms/currentTenantAtom.ts +6 -6
  733. package/src/security/atoms/currentUserAtom.ts +2 -2
  734. package/src/security/primitives/$issuer.ts +24 -2
  735. package/src/security/providers/JwtProvider.ts +100 -0
  736. package/src/security/providers/SecurityProvider.ts +43 -2
  737. package/src/security/schemas/permissionSchema.ts +19 -19
  738. package/src/security/schemas/roleSchema.ts +22 -28
  739. package/src/security/schemas/userAccountInfoSchema.ts +47 -37
  740. package/src/server/auth/index.ts +0 -3
  741. package/src/server/auth/primitives/$auth.ts +6 -6
  742. package/src/server/auth/primitives/$authApple.ts +10 -10
  743. package/src/server/auth/primitives/$authFacebook.ts +10 -10
  744. package/src/server/auth/primitives/$authFranceConnect.ts +10 -10
  745. package/src/server/auth/primitives/$authGithub.ts +10 -10
  746. package/src/server/auth/primitives/$authGoogle.ts +10 -10
  747. package/src/server/auth/primitives/$authMicrosoft.ts +14 -14
  748. package/src/server/auth/providers/ServerAuthProvider.ts +49 -48
  749. package/src/server/auth/schemas/authenticationProviderSchema.ts +9 -12
  750. package/src/server/auth/schemas/tokenResponseSchema.ts +2 -2
  751. package/src/server/auth/schemas/tokensSchema.ts +16 -16
  752. package/src/server/auth/schemas/userinfoResponseSchema.ts +3 -3
  753. package/src/server/cookies/__tests__/AtomCookieBinding.spec.ts +80 -0
  754. package/src/server/cookies/__tests__/AtomCookiePersistence.browser.spec.ts +169 -0
  755. package/src/server/cookies/__tests__/AtomCookiePersistence.spec.ts +294 -0
  756. package/src/server/cookies/__tests__/ServerCookiesProvider.spec.ts +14 -14
  757. package/src/server/cookies/index.browser.ts +4 -1
  758. package/src/server/cookies/index.ts +8 -1
  759. package/src/server/cookies/primitives/$cookie.browser.ts +1 -1
  760. package/src/server/cookies/primitives/$cookie.ts +16 -0
  761. package/src/server/cookies/providers/AtomCookiePersistence.browser.ts +133 -0
  762. package/src/server/cookies/providers/AtomCookiePersistence.ts +148 -0
  763. package/src/server/cookies/providers/ServerCookiesProvider.ts +13 -5
  764. package/src/server/cookies/services/CookieParser.ts +6 -1
  765. package/src/server/core/__tests__/$action.spec.ts +13 -13
  766. package/src/server/core/__tests__/$middleware.spec.ts +10 -10
  767. package/src/server/core/__tests__/$route.spec.ts +9 -9
  768. package/src/server/core/__tests__/$sse.spec.ts +26 -26
  769. package/src/server/core/__tests__/BunHttpServerProvider.bun.spec.ts +6 -6
  770. package/src/server/core/__tests__/HttpClient.spec.ts +2 -2
  771. package/src/server/core/__tests__/NodeHttpServerProvider.spec.ts +15 -3
  772. package/src/server/core/__tests__/ServerBodyParserProvider.spec.ts +14 -14
  773. package/src/server/core/__tests__/ServerMultipartProvider.spec.ts +33 -33
  774. package/src/server/core/__tests__/ServerRouterProvider-errorHandler.spec.ts +5 -1
  775. package/src/server/core/__tests__/ServerRouterProvider-getRoutes.spec.ts +25 -25
  776. package/src/server/core/__tests__/ServerRouterProvider-serializationError.spec.ts +9 -5
  777. package/src/server/core/__tests__/ServerRouterProvider-validationError.spec.ts +56 -24
  778. package/src/server/core/errors/ValidationError.ts +6 -3
  779. package/src/server/core/helpers/isMultipart.ts +2 -1
  780. package/src/server/core/index.ts +5 -2
  781. package/src/server/core/interfaces/ServerRequest.ts +6 -14
  782. package/src/server/core/primitives/$action.ts +26 -36
  783. package/src/server/core/primitives/$sse.ts +3 -3
  784. package/src/server/core/providers/BunHttpServerProvider.ts +8 -9
  785. package/src/server/core/providers/NodeHttpServerProvider.ts +8 -9
  786. package/src/server/core/providers/ServerBodyParserProvider.ts +20 -12
  787. package/src/server/core/providers/ServerCompressProvider.ts +9 -10
  788. package/src/server/core/providers/ServerHelmetProvider.ts +26 -27
  789. package/src/server/core/providers/ServerMultipartProvider.ts +19 -19
  790. package/src/server/core/providers/ServerRouterProvider.ts +44 -15
  791. package/src/server/core/schemas/errorSchema.ts +20 -25
  792. package/src/server/core/schemas/okSchema.ts +9 -14
  793. package/src/server/core/services/HttpClient.ts +13 -1
  794. package/src/server/core/services/ServerRequestParser.ts +6 -6
  795. package/src/server/cors/providers/ServerCorsProvider.ts +26 -28
  796. package/src/server/health/schemas/healthSchema.ts +6 -6
  797. package/src/server/links/__tests__/$remote.spec.ts +3 -3
  798. package/src/server/links/__tests__/BatchEndpoint.spec.ts +9 -9
  799. package/src/server/links/__tests__/LinkProvider.spec.ts +9 -9
  800. package/src/server/links/__tests__/ServerLinksProvider.spec.ts +23 -23
  801. package/src/server/links/__tests__/fixtures/CrudApp.ts +21 -21
  802. package/src/server/links/atoms/apiLinksAtom.ts +2 -2
  803. package/src/server/links/atoms/linkOptionsAtom.ts +6 -6
  804. package/src/server/links/primitives/$remote.ts +3 -3
  805. package/src/server/links/providers/LinkProvider.ts +3 -3
  806. package/src/server/links/providers/ServerLinksProvider.ts +20 -20
  807. package/src/server/links/schemas/apiLinksResponseSchema.ts +23 -23
  808. package/src/server/proxy/__tests__/$proxy.spec.ts +9 -9
  809. package/src/server/proxy/providers/ServerProxyProvider.ts +5 -0
  810. package/src/server/rate-limit/providers/ServerRateLimitProvider.ts +18 -20
  811. package/src/server/swagger/__tests__/$swagger.spec.ts +91 -94
  812. package/src/server/swagger/__tests__/ui.spec.ts +3 -3
  813. package/src/server/swagger/providers/ServerSwaggerProvider.ts +66 -43
  814. package/src/system/__tests__/NodeShellProvider.spec.ts +46 -0
  815. package/src/system/providers/NodeShellProvider.ts +4 -1
  816. package/src/topic/core/__tests__/$subscriber.spec.ts +4 -4
  817. package/src/topic/core/__tests__/shared.ts +8 -8
  818. package/src/topic/core/primitives/$subscriber.ts +5 -5
  819. package/src/topic/core/primitives/$topic.ts +14 -14
  820. package/src/topic/redis/providers/RedisTopicProvider.ts +3 -3
  821. package/dist/container/core/index.d.ts +0 -236
  822. package/dist/container/core/index.d.ts.map +0 -1
  823. package/dist/container/core/index.js +0 -231
  824. package/dist/container/core/index.js.map +0 -1
  825. package/dist/container/core/index.workerd.js +0 -192
  826. package/dist/container/core/index.workerd.js.map +0 -1
  827. package/src/command/helpers/PrettyAsker.ts +0 -256
  828. package/src/command/helpers/PrettyPrint.ts +0 -332
  829. package/src/container/core/__tests__/$container.spec.ts +0 -83
  830. package/src/container/core/index.ts +0 -50
  831. package/src/container/core/index.workerd.ts +0 -53
  832. package/src/container/core/interfaces/ContainerOptions.ts +0 -69
  833. package/src/container/core/primitives/$container.ts +0 -100
  834. package/src/container/core/providers/CloudflareContainerProvider.ts +0 -70
  835. package/src/container/core/providers/ContainerProvider.ts +0 -92
  836. package/src/container/core/providers/MockContainerProvider.ts +0 -62
  837. package/src/container/core/providers/NodeContainerProvider.ts +0 -53
  838. package/src/core/__tests__/jsonSchemaToTypeBox.spec.ts +0 -771
  839. package/src/core/helpers/jsonSchemaToTypeBox.ts +0 -359
  840. package/src/server/auth/__tests__/authFederationClient.spec.ts +0 -40
  841. package/src/server/auth/__tests__/federationAssertion.spec.ts +0 -146
  842. package/src/server/auth/helpers/federationAssertion.ts +0 -74
  843. package/src/server/auth/primitives/$authFederationBroker.ts +0 -273
  844. package/src/server/auth/primitives/$authFederationClient.ts +0 -89
  845. /package/dist/orm/core/{chunk-B4FMCO8f.js → rolldown-runtime-B4FMCO8f.js} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["createPromptInterface","createPromptInterface"],"sources":["../../src/command/helpers/PrettyAsker.ts","../../src/command/helpers/Asker.ts","../../src/command/helpers/EnvUtils.ts","../../src/command/helpers/PrettyPrint.ts","../../src/command/errors/CommandError.ts","../../src/command/helpers/Runner.ts","../../src/command/primitives/$command.ts","../../src/command/providers/CliProvider.ts","../../src/command/index.ts"],"sourcesContent":["import { stdin, stdout } from \"node:process\";\nimport { createInterface as createPromptInterface } from \"node:readline/promises\";\nimport { $inject, Alepha, AlephaError, type TSchema } from \"alepha\";\nimport { ConsoleColorProvider } from \"alepha/logger\";\n\n/**\n * Clack-style interactive prompt renderer.\n *\n * Provides pretty enum selectors (arrow-key navigation),\n * text inputs, and confirm prompts with box-drawing framing.\n */\nexport class PrettyAsker {\n protected readonly alepha = $inject(Alepha);\n protected readonly color = $inject(ConsoleColorProvider);\n\n /**\n * Whether to use pretty mode.\n *\n * Same conditions as Runner.useDynamicLogger.\n */\n public get enabled(): boolean {\n if (this.alepha.isCI() || this.alepha.env.CLAUDECODE) {\n return false;\n }\n\n const logLevel = String(this.alepha.env.LOG_LEVEL || \"\").toLowerCase();\n if (logLevel === \"debug\" || logLevel === \"trace\") {\n return false;\n }\n\n return true;\n }\n\n // ---------------------------------------------------------------------------\n // Framing\n // ---------------------------------------------------------------------------\n\n /**\n * Print the opening frame with a title.\n */\n public intro(title: string): void {\n const c = this.color;\n this.write(`\\n${c.set(\"DIM\", \"┌\")} ${c.set(\"BOLD\", title)}\\n`);\n this.write(`${c.set(\"DIM\", \"│\")}\\n`);\n }\n\n /**\n * Print the closing frame with a message.\n */\n public outro(message: string): void {\n const c = this.color;\n this.write(`${c.set(\"DIM\", \"│\")}\\n`);\n this.write(`${c.set(\"DIM\", \"└\")} ${message}\\n\\n`);\n }\n\n // ---------------------------------------------------------------------------\n // Select (arrow-key navigation)\n // ---------------------------------------------------------------------------\n\n /**\n * Arrow-key select prompt for enum schemas.\n */\n public async select(question: string, options: string[]): Promise<string> {\n let selectedIndex = 0;\n\n this.write(`${this.color.set(\"DIM\", \"│\")}\\n`);\n this.writeActiveMarker(question);\n this.renderOptions(options, selectedIndex);\n\n return new Promise<string>((resolve, reject) => {\n const hasRawMode = typeof stdin.setRawMode === \"function\";\n if (!hasRawMode) {\n // Fallback: no raw mode (piped stdin, etc.)\n this.clearOptions(options.length);\n this.writeCompletedMarker(question);\n this.writeAnswer(options[0]);\n resolve(options[0]);\n return;\n }\n\n stdin.setRawMode(true);\n stdin.resume();\n\n const onKeypress = (data: Buffer) => {\n const key = data.toString();\n\n // Ctrl+C\n if (key === \"\\x03\") {\n cleanup();\n stdin.setRawMode(false);\n stdin.pause();\n reject(new AlephaError(\"Aborted.\"));\n return;\n }\n\n // Arrow up / k\n if (key === \"\\x1b[A\" || key === \"k\") {\n selectedIndex = (selectedIndex - 1 + options.length) % options.length;\n this.clearOptions(options.length);\n this.renderOptions(options, selectedIndex);\n return;\n }\n\n // Arrow down / j\n if (key === \"\\x1b[B\" || key === \"j\") {\n selectedIndex = (selectedIndex + 1) % options.length;\n this.clearOptions(options.length);\n this.renderOptions(options, selectedIndex);\n return;\n }\n\n // Enter\n if (key === \"\\r\" || key === \"\\n\") {\n cleanup();\n stdin.setRawMode(false);\n stdin.pause();\n\n // Clear options and replace with completed marker + answer\n this.clearOptions(options.length);\n this.clearActiveMarker();\n this.writeCompletedMarker(question);\n this.writeAnswer(options[selectedIndex]);\n\n resolve(options[selectedIndex]);\n }\n };\n\n const cleanup = () => {\n stdin.removeListener(\"data\", onKeypress);\n };\n\n stdin.on(\"data\", onKeypress);\n });\n }\n\n // ---------------------------------------------------------------------------\n // Text input\n // ---------------------------------------------------------------------------\n\n /**\n * Text input prompt with clack framing.\n */\n public async text(question: string, schema?: TSchema): Promise<string> {\n const c = this.color;\n const defaultValue =\n schema && \"default\" in schema ? String(schema.default) : undefined;\n\n this.write(`${c.set(\"DIM\", \"│\")}\\n`);\n this.writeActiveMarker(question);\n\n const defaultHint = defaultValue\n ? ` ${c.set(\"DIM\", `(${defaultValue})`)}`\n : \"\";\n\n this.write(`${c.set(\"DIM\", \"│\")} ${c.set(\"DIM\", \">\")}${defaultHint} `);\n\n const rl = this.createPromptInterface();\n try {\n const answer = await rl.question(\"\");\n const value = answer.trim() || defaultValue || \"\";\n\n // Move up to overwrite the input line\n this.write(\"\\x1b[1A\\x1b[2K\");\n // Move up to overwrite the active marker\n this.clearActiveMarker();\n this.writeCompletedMarker(question);\n this.writeAnswer(value);\n\n if (schema) {\n return this.alepha.codec.decode(schema, value || undefined) as string;\n }\n return value;\n } finally {\n rl.close();\n }\n }\n\n // ---------------------------------------------------------------------------\n // Confirm (Y/n)\n // ---------------------------------------------------------------------------\n\n /**\n * Yes/No confirm prompt with clack framing.\n */\n public async confirm(question: string): Promise<boolean> {\n const c = this.color;\n\n this.write(`${c.set(\"DIM\", \"│\")}\\n`);\n this.writeActiveMarker(`${question} ${c.set(\"DIM\", \"(Y/n)\")}`);\n this.write(`${c.set(\"DIM\", \"│\")} ${c.set(\"DIM\", \">\")} `);\n\n const rl = this.createPromptInterface();\n try {\n const answer = await rl.question(\"\");\n const value = answer.trim().toLowerCase();\n const result = value !== \"n\" && value !== \"no\";\n\n // Move up to overwrite input\n this.write(\"\\x1b[1A\\x1b[2K\");\n this.clearActiveMarker();\n this.writeCompletedMarker(question);\n this.writeAnswer(result ? \"Yes\" : \"No\");\n\n return result;\n } finally {\n rl.close();\n }\n }\n\n // ---------------------------------------------------------------------------\n // Rendering helpers\n // ---------------------------------------------------------------------------\n\n protected renderOptions(options: string[], selectedIndex: number): void {\n const c = this.color;\n for (let i = 0; i < options.length; i++) {\n const isSelected = i === selectedIndex;\n const marker = isSelected\n ? `${c.set(\"CYAN\", \"❯\")} ${c.set(\"CYAN\", options[i])}`\n : ` ${c.set(\"DIM\", options[i])}`;\n this.write(`${c.set(\"DIM\", \"│\")} ${marker}\\n`);\n }\n }\n\n protected clearOptions(count: number): void {\n for (let i = 0; i < count; i++) {\n this.write(\"\\x1b[1A\\x1b[2K\");\n }\n }\n\n protected writeActiveMarker(question: string): void {\n this.write(`${this.color.set(\"CYAN\", \"◆\")} ${question}\\n`);\n }\n\n protected clearActiveMarker(): void {\n this.write(\"\\x1b[1A\\x1b[2K\");\n }\n\n protected writeCompletedMarker(question: string): void {\n this.write(`${this.color.set(\"DIM\", \"◇\")} ${question}\\n`);\n }\n\n protected writeAnswer(value: string): void {\n this.write(\n `${this.color.set(\"DIM\", \"│\")} ${this.color.set(\"DIM\", value)}\\n`,\n );\n }\n\n protected write(str: string): void {\n stdout.write(str);\n }\n\n protected createPromptInterface() {\n return createPromptInterface({ input: stdin, output: stdout });\n }\n}\n","import { stdin as input, stdout as output } from \"node:process\";\nimport { createInterface as createPromptInterface } from \"node:readline/promises\";\nimport {\n $inject,\n Alepha,\n AlephaError,\n type Static,\n type TSchema,\n type TString,\n t,\n} from \"alepha\";\nimport { $logger } from \"alepha/logger\";\nimport { PrettyAsker } from \"./PrettyAsker.ts\";\n\nexport interface AskOptions<T extends TSchema = TString> {\n /**\n * Response schema expected.\n *\n * Recommended schemas:\n * - t.text() - for free text input\n * - t.number() - for numeric input\n * - t.boolean() - for yes/no input (accepts \"true\", \"false\", \"1\", \"0\")\n * - t.enum([\"option1\", \"option2\"]) - for predefined options\n *\n * You can use schema.default to provide a default value.\n *\n * @example\n * ```ts\n * ask(\"What is your name?\", { schema: t.text({ default: \"John Doe\" }) })\n * ```\n *\n * @default TString\n */\n schema?: T;\n\n /**\n * Custom validation function.\n * Throws an AlephaError in case of validation failure.\n */\n validate?: (value: Static<T>) => void;\n}\n\nexport interface AskMethod {\n <T extends TSchema = TString>(\n question: string,\n options?: AskOptions<T>,\n ): Promise<Static<T>>;\n\n permission: (question: string) => Promise<boolean>;\n intro: (title: string) => void;\n outro: (message: string) => void;\n}\n\nexport class Asker {\n protected readonly log = $logger();\n public readonly ask: AskMethod;\n protected readonly alepha = $inject(Alepha);\n protected readonly pretty = $inject(PrettyAsker);\n\n constructor() {\n this.ask = this.createAskMethod();\n }\n\n protected createAskMethod(): AskMethod {\n const askFn: AskMethod = async <T extends TSchema = TString>(\n question: string,\n options: AskOptions<T> = {},\n ) => {\n return await this.prompt<T>(question, options);\n };\n\n askFn.permission = async (question: string) => {\n if (this.pretty.enabled) {\n return this.pretty.confirm(question);\n }\n const response = await this.prompt(`${question} [Y/n]`, {\n schema: t.enum([\"Y\", \"y\", \"n\", \"no\", \"yes\"], { default: \"Y\" }),\n });\n return response.charAt(0).toLowerCase() === \"y\";\n };\n\n askFn.intro = (title: string) => {\n if (this.pretty.enabled) {\n this.pretty.intro(title);\n }\n };\n\n askFn.outro = (message: string) => {\n if (this.pretty.enabled) {\n this.pretty.outro(message);\n }\n };\n\n return askFn;\n }\n\n protected async prompt<T extends TSchema = TString>(\n question: string,\n options: AskOptions<T>,\n ): Promise<Static<T>> {\n if (this.pretty.enabled) {\n return this.prettyPrompt(question, options);\n }\n return this.plainPrompt(question, options);\n }\n\n /**\n * Pretty mode: delegate to PrettyAsker based on schema type.\n */\n protected async prettyPrompt<T extends TSchema = TString>(\n question: string,\n options: AskOptions<T>,\n ): Promise<Static<T>> {\n const schema = options.schema as any;\n\n // Enum schema → arrow-key select\n if (schema?.enum && Array.isArray(schema.enum)) {\n const value = await this.pretty.select(question, schema.enum);\n if (options.validate) {\n options.validate(value as Static<T>);\n }\n return value as Static<T>;\n }\n\n // Text/other schema → text input\n const value = await this.pretty.text(question, schema);\n if (options.validate) {\n options.validate(value as Static<T>);\n }\n return value as Static<T>;\n }\n\n /**\n * Plain mode: readline-based prompts (CI, Claude Code, debug).\n */\n protected async plainPrompt<T extends TSchema = TString>(\n question: string,\n options: AskOptions<T>,\n ): Promise<Static<T>> {\n const rl = this.createPromptInterface();\n let value: any;\n try {\n do {\n try {\n this.log.info(question);\n const answer = await rl.question(\"> \");\n if (options.schema) {\n value = this.alepha.codec.decode(\n options.schema,\n answer ? answer.trim() : undefined,\n );\n } else {\n value = String(answer.trim());\n }\n if (options.validate) {\n options.validate(value);\n }\n } catch (error) {\n if (error instanceof AlephaError) {\n this.log.error(`${error.message}\\n`);\n value = undefined;\n } else {\n throw error;\n }\n }\n } while (value === undefined);\n } finally {\n rl.close();\n }\n\n return value;\n }\n\n protected createPromptInterface() {\n return createPromptInterface({ input, output });\n }\n}\n","import { $inject } from \"alepha\";\nimport { $logger } from \"alepha/logger\";\nimport { FileSystemProvider } from \"alepha/system\";\n\nexport class EnvUtils {\n protected readonly log = $logger();\n protected readonly fs = $inject(FileSystemProvider);\n\n /**\n * Load environment variables from .env files into process.env.\n *\n * Variables that already exist in process.env are NOT overwritten,\n * matching the standard dotenv convention where the shell environment\n * takes precedence over .env file values.\n *\n * By default, it loads from \".env\" and \".env.local\".\n * You can specify additional files to load, e.g. [\".env\", \".env.production\"].\n */\n public async loadEnv(\n root: string,\n files: string[] = [\".env\"],\n ): Promise<void> {\n const vars = await this.parseEnv(root, files);\n for (const [key, value] of Object.entries(vars)) {\n if (process.env[key] === undefined) {\n process.env[key] = value;\n }\n }\n }\n\n /**\n * Parse environment variables from .env files without mutating process.env.\n *\n * Returns a merged record from all files (later files override earlier ones).\n * For each file, also tries the `.local` variant (e.g. `.env.production.local`).\n */\n public async parseEnv(\n root: string,\n files: string[] = [\".env\"],\n ): Promise<Record<string, string>> {\n const result: Record<string, string> = {};\n\n for (const it of files) {\n for (const file of [it, `${it}.local`]) {\n const envPath = this.fs.join(root, file);\n try {\n const buffer = await this.fs.readFile(envPath);\n const envContent = buffer.toString(\"utf8\");\n for (const line of envContent.split(\"\\n\")) {\n const [key, ...rest] = line.split(\"=\");\n if (key) {\n const trimmedKey = key.trim();\n if (trimmedKey && !trimmedKey.startsWith(\"#\")) {\n let value = rest.join(\"=\").trim();\n const last = value.length - 1;\n if (\n value.length >= 2 &&\n value[0] === '\"' &&\n value[last] === '\"'\n ) {\n // Double-quoted: JSON-decode so escapes round-trip with a\n // `JSON.stringify`-based writer (e.g. Rocket's\n // `.env.<env>.local` overrides, which write JSON values like\n // CLUB_CONFIG_JSON). Falls back to a naive strip when the\n // body isn't valid JSON (e.g. a Windows path with `\\`), so\n // simple `KEY=\"value\"` still behaves as before.\n try {\n value = JSON.parse(value);\n } catch {\n value = value.slice(1, -1);\n }\n } else if (\n value.length >= 2 &&\n value[0] === \"'\" &&\n value[last] === \"'\"\n ) {\n value = value.slice(1, -1);\n }\n result[trimmedKey] = value;\n }\n }\n }\n this.log.debug(`Parsed environment variables from ${envPath}`);\n } catch {\n this.log.debug(`No ${file} file found at ${envPath}, skipping.`);\n }\n }\n }\n\n return result;\n }\n}\n","import { $inject } from \"alepha\";\nimport { DateTimeProvider, type Interval } from \"alepha/datetime\";\n\nexport class PrettyPrint {\n protected dateTimeProvider = $inject(DateTimeProvider);\n protected spinnerInterval?: Interval;\n protected readonly frames = [\n \"⠋\",\n \"⠙\",\n \"⠹\",\n \"⠸\",\n \"⠼\",\n \"⠴\",\n \"⠦\",\n \"⠧\",\n \"⠇\",\n \"⠏\",\n ];\n protected tasks = new Map<\n string,\n {\n taskName: string;\n frameIndex: number;\n status: \"running\" | \"success\" | \"error\";\n startTime: number;\n duration?: string;\n message?: string;\n }\n >();\n protected lastLineCount = 0;\n protected header?: string;\n protected commandStartTime?: number;\n protected paused = false;\n\n // stdout interception\n protected originalStdoutWrite?: (...args: any[]) => boolean;\n protected bufferedOutput: string[] = [];\n protected isOwnWrite = false;\n\n // ANSI color codes\n protected readonly colors = {\n reset: \"\\x1b[0m\",\n cyan: \"\\x1b[36m\",\n green: \"\\x1b[32m\",\n red: \"\\x1b[31m\",\n dim: \"\\x1b[2m\",\n };\n\n /**\n * Start a new command session with header\n */\n public startCommand(cliName: string, commandName: string): void {\n this.header = commandName ? `${cliName} ${commandName}` : cliName;\n this.commandStartTime = this.dateTimeProvider.nowMillis();\n this.tasks.clear();\n this.lastLineCount = 0;\n this.write(`┌─ ${this.header}\\n`);\n }\n\n /**\n * End the command session with footer\n */\n public endCommand(): void {\n this.restoreStdout();\n if (this.commandStartTime) {\n const totalDuration = (\n (this.dateTimeProvider.nowMillis() - this.commandStartTime) /\n 1000\n ).toFixed(1);\n this.write(`└─ Done in ${totalDuration}s\\n`);\n }\n this.header = undefined;\n this.commandStartTime = undefined;\n }\n\n /**\n * Start an animated spinner with a task name\n */\n public startSpinner(id: string, taskName: string): void {\n this.tasks.set(id, {\n taskName,\n frameIndex: 0,\n status: \"running\",\n startTime: this.dateTimeProvider.nowMillis(),\n });\n\n this.interceptStdout();\n\n // Start interval if not already running\n if (!this.spinnerInterval) {\n this.spinnerInterval = this.dateTimeProvider.createInterval(\n () => this.updateDisplay(),\n 80,\n true,\n );\n }\n\n this.updateDisplay();\n }\n\n /**\n * Stop the spinner and show success with a tick\n */\n public success(\n id: string,\n taskName?: string,\n duration?: string,\n message?: string,\n ): void {\n const task = this.tasks.get(id);\n if (task) {\n task.status = \"success\";\n if (taskName) task.taskName = taskName;\n if (duration) task.duration = duration;\n if (message) task.message = message;\n this.updateDisplay();\n }\n\n this.checkIfAllDone();\n }\n\n /**\n * Stop the spinner and show error with a cross\n */\n public error(id: string, taskName?: string): void {\n const task = this.tasks.get(id);\n if (task) {\n task.status = \"error\";\n if (taskName) task.taskName = taskName;\n this.updateDisplay();\n }\n\n this.checkIfAllDone();\n this.restoreStdout();\n }\n\n /**\n * Update the display for all tasks\n */\n protected updateDisplay(): void {\n // Clear previous spinner lines\n if (this.lastLineCount > 0) {\n for (let i = 0; i < this.lastLineCount; i++) {\n this.write(\"\\x1b[1A\\x1b[2K\");\n }\n }\n\n // Flush buffered external output (appears permanently above spinner)\n if (this.bufferedOutput.length > 0) {\n for (const chunk of this.bufferedOutput) {\n this.write(chunk);\n }\n this.bufferedOutput = [];\n }\n\n // Render all tasks\n const taskArray = Array.from(this.tasks.values());\n const prefix = this.header ? \"│ \" : \"\";\n\n for (const task of taskArray) {\n let line = prefix;\n\n if (task.status === \"running\") {\n const frame = this.frames[task.frameIndex];\n const elapsed = String(\n Math.floor(\n (this.dateTimeProvider.nowMillis() - task.startTime) / 100,\n ) / 10,\n ).padEnd(3, \".0\");\n line += `${this.colors.cyan}${frame}${this.colors.reset} ${this.colors.dim}${task.taskName}${this.colors.reset} ${this.colors.dim}${elapsed}s${this.colors.reset}`;\n task.frameIndex = (task.frameIndex + 1) % this.frames.length;\n } else if (task.status === \"success\") {\n const durationStr = task.duration\n ? ` ${this.colors.dim}${task.duration}${this.colors.reset}`\n : \"\";\n const messageStr = task.message ? ` - ${task.message}` : \"\";\n line += `${this.colors.green}✓${this.colors.reset} ${task.taskName}${durationStr}${messageStr}`;\n } else if (task.status === \"error\") {\n line += `${this.colors.red}✗${this.colors.reset} ${task.taskName}`;\n }\n\n this.write(`${line}\\n`);\n }\n\n this.lastLineCount = taskArray.length;\n }\n\n /**\n * Check if all tasks are done and stop the interval\n */\n protected checkIfAllDone(): void {\n const hasRunningTasks = Array.from(this.tasks.values()).some(\n (task) => task.status === \"running\",\n );\n\n if (!hasRunningTasks && this.spinnerInterval) {\n this.dateTimeProvider.clearInterval(this.spinnerInterval);\n this.spinnerInterval = undefined;\n }\n }\n\n /**\n * Pause the spinner animation and restore stdout so external processes\n * (e.g. interactive login) can write to the terminal directly.\n */\n public pause(): void {\n if (this.paused) return;\n this.paused = true;\n\n // Stop the animation interval\n this.stopSpinner();\n\n // Clear spinner lines from screen so external output starts clean\n if (this.lastLineCount > 0) {\n for (let i = 0; i < this.lastLineCount; i++) {\n this.write(\"\\x1b[1A\\x1b[2K\");\n }\n this.lastLineCount = 0;\n }\n\n // Close the box before external output\n if (this.header) {\n this.write(\"└───\\n\\n\");\n }\n\n this.restoreStdout();\n }\n\n /**\n * Resume the spinner animation after a pause.\n */\n public resume(): void {\n if (!this.paused) return;\n this.paused = false;\n\n // Reopen the box after external output\n if (this.header) {\n this.write(\"\\n┌───\\n\");\n }\n\n this.interceptStdout();\n\n const hasRunningTasks = Array.from(this.tasks.values()).some(\n (task) => task.status === \"running\",\n );\n\n if (hasRunningTasks) {\n this.updateDisplay();\n\n if (!this.spinnerInterval) {\n this.spinnerInterval = this.dateTimeProvider.createInterval(\n () => this.updateDisplay(),\n 80,\n true,\n );\n }\n }\n }\n\n /**\n * Stop the spinner without showing any symbol\n */\n public stopSpinner(): void {\n if (this.spinnerInterval) {\n this.dateTimeProvider.clearInterval(this.spinnerInterval);\n this.spinnerInterval = undefined;\n }\n }\n\n /**\n * Clear all tasks\n */\n public clear(): void {\n this.tasks.clear();\n this.stopSpinner();\n this.restoreStdout();\n this.lastLineCount = 0;\n }\n\n // ---------------------------------------------------------------------------\n // stdout interception\n // ---------------------------------------------------------------------------\n\n /**\n * Intercept process.stdout.write so external writes (logs, wrangler output)\n * are buffered instead of breaking the spinner animation. Buffered output is\n * flushed above the spinner area on each redraw.\n */\n protected interceptStdout(): void {\n if (this.originalStdoutWrite) return;\n\n const original = process.stdout.write.bind(process.stdout);\n this.originalStdoutWrite = original;\n\n process.stdout.write = ((\n chunk: any,\n encodingOrCb?: any,\n cb?: any,\n ): boolean => {\n if (this.isOwnWrite) {\n return original(chunk, encodingOrCb, cb);\n }\n this.bufferedOutput.push(String(chunk));\n return true;\n }) as typeof process.stdout.write;\n }\n\n /**\n * Restore the original process.stdout.write and flush remaining buffer.\n */\n protected restoreStdout(): void {\n if (!this.originalStdoutWrite) return;\n\n const original = this.originalStdoutWrite;\n this.originalStdoutWrite = undefined;\n process.stdout.write = original as typeof process.stdout.write;\n\n for (const chunk of this.bufferedOutput) {\n original(chunk);\n }\n this.bufferedOutput = [];\n }\n\n /**\n * Write to stdout bypassing the intercept.\n */\n protected write(str: string): void {\n this.isOwnWrite = true;\n process.stdout.write(str);\n this.isOwnWrite = false;\n }\n}\n","import { AlephaError } from \"alepha\";\n\nexport class CommandError extends AlephaError {\n readonly name = \"CommandError\";\n}\n","import { cp, glob, rm } from \"node:fs/promises\";\nimport { $inject, Alepha } from \"alepha\";\nimport { DateTimeProvider } from \"alepha/datetime\";\nimport { $logger } from \"alepha/logger\";\nimport { ShellProvider } from \"alepha/system\";\nimport { CommandError } from \"../errors/CommandError.ts\";\nimport { PrettyPrint } from \"./PrettyPrint.ts\";\n\nexport type Task = {\n name: string;\n handler: () => any;\n};\n\ninterface Timer {\n name: string;\n duration: string;\n}\n\nexport interface RunOptions {\n /**\n * Rename the command for logging purposes.\n */\n alias?: string;\n\n /**\n * Root directory to execute the command in.\n */\n root?: string;\n}\n\nexport interface RunnerMethod {\n (\n cmd: string | Task | Array<string | Task>,\n options?: RunOptions | (() => any),\n ): Promise<string>;\n rm: (glob: string | string[], options?: RunOptions) => Promise<string>;\n cp: (source: string, dest: string, options?: RunOptions) => Promise<string>;\n\n /**\n * Ends the runner and prints a summary of executed tasks.\n *\n * > This is automatically called at the end of command execution.\n * > But can be called manually if needed to print more stuff before the command ends.\n */\n end: () => void;\n\n /**\n * Pause the spinner so external processes can write to stdout directly.\n */\n pause: () => void;\n\n /**\n * Resume the spinner after a pause.\n */\n resume: () => void;\n}\n\nexport class Runner {\n protected readonly log = $logger();\n protected readonly dateTime = $inject(DateTimeProvider);\n protected timers: Timer[] = [];\n protected readonly startTime: number = this.dateTime.nowMillis();\n protected readonly prettyPrint = $inject(PrettyPrint);\n protected readonly alepha = $inject(Alepha);\n protected readonly shell = $inject(ShellProvider);\n public readonly run: RunnerMethod;\n protected cliName = \"\";\n protected commandName = \"\";\n protected firstTaskStarted = false;\n protected taskCounter = 0;\n\n constructor() {\n this.run = this.createRunMethod();\n }\n\n public get useDynamicLogger() {\n if (this.alepha.isCI() || this.alepha.env.CLAUDECODE) {\n return false;\n }\n\n // Runtime state overrides the env defaults (e.g. the CLI `--verbose`\n // flag sets level=debug + format=pretty), so a flag can flip the\n // stylish task UI off without restarting with LOG_* env vars.\n const logLevel = String(\n this.alepha.store.get(\"alepha.logger.level\") ??\n this.alepha.env.LOG_LEVEL ??\n \"\",\n ).toLowerCase();\n if (logLevel === \"debug\" || logLevel === \"trace\") {\n return false;\n }\n\n const format =\n this.alepha.store.get(\"alepha.logger.format\") ??\n this.alepha.env.LOG_FORMAT;\n return format === \"raw\";\n }\n\n /**\n * Start a new command session with header (for pretty print mode)\n */\n public startCommand(cliName: string, commandName: string): void {\n this.cliName = cliName;\n this.commandName = commandName;\n this.firstTaskStarted = false;\n this.taskCounter = 0;\n }\n\n protected createRunMethod() {\n const runFn: RunnerMethod = async (\n cmd: string | Task | Array<string | Task>,\n options?: RunOptions | (() => any),\n ) => {\n if (this.useDynamicLogger && !this.firstTaskStarted) {\n this.prettyPrint.startCommand(this.cliName, this.commandName);\n }\n\n this.firstTaskStarted = true;\n\n const root =\n typeof options === \"object\" && options.root ? options.root : undefined;\n\n if (Array.isArray(cmd)) {\n return await this.execute(\n cmd.map((it) =>\n typeof it === \"string\"\n ? { name: it, handler: () => this.exec(it, { root }) }\n : it,\n ),\n );\n }\n\n const alias = typeof options === \"object\" ? options.alias : undefined;\n const name = alias ?? (typeof cmd === \"string\" ? cmd : cmd.name);\n const handler =\n typeof options === \"function\"\n ? options\n : typeof cmd === \"string\"\n ? () => this.exec(cmd, { root })\n : cmd.handler;\n\n return await this.execute({\n name,\n handler,\n });\n };\n\n runFn.rm = async (\n files: string | string[],\n options: RunOptions = {},\n ): Promise<string> => {\n if (Array.isArray(files) || files.includes(\"*\")) {\n return runFn({\n name:\n options.alias ??\n `rm -rf ${Array.isArray(files) ? files.join(\" \") : files}`,\n handler: async () => {\n for await (const file of glob(files)) {\n this.log.trace(`Removing ${file}`);\n await rm(file, { recursive: true, force: true });\n }\n },\n });\n }\n this.log.trace(`Removing ${files}`);\n return runFn({\n name: options.alias ?? `rm -rf ${files}`,\n handler: () => rm(files, { recursive: true, force: true }),\n });\n };\n\n runFn.cp = async (\n source: string,\n dist: string,\n options: RunOptions = {},\n ): Promise<string> => {\n this.log.trace(`Copying ${source} to ${dist}`);\n return runFn(\n {\n name: options.alias ?? `cp -r ${source} ${dist}`,\n handler: () => cp(source, dist, { recursive: true }),\n },\n options,\n );\n };\n\n runFn.end = () => this.end();\n runFn.pause = () => {\n if (this.useDynamicLogger) this.prettyPrint.pause();\n };\n runFn.resume = () => {\n if (this.useDynamicLogger) this.prettyPrint.resume();\n };\n\n return runFn;\n }\n\n protected async exec(\n cmd: string,\n opts: { root?: string } = {},\n ): Promise<string> {\n return this.shell.run(cmd, { root: opts.root, capture: true });\n }\n\n /**\n * Executes one or more tasks.\n *\n * @param task - A single task or an array of tasks to run in parallel.\n */\n protected async execute(task: Task | Task[]): Promise<string> {\n if (Array.isArray(task)) {\n await Promise.all(task.map((t) => this.executeTask(t)));\n return \"\"; // not supported for now\n } else {\n return await this.executeTask(task);\n }\n }\n\n /**\n * Prints a summary of all executed tasks and their durations.\n */\n public end(): void {\n if (this.useDynamicLogger && this.firstTaskStarted) {\n this.prettyPrint.endCommand();\n return;\n }\n\n // Non-dynamic mode: use logging\n if (this.timers.length === 0) return;\n\n this.log.info(\"\");\n const totalTime = (\n (this.dateTime.nowMillis() - this.startTime) /\n 1000\n ).toFixed(1);\n this.log.info(`Total time: ${totalTime}s`);\n this.log.info(``);\n\n // clear timers after rendering\n this.timers = [];\n }\n\n protected async executeTask(task: Task): Promise<string> {\n const now = this.dateTime.nowMillis();\n const taskId = `task-${++this.taskCounter}`; // Use unique counter-based ID\n\n // Setup dynamic logger\n if (this.useDynamicLogger) {\n this.prettyPrint.startSpinner(taskId, task.name);\n } else {\n this.log.info(`Starting '${task.name}' ...`);\n }\n\n let stdout = \"\";\n\n try {\n stdout = String((await task.handler()) ?? \"\");\n } catch (error) {\n // Clear spinner and show error\n if (this.useDynamicLogger) {\n this.prettyPrint.error(taskId, task.name);\n }\n if (error instanceof Error && \"stdout\" in error) {\n this.log.info(`\\n\\n${error.stdout}`);\n }\n throw new CommandError(`Task '${task.name}' failed`, { cause: error });\n }\n\n if (stdout) this.log.trace(stdout);\n\n const duration = ((this.dateTime.nowMillis() - now) / 1000).toFixed(1);\n\n const message =\n stdout && !stdout.includes(\"\\n\") ? stdout.trim() : undefined;\n\n // Clear spinner and show completion\n if (this.useDynamicLogger) {\n this.prettyPrint.success(taskId, task.name, `${duration}s`, message);\n } else {\n const suffix = message ? ` - ${message}` : \"\";\n this.log.info(`Finished '${task.name}' after ${duration}s${suffix}`);\n }\n\n this.timers.push({\n name: task.name,\n duration: `${duration}s`,\n });\n\n return stdout;\n }\n\n protected renderTable(data: string[][]): void {\n if (data.length === 0) return;\n\n const col1Width = Math.max(...data.map(([col1]) => col1.length), 7);\n const col2Width = Math.max(...data.map(([, col2]) => col2.length), 8);\n\n const divider = `+${\"-\".repeat(col1Width + 2)}+${\"-\".repeat(\n col2Width + 2,\n )}+`;\n this.log.info(divider);\n this.log.info(\n `| ${\"Command\".padEnd(col1Width)} | ${\"Duration\".padEnd(col2Width)} |`,\n );\n this.log.info(divider);\n for (const [col1, col2] of data) {\n this.log.info(\n `| ${col1.padEnd(col1Width)} | ${col2.padEnd(col2Width)} |`,\n );\n }\n this.log.info(divider);\n }\n}\n","import type * as fs from \"node:fs/promises\";\nimport type { glob } from \"node:fs/promises\";\nimport {\n type Async,\n createPrimitive,\n KIND,\n Primitive,\n type Static,\n type TObject,\n type TSchema,\n t,\n} from \"alepha\";\nimport type { AskMethod } from \"../helpers/Asker.ts\";\nimport type { RunnerMethod } from \"../helpers/Runner.ts\";\n\n/**\n * Declares a CLI command.\n *\n * This primitive allows you to define a command, its flags, and its handler\n * within your Alepha application structure.\n */\nexport const $command = <\n T extends TObject,\n A extends TSchema,\n E extends TObject,\n>(\n options: CommandPrimitiveOptions<T, A, E>,\n) => createPrimitive(CommandPrimitive<T, A, E>, options);\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport interface CommandPrimitiveOptions<\n T extends TObject,\n A extends TSchema,\n E extends TObject = TObject,\n> {\n /**\n * The handler function to execute when the command is matched.\n *\n * For parent commands with children, the handler is called when:\n * - The parent command is invoked without a subcommand\n * - The parent command is invoked with --help (to show available subcommands)\n */\n handler: (args: CommandHandlerArgs<T, A, E>) => Async<void>;\n\n /**\n * The name of the command. If omitted, the property key is used.\n *\n * An empty string \"\" denotes the root command.\n */\n name?: string;\n\n /**\n * A short description of the command, shown in the help message.\n */\n description?: string;\n\n /**\n * An array of alternative names for the command.\n */\n aliases?: string[];\n\n /**\n * A TypeBox object schema defining the flags for the command.\n */\n flags?: T;\n\n /**\n * A TypeBox object schema defining required environment variables.\n *\n * Environment variables are validated before the handler runs (fail fast).\n * They are displayed in the help output under \"Env:\" section.\n *\n * @example\n * ```ts\n * $command({\n * env: t.object({\n * VERCEL_TOKEN: t.text({ description: \"Vercel API token\" }),\n * VERCEL_ORG_ID: t.optional(t.text({ description: \"Organization ID\" })),\n * }),\n * handler: async ({ env }) => {\n * // env.VERCEL_TOKEN is typed & guaranteed to exist\n * console.log(env.VERCEL_TOKEN);\n * }\n * })\n * ```\n */\n env?: E;\n\n /**\n * An optional TypeBox schema defining the arguments for the command.\n *\n * @example\n * args: t.text()\n * my-cli command <arg1: string>\n *\n * args: t.optional(t.text())\n * my-cli command [arg1: string]\n *\n * args: t.tuple([t.text(), t.number()])\n * my-cli command <arg1: string> <arg2: number>\n *\n * args: t.tuple([t.text(), t.optional(t.number())])\n * my-cli command <arg1: string> [arg2: number]\n */\n args?: A;\n\n /**\n * Marks this command as the root command.\n * Equivalent to setting name to an empty string \"\".\n */\n root?: boolean;\n\n /**\n * Run this command's handler BEFORE the specified target command.\n *\n * Pre-hooks are not listed in help and cannot be called directly.\n * They receive the same parsed flags and args as the target command.\n *\n * @example\n * ```ts\n * class BuildCommands {\n * prebuild = $command({\n * pre: \"build\",\n * handler: async ({ run }) => {\n * await run(\"cleaning dist folder...\", () => fs.rm(\"dist\"));\n * }\n * });\n *\n * build = $command({\n * name: \"build\",\n * handler: async () => { ... }\n * });\n * }\n * ```\n */\n pre?: string;\n\n /**\n * Run this command's handler AFTER the specified target command.\n *\n * Post-hooks are not listed in help and cannot be called directly.\n * They receive the same parsed flags and args as the target command.\n *\n * @example\n * ```ts\n * class BuildCommands {\n * build = $command({\n * name: \"build\",\n * handler: async () => { ... }\n * });\n *\n * postbuild = $command({\n * post: \"build\",\n * handler: async ({ run }) => {\n * await run(\"generating checksums...\", generateChecksums);\n * }\n * });\n * }\n * ```\n */\n post?: string;\n\n /**\n * If true, this command will be hidden from the help output.\n */\n hide?: boolean;\n\n /**\n * Adds a `--mode, -m` flag to load environment files.\n *\n * When enabled:\n * - Loads `.env` and `.env.local` by default\n * - With `--mode production`, also loads `.env.production` and `.env.production.local`\n * - The mode value is exposed in the handler as `mode: string | undefined`\n *\n * Set to `true` to enable with no default, or a string to set a default mode.\n *\n * This follows Vite's environment loading convention.\n * @see https://vite.dev/guide/env-and-mode\n *\n * @example\n * ```ts\n * // No default mode\n * build = $command({\n * mode: true,\n * handler: async ({ mode }) => {\n * console.log(`Building for ${mode ?? 'development'}...`);\n * }\n * });\n *\n * // Default mode \"production\"\n * deploy = $command({\n * mode: \"production\",\n * handler: async ({ mode }) => {\n * console.log(`Deploying for ${mode}...`); // always defined\n * }\n * });\n * ```\n *\n * Usage:\n * - `cli build` - loads .env (mode = undefined)\n * - `cli build --mode production` - loads .env and .env.production\n * - `cli deploy` - loads .env and .env.production (default mode)\n * - `cli deploy --mode staging` - loads .env and .env.staging\n */\n mode?: boolean | string;\n\n /**\n * Child commands (subcommands) for this command.\n *\n * When children are defined, the command becomes a parent command that\n * can be invoked with space-separated subcommands:\n *\n * @example\n * ```ts\n * class DeployCommands {\n * // Subcommands\n * vercel = $command({\n * description: \"Deploy to Vercel\",\n * handler: async () => { ... }\n * });\n *\n * cloudflare = $command({\n * description: \"Deploy to Cloudflare\",\n * handler: async () => { ... }\n * });\n *\n * // Parent command with children\n * deploy = $command({\n * description: \"Deploy the application\",\n * children: [this.vercel, this.cloudflare],\n * handler: async () => {\n * // Called when \"deploy\" is invoked without subcommand\n * console.log(\"Available: deploy vercel, deploy cloudflare\");\n * }\n * });\n * }\n * ```\n *\n * This allows CLI usage like:\n * - `cli deploy vercel` - runs the vercel subcommand\n * - `cli deploy cloudflare` - runs the cloudflare subcommand\n * - `cli deploy` - runs the parent handler (shows available subcommands)\n * - `cli deploy --help` - shows help with all available subcommands\n */\n children?: CommandPrimitive<any, any>[];\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport class CommandPrimitive<\n T extends TObject = TObject,\n A extends TSchema = TSchema,\n E extends TObject = TObject,\n> extends Primitive<CommandPrimitiveOptions<T, A, E>> {\n public readonly flags = this.options.flags ?? t.object({});\n public readonly env = this.options.env ?? t.object({});\n public readonly aliases = this.options.aliases ?? [];\n\n protected onInit() {\n if (this.options.pre || this.options.post) {\n this.options.hide ??= true;\n }\n }\n\n public get name(): string {\n if (this.options.root) {\n return \"\";\n }\n if (this.options.pre) {\n return `pre${this.options.pre}`;\n }\n if (this.options.post) {\n return `post${this.options.post}`;\n }\n return this.options.name ?? `${this.config.propertyKey}`;\n }\n\n /**\n * Get the child commands (subcommands) for this command.\n */\n public get children(): CommandPrimitive<any, any>[] {\n return this.options.children ?? [];\n }\n\n /**\n * Check if this command has child commands (is a parent command).\n */\n public get hasChildren(): boolean {\n return this.children.length > 0;\n }\n\n /**\n * Find a child command by name or alias.\n */\n public findChild(name: string): CommandPrimitive<any, any> | undefined {\n return this.children.find(\n (child) => child.name === name || child.aliases.includes(name),\n );\n }\n}\n\n$command[KIND] = CommandPrimitive;\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport interface CommandHandlerArgs<\n T extends TObject,\n A extends TSchema = TSchema,\n E extends TObject = TObject,\n> {\n flags: Static<T>;\n args: A extends TSchema ? Static<A> : Array<string>;\n env: Static<E>;\n run: RunnerMethod;\n ask: AskMethod;\n glob: typeof glob;\n fs: typeof fs;\n\n /**\n * The root directory where the command is executed.\n */\n root: string;\n\n /**\n * Display help for the current command.\n *\n * Useful for parent commands with children to show available subcommands\n * when invoked without a specific subcommand.\n *\n * @example\n * ```ts\n * deploy = $command({\n * children: [this.vercel, this.cloudflare],\n * handler: async ({ help }) => {\n * help(); // Shows available subcommands\n * }\n * });\n * ```\n */\n help: () => void;\n\n /**\n * The current execution mode (e.g., \"development\", \"production\", \"staging\").\n *\n * Use --mode flag to set this value when running the command.\n */\n mode?: string;\n}\n","import * as fs from \"node:fs/promises\";\nimport { glob } from \"node:fs/promises\";\nimport {\n $atom,\n $env,\n $hook,\n $inject,\n $state,\n Alepha,\n type Static,\n type TObject,\n type TSchema,\n type TUnion,\n TypeBoxError,\n t,\n} from \"alepha\";\nimport { $logger, ConsoleColorProvider } from \"alepha/logger\";\nimport { CommandError } from \"../errors/CommandError.ts\";\nimport { Asker } from \"../helpers/Asker.ts\";\nimport { EnvUtils } from \"../helpers/EnvUtils.ts\";\nimport { Runner } from \"../helpers/Runner.ts\";\nimport {\n $command,\n type CommandHandlerArgs,\n type CommandPrimitive,\n} from \"../primitives/$command.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nconst envSchema = t.object({\n CLI_NAME: t.text({\n default: \"cli\",\n description: \"Name of the CLI application.\",\n }),\n CLI_DESCRIPTION: t.text({\n default: \"\",\n description: \"Description of the CLI application.\",\n }),\n});\n\ndeclare module \"alepha\" {\n interface Env extends Partial<Static<typeof envSchema>> {}\n}\n\n/**\n * CLI provider configuration atom\n */\nexport const cliOptions = $atom({\n name: \"alepha.command.cli.options\",\n schema: t.object({\n name: t.optional(\n t.string({\n description: \"Name of the CLI application.\",\n }),\n ),\n description: t.optional(\n t.string({\n description: \"Description of the CLI application.\",\n }),\n ),\n argv: t.optional(\n t.array(t.string(), {\n description: \"Command line arguments to parse.\",\n }),\n ),\n }),\n default: {},\n});\n\nexport type CliProviderOptions = Static<typeof cliOptions.schema>;\n\ndeclare module \"alepha\" {\n interface State {\n [cliOptions.key]: CliProviderOptions;\n }\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n/**\n * CLI provider for parsing and executing commands.\n *\n * Handles:\n * - Command resolution (simple, nested, colon-notation)\n * - Flag and argument parsing\n * - Environment variable validation\n * - Help generation\n * - Pre/post command hooks\n *\n * @example\n * ```typescript\n * // Define a command\n * class MyCommands {\n * build = $command({\n * name: \"build\",\n * description: \"Build the project\",\n * flags: t.object({ watch: t.optional(t.boolean()) }),\n * handler: async ({ flags }) => { ... }\n * });\n * }\n *\n * // CLI automatically discovers and executes commands\n * const alepha = Alepha.create().with(MyCommands);\n * ```\n */\nexport class CliProvider {\n // ─────────────────────────────────────────────────────────────────────────────\n // Dependencies\n // ─────────────────────────────────────────────────────────────────────────────\n\n protected readonly env = $env(envSchema);\n protected readonly alepha = $inject(Alepha);\n protected readonly log = $logger();\n protected readonly color = $inject(ConsoleColorProvider);\n protected readonly runner = $inject(Runner);\n protected readonly asker = $inject(Asker);\n protected readonly envUtils = $inject(EnvUtils);\n protected readonly options = $state(cliOptions);\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Configuration\n // ─────────────────────────────────────────────────────────────────────────────\n\n protected get name(): string {\n return this.options.name || this.env.CLI_NAME;\n }\n\n protected get description(): string {\n return this.options.description || this.env.CLI_DESCRIPTION;\n }\n\n protected get argv(): string[] {\n return (\n this.options.argv ||\n (typeof process !== \"undefined\" ? process.argv.slice(2) : [])\n );\n }\n\n /**\n * Global flags available to all commands.\n */\n protected readonly globalFlags = {\n help: {\n aliases: [\"h\", \"help\"],\n description: \"Show this help message\",\n schema: t.boolean(),\n },\n verbose: {\n // No `-v` alias — it collides with `--version` on the root command.\n aliases: [\"verbose\"],\n description:\n \"Verbose output: debug logs in plain pretty format (turns off the dynamic CLI UI).\",\n schema: t.boolean(),\n },\n };\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Lifecycle\n // ─────────────────────────────────────────────────────────────────────────────\n\n /**\n * Main entry point - resolves and executes the command from process.argv.\n * This is the production execution path with full lifecycle support.\n */\n protected readonly onReady = $hook({\n on: \"ready\",\n handler: async () => {\n const argv = [...this.argv];\n\n // Extract positional arguments (potential command path)\n const positionalArgs = argv.filter((arg) => !arg.startsWith(\"-\"));\n\n // Resolve command using space-separated or colon-notation\n const { command, consumedArgs } = this.resolveCommand(positionalArgs);\n\n const globalFlags = this.parseFlags(\n argv,\n Object.entries(this.getAllGlobalFlags()).map(([key, value]) => ({\n key,\n ...value,\n })),\n { strict: false }, // Don't throw for command-specific flags\n );\n\n // `--verbose` → flip the logger to debug + plain pretty output via\n // state (read live by Logger + Runner). Set before the command runs\n // so its output and task UI honor it.\n if (globalFlags.verbose) {\n this.alepha.store.set(\"alepha.logger.level\", \"debug\");\n this.alepha.store.set(\"alepha.logger.format\", \"pretty\");\n }\n\n if (globalFlags.help) {\n this.printHelp(command);\n return;\n }\n\n if (!command) {\n // Check if there's a root command (name === \"\")\n const rootCommand = this.findCommand(\"\");\n\n // If we have positional args but no matching command, show error\n const commandName = positionalArgs[0] ?? \"\";\n if (commandName !== \"\" && !rootCommand?.options.args) {\n this.log.error(`Unknown command: '${commandName}'`);\n this.printHelp();\n return;\n }\n\n // Execute root command if it exists\n if (rootCommand) {\n await this.executeCommand(rootCommand, argv, true);\n return;\n }\n\n // No command found and no root command\n return;\n }\n\n // Remove consumed command path args from argv for argument parsing\n const remainingArgv = this.removeConsumedArgs(argv, consumedArgs);\n\n // Since we've removed the command path, treat it like a root command for parsing\n await this.executeCommand(command, remainingArgv, true);\n },\n });\n\n /**\n * Execute a command with full lifecycle support.\n *\n * This is the production execution path that includes:\n * - Mode-based .env file loading\n * - Pre/post command hooks\n * - Runner session for pretty CLI output\n * - Alepha context wrapper for proper scoping\n *\n * @see run() for a lightweight test-only alternative\n */\n protected async executeCommand(\n command: CommandPrimitive<TObject>,\n argv: string[],\n isRootCommand: boolean,\n ): Promise<void> {\n const root = process.cwd();\n\n // Handle --mode flag if command has mode option enabled\n let modeValue: string | undefined;\n if (command.options.mode) {\n modeValue = this.parseModeFlag(argv);\n // Use default mode if not provided and mode is a string\n if (modeValue === undefined && typeof command.options.mode === \"string\") {\n modeValue = command.options.mode;\n }\n await this.loadModeEnv(root, modeValue);\n }\n\n const commandFlags = this.parseCommandFlags(argv, command.flags, {\n modeEnabled: !!command.options.mode,\n });\n const commandArgs = this.parseCommandArgs(\n argv,\n command.options.args,\n isRootCommand,\n command.flags,\n );\n const commandEnv = this.parseCommandEnv(command.env, command.name);\n\n await this.alepha.context.run(async () => {\n this.log.debug(`Executing command '${command.name}'...`, {\n flags: commandFlags,\n args: commandArgs,\n mode: modeValue,\n });\n\n const runner = this.runner;\n\n // Start command session for pretty print\n runner.startCommand(this.name, command.name);\n\n const args = {\n flags: commandFlags,\n args: commandArgs,\n env: commandEnv,\n run: runner.run,\n ask: this.asker.ask,\n fs,\n glob,\n root,\n help: () => this.printHelp(command),\n mode: modeValue,\n };\n\n // Execute pre-hooks\n const preHooks = this.findPreHooks(command.name);\n for (const hook of preHooks) {\n this.log.debug(`Executing pre-hook for '${command.name}'...`);\n await hook.options.handler(args as CommandHandlerArgs<TObject>);\n }\n\n // Execute main command\n await command.options.handler(args as CommandHandlerArgs<TObject>);\n\n // Execute post-hooks\n const postHooks = this.findPostHooks(command.name);\n for (const hook of postHooks) {\n this.log.debug(`Executing post-hook for '${command.name}'...`);\n await hook.options.handler(args as CommandHandlerArgs<TObject>);\n }\n\n runner.end();\n\n this.log.debug(`Command '${command.name}' executed successfully.`);\n });\n }\n\n /**\n * Remove consumed command path arguments from argv (keeps flags and remaining args).\n */\n protected removeConsumedArgs(\n argv: string[],\n consumedArgs: string[],\n ): string[] {\n const result: string[] = [];\n let consumedIndex = 0;\n\n for (const arg of argv) {\n if (arg.startsWith(\"-\")) {\n result.push(arg);\n } else if (\n consumedIndex < consumedArgs.length &&\n arg === consumedArgs[consumedIndex]\n ) {\n consumedIndex++;\n // Skip this arg, it's part of the command path\n } else {\n result.push(arg);\n }\n }\n\n return result;\n }\n\n /**\n * Resolve a command from positional arguments.\n *\n * Supports:\n * 1. Space-separated subcommands: `deploy vercel` -> finds deploy command, then vercel child\n * 2. Colon notation (backwards compat): `deploy:vercel` -> finds command with name \"deploy:vercel\"\n * 3. Simple commands: `build` -> finds command with name \"build\"\n */\n protected resolveCommand(positionalArgs: string[]): {\n command: CommandPrimitive<TObject> | undefined;\n consumedArgs: string[];\n } {\n if (positionalArgs.length === 0) {\n return { command: undefined, consumedArgs: [] };\n }\n\n const firstArg = positionalArgs[0];\n\n // First, try colon notation for backwards compatibility (e.g., \"deploy:vercel\")\n if (firstArg.includes(\":\")) {\n const command = this.findCommand(firstArg);\n if (command) {\n return { command, consumedArgs: [firstArg] };\n }\n }\n\n // Try to find command with space-separated subcommand path\n // Only search top-level commands to avoid child commands shadowing\n // top-level ones (e.g., \"platform > build\" shadowing standalone \"build\")\n let currentCommand = this.findTopLevelCommand(firstArg);\n const consumedArgs: string[] = [];\n\n if (!currentCommand) {\n return { command: undefined, consumedArgs: [] };\n }\n\n consumedArgs.push(firstArg);\n\n // Walk through remaining args to find nested subcommands\n for (let i = 1; i < positionalArgs.length; i++) {\n const arg = positionalArgs[i];\n\n if (!currentCommand.hasChildren) {\n break;\n }\n\n const childCommand = currentCommand.findChild(arg);\n if (childCommand) {\n currentCommand = childCommand;\n consumedArgs.push(arg);\n } else {\n // No matching child, stop here\n break;\n }\n }\n\n return { command: currentCommand, consumedArgs };\n }\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Public API\n // ─────────────────────────────────────────────────────────────────────────────\n\n /**\n * Get all registered commands in the application.\n */\n public get commands(): CommandPrimitive<any>[] {\n return this.alepha.primitives($command);\n }\n\n /**\n * Execute a command handler with given arguments.\n *\n * This is a **lightweight test helper** that directly invokes the command handler\n * without the full production lifecycle. It intentionally skips:\n * - Pre/post command hooks\n * - Runner session (pretty CLI output)\n * - Alepha context wrapper\n * - .env.{mode} file loading\n *\n * For production execution, the `onReady` hook uses `executeCommand()` which\n * provides the full lifecycle. Merging them would either make this method too\n * heavy for simple testing or require many optional parameters to toggle behaviors.\n *\n * @example\n * ```typescript\n * // In tests\n * const cli = alepha.inject(CliProvider);\n * const cmd = alepha.inject(InitCommand);\n *\n * await cli.run(cmd.init, \"--agent --pm=yarn\");\n * await cli.run(cmd.init, { argv: \"--agent\", root: \"/project\" });\n * ```\n */\n public async run<T extends TObject, A extends TSchema>(\n command: CommandPrimitive<T, A>,\n options:\n | string\n | string[]\n | { argv?: string | string[]; root?: string } = {},\n ): Promise<void> {\n const opts =\n typeof options === \"string\" || Array.isArray(options)\n ? { argv: options }\n : options;\n const args =\n typeof opts.argv === \"string\"\n ? opts.argv.split(\" \").filter(Boolean)\n : (opts.argv ?? []);\n const root = opts.root ?? process.cwd();\n\n const commandFlags = this.parseCommandFlags(args, command.flags, {\n modeEnabled: !!command.options.mode,\n });\n const commandArgs = this.parseCommandArgs(\n args,\n command.options.args,\n true,\n command.flags,\n );\n const commandEnv = this.parseCommandEnv(command.env, command.name);\n\n let modeValue: string | undefined;\n if (command.options.mode) {\n modeValue = this.parseModeFlag(args);\n if (modeValue === undefined && typeof command.options.mode === \"string\") {\n modeValue = command.options.mode;\n }\n }\n\n await command.options.handler({\n flags: commandFlags,\n args: commandArgs,\n env: commandEnv,\n run: this.runner.run,\n ask: this.asker.ask,\n fs,\n glob,\n root,\n help: () => this.printHelp(command),\n mode: modeValue,\n } as CommandHandlerArgs<T, A>);\n }\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Command Resolution\n // ─────────────────────────────────────────────────────────────────────────────\n\n /**\n * Find a command by name or alias\n */\n protected findCommand(name: string): CommandPrimitive<TObject> | undefined {\n return this.commands.findLast(\n (command) => command.name === name || command.aliases.includes(name),\n );\n }\n\n /**\n * Find a top-level command by name or alias (excludes child commands)\n */\n protected findTopLevelCommand(\n name: string,\n ): CommandPrimitive<TObject> | undefined {\n return this.getTopLevelCommands().findLast(\n (command) => command.name === name || command.aliases.includes(name),\n );\n }\n\n /**\n * Find all pre-hooks for a command (commands named `pre{commandName}`)\n */\n protected findPreHooks(commandName: string): CommandPrimitive<TObject>[] {\n return this.commands.filter((cmd) => cmd.name === `pre${commandName}`);\n }\n\n /**\n * Find all post-hooks for a command (commands named `post{commandName}`)\n */\n protected findPostHooks(commandName: string): CommandPrimitive<TObject>[] {\n return this.commands.filter((cmd) => cmd.name === `post${commandName}`);\n }\n\n /**\n * Get global flags (help only, root command flags are NOT global)\n */\n protected getAllGlobalFlags(): Record<\n string,\n { aliases: string[]; description?: string; schema: TSchema }\n > {\n return { ...this.globalFlags };\n }\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Parsing (Flags, Args, Env)\n // ─────────────────────────────────────────────────────────────────────────────\n\n /**\n * Parse command flags from argv using the command's flag schema\n */\n protected parseCommandFlags(\n argv: string[],\n schema: TObject,\n options: { modeEnabled?: boolean } = {},\n ): Record<string, any> {\n const { modeEnabled = false } = options;\n const flagDefs = Object.entries(schema.properties).map(([key, value]) => ({\n key,\n aliases: [\n key,\n ...((value as any).aliases ??\n ((value as any).alias ? [(value as any).alias] : undefined) ??\n []),\n ],\n description: (value as any).description,\n schema: value,\n }));\n\n // Add mode flags if mode is enabled (they're parsed elsewhere by parseModeFlag)\n if (modeEnabled) {\n flagDefs.push({\n key: \"__mode__\",\n aliases: [\"mode\", \"m\"],\n description: undefined,\n schema: t.string(),\n });\n }\n\n // Tolerate global flags (--help, --verbose) so strict command parsing\n // doesn't reject them — they're consumed by the onReady global pass,\n // not by the command. Skip any whose alias the command already claims\n // (e.g. a command with its own `verbose` flag handles it directly).\n const claimed = new Set(flagDefs.flatMap((d) => d.aliases));\n for (const [key, value] of Object.entries(this.getAllGlobalFlags())) {\n if (value.aliases.some((a: string) => claimed.has(a))) continue;\n flagDefs.push({\n key: `__global_${key}__`,\n aliases: value.aliases,\n description: undefined,\n schema: value.schema,\n });\n }\n\n const parsed = this.parseFlags(argv, flagDefs);\n\n // Remove the mode + global flags from parsed result (handled separately)\n parsed.__mode__ = undefined;\n for (const key of Object.keys(parsed)) {\n if (key.startsWith(\"__global_\")) delete parsed[key];\n }\n\n // apply manually defaults for optional properties that have defaults\n for (const [key, value] of Object.entries(schema.properties)) {\n if (!(key in parsed) && t.schema.isOptional(value)) {\n const innerSchema = value;\n if (innerSchema && \"default\" in innerSchema) {\n parsed[key] = innerSchema.default;\n }\n }\n }\n\n try {\n return this.alepha.codec.decode(schema, parsed);\n } catch (error) {\n if (error instanceof TypeBoxError) {\n throw new CommandError(\n `Invalid flag: ${error.cause.instancePath || \"command\"} ${error.cause.message}`,\n );\n }\n throw error;\n }\n }\n\n /**\n * Parse and validate environment variables using the command's env schema\n */\n protected parseCommandEnv(\n schema: TObject,\n commandName: string,\n ): Record<string, any> {\n const result: Record<string, any> = {};\n const missing: string[] = [];\n\n for (const [key, propSchema] of Object.entries(schema.properties)) {\n const value = process.env[key];\n\n if (value !== undefined) {\n result[key] = value;\n } else if (\"default\" in propSchema) {\n result[key] = propSchema.default;\n } else if (t.schema.isOptional(propSchema)) {\n // Optional with no default — leave undefined\n } else {\n missing.push(key);\n }\n }\n\n if (missing.length > 0) {\n const vars = missing.join(\", \");\n throw new CommandError(\n `Missing required environment variable${missing.length > 1 ? \"s\" : \"\"}: ${vars}`,\n );\n }\n\n try {\n return this.alepha.codec.decode(schema, result);\n } catch (error) {\n if (error instanceof TypeBoxError) {\n throw new CommandError(\n `Invalid environment variable: ${error.cause.instancePath || \"env\"} ${error.cause.message}`,\n );\n }\n throw error;\n }\n }\n\n /**\n * Parse --mode or -m flag from argv for environment file loading\n */\n protected parseModeFlag(argv: string[]): string | undefined {\n for (let i = 0; i < argv.length; i++) {\n const arg = argv[i];\n\n // Handle --mode=value or -m=value\n if (arg.startsWith(\"--mode=\") || arg.startsWith(\"-m=\")) {\n return arg.split(\"=\")[1];\n }\n\n // Handle --mode value or -m value\n if (arg === \"--mode\" || arg === \"-m\") {\n const nextArg = argv[i + 1];\n if (nextArg && !nextArg.startsWith(\"-\")) {\n return nextArg;\n }\n throw new CommandError(\"Flag --mode requires a value.\");\n }\n }\n\n return undefined;\n }\n\n /**\n * Load .env and .env.{mode} files into process.env\n */\n protected async loadModeEnv(\n root: string,\n mode: string | undefined,\n ): Promise<void> {\n const envFiles = [\".env\"];\n if (mode) {\n envFiles.push(`.env.${mode}`);\n }\n this.log.debug(`Loading env files: ${envFiles.join(\", \")}`);\n await this.envUtils.loadEnv(root, envFiles);\n }\n\n /**\n * Low-level flag parser - extracts flag values from argv based on definitions\n */\n protected parseFlags(\n argv: string[],\n flagDefs: { key: string; aliases: string[]; schema: TSchema }[],\n options: { strict?: boolean } = {},\n ): Record<string, any> {\n const { strict = true } = options;\n const result: Record<string, any> = {};\n\n for (let i = 0; i < argv.length; i++) {\n const arg = argv[i];\n if (!arg.startsWith(\"-\")) continue;\n\n const [rawKey, ...valueParts] = arg.replace(/^-{1,2}/, \"\").split(\"=\");\n let value = valueParts.join(\"=\");\n\n const def = flagDefs.find((d) => d.aliases.includes(rawKey));\n if (!def) {\n if (strict) {\n throw new CommandError(`Unknown flag: --${rawKey}`);\n }\n continue;\n }\n\n // Check if schema is a union containing boolean (allows flag without value)\n const isUnionWithBoolean =\n t.schema.isUnion(def.schema) &&\n (def.schema as TUnion).anyOf.some((s) => t.schema.isBoolean(s));\n\n if (t.schema.isBoolean(def.schema)) {\n result[def.key] = true;\n } else if (isUnionWithBoolean && !value) {\n // Union with boolean: --flag without value → true\n const nextArg = argv[i + 1];\n if (nextArg && !nextArg.startsWith(\"-\")) {\n // Has a value after space: --flag value\n result[def.key] = nextArg;\n i++; // consume next arg\n } else {\n // No value: --flag → true\n result[def.key] = true;\n }\n } else if (value) {\n // Value provided via --flag=value syntax\n try {\n if (t.schema.isObject(def.schema) || t.schema.isArray(def.schema)) {\n result[def.key] = JSON.parse(value);\n } else {\n result[def.key] = value;\n }\n } catch {\n throw new CommandError(`Invalid JSON value for flag --${rawKey}`);\n }\n } else {\n // Check for space-separated value: --flag value\n const nextArg = argv[i + 1];\n if (nextArg && !nextArg.startsWith(\"-\")) {\n value = nextArg;\n try {\n if (t.schema.isObject(def.schema) || t.schema.isArray(def.schema)) {\n result[def.key] = JSON.parse(value);\n } else {\n result[def.key] = value;\n }\n } catch {\n throw new CommandError(`Invalid JSON value for flag --${rawKey}`);\n }\n } else {\n throw new CommandError(`Flag --${rawKey} requires a value.`);\n }\n }\n }\n\n return result;\n }\n\n /**\n * Get indices of argv elements consumed by flags (for separating args from flags)\n */\n protected getFlagConsumedIndices(\n argv: string[],\n flagDefs: { key: string; aliases: string[]; schema: TSchema }[],\n ): Set<number> {\n const consumed = new Set<number>();\n\n for (let i = 0; i < argv.length; i++) {\n const arg = argv[i];\n if (!arg.startsWith(\"-\")) continue;\n\n consumed.add(i);\n\n const [rawKey, ...valueParts] = arg.replace(/^-{1,2}/, \"\").split(\"=\");\n const hasEqualValue = valueParts.length > 0;\n\n const def = flagDefs.find((d) => d.aliases.includes(rawKey));\n if (!def) continue;\n\n // Check if schema is a union containing boolean\n const isUnionWithBoolean =\n t.schema.isUnion(def.schema) &&\n (def.schema as TUnion).anyOf.some((s) => t.schema.isBoolean(s));\n\n // If not a boolean flag and no = value, the next arg is consumed as the value\n // Exception: union with boolean can work without a value\n if (\n !t.schema.isBoolean(def.schema) &&\n !isUnionWithBoolean &&\n !hasEqualValue\n ) {\n const nextArg = argv[i + 1];\n if (nextArg && !nextArg.startsWith(\"-\")) {\n consumed.add(i + 1);\n }\n } else if (isUnionWithBoolean && !hasEqualValue) {\n // Union with boolean: check if next arg looks like a value (not a flag)\n const nextArg = argv[i + 1];\n if (nextArg && !nextArg.startsWith(\"-\")) {\n consumed.add(i + 1);\n }\n }\n }\n\n return consumed;\n }\n\n protected parseCommandArgs(\n argv: string[],\n schema?: TSchema,\n isRootCommand = false,\n flagSchema?: TObject,\n ): any {\n if (!schema) {\n return undefined;\n }\n\n // Get indices consumed by flags (including space-separated values)\n const flagDefs = flagSchema\n ? Object.entries(flagSchema.properties).map(([key, value]) => ({\n key,\n aliases: [\n key,\n ...((value as any).aliases ??\n ((value as any).alias ? [(value as any).alias] : undefined) ??\n []),\n ],\n schema: value as TSchema,\n }))\n : [];\n const consumedIndices = this.getFlagConsumedIndices(argv, flagDefs);\n\n // Extract positional arguments (non-flag arguments that aren't consumed as flag values)\n const positionalArgs = argv.filter(\n (arg, idx) => !arg.startsWith(\"-\") && !consumedIndices.has(idx),\n );\n // For root commands, there's no command name to remove; otherwise slice off the command name\n const argsOnly = isRootCommand ? positionalArgs : positionalArgs.slice(1);\n\n try {\n if (t.schema.isOptional(schema)) {\n // Handle optional args: t.optional(t.text())\n if (argsOnly.length === 0) {\n return undefined;\n }\n return this.parseArgumentValue(argsOnly[0], schema);\n } else if (t.schema.isTuple(schema) && schema.items) {\n // Handle tuple args: t.tuple([t.text(), t.number()])\n const result: any[] = [];\n const items = schema.items;\n for (let i = 0; i < items.length; i++) {\n const itemSchema = items[i];\n if (i < argsOnly.length) {\n result.push(this.parseArgumentValue(argsOnly[i], itemSchema));\n } else if (t.schema.isOptional(itemSchema)) {\n result.push(undefined);\n } else {\n throw new CommandError(\n `Missing required argument at position ${i + 1}`,\n );\n }\n }\n return result;\n } else {\n // Handle single arg: t.text(), t.number(), etc.\n if (argsOnly.length === 0) {\n throw new CommandError(\"Missing required argument\");\n }\n return this.parseArgumentValue(argsOnly[0], schema);\n }\n } catch (error) {\n if (error instanceof TypeBoxError) {\n throw new CommandError(`Invalid argument: ${error.value.message}`);\n }\n throw error;\n }\n }\n\n /**\n * Convert a string argument value to the appropriate type based on schema\n */\n protected parseArgumentValue(value: string, schema: TSchema): any {\n if (t.schema.isString(schema)) {\n return value;\n }\n\n if (t.schema.isNumber(schema) || t.schema.isInteger(schema)) {\n const num = Number(value);\n if (Number.isNaN(num)) {\n throw new CommandError(`Expected number, got \"${value}\"`);\n }\n if (t.schema.isInteger(schema) && !Number.isInteger(num)) {\n throw new CommandError(`Expected integer, got \"${value}\"`);\n }\n return num;\n }\n\n if (t.schema.isBoolean(schema)) {\n const lower = value.toLowerCase();\n if (lower === \"true\" || lower === \"1\") return true;\n if (lower === \"false\" || lower === \"0\") return false;\n throw new CommandError(`Expected boolean, got \"${value}\"`);\n }\n\n // For other types, return the string value and let TypeBox validate it\n return value;\n }\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Help Generation\n // ─────────────────────────────────────────────────────────────────────────────\n\n /**\n * Generate usage string for command arguments (e.g., \"<path>\" or \"[path]\")\n */\n protected generateArgsUsage(schema?: TSchema): string {\n if (!schema) {\n return \"\";\n }\n\n if (t.schema.isOptional(schema)) {\n const typeName = this.getTypeName(schema);\n const key = \"title\" in schema ? (schema as any).title : \"arg1\";\n return ` [${key}${typeName}]`;\n }\n\n if (t.schema.isTuple(schema) && schema.items) {\n const items = schema.items;\n const args = items.map((item, index) => {\n const argName = `arg${index + 1}`;\n const typeName = this.getTypeName(item);\n if (t.schema.isOptional(item)) {\n return `[${argName}${typeName}]`;\n }\n return `<${argName}${typeName}>`;\n });\n return ` ${args.join(\" \")}`;\n }\n\n const typeName = this.getTypeName(schema);\n const key = \"title\" in schema ? (schema as any).title : \"arg1\";\n return ` <${key}${typeName}>`;\n }\n\n /**\n * Get display type name for a schema (e.g., \": number\", \": boolean\")\n */\n protected getTypeName(schema: TSchema): string {\n if (!schema) return \"\";\n\n // Check TypeBox type guards first\n if (t.schema.isString(schema)) return \"\";\n if (t.schema.isNumber(schema)) return \": number\";\n if (t.schema.isInteger(schema)) return \": integer\";\n if (t.schema.isBoolean(schema)) return \": boolean\";\n\n return \"\";\n }\n\n /**\n * Print help for a specific command or general CLI help.\n *\n * @param command - If provided, shows help for this specific command.\n * If omitted, shows general CLI help with all commands.\n */\n public printHelp(command?: CommandPrimitive<any>): void {\n const cliName = this.name || \"cli\";\n const c = this.color;\n this.log.info(\"\"); // Newline\n\n if (command?.name) {\n // Command-specific help\n const hasChildren = command.hasChildren;\n const argsUsage = hasChildren\n ? ` ${c.set(\"CYAN\", \"<command>\")}`\n : this.generateColoredArgsUsage(command.options.args);\n const commandPath = this.getCommandPath(command);\n const usage =\n `${c.set(\"GREY_LIGHT\", cliName)} ${c.set(\"CYAN\", commandPath)}${argsUsage}`.trim();\n this.log.info(`${c.set(\"WHITE_BOLD\", \"Usage:\")} ${usage}`);\n\n if (command.options.description) {\n this.log.info(``);\n this.log.info(`\\t${command.options.description}`);\n }\n\n // Show subcommands if this is a parent command\n if (hasChildren) {\n this.log.info(\"\");\n this.log.info(c.set(\"WHITE_BOLD\", \"Commands:\"));\n const maxSubCmdLength = this.getMaxChildCmdLength(command.children);\n\n for (const child of command.children) {\n if (child.options.hide) {\n continue;\n }\n const childArgsUsage = this.generateArgsUsage(child.options.args);\n const cmdStr = [child.name, ...child.aliases].join(\", \");\n const fullCmdStr = `${cmdStr}${childArgsUsage}`;\n const coloredCmd = `${c.set(\"GREY_LIGHT\", cliName)} ${c.set(\"CYAN\", commandPath)} ${c.set(\"CYAN\", fullCmdStr)}`;\n const padding = \" \".repeat(\n Math.max(0, maxSubCmdLength - fullCmdStr.length),\n );\n this.log.info(\n ` ${coloredCmd}${padding} ${child.options.description ?? \"\"}`,\n );\n }\n }\n\n this.log.info(\"\");\n this.log.info(c.set(\"WHITE_BOLD\", \"Flags:\"));\n\n const flags = [\n ...Object.entries(command.flags.properties).map(([key, value]) => ({\n key,\n schema: value,\n aliases: [\n key,\n ...((value as any).aliases ??\n ((value as any).alias ? [(value as any).alias] : [])),\n ],\n description: (value as any).description,\n })),\n // Add --mode flag if command has mode option enabled\n ...(command.options.mode\n ? [\n {\n key: \"mode\",\n aliases: [\"m\", \"mode\"],\n description:\n typeof command.options.mode === \"string\"\n ? `Environment mode - loads .env.{mode} (default: ${command.options.mode})`\n : \"Environment mode (e.g., production, staging) - loads .env.{mode}\",\n schema: t.string() as TSchema,\n },\n ]\n : []),\n ...Object.entries(this.getAllGlobalFlags()).map(([key, value]) => ({\n key,\n ...value,\n })),\n ];\n\n const maxFlagLength = this.getMaxFlagLength(flags);\n for (const flag of flags) {\n const { aliases, description } = flag;\n const schema = \"schema\" in flag ? (flag.schema as TSchema) : undefined;\n // Sort aliases by length (shorter first: -t before --target)\n const sortedAliases = (Array.isArray(aliases) ? aliases : [aliases])\n .slice()\n .sort((a, b) => a.length - b.length);\n const flagStr = sortedAliases\n .map((a: string) => (a.length === 1 ? `-${a}` : `--${a}`))\n .join(\", \");\n const coloredFlag = c.set(\"GREY_LIGHT\", flagStr);\n const padding = \" \".repeat(Math.max(0, maxFlagLength - flagStr.length));\n const formattedDesc = this.formatFlagDescription(description, schema);\n this.log.info(` ${coloredFlag}${padding} ${formattedDesc}`);\n }\n\n // Show environment variables if defined\n const envVars = Object.entries(command.env.properties);\n if (envVars.length > 0) {\n this.log.info(\"\");\n this.log.info(c.set(\"WHITE_BOLD\", \"Env:\"));\n const maxEnvLength = Math.max(...envVars.map(([key]) => key.length));\n for (const [key, schema] of envVars) {\n const isOptional = t.schema.isOptional(schema as TSchema);\n const description = (schema as any).description ?? \"\";\n const optionalStr = isOptional\n ? c.set(\"GREY_DARK\", \" (optional)\")\n : c.set(\"RED\", \" (required)\");\n const coloredKey = c.set(\"CYAN\", key);\n const padding = \" \".repeat(Math.max(0, maxEnvLength - key.length));\n this.log.info(\n ` ${coloredKey}${padding} ${description}${optionalStr}`,\n );\n }\n }\n } else {\n // general help\n this.log.info(this.description || \"Available commands:\");\n this.log.info(\"\");\n this.log.info(c.set(\"WHITE_BOLD\", \"Commands:\"));\n\n // Get top-level commands (commands that are not children of other commands)\n const topLevelCommands = this.getTopLevelCommands();\n const maxCmdLength = this.getMaxCmdLength(topLevelCommands);\n\n for (const cmd of topLevelCommands) {\n // skip root command and hooks in list\n if (cmd.name === \"\" || cmd.options.hide) {\n continue;\n }\n\n const cmdStr = [cmd.name, ...cmd.aliases].join(\", \");\n const argsUsage = cmd.hasChildren\n ? \" <command>\"\n : this.generateArgsUsage(cmd.options.args);\n const fullCmdStr = `${cmdStr}${argsUsage}`;\n const coloredCmd = `${c.set(\"GREY_LIGHT\", cliName)} ${c.set(\"CYAN\", fullCmdStr)}`;\n const padding = \" \".repeat(\n Math.max(0, maxCmdLength - fullCmdStr.length),\n );\n this.log.info(\n ` ${coloredCmd}${padding} ${cmd.options.description ?? \"\"}`,\n );\n }\n\n this.log.info(\"\");\n this.log.info(c.set(\"WHITE_BOLD\", \"Flags:\"));\n\n // In general help, also show root command flags\n const rootCommand = this.commands.find((cmd) => cmd.name === \"\");\n const rootFlags = rootCommand\n ? Object.entries(rootCommand.flags.properties).map(([key, value]) => ({\n key,\n aliases: [\n key,\n ...((value as any).aliases ??\n ((value as any).alias ? [(value as any).alias] : undefined) ??\n []),\n ],\n description: (value as any).description,\n schema: value as TSchema,\n }))\n : [];\n\n const globalFlags = [\n ...rootFlags,\n ...Object.values(this.getAllGlobalFlags()),\n ];\n const maxFlagLength = this.getMaxFlagLength(globalFlags);\n for (const { aliases, description, schema } of globalFlags) {\n const flagStr = aliases\n .map((a) => (a.length === 1 ? `-${a}` : `--${a}`))\n .join(\", \");\n const coloredFlag = c.set(\"GREY_LIGHT\", flagStr);\n const padding = \" \".repeat(Math.max(0, maxFlagLength - flagStr.length));\n const formattedDesc = this.formatFlagDescription(description, schema);\n this.log.info(` ${coloredFlag}${padding} ${formattedDesc}`);\n }\n }\n this.log.info(\"\"); // Newline\n }\n\n /**\n * Generate colored usage string for command arguments (for help display)\n */\n protected generateColoredArgsUsage(schema?: TSchema): string {\n if (!schema) {\n return \"\";\n }\n\n const c = this.color;\n\n if (t.schema.isOptional(schema)) {\n const typeName = this.getTypeName(schema);\n const key = \"title\" in schema ? (schema as any).title : \"arg1\";\n return ` ${c.set(\"GREY_DARK\", `[${key}${typeName}]`)}`;\n }\n\n if (t.schema.isTuple(schema) && schema.items) {\n const items = schema.items;\n const args = items.map((item, index) => {\n const argName = `arg${index + 1}`;\n const typeName = this.getTypeName(item);\n if (t.schema.isOptional(item)) {\n return c.set(\"GREY_DARK\", `[${argName}${typeName}]`);\n }\n return c.set(\"CYAN\", `<${argName}${typeName}>`);\n });\n return ` ${args.join(\" \")}`;\n }\n\n const typeName = this.getTypeName(schema);\n const key = \"title\" in schema ? (schema as any).title : \"arg1\";\n return ` ${c.set(\"CYAN\", `<${key}${typeName}>`)}`;\n }\n\n /**\n * Get the full command path (e.g., \"deploy vercel\" for a nested command)\n */\n protected getCommandPath(command: CommandPrimitive<any>): string {\n const path: string[] = [command.name];\n let current = command;\n\n // Walk up the tree to find parents\n while (true) {\n const parent = this.findParentCommand(current);\n if (!parent) break;\n path.unshift(parent.name);\n current = parent;\n }\n\n return path.join(\" \");\n }\n\n /**\n * Find the parent command of a nested command\n */\n protected findParentCommand(\n command: CommandPrimitive<any>,\n ): CommandPrimitive<any> | undefined {\n for (const cmd of this.commands) {\n if (cmd.children.includes(command)) {\n return cmd;\n }\n }\n return undefined;\n }\n\n /**\n * Get top-level commands (commands that are not children of other commands)\n */\n protected getTopLevelCommands(): CommandPrimitive<any>[] {\n const allChildren = new Set<CommandPrimitive<any>>();\n\n // Collect all children\n for (const command of this.commands) {\n for (const child of command.children) {\n allChildren.add(child);\n }\n }\n\n // Return commands that are not children\n return this.commands.filter((cmd) => !allChildren.has(cmd));\n }\n\n /**\n * Calculate max display length for child commands (for help alignment)\n */\n protected getMaxChildCmdLength(children: CommandPrimitive<any>[]): number {\n return Math.max(\n ...children\n .filter((c) => !c.options.hide)\n .map((c) => {\n const cmdStr = [c.name, ...c.aliases].join(\", \");\n const argsUsage = this.generateArgsUsage(c.options.args);\n return `${cmdStr}${argsUsage}`.length;\n }),\n 0,\n );\n }\n\n /**\n * Calculate max display length for commands (for help alignment)\n */\n protected getMaxCmdLength(commands: CommandPrimitive[]): number {\n return Math.max(\n ...commands\n .filter((c) => !c.options.hide && c.name !== \"\")\n .map((c) => {\n const cmdStr = [c.name, ...c.aliases].join(\", \");\n const argsUsage = c.hasChildren\n ? \" <command>\"\n : this.generateArgsUsage(c.options.args);\n return `${cmdStr}${argsUsage}`.length;\n }),\n );\n }\n\n /**\n * Calculate max display length for flags (for help alignment)\n */\n protected getMaxFlagLength(flags: { aliases: string[] }[]): number {\n return Math.max(\n ...flags.map((f) => {\n const aliases = Array.isArray(f.aliases) ? f.aliases : [f.aliases];\n return aliases\n .map((a) => (a.length === 1 ? `-${a}` : `--${a}`))\n .join(\", \").length;\n }),\n );\n }\n\n /**\n * Extract enum values from a schema if it represents an enum.\n * Returns undefined if the schema is not an enum.\n */\n protected getEnumValues(schema: TSchema): string[] | undefined {\n if (!schema) return undefined;\n\n // Check if schema has an enum property (t.enum creates schemas with this)\n if (\n \"enum\" in schema &&\n Array.isArray(schema.enum) &&\n schema.enum.every((v) => typeof v === \"string\")\n ) {\n return schema.enum as string[];\n }\n\n // Also check for union of string literals (alternative enum representation)\n if (t.schema.isUnion(schema)) {\n const union = schema as TUnion;\n const values: string[] = [];\n\n for (const variant of union.anyOf) {\n // Check if the variant is a string literal (has const property)\n if (\n t.schema.isString(variant) &&\n \"const\" in variant &&\n typeof variant.const === \"string\"\n ) {\n values.push(variant.const);\n } else {\n // Not all variants are string literals, not a simple enum\n return undefined;\n }\n }\n\n return values.length > 0 ? values : undefined;\n }\n\n return undefined;\n }\n\n /**\n * Format flag description with enum values if applicable.\n */\n protected formatFlagDescription(\n description: string | undefined,\n schema: TSchema | undefined,\n ): string {\n const baseDesc = description ?? \"\";\n\n if (!schema) return baseDesc;\n\n const enumValues = this.getEnumValues(schema);\n if (enumValues && enumValues.length > 0) {\n const valuesStr = enumValues.join(\", \");\n const c = this.color;\n const enumHint = c.set(\"GREY_DARK\", `[${valuesStr}]`);\n return baseDesc ? `${baseDesc} ${enumHint}` : enumHint;\n }\n\n return baseDesc;\n }\n}\n","import { $module } from \"alepha\";\nimport { Asker } from \"./helpers/Asker.ts\";\nimport { EnvUtils } from \"./helpers/EnvUtils.ts\";\nimport { PrettyAsker } from \"./helpers/PrettyAsker.ts\";\nimport { PrettyPrint } from \"./helpers/PrettyPrint.ts\";\nimport { Runner } from \"./helpers/Runner.ts\";\nimport { $command } from \"./primitives/$command.ts\";\nimport { CliProvider } from \"./providers/CliProvider.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport * from \"./errors/CommandError.ts\";\nexport * from \"./helpers/Asker.ts\";\nexport * from \"./helpers/EnvUtils.ts\";\nexport * from \"./helpers/PrettyAsker.ts\";\nexport * from \"./helpers/PrettyPrint.ts\";\nexport * from \"./helpers/Runner.ts\";\nexport * from \"./primitives/$command.ts\";\nexport * from \"./providers/CliProvider.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n/**\n * Declarative CLI command framework.\n *\n * **Features:**\n * - CLI command definitions\n * - Interactive CLI prompts\n * - Command execution\n * - Formatted colored output\n * - Environment variable utilities\n * - Schema validation for CLI arguments\n *\n * @module alepha.command\n */\nexport const AlephaCommand = $module({\n name: \"alepha.command\",\n primitives: [$command],\n services: [CliProvider, Runner, Asker, PrettyAsker, PrettyPrint, EnvUtils],\n});\n\n// ---------------------------------------------------------------------------------------------------------------------\n\ndeclare module \"typebox\" {\n interface StringOptions {\n /**\n * Additional aliases for the flags.\n *\n * @module alepha.command\n */\n aliases?: string[];\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["createPromptInterface"],"sources":["../../src/command/helpers/Asker.ts","../../src/command/helpers/EnvUtils.ts","../../src/command/errors/CommandError.ts","../../src/command/helpers/Runner.ts","../../src/command/primitives/$command.ts","../../src/command/providers/CliProvider.ts","../../src/command/index.ts"],"sourcesContent":["import { stdin as input, stdout as output } from \"node:process\";\nimport { createInterface as createPromptInterface } from \"node:readline/promises\";\nimport {\n $inject,\n Alepha,\n AlephaError,\n coerceScalar,\n type Static,\n type TSchema,\n type TString,\n z,\n} from \"alepha\";\nimport { $logger } from \"alepha/logger\";\n\nexport interface AskOptions<T extends TSchema = TString> {\n /**\n * Response schema expected.\n *\n * Recommended schemas:\n * - z.text() - for free text input\n * - z.number() - for numeric input\n * - z.boolean() - for yes/no input (accepts \"true\", \"false\", \"1\", \"0\")\n * - z.enum([\"option1\", \"option2\"]) - for predefined options\n *\n * You can use schema.default to provide a default value.\n *\n * @example\n * ```ts\n * ask(\"What is your name?\", { schema: z.text({ default: \"John Doe\" }) })\n * ```\n *\n * @default TString\n */\n schema?: T;\n\n /**\n * Custom validation function.\n * Throws an AlephaError in case of validation failure.\n */\n validate?: (value: Static<T>) => void;\n}\n\nexport interface AskMethod {\n <T extends TSchema = TString>(\n question: string,\n options?: AskOptions<T>,\n ): Promise<Static<T>>;\n\n permission: (question: string) => Promise<boolean>;\n intro: (title: string) => void;\n outro: (message: string) => void;\n}\n\n/**\n * Reads interactive input from the terminal using plain readline prompts.\n *\n * One straightforward code path: questions are printed through the logger\n * and answers are read with Node's `readline`. No raw-mode cursor control,\n * no ANSI framing — output stays greppable and works the same in a TTY,\n * under CI, or when piped.\n */\nexport class Asker {\n protected readonly log = $logger();\n public readonly ask: AskMethod;\n protected readonly alepha = $inject(Alepha);\n\n constructor() {\n this.ask = this.createAskMethod();\n }\n\n protected createAskMethod(): AskMethod {\n const askFn: AskMethod = async <T extends TSchema = TString>(\n question: string,\n options: AskOptions<T> = {},\n ) => {\n return await this.prompt<T>(question, options);\n };\n\n askFn.permission = async (question: string) => {\n const response = await this.prompt(`${question} [Y/n]`, {\n schema: z.enum([\"Y\", \"y\", \"n\", \"no\", \"yes\"]).default(\"Y\"),\n });\n return response.charAt(0).toLowerCase() === \"y\";\n };\n\n askFn.intro = (title: string) => {\n this.log.info(title);\n };\n\n askFn.outro = (message: string) => {\n if (message) this.log.info(message);\n };\n\n return askFn;\n }\n\n protected async prompt<T extends TSchema = TString>(\n question: string,\n options: AskOptions<T>,\n ): Promise<Static<T>> {\n const rl = this.createPromptInterface();\n let value: any;\n try {\n do {\n try {\n this.log.info(question);\n const answer = await rl.question(\"> \");\n if (options.schema) {\n // The terminal is a string-only boundary (like HTTP query/env), so\n // coerce the answer to the schema's scalar type before strict\n // decoding — otherwise `z.number()` would reject the string \"41\".\n const raw = answer ? answer.trim() : undefined;\n value = this.alepha.codec.decode(\n options.schema,\n raw === undefined ? undefined : coerceScalar(options.schema, raw),\n );\n } else {\n value = String(answer.trim());\n }\n if (options.validate) {\n options.validate(value);\n }\n } catch (error) {\n if (error instanceof AlephaError) {\n this.log.error(`${error.message}\\n`);\n value = undefined;\n } else {\n throw error;\n }\n }\n } while (value === undefined);\n } finally {\n rl.close();\n }\n\n return value;\n }\n\n protected createPromptInterface() {\n return createPromptInterface({ input, output });\n }\n}\n","import { $inject } from \"alepha\";\nimport { $logger } from \"alepha/logger\";\nimport { FileSystemProvider } from \"alepha/system\";\n\nexport class EnvUtils {\n protected readonly log = $logger();\n protected readonly fs = $inject(FileSystemProvider);\n\n /**\n * Load environment variables from .env files into process.env.\n *\n * Variables that already exist in process.env are NOT overwritten,\n * matching the standard dotenv convention where the shell environment\n * takes precedence over .env file values.\n *\n * By default, it loads from \".env\" and \".env.local\".\n * You can specify additional files to load, e.g. [\".env\", \".env.production\"].\n */\n public async loadEnv(\n root: string,\n files: string[] = [\".env\"],\n ): Promise<void> {\n const vars = await this.parseEnv(root, files);\n for (const [key, value] of Object.entries(vars)) {\n if (process.env[key] === undefined) {\n process.env[key] = value;\n }\n }\n }\n\n /**\n * Parse environment variables from .env files without mutating process.env.\n *\n * Returns a merged record from all files (later files override earlier ones).\n * For each file, also tries the `.local` variant (e.g. `.env.production.local`).\n */\n public async parseEnv(\n root: string,\n files: string[] = [\".env\"],\n ): Promise<Record<string, string>> {\n const result: Record<string, string> = {};\n\n for (const it of files) {\n for (const file of [it, `${it}.local`]) {\n const envPath = this.fs.join(root, file);\n try {\n const buffer = await this.fs.readFile(envPath);\n const envContent = buffer.toString(\"utf8\");\n for (const line of envContent.split(\"\\n\")) {\n const [key, ...rest] = line.split(\"=\");\n if (key) {\n const trimmedKey = key.trim();\n if (trimmedKey && !trimmedKey.startsWith(\"#\")) {\n let value = rest.join(\"=\").trim();\n const last = value.length - 1;\n if (\n value.length >= 2 &&\n value[0] === '\"' &&\n value[last] === '\"'\n ) {\n // Double-quoted: JSON-decode so escapes round-trip with a\n // `JSON.stringify`-based writer (e.g. Rocket's\n // `.env.<env>.local` overrides, which write JSON values like\n // CLUB_CONFIG_JSON). Falls back to a naive strip when the\n // body isn't valid JSON (e.g. a Windows path with `\\`), so\n // simple `KEY=\"value\"` still behaves as before.\n try {\n value = JSON.parse(value);\n } catch {\n value = value.slice(1, -1);\n }\n } else if (\n value.length >= 2 &&\n value[0] === \"'\" &&\n value[last] === \"'\"\n ) {\n value = value.slice(1, -1);\n }\n result[trimmedKey] = value;\n }\n }\n }\n this.log.debug(`Parsed environment variables from ${envPath}`);\n } catch {\n this.log.debug(`No ${file} file found at ${envPath}, skipping.`);\n }\n }\n }\n\n return result;\n }\n}\n","import { AlephaError } from \"alepha\";\n\nexport class CommandError extends AlephaError {\n readonly name = \"CommandError\";\n}\n","import { cp, glob, rm } from \"node:fs/promises\";\nimport { $inject, Alepha } from \"alepha\";\nimport { DateTimeProvider } from \"alepha/datetime\";\nimport { $logger } from \"alepha/logger\";\nimport { ShellProvider } from \"alepha/system\";\nimport { CommandError } from \"../errors/CommandError.ts\";\n\nexport type Task = {\n name: string;\n handler: () => any;\n};\n\ninterface Timer {\n name: string;\n duration: string;\n}\n\nexport interface RunOptions {\n /**\n * Rename the command for logging purposes.\n */\n alias?: string;\n\n /**\n * Root directory to execute the command in.\n */\n root?: string;\n}\n\nexport interface RunnerMethod {\n (\n cmd: string | Task | Array<string | Task>,\n options?: RunOptions | (() => any),\n ): Promise<string>;\n rm: (glob: string | string[], options?: RunOptions) => Promise<string>;\n cp: (source: string, dest: string, options?: RunOptions) => Promise<string>;\n\n /**\n * Ends the runner and prints a summary of executed tasks.\n *\n * > This is automatically called at the end of command execution.\n * > But can be called manually if needed to print more stuff before the command ends.\n */\n end: () => void;\n}\n\n/**\n * Runs CLI tasks (shell commands or functions) and logs their lifecycle.\n *\n * Output is intentionally plain and verbose: every task logs a\n * `Starting …` / `Finished … after Ns` line through the standard logger,\n * and shelled commands **stream** their stdout/stderr straight to the\n * terminal (`capture: false`) so tool output — `vite build` warnings,\n * Biome diagnostics, nested `alepha` subcommands — is visible live.\n */\nexport class Runner {\n protected readonly log = $logger();\n protected readonly dateTime = $inject(DateTimeProvider);\n protected timers: Timer[] = [];\n protected readonly startTime: number = this.dateTime.nowMillis();\n protected readonly alepha = $inject(Alepha);\n protected readonly shell = $inject(ShellProvider);\n public readonly run: RunnerMethod;\n\n constructor() {\n this.run = this.createRunMethod();\n }\n\n /**\n * Start a new command session.\n *\n * Retained for API compatibility (the CLI calls it before each command);\n * task lifecycle is now logged statelessly, so there is nothing to reset.\n */\n public startCommand(_cliName: string, _commandName: string): void {}\n\n protected createRunMethod() {\n const runFn: RunnerMethod = async (\n cmd: string | Task | Array<string | Task>,\n options?: RunOptions | (() => any),\n ) => {\n const root =\n typeof options === \"object\" && options.root ? options.root : undefined;\n\n if (Array.isArray(cmd)) {\n return await this.execute(\n cmd.map((it) =>\n typeof it === \"string\"\n ? { name: it, handler: () => this.exec(it, { root }) }\n : it,\n ),\n );\n }\n\n const alias = typeof options === \"object\" ? options.alias : undefined;\n const name = alias ?? (typeof cmd === \"string\" ? cmd : cmd.name);\n const handler =\n typeof options === \"function\"\n ? options\n : typeof cmd === \"string\"\n ? () => this.exec(cmd, { root })\n : cmd.handler;\n\n return await this.execute({\n name,\n handler,\n });\n };\n\n runFn.rm = async (\n files: string | string[],\n options: RunOptions = {},\n ): Promise<string> => {\n if (Array.isArray(files) || files.includes(\"*\")) {\n return runFn({\n name:\n options.alias ??\n `rm -rf ${Array.isArray(files) ? files.join(\" \") : files}`,\n handler: async () => {\n for await (const file of glob(files)) {\n this.log.trace(`Removing ${file}`);\n await rm(file, { recursive: true, force: true });\n }\n },\n });\n }\n this.log.trace(`Removing ${files}`);\n return runFn({\n name: options.alias ?? `rm -rf ${files}`,\n handler: () => rm(files, { recursive: true, force: true }),\n });\n };\n\n runFn.cp = async (\n source: string,\n dist: string,\n options: RunOptions = {},\n ): Promise<string> => {\n this.log.trace(`Copying ${source} to ${dist}`);\n return runFn(\n {\n name: options.alias ?? `cp -r ${source} ${dist}`,\n handler: () => cp(source, dist, { recursive: true }),\n },\n options,\n );\n };\n\n runFn.end = () => this.end();\n\n return runFn;\n }\n\n protected async exec(\n cmd: string,\n opts: { root?: string } = {},\n ): Promise<string> {\n // Stream child output straight to the terminal only when DEBUG (or more\n // verbose) is enabled — i.e. under `--verbose`, an agent session\n // (CLAUDECODE), or `LOG_LEVEL=debug`. Otherwise capture it so a quiet run\n // (e.g. `alepha verify`) is not buried under sub-process output; captured\n // output is surfaced on failure by {@link executeTask}.\n const stream = this.log.isLevelEnabled(\"DEBUG\");\n return this.shell.run(cmd, { root: opts.root, capture: !stream });\n }\n\n /**\n * Executes one or more tasks.\n *\n * @param task - A single task or an array of tasks to run in parallel.\n */\n protected async execute(task: Task | Task[]): Promise<string> {\n if (Array.isArray(task)) {\n await Promise.all(task.map((t) => this.executeTask(t)));\n return \"\"; // not supported for now\n } else {\n return await this.executeTask(task);\n }\n }\n\n /**\n * Prints a summary of all executed tasks and their durations.\n */\n public end(): void {\n if (this.timers.length === 0) return;\n\n const totalTime = (\n (this.dateTime.nowMillis() - this.startTime) /\n 1000\n ).toFixed(1);\n this.log.info(`Total time: ${totalTime}s`);\n\n // clear timers after rendering\n this.timers = [];\n }\n\n protected async executeTask(task: Task): Promise<string> {\n const now = this.dateTime.nowMillis();\n\n this.log.info(`Starting '${task.name}' ...`);\n\n let stdout = \"\";\n\n try {\n stdout = String((await task.handler()) ?? \"\");\n } catch (error) {\n // Streamed tasks have already printed their output live and reject\n // without stdout/stderr attached; this surfaces output from captured\n // tasks (capture: true — the default below DEBUG) before throwing.\n const err = error as { stdout?: string; stderr?: string };\n const captured = [err?.stdout, err?.stderr]\n .filter(Boolean)\n .join(\"\\n\")\n .trim();\n if (captured) {\n this.log.info(`\\n\\n${captured}`);\n }\n throw new CommandError(`Task '${task.name}' failed`, { cause: error });\n }\n\n if (stdout) this.log.trace(stdout);\n\n const duration = ((this.dateTime.nowMillis() - now) / 1000).toFixed(1);\n\n const message =\n stdout && !stdout.includes(\"\\n\") ? stdout.trim() : undefined;\n const suffix = message ? ` - ${message}` : \"\";\n this.log.info(`Finished '${task.name}' after ${duration}s${suffix}`);\n\n this.timers.push({\n name: task.name,\n duration: `${duration}s`,\n });\n\n return stdout;\n }\n}\n","import type * as fs from \"node:fs/promises\";\nimport type { glob } from \"node:fs/promises\";\nimport {\n type Async,\n createPrimitive,\n KIND,\n Primitive,\n type Static,\n type TObject,\n type TSchema,\n z,\n} from \"alepha\";\nimport type { AskMethod } from \"../helpers/Asker.ts\";\nimport type { RunnerMethod } from \"../helpers/Runner.ts\";\n\n/**\n * Declares a CLI command.\n *\n * This primitive allows you to define a command, its flags, and its handler\n * within your Alepha application structure.\n */\nexport const $command = <\n T extends TObject,\n A extends TSchema,\n E extends TObject,\n>(\n options: CommandPrimitiveOptions<T, A, E>,\n) => createPrimitive(CommandPrimitive<T, A, E>, options);\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport interface CommandPrimitiveOptions<\n T extends TObject,\n A extends TSchema,\n E extends TObject = TObject,\n> {\n /**\n * The handler function to execute when the command is matched.\n *\n * For parent commands with children, the handler is called when:\n * - The parent command is invoked without a subcommand\n * - The parent command is invoked with --help (to show available subcommands)\n */\n handler: (args: CommandHandlerArgs<T, A, E>) => Async<void>;\n\n /**\n * The name of the command. If omitted, the property key is used.\n *\n * An empty string \"\" denotes the root command.\n */\n name?: string;\n\n /**\n * A short description of the command, shown in the help message.\n */\n description?: string;\n\n /**\n * An array of alternative names for the command.\n */\n aliases?: string[];\n\n /**\n * A TypeBox object schema defining the flags for the command.\n */\n flags?: T;\n\n /**\n * A TypeBox object schema defining required environment variables.\n *\n * Environment variables are validated before the handler runs (fail fast).\n * They are displayed in the help output under \"Env:\" section.\n *\n * @example\n * ```ts\n * $command({\n * env: z.object({\n * VERCEL_TOKEN: z.text({ description: \"Vercel API token\" }),\n * VERCEL_ORG_ID: z.text({ description: \"Organization ID\" }).optional(),\n * }),\n * handler: async ({ env }) => {\n * // env.VERCEL_TOKEN is typed & guaranteed to exist\n * console.log(env.VERCEL_TOKEN);\n * }\n * })\n * ```\n */\n env?: E;\n\n /**\n * An optional TypeBox schema defining the arguments for the command.\n *\n * @example\n * args: z.text()\n * my-cli command <arg1: string>\n *\n * args: z.text().optional()\n * my-cli command [arg1: string]\n *\n * args: z.tuple([z.text(), z.number()])\n * my-cli command <arg1: string> <arg2: number>\n *\n * args: z.tuple([z.text(), z.number().optional()])\n * my-cli command <arg1: string> [arg2: number]\n */\n args?: A;\n\n /**\n * Marks this command as the root command.\n * Equivalent to setting name to an empty string \"\".\n */\n root?: boolean;\n\n /**\n * Run this command's handler BEFORE the specified target command.\n *\n * Pre-hooks are not listed in help and cannot be called directly.\n * They receive the same parsed flags and args as the target command.\n *\n * @example\n * ```ts\n * class BuildCommands {\n * prebuild = $command({\n * pre: \"build\",\n * handler: async ({ run }) => {\n * await run(\"cleaning dist folder...\", () => fs.rm(\"dist\"));\n * }\n * });\n *\n * build = $command({\n * name: \"build\",\n * handler: async () => { ... }\n * });\n * }\n * ```\n */\n pre?: string;\n\n /**\n * Run this command's handler AFTER the specified target command.\n *\n * Post-hooks are not listed in help and cannot be called directly.\n * They receive the same parsed flags and args as the target command.\n *\n * @example\n * ```ts\n * class BuildCommands {\n * build = $command({\n * name: \"build\",\n * handler: async () => { ... }\n * });\n *\n * postbuild = $command({\n * post: \"build\",\n * handler: async ({ run }) => {\n * await run(\"generating checksums...\", generateChecksums);\n * }\n * });\n * }\n * ```\n */\n post?: string;\n\n /**\n * If true, this command will be hidden from the help output.\n */\n hide?: boolean;\n\n /**\n * Adds a `--mode, -m` flag to load environment files.\n *\n * When enabled:\n * - Loads `.env` and `.env.local` by default\n * - With `--mode production`, also loads `.env.production` and `.env.production.local`\n * - The mode value is exposed in the handler as `mode: string | undefined`\n *\n * Set to `true` to enable with no default, or a string to set a default mode.\n *\n * This follows Vite's environment loading convention.\n * @see https://vite.dev/guide/env-and-mode\n *\n * @example\n * ```ts\n * // No default mode\n * build = $command({\n * mode: true,\n * handler: async ({ mode }) => {\n * console.log(`Building for ${mode ?? 'development'}...`);\n * }\n * });\n *\n * // Default mode \"production\"\n * deploy = $command({\n * mode: \"production\",\n * handler: async ({ mode }) => {\n * console.log(`Deploying for ${mode}...`); // always defined\n * }\n * });\n * ```\n *\n * Usage:\n * - `cli build` - loads .env (mode = undefined)\n * - `cli build --mode production` - loads .env and .env.production\n * - `cli deploy` - loads .env and .env.production (default mode)\n * - `cli deploy --mode staging` - loads .env and .env.staging\n */\n mode?: boolean | string;\n\n /**\n * Child commands (subcommands) for this command.\n *\n * When children are defined, the command becomes a parent command that\n * can be invoked with space-separated subcommands:\n *\n * @example\n * ```ts\n * class DeployCommands {\n * // Subcommands\n * vercel = $command({\n * description: \"Deploy to Vercel\",\n * handler: async () => { ... }\n * });\n *\n * cloudflare = $command({\n * description: \"Deploy to Cloudflare\",\n * handler: async () => { ... }\n * });\n *\n * // Parent command with children\n * deploy = $command({\n * description: \"Deploy the application\",\n * children: [this.vercel, this.cloudflare],\n * handler: async () => {\n * // Called when \"deploy\" is invoked without subcommand\n * console.log(\"Available: deploy vercel, deploy cloudflare\");\n * }\n * });\n * }\n * ```\n *\n * This allows CLI usage like:\n * - `cli deploy vercel` - runs the vercel subcommand\n * - `cli deploy cloudflare` - runs the cloudflare subcommand\n * - `cli deploy` - runs the parent handler (shows available subcommands)\n * - `cli deploy --help` - shows help with all available subcommands\n */\n children?: CommandPrimitive<any, any>[];\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport class CommandPrimitive<\n T extends TObject = TObject,\n A extends TSchema = TSchema,\n E extends TObject = TObject,\n> extends Primitive<CommandPrimitiveOptions<T, A, E>> {\n public readonly flags = this.options.flags ?? z.object({});\n public readonly env = this.options.env ?? z.object({});\n public readonly aliases = this.options.aliases ?? [];\n\n protected onInit() {\n if (this.options.pre || this.options.post) {\n this.options.hide ??= true;\n }\n }\n\n public get name(): string {\n if (this.options.root) {\n return \"\";\n }\n if (this.options.pre) {\n return `pre${this.options.pre}`;\n }\n if (this.options.post) {\n return `post${this.options.post}`;\n }\n return this.options.name ?? `${this.config.propertyKey}`;\n }\n\n /**\n * Get the child commands (subcommands) for this command.\n */\n public get children(): CommandPrimitive<any, any>[] {\n return this.options.children ?? [];\n }\n\n /**\n * Check if this command has child commands (is a parent command).\n */\n public get hasChildren(): boolean {\n return this.children.length > 0;\n }\n\n /**\n * Find a child command by name or alias.\n */\n public findChild(name: string): CommandPrimitive<any, any> | undefined {\n return this.children.find(\n (child) => child.name === name || child.aliases.includes(name),\n );\n }\n}\n\n$command[KIND] = CommandPrimitive;\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport interface CommandHandlerArgs<\n T extends TObject,\n A extends TSchema = TSchema,\n E extends TObject = TObject,\n> {\n flags: Static<T>;\n args: A extends TSchema ? Static<A> : Array<string>;\n env: Static<E>;\n run: RunnerMethod;\n ask: AskMethod;\n glob: typeof glob;\n fs: typeof fs;\n\n /**\n * The root directory where the command is executed.\n */\n root: string;\n\n /**\n * Display help for the current command.\n *\n * Useful for parent commands with children to show available subcommands\n * when invoked without a specific subcommand.\n *\n * @example\n * ```ts\n * deploy = $command({\n * children: [this.vercel, this.cloudflare],\n * handler: async ({ help }) => {\n * help(); // Shows available subcommands\n * }\n * });\n * ```\n */\n help: () => void;\n\n /**\n * The current execution mode (e.g., \"development\", \"production\", \"staging\").\n *\n * Use --mode flag to set this value when running the command.\n */\n mode?: string;\n}\n","import * as fs from \"node:fs/promises\";\nimport { glob } from \"node:fs/promises\";\nimport {\n $atom,\n $env,\n $hook,\n $inject,\n $state,\n Alepha,\n type Static,\n type TObject,\n type TSchema,\n type TUnion,\n TypeBoxError,\n z,\n} from \"alepha\";\nimport { $logger, ConsoleColorProvider } from \"alepha/logger\";\nimport { CommandError } from \"../errors/CommandError.ts\";\nimport { Asker } from \"../helpers/Asker.ts\";\nimport { EnvUtils } from \"../helpers/EnvUtils.ts\";\nimport { Runner } from \"../helpers/Runner.ts\";\nimport {\n $command,\n type CommandHandlerArgs,\n type CommandPrimitive,\n} from \"../primitives/$command.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nconst envSchema = z.object({\n CLI_NAME: z.text({\n default: \"cli\",\n description: \"Name of the CLI application.\",\n }),\n CLI_DESCRIPTION: z.text({\n default: \"\",\n description: \"Description of the CLI application.\",\n }),\n});\n\ndeclare module \"alepha\" {\n interface Env extends Partial<Static<typeof envSchema>> {}\n}\n\n/**\n * CLI provider configuration atom\n */\nexport const cliOptions = $atom({\n name: \"alepha.command.cli.options\",\n schema: z.object({\n name: z.string().describe(\"Name of the CLI application.\").optional(),\n description: z\n .string()\n .describe(\"Description of the CLI application.\")\n .optional(),\n argv: z\n .array(z.string())\n .describe(\"Command line arguments to parse.\")\n .optional(),\n }),\n default: {},\n});\n\nexport type CliProviderOptions = Static<typeof cliOptions.schema>;\n\ndeclare module \"alepha\" {\n interface State {\n [cliOptions.key]: CliProviderOptions;\n }\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n/**\n * CLI provider for parsing and executing commands.\n *\n * Handles:\n * - Command resolution (simple, nested, colon-notation)\n * - Flag and argument parsing\n * - Environment variable validation\n * - Help generation\n * - Pre/post command hooks\n *\n * @example\n * ```typescript\n * // Define a command\n * class MyCommands {\n * build = $command({\n * name: \"build\",\n * description: \"Build the project\",\n * flags: z.object({ watch: z.boolean().optional() }),\n * handler: async ({ flags }) => { ... }\n * });\n * }\n *\n * // CLI automatically discovers and executes commands\n * const alepha = Alepha.create().with(MyCommands);\n * ```\n */\nexport class CliProvider {\n // ─────────────────────────────────────────────────────────────────────────────\n // Dependencies\n // ─────────────────────────────────────────────────────────────────────────────\n\n protected readonly env = $env(envSchema);\n protected readonly alepha = $inject(Alepha);\n protected readonly log = $logger();\n protected readonly color = $inject(ConsoleColorProvider);\n protected readonly runner = $inject(Runner);\n protected readonly asker = $inject(Asker);\n protected readonly envUtils = $inject(EnvUtils);\n protected readonly options = $state(cliOptions);\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Configuration\n // ─────────────────────────────────────────────────────────────────────────────\n\n protected get name(): string {\n return this.options.name || this.env.CLI_NAME;\n }\n\n protected get description(): string {\n return this.options.description || this.env.CLI_DESCRIPTION;\n }\n\n protected get argv(): string[] {\n return (\n this.options.argv ||\n (typeof process !== \"undefined\" ? process.argv.slice(2) : [])\n );\n }\n\n /**\n * Global flags available to all commands.\n */\n protected readonly globalFlags = {\n help: {\n aliases: [\"h\", \"help\"],\n description: \"Show this help message\",\n schema: z.boolean(),\n },\n verbose: {\n // No `-v` alias — it collides with `--version` on the root command.\n aliases: [\"verbose\"],\n description:\n \"Verbose output: trace-level logs (framework internals) in pretty format. Task output already streams by default.\",\n schema: z.boolean(),\n },\n };\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Lifecycle\n // ─────────────────────────────────────────────────────────────────────────────\n\n /**\n * Main entry point - resolves and executes the command from process.argv.\n * This is the production execution path with full lifecycle support.\n */\n protected readonly onReady = $hook({\n on: \"ready\",\n handler: async () => {\n const argv = [...this.argv];\n\n // Extract positional arguments (potential command path)\n const positionalArgs = argv.filter((arg) => !arg.startsWith(\"-\"));\n\n // Resolve command using space-separated or colon-notation\n const { command, consumedArgs } = this.resolveCommand(positionalArgs);\n\n const globalFlags = this.parseFlags(\n argv,\n Object.entries(this.getAllGlobalFlags()).map(([key, value]) => ({\n key,\n ...value,\n })),\n { strict: false }, // Don't throw for command-specific flags\n );\n\n // `--verbose` → raise the logger to trace + pretty format via state\n // (read live by Logger). Task output already streams to the terminal;\n // this additionally surfaces the framework's own trace/debug logs.\n //\n // An agent session (Claude Code sets CLAUDECODE) implies verbose: the\n // compact `cli` format is tuned for a human watching a terminal, but an\n // agent benefits from the full module/context and internal logs — same\n // as if `--verbose` were passed.\n const verbose = globalFlags.verbose || !!this.alepha.env.CLAUDECODE;\n if (verbose) {\n this.alepha.store.set(\"alepha.logger.level\", \"trace\");\n this.alepha.store.set(\"alepha.logger.format\", \"pretty\");\n }\n\n if (globalFlags.help) {\n this.printHelp(command);\n return;\n }\n\n if (!command) {\n // Check if there's a root command (name === \"\")\n const rootCommand = this.findCommand(\"\");\n\n // If we have positional args but no matching command, show error\n const commandName = positionalArgs[0] ?? \"\";\n if (commandName !== \"\" && !rootCommand?.options.args) {\n this.log.error(`Unknown command: '${commandName}'`);\n this.printHelp();\n return;\n }\n\n // Execute root command if it exists\n if (rootCommand) {\n await this.executeCommand(rootCommand, argv, true);\n return;\n }\n\n // No command found and no root command\n return;\n }\n\n // Remove consumed command path args from argv for argument parsing\n const remainingArgv = this.removeConsumedArgs(argv, consumedArgs);\n\n // Since we've removed the command path, treat it like a root command for parsing\n await this.executeCommand(command, remainingArgv, true);\n },\n });\n\n /**\n * Execute a command with full lifecycle support.\n *\n * This is the production execution path that includes:\n * - Mode-based .env file loading\n * - Pre/post command hooks\n * - Runner session for pretty CLI output\n * - Alepha context wrapper for proper scoping\n *\n * @see run() for a lightweight test-only alternative\n */\n protected async executeCommand(\n command: CommandPrimitive<TObject>,\n argv: string[],\n isRootCommand: boolean,\n ): Promise<void> {\n const root = process.cwd();\n\n // Handle --mode flag if command has mode option enabled\n let modeValue: string | undefined;\n if (command.options.mode) {\n modeValue = this.parseModeFlag(argv);\n // Use default mode if not provided and mode is a string\n if (modeValue === undefined && typeof command.options.mode === \"string\") {\n modeValue = command.options.mode;\n }\n await this.loadModeEnv(root, modeValue);\n }\n\n const commandFlags = this.parseCommandFlags(argv, command.flags, {\n modeEnabled: !!command.options.mode,\n });\n const commandArgs = this.parseCommandArgs(\n argv,\n command.options.args,\n isRootCommand,\n command.flags,\n );\n const commandEnv = this.parseCommandEnv(command.env, command.name);\n\n await this.alepha.context.run(async () => {\n this.log.debug(`Executing command '${command.name}'...`, {\n flags: commandFlags,\n args: commandArgs,\n mode: modeValue,\n });\n\n const runner = this.runner;\n\n // Start command session for pretty print\n runner.startCommand(this.name, command.name);\n\n const args = {\n flags: commandFlags,\n args: commandArgs,\n env: commandEnv,\n run: runner.run,\n ask: this.asker.ask,\n fs,\n glob,\n root,\n help: () => this.printHelp(command),\n mode: modeValue,\n };\n\n // Execute pre-hooks\n const preHooks = this.findPreHooks(command.name);\n for (const hook of preHooks) {\n this.log.debug(`Executing pre-hook for '${command.name}'...`);\n await hook.options.handler(args as CommandHandlerArgs<TObject>);\n }\n\n // Execute main command\n await command.options.handler(args as CommandHandlerArgs<TObject>);\n\n // Execute post-hooks\n const postHooks = this.findPostHooks(command.name);\n for (const hook of postHooks) {\n this.log.debug(`Executing post-hook for '${command.name}'...`);\n await hook.options.handler(args as CommandHandlerArgs<TObject>);\n }\n\n runner.end();\n\n this.log.debug(`Command '${command.name}' executed successfully.`);\n });\n }\n\n /**\n * Remove consumed command path arguments from argv (keeps flags and remaining args).\n */\n protected removeConsumedArgs(\n argv: string[],\n consumedArgs: string[],\n ): string[] {\n const result: string[] = [];\n let consumedIndex = 0;\n\n for (const arg of argv) {\n if (arg.startsWith(\"-\")) {\n result.push(arg);\n } else if (\n consumedIndex < consumedArgs.length &&\n arg === consumedArgs[consumedIndex]\n ) {\n consumedIndex++;\n // Skip this arg, it's part of the command path\n } else {\n result.push(arg);\n }\n }\n\n return result;\n }\n\n /**\n * Resolve a command from positional arguments.\n *\n * Supports:\n * 1. Space-separated subcommands: `deploy vercel` -> finds deploy command, then vercel child\n * 2. Colon notation (backwards compat): `deploy:vercel` -> finds command with name \"deploy:vercel\"\n * 3. Simple commands: `build` -> finds command with name \"build\"\n */\n protected resolveCommand(positionalArgs: string[]): {\n command: CommandPrimitive<TObject> | undefined;\n consumedArgs: string[];\n } {\n if (positionalArgs.length === 0) {\n return { command: undefined, consumedArgs: [] };\n }\n\n const firstArg = positionalArgs[0];\n\n // First, try colon notation for backwards compatibility (e.g., \"deploy:vercel\")\n if (firstArg.includes(\":\")) {\n const command = this.findCommand(firstArg);\n if (command) {\n return { command, consumedArgs: [firstArg] };\n }\n }\n\n // Try to find command with space-separated subcommand path\n // Only search top-level commands to avoid child commands shadowing\n // top-level ones (e.g., \"platform > build\" shadowing standalone \"build\")\n let currentCommand = this.findTopLevelCommand(firstArg);\n const consumedArgs: string[] = [];\n\n if (!currentCommand) {\n return { command: undefined, consumedArgs: [] };\n }\n\n consumedArgs.push(firstArg);\n\n // Walk through remaining args to find nested subcommands\n for (let i = 1; i < positionalArgs.length; i++) {\n const arg = positionalArgs[i];\n\n if (!currentCommand.hasChildren) {\n break;\n }\n\n const childCommand = currentCommand.findChild(arg);\n if (childCommand) {\n currentCommand = childCommand;\n consumedArgs.push(arg);\n } else {\n // No matching child, stop here\n break;\n }\n }\n\n return { command: currentCommand, consumedArgs };\n }\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Public API\n // ─────────────────────────────────────────────────────────────────────────────\n\n /**\n * Get all registered commands in the application.\n */\n public get commands(): CommandPrimitive<any>[] {\n return this.alepha.primitives($command);\n }\n\n /**\n * Execute a command handler with given arguments.\n *\n * This is a **lightweight test helper** that directly invokes the command handler\n * without the full production lifecycle. It intentionally skips:\n * - Pre/post command hooks\n * - Runner session (pretty CLI output)\n * - Alepha context wrapper\n * - .env.{mode} file loading\n *\n * For production execution, the `onReady` hook uses `executeCommand()` which\n * provides the full lifecycle. Merging them would either make this method too\n * heavy for simple testing or require many optional parameters to toggle behaviors.\n *\n * @example\n * ```typescript\n * // In tests\n * const cli = alepha.inject(CliProvider);\n * const cmd = alepha.inject(InitCommand);\n *\n * await cli.run(cmd.init, \"--agent --pm=yarn\");\n * await cli.run(cmd.init, { argv: \"--agent\", root: \"/project\" });\n * ```\n */\n public async run<T extends TObject, A extends TSchema>(\n command: CommandPrimitive<T, A>,\n options:\n | string\n | string[]\n | { argv?: string | string[]; root?: string } = {},\n ): Promise<void> {\n const opts =\n typeof options === \"string\" || Array.isArray(options)\n ? { argv: options }\n : options;\n const args =\n typeof opts.argv === \"string\"\n ? opts.argv.split(\" \").filter(Boolean)\n : (opts.argv ?? []);\n const root = opts.root ?? process.cwd();\n\n const commandFlags = this.parseCommandFlags(args, command.flags, {\n modeEnabled: !!command.options.mode,\n });\n const commandArgs = this.parseCommandArgs(\n args,\n command.options.args,\n true,\n command.flags,\n );\n const commandEnv = this.parseCommandEnv(command.env, command.name);\n\n let modeValue: string | undefined;\n if (command.options.mode) {\n modeValue = this.parseModeFlag(args);\n if (modeValue === undefined && typeof command.options.mode === \"string\") {\n modeValue = command.options.mode;\n }\n }\n\n await command.options.handler({\n flags: commandFlags,\n args: commandArgs,\n env: commandEnv,\n run: this.runner.run,\n ask: this.asker.ask,\n fs,\n glob,\n root,\n help: () => this.printHelp(command),\n mode: modeValue,\n } as CommandHandlerArgs<T, A>);\n }\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Command Resolution\n // ─────────────────────────────────────────────────────────────────────────────\n\n /**\n * Find a command by name or alias\n */\n protected findCommand(name: string): CommandPrimitive<TObject> | undefined {\n return this.commands.findLast(\n (command) => command.name === name || command.aliases.includes(name),\n );\n }\n\n /**\n * Find a top-level command by name or alias (excludes child commands)\n */\n protected findTopLevelCommand(\n name: string,\n ): CommandPrimitive<TObject> | undefined {\n return this.getTopLevelCommands().findLast(\n (command) => command.name === name || command.aliases.includes(name),\n );\n }\n\n /**\n * Find all pre-hooks for a command (commands named `pre{commandName}`)\n */\n protected findPreHooks(commandName: string): CommandPrimitive<TObject>[] {\n return this.commands.filter((cmd) => cmd.name === `pre${commandName}`);\n }\n\n /**\n * Find all post-hooks for a command (commands named `post{commandName}`)\n */\n protected findPostHooks(commandName: string): CommandPrimitive<TObject>[] {\n return this.commands.filter((cmd) => cmd.name === `post${commandName}`);\n }\n\n /**\n * Get global flags (help only, root command flags are NOT global)\n */\n protected getAllGlobalFlags(): Record<\n string,\n { aliases: string[]; description?: string; schema: TSchema }\n > {\n return { ...this.globalFlags };\n }\n\n /**\n * Read a schema's metadata (`title`, `description`, `aliases`, `alias`, …).\n *\n * Under zod these options live on the schema's `.meta()` registry rather than\n * as direct properties (typebox), and they sit on the INNER schema — so any\n * optional / nullable / default wrappers are peeled first.\n */\n protected schemaMeta(schema: TSchema | undefined): Record<string, any> {\n if (!schema) return {};\n const base = z.schema.unwrap(schema) as any;\n return (typeof base?.meta === \"function\" ? base.meta() : undefined) ?? {};\n }\n\n /**\n * Build flag definitions (key, aliases, description, schema) from a flags\n * object schema. Centralises the metadata reading so every call-site (parsing,\n * arg-splitting, help) extracts aliases/descriptions the same way.\n */\n protected extractFlagDefs(schema: TObject): Array<{\n key: string;\n aliases: string[];\n description?: string;\n schema: TSchema;\n }> {\n return Object.entries(schema.properties).map(([key, value]) => {\n const meta = this.schemaMeta(value as TSchema);\n const extra: string[] = meta.aliases ?? (meta.alias ? [meta.alias] : []);\n return {\n key,\n aliases: [key, ...extra],\n description: meta.description,\n schema: value as TSchema,\n };\n });\n }\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Parsing (Flags, Args, Env)\n // ─────────────────────────────────────────────────────────────────────────────\n\n /**\n * Parse command flags from argv using the command's flag schema\n */\n protected parseCommandFlags(\n argv: string[],\n schema: TObject,\n options: { modeEnabled?: boolean } = {},\n ): Record<string, any> {\n const { modeEnabled = false } = options;\n const flagDefs = this.extractFlagDefs(schema);\n\n // Add mode flags if mode is enabled (they're parsed elsewhere by parseModeFlag)\n if (modeEnabled) {\n flagDefs.push({\n key: \"__mode__\",\n aliases: [\"mode\", \"m\"],\n description: undefined,\n schema: z.string(),\n });\n }\n\n // Tolerate global flags (--help, --verbose) so strict command parsing\n // doesn't reject them — they're consumed by the onReady global pass,\n // not by the command. Skip any whose alias the command already claims\n // (e.g. a command with its own `verbose` flag handles it directly).\n const claimed = new Set(flagDefs.flatMap((d) => d.aliases));\n for (const [key, value] of Object.entries(this.getAllGlobalFlags())) {\n if (value.aliases.some((a: string) => claimed.has(a))) continue;\n flagDefs.push({\n key: `__global_${key}__`,\n aliases: value.aliases,\n description: undefined,\n schema: value.schema,\n });\n }\n\n const parsed = this.parseFlags(argv, flagDefs);\n\n // Remove the mode + global flags from parsed result (handled separately)\n parsed.__mode__ = undefined;\n for (const key of Object.keys(parsed)) {\n if (key.startsWith(\"__global_\")) delete parsed[key];\n }\n\n // apply manually defaults for optional properties that have defaults\n for (const [key, value] of Object.entries(\n schema.properties as Record<string, TSchema>,\n )) {\n if (!(key in parsed)) {\n const def = z.schema.getDefault(value);\n if (def !== undefined) {\n parsed[key] = def;\n }\n }\n }\n\n try {\n return this.alepha.codec.decode(schema, parsed);\n } catch (error) {\n if (error instanceof TypeBoxError) {\n throw new CommandError(\n `Invalid flag: ${error.cause.instancePath || \"command\"} ${error.cause.message}`,\n );\n }\n throw error;\n }\n }\n\n /**\n * Parse and validate environment variables using the command's env schema\n */\n protected parseCommandEnv(\n schema: TObject,\n commandName: string,\n ): Record<string, any> {\n const result: Record<string, any> = {};\n const missing: string[] = [];\n\n for (const [key, propSchema] of Object.entries(\n schema.properties as Record<string, TSchema>,\n )) {\n const value = process.env[key];\n\n if (value !== undefined) {\n result[key] = value;\n } else {\n const def = z.schema.getDefault(propSchema);\n if (def !== undefined) {\n result[key] = def;\n } else if (z.schema.isOptional(propSchema)) {\n // Optional with no default — leave undefined\n } else {\n missing.push(key);\n }\n }\n }\n\n if (missing.length > 0) {\n const vars = missing.join(\", \");\n throw new CommandError(\n `Missing required environment variable${missing.length > 1 ? \"s\" : \"\"}: ${vars}`,\n );\n }\n\n try {\n return this.alepha.codec.decode(schema, result);\n } catch (error) {\n if (error instanceof TypeBoxError) {\n throw new CommandError(\n `Invalid environment variable: ${error.cause.instancePath || \"env\"} ${error.cause.message}`,\n );\n }\n throw error;\n }\n }\n\n /**\n * Parse --mode or -m flag from argv for environment file loading\n */\n protected parseModeFlag(argv: string[]): string | undefined {\n for (let i = 0; i < argv.length; i++) {\n const arg = argv[i];\n\n // Handle --mode=value or -m=value\n if (arg.startsWith(\"--mode=\") || arg.startsWith(\"-m=\")) {\n return arg.split(\"=\")[1];\n }\n\n // Handle --mode value or -m value\n if (arg === \"--mode\" || arg === \"-m\") {\n const nextArg = argv[i + 1];\n if (nextArg && !nextArg.startsWith(\"-\")) {\n return nextArg;\n }\n throw new CommandError(\"Flag --mode requires a value.\");\n }\n }\n\n return undefined;\n }\n\n /**\n * Load .env and .env.{mode} files into process.env\n */\n protected async loadModeEnv(\n root: string,\n mode: string | undefined,\n ): Promise<void> {\n const envFiles = [\".env\"];\n if (mode) {\n envFiles.push(`.env.${mode}`);\n }\n this.log.debug(`Loading env files: ${envFiles.join(\", \")}`);\n await this.envUtils.loadEnv(root, envFiles);\n }\n\n /**\n * Low-level flag parser - extracts flag values from argv based on definitions\n */\n protected parseFlags(\n argv: string[],\n flagDefs: { key: string; aliases: string[]; schema: TSchema }[],\n options: { strict?: boolean } = {},\n ): Record<string, any> {\n const { strict = true } = options;\n const result: Record<string, any> = {};\n\n for (let i = 0; i < argv.length; i++) {\n const arg = argv[i];\n if (!arg.startsWith(\"-\")) continue;\n\n const [rawKey, ...valueParts] = arg.replace(/^-{1,2}/, \"\").split(\"=\");\n const value = valueParts.join(\"=\");\n\n const def = flagDefs.find((d) => d.aliases.includes(rawKey));\n if (!def) {\n if (strict) {\n throw new CommandError(`Unknown flag: --${rawKey}`);\n }\n continue;\n }\n\n // Resolve the underlying schema (peel optional/nullable/default) so flags\n // like `z.boolean().optional()` are still recognised as booleans.\n const base = z.schema.unwrap(def.schema);\n\n // Check if schema is a union containing boolean (allows flag without value)\n const isUnionWithBoolean =\n z.schema.isUnion(base) &&\n (base as TUnion).anyOf.some((s) => z.schema.isBoolean(s));\n\n if (z.schema.isBoolean(base)) {\n result[def.key] = true;\n } else if (isUnionWithBoolean && !value) {\n // Union with boolean: --flag without value → true\n const nextArg = argv[i + 1];\n if (nextArg && !nextArg.startsWith(\"-\")) {\n // Has a value after space: --flag value\n result[def.key] = nextArg;\n i++; // consume next arg\n } else {\n // No value: --flag → true\n result[def.key] = true;\n }\n } else if (value) {\n // Value provided via --flag=value syntax\n result[def.key] = this.castFlagValue(value, base, rawKey);\n } else {\n // Check for space-separated value: --flag value\n const nextArg = argv[i + 1];\n if (nextArg && !nextArg.startsWith(\"-\")) {\n result[def.key] = this.castFlagValue(nextArg, base, rawKey);\n } else {\n throw new CommandError(`Flag --${rawKey} requires a value.`);\n }\n }\n }\n\n return result;\n }\n\n /**\n * Convert a raw flag value string into the value its schema expects.\n *\n * zod no longer coerces, so scalar values (number / integer / boolean) are\n * cast + validated via {@link parseArgumentValue} (same path as positional\n * args); object / array / record values are JSON-parsed. `schema` is expected\n * to already be unwrapped of optional/nullable/default.\n */\n protected castFlagValue(value: string, schema: TSchema, rawKey: string): any {\n if (\n z.schema.isObject(schema) ||\n z.schema.isArray(schema) ||\n z.schema.isRecord(schema)\n ) {\n try {\n return JSON.parse(value);\n } catch {\n throw new CommandError(`Invalid JSON value for flag --${rawKey}`);\n }\n }\n return this.parseArgumentValue(value, schema);\n }\n\n /**\n * Get indices of argv elements consumed by flags (for separating args from flags)\n */\n protected getFlagConsumedIndices(\n argv: string[],\n flagDefs: { key: string; aliases: string[]; schema: TSchema }[],\n ): Set<number> {\n const consumed = new Set<number>();\n\n for (let i = 0; i < argv.length; i++) {\n const arg = argv[i];\n if (!arg.startsWith(\"-\")) continue;\n\n consumed.add(i);\n\n const [rawKey, ...valueParts] = arg.replace(/^-{1,2}/, \"\").split(\"=\");\n const hasEqualValue = valueParts.length > 0;\n\n const def = flagDefs.find((d) => d.aliases.includes(rawKey));\n if (!def) continue;\n\n // Peel optional/nullable/default so boolean flags are recognised.\n const base = z.schema.unwrap(def.schema);\n\n // Check if schema is a union containing boolean\n const isUnionWithBoolean =\n z.schema.isUnion(base) &&\n (base as TUnion).anyOf.some((s) => z.schema.isBoolean(s));\n\n // If not a boolean flag and no = value, the next arg is consumed as the value\n // Exception: union with boolean can work without a value\n if (!z.schema.isBoolean(base) && !isUnionWithBoolean && !hasEqualValue) {\n const nextArg = argv[i + 1];\n if (nextArg && !nextArg.startsWith(\"-\")) {\n consumed.add(i + 1);\n }\n } else if (isUnionWithBoolean && !hasEqualValue) {\n // Union with boolean: check if next arg looks like a value (not a flag)\n const nextArg = argv[i + 1];\n if (nextArg && !nextArg.startsWith(\"-\")) {\n consumed.add(i + 1);\n }\n }\n }\n\n return consumed;\n }\n\n protected parseCommandArgs(\n argv: string[],\n schema?: TSchema,\n isRootCommand = false,\n flagSchema?: TObject,\n ): any {\n if (!schema) {\n return undefined;\n }\n\n // Get indices consumed by flags (including space-separated values)\n const flagDefs = flagSchema ? this.extractFlagDefs(flagSchema) : [];\n const consumedIndices = this.getFlagConsumedIndices(argv, flagDefs);\n\n // Extract positional arguments (non-flag arguments that aren't consumed as flag values)\n const positionalArgs = argv.filter(\n (arg, idx) => !arg.startsWith(\"-\") && !consumedIndices.has(idx),\n );\n // For root commands, there's no command name to remove; otherwise slice off the command name\n const argsOnly = isRootCommand ? positionalArgs : positionalArgs.slice(1);\n\n try {\n if (z.schema.isOptional(schema)) {\n // Handle optional args: z.text().optional()\n if (argsOnly.length === 0) {\n return undefined;\n }\n return this.parseArgumentValue(argsOnly[0], schema);\n } else if (z.schema.isTuple(schema) && schema.items) {\n // Handle tuple args: z.tuple([z.text(), z.number()])\n const result: any[] = [];\n const items = schema.items;\n for (let i = 0; i < items.length; i++) {\n const itemSchema = items[i];\n if (i < argsOnly.length) {\n result.push(this.parseArgumentValue(argsOnly[i], itemSchema));\n } else if (z.schema.isOptional(itemSchema)) {\n result.push(undefined);\n } else {\n throw new CommandError(\n `Missing required argument at position ${i + 1}`,\n );\n }\n }\n return result;\n } else {\n // Handle single arg: z.text(), z.number(), etc.\n if (argsOnly.length === 0) {\n throw new CommandError(\"Missing required argument\");\n }\n return this.parseArgumentValue(argsOnly[0], schema);\n }\n } catch (error) {\n if (error instanceof TypeBoxError) {\n throw new CommandError(`Invalid argument: ${error.value.message}`);\n }\n throw error;\n }\n }\n\n /**\n * Convert a string argument value to the appropriate type based on schema\n */\n protected parseArgumentValue(value: string, schema: TSchema): any {\n if (z.schema.isString(schema)) {\n return value;\n }\n\n if (z.schema.isNumber(schema) || z.schema.isInteger(schema)) {\n const num = Number(value);\n if (Number.isNaN(num)) {\n throw new CommandError(`Expected number, got \"${value}\"`);\n }\n if (z.schema.isInteger(schema) && !Number.isInteger(num)) {\n throw new CommandError(`Expected integer, got \"${value}\"`);\n }\n return num;\n }\n\n if (z.schema.isBoolean(schema)) {\n const lower = value.toLowerCase();\n if (lower === \"true\" || lower === \"1\") return true;\n if (lower === \"false\" || lower === \"0\") return false;\n throw new CommandError(`Expected boolean, got \"${value}\"`);\n }\n\n // For other types, return the string value and let TypeBox validate it\n return value;\n }\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Help Generation\n // ─────────────────────────────────────────────────────────────────────────────\n\n /**\n * Generate usage string for command arguments (e.g., \"<path>\" or \"[path]\")\n */\n protected generateArgsUsage(schema?: TSchema): string {\n if (!schema) {\n return \"\";\n }\n\n if (z.schema.isOptional(schema)) {\n const typeName = this.getTypeName(schema);\n const key = this.schemaMeta(schema).title ?? \"arg1\";\n return ` [${key}${typeName}]`;\n }\n\n if (z.schema.isTuple(schema) && schema.items) {\n const items = schema.items;\n const args = items.map((item, index) => {\n const argName = `arg${index + 1}`;\n const typeName = this.getTypeName(item);\n if (z.schema.isOptional(item)) {\n return `[${argName}${typeName}]`;\n }\n return `<${argName}${typeName}>`;\n });\n return ` ${args.join(\" \")}`;\n }\n\n const typeName = this.getTypeName(schema);\n const key = this.schemaMeta(schema).title ?? \"arg1\";\n return ` <${key}${typeName}>`;\n }\n\n /**\n * Get display type name for a schema (e.g., \": number\", \": boolean\")\n */\n protected getTypeName(schema: TSchema): string {\n if (!schema) return \"\";\n\n // Peel optional/nullable/default before inspecting the scalar type.\n const base = z.schema.unwrap(schema);\n\n // Order matters: under zod an integer IS a number (format \"safeint\"), so the\n // narrower integer check must come before the number check.\n if (z.schema.isString(base)) return \"\";\n if (z.schema.isInteger(base)) return \": integer\";\n if (z.schema.isNumber(base)) return \": number\";\n if (z.schema.isBoolean(base)) return \": boolean\";\n\n return \"\";\n }\n\n /**\n * Print help for a specific command or general CLI help.\n *\n * @param command - If provided, shows help for this specific command.\n * If omitted, shows general CLI help with all commands.\n */\n public printHelp(command?: CommandPrimitive<any>): void {\n // Help is a document, not a log stream: render bare lines (no timestamp\n // or level prefix). Embedded colors live in the message itself, so they\n // survive the `raw` formatter.\n this.alepha.store.set(\"alepha.logger.format\", \"raw\");\n\n const cliName = this.name || \"cli\";\n const c = this.color;\n this.log.info(\"\"); // Newline\n\n if (command?.name) {\n // Command-specific help\n const hasChildren = command.hasChildren;\n const argsUsage = hasChildren\n ? ` ${c.set(\"CYAN\", \"<command>\")}`\n : this.generateColoredArgsUsage(command.options.args);\n const commandPath = this.getCommandPath(command);\n const usage =\n `${c.set(\"GREY_LIGHT\", cliName)} ${c.set(\"CYAN\", commandPath)}${argsUsage}`.trim();\n this.log.info(`${c.set(\"WHITE_BOLD\", \"Usage:\")} ${usage}`);\n\n if (command.options.description) {\n this.log.info(``);\n this.log.info(`\\t${command.options.description}`);\n }\n\n // Show subcommands if this is a parent command\n if (hasChildren) {\n this.log.info(\"\");\n this.log.info(c.set(\"WHITE_BOLD\", \"Commands:\"));\n const maxSubCmdLength = this.getMaxChildCmdLength(command.children);\n\n for (const child of command.children) {\n if (child.options.hide) {\n continue;\n }\n const childArgsUsage = this.generateArgsUsage(child.options.args);\n const cmdStr = [child.name, ...child.aliases].join(\", \");\n const fullCmdStr = `${cmdStr}${childArgsUsage}`;\n const coloredCmd = `${c.set(\"GREY_LIGHT\", cliName)} ${c.set(\"CYAN\", commandPath)} ${c.set(\"CYAN\", fullCmdStr)}`;\n const padding = \" \".repeat(\n Math.max(0, maxSubCmdLength - fullCmdStr.length),\n );\n this.log.info(\n ` ${coloredCmd}${padding} ${child.options.description ?? \"\"}`,\n );\n }\n }\n\n this.log.info(\"\");\n this.log.info(c.set(\"WHITE_BOLD\", \"Flags:\"));\n\n const flags = [\n // Read aliases/description from the schema's `.meta()` registry (zod),\n // not as direct schema properties (typebox) — see extractFlagDefs.\n ...this.extractFlagDefs(command.flags),\n // Add --mode flag if command has mode option enabled\n ...(command.options.mode\n ? [\n {\n key: \"mode\",\n aliases: [\"m\", \"mode\"],\n description:\n typeof command.options.mode === \"string\"\n ? `Environment mode - loads .env.{mode} (default: ${command.options.mode})`\n : \"Environment mode (e.g., production, staging) - loads .env.{mode}\",\n schema: z.string() as TSchema,\n },\n ]\n : []),\n ...Object.entries(this.getAllGlobalFlags()).map(([key, value]) => ({\n key,\n ...value,\n })),\n ];\n\n const maxFlagLength = this.getMaxFlagLength(flags);\n for (const flag of flags) {\n const { aliases, description } = flag;\n const schema = \"schema\" in flag ? (flag.schema as TSchema) : undefined;\n // Sort aliases by length (shorter first: -t before --target)\n const sortedAliases = (Array.isArray(aliases) ? aliases : [aliases])\n .slice()\n .sort((a, b) => a.length - b.length);\n const flagStr = sortedAliases\n .map((a: string) => (a.length === 1 ? `-${a}` : `--${a}`))\n .join(\", \");\n const coloredFlag = c.set(\"GREY_LIGHT\", flagStr);\n const padding = \" \".repeat(Math.max(0, maxFlagLength - flagStr.length));\n const formattedDesc = this.formatFlagDescription(description, schema);\n this.log.info(` ${coloredFlag}${padding} ${formattedDesc}`);\n }\n\n // Show environment variables if defined\n const envVars = Object.entries(command.env.properties);\n if (envVars.length > 0) {\n this.log.info(\"\");\n this.log.info(c.set(\"WHITE_BOLD\", \"Env:\"));\n const maxEnvLength = Math.max(...envVars.map(([key]) => key.length));\n for (const [key, schema] of envVars) {\n const isOptional = z.schema.isOptional(schema as TSchema);\n const description = (schema as any).description ?? \"\";\n const optionalStr = isOptional\n ? c.set(\"GREY_DARK\", \" (optional)\")\n : c.set(\"RED\", \" (required)\");\n const coloredKey = c.set(\"CYAN\", key);\n const padding = \" \".repeat(Math.max(0, maxEnvLength - key.length));\n this.log.info(\n ` ${coloredKey}${padding} ${description}${optionalStr}`,\n );\n }\n }\n } else {\n // general help\n this.log.info(this.description || \"Available commands:\");\n this.log.info(\"\");\n this.log.info(c.set(\"WHITE_BOLD\", \"Commands:\"));\n\n // Get top-level commands (commands that are not children of other commands)\n const topLevelCommands = this.getTopLevelCommands();\n const maxCmdLength = this.getMaxCmdLength(topLevelCommands);\n\n for (const cmd of topLevelCommands) {\n // skip root command and hooks in list\n if (cmd.name === \"\" || cmd.options.hide) {\n continue;\n }\n\n const cmdStr = [cmd.name, ...cmd.aliases].join(\", \");\n const argsUsage = cmd.hasChildren\n ? \" <command>\"\n : this.generateArgsUsage(cmd.options.args);\n const fullCmdStr = `${cmdStr}${argsUsage}`;\n const coloredCmd = `${c.set(\"GREY_LIGHT\", cliName)} ${c.set(\"CYAN\", fullCmdStr)}`;\n const padding = \" \".repeat(\n Math.max(0, maxCmdLength - fullCmdStr.length),\n );\n this.log.info(\n ` ${coloredCmd}${padding} ${cmd.options.description ?? \"\"}`,\n );\n }\n\n this.log.info(\"\");\n this.log.info(c.set(\"WHITE_BOLD\", \"Flags:\"));\n\n // In general help, also show root command flags\n const rootCommand = this.commands.find((cmd) => cmd.name === \"\");\n // Read aliases/description from the schema's `.meta()` registry (zod),\n // not as direct schema properties (typebox) — see extractFlagDefs.\n const rootFlags = rootCommand\n ? this.extractFlagDefs(rootCommand.flags)\n : [];\n\n const globalFlags = [\n ...rootFlags,\n ...Object.values(this.getAllGlobalFlags()),\n ];\n const maxFlagLength = this.getMaxFlagLength(globalFlags);\n for (const { aliases, description, schema } of globalFlags) {\n const flagStr = aliases\n .map((a) => (a.length === 1 ? `-${a}` : `--${a}`))\n .join(\", \");\n const coloredFlag = c.set(\"GREY_LIGHT\", flagStr);\n const padding = \" \".repeat(Math.max(0, maxFlagLength - flagStr.length));\n const formattedDesc = this.formatFlagDescription(description, schema);\n this.log.info(` ${coloredFlag}${padding} ${formattedDesc}`);\n }\n }\n this.log.info(\"\"); // Newline\n }\n\n /**\n * Generate colored usage string for command arguments (for help display)\n */\n protected generateColoredArgsUsage(schema?: TSchema): string {\n if (!schema) {\n return \"\";\n }\n\n const c = this.color;\n\n if (z.schema.isOptional(schema)) {\n const typeName = this.getTypeName(schema);\n const key = this.schemaMeta(schema).title ?? \"arg1\";\n return ` ${c.set(\"GREY_DARK\", `[${key}${typeName}]`)}`;\n }\n\n if (z.schema.isTuple(schema) && schema.items) {\n const items = schema.items;\n const args = items.map((item, index) => {\n const argName = `arg${index + 1}`;\n const typeName = this.getTypeName(item);\n if (z.schema.isOptional(item)) {\n return c.set(\"GREY_DARK\", `[${argName}${typeName}]`);\n }\n return c.set(\"CYAN\", `<${argName}${typeName}>`);\n });\n return ` ${args.join(\" \")}`;\n }\n\n const typeName = this.getTypeName(schema);\n const key = this.schemaMeta(schema).title ?? \"arg1\";\n return ` ${c.set(\"CYAN\", `<${key}${typeName}>`)}`;\n }\n\n /**\n * Get the full command path (e.g., \"deploy vercel\" for a nested command)\n */\n protected getCommandPath(command: CommandPrimitive<any>): string {\n const path: string[] = [command.name];\n let current = command;\n\n // Walk up the tree to find parents\n while (true) {\n const parent = this.findParentCommand(current);\n if (!parent) break;\n path.unshift(parent.name);\n current = parent;\n }\n\n return path.join(\" \");\n }\n\n /**\n * Find the parent command of a nested command\n */\n protected findParentCommand(\n command: CommandPrimitive<any>,\n ): CommandPrimitive<any> | undefined {\n for (const cmd of this.commands) {\n if (cmd.children.includes(command)) {\n return cmd;\n }\n }\n return undefined;\n }\n\n /**\n * Get top-level commands (commands that are not children of other commands)\n */\n protected getTopLevelCommands(): CommandPrimitive<any>[] {\n const allChildren = new Set<CommandPrimitive<any>>();\n\n // Collect all children\n for (const command of this.commands) {\n for (const child of command.children) {\n allChildren.add(child);\n }\n }\n\n // Return commands that are not children\n return this.commands.filter((cmd) => !allChildren.has(cmd));\n }\n\n /**\n * Calculate max display length for child commands (for help alignment)\n */\n protected getMaxChildCmdLength(children: CommandPrimitive<any>[]): number {\n return Math.max(\n ...children\n .filter((c) => !c.options.hide)\n .map((c) => {\n const cmdStr = [c.name, ...c.aliases].join(\", \");\n const argsUsage = this.generateArgsUsage(c.options.args);\n return `${cmdStr}${argsUsage}`.length;\n }),\n 0,\n );\n }\n\n /**\n * Calculate max display length for commands (for help alignment)\n */\n protected getMaxCmdLength(commands: CommandPrimitive[]): number {\n return Math.max(\n ...commands\n .filter((c) => !c.options.hide && c.name !== \"\")\n .map((c) => {\n const cmdStr = [c.name, ...c.aliases].join(\", \");\n const argsUsage = c.hasChildren\n ? \" <command>\"\n : this.generateArgsUsage(c.options.args);\n return `${cmdStr}${argsUsage}`.length;\n }),\n );\n }\n\n /**\n * Calculate max display length for flags (for help alignment)\n */\n protected getMaxFlagLength(flags: { aliases: string[] }[]): number {\n return Math.max(\n ...flags.map((f) => {\n const aliases = Array.isArray(f.aliases) ? f.aliases : [f.aliases];\n return aliases\n .map((a) => (a.length === 1 ? `-${a}` : `--${a}`))\n .join(\", \").length;\n }),\n );\n }\n\n /**\n * Extract enum values from a schema if it represents an enum.\n * Returns undefined if the schema is not an enum.\n */\n protected getEnumValues(schema: TSchema): string[] | undefined {\n if (!schema) return undefined;\n\n const base = z.schema.unwrap(schema);\n\n // A zod enum (`z.enum`).\n if (z.schema.isEnum(base)) {\n const values = z.schema.enumValues(base);\n return values.length > 0 && values.every((v) => typeof v === \"string\")\n ? values\n : undefined;\n }\n\n // A union of string literals (alternative enum representation).\n if (z.schema.isUnion(base)) {\n const variants = (base as any).anyOf ?? [];\n const values: string[] = [];\n\n for (const variant of variants) {\n const value = (variant as any).value; // zod literal value\n if (z.schema.isLiteral(variant) && typeof value === \"string\") {\n values.push(value);\n } else {\n // Not all variants are string literals, not a simple enum.\n return undefined;\n }\n }\n\n return values.length > 0 ? values : undefined;\n }\n\n return undefined;\n }\n\n /**\n * Format flag description with enum values if applicable.\n */\n protected formatFlagDescription(\n description: string | undefined,\n schema: TSchema | undefined,\n ): string {\n const baseDesc = description ?? \"\";\n\n if (!schema) return baseDesc;\n\n const enumValues = this.getEnumValues(schema);\n if (enumValues && enumValues.length > 0) {\n const valuesStr = enumValues.join(\", \");\n const c = this.color;\n const enumHint = c.set(\"GREY_DARK\", `[${valuesStr}]`);\n return baseDesc ? `${baseDesc} ${enumHint}` : enumHint;\n }\n\n return baseDesc;\n }\n}\n","import { $module } from \"alepha\";\nimport { Asker } from \"./helpers/Asker.ts\";\nimport { EnvUtils } from \"./helpers/EnvUtils.ts\";\nimport { Runner } from \"./helpers/Runner.ts\";\nimport { $command } from \"./primitives/$command.ts\";\nimport { CliProvider } from \"./providers/CliProvider.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport * from \"./errors/CommandError.ts\";\nexport * from \"./helpers/Asker.ts\";\nexport * from \"./helpers/EnvUtils.ts\";\nexport * from \"./helpers/Runner.ts\";\nexport * from \"./primitives/$command.ts\";\nexport * from \"./providers/CliProvider.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n/**\n * Declarative CLI command framework.\n *\n * **Features:**\n * - CLI command definitions\n * - Interactive CLI prompts (plain readline)\n * - Command execution with streamed, verbose output\n * - Environment variable utilities\n * - Schema validation for CLI arguments\n *\n * @module alepha.command\n */\nexport const AlephaCommand = $module({\n name: \"alepha.command\",\n primitives: [$command],\n services: [CliProvider, Runner, Asker, EnvUtils],\n});\n\n// ---------------------------------------------------------------------------------------------------------------------\n\ndeclare module \"alepha\" {\n interface StringOptions {\n /**\n * Additional aliases for the flags.\n *\n * @module alepha.command\n */\n aliases?: string[];\n }\n}\n"],"mappings":"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"}