@mtndev/cli 1.1.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 (260) hide show
  1. package/CHANGELOG.md +91 -0
  2. package/cjs/__chunks/VH7oDXx4.cjs +28 -0
  3. package/cjs/commands/aws/ec2/allow-ip/handler.cjs +261 -0
  4. package/cjs/commands/aws/ec2/allow-ip/handler.d.ts +6 -0
  5. package/cjs/commands/aws/ec2/allow-ip/index.cjs +25 -0
  6. package/cjs/commands/aws/ec2/allow-ip/index.d.ts +3 -0
  7. package/cjs/commands/aws/ec2/allow-ip/schema.cjs +33 -0
  8. package/cjs/commands/aws/ec2/allow-ip/schema.d.ts +33 -0
  9. package/cjs/commands/aws/ec2/allow-ip/utils.cjs +379 -0
  10. package/cjs/commands/aws/ec2/allow-ip/utils.d.ts +189 -0
  11. package/cjs/commands/aws/iam/admin-group.cjs +111 -0
  12. package/cjs/commands/aws/iam/admin-group.d.ts +55 -0
  13. package/cjs/commands/aws/iam/break-glass/handler.cjs +127 -0
  14. package/cjs/commands/aws/iam/break-glass/handler.d.ts +7 -0
  15. package/cjs/commands/aws/iam/break-glass/index.cjs +7 -0
  16. package/cjs/commands/aws/iam/break-glass/index.d.ts +2 -0
  17. package/cjs/commands/aws/iam/break-glass/schema.cjs +21 -0
  18. package/cjs/commands/aws/iam/break-glass/schema.d.ts +25 -0
  19. package/cjs/commands/aws/iam/check-admin/handler.cjs +89 -0
  20. package/cjs/commands/aws/iam/check-admin/handler.d.ts +5 -0
  21. package/cjs/commands/aws/iam/check-admin/index.cjs +7 -0
  22. package/cjs/commands/aws/iam/check-admin/index.d.ts +2 -0
  23. package/cjs/commands/aws/iam/check-admin/schema.cjs +19 -0
  24. package/cjs/commands/aws/iam/check-admin/schema.d.ts +19 -0
  25. package/cjs/commands/aws/iam/policies/s3-restrictions-deny-non-s3-services.json +20 -0
  26. package/cjs/commands/aws/iam/policies/sts-federation.json +11 -0
  27. package/cjs/commands/aws/iam/policies/user-admins-deny-list.json +175 -0
  28. package/cjs/commands/aws/iam/policies/user-admins-deny-regions-list.json +41 -0
  29. package/cjs/commands/aws/iam/policies/user-admins-self-service-iam.json +56 -0
  30. package/cjs/commands/aws/iam/policies/user-admins-write-list.json +117 -0
  31. package/cjs/commands/aws/iam/remove-admin/handler.cjs +120 -0
  32. package/cjs/commands/aws/iam/remove-admin/handler.d.ts +6 -0
  33. package/cjs/commands/aws/iam/remove-admin/index.cjs +7 -0
  34. package/cjs/commands/aws/iam/remove-admin/index.d.ts +2 -0
  35. package/cjs/commands/aws/iam/remove-admin/schema.cjs +22 -0
  36. package/cjs/commands/aws/iam/remove-admin/schema.d.ts +28 -0
  37. package/cjs/commands/aws/iam/setup-acl/handler.cjs +227 -0
  38. package/cjs/commands/aws/iam/setup-acl/handler.d.ts +6 -0
  39. package/cjs/commands/aws/iam/setup-acl/index.cjs +13 -0
  40. package/cjs/commands/aws/iam/setup-acl/index.d.ts +3 -0
  41. package/cjs/commands/aws/iam/setup-acl/schema.cjs +19 -0
  42. package/cjs/commands/aws/iam/setup-acl/schema.d.ts +24 -0
  43. package/cjs/commands/aws/iam/setup-acl/utils.cjs +305 -0
  44. package/cjs/commands/aws/iam/setup-acl/utils.d.ts +61 -0
  45. package/cjs/commands/aws/iam/users/handler.cjs +59 -0
  46. package/cjs/commands/aws/iam/users/handler.d.ts +5 -0
  47. package/cjs/commands/aws/iam/users/index.cjs +18 -0
  48. package/cjs/commands/aws/iam/users/index.d.ts +3 -0
  49. package/cjs/commands/aws/iam/users/schema.cjs +17 -0
  50. package/cjs/commands/aws/iam/users/schema.d.ts +18 -0
  51. package/cjs/commands/aws/iam/users/utils.cjs +454 -0
  52. package/cjs/commands/aws/iam/users/utils.d.ts +119 -0
  53. package/cjs/commands/aws/index.cjs +223 -0
  54. package/cjs/commands/aws/index.d.ts +14 -0
  55. package/cjs/commands/aws/route53/add-record/handler.cjs +264 -0
  56. package/cjs/commands/aws/route53/add-record/handler.d.ts +36 -0
  57. package/cjs/commands/aws/route53/add-record/index.cjs +26 -0
  58. package/cjs/commands/aws/route53/add-record/index.d.ts +3 -0
  59. package/cjs/commands/aws/route53/add-record/schema.cjs +43 -0
  60. package/cjs/commands/aws/route53/add-record/schema.d.ts +45 -0
  61. package/cjs/commands/aws/route53/add-record/utils.cjs +404 -0
  62. package/cjs/commands/aws/route53/add-record/utils.d.ts +216 -0
  63. package/cjs/commands/aws/route53/remove-record/handler.cjs +114 -0
  64. package/cjs/commands/aws/route53/remove-record/handler.d.ts +6 -0
  65. package/cjs/commands/aws/route53/remove-record/index.cjs +5 -0
  66. package/cjs/commands/aws/route53/remove-record/index.d.ts +2 -0
  67. package/cjs/commands/aws/route53/remove-record/schema.cjs +22 -0
  68. package/cjs/commands/aws/route53/remove-record/schema.d.ts +30 -0
  69. package/cjs/commands/aws/schema.cjs +19 -0
  70. package/cjs/commands/aws/schema.d.ts +13 -0
  71. package/cjs/commands/aws/ses/send-email/handler.cjs +73 -0
  72. package/cjs/commands/aws/ses/send-email/handler.d.ts +5 -0
  73. package/cjs/commands/aws/ses/send-email/index.cjs +9 -0
  74. package/cjs/commands/aws/ses/send-email/index.d.ts +3 -0
  75. package/cjs/commands/aws/ses/send-email/schema.cjs +24 -0
  76. package/cjs/commands/aws/ses/send-email/schema.d.ts +39 -0
  77. package/cjs/commands/aws/ses/send-email/utils.cjs +87 -0
  78. package/cjs/commands/aws/ses/send-email/utils.d.ts +47 -0
  79. package/cjs/commands/aws/ses/smtp-password.cjs +72 -0
  80. package/cjs/commands/aws/ses/smtp-password.d.ts +21 -0
  81. package/cjs/commands/aws/utils/exec-aws.cjs +145 -0
  82. package/cjs/commands/aws/utils/exec-aws.d.ts +79 -0
  83. package/cjs/commands/aws/utils/resolve-policy-path.cjs +15 -0
  84. package/cjs/commands/aws/utils/resolve-policy-path.d.ts +8 -0
  85. package/cjs/commands/aws/utils/resolve-profile.cjs +93 -0
  86. package/cjs/commands/aws/utils/resolve-profile.d.ts +28 -0
  87. package/cjs/commands/aws/utils/tty.cjs +54 -0
  88. package/cjs/commands/aws/utils/tty.d.ts +24 -0
  89. package/cjs/commands/db/create-readonly-user/handler.cjs +254 -0
  90. package/cjs/commands/db/create-readonly-user/handler.d.ts +5 -0
  91. package/cjs/commands/db/create-readonly-user/index.cjs +18 -0
  92. package/cjs/commands/db/create-readonly-user/index.d.ts +3 -0
  93. package/cjs/commands/db/create-readonly-user/mysql.cjs +102 -0
  94. package/cjs/commands/db/create-readonly-user/mysql.d.ts +33 -0
  95. package/cjs/commands/db/create-readonly-user/postgres.cjs +209 -0
  96. package/cjs/commands/db/create-readonly-user/postgres.d.ts +31 -0
  97. package/cjs/commands/db/create-readonly-user/schema.cjs +39 -0
  98. package/cjs/commands/db/create-readonly-user/schema.d.ts +55 -0
  99. package/cjs/commands/db/create-readonly-user/utils.cjs +160 -0
  100. package/cjs/commands/db/create-readonly-user/utils.d.ts +112 -0
  101. package/cjs/commands/db/index.cjs +46 -0
  102. package/cjs/commands/db/index.d.ts +6 -0
  103. package/cjs/commands/doppler/handler.cjs +95 -9
  104. package/cjs/commands/doppler/index.cjs +33 -41
  105. package/cjs/commands/doppler/index.d.ts +1 -0
  106. package/cjs/commands/doppler/schema.cjs +130 -6
  107. package/cjs/commands/doppler/schema.d.ts +233 -17
  108. package/cjs/commands/doppler/set-secret.cjs +378 -0
  109. package/cjs/commands/doppler/set-secret.d.ts +113 -0
  110. package/cjs/commands/doppler/utils/exec.cjs +106 -12
  111. package/cjs/commands/doppler/utils.cjs +412 -30
  112. package/cjs/commands/doppler/utils.d.ts +32 -8
  113. package/cjs/commands/icons/handler.cjs +82 -8
  114. package/cjs/commands/icons/index.cjs +15 -31
  115. package/cjs/commands/icons/schema.cjs +101 -13
  116. package/cjs/commands/icons/schema.d.ts +1 -1
  117. package/cjs/commands/icons/utils.cjs +131 -13
  118. package/cjs/commands/index.cjs +54 -82
  119. package/cjs/commands/schema.cjs +25 -8
  120. package/cjs/index.cjs +3 -4
  121. package/esm/commands/aws/ec2/allow-ip/handler.d.ts +6 -0
  122. package/esm/commands/aws/ec2/allow-ip/handler.js +258 -0
  123. package/esm/commands/aws/ec2/allow-ip/index.d.ts +3 -0
  124. package/esm/commands/aws/ec2/allow-ip/index.js +4 -0
  125. package/esm/commands/aws/ec2/allow-ip/schema.d.ts +33 -0
  126. package/esm/commands/aws/ec2/allow-ip/schema.js +29 -0
  127. package/esm/commands/aws/ec2/allow-ip/utils.d.ts +189 -0
  128. package/esm/commands/aws/ec2/allow-ip/utils.js +363 -0
  129. package/esm/commands/aws/iam/admin-group.d.ts +55 -0
  130. package/esm/commands/aws/iam/admin-group.js +104 -0
  131. package/esm/commands/aws/iam/break-glass/handler.d.ts +7 -0
  132. package/esm/commands/aws/iam/break-glass/handler.js +124 -0
  133. package/esm/commands/aws/iam/break-glass/index.d.ts +2 -0
  134. package/esm/commands/aws/iam/break-glass/index.js +4 -0
  135. package/esm/commands/aws/iam/break-glass/schema.d.ts +25 -0
  136. package/esm/commands/aws/iam/break-glass/schema.js +19 -0
  137. package/esm/commands/aws/iam/check-admin/handler.d.ts +5 -0
  138. package/esm/commands/aws/iam/check-admin/handler.js +86 -0
  139. package/esm/commands/aws/iam/check-admin/index.d.ts +2 -0
  140. package/esm/commands/aws/iam/check-admin/index.js +4 -0
  141. package/esm/commands/aws/iam/check-admin/schema.d.ts +19 -0
  142. package/esm/commands/aws/iam/check-admin/schema.js +17 -0
  143. package/esm/commands/aws/iam/policies/s3-restrictions-deny-non-s3-services.json +20 -0
  144. package/esm/commands/aws/iam/policies/sts-federation.json +11 -0
  145. package/esm/commands/aws/iam/policies/user-admins-deny-list.json +175 -0
  146. package/esm/commands/aws/iam/policies/user-admins-deny-regions-list.json +41 -0
  147. package/esm/commands/aws/iam/policies/user-admins-self-service-iam.json +56 -0
  148. package/esm/commands/aws/iam/policies/user-admins-write-list.json +117 -0
  149. package/esm/commands/aws/iam/remove-admin/handler.d.ts +6 -0
  150. package/esm/commands/aws/iam/remove-admin/handler.js +117 -0
  151. package/esm/commands/aws/iam/remove-admin/index.d.ts +2 -0
  152. package/esm/commands/aws/iam/remove-admin/index.js +4 -0
  153. package/esm/commands/aws/iam/remove-admin/schema.d.ts +28 -0
  154. package/esm/commands/aws/iam/remove-admin/schema.js +20 -0
  155. package/esm/commands/aws/iam/setup-acl/handler.d.ts +6 -0
  156. package/esm/commands/aws/iam/setup-acl/handler.js +224 -0
  157. package/esm/commands/aws/iam/setup-acl/index.d.ts +3 -0
  158. package/esm/commands/aws/iam/setup-acl/index.js +4 -0
  159. package/esm/commands/aws/iam/setup-acl/schema.d.ts +24 -0
  160. package/esm/commands/aws/iam/setup-acl/schema.js +18 -0
  161. package/esm/commands/aws/iam/setup-acl/utils.d.ts +61 -0
  162. package/esm/commands/aws/iam/setup-acl/utils.js +298 -0
  163. package/esm/commands/aws/iam/users/handler.d.ts +5 -0
  164. package/esm/commands/aws/iam/users/handler.js +56 -0
  165. package/esm/commands/aws/iam/users/index.d.ts +3 -0
  166. package/esm/commands/aws/iam/users/index.js +4 -0
  167. package/esm/commands/aws/iam/users/schema.d.ts +18 -0
  168. package/esm/commands/aws/iam/users/schema.js +16 -0
  169. package/esm/commands/aws/iam/users/utils.d.ts +119 -0
  170. package/esm/commands/aws/iam/users/utils.js +440 -0
  171. package/esm/commands/aws/index.d.ts +14 -0
  172. package/esm/commands/aws/index.js +142 -0
  173. package/esm/commands/aws/route53/add-record/handler.d.ts +36 -0
  174. package/esm/commands/aws/route53/add-record/handler.js +258 -0
  175. package/esm/commands/aws/route53/add-record/index.d.ts +3 -0
  176. package/esm/commands/aws/route53/add-record/index.js +4 -0
  177. package/esm/commands/aws/route53/add-record/schema.d.ts +45 -0
  178. package/esm/commands/aws/route53/add-record/schema.js +40 -0
  179. package/esm/commands/aws/route53/add-record/utils.d.ts +216 -0
  180. package/esm/commands/aws/route53/add-record/utils.js +389 -0
  181. package/esm/commands/aws/route53/remove-record/handler.d.ts +6 -0
  182. package/esm/commands/aws/route53/remove-record/handler.js +111 -0
  183. package/esm/commands/aws/route53/remove-record/index.d.ts +2 -0
  184. package/esm/commands/aws/route53/remove-record/index.js +3 -0
  185. package/esm/commands/aws/route53/remove-record/schema.d.ts +30 -0
  186. package/esm/commands/aws/route53/remove-record/schema.js +21 -0
  187. package/esm/commands/aws/schema.d.ts +13 -0
  188. package/esm/commands/aws/schema.js +16 -0
  189. package/esm/commands/aws/ses/send-email/handler.d.ts +5 -0
  190. package/esm/commands/aws/ses/send-email/handler.js +70 -0
  191. package/esm/commands/aws/ses/send-email/index.d.ts +3 -0
  192. package/esm/commands/aws/ses/send-email/index.js +4 -0
  193. package/esm/commands/aws/ses/send-email/schema.d.ts +39 -0
  194. package/esm/commands/aws/ses/send-email/schema.js +23 -0
  195. package/esm/commands/aws/ses/send-email/utils.d.ts +47 -0
  196. package/esm/commands/aws/ses/send-email/utils.js +84 -0
  197. package/esm/commands/aws/ses/smtp-password.d.ts +21 -0
  198. package/esm/commands/aws/ses/smtp-password.js +69 -0
  199. package/esm/commands/aws/utils/exec-aws.d.ts +79 -0
  200. package/esm/commands/aws/utils/exec-aws.js +137 -0
  201. package/esm/commands/aws/utils/resolve-policy-path.d.ts +8 -0
  202. package/esm/commands/aws/utils/resolve-policy-path.js +14 -0
  203. package/esm/commands/aws/utils/resolve-profile.d.ts +28 -0
  204. package/esm/commands/aws/utils/resolve-profile.js +88 -0
  205. package/esm/commands/aws/utils/tty.d.ts +24 -0
  206. package/esm/commands/aws/utils/tty.js +51 -0
  207. package/esm/commands/db/create-readonly-user/handler.d.ts +5 -0
  208. package/esm/commands/db/create-readonly-user/handler.js +251 -0
  209. package/esm/commands/db/create-readonly-user/index.d.ts +3 -0
  210. package/esm/commands/db/create-readonly-user/index.js +4 -0
  211. package/esm/commands/db/create-readonly-user/mysql.d.ts +33 -0
  212. package/esm/commands/db/create-readonly-user/mysql.js +98 -0
  213. package/esm/commands/db/create-readonly-user/postgres.d.ts +31 -0
  214. package/esm/commands/db/create-readonly-user/postgres.js +205 -0
  215. package/esm/commands/db/create-readonly-user/schema.d.ts +55 -0
  216. package/esm/commands/db/create-readonly-user/schema.js +35 -0
  217. package/esm/commands/db/create-readonly-user/utils.d.ts +112 -0
  218. package/esm/commands/db/create-readonly-user/utils.js +151 -0
  219. package/esm/commands/db/index.d.ts +6 -0
  220. package/esm/commands/db/index.js +31 -0
  221. package/esm/commands/doppler/handler.js +92 -9
  222. package/esm/commands/doppler/index.d.ts +1 -0
  223. package/esm/commands/doppler/index.js +6 -41
  224. package/esm/commands/doppler/schema.d.ts +233 -17
  225. package/esm/commands/doppler/schema.js +125 -7
  226. package/esm/commands/doppler/set-secret.d.ts +113 -0
  227. package/esm/commands/doppler/set-secret.js +370 -0
  228. package/esm/commands/doppler/utils/exec.js +100 -12
  229. package/esm/commands/doppler/utils.d.ts +32 -8
  230. package/esm/commands/doppler/utils.js +396 -30
  231. package/esm/commands/icons/handler.js +79 -8
  232. package/esm/commands/icons/index.js +4 -31
  233. package/esm/commands/icons/schema.d.ts +1 -1
  234. package/esm/commands/icons/schema.js +97 -15
  235. package/esm/commands/icons/utils.js +125 -13
  236. package/esm/commands/index.js +49 -78
  237. package/esm/commands/schema.js +22 -7
  238. package/esm/index.js +3 -4
  239. package/package.json +12 -2
  240. package/vitest.config.ts +11 -0
  241. package/cjs/__chunks/4GFJUCSP.cjs +0 -52
  242. package/cjs/__chunks/4SFWHCB3.cjs +0 -133
  243. package/cjs/__chunks/B2KFW7T7.cjs +0 -1
  244. package/cjs/__chunks/EMMC33QA.cjs +0 -401
  245. package/cjs/__chunks/INFOPAHN.cjs +0 -117
  246. package/cjs/__chunks/J36P6UNE.cjs +0 -75
  247. package/cjs/__chunks/NIMXXHJQ.cjs +0 -92
  248. package/cjs/__chunks/NSRFG4DF.cjs +0 -100
  249. package/cjs/__chunks/WNJ3ZYLI.cjs +0 -1
  250. package/cjs/__chunks/ZMDIOZPT.cjs +0 -22
  251. package/esm/__chunks/46HGXFME.js +0 -0
  252. package/esm/__chunks/6G4PXXKF.js +0 -75
  253. package/esm/__chunks/6L5RNR7G.js +0 -100
  254. package/esm/__chunks/FL7AILGH.js +0 -133
  255. package/esm/__chunks/HJSXC6HP.js +0 -117
  256. package/esm/__chunks/O262GK4B.js +0 -401
  257. package/esm/__chunks/O3CCA76Q.js +0 -22
  258. package/esm/__chunks/SJXQJ7RS.js +0 -92
  259. package/esm/__chunks/SNCKIAOR.js +0 -0
  260. package/esm/__chunks/X3R5PSWH.js +0 -52
@@ -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,89 +1,60 @@
1
1
  #!/usr/bin/env node
2
- import {
3
- globalCommandsMetadata
4
- } from "../__chunks/O3CCA76Q.js";
5
- import "../__chunks/SNCKIAOR.js";
6
- import {
7
- iconsCommand
8
- } from "../__chunks/HJSXC6HP.js";
9
- import "../__chunks/FL7AILGH.js";
10
- import {
11
- iconsCommandMetadata
12
- } from "../__chunks/6G4PXXKF.js";
13
- import "../__chunks/46HGXFME.js";
14
- import {
15
- dopplerCommand
16
- } from "../__chunks/6L5RNR7G.js";
17
- import "../__chunks/O262GK4B.js";
18
- import "../__chunks/SJXQJ7RS.js";
19
- import {
20
- dopplerCommandMetadata
21
- } from "../__chunks/X3R5PSWH.js";
22
-
23
- // 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";
24
11
  import chalk from "chalk";
25
12
  import { program } from "commander";
13
+ //#region src/commands/index.js
26
14
  function displayWelcomeMessage() {
27
- console.log(chalk.bold.blue("\n\u{1F680} @mtndev/cli"));
28
- console.log(chalk.gray(` ${globalCommandsMetadata.description}
29
- `));
15
+ console.log(chalk.bold.blue("\n🚀 @mtndev/cli"));
16
+ console.log(chalk.gray(` ${globalCommandsMetadata.description}\n`));
30
17
  }
31
18
  displayWelcomeMessage();
32
- program.name(globalCommandsMetadata.name).description(globalCommandsMetadata.description).version(globalCommandsMetadata.version).option(
33
- `-${globalCommandsMetadata.options.verbose.alias}, --verbose`,
34
- globalCommandsMetadata.options.verbose.description,
35
- globalCommandsMetadata.options.verbose.default
36
- ).configureHelp({
37
- subcommandDescription: (cmd) => {
38
- const desc = cmd.summary() || cmd.description().split("\n")[0] || "";
39
- return desc + "\n";
40
- }
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
+ });
41
39
  });
42
- program.command("doppler [action]").summary("Manage Doppler configurations").description(dopplerCommandMetadata.description).option(
43
- `-${dopplerCommandMetadata.options.environment.alias}, --environment <env>`,
44
- dopplerCommandMetadata.options.environment.description,
45
- dopplerCommandMetadata.options.environment.default
46
- ).option(
47
- `-${dopplerCommandMetadata.options.help.alias}, --help`,
48
- dopplerCommandMetadata.options.help.description,
49
- dopplerCommandMetadata.options.help.default
50
- ).action(async (action, options, cmd) => {
51
- const globalOptions = cmd.parent?.opts() || {};
52
- await dopplerCommand({
53
- action,
54
- environment: options.environment,
55
- verbose: globalOptions.verbose,
56
- help: options.help
57
- });
58
- });
59
- program.command("icons <input>").summary("Generate app channel version icons with overlay text").description(iconsCommandMetadata.description).option(
60
- `-${iconsCommandMetadata.options.channels.alias}, --channels <channels>`,
61
- iconsCommandMetadata.options.channels.description,
62
- iconsCommandMetadata.options.channels.default
63
- ).option(
64
- `-${iconsCommandMetadata.options.iconTypes.alias}, --icon-types <types>`,
65
- iconsCommandMetadata.options.iconTypes.description,
66
- iconsCommandMetadata.options.iconTypes.default
67
- ).option(
68
- `-${iconsCommandMetadata.options.help.alias}, --help`,
69
- iconsCommandMetadata.options.help.description,
70
- iconsCommandMetadata.options.help.default
71
- ).action(async (input, options, cmd) => {
72
- const globalOptions = cmd.parent?.opts() || {};
73
- const channels = typeof options.channels === "string" ? options.channels.split(",").map((c) => c.trim()) : options.channels;
74
- const iconTypes = typeof options.iconTypes === "string" ? options.iconTypes.split(",").map((t) => t.trim()) : options.iconTypes;
75
- await iconsCommand({
76
- input,
77
- channels,
78
- iconTypes,
79
- verbose: globalOptions.verbose,
80
- help: options.help
81
- });
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
+ });
82
51
  });
52
+ registerAwsCommands(program);
53
+ registerDbCommands(program);
83
54
  program.on("command:*", () => {
84
- program.help();
55
+ program.help();
85
56
  });
86
- if (process.argv.length <= 2) {
87
- program.help();
88
- }
57
+ if (process.argv.length <= 2) program.help();
89
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": "1.1.0",
5
+ "version": "2.0.1",
6
6
  "license": "MIT",
7
7
  "publishConfig": {
8
8
  "access": "public"
@@ -24,12 +24,17 @@
24
24
  "module": "./esm/index.js",
25
25
  "types": "./esm/index.d.ts",
26
26
  "dependencies": {
27
+ "@aws-sdk/client-ses": "^3.1075.0",
28
+ "@aws-sdk/credential-providers": "^3.1075.0",
27
29
  "chalk": "^4.1.2",
28
30
  "chokidar": "^3.5.3",
29
31
  "commander": "^12.0.0",
30
32
  "cross-spawn": "^7.0.3",
31
33
  "fs-extra": "^11.2.0",
32
34
  "glob": "^11.1.0",
35
+ "mysql2": "^3.23.0",
36
+ "nodemailer": "^9.0.1",
37
+ "pg": "^8.22.0",
33
38
  "rimraf": "^5.0.5",
34
39
  "zod": "^3.22.4"
35
40
  },
@@ -38,7 +43,10 @@
38
43
  "@types/cross-spawn": "^6.0.6",
39
44
  "@types/fs-extra": "^11.0.4",
40
45
  "@types/node": "^20.11.0",
41
- "typescript": "^5.9.3"
46
+ "@types/nodemailer": "^8.0.1",
47
+ "@types/pg": "^8.20.0",
48
+ "typescript": "^5.9.3",
49
+ "vitest": "^4.1.10"
42
50
  },
43
51
  "exports": {
44
52
  ".": {
@@ -57,6 +65,8 @@
57
65
  "lint": "eslint \"src/**/*.{ts,tsx,js,jsx}\"",
58
66
  "lint:fix": "eslint \"src/**/*.{ts,tsx,js,jsx}\" --fix",
59
67
  "publish:staging": "libsync publish:staging --force",
68
+ "test": "vitest run",
69
+ "test:watch": "vitest",
60
70
  "typecheck": "libsync build --types-only"
61
71
  }
62
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,52 +0,0 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true});// src/commands/doppler/schema.js
2
- var _zod = require('zod');
3
- var dopplerCommandOptionsSchema = _zod.z.object({
4
- action: _zod.z.enum(["download", "upload"], {
5
- errorMap: () => ({
6
- message: "Action must be either 'download' or 'upload'"
7
- })
8
- }).optional().describe("Action to perform: download or upload configurations"),
9
- environment: _zod.z.string().optional().default("dev").describe(
10
- 'Environment configuration to process (e.g., dev, stg, prd, or "all" for all configs)'
11
- ),
12
- verbose: _zod.z.boolean().optional().default(false).describe("Enable verbose logging for detailed error information"),
13
- help: _zod.z.boolean().optional().default(false).describe("Display help for command")
14
- });
15
- var dopplerCommandMetadata = {
16
- name: "doppler",
17
- description: `Manage Doppler configurations
18
-
19
- Subcommands:
20
- download Download configurations from Doppler to local .env files
21
- upload Upload local .env files to Doppler (with confirmation prompt)
22
-
23
- Examples:
24
- $ @mtndev/cli doppler download # Download dev config to .env.dev
25
- $ @mtndev/cli doppler download -e all # Download all configs
26
- $ @mtndev/cli doppler download -e stg # Download staging config
27
- $ @mtndev/cli doppler upload # Upload .env.dev to Doppler
28
- $ @mtndev/cli doppler upload -e prd # Upload production config`,
29
- options: {
30
- environment: {
31
- description: dopplerCommandOptionsSchema.shape.environment.description,
32
- default: "dev",
33
- alias: "e"
34
- },
35
- // Global options are included here for help display
36
- verbose: {
37
- description: dopplerCommandOptionsSchema.shape.verbose.description,
38
- default: false,
39
- alias: "v"
40
- },
41
- help: {
42
- description: dopplerCommandOptionsSchema.shape.help.description,
43
- default: false,
44
- alias: "h"
45
- }
46
- }
47
- };
48
-
49
-
50
-
51
-
52
- exports.dopplerCommandOptionsSchema = dopplerCommandOptionsSchema; exports.dopplerCommandMetadata = dopplerCommandMetadata;
@@ -1,133 +0,0 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
2
-
3
-
4
- var _J36P6UNEcjs = require('./J36P6UNE.cjs');
5
-
6
- // src/commands/icons/utils.js
7
- var _child_process = require('child_process');
8
- var _fs = require('fs');
9
- var _path = require('path');
10
- var _chalk = require('chalk'); var _chalk2 = _interopRequireDefault(_chalk);
11
- function checkDependencies(verbose = false) {
12
- if (verbose) {
13
- console.log(_chalk2.default.blue("\n\u{1F50D} Checking dependencies..."));
14
- }
15
- try {
16
- _child_process.execSync.call(void 0, "which magick", { stdio: "pipe" });
17
- if (verbose) {
18
- console.log(_chalk2.default.green(" \u2713 ImageMagick is installed"));
19
- }
20
- } catch (e) {
21
- throw new Error(
22
- "ImageMagick is not installed. Please install it (brew install imagemagick) and try again."
23
- );
24
- }
25
- }
26
- function validateBaseIcons(baseDir, iconTypes, verbose = false) {
27
- if (verbose) {
28
- console.log(_chalk2.default.blue("\n\u{1F4C1} Validating base icons..."));
29
- }
30
- const resolvedDir = _path.resolve.call(void 0, baseDir);
31
- if (!_fs.existsSync.call(void 0, resolvedDir)) {
32
- throw new Error(`Input directory does not exist: ${resolvedDir}`);
33
- }
34
- const missingIcons = [];
35
- for (const iconType of iconTypes) {
36
- const iconPath = _path.join.call(void 0, resolvedDir, `${iconType}.png`);
37
- if (!_fs.existsSync.call(void 0, iconPath)) {
38
- missingIcons.push(`${iconType}.png`);
39
- } else if (verbose) {
40
- console.log(_chalk2.default.green(` \u2713 Found: ${iconType}.png`));
41
- }
42
- }
43
- if (missingIcons.length > 0) {
44
- throw new Error(
45
- `Missing base icons in ${resolvedDir}: ${missingIcons.join(", ")}`
46
- );
47
- }
48
- }
49
- function generateIcon(options) {
50
- const { baseDir, channel, iconType, verbose } = options;
51
- const resolvedDir = _path.resolve.call(void 0, baseDir);
52
- const inputFile = _path.join.call(void 0, resolvedDir, `${iconType}.png`);
53
- const outputFile = _path.join.call(void 0, resolvedDir, `${iconType}-${channel}.png`);
54
- const size = _J36P6UNEcjs.ICON_SIZE_MAP[
55
- /** @type {keyof typeof ICON_SIZE_MAP} */
56
- iconType
57
- ] || 378;
58
- const text = _J36P6UNEcjs.CHANNEL_TEXT_MAP[
59
- /** @type {keyof typeof CHANNEL_TEXT_MAP} */
60
- channel
61
- ] || channel.toUpperCase().slice(0, 3);
62
- const command = [
63
- "magick",
64
- `"${inputFile}"`,
65
- `-pointsize ${size}`,
66
- "-fill white",
67
- "-gravity center",
68
- "-font Arial-Black",
69
- "-stroke black",
70
- "-strokewidth 5",
71
- `-draw "rotate -45 text 0,0 '${text}'"`,
72
- `"${outputFile}"`
73
- ].join(" ");
74
- if (verbose) {
75
- console.log(_chalk2.default.gray(` Command: ${command}`));
76
- }
77
- try {
78
- _child_process.execSync.call(void 0, command, { stdio: verbose ? "inherit" : "pipe" });
79
- return outputFile;
80
- } catch (error) {
81
- throw new Error(
82
- `Failed to generate ${iconType}-${channel}.png: ${error instanceof Error ? error.message : String(error)}`
83
- );
84
- }
85
- }
86
- function generateAllIcons(options) {
87
- const { baseDir, channels, iconTypes, verbose } = options;
88
- const success = [];
89
- const failed = [];
90
- const totalIcons = channels.length * iconTypes.length;
91
- let current = 0;
92
- if (verbose) {
93
- console.log(_chalk2.default.blue(`
94
- \u{1F3A8} Generating ${totalIcons} icon(s)...`));
95
- }
96
- for (const channel of channels) {
97
- for (const iconType of iconTypes) {
98
- current++;
99
- const iconName = `${iconType}-${channel}.png`;
100
- if (verbose) {
101
- console.log(
102
- _chalk2.default.blue(`
103
- [${current}/${totalIcons}] Generating ${iconName}...`)
104
- );
105
- }
106
- try {
107
- const outputPath = generateIcon({
108
- baseDir,
109
- channel,
110
- iconType,
111
- verbose
112
- });
113
- success.push(outputPath);
114
- console.log(_chalk2.default.green(` \u2713 Generated: ${iconName}`));
115
- } catch (error) {
116
- const errorMessage = error instanceof Error ? error.message : String(error);
117
- failed.push({ icon: iconName, error: errorMessage });
118
- console.log(_chalk2.default.red(` \u2717 Failed: ${iconName}`));
119
- if (verbose) {
120
- console.log(_chalk2.default.red(` ${errorMessage}`));
121
- }
122
- }
123
- }
124
- }
125
- return { success, failed };
126
- }
127
-
128
-
129
-
130
-
131
-
132
-
133
- exports.checkDependencies = checkDependencies; exports.validateBaseIcons = validateBaseIcons; exports.generateIcon = generateIcon; exports.generateAllIcons = generateAllIcons;
@@ -1 +0,0 @@
1
- "use strict";