@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,4 @@
1
+ export * from './stack-activity-monitor';
2
+ export * from './stack-event-poller';
3
+ export * from './stack-status';
4
+ export { StackProgressMonitor } from './stack-progress-monitor';
@@ -0,0 +1,23 @@
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
+ exports.StackProgressMonitor = void 0;
18
+ __exportStar(require("./stack-activity-monitor"), exports);
19
+ __exportStar(require("./stack-event-poller"), exports);
20
+ __exportStar(require("./stack-status"), exports);
21
+ var stack_progress_monitor_1 = require("./stack-progress-monitor");
22
+ Object.defineProperty(exports, "StackProgressMonitor", { enumerable: true, get: function () { return stack_progress_monitor_1.StackProgressMonitor; } });
23
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLDJEQUF5QztBQUN6Qyx1REFBcUM7QUFDckMsaURBQStCO0FBRS9CLG1FQUFnRTtBQUF2RCw4SEFBQSxvQkFBb0IsT0FBQSIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vc3RhY2stYWN0aXZpdHktbW9uaXRvcic7XG5leHBvcnQgKiBmcm9tICcuL3N0YWNrLWV2ZW50LXBvbGxlcic7XG5leHBvcnQgKiBmcm9tICcuL3N0YWNrLXN0YXR1cyc7XG5cbmV4cG9ydCB7IFN0YWNrUHJvZ3Jlc3NNb25pdG9yIH0gZnJvbSAnLi9zdGFjay1wcm9ncmVzcy1tb25pdG9yJztcbiJdfQ==
@@ -0,0 +1,100 @@
1
+ import type { CloudFormationStackArtifact } from '@aws-cdk/cx-api';
2
+ import type { ICloudFormationClient } from '../aws-auth/private';
3
+ import { type IoHelper } from '../io/private';
4
+ export interface StackActivityMonitorProps {
5
+ /**
6
+ * The CloudFormation client
7
+ */
8
+ readonly cfn: ICloudFormationClient;
9
+ /**
10
+ * The IoHelper used for messaging
11
+ */
12
+ readonly ioHelper: IoHelper;
13
+ /**
14
+ * The stack artifact that is getting deployed
15
+ */
16
+ readonly stack: CloudFormationStackArtifact;
17
+ /**
18
+ * The name of the Stack that is getting deployed
19
+ */
20
+ readonly stackName: string;
21
+ /**
22
+ * Total number of resources to update
23
+ *
24
+ * Used to calculate a progress bar.
25
+ *
26
+ * @default - No progress reporting.
27
+ */
28
+ readonly resourcesTotal?: number;
29
+ /**
30
+ * Creation time of the change set
31
+ *
32
+ * This will be used to filter events, only showing those from after the change
33
+ * set creation time.
34
+ *
35
+ * It is recommended to use this, otherwise the filtering will be subject
36
+ * to clock drift between local and cloud machines.
37
+ *
38
+ * @default - local machine's current time
39
+ */
40
+ readonly changeSetCreationTime?: Date;
41
+ /**
42
+ * Time to wait between fetching new activities.
43
+ *
44
+ * Must wait a reasonable amount of time between polls, since we need to consider CloudFormation API limits
45
+ *
46
+ * @default 2_000
47
+ */
48
+ readonly pollingInterval?: number;
49
+ }
50
+ export declare class StackActivityMonitor {
51
+ /**
52
+ * The poller used to read stack events
53
+ */
54
+ private readonly poller;
55
+ /**
56
+ * Fetch new activity every 1 second
57
+ * Printers can decide to update a view less frequently if desired
58
+ */
59
+ private readonly pollingInterval;
60
+ readonly errors: string[];
61
+ private monitorId?;
62
+ private readonly progressMonitor;
63
+ /**
64
+ * Current tick timer
65
+ */
66
+ private tickTimer?;
67
+ /**
68
+ * Set to the activity of reading the current events
69
+ */
70
+ private readPromise?;
71
+ private readonly ioHelper;
72
+ private readonly stackName;
73
+ private readonly stack;
74
+ constructor({ cfn, ioHelper, stack, stackName, resourcesTotal, changeSetCreationTime, pollingInterval, }: StackActivityMonitorProps);
75
+ start(): Promise<this>;
76
+ stop(): Promise<void>;
77
+ private scheduleNextTick;
78
+ private tick;
79
+ private findMetadataFor;
80
+ /**
81
+ * Reads all new events from the stack history
82
+ *
83
+ * The events are returned in reverse chronological order; we continue to the next page if we
84
+ * see a next page and the last event in the page is new to us (and within the time window).
85
+ * haven't seen the final event
86
+ */
87
+ private readNewEvents;
88
+ /**
89
+ * Perform a final poll to the end and flush out all events to the printer
90
+ *
91
+ * Finish any poll currently in progress, then do a final one until we've
92
+ * reached the last page.
93
+ */
94
+ private finalPollToEnd;
95
+ /**
96
+ * Formats a stack activity into a basic string
97
+ */
98
+ private formatActivity;
99
+ private checkForErrors;
100
+ }
@@ -0,0 +1,164 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.StackActivityMonitor = void 0;
4
+ const util = require("util");
5
+ const uuid = require("uuid");
6
+ const stack_event_poller_1 = require("./stack-event-poller");
7
+ const stack_progress_monitor_1 = require("./stack-progress-monitor");
8
+ const util_1 = require("../../util");
9
+ const private_1 = require("../io/private");
10
+ const resource_metadata_1 = require("../resource-metadata/resource-metadata");
11
+ class StackActivityMonitor {
12
+ /**
13
+ * The poller used to read stack events
14
+ */
15
+ poller;
16
+ /**
17
+ * Fetch new activity every 1 second
18
+ * Printers can decide to update a view less frequently if desired
19
+ */
20
+ pollingInterval;
21
+ errors = [];
22
+ monitorId;
23
+ progressMonitor;
24
+ /**
25
+ * Current tick timer
26
+ */
27
+ tickTimer;
28
+ /**
29
+ * Set to the activity of reading the current events
30
+ */
31
+ readPromise;
32
+ ioHelper;
33
+ stackName;
34
+ stack;
35
+ constructor({ cfn, ioHelper, stack, stackName, resourcesTotal, changeSetCreationTime, pollingInterval = 2_000, }) {
36
+ this.ioHelper = ioHelper;
37
+ this.stack = stack;
38
+ this.stackName = stackName;
39
+ this.progressMonitor = new stack_progress_monitor_1.StackProgressMonitor(resourcesTotal);
40
+ this.pollingInterval = pollingInterval;
41
+ this.poller = new stack_event_poller_1.StackEventPoller(cfn, {
42
+ stackName,
43
+ startTime: changeSetCreationTime?.getTime() ?? Date.now(),
44
+ });
45
+ }
46
+ async start() {
47
+ this.monitorId = uuid.v4();
48
+ await this.ioHelper.notify(private_1.IO.CDK_TOOLKIT_I5501.msg(`Deploying ${this.stackName}`, {
49
+ deployment: this.monitorId,
50
+ stack: this.stack,
51
+ stackName: this.stackName,
52
+ resourcesTotal: this.progressMonitor.total,
53
+ }));
54
+ this.scheduleNextTick();
55
+ return this;
56
+ }
57
+ async stop() {
58
+ const oldMonitorId = this.monitorId;
59
+ this.monitorId = undefined;
60
+ if (this.tickTimer) {
61
+ clearTimeout(this.tickTimer);
62
+ }
63
+ // Do a final poll for all events. This is to handle the situation where DescribeStackStatus
64
+ // already returned an error, but the monitor hasn't seen all the events yet and we'd end
65
+ // up not printing the failure reason to users.
66
+ await this.finalPollToEnd(oldMonitorId);
67
+ await this.ioHelper.notify(private_1.IO.CDK_TOOLKIT_I5503.msg(`Completed ${this.stackName}`, {
68
+ deployment: oldMonitorId,
69
+ stack: this.stack,
70
+ stackName: this.stackName,
71
+ resourcesTotal: this.progressMonitor.total,
72
+ }));
73
+ }
74
+ scheduleNextTick() {
75
+ if (!this.monitorId) {
76
+ return;
77
+ }
78
+ this.tickTimer = setTimeout(() => void this.tick(), this.pollingInterval);
79
+ }
80
+ async tick() {
81
+ if (!this.monitorId) {
82
+ return;
83
+ }
84
+ try {
85
+ this.readPromise = this.readNewEvents(this.monitorId);
86
+ await this.readPromise;
87
+ this.readPromise = undefined;
88
+ // We might have been stop()ped while the network call was in progress.
89
+ if (!this.monitorId) {
90
+ return;
91
+ }
92
+ }
93
+ catch (e) {
94
+ await this.ioHelper.notify(private_1.IO.CDK_TOOLKIT_E5500.msg(util.format('Error occurred while monitoring stack: %s', e), { error: e }));
95
+ }
96
+ this.scheduleNextTick();
97
+ }
98
+ findMetadataFor(logicalId) {
99
+ const metadata = this.stack.manifest?.metadata;
100
+ if (!logicalId || !metadata) {
101
+ return undefined;
102
+ }
103
+ return (0, resource_metadata_1.resourceMetadata)(this.stack, logicalId);
104
+ }
105
+ /**
106
+ * Reads all new events from the stack history
107
+ *
108
+ * The events are returned in reverse chronological order; we continue to the next page if we
109
+ * see a next page and the last event in the page is new to us (and within the time window).
110
+ * haven't seen the final event
111
+ */
112
+ async readNewEvents(monitorId) {
113
+ const pollEvents = await this.poller.poll();
114
+ for (const resourceEvent of pollEvents) {
115
+ this.progressMonitor.process(resourceEvent.event);
116
+ const activity = {
117
+ deployment: monitorId,
118
+ event: resourceEvent.event,
119
+ metadata: this.findMetadataFor(resourceEvent.event.LogicalResourceId),
120
+ progress: this.progressMonitor.progress,
121
+ };
122
+ this.checkForErrors(activity);
123
+ await this.ioHelper.notify(private_1.IO.CDK_TOOLKIT_I5502.msg(this.formatActivity(activity, true), activity));
124
+ }
125
+ }
126
+ /**
127
+ * Perform a final poll to the end and flush out all events to the printer
128
+ *
129
+ * Finish any poll currently in progress, then do a final one until we've
130
+ * reached the last page.
131
+ */
132
+ async finalPollToEnd(monitorId) {
133
+ // If we were doing a poll, finish that first. It was started before
134
+ // the moment we were sure we weren't going to get any new events anymore
135
+ // so we need to do a new one anyway. Need to wait for this one though
136
+ // because our state is single-threaded.
137
+ if (this.readPromise) {
138
+ await this.readPromise;
139
+ }
140
+ await this.readNewEvents(monitorId);
141
+ }
142
+ /**
143
+ * Formats a stack activity into a basic string
144
+ */
145
+ formatActivity(activity, progress) {
146
+ const event = activity.event;
147
+ const metadata = activity.metadata;
148
+ const resourceName = metadata ? metadata.constructPath : event.LogicalResourceId || '';
149
+ const logicalId = resourceName !== event.LogicalResourceId ? `(${event.LogicalResourceId}) ` : '';
150
+ return util.format('%s | %s%s | %s | %s | %s %s%s%s', event.StackName, progress !== false ? `${activity.progress.formatted} | ` : '', new Date(event.Timestamp).toLocaleTimeString(), event.ResourceStatus || '', event.ResourceType, resourceName, logicalId, event.ResourceStatusReason ? event.ResourceStatusReason : '', metadata?.entry.trace ? `\n\t${metadata.entry.trace.join('\n\t\\_ ')}` : '');
151
+ }
152
+ checkForErrors(activity) {
153
+ if ((0, util_1.stackEventHasErrorMessage)(activity.event.ResourceStatus ?? '')) {
154
+ const isCancelled = (activity.event.ResourceStatusReason ?? '').indexOf('cancelled') > -1;
155
+ // Cancelled is not an interesting failure reason, nor is the stack message (stack
156
+ // message will just say something like "stack failed to update")
157
+ if (!isCancelled && activity.event.StackName !== activity.event.LogicalResourceId) {
158
+ this.errors.push(activity.event.ResourceStatusReason ?? '');
159
+ }
160
+ }
161
+ }
162
+ }
163
+ exports.StackActivityMonitor = StackActivityMonitor;
164
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhY2stYWN0aXZpdHktbW9uaXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInN0YWNrLWFjdGl2aXR5LW1vbml0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsNkJBQTZCO0FBRTdCLDZCQUE2QjtBQUM3Qiw2REFBd0Q7QUFDeEQscUVBQWdFO0FBRWhFLHFDQUF1RDtBQUV2RCwyQ0FBa0Q7QUFDbEQsOEVBQTBFO0FBdUQxRSxNQUFhLG9CQUFvQjtJQUMvQjs7T0FFRztJQUNjLE1BQU0sQ0FBbUI7SUFFMUM7OztPQUdHO0lBQ2MsZUFBZSxDQUFTO0lBRXpCLE1BQU0sR0FBYSxFQUFFLENBQUM7SUFFOUIsU0FBUyxDQUFVO0lBRVYsZUFBZSxDQUF1QjtJQUV2RDs7T0FFRztJQUNLLFNBQVMsQ0FBaUM7SUFFbEQ7O09BRUc7SUFDSyxXQUFXLENBQWdCO0lBRWxCLFFBQVEsQ0FBVztJQUNuQixTQUFTLENBQVM7SUFDbEIsS0FBSyxDQUE4QjtJQUVwRCxZQUFZLEVBQ1YsR0FBRyxFQUNILFFBQVEsRUFDUixLQUFLLEVBQ0wsU0FBUyxFQUNULGNBQWMsRUFDZCxxQkFBcUIsRUFDckIsZUFBZSxHQUFHLEtBQUssR0FDRztRQUMxQixJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztRQUN6QixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNuQixJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztRQUUzQixJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksNkNBQW9CLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDaEUsSUFBSSxDQUFDLGVBQWUsR0FBRyxlQUFlLENBQUM7UUFDdkMsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLHFDQUFnQixDQUFDLEdBQUcsRUFBRTtZQUN0QyxTQUFTO1lBQ1QsU0FBUyxFQUFFLHFCQUFxQixFQUFFLE9BQU8sRUFBRSxJQUFJLElBQUksQ0FBQyxHQUFHLEVBQUU7U0FDMUQsQ0FBQyxDQUFD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QUFjLENBQUMsUUFBdUI7UUFDNUMsSUFBSSxJQUFBLGdDQUF5QixFQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsY0FBYyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDbkUsTUFBTSxXQUFXLEdBQUcsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLG9CQUFvQixJQUFJLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUUxRixrRkFBa0Y7WUFDbEYsaUVBQWlFO1lBQ2pFLElBQUksQ0FBQyxXQUFXLElBQUksUUFBUSxDQUFDLEtBQUssQ0FBQyxTQUFTLEtBQUssUUFBUSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO2dCQUNsRixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLG9CQUFvQixJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQzlELENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztDQUNGO0FBMU1ELG9EQTBNQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIHV0aWwgZnJvbSAndXRpbCc7XG5pbXBvcnQgdHlwZSB7IENsb3VkRm9ybWF0aW9uU3RhY2tBcnRpZmFjdCB9IGZyb20gJ0Bhd3MtY2RrL2N4LWFwaSc7XG5pbXBvcnQgKiBhcyB1dWlkIGZyb20gJ3V1aWQnO1xuaW1wb3J0IHsgU3RhY2tFdmVudFBvbGxlciB9IGZyb20gJy4vc3RhY2stZXZlbnQtcG9sbGVyJztcbmltcG9ydCB7IFN0YWNrUHJvZ3Jlc3NNb25pdG9yIH0gZnJvbSAnLi9zdGFjay1wcm9ncmVzcy1tb25pdG9yJztcbmltcG9ydCB0eXBlIHsgU3RhY2tBY3Rpdml0eSB9IGZyb20gJy4uLy4uL3BheWxvYWRzL3N0YWNrLWFjdGl2aXR5JztcbmltcG9ydCB7IHN0YWNrRXZlbnRIYXNFcnJvck1lc3NhZ2UgfSBmcm9tICcuLi8uLi91dGlsJztcbmltcG9ydCB0eXBlIHsgSUNsb3VkRm9ybWF0aW9uQ2xpZW50IH0gZnJvbSAnLi4vYXdzLWF1dGgvcHJpdmF0ZSc7XG5pbXBvcnQgeyBJTywgdHlwZSBJb0hlbHBlciB9IGZyb20gJy4uL2lvL3ByaXZhdGUnO1xuaW1wb3J0IHsgcmVzb3VyY2VNZXRhZGF0YSB9IGZyb20gJy4uL3Jlc291cmNlLW1ldGFkYXRhL3Jlc291cmNlLW1ldGFkYXRhJztcblxuZXhwb3J0IGludGVyZmFjZSBTdGFja0FjdGl2aXR5TW9uaXRvclByb3BzIHtcbiAgLyoqXG4gICAqIFRoZSBDbG91ZEZvcm1hdGlvbiBjbGllbnRcbiAgICovXG4gIHJlYWRvbmx5IGNmbjogSUNsb3VkRm9ybWF0aW9uQ2xpZW50O1xuXG4gIC8qKlxuICAgKiBUaGUgSW9IZWxwZXIgdXNlZCBmb3IgbWVzc2FnaW5nXG4gICAqL1xuICByZWFkb25seSBpb0hlbHBlcjogSW9IZWxwZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBzdGFjayBhcnRpZmFjdCB0aGF0IGlzIGdldHRpbmcgZGVwbG95ZWRcbiAgICovXG4gIHJlYWRvbmx5IHN0YWNrOiBDbG91ZEZvcm1hdGlvblN0YWNrQXJ0aWZhY3Q7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBTdGFjayB0aGF0IGlzIGdldHRpbmcgZGVwbG95ZWRcbiAgICovXG4gIHJlYWRvbmx5IHN0YWNrTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUb3RhbCBudW1iZXIgb2YgcmVzb3VyY2VzIHRvIHVwZGF0ZVxuICAgKlxuICAgKiBVc2VkIHRvIGNhbGN1bGF0ZSBhIHByb2dyZXNzIGJhci5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBObyBwcm9ncmVzcyByZXBvcnRpbmcuXG4gICAqL1xuICByZWFkb25seSByZXNvdXJjZXNUb3RhbD86IG51bWJlcjtcblxuICAvKipcbiAgICogQ3JlYXRpb24gdGltZSBvZiB0aGUgY2hhbmdlIHNldFxuICAgKlxuICAgKiBUaGlzIHdpbGwgYmUgdXNlZCB0byBmaWx0ZXIgZXZlbnRzLCBvbmx5IHNob3dpbmcgdGhvc2UgZnJvbSBhZnRlciB0aGUgY2hhbmdlXG4gICAqIHNldCBjcmVhdGlvbiB0aW1lLlxuICAgKlxuICAgKiBJdCBpcyByZWNvbW1lbmRlZCB0byB1c2UgdGhpcywgb3RoZXJ3aXNlIHRoZSBmaWx0ZXJpbmcgd2lsbCBiZSBzdWJqZWN0XG4gICAqIHRvIGNsb2NrIGRyaWZ0IGJldHdlZW4gbG9jYWwgYW5kIGNsb3VkIG1hY2hpbmVzLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGxvY2FsIG1hY2hpbmUncyBjdXJyZW50IHRpbWVcbiAgICovXG4gIHJlYWRvbmx5IGNoYW5nZVNldENyZWF0aW9uVGltZT86IERhdGU7XG5cbiAgLyoqXG4gICAqIFRpbWUgdG8gd2FpdCBiZXR3ZWVuIGZldGNoaW5nIG5ldyBhY3Rpdml0aWVzLlxuICAgKlxuICAgKiBNdXN0IHdhaXQgYSByZWFzb25hYmxlIGFtb3VudCBvZiB0aW1lIGJldHdlZW4gcG9sbHMsIHNpbmNlIHdlIG5lZWQgdG8gY29uc2lkZXIgQ2xvdWRGb3JtYXRpb24gQVBJIGxpbWl0c1xuICAgKlxuICAgKiBAZGVmYXVsdCAyXzAwMFxuICAgKi9cbiAgcmVhZG9ubHkgcG9sbGluZ0ludGVydmFsPzogbnVtYmVyO1xufVxuXG5leHBvcnQgY2xhc3MgU3RhY2tBY3Rpdml0eU1vbml0b3Ige1xuICAvKipcbiAgICogVGhlIHBvbGxlciB1c2VkIHRvIHJlYWQgc3RhY2sgZXZlbnRzXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHBvbGxlcjogU3RhY2tFdmVudFBvbGxlcjtcblxuICAvKipcbiAgICogRmV0Y2ggbmV3IGFjdGl2aXR5IGV2ZXJ5IDEgc2Vjb25kXG4gICAqIFByaW50ZXJzIGNhbiBkZWNpZGUgdG8gdXBkYXRlIGEgdmlldyBsZXNzIGZyZXF1ZW50bHkgaWYgZGVzaXJlZFxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBwb2xsaW5nSW50ZXJ2YWw6IG51bWJlcjtcblxuICBwdWJsaWMgcmVhZG9ubHkgZXJyb3JzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIHByaXZhdGUgbW9uaXRvcklkPzogc3RyaW5nO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgcHJvZ3Jlc3NNb25pdG9yOiBTdGFja1Byb2dyZXNzTW9uaXRvcjtcblxuICAvKipcbiAgICogQ3VycmVudCB0aWNrIHRpbWVyXG4gICAqL1xuICBwcml2YXRlIHRpY2tUaW1lcj86IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+O1xuXG4gIC8qKlxuICAgKiBTZXQgdG8gdGhlIGFjdGl2aXR5IG9mIHJlYWRpbmcgdGhlIGN1cnJlbnQgZXZlbnRzXG4gICAqL1xuICBwcml2YXRlIHJlYWRQcm9taXNlPzogUHJvbWlzZTxhbnk+O1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgaW9IZWxwZXI6IElvSGVscGVyO1xuICBwcml2YXRlIHJlYWRvbmx5IHN0YWNrTmFtZTogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IHN0YWNrOiBDbG91ZEZvcm1hdGlvblN0YWNrQXJ0aWZhY3Q7XG5cbiAgY29uc3RydWN0b3Ioe1xuICAgIGNmbixcbiAgICBpb0hlbHBlcixcbiAgICBzdGFjayxcbiAgICBzdGFja05hbWUsXG4gICAgcmVzb3VyY2VzVG90YWwsXG4gICAgY2hhbmdlU2V0Q3JlYXRpb25UaW1lLFxuICAgIHBvbGxpbmdJbnRlcnZhbCA9IDJfMDAwLFxuICB9OiBTdGFja0FjdGl2aXR5TW9uaXRvclByb3BzKSB7XG4gICAgdGhpcy5pb0hlbHBlciA9IGlvSGVscGVyO1xuICAgIHRoaXMuc3RhY2sgPSBzdGFjaztcbiAgICB0aGlzLnN0YWNrTmFtZSA9IHN0YWNrTmFtZTtcblxuICAgIHRoaXMucHJvZ3Jlc3NNb25pdG9yID0gbmV3IFN0YWNrUHJvZ3Jlc3NNb25pdG9yKHJlc291cmNlc1RvdGFsKTtcbiAgICB0aGlzLnBvbGxpbmdJbnRlcnZhbCA9IHBvbGxpbmdJbnRlcnZhbDtcbiAgICB0aGlzLnBvbGxlciA9IG5ldyBTdGFja0V2ZW50UG9sbGVyKGNmbiwge1xuICAgICAgc3RhY2tOYW1lLFxuICAgICAgc3RhcnRUaW1lOiBjaGFuZ2VTZXRDcmVhdGlvblRpbWU/LmdldFRpbWUoKSA/PyBEYXRlLm5vdygpLFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHN0YXJ0KCkge1xuICAgIHRoaXMubW9uaXRvcklkID0gdXVpZC52NCgpO1xuICAgIGF3YWl0IHRoaXMuaW9IZWxwZXIubm90aWZ5KElPLkNES19UT09MS0lUX0k1NTAxLm1zZyhgRGVwbG95aW5nICR7dGhpcy5zdGFja05hbWV9YCwge1xuICAgICAgZGVwbG95bWVudDogdGhpcy5tb25pdG9ySWQsXG4gICAgICBzdGFjazogdGhpcy5zdGFjayxcbiAgICAgIHN0YWNrTmFtZTogdGhpcy5zdGFja05hbWUsXG4gICAgICByZXNvdXJjZXNUb3RhbDogdGhpcy5wcm9ncmVzc01vbml0b3IudG90YWwsXG4gICAgfSkpO1xuICAgIHRoaXMuc2NoZWR1bGVOZXh0VGljaygpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHN0b3AoKSB7XG4gICAgY29uc3Qgb2xkTW9uaXRvcklkID0gdGhpcy5tb25pdG9ySWQhO1xuICAgIHRoaXMubW9uaXRvcklkID0gdW5kZWZpbmVkO1xuICAgIGlmICh0aGlzLnRpY2tUaW1lcikge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMudGlja1RpbWVyKTtcbiAgICB9XG5cbiAgICAvLyBEbyBhIGZpbmFsIHBvbGwgZm9yIGFsbCBldmVudHMuIFRoaXMgaXMgdG8gaGFuZGxlIHRoZSBzaXR1YXRpb24gd2hlcmUgRGVzY3JpYmVTdGFja1N0YXR1c1xuICAgIC8vIGFscmVhZHkgcmV0dXJuZWQgYW4gZXJyb3IsIGJ1dCB0aGUgbW9uaXRvciBoYXNuJ3Qgc2VlbiBhbGwgdGhlIGV2ZW50cyB5ZXQgYW5kIHdlJ2QgZW5kXG4gICAgLy8gdXAgbm90IHByaW50aW5nIHRoZSBmYWlsdXJlIHJlYXNvbiB0byB1c2Vycy5cbiAgICBhd2FpdCB0aGlzLmZpbmFsUG9sbFRvRW5kKG9sZE1vbml0b3JJZCk7XG5cbiAgICBhd2FpdCB0aGlzLmlvSGVscGVyLm5vdGlmeShJTy5DREtfVE9PTEtJVF9JNTUwMy5tc2coYENvbXBsZXRlZCAke3RoaXMuc3RhY2tOYW1lfWAsIHtcbiAgICAgIGRlcGxveW1lbnQ6IG9sZE1vbml0b3JJZCxcbiAgICAgIHN0YWNrOiB0aGlzLnN0YWNrLFxuICAgICAgc3RhY2tOYW1lOiB0aGlzLnN0YWNrTmFtZSxcbiAgICAgIHJlc291cmNlc1RvdGFsOiB0aGlzLnByb2dyZXNzTW9uaXRvci50b3RhbCxcbiAgICB9KSk7XG4gIH1cblxuICBwcml2YXRlIHNjaGVkdWxlTmV4dFRpY2soKSB7XG4gICAgaWYgKCF0aGlzLm1vbml0b3JJZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMudGlja1RpbWVyID0gc2V0VGltZW91dCgoKSA9PiB2b2lkIHRoaXMudGljaygpLCB0aGlzLnBvbGxpbmdJbnRlcnZhbCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHRpY2soKSB7XG4gICAgaWYgKCF0aGlzLm1vbml0b3JJZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICB0aGlzLnJlYWRQcm9taXNlID0gdGhpcy5yZWFkTmV3RXZlbnRzKHRoaXMubW9uaXRvcklkKTtcbiAgICAgIGF3YWl0IHRoaXMucmVhZFByb21pc2U7XG4gICAgICB0aGlzLnJlYWRQcm9taXNlID0gdW5kZWZpbmVkO1xuXG4gICAgICAvLyBXZSBtaWdodCBoYXZlIGJlZW4gc3RvcCgpcGVkIHdoaWxlIHRoZSBuZXR3b3JrIGNhbGwgd2FzIGluIHByb2dyZXNzLlxuICAgICAgaWYgKCF0aGlzLm1vbml0b3JJZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgYXdhaXQgdGhpcy5pb0hlbHBlci5ub3RpZnkoSU8uQ0RLX1RPT0xLSVRfRTU1MDAubXNnKFxuICAgICAgICB1dGlsLmZvcm1hdCgnRXJyb3Igb2NjdXJyZWQgd2hpbGUgbW9uaXRvcmluZyBzdGFjazogJXMnLCBlKSxcbiAgICAgICAgeyBlcnJvcjogZSBhcyBhbnkgfSxcbiAgICAgICkpO1xuICAgIH1cbiAgICB0aGlzLnNjaGVkdWxlTmV4dFRpY2soKTtcbiAgfVxuXG4gIHByaXZhdGUgZmluZE1ldGFkYXRhRm9yKGxvZ2ljYWxJZDogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgbWV0YWRhdGEgPSB0aGlzLnN0YWNrLm1hbmlmZXN0Py5tZXRhZGF0YTtcbiAgICBpZiAoIWxvZ2ljYWxJZCB8fCAhbWV0YWRhdGEpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiByZXNvdXJjZU1ldGFkYXRhKHRoaXMuc3RhY2ssIGxvZ2ljYWxJZCk7XG4gIH1cblxuICAvKipcbiAgICogUmVhZHMgYWxsIG5ldyBldmVudHMgZnJvbSB0aGUgc3RhY2sgaGlzdG9yeVxuICAgKlxuICAgKiBUaGUgZXZlbnRzIGFyZSByZXR1cm5lZCBpbiByZXZlcnNlIGNocm9ub2xvZ2ljYWwgb3JkZXI7IHdlIGNvbnRpbnVlIHRvIHRoZSBuZXh0IHBhZ2UgaWYgd2VcbiAgICogc2VlIGEgbmV4dCBwYWdlIGFuZCB0aGUgbGFzdCBldmVudCBpbiB0aGUgcGFnZSBpcyBuZXcgdG8gdXMgKGFuZCB3aXRoaW4gdGhlIHRpbWUgd2luZG93KS5cbiAgICogaGF2ZW4ndCBzZWVuIHRoZSBmaW5hbCBldmVudFxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyByZWFkTmV3RXZlbnRzKG1vbml0b3JJZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcG9sbEV2ZW50cyA9IGF3YWl0IHRoaXMucG9sbGVyLnBvbGwoKTtcblxuICAgIGZvciAoY29uc3QgcmVzb3VyY2VFdmVudCBvZiBwb2xsRXZlbnRzKSB7XG4gICAgICB0aGlzLnByb2dyZXNzTW9uaXRvci5wcm9jZXNzKHJlc291cmNlRXZlbnQuZXZlbnQpO1xuXG4gICAgICBjb25zdCBhY3Rpdml0eTogU3RhY2tBY3Rpdml0eSA9IHtcbiAgICAgICAgZGVwbG95bWVudDogbW9uaXRvcklkLFxuICAgICAgICBldmVudDogcmVzb3VyY2VFdmVudC5ldmVudCxcbiAgICAgICAgbWV0YWRhdGE6IHRoaXMuZmluZE1ldGFkYXRhRm9yKHJlc291cmNlRXZlbnQuZXZlbnQuTG9naWNhbFJlc291cmNlSWQpLFxuICAgICAgICBwcm9ncmVzczogdGhpcy5wcm9ncmVzc01vbml0b3IucHJvZ3Jlc3MsXG4gICAgICB9O1xuXG4gICAgICB0aGlzLmNoZWNrRm9yRXJyb3JzKGFjdGl2aXR5KTtcbiAgICAgIGF3YWl0IHRoaXMuaW9IZWxwZXIubm90aWZ5KElPLkNES19UT09MS0lUX0k1NTAyLm1zZyh0aGlzLmZvcm1hdEFjdGl2aXR5KGFjdGl2aXR5LCB0cnVlKSwgYWN0aXZpdHkpKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUGVyZm9ybSBhIGZpbmFsIHBvbGwgdG8gdGhlIGVuZCBhbmQgZmx1c2ggb3V0IGFsbCBldmVudHMgdG8gdGhlIHByaW50ZXJcbiAgICpcbiAgICogRmluaXNoIGFueSBwb2xsIGN1cnJlbnRseSBpbiBwcm9ncmVzcywgdGhlbiBkbyBhIGZpbmFsIG9uZSB1bnRpbCB3ZSd2ZVxuICAgKiByZWFjaGVkIHRoZSBsYXN0IHBhZ2UuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGZpbmFsUG9sbFRvRW5kKG1vbml0b3JJZDogc3RyaW5nKSB7XG4gICAgLy8gSWYgd2Ugd2VyZSBkb2luZyBhIHBvbGwsIGZpbmlzaCB0aGF0IGZpcnN0LiBJdCB3YXMgc3RhcnRlZCBiZWZvcmVcbiAgICAvLyB0aGUgbW9tZW50IHdlIHdlcmUgc3VyZSB3ZSB3ZXJlbid0IGdvaW5nIHRvIGdldCBhbnkgbmV3IGV2ZW50cyBhbnltb3JlXG4gICAgLy8gc28gd2UgbmVlZCB0byBkbyBhIG5ldyBvbmUgYW55d2F5LiBOZWVkIHRvIHdhaXQgZm9yIHRoaXMgb25lIHRob3VnaFxuICAgIC8vIGJlY2F1c2Ugb3VyIHN0YXRlIGlzIHNpbmdsZS10aHJlYWRlZC5cbiAgICBpZiAodGhpcy5yZWFkUHJvbWlzZSkge1xuICAgICAgYXdhaXQgdGhpcy5yZWFkUHJvbWlzZTtcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLnJlYWROZXdFdmVudHMobW9uaXRvcklkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGb3JtYXRzIGEgc3RhY2sgYWN0aXZpdHkgaW50byBhIGJhc2ljIHN0cmluZ1xuICAgKi9cbiAgcHJpdmF0ZSBmb3JtYXRBY3Rpdml0eShhY3Rpdml0eTogU3RhY2tBY3Rpdml0eSwgcHJvZ3Jlc3M6IGJvb2xlYW4pOiBzdHJpbmcge1xuICAgIGNvbnN0IGV2ZW50ID0gYWN0aXZpdHkuZXZlbnQ7XG4gICAgY29uc3QgbWV0YWRhdGEgPSBhY3Rpdml0eS5tZXRhZGF0YTtcblxuICAgIGNvbnN0IHJlc291cmNlTmFtZSA9IG1ldGFkYXRhID8gbWV0YWRhdGEuY29uc3RydWN0UGF0aCA6IGV2ZW50LkxvZ2ljYWxSZXNvdXJjZUlkIHx8ICcnO1xuICAgIGNvbnN0IGxvZ2ljYWxJZCA9IHJlc291cmNlTmFtZSAhPT0gZXZlbnQuTG9naWNhbFJlc291cmNlSWQgPyBgKCR7ZXZlbnQuTG9naWNhbFJlc291cmNlSWR9KSBgIDogJyc7XG5cbiAgICByZXR1cm4gdXRpbC5mb3JtYXQoXG4gICAgICAnJXMgfCAlcyVzIHwgJXMgfCAlcyB8ICVzICVzJXMlcycsXG4gICAgICBldmVudC5TdGFja05hbWUsXG4gICAgICBwcm9ncmVzcyAhPT0gZmFsc2UgPyBgJHthY3Rpdml0eS5wcm9ncmVzcy5mb3JtYXR0ZWR9IHwgYCA6ICcnLFxuICAgICAgbmV3IERhdGUoZXZlbnQuVGltZXN0YW1wISkudG9Mb2NhbGVUaW1lU3RyaW5nKCksXG4gICAgICBldmVudC5SZXNvdXJjZVN0YXR1cyB8fCAnJyxcbiAgICAgIGV2ZW50LlJlc291cmNlVHlwZSxcbiAgICAgIHJlc291cmNlTmFtZSxcbiAgICAgIGxvZ2ljYWxJZCxcbiAgICAgIGV2ZW50LlJlc291cmNlU3RhdHVzUmVhc29uID8gZXZlbnQuUmVzb3VyY2VTdGF0dXNSZWFzb24gOiAnJyxcbiAgICAgIG1ldGFkYXRhPy5lbnRyeS50cmFjZSA/IGBcXG5cXHQke21ldGFkYXRhLmVudHJ5LnRyYWNlLmpvaW4oJ1xcblxcdFxcXFxfICcpfWAgOiAnJyxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBjaGVja0ZvckVycm9ycyhhY3Rpdml0eTogU3RhY2tBY3Rpdml0eSkge1xuICAgIGlmIChzdGFja0V2ZW50SGFzRXJyb3JNZXNzYWdlKGFjdGl2aXR5LmV2ZW50LlJlc291cmNlU3RhdHVzID8/ICcnKSkge1xuICAgICAgY29uc3QgaXNDYW5jZWxsZWQgPSAoYWN0aXZpdHkuZXZlbnQuUmVzb3VyY2VTdGF0dXNSZWFzb24gPz8gJycpLmluZGV4T2YoJ2NhbmNlbGxlZCcpID4gLTE7XG5cbiAgICAgIC8vIENhbmNlbGxlZCBpcyBub3QgYW4gaW50ZXJlc3RpbmcgZmFpbHVyZSByZWFzb24sIG5vciBpcyB0aGUgc3RhY2sgbWVzc2FnZSAoc3RhY2tcbiAgICAgIC8vIG1lc3NhZ2Ugd2lsbCBqdXN0IHNheSBzb21ldGhpbmcgbGlrZSBcInN0YWNrIGZhaWxlZCB0byB1cGRhdGVcIilcbiAgICAgIGlmICghaXNDYW5jZWxsZWQgJiYgYWN0aXZpdHkuZXZlbnQuU3RhY2tOYW1lICE9PSBhY3Rpdml0eS5ldmVudC5Mb2dpY2FsUmVzb3VyY2VJZCkge1xuICAgICAgICB0aGlzLmVycm9ycy5wdXNoKGFjdGl2aXR5LmV2ZW50LlJlc291cmNlU3RhdHVzUmVhc29uID8/ICcnKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,69 @@
1
+ import type { StackEvent } from '@aws-sdk/client-cloudformation';
2
+ import type { ICloudFormationClient } from '../aws-auth/private';
3
+ export interface StackEventPollerProps {
4
+ /**
5
+ * The stack to poll
6
+ */
7
+ readonly stackName: string;
8
+ /**
9
+ * IDs of parent stacks of this resource, in case of resources in nested stacks
10
+ */
11
+ readonly parentStackLogicalIds?: string[];
12
+ /**
13
+ * Timestamp for the oldest event we're interested in
14
+ *
15
+ * @default - Read all events
16
+ */
17
+ readonly startTime?: number;
18
+ /**
19
+ * Stop reading when we see the stack entering this status
20
+ *
21
+ * Should be something like `CREATE_IN_PROGRESS`, `UPDATE_IN_PROGRESS`,
22
+ * `DELETE_IN_PROGRESS, `ROLLBACK_IN_PROGRESS`.
23
+ *
24
+ * @default - Read all events
25
+ */
26
+ readonly stackStatuses?: string[];
27
+ }
28
+ export interface ResourceEvent {
29
+ /**
30
+ * The Stack Event as received from CloudFormation
31
+ */
32
+ readonly event: StackEvent;
33
+ /**
34
+ * IDs of parent stacks of the resource, in case of resources in nested stacks
35
+ */
36
+ readonly parentStackLogicalIds: string[];
37
+ /**
38
+ * Whether this event regards the root stack
39
+ *
40
+ * @default false
41
+ */
42
+ readonly isStackEvent?: boolean;
43
+ }
44
+ export declare class StackEventPoller {
45
+ private readonly cfn;
46
+ private readonly props;
47
+ readonly events: ResourceEvent[];
48
+ complete: boolean;
49
+ private readonly eventIds;
50
+ private readonly nestedStackPollers;
51
+ constructor(cfn: ICloudFormationClient, props: StackEventPollerProps);
52
+ /**
53
+ * From all accumulated events, return only the errors
54
+ */
55
+ get resourceErrors(): ResourceEvent[];
56
+ /**
57
+ * Poll for new stack events
58
+ *
59
+ * Will not return events older than events indicated by the constructor filters.
60
+ *
61
+ * Recurses into nested stacks, and returns events old-to-new.
62
+ */
63
+ poll(): Promise<ResourceEvent[]>;
64
+ private doPoll;
65
+ /**
66
+ * On the CREATE_IN_PROGRESS, UPDATE_IN_PROGRESS, DELETE_IN_PROGRESS event of a nested stack, poll the nested stack updates
67
+ */
68
+ private trackNestedStack;
69
+ }
@@ -0,0 +1,130 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.StackEventPoller = void 0;
4
+ const util_1 = require("../../util");
5
+ class StackEventPoller {
6
+ cfn;
7
+ props;
8
+ events = [];
9
+ complete = false;
10
+ eventIds = new Set();
11
+ nestedStackPollers = {};
12
+ constructor(cfn, props) {
13
+ this.cfn = cfn;
14
+ this.props = props;
15
+ }
16
+ /**
17
+ * From all accumulated events, return only the errors
18
+ */
19
+ get resourceErrors() {
20
+ return this.events.filter((e) => e.event.ResourceStatus?.endsWith('_FAILED') && !e.isStackEvent);
21
+ }
22
+ /**
23
+ * Poll for new stack events
24
+ *
25
+ * Will not return events older than events indicated by the constructor filters.
26
+ *
27
+ * Recurses into nested stacks, and returns events old-to-new.
28
+ */
29
+ async poll() {
30
+ const events = await this.doPoll();
31
+ // Also poll all nested stacks we're currently tracking
32
+ for (const [logicalId, poller] of Object.entries(this.nestedStackPollers)) {
33
+ events.push(...(await poller.poll()));
34
+ if (poller.complete) {
35
+ delete this.nestedStackPollers[logicalId];
36
+ }
37
+ }
38
+ // Return what we have so far
39
+ events.sort((a, b) => a.event.Timestamp.valueOf() - b.event.Timestamp.valueOf());
40
+ this.events.push(...events);
41
+ return events;
42
+ }
43
+ async doPoll() {
44
+ const events = [];
45
+ try {
46
+ let nextToken;
47
+ let finished = false;
48
+ while (!finished) {
49
+ const page = await this.cfn.describeStackEvents({ StackName: this.props.stackName, NextToken: nextToken });
50
+ for (const event of page?.StackEvents ?? []) {
51
+ // Event from before we were interested in 'em
52
+ if (this.props.startTime !== undefined && event.Timestamp.valueOf() < this.props.startTime) {
53
+ return events;
54
+ }
55
+ // Already seen this one
56
+ if (this.eventIds.has(event.EventId)) {
57
+ return events;
58
+ }
59
+ this.eventIds.add(event.EventId);
60
+ // The events for the stack itself are also included next to events about resources; we can test for them in this way.
61
+ const isParentStackEvent = event.PhysicalResourceId === event.StackId;
62
+ if (isParentStackEvent && this.props.stackStatuses?.includes(event.ResourceStatus ?? '')) {
63
+ return events;
64
+ }
65
+ // Fresh event
66
+ const resEvent = {
67
+ event: event,
68
+ parentStackLogicalIds: this.props.parentStackLogicalIds ?? [],
69
+ isStackEvent: isParentStackEvent,
70
+ };
71
+ events.push(resEvent);
72
+ if (!isParentStackEvent &&
73
+ event.ResourceType === 'AWS::CloudFormation::Stack' &&
74
+ isStackBeginOperationState(event.ResourceStatus)) {
75
+ // If the event is not for `this` stack and has a physical resource Id, recursively call for events in the nested stack
76
+ this.trackNestedStack(event, [...(this.props.parentStackLogicalIds ?? []), event.LogicalResourceId ?? '']);
77
+ }
78
+ if (isParentStackEvent && isStackTerminalState(event.ResourceStatus)) {
79
+ this.complete = true;
80
+ }
81
+ }
82
+ nextToken = page?.NextToken;
83
+ if (nextToken === undefined) {
84
+ finished = true;
85
+ }
86
+ }
87
+ }
88
+ catch (e) {
89
+ if (!(e.name === 'ValidationError' && (0, util_1.formatErrorMessage)(e) === `Stack [${this.props.stackName}] does not exist`)) {
90
+ throw e;
91
+ }
92
+ }
93
+ return events;
94
+ }
95
+ /**
96
+ * On the CREATE_IN_PROGRESS, UPDATE_IN_PROGRESS, DELETE_IN_PROGRESS event of a nested stack, poll the nested stack updates
97
+ */
98
+ trackNestedStack(event, parentStackLogicalIds) {
99
+ const logicalId = event.LogicalResourceId;
100
+ const physicalResourceId = event.PhysicalResourceId;
101
+ // The CREATE_IN_PROGRESS event for a Nested Stack is emitted twice; first without a PhysicalResourceId
102
+ // and then with. Ignore this event if we don't have that property yet.
103
+ //
104
+ // (At this point, I also don't trust that logicalId is always going to be there so validate that as well)
105
+ if (!logicalId || !physicalResourceId) {
106
+ return;
107
+ }
108
+ if (!this.nestedStackPollers[logicalId]) {
109
+ this.nestedStackPollers[logicalId] = new StackEventPoller(this.cfn, {
110
+ stackName: physicalResourceId,
111
+ parentStackLogicalIds: parentStackLogicalIds,
112
+ startTime: event.Timestamp.valueOf(),
113
+ });
114
+ }
115
+ }
116
+ }
117
+ exports.StackEventPoller = StackEventPoller;
118
+ function isStackBeginOperationState(state) {
119
+ return [
120
+ 'CREATE_IN_PROGRESS',
121
+ 'UPDATE_IN_PROGRESS',
122
+ 'DELETE_IN_PROGRESS',
123
+ 'UPDATE_ROLLBACK_IN_PROGRESS',
124
+ 'ROLLBACK_IN_PROGRESS',
125
+ ].includes(state ?? '');
126
+ }
127
+ function isStackTerminalState(state) {
128
+ return !(state ?? '').endsWith('_IN_PROGRESS');
129
+ }
130
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhY2stZXZlbnQtcG9sbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsic3RhY2stZXZlbnQtcG9sbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLHFDQUFnRDtBQW1EaEQsTUFBYSxnQkFBZ0I7SUFRUjtJQUNBO0lBUkgsTUFBTSxHQUFvQixFQUFFLENBQUM7SUFDdEMsUUFBUSxHQUFZLEtBQUssQ0FBQztJQUVoQixRQUFRLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztJQUM3QixrQkFBa0IsR0FBcUMsRUFBRSxDQUFDO0lBRTNFLFlBQ21CLEdBQTBCLEVBQzFCLEtBQTRCO1FBRDVCLFFBQUcsR0FBSCxHQUFHLENBQXVCO1FBQzFCLFVBQUssR0FBTCxLQUFLLENBQXVCO0lBRS9DLENBQUM7SUFFRDs7T0FFRztJQUNILElBQVcsY0FBYztRQUN2QixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLGNBQWMsRUFBRSxRQUFRLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDbkcsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLEtBQUssQ0FBQyxJQUFJO1FBQ2YsTUFBTSxNQUFNLEdBQW9CLE1BQU0sSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBRXBELHVEQUF1RDtRQUN2RCxLQUFLLE1BQU0sQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsRUFBRSxDQUFDO1lBQzFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztZQUN0QyxJQUFJLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDcEIsT0FBTyxJQUFJLENBQUMsa0JBQWtC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LDRDQWtJQztBQUVELFNBQVMsMEJBQTBCLENBQUMsS0FBeUI7SUFDM0QsT0FBTztRQUNMLG9CQUFvQjtRQUNwQixvQkFBb0I7UUFDcEIsb0JBQW9CO1FBQ3BCLDZCQUE2QjtRQUM3QixzQkFBc0I7S0FDdkIsQ0FBQyxRQUFRLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0FBQzFCLENBQUM7QUFFRCxTQUFTLG9CQUFvQixDQUFDLEtBQXlCO0lBQ3JELE9BQU8sQ0FBQyxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLENBQUM7QUFDakQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgU3RhY2tFdmVudCB9IGZyb20gJ0Bhd3Mtc2RrL2NsaWVudC1jbG91ZGZvcm1hdGlvbic7XG5pbXBvcnQgeyBmb3JtYXRFcnJvck1lc3NhZ2UgfSBmcm9tICcuLi8uLi91dGlsJztcbmltcG9ydCB0eXBlIHsgSUNsb3VkRm9ybWF0aW9uQ2xpZW50IH0gZnJvbSAnLi4vYXdzLWF1dGgvcHJpdmF0ZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RhY2tFdmVudFBvbGxlclByb3BzIHtcbiAgLyoqXG4gICAqIFRoZSBzdGFjayB0byBwb2xsXG4gICAqL1xuICByZWFkb25seSBzdGFja05hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogSURzIG9mIHBhcmVudCBzdGFja3Mgb2YgdGhpcyByZXNvdXJjZSwgaW4gY2FzZSBvZiByZXNvdXJjZXMgaW4gbmVzdGVkIHN0YWNrc1xuICAgKi9cbiAgcmVhZG9ubHkgcGFyZW50U3RhY2tMb2dpY2FsSWRzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFRpbWVzdGFtcCBmb3IgdGhlIG9sZGVzdCBldmVudCB3ZSdyZSBpbnRlcmVzdGVkIGluXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gUmVhZCBhbGwgZXZlbnRzXG4gICAqL1xuICByZWFkb25seSBzdGFydFRpbWU/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFN0b3AgcmVhZGluZyB3aGVuIHdlIHNlZSB0aGUgc3RhY2sgZW50ZXJpbmcgdGhpcyBzdGF0dXNcbiAgICpcbiAgICogU2hvdWxkIGJlIHNvbWV0aGluZyBsaWtlIGBDUkVBVEVfSU5fUFJPR1JFU1NgLCBgVVBEQVRFX0lOX1BST0dSRVNTYCxcbiAgICogYERFTEVURV9JTl9QUk9HUkVTUywgYFJPTExCQUNLX0lOX1BST0dSRVNTYC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBSZWFkIGFsbCBldmVudHNcbiAgICovXG4gIHJlYWRvbmx5IHN0YWNrU3RhdHVzZXM/OiBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZXNvdXJjZUV2ZW50IHtcbiAgLyoqXG4gICAqIFRoZSBTdGFjayBFdmVudCBhcyByZWNlaXZlZCBmcm9tIENsb3VkRm9ybWF0aW9uXG4gICAqL1xuICByZWFkb25seSBldmVudDogU3RhY2tFdmVudDtcblxuICAvKipcbiAgICogSURzIG9mIHBhcmVudCBzdGFja3Mgb2YgdGhlIHJlc291cmNlLCBpbiBjYXNlIG9mIHJlc291cmNlcyBpbiBuZXN0ZWQgc3RhY2tzXG4gICAqL1xuICByZWFkb25seSBwYXJlbnRTdGFja0xvZ2ljYWxJZHM6IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoaXMgZXZlbnQgcmVnYXJkcyB0aGUgcm9vdCBzdGFja1xuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgaXNTdGFja0V2ZW50PzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNsYXNzIFN0YWNrRXZlbnRQb2xsZXIge1xuICBwdWJsaWMgcmVhZG9ubHkgZXZlbnRzOiBSZXNvdXJjZUV2ZW50W10gPSBbXTtcbiAgcHVibGljIGNvbXBsZXRlOiBib29sZWFuID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBldmVudElkcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IG5lc3RlZFN0YWNrUG9sbGVyczogUmVjb3JkPHN0cmluZywgU3RhY2tFdmVudFBvbGxlcj4gPSB7fTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNmbjogSUNsb3VkRm9ybWF0aW9uQ2xpZW50LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcHJvcHM6IFN0YWNrRXZlbnRQb2xsZXJQcm9wcyxcbiAgKSB7XG4gIH1cblxuICAvKipcbiAgICogRnJvbSBhbGwgYWNjdW11bGF0ZWQgZXZlbnRzLCByZXR1cm4gb25seSB0aGUgZXJyb3JzXG4gICAqL1xuICBwdWJsaWMgZ2V0IHJlc291cmNlRXJyb3JzKCk6IFJlc291cmNlRXZlbnRbXSB7XG4gICAgcmV0dXJuIHRoaXMuZXZlbnRzLmZpbHRlcigoZSkgPT4gZS5ldmVudC5SZXNvdXJjZVN0YXR1cz8uZW5kc1dpdGgoJ19GQUlMRUQnKSAmJiAhZS5pc1N0YWNrRXZlbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBvbGwgZm9yIG5ldyBzdGFjayBldmVudHNcbiAgICpcbiAgICogV2lsbCBub3QgcmV0dXJuIGV2ZW50cyBvbGRlciB0aGFuIGV2ZW50cyBpbmRpY2F0ZWQgYnkgdGhlIGNvbnN0cnVjdG9yIGZpbHRlcnMuXG4gICAqXG4gICAqIFJlY3Vyc2VzIGludG8gbmVzdGVkIHN0YWNrcywgYW5kIHJldHVybnMgZXZlbnRzIG9sZC10by1uZXcuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcG9sbCgpOiBQcm9taXNlPFJlc291cmNlRXZlbnRbXT4ge1xuICAgIGNvbnN0IGV2ZW50czogUmVzb3VyY2VFdmVudFtdID0gYXdhaXQgdGhpcy5kb1BvbGwoKTtcblxuICAgIC8vIEFsc28gcG9sbCBhbGwgbmVzdGVkIHN0YWNrcyB3ZSdyZSBjdXJyZW50bHkgdHJhY2tpbmdcbiAgICBmb3IgKGNvbnN0IFtsb2dpY2FsSWQsIHBvbGxlcl0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5uZXN0ZWRTdGFja1BvbGxlcnMpKSB7XG4gICAgICBldmVudHMucHVzaCguLi4oYXdhaXQgcG9sbGVyLnBvbGwoKSkpO1xuICAgICAgaWYgKHBvbGxlci5jb21wbGV0ZSkge1xuICAgICAgICBkZWxldGUgdGhpcy5uZXN0ZWRTdGFja1BvbGxlcnNbbG9naWNhbElkXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gd2hhdCB3ZSBoYXZlIHNvIGZhclxuICAgIGV2ZW50cy5zb3J0KChhLCBiKSA9PiBhLmV2ZW50LlRpbWVzdGFtcCEudmFsdWVPZigpIC0gYi5ldmVudC5UaW1lc3RhbXAhLnZhbHVlT2YoKSk7XG4gICAgdGhpcy5ldmVudHMucHVzaCguLi5ldmVudHMpO1xuICAgIHJldHVybiBldmVudHM7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGRvUG9sbCgpOiBQcm9taXNlPFJlc291cmNlRXZlbnRbXT4ge1xuICAgIGNvbnN0IGV2ZW50czogUmVzb3VyY2VFdmVudFtdID0gW107XG4gICAgdHJ5IHtcbiAgICAgIGxldCBuZXh0VG9rZW46IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgIGxldCBmaW5pc2hlZCA9IGZhbHNlO1xuXG4gICAgICB3aGlsZSAoIWZpbmlzaGVkKSB7XG4gICAgICAgIGNvbnN0IHBhZ2UgPSBhd2FpdCB0aGlzLmNmbi5kZXNjcmliZVN0YWNrRXZlbnRzKHsgU3RhY2tOYW1lOiB0aGlzLnByb3BzLnN0YWNrTmFtZSwgTmV4dFRva2VuOiBuZXh0VG9rZW4gfSk7XG4gICAgICAgIGZvciAoY29uc3QgZXZlbnQgb2YgcGFnZT8uU3RhY2tFdmVudHMgPz8gW10pIHtcbiAgICAgICAgICAvLyBFdmVudCBmcm9tIGJlZm9yZSB3ZSB3ZXJlIGludGVyZXN0ZWQgaW4gJ2VtXG4gICAgICAgICAgaWYgKHRoaXMucHJvcHMuc3RhcnRUaW1lICE9PSB1bmRlZmluZWQgJiYgZXZlbnQuVGltZXN0YW1wIS52YWx1ZU9mKCkgPCB0aGlzLnByb3BzLnN0YXJ0VGltZSkge1xuICAgICAgICAgICAgcmV0dXJuIGV2ZW50cztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBBbHJlYWR5IHNlZW4gdGhpcyBvbmVcbiAgICAgICAgICBpZiAodGhpcy5ldmVudElkcy5oYXMoZXZlbnQuRXZlbnRJZCEpKSB7XG4gICAgICAgICAgICByZXR1cm4gZXZlbnRzO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmV2ZW50SWRzLmFkZChldmVudC5FdmVudElkISk7XG5cbiAgICAgICAgICAvLyBUaGUgZXZlbnRzIGZvciB0aGUgc3RhY2sgaXRzZWxmIGFyZSBhbHNvIGluY2x1ZGVkIG5leHQgdG8gZXZlbnRzIGFib3V0IHJlc291cmNlczsgd2UgY2FuIHRlc3QgZm9yIHRoZW0gaW4gdGhpcyB3YXkuXG4gICAgICAgICAgY29uc3QgaXNQYXJlbnRTdGFja0V2ZW50ID0gZXZlbnQuUGh5c2ljYWxSZXNvdXJjZUlkID09PSBldmVudC5TdGFja0lkO1xuXG4gICAgICAgICAgaWYgKGlzUGFyZW50U3RhY2tFdmVudCAmJiB0aGlzLnByb3BzLnN0YWNrU3RhdHVzZXM/LmluY2x1ZGVzKGV2ZW50LlJlc291cmNlU3RhdHVzID8/ICcnKSkge1xuICAgICAgICAgICAgcmV0dXJuIGV2ZW50cztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBGcmVzaCBldmVudFxuICAgICAgICAgIGNvbnN0IHJlc0V2ZW50OiBSZXNvdXJjZUV2ZW50ID0ge1xuICAgICAgICAgICAgZXZlbnQ6IGV2ZW50LFxuICAgICAgICAgICAgcGFyZW50U3RhY2tMb2dpY2FsSWRzOiB0aGlzLnByb3BzLnBhcmVudFN0YWNrTG9naWNhbElkcyA/PyBbXSxcbiAgICAgICAgICAgIGlzU3RhY2tFdmVudDogaXNQYXJlbnRTdGFja0V2ZW50LFxuICAgICAgICAgIH07XG4gICAgICAgICAgZXZlbnRzLnB1c2gocmVzRXZlbnQpO1xuXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgIWlzUGFyZW50U3RhY2tFdmVudCAmJlxuICAgICAgICAgICAgICBldmVudC5SZXNvdXJjZVR5cGUgPT09ICdBV1M6OkNsb3VkRm9ybWF0aW9uOjpTdGFjaycgJiZcbiAgICAgICAgICAgICAgaXNTdGFja0JlZ2luT3BlcmF0aW9uU3RhdGUoZXZlbnQuUmVzb3VyY2VTdGF0dXMpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICAvLyBJZiB0aGUgZXZlbnQgaXMgbm90IGZvciBgdGhpc2Agc3RhY2sgYW5kIGhhcyBhIHBoeXNpY2FsIHJlc291cmNlIElkLCByZWN1cnNpdmVseSBjYWxsIGZvciBldmVudHMgaW4gdGhlIG5lc3RlZCBzdGFja1xuICAgICAgICAgICAgdGhpcy50cmFja05lc3RlZFN0YWNrKGV2ZW50LCBbLi4uKHRoaXMucHJvcHMucGFyZW50U3RhY2tMb2dpY2FsSWRzID8/IFtdKSwgZXZlbnQuTG9naWNhbFJlc291cmNlSWQgPz8gJyddKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoaXNQYXJlbnRTdGFja0V2ZW50ICYmIGlzU3RhY2tUZXJtaW5hbFN0YXRlKGV2ZW50LlJlc291cmNlU3RhdHVzKSkge1xuICAgICAgICAgICAgdGhpcy5jb21wbGV0ZSA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbmV4dFRva2VuID0gcGFnZT8uTmV4dFRva2VuO1xuICAgICAgICBpZiAobmV4dFRva2VuID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBmaW5pc2hlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIGlmICghKGUubmFtZSA9PT0gJ1ZhbGlkYXRpb25FcnJvcicgJiYgZm9ybWF0RXJyb3JNZXNzYWdlKGUpID09PSBgU3RhY2sgWyR7dGhpcy5wcm9wcy5zdGFja05hbWV9XSBkb2VzIG5vdCBleGlzdGApKSB7XG4gICAgICAgIHRocm93IGU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGV2ZW50cztcbiAgfVxuXG4gIC8qKlxuICAgKiBPbiB0aGUgQ1JFQVRFX0lOX1BST0dSRVNTLCBVUERBVEVfSU5fUFJPR1JFU1MsIERFTEVURV9JTl9QUk9HUkVTUyBldmVudCBvZiBhIG5lc3RlZCBzdGFjaywgcG9sbCB0aGUgbmVzdGVkIHN0YWNrIHVwZGF0ZXNcbiAgICovXG4gIHByaXZhdGUgdHJhY2tOZXN0ZWRTdGFjayhldmVudDogU3RhY2tFdmVudCwgcGFyZW50U3RhY2tMb2dpY2FsSWRzOiBzdHJpbmdbXSkge1xuICAgIGNvbnN0IGxvZ2ljYWxJZCA9IGV2ZW50LkxvZ2ljYWxSZXNvdXJjZUlkO1xuICAgIGNvbnN0IHBoeXNpY2FsUmVzb3VyY2VJZCA9IGV2ZW50LlBoeXNpY2FsUmVzb3VyY2VJZDtcblxuICAgIC8vIFRoZSBDUkVBVEVfSU5fUFJPR1JFU1MgZXZlbnQgZm9yIGEgTmVzdGVkIFN0YWNrIGlzIGVtaXR0ZWQgdHdpY2U7IGZpcnN0IHdpdGhvdXQgYSBQaHlzaWNhbFJlc291cmNlSWRcbiAgICAvLyBhbmQgdGhlbiB3aXRoLiBJZ25vcmUgdGhpcyBldmVudCBpZiB3ZSBkb24ndCBoYXZlIHRoYXQgcHJvcGVydHkgeWV0LlxuICAgIC8vXG4gICAgLy8gKEF0IHRoaXMgcG9pbnQsIEkgYWxzbyBkb24ndCB0cnVzdCB0aGF0IGxvZ2ljYWxJZCBpcyBhbHdheXMgZ29pbmcgdG8gYmUgdGhlcmUgc28gdmFsaWRhdGUgdGhhdCBhcyB3ZWxsKVxuICAgIGlmICghbG9naWNhbElkIHx8ICFwaHlzaWNhbFJlc291cmNlSWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMubmVzdGVkU3RhY2tQb2xsZXJzW2xvZ2ljYWxJZF0pIHtcbiAgICAgIHRoaXMubmVzdGVkU3RhY2tQb2xsZXJzW2xvZ2ljYWxJZF0gPSBuZXcgU3RhY2tFdmVudFBvbGxlcih0aGlzLmNmbiwge1xuICAgICAgICBzdGFja05hbWU6IHBoeXNpY2FsUmVzb3VyY2VJZCxcbiAgICAgICAgcGFyZW50U3RhY2tMb2dpY2FsSWRzOiBwYXJlbnRTdGFja0xvZ2ljYWxJZHMsXG4gICAgICAgIHN0YXJ0VGltZTogZXZlbnQuVGltZXN0YW1wIS52YWx1ZU9mKCksXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNTdGFja0JlZ2luT3BlcmF0aW9uU3RhdGUoc3RhdGU6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICByZXR1cm4gW1xuICAgICdDUkVBVEVfSU5fUFJPR1JFU1MnLFxuICAgICdVUERBVEVfSU5fUFJPR1JFU1MnLFxuICAgICdERUxFVEVfSU5fUFJPR1JFU1MnLFxuICAgICdVUERBVEVfUk9MTEJBQ0tfSU5fUFJPR1JFU1MnLFxuICAgICdST0xMQkFDS19JTl9QUk9HUkVTUycsXG4gIF0uaW5jbHVkZXMoc3RhdGUgPz8gJycpO1xufVxuXG5mdW5jdGlvbiBpc1N0YWNrVGVybWluYWxTdGF0ZShzdGF0ZTogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG4gIHJldHVybiAhKHN0YXRlID8/ICcnKS5lbmRzV2l0aCgnX0lOX1BST0dSRVNTJyk7XG59XG4iXX0=
@@ -0,0 +1,48 @@
1
+ import type { StackEvent } from '@aws-sdk/client-cloudformation';
2
+ import type { StackProgress } from '../../payloads/progress';
3
+ /**
4
+ * Monitors stack progress.s
5
+ */
6
+ export declare class StackProgressMonitor {
7
+ /**
8
+ * Previous completion state observed by logical ID
9
+ *
10
+ * We use this to detect that if we see a DELETE_COMPLETE after a
11
+ * CREATE_COMPLETE, it's actually a rollback and we should DECREASE
12
+ * resourcesDone instead of increase it
13
+ */
14
+ private resourcesPrevCompleteState;
15
+ /**
16
+ * Count of resources that have reported a _COMPLETE status
17
+ */
18
+ private resourcesDone;
19
+ /**
20
+ * How many digits we need to represent the total count (for lining up the status reporting)
21
+ */
22
+ private readonly resourceDigits;
23
+ /**
24
+ * Number of expected resources in the monitor.
25
+ */
26
+ private readonly resourcesTotal?;
27
+ constructor(resourcesTotal?: number);
28
+ /**
29
+ * Report the stack progress
30
+ */
31
+ get progress(): StackProgress;
32
+ /**
33
+ * The total number of progress monitored resources.
34
+ */
35
+ get total(): number | undefined;
36
+ /**
37
+ * The number of completed resources.
38
+ */
39
+ get completed(): number;
40
+ /**
41
+ * Report the current progress as a [34/42] string, or just [34] if the total is unknown
42
+ */
43
+ get formatted(): string;
44
+ /**
45
+ * Process as stack event and update the progress state.
46
+ */
47
+ process(event: StackEvent): void;
48
+ }