alepha 0.22.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 (869) 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 +242 -230
  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 -1109
  58. package/dist/api/users/index.d.ts.map +1 -1
  59. package/dist/api/users/index.js +454 -369
  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 +169 -157
  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 +244 -475
  102. package/dist/cli/core/index.d.ts.map +1 -1
  103. package/dist/cli/core/index.js +308 -383
  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 +20 -39
  110. package/dist/cli/i18n/index.d.ts.map +1 -1
  111. package/dist/cli/i18n/index.js +51 -17
  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 +383 -410
  118. package/dist/cli/platform-lib/index.d.ts.map +1 -1
  119. package/dist/cli/platform-lib/index.js +300 -258
  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 +82 -194
  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 +36 -90
  183. package/dist/mcp/index.d.ts.map +1 -1
  184. package/dist/mcp/index.js +65 -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 -6
  219. package/dist/react/form/index.d.ts.map +1 -1
  220. package/dist/react/form/index.js +107 -71
  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 +47 -5
  227. package/dist/react/i18n/index.d.ts.map +1 -1
  228. package/dist/react/i18n/index.js +116 -12
  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 +188 -29
  234. package/dist/react/router/index.browser.js.map +1 -1
  235. package/dist/react/router/index.d.ts +480 -372
  236. package/dist/react/router/index.d.ts.map +1 -1
  237. package/dist/react/router/index.js +261 -47
  238. package/dist/react/router/index.js.map +1 -1
  239. package/dist/react/sitemap/index.browser.js +35 -0
  240. package/dist/react/sitemap/index.browser.js.map +1 -0
  241. package/dist/react/sitemap/index.d.ts +91 -0
  242. package/dist/react/sitemap/index.d.ts.map +1 -0
  243. package/dist/react/sitemap/index.js +131 -0
  244. package/dist/react/sitemap/index.js.map +1 -0
  245. package/dist/react/testing/index.d.ts +4 -5
  246. package/dist/react/testing/index.d.ts.map +1 -1
  247. package/dist/react/testing/index.js +41 -15
  248. package/dist/react/testing/index.js.map +1 -1
  249. package/dist/react/testing/{chunk-BpyX8vjI.js → rolldown-runtime-Bl3dcgcQ.js} +1 -1
  250. package/dist/react/ui/index.d.ts +35 -34
  251. package/dist/react/ui/index.d.ts.map +1 -1
  252. package/dist/react/ui/index.js +12 -17
  253. package/dist/react/ui/index.js.map +1 -1
  254. package/dist/redis/index.bun.js +5 -5
  255. package/dist/redis/index.bun.js.map +1 -1
  256. package/dist/redis/index.d.ts +6 -7
  257. package/dist/redis/index.d.ts.map +1 -1
  258. package/dist/redis/index.js +6 -6
  259. package/dist/redis/index.js.map +1 -1
  260. package/dist/retry/index.d.ts +0 -1
  261. package/dist/retry/index.d.ts.map +1 -1
  262. package/dist/retry/index.js.map +1 -1
  263. package/dist/router/index.d.ts.map +1 -1
  264. package/dist/router/index.js.map +1 -1
  265. package/dist/scheduler/index.d.ts +4 -12
  266. package/dist/scheduler/index.d.ts.map +1 -1
  267. package/dist/scheduler/index.js +9 -4
  268. package/dist/scheduler/index.js.map +1 -1
  269. package/dist/scheduler/index.workerd.js +9 -4
  270. package/dist/scheduler/index.workerd.js.map +1 -1
  271. package/dist/security/index.browser.js +30 -28
  272. package/dist/security/index.browser.js.map +1 -1
  273. package/dist/security/index.d.ts +113 -44
  274. package/dist/security/index.d.ts.map +1 -1
  275. package/dist/security/index.js +452 -37
  276. package/dist/security/index.js.map +1 -1
  277. package/dist/server/auth/index.browser.js +19 -19
  278. package/dist/server/auth/index.browser.js.map +1 -1
  279. package/dist/server/auth/index.d.ts +215 -187
  280. package/dist/server/auth/index.d.ts.map +1 -1
  281. package/dist/server/auth/index.js +1145 -86
  282. package/dist/server/auth/index.js.map +1 -1
  283. package/dist/server/cookies/index.browser.js +103 -5
  284. package/dist/server/cookies/index.browser.js.map +1 -1
  285. package/dist/server/cookies/index.d.ts +86 -4
  286. package/dist/server/cookies/index.d.ts.map +1 -1
  287. package/dist/server/cookies/index.js +121 -8
  288. package/dist/server/cookies/index.js.map +1 -1
  289. package/dist/server/core/index.browser.js +22 -27
  290. package/dist/server/core/index.browser.js.map +1 -1
  291. package/dist/server/core/index.d.ts +134 -85
  292. package/dist/server/core/index.d.ts.map +1 -1
  293. package/dist/server/core/index.js +130 -118
  294. package/dist/server/core/index.js.map +1 -1
  295. package/dist/server/cors/index.d.ts +9 -10
  296. package/dist/server/cors/index.d.ts.map +1 -1
  297. package/dist/server/cors/index.js +14 -26
  298. package/dist/server/cors/index.js.map +1 -1
  299. package/dist/server/etag/index.d.ts +2 -3
  300. package/dist/server/etag/index.d.ts.map +1 -1
  301. package/dist/server/etag/index.js.map +1 -1
  302. package/dist/server/health/index.d.ts +18 -19
  303. package/dist/server/health/index.d.ts.map +1 -1
  304. package/dist/server/health/index.js +6 -6
  305. package/dist/server/health/index.js.map +1 -1
  306. package/dist/server/links/index.browser.js +15 -18
  307. package/dist/server/links/index.browser.js.map +1 -1
  308. package/dist/server/links/index.d.ts +66 -67
  309. package/dist/server/links/index.d.ts.map +1 -1
  310. package/dist/server/links/index.js +29 -32
  311. package/dist/server/links/index.js.map +1 -1
  312. package/dist/server/metrics/index.d.ts +0 -1
  313. package/dist/server/metrics/index.d.ts.map +1 -1
  314. package/dist/server/metrics/index.js +10 -3
  315. package/dist/server/metrics/index.js.map +1 -1
  316. package/dist/server/proxy/index.d.ts +0 -1
  317. package/dist/server/proxy/index.d.ts.map +1 -1
  318. package/dist/server/proxy/index.js.map +1 -1
  319. package/dist/server/rate-limit/index.d.ts +8 -9
  320. package/dist/server/rate-limit/index.d.ts.map +1 -1
  321. package/dist/server/rate-limit/index.js +6 -12
  322. package/dist/server/rate-limit/index.js.map +1 -1
  323. package/dist/server/static/index.d.ts +0 -1
  324. package/dist/server/static/index.d.ts.map +1 -1
  325. package/dist/server/static/index.js.map +1 -1
  326. package/dist/server/swagger/index.d.ts +4 -4
  327. package/dist/server/swagger/index.d.ts.map +1 -1
  328. package/dist/server/swagger/index.js +37 -25
  329. package/dist/server/swagger/index.js.map +1 -1
  330. package/dist/sms/index.d.ts +0 -1
  331. package/dist/sms/index.d.ts.map +1 -1
  332. package/dist/sms/index.js.map +1 -1
  333. package/dist/system/index.browser.js.map +1 -1
  334. package/dist/system/index.d.ts +0 -1
  335. package/dist/system/index.d.ts.map +1 -1
  336. package/dist/system/index.js +2 -1
  337. package/dist/system/index.js.map +1 -1
  338. package/dist/system/index.workerd.js.map +1 -1
  339. package/dist/topic/core/index.d.ts +19 -20
  340. package/dist/topic/core/index.d.ts.map +1 -1
  341. package/dist/topic/core/index.js +8 -8
  342. package/dist/topic/core/index.js.map +1 -1
  343. package/dist/topic/redis/index.d.ts +3 -4
  344. package/dist/topic/redis/index.d.ts.map +1 -1
  345. package/dist/topic/redis/index.js +2 -2
  346. package/dist/topic/redis/index.js.map +1 -1
  347. package/package.json +36 -36
  348. package/src/api/audits/__tests__/AuditJobs.spec.ts +83 -0
  349. package/src/api/audits/__tests__/AuditService.spec.ts +139 -1
  350. package/src/api/audits/controllers/AdminAuditController.ts +41 -41
  351. package/src/api/audits/entities/audits.ts +22 -22
  352. package/src/api/audits/index.ts +6 -1
  353. package/src/api/audits/jobs/AuditJobs.ts +29 -0
  354. package/src/api/audits/parameters/AuditParameters.ts +51 -0
  355. package/src/api/audits/primitives/$audit.ts +24 -0
  356. package/src/api/audits/schemas/auditQuerySchema.ts +13 -13
  357. package/src/api/audits/schemas/createAuditSchema.ts +18 -18
  358. package/src/api/audits/services/AuditService.ts +79 -7
  359. package/src/api/files/__tests__/FileController.spec.ts +5 -5
  360. package/src/api/files/__tests__/FileJobs.spec.ts +6 -0
  361. package/src/api/files/controllers/FileController.ts +25 -25
  362. package/src/api/files/entities/files.ts +15 -15
  363. package/src/api/files/schemas/fileCreatorSummarySchema.ts +7 -7
  364. package/src/api/files/schemas/fileQuerySchema.ts +9 -9
  365. package/src/api/files/schemas/fileResourceSchema.ts +7 -9
  366. package/src/api/files/schemas/storageStatsSchema.ts +13 -13
  367. package/src/api/jobs/__tests__/$job-hardening.spec.ts +289 -0
  368. package/src/api/jobs/__tests__/$job.spec.ts +18 -18
  369. package/src/api/jobs/controllers/AdminJobController.ts +8 -8
  370. package/src/api/jobs/entities/jobExecutionEntity.ts +29 -19
  371. package/src/api/jobs/providers/JobProvider.ts +128 -12
  372. package/src/api/jobs/providers/JobQueueProvider.ts +2 -2
  373. package/src/api/jobs/schemas/jobConfigAtom.ts +22 -22
  374. package/src/api/jobs/schemas/jobExecutionQuerySchema.ts +6 -6
  375. package/src/api/jobs/schemas/jobExecutionResourceSchema.ts +11 -15
  376. package/src/api/jobs/schemas/jobRegistrationSchema.ts +20 -19
  377. package/src/api/jobs/schemas/triggerJobSchema.ts +3 -3
  378. package/src/api/jobs/services/JobService.ts +6 -6
  379. package/src/api/keys/__tests__/ApiKeyService.spec.ts +2 -2
  380. package/src/api/keys/controllers/AdminApiKeyController.ts +10 -10
  381. package/src/api/keys/entities/apiKeyEntity.ts +15 -15
  382. package/src/api/keys/schemas/adminApiKeyQuerySchema.ts +4 -4
  383. package/src/api/keys/schemas/adminApiKeyResourceSchema.ts +15 -15
  384. package/src/api/keys/schemas/createApiKeyBodySchema.ts +5 -5
  385. package/src/api/keys/schemas/createApiKeyResponseSchema.ts +9 -9
  386. package/src/api/keys/schemas/listApiKeyResponseSchema.ts +13 -13
  387. package/src/api/keys/schemas/revokeApiKeyParamsSchema.ts +3 -3
  388. package/src/api/keys/schemas/revokeApiKeyResponseSchema.ts +3 -3
  389. package/src/api/notifications/__tests__/AlephaApiNotifications.spec.ts +2 -2
  390. package/src/api/notifications/controllers/AdminNotificationController.ts +38 -14
  391. package/src/api/notifications/jobs/NotificationJobs.ts +7 -6
  392. package/src/api/notifications/primitives/$notification.ts +43 -4
  393. package/src/api/notifications/schemas/notificationContactPreferencesSchema.ts +4 -4
  394. package/src/api/notifications/schemas/notificationContactSchema.ts +7 -7
  395. package/src/api/notifications/schemas/notificationDetailResourceSchema.ts +9 -11
  396. package/src/api/notifications/schemas/notificationPayloadSchema.ts +11 -9
  397. package/src/api/notifications/schemas/notificationQuerySchema.ts +6 -6
  398. package/src/api/notifications/schemas/notificationResourceSchema.ts +14 -14
  399. package/src/api/notifications/services/NotificationSenderService.ts +38 -2
  400. package/src/api/oauth/__tests__/OAuthClientService.spec.ts +42 -0
  401. package/src/api/oauth/__tests__/OAuthController.spec.ts +128 -0
  402. package/src/api/oauth/controllers/OAuthController.ts +132 -12
  403. package/src/api/oauth/entities/oauthClientEntity.ts +29 -12
  404. package/src/api/oauth/helpers/oauthMetadata.ts +1 -0
  405. package/src/api/oauth/helpers/oidcMetadata.ts +19 -0
  406. package/src/api/oauth/index.ts +1 -0
  407. package/src/api/oauth/schemas/authorizeDecisionBodySchema.ts +12 -11
  408. package/src/api/oauth/schemas/authorizeQuerySchema.ts +12 -10
  409. package/src/api/oauth/schemas/registerClientBodySchema.ts +10 -11
  410. package/src/api/oauth/schemas/tokenRequestBodySchema.ts +9 -8
  411. package/src/api/oauth/services/OAuthClientService.ts +228 -15
  412. package/src/api/organizations/controllers/AdminOrganizationController.ts +8 -8
  413. package/src/api/organizations/entities/organizations.ts +6 -6
  414. package/src/api/organizations/schemas/createOrganizationSchema.ts +5 -5
  415. package/src/api/organizations/schemas/organizationQuerySchema.ts +4 -4
  416. package/src/api/organizations/schemas/updateOrganizationSchema.ts +1 -2
  417. package/src/api/parameters/__tests__/$parameter.spec.ts +229 -50
  418. package/src/api/parameters/controllers/AdminParameterController.ts +9 -12
  419. package/src/api/parameters/entities/parameters.ts +29 -16
  420. package/src/api/parameters/primitives/$parameter.ts +3 -3
  421. package/src/api/parameters/schemas/activateParameterBodySchema.ts +4 -4
  422. package/src/api/parameters/schemas/createParameterVersionBodySchema.ts +15 -15
  423. package/src/api/parameters/schemas/parameterCreatorSummarySchema.ts +7 -7
  424. package/src/api/parameters/schemas/parameterCurrentResponseSchema.ts +7 -7
  425. package/src/api/parameters/schemas/parameterHistoryResponseSchema.ts +3 -3
  426. package/src/api/parameters/schemas/parameterNameParamSchema.ts +2 -3
  427. package/src/api/parameters/schemas/parameterNamesResponseSchema.ts +3 -3
  428. package/src/api/parameters/schemas/parameterResponseSchema.ts +3 -3
  429. package/src/api/parameters/schemas/parameterStatusSchema.ts +2 -2
  430. package/src/api/parameters/schemas/parameterTreeNodeSchema.ts +6 -6
  431. package/src/api/parameters/schemas/parameterVersionParamSchema.ts +5 -6
  432. package/src/api/parameters/schemas/parameterVersionResponseSchema.ts +3 -3
  433. package/src/api/parameters/schemas/rollbackParameterBodySchema.ts +6 -9
  434. package/src/api/parameters/services/ParameterProvider.ts +152 -65
  435. package/src/api/payments/controllers/AdminPaymentController.ts +7 -7
  436. package/src/api/payments/controllers/MockCheckoutController.ts +79 -28
  437. package/src/api/payments/controllers/PaymentController.ts +4 -4
  438. package/src/api/payments/entities/paymentIntents.ts +11 -11
  439. package/src/api/payments/entities/paymentMethods.ts +11 -11
  440. package/src/api/payments/entities/refunds.ts +9 -9
  441. package/src/api/payments/providers/PaymentProvider.ts +18 -0
  442. package/src/api/payments/schemas/intentSchemas.ts +25 -25
  443. package/src/api/payments/schemas/paymentMethodSchemas.ts +3 -3
  444. package/src/api/payments/services/PaymentService.ts +60 -3
  445. package/src/api/subscriptions/__tests__/SubscriptionService.spec.ts +14 -0
  446. package/src/api/subscriptions/controllers/AdminSubscriptionController.ts +11 -11
  447. package/src/api/subscriptions/controllers/SubscriptionController.ts +5 -4
  448. package/src/api/subscriptions/entities/subscriptionEvents.ts +15 -15
  449. package/src/api/subscriptions/entities/subscriptions.ts +22 -22
  450. package/src/api/subscriptions/notifications/SubscriptionNotifications.ts +22 -22
  451. package/src/api/subscriptions/schemas/cancelSubscriptionSchema.ts +4 -4
  452. package/src/api/subscriptions/schemas/changePlanSchema.ts +5 -5
  453. package/src/api/subscriptions/schemas/createSubscriptionSchema.ts +14 -7
  454. package/src/api/subscriptions/schemas/entitlementsSchema.ts +10 -10
  455. package/src/api/subscriptions/schemas/mrrSchema.ts +9 -9
  456. package/src/api/subscriptions/schemas/planDefinitionSchema.ts +21 -21
  457. package/src/api/subscriptions/schemas/planResourceSchema.ts +19 -19
  458. package/src/api/subscriptions/schemas/subscriptionQuerySchema.ts +8 -8
  459. package/src/api/subscriptions/schemas/subscriptionSettingsSchema.ts +7 -7
  460. package/src/api/subscriptions/schemas/subscriptionStatsSchema.ts +17 -17
  461. package/src/api/subscriptions/services/SubscriptionConfig.ts +2 -2
  462. package/src/api/users/__tests__/ApiKeys-integration.spec.ts +11 -11
  463. package/src/api/users/atoms/realmAuthSettingsAtom.ts +111 -119
  464. package/src/api/users/controllers/AdminIdentityController.ts +29 -19
  465. package/src/api/users/controllers/AdminSessionController.ts +37 -27
  466. package/src/api/users/controllers/AdminUserController.ts +75 -53
  467. package/src/api/users/controllers/MySessionController.ts +125 -0
  468. package/src/api/users/controllers/RealmController.ts +9 -9
  469. package/src/api/users/controllers/UserController.ts +55 -55
  470. package/src/api/users/entities/identities.ts +8 -8
  471. package/src/api/users/entities/sessions.ts +17 -17
  472. package/src/api/users/entities/users.ts +17 -17
  473. package/src/api/users/index.ts +3 -0
  474. package/src/api/users/notifications/UserNotifications.ts +76 -24
  475. package/src/api/users/primitives/$realm.ts +12 -0
  476. package/src/api/users/schemas/completePasswordResetRequestSchema.ts +8 -12
  477. package/src/api/users/schemas/completeRegistrationRequestSchema.ts +17 -20
  478. package/src/api/users/schemas/createUserSchema.ts +2 -2
  479. package/src/api/users/schemas/identityQuerySchema.ts +4 -4
  480. package/src/api/users/schemas/identityResourceSchema.ts +3 -2
  481. package/src/api/users/schemas/loginSchema.ts +4 -4
  482. package/src/api/users/schemas/passwordResetIntentResponseSchema.ts +6 -8
  483. package/src/api/users/schemas/realmConfigSchema.ts +10 -10
  484. package/src/api/users/schemas/registerQuerySchema.ts +6 -6
  485. package/src/api/users/schemas/registerRequestSchema.ts +21 -43
  486. package/src/api/users/schemas/registerResponseSchema.ts +2 -2
  487. package/src/api/users/schemas/registerSchema.ts +13 -31
  488. package/src/api/users/schemas/registrationIntentResponseSchema.ts +19 -23
  489. package/src/api/users/schemas/resetPasswordSchema.ts +10 -17
  490. package/src/api/users/schemas/sessionQuerySchema.ts +3 -3
  491. package/src/api/users/schemas/sessionResourceSchema.ts +25 -25
  492. package/src/api/users/schemas/updateUserSchema.ts +3 -4
  493. package/src/api/users/schemas/userQuerySchema.ts +7 -7
  494. package/src/api/users/services/RegistrationService.ts +25 -11
  495. package/src/api/users/services/UserService.ts +12 -6
  496. package/src/api/verifications/__tests__/CodeVerification.spec.ts +63 -101
  497. package/src/api/verifications/__tests__/LinkVerification.spec.ts +23 -92
  498. package/src/api/verifications/controllers/VerificationController.ts +13 -27
  499. package/src/api/verifications/entities/verifications.ts +13 -14
  500. package/src/api/verifications/schemas/requestVerificationCodeResponseSchema.ts +17 -14
  501. package/src/api/verifications/schemas/validateVerificationCodeResponseSchema.ts +9 -10
  502. package/src/api/verifications/schemas/verificationSettingsSchema.ts +65 -66
  503. package/src/api/verifications/schemas/verificationTypeEnumSchema.ts +2 -2
  504. package/src/api/verifications/services/VerificationService.ts +12 -0
  505. package/src/background/__tests__/BackgroundTaskProvider.spec.ts +36 -0
  506. package/src/batch/__tests__/$batch.spec.ts +22 -22
  507. package/src/batch/__tests__/startup-buffering.spec.ts +9 -9
  508. package/src/bin/index.ts +1 -1
  509. package/src/bucket/__tests__/TenantScopedBucket.spec.ts +60 -0
  510. package/src/bucket/providers/LocalFileStorageProvider.ts +14 -6
  511. package/src/bucket/providers/MemoryFileStorageProvider.ts +18 -7
  512. package/src/bucket/providers/R2FileStorageProvider.ts +14 -6
  513. package/src/bucket/providers/S3FileStorageProvider.ts +31 -15
  514. package/src/cache/core/primitives/$cache.ts +7 -10
  515. package/src/cache/database/entities/cacheEntries.ts +16 -27
  516. package/src/cache/database/providers/DatabaseCacheProvider.ts +15 -13
  517. package/src/cache/redis/providers/RedisCacheProvider.ts +6 -6
  518. package/src/captcha/providers/TurnstileCaptchaProvider.ts +4 -4
  519. package/src/cli/core/__tests__/BuildCloudflareTask.spec.ts +178 -0
  520. package/src/cli/core/__tests__/BuildDockerTask.spec.ts +0 -2
  521. package/src/cli/core/__tests__/DbCommand.spec.ts +108 -0
  522. package/src/cli/core/atoms/appEntryOptions.ts +5 -5
  523. package/src/cli/core/atoms/buildOptions.ts +76 -88
  524. package/src/cli/core/atoms/changelogOptions.ts +3 -3
  525. package/src/cli/core/atoms/devOptions.ts +3 -3
  526. package/src/cli/core/commands/build.ts +36 -49
  527. package/src/cli/core/commands/db.ts +171 -83
  528. package/src/cli/core/commands/dev.ts +8 -8
  529. package/src/cli/core/commands/gen/changelog.ts +12 -14
  530. package/src/cli/core/commands/gen/env.ts +6 -6
  531. package/src/cli/core/commands/gen/openapi.ts +6 -6
  532. package/src/cli/core/commands/init.ts +28 -33
  533. package/src/cli/core/commands/pack.ts +10 -10
  534. package/src/cli/core/commands/root.ts +7 -8
  535. package/src/cli/core/commands/test.ts +17 -20
  536. package/src/cli/core/index.ts +0 -3
  537. package/src/cli/core/tasks/BuildCloudflareTask.ts +138 -245
  538. package/src/cli/core/tasks/BuildPrerenderTask.ts +44 -7
  539. package/src/cli/core/templates/apiHelloResponseSchemaTs.ts +4 -4
  540. package/src/cli/devtools/atoms/devtoolsOptions.ts +6 -6
  541. package/src/cli/i18n/__tests__/I18nCheckService.spec.ts +48 -0
  542. package/src/cli/i18n/atoms/i18nOptions.ts +8 -8
  543. package/src/cli/i18n/services/I18nCheckService.ts +65 -11
  544. package/src/cli/platform/commands/SecretsCommand.ts +24 -25
  545. package/src/cli/platform/commands/platform.ts +40 -46
  546. package/src/cli/platform/index.ts +1 -1
  547. package/src/cli/platform-lib/__tests__/CloudflareAdapter.spec.ts +0 -4
  548. package/src/cli/platform-lib/__tests__/PlatformInspector.spec.ts +10 -3
  549. package/src/cli/platform-lib/__tests__/VercelAdapter.spec.ts +0 -2
  550. package/src/cli/platform-lib/adapters/CloudflareAdapter.ts +141 -50
  551. package/src/cli/platform-lib/adapters/VercelAdapter.ts +6 -11
  552. package/src/cli/platform-lib/atoms/platformOptions.ts +46 -25
  553. package/src/cli/platform-lib/schemas/cloudflare.ts +87 -87
  554. package/src/cli/platform-lib/schemas/platform.ts +51 -51
  555. package/src/cli/platform-lib/schemas/vercel.ts +28 -28
  556. package/src/cli/platform-lib/services/CloudflareApi.ts +5 -5
  557. package/src/cli/platform-lib/services/VercelApi.ts +4 -4
  558. package/src/cli/platform-lib/services/VercelCli.ts +6 -15
  559. package/src/cli/platform-lib/services/WranglerApi.ts +6 -15
  560. package/src/cli/vendor/atoms/vendorOptions.ts +9 -9
  561. package/src/cli/vendor/commands/VendorCommand.ts +11 -12
  562. package/src/command/__tests__/$command.spec.ts +82 -83
  563. package/src/command/__tests__/Asker.spec.ts +6 -13
  564. package/src/command/__tests__/CliProvider.spec.ts +136 -149
  565. package/src/command/__tests__/Runner.spec.ts +86 -110
  566. package/src/command/helpers/Asker.ts +23 -58
  567. package/src/command/helpers/Runner.ts +34 -110
  568. package/src/command/index.ts +4 -9
  569. package/src/command/primitives/$command.ts +10 -10
  570. package/src/command/providers/CliProvider.ts +183 -161
  571. package/src/core/Alepha.ts +62 -13
  572. package/src/core/__tests__/$atom.spec.ts +52 -3
  573. package/src/core/__tests__/$computed.spec.ts +129 -0
  574. package/src/core/__tests__/$env.spec.ts +13 -13
  575. package/src/core/__tests__/$inject.spec.ts +4 -4
  576. package/src/core/__tests__/$module.spec.ts +1 -1
  577. package/src/core/__tests__/Alepha-graph.spec.ts +1 -1
  578. package/src/core/__tests__/Alepha-parseEnv.spec.ts +32 -32
  579. package/src/core/__tests__/Alepha-start.spec.ts +3 -3
  580. package/src/core/__tests__/CodecManager.spec.ts +113 -94
  581. package/src/core/__tests__/KeylessJsonSchemaCodec.spec.ts +138 -138
  582. package/src/core/__tests__/SchemaValidator.spec.ts +43 -44
  583. package/src/core/__tests__/StateManager.persist.browser.spec.ts +87 -0
  584. package/src/core/__tests__/StateManager.spec.ts +423 -0
  585. package/src/core/__tests__/TypeBox-usecases.spec.ts +8 -8
  586. package/src/core/__tests__/TypeProvider.spec.ts +314 -309
  587. package/src/core/__tests__/dump.spec.ts +6 -6
  588. package/src/core/__tests__/pagination.spec.ts +4 -4
  589. package/src/core/__tests__/scoped-after-start.spec.ts +43 -0
  590. package/src/core/errors/TypeBoxError.ts +10 -4
  591. package/src/core/helpers/FileLike.ts +5 -5
  592. package/src/core/helpers/coerceStrings.ts +70 -0
  593. package/src/core/helpers/jsonSchemaToZod.ts +112 -0
  594. package/src/core/index.shared.ts +4 -1
  595. package/src/core/primitives/$atom.ts +95 -27
  596. package/src/core/primitives/$computed.ts +148 -0
  597. package/src/core/primitives/$env.ts +5 -5
  598. package/src/core/primitives/$state.ts +1 -1
  599. package/src/core/providers/AlsProvider.ts +26 -0
  600. package/src/core/providers/CodecManager.ts +1 -2
  601. package/src/core/providers/JsonSchemaCodec.ts +1 -2
  602. package/src/core/providers/KeylessJsonSchemaCodec.ts +82 -57
  603. package/src/core/providers/SchemaValidator.ts +48 -158
  604. package/src/core/providers/StateManager.ts +383 -9
  605. package/src/core/providers/TypeProvider.ts +80 -734
  606. package/src/core/providers/ZodProvider.ts +380 -0
  607. package/src/core/providers/zodAugment.ts +69 -0
  608. package/src/core/schemas/pageQuerySchema.ts +19 -21
  609. package/src/core/schemas/pageSchema.ts +47 -57
  610. package/src/crypto/__tests__/SecretProvider.spec.ts +31 -0
  611. package/src/crypto/providers/SecretProvider.ts +16 -10
  612. package/src/datetime/primitives/$throttle.ts +6 -1
  613. package/src/email/brevo/providers/BrevoEmailProvider.ts +4 -4
  614. package/src/email/cloudflare/providers/CloudflareEmailProvider.ts +6 -6
  615. package/src/email/core/index.ts +7 -2
  616. package/src/email/core/primitives/$email.ts +5 -1
  617. package/src/email/core/providers/LocalEmailProvider.ts +5 -5
  618. package/src/email/smtp/providers/NodemailerEmailProvider.ts +41 -52
  619. package/src/fake/__tests__/FakeProvider.spec.ts +110 -110
  620. package/src/fake/__tests__/keyName.example.ts +21 -21
  621. package/src/fake/__tests__/keyName.spec.ts +41 -41
  622. package/src/fake/__tests__/module.example.ts +8 -8
  623. package/src/fake/providers/FakeProvider.ts +122 -121
  624. package/src/lock/core/__tests__/lock-mutual-exclusion.spec.ts +44 -0
  625. package/src/lock/core/index.ts +1 -0
  626. package/src/lock/core/primitives/$lock.ts +13 -6
  627. package/src/logger/__tests__/CliFormatterProvider.spec.ts +76 -0
  628. package/src/logger/__tests__/Logger.spec.ts +49 -0
  629. package/src/logger/index.ts +25 -18
  630. package/src/logger/providers/CliFormatterProvider.ts +75 -0
  631. package/src/logger/schemas/logEntrySchema.ts +10 -10
  632. package/src/logger/services/Logger.ts +18 -0
  633. package/src/mcp/__tests__/$prompt.spec.ts +21 -23
  634. package/src/mcp/__tests__/$tool.spec.ts +22 -22
  635. package/src/mcp/__tests__/McpServerProvider.spec.ts +82 -11
  636. package/src/mcp/__tests__/StreamableHttpMcpTransport.spec.ts +2 -2
  637. package/src/mcp/__tests__/integration.spec.ts +33 -33
  638. package/src/mcp/primitives/$prompt.ts +11 -9
  639. package/src/mcp/primitives/$tool.ts +27 -86
  640. package/src/mcp/providers/McpServerProvider.ts +55 -0
  641. package/src/mcp/transports/StreamableHttpMcpTransport.ts +7 -7
  642. package/src/orm/__tests__/$repository-tests.ts +133 -27
  643. package/src/orm/__tests__/$repository.spec.ts +23 -0
  644. package/src/orm/__tests__/$transactional-tests.ts +4 -4
  645. package/src/orm/__tests__/ModelBuilder-tests.ts +28 -28
  646. package/src/orm/__tests__/ModelBuilder.spec.ts +124 -106
  647. package/src/orm/__tests__/QueryManager.spec.ts +5 -5
  648. package/src/orm/__tests__/delete-returning-tests.ts +11 -11
  649. package/src/orm/__tests__/deletedAt-tests.ts +3 -3
  650. package/src/orm/__tests__/enums.spec.ts +29 -25
  651. package/src/orm/__tests__/execute-tests.ts +8 -8
  652. package/src/orm/__tests__/fixtures/bigEntitySchema.ts +48 -48
  653. package/src/orm/__tests__/fixtures/userEntitySchema.ts +6 -6
  654. package/src/orm/__tests__/joins-tests.ts +30 -30
  655. package/src/orm/__tests__/organization-tests.ts +105 -3
  656. package/src/orm/__tests__/organization.spec.ts +46 -0
  657. package/src/orm/__tests__/orm-errors.spec.ts +10 -10
  658. package/src/orm/__tests__/orm-next-tests.ts +29 -29
  659. package/src/orm/__tests__/orm-showcase-tests.ts +9 -9
  660. package/src/orm/__tests__/primaryKey.spec.ts +4 -4
  661. package/src/orm/__tests__/query-date-encoding-tests.ts +17 -17
  662. package/src/orm/__tests__/ref-auto-onDelete.spec.ts +14 -14
  663. package/src/orm/__tests__/references.spec.ts +7 -7
  664. package/src/orm/__tests__/security.spec.ts +17 -17
  665. package/src/orm/__tests__/string-operators-tests.ts +5 -5
  666. package/src/orm/__tests__/timestamps-tests.ts +14 -14
  667. package/src/orm/__tests__/validation-tests.ts +5 -5
  668. package/src/orm/core/__tests__/BunSqliteProvider.bun.spec.ts +8 -8
  669. package/src/orm/core/constants/PG_SYMBOLS.ts +13 -1
  670. package/src/orm/core/entities/alephaSequences.ts +8 -8
  671. package/src/orm/core/helpers/pgAttr.ts +4 -4
  672. package/src/orm/core/primitives/$entity.ts +10 -6
  673. package/src/orm/core/providers/DatabaseTypeProvider.ts +46 -53
  674. package/src/orm/core/providers/drivers/BunSqliteProvider.ts +8 -8
  675. package/src/orm/core/providers/drivers/CloudflareD1Provider.ts +3 -5
  676. package/src/orm/core/providers/drivers/NodeSqliteProvider.ts +8 -8
  677. package/src/orm/core/schemas/databaseEnvSchema.ts +4 -4
  678. package/src/orm/core/schemas/insertSchema.ts +14 -18
  679. package/src/orm/core/schemas/legacyIdSchema.ts +2 -2
  680. package/src/orm/core/schemas/updateSchema.ts +10 -16
  681. package/src/orm/core/services/PgRelationManager.ts +2 -2
  682. package/src/orm/core/services/QueryManager.ts +13 -2
  683. package/src/orm/core/services/Repository.ts +88 -33
  684. package/src/orm/core/services/SqliteModelBuilder.ts +38 -45
  685. package/src/orm/postgres/__tests__/BunPostgresProvider.bun.spec.ts +4 -4
  686. package/src/orm/postgres/providers/CloudflareHyperdriveProvider.ts +4 -6
  687. package/src/orm/postgres/schemas/postgresEnvSchema.ts +6 -6
  688. package/src/orm/postgres/services/PostgresModelBuilder.ts +127 -114
  689. package/src/queue/core/__tests__/$consumer.spec.ts +4 -4
  690. package/src/queue/core/__tests__/WorkerProvider.spec.ts +4 -4
  691. package/src/queue/core/__tests__/shared.ts +6 -6
  692. package/src/queue/core/primitives/$consumer.ts +5 -5
  693. package/src/queue/core/primitives/$queue.ts +44 -61
  694. package/src/queue/core/providers/CloudflareQueueProvider.ts +6 -0
  695. package/src/queue/core/providers/WorkerProvider.ts +17 -14
  696. package/src/queue/redis/providers/RedisQueueProvider.ts +3 -3
  697. package/src/react/core/__tests__/ErrorBoundary.browser.spec.tsx +92 -0
  698. package/src/react/core/__tests__/Router.spec.tsx +4 -4
  699. package/src/react/core/__tests__/useComputed.browser.spec.tsx +192 -0
  700. package/src/react/core/__tests__/useQuery.browser.spec.tsx +48 -0
  701. package/src/react/core/__tests__/useSelector.browser.spec.tsx +105 -0
  702. package/src/react/core/__tests__/useStore.browser.spec.tsx +113 -0
  703. package/src/react/core/components/ErrorBoundary.tsx +42 -0
  704. package/src/react/core/hooks/useAction.ts +56 -19
  705. package/src/react/core/hooks/useComputed.ts +91 -0
  706. package/src/react/core/hooks/useSelector.ts +67 -0
  707. package/src/react/core/hooks/useStore.ts +36 -17
  708. package/src/react/core/index.ts +3 -0
  709. package/src/react/core/utils/shallowEqual.ts +36 -0
  710. package/src/react/form/__tests__/FormModel-submit-loading.spec.ts +71 -0
  711. package/src/react/form/__tests__/form-submitting-reactive.browser.spec.tsx +96 -0
  712. package/src/react/form/__tests__/useForm.browser.spec.tsx +54 -54
  713. package/src/react/form/errors/FormValidationError.ts +0 -2
  714. package/src/react/form/hooks/useForm.ts +19 -4
  715. package/src/react/form/hooks/useFormQuerySync.ts +0 -0
  716. package/src/react/form/services/FormModel.ts +124 -86
  717. package/src/react/form/services/parseField.ts +66 -27
  718. package/src/react/i18n/__tests__/I18nProvider.spec.ts +89 -0
  719. package/src/react/i18n/__tests__/Localize.spec.tsx +1 -1
  720. package/src/react/i18n/__tests__/locale-routing.spec.ts +107 -0
  721. package/src/react/i18n/providers/I18nProvider.ts +173 -14
  722. package/src/react/router/__tests__/$page.browser.spec.tsx +19 -19
  723. package/src/react/router/__tests__/$page.spec.tsx +21 -21
  724. package/src/react/router/__tests__/ReactBrowserProvider.browser.spec.ts +87 -1
  725. package/src/react/router/__tests__/RouterLocaleProvider.spec.ts +127 -0
  726. package/src/react/router/atoms/ssrManifestAtom.ts +16 -16
  727. package/src/react/router/components/NestedView.tsx +11 -3
  728. package/src/react/router/hooks/useQueryParams.ts +1 -1
  729. package/src/react/router/index.browser.ts +4 -0
  730. package/src/react/router/index.shared.ts +1 -0
  731. package/src/react/router/index.ts +9 -0
  732. package/src/react/router/primitives/$page.ts +2 -2
  733. package/src/react/router/providers/ReactBrowserProvider.ts +64 -13
  734. package/src/react/router/providers/ReactBrowserRouterProvider.ts +15 -1
  735. package/src/react/router/providers/ReactPageProvider.ts +38 -13
  736. package/src/react/router/providers/ReactServerProvider.ts +105 -16
  737. package/src/react/router/providers/RootComponentsProvider.ts +13 -0
  738. package/src/react/router/providers/RouterLocaleProvider.ts +125 -0
  739. package/src/react/router/providers/__tests__/RootComponentsProvider.spec.ts +15 -0
  740. package/src/react/router/providers/__tests__/rootComponents.ssr.browser.spec.tsx +67 -0
  741. package/src/react/sitemap/__tests__/$sitemap.spec.ts +131 -0
  742. package/src/react/sitemap/index.browser.ts +21 -0
  743. package/src/react/sitemap/index.ts +25 -0
  744. package/src/react/sitemap/primitives/$sitemap.browser.ts +26 -0
  745. package/src/react/sitemap/primitives/$sitemap.ts +196 -0
  746. package/src/react/ui/atoms/uiAtom.ts +6 -6
  747. package/src/react/ui/atoms/uiThemeListAtom.ts +7 -7
  748. package/src/react/ui/hooks/useColorMode.ts +11 -4
  749. package/src/react/ui/services/SchemaControl.ts +4 -4
  750. package/src/redis/providers/BunRedisProvider.ts +19 -11
  751. package/src/redis/providers/NodeRedisProvider.ts +3 -3
  752. package/src/scheduler/primitives/$scheduler.ts +21 -8
  753. package/src/security/__tests__/assertRealmScope.spec.ts +29 -0
  754. package/src/security/atoms/currentTenantAtom.ts +6 -6
  755. package/src/security/atoms/currentUserAtom.ts +2 -2
  756. package/src/security/primitives/$issuer.ts +24 -2
  757. package/src/security/providers/JwtProvider.ts +100 -0
  758. package/src/security/providers/SecurityProvider.ts +43 -2
  759. package/src/security/schemas/permissionSchema.ts +19 -19
  760. package/src/security/schemas/roleSchema.ts +22 -28
  761. package/src/security/schemas/userAccountInfoSchema.ts +47 -37
  762. package/src/server/auth/__tests__/appleClientSecret.spec.ts +34 -0
  763. package/src/server/auth/__tests__/federationRedirectReplay.spec.ts +44 -0
  764. package/src/server/auth/helpers/appleClientSecret.ts +24 -0
  765. package/src/server/auth/helpers/jtiReplayGuard.ts +41 -0
  766. package/src/server/auth/helpers/safeRedirectPath.ts +19 -0
  767. package/src/server/auth/index.ts +1 -0
  768. package/src/server/auth/primitives/$auth.ts +6 -6
  769. package/src/server/auth/primitives/$authApple.ts +10 -10
  770. package/src/server/auth/primitives/$authFacebook.ts +10 -10
  771. package/src/server/auth/primitives/$authFranceConnect.ts +10 -10
  772. package/src/server/auth/primitives/$authGithub.ts +10 -10
  773. package/src/server/auth/primitives/$authGoogle.ts +10 -10
  774. package/src/server/auth/primitives/$authMicrosoft.ts +14 -14
  775. package/src/server/auth/providers/ServerAuthProvider.ts +67 -52
  776. package/src/server/auth/schemas/authenticationProviderSchema.ts +9 -12
  777. package/src/server/auth/schemas/tokenResponseSchema.ts +2 -2
  778. package/src/server/auth/schemas/tokensSchema.ts +16 -16
  779. package/src/server/auth/schemas/userinfoResponseSchema.ts +3 -3
  780. package/src/server/cookies/__tests__/AtomCookieBinding.spec.ts +80 -0
  781. package/src/server/cookies/__tests__/AtomCookiePersistence.browser.spec.ts +169 -0
  782. package/src/server/cookies/__tests__/AtomCookiePersistence.spec.ts +294 -0
  783. package/src/server/cookies/__tests__/ServerCookiesProvider.spec.ts +82 -12
  784. package/src/server/cookies/index.browser.ts +4 -1
  785. package/src/server/cookies/index.ts +8 -1
  786. package/src/server/cookies/primitives/$cookie.browser.ts +1 -1
  787. package/src/server/cookies/primitives/$cookie.ts +16 -0
  788. package/src/server/cookies/providers/AtomCookiePersistence.browser.ts +133 -0
  789. package/src/server/cookies/providers/AtomCookiePersistence.ts +148 -0
  790. package/src/server/cookies/providers/ServerCookiesProvider.ts +32 -4
  791. package/src/server/cookies/services/CookieParser.ts +6 -1
  792. package/src/server/core/__tests__/$action.spec.ts +13 -13
  793. package/src/server/core/__tests__/$middleware.spec.ts +10 -10
  794. package/src/server/core/__tests__/$route.spec.ts +9 -9
  795. package/src/server/core/__tests__/$sse.spec.ts +26 -26
  796. package/src/server/core/__tests__/BunHttpServerProvider.bun.spec.ts +6 -6
  797. package/src/server/core/__tests__/HttpClient.spec.ts +2 -2
  798. package/src/server/core/__tests__/NodeHttpServerProvider.spec.ts +15 -3
  799. package/src/server/core/__tests__/ServerBodyParserProvider.spec.ts +14 -14
  800. package/src/server/core/__tests__/ServerMultipartProvider.spec.ts +33 -33
  801. package/src/server/core/__tests__/ServerRouterProvider-errorHandler.spec.ts +5 -1
  802. package/src/server/core/__tests__/ServerRouterProvider-getRoutes.spec.ts +25 -25
  803. package/src/server/core/__tests__/ServerRouterProvider-serializationError.spec.ts +9 -5
  804. package/src/server/core/__tests__/ServerRouterProvider-validationError.spec.ts +56 -24
  805. package/src/server/core/errors/ValidationError.ts +6 -3
  806. package/src/server/core/helpers/isMultipart.ts +2 -1
  807. package/src/server/core/index.ts +5 -2
  808. package/src/server/core/interfaces/ServerRequest.ts +14 -14
  809. package/src/server/core/primitives/$action.ts +26 -36
  810. package/src/server/core/primitives/$route.ts +27 -0
  811. package/src/server/core/primitives/$sse.ts +3 -3
  812. package/src/server/core/providers/BunHttpServerProvider.ts +8 -9
  813. package/src/server/core/providers/NodeHttpServerProvider.ts +8 -9
  814. package/src/server/core/providers/ServerBodyParserProvider.ts +20 -12
  815. package/src/server/core/providers/ServerCompressProvider.ts +9 -10
  816. package/src/server/core/providers/ServerHelmetProvider.ts +26 -27
  817. package/src/server/core/providers/ServerMultipartProvider.ts +19 -19
  818. package/src/server/core/providers/ServerRouterProvider.ts +44 -15
  819. package/src/server/core/schemas/errorSchema.ts +20 -25
  820. package/src/server/core/schemas/okSchema.ts +9 -14
  821. package/src/server/core/services/HttpClient.ts +13 -1
  822. package/src/server/core/services/ServerRequestParser.ts +6 -6
  823. package/src/server/cors/providers/ServerCorsProvider.ts +26 -28
  824. package/src/server/health/schemas/healthSchema.ts +6 -6
  825. package/src/server/links/__tests__/$remote.spec.ts +3 -3
  826. package/src/server/links/__tests__/BatchEndpoint.spec.ts +9 -9
  827. package/src/server/links/__tests__/LinkProvider.spec.ts +9 -9
  828. package/src/server/links/__tests__/ServerLinksProvider.spec.ts +23 -23
  829. package/src/server/links/__tests__/fixtures/CrudApp.ts +21 -21
  830. package/src/server/links/atoms/apiLinksAtom.ts +2 -2
  831. package/src/server/links/atoms/linkOptionsAtom.ts +6 -6
  832. package/src/server/links/primitives/$remote.ts +3 -3
  833. package/src/server/links/providers/LinkProvider.ts +3 -3
  834. package/src/server/links/providers/ServerLinksProvider.ts +20 -20
  835. package/src/server/links/schemas/apiLinksResponseSchema.ts +23 -23
  836. package/src/server/proxy/__tests__/$proxy.spec.ts +9 -9
  837. package/src/server/proxy/providers/ServerProxyProvider.ts +5 -0
  838. package/src/server/rate-limit/providers/ServerRateLimitProvider.ts +18 -20
  839. package/src/server/swagger/__tests__/$swagger.spec.ts +91 -94
  840. package/src/server/swagger/__tests__/ui.spec.ts +3 -3
  841. package/src/server/swagger/providers/ServerSwaggerProvider.ts +66 -43
  842. package/src/system/__tests__/NodeShellProvider.spec.ts +46 -0
  843. package/src/system/providers/NodeShellProvider.ts +4 -1
  844. package/src/topic/core/__tests__/$subscriber.spec.ts +4 -4
  845. package/src/topic/core/__tests__/shared.ts +8 -8
  846. package/src/topic/core/primitives/$subscriber.ts +5 -5
  847. package/src/topic/core/primitives/$topic.ts +14 -14
  848. package/src/topic/redis/providers/RedisTopicProvider.ts +3 -3
  849. package/dist/container/core/index.d.ts +0 -236
  850. package/dist/container/core/index.d.ts.map +0 -1
  851. package/dist/container/core/index.js +0 -231
  852. package/dist/container/core/index.js.map +0 -1
  853. package/dist/container/core/index.workerd.js +0 -192
  854. package/dist/container/core/index.workerd.js.map +0 -1
  855. package/src/cli/core/tasks/BuildSitemapTask.ts +0 -130
  856. package/src/command/helpers/PrettyAsker.ts +0 -256
  857. package/src/command/helpers/PrettyPrint.ts +0 -332
  858. package/src/container/core/__tests__/$container.spec.ts +0 -83
  859. package/src/container/core/index.ts +0 -50
  860. package/src/container/core/index.workerd.ts +0 -53
  861. package/src/container/core/interfaces/ContainerOptions.ts +0 -69
  862. package/src/container/core/primitives/$container.ts +0 -100
  863. package/src/container/core/providers/CloudflareContainerProvider.ts +0 -70
  864. package/src/container/core/providers/ContainerProvider.ts +0 -92
  865. package/src/container/core/providers/MockContainerProvider.ts +0 -62
  866. package/src/container/core/providers/NodeContainerProvider.ts +0 -53
  867. package/src/core/__tests__/jsonSchemaToTypeBox.spec.ts +0 -771
  868. package/src/core/helpers/jsonSchemaToTypeBox.ts +0 -359
  869. /package/dist/orm/core/{chunk-B4FMCO8f.js → rolldown-runtime-B4FMCO8f.js} +0 -0
@@ -2,7 +2,6 @@ import { Static } from "alepha";
2
2
  import { PackageManagerUtils } from "alepha/cli";
3
3
  import { ConsoleColorProvider } from "alepha/logger";
4
4
  import { FileSystemProvider, ShellProvider } from "alepha/system";
5
-
6
5
  //#region ../../src/cli/vendor/atoms/vendorOptions.d.ts
7
6
  /**
8
7
  * Vendor configuration atom.
@@ -10,35 +9,12 @@ import { FileSystemProvider, ShellProvider } from "alepha/system";
10
9
  * Filled from the `vendor` section of `alepha.config.ts`.
11
10
  * Read by `VendorCommand` to resolve remote, branch, and packages.
12
11
  */
13
- declare const vendorOptions: import("alepha").Atom<import("typebox").TOptional<import("typebox").TObject<{
14
- /**
15
- * Git remote URL.
16
- *
17
- * @default "git@github.com:feunard/alepha.git"
18
- */
19
- remote: import("typebox").TOptional<import("typebox").TString>;
20
- /**
21
- * Branch to sync from.
22
- *
23
- * @default "main"
24
- */
25
- branch: import("typebox").TOptional<import("typebox").TString>;
26
- /**
27
- * Parent directory holding the vendored packages in the local project.
28
- * Relative to the project root. Also where the `vendor.json` lock file
29
- * is written. The remote is always expected to lay its packages out
30
- * under `packages/`.
31
- *
32
- * @default ".vendor"
33
- */
34
- dir: import("typebox").TOptional<import("typebox").TString>;
35
- /**
36
- * Package directory names under `dir` to sync.
37
- *
38
- * @example ["alepha", "@alepha/payments-stripe"]
39
- */
40
- packages: import("typebox").TArray<import("typebox").TString>;
41
- }>>, "alepha.cli.vendor.options">;
12
+ declare const vendorOptions: import("alepha").Atom<import("zod").ZodOptional<import("zod").ZodObject<{
13
+ remote: import("zod").ZodOptional<import("zod").ZodString>;
14
+ branch: import("zod").ZodOptional<import("zod").ZodString>;
15
+ dir: import("zod").ZodOptional<import("zod").ZodString>;
16
+ packages: import("zod").ZodArray<import("zod").ZodString>;
17
+ }, import("zod/v4/core").$strip>>, "alepha.cli.vendor.options">;
42
18
  /**
43
19
  * Type for vendor options.
44
20
  */
@@ -210,7 +186,7 @@ declare class VendorCommand {
210
186
  branch?: string | undefined;
211
187
  dir?: string | undefined;
212
188
  packages: string[];
213
- }>;
189
+ } | undefined>;
214
190
  protected readonly vendorService: VendorService;
215
191
  protected readonly color: ConsoleColorProvider;
216
192
  protected readonly pm: PackageManagerUtils;
@@ -223,17 +199,17 @@ declare class VendorCommand {
223
199
  dir: string;
224
200
  packages: string[];
225
201
  };
226
- protected readonly syncFlags: import("typebox").TObject<{
227
- force: import("typebox").TOptional<import("typebox").TBoolean>;
228
- remote: import("typebox").TOptional<import("typebox").TString>;
229
- }>;
230
- protected readonly sync: import("alepha/command").CommandPrimitive<import("typebox").TObject<{
231
- force: import("typebox").TOptional<import("typebox").TBoolean>;
232
- remote: import("typebox").TOptional<import("typebox").TString>;
233
- }>, import("typebox").TSchema, import("typebox").TObject<import("typebox").TProperties>>;
234
- protected readonly diff: import("alepha/command").CommandPrimitive<import("typebox").TObject<import("typebox").TProperties>, import("typebox").TSchema, import("typebox").TObject<import("typebox").TProperties>>;
202
+ protected readonly syncFlags: import("zod").ZodObject<{
203
+ force: import("zod").ZodOptional<import("zod").ZodBoolean>;
204
+ remote: import("zod").ZodOptional<import("zod").ZodString>;
205
+ }, import("zod/v4/core").$strip>;
206
+ protected readonly sync: import("alepha/command").CommandPrimitive<import("zod").ZodObject<{
207
+ force: import("zod").ZodOptional<import("zod").ZodBoolean>;
208
+ remote: import("zod").ZodOptional<import("zod").ZodString>;
209
+ }, import("zod/v4/core").$strip>, import("alepha").ZType, import("alepha").TObject>;
210
+ protected readonly diff: import("alepha/command").CommandPrimitive<import("alepha").TObject, import("alepha").ZType, import("alepha").TObject>;
235
211
  protected printPackageDiff(pkg: VendorPackageDiff): void;
236
- readonly vendor: import("alepha/command").CommandPrimitive<import("typebox").TObject<import("typebox").TProperties>, import("typebox").TSchema, import("typebox").TObject<import("typebox").TProperties>>;
212
+ readonly vendor: import("alepha/command").CommandPrimitive<import("alepha").TObject, import("alepha").ZType, import("alepha").TObject>;
237
213
  }
238
214
  //#endregion
239
215
  //#region ../../src/cli/vendor/index.d.ts
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/cli/vendor/atoms/vendorOptions.ts","../../../src/cli/vendor/services/VendorService.ts","../../../src/cli/vendor/commands/VendorCommand.ts","../../../src/cli/vendor/index.ts"],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/cli/vendor/atoms/vendorOptions.ts","../../../src/cli/vendor/services/VendorService.ts","../../../src/cli/vendor/commands/VendorCommand.ts","../../../src/cli/vendor/index.ts"],"mappings":";;;;;;;;;;;cAQa,gCAAa,mBAAA,0BAAA;;;;;;;;;KA0Cd,gBAAgB,cAAc,cAAc;;;;;;UCpCvC;EACf;EACA;EACA;EACA;EACA;EACA;;;;;UAMe;EACf;EACA;EACA,UAAU;;;;;UAMK;EACf;EACA;EACA;EACA;EACA;;;;;UAMe;EACf;EACA;EACA;;;;;UAMe;EACf;EACA,SAAS;;;;;UAMM;EACf;EACA;EACA,UAAU;EACV;;;;;UAMe;EACf,UAAU;EACV;;;;;;UAOe;;;;;;EAMf;;;;EAIA;;;;;cAMW;qBACQ,6BAAG;qBACH,OAAK;qBACL,IAAE;;;;;;;;;;EAWf,KAAK,SAAS,oBAAoB,QAAQ;;;;;;;EAyE1C,KAAK,SAAS,oBAAoB,QAAQ;;;;YA0BhC,cACd,cACA,gBACA,aACA,qBACC,QAAQ;;;;YA6DK,mBAAmB,iBAAiB;;;;YAuCpC,YAAY,gBAAgB,iBAAiB;;;;YAuB7C,cACd,gBACA,iBACC;;;;YAyBa,cAAc,kBAAkB;;;;YAUhC,SACd,cACA,cACC,QAAQ;;;;YAaK,UACd,cACA,aACA,MAAM,aACL;;;;qBAYgB;;;;YAUT,UAAU;;;;YAqBJ,gBACd,kBACA,oBACC;IACD;IACA,UAAU;IACV;;;;;;;;YA0DQ,gBAAgB,kBAAkB,gBAAgB;;;;YAuClD,yBAAyB,aAAa;;;;cC5gBrC;qBACQ,6BAAG;qBACH,SAAO;;;;;;qBACP,eAAa;qBACb,OAAK;qBACL,IAAE;;;;YAKX;IAON;IACA;IACA;IACA;;qBAQe,yBAAS;;;;qBAcT,+BAAI,+BAAA;;;;qBAsEJ,+BAAI,kCAAA,0BAAA,wBAAA;YAwCb,iBAAiB,KAAK;WAsChB,iCAAM,kCAAA,0BAAA,wBAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cChLX,wCAAqB,yBAAA;cAMrB,SAAM,SAAa"}
@@ -1,4 +1,4 @@
1
- import { $atom, $context, $inject, $module, $state, AlephaError, t } from "alepha";
1
+ import { $atom, $context, $inject, $module, $state, AlephaError, z } from "alepha";
2
2
  import { PackageManagerUtils } from "alepha/cli";
3
3
  import { $command } from "alepha/command";
4
4
  import { $logger, ConsoleColorProvider } from "alepha/logger";
@@ -13,19 +13,19 @@ import { FileSystemProvider, ShellProvider } from "alepha/system";
13
13
  const vendorOptions = $atom({
14
14
  name: "alepha.cli.vendor.options",
15
15
  description: "Vendor synchronization configuration",
16
- schema: t.optional(t.object({
16
+ schema: z.object({
17
17
  /**
18
18
  * Git remote URL.
19
19
  *
20
20
  * @default "git@github.com:feunard/alepha.git"
21
21
  */
22
- remote: t.optional(t.text()),
22
+ remote: z.text().optional(),
23
23
  /**
24
24
  * Branch to sync from.
25
25
  *
26
26
  * @default "main"
27
27
  */
28
- branch: t.optional(t.text()),
28
+ branch: z.text().optional(),
29
29
  /**
30
30
  * Parent directory holding the vendored packages in the local project.
31
31
  * Relative to the project root. Also where the `vendor.json` lock file
@@ -34,14 +34,14 @@ const vendorOptions = $atom({
34
34
  *
35
35
  * @default ".vendor"
36
36
  */
37
- dir: t.optional(t.text()),
37
+ dir: z.text().optional(),
38
38
  /**
39
39
  * Package directory names under `dir` to sync.
40
40
  *
41
41
  * @example ["alepha", "@alepha/payments-stripe"]
42
42
  */
43
- packages: t.array(t.text())
44
- }))
43
+ packages: z.array(z.text())
44
+ }).optional()
45
45
  });
46
46
  //#endregion
47
47
  //#region ../../src/cli/vendor/services/VendorService.ts
@@ -412,12 +412,9 @@ var VendorCommand = class {
412
412
  packages: this.options.packages
413
413
  };
414
414
  }
415
- syncFlags = t.object({
416
- force: t.optional(t.boolean({
417
- aliases: ["f"],
418
- description: "Skip local modification check"
419
- })),
420
- remote: t.optional(t.text({ description: "Override the configured remote for this invocation. Accepts any git-clone URL, including local paths (`file:///abs/path/to/alepha`). Useful for CI canaries that need to sync against a local checkout instead of the published repo." }))
415
+ syncFlags = z.object({
416
+ force: z.boolean().meta({ aliases: ["f"] }).describe("Skip local modification check").optional(),
417
+ remote: z.text({ description: "Override the configured remote for this invocation. Accepts any git-clone URL, including local paths (`file:///abs/path/to/alepha`). Useful for CI canaries that need to sync against a local checkout instead of the published repo." }).optional()
421
418
  });
422
419
  sync = $command({
423
420
  name: "sync",
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../src/cli/vendor/atoms/vendorOptions.ts","../../../src/cli/vendor/services/VendorService.ts","../../../src/cli/vendor/commands/VendorCommand.ts","../../../src/cli/vendor/index.ts"],"sourcesContent":["import { $atom, type Static, t } from \"alepha\";\n\n/**\n * Vendor configuration atom.\n *\n * Filled from the `vendor` section of `alepha.config.ts`.\n * Read by `VendorCommand` to resolve remote, branch, and packages.\n */\nexport const vendorOptions = $atom({\n name: \"alepha.cli.vendor.options\",\n description: \"Vendor synchronization configuration\",\n schema: t.optional(\n t.object({\n /**\n * Git remote URL.\n *\n * @default \"git@github.com:feunard/alepha.git\"\n */\n remote: t.optional(t.text()),\n\n /**\n * Branch to sync from.\n *\n * @default \"main\"\n */\n branch: t.optional(t.text()),\n\n /**\n * Parent directory holding the vendored packages in the local project.\n * Relative to the project root. Also where the `vendor.json` lock file\n * is written. The remote is always expected to lay its packages out\n * under `packages/`.\n *\n * @default \".vendor\"\n */\n dir: t.optional(t.text()),\n\n /**\n * Package directory names under `dir` to sync.\n *\n * @example [\"alepha\", \"@alepha/payments-stripe\"]\n */\n packages: t.array(t.text()),\n }),\n ),\n});\n\n/**\n * Type for vendor options.\n */\nexport type VendorOptions = Static<typeof vendorOptions.schema>;\n","import { $inject } from \"alepha\";\nimport { $logger } from \"alepha/logger\";\nimport { FileSystemProvider, ShellProvider } from \"alepha/system\";\n\n/**\n * Parent directory of vendored packages on the remote. Hardcoded because the\n * Alepha monorepo lays its packages out under `packages/` and the vendor\n * tool only targets that layout.\n */\nconst REMOTE_DIR = \"packages\";\n\n/**\n * Options for syncing vendored packages from a remote repository.\n */\nexport interface VendorSyncOptions {\n root: string;\n remote: string;\n branch: string;\n dir: string;\n packages: string[];\n force?: boolean;\n}\n\n/**\n * Result of a vendor sync operation.\n */\nexport interface VendorSyncResult {\n synced: string[];\n errors: string[];\n aborted?: VendorDiffResult;\n}\n\n/**\n * Options for diffing vendored packages against a remote repository.\n */\nexport interface VendorDiffOptions {\n root: string;\n remote: string;\n branch: string;\n dir: string;\n packages: string[];\n}\n\n/**\n * A single line change within a modified file.\n */\nexport interface VendorLineDiff {\n line: number;\n type: \"added\" | \"removed\";\n text: string;\n}\n\n/**\n * A modified file with its line-level changes.\n */\nexport interface VendorFileDiff {\n file: string;\n changes: VendorLineDiff[];\n}\n\n/**\n * Diff result for a single vendored package.\n */\nexport interface VendorPackageDiff {\n name: string;\n added: string[];\n modified: VendorFileDiff[];\n removed: string[];\n}\n\n/**\n * Result of a vendor diff operation.\n */\nexport interface VendorDiffResult {\n packages: VendorPackageDiff[];\n totalChanges: number;\n}\n\n/**\n * Shape of the `<dir>/vendor.json` lock file (where `<dir>` is the\n * configured vendor directory, defaulting to `.vendor`).\n */\nexport interface VendorLock {\n /**\n * Git remote URL the vendored sources were synced from. Recorded so any\n * downstream tool (AI agent, CI script) can re-fetch without needing the\n * project's `alepha.config.ts`.\n */\n remote: string;\n /**\n * Commit hash of the synced sources.\n */\n commit: string;\n}\n\n/**\n * Handles syncing and diffing vendored packages from a remote git repository.\n */\nexport class VendorService {\n protected readonly log = $logger();\n protected readonly shell = $inject(ShellProvider);\n protected readonly fs = $inject(FileSystemProvider);\n\n /**\n * Sync vendored packages from a remote repository.\n *\n * Without `force`: checks for local modifications by comparing the local\n * copy against the last-synced commit (stored in `<dir>/vendor.json`).\n * If modifications are found, aborts without touching local files.\n *\n * With `force` (or first sync): replaces local copies unconditionally.\n */\n async sync(options: VendorSyncOptions): Promise<VendorSyncResult> {\n const synced: string[] = [];\n const errors: string[] = [];\n\n if (!options.force) {\n const lock = await this.readLock(options.root, options.dir);\n\n if (lock) {\n let baselineDir: string | undefined;\n try {\n baselineDir = await this.cloneAtCommit(options.remote, lock.commit);\n const diffResult = await this.diffFromClone(\n options.root,\n baselineDir,\n options.dir,\n options.packages,\n );\n\n if (diffResult.totalChanges > 0) {\n return { synced: [], errors: [], aborted: diffResult };\n }\n } finally {\n if (baselineDir) {\n await this.fs.rm(baselineDir, { recursive: true, force: true });\n }\n }\n }\n }\n\n let tmpDir: string | undefined;\n\n try {\n tmpDir = await this.cloneRemote(options.remote, options.branch);\n\n for (const pkg of options.packages) {\n const remotePkgDir = this.fs.join(tmpDir, REMOTE_DIR, pkg);\n const localPkgDir = this.fs.join(options.root, options.dir, pkg);\n\n const remoteExists = await this.fs.exists(remotePkgDir);\n if (!remoteExists) {\n errors.push(`Package \"${pkg}\" not found in remote`);\n continue;\n }\n\n this.log.debug(`Syncing package: ${pkg}`);\n\n await this.fs.rm(localPkgDir, { recursive: true, force: true });\n await this.fs.cp(remotePkgDir, localPkgDir, { recursive: true });\n await this.removeIgnoredFiles(localPkgDir);\n\n synced.push(pkg);\n }\n\n const commit = await this.getCommitHash(tmpDir);\n await this.writeLock(options.root, options.dir, {\n remote: options.remote,\n commit,\n });\n } finally {\n if (tmpDir) {\n await this.fs.rm(tmpDir, { recursive: true, force: true });\n }\n }\n\n return { synced, errors };\n }\n\n /**\n * Diff vendored packages against the last-synced commit.\n *\n * Reads the commit hash from `<dir>/vendor.json`, clones at that commit,\n * and compares local files to detect modifications since last sync.\n */\n async diff(options: VendorDiffOptions): Promise<VendorDiffResult> {\n const lock = await this.readLock(options.root, options.dir);\n if (!lock) {\n return { packages: [], totalChanges: 0 };\n }\n\n let tmpDir: string | undefined;\n\n try {\n tmpDir = await this.cloneAtCommit(options.remote, lock.commit);\n return await this.diffFromClone(\n options.root,\n tmpDir,\n options.dir,\n options.packages,\n );\n } finally {\n if (tmpDir) {\n await this.fs.rm(tmpDir, { recursive: true, force: true });\n }\n }\n }\n\n /**\n * Diff local packages against an already-cloned remote.\n */\n protected async diffFromClone(\n root: string,\n tmpDir: string,\n dir: string,\n packages: string[],\n ): Promise<VendorDiffResult> {\n const results: VendorPackageDiff[] = [];\n let totalChanges = 0;\n\n for (const pkg of packages) {\n const remotePkgDir = this.fs.join(tmpDir, REMOTE_DIR, pkg);\n const localPkgDir = this.fs.join(root, dir, pkg);\n\n const remoteExists = await this.fs.exists(remotePkgDir);\n const localExists = await this.fs.exists(localPkgDir);\n\n if (!remoteExists && !localExists) {\n results.push({ name: pkg, added: [], modified: [], removed: [] });\n continue;\n }\n\n if (!remoteExists) {\n // No baseline = everything local was added by user\n const localFiles = await this.fs.ls(localPkgDir, { recursive: true });\n results.push({\n name: pkg,\n added: localFiles,\n modified: [],\n removed: [],\n });\n totalChanges += localFiles.length;\n continue;\n }\n\n if (!localExists) {\n // Baseline exists but local doesn't = user deleted everything\n const remoteFiles = await this.fs.ls(remotePkgDir, { recursive: true });\n results.push({\n name: pkg,\n added: [],\n modified: [],\n removed: remoteFiles,\n });\n totalChanges += remoteFiles.length;\n continue;\n }\n\n const result = await this.diffDirectories(localPkgDir, remotePkgDir);\n const pkgChanges =\n result.added.length + result.modified.length + result.removed.length;\n totalChanges += pkgChanges;\n\n results.push({\n name: pkg,\n added: result.added,\n modified: result.modified,\n removed: result.removed,\n });\n }\n\n return { packages: results, totalChanges };\n }\n\n /**\n * Remove test files and ignored directories from a synced package.\n */\n protected async removeIgnoredFiles(pkgDir: string): Promise<void> {\n const allFiles = await this.fs.ls(pkgDir, { recursive: true });\n\n // Remove ignored files\n for (const file of allFiles) {\n if (\n file.endsWith(\".spec.ts\") ||\n file.endsWith(\".spec.tsx\") ||\n file === \"LICENSE\" ||\n file === \"tsdown.config.ts\"\n ) {\n await this.fs.rm(this.fs.join(pkgDir, file), { force: true });\n }\n }\n\n // Remove ignored directories (find all occurrences at any depth)\n for (const file of allFiles) {\n for (const ignored of this.ignoredPaths) {\n if (\n file === ignored ||\n file.startsWith(`${ignored}/`) ||\n file.includes(`/${ignored}/`) ||\n file.endsWith(`/${ignored}`)\n ) {\n // Extract the path to the ignored directory itself\n const idx = file.indexOf(ignored);\n const dirPath = this.fs.join(\n pkgDir,\n file.substring(0, idx + ignored.length),\n );\n await this.fs.rm(dirPath, { recursive: true, force: true });\n }\n }\n }\n }\n\n /**\n * Clone a remote repository into a temporary directory.\n */\n protected async cloneRemote(remote: string, branch: string): Promise<string> {\n const tmpDir = this.fs.join(\n process.env.TMPDIR || \"/tmp\",\n `.alepha-vendor-${Date.now()}`,\n );\n\n this.log.debug(`Cloning ${remote}#${branch} into ${tmpDir}`);\n\n const output = await this.shell.run(\n `git clone --depth 1 --branch ${branch} --filter=blob:none ${remote} ${tmpDir}`,\n { capture: true },\n );\n\n if (output) {\n this.log.debug(output);\n }\n\n return tmpDir;\n }\n\n /**\n * Clone a remote repository at a specific commit hash.\n */\n protected async cloneAtCommit(\n remote: string,\n commit: string,\n ): Promise<string> {\n const tmpDir = this.fs.join(\n process.env.TMPDIR || \"/tmp\",\n `.alepha-vendor-${Date.now()}`,\n );\n\n this.log.debug(`Cloning ${remote}@${commit} into ${tmpDir}`);\n\n await this.shell.run(`git init ${tmpDir}`, { capture: true });\n await this.shell.run(`git -C ${tmpDir} remote add origin ${remote}`, {\n capture: true,\n });\n await this.shell.run(`git -C ${tmpDir} fetch --depth 1 origin ${commit}`, {\n capture: true,\n });\n await this.shell.run(`git -C ${tmpDir} checkout FETCH_HEAD`, {\n capture: true,\n });\n\n return tmpDir;\n }\n\n /**\n * Get the HEAD commit hash from a cloned repository.\n */\n protected async getCommitHash(repoDir: string): Promise<string> {\n const hash = await this.shell.run(`git -C ${repoDir} rev-parse HEAD`, {\n capture: true,\n });\n return hash.trim();\n }\n\n /**\n * Read the vendor lock file at `<root>/<dir>/vendor.json`.\n */\n protected async readLock(\n root: string,\n dir: string,\n ): Promise<VendorLock | undefined> {\n const lockPath = this.fs.join(root, dir, \"vendor.json\");\n const exists = await this.fs.exists(lockPath);\n if (!exists) {\n return undefined;\n }\n const content = await this.fs.readFile(lockPath);\n return JSON.parse(content.toString());\n }\n\n /**\n * Write the vendor lock file to `<root>/<dir>/vendor.json`.\n */\n protected async writeLock(\n root: string,\n dir: string,\n lock: VendorLock,\n ): Promise<void> {\n const vendorDir = this.fs.join(root, dir);\n await this.fs.mkdir(vendorDir, { recursive: true });\n await this.fs.writeFile(\n this.fs.join(vendorDir, \"vendor.json\"),\n JSON.stringify(lock, null, 2),\n );\n }\n\n /**\n * Directories to ignore during diff comparisons.\n */\n protected readonly ignoredPaths = [\n \"__tests__\",\n \"assets/swagger-ui\",\n \"node_modules\",\n \"dist\",\n ];\n\n /**\n * Check if a file path should be ignored during diff.\n */\n protected isIgnored(filePath: string): boolean {\n if (\n filePath.endsWith(\".spec.ts\") ||\n filePath.endsWith(\".spec.tsx\") ||\n filePath === \"LICENSE\" ||\n filePath === \"tsdown.config.ts\"\n ) {\n return true;\n }\n return this.ignoredPaths.some(\n (p) =>\n filePath === p ||\n filePath.startsWith(`${p}/`) ||\n filePath.includes(`/${p}/`) ||\n filePath.endsWith(`/${p}`),\n );\n }\n\n /**\n * Recursively compare two directories and return the differences.\n */\n protected async diffDirectories(\n localDir: string,\n remoteDir: string,\n ): Promise<{\n added: string[];\n modified: VendorFileDiff[];\n removed: string[];\n }> {\n const added: string[] = [];\n const modified: VendorFileDiff[] = [];\n const removed: string[] = [];\n\n const [localFiles, remoteFiles] = await Promise.all([\n this.fs.ls(localDir, { recursive: true }),\n this.fs.ls(remoteDir, { recursive: true }),\n ]);\n\n const filteredLocal = localFiles.filter((f) => !this.isIgnored(f));\n const filteredRemote = remoteFiles.filter((f) => !this.isIgnored(f));\n\n const localSet = new Set(filteredLocal);\n const remoteSet = new Set(filteredRemote);\n\n // Files in baseline but not local = user deleted them\n for (const file of filteredRemote) {\n if (!localSet.has(file)) {\n removed.push(file);\n continue;\n }\n\n try {\n const [localContent, remoteContent] = await Promise.all([\n this.fs.readFile(this.fs.join(localDir, file)),\n this.fs.readFile(this.fs.join(remoteDir, file)),\n ]);\n\n if (!localContent.equals(remoteContent)) {\n const changes = this.computeLineDiff(\n remoteContent.toString(),\n localContent.toString(),\n );\n modified.push({ file, changes });\n }\n } catch {\n // Skip directories and unreadable entries\n }\n }\n\n // Files in local but not baseline = user added them\n for (const file of filteredLocal) {\n if (!remoteSet.has(file)) {\n added.push(file);\n }\n }\n\n return { added, modified, removed };\n }\n\n /**\n * Compute line-level differences between two file contents.\n *\n * Uses a longest-common-subsequence algorithm to produce minimal\n * added/removed line changes with accurate line numbers.\n */\n protected computeLineDiff(baseline: string, local: string): VendorLineDiff[] {\n const baseLines = baseline.split(\"\\n\");\n const localLines = local.split(\"\\n\");\n const lcs = this.longestCommonSubsequence(baseLines, localLines);\n const changes: VendorLineDiff[] = [];\n\n let bi = 0;\n let li = 0;\n let ci = 0;\n\n while (bi < baseLines.length || li < localLines.length) {\n if (ci < lcs.length && bi < baseLines.length && li < localLines.length) {\n if (baseLines[bi] === lcs[ci] && localLines[li] === lcs[ci]) {\n // Line is unchanged\n bi++;\n li++;\n ci++;\n } else if (baseLines[bi] !== lcs[ci]) {\n changes.push({ line: bi + 1, type: \"removed\", text: baseLines[bi] });\n bi++;\n } else {\n changes.push({ line: li + 1, type: \"added\", text: localLines[li] });\n li++;\n }\n } else if (bi < baseLines.length) {\n changes.push({ line: bi + 1, type: \"removed\", text: baseLines[bi] });\n bi++;\n } else {\n changes.push({ line: li + 1, type: \"added\", text: localLines[li] });\n li++;\n }\n }\n\n return changes;\n }\n\n /**\n * Compute the longest common subsequence of two string arrays.\n */\n protected longestCommonSubsequence(a: string[], b: string[]): string[] {\n const m = a.length;\n const n = b.length;\n const dp: number[][] = Array.from({ length: m + 1 }, () =>\n Array(n + 1).fill(0),\n );\n\n for (let i = 1; i <= m; i++) {\n for (let j = 1; j <= n; j++) {\n dp[i][j] =\n a[i - 1] === b[j - 1]\n ? dp[i - 1][j - 1] + 1\n : Math.max(dp[i - 1][j], dp[i][j - 1]);\n }\n }\n\n const result: string[] = [];\n let i = m;\n let j = n;\n while (i > 0 && j > 0) {\n if (a[i - 1] === b[j - 1]) {\n result.unshift(a[i - 1]);\n i--;\n j--;\n } else if (dp[i - 1][j] > dp[i][j - 1]) {\n i--;\n } else {\n j--;\n }\n }\n\n return result;\n }\n}\n","import { $inject, $state, AlephaError, t } from \"alepha\";\nimport { PackageManagerUtils } from \"alepha/cli\";\nimport { $command } from \"alepha/command\";\nimport { $logger, ConsoleColorProvider } from \"alepha/logger\";\nimport { vendorOptions } from \"../atoms/vendorOptions.ts\";\nimport type {\n VendorDiffResult,\n VendorPackageDiff,\n VendorSyncResult,\n} from \"../services/VendorService.ts\";\nimport { VendorService } from \"../services/VendorService.ts\";\n\n/**\n * Default remote when none is configured. The HTTPS URL is used so anyone\n * (CI runners, AI agents, contributors without SSH keys) can clone without\n * extra setup.\n */\nconst DEFAULT_REMOTE = \"https://github.com/feunard/alepha\";\n\nexport class VendorCommand {\n protected readonly log = $logger();\n protected readonly options = $state(vendorOptions);\n protected readonly vendorService = $inject(VendorService);\n protected readonly color = $inject(ConsoleColorProvider);\n protected readonly pm = $inject(PackageManagerUtils);\n\n /**\n * Ensure vendor config is present and return resolved options.\n */\n protected resolveOptions() {\n if (!this.options) {\n throw new AlephaError(\n 'Missing vendor configuration. Add a \"vendor\" section to alepha.config.ts.',\n );\n }\n return {\n remote: this.options.remote ?? DEFAULT_REMOTE,\n branch: this.options.branch ?? \"main\",\n dir: this.options.dir ?? \".vendor\",\n packages: this.options.packages,\n };\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // alepha vendor sync\n // ─────────────────────────────────────────────────────────────────────────\n\n protected readonly syncFlags = t.object({\n force: t.optional(\n t.boolean({\n aliases: [\"f\"],\n description: \"Skip local modification check\",\n }),\n ),\n remote: t.optional(\n t.text({\n description:\n \"Override the configured remote for this invocation. Accepts any git-clone URL, including local paths (`file:///abs/path/to/alepha`). Useful for CI canaries that need to sync against a local checkout instead of the published repo.\",\n }),\n ),\n });\n\n protected readonly sync = $command({\n name: \"sync\",\n description: \"Replace local packages with remote source\",\n flags: this.syncFlags,\n handler: async ({ flags, root, run }) => {\n const opts = this.resolveOptions();\n const remote = flags.remote ?? opts.remote;\n const c = this.color;\n\n let result: VendorSyncResult = { synced: [], errors: [] };\n\n await run({\n name: `Syncing from ${opts.branch}`,\n handler: async () => {\n result = await this.vendorService.sync({\n root,\n remote,\n branch: opts.branch,\n dir: opts.dir,\n packages: opts.packages,\n force: flags.force,\n });\n },\n });\n\n if (result.aborted) {\n run.end();\n\n process.stdout.write(\n `\\nLocal modifications detected. Use ${c.set(\"CYAN\", \"--force\")} to overwrite.\\n`,\n );\n\n for (const pkg of result.aborted.packages) {\n this.printPackageDiff(pkg);\n }\n\n process.stdout.write(\"\\n\");\n return;\n }\n\n if (result.synced.length > 0) {\n const pmName = await this.pm.getPackageManager(root);\n await run(`${pmName} install`, { root });\n }\n\n run.end();\n\n if (result.errors.length > 0) {\n for (const error of result.errors) {\n process.stdout.write(`${c.set(\"RED\", \" error\")} ${error}\\n`);\n }\n }\n\n if (result.synced.length > 0) {\n process.stdout.write(\n `\\nSynced ${c.set(\"CYAN\", String(result.synced.length))} ${result.synced.length === 1 ? \"package\" : \"packages\"} from ${c.set(\"CYAN\", opts.branch)}\\n`,\n );\n for (const pkg of result.synced) {\n process.stdout.write(` ${c.set(\"GREEN\", \"\\u2713\")} ${pkg}\\n`);\n }\n }\n\n process.stdout.write(\"\\n\");\n },\n });\n\n // ─────────────────────────────────────────────────────────────────────────\n // alepha vendor diff\n // ─────────────────────────────────────────────────────────────────────────\n\n protected readonly diff = $command({\n name: \"diff\",\n description: \"Compare local packages against remote\",\n handler: async ({ root, run }) => {\n const opts = this.resolveOptions();\n\n let result: VendorDiffResult = { packages: [], totalChanges: 0 };\n\n await run({\n name: `Cloning ${opts.remote} at ${opts.branch}`,\n handler: async () => {\n result = await this.vendorService.diff({\n root,\n remote: opts.remote,\n branch: opts.branch,\n dir: opts.dir,\n packages: opts.packages,\n });\n },\n });\n\n run.end();\n\n if (result.totalChanges === 0) {\n process.stdout.write(\"\\nNo changes\\n\\n\");\n return;\n }\n\n for (const pkg of result.packages) {\n this.printPackageDiff(pkg);\n }\n\n process.stdout.write(\"\\n\");\n },\n });\n\n // ─────────────────────────────────────────────────────────────────────────\n // Helpers\n // ─────────────────────────────────────────────────────────────────────────\n\n protected printPackageDiff(pkg: VendorPackageDiff) {\n const c = this.color;\n const count = pkg.added.length + pkg.modified.length + pkg.removed.length;\n\n if (count === 0) {\n process.stdout.write(`\\n${c.set(\"CYAN\", pkg.name)}: no changes\\n`);\n return;\n }\n\n process.stdout.write(\n `\\n${c.set(\"CYAN\", pkg.name)}: ${count} ${count === 1 ? \"file differs\" : \"files differ\"}\\n`,\n );\n\n for (const file of pkg.added) {\n process.stdout.write(` ${c.set(\"GREEN\", \"A\")} ${file}\\n`);\n }\n\n for (const fileDiff of pkg.modified) {\n process.stdout.write(` ${c.set(\"ORANGE\", \"M\")} ${fileDiff.file}\\n`);\n for (const change of fileDiff.changes) {\n const prefix = change.type === \"removed\" ? \"-\" : \"+\";\n const color = change.type === \"removed\" ? \"RED\" : \"GREEN\";\n const lineNum = `L${change.line}`;\n process.stdout.write(\n ` ${c.set(\"DIM\", lineNum.padEnd(5))} ${c.set(color, `${prefix} ${change.text}`)}\\n`,\n );\n }\n }\n\n for (const file of pkg.removed) {\n process.stdout.write(` ${c.set(\"RED\", \"D\")} ${file}\\n`);\n }\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Parent command\n // ─────────────────────────────────────────────────────────────────────────\n\n public readonly vendor = $command({\n name: \"vendor\",\n description: \"Vendor Alepha packages into the project\",\n children: [this.sync, this.diff],\n handler: async ({ help }) => {\n help();\n },\n });\n}\n","import { $context, $module } from \"alepha\";\nimport { type VendorOptions, vendorOptions } from \"./atoms/vendorOptions.ts\";\nimport { VendorCommand } from \"./commands/VendorCommand.ts\";\nimport { VendorService } from \"./services/VendorService.ts\";\n\n// ---------------------------------------------------------------------------\n\n/**\n * CLI plugin for vendoring Alepha packages into external projects.\n *\n * Copies package source code from a git remote into the current project's\n * `packages/` directory. Useful for corporate projects that need a local\n * copy of Alepha for AI tooling, audits, documentation, or quick fixes.\n *\n * Commands:\n * - `alepha vendor sync` — replace local packages with remote source\n * - `alepha vendor diff` — compare local packages against remote HEAD\n *\n * Configuration in `alepha.config.ts`:\n *\n * ```typescript\n * import { vendor } from \"alepha/cli/vendor\";\n *\n * export default defineConfig({\n * plugins: [\n * vendor({\n * branch: \"main\",\n * packages: [\"alepha\", \"@alepha/payments-stripe\"],\n * }),\n * ],\n * });\n * ```\n */\nexport const AlephaCliVendorPlugin = $module({\n name: \"alepha.cli.plugins.vendor\",\n atoms: [vendorOptions],\n services: [VendorCommand, VendorService],\n});\n\nexport const vendor = (options: VendorOptions) => {\n return () => {\n const { alepha } = $context();\n alepha.with(AlephaCliVendorPlugin).set(vendorOptions, options);\n };\n};\n\n// ---------------------------------------------------------------------------\n\nexport * from \"./atoms/vendorOptions.ts\";\nexport * from \"./commands/VendorCommand.ts\";\nexport * from \"./services/VendorService.ts\";\n"],"mappings":";;;;;;;;;;;;AAQA,MAAa,gBAAgB,MAAM;CACjC,MAAM;CACN,aAAa;CACb,QAAQ,EAAE,SACR,EAAE,OAAO;;;;;;EAMP,QAAQ,EAAE,SAAS,EAAE,KAAK,CAAC;;;;;;EAO3B,QAAQ,EAAE,SAAS,EAAE,KAAK,CAAC;;;;;;;;;EAU3B,KAAK,EAAE,SAAS,EAAE,KAAK,CAAC;;;;;;EAOxB,UAAU,EAAE,MAAM,EAAE,KAAK,CAAC;CAC5B,CAAC,CACH;AACF,CAAC;;;;;;;;ACpCD,MAAM,aAAa;;;;AAyFnB,IAAa,gBAAb,MAA2B;CACzB,MAAyB,QAAQ;CACjC,QAA2B,QAAQ,aAAa;CAChD,KAAwB,QAAQ,kBAAkB;;;;;;;;;;CAWlD,MAAM,KAAK,SAAuD;EAChE,MAAM,SAAmB,CAAC;EAC1B,MAAM,SAAmB,CAAC;EAE1B,IAAI,CAAC,QAAQ,OAAO;GAClB,MAAM,OAAO,MAAM,KAAK,SAAS,QAAQ,MAAM,QAAQ,GAAG;GAE1D,IAAI,MAAM;IACR,IAAI;IACJ,IAAI;KACF,cAAc,MAAM,KAAK,cAAc,QAAQ,QAAQ,KAAK,MAAM;KAClE,MAAM,aAAa,MAAM,KAAK,cAC5B,QAAQ,MACR,aACA,QAAQ,KACR,QAAQ,QACV;KAEA,IAAI,WAAW,eAAe,GAC5B,OAAO;MAAE,QAAQ,CAAC;MAAG,QAAQ,CAAC;MAAG,SAAS;KAAW;IAEzD,UAAU;KACR,IAAI,aACF,MAAM,KAAK,GAAG,GAAG,aAAa;MAAE,WAAW;MAAM,OAAO;KAAK,CAAC;IAElE;GACF;EACF;EAEA,IAAI;EAEJ,IAAI;GACF,SAAS,MAAM,KAAK,YAAY,QAAQ,QAAQ,QAAQ,MAAM;GAE9D,KAAK,MAAM,OAAO,QAAQ,UAAU;IAClC,MAAM,eAAe,KAAK,GAAG,KAAK,QAAQ,YAAY,GAAG;IACzD,MAAM,cAAc,KAAK,GAAG,KAAK,QAAQ,MAAM,QAAQ,KAAK,GAAG;IAG/D,IAAI,CAAC,MADsB,KAAK,GAAG,OAAO,YAAY,GACnC;KACjB,OAAO,KAAK,YAAY,IAAI,sBAAsB;KAClD;IACF;IAEA,KAAK,IAAI,MAAM,oBAAoB,KAAK;IAExC,MAAM,KAAK,GAAG,GAAG,aAAa;KAAE,WAAW;KAAM,OAAO;IAAK,CAAC;IAC9D,MAAM,KAAK,GAAG,GAAG,cAAc,aAAa,EAAE,WAAW,KAAK,CAAC;IAC/D,MAAM,KAAK,mBAAmB,WAAW;IAEzC,OAAO,KAAK,GAAG;GACjB;GAEA,MAAM,SAAS,MAAM,KAAK,cAAc,MAAM;GAC9C,MAAM,KAAK,UAAU,QAAQ,MAAM,QAAQ,KAAK;IAC9C,QAAQ,QAAQ;IAChB;GACF,CAAC;EACH,UAAU;GACR,IAAI,QACF,MAAM,KAAK,GAAG,GAAG,QAAQ;IAAE,WAAW;IAAM,OAAO;GAAK,CAAC;EAE7D;EAEA,OAAO;GAAE;GAAQ;EAAO;CAC1B;;;;;;;CAQA,MAAM,KAAK,SAAuD;EAChE,MAAM,OAAO,MAAM,KAAK,SAAS,QAAQ,MAAM,QAAQ,GAAG;EAC1D,IAAI,CAAC,MACH,OAAO;GAAE,UAAU,CAAC;GAAG,cAAc;EAAE;EAGzC,IAAI;EAEJ,IAAI;GACF,SAAS,MAAM,KAAK,cAAc,QAAQ,QAAQ,KAAK,MAAM;GAC7D,OAAO,MAAM,KAAK,cAChB,QAAQ,MACR,QACA,QAAQ,KACR,QAAQ,QACV;EACF,UAAU;GACR,IAAI,QACF,MAAM,KAAK,GAAG,GAAG,QAAQ;IAAE,WAAW;IAAM,OAAO;GAAK,CAAC;EAE7D;CACF;;;;CAKA,MAAgB,cACd,MACA,QACA,KACA,UAC2B;EAC3B,MAAM,UAA+B,CAAC;EACtC,IAAI,eAAe;EAEnB,KAAK,MAAM,OAAO,UAAU;GAC1B,MAAM,eAAe,KAAK,GAAG,KAAK,QAAQ,YAAY,GAAG;GACzD,MAAM,cAAc,KAAK,GAAG,KAAK,MAAM,KAAK,GAAG;GAE/C,MAAM,eAAe,MAAM,KAAK,GAAG,OAAO,YAAY;GACtD,MAAM,cAAc,MAAM,KAAK,GAAG,OAAO,WAAW;GAEpD,IAAI,CAAC,gBAAgB,CAAC,aAAa;IACjC,QAAQ,KAAK;KAAE,MAAM;KAAK,OAAO,CAAC;KAAG,UAAU,CAAC;KAAG,SAAS,CAAC;IAAE,CAAC;IAChE;GACF;GAEA,IAAI,CAAC,cAAc;IAEjB,MAAM,aAAa,MAAM,KAAK,GAAG,GAAG,aAAa,EAAE,WAAW,KAAK,CAAC;IACpE,QAAQ,KAAK;KACX,MAAM;KACN,OAAO;KACP,UAAU,CAAC;KACX,SAAS,CAAC;IACZ,CAAC;IACD,gBAAgB,WAAW;IAC3B;GACF;GAEA,IAAI,CAAC,aAAa;IAEhB,MAAM,cAAc,MAAM,KAAK,GAAG,GAAG,cAAc,EAAE,WAAW,KAAK,CAAC;IACtE,QAAQ,KAAK;KACX,MAAM;KACN,OAAO,CAAC;KACR,UAAU,CAAC;KACX,SAAS;IACX,CAAC;IACD,gBAAgB,YAAY;IAC5B;GACF;GAEA,MAAM,SAAS,MAAM,KAAK,gBAAgB,aAAa,YAAY;GACnE,MAAM,aACJ,OAAO,MAAM,SAAS,OAAO,SAAS,SAAS,OAAO,QAAQ;GAChE,gBAAgB;GAEhB,QAAQ,KAAK;IACX,MAAM;IACN,OAAO,OAAO;IACd,UAAU,OAAO;IACjB,SAAS,OAAO;GAClB,CAAC;EACH;EAEA,OAAO;GAAE,UAAU;GAAS;EAAa;CAC3C;;;;CAKA,MAAgB,mBAAmB,QAA+B;EAChE,MAAM,WAAW,MAAM,KAAK,GAAG,GAAG,QAAQ,EAAE,WAAW,KAAK,CAAC;EAG7D,KAAK,MAAM,QAAQ,UACjB,IACE,KAAK,SAAS,UAAU,KACxB,KAAK,SAAS,WAAW,KACzB,SAAS,aACT,SAAS,oBAET,MAAM,KAAK,GAAG,GAAG,KAAK,GAAG,KAAK,QAAQ,IAAI,GAAG,EAAE,OAAO,KAAK,CAAC;EAKhE,KAAK,MAAM,QAAQ,UACjB,KAAK,MAAM,WAAW,KAAK,cACzB,IACE,SAAS,WACT,KAAK,WAAW,GAAG,QAAQ,EAAE,KAC7B,KAAK,SAAS,IAAI,QAAQ,EAAE,KAC5B,KAAK,SAAS,IAAI,SAAS,GAC3B;GAEA,MAAM,MAAM,KAAK,QAAQ,OAAO;GAChC,MAAM,UAAU,KAAK,GAAG,KACtB,QACA,KAAK,UAAU,GAAG,MAAM,QAAQ,MAAM,CACxC;GACA,MAAM,KAAK,GAAG,GAAG,SAAS;IAAE,WAAW;IAAM,OAAO;GAAK,CAAC;EAC5D;CAGN;;;;CAKA,MAAgB,YAAY,QAAgB,QAAiC;EAC3E,MAAM,SAAS,KAAK,GAAG,KACrB,QAAQ,IAAI,UAAU,QACtB,kBAAkB,KAAK,IAAI,GAC7B;EAEA,KAAK,IAAI,MAAM,WAAW,OAAO,GAAG,OAAO,QAAQ,QAAQ;EAE3D,MAAM,SAAS,MAAM,KAAK,MAAM,IAC9B,gCAAgC,OAAO,sBAAsB,OAAO,GAAG,UACvE,EAAE,SAAS,KAAK,CAClB;EAEA,IAAI,QACF,KAAK,IAAI,MAAM,MAAM;EAGvB,OAAO;CACT;;;;CAKA,MAAgB,cACd,QACA,QACiB;EACjB,MAAM,SAAS,KAAK,GAAG,KACrB,QAAQ,IAAI,UAAU,QACtB,kBAAkB,KAAK,IAAI,GAC7B;EAEA,KAAK,IAAI,MAAM,WAAW,OAAO,GAAG,OAAO,QAAQ,QAAQ;EAE3D,MAAM,KAAK,MAAM,IAAI,YAAY,UAAU,EAAE,SAAS,KAAK,CAAC;EAC5D,MAAM,KAAK,MAAM,IAAI,UAAU,OAAO,qBAAqB,UAAU,EACnE,SAAS,KACX,CAAC;EACD,MAAM,KAAK,MAAM,IAAI,UAAU,OAAO,0BAA0B,UAAU,EACxE,SAAS,KACX,CAAC;EACD,MAAM,KAAK,MAAM,IAAI,UAAU,OAAO,uBAAuB,EAC3D,SAAS,KACX,CAAC;EAED,OAAO;CACT;;;;CAKA,MAAgB,cAAc,SAAkC;EAI9D,QAAO,MAHY,KAAK,MAAM,IAAI,UAAU,QAAQ,kBAAkB,EACpE,SAAS,KACX,CAAC,GACW,KAAK;CACnB;;;;CAKA,MAAgB,SACd,MACA,KACiC;EACjC,MAAM,WAAW,KAAK,GAAG,KAAK,MAAM,KAAK,aAAa;EAEtD,IAAI,CAAC,MADgB,KAAK,GAAG,OAAO,QAAQ,GAE1C;EAEF,MAAM,UAAU,MAAM,KAAK,GAAG,SAAS,QAAQ;EAC/C,OAAO,KAAK,MAAM,QAAQ,SAAS,CAAC;CACtC;;;;CAKA,MAAgB,UACd,MACA,KACA,MACe;EACf,MAAM,YAAY,KAAK,GAAG,KAAK,MAAM,GAAG;EACxC,MAAM,KAAK,GAAG,MAAM,WAAW,EAAE,WAAW,KAAK,CAAC;EAClD,MAAM,KAAK,GAAG,UACZ,KAAK,GAAG,KAAK,WAAW,aAAa,GACrC,KAAK,UAAU,MAAM,MAAM,CAAC,CAC9B;CACF;;;;CAKA,eAAkC;EAChC;EACA;EACA;EACA;CACF;;;;CAKA,UAAoB,UAA2B;EAC7C,IACE,SAAS,SAAS,UAAU,KAC5B,SAAS,SAAS,WAAW,KAC7B,aAAa,aACb,aAAa,oBAEb,OAAO;EAET,OAAO,KAAK,aAAa,MACtB,MACC,aAAa,KACb,SAAS,WAAW,GAAG,EAAE,EAAE,KAC3B,SAAS,SAAS,IAAI,EAAE,EAAE,KAC1B,SAAS,SAAS,IAAI,GAAG,CAC7B;CACF;;;;CAKA,MAAgB,gBACd,UACA,WAKC;EACD,MAAM,QAAkB,CAAC;EACzB,MAAM,WAA6B,CAAC;EACpC,MAAM,UAAoB,CAAC;EAE3B,MAAM,CAAC,YAAY,eAAe,MAAM,QAAQ,IAAI,CAClD,KAAK,GAAG,GAAG,UAAU,EAAE,WAAW,KAAK,CAAC,GACxC,KAAK,GAAG,GAAG,WAAW,EAAE,WAAW,KAAK,CAAC,CAC3C,CAAC;EAED,MAAM,gBAAgB,WAAW,QAAQ,MAAM,CAAC,KAAK,UAAU,CAAC,CAAC;EACjE,MAAM,iBAAiB,YAAY,QAAQ,MAAM,CAAC,KAAK,UAAU,CAAC,CAAC;EAEnE,MAAM,WAAW,IAAI,IAAI,aAAa;EACtC,MAAM,YAAY,IAAI,IAAI,cAAc;EAGxC,KAAK,MAAM,QAAQ,gBAAgB;GACjC,IAAI,CAAC,SAAS,IAAI,IAAI,GAAG;IACvB,QAAQ,KAAK,IAAI;IACjB;GACF;GAEA,IAAI;IACF,MAAM,CAAC,cAAc,iBAAiB,MAAM,QAAQ,IAAI,CACtD,KAAK,GAAG,SAAS,KAAK,GAAG,KAAK,UAAU,IAAI,CAAC,GAC7C,KAAK,GAAG,SAAS,KAAK,GAAG,KAAK,WAAW,IAAI,CAAC,CAChD,CAAC;IAED,IAAI,CAAC,aAAa,OAAO,aAAa,GAAG;KACvC,MAAM,UAAU,KAAK,gBACnB,cAAc,SAAS,GACvB,aAAa,SAAS,CACxB;KACA,SAAS,KAAK;MAAE;MAAM;KAAQ,CAAC;IACjC;GACF,QAAQ,CAER;EACF;EAGA,KAAK,MAAM,QAAQ,eACjB,IAAI,CAAC,UAAU,IAAI,IAAI,GACrB,MAAM,KAAK,IAAI;EAInB,OAAO;GAAE;GAAO;GAAU;EAAQ;CACpC;;;;;;;CAQA,gBAA0B,UAAkB,OAAiC;EAC3E,MAAM,YAAY,SAAS,MAAM,IAAI;EACrC,MAAM,aAAa,MAAM,MAAM,IAAI;EACnC,MAAM,MAAM,KAAK,yBAAyB,WAAW,UAAU;EAC/D,MAAM,UAA4B,CAAC;EAEnC,IAAI,KAAK;EACT,IAAI,KAAK;EACT,IAAI,KAAK;EAET,OAAO,KAAK,UAAU,UAAU,KAAK,WAAW,QAC9C,IAAI,KAAK,IAAI,UAAU,KAAK,UAAU,UAAU,KAAK,WAAW,QAC9D,IAAI,UAAU,QAAQ,IAAI,OAAO,WAAW,QAAQ,IAAI,KAAK;GAE3D;GACA;GACA;EACF,OAAO,IAAI,UAAU,QAAQ,IAAI,KAAK;GACpC,QAAQ,KAAK;IAAE,MAAM,KAAK;IAAG,MAAM;IAAW,MAAM,UAAU;GAAI,CAAC;GACnE;EACF,OAAO;GACL,QAAQ,KAAK;IAAE,MAAM,KAAK;IAAG,MAAM;IAAS,MAAM,WAAW;GAAI,CAAC;GAClE;EACF;OACK,IAAI,KAAK,UAAU,QAAQ;GAChC,QAAQ,KAAK;IAAE,MAAM,KAAK;IAAG,MAAM;IAAW,MAAM,UAAU;GAAI,CAAC;GACnE;EACF,OAAO;GACL,QAAQ,KAAK;IAAE,MAAM,KAAK;IAAG,MAAM;IAAS,MAAM,WAAW;GAAI,CAAC;GAClE;EACF;EAGF,OAAO;CACT;;;;CAKA,yBAAmC,GAAa,GAAuB;EACrE,MAAM,IAAI,EAAE;EACZ,MAAM,IAAI,EAAE;EACZ,MAAM,KAAiB,MAAM,KAAK,EAAE,QAAQ,IAAI,EAAE,SAChD,MAAM,IAAI,CAAC,EAAE,KAAK,CAAC,CACrB;EAEA,KAAK,IAAI,IAAI,GAAG,KAAK,GAAG,KACtB,KAAK,IAAI,IAAI,GAAG,KAAK,GAAG,KACtB,GAAG,GAAG,KACJ,EAAE,IAAI,OAAO,EAAE,IAAI,KACf,GAAG,IAAI,GAAG,IAAI,KAAK,IACnB,KAAK,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,EAAE;EAI7C,MAAM,SAAmB,CAAC;EAC1B,IAAI,IAAI;EACR,IAAI,IAAI;EACR,OAAO,IAAI,KAAK,IAAI,GAClB,IAAI,EAAE,IAAI,OAAO,EAAE,IAAI,IAAI;GACzB,OAAO,QAAQ,EAAE,IAAI,EAAE;GACvB;GACA;EACF,OAAO,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG,GAAG,IAAI,IAClC;OAEA;EAIJ,OAAO;CACT;AACF;;;;;;;;AC/iBA,MAAM,iBAAiB;AAEvB,IAAa,gBAAb,MAA2B;CACzB,MAAyB,QAAQ;CACjC,UAA6B,OAAO,aAAa;CACjD,gBAAmC,QAAQ,aAAa;CACxD,QAA2B,QAAQ,oBAAoB;CACvD,KAAwB,QAAQ,mBAAmB;;;;CAKnD,iBAA2B;EACzB,IAAI,CAAC,KAAK,SACR,MAAM,IAAI,YACR,6EACF;EAEF,OAAO;GACL,QAAQ,KAAK,QAAQ,UAAU;GAC/B,QAAQ,KAAK,QAAQ,UAAU;GAC/B,KAAK,KAAK,QAAQ,OAAO;GACzB,UAAU,KAAK,QAAQ;EACzB;CACF;CAMA,YAA+B,EAAE,OAAO;EACtC,OAAO,EAAE,SACP,EAAE,QAAQ;GACR,SAAS,CAAC,GAAG;GACb,aAAa;EACf,CAAC,CACH;EACA,QAAQ,EAAE,SACR,EAAE,KAAK,EACL,aACE,wOACJ,CAAC,CACH;CACF,CAAC;CAED,OAA0B,SAAS;EACjC,MAAM;EACN,aAAa;EACb,OAAO,KAAK;EACZ,SAAS,OAAO,EAAE,OAAO,MAAM,UAAU;GACvC,MAAM,OAAO,KAAK,eAAe;GACjC,MAAM,SAAS,MAAM,UAAU,KAAK;GACpC,MAAM,IAAI,KAAK;GAEf,IAAI,SAA2B;IAAE,QAAQ,CAAC;IAAG,QAAQ,CAAC;GAAE;GAExD,MAAM,IAAI;IACR,MAAM,gBAAgB,KAAK;IAC3B,SAAS,YAAY;KACnB,SAAS,MAAM,KAAK,cAAc,KAAK;MACrC;MACA;MACA,QAAQ,KAAK;MACb,KAAK,KAAK;MACV,UAAU,KAAK;MACf,OAAO,MAAM;KACf,CAAC;IACH;GACF,CAAC;GAED,IAAI,OAAO,SAAS;IAClB,IAAI,IAAI;IAER,QAAQ,OAAO,MACb,uCAAuC,EAAE,IAAI,QAAQ,SAAS,EAAE,iBAClE;IAEA,KAAK,MAAM,OAAO,OAAO,QAAQ,UAC/B,KAAK,iBAAiB,GAAG;IAG3B,QAAQ,OAAO,MAAM,IAAI;IACzB;GACF;GAEA,IAAI,OAAO,OAAO,SAAS,GAEzB,MAAM,IAAI,GAAG,MADQ,KAAK,GAAG,kBAAkB,IAAI,EAC/B,WAAW,EAAE,KAAK,CAAC;GAGzC,IAAI,IAAI;GAER,IAAI,OAAO,OAAO,SAAS,GACzB,KAAK,MAAM,SAAS,OAAO,QACzB,QAAQ,OAAO,MAAM,GAAG,EAAE,IAAI,OAAO,SAAS,EAAE,GAAG,MAAM,GAAG;GAIhE,IAAI,OAAO,OAAO,SAAS,GAAG;IAC5B,QAAQ,OAAO,MACb,YAAY,EAAE,IAAI,QAAQ,OAAO,OAAO,OAAO,MAAM,CAAC,EAAE,GAAG,OAAO,OAAO,WAAW,IAAI,YAAY,WAAW,QAAQ,EAAE,IAAI,QAAQ,KAAK,MAAM,EAAE,GACpJ;IACA,KAAK,MAAM,OAAO,OAAO,QACvB,QAAQ,OAAO,MAAM,KAAK,EAAE,IAAI,SAAS,GAAQ,EAAE,GAAG,IAAI,GAAG;GAEjE;GAEA,QAAQ,OAAO,MAAM,IAAI;EAC3B;CACF,CAAC;CAMD,OAA0B,SAAS;EACjC,MAAM;EACN,aAAa;EACb,SAAS,OAAO,EAAE,MAAM,UAAU;GAChC,MAAM,OAAO,KAAK,eAAe;GAEjC,IAAI,SAA2B;IAAE,UAAU,CAAC;IAAG,cAAc;GAAE;GAE/D,MAAM,IAAI;IACR,MAAM,WAAW,KAAK,OAAO,MAAM,KAAK;IACxC,SAAS,YAAY;KACnB,SAAS,MAAM,KAAK,cAAc,KAAK;MACrC;MACA,QAAQ,KAAK;MACb,QAAQ,KAAK;MACb,KAAK,KAAK;MACV,UAAU,KAAK;KACjB,CAAC;IACH;GACF,CAAC;GAED,IAAI,IAAI;GAER,IAAI,OAAO,iBAAiB,GAAG;IAC7B,QAAQ,OAAO,MAAM,kBAAkB;IACvC;GACF;GAEA,KAAK,MAAM,OAAO,OAAO,UACvB,KAAK,iBAAiB,GAAG;GAG3B,QAAQ,OAAO,MAAM,IAAI;EAC3B;CACF,CAAC;CAMD,iBAA2B,KAAwB;EACjD,MAAM,IAAI,KAAK;EACf,MAAM,QAAQ,IAAI,MAAM,SAAS,IAAI,SAAS,SAAS,IAAI,QAAQ;EAEnE,IAAI,UAAU,GAAG;GACf,QAAQ,OAAO,MAAM,KAAK,EAAE,IAAI,QAAQ,IAAI,IAAI,EAAE,eAAe;GACjE;EACF;EAEA,QAAQ,OAAO,MACb,KAAK,EAAE,IAAI,QAAQ,IAAI,IAAI,EAAE,IAAI,MAAM,GAAG,UAAU,IAAI,iBAAiB,eAAe,GAC1F;EAEA,KAAK,MAAM,QAAQ,IAAI,OACrB,QAAQ,OAAO,MAAM,KAAK,EAAE,IAAI,SAAS,GAAG,EAAE,GAAG,KAAK,GAAG;EAG3D,KAAK,MAAM,YAAY,IAAI,UAAU;GACnC,QAAQ,OAAO,MAAM,KAAK,EAAE,IAAI,UAAU,GAAG,EAAE,GAAG,SAAS,KAAK,GAAG;GACnE,KAAK,MAAM,UAAU,SAAS,SAAS;IACrC,MAAM,SAAS,OAAO,SAAS,YAAY,MAAM;IACjD,MAAM,QAAQ,OAAO,SAAS,YAAY,QAAQ;IAClD,MAAM,UAAU,IAAI,OAAO;IAC3B,QAAQ,OAAO,MACb,SAAS,EAAE,IAAI,OAAO,QAAQ,OAAO,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,OAAO,GAAG,OAAO,GAAG,OAAO,MAAM,EAAE,GACvF;GACF;EACF;EAEA,KAAK,MAAM,QAAQ,IAAI,SACrB,QAAQ,OAAO,MAAM,KAAK,EAAE,IAAI,OAAO,GAAG,EAAE,GAAG,KAAK,GAAG;CAE3D;CAMA,SAAyB,SAAS;EAChC,MAAM;EACN,aAAa;EACb,UAAU,CAAC,KAAK,MAAM,KAAK,IAAI;EAC/B,SAAS,OAAO,EAAE,WAAW;GAC3B,KAAK;EACP;CACF,CAAC;AACH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACzLA,MAAa,wBAAwB,QAAQ;CAC3C,MAAM;CACN,OAAO,CAAC,aAAa;CACrB,UAAU,CAAC,eAAe,aAAa;AACzC,CAAC;AAED,MAAa,UAAU,YAA2B;CAChD,aAAa;EACX,MAAM,EAAE,WAAW,SAAS;EAC5B,OAAO,KAAK,qBAAqB,EAAE,IAAI,eAAe,OAAO;CAC/D;AACF"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../src/cli/vendor/atoms/vendorOptions.ts","../../../src/cli/vendor/services/VendorService.ts","../../../src/cli/vendor/commands/VendorCommand.ts","../../../src/cli/vendor/index.ts"],"sourcesContent":["import { $atom, type Static, z } from \"alepha\";\n\n/**\n * Vendor configuration atom.\n *\n * Filled from the `vendor` section of `alepha.config.ts`.\n * Read by `VendorCommand` to resolve remote, branch, and packages.\n */\nexport const vendorOptions = $atom({\n name: \"alepha.cli.vendor.options\",\n description: \"Vendor synchronization configuration\",\n schema: z\n .object({\n /**\n * Git remote URL.\n *\n * @default \"git@github.com:feunard/alepha.git\"\n */\n remote: z.text().optional(),\n\n /**\n * Branch to sync from.\n *\n * @default \"main\"\n */\n branch: z.text().optional(),\n\n /**\n * Parent directory holding the vendored packages in the local project.\n * Relative to the project root. Also where the `vendor.json` lock file\n * is written. The remote is always expected to lay its packages out\n * under `packages/`.\n *\n * @default \".vendor\"\n */\n dir: z.text().optional(),\n\n /**\n * Package directory names under `dir` to sync.\n *\n * @example [\"alepha\", \"@alepha/payments-stripe\"]\n */\n packages: z.array(z.text()),\n })\n .optional(),\n});\n\n/**\n * Type for vendor options.\n */\nexport type VendorOptions = Static<typeof vendorOptions.schema>;\n","import { $inject } from \"alepha\";\nimport { $logger } from \"alepha/logger\";\nimport { FileSystemProvider, ShellProvider } from \"alepha/system\";\n\n/**\n * Parent directory of vendored packages on the remote. Hardcoded because the\n * Alepha monorepo lays its packages out under `packages/` and the vendor\n * tool only targets that layout.\n */\nconst REMOTE_DIR = \"packages\";\n\n/**\n * Options for syncing vendored packages from a remote repository.\n */\nexport interface VendorSyncOptions {\n root: string;\n remote: string;\n branch: string;\n dir: string;\n packages: string[];\n force?: boolean;\n}\n\n/**\n * Result of a vendor sync operation.\n */\nexport interface VendorSyncResult {\n synced: string[];\n errors: string[];\n aborted?: VendorDiffResult;\n}\n\n/**\n * Options for diffing vendored packages against a remote repository.\n */\nexport interface VendorDiffOptions {\n root: string;\n remote: string;\n branch: string;\n dir: string;\n packages: string[];\n}\n\n/**\n * A single line change within a modified file.\n */\nexport interface VendorLineDiff {\n line: number;\n type: \"added\" | \"removed\";\n text: string;\n}\n\n/**\n * A modified file with its line-level changes.\n */\nexport interface VendorFileDiff {\n file: string;\n changes: VendorLineDiff[];\n}\n\n/**\n * Diff result for a single vendored package.\n */\nexport interface VendorPackageDiff {\n name: string;\n added: string[];\n modified: VendorFileDiff[];\n removed: string[];\n}\n\n/**\n * Result of a vendor diff operation.\n */\nexport interface VendorDiffResult {\n packages: VendorPackageDiff[];\n totalChanges: number;\n}\n\n/**\n * Shape of the `<dir>/vendor.json` lock file (where `<dir>` is the\n * configured vendor directory, defaulting to `.vendor`).\n */\nexport interface VendorLock {\n /**\n * Git remote URL the vendored sources were synced from. Recorded so any\n * downstream tool (AI agent, CI script) can re-fetch without needing the\n * project's `alepha.config.ts`.\n */\n remote: string;\n /**\n * Commit hash of the synced sources.\n */\n commit: string;\n}\n\n/**\n * Handles syncing and diffing vendored packages from a remote git repository.\n */\nexport class VendorService {\n protected readonly log = $logger();\n protected readonly shell = $inject(ShellProvider);\n protected readonly fs = $inject(FileSystemProvider);\n\n /**\n * Sync vendored packages from a remote repository.\n *\n * Without `force`: checks for local modifications by comparing the local\n * copy against the last-synced commit (stored in `<dir>/vendor.json`).\n * If modifications are found, aborts without touching local files.\n *\n * With `force` (or first sync): replaces local copies unconditionally.\n */\n async sync(options: VendorSyncOptions): Promise<VendorSyncResult> {\n const synced: string[] = [];\n const errors: string[] = [];\n\n if (!options.force) {\n const lock = await this.readLock(options.root, options.dir);\n\n if (lock) {\n let baselineDir: string | undefined;\n try {\n baselineDir = await this.cloneAtCommit(options.remote, lock.commit);\n const diffResult = await this.diffFromClone(\n options.root,\n baselineDir,\n options.dir,\n options.packages,\n );\n\n if (diffResult.totalChanges > 0) {\n return { synced: [], errors: [], aborted: diffResult };\n }\n } finally {\n if (baselineDir) {\n await this.fs.rm(baselineDir, { recursive: true, force: true });\n }\n }\n }\n }\n\n let tmpDir: string | undefined;\n\n try {\n tmpDir = await this.cloneRemote(options.remote, options.branch);\n\n for (const pkg of options.packages) {\n const remotePkgDir = this.fs.join(tmpDir, REMOTE_DIR, pkg);\n const localPkgDir = this.fs.join(options.root, options.dir, pkg);\n\n const remoteExists = await this.fs.exists(remotePkgDir);\n if (!remoteExists) {\n errors.push(`Package \"${pkg}\" not found in remote`);\n continue;\n }\n\n this.log.debug(`Syncing package: ${pkg}`);\n\n await this.fs.rm(localPkgDir, { recursive: true, force: true });\n await this.fs.cp(remotePkgDir, localPkgDir, { recursive: true });\n await this.removeIgnoredFiles(localPkgDir);\n\n synced.push(pkg);\n }\n\n const commit = await this.getCommitHash(tmpDir);\n await this.writeLock(options.root, options.dir, {\n remote: options.remote,\n commit,\n });\n } finally {\n if (tmpDir) {\n await this.fs.rm(tmpDir, { recursive: true, force: true });\n }\n }\n\n return { synced, errors };\n }\n\n /**\n * Diff vendored packages against the last-synced commit.\n *\n * Reads the commit hash from `<dir>/vendor.json`, clones at that commit,\n * and compares local files to detect modifications since last sync.\n */\n async diff(options: VendorDiffOptions): Promise<VendorDiffResult> {\n const lock = await this.readLock(options.root, options.dir);\n if (!lock) {\n return { packages: [], totalChanges: 0 };\n }\n\n let tmpDir: string | undefined;\n\n try {\n tmpDir = await this.cloneAtCommit(options.remote, lock.commit);\n return await this.diffFromClone(\n options.root,\n tmpDir,\n options.dir,\n options.packages,\n );\n } finally {\n if (tmpDir) {\n await this.fs.rm(tmpDir, { recursive: true, force: true });\n }\n }\n }\n\n /**\n * Diff local packages against an already-cloned remote.\n */\n protected async diffFromClone(\n root: string,\n tmpDir: string,\n dir: string,\n packages: string[],\n ): Promise<VendorDiffResult> {\n const results: VendorPackageDiff[] = [];\n let totalChanges = 0;\n\n for (const pkg of packages) {\n const remotePkgDir = this.fs.join(tmpDir, REMOTE_DIR, pkg);\n const localPkgDir = this.fs.join(root, dir, pkg);\n\n const remoteExists = await this.fs.exists(remotePkgDir);\n const localExists = await this.fs.exists(localPkgDir);\n\n if (!remoteExists && !localExists) {\n results.push({ name: pkg, added: [], modified: [], removed: [] });\n continue;\n }\n\n if (!remoteExists) {\n // No baseline = everything local was added by user\n const localFiles = await this.fs.ls(localPkgDir, { recursive: true });\n results.push({\n name: pkg,\n added: localFiles,\n modified: [],\n removed: [],\n });\n totalChanges += localFiles.length;\n continue;\n }\n\n if (!localExists) {\n // Baseline exists but local doesn't = user deleted everything\n const remoteFiles = await this.fs.ls(remotePkgDir, { recursive: true });\n results.push({\n name: pkg,\n added: [],\n modified: [],\n removed: remoteFiles,\n });\n totalChanges += remoteFiles.length;\n continue;\n }\n\n const result = await this.diffDirectories(localPkgDir, remotePkgDir);\n const pkgChanges =\n result.added.length + result.modified.length + result.removed.length;\n totalChanges += pkgChanges;\n\n results.push({\n name: pkg,\n added: result.added,\n modified: result.modified,\n removed: result.removed,\n });\n }\n\n return { packages: results, totalChanges };\n }\n\n /**\n * Remove test files and ignored directories from a synced package.\n */\n protected async removeIgnoredFiles(pkgDir: string): Promise<void> {\n const allFiles = await this.fs.ls(pkgDir, { recursive: true });\n\n // Remove ignored files\n for (const file of allFiles) {\n if (\n file.endsWith(\".spec.ts\") ||\n file.endsWith(\".spec.tsx\") ||\n file === \"LICENSE\" ||\n file === \"tsdown.config.ts\"\n ) {\n await this.fs.rm(this.fs.join(pkgDir, file), { force: true });\n }\n }\n\n // Remove ignored directories (find all occurrences at any depth)\n for (const file of allFiles) {\n for (const ignored of this.ignoredPaths) {\n if (\n file === ignored ||\n file.startsWith(`${ignored}/`) ||\n file.includes(`/${ignored}/`) ||\n file.endsWith(`/${ignored}`)\n ) {\n // Extract the path to the ignored directory itself\n const idx = file.indexOf(ignored);\n const dirPath = this.fs.join(\n pkgDir,\n file.substring(0, idx + ignored.length),\n );\n await this.fs.rm(dirPath, { recursive: true, force: true });\n }\n }\n }\n }\n\n /**\n * Clone a remote repository into a temporary directory.\n */\n protected async cloneRemote(remote: string, branch: string): Promise<string> {\n const tmpDir = this.fs.join(\n process.env.TMPDIR || \"/tmp\",\n `.alepha-vendor-${Date.now()}`,\n );\n\n this.log.debug(`Cloning ${remote}#${branch} into ${tmpDir}`);\n\n const output = await this.shell.run(\n `git clone --depth 1 --branch ${branch} --filter=blob:none ${remote} ${tmpDir}`,\n { capture: true },\n );\n\n if (output) {\n this.log.debug(output);\n }\n\n return tmpDir;\n }\n\n /**\n * Clone a remote repository at a specific commit hash.\n */\n protected async cloneAtCommit(\n remote: string,\n commit: string,\n ): Promise<string> {\n const tmpDir = this.fs.join(\n process.env.TMPDIR || \"/tmp\",\n `.alepha-vendor-${Date.now()}`,\n );\n\n this.log.debug(`Cloning ${remote}@${commit} into ${tmpDir}`);\n\n await this.shell.run(`git init ${tmpDir}`, { capture: true });\n await this.shell.run(`git -C ${tmpDir} remote add origin ${remote}`, {\n capture: true,\n });\n await this.shell.run(`git -C ${tmpDir} fetch --depth 1 origin ${commit}`, {\n capture: true,\n });\n await this.shell.run(`git -C ${tmpDir} checkout FETCH_HEAD`, {\n capture: true,\n });\n\n return tmpDir;\n }\n\n /**\n * Get the HEAD commit hash from a cloned repository.\n */\n protected async getCommitHash(repoDir: string): Promise<string> {\n const hash = await this.shell.run(`git -C ${repoDir} rev-parse HEAD`, {\n capture: true,\n });\n return hash.trim();\n }\n\n /**\n * Read the vendor lock file at `<root>/<dir>/vendor.json`.\n */\n protected async readLock(\n root: string,\n dir: string,\n ): Promise<VendorLock | undefined> {\n const lockPath = this.fs.join(root, dir, \"vendor.json\");\n const exists = await this.fs.exists(lockPath);\n if (!exists) {\n return undefined;\n }\n const content = await this.fs.readFile(lockPath);\n return JSON.parse(content.toString());\n }\n\n /**\n * Write the vendor lock file to `<root>/<dir>/vendor.json`.\n */\n protected async writeLock(\n root: string,\n dir: string,\n lock: VendorLock,\n ): Promise<void> {\n const vendorDir = this.fs.join(root, dir);\n await this.fs.mkdir(vendorDir, { recursive: true });\n await this.fs.writeFile(\n this.fs.join(vendorDir, \"vendor.json\"),\n JSON.stringify(lock, null, 2),\n );\n }\n\n /**\n * Directories to ignore during diff comparisons.\n */\n protected readonly ignoredPaths = [\n \"__tests__\",\n \"assets/swagger-ui\",\n \"node_modules\",\n \"dist\",\n ];\n\n /**\n * Check if a file path should be ignored during diff.\n */\n protected isIgnored(filePath: string): boolean {\n if (\n filePath.endsWith(\".spec.ts\") ||\n filePath.endsWith(\".spec.tsx\") ||\n filePath === \"LICENSE\" ||\n filePath === \"tsdown.config.ts\"\n ) {\n return true;\n }\n return this.ignoredPaths.some(\n (p) =>\n filePath === p ||\n filePath.startsWith(`${p}/`) ||\n filePath.includes(`/${p}/`) ||\n filePath.endsWith(`/${p}`),\n );\n }\n\n /**\n * Recursively compare two directories and return the differences.\n */\n protected async diffDirectories(\n localDir: string,\n remoteDir: string,\n ): Promise<{\n added: string[];\n modified: VendorFileDiff[];\n removed: string[];\n }> {\n const added: string[] = [];\n const modified: VendorFileDiff[] = [];\n const removed: string[] = [];\n\n const [localFiles, remoteFiles] = await Promise.all([\n this.fs.ls(localDir, { recursive: true }),\n this.fs.ls(remoteDir, { recursive: true }),\n ]);\n\n const filteredLocal = localFiles.filter((f) => !this.isIgnored(f));\n const filteredRemote = remoteFiles.filter((f) => !this.isIgnored(f));\n\n const localSet = new Set(filteredLocal);\n const remoteSet = new Set(filteredRemote);\n\n // Files in baseline but not local = user deleted them\n for (const file of filteredRemote) {\n if (!localSet.has(file)) {\n removed.push(file);\n continue;\n }\n\n try {\n const [localContent, remoteContent] = await Promise.all([\n this.fs.readFile(this.fs.join(localDir, file)),\n this.fs.readFile(this.fs.join(remoteDir, file)),\n ]);\n\n if (!localContent.equals(remoteContent)) {\n const changes = this.computeLineDiff(\n remoteContent.toString(),\n localContent.toString(),\n );\n modified.push({ file, changes });\n }\n } catch {\n // Skip directories and unreadable entries\n }\n }\n\n // Files in local but not baseline = user added them\n for (const file of filteredLocal) {\n if (!remoteSet.has(file)) {\n added.push(file);\n }\n }\n\n return { added, modified, removed };\n }\n\n /**\n * Compute line-level differences between two file contents.\n *\n * Uses a longest-common-subsequence algorithm to produce minimal\n * added/removed line changes with accurate line numbers.\n */\n protected computeLineDiff(baseline: string, local: string): VendorLineDiff[] {\n const baseLines = baseline.split(\"\\n\");\n const localLines = local.split(\"\\n\");\n const lcs = this.longestCommonSubsequence(baseLines, localLines);\n const changes: VendorLineDiff[] = [];\n\n let bi = 0;\n let li = 0;\n let ci = 0;\n\n while (bi < baseLines.length || li < localLines.length) {\n if (ci < lcs.length && bi < baseLines.length && li < localLines.length) {\n if (baseLines[bi] === lcs[ci] && localLines[li] === lcs[ci]) {\n // Line is unchanged\n bi++;\n li++;\n ci++;\n } else if (baseLines[bi] !== lcs[ci]) {\n changes.push({ line: bi + 1, type: \"removed\", text: baseLines[bi] });\n bi++;\n } else {\n changes.push({ line: li + 1, type: \"added\", text: localLines[li] });\n li++;\n }\n } else if (bi < baseLines.length) {\n changes.push({ line: bi + 1, type: \"removed\", text: baseLines[bi] });\n bi++;\n } else {\n changes.push({ line: li + 1, type: \"added\", text: localLines[li] });\n li++;\n }\n }\n\n return changes;\n }\n\n /**\n * Compute the longest common subsequence of two string arrays.\n */\n protected longestCommonSubsequence(a: string[], b: string[]): string[] {\n const m = a.length;\n const n = b.length;\n const dp: number[][] = Array.from({ length: m + 1 }, () =>\n Array(n + 1).fill(0),\n );\n\n for (let i = 1; i <= m; i++) {\n for (let j = 1; j <= n; j++) {\n dp[i][j] =\n a[i - 1] === b[j - 1]\n ? dp[i - 1][j - 1] + 1\n : Math.max(dp[i - 1][j], dp[i][j - 1]);\n }\n }\n\n const result: string[] = [];\n let i = m;\n let j = n;\n while (i > 0 && j > 0) {\n if (a[i - 1] === b[j - 1]) {\n result.unshift(a[i - 1]);\n i--;\n j--;\n } else if (dp[i - 1][j] > dp[i][j - 1]) {\n i--;\n } else {\n j--;\n }\n }\n\n return result;\n }\n}\n","import { $inject, $state, AlephaError, z } from \"alepha\";\nimport { PackageManagerUtils } from \"alepha/cli\";\nimport { $command } from \"alepha/command\";\nimport { $logger, ConsoleColorProvider } from \"alepha/logger\";\nimport { vendorOptions } from \"../atoms/vendorOptions.ts\";\nimport type {\n VendorDiffResult,\n VendorPackageDiff,\n VendorSyncResult,\n} from \"../services/VendorService.ts\";\nimport { VendorService } from \"../services/VendorService.ts\";\n\n/**\n * Default remote when none is configured. The HTTPS URL is used so anyone\n * (CI runners, AI agents, contributors without SSH keys) can clone without\n * extra setup.\n */\nconst DEFAULT_REMOTE = \"https://github.com/feunard/alepha\";\n\nexport class VendorCommand {\n protected readonly log = $logger();\n protected readonly options = $state(vendorOptions);\n protected readonly vendorService = $inject(VendorService);\n protected readonly color = $inject(ConsoleColorProvider);\n protected readonly pm = $inject(PackageManagerUtils);\n\n /**\n * Ensure vendor config is present and return resolved options.\n */\n protected resolveOptions() {\n if (!this.options) {\n throw new AlephaError(\n 'Missing vendor configuration. Add a \"vendor\" section to alepha.config.ts.',\n );\n }\n return {\n remote: this.options.remote ?? DEFAULT_REMOTE,\n branch: this.options.branch ?? \"main\",\n dir: this.options.dir ?? \".vendor\",\n packages: this.options.packages,\n };\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // alepha vendor sync\n // ─────────────────────────────────────────────────────────────────────────\n\n protected readonly syncFlags = z.object({\n force: z\n .boolean()\n .meta({ aliases: [\"f\"] })\n .describe(\"Skip local modification check\")\n .optional(),\n remote: z\n .text({\n description:\n \"Override the configured remote for this invocation. Accepts any git-clone URL, including local paths (`file:///abs/path/to/alepha`). Useful for CI canaries that need to sync against a local checkout instead of the published repo.\",\n })\n .optional(),\n });\n\n protected readonly sync = $command({\n name: \"sync\",\n description: \"Replace local packages with remote source\",\n flags: this.syncFlags,\n handler: async ({ flags, root, run }) => {\n const opts = this.resolveOptions();\n const remote = flags.remote ?? opts.remote;\n const c = this.color;\n\n let result: VendorSyncResult = { synced: [], errors: [] };\n\n await run({\n name: `Syncing from ${opts.branch}`,\n handler: async () => {\n result = await this.vendorService.sync({\n root,\n remote,\n branch: opts.branch,\n dir: opts.dir,\n packages: opts.packages,\n force: flags.force,\n });\n },\n });\n\n if (result.aborted) {\n run.end();\n\n process.stdout.write(\n `\\nLocal modifications detected. Use ${c.set(\"CYAN\", \"--force\")} to overwrite.\\n`,\n );\n\n for (const pkg of result.aborted.packages) {\n this.printPackageDiff(pkg);\n }\n\n process.stdout.write(\"\\n\");\n return;\n }\n\n if (result.synced.length > 0) {\n const pmName = await this.pm.getPackageManager(root);\n await run(`${pmName} install`, { root });\n }\n\n run.end();\n\n if (result.errors.length > 0) {\n for (const error of result.errors) {\n process.stdout.write(`${c.set(\"RED\", \" error\")} ${error}\\n`);\n }\n }\n\n if (result.synced.length > 0) {\n process.stdout.write(\n `\\nSynced ${c.set(\"CYAN\", String(result.synced.length))} ${result.synced.length === 1 ? \"package\" : \"packages\"} from ${c.set(\"CYAN\", opts.branch)}\\n`,\n );\n for (const pkg of result.synced) {\n process.stdout.write(` ${c.set(\"GREEN\", \"\\u2713\")} ${pkg}\\n`);\n }\n }\n\n process.stdout.write(\"\\n\");\n },\n });\n\n // ─────────────────────────────────────────────────────────────────────────\n // alepha vendor diff\n // ─────────────────────────────────────────────────────────────────────────\n\n protected readonly diff = $command({\n name: \"diff\",\n description: \"Compare local packages against remote\",\n handler: async ({ root, run }) => {\n const opts = this.resolveOptions();\n\n let result: VendorDiffResult = { packages: [], totalChanges: 0 };\n\n await run({\n name: `Cloning ${opts.remote} at ${opts.branch}`,\n handler: async () => {\n result = await this.vendorService.diff({\n root,\n remote: opts.remote,\n branch: opts.branch,\n dir: opts.dir,\n packages: opts.packages,\n });\n },\n });\n\n run.end();\n\n if (result.totalChanges === 0) {\n process.stdout.write(\"\\nNo changes\\n\\n\");\n return;\n }\n\n for (const pkg of result.packages) {\n this.printPackageDiff(pkg);\n }\n\n process.stdout.write(\"\\n\");\n },\n });\n\n // ─────────────────────────────────────────────────────────────────────────\n // Helpers\n // ─────────────────────────────────────────────────────────────────────────\n\n protected printPackageDiff(pkg: VendorPackageDiff) {\n const c = this.color;\n const count = pkg.added.length + pkg.modified.length + pkg.removed.length;\n\n if (count === 0) {\n process.stdout.write(`\\n${c.set(\"CYAN\", pkg.name)}: no changes\\n`);\n return;\n }\n\n process.stdout.write(\n `\\n${c.set(\"CYAN\", pkg.name)}: ${count} ${count === 1 ? \"file differs\" : \"files differ\"}\\n`,\n );\n\n for (const file of pkg.added) {\n process.stdout.write(` ${c.set(\"GREEN\", \"A\")} ${file}\\n`);\n }\n\n for (const fileDiff of pkg.modified) {\n process.stdout.write(` ${c.set(\"ORANGE\", \"M\")} ${fileDiff.file}\\n`);\n for (const change of fileDiff.changes) {\n const prefix = change.type === \"removed\" ? \"-\" : \"+\";\n const color = change.type === \"removed\" ? \"RED\" : \"GREEN\";\n const lineNum = `L${change.line}`;\n process.stdout.write(\n ` ${c.set(\"DIM\", lineNum.padEnd(5))} ${c.set(color, `${prefix} ${change.text}`)}\\n`,\n );\n }\n }\n\n for (const file of pkg.removed) {\n process.stdout.write(` ${c.set(\"RED\", \"D\")} ${file}\\n`);\n }\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Parent command\n // ─────────────────────────────────────────────────────────────────────────\n\n public readonly vendor = $command({\n name: \"vendor\",\n description: \"Vendor Alepha packages into the project\",\n children: [this.sync, this.diff],\n handler: async ({ help }) => {\n help();\n },\n });\n}\n","import { $context, $module } from \"alepha\";\nimport { type VendorOptions, vendorOptions } from \"./atoms/vendorOptions.ts\";\nimport { VendorCommand } from \"./commands/VendorCommand.ts\";\nimport { VendorService } from \"./services/VendorService.ts\";\n\n// ---------------------------------------------------------------------------\n\n/**\n * CLI plugin for vendoring Alepha packages into external projects.\n *\n * Copies package source code from a git remote into the current project's\n * `packages/` directory. Useful for corporate projects that need a local\n * copy of Alepha for AI tooling, audits, documentation, or quick fixes.\n *\n * Commands:\n * - `alepha vendor sync` — replace local packages with remote source\n * - `alepha vendor diff` — compare local packages against remote HEAD\n *\n * Configuration in `alepha.config.ts`:\n *\n * ```typescript\n * import { vendor } from \"alepha/cli/vendor\";\n *\n * export default defineConfig({\n * plugins: [\n * vendor({\n * branch: \"main\",\n * packages: [\"alepha\", \"@alepha/payments-stripe\"],\n * }),\n * ],\n * });\n * ```\n */\nexport const AlephaCliVendorPlugin = $module({\n name: \"alepha.cli.plugins.vendor\",\n atoms: [vendorOptions],\n services: [VendorCommand, VendorService],\n});\n\nexport const vendor = (options: VendorOptions) => {\n return () => {\n const { alepha } = $context();\n alepha.with(AlephaCliVendorPlugin).set(vendorOptions, options);\n };\n};\n\n// ---------------------------------------------------------------------------\n\nexport * from \"./atoms/vendorOptions.ts\";\nexport * from \"./commands/VendorCommand.ts\";\nexport * from \"./services/VendorService.ts\";\n"],"mappings":"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"}