@aws-cdk/toolkit-lib 0.3.2 → 0.3.3

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 (361) hide show
  1. package/build-info.json +2 -2
  2. package/lib/actions/bootstrap/index.d.ts +1 -1
  3. package/lib/actions/bootstrap/index.js +5 -5
  4. package/lib/actions/deploy/index.d.ts +1 -1
  5. package/lib/actions/deploy/index.js +1 -1
  6. package/lib/actions/deploy/private/deploy-options.d.ts +1 -1
  7. package/lib/actions/deploy/private/deploy-options.js +1 -1
  8. package/lib/actions/deploy/private/helpers.d.ts +3 -2
  9. package/lib/actions/deploy/private/helpers.js +3 -3
  10. package/lib/actions/diff/private/helpers.d.ts +5 -9
  11. package/lib/actions/diff/private/helpers.js +6 -23
  12. package/lib/api/aws-auth/account-cache.d.ts +41 -0
  13. package/lib/api/aws-auth/account-cache.js +108 -0
  14. package/lib/api/aws-auth/awscli-compatible.d.ts +70 -0
  15. package/lib/api/aws-auth/awscli-compatible.js +250 -0
  16. package/lib/api/aws-auth/cached.d.ts +11 -0
  17. package/lib/api/aws-auth/cached.js +26 -0
  18. package/lib/api/aws-auth/credential-plugins.d.ts +38 -0
  19. package/lib/api/aws-auth/credential-plugins.js +154 -0
  20. package/lib/api/aws-auth/private/index.d.ts +11 -0
  21. package/lib/api/aws-auth/private/index.js +37 -0
  22. package/lib/api/aws-auth/provider-caching.d.ts +13 -0
  23. package/lib/api/aws-auth/provider-caching.js +24 -0
  24. package/lib/api/aws-auth/proxy-agent.d.ts +13 -0
  25. package/lib/api/aws-auth/proxy-agent.js +54 -0
  26. package/lib/api/aws-auth/sdk-logger.d.ts +69 -0
  27. package/lib/api/aws-auth/sdk-logger.js +128 -0
  28. package/lib/api/aws-auth/sdk-provider.d.ts +195 -0
  29. package/lib/api/aws-auth/sdk-provider.js +373 -0
  30. package/lib/api/aws-auth/sdk.d.ts +235 -0
  31. package/lib/api/aws-auth/sdk.js +391 -0
  32. package/lib/api/aws-auth/tracing.d.ts +11 -0
  33. package/lib/api/aws-auth/tracing.js +60 -0
  34. package/lib/api/aws-auth/user-agent.d.ts +7 -0
  35. package/lib/api/aws-auth/user-agent.js +20 -0
  36. package/lib/api/aws-auth/util.d.ts +6 -0
  37. package/lib/api/aws-auth/util.js +21 -0
  38. package/lib/api/bootstrap/bootstrap-environment.d.ts +35 -0
  39. package/lib/api/bootstrap/bootstrap-environment.js +323 -0
  40. package/lib/api/bootstrap/bootstrap-props.d.ts +130 -0
  41. package/lib/api/bootstrap/bootstrap-props.js +14 -0
  42. package/lib/api/bootstrap/deploy-bootstrap.d.ts +39 -0
  43. package/lib/api/bootstrap/deploy-bootstrap.js +147 -0
  44. package/lib/api/bootstrap/index.d.ts +3 -0
  45. package/lib/api/bootstrap/index.js +23 -0
  46. package/lib/api/bootstrap/legacy-template.d.ts +2 -0
  47. package/lib/api/bootstrap/legacy-template.js +82 -0
  48. package/lib/api/cloud-assembly/environment.d.ts +43 -0
  49. package/lib/api/cloud-assembly/environment.js +127 -0
  50. package/lib/api/cloud-assembly/index.d.ts +1 -1
  51. package/lib/api/cloud-assembly/index.js +3 -3
  52. package/lib/api/cloud-assembly/private/context-aware-source.d.ts +1 -1
  53. package/lib/api/cloud-assembly/private/context-aware-source.js +5 -5
  54. package/lib/api/cloud-assembly/private/prepare-source.d.ts +2 -1
  55. package/lib/api/cloud-assembly/private/prepare-source.js +14 -12
  56. package/lib/api/cloud-assembly/private/readable-assembly.d.ts +1 -1
  57. package/lib/api/cloud-assembly/private/readable-assembly.js +1 -1
  58. package/lib/api/cloud-assembly/private/source-builder.js +8 -6
  59. package/lib/api/cloud-assembly/private/stack-assembly.d.ts +2 -1
  60. package/lib/api/cloud-assembly/private/stack-assembly.js +10 -9
  61. package/lib/api/cloud-assembly/stack-assembly.d.ts +55 -0
  62. package/lib/api/cloud-assembly/stack-assembly.js +139 -0
  63. package/lib/api/cloud-assembly/stack-collection.d.ts +27 -0
  64. package/lib/api/cloud-assembly/stack-collection.js +112 -0
  65. package/lib/api/cloud-assembly/stack-selector.d.ts +81 -2
  66. package/lib/api/cloud-assembly/stack-selector.js +62 -5
  67. package/lib/api/cloudformation/evaluate-cloudformation-template.d.ts +85 -0
  68. package/lib/api/cloudformation/evaluate-cloudformation-template.js +456 -0
  69. package/lib/api/cloudformation/index.d.ts +4 -0
  70. package/lib/api/cloudformation/index.js +21 -0
  71. package/lib/api/cloudformation/nested-stack-helpers.d.ts +25 -0
  72. package/lib/api/cloudformation/nested-stack-helpers.js +86 -0
  73. package/lib/api/cloudformation/stack-helpers.d.ts +96 -0
  74. package/lib/api/cloudformation/stack-helpers.js +163 -0
  75. package/lib/api/cloudformation/template-body-parameter.d.ts +22 -0
  76. package/lib/api/cloudformation/template-body-parameter.js +104 -0
  77. package/lib/api/context.d.ts +40 -0
  78. package/lib/api/context.js +84 -0
  79. package/lib/api/deployments/asset-manifest-builder.d.ts +8 -0
  80. package/lib/api/deployments/asset-manifest-builder.js +33 -0
  81. package/lib/api/deployments/asset-publishing.d.ts +60 -0
  82. package/lib/api/deployments/asset-publishing.js +144 -0
  83. package/lib/api/deployments/assets.d.ts +11 -0
  84. package/lib/api/deployments/assets.js +109 -0
  85. package/lib/api/deployments/cfn-api.d.ts +145 -0
  86. package/lib/api/deployments/cfn-api.js +444 -0
  87. package/lib/api/deployments/checks.d.ts +9 -0
  88. package/lib/api/deployments/checks.js +72 -0
  89. package/lib/api/deployments/deploy-stack.d.ts +164 -0
  90. package/lib/api/deployments/deploy-stack.js +490 -0
  91. package/lib/api/deployments/deployment-method.d.ts +24 -0
  92. package/lib/api/deployments/deployment-method.js +3 -0
  93. package/lib/api/deployments/deployment-result.d.ts +21 -0
  94. package/lib/api/deployments/deployment-result.js +10 -0
  95. package/lib/api/deployments/deployments.d.ts +289 -0
  96. package/lib/api/deployments/deployments.js +355 -0
  97. package/lib/api/deployments/index.d.ts +6 -0
  98. package/lib/api/deployments/index.js +27 -0
  99. package/lib/api/diff/diff-formatter.d.ts +147 -0
  100. package/lib/api/diff/diff-formatter.js +225 -0
  101. package/lib/api/diff/index.d.ts +1 -0
  102. package/lib/api/diff/index.js +18 -0
  103. package/lib/api/environment/environment-access.d.ts +139 -0
  104. package/lib/api/environment/environment-access.js +205 -0
  105. package/lib/api/environment/environment-resources.d.ts +75 -0
  106. package/lib/api/environment/environment-resources.js +213 -0
  107. package/lib/api/environment/index.d.ts +3 -0
  108. package/lib/api/environment/index.js +20 -0
  109. package/lib/api/environment/placeholders.d.ts +10 -0
  110. package/lib/api/environment/placeholders.js +23 -0
  111. package/lib/api/garbage-collection/garbage-collector.d.ts +158 -0
  112. package/lib/api/garbage-collection/garbage-collector.js +614 -0
  113. package/lib/api/garbage-collection/index.d.ts +3 -0
  114. package/lib/api/garbage-collection/index.js +21 -0
  115. package/lib/api/garbage-collection/progress-printer.d.ts +23 -0
  116. package/lib/api/garbage-collection/progress-printer.js +80 -0
  117. package/lib/api/garbage-collection/stack-refresh.d.ts +49 -0
  118. package/lib/api/garbage-collection/stack-refresh.js +152 -0
  119. package/lib/api/hotswap/appsync-mapping-templates.d.ts +4 -0
  120. package/lib/api/hotswap/appsync-mapping-templates.js +162 -0
  121. package/lib/api/hotswap/code-build-projects.d.ts +4 -0
  122. package/lib/api/hotswap/code-build-projects.js +62 -0
  123. package/lib/api/hotswap/common.d.ts +89 -0
  124. package/lib/api/hotswap/common.js +137 -0
  125. package/lib/api/hotswap/ecs-services.d.ts +4 -0
  126. package/lib/api/hotswap/ecs-services.js +159 -0
  127. package/lib/api/hotswap/hotswap-deployments.d.ts +17 -0
  128. package/lib/api/hotswap/hotswap-deployments.js +441 -0
  129. package/lib/api/hotswap/index.d.ts +2 -0
  130. package/lib/api/hotswap/index.js +19 -0
  131. package/lib/api/hotswap/lambda-functions.d.ts +4 -0
  132. package/lib/api/hotswap/lambda-functions.js +297 -0
  133. package/lib/api/hotswap/s3-bucket-deployments.d.ts +5 -0
  134. package/lib/api/hotswap/s3-bucket-deployments.js +117 -0
  135. package/lib/api/hotswap/stepfunctions-state-machines.d.ts +4 -0
  136. package/lib/api/hotswap/stepfunctions-state-machines.js +48 -0
  137. package/lib/api/index.d.ts +25 -0
  138. package/lib/api/index.js +42 -0
  139. package/lib/api/io/index.d.ts +3 -1
  140. package/lib/api/io/index.js +18 -1
  141. package/lib/api/io/io-host.d.ts +15 -0
  142. package/lib/api/io/io-host.js +3 -0
  143. package/lib/api/io/io-message.d.ts +76 -0
  144. package/lib/api/io/io-message.js +3 -0
  145. package/lib/api/io/private/index.d.ts +7 -1
  146. package/lib/api/io/private/index.js +8 -5
  147. package/lib/api/io/private/io-default-messages.d.ts +21 -0
  148. package/lib/api/io/private/io-default-messages.js +59 -0
  149. package/lib/api/io/private/io-helper.d.ts +32 -0
  150. package/lib/api/io/private/io-helper.js +51 -0
  151. package/lib/api/io/private/level-priority.d.ts +11 -0
  152. package/lib/api/io/private/level-priority.js +33 -0
  153. package/lib/api/io/private/message-maker.d.ts +89 -0
  154. package/lib/api/io/private/message-maker.js +60 -0
  155. package/lib/api/io/private/messages.d.ts +178 -0
  156. package/lib/api/io/private/messages.js +534 -0
  157. package/lib/api/io/private/span.d.ts +93 -0
  158. package/lib/api/io/private/span.js +87 -0
  159. package/lib/api/io/private/testing/fake-io-host.d.ts +28 -0
  160. package/lib/api/io/private/testing/fake-io-host.js +41 -0
  161. package/lib/api/io/private/testing/index.d.ts +2 -0
  162. package/lib/api/io/private/testing/index.js +19 -0
  163. package/lib/api/io/private/testing/test-io-host.d.ts +27 -0
  164. package/lib/api/io/private/testing/test-io-host.js +61 -0
  165. package/lib/api/io/private/types.d.ts +4 -0
  166. package/lib/api/io/private/types.js +3 -0
  167. package/lib/api/io/toolkit-action.d.ts +4 -0
  168. package/lib/api/io/toolkit-action.js +3 -0
  169. package/lib/api/logs-monitor/find-cloudwatch-logs.d.ts +25 -0
  170. package/lib/api/logs-monitor/find-cloudwatch-logs.js +95 -0
  171. package/lib/api/logs-monitor/index.d.ts +2 -0
  172. package/lib/api/logs-monitor/index.js +19 -0
  173. package/lib/api/logs-monitor/logs-monitor.d.ts +76 -0
  174. package/lib/api/logs-monitor/logs-monitor.js +194 -0
  175. package/lib/api/notices.d.ts +210 -0
  176. package/lib/api/notices.js +430 -0
  177. package/lib/api/plugin/context-provider-plugin.d.ts +6 -0
  178. package/lib/api/plugin/context-provider-plugin.js +7 -0
  179. package/lib/api/plugin/index.d.ts +3 -0
  180. package/lib/api/plugin/index.js +20 -0
  181. package/lib/api/plugin/mode.d.ts +4 -0
  182. package/lib/api/plugin/mode.js +9 -0
  183. package/lib/api/plugin/plugin.d.ts +72 -0
  184. package/lib/api/plugin/plugin.js +132 -0
  185. package/lib/api/private.d.ts +1 -0
  186. package/lib/api/private.js +18 -0
  187. package/lib/api/refactoring/cloudformation.d.ts +15 -0
  188. package/lib/api/refactoring/cloudformation.js +3 -0
  189. package/lib/api/refactoring/digest.d.ts +26 -0
  190. package/lib/api/refactoring/digest.js +175 -0
  191. package/lib/api/refactoring/index.d.ts +51 -0
  192. package/lib/api/refactoring/index.js +223 -0
  193. package/lib/api/require-approval.d.ts +17 -0
  194. package/lib/api/require-approval.js +22 -0
  195. package/lib/api/resource-import/importer.d.ts +216 -0
  196. package/lib/api/resource-import/importer.js +331 -0
  197. package/lib/api/resource-import/index.d.ts +2 -0
  198. package/lib/api/resource-import/index.js +19 -0
  199. package/lib/api/resource-import/migrator.d.ts +26 -0
  200. package/lib/api/resource-import/migrator.js +73 -0
  201. package/lib/api/resource-metadata/index.d.ts +1 -0
  202. package/lib/api/resource-metadata/index.js +18 -0
  203. package/lib/api/resource-metadata/resource-metadata.d.ts +24 -0
  204. package/lib/api/resource-metadata/resource-metadata.js +42 -0
  205. package/lib/api/rwlock.d.ts +60 -0
  206. package/lib/api/rwlock.js +204 -0
  207. package/lib/api/settings.d.ts +26 -0
  208. package/lib/api/settings.js +107 -0
  209. package/lib/api/shared-private.d.ts +8 -6
  210. package/lib/api/shared-private.js +2838 -9213
  211. package/lib/api/shared-private.js.map +4 -4
  212. package/lib/api/shared-public.d.ts +18 -38
  213. package/lib/api/shared-public.js +2187 -25
  214. package/lib/api/shared-public.js.map +4 -4
  215. package/lib/api/stack-events/index.d.ts +4 -0
  216. package/lib/api/stack-events/index.js +23 -0
  217. package/lib/api/stack-events/stack-activity-monitor.d.ts +100 -0
  218. package/lib/api/stack-events/stack-activity-monitor.js +164 -0
  219. package/lib/api/stack-events/stack-event-poller.d.ts +69 -0
  220. package/lib/api/stack-events/stack-event-poller.js +130 -0
  221. package/lib/api/stack-events/stack-progress-monitor.d.ts +48 -0
  222. package/lib/api/stack-events/stack-progress-monitor.js +98 -0
  223. package/lib/api/stack-events/stack-status.d.ts +42 -0
  224. package/lib/api/stack-events/stack-status.js +90 -0
  225. package/lib/api/streams.d.ts +7 -0
  226. package/lib/api/streams.js +24 -0
  227. package/lib/api/tags.d.ts +9 -0
  228. package/lib/api/tags.js +10 -0
  229. package/lib/api/toolkit-error.d.ts +86 -0
  230. package/lib/api/toolkit-error.js +132 -0
  231. package/lib/api/toolkit-info.d.ts +52 -0
  232. package/lib/api/toolkit-info.js +157 -0
  233. package/lib/api/tree.d.ts +31 -0
  234. package/lib/api/tree.js +37 -0
  235. package/lib/api/work-graph/index.d.ts +3 -0
  236. package/lib/api/work-graph/index.js +20 -0
  237. package/lib/api/work-graph/work-graph-builder.d.ts +34 -0
  238. package/lib/api/work-graph/work-graph-builder.js +172 -0
  239. package/lib/api/work-graph/work-graph-types.d.ts +50 -0
  240. package/lib/api/work-graph/work-graph-types.js +13 -0
  241. package/lib/api/work-graph/work-graph.d.ts +72 -0
  242. package/lib/api/work-graph/work-graph.js +349 -0
  243. package/lib/context-providers/ami.d.ts +13 -0
  244. package/lib/context-providers/ami.js +52 -0
  245. package/lib/context-providers/availability-zones.d.ts +13 -0
  246. package/lib/context-providers/availability-zones.js +29 -0
  247. package/lib/context-providers/cc-api-provider.d.ts +30 -0
  248. package/lib/context-providers/cc-api-provider.js +145 -0
  249. package/lib/context-providers/endpoint-service-availability-zones.d.ts +13 -0
  250. package/lib/context-providers/endpoint-service-availability-zones.js +35 -0
  251. package/lib/context-providers/hosted-zones.d.ts +12 -0
  252. package/lib/context-providers/hosted-zones.js +69 -0
  253. package/lib/context-providers/index.d.ts +44 -0
  254. package/lib/context-providers/index.js +128 -0
  255. package/lib/context-providers/keys.d.ts +13 -0
  256. package/lib/context-providers/keys.js +54 -0
  257. package/lib/context-providers/load-balancers.d.ts +20 -0
  258. package/lib/context-providers/load-balancers.js +161 -0
  259. package/lib/context-providers/security-groups.d.ts +9 -0
  260. package/lib/context-providers/security-groups.js +69 -0
  261. package/lib/context-providers/ssm-parameters.d.ts +25 -0
  262. package/lib/context-providers/ssm-parameters.js +61 -0
  263. package/lib/context-providers/vpcs.d.ts +13 -0
  264. package/lib/context-providers/vpcs.js +291 -0
  265. package/lib/index.d.ts +1 -0
  266. package/lib/index.js +2 -1
  267. package/lib/payloads/bootstrap-environment-progress.d.ts +17 -0
  268. package/lib/payloads/bootstrap-environment-progress.js +3 -0
  269. package/lib/payloads/context.d.ts +9 -0
  270. package/lib/payloads/context.js +3 -0
  271. package/lib/payloads/deploy.d.ts +43 -0
  272. package/lib/payloads/deploy.js +3 -0
  273. package/lib/payloads/destroy.d.ts +23 -0
  274. package/lib/payloads/destroy.js +3 -0
  275. package/lib/payloads/diff.d.ts +31 -0
  276. package/lib/payloads/diff.js +22 -0
  277. package/lib/payloads/hotswap.d.ts +211 -0
  278. package/lib/payloads/hotswap.js +43 -0
  279. package/lib/payloads/index.d.ts +17 -0
  280. package/lib/payloads/index.js +34 -0
  281. package/lib/payloads/list.d.ts +4 -0
  282. package/lib/payloads/list.js +3 -0
  283. package/lib/payloads/logs-monitor.d.ts +33 -0
  284. package/lib/payloads/logs-monitor.js +3 -0
  285. package/lib/payloads/progress.d.ts +14 -0
  286. package/lib/payloads/progress.js +3 -0
  287. package/lib/payloads/refactor.d.ts +14 -0
  288. package/lib/payloads/refactor.js +3 -0
  289. package/lib/payloads/rollback.d.ts +17 -0
  290. package/lib/payloads/rollback.js +3 -0
  291. package/lib/payloads/sdk-trace.d.ts +20 -0
  292. package/lib/payloads/sdk-trace.js +3 -0
  293. package/lib/payloads/stack-activity.d.ts +53 -0
  294. package/lib/payloads/stack-activity.js +3 -0
  295. package/lib/payloads/stack-details.d.ts +17 -0
  296. package/lib/payloads/stack-details.js +3 -0
  297. package/lib/payloads/synth.d.ts +7 -0
  298. package/lib/payloads/synth.js +3 -0
  299. package/lib/payloads/types.d.ts +95 -0
  300. package/lib/payloads/types.js +3 -0
  301. package/lib/payloads/watch.d.ts +27 -0
  302. package/lib/payloads/watch.js +3 -0
  303. package/lib/private/activity-printer/base.d.ts +50 -0
  304. package/lib/private/activity-printer/base.js +120 -0
  305. package/lib/private/activity-printer/current.d.ts +26 -0
  306. package/lib/private/activity-printer/current.js +122 -0
  307. package/lib/private/activity-printer/display.d.ts +13 -0
  308. package/lib/private/activity-printer/display.js +81 -0
  309. package/lib/private/activity-printer/history.d.ts +32 -0
  310. package/lib/private/activity-printer/history.js +109 -0
  311. package/lib/private/activity-printer/index.d.ts +3 -0
  312. package/lib/private/activity-printer/index.js +20 -0
  313. package/lib/private/index.d.ts +1 -0
  314. package/lib/private/index.js +18 -0
  315. package/lib/private/util.d.ts +1 -1
  316. package/lib/private/util.js +22 -22
  317. package/lib/private/util.js.map +2 -2
  318. package/lib/toolkit/private/index.d.ts +2 -1
  319. package/lib/toolkit/private/index.js +1 -1
  320. package/lib/toolkit/toolkit.js +142 -124
  321. package/lib/toolkit/types.d.ts +0 -55
  322. package/lib/toolkit/types.js +1 -1
  323. package/lib/util/archive.d.ts +1 -0
  324. package/lib/util/archive.js +86 -0
  325. package/lib/util/arrays.d.ts +14 -0
  326. package/lib/util/arrays.js +36 -0
  327. package/lib/util/bool.d.ts +7 -0
  328. package/lib/util/bool.js +13 -0
  329. package/lib/util/bytes.d.ts +8 -0
  330. package/lib/util/bytes.js +21 -0
  331. package/lib/util/cloudformation.d.ts +16 -0
  332. package/lib/util/cloudformation.js +36 -0
  333. package/lib/util/content-hash.d.ts +5 -0
  334. package/lib/util/content-hash.js +43 -0
  335. package/lib/util/directories.d.ts +22 -0
  336. package/lib/util/directories.js +59 -0
  337. package/lib/util/format-error.d.ts +9 -0
  338. package/lib/util/format-error.js +22 -0
  339. package/lib/util/index.d.ts +18 -0
  340. package/lib/util/index.js +35 -0
  341. package/lib/util/json.d.ts +48 -0
  342. package/lib/util/json.js +68 -0
  343. package/lib/util/objects.d.ts +65 -0
  344. package/lib/util/objects.js +230 -0
  345. package/lib/util/package-info.d.ts +3 -0
  346. package/lib/util/package-info.js +22 -0
  347. package/lib/util/parallel.d.ts +6 -0
  348. package/lib/util/parallel.js +48 -0
  349. package/lib/util/serialize.d.ts +27 -0
  350. package/lib/util/serialize.js +86 -0
  351. package/lib/util/string-manipulation.d.ts +18 -0
  352. package/lib/util/string-manipulation.js +46 -0
  353. package/lib/util/type-brands.d.ts +39 -0
  354. package/lib/util/type-brands.js +39 -0
  355. package/lib/util/types.d.ts +27 -0
  356. package/lib/util/types.js +25 -0
  357. package/lib/util/version-range.d.ts +2 -0
  358. package/lib/util/version-range.js +36 -0
  359. package/lib/util/yaml-cfn.d.ts +15 -0
  360. package/lib/util/yaml-cfn.js +58 -0
  361. package/package.json +3 -4
@@ -26,12 +26,21 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
26
26
  mod
27
27
  ));
28
28
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+ var __decorateClass = (decorators, target, key, kind) => {
30
+ var result2 = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target;
31
+ for (var i = decorators.length - 1, decorator; i >= 0; i--)
32
+ if (decorator = decorators[i])
33
+ result2 = (kind ? decorator(target, key, result2) : decorator(result2)) || result2;
34
+ if (kind && result2) __defProp(target, key, result2);
35
+ return result2;
36
+ };
29
37
 
30
38
  // lib/api/shared-public.ts
31
39
  var shared_public_exports = {};
32
40
  __export(shared_public_exports, {
33
41
  AssemblyError: () => AssemblyError,
34
42
  AuthenticationError: () => AuthenticationError,
43
+ ContextProviderError: () => ContextProviderError,
35
44
  ExpandStackSelection: () => ExpandStackSelection,
36
45
  NonHotswappableReason: () => NonHotswappableReason,
37
46
  PermissionChangeType: () => PermissionChangeType,
@@ -41,7 +50,7 @@ __export(shared_public_exports, {
41
50
  });
42
51
  module.exports = __toCommonJS(shared_public_exports);
43
52
 
44
- // ../tmp-toolkit-helpers/src/api/toolkit-error.ts
53
+ // lib/api/toolkit-error.ts
45
54
  var TOOLKIT_ERROR_SYMBOL = Symbol.for("@aws-cdk/toolkit-lib.ToolkitError");
46
55
  var AUTHENTICATION_ERROR_SYMBOL = Symbol.for("@aws-cdk/toolkit-lib.AuthenticationError");
47
56
  var ASSEMBLY_ERROR_SYMBOL = Symbol.for("@aws-cdk/toolkit-lib.AssemblyError");
@@ -141,8 +150,19 @@ var AssemblyError = class _AssemblyError extends ToolkitError {
141
150
  this.stacks = stacks;
142
151
  }
143
152
  };
153
+ var ContextProviderError = class _ContextProviderError extends ToolkitError {
154
+ /**
155
+ * Denotes the source of the error as user.
156
+ */
157
+ source = "user";
158
+ constructor(message2) {
159
+ super(message2, "context-provider");
160
+ Object.setPrototypeOf(this, _ContextProviderError.prototype);
161
+ Object.defineProperty(this, CONTEXT_PROVIDER_ERROR_SYMBOL, { value: true });
162
+ }
163
+ };
144
164
 
145
- // ../tmp-toolkit-helpers/src/api/cloud-assembly/stack-selector.ts
165
+ // lib/api/cloud-assembly/stack-selector.ts
146
166
  var StackSelectionStrategy = /* @__PURE__ */ ((StackSelectionStrategy2) => {
147
167
  StackSelectionStrategy2["ALL_STACKS"] = "all-stacks";
148
168
  StackSelectionStrategy2["MAIN_ASSEMBLY"] = "main-assembly";
@@ -159,26 +179,94 @@ var ExpandStackSelection = /* @__PURE__ */ ((ExpandStackSelection2) => {
159
179
  return ExpandStackSelection2;
160
180
  })(ExpandStackSelection || {});
161
181
 
162
- // ../tmp-toolkit-helpers/src/api/plugin/plugin.ts
163
- var import_util2 = require("util");
182
+ // lib/api/resource-metadata/resource-metadata.ts
183
+ var import_cloud_assembly_schema = require("@aws-cdk/cloud-assembly-schema");
164
184
 
165
- // ../tmp-toolkit-helpers/src/api/plugin/context-provider-plugin.ts
185
+ // lib/api/plugin/plugin.ts
186
+ var import_util27 = require("util");
187
+
188
+ // lib/api/plugin/context-provider-plugin.ts
166
189
  function isContextProviderPlugin(x) {
167
190
  return typeof x === "object" && !!x && !!x.getValue;
168
191
  }
169
192
 
170
- // ../tmp-toolkit-helpers/src/api/io/private/span.ts
171
- var util = __toESM(require("node:util"));
172
- var uuid = __toESM(require("uuid"));
173
-
174
- // ../tmp-toolkit-helpers/src/util/archive.ts
193
+ // lib/util/archive.ts
175
194
  var glob = __toESM(require("glob"));
195
+
196
+ // lib/util/format-error.ts
197
+ function formatErrorMessage(error2) {
198
+ if (error2 && Array.isArray(error2.errors)) {
199
+ const innerMessages = error2.errors.map((innerError) => innerError?.message || innerError?.toString()).join("\n");
200
+ return `AggregateError: ${innerMessages}`;
201
+ }
202
+ return error2?.message || error2?.toString() || "Unknown error";
203
+ }
204
+
205
+ // lib/util/archive.ts
176
206
  var archiver = require("archiver");
177
207
 
178
- // ../tmp-toolkit-helpers/src/util/types.ts
208
+ // lib/util/directories.ts
209
+ var fs = __toESM(require("fs"));
210
+ var os = __toESM(require("os"));
211
+ var path = __toESM(require("path"));
212
+ function cdkHomeDir() {
213
+ const tmpDir = fs.realpathSync(os.tmpdir());
214
+ let home;
215
+ try {
216
+ let userInfoHome = os.userInfo().homedir;
217
+ if (userInfoHome == "/var/empty") {
218
+ userInfoHome = void 0;
219
+ }
220
+ home = path.join((userInfoHome ?? os.homedir()).trim(), ".cdk");
221
+ } catch {
222
+ }
223
+ return process.env.CDK_HOME ? path.resolve(process.env.CDK_HOME) : home || fs.mkdtempSync(path.join(tmpDir, ".cdk")).trim();
224
+ }
225
+ function cdkCacheDir() {
226
+ return path.join(cdkHomeDir(), "cache");
227
+ }
228
+ function bundledPackageRootDir(start, fail) {
229
+ function _rootDir(dirname2) {
230
+ const manifestPath = path.join(dirname2, "package.json");
231
+ if (fs.existsSync(manifestPath)) {
232
+ return dirname2;
233
+ }
234
+ if (path.dirname(dirname2) === dirname2) {
235
+ if (fail ?? true) {
236
+ throw new ToolkitError("Unable to find package manifest");
237
+ }
238
+ return void 0;
239
+ }
240
+ return _rootDir(path.dirname(dirname2));
241
+ }
242
+ return _rootDir(start);
243
+ }
244
+
245
+ // lib/util/json.ts
246
+ function getResultObj(jsonObject, identifier, propertiesToReturn) {
247
+ const propsObj = {};
248
+ propertiesToReturn.forEach((propName) => {
249
+ Object.assign(propsObj, { [propName]: findJsonValue(jsonObject, propName) });
250
+ });
251
+ Object.assign(propsObj, { ["Identifier"]: identifier });
252
+ return propsObj;
253
+ }
254
+ function findJsonValue(jsonObject, path5) {
255
+ const paths = path5.split(".");
256
+ let obj = jsonObject;
257
+ paths.forEach((p) => {
258
+ obj = obj[p];
259
+ if (obj === void 0) {
260
+ throw new TypeError(`Cannot read field ${path5}. ${p} is not found.`);
261
+ }
262
+ });
263
+ return obj;
264
+ }
265
+
266
+ // lib/util/types.ts
179
267
  var isArray = Array.isArray;
180
268
 
181
- // ../tmp-toolkit-helpers/src/util/yaml-cfn.ts
269
+ // lib/util/yaml-cfn.ts
182
270
  var yaml = __toESM(require("yaml"));
183
271
  var yaml_types = __toESM(require("yaml/types"));
184
272
  function makeTagForCfnIntrinsic(intrinsicName, addFnPrefix) {
@@ -223,7 +311,7 @@ function parseYamlStrWithCfnTags(text) {
223
311
  });
224
312
  }
225
313
 
226
- // ../tmp-toolkit-helpers/src/util/string-manipulation.ts
314
+ // lib/util/string-manipulation.ts
227
315
  function formatTime(num) {
228
316
  return roundPercentage(millisecondsToSeconds(num));
229
317
  }
@@ -234,10 +322,2083 @@ function millisecondsToSeconds(num) {
234
322
  return num / 1e3;
235
323
  }
236
324
 
237
- // ../tmp-toolkit-helpers/src/util/version-range.ts
325
+ // lib/util/version-range.ts
238
326
  var semver = __toESM(require("semver"));
239
327
 
240
- // ../tmp-toolkit-helpers/src/api/io/private/span.ts
328
+ // lib/private/dispose-polyfill.ts
329
+ Symbol.dispose ??= Symbol("Symbol.dispose");
330
+ Symbol.asyncDispose ??= Symbol("Symbol.asyncDispose");
331
+
332
+ // lib/private/activity-printer/history.ts
333
+ var chalk = __toESM(require("chalk"));
334
+
335
+ // lib/private/activity-printer/current.ts
336
+ var chalk2 = __toESM(require("chalk"));
337
+
338
+ // lib/private/activity-printer/display.ts
339
+ var wrapAnsi = require("wrap-ansi");
340
+
341
+ // lib/private/activity-printer/current.ts
342
+ var PROGRESSBAR_EXTRA_SPACE = 2 + 2 + 4 + 6;
343
+
344
+ // lib/api/aws-auth/proxy-agent.ts
345
+ var fs2 = __toESM(require("fs-extra"));
346
+ var import_proxy_agent = require("proxy-agent");
347
+
348
+ // lib/api/aws-auth/sdk.ts
349
+ var import_client_appsync = require("@aws-sdk/client-appsync");
350
+ var import_client_cloudcontrol = require("@aws-sdk/client-cloudcontrol");
351
+ var import_client_cloudformation = require("@aws-sdk/client-cloudformation");
352
+ var import_client_cloudwatch_logs = require("@aws-sdk/client-cloudwatch-logs");
353
+ var import_client_codebuild = require("@aws-sdk/client-codebuild");
354
+ var import_client_ec2 = require("@aws-sdk/client-ec2");
355
+ var import_client_ecr = require("@aws-sdk/client-ecr");
356
+ var import_client_ecs = require("@aws-sdk/client-ecs");
357
+ var import_client_elastic_load_balancing_v2 = require("@aws-sdk/client-elastic-load-balancing-v2");
358
+ var import_client_iam = require("@aws-sdk/client-iam");
359
+ var import_client_kms = require("@aws-sdk/client-kms");
360
+ var import_client_lambda = require("@aws-sdk/client-lambda");
361
+ var import_client_route_53 = require("@aws-sdk/client-route-53");
362
+ var import_client_s3 = require("@aws-sdk/client-s3");
363
+ var import_client_secrets_manager = require("@aws-sdk/client-secrets-manager");
364
+ var import_client_sfn = require("@aws-sdk/client-sfn");
365
+ var import_client_ssm = require("@aws-sdk/client-ssm");
366
+ var import_client_sts = require("@aws-sdk/client-sts");
367
+ var import_lib_storage = require("@aws-sdk/lib-storage");
368
+ var import_middleware_endpoint = require("@smithy/middleware-endpoint");
369
+ var import_util_retry = require("@smithy/util-retry");
370
+
371
+ // lib/api/aws-auth/account-cache.ts
372
+ var path2 = __toESM(require("path"));
373
+ var fs3 = __toESM(require("fs-extra"));
374
+ var AccountAccessKeyCache = class _AccountAccessKeyCache {
375
+ /**
376
+ * Max number of entries in the cache, after which the cache will be reset.
377
+ */
378
+ static MAX_ENTRIES = 1e3;
379
+ /**
380
+ * The default path used for the accounts access key cache
381
+ */
382
+ static get DEFAULT_PATH() {
383
+ return path2.join(cdkCacheDir(), "accounts_partitions.json");
384
+ }
385
+ cacheFile;
386
+ debug;
387
+ /**
388
+ * @param filePath Path to the cache file
389
+ */
390
+ constructor(filePath = _AccountAccessKeyCache.DEFAULT_PATH, debugFn) {
391
+ this.cacheFile = filePath;
392
+ this.debug = debugFn;
393
+ }
394
+ /**
395
+ * Tries to fetch the account ID from cache. If it's not in the cache, invokes
396
+ * the resolver function which should retrieve the account ID and return it.
397
+ * Then, it will be stored into disk cache returned.
398
+ *
399
+ * Example:
400
+ *
401
+ * const accountId = cache.fetch(accessKey, async () => {
402
+ * return await fetchAccountIdFromSomewhere(accessKey);
403
+ * });
404
+ */
405
+ async fetch(accessKeyId, resolver) {
406
+ const cached2 = await this.get(accessKeyId);
407
+ if (cached2) {
408
+ await this.debug(`Retrieved account ID ${cached2.accountId} from disk cache`);
409
+ return cached2;
410
+ }
411
+ const account = await resolver();
412
+ if (account) {
413
+ await this.put(accessKeyId, account);
414
+ }
415
+ return account;
416
+ }
417
+ /** Get the account ID from an access key or undefined if not in cache */
418
+ async get(accessKeyId) {
419
+ const map = await this.loadMap();
420
+ return map[accessKeyId];
421
+ }
422
+ /** Put a mapping between access key and account ID */
423
+ async put(accessKeyId, account) {
424
+ let map = await this.loadMap();
425
+ if (Object.keys(map).length >= _AccountAccessKeyCache.MAX_ENTRIES) {
426
+ map = {};
427
+ }
428
+ map[accessKeyId] = account;
429
+ await this.saveMap(map);
430
+ }
431
+ async loadMap() {
432
+ try {
433
+ return await fs3.readJson(this.cacheFile);
434
+ } catch (e) {
435
+ if (e.code === "ENOENT" || e.code === "EACCES") {
436
+ return {};
437
+ }
438
+ if (e instanceof SyntaxError) {
439
+ return {};
440
+ }
441
+ throw e;
442
+ }
443
+ }
444
+ async saveMap(map) {
445
+ try {
446
+ await fs3.ensureFile(this.cacheFile);
447
+ await fs3.writeJson(this.cacheFile, map, { spaces: 2 });
448
+ } catch (e) {
449
+ if (e.code === "ENOENT" || e.code === "EACCES" || e.code === "EROFS") {
450
+ return;
451
+ }
452
+ throw e;
453
+ }
454
+ }
455
+ };
456
+
457
+ // lib/api/aws-auth/cached.ts
458
+ function cached(obj, sym, fn) {
459
+ if (!(sym in obj)) {
460
+ obj[sym] = fn();
461
+ }
462
+ return obj[sym];
463
+ }
464
+ async function cachedAsync(obj, sym, fn) {
465
+ if (!(sym in obj)) {
466
+ obj[sym] = await fn();
467
+ }
468
+ return obj[sym];
469
+ }
470
+
471
+ // lib/api/aws-auth/tracing.ts
472
+ var ENABLED = false;
473
+ var INDENT = 0;
474
+ function callTrace(fn, className, logger) {
475
+ if (!ENABLED || !logger) {
476
+ return;
477
+ }
478
+ logger.info(`[trace] ${" ".repeat(INDENT)}${className || "(anonymous)"}#${fn}()`);
479
+ }
480
+ function traceCall(receiver, _propertyKey, descriptor, parentClassName) {
481
+ const fn = descriptor.value;
482
+ const className = typeof receiver === "function" ? receiver.name : parentClassName;
483
+ descriptor.value = function(...args) {
484
+ const logger = this.logger;
485
+ if (!ENABLED || typeof logger?.info !== "function") {
486
+ return fn.apply(this, args);
487
+ }
488
+ logger.info.apply(logger, [`[trace] ${" ".repeat(INDENT)}${className || this.constructor.name || "(anonymous)"}#${fn.name}()`]);
489
+ INDENT += 2;
490
+ const ret = fn.apply(this, args);
491
+ if (ret instanceof Promise) {
492
+ return ret.finally(() => {
493
+ INDENT -= 2;
494
+ });
495
+ } else {
496
+ INDENT -= 2;
497
+ return ret;
498
+ }
499
+ };
500
+ return descriptor;
501
+ }
502
+ function traceMemberMethods(constructor) {
503
+ for (const [name, descriptor] of Object.entries(Object.getOwnPropertyDescriptors(constructor.prototype))) {
504
+ if (typeof descriptor.value !== "function") {
505
+ continue;
506
+ }
507
+ const newDescriptor = traceCall(constructor.prototype, name, descriptor, constructor.name) ?? descriptor;
508
+ Object.defineProperty(constructor.prototype, name, newDescriptor);
509
+ }
510
+ }
511
+
512
+ // lib/api/aws-auth/user-agent.ts
513
+ var path3 = __toESM(require("path"));
514
+
515
+ // lib/api/aws-auth/util.ts
516
+ var fs4 = __toESM(require("fs-extra"));
517
+ function readIfPossible(filename) {
518
+ try {
519
+ if (!fs4.pathExistsSync(filename)) {
520
+ return void 0;
521
+ }
522
+ return fs4.readFileSync(filename, { encoding: "utf-8" });
523
+ } catch (e) {
524
+ return void 0;
525
+ }
526
+ }
527
+
528
+ // lib/api/aws-auth/user-agent.ts
529
+ function defaultCliUserAgent() {
530
+ const root = bundledPackageRootDir(__dirname, false);
531
+ const pkg = JSON.parse((root ? readIfPossible(path3.join(root, "package.json")) : void 0) ?? "{}");
532
+ const name = pkg.name ?? path3.basename(process.argv[1] ?? "cdk-cli");
533
+ const version = pkg.version ?? "<unknown>";
534
+ return `${name}/${version}`;
535
+ }
536
+
537
+ // lib/api/aws-auth/sdk.ts
538
+ var SDK = class {
539
+ constructor(credProvider, region, requestHandler, ioHelper, logger) {
540
+ this.credProvider = credProvider;
541
+ const debugFn = async (msg) => ioHelper.notify(IO.DEFAULT_SDK_DEBUG.msg(msg));
542
+ this.accountCache = new AccountAccessKeyCache(AccountAccessKeyCache.DEFAULT_PATH, debugFn);
543
+ this.debug = debugFn;
544
+ this.config = {
545
+ region,
546
+ credentials: credProvider,
547
+ requestHandler,
548
+ retryStrategy: new import_util_retry.ConfiguredRetryStrategy(7, (attempt) => 300 * 2 ** attempt),
549
+ customUserAgent: defaultCliUserAgent(),
550
+ logger
551
+ };
552
+ this.logger = logger;
553
+ this.currentRegion = region;
554
+ }
555
+ currentRegion;
556
+ config;
557
+ logger;
558
+ accountCache;
559
+ /**
560
+ * STS is used to check credential validity, don't do too many retries.
561
+ */
562
+ stsRetryStrategy = new import_util_retry.ConfiguredRetryStrategy(3, (attempt) => 100 * 2 ** attempt);
563
+ /**
564
+ * Whether we have proof that the credentials have not expired
565
+ *
566
+ * We need to do some manual plumbing around this because the JS SDKv2 treats `ExpiredToken`
567
+ * as retriable and we have hefty retries on CFN calls making the CLI hang for a good 15 minutes
568
+ * if the credentials have expired.
569
+ */
570
+ _credentialsValidated = false;
571
+ /**
572
+ * A function to create debug messages
573
+ */
574
+ debug;
575
+ appendCustomUserAgent(userAgentData) {
576
+ if (!userAgentData) {
577
+ return;
578
+ }
579
+ const currentCustomUserAgent = this.config.customUserAgent;
580
+ this.config.customUserAgent = currentCustomUserAgent ? `${currentCustomUserAgent} ${userAgentData}` : userAgentData;
581
+ }
582
+ removeCustomUserAgent(userAgentData) {
583
+ this.config.customUserAgent = this.config.customUserAgent?.replace(userAgentData, "");
584
+ }
585
+ appsync() {
586
+ const client = new import_client_appsync.AppSyncClient(this.config);
587
+ return {
588
+ getSchemaCreationStatus: (input) => client.send(new import_client_appsync.GetSchemaCreationStatusCommand(input)),
589
+ startSchemaCreation: (input) => client.send(new import_client_appsync.StartSchemaCreationCommand(input)),
590
+ updateApiKey: (input) => client.send(new import_client_appsync.UpdateApiKeyCommand(input)),
591
+ updateFunction: (input) => client.send(new import_client_appsync.UpdateFunctionCommand(input)),
592
+ updateResolver: (input) => client.send(new import_client_appsync.UpdateResolverCommand(input)),
593
+ // Pagination Functions
594
+ listFunctions: async (input) => {
595
+ const functions = Array();
596
+ const paginator = (0, import_client_appsync.paginateListFunctions)({ client }, input);
597
+ for await (const page of paginator) {
598
+ functions.push(...page.functions || []);
599
+ }
600
+ return functions;
601
+ }
602
+ };
603
+ }
604
+ cloudControl() {
605
+ const client = new import_client_cloudcontrol.CloudControlClient(this.config);
606
+ return {
607
+ listResources: (input) => client.send(new import_client_cloudcontrol.ListResourcesCommand(input)),
608
+ getResource: (input) => client.send(new import_client_cloudcontrol.GetResourceCommand(input))
609
+ };
610
+ }
611
+ cloudFormation() {
612
+ const client = new import_client_cloudformation.CloudFormationClient({
613
+ ...this.config,
614
+ retryStrategy: new import_util_retry.ConfiguredRetryStrategy(11, (attempt) => 1e3 * 2 ** attempt)
615
+ });
616
+ return {
617
+ continueUpdateRollback: async (input) => client.send(new import_client_cloudformation.ContinueUpdateRollbackCommand(input)),
618
+ createChangeSet: (input) => client.send(new import_client_cloudformation.CreateChangeSetCommand(input)),
619
+ createGeneratedTemplate: (input) => client.send(new import_client_cloudformation.CreateGeneratedTemplateCommand(input)),
620
+ createStack: (input) => client.send(new import_client_cloudformation.CreateStackCommand(input)),
621
+ deleteChangeSet: (input) => client.send(new import_client_cloudformation.DeleteChangeSetCommand(input)),
622
+ deleteGeneratedTemplate: (input) => client.send(new import_client_cloudformation.DeleteGeneratedTemplateCommand(input)),
623
+ deleteStack: (input) => client.send(new import_client_cloudformation.DeleteStackCommand(input)),
624
+ describeChangeSet: (input) => client.send(new import_client_cloudformation.DescribeChangeSetCommand(input)),
625
+ describeGeneratedTemplate: (input) => client.send(new import_client_cloudformation.DescribeGeneratedTemplateCommand(input)),
626
+ describeResourceScan: (input) => client.send(new import_client_cloudformation.DescribeResourceScanCommand(input)),
627
+ describeStacks: (input) => client.send(new import_client_cloudformation.DescribeStacksCommand(input)),
628
+ describeStackResources: (input) => client.send(new import_client_cloudformation.DescribeStackResourcesCommand(input)),
629
+ executeChangeSet: (input) => client.send(new import_client_cloudformation.ExecuteChangeSetCommand(input)),
630
+ getGeneratedTemplate: (input) => client.send(new import_client_cloudformation.GetGeneratedTemplateCommand(input)),
631
+ getTemplate: (input) => client.send(new import_client_cloudformation.GetTemplateCommand(input)),
632
+ getTemplateSummary: (input) => client.send(new import_client_cloudformation.GetTemplateSummaryCommand(input)),
633
+ listExports: (input) => client.send(new import_client_cloudformation.ListExportsCommand(input)),
634
+ listResourceScanRelatedResources: (input) => client.send(new import_client_cloudformation.ListResourceScanRelatedResourcesCommand(input)),
635
+ listResourceScanResources: (input) => client.send(new import_client_cloudformation.ListResourceScanResourcesCommand(input)),
636
+ listResourceScans: (input) => client.send(new import_client_cloudformation.ListResourceScansCommand(input)),
637
+ listStacks: (input) => client.send(new import_client_cloudformation.ListStacksCommand(input)),
638
+ rollbackStack: (input) => client.send(new import_client_cloudformation.RollbackStackCommand(input)),
639
+ startResourceScan: (input) => client.send(new import_client_cloudformation.StartResourceScanCommand(input)),
640
+ updateStack: (input) => client.send(new import_client_cloudformation.UpdateStackCommand(input)),
641
+ updateTerminationProtection: (input) => client.send(new import_client_cloudformation.UpdateTerminationProtectionCommand(input)),
642
+ describeStackEvents: (input) => {
643
+ return client.send(new import_client_cloudformation.DescribeStackEventsCommand(input));
644
+ },
645
+ listStackResources: async (input) => {
646
+ const stackResources = Array();
647
+ const paginator = (0, import_client_cloudformation.paginateListStackResources)({ client }, input);
648
+ for await (const page of paginator) {
649
+ stackResources.push(...page?.StackResourceSummaries || []);
650
+ }
651
+ return stackResources;
652
+ },
653
+ paginatedListStacks: async (input) => {
654
+ const stackResources = Array();
655
+ const paginator = (0, import_client_cloudformation.paginateListStacks)({ client }, input);
656
+ for await (const page of paginator) {
657
+ stackResources.push(...page?.StackSummaries || []);
658
+ }
659
+ return stackResources;
660
+ }
661
+ };
662
+ }
663
+ cloudWatchLogs() {
664
+ const client = new import_client_cloudwatch_logs.CloudWatchLogsClient(this.config);
665
+ return {
666
+ describeLogGroups: (input) => client.send(new import_client_cloudwatch_logs.DescribeLogGroupsCommand(input)),
667
+ filterLogEvents: (input) => client.send(new import_client_cloudwatch_logs.FilterLogEventsCommand(input))
668
+ };
669
+ }
670
+ codeBuild() {
671
+ const client = new import_client_codebuild.CodeBuildClient(this.config);
672
+ return {
673
+ updateProject: (input) => client.send(new import_client_codebuild.UpdateProjectCommand(input))
674
+ };
675
+ }
676
+ ec2() {
677
+ const client = new import_client_ec2.EC2Client(this.config);
678
+ return {
679
+ describeAvailabilityZones: (input) => client.send(new import_client_ec2.DescribeAvailabilityZonesCommand(input)),
680
+ describeImages: (input) => client.send(new import_client_ec2.DescribeImagesCommand(input)),
681
+ describeInstances: (input) => client.send(new import_client_ec2.DescribeInstancesCommand(input)),
682
+ describeRouteTables: (input) => client.send(new import_client_ec2.DescribeRouteTablesCommand(input)),
683
+ describeSecurityGroups: (input) => client.send(new import_client_ec2.DescribeSecurityGroupsCommand(input)),
684
+ describeSubnets: (input) => client.send(new import_client_ec2.DescribeSubnetsCommand(input)),
685
+ describeVpcEndpointServices: (input) => client.send(new import_client_ec2.DescribeVpcEndpointServicesCommand(input)),
686
+ describeVpcs: (input) => client.send(new import_client_ec2.DescribeVpcsCommand(input)),
687
+ describeVpnGateways: (input) => client.send(new import_client_ec2.DescribeVpnGatewaysCommand(input))
688
+ };
689
+ }
690
+ ecr() {
691
+ const client = new import_client_ecr.ECRClient(this.config);
692
+ return {
693
+ batchDeleteImage: (input) => client.send(new import_client_ecr.BatchDeleteImageCommand(input)),
694
+ batchGetImage: (input) => client.send(new import_client_ecr.BatchGetImageCommand(input)),
695
+ createRepository: (input) => client.send(new import_client_ecr.CreateRepositoryCommand(input)),
696
+ describeImages: (input) => client.send(new import_client_ecr.DescribeImagesCommand(input)),
697
+ describeRepositories: (input) => client.send(new import_client_ecr.DescribeRepositoriesCommand(input)),
698
+ getAuthorizationToken: (input) => client.send(new import_client_ecr.GetAuthorizationTokenCommand(input)),
699
+ listImages: (input) => client.send(new import_client_ecr.ListImagesCommand(input)),
700
+ putImage: (input) => client.send(new import_client_ecr.PutImageCommand(input)),
701
+ putImageScanningConfiguration: (input) => client.send(new import_client_ecr.PutImageScanningConfigurationCommand(input))
702
+ };
703
+ }
704
+ ecs() {
705
+ const client = new import_client_ecs.ECSClient(this.config);
706
+ return {
707
+ listClusters: (input) => client.send(new import_client_ecs.ListClustersCommand(input)),
708
+ registerTaskDefinition: (input) => client.send(new import_client_ecs.RegisterTaskDefinitionCommand(input)),
709
+ updateService: (input) => client.send(new import_client_ecs.UpdateServiceCommand(input)),
710
+ // Waiters
711
+ waitUntilServicesStable: (input) => {
712
+ return (0, import_client_ecs.waitUntilServicesStable)(
713
+ {
714
+ client,
715
+ maxWaitTime: 600,
716
+ minDelay: 6,
717
+ maxDelay: 6
718
+ },
719
+ input
720
+ );
721
+ }
722
+ };
723
+ }
724
+ elbv2() {
725
+ const client = new import_client_elastic_load_balancing_v2.ElasticLoadBalancingV2Client(this.config);
726
+ return {
727
+ describeListeners: (input) => client.send(new import_client_elastic_load_balancing_v2.DescribeListenersCommand(input)),
728
+ describeLoadBalancers: (input) => client.send(new import_client_elastic_load_balancing_v2.DescribeLoadBalancersCommand(input)),
729
+ describeTags: (input) => client.send(new import_client_elastic_load_balancing_v2.DescribeTagsCommand(input)),
730
+ // Pagination Functions
731
+ paginateDescribeListeners: async (input) => {
732
+ const listeners = Array();
733
+ const paginator = (0, import_client_elastic_load_balancing_v2.paginateDescribeListeners)({ client }, input);
734
+ for await (const page of paginator) {
735
+ listeners.push(...page?.Listeners || []);
736
+ }
737
+ return listeners;
738
+ },
739
+ paginateDescribeLoadBalancers: async (input) => {
740
+ const loadBalancers = Array();
741
+ const paginator = (0, import_client_elastic_load_balancing_v2.paginateDescribeLoadBalancers)({ client }, input);
742
+ for await (const page of paginator) {
743
+ loadBalancers.push(...page?.LoadBalancers || []);
744
+ }
745
+ return loadBalancers;
746
+ }
747
+ };
748
+ }
749
+ iam() {
750
+ const client = new import_client_iam.IAMClient(this.config);
751
+ return {
752
+ createPolicy: (input) => client.send(new import_client_iam.CreatePolicyCommand(input)),
753
+ getPolicy: (input) => client.send(new import_client_iam.GetPolicyCommand(input)),
754
+ getRole: (input) => client.send(new import_client_iam.GetRoleCommand(input))
755
+ };
756
+ }
757
+ kms() {
758
+ const client = new import_client_kms.KMSClient(this.config);
759
+ return {
760
+ describeKey: (input) => client.send(new import_client_kms.DescribeKeyCommand(input)),
761
+ listAliases: (input) => client.send(new import_client_kms.ListAliasesCommand(input))
762
+ };
763
+ }
764
+ lambda() {
765
+ const client = new import_client_lambda.LambdaClient(this.config);
766
+ return {
767
+ invokeCommand: (input) => client.send(new import_client_lambda.InvokeCommand(input)),
768
+ publishVersion: (input) => client.send(new import_client_lambda.PublishVersionCommand(input)),
769
+ updateAlias: (input) => client.send(new import_client_lambda.UpdateAliasCommand(input)),
770
+ updateFunctionCode: (input) => client.send(new import_client_lambda.UpdateFunctionCodeCommand(input)),
771
+ updateFunctionConfiguration: (input) => client.send(new import_client_lambda.UpdateFunctionConfigurationCommand(input)),
772
+ // Waiters
773
+ waitUntilFunctionUpdated: (delaySeconds, input) => {
774
+ return (0, import_client_lambda.waitUntilFunctionUpdatedV2)(
775
+ {
776
+ client,
777
+ maxDelay: delaySeconds,
778
+ minDelay: delaySeconds,
779
+ maxWaitTime: delaySeconds * 60
780
+ },
781
+ input
782
+ );
783
+ }
784
+ };
785
+ }
786
+ route53() {
787
+ const client = new import_client_route_53.Route53Client(this.config);
788
+ return {
789
+ getHostedZone: (input) => client.send(new import_client_route_53.GetHostedZoneCommand(input)),
790
+ listHostedZones: (input) => client.send(new import_client_route_53.ListHostedZonesCommand(input)),
791
+ listHostedZonesByName: (input) => client.send(new import_client_route_53.ListHostedZonesByNameCommand(input))
792
+ };
793
+ }
794
+ s3() {
795
+ const client = new import_client_s3.S3Client(this.config);
796
+ return {
797
+ deleteObjects: (input) => client.send(new import_client_s3.DeleteObjectsCommand({
798
+ ...input,
799
+ ChecksumAlgorithm: "SHA256"
800
+ })),
801
+ deleteObjectTagging: (input) => client.send(new import_client_s3.DeleteObjectTaggingCommand(input)),
802
+ getBucketEncryption: (input) => client.send(new import_client_s3.GetBucketEncryptionCommand(input)),
803
+ getBucketLocation: (input) => client.send(new import_client_s3.GetBucketLocationCommand(input)),
804
+ getObject: (input) => client.send(new import_client_s3.GetObjectCommand(input)),
805
+ getObjectTagging: (input) => client.send(new import_client_s3.GetObjectTaggingCommand(input)),
806
+ listObjectsV2: (input) => client.send(new import_client_s3.ListObjectsV2Command(input)),
807
+ putObjectTagging: (input) => client.send(new import_client_s3.PutObjectTaggingCommand({
808
+ ...input,
809
+ ChecksumAlgorithm: "SHA256"
810
+ })),
811
+ upload: (input) => {
812
+ try {
813
+ const upload = new import_lib_storage.Upload({
814
+ client,
815
+ params: { ...input, ChecksumAlgorithm: "SHA256" }
816
+ });
817
+ return upload.done();
818
+ } catch (e) {
819
+ throw new AuthenticationError(`Upload failed: ${formatErrorMessage(e)}`);
820
+ }
821
+ }
822
+ };
823
+ }
824
+ secretsManager() {
825
+ const client = new import_client_secrets_manager.SecretsManagerClient(this.config);
826
+ return {
827
+ getSecretValue: (input) => client.send(new import_client_secrets_manager.GetSecretValueCommand(input))
828
+ };
829
+ }
830
+ ssm() {
831
+ const client = new import_client_ssm.SSMClient(this.config);
832
+ return {
833
+ getParameter: (input) => client.send(new import_client_ssm.GetParameterCommand(input))
834
+ };
835
+ }
836
+ stepFunctions() {
837
+ const client = new import_client_sfn.SFNClient(this.config);
838
+ return {
839
+ updateStateMachine: (input) => client.send(new import_client_sfn.UpdateStateMachineCommand(input))
840
+ };
841
+ }
842
+ /**
843
+ * The AWS SDK v3 requires a client config and a command in order to get an endpoint for
844
+ * any given service.
845
+ */
846
+ async getUrlSuffix(region) {
847
+ const cfn = new import_client_cloudformation.CloudFormationClient({ region });
848
+ const endpoint = await (0, import_middleware_endpoint.getEndpointFromInstructions)({}, import_client_cloudformation.DescribeStackResourcesCommand, { ...cfn.config });
849
+ return endpoint.url.hostname.split(`${region}.`).pop();
850
+ }
851
+ async currentAccount() {
852
+ return cachedAsync(this, CURRENT_ACCOUNT_KEY, async () => {
853
+ const creds = await this.credProvider();
854
+ return this.accountCache.fetch(creds.accessKeyId, async () => {
855
+ await this.debug("Looking up default account ID from STS");
856
+ const client = new import_client_sts.STSClient({
857
+ ...this.config,
858
+ retryStrategy: this.stsRetryStrategy
859
+ });
860
+ const command = new import_client_sts.GetCallerIdentityCommand({});
861
+ const result2 = await client.send(command);
862
+ const accountId = result2.Account;
863
+ const partition = result2.Arn.split(":")[1];
864
+ if (!accountId) {
865
+ throw new AuthenticationError("STS didn't return an account ID");
866
+ }
867
+ await this.debug(`Default account ID: ${accountId}`);
868
+ this._credentialsValidated = true;
869
+ return { accountId, partition };
870
+ });
871
+ });
872
+ }
873
+ /**
874
+ * Make sure the the current credentials are not expired
875
+ */
876
+ async validateCredentials() {
877
+ if (this._credentialsValidated) {
878
+ return;
879
+ }
880
+ const client = new import_client_sts.STSClient({ ...this.config, retryStrategy: this.stsRetryStrategy });
881
+ await client.send(new import_client_sts.GetCallerIdentityCommand({}));
882
+ this._credentialsValidated = true;
883
+ }
884
+ };
885
+ SDK = __decorateClass([
886
+ traceMemberMethods
887
+ ], SDK);
888
+ var CURRENT_ACCOUNT_KEY = Symbol("current_account_key");
889
+
890
+ // lib/api/aws-auth/sdk-provider.ts
891
+ var os2 = __toESM(require("os"));
892
+ var import_cx_api = require("@aws-cdk/cx-api");
893
+ var import_credential_providers2 = require("@aws-sdk/credential-providers");
894
+
895
+ // lib/api/aws-auth/awscli-compatible.ts
896
+ var import_node_util = require("node:util");
897
+ var import_credential_providers = require("@aws-sdk/credential-providers");
898
+ var import_ec2_metadata_service = require("@aws-sdk/ec2-metadata-service");
899
+ var import_shared_ini_file_loader = require("@smithy/shared-ini-file-loader");
900
+ var promptly = __toESM(require("promptly"));
901
+
902
+ // lib/api/aws-auth/provider-caching.ts
903
+ var import_property_provider = require("@smithy/property-provider");
904
+ function makeCachingProvider(provider) {
905
+ return (0, import_property_provider.memoize)(
906
+ provider,
907
+ credentialsAboutToExpire,
908
+ (token) => !!token.expiration
909
+ );
910
+ }
911
+ function credentialsAboutToExpire(token) {
912
+ const expiryMarginSecs = 5;
913
+ return !!token.expiration && token.expiration.getTime() - Date.now() < expiryMarginSecs * 1e3;
914
+ }
915
+
916
+ // lib/api/aws-auth/awscli-compatible.ts
917
+ var AwsCliCompatible = class {
918
+ ioHelper;
919
+ requestHandler;
920
+ logger;
921
+ constructor(ioHelper, requestHandler, logger) {
922
+ this.ioHelper = ioHelper;
923
+ this.requestHandler = requestHandler;
924
+ this.logger = logger;
925
+ }
926
+ async baseConfig(profile) {
927
+ const credentialProvider = await this.credentialChainBuilder({
928
+ profile,
929
+ logger: this.logger
930
+ });
931
+ const defaultRegion = await this.region(profile);
932
+ return { credentialProvider, defaultRegion };
933
+ }
934
+ /**
935
+ * Build an AWS CLI-compatible credential chain provider
936
+ *
937
+ * The credential chain returned by this function is always caching.
938
+ */
939
+ async credentialChainBuilder(options = {}) {
940
+ const clientConfig = {
941
+ requestHandler: this.requestHandler,
942
+ customUserAgent: "aws-cdk",
943
+ logger: options.logger
944
+ };
945
+ const parentClientConfig = {
946
+ region: await this.region(options.profile)
947
+ };
948
+ if (options.profile) {
949
+ return makeCachingProvider((0, import_credential_providers.fromIni)({
950
+ profile: options.profile,
951
+ ignoreCache: true,
952
+ mfaCodeProvider: this.tokenCodeFn.bind(this),
953
+ clientConfig,
954
+ parentClientConfig,
955
+ logger: options.logger
956
+ }));
957
+ }
958
+ const envProfile = process.env.AWS_PROFILE || process.env.AWS_DEFAULT_PROFILE;
959
+ const nodeProviderChain = (0, import_credential_providers.fromNodeProviderChain)({
960
+ profile: envProfile,
961
+ clientConfig,
962
+ parentClientConfig,
963
+ logger: options.logger,
964
+ mfaCodeProvider: this.tokenCodeFn.bind(this),
965
+ ignoreCache: true
966
+ });
967
+ return shouldPrioritizeEnv() ? (0, import_credential_providers.createCredentialChain)((0, import_credential_providers.fromEnv)(), nodeProviderChain).expireAfter(60 * 6e4) : nodeProviderChain;
968
+ }
969
+ /**
970
+ * Attempts to get the region from a number of sources and falls back to us-east-1 if no region can be found,
971
+ * as is done in the AWS CLI.
972
+ *
973
+ * The order of priority is the following:
974
+ *
975
+ * 1. Environment variables specifying region, with both an AWS prefix and AMAZON prefix
976
+ * to maintain backwards compatibility, and without `DEFAULT` in the name because
977
+ * Lambda and CodeBuild set the $AWS_REGION variable.
978
+ * 2. Regions listed in the Shared Ini Files - First checking for the profile provided
979
+ * and then checking for the default profile.
980
+ * 3. IMDS instance identity region from the Metadata Service.
981
+ * 4. us-east-1
982
+ */
983
+ async region(maybeProfile) {
984
+ const defaultRegion = "us-east-1";
985
+ const profile = maybeProfile || process.env.AWS_PROFILE || process.env.AWS_DEFAULT_PROFILE || "default";
986
+ const region = process.env.AWS_REGION || process.env.AMAZON_REGION || process.env.AWS_DEFAULT_REGION || process.env.AMAZON_DEFAULT_REGION || await this.getRegionFromIni(profile) || await this.regionFromMetadataService();
987
+ if (!region) {
988
+ const usedProfile = !profile ? "" : ` (profile: "${profile}")`;
989
+ await this.ioHelper.notify(IO.DEFAULT_SDK_DEBUG.msg(
990
+ `Unable to determine AWS region from environment or AWS configuration${usedProfile}, defaulting to '${defaultRegion}'`
991
+ ));
992
+ return defaultRegion;
993
+ }
994
+ return region;
995
+ }
996
+ /**
997
+ * The MetadataService class will attempt to fetch the instance identity document from
998
+ * IMDSv2 first, and then will attempt v1 as a fallback.
999
+ *
1000
+ * If this fails, we will use us-east-1 as the region so no error should be thrown.
1001
+ * @returns The region for the instance identity
1002
+ */
1003
+ async regionFromMetadataService() {
1004
+ await this.ioHelper.notify(IO.DEFAULT_SDK_DEBUG.msg("Looking up AWS region in the EC2 Instance Metadata Service (IMDS)."));
1005
+ try {
1006
+ const metadataService = new import_ec2_metadata_service.MetadataService({
1007
+ httpOptions: {
1008
+ timeout: 1e3
1009
+ }
1010
+ });
1011
+ await metadataService.fetchMetadataToken();
1012
+ const document = await metadataService.request("/latest/dynamic/instance-identity/document", {});
1013
+ return JSON.parse(document).region;
1014
+ } catch (e) {
1015
+ await this.ioHelper.notify(IO.DEFAULT_SDK_DEBUG.msg(`Unable to retrieve AWS region from IMDS: ${e}`));
1016
+ }
1017
+ }
1018
+ /**
1019
+ * Looks up the region of the provided profile. If no region is present,
1020
+ * it will attempt to lookup the default region.
1021
+ * @param profile The profile to use to lookup the region
1022
+ * @returns The region for the profile or default profile, if present. Otherwise returns undefined.
1023
+ */
1024
+ async getRegionFromIni(profile) {
1025
+ const sharedFiles = await (0, import_shared_ini_file_loader.loadSharedConfigFiles)({ ignoreCache: true });
1026
+ return this.getRegionFromIniFile(profile, sharedFiles.credentialsFile) ?? this.getRegionFromIniFile(profile, sharedFiles.configFile) ?? this.getRegionFromIniFile("default", sharedFiles.credentialsFile) ?? this.getRegionFromIniFile("default", sharedFiles.configFile);
1027
+ }
1028
+ getRegionFromIniFile(profile, data) {
1029
+ return data?.[profile]?.region;
1030
+ }
1031
+ /**
1032
+ * Ask user for MFA token for given serial
1033
+ *
1034
+ * Result is send to callback function for SDK to authorize the request
1035
+ */
1036
+ async tokenCodeFn(serialArn) {
1037
+ const debugFn = (msg, ...args) => this.ioHelper.notify(IO.DEFAULT_SDK_DEBUG.msg((0, import_node_util.format)(msg, ...args)));
1038
+ await debugFn("Require MFA token for serial ARN", serialArn);
1039
+ try {
1040
+ const token = await promptly.prompt(`MFA token for ${serialArn}: `, {
1041
+ trim: true,
1042
+ default: ""
1043
+ });
1044
+ await debugFn("Successfully got MFA token from user");
1045
+ return token;
1046
+ } catch (err) {
1047
+ await debugFn("Failed to get MFA token", err);
1048
+ const e = new AuthenticationError(`Error fetching MFA token: ${err.message ?? err}`);
1049
+ e.name = "SharedIniFileCredentialsProviderFailure";
1050
+ throw e;
1051
+ }
1052
+ }
1053
+ };
1054
+ function shouldPrioritizeEnv() {
1055
+ const id = process.env.AWS_ACCESS_KEY_ID || process.env.AMAZON_ACCESS_KEY_ID;
1056
+ const key = process.env.AWS_SECRET_ACCESS_KEY || process.env.AMAZON_SECRET_ACCESS_KEY;
1057
+ if (!!id && !!key) {
1058
+ process.env.AWS_ACCESS_KEY_ID = id;
1059
+ process.env.AWS_SECRET_ACCESS_KEY = key;
1060
+ const sessionToken = process.env.AWS_SESSION_TOKEN ?? process.env.AMAZON_SESSION_TOKEN;
1061
+ if (sessionToken) {
1062
+ process.env.AWS_SESSION_TOKEN = sessionToken;
1063
+ }
1064
+ return true;
1065
+ }
1066
+ return false;
1067
+ }
1068
+
1069
+ // lib/api/aws-auth/credential-plugins.ts
1070
+ var import_util8 = require("util");
1071
+ var CredentialPlugins = class {
1072
+ constructor(host, ioHelper) {
1073
+ this.host = host;
1074
+ this.ioHelper = ioHelper;
1075
+ }
1076
+ cache = {};
1077
+ async fetchCredentialsFor(awsAccountId, mode) {
1078
+ const key = `${awsAccountId}-${mode}`;
1079
+ if (!(key in this.cache)) {
1080
+ this.cache[key] = await this.lookupCredentials(awsAccountId, mode);
1081
+ }
1082
+ return this.cache[key];
1083
+ }
1084
+ get availablePluginNames() {
1085
+ return this.host.credentialProviderSources.map((s) => s.name);
1086
+ }
1087
+ async lookupCredentials(awsAccountId, mode) {
1088
+ const triedSources = [];
1089
+ for (const source of this.host.credentialProviderSources) {
1090
+ let available;
1091
+ try {
1092
+ available = await source.isAvailable();
1093
+ } catch (e) {
1094
+ await this.ioHelper.notify(IO.CDK_TOOLKIT_W0100.msg(`Uncaught exception in ${source.name}: ${formatErrorMessage(e)}`));
1095
+ available = false;
1096
+ }
1097
+ if (!available) {
1098
+ await this.ioHelper.notify(IO.DEFAULT_TOOLKIT_DEBUG.msg(`Credentials source ${source.name} is not available, ignoring it.`));
1099
+ continue;
1100
+ }
1101
+ triedSources.push(source);
1102
+ let canProvide;
1103
+ try {
1104
+ canProvide = await source.canProvideCredentials(awsAccountId);
1105
+ } catch (e) {
1106
+ await this.ioHelper.notify(IO.CDK_TOOLKIT_W0100.msg(`Uncaught exception in ${source.name}: ${formatErrorMessage(e)}`));
1107
+ canProvide = false;
1108
+ }
1109
+ if (!canProvide) {
1110
+ continue;
1111
+ }
1112
+ await this.ioHelper.notify(IO.DEFAULT_TOOLKIT_DEBUG.msg(`Using ${source.name} credentials for account ${awsAccountId}`));
1113
+ return {
1114
+ credentials: await v3ProviderFromPlugin(() => source.getProvider(awsAccountId, mode, {
1115
+ supportsV3Providers: true
1116
+ })),
1117
+ pluginName: source.name
1118
+ };
1119
+ }
1120
+ return void 0;
1121
+ }
1122
+ };
1123
+ async function v3ProviderFromPlugin(producer) {
1124
+ const initial = await producer();
1125
+ if (isV3Provider(initial)) {
1126
+ return makeCachingProvider(initial);
1127
+ } else if (isV3Credentials(initial) && initial.expiration === void 0) {
1128
+ return () => Promise.resolve(initial);
1129
+ } else if (isV3Credentials(initial) && initial.expiration !== void 0) {
1130
+ return refreshFromPluginProvider(initial, producer);
1131
+ } else if (isV2Credentials(initial)) {
1132
+ return v3ProviderFromV2Credentials(initial);
1133
+ } else {
1134
+ throw new AuthenticationError(`Plugin returned a value that doesn't resemble AWS credentials: ${(0, import_util8.inspect)(initial)}`);
1135
+ }
1136
+ }
1137
+ function v3ProviderFromV2Credentials(x) {
1138
+ return async () => {
1139
+ await x.getPromise();
1140
+ return {
1141
+ accessKeyId: x.accessKeyId,
1142
+ secretAccessKey: x.secretAccessKey,
1143
+ sessionToken: x.sessionToken,
1144
+ expiration: x.expireTime ?? void 0
1145
+ };
1146
+ };
1147
+ }
1148
+ function refreshFromPluginProvider(current, producer) {
1149
+ return async () => {
1150
+ if (credentialsAboutToExpire(current)) {
1151
+ const newCreds = await producer();
1152
+ if (!isV3Credentials(newCreds)) {
1153
+ throw new AuthenticationError(`Plugin initially returned static V3 credentials but now returned something else: ${(0, import_util8.inspect)(newCreds)}`);
1154
+ }
1155
+ current = newCreds;
1156
+ }
1157
+ return current;
1158
+ };
1159
+ }
1160
+ function isV3Provider(x) {
1161
+ return typeof x === "function";
1162
+ }
1163
+ function isV2Credentials(x) {
1164
+ return !!(x && typeof x === "object" && x.getPromise);
1165
+ }
1166
+ function isV3Credentials(x) {
1167
+ return !!(x && typeof x === "object" && x.accessKeyId && !isV2Credentials(x));
1168
+ }
1169
+
1170
+ // lib/api/aws-auth/sdk-provider.ts
1171
+ var CACHED_ACCOUNT = Symbol("cached_account");
1172
+ var SdkProvider = class {
1173
+ /**
1174
+ * Create a new SdkProvider which gets its defaults in a way that behaves like the AWS CLI does
1175
+ *
1176
+ * The AWS SDK for JS behaves slightly differently from the AWS CLI in a number of ways; see the
1177
+ * class `AwsCliCompatible` for the details.
1178
+ */
1179
+ static async withAwsCliCompatibleDefaults(options) {
1180
+ callTrace(SdkProvider.withAwsCliCompatibleDefaults.name, SdkProvider.constructor.name, options.logger);
1181
+ const config = await new AwsCliCompatible(options.ioHelper, options.requestHandler ?? {}, options.logger).baseConfig(options.profile);
1182
+ return new SdkProvider(config.credentialProvider, config.defaultRegion, options);
1183
+ }
1184
+ defaultRegion;
1185
+ defaultCredentialProvider;
1186
+ plugins;
1187
+ requestHandler;
1188
+ ioHelper;
1189
+ logger;
1190
+ constructor(defaultCredentialProvider, defaultRegion, services) {
1191
+ this.defaultCredentialProvider = defaultCredentialProvider;
1192
+ this.defaultRegion = defaultRegion ?? "us-east-1";
1193
+ this.requestHandler = services.requestHandler ?? {};
1194
+ this.ioHelper = services.ioHelper;
1195
+ this.logger = services.logger;
1196
+ this.plugins = new CredentialPlugins(services.pluginHost ?? new PluginHost(), this.ioHelper);
1197
+ }
1198
+ /**
1199
+ * Return an SDK which can do operations in the given environment
1200
+ *
1201
+ * The `environment` parameter is resolved first (see `resolveEnvironment()`).
1202
+ */
1203
+ async forEnvironment(environment, mode, options, quiet = false) {
1204
+ const env = await this.resolveEnvironment(environment);
1205
+ const baseCreds = await this.obtainBaseCredentials(env.account, mode);
1206
+ if (baseCreds.source === "none") {
1207
+ throw new AuthenticationError(fmtObtainCredentialsError(env.account, baseCreds));
1208
+ }
1209
+ if (options?.assumeRoleArn === void 0) {
1210
+ if (baseCreds.source === "incorrectDefault") {
1211
+ throw new AuthenticationError(fmtObtainCredentialsError(env.account, baseCreds));
1212
+ }
1213
+ const sdk = this._makeSdk(baseCreds.credentials, env.region);
1214
+ await sdk.validateCredentials();
1215
+ return { sdk, didAssumeRole: false };
1216
+ }
1217
+ try {
1218
+ const sdk = await this.withAssumedRole(
1219
+ baseCreds,
1220
+ options.assumeRoleArn,
1221
+ options.assumeRoleExternalId,
1222
+ options.assumeRoleAdditionalOptions,
1223
+ env.region
1224
+ );
1225
+ return { sdk, didAssumeRole: true };
1226
+ } catch (err) {
1227
+ if (err.name === "ExpiredToken") {
1228
+ throw err;
1229
+ }
1230
+ if (baseCreds.source === "correctDefault" || baseCreds.source === "plugin") {
1231
+ await this.ioHelper.notify(IO.DEFAULT_SDK_DEBUG.msg(err.message));
1232
+ const maker = quiet ? IO.DEFAULT_SDK_DEBUG : IO.DEFAULT_SDK_WARN;
1233
+ await this.ioHelper.notify(maker.msg(
1234
+ `${fmtObtainedCredentials(baseCreds)} could not be used to assume '${options.assumeRoleArn}', but are for the right account. Proceeding anyway.`
1235
+ ));
1236
+ return {
1237
+ sdk: this._makeSdk(baseCreds.credentials, env.region),
1238
+ didAssumeRole: false
1239
+ };
1240
+ }
1241
+ throw err;
1242
+ }
1243
+ }
1244
+ /**
1245
+ * Return the partition that base credentials are for
1246
+ *
1247
+ * Returns `undefined` if there are no base credentials.
1248
+ */
1249
+ async baseCredentialsPartition(environment, mode) {
1250
+ const env = await this.resolveEnvironment(environment);
1251
+ const baseCreds = await this.obtainBaseCredentials(env.account, mode);
1252
+ if (baseCreds.source === "none") {
1253
+ return void 0;
1254
+ }
1255
+ return (await this._makeSdk(baseCreds.credentials, env.region).currentAccount()).partition;
1256
+ }
1257
+ /**
1258
+ * Resolve the environment for a stack
1259
+ *
1260
+ * Replaces the magic values `UNKNOWN_REGION` and `UNKNOWN_ACCOUNT`
1261
+ * with the defaults for the current SDK configuration (`~/.aws/config` or
1262
+ * otherwise).
1263
+ *
1264
+ * It is an error if `UNKNOWN_ACCOUNT` is used but the user hasn't configured
1265
+ * any SDK credentials.
1266
+ */
1267
+ async resolveEnvironment(env) {
1268
+ const region = env.region !== import_cx_api.UNKNOWN_REGION ? env.region : this.defaultRegion;
1269
+ const account = env.account !== import_cx_api.UNKNOWN_ACCOUNT ? env.account : (await this.defaultAccount())?.accountId;
1270
+ if (!account) {
1271
+ throw new AuthenticationError(
1272
+ "Unable to resolve AWS account to use. It must be either configured when you define your CDK Stack, or through the environment"
1273
+ );
1274
+ }
1275
+ return {
1276
+ region,
1277
+ account,
1278
+ name: import_cx_api.EnvironmentUtils.format(account, region)
1279
+ };
1280
+ }
1281
+ /**
1282
+ * The account we'd auth into if we used default credentials.
1283
+ *
1284
+ * Default credentials are the set of ambiently configured credentials using
1285
+ * one of the environment variables, or ~/.aws/credentials, or the *one*
1286
+ * profile that was passed into the CLI.
1287
+ *
1288
+ * Might return undefined if there are no default/ambient credentials
1289
+ * available (in which case the user should better hope they have
1290
+ * credential plugins configured).
1291
+ *
1292
+ * Uses a cache to avoid STS calls if we don't need 'em.
1293
+ */
1294
+ async defaultAccount() {
1295
+ return cached(this, CACHED_ACCOUNT, async () => {
1296
+ try {
1297
+ return await this._makeSdk(this.defaultCredentialProvider, this.defaultRegion).currentAccount();
1298
+ } catch (e) {
1299
+ if (e.name === "ExpiredToken") {
1300
+ await this.ioHelper.notify(IO.DEFAULT_SDK_WARN.msg(
1301
+ "There are expired AWS credentials in your environment. The CDK app will synth without current account information."
1302
+ ));
1303
+ return void 0;
1304
+ }
1305
+ await this.ioHelper.notify(IO.DEFAULT_SDK_DEBUG.msg(`Unable to determine the default AWS account (${e.name}): ${formatErrorMessage(e)}`));
1306
+ return void 0;
1307
+ }
1308
+ });
1309
+ }
1310
+ /**
1311
+ * Get credentials for the given account ID in the given mode
1312
+ *
1313
+ * 1. Use the default credentials if the destination account matches the
1314
+ * current credentials' account.
1315
+ * 2. Otherwise try all credential plugins.
1316
+ * 3. Fail if neither of these yield any credentials.
1317
+ * 4. Return a failure if any of them returned credentials
1318
+ */
1319
+ async obtainBaseCredentials(accountId, mode) {
1320
+ const defaultAccountId = (await this.defaultAccount())?.accountId;
1321
+ if (defaultAccountId === accountId) {
1322
+ return {
1323
+ source: "correctDefault",
1324
+ credentials: await this.defaultCredentialProvider
1325
+ };
1326
+ }
1327
+ const pluginCreds = await this.plugins.fetchCredentialsFor(accountId, mode);
1328
+ if (pluginCreds) {
1329
+ return { source: "plugin", ...pluginCreds };
1330
+ }
1331
+ if (defaultAccountId !== void 0) {
1332
+ return {
1333
+ source: "incorrectDefault",
1334
+ accountId: defaultAccountId,
1335
+ credentials: await this.defaultCredentialProvider,
1336
+ unusedPlugins: this.plugins.availablePluginNames
1337
+ };
1338
+ }
1339
+ return {
1340
+ source: "none",
1341
+ unusedPlugins: this.plugins.availablePluginNames
1342
+ };
1343
+ }
1344
+ /**
1345
+ * Return an SDK which uses assumed role credentials
1346
+ *
1347
+ * The base credentials used to retrieve the assumed role credentials will be the
1348
+ * same credentials returned by obtainCredentials if an environment and mode is passed,
1349
+ * otherwise it will be the current credentials.
1350
+ */
1351
+ async withAssumedRole(mainCredentials, roleArn, externalId, additionalOptions, region) {
1352
+ await this.ioHelper.notify(IO.DEFAULT_SDK_DEBUG.msg(`Assuming role '${roleArn}'.`));
1353
+ region = region ?? this.defaultRegion;
1354
+ const sourceDescription = fmtObtainedCredentials(mainCredentials);
1355
+ try {
1356
+ const credentials = await makeCachingProvider((0, import_credential_providers2.fromTemporaryCredentials)({
1357
+ masterCredentials: mainCredentials.credentials,
1358
+ params: {
1359
+ RoleArn: roleArn,
1360
+ ExternalId: externalId,
1361
+ RoleSessionName: `aws-cdk-${safeUsername()}`,
1362
+ ...additionalOptions,
1363
+ TransitiveTagKeys: additionalOptions?.Tags ? additionalOptions.Tags.map((t) => t.Key) : void 0
1364
+ },
1365
+ clientConfig: {
1366
+ region,
1367
+ requestHandler: this.requestHandler,
1368
+ customUserAgent: "aws-cdk",
1369
+ logger: this.logger
1370
+ },
1371
+ logger: this.logger
1372
+ }));
1373
+ await credentials();
1374
+ return this._makeSdk(credentials, region);
1375
+ } catch (err) {
1376
+ if (err.name === "ExpiredToken") {
1377
+ throw err;
1378
+ }
1379
+ await this.ioHelper.notify(IO.DEFAULT_SDK_DEBUG.msg(`Assuming role failed: ${err.message}`));
1380
+ throw new AuthenticationError(
1381
+ [
1382
+ "Could not assume role in target account",
1383
+ ...sourceDescription ? [`using ${sourceDescription}`] : [],
1384
+ err.message,
1385
+ ". Please make sure that this role exists in the account. If it doesn't exist, (re)-bootstrap the environment with the right '--trust', using the latest version of the CDK CLI."
1386
+ ].join(" ")
1387
+ );
1388
+ }
1389
+ }
1390
+ /**
1391
+ * Factory function that creates a new SDK instance
1392
+ *
1393
+ * This is a function here, instead of all the places where this is used creating a `new SDK`
1394
+ * instance, so that it is trivial to mock from tests.
1395
+ *
1396
+ * Use like this:
1397
+ *
1398
+ * ```ts
1399
+ * const mockSdk = jest.spyOn(SdkProvider.prototype, '_makeSdk').mockReturnValue(new MockSdk());
1400
+ * // ...
1401
+ * mockSdk.mockRestore();
1402
+ * ```
1403
+ *
1404
+ * @internal
1405
+ */
1406
+ _makeSdk(credProvider, region) {
1407
+ return new SDK(credProvider, region, this.requestHandler, this.ioHelper, this.logger);
1408
+ }
1409
+ };
1410
+ SdkProvider = __decorateClass([
1411
+ traceMemberMethods
1412
+ ], SdkProvider);
1413
+ function safeUsername() {
1414
+ try {
1415
+ return os2.userInfo().username.replace(/[^\w+=,.@-]/g, "@");
1416
+ } catch {
1417
+ return "noname";
1418
+ }
1419
+ }
1420
+ function fmtObtainCredentialsError(targetAccountId, obtainResult) {
1421
+ const msg = [`Need to perform AWS calls for account ${targetAccountId}`];
1422
+ switch (obtainResult.source) {
1423
+ case "incorrectDefault":
1424
+ msg.push(`but the current credentials are for ${obtainResult.accountId}`);
1425
+ break;
1426
+ case "none":
1427
+ msg.push("but no credentials have been configured");
1428
+ }
1429
+ if (obtainResult.unusedPlugins.length > 0) {
1430
+ msg.push(`and none of these plugins found any: ${obtainResult.unusedPlugins.join(", ")}`);
1431
+ }
1432
+ return msg.join(", ");
1433
+ }
1434
+ function fmtObtainedCredentials(obtainResult) {
1435
+ switch (obtainResult.source) {
1436
+ case "correctDefault":
1437
+ return "current credentials";
1438
+ case "plugin":
1439
+ return `credentials returned by plugin '${obtainResult.pluginName}'`;
1440
+ case "incorrectDefault":
1441
+ const msg = [];
1442
+ msg.push(`current credentials (which are for account ${obtainResult.accountId}`);
1443
+ if (obtainResult.unusedPlugins.length > 0) {
1444
+ msg.push(`, and none of the following plugins provided credentials: ${obtainResult.unusedPlugins.join(", ")}`);
1445
+ }
1446
+ msg.push(")");
1447
+ return msg.join("");
1448
+ }
1449
+ }
1450
+ async function initContextProviderSdk(aws, options) {
1451
+ const account = options.account;
1452
+ const region = options.region;
1453
+ const creds = {
1454
+ assumeRoleArn: options.lookupRoleArn,
1455
+ assumeRoleExternalId: options.lookupRoleExternalId,
1456
+ assumeRoleAdditionalOptions: options.assumeRoleAdditionalOptions
1457
+ };
1458
+ return (await aws.forEnvironment(import_cx_api.EnvironmentUtils.make(account, region), 0 /* ForReading */, creds)).sdk;
1459
+ }
1460
+
1461
+ // lib/context-providers/index.ts
1462
+ var cxschema2 = __toESM(require("@aws-cdk/cloud-assembly-schema"));
1463
+ var cxapi2 = __toESM(require("@aws-cdk/cx-api"));
1464
+
1465
+ // lib/context-providers/ami.ts
1466
+ var AmiContextProviderPlugin = class {
1467
+ constructor(aws, io) {
1468
+ this.aws = aws;
1469
+ this.io = io;
1470
+ }
1471
+ async getValue(args) {
1472
+ const region = args.region;
1473
+ const account = args.account;
1474
+ await this.io.info(`Searching for AMI in ${account}:${region}`);
1475
+ await this.io.debug(`AMI search parameters: ${JSON.stringify(args)}`);
1476
+ const ec2 = (await initContextProviderSdk(this.aws, args)).ec2();
1477
+ const response = await ec2.describeImages({
1478
+ Owners: args.owners,
1479
+ Filters: Object.entries(args.filters).map(([key, values]) => ({
1480
+ Name: key,
1481
+ Values: values
1482
+ }))
1483
+ });
1484
+ const images = [...response.Images || []].filter((i) => i.ImageId !== void 0);
1485
+ if (images.length === 0) {
1486
+ throw new ContextProviderError("No AMI found that matched the search criteria");
1487
+ }
1488
+ images.sort(descending((i) => Date.parse(i.CreationDate || "1970")));
1489
+ await this.io.debug(`Selected image '${images[0].ImageId}' created at '${images[0].CreationDate}'`);
1490
+ return images[0].ImageId;
1491
+ }
1492
+ };
1493
+ function descending(valueOf) {
1494
+ return (a, b) => {
1495
+ return valueOf(b) - valueOf(a);
1496
+ };
1497
+ }
1498
+
1499
+ // lib/context-providers/availability-zones.ts
1500
+ var AZContextProviderPlugin = class {
1501
+ constructor(aws, io) {
1502
+ this.aws = aws;
1503
+ this.io = io;
1504
+ }
1505
+ async getValue(args) {
1506
+ const region = args.region;
1507
+ const account = args.account;
1508
+ await this.io.debug(`Reading AZs for ${account}:${region}`);
1509
+ const ec2 = (await initContextProviderSdk(this.aws, args)).ec2();
1510
+ const response = await ec2.describeAvailabilityZones({});
1511
+ if (!response.AvailabilityZones) {
1512
+ return [];
1513
+ }
1514
+ const azs = response.AvailabilityZones.filter((zone) => zone.State === "available").map(
1515
+ (zone) => zone.ZoneName
1516
+ );
1517
+ return azs;
1518
+ }
1519
+ };
1520
+
1521
+ // lib/context-providers/cc-api-provider.ts
1522
+ var import_client_cloudcontrol2 = require("@aws-sdk/client-cloudcontrol");
1523
+ var CcApiContextProviderPlugin = class {
1524
+ constructor(aws) {
1525
+ this.aws = aws;
1526
+ }
1527
+ /**
1528
+ * This returns a data object with the value from CloudControl API result.
1529
+ *
1530
+ * See the documentation in the Cloud Assembly Schema for the semantics of
1531
+ * each query parameter.
1532
+ */
1533
+ async getValue(args) {
1534
+ if (args.exactIdentifier && args.propertyMatch) {
1535
+ throw new ContextProviderError(`Provider protocol error: specify either exactIdentifier or propertyMatch, but not both (got ${JSON.stringify(args)})`);
1536
+ }
1537
+ if (args.ignoreErrorOnMissingContext && args.dummyValue === void 0) {
1538
+ throw new ContextProviderError(`Provider protocol error: if ignoreErrorOnMissingContext is set, a dummyValue must be supplied (got ${JSON.stringify(args)})`);
1539
+ }
1540
+ if (args.dummyValue !== void 0 && (!Array.isArray(args.dummyValue) || !args.dummyValue.every(isObject2))) {
1541
+ throw new ContextProviderError(`Provider protocol error: dummyValue must be an array of objects (got ${JSON.stringify(args.dummyValue)})`);
1542
+ }
1543
+ const cloudControl = (await initContextProviderSdk(this.aws, args)).cloudControl();
1544
+ try {
1545
+ let resources;
1546
+ if (args.exactIdentifier) {
1547
+ resources = await this.getResource(cloudControl, args.typeName, args.exactIdentifier);
1548
+ } else if (args.propertyMatch) {
1549
+ resources = await this.listResources(cloudControl, args.typeName, args.propertyMatch, args.expectedMatchCount);
1550
+ } else {
1551
+ throw new ContextProviderError(`Provider protocol error: neither exactIdentifier nor propertyMatch is specified in ${JSON.stringify(args)}.`);
1552
+ }
1553
+ return resources.map((r) => getResultObj(r.properties, r.identifier, args.propertiesToReturn));
1554
+ } catch (err) {
1555
+ if (err instanceof ZeroResourcesFoundError && args.ignoreErrorOnMissingContext) {
1556
+ return args.dummyValue;
1557
+ }
1558
+ throw err;
1559
+ }
1560
+ }
1561
+ /**
1562
+ * Calls getResource from CC API to get the resource.
1563
+ * See https://docs.aws.amazon.com/cli/latest/reference/cloudcontrol/get-resource.html
1564
+ *
1565
+ * Will always return exactly one resource, or fail.
1566
+ */
1567
+ async getResource(cc, typeName, exactIdentifier) {
1568
+ try {
1569
+ const result2 = await cc.getResource({
1570
+ TypeName: typeName,
1571
+ Identifier: exactIdentifier
1572
+ });
1573
+ if (!result2.ResourceDescription) {
1574
+ throw new ContextProviderError("Unexpected CloudControl API behavior: returned empty response");
1575
+ }
1576
+ return [foundResourceFromCcApi(result2.ResourceDescription)];
1577
+ } catch (err) {
1578
+ if (err instanceof import_client_cloudcontrol2.ResourceNotFoundException || err.name === "ResourceNotFoundException") {
1579
+ throw new ZeroResourcesFoundError(`No resource of type ${typeName} with identifier: ${exactIdentifier}`);
1580
+ }
1581
+ if (!(err instanceof ContextProviderError)) {
1582
+ throw new ContextProviderError(`Encountered CC API error while getting ${typeName} resource ${exactIdentifier}: ${err.message}`);
1583
+ }
1584
+ throw err;
1585
+ }
1586
+ }
1587
+ /**
1588
+ * Calls listResources from CC API to get the resources and apply args.propertyMatch to find the resources.
1589
+ * See https://docs.aws.amazon.com/cli/latest/reference/cloudcontrol/list-resources.html
1590
+ *
1591
+ * Will return 0 or more resources.
1592
+ *
1593
+ * Does not currently paginate through more than one result page.
1594
+ */
1595
+ async listResources(cc, typeName, propertyMatch, expectedMatchCount) {
1596
+ try {
1597
+ const result2 = await cc.listResources({
1598
+ TypeName: typeName
1599
+ });
1600
+ const found = (result2.ResourceDescriptions ?? []).map(foundResourceFromCcApi).filter((r) => {
1601
+ return Object.entries(propertyMatch).every(([propPath, expected]) => {
1602
+ const actual = findJsonValue(r.properties, propPath);
1603
+ return propertyMatchesFilter(actual, expected);
1604
+ });
1605
+ });
1606
+ if ((expectedMatchCount === "at-least-one" || expectedMatchCount === "exactly-one") && found.length === 0) {
1607
+ throw new ZeroResourcesFoundError(`Could not find any resources matching ${JSON.stringify(propertyMatch)}`);
1608
+ }
1609
+ if ((expectedMatchCount === "at-most-one" || expectedMatchCount === "exactly-one") && found.length > 1) {
1610
+ throw new ContextProviderError(`Found ${found.length} resources matching ${JSON.stringify(propertyMatch)}; please narrow the search criteria`);
1611
+ }
1612
+ return found;
1613
+ } catch (err) {
1614
+ if (!(err instanceof ContextProviderError) && !(err instanceof ZeroResourcesFoundError)) {
1615
+ throw new ContextProviderError(`Encountered CC API error while listing ${typeName} resources matching ${JSON.stringify(propertyMatch)}: ${err.message}`);
1616
+ }
1617
+ throw err;
1618
+ }
1619
+ }
1620
+ };
1621
+ function foundResourceFromCcApi(desc) {
1622
+ return {
1623
+ identifier: desc.Identifier ?? "*MISSING*",
1624
+ properties: JSON.parse(desc.Properties ?? "{}")
1625
+ };
1626
+ }
1627
+ function propertyMatchesFilter(actual, expected) {
1628
+ return expected === actual;
1629
+ }
1630
+ function isObject2(x) {
1631
+ return typeof x === "object" && x !== null && !Array.isArray(x);
1632
+ }
1633
+ var ZeroResourcesFoundError = class extends Error {
1634
+ };
1635
+
1636
+ // lib/context-providers/endpoint-service-availability-zones.ts
1637
+ var EndpointServiceAZContextProviderPlugin = class {
1638
+ constructor(aws, io) {
1639
+ this.aws = aws;
1640
+ this.io = io;
1641
+ }
1642
+ async getValue(args) {
1643
+ const region = args.region;
1644
+ const account = args.account;
1645
+ const serviceName = args.serviceName;
1646
+ await this.io.debug(`Reading AZs for ${account}:${region}:${serviceName}`);
1647
+ const ec2 = (await initContextProviderSdk(this.aws, args)).ec2();
1648
+ const response = await ec2.describeVpcEndpointServices({
1649
+ ServiceNames: [serviceName]
1650
+ });
1651
+ if (!response.ServiceDetails || response.ServiceDetails.length === 0) {
1652
+ await this.io.debug(`Could not retrieve service details for ${account}:${region}:${serviceName}`);
1653
+ return [];
1654
+ }
1655
+ const azs = response.ServiceDetails[0].AvailabilityZones;
1656
+ await this.io.debug(`Endpoint service ${account}:${region}:${serviceName} is available in availability zones ${azs}`);
1657
+ return azs;
1658
+ }
1659
+ };
1660
+
1661
+ // lib/context-providers/hosted-zones.ts
1662
+ var HostedZoneContextProviderPlugin = class {
1663
+ constructor(aws, io) {
1664
+ this.aws = aws;
1665
+ this.io = io;
1666
+ }
1667
+ async getValue(args) {
1668
+ const account = args.account;
1669
+ const region = args.region;
1670
+ if (!this.isHostedZoneQuery(args)) {
1671
+ throw new ContextProviderError(`HostedZoneProvider requires domainName property to be set in ${args}`);
1672
+ }
1673
+ const domainName = args.domainName;
1674
+ await this.io.debug(`Reading hosted zone ${account}:${region}:${domainName}`);
1675
+ const r53 = (await initContextProviderSdk(this.aws, args)).route53();
1676
+ const response = await r53.listHostedZonesByName({ DNSName: domainName });
1677
+ if (!response.HostedZones) {
1678
+ throw new ContextProviderError(`Hosted Zone not found in account ${account}, region ${region}: ${domainName}`);
1679
+ }
1680
+ const candidateZones = await this.filterZones(r53, response.HostedZones, args);
1681
+ if (candidateZones.length !== 1) {
1682
+ const filteProps = `dns:${domainName}, privateZone:${args.privateZone}, vpcId:${args.vpcId}`;
1683
+ throw new ContextProviderError(`Found zones: ${JSON.stringify(candidateZones)} for ${filteProps}, but wanted exactly 1 zone`);
1684
+ }
1685
+ return {
1686
+ Id: candidateZones[0].Id,
1687
+ Name: candidateZones[0].Name
1688
+ };
1689
+ }
1690
+ async filterZones(r53, zones, props) {
1691
+ let candidates = [];
1692
+ const domainName = props.domainName.endsWith(".") ? props.domainName : `${props.domainName}.`;
1693
+ await this.io.debug(`Found the following zones ${JSON.stringify(zones)}`);
1694
+ candidates = zones.filter((zone) => zone.Name === domainName);
1695
+ await this.io.debug(`Found the following matched name zones ${JSON.stringify(candidates)}`);
1696
+ if (props.privateZone) {
1697
+ candidates = candidates.filter((zone) => zone.Config && zone.Config.PrivateZone);
1698
+ } else {
1699
+ candidates = candidates.filter((zone) => !zone.Config || !zone.Config.PrivateZone);
1700
+ }
1701
+ if (props.vpcId) {
1702
+ const vpcZones = [];
1703
+ for (const zone of candidates) {
1704
+ const data = await r53.getHostedZone({ Id: zone.Id });
1705
+ if (!data.VPCs) {
1706
+ await this.io.debug(`Expected VPC for private zone but no VPC found ${zone.Id}`);
1707
+ continue;
1708
+ }
1709
+ if (data.VPCs.map((vpc) => vpc.VPCId).includes(props.vpcId)) {
1710
+ vpcZones.push(zone);
1711
+ }
1712
+ }
1713
+ return vpcZones;
1714
+ }
1715
+ return candidates;
1716
+ }
1717
+ isHostedZoneQuery(props) {
1718
+ return props.domainName !== void 0;
1719
+ }
1720
+ };
1721
+
1722
+ // lib/context-providers/keys.ts
1723
+ var KeyContextProviderPlugin = class {
1724
+ constructor(aws, io) {
1725
+ this.aws = aws;
1726
+ this.io = io;
1727
+ }
1728
+ async getValue(args) {
1729
+ const kms = (await initContextProviderSdk(this.aws, args)).kms();
1730
+ const aliasListEntry = await this.findKey(kms, args);
1731
+ return this.readKeyProps(aliasListEntry, args);
1732
+ }
1733
+ // TODO: use paginator function
1734
+ async findKey(kms, args) {
1735
+ await this.io.debug(`Listing keys in ${args.account}:${args.region}`);
1736
+ let response;
1737
+ let nextMarker;
1738
+ do {
1739
+ response = await kms.listAliases({
1740
+ Marker: nextMarker
1741
+ });
1742
+ const aliases = response.Aliases || [];
1743
+ for (const alias of aliases) {
1744
+ if (alias.AliasName == args.aliasName) {
1745
+ return alias;
1746
+ }
1747
+ }
1748
+ nextMarker = response.NextMarker;
1749
+ } while (nextMarker);
1750
+ const suppressError = "ignoreErrorOnMissingContext" in args && args.ignoreErrorOnMissingContext;
1751
+ const hasDummyKeyId = "dummyValue" in args && typeof args.dummyValue === "object" && args.dummyValue !== null && "keyId" in args.dummyValue;
1752
+ if (suppressError && hasDummyKeyId) {
1753
+ const keyId = args.dummyValue.keyId;
1754
+ return { TargetKeyId: keyId };
1755
+ }
1756
+ throw new ContextProviderError(`Could not find any key with alias named ${args.aliasName}`);
1757
+ }
1758
+ async readKeyProps(alias, args) {
1759
+ if (!alias.TargetKeyId) {
1760
+ throw new ContextProviderError(`Could not find any key with alias named ${args.aliasName}`);
1761
+ }
1762
+ await this.io.debug(`Key found ${alias.TargetKeyId}`);
1763
+ return {
1764
+ keyId: alias.TargetKeyId
1765
+ };
1766
+ }
1767
+ };
1768
+
1769
+ // lib/context-providers/load-balancers.ts
1770
+ var import_cx_api2 = require("@aws-cdk/cx-api");
1771
+ var LoadBalancerContextProviderPlugin = class {
1772
+ constructor(aws) {
1773
+ this.aws = aws;
1774
+ }
1775
+ async getValue(query) {
1776
+ if (!query.loadBalancerArn && !query.loadBalancerTags) {
1777
+ throw new ContextProviderError("The load balancer lookup query must specify either `loadBalancerArn` or `loadBalancerTags`");
1778
+ }
1779
+ const loadBalancer = await (await LoadBalancerProvider.getClient(this.aws, query)).getLoadBalancer();
1780
+ const ipAddressType = loadBalancer.IpAddressType === "ipv4" ? import_cx_api2.LoadBalancerIpAddressType.IPV4 : import_cx_api2.LoadBalancerIpAddressType.DUAL_STACK;
1781
+ return {
1782
+ loadBalancerArn: loadBalancer.LoadBalancerArn,
1783
+ loadBalancerCanonicalHostedZoneId: loadBalancer.CanonicalHostedZoneId,
1784
+ loadBalancerDnsName: loadBalancer.DNSName,
1785
+ vpcId: loadBalancer.VpcId,
1786
+ securityGroupIds: loadBalancer.SecurityGroups ?? [],
1787
+ ipAddressType
1788
+ };
1789
+ }
1790
+ };
1791
+ var LoadBalancerListenerContextProviderPlugin = class {
1792
+ constructor(aws) {
1793
+ this.aws = aws;
1794
+ }
1795
+ async getValue(query) {
1796
+ if (!query.listenerArn && !query.loadBalancerArn && !query.loadBalancerTags) {
1797
+ throw new ContextProviderError(
1798
+ "The load balancer listener query must specify at least one of: `listenerArn`, `loadBalancerArn` or `loadBalancerTags`"
1799
+ );
1800
+ }
1801
+ return (await LoadBalancerProvider.getClient(this.aws, query)).getListener();
1802
+ }
1803
+ };
1804
+ var LoadBalancerProvider = class _LoadBalancerProvider {
1805
+ constructor(client, filter, listener) {
1806
+ this.client = client;
1807
+ this.filter = filter;
1808
+ this.listener = listener;
1809
+ }
1810
+ static async getClient(aws, query) {
1811
+ const client = (await initContextProviderSdk(aws, query)).elbv2();
1812
+ try {
1813
+ const listener = query.listenerArn ? (
1814
+ // Assert we're sure there's at least one so it throws if not
1815
+ (await client.describeListeners({ ListenerArns: [query.listenerArn] })).Listeners[0]
1816
+ ) : void 0;
1817
+ return new _LoadBalancerProvider(
1818
+ client,
1819
+ { ...query, loadBalancerArn: listener?.LoadBalancerArn || query.loadBalancerArn },
1820
+ listener
1821
+ );
1822
+ } catch (err) {
1823
+ throw new ContextProviderError(`No load balancer listeners found matching arn ${query.listenerArn}`);
1824
+ }
1825
+ }
1826
+ async getLoadBalancer() {
1827
+ const loadBalancers = await this.getLoadBalancers();
1828
+ if (loadBalancers.length === 0) {
1829
+ throw new ContextProviderError(`No load balancers found matching ${JSON.stringify(this.filter)}`);
1830
+ }
1831
+ if (loadBalancers.length > 1) {
1832
+ throw new ContextProviderError(
1833
+ `Multiple load balancers found matching ${JSON.stringify(this.filter)} - please provide more specific criteria`
1834
+ );
1835
+ }
1836
+ return loadBalancers[0];
1837
+ }
1838
+ async getListener() {
1839
+ if (this.listener) {
1840
+ try {
1841
+ const loadBalancer = await this.getLoadBalancer();
1842
+ return {
1843
+ listenerArn: this.listener.ListenerArn,
1844
+ listenerPort: this.listener.Port,
1845
+ securityGroupIds: loadBalancer.SecurityGroups || []
1846
+ };
1847
+ } catch (err) {
1848
+ throw new ContextProviderError(`No associated load balancer found for listener arn ${this.filter.listenerArn}`);
1849
+ }
1850
+ }
1851
+ const loadBalancers = await this.getLoadBalancers();
1852
+ if (loadBalancers.length === 0) {
1853
+ throw new ContextProviderError(
1854
+ `No associated load balancers found for load balancer listener query ${JSON.stringify(this.filter)}`
1855
+ );
1856
+ }
1857
+ const listeners = (await this.getListenersForLoadBalancers(loadBalancers)).filter((listener) => {
1858
+ return (!this.filter.listenerPort || listener.Port === this.filter.listenerPort) && (!this.filter.listenerProtocol || listener.Protocol === this.filter.listenerProtocol);
1859
+ });
1860
+ if (listeners.length === 0) {
1861
+ throw new ContextProviderError(`No load balancer listeners found matching ${JSON.stringify(this.filter)}`);
1862
+ }
1863
+ if (listeners.length > 1) {
1864
+ throw new ContextProviderError(
1865
+ `Multiple load balancer listeners found matching ${JSON.stringify(this.filter)} - please provide more specific criteria`
1866
+ );
1867
+ }
1868
+ return {
1869
+ listenerArn: listeners[0].ListenerArn,
1870
+ listenerPort: listeners[0].Port,
1871
+ securityGroupIds: loadBalancers.find((lb) => listeners[0].LoadBalancerArn === lb.LoadBalancerArn)?.SecurityGroups || []
1872
+ };
1873
+ }
1874
+ async getLoadBalancers() {
1875
+ const loadBalancerArns = this.filter.loadBalancerArn ? [this.filter.loadBalancerArn] : void 0;
1876
+ const loadBalancers = (await this.client.paginateDescribeLoadBalancers({
1877
+ LoadBalancerArns: loadBalancerArns
1878
+ })).filter((lb) => lb.Type === this.filter.loadBalancerType);
1879
+ return this.filterByTags(loadBalancers);
1880
+ }
1881
+ async filterByTags(loadBalancers) {
1882
+ if (!this.filter.loadBalancerTags) {
1883
+ return loadBalancers;
1884
+ }
1885
+ return (await this.describeTags(loadBalancers.map((lb) => lb.LoadBalancerArn))).filter((tagDescription) => {
1886
+ return this.filter.loadBalancerTags.every((filter) => {
1887
+ return tagDescription.Tags?.some((tag) => filter.key === tag.Key && filter.value === tag.Value);
1888
+ });
1889
+ }).flatMap((tag) => loadBalancers.filter((loadBalancer) => tag.ResourceArn === loadBalancer.LoadBalancerArn));
1890
+ }
1891
+ /**
1892
+ * Returns tag descriptions associated with the resources. The API doesn't support
1893
+ * pagination, so this function breaks the resource list into chunks and issues
1894
+ * the appropriate requests.
1895
+ */
1896
+ async describeTags(resourceArns) {
1897
+ const chunkSize = 20;
1898
+ const tags = Array();
1899
+ for (let i = 0; i < resourceArns.length; i += chunkSize) {
1900
+ const chunk = resourceArns.slice(i, Math.min(i + chunkSize, resourceArns.length));
1901
+ const chunkTags = await this.client.describeTags({
1902
+ ResourceArns: chunk
1903
+ });
1904
+ tags.push(...chunkTags.TagDescriptions || []);
1905
+ }
1906
+ return tags;
1907
+ }
1908
+ async getListenersForLoadBalancers(loadBalancers) {
1909
+ const listeners = [];
1910
+ for (const loadBalancer of loadBalancers.map((lb) => lb.LoadBalancerArn)) {
1911
+ listeners.push(...await this.client.paginateDescribeListeners({ LoadBalancerArn: loadBalancer }));
1912
+ }
1913
+ return listeners;
1914
+ }
1915
+ };
1916
+
1917
+ // lib/context-providers/security-groups.ts
1918
+ var SecurityGroupContextProviderPlugin = class {
1919
+ constructor(aws) {
1920
+ this.aws = aws;
1921
+ }
1922
+ async getValue(args) {
1923
+ if (args.securityGroupId && args.securityGroupName) {
1924
+ throw new ContextProviderError(
1925
+ "'securityGroupId' and 'securityGroupName' can not be specified both when looking up a security group"
1926
+ );
1927
+ }
1928
+ if (!args.securityGroupId && !args.securityGroupName) {
1929
+ throw new ContextProviderError("'securityGroupId' or 'securityGroupName' must be specified to look up a security group");
1930
+ }
1931
+ const ec2 = (await initContextProviderSdk(this.aws, args)).ec2();
1932
+ const filters = [];
1933
+ if (args.vpcId) {
1934
+ filters.push({
1935
+ Name: "vpc-id",
1936
+ Values: [args.vpcId]
1937
+ });
1938
+ }
1939
+ if (args.securityGroupName) {
1940
+ filters.push({
1941
+ Name: "group-name",
1942
+ Values: [args.securityGroupName]
1943
+ });
1944
+ }
1945
+ const response = await ec2.describeSecurityGroups({
1946
+ GroupIds: args.securityGroupId ? [args.securityGroupId] : void 0,
1947
+ Filters: filters.length > 0 ? filters : void 0
1948
+ });
1949
+ const securityGroups = response.SecurityGroups ?? [];
1950
+ if (securityGroups.length === 0) {
1951
+ throw new ContextProviderError(`No security groups found matching ${JSON.stringify(args)}`);
1952
+ }
1953
+ if (securityGroups.length > 1) {
1954
+ throw new ContextProviderError(`More than one security groups found matching ${JSON.stringify(args)}`);
1955
+ }
1956
+ const [securityGroup] = securityGroups;
1957
+ return {
1958
+ securityGroupId: securityGroup.GroupId,
1959
+ allowAllOutbound: hasAllTrafficEgress(securityGroup)
1960
+ };
1961
+ }
1962
+ };
1963
+ function hasAllTrafficEgress(securityGroup) {
1964
+ let hasAllTrafficCidrV4 = false;
1965
+ let hasAllTrafficCidrV6 = false;
1966
+ for (const ipPermission of securityGroup.IpPermissionsEgress ?? []) {
1967
+ const isAllProtocols = ipPermission.IpProtocol === "-1";
1968
+ if (isAllProtocols && ipPermission.IpRanges?.some((m) => m.CidrIp === "0.0.0.0/0")) {
1969
+ hasAllTrafficCidrV4 = true;
1970
+ }
1971
+ if (isAllProtocols && ipPermission.Ipv6Ranges?.some((m) => m.CidrIpv6 === "::/0")) {
1972
+ hasAllTrafficCidrV6 = true;
1973
+ }
1974
+ }
1975
+ return hasAllTrafficCidrV4 && hasAllTrafficCidrV6;
1976
+ }
1977
+
1978
+ // lib/context-providers/ssm-parameters.ts
1979
+ var SSMContextProviderPlugin = class {
1980
+ constructor(aws, io) {
1981
+ this.aws = aws;
1982
+ this.io = io;
1983
+ }
1984
+ async getValue(args) {
1985
+ const region = args.region;
1986
+ const account = args.account;
1987
+ if (!("parameterName" in args)) {
1988
+ throw new ContextProviderError("parameterName must be provided in props for SSMContextProviderPlugin");
1989
+ }
1990
+ const parameterName = args.parameterName;
1991
+ await this.io.debug(`Reading SSM parameter ${account}:${region}:${parameterName}`);
1992
+ const response = await this.getSsmParameterValue(args);
1993
+ const parameterNotFound = !response.Parameter || response.Parameter.Value === void 0;
1994
+ const suppressError = "ignoreErrorOnMissingContext" in args && args.ignoreErrorOnMissingContext;
1995
+ if (parameterNotFound && suppressError && "dummyValue" in args) {
1996
+ return args.dummyValue;
1997
+ }
1998
+ if (parameterNotFound) {
1999
+ throw new ContextProviderError(`SSM parameter not available in account ${account}, region ${region}: ${parameterName}`);
2000
+ }
2001
+ return response.Parameter.Value;
2002
+ }
2003
+ /**
2004
+ * Gets the value of an SSM Parameter, while not throwin if the parameter does not exist.
2005
+ * @param account the account in which the SSM Parameter is expected to be.
2006
+ * @param region the region in which the SSM Parameter is expected to be.
2007
+ * @param parameterName the name of the SSM Parameter
2008
+ * @param lookupRoleArn the ARN of the lookup role.
2009
+ *
2010
+ * @returns the result of the ``GetParameter`` operation.
2011
+ *
2012
+ * @throws Error if a service error (other than ``ParameterNotFound``) occurs.
2013
+ */
2014
+ async getSsmParameterValue(args) {
2015
+ const ssm = (await initContextProviderSdk(this.aws, args)).ssm();
2016
+ try {
2017
+ return await ssm.getParameter({ Name: args.parameterName });
2018
+ } catch (e) {
2019
+ if (e.name === "ParameterNotFound") {
2020
+ return { $metadata: {} };
2021
+ }
2022
+ throw e;
2023
+ }
2024
+ }
2025
+ };
2026
+
2027
+ // lib/context-providers/vpcs.ts
2028
+ var import_cx_api3 = require("@aws-cdk/cx-api");
2029
+ var VpcNetworkContextProviderPlugin = class {
2030
+ constructor(aws, io) {
2031
+ this.aws = aws;
2032
+ this.io = io;
2033
+ }
2034
+ async getValue(args) {
2035
+ const ec2 = (await initContextProviderSdk(this.aws, args)).ec2();
2036
+ const vpcId = await this.findVpc(ec2, args);
2037
+ return this.readVpcProps(ec2, vpcId, args);
2038
+ }
2039
+ async findVpc(ec2, args) {
2040
+ const filters = Object.entries(args.filter).map(([tag, value]) => ({ Name: tag, Values: [value] }));
2041
+ await this.io.debug(`Listing VPCs in ${args.account}:${args.region}`);
2042
+ const response = await ec2.describeVpcs({ Filters: filters });
2043
+ const vpcs = response.Vpcs || [];
2044
+ if (vpcs.length === 0) {
2045
+ throw new ContextProviderError(`Could not find any VPCs matching ${JSON.stringify(args)}`);
2046
+ }
2047
+ if (vpcs.length > 1) {
2048
+ throw new ContextProviderError(`Found ${vpcs.length} VPCs matching ${JSON.stringify(args)}; please narrow the search criteria`);
2049
+ }
2050
+ return vpcs[0];
2051
+ }
2052
+ async readVpcProps(ec2, vpc, args) {
2053
+ const vpcId = vpc.VpcId;
2054
+ await this.io.debug(`Describing VPC ${vpcId}`);
2055
+ const filters = { Filters: [{ Name: "vpc-id", Values: [vpcId] }] };
2056
+ const subnetsResponse = await ec2.describeSubnets(filters);
2057
+ const listedSubnets = subnetsResponse.Subnets || [];
2058
+ const routeTablesResponse = await ec2.describeRouteTables(filters);
2059
+ const routeTables = new RouteTables(routeTablesResponse.RouteTables || []);
2060
+ const azs = Array.from(new Set(listedSubnets.map((s) => s.AvailabilityZone)));
2061
+ azs.sort();
2062
+ const subnets = listedSubnets.map((subnet) => {
2063
+ let type = getTag("aws-cdk:subnet-type", subnet.Tags);
2064
+ if (type === void 0 && subnet.MapPublicIpOnLaunch) {
2065
+ type = "Public" /* Public */;
2066
+ }
2067
+ if (type === void 0 && routeTables.hasRouteToIgw(subnet.SubnetId)) {
2068
+ type = "Public" /* Public */;
2069
+ }
2070
+ if (type === void 0 && routeTables.hasRouteToNatGateway(subnet.SubnetId)) {
2071
+ type = "Private" /* Private */;
2072
+ }
2073
+ if (type === void 0 && routeTables.hasRouteToTransitGateway(subnet.SubnetId)) {
2074
+ type = "Private" /* Private */;
2075
+ }
2076
+ if (type === void 0) {
2077
+ type = "Isolated" /* Isolated */;
2078
+ }
2079
+ if (!isValidSubnetType(type)) {
2080
+ throw new ContextProviderError(
2081
+ `Subnet ${subnet.SubnetArn} has invalid subnet type ${type} (must be ${"Public" /* Public */}, ${"Private" /* Private */} or ${"Isolated" /* Isolated */})`
2082
+ );
2083
+ }
2084
+ if (args.subnetGroupNameTag && !getTag(args.subnetGroupNameTag, subnet.Tags)) {
2085
+ throw new ContextProviderError(
2086
+ `Invalid subnetGroupNameTag: Subnet ${subnet.SubnetArn} does not have an associated tag with Key='${args.subnetGroupNameTag}'`
2087
+ );
2088
+ }
2089
+ const name = getTag(args.subnetGroupNameTag || "aws-cdk:subnet-name", subnet.Tags) || type;
2090
+ const routeTableId = routeTables.routeTableIdForSubnetId(subnet.SubnetId);
2091
+ if (!routeTableId) {
2092
+ throw new ContextProviderError(
2093
+ `Subnet ${subnet.SubnetArn} does not have an associated route table (and there is no "main" table)`
2094
+ );
2095
+ }
2096
+ return {
2097
+ az: subnet.AvailabilityZone,
2098
+ cidr: subnet.CidrBlock,
2099
+ type,
2100
+ name,
2101
+ subnetId: subnet.SubnetId,
2102
+ routeTableId
2103
+ };
2104
+ });
2105
+ let grouped;
2106
+ let assymetricSubnetGroups;
2107
+ if (args.returnAsymmetricSubnets) {
2108
+ grouped = { azs: [], groups: [] };
2109
+ assymetricSubnetGroups = groupAsymmetricSubnets(subnets);
2110
+ } else {
2111
+ grouped = groupSubnets(subnets);
2112
+ assymetricSubnetGroups = void 0;
2113
+ }
2114
+ const vpnGatewayResponse = args.returnVpnGateways ?? true ? await ec2.describeVpnGateways({
2115
+ Filters: [
2116
+ {
2117
+ Name: "attachment.vpc-id",
2118
+ Values: [vpcId]
2119
+ },
2120
+ {
2121
+ Name: "attachment.state",
2122
+ Values: ["attached"]
2123
+ },
2124
+ {
2125
+ Name: "state",
2126
+ Values: ["available"]
2127
+ }
2128
+ ]
2129
+ }) : void 0;
2130
+ const vpnGatewayId = vpnGatewayResponse?.VpnGateways?.length === 1 ? vpnGatewayResponse.VpnGateways[0].VpnGatewayId : void 0;
2131
+ return {
2132
+ vpcId,
2133
+ vpcCidrBlock: vpc.CidrBlock,
2134
+ ownerAccountId: vpc.OwnerId,
2135
+ availabilityZones: grouped.azs,
2136
+ isolatedSubnetIds: collapse(
2137
+ flatMap(findGroups("Isolated" /* Isolated */, grouped), (group) => group.subnets.map((s) => s.subnetId))
2138
+ ),
2139
+ isolatedSubnetNames: collapse(
2140
+ flatMap(findGroups("Isolated" /* Isolated */, grouped), (group) => group.name ? [group.name] : [])
2141
+ ),
2142
+ isolatedSubnetRouteTableIds: collapse(
2143
+ flatMap(findGroups("Isolated" /* Isolated */, grouped), (group) => group.subnets.map((s) => s.routeTableId))
2144
+ ),
2145
+ privateSubnetIds: collapse(
2146
+ flatMap(findGroups("Private" /* Private */, grouped), (group) => group.subnets.map((s) => s.subnetId))
2147
+ ),
2148
+ privateSubnetNames: collapse(
2149
+ flatMap(findGroups("Private" /* Private */, grouped), (group) => group.name ? [group.name] : [])
2150
+ ),
2151
+ privateSubnetRouteTableIds: collapse(
2152
+ flatMap(findGroups("Private" /* Private */, grouped), (group) => group.subnets.map((s) => s.routeTableId))
2153
+ ),
2154
+ publicSubnetIds: collapse(
2155
+ flatMap(findGroups("Public" /* Public */, grouped), (group) => group.subnets.map((s) => s.subnetId))
2156
+ ),
2157
+ publicSubnetNames: collapse(
2158
+ flatMap(findGroups("Public" /* Public */, grouped), (group) => group.name ? [group.name] : [])
2159
+ ),
2160
+ publicSubnetRouteTableIds: collapse(
2161
+ flatMap(findGroups("Public" /* Public */, grouped), (group) => group.subnets.map((s) => s.routeTableId))
2162
+ ),
2163
+ vpnGatewayId,
2164
+ subnetGroups: assymetricSubnetGroups
2165
+ };
2166
+ }
2167
+ };
2168
+ var RouteTables = class {
2169
+ constructor(tables) {
2170
+ this.tables = tables;
2171
+ this.mainRouteTable = this.tables.find(
2172
+ (table) => !!table.Associations && table.Associations.some((assoc) => !!assoc.Main)
2173
+ );
2174
+ }
2175
+ mainRouteTable;
2176
+ routeTableIdForSubnetId(subnetId) {
2177
+ const table = this.tableForSubnet(subnetId);
2178
+ return table && table.RouteTableId || this.mainRouteTable && this.mainRouteTable.RouteTableId;
2179
+ }
2180
+ /**
2181
+ * Whether the given subnet has a route to a NAT Gateway
2182
+ */
2183
+ hasRouteToNatGateway(subnetId) {
2184
+ const table = this.tableForSubnet(subnetId) || this.mainRouteTable;
2185
+ return !!table && !!table.Routes && table.Routes.some((route) => !!route.NatGatewayId && route.DestinationCidrBlock === "0.0.0.0/0");
2186
+ }
2187
+ /**
2188
+ * Whether the given subnet has a route to a Transit Gateway
2189
+ */
2190
+ hasRouteToTransitGateway(subnetId) {
2191
+ const table = this.tableForSubnet(subnetId) || this.mainRouteTable;
2192
+ return !!table && !!table.Routes && table.Routes.some((route) => !!route.TransitGatewayId && route.DestinationCidrBlock === "0.0.0.0/0");
2193
+ }
2194
+ /**
2195
+ * Whether the given subnet has a route to an IGW
2196
+ */
2197
+ hasRouteToIgw(subnetId) {
2198
+ const table = this.tableForSubnet(subnetId) || this.mainRouteTable;
2199
+ return !!table && !!table.Routes && table.Routes.some((route) => !!route.GatewayId && route.GatewayId.startsWith("igw-"));
2200
+ }
2201
+ tableForSubnet(subnetId) {
2202
+ return this.tables.find(
2203
+ (table) => !!table.Associations && table.Associations.some((assoc) => assoc.SubnetId === subnetId)
2204
+ );
2205
+ }
2206
+ };
2207
+ function getTag(name, tags) {
2208
+ for (const tag of tags || []) {
2209
+ if (tag.Key === name) {
2210
+ return tag.Value;
2211
+ }
2212
+ }
2213
+ return void 0;
2214
+ }
2215
+ function groupSubnets(subnets) {
2216
+ const grouping = {};
2217
+ for (const subnet of subnets) {
2218
+ const key = [subnet.type, subnet.name].toString();
2219
+ if (!(key in grouping)) {
2220
+ grouping[key] = [];
2221
+ }
2222
+ grouping[key].push(subnet);
2223
+ }
2224
+ const groups = Object.values(grouping).map((sns) => {
2225
+ sns.sort((a, b) => a.az.localeCompare(b.az));
2226
+ return {
2227
+ type: sns[0].type,
2228
+ name: sns[0].name,
2229
+ subnets: sns
2230
+ };
2231
+ });
2232
+ const azs = groups[0].subnets.map((s) => s.az);
2233
+ for (const group of groups) {
2234
+ const groupAZs = group.subnets.map((s) => s.az);
2235
+ if (!arraysEqual(groupAZs, azs)) {
2236
+ throw new ContextProviderError(`Not all subnets in VPC have the same AZs: ${groupAZs} vs ${azs}`);
2237
+ }
2238
+ }
2239
+ return { azs, groups };
2240
+ }
2241
+ function groupAsymmetricSubnets(subnets) {
2242
+ const grouping = {};
2243
+ for (const subnet of subnets) {
2244
+ const key = [subnet.type, subnet.name].toString();
2245
+ if (!(key in grouping)) {
2246
+ grouping[key] = [];
2247
+ }
2248
+ grouping[key].push(subnet);
2249
+ }
2250
+ return Object.values(grouping).map((subnetArray) => {
2251
+ subnetArray.sort((subnet1, subnet2) => subnet1.az.localeCompare(subnet2.az));
2252
+ return {
2253
+ name: subnetArray[0].name,
2254
+ type: subnetTypeToVpcSubnetType(subnetArray[0].type),
2255
+ subnets: subnetArray.map((subnet) => ({
2256
+ subnetId: subnet.subnetId,
2257
+ cidr: subnet.cidr,
2258
+ availabilityZone: subnet.az,
2259
+ routeTableId: subnet.routeTableId
2260
+ }))
2261
+ };
2262
+ });
2263
+ }
2264
+ function subnetTypeToVpcSubnetType(type) {
2265
+ switch (type) {
2266
+ case "Isolated" /* Isolated */:
2267
+ return import_cx_api3.VpcSubnetGroupType.ISOLATED;
2268
+ case "Private" /* Private */:
2269
+ return import_cx_api3.VpcSubnetGroupType.PRIVATE;
2270
+ case "Public" /* Public */:
2271
+ return import_cx_api3.VpcSubnetGroupType.PUBLIC;
2272
+ }
2273
+ }
2274
+ function isValidSubnetType(val) {
2275
+ return val === "Public" /* Public */ || val === "Private" /* Private */ || val === "Isolated" /* Isolated */;
2276
+ }
2277
+ function arraysEqual(as, bs) {
2278
+ if (as.length !== bs.length) {
2279
+ return false;
2280
+ }
2281
+ for (let i = 0; i < as.length; i++) {
2282
+ if (as[i] !== bs[i]) {
2283
+ return false;
2284
+ }
2285
+ }
2286
+ return true;
2287
+ }
2288
+ function findGroups(type, groups) {
2289
+ return groups.groups.filter((g) => g.type === type);
2290
+ }
2291
+ function flatMap(xs, fn) {
2292
+ const ret = new Array();
2293
+ for (const x of xs) {
2294
+ ret.push(...fn(x));
2295
+ }
2296
+ return ret;
2297
+ }
2298
+ function collapse(xs) {
2299
+ if (xs.length > 0) {
2300
+ return xs;
2301
+ }
2302
+ return void 0;
2303
+ }
2304
+
2305
+ // lib/api/settings.ts
2306
+ var fs5 = __toESM(require("fs-extra"));
2307
+
2308
+ // lib/api/notices.ts
2309
+ var path4 = __toESM(require("path"));
2310
+ var fs7 = __toESM(require("fs-extra"));
2311
+ var semver2 = __toESM(require("semver"));
2312
+
2313
+ // lib/api/tree.ts
2314
+ var fs6 = __toESM(require("fs-extra"));
2315
+
2316
+ // lib/api/notices.ts
2317
+ var CACHE_FILE_PATH = path4.join(cdkCacheDir(), "notices.json");
2318
+ var TIME_TO_LIVE_SUCCESS = 60 * 60 * 1e3;
2319
+ var TIME_TO_LIVE_ERROR = 1 * 60 * 1e3;
2320
+
2321
+ // lib/api/toolkit-info.ts
2322
+ var chalk4 = __toESM(require("chalk"));
2323
+
2324
+ // lib/api/deployments/cfn-api.ts
2325
+ var cxapi = __toESM(require("@aws-cdk/cx-api"));
2326
+ var import_cx_api5 = require("@aws-cdk/cx-api");
2327
+ var import_client_cloudformation3 = require("@aws-sdk/client-cloudformation");
2328
+ var import_cdk_assets2 = require("cdk-assets");
2329
+
2330
+ // lib/api/deployments/asset-manifest-builder.ts
2331
+ var cxschema = __toESM(require("@aws-cdk/cloud-assembly-schema"));
2332
+ var import_cdk_assets = require("cdk-assets");
2333
+
2334
+ // lib/api/cloudformation/template-body-parameter.ts
2335
+ var import_cx_api4 = require("@aws-cdk/cx-api");
2336
+ var import_client_s32 = require("@aws-sdk/client-s3");
2337
+ var import_middleware_endpoint2 = require("@smithy/middleware-endpoint");
2338
+ var chalk3 = __toESM(require("chalk"));
2339
+
2340
+ // lib/api/cloudformation/nested-stack-helpers.ts
2341
+ var fs8 = __toESM(require("fs-extra"));
2342
+
2343
+ // lib/api/stack-events/stack-activity-monitor.ts
2344
+ var uuid = __toESM(require("uuid"));
2345
+
2346
+ // lib/api/stack-events/stack-status.ts
2347
+ var import_client_cloudformation2 = require("@aws-sdk/client-cloudformation");
2348
+
2349
+ // lib/api/environment/placeholders.ts
2350
+ var import_cx_api6 = require("@aws-cdk/cx-api");
2351
+
2352
+ // lib/context-providers/index.ts
2353
+ var availableContextProviders = {
2354
+ [cxschema2.ContextProvider.AVAILABILITY_ZONE_PROVIDER]: (s, io) => new AZContextProviderPlugin(s, io),
2355
+ [cxschema2.ContextProvider.SSM_PARAMETER_PROVIDER]: (s, io) => new SSMContextProviderPlugin(s, io),
2356
+ [cxschema2.ContextProvider.HOSTED_ZONE_PROVIDER]: (s, io) => new HostedZoneContextProviderPlugin(s, io),
2357
+ [cxschema2.ContextProvider.VPC_PROVIDER]: (s, io) => new VpcNetworkContextProviderPlugin(s, io),
2358
+ [cxschema2.ContextProvider.AMI_PROVIDER]: (s, io) => new AmiContextProviderPlugin(s, io),
2359
+ [cxschema2.ContextProvider.ENDPOINT_SERVICE_AVAILABILITY_ZONE_PROVIDER]: (s, io) => new EndpointServiceAZContextProviderPlugin(s, io),
2360
+ [cxschema2.ContextProvider.SECURITY_GROUP_PROVIDER]: (s) => new SecurityGroupContextProviderPlugin(s),
2361
+ [cxschema2.ContextProvider.LOAD_BALANCER_PROVIDER]: (s) => new LoadBalancerContextProviderPlugin(s),
2362
+ [cxschema2.ContextProvider.LOAD_BALANCER_LISTENER_PROVIDER]: (s) => new LoadBalancerListenerContextProviderPlugin(s),
2363
+ [cxschema2.ContextProvider.KEY_PROVIDER]: (s, io) => new KeyContextProviderPlugin(s, io),
2364
+ [cxschema2.ContextProvider.CC_API_PROVIDER]: (s) => new CcApiContextProviderPlugin(s)
2365
+ };
2366
+
2367
+ // lib/api/cloud-assembly/private/stack-assembly.ts
2368
+ var import_semver = require("semver");
2369
+
2370
+ // lib/api/cloud-assembly/stack-assembly.ts
2371
+ var chalk5 = __toESM(require("chalk"));
2372
+ var import_minimatch = require("minimatch");
2373
+
2374
+ // lib/api/cloud-assembly/stack-collection.ts
2375
+ var import_cx_api7 = require("@aws-cdk/cx-api");
2376
+
2377
+ // lib/api/cloud-assembly/private/exec.ts
2378
+ var split = require("split2");
2379
+
2380
+ // lib/api/cloud-assembly/private/prepare-source.ts
2381
+ var cxschema3 = __toESM(require("@aws-cdk/cloud-assembly-schema"));
2382
+ var cxapi4 = __toESM(require("@aws-cdk/cx-api"));
2383
+ var fs10 = __toESM(require("fs-extra"));
2384
+ var import_semver2 = require("semver");
2385
+
2386
+ // lib/api/cloud-assembly/environment.ts
2387
+ var cxapi3 = __toESM(require("@aws-cdk/cx-api"));
2388
+ var fs9 = __toESM(require("fs-extra"));
2389
+
2390
+ // lib/api/cloud-assembly/private/source-builder.ts
2391
+ var cxapi5 = __toESM(require("@aws-cdk/cx-api"));
2392
+ var fs11 = __toESM(require("fs-extra"));
2393
+
2394
+ // lib/api/cloud-assembly/private/stack-selectors.ts
2395
+ var ALL_STACKS = {
2396
+ strategy: "all-stacks" /* ALL_STACKS */
2397
+ };
2398
+
2399
+ // lib/api/io/private/span.ts
2400
+ var util = __toESM(require("node:util"));
2401
+ var uuid2 = __toESM(require("uuid"));
241
2402
  var SpanMaker = class {
242
2403
  definition;
243
2404
  ioHelper;
@@ -246,7 +2407,7 @@ var SpanMaker = class {
246
2407
  this.ioHelper = ioHelper;
247
2408
  }
248
2409
  async begin(a, b) {
249
- const spanId = uuid.v4();
2410
+ const spanId = uuid2.v4();
250
2411
  const startTime = (/* @__PURE__ */ new Date()).getTime();
251
2412
  const notify = (msg) => {
252
2413
  return this.ioHelper.notify(withSpanId(spanId, msg));
@@ -314,7 +2475,7 @@ function withSpanId(span, message2) {
314
2475
  };
315
2476
  }
316
2477
 
317
- // ../tmp-toolkit-helpers/src/api/io/private/io-helper.ts
2478
+ // lib/api/io/private/io-helper.ts
318
2479
  var IoHelper = class _IoHelper {
319
2480
  static fromIoHost(ioHost, action) {
320
2481
  return new _IoHelper(ioHost, action);
@@ -351,7 +2512,7 @@ var IoHelper = class _IoHelper {
351
2512
  }
352
2513
  };
353
2514
 
354
- // ../tmp-toolkit-helpers/src/api/io/private/level-priority.ts
2515
+ // lib/api/io/private/level-priority.ts
355
2516
  var levels = [
356
2517
  "trace",
357
2518
  "debug",
@@ -362,7 +2523,7 @@ var levels = [
362
2523
  ];
363
2524
  var orderedLevels = Object.fromEntries(Object.entries(levels).map((a) => a.reverse()));
364
2525
 
365
- // ../tmp-toolkit-helpers/src/api/io/private/message-maker.ts
2526
+ // lib/api/io/private/message-maker.ts
366
2527
  function message(level, details) {
367
2528
  const maker = (text, data) => ({
368
2529
  time: /* @__PURE__ */ new Date(),
@@ -404,7 +2565,7 @@ var confirm = (details) => request("info", {
404
2565
  defaultResponse: true
405
2566
  });
406
2567
 
407
- // ../tmp-toolkit-helpers/src/api/io/private/messages.ts
2568
+ // lib/api/io/private/messages.ts
408
2569
  var IO = {
409
2570
  // Defaults (0000)
410
2571
  DEFAULT_TOOLKIT_INFO: info({
@@ -925,7 +3086,7 @@ var SPAN = {
925
3086
  }
926
3087
  };
927
3088
 
928
- // ../tmp-toolkit-helpers/src/api/io/private/io-default-messages.ts
3089
+ // lib/api/io/private/io-default-messages.ts
929
3090
  var util2 = __toESM(require("util"));
930
3091
  var IoDefaultMessages = class {
931
3092
  constructor(ioHelper) {
@@ -971,7 +3132,7 @@ var IoDefaultMessages = class {
971
3132
  }
972
3133
  };
973
3134
 
974
- // ../tmp-toolkit-helpers/src/api/plugin/plugin.ts
3135
+ // lib/api/plugin/plugin.ts
975
3136
  var PluginHost = class {
976
3137
  /**
977
3138
  * Access the currently registered CredentialProviderSources. New sources can
@@ -1069,13 +3230,13 @@ var PluginHost = class {
1069
3230
  */
1070
3231
  registerContextProviderAlpha(pluginProviderName, provider) {
1071
3232
  if (!isContextProviderPlugin(provider)) {
1072
- throw new ToolkitError(`Object you gave me does not look like a ContextProviderPlugin: ${(0, import_util2.inspect)(provider)}`);
3233
+ throw new ToolkitError(`Object you gave me does not look like a ContextProviderPlugin: ${(0, import_util27.inspect)(provider)}`);
1073
3234
  }
1074
3235
  this.contextProviderPlugins[pluginProviderName] = provider;
1075
3236
  }
1076
3237
  };
1077
3238
 
1078
- // ../tmp-toolkit-helpers/src/payloads/diff.ts
3239
+ // lib/payloads/diff.ts
1079
3240
  var PermissionChangeType = /* @__PURE__ */ ((PermissionChangeType2) => {
1080
3241
  PermissionChangeType2["NONE"] = "none";
1081
3242
  PermissionChangeType2["BROADENING"] = "broadening";
@@ -1083,7 +3244,7 @@ var PermissionChangeType = /* @__PURE__ */ ((PermissionChangeType2) => {
1083
3244
  return PermissionChangeType2;
1084
3245
  })(PermissionChangeType || {});
1085
3246
 
1086
- // ../tmp-toolkit-helpers/src/payloads/hotswap.ts
3247
+ // lib/payloads/hotswap.ts
1087
3248
  var NonHotswappableReason = /* @__PURE__ */ ((NonHotswappableReason2) => {
1088
3249
  NonHotswappableReason2["TAGS"] = "tags";
1089
3250
  NonHotswappableReason2["PROPERTIES"] = "properties";
@@ -1100,6 +3261,7 @@ var NonHotswappableReason = /* @__PURE__ */ ((NonHotswappableReason2) => {
1100
3261
  0 && (module.exports = {
1101
3262
  AssemblyError,
1102
3263
  AuthenticationError,
3264
+ ContextProviderError,
1103
3265
  ExpandStackSelection,
1104
3266
  NonHotswappableReason,
1105
3267
  PermissionChangeType,