@aws-cdk/toolkit-lib 0.3.1 → 0.3.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (367) hide show
  1. package/README.md +1 -1
  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/deploy/index.d.ts +1 -1
  7. package/lib/actions/deploy/index.js +1 -1
  8. package/lib/actions/deploy/private/deploy-options.d.ts +1 -1
  9. package/lib/actions/deploy/private/deploy-options.js +1 -1
  10. package/lib/actions/deploy/private/helpers.d.ts +3 -2
  11. package/lib/actions/deploy/private/helpers.js +3 -3
  12. package/lib/actions/diff/private/helpers.d.ts +5 -9
  13. package/lib/actions/diff/private/helpers.js +6 -23
  14. package/lib/api/aws-auth/account-cache.d.ts +41 -0
  15. package/lib/api/aws-auth/account-cache.js +108 -0
  16. package/lib/api/aws-auth/awscli-compatible.d.ts +70 -0
  17. package/lib/api/aws-auth/awscli-compatible.js +250 -0
  18. package/lib/api/aws-auth/cached.d.ts +11 -0
  19. package/lib/api/aws-auth/cached.js +26 -0
  20. package/lib/api/aws-auth/credential-plugins.d.ts +38 -0
  21. package/lib/api/aws-auth/credential-plugins.js +154 -0
  22. package/lib/api/aws-auth/private/index.d.ts +11 -0
  23. package/lib/api/aws-auth/private/index.js +37 -0
  24. package/lib/api/aws-auth/provider-caching.d.ts +13 -0
  25. package/lib/api/aws-auth/provider-caching.js +24 -0
  26. package/lib/api/aws-auth/proxy-agent.d.ts +13 -0
  27. package/lib/api/aws-auth/proxy-agent.js +54 -0
  28. package/lib/api/aws-auth/sdk-logger.d.ts +69 -0
  29. package/lib/api/aws-auth/sdk-logger.js +128 -0
  30. package/lib/api/aws-auth/sdk-provider.d.ts +195 -0
  31. package/lib/api/aws-auth/sdk-provider.js +373 -0
  32. package/lib/api/aws-auth/sdk.d.ts +235 -0
  33. package/lib/api/aws-auth/sdk.js +391 -0
  34. package/lib/api/aws-auth/tracing.d.ts +11 -0
  35. package/lib/api/aws-auth/tracing.js +60 -0
  36. package/lib/api/aws-auth/types.d.ts +79 -1
  37. package/lib/api/aws-auth/types.js +74 -1
  38. package/lib/api/aws-auth/user-agent.d.ts +7 -0
  39. package/lib/api/aws-auth/user-agent.js +20 -0
  40. package/lib/api/aws-auth/util.d.ts +6 -0
  41. package/lib/api/aws-auth/util.js +21 -0
  42. package/lib/api/bootstrap/bootstrap-environment.d.ts +35 -0
  43. package/lib/api/bootstrap/bootstrap-environment.js +323 -0
  44. package/lib/api/bootstrap/bootstrap-props.d.ts +130 -0
  45. package/lib/api/bootstrap/bootstrap-props.js +14 -0
  46. package/lib/api/bootstrap/deploy-bootstrap.d.ts +39 -0
  47. package/lib/api/bootstrap/deploy-bootstrap.js +147 -0
  48. package/lib/api/bootstrap/index.d.ts +3 -0
  49. package/lib/api/bootstrap/index.js +23 -0
  50. package/lib/api/bootstrap/legacy-template.d.ts +2 -0
  51. package/lib/api/bootstrap/legacy-template.js +82 -0
  52. package/lib/api/cloud-assembly/environment.d.ts +43 -0
  53. package/lib/api/cloud-assembly/environment.js +127 -0
  54. package/lib/api/cloud-assembly/index.d.ts +1 -1
  55. package/lib/api/cloud-assembly/index.js +3 -3
  56. package/lib/api/cloud-assembly/private/context-aware-source.d.ts +1 -1
  57. package/lib/api/cloud-assembly/private/context-aware-source.js +5 -5
  58. package/lib/api/cloud-assembly/private/prepare-source.d.ts +2 -1
  59. package/lib/api/cloud-assembly/private/prepare-source.js +14 -12
  60. package/lib/api/cloud-assembly/private/readable-assembly.d.ts +1 -1
  61. package/lib/api/cloud-assembly/private/readable-assembly.js +1 -1
  62. package/lib/api/cloud-assembly/private/source-builder.js +10 -8
  63. package/lib/api/cloud-assembly/private/stack-assembly.d.ts +2 -1
  64. package/lib/api/cloud-assembly/private/stack-assembly.js +10 -9
  65. package/lib/api/cloud-assembly/stack-assembly.d.ts +55 -0
  66. package/lib/api/cloud-assembly/stack-assembly.js +139 -0
  67. package/lib/api/cloud-assembly/stack-collection.d.ts +27 -0
  68. package/lib/api/cloud-assembly/stack-collection.js +112 -0
  69. package/lib/api/cloud-assembly/stack-selector.d.ts +81 -2
  70. package/lib/api/cloud-assembly/stack-selector.js +62 -5
  71. package/lib/api/cloudformation/evaluate-cloudformation-template.d.ts +85 -0
  72. package/lib/api/cloudformation/evaluate-cloudformation-template.js +456 -0
  73. package/lib/api/cloudformation/index.d.ts +4 -0
  74. package/lib/api/cloudformation/index.js +21 -0
  75. package/lib/api/cloudformation/nested-stack-helpers.d.ts +25 -0
  76. package/lib/api/cloudformation/nested-stack-helpers.js +86 -0
  77. package/lib/api/cloudformation/stack-helpers.d.ts +96 -0
  78. package/lib/api/cloudformation/stack-helpers.js +163 -0
  79. package/lib/api/cloudformation/template-body-parameter.d.ts +22 -0
  80. package/lib/api/cloudformation/template-body-parameter.js +104 -0
  81. package/lib/api/context.d.ts +40 -0
  82. package/lib/api/context.js +84 -0
  83. package/lib/api/deployments/asset-manifest-builder.d.ts +8 -0
  84. package/lib/api/deployments/asset-manifest-builder.js +33 -0
  85. package/lib/api/deployments/asset-publishing.d.ts +60 -0
  86. package/lib/api/deployments/asset-publishing.js +144 -0
  87. package/lib/api/deployments/assets.d.ts +11 -0
  88. package/lib/api/deployments/assets.js +109 -0
  89. package/lib/api/deployments/cfn-api.d.ts +145 -0
  90. package/lib/api/deployments/cfn-api.js +444 -0
  91. package/lib/api/deployments/checks.d.ts +9 -0
  92. package/lib/api/deployments/checks.js +72 -0
  93. package/lib/api/deployments/deploy-stack.d.ts +164 -0
  94. package/lib/api/deployments/deploy-stack.js +490 -0
  95. package/lib/api/deployments/deployment-method.d.ts +24 -0
  96. package/lib/api/deployments/deployment-method.js +3 -0
  97. package/lib/api/deployments/deployment-result.d.ts +21 -0
  98. package/lib/api/deployments/deployment-result.js +10 -0
  99. package/lib/api/deployments/deployments.d.ts +289 -0
  100. package/lib/api/deployments/deployments.js +355 -0
  101. package/lib/api/deployments/index.d.ts +6 -0
  102. package/lib/api/deployments/index.js +27 -0
  103. package/lib/api/diff/diff-formatter.d.ts +147 -0
  104. package/lib/api/diff/diff-formatter.js +225 -0
  105. package/lib/api/diff/index.d.ts +1 -0
  106. package/lib/api/diff/index.js +18 -0
  107. package/lib/api/environment/environment-access.d.ts +139 -0
  108. package/lib/api/environment/environment-access.js +205 -0
  109. package/lib/api/environment/environment-resources.d.ts +75 -0
  110. package/lib/api/environment/environment-resources.js +213 -0
  111. package/lib/api/environment/index.d.ts +3 -0
  112. package/lib/api/environment/index.js +20 -0
  113. package/lib/api/environment/placeholders.d.ts +10 -0
  114. package/lib/api/environment/placeholders.js +23 -0
  115. package/lib/api/garbage-collection/garbage-collector.d.ts +158 -0
  116. package/lib/api/garbage-collection/garbage-collector.js +614 -0
  117. package/lib/api/garbage-collection/index.d.ts +3 -0
  118. package/lib/api/garbage-collection/index.js +21 -0
  119. package/lib/api/garbage-collection/progress-printer.d.ts +23 -0
  120. package/lib/api/garbage-collection/progress-printer.js +80 -0
  121. package/lib/api/garbage-collection/stack-refresh.d.ts +49 -0
  122. package/lib/api/garbage-collection/stack-refresh.js +152 -0
  123. package/lib/api/hotswap/appsync-mapping-templates.d.ts +4 -0
  124. package/lib/api/hotswap/appsync-mapping-templates.js +162 -0
  125. package/lib/api/hotswap/code-build-projects.d.ts +4 -0
  126. package/lib/api/hotswap/code-build-projects.js +62 -0
  127. package/lib/api/hotswap/common.d.ts +89 -0
  128. package/lib/api/hotswap/common.js +137 -0
  129. package/lib/api/hotswap/ecs-services.d.ts +4 -0
  130. package/lib/api/hotswap/ecs-services.js +159 -0
  131. package/lib/api/hotswap/hotswap-deployments.d.ts +17 -0
  132. package/lib/api/hotswap/hotswap-deployments.js +441 -0
  133. package/lib/api/hotswap/index.d.ts +2 -0
  134. package/lib/api/hotswap/index.js +19 -0
  135. package/lib/api/hotswap/lambda-functions.d.ts +4 -0
  136. package/lib/api/hotswap/lambda-functions.js +297 -0
  137. package/lib/api/hotswap/s3-bucket-deployments.d.ts +5 -0
  138. package/lib/api/hotswap/s3-bucket-deployments.js +117 -0
  139. package/lib/api/hotswap/stepfunctions-state-machines.d.ts +4 -0
  140. package/lib/api/hotswap/stepfunctions-state-machines.js +48 -0
  141. package/lib/api/index.d.ts +25 -0
  142. package/lib/api/index.js +42 -0
  143. package/lib/api/io/index.d.ts +3 -1
  144. package/lib/api/io/index.js +18 -1
  145. package/lib/api/io/io-host.d.ts +15 -0
  146. package/lib/api/io/io-host.js +3 -0
  147. package/lib/api/io/io-message.d.ts +76 -0
  148. package/lib/api/io/io-message.js +3 -0
  149. package/lib/api/io/private/index.d.ts +7 -1
  150. package/lib/api/io/private/index.js +8 -5
  151. package/lib/api/io/private/io-default-messages.d.ts +21 -0
  152. package/lib/api/io/private/io-default-messages.js +59 -0
  153. package/lib/api/io/private/io-helper.d.ts +32 -0
  154. package/lib/api/io/private/io-helper.js +51 -0
  155. package/lib/api/io/private/level-priority.d.ts +11 -0
  156. package/lib/api/io/private/level-priority.js +33 -0
  157. package/lib/api/io/private/message-maker.d.ts +89 -0
  158. package/lib/api/io/private/message-maker.js +60 -0
  159. package/lib/api/io/private/messages.d.ts +178 -0
  160. package/lib/api/io/private/messages.js +534 -0
  161. package/lib/api/io/private/span.d.ts +93 -0
  162. package/lib/api/io/private/span.js +87 -0
  163. package/lib/api/io/private/testing/fake-io-host.d.ts +28 -0
  164. package/lib/api/io/private/testing/fake-io-host.js +41 -0
  165. package/lib/api/io/private/testing/index.d.ts +2 -0
  166. package/lib/api/io/private/testing/index.js +19 -0
  167. package/lib/api/io/private/testing/test-io-host.d.ts +27 -0
  168. package/lib/api/io/private/testing/test-io-host.js +61 -0
  169. package/lib/api/io/private/types.d.ts +4 -0
  170. package/lib/api/io/private/types.js +3 -0
  171. package/lib/api/io/toolkit-action.d.ts +4 -0
  172. package/lib/api/io/toolkit-action.js +3 -0
  173. package/lib/api/logs-monitor/find-cloudwatch-logs.d.ts +25 -0
  174. package/lib/api/logs-monitor/find-cloudwatch-logs.js +95 -0
  175. package/lib/api/logs-monitor/index.d.ts +2 -0
  176. package/lib/api/logs-monitor/index.js +19 -0
  177. package/lib/api/logs-monitor/logs-monitor.d.ts +76 -0
  178. package/lib/api/logs-monitor/logs-monitor.js +194 -0
  179. package/lib/api/notices.d.ts +210 -0
  180. package/lib/api/notices.js +430 -0
  181. package/lib/api/plugin/context-provider-plugin.d.ts +6 -0
  182. package/lib/api/plugin/context-provider-plugin.js +7 -0
  183. package/lib/api/plugin/index.d.ts +3 -0
  184. package/lib/api/plugin/index.js +20 -0
  185. package/lib/api/plugin/mode.d.ts +4 -0
  186. package/lib/api/plugin/mode.js +9 -0
  187. package/lib/api/plugin/plugin.d.ts +72 -0
  188. package/lib/api/plugin/plugin.js +132 -0
  189. package/lib/api/private.d.ts +1 -0
  190. package/lib/api/private.js +18 -0
  191. package/lib/api/refactoring/cloudformation.d.ts +15 -0
  192. package/lib/api/refactoring/cloudformation.js +3 -0
  193. package/lib/api/refactoring/digest.d.ts +26 -0
  194. package/lib/api/refactoring/digest.js +175 -0
  195. package/lib/api/refactoring/index.d.ts +51 -0
  196. package/lib/api/refactoring/index.js +223 -0
  197. package/lib/api/require-approval.d.ts +17 -0
  198. package/lib/api/require-approval.js +22 -0
  199. package/lib/api/resource-import/importer.d.ts +216 -0
  200. package/lib/api/resource-import/importer.js +331 -0
  201. package/lib/api/resource-import/index.d.ts +2 -0
  202. package/lib/api/resource-import/index.js +19 -0
  203. package/lib/api/resource-import/migrator.d.ts +26 -0
  204. package/lib/api/resource-import/migrator.js +73 -0
  205. package/lib/api/resource-metadata/index.d.ts +1 -0
  206. package/lib/api/resource-metadata/index.js +18 -0
  207. package/lib/api/resource-metadata/resource-metadata.d.ts +24 -0
  208. package/lib/api/resource-metadata/resource-metadata.js +42 -0
  209. package/lib/api/rwlock.d.ts +60 -0
  210. package/lib/api/rwlock.js +204 -0
  211. package/lib/api/settings.d.ts +26 -0
  212. package/lib/api/settings.js +107 -0
  213. package/lib/api/shared-private.d.ts +8 -5
  214. package/lib/api/shared-private.js +2921 -9246
  215. package/lib/api/shared-private.js.map +4 -4
  216. package/lib/api/shared-public.d.ts +179 -37
  217. package/lib/api/shared-public.js +3106 -16
  218. package/lib/api/shared-public.js.map +4 -4
  219. package/lib/api/stack-events/index.d.ts +4 -0
  220. package/lib/api/stack-events/index.js +23 -0
  221. package/lib/api/stack-events/stack-activity-monitor.d.ts +100 -0
  222. package/lib/api/stack-events/stack-activity-monitor.js +164 -0
  223. package/lib/api/stack-events/stack-event-poller.d.ts +69 -0
  224. package/lib/api/stack-events/stack-event-poller.js +130 -0
  225. package/lib/api/stack-events/stack-progress-monitor.d.ts +48 -0
  226. package/lib/api/stack-events/stack-progress-monitor.js +98 -0
  227. package/lib/api/stack-events/stack-status.d.ts +42 -0
  228. package/lib/api/stack-events/stack-status.js +90 -0
  229. package/lib/api/streams.d.ts +7 -0
  230. package/lib/api/streams.js +24 -0
  231. package/lib/api/tags.d.ts +9 -0
  232. package/lib/api/tags.js +10 -0
  233. package/lib/api/toolkit-error.d.ts +86 -0
  234. package/lib/api/toolkit-error.js +132 -0
  235. package/lib/api/toolkit-info.d.ts +52 -0
  236. package/lib/api/toolkit-info.js +157 -0
  237. package/lib/api/tree.d.ts +31 -0
  238. package/lib/api/tree.js +37 -0
  239. package/lib/api/work-graph/index.d.ts +3 -0
  240. package/lib/api/work-graph/index.js +20 -0
  241. package/lib/api/work-graph/work-graph-builder.d.ts +34 -0
  242. package/lib/api/work-graph/work-graph-builder.js +172 -0
  243. package/lib/api/work-graph/work-graph-types.d.ts +50 -0
  244. package/lib/api/work-graph/work-graph-types.js +13 -0
  245. package/lib/api/work-graph/work-graph.d.ts +72 -0
  246. package/lib/api/work-graph/work-graph.js +349 -0
  247. package/lib/context-providers/ami.d.ts +13 -0
  248. package/lib/context-providers/ami.js +52 -0
  249. package/lib/context-providers/availability-zones.d.ts +13 -0
  250. package/lib/context-providers/availability-zones.js +29 -0
  251. package/lib/context-providers/cc-api-provider.d.ts +30 -0
  252. package/lib/context-providers/cc-api-provider.js +145 -0
  253. package/lib/context-providers/endpoint-service-availability-zones.d.ts +13 -0
  254. package/lib/context-providers/endpoint-service-availability-zones.js +35 -0
  255. package/lib/context-providers/hosted-zones.d.ts +12 -0
  256. package/lib/context-providers/hosted-zones.js +69 -0
  257. package/lib/context-providers/index.d.ts +44 -0
  258. package/lib/context-providers/index.js +128 -0
  259. package/lib/context-providers/keys.d.ts +13 -0
  260. package/lib/context-providers/keys.js +54 -0
  261. package/lib/context-providers/load-balancers.d.ts +20 -0
  262. package/lib/context-providers/load-balancers.js +161 -0
  263. package/lib/context-providers/security-groups.d.ts +9 -0
  264. package/lib/context-providers/security-groups.js +69 -0
  265. package/lib/context-providers/ssm-parameters.d.ts +25 -0
  266. package/lib/context-providers/ssm-parameters.js +61 -0
  267. package/lib/context-providers/vpcs.d.ts +13 -0
  268. package/lib/context-providers/vpcs.js +291 -0
  269. package/lib/index.d.ts +1 -0
  270. package/lib/index.js +2 -1
  271. package/lib/index_bg.wasm +0 -0
  272. package/lib/payloads/bootstrap-environment-progress.d.ts +17 -0
  273. package/lib/payloads/bootstrap-environment-progress.js +3 -0
  274. package/lib/payloads/context.d.ts +9 -0
  275. package/lib/payloads/context.js +3 -0
  276. package/lib/payloads/deploy.d.ts +43 -0
  277. package/lib/payloads/deploy.js +3 -0
  278. package/lib/payloads/destroy.d.ts +23 -0
  279. package/lib/payloads/destroy.js +3 -0
  280. package/lib/payloads/diff.d.ts +31 -0
  281. package/lib/payloads/diff.js +22 -0
  282. package/lib/payloads/hotswap.d.ts +211 -0
  283. package/lib/payloads/hotswap.js +43 -0
  284. package/lib/payloads/index.d.ts +17 -0
  285. package/lib/payloads/index.js +34 -0
  286. package/lib/payloads/list.d.ts +4 -0
  287. package/lib/payloads/list.js +3 -0
  288. package/lib/payloads/logs-monitor.d.ts +33 -0
  289. package/lib/payloads/logs-monitor.js +3 -0
  290. package/lib/payloads/progress.d.ts +14 -0
  291. package/lib/payloads/progress.js +3 -0
  292. package/lib/payloads/refactor.d.ts +14 -0
  293. package/lib/payloads/refactor.js +3 -0
  294. package/lib/payloads/rollback.d.ts +17 -0
  295. package/lib/payloads/rollback.js +3 -0
  296. package/lib/payloads/sdk-trace.d.ts +20 -0
  297. package/lib/payloads/sdk-trace.js +3 -0
  298. package/lib/payloads/stack-activity.d.ts +53 -0
  299. package/lib/payloads/stack-activity.js +3 -0
  300. package/lib/payloads/stack-details.d.ts +17 -0
  301. package/lib/payloads/stack-details.js +3 -0
  302. package/lib/payloads/synth.d.ts +7 -0
  303. package/lib/payloads/synth.js +3 -0
  304. package/lib/payloads/types.d.ts +95 -0
  305. package/lib/payloads/types.js +3 -0
  306. package/lib/payloads/watch.d.ts +27 -0
  307. package/lib/payloads/watch.js +3 -0
  308. package/lib/private/activity-printer/base.d.ts +50 -0
  309. package/lib/private/activity-printer/base.js +120 -0
  310. package/lib/private/activity-printer/current.d.ts +26 -0
  311. package/lib/private/activity-printer/current.js +122 -0
  312. package/lib/private/activity-printer/display.d.ts +13 -0
  313. package/lib/private/activity-printer/display.js +81 -0
  314. package/lib/private/activity-printer/history.d.ts +32 -0
  315. package/lib/private/activity-printer/history.js +109 -0
  316. package/lib/private/activity-printer/index.d.ts +3 -0
  317. package/lib/private/activity-printer/index.js +20 -0
  318. package/lib/private/index.d.ts +1 -0
  319. package/lib/private/index.js +18 -0
  320. package/lib/private/util.d.ts +1 -1
  321. package/lib/private/util.js +22 -22
  322. package/lib/private/util.js.map +2 -2
  323. package/lib/toolkit/private/index.d.ts +2 -0
  324. package/lib/toolkit/private/index.js +1 -1
  325. package/lib/toolkit/toolkit.d.ts +16 -0
  326. package/lib/toolkit/toolkit.js +158 -124
  327. package/lib/toolkit/types.d.ts +0 -55
  328. package/lib/toolkit/types.js +1 -1
  329. package/lib/util/archive.d.ts +1 -0
  330. package/lib/util/archive.js +86 -0
  331. package/lib/util/arrays.d.ts +14 -0
  332. package/lib/util/arrays.js +36 -0
  333. package/lib/util/bool.d.ts +7 -0
  334. package/lib/util/bool.js +13 -0
  335. package/lib/util/bytes.d.ts +8 -0
  336. package/lib/util/bytes.js +21 -0
  337. package/lib/util/cloudformation.d.ts +16 -0
  338. package/lib/util/cloudformation.js +36 -0
  339. package/lib/util/content-hash.d.ts +5 -0
  340. package/lib/util/content-hash.js +43 -0
  341. package/lib/util/directories.d.ts +22 -0
  342. package/lib/util/directories.js +59 -0
  343. package/lib/util/format-error.d.ts +9 -0
  344. package/lib/util/format-error.js +22 -0
  345. package/lib/util/index.d.ts +18 -0
  346. package/lib/util/index.js +35 -0
  347. package/lib/util/json.d.ts +48 -0
  348. package/lib/util/json.js +68 -0
  349. package/lib/util/objects.d.ts +65 -0
  350. package/lib/util/objects.js +230 -0
  351. package/lib/util/package-info.d.ts +3 -0
  352. package/lib/util/package-info.js +22 -0
  353. package/lib/util/parallel.d.ts +6 -0
  354. package/lib/util/parallel.js +48 -0
  355. package/lib/util/serialize.d.ts +27 -0
  356. package/lib/util/serialize.js +86 -0
  357. package/lib/util/string-manipulation.d.ts +18 -0
  358. package/lib/util/string-manipulation.js +46 -0
  359. package/lib/util/type-brands.d.ts +39 -0
  360. package/lib/util/type-brands.js +39 -0
  361. package/lib/util/types.d.ts +27 -0
  362. package/lib/util/types.js +25 -0
  363. package/lib/util/version-range.d.ts +2 -0
  364. package/lib/util/version-range.js +36 -0
  365. package/lib/util/yaml-cfn.d.ts +15 -0
  366. package/lib/util/yaml-cfn.js +58 -0
  367. package/package.json +12 -13
@@ -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-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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiY29tbW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQWlKQSwwQ0FhQztBQUVELHNEQXNCQztBQUVELDBEQWVDO0FBck1ELG9EQUErRDtBQUUvRCxvREFBZ0Q7QUFFbkMsUUFBQSxJQUFJLEdBQUcsR0FBRyxDQUFDO0FBNkN4QixJQUFZLFdBZVg7QUFmRCxXQUFZLFdBQVc7SUFDckI7O09BRUc7SUFDSCxzQ0FBdUIsQ0FBQTtJQUV2Qjs7T0FFRztJQUNILDRDQUE2QixDQUFBO0lBRTdCOztPQUVHO0lBQ0gsa0RBQW1DLENBQUE7QUFDckMsQ0FBQyxFQWZXLFdBQVcsMkJBQVgsV0FBVyxRQWV0QjtBQUVEOztHQUVHO0FBQ0gsTUFBYSx3QkFBd0I7SUFDbkMsbUZBQW1GO0lBQ25GLG9CQUFvQixDQUF3QjtJQUU1QyxZQUFvQixvQkFBMkM7UUFDN0QsSUFBSSxDQUFDLG9CQUFvQixHQUFHLG9CQUFvQixDQUFDO0lBQ25ELENBQUM7Q0FDRjtBQVBELDREQU9DO0FBRUQ7O0dBRUc7QUFDSCxNQUFhLG9CQUFvQjtJQUMvQix1SkFBdUo7SUFDOUkscUJBQXFCLENBQVU7SUFDeEMsa0tBQWtLO0lBQ3pKLHFCQUFxQixDQUFVO0lBRXhDLFlBQW9CLHFCQUE4QixFQUFFLHFCQUE4QjtRQUNoRixJQUFJLHFCQUFxQixLQUFLLFNBQVMsSUFBSSxxQkFBcUIsR0FBRyxDQUFDLEVBQUcsQ0FBQztZQUN0RSxNQUFNLElBQUksNEJBQVksQ0FBQyxpRUFBaUUsQ0FBQyxDQUFDO1FBQzVGLENBQUM7UUFDRCxJQUFJLHFCQUFxQixLQUFLLFNBQVMsSUFBSSxxQkFBcUIsR0FBRyxDQUFDLEVBQUcsQ0FBQztZQUN0RSxNQUFNLElBQUksNEJBQVksQ0FBQyxpRUFBaUUsQ0FBQyxDQUFDO1FBQzVGLENBQUM7UUFDRCw0SUFBNEk7UUFDNUksSUFBSSxxQkFBcUIsSUFBSSxTQUFTLEVBQUUsQ0FBQztZQUN2QyxJ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QUFNLENBQUMsUUFBUSxDQUFDLElBQUk7Z0JBQ2xDLGtCQUFrQixFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsb0JBQW9CLElBQUksTUFBTSxDQUFDLGVBQWUsQ0FBQztnQkFDL0UsUUFBUSxFQUFFLE1BQU0sQ0FBQyxRQUFRO2FBQzFCO1NBQ0Y7S0FDRixDQUFDO0FBQ0osQ0FBQztBQUVELFNBQWdCLHVCQUF1QixDQUFDLE1BQXNCO0lBQzVELE9BQU87UUFDTCxZQUFZLEVBQUUsS0FBSztRQUNuQixNQUFNLEVBQUU7WUFDTixNQUFNLEVBQUUsK0JBQXFCLENBQUMsb0JBQW9CO1lBQ2xELFdBQVcsRUFBRSw2REFBNkQ7WUFDMUUsT0FBTyxFQUFFO2dCQUNQLElBQUksRUFBRSxVQUFVO2dCQUNoQixTQUFTLEVBQUUsTUFBTSxDQUFDLFNBQVM7Z0JBQzNCLFlBQVksRUFBRSxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUk7Z0JBQ2xDLGtCQUFrQixFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQztnQkFDdkQsUUFBUSxFQUFFLE1BQU0sQ0FBQyxRQUFRO2FBQzFCO1NBQ0Y7S0FDRixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgUHJvcGVydHlEaWZmZXJlbmNlIH0gZnJvbSAnQGF3cy1jZGsvY2xvdWRmb3JtYXRpb24tZGlmZic7XG5pbXBvcnQgdHlwZSB7IEhvdHN3YXBwYWJsZUNoYW5nZSwgTm9uSG90c3dhcHBhYmxlQ2hhbmdlLCBSZXNvdXJjZUNoYW5nZSB9IGZyb20gJy4uLy4uL3BheWxvYWRzL2hvdHN3YXAnO1xuaW1wb3J0IHsgTm9uSG90c3dhcHBhYmxlUmVhc29uIH0gZnJvbSAnLi4vLi4vcGF5bG9hZHMvaG90c3dhcCc7XG5pbXBvcnQgdHlwZSB7IFNESyB9IGZyb20gJy4uL2F3cy1hdXRoL3ByaXZhdGUnO1xuaW1wb3J0IHsgVG9vbGtpdEVycm9yIH0gZnJvbSAnLi4vdG9vbGtpdC1lcnJvcic7XG5cbmV4cG9ydCBjb25zdCBJQ09OID0gJ+KcqCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSG90c3dhcE9wZXJhdGlvbiB7XG4gIC8qKlxuICAgKiBNYXJrcyB0aGUgb3BlcmF0aW9uIGFzIGhvdHN3YXBwYWJsZVxuICAgKi9cbiAgcmVhZG9ubHkgaG90c3dhcHBhYmxlOiB0cnVlO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgc2VydmljZSBiZWluZyBob3Rzd2FwcGVkLlxuICAgKiBVc2VkIHRvIHNldCBhIGN1c3RvbSBVc2VyLUFnZW50IGZvciBTREsgY2FsbHMuXG4gICAqL1xuICByZWFkb25seSBzZXJ2aWNlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIERlc2NyaXB0aW9uIG9mIHRoZSBjaGFuZ2UgdGhhdCBpcyBhcHBsaWVkIGFzIHBhcnQgb2YgdGhlIG9wZXJhdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgY2hhbmdlOiBIb3Rzd2FwcGFibGVDaGFuZ2U7XG5cbiAgLyoqXG4gICAqIEFwcGxpZXMgdGhlIGhvdHN3YXAgb3BlcmF0aW9uXG4gICAqL1xuICByZWFkb25seSBhcHBseTogKHNkazogU0RLKSA9PiBQcm9taXNlPHZvaWQ+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlamVjdGVkQ2hhbmdlIHtcbiAgLyoqXG4gICAqIE1hcmtzIHRoZSBjaGFuZ2UgYXMgbm90IGhvdHN3YXBwYWJsZVxuICAgKi9cbiAgcmVhZG9ubHkgaG90c3dhcHBhYmxlOiBmYWxzZTtcbiAgLyoqXG4gICAqIFRoZSBjaGFuZ2UgdGhhdCBnb3QgcmVqZWN0ZWRcbiAgICovXG4gIHJlYWRvbmx5IGNoYW5nZTogTm9uSG90c3dhcHBhYmxlQ2hhbmdlO1xuICAvKipcbiAgICogV2hldGhlciBvciBub3QgdG8gc2hvdyB0aGlzIGNoYW5nZSB3aGVuIGxpc3Rpbmcgbm9uLWhvdHN3YXBwYWJsZSBjaGFuZ2VzIGluIEhPVFNXQVBfT05MWSBtb2RlLiBEb2VzIG5vdCBhZmZlY3RcbiAgICogbGlzdGluZyBpbiBGQUxMX0JBQ0sgbW9kZS5cbiAgICpcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgaG90c3dhcE9ubHlWaXNpYmxlPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IHR5cGUgSG90c3dhcENoYW5nZSA9IEhvdHN3YXBPcGVyYXRpb24gfCBSZWplY3RlZENoYW5nZTtcblxuZXhwb3J0IGVudW0gSG90c3dhcE1vZGUge1xuICAvKipcbiAgICogV2lsbCBmYWxsIGJhY2sgdG8gQ2xvdWRGb3JtYXRpb24gd2hlbiBhIG5vbi1ob3Rzd2FwcGFibGUgY2hhbmdlIGlzIGRldGVjdGVkXG4gICAqL1xuICBGQUxMX0JBQ0sgPSAnZmFsbC1iYWNrJyxcblxuICAvKipcbiAgICogV2lsbCBub3QgZmFsbCBiYWNrIHRvIENsb3VkRm9ybWF0aW9uIHdoZW4gYSBub24taG90c3dhcHBhYmxlIGNoYW5nZSBpcyBkZXRlY3RlZFxuICAgKi9cbiAgSE9UU1dBUF9PTkxZID0gJ2hvdHN3YXAtb25seScsXG5cbiAgLyoqXG4gICAqIFdpbGwgbm90IGF0dGVtcHQgdG8gaG90c3dhcCBhbnl0aGluZyBhbmQgaW5zdGVhZCBnbyBzdHJhaWdodCB0byBDbG91ZEZvcm1hdGlvblxuICAgKi9cbiAgRlVMTF9ERVBMT1lNRU5UID0gJ2Z1bGwtZGVwbG95bWVudCcsXG59XG5cbi8qKlxuICogUmVwcmVzZW50cyBjb25maWd1cmF0aW9uIHByb3BlcnR5IG92ZXJyaWRlcyBmb3IgaG90c3dhcCBkZXBsb3ltZW50c1xuICovXG5leHBvcnQgY2xhc3MgSG90c3dhcFByb3BlcnR5T3ZlcnJpZGVzIHtcbiAgLy8gRWFjaCBzdXBwb3J0ZWQgcmVzb3VyY2UgdHlwZSB3aWxsIGhhdmUgaXRzIG93biBwcm9wZXJ0aWVzLiBDdXJyZW50bHkgdGhpcyBpcyBFQ1NcbiAgZWNzSG90c3dhcFByb3BlcnRpZXM/OiBFY3NIb3Rzd2FwUHJvcGVydGllcztcblxuICBwdWJsaWMgY29uc3RydWN0b3IgKGVjc0hvdHN3YXBQcm9wZXJ0aWVzPzogRWNzSG90c3dhcFByb3BlcnRpZXMpIHtcbiAgICB0aGlzLmVjc0hvdHN3YXBQcm9wZXJ0aWVzID0gZWNzSG90c3dhcFByb3BlcnRpZXM7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXByZXNlbnRzIGNvbmZpZ3VyYXRpb24gcHJvcGVydGllcyBmb3IgRUNTIGhvdHN3YXAgZGVwbG95bWVudHNcbiAqL1xuZXhwb3J0IGNsYXNzIEVjc0hvdHN3YXBQcm9wZXJ0aWVzIHtcbiAgLy8gVGhlIGxvd2VyIGxpbWl0IG9uIHRoZSBudW1iZXIgb2YgeW91ciBzZXJ2aWNlJ3MgdGFza3MgdGhhdCBtdXN0IHJlbWFpbiBpbiB0aGUgUlVOTklORyBzdGF0ZSBkdXJpbmcgYSBkZXBsb3ltZW50LCBhcyBhIHBlcmNlbnRhZ2Ugb2YgdGhlIGRlc2lyZWRDb3VudFxuICByZWFkb25seSBtaW5pbXVtSGVhbHRoeVBlcmNlbnQ/OiBudW1iZXI7XG4gIC8vIFRoZSB1cHBlciBsaW1pdCBvbiB0aGUgbnVtYmVyIG9mIHlvdXIgc2VydmljZSdzIHRhc2tzIHRoYXQgYXJlIGFsbG93ZWQgaW4gdGhlIFJVTk5JTkcgb3IgUEVORElORyBzdGF0ZSBkdXJpbmcgYSBkZXBsb3ltZW50LCBhcyBhIHBlcmNlbnRhZ2Ugb2YgdGhlIGRlc2lyZWRDb3VudFxuICByZWFkb25seSBtYXhpbXVtSGVhbHRoeVBlcmNlbnQ/OiBudW1iZXI7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yIChtaW5pbXVtSGVhbHRoeVBlcmNlbnQ/OiBudW1iZXIsIG1heGltdW1IZWFsdGh5UGVyY2VudD86IG51bWJlcikge1xuICAgIGlmIChtaW5pbXVtSGVhbHRoeVBlcmNlbnQgIT09IHVuZGVmaW5lZCAmJiBtaW5pbXVtSGVhbHRoeVBlcmNlbnQgPCAwICkge1xuICAgICAgdGhyb3cgbmV3IFRvb2xraXRFcnJvcignaG90c3dhcC1lY3MtbWluaW11bS1oZWFsdGh5LXBlcmNlbnQgY2FuXFwndCBiZSBhIG5lZ2F0aXZlIG51bWJlcicpO1xuICAgIH1cbiAgICBpZiAobWF4aW11bUhlYWx0aHlQZXJjZW50ICE9PSB1bmRlZmluZWQgJiYgbWF4aW11bUhlYWx0aHlQZXJjZW50IDwgMCApIHtcbiAgICAgIHRocm93IG5ldyBUb29sa2l0RXJyb3IoJ2hvdHN3YXAtZWNzLW1heGltdW0taGVhbHRoeS1wZXJjZW50IGNhblxcJ3QgYmUgYSBuZWdhdGl2ZSBudW1iZXInKTtcbiAgICB9XG4gICAgLy8gSW4gb3JkZXIgdG8gcHJlc2VydmUgdGhlIGN1cnJlbnQgYmVoYXZpb3VyLCB3aGVuIG1pbmltdW1IZWFsdGh5UGVyY2VudCBpcyBub3QgZGVmaW5lZCwgaXQgd2lsbCBiZSBzZXQgdG8gdGhlIGN1cnJlbnRseSBkZWZhdWx0IHZhbHVlIG9mIDBcbiAgICBpZiAobWluaW11bUhlYWx0aHlQZXJjZW50ID09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5taW5pbXVtSGVhbHRoeVBlcmNlbnQgPSAwO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm1pbmltdW1IZWFsdGh5UGVyY2VudCA9IG1pbmltdW1IZWFsdGh5UGVyY2VudDtcbiAgICB9XG4gICAgdGhpcy5tYXhpbXVtSGVhbHRoeVBlcmNlbnQgPSBtYXhpbXVtSGVhbHRoeVBlcmNlbnQ7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgYW55IGhvdHN3YXAgcHJvcGVydGllcyBhcmUgZGVmaW5lZFxuICAgKiBAcmV0dXJucyB0cnVlIGlmIGFsbCBwcm9wZXJ0aWVzIGFyZSB1bmRlZmluZWQsIGZhbHNlIG90aGVyd2lzZVxuICAgKi9cbiAgcHVibGljIGlzRW1wdHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubWluaW11bUhlYWx0aHlQZXJjZW50ID09PSAwICYmIHRoaXMubWF4aW11bUhlYWx0aHlQZXJjZW50ID09PSB1bmRlZmluZWQ7XG4gIH1cbn1cblxudHlwZSBQcm9wRGlmZnMgPSBSZWNvcmQ8c3RyaW5nLCBQcm9wZXJ0eURpZmZlcmVuY2U8YW55Pj47XG5cbmNsYXNzIENsYXNzaWZpZWRDaGFuZ2VzIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyByZWFkb25seSBjaGFuZ2U6IFJlc291cmNlQ2hhbmdlLFxuICAgIHB1YmxpYyByZWFkb25seSBob3Rzd2FwcGFibGVQcm9wczogUHJvcERpZmZzLFxuICAgIHB1YmxpYyByZWFkb25seSBub25Ib3Rzd2FwcGFibGVQcm9wczogUHJvcERpZmZzLFxuICApIHtcbiAgfVxuXG4gIHB1YmxpYyByZXBvcnROb25Ib3Rzd2FwcGFibGVQcm9wZXJ0eUNoYW5nZXMocmV0OiBIb3Rzd2FwQ2hhbmdlW10pOiB2b2lkIHtcbiAgICBjb25zdCBub25Ib3Rzd2FwcGFibGVQcm9wTmFtZXMgPSBPYmplY3Qua2V5cyh0aGlzLm5vbkhvdHN3YXBwYWJsZVByb3BzKTtcbiAgICBpZiAobm9uSG90c3dhcHBhYmxlUHJvcE5hbWVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IHRhZ09ubHlDaGFuZ2UgPSBub25Ib3Rzd2FwcGFibGVQcm9wTmFtZXMubGVuZ3RoID09PSAxICYmIG5vbkhvdHN3YXBwYWJsZVByb3BOYW1lc1swXSA9PT0gJ1RhZ3MnO1xuICAgICAgY29uc3QgcmVhc29uID0gdGFnT25seUNoYW5nZSA/IE5vbkhvdHN3YXBwYWJsZVJlYXNvbi5UQUdTIDogTm9uSG90c3dhcHBhYmxlUmVhc29uLlBST1BFUlRJRVM7XG4gICAgICBjb25zdCBkZXNjcmlwdGlvbiA9IHRhZ09ubHlDaGFuZ2UgPyAnVGFncyBhcmUgbm90IGhvdHN3YXBwYWJsZScgOiBgcmVzb3VyY2UgcHJvcGVydGllcyAnJHtub25Ib3Rzd2FwcGFibGVQcm9wTmFtZXN9JyBhcmUgbm90IGhvdHN3YXBwYWJsZSBvbiB0aGlzIHJlc291cmNlIHR5cGVgO1xuXG4gICAgICByZXQucHVzaChub25Ib3Rzd2FwcGFibGVDaGFuZ2UoXG4gICAgICAgIHRoaXMuY2hhbmdlLFxuICAgICAgICByZWFzb24sXG4gICAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgICB0aGlzLm5vbkhvdHN3YXBwYWJsZVByb3BzLFxuICAgICAgKSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldCBuYW1lc09mSG90c3dhcHBhYmxlUHJvcHMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLmhvdHN3YXBwYWJsZVByb3BzKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY2xhc3NpZnlDaGFuZ2VzKHhzOiBSZXNvdXJjZUNoYW5nZSwgaG90c3dhcHBhYmxlUHJvcE5hbWVzOiBzdHJpbmdbXSk6IENsYXNzaWZpZWRDaGFuZ2VzIHtcbiAgY29uc3QgaG90c3dhcHBhYmxlUHJvcHM6IFByb3BEaWZmcyA9IHt9O1xuICBjb25zdCBub25Ib3Rzd2FwcGFibGVQcm9wczogUHJvcERpZmZzID0ge307XG5cbiAgZm9yIChjb25zdCBbbmFtZSwgcHJvcERpZmZdIG9mIE9iamVjdC5lbnRyaWVzKHhzLnByb3BlcnR5VXBkYXRlcykpIHtcbiAgICBpZiAoaG90c3dhcHBhYmxlUHJvcE5hbWVzLmluY2x1ZGVzKG5hbWUpKSB7XG4gICAgICBob3Rzd2FwcGFibGVQcm9wc1tuYW1lXSA9IHByb3BEaWZmO1xuICAgIH0gZWxzZSB7XG4gICAgICBub25Ib3Rzd2FwcGFibGVQcm9wc1tuYW1lXSA9IHByb3BEaWZmO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXcgQ2xhc3NpZmllZENoYW5nZXMoeHMsIGhvdHN3YXBwYWJsZVByb3BzLCBub25Ib3Rzd2FwcGFibGVQcm9wcyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBub25Ib3Rzd2FwcGFibGVDaGFuZ2UoXG4gIGNoYW5nZTogUmVzb3VyY2VDaGFuZ2UsXG4gIHJlYXNvbjogTm9uSG90c3dhcHBhYmxlUmVhc29uLFxuICBkZXNjcmlwdGlvbjogc3RyaW5nLFxuICBub25Ib3Rzd2FwcGFibGVQcm9wcz86IFByb3BEaWZmcyxcbiAgaG90c3dhcE9ubHlWaXNpYmxlOiBib29sZWFuID0gdHJ1ZSxcbik6IFJlamVjdGVkQ2hhbmdlIHtcbiAgcmV0dXJuIHtcbiAgICBob3Rzd2FwcGFibGU6IGZhbHNlLFxuICAgIGhvdHN3YXBPbmx5VmlzaWJsZSxcbiAgICBjaGFuZ2U6IHtcbiAgICAgIHJlYXNvbixcbiAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgc3ViamVjdDoge1xuICAgICAgICB0eXBlOiAnUmVzb3VyY2UnLFxuICAgICAgICBsb2dpY2FsSWQ6IGNoYW5nZS5sb2dpY2FsSWQsXG4gICAgICAgIHJlc291cmNlVHlwZTogY2hhbmdlLm5ld1ZhbHVlLlR5cGUsXG4gICAgICAgIHJlamVjdGVkUHJvcGVydGllczogT2JqZWN0LmtleXMobm9uSG90c3dhcHBhYmxlUHJvcHMgPz8gY2hhbmdlLnByb3BlcnR5VXBkYXRlcyksXG4gICAgICAgIG1ldGFkYXRhOiBjaGFuZ2UubWV0YWRhdGEsXG4gICAgICB9LFxuICAgIH0sXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBub25Ib3Rzd2FwcGFibGVSZXNvdXJjZShjaGFuZ2U6IFJlc291cmNlQ2hhbmdlKTogUmVqZWN0ZWRDaGFuZ2Uge1xuICByZXR1cm4ge1xuICAgIGhvdHN3YXBwYWJsZTogZmFsc2UsXG4gICAgY2hhbmdlOiB7XG4gICAgICByZWFzb246IE5vbkhvdHN3YXBwYWJsZVJlYXNvbi5SRVNPVVJDRV9VTlNVUFBPUlRFRCxcbiAgICAgIGRlc2NyaXB0aW9uOiAnVGhpcyByZXNvdXJjZSB0eXBlIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIGhvdHN3YXAgZGVwbG95bWVudHMnLFxuICAgICAgc3ViamVjdDoge1xuICAgICAgICB0eXBlOiAnUmVzb3VyY2UnLFxuICAgICAgICBsb2dpY2FsSWQ6IGNoYW5nZS5sb2dpY2FsSWQsXG4gICAgICAgIHJlc291cmNlVHlwZTogY2hhbmdlLm5ld1ZhbHVlLlR5cGUsXG4gICAgICAgIHJlamVjdGVkUHJvcGVydGllczogT2JqZWN0LmtleXMoY2hhbmdlLnByb3BlcnR5VXBkYXRlcyksXG4gICAgICAgIG1ldGFkYXRhOiBjaGFuZ2UubWV0YWRhdGEsXG4gICAgICB9LFxuICAgIH0sXG4gIH07XG59XG4iXX0=
@@ -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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWNzLXNlcnZpY2VzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZWNzLXNlcnZpY2VzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBZUEsd0VBb0pDO0FBL0pELHFDQUdrQjtBQUNsQixvREFBb0Y7QUFDcEYscUNBQTBFO0FBSTFFLE1BQU0seUJBQXlCLEdBQUcsbUJBQW1CLENBQUM7QUFFL0MsS0FBSyxVQUFVLDhCQUE4QixDQUNsRCxTQUFpQixFQUNqQixNQUFzQixFQUN0QixtQkFBbUQsRUFDbkQsd0JBQWtEO0lBRWxELHlFQUF5RTtJQUN6RSxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxLQUFLLDBCQUEwQixFQUFFLENBQUM7UUFDeEQsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0lBRUQsTUFBTSxHQUFHLEdBQW9CLEVBQUUsQ0FBQztJQUVoQyxxRkFBcUY7SUFDckYscUZBQXFGO0lBQ3JGLHVEQUF1RDtJQUN2RCxNQUFNLGlCQUFpQixHQUFHLElBQUEsd0JBQWUsRUFBQyxNQUFNLEVBQUUsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLENBQUM7SUFDNUUsaUJBQWlCLENBQUMsb0NBQW9DLENBQUMsR0FBRyxDQUFDLENBQUM7SUFFNUQsdUVBQXVFO0lBQ3ZFLE1BQU0sMkJBQTJCLEdBQUcsbUJBQW1CLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDcEYsTUFBTSxxQ0FBcUMsR0FBRywyQkFBMkIsQ0FBQyxNQUFNLENBQzlFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLHlCQUF5QixDQUM1QyxDQUFDO0lBQ0YsTUFBTSw2QkFBNkIsR0FBRyxJQUFJLEtBQUssRUFBYyxDQUFDO0lBQzlELEtBQUssTUFBTSxrQkFBa0IsSUFBSSxxQ0FBcUMsRUFBRSxDQUFDO1FBQ3ZFLE1BQU0sVUFBVSxHQUFHLE1BQU0sbUJBQW1CLENBQUMsbUJBQW1CLENBQUMsa0JBQWtCLENBQUMsU0FBUyxD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LEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNyQyxDQUFDLENBQUMsZ0dBQWdHO1lBQ2xHLGVBQWUsQ0FBQztJQUNwQiw4RkFBOEY7SUFDOUYsT0FBTztRQUNMLEdBQUcsQ0FBQyxNQUFNLG1CQUFtQixDQUFDLHFCQUFxQixDQUFDO1lBQ2xELEdBQUcsQ0FBQyxzQkFBc0IsSUFBSSxFQUFFLENBQUM7WUFDakMsTUFBTSxFQUFFLFNBQVM7U0FDbEIsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxFQUFFLE1BQU07S0FDZixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHtcbiAgSG90c3dhcFByb3BlcnR5T3ZlcnJpZGVzLFxuICBIb3Rzd2FwQ2hhbmdlLFxufSBmcm9tICcuL2NvbW1vbic7XG5pbXBvcnQge1xuICBjbGFzc2lmeUNoYW5nZXMsXG4gIG5vbkhvdHN3YXBwYWJsZUNoYW5nZSxcbn0gZnJvbSAnLi9jb21tb24nO1xuaW1wb3J0IHsgTm9uSG90c3dhcHBhYmxlUmVhc29uLCB0eXBlIFJlc291cmNlQ2hhbmdlIH0gZnJvbSAnLi4vLi4vcGF5bG9hZHMvaG90c3dhcCc7XG5pbXBvcnQgeyBsb3dlckNhc2VGaXJzdENoYXJhY3RlciwgdHJhbnNmb3JtT2JqZWN0S2V5cyB9IGZyb20gJy4uLy4uL3V0aWwnO1xuaW1wb3J0IHR5cGUgeyBTREsgfSBmcm9tICcuLi9hd3MtYXV0aC9wcml2YXRlJztcbmltcG9ydCB0eXBlIHsgRXZhbHVhdGVDbG91ZEZvcm1hdGlvblRlbXBsYXRlIH0gZnJvbSAnLi4vY2xvdWRmb3JtYXRpb24nO1xuXG5jb25zdCBFQ1NfU0VSVklDRV9SRVNPVVJDRV9UWVBFID0gJ0FXUzo6RUNTOjpTZXJ2aWNlJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGlzSG90c3dhcHBhYmxlRWNzU2VydmljZUNoYW5nZShcbiAgbG9naWNhbElkOiBzdHJpbmcsXG4gIGNoYW5nZTogUmVzb3VyY2VDaGFuZ2UsXG4gIGV2YWx1YXRlQ2ZuVGVtcGxhdGU6IEV2YWx1YXRlQ2xvdWRGb3JtYXRpb25UZW1wbGF0ZSxcbiAgaG90c3dhcFByb3BlcnR5T3ZlcnJpZGVzOiBIb3Rzd2FwUHJvcGVydHlPdmVycmlkZXMsXG4pOiBQcm9taXNlPEhvdHN3YXBDaGFuZ2VbXT4ge1xuICAvLyB0aGUgb25seSByZXNvdXJjZSBjaGFuZ2Ugd2UgY2FuIGV2YWx1YXRlIGhlcmUgaXMgYW4gRUNTIFRhc2tEZWZpbml0aW9uXG4gIGlmIChjaGFuZ2UubmV3VmFsdWUuVHlwZSAhPT0gJ0FXUzo6RUNTOjpUYXNrRGVmaW5pdGlvbicpIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBjb25zdCByZXQ6IEhvdHN3YXBDaGFuZ2VbXSA9IFtdO1xuXG4gIC8vIFdlIG9ubHkgYWxsb3cgYSBjaGFuZ2UgaW4gdGhlIENvbnRhaW5lckRlZmluaXRpb25zIG9mIHRoZSBUYXNrRGVmaW5pdGlvbiBmb3Igbm93IC1cbiAgLy8gaXQgY29udGFpbnMgdGhlIGltYWdlIGFuZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMsIHNvIHNlZW1zIGxpa2UgYSBzYWZlIGJldCBmb3Igbm93LlxuICAvLyBXZSBtaWdodCByZXZpc2l0IHRoaXMgZGVjaXNpb24gaW4gdGhlIGZ1dHVyZSB0aG91Z2ghXG4gIGNvbnN0IGNsYXNzaWZpZWRDaGFuZ2VzID0gY2xhc3NpZnlDaGFuZ2VzKGNoYW5nZSwgWydDb250YWluZXJEZWZpbml0aW9ucyddKTtcbiAgY2xhc3NpZmllZENoYW5nZXMucmVwb3J0Tm9uSG90c3dhcHBhYmxlUHJvcGVydHlDaGFuZ2VzKHJldCk7XG5cbiAgLy8gZmluZCBhbGwgRUNTIFNlcnZpY2VzIHRoYXQgcmVmZXJlbmNlIHRoZSBUYXNrRGVmaW5pdGlvbiB0aGF0IGNoYW5nZWRcbiAgY29uc3QgcmVzb3VyY2VzUmVmZXJlbmNpbmdUYXNrRGVmID0gZXZhbHVhdGVDZm5UZW1wbGF0ZS5maW5kUmVmZXJlbmNlc1RvKGxvZ2ljYWxJZCk7XG4gIGNvbnN0IGVjc1NlcnZpY2VSZXNvdXJjZXNSZWZlcmVuY2luZ1Rhc2tEZWYgPSByZXNvdXJjZXNSZWZlcmVuY2luZ1Rhc2tEZWYuZmlsdGVyKFxuICAgIChyKSA9PiByLlR5cGUgPT09IEVDU19TRVJWSUNFX1JFU09VUkNFX1RZUEUsXG4gICk7XG4gIGNvbnN0IGVjc1NlcnZpY2VzUmVmZXJlbmNpbmdUYXNrRGVmID0gbmV3IEFycmF5PEVjc1NlcnZpY2U+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 {};