@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,3 @@
1
+ export * from './garbage-collector';
2
+ export * from './progress-printer';
3
+ export * from './stack-refresh';
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./garbage-collector"), exports);
18
+ // testing exports
19
+ __exportStar(require("./progress-printer"), exports);
20
+ __exportStar(require("./stack-refresh"), exports);
21
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsc0RBQW9DO0FBRXBDLGtCQUFrQjtBQUNsQixxREFBbUM7QUFDbkMsa0RBQWdDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9nYXJiYWdlLWNvbGxlY3Rvcic7XG5cbi8vIHRlc3RpbmcgZXhwb3J0c1xuZXhwb3J0ICogZnJvbSAnLi9wcm9ncmVzcy1wcmludGVyJztcbmV4cG9ydCAqIGZyb20gJy4vc3RhY2stcmVmcmVzaCc7XG4iXX0=
@@ -0,0 +1,23 @@
1
+ import type { GcAsset as GCAsset } from './garbage-collector';
2
+ import { type IoHelper } from '../io/private';
3
+ export declare class ProgressPrinter {
4
+ private ioHelper;
5
+ private totalAssets;
6
+ private assetsScanned;
7
+ private taggedAsset;
8
+ private taggedAssetsSizeMb;
9
+ private deletedAssets;
10
+ private deletedAssetsSizeMb;
11
+ private interval;
12
+ private setInterval?;
13
+ private isPaused;
14
+ constructor(ioHelper: IoHelper, totalAssets: number, interval?: number);
15
+ reportScannedAsset(amt: number): void;
16
+ reportTaggedAsset(assets: GCAsset[]): void;
17
+ reportDeletedAsset(assets: GCAsset[]): void;
18
+ start(): void;
19
+ pause(): void;
20
+ resume(): void;
21
+ stop(): void;
22
+ private print;
23
+ }
@@ -0,0 +1,80 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ProgressPrinter = void 0;
4
+ const chalk = require("chalk");
5
+ const toolkit_error_1 = require("../../toolkit/toolkit-error");
6
+ const private_1 = require("../io/private");
7
+ class ProgressPrinter {
8
+ ioHelper;
9
+ totalAssets;
10
+ assetsScanned;
11
+ taggedAsset;
12
+ taggedAssetsSizeMb;
13
+ deletedAssets;
14
+ deletedAssetsSizeMb;
15
+ interval;
16
+ setInterval;
17
+ isPaused;
18
+ constructor(ioHelper, totalAssets, interval) {
19
+ this.ioHelper = ioHelper;
20
+ this.totalAssets = totalAssets;
21
+ this.assetsScanned = 0;
22
+ this.taggedAsset = 0;
23
+ this.taggedAssetsSizeMb = 0;
24
+ this.deletedAssets = 0;
25
+ this.deletedAssetsSizeMb = 0;
26
+ this.interval = interval ?? 10_000;
27
+ this.isPaused = false;
28
+ }
29
+ reportScannedAsset(amt) {
30
+ this.assetsScanned += amt;
31
+ }
32
+ reportTaggedAsset(assets) {
33
+ this.taggedAsset += assets.length;
34
+ const sizeInBytes = assets.reduce((total, asset) => total + asset.size, 0);
35
+ this.taggedAssetsSizeMb += sizeInBytes / 1_048_576;
36
+ }
37
+ reportDeletedAsset(assets) {
38
+ this.deletedAssets += assets.length;
39
+ const sizeInBytes = assets.reduce((total, asset) => total + asset.size, 0);
40
+ this.deletedAssetsSizeMb += sizeInBytes / 1_048_576;
41
+ }
42
+ start() {
43
+ // If there is already a running setInterval, throw an error.
44
+ // This is because if this.setInterval is reassigned to another setInterval,
45
+ // the original setInterval remains and can no longer be cleared.
46
+ if (this.setInterval) {
47
+ throw new toolkit_error_1.ToolkitError('ProgressPrinter is already running. Stop it first using the stop() method before starting it again.');
48
+ }
49
+ this.setInterval = setInterval(() => {
50
+ if (!this.isPaused) {
51
+ this.print();
52
+ }
53
+ }, this.interval);
54
+ }
55
+ pause() {
56
+ this.isPaused = true;
57
+ }
58
+ resume() {
59
+ this.isPaused = false;
60
+ }
61
+ stop() {
62
+ clearInterval(this.setInterval);
63
+ // print one last time if not paused
64
+ if (!this.isPaused) {
65
+ this.print();
66
+ }
67
+ }
68
+ print() {
69
+ const percentage = ((this.assetsScanned / this.totalAssets) * 100).toFixed(2);
70
+ // print in MiB until we hit at least 1 GiB of data tagged/deleted
71
+ if (Math.max(this.taggedAssetsSizeMb, this.deletedAssetsSizeMb) >= 1000) {
72
+ void this.ioHelper.notify(private_1.IO.DEFAULT_TOOLKIT_INFO.msg(chalk.green(`[${percentage}%] ${this.assetsScanned} files scanned: ${this.taggedAsset} assets (${(this.taggedAssetsSizeMb / 1000).toFixed(2)} GiB) tagged, ${this.deletedAssets} assets (${(this.deletedAssetsSizeMb / 1000).toFixed(2)} GiB) deleted.`)));
73
+ }
74
+ else {
75
+ void this.ioHelper.notify(private_1.IO.DEFAULT_TOOLKIT_INFO.msg(chalk.green(`[${percentage}%] ${this.assetsScanned} files scanned: ${this.taggedAsset} assets (${this.taggedAssetsSizeMb.toFixed(2)} MiB) tagged, ${this.deletedAssets} assets (${this.deletedAssetsSizeMb.toFixed(2)} MiB) deleted.`)));
76
+ }
77
+ }
78
+ }
79
+ exports.ProgressPrinter = ProgressPrinter;
80
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZ3Jlc3MtcHJpbnRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInByb2dyZXNzLXByaW50ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsK0JBQStCO0FBRS9CLCtEQUEyRDtBQUMzRCwyQ0FBa0Q7QUFFbEQsTUFBYSxlQUFlO0lBQ2xCLFFBQVEsQ0FBVztJQUNuQixXQUFXLENBQVM7SUFDcEIsYUFBYSxDQUFTO0lBQ3RCLFdBQVcsQ0FBUztJQUNwQixrQkFBa0IsQ0FBUztJQUMzQixhQUFhLENBQVM7SUFDdEIsbUJBQW1CLENBQVM7SUFDNUIsUUFBUSxDQUFTO0lBQ2pCLFdBQVcsQ0FBaUM7SUFDNUMsUUFBUSxDQUFVO0lBRTFCLFlBQVksUUFBa0IsRUFBRSxXQUFtQixFQUFFLFFBQWlCO1FBQ3BFLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO1FBQy9CLElBQUksQ0FBQyxhQUFhLEdBQUcsQ0FBQyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDO1FBQ3JCLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxDQUFDLENBQUM7UUFDNUIsSUFBSSxDQUFDLGFBQWEsR0FBRyxDQUFDLENBQUM7UUFDdkIsSUFBSSxDQUFDLG1CQUFtQixHQUFHLENBQUMsQ0FBQztRQUM3QixJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsSUFBSSxNQUFNLENBQUM7UUFDbkMsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7SUFDeEIsQ0FBQztJQUVNLGtCQUFrQixDQUFDLEdBQVc7UUFDbkMsSUFBSSxDQUFDLGFBQWEsSUFBSSxHQUFHLENBQUM7SUFDNUIsQ0FBQztJQUVNLGlCQUFpQixDQUFDLE1BQWlCO1FBQ3hDLElBQUksQ0FBQyxXQUFXLElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQztRQUNsQyxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsTUFBTSxD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QUFPLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2pTLENBQUM7SUFDSCxDQUFDO0NBQ0Y7QUFoRkQsMENBZ0ZDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBHY0Fzc2V0IGFzIEdDQXNzZXQgfSBmcm9tICcuL2dhcmJhZ2UtY29sbGVjdG9yJztcbmltcG9ydCB7IFRvb2xraXRFcnJvciB9IGZyb20gJy4uLy4uL3Rvb2xraXQvdG9vbGtpdC1lcnJvcic7XG5pbXBvcnQgeyBJTywgdHlwZSBJb0hlbHBlciB9IGZyb20gJy4uL2lvL3ByaXZhdGUnO1xuXG5leHBvcnQgY2xhc3MgUHJvZ3Jlc3NQcmludGVyIHtcbiAgcHJpdmF0ZSBpb0hlbHBlcjogSW9IZWxwZXI7XG4gIHByaXZhdGUgdG90YWxBc3NldHM6IG51bWJlcjtcbiAgcHJpdmF0ZSBhc3NldHNTY2FubmVkOiBudW1iZXI7XG4gIHByaXZhdGUgdGFnZ2VkQXNzZXQ6IG51bWJlcjtcbiAgcHJpdmF0ZSB0YWdnZWRBc3NldHNTaXplTWI6IG51bWJlcjtcbiAgcHJpdmF0ZSBkZWxldGVkQXNzZXRzOiBudW1iZXI7XG4gIHByaXZhdGUgZGVsZXRlZEFzc2V0c1NpemVNYjogbnVtYmVyO1xuICBwcml2YXRlIGludGVydmFsOiBudW1iZXI7XG4gIHByaXZhdGUgc2V0SW50ZXJ2YWw/OiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PjtcbiAgcHJpdmF0ZSBpc1BhdXNlZDogYm9vbGVhbjtcblxuICBjb25zdHJ1Y3Rvcihpb0hlbHBlcjogSW9IZWxwZXIsIHRvdGFsQXNzZXRzOiBudW1iZXIsIGludGVydmFsPzogbnVtYmVyKSB7XG4gICAgdGhpcy5pb0hlbHBlciA9IGlvSGVscGVyO1xuICAgIHRoaXMudG90YWxBc3NldHMgPSB0b3RhbEFzc2V0cztcbiAgICB0aGlzLmFzc2V0c1NjYW5uZWQgPSAwO1xuICAgIHRoaXMudGFnZ2VkQXNzZXQgPSAwO1xuICAgIHRoaXMudGFnZ2VkQXNzZXRzU2l6ZU1iID0gMDtcbiAgICB0aGlzLmRlbGV0ZWRBc3NldHMgPSAwO1xuICAgIHRoaXMuZGVsZXRlZEFzc2V0c1NpemVNYiA9IDA7XG4gICAgdGhpcy5pbnRlcnZhbCA9IGludGVydmFsID8/IDEwXzAwMDtcbiAgICB0aGlzLmlzUGF1c2VkID0gZmFsc2U7XG4gIH1cblxuICBwdWJsaWMgcmVwb3J0U2Nhbm5lZEFzc2V0KGFtdDogbnVtYmVyKSB7XG4gICAgdGhpcy5hc3NldHNTY2FubmVkICs9IGFtdDtcbiAgfVxuXG4gIHB1YmxpYyByZXBvcnRUYWdnZWRBc3NldChhc3NldHM6IEdDQXNzZXRbXSkge1xuICAgIHRoaXMudGFnZ2VkQXNzZXQgKz0gYXNzZXRzLmxlbmd0aDtcbiAgICBjb25zdCBzaXplSW5CeXRlcyA9IGFzc2V0cy5yZWR1Y2UoKHRvdGFsLCBhc3NldCkgPT4gdG90YWwgKyBhc3NldC5zaXplLCAwKTtcbiAgICB0aGlzLnRhZ2dlZEFzc2V0c1NpemVNYiArPSBzaXplSW5CeXRlcyAvIDFfMDQ4XzU3NjtcbiAgfVxuXG4gIHB1YmxpYyByZXBvcnREZWxldGVkQXNzZXQoYXNzZXRzOiBHQ0Fzc2V0W10pIHtcbiAgICB0aGlzLmRlbGV0ZWRBc3NldHMgKz0gYXNzZXRzLmxlbmd0aDtcbiAgICBjb25zdCBzaXplSW5CeXRlcyA9IGFzc2V0cy5yZWR1Y2UoKHRvdGFsLCBhc3NldCkgPT4gdG90YWwgKyBhc3NldC5zaXplLCAwKTtcbiAgICB0aGlzLmRlbGV0ZWRBc3NldHNTaXplTWIgKz0gc2l6ZUluQnl0ZXMgLyAxXzA0OF81NzY7XG4gIH1cblxuICBwdWJsaWMgc3RhcnQoKSB7XG4gICAgLy8gSWYgdGhlcmUgaXMgYWxyZWFkeSBhIHJ1bm5pbmcgc2V0SW50ZXJ2YWwsIHRocm93IGFuIGVycm9yLlxuICAgIC8vIFRoaXMgaXMgYmVjYXVzZSBpZiB0aGlzLnNldEludGVydmFsIGlzIHJlYXNzaWduZWQgdG8gYW5vdGhlciBzZXRJbnRlcnZhbCxcbiAgICAvLyB0aGUgb3JpZ2luYWwgc2V0SW50ZXJ2YWwgcmVtYWlucyBhbmQgY2FuIG5vIGxvbmdlciBiZSBjbGVhcmVkLlxuICAgIGlmICh0aGlzLnNldEludGVydmFsKSB7XG4gICAgICB0aHJvdyBuZXcgVG9vbGtpdEVycm9yKCdQcm9ncmVzc1ByaW50ZXIgaXMgYWxyZWFkeSBydW5uaW5nLiBTdG9wIGl0IGZpcnN0IHVzaW5nIHRoZSBzdG9wKCkgbWV0aG9kIGJlZm9yZSBzdGFydGluZyBpdCBhZ2Fpbi4nKTtcbiAgICB9XG5cbiAgICB0aGlzLnNldEludGVydmFsID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLmlzUGF1c2VkKSB7XG4gICAgICAgIHRoaXMucHJpbnQoKTtcbiAgICAgIH1cbiAgICB9LCB0aGlzLmludGVydmFsKTtcbiAgfVxuXG4gIHB1YmxpYyBwYXVzZSgpIHtcbiAgICB0aGlzLmlzUGF1c2VkID0gdHJ1ZTtcbiAgfVxuXG4gIHB1YmxpYyByZXN1bWUoKSB7XG4gICAgdGhpcy5pc1BhdXNlZCA9IGZhbHNlO1xuICB9XG5cbiAgcHVibGljIHN0b3AoKSB7XG4gICAgY2xlYXJJbnRlcnZhbCh0aGlzLnNldEludGVydmFsKTtcbiAgICAvLyBwcmludCBvbmUgbGFzdCB0aW1lIGlmIG5vdCBwYXVzZWRcbiAgICBpZiAoIXRoaXMuaXNQYXVzZWQpIHtcbiAgICAgIHRoaXMucHJpbnQoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHByaW50KCkge1xuICAgIGNvbnN0IHBlcmNlbnRhZ2UgPSAoKHRoaXMuYXNzZXRzU2Nhbm5lZCAvIHRoaXMudG90YWxBc3NldHMpICogMTAwKS50b0ZpeGVkKDIpO1xuICAgIC8vIHByaW50IGluIE1pQiB1bnRpbCB3ZSBoaXQgYXQgbGVhc3QgMSBHaUIgb2YgZGF0YSB0YWdnZWQvZGVsZXRlZFxuICAgIGlmIChNYXRoLm1heCh0aGlzLnRhZ2dlZEFzc2V0c1NpemVNYiwgdGhpcy5kZWxldGVkQXNzZXRzU2l6ZU1iKSA+PSAxMDAwKSB7XG4gICAgICB2b2lkIHRoaXMuaW9IZWxwZXIubm90aWZ5KElPLkRFRkFVTFRfVE9PTEtJVF9JTkZPLm1zZyhjaGFsay5ncmVlbihgWyR7cGVyY2VudGFnZX0lXSAke3RoaXMuYXNzZXRzU2Nhbm5lZH0gZmlsZXMgc2Nhbm5lZDogJHt0aGlzLnRhZ2dlZEFzc2V0fSBhc3NldHMgKCR7KHRoaXMudGFnZ2VkQXNzZXRzU2l6ZU1iIC8gMTAwMCkudG9GaXhlZCgyKX0gR2lCKSB0YWdnZWQsICR7dGhpcy5kZWxldGVkQXNzZXRzfSBhc3NldHMgKCR7KHRoaXMuZGVsZXRlZEFzc2V0c1NpemVNYiAvIDEwMDApLnRvRml4ZWQoMil9IEdpQikgZGVsZXRlZC5gKSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2b2lkIHRoaXMuaW9IZWxwZXIubm90aWZ5KElPLkRFRkFVTFRfVE9PTEtJVF9JTkZPLm1zZyhjaGFsay5ncmVlbihgWyR7cGVyY2VudGFnZX0lXSAke3RoaXMuYXNzZXRzU2Nhbm5lZH0gZmlsZXMgc2Nhbm5lZDogJHt0aGlzLnRhZ2dlZEFzc2V0fSBhc3NldHMgKCR7dGhpcy50YWdnZWRBc3NldHNTaXplTWIudG9GaXhlZCgyKX0gTWlCKSB0YWdnZWQsICR7dGhpcy5kZWxldGVkQXNzZXRzfSBhc3NldHMgKCR7dGhpcy5kZWxldGVkQXNzZXRzU2l6ZU1iLnRvRml4ZWQoMil9IE1pQikgZGVsZXRlZC5gKSkpO1xuICAgIH1cbiAgfVxufVxuIl19
@@ -0,0 +1,49 @@
1
+ import type { ICloudFormationClient } from '../aws-auth/private';
2
+ import { type IoHelper } from '../io/private';
3
+ export declare class ActiveAssetCache {
4
+ private readonly stacks;
5
+ rememberStack(stackTemplate: string): void;
6
+ contains(asset: string): boolean;
7
+ }
8
+ export declare function refreshStacks(cfn: ICloudFormationClient, ioHelper: IoHelper, activeAssets: ActiveAssetCache, qualifier?: string): Promise<void>;
9
+ /**
10
+ * Background Stack Refresh properties
11
+ */
12
+ export interface BackgroundStackRefreshProps {
13
+ /**
14
+ * The CFN SDK handler
15
+ */
16
+ readonly cfn: ICloudFormationClient;
17
+ /**
18
+ * Used to send messages.
19
+ */
20
+ readonly ioHelper: IoHelper;
21
+ /**
22
+ * Active Asset storage
23
+ */
24
+ readonly activeAssets: ActiveAssetCache;
25
+ /**
26
+ * Stack bootstrap qualifier
27
+ */
28
+ readonly qualifier?: string;
29
+ }
30
+ /**
31
+ * Class that controls scheduling of the background stack refresh
32
+ */
33
+ export declare class BackgroundStackRefresh {
34
+ private readonly props;
35
+ private timeout?;
36
+ private lastRefreshTime;
37
+ private queuedPromises;
38
+ constructor(props: BackgroundStackRefreshProps);
39
+ start(): void;
40
+ private refresh;
41
+ private justRefreshedStacks;
42
+ /**
43
+ * Checks if the last successful background refresh happened within the specified time frame.
44
+ * If the last refresh is older than the specified time frame, it returns a Promise that resolves
45
+ * when the next background refresh completes or rejects if the refresh takes too long.
46
+ */
47
+ noOlderThan(ms: number): Promise<unknown>;
48
+ stop(): void;
49
+ }
@@ -0,0 +1,152 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BackgroundStackRefresh = exports.ActiveAssetCache = void 0;
4
+ exports.refreshStacks = refreshStacks;
5
+ const toolkit_error_1 = require("../../toolkit/toolkit-error");
6
+ const private_1 = require("../io/private");
7
+ class ActiveAssetCache {
8
+ stacks = new Set();
9
+ rememberStack(stackTemplate) {
10
+ this.stacks.add(stackTemplate);
11
+ }
12
+ contains(asset) {
13
+ for (const stack of this.stacks) {
14
+ if (stack.includes(asset)) {
15
+ return true;
16
+ }
17
+ }
18
+ return false;
19
+ }
20
+ }
21
+ exports.ActiveAssetCache = ActiveAssetCache;
22
+ async function paginateSdkCall(cb) {
23
+ let finished = false;
24
+ let nextToken;
25
+ while (!finished) {
26
+ nextToken = await cb(nextToken);
27
+ if (nextToken === undefined) {
28
+ finished = true;
29
+ }
30
+ }
31
+ }
32
+ /**
33
+ * Fetches all relevant stack templates from CloudFormation. It ignores the following stacks:
34
+ * - stacks in DELETE_COMPLETE or DELETE_IN_PROGRESS stage
35
+ * - stacks that are using a different bootstrap qualifier
36
+ */
37
+ async function fetchAllStackTemplates(cfn, ioHelper, qualifier) {
38
+ const stackNames = [];
39
+ await paginateSdkCall(async (nextToken) => {
40
+ const stacks = await cfn.listStacks({ NextToken: nextToken });
41
+ // We ignore stacks with these statuses because their assets are no longer live
42
+ const ignoredStatues = ['CREATE_FAILED', 'DELETE_COMPLETE', 'DELETE_IN_PROGRESS', 'DELETE_FAILED', 'REVIEW_IN_PROGRESS'];
43
+ stackNames.push(...(stacks.StackSummaries ?? [])
44
+ .filter((s) => !ignoredStatues.includes(s.StackStatus))
45
+ .map((s) => s.StackId ?? s.StackName));
46
+ return stacks.NextToken;
47
+ });
48
+ await ioHelper.notify(private_1.IO.DEFAULT_TOOLKIT_DEBUG.msg(`Parsing through ${stackNames.length} stacks`));
49
+ const templates = [];
50
+ for (const stack of stackNames) {
51
+ let summary;
52
+ summary = await cfn.getTemplateSummary({
53
+ StackName: stack,
54
+ });
55
+ if (bootstrapFilter(summary.Parameters, qualifier)) {
56
+ // This stack is definitely bootstrapped to a different qualifier so we can safely ignore it
57
+ continue;
58
+ }
59
+ else {
60
+ const template = await cfn.getTemplate({
61
+ StackName: stack,
62
+ });
63
+ templates.push((template.TemplateBody ?? '') + JSON.stringify(summary?.Parameters));
64
+ }
65
+ }
66
+ await ioHelper.notify(private_1.IO.DEFAULT_TOOLKIT_DEBUG.msg('Done parsing through stacks'));
67
+ return templates;
68
+ }
69
+ /**
70
+ * Filter out stacks that we KNOW are using a different bootstrap qualifier
71
+ * This is mostly necessary for the integration tests that can run the same app (with the same assets)
72
+ * under different qualifiers.
73
+ * This is necessary because a stack under a different bootstrap could coincidentally reference the same hash
74
+ * and cause a false negative (cause an asset to be preserved when its isolated)
75
+ * This is intentionally done in a way where we ONLY filter out stacks that are meant for a different qualifier
76
+ * because we are okay with false positives.
77
+ */
78
+ function bootstrapFilter(parameters, qualifier) {
79
+ const bootstrapVersion = parameters?.find((p) => p.ParameterKey === 'BootstrapVersion');
80
+ const splitBootstrapVersion = bootstrapVersion?.DefaultValue?.split('/');
81
+ // We find the qualifier in a specific part of the bootstrap version parameter
82
+ return (qualifier &&
83
+ splitBootstrapVersion &&
84
+ splitBootstrapVersion.length == 4 &&
85
+ splitBootstrapVersion[2] != qualifier);
86
+ }
87
+ async function refreshStacks(cfn, ioHelper, activeAssets, qualifier) {
88
+ try {
89
+ const stacks = await fetchAllStackTemplates(cfn, ioHelper, qualifier);
90
+ for (const stack of stacks) {
91
+ activeAssets.rememberStack(stack);
92
+ }
93
+ }
94
+ catch (err) {
95
+ throw new toolkit_error_1.ToolkitError(`Error refreshing stacks: ${err}`);
96
+ }
97
+ }
98
+ /**
99
+ * Class that controls scheduling of the background stack refresh
100
+ */
101
+ class BackgroundStackRefresh {
102
+ props;
103
+ timeout;
104
+ lastRefreshTime;
105
+ queuedPromises = [];
106
+ constructor(props) {
107
+ this.props = props;
108
+ this.lastRefreshTime = Date.now();
109
+ }
110
+ start() {
111
+ // Since start is going to be called right after the first invocation of refreshStacks,
112
+ // lets wait some time before beginning the background refresh.
113
+ this.timeout = setTimeout(() => this.refresh(), 300_000); // 5 minutes
114
+ }
115
+ async refresh() {
116
+ const startTime = Date.now();
117
+ await refreshStacks(this.props.cfn, this.props.ioHelper, this.props.activeAssets, this.props.qualifier);
118
+ this.justRefreshedStacks();
119
+ // If the last invocation of refreshStacks takes <5 minutes, the next invocation starts 5 minutes after the last one started.
120
+ // If the last invocation of refreshStacks takes >5 minutes, the next invocation starts immediately.
121
+ this.timeout = setTimeout(() => this.refresh(), Math.max(startTime + 300_000 - Date.now(), 0));
122
+ }
123
+ justRefreshedStacks() {
124
+ this.lastRefreshTime = Date.now();
125
+ for (const p of this.queuedPromises.splice(0, this.queuedPromises.length)) {
126
+ p(undefined);
127
+ }
128
+ }
129
+ /**
130
+ * Checks if the last successful background refresh happened within the specified time frame.
131
+ * If the last refresh is older than the specified time frame, it returns a Promise that resolves
132
+ * when the next background refresh completes or rejects if the refresh takes too long.
133
+ */
134
+ noOlderThan(ms) {
135
+ const horizon = Date.now() - ms;
136
+ // The last refresh happened within the time frame
137
+ if (this.lastRefreshTime >= horizon) {
138
+ return Promise.resolve();
139
+ }
140
+ // The last refresh happened earlier than the time frame
141
+ // We will wait for the latest refresh to land or reject if it takes too long
142
+ return Promise.race([
143
+ new Promise(resolve => this.queuedPromises.push(resolve)),
144
+ new Promise((_, reject) => setTimeout(() => reject(new toolkit_error_1.ToolkitError('refreshStacks took too long; the background thread likely threw an error')), ms)),
145
+ ]);
146
+ }
147
+ stop() {
148
+ clearTimeout(this.timeout);
149
+ }
150
+ }
151
+ exports.BackgroundStackRefresh = BackgroundStackRefresh;
152
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhY2stcmVmcmVzaC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInN0YWNrLXJlZnJlc2gudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBbUdBLHNDQVNDO0FBM0dELCtEQUEyRDtBQUUzRCwyQ0FBa0Q7QUFFbEQsTUFBYSxnQkFBZ0I7SUFDVixNQUFNLEdBQWdCLElBQUksR0FBRyxFQUFFLENBQUM7SUFFMUMsYUFBYSxDQUFDLGFBQXFCO1FBQ3hDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFFTSxRQUFRLENBQUMsS0FBYTtRQUMzQixLQUFLLE1BQU0sS0FBSyxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNoQyxJQUFJLEtBQUssQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDMUIsT0FBTyxJQUFJLENBQUM7WUFDZCxDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztDQUNGO0FBZkQsNENBZUM7QUFFRCxLQUFLLFVBQVUsZUFBZSxDQUFDLEVBQXVEO0lBQ3BGLElBQUksUUFBUSxHQUFHLEtBQUssQ0FBQztJQUNyQixJQUFJLFNBQTZCLENBQUM7SUFDbEMsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2pCLFNBQVMsR0FBRyxNQUFNLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNoQyxJQUFJLFNBQVMsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUM1QixRQUFRLEdBQUcsSUFBSSxDQUFDO1FBQ2xCLENBQUM7SUFDSCxDQUFDO0FBQ0gsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxLQUFLLFVBQVUsc0JBQXNCLENBQUMsR0FBMEIsRUFBRSxRQUFrQixFQUFFLFNBQWtCO0lBQ3RHLE1BQU0sVUFBVSxHQUFhLEVBQUUsQ0FBQztJQUNoQyxNQUFNLGVBQWUsQ0FBQyxLQUFLLEVBQUUsU0FBUyxFQUFFLEVBQUU7UUFD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Q0FBQztJQUVPLG1CQUFtQjtRQUN6QixJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNsQyxLQUFLLE1BQU0sQ0FBQyxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDMUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2YsQ0FBQztJQUNILENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksV0FBVyxDQUFDLEVBQVU7UUFDM0IsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztRQUVoQyxrREFBa0Q7UUFDbEQsSUFBSSxJQUFJLENBQUMsZUFBZSxJQUFJLE9BQU8sRUFBRSxDQUFDO1lBQ3BDLE9BQU8sT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQzNCLENBQUM7UUFFRCx3REFBd0Q7UUFDeEQsNkVBQTZFO1FBQzdFLE9BQU8sT0FBTyxDQUFDLElBQUksQ0FBQztZQUNsQixJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3pELElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLDRCQUFZLENBQUMsMEVBQTBFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1NBQ3ZKLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTSxJQUFJO1FBQ1QsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUM3QixDQUFDO0NBQ0Y7QUF6REQsd0RBeURDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBQYXJhbWV0ZXJEZWNsYXJhdGlvbiB9IGZyb20gJ0Bhd3Mtc2RrL2NsaWVudC1jbG91ZGZvcm1hdGlvbic7XG5pbXBvcnQgeyBUb29sa2l0RXJyb3IgfSBmcm9tICcuLi8uLi90b29sa2l0L3Rvb2xraXQtZXJyb3InO1xuaW1wb3J0IHR5cGUgeyBJQ2xvdWRGb3JtYXRpb25DbGllbnQgfSBmcm9tICcuLi9hd3MtYXV0aC9wcml2YXRlJztcbmltcG9ydCB7IElPLCB0eXBlIElvSGVscGVyIH0gZnJvbSAnLi4vaW8vcHJpdmF0ZSc7XG5cbmV4cG9ydCBjbGFzcyBBY3RpdmVBc3NldENhY2hlIHtcbiAgcHJpdmF0ZSByZWFkb25seSBzdGFja3M6IFNldDxzdHJpbmc+ID0gbmV3IFNldCgpO1xuXG4gIHB1YmxpYyByZW1lbWJlclN0YWNrKHN0YWNrVGVtcGxhdGU6IHN0cmluZykge1xuICAgIHRoaXMuc3RhY2tzLmFkZChzdGFja1RlbXBsYXRlKTtcbiAgfVxuXG4gIHB1YmxpYyBjb250YWlucyhhc3NldDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgZm9yIChjb25zdCBzdGFjayBvZiB0aGlzLnN0YWNrcykge1xuICAgICAgaWYgKHN0YWNrLmluY2x1ZGVzKGFzc2V0KSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHBhZ2luYXRlU2RrQ2FsbChjYjogKG5leHRUb2tlbj86IHN0cmluZykgPT4gUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+KSB7XG4gIGxldCBmaW5pc2hlZCA9IGZhbHNlO1xuICBsZXQgbmV4dFRva2VuOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIHdoaWxlICghZmluaXNoZWQpIHtcbiAgICBuZXh0VG9rZW4gPSBhd2FpdCBjYihuZXh0VG9rZW4pO1xuICAgIGlmIChuZXh0VG9rZW4gPT09IHVuZGVmaW5lZCkge1xuICAgICAgZmluaXNoZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEZldGNoZXMgYWxsIHJlbGV2YW50IHN0YWNrIHRlbXBsYXRlcyBmcm9tIENsb3VkRm9ybWF0aW9uLiBJdCBpZ25vcmVzIHRoZSBmb2xsb3dpbmcgc3RhY2tzOlxuICogLSBzdGFja3MgaW4gREVMRVRFX0NPTVBMRVRFIG9yIERFTEVURV9JTl9QUk9HUkVTUyBzdGFnZVxuICogLSBzdGFja3MgdGhhdCBhcmUgdXNpbmcgYSBkaWZmZXJlbnQgYm9vdHN0cmFwIHF1YWxpZmllclxuICovXG5hc3luYyBmdW5jdGlvbiBmZXRjaEFsbFN0YWNrVGVtcGxhdGVzKGNmbjogSUNsb3VkRm9ybWF0aW9uQ2xpZW50LCBpb0hlbHBlcjogSW9IZWxwZXIsIHF1YWxpZmllcj86IHN0cmluZykge1xuICBjb25zdCBzdGFja05hbWVzOiBzdHJpbmdbXSA9IFtdO1xuICBhd2FpdCBwYWdpbmF0ZVNka0NhbGwoYXN5bmMgKG5leHRUb2tlbikgPT4ge1xuICAgIGNvbnN0IHN0YWNrcyA9IGF3YWl0IGNmbi5saXN0U3RhY2tzKHsgTmV4dFRva2VuOiBuZXh0VG9rZW4gfSk7XG5cbiAgICAvLyBXZSBpZ25vcmUgc3RhY2tzIHdpdGggdGhlc2Ugc3RhdHVzZXMgYmVjYXVzZSB0aGVpciBhc3NldHMgYXJlIG5vIGxvbmdlciBsaXZlXG4gICAgY29uc3QgaWdub3JlZFN0YXR1ZXMgPSBbJ0NSRUFURV9GQUlMRUQnLCAnREVMRVRFX0NPTVBMRVRFJywgJ0RFTEVURV9JTl9QUk9HUkVTUycsICdERUxFVEVfRkFJTEVEJywgJ1JFVklFV19JTl9QUk9HUkVTUyddO1xuICAgIHN0YWNrTmFtZXMucHVzaChcbiAgICAgIC4uLihzdGFja3MuU3RhY2tTdW1tYXJpZXMgPz8gW10pXG4gICAgICAgIC5maWx0ZXIoKHM6IGFueSkgPT4gIWlnbm9yZWRTdGF0dWVzLmluY2x1ZGVzKHMuU3RhY2tTdGF0dXMpKVxuICAgICAgICAubWFwKChzOiBhbnkpID0+IHMuU3RhY2tJZCA/PyBzLlN0YWNrTmFtZSksXG4gICAgKTtcblxuICAgIHJldHVybiBzdGFja3MuTmV4dFRva2VuO1xuICB9KTtcblxuICBhd2FpdCBpb0hlbHBlci5ub3RpZnkoSU8uREVGQVVMVF9UT09MS0lUX0RFQlVHLm1zZyhgUGFyc2luZyB0aHJvdWdoICR7c3RhY2tOYW1lcy5sZW5ndGh9IHN0YWNrc2ApKTtcblxuICBjb25zdCB0ZW1wbGF0ZXM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3Qgc3RhY2sgb2Ygc3RhY2tOYW1lcykge1xuICAgIGxldCBzdW1tYXJ5O1xuICAgIHN1bW1hcnkgPSBhd2FpdCBjZm4uZ2V0VGVtcGxhdGVTdW1tYXJ5KHtcbiAgICAgIFN0YWNrTmFtZTogc3RhY2ssXG4gICAgfSk7XG5cbiAgICBpZiAoYm9vdHN0cmFwRmlsdGVyKHN1bW1hcnkuUGFyYW1ldGVycywgcXVhbGlmaWVyKSkge1xuICAgICAgLy8gVGhpcyBzdGFjayBpcyBkZWZpbml0ZWx5IGJvb3RzdHJhcHBlZCB0byBhIGRpZmZlcmVudCBxdWFsaWZpZXIgc28gd2UgY2FuIHNhZmVseSBpZ25vcmUgaXRcbiAgICAgIGNvbnRpbnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB0ZW1wbGF0ZSA9IGF3YWl0IGNmbi5nZXRUZW1wbGF0ZSh7XG4gICAgICAgIFN0YWNrTmFtZTogc3RhY2ssXG4gICAgICB9KTtcblxuICAgICAgdGVtcGxhdGVzLnB1c2goKHRlbXBsYXRlLlRlbXBsYXRlQm9keSA/PyAnJykgKyBKU09OLnN0cmluZ2lmeShzdW1tYXJ5Py5QYXJhbWV0ZXJzKSk7XG4gICAgfVxuICB9XG5cbiAgYXdhaXQgaW9IZWxwZXIubm90aWZ5KElPLkRFRkFVTFRfVE9PTEtJVF9ERUJVRy5tc2coJ0RvbmUgcGFyc2luZyB0aHJvdWdoIHN0YWNrcycpKTtcblxuICByZXR1cm4gdGVtcGxhdGVzO1xufVxuXG4vKipcbiAqIEZpbHRlciBvdXQgc3RhY2tzIHRoYXQgd2UgS05PVyBhcmUgdXNpbmcgYSBkaWZmZXJlbnQgYm9vdHN0cmFwIHF1YWxpZmllclxuICogVGhpcyBpcyBtb3N0bHkgbmVjZXNzYXJ5IGZvciB0aGUgaW50ZWdyYXRpb24gdGVzdHMgdGhhdCBjYW4gcnVuIHRoZSBzYW1lIGFwcCAod2l0aCB0aGUgc2FtZSBhc3NldHMpXG4gKiB1bmRlciBkaWZmZXJlbnQgcXVhbGlmaWVycy5cbiAqIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2UgYSBzdGFjayB1bmRlciBhIGRpZmZlcmVudCBib290c3RyYXAgY291bGQgY29pbmNpZGVudGFsbHkgcmVmZXJlbmNlIHRoZSBzYW1lIGhhc2hcbiAqIGFuZCBjYXVzZSBhIGZhbHNlIG5lZ2F0aXZlIChjYXVzZSBhbiBhc3NldCB0byBiZSBwcmVzZXJ2ZWQgd2hlbiBpdHMgaXNvbGF0ZWQpXG4gKiBUaGlzIGlzIGludGVudGlvbmFsbHkgZG9uZSBpbiBhIHdheSB3aGVyZSB3ZSBPTkxZIGZpbHRlciBvdXQgc3RhY2tzIHRoYXQgYXJlIG1lYW50IGZvciBhIGRpZmZlcmVudCBxdWFsaWZpZXJcbiAqIGJlY2F1c2Ugd2UgYXJlIG9rYXkgd2l0aCBmYWxzZSBwb3NpdGl2ZXMuXG4gKi9cbmZ1bmN0aW9uIGJvb3RzdHJhcEZpbHRlcihwYXJhbWV0ZXJzPzogUGFyYW1ldGVyRGVjbGFyYXRpb25bXSwgcXVhbGlmaWVyPzogc3RyaW5nKSB7XG4gIGNvbnN0IGJvb3RzdHJhcFZlcnNpb24gPSBwYXJhbWV0ZXJzPy5maW5kKChwKSA9PiBwLlBhcmFtZXRlcktleSA9PT0gJ0Jvb3RzdHJhcFZlcnNpb24nKTtcbiAgY29uc3Qgc3BsaXRCb290c3RyYXBWZXJzaW9uID0gYm9vdHN0cmFwVmVyc2lvbj8uRGVmYXVsdFZhbHVlPy5zcGxpdCgnLycpO1xuICAvLyBXZSBmaW5kIHRoZSBxdWFsaWZpZXIgaW4gYSBzcGVjaWZpYyBwYXJ0IG9mIHRoZSBib290c3RyYXAgdmVyc2lvbiBwYXJhbWV0ZXJcbiAgcmV0dXJuIChxdWFsaWZpZXIgJiZcbiAgICAgICAgICBzcGxpdEJvb3RzdHJhcFZlcnNpb24gJiZcbiAgICAgICAgICBzcGxpdEJvb3RzdHJhcFZlcnNpb24ubGVuZ3RoID09IDQgJiZcbiAgICAgICAgICBzcGxpdEJvb3RzdHJhcFZlcnNpb25bMl0gIT0gcXVhbGlmaWVyKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlZnJlc2hTdGFja3MoY2ZuOiBJQ2xvdWRGb3JtYXRpb25DbGllbnQsIGlvSGVscGVyOiBJb0hlbHBlciwgYWN0aXZlQXNzZXRzOiBBY3RpdmVBc3NldENhY2hlLCBxdWFsaWZpZXI/OiBzdHJpbmcpIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzdGFja3MgPSBhd2FpdCBmZXRjaEFsbFN0YWNrVGVtcGxhdGVzKGNmbiwgaW9IZWxwZXIsIHF1YWxpZmllcik7XG4gICAgZm9yIChjb25zdCBzdGFjayBvZiBzdGFja3MpIHtcbiAgICAgIGFjdGl2ZUFzc2V0cy5yZW1lbWJlclN0YWNrKHN0YWNrKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHRocm93IG5ldyBUb29sa2l0RXJyb3IoYEVycm9yIHJlZnJlc2hpbmcgc3RhY2tzOiAke2Vycn1gKTtcbiAgfVxufVxuXG4vKipcbiAqIEJhY2tncm91bmQgU3RhY2sgUmVmcmVzaCBwcm9wZXJ0aWVzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFja2dyb3VuZFN0YWNrUmVmcmVzaFByb3BzIHtcbiAgLyoqXG4gICAqIFRoZSBDRk4gU0RLIGhhbmRsZXJcbiAgICovXG4gIHJlYWRvbmx5IGNmbjogSUNsb3VkRm9ybWF0aW9uQ2xpZW50O1xuXG4gIC8qKlxuICAgKiBVc2VkIHRvIHNlbmQgbWVzc2FnZXMuXG4gICAqL1xuICByZWFkb25seSBpb0hlbHBlcjogSW9IZWxwZXI7XG5cbiAgLyoqXG4gICAqIEFjdGl2ZSBBc3NldCBzdG9yYWdlXG4gICAqL1xuICByZWFkb25seSBhY3RpdmVBc3NldHM6IEFjdGl2ZUFzc2V0Q2FjaGU7XG5cbiAgLyoqXG4gICAqIFN0YWNrIGJvb3RzdHJhcCBxdWFsaWZpZXJcbiAgICovXG4gIHJlYWRvbmx5IHF1YWxpZmllcj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBDbGFzcyB0aGF0IGNvbnRyb2xzIHNjaGVkdWxpbmcgb2YgdGhlIGJhY2tncm91bmQgc3RhY2sgcmVmcmVzaFxuICovXG5leHBvcnQgY2xhc3MgQmFja2dyb3VuZFN0YWNrUmVmcmVzaCB7XG4gIHByaXZhdGUgdGltZW91dD86IE5vZGVKUy5UaW1lb3V0O1xuICBwcml2YXRlIGxhc3RSZWZyZXNoVGltZTogbnVtYmVyO1xuICBwcml2YXRlIHF1ZXVlZFByb21pc2VzOiBBcnJheTwodmFsdWU6IHVua25vd24pID0+IHZvaWQ+ID0gW107XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBwcm9wczogQmFja2dyb3VuZFN0YWNrUmVmcmVzaFByb3BzKSB7XG4gICAgdGhpcy5sYXN0UmVmcmVzaFRpbWUgPSBEYXRlLm5vdygpO1xuICB9XG5cbiAgcHVibGljIHN0YXJ0KCkge1xuICAgIC8vIFNpbmNlIHN0YXJ0IGlzIGdvaW5nIHRvIGJlIGNhbGxlZCByaWdodCBhZnRlciB0aGUgZmlyc3QgaW52b2NhdGlvbiBvZiByZWZyZXNoU3RhY2tzLFxuICAgIC8vIGxldHMgd2FpdCBzb21lIHRpbWUgYmVmb3JlIGJlZ2lubmluZyB0aGUgYmFja2dyb3VuZCByZWZyZXNoLlxuICAgIHRoaXMudGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gdGhpcy5yZWZyZXNoKCksIDMwMF8wMDApOyAvLyA1IG1pbnV0ZXNcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVmcmVzaCgpIHtcbiAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuXG4gICAgYXdhaXQgcmVmcmVzaFN0YWNrcyh0aGlzLnByb3BzLmNmbiwgdGhpcy5wcm9wcy5pb0hlbHBlciwgdGhpcy5wcm9wcy5hY3RpdmVBc3NldHMsIHRoaXMucHJvcHMucXVhbGlmaWVyKTtcbiAgICB0aGlzLmp1c3RSZWZyZXNoZWRTdGFja3MoKTtcblxuICAgIC8vIElmIHRoZSBsYXN0IGludm9jYXRpb24gb2YgcmVmcmVzaFN0YWNrcyB0YWtlcyA8NSBtaW51dGVzLCB0aGUgbmV4dCBpbnZvY2F0aW9uIHN0YXJ0cyA1IG1pbnV0ZXMgYWZ0ZXIgdGhlIGxhc3Qgb25lIHN0YXJ0ZWQuXG4gICAgLy8gSWYgdGhlIGxhc3QgaW52b2NhdGlvbiBvZiByZWZyZXNoU3RhY2tzIHRha2VzID41IG1pbnV0ZXMsIHRoZSBuZXh0IGludm9jYXRpb24gc3RhcnRzIGltbWVkaWF0ZWx5LlxuICAgIHRoaXMudGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gdGhpcy5yZWZyZXNoKCksIE1hdGgubWF4KHN0YXJ0VGltZSArIDMwMF8wMDAgLSBEYXRlLm5vdygpLCAwKSk7XG4gIH1cblxuICBwcml2YXRlIGp1c3RSZWZyZXNoZWRTdGFja3MoKSB7XG4gICAgdGhpcy5sYXN0UmVmcmVzaFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIGZvciAoY29uc3QgcCBvZiB0aGlzLnF1ZXVlZFByb21pc2VzLnNwbGljZSgwLCB0aGlzLnF1ZXVlZFByb21pc2VzLmxlbmd0aCkpIHtcbiAgICAgIHAodW5kZWZpbmVkKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIHRoZSBsYXN0IHN1Y2Nlc3NmdWwgYmFja2dyb3VuZCByZWZyZXNoIGhhcHBlbmVkIHdpdGhpbiB0aGUgc3BlY2lmaWVkIHRpbWUgZnJhbWUuXG4gICAqIElmIHRoZSBsYXN0IHJlZnJlc2ggaXMgb2xkZXIgdGhhbiB0aGUgc3BlY2lmaWVkIHRpbWUgZnJhbWUsIGl0IHJldHVybnMgYSBQcm9taXNlIHRoYXQgcmVzb2x2ZXNcbiAgICogd2hlbiB0aGUgbmV4dCBiYWNrZ3JvdW5kIHJlZnJlc2ggY29tcGxldGVzIG9yIHJlamVjdHMgaWYgdGhlIHJlZnJlc2ggdGFrZXMgdG9vIGxvbmcuXG4gICAqL1xuICBwdWJsaWMgbm9PbGRlclRoYW4obXM6IG51bWJlcikge1xuICAgIGNvbnN0IGhvcml6b24gPSBEYXRlLm5vdygpIC0gbXM7XG5cbiAgICAvLyBUaGUgbGFzdCByZWZyZXNoIGhhcHBlbmVkIHdpdGhpbiB0aGUgdGltZSBmcmFtZVxuICAgIGlmICh0aGlzLmxhc3RSZWZyZXNoVGltZSA+PSBob3Jpem9uKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgfVxuXG4gICAgLy8gVGhlIGxhc3QgcmVmcmVzaCBoYXBwZW5lZCBlYXJsaWVyIHRoYW4gdGhlIHRpbWUgZnJhbWVcbiAgICAvLyBXZSB3aWxsIHdhaXQgZm9yIHRoZSBsYXRlc3QgcmVmcmVzaCB0byBsYW5kIG9yIHJlamVjdCBpZiBpdCB0YWtlcyB0b28gbG9uZ1xuICAgIHJldHVybiBQcm9taXNlLnJhY2UoW1xuICAgICAgbmV3IFByb21pc2UocmVzb2x2ZSA9PiB0aGlzLnF1ZXVlZFByb21pc2VzLnB1c2gocmVzb2x2ZSkpLFxuICAgICAgbmV3IFByb21pc2UoKF8sIHJlamVjdCkgPT4gc2V0VGltZW91dCgoKSA9PiByZWplY3QobmV3IFRvb2xraXRFcnJvcigncmVmcmVzaFN0YWNrcyB0b29rIHRvbyBsb25nOyB0aGUgYmFja2dyb3VuZCB0aHJlYWQgbGlrZWx5IHRocmV3IGFuIGVycm9yJykpLCBtcykpLFxuICAgIF0pO1xuICB9XG5cbiAgcHVibGljIHN0b3AoKSB7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZW91dCk7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,4 @@
1
+ import { type HotswapChange } from './common';
2
+ import type { ResourceChange } from '../../payloads/hotswap';
3
+ import type { EvaluateCloudFormationTemplate } from '../cloudformation';
4
+ export declare function isHotswappableAppSyncChange(logicalId: string, change: ResourceChange, evaluateCfnTemplate: EvaluateCloudFormationTemplate): Promise<HotswapChange[]>;
@@ -0,0 +1,162 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isHotswappableAppSyncChange = isHotswappableAppSyncChange;
4
+ const common_1 = require("./common");
5
+ const toolkit_error_1 = require("../../toolkit/toolkit-error");
6
+ const util_1 = require("../../util");
7
+ async function isHotswappableAppSyncChange(logicalId, change, evaluateCfnTemplate) {
8
+ const isResolver = change.newValue.Type === 'AWS::AppSync::Resolver';
9
+ const isFunction = change.newValue.Type === 'AWS::AppSync::FunctionConfiguration';
10
+ const isGraphQLSchema = change.newValue.Type === 'AWS::AppSync::GraphQLSchema';
11
+ const isAPIKey = change.newValue.Type === 'AWS::AppSync::ApiKey';
12
+ if (!isResolver && !isFunction && !isGraphQLSchema && !isAPIKey) {
13
+ return [];
14
+ }
15
+ const ret = [];
16
+ const classifiedChanges = (0, common_1.classifyChanges)(change, [
17
+ 'RequestMappingTemplate',
18
+ 'RequestMappingTemplateS3Location',
19
+ 'ResponseMappingTemplate',
20
+ 'ResponseMappingTemplateS3Location',
21
+ 'Code',
22
+ 'CodeS3Location',
23
+ 'Definition',
24
+ 'DefinitionS3Location',
25
+ 'Expires',
26
+ ]);
27
+ classifiedChanges.reportNonHotswappablePropertyChanges(ret);
28
+ const namesOfHotswappableChanges = Object.keys(classifiedChanges.hotswappableProps);
29
+ if (namesOfHotswappableChanges.length > 0) {
30
+ let physicalName = undefined;
31
+ const arn = await evaluateCfnTemplate.establishResourcePhysicalName(logicalId, isFunction ? change.newValue.Properties?.Name : undefined);
32
+ if (isResolver) {
33
+ const arnParts = arn?.split('/');
34
+ physicalName = arnParts ? `${arnParts[3]}.${arnParts[5]}` : undefined;
35
+ }
36
+ else {
37
+ physicalName = arn;
38
+ }
39
+ // nothing do here
40
+ if (!physicalName) {
41
+ return ret;
42
+ }
43
+ ret.push({
44
+ change: {
45
+ cause: change,
46
+ resources: [{
47
+ logicalId,
48
+ resourceType: change.newValue.Type,
49
+ physicalName,
50
+ metadata: evaluateCfnTemplate.metadataFor(logicalId),
51
+ }],
52
+ },
53
+ hotswappable: true,
54
+ service: 'appsync',
55
+ apply: async (sdk) => {
56
+ const sdkProperties = {
57
+ ...change.oldValue.Properties,
58
+ Definition: change.newValue.Properties?.Definition,
59
+ DefinitionS3Location: change.newValue.Properties?.DefinitionS3Location,
60
+ requestMappingTemplate: change.newValue.Properties?.RequestMappingTemplate,
61
+ requestMappingTemplateS3Location: change.newValue.Properties?.RequestMappingTemplateS3Location,
62
+ responseMappingTemplate: change.newValue.Properties?.ResponseMappingTemplate,
63
+ responseMappingTemplateS3Location: change.newValue.Properties?.ResponseMappingTemplateS3Location,
64
+ code: change.newValue.Properties?.Code,
65
+ codeS3Location: change.newValue.Properties?.CodeS3Location,
66
+ expires: change.newValue.Properties?.Expires,
67
+ };
68
+ const evaluatedResourceProperties = await evaluateCfnTemplate.evaluateCfnExpression(sdkProperties);
69
+ const sdkRequestObject = (0, util_1.transformObjectKeys)(evaluatedResourceProperties, util_1.lowerCaseFirstCharacter);
70
+ // resolve s3 location files as SDK doesn't take in s3 location but inline code
71
+ if (sdkRequestObject.requestMappingTemplateS3Location) {
72
+ sdkRequestObject.requestMappingTemplate = await fetchFileFromS3(sdkRequestObject.requestMappingTemplateS3Location, sdk);
73
+ delete sdkRequestObject.requestMappingTemplateS3Location;
74
+ }
75
+ if (sdkRequestObject.responseMappingTemplateS3Location) {
76
+ sdkRequestObject.responseMappingTemplate = await fetchFileFromS3(sdkRequestObject.responseMappingTemplateS3Location, sdk);
77
+ delete sdkRequestObject.responseMappingTemplateS3Location;
78
+ }
79
+ if (sdkRequestObject.definitionS3Location) {
80
+ sdkRequestObject.definition = await fetchFileFromS3(sdkRequestObject.definitionS3Location, sdk);
81
+ delete sdkRequestObject.definitionS3Location;
82
+ }
83
+ if (sdkRequestObject.codeS3Location) {
84
+ sdkRequestObject.code = await fetchFileFromS3(sdkRequestObject.codeS3Location, sdk);
85
+ delete sdkRequestObject.codeS3Location;
86
+ }
87
+ if (isResolver) {
88
+ await sdk.appsync().updateResolver(sdkRequestObject);
89
+ }
90
+ else if (isFunction) {
91
+ // Function version is only applicable when using VTL and mapping templates
92
+ // Runtime only applicable when using code (JS mapping templates)
93
+ if (sdkRequestObject.code) {
94
+ delete sdkRequestObject.functionVersion;
95
+ }
96
+ else {
97
+ delete sdkRequestObject.runtime;
98
+ }
99
+ const functions = await sdk.appsync().listFunctions({ apiId: sdkRequestObject.apiId });
100
+ const { functionId } = functions.find((fn) => fn.name === physicalName) ?? {};
101
+ // Updating multiple functions at the same time or along with graphql schema results in `ConcurrentModificationException`
102
+ await exponentialBackOffRetry(() => sdk.appsync().updateFunction({
103
+ ...sdkRequestObject,
104
+ functionId: functionId,
105
+ }), 6, 1000, 'ConcurrentModificationException');
106
+ }
107
+ else if (isGraphQLSchema) {
108
+ let schemaCreationResponse = await sdk
109
+ .appsync()
110
+ .startSchemaCreation(sdkRequestObject);
111
+ while (schemaCreationResponse.status &&
112
+ ['PROCESSING', 'DELETING'].some((status) => status === schemaCreationResponse.status)) {
113
+ await sleep(1000); // poll every second
114
+ const getSchemaCreationStatusRequest = {
115
+ apiId: sdkRequestObject.apiId,
116
+ };
117
+ schemaCreationResponse = await sdk.appsync().getSchemaCreationStatus(getSchemaCreationStatusRequest);
118
+ }
119
+ if (schemaCreationResponse.status === 'FAILED') {
120
+ throw new toolkit_error_1.ToolkitError(schemaCreationResponse.details ?? 'Schema creation has failed.');
121
+ }
122
+ }
123
+ else {
124
+ // isApiKey
125
+ if (!sdkRequestObject.id) {
126
+ // ApiKeyId is optional in CFN but required in SDK. Grab the KeyId from physicalArn if not available as part of CFN template
127
+ const arnParts = physicalName?.split('/');
128
+ if (arnParts && arnParts.length === 4) {
129
+ sdkRequestObject.id = arnParts[3];
130
+ }
131
+ }
132
+ await sdk.appsync().updateApiKey(sdkRequestObject);
133
+ }
134
+ },
135
+ });
136
+ }
137
+ return ret;
138
+ }
139
+ async function fetchFileFromS3(s3Url, sdk) {
140
+ const s3PathParts = s3Url.split('/');
141
+ const s3Bucket = s3PathParts[2]; // first two are "s3:" and "" due to s3://
142
+ const s3Key = s3PathParts.splice(3).join('/'); // after removing first three we reconstruct the key
143
+ return (await sdk.s3().getObject({ Bucket: s3Bucket, Key: s3Key })).Body?.transformToString();
144
+ }
145
+ async function exponentialBackOffRetry(fn, numOfRetries, backOff, errorCodeToRetry) {
146
+ try {
147
+ await fn();
148
+ }
149
+ catch (error) {
150
+ if (error && error.name === errorCodeToRetry && numOfRetries > 0) {
151
+ await sleep(backOff); // time to wait doubles everytime function fails, starts at 1 second
152
+ await exponentialBackOffRetry(fn, numOfRetries - 1, backOff * 2, errorCodeToRetry);
153
+ }
154
+ else {
155
+ throw error;
156
+ }
157
+ }
158
+ }
159
+ async function sleep(ms) {
160
+ return new Promise((ok) => setTimeout(ok, ms));
161
+ }
162
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwc3luYy1tYXBwaW5nLXRlbXBsYXRlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImFwcHN5bmMtbWFwcGluZy10ZW1wbGF0ZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFlQSxrRUE0SkM7QUF2S0QscUNBR2tCO0FBRWxCLCtEQUEyRDtBQUMzRCxxQ0FBMEU7QUFLbkUsS0FBSyxVQUFVLDJCQUEyQixDQUMvQyxTQUFpQixFQUNqQixNQUFzQixFQUN0QixtQkFBbUQ7SUFFbkQsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEtBQUssd0JBQXdCLENBQUM7SUFDckUsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEtBQUsscUNBQXFDLENBQUM7SUFDbEYsTUFBTSxlQUFlLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEtBQUssNkJBQTZCLENBQUM7SUFDL0UsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEtBQUssc0JBQXNCLENBQUM7SUFDakUsSUFBSSxDQUFDLFVBQVUsSUFBSSxDQUFDLFVBQVUsSUFBSSxDQUFDLGVBQWUsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2hFLE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUVELE1BQU0sR0FBRyxHQUFvQixFQUFFLENBQUM7SUFFaEMsTUFBTSxpQkFBaUIsR0FBRyxJQUFBLHdCQUFlLEVBQUMsTUFBTSxFQUFFO1FBQ2hELHdCQUF3QjtRQUN4QixrQ0FBa0M7UUFDbEMseUJBQXlCO1FBQ3pCLG1DQUFtQztRQUNuQyxNQUFNO1FBQ04sZ0JBQWdCO1FBQ2hCLFlBQVk7UUFDWixzQkFBc0I7UUFDdEIsU0FBUztLQUNWLENBQUMsQ0FBQztJQUNILGlCQUFpQixDQUFDLG9DQUFvQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBRTVELE1BQU0sMEJBQTBCLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxpQkFB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LEVBQUUsQ0FBQztJQUNiLENBQUM7SUFBQyxPQUFPLEtBQVUsRUFBRSxDQUFDO1FBQ3BCLElBQUksS0FBSyxJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssZ0JBQWdCLElBQUksWUFBWSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ2pFLE1BQU0sS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsb0VBQW9FO1lBQzFGLE1BQU0sdUJBQXVCLENBQUMsRUFBRSxFQUFFLFlBQVksR0FBRyxDQUFDLEVBQUUsT0FBTyxHQUFHLENBQUMsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ3JGLENBQUM7YUFBTSxDQUFDO1lBQ04sTUFBTSxLQUFLLENBQUM7UUFDZCxDQUFDO0lBQ0gsQ0FBQztBQUNILENBQUM7QUFFRCxLQUFLLFVBQVUsS0FBSyxDQUFDLEVBQVU7SUFDN0IsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ2pELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7XG4gIEdldFNjaGVtYUNyZWF0aW9uU3RhdHVzQ29tbWFuZE91dHB1dCxcbiAgR2V0U2NoZW1hQ3JlYXRpb25TdGF0dXNDb21tYW5kSW5wdXQsXG59IGZyb20gJ0Bhd3Mtc2RrL2NsaWVudC1hcHBzeW5jJztcbmltcG9ydCB7XG4gIHR5cGUgSG90c3dhcENoYW5nZSxcbiAgY2xhc3NpZnlDaGFuZ2VzLFxufSBmcm9tICcuL2NvbW1vbic7XG5pbXBvcnQgdHlwZSB7IFJlc291cmNlQ2hhbmdlIH0gZnJvbSAnLi4vLi4vcGF5bG9hZHMvaG90c3dhcCc7XG5pbXBvcnQgeyBUb29sa2l0RXJyb3IgfSBmcm9tICcuLi8uLi90b29sa2l0L3Rvb2xraXQtZXJyb3InO1xuaW1wb3J0IHsgbG93ZXJDYXNlRmlyc3RDaGFyYWN0ZXIsIHRyYW5zZm9ybU9iamVjdEtleXMgfSBmcm9tICcuLi8uLi91dGlsJztcbmltcG9ydCB0eXBlIHsgU0RLIH0gZnJvbSAnLi4vYXdzLWF1dGgvcHJpdmF0ZSc7XG5cbmltcG9ydCB0eXBlIHsgRXZhbHVhdGVDbG91ZEZvcm1hdGlvblRlbXBsYXRlIH0gZnJvbSAnLi4vY2xvdWRmb3JtYXRpb24nO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaXNIb3Rzd2FwcGFibGVBcHBTeW5jQ2hhbmdlKFxuICBsb2dpY2FsSWQ6IHN0cmluZyxcbiAgY2hhbmdlOiBSZXNvdXJjZUNoYW5nZSxcbiAgZXZhbHVhdGVDZm5UZW1wbGF0ZTogRXZhbHVhdGVDbG91ZEZvcm1hdGlvblRlbXBsYXRlLFxuKTogUHJvbWlzZTxIb3Rzd2FwQ2hhbmdlW10+IHtcbiAgY29uc3QgaXNSZXNvbHZlciA9IGNoYW5nZS5uZXdWYWx1ZS5UeXBlID09PSAnQVdTOjpBcHBTeW5jOjpSZXNvbHZlcic7XG4gIGNvbnN0IGlzRnVuY3Rpb24gPSBjaGFuZ2UubmV3VmFsdWUuVHlwZSA9PT0gJ0FXUzo6QXBwU3luYzo6RnVuY3Rpb25Db25maWd1cmF0aW9uJztcbiAgY29uc3QgaXNHcmFwaFFMU2NoZW1hID0gY2hhbmdlLm5ld1ZhbHVlLlR5cGUgPT09ICdBV1M6OkFwcFN5bmM6OkdyYXBoUUxTY2hlbWEnO1xuICBjb25zdCBpc0FQSUtleSA9IGNoYW5nZS5uZXdWYWx1ZS5UeXBlID09PSAnQVdTOjpBcHBTeW5jOjpBcGlLZXknO1xuICBpZiAoIWlzUmVzb2x2ZXIgJiYgIWlzRnVuY3Rpb24gJiYgIWlzR3JhcGhRTFNjaGVtYSAmJiAhaXNBUElLZXkpIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBjb25zdCByZXQ6IEhvdHN3YXBDaGFuZ2VbXSA9IFtdO1xuXG4gIGNvbnN0IGNsYXNzaWZpZWRDaGFuZ2VzID0gY2xhc3NpZnlDaGFuZ2VzKGNoYW5nZSwgW1xuICAgICdSZXF1ZXN0TWFwcGluZ1RlbXBsYXRlJyxcbiAgICAnUmVxdWVzdE1hcHBpbmdUZW1wbGF0ZVMzTG9jYXRpb24nLFxuICAgICdSZXNwb25zZU1hcHBpbmdUZW1wbGF0ZScsXG4gICAgJ1Jlc3BvbnNlTWFwcGluZ1RlbXBsYXRlUzNMb2NhdGlvbicsXG4gICAgJ0NvZGUnLFxuICAgICdDb2RlUzNMb2NhdGlvbicsXG4gICAgJ0RlZmluaXRpb24nLFxuICAgICdEZWZpbml0aW9uUzNMb2NhdGlvbicsXG4gICAgJ0V4cGlyZXMnLFxuICBdKTtcbiAgY2xhc3NpZmllZENoYW5nZXMucmVwb3J0Tm9uSG90c3dhcHBhYmxlUHJvcGVydHlDaGFuZ2VzKHJldCk7XG5cbiAgY29uc3QgbmFtZXNPZkhvdHN3YXBwYWJsZUNoYW5nZXMgPSBPYmplY3Qua2V5cyhjbGFzc2lmaWVkQ2hhbmdlcy5ob3Rzd2FwcGFibGVQcm9wcyk7XG4gIGlmIChuYW1lc09mSG90c3dhcHBhYmxlQ2hhbmdlcy5sZW5ndGggPiAwKSB7XG4gICAgbGV0IHBoeXNpY2FsTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgIGNvbnN0IGFybiA9IGF3YWl0IGV2YWx1YXRlQ2ZuVGVtcGxhdGUuZXN0YWJsaXNoUmVzb3VyY2VQaHlzaWNhbE5hbWUoXG4gICAgICBsb2dpY2FsSWQsXG4gICAgICBpc0Z1bmN0aW9uID8gY2hhbmdlLm5ld1ZhbHVlLlByb3BlcnRpZXM/Lk5hbWUgOiB1bmRlZmluZWQsXG4gICAgKTtcbiAgICBpZiAoaXNSZXNvbHZlcikge1xuICAgICAgY29uc3QgYXJuUGFydHMgPSBhcm4/LnNwbGl0KCcvJyk7XG4gICAgICBwaHlzaWNhbE5hbWUgPSBhcm5QYXJ0cyA/IGAke2FyblBhcnRzWzNdfS4ke2FyblBhcnRzWzVdfWAgOiB1bmRlZmluZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBoeXNpY2FsTmFtZSA9IGFybjtcbiAgICB9XG5cbiAgICAvLyBub3RoaW5nIGRvIGhlcmVcbiAgICBpZiAoIXBoeXNpY2FsTmFtZSkge1xuICAgICAgcmV0dXJuIHJldDtcbiAgICB9XG5cbiAgICByZXQucHVzaCh7XG4gICAgICBjaGFuZ2U6IHtcbiAgICAgICAgY2F1c2U6IGNoYW5nZSxcbiAgICAgICAgcmVzb3VyY2VzOiBbe1xuICAgICAgICAgIGxvZ2ljYWxJZCxcbiAgICAgICAgICByZXNvdXJjZVR5cGU6IGNoYW5nZS5uZXdWYWx1ZS5UeXBlLFxuICAgICAgICAgIHBoeXNpY2FsTmFtZSxcbiAgICAgICAgICBtZXRhZGF0YTogZXZhbHVhdGVDZm5UZW1wbGF0ZS5tZXRhZGF0YUZvcihsb2dpY2FsSWQpLFxuICAgICAgICB9XSxcbiAgICAgIH0sXG4gICAgICBob3Rzd2FwcGFibGU6IHRydWUsXG4gICAgICBzZXJ2aWNlOiAnYXBwc3luYycsXG4gICAgICBhcHBseTogYXN5bmMgKHNkazogU0RLKSA9PiB7XG4gICAgICAgIGNvbnN0IHNka1Byb3BlcnRpZXM6IHsgW25hbWU6IHN0cmluZ106IGFueSB9ID0ge1xuICAgICAgICAgIC4uLmNoYW5nZS5vbGRWYWx1ZS5Qcm9wZXJ0aWVzLFxuICAgICAgICAgIERlZmluaXRpb246IGNoYW5nZS5uZXdWYWx1ZS5Qcm9wZXJ0aWVzPy5EZWZpbml0aW9uLFxuICAgICAgICAgIERlZmluaXRpb25TM0xvY2F0aW9uOiBjaGFuZ2UubmV3VmFsdWUuUHJvcGVydGllcz8uRGVmaW5pdGlvblMzTG9jYXRpb24sXG4gICAgICAgICAgcmVxdWVzdE1hcHBpbmdUZW1wbGF0ZTogY2hhbmdlLm5ld1ZhbHVlLlByb3BlcnRpZXM/LlJlcXVlc3RNYXBwaW5nVGVtcGxhdGUsXG4gICAgICAgICAgcmVxdWVzdE1hcHBpbmdUZW1wbGF0ZVMzTG9jYXRpb246IGNoYW5nZS5uZXdWYWx1ZS5Qcm9wZXJ0aWVzPy5SZXF1ZXN0TWFwcGluZ1RlbXBsYXRlUzNMb2NhdGlvbixcbiAgICAgICAgICByZXNwb25zZU1hcHBpbmdUZW1wbGF0ZTogY2hhbmdlLm5ld1ZhbHVlLlByb3BlcnRpZXM/LlJlc3BvbnNlTWFwcGluZ1RlbXBsYXRlLFxuICAgICAgICAgIHJlc3BvbnNlTWFwcGluZ1RlbXBsYXRlUzNMb2NhdGlvbjogY2hhbmdlLm5ld1ZhbHVlLlByb3BlcnRpZXM/LlJlc3BvbnNlTWFwcGluZ1RlbXBsYXRlUzNMb2NhdGlvbixcbiAgICAgICAgICBjb2RlOiBjaGFuZ2UubmV3VmFsdWUuUHJvcGVydGllcz8uQ29kZSxcbiAgICAgICAgICBjb2RlUzNMb2NhdGlvbjogY2hhbmdlLm5ld1ZhbHVlLlByb3BlcnRpZXM/LkNvZGVTM0xvY2F0aW9uLFxuICAgICAgICAgIGV4cGlyZXM6IGNoYW5nZS5uZXdWYWx1ZS5Qcm9wZXJ0aWVzPy5FeHBpcmVzLFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBldmFsdWF0ZWRSZXNvdXJjZVByb3BlcnRpZXMgPSBhd2FpdCBldmFsdWF0ZUNmblRlbXBsYXRlLmV2YWx1YXRlQ2ZuRXhwcmVzc2lvbihzZGtQcm9wZXJ0aWVzKTtcbiAgICAgICAgY29uc3Qgc2RrUmVxdWVzdE9iamVjdCA9IHRyYW5zZm9ybU9iamVjdEtleXMoZXZhbHVhdGVkUmVzb3VyY2VQcm9wZXJ0aWVzLCBsb3dlckNhc2VGaXJzdENoYXJhY3Rlcik7XG5cbiAgICAgICAgLy8gcmVzb2x2ZSBzMyBsb2NhdGlvbiBmaWxlcyBhcyBTREsgZG9lc24ndCB0YWtlIGluIHMzIGxvY2F0aW9uIGJ1dCBpbmxpbmUgY29kZVxuICAgICAgICBpZiAoc2RrUmVxdWVzdE9iamVjdC5yZXF1ZXN0TWFwcGluZ1RlbXBsYXRlUzNMb2NhdGlvbikge1xuICAgICAgICAgIHNka1JlcXVlc3RPYmplY3QucmVxdWVzdE1hcHBpbmdUZW1wbGF0ZSA9IGF3YWl0IGZldGNoRmlsZUZyb21TMyhcbiAgICAgICAgICAgIHNka1JlcXVlc3RPYmplY3QucmVxdWVzdE1hcHBpbmdUZW1wbGF0ZVMzTG9jYXRpb24sXG4gICAgICAgICAgICBzZGssXG4gICAgICAgICAgKTtcbiAgICAgICAgICBkZWxldGUgc2RrUmVxdWVzdE9iamVjdC5yZXF1ZXN0TWFwcGluZ1RlbXBsYXRlUzNMb2NhdGlvbjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2RrUmVxdWVzdE9iamVjdC5yZXNwb25zZU1hcHBpbmdUZW1wbGF0ZVMzTG9jYXRpb24pIHtcbiAgICAgICAgICBzZGtSZXF1ZXN0T2JqZWN0LnJlc3BvbnNlTWFwcGluZ1RlbXBsYXRlID0gYXdhaXQgZmV0Y2hGaWxlRnJvbVMzKFxuICAgICAgICAgICAgc2RrUmVxdWVzdE9iamVjdC5yZXNwb25zZU1hcHBpbmdUZW1wbGF0ZVMzTG9jYXRpb24sXG4gICAgICAgICAgICBzZGssXG4gICAgICAgICAgKTtcbiAgICAgICAgICBkZWxldGUgc2RrUmVxdWVzdE9iamVjdC5yZXNwb25zZU1hcHBpbmdUZW1wbGF0ZVMzTG9jYXRpb247XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNka1JlcXVlc3RPYmplY3QuZGVmaW5pdGlvblMzTG9jYXRpb24pIHtcbiAgICAgICAgICBzZGtSZXF1ZXN0T2JqZWN0LmRlZmluaXRpb24gPSBhd2FpdCBmZXRjaEZpbGVGcm9tUzMoc2RrUmVxdWVzdE9iamVjdC5kZWZpbml0aW9uUzNMb2NhdGlvbiwgc2RrKTtcbiAgICAgICAgICBkZWxldGUgc2RrUmVxdWVzdE9iamVjdC5kZWZpbml0aW9uUzNMb2NhdGlvbjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2RrUmVxdWVzdE9iamVjdC5jb2RlUzNMb2NhdGlvbikge1xuICAgICAgICAgIHNka1JlcXVlc3RPYmplY3QuY29kZSA9IGF3YWl0IGZldGNoRmlsZUZyb21TMyhzZGtSZXF1ZXN0T2JqZWN0LmNvZGVTM0xvY2F0aW9uLCBzZGspO1xuICAgICAgICAgIGRlbGV0ZSBzZGtSZXF1ZXN0T2JqZWN0LmNvZGVTM0xvY2F0aW9uO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzUmVzb2x2ZXIpIHtcbiAgICAgICAgICBhd2FpdCBzZGsuYXBwc3luYygpLnVwZGF0ZVJlc29sdmVyKHNka1JlcXVlc3RPYmplY3QpO1xuICAgICAgICB9IGVsc2UgaWYgKGlzRnVuY3Rpb24pIHtcbiAgICAgICAgICAvLyBGdW5jdGlvbiB2ZXJzaW9uIGlzIG9ubHkgYXBwbGljYWJsZSB3aGVuIHVzaW5nIFZUTCBhbmQgbWFwcGluZyB0ZW1wbGF0ZXNcbiAgICAgICAgICAvLyBSdW50aW1lIG9ubHkgYXBwbGljYWJsZSB3aGVuIHVzaW5nIGNvZGUgKEpTIG1hcHBpbmcgdGVtcGxhdGVzKVxuICAgICAgICAgIGlmIChzZGtSZXF1ZXN0T2JqZWN0LmNvZGUpIHtcbiAgICAgICAgICAgIGRlbGV0ZSBzZGtSZXF1ZXN0T2JqZWN0LmZ1bmN0aW9uVmVyc2lvbjtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZGVsZXRlIHNka1JlcXVlc3RPYmplY3QucnVudGltZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBmdW5jdGlvbnMgPSBhd2FpdCBzZGsuYXBwc3luYygpLmxpc3RGdW5jdGlvbnMoeyBhcGlJZDogc2RrUmVxdWVzdE9iamVjdC5hcGlJZCB9KTtcbiAgICAgICAgICBjb25zdCB7IGZ1bmN0aW9uSWQgfSA9IGZ1bmN0aW9ucy5maW5kKChmbikgPT4gZm4ubmFtZSA9PT0gcGh5c2ljYWxOYW1lKSA/PyB7fTtcbiAgICAgICAgICAvLyBVcGRhdGluZyBtdWx0aXBsZSBmdW5jdGlvbnMgYXQgdGhlIHNhbWUgdGltZSBvciBhbG9uZyB3aXRoIGdyYXBocWwgc2NoZW1hIHJlc3VsdHMgaW4gYENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb25gXG4gICAgICAgICAgYXdhaXQgZXhwb25lbnRpYWxCYWNrT2ZmUmV0cnkoXG4gICAgICAgICAgICAoKSA9PlxuICAgICAgICAgICAgICBzZGsuYXBwc3luYygpLnVwZGF0ZUZ1bmN0aW9uKHtcbiAgICAgICAgICAgICAgICAuLi5zZGtSZXF1ZXN0T2JqZWN0LFxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uSWQ6IGZ1bmN0aW9uSWQsXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgNixcbiAgICAgICAgICAgIDEwMDAsXG4gICAgICAgICAgICAnQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbicsXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIGlmIChpc0dyYXBoUUxTY2hlbWEpIHtcbiAgICAgICAgICBsZXQgc2NoZW1hQ3JlYXRpb25SZXNwb25zZTogR2V0U2NoZW1hQ3JlYXRpb25TdGF0dXNDb21tYW5kT3V0cHV0ID0gYXdhaXQgc2RrXG4gICAgICAgICAgICAuYXBwc3luYygpXG4gICAgICAgICAgICAuc3RhcnRTY2hlbWFDcmVhdGlvbihzZGtSZXF1ZXN0T2JqZWN0KTtcbiAgICAgICAgICB3aGlsZSAoXG4gICAgICAgICAgICBzY2hlbWFDcmVhdGlvblJlc3BvbnNlLnN0YXR1cyAmJlxuICAgICAgICAgICAgWydQUk9DRVNTSU5HJywgJ0RFTEVUSU5HJ10uc29tZSgoc3RhdHVzKSA9PiBzdGF0dXMgPT09IHNjaGVtYUNyZWF0aW9uUmVzcG9uc2Uuc3RhdHVzKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgYXdhaXQgc2xlZXAoMTAwMCk7IC8vIHBvbGwgZXZlcnkgc2Vjb25kXG4gICAgICAgICAgICBjb25zdCBnZXRTY2hlbWFDcmVhdGlvblN0YXR1c1JlcXVlc3Q6IEdldFNjaGVtYUNyZWF0aW9uU3RhdHVzQ29tbWFuZElucHV0ID0ge1xuICAgICAgICAgICAgICBhcGlJZDogc2RrUmVxdWVzdE9iamVjdC5hcGlJZCxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBzY2hlbWFDcmVhdGlvblJlc3BvbnNlID0gYXdhaXQgc2RrLmFwcHN5bmMoKS5nZXRTY2hlbWFDcmVhdGlvblN0YXR1cyhnZXRTY2hlbWFDcmVhdGlvblN0YXR1c1JlcXVlc3QpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoc2NoZW1hQ3JlYXRpb25SZXNwb25zZS5zdGF0dXMgPT09ICdGQUlMRUQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVG9vbGtpdEVycm9yKHNjaGVtYUNyZWF0aW9uUmVzcG9uc2UuZGV0YWlscyA/PyAnU2NoZW1hIGNyZWF0aW9uIGhhcyBmYWlsZWQuJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIGlzQXBpS2V5XG4gICAgICAgICAgaWYgKCFzZGtSZXF1ZXN0T2JqZWN0LmlkKSB7XG4gICAgICAgICAgICAvLyBBcGlLZXlJZCBpcyBvcHRpb25hbCBpbiBDRk4gYnV0IHJlcXVpcmVkIGluIFNESy4gR3JhYiB0aGUgS2V5SWQgZnJvbSBwaHlzaWNhbEFybiBpZiBub3QgYXZhaWxhYmxlIGFzIHBhcnQgb2YgQ0ZOIHRlbXBsYXRlXG4gICAgICAgICAgICBjb25zdCBhcm5QYXJ0cyA9IHBoeXNpY2FsTmFtZT8uc3BsaXQoJy8nKTtcbiAgICAgICAgICAgIGlmIChhcm5QYXJ0cyAmJiBhcm5QYXJ0cy5sZW5ndGggPT09IDQpIHtcbiAgICAgICAgICAgICAgc2RrUmVxdWVzdE9iamVjdC5pZCA9IGFyblBhcnRzWzNdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBhd2FpdCBzZGsuYXBwc3luYygpLnVwZGF0ZUFwaUtleShzZGtSZXF1ZXN0T2JqZWN0KTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiByZXQ7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZldGNoRmlsZUZyb21TMyhzM1VybDogc3RyaW5nLCBzZGs6IFNESykge1xuICBjb25zdCBzM1BhdGhQYXJ0cyA9IHMzVXJsLnNwbGl0KCcvJyk7XG4gIGNvbnN0IHMzQnVja2V0ID0gczNQYXRoUGFydHNbMl07IC8vIGZpcnN0IHR3byBhcmUgXCJzMzpcIiBhbmQgXCJcIiBkdWUgdG8gczM6Ly9cbiAgY29uc3QgczNLZXkgPSBzM1BhdGhQYXJ0cy5zcGxpY2UoMykuam9pbignLycpOyAvLyBhZnRlciByZW1vdmluZyBmaXJzdCB0aHJlZSB3ZSByZWNvbnN0cnVjdCB0aGUga2V5XG4gIHJldHVybiAoYXdhaXQgc2RrLnMzKCkuZ2V0T2JqZWN0KHsgQnVja2V0OiBzM0J1Y2tldCwgS2V5OiBzM0tleSB9KSkuQm9keT8udHJhbnNmb3JtVG9TdHJpbmcoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZXhwb25lbnRpYWxCYWNrT2ZmUmV0cnkoZm46ICgpID0+IFByb21pc2U8YW55PiwgbnVtT2ZSZXRyaWVzOiBudW1iZXIsIGJhY2tPZmY6IG51bWJlciwgZXJyb3JDb2RlVG9SZXRyeTogc3RyaW5nKSB7XG4gIHRyeSB7XG4gICAgYXdhaXQgZm4oKTtcbiAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgIGlmIChlcnJvciAmJiBlcnJvci5uYW1lID09PSBlcnJvckNvZGVUb1JldHJ5ICYmIG51bU9mUmV0cmllcyA+IDApIHtcbiAgICAgIGF3YWl0IHNsZWVwKGJhY2tPZmYpOyAvLyB0aW1lIHRvIHdhaXQgZG91YmxlcyBldmVyeXRpbWUgZnVuY3Rpb24gZmFpbHMsIHN0YXJ0cyBhdCAxIHNlY29uZFxuICAgICAgYXdhaXQgZXhwb25lbnRpYWxCYWNrT2ZmUmV0cnkoZm4sIG51bU9mUmV0cmllcyAtIDEsIGJhY2tPZmYgKiAyLCBlcnJvckNvZGVUb1JldHJ5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNsZWVwKG1zOiBudW1iZXIpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChvaykgPT4gc2V0VGltZW91dChvaywgbXMpKTtcbn1cbiJdfQ==
@@ -0,0 +1,4 @@
1
+ import { type HotswapChange } from './common';
2
+ import type { ResourceChange } from '../../payloads/hotswap';
3
+ import type { EvaluateCloudFormationTemplate } from '../cloudformation';
4
+ export declare function isHotswappableCodeBuildProjectChange(logicalId: string, change: ResourceChange, evaluateCfnTemplate: EvaluateCloudFormationTemplate): Promise<HotswapChange[]>;