@aws-cdk/toolkit-lib 0.3.2 → 0.3.4

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 (392) hide show
  1. package/api-extractor.json +3 -0
  2. package/build-info.json +2 -2
  3. package/db.json.gz +0 -0
  4. package/lib/actions/bootstrap/index.d.ts +1 -1
  5. package/lib/actions/bootstrap/index.js +5 -5
  6. package/lib/actions/bootstrap/private/helpers.js +3 -3
  7. package/lib/actions/deploy/index.d.ts +1 -1
  8. package/lib/actions/deploy/index.js +1 -1
  9. package/lib/actions/deploy/private/deploy-options.d.ts +1 -1
  10. package/lib/actions/deploy/private/deploy-options.js +1 -1
  11. package/lib/actions/deploy/private/helpers.d.ts +3 -2
  12. package/lib/actions/deploy/private/helpers.js +3 -3
  13. package/lib/actions/diff/index.d.ts +1 -1
  14. package/lib/actions/diff/index.js +1 -1
  15. package/lib/actions/diff/private/helpers.d.ts +5 -9
  16. package/lib/actions/diff/private/helpers.js +13 -30
  17. package/lib/actions/refactor/index.d.ts +12 -0
  18. package/lib/actions/refactor/index.js +1 -1
  19. package/lib/api/aws-auth/account-cache.d.ts +41 -0
  20. package/lib/api/aws-auth/account-cache.js +108 -0
  21. package/lib/api/aws-auth/awscli-compatible.d.ts +70 -0
  22. package/lib/api/aws-auth/awscli-compatible.js +250 -0
  23. package/lib/api/aws-auth/cached.d.ts +11 -0
  24. package/lib/api/aws-auth/cached.js +26 -0
  25. package/lib/api/aws-auth/credential-plugins.d.ts +38 -0
  26. package/lib/api/aws-auth/credential-plugins.js +154 -0
  27. package/lib/api/aws-auth/private/index.d.ts +11 -0
  28. package/lib/api/aws-auth/private/index.js +37 -0
  29. package/lib/api/aws-auth/provider-caching.d.ts +13 -0
  30. package/lib/api/aws-auth/provider-caching.js +24 -0
  31. package/lib/api/aws-auth/proxy-agent.d.ts +13 -0
  32. package/lib/api/aws-auth/proxy-agent.js +54 -0
  33. package/lib/api/aws-auth/sdk-logger.d.ts +69 -0
  34. package/lib/api/aws-auth/sdk-logger.js +128 -0
  35. package/lib/api/aws-auth/sdk-provider.d.ts +195 -0
  36. package/lib/api/aws-auth/sdk-provider.js +373 -0
  37. package/lib/api/aws-auth/sdk.d.ts +235 -0
  38. package/lib/api/aws-auth/sdk.js +391 -0
  39. package/lib/api/aws-auth/tracing.d.ts +11 -0
  40. package/lib/api/aws-auth/tracing.js +60 -0
  41. package/lib/api/aws-auth/user-agent.d.ts +7 -0
  42. package/lib/api/aws-auth/user-agent.js +20 -0
  43. package/lib/api/aws-auth/util.d.ts +6 -0
  44. package/lib/api/aws-auth/util.js +21 -0
  45. package/lib/api/bootstrap/bootstrap-environment.d.ts +35 -0
  46. package/lib/api/bootstrap/bootstrap-environment.js +323 -0
  47. package/lib/api/bootstrap/bootstrap-props.d.ts +130 -0
  48. package/lib/api/bootstrap/bootstrap-props.js +14 -0
  49. package/lib/api/bootstrap/deploy-bootstrap.d.ts +39 -0
  50. package/lib/api/bootstrap/deploy-bootstrap.js +147 -0
  51. package/lib/api/bootstrap/index.d.ts +3 -0
  52. package/lib/api/bootstrap/index.js +23 -0
  53. package/lib/api/bootstrap/legacy-template.d.ts +2 -0
  54. package/lib/api/bootstrap/legacy-template.js +82 -0
  55. package/lib/api/cloud-assembly/environment.d.ts +43 -0
  56. package/lib/api/cloud-assembly/environment.js +127 -0
  57. package/lib/api/cloud-assembly/index.d.ts +1 -1
  58. package/lib/api/cloud-assembly/index.js +5 -4
  59. package/lib/api/cloud-assembly/private/context-aware-source.d.ts +1 -1
  60. package/lib/api/cloud-assembly/private/context-aware-source.js +7 -7
  61. package/lib/api/cloud-assembly/private/exec.js +3 -3
  62. package/lib/api/cloud-assembly/private/prepare-source.d.ts +2 -1
  63. package/lib/api/cloud-assembly/private/prepare-source.js +17 -15
  64. package/lib/api/cloud-assembly/private/readable-assembly.d.ts +1 -1
  65. package/lib/api/cloud-assembly/private/readable-assembly.js +1 -1
  66. package/lib/api/cloud-assembly/private/source-builder.d.ts +10 -8
  67. package/lib/api/cloud-assembly/private/source-builder.js +43 -24
  68. package/lib/api/cloud-assembly/private/stack-assembly.d.ts +2 -1
  69. package/lib/api/cloud-assembly/private/stack-assembly.js +16 -15
  70. package/lib/api/cloud-assembly/source-builder.d.ts +19 -0
  71. package/lib/api/cloud-assembly/source-builder.js +1 -1
  72. package/lib/api/cloud-assembly/stack-assembly.d.ts +55 -0
  73. package/lib/api/cloud-assembly/stack-assembly.js +139 -0
  74. package/lib/api/cloud-assembly/stack-collection.d.ts +27 -0
  75. package/lib/api/cloud-assembly/stack-collection.js +112 -0
  76. package/lib/api/cloud-assembly/stack-selector.d.ts +81 -2
  77. package/lib/api/cloud-assembly/stack-selector.js +62 -5
  78. package/lib/api/cloudformation/evaluate-cloudformation-template.d.ts +85 -0
  79. package/lib/api/cloudformation/evaluate-cloudformation-template.js +456 -0
  80. package/lib/api/cloudformation/index.d.ts +4 -0
  81. package/lib/api/cloudformation/index.js +21 -0
  82. package/lib/api/cloudformation/nested-stack-helpers.d.ts +25 -0
  83. package/lib/api/cloudformation/nested-stack-helpers.js +86 -0
  84. package/lib/api/cloudformation/stack-helpers.d.ts +96 -0
  85. package/lib/api/cloudformation/stack-helpers.js +163 -0
  86. package/lib/api/cloudformation/template-body-parameter.d.ts +22 -0
  87. package/lib/api/cloudformation/template-body-parameter.js +104 -0
  88. package/lib/api/context.d.ts +40 -0
  89. package/lib/api/context.js +84 -0
  90. package/lib/api/deployments/asset-manifest-builder.d.ts +8 -0
  91. package/lib/api/deployments/asset-manifest-builder.js +33 -0
  92. package/lib/api/deployments/asset-publishing.d.ts +60 -0
  93. package/lib/api/deployments/asset-publishing.js +144 -0
  94. package/lib/api/deployments/assets.d.ts +11 -0
  95. package/lib/api/deployments/assets.js +108 -0
  96. package/lib/api/deployments/cfn-api.d.ts +145 -0
  97. package/lib/api/deployments/cfn-api.js +444 -0
  98. package/lib/api/deployments/checks.d.ts +9 -0
  99. package/lib/api/deployments/checks.js +72 -0
  100. package/lib/api/deployments/deploy-stack.d.ts +164 -0
  101. package/lib/api/deployments/deploy-stack.js +490 -0
  102. package/lib/api/deployments/deployment-method.d.ts +24 -0
  103. package/lib/api/deployments/deployment-method.js +3 -0
  104. package/lib/api/deployments/deployment-result.d.ts +21 -0
  105. package/lib/api/deployments/deployment-result.js +10 -0
  106. package/lib/api/deployments/deployments.d.ts +289 -0
  107. package/lib/api/deployments/deployments.js +355 -0
  108. package/lib/api/deployments/index.d.ts +6 -0
  109. package/lib/api/deployments/index.js +27 -0
  110. package/lib/api/diff/diff-formatter.d.ts +147 -0
  111. package/lib/api/diff/diff-formatter.js +225 -0
  112. package/lib/api/diff/index.d.ts +1 -0
  113. package/lib/api/diff/index.js +18 -0
  114. package/lib/api/environment/environment-access.d.ts +139 -0
  115. package/lib/api/environment/environment-access.js +205 -0
  116. package/lib/api/environment/environment-resources.d.ts +75 -0
  117. package/lib/api/environment/environment-resources.js +213 -0
  118. package/lib/api/environment/index.d.ts +3 -0
  119. package/lib/api/environment/index.js +20 -0
  120. package/lib/api/environment/placeholders.d.ts +10 -0
  121. package/lib/api/environment/placeholders.js +23 -0
  122. package/lib/api/garbage-collection/garbage-collector.d.ts +158 -0
  123. package/lib/api/garbage-collection/garbage-collector.js +614 -0
  124. package/lib/api/garbage-collection/index.d.ts +3 -0
  125. package/lib/api/garbage-collection/index.js +21 -0
  126. package/lib/api/garbage-collection/progress-printer.d.ts +23 -0
  127. package/lib/api/garbage-collection/progress-printer.js +80 -0
  128. package/lib/api/garbage-collection/stack-refresh.d.ts +49 -0
  129. package/lib/api/garbage-collection/stack-refresh.js +152 -0
  130. package/lib/api/hotswap/appsync-mapping-templates.d.ts +4 -0
  131. package/lib/api/hotswap/appsync-mapping-templates.js +162 -0
  132. package/lib/api/hotswap/code-build-projects.d.ts +4 -0
  133. package/lib/api/hotswap/code-build-projects.js +62 -0
  134. package/lib/api/hotswap/common.d.ts +89 -0
  135. package/lib/api/hotswap/common.js +137 -0
  136. package/lib/api/hotswap/ecs-services.d.ts +4 -0
  137. package/lib/api/hotswap/ecs-services.js +159 -0
  138. package/lib/api/hotswap/hotswap-deployments.d.ts +17 -0
  139. package/lib/api/hotswap/hotswap-deployments.js +441 -0
  140. package/lib/api/hotswap/index.d.ts +2 -0
  141. package/lib/api/hotswap/index.js +19 -0
  142. package/lib/api/hotswap/lambda-functions.d.ts +4 -0
  143. package/lib/api/hotswap/lambda-functions.js +297 -0
  144. package/lib/api/hotswap/s3-bucket-deployments.d.ts +5 -0
  145. package/lib/api/hotswap/s3-bucket-deployments.js +117 -0
  146. package/lib/api/hotswap/stepfunctions-state-machines.d.ts +4 -0
  147. package/lib/api/hotswap/stepfunctions-state-machines.js +48 -0
  148. package/lib/api/index.d.ts +24 -0
  149. package/lib/api/index.js +41 -0
  150. package/lib/api/io/index.d.ts +3 -1
  151. package/lib/api/io/index.js +18 -1
  152. package/lib/api/io/io-host.d.ts +15 -0
  153. package/lib/api/io/io-host.js +3 -0
  154. package/lib/api/io/io-message.d.ts +76 -0
  155. package/lib/api/io/io-message.js +3 -0
  156. package/lib/api/io/private/index.d.ts +7 -1
  157. package/lib/api/io/private/index.js +8 -5
  158. package/lib/api/io/private/io-default-messages.d.ts +21 -0
  159. package/lib/api/io/private/io-default-messages.js +59 -0
  160. package/lib/api/io/private/io-helper.d.ts +32 -0
  161. package/lib/api/io/private/io-helper.js +51 -0
  162. package/lib/api/io/private/level-priority.d.ts +11 -0
  163. package/lib/api/io/private/level-priority.js +33 -0
  164. package/lib/api/io/private/message-maker.d.ts +89 -0
  165. package/lib/api/io/private/message-maker.js +60 -0
  166. package/lib/api/io/private/messages.d.ts +178 -0
  167. package/lib/api/io/private/messages.js +534 -0
  168. package/lib/api/io/private/sdk-logger.d.ts +1 -1
  169. package/lib/api/io/private/sdk-logger.js +6 -6
  170. package/lib/api/io/private/span.d.ts +93 -0
  171. package/lib/api/io/private/span.js +87 -0
  172. package/lib/api/io/private/testing/fake-io-host.d.ts +28 -0
  173. package/lib/api/io/private/testing/fake-io-host.js +41 -0
  174. package/lib/api/io/private/testing/index.d.ts +2 -0
  175. package/lib/api/io/private/testing/index.js +19 -0
  176. package/lib/api/io/private/testing/test-io-host.d.ts +27 -0
  177. package/lib/api/io/private/testing/test-io-host.js +61 -0
  178. package/lib/api/io/private/types.d.ts +4 -0
  179. package/lib/api/io/private/types.js +3 -0
  180. package/lib/api/io/toolkit-action.d.ts +4 -0
  181. package/lib/api/io/toolkit-action.js +3 -0
  182. package/lib/api/logs-monitor/find-cloudwatch-logs.d.ts +25 -0
  183. package/lib/api/logs-monitor/find-cloudwatch-logs.js +95 -0
  184. package/lib/api/logs-monitor/index.d.ts +2 -0
  185. package/lib/api/logs-monitor/index.js +19 -0
  186. package/lib/api/logs-monitor/logs-monitor.d.ts +76 -0
  187. package/lib/api/logs-monitor/logs-monitor.js +194 -0
  188. package/lib/api/notices/cached-data-source.d.ts +13 -0
  189. package/lib/api/notices/cached-data-source.js +77 -0
  190. package/lib/api/notices/filter.d.ts +59 -0
  191. package/lib/api/notices/filter.js +189 -0
  192. package/lib/api/notices/index.d.ts +1 -0
  193. package/lib/api/notices/index.js +18 -0
  194. package/lib/api/notices/notices.d.ts +111 -0
  195. package/lib/api/notices/notices.js +131 -0
  196. package/lib/api/notices/types.d.ts +37 -0
  197. package/lib/api/notices/types.js +3 -0
  198. package/lib/api/notices/web-data-source.d.ts +9 -0
  199. package/lib/api/notices/web-data-source.js +70 -0
  200. package/lib/api/plugin/context-provider-plugin.d.ts +6 -0
  201. package/lib/api/plugin/context-provider-plugin.js +7 -0
  202. package/lib/api/plugin/index.d.ts +3 -0
  203. package/lib/api/plugin/index.js +20 -0
  204. package/lib/api/plugin/mode.d.ts +4 -0
  205. package/lib/api/plugin/mode.js +9 -0
  206. package/lib/api/plugin/plugin.d.ts +70 -0
  207. package/lib/api/plugin/plugin.js +127 -0
  208. package/lib/api/private.d.ts +1 -0
  209. package/lib/api/private.js +18 -0
  210. package/lib/api/refactoring/cloudformation.d.ts +38 -0
  211. package/lib/api/refactoring/cloudformation.js +56 -0
  212. package/lib/api/refactoring/digest.d.ts +26 -0
  213. package/lib/api/refactoring/digest.js +175 -0
  214. package/lib/api/refactoring/exclude.d.ts +29 -0
  215. package/lib/api/refactoring/exclude.js +94 -0
  216. package/lib/api/refactoring/index.d.ts +32 -0
  217. package/lib/api/refactoring/index.js +191 -0
  218. package/lib/api/require-approval.d.ts +17 -0
  219. package/lib/api/require-approval.js +22 -0
  220. package/lib/api/resource-import/importer.d.ts +216 -0
  221. package/lib/api/resource-import/importer.js +331 -0
  222. package/lib/api/resource-import/index.d.ts +2 -0
  223. package/lib/api/resource-import/index.js +19 -0
  224. package/lib/api/resource-import/migrator.d.ts +26 -0
  225. package/lib/api/resource-import/migrator.js +73 -0
  226. package/lib/api/resource-metadata/index.d.ts +1 -0
  227. package/lib/api/resource-metadata/index.js +18 -0
  228. package/lib/api/resource-metadata/resource-metadata.d.ts +24 -0
  229. package/lib/api/resource-metadata/resource-metadata.js +42 -0
  230. package/lib/api/rwlock.d.ts +60 -0
  231. package/lib/api/rwlock.js +204 -0
  232. package/lib/api/settings.d.ts +26 -0
  233. package/lib/api/settings.js +107 -0
  234. package/lib/api/shared-private.d.ts +8 -6
  235. package/lib/api/shared-private.js +31 -12561
  236. package/lib/api/stack-events/index.d.ts +4 -0
  237. package/lib/api/stack-events/index.js +23 -0
  238. package/lib/api/stack-events/stack-activity-monitor.d.ts +100 -0
  239. package/lib/api/stack-events/stack-activity-monitor.js +164 -0
  240. package/lib/api/stack-events/stack-event-poller.d.ts +69 -0
  241. package/lib/api/stack-events/stack-event-poller.js +130 -0
  242. package/lib/api/stack-events/stack-progress-monitor.d.ts +48 -0
  243. package/lib/api/stack-events/stack-progress-monitor.js +98 -0
  244. package/lib/api/stack-events/stack-status.d.ts +42 -0
  245. package/lib/api/stack-events/stack-status.js +90 -0
  246. package/lib/api/streams.d.ts +7 -0
  247. package/lib/api/streams.js +24 -0
  248. package/lib/api/tags.d.ts +9 -0
  249. package/lib/api/tags.js +10 -0
  250. package/lib/api/toolkit-info.d.ts +52 -0
  251. package/lib/api/toolkit-info.js +157 -0
  252. package/lib/api/tree.d.ts +31 -0
  253. package/lib/api/tree.js +37 -0
  254. package/lib/api/work-graph/index.d.ts +3 -0
  255. package/lib/api/work-graph/index.js +20 -0
  256. package/lib/api/work-graph/work-graph-builder.d.ts +34 -0
  257. package/lib/api/work-graph/work-graph-builder.js +172 -0
  258. package/lib/api/work-graph/work-graph-types.d.ts +50 -0
  259. package/lib/api/work-graph/work-graph-types.js +13 -0
  260. package/lib/api/work-graph/work-graph.d.ts +72 -0
  261. package/lib/api/work-graph/work-graph.js +349 -0
  262. package/lib/context-providers/ami.d.ts +13 -0
  263. package/lib/context-providers/ami.js +52 -0
  264. package/lib/context-providers/availability-zones.d.ts +13 -0
  265. package/lib/context-providers/availability-zones.js +29 -0
  266. package/lib/context-providers/cc-api-provider.d.ts +30 -0
  267. package/lib/context-providers/cc-api-provider.js +145 -0
  268. package/lib/context-providers/endpoint-service-availability-zones.d.ts +13 -0
  269. package/lib/context-providers/endpoint-service-availability-zones.js +35 -0
  270. package/lib/context-providers/hosted-zones.d.ts +12 -0
  271. package/lib/context-providers/hosted-zones.js +69 -0
  272. package/lib/context-providers/index.d.ts +44 -0
  273. package/lib/context-providers/index.js +128 -0
  274. package/lib/context-providers/keys.d.ts +13 -0
  275. package/lib/context-providers/keys.js +54 -0
  276. package/lib/context-providers/load-balancers.d.ts +20 -0
  277. package/lib/context-providers/load-balancers.js +161 -0
  278. package/lib/context-providers/security-groups.d.ts +9 -0
  279. package/lib/context-providers/security-groups.js +69 -0
  280. package/lib/context-providers/ssm-parameters.d.ts +25 -0
  281. package/lib/context-providers/ssm-parameters.js +61 -0
  282. package/lib/context-providers/vpcs.d.ts +13 -0
  283. package/lib/context-providers/vpcs.js +291 -0
  284. package/lib/index.d.ts +4 -1
  285. package/lib/index.js +5 -2
  286. package/lib/index_bg.wasm +0 -0
  287. package/lib/payloads/bootstrap-environment-progress.d.ts +17 -0
  288. package/lib/payloads/bootstrap-environment-progress.js +3 -0
  289. package/lib/payloads/context.d.ts +9 -0
  290. package/lib/payloads/context.js +3 -0
  291. package/lib/payloads/deploy.d.ts +50 -0
  292. package/lib/payloads/deploy.js +3 -0
  293. package/lib/payloads/destroy.d.ts +23 -0
  294. package/lib/payloads/destroy.js +3 -0
  295. package/lib/payloads/diff.d.ts +31 -0
  296. package/lib/payloads/diff.js +22 -0
  297. package/lib/payloads/hotswap.d.ts +212 -0
  298. package/lib/payloads/hotswap.js +43 -0
  299. package/lib/payloads/index.d.ts +17 -0
  300. package/lib/payloads/index.js +34 -0
  301. package/lib/payloads/list.d.ts +4 -0
  302. package/lib/payloads/list.js +3 -0
  303. package/lib/payloads/logs-monitor.d.ts +33 -0
  304. package/lib/payloads/logs-monitor.js +3 -0
  305. package/lib/payloads/progress.d.ts +14 -0
  306. package/lib/payloads/progress.js +3 -0
  307. package/lib/payloads/refactor.d.ts +14 -0
  308. package/lib/payloads/refactor.js +3 -0
  309. package/lib/payloads/rollback.d.ts +17 -0
  310. package/lib/payloads/rollback.js +3 -0
  311. package/lib/payloads/sdk-trace.d.ts +20 -0
  312. package/lib/payloads/sdk-trace.js +3 -0
  313. package/lib/payloads/stack-activity.d.ts +53 -0
  314. package/lib/payloads/stack-activity.js +3 -0
  315. package/lib/payloads/stack-details.d.ts +17 -0
  316. package/lib/payloads/stack-details.js +3 -0
  317. package/lib/payloads/synth.d.ts +7 -0
  318. package/lib/payloads/synth.js +3 -0
  319. package/lib/payloads/types.d.ts +95 -0
  320. package/lib/payloads/types.js +3 -0
  321. package/lib/payloads/watch.d.ts +27 -0
  322. package/lib/payloads/watch.js +3 -0
  323. package/lib/private/activity-printer/base.d.ts +50 -0
  324. package/lib/private/activity-printer/base.js +120 -0
  325. package/lib/private/activity-printer/current.d.ts +26 -0
  326. package/lib/private/activity-printer/current.js +122 -0
  327. package/lib/private/activity-printer/display.d.ts +13 -0
  328. package/lib/private/activity-printer/display.js +81 -0
  329. package/lib/private/activity-printer/history.d.ts +32 -0
  330. package/lib/private/activity-printer/history.js +109 -0
  331. package/lib/private/activity-printer/index.d.ts +3 -0
  332. package/lib/private/activity-printer/index.js +20 -0
  333. package/lib/private/index.d.ts +1 -0
  334. package/lib/private/index.js +18 -0
  335. package/lib/toolkit/non-interactive-io-host.js +5 -4
  336. package/lib/toolkit/private/index.d.ts +2 -1
  337. package/lib/toolkit/private/index.js +1 -1
  338. package/lib/toolkit/toolkit-error.d.ts +86 -0
  339. package/lib/toolkit/toolkit-error.js +132 -0
  340. package/lib/toolkit/toolkit.d.ts +2 -2
  341. package/lib/toolkit/toolkit.js +161 -130
  342. package/lib/toolkit/types.d.ts +0 -55
  343. package/lib/toolkit/types.js +1 -1
  344. package/lib/util/archive.d.ts +1 -0
  345. package/lib/util/archive.js +86 -0
  346. package/lib/util/arrays.d.ts +14 -0
  347. package/lib/util/arrays.js +36 -0
  348. package/lib/util/bool.d.ts +7 -0
  349. package/lib/util/bool.js +13 -0
  350. package/lib/util/bytes.d.ts +8 -0
  351. package/lib/util/bytes.js +21 -0
  352. package/lib/util/cloudformation.d.ts +16 -0
  353. package/lib/util/cloudformation.js +36 -0
  354. package/lib/util/content-hash.d.ts +5 -0
  355. package/lib/util/content-hash.js +43 -0
  356. package/lib/util/directories.d.ts +22 -0
  357. package/lib/util/directories.js +59 -0
  358. package/lib/util/format-error.d.ts +9 -0
  359. package/lib/util/format-error.js +22 -0
  360. package/lib/util/index.d.ts +19 -0
  361. package/lib/util/index.js +36 -0
  362. package/lib/util/json.d.ts +48 -0
  363. package/lib/util/json.js +68 -0
  364. package/lib/util/net.d.ts +9 -0
  365. package/lib/util/net.js +60 -0
  366. package/lib/util/objects.d.ts +65 -0
  367. package/lib/util/objects.js +230 -0
  368. package/lib/util/package-info.d.ts +3 -0
  369. package/lib/util/package-info.js +22 -0
  370. package/lib/util/parallel.d.ts +6 -0
  371. package/lib/util/parallel.js +48 -0
  372. package/lib/util/serialize.d.ts +27 -0
  373. package/lib/util/serialize.js +86 -0
  374. package/lib/util/string-manipulation.d.ts +18 -0
  375. package/lib/util/string-manipulation.js +46 -0
  376. package/lib/util/type-brands.d.ts +39 -0
  377. package/lib/util/type-brands.js +39 -0
  378. package/lib/util/types.d.ts +27 -0
  379. package/lib/util/types.js +25 -0
  380. package/lib/util/version-range.d.ts +2 -0
  381. package/lib/util/version-range.js +36 -0
  382. package/lib/util/yaml-cfn.d.ts +15 -0
  383. package/lib/util/yaml-cfn.js +58 -0
  384. package/package.json +26 -28
  385. package/tsdoc.json +15 -0
  386. package/lib/api/shared-private.js.map +0 -7
  387. package/lib/api/shared-public.d.ts +0 -2159
  388. package/lib/api/shared-public.js +0 -1110
  389. package/lib/api/shared-public.js.map +0 -7
  390. package/lib/private/util.d.ts +0 -1
  391. package/lib/private/util.js +0 -787
  392. package/lib/private/util.js.map +0 -7
@@ -0,0 +1,349 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WorkGraph = void 0;
4
+ const work_graph_types_1 = require("./work-graph-types");
5
+ const toolkit_error_1 = require("../../toolkit/toolkit-error");
6
+ const util_1 = require("../../util");
7
+ const private_1 = require("../io/private");
8
+ class WorkGraph {
9
+ nodes;
10
+ readyPool = [];
11
+ lazyDependencies = new Map();
12
+ ioHelper;
13
+ error;
14
+ constructor(nodes, ioHelper) {
15
+ this.nodes = { ...nodes };
16
+ this.ioHelper = ioHelper;
17
+ }
18
+ addNodes(...nodes) {
19
+ for (const node of nodes) {
20
+ if (this.nodes[node.id]) {
21
+ throw new toolkit_error_1.ToolkitError(`Duplicate use of node id: ${node.id}`);
22
+ }
23
+ const ld = this.lazyDependencies.get(node.id);
24
+ if (ld) {
25
+ for (const x of ld) {
26
+ node.dependencies.add(x);
27
+ }
28
+ this.lazyDependencies.delete(node.id);
29
+ }
30
+ this.nodes[node.id] = node;
31
+ }
32
+ }
33
+ removeNode(nodeId) {
34
+ const id = typeof nodeId === 'string' ? nodeId : nodeId.id;
35
+ const removedNode = this.nodes[id];
36
+ this.lazyDependencies.delete(id);
37
+ delete this.nodes[id];
38
+ if (removedNode) {
39
+ for (const node of Object.values(this.nodes)) {
40
+ node.dependencies.delete(removedNode.id);
41
+ }
42
+ }
43
+ }
44
+ /**
45
+ * Return all nodes of a given type
46
+ */
47
+ nodesOfType(type) {
48
+ return Object.values(this.nodes).filter(n => n.type === type);
49
+ }
50
+ /**
51
+ * Return all nodes that depend on a given node
52
+ */
53
+ dependees(nodeId) {
54
+ const id = typeof nodeId === 'string' ? nodeId : nodeId.id;
55
+ return Object.values(this.nodes).filter(n => n.dependencies.has(id));
56
+ }
57
+ /**
58
+ * Add a dependency, that may come before or after the nodes involved
59
+ */
60
+ addDependency(fromId, toId) {
61
+ const node = this.nodes[fromId];
62
+ if (node) {
63
+ node.dependencies.add(toId);
64
+ return;
65
+ }
66
+ let lazyDeps = this.lazyDependencies.get(fromId);
67
+ if (!lazyDeps) {
68
+ lazyDeps = [];
69
+ this.lazyDependencies.set(fromId, lazyDeps);
70
+ }
71
+ lazyDeps.push(toId);
72
+ }
73
+ tryGetNode(id) {
74
+ return this.nodes[id];
75
+ }
76
+ node(id) {
77
+ const ret = this.nodes[id];
78
+ if (!ret) {
79
+ throw new toolkit_error_1.ToolkitError(`No node with id ${id} among ${Object.keys(this.nodes)}`);
80
+ }
81
+ return ret;
82
+ }
83
+ absorb(graph) {
84
+ this.addNodes(...Object.values(graph.nodes));
85
+ }
86
+ hasFailed() {
87
+ return Object.values(this.nodes).some((n) => n.deploymentState === work_graph_types_1.DeploymentState.FAILED);
88
+ }
89
+ doParallel(concurrency, actions) {
90
+ return this.forAllArtifacts(concurrency, async (x) => {
91
+ switch (x.type) {
92
+ case 'stack':
93
+ await actions.deployStack(x);
94
+ break;
95
+ case 'asset-build':
96
+ await actions.buildAsset(x);
97
+ break;
98
+ case 'asset-publish':
99
+ await actions.publishAsset(x);
100
+ break;
101
+ }
102
+ });
103
+ }
104
+ /**
105
+ * Return the set of unblocked nodes
106
+ */
107
+ async ready() {
108
+ await this.updateReadyPool();
109
+ return this.readyPool;
110
+ }
111
+ forAllArtifacts(n, fn) {
112
+ const graph = this;
113
+ // If 'n' is a number, we limit all concurrency equally (effectively we will be using totalMax)
114
+ // If 'n' is a record, we limit each job independently (effectively we will be using max)
115
+ const max = typeof n === 'number' ?
116
+ {
117
+ 'asset-build': n,
118
+ 'asset-publish': n,
119
+ 'stack': n,
120
+ } : n;
121
+ const totalMax = typeof n === 'number' ? n : sum(Object.values(n));
122
+ return new Promise((ok, fail) => {
123
+ let active = {
124
+ 'asset-build': 0,
125
+ 'asset-publish': 0,
126
+ 'stack': 0,
127
+ };
128
+ function totalActive() {
129
+ return sum(Object.values(active));
130
+ }
131
+ start();
132
+ function start() {
133
+ graph.updateReadyPool().then(() => {
134
+ for (let i = 0; i < graph.readyPool.length;) {
135
+ const node = graph.readyPool[i];
136
+ if (active[node.type] < max[node.type] && totalActive() < totalMax) {
137
+ graph.readyPool.splice(i, 1);
138
+ startOne(node);
139
+ }
140
+ else {
141
+ i += 1;
142
+ }
143
+ }
144
+ if (totalActive() === 0) {
145
+ if (graph.done()) {
146
+ ok();
147
+ }
148
+ // wait for other active deploys to finish before failing
149
+ if (graph.hasFailed()) {
150
+ fail(graph.error);
151
+ }
152
+ }
153
+ }).catch((e) => {
154
+ fail(e);
155
+ });
156
+ }
157
+ function startOne(x) {
158
+ x.deploymentState = work_graph_types_1.DeploymentState.DEPLOYING;
159
+ active[x.type]++;
160
+ void fn(x)
161
+ .finally(() => {
162
+ active[x.type]--;
163
+ })
164
+ .then(() => {
165
+ graph.deployed(x);
166
+ start();
167
+ }).catch((err) => {
168
+ // By recording the failure immediately as the queued task exits, we prevent the next
169
+ // queued task from starting.
170
+ graph.failed(x, err);
171
+ start();
172
+ });
173
+ }
174
+ });
175
+ }
176
+ done() {
177
+ return Object.values(this.nodes).every((n) => work_graph_types_1.DeploymentState.COMPLETED === n.deploymentState);
178
+ }
179
+ deployed(node) {
180
+ node.deploymentState = work_graph_types_1.DeploymentState.COMPLETED;
181
+ }
182
+ failed(node, error) {
183
+ this.error = error;
184
+ node.deploymentState = work_graph_types_1.DeploymentState.FAILED;
185
+ this.skipRest();
186
+ this.readyPool.splice(0);
187
+ }
188
+ toString() {
189
+ return [
190
+ 'digraph D {',
191
+ ...Object.entries(this.nodes).flatMap(([id, node]) => renderNode(id, node)),
192
+ '}',
193
+ ].join('\n');
194
+ function renderNode(id, node) {
195
+ const ret = [];
196
+ if (node.deploymentState === work_graph_types_1.DeploymentState.COMPLETED) {
197
+ ret.push(` ${gv(id, { style: 'filled', fillcolor: 'yellow', comment: node.note })};`);
198
+ }
199
+ else {
200
+ ret.push(` ${gv(id, { comment: node.note })};`);
201
+ }
202
+ for (const dep of node.dependencies) {
203
+ ret.push(` ${gv(id)} -> ${gv(dep)};`);
204
+ }
205
+ return ret;
206
+ }
207
+ }
208
+ /**
209
+ * Ensure all dependencies actually exist. This protects against scenarios such as the following:
210
+ * StackA depends on StackB, but StackB is not selected to deploy. The dependency is redundant
211
+ * and will be dropped.
212
+ * This assumes the manifest comes uncorrupted so we will not fail if a dependency is not found.
213
+ */
214
+ removeUnavailableDependencies() {
215
+ for (const node of Object.values(this.nodes)) {
216
+ const removeDeps = Array.from(node.dependencies).filter((dep) => this.nodes[dep] === undefined);
217
+ removeDeps.forEach((d) => {
218
+ node.dependencies.delete(d);
219
+ });
220
+ }
221
+ }
222
+ /**
223
+ * Remove all asset publishing steps for assets that are already published, and then build
224
+ * that aren't used anymore.
225
+ *
226
+ * Do this in parallel, because there may be a lot of assets in an application (seen in practice: >100 assets)
227
+ */
228
+ async removeUnnecessaryAssets(isUnnecessary) {
229
+ await this.ioHelper.notify(private_1.IO.DEFAULT_TOOLKIT_DEBUG.msg('Checking for previously published assets'));
230
+ const publishes = this.nodesOfType('asset-publish');
231
+ const classifiedNodes = await (0, util_1.parallelPromises)(8, publishes.map((assetNode) => async () => [assetNode, await isUnnecessary(assetNode)]));
232
+ const alreadyPublished = classifiedNodes.filter(([_, unnecessary]) => unnecessary).map(([assetNode, _]) => assetNode);
233
+ for (const assetNode of alreadyPublished) {
234
+ this.removeNode(assetNode);
235
+ }
236
+ await this.ioHelper.notify(private_1.IO.DEFAULT_TOOLKIT_DEBUG.msg(`${publishes.length} total assets, ${publishes.length - alreadyPublished.length} still need to be published`));
237
+ // Now also remove any asset build steps that don't have any dependencies on them anymore
238
+ const unusedBuilds = this.nodesOfType('asset-build').filter(build => this.dependees(build).length === 0);
239
+ for (const unusedBuild of unusedBuilds) {
240
+ this.removeNode(unusedBuild);
241
+ }
242
+ }
243
+ async updateReadyPool() {
244
+ const activeCount = Object.values(this.nodes).filter((x) => x.deploymentState === work_graph_types_1.DeploymentState.DEPLOYING).length;
245
+ const pendingCount = Object.values(this.nodes).filter((x) => x.deploymentState === work_graph_types_1.DeploymentState.PENDING).length;
246
+ const newlyReady = Object.values(this.nodes).filter((x) => x.deploymentState === work_graph_types_1.DeploymentState.PENDING &&
247
+ Array.from(x.dependencies).every((id) => this.node(id).deploymentState === work_graph_types_1.DeploymentState.COMPLETED));
248
+ // Add newly available nodes to the ready pool
249
+ for (const node of newlyReady) {
250
+ node.deploymentState = work_graph_types_1.DeploymentState.QUEUED;
251
+ this.readyPool.push(node);
252
+ }
253
+ // Remove nodes from the ready pool that have already started deploying
254
+ retainOnly(this.readyPool, (node) => node.deploymentState === work_graph_types_1.DeploymentState.QUEUED);
255
+ // Sort by reverse priority
256
+ this.readyPool.sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0));
257
+ if (this.readyPool.length === 0 && activeCount === 0 && pendingCount > 0) {
258
+ const cycle = this.findCycle() ?? ['No cycle found!'];
259
+ await this.ioHelper.notify(private_1.IO.DEFAULT_TOOLKIT_TRACE.msg(`Cycle ${cycle.join(' -> ')} in graph ${this}`));
260
+ throw new toolkit_error_1.ToolkitError(`Unable to make progress anymore, dependency cycle between remaining artifacts: ${cycle.join(' -> ')} (run with -vv for full graph)`);
261
+ }
262
+ }
263
+ skipRest() {
264
+ for (const node of Object.values(this.nodes)) {
265
+ if ([work_graph_types_1.DeploymentState.QUEUED, work_graph_types_1.DeploymentState.PENDING].includes(node.deploymentState)) {
266
+ node.deploymentState = work_graph_types_1.DeploymentState.SKIPPED;
267
+ }
268
+ }
269
+ }
270
+ /**
271
+ * Find cycles in a graph
272
+ *
273
+ * Not the fastest, but effective and should be rare
274
+ */
275
+ findCycle() {
276
+ const seen = new Set();
277
+ const self = this;
278
+ for (const nodeId of Object.keys(this.nodes)) {
279
+ const cycle = recurse(nodeId, [nodeId]);
280
+ if (cycle) {
281
+ return cycle;
282
+ }
283
+ }
284
+ return undefined;
285
+ function recurse(nodeId, path) {
286
+ if (seen.has(nodeId)) {
287
+ return undefined;
288
+ }
289
+ try {
290
+ for (const dep of self.nodes[nodeId].dependencies ?? []) {
291
+ const index = path.indexOf(dep);
292
+ if (index > -1) {
293
+ return [...path.slice(index), dep];
294
+ }
295
+ const cycle = recurse(dep, [...path, dep]);
296
+ if (cycle) {
297
+ return cycle;
298
+ }
299
+ }
300
+ return undefined;
301
+ }
302
+ finally {
303
+ seen.add(nodeId);
304
+ }
305
+ }
306
+ }
307
+ /**
308
+ * Whether the `end` node is reachable from the `start` node, following the dependency arrows
309
+ */
310
+ reachable(start, end) {
311
+ const seen = new Set();
312
+ const self = this;
313
+ return recurse(start);
314
+ function recurse(current) {
315
+ if (seen.has(current)) {
316
+ return false;
317
+ }
318
+ seen.add(current);
319
+ if (current === end) {
320
+ return true;
321
+ }
322
+ for (const dep of self.nodes[current].dependencies) {
323
+ if (recurse(dep)) {
324
+ return true;
325
+ }
326
+ }
327
+ return false;
328
+ }
329
+ }
330
+ }
331
+ exports.WorkGraph = WorkGraph;
332
+ function sum(xs) {
333
+ let ret = 0;
334
+ for (const x of xs) {
335
+ ret += x;
336
+ }
337
+ return ret;
338
+ }
339
+ function retainOnly(xs, pred) {
340
+ xs.splice(0, xs.length, ...xs.filter(pred));
341
+ }
342
+ function gv(id, attrs) {
343
+ const attrString = Object.entries(attrs ?? {}).flatMap(([k, v]) => v !== undefined ? [`${k}="${v}"`] : []).join(',');
344
+ return attrString ? `"${simplifyId(id)}" [${attrString}]` : `"${simplifyId(id)}"`;
345
+ }
346
+ function simplifyId(id) {
347
+ return id.replace(/([0-9a-f]{6})[0-9a-f]{6,}/g, '$1');
348
+ }
349
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29yay1ncmFwaC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIndvcmstZ3JhcGgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EseURBQXFEO0FBQ3JELCtEQUEyRDtBQUMzRCxxQ0FBOEM7QUFDOUMsMkNBQWtEO0FBR2xELE1BQWEsU0FBUztJQUNKLEtBQUssQ0FBMkI7SUFDL0IsU0FBUyxHQUFvQixFQUFFLENBQUM7SUFDaEMsZ0JBQWdCLEdBQUcsSUFBSSxHQUFHLEVBQW9CLENBQUM7SUFDL0MsUUFBUSxDQUFXO0lBRTdCLEtBQUssQ0FBUztJQUVyQixZQUFtQixLQUErQixFQUFFLFFBQWtCO1FBQ3BFLElBQUksQ0FBQyxLQUFLLEdBQUcsRUFBRSxHQUFHLEtBQUssRUFBRSxDQUFDO1FBQzFCLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO0lBQzNCLENBQUM7SUFFTSxRQUFRLENBQUMsR0FBRyxLQUFpQjtRQUNsQyxLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ3pCLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztnQkFDeEIsTUFBTSxJQUFJLDRCQUFZLENBQUMsNkJBQTZCLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ2pFLENBQUM7WUFFRCxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUM5QyxJQUFJLEVBQUUsRUFBRSxDQUFDO2dCQUNQLEtBQUssTUFBTSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUM7b0JBQ25CLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUMzQixDQUFDO2dCQUNELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3hDLENBQUM7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LENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDOUMsQ0FBQztBQUVELFNBQVMsRUFBRSxDQUFDLEVBQVUsRUFBRSxLQUEwQztJQUNoRSxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFFckgsT0FBTyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksVUFBVSxDQUFDLEVBQUUsQ0FBQyxNQUFNLFVBQVUsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDO0FBQ3BGLENBQUM7QUFFRCxTQUFTLFVBQVUsQ0FBQyxFQUFVO0lBQzVCLE9BQU8sRUFBRSxDQUFDLE9BQU8sQ0FBQyw0QkFBNEIsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUN4RCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBXb3JrTm9kZSwgU3RhY2tOb2RlLCBBc3NldEJ1aWxkTm9kZSwgQXNzZXRQdWJsaXNoTm9kZSB9IGZyb20gJy4vd29yay1ncmFwaC10eXBlcyc7XG5pbXBvcnQgeyBEZXBsb3ltZW50U3RhdGUgfSBmcm9tICcuL3dvcmstZ3JhcGgtdHlwZXMnO1xuaW1wb3J0IHsgVG9vbGtpdEVycm9yIH0gZnJvbSAnLi4vLi4vdG9vbGtpdC90b29sa2l0LWVycm9yJztcbmltcG9ydCB7IHBhcmFsbGVsUHJvbWlzZXMgfSBmcm9tICcuLi8uLi91dGlsJztcbmltcG9ydCB7IElPLCB0eXBlIElvSGVscGVyIH0gZnJvbSAnLi4vaW8vcHJpdmF0ZSc7XG5leHBvcnQgdHlwZSBDb25jdXJyZW5jeSA9IG51bWJlciB8IFJlY29yZDxXb3JrTm9kZVsndHlwZSddLCBudW1iZXI+O1xuXG5leHBvcnQgY2xhc3MgV29ya0dyYXBoIHtcbiAgcHVibGljIHJlYWRvbmx5IG5vZGVzOiBSZWNvcmQ8c3RyaW5nLCBXb3JrTm9kZT47XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVhZHlQb29sOiBBcnJheTxXb3JrTm9kZT4gPSBbXTtcbiAgcHJpdmF0ZSByZWFkb25seSBsYXp5RGVwZW5kZW5jaWVzID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZ1tdPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IGlvSGVscGVyOiBJb0hlbHBlcjtcblxuICBwdWJsaWMgZXJyb3I/OiBFcnJvcjtcblxuICBwdWJsaWMgY29uc3RydWN0b3Iobm9kZXM6IFJlY29yZDxzdHJpbmcsIFdvcmtOb2RlPiwgaW9IZWxwZXI6IElvSGVscGVyKSB7XG4gICAgdGhpcy5ub2RlcyA9IHsgLi4ubm9kZXMgfTtcbiAgICB0aGlzLmlvSGVscGVyID0gaW9IZWxwZXI7XG4gIH1cblxuICBwdWJsaWMgYWRkTm9kZXMoLi4ubm9kZXM6IFdvcmtOb2RlW10pIHtcbiAgICBmb3IgKGNvbnN0IG5vZGUgb2Ygbm9kZXMpIHtcbiAgICAgIGlmICh0aGlzLm5vZGVzW25vZGUuaWRdKSB7XG4gICAgICAgIHRocm93IG5ldyBUb29sa2l0RXJyb3IoYER1cGxpY2F0ZSB1c2Ugb2Ygbm9kZSBpZDogJHtub2RlLmlkfWApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBsZCA9IHRoaXMubGF6eURlcGVuZGVuY2llcy5nZXQobm9kZS5pZCk7XG4gICAgICBpZiAobGQpIHtcbiAgICAgICAgZm9yIChjb25zdCB4IG9mIGxkKSB7XG4gICAgICAgICAgbm9kZS5kZXBlbmRlbmNpZXMuYWRkKHgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubGF6eURlcGVuZGVuY2llcy5kZWxldGUobm9kZS5pZCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMubm9kZXNbbm9kZS5pZF0gPSBub2RlO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyByZW1vdmVOb2RlKG5vZGVJZDogc3RyaW5nIHwgV29ya05vZGUpIHtcbiAgICBjb25zdCBpZCA9IHR5cGVvZiBub2RlSWQgPT09ICdzdHJpbmcnID8gbm9kZUlkIDogbm9kZUlkLmlkO1xuICAgIGNvbnN0IHJlbW92ZWROb2RlID0gdGhpcy5ub2Rlc1tpZF07XG5cbiAgICB0aGlzLmxhenlEZXBlbmRlbmNpZXMuZGVsZXRlKGlkKTtcbiAgICBkZWxldGUgdGhpcy5ub2Rlc1tpZF07XG5cbiAgICBpZiAocmVtb3ZlZE5vZGUpIHtcbiAgICAgIGZvciAoY29uc3Qgbm9kZSBvZiBPYmplY3QudmFsdWVzKHRoaXMubm9kZXMpKSB7XG4gICAgICAgIG5vZGUuZGVwZW5kZW5jaWVzLmRlbGV0ZShyZW1vdmVkTm9kZS5pZCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBhbGwgbm9kZXMgb2YgYSBnaXZlbiB0eXBlXG4gICAqL1xuICBwdWJsaWMgbm9kZXNPZlR5cGU8VCBleHRlbmRzIFdvcmtOb2RlWyd0eXBlJ10+KHR5cGU6IFQpOiBFeHRyYWN0PFdvcmtOb2RlLCB7IHR5cGU6IFQgfT5bXSB7XG4gICAgcmV0dXJuIE9iamVjdC52YWx1ZXModGhpcy5ub2RlcykuZmlsdGVyKG4gPT4gbi50eXBlID09PSB0eXBlKSBhcyBhbnk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGFsbCBub2RlcyB0aGF0IGRlcGVuZCBvbiBhIGdpdmVuIG5vZGVcbiAgICovXG4gIHB1YmxpYyBkZXBlbmRlZXMobm9kZUlkOiBzdHJpbmcgfCBXb3JrTm9kZSkge1xuICAgIGNvbnN0IGlkID0gdHlwZW9mIG5vZGVJZCA9PT0gJ3N0cmluZycgPyBub2RlSWQgOiBub2RlSWQuaWQ7XG4gICAgcmV0dXJuIE9iamVjdC52YWx1ZXModGhpcy5ub2RlcykuZmlsdGVyKG4gPT4gbi5kZXBlbmRlbmNpZXMuaGFzKGlkKSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgZGVwZW5kZW5jeSwgdGhhdCBtYXkgY29tZSBiZWZvcmUgb3IgYWZ0ZXIgdGhlIG5vZGVzIGludm9sdmVkXG4gICAqL1xuICBwdWJsaWMgYWRkRGVwZW5kZW5jeShmcm9tSWQ6IHN0cmluZywgdG9JZDogc3RyaW5nKSB7XG4gICAgY29uc3Qgbm9kZSA9IHRoaXMubm9kZXNbZnJvbUlkXTtcbiAgICBpZiAobm9kZSkge1xuICAgICAgbm9kZS5kZXBlbmRlbmNpZXMuYWRkKHRvSWQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsZXQgbGF6eURlcHMgPSB0aGlzLmxhenlEZXBlbmRlbmNpZXMuZ2V0KGZyb21JZCk7XG4gICAgaWYgKCFsYXp5RGVwcykge1xuICAgICAgbGF6eURlcHMgPSBbXTtcbiAgICAgIHRoaXMubGF6eURlcGVuZGVuY2llcy5zZXQoZnJvbUlkLCBsYXp5RGVwcyk7XG4gICAgfVxuICAgIGxhenlEZXBzLnB1c2godG9JZCk7XG4gIH1cblxuICBwdWJsaWMgdHJ5R2V0Tm9kZShpZDogc3RyaW5nKTogV29ya05vZGUgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLm5vZGVzW2lkXTtcbiAgfVxuXG4gIHB1YmxpYyBub2RlKGlkOiBzdHJpbmcpIHtcbiAgICBjb25zdCByZXQgPSB0aGlzLm5vZGVzW2lkXTtcbiAgICBpZiAoIXJldCkge1xuICAgICAgdGhyb3cgbmV3IFRvb2xraXRFcnJvcihgTm8gbm9kZSB3aXRoIGlkICR7aWR9IGFtb25nICR7T2JqZWN0LmtleXModGhpcy5ub2Rlcyl9YCk7XG4gICAgfVxuICAgIHJldHVybiByZXQ7XG4gIH1cblxuICBwdWJsaWMgYWJzb3JiKGdyYXBoOiBXb3JrR3JhcGgpIHtcbiAgICB0aGlzLmFkZE5vZGVzKC4uLk9iamVjdC52YWx1ZXMoZ3JhcGgubm9kZXMpKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFzRmFpbGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBPYmplY3QudmFsdWVzKHRoaXMubm9kZXMpLnNvbWUoKG4pID0+IG4uZGVwbG95bWVudFN0YXRlID09PSBEZXBsb3ltZW50U3RhdGUuRkFJTEVEKTtcbiAgfVxuXG4gIHB1YmxpYyBkb1BhcmFsbGVsKGNvbmN1cnJlbmN5OiBDb25jdXJyZW5jeSwgYWN0aW9uczogV29ya0dyYXBoQWN0aW9ucykge1xuICAgIHJldHVybiB0aGlzLmZvckFsbEFydGlmYWN0cyhjb25jdXJyZW5jeSwgYXN5bmMgKHg6IFdvcmtOb2RlKSA9PiB7XG4gICAgICBzd2l0Y2ggKHgudHlwZSkge1xuICAgICAgICBjYXNlICdzdGFjayc6XG4gICAgICAgICAgYXdhaXQgYWN0aW9ucy5kZXBsb3lTdGFjayh4KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnYXNzZXQtYnVpbGQnOlxuICAgICAgICAgIGF3YWl0IGFjdGlvbnMuYnVpbGRBc3NldCh4KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnYXNzZXQtcHVibGlzaCc6XG4gICAgICAgICAgYXdhaXQgYWN0aW9ucy5wdWJsaXNoQXNzZXQoeCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHRoZSBzZXQgb2YgdW5ibG9ja2VkIG5vZGVzXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcmVhZHkoKTogUHJvbWlzZTxSZWFkb25seUFycmF5PFdvcmtOb2RlPj4ge1xuICAgIGF3YWl0IHRoaXMudXBkYXRlUmVhZHlQb29sKCk7XG4gICAgcmV0dXJuIHRoaXMucmVhZHlQb29sO1xuICB9XG5cbiAgcHJpdmF0ZSBmb3JBbGxBcnRpZmFjdHMobjogQ29uY3VycmVuY3ksIGZuOiAoeDogV29ya05vZGUpID0+IFByb21pc2U8dm9pZD4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBncmFwaCA9IHRoaXM7XG5cbiAgICAvLyBJZiAnbicgaXMgYSBudW1iZXIsIHdlIGxpbWl0IGFsbCBjb25jdXJyZW5jeSBlcXVhbGx5IChlZmZlY3RpdmVseSB3ZSB3aWxsIGJlIHVzaW5nIHRvdGFsTWF4KVxuICAgIC8vIElmICduJyBpcyBhIHJlY29yZCwgd2UgbGltaXQgZWFjaCBqb2IgaW5kZXBlbmRlbnRseSAoZWZmZWN0aXZlbHkgd2Ugd2lsbCBiZSB1c2luZyBtYXgpXG4gICAgY29uc3QgbWF4OiBSZWNvcmQ8V29ya05vZGVbJ3R5cGUnXSwgbnVtYmVyPiA9IHR5cGVvZiBuID09PSAnbnVtYmVyJyA/XG4gICAgICB7XG4gICAgICAgICdhc3NldC1idWlsZCc6IG4sXG4gICAgICAgICdhc3NldC1wdWJsaXNoJzogbixcbiAgICAgICAgJ3N0YWNrJzogbixcbiAgICAgIH0gOiBuO1xuICAgIGNvbnN0IHRvdGFsTWF4ID0gdHlwZW9mIG4gPT09ICdudW1iZXInID8gbiA6IHN1bShPYmplY3QudmFsdWVzKG4pKTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgob2ssIGZhaWwpID0+IHtcbiAgICAgIGxldCBhY3RpdmU6IFJlY29yZDxXb3JrTm9kZVsndHlwZSddLCBudW1iZXI+ID0ge1xuICAgICAgICAnYXNzZXQtYnVpbGQnOiAwLFxuICAgICAgICAnYXNzZXQtcHVibGlzaCc6IDAsXG4gICAgICAgICdzdGFjayc6IDAsXG4gICAgICB9O1xuICAgICAgZnVuY3Rpb24gdG90YWxBY3RpdmUoKSB7XG4gICAgICAgIHJldHVybiBzdW0oT2JqZWN0LnZhbHVlcyhhY3RpdmUpKTtcbiAgICAgIH1cblxuICAgICAgc3RhcnQoKTtcblxuICAgICAgZnVuY3Rpb24gc3RhcnQoKSB7XG4gICAgICAgIGdyYXBoLnVwZGF0ZVJlYWR5UG9vbCgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZ3JhcGgucmVhZHlQb29sLmxlbmd0aDsgKSB7XG4gICAgICAgICAgICBjb25zdCBub2RlID0gZ3JhcGgucmVhZHlQb29sW2ldO1xuXG4gICAgICAgICAgICBpZiAoYWN0aXZlW25vZGUudHlwZV0gPCBtYXhbbm9kZS50eXBlXSAmJiB0b3RhbEFjdGl2ZSgpIDwgdG90YWxNYXgpIHtcbiAgICAgICAgICAgICAgZ3JhcGgucmVhZHlQb29sLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgICAgc3RhcnRPbmUobm9kZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBpICs9IDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHRvdGFsQWN0aXZlKCkgPT09IDApIHtcbiAgICAgICAgICAgIGlmIChncmFwaC5kb25lKCkpIHtcbiAgICAgICAgICAgICAgb2soKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIHdhaXQgZm9yIG90aGVyIGFjdGl2ZSBkZXBsb3lzIHRvIGZpbmlzaCBiZWZvcmUgZmFpbGluZ1xuICAgICAgICAgICAgaWYgKGdyYXBoLmhhc0ZhaWxlZCgpKSB7XG4gICAgICAgICAgICAgIGZhaWwoZ3JhcGguZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSkuY2F0Y2goKGUpID0+IHtcbiAgICAgICAgICBmYWlsKGUpO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gc3RhcnRPbmUoeDogV29ya05vZGUpIHtcbiAgICAgICAgeC5kZXBsb3ltZW50U3RhdGUgPSBEZXBsb3ltZW50U3RhdGUuREVQTE9ZSU5HO1xuICAgICAgICBhY3RpdmVbeC50eXBlXSsrO1xuICAgICAgICB2b2lkIGZuKHgpXG4gICAgICAgICAgLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgICAgICAgYWN0aXZlW3gudHlwZV0tLTtcbiAgICAgICAgICB9KVxuICAgICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIGdyYXBoLmRlcGxveWVkKHgpO1xuICAgICAgICAgICAgc3RhcnQoKTtcbiAgICAgICAgICB9KS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgICAgICAvLyBCeSByZWNvcmRpbmcgdGhlIGZhaWx1cmUgaW1tZWRpYXRlbHkgYXMgdGhlIHF1ZXVlZCB0YXNrIGV4aXRzLCB3ZSBwcmV2ZW50IHRoZSBuZXh0XG4gICAgICAgICAgICAvLyBxdWV1ZWQgdGFzayBmcm9tIHN0YXJ0aW5nLlxuICAgICAgICAgICAgZ3JhcGguZmFpbGVkKHgsIGVycik7XG4gICAgICAgICAgICBzdGFydCgpO1xuICAgICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBkb25lKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBPYmplY3QudmFsdWVzKHRoaXMubm9kZXMpLmV2ZXJ5KChuKSA9PiBEZXBsb3ltZW50U3RhdGUuQ09NUExFVEVEID09PSBuLmRlcGxveW1lbnRTdGF0ZSk7XG4gIH1cblxuICBwcml2YXRlIGRlcGxveWVkKG5vZGU6IFdvcmtOb2RlKSB7XG4gICAgbm9kZS5kZXBsb3ltZW50U3RhdGUgPSBEZXBsb3ltZW50U3RhdGUuQ09NUExFVEVEO1xuICB9XG5cbiAgcHJpdmF0ZSBmYWlsZWQobm9kZTogV29ya05vZGUsIGVycm9yPzogRXJyb3IpIHtcbiAgICB0aGlzLmVycm9yID0gZXJyb3I7XG4gICAgbm9kZS5kZXBsb3ltZW50U3RhdGUgPSBEZXBsb3ltZW50U3RhdGUuRkFJTEVEO1xuICAgIHRoaXMuc2tpcFJlc3QoKTtcbiAgICB0aGlzLnJlYWR5UG9vbC5zcGxpY2UoMCk7XG4gIH1cblxuICBwdWJsaWMgdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgICdkaWdyYXBoIEQgeycsXG4gICAgICAuLi5PYmplY3QuZW50cmllcyh0aGlzLm5vZGVzKS5mbGF0TWFwKChbaWQsIG5vZGVdKSA9PiByZW5kZXJOb2RlKGlkLCBub2RlKSksXG4gICAgICAnfScsXG4gICAgXS5qb2luKCdcXG4nKTtcblxuICAgIGZ1bmN0aW9uIHJlbmRlck5vZGUoaWQ6IHN0cmluZywgbm9kZTogV29ya05vZGUpOiBzdHJpbmdbXSB7XG4gICAgICBjb25zdCByZXQgPSBbXTtcbiAgICAgIGlmIChub2RlLmRlcGxveW1lbnRTdGF0ZSA9PT0gRGVwbG95bWVudFN0YXRlLkNPTVBMRVRFRCkge1xuICAgICAgICByZXQucHVzaChgICAke2d2KGlkLCB7IHN0eWxlOiAnZmlsbGVkJywgZmlsbGNvbG9yOiAneWVsbG93JywgY29tbWVudDogbm9kZS5ub3RlIH0pfTtgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldC5wdXNoKGAgICR7Z3YoaWQsIHsgY29tbWVudDogbm9kZS5ub3RlIH0pfTtgKTtcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3QgZGVwIG9mIG5vZGUuZGVwZW5kZW5jaWVzKSB7XG4gICAgICAgIHJldC5wdXNoKGAgICR7Z3YoaWQpfSAtPiAke2d2KGRlcCl9O2ApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJldDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRW5zdXJlIGFsbCBkZXBlbmRlbmNpZXMgYWN0dWFsbHkgZXhpc3QuIFRoaXMgcHJvdGVjdHMgYWdhaW5zdCBzY2VuYXJpb3Mgc3VjaCBhcyB0aGUgZm9sbG93aW5nOlxuICAgKiBTdGFja0EgZGVwZW5kcyBvbiBTdGFja0IsIGJ1dCBTdGFja0IgaXMgbm90IHNlbGVjdGVkIHRvIGRlcGxveS4gVGhlIGRlcGVuZGVuY3kgaXMgcmVkdW5kYW50XG4gICAqIGFuZCB3aWxsIGJlIGRyb3BwZWQuXG4gICAqIFRoaXMgYXNzdW1lcyB0aGUgbWFuaWZlc3QgY29tZXMgdW5jb3JydXB0ZWQgc28gd2Ugd2lsbCBub3QgZmFpbCBpZiBhIGRlcGVuZGVuY3kgaXMgbm90IGZvdW5kLlxuICAgKi9cbiAgcHVibGljIHJlbW92ZVVuYXZhaWxhYmxlRGVwZW5kZW5jaWVzKCkge1xuICAgIGZvciAoY29uc3Qgbm9kZSBvZiBPYmplY3QudmFsdWVzKHRoaXMubm9kZXMpKSB7XG4gICAgICBjb25zdCByZW1vdmVEZXBzID0gQXJyYXkuZnJvbShub2RlLmRlcGVuZGVuY2llcykuZmlsdGVyKChkZXApID0+IHRoaXMubm9kZXNbZGVwXSA9PT0gdW5kZWZpbmVkKTtcblxuICAgICAgcmVtb3ZlRGVwcy5mb3JFYWNoKChkKSA9PiB7XG4gICAgICAgIG5vZGUuZGVwZW5kZW5jaWVzLmRlbGV0ZShkKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgYWxsIGFzc2V0IHB1Ymxpc2hpbmcgc3RlcHMgZm9yIGFzc2V0cyB0aGF0IGFyZSBhbHJlYWR5IHB1Ymxpc2hlZCwgYW5kIHRoZW4gYnVpbGRcbiAgICogdGhhdCBhcmVuJ3QgdXNlZCBhbnltb3JlLlxuICAgKlxuICAgKiBEbyB0aGlzIGluIHBhcmFsbGVsLCBiZWNhdXNlIHRoZXJlIG1heSBiZSBhIGxvdCBvZiBhc3NldHMgaW4gYW4gYXBwbGljYXRpb24gKHNlZW4gaW4gcHJhY3RpY2U6ID4xMDAgYXNzZXRzKVxuICAgKi9cbiAgcHVibGljIGFzeW5jIHJlbW92ZVVubmVjZXNzYXJ5QXNzZXRzKGlzVW5uZWNlc3Nhcnk6ICh4OiBBc3NldFB1Ymxpc2hOb2RlKSA9PiBQcm9taXNlPGJvb2xlYW4+KSB7XG4gICAgYXdhaXQgdGhpcy5pb0hlbHBlci5ub3RpZnkoSU8uREVGQVVMVF9UT09MS0lUX0RFQlVHLm1zZygnQ2hlY2tpbmcgZm9yIHByZXZpb3VzbHkgcHVibGlzaGVkIGFzc2V0cycpKTtcblxuICAgIGNvbnN0IHB1Ymxpc2hlcyA9IHRoaXMubm9kZXNPZlR5cGUoJ2Fzc2V0LXB1Ymxpc2gnKTtcblxuICAgIGNvbnN0IGNsYXNzaWZpZWROb2RlcyA9IGF3YWl0IHBhcmFsbGVsUHJvbWlzZXMoXG4gICAgICA4LFxuICAgICAgcHVibGlzaGVzLm1hcCgoYXNzZXROb2RlKSA9PiBhc3luYygpID0+IFthc3NldE5vZGUsIGF3YWl0IGlzVW5uZWNlc3NhcnkoYXNzZXROb2RlKV0gYXMgY29uc3QpKTtcblxuICAgIGNvbnN0IGFscmVhZHlQdWJsaXNoZWQgPSBjbGFzc2lmaWVkTm9kZXMuZmlsdGVyKChbXywgdW5uZWNlc3NhcnldKSA9PiB1bm5lY2Vzc2FyeSkubWFwKChbYXNzZXROb2RlLCBfXSkgPT4gYXNzZXROb2RlKTtcbiAgICBmb3IgKGNvbnN0IGFzc2V0Tm9kZSBvZiBhbHJlYWR5UHVibGlzaGVkKSB7XG4gICAgICB0aGlzLnJlbW92ZU5vZGUoYXNzZXROb2RlKTtcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLmlvSGVscGVyLm5vdGlmeShJTy5ERUZBVUxUX1RPT0xLSVRfREVCVUcubXNnKGAke3B1Ymxpc2hlcy5sZW5ndGh9IHRvdGFsIGFzc2V0cywgJHtwdWJsaXNoZXMubGVuZ3RoIC0gYWxyZWFkeVB1Ymxpc2hlZC5sZW5ndGh9IHN0aWxsIG5lZWQgdG8gYmUgcHVibGlzaGVkYCkpO1xuXG4gICAgLy8gTm93IGFsc28gcmVtb3ZlIGFueSBhc3NldCBidWlsZCBzdGVwcyB0aGF0IGRvbid0IGhhdmUgYW55IGRlcGVuZGVuY2llcyBvbiB0aGVtIGFueW1vcmVcbiAgICBjb25zdCB1bnVzZWRCdWlsZHMgPSB0aGlzLm5vZGVzT2ZUeXBlKCdhc3NldC1idWlsZCcpLmZpbHRlcihidWlsZCA9PiB0aGlzLmRlcGVuZGVlcyhidWlsZCkubGVuZ3RoID09PSAwKTtcbiAgICBmb3IgKGNvbnN0IHVudXNlZEJ1aWxkIG9mIHVudXNlZEJ1aWxkcykge1xuICAgICAgdGhpcy5yZW1vdmVOb2RlKHVudXNlZEJ1aWxkKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHVwZGF0ZVJlYWR5UG9vbCgpIHtcbiAgICBjb25zdCBhY3RpdmVDb3VudCA9IE9iamVjdC52YWx1ZXModGhpcy5ub2RlcykuZmlsdGVyKCh4KSA9PiB4LmRlcGxveW1lbnRTdGF0ZSA9PT0gRGVwbG95bWVudFN0YXRlLkRFUExPWUlORykubGVuZ3RoO1xuICAgIGNvbnN0IHBlbmRpbmdDb3VudCA9IE9iamVjdC52YWx1ZXModGhpcy5ub2RlcykuZmlsdGVyKCh4KSA9PiB4LmRlcGxveW1lbnRTdGF0ZSA9PT0gRGVwbG95bWVudFN0YXRlLlBFTkRJTkcpLmxlbmd0aDtcblxuICAgIGNvbnN0IG5ld2x5UmVhZHkgPSBPYmplY3QudmFsdWVzKHRoaXMubm9kZXMpLmZpbHRlcigoeCkgPT5cbiAgICAgIHguZGVwbG95bWVudFN0YXRlID09PSBEZXBsb3ltZW50U3RhdGUuUEVORElORyAmJlxuICAgICAgQXJyYXkuZnJvbSh4LmRlcGVuZGVuY2llcykuZXZlcnkoKGlkKSA9PiB0aGlzLm5vZGUoaWQpLmRlcGxveW1lbnRTdGF0ZSA9PT0gRGVwbG95bWVudFN0YXRlLkNPTVBMRVRFRCkpO1xuXG4gICAgLy8gQWRkIG5ld2x5IGF2YWlsYWJsZSBub2RlcyB0byB0aGUgcmVhZHkgcG9vbFxuICAgIGZvciAoY29uc3Qgbm9kZSBvZiBuZXdseVJlYWR5KSB7XG4gICAgICBub2RlLmRlcGxveW1lbnRTdGF0ZSA9IERlcGxveW1lbnRTdGF0ZS5RVUVVRUQ7XG4gICAgICB0aGlzLnJlYWR5UG9vbC5wdXNoKG5vZGUpO1xuICAgIH1cblxuICAgIC8vIFJlbW92ZSBub2RlcyBmcm9tIHRoZSByZWFkeSBwb29sIHRoYXQgaGF2ZSBhbHJlYWR5IHN0YXJ0ZWQgZGVwbG95aW5nXG4gICAgcmV0YWluT25seSh0aGlzLnJlYWR5UG9vbCwgKG5vZGUpID0+IG5vZGUuZGVwbG95bWVudFN0YXRlID09PSBEZXBsb3ltZW50U3RhdGUuUVVFVUVEKTtcblxuICAgIC8vIFNvcnQgYnkgcmV2ZXJzZSBwcmlvcml0eVxuICAgIHRoaXMucmVhZHlQb29sLnNvcnQoKGEsIGIpID0+IChiLnByaW9yaXR5ID8/IDApIC0gKGEucHJpb3JpdHkgPz8gMCkpO1xuXG4gICAgaWYgKHRoaXMucmVhZHlQb29sLmxlbmd0aCA9PT0gMCAmJiBhY3RpdmVDb3VudCA9PT0gMCAmJiBwZW5kaW5nQ291bnQgPiAwKSB7XG4gICAgICBjb25zdCBjeWNsZSA9IHRoaXMuZmluZEN5Y2xlKCkgPz8gWydObyBjeWNsZSBmb3VuZCEnXTtcbiAgICAgIGF3YWl0IHRoaXMuaW9IZWxwZXIubm90aWZ5KElPLkRFRkFVTFRfVE9PTEtJVF9UUkFDRS5tc2coYEN5Y2xlICR7Y3ljbGUuam9pbignIC0+ICcpfSBpbiBncmFwaCAke3RoaXN9YCkpO1xuICAgICAgdGhyb3cgbmV3IFRvb2xraXRFcnJvcihgVW5hYmxlIHRvIG1ha2UgcHJvZ3Jlc3MgYW55bW9yZSwgZGVwZW5kZW5jeSBjeWNsZSBiZXR3ZWVuIHJlbWFpbmluZyBhcnRpZmFjdHM6ICR7Y3ljbGUuam9pbignIC0+ICcpfSAocnVuIHdpdGggLXZ2IGZvciBmdWxsIGdyYXBoKWApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2tpcFJlc3QoKSB7XG4gICAgZm9yIChjb25zdCBub2RlIG9mIE9iamVjdC52YWx1ZXModGhpcy5ub2RlcykpIHtcbiAgICAgIGlmIChbRGVwbG95bWVudFN0YXRlLlFVRVVFRCwgRGVwbG95bWVudFN0YXRlLlBFTkRJTkddLmluY2x1ZGVzKG5vZGUuZGVwbG95bWVudFN0YXRlKSkge1xuICAgICAgICBub2RlLmRlcGxveW1lbnRTdGF0ZSA9IERlcGxveW1lbnRTdGF0ZS5TS0lQUEVEO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIGN5Y2xlcyBpbiBhIGdyYXBoXG4gICAqXG4gICAqIE5vdCB0aGUgZmFzdGVzdCwgYnV0IGVmZmVjdGl2ZSBhbmQgc2hvdWxkIGJlIHJhcmVcbiAgICovXG4gIHB1YmxpYyBmaW5kQ3ljbGUoKTogc3RyaW5nW10gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHNlZW4gPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICBmb3IgKGNvbnN0IG5vZGVJZCBvZiBPYmplY3Qua2V5cyh0aGlzLm5vZGVzKSkge1xuICAgICAgY29uc3QgY3ljbGUgPSByZWN1cnNlKG5vZGVJZCwgW25vZGVJZF0pO1xuICAgICAgaWYgKGN5Y2xlKSB7XG4gICAgICAgIHJldHVybiBjeWNsZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgIGZ1bmN0aW9uIHJlY3Vyc2Uobm9kZUlkOiBzdHJpbmcsIHBhdGg6IHN0cmluZ1tdKTogc3RyaW5nW10gfCB1bmRlZmluZWQge1xuICAgICAgaWYgKHNlZW4uaGFzKG5vZGVJZCkpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIHRyeSB7XG4gICAgICAgIGZvciAoY29uc3QgZGVwIG9mIHNlbGYubm9kZXNbbm9kZUlkXS5kZXBlbmRlbmNpZXMgPz8gW10pIHtcbiAgICAgICAgICBjb25zdCBpbmRleCA9IHBhdGguaW5kZXhPZihkZXApO1xuICAgICAgICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICAgICAgICByZXR1cm4gWy4uLnBhdGguc2xpY2UoaW5kZXgpLCBkZXBdO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGN5Y2xlID0gcmVjdXJzZShkZXAsIFsuLi5wYXRoLCBkZXBdKTtcbiAgICAgICAgICBpZiAoY3ljbGUpIHtcbiAgICAgICAgICAgIHJldHVybiBjeWNsZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgc2Vlbi5hZGQobm9kZUlkKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciB0aGUgYGVuZGAgbm9kZSBpcyByZWFjaGFibGUgZnJvbSB0aGUgYHN0YXJ0YCBub2RlLCBmb2xsb3dpbmcgdGhlIGRlcGVuZGVuY3kgYXJyb3dzXG4gICAqL1xuICBwdWJsaWMgcmVhY2hhYmxlKHN0YXJ0OiBzdHJpbmcsIGVuZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIHJldHVybiByZWN1cnNlKHN0YXJ0KTtcblxuICAgIGZ1bmN0aW9uIHJlY3Vyc2UoY3VycmVudDogc3RyaW5nKSB7XG4gICAgICBpZiAoc2Vlbi5oYXMoY3VycmVudCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgc2Vlbi5hZGQoY3VycmVudCk7XG5cbiAgICAgIGlmIChjdXJyZW50ID09PSBlbmQpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IGRlcCBvZiBzZWxmLm5vZGVzW2N1cnJlbnRdLmRlcGVuZGVuY2llcykge1xuICAgICAgICBpZiAocmVjdXJzZShkZXApKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBXb3JrR3JhcGhBY3Rpb25zIHtcbiAgZGVwbG95U3RhY2s6IChzdGFja05vZGU6IFN0YWNrTm9kZSkgPT4gUHJvbWlzZTx2b2lkPjtcbiAgYnVpbGRBc3NldDogKGFzc2V0Tm9kZTogQXNzZXRCdWlsZE5vZGUpID0+IFByb21pc2U8dm9pZD47XG4gIHB1Ymxpc2hBc3NldDogKGFzc2V0Tm9kZTogQXNzZXRQdWJsaXNoTm9kZSkgPT4gUHJvbWlzZTx2b2lkPjtcbn1cblxuZnVuY3Rpb24gc3VtKHhzOiBudW1iZXJbXSkge1xuICBsZXQgcmV0ID0gMDtcbiAgZm9yIChjb25zdCB4IG9mIHhzKSB7XG4gICAgcmV0ICs9IHg7XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cblxuZnVuY3Rpb24gcmV0YWluT25seTxBPih4czogQVtdLCBwcmVkOiAoeDogQSkgPT4gYm9vbGVhbikge1xuICB4cy5zcGxpY2UoMCwgeHMubGVuZ3RoLCAuLi54cy5maWx0ZXIocHJlZCkpO1xufVxuXG5mdW5jdGlvbiBndihpZDogc3RyaW5nLCBhdHRycz86IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4pIHtcbiAgY29uc3QgYXR0clN0cmluZyA9IE9iamVjdC5lbnRyaWVzKGF0dHJzID8/IHt9KS5mbGF0TWFwKChbaywgdl0pID0+IHYgIT09IHVuZGVmaW5lZCA/IFtgJHtrfT1cIiR7dn1cImBdIDogW10pLmpvaW4oJywnKTtcblxuICByZXR1cm4gYXR0clN0cmluZyA/IGBcIiR7c2ltcGxpZnlJZChpZCl9XCIgWyR7YXR0clN0cmluZ31dYCA6IGBcIiR7c2ltcGxpZnlJZChpZCl9XCJgO1xufVxuXG5mdW5jdGlvbiBzaW1wbGlmeUlkKGlkOiBzdHJpbmcpIHtcbiAgcmV0dXJuIGlkLnJlcGxhY2UoLyhbMC05YS1mXXs2fSlbMC05YS1mXXs2LH0vZywgJyQxJyk7XG59XG4iXX0=
@@ -0,0 +1,13 @@
1
+ import type { AmiContextQuery } from '@aws-cdk/cloud-assembly-schema';
2
+ import type { IContextProviderMessages } from '.';
3
+ import { type SdkProvider } from '../api/aws-auth/private';
4
+ import type { ContextProviderPlugin } from '../api/plugin';
5
+ /**
6
+ * Plugin to search AMIs for the current account
7
+ */
8
+ export declare class AmiContextProviderPlugin implements ContextProviderPlugin {
9
+ private readonly aws;
10
+ private readonly io;
11
+ constructor(aws: SdkProvider, io: IContextProviderMessages);
12
+ getValue(args: AmiContextQuery): Promise<string>;
13
+ }
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AmiContextProviderPlugin = void 0;
4
+ const private_1 = require("../api/aws-auth/private");
5
+ const toolkit_error_1 = require("../toolkit/toolkit-error");
6
+ /**
7
+ * Plugin to search AMIs for the current account
8
+ */
9
+ class AmiContextProviderPlugin {
10
+ aws;
11
+ io;
12
+ constructor(aws, io) {
13
+ this.aws = aws;
14
+ this.io = io;
15
+ }
16
+ async getValue(args) {
17
+ const region = args.region;
18
+ const account = args.account;
19
+ // Normally we'd do this only as 'debug', but searching AMIs typically takes dozens
20
+ // of seconds, so be little more verbose about it so users know what is going on.
21
+ await this.io.info(`Searching for AMI in ${account}:${region}`);
22
+ await this.io.debug(`AMI search parameters: ${JSON.stringify(args)}`);
23
+ const ec2 = (await (0, private_1.initContextProviderSdk)(this.aws, args)).ec2();
24
+ const response = await ec2.describeImages({
25
+ Owners: args.owners,
26
+ Filters: Object.entries(args.filters).map(([key, values]) => ({
27
+ Name: key,
28
+ Values: values,
29
+ })),
30
+ });
31
+ const images = [...(response.Images || [])].filter((i) => i.ImageId !== undefined);
32
+ if (images.length === 0) {
33
+ throw new toolkit_error_1.ContextProviderError('No AMI found that matched the search criteria');
34
+ }
35
+ // Return the most recent one
36
+ // Note: Date.parse() is not going to respect the timezone of the string,
37
+ // but since we only care about the relative values that is okay.
38
+ images.sort(descending((i) => Date.parse(i.CreationDate || '1970')));
39
+ await this.io.debug(`Selected image '${images[0].ImageId}' created at '${images[0].CreationDate}'`);
40
+ return images[0].ImageId;
41
+ }
42
+ }
43
+ exports.AmiContextProviderPlugin = AmiContextProviderPlugin;
44
+ /**
45
+ * Make a comparator that sorts in descending order given a sort key extractor
46
+ */
47
+ function descending(valueOf) {
48
+ return (a, b) => {
49
+ return valueOf(b) - valueOf(a);
50
+ };
51
+ }
52
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW1pLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiYW1pLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUVBLHFEQUFtRjtBQUVuRiw0REFBZ0U7QUFFaEU7O0dBRUc7QUFDSCxNQUFhLHdCQUF3QjtJQUNOO0lBQW1DO0lBQWhFLFlBQTZCLEdBQWdCLEVBQW1CLEVBQTRCO1FBQS9ELFFBQUcsR0FBSCxHQUFHLENBQWE7UUFBbUIsT0FBRSxHQUFGLEVBQUUsQ0FBMEI7SUFDNUYsQ0FBQztJQUVNLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBcUI7UUFDekMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUMzQixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO1FBRTdCLG1GQUFtRjtRQUNuRixpRkFBaUY7UUFDakYsTUFBTSxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsT0FBTyxJQUFJLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDaEUsTUFBTSxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQywwQkFBMEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFdEUsTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLElBQUEsZ0NBQXNCLEVBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ2pFLE1BQU0sUUFBUSxHQUFHLE1BQU0sR0FBRyxDQUFDLGNBQWMsQ0FBQztZQUN4QyxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07WUFDbkIsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO2dCQUM1RCxJQUFJLEVBQUUsR0FBRztnQkFDVCxNQUFNLEVBQUUsTUFBTTthQUNmLENBQUMsQ0FBQztTQUNKLENBQUMsQ0FBQztRQUVILE1BQU0sTUFBTSxHQUFHLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxNQUFNLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLEtBQUssU0FBUyxDQUFDLENBQUM7UUFFbkYsSUFBSSxNQUFNLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3hCLE1BQU0sSUFBSSxvQ0FBb0IsQ0FBQywrQ0FBK0MsQ0FBQyxDQUFDO1FBQ2xGLENBQUM7UUFFRCw2QkFBNkI7UUFDN0IseUVBQXlFO1FBQ3pFLGlFQUFpRTtRQUNqRSxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsWUFBWSxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUVyRSxNQUFNLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLG1CQUFtQixNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxpQkFBaUIsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksR0FBRyxDQUFDLENBQUM7UUFDcEcsT0FBTyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBUSxDQUFDO0lBQzVCLENBQUM7Q0FDRjtBQXBDRCw0REFvQ0M7QUFFRDs7R0FFRztBQUNILFNBQVMsVUFBVSxDQUFJLE9BQXlCO0lBQzlDLE9BQU8sQ0FBQyxDQUFJLEVBQUUsQ0FBSSxFQUFFLEVBQUU7UUFDcEIsT0FBTyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2pDLENBQUMsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEFtaUNvbnRleHRRdWVyeSB9IGZyb20gJ0Bhd3MtY2RrL2Nsb3VkLWFzc2VtYmx5LXNjaGVtYSc7XG5pbXBvcnQgdHlwZSB7IElDb250ZXh0UHJvdmlkZXJNZXNzYWdlcyB9IGZyb20gJy4nO1xuaW1wb3J0IHsgdHlwZSBTZGtQcm92aWRlciwgaW5pdENvbnRleHRQcm92aWRlclNkayB9IGZyb20gJy4uL2FwaS9hd3MtYXV0aC9wcml2YXRlJztcbmltcG9ydCB0eXBlIHsgQ29udGV4dFByb3ZpZGVyUGx1Z2luIH0gZnJvbSAnLi4vYXBpL3BsdWdpbic7XG5pbXBvcnQgeyBDb250ZXh0UHJvdmlkZXJFcnJvciB9IGZyb20gJy4uL3Rvb2xraXQvdG9vbGtpdC1lcnJvcic7XG5cbi8qKlxuICogUGx1Z2luIHRvIHNlYXJjaCBBTUlzIGZvciB0aGUgY3VycmVudCBhY2NvdW50XG4gKi9cbmV4cG9ydCBjbGFzcyBBbWlDb250ZXh0UHJvdmlkZXJQbHVnaW4gaW1wbGVtZW50cyBDb250ZXh0UHJvdmlkZXJQbHVnaW4ge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IGF3czogU2RrUHJvdmlkZXIsIHByaXZhdGUgcmVhZG9ubHkgaW86IElDb250ZXh0UHJvdmlkZXJNZXNzYWdlcykge1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldFZhbHVlKGFyZ3M6IEFtaUNvbnRleHRRdWVyeSkge1xuICAgIGNvbnN0IHJlZ2lvbiA9IGFyZ3MucmVnaW9uO1xuICAgIGNvbnN0IGFjY291bnQgPSBhcmdzLmFjY291bnQ7XG5cbiAgICAvLyBOb3JtYWxseSB3ZSdkIGRvIHRoaXMgb25seSBhcyAnZGVidWcnLCBidXQgc2VhcmNoaW5nIEFNSXMgdHlwaWNhbGx5IHRha2VzIGRvemVuc1xuICAgIC8vIG9mIHNlY29uZHMsIHNvIGJlIGxpdHRsZSBtb3JlIHZlcmJvc2UgYWJvdXQgaXQgc28gdXNlcnMga25vdyB3aGF0IGlzIGdvaW5nIG9uLlxuICAgIGF3YWl0IHRoaXMuaW8uaW5mbyhgU2VhcmNoaW5nIGZvciBBTUkgaW4gJHthY2NvdW50fToke3JlZ2lvbn1gKTtcbiAgICBhd2FpdCB0aGlzLmlvLmRlYnVnKGBBTUkgc2VhcmNoIHBhcmFtZXRlcnM6ICR7SlNPTi5zdHJpbmdpZnkoYXJncyl9YCk7XG5cbiAgICBjb25zdCBlYzIgPSAoYXdhaXQgaW5pdENvbnRleHRQcm92aWRlclNkayh0aGlzLmF3cywgYXJncykpLmVjMigpO1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZWMyLmRlc2NyaWJlSW1hZ2VzKHtcbiAgICAgIE93bmVyczogYXJncy5vd25lcnMsXG4gICAgICBGaWx0ZXJzOiBPYmplY3QuZW50cmllcyhhcmdzLmZpbHRlcnMpLm1hcCgoW2tleSwgdmFsdWVzXSkgPT4gKHtcbiAgICAgICAgTmFtZToga2V5LFxuICAgICAgICBWYWx1ZXM6IHZhbHVlcyxcbiAgICAgIH0pKSxcbiAgICB9KTtcblxuICAgIGNvbnN0IGltYWdlcyA9IFsuLi4ocmVzcG9uc2UuSW1hZ2VzIHx8IFtdKV0uZmlsdGVyKChpKSA9PiBpLkltYWdlSWQgIT09IHVuZGVmaW5lZCk7XG5cbiAgICBpZiAoaW1hZ2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IENvbnRleHRQcm92aWRlckVycm9yKCdObyBBTUkgZm91bmQgdGhhdCBtYXRjaGVkIHRoZSBzZWFyY2ggY3JpdGVyaWEnKTtcbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gdGhlIG1vc3QgcmVjZW50IG9uZVxuICAgIC8vIE5vdGU6IERhdGUucGFyc2UoKSBpcyBub3QgZ29pbmcgdG8gcmVzcGVjdCB0aGUgdGltZXpvbmUgb2YgdGhlIHN0cmluZyxcbiAgICAvLyBidXQgc2luY2Ugd2Ugb25seSBjYXJlIGFib3V0IHRoZSByZWxhdGl2ZSB2YWx1ZXMgdGhhdCBpcyBva2F5LlxuICAgIGltYWdlcy5zb3J0KGRlc2NlbmRpbmcoKGkpID0+IERhdGUucGFyc2UoaS5DcmVhdGlvbkRhdGUgfHwgJzE5NzAnKSkpO1xuXG4gICAgYXdhaXQgdGhpcy5pby5kZWJ1ZyhgU2VsZWN0ZWQgaW1hZ2UgJyR7aW1hZ2VzWzBdLkltYWdlSWR9JyBjcmVhdGVkIGF0ICcke2ltYWdlc1swXS5DcmVhdGlvbkRhdGV9J2ApO1xuICAgIHJldHVybiBpbWFnZXNbMF0uSW1hZ2VJZCE7XG4gIH1cbn1cblxuLyoqXG4gKiBNYWtlIGEgY29tcGFyYXRvciB0aGF0IHNvcnRzIGluIGRlc2NlbmRpbmcgb3JkZXIgZ2l2ZW4gYSBzb3J0IGtleSBleHRyYWN0b3JcbiAqL1xuZnVuY3Rpb24gZGVzY2VuZGluZzxBPih2YWx1ZU9mOiAoeDogQSkgPT4gbnVtYmVyKSB7XG4gIHJldHVybiAoYTogQSwgYjogQSkgPT4ge1xuICAgIHJldHVybiB2YWx1ZU9mKGIpIC0gdmFsdWVPZihhKTtcbiAgfTtcbn1cbiJdfQ==
@@ -0,0 +1,13 @@
1
+ import type { AvailabilityZonesContextQuery } from '@aws-cdk/cloud-assembly-schema';
2
+ import type { IContextProviderMessages } from '.';
3
+ import { type SdkProvider } from '../api/aws-auth/private';
4
+ import type { ContextProviderPlugin } from '../api/plugin';
5
+ /**
6
+ * Plugin to retrieve the Availability Zones for the current account
7
+ */
8
+ export declare class AZContextProviderPlugin implements ContextProviderPlugin {
9
+ private readonly aws;
10
+ private readonly io;
11
+ constructor(aws: SdkProvider, io: IContextProviderMessages);
12
+ getValue(args: AvailabilityZonesContextQuery): Promise<(string | undefined)[]>;
13
+ }
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AZContextProviderPlugin = void 0;
4
+ const private_1 = require("../api/aws-auth/private");
5
+ /**
6
+ * Plugin to retrieve the Availability Zones for the current account
7
+ */
8
+ class AZContextProviderPlugin {
9
+ aws;
10
+ io;
11
+ constructor(aws, io) {
12
+ this.aws = aws;
13
+ this.io = io;
14
+ }
15
+ async getValue(args) {
16
+ const region = args.region;
17
+ const account = args.account;
18
+ await this.io.debug(`Reading AZs for ${account}:${region}`);
19
+ const ec2 = (await (0, private_1.initContextProviderSdk)(this.aws, args)).ec2();
20
+ const response = await ec2.describeAvailabilityZones({});
21
+ if (!response.AvailabilityZones) {
22
+ return [];
23
+ }
24
+ const azs = response.AvailabilityZones.filter((zone) => zone.State === 'available').map((zone) => zone.ZoneName);
25
+ return azs;
26
+ }
27
+ }
28
+ exports.AZContextProviderPlugin = AZContextProviderPlugin;
29
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXZhaWxhYmlsaXR5LXpvbmVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiYXZhaWxhYmlsaXR5LXpvbmVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUdBLHFEQUFtRjtBQUduRjs7R0FFRztBQUNILE1BQWEsdUJBQXVCO0lBQ0w7SUFBbUM7SUFBaEUsWUFBNkIsR0FBZ0IsRUFBbUIsRUFBNEI7UUFBL0QsUUFBRyxHQUFILEdBQUcsQ0FBYTtRQUFtQixPQUFFLEdBQUYsRUFBRSxDQUEwQjtJQUM1RixDQUFDO0lBRU0sS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFtQztRQUN2RCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQzNCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7UUFDN0IsTUFBTSxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxtQkFBbUIsT0FBTyxJQUFJLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDNUQsTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLElBQUEsZ0NBQXNCLEVBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ2pFLE1BQU0sUUFBUSxHQUFHLE1BQU0sR0FBRyxDQUFDLHlCQUF5QixDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3pELElBQUksQ0FBQyxRQUFRLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUNoQyxPQUFPLEVBQUUsQ0FBQztRQUNaLENBQUM7UUFDRCxNQUFNLEdBQUcsR0FBRyxRQUFRLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBc0IsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssS0FBSyxXQUFXLENBQUMsQ0FBQyxHQUFHLENBQ3ZHLENBQUMsSUFBc0IsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FDMUMsQ0FBQztRQUNGLE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQztDQUNGO0FBbEJELDBEQWtCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgQXZhaWxhYmlsaXR5Wm9uZXNDb250ZXh0UXVlcnkgfSBmcm9tICdAYXdzLWNkay9jbG91ZC1hc3NlbWJseS1zY2hlbWEnO1xuaW1wb3J0IHR5cGUgeyBBdmFpbGFiaWxpdHlab25lIH0gZnJvbSAnQGF3cy1zZGsvY2xpZW50LWVjMic7XG5pbXBvcnQgdHlwZSB7IElDb250ZXh0UHJvdmlkZXJNZXNzYWdlcyB9IGZyb20gJy4nO1xuaW1wb3J0IHsgdHlwZSBTZGtQcm92aWRlciwgaW5pdENvbnRleHRQcm92aWRlclNkayB9IGZyb20gJy4uL2FwaS9hd3MtYXV0aC9wcml2YXRlJztcbmltcG9ydCB0eXBlIHsgQ29udGV4dFByb3ZpZGVyUGx1Z2luIH0gZnJvbSAnLi4vYXBpL3BsdWdpbic7XG5cbi8qKlxuICogUGx1Z2luIHRvIHJldHJpZXZlIHRoZSBBdmFpbGFiaWxpdHkgWm9uZXMgZm9yIHRoZSBjdXJyZW50IGFjY291bnRcbiAqL1xuZXhwb3J0IGNsYXNzIEFaQ29udGV4dFByb3ZpZGVyUGx1Z2luIGltcGxlbWVudHMgQ29udGV4dFByb3ZpZGVyUGx1Z2luIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBhd3M6IFNka1Byb3ZpZGVyLCBwcml2YXRlIHJlYWRvbmx5IGlvOiBJQ29udGV4dFByb3ZpZGVyTWVzc2FnZXMpIHtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXRWYWx1ZShhcmdzOiBBdmFpbGFiaWxpdHlab25lc0NvbnRleHRRdWVyeSkge1xuICAgIGNvbnN0IHJlZ2lvbiA9IGFyZ3MucmVnaW9uO1xuICAgIGNvbnN0IGFjY291bnQgPSBhcmdzLmFjY291bnQ7XG4gICAgYXdhaXQgdGhpcy5pby5kZWJ1ZyhgUmVhZGluZyBBWnMgZm9yICR7YWNjb3VudH06JHtyZWdpb259YCk7XG4gICAgY29uc3QgZWMyID0gKGF3YWl0IGluaXRDb250ZXh0UHJvdmlkZXJTZGsodGhpcy5hd3MsIGFyZ3MpKS5lYzIoKTtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGVjMi5kZXNjcmliZUF2YWlsYWJpbGl0eVpvbmVzKHt9KTtcbiAgICBpZiAoIXJlc3BvbnNlLkF2YWlsYWJpbGl0eVpvbmVzKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIGNvbnN0IGF6cyA9IHJlc3BvbnNlLkF2YWlsYWJpbGl0eVpvbmVzLmZpbHRlcigoem9uZTogQXZhaWxhYmlsaXR5Wm9uZSkgPT4gem9uZS5TdGF0ZSA9PT0gJ2F2YWlsYWJsZScpLm1hcChcbiAgICAgICh6b25lOiBBdmFpbGFiaWxpdHlab25lKSA9PiB6b25lLlpvbmVOYW1lLFxuICAgICk7XG4gICAgcmV0dXJuIGF6cztcbiAgfVxufVxuIl19
@@ -0,0 +1,30 @@
1
+ import type { CcApiContextQuery } from '@aws-cdk/cloud-assembly-schema';
2
+ import type { SdkProvider } from '../api/aws-auth/private';
3
+ import type { ContextProviderPlugin } from '../api/plugin';
4
+ export declare class CcApiContextProviderPlugin implements ContextProviderPlugin {
5
+ private readonly aws;
6
+ constructor(aws: SdkProvider);
7
+ /**
8
+ * This returns a data object with the value from CloudControl API result.
9
+ *
10
+ * See the documentation in the Cloud Assembly Schema for the semantics of
11
+ * each query parameter.
12
+ */
13
+ getValue(args: CcApiContextQuery): Promise<any>;
14
+ /**
15
+ * Calls getResource from CC API to get the resource.
16
+ * See https://docs.aws.amazon.com/cli/latest/reference/cloudcontrol/get-resource.html
17
+ *
18
+ * Will always return exactly one resource, or fail.
19
+ */
20
+ private getResource;
21
+ /**
22
+ * Calls listResources from CC API to get the resources and apply args.propertyMatch to find the resources.
23
+ * See https://docs.aws.amazon.com/cli/latest/reference/cloudcontrol/list-resources.html
24
+ *
25
+ * Will return 0 or more resources.
26
+ *
27
+ * Does not currently paginate through more than one result page.
28
+ */
29
+ private listResources;
30
+ }