@mtndev/cli 2.0.0 → 2.0.1

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 (264) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/cjs/__chunks/VH7oDXx4.cjs +28 -0
  3. package/cjs/commands/aws/ec2/allow-ip/handler.cjs +261 -12
  4. package/cjs/commands/aws/ec2/allow-ip/index.cjs +25 -55
  5. package/cjs/commands/aws/ec2/allow-ip/schema.cjs +33 -13
  6. package/cjs/commands/aws/ec2/allow-ip/utils.cjs +379 -39
  7. package/cjs/commands/aws/iam/admin-group.cjs +111 -15
  8. package/cjs/commands/aws/iam/break-glass/handler.cjs +127 -12
  9. package/cjs/commands/aws/iam/break-glass/index.cjs +7 -19
  10. package/cjs/commands/aws/iam/break-glass/schema.cjs +21 -12
  11. package/cjs/commands/aws/iam/check-admin/handler.cjs +89 -10
  12. package/cjs/commands/aws/iam/check-admin/index.cjs +7 -17
  13. package/cjs/commands/aws/iam/check-admin/schema.cjs +19 -12
  14. package/cjs/commands/aws/iam/policies/s3-restrictions-deny-non-s3-services.json +20 -0
  15. package/cjs/commands/aws/iam/policies/sts-federation.json +11 -0
  16. package/cjs/commands/aws/iam/policies/user-admins-deny-list.json +175 -0
  17. package/cjs/commands/aws/iam/policies/user-admins-deny-regions-list.json +41 -0
  18. package/cjs/commands/aws/iam/policies/user-admins-self-service-iam.json +56 -0
  19. package/cjs/commands/aws/iam/policies/user-admins-write-list.json +117 -0
  20. package/cjs/commands/aws/iam/remove-admin/handler.cjs +120 -11
  21. package/cjs/commands/aws/iam/remove-admin/index.cjs +7 -18
  22. package/cjs/commands/aws/iam/remove-admin/schema.cjs +22 -12
  23. package/cjs/commands/aws/iam/setup-acl/handler.cjs +227 -14
  24. package/cjs/commands/aws/iam/setup-acl/index.cjs +13 -33
  25. package/cjs/commands/aws/iam/setup-acl/schema.cjs +19 -7
  26. package/cjs/commands/aws/iam/setup-acl/utils.cjs +305 -20
  27. package/cjs/commands/aws/iam/users/handler.cjs +59 -12
  28. package/cjs/commands/aws/iam/users/index.cjs +18 -41
  29. package/cjs/commands/aws/iam/users/schema.cjs +17 -7
  30. package/cjs/commands/aws/iam/users/utils.cjs +454 -30
  31. package/cjs/commands/aws/index.cjs +223 -229
  32. package/cjs/commands/aws/route53/add-record/handler.cjs +264 -18
  33. package/cjs/commands/aws/route53/add-record/index.cjs +26 -57
  34. package/cjs/commands/aws/route53/add-record/schema.cjs +43 -11
  35. package/cjs/commands/aws/route53/add-record/utils.cjs +404 -37
  36. package/cjs/commands/aws/route53/remove-record/handler.cjs +114 -14
  37. package/cjs/commands/aws/route53/remove-record/index.cjs +5 -18
  38. package/cjs/commands/aws/route53/remove-record/schema.cjs +22 -8
  39. package/cjs/commands/aws/schema.cjs +19 -10
  40. package/cjs/commands/aws/ses/send-email/handler.cjs +73 -12
  41. package/cjs/commands/aws/ses/send-email/index.cjs +9 -23
  42. package/cjs/commands/aws/ses/send-email/schema.cjs +24 -7
  43. package/cjs/commands/aws/ses/send-email/utils.cjs +87 -11
  44. package/cjs/commands/aws/ses/smtp-password.cjs +72 -10
  45. package/cjs/commands/aws/utils/exec-aws.cjs +145 -16
  46. package/cjs/commands/aws/utils/resolve-policy-path.cjs +15 -6
  47. package/cjs/commands/aws/utils/resolve-profile.cjs +93 -11
  48. package/cjs/commands/aws/utils/tty.cjs +54 -10
  49. package/cjs/commands/db/create-readonly-user/handler.cjs +254 -11
  50. package/cjs/commands/db/create-readonly-user/index.cjs +18 -40
  51. package/cjs/commands/db/create-readonly-user/mysql.cjs +102 -9
  52. package/cjs/commands/db/create-readonly-user/postgres.cjs +209 -9
  53. package/cjs/commands/db/create-readonly-user/schema.cjs +39 -12
  54. package/cjs/commands/db/create-readonly-user/utils.cjs +160 -22
  55. package/cjs/commands/db/index.cjs +46 -44
  56. package/cjs/commands/doppler/handler.cjs +95 -11
  57. package/cjs/commands/doppler/index.cjs +33 -68
  58. package/cjs/commands/doppler/schema.cjs +130 -14
  59. package/cjs/commands/doppler/set-secret.cjs +378 -19
  60. package/cjs/commands/doppler/utils/exec.cjs +106 -12
  61. package/cjs/commands/doppler/utils.cjs +412 -34
  62. package/cjs/commands/icons/handler.cjs +82 -8
  63. package/cjs/commands/icons/index.cjs +15 -31
  64. package/cjs/commands/icons/schema.cjs +101 -13
  65. package/cjs/commands/icons/utils.cjs +131 -13
  66. package/cjs/commands/index.cjs +54 -161
  67. package/cjs/commands/schema.cjs +25 -8
  68. package/cjs/index.cjs +3 -4
  69. package/esm/commands/aws/ec2/allow-ip/handler.js +258 -12
  70. package/esm/commands/aws/ec2/allow-ip/index.js +4 -55
  71. package/esm/commands/aws/ec2/allow-ip/schema.js +29 -13
  72. package/esm/commands/aws/ec2/allow-ip/utils.js +363 -39
  73. package/esm/commands/aws/iam/admin-group.js +104 -15
  74. package/esm/commands/aws/iam/break-glass/handler.js +124 -12
  75. package/esm/commands/aws/iam/break-glass/index.js +4 -19
  76. package/esm/commands/aws/iam/break-glass/schema.js +19 -12
  77. package/esm/commands/aws/iam/check-admin/handler.js +86 -10
  78. package/esm/commands/aws/iam/check-admin/index.js +4 -17
  79. package/esm/commands/aws/iam/check-admin/schema.js +17 -12
  80. package/esm/commands/aws/iam/policies/s3-restrictions-deny-non-s3-services.json +20 -0
  81. package/esm/commands/aws/iam/policies/sts-federation.json +11 -0
  82. package/esm/commands/aws/iam/policies/user-admins-deny-list.json +175 -0
  83. package/esm/commands/aws/iam/policies/user-admins-deny-regions-list.json +41 -0
  84. package/esm/commands/aws/iam/policies/user-admins-self-service-iam.json +56 -0
  85. package/esm/commands/aws/iam/policies/user-admins-write-list.json +117 -0
  86. package/esm/commands/aws/iam/remove-admin/handler.js +117 -11
  87. package/esm/commands/aws/iam/remove-admin/index.js +4 -18
  88. package/esm/commands/aws/iam/remove-admin/schema.js +20 -12
  89. package/esm/commands/aws/iam/setup-acl/handler.js +224 -14
  90. package/esm/commands/aws/iam/setup-acl/index.js +4 -33
  91. package/esm/commands/aws/iam/setup-acl/schema.js +18 -7
  92. package/esm/commands/aws/iam/setup-acl/utils.js +298 -20
  93. package/esm/commands/aws/iam/users/handler.js +56 -12
  94. package/esm/commands/aws/iam/users/index.js +4 -41
  95. package/esm/commands/aws/iam/users/schema.js +16 -7
  96. package/esm/commands/aws/iam/users/utils.js +440 -30
  97. package/esm/commands/aws/index.js +142 -229
  98. package/esm/commands/aws/route53/add-record/handler.js +258 -18
  99. package/esm/commands/aws/route53/add-record/index.js +4 -57
  100. package/esm/commands/aws/route53/add-record/schema.js +40 -11
  101. package/esm/commands/aws/route53/add-record/utils.js +389 -37
  102. package/esm/commands/aws/route53/remove-record/handler.js +111 -14
  103. package/esm/commands/aws/route53/remove-record/index.js +3 -18
  104. package/esm/commands/aws/route53/remove-record/schema.js +21 -8
  105. package/esm/commands/aws/schema.js +16 -10
  106. package/esm/commands/aws/ses/send-email/handler.js +70 -12
  107. package/esm/commands/aws/ses/send-email/index.js +4 -23
  108. package/esm/commands/aws/ses/send-email/schema.js +23 -7
  109. package/esm/commands/aws/ses/send-email/utils.js +84 -11
  110. package/esm/commands/aws/ses/smtp-password.js +69 -10
  111. package/esm/commands/aws/utils/exec-aws.js +136 -15
  112. package/esm/commands/aws/utils/resolve-policy-path.js +14 -6
  113. package/esm/commands/aws/utils/resolve-profile.js +88 -11
  114. package/esm/commands/aws/utils/tty.js +51 -10
  115. package/esm/commands/db/create-readonly-user/handler.js +251 -11
  116. package/esm/commands/db/create-readonly-user/index.js +4 -40
  117. package/esm/commands/db/create-readonly-user/mysql.js +98 -9
  118. package/esm/commands/db/create-readonly-user/postgres.js +205 -9
  119. package/esm/commands/db/create-readonly-user/schema.js +35 -12
  120. package/esm/commands/db/create-readonly-user/utils.js +151 -22
  121. package/esm/commands/db/index.js +31 -44
  122. package/esm/commands/doppler/handler.js +92 -11
  123. package/esm/commands/doppler/index.js +6 -68
  124. package/esm/commands/doppler/schema.js +125 -15
  125. package/esm/commands/doppler/set-secret.js +370 -19
  126. package/esm/commands/doppler/utils/exec.js +100 -12
  127. package/esm/commands/doppler/utils.js +396 -34
  128. package/esm/commands/icons/handler.js +79 -8
  129. package/esm/commands/icons/index.js +4 -31
  130. package/esm/commands/icons/schema.js +97 -15
  131. package/esm/commands/icons/utils.js +125 -13
  132. package/esm/commands/index.js +47 -155
  133. package/esm/commands/schema.js +22 -7
  134. package/esm/index.js +3 -4
  135. package/package.json +5 -2
  136. package/vitest.config.ts +11 -0
  137. package/cjs/__chunks/2FSYDFUV.cjs +0 -146
  138. package/cjs/__chunks/3A5ZYU5M.cjs +0 -105
  139. package/cjs/__chunks/3BY5Y4W7.cjs +0 -1
  140. package/cjs/__chunks/3NOHGUCF.cjs +0 -9
  141. package/cjs/__chunks/3T2LXW7J.cjs +0 -387
  142. package/cjs/__chunks/4SFWHCB3.cjs +0 -133
  143. package/cjs/__chunks/4XT5JEAS.cjs +0 -1
  144. package/cjs/__chunks/AZEB4H4I.cjs +0 -208
  145. package/cjs/__chunks/B2KFW7T7.cjs +0 -1
  146. package/cjs/__chunks/B5ENMOCD.cjs +0 -288
  147. package/cjs/__chunks/B6XM5KSF.cjs +0 -338
  148. package/cjs/__chunks/BDU2UCE5.cjs +0 -1
  149. package/cjs/__chunks/BLMSMR5E.cjs +0 -46
  150. package/cjs/__chunks/CMUD7LLN.cjs +0 -47
  151. package/cjs/__chunks/DTQ2LB3I.cjs +0 -49
  152. package/cjs/__chunks/FM5MVRQF.cjs +0 -23
  153. package/cjs/__chunks/FRHST54J.cjs +0 -135
  154. package/cjs/__chunks/FU4VP2LN.cjs +0 -1
  155. package/cjs/__chunks/G5K4PVIL.cjs +0 -26
  156. package/cjs/__chunks/GU3R54MK.cjs +0 -127
  157. package/cjs/__chunks/GUL36IFZ.cjs +0 -61
  158. package/cjs/__chunks/GZMTNK5N.cjs +0 -1
  159. package/cjs/__chunks/H74JSDBU.cjs +0 -30
  160. package/cjs/__chunks/INFOPAHN.cjs +0 -117
  161. package/cjs/__chunks/J36P6UNE.cjs +0 -75
  162. package/cjs/__chunks/JB7T7PKQ.cjs +0 -538
  163. package/cjs/__chunks/JSL2JDMW.cjs +0 -1
  164. package/cjs/__chunks/K4QNHRTP.cjs +0 -163
  165. package/cjs/__chunks/KU76LC42.cjs +0 -192
  166. package/cjs/__chunks/LFDSHANP.cjs +0 -34
  167. package/cjs/__chunks/LHE24ECK.cjs +0 -192
  168. package/cjs/__chunks/LIKQ3SI4.cjs +0 -1
  169. package/cjs/__chunks/LXDF5QVZ.cjs +0 -313
  170. package/cjs/__chunks/LXOOJR2R.cjs +0 -74
  171. package/cjs/__chunks/N5MXFOQZ.cjs +0 -167
  172. package/cjs/__chunks/N7D56LPP.cjs +0 -25
  173. package/cjs/__chunks/NFXQNOQH.cjs +0 -393
  174. package/cjs/__chunks/NIMXXHJQ.cjs +0 -92
  175. package/cjs/__chunks/NLKJIUEX.cjs +0 -126
  176. package/cjs/__chunks/NT2XXAI6.cjs +0 -89
  177. package/cjs/__chunks/NWZGFHKH.cjs +0 -121
  178. package/cjs/__chunks/R3GUC7O7.cjs +0 -110
  179. package/cjs/__chunks/RPVAXPJ4.cjs +0 -1
  180. package/cjs/__chunks/S3LVCWPN.cjs +0 -23
  181. package/cjs/__chunks/SBBNW2BF.cjs +0 -249
  182. package/cjs/__chunks/T2A7TN4F.cjs +0 -81
  183. package/cjs/__chunks/TKNNDDIB.cjs +0 -97
  184. package/cjs/__chunks/TNSRDJPR.cjs +0 -1
  185. package/cjs/__chunks/UWHPE2GI.cjs +0 -20
  186. package/cjs/__chunks/W6K7BV74.cjs +0 -1
  187. package/cjs/__chunks/WBOQ6AUN.cjs +0 -320
  188. package/cjs/__chunks/WHGN5PZI.cjs +0 -299
  189. package/cjs/__chunks/WOYF2L6T.cjs +0 -11
  190. package/cjs/__chunks/X26XY2N6.cjs +0 -18
  191. package/cjs/__chunks/XMKOKRXZ.cjs +0 -16
  192. package/cjs/__chunks/XTJPQ3EX.cjs +0 -1
  193. package/cjs/__chunks/YRHFKTW2.cjs +0 -63
  194. package/cjs/__chunks/ZMDIOZPT.cjs +0 -22
  195. package/cjs/commands/aws/iam/policies/s3-restrictions-deny-non-s3-services.cjs +0 -28
  196. package/cjs/commands/aws/iam/policies/sts-federation.cjs +0 -19
  197. package/cjs/commands/aws/iam/policies/user-admins-deny-list.cjs +0 -183
  198. package/cjs/commands/aws/iam/policies/user-admins-deny-regions-list.cjs +0 -49
  199. package/cjs/commands/aws/iam/policies/user-admins-self-service-iam.cjs +0 -64
  200. package/cjs/commands/aws/iam/policies/user-admins-write-list.cjs +0 -125
  201. package/esm/__chunks/2FTTEFEK.js +0 -97
  202. package/esm/__chunks/33UYMUQD.js +0 -338
  203. package/esm/__chunks/3BKWTHLJ.js +0 -25
  204. package/esm/__chunks/3HE4BEJX.js +0 -105
  205. package/esm/__chunks/3QLI5BDL.js +0 -387
  206. package/esm/__chunks/5GIUAFXL.js +0 -89
  207. package/esm/__chunks/5ZBVGSOK.js +0 -0
  208. package/esm/__chunks/6G4PXXKF.js +0 -75
  209. package/esm/__chunks/73BJG53F.js +0 -11
  210. package/esm/__chunks/7VF4Q43Q.js +0 -0
  211. package/esm/__chunks/AEDEAYF5.js +0 -0
  212. package/esm/__chunks/AZCP3SFJ.js +0 -0
  213. package/esm/__chunks/B2DVQ2UL.js +0 -61
  214. package/esm/__chunks/CVQVHLW5.js +0 -0
  215. package/esm/__chunks/D62SPZXC.js +0 -0
  216. package/esm/__chunks/DLEJ25GZ.js +0 -121
  217. package/esm/__chunks/DMYFNF54.js +0 -192
  218. package/esm/__chunks/DNFTUMGD.js +0 -23
  219. package/esm/__chunks/DVKD6YSR.js +0 -49
  220. package/esm/__chunks/EMSH4P76.js +0 -20
  221. package/esm/__chunks/FFKFVMIE.js +0 -167
  222. package/esm/__chunks/FL7AILGH.js +0 -133
  223. package/esm/__chunks/FNXUONAV.js +0 -110
  224. package/esm/__chunks/G4NJHFFU.js +0 -320
  225. package/esm/__chunks/HJSXC6HP.js +0 -117
  226. package/esm/__chunks/IEOGAQYI.js +0 -46
  227. package/esm/__chunks/IZFGBYGE.js +0 -34
  228. package/esm/__chunks/J34UVKLA.js +0 -26
  229. package/esm/__chunks/JZPBBBIG.js +0 -74
  230. package/esm/__chunks/KWUJP5MG.js +0 -135
  231. package/esm/__chunks/M35URMT4.js +0 -313
  232. package/esm/__chunks/NF3M2L6C.js +0 -81
  233. package/esm/__chunks/O3CCA76Q.js +0 -22
  234. package/esm/__chunks/PNPPDYKC.js +0 -299
  235. package/esm/__chunks/QFXN4EHM.js +0 -393
  236. package/esm/__chunks/QKDDLIWD.js +0 -146
  237. package/esm/__chunks/QSE66AKY.js +0 -208
  238. package/esm/__chunks/QUF7PS4R.js +0 -18
  239. package/esm/__chunks/S7IJPJ4R.js +0 -126
  240. package/esm/__chunks/SD3E3EPH.js +0 -163
  241. package/esm/__chunks/SJXQJ7RS.js +0 -92
  242. package/esm/__chunks/SNCKIAOR.js +0 -0
  243. package/esm/__chunks/T3TTUHTW.js +0 -30
  244. package/esm/__chunks/TIOVE6HR.js +0 -0
  245. package/esm/__chunks/TXKMEIDQ.js +0 -0
  246. package/esm/__chunks/U7HAE2RF.js +0 -288
  247. package/esm/__chunks/UXWY7BYE.js +0 -63
  248. package/esm/__chunks/VKAKISRG.js +0 -192
  249. package/esm/__chunks/WD2YR6I7.js +0 -0
  250. package/esm/__chunks/WOZFZKFY.js +0 -0
  251. package/esm/__chunks/XI7GZDE2.js +0 -0
  252. package/esm/__chunks/XOUWDB3T.js +0 -249
  253. package/esm/__chunks/XQN2TA4S.js +0 -23
  254. package/esm/__chunks/XXK32TIM.js +0 -16
  255. package/esm/__chunks/YGWTVPZE.js +0 -538
  256. package/esm/__chunks/YRG7PT33.js +0 -127
  257. package/esm/__chunks/ZHKVJO2U.js +0 -47
  258. package/esm/__chunks/ZO55YUSY.js +0 -9
  259. package/esm/commands/aws/iam/policies/s3-restrictions-deny-non-s3-services.js +0 -28
  260. package/esm/commands/aws/iam/policies/sts-federation.js +0 -19
  261. package/esm/commands/aws/iam/policies/user-admins-deny-list.js +0 -183
  262. package/esm/commands/aws/iam/policies/user-admins-deny-regions-list.js +0 -49
  263. package/esm/commands/aws/iam/policies/user-admins-self-service-iam.js +0 -64
  264. package/esm/commands/aws/iam/policies/user-admins-write-list.js +0 -125
@@ -1,13 +1,125 @@
1
- import {
2
- checkDependencies,
3
- generateAllIcons,
4
- generateIcon,
5
- validateBaseIcons
6
- } from "../../__chunks/FL7AILGH.js";
7
- import "../../__chunks/6G4PXXKF.js";
8
- export {
9
- checkDependencies,
10
- generateAllIcons,
11
- generateIcon,
12
- validateBaseIcons
13
- };
1
+ import { CHANNEL_TEXT_MAP, ICON_SIZE_MAP } from "./schema.js";
2
+ import chalk from "chalk";
3
+ import { execSync } from "child_process";
4
+ import { existsSync } from "fs";
5
+ import { join, resolve } from "path";
6
+ //#region src/commands/icons/utils.js
7
+ /**
8
+ * Check if ImageMagick is installed
9
+ * @param {boolean} verbose - Show verbose output
10
+ * @throws {Error} If ImageMagick is not installed
11
+ */
12
+ function checkDependencies(verbose = false) {
13
+ if (verbose) console.log(chalk.blue("\n🔍 Checking dependencies..."));
14
+ try {
15
+ execSync("which magick", { stdio: "pipe" });
16
+ if (verbose) console.log(chalk.green(" ✓ ImageMagick is installed"));
17
+ } catch {
18
+ throw new Error("ImageMagick is not installed. Please install it (brew install imagemagick) and try again.");
19
+ }
20
+ }
21
+ /**
22
+ * Validate that required base icons exist
23
+ * @param {string} baseDir - Base directory containing icons
24
+ * @param {string[]} iconTypes - Icon types to validate
25
+ * @param {boolean} verbose - Show verbose output
26
+ * @throws {Error} If required icons are missing
27
+ */
28
+ function validateBaseIcons(baseDir, iconTypes, verbose = false) {
29
+ if (verbose) console.log(chalk.blue("\n📁 Validating base icons..."));
30
+ const resolvedDir = resolve(baseDir);
31
+ if (!existsSync(resolvedDir)) throw new Error(`Input directory does not exist: ${resolvedDir}`);
32
+ const missingIcons = [];
33
+ for (const iconType of iconTypes) {
34
+ const iconPath = join(resolvedDir, `${iconType}.png`);
35
+ if (!existsSync(iconPath)) missingIcons.push(`${iconType}.png`);
36
+ else if (verbose) console.log(chalk.green(` ✓ Found: ${iconType}.png`));
37
+ }
38
+ if (missingIcons.length > 0) throw new Error(`Missing base icons in ${resolvedDir}: ${missingIcons.join(", ")}`);
39
+ }
40
+ /**
41
+ * Generate a single icon with channel overlay
42
+ * @param {{
43
+ * baseDir: string;
44
+ * channel: string;
45
+ * iconType: string;
46
+ * verbose: boolean;
47
+ * }} options - Generation options
48
+ * @returns {string} Path to generated icon
49
+ */
50
+ function generateIcon(options) {
51
+ const { baseDir, channel, iconType, verbose } = options;
52
+ const resolvedDir = resolve(baseDir);
53
+ const inputFile = join(resolvedDir, `${iconType}.png`);
54
+ const outputFile = join(resolvedDir, `${iconType}-${channel}.png`);
55
+ const size = ICON_SIZE_MAP[iconType] || 378;
56
+ const text = CHANNEL_TEXT_MAP[channel] || channel.toUpperCase().slice(0, 3);
57
+ const command = [
58
+ "magick",
59
+ `"${inputFile}"`,
60
+ `-pointsize ${size}`,
61
+ "-fill white",
62
+ "-gravity center",
63
+ "-font Arial-Black",
64
+ "-stroke black",
65
+ "-strokewidth 5",
66
+ `-draw "rotate -45 text 0,0 '${text}'"`,
67
+ `"${outputFile}"`
68
+ ].join(" ");
69
+ if (verbose) console.log(chalk.gray(` Command: ${command}`));
70
+ try {
71
+ execSync(command, { stdio: verbose ? "inherit" : "pipe" });
72
+ return outputFile;
73
+ } catch (error) {
74
+ throw new Error(`Failed to generate ${iconType}-${channel}.png: ${error instanceof Error ? error.message : String(error)}`);
75
+ }
76
+ }
77
+ /**
78
+ * Generate all icons for specified channels and types
79
+ * @param {{
80
+ * baseDir: string;
81
+ * channels: string[];
82
+ * iconTypes: string[];
83
+ * verbose: boolean;
84
+ * }} options - Generation options
85
+ * @returns {{ success: string[]; failed: { icon: string; error: string }[] }}
86
+ */
87
+ function generateAllIcons(options) {
88
+ const { baseDir, channels, iconTypes, verbose } = options;
89
+ /** @type {string[]} */
90
+ const success = [];
91
+ /** @type {{ icon: string; error: string }[]} */
92
+ const failed = [];
93
+ const totalIcons = channels.length * iconTypes.length;
94
+ let current = 0;
95
+ if (verbose) console.log(chalk.blue(`\n🎨 Generating ${totalIcons} icon(s)...`));
96
+ for (const channel of channels) for (const iconType of iconTypes) {
97
+ current++;
98
+ const iconName = `${iconType}-${channel}.png`;
99
+ if (verbose) console.log(chalk.blue(`\n[${current}/${totalIcons}] Generating ${iconName}...`));
100
+ try {
101
+ const outputPath = generateIcon({
102
+ baseDir,
103
+ channel,
104
+ iconType,
105
+ verbose
106
+ });
107
+ success.push(outputPath);
108
+ console.log(chalk.green(` ✓ Generated: ${iconName}`));
109
+ } catch (error) {
110
+ const errorMessage = error instanceof Error ? error.message : String(error);
111
+ failed.push({
112
+ icon: iconName,
113
+ error: errorMessage
114
+ });
115
+ console.log(chalk.red(` ✗ Failed: ${iconName}`));
116
+ if (verbose) console.log(chalk.red(` ${errorMessage}`));
117
+ }
118
+ }
119
+ return {
120
+ success,
121
+ failed
122
+ };
123
+ }
124
+ //#endregion
125
+ export { checkDependencies, generateAllIcons, generateIcon, validateBaseIcons };
@@ -1,168 +1,60 @@
1
1
  #!/usr/bin/env node
2
- import {
3
- globalCommandsMetadata
4
- } from "../__chunks/O3CCA76Q.js";
5
- import {
6
- registerAwsCommands
7
- } from "../__chunks/QSE66AKY.js";
8
- import "../__chunks/AEDEAYF5.js";
9
- import "../__chunks/PNPPDYKC.js";
10
- import "../__chunks/U7HAE2RF.js";
11
- import "../__chunks/J34UVKLA.js";
12
- import "../__chunks/5ZBVGSOK.js";
13
- import "../__chunks/S7IJPJ4R.js";
14
- import "../__chunks/QUF7PS4R.js";
15
- import "../__chunks/TIOVE6HR.js";
16
- import "../__chunks/VKAKISRG.js";
17
- import "../__chunks/EMSH4P76.js";
18
- import "../__chunks/D62SPZXC.js";
19
- import "../__chunks/FFKFVMIE.js";
20
- import "../__chunks/DNFTUMGD.js";
21
- import "../__chunks/NF3M2L6C.js";
22
- import "../__chunks/CVQVHLW5.js";
23
- import "../__chunks/JZPBBBIG.js";
24
- import "../__chunks/XXK32TIM.js";
25
- import "../__chunks/WOZFZKFY.js";
26
- import "../__chunks/DMYFNF54.js";
27
- import "../__chunks/XOUWDB3T.js";
28
- import "../__chunks/3QLI5BDL.js";
29
- import "../__chunks/XQN2TA4S.js";
30
- import "../__chunks/7VF4Q43Q.js";
31
- import "../__chunks/QKDDLIWD.js";
32
- import "../__chunks/IZFGBYGE.js";
33
- import "../__chunks/XI7GZDE2.js";
34
- import "../__chunks/G4NJHFFU.js";
35
- import "../__chunks/33UYMUQD.js";
36
- import "../__chunks/IEOGAQYI.js";
37
- import {
38
- registerDbCommands
39
- } from "../__chunks/DVKD6YSR.js";
40
- import "../__chunks/FNXUONAV.js";
41
- import "../__chunks/ZO55YUSY.js";
42
- import "../__chunks/TXKMEIDQ.js";
43
- import "../__chunks/2FTTEFEK.js";
44
- import "../__chunks/UXWY7BYE.js";
45
- import "../__chunks/B2DVQ2UL.js";
46
- import "../__chunks/5GIUAFXL.js";
47
- import "../__chunks/3BKWTHLJ.js";
48
- import "../__chunks/73BJG53F.js";
49
- import "../__chunks/WD2YR6I7.js";
50
- import "../__chunks/M35URMT4.js";
51
- import "../__chunks/3HE4BEJX.js";
52
- import "../__chunks/SD3E3EPH.js";
53
- import "../__chunks/T3TTUHTW.js";
54
- import "../__chunks/DLEJ25GZ.js";
55
- import "../__chunks/SNCKIAOR.js";
56
- import {
57
- iconsCommand
58
- } from "../__chunks/HJSXC6HP.js";
59
- import "../__chunks/FL7AILGH.js";
60
- import {
61
- iconsCommandMetadata
62
- } from "../__chunks/6G4PXXKF.js";
63
- import "../__chunks/AZCP3SFJ.js";
64
- import {
65
- dopplerCommand
66
- } from "../__chunks/YRG7PT33.js";
67
- import "../__chunks/QFXN4EHM.js";
68
- import "../__chunks/YGWTVPZE.js";
69
- import "../__chunks/ZHKVJO2U.js";
70
- import "../__chunks/SJXQJ7RS.js";
71
- import {
72
- dopplerCommandMetadata
73
- } from "../__chunks/KWUJP5MG.js";
74
-
75
- // src/commands/index.js
2
+ import { iconsCommandMetadata } from "./icons/schema.js";
3
+ import { iconsCommand } from "./icons/handler.js";
4
+ import "./icons/index.js";
5
+ import { dopplerCommandMetadata } from "./doppler/schema.js";
6
+ import { dopplerCommand } from "./doppler/handler.js";
7
+ import "./doppler/index.js";
8
+ import { registerDbCommands } from "./db/index.js";
9
+ import { registerAwsCommands } from "./aws/index.js";
10
+ import { globalCommandsMetadata } from "./schema.js";
76
11
  import chalk from "chalk";
77
12
  import { program } from "commander";
13
+ //#region src/commands/index.js
78
14
  function displayWelcomeMessage() {
79
- console.log(chalk.bold.blue("\n\u{1F680} @mtndev/cli"));
80
- console.log(chalk.gray(` ${globalCommandsMetadata.description}
81
- `));
15
+ console.log(chalk.bold.blue("\n🚀 @mtndev/cli"));
16
+ console.log(chalk.gray(` ${globalCommandsMetadata.description}\n`));
82
17
  }
83
18
  displayWelcomeMessage();
84
- program.name(globalCommandsMetadata.name).description(globalCommandsMetadata.description).version(globalCommandsMetadata.version).option(
85
- `-${globalCommandsMetadata.options.verbose.alias}, --verbose`,
86
- globalCommandsMetadata.options.verbose.description,
87
- globalCommandsMetadata.options.verbose.default
88
- ).configureHelp({
89
- subcommandDescription: (cmd) => {
90
- const desc = cmd.summary() || cmd.description().split("\n")[0] || "";
91
- return desc + "\n";
92
- }
19
+ program.name(globalCommandsMetadata.name).description(globalCommandsMetadata.description).version(globalCommandsMetadata.version).option(`-${globalCommandsMetadata.options.verbose.alias}, --verbose`, globalCommandsMetadata.options.verbose.description, globalCommandsMetadata.options.verbose.default).configureHelp({ subcommandDescription: (cmd) => {
20
+ return (cmd.summary() || cmd.description().split("\n")[0] || "") + "\n";
21
+ } });
22
+ program.command("doppler [action]").summary("Manage Doppler configurations").description(dopplerCommandMetadata.description).option(`-${dopplerCommandMetadata.options.environments.alias}, --environments <envs>`, dopplerCommandMetadata.options.environments.description).option(`--from <project>`, dopplerCommandMetadata.options.from.description).option(`--to <project>`, dopplerCommandMetadata.options.to.description).option(`-${dopplerCommandMetadata.options.force.alias}, --force`, dopplerCommandMetadata.options.force.description, dopplerCommandMetadata.options.force.default).option(`-${dopplerCommandMetadata.options.project.alias}, --project <project>`, dopplerCommandMetadata.options.project.description).option(`--environment <env>`, dopplerCommandMetadata.options.environment.description).option(`-${dopplerCommandMetadata.options.config.alias}, --config <config>`, dopplerCommandMetadata.options.config.description).option(`--name <name>`, dopplerCommandMetadata.options.name.description).option(`--value <value>`, dopplerCommandMetadata.options.value.description).option(`-${dopplerCommandMetadata.options.yes.alias}, --yes`, dopplerCommandMetadata.options.yes.description, dopplerCommandMetadata.options.yes.default).option(`-${dopplerCommandMetadata.options.help.alias}, --help`, dopplerCommandMetadata.options.help.description, dopplerCommandMetadata.options.help.default).action(async (action, options, cmd) => {
23
+ const globalOptions = cmd.parent?.opts() || {};
24
+ await dopplerCommand({
25
+ action,
26
+ environments: options.environments,
27
+ from: options.from,
28
+ to: options.to,
29
+ force: options.force,
30
+ project: options.project,
31
+ environment: options.environment,
32
+ config: options.config,
33
+ name: options.name,
34
+ value: options.value,
35
+ yes: options.yes,
36
+ verbose: globalOptions.verbose,
37
+ help: options.help
38
+ });
93
39
  });
94
- program.command("doppler [action]").summary("Manage Doppler configurations").description(dopplerCommandMetadata.description).option(
95
- `-${dopplerCommandMetadata.options.environments.alias}, --environments <envs>`,
96
- dopplerCommandMetadata.options.environments.description
97
- ).option(`--from <project>`, dopplerCommandMetadata.options.from.description).option(`--to <project>`, dopplerCommandMetadata.options.to.description).option(
98
- `-${dopplerCommandMetadata.options.force.alias}, --force`,
99
- dopplerCommandMetadata.options.force.description,
100
- dopplerCommandMetadata.options.force.default
101
- ).option(
102
- `-${dopplerCommandMetadata.options.project.alias}, --project <project>`,
103
- dopplerCommandMetadata.options.project.description
104
- ).option(
105
- `--environment <env>`,
106
- dopplerCommandMetadata.options.environment.description
107
- ).option(
108
- `-${dopplerCommandMetadata.options.config.alias}, --config <config>`,
109
- dopplerCommandMetadata.options.config.description
110
- ).option(`--name <name>`, dopplerCommandMetadata.options.name.description).option(`--value <value>`, dopplerCommandMetadata.options.value.description).option(
111
- `-${dopplerCommandMetadata.options.yes.alias}, --yes`,
112
- dopplerCommandMetadata.options.yes.description,
113
- dopplerCommandMetadata.options.yes.default
114
- ).option(
115
- `-${dopplerCommandMetadata.options.help.alias}, --help`,
116
- dopplerCommandMetadata.options.help.description,
117
- dopplerCommandMetadata.options.help.default
118
- ).action(async (action, options, cmd) => {
119
- const globalOptions = cmd.parent?.opts() || {};
120
- await dopplerCommand({
121
- action,
122
- environments: options.environments,
123
- from: options.from,
124
- to: options.to,
125
- force: options.force,
126
- project: options.project,
127
- environment: options.environment,
128
- config: options.config,
129
- name: options.name,
130
- value: options.value,
131
- yes: options.yes,
132
- verbose: globalOptions.verbose,
133
- help: options.help
134
- });
135
- });
136
- program.command("icons <input>").summary("Generate app channel version icons with overlay text").description(iconsCommandMetadata.description).option(
137
- `-${iconsCommandMetadata.options.channels.alias}, --channels <channels>`,
138
- iconsCommandMetadata.options.channels.description,
139
- iconsCommandMetadata.options.channels.default
140
- ).option(
141
- `-${iconsCommandMetadata.options.iconTypes.alias}, --icon-types <types>`,
142
- iconsCommandMetadata.options.iconTypes.description,
143
- iconsCommandMetadata.options.iconTypes.default
144
- ).option(
145
- `-${iconsCommandMetadata.options.help.alias}, --help`,
146
- iconsCommandMetadata.options.help.description,
147
- iconsCommandMetadata.options.help.default
148
- ).action(async (input, options, cmd) => {
149
- const globalOptions = cmd.parent?.opts() || {};
150
- const channels = typeof options.channels === "string" ? options.channels.split(",").map((c) => c.trim()) : options.channels;
151
- const iconTypes = typeof options.iconTypes === "string" ? options.iconTypes.split(",").map((t) => t.trim()) : options.iconTypes;
152
- await iconsCommand({
153
- input,
154
- channels,
155
- iconTypes,
156
- verbose: globalOptions.verbose,
157
- help: options.help
158
- });
40
+ program.command("icons <input>").summary("Generate app channel version icons with overlay text").description(iconsCommandMetadata.description).option(`-${iconsCommandMetadata.options.channels.alias}, --channels <channels>`, iconsCommandMetadata.options.channels.description, iconsCommandMetadata.options.channels.default).option(`-${iconsCommandMetadata.options.iconTypes.alias}, --icon-types <types>`, iconsCommandMetadata.options.iconTypes.description, iconsCommandMetadata.options.iconTypes.default).option(`-${iconsCommandMetadata.options.help.alias}, --help`, iconsCommandMetadata.options.help.description, iconsCommandMetadata.options.help.default).action(async (input, options, cmd) => {
41
+ const globalOptions = cmd.parent?.opts() || {};
42
+ const channels = typeof options.channels === "string" ? options.channels.split(",").map((c) => c.trim()) : options.channels;
43
+ const iconTypes = typeof options.iconTypes === "string" ? options.iconTypes.split(",").map((t) => t.trim()) : options.iconTypes;
44
+ await iconsCommand({
45
+ input,
46
+ channels,
47
+ iconTypes,
48
+ verbose: globalOptions.verbose,
49
+ help: options.help
50
+ });
159
51
  });
160
52
  registerAwsCommands(program);
161
53
  registerDbCommands(program);
162
54
  program.on("command:*", () => {
163
- program.help();
55
+ program.help();
164
56
  });
165
- if (process.argv.length <= 2) {
166
- program.help();
167
- }
57
+ if (process.argv.length <= 2) program.help();
168
58
  program.parse();
59
+ //#endregion
60
+ export {};
@@ -1,8 +1,23 @@
1
- import {
2
- globalCommandsMetadata,
3
- globalOptionsSchema
4
- } from "../__chunks/O3CCA76Q.js";
5
- export {
6
- globalCommandsMetadata,
7
- globalOptionsSchema
1
+ import { z } from "zod";
2
+ //#region src/commands/schema.js
3
+ /**
4
+ * Zod schema for global command options
5
+ * These options are available across all commands
6
+ */
7
+ const globalOptionsSchema = z.object({ verbose: z.boolean().default(false).optional().describe("Enable verbose logging for detailed output and error traces") });
8
+ /**
9
+ * Global CLI metadata
10
+ * Defines the CLI contract and available global options
11
+ */
12
+ const globalCommandsMetadata = {
13
+ name: "mtndev-cli",
14
+ version: "1.0.0",
15
+ description: "Omnibus CLI tool for mtndev projects",
16
+ options: { verbose: {
17
+ description: globalOptionsSchema.shape.verbose.description,
18
+ default: false,
19
+ alias: "v"
20
+ } }
8
21
  };
22
+ //#endregion
23
+ export { globalCommandsMetadata, globalOptionsSchema };
package/esm/index.js CHANGED
@@ -1,5 +1,4 @@
1
- // src/index.js
1
+ //#region src/index.js
2
2
  var src_default = void 0;
3
- export {
4
- src_default as default
5
- };
3
+ //#endregion
4
+ export { src_default as default };
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "private": false,
3
3
  "name": "@mtndev/cli",
4
4
  "description": "A CLI tool for mtndev projects",
5
- "version": "2.0.0",
5
+ "version": "2.0.1",
6
6
  "license": "MIT",
7
7
  "publishConfig": {
8
8
  "access": "public"
@@ -45,7 +45,8 @@
45
45
  "@types/node": "^20.11.0",
46
46
  "@types/nodemailer": "^8.0.1",
47
47
  "@types/pg": "^8.20.0",
48
- "typescript": "^5.9.3"
48
+ "typescript": "^5.9.3",
49
+ "vitest": "^4.1.10"
49
50
  },
50
51
  "exports": {
51
52
  ".": {
@@ -64,6 +65,8 @@
64
65
  "lint": "eslint \"src/**/*.{ts,tsx,js,jsx}\"",
65
66
  "lint:fix": "eslint \"src/**/*.{ts,tsx,js,jsx}\" --fix",
66
67
  "publish:staging": "libsync publish:staging --force",
68
+ "test": "vitest run",
69
+ "test:watch": "vitest",
67
70
  "typecheck": "libsync build --types-only"
68
71
  }
69
72
  }
@@ -0,0 +1,11 @@
1
+ import { defineConfig } from "vitest/config";
2
+
3
+ export default defineConfig({
4
+ test: {
5
+ // The CLI runs on Node; no DOM needed.
6
+ environment: "node",
7
+ // Tests are colocated in src/ so they get typechecking, linting, and
8
+ // formatting. libsync excludes *.test.* from both export and build paths.
9
+ include: ["src/**/*.test.js"],
10
+ },
11
+ });
@@ -1,146 +0,0 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }
2
-
3
- var _LFDSHANPcjs = require('./LFDSHANP.cjs');
4
-
5
-
6
-
7
-
8
- var _WBOQ6AUNcjs = require('./WBOQ6AUN.cjs');
9
-
10
-
11
-
12
-
13
-
14
-
15
- var _B6XM5KSFcjs = require('./B6XM5KSF.cjs');
16
-
17
-
18
-
19
-
20
- var _R3GUC7O7cjs = require('./R3GUC7O7.cjs');
21
-
22
-
23
- var _NT2XXAI6cjs = require('./NT2XXAI6.cjs');
24
-
25
-
26
- var _CMUD7LLNcjs = require('./CMUD7LLN.cjs');
27
-
28
- // src/commands/aws/route53/remove-record/handler.js
29
- var _chalk = require('chalk'); var _chalk2 = _interopRequireDefault(_chalk);
30
- var _zod = require('zod');
31
- async function removeRecordCommand(options) {
32
- try {
33
- const {
34
- profile: profileOption,
35
- zone: zoneOption,
36
- type: typeOption,
37
- name: nameOption,
38
- yes,
39
- dryRun,
40
- verbose
41
- } = _LFDSHANPcjs.removeRecordOptionsSchema.parse(options);
42
- const profile = await _NT2XXAI6cjs.resolveProfile.call(void 0, { profile: profileOption });
43
- if (!profile) {
44
- console.error(_chalk2.default.red("Error: pass --profile or set AWS_PROFILE."));
45
- process.exit(1);
46
- }
47
- _R3GUC7O7cjs.requireCommands.call(void 0, ["aws"]);
48
- const identity = _R3GUC7O7cjs.getCallerIdentity.call(void 0, { profile, verbose });
49
- console.log("Caller:");
50
- console.log(` Account: ${identity.Account}`);
51
- console.log(` Arn: ${identity.Arn}`);
52
- console.log("");
53
- const zone = await _WBOQ6AUNcjs.resolveHostedZone.call(void 0, { profile, zoneOption, verbose });
54
- console.log(`Hosted zone: ${_B6XM5KSFcjs.hostedZoneLabel.call(void 0, zone)}`);
55
- console.log("");
56
- const type = await _WBOQ6AUNcjs.resolveRecordType.call(void 0, typeOption);
57
- const name = await _WBOQ6AUNcjs.resolveName.call(void 0, { nameOption, zoneName: zone.name });
58
- const existing = _B6XM5KSFcjs.getResourceRecordSet.call(void 0, {
59
- profile,
60
- hostedZoneId: zone.id,
61
- name,
62
- type,
63
- verbose
64
- });
65
- if (!existing) {
66
- console.log(
67
- _chalk2.default.yellow(
68
- `No ${type} record at ${_B6XM5KSFcjs.withoutTrailingDot.call(void 0, name)}. Nothing to remove.`
69
- )
70
- );
71
- return;
72
- }
73
- console.log("Record to remove:");
74
- console.log(` Name: ${_B6XM5KSFcjs.withoutTrailingDot.call(void 0, name)}`);
75
- console.log(` Type: ${type}`);
76
- if (existing.isAlias) {
77
- console.log(
78
- ` Alias: ${_B6XM5KSFcjs.withoutTrailingDot.call(void 0, String(_nullishCoalesce(_optionalChain([existing, 'access', _ => _.aliasTarget, 'optionalAccess', _2 => _2.DNSName]), () => ( ""))))}`
79
- );
80
- } else {
81
- if (existing.ttl !== void 0) {
82
- console.log(` TTL: ${existing.ttl}`);
83
- }
84
- console.log(` Value:${_B6XM5KSFcjs.formatValues.call(void 0, existing.values)}`);
85
- }
86
- console.log("");
87
- if (dryRun) {
88
- console.log(_chalk2.default.cyan("Dry run \u2014 no changes made."));
89
- return;
90
- }
91
- if (!yes) {
92
- const confirmed = await _CMUD7LLNcjs.promptYesNo.call(void 0, {
93
- message: `Delete this ${type} record?`,
94
- defaultYes: false
95
- });
96
- if (!confirmed) {
97
- console.log("Aborted.");
98
- return;
99
- }
100
- }
101
- const changeInfo = _B6XM5KSFcjs.deleteResourceRecordSet.call(void 0, {
102
- profile,
103
- hostedZoneId: zone.id,
104
- record: existing,
105
- verbose
106
- });
107
- console.log("");
108
- console.log(
109
- _chalk2.default.green(`Done. Deleted ${type} ${_B6XM5KSFcjs.withoutTrailingDot.call(void 0, name)}.`)
110
- );
111
- if (_optionalChain([changeInfo, 'optionalAccess', _3 => _3.Id])) {
112
- console.log(` Change ID: ${changeInfo.Id}`);
113
- console.log(` Status: ${_nullishCoalesce(changeInfo.Status, () => ( "PENDING"))}`);
114
- }
115
- } catch (error) {
116
- if (error instanceof _zod.ZodError) {
117
- console.error(_chalk2.default.red("\n\u274C Invalid command options:"));
118
- error.errors.forEach((err) => {
119
- console.error(_chalk2.default.red(` ${err.path.join(".")}: ${err.message}`));
120
- });
121
- process.exit(1);
122
- }
123
- const verbose = (
124
- /** @type {any} */
125
- _optionalChain([options, 'optionalAccess', _4 => _4.verbose]) || false
126
- );
127
- console.error(_chalk2.default.red("\n\u274C remove-record failed:"));
128
- if (error instanceof _R3GUC7O7cjs.AwsCliError || error instanceof Error) {
129
- console.error(_chalk2.default.red(` ${error.message}`));
130
- if (verbose && error.stack) {
131
- console.error(_chalk2.default.gray("\nStack trace:"));
132
- console.error(_chalk2.default.gray(error.stack));
133
- }
134
- } else {
135
- console.error(_chalk2.default.red(` ${String(error)}`));
136
- }
137
- console.error(
138
- _chalk2.default.yellow("\n\u{1F4A1} Use --verbose for detailed error information\n")
139
- );
140
- process.exit(1);
141
- }
142
- }
143
-
144
-
145
-
146
- exports.removeRecordCommand = removeRecordCommand;