@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,20 +1,298 @@
1
- import {
2
- ACL_GROUPS,
3
- CUSTOM_POLICIES,
4
- attach,
5
- detach,
6
- ensureGroup,
7
- printFinalState,
8
- publishPolicy
9
- } from "../../../../__chunks/XOUWDB3T.js";
10
- import "../../../../__chunks/FNXUONAV.js";
11
- import "../../../../__chunks/ZO55YUSY.js";
12
- export {
13
- ACL_GROUPS,
14
- CUSTOM_POLICIES,
15
- attach,
16
- detach,
17
- ensureGroup,
18
- printFinalState,
19
- publishPolicy
20
- };
1
+ import { runAws } from "../../utils/exec-aws.js";
2
+ import { resolvePolicyPath } from "../../utils/resolve-policy-path.js";
3
+ //#region src/commands/aws/iam/setup-acl/utils.js
4
+ /**
5
+ * The five ACL groups managed by setup-acl.
6
+ */
7
+ const ACL_GROUPS = [
8
+ "acl-admin-do-not-use",
9
+ "acl-iam-full-access",
10
+ "acl-power-users",
11
+ "acl-read-only",
12
+ "acl-s3-restrictions"
13
+ ];
14
+ /**
15
+ * Custom managed policies published from bundled JSON documents.
16
+ * @type {Array<{ name: string; fileName: string }>}
17
+ */
18
+ const CUSTOM_POLICIES = [
19
+ {
20
+ name: "UserAdminsWriteList",
21
+ fileName: "user-admins-write-list.json"
22
+ },
23
+ {
24
+ name: "UserAdminsDenyList",
25
+ fileName: "user-admins-deny-list.json"
26
+ },
27
+ {
28
+ name: "UserAdminsSelfServiceIAM",
29
+ fileName: "user-admins-self-service-iam.json"
30
+ },
31
+ {
32
+ name: "UserAdminsDenyRegionsList",
33
+ fileName: "user-admins-deny-regions-list.json"
34
+ },
35
+ {
36
+ name: "sts-federation",
37
+ fileName: "sts-federation.json"
38
+ },
39
+ {
40
+ name: "S3RestrictionsDenyNonS3Services",
41
+ fileName: "s3-restrictions-deny-non-s3-services.json"
42
+ }
43
+ ];
44
+ /**
45
+ * Create an IAM group if it does not already exist.
46
+ * @param {{ name: string; profile?: string; verbose?: boolean }} params
47
+ */
48
+ function ensureGroup(params) {
49
+ const { name, profile, verbose } = params;
50
+ let exists = true;
51
+ try {
52
+ runAws({
53
+ profile,
54
+ args: [
55
+ "iam",
56
+ "get-group",
57
+ "--group-name",
58
+ name
59
+ ],
60
+ verbose
61
+ });
62
+ } catch {
63
+ exists = false;
64
+ }
65
+ if (exists) {
66
+ console.log(` Group exists: ${name}`);
67
+ return;
68
+ }
69
+ console.log(` Create group: ${name}`);
70
+ runAws({
71
+ profile,
72
+ args: [
73
+ "iam",
74
+ "create-group",
75
+ "--group-name",
76
+ name,
77
+ "--path",
78
+ "/"
79
+ ],
80
+ expectJson: false,
81
+ verbose
82
+ });
83
+ }
84
+ /**
85
+ * Create or update a customer-managed policy from a bundled JSON document.
86
+ * Handles the IAM five-version limit by pruning the oldest non-default version.
87
+ * @param {{ name: string; fileName: string; accountId: string; profile?: string; verbose?: boolean }} params
88
+ */
89
+ function publishPolicy(params) {
90
+ const { name, fileName, accountId, profile, verbose } = params;
91
+ const arn = `arn:aws:iam::${accountId}:policy/${name}`;
92
+ const file = resolvePolicyPath(fileName);
93
+ let exists = true;
94
+ try {
95
+ runAws({
96
+ profile,
97
+ args: [
98
+ "iam",
99
+ "get-policy",
100
+ "--policy-arn",
101
+ arn
102
+ ],
103
+ verbose
104
+ });
105
+ } catch {
106
+ exists = false;
107
+ }
108
+ if (!exists) {
109
+ console.log(` Create policy: ${name}`);
110
+ runAws({
111
+ profile,
112
+ args: [
113
+ "iam",
114
+ "create-policy",
115
+ "--policy-name",
116
+ name,
117
+ "--policy-document",
118
+ `file://${file}`,
119
+ "--description",
120
+ `ACL: ${name}`
121
+ ],
122
+ expectJson: false,
123
+ verbose
124
+ });
125
+ return;
126
+ }
127
+ if ((Number.parseInt(runAws({
128
+ profile,
129
+ args: [
130
+ "iam",
131
+ "list-policy-versions",
132
+ "--policy-arn",
133
+ arn,
134
+ "--query",
135
+ "length(Versions[?IsDefaultVersion==`false`])",
136
+ "--output",
137
+ "text"
138
+ ],
139
+ expectJson: false,
140
+ verbose
141
+ }), 10) || 0) >= 4) {
142
+ const oldest = runAws({
143
+ profile,
144
+ args: [
145
+ "iam",
146
+ "list-policy-versions",
147
+ "--policy-arn",
148
+ arn,
149
+ "--query",
150
+ "Versions[?IsDefaultVersion==`false`] | sort_by(@, &CreateDate)[0].VersionId",
151
+ "--output",
152
+ "text"
153
+ ],
154
+ expectJson: false,
155
+ verbose
156
+ });
157
+ console.log(` Prune oldest version of ${name}: ${oldest}`);
158
+ runAws({
159
+ profile,
160
+ args: [
161
+ "iam",
162
+ "delete-policy-version",
163
+ "--policy-arn",
164
+ arn,
165
+ "--version-id",
166
+ oldest
167
+ ],
168
+ expectJson: false,
169
+ verbose
170
+ });
171
+ }
172
+ console.log(` Update policy: ${name}`);
173
+ runAws({
174
+ profile,
175
+ args: [
176
+ "iam",
177
+ "create-policy-version",
178
+ "--policy-arn",
179
+ arn,
180
+ "--policy-document",
181
+ `file://${file}`,
182
+ "--set-as-default"
183
+ ],
184
+ expectJson: false,
185
+ verbose
186
+ });
187
+ }
188
+ /**
189
+ * @param {{ group: string; arn: string; profile?: string; verbose?: boolean }} params
190
+ * @returns {boolean}
191
+ */
192
+ function isPolicyAttached(params) {
193
+ const { group, arn, profile, verbose } = params;
194
+ const out = runAws({
195
+ profile,
196
+ args: [
197
+ "iam",
198
+ "list-attached-group-policies",
199
+ "--group-name",
200
+ group,
201
+ "--query",
202
+ `AttachedPolicies[?PolicyArn=='${arn}'].PolicyArn`,
203
+ "--output",
204
+ "text"
205
+ ],
206
+ expectJson: false,
207
+ verbose
208
+ });
209
+ return Boolean(out);
210
+ }
211
+ /**
212
+ * Attach a policy to a group if not already attached.
213
+ * @param {{ group: string; arn: string; profile?: string; verbose?: boolean }} params
214
+ */
215
+ function attach(params) {
216
+ const { group, arn, profile, verbose } = params;
217
+ const policyName = arn.split("/").pop() ?? arn;
218
+ if (isPolicyAttached({
219
+ group,
220
+ arn,
221
+ profile,
222
+ verbose
223
+ })) {
224
+ console.log(` [${group}] already attached: ${policyName}`);
225
+ return;
226
+ }
227
+ console.log(` [${group}] attach: ${policyName}`);
228
+ runAws({
229
+ profile,
230
+ args: [
231
+ "iam",
232
+ "attach-group-policy",
233
+ "--group-name",
234
+ group,
235
+ "--policy-arn",
236
+ arn
237
+ ],
238
+ expectJson: false,
239
+ verbose
240
+ });
241
+ }
242
+ /**
243
+ * Detach a (legacy) policy from a group if it is currently attached.
244
+ * @param {{ group: string; arn: string; profile?: string; verbose?: boolean }} params
245
+ */
246
+ function detach(params) {
247
+ const { group, arn, profile, verbose } = params;
248
+ const policyName = arn.split("/").pop() ?? arn;
249
+ if (!isPolicyAttached({
250
+ group,
251
+ arn,
252
+ profile,
253
+ verbose
254
+ })) return;
255
+ console.log(` [${group}] detach legacy: ${policyName}`);
256
+ runAws({
257
+ profile,
258
+ args: [
259
+ "iam",
260
+ "detach-group-policy",
261
+ "--group-name",
262
+ group,
263
+ "--policy-arn",
264
+ arn
265
+ ],
266
+ expectJson: false,
267
+ verbose
268
+ });
269
+ }
270
+ /**
271
+ * Print the attached policies for each ACL group.
272
+ * @param {{ profile?: string; verbose?: boolean }} params
273
+ */
274
+ function printFinalState(params) {
275
+ const { profile, verbose } = params;
276
+ for (const group of ACL_GROUPS) {
277
+ console.log("");
278
+ console.log(`=== ${group} ===`);
279
+ const table = runAws({
280
+ profile,
281
+ args: [
282
+ "iam",
283
+ "list-attached-group-policies",
284
+ "--group-name",
285
+ group,
286
+ "--query",
287
+ "AttachedPolicies[].PolicyName",
288
+ "--output",
289
+ "table"
290
+ ],
291
+ expectJson: false,
292
+ verbose
293
+ });
294
+ console.log(table);
295
+ }
296
+ }
297
+ //#endregion
298
+ export { ACL_GROUPS, CUSTOM_POLICIES, attach, detach, ensureGroup, printFinalState, publishPolicy };
@@ -1,12 +1,56 @@
1
- import {
2
- usersCommand
3
- } from "../../../../__chunks/JZPBBBIG.js";
4
- import "../../../../__chunks/XXK32TIM.js";
5
- import "../../../../__chunks/3QLI5BDL.js";
6
- import "../../../../__chunks/FNXUONAV.js";
7
- import "../../../../__chunks/5GIUAFXL.js";
8
- import "../../../../__chunks/73BJG53F.js";
9
- import "../../../../__chunks/ZHKVJO2U.js";
10
- export {
11
- usersCommand
12
- };
1
+ import { getCallerIdentity, requireCommands } from "../../utils/exec-aws.js";
2
+ import { resolveProfile } from "../../utils/resolve-profile.js";
3
+ import { usersOptionsSchema } from "./schema.js";
4
+ import { createUsersInteractive } from "./utils.js";
5
+ import chalk from "chalk";
6
+ import { ZodError } from "zod";
7
+ //#region src/commands/aws/iam/users/handler.js
8
+ /**
9
+ * `aws iam users` handler: interactively create IAM users and assign ACL groups.
10
+ * @param {unknown} options
11
+ */
12
+ async function usersCommand(options) {
13
+ try {
14
+ const { accountName, profile: profileOption, verbose } = usersOptionsSchema.parse(options);
15
+ requireCommands(["aws"]);
16
+ const profile = await resolveProfile({ profile: profileOption });
17
+ console.log(chalk.blue("\nAWS IAM user management"));
18
+ console.log("");
19
+ console.log("Caller:");
20
+ const identity = getCallerIdentity({
21
+ profile,
22
+ verbose
23
+ });
24
+ console.log(` Account: ${identity.Account}`);
25
+ console.log(` Arn: ${identity.Arn}`);
26
+ console.log("");
27
+ await createUsersInteractive({
28
+ accountName,
29
+ profile,
30
+ identity,
31
+ verbose
32
+ });
33
+ console.log("Done.");
34
+ } catch (error) {
35
+ if (error instanceof ZodError) {
36
+ console.error(chalk.red("\n❌ Invalid command options:"));
37
+ error.errors.forEach((err) => {
38
+ console.error(chalk.red(` ${err.path.join(".")}: ${err.message}`));
39
+ });
40
+ process.exit(1);
41
+ }
42
+ const verbose = options?.verbose || false;
43
+ console.error(chalk.red("\n❌ iam users failed:"));
44
+ if (error instanceof Error) {
45
+ console.error(chalk.red(` ${error.message}`));
46
+ if (verbose && error.stack) {
47
+ console.error(chalk.gray("\nStack trace:"));
48
+ console.error(chalk.gray(error.stack));
49
+ }
50
+ } else console.error(chalk.red(` ${String(error)}`));
51
+ console.error(chalk.yellow("\n💡 Requires the AWS CLI and a profile with IAM write access.\n"));
52
+ process.exit(1);
53
+ }
54
+ }
55
+ //#endregion
56
+ export { usersCommand };
@@ -1,41 +1,4 @@
1
- import "../../../../__chunks/CVQVHLW5.js";
2
- import {
3
- usersCommand
4
- } from "../../../../__chunks/JZPBBBIG.js";
5
- import {
6
- usersOptionsSchema
7
- } from "../../../../__chunks/XXK32TIM.js";
8
- import {
9
- buildUsername,
10
- createCliAccessKey,
11
- createUsersInteractive,
12
- ensureAclGroupsExist,
13
- ensureUser,
14
- ensureUserInGroup,
15
- inferAccountName,
16
- isValidSlug,
17
- normalizeIdentifier,
18
- normalizeSlug,
19
- parseMdUsername,
20
- roleToGroup
21
- } from "../../../../__chunks/3QLI5BDL.js";
22
- import "../../../../__chunks/FNXUONAV.js";
23
- import "../../../../__chunks/5GIUAFXL.js";
24
- import "../../../../__chunks/73BJG53F.js";
25
- import "../../../../__chunks/ZHKVJO2U.js";
26
- export {
27
- buildUsername,
28
- createCliAccessKey,
29
- createUsersInteractive,
30
- ensureAclGroupsExist,
31
- ensureUser,
32
- ensureUserInGroup,
33
- inferAccountName,
34
- isValidSlug,
35
- normalizeIdentifier,
36
- normalizeSlug,
37
- parseMdUsername,
38
- roleToGroup,
39
- usersCommand,
40
- usersOptionsSchema
41
- };
1
+ import { usersOptionsSchema } from "./schema.js";
2
+ import { buildUsername, createCliAccessKey, createUsersInteractive, ensureAclGroupsExist, ensureUser, ensureUserInGroup, inferAccountName, isValidSlug, normalizeIdentifier, normalizeSlug, parseMdUsername, roleToGroup } from "./utils.js";
3
+ import { usersCommand } from "./handler.js";
4
+ export { buildUsername, createCliAccessKey, createUsersInteractive, ensureAclGroupsExist, ensureUser, ensureUserInGroup, inferAccountName, isValidSlug, normalizeIdentifier, normalizeSlug, parseMdUsername, roleToGroup, usersCommand, usersOptionsSchema };
@@ -1,7 +1,16 @@
1
- import {
2
- usersOptionsSchema
3
- } from "../../../../__chunks/XXK32TIM.js";
4
- import "../../../../__chunks/73BJG53F.js";
5
- export {
6
- usersOptionsSchema
7
- };
1
+ import { profileField, verboseField } from "../../schema.js";
2
+ import { z } from "zod";
3
+ //#region src/commands/aws/iam/users/schema.js
4
+ /**
5
+ * Zod schema for `aws iam users` options.
6
+ */
7
+ const usersOptionsSchema = z.object({
8
+ accountName: z.string().optional().describe("AWS account slug used in md-{identifier}-{account}-{role}"),
9
+ profile: profileField,
10
+ verbose: verboseField
11
+ });
12
+ /**
13
+ * @typedef {z.infer<typeof usersOptionsSchema>} UsersOptions
14
+ */
15
+ //#endregion
16
+ export { usersOptionsSchema };