@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,46 +0,0 @@
1
- import {
2
- profileField,
3
- verboseField
4
- } from "./73BJG53F.js";
5
-
6
- // src/commands/aws/route53/add-record/schema.js
7
- import { z } from "zod";
8
- var RECORD_TYPES = [
9
- "A",
10
- "AAAA",
11
- "CNAME",
12
- "TXT",
13
- "MX",
14
- "NS",
15
- "SRV",
16
- "CAA"
17
- ];
18
- var DEFAULT_TTL = 300;
19
- var addRecordOptionsSchema = z.object({
20
- profile: profileField,
21
- zone: z.string().optional().describe(
22
- "Hosted zone name or ID (e.g. mountaindev.com or Z123\u2026). Skips the zone picker when set."
23
- ),
24
- type: z.string().optional().transform(
25
- (value) => value === void 0 ? void 0 : value.toUpperCase()
26
- ).refine(
27
- (value) => value === void 0 || typeof value === "string" && RECORD_TYPES.includes(value),
28
- {
29
- message: `Record type must be one of: ${RECORD_TYPES.join(", ")}`
30
- }
31
- ).describe(`DNS record type (${RECORD_TYPES.join(", ")})`),
32
- name: z.string().optional().describe(
33
- 'Record name relative to the zone (e.g. "redline") or a fully-qualified name'
34
- ),
35
- value: z.string().optional().describe("Record value (e.g. a CNAME target or A address)"),
36
- ttl: z.number().int().positive().optional().describe(`TTL in seconds (default: ${DEFAULT_TTL})`),
37
- yes: z.boolean().optional().default(false).describe("Skip the confirmation prompt"),
38
- dryRun: z.boolean().optional().default(false).describe("Preview the change without calling Route53"),
39
- verbose: verboseField
40
- });
41
-
42
- export {
43
- RECORD_TYPES,
44
- DEFAULT_TTL,
45
- addRecordOptionsSchema
46
- };
@@ -1,34 +0,0 @@
1
- import {
2
- RECORD_TYPES
3
- } from "./IEOGAQYI.js";
4
- import {
5
- profileField,
6
- verboseField
7
- } from "./73BJG53F.js";
8
-
9
- // src/commands/aws/route53/remove-record/schema.js
10
- import { z } from "zod";
11
- var removeRecordOptionsSchema = z.object({
12
- profile: profileField,
13
- zone: z.string().optional().describe(
14
- "Hosted zone name or ID (e.g. mountaindev.com or Z123\u2026). Skips the zone picker when set."
15
- ),
16
- type: z.string().optional().transform(
17
- (value) => value === void 0 ? void 0 : value.toUpperCase()
18
- ).refine(
19
- (value) => value === void 0 || typeof value === "string" && RECORD_TYPES.includes(value),
20
- {
21
- message: `Record type must be one of: ${RECORD_TYPES.join(", ")}`
22
- }
23
- ).describe(`DNS record type (${RECORD_TYPES.join(", ")})`),
24
- name: z.string().optional().describe(
25
- 'Record name relative to the zone (e.g. "redline") or a fully-qualified name'
26
- ),
27
- yes: z.boolean().optional().default(false).describe("Skip the confirmation prompt"),
28
- dryRun: z.boolean().optional().default(false).describe("Preview the deletion without calling Route53"),
29
- verbose: verboseField
30
- });
31
-
32
- export {
33
- removeRecordOptionsSchema
34
- };
@@ -1,26 +0,0 @@
1
- import {
2
- profileField,
3
- regionField,
4
- verboseField
5
- } from "./73BJG53F.js";
6
-
7
- // src/commands/aws/ec2/allow-ip/schema.js
8
- import { z } from "zod";
9
- var DEFAULT_REGION = "us-east-1";
10
- var SSH_PORT = 22;
11
- var DEFAULT_ROAMING_NAME = "Declan";
12
- var allowIpOptionsSchema = z.object({
13
- profile: profileField,
14
- region: regionField,
15
- ruleName: z.string().optional().describe(
16
- 'SSH rule description to update or create (default: "{FirstName} Roaming" derived from the profile/IAM user)'
17
- ),
18
- verbose: verboseField
19
- });
20
-
21
- export {
22
- DEFAULT_REGION,
23
- SSH_PORT,
24
- DEFAULT_ROAMING_NAME,
25
- allowIpOptionsSchema
26
- };
@@ -1,74 +0,0 @@
1
- import {
2
- usersOptionsSchema
3
- } from "./XXK32TIM.js";
4
- import {
5
- createUsersInteractive
6
- } from "./3QLI5BDL.js";
7
- import {
8
- getCallerIdentity,
9
- requireCommands
10
- } from "./FNXUONAV.js";
11
- import {
12
- resolveProfile
13
- } from "./5GIUAFXL.js";
14
-
15
- // src/commands/aws/iam/users/handler.js
16
- import chalk from "chalk";
17
- import { ZodError } from "zod";
18
- async function usersCommand(options) {
19
- try {
20
- const {
21
- accountName,
22
- profile: profileOption,
23
- verbose
24
- } = usersOptionsSchema.parse(options);
25
- requireCommands(["aws"]);
26
- const profile = await resolveProfile({ profile: profileOption });
27
- console.log(chalk.blue("\nAWS IAM user management"));
28
- console.log("");
29
- console.log("Caller:");
30
- const identity = getCallerIdentity({ profile, verbose });
31
- console.log(` Account: ${identity.Account}`);
32
- console.log(` Arn: ${identity.Arn}`);
33
- console.log("");
34
- await createUsersInteractive({
35
- accountName,
36
- profile,
37
- identity,
38
- verbose
39
- });
40
- console.log("Done.");
41
- } catch (error) {
42
- if (error instanceof ZodError) {
43
- console.error(chalk.red("\n\u274C Invalid command options:"));
44
- error.errors.forEach((err) => {
45
- console.error(chalk.red(` ${err.path.join(".")}: ${err.message}`));
46
- });
47
- process.exit(1);
48
- }
49
- const verbose = (
50
- /** @type {any} */
51
- options?.verbose || false
52
- );
53
- console.error(chalk.red("\n\u274C iam users failed:"));
54
- if (error instanceof Error) {
55
- console.error(chalk.red(` ${error.message}`));
56
- if (verbose && error.stack) {
57
- console.error(chalk.gray("\nStack trace:"));
58
- console.error(chalk.gray(error.stack));
59
- }
60
- } else {
61
- console.error(chalk.red(` ${String(error)}`));
62
- }
63
- console.error(
64
- chalk.yellow(
65
- "\n\u{1F4A1} Requires the AWS CLI and a profile with IAM write access.\n"
66
- )
67
- );
68
- process.exit(1);
69
- }
70
- }
71
-
72
- export {
73
- usersCommand
74
- };
@@ -1,135 +0,0 @@
1
- // src/commands/doppler/schema.js
2
- import { z } from "zod";
3
- var environmentsBase = z.string().optional().describe(
4
- 'Environments to process, comma-separated (e.g., dev,stg,prd or "all")'
5
- );
6
- var commonFields = {
7
- verbose: z.boolean().optional().default(false).describe("Enable verbose logging for detailed error information"),
8
- help: z.boolean().optional().default(false).describe("Display help for command")
9
- };
10
- var dopplerDownloadSchema = z.object({
11
- action: z.literal("download"),
12
- environments: environmentsBase.default("dev"),
13
- ...commonFields
14
- });
15
- var dopplerUploadSchema = z.object({
16
- action: z.literal("upload"),
17
- environments: environmentsBase.default("all"),
18
- ...commonFields
19
- });
20
- var dopplerCloneSchema = z.object({
21
- action: z.literal("clone"),
22
- from: z.string({ required_error: "--from <project> is required for clone" }).describe("Source Doppler project name"),
23
- to: z.string({ required_error: "--to <project> is required for clone" }).describe("Target Doppler project name"),
24
- force: z.boolean().optional().default(false).describe("Skip confirmation prompts when overwriting existing secrets"),
25
- environments: environmentsBase.default("all"),
26
- ...commonFields
27
- });
28
- var dopplerSetSchema = z.object({
29
- action: z.literal("set"),
30
- project: z.string().optional().describe("Doppler project name (prompts when omitted)"),
31
- environment: z.string().optional().describe(
32
- 'Doppler environment id (e.g. dev, stg, prd) or "all" (prompts when omitted)'
33
- ),
34
- config: z.string().optional().describe(
35
- 'Config name, comma-separated list, or "all" within the chosen environment (prompts when omitted)'
36
- ),
37
- name: z.string().optional().describe("Secret name / env var key (e.g. DATABASE_URL)"),
38
- value: z.string().optional().describe("Secret value (prompts when omitted)"),
39
- yes: z.boolean().optional().default(false).describe("Skip the confirmation prompt"),
40
- ...commonFields
41
- });
42
- var dopplerCommandOptionsSchema = z.discriminatedUnion("action", [
43
- dopplerDownloadSchema,
44
- dopplerUploadSchema,
45
- dopplerCloneSchema,
46
- dopplerSetSchema
47
- ]);
48
- var dopplerCommandMetadata = {
49
- name: "doppler",
50
- description: `Manage Doppler configurations
51
-
52
- Subcommands:
53
- download Download configurations from Doppler to local .env files
54
- upload Upload local .env files to Doppler (with confirmation prompt)
55
- clone Clone all secrets from one Doppler project to another
56
- set Add or update a secret (interactive project/env/config picker)
57
-
58
- Examples:
59
- $ @mtndev/cli doppler download # Download dev config
60
- $ @mtndev/cli doppler download -e all # Download all configs
61
- $ @mtndev/cli doppler download -e dev,stg # Download dev and stg
62
- $ @mtndev/cli doppler upload # Upload .env.dev
63
- $ @mtndev/cli doppler upload -e prd # Upload production config
64
- $ @mtndev/cli doppler clone --from my-app --to my-app-copy # Clone all configs
65
- $ @mtndev/cli doppler clone --from my-app --to my-app-copy -e dev,stg # Clone specific envs
66
- $ @mtndev/cli doppler clone --from my-app --to my-app-copy --force # Clone without prompts
67
- $ @mtndev/cli doppler set # Interactive set
68
- $ @mtndev/cli doppler set -p core --environment dev -c dev --name API_KEY --value secret --yes`,
69
- options: {
70
- environments: {
71
- description: dopplerDownloadSchema.shape.environments.description,
72
- default: "dev",
73
- alias: "e"
74
- },
75
- from: {
76
- description: dopplerCloneSchema.shape.from.description,
77
- default: void 0
78
- },
79
- to: {
80
- description: dopplerCloneSchema.shape.to.description,
81
- default: void 0
82
- },
83
- force: {
84
- description: dopplerCloneSchema.shape.force.description,
85
- default: false,
86
- alias: "f"
87
- },
88
- project: {
89
- description: dopplerSetSchema.shape.project.description,
90
- default: void 0,
91
- alias: "p"
92
- },
93
- environment: {
94
- description: dopplerSetSchema.shape.environment.description,
95
- default: void 0
96
- },
97
- config: {
98
- description: dopplerSetSchema.shape.config.description,
99
- default: void 0,
100
- alias: "c"
101
- },
102
- name: {
103
- description: dopplerSetSchema.shape.name.description,
104
- default: void 0
105
- },
106
- value: {
107
- description: dopplerSetSchema.shape.value.description,
108
- default: void 0
109
- },
110
- yes: {
111
- description: dopplerSetSchema.shape.yes.description,
112
- default: false,
113
- alias: "y"
114
- },
115
- verbose: {
116
- description: dopplerDownloadSchema.shape.verbose.description,
117
- default: false,
118
- alias: "v"
119
- },
120
- help: {
121
- description: dopplerDownloadSchema.shape.help.description,
122
- default: false,
123
- alias: "h"
124
- }
125
- }
126
- };
127
-
128
- export {
129
- dopplerDownloadSchema,
130
- dopplerUploadSchema,
131
- dopplerCloneSchema,
132
- dopplerSetSchema,
133
- dopplerCommandOptionsSchema,
134
- dopplerCommandMetadata
135
- };
@@ -1,313 +0,0 @@
1
- import {
2
- applyMysqlReadonly,
3
- listMysqlDatabases
4
- } from "./3HE4BEJX.js";
5
- import {
6
- applyPostgresReadonly,
7
- listPostgresDatabases
8
- } from "./SD3E3EPH.js";
9
- import {
10
- DEFAULT_MYSQL_HOST_PATTERN,
11
- DEFAULT_READONLY_USERNAME,
12
- ENGINES,
13
- createReadonlyUserOptionsSchema
14
- } from "./T3TTUHTW.js";
15
- import {
16
- buildReadonlyUrl,
17
- detectEngineFromUrl,
18
- generatePassword,
19
- parseConnectionUrl,
20
- resolveAdminUrl
21
- } from "./DLEJ25GZ.js";
22
- import {
23
- prompt,
24
- promptChoice,
25
- promptYesNo
26
- } from "./ZHKVJO2U.js";
27
-
28
- // src/commands/db/create-readonly-user/handler.js
29
- import chalk from "chalk";
30
- import { ZodError } from "zod";
31
- async function resolveEngine(engineOption, url) {
32
- if (engineOption) {
33
- return engineOption;
34
- }
35
- if (url) {
36
- const detected = detectEngineFromUrl(url);
37
- if (detected) {
38
- return detected;
39
- }
40
- }
41
- const index = await promptChoice({
42
- message: "Choose a database engine:",
43
- options: ["postgres", "mysql"]
44
- });
45
- const chosen = ENGINES[index];
46
- if (!chosen) {
47
- throw new Error("No engine selected");
48
- }
49
- return chosen;
50
- }
51
- async function resolveUrl(params) {
52
- const { urlOption, engine } = params;
53
- const fromEnv = resolveAdminUrl({ url: urlOption, engine });
54
- if (fromEnv) {
55
- return fromEnv;
56
- }
57
- const example = engine === "postgres" ? "postgresql://admin:pass@host:5432/postgres" : "mysql://admin:pass@host:3306/";
58
- const raw = await prompt(` Admin connection URL (e.g. ${example}): `);
59
- if (!raw) {
60
- throw new Error(
61
- "Admin connection URL is required (pass --url or set DATABASE_URL)"
62
- );
63
- }
64
- return raw;
65
- }
66
- async function resolveScope(params) {
67
- const { databaseOption, databases } = params;
68
- if (databaseOption) {
69
- const normalized = databaseOption.trim().toLowerCase();
70
- if (normalized === "all" || normalized === "*") {
71
- return { mode: "all", databases };
72
- }
73
- if (!databases.includes(databaseOption)) {
74
- throw new Error(
75
- `Database "${databaseOption}" not found. Available: ${databases.join(", ") || "(none)"}`
76
- );
77
- }
78
- return { mode: "one", databases: [databaseOption] };
79
- }
80
- if (databases.length === 0) {
81
- throw new Error("No user databases found to grant access on.");
82
- }
83
- const options = [
84
- ...databases.map((name) => name),
85
- `all (${databases.length} databases)`
86
- ];
87
- const index = await promptChoice({
88
- message: "Grant read-only on which database?",
89
- options
90
- });
91
- if (index === options.length - 1) {
92
- return { mode: "all", databases };
93
- }
94
- const chosen = databases[index];
95
- if (!chosen) {
96
- throw new Error("No database selected");
97
- }
98
- return { mode: "one", databases: [chosen] };
99
- }
100
- async function resolveUsername(usernameOption) {
101
- if (usernameOption) {
102
- return usernameOption;
103
- }
104
- const raw = await prompt(
105
- ` Read-only username [default: ${DEFAULT_READONLY_USERNAME}]: `
106
- );
107
- const username = raw || DEFAULT_READONLY_USERNAME;
108
- if (!/^[A-Za-z0-9_]+$/.test(username)) {
109
- throw new Error(
110
- "Username must contain only letters, numbers, and underscores"
111
- );
112
- }
113
- return username;
114
- }
115
- async function resolvePassword(passwordOption) {
116
- if (passwordOption) {
117
- return { password: passwordOption, generated: false };
118
- }
119
- const generate = await promptYesNo({
120
- message: " Generate a random password?",
121
- defaultYes: true
122
- });
123
- if (generate) {
124
- return { password: generatePassword(), generated: true };
125
- }
126
- const password = await prompt(" Password: ");
127
- if (!password) {
128
- throw new Error("Password is required");
129
- }
130
- return { password, generated: false };
131
- }
132
- function redactUrl(url) {
133
- try {
134
- const parsed = new URL(url);
135
- if (parsed.password) {
136
- parsed.password = "***";
137
- }
138
- return parsed.toString();
139
- } catch {
140
- return url;
141
- }
142
- }
143
- async function createReadonlyUserCommand(options) {
144
- try {
145
- const {
146
- engine: engineOption,
147
- url: urlOption,
148
- database: databaseOption,
149
- username: usernameOption,
150
- password: passwordOption,
151
- hostPattern: hostPatternOption,
152
- ssl: sslOption,
153
- yes,
154
- dryRun,
155
- verbose
156
- } = createReadonlyUserOptionsSchema.parse(options);
157
- console.log(chalk.blue("\nCreate read-only database user"));
158
- console.log("");
159
- const urlForDetect = resolveAdminUrl({
160
- url: urlOption,
161
- engine: engineOption
162
- });
163
- const engine = await resolveEngine(engineOption, urlForDetect);
164
- console.log(`Engine: ${engine}`);
165
- const url = await resolveUrl({ urlOption, engine });
166
- const config = parseConnectionUrl({
167
- url,
168
- engine,
169
- sslOption
170
- });
171
- console.log(
172
- `Admin: ${config.user}@${config.host}:${config.port}` + (config.database ? `/${config.database}` : "")
173
- );
174
- console.log("");
175
- const listed = engine === "postgres" ? await listPostgresDatabases(config) : await listMysqlDatabases(config);
176
- if (verbose) {
177
- console.log(`Found databases: ${listed.join(", ") || "(none)"}`);
178
- console.log("");
179
- }
180
- const scope = await resolveScope({
181
- databaseOption,
182
- databases: listed
183
- });
184
- console.log(
185
- scope.mode === "all" ? `Scope: all (${scope.databases.length} databases)` : `Scope: ${scope.databases[0]}`
186
- );
187
- console.log("");
188
- const username = await resolveUsername(usernameOption);
189
- const { password, generated } = await resolvePassword(passwordOption);
190
- const hostPattern = hostPatternOption ?? DEFAULT_MYSQL_HOST_PATTERN;
191
- console.log("");
192
- console.log("Plan:");
193
- console.log(` User: ${username}`);
194
- console.log(
195
- ` Password: ${generated ? "(generated)" : "(provided)"}${dryRun ? " [dry-run]" : ""}`
196
- );
197
- if (engine === "mysql") {
198
- console.log(` Host: ${hostPattern}`);
199
- }
200
- console.log(
201
- scope.mode === "all" ? ` Grants: SELECT on ALL databases (${scope.databases.length})` : ` Grants: SELECT on ${scope.databases[0]}`
202
- );
203
- if (scope.mode === "all" && engine === "postgres") {
204
- console.log(
205
- chalk.yellow(
206
- " Note: Databases created later will NOT get these grants automatically \u2014 re-run this command."
207
- )
208
- );
209
- }
210
- console.log("");
211
- if (!yes && !dryRun) {
212
- const confirmed = await promptYesNo({
213
- message: "Apply these changes?",
214
- defaultYes: false
215
- });
216
- if (!confirmed) {
217
- console.log("Aborted.");
218
- return;
219
- }
220
- console.log("");
221
- }
222
- const result = engine === "postgres" ? await applyPostgresReadonly({
223
- config,
224
- username,
225
- password,
226
- databases: scope.databases,
227
- dryRun,
228
- verbose
229
- }) : await applyMysqlReadonly({
230
- config,
231
- username,
232
- password,
233
- databases: scope.mode === "all" ? "all" : scope.databases,
234
- hostPattern,
235
- dryRun,
236
- verbose
237
- });
238
- if (dryRun) {
239
- console.log(chalk.cyan("Dry run \u2014 SQL that would run:"));
240
- for (const statement of result.statements) {
241
- console.log(` ${statement}`);
242
- }
243
- console.log("");
244
- console.log(chalk.cyan("No changes made."));
245
- return;
246
- }
247
- console.log(
248
- chalk.green(
249
- result.created ? `Created user "${username}" and granted read-only access.` : `Updated user "${username}" password and refreshed read-only grants.`
250
- )
251
- );
252
- console.log("");
253
- const sampleDb = scope.mode === "one" ? scope.databases[0] ?? "" : scope.databases[0] ?? "";
254
- const readonlyUrl = buildReadonlyUrl({
255
- engine,
256
- host: config.host,
257
- port: config.port,
258
- username,
259
- password,
260
- database: sampleDb
261
- });
262
- console.log("Connection (secret shown once \u2014 copy now):");
263
- console.log(
264
- "\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"
265
- );
266
- console.log(readonlyUrl);
267
- if (scope.mode === "all") {
268
- console.log("");
269
- console.log(
270
- chalk.gray(
271
- ` (URL uses database "${sampleDb}" as an example; user can connect to any granted database.)`
272
- )
273
- );
274
- }
275
- console.log(
276
- "\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"
277
- );
278
- console.log("");
279
- console.log(chalk.gray(`Admin URL used: ${redactUrl(url)}`));
280
- } catch (error) {
281
- if (error instanceof ZodError) {
282
- console.error(chalk.red("\n\u274C Invalid command options:"));
283
- error.errors.forEach((err) => {
284
- console.error(chalk.red(` ${err.path.join(".")}: ${err.message}`));
285
- });
286
- process.exit(1);
287
- }
288
- const verbose = (
289
- /** @type {any} */
290
- options?.verbose || false
291
- );
292
- console.error(chalk.red("\n\u274C create-readonly-user failed:"));
293
- if (error instanceof Error) {
294
- console.error(chalk.red(` ${error.message}`));
295
- if (verbose && error.stack) {
296
- console.error(chalk.gray("\nStack trace:"));
297
- console.error(chalk.gray(error.stack));
298
- }
299
- } else {
300
- console.error(chalk.red(` ${String(error)}`));
301
- }
302
- console.error(
303
- chalk.yellow(
304
- "\n\u{1F4A1} Pass --url or set DATABASE_URL. Use --verbose for details.\n"
305
- )
306
- );
307
- process.exit(1);
308
- }
309
- }
310
-
311
- export {
312
- createReadonlyUserCommand
313
- };