aws-cdk 2.1007.0 → 2.1008.0

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 (254) hide show
  1. package/THIRD_PARTY_LICENSES +52 -34
  2. package/build-info.json +2 -2
  3. package/db.json.gz +0 -0
  4. package/lib/api/aws-auth.d.ts +1 -0
  5. package/lib/api/{logs/index.js → aws-auth.js} +2 -3
  6. package/lib/api/bootstrap.d.ts +1 -0
  7. package/lib/api/bootstrap.js +18 -0
  8. package/lib/api/cloud-assembly.d.ts +1 -0
  9. package/lib/api/cloud-assembly.js +18 -0
  10. package/lib/api/cloudformation.d.ts +1 -0
  11. package/lib/api/cloudformation.js +18 -0
  12. package/lib/api/context.d.ts +1 -40
  13. package/lib/api/context.js +16 -80
  14. package/lib/api/deployments.d.ts +1 -0
  15. package/lib/api/deployments.js +18 -0
  16. package/lib/api/environment.d.ts +1 -0
  17. package/lib/api/environment.js +18 -0
  18. package/lib/api/garbage-collection.d.ts +1 -0
  19. package/lib/api/garbage-collection.js +18 -0
  20. package/lib/api/hotswap.d.ts +1 -0
  21. package/lib/api/hotswap.js +18 -0
  22. package/lib/api/index.d.ts +5 -1
  23. package/lib/api/index.js +6 -2
  24. package/lib/api/logs-monitor.d.ts +1 -0
  25. package/lib/api/logs-monitor.js +18 -0
  26. package/lib/api/notices.d.ts +1 -0
  27. package/lib/api/notices.js +18 -0
  28. package/lib/api/plugin.d.ts +1 -0
  29. package/lib/api/{garbage-collection/index.js → plugin.js} +2 -2
  30. package/lib/api/resource-import.d.ts +1 -0
  31. package/lib/api/resource-import.js +18 -0
  32. package/lib/api/rwlock.d.ts +1 -0
  33. package/lib/api/{resource-import/index.js → rwlock.js} +2 -3
  34. package/lib/api/settings.d.ts +1 -26
  35. package/lib/api/settings.js +16 -103
  36. package/lib/api/stack-events.d.ts +1 -0
  37. package/lib/api/stack-events.js +18 -0
  38. package/lib/api/tags.d.ts +1 -9
  39. package/lib/api/tags.js +16 -8
  40. package/lib/api/toolkit-info.d.ts +1 -52
  41. package/lib/api/toolkit-info.js +16 -152
  42. package/lib/api/tree.d.ts +1 -31
  43. package/lib/api/tree.js +16 -35
  44. package/lib/api/work-graph.d.ts +1 -0
  45. package/lib/api/work-graph.js +18 -0
  46. package/lib/api-private.d.ts +3 -0
  47. package/lib/api-private.js +22 -0
  48. package/lib/cli/cdk-toolkit.d.ts +17 -5
  49. package/lib/cli/cdk-toolkit.js +96 -44
  50. package/lib/cli/cli.d.ts +1 -1
  51. package/lib/cli/cli.js +30 -19
  52. package/lib/cli/io-host/cli-io-host.js +2 -2
  53. package/lib/cli/pretty-print-error.js +3 -1
  54. package/lib/cli/util/npm.d.ts +4 -1
  55. package/lib/cli/util/npm.js +25 -13
  56. package/lib/cli/version.d.ts +1 -1
  57. package/lib/cli/version.js +21 -25
  58. package/lib/commands/context.js +3 -2
  59. package/lib/commands/init/init-hooks.js +28 -6
  60. package/lib/commands/init/init.js +3 -2
  61. package/lib/commands/list-stacks.js +4 -4
  62. package/lib/context-providers/ami.d.ts +1 -13
  63. package/lib/context-providers/ami.js +16 -48
  64. package/lib/context-providers/availability-zones.d.ts +1 -13
  65. package/lib/context-providers/availability-zones.js +16 -25
  66. package/lib/context-providers/cc-api-provider.d.ts +1 -30
  67. package/lib/context-providers/cc-api-provider.js +16 -142
  68. package/lib/context-providers/endpoint-service-availability-zones.d.ts +1 -13
  69. package/lib/context-providers/endpoint-service-availability-zones.js +16 -31
  70. package/lib/context-providers/hosted-zones.d.ts +1 -12
  71. package/lib/context-providers/hosted-zones.js +16 -65
  72. package/lib/context-providers/index.d.ts +1 -44
  73. package/lib/context-providers/index.js +15 -126
  74. package/lib/context-providers/keys.d.ts +1 -13
  75. package/lib/context-providers/keys.js +16 -50
  76. package/lib/context-providers/load-balancers.d.ts +1 -20
  77. package/lib/context-providers/load-balancers.js +16 -154
  78. package/lib/context-providers/security-groups.d.ts +1 -9
  79. package/lib/context-providers/security-groups.js +16 -66
  80. package/lib/context-providers/ssm-parameters.d.ts +1 -25
  81. package/lib/context-providers/ssm-parameters.js +16 -57
  82. package/lib/context-providers/vpcs.d.ts +1 -13
  83. package/lib/context-providers/vpcs.js +16 -285
  84. package/lib/cxapp/cloud-assembly.d.ts +79 -0
  85. package/lib/cxapp/cloud-assembly.js +108 -0
  86. package/lib/{api/cxapp → cxapp}/cloud-executable.d.ts +6 -4
  87. package/lib/cxapp/cloud-executable.js +98 -0
  88. package/lib/{api/cxapp → cxapp}/environments.d.ts +1 -2
  89. package/lib/{api/cxapp → cxapp}/environments.js +2 -2
  90. package/lib/cxapp/exec.d.ts +14 -0
  91. package/lib/cxapp/exec.js +157 -0
  92. package/lib/cxapp/index.d.ts +4 -0
  93. package/lib/{api/bootstrap → cxapp}/index.js +5 -3
  94. package/lib/index.js +135349 -124905
  95. package/lib/init-templates/.init-version.json +1 -1
  96. package/lib/init-templates/.recommended-feature-flags.json +3 -2
  97. package/lib/legacy-aws-auth.d.ts +74 -0
  98. package/lib/legacy-aws-auth.js +40 -0
  99. package/lib/legacy-exports-source.d.ts +13 -18
  100. package/lib/legacy-exports-source.js +42 -49
  101. package/lib/legacy-exports.d.ts +3 -6
  102. package/lib/legacy-exports.js +5 -5
  103. package/lib/legacy-types.d.ts +31 -0
  104. package/lib/legacy-types.js +3 -0
  105. package/package.json +12 -11
  106. package/lib/api/aws-auth/account-cache.d.ts +0 -36
  107. package/lib/api/aws-auth/account-cache.js +0 -99
  108. package/lib/api/aws-auth/awscli-compatible.d.ts +0 -42
  109. package/lib/api/aws-auth/awscli-compatible.js +0 -263
  110. package/lib/api/aws-auth/cached.d.ts +0 -11
  111. package/lib/api/aws-auth/cached.js +0 -26
  112. package/lib/api/aws-auth/credential-plugins.d.ts +0 -36
  113. package/lib/api/aws-auth/credential-plugins.js +0 -152
  114. package/lib/api/aws-auth/index.d.ts +0 -3
  115. package/lib/api/aws-auth/index.js +0 -20
  116. package/lib/api/aws-auth/provider-caching.d.ts +0 -13
  117. package/lib/api/aws-auth/provider-caching.js +0 -24
  118. package/lib/api/aws-auth/sdk-logger.d.ts +0 -69
  119. package/lib/api/aws-auth/sdk-logger.js +0 -124
  120. package/lib/api/aws-auth/sdk-provider.d.ts +0 -207
  121. package/lib/api/aws-auth/sdk-provider.js +0 -357
  122. package/lib/api/aws-auth/sdk.d.ts +0 -229
  123. package/lib/api/aws-auth/sdk.js +0 -373
  124. package/lib/api/aws-auth/tracing.d.ts +0 -11
  125. package/lib/api/aws-auth/tracing.js +0 -60
  126. package/lib/api/aws-auth/user-agent.d.ts +0 -7
  127. package/lib/api/aws-auth/user-agent.js +0 -20
  128. package/lib/api/aws-auth/util.d.ts +0 -6
  129. package/lib/api/aws-auth/util.js +0 -23
  130. package/lib/api/bootstrap/bootstrap-environment.d.ts +0 -35
  131. package/lib/api/bootstrap/bootstrap-environment.js +0 -321
  132. package/lib/api/bootstrap/bootstrap-props.d.ts +0 -130
  133. package/lib/api/bootstrap/bootstrap-props.js +0 -14
  134. package/lib/api/bootstrap/deploy-bootstrap.d.ts +0 -39
  135. package/lib/api/bootstrap/deploy-bootstrap.js +0 -141
  136. package/lib/api/bootstrap/index.d.ts +0 -2
  137. package/lib/api/bootstrap/legacy-template.d.ts +0 -2
  138. package/lib/api/bootstrap/legacy-template.js +0 -82
  139. package/lib/api/cloudformation/evaluate-cloudformation-template.d.ts +0 -85
  140. package/lib/api/cloudformation/evaluate-cloudformation-template.js +0 -440
  141. package/lib/api/cloudformation/index.d.ts +0 -4
  142. package/lib/api/cloudformation/index.js +0 -21
  143. package/lib/api/cloudformation/nested-stack-helpers.d.ts +0 -19
  144. package/lib/api/cloudformation/nested-stack-helpers.js +0 -86
  145. package/lib/api/cloudformation/stack-helpers.d.ts +0 -88
  146. package/lib/api/cloudformation/stack-helpers.js +0 -158
  147. package/lib/api/cloudformation/template-body-parameter.d.ts +0 -22
  148. package/lib/api/cloudformation/template-body-parameter.js +0 -104
  149. package/lib/api/cxapp/cloud-assembly.d.ts +0 -137
  150. package/lib/api/cxapp/cloud-assembly.js +0 -305
  151. package/lib/api/cxapp/cloud-executable.js +0 -89
  152. package/lib/api/cxapp/exec.d.ts +0 -57
  153. package/lib/api/cxapp/exec.js +0 -279
  154. package/lib/api/deployments/asset-manifest-builder.d.ts +0 -8
  155. package/lib/api/deployments/asset-manifest-builder.js +0 -35
  156. package/lib/api/deployments/asset-publishing.d.ts +0 -60
  157. package/lib/api/deployments/asset-publishing.js +0 -141
  158. package/lib/api/deployments/assets.d.ts +0 -11
  159. package/lib/api/deployments/assets.js +0 -109
  160. package/lib/api/deployments/cfn-api.d.ts +0 -138
  161. package/lib/api/deployments/cfn-api.js +0 -438
  162. package/lib/api/deployments/checks.d.ts +0 -9
  163. package/lib/api/deployments/checks.js +0 -72
  164. package/lib/api/deployments/deploy-stack.d.ts +0 -155
  165. package/lib/api/deployments/deploy-stack.js +0 -478
  166. package/lib/api/deployments/deployment-method.d.ts +0 -24
  167. package/lib/api/deployments/deployment-method.js +0 -3
  168. package/lib/api/deployments/deployment-result.d.ts +0 -21
  169. package/lib/api/deployments/deployment-result.js +0 -10
  170. package/lib/api/deployments/deployments.d.ts +0 -296
  171. package/lib/api/deployments/deployments.js +0 -331
  172. package/lib/api/deployments/hotswap-deployments.d.ts +0 -17
  173. package/lib/api/deployments/hotswap-deployments.js +0 -441
  174. package/lib/api/deployments/index.d.ts +0 -5
  175. package/lib/api/deployments/index.js +0 -22
  176. package/lib/api/environment/environment-access.d.ts +0 -140
  177. package/lib/api/environment/environment-access.js +0 -202
  178. package/lib/api/environment/environment-resources.d.ts +0 -75
  179. package/lib/api/environment/environment-resources.js +0 -207
  180. package/lib/api/environment/index.d.ts +0 -3
  181. package/lib/api/environment/index.js +0 -20
  182. package/lib/api/environment/placeholders.d.ts +0 -10
  183. package/lib/api/environment/placeholders.js +0 -23
  184. package/lib/api/garbage-collection/garbage-collector.d.ts +0 -158
  185. package/lib/api/garbage-collection/garbage-collector.js +0 -599
  186. package/lib/api/garbage-collection/index.d.ts +0 -1
  187. package/lib/api/garbage-collection/progress-printer.d.ts +0 -23
  188. package/lib/api/garbage-collection/progress-printer.js +0 -70
  189. package/lib/api/garbage-collection/stack-refresh.d.ts +0 -49
  190. package/lib/api/garbage-collection/stack-refresh.js +0 -151
  191. package/lib/api/hotswap/appsync-mapping-templates.d.ts +0 -4
  192. package/lib/api/hotswap/appsync-mapping-templates.js +0 -162
  193. package/lib/api/hotswap/code-build-projects.d.ts +0 -4
  194. package/lib/api/hotswap/code-build-projects.js +0 -62
  195. package/lib/api/hotswap/common.d.ts +0 -89
  196. package/lib/api/hotswap/common.js +0 -128
  197. package/lib/api/hotswap/ecs-services.d.ts +0 -4
  198. package/lib/api/hotswap/ecs-services.js +0 -159
  199. package/lib/api/hotswap/lambda-functions.d.ts +0 -4
  200. package/lib/api/hotswap/lambda-functions.js +0 -297
  201. package/lib/api/hotswap/s3-bucket-deployments.d.ts +0 -5
  202. package/lib/api/hotswap/s3-bucket-deployments.js +0 -117
  203. package/lib/api/hotswap/stepfunctions-state-machines.d.ts +0 -4
  204. package/lib/api/hotswap/stepfunctions-state-machines.js +0 -48
  205. package/lib/api/logs/find-cloudwatch-logs.d.ts +0 -25
  206. package/lib/api/logs/find-cloudwatch-logs.js +0 -95
  207. package/lib/api/logs/index.d.ts +0 -2
  208. package/lib/api/logs/logs-monitor.d.ts +0 -76
  209. package/lib/api/logs/logs-monitor.js +0 -187
  210. package/lib/api/plugin/context-provider-plugin.d.ts +0 -6
  211. package/lib/api/plugin/context-provider-plugin.js +0 -7
  212. package/lib/api/plugin/index.d.ts +0 -3
  213. package/lib/api/plugin/index.js +0 -20
  214. package/lib/api/plugin/mode.d.ts +0 -4
  215. package/lib/api/plugin/mode.js +0 -9
  216. package/lib/api/plugin/plugin.d.ts +0 -63
  217. package/lib/api/plugin/plugin.js +0 -102
  218. package/lib/api/resource-import/importer.d.ts +0 -215
  219. package/lib/api/resource-import/importer.js +0 -322
  220. package/lib/api/resource-import/index.d.ts +0 -2
  221. package/lib/api/resource-import/migrator.d.ts +0 -26
  222. package/lib/api/resource-import/migrator.js +0 -71
  223. package/lib/api/stack-events/index.d.ts +0 -3
  224. package/lib/api/stack-events/index.js +0 -20
  225. package/lib/api/stack-events/stack-activity-monitor.d.ts +0 -100
  226. package/lib/api/stack-events/stack-activity-monitor.js +0 -142
  227. package/lib/api/stack-events/stack-event-poller.d.ts +0 -69
  228. package/lib/api/stack-events/stack-event-poller.js +0 -128
  229. package/lib/api/stack-events/stack-progress-monitor.d.ts +0 -48
  230. package/lib/api/stack-events/stack-progress-monitor.js +0 -94
  231. package/lib/api/stack-events/stack-status.d.ts +0 -42
  232. package/lib/api/stack-events/stack-status.js +0 -88
  233. package/lib/api/util/rwlock.d.ts +0 -65
  234. package/lib/api/util/rwlock.js +0 -179
  235. package/lib/api/work-graph/index.d.ts +0 -3
  236. package/lib/api/work-graph/index.js +0 -20
  237. package/lib/api/work-graph/work-graph-builder.d.ts +0 -34
  238. package/lib/api/work-graph/work-graph-builder.js +0 -168
  239. package/lib/api/work-graph/work-graph-types.d.ts +0 -50
  240. package/lib/api/work-graph/work-graph-types.js +0 -13
  241. package/lib/api/work-graph/work-graph.d.ts +0 -72
  242. package/lib/api/work-graph/work-graph.js +0 -346
  243. package/lib/cli/activity-printer/base.d.ts +0 -50
  244. package/lib/cli/activity-printer/base.js +0 -114
  245. package/lib/cli/activity-printer/current.d.ts +0 -26
  246. package/lib/cli/activity-printer/current.js +0 -118
  247. package/lib/cli/activity-printer/display.d.ts +0 -13
  248. package/lib/cli/activity-printer/display.js +0 -80
  249. package/lib/cli/activity-printer/history.d.ts +0 -32
  250. package/lib/cli/activity-printer/history.js +0 -108
  251. package/lib/cli/activity-printer/index.d.ts +0 -3
  252. package/lib/cli/activity-printer/index.js +0 -20
  253. package/lib/notices.d.ts +0 -203
  254. package/lib/notices.js +0 -411
@@ -1,142 +0,0 @@
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 resource_metadata_1 = require("../../../../@aws-cdk/tmp-toolkit-helpers/src/api/resource-metadata/resource-metadata");
8
- const util_1 = require("../../util");
9
- const stack_progress_monitor_1 = require("./stack-progress-monitor");
10
- const private_1 = require("../../../../@aws-cdk/tmp-toolkit-helpers/src/api/io/private");
11
- class StackActivityMonitor {
12
- constructor({ cfn, ioHelper, stack, stackName, resourcesTotal, changeSetCreationTime, pollingInterval = 2000, }) {
13
- this.errors = [];
14
- this.ioHelper = ioHelper;
15
- this.stack = stack;
16
- this.stackName = stackName;
17
- this.progressMonitor = new stack_progress_monitor_1.StackProgressMonitor(resourcesTotal);
18
- this.pollingInterval = pollingInterval;
19
- this.poller = new stack_event_poller_1.StackEventPoller(cfn, {
20
- stackName,
21
- startTime: changeSetCreationTime?.getTime() ?? Date.now(),
22
- });
23
- }
24
- async start() {
25
- this.monitorId = uuid.v4();
26
- await this.ioHelper.notify(private_1.IO.CDK_TOOLKIT_I5501.msg(`Deploying ${this.stackName}`, {
27
- deployment: this.monitorId,
28
- stack: this.stack,
29
- stackName: this.stackName,
30
- resourcesTotal: this.progressMonitor.total,
31
- }));
32
- this.scheduleNextTick();
33
- return this;
34
- }
35
- async stop() {
36
- const oldMonitorId = this.monitorId;
37
- this.monitorId = undefined;
38
- if (this.tickTimer) {
39
- clearTimeout(this.tickTimer);
40
- }
41
- // Do a final poll for all events. This is to handle the situation where DescribeStackStatus
42
- // already returned an error, but the monitor hasn't seen all the events yet and we'd end
43
- // up not printing the failure reason to users.
44
- await this.finalPollToEnd(oldMonitorId);
45
- await this.ioHelper.notify(private_1.IO.CDK_TOOLKIT_I5503.msg(`Completed ${this.stackName}`, {
46
- deployment: oldMonitorId,
47
- stack: this.stack,
48
- stackName: this.stackName,
49
- resourcesTotal: this.progressMonitor.total,
50
- }));
51
- }
52
- scheduleNextTick() {
53
- if (!this.monitorId) {
54
- return;
55
- }
56
- this.tickTimer = setTimeout(() => void this.tick(), this.pollingInterval);
57
- }
58
- async tick() {
59
- if (!this.monitorId) {
60
- return;
61
- }
62
- try {
63
- this.readPromise = this.readNewEvents(this.monitorId);
64
- await this.readPromise;
65
- this.readPromise = undefined;
66
- // We might have been stop()ped while the network call was in progress.
67
- if (!this.monitorId) {
68
- return;
69
- }
70
- }
71
- catch (e) {
72
- await this.ioHelper.notify(private_1.IO.CDK_TOOLKIT_E5500.msg(util.format('Error occurred while monitoring stack: %s', e), { error: e }));
73
- }
74
- this.scheduleNextTick();
75
- }
76
- findMetadataFor(logicalId) {
77
- const metadata = this.stack.manifest?.metadata;
78
- if (!logicalId || !metadata) {
79
- return undefined;
80
- }
81
- return (0, resource_metadata_1.resourceMetadata)(this.stack, logicalId);
82
- }
83
- /**
84
- * Reads all new events from the stack history
85
- *
86
- * The events are returned in reverse chronological order; we continue to the next page if we
87
- * see a next page and the last event in the page is new to us (and within the time window).
88
- * haven't seen the final event
89
- */
90
- async readNewEvents(monitorId) {
91
- const pollEvents = await this.poller.poll();
92
- for (const resourceEvent of pollEvents) {
93
- this.progressMonitor.process(resourceEvent.event);
94
- const activity = {
95
- deployment: monitorId,
96
- event: resourceEvent.event,
97
- metadata: this.findMetadataFor(resourceEvent.event.LogicalResourceId),
98
- progress: this.progressMonitor.progress,
99
- };
100
- this.checkForErrors(activity);
101
- await this.ioHelper.notify(private_1.IO.CDK_TOOLKIT_I5502.msg(this.formatActivity(activity, true), activity));
102
- }
103
- }
104
- /**
105
- * Perform a final poll to the end and flush out all events to the printer
106
- *
107
- * Finish any poll currently in progress, then do a final one until we've
108
- * reached the last page.
109
- */
110
- async finalPollToEnd(monitorId) {
111
- // If we were doing a poll, finish that first. It was started before
112
- // the moment we were sure we weren't going to get any new events anymore
113
- // so we need to do a new one anyway. Need to wait for this one though
114
- // because our state is single-threaded.
115
- if (this.readPromise) {
116
- await this.readPromise;
117
- }
118
- await this.readNewEvents(monitorId);
119
- }
120
- /**
121
- * Formats a stack activity into a basic string
122
- */
123
- formatActivity(activity, progress) {
124
- const event = activity.event;
125
- const metadata = activity.metadata;
126
- const resourceName = metadata ? metadata.constructPath : event.LogicalResourceId || '';
127
- const logicalId = resourceName !== event.LogicalResourceId ? `(${event.LogicalResourceId}) ` : '';
128
- 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\\_ ')}` : '');
129
- }
130
- checkForErrors(activity) {
131
- if ((0, util_1.stackEventHasErrorMessage)(activity.event.ResourceStatus ?? '')) {
132
- const isCancelled = (activity.event.ResourceStatusReason ?? '').indexOf('cancelled') > -1;
133
- // Cancelled is not an interesting failure reason, nor is the stack message (stack
134
- // message will just say something like "stack failed to update")
135
- if (!isCancelled && activity.event.StackName !== activity.event.LogicalResourceId) {
136
- this.errors.push(activity.event.ResourceStatusReason ?? '');
137
- }
138
- }
139
- }
140
- }
141
- exports.StackActivityMonitor = StackActivityMonitor;
142
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhY2stYWN0aXZpdHktbW9uaXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInN0YWNrLWFjdGl2aXR5LW1vbml0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsNkJBQTZCO0FBRzdCLDZCQUE2QjtBQUM3Qiw2REFBd0Q7QUFDeEQsNEhBQXdIO0FBQ3hILHFDQUF1RDtBQUV2RCxxRUFBZ0U7QUFDaEUseUZBQWdHO0FBdURoRyxNQUFhLG9CQUFvQjtJQWdDL0IsWUFBWSxFQUNWLEdBQUcsRUFDSCxRQUFRLEVBQ1IsS0FBSyxFQUNMLFNBQVMsRUFDVCxjQUFjLEVBQ2QscUJBQXFCLEVBQ3JCLGVBQWUsR0FBRyxJQUFLLEdBQ0c7UUE1QlosV0FBTSxHQUFhLEVBQUUsQ0FBQztRQTZCcEMsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7UUFDekIsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDbkIsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7UUFFM0IsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLDZDQUFvQixDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ2hFLElBQUksQ0FBQyxlQUFlLEdBQUcsZUFBZSxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxxQ0FBZ0IsQ0FBQyxHQUFHLEVBQUU7WUFDdEMsU0FBUztZQUNULFNBQVMsRUFBRSxxQkFBcUIsRUFBRSxPQUFPLEVBQUUsSUFBSSxJQUFJLENBQUMsR0FBRyxFQUFFO1NBQzFELENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTSxLQUFLLENBQUMsS0FBSztRQUNoQixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUMzQixNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLFlBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsYUFBYSxJQUFJLENBQUMsU0FBUyxFQUFFLEVBQUU7WUFDakYs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Q0FBQyxDQUFDLENBQUM7WUFFMUYsa0ZBQWtGO1lBQ2xGLGlFQUFpRTtZQUNqRSxJQUFJLENBQUMsV0FBVyxJQUFJLFFBQVEsQ0FBQyxLQUFLLENBQUMsU0FBUyxLQUFLLFFBQVEsQ0FBQyxLQUFLLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztnQkFDbEYsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxvQkFBb0IsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUM5RCxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7Q0FDRjtBQTFNRCxvREEwTUMiLCJzb3VyY2VzQ29udGVudCI6WyJcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAndXRpbCc7XG5pbXBvcnQgdHlwZSB7IENsb3VkRm9ybWF0aW9uU3RhY2tBcnRpZmFjdCB9IGZyb20gJ0Bhd3MtY2RrL2N4LWFwaSc7XG5pbXBvcnQgdHlwZSB7IFN0YWNrQWN0aXZpdHkgfSBmcm9tICdAYXdzLWNkay90bXAtdG9vbGtpdC1oZWxwZXJzJztcbmltcG9ydCAqIGFzIHV1aWQgZnJvbSAndXVpZCc7XG5pbXBvcnQgeyBTdGFja0V2ZW50UG9sbGVyIH0gZnJvbSAnLi9zdGFjay1ldmVudC1wb2xsZXInO1xuaW1wb3J0IHsgcmVzb3VyY2VNZXRhZGF0YSB9IGZyb20gJy4uLy4uLy4uLy4uL0Bhd3MtY2RrL3RtcC10b29sa2l0LWhlbHBlcnMvc3JjL2FwaS9yZXNvdXJjZS1tZXRhZGF0YS9yZXNvdXJjZS1tZXRhZGF0YSc7XG5pbXBvcnQgeyBzdGFja0V2ZW50SGFzRXJyb3JNZXNzYWdlIH0gZnJvbSAnLi4vLi4vdXRpbCc7XG5pbXBvcnQgdHlwZSB7IElDbG91ZEZvcm1hdGlvbkNsaWVudCB9IGZyb20gJy4uL2F3cy1hdXRoJztcbmltcG9ydCB7IFN0YWNrUHJvZ3Jlc3NNb25pdG9yIH0gZnJvbSAnLi9zdGFjay1wcm9ncmVzcy1tb25pdG9yJztcbmltcG9ydCB7IElPLCB0eXBlIElvSGVscGVyIH0gZnJvbSAnLi4vLi4vLi4vLi4vQGF3cy1jZGsvdG1wLXRvb2xraXQtaGVscGVycy9zcmMvYXBpL2lvL3ByaXZhdGUnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFN0YWNrQWN0aXZpdHlNb25pdG9yUHJvcHMge1xuICAvKipcbiAgICogVGhlIENsb3VkRm9ybWF0aW9uIGNsaWVudFxuICAgKi9cbiAgcmVhZG9ubHkgY2ZuOiBJQ2xvdWRGb3JtYXRpb25DbGllbnQ7XG5cbiAgLyoqXG4gICAqIFRoZSBJb0hlbHBlciB1c2VkIGZvciBtZXNzYWdpbmdcbiAgICovXG4gIHJlYWRvbmx5IGlvSGVscGVyOiBJb0hlbHBlcjtcblxuICAvKipcbiAgICogVGhlIHN0YWNrIGFydGlmYWN0IHRoYXQgaXMgZ2V0dGluZyBkZXBsb3llZFxuICAgKi9cbiAgcmVhZG9ubHkgc3RhY2s6IENsb3VkRm9ybWF0aW9uU3RhY2tBcnRpZmFjdDtcblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIFN0YWNrIHRoYXQgaXMgZ2V0dGluZyBkZXBsb3llZFxuICAgKi9cbiAgcmVhZG9ubHkgc3RhY2tOYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRvdGFsIG51bWJlciBvZiByZXNvdXJjZXMgdG8gdXBkYXRlXG4gICAqXG4gICAqIFVzZWQgdG8gY2FsY3VsYXRlIGEgcHJvZ3Jlc3MgYmFyLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIHByb2dyZXNzIHJlcG9ydGluZy5cbiAgICovXG4gIHJlYWRvbmx5IHJlc291cmNlc1RvdGFsPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBDcmVhdGlvbiB0aW1lIG9mIHRoZSBjaGFuZ2Ugc2V0XG4gICAqXG4gICAqIFRoaXMgd2lsbCBiZSB1c2VkIHRvIGZpbHRlciBldmVudHMsIG9ubHkgc2hvd2luZyB0aG9zZSBmcm9tIGFmdGVyIHRoZSBjaGFuZ2VcbiAgICogc2V0IGNyZWF0aW9uIHRpbWUuXG4gICAqXG4gICAqIEl0IGlzIHJlY29tbWVuZGVkIHRvIHVzZSB0aGlzLCBvdGhlcndpc2UgdGhlIGZpbHRlcmluZyB3aWxsIGJlIHN1YmplY3RcbiAgICogdG8gY2xvY2sgZHJpZnQgYmV0d2VlbiBsb2NhbCBhbmQgY2xvdWQgbWFjaGluZXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbG9jYWwgbWFjaGluZSdzIGN1cnJlbnQgdGltZVxuICAgKi9cbiAgcmVhZG9ubHkgY2hhbmdlU2V0Q3JlYXRpb25UaW1lPzogRGF0ZTtcblxuICAvKipcbiAgICogVGltZSB0byB3YWl0IGJldHdlZW4gZmV0Y2hpbmcgbmV3IGFjdGl2aXRpZXMuXG4gICAqXG4gICAqIE11c3Qgd2FpdCBhIHJlYXNvbmFibGUgYW1vdW50IG9mIHRpbWUgYmV0d2VlbiBwb2xscywgc2luY2Ugd2UgbmVlZCB0byBjb25zaWRlciBDbG91ZEZvcm1hdGlvbiBBUEkgbGltaXRzXG4gICAqXG4gICAqIEBkZWZhdWx0IDJfMDAwXG4gICAqL1xuICByZWFkb25seSBwb2xsaW5nSW50ZXJ2YWw/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBjbGFzcyBTdGFja0FjdGl2aXR5TW9uaXRvciB7XG4gIC8qKlxuICAgKiBUaGUgcG9sbGVyIHVzZWQgdG8gcmVhZCBzdGFjayBldmVudHNcbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgcG9sbGVyOiBTdGFja0V2ZW50UG9sbGVyO1xuXG4gIC8qKlxuICAgKiBGZXRjaCBuZXcgYWN0aXZpdHkgZXZlcnkgMSBzZWNvbmRcbiAgICogUHJpbnRlcnMgY2FuIGRlY2lkZSB0byB1cGRhdGUgYSB2aWV3IGxlc3MgZnJlcXVlbnRseSBpZiBkZXNpcmVkXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHBvbGxpbmdJbnRlcnZhbDogbnVtYmVyO1xuXG4gIHB1YmxpYyByZWFkb25seSBlcnJvcnM6IHN0cmluZ1tdID0gW107XG5cbiAgcHJpdmF0ZSBtb25pdG9ySWQ/OiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBwcm9ncmVzc01vbml0b3I6IFN0YWNrUHJvZ3Jlc3NNb25pdG9yO1xuXG4gIC8qKlxuICAgKiBDdXJyZW50IHRpY2sgdGltZXJcbiAgICovXG4gIHByaXZhdGUgdGlja1RpbWVyPzogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD47XG5cbiAgLyoqXG4gICAqIFNldCB0byB0aGUgYWN0aXZpdHkgb2YgcmVhZGluZyB0aGUgY3VycmVudCBldmVudHNcbiAgICovXG4gIHByaXZhdGUgcmVhZFByb21pc2U/OiBQcm9taXNlPGFueT47XG5cbiAgcHJpdmF0ZSByZWFkb25seSBpb0hlbHBlcjogSW9IZWxwZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgc3RhY2tOYW1lOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgc3RhY2s6IENsb3VkRm9ybWF0aW9uU3RhY2tBcnRpZmFjdDtcblxuICBjb25zdHJ1Y3Rvcih7XG4gICAgY2ZuLFxuICAgIGlvSGVscGVyLFxuICAgIHN0YWNrLFxuICAgIHN0YWNrTmFtZSxcbiAgICByZXNvdXJjZXNUb3RhbCxcbiAgICBjaGFuZ2VTZXRDcmVhdGlvblRpbWUsXG4gICAgcG9sbGluZ0ludGVydmFsID0gMl8wMDAsXG4gIH06IFN0YWNrQWN0aXZpdHlNb25pdG9yUHJvcHMpIHtcbiAgICB0aGlzLmlvSGVscGVyID0gaW9IZWxwZXI7XG4gICAgdGhpcy5zdGFjayA9IHN0YWNrO1xuICAgIHRoaXMuc3RhY2tOYW1lID0gc3RhY2tOYW1lO1xuXG4gICAgdGhpcy5wcm9ncmVzc01vbml0b3IgPSBuZXcgU3RhY2tQcm9ncmVzc01vbml0b3IocmVzb3VyY2VzVG90YWwpO1xuICAgIHRoaXMucG9sbGluZ0ludGVydmFsID0gcG9sbGluZ0ludGVydmFsO1xuICAgIHRoaXMucG9sbGVyID0gbmV3IFN0YWNrRXZlbnRQb2xsZXIoY2ZuLCB7XG4gICAgICBzdGFja05hbWUsXG4gICAgICBzdGFydFRpbWU6IGNoYW5nZVNldENyZWF0aW9uVGltZT8uZ2V0VGltZSgpID8/IERhdGUubm93KCksXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgc3RhcnQoKSB7XG4gICAgdGhpcy5tb25pdG9ySWQgPSB1dWlkLnY0KCk7XG4gICAgYXdhaXQgdGhpcy5pb0hlbHBlci5ub3RpZnkoSU8uQ0RLX1RPT0xLSVRfSTU1MDEubXNnKGBEZXBsb3lpbmcgJHt0aGlzLnN0YWNrTmFtZX1gLCB7XG4gICAgICBkZXBsb3ltZW50OiB0aGlzLm1vbml0b3JJZCxcbiAgICAgIHN0YWNrOiB0aGlzLnN0YWNrLFxuICAgICAgc3RhY2tOYW1lOiB0aGlzLnN0YWNrTmFtZSxcbiAgICAgIHJlc291cmNlc1RvdGFsOiB0aGlzLnByb2dyZXNzTW9uaXRvci50b3RhbCxcbiAgICB9KSk7XG4gICAgdGhpcy5zY2hlZHVsZU5leHRUaWNrKCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgc3RvcCgpIHtcbiAgICBjb25zdCBvbGRNb25pdG9ySWQgPSB0aGlzLm1vbml0b3JJZCE7XG4gICAgdGhpcy5tb25pdG9ySWQgPSB1bmRlZmluZWQ7XG4gICAgaWYgKHRoaXMudGlja1RpbWVyKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy50aWNrVGltZXIpO1xuICAgIH1cblxuICAgIC8vIERvIGEgZmluYWwgcG9sbCBmb3IgYWxsIGV2ZW50cy4gVGhpcyBpcyB0byBoYW5kbGUgdGhlIHNpdHVhdGlvbiB3aGVyZSBEZXNjcmliZVN0YWNrU3RhdHVzXG4gICAgLy8gYWxyZWFkeSByZXR1cm5lZCBhbiBlcnJvciwgYnV0IHRoZSBtb25pdG9yIGhhc24ndCBzZWVuIGFsbCB0aGUgZXZlbnRzIHlldCBhbmQgd2UnZCBlbmRcbiAgICAvLyB1cCBub3QgcHJpbnRpbmcgdGhlIGZhaWx1cmUgcmVhc29uIHRvIHVzZXJzLlxuICAgIGF3YWl0IHRoaXMuZmluYWxQb2xsVG9FbmQob2xkTW9uaXRvcklkKTtcblxuICAgIGF3YWl0IHRoaXMuaW9IZWxwZXIubm90aWZ5KElPLkNES19UT09MS0lUX0k1NTAzLm1zZyhgQ29tcGxldGVkICR7dGhpcy5zdGFja05hbWV9YCwge1xuICAgICAgZGVwbG95bWVudDogb2xkTW9uaXRvcklkLFxuICAgICAgc3RhY2s6IHRoaXMuc3RhY2ssXG4gICAgICBzdGFja05hbWU6IHRoaXMuc3RhY2tOYW1lLFxuICAgICAgcmVzb3VyY2VzVG90YWw6IHRoaXMucHJvZ3Jlc3NNb25pdG9yLnRvdGFsLFxuICAgIH0pKTtcbiAgfVxuXG4gIHByaXZhdGUgc2NoZWR1bGVOZXh0VGljaygpIHtcbiAgICBpZiAoIXRoaXMubW9uaXRvcklkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy50aWNrVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHZvaWQgdGhpcy50aWNrKCksIHRoaXMucG9sbGluZ0ludGVydmFsKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgdGljaygpIHtcbiAgICBpZiAoIXRoaXMubW9uaXRvcklkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIHRoaXMucmVhZFByb21pc2UgPSB0aGlzLnJlYWROZXdFdmVudHModGhpcy5tb25pdG9ySWQpO1xuICAgICAgYXdhaXQgdGhpcy5yZWFkUHJvbWlzZTtcbiAgICAgIHRoaXMucmVhZFByb21pc2UgPSB1bmRlZmluZWQ7XG5cbiAgICAgIC8vIFdlIG1pZ2h0IGhhdmUgYmVlbiBzdG9wKClwZWQgd2hpbGUgdGhlIG5ldHdvcmsgY2FsbCB3YXMgaW4gcHJvZ3Jlc3MuXG4gICAgICBpZiAoIXRoaXMubW9uaXRvcklkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBhd2FpdCB0aGlzLmlvSGVscGVyLm5vdGlmeShJTy5DREtfVE9PTEtJVF9FNTUwMC5tc2coXG4gICAgICAgIHV0aWwuZm9ybWF0KCdFcnJvciBvY2N1cnJlZCB3aGlsZSBtb25pdG9yaW5nIHN0YWNrOiAlcycsIGUpLFxuICAgICAgICB7IGVycm9yOiBlIGFzIGFueSB9LFxuICAgICAgKSk7XG4gICAgfVxuICAgIHRoaXMuc2NoZWR1bGVOZXh0VGljaygpO1xuICB9XG5cbiAgcHJpdmF0ZSBmaW5kTWV0YWRhdGFGb3IobG9naWNhbElkOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBtZXRhZGF0YSA9IHRoaXMuc3RhY2subWFuaWZlc3Q/Lm1ldGFkYXRhO1xuICAgIGlmICghbG9naWNhbElkIHx8ICFtZXRhZGF0YSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIHJlc291cmNlTWV0YWRhdGEodGhpcy5zdGFjaywgbG9naWNhbElkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkcyBhbGwgbmV3IGV2ZW50cyBmcm9tIHRoZSBzdGFjayBoaXN0b3J5XG4gICAqXG4gICAqIFRoZSBldmVudHMgYXJlIHJldHVybmVkIGluIHJldmVyc2UgY2hyb25vbG9naWNhbCBvcmRlcjsgd2UgY29udGludWUgdG8gdGhlIG5leHQgcGFnZSBpZiB3ZVxuICAgKiBzZWUgYSBuZXh0IHBhZ2UgYW5kIHRoZSBsYXN0IGV2ZW50IGluIHRoZSBwYWdlIGlzIG5ldyB0byB1cyAoYW5kIHdpdGhpbiB0aGUgdGltZSB3aW5kb3cpLlxuICAgKiBoYXZlbid0IHNlZW4gdGhlIGZpbmFsIGV2ZW50XG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJlYWROZXdFdmVudHMobW9uaXRvcklkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwb2xsRXZlbnRzID0gYXdhaXQgdGhpcy5wb2xsZXIucG9sbCgpO1xuXG4gICAgZm9yIChjb25zdCByZXNvdXJjZUV2ZW50IG9mIHBvbGxFdmVudHMpIHtcbiAgICAgIHRoaXMucHJvZ3Jlc3NNb25pdG9yLnByb2Nlc3MocmVzb3VyY2VFdmVudC5ldmVudCk7XG5cbiAgICAgIGNvbnN0IGFjdGl2aXR5OiBTdGFja0FjdGl2aXR5ID0ge1xuICAgICAgICBkZXBsb3ltZW50OiBtb25pdG9ySWQsXG4gICAgICAgIGV2ZW50OiByZXNvdXJjZUV2ZW50LmV2ZW50LFxuICAgICAgICBtZXRhZGF0YTogdGhpcy5maW5kTWV0YWRhdGFGb3IocmVzb3VyY2VFdmVudC5ldmVudC5Mb2dpY2FsUmVzb3VyY2VJZCksXG4gICAgICAgIHByb2dyZXNzOiB0aGlzLnByb2dyZXNzTW9uaXRvci5wcm9ncmVzcyxcbiAgICAgIH07XG5cbiAgICAgIHRoaXMuY2hlY2tGb3JFcnJvcnMoYWN0aXZpdHkpO1xuICAgICAgYXdhaXQgdGhpcy5pb0hlbHBlci5ub3RpZnkoSU8uQ0RLX1RPT0xLSVRfSTU1MDIubXNnKHRoaXMuZm9ybWF0QWN0aXZpdHkoYWN0aXZpdHksIHRydWUpLCBhY3Rpdml0eSkpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJmb3JtIGEgZmluYWwgcG9sbCB0byB0aGUgZW5kIGFuZCBmbHVzaCBvdXQgYWxsIGV2ZW50cyB0byB0aGUgcHJpbnRlclxuICAgKlxuICAgKiBGaW5pc2ggYW55IHBvbGwgY3VycmVudGx5IGluIHByb2dyZXNzLCB0aGVuIGRvIGEgZmluYWwgb25lIHVudGlsIHdlJ3ZlXG4gICAqIHJlYWNoZWQgdGhlIGxhc3QgcGFnZS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZmluYWxQb2xsVG9FbmQobW9uaXRvcklkOiBzdHJpbmcpIHtcbiAgICAvLyBJZiB3ZSB3ZXJlIGRvaW5nIGEgcG9sbCwgZmluaXNoIHRoYXQgZmlyc3QuIEl0IHdhcyBzdGFydGVkIGJlZm9yZVxuICAgIC8vIHRoZSBtb21lbnQgd2Ugd2VyZSBzdXJlIHdlIHdlcmVuJ3QgZ29pbmcgdG8gZ2V0IGFueSBuZXcgZXZlbnRzIGFueW1vcmVcbiAgICAvLyBzbyB3ZSBuZWVkIHRvIGRvIGEgbmV3IG9uZSBhbnl3YXkuIE5lZWQgdG8gd2FpdCBmb3IgdGhpcyBvbmUgdGhvdWdoXG4gICAgLy8gYmVjYXVzZSBvdXIgc3RhdGUgaXMgc2luZ2xlLXRocmVhZGVkLlxuICAgIGlmICh0aGlzLnJlYWRQcm9taXNlKSB7XG4gICAgICBhd2FpdCB0aGlzLnJlYWRQcm9taXNlO1xuICAgIH1cblxuICAgIGF3YWl0IHRoaXMucmVhZE5ld0V2ZW50cyhtb25pdG9ySWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvcm1hdHMgYSBzdGFjayBhY3Rpdml0eSBpbnRvIGEgYmFzaWMgc3RyaW5nXG4gICAqL1xuICBwcml2YXRlIGZvcm1hdEFjdGl2aXR5KGFjdGl2aXR5OiBTdGFja0FjdGl2aXR5LCBwcm9ncmVzczogYm9vbGVhbik6IHN0cmluZyB7XG4gICAgY29uc3QgZXZlbnQgPSBhY3Rpdml0eS5ldmVudDtcbiAgICBjb25zdCBtZXRhZGF0YSA9IGFjdGl2aXR5Lm1ldGFkYXRhO1xuXG4gICAgY29uc3QgcmVzb3VyY2VOYW1lID0gbWV0YWRhdGEgPyBtZXRhZGF0YS5jb25zdHJ1Y3RQYXRoIDogZXZlbnQuTG9naWNhbFJlc291cmNlSWQgfHwgJyc7XG4gICAgY29uc3QgbG9naWNhbElkID0gcmVzb3VyY2VOYW1lICE9PSBldmVudC5Mb2dpY2FsUmVzb3VyY2VJZCA/IGAoJHtldmVudC5Mb2dpY2FsUmVzb3VyY2VJZH0pIGAgOiAnJztcblxuICAgIHJldHVybiB1dGlsLmZvcm1hdChcbiAgICAgICclcyB8ICVzJXMgfCAlcyB8ICVzIHwgJXMgJXMlcyVzJyxcbiAgICAgIGV2ZW50LlN0YWNrTmFtZSxcbiAgICAgIHByb2dyZXNzICE9PSBmYWxzZSA/IGAke2FjdGl2aXR5LnByb2dyZXNzLmZvcm1hdHRlZH0gfCBgIDogJycsXG4gICAgICBuZXcgRGF0ZShldmVudC5UaW1lc3RhbXAhKS50b0xvY2FsZVRpbWVTdHJpbmcoKSxcbiAgICAgIGV2ZW50LlJlc291cmNlU3RhdHVzIHx8ICcnLFxuICAgICAgZXZlbnQuUmVzb3VyY2VUeXBlLFxuICAgICAgcmVzb3VyY2VOYW1lLFxuICAgICAgbG9naWNhbElkLFxuICAgICAgZXZlbnQuUmVzb3VyY2VTdGF0dXNSZWFzb24gPyBldmVudC5SZXNvdXJjZVN0YXR1c1JlYXNvbiA6ICcnLFxuICAgICAgbWV0YWRhdGE/LmVudHJ5LnRyYWNlID8gYFxcblxcdCR7bWV0YWRhdGEuZW50cnkudHJhY2Uuam9pbignXFxuXFx0XFxcXF8gJyl9YCA6ICcnLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGNoZWNrRm9yRXJyb3JzKGFjdGl2aXR5OiBTdGFja0FjdGl2aXR5KSB7XG4gICAgaWYgKHN0YWNrRXZlbnRIYXNFcnJvck1lc3NhZ2UoYWN0aXZpdHkuZXZlbnQuUmVzb3VyY2VTdGF0dXMgPz8gJycpKSB7XG4gICAgICBjb25zdCBpc0NhbmNlbGxlZCA9IChhY3Rpdml0eS5ldmVudC5SZXNvdXJjZVN0YXR1c1JlYXNvbiA/PyAnJykuaW5kZXhPZignY2FuY2VsbGVkJykgPiAtMTtcblxuICAgICAgLy8gQ2FuY2VsbGVkIGlzIG5vdCBhbiBpbnRlcmVzdGluZyBmYWlsdXJlIHJlYXNvbiwgbm9yIGlzIHRoZSBzdGFjayBtZXNzYWdlIChzdGFja1xuICAgICAgLy8gbWVzc2FnZSB3aWxsIGp1c3Qgc2F5IHNvbWV0aGluZyBsaWtlIFwic3RhY2sgZmFpbGVkIHRvIHVwZGF0ZVwiKVxuICAgICAgaWYgKCFpc0NhbmNlbGxlZCAmJiBhY3Rpdml0eS5ldmVudC5TdGFja05hbWUgIT09IGFjdGl2aXR5LmV2ZW50LkxvZ2ljYWxSZXNvdXJjZUlkKSB7XG4gICAgICAgIHRoaXMuZXJyb3JzLnB1c2goYWN0aXZpdHkuZXZlbnQuUmVzb3VyY2VTdGF0dXNSZWFzb24gPz8gJycpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIl19
@@ -1,69 +0,0 @@
1
- import type { StackEvent } from '@aws-sdk/client-cloudformation';
2
- import type { ICloudFormationClient } from '../aws-auth';
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
- }
@@ -1,128 +0,0 @@
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
- constructor(cfn, props) {
7
- this.cfn = cfn;
8
- this.props = props;
9
- this.events = [];
10
- this.complete = false;
11
- this.eventIds = new Set();
12
- this.nestedStackPollers = {};
13
- }
14
- /**
15
- * From all accumulated events, return only the errors
16
- */
17
- get resourceErrors() {
18
- return this.events.filter((e) => e.event.ResourceStatus?.endsWith('_FAILED') && !e.isStackEvent);
19
- }
20
- /**
21
- * Poll for new stack events
22
- *
23
- * Will not return events older than events indicated by the constructor filters.
24
- *
25
- * Recurses into nested stacks, and returns events old-to-new.
26
- */
27
- async poll() {
28
- const events = await this.doPoll();
29
- // Also poll all nested stacks we're currently tracking
30
- for (const [logicalId, poller] of Object.entries(this.nestedStackPollers)) {
31
- events.push(...(await poller.poll()));
32
- if (poller.complete) {
33
- delete this.nestedStackPollers[logicalId];
34
- }
35
- }
36
- // Return what we have so far
37
- events.sort((a, b) => a.event.Timestamp.valueOf() - b.event.Timestamp.valueOf());
38
- this.events.push(...events);
39
- return events;
40
- }
41
- async doPoll() {
42
- const events = [];
43
- try {
44
- let nextToken;
45
- let finished = false;
46
- while (!finished) {
47
- const page = await this.cfn.describeStackEvents({ StackName: this.props.stackName, NextToken: nextToken });
48
- for (const event of page?.StackEvents ?? []) {
49
- // Event from before we were interested in 'em
50
- if (this.props.startTime !== undefined && event.Timestamp.valueOf() < this.props.startTime) {
51
- return events;
52
- }
53
- // Already seen this one
54
- if (this.eventIds.has(event.EventId)) {
55
- return events;
56
- }
57
- this.eventIds.add(event.EventId);
58
- // The events for the stack itself are also included next to events about resources; we can test for them in this way.
59
- const isParentStackEvent = event.PhysicalResourceId === event.StackId;
60
- if (isParentStackEvent && this.props.stackStatuses?.includes(event.ResourceStatus ?? '')) {
61
- return events;
62
- }
63
- // Fresh event
64
- const resEvent = {
65
- event: event,
66
- parentStackLogicalIds: this.props.parentStackLogicalIds ?? [],
67
- isStackEvent: isParentStackEvent,
68
- };
69
- events.push(resEvent);
70
- if (!isParentStackEvent &&
71
- event.ResourceType === 'AWS::CloudFormation::Stack' &&
72
- isStackBeginOperationState(event.ResourceStatus)) {
73
- // If the event is not for `this` stack and has a physical resource Id, recursively call for events in the nested stack
74
- this.trackNestedStack(event, [...(this.props.parentStackLogicalIds ?? []), event.LogicalResourceId ?? '']);
75
- }
76
- if (isParentStackEvent && isStackTerminalState(event.ResourceStatus)) {
77
- this.complete = true;
78
- }
79
- }
80
- nextToken = page?.NextToken;
81
- if (nextToken === undefined) {
82
- finished = true;
83
- }
84
- }
85
- }
86
- catch (e) {
87
- if (!(e.name === 'ValidationError' && (0, util_1.formatErrorMessage)(e) === `Stack [${this.props.stackName}] does not exist`)) {
88
- throw e;
89
- }
90
- }
91
- return events;
92
- }
93
- /**
94
- * On the CREATE_IN_PROGRESS, UPDATE_IN_PROGRESS, DELETE_IN_PROGRESS event of a nested stack, poll the nested stack updates
95
- */
96
- trackNestedStack(event, parentStackLogicalIds) {
97
- const logicalId = event.LogicalResourceId;
98
- const physicalResourceId = event.PhysicalResourceId;
99
- // The CREATE_IN_PROGRESS event for a Nested Stack is emitted twice; first without a PhysicalResourceId
100
- // and then with. Ignore this event if we don't have that property yet.
101
- //
102
- // (At this point, I also don't trust that logicalId is always going to be there so validate that as well)
103
- if (!logicalId || !physicalResourceId) {
104
- return;
105
- }
106
- if (!this.nestedStackPollers[logicalId]) {
107
- this.nestedStackPollers[logicalId] = new StackEventPoller(this.cfn, {
108
- stackName: physicalResourceId,
109
- parentStackLogicalIds: parentStackLogicalIds,
110
- startTime: event.Timestamp.valueOf(),
111
- });
112
- }
113
- }
114
- }
115
- exports.StackEventPoller = StackEventPoller;
116
- function isStackBeginOperationState(state) {
117
- return [
118
- 'CREATE_IN_PROGRESS',
119
- 'UPDATE_IN_PROGRESS',
120
- 'DELETE_IN_PROGRESS',
121
- 'UPDATE_ROLLBACK_IN_PROGRESS',
122
- 'ROLLBACK_IN_PROGRESS',
123
- ].includes(state ?? '');
124
- }
125
- function isStackTerminalState(state) {
126
- return !(state ?? '').endsWith('_IN_PROGRESS');
127
- }
128
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhY2stZXZlbnQtcG9sbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsic3RhY2stZXZlbnQtcG9sbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLHFDQUFnRDtBQW1EaEQsTUFBYSxnQkFBZ0I7SUFPM0IsWUFDbUIsR0FBMEIsRUFDMUIsS0FBNEI7UUFENUIsUUFBRyxHQUFILEdBQUcsQ0FBdUI7UUFDMUIsVUFBSyxHQUFMLEtBQUssQ0FBdUI7UUFSL0IsV0FBTSxHQUFvQixFQUFFLENBQUM7UUFDdEMsYUFBUSxHQUFZLEtBQUssQ0FBQztRQUVoQixhQUFRLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztRQUM3Qix1QkFBa0IsR0FBcUMsRUFBRSxDQUFDO0lBTTNFLENBQUM7SUFFRDs7T0FFRztJQUNILElBQVcsY0FBYztRQUN2QixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLGNBQWMsRUFBRSxRQUFRLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDbkcsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLEtBQUssQ0FBQyxJQUFJO1FBQ2YsTUFBTSxNQUFNLEdBQW9CLE1BQU0sSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBRXBELHVEQUF1RDtRQUN2RCxLQUFLLE1BQU0sQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsRUFBRSxDQUFDO1lBQzFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztZQUN0QyxJQUFJLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDcEIsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUMsU0FB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QUVELFNBQVMsMEJBQTBCLENBQUMsS0FBeUI7SUFDM0QsT0FBTztRQUNMLG9CQUFvQjtRQUNwQixvQkFBb0I7UUFDcEIsb0JBQW9CO1FBQ3BCLDZCQUE2QjtRQUM3QixzQkFBc0I7S0FDdkIsQ0FBQyxRQUFRLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0FBQzFCLENBQUM7QUFFRCxTQUFTLG9CQUFvQixDQUFDLEtBQXlCO0lBQ3JELE9BQU8sQ0FBQyxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLENBQUM7QUFDakQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgU3RhY2tFdmVudCB9IGZyb20gJ0Bhd3Mtc2RrL2NsaWVudC1jbG91ZGZvcm1hdGlvbic7XG5pbXBvcnQgeyBmb3JtYXRFcnJvck1lc3NhZ2UgfSBmcm9tICcuLi8uLi91dGlsJztcbmltcG9ydCB0eXBlIHsgSUNsb3VkRm9ybWF0aW9uQ2xpZW50IH0gZnJvbSAnLi4vYXdzLWF1dGgnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFN0YWNrRXZlbnRQb2xsZXJQcm9wcyB7XG4gIC8qKlxuICAgKiBUaGUgc3RhY2sgdG8gcG9sbFxuICAgKi9cbiAgcmVhZG9ubHkgc3RhY2tOYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIElEcyBvZiBwYXJlbnQgc3RhY2tzIG9mIHRoaXMgcmVzb3VyY2UsIGluIGNhc2Ugb2YgcmVzb3VyY2VzIGluIG5lc3RlZCBzdGFja3NcbiAgICovXG4gIHJlYWRvbmx5IHBhcmVudFN0YWNrTG9naWNhbElkcz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBUaW1lc3RhbXAgZm9yIHRoZSBvbGRlc3QgZXZlbnQgd2UncmUgaW50ZXJlc3RlZCBpblxuICAgKlxuICAgKiBAZGVmYXVsdCAtIFJlYWQgYWxsIGV2ZW50c1xuICAgKi9cbiAgcmVhZG9ubHkgc3RhcnRUaW1lPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBTdG9wIHJlYWRpbmcgd2hlbiB3ZSBzZWUgdGhlIHN0YWNrIGVudGVyaW5nIHRoaXMgc3RhdHVzXG4gICAqXG4gICAqIFNob3VsZCBiZSBzb21ldGhpbmcgbGlrZSBgQ1JFQVRFX0lOX1BST0dSRVNTYCwgYFVQREFURV9JTl9QUk9HUkVTU2AsXG4gICAqIGBERUxFVEVfSU5fUFJPR1JFU1MsIGBST0xMQkFDS19JTl9QUk9HUkVTU2AuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gUmVhZCBhbGwgZXZlbnRzXG4gICAqL1xuICByZWFkb25seSBzdGFja1N0YXR1c2VzPzogc3RyaW5nW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb3VyY2VFdmVudCB7XG4gIC8qKlxuICAgKiBUaGUgU3RhY2sgRXZlbnQgYXMgcmVjZWl2ZWQgZnJvbSBDbG91ZEZvcm1hdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgZXZlbnQ6IFN0YWNrRXZlbnQ7XG5cbiAgLyoqXG4gICAqIElEcyBvZiBwYXJlbnQgc3RhY2tzIG9mIHRoZSByZXNvdXJjZSwgaW4gY2FzZSBvZiByZXNvdXJjZXMgaW4gbmVzdGVkIHN0YWNrc1xuICAgKi9cbiAgcmVhZG9ubHkgcGFyZW50U3RhY2tMb2dpY2FsSWRzOiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogV2hldGhlciB0aGlzIGV2ZW50IHJlZ2FyZHMgdGhlIHJvb3Qgc3RhY2tcbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGlzU3RhY2tFdmVudD86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjbGFzcyBTdGFja0V2ZW50UG9sbGVyIHtcbiAgcHVibGljIHJlYWRvbmx5IGV2ZW50czogUmVzb3VyY2VFdmVudFtdID0gW107XG4gIHB1YmxpYyBjb21wbGV0ZTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgZXZlbnRJZHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBuZXN0ZWRTdGFja1BvbGxlcnM6IFJlY29yZDxzdHJpbmcsIFN0YWNrRXZlbnRQb2xsZXI+ID0ge307XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBjZm46IElDbG91ZEZvcm1hdGlvbkNsaWVudCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHByb3BzOiBTdGFja0V2ZW50UG9sbGVyUHJvcHMsXG4gICkge1xuICB9XG5cbiAgLyoqXG4gICAqIEZyb20gYWxsIGFjY3VtdWxhdGVkIGV2ZW50cywgcmV0dXJuIG9ubHkgdGhlIGVycm9yc1xuICAgKi9cbiAgcHVibGljIGdldCByZXNvdXJjZUVycm9ycygpOiBSZXNvdXJjZUV2ZW50W10ge1xuICAgIHJldHVybiB0aGlzLmV2ZW50cy5maWx0ZXIoKGUpID0+IGUuZXZlbnQuUmVzb3VyY2VTdGF0dXM/LmVuZHNXaXRoKCdfRkFJTEVEJykgJiYgIWUuaXNTdGFja0V2ZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQb2xsIGZvciBuZXcgc3RhY2sgZXZlbnRzXG4gICAqXG4gICAqIFdpbGwgbm90IHJldHVybiBldmVudHMgb2xkZXIgdGhhbiBldmVudHMgaW5kaWNhdGVkIGJ5IHRoZSBjb25zdHJ1Y3RvciBmaWx0ZXJzLlxuICAgKlxuICAgKiBSZWN1cnNlcyBpbnRvIG5lc3RlZCBzdGFja3MsIGFuZCByZXR1cm5zIGV2ZW50cyBvbGQtdG8tbmV3LlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHBvbGwoKTogUHJvbWlzZTxSZXNvdXJjZUV2ZW50W10+IHtcbiAgICBjb25zdCBldmVudHM6IFJlc291cmNlRXZlbnRbXSA9IGF3YWl0IHRoaXMuZG9Qb2xsKCk7XG5cbiAgICAvLyBBbHNvIHBvbGwgYWxsIG5lc3RlZCBzdGFja3Mgd2UncmUgY3VycmVudGx5IHRyYWNraW5nXG4gICAgZm9yIChjb25zdCBbbG9naWNhbElkLCBwb2xsZXJdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMubmVzdGVkU3RhY2tQb2xsZXJzKSkge1xuICAgICAgZXZlbnRzLnB1c2goLi4uKGF3YWl0IHBvbGxlci5wb2xsKCkpKTtcbiAgICAgIGlmIChwb2xsZXIuY29tcGxldGUpIHtcbiAgICAgICAgZGVsZXRlIHRoaXMubmVzdGVkU3RhY2tQb2xsZXJzW2xvZ2ljYWxJZF07XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIHdoYXQgd2UgaGF2ZSBzbyBmYXJcbiAgICBldmVudHMuc29ydCgoYSwgYikgPT4gYS5ldmVudC5UaW1lc3RhbXAhLnZhbHVlT2YoKSAtIGIuZXZlbnQuVGltZXN0YW1wIS52YWx1ZU9mKCkpO1xuICAgIHRoaXMuZXZlbnRzLnB1c2goLi4uZXZlbnRzKTtcbiAgICByZXR1cm4gZXZlbnRzO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBkb1BvbGwoKTogUHJvbWlzZTxSZXNvdXJjZUV2ZW50W10+IHtcbiAgICBjb25zdCBldmVudHM6IFJlc291cmNlRXZlbnRbXSA9IFtdO1xuICAgIHRyeSB7XG4gICAgICBsZXQgbmV4dFRva2VuOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICBsZXQgZmluaXNoZWQgPSBmYWxzZTtcblxuICAgICAgd2hpbGUgKCFmaW5pc2hlZCkge1xuICAgICAgICBjb25zdCBwYWdlID0gYXdhaXQgdGhpcy5jZm4uZGVzY3JpYmVTdGFja0V2ZW50cyh7IFN0YWNrTmFtZTogdGhpcy5wcm9wcy5zdGFja05hbWUsIE5leHRUb2tlbjogbmV4dFRva2VuIH0pO1xuICAgICAgICBmb3IgKGNvbnN0IGV2ZW50IG9mIHBhZ2U/LlN0YWNrRXZlbnRzID8/IFtdKSB7XG4gICAgICAgICAgLy8gRXZlbnQgZnJvbSBiZWZvcmUgd2Ugd2VyZSBpbnRlcmVzdGVkIGluICdlbVxuICAgICAgICAgIGlmICh0aGlzLnByb3BzLnN0YXJ0VGltZSAhPT0gdW5kZWZpbmVkICYmIGV2ZW50LlRpbWVzdGFtcCEudmFsdWVPZigpIDwgdGhpcy5wcm9wcy5zdGFydFRpbWUpIHtcbiAgICAgICAgICAgIHJldHVybiBldmVudHM7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gQWxyZWFkeSBzZWVuIHRoaXMgb25lXG4gICAgICAgICAgaWYgKHRoaXMuZXZlbnRJZHMuaGFzKGV2ZW50LkV2ZW50SWQhKSkge1xuICAgICAgICAgICAgcmV0dXJuIGV2ZW50cztcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5ldmVudElkcy5hZGQoZXZlbnQuRXZlbnRJZCEpO1xuXG4gICAgICAgICAgLy8gVGhlIGV2ZW50cyBmb3IgdGhlIHN0YWNrIGl0c2VsZiBhcmUgYWxzbyBpbmNsdWRlZCBuZXh0IHRvIGV2ZW50cyBhYm91dCByZXNvdXJjZXM7IHdlIGNhbiB0ZXN0IGZvciB0aGVtIGluIHRoaXMgd2F5LlxuICAgICAgICAgIGNvbnN0IGlzUGFyZW50U3RhY2tFdmVudCA9IGV2ZW50LlBoeXNpY2FsUmVzb3VyY2VJZCA9PT0gZXZlbnQuU3RhY2tJZDtcblxuICAgICAgICAgIGlmIChpc1BhcmVudFN0YWNrRXZlbnQgJiYgdGhpcy5wcm9wcy5zdGFja1N0YXR1c2VzPy5pbmNsdWRlcyhldmVudC5SZXNvdXJjZVN0YXR1cyA/PyAnJykpIHtcbiAgICAgICAgICAgIHJldHVybiBldmVudHM7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gRnJlc2ggZXZlbnRcbiAgICAgICAgICBjb25zdCByZXNFdmVudDogUmVzb3VyY2VFdmVudCA9IHtcbiAgICAgICAgICAgIGV2ZW50OiBldmVudCxcbiAgICAgICAgICAgIHBhcmVudFN0YWNrTG9naWNhbElkczogdGhpcy5wcm9wcy5wYXJlbnRTdGFja0xvZ2ljYWxJZHMgPz8gW10sXG4gICAgICAgICAgICBpc1N0YWNrRXZlbnQ6IGlzUGFyZW50U3RhY2tFdmVudCxcbiAgICAgICAgICB9O1xuICAgICAgICAgIGV2ZW50cy5wdXNoKHJlc0V2ZW50KTtcblxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICFpc1BhcmVudFN0YWNrRXZlbnQgJiZcbiAgICAgICAgICAgICAgZXZlbnQuUmVzb3VyY2VUeXBlID09PSAnQVdTOjpDbG91ZEZvcm1hdGlvbjo6U3RhY2snICYmXG4gICAgICAgICAgICAgIGlzU3RhY2tCZWdpbk9wZXJhdGlvblN0YXRlKGV2ZW50LlJlc291cmNlU3RhdHVzKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgLy8gSWYgdGhlIGV2ZW50IGlzIG5vdCBmb3IgYHRoaXNgIHN0YWNrIGFuZCBoYXMgYSBwaHlzaWNhbCByZXNvdXJjZSBJZCwgcmVjdXJzaXZlbHkgY2FsbCBmb3IgZXZlbnRzIGluIHRoZSBuZXN0ZWQgc3RhY2tcbiAgICAgICAgICAgIHRoaXMudHJhY2tOZXN0ZWRTdGFjayhldmVudCwgWy4uLih0aGlzLnByb3BzLnBhcmVudFN0YWNrTG9naWNhbElkcyA/PyBbXSksIGV2ZW50LkxvZ2ljYWxSZXNvdXJjZUlkID8/ICcnXSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGlzUGFyZW50U3RhY2tFdmVudCAmJiBpc1N0YWNrVGVybWluYWxTdGF0ZShldmVudC5SZXNvdXJjZVN0YXR1cykpIHtcbiAgICAgICAgICAgIHRoaXMuY29tcGxldGUgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIG5leHRUb2tlbiA9IHBhZ2U/Lk5leHRUb2tlbjtcbiAgICAgICAgaWYgKG5leHRUb2tlbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgZmluaXNoZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICBpZiAoIShlLm5hbWUgPT09ICdWYWxpZGF0aW9uRXJyb3InICYmIGZvcm1hdEVycm9yTWVzc2FnZShlKSA9PT0gYFN0YWNrIFske3RoaXMucHJvcHMuc3RhY2tOYW1lfV0gZG9lcyBub3QgZXhpc3RgKSkge1xuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBldmVudHM7XG4gIH1cblxuICAvKipcbiAgICogT24gdGhlIENSRUFURV9JTl9QUk9HUkVTUywgVVBEQVRFX0lOX1BST0dSRVNTLCBERUxFVEVfSU5fUFJPR1JFU1MgZXZlbnQgb2YgYSBuZXN0ZWQgc3RhY2ssIHBvbGwgdGhlIG5lc3RlZCBzdGFjayB1cGRhdGVzXG4gICAqL1xuICBwcml2YXRlIHRyYWNrTmVzdGVkU3RhY2soZXZlbnQ6IFN0YWNrRXZlbnQsIHBhcmVudFN0YWNrTG9naWNhbElkczogc3RyaW5nW10pIHtcbiAgICBjb25zdCBsb2dpY2FsSWQgPSBldmVudC5Mb2dpY2FsUmVzb3VyY2VJZDtcbiAgICBjb25zdCBwaHlzaWNhbFJlc291cmNlSWQgPSBldmVudC5QaHlzaWNhbFJlc291cmNlSWQ7XG5cbiAgICAvLyBUaGUgQ1JFQVRFX0lOX1BST0dSRVNTIGV2ZW50IGZvciBhIE5lc3RlZCBTdGFjayBpcyBlbWl0dGVkIHR3aWNlOyBmaXJzdCB3aXRob3V0IGEgUGh5c2ljYWxSZXNvdXJjZUlkXG4gICAgLy8gYW5kIHRoZW4gd2l0aC4gSWdub3JlIHRoaXMgZXZlbnQgaWYgd2UgZG9uJ3QgaGF2ZSB0aGF0IHByb3BlcnR5IHlldC5cbiAgICAvL1xuICAgIC8vIChBdCB0aGlzIHBvaW50LCBJIGFsc28gZG9uJ3QgdHJ1c3QgdGhhdCBsb2dpY2FsSWQgaXMgYWx3YXlzIGdvaW5nIHRvIGJlIHRoZXJlIHNvIHZhbGlkYXRlIHRoYXQgYXMgd2VsbClcbiAgICBpZiAoIWxvZ2ljYWxJZCB8fCAhcGh5c2ljYWxSZXNvdXJjZUlkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLm5lc3RlZFN0YWNrUG9sbGVyc1tsb2dpY2FsSWRdKSB7XG4gICAgICB0aGlzLm5lc3RlZFN0YWNrUG9sbGVyc1tsb2dpY2FsSWRdID0gbmV3IFN0YWNrRXZlbnRQb2xsZXIodGhpcy5jZm4sIHtcbiAgICAgICAgc3RhY2tOYW1lOiBwaHlzaWNhbFJlc291cmNlSWQsXG4gICAgICAgIHBhcmVudFN0YWNrTG9naWNhbElkczogcGFyZW50U3RhY2tMb2dpY2FsSWRzLFxuICAgICAgICBzdGFydFRpbWU6IGV2ZW50LlRpbWVzdGFtcCEudmFsdWVPZigpLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGlzU3RhY2tCZWdpbk9wZXJhdGlvblN0YXRlKHN0YXRlOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgcmV0dXJuIFtcbiAgICAnQ1JFQVRFX0lOX1BST0dSRVNTJyxcbiAgICAnVVBEQVRFX0lOX1BST0dSRVNTJyxcbiAgICAnREVMRVRFX0lOX1BST0dSRVNTJyxcbiAgICAnVVBEQVRFX1JPTExCQUNLX0lOX1BST0dSRVNTJyxcbiAgICAnUk9MTEJBQ0tfSU5fUFJPR1JFU1MnLFxuICBdLmluY2x1ZGVzKHN0YXRlID8/ICcnKTtcbn1cblxuZnVuY3Rpb24gaXNTdGFja1Rlcm1pbmFsU3RhdGUoc3RhdGU6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICByZXR1cm4gIShzdGF0ZSA/PyAnJykuZW5kc1dpdGgoJ19JTl9QUk9HUkVTUycpO1xufVxuIl19
@@ -1,48 +0,0 @@
1
- import type { StackProgress } from '@aws-cdk/tmp-toolkit-helpers';
2
- import type { StackEvent } from '@aws-sdk/client-cloudformation';
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
- }
@@ -1,94 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.StackProgressMonitor = void 0;
4
- const util = require("util");
5
- const util_1 = require("../../util");
6
- /**
7
- * Monitors stack progress.s
8
- */
9
- class StackProgressMonitor {
10
- constructor(resourcesTotal) {
11
- /**
12
- * Previous completion state observed by logical ID
13
- *
14
- * We use this to detect that if we see a DELETE_COMPLETE after a
15
- * CREATE_COMPLETE, it's actually a rollback and we should DECREASE
16
- * resourcesDone instead of increase it
17
- */
18
- this.resourcesPrevCompleteState = {};
19
- /**
20
- * Count of resources that have reported a _COMPLETE status
21
- */
22
- this.resourcesDone = 0;
23
- /**
24
- * How many digits we need to represent the total count (for lining up the status reporting)
25
- */
26
- this.resourceDigits = 0;
27
- // +1 because the stack also emits a "COMPLETE" event at the end, and that wasn't
28
- // counted yet. This makes it line up with the amount of events we expect.
29
- this.resourcesTotal = resourcesTotal ? resourcesTotal + 1 : undefined;
30
- // How many digits does this number take to represent?
31
- this.resourceDigits = this.resourcesTotal ? Math.ceil(Math.log10(this.resourcesTotal)) : 0;
32
- }
33
- /**
34
- * Report the stack progress
35
- */
36
- get progress() {
37
- return {
38
- total: this.total,
39
- completed: this.completed,
40
- formatted: this.formatted,
41
- };
42
- }
43
- /**
44
- * The total number of progress monitored resources.
45
- */
46
- get total() {
47
- return this.resourcesTotal;
48
- }
49
- /**
50
- * The number of completed resources.
51
- */
52
- get completed() {
53
- return this.resourcesDone;
54
- }
55
- /**
56
- * Report the current progress as a [34/42] string, or just [34] if the total is unknown
57
- */
58
- get formatted() {
59
- if (this.resourcesTotal == null) {
60
- // Don't have total, show simple count and hope the human knows
61
- return (0, util_1.padLeft)(3, util.format('%s', this.resourcesDone)); // max 500 resources
62
- }
63
- return util.format('%s/%s', (0, util_1.padLeft)(this.resourceDigits, this.resourcesDone.toString()), (0, util_1.padLeft)(this.resourceDigits, this.resourcesTotal.toString()));
64
- }
65
- /**
66
- * Process as stack event and update the progress state.
67
- */
68
- process(event) {
69
- const status = event.ResourceStatus;
70
- if (!status || !event.LogicalResourceId) {
71
- return;
72
- }
73
- if (status.endsWith('_COMPLETE_CLEANUP_IN_PROGRESS')) {
74
- this.resourcesDone++;
75
- }
76
- if (status.endsWith('_COMPLETE')) {
77
- const prevState = this.resourcesPrevCompleteState[event.LogicalResourceId];
78
- if (!prevState) {
79
- this.resourcesDone++;
80
- }
81
- else {
82
- // If we completed this before and we're completing it AGAIN, means we're rolling back.
83
- // Protect against silly underflow.
84
- this.resourcesDone--;
85
- if (this.resourcesDone < 0) {
86
- this.resourcesDone = 0;
87
- }
88
- }
89
- this.resourcesPrevCompleteState[event.LogicalResourceId] = status;
90
- }
91
- }
92
- }
93
- exports.StackProgressMonitor = StackProgressMonitor;
94
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhY2stcHJvZ3Jlc3MtbW9uaXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInN0YWNrLXByb2dyZXNzLW1vbml0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsNkJBQTZCO0FBRzdCLHFDQUFxQztBQUVyQzs7R0FFRztBQUNILE1BQWEsb0JBQW9CO0lBeUIvQixZQUFZLGNBQXVCO1FBeEJuQzs7Ozs7O1dBTUc7UUFDSywrQkFBMEIsR0FBMkIsRUFBRSxDQUFDO1FBRWhFOztXQUVHO1FBQ0ssa0JBQWEsR0FBVyxDQUFDLENBQUM7UUFFbEM7O1dBRUc7UUFDYyxtQkFBYyxHQUFXLENBQUMsQ0FBQztRQVExQyxpRkFBaUY7UUFDakYsMEVBQTBFO1FBQzFFLElBQUksQ0FBQyxjQUFjLEdBQUcsY0FBYyxDQUFDLENBQUMsQ0FBQyxjQUFjLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFFdEUsc0RBQXNEO1FBQ3RELElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDN0YsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBVyxRQUFRO1FBQ2pCLE9BQU87WUFDTCxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUs7WUFDakIsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTO1lBQ3pCLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUztTQUMxQixDQUFDO0lBQ0osQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBVyxLQUFLO1FBQ2QsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDO0lBQzdCLENBQUM7SUFFRDs7T0FFRztJQUNILElBQVcsU0FBUztRQUNsQixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUM7SUFDNUIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBVyxTQUFTO1FBQ2xCLElBQUksSUFBSSxDQUFDLGNBQWMsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUNoQywrREFBK0Q7WUFDL0QsT0FBTyxJQUFBLGNBQU8sRUFBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxvQkFBb0I7UUFDaEYsQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FDaEIsT0FBTyxFQUNQLElBQUEsY0FBTyxFQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxFQUMzRCxJQUFBLGNBQU8sRUFBQyxJQUFJLENBQUMsY0FBYyxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FDN0QsQ0FBQztJQUNKLENBQUM7SUFFRDs7T0FFRztJQUNJLE9BQU8sQ0FBQyxLQUFpQjtRQUM5QixNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsY0FBYyxDQUFDO1FBQ3BDLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUN4QyxPQUFPO1FBQ1QsQ0FBQztRQUVELElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQywrQkFBK0IsQ0FBQyxFQUFFLENBQUM7WUFDckQsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3ZCLENBQUM7UUFFRCxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztZQUNqQyxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsMEJBQTBCLENBQUMsS0FBSyxDQUFDLGlCQUFpQixDQUFDLENBQUM7WUFDM0UsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO2dCQUNmLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUN2QixDQUFDO2lCQUFNLENBQUM7Z0JBQ04sdUZBQXVGO2dCQUN2RixtQ0FBbUM7Z0JBQ25DLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztnQkFDckIsSUFBSSxJQUFJLENBQUMsYUFBYSxHQUFHLENBQUMsRUFBRSxDQUFDO29CQUMzQixJQUFJLENBQUMsYUFBYSxHQUFHLENBQUMsQ0FBQztnQkFDekIsQ0FBQztZQUNILENBQUM7WUFDRCxJQUFJLENBQUMsMEJBQTBCLENBQUMsS0FBSyxDQUFDLGlCQUFpQixDQUFDLEdBQUcsTUFBTSxDQUFDO1FBQ3BFLENBQUM7SUFDSCxDQUFDO0NBQ0Y7QUF2R0Qsb0RBdUdDIiwic291cmNlc0NvbnRlbnQiOlsiXG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJ3V0aWwnO1xuaW1wb3J0IHR5cGUgeyBTdGFja1Byb2dyZXNzIH0gZnJvbSAnQGF3cy1jZGsvdG1wLXRvb2xraXQtaGVscGVycyc7XG5pbXBvcnQgdHlwZSB7IFN0YWNrRXZlbnQgfSBmcm9tICdAYXdzLXNkay9jbGllbnQtY2xvdWRmb3JtYXRpb24nO1xuaW1wb3J0IHsgcGFkTGVmdCB9IGZyb20gJy4uLy4uL3V0aWwnO1xuXG4vKipcbiAqIE1vbml0b3JzIHN0YWNrIHByb2dyZXNzLnNcbiAqL1xuZXhwb3J0IGNsYXNzIFN0YWNrUHJvZ3Jlc3NNb25pdG9yIHtcbiAgLyoqXG4gICAqIFByZXZpb3VzIGNvbXBsZXRpb24gc3RhdGUgb2JzZXJ2ZWQgYnkgbG9naWNhbCBJRFxuICAgKlxuICAgKiBXZSB1c2UgdGhpcyB0byBkZXRlY3QgdGhhdCBpZiB3ZSBzZWUgYSBERUxFVEVfQ09NUExFVEUgYWZ0ZXIgYVxuICAgKiBDUkVBVEVfQ09NUExFVEUsIGl0J3MgYWN0dWFsbHkgYSByb2xsYmFjayBhbmQgd2Ugc2hvdWxkIERFQ1JFQVNFXG4gICAqIHJlc291cmNlc0RvbmUgaW5zdGVhZCBvZiBpbmNyZWFzZSBpdFxuICAgKi9cbiAgcHJpdmF0ZSByZXNvdXJjZXNQcmV2Q29tcGxldGVTdGF0ZTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuXG4gIC8qKlxuICAgKiBDb3VudCBvZiByZXNvdXJjZXMgdGhhdCBoYXZlIHJlcG9ydGVkIGEgX0NPTVBMRVRFIHN0YXR1c1xuICAgKi9cbiAgcHJpdmF0ZSByZXNvdXJjZXNEb25lOiBudW1iZXIgPSAwO1xuXG4gIC8qKlxuICAgKiBIb3cgbWFueSBkaWdpdHMgd2UgbmVlZCB0byByZXByZXNlbnQgdGhlIHRvdGFsIGNvdW50IChmb3IgbGluaW5nIHVwIHRoZSBzdGF0dXMgcmVwb3J0aW5nKVxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSByZXNvdXJjZURpZ2l0czogbnVtYmVyID0gMDtcblxuICAvKipcbiAgICogTnVtYmVyIG9mIGV4cGVjdGVkIHJlc291cmNlcyBpbiB0aGUgbW9uaXRvci5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgcmVzb3VyY2VzVG90YWw/OiBudW1iZXI7XG5cbiAgY29uc3RydWN0b3IocmVzb3VyY2VzVG90YWw/OiBudW1iZXIpIHtcbiAgICAvLyArMSBiZWNhdXNlIHRoZSBzdGFjayBhbHNvIGVtaXRzIGEgXCJDT01QTEVURVwiIGV2ZW50IGF0IHRoZSBlbmQsIGFuZCB0aGF0IHdhc24ndFxuICAgIC8vIGNvdW50ZWQgeWV0LiBUaGlzIG1ha2VzIGl0IGxpbmUgdXAgd2l0aCB0aGUgYW1vdW50IG9mIGV2ZW50cyB3ZSBleHBlY3QuXG4gICAgdGhpcy5yZXNvdXJjZXNUb3RhbCA9IHJlc291cmNlc1RvdGFsID8gcmVzb3VyY2VzVG90YWwgKyAxIDogdW5kZWZpbmVkO1xuXG4gICAgLy8gSG93IG1hbnkgZGlnaXRzIGRvZXMgdGhpcyBudW1iZXIgdGFrZSB0byByZXByZXNlbnQ/XG4gICAgdGhpcy5yZXNvdXJjZURpZ2l0cyA9IHRoaXMucmVzb3VyY2VzVG90YWwgPyBNYXRoLmNlaWwoTWF0aC5sb2cxMCh0aGlzLnJlc291cmNlc1RvdGFsKSkgOiAwO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlcG9ydCB0aGUgc3RhY2sgcHJvZ3Jlc3NcbiAgICovXG4gIHB1YmxpYyBnZXQgcHJvZ3Jlc3MoKTogU3RhY2tQcm9ncmVzcyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRvdGFsOiB0aGlzLnRvdGFsLFxuICAgICAgY29tcGxldGVkOiB0aGlzLmNvbXBsZXRlZCxcbiAgICAgIGZvcm1hdHRlZDogdGhpcy5mb3JtYXR0ZWQsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgdG90YWwgbnVtYmVyIG9mIHByb2dyZXNzIG1vbml0b3JlZCByZXNvdXJjZXMuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHRvdGFsKCk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMucmVzb3VyY2VzVG90YWw7XG4gIH1cblxuICAvKipcbiAgICogVGhlIG51bWJlciBvZiBjb21wbGV0ZWQgcmVzb3VyY2VzLlxuICAgKi9cbiAgcHVibGljIGdldCBjb21wbGV0ZWQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5yZXNvdXJjZXNEb25lO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlcG9ydCB0aGUgY3VycmVudCBwcm9ncmVzcyBhcyBhIFszNC80Ml0gc3RyaW5nLCBvciBqdXN0IFszNF0gaWYgdGhlIHRvdGFsIGlzIHVua25vd25cbiAgICovXG4gIHB1YmxpYyBnZXQgZm9ybWF0dGVkKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMucmVzb3VyY2VzVG90YWwgPT0gbnVsbCkge1xuICAgICAgLy8gRG9uJ3QgaGF2ZSB0b3RhbCwgc2hvdyBzaW1wbGUgY291bnQgYW5kIGhvcGUgdGhlIGh1bWFuIGtub3dzXG4gICAgICByZXR1cm4gcGFkTGVmdCgzLCB1dGlsLmZvcm1hdCgnJXMnLCB0aGlzLnJlc291cmNlc0RvbmUpKTsgLy8gbWF4IDUwMCByZXNvdXJjZXNcbiAgICB9XG5cbiAgICByZXR1cm4gdXRpbC5mb3JtYXQoXG4gICAgICAnJXMvJXMnLFxuICAgICAgcGFkTGVmdCh0aGlzLnJlc291cmNlRGlnaXRzLCB0aGlzLnJlc291cmNlc0RvbmUudG9TdHJpbmcoKSksXG4gICAgICBwYWRMZWZ0KHRoaXMucmVzb3VyY2VEaWdpdHMsIHRoaXMucmVzb3VyY2VzVG90YWwudG9TdHJpbmcoKSksXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm9jZXNzIGFzIHN0YWNrIGV2ZW50IGFuZCB1cGRhdGUgdGhlIHByb2dyZXNzIHN0YXRlLlxuICAgKi9cbiAgcHVibGljIHByb2Nlc3MoZXZlbnQ6IFN0YWNrRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBzdGF0dXMgPSBldmVudC5SZXNvdXJjZVN0YXR1cztcbiAgICBpZiAoIXN0YXR1cyB8fCAhZXZlbnQuTG9naWNhbFJlc291cmNlSWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoc3RhdHVzLmVuZHNXaXRoKCdfQ09NUExFVEVfQ0xFQU5VUF9JTl9QUk9HUkVTUycpKSB7XG4gICAgICB0aGlzLnJlc291cmNlc0RvbmUrKztcbiAgICB9XG5cbiAgICBpZiAoc3RhdHVzLmVuZHNXaXRoKCdfQ09NUExFVEUnKSkge1xuICAgICAgY29uc3QgcHJldlN0YXRlID0gdGhpcy5yZXNvdXJjZXNQcmV2Q29tcGxldGVTdGF0ZVtldmVudC5Mb2dpY2FsUmVzb3VyY2VJZF07XG4gICAgICBpZiAoIXByZXZTdGF0ZSkge1xuICAgICAgICB0aGlzLnJlc291cmNlc0RvbmUrKztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIElmIHdlIGNvbXBsZXRlZCB0aGlzIGJlZm9yZSBhbmQgd2UncmUgY29tcGxldGluZyBpdCBBR0FJTiwgbWVhbnMgd2UncmUgcm9sbGluZyBiYWNrLlxuICAgICAgICAvLyBQcm90ZWN0IGFnYWluc3Qgc2lsbHkgdW5kZXJmbG93LlxuICAgICAgICB0aGlzLnJlc291cmNlc0RvbmUtLTtcbiAgICAgICAgaWYgKHRoaXMucmVzb3VyY2VzRG9uZSA8IDApIHtcbiAgICAgICAgICB0aGlzLnJlc291cmNlc0RvbmUgPSAwO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLnJlc291cmNlc1ByZXZDb21wbGV0ZVN0YXRlW2V2ZW50LkxvZ2ljYWxSZXNvdXJjZUlkXSA9IHN0YXR1cztcbiAgICB9XG4gIH1cbn1cbiJdfQ==
@@ -1,42 +0,0 @@
1
- import { type Stack } from '@aws-sdk/client-cloudformation';
2
- /**
3
- * A utility class to inspect CloudFormation stack statuses.
4
- *
5
- * @see https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-describing-stacks.html
6
- */
7
- export declare class StackStatus {
8
- readonly name: string;
9
- readonly reason?: string | undefined;
10
- static fromStackDescription(description: Stack): StackStatus;
11
- constructor(name: string, reason?: string | undefined);
12
- get isCreationFailure(): boolean;
13
- get isDeleted(): boolean;
14
- get isFailure(): boolean;
15
- get isInProgress(): boolean;
16
- get isReviewInProgress(): boolean;
17
- get isNotFound(): boolean;
18
- get isDeploySuccess(): boolean;
19
- get isRollbackSuccess(): boolean;
20
- /**
21
- * Whether the stack is in a paused state due to `--no-rollback`.
22
- *
23
- * The possible actions here are retrying a new `--no-rollback` deployment, or initiating a rollback.
24
- */
25
- get rollbackChoice(): RollbackChoice;
26
- get isRollbackable(): boolean;
27
- toString(): string;
28
- }
29
- /**
30
- * Describe the current rollback options for this state
31
- */
32
- export declare enum RollbackChoice {
33
- START_ROLLBACK = 0,
34
- CONTINUE_UPDATE_ROLLBACK = 1,
35
- /**
36
- * A sign that stack creation AND its rollback have failed.
37
- *
38
- * There is no way to recover from this, other than recreating the stack.
39
- */
40
- ROLLBACK_FAILED = 2,
41
- NONE = 3
42
- }