@mtndev/cli 1.1.0 → 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (260) hide show
  1. package/CHANGELOG.md +91 -0
  2. package/cjs/__chunks/VH7oDXx4.cjs +28 -0
  3. package/cjs/commands/aws/ec2/allow-ip/handler.cjs +261 -0
  4. package/cjs/commands/aws/ec2/allow-ip/handler.d.ts +6 -0
  5. package/cjs/commands/aws/ec2/allow-ip/index.cjs +25 -0
  6. package/cjs/commands/aws/ec2/allow-ip/index.d.ts +3 -0
  7. package/cjs/commands/aws/ec2/allow-ip/schema.cjs +33 -0
  8. package/cjs/commands/aws/ec2/allow-ip/schema.d.ts +33 -0
  9. package/cjs/commands/aws/ec2/allow-ip/utils.cjs +379 -0
  10. package/cjs/commands/aws/ec2/allow-ip/utils.d.ts +189 -0
  11. package/cjs/commands/aws/iam/admin-group.cjs +111 -0
  12. package/cjs/commands/aws/iam/admin-group.d.ts +55 -0
  13. package/cjs/commands/aws/iam/break-glass/handler.cjs +127 -0
  14. package/cjs/commands/aws/iam/break-glass/handler.d.ts +7 -0
  15. package/cjs/commands/aws/iam/break-glass/index.cjs +7 -0
  16. package/cjs/commands/aws/iam/break-glass/index.d.ts +2 -0
  17. package/cjs/commands/aws/iam/break-glass/schema.cjs +21 -0
  18. package/cjs/commands/aws/iam/break-glass/schema.d.ts +25 -0
  19. package/cjs/commands/aws/iam/check-admin/handler.cjs +89 -0
  20. package/cjs/commands/aws/iam/check-admin/handler.d.ts +5 -0
  21. package/cjs/commands/aws/iam/check-admin/index.cjs +7 -0
  22. package/cjs/commands/aws/iam/check-admin/index.d.ts +2 -0
  23. package/cjs/commands/aws/iam/check-admin/schema.cjs +19 -0
  24. package/cjs/commands/aws/iam/check-admin/schema.d.ts +19 -0
  25. package/cjs/commands/aws/iam/policies/s3-restrictions-deny-non-s3-services.json +20 -0
  26. package/cjs/commands/aws/iam/policies/sts-federation.json +11 -0
  27. package/cjs/commands/aws/iam/policies/user-admins-deny-list.json +175 -0
  28. package/cjs/commands/aws/iam/policies/user-admins-deny-regions-list.json +41 -0
  29. package/cjs/commands/aws/iam/policies/user-admins-self-service-iam.json +56 -0
  30. package/cjs/commands/aws/iam/policies/user-admins-write-list.json +117 -0
  31. package/cjs/commands/aws/iam/remove-admin/handler.cjs +120 -0
  32. package/cjs/commands/aws/iam/remove-admin/handler.d.ts +6 -0
  33. package/cjs/commands/aws/iam/remove-admin/index.cjs +7 -0
  34. package/cjs/commands/aws/iam/remove-admin/index.d.ts +2 -0
  35. package/cjs/commands/aws/iam/remove-admin/schema.cjs +22 -0
  36. package/cjs/commands/aws/iam/remove-admin/schema.d.ts +28 -0
  37. package/cjs/commands/aws/iam/setup-acl/handler.cjs +227 -0
  38. package/cjs/commands/aws/iam/setup-acl/handler.d.ts +6 -0
  39. package/cjs/commands/aws/iam/setup-acl/index.cjs +13 -0
  40. package/cjs/commands/aws/iam/setup-acl/index.d.ts +3 -0
  41. package/cjs/commands/aws/iam/setup-acl/schema.cjs +19 -0
  42. package/cjs/commands/aws/iam/setup-acl/schema.d.ts +24 -0
  43. package/cjs/commands/aws/iam/setup-acl/utils.cjs +305 -0
  44. package/cjs/commands/aws/iam/setup-acl/utils.d.ts +61 -0
  45. package/cjs/commands/aws/iam/users/handler.cjs +59 -0
  46. package/cjs/commands/aws/iam/users/handler.d.ts +5 -0
  47. package/cjs/commands/aws/iam/users/index.cjs +18 -0
  48. package/cjs/commands/aws/iam/users/index.d.ts +3 -0
  49. package/cjs/commands/aws/iam/users/schema.cjs +17 -0
  50. package/cjs/commands/aws/iam/users/schema.d.ts +18 -0
  51. package/cjs/commands/aws/iam/users/utils.cjs +454 -0
  52. package/cjs/commands/aws/iam/users/utils.d.ts +119 -0
  53. package/cjs/commands/aws/index.cjs +223 -0
  54. package/cjs/commands/aws/index.d.ts +14 -0
  55. package/cjs/commands/aws/route53/add-record/handler.cjs +264 -0
  56. package/cjs/commands/aws/route53/add-record/handler.d.ts +36 -0
  57. package/cjs/commands/aws/route53/add-record/index.cjs +26 -0
  58. package/cjs/commands/aws/route53/add-record/index.d.ts +3 -0
  59. package/cjs/commands/aws/route53/add-record/schema.cjs +43 -0
  60. package/cjs/commands/aws/route53/add-record/schema.d.ts +45 -0
  61. package/cjs/commands/aws/route53/add-record/utils.cjs +404 -0
  62. package/cjs/commands/aws/route53/add-record/utils.d.ts +216 -0
  63. package/cjs/commands/aws/route53/remove-record/handler.cjs +114 -0
  64. package/cjs/commands/aws/route53/remove-record/handler.d.ts +6 -0
  65. package/cjs/commands/aws/route53/remove-record/index.cjs +5 -0
  66. package/cjs/commands/aws/route53/remove-record/index.d.ts +2 -0
  67. package/cjs/commands/aws/route53/remove-record/schema.cjs +22 -0
  68. package/cjs/commands/aws/route53/remove-record/schema.d.ts +30 -0
  69. package/cjs/commands/aws/schema.cjs +19 -0
  70. package/cjs/commands/aws/schema.d.ts +13 -0
  71. package/cjs/commands/aws/ses/send-email/handler.cjs +73 -0
  72. package/cjs/commands/aws/ses/send-email/handler.d.ts +5 -0
  73. package/cjs/commands/aws/ses/send-email/index.cjs +9 -0
  74. package/cjs/commands/aws/ses/send-email/index.d.ts +3 -0
  75. package/cjs/commands/aws/ses/send-email/schema.cjs +24 -0
  76. package/cjs/commands/aws/ses/send-email/schema.d.ts +39 -0
  77. package/cjs/commands/aws/ses/send-email/utils.cjs +87 -0
  78. package/cjs/commands/aws/ses/send-email/utils.d.ts +47 -0
  79. package/cjs/commands/aws/ses/smtp-password.cjs +72 -0
  80. package/cjs/commands/aws/ses/smtp-password.d.ts +21 -0
  81. package/cjs/commands/aws/utils/exec-aws.cjs +145 -0
  82. package/cjs/commands/aws/utils/exec-aws.d.ts +79 -0
  83. package/cjs/commands/aws/utils/resolve-policy-path.cjs +15 -0
  84. package/cjs/commands/aws/utils/resolve-policy-path.d.ts +8 -0
  85. package/cjs/commands/aws/utils/resolve-profile.cjs +93 -0
  86. package/cjs/commands/aws/utils/resolve-profile.d.ts +28 -0
  87. package/cjs/commands/aws/utils/tty.cjs +54 -0
  88. package/cjs/commands/aws/utils/tty.d.ts +24 -0
  89. package/cjs/commands/db/create-readonly-user/handler.cjs +254 -0
  90. package/cjs/commands/db/create-readonly-user/handler.d.ts +5 -0
  91. package/cjs/commands/db/create-readonly-user/index.cjs +18 -0
  92. package/cjs/commands/db/create-readonly-user/index.d.ts +3 -0
  93. package/cjs/commands/db/create-readonly-user/mysql.cjs +102 -0
  94. package/cjs/commands/db/create-readonly-user/mysql.d.ts +33 -0
  95. package/cjs/commands/db/create-readonly-user/postgres.cjs +209 -0
  96. package/cjs/commands/db/create-readonly-user/postgres.d.ts +31 -0
  97. package/cjs/commands/db/create-readonly-user/schema.cjs +39 -0
  98. package/cjs/commands/db/create-readonly-user/schema.d.ts +55 -0
  99. package/cjs/commands/db/create-readonly-user/utils.cjs +160 -0
  100. package/cjs/commands/db/create-readonly-user/utils.d.ts +112 -0
  101. package/cjs/commands/db/index.cjs +46 -0
  102. package/cjs/commands/db/index.d.ts +6 -0
  103. package/cjs/commands/doppler/handler.cjs +95 -9
  104. package/cjs/commands/doppler/index.cjs +33 -41
  105. package/cjs/commands/doppler/index.d.ts +1 -0
  106. package/cjs/commands/doppler/schema.cjs +130 -6
  107. package/cjs/commands/doppler/schema.d.ts +233 -17
  108. package/cjs/commands/doppler/set-secret.cjs +378 -0
  109. package/cjs/commands/doppler/set-secret.d.ts +113 -0
  110. package/cjs/commands/doppler/utils/exec.cjs +106 -12
  111. package/cjs/commands/doppler/utils.cjs +412 -30
  112. package/cjs/commands/doppler/utils.d.ts +32 -8
  113. package/cjs/commands/icons/handler.cjs +82 -8
  114. package/cjs/commands/icons/index.cjs +15 -31
  115. package/cjs/commands/icons/schema.cjs +101 -13
  116. package/cjs/commands/icons/schema.d.ts +1 -1
  117. package/cjs/commands/icons/utils.cjs +131 -13
  118. package/cjs/commands/index.cjs +54 -82
  119. package/cjs/commands/schema.cjs +25 -8
  120. package/cjs/index.cjs +3 -4
  121. package/esm/commands/aws/ec2/allow-ip/handler.d.ts +6 -0
  122. package/esm/commands/aws/ec2/allow-ip/handler.js +258 -0
  123. package/esm/commands/aws/ec2/allow-ip/index.d.ts +3 -0
  124. package/esm/commands/aws/ec2/allow-ip/index.js +4 -0
  125. package/esm/commands/aws/ec2/allow-ip/schema.d.ts +33 -0
  126. package/esm/commands/aws/ec2/allow-ip/schema.js +29 -0
  127. package/esm/commands/aws/ec2/allow-ip/utils.d.ts +189 -0
  128. package/esm/commands/aws/ec2/allow-ip/utils.js +363 -0
  129. package/esm/commands/aws/iam/admin-group.d.ts +55 -0
  130. package/esm/commands/aws/iam/admin-group.js +104 -0
  131. package/esm/commands/aws/iam/break-glass/handler.d.ts +7 -0
  132. package/esm/commands/aws/iam/break-glass/handler.js +124 -0
  133. package/esm/commands/aws/iam/break-glass/index.d.ts +2 -0
  134. package/esm/commands/aws/iam/break-glass/index.js +4 -0
  135. package/esm/commands/aws/iam/break-glass/schema.d.ts +25 -0
  136. package/esm/commands/aws/iam/break-glass/schema.js +19 -0
  137. package/esm/commands/aws/iam/check-admin/handler.d.ts +5 -0
  138. package/esm/commands/aws/iam/check-admin/handler.js +86 -0
  139. package/esm/commands/aws/iam/check-admin/index.d.ts +2 -0
  140. package/esm/commands/aws/iam/check-admin/index.js +4 -0
  141. package/esm/commands/aws/iam/check-admin/schema.d.ts +19 -0
  142. package/esm/commands/aws/iam/check-admin/schema.js +17 -0
  143. package/esm/commands/aws/iam/policies/s3-restrictions-deny-non-s3-services.json +20 -0
  144. package/esm/commands/aws/iam/policies/sts-federation.json +11 -0
  145. package/esm/commands/aws/iam/policies/user-admins-deny-list.json +175 -0
  146. package/esm/commands/aws/iam/policies/user-admins-deny-regions-list.json +41 -0
  147. package/esm/commands/aws/iam/policies/user-admins-self-service-iam.json +56 -0
  148. package/esm/commands/aws/iam/policies/user-admins-write-list.json +117 -0
  149. package/esm/commands/aws/iam/remove-admin/handler.d.ts +6 -0
  150. package/esm/commands/aws/iam/remove-admin/handler.js +117 -0
  151. package/esm/commands/aws/iam/remove-admin/index.d.ts +2 -0
  152. package/esm/commands/aws/iam/remove-admin/index.js +4 -0
  153. package/esm/commands/aws/iam/remove-admin/schema.d.ts +28 -0
  154. package/esm/commands/aws/iam/remove-admin/schema.js +20 -0
  155. package/esm/commands/aws/iam/setup-acl/handler.d.ts +6 -0
  156. package/esm/commands/aws/iam/setup-acl/handler.js +224 -0
  157. package/esm/commands/aws/iam/setup-acl/index.d.ts +3 -0
  158. package/esm/commands/aws/iam/setup-acl/index.js +4 -0
  159. package/esm/commands/aws/iam/setup-acl/schema.d.ts +24 -0
  160. package/esm/commands/aws/iam/setup-acl/schema.js +18 -0
  161. package/esm/commands/aws/iam/setup-acl/utils.d.ts +61 -0
  162. package/esm/commands/aws/iam/setup-acl/utils.js +298 -0
  163. package/esm/commands/aws/iam/users/handler.d.ts +5 -0
  164. package/esm/commands/aws/iam/users/handler.js +56 -0
  165. package/esm/commands/aws/iam/users/index.d.ts +3 -0
  166. package/esm/commands/aws/iam/users/index.js +4 -0
  167. package/esm/commands/aws/iam/users/schema.d.ts +18 -0
  168. package/esm/commands/aws/iam/users/schema.js +16 -0
  169. package/esm/commands/aws/iam/users/utils.d.ts +119 -0
  170. package/esm/commands/aws/iam/users/utils.js +440 -0
  171. package/esm/commands/aws/index.d.ts +14 -0
  172. package/esm/commands/aws/index.js +142 -0
  173. package/esm/commands/aws/route53/add-record/handler.d.ts +36 -0
  174. package/esm/commands/aws/route53/add-record/handler.js +258 -0
  175. package/esm/commands/aws/route53/add-record/index.d.ts +3 -0
  176. package/esm/commands/aws/route53/add-record/index.js +4 -0
  177. package/esm/commands/aws/route53/add-record/schema.d.ts +45 -0
  178. package/esm/commands/aws/route53/add-record/schema.js +40 -0
  179. package/esm/commands/aws/route53/add-record/utils.d.ts +216 -0
  180. package/esm/commands/aws/route53/add-record/utils.js +389 -0
  181. package/esm/commands/aws/route53/remove-record/handler.d.ts +6 -0
  182. package/esm/commands/aws/route53/remove-record/handler.js +111 -0
  183. package/esm/commands/aws/route53/remove-record/index.d.ts +2 -0
  184. package/esm/commands/aws/route53/remove-record/index.js +3 -0
  185. package/esm/commands/aws/route53/remove-record/schema.d.ts +30 -0
  186. package/esm/commands/aws/route53/remove-record/schema.js +21 -0
  187. package/esm/commands/aws/schema.d.ts +13 -0
  188. package/esm/commands/aws/schema.js +16 -0
  189. package/esm/commands/aws/ses/send-email/handler.d.ts +5 -0
  190. package/esm/commands/aws/ses/send-email/handler.js +70 -0
  191. package/esm/commands/aws/ses/send-email/index.d.ts +3 -0
  192. package/esm/commands/aws/ses/send-email/index.js +4 -0
  193. package/esm/commands/aws/ses/send-email/schema.d.ts +39 -0
  194. package/esm/commands/aws/ses/send-email/schema.js +23 -0
  195. package/esm/commands/aws/ses/send-email/utils.d.ts +47 -0
  196. package/esm/commands/aws/ses/send-email/utils.js +84 -0
  197. package/esm/commands/aws/ses/smtp-password.d.ts +21 -0
  198. package/esm/commands/aws/ses/smtp-password.js +69 -0
  199. package/esm/commands/aws/utils/exec-aws.d.ts +79 -0
  200. package/esm/commands/aws/utils/exec-aws.js +137 -0
  201. package/esm/commands/aws/utils/resolve-policy-path.d.ts +8 -0
  202. package/esm/commands/aws/utils/resolve-policy-path.js +14 -0
  203. package/esm/commands/aws/utils/resolve-profile.d.ts +28 -0
  204. package/esm/commands/aws/utils/resolve-profile.js +88 -0
  205. package/esm/commands/aws/utils/tty.d.ts +24 -0
  206. package/esm/commands/aws/utils/tty.js +51 -0
  207. package/esm/commands/db/create-readonly-user/handler.d.ts +5 -0
  208. package/esm/commands/db/create-readonly-user/handler.js +251 -0
  209. package/esm/commands/db/create-readonly-user/index.d.ts +3 -0
  210. package/esm/commands/db/create-readonly-user/index.js +4 -0
  211. package/esm/commands/db/create-readonly-user/mysql.d.ts +33 -0
  212. package/esm/commands/db/create-readonly-user/mysql.js +98 -0
  213. package/esm/commands/db/create-readonly-user/postgres.d.ts +31 -0
  214. package/esm/commands/db/create-readonly-user/postgres.js +205 -0
  215. package/esm/commands/db/create-readonly-user/schema.d.ts +55 -0
  216. package/esm/commands/db/create-readonly-user/schema.js +35 -0
  217. package/esm/commands/db/create-readonly-user/utils.d.ts +112 -0
  218. package/esm/commands/db/create-readonly-user/utils.js +151 -0
  219. package/esm/commands/db/index.d.ts +6 -0
  220. package/esm/commands/db/index.js +31 -0
  221. package/esm/commands/doppler/handler.js +92 -9
  222. package/esm/commands/doppler/index.d.ts +1 -0
  223. package/esm/commands/doppler/index.js +6 -41
  224. package/esm/commands/doppler/schema.d.ts +233 -17
  225. package/esm/commands/doppler/schema.js +125 -7
  226. package/esm/commands/doppler/set-secret.d.ts +113 -0
  227. package/esm/commands/doppler/set-secret.js +370 -0
  228. package/esm/commands/doppler/utils/exec.js +100 -12
  229. package/esm/commands/doppler/utils.d.ts +32 -8
  230. package/esm/commands/doppler/utils.js +396 -30
  231. package/esm/commands/icons/handler.js +79 -8
  232. package/esm/commands/icons/index.js +4 -31
  233. package/esm/commands/icons/schema.d.ts +1 -1
  234. package/esm/commands/icons/schema.js +97 -15
  235. package/esm/commands/icons/utils.js +125 -13
  236. package/esm/commands/index.js +49 -78
  237. package/esm/commands/schema.js +22 -7
  238. package/esm/index.js +3 -4
  239. package/package.json +12 -2
  240. package/vitest.config.ts +11 -0
  241. package/cjs/__chunks/4GFJUCSP.cjs +0 -52
  242. package/cjs/__chunks/4SFWHCB3.cjs +0 -133
  243. package/cjs/__chunks/B2KFW7T7.cjs +0 -1
  244. package/cjs/__chunks/EMMC33QA.cjs +0 -401
  245. package/cjs/__chunks/INFOPAHN.cjs +0 -117
  246. package/cjs/__chunks/J36P6UNE.cjs +0 -75
  247. package/cjs/__chunks/NIMXXHJQ.cjs +0 -92
  248. package/cjs/__chunks/NSRFG4DF.cjs +0 -100
  249. package/cjs/__chunks/WNJ3ZYLI.cjs +0 -1
  250. package/cjs/__chunks/ZMDIOZPT.cjs +0 -22
  251. package/esm/__chunks/46HGXFME.js +0 -0
  252. package/esm/__chunks/6G4PXXKF.js +0 -75
  253. package/esm/__chunks/6L5RNR7G.js +0 -100
  254. package/esm/__chunks/FL7AILGH.js +0 -133
  255. package/esm/__chunks/HJSXC6HP.js +0 -117
  256. package/esm/__chunks/O262GK4B.js +0 -401
  257. package/esm/__chunks/O3CCA76Q.js +0 -22
  258. package/esm/__chunks/SJXQJ7RS.js +0 -92
  259. package/esm/__chunks/SNCKIAOR.js +0 -0
  260. package/esm/__chunks/X3R5PSWH.js +0 -52
@@ -0,0 +1,223 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ const require_commands_aws_ses_send_email_schema = require("./ses/send-email/schema.cjs");
3
+ const require_commands_aws_ses_send_email_utils = require("./ses/send-email/utils.cjs");
4
+ const require_commands_aws_ses_send_email_handler = require("./ses/send-email/handler.cjs");
5
+ require("./ses/send-email/index.cjs");
6
+ const require_commands_aws_route53_add_record_schema = require("./route53/add-record/schema.cjs");
7
+ const require_commands_aws_route53_add_record_utils = require("./route53/add-record/utils.cjs");
8
+ const require_commands_aws_route53_add_record_handler = require("./route53/add-record/handler.cjs");
9
+ const require_commands_aws_route53_remove_record_schema = require("./route53/remove-record/schema.cjs");
10
+ const require_commands_aws_route53_remove_record_handler = require("./route53/remove-record/handler.cjs");
11
+ require("./route53/remove-record/index.cjs");
12
+ require("./route53/add-record/index.cjs");
13
+ const require_commands_aws_iam_users_schema = require("./iam/users/schema.cjs");
14
+ const require_commands_aws_iam_users_utils = require("./iam/users/utils.cjs");
15
+ const require_commands_aws_iam_users_handler = require("./iam/users/handler.cjs");
16
+ require("./iam/users/index.cjs");
17
+ const require_commands_aws_iam_setup_acl_schema = require("./iam/setup-acl/schema.cjs");
18
+ const require_commands_aws_iam_setup_acl_utils = require("./iam/setup-acl/utils.cjs");
19
+ const require_commands_aws_iam_setup_acl_handler = require("./iam/setup-acl/handler.cjs");
20
+ require("./iam/setup-acl/index.cjs");
21
+ const require_commands_aws_iam_admin_group = require("./iam/admin-group.cjs");
22
+ const require_commands_aws_iam_remove_admin_schema = require("./iam/remove-admin/schema.cjs");
23
+ const require_commands_aws_iam_remove_admin_handler = require("./iam/remove-admin/handler.cjs");
24
+ require("./iam/remove-admin/index.cjs");
25
+ const require_commands_aws_iam_check_admin_schema = require("./iam/check-admin/schema.cjs");
26
+ const require_commands_aws_iam_check_admin_handler = require("./iam/check-admin/handler.cjs");
27
+ require("./iam/check-admin/index.cjs");
28
+ const require_commands_aws_iam_break_glass_schema = require("./iam/break-glass/schema.cjs");
29
+ const require_commands_aws_iam_break_glass_handler = require("./iam/break-glass/handler.cjs");
30
+ require("./iam/break-glass/index.cjs");
31
+ const require_commands_aws_ec2_allow_ip_schema = require("./ec2/allow-ip/schema.cjs");
32
+ const require_commands_aws_ec2_allow_ip_utils = require("./ec2/allow-ip/utils.cjs");
33
+ const require_commands_aws_ec2_allow_ip_handler = require("./ec2/allow-ip/handler.cjs");
34
+ require("./ec2/allow-ip/index.cjs");
35
+ //#region src/commands/aws/index.js
36
+ /**
37
+ * Commander collector for repeatable options.
38
+ * @param {string} value
39
+ * @param {string[]} previous
40
+ * @returns {string[]}
41
+ */
42
+ function collect(value, previous) {
43
+ return [...previous, value];
44
+ }
45
+ /**
46
+ * Register the `aws` command group and its subcommands on the root program.
47
+ * @param {import('commander').Command} program
48
+ */
49
+ function registerAwsCommands(program) {
50
+ const aws = program.command("aws").summary("AWS operational commands (IAM, EC2, SES, Route53)").description("AWS operational commands for IAM, EC2, SES, and Route53");
51
+ const iam = aws.command("iam").summary("IAM ACL group and user management").description("IAM ACL group and user management");
52
+ iam.command("setup-acl").summary("Create ACL groups, policies, and (optionally) users").description("Idempotently create the ACL groups and managed policies, attach them per group, and optionally create IAM users.").option("--restrict-regions <yes|no>", "Attach the region restriction to acl-power-users (skips the prompt)").option("--no-create-users", "Skip IAM user creation after configuring groups").option("-p, --profile <profile>", "AWS profile (defaults to AWS_PROFILE)").option("-r, --region <region>", "AWS region").option("-v, --verbose", "Enable verbose logging").action(async (options) => {
53
+ await require_commands_aws_iam_setup_acl_handler.setupAclCommand({
54
+ restrictRegions: options.restrictRegions,
55
+ createUsers: options.createUsers,
56
+ profile: options.profile,
57
+ region: options.region,
58
+ verbose: options.verbose ?? false
59
+ });
60
+ });
61
+ iam.command("users").summary("Interactively create IAM users and assign ACL groups").description("Interactively create md-{identifier}-{account}-{role} IAM users, assign ACL groups, and print CLI setup commands.").option("--account-name <slug>", "AWS account slug used in md-{identifier}-{account}-{role}").option("-p, --profile <profile>", "AWS profile (defaults to AWS_PROFILE)").option("-v, --verbose", "Enable verbose logging").action(async (options) => {
62
+ await require_commands_aws_iam_users_handler.usersCommand({
63
+ accountName: options.accountName,
64
+ profile: options.profile,
65
+ verbose: options.verbose ?? false
66
+ });
67
+ });
68
+ iam.command("check-admin").summary("Alert if anyone is in acl-admin-do-not-use").description("Scan one profile (--profile or AWS_PROFILE) or all aws-vault profiles (--all) for members of the break-glass acl-admin-do-not-use group.").option("-p, --profile <profile>", "Operate on this profile (defaults to AWS_PROFILE)").option("--all", "Scan every aws-vault profile (default when no profile is set)").option("-v, --verbose", "Show skipped profiles and detailed errors").action(async (options) => {
69
+ await require_commands_aws_iam_check_admin_handler.checkAdminCommand({
70
+ profile: options.profile,
71
+ all: options.all ?? false,
72
+ verbose: options.verbose ?? false
73
+ });
74
+ });
75
+ iam.command("remove-admin").summary("Remove users from the acl-admin-do-not-use group").description("Remove break-glass admin access by removing users from acl-admin-do-not-use, for one profile (--profile or AWS_PROFILE) or every aws-vault profile (--all).").option("-p, --profile <profile>", "Operate on this profile (defaults to AWS_PROFILE)").option("--all", "Scan every aws-vault profile (default when no profile is set)").option("--user <name>", "Only remove this user (repeatable); default removes all", collect, []).option("-y, --yes", "Skip the per-profile confirmation prompt").option("--dry-run", "Preview removals without changing anything").option("-v, --verbose", "Show skipped profiles and detailed errors").action(async (options) => {
76
+ await require_commands_aws_iam_remove_admin_handler.removeAdminCommand({
77
+ profile: options.profile,
78
+ all: options.all ?? false,
79
+ user: options.user ?? [],
80
+ yes: options.yes ?? false,
81
+ dryRun: options.dryRun ?? false,
82
+ verbose: options.verbose ?? false
83
+ });
84
+ });
85
+ iam.command("break-glass").summary("Grant break-glass admin access (acl-admin-do-not-use)").description("Grant break-glass AdministratorAccess by adding a user to acl-admin-do-not-use for one profile. Defaults to your own IAM user.").option("-p, --profile <profile>", "AWS profile (defaults to AWS_PROFILE)").option("--user <name>", "Grant to this user (repeatable); default is your own IAM user", collect, []).option("-y, --yes", "Skip the confirmation prompt").option("--dry-run", "Preview the grant without changing anything").option("-v, --verbose", "Show detailed errors").action(async (options) => {
86
+ await require_commands_aws_iam_break_glass_handler.breakGlassCommand({
87
+ profile: options.profile,
88
+ user: options.user ?? [],
89
+ yes: options.yes ?? false,
90
+ dryRun: options.dryRun ?? false,
91
+ verbose: options.verbose ?? false
92
+ });
93
+ });
94
+ aws.command("ec2").summary("EC2 operational commands").description("EC2 operational commands").command("allow-ip").summary("Allow your current public IP for SSH on an EC2 security group").description("Update or create a named roaming SSH rule (port 22) for your current public IP on a chosen EC2 instance security group.").option("-p, --profile <profile>", "AWS profile (defaults to AWS_PROFILE)").option("-r, --region <region>", "AWS region").option("--rule-name <name>", "SSH rule description (default: \"{FirstName} Roaming\")").option("-v, --verbose", "Enable verbose logging").action(async (options) => {
95
+ await require_commands_aws_ec2_allow_ip_handler.allowIpCommand({
96
+ profile: options.profile,
97
+ region: options.region,
98
+ ruleName: options.ruleName,
99
+ verbose: options.verbose ?? false
100
+ });
101
+ });
102
+ const route53 = aws.command("route53").summary("Route53 DNS commands").description("Route53 DNS commands");
103
+ route53.command("add-record").summary("Interactively add or update a DNS record").description("Add or update a Route53 resource record set. Prompts for hosted zone, type, name, and value when not passed as flags. Shows whether the change creates, overwrites, or appends to an existing record.").option("-p, --profile <profile>", "AWS profile (defaults to AWS_PROFILE)").option("-z, --zone <name-or-id>", "Hosted zone name or ID (e.g. mountaindev.com)").option("-t, --type <type>", "Record type (A, AAAA, CNAME, TXT, MX, NS, SRV, CAA)").option("-n, --name <name>", "Record name relative to the zone (e.g. \"redline\") or FQDN").option("--value <value>", "Record value (e.g. CNAME target)").option("--ttl <seconds>", "TTL in seconds (default: 300)", (value) => Number.parseInt(value, 10)).option("-y, --yes", "Skip the confirmation prompt").option("--dry-run", "Preview the change without calling Route53").option("-v, --verbose", "Enable verbose logging").action(async (options) => {
104
+ await require_commands_aws_route53_add_record_handler.addRecordCommand({
105
+ profile: options.profile,
106
+ zone: options.zone,
107
+ type: options.type,
108
+ name: options.name,
109
+ value: options.value,
110
+ ttl: options.ttl,
111
+ yes: options.yes ?? false,
112
+ dryRun: options.dryRun ?? false,
113
+ verbose: options.verbose ?? false
114
+ });
115
+ });
116
+ route53.command("remove-record").summary("Interactively delete a DNS record").description("Delete a Route53 resource record set. Prompts for hosted zone, type, and name when not passed as flags, shows the record it found, and confirms before deleting.").option("-p, --profile <profile>", "AWS profile (defaults to AWS_PROFILE)").option("-z, --zone <name-or-id>", "Hosted zone name or ID (e.g. mountaindev.com)").option("-t, --type <type>", "Record type (A, AAAA, CNAME, TXT, MX, NS, SRV, CAA)").option("-n, --name <name>", "Record name relative to the zone (e.g. \"redline\") or FQDN").option("-y, --yes", "Skip the confirmation prompt").option("--dry-run", "Preview the deletion without calling Route53").option("-v, --verbose", "Enable verbose logging").action(async (options) => {
117
+ await require_commands_aws_route53_remove_record_handler.removeRecordCommand({
118
+ profile: options.profile,
119
+ zone: options.zone,
120
+ type: options.type,
121
+ name: options.name,
122
+ yes: options.yes ?? false,
123
+ dryRun: options.dryRun ?? false,
124
+ verbose: options.verbose ?? false
125
+ });
126
+ });
127
+ aws.command("ses").summary("SES operational commands").description("SES operational commands").command("send-email").summary("Send a test email via SES (API or SMTP)").description("Send a single test email through the SES API (default) or the SES SMTP endpoint.").requiredOption("--to <address>", "Recipient email address").requiredOption("--from <address>", "Verified SES sender email address").option("--subject <subject>", "Email subject line").option("--body <body>", "Email body (defaults to a timestamp and token)").option("--transport <api|smtp>", "Send via SES API or SES SMTP", "api").option("-r, --region <region>", "AWS region for SES", "us-east-1").option("-p, --profile <profile>", "AWS profile for api transport").option("--access-key-id <id>", "IAM access key ID used as the SMTP username (smtp transport)").option("--dry-run", "Print the email payload without sending").option("-v, --verbose", "Enable verbose logging").action(async (options) => {
128
+ await require_commands_aws_ses_send_email_handler.sendEmailCommand({
129
+ to: options.to,
130
+ from: options.from,
131
+ subject: options.subject,
132
+ body: options.body,
133
+ transport: options.transport,
134
+ region: options.region,
135
+ profile: options.profile,
136
+ accessKeyId: options.accessKeyId,
137
+ dryRun: options.dryRun ?? false,
138
+ verbose: options.verbose ?? false
139
+ });
140
+ });
141
+ }
142
+ //#endregion
143
+ exports.ACL_GROUPS = require_commands_aws_iam_setup_acl_utils.ACL_GROUPS;
144
+ exports.ADMIN_GROUP_NAME = require_commands_aws_iam_admin_group.ADMIN_GROUP_NAME;
145
+ exports.CUSTOM_POLICIES = require_commands_aws_iam_setup_acl_utils.CUSTOM_POLICIES;
146
+ exports.DEFAULT_REGION = require_commands_aws_ec2_allow_ip_schema.DEFAULT_REGION;
147
+ exports.DEFAULT_ROAMING_NAME = require_commands_aws_ec2_allow_ip_schema.DEFAULT_ROAMING_NAME;
148
+ exports.DEFAULT_TTL = require_commands_aws_route53_add_record_schema.DEFAULT_TTL;
149
+ exports.RECORD_TYPES = require_commands_aws_route53_add_record_schema.RECORD_TYPES;
150
+ exports.SSH_PORT = require_commands_aws_ec2_allow_ip_schema.SSH_PORT;
151
+ exports.addRecordCommand = require_commands_aws_route53_add_record_handler.addRecordCommand;
152
+ exports.addRecordOptionsSchema = require_commands_aws_route53_add_record_schema.addRecordOptionsSchema;
153
+ exports.allowIpCommand = require_commands_aws_ec2_allow_ip_handler.allowIpCommand;
154
+ exports.allowIpOptionsSchema = require_commands_aws_ec2_allow_ip_schema.allowIpOptionsSchema;
155
+ exports.attach = require_commands_aws_iam_setup_acl_utils.attach;
156
+ exports.authorizeRule = require_commands_aws_ec2_allow_ip_utils.authorizeRule;
157
+ exports.bareHostedZoneId = require_commands_aws_route53_add_record_utils.bareHostedZoneId;
158
+ exports.breakGlassCommand = require_commands_aws_iam_break_glass_handler.breakGlassCommand;
159
+ exports.breakGlassOptionsSchema = require_commands_aws_iam_break_glass_schema.breakGlassOptionsSchema;
160
+ exports.buildUsername = require_commands_aws_iam_users_utils.buildUsername;
161
+ exports.checkAdminCommand = require_commands_aws_iam_check_admin_handler.checkAdminCommand;
162
+ exports.checkAdminOptionsSchema = require_commands_aws_iam_check_admin_schema.checkAdminOptionsSchema;
163
+ exports.createCliAccessKey = require_commands_aws_iam_users_utils.createCliAccessKey;
164
+ exports.createUsersInteractive = require_commands_aws_iam_users_utils.createUsersInteractive;
165
+ exports.defaultBody = require_commands_aws_ses_send_email_utils.defaultBody;
166
+ exports.deleteResourceRecordSet = require_commands_aws_route53_add_record_utils.deleteResourceRecordSet;
167
+ exports.describeSecurityGroups = require_commands_aws_ec2_allow_ip_utils.describeSecurityGroups;
168
+ exports.detach = require_commands_aws_iam_setup_acl_utils.detach;
169
+ exports.ensureAclGroupsExist = require_commands_aws_iam_users_utils.ensureAclGroupsExist;
170
+ exports.ensureGroup = require_commands_aws_iam_setup_acl_utils.ensureGroup;
171
+ exports.ensureUser = require_commands_aws_iam_users_utils.ensureUser;
172
+ exports.ensureUserInGroup = require_commands_aws_iam_users_utils.ensureUserInGroup;
173
+ exports.extractRoamingFirstName = require_commands_aws_ec2_allow_ip_utils.extractRoamingFirstName;
174
+ exports.findCnameConflicts = require_commands_aws_route53_add_record_utils.findCnameConflicts;
175
+ exports.findHostedZone = require_commands_aws_route53_add_record_utils.findHostedZone;
176
+ exports.formatValues = require_commands_aws_route53_add_record_utils.formatValues;
177
+ exports.getCurrentPublicIp = require_commands_aws_ec2_allow_ip_utils.getCurrentPublicIp;
178
+ exports.getRecordSetsAtName = require_commands_aws_route53_add_record_utils.getRecordSetsAtName;
179
+ exports.getResourceRecordSet = require_commands_aws_route53_add_record_utils.getResourceRecordSet;
180
+ exports.getSecurityGroupDetails = require_commands_aws_ec2_allow_ip_utils.getSecurityGroupDetails;
181
+ exports.hostedZoneLabel = require_commands_aws_route53_add_record_utils.hostedZoneLabel;
182
+ exports.inferAccountName = require_commands_aws_iam_users_utils.inferAccountName;
183
+ exports.instanceLabel = require_commands_aws_ec2_allow_ip_utils.instanceLabel;
184
+ exports.isValidSlug = require_commands_aws_iam_users_utils.isValidSlug;
185
+ exports.listEnabledRegions = require_commands_aws_ec2_allow_ip_utils.listEnabledRegions;
186
+ exports.listHostedZones = require_commands_aws_route53_add_record_utils.listHostedZones;
187
+ exports.listInstances = require_commands_aws_ec2_allow_ip_utils.listInstances;
188
+ exports.listSshIngressRules = require_commands_aws_ec2_allow_ip_utils.listSshIngressRules;
189
+ exports.normalizeIdentifier = require_commands_aws_iam_users_utils.normalizeIdentifier;
190
+ exports.normalizeRecordValue = require_commands_aws_route53_add_record_utils.normalizeRecordValue;
191
+ exports.normalizeSlug = require_commands_aws_iam_users_utils.normalizeSlug;
192
+ exports.parseMdUsername = require_commands_aws_iam_users_utils.parseMdUsername;
193
+ exports.planRecordChange = require_commands_aws_route53_add_record_utils.planRecordChange;
194
+ exports.printFinalState = require_commands_aws_iam_setup_acl_utils.printFinalState;
195
+ exports.printSshRules = require_commands_aws_ec2_allow_ip_utils.printSshRules;
196
+ exports.publishPolicy = require_commands_aws_iam_setup_acl_utils.publishPolicy;
197
+ exports.registerAwsCommands = registerAwsCommands;
198
+ exports.removeAdminCommand = require_commands_aws_iam_remove_admin_handler.removeAdminCommand;
199
+ exports.removeAdminOptionsSchema = require_commands_aws_iam_remove_admin_schema.removeAdminOptionsSchema;
200
+ exports.removeRecordCommand = require_commands_aws_route53_remove_record_handler.removeRecordCommand;
201
+ exports.removeRecordOptionsSchema = require_commands_aws_route53_remove_record_schema.removeRecordOptionsSchema;
202
+ exports.resolveHostedZone = require_commands_aws_route53_add_record_handler.resolveHostedZone;
203
+ exports.resolveName = require_commands_aws_route53_add_record_handler.resolveName;
204
+ exports.resolveRecordName = require_commands_aws_route53_add_record_utils.resolveRecordName;
205
+ exports.resolveRecordType = require_commands_aws_route53_add_record_handler.resolveRecordType;
206
+ exports.resolveRoamingRule = require_commands_aws_ec2_allow_ip_utils.resolveRoamingRule;
207
+ exports.revokeRule = require_commands_aws_ec2_allow_ip_utils.revokeRule;
208
+ exports.roamingRuleDescription = require_commands_aws_ec2_allow_ip_utils.roamingRuleDescription;
209
+ exports.roleToGroup = require_commands_aws_iam_users_utils.roleToGroup;
210
+ exports.ruleAlreadyAllowsIp = require_commands_aws_ec2_allow_ip_utils.ruleAlreadyAllowsIp;
211
+ exports.securityGroupLabel = require_commands_aws_ec2_allow_ip_utils.securityGroupLabel;
212
+ exports.sendEmailCommand = require_commands_aws_ses_send_email_handler.sendEmailCommand;
213
+ exports.sendEmailOptionsSchema = require_commands_aws_ses_send_email_schema.sendEmailOptionsSchema;
214
+ exports.sendViaApi = require_commands_aws_ses_send_email_utils.sendViaApi;
215
+ exports.sendViaSmtp = require_commands_aws_ses_send_email_utils.sendViaSmtp;
216
+ exports.setupAclCommand = require_commands_aws_iam_setup_acl_handler.setupAclCommand;
217
+ exports.setupAclOptionsSchema = require_commands_aws_iam_setup_acl_schema.setupAclOptionsSchema;
218
+ exports.sshRuleLabel = require_commands_aws_ec2_allow_ip_utils.sshRuleLabel;
219
+ exports.upsertResourceRecordSet = require_commands_aws_route53_add_record_utils.upsertResourceRecordSet;
220
+ exports.usersCommand = require_commands_aws_iam_users_handler.usersCommand;
221
+ exports.usersOptionsSchema = require_commands_aws_iam_users_schema.usersOptionsSchema;
222
+ exports.withTrailingDot = require_commands_aws_route53_add_record_utils.withTrailingDot;
223
+ exports.withoutTrailingDot = require_commands_aws_route53_add_record_utils.withoutTrailingDot;
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Register the `aws` command group and its subcommands on the root program.
3
+ * @param {import('commander').Command} program
4
+ */
5
+ export function registerAwsCommands(program: import("commander").Command): void;
6
+ export * from "./ec2/allow-ip/index.js";
7
+ export * from "./iam/break-glass/index.js";
8
+ export * from "./iam/check-admin/index.js";
9
+ export * from "./iam/remove-admin/index.js";
10
+ export * from "./iam/setup-acl/index.js";
11
+ export * from "./iam/users/index.js";
12
+ export * from "./route53/add-record/index.js";
13
+ export * from "./route53/remove-record/index.js";
14
+ export * from "./ses/send-email/index.js";
@@ -0,0 +1,264 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ const require_rolldown_runtime = require("../../../../__chunks/VH7oDXx4.cjs");
3
+ const require_commands_aws_utils_tty = require("../../utils/tty.cjs");
4
+ const require_commands_aws_utils_exec_aws = require("../../utils/exec-aws.cjs");
5
+ const require_commands_aws_utils_resolve_profile = require("../../utils/resolve-profile.cjs");
6
+ const require_commands_aws_route53_add_record_schema = require("./schema.cjs");
7
+ const require_commands_aws_route53_add_record_utils = require("./utils.cjs");
8
+ let chalk = require("chalk");
9
+ chalk = require_rolldown_runtime.__toESM(chalk, 1);
10
+ let zod = require("zod");
11
+ //#region src/commands/aws/route53/add-record/handler.js
12
+ /**
13
+ * Resolve the hosted zone: from --zone, or interactive picker.
14
+ * @param {{
15
+ * profile?: string;
16
+ * zoneOption?: string;
17
+ * verbose: boolean;
18
+ * }} params
19
+ * @returns {Promise<import("./utils.js").HostedZone>}
20
+ */
21
+ async function resolveHostedZone(params) {
22
+ const { profile, zoneOption, verbose } = params;
23
+ const zones = require_commands_aws_route53_add_record_utils.listHostedZones({
24
+ profile,
25
+ verbose
26
+ });
27
+ if (zones.length === 0) throw new Error("No Route53 hosted zones found for this profile.");
28
+ if (zoneOption) {
29
+ const match = require_commands_aws_route53_add_record_utils.findHostedZone({
30
+ zones,
31
+ zoneInput: zoneOption
32
+ });
33
+ if (!match) throw new Error(`No hosted zone matching "${zoneOption}". Available: ${zones.map((z) => require_commands_aws_route53_add_record_utils.withoutTrailingDot(z.name)).join(", ")}`);
34
+ return match;
35
+ }
36
+ const chosen = zones[await require_commands_aws_utils_tty.promptChoice({
37
+ message: "Choose a hosted zone:",
38
+ options: zones.map((zone) => require_commands_aws_route53_add_record_utils.hostedZoneLabel(zone))
39
+ })];
40
+ if (!chosen) throw new Error("No hosted zone selected");
41
+ return chosen;
42
+ }
43
+ /**
44
+ * Resolve record type from --type or interactive picker.
45
+ * @param {string | undefined} typeOption
46
+ * @returns {Promise<string>}
47
+ */
48
+ async function resolveRecordType(typeOption) {
49
+ if (typeOption) return typeOption.toUpperCase();
50
+ const index = await require_commands_aws_utils_tty.promptChoice({
51
+ message: "Choose a record type:",
52
+ options: require_commands_aws_route53_add_record_schema.RECORD_TYPES
53
+ });
54
+ const chosen = require_commands_aws_route53_add_record_schema.RECORD_TYPES[index];
55
+ if (!chosen) throw new Error("No record type selected");
56
+ return chosen;
57
+ }
58
+ /**
59
+ * Resolve record name from --name or prompt.
60
+ * @param {{ nameOption?: string; zoneName: string }} params
61
+ * @returns {Promise<string>} FQDN with trailing dot
62
+ */
63
+ async function resolveName(params) {
64
+ const { nameOption, zoneName } = params;
65
+ let input = nameOption;
66
+ if (!input) input = await require_commands_aws_utils_tty.prompt(`Record name (relative to ${require_commands_aws_route53_add_record_utils.withoutTrailingDot(zoneName)}, or FQDN; @ for apex): `);
67
+ if (!input) throw new Error("Record name is required");
68
+ return require_commands_aws_route53_add_record_utils.resolveRecordName({
69
+ nameInput: input,
70
+ zoneName
71
+ });
72
+ }
73
+ /**
74
+ * Resolve record value from --value or prompt.
75
+ * @param {{ valueOption?: string; type: string }} params
76
+ * @returns {Promise<string>}
77
+ */
78
+ async function resolveValue(params) {
79
+ const { valueOption, type } = params;
80
+ let input = valueOption;
81
+ if (!input) input = await require_commands_aws_utils_tty.prompt(`Record value${type === "CNAME" ? " (e.g. target.example.com.)" : type === "TXT" ? " (quotes added if omitted)" : ""}: `);
82
+ if (!input) throw new Error("Record value is required");
83
+ return require_commands_aws_route53_add_record_utils.normalizeRecordValue({
84
+ type,
85
+ value: input
86
+ });
87
+ }
88
+ /**
89
+ * When an existing multi-value set is present, ask replace vs append
90
+ * (single-value types default to replace).
91
+ * @param {{
92
+ * existing: import("./utils.js").ResourceRecordSet;
93
+ * type: string;
94
+ * }} params
95
+ * @returns {Promise<"replace" | "append">}
96
+ */
97
+ async function resolveChangeMode(params) {
98
+ const { existing, type } = params;
99
+ if (type === "CNAME" || existing.values.length <= 1) return "replace";
100
+ console.log("");
101
+ console.log(chalk.default.yellow(`Existing ${type} record has ${existing.values.length} values:${require_commands_aws_route53_add_record_utils.formatValues(existing.values)}`));
102
+ return await require_commands_aws_utils_tty.promptYesNo({
103
+ message: "Add to the existing values instead of replacing them?",
104
+ defaultYes: false
105
+ }) ? "append" : "replace";
106
+ }
107
+ /**
108
+ * `aws route53 add-record` handler: interactively (or via flags) create or
109
+ * update a Route53 resource record set, showing whether the change adds or
110
+ * overwrites.
111
+ * @param {unknown} options
112
+ */
113
+ async function addRecordCommand(options) {
114
+ try {
115
+ const { profile: profileOption, zone: zoneOption, type: typeOption, name: nameOption, value: valueOption, ttl: ttlOption, yes, dryRun, verbose } = require_commands_aws_route53_add_record_schema.addRecordOptionsSchema.parse(options);
116
+ const profile = await require_commands_aws_utils_resolve_profile.resolveProfile({ profile: profileOption });
117
+ if (!profile) {
118
+ console.error(chalk.default.red("Error: pass --profile or set AWS_PROFILE."));
119
+ process.exit(1);
120
+ }
121
+ require_commands_aws_utils_exec_aws.requireCommands(["aws"]);
122
+ const identity = require_commands_aws_utils_exec_aws.getCallerIdentity({
123
+ profile,
124
+ verbose
125
+ });
126
+ console.log("Caller:");
127
+ console.log(` Account: ${identity.Account}`);
128
+ console.log(` Arn: ${identity.Arn}`);
129
+ console.log("");
130
+ const zone = await resolveHostedZone({
131
+ profile,
132
+ zoneOption,
133
+ verbose
134
+ });
135
+ console.log(`Hosted zone: ${require_commands_aws_route53_add_record_utils.hostedZoneLabel(zone)}`);
136
+ console.log("");
137
+ const type = await resolveRecordType(typeOption);
138
+ const name = await resolveName({
139
+ nameOption,
140
+ zoneName: zone.name
141
+ });
142
+ const value = await resolveValue({
143
+ valueOption,
144
+ type
145
+ });
146
+ const ttl = ttlOption ?? 300;
147
+ console.log("");
148
+ console.log("Proposed record:");
149
+ console.log(` Name: ${require_commands_aws_route53_add_record_utils.withoutTrailingDot(name)}`);
150
+ console.log(` Type: ${type}`);
151
+ console.log(` TTL: ${ttl}`);
152
+ console.log(` Value: ${value}`);
153
+ console.log("");
154
+ const existingSets = require_commands_aws_route53_add_record_utils.getRecordSetsAtName({
155
+ profile,
156
+ hostedZoneId: zone.id,
157
+ name,
158
+ verbose
159
+ });
160
+ const existing = existingSets.find((set) => set.type === type) ?? null;
161
+ const conflicts = require_commands_aws_route53_add_record_utils.findCnameConflicts({
162
+ existingSets,
163
+ type
164
+ });
165
+ if (conflicts.length > 0) {
166
+ console.error(chalk.default.red(`❌ Conflict: cannot add a ${type} record at ${require_commands_aws_route53_add_record_utils.withoutTrailingDot(name)}.`));
167
+ console.error("");
168
+ console.error(chalk.default.yellow("Route53 does not allow a CNAME and any other record type to coexist at the same name. Conflicting record(s) already exist:"));
169
+ for (const conflict of conflicts) console.error(` ${conflict.type} ${require_commands_aws_route53_add_record_utils.withoutTrailingDot(conflict.name)}${require_commands_aws_route53_add_record_utils.formatValues(conflict.isAlias ? ["(alias)"] : conflict.values)}`);
170
+ console.error("");
171
+ console.error(chalk.default.yellow("Remove the conflicting record, then re-create the one you wanted:"));
172
+ const zoneName = require_commands_aws_route53_add_record_utils.withoutTrailingDot(zone.name);
173
+ const displayName = require_commands_aws_route53_add_record_utils.withoutTrailingDot(name);
174
+ const quotedValue = /^[A-Za-z0-9._:@/-]+$/.test(value) ? value : `"${value}"`;
175
+ const ttlFlag = ttl === 300 ? "" : ` --ttl ${ttl}`;
176
+ let step = 1;
177
+ for (const conflict of conflicts) console.error(chalk.default.cyan(` ${step++}. mtn aws route53 remove-record -z ${zoneName} -t ${conflict.type} -n ${displayName}`));
178
+ console.error(chalk.default.cyan(` ${step}. mtn aws route53 add-record -z ${zoneName} -t ${type} -n ${displayName} --value ${quotedValue}${ttlFlag}`));
179
+ process.exit(1);
180
+ }
181
+ if (existing?.isAlias) {
182
+ console.log(chalk.default.yellow("An ALIAS record already exists at this name + type. Continuing will replace it with a standard record set."));
183
+ console.log("");
184
+ } else if (existing) {
185
+ console.log(chalk.default.yellow(`Existing ${type} record at ${require_commands_aws_route53_add_record_utils.withoutTrailingDot(name)}:${require_commands_aws_route53_add_record_utils.formatValues(existing.values)}`));
186
+ if (existing.ttl !== void 0) console.log(` TTL: ${existing.ttl}`);
187
+ console.log("");
188
+ } else {
189
+ console.log(chalk.default.green(`No existing ${type} record at ${require_commands_aws_route53_add_record_utils.withoutTrailingDot(name)}.`));
190
+ console.log("");
191
+ }
192
+ /** @type {"replace" | "append"} */
193
+ let mode = "replace";
194
+ if (existing && !existing.isAlias && existing.values.length > 0) mode = await resolveChangeMode({
195
+ existing,
196
+ type
197
+ });
198
+ const plan = require_commands_aws_route53_add_record_utils.planRecordChange({
199
+ existing,
200
+ newValue: value,
201
+ mode
202
+ });
203
+ console.log(plan.summary);
204
+ console.log("");
205
+ if (plan.action === "noop") return;
206
+ if (plan.action === "overwrite" || plan.action === "append") {
207
+ console.log("Final values that will be written:");
208
+ for (const finalValue of plan.finalValues) console.log(` - ${finalValue}`);
209
+ console.log("");
210
+ }
211
+ if (dryRun) {
212
+ console.log(chalk.default.cyan("Dry run — no changes made."));
213
+ return;
214
+ }
215
+ if (!yes) {
216
+ if (!await require_commands_aws_utils_tty.promptYesNo({
217
+ message: plan.action === "create" ? "Create this record?" : plan.action === "append" ? "Add this value to the existing record?" : "Overwrite the existing record?",
218
+ defaultYes: false
219
+ })) {
220
+ console.log("Aborted.");
221
+ return;
222
+ }
223
+ }
224
+ const changeInfo = require_commands_aws_route53_add_record_utils.upsertResourceRecordSet({
225
+ profile,
226
+ hostedZoneId: zone.id,
227
+ name,
228
+ type,
229
+ ttl: existing?.ttl ?? ttl,
230
+ values: plan.finalValues,
231
+ verbose
232
+ });
233
+ console.log("");
234
+ console.log(chalk.default.green(`Done. ${plan.action === "create" ? "Created" : plan.action === "append" ? "Updated (appended)" : "Updated (overwrote)"} ${type} ${require_commands_aws_route53_add_record_utils.withoutTrailingDot(name)}.`));
235
+ if (changeInfo?.Id) {
236
+ console.log(` Change ID: ${changeInfo.Id}`);
237
+ console.log(` Status: ${changeInfo.Status ?? "PENDING"}`);
238
+ }
239
+ } catch (error) {
240
+ if (error instanceof zod.ZodError) {
241
+ console.error(chalk.default.red("\n❌ Invalid command options:"));
242
+ error.errors.forEach((err) => {
243
+ console.error(chalk.default.red(` ${err.path.join(".")}: ${err.message}`));
244
+ });
245
+ process.exit(1);
246
+ }
247
+ const verbose = options?.verbose || false;
248
+ console.error(chalk.default.red("\n❌ add-record failed:"));
249
+ if (error instanceof require_commands_aws_utils_exec_aws.AwsCliError || error instanceof Error) {
250
+ console.error(chalk.default.red(` ${error.message}`));
251
+ if (verbose && error.stack) {
252
+ console.error(chalk.default.gray("\nStack trace:"));
253
+ console.error(chalk.default.gray(error.stack));
254
+ }
255
+ } else console.error(chalk.default.red(` ${String(error)}`));
256
+ console.error(chalk.default.yellow("\n💡 Use --verbose for detailed error information\n"));
257
+ process.exit(1);
258
+ }
259
+ }
260
+ //#endregion
261
+ exports.addRecordCommand = addRecordCommand;
262
+ exports.resolveHostedZone = resolveHostedZone;
263
+ exports.resolveName = resolveName;
264
+ exports.resolveRecordType = resolveRecordType;
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Resolve the hosted zone: from --zone, or interactive picker.
3
+ * @param {{
4
+ * profile?: string;
5
+ * zoneOption?: string;
6
+ * verbose: boolean;
7
+ * }} params
8
+ * @returns {Promise<import("./utils.js").HostedZone>}
9
+ */
10
+ export function resolveHostedZone(params: {
11
+ profile?: string;
12
+ zoneOption?: string;
13
+ verbose: boolean;
14
+ }): Promise<import("./utils.js").HostedZone>;
15
+ /**
16
+ * Resolve record type from --type or interactive picker.
17
+ * @param {string | undefined} typeOption
18
+ * @returns {Promise<string>}
19
+ */
20
+ export function resolveRecordType(typeOption: string | undefined): Promise<string>;
21
+ /**
22
+ * Resolve record name from --name or prompt.
23
+ * @param {{ nameOption?: string; zoneName: string }} params
24
+ * @returns {Promise<string>} FQDN with trailing dot
25
+ */
26
+ export function resolveName(params: {
27
+ nameOption?: string;
28
+ zoneName: string;
29
+ }): Promise<string>;
30
+ /**
31
+ * `aws route53 add-record` handler: interactively (or via flags) create or
32
+ * update a Route53 resource record set, showing whether the change adds or
33
+ * overwrites.
34
+ * @param {unknown} options
35
+ */
36
+ export function addRecordCommand(options: unknown): Promise<void>;
@@ -0,0 +1,26 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ const require_commands_aws_route53_add_record_schema = require("./schema.cjs");
3
+ const require_commands_aws_route53_add_record_utils = require("./utils.cjs");
4
+ const require_commands_aws_route53_add_record_handler = require("./handler.cjs");
5
+ exports.DEFAULT_TTL = require_commands_aws_route53_add_record_schema.DEFAULT_TTL;
6
+ exports.RECORD_TYPES = require_commands_aws_route53_add_record_schema.RECORD_TYPES;
7
+ exports.addRecordCommand = require_commands_aws_route53_add_record_handler.addRecordCommand;
8
+ exports.addRecordOptionsSchema = require_commands_aws_route53_add_record_schema.addRecordOptionsSchema;
9
+ exports.bareHostedZoneId = require_commands_aws_route53_add_record_utils.bareHostedZoneId;
10
+ exports.deleteResourceRecordSet = require_commands_aws_route53_add_record_utils.deleteResourceRecordSet;
11
+ exports.findCnameConflicts = require_commands_aws_route53_add_record_utils.findCnameConflicts;
12
+ exports.findHostedZone = require_commands_aws_route53_add_record_utils.findHostedZone;
13
+ exports.formatValues = require_commands_aws_route53_add_record_utils.formatValues;
14
+ exports.getRecordSetsAtName = require_commands_aws_route53_add_record_utils.getRecordSetsAtName;
15
+ exports.getResourceRecordSet = require_commands_aws_route53_add_record_utils.getResourceRecordSet;
16
+ exports.hostedZoneLabel = require_commands_aws_route53_add_record_utils.hostedZoneLabel;
17
+ exports.listHostedZones = require_commands_aws_route53_add_record_utils.listHostedZones;
18
+ exports.normalizeRecordValue = require_commands_aws_route53_add_record_utils.normalizeRecordValue;
19
+ exports.planRecordChange = require_commands_aws_route53_add_record_utils.planRecordChange;
20
+ exports.resolveHostedZone = require_commands_aws_route53_add_record_handler.resolveHostedZone;
21
+ exports.resolveName = require_commands_aws_route53_add_record_handler.resolveName;
22
+ exports.resolveRecordName = require_commands_aws_route53_add_record_utils.resolveRecordName;
23
+ exports.resolveRecordType = require_commands_aws_route53_add_record_handler.resolveRecordType;
24
+ exports.upsertResourceRecordSet = require_commands_aws_route53_add_record_utils.upsertResourceRecordSet;
25
+ exports.withTrailingDot = require_commands_aws_route53_add_record_utils.withTrailingDot;
26
+ exports.withoutTrailingDot = require_commands_aws_route53_add_record_utils.withoutTrailingDot;
@@ -0,0 +1,3 @@
1
+ export * from "./handler.js";
2
+ export * from "./schema.js";
3
+ export * from "./utils.js";
@@ -0,0 +1,43 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ const require_commands_aws_schema = require("../../schema.cjs");
3
+ let zod = require("zod");
4
+ //#region src/commands/aws/route53/add-record/schema.js
5
+ /**
6
+ * Common Route53 record types offered in the interactive picker.
7
+ * Alias records are not supported by this command.
8
+ */
9
+ const RECORD_TYPES = [
10
+ "A",
11
+ "AAAA",
12
+ "CNAME",
13
+ "TXT",
14
+ "MX",
15
+ "NS",
16
+ "SRV",
17
+ "CAA"
18
+ ];
19
+ /**
20
+ * Default TTL (seconds) when creating or replacing a record set.
21
+ */
22
+ const DEFAULT_TTL = 300;
23
+ /**
24
+ * Zod schema for `aws route53 add-record` options.
25
+ */
26
+ const addRecordOptionsSchema = zod.z.object({
27
+ profile: require_commands_aws_schema.profileField,
28
+ zone: zod.z.string().optional().describe("Hosted zone name or ID (e.g. mountaindev.com or Z123…). Skips the zone picker when set."),
29
+ type: zod.z.string().optional().transform((value) => value === void 0 ? void 0 : value.toUpperCase()).refine((value) => value === void 0 || typeof value === "string" && RECORD_TYPES.includes(value), { message: `Record type must be one of: ${RECORD_TYPES.join(", ")}` }).describe(`DNS record type (${RECORD_TYPES.join(", ")})`),
30
+ name: zod.z.string().optional().describe("Record name relative to the zone (e.g. \"redline\") or a fully-qualified name"),
31
+ value: zod.z.string().optional().describe("Record value (e.g. a CNAME target or A address)"),
32
+ ttl: zod.z.number().int().positive().optional().describe(`TTL in seconds (default: 300)`),
33
+ yes: zod.z.boolean().optional().default(false).describe("Skip the confirmation prompt"),
34
+ dryRun: zod.z.boolean().optional().default(false).describe("Preview the change without calling Route53"),
35
+ verbose: require_commands_aws_schema.verboseField
36
+ });
37
+ /**
38
+ * @typedef {z.infer<typeof addRecordOptionsSchema>} AddRecordOptions
39
+ */
40
+ //#endregion
41
+ exports.DEFAULT_TTL = DEFAULT_TTL;
42
+ exports.RECORD_TYPES = RECORD_TYPES;
43
+ exports.addRecordOptionsSchema = addRecordOptionsSchema;