@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,62 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isHotswappableCodeBuildProjectChange = isHotswappableCodeBuildProjectChange;
4
+ const common_1 = require("./common");
5
+ const util_1 = require("../../util");
6
+ async function isHotswappableCodeBuildProjectChange(logicalId, change, evaluateCfnTemplate) {
7
+ if (change.newValue.Type !== 'AWS::CodeBuild::Project') {
8
+ return [];
9
+ }
10
+ const ret = [];
11
+ const classifiedChanges = (0, common_1.classifyChanges)(change, ['Source', 'Environment', 'SourceVersion']);
12
+ classifiedChanges.reportNonHotswappablePropertyChanges(ret);
13
+ if (classifiedChanges.namesOfHotswappableProps.length > 0) {
14
+ const updateProjectInput = {
15
+ name: '',
16
+ };
17
+ const projectName = await evaluateCfnTemplate.establishResourcePhysicalName(logicalId, change.newValue.Properties?.Name);
18
+ // nothing to do jere
19
+ if (!projectName) {
20
+ return ret;
21
+ }
22
+ ret.push({
23
+ change: {
24
+ cause: change,
25
+ resources: [{
26
+ logicalId: logicalId,
27
+ resourceType: change.newValue.Type,
28
+ physicalName: projectName,
29
+ metadata: evaluateCfnTemplate.metadataFor(logicalId),
30
+ }],
31
+ },
32
+ hotswappable: true,
33
+ service: 'codebuild',
34
+ apply: async (sdk) => {
35
+ updateProjectInput.name = projectName;
36
+ for (const updatedPropName in change.propertyUpdates) {
37
+ const updatedProp = change.propertyUpdates[updatedPropName];
38
+ switch (updatedPropName) {
39
+ case 'Source':
40
+ updateProjectInput.source = (0, util_1.transformObjectKeys)(await evaluateCfnTemplate.evaluateCfnExpression(updatedProp.newValue), convertSourceCloudformationKeyToSdkKey);
41
+ break;
42
+ case 'Environment':
43
+ updateProjectInput.environment = await (0, util_1.transformObjectKeys)(await evaluateCfnTemplate.evaluateCfnExpression(updatedProp.newValue), util_1.lowerCaseFirstCharacter);
44
+ break;
45
+ case 'SourceVersion':
46
+ updateProjectInput.sourceVersion = await evaluateCfnTemplate.evaluateCfnExpression(updatedProp.newValue);
47
+ break;
48
+ }
49
+ }
50
+ await sdk.codeBuild().updateProject(updateProjectInput);
51
+ },
52
+ });
53
+ }
54
+ return ret;
55
+ }
56
+ function convertSourceCloudformationKeyToSdkKey(key) {
57
+ if (key.toLowerCase() === 'buildspec') {
58
+ return key.toLowerCase();
59
+ }
60
+ return (0, util_1.lowerCaseFirstCharacter)(key);
61
+ }
62
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29kZS1idWlsZC1wcm9qZWN0cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImNvZGUtYnVpbGQtcHJvamVjdHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFVQSxvRkFxRUM7QUE5RUQscUNBR2tCO0FBRWxCLHFDQUEwRTtBQUluRSxLQUFLLFVBQVUsb0NBQW9DLENBQ3hELFNBQWlCLEVBQ2pCLE1BQXNCLEVBQ3RCLG1CQUFtRDtJQUVuRCxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxLQUFLLHlCQUF5QixFQUFFLENBQUM7UUFDdkQsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0lBRUQsTUFBTSxHQUFHLEdBQW9CLEVBQUUsQ0FBQztJQUVoQyxNQUFNLGlCQUFpQixHQUFHLElBQUEsd0JBQWUsRUFBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUUsYUFBYSxFQUFFLGVBQWUsQ0FBQyxDQUFDLENBQUM7SUFDOUYsaUJBQWlCLENBQUMsb0NBQW9DLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDNUQsSUFBSSxpQkFBaUIsQ0FBQyx3QkFBd0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDMUQsTUFBTSxrQkFBa0IsR0FBOEI7WUFDcEQsSUFBSSxFQUFFLEVBQUU7U0FDVCxDQUFDO1FBQ0YsTUFBTSxXQUFXLEdBQUcsTUFBTSxtQkFBbUIsQ0FBQyw2QkFBNkIsQ0FDekUsU0FBUyxFQUNULE1BQU0sQ0FBQyxRQUFRLENBQUMsVUFBVSxFQUFFLElBQUksQ0FDakMsQ0FBQztRQUVGLHFCQUFxQjtRQUNyQixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDakIsT0FBTyxHQUFHLENBQUM7UUFDYixDQUFDO1FBRUQsR0FBRyxDQUFDLElBQUksQ0FBQztZQUNQLE1BQU0sRUFBRTtnQkFDTixLQUFLLEVBQUUsTUFBTTtnQkFDYixTQUFTLEVBQUUsQ0FBQzt3QkFDVixTQUFTLEVBQUUsU0FBUzt3QkFDcEIsWUFBWSxFQUFFLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSTt3QkFDbEMsWUFBWSxFQUFFLFdBQVc7d0JBQ3pCLFFBQVEsRUFBRSxtQkFBbUIsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDO3FCQUNyRCxDQUFDO2FBQ0g7WUFDRCxZQUFZLEVBQUUsSUFBSTtZQUNsQixPQUFPLEVBQUUsV0FBVztZQUNwQixLQUFLLEVBQUUsS0FBSyxFQUFFLEdBQVEsRUFBRSxFQUFFO2dCQUN4QixrQkFBa0IsQ0FBQyxJQUFJLEdBQUcsV0FBVyxDQUFDO2dCQUV0QyxLQUFLLE1BQU0sZUFBZSxJQUFJLE1BQU0sQ0FBQyxlQUFlLEVBQUUsQ0FBQztvQkFDckQsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLGVBQWUsQ0FBQyxlQUFlLENBQUMsQ0FBQztvQkFDNUQsUUFBUSxlQUFlLEVBQUUsQ0FBQzt3QkFDeEIsS0FBSyxRQUFROzRCQUNYLGtCQUFrQixDQUFDLE1BQU0sR0FBRyxJQUFBLDBCQUFtQixFQUM3QyxNQUFNLG1CQUFtQixDQUFDLHFCQUFxQixDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsRUFDckUsc0NBQXNDLENBQ3ZDLENBQUM7NEJBQ0YsTUFBTTt3QkFDUixLQUFLLGFBQWE7NEJBQ2hCLGtCQUFrQixDQUFDLFdBQVcsR0FBRyxNQUFNLElBQUEsMEJBQW1CLEVBQ3hELE1BQU0sbUJBQW1CLENBQUMscUJBQXFCLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxFQUNyRSw4QkFBdUIsQ0FDeEIsQ0FBQzs0QkFDRixNQUFNO3dCQUNSLEtBQUssZUFBZTs0QkFDbEIsa0JBQWtCLENBQUMsYUFBYSxHQUFHLE1BQU0sbUJBQW1CLENBQUMscUJBQXFCLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDOzRCQUN6RyxNQUFNO29CQUNWLENBQUM7Z0JBQ0gsQ0FBQztnQkFFRCxNQUFNLEdBQUcsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxhQUFhLENBQUMsa0JBQWtCLENBQUMsQ0FBQztZQUMxRCxDQUFDO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUVELFNBQVMsc0NBQXNDLENBQUMsR0FBVztJQUN6RCxJQUFJLEdBQUcsQ0FBQyxXQUFXLEVBQUUsS0FBSyxXQUFXLEVBQUUsQ0FBQztRQUN0QyxPQUFPLEdBQUcsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBQ0QsT0FBTyxJQUFBLDhCQUF1QixFQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3RDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFVwZGF0ZVByb2plY3RDb21tYW5kSW5wdXQgfSBmcm9tICdAYXdzLXNkay9jbGllbnQtY29kZWJ1aWxkJztcbmltcG9ydCB7XG4gIHR5cGUgSG90c3dhcENoYW5nZSxcbiAgY2xhc3NpZnlDaGFuZ2VzLFxufSBmcm9tICcuL2NvbW1vbic7XG5pbXBvcnQgdHlwZSB7IFJlc291cmNlQ2hhbmdlIH0gZnJvbSAnLi4vLi4vcGF5bG9hZHMvaG90c3dhcCc7XG5pbXBvcnQgeyBsb3dlckNhc2VGaXJzdENoYXJhY3RlciwgdHJhbnNmb3JtT2JqZWN0S2V5cyB9IGZyb20gJy4uLy4uL3V0aWwnO1xuaW1wb3J0IHR5cGUgeyBTREsgfSBmcm9tICcuLi9hd3MtYXV0aC9wcml2YXRlJztcbmltcG9ydCB0eXBlIHsgRXZhbHVhdGVDbG91ZEZvcm1hdGlvblRlbXBsYXRlIH0gZnJvbSAnLi4vY2xvdWRmb3JtYXRpb24nO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaXNIb3Rzd2FwcGFibGVDb2RlQnVpbGRQcm9qZWN0Q2hhbmdlKFxuICBsb2dpY2FsSWQ6IHN0cmluZyxcbiAgY2hhbmdlOiBSZXNvdXJjZUNoYW5nZSxcbiAgZXZhbHVhdGVDZm5UZW1wbGF0ZTogRXZhbHVhdGVDbG91ZEZvcm1hdGlvblRlbXBsYXRlLFxuKTogUHJvbWlzZTxIb3Rzd2FwQ2hhbmdlW10+IHtcbiAgaWYgKGNoYW5nZS5uZXdWYWx1ZS5UeXBlICE9PSAnQVdTOjpDb2RlQnVpbGQ6OlByb2plY3QnKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgY29uc3QgcmV0OiBIb3Rzd2FwQ2hhbmdlW10gPSBbXTtcblxuICBjb25zdCBjbGFzc2lmaWVkQ2hhbmdlcyA9IGNsYXNzaWZ5Q2hhbmdlcyhjaGFuZ2UsIFsnU291cmNlJywgJ0Vudmlyb25tZW50JywgJ1NvdXJjZVZlcnNpb24nXSk7XG4gIGNsYXNzaWZpZWRDaGFuZ2VzLnJlcG9ydE5vbkhvdHN3YXBwYWJsZVByb3BlcnR5Q2hhbmdlcyhyZXQpO1xuICBpZiAoY2xhc3NpZmllZENoYW5nZXMubmFtZXNPZkhvdHN3YXBwYWJsZVByb3BzLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCB1cGRhdGVQcm9qZWN0SW5wdXQ6IFVwZGF0ZVByb2plY3RDb21tYW5kSW5wdXQgPSB7XG4gICAgICBuYW1lOiAnJyxcbiAgICB9O1xuICAgIGNvbnN0IHByb2plY3ROYW1lID0gYXdhaXQgZXZhbHVhdGVDZm5UZW1wbGF0ZS5lc3RhYmxpc2hSZXNvdXJjZVBoeXNpY2FsTmFtZShcbiAgICAgIGxvZ2ljYWxJZCxcbiAgICAgIGNoYW5nZS5uZXdWYWx1ZS5Qcm9wZXJ0aWVzPy5OYW1lLFxuICAgICk7XG5cbiAgICAvLyBub3RoaW5nIHRvIGRvIGplcmVcbiAgICBpZiAoIXByb2plY3ROYW1lKSB7XG4gICAgICByZXR1cm4gcmV0O1xuICAgIH1cblxuICAgIHJldC5wdXNoKHtcbiAgICAgIGNoYW5nZToge1xuICAgICAgICBjYXVzZTogY2hhbmdlLFxuICAgICAgICByZXNvdXJjZXM6IFt7XG4gICAgICAgICAgbG9naWNhbElkOiBsb2dpY2FsSWQsXG4gICAgICAgICAgcmVzb3VyY2VUeXBlOiBjaGFuZ2UubmV3VmFsdWUuVHlwZSxcbiAgICAgICAgICBwaHlzaWNhbE5hbWU6IHByb2plY3ROYW1lLFxuICAgICAgICAgIG1ldGFkYXRhOiBldmFsdWF0ZUNmblRlbXBsYXRlLm1ldGFkYXRhRm9yKGxvZ2ljYWxJZCksXG4gICAgICAgIH1dLFxuICAgICAgfSxcbiAgICAgIGhvdHN3YXBwYWJsZTogdHJ1ZSxcbiAgICAgIHNlcnZpY2U6ICdjb2RlYnVpbGQnLFxuICAgICAgYXBwbHk6IGFzeW5jIChzZGs6IFNESykgPT4ge1xuICAgICAgICB1cGRhdGVQcm9qZWN0SW5wdXQubmFtZSA9IHByb2plY3ROYW1lO1xuXG4gICAgICAgIGZvciAoY29uc3QgdXBkYXRlZFByb3BOYW1lIGluIGNoYW5nZS5wcm9wZXJ0eVVwZGF0ZXMpIHtcbiAgICAgICAgICBjb25zdCB1cGRhdGVkUHJvcCA9IGNoYW5nZS5wcm9wZXJ0eVVwZGF0ZXNbdXBkYXRlZFByb3BOYW1lXTtcbiAgICAgICAgICBzd2l0Y2ggKHVwZGF0ZWRQcm9wTmFtZSkge1xuICAgICAgICAgICAgY2FzZSAnU291cmNlJzpcbiAgICAgICAgICAgICAgdXBkYXRlUHJvamVjdElucHV0LnNvdXJjZSA9IHRyYW5zZm9ybU9iamVjdEtleXMoXG4gICAgICAgICAgICAgICAgYXdhaXQgZXZhbHVhdGVDZm5UZW1wbGF0ZS5ldmFsdWF0ZUNmbkV4cHJlc3Npb24odXBkYXRlZFByb3AubmV3VmFsdWUpLFxuICAgICAgICAgICAgICAgIGNvbnZlcnRTb3VyY2VDbG91ZGZvcm1hdGlvbktleVRvU2RrS2V5LFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ0Vudmlyb25tZW50JzpcbiAgICAgICAgICAgICAgdXBkYXRlUHJvamVjdElucHV0LmVudmlyb25tZW50ID0gYXdhaXQgdHJhbnNmb3JtT2JqZWN0S2V5cyhcbiAgICAgICAgICAgICAgICBhd2FpdCBldmFsdWF0ZUNmblRlbXBsYXRlLmV2YWx1YXRlQ2ZuRXhwcmVzc2lvbih1cGRhdGVkUHJvcC5uZXdWYWx1ZSksXG4gICAgICAgICAgICAgICAgbG93ZXJDYXNlRmlyc3RDaGFyYWN0ZXIsXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnU291cmNlVmVyc2lvbic6XG4gICAgICAgICAgICAgIHVwZGF0ZVByb2plY3RJbnB1dC5zb3VyY2VWZXJzaW9uID0gYXdhaXQgZXZhbHVhdGVDZm5UZW1wbGF0ZS5ldmFsdWF0ZUNmbkV4cHJlc3Npb24odXBkYXRlZFByb3AubmV3VmFsdWUpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCBzZGsuY29kZUJ1aWxkKCkudXBkYXRlUHJvamVjdCh1cGRhdGVQcm9qZWN0SW5wdXQpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiByZXQ7XG59XG5cbmZ1bmN0aW9uIGNvbnZlcnRTb3VyY2VDbG91ZGZvcm1hdGlvbktleVRvU2RrS2V5KGtleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKGtleS50b0xvd2VyQ2FzZSgpID09PSAnYnVpbGRzcGVjJykge1xuICAgIHJldHVybiBrZXkudG9Mb3dlckNhc2UoKTtcbiAgfVxuICByZXR1cm4gbG93ZXJDYXNlRmlyc3RDaGFyYWN0ZXIoa2V5KTtcbn1cbiJdfQ==
@@ -0,0 +1,89 @@
1
+ import type { PropertyDifference } from '@aws-cdk/cloudformation-diff';
2
+ import type { HotswappableChange, NonHotswappableChange, ResourceChange } from '../../payloads/hotswap';
3
+ import { NonHotswappableReason } from '../../payloads/hotswap';
4
+ import type { SDK } from '../aws-auth/private';
5
+ export declare const ICON = "\u2728";
6
+ export interface HotswapOperation {
7
+ /**
8
+ * Marks the operation as hotswappable
9
+ */
10
+ readonly hotswappable: true;
11
+ /**
12
+ * The name of the service being hotswapped.
13
+ * Used to set a custom User-Agent for SDK calls.
14
+ */
15
+ readonly service: string;
16
+ /**
17
+ * Description of the change that is applied as part of the operation
18
+ */
19
+ readonly change: HotswappableChange;
20
+ /**
21
+ * Applies the hotswap operation
22
+ */
23
+ readonly apply: (sdk: SDK) => Promise<void>;
24
+ }
25
+ export interface RejectedChange {
26
+ /**
27
+ * Marks the change as not hotswappable
28
+ */
29
+ readonly hotswappable: false;
30
+ /**
31
+ * The change that got rejected
32
+ */
33
+ readonly change: NonHotswappableChange;
34
+ /**
35
+ * Whether or not to show this change when listing non-hotswappable changes in HOTSWAP_ONLY mode. Does not affect
36
+ * listing in FALL_BACK mode.
37
+ *
38
+ * @default true
39
+ */
40
+ readonly hotswapOnlyVisible?: boolean;
41
+ }
42
+ export type HotswapChange = HotswapOperation | RejectedChange;
43
+ export declare enum HotswapMode {
44
+ /**
45
+ * Will fall back to CloudFormation when a non-hotswappable change is detected
46
+ */
47
+ FALL_BACK = "fall-back",
48
+ /**
49
+ * Will not fall back to CloudFormation when a non-hotswappable change is detected
50
+ */
51
+ HOTSWAP_ONLY = "hotswap-only",
52
+ /**
53
+ * Will not attempt to hotswap anything and instead go straight to CloudFormation
54
+ */
55
+ FULL_DEPLOYMENT = "full-deployment"
56
+ }
57
+ /**
58
+ * Represents configuration property overrides for hotswap deployments
59
+ */
60
+ export declare class HotswapPropertyOverrides {
61
+ ecsHotswapProperties?: EcsHotswapProperties;
62
+ constructor(ecsHotswapProperties?: EcsHotswapProperties);
63
+ }
64
+ /**
65
+ * Represents configuration properties for ECS hotswap deployments
66
+ */
67
+ export declare class EcsHotswapProperties {
68
+ readonly minimumHealthyPercent?: number;
69
+ readonly maximumHealthyPercent?: number;
70
+ constructor(minimumHealthyPercent?: number, maximumHealthyPercent?: number);
71
+ /**
72
+ * Check if any hotswap properties are defined
73
+ * @returns true if all properties are undefined, false otherwise
74
+ */
75
+ isEmpty(): boolean;
76
+ }
77
+ type PropDiffs = Record<string, PropertyDifference<any>>;
78
+ declare class ClassifiedChanges {
79
+ readonly change: ResourceChange;
80
+ readonly hotswappableProps: PropDiffs;
81
+ readonly nonHotswappableProps: PropDiffs;
82
+ constructor(change: ResourceChange, hotswappableProps: PropDiffs, nonHotswappableProps: PropDiffs);
83
+ reportNonHotswappablePropertyChanges(ret: HotswapChange[]): void;
84
+ get namesOfHotswappableProps(): string[];
85
+ }
86
+ export declare function classifyChanges(xs: ResourceChange, hotswappablePropNames: string[]): ClassifiedChanges;
87
+ export declare function nonHotswappableChange(change: ResourceChange, reason: NonHotswappableReason, description: string, nonHotswappableProps?: PropDiffs, hotswapOnlyVisible?: boolean): RejectedChange;
88
+ export declare function nonHotswappableResource(change: ResourceChange): RejectedChange;
89
+ export {};
@@ -0,0 +1,137 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.EcsHotswapProperties = exports.HotswapPropertyOverrides = exports.HotswapMode = exports.ICON = void 0;
4
+ exports.classifyChanges = classifyChanges;
5
+ exports.nonHotswappableChange = nonHotswappableChange;
6
+ exports.nonHotswappableResource = nonHotswappableResource;
7
+ const hotswap_1 = require("../../payloads/hotswap");
8
+ const toolkit_error_1 = require("../../toolkit/toolkit-error");
9
+ exports.ICON = '✨';
10
+ var HotswapMode;
11
+ (function (HotswapMode) {
12
+ /**
13
+ * Will fall back to CloudFormation when a non-hotswappable change is detected
14
+ */
15
+ HotswapMode["FALL_BACK"] = "fall-back";
16
+ /**
17
+ * Will not fall back to CloudFormation when a non-hotswappable change is detected
18
+ */
19
+ HotswapMode["HOTSWAP_ONLY"] = "hotswap-only";
20
+ /**
21
+ * Will not attempt to hotswap anything and instead go straight to CloudFormation
22
+ */
23
+ HotswapMode["FULL_DEPLOYMENT"] = "full-deployment";
24
+ })(HotswapMode || (exports.HotswapMode = HotswapMode = {}));
25
+ /**
26
+ * Represents configuration property overrides for hotswap deployments
27
+ */
28
+ class HotswapPropertyOverrides {
29
+ // Each supported resource type will have its own properties. Currently this is ECS
30
+ ecsHotswapProperties;
31
+ constructor(ecsHotswapProperties) {
32
+ this.ecsHotswapProperties = ecsHotswapProperties;
33
+ }
34
+ }
35
+ exports.HotswapPropertyOverrides = HotswapPropertyOverrides;
36
+ /**
37
+ * Represents configuration properties for ECS hotswap deployments
38
+ */
39
+ class EcsHotswapProperties {
40
+ // The lower limit on the number of your service's tasks that must remain in the RUNNING state during a deployment, as a percentage of the desiredCount
41
+ minimumHealthyPercent;
42
+ // The upper limit on the number of your service's tasks that are allowed in the RUNNING or PENDING state during a deployment, as a percentage of the desiredCount
43
+ maximumHealthyPercent;
44
+ constructor(minimumHealthyPercent, maximumHealthyPercent) {
45
+ if (minimumHealthyPercent !== undefined && minimumHealthyPercent < 0) {
46
+ throw new toolkit_error_1.ToolkitError('hotswap-ecs-minimum-healthy-percent can\'t be a negative number');
47
+ }
48
+ if (maximumHealthyPercent !== undefined && maximumHealthyPercent < 0) {
49
+ throw new toolkit_error_1.ToolkitError('hotswap-ecs-maximum-healthy-percent can\'t be a negative number');
50
+ }
51
+ // In order to preserve the current behaviour, when minimumHealthyPercent is not defined, it will be set to the currently default value of 0
52
+ if (minimumHealthyPercent == undefined) {
53
+ this.minimumHealthyPercent = 0;
54
+ }
55
+ else {
56
+ this.minimumHealthyPercent = minimumHealthyPercent;
57
+ }
58
+ this.maximumHealthyPercent = maximumHealthyPercent;
59
+ }
60
+ /**
61
+ * Check if any hotswap properties are defined
62
+ * @returns true if all properties are undefined, false otherwise
63
+ */
64
+ isEmpty() {
65
+ return this.minimumHealthyPercent === 0 && this.maximumHealthyPercent === undefined;
66
+ }
67
+ }
68
+ exports.EcsHotswapProperties = EcsHotswapProperties;
69
+ class ClassifiedChanges {
70
+ change;
71
+ hotswappableProps;
72
+ nonHotswappableProps;
73
+ constructor(change, hotswappableProps, nonHotswappableProps) {
74
+ this.change = change;
75
+ this.hotswappableProps = hotswappableProps;
76
+ this.nonHotswappableProps = nonHotswappableProps;
77
+ }
78
+ reportNonHotswappablePropertyChanges(ret) {
79
+ const nonHotswappablePropNames = Object.keys(this.nonHotswappableProps);
80
+ if (nonHotswappablePropNames.length > 0) {
81
+ const tagOnlyChange = nonHotswappablePropNames.length === 1 && nonHotswappablePropNames[0] === 'Tags';
82
+ const reason = tagOnlyChange ? hotswap_1.NonHotswappableReason.TAGS : hotswap_1.NonHotswappableReason.PROPERTIES;
83
+ const description = tagOnlyChange ? 'Tags are not hotswappable' : `resource properties '${nonHotswappablePropNames}' are not hotswappable on this resource type`;
84
+ ret.push(nonHotswappableChange(this.change, reason, description, this.nonHotswappableProps));
85
+ }
86
+ }
87
+ get namesOfHotswappableProps() {
88
+ return Object.keys(this.hotswappableProps);
89
+ }
90
+ }
91
+ function classifyChanges(xs, hotswappablePropNames) {
92
+ const hotswappableProps = {};
93
+ const nonHotswappableProps = {};
94
+ for (const [name, propDiff] of Object.entries(xs.propertyUpdates)) {
95
+ if (hotswappablePropNames.includes(name)) {
96
+ hotswappableProps[name] = propDiff;
97
+ }
98
+ else {
99
+ nonHotswappableProps[name] = propDiff;
100
+ }
101
+ }
102
+ return new ClassifiedChanges(xs, hotswappableProps, nonHotswappableProps);
103
+ }
104
+ function nonHotswappableChange(change, reason, description, nonHotswappableProps, hotswapOnlyVisible = true) {
105
+ return {
106
+ hotswappable: false,
107
+ hotswapOnlyVisible,
108
+ change: {
109
+ reason,
110
+ description,
111
+ subject: {
112
+ type: 'Resource',
113
+ logicalId: change.logicalId,
114
+ resourceType: change.newValue.Type,
115
+ rejectedProperties: Object.keys(nonHotswappableProps ?? change.propertyUpdates),
116
+ metadata: change.metadata,
117
+ },
118
+ },
119
+ };
120
+ }
121
+ function nonHotswappableResource(change) {
122
+ return {
123
+ hotswappable: false,
124
+ change: {
125
+ reason: hotswap_1.NonHotswappableReason.RESOURCE_UNSUPPORTED,
126
+ description: 'This resource type is not supported for hotswap deployments',
127
+ subject: {
128
+ type: 'Resource',
129
+ logicalId: change.logicalId,
130
+ resourceType: change.newValue.Type,
131
+ rejectedProperties: Object.keys(change.propertyUpdates),
132
+ metadata: change.metadata,
133
+ },
134
+ },
135
+ };
136
+ }
137
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiY29tbW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQWlKQSwwQ0FhQztBQUVELHNEQXNCQztBQUVELDBEQWVDO0FBck1ELG9EQUErRDtBQUMvRCwrREFBMkQ7QUFHOUMsUUFBQSxJQUFJLEdBQUcsR0FBRyxDQUFDO0FBNkN4QixJQUFZLFdBZVg7QUFmRCxXQUFZLFdBQVc7SUFDckI7O09BRUc7SUFDSCxzQ0FBdUIsQ0FBQTtJQUV2Qjs7T0FFRztJQUNILDRDQUE2QixDQUFBO0lBRTdCOztPQUVHO0lBQ0gsa0RBQW1DLENBQUE7QUFDckMsQ0FBQyxFQWZXLFdBQVcsMkJBQVgsV0FBVyxRQWV0QjtBQUVEOztHQUVHO0FBQ0gsTUFBYSx3QkFBd0I7SUFDbkMsbUZBQW1GO0lBQ25GLG9CQUFvQixDQUF3QjtJQUU1QyxZQUFvQixvQkFBMkM7UUFDN0QsSUFBSSxDQUFDLG9CQUFvQixHQUFHLG9CQUFvQixDQUFDO0lBQ25ELENBQUM7Q0FDRjtBQVBELDREQU9DO0FBRUQ7O0dBRUc7QUFDSCxNQUFhLG9CQUFvQjtJQUMvQix1SkFBdUo7SUFDOUkscUJBQXFCLENBQVU7SUFDeEMsa0tBQWtLO0lBQ3pKLHFCQUFxQixDQUFVO0lBRXhDLFlBQW9CLHFCQUE4QixFQUFFLHFCQUE4QjtRQUNoRixJQUFJLHFCQUFxQixLQUFLLFNBQVMsSUFBSSxxQkFBcUIsR0FBRyxDQUFDLEVBQUcsQ0FBQztZQUN0RSxNQUFNLElBQUksNEJBQVksQ0FBQyxpRUFBaUUsQ0FBQyxDQUFDO1FBQzVGLENBQUM7UUFDRCxJQUFJLHFCQUFxQixLQUFLLFNBQVMsSUFBSSxxQkFBcUIsR0FBRyxDQUFDLEVBQUcsQ0FBQztZQUN0RSxNQUFNLElBQUksNEJBQVksQ0FBQyxpRUFBaUUsQ0FBQyxDQUFDO1FBQzVGLENBQUM7UUFDRCw0SUFBNEk7UUFDNUksSUFBSSxxQkFBcUIsSUFBSSxTQUFTLEVBQUUsQ0FBQztZQUN2QyxJ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QUFNLENBQUMsUUFBUSxDQUFDLElBQUk7Z0JBQ2xDLGtCQUFrQixFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsb0JBQW9CLElBQUksTUFBTSxDQUFDLGVBQWUsQ0FBQztnQkFDL0UsUUFBUSxFQUFFLE1BQU0sQ0FBQyxRQUFRO2FBQzFCO1NBQ0Y7S0FDRixDQUFDO0FBQ0osQ0FBQztBQUVELFNBQWdCLHVCQUF1QixDQUFDLE1BQXNCO0lBQzVELE9BQU87UUFDTCxZQUFZLEVBQUUsS0FBSztRQUNuQixNQUFNLEVBQUU7WUFDTixNQUFNLEVBQUUsK0JBQXFCLENBQUMsb0JBQW9CO1lBQ2xELFdBQVcsRUFBRSw2REFBNkQ7WUFDMUUsT0FBTyxFQUFFO2dCQUNQLElBQUksRUFBRSxVQUFVO2dCQUNoQixTQUFTLEVBQUUsTUFBTSxDQUFDLFNBQVM7Z0JBQzNCLFlBQVksRUFBRSxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUk7Z0JBQ2xDLGtCQUFrQixFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQztnQkFDdkQsUUFBUSxFQUFFLE1BQU0sQ0FBQyxRQUFRO2FBQzFCO1NBQ0Y7S0FDRixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgUHJvcGVydHlEaWZmZXJlbmNlIH0gZnJvbSAnQGF3cy1jZGsvY2xvdWRmb3JtYXRpb24tZGlmZic7XG5pbXBvcnQgdHlwZSB7IEhvdHN3YXBwYWJsZUNoYW5nZSwgTm9uSG90c3dhcHBhYmxlQ2hhbmdlLCBSZXNvdXJjZUNoYW5nZSB9IGZyb20gJy4uLy4uL3BheWxvYWRzL2hvdHN3YXAnO1xuaW1wb3J0IHsgTm9uSG90c3dhcHBhYmxlUmVhc29uIH0gZnJvbSAnLi4vLi4vcGF5bG9hZHMvaG90c3dhcCc7XG5pbXBvcnQgeyBUb29sa2l0RXJyb3IgfSBmcm9tICcuLi8uLi90b29sa2l0L3Rvb2xraXQtZXJyb3InO1xuaW1wb3J0IHR5cGUgeyBTREsgfSBmcm9tICcuLi9hd3MtYXV0aC9wcml2YXRlJztcblxuZXhwb3J0IGNvbnN0IElDT04gPSAn4pyoJztcblxuZXhwb3J0IGludGVyZmFjZSBIb3Rzd2FwT3BlcmF0aW9uIHtcbiAgLyoqXG4gICAqIE1hcmtzIHRoZSBvcGVyYXRpb24gYXMgaG90c3dhcHBhYmxlXG4gICAqL1xuICByZWFkb25seSBob3Rzd2FwcGFibGU6IHRydWU7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBzZXJ2aWNlIGJlaW5nIGhvdHN3YXBwZWQuXG4gICAqIFVzZWQgdG8gc2V0IGEgY3VzdG9tIFVzZXItQWdlbnQgZm9yIFNESyBjYWxscy5cbiAgICovXG4gIHJlYWRvbmx5IHNlcnZpY2U6IHN0cmluZztcblxuICAvKipcbiAgICogRGVzY3JpcHRpb24gb2YgdGhlIGNoYW5nZSB0aGF0IGlzIGFwcGxpZWQgYXMgcGFydCBvZiB0aGUgb3BlcmF0aW9uXG4gICAqL1xuICByZWFkb25seSBjaGFuZ2U6IEhvdHN3YXBwYWJsZUNoYW5nZTtcblxuICAvKipcbiAgICogQXBwbGllcyB0aGUgaG90c3dhcCBvcGVyYXRpb25cbiAgICovXG4gIHJlYWRvbmx5IGFwcGx5OiAoc2RrOiBTREspID0+IFByb21pc2U8dm9pZD47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVqZWN0ZWRDaGFuZ2Uge1xuICAvKipcbiAgICogTWFya3MgdGhlIGNoYW5nZSBhcyBub3QgaG90c3dhcHBhYmxlXG4gICAqL1xuICByZWFkb25seSBob3Rzd2FwcGFibGU6IGZhbHNlO1xuICAvKipcbiAgICogVGhlIGNoYW5nZSB0aGF0IGdvdCByZWplY3RlZFxuICAgKi9cbiAgcmVhZG9ubHkgY2hhbmdlOiBOb25Ib3Rzd2FwcGFibGVDaGFuZ2U7XG4gIC8qKlxuICAgKiBXaGV0aGVyIG9yIG5vdCB0byBzaG93IHRoaXMgY2hhbmdlIHdoZW4gbGlzdGluZyBub24taG90c3dhcHBhYmxlIGNoYW5nZXMgaW4gSE9UU1dBUF9PTkxZIG1vZGUuIERvZXMgbm90IGFmZmVjdFxuICAgKiBsaXN0aW5nIGluIEZBTExfQkFDSyBtb2RlLlxuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICByZWFkb25seSBob3Rzd2FwT25seVZpc2libGU/OiBib29sZWFuO1xufVxuXG5leHBvcnQgdHlwZSBIb3Rzd2FwQ2hhbmdlID0gSG90c3dhcE9wZXJhdGlvbiB8IFJlamVjdGVkQ2hhbmdlO1xuXG5leHBvcnQgZW51bSBIb3Rzd2FwTW9kZSB7XG4gIC8qKlxuICAgKiBXaWxsIGZhbGwgYmFjayB0byBDbG91ZEZvcm1hdGlvbiB3aGVuIGEgbm9uLWhvdHN3YXBwYWJsZSBjaGFuZ2UgaXMgZGV0ZWN0ZWRcbiAgICovXG4gIEZBTExfQkFDSyA9ICdmYWxsLWJhY2snLFxuXG4gIC8qKlxuICAgKiBXaWxsIG5vdCBmYWxsIGJhY2sgdG8gQ2xvdWRGb3JtYXRpb24gd2hlbiBhIG5vbi1ob3Rzd2FwcGFibGUgY2hhbmdlIGlzIGRldGVjdGVkXG4gICAqL1xuICBIT1RTV0FQX09OTFkgPSAnaG90c3dhcC1vbmx5JyxcblxuICAvKipcbiAgICogV2lsbCBub3QgYXR0ZW1wdCB0byBob3Rzd2FwIGFueXRoaW5nIGFuZCBpbnN0ZWFkIGdvIHN0cmFpZ2h0IHRvIENsb3VkRm9ybWF0aW9uXG4gICAqL1xuICBGVUxMX0RFUExPWU1FTlQgPSAnZnVsbC1kZXBsb3ltZW50Jyxcbn1cblxuLyoqXG4gKiBSZXByZXNlbnRzIGNvbmZpZ3VyYXRpb24gcHJvcGVydHkgb3ZlcnJpZGVzIGZvciBob3Rzd2FwIGRlcGxveW1lbnRzXG4gKi9cbmV4cG9ydCBjbGFzcyBIb3Rzd2FwUHJvcGVydHlPdmVycmlkZXMge1xuICAvLyBFYWNoIHN1cHBvcnRlZCByZXNvdXJjZSB0eXBlIHdpbGwgaGF2ZSBpdHMgb3duIHByb3BlcnRpZXMuIEN1cnJlbnRseSB0aGlzIGlzIEVDU1xuICBlY3NIb3Rzd2FwUHJvcGVydGllcz86IEVjc0hvdHN3YXBQcm9wZXJ0aWVzO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvciAoZWNzSG90c3dhcFByb3BlcnRpZXM/OiBFY3NIb3Rzd2FwUHJvcGVydGllcykge1xuICAgIHRoaXMuZWNzSG90c3dhcFByb3BlcnRpZXMgPSBlY3NIb3Rzd2FwUHJvcGVydGllcztcbiAgfVxufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzIGZvciBFQ1MgaG90c3dhcCBkZXBsb3ltZW50c1xuICovXG5leHBvcnQgY2xhc3MgRWNzSG90c3dhcFByb3BlcnRpZXMge1xuICAvLyBUaGUgbG93ZXIgbGltaXQgb24gdGhlIG51bWJlciBvZiB5b3VyIHNlcnZpY2UncyB0YXNrcyB0aGF0IG11c3QgcmVtYWluIGluIHRoZSBSVU5OSU5HIHN0YXRlIGR1cmluZyBhIGRlcGxveW1lbnQsIGFzIGEgcGVyY2VudGFnZSBvZiB0aGUgZGVzaXJlZENvdW50XG4gIHJlYWRvbmx5IG1pbmltdW1IZWFsdGh5UGVyY2VudD86IG51bWJlcjtcbiAgLy8gVGhlIHVwcGVyIGxpbWl0IG9uIHRoZSBudW1iZXIgb2YgeW91ciBzZXJ2aWNlJ3MgdGFza3MgdGhhdCBhcmUgYWxsb3dlZCBpbiB0aGUgUlVOTklORyBvciBQRU5ESU5HIHN0YXRlIGR1cmluZyBhIGRlcGxveW1lbnQsIGFzIGEgcGVyY2VudGFnZSBvZiB0aGUgZGVzaXJlZENvdW50XG4gIHJlYWRvbmx5IG1heGltdW1IZWFsdGh5UGVyY2VudD86IG51bWJlcjtcblxuICBwdWJsaWMgY29uc3RydWN0b3IgKG1pbmltdW1IZWFsdGh5UGVyY2VudD86IG51bWJlciwgbWF4aW11bUhlYWx0aHlQZXJjZW50PzogbnVtYmVyKSB7XG4gICAgaWYgKG1pbmltdW1IZWFsdGh5UGVyY2VudCAhPT0gdW5kZWZpbmVkICYmIG1pbmltdW1IZWFsdGh5UGVyY2VudCA8IDAgKSB7XG4gICAgICB0aHJvdyBuZXcgVG9vbGtpdEVycm9yKCdob3Rzd2FwLWVjcy1taW5pbXVtLWhlYWx0aHktcGVyY2VudCBjYW5cXCd0IGJlIGEgbmVnYXRpdmUgbnVtYmVyJyk7XG4gICAgfVxuICAgIGlmIChtYXhpbXVtSGVhbHRoeVBlcmNlbnQgIT09IHVuZGVmaW5lZCAmJiBtYXhpbXVtSGVhbHRoeVBlcmNlbnQgPCAwICkge1xuICAgICAgdGhyb3cgbmV3IFRvb2xraXRFcnJvcignaG90c3dhcC1lY3MtbWF4aW11bS1oZWFsdGh5LXBlcmNlbnQgY2FuXFwndCBiZSBhIG5lZ2F0aXZlIG51bWJlcicpO1xuICAgIH1cbiAgICAvLyBJbiBvcmRlciB0byBwcmVzZXJ2ZSB0aGUgY3VycmVudCBiZWhhdmlvdXIsIHdoZW4gbWluaW11bUhlYWx0aHlQZXJjZW50IGlzIG5vdCBkZWZpbmVkLCBpdCB3aWxsIGJlIHNldCB0byB0aGUgY3VycmVudGx5IGRlZmF1bHQgdmFsdWUgb2YgMFxuICAgIGlmIChtaW5pbXVtSGVhbHRoeVBlcmNlbnQgPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLm1pbmltdW1IZWFsdGh5UGVyY2VudCA9IDA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubWluaW11bUhlYWx0aHlQZXJjZW50ID0gbWluaW11bUhlYWx0aHlQZXJjZW50O1xuICAgIH1cbiAgICB0aGlzLm1heGltdW1IZWFsdGh5UGVyY2VudCA9IG1heGltdW1IZWFsdGh5UGVyY2VudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhbnkgaG90c3dhcCBwcm9wZXJ0aWVzIGFyZSBkZWZpbmVkXG4gICAqIEByZXR1cm5zIHRydWUgaWYgYWxsIHByb3BlcnRpZXMgYXJlIHVuZGVmaW5lZCwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAqL1xuICBwdWJsaWMgaXNFbXB0eSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5taW5pbXVtSGVhbHRoeVBlcmNlbnQgPT09IDAgJiYgdGhpcy5tYXhpbXVtSGVhbHRoeVBlcmNlbnQgPT09IHVuZGVmaW5lZDtcbiAgfVxufVxuXG50eXBlIFByb3BEaWZmcyA9IFJlY29yZDxzdHJpbmcsIFByb3BlcnR5RGlmZmVyZW5jZTxhbnk+PjtcblxuY2xhc3MgQ2xhc3NpZmllZENoYW5nZXMge1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgcHVibGljIHJlYWRvbmx5IGNoYW5nZTogUmVzb3VyY2VDaGFuZ2UsXG4gICAgcHVibGljIHJlYWRvbmx5IGhvdHN3YXBwYWJsZVByb3BzOiBQcm9wRGlmZnMsXG4gICAgcHVibGljIHJlYWRvbmx5IG5vbkhvdHN3YXBwYWJsZVByb3BzOiBQcm9wRGlmZnMsXG4gICkge1xuICB9XG5cbiAgcHVibGljIHJlcG9ydE5vbkhvdHN3YXBwYWJsZVByb3BlcnR5Q2hhbmdlcyhyZXQ6IEhvdHN3YXBDaGFuZ2VbXSk6IHZvaWQge1xuICAgIGNvbnN0IG5vbkhvdHN3YXBwYWJsZVByb3BOYW1lcyA9IE9iamVjdC5rZXlzKHRoaXMubm9uSG90c3dhcHBhYmxlUHJvcHMpO1xuICAgIGlmIChub25Ib3Rzd2FwcGFibGVQcm9wTmFtZXMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgdGFnT25seUNoYW5nZSA9IG5vbkhvdHN3YXBwYWJsZVByb3BOYW1lcy5sZW5ndGggPT09IDEgJiYgbm9uSG90c3dhcHBhYmxlUHJvcE5hbWVzWzBdID09PSAnVGFncyc7XG4gICAgICBjb25zdCByZWFzb24gPSB0YWdPbmx5Q2hhbmdlID8gTm9uSG90c3dhcHBhYmxlUmVhc29uLlRBR1MgOiBOb25Ib3Rzd2FwcGFibGVSZWFzb24uUFJPUEVSVElFUztcbiAgICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gdGFnT25seUNoYW5nZSA/ICdUYWdzIGFyZSBub3QgaG90c3dhcHBhYmxlJyA6IGByZXNvdXJjZSBwcm9wZXJ0aWVzICcke25vbkhvdHN3YXBwYWJsZVByb3BOYW1lc30nIGFyZSBub3QgaG90c3dhcHBhYmxlIG9uIHRoaXMgcmVzb3VyY2UgdHlwZWA7XG5cbiAgICAgIHJldC5wdXNoKG5vbkhvdHN3YXBwYWJsZUNoYW5nZShcbiAgICAgICAgdGhpcy5jaGFuZ2UsXG4gICAgICAgIHJlYXNvbixcbiAgICAgICAgZGVzY3JpcHRpb24sXG4gICAgICAgIHRoaXMubm9uSG90c3dhcHBhYmxlUHJvcHMsXG4gICAgICApKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0IG5hbWVzT2ZIb3Rzd2FwcGFibGVQcm9wcygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuaG90c3dhcHBhYmxlUHJvcHMpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjbGFzc2lmeUNoYW5nZXMoeHM6IFJlc291cmNlQ2hhbmdlLCBob3Rzd2FwcGFibGVQcm9wTmFtZXM6IHN0cmluZ1tdKTogQ2xhc3NpZmllZENoYW5nZXMge1xuICBjb25zdCBob3Rzd2FwcGFibGVQcm9wczogUHJvcERpZmZzID0ge307XG4gIGNvbnN0IG5vbkhvdHN3YXBwYWJsZVByb3BzOiBQcm9wRGlmZnMgPSB7fTtcblxuICBmb3IgKGNvbnN0IFtuYW1lLCBwcm9wRGlmZl0gb2YgT2JqZWN0LmVudHJpZXMoeHMucHJvcGVydHlVcGRhdGVzKSkge1xuICAgIGlmIChob3Rzd2FwcGFibGVQcm9wTmFtZXMuaW5jbHVkZXMobmFtZSkpIHtcbiAgICAgIGhvdHN3YXBwYWJsZVByb3BzW25hbWVdID0gcHJvcERpZmY7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5vbkhvdHN3YXBwYWJsZVByb3BzW25hbWVdID0gcHJvcERpZmY7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ldyBDbGFzc2lmaWVkQ2hhbmdlcyh4cywgaG90c3dhcHBhYmxlUHJvcHMsIG5vbkhvdHN3YXBwYWJsZVByb3BzKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG5vbkhvdHN3YXBwYWJsZUNoYW5nZShcbiAgY2hhbmdlOiBSZXNvdXJjZUNoYW5nZSxcbiAgcmVhc29uOiBOb25Ib3Rzd2FwcGFibGVSZWFzb24sXG4gIGRlc2NyaXB0aW9uOiBzdHJpbmcsXG4gIG5vbkhvdHN3YXBwYWJsZVByb3BzPzogUHJvcERpZmZzLFxuICBob3Rzd2FwT25seVZpc2libGU6IGJvb2xlYW4gPSB0cnVlLFxuKTogUmVqZWN0ZWRDaGFuZ2Uge1xuICByZXR1cm4ge1xuICAgIGhvdHN3YXBwYWJsZTogZmFsc2UsXG4gICAgaG90c3dhcE9ubHlWaXNpYmxlLFxuICAgIGNoYW5nZToge1xuICAgICAgcmVhc29uLFxuICAgICAgZGVzY3JpcHRpb24sXG4gICAgICBzdWJqZWN0OiB7XG4gICAgICAgIHR5cGU6ICdSZXNvdXJjZScsXG4gICAgICAgIGxvZ2ljYWxJZDogY2hhbmdlLmxvZ2ljYWxJZCxcbiAgICAgICAgcmVzb3VyY2VUeXBlOiBjaGFuZ2UubmV3VmFsdWUuVHlwZSxcbiAgICAgICAgcmVqZWN0ZWRQcm9wZXJ0aWVzOiBPYmplY3Qua2V5cyhub25Ib3Rzd2FwcGFibGVQcm9wcyA/PyBjaGFuZ2UucHJvcGVydHlVcGRhdGVzKSxcbiAgICAgICAgbWV0YWRhdGE6IGNoYW5nZS5tZXRhZGF0YSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG5vbkhvdHN3YXBwYWJsZVJlc291cmNlKGNoYW5nZTogUmVzb3VyY2VDaGFuZ2UpOiBSZWplY3RlZENoYW5nZSB7XG4gIHJldHVybiB7XG4gICAgaG90c3dhcHBhYmxlOiBmYWxzZSxcbiAgICBjaGFuZ2U6IHtcbiAgICAgIHJlYXNvbjogTm9uSG90c3dhcHBhYmxlUmVhc29uLlJFU09VUkNFX1VOU1VQUE9SVEVELFxuICAgICAgZGVzY3JpcHRpb246ICdUaGlzIHJlc291cmNlIHR5cGUgaXMgbm90IHN1cHBvcnRlZCBmb3IgaG90c3dhcCBkZXBsb3ltZW50cycsXG4gICAgICBzdWJqZWN0OiB7XG4gICAgICAgIHR5cGU6ICdSZXNvdXJjZScsXG4gICAgICAgIGxvZ2ljYWxJZDogY2hhbmdlLmxvZ2ljYWxJZCxcbiAgICAgICAgcmVzb3VyY2VUeXBlOiBjaGFuZ2UubmV3VmFsdWUuVHlwZSxcbiAgICAgICAgcmVqZWN0ZWRQcm9wZXJ0aWVzOiBPYmplY3Qua2V5cyhjaGFuZ2UucHJvcGVydHlVcGRhdGVzKSxcbiAgICAgICAgbWV0YWRhdGE6IGNoYW5nZS5tZXRhZGF0YSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfTtcbn1cbiJdfQ==
@@ -0,0 +1,4 @@
1
+ import type { HotswapPropertyOverrides, HotswapChange } from './common';
2
+ import { type ResourceChange } from '../../payloads/hotswap';
3
+ import type { EvaluateCloudFormationTemplate } from '../cloudformation';
4
+ export declare function isHotswappableEcsServiceChange(logicalId: string, change: ResourceChange, evaluateCfnTemplate: EvaluateCloudFormationTemplate, hotswapPropertyOverrides: HotswapPropertyOverrides): Promise<HotswapChange[]>;
@@ -0,0 +1,159 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isHotswappableEcsServiceChange = isHotswappableEcsServiceChange;
4
+ const common_1 = require("./common");
5
+ const hotswap_1 = require("../../payloads/hotswap");
6
+ const util_1 = require("../../util");
7
+ const ECS_SERVICE_RESOURCE_TYPE = 'AWS::ECS::Service';
8
+ async function isHotswappableEcsServiceChange(logicalId, change, evaluateCfnTemplate, hotswapPropertyOverrides) {
9
+ // the only resource change we can evaluate here is an ECS TaskDefinition
10
+ if (change.newValue.Type !== 'AWS::ECS::TaskDefinition') {
11
+ return [];
12
+ }
13
+ const ret = [];
14
+ // We only allow a change in the ContainerDefinitions of the TaskDefinition for now -
15
+ // it contains the image and environment variables, so seems like a safe bet for now.
16
+ // We might revisit this decision in the future though!
17
+ const classifiedChanges = (0, common_1.classifyChanges)(change, ['ContainerDefinitions']);
18
+ classifiedChanges.reportNonHotswappablePropertyChanges(ret);
19
+ // find all ECS Services that reference the TaskDefinition that changed
20
+ const resourcesReferencingTaskDef = evaluateCfnTemplate.findReferencesTo(logicalId);
21
+ const ecsServiceResourcesReferencingTaskDef = resourcesReferencingTaskDef.filter((r) => r.Type === ECS_SERVICE_RESOURCE_TYPE);
22
+ const ecsServicesReferencingTaskDef = new Array();
23
+ for (const ecsServiceResource of ecsServiceResourcesReferencingTaskDef) {
24
+ const serviceArn = await evaluateCfnTemplate.findPhysicalNameFor(ecsServiceResource.LogicalId);
25
+ if (serviceArn) {
26
+ ecsServicesReferencingTaskDef.push({
27
+ logicalId: ecsServiceResource.LogicalId,
28
+ serviceArn,
29
+ });
30
+ }
31
+ }
32
+ if (ecsServicesReferencingTaskDef.length === 0) {
33
+ /**
34
+ * ECS Services can have a task definition that doesn't refer to the task definition being updated.
35
+ * We have to log this as a non-hotswappable change to the task definition, but when we do,
36
+ * we wind up hotswapping the task definition and logging it as a non-hotswappable change.
37
+ *
38
+ * This logic prevents us from logging that change as non-hotswappable when we hotswap it.
39
+ */
40
+ ret.push((0, common_1.nonHotswappableChange)(change, hotswap_1.NonHotswappableReason.DEPENDENCY_UNSUPPORTED, 'No ECS services reference the changed task definition', undefined, false));
41
+ }
42
+ if (resourcesReferencingTaskDef.length > ecsServicesReferencingTaskDef.length) {
43
+ // if something besides an ECS Service is referencing the TaskDefinition,
44
+ // hotswap is not possible in FALL_BACK mode
45
+ const nonEcsServiceTaskDefRefs = resourcesReferencingTaskDef.filter((r) => r.Type !== ECS_SERVICE_RESOURCE_TYPE);
46
+ for (const taskRef of nonEcsServiceTaskDefRefs) {
47
+ ret.push((0, common_1.nonHotswappableChange)(change, hotswap_1.NonHotswappableReason.DEPENDENCY_UNSUPPORTED, `A resource '${taskRef.LogicalId}' with Type '${taskRef.Type}' that is not an ECS Service was found referencing the changed TaskDefinition '${logicalId}'`));
48
+ }
49
+ }
50
+ const namesOfHotswappableChanges = Object.keys(classifiedChanges.hotswappableProps);
51
+ if (namesOfHotswappableChanges.length > 0) {
52
+ const taskDefinitionResource = await prepareTaskDefinitionChange(evaluateCfnTemplate, logicalId, change);
53
+ ret.push({
54
+ change: {
55
+ cause: change,
56
+ resources: [
57
+ {
58
+ logicalId,
59
+ resourceType: change.newValue.Type,
60
+ physicalName: await taskDefinitionResource.Family,
61
+ metadata: evaluateCfnTemplate.metadataFor(logicalId),
62
+ },
63
+ ...ecsServicesReferencingTaskDef.map((ecsService) => ({
64
+ resourceType: ECS_SERVICE_RESOURCE_TYPE,
65
+ physicalName: ecsService.serviceArn.split('/')[2],
66
+ logicalId: ecsService.logicalId,
67
+ metadata: evaluateCfnTemplate.metadataFor(ecsService.logicalId),
68
+ })),
69
+ ],
70
+ },
71
+ hotswappable: true,
72
+ service: 'ecs-service',
73
+ apply: async (sdk) => {
74
+ // Step 1 - update the changed TaskDefinition, creating a new TaskDefinition Revision
75
+ // we need to lowercase the evaluated TaskDef from CloudFormation,
76
+ // as the AWS SDK uses lowercase property names for these
77
+ // The SDK requires more properties here than its worth doing explicit typing for
78
+ // instead, just use all the old values in the diff to fill them in implicitly
79
+ const lowercasedTaskDef = (0, util_1.transformObjectKeys)(taskDefinitionResource, util_1.lowerCaseFirstCharacter, {
80
+ // All the properties that take arbitrary string as keys i.e. { "string" : "string" }
81
+ // https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_RegisterTaskDefinition.html#API_RegisterTaskDefinition_RequestSyntax
82
+ ContainerDefinitions: {
83
+ DockerLabels: true,
84
+ FirelensConfiguration: {
85
+ Options: true,
86
+ },
87
+ LogConfiguration: {
88
+ Options: true,
89
+ },
90
+ },
91
+ Volumes: {
92
+ DockerVolumeConfiguration: {
93
+ DriverOpts: true,
94
+ Labels: true,
95
+ },
96
+ },
97
+ });
98
+ const registerTaskDefResponse = await sdk.ecs().registerTaskDefinition(lowercasedTaskDef);
99
+ const taskDefRevArn = registerTaskDefResponse.taskDefinition?.taskDefinitionArn;
100
+ let ecsHotswapProperties = hotswapPropertyOverrides.ecsHotswapProperties;
101
+ let minimumHealthyPercent = ecsHotswapProperties?.minimumHealthyPercent;
102
+ let maximumHealthyPercent = ecsHotswapProperties?.maximumHealthyPercent;
103
+ // Step 2 - update the services using that TaskDefinition to point to the new TaskDefinition Revision
104
+ // Forcing New Deployment and setting Minimum Healthy Percent to 0.
105
+ // As CDK HotSwap is development only, this seems the most efficient way to ensure all tasks are replaced immediately, regardless of original amount
106
+ // eslint-disable-next-line @cdklabs/promiseall-no-unbounded-parallelism
107
+ await Promise.all(ecsServicesReferencingTaskDef.map(async (service) => {
108
+ const cluster = service.serviceArn.split('/')[1];
109
+ const update = await sdk.ecs().updateService({
110
+ service: service.serviceArn,
111
+ taskDefinition: taskDefRevArn,
112
+ cluster,
113
+ forceNewDeployment: true,
114
+ deploymentConfiguration: {
115
+ minimumHealthyPercent: minimumHealthyPercent !== undefined ? minimumHealthyPercent : 0,
116
+ maximumPercent: maximumHealthyPercent !== undefined ? maximumHealthyPercent : undefined,
117
+ },
118
+ });
119
+ await sdk.ecs().waitUntilServicesStable({
120
+ cluster: update.service?.clusterArn,
121
+ services: [service.serviceArn],
122
+ });
123
+ }));
124
+ },
125
+ });
126
+ }
127
+ return ret;
128
+ }
129
+ async function prepareTaskDefinitionChange(evaluateCfnTemplate, logicalId, change) {
130
+ const taskDefinitionResource = {
131
+ ...change.oldValue.Properties,
132
+ ContainerDefinitions: change.newValue.Properties?.ContainerDefinitions,
133
+ };
134
+ // first, let's get the name of the family
135
+ const familyNameOrArn = await evaluateCfnTemplate.establishResourcePhysicalName(logicalId, taskDefinitionResource?.Family);
136
+ if (!familyNameOrArn) {
137
+ // if the Family property has not been provided, and we can't find it in the current Stack,
138
+ // this means hotswapping is not possible
139
+ return;
140
+ }
141
+ // the physical name of the Task Definition in CloudFormation includes its current revision number at the end,
142
+ // remove it if needed
143
+ const familyNameOrArnParts = familyNameOrArn.split(':');
144
+ const family = familyNameOrArnParts.length > 1
145
+ ? // familyNameOrArn is actually an ARN, of the format 'arn:aws:ecs:region:account:task-definition/<family-name>:<revision-nr>'
146
+ // so, take the 6th element, at index 5, and split it on '/'
147
+ familyNameOrArnParts[5].split('/')[1]
148
+ : // otherwise, familyNameOrArn is just the simple name evaluated from the CloudFormation template
149
+ familyNameOrArn;
150
+ // then, let's evaluate the body of the remainder of the TaskDef (without the Family property)
151
+ return {
152
+ ...(await evaluateCfnTemplate.evaluateCfnExpression({
153
+ ...(taskDefinitionResource ?? {}),
154
+ Family: undefined,
155
+ })),
156
+ Family: family,
157
+ };
158
+ }
159
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWNzLXNlcnZpY2VzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZWNzLXNlcnZpY2VzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBZUEsd0VBb0pDO0FBL0pELHFDQUdrQjtBQUNsQixvREFBb0Y7QUFDcEYscUNBQTBFO0FBSTFFLE1BQU0seUJBQXlCLEdBQUcsbUJBQW1CLENBQUM7QUFFL0MsS0FBSyxVQUFVLDhCQUE4QixDQUNsRCxTQUFpQixFQUNqQixNQUFzQixFQUN0QixtQkFBbUQsRUFDbkQsd0JBQWtEO0lBRWxELHlFQUF5RTtJQUN6RSxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxLQUFLLDBCQUEwQixFQUFFLENBQUM7UUFDeEQsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0lBRUQsTUFBTSxHQUFHLEdBQW9CLEVBQUUsQ0FBQztJQUVoQyxxRkFBcUY7SUFDckYscUZBQXFGO0lBQ3JGLHVEQUF1RDtJQUN2RCxNQUFNLGlCQUFpQixHQUFHLElBQUEsd0JBQWUsRUFBQyxNQUFNLEVBQUUsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLENBQUM7SUFDNUUsaUJBQWlCLENBQUMsb0NBQW9DLENBQUMsR0FBRyxDQUFDLENBQUM7SUFFNUQsdUVBQXVFO0lBQ3ZFLE1BQU0sMkJBQTJCLEdBQUcsbUJBQW1CLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDcEYsTUFBTSxxQ0FBcUMsR0FBRywyQkFBMkIsQ0FBQyxNQUFNLENBQzlFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLHlCQUF5QixDQUM1QyxDQUFDO0lBQ0YsTUFBTSw2QkFBNkIsR0FBRyxJQUFJLEtBQUssRUFBYyxDQUFDO0lBQzlELEtBQUssTUFBTSxrQkFBa0IsSUFBSSxxQ0FBcUMsRUFBRSxDQUFDO1FBQ3ZFLE1BQU0sVUFBVSxHQUFHLE1BQU0sbUJBQW1CLENBQUMsbUJBQW1CLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDL0YsSUFBSSxVQUFVLEVBQUUsQ0FBQztZQUNmLDZCQUE2QixDQUFDLElBQUksQ0FBQztnQkFDakMsU0FBUyxFQUFFLGtCQUFrQixDQUFDLFNBQVM7Z0JBQ3ZDLFVBQVU7YUFDWCxDQUFDLENBQUM7UUFDTCxDQUFDO0lBQ0gsQ0FBQztJQUNELElBQUksNkJBQTZCLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQy9DOzs7Ozs7V0FNRztRQUNILEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBQSw4QkFBcUIsRUFDNUIsTUFBTSxFQUNOLCtCQUFxQixDQUFDLHNCQUFzQixFQUM1Qyx1REFBdUQsRUFDdkQsU0FBUyxFQUNULEtBQUssQ0FDTixDQUFDLENBQUM7SUFDTCxDQUFDO0lBQ0QsSUFBSSwyQkFBMkIsQ0FBQyxNQUFNLEdBQUcsNkJBQTZCLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDOUUseUVBQXlFO1FBQ3pFLDRDQUE0QztRQUM1QyxNQUFNLHdCQUF3QixHQUFHLDJCQUEyQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyx5QkFBeUIsQ0FBQyxDQUFDO1FBQ2pILEtBQUssTUFBTSxPQUFPLElBQUksd0JBQXdCLEVBQUUsQ0FBQztZQUMvQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUEsOEJBQXFCLEVBQzVCLE1BQU0sRUFDTiwrQkFBcUIsQ0FBQyxzQkFBc0IsRUFDNUMsZUFBZSxPQUFPLENBQUMsU0FBUyxnQkFBZ0IsT0FBTyxDQUFDLElBQUksa0ZBQWtGLFNBQVMsR0FBRyxDQUMzSixDQUFDLENBQUM7UUFDTCxDQUFDO0lBQ0gsQ0FBQztJQUVELE1BQU0sMEJBQTBCLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0lBQ3BGLElBQUksMEJBQTBCLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQzFDLE1BQU0sc0JBQXNCLEdBQUcsTUFBTSwyQkFBMkIsQ0FBQyxtQkFBbUIsRUFBRSxTQUFTLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDekcsR0FBRyxDQUFDLElBQUksQ0FBQztZQUNQLE1BQU0sRUFBRTtnQkFDTixLQUFLLEVBQUUsTUFBTTtnQkFDYixTQUFTLEVBQUU7b0JBQ1Q7d0JBQ0UsU0FBUzt3QkFDVCxZQUFZLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJO3dCQUNsQyxZQUFZLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQyxNQUFNO3dCQUNqRCxRQUFRLEVBQUUsbUJBQW1CLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQztxQkFDckQ7b0JBQ0QsR0FBRyw2QkFBNkIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLENBQUM7d0JBQ3BELFlBQVksRUFBRSx5QkFBeUI7d0JBQ3ZDLFlBQVksRUFBRSxVQUFVLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7d0JBQ2pELFNBQVMsRUFBRSxVQUFVLENBQUMsU0FBUzt3QkFDL0IsUUFBUSxFQUFFLG1CQUFtQixDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDO3FCQUNoRSxDQUFDLENBQUM7aUJBQ0o7YUFDRjtZQUNELFlBQVksRUFBRSxJQUFJO1lBQ2xCLE9BQU8sRUFBRSxhQUFhO1lBQ3RCLEtBQUssRUFBRSxLQUFLLEVBQUUsR0FBUSxFQUFFLEVBQUU7Z0JBQ3hCLHFGQUFxRjtnQkFDckYsa0VBQWtFO2dCQUNsRSx5REFBeUQ7Z0JBRXpELGlGQUFpRjtnQkFDakYsOEVBQThFO2dCQUM5RSxNQUFNLGlCQUFpQixHQUFHLElBQUEsMEJBQW1CLEVBQUMsc0JBQXNCLEVBQUUsOEJBQXVCLEVBQUU7b0JBQzdGLHFGQUFxRjtvQkFDckYscUlBQXFJO29CQUNySSxvQkFBb0IsRUFBRTt3QkFDcEIsWUFBWSxFQUFFLElBQUk7d0JBQ2xCLHFCQUFxQixFQUFFOzRCQUNyQixPQUFPLEVBQUUsSUFBSTt5QkFDZDt3QkFDRCxnQkFBZ0IsRUFBRTs0QkFDaEIsT0FBTyxFQUFFLElBQUk7eUJBQ2Q7cUJBQ0Y7b0JBQ0QsT0FBTyxFQUFFO3dCQUNQLHlCQUF5QixFQUFFOzRCQUN6QixVQUFVLEVBQUUsSUFBSTs0QkFDaEIsTUFBTSxFQUFFLElBQUk7eUJBQ2I7cUJBQ0Y7aUJBQ0YsQ0FBQyxDQUFDO2dCQUNILE1BQU0sdUJBQXVCLEdBQUcsTUFBTSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsc0JBQXNCLENBQUMsaUJBQWlCLENBQUMsQ0FBQztnQkFDMUYsTUFBTSxhQUFhLEdBQUcsdUJBQXVCLENBQUMsY0FBYyxFQUFFLGlCQUFpQixDQUFDO2dCQUVoRixJQUFJLG9CQUFvQixHQUFHLHdCQUF3QixDQUFDLG9CQUFvQixDQUFDO2dCQUN6RSxJQUFJLHFCQUFxQixHQUFHLG9CQUFvQixFQUFFLHFCQUFxQixDQUFDO2dCQUN4RSxJQUFJLHFCQUFxQixHQUFHLG9CQUFvQixFQUFFLHFCQUFxQixDQUFDO2dCQUV4RSxxR0FBcUc7Z0JBQ3JHLG1FQUFtRTtnQkFDbkUsb0pBQW9KO2dCQUNwSix3RUFBd0U7Z0JBQ3hFLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FDZiw2QkFBNkIsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxFQUFFO29CQUNsRCxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDakQsTUFBTSxNQUFNLEdBQUcsTUFBTSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsYUFBYSxDQUFDO3dCQUMzQyxPQUFPLEVBQUUsT0FBTyxDQUFDLFVBQVU7d0JBQzNCLGNBQWMsRUFBRSxhQUFhO3dCQUM3QixPQUFPO3dCQUNQLGtCQUFrQixFQUFFLElBQUk7d0JBQ3hCLHVCQUF1QixFQUFFOzRCQUN2QixxQkFBcUIsRUFBRSxxQkFBcUIsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxDQUFDOzRCQUN0RixjQUFjLEVBQUUscUJBQXFCLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsU0FBUzt5QkFDeEY7cUJBQ0YsQ0FBQyxDQUFDO29CQUVILE1BQU0sR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLHVCQUF1QixDQUFDO3dCQUN0QyxPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU8sRUFBRSxVQUFVO3dCQUNuQyxRQUFRLEVBQUUsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDO3FCQUMvQixDQUFDLENBQUM7Z0JBQ0wsQ0FBQyxDQUFDLENBQ0gsQ0FBQztZQUNKLENBQUM7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBT0QsS0FBSyxVQUFVLDJCQUEyQixDQUN4QyxtQkFBbUQsRUFDbkQsU0FBaUIsRUFDakIsTUFBc0I7SUFFdEIsTUFBTSxzQkFBc0IsR0FBNEI7UUFDdEQsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLFVBQVU7UUFDN0Isb0JBQW9CLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsb0JBQW9CO0tBQ3ZFLENBQUM7SUFDRiwwQ0FBMEM7SUFDMUMsTUFBTSxlQUFlLEdBQUcsTUFBTSxtQkFBbUIsQ0FBQyw2QkFBNkIsQ0FDN0UsU0FBUyxFQUNULHNCQUFzQixFQUFFLE1BQU0sQ0FDL0IsQ0FBQztJQUNGLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUNyQiwyRkFBMkY7UUFDM0YseUNBQXlDO1FBQ3pDLE9BQU87SUFDVCxDQUFDO0lBQ0QsOEdBQThHO0lBQzlHLHNCQUFzQjtJQUN0QixNQUFNLG9CQUFvQixHQUFHLGVBQWUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDeEQsTUFBTSxNQUFNLEdBQ1Ysb0JBQW9CLENBQUMsTUFBTSxHQUFHLENBQUM7UUFDN0IsQ0FBQyxDQUFDLDZIQUE2SDtZQUNqSSw0REFBNEQ7WUFDMUQsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNyQyxDQUFDLENBQUMsZ0dBQWdHO1lBQ2xHLGVBQWUsQ0FBQztJQUNwQiw4RkFBOEY7SUFDOUYsT0FBTztRQUNMLEdBQUcsQ0FBQyxNQUFNLG1CQUFtQixDQUFDLHFCQUFxQixDQUFDO1lBQ2xELEdBQUcsQ0FBQyxzQkFBc0IsSUFBSSxFQUFFLENBQUM7WUFDakMsTUFBTSxFQUFFLFNBQVM7U0FDbEIsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxFQUFFLE1BQU07S0FDZixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHtcbiAgSG90c3dhcFByb3BlcnR5T3ZlcnJpZGVzLFxuICBIb3Rzd2FwQ2hhbmdlLFxufSBmcm9tICcuL2NvbW1vbic7XG5pbXBvcnQge1xuICBjbGFzc2lmeUNoYW5nZXMsXG4gIG5vbkhvdHN3YXBwYWJsZUNoYW5nZSxcbn0gZnJvbSAnLi9jb21tb24nO1xuaW1wb3J0IHsgTm9uSG90c3dhcHBhYmxlUmVhc29uLCB0eXBlIFJlc291cmNlQ2hhbmdlIH0gZnJvbSAnLi4vLi4vcGF5bG9hZHMvaG90c3dhcCc7XG5pbXBvcnQgeyBsb3dlckNhc2VGaXJzdENoYXJhY3RlciwgdHJhbnNmb3JtT2JqZWN0S2V5cyB9IGZyb20gJy4uLy4uL3V0aWwnO1xuaW1wb3J0IHR5cGUgeyBTREsgfSBmcm9tICcuLi9hd3MtYXV0aC9wcml2YXRlJztcbmltcG9ydCB0eXBlIHsgRXZhbHVhdGVDbG91ZEZvcm1hdGlvblRlbXBsYXRlIH0gZnJvbSAnLi4vY2xvdWRmb3JtYXRpb24nO1xuXG5jb25zdCBFQ1NfU0VSVklDRV9SRVNPVVJDRV9UWVBFID0gJ0FXUzo6RUNTOjpTZXJ2aWNlJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGlzSG90c3dhcHBhYmxlRWNzU2VydmljZUNoYW5nZShcbiAgbG9naWNhbElkOiBzdHJpbmcsXG4gIGNoYW5nZTogUmVzb3VyY2VDaGFuZ2UsXG4gIGV2YWx1YXRlQ2ZuVGVtcGxhdGU6IEV2YWx1YXRlQ2xvdWRGb3JtYXRpb25UZW1wbGF0ZSxcbiAgaG90c3dhcFByb3BlcnR5T3ZlcnJpZGVzOiBIb3Rzd2FwUHJvcGVydHlPdmVycmlkZXMsXG4pOiBQcm9taXNlPEhvdHN3YXBDaGFuZ2VbXT4ge1xuICAvLyB0aGUgb25seSByZXNvdXJjZSBjaGFuZ2Ugd2UgY2FuIGV2YWx1YXRlIGhlcmUgaXMgYW4gRUNTIFRhc2tEZWZpbml0aW9uXG4gIGlmIChjaGFuZ2UubmV3VmFsdWUuVHlwZSAhPT0gJ0FXUzo6RUNTOjpUYXNrRGVmaW5pdGlvbicpIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBjb25zdCByZXQ6IEhvdHN3YXBDaGFuZ2VbXSA9IFtdO1xuXG4gIC8vIFdlIG9ubHkgYWxsb3cgYSBjaGFuZ2UgaW4gdGhlIENvbnRhaW5lckRlZmluaXRpb25zIG9mIHRoZSBUYXNrRGVmaW5pdGlvbiBmb3Igbm93IC1cbiAgLy8gaXQgY29udGFpbnMgdGhlIGltYWdlIGFuZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMsIHNvIHNlZW1zIGxpa2UgYSBzYWZlIGJldCBmb3Igbm93LlxuICAvLyBXZSBtaWdodCByZXZpc2l0IHRoaXMgZGVjaXNpb24gaW4gdGhlIGZ1dHVyZSB0aG91Z2ghXG4gIGNvbnN0IGNsYXNzaWZpZWRDaGFuZ2VzID0gY2xhc3NpZnlDaGFuZ2VzKGNoYW5nZSwgWydDb250YWluZXJEZWZpbml0aW9ucyddKTtcbiAgY2xhc3NpZmllZENoYW5nZXMucmVwb3J0Tm9uSG90c3dhcHBhYmxlUHJvcGVydHlDaGFuZ2VzKHJldCk7XG5cbiAgLy8gZmluZCBhbGwgRUNTIFNlcnZpY2VzIHRoYXQgcmVmZXJlbmNlIHRoZSBUYXNrRGVmaW5pdGlvbiB0aGF0IGNoYW5nZWRcbiAgY29uc3QgcmVzb3VyY2VzUmVmZXJlbmNpbmdUYXNrRGVmID0gZXZhbHVhdGVDZm5UZW1wbGF0ZS5maW5kUmVmZXJlbmNlc1RvKGxvZ2ljYWxJZCk7XG4gIGNvbnN0IGVjc1NlcnZpY2VSZXNvdXJjZXNSZWZlcmVuY2luZ1Rhc2tEZWYgPSByZXNvdXJjZXNSZWZlcmVuY2luZ1Rhc2tEZWYuZmlsdGVyKFxuICAgIChyKSA9PiByLlR5cGUgPT09IEVDU19TRVJWSUNFX1JFU09VUkNFX1RZUEUsXG4gICk7XG4gIGNvbnN0IGVjc1NlcnZpY2VzUmVmZXJlbmNpbmdUYXNrRGVmID0gbmV3IEFycmF5PEVjc1NlcnZpY2U+KCk7XG4gIGZvciAoY29uc3QgZWNzU2VydmljZVJlc291cmNlIG9mIGVjc1NlcnZpY2VSZXNvdXJjZXNSZWZlcmVuY2luZ1Rhc2tEZWYpIHtcbiAgICBjb25zdCBzZXJ2aWNlQXJuID0gYXdhaXQgZXZhbHVhdGVDZm5UZW1wbGF0ZS5maW5kUGh5c2ljYWxOYW1lRm9yKGVjc1NlcnZpY2VSZXNvdXJjZS5Mb2dpY2FsSWQpO1xuICAgIGlmIChzZXJ2aWNlQXJuKSB7XG4gICAgICBlY3NTZXJ2aWNlc1JlZmVyZW5jaW5nVGFza0RlZi5wdXNoKHtcbiAgICAgICAgbG9naWNhbElkOiBlY3NTZXJ2aWNlUmVzb3VyY2UuTG9naWNhbElkLFxuICAgICAgICBzZXJ2aWNlQXJuLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIGlmIChlY3NTZXJ2aWNlc1JlZmVyZW5jaW5nVGFza0RlZi5sZW5ndGggPT09IDApIHtcbiAgICAvKipcbiAgICAgKiBFQ1MgU2VydmljZXMgY2FuIGhhdmUgYSB0YXNrIGRlZmluaXRpb24gdGhhdCBkb2Vzbid0IHJlZmVyIHRvIHRoZSB0YXNrIGRlZmluaXRpb24gYmVpbmcgdXBkYXRlZC5cbiAgICAgKiBXZSBoYXZlIHRvIGxvZyB0aGlzIGFzIGEgbm9uLWhvdHN3YXBwYWJsZSBjaGFuZ2UgdG8gdGhlIHRhc2sgZGVmaW5pdGlvbiwgYnV0IHdoZW4gd2UgZG8sXG4gICAgICogd2Ugd2luZCB1cCBob3Rzd2FwcGluZyB0aGUgdGFzayBkZWZpbml0aW9uIGFuZCBsb2dnaW5nIGl0IGFzIGEgbm9uLWhvdHN3YXBwYWJsZSBjaGFuZ2UuXG4gICAgICpcbiAgICAgKiBUaGlzIGxvZ2ljIHByZXZlbnRzIHVzIGZyb20gbG9nZ2luZyB0aGF0IGNoYW5nZSBhcyBub24taG90c3dhcHBhYmxlIHdoZW4gd2UgaG90c3dhcCBpdC5cbiAgICAgKi9cbiAgICByZXQucHVzaChub25Ib3Rzd2FwcGFibGVDaGFuZ2UoXG4gICAgICBjaGFuZ2UsXG4gICAgICBOb25Ib3Rzd2FwcGFibGVSZWFzb24uREVQRU5ERU5DWV9VTlNVUFBPUlRFRCxcbiAgICAgICdObyBFQ1Mgc2VydmljZXMgcmVmZXJlbmNlIHRoZSBjaGFuZ2VkIHRhc2sgZGVmaW5pdGlvbicsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICBmYWxzZSxcbiAgICApKTtcbiAgfVxuICBpZiAocmVzb3VyY2VzUmVmZXJlbmNpbmdUYXNrRGVmLmxlbmd0aCA+IGVjc1NlcnZpY2VzUmVmZXJlbmNpbmdUYXNrRGVmLmxlbmd0aCkge1xuICAgIC8vIGlmIHNvbWV0aGluZyBiZXNpZGVzIGFuIEVDUyBTZXJ2aWNlIGlzIHJlZmVyZW5jaW5nIHRoZSBUYXNrRGVmaW5pdGlvbixcbiAgICAvLyBob3Rzd2FwIGlzIG5vdCBwb3NzaWJsZSBpbiBGQUxMX0JBQ0sgbW9kZVxuICAgIGNvbnN0IG5vbkVjc1NlcnZpY2VUYXNrRGVmUmVmcyA9IHJlc291cmNlc1JlZmVyZW5jaW5nVGFza0RlZi5maWx0ZXIoKHIpID0+IHIuVHlwZSAhPT0gRUNTX1NFUlZJQ0VfUkVTT1VSQ0VfVFlQRSk7XG4gICAgZm9yIChjb25zdCB0YXNrUmVmIG9mIG5vbkVjc1NlcnZpY2VUYXNrRGVmUmVmcykge1xuICAgICAgcmV0LnB1c2gobm9uSG90c3dhcHBhYmxlQ2hhbmdlKFxuICAgICAgICBjaGFuZ2UsXG4gICAgICAgIE5vbkhvdHN3YXBwYWJsZVJlYXNvbi5ERVBFTkRFTkNZX1VOU1VQUE9SVEVELFxuICAgICAgICBgQSByZXNvdXJjZSAnJHt0YXNrUmVmLkxvZ2ljYWxJZH0nIHdpdGggVHlwZSAnJHt0YXNrUmVmLlR5cGV9JyB0aGF0IGlzIG5vdCBhbiBFQ1MgU2VydmljZSB3YXMgZm91bmQgcmVmZXJlbmNpbmcgdGhlIGNoYW5nZWQgVGFza0RlZmluaXRpb24gJyR7bG9naWNhbElkfSdgLFxuICAgICAgKSk7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgbmFtZXNPZkhvdHN3YXBwYWJsZUNoYW5nZXMgPSBPYmplY3Qua2V5cyhjbGFzc2lmaWVkQ2hhbmdlcy5ob3Rzd2FwcGFibGVQcm9wcyk7XG4gIGlmIChuYW1lc09mSG90c3dhcHBhYmxlQ2hhbmdlcy5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgdGFza0RlZmluaXRpb25SZXNvdXJjZSA9IGF3YWl0IHByZXBhcmVUYXNrRGVmaW5pdGlvbkNoYW5nZShldmFsdWF0ZUNmblRlbXBsYXRlLCBsb2dpY2FsSWQsIGNoYW5nZSk7XG4gICAgcmV0LnB1c2goe1xuICAgICAgY2hhbmdlOiB7XG4gICAgICAgIGNhdXNlOiBjaGFuZ2UsXG4gICAgICAgIHJlc291cmNlczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGxvZ2ljYWxJZCxcbiAgICAgICAgICAgIHJlc291cmNlVHlwZTogY2hhbmdlLm5ld1ZhbHVlLlR5cGUsXG4gICAgICAgICAgICBwaHlzaWNhbE5hbWU6IGF3YWl0IHRhc2tEZWZpbml0aW9uUmVzb3VyY2UuRmFtaWx5LFxuICAgICAgICAgICAgbWV0YWRhdGE6IGV2YWx1YXRlQ2ZuVGVtcGxhdGUubWV0YWRhdGFGb3IobG9naWNhbElkKSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIC4uLmVjc1NlcnZpY2VzUmVmZXJlbmNpbmdUYXNrRGVmLm1hcCgoZWNzU2VydmljZSkgPT4gKHtcbiAgICAgICAgICAgIHJlc291cmNlVHlwZTogRUNTX1NFUlZJQ0VfUkVTT1VSQ0VfVFlQRSxcbiAgICAgICAgICAgIHBoeXNpY2FsTmFtZTogZWNzU2VydmljZS5zZXJ2aWNlQXJuLnNwbGl0KCcvJylbMl0sXG4gICAgICAgICAgICBsb2dpY2FsSWQ6IGVjc1NlcnZpY2UubG9naWNhbElkLFxuICAgICAgICAgICAgbWV0YWRhdGE6IGV2YWx1YXRlQ2ZuVGVtcGxhdGUubWV0YWRhdGFGb3IoZWNzU2VydmljZS5sb2dpY2FsSWQpLFxuICAgICAgICAgIH0pKSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgICBob3Rzd2FwcGFibGU6IHRydWUsXG4gICAgICBzZXJ2aWNlOiAnZWNzLXNlcnZpY2UnLFxuICAgICAgYXBwbHk6IGFzeW5jIChzZGs6IFNESykgPT4ge1xuICAgICAgICAvLyBTdGVwIDEgLSB1cGRhdGUgdGhlIGNoYW5nZWQgVGFza0RlZmluaXRpb24sIGNyZWF0aW5nIGEgbmV3IFRhc2tEZWZpbml0aW9uIFJldmlzaW9uXG4gICAgICAgIC8vIHdlIG5lZWQgdG8gbG93ZXJjYXNlIHRoZSBldmFsdWF0ZWQgVGFza0RlZiBmcm9tIENsb3VkRm9ybWF0aW9uLFxuICAgICAgICAvLyBhcyB0aGUgQVdTIFNESyB1c2VzIGxvd2VyY2FzZSBwcm9wZXJ0eSBuYW1lcyBmb3IgdGhlc2VcblxuICAgICAgICAvLyBUaGUgU0RLIHJlcXVpcmVzIG1vcmUgcHJvcGVydGllcyBoZXJlIHRoYW4gaXRzIHdvcnRoIGRvaW5nIGV4cGxpY2l0IHR5cGluZyBmb3JcbiAgICAgICAgLy8gaW5zdGVhZCwganVzdCB1c2UgYWxsIHRoZSBvbGQgdmFsdWVzIGluIHRoZSBkaWZmIHRvIGZpbGwgdGhlbSBpbiBpbXBsaWNpdGx5XG4gICAgICAgIGNvbnN0IGxvd2VyY2FzZWRUYXNrRGVmID0gdHJhbnNmb3JtT2JqZWN0S2V5cyh0YXNrRGVmaW5pdGlvblJlc291cmNlLCBsb3dlckNhc2VGaXJzdENoYXJhY3Rlciwge1xuICAgICAgICAgIC8vIEFsbCB0aGUgcHJvcGVydGllcyB0aGF0IHRha2UgYXJiaXRyYXJ5IHN0cmluZyBhcyBrZXlzIGkuZS4geyBcInN0cmluZ1wiIDogXCJzdHJpbmdcIiB9XG4gICAgICAgICAgLy8gaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9SZWdpc3RlclRhc2tEZWZpbml0aW9uLmh0bWwjQVBJX1JlZ2lzdGVyVGFza0RlZmluaXRpb25fUmVxdWVzdFN5bnRheFxuICAgICAgICAgIENvbnRhaW5lckRlZmluaXRpb25zOiB7XG4gICAgICAgICAgICBEb2NrZXJMYWJlbHM6IHRydWUsXG4gICAgICAgICAgICBGaXJlbGVuc0NvbmZpZ3VyYXRpb246IHtcbiAgICAgICAgICAgICAgT3B0aW9uczogdHJ1ZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBMb2dDb25maWd1cmF0aW9uOiB7XG4gICAgICAgICAgICAgIE9wdGlvbnM6IHRydWUsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgVm9sdW1lczoge1xuICAgICAgICAgICAgRG9ja2VyVm9sdW1lQ29uZmlndXJhdGlvbjoge1xuICAgICAgICAgICAgICBEcml2ZXJPcHRzOiB0cnVlLFxuICAgICAgICAgICAgICBMYWJlbHM6IHRydWUsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCByZWdpc3RlclRhc2tEZWZSZXNwb25zZSA9IGF3YWl0IHNkay5lY3MoKS5yZWdpc3RlclRhc2tEZWZpbml0aW9uKGxvd2VyY2FzZWRUYXNrRGVmKTtcbiAgICAgICAgY29uc3QgdGFza0RlZlJldkFybiA9IHJlZ2lzdGVyVGFza0RlZlJlc3BvbnNlLnRhc2tEZWZpbml0aW9uPy50YXNrRGVmaW5pdGlvbkFybjtcblxuICAgICAgICBsZXQgZWNzSG90c3dhcFByb3BlcnRpZXMgPSBob3Rzd2FwUHJvcGVydHlPdmVycmlkZXMuZWNzSG90c3dhcFByb3BlcnRpZXM7XG4gICAgICAgIGxldCBtaW5pbXVtSGVhbHRoeVBlcmNlbnQgPSBlY3NIb3Rzd2FwUHJvcGVydGllcz8ubWluaW11bUhlYWx0aHlQZXJjZW50O1xuICAgICAgICBsZXQgbWF4aW11bUhlYWx0aHlQZXJjZW50ID0gZWNzSG90c3dhcFByb3BlcnRpZXM/Lm1heGltdW1IZWFsdGh5UGVyY2VudDtcblxuICAgICAgICAvLyBTdGVwIDIgLSB1cGRhdGUgdGhlIHNlcnZpY2VzIHVzaW5nIHRoYXQgVGFza0RlZmluaXRpb24gdG8gcG9pbnQgdG8gdGhlIG5ldyBUYXNrRGVmaW5pdGlvbiBSZXZpc2lvblxuICAgICAgICAvLyBGb3JjaW5nIE5ldyBEZXBsb3ltZW50IGFuZCBzZXR0aW5nIE1pbmltdW0gSGVhbHRoeSBQZXJjZW50IHRvIDAuXG4gICAgICAgIC8vIEFzIENESyBIb3RTd2FwIGlzIGRldmVsb3BtZW50IG9ubHksIHRoaXMgc2VlbXMgdGhlIG1vc3QgZWZmaWNpZW50IHdheSB0byBlbnN1cmUgYWxsIHRhc2tzIGFyZSByZXBsYWNlZCBpbW1lZGlhdGVseSwgcmVnYXJkbGVzcyBvZiBvcmlnaW5hbCBhbW91bnRcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBjZGtsYWJzL3Byb21pc2VhbGwtbm8tdW5ib3VuZGVkLXBhcmFsbGVsaXNtXG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICAgIGVjc1NlcnZpY2VzUmVmZXJlbmNpbmdUYXNrRGVmLm1hcChhc3luYyAoc2VydmljZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgY2x1c3RlciA9IHNlcnZpY2Uuc2VydmljZUFybi5zcGxpdCgnLycpWzFdO1xuICAgICAgICAgICAgY29uc3QgdXBkYXRlID0gYXdhaXQgc2RrLmVjcygpLnVwZGF0ZVNlcnZpY2Uoe1xuICAgICAgICAgICAgICBzZXJ2aWNlOiBzZXJ2aWNlLnNlcnZpY2VBcm4sXG4gICAgICAgICAgICAgIHRhc2tEZWZpbml0aW9uOiB0YXNrRGVmUmV2QXJuLFxuICAgICAgICAgICAgICBjbHVzdGVyLFxuICAgICAgICAgICAgICBmb3JjZU5ld0RlcGxveW1lbnQ6IHRydWUsXG4gICAgICAgICAgICAgIGRlcGxveW1lbnRDb25maWd1cmF0aW9uOiB7XG4gICAgICAgICAgICAgICAgbWluaW11bUhlYWx0aHlQZXJjZW50OiBtaW5pbXVtSGVhbHRoeVBlcmNlbnQgIT09IHVuZGVmaW5lZCA/IG1pbmltdW1IZWFsdGh5UGVyY2VudCA6IDAsXG4gICAgICAgICAgICAgICAgbWF4aW11bVBlcmNlbnQ6IG1heGltdW1IZWFsdGh5UGVyY2VudCAhPT0gdW5kZWZpbmVkID8gbWF4aW11bUhlYWx0aHlQZXJjZW50IDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGF3YWl0IHNkay5lY3MoKS53YWl0VW50aWxTZXJ2aWNlc1N0YWJsZSh7XG4gICAgICAgICAgICAgIGNsdXN0ZXI6IHVwZGF0ZS5zZXJ2aWNlPy5jbHVzdGVyQXJuLFxuICAgICAgICAgICAgICBzZXJ2aWNlczogW3NlcnZpY2Uuc2VydmljZUFybl0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gcmV0O1xufVxuXG5pbnRlcmZhY2UgRWNzU2VydmljZSB7XG4gIHJlYWRvbmx5IGxvZ2ljYWxJZDogc3RyaW5nO1xuICByZWFkb25seSBzZXJ2aWNlQXJuOiBzdHJpbmc7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHByZXBhcmVUYXNrRGVmaW5pdGlvbkNoYW5nZShcbiAgZXZhbHVhdGVDZm5UZW1wbGF0ZTogRXZhbHVhdGVDbG91ZEZvcm1hdGlvblRlbXBsYXRlLFxuICBsb2dpY2FsSWQ6IHN0cmluZyxcbiAgY2hhbmdlOiBSZXNvdXJjZUNoYW5nZSxcbikge1xuICBjb25zdCB0YXNrRGVmaW5pdGlvblJlc291cmNlOiB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSA9IHtcbiAgICAuLi5jaGFuZ2Uub2xkVmFsdWUuUHJvcGVydGllcyxcbiAgICBDb250YWluZXJEZWZpbml0aW9uczogY2hhbmdlLm5ld1ZhbHVlLlByb3BlcnRpZXM/LkNvbnRhaW5lckRlZmluaXRpb25zLFxuICB9O1xuICAvLyBmaXJzdCwgbGV0J3MgZ2V0IHRoZSBuYW1lIG9mIHRoZSBmYW1pbHlcbiAgY29uc3QgZmFtaWx5TmFtZU9yQXJuID0gYXdhaXQgZXZhbHVhdGVDZm5UZW1wbGF0ZS5lc3RhYmxpc2hSZXNvdXJjZVBoeXNpY2FsTmFtZShcbiAgICBsb2dpY2FsSWQsXG4gICAgdGFza0RlZmluaXRpb25SZXNvdXJjZT8uRmFtaWx5LFxuICApO1xuICBpZiAoIWZhbWlseU5hbWVPckFybikge1xuICAgIC8vIGlmIHRoZSBGYW1pbHkgcHJvcGVydHkgaGFzIG5vdCBiZWVuIHByb3ZpZGVkLCBhbmQgd2UgY2FuJ3QgZmluZCBpdCBpbiB0aGUgY3VycmVudCBTdGFjayxcbiAgICAvLyB0aGlzIG1lYW5zIGhvdHN3YXBwaW5nIGlzIG5vdCBwb3NzaWJsZVxuICAgIHJldHVybjtcbiAgfVxuICAvLyB0aGUgcGh5c2ljYWwgbmFtZSBvZiB0aGUgVGFzayBEZWZpbml0aW9uIGluIENsb3VkRm9ybWF0aW9uIGluY2x1ZGVzIGl0cyBjdXJyZW50IHJldmlzaW9uIG51bWJlciBhdCB0aGUgZW5kLFxuICAvLyByZW1vdmUgaXQgaWYgbmVlZGVkXG4gIGNvbnN0IGZhbWlseU5hbWVPckFyblBhcnRzID0gZmFtaWx5TmFtZU9yQXJuLnNwbGl0KCc6Jyk7XG4gIGNvbnN0IGZhbWlseSA9XG4gICAgZmFtaWx5TmFtZU9yQXJuUGFydHMubGVuZ3RoID4gMVxuICAgICAgPyAvLyBmYW1pbHlOYW1lT3JBcm4gaXMgYWN0dWFsbHkgYW4gQVJOLCBvZiB0aGUgZm9ybWF0ICdhcm46YXdzOmVjczpyZWdpb246YWNjb3VudDp0YXNrLWRlZmluaXRpb24vPGZhbWlseS1uYW1lPjo8cmV2aXNpb24tbnI+J1xuICAgIC8vIHNvLCB0YWtlIHRoZSA2dGggZWxlbWVudCwgYXQgaW5kZXggNSwgYW5kIHNwbGl0IGl0IG9uICcvJ1xuICAgICAgZmFtaWx5TmFtZU9yQXJuUGFydHNbNV0uc3BsaXQoJy8nKVsxXVxuICAgICAgOiAvLyBvdGhlcndpc2UsIGZhbWlseU5hbWVPckFybiBpcyBqdXN0IHRoZSBzaW1wbGUgbmFtZSBldmFsdWF0ZWQgZnJvbSB0aGUgQ2xvdWRGb3JtYXRpb24gdGVtcGxhdGVcbiAgICAgIGZhbWlseU5hbWVPckFybjtcbiAgLy8gdGhlbiwgbGV0J3MgZXZhbHVhdGUgdGhlIGJvZHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgVGFza0RlZiAod2l0aG91dCB0aGUgRmFtaWx5IHByb3BlcnR5KVxuICByZXR1cm4ge1xuICAgIC4uLihhd2FpdCBldmFsdWF0ZUNmblRlbXBsYXRlLmV2YWx1YXRlQ2ZuRXhwcmVzc2lvbih7XG4gICAgICAuLi4odGFza0RlZmluaXRpb25SZXNvdXJjZSA/PyB7fSksXG4gICAgICBGYW1pbHk6IHVuZGVmaW5lZCxcbiAgICB9KSksXG4gICAgRmFtaWx5OiBmYW1pbHksXG4gIH07XG59XG4iXX0=
@@ -0,0 +1,17 @@
1
+ import type * as cxapi from '@aws-cdk/cx-api';
2
+ import type { SdkProvider } from '../aws-auth/private';
3
+ import type { CloudFormationStack } from '../cloudformation';
4
+ import type { HotswapPropertyOverrides } from './common';
5
+ import type { SuccessfulDeployStackResult } from '../deployments';
6
+ import type { IoHelper } from '../io/private';
7
+ type HotswapMode = 'hotswap-only' | 'fall-back';
8
+ /**
9
+ * Perform a hotswap deployment, short-circuiting CloudFormation if possible.
10
+ * If it's not possible to short-circuit the deployment
11
+ * (because the CDK Stack contains changes that cannot be deployed without CloudFormation),
12
+ * returns `undefined`.
13
+ */
14
+ export declare function tryHotswapDeployment(sdkProvider: SdkProvider, ioHelper: IoHelper, assetParams: {
15
+ [key: string]: string;
16
+ }, cloudFormationStack: CloudFormationStack, stackArtifact: cxapi.CloudFormationStackArtifact, hotswapMode: HotswapMode, hotswapPropertyOverrides: HotswapPropertyOverrides): Promise<SuccessfulDeployStackResult | undefined>;
17
+ export {};