@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,338 +0,0 @@
1
- import {
2
- DEFAULT_TTL
3
- } from "./IEOGAQYI.js";
4
- import {
5
- runAws
6
- } from "./FNXUONAV.js";
7
-
8
- // src/commands/aws/route53/add-record/utils.js
9
- function bareHostedZoneId(rawId) {
10
- return rawId.replace(/^\/hostedzone\//, "");
11
- }
12
- function withTrailingDot(name) {
13
- const trimmed = name.trim();
14
- if (trimmed === "") {
15
- return trimmed;
16
- }
17
- return trimmed.endsWith(".") ? trimmed : `${trimmed}.`;
18
- }
19
- function withoutTrailingDot(name) {
20
- return name.endsWith(".") ? name.slice(0, -1) : name;
21
- }
22
- function listHostedZones(params) {
23
- const { profile, verbose } = params;
24
- const data = runAws({
25
- profile,
26
- args: ["route53", "list-hosted-zones"],
27
- verbose
28
- });
29
- const zones = [];
30
- for (const zone of data.HostedZones ?? []) {
31
- const id = bareHostedZoneId(String(zone.Id ?? ""));
32
- const name = withTrailingDot(String(zone.Name ?? ""));
33
- if (!id || !name) {
34
- continue;
35
- }
36
- zones.push({
37
- id,
38
- name,
39
- privateZone: Boolean(zone.Config?.PrivateZone),
40
- recordCount: Number(zone.ResourceRecordSetCount ?? 0)
41
- });
42
- }
43
- return zones.sort((a, b) => a.name.localeCompare(b.name));
44
- }
45
- function findHostedZone(params) {
46
- const { zones, zoneInput } = params;
47
- const input = zoneInput.trim();
48
- if (!input) {
49
- return null;
50
- }
51
- const bareId = bareHostedZoneId(input);
52
- const byId = zones.find((zone) => zone.id === bareId);
53
- if (byId) {
54
- return byId;
55
- }
56
- const normalized = withTrailingDot(input).toLowerCase();
57
- const matches = zones.filter(
58
- (zone) => zone.name.toLowerCase() === normalized
59
- );
60
- if (matches.length === 1) {
61
- return matches[0] ?? null;
62
- }
63
- if (matches.length > 1) {
64
- return matches.find((zone) => !zone.privateZone) ?? matches[0] ?? null;
65
- }
66
- return null;
67
- }
68
- function hostedZoneLabel(zone) {
69
- const visibility = zone.privateZone ? "private" : "public";
70
- return `${withoutTrailingDot(zone.name)} (${zone.id}, ${visibility}, ${zone.recordCount} records)`;
71
- }
72
- function resolveRecordName(params) {
73
- const { nameInput, zoneName } = params;
74
- const zoneFqdn = withTrailingDot(zoneName);
75
- const raw = nameInput.trim();
76
- if (raw === "" || raw === "@") {
77
- return zoneFqdn;
78
- }
79
- const asFqdn = withTrailingDot(raw);
80
- const zoneLower = zoneFqdn.toLowerCase();
81
- if (asFqdn.toLowerCase() === zoneLower) {
82
- return zoneFqdn;
83
- }
84
- if (asFqdn.toLowerCase().endsWith(`.${zoneLower}`)) {
85
- return asFqdn;
86
- }
87
- const relative = raw.replace(/\.$/, "");
88
- return withTrailingDot(`${relative}.${withoutTrailingDot(zoneFqdn)}`);
89
- }
90
- function getRecordSetsAtName(params) {
91
- const { profile, hostedZoneId, name, verbose } = params;
92
- const targetName = withTrailingDot(name).toLowerCase();
93
- let startRecordName = withTrailingDot(name);
94
- let startRecordType;
95
- let nextRecordIdentifier;
96
- const collected = [];
97
- for (let page = 0; page < 20; page += 1) {
98
- const args = [
99
- "route53",
100
- "list-resource-record-sets",
101
- "--hosted-zone-id",
102
- hostedZoneId,
103
- "--max-items",
104
- "100"
105
- ];
106
- if (startRecordName) {
107
- args.push("--start-record-name", startRecordName);
108
- }
109
- if (startRecordType) {
110
- args.push("--start-record-type", startRecordType);
111
- }
112
- if (nextRecordIdentifier) {
113
- args.push("--start-record-identifier", nextRecordIdentifier);
114
- }
115
- const data = runAws({ profile, args, verbose });
116
- const sets = data.ResourceRecordSets ?? [];
117
- for (const set of sets) {
118
- const setName = withTrailingDot(String(set.Name ?? "")).toLowerCase();
119
- if (setName === targetName) {
120
- collected.push(normalizeRecordSet(set));
121
- continue;
122
- }
123
- if (setName > targetName) {
124
- return collected;
125
- }
126
- }
127
- const truncated = data.IsTruncated === true;
128
- if (!truncated) {
129
- return collected;
130
- }
131
- startRecordName = data.NextRecordName ? String(data.NextRecordName) : startRecordName;
132
- startRecordType = data.NextRecordType ? String(data.NextRecordType) : void 0;
133
- nextRecordIdentifier = data.NextRecordIdentifier ? String(data.NextRecordIdentifier) : void 0;
134
- }
135
- return collected;
136
- }
137
- function getResourceRecordSet(params) {
138
- const { type, ...rest } = params;
139
- const targetType = type.toUpperCase();
140
- const sets = getRecordSetsAtName(rest);
141
- return sets.find((set) => set.type === targetType) ?? null;
142
- }
143
- function findCnameConflicts(params) {
144
- const { existingSets, type } = params;
145
- const upperType = type.toUpperCase();
146
- return existingSets.filter((set) => {
147
- if (set.type === upperType) {
148
- return false;
149
- }
150
- return upperType === "CNAME" || set.type === "CNAME";
151
- });
152
- }
153
- function normalizeRecordSet(set) {
154
- const values = (set.ResourceRecords ?? []).map(
155
- (record) => String(record.Value ?? "")
156
- );
157
- return {
158
- name: withTrailingDot(String(set.Name ?? "")),
159
- type: String(set.Type ?? "").toUpperCase(),
160
- ttl: typeof set.TTL === "number" ? set.TTL : void 0,
161
- values,
162
- isAlias: Boolean(set.AliasTarget),
163
- aliasTarget: set.AliasTarget ?? void 0
164
- };
165
- }
166
- function formatValues(values) {
167
- if (values.length === 0) {
168
- return "(none)";
169
- }
170
- if (values.length === 1) {
171
- return values[0] ?? "(none)";
172
- }
173
- return values.map((value) => `
174
- - ${value}`).join("");
175
- }
176
- function normalizeRecordValue(params) {
177
- const { type, value } = params;
178
- const trimmed = value.trim();
179
- if (type === "CNAME" || type === "NS" || type === "MX" || type === "SRV") {
180
- if (type === "MX") {
181
- const parts = trimmed.split(/\s+/);
182
- if (parts.length >= 2) {
183
- const priority = parts[0];
184
- const exchange = parts.slice(1).join(" ");
185
- return `${priority} ${withTrailingDot(exchange)}`;
186
- }
187
- }
188
- if (type === "SRV") {
189
- const parts = trimmed.split(/\s+/);
190
- if (parts.length >= 4) {
191
- const prefix = parts.slice(0, 3).join(" ");
192
- const target = parts.slice(3).join(" ");
193
- return `${prefix} ${withTrailingDot(target)}`;
194
- }
195
- }
196
- return withTrailingDot(trimmed);
197
- }
198
- if (type === "TXT") {
199
- if (trimmed.startsWith('"') && trimmed.endsWith('"') || trimmed.startsWith("'") && trimmed.endsWith("'")) {
200
- return trimmed;
201
- }
202
- return `"${trimmed}"`;
203
- }
204
- return trimmed;
205
- }
206
- function planRecordChange(params) {
207
- const { existing, newValue, mode = "replace" } = params;
208
- if (!existing) {
209
- return {
210
- action: "create",
211
- finalValues: [newValue],
212
- summary: "Adding a new record (nothing exists at this name + type)."
213
- };
214
- }
215
- if (existing.isAlias) {
216
- return {
217
- action: "overwrite",
218
- finalValues: [newValue],
219
- summary: "Overwriting an existing ALIAS record with a standard record set."
220
- };
221
- }
222
- const alreadyPresent = existing.values.some(
223
- (value) => value === newValue || value === `"${newValue}"`
224
- );
225
- if (alreadyPresent && mode !== "replace") {
226
- return {
227
- action: "noop",
228
- finalValues: existing.values,
229
- summary: "Record already has this value. Nothing to do."
230
- };
231
- }
232
- if (alreadyPresent && mode === "replace" && existing.values.length === 1 && existing.values[0] === newValue) {
233
- return {
234
- action: "noop",
235
- finalValues: existing.values,
236
- summary: "Record already has exactly this value. Nothing to do."
237
- };
238
- }
239
- if (mode === "append") {
240
- return {
241
- action: "append",
242
- finalValues: [...existing.values, newValue],
243
- summary: `Adding to the existing ${existing.type} record (${existing.values.length} value(s) \u2192 ${existing.values.length + 1}).`
244
- };
245
- }
246
- return {
247
- action: "overwrite",
248
- finalValues: [newValue],
249
- summary: existing.values.length === 1 ? `Overwriting existing value:
250
- ${existing.values[0]}
251
- \u2192 ${newValue}` : `Replacing ${existing.values.length} existing values with a single new value.`
252
- };
253
- }
254
- function upsertResourceRecordSet(params) {
255
- const { profile, hostedZoneId, name, type, ttl, values, verbose } = params;
256
- const changeBatch = {
257
- Comment: `mtn aws route53 add-record: ${type} ${name}`,
258
- Changes: [
259
- {
260
- Action: "UPSERT",
261
- ResourceRecordSet: {
262
- Name: withTrailingDot(name),
263
- Type: type,
264
- TTL: ttl ?? DEFAULT_TTL,
265
- ResourceRecords: values.map((value) => ({ Value: value }))
266
- }
267
- }
268
- ]
269
- };
270
- const data = runAws({
271
- profile,
272
- args: [
273
- "route53",
274
- "change-resource-record-sets",
275
- "--hosted-zone-id",
276
- hostedZoneId,
277
- "--change-batch",
278
- JSON.stringify(changeBatch)
279
- ],
280
- verbose
281
- });
282
- return data.ChangeInfo ?? data;
283
- }
284
- function deleteResourceRecordSet(params) {
285
- const { profile, hostedZoneId, record, verbose } = params;
286
- const resourceRecordSet = {
287
- Name: withTrailingDot(record.name),
288
- Type: record.type
289
- };
290
- if (record.isAlias && record.aliasTarget) {
291
- resourceRecordSet.AliasTarget = record.aliasTarget;
292
- } else {
293
- resourceRecordSet.TTL = record.ttl ?? DEFAULT_TTL;
294
- resourceRecordSet.ResourceRecords = record.values.map((value) => ({
295
- Value: value
296
- }));
297
- }
298
- const changeBatch = {
299
- Comment: `mtn aws route53 remove-record: ${record.type} ${record.name}`,
300
- Changes: [
301
- {
302
- Action: "DELETE",
303
- ResourceRecordSet: resourceRecordSet
304
- }
305
- ]
306
- };
307
- const data = runAws({
308
- profile,
309
- args: [
310
- "route53",
311
- "change-resource-record-sets",
312
- "--hosted-zone-id",
313
- hostedZoneId,
314
- "--change-batch",
315
- JSON.stringify(changeBatch)
316
- ],
317
- verbose
318
- });
319
- return data.ChangeInfo ?? data;
320
- }
321
-
322
- export {
323
- bareHostedZoneId,
324
- withTrailingDot,
325
- withoutTrailingDot,
326
- listHostedZones,
327
- findHostedZone,
328
- hostedZoneLabel,
329
- resolveRecordName,
330
- getRecordSetsAtName,
331
- getResourceRecordSet,
332
- findCnameConflicts,
333
- formatValues,
334
- normalizeRecordValue,
335
- planRecordChange,
336
- upsertResourceRecordSet,
337
- deleteResourceRecordSet
338
- };
@@ -1,25 +0,0 @@
1
- import {
2
- profileField,
3
- verboseField
4
- } from "./73BJG53F.js";
5
-
6
- // src/commands/aws/ses/send-email/schema.js
7
- import { z } from "zod";
8
- var sendEmailOptionsSchema = z.object({
9
- to: z.string({ required_error: "--to <address> is required" }).describe("Recipient email address"),
10
- from: z.string({ required_error: "--from <address> is required" }).describe("Verified SES sender email address"),
11
- subject: z.string().optional().default("MTN CLI test email").describe("Email subject line"),
12
- body: z.string().optional().describe("Email body (defaults to a timestamp and random token)"),
13
- transport: z.enum(["api", "smtp"]).optional().default("api").describe("Send via the SES API (default) or SES SMTP"),
14
- region: z.string().optional().default("us-east-1").describe("AWS region for the SES endpoint"),
15
- profile: profileField,
16
- accessKeyId: z.string().optional().describe(
17
- "IAM access key ID used as the SMTP username (smtp transport only)"
18
- ),
19
- dryRun: z.boolean().optional().default(false).describe("Print the email payload without sending"),
20
- verbose: verboseField
21
- });
22
-
23
- export {
24
- sendEmailOptionsSchema
25
- };
@@ -1,105 +0,0 @@
1
- import {
2
- isSystemDatabase,
3
- quoteIdent,
4
- quoteLiteral
5
- } from "./DLEJ25GZ.js";
6
-
7
- // src/commands/db/create-readonly-user/mysql.js
8
- import mysql from "mysql2/promise";
9
- async function createConnection(config) {
10
- return mysql.createConnection({
11
- host: config.host,
12
- port: config.port,
13
- user: config.user,
14
- password: config.password,
15
- database: config.database || void 0,
16
- ssl: config.ssl && typeof config.ssl === "object" ? config.ssl : void 0,
17
- multipleStatements: false
18
- });
19
- }
20
- async function listMysqlDatabases(config) {
21
- const connection = await createConnection(config);
22
- try {
23
- const [rows] = await connection.query("SHOW DATABASES");
24
- const names = (
25
- /** @type {Array<{ Database?: string }>} */
26
- rows.map(
27
- (row) => row.Database ?? ""
28
- )
29
- );
30
- return names.filter((name) => Boolean(name)).filter((name) => !isSystemDatabase({ engine: "mysql", name })).sort((a, b) => a.localeCompare(b));
31
- } finally {
32
- await connection.end();
33
- }
34
- }
35
- async function applyMysqlReadonly(params) {
36
- const {
37
- config,
38
- username,
39
- password,
40
- databases,
41
- hostPattern,
42
- dryRun = false,
43
- verbose = false
44
- } = params;
45
- const userLiteral = quoteLiteral(username);
46
- const hostLiteral = quoteLiteral(hostPattern);
47
- const passwordLiteral = quoteLiteral(password);
48
- const account = `${userLiteral}@${hostLiteral}`;
49
- const statements = [];
50
- const createSql = `CREATE USER IF NOT EXISTS ${account} IDENTIFIED BY ${passwordLiteral}`;
51
- const alterSql = `ALTER USER ${account} IDENTIFIED BY ${passwordLiteral}`;
52
- const grantSqls = [];
53
- if (databases === "all") {
54
- grantSqls.push(
55
- `GRANT SELECT, SHOW VIEW, SHOW DATABASES ON *.* TO ${account}`
56
- );
57
- } else {
58
- for (const database of databases) {
59
- const dbIdent = quoteIdent({ engine: "mysql", name: database });
60
- grantSqls.push(`GRANT SELECT, SHOW VIEW ON ${dbIdent}.* TO ${account}`);
61
- }
62
- }
63
- const flushSql = "FLUSH PRIVILEGES";
64
- statements.push(createSql, alterSql, ...grantSqls, flushSql);
65
- if (dryRun) {
66
- return {
67
- created: true,
68
- statements: statements.map(
69
- (sql) => sql.includes("IDENTIFIED BY") ? sql.replace(/IDENTIFIED BY '.*'/, "IDENTIFIED BY ***") : sql
70
- ),
71
- databases
72
- };
73
- }
74
- const connection = await createConnection(config);
75
- try {
76
- if (verbose) {
77
- console.log(` Connected to MySQL as ${config.user}@${config.host}`);
78
- }
79
- const [existingRows] = await connection.query(
80
- "SELECT 1 AS ok FROM mysql.user WHERE User = ? AND Host = ? LIMIT 1",
81
- [username, hostPattern]
82
- );
83
- const existed = Array.isArray(existingRows) && existingRows.length > 0;
84
- await connection.query(createSql);
85
- await connection.query(alterSql);
86
- for (const grantSql of grantSqls) {
87
- await connection.query(grantSql);
88
- }
89
- await connection.query(flushSql);
90
- return {
91
- created: !existed,
92
- statements: statements.map(
93
- (sql) => sql.includes("IDENTIFIED BY") ? sql.replace(/IDENTIFIED BY '.*'/, "IDENTIFIED BY ***") : sql
94
- ),
95
- databases
96
- };
97
- } finally {
98
- await connection.end();
99
- }
100
- }
101
-
102
- export {
103
- listMysqlDatabases,
104
- applyMysqlReadonly
105
- };