alepha 0.23.0 → 0.24.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (845) hide show
  1. package/assets/swagger-ui/swagger-ui-bundle.js +1 -1
  2. package/assets/swagger-ui/swagger-ui-standalone-preset.js +1 -1
  3. package/dist/api/audits/index.browser.js +49 -52
  4. package/dist/api/audits/index.browser.js.map +1 -1
  5. package/dist/api/audits/index.d.ts +629 -565
  6. package/dist/api/audits/index.d.ts.map +1 -1
  7. package/dist/api/audits/index.js +206 -98
  8. package/dist/api/audits/index.js.map +1 -1
  9. package/dist/api/files/index.browser.js +44 -44
  10. package/dist/api/files/index.browser.js.map +1 -1
  11. package/dist/api/files/index.d.ts +292 -293
  12. package/dist/api/files/index.d.ts.map +1 -1
  13. package/dist/api/files/index.js +61 -64
  14. package/dist/api/files/index.js.map +1 -1
  15. package/dist/api/jobs/index.browser.js +61 -59
  16. package/dist/api/jobs/index.browser.js.map +1 -1
  17. package/dist/api/jobs/index.d.ts +546 -347
  18. package/dist/api/jobs/index.d.ts.map +1 -1
  19. package/dist/api/jobs/index.js +165 -86
  20. package/dist/api/jobs/index.js.map +1 -1
  21. package/dist/api/keys/index.d.ts +247 -235
  22. package/dist/api/keys/index.d.ts.map +1 -1
  23. package/dist/api/keys/index.js +63 -66
  24. package/dist/api/keys/index.js.map +1 -1
  25. package/dist/api/notifications/index.browser.js +40 -38
  26. package/dist/api/notifications/index.browser.js.map +1 -1
  27. package/dist/api/notifications/index.d.ts +339 -209
  28. package/dist/api/notifications/index.d.ts.map +1 -1
  29. package/dist/api/notifications/index.js +108 -60
  30. package/dist/api/notifications/index.js.map +1 -1
  31. package/dist/api/oauth/index.d.ts +190 -78
  32. package/dist/api/oauth/index.d.ts.map +1 -1
  33. package/dist/api/oauth/index.js +290 -68
  34. package/dist/api/oauth/index.js.map +1 -1
  35. package/dist/api/organizations/index.browser.js +14 -14
  36. package/dist/api/organizations/index.browser.js.map +1 -1
  37. package/dist/api/organizations/index.d.ts +158 -134
  38. package/dist/api/organizations/index.d.ts.map +1 -1
  39. package/dist/api/organizations/index.js +18 -18
  40. package/dist/api/organizations/index.js.map +1 -1
  41. package/dist/api/parameters/index.browser.js +74 -53
  42. package/dist/api/parameters/index.browser.js.map +1 -1
  43. package/dist/api/parameters/index.d.ts +607 -513
  44. package/dist/api/parameters/index.d.ts.map +1 -1
  45. package/dist/api/parameters/index.js +205 -127
  46. package/dist/api/parameters/index.js.map +1 -1
  47. package/dist/api/payments/index.d.ts +652 -449
  48. package/dist/api/payments/index.d.ts.map +1 -1
  49. package/dist/api/payments/index.js +159 -93
  50. package/dist/api/payments/index.js.map +1 -1
  51. package/dist/api/subscriptions/index.d.ts +1032 -762
  52. package/dist/api/subscriptions/index.d.ts.map +1 -1
  53. package/dist/api/subscriptions/index.js +166 -185
  54. package/dist/api/subscriptions/index.js.map +1 -1
  55. package/dist/api/users/index.browser.js +48 -71
  56. package/dist/api/users/index.browser.js.map +1 -1
  57. package/dist/api/users/index.d.ts +1297 -1143
  58. package/dist/api/users/index.d.ts.map +1 -1
  59. package/dist/api/users/index.js +456 -392
  60. package/dist/api/users/index.js.map +1 -1
  61. package/dist/api/verifications/index.browser.js +17 -17
  62. package/dist/api/verifications/index.browser.js.map +1 -1
  63. package/dist/api/verifications/index.d.ts +167 -155
  64. package/dist/api/verifications/index.d.ts.map +1 -1
  65. package/dist/api/verifications/index.js +47 -95
  66. package/dist/api/verifications/index.js.map +1 -1
  67. package/dist/background/index.d.ts +0 -1
  68. package/dist/background/index.d.ts.map +1 -1
  69. package/dist/background/index.js.map +1 -1
  70. package/dist/background/index.workerd.js.map +1 -1
  71. package/dist/batch/index.d.ts +0 -1
  72. package/dist/batch/index.d.ts.map +1 -1
  73. package/dist/batch/index.js.map +1 -1
  74. package/dist/bin/index.js +1 -1
  75. package/dist/bin/index.js.map +1 -1
  76. package/dist/bucket/index.d.ts +27 -32
  77. package/dist/bucket/index.d.ts.map +1 -1
  78. package/dist/bucket/index.js +56 -26
  79. package/dist/bucket/index.js.map +1 -1
  80. package/dist/bucket/index.workerd.js +52 -24
  81. package/dist/bucket/index.workerd.js.map +1 -1
  82. package/dist/cache/core/index.d.ts +4 -6
  83. package/dist/cache/core/index.d.ts.map +1 -1
  84. package/dist/cache/core/index.js +4 -10
  85. package/dist/cache/core/index.js.map +1 -1
  86. package/dist/cache/core/index.workerd.js +4 -10
  87. package/dist/cache/core/index.workerd.js.map +1 -1
  88. package/dist/cache/database/index.d.ts +22 -23
  89. package/dist/cache/database/index.d.ts.map +1 -1
  90. package/dist/cache/database/index.js +11 -20
  91. package/dist/cache/database/index.js.map +1 -1
  92. package/dist/cache/redis/index.d.ts +3 -4
  93. package/dist/cache/redis/index.d.ts.map +1 -1
  94. package/dist/cache/redis/index.js +2 -2
  95. package/dist/cache/redis/index.js.map +1 -1
  96. package/dist/captcha/index.d.ts.map +1 -1
  97. package/dist/captcha/index.js +4 -4
  98. package/dist/captcha/index.js.map +1 -1
  99. package/dist/cli/config/index.d.ts +0 -1
  100. package/dist/cli/config/index.d.ts.map +1 -1
  101. package/dist/cli/core/index.d.ts +205 -442
  102. package/dist/cli/core/index.d.ts.map +1 -1
  103. package/dist/cli/core/index.js +259 -284
  104. package/dist/cli/core/index.js.map +1 -1
  105. package/dist/cli/devtools/index.d.ts +3 -9
  106. package/dist/cli/devtools/index.d.ts.map +1 -1
  107. package/dist/cli/devtools/index.js +3 -3
  108. package/dist/cli/devtools/index.js.map +1 -1
  109. package/dist/cli/i18n/index.d.ts +8 -34
  110. package/dist/cli/i18n/index.d.ts.map +1 -1
  111. package/dist/cli/i18n/index.js +6 -6
  112. package/dist/cli/i18n/index.js.map +1 -1
  113. package/dist/cli/platform/index.d.ts +89 -82
  114. package/dist/cli/platform/index.d.ts.map +1 -1
  115. package/dist/cli/platform/index.js +27 -33
  116. package/dist/cli/platform/index.js.map +1 -1
  117. package/dist/cli/platform-lib/index.d.ts +351 -404
  118. package/dist/cli/platform-lib/index.d.ts.map +1 -1
  119. package/dist/cli/platform-lib/index.js +218 -239
  120. package/dist/cli/platform-lib/index.js.map +1 -1
  121. package/dist/cli/vendor/index.d.ts +17 -41
  122. package/dist/cli/vendor/index.d.ts.map +1 -1
  123. package/dist/cli/vendor/index.js +10 -13
  124. package/dist/cli/vendor/index.js.map +1 -1
  125. package/dist/command/index.d.ts +83 -195
  126. package/dist/command/index.d.ts.map +1 -1
  127. package/dist/command/index.js +160 -563
  128. package/dist/command/index.js.map +1 -1
  129. package/dist/core/index.browser.js +845 -859
  130. package/dist/core/index.browser.js.map +1 -1
  131. package/dist/core/index.d.ts +787 -527
  132. package/dist/core/index.d.ts.map +1 -1
  133. package/dist/core/index.js +845 -859
  134. package/dist/core/index.js.map +1 -1
  135. package/dist/core/index.native.js +845 -859
  136. package/dist/core/index.native.js.map +1 -1
  137. package/dist/core/index.workerd.js +845 -859
  138. package/dist/core/index.workerd.js.map +1 -1
  139. package/dist/crypto/index.browser.js +1 -1
  140. package/dist/crypto/index.browser.js.map +1 -1
  141. package/dist/crypto/index.d.ts +3 -4
  142. package/dist/crypto/index.d.ts.map +1 -1
  143. package/dist/crypto/index.js +6 -3
  144. package/dist/crypto/index.js.map +1 -1
  145. package/dist/datetime/index.d.ts +12 -2
  146. package/dist/datetime/index.d.ts.map +1 -1
  147. package/dist/datetime/index.js +6 -1
  148. package/dist/datetime/index.js.map +1 -1
  149. package/dist/email/brevo/index.d.ts +0 -1
  150. package/dist/email/brevo/index.d.ts.map +1 -1
  151. package/dist/email/brevo/index.js +4 -4
  152. package/dist/email/brevo/index.js.map +1 -1
  153. package/dist/email/cloudflare/index.d.ts +0 -1
  154. package/dist/email/cloudflare/index.d.ts.map +1 -1
  155. package/dist/email/cloudflare/index.js +2 -2
  156. package/dist/email/cloudflare/index.js.map +1 -1
  157. package/dist/email/core/index.d.ts +15 -7
  158. package/dist/email/core/index.d.ts.map +1 -1
  159. package/dist/email/core/index.js +14 -5
  160. package/dist/email/core/index.js.map +1 -1
  161. package/dist/email/core/index.workerd.js +5 -1
  162. package/dist/email/core/index.workerd.js.map +1 -1
  163. package/dist/email/smtp/index.d.ts +8 -9
  164. package/dist/email/smtp/index.d.ts.map +1 -1
  165. package/dist/email/smtp/index.js +702 -479
  166. package/dist/email/smtp/index.js.map +1 -1
  167. package/dist/fake/index.d.ts +1580 -1238
  168. package/dist/fake/index.d.ts.map +1 -1
  169. package/dist/fake/index.js +11728 -32131
  170. package/dist/fake/index.js.map +1 -1
  171. package/dist/lock/core/index.d.ts +13 -9
  172. package/dist/lock/core/index.d.ts.map +1 -1
  173. package/dist/lock/core/index.js +5 -5
  174. package/dist/lock/core/index.js.map +1 -1
  175. package/dist/lock/redis/index.d.ts +0 -1
  176. package/dist/lock/redis/index.d.ts.map +1 -1
  177. package/dist/lock/redis/index.js.map +1 -1
  178. package/dist/logger/index.d.ts +81 -69
  179. package/dist/logger/index.d.ts.map +1 -1
  180. package/dist/logger/index.js +123 -56
  181. package/dist/logger/index.js.map +1 -1
  182. package/dist/mcp/index.d.ts +27 -90
  183. package/dist/mcp/index.d.ts.map +1 -1
  184. package/dist/mcp/index.js +42 -70
  185. package/dist/mcp/index.js.map +1 -1
  186. package/dist/orm/core/index.browser.js +54 -40
  187. package/dist/orm/core/index.browser.js.map +1 -1
  188. package/dist/orm/core/index.bun.js +140 -106
  189. package/dist/orm/core/index.bun.js.map +1 -1
  190. package/dist/orm/core/index.d.ts +145 -150
  191. package/dist/orm/core/index.d.ts.map +1 -1
  192. package/dist/orm/core/index.js +144 -109
  193. package/dist/orm/core/index.js.map +1 -1
  194. package/dist/orm/postgres/index.bun.js +64 -54
  195. package/dist/orm/postgres/index.bun.js.map +1 -1
  196. package/dist/orm/postgres/index.d.ts +36 -76
  197. package/dist/orm/postgres/index.d.ts.map +1 -1
  198. package/dist/orm/postgres/index.js +67 -57
  199. package/dist/orm/postgres/index.js.map +1 -1
  200. package/dist/queue/core/index.d.ts +62 -75
  201. package/dist/queue/core/index.d.ts.map +1 -1
  202. package/dist/queue/core/index.js +48 -71
  203. package/dist/queue/core/index.js.map +1 -1
  204. package/dist/queue/core/index.workerd.js +48 -71
  205. package/dist/queue/core/index.workerd.js.map +1 -1
  206. package/dist/queue/redis/index.d.ts +3 -4
  207. package/dist/queue/redis/index.d.ts.map +1 -1
  208. package/dist/queue/redis/index.js +2 -2
  209. package/dist/queue/redis/index.js.map +1 -1
  210. package/dist/react/auth/index.browser.js.map +1 -1
  211. package/dist/react/auth/index.d.ts +7 -4
  212. package/dist/react/auth/index.d.ts.map +1 -1
  213. package/dist/react/auth/index.js.map +1 -1
  214. package/dist/react/core/index.d.ts +87 -5
  215. package/dist/react/core/index.d.ts.map +1 -1
  216. package/dist/react/core/index.js +170 -23
  217. package/dist/react/core/index.js.map +1 -1
  218. package/dist/react/form/index.d.ts +4 -5
  219. package/dist/react/form/index.d.ts.map +1 -1
  220. package/dist/react/form/index.js +91 -56
  221. package/dist/react/form/index.js.map +1 -1
  222. package/dist/react/head/index.browser.js.map +1 -1
  223. package/dist/react/head/index.d.ts +0 -1
  224. package/dist/react/head/index.d.ts.map +1 -1
  225. package/dist/react/head/index.js.map +1 -1
  226. package/dist/react/i18n/index.d.ts +4 -5
  227. package/dist/react/i18n/index.d.ts.map +1 -1
  228. package/dist/react/i18n/index.js +2 -2
  229. package/dist/react/i18n/index.js.map +1 -1
  230. package/dist/react/intro/index.d.ts +1 -4
  231. package/dist/react/intro/index.d.ts.map +1 -1
  232. package/dist/react/intro/index.js.map +1 -1
  233. package/dist/react/router/index.browser.js +60 -24
  234. package/dist/react/router/index.browser.js.map +1 -1
  235. package/dist/react/router/index.d.ts +378 -377
  236. package/dist/react/router/index.d.ts.map +1 -1
  237. package/dist/react/router/index.js +77 -41
  238. package/dist/react/router/index.js.map +1 -1
  239. package/dist/react/sitemap/index.d.ts +0 -1
  240. package/dist/react/sitemap/index.d.ts.map +1 -1
  241. package/dist/react/sitemap/index.js.map +1 -1
  242. package/dist/react/testing/index.d.ts +4 -5
  243. package/dist/react/testing/index.d.ts.map +1 -1
  244. package/dist/react/testing/index.js +41 -15
  245. package/dist/react/testing/index.js.map +1 -1
  246. package/dist/react/testing/{chunk-BpyX8vjI.js → rolldown-runtime-Bl3dcgcQ.js} +1 -1
  247. package/dist/react/ui/index.d.ts +35 -34
  248. package/dist/react/ui/index.d.ts.map +1 -1
  249. package/dist/react/ui/index.js +12 -17
  250. package/dist/react/ui/index.js.map +1 -1
  251. package/dist/redis/index.bun.js +5 -5
  252. package/dist/redis/index.bun.js.map +1 -1
  253. package/dist/redis/index.d.ts +6 -7
  254. package/dist/redis/index.d.ts.map +1 -1
  255. package/dist/redis/index.js +6 -6
  256. package/dist/redis/index.js.map +1 -1
  257. package/dist/retry/index.d.ts +0 -1
  258. package/dist/retry/index.d.ts.map +1 -1
  259. package/dist/retry/index.js.map +1 -1
  260. package/dist/router/index.d.ts.map +1 -1
  261. package/dist/router/index.js.map +1 -1
  262. package/dist/scheduler/index.d.ts +4 -12
  263. package/dist/scheduler/index.d.ts.map +1 -1
  264. package/dist/scheduler/index.js +9 -4
  265. package/dist/scheduler/index.js.map +1 -1
  266. package/dist/scheduler/index.workerd.js +9 -4
  267. package/dist/scheduler/index.workerd.js.map +1 -1
  268. package/dist/security/index.browser.js +30 -28
  269. package/dist/security/index.browser.js.map +1 -1
  270. package/dist/security/index.d.ts +113 -44
  271. package/dist/security/index.d.ts.map +1 -1
  272. package/dist/security/index.js +452 -37
  273. package/dist/security/index.js.map +1 -1
  274. package/dist/server/auth/index.browser.js +19 -19
  275. package/dist/server/auth/index.browser.js.map +1 -1
  276. package/dist/server/auth/index.d.ts +198 -274
  277. package/dist/server/auth/index.d.ts.map +1 -1
  278. package/dist/server/auth/index.js +83 -621
  279. package/dist/server/auth/index.js.map +1 -1
  280. package/dist/server/cookies/index.browser.js +103 -5
  281. package/dist/server/cookies/index.browser.js.map +1 -1
  282. package/dist/server/cookies/index.d.ts +72 -5
  283. package/dist/server/cookies/index.d.ts.map +1 -1
  284. package/dist/server/cookies/index.js +103 -9
  285. package/dist/server/cookies/index.js.map +1 -1
  286. package/dist/server/core/index.browser.js +22 -27
  287. package/dist/server/core/index.browser.js.map +1 -1
  288. package/dist/server/core/index.d.ts +116 -85
  289. package/dist/server/core/index.d.ts.map +1 -1
  290. package/dist/server/core/index.js +105 -118
  291. package/dist/server/core/index.js.map +1 -1
  292. package/dist/server/cors/index.d.ts +9 -10
  293. package/dist/server/cors/index.d.ts.map +1 -1
  294. package/dist/server/cors/index.js +14 -26
  295. package/dist/server/cors/index.js.map +1 -1
  296. package/dist/server/etag/index.d.ts +2 -3
  297. package/dist/server/etag/index.d.ts.map +1 -1
  298. package/dist/server/etag/index.js.map +1 -1
  299. package/dist/server/health/index.d.ts +18 -19
  300. package/dist/server/health/index.d.ts.map +1 -1
  301. package/dist/server/health/index.js +6 -6
  302. package/dist/server/health/index.js.map +1 -1
  303. package/dist/server/links/index.browser.js +15 -18
  304. package/dist/server/links/index.browser.js.map +1 -1
  305. package/dist/server/links/index.d.ts +66 -67
  306. package/dist/server/links/index.d.ts.map +1 -1
  307. package/dist/server/links/index.js +29 -32
  308. package/dist/server/links/index.js.map +1 -1
  309. package/dist/server/metrics/index.d.ts +0 -1
  310. package/dist/server/metrics/index.d.ts.map +1 -1
  311. package/dist/server/metrics/index.js +10 -3
  312. package/dist/server/metrics/index.js.map +1 -1
  313. package/dist/server/proxy/index.d.ts +0 -1
  314. package/dist/server/proxy/index.d.ts.map +1 -1
  315. package/dist/server/proxy/index.js.map +1 -1
  316. package/dist/server/rate-limit/index.d.ts +8 -9
  317. package/dist/server/rate-limit/index.d.ts.map +1 -1
  318. package/dist/server/rate-limit/index.js +6 -12
  319. package/dist/server/rate-limit/index.js.map +1 -1
  320. package/dist/server/static/index.d.ts +0 -1
  321. package/dist/server/static/index.d.ts.map +1 -1
  322. package/dist/server/static/index.js.map +1 -1
  323. package/dist/server/swagger/index.d.ts +4 -4
  324. package/dist/server/swagger/index.d.ts.map +1 -1
  325. package/dist/server/swagger/index.js +37 -25
  326. package/dist/server/swagger/index.js.map +1 -1
  327. package/dist/sms/index.d.ts +0 -1
  328. package/dist/sms/index.d.ts.map +1 -1
  329. package/dist/sms/index.js.map +1 -1
  330. package/dist/system/index.browser.js.map +1 -1
  331. package/dist/system/index.d.ts +0 -1
  332. package/dist/system/index.d.ts.map +1 -1
  333. package/dist/system/index.js +2 -1
  334. package/dist/system/index.js.map +1 -1
  335. package/dist/system/index.workerd.js.map +1 -1
  336. package/dist/topic/core/index.d.ts +19 -20
  337. package/dist/topic/core/index.d.ts.map +1 -1
  338. package/dist/topic/core/index.js +8 -8
  339. package/dist/topic/core/index.js.map +1 -1
  340. package/dist/topic/redis/index.d.ts +3 -4
  341. package/dist/topic/redis/index.d.ts.map +1 -1
  342. package/dist/topic/redis/index.js +2 -2
  343. package/dist/topic/redis/index.js.map +1 -1
  344. package/package.json +22 -35
  345. package/src/api/audits/__tests__/AuditJobs.spec.ts +83 -0
  346. package/src/api/audits/__tests__/AuditService.spec.ts +139 -1
  347. package/src/api/audits/controllers/AdminAuditController.ts +41 -41
  348. package/src/api/audits/entities/audits.ts +22 -22
  349. package/src/api/audits/index.ts +6 -1
  350. package/src/api/audits/jobs/AuditJobs.ts +29 -0
  351. package/src/api/audits/parameters/AuditParameters.ts +51 -0
  352. package/src/api/audits/primitives/$audit.ts +24 -0
  353. package/src/api/audits/schemas/auditQuerySchema.ts +13 -13
  354. package/src/api/audits/schemas/createAuditSchema.ts +18 -18
  355. package/src/api/audits/services/AuditService.ts +79 -7
  356. package/src/api/files/__tests__/FileController.spec.ts +5 -5
  357. package/src/api/files/__tests__/FileJobs.spec.ts +6 -0
  358. package/src/api/files/controllers/FileController.ts +25 -25
  359. package/src/api/files/entities/files.ts +15 -15
  360. package/src/api/files/schemas/fileCreatorSummarySchema.ts +7 -7
  361. package/src/api/files/schemas/fileQuerySchema.ts +9 -9
  362. package/src/api/files/schemas/fileResourceSchema.ts +7 -9
  363. package/src/api/files/schemas/storageStatsSchema.ts +13 -13
  364. package/src/api/jobs/__tests__/$job-hardening.spec.ts +289 -0
  365. package/src/api/jobs/__tests__/$job.spec.ts +18 -18
  366. package/src/api/jobs/controllers/AdminJobController.ts +8 -8
  367. package/src/api/jobs/entities/jobExecutionEntity.ts +29 -19
  368. package/src/api/jobs/providers/JobProvider.ts +128 -12
  369. package/src/api/jobs/providers/JobQueueProvider.ts +2 -2
  370. package/src/api/jobs/schemas/jobConfigAtom.ts +22 -22
  371. package/src/api/jobs/schemas/jobExecutionQuerySchema.ts +6 -6
  372. package/src/api/jobs/schemas/jobExecutionResourceSchema.ts +11 -15
  373. package/src/api/jobs/schemas/jobRegistrationSchema.ts +20 -19
  374. package/src/api/jobs/schemas/triggerJobSchema.ts +3 -3
  375. package/src/api/jobs/services/JobService.ts +6 -6
  376. package/src/api/keys/__tests__/ApiKeyService.spec.ts +2 -2
  377. package/src/api/keys/controllers/AdminApiKeyController.ts +10 -10
  378. package/src/api/keys/entities/apiKeyEntity.ts +15 -15
  379. package/src/api/keys/schemas/adminApiKeyQuerySchema.ts +4 -4
  380. package/src/api/keys/schemas/adminApiKeyResourceSchema.ts +15 -15
  381. package/src/api/keys/schemas/createApiKeyBodySchema.ts +5 -5
  382. package/src/api/keys/schemas/createApiKeyResponseSchema.ts +9 -9
  383. package/src/api/keys/schemas/listApiKeyResponseSchema.ts +13 -13
  384. package/src/api/keys/schemas/revokeApiKeyParamsSchema.ts +3 -3
  385. package/src/api/keys/schemas/revokeApiKeyResponseSchema.ts +3 -3
  386. package/src/api/notifications/__tests__/AlephaApiNotifications.spec.ts +2 -2
  387. package/src/api/notifications/controllers/AdminNotificationController.ts +38 -14
  388. package/src/api/notifications/jobs/NotificationJobs.ts +7 -6
  389. package/src/api/notifications/primitives/$notification.ts +43 -4
  390. package/src/api/notifications/schemas/notificationContactPreferencesSchema.ts +4 -4
  391. package/src/api/notifications/schemas/notificationContactSchema.ts +7 -7
  392. package/src/api/notifications/schemas/notificationDetailResourceSchema.ts +9 -11
  393. package/src/api/notifications/schemas/notificationPayloadSchema.ts +11 -9
  394. package/src/api/notifications/schemas/notificationQuerySchema.ts +6 -6
  395. package/src/api/notifications/schemas/notificationResourceSchema.ts +14 -14
  396. package/src/api/notifications/services/NotificationSenderService.ts +38 -2
  397. package/src/api/oauth/__tests__/OAuthClientService.spec.ts +42 -0
  398. package/src/api/oauth/__tests__/OAuthController.spec.ts +128 -0
  399. package/src/api/oauth/controllers/OAuthController.ts +132 -12
  400. package/src/api/oauth/entities/oauthClientEntity.ts +29 -12
  401. package/src/api/oauth/helpers/oauthMetadata.ts +1 -0
  402. package/src/api/oauth/helpers/oidcMetadata.ts +19 -0
  403. package/src/api/oauth/index.ts +1 -0
  404. package/src/api/oauth/schemas/authorizeDecisionBodySchema.ts +12 -11
  405. package/src/api/oauth/schemas/authorizeQuerySchema.ts +12 -10
  406. package/src/api/oauth/schemas/registerClientBodySchema.ts +10 -11
  407. package/src/api/oauth/schemas/tokenRequestBodySchema.ts +9 -8
  408. package/src/api/oauth/services/OAuthClientService.ts +228 -15
  409. package/src/api/organizations/controllers/AdminOrganizationController.ts +8 -8
  410. package/src/api/organizations/entities/organizations.ts +6 -6
  411. package/src/api/organizations/schemas/createOrganizationSchema.ts +5 -5
  412. package/src/api/organizations/schemas/organizationQuerySchema.ts +4 -4
  413. package/src/api/organizations/schemas/updateOrganizationSchema.ts +1 -2
  414. package/src/api/parameters/__tests__/$parameter.spec.ts +229 -50
  415. package/src/api/parameters/controllers/AdminParameterController.ts +9 -12
  416. package/src/api/parameters/entities/parameters.ts +29 -16
  417. package/src/api/parameters/primitives/$parameter.ts +3 -3
  418. package/src/api/parameters/schemas/activateParameterBodySchema.ts +4 -4
  419. package/src/api/parameters/schemas/createParameterVersionBodySchema.ts +15 -15
  420. package/src/api/parameters/schemas/parameterCreatorSummarySchema.ts +7 -7
  421. package/src/api/parameters/schemas/parameterCurrentResponseSchema.ts +7 -7
  422. package/src/api/parameters/schemas/parameterHistoryResponseSchema.ts +3 -3
  423. package/src/api/parameters/schemas/parameterNameParamSchema.ts +2 -3
  424. package/src/api/parameters/schemas/parameterNamesResponseSchema.ts +3 -3
  425. package/src/api/parameters/schemas/parameterResponseSchema.ts +3 -3
  426. package/src/api/parameters/schemas/parameterStatusSchema.ts +2 -2
  427. package/src/api/parameters/schemas/parameterTreeNodeSchema.ts +6 -6
  428. package/src/api/parameters/schemas/parameterVersionParamSchema.ts +5 -6
  429. package/src/api/parameters/schemas/parameterVersionResponseSchema.ts +3 -3
  430. package/src/api/parameters/schemas/rollbackParameterBodySchema.ts +6 -9
  431. package/src/api/parameters/services/ParameterProvider.ts +152 -65
  432. package/src/api/payments/controllers/AdminPaymentController.ts +7 -7
  433. package/src/api/payments/controllers/MockCheckoutController.ts +79 -28
  434. package/src/api/payments/controllers/PaymentController.ts +4 -4
  435. package/src/api/payments/entities/paymentIntents.ts +11 -11
  436. package/src/api/payments/entities/paymentMethods.ts +11 -11
  437. package/src/api/payments/entities/refunds.ts +9 -9
  438. package/src/api/payments/providers/PaymentProvider.ts +18 -0
  439. package/src/api/payments/schemas/intentSchemas.ts +25 -25
  440. package/src/api/payments/schemas/paymentMethodSchemas.ts +3 -3
  441. package/src/api/payments/services/PaymentService.ts +60 -3
  442. package/src/api/subscriptions/__tests__/SubscriptionService.spec.ts +14 -0
  443. package/src/api/subscriptions/controllers/AdminSubscriptionController.ts +11 -11
  444. package/src/api/subscriptions/controllers/SubscriptionController.ts +5 -4
  445. package/src/api/subscriptions/entities/subscriptionEvents.ts +15 -15
  446. package/src/api/subscriptions/entities/subscriptions.ts +22 -22
  447. package/src/api/subscriptions/notifications/SubscriptionNotifications.ts +22 -22
  448. package/src/api/subscriptions/schemas/cancelSubscriptionSchema.ts +4 -4
  449. package/src/api/subscriptions/schemas/changePlanSchema.ts +5 -5
  450. package/src/api/subscriptions/schemas/createSubscriptionSchema.ts +14 -7
  451. package/src/api/subscriptions/schemas/entitlementsSchema.ts +10 -10
  452. package/src/api/subscriptions/schemas/mrrSchema.ts +9 -9
  453. package/src/api/subscriptions/schemas/planDefinitionSchema.ts +21 -21
  454. package/src/api/subscriptions/schemas/planResourceSchema.ts +19 -19
  455. package/src/api/subscriptions/schemas/subscriptionQuerySchema.ts +8 -8
  456. package/src/api/subscriptions/schemas/subscriptionSettingsSchema.ts +7 -7
  457. package/src/api/subscriptions/schemas/subscriptionStatsSchema.ts +17 -17
  458. package/src/api/subscriptions/services/SubscriptionConfig.ts +2 -2
  459. package/src/api/users/__tests__/ApiKeys-integration.spec.ts +11 -11
  460. package/src/api/users/atoms/realmAuthSettingsAtom.ts +111 -119
  461. package/src/api/users/controllers/AdminIdentityController.ts +29 -19
  462. package/src/api/users/controllers/AdminSessionController.ts +37 -27
  463. package/src/api/users/controllers/AdminUserController.ts +75 -53
  464. package/src/api/users/controllers/MySessionController.ts +125 -0
  465. package/src/api/users/controllers/RealmController.ts +9 -10
  466. package/src/api/users/controllers/UserController.ts +55 -55
  467. package/src/api/users/entities/identities.ts +8 -8
  468. package/src/api/users/entities/sessions.ts +17 -17
  469. package/src/api/users/entities/users.ts +17 -17
  470. package/src/api/users/index.ts +3 -0
  471. package/src/api/users/notifications/UserNotifications.ts +76 -24
  472. package/src/api/users/primitives/$realm.ts +12 -26
  473. package/src/api/users/providers/RealmProvider.ts +0 -15
  474. package/src/api/users/schemas/completePasswordResetRequestSchema.ts +8 -12
  475. package/src/api/users/schemas/completeRegistrationRequestSchema.ts +17 -20
  476. package/src/api/users/schemas/createUserSchema.ts +2 -2
  477. package/src/api/users/schemas/identityQuerySchema.ts +4 -4
  478. package/src/api/users/schemas/identityResourceSchema.ts +3 -2
  479. package/src/api/users/schemas/loginSchema.ts +4 -4
  480. package/src/api/users/schemas/passwordResetIntentResponseSchema.ts +6 -8
  481. package/src/api/users/schemas/realmConfigSchema.ts +10 -24
  482. package/src/api/users/schemas/registerQuerySchema.ts +6 -6
  483. package/src/api/users/schemas/registerRequestSchema.ts +21 -43
  484. package/src/api/users/schemas/registerResponseSchema.ts +2 -2
  485. package/src/api/users/schemas/registerSchema.ts +13 -31
  486. package/src/api/users/schemas/registrationIntentResponseSchema.ts +19 -23
  487. package/src/api/users/schemas/resetPasswordSchema.ts +10 -17
  488. package/src/api/users/schemas/sessionQuerySchema.ts +3 -3
  489. package/src/api/users/schemas/sessionResourceSchema.ts +25 -25
  490. package/src/api/users/schemas/updateUserSchema.ts +3 -4
  491. package/src/api/users/schemas/userQuerySchema.ts +7 -7
  492. package/src/api/users/services/RegistrationService.ts +25 -11
  493. package/src/api/users/services/UserService.ts +12 -6
  494. package/src/api/verifications/__tests__/CodeVerification.spec.ts +63 -101
  495. package/src/api/verifications/__tests__/LinkVerification.spec.ts +23 -92
  496. package/src/api/verifications/controllers/VerificationController.ts +13 -27
  497. package/src/api/verifications/entities/verifications.ts +13 -14
  498. package/src/api/verifications/schemas/requestVerificationCodeResponseSchema.ts +17 -14
  499. package/src/api/verifications/schemas/validateVerificationCodeResponseSchema.ts +9 -10
  500. package/src/api/verifications/schemas/verificationSettingsSchema.ts +65 -66
  501. package/src/api/verifications/schemas/verificationTypeEnumSchema.ts +2 -2
  502. package/src/api/verifications/services/VerificationService.ts +12 -0
  503. package/src/background/__tests__/BackgroundTaskProvider.spec.ts +36 -0
  504. package/src/batch/__tests__/$batch.spec.ts +22 -22
  505. package/src/batch/__tests__/startup-buffering.spec.ts +9 -9
  506. package/src/bin/index.ts +1 -1
  507. package/src/bucket/__tests__/TenantScopedBucket.spec.ts +60 -0
  508. package/src/bucket/providers/LocalFileStorageProvider.ts +14 -6
  509. package/src/bucket/providers/MemoryFileStorageProvider.ts +18 -7
  510. package/src/bucket/providers/R2FileStorageProvider.ts +14 -6
  511. package/src/bucket/providers/S3FileStorageProvider.ts +31 -15
  512. package/src/cache/core/primitives/$cache.ts +7 -10
  513. package/src/cache/database/entities/cacheEntries.ts +16 -27
  514. package/src/cache/database/providers/DatabaseCacheProvider.ts +15 -13
  515. package/src/cache/redis/providers/RedisCacheProvider.ts +6 -6
  516. package/src/captcha/providers/TurnstileCaptchaProvider.ts +4 -4
  517. package/src/cli/core/__tests__/BuildCloudflareTask.spec.ts +178 -0
  518. package/src/cli/core/__tests__/BuildDockerTask.spec.ts +0 -2
  519. package/src/cli/core/__tests__/DbCommand.spec.ts +108 -0
  520. package/src/cli/core/atoms/appEntryOptions.ts +5 -5
  521. package/src/cli/core/atoms/buildOptions.ts +76 -76
  522. package/src/cli/core/atoms/changelogOptions.ts +3 -3
  523. package/src/cli/core/atoms/devOptions.ts +3 -3
  524. package/src/cli/core/commands/build.ts +36 -39
  525. package/src/cli/core/commands/db.ts +171 -83
  526. package/src/cli/core/commands/dev.ts +8 -8
  527. package/src/cli/core/commands/gen/changelog.ts +12 -14
  528. package/src/cli/core/commands/gen/env.ts +6 -6
  529. package/src/cli/core/commands/gen/openapi.ts +6 -6
  530. package/src/cli/core/commands/init.ts +28 -33
  531. package/src/cli/core/commands/pack.ts +10 -10
  532. package/src/cli/core/commands/root.ts +7 -8
  533. package/src/cli/core/commands/test.ts +17 -20
  534. package/src/cli/core/tasks/BuildCloudflareTask.ts +103 -230
  535. package/src/cli/core/templates/apiHelloResponseSchemaTs.ts +4 -4
  536. package/src/cli/devtools/atoms/devtoolsOptions.ts +6 -6
  537. package/src/cli/i18n/atoms/i18nOptions.ts +8 -8
  538. package/src/cli/platform/commands/SecretsCommand.ts +24 -25
  539. package/src/cli/platform/commands/platform.ts +40 -46
  540. package/src/cli/platform/index.ts +1 -1
  541. package/src/cli/platform-lib/__tests__/CloudflareAdapter.spec.ts +0 -4
  542. package/src/cli/platform-lib/__tests__/PlatformInspector.spec.ts +10 -3
  543. package/src/cli/platform-lib/__tests__/VercelAdapter.spec.ts +0 -2
  544. package/src/cli/platform-lib/adapters/CloudflareAdapter.ts +13 -14
  545. package/src/cli/platform-lib/adapters/VercelAdapter.ts +6 -11
  546. package/src/cli/platform-lib/atoms/platformOptions.ts +46 -25
  547. package/src/cli/platform-lib/schemas/cloudflare.ts +87 -87
  548. package/src/cli/platform-lib/schemas/platform.ts +51 -51
  549. package/src/cli/platform-lib/schemas/vercel.ts +28 -28
  550. package/src/cli/platform-lib/services/CloudflareApi.ts +5 -5
  551. package/src/cli/platform-lib/services/VercelApi.ts +4 -4
  552. package/src/cli/platform-lib/services/VercelCli.ts +6 -15
  553. package/src/cli/platform-lib/services/WranglerApi.ts +6 -15
  554. package/src/cli/vendor/atoms/vendorOptions.ts +9 -9
  555. package/src/cli/vendor/commands/VendorCommand.ts +11 -12
  556. package/src/command/__tests__/$command.spec.ts +82 -83
  557. package/src/command/__tests__/Asker.spec.ts +6 -13
  558. package/src/command/__tests__/CliProvider.spec.ts +136 -149
  559. package/src/command/__tests__/Runner.spec.ts +86 -110
  560. package/src/command/helpers/Asker.ts +23 -58
  561. package/src/command/helpers/Runner.ts +34 -110
  562. package/src/command/index.ts +4 -9
  563. package/src/command/primitives/$command.ts +10 -10
  564. package/src/command/providers/CliProvider.ts +183 -161
  565. package/src/core/Alepha.ts +62 -13
  566. package/src/core/__tests__/$atom.spec.ts +52 -3
  567. package/src/core/__tests__/$computed.spec.ts +129 -0
  568. package/src/core/__tests__/$env.spec.ts +13 -13
  569. package/src/core/__tests__/$inject.spec.ts +4 -4
  570. package/src/core/__tests__/$module.spec.ts +1 -1
  571. package/src/core/__tests__/Alepha-graph.spec.ts +1 -1
  572. package/src/core/__tests__/Alepha-parseEnv.spec.ts +32 -32
  573. package/src/core/__tests__/Alepha-start.spec.ts +3 -3
  574. package/src/core/__tests__/CodecManager.spec.ts +113 -94
  575. package/src/core/__tests__/KeylessJsonSchemaCodec.spec.ts +138 -138
  576. package/src/core/__tests__/SchemaValidator.spec.ts +43 -44
  577. package/src/core/__tests__/StateManager.persist.browser.spec.ts +87 -0
  578. package/src/core/__tests__/StateManager.spec.ts +423 -0
  579. package/src/core/__tests__/TypeBox-usecases.spec.ts +8 -8
  580. package/src/core/__tests__/TypeProvider.spec.ts +314 -309
  581. package/src/core/__tests__/dump.spec.ts +6 -6
  582. package/src/core/__tests__/pagination.spec.ts +4 -4
  583. package/src/core/__tests__/scoped-after-start.spec.ts +43 -0
  584. package/src/core/errors/TypeBoxError.ts +10 -4
  585. package/src/core/helpers/FileLike.ts +5 -5
  586. package/src/core/helpers/coerceStrings.ts +70 -0
  587. package/src/core/helpers/jsonSchemaToZod.ts +112 -0
  588. package/src/core/index.shared.ts +4 -1
  589. package/src/core/primitives/$atom.ts +95 -27
  590. package/src/core/primitives/$computed.ts +148 -0
  591. package/src/core/primitives/$env.ts +5 -5
  592. package/src/core/primitives/$state.ts +1 -1
  593. package/src/core/providers/AlsProvider.ts +26 -0
  594. package/src/core/providers/CodecManager.ts +1 -2
  595. package/src/core/providers/JsonSchemaCodec.ts +1 -2
  596. package/src/core/providers/KeylessJsonSchemaCodec.ts +82 -57
  597. package/src/core/providers/SchemaValidator.ts +48 -158
  598. package/src/core/providers/StateManager.ts +383 -9
  599. package/src/core/providers/TypeProvider.ts +80 -734
  600. package/src/core/providers/ZodProvider.ts +380 -0
  601. package/src/core/providers/zodAugment.ts +69 -0
  602. package/src/core/schemas/pageQuerySchema.ts +19 -21
  603. package/src/core/schemas/pageSchema.ts +47 -57
  604. package/src/crypto/__tests__/SecretProvider.spec.ts +31 -0
  605. package/src/crypto/providers/SecretProvider.ts +16 -10
  606. package/src/datetime/primitives/$throttle.ts +6 -1
  607. package/src/email/brevo/providers/BrevoEmailProvider.ts +4 -4
  608. package/src/email/cloudflare/providers/CloudflareEmailProvider.ts +6 -6
  609. package/src/email/core/index.ts +7 -2
  610. package/src/email/core/primitives/$email.ts +5 -1
  611. package/src/email/core/providers/LocalEmailProvider.ts +5 -5
  612. package/src/email/smtp/providers/NodemailerEmailProvider.ts +41 -52
  613. package/src/fake/__tests__/FakeProvider.spec.ts +110 -110
  614. package/src/fake/__tests__/keyName.example.ts +21 -21
  615. package/src/fake/__tests__/keyName.spec.ts +41 -41
  616. package/src/fake/__tests__/module.example.ts +8 -8
  617. package/src/fake/providers/FakeProvider.ts +122 -121
  618. package/src/lock/core/__tests__/lock-mutual-exclusion.spec.ts +44 -0
  619. package/src/lock/core/index.ts +1 -0
  620. package/src/lock/core/primitives/$lock.ts +13 -6
  621. package/src/logger/__tests__/CliFormatterProvider.spec.ts +76 -0
  622. package/src/logger/__tests__/Logger.spec.ts +49 -0
  623. package/src/logger/index.ts +25 -18
  624. package/src/logger/providers/CliFormatterProvider.ts +75 -0
  625. package/src/logger/schemas/logEntrySchema.ts +10 -10
  626. package/src/logger/services/Logger.ts +18 -0
  627. package/src/mcp/__tests__/$prompt.spec.ts +21 -23
  628. package/src/mcp/__tests__/$tool.spec.ts +22 -22
  629. package/src/mcp/__tests__/McpServerProvider.spec.ts +11 -11
  630. package/src/mcp/__tests__/StreamableHttpMcpTransport.spec.ts +2 -2
  631. package/src/mcp/__tests__/integration.spec.ts +33 -33
  632. package/src/mcp/primitives/$prompt.ts +11 -9
  633. package/src/mcp/primitives/$tool.ts +27 -86
  634. package/src/mcp/transports/StreamableHttpMcpTransport.ts +7 -7
  635. package/src/orm/__tests__/$repository-tests.ts +133 -27
  636. package/src/orm/__tests__/$repository.spec.ts +23 -0
  637. package/src/orm/__tests__/$transactional-tests.ts +4 -4
  638. package/src/orm/__tests__/ModelBuilder-tests.ts +28 -28
  639. package/src/orm/__tests__/ModelBuilder.spec.ts +124 -106
  640. package/src/orm/__tests__/QueryManager.spec.ts +5 -5
  641. package/src/orm/__tests__/delete-returning-tests.ts +11 -11
  642. package/src/orm/__tests__/deletedAt-tests.ts +3 -3
  643. package/src/orm/__tests__/enums.spec.ts +29 -25
  644. package/src/orm/__tests__/execute-tests.ts +8 -8
  645. package/src/orm/__tests__/fixtures/bigEntitySchema.ts +48 -48
  646. package/src/orm/__tests__/fixtures/userEntitySchema.ts +6 -6
  647. package/src/orm/__tests__/joins-tests.ts +30 -30
  648. package/src/orm/__tests__/organization-tests.ts +105 -3
  649. package/src/orm/__tests__/organization.spec.ts +46 -0
  650. package/src/orm/__tests__/orm-errors.spec.ts +10 -10
  651. package/src/orm/__tests__/orm-next-tests.ts +29 -29
  652. package/src/orm/__tests__/orm-showcase-tests.ts +9 -9
  653. package/src/orm/__tests__/primaryKey.spec.ts +4 -4
  654. package/src/orm/__tests__/query-date-encoding-tests.ts +17 -17
  655. package/src/orm/__tests__/ref-auto-onDelete.spec.ts +14 -14
  656. package/src/orm/__tests__/references.spec.ts +7 -7
  657. package/src/orm/__tests__/security.spec.ts +17 -17
  658. package/src/orm/__tests__/string-operators-tests.ts +5 -5
  659. package/src/orm/__tests__/timestamps-tests.ts +14 -14
  660. package/src/orm/__tests__/validation-tests.ts +5 -5
  661. package/src/orm/core/__tests__/BunSqliteProvider.bun.spec.ts +8 -8
  662. package/src/orm/core/constants/PG_SYMBOLS.ts +13 -1
  663. package/src/orm/core/entities/alephaSequences.ts +8 -8
  664. package/src/orm/core/helpers/pgAttr.ts +4 -4
  665. package/src/orm/core/primitives/$entity.ts +10 -6
  666. package/src/orm/core/providers/DatabaseTypeProvider.ts +46 -53
  667. package/src/orm/core/providers/drivers/BunSqliteProvider.ts +8 -8
  668. package/src/orm/core/providers/drivers/CloudflareD1Provider.ts +3 -5
  669. package/src/orm/core/providers/drivers/NodeSqliteProvider.ts +8 -8
  670. package/src/orm/core/schemas/databaseEnvSchema.ts +4 -4
  671. package/src/orm/core/schemas/insertSchema.ts +14 -18
  672. package/src/orm/core/schemas/legacyIdSchema.ts +2 -2
  673. package/src/orm/core/schemas/updateSchema.ts +10 -16
  674. package/src/orm/core/services/PgRelationManager.ts +2 -2
  675. package/src/orm/core/services/QueryManager.ts +13 -2
  676. package/src/orm/core/services/Repository.ts +88 -33
  677. package/src/orm/core/services/SqliteModelBuilder.ts +38 -45
  678. package/src/orm/postgres/__tests__/BunPostgresProvider.bun.spec.ts +4 -4
  679. package/src/orm/postgres/providers/CloudflareHyperdriveProvider.ts +4 -6
  680. package/src/orm/postgres/schemas/postgresEnvSchema.ts +6 -6
  681. package/src/orm/postgres/services/PostgresModelBuilder.ts +127 -114
  682. package/src/queue/core/__tests__/$consumer.spec.ts +4 -4
  683. package/src/queue/core/__tests__/WorkerProvider.spec.ts +4 -4
  684. package/src/queue/core/__tests__/shared.ts +6 -6
  685. package/src/queue/core/primitives/$consumer.ts +5 -5
  686. package/src/queue/core/primitives/$queue.ts +44 -61
  687. package/src/queue/core/providers/CloudflareQueueProvider.ts +6 -0
  688. package/src/queue/core/providers/WorkerProvider.ts +17 -14
  689. package/src/queue/redis/providers/RedisQueueProvider.ts +3 -3
  690. package/src/react/core/__tests__/ErrorBoundary.browser.spec.tsx +92 -0
  691. package/src/react/core/__tests__/Router.spec.tsx +4 -4
  692. package/src/react/core/__tests__/useComputed.browser.spec.tsx +192 -0
  693. package/src/react/core/__tests__/useQuery.browser.spec.tsx +48 -0
  694. package/src/react/core/__tests__/useSelector.browser.spec.tsx +105 -0
  695. package/src/react/core/__tests__/useStore.browser.spec.tsx +113 -0
  696. package/src/react/core/components/ErrorBoundary.tsx +42 -0
  697. package/src/react/core/hooks/useAction.ts +56 -19
  698. package/src/react/core/hooks/useComputed.ts +91 -0
  699. package/src/react/core/hooks/useSelector.ts +67 -0
  700. package/src/react/core/hooks/useStore.ts +36 -17
  701. package/src/react/core/index.ts +3 -0
  702. package/src/react/core/utils/shallowEqual.ts +36 -0
  703. package/src/react/form/__tests__/FormModel-submit-loading.spec.ts +2 -2
  704. package/src/react/form/__tests__/form-submitting-reactive.browser.spec.tsx +5 -5
  705. package/src/react/form/__tests__/useForm.browser.spec.tsx +54 -54
  706. package/src/react/form/errors/FormValidationError.ts +0 -2
  707. package/src/react/form/hooks/useForm.ts +19 -4
  708. package/src/react/form/hooks/useFormQuerySync.ts +0 -0
  709. package/src/react/form/services/FormModel.ts +67 -47
  710. package/src/react/form/services/parseField.ts +66 -27
  711. package/src/react/i18n/__tests__/Localize.spec.tsx +1 -1
  712. package/src/react/i18n/providers/I18nProvider.ts +2 -2
  713. package/src/react/router/__tests__/$page.browser.spec.tsx +19 -19
  714. package/src/react/router/__tests__/$page.spec.tsx +21 -21
  715. package/src/react/router/__tests__/ReactBrowserProvider.browser.spec.ts +87 -1
  716. package/src/react/router/atoms/ssrManifestAtom.ts +16 -16
  717. package/src/react/router/components/NestedView.tsx +11 -3
  718. package/src/react/router/hooks/useQueryParams.ts +1 -1
  719. package/src/react/router/primitives/$page.ts +2 -2
  720. package/src/react/router/providers/ReactBrowserProvider.ts +64 -13
  721. package/src/react/router/providers/ReactPageProvider.ts +26 -12
  722. package/src/react/router/providers/ReactServerProvider.ts +13 -15
  723. package/src/react/sitemap/__tests__/$sitemap.spec.ts +2 -2
  724. package/src/react/ui/atoms/uiAtom.ts +6 -6
  725. package/src/react/ui/atoms/uiThemeListAtom.ts +7 -7
  726. package/src/react/ui/hooks/useColorMode.ts +11 -4
  727. package/src/react/ui/services/SchemaControl.ts +4 -4
  728. package/src/redis/providers/BunRedisProvider.ts +19 -11
  729. package/src/redis/providers/NodeRedisProvider.ts +3 -3
  730. package/src/scheduler/primitives/$scheduler.ts +21 -8
  731. package/src/security/__tests__/assertRealmScope.spec.ts +29 -0
  732. package/src/security/atoms/currentTenantAtom.ts +6 -6
  733. package/src/security/atoms/currentUserAtom.ts +2 -2
  734. package/src/security/primitives/$issuer.ts +24 -2
  735. package/src/security/providers/JwtProvider.ts +100 -0
  736. package/src/security/providers/SecurityProvider.ts +43 -2
  737. package/src/security/schemas/permissionSchema.ts +19 -19
  738. package/src/security/schemas/roleSchema.ts +22 -28
  739. package/src/security/schemas/userAccountInfoSchema.ts +47 -37
  740. package/src/server/auth/index.ts +0 -3
  741. package/src/server/auth/primitives/$auth.ts +6 -6
  742. package/src/server/auth/primitives/$authApple.ts +10 -10
  743. package/src/server/auth/primitives/$authFacebook.ts +10 -10
  744. package/src/server/auth/primitives/$authFranceConnect.ts +10 -10
  745. package/src/server/auth/primitives/$authGithub.ts +10 -10
  746. package/src/server/auth/primitives/$authGoogle.ts +10 -10
  747. package/src/server/auth/primitives/$authMicrosoft.ts +14 -14
  748. package/src/server/auth/providers/ServerAuthProvider.ts +49 -48
  749. package/src/server/auth/schemas/authenticationProviderSchema.ts +9 -12
  750. package/src/server/auth/schemas/tokenResponseSchema.ts +2 -2
  751. package/src/server/auth/schemas/tokensSchema.ts +16 -16
  752. package/src/server/auth/schemas/userinfoResponseSchema.ts +3 -3
  753. package/src/server/cookies/__tests__/AtomCookieBinding.spec.ts +80 -0
  754. package/src/server/cookies/__tests__/AtomCookiePersistence.browser.spec.ts +169 -0
  755. package/src/server/cookies/__tests__/AtomCookiePersistence.spec.ts +294 -0
  756. package/src/server/cookies/__tests__/ServerCookiesProvider.spec.ts +14 -14
  757. package/src/server/cookies/index.browser.ts +4 -1
  758. package/src/server/cookies/index.ts +8 -1
  759. package/src/server/cookies/primitives/$cookie.browser.ts +1 -1
  760. package/src/server/cookies/primitives/$cookie.ts +16 -0
  761. package/src/server/cookies/providers/AtomCookiePersistence.browser.ts +133 -0
  762. package/src/server/cookies/providers/AtomCookiePersistence.ts +148 -0
  763. package/src/server/cookies/providers/ServerCookiesProvider.ts +13 -5
  764. package/src/server/cookies/services/CookieParser.ts +6 -1
  765. package/src/server/core/__tests__/$action.spec.ts +13 -13
  766. package/src/server/core/__tests__/$middleware.spec.ts +10 -10
  767. package/src/server/core/__tests__/$route.spec.ts +9 -9
  768. package/src/server/core/__tests__/$sse.spec.ts +26 -26
  769. package/src/server/core/__tests__/BunHttpServerProvider.bun.spec.ts +6 -6
  770. package/src/server/core/__tests__/HttpClient.spec.ts +2 -2
  771. package/src/server/core/__tests__/NodeHttpServerProvider.spec.ts +15 -3
  772. package/src/server/core/__tests__/ServerBodyParserProvider.spec.ts +14 -14
  773. package/src/server/core/__tests__/ServerMultipartProvider.spec.ts +33 -33
  774. package/src/server/core/__tests__/ServerRouterProvider-errorHandler.spec.ts +5 -1
  775. package/src/server/core/__tests__/ServerRouterProvider-getRoutes.spec.ts +25 -25
  776. package/src/server/core/__tests__/ServerRouterProvider-serializationError.spec.ts +9 -5
  777. package/src/server/core/__tests__/ServerRouterProvider-validationError.spec.ts +56 -24
  778. package/src/server/core/errors/ValidationError.ts +6 -3
  779. package/src/server/core/helpers/isMultipart.ts +2 -1
  780. package/src/server/core/index.ts +5 -2
  781. package/src/server/core/interfaces/ServerRequest.ts +6 -14
  782. package/src/server/core/primitives/$action.ts +26 -36
  783. package/src/server/core/primitives/$sse.ts +3 -3
  784. package/src/server/core/providers/BunHttpServerProvider.ts +8 -9
  785. package/src/server/core/providers/NodeHttpServerProvider.ts +8 -9
  786. package/src/server/core/providers/ServerBodyParserProvider.ts +20 -12
  787. package/src/server/core/providers/ServerCompressProvider.ts +9 -10
  788. package/src/server/core/providers/ServerHelmetProvider.ts +26 -27
  789. package/src/server/core/providers/ServerMultipartProvider.ts +19 -19
  790. package/src/server/core/providers/ServerRouterProvider.ts +44 -15
  791. package/src/server/core/schemas/errorSchema.ts +20 -25
  792. package/src/server/core/schemas/okSchema.ts +9 -14
  793. package/src/server/core/services/HttpClient.ts +13 -1
  794. package/src/server/core/services/ServerRequestParser.ts +6 -6
  795. package/src/server/cors/providers/ServerCorsProvider.ts +26 -28
  796. package/src/server/health/schemas/healthSchema.ts +6 -6
  797. package/src/server/links/__tests__/$remote.spec.ts +3 -3
  798. package/src/server/links/__tests__/BatchEndpoint.spec.ts +9 -9
  799. package/src/server/links/__tests__/LinkProvider.spec.ts +9 -9
  800. package/src/server/links/__tests__/ServerLinksProvider.spec.ts +23 -23
  801. package/src/server/links/__tests__/fixtures/CrudApp.ts +21 -21
  802. package/src/server/links/atoms/apiLinksAtom.ts +2 -2
  803. package/src/server/links/atoms/linkOptionsAtom.ts +6 -6
  804. package/src/server/links/primitives/$remote.ts +3 -3
  805. package/src/server/links/providers/LinkProvider.ts +3 -3
  806. package/src/server/links/providers/ServerLinksProvider.ts +20 -20
  807. package/src/server/links/schemas/apiLinksResponseSchema.ts +23 -23
  808. package/src/server/proxy/__tests__/$proxy.spec.ts +9 -9
  809. package/src/server/proxy/providers/ServerProxyProvider.ts +5 -0
  810. package/src/server/rate-limit/providers/ServerRateLimitProvider.ts +18 -20
  811. package/src/server/swagger/__tests__/$swagger.spec.ts +91 -94
  812. package/src/server/swagger/__tests__/ui.spec.ts +3 -3
  813. package/src/server/swagger/providers/ServerSwaggerProvider.ts +66 -43
  814. package/src/system/__tests__/NodeShellProvider.spec.ts +46 -0
  815. package/src/system/providers/NodeShellProvider.ts +4 -1
  816. package/src/topic/core/__tests__/$subscriber.spec.ts +4 -4
  817. package/src/topic/core/__tests__/shared.ts +8 -8
  818. package/src/topic/core/primitives/$subscriber.ts +5 -5
  819. package/src/topic/core/primitives/$topic.ts +14 -14
  820. package/src/topic/redis/providers/RedisTopicProvider.ts +3 -3
  821. package/dist/container/core/index.d.ts +0 -236
  822. package/dist/container/core/index.d.ts.map +0 -1
  823. package/dist/container/core/index.js +0 -231
  824. package/dist/container/core/index.js.map +0 -1
  825. package/dist/container/core/index.workerd.js +0 -192
  826. package/dist/container/core/index.workerd.js.map +0 -1
  827. package/src/command/helpers/PrettyAsker.ts +0 -256
  828. package/src/command/helpers/PrettyPrint.ts +0 -332
  829. package/src/container/core/__tests__/$container.spec.ts +0 -83
  830. package/src/container/core/index.ts +0 -50
  831. package/src/container/core/index.workerd.ts +0 -53
  832. package/src/container/core/interfaces/ContainerOptions.ts +0 -69
  833. package/src/container/core/primitives/$container.ts +0 -100
  834. package/src/container/core/providers/CloudflareContainerProvider.ts +0 -70
  835. package/src/container/core/providers/ContainerProvider.ts +0 -92
  836. package/src/container/core/providers/MockContainerProvider.ts +0 -62
  837. package/src/container/core/providers/NodeContainerProvider.ts +0 -53
  838. package/src/core/__tests__/jsonSchemaToTypeBox.spec.ts +0 -771
  839. package/src/core/helpers/jsonSchemaToTypeBox.ts +0 -359
  840. package/src/server/auth/__tests__/authFederationClient.spec.ts +0 -40
  841. package/src/server/auth/__tests__/federationAssertion.spec.ts +0 -146
  842. package/src/server/auth/helpers/federationAssertion.ts +0 -74
  843. package/src/server/auth/primitives/$authFederationBroker.ts +0 -273
  844. package/src/server/auth/primitives/$authFederationClient.ts +0 -89
  845. /package/dist/orm/core/{chunk-B4FMCO8f.js → rolldown-runtime-B4FMCO8f.js} +0 -0
@@ -1,19 +1,13 @@
1
1
  import { Static } from "alepha";
2
-
3
2
  //#region ../../src/cli/devtools/atoms/devtoolsOptions.d.ts
4
3
  /**
5
4
  * Devtools configuration atom.
6
5
  *
7
6
  * Filled from the `devtools` section of `alepha.config.ts`.
8
7
  */
9
- declare const devtoolsOptions: import("alepha").Atom<import("typebox").TOptional<import("typebox").TObject<{
10
- /**
11
- * Hide the floating devtools button in the browser.
12
- *
13
- * The devtools UI is still accessible at `/__devtools/`.
14
- */
15
- hideButton: import("typebox").TOptional<import("typebox").TBoolean>;
16
- }>>, "alepha.cli.devtools.options">;
8
+ declare const devtoolsOptions: import("alepha").Atom<import("zod").ZodOptional<import("zod").ZodObject<{
9
+ hideButton: import("zod").ZodOptional<import("zod").ZodDefault<import("zod").ZodBoolean>>;
10
+ }, import("zod/v4/core").$strip>>, "alepha.cli.devtools.options">;
17
11
  /**
18
12
  * Type for devtools options.
19
13
  */
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/cli/devtools/atoms/devtoolsOptions.ts","../../../src/cli/devtools/index.ts"],"mappings":";;;;;AAOA;;;cAAa,eAAA,mBAAe,IAAA,mBAAA,SAAA,mBAAA,OAAA;EAAA;;;;;;;;AAkB5B;;KAAY,eAAA,GAAkB,MAAM,QAAQ,eAAA,CAAgB,MAAA;;;;;AAlB5D;;;;;;;;;;;;AAkBA;;;;cCuFa,uBAAA,mBAAuB,OAAA,kBAAA,MAAA;AAAA,cAkFvB,QAAA,GAAY,OAA6B,GAApB,eAAoB"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/cli/devtools/atoms/devtoolsOptions.ts","../../../src/cli/devtools/index.ts"],"mappings":";;;;;;;cAOa,kCAAe,mBAAA,0BAAA;;;;;;KAkBhB,kBAAkB,cAAc,gBAAgB;;;;;;;;;;;;;;;;;;;;;cCuF/C,0CAAuB,yBAAA;cAkFvB,WAAQ,UAAa"}
@@ -1,7 +1,7 @@
1
1
  import { createRequire } from "node:module";
2
2
  import { readFile } from "node:fs/promises";
3
3
  import { dirname, join } from "node:path";
4
- import { $atom, $context, $module, AlephaError, t } from "alepha";
4
+ import { $atom, $context, $module, AlephaError, z } from "alepha";
5
5
  import { ViteDevServerProvider } from "alepha/cli";
6
6
  //#region ../../src/cli/devtools/atoms/devtoolsOptions.ts
7
7
  /**
@@ -12,13 +12,13 @@ import { ViteDevServerProvider } from "alepha/cli";
12
12
  const devtoolsOptions = $atom({
13
13
  name: "alepha.cli.devtools.options",
14
14
  description: "Devtools plugin configuration",
15
- schema: t.optional(t.object({
15
+ schema: z.object({
16
16
  /**
17
17
  * Hide the floating devtools button in the browser.
18
18
  *
19
19
  * The devtools UI is still accessible at `/__devtools/`.
20
20
  */
21
- hideButton: t.optional(t.boolean({ default: false })) }))
21
+ hideButton: z.boolean().default(false).optional() }).optional()
22
22
  });
23
23
  //#endregion
24
24
  //#region ../../src/cli/devtools/index.ts
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../src/cli/devtools/atoms/devtoolsOptions.ts","../../../src/cli/devtools/index.ts"],"sourcesContent":["import { $atom, type Static, t } from \"alepha\";\n\n/**\n * Devtools configuration atom.\n *\n * Filled from the `devtools` section of `alepha.config.ts`.\n */\nexport const devtoolsOptions = $atom({\n name: \"alepha.cli.devtools.options\",\n description: \"Devtools plugin configuration\",\n schema: t.optional(\n t.object({\n /**\n * Hide the floating devtools button in the browser.\n *\n * The devtools UI is still accessible at `/__devtools/`.\n */\n hideButton: t.optional(t.boolean({ default: false })),\n }),\n ),\n});\n\n/**\n * Type for devtools options.\n */\nexport type DevtoolsOptions = Static<typeof devtoolsOptions.schema>;\n","import { readFile } from \"node:fs/promises\";\nimport { createRequire } from \"node:module\";\nimport { dirname, join } from \"node:path\";\nimport { $context, $module, AlephaError } from \"alepha\";\nimport { ViteDevServerProvider } from \"alepha/cli\";\nimport {\n type DevtoolsOptions,\n devtoolsOptions,\n} from \"./atoms/devtoolsOptions.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nconst DEVTOOLS_OVERLAY_SCRIPT = `\n(function () {\n if (window.__alepha_devtools_injected) return;\n window.__alepha_devtools_injected = true;\n\n const STORAGE_KEY = \"alepha-devtools-open\";\n\n // Button\n const btn = document.createElement(\"button\");\n btn.id = \"alepha-devtools-btn\";\n btn.innerHTML = \\`<svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M12 15a3 3 0 1 0 0-6 3 3 0 0 0 0 6Z\"/><path d=\"M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 1 1-2.83 2.83l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 1 1-4 0v-.09a1.65 1.65 0 0 0-1-1.51 1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 1 1-2.83-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 1 1 0-4h.09a1.65 1.65 0 0 0 1.51-1 1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 1 1 2.83-2.83l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 1 1 4 0v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 1 1 2.83 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 1 1 0 4h-.09a1.65 1.65 0 0 0-1.51 1Z\"/></svg>\\`;\n Object.assign(btn.style, {\n position: \"fixed\", bottom: \"16px\", left: \"16px\", zIndex: \"99998\",\n width: \"36px\", height: \"36px\", borderRadius: \"50%\",\n background: \"rgba(255,255,255,0.85)\", color: \"#3f3f46\",\n border: \"none\", backdropFilter: \"blur(8px)\", WebkitBackdropFilter: \"blur(8px)\",\n cursor: \"pointer\", display: \"flex\", alignItems: \"center\", justifyContent: \"center\",\n boxShadow: \"0 1px 2px rgba(0,0,0,0.06), 0 4px 12px rgba(0,0,0,0.08)\",\n transition: \"transform 0.2s ease, box-shadow 0.2s ease\",\n padding: \"0\", fontSize: \"0\",\n });\n btn.addEventListener(\"mouseenter\", () => {\n btn.style.transform = \"translateY(-1px) rotate(45deg)\";\n btn.style.boxShadow = \"0 2px 4px rgba(0,0,0,0.08), 0 8px 20px rgba(0,0,0,0.12)\";\n });\n btn.addEventListener(\"mouseleave\", () => {\n btn.style.transform = \"translateY(0) rotate(0deg)\";\n btn.style.boxShadow = \"0 1px 2px rgba(0,0,0,0.06), 0 4px 12px rgba(0,0,0,0.08)\";\n });\n\n // Overlay\n const overlay = document.createElement(\"div\");\n overlay.id = \"alepha-devtools-overlay\";\n Object.assign(overlay.style, {\n position: \"fixed\", inset: \"0\", zIndex: \"99999\",\n background: \"rgba(0,0,0,0.6)\", backdropFilter: \"blur(2px)\",\n display: \"none\", alignItems: \"center\", justifyContent: \"center\",\n });\n\n // Panel\n const panel = document.createElement(\"div\");\n Object.assign(panel.style, {\n width: \"90vw\", height: \"85vh\", maxWidth: \"1400px\",\n borderRadius: \"12px\", overflow: \"hidden\",\n boxShadow: \"0 8px 32px rgba(0,0,0,0.5)\",\n border: \"1px solid #2a2a4a\",\n });\n\n const iframe = document.createElement(\"iframe\");\n iframe.style.cssText = \"width:100%;height:100%;border:none;\";\n\n panel.appendChild(iframe);\n overlay.appendChild(panel);\n document.body.appendChild(btn);\n document.body.appendChild(overlay);\n\n function open() {\n if (!iframe.src) iframe.src = \"/__devtools/\";\n overlay.style.display = \"flex\";\n btn.style.display = \"none\";\n sessionStorage.setItem(STORAGE_KEY, \"1\");\n }\n\n function close() {\n overlay.style.display = \"none\";\n btn.style.display = \"flex\";\n sessionStorage.removeItem(STORAGE_KEY);\n }\n\n btn.addEventListener(\"click\", open);\n overlay.addEventListener(\"click\", (e) => {\n if (e.target === overlay) close();\n });\n document.addEventListener(\"keydown\", (e) => {\n if (e.key === \"Escape\" && overlay.style.display === \"flex\") close();\n });\n\n // Restore state after HMR\n if (sessionStorage.getItem(STORAGE_KEY)) open();\n})();\n`;\n\n/**\n * CLI plugin that integrates @alepha/devtools into the Vite dev server.\n *\n * This module is intentionally lightweight — it does NOT statically import\n * `@alepha/devtools` (which pulls in `alepha/react` and `.tsx` files).\n * Instead, it lazy-loads devtools via Vite's SSR module loader at runtime.\n *\n * Usage in `alepha.config.ts`:\n * ```ts\n * import { devtools } from \"alepha/cli/devtools\";\n *\n * export default defineConfig({\n * plugins: [devtools()],\n * });\n * ```\n *\n * @module alepha.devtools.plugin\n */\nexport const AlephaCliDevtoolsPlugin = $module({\n name: \"alepha.cli.plugins.devtools\",\n atoms: [devtoolsOptions],\n register: (alepha) => {\n const vite = alepha.inject(ViteDevServerProvider) as ViteDevServerProvider;\n\n const require = createRequire(import.meta.url);\n const pkgPath = require.resolve(\"@alepha/devtools/package.json\");\n const assetsPath = join(dirname(pkgPath), \"assets/ui\");\n\n process.env.VITE_ALEPHA_DEVTOOLS = \"true\";\n\n vite.addVitePlugin({\n name: \"alepha-devtools\",\n configureServer: (server) => {\n // Reload endpoint\n server.middlewares.use((req, res, next) => {\n if (req.url !== \"/__devtools/api/reload\" || req.method !== \"POST\") {\n return next();\n }\n\n vite.reload();\n res.writeHead(200, { \"content-type\": \"application/json\" });\n res.end(JSON.stringify({ ok: true }));\n });\n\n // Serve devtools HTML\n server.middlewares.use(async (req, res, next) => {\n const url = req.url || \"/\";\n\n if (\n !url.startsWith(\"/__devtools\") ||\n !req.headers.accept?.includes(\"text/html\")\n ) {\n return next();\n }\n\n const indexPath = join(assetsPath, \"index.html\");\n\n try {\n let html = await readFile(indexPath, \"utf-8\");\n html = html.replace(\n \"<head>\",\n `<head><script type=\"module\" src=\"/@vite/client\"></script>`,\n );\n\n res.writeHead(200, { \"content-type\": \"text/html\" });\n res.end(html);\n } catch {\n next();\n }\n });\n },\n transformIndexHtml: () => {\n const options = alepha.store.get(devtoolsOptions);\n if (options?.hideButton) return [];\n\n return [\n {\n tag: \"script\",\n attrs: { type: \"module\" },\n children: DEVTOOLS_OVERLAY_SCRIPT,\n injectTo: \"head\",\n },\n ];\n },\n });\n\n vite.onAlephaLoaded(async (appAlepha, server) => {\n try {\n const mod = await server.ssrLoadModule(\"@alepha/devtools\");\n appAlepha.with(mod.AlephaDevtools);\n } catch (err) {\n throw new AlephaError(\n \"Failed to load @alepha/devtools. Make sure the package is installed\",\n { cause: err },\n );\n }\n });\n },\n});\n\nexport const devtools = (options: DevtoolsOptions = {}) => {\n return () => {\n const { alepha } = $context();\n alepha.with(AlephaCliDevtoolsPlugin).set(devtoolsOptions, options);\n };\n};\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport * from \"./atoms/devtoolsOptions.ts\";\n"],"mappings":";;;;;;;;;;;AAOA,MAAa,kBAAkB,MAAM;CACnC,MAAM;CACN,aAAa;CACb,QAAQ,EAAE,SACR,EAAE,OAAO;;;;;;AAMP,YAAY,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,MAAM,CAAC,CAAC,EACtD,CAAC,CACH;AACF,CAAC;;;ACRD,MAAM,0BAA0B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoGhC,MAAa,0BAA0B,QAAQ;CAC7C,MAAM;CACN,OAAO,CAAC,eAAe;CACvB,WAAW,WAAW;EACpB,MAAM,OAAO,OAAO,OAAO,qBAAqB;EAIhD,MAAM,aAAa,KAAK,QAFR,cAAc,OAAO,KAAK,GACpB,EAAE,QAAQ,+BACM,CAAC,GAAG,WAAW;EAErD,QAAQ,IAAI,uBAAuB;EAEnC,KAAK,cAAc;GACjB,MAAM;GACN,kBAAkB,WAAW;IAE3B,OAAO,YAAY,KAAK,KAAK,KAAK,SAAS;KACzC,IAAI,IAAI,QAAQ,4BAA4B,IAAI,WAAW,QACzD,OAAO,KAAK;KAGd,KAAK,OAAO;KACZ,IAAI,UAAU,KAAK,EAAE,gBAAgB,mBAAmB,CAAC;KACzD,IAAI,IAAI,KAAK,UAAU,EAAE,IAAI,KAAK,CAAC,CAAC;IACtC,CAAC;IAGD,OAAO,YAAY,IAAI,OAAO,KAAK,KAAK,SAAS;KAG/C,IACE,EAHU,IAAI,OAAO,KAGhB,WAAW,aAAa,KAC7B,CAAC,IAAI,QAAQ,QAAQ,SAAS,WAAW,GAEzC,OAAO,KAAK;KAGd,MAAM,YAAY,KAAK,YAAY,YAAY;KAE/C,IAAI;MACF,IAAI,OAAO,MAAM,SAAS,WAAW,OAAO;MAC5C,OAAO,KAAK,QACV,UACA,4DACF;MAEA,IAAI,UAAU,KAAK,EAAE,gBAAgB,YAAY,CAAC;MAClD,IAAI,IAAI,IAAI;KACd,QAAQ;MACN,KAAK;KACP;IACF,CAAC;GACH;GACA,0BAA0B;IAExB,IADgB,OAAO,MAAM,IAAI,eACvB,GAAG,YAAY,OAAO,CAAC;IAEjC,OAAO,CACL;KACE,KAAK;KACL,OAAO,EAAE,MAAM,SAAS;KACxB,UAAU;KACV,UAAU;IACZ,CACF;GACF;EACF,CAAC;EAED,KAAK,eAAe,OAAO,WAAW,WAAW;GAC/C,IAAI;IACF,MAAM,MAAM,MAAM,OAAO,cAAc,kBAAkB;IACzD,UAAU,KAAK,IAAI,cAAc;GACnC,SAAS,KAAK;IACZ,MAAM,IAAI,YACR,uEACA,EAAE,OAAO,IAAI,CACf;GACF;EACF,CAAC;CACH;AACF,CAAC;AAED,MAAa,YAAY,UAA2B,CAAC,MAAM;CACzD,aAAa;EACX,MAAM,EAAE,WAAW,SAAS;EAC5B,OAAO,KAAK,uBAAuB,EAAE,IAAI,iBAAiB,OAAO;CACnE;AACF"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../src/cli/devtools/atoms/devtoolsOptions.ts","../../../src/cli/devtools/index.ts"],"sourcesContent":["import { $atom, type Static, z } from \"alepha\";\n\n/**\n * Devtools configuration atom.\n *\n * Filled from the `devtools` section of `alepha.config.ts`.\n */\nexport const devtoolsOptions = $atom({\n name: \"alepha.cli.devtools.options\",\n description: \"Devtools plugin configuration\",\n schema: z\n .object({\n /**\n * Hide the floating devtools button in the browser.\n *\n * The devtools UI is still accessible at `/__devtools/`.\n */\n hideButton: z.boolean().default(false).optional(),\n })\n .optional(),\n});\n\n/**\n * Type for devtools options.\n */\nexport type DevtoolsOptions = Static<typeof devtoolsOptions.schema>;\n","import { readFile } from \"node:fs/promises\";\nimport { createRequire } from \"node:module\";\nimport { dirname, join } from \"node:path\";\nimport { $context, $module, AlephaError } from \"alepha\";\nimport { ViteDevServerProvider } from \"alepha/cli\";\nimport {\n type DevtoolsOptions,\n devtoolsOptions,\n} from \"./atoms/devtoolsOptions.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nconst DEVTOOLS_OVERLAY_SCRIPT = `\n(function () {\n if (window.__alepha_devtools_injected) return;\n window.__alepha_devtools_injected = true;\n\n const STORAGE_KEY = \"alepha-devtools-open\";\n\n // Button\n const btn = document.createElement(\"button\");\n btn.id = \"alepha-devtools-btn\";\n btn.innerHTML = \\`<svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M12 15a3 3 0 1 0 0-6 3 3 0 0 0 0 6Z\"/><path d=\"M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 1 1-2.83 2.83l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 1 1-4 0v-.09a1.65 1.65 0 0 0-1-1.51 1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 1 1-2.83-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 1 1 0-4h.09a1.65 1.65 0 0 0 1.51-1 1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 1 1 2.83-2.83l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 1 1 4 0v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 1 1 2.83 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 1 1 0 4h-.09a1.65 1.65 0 0 0-1.51 1Z\"/></svg>\\`;\n Object.assign(btn.style, {\n position: \"fixed\", bottom: \"16px\", left: \"16px\", zIndex: \"99998\",\n width: \"36px\", height: \"36px\", borderRadius: \"50%\",\n background: \"rgba(255,255,255,0.85)\", color: \"#3f3f46\",\n border: \"none\", backdropFilter: \"blur(8px)\", WebkitBackdropFilter: \"blur(8px)\",\n cursor: \"pointer\", display: \"flex\", alignItems: \"center\", justifyContent: \"center\",\n boxShadow: \"0 1px 2px rgba(0,0,0,0.06), 0 4px 12px rgba(0,0,0,0.08)\",\n transition: \"transform 0.2s ease, box-shadow 0.2s ease\",\n padding: \"0\", fontSize: \"0\",\n });\n btn.addEventListener(\"mouseenter\", () => {\n btn.style.transform = \"translateY(-1px) rotate(45deg)\";\n btn.style.boxShadow = \"0 2px 4px rgba(0,0,0,0.08), 0 8px 20px rgba(0,0,0,0.12)\";\n });\n btn.addEventListener(\"mouseleave\", () => {\n btn.style.transform = \"translateY(0) rotate(0deg)\";\n btn.style.boxShadow = \"0 1px 2px rgba(0,0,0,0.06), 0 4px 12px rgba(0,0,0,0.08)\";\n });\n\n // Overlay\n const overlay = document.createElement(\"div\");\n overlay.id = \"alepha-devtools-overlay\";\n Object.assign(overlay.style, {\n position: \"fixed\", inset: \"0\", zIndex: \"99999\",\n background: \"rgba(0,0,0,0.6)\", backdropFilter: \"blur(2px)\",\n display: \"none\", alignItems: \"center\", justifyContent: \"center\",\n });\n\n // Panel\n const panel = document.createElement(\"div\");\n Object.assign(panel.style, {\n width: \"90vw\", height: \"85vh\", maxWidth: \"1400px\",\n borderRadius: \"12px\", overflow: \"hidden\",\n boxShadow: \"0 8px 32px rgba(0,0,0,0.5)\",\n border: \"1px solid #2a2a4a\",\n });\n\n const iframe = document.createElement(\"iframe\");\n iframe.style.cssText = \"width:100%;height:100%;border:none;\";\n\n panel.appendChild(iframe);\n overlay.appendChild(panel);\n document.body.appendChild(btn);\n document.body.appendChild(overlay);\n\n function open() {\n if (!iframe.src) iframe.src = \"/__devtools/\";\n overlay.style.display = \"flex\";\n btn.style.display = \"none\";\n sessionStorage.setItem(STORAGE_KEY, \"1\");\n }\n\n function close() {\n overlay.style.display = \"none\";\n btn.style.display = \"flex\";\n sessionStorage.removeItem(STORAGE_KEY);\n }\n\n btn.addEventListener(\"click\", open);\n overlay.addEventListener(\"click\", (e) => {\n if (e.target === overlay) close();\n });\n document.addEventListener(\"keydown\", (e) => {\n if (e.key === \"Escape\" && overlay.style.display === \"flex\") close();\n });\n\n // Restore state after HMR\n if (sessionStorage.getItem(STORAGE_KEY)) open();\n})();\n`;\n\n/**\n * CLI plugin that integrates @alepha/devtools into the Vite dev server.\n *\n * This module is intentionally lightweight — it does NOT statically import\n * `@alepha/devtools` (which pulls in `alepha/react` and `.tsx` files).\n * Instead, it lazy-loads devtools via Vite's SSR module loader at runtime.\n *\n * Usage in `alepha.config.ts`:\n * ```ts\n * import { devtools } from \"alepha/cli/devtools\";\n *\n * export default defineConfig({\n * plugins: [devtools()],\n * });\n * ```\n *\n * @module alepha.devtools.plugin\n */\nexport const AlephaCliDevtoolsPlugin = $module({\n name: \"alepha.cli.plugins.devtools\",\n atoms: [devtoolsOptions],\n register: (alepha) => {\n const vite = alepha.inject(ViteDevServerProvider) as ViteDevServerProvider;\n\n const require = createRequire(import.meta.url);\n const pkgPath = require.resolve(\"@alepha/devtools/package.json\");\n const assetsPath = join(dirname(pkgPath), \"assets/ui\");\n\n process.env.VITE_ALEPHA_DEVTOOLS = \"true\";\n\n vite.addVitePlugin({\n name: \"alepha-devtools\",\n configureServer: (server) => {\n // Reload endpoint\n server.middlewares.use((req, res, next) => {\n if (req.url !== \"/__devtools/api/reload\" || req.method !== \"POST\") {\n return next();\n }\n\n vite.reload();\n res.writeHead(200, { \"content-type\": \"application/json\" });\n res.end(JSON.stringify({ ok: true }));\n });\n\n // Serve devtools HTML\n server.middlewares.use(async (req, res, next) => {\n const url = req.url || \"/\";\n\n if (\n !url.startsWith(\"/__devtools\") ||\n !req.headers.accept?.includes(\"text/html\")\n ) {\n return next();\n }\n\n const indexPath = join(assetsPath, \"index.html\");\n\n try {\n let html = await readFile(indexPath, \"utf-8\");\n html = html.replace(\n \"<head>\",\n `<head><script type=\"module\" src=\"/@vite/client\"></script>`,\n );\n\n res.writeHead(200, { \"content-type\": \"text/html\" });\n res.end(html);\n } catch {\n next();\n }\n });\n },\n transformIndexHtml: () => {\n const options = alepha.store.get(devtoolsOptions);\n if (options?.hideButton) return [];\n\n return [\n {\n tag: \"script\",\n attrs: { type: \"module\" },\n children: DEVTOOLS_OVERLAY_SCRIPT,\n injectTo: \"head\",\n },\n ];\n },\n });\n\n vite.onAlephaLoaded(async (appAlepha, server) => {\n try {\n const mod = await server.ssrLoadModule(\"@alepha/devtools\");\n appAlepha.with(mod.AlephaDevtools);\n } catch (err) {\n throw new AlephaError(\n \"Failed to load @alepha/devtools. Make sure the package is installed\",\n { cause: err },\n );\n }\n });\n },\n});\n\nexport const devtools = (options: DevtoolsOptions = {}) => {\n return () => {\n const { alepha } = $context();\n alepha.with(AlephaCliDevtoolsPlugin).set(devtoolsOptions, options);\n };\n};\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport * from \"./atoms/devtoolsOptions.ts\";\n"],"mappings":";;;;;;;;;;;AAOA,MAAa,kBAAkB,MAAM;CACnC,MAAM;CACN,aAAa;CACb,QAAQ,EACL,OAAO;;;;;;AAMN,YAAY,EAAE,QAAQ,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,SAAS,EAClD,CAAC,CAAC,CACD,SAAS;AACd,CAAC;;;ACRD,MAAM,0BAA0B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoGhC,MAAa,0BAA0B,QAAQ;CAC7C,MAAM;CACN,OAAO,CAAC,eAAe;CACvB,WAAW,WAAW;EACpB,MAAM,OAAO,OAAO,OAAO,qBAAqB;EAIhD,MAAM,aAAa,KAAK,QAFR,cAAc,OAAO,KAAK,GACpB,CAAC,CAAC,QAAQ,+BACM,CAAC,GAAG,WAAW;EAErD,QAAQ,IAAI,uBAAuB;EAEnC,KAAK,cAAc;GACjB,MAAM;GACN,kBAAkB,WAAW;IAE3B,OAAO,YAAY,KAAK,KAAK,KAAK,SAAS;KACzC,IAAI,IAAI,QAAQ,4BAA4B,IAAI,WAAW,QACzD,OAAO,KAAK;KAGd,KAAK,OAAO;KACZ,IAAI,UAAU,KAAK,EAAE,gBAAgB,mBAAmB,CAAC;KACzD,IAAI,IAAI,KAAK,UAAU,EAAE,IAAI,KAAK,CAAC,CAAC;IACtC,CAAC;IAGD,OAAO,YAAY,IAAI,OAAO,KAAK,KAAK,SAAS;KAG/C,IACE,EAHU,IAAI,OAAO,IAAA,CAGhB,WAAW,aAAa,KAC7B,CAAC,IAAI,QAAQ,QAAQ,SAAS,WAAW,GAEzC,OAAO,KAAK;KAGd,MAAM,YAAY,KAAK,YAAY,YAAY;KAE/C,IAAI;MACF,IAAI,OAAO,MAAM,SAAS,WAAW,OAAO;MAC5C,OAAO,KAAK,QACV,UACA,4DACF;MAEA,IAAI,UAAU,KAAK,EAAE,gBAAgB,YAAY,CAAC;MAClD,IAAI,IAAI,IAAI;KACd,QAAQ;MACN,KAAK;KACP;IACF,CAAC;GACH;GACA,0BAA0B;IAExB,IADgB,OAAO,MAAM,IAAI,eACvB,CAAC,EAAE,YAAY,OAAO,CAAC;IAEjC,OAAO,CACL;KACE,KAAK;KACL,OAAO,EAAE,MAAM,SAAS;KACxB,UAAU;KACV,UAAU;IACZ,CACF;GACF;EACF,CAAC;EAED,KAAK,eAAe,OAAO,WAAW,WAAW;GAC/C,IAAI;IACF,MAAM,MAAM,MAAM,OAAO,cAAc,kBAAkB;IACzD,UAAU,KAAK,IAAI,cAAc;GACnC,SAAS,KAAK;IACZ,MAAM,IAAI,YACR,uEACA,EAAE,OAAO,IAAI,CACf;GACF;EACF,CAAC;CACH;AACF,CAAC;AAED,MAAa,YAAY,UAA2B,CAAC,MAAM;CACzD,aAAa;EACX,MAAM,EAAE,WAAW,SAAS;EAC5B,OAAO,KAAK,uBAAuB,CAAC,CAAC,IAAI,iBAAiB,OAAO;CACnE;AACF"}
@@ -1,7 +1,6 @@
1
1
  import { Static } from "alepha";
2
2
  import { ConsoleColorProvider } from "alepha/logger";
3
3
  import { FileSystemProvider } from "alepha/system";
4
-
5
4
  //#region ../../src/cli/i18n/atoms/i18nOptions.d.ts
6
5
  /**
7
6
  * i18n CLI configuration atom.
@@ -9,36 +8,11 @@ import { FileSystemProvider } from "alepha/system";
9
8
  * Filled from the `i18n` plugin in `alepha.config.ts`.
10
9
  * Read by `I18nCommand` to drive `alepha i18n check`.
11
10
  */
12
- declare const i18nOptions: import("alepha").Atom<import("typebox").TOptional<import("typebox").TObject<{
13
- /**
14
- * Directories (relative to the project root) to scan both for
15
- * `$dictionary(...)` declarations and for translation key usage.
16
- *
17
- * @default ["src"]
18
- */
19
- scan: import("typebox").TOptional<import("typebox").TArray<import("typebox").TString>>;
20
- /**
21
- * Key prefixes that are constructed at runtime (e.g. via template
22
- * literals like `` tr(`archive.type.${kind}`) ``). Every key
23
- * starting with one of these prefixes is exempted from the
24
- * unused check.
25
- *
26
- * Keep this list short and audit it when a feature is removed —
27
- * a stale prefix here means dead keys can hide.
28
- *
29
- * @default []
30
- */
31
- dynamicPrefixes: import("typebox").TOptional<import("typebox").TArray<import("typebox").TString>>;
32
- /**
33
- * Additional path substrings (matched against the full file
34
- * path) that should be excluded from the scan, on top of the
35
- * defaults (`node_modules`, `dist`, `__tests__`, `.spec.*`,
36
- * `.test.*`, `.alepha`).
37
- *
38
- * @default []
39
- */
40
- exclude: import("typebox").TOptional<import("typebox").TArray<import("typebox").TString>>;
41
- }>>, "alepha.cli.i18n.options">;
11
+ declare const i18nOptions: import("alepha").Atom<import("zod").ZodOptional<import("zod").ZodObject<{
12
+ scan: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodString>>;
13
+ dynamicPrefixes: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodString>>;
14
+ exclude: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodString>>;
15
+ }, import("zod/v4/core").$strip>>, "alepha.cli.i18n.options">;
42
16
  /**
43
17
  * Type for i18n options.
44
18
  */
@@ -92,7 +66,7 @@ declare class I18nCommand {
92
66
  scan?: string[] | undefined;
93
67
  dynamicPrefixes?: string[] | undefined;
94
68
  exclude?: string[] | undefined;
95
- }>;
69
+ } | undefined>;
96
70
  protected readonly checkService: I18nCheckService;
97
71
  protected readonly color: ConsoleColorProvider;
98
72
  protected resolveOptions(): {
@@ -100,8 +74,8 @@ declare class I18nCommand {
100
74
  dynamicPrefixes: string[];
101
75
  exclude: string[];
102
76
  };
103
- protected readonly check: import("alepha/command").CommandPrimitive<import("typebox").TObject<import("typebox").TProperties>, import("typebox").TSchema, import("typebox").TObject<import("typebox").TProperties>>;
104
- readonly i18n: import("alepha/command").CommandPrimitive<import("typebox").TObject<import("typebox").TProperties>, import("typebox").TSchema, import("typebox").TObject<import("typebox").TProperties>>;
77
+ protected readonly check: import("alepha/command").CommandPrimitive<import("alepha").TObject, import("alepha").ZType, import("alepha").TObject>;
78
+ readonly i18n: import("alepha/command").CommandPrimitive<import("alepha").TObject, import("alepha").ZType, import("alepha").TObject>;
105
79
  }
106
80
  //#endregion
107
81
  //#region ../../src/cli/i18n/index.d.ts
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/cli/i18n/atoms/i18nOptions.ts","../../../src/cli/i18n/services/I18nCheckService.ts","../../../src/cli/i18n/commands/I18nCommand.ts","../../../src/cli/i18n/index.ts"],"mappings":";;;;;;;;;AAQA;;cAAa,WAAA,mBAAW,IAAA,mBAAA,SAAA,mBAAA,OAAA;EAqCtB;;;;;;;;;;;;;;;;;;;EAKqB;;;;;;;AAAmC;;;;ACG1D;;KDHY,WAAA,GAAc,MAAM,QAAQ,WAAA,CAAY,MAAA;;;UCGnC,gBAAA;EACf,IAAA;EACA,IAAA;EACA,eAAA;EACA,OAAA;AAAA;AAAA,UAGe,eAAA;EDff;ECiBA,SAAA;EDtDsB;ECwDtB,UAAA;;EAEA,YAAA;;EAEA,eAAA;;EAEA,MAAA;AAAA;AAAA,cAGW,gBAAA;EAAA,mBACQ,EAAA,EAAE,kBAAA;;;;;;ADxBvB;;;;;ECoCQ,KAAA,CAAM,OAAA,EAAS,gBAAA,GAAmB,OAAA,CAAQ,eAAA;EDpCE;;AAAM;;;;EAAN,UCoIxC,aAAA,CACR,QAAA,UACA,IAAA,UACA,KAAA,EAAO,GAAA;AAAA;;;cCnLE,WAAA;EAAA,mBACQ,GAAA,0BAAG,MAAA;EAAA,mBACH,OAAA,EAAO,QAAA;;;;;qBACP,YAAA,EAAY,gBAAA;EAAA,mBACZ,KAAA,EAAK,oBAAA;EAAA,UAEd,cAAA;;;;;qBAQS,KAAA,2BAAK,gBAAA,mBAAA,OAAA,mBAAA,WAAA,qBAAA,OAAA,oBAAA,OAAA,mBAAA,WAAA;EAAA,SAoDR,IAAA,2BAAI,gBAAA,mBAAA,OAAA,mBAAA,WAAA,qBAAA,OAAA,oBAAA,OAAA,mBAAA,WAAA;AAAA;;;;;;;AFhEtB;;;;;;;;;;;;;;;;;;;;;AA0CA;;cGhBa,mBAAA,mBAAmB,OAAA,kBAAA,MAAA;AAAA,cAMnB,IAAA,GAAQ,OAAyB,GAAhB,WAAgB"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/cli/i18n/atoms/i18nOptions.ts","../../../src/cli/i18n/services/I18nCheckService.ts","../../../src/cli/i18n/commands/I18nCommand.ts","../../../src/cli/i18n/index.ts"],"mappings":";;;;;;;;;;cAQa,8BAAW,mBAAA,0BAAA;;;;;;;;KA0CZ,cAAc,cAAc,YAAY;;;UCGnC;EACf;EACA;EACA;EACA;;UAGe;;EAEf;;EAEA;;EAEA;;EAEA;;EAEA;;cAGW;qBACQ,IAAE;;;;;;;;;;;EAYf,MAAM,SAAS,mBAAmB,QAAQ;;;;;;;YAgGtC,cACR,kBACA,cACA,OAAO;;;;cCnLE;qBACQ,6BAAG;qBACH,SAAO;;;;;qBACP,cAAY;qBACZ,OAAK;YAEd;IAEN;IACA;IACA;;qBAIe,gCAAK,kCAAA,0BAAA,wBAAA;WAoDR,+BAAI,kCAAA,0BAAA,wBAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cCtCT,sCAAmB,yBAAA;cAMnB,OAAI,UAAa"}
@@ -1,4 +1,4 @@
1
- import { $atom, $context, $inject, $module, $state, t } from "alepha";
1
+ import { $atom, $context, $inject, $module, $state, z } from "alepha";
2
2
  import { $command } from "alepha/command";
3
3
  import { $logger, ConsoleColorProvider } from "alepha/logger";
4
4
  import { FileSystemProvider } from "alepha/system";
@@ -12,14 +12,14 @@ import { FileSystemProvider } from "alepha/system";
12
12
  const i18nOptions = $atom({
13
13
  name: "alepha.cli.i18n.options",
14
14
  description: "i18n unused-key check configuration",
15
- schema: t.optional(t.object({
15
+ schema: z.object({
16
16
  /**
17
17
  * Directories (relative to the project root) to scan both for
18
18
  * `$dictionary(...)` declarations and for translation key usage.
19
19
  *
20
20
  * @default ["src"]
21
21
  */
22
- scan: t.optional(t.array(t.text())),
22
+ scan: z.array(z.text()).optional(),
23
23
  /**
24
24
  * Key prefixes that are constructed at runtime (e.g. via template
25
25
  * literals like `` tr(`archive.type.${kind}`) ``). Every key
@@ -31,7 +31,7 @@ const i18nOptions = $atom({
31
31
  *
32
32
  * @default []
33
33
  */
34
- dynamicPrefixes: t.optional(t.array(t.text())),
34
+ dynamicPrefixes: z.array(z.text()).optional(),
35
35
  /**
36
36
  * Additional path substrings (matched against the full file
37
37
  * path) that should be excluded from the scan, on top of the
@@ -40,8 +40,8 @@ const i18nOptions = $atom({
40
40
  *
41
41
  * @default []
42
42
  */
43
- exclude: t.optional(t.array(t.text()))
44
- }))
43
+ exclude: z.array(z.text()).optional()
44
+ }).optional()
45
45
  });
46
46
  //#endregion
47
47
  //#region ../../src/cli/i18n/services/I18nCheckService.ts
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../src/cli/i18n/atoms/i18nOptions.ts","../../../src/cli/i18n/services/I18nCheckService.ts","../../../src/cli/i18n/commands/I18nCommand.ts","../../../src/cli/i18n/index.ts"],"sourcesContent":["import { $atom, type Static, t } from \"alepha\";\n\n/**\n * i18n CLI configuration atom.\n *\n * Filled from the `i18n` plugin in `alepha.config.ts`.\n * Read by `I18nCommand` to drive `alepha i18n check`.\n */\nexport const i18nOptions = $atom({\n name: \"alepha.cli.i18n.options\",\n description: \"i18n unused-key check configuration\",\n schema: t.optional(\n t.object({\n /**\n * Directories (relative to the project root) to scan both for\n * `$dictionary(...)` declarations and for translation key usage.\n *\n * @default [\"src\"]\n */\n scan: t.optional(t.array(t.text())),\n\n /**\n * Key prefixes that are constructed at runtime (e.g. via template\n * literals like `` tr(`archive.type.${kind}`) ``). Every key\n * starting with one of these prefixes is exempted from the\n * unused check.\n *\n * Keep this list short and audit it when a feature is removed —\n * a stale prefix here means dead keys can hide.\n *\n * @default []\n */\n dynamicPrefixes: t.optional(t.array(t.text())),\n\n /**\n * Additional path substrings (matched against the full file\n * path) that should be excluded from the scan, on top of the\n * defaults (`node_modules`, `dist`, `__tests__`, `.spec.*`,\n * `.test.*`, `.alepha`).\n *\n * @default []\n */\n exclude: t.optional(t.array(t.text())),\n }),\n ),\n});\n\n/**\n * Type for i18n options.\n */\nexport type I18nOptions = Static<typeof i18nOptions.schema>;\n","import { $inject } from \"alepha\";\nimport { FileSystemProvider } from \"alepha/system\";\n\n/**\n * File extensions considered when scanning for dictionaries / usage.\n */\nconst SCAN_EXTS = [\".ts\", \".tsx\", \".mts\", \".cts\"];\n\n/**\n * Built-in path substrings that are always excluded from scanning.\n */\nconst DEFAULT_EXCLUDES = [\n \"/node_modules/\",\n \"/dist/\",\n \"/__tests__/\",\n \"/.alepha/\",\n \".spec.ts\",\n \".spec.tsx\",\n \".test.ts\",\n \".test.tsx\",\n];\n\n/**\n * Matches a quoted dotted property key on the left-hand side of a\n * dictionary entry: `\"some.dotted.key\":`. The \"at least one dot\"\n * requirement rules out unrelated quoted strings (e.g. JSON literals\n * inside helper text).\n */\nconst KEY_DECLARATION_RE = /\"([\\w-]+(?:\\.[\\w-]+)+)\"\\s*:/g;\n\n/**\n * Heuristic for spotting files that declare a dictionary. Conservative\n * by design — we'd rather scan a few unrelated files than miss a\n * dictionary tucked away in an unusual location.\n */\nconst DICTIONARY_MARKER = \"$dictionary\";\n\n/**\n * Captures the module specifier of a lazily-imported dictionary, i.e. the\n * `\"./fr.ts\"` in `$dictionary({ lazy: () => import(\"./fr.ts\") })`. Apps\n * commonly split each language into its own file so a session only ships the\n * active locale — those key files carry no `$dictionary` marker, so without\n * this the keys would be invisible to the check.\n *\n * `[^{}]*?` keeps the match inside the `$dictionary` call's own object literal\n * (it stops at the first brace), so unrelated lazy imports in the same file —\n * e.g. a sibling `$page({ lazy: () => import(\"./Page.tsx\") })` or a\n * `$dictionary` whose `lazy` returns an inline `({ default: {…} })` object —\n * are never mistaken for dictionary key files.\n */\nconst DICTIONARY_LAZY_IMPORT_RE =\n /\\$dictionary\\s*\\(\\s*\\{[^{}]*?import\\s*\\(\\s*[\"']([^\"']+)[\"']/g;\n\nexport interface I18nCheckOptions {\n root: string;\n scan: string[];\n dynamicPrefixes: string[];\n exclude: string[];\n}\n\nexport interface I18nCheckResult {\n /** Total number of keys discovered across all dictionary files. */\n totalKeys: number;\n /** Number of keys exempted via `dynamicPrefixes`. */\n exemptKeys: number;\n /** Number of source files scanned for references. */\n scannedFiles: number;\n /** Dictionary files that contributed keys. */\n dictionaryFiles: string[];\n /** Keys that have no quoted-literal reference anywhere in the scan. */\n unused: string[];\n}\n\nexport class I18nCheckService {\n protected readonly fs = $inject(FileSystemProvider);\n\n /**\n * Find unused translation keys.\n *\n * Discovery is fully static: we walk `scan` dirs, identify files\n * that import `$dictionary` (matched via the literal substring) plus\n * any per-language files they lazily `import(...)`, extract every\n * `\"a.b.c\": ...` property key declared across them, then grep the\n * remaining source files for a quoted-literal occurrence of each key.\n * Anything matching a `dynamicPrefixes` entry is exempted.\n */\n async check(options: I18nCheckOptions): Promise<I18nCheckResult> {\n const { root, scan, dynamicPrefixes, exclude } = options;\n const excludes = [...DEFAULT_EXCLUDES, ...exclude];\n\n const allFiles: string[] = [];\n for (const dir of scan) {\n const absDir = this.fs.join(root, dir);\n let entries: string[];\n try {\n entries = await this.fs.ls(absDir, { recursive: true });\n } catch {\n // Missing scan dir is silently skipped — config carries\n // optional paths (e.g. .vendor/**) that may not exist locally.\n continue;\n }\n for (const rel of entries) {\n const abs = this.fs.join(absDir, rel);\n if (!SCAN_EXTS.some((ext) => abs.endsWith(ext))) continue;\n if (excludes.some((sub) => abs.includes(sub))) continue;\n allFiles.push(abs);\n }\n }\n\n const fileContents = new Map<string, string>();\n for (const file of allFiles) {\n fileContents.set(file, (await this.fs.readFile(file)).toString(\"utf8\"));\n }\n\n // A file is a dictionary if it declares `$dictionary` OR it is the target\n // of a `$dictionary({ lazy: () => import(\"…\") })` (the split per-language\n // key files, which carry no marker of their own). Resolving the lazy\n // targets first lets their keys be extracted below and keeps them out of\n // the usage corpus (their `\"key\": \"value\"` lines aren't references).\n const dictionarySet = new Set<string>();\n for (const [file, text] of fileContents) {\n if (!text.includes(DICTIONARY_MARKER)) continue;\n dictionarySet.add(file);\n for (const m of text.matchAll(DICTIONARY_LAZY_IMPORT_RE)) {\n const target = this.resolveImport(file, m[1], fileContents);\n if (target) dictionarySet.add(target);\n }\n }\n\n const dictionaryFiles: string[] = [];\n const allKeys = new Set<string>();\n for (const file of dictionarySet) {\n const text = fileContents.get(file);\n if (!text) continue;\n const before = allKeys.size;\n for (const m of text.matchAll(KEY_DECLARATION_RE)) {\n allKeys.add(m[1]);\n }\n if (allKeys.size > before) dictionaryFiles.push(file);\n }\n\n // Concatenate every non-dictionary file into one corpus so each\n // key is tested with a single regex run rather than O(files × keys).\n const corpusParts: string[] = [];\n let scannedFiles = 0;\n for (const [file, text] of fileContents) {\n if (dictionarySet.has(file)) continue;\n corpusParts.push(text);\n scannedFiles++;\n }\n const corpus = corpusParts.join(\"\\n\");\n\n let exemptKeys = 0;\n const unused: string[] = [];\n for (const key of allKeys) {\n if (dynamicPrefixes.some((p) => key.startsWith(p))) {\n exemptKeys++;\n continue;\n }\n const literal = key.replace(/[.\\\\]/g, (c) => `\\\\${c}`);\n // Key must appear as a quoted string literal — `\"...\"`, `'...'`,\n // or `` `...` ``. Quotes on both sides rule out accidental\n // substring hits in longer keys.\n const re = new RegExp(`[\"'\\`]${literal}[\"'\\`]`);\n if (!re.test(corpus)) unused.push(key);\n }\n\n return {\n totalKeys: allKeys.size,\n exemptKeys,\n scannedFiles,\n dictionaryFiles,\n unused: unused.sort(),\n };\n }\n\n /**\n * Resolve a relative `import(\"…\")` specifier from `fromFile` to an absolute\n * path that was actually scanned. Returns `undefined` for bare/package\n * specifiers or targets outside the scan set. Extensionless specifiers are\n * probed against each supported source extension.\n */\n protected resolveImport(\n fromFile: string,\n spec: string,\n files: Map<string, string>,\n ): string | undefined {\n if (!spec.startsWith(\".\")) return undefined;\n // `join(file, \"..\", spec)` drops the filename then applies the relative\n // specifier — i.e. resolves against `fromFile`'s directory.\n const base = this.fs.join(fromFile, \"..\", spec);\n if (files.has(base)) return base;\n for (const ext of SCAN_EXTS) {\n if (files.has(base + ext)) return base + ext;\n }\n return undefined;\n }\n}\n","import { $inject, $state } from \"alepha\";\nimport { $command } from \"alepha/command\";\nimport { $logger, ConsoleColorProvider } from \"alepha/logger\";\nimport { i18nOptions } from \"../atoms/i18nOptions.ts\";\nimport { I18nCheckService } from \"../services/I18nCheckService.ts\";\n\nexport class I18nCommand {\n protected readonly log = $logger();\n protected readonly options = $state(i18nOptions);\n protected readonly checkService = $inject(I18nCheckService);\n protected readonly color = $inject(ConsoleColorProvider);\n\n protected resolveOptions() {\n return {\n scan: this.options?.scan ?? [\"src\"],\n dynamicPrefixes: this.options?.dynamicPrefixes ?? [],\n exclude: this.options?.exclude ?? [],\n };\n }\n\n protected readonly check = $command({\n name: \"check\",\n description: \"Report translation keys with no quoted-literal reference\",\n handler: async ({ root }) => {\n const opts = this.resolveOptions();\n const c = this.color;\n\n const result = await this.checkService.check({ root, ...opts });\n\n if (result.totalKeys === 0) {\n process.stdout.write(\n `\\n${c.set(\"ORANGE\", \"warn\")} No translation keys found. ` +\n `Did the dictionary location change? ` +\n `Searched: ${opts.scan.join(\", \")}\\n\\n`,\n );\n process.exit(2);\n }\n\n process.stdout.write(\n `\\nChecked ${c.set(\"CYAN\", String(result.totalKeys))} keys across ` +\n `${c.set(\"CYAN\", String(result.scannedFiles))} files ` +\n `(${result.dictionaryFiles.length} dictionary ` +\n `${result.dictionaryFiles.length === 1 ? \"file\" : \"files\"}).\\n`,\n );\n if (result.exemptKeys > 0) {\n process.stdout.write(\n ` exempt (dynamic prefixes): ${result.exemptKeys}\\n`,\n );\n }\n\n if (result.unused.length === 0) {\n process.stdout.write(\n `\\n${c.set(\"GREEN\", \"✓\")} All translations are referenced.\\n\\n`,\n );\n return;\n }\n\n process.stdout.write(\n `\\n${c.set(\"RED\", \"✗\")} Unused translations (${result.unused.length}):\\n`,\n );\n for (const k of result.unused) {\n process.stdout.write(` ${c.set(\"DIM\", \"-\")} ${k}\\n`);\n }\n process.stdout.write(\n `\\nEither delete the key from its dictionary, or add its prefix to ` +\n `${c.set(\"CYAN\", \"dynamicPrefixes\")} in alepha.config.ts ` +\n `if it's constructed at runtime.\\n\\n`,\n );\n process.exit(1);\n },\n });\n\n public readonly i18n = $command({\n name: \"i18n\",\n description: \"Internationalization tooling\",\n children: [this.check],\n handler: async ({ help }) => {\n help();\n },\n });\n}\n","import { $context, $module } from \"alepha\";\nimport { type I18nOptions, i18nOptions } from \"./atoms/i18nOptions.ts\";\nimport { I18nCommand } from \"./commands/I18nCommand.ts\";\nimport { I18nCheckService } from \"./services/I18nCheckService.ts\";\n\n// ---------------------------------------------------------------------------\n\n/**\n * CLI plugin for finding unused translation keys.\n *\n * Statically scans the project for `$dictionary(...)` calls, extracts\n * every declared key, and reports the ones that have no quoted-literal\n * reference anywhere else in the source tree. Designed to be wired\n * into `yarn v` (or any verify pipeline) so dead i18n entries can't\n * pile up unnoticed when a feature is removed.\n *\n * Commands:\n * - `alepha i18n check` — report unused translation keys\n *\n * Configuration in `alepha.config.ts`:\n *\n * ```typescript\n * import { i18n } from \"alepha/cli/i18n\";\n *\n * export default defineConfig({\n * plugins: [\n * i18n({\n * scan: [\"src\", \".vendor/@alepha/ui\"],\n * dynamicPrefixes: [\"archive.type.\", \"petitions.filter.\"],\n * }),\n * ],\n * });\n * ```\n */\nexport const AlephaCliI18nPlugin = $module({\n name: \"alepha.cli.plugins.i18n\",\n atoms: [i18nOptions],\n services: [I18nCommand, I18nCheckService],\n});\n\nexport const i18n = (options: I18nOptions = {}) => {\n return () => {\n const { alepha } = $context();\n alepha.with(AlephaCliI18nPlugin).set(i18nOptions, options);\n };\n};\n\n// ---------------------------------------------------------------------------\n\nexport * from \"./atoms/i18nOptions.ts\";\nexport * from \"./commands/I18nCommand.ts\";\nexport * from \"./services/I18nCheckService.ts\";\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../src/cli/i18n/atoms/i18nOptions.ts","../../../src/cli/i18n/services/I18nCheckService.ts","../../../src/cli/i18n/commands/I18nCommand.ts","../../../src/cli/i18n/index.ts"],"sourcesContent":["import { $atom, type Static, z } from \"alepha\";\n\n/**\n * i18n CLI configuration atom.\n *\n * Filled from the `i18n` plugin in `alepha.config.ts`.\n * Read by `I18nCommand` to drive `alepha i18n check`.\n */\nexport const i18nOptions = $atom({\n name: \"alepha.cli.i18n.options\",\n description: \"i18n unused-key check configuration\",\n schema: z\n .object({\n /**\n * Directories (relative to the project root) to scan both for\n * `$dictionary(...)` declarations and for translation key usage.\n *\n * @default [\"src\"]\n */\n scan: z.array(z.text()).optional(),\n\n /**\n * Key prefixes that are constructed at runtime (e.g. via template\n * literals like `` tr(`archive.type.${kind}`) ``). Every key\n * starting with one of these prefixes is exempted from the\n * unused check.\n *\n * Keep this list short and audit it when a feature is removed —\n * a stale prefix here means dead keys can hide.\n *\n * @default []\n */\n dynamicPrefixes: z.array(z.text()).optional(),\n\n /**\n * Additional path substrings (matched against the full file\n * path) that should be excluded from the scan, on top of the\n * defaults (`node_modules`, `dist`, `__tests__`, `.spec.*`,\n * `.test.*`, `.alepha`).\n *\n * @default []\n */\n exclude: z.array(z.text()).optional(),\n })\n .optional(),\n});\n\n/**\n * Type for i18n options.\n */\nexport type I18nOptions = Static<typeof i18nOptions.schema>;\n","import { $inject } from \"alepha\";\nimport { FileSystemProvider } from \"alepha/system\";\n\n/**\n * File extensions considered when scanning for dictionaries / usage.\n */\nconst SCAN_EXTS = [\".ts\", \".tsx\", \".mts\", \".cts\"];\n\n/**\n * Built-in path substrings that are always excluded from scanning.\n */\nconst DEFAULT_EXCLUDES = [\n \"/node_modules/\",\n \"/dist/\",\n \"/__tests__/\",\n \"/.alepha/\",\n \".spec.ts\",\n \".spec.tsx\",\n \".test.ts\",\n \".test.tsx\",\n];\n\n/**\n * Matches a quoted dotted property key on the left-hand side of a\n * dictionary entry: `\"some.dotted.key\":`. The \"at least one dot\"\n * requirement rules out unrelated quoted strings (e.g. JSON literals\n * inside helper text).\n */\nconst KEY_DECLARATION_RE = /\"([\\w-]+(?:\\.[\\w-]+)+)\"\\s*:/g;\n\n/**\n * Heuristic for spotting files that declare a dictionary. Conservative\n * by design — we'd rather scan a few unrelated files than miss a\n * dictionary tucked away in an unusual location.\n */\nconst DICTIONARY_MARKER = \"$dictionary\";\n\n/**\n * Captures the module specifier of a lazily-imported dictionary, i.e. the\n * `\"./fr.ts\"` in `$dictionary({ lazy: () => import(\"./fr.ts\") })`. Apps\n * commonly split each language into its own file so a session only ships the\n * active locale — those key files carry no `$dictionary` marker, so without\n * this the keys would be invisible to the check.\n *\n * `[^{}]*?` keeps the match inside the `$dictionary` call's own object literal\n * (it stops at the first brace), so unrelated lazy imports in the same file —\n * e.g. a sibling `$page({ lazy: () => import(\"./Page.tsx\") })` or a\n * `$dictionary` whose `lazy` returns an inline `({ default: {…} })` object —\n * are never mistaken for dictionary key files.\n */\nconst DICTIONARY_LAZY_IMPORT_RE =\n /\\$dictionary\\s*\\(\\s*\\{[^{}]*?import\\s*\\(\\s*[\"']([^\"']+)[\"']/g;\n\nexport interface I18nCheckOptions {\n root: string;\n scan: string[];\n dynamicPrefixes: string[];\n exclude: string[];\n}\n\nexport interface I18nCheckResult {\n /** Total number of keys discovered across all dictionary files. */\n totalKeys: number;\n /** Number of keys exempted via `dynamicPrefixes`. */\n exemptKeys: number;\n /** Number of source files scanned for references. */\n scannedFiles: number;\n /** Dictionary files that contributed keys. */\n dictionaryFiles: string[];\n /** Keys that have no quoted-literal reference anywhere in the scan. */\n unused: string[];\n}\n\nexport class I18nCheckService {\n protected readonly fs = $inject(FileSystemProvider);\n\n /**\n * Find unused translation keys.\n *\n * Discovery is fully static: we walk `scan` dirs, identify files\n * that import `$dictionary` (matched via the literal substring) plus\n * any per-language files they lazily `import(...)`, extract every\n * `\"a.b.c\": ...` property key declared across them, then grep the\n * remaining source files for a quoted-literal occurrence of each key.\n * Anything matching a `dynamicPrefixes` entry is exempted.\n */\n async check(options: I18nCheckOptions): Promise<I18nCheckResult> {\n const { root, scan, dynamicPrefixes, exclude } = options;\n const excludes = [...DEFAULT_EXCLUDES, ...exclude];\n\n const allFiles: string[] = [];\n for (const dir of scan) {\n const absDir = this.fs.join(root, dir);\n let entries: string[];\n try {\n entries = await this.fs.ls(absDir, { recursive: true });\n } catch {\n // Missing scan dir is silently skipped — config carries\n // optional paths (e.g. .vendor/**) that may not exist locally.\n continue;\n }\n for (const rel of entries) {\n const abs = this.fs.join(absDir, rel);\n if (!SCAN_EXTS.some((ext) => abs.endsWith(ext))) continue;\n if (excludes.some((sub) => abs.includes(sub))) continue;\n allFiles.push(abs);\n }\n }\n\n const fileContents = new Map<string, string>();\n for (const file of allFiles) {\n fileContents.set(file, (await this.fs.readFile(file)).toString(\"utf8\"));\n }\n\n // A file is a dictionary if it declares `$dictionary` OR it is the target\n // of a `$dictionary({ lazy: () => import(\"…\") })` (the split per-language\n // key files, which carry no marker of their own). Resolving the lazy\n // targets first lets their keys be extracted below and keeps them out of\n // the usage corpus (their `\"key\": \"value\"` lines aren't references).\n const dictionarySet = new Set<string>();\n for (const [file, text] of fileContents) {\n if (!text.includes(DICTIONARY_MARKER)) continue;\n dictionarySet.add(file);\n for (const m of text.matchAll(DICTIONARY_LAZY_IMPORT_RE)) {\n const target = this.resolveImport(file, m[1], fileContents);\n if (target) dictionarySet.add(target);\n }\n }\n\n const dictionaryFiles: string[] = [];\n const allKeys = new Set<string>();\n for (const file of dictionarySet) {\n const text = fileContents.get(file);\n if (!text) continue;\n const before = allKeys.size;\n for (const m of text.matchAll(KEY_DECLARATION_RE)) {\n allKeys.add(m[1]);\n }\n if (allKeys.size > before) dictionaryFiles.push(file);\n }\n\n // Concatenate every non-dictionary file into one corpus so each\n // key is tested with a single regex run rather than O(files × keys).\n const corpusParts: string[] = [];\n let scannedFiles = 0;\n for (const [file, text] of fileContents) {\n if (dictionarySet.has(file)) continue;\n corpusParts.push(text);\n scannedFiles++;\n }\n const corpus = corpusParts.join(\"\\n\");\n\n let exemptKeys = 0;\n const unused: string[] = [];\n for (const key of allKeys) {\n if (dynamicPrefixes.some((p) => key.startsWith(p))) {\n exemptKeys++;\n continue;\n }\n const literal = key.replace(/[.\\\\]/g, (c) => `\\\\${c}`);\n // Key must appear as a quoted string literal — `\"...\"`, `'...'`,\n // or `` `...` ``. Quotes on both sides rule out accidental\n // substring hits in longer keys.\n const re = new RegExp(`[\"'\\`]${literal}[\"'\\`]`);\n if (!re.test(corpus)) unused.push(key);\n }\n\n return {\n totalKeys: allKeys.size,\n exemptKeys,\n scannedFiles,\n dictionaryFiles,\n unused: unused.sort(),\n };\n }\n\n /**\n * Resolve a relative `import(\"…\")` specifier from `fromFile` to an absolute\n * path that was actually scanned. Returns `undefined` for bare/package\n * specifiers or targets outside the scan set. Extensionless specifiers are\n * probed against each supported source extension.\n */\n protected resolveImport(\n fromFile: string,\n spec: string,\n files: Map<string, string>,\n ): string | undefined {\n if (!spec.startsWith(\".\")) return undefined;\n // `join(file, \"..\", spec)` drops the filename then applies the relative\n // specifier — i.e. resolves against `fromFile`'s directory.\n const base = this.fs.join(fromFile, \"..\", spec);\n if (files.has(base)) return base;\n for (const ext of SCAN_EXTS) {\n if (files.has(base + ext)) return base + ext;\n }\n return undefined;\n }\n}\n","import { $inject, $state } from \"alepha\";\nimport { $command } from \"alepha/command\";\nimport { $logger, ConsoleColorProvider } from \"alepha/logger\";\nimport { i18nOptions } from \"../atoms/i18nOptions.ts\";\nimport { I18nCheckService } from \"../services/I18nCheckService.ts\";\n\nexport class I18nCommand {\n protected readonly log = $logger();\n protected readonly options = $state(i18nOptions);\n protected readonly checkService = $inject(I18nCheckService);\n protected readonly color = $inject(ConsoleColorProvider);\n\n protected resolveOptions() {\n return {\n scan: this.options?.scan ?? [\"src\"],\n dynamicPrefixes: this.options?.dynamicPrefixes ?? [],\n exclude: this.options?.exclude ?? [],\n };\n }\n\n protected readonly check = $command({\n name: \"check\",\n description: \"Report translation keys with no quoted-literal reference\",\n handler: async ({ root }) => {\n const opts = this.resolveOptions();\n const c = this.color;\n\n const result = await this.checkService.check({ root, ...opts });\n\n if (result.totalKeys === 0) {\n process.stdout.write(\n `\\n${c.set(\"ORANGE\", \"warn\")} No translation keys found. ` +\n `Did the dictionary location change? ` +\n `Searched: ${opts.scan.join(\", \")}\\n\\n`,\n );\n process.exit(2);\n }\n\n process.stdout.write(\n `\\nChecked ${c.set(\"CYAN\", String(result.totalKeys))} keys across ` +\n `${c.set(\"CYAN\", String(result.scannedFiles))} files ` +\n `(${result.dictionaryFiles.length} dictionary ` +\n `${result.dictionaryFiles.length === 1 ? \"file\" : \"files\"}).\\n`,\n );\n if (result.exemptKeys > 0) {\n process.stdout.write(\n ` exempt (dynamic prefixes): ${result.exemptKeys}\\n`,\n );\n }\n\n if (result.unused.length === 0) {\n process.stdout.write(\n `\\n${c.set(\"GREEN\", \"✓\")} All translations are referenced.\\n\\n`,\n );\n return;\n }\n\n process.stdout.write(\n `\\n${c.set(\"RED\", \"✗\")} Unused translations (${result.unused.length}):\\n`,\n );\n for (const k of result.unused) {\n process.stdout.write(` ${c.set(\"DIM\", \"-\")} ${k}\\n`);\n }\n process.stdout.write(\n `\\nEither delete the key from its dictionary, or add its prefix to ` +\n `${c.set(\"CYAN\", \"dynamicPrefixes\")} in alepha.config.ts ` +\n `if it's constructed at runtime.\\n\\n`,\n );\n process.exit(1);\n },\n });\n\n public readonly i18n = $command({\n name: \"i18n\",\n description: \"Internationalization tooling\",\n children: [this.check],\n handler: async ({ help }) => {\n help();\n },\n });\n}\n","import { $context, $module } from \"alepha\";\nimport { type I18nOptions, i18nOptions } from \"./atoms/i18nOptions.ts\";\nimport { I18nCommand } from \"./commands/I18nCommand.ts\";\nimport { I18nCheckService } from \"./services/I18nCheckService.ts\";\n\n// ---------------------------------------------------------------------------\n\n/**\n * CLI plugin for finding unused translation keys.\n *\n * Statically scans the project for `$dictionary(...)` calls, extracts\n * every declared key, and reports the ones that have no quoted-literal\n * reference anywhere else in the source tree. Designed to be wired\n * into `yarn v` (or any verify pipeline) so dead i18n entries can't\n * pile up unnoticed when a feature is removed.\n *\n * Commands:\n * - `alepha i18n check` — report unused translation keys\n *\n * Configuration in `alepha.config.ts`:\n *\n * ```typescript\n * import { i18n } from \"alepha/cli/i18n\";\n *\n * export default defineConfig({\n * plugins: [\n * i18n({\n * scan: [\"src\", \".vendor/@alepha/ui\"],\n * dynamicPrefixes: [\"archive.type.\", \"petitions.filter.\"],\n * }),\n * ],\n * });\n * ```\n */\nexport const AlephaCliI18nPlugin = $module({\n name: \"alepha.cli.plugins.i18n\",\n atoms: [i18nOptions],\n services: [I18nCommand, I18nCheckService],\n});\n\nexport const i18n = (options: I18nOptions = {}) => {\n return () => {\n const { alepha } = $context();\n alepha.with(AlephaCliI18nPlugin).set(i18nOptions, options);\n };\n};\n\n// ---------------------------------------------------------------------------\n\nexport * from \"./atoms/i18nOptions.ts\";\nexport * from \"./commands/I18nCommand.ts\";\nexport * from \"./services/I18nCheckService.ts\";\n"],"mappings":"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"}
@@ -2,48 +2,51 @@ import { AppEntry, AppEntryProvider, ViteBuildProvider } from "alepha/cli";
2
2
  import { DetectedResources, GitHubSecretStore, NamingService, PlatformInspector, PlatformOptions, PlatformOrchestrator, ResolvedPlatformConfig, SecretFilterService, SecretStoreProvider } from "alepha/cli/platform-lib";
3
3
  import { EnvUtils } from "alepha/command";
4
4
  import { ConsoleColorProvider } from "alepha/logger";
5
-
6
5
  //#region ../../src/cli/platform/commands/SecretsCommand.d.ts
7
6
  declare class SecretsCommand {
8
7
  protected readonly log: import("alepha/logger").Logger;
9
8
  protected readonly options: Readonly<{
10
9
  name?: string | undefined;
11
10
  default?: string | undefined;
12
- tenancy?: "required" | "none" | "optional" | undefined;
11
+ tenancy?: "none" | "optional" | "required" | undefined;
13
12
  secrets?: {
14
13
  keys?: string[] | undefined;
15
14
  store?: "github" | undefined;
16
15
  environmentPattern?: string | undefined;
17
16
  } | undefined;
18
17
  environments: Record<string, {
18
+ adapter: "cloudflare" | "vercel";
19
19
  domain?: string | undefined;
20
20
  zone?: string | undefined;
21
+ services?: {
22
+ binding: string;
23
+ service: string;
24
+ }[] | undefined;
21
25
  jurisdiction?: "eu" | "fedramp" | undefined;
22
26
  accountId?: string | undefined;
23
- adapter: "cloudflare" | "vercel";
24
27
  }>;
25
- }>;
28
+ } | undefined>;
26
29
  protected readonly inspector: PlatformInspector;
27
30
  protected readonly naming: NamingService;
28
31
  protected readonly envUtils: EnvUtils;
29
32
  protected readonly githubStore: GitHubSecretStore;
30
33
  protected readonly filter: SecretFilterService;
31
34
  protected readonly color: ConsoleColorProvider;
32
- protected readonly envFlags: import("typebox").TObject<{
33
- env: import("typebox").TOptional<import("typebox").TString>;
34
- }>;
35
- protected readonly list: import("alepha/command").CommandPrimitive<import("typebox").TObject<{
36
- env: import("typebox").TOptional<import("typebox").TString>;
37
- format: import("typebox").TOptional<import("typebox").TString>;
38
- }>, import("typebox").TSchema, import("typebox").TObject<import("typebox").TProperties>>;
39
- protected readonly diff: import("alepha/command").CommandPrimitive<import("typebox").TObject<{
40
- env: import("typebox").TOptional<import("typebox").TString>;
41
- }>, import("typebox").TSchema, import("typebox").TObject<import("typebox").TProperties>>;
42
- protected readonly apply: import("alepha/command").CommandPrimitive<import("typebox").TObject<{
43
- env: import("typebox").TOptional<import("typebox").TString>;
44
- "dry-run": import("typebox").TOptional<import("typebox").TBoolean>;
45
- }>, import("typebox").TSchema, import("typebox").TObject<import("typebox").TProperties>>;
46
- readonly secrets: import("alepha/command").CommandPrimitive<import("typebox").TObject<import("typebox").TProperties>, import("typebox").TSchema, import("typebox").TObject<import("typebox").TProperties>>;
35
+ protected readonly envFlags: import("zod").ZodObject<{
36
+ env: import("zod").ZodOptional<import("zod").ZodString>;
37
+ }, import("zod/v4/core").$strip>;
38
+ protected readonly list: import("alepha/command").CommandPrimitive<import("zod").ZodObject<{
39
+ env: import("zod").ZodOptional<import("zod").ZodString>;
40
+ format: import("zod").ZodOptional<import("zod").ZodString>;
41
+ }, import("zod/v4/core").$strip>, import("alepha").ZType, import("alepha").TObject>;
42
+ protected readonly diff: import("alepha/command").CommandPrimitive<import("zod").ZodObject<{
43
+ env: import("zod").ZodOptional<import("zod").ZodString>;
44
+ }, import("zod/v4/core").$strip>, import("alepha").ZType, import("alepha").TObject>;
45
+ protected readonly apply: import("alepha/command").CommandPrimitive<import("zod").ZodObject<{
46
+ env: import("zod").ZodOptional<import("zod").ZodString>;
47
+ "dry-run": import("zod").ZodOptional<import("zod").ZodBoolean>;
48
+ }, import("zod/v4/core").$strip>, import("alepha").ZType, import("alepha").TObject>;
49
+ readonly secrets: import("alepha/command").CommandPrimitive<import("alepha").TObject, import("alepha").ZType, import("alepha").TObject>;
47
50
  resolveStore(): SecretStoreProvider;
48
51
  protected resolveEnvironmentName(project: string, env: string): string;
49
52
  }
@@ -54,20 +57,24 @@ declare class PlatformCommand {
54
57
  protected readonly options: Readonly<{
55
58
  name?: string | undefined;
56
59
  default?: string | undefined;
57
- tenancy?: "required" | "none" | "optional" | undefined;
60
+ tenancy?: "none" | "optional" | "required" | undefined;
58
61
  secrets?: {
59
62
  keys?: string[] | undefined;
60
63
  store?: "github" | undefined;
61
64
  environmentPattern?: string | undefined;
62
65
  } | undefined;
63
66
  environments: Record<string, {
67
+ adapter: "cloudflare" | "vercel";
64
68
  domain?: string | undefined;
65
69
  zone?: string | undefined;
70
+ services?: {
71
+ binding: string;
72
+ service: string;
73
+ }[] | undefined;
66
74
  jurisdiction?: "eu" | "fedramp" | undefined;
67
75
  accountId?: string | undefined;
68
- adapter: "cloudflare" | "vercel";
69
76
  }>;
70
- }>;
77
+ } | undefined>;
71
78
  protected readonly orchestrator: PlatformOrchestrator;
72
79
  protected readonly inspector: PlatformInspector;
73
80
  protected readonly naming: NamingService;
@@ -79,71 +86,71 @@ declare class PlatformCommand {
79
86
  /**
80
87
  * Common flags for env targeting.
81
88
  */
82
- protected readonly envFlags: import("typebox").TObject<{
83
- env: import("typebox").TOptional<import("typebox").TString>;
84
- tenant: import("typebox").TOptional<import("typebox").TString>;
85
- verbose: import("typebox").TOptional<import("typebox").TBoolean>;
86
- json: import("typebox").TOptional<import("typebox").TBoolean>;
87
- }>;
88
- protected readonly plan: import("alepha/command").CommandPrimitive<import("typebox").TObject<{
89
- env: import("typebox").TOptional<import("typebox").TString>;
90
- tenant: import("typebox").TOptional<import("typebox").TString>;
91
- verbose: import("typebox").TOptional<import("typebox").TBoolean>;
92
- json: import("typebox").TOptional<import("typebox").TBoolean>;
93
- }>, import("typebox").TSchema, import("typebox").TObject<import("typebox").TProperties>>;
94
- protected readonly up: import("alepha/command").CommandPrimitive<import("typebox").TObject<{
95
- prebuilt: import("typebox").TOptional<import("typebox").TBoolean>;
96
- env: import("typebox").TOptional<import("typebox").TString>;
97
- tenant: import("typebox").TOptional<import("typebox").TString>;
98
- verbose: import("typebox").TOptional<import("typebox").TBoolean>;
99
- json: import("typebox").TOptional<import("typebox").TBoolean>;
100
- }>, import("typebox").TSchema, import("typebox").TObject<import("typebox").TProperties>>;
101
- protected readonly down: import("alepha/command").CommandPrimitive<import("typebox").TObject<{
102
- yes: import("typebox").TOptional<import("typebox").TBoolean>;
103
- env: import("typebox").TOptional<import("typebox").TString>;
104
- tenant: import("typebox").TOptional<import("typebox").TString>;
105
- verbose: import("typebox").TOptional<import("typebox").TBoolean>;
106
- json: import("typebox").TOptional<import("typebox").TBoolean>;
107
- }>, import("typebox").TSchema, import("typebox").TObject<import("typebox").TProperties>>;
108
- protected readonly status: import("alepha/command").CommandPrimitive<import("typebox").TObject<{
109
- env: import("typebox").TOptional<import("typebox").TString>;
110
- tenant: import("typebox").TOptional<import("typebox").TString>;
111
- verbose: import("typebox").TOptional<import("typebox").TBoolean>;
112
- json: import("typebox").TOptional<import("typebox").TBoolean>;
113
- }>, import("typebox").TSchema, import("typebox").TObject<import("typebox").TProperties>>;
114
- protected readonly build: import("alepha/command").CommandPrimitive<import("typebox").TObject<{
115
- env: import("typebox").TOptional<import("typebox").TString>;
116
- tenant: import("typebox").TOptional<import("typebox").TString>;
117
- verbose: import("typebox").TOptional<import("typebox").TBoolean>;
118
- json: import("typebox").TOptional<import("typebox").TBoolean>;
119
- }>, import("typebox").TSchema, import("typebox").TObject<import("typebox").TProperties>>;
120
- protected readonly deploy: import("alepha/command").CommandPrimitive<import("typebox").TObject<{
121
- env: import("typebox").TOptional<import("typebox").TString>;
122
- tenant: import("typebox").TOptional<import("typebox").TString>;
123
- verbose: import("typebox").TOptional<import("typebox").TBoolean>;
124
- json: import("typebox").TOptional<import("typebox").TBoolean>;
125
- }>, import("typebox").TSchema, import("typebox").TObject<import("typebox").TProperties>>;
126
- protected readonly migrate: import("alepha/command").CommandPrimitive<import("typebox").TObject<{
127
- env: import("typebox").TOptional<import("typebox").TString>;
128
- tenant: import("typebox").TOptional<import("typebox").TString>;
129
- verbose: import("typebox").TOptional<import("typebox").TBoolean>;
130
- json: import("typebox").TOptional<import("typebox").TBoolean>;
131
- }>, import("typebox").TSchema, import("typebox").TObject<import("typebox").TProperties>>;
132
- protected readonly dbExport: import("alepha/command").CommandPrimitive<import("typebox").TObject<{
133
- output: import("typebox").TOptional<import("typebox").TString>;
134
- keepSql: import("typebox").TOptional<import("typebox").TBoolean>;
135
- env: import("typebox").TOptional<import("typebox").TString>;
136
- tenant: import("typebox").TOptional<import("typebox").TString>;
137
- verbose: import("typebox").TOptional<import("typebox").TBoolean>;
138
- json: import("typebox").TOptional<import("typebox").TBoolean>;
139
- }>, import("typebox").TSchema, import("typebox").TObject<import("typebox").TProperties>>;
89
+ protected readonly envFlags: import("zod").ZodObject<{
90
+ env: import("zod").ZodOptional<import("zod").ZodString>;
91
+ tenant: import("zod").ZodOptional<import("zod").ZodString>;
92
+ verbose: import("zod").ZodOptional<import("zod").ZodBoolean>;
93
+ json: import("zod").ZodOptional<import("zod").ZodBoolean>;
94
+ }, import("zod/v4/core").$strip>;
95
+ protected readonly plan: import("alepha/command").CommandPrimitive<import("zod").ZodObject<{
96
+ env: import("zod").ZodOptional<import("zod").ZodString>;
97
+ tenant: import("zod").ZodOptional<import("zod").ZodString>;
98
+ verbose: import("zod").ZodOptional<import("zod").ZodBoolean>;
99
+ json: import("zod").ZodOptional<import("zod").ZodBoolean>;
100
+ }, import("zod/v4/core").$strip>, import("alepha").ZType, import("alepha").TObject>;
101
+ protected readonly up: import("alepha/command").CommandPrimitive<import("zod").ZodObject<{
102
+ env: import("zod").ZodOptional<import("zod").ZodString>;
103
+ tenant: import("zod").ZodOptional<import("zod").ZodString>;
104
+ verbose: import("zod").ZodOptional<import("zod").ZodBoolean>;
105
+ json: import("zod").ZodOptional<import("zod").ZodBoolean>;
106
+ prebuilt: import("zod").ZodOptional<import("zod").ZodBoolean>;
107
+ }, import("zod/v4/core").$strip>, import("alepha").ZType, import("alepha").TObject>;
108
+ protected readonly down: import("alepha/command").CommandPrimitive<import("zod").ZodObject<{
109
+ env: import("zod").ZodOptional<import("zod").ZodString>;
110
+ tenant: import("zod").ZodOptional<import("zod").ZodString>;
111
+ verbose: import("zod").ZodOptional<import("zod").ZodBoolean>;
112
+ json: import("zod").ZodOptional<import("zod").ZodBoolean>;
113
+ yes: import("zod").ZodOptional<import("zod").ZodBoolean>;
114
+ }, import("zod/v4/core").$strip>, import("alepha").ZType, import("alepha").TObject>;
115
+ protected readonly status: import("alepha/command").CommandPrimitive<import("zod").ZodObject<{
116
+ env: import("zod").ZodOptional<import("zod").ZodString>;
117
+ tenant: import("zod").ZodOptional<import("zod").ZodString>;
118
+ verbose: import("zod").ZodOptional<import("zod").ZodBoolean>;
119
+ json: import("zod").ZodOptional<import("zod").ZodBoolean>;
120
+ }, import("zod/v4/core").$strip>, import("alepha").ZType, import("alepha").TObject>;
121
+ protected readonly build: import("alepha/command").CommandPrimitive<import("zod").ZodObject<{
122
+ env: import("zod").ZodOptional<import("zod").ZodString>;
123
+ tenant: import("zod").ZodOptional<import("zod").ZodString>;
124
+ verbose: import("zod").ZodOptional<import("zod").ZodBoolean>;
125
+ json: import("zod").ZodOptional<import("zod").ZodBoolean>;
126
+ }, import("zod/v4/core").$strip>, import("alepha").ZType, import("alepha").TObject>;
127
+ protected readonly deploy: import("alepha/command").CommandPrimitive<import("zod").ZodObject<{
128
+ env: import("zod").ZodOptional<import("zod").ZodString>;
129
+ tenant: import("zod").ZodOptional<import("zod").ZodString>;
130
+ verbose: import("zod").ZodOptional<import("zod").ZodBoolean>;
131
+ json: import("zod").ZodOptional<import("zod").ZodBoolean>;
132
+ }, import("zod/v4/core").$strip>, import("alepha").ZType, import("alepha").TObject>;
133
+ protected readonly migrate: import("alepha/command").CommandPrimitive<import("zod").ZodObject<{
134
+ env: import("zod").ZodOptional<import("zod").ZodString>;
135
+ tenant: import("zod").ZodOptional<import("zod").ZodString>;
136
+ verbose: import("zod").ZodOptional<import("zod").ZodBoolean>;
137
+ json: import("zod").ZodOptional<import("zod").ZodBoolean>;
138
+ }, import("zod/v4/core").$strip>, import("alepha").ZType, import("alepha").TObject>;
139
+ protected readonly dbExport: import("alepha/command").CommandPrimitive<import("zod").ZodObject<{
140
+ env: import("zod").ZodOptional<import("zod").ZodString>;
141
+ tenant: import("zod").ZodOptional<import("zod").ZodString>;
142
+ verbose: import("zod").ZodOptional<import("zod").ZodBoolean>;
143
+ json: import("zod").ZodOptional<import("zod").ZodBoolean>;
144
+ output: import("zod").ZodOptional<import("zod").ZodString>;
145
+ keepSql: import("zod").ZodOptional<import("zod").ZodBoolean>;
146
+ }, import("zod/v4/core").$strip>, import("alepha").ZType, import("alepha").TObject>;
140
147
  /**
141
148
  * `db` subgroup — operations against the *deployed* database (export,
142
149
  * migrate). They live under `platform` (not core `alepha db`) because
143
150
  * they need the env config, tenancy, adapter, and resource naming.
144
151
  */
145
- protected readonly db: import("alepha/command").CommandPrimitive<import("typebox").TObject<import("typebox").TProperties>, import("typebox").TSchema, import("typebox").TObject<import("typebox").TProperties>>;
146
- readonly platform: import("alepha/command").CommandPrimitive<import("typebox").TObject<import("typebox").TProperties>, import("typebox").TSchema, import("typebox").TObject<import("typebox").TProperties>>;
152
+ protected readonly db: import("alepha/command").CommandPrimitive<import("alepha").TObject, import("alepha").ZType, import("alepha").TObject>;
153
+ readonly platform: import("alepha/command").CommandPrimitive<import("alepha").TObject, import("alepha").ZType, import("alepha").TObject>;
147
154
  /**
148
155
  * Resolve app definitions.
149
156
  *
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/cli/platform/commands/SecretsCommand.ts","../../../src/cli/platform/commands/platform.ts","../../../src/cli/platform/index.ts"],"mappings":";;;;;;cAYa,cAAA;EAAA,mBACQ,GAAA,0BAAG,MAAA;EAAA,mBACH,OAAA,EAAO,QAAA;;;;;;;;;;;;;;;;;qBACP,SAAA,EAAS,iBAAA;EAAA,mBACT,MAAA,EAAM,aAAA;EAAA,mBACN,QAAA,EAAQ,QAAA;EAAA,mBACR,WAAA,EAAW,iBAAA;EAAA,mBACX,MAAA,EAAM,mBAAA;EAAA,mBACN,KAAA,EAAK,oBAAA;EAAA,mBAEL,QAAA,oBAAQ,OAAA;;;qBAaR,IAAA,2BAAI,gBAAA,mBAAA,OAAA;;;;qBAqFJ,IAAA,2BAAI,gBAAA,mBAAA,OAAA;;;qBA4DJ,KAAA,2BAAK,gBAAA,mBAAA,OAAA;;;;WAyER,OAAA,2BAAO,gBAAA,mBAAA,OAAA,mBAAA,WAAA,qBAAA,OAAA,oBAAA,OAAA,mBAAA,WAAA;EAehB,YAAA,IAAgB,mBAAA;EAAA,UAYb,sBAAA,CAAuB,OAAA,UAAiB,GAAA;AAAA;;;cCrQvC,eAAA;EAAA,mBACQ,GAAA,0BAAG,MAAA;EAAA,mBACH,OAAA,EAAO,QAAA;;;;;;;;;;;;;;;;;qBACP,YAAA,EAAY,oBAAA;EAAA,mBACZ,SAAA,EAAS,iBAAA;EAAA,mBACT,MAAA,EAAM,aAAA;EAAA,mBACN,IAAA,EAAI,gBAAA;EAAA,mBACJ,SAAA,EAAS,iBAAA;EAAA,mBACT,KAAA,EAAK,oBAAA;EAAA,mBACL,QAAA,EAAQ,QAAA;EAAA,mBACR,cAAA,EAAc,cAAA;;;;qBAKd,QAAA,oBAAQ,OAAA;;;;;;qBA8BR,IAAA,2BAAI,gBAAA,mBAAA,OAAA;;;;;;qBAqJJ,EAAA,2BAAE,gBAAA,mBAAA,OAAA;;;;;;;qBA6DF,IAAA,2BAAI,gBAAA,mBAAA,OAAA;;;;;;;qBAmEJ,MAAA,2BAAM,gBAAA,mBAAA,OAAA;;;;;;qBAmLN,KAAA,2BAAK,gBAAA,mBAAA,OAAA;;;;;;qBAmCL,MAAA,2BAAM,gBAAA,mBAAA,OAAA;;;;;;qBAkCN,OAAA,2BAAO,gBAAA,mBAAA,OAAA;;;;;;qBA4CP,QAAA,2BAAQ,gBAAA,mBAAA,OAAA;;;;;;;;ED5XJ;;;;;EAAA,mBCobJ,EAAA,2BAAE,gBAAA,mBAAA,OAAA,mBAAA,WAAA,qBAAA,OAAA,oBAAA,OAAA,mBAAA,WAAA;EAAA,SAcL,QAAA,2BAAQ,gBAAA,mBAAA,OAAA,mBAAA,WAAA,qBAAA,OAAA,oBAAA,OAAA,mBAAA,WAAA;EDvaqC;AAAA;;;;ACrQ/D;;;;;EDqQ+D,UCyc7C,UAAA,CACd,IAAA,UACA,OAAA,EAAS,sBAAA,EACT,YAAA,WACA,OAAA;IAAW,QAAA;EAAA,IACV,OAAA;IAAU,KAAA,EAAO,QAAA;IAAU,SAAA,EAAW,iBAAA;EAAA;EA1sBd;;;;EAAA,UA2uBX,WAAA,CACd,IAAA,UACA,MAAA,EAAQ,sBAAA,EACR,YAAA,WACA,OAAA;IAAW,QAAA;EAAA,IACV,OAAA,CACD,KAAA;IACE,IAAA;IACA,IAAA;IACA,KAAA,EAAO,QAAA;IACP,SAAA,EAAW,iBAAA;EAAA;EAAA,UAYL,YAAA,CAAa,OAAA;EA2BiB;;;;;EAAA,UAlBxB,YAAA,CAAa,IAAA,WAAe,OAAA;IAC1C,OAAA;IACA,OAAA;IACA,SAAA,EAAW,iBAAA;EAAA;EAAA,UAeH,eAAA,CAAgB,MAAA,QAAc,iBAAA;AAAA;;;;;;;;AD5yB1C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cEoCa,uBAAA,mBAAuB,OAAA,kBAAA,MAAA;AAAA,cAUvB,QAAA,GAAY,OAAwB,EAAf,eAAe"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/cli/platform/commands/SecretsCommand.ts","../../../src/cli/platform/commands/platform.ts","../../../src/cli/platform/index.ts"],"mappings":";;;;;cAYa;qBACQ,6BAAG;qBACH,SAAO;;;;;;;;;;;;;;;;;;;;;qBACP,WAAS;qBACT,QAAM;qBACN,UAAQ;qBACR,aAAW;qBACX,QAAM;qBACN,OAAK;qBAEL,wBAAQ;;;qBAaR,+BAAI,+BAAA;;;;qBAqFJ,+BAAI,+BAAA;;;qBA4DJ,gCAAK,+BAAA;;;;WAwER,kCAAO,kCAAA,0BAAA,wBAAA;EAehB,gBAAgB;YAYb,uBAAuB,iBAAiB;;;;cCpQvC;qBACQ,6BAAG;qBACH,SAAO;;;;;;;;;;;;;;;;;;;;;qBACP,cAAY;qBACZ,WAAS;qBACT,QAAM;qBACN,MAAI;qBACJ,WAAS;qBACT,OAAK;qBACL,UAAQ;qBACR,gBAAc;;;;qBAKd,wBAAQ;;;;;;qBAyBR,+BAAI,+BAAA;;;;;;qBAqJJ,6BAAE,+BAAA;;;;;;;qBA6DF,+BAAI,+BAAA;;;;;;;qBAmEJ,iCAAM,+BAAA;;;;;;qBAmLN,gCAAK,+BAAA;;;;;;qBAmCL,iCAAM,+BAAA;;;;;;qBAkCN,kCAAO,+BAAA;;;;;;qBA4CP,mCAAQ,+BAAA;;;;;;;;;;;;;qBAuDR,6BAAE,kCAAA,0BAAA,wBAAA;WAcL,mCAAQ,kCAAA,0BAAA,wBAAA;;;;;;;;;;;YAkCR,WACd,cACA,SAAS,wBACT,uBACA;IAAW;MACV;IAAU,OAAO;IAAU,WAAW;;;;;;YAiCzB,YACd,cACA,QAAQ,wBACR,uBACA;IAAW;MACV,QACD;IACE;IACA;IACA,OAAO;IACP,WAAW;;YAYL,aAAa;;;;;;YASP,aAAa,eAAe;IAC1C;IACA;IACA,WAAW;;YAeH,gBAAgB,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cClwB7B,0CAAuB,yBAAA;cAUvB,WAAQ,SAAa"}