@aws-cdk/toolkit-lib 0.3.2 → 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 (361) hide show
  1. package/build-info.json +2 -2
  2. package/lib/actions/bootstrap/index.d.ts +1 -1
  3. package/lib/actions/bootstrap/index.js +5 -5
  4. package/lib/actions/deploy/index.d.ts +1 -1
  5. package/lib/actions/deploy/index.js +1 -1
  6. package/lib/actions/deploy/private/deploy-options.d.ts +1 -1
  7. package/lib/actions/deploy/private/deploy-options.js +1 -1
  8. package/lib/actions/deploy/private/helpers.d.ts +3 -2
  9. package/lib/actions/deploy/private/helpers.js +3 -3
  10. package/lib/actions/diff/private/helpers.d.ts +5 -9
  11. package/lib/actions/diff/private/helpers.js +6 -23
  12. package/lib/api/aws-auth/account-cache.d.ts +41 -0
  13. package/lib/api/aws-auth/account-cache.js +108 -0
  14. package/lib/api/aws-auth/awscli-compatible.d.ts +70 -0
  15. package/lib/api/aws-auth/awscli-compatible.js +250 -0
  16. package/lib/api/aws-auth/cached.d.ts +11 -0
  17. package/lib/api/aws-auth/cached.js +26 -0
  18. package/lib/api/aws-auth/credential-plugins.d.ts +38 -0
  19. package/lib/api/aws-auth/credential-plugins.js +154 -0
  20. package/lib/api/aws-auth/private/index.d.ts +11 -0
  21. package/lib/api/aws-auth/private/index.js +37 -0
  22. package/lib/api/aws-auth/provider-caching.d.ts +13 -0
  23. package/lib/api/aws-auth/provider-caching.js +24 -0
  24. package/lib/api/aws-auth/proxy-agent.d.ts +13 -0
  25. package/lib/api/aws-auth/proxy-agent.js +54 -0
  26. package/lib/api/aws-auth/sdk-logger.d.ts +69 -0
  27. package/lib/api/aws-auth/sdk-logger.js +128 -0
  28. package/lib/api/aws-auth/sdk-provider.d.ts +195 -0
  29. package/lib/api/aws-auth/sdk-provider.js +373 -0
  30. package/lib/api/aws-auth/sdk.d.ts +235 -0
  31. package/lib/api/aws-auth/sdk.js +391 -0
  32. package/lib/api/aws-auth/tracing.d.ts +11 -0
  33. package/lib/api/aws-auth/tracing.js +60 -0
  34. package/lib/api/aws-auth/user-agent.d.ts +7 -0
  35. package/lib/api/aws-auth/user-agent.js +20 -0
  36. package/lib/api/aws-auth/util.d.ts +6 -0
  37. package/lib/api/aws-auth/util.js +21 -0
  38. package/lib/api/bootstrap/bootstrap-environment.d.ts +35 -0
  39. package/lib/api/bootstrap/bootstrap-environment.js +323 -0
  40. package/lib/api/bootstrap/bootstrap-props.d.ts +130 -0
  41. package/lib/api/bootstrap/bootstrap-props.js +14 -0
  42. package/lib/api/bootstrap/deploy-bootstrap.d.ts +39 -0
  43. package/lib/api/bootstrap/deploy-bootstrap.js +147 -0
  44. package/lib/api/bootstrap/index.d.ts +3 -0
  45. package/lib/api/bootstrap/index.js +23 -0
  46. package/lib/api/bootstrap/legacy-template.d.ts +2 -0
  47. package/lib/api/bootstrap/legacy-template.js +82 -0
  48. package/lib/api/cloud-assembly/environment.d.ts +43 -0
  49. package/lib/api/cloud-assembly/environment.js +127 -0
  50. package/lib/api/cloud-assembly/index.d.ts +1 -1
  51. package/lib/api/cloud-assembly/index.js +3 -3
  52. package/lib/api/cloud-assembly/private/context-aware-source.d.ts +1 -1
  53. package/lib/api/cloud-assembly/private/context-aware-source.js +5 -5
  54. package/lib/api/cloud-assembly/private/prepare-source.d.ts +2 -1
  55. package/lib/api/cloud-assembly/private/prepare-source.js +14 -12
  56. package/lib/api/cloud-assembly/private/readable-assembly.d.ts +1 -1
  57. package/lib/api/cloud-assembly/private/readable-assembly.js +1 -1
  58. package/lib/api/cloud-assembly/private/source-builder.js +8 -6
  59. package/lib/api/cloud-assembly/private/stack-assembly.d.ts +2 -1
  60. package/lib/api/cloud-assembly/private/stack-assembly.js +10 -9
  61. package/lib/api/cloud-assembly/stack-assembly.d.ts +55 -0
  62. package/lib/api/cloud-assembly/stack-assembly.js +139 -0
  63. package/lib/api/cloud-assembly/stack-collection.d.ts +27 -0
  64. package/lib/api/cloud-assembly/stack-collection.js +112 -0
  65. package/lib/api/cloud-assembly/stack-selector.d.ts +81 -2
  66. package/lib/api/cloud-assembly/stack-selector.js +62 -5
  67. package/lib/api/cloudformation/evaluate-cloudformation-template.d.ts +85 -0
  68. package/lib/api/cloudformation/evaluate-cloudformation-template.js +456 -0
  69. package/lib/api/cloudformation/index.d.ts +4 -0
  70. package/lib/api/cloudformation/index.js +21 -0
  71. package/lib/api/cloudformation/nested-stack-helpers.d.ts +25 -0
  72. package/lib/api/cloudformation/nested-stack-helpers.js +86 -0
  73. package/lib/api/cloudformation/stack-helpers.d.ts +96 -0
  74. package/lib/api/cloudformation/stack-helpers.js +163 -0
  75. package/lib/api/cloudformation/template-body-parameter.d.ts +22 -0
  76. package/lib/api/cloudformation/template-body-parameter.js +104 -0
  77. package/lib/api/context.d.ts +40 -0
  78. package/lib/api/context.js +84 -0
  79. package/lib/api/deployments/asset-manifest-builder.d.ts +8 -0
  80. package/lib/api/deployments/asset-manifest-builder.js +33 -0
  81. package/lib/api/deployments/asset-publishing.d.ts +60 -0
  82. package/lib/api/deployments/asset-publishing.js +144 -0
  83. package/lib/api/deployments/assets.d.ts +11 -0
  84. package/lib/api/deployments/assets.js +109 -0
  85. package/lib/api/deployments/cfn-api.d.ts +145 -0
  86. package/lib/api/deployments/cfn-api.js +444 -0
  87. package/lib/api/deployments/checks.d.ts +9 -0
  88. package/lib/api/deployments/checks.js +72 -0
  89. package/lib/api/deployments/deploy-stack.d.ts +164 -0
  90. package/lib/api/deployments/deploy-stack.js +490 -0
  91. package/lib/api/deployments/deployment-method.d.ts +24 -0
  92. package/lib/api/deployments/deployment-method.js +3 -0
  93. package/lib/api/deployments/deployment-result.d.ts +21 -0
  94. package/lib/api/deployments/deployment-result.js +10 -0
  95. package/lib/api/deployments/deployments.d.ts +289 -0
  96. package/lib/api/deployments/deployments.js +355 -0
  97. package/lib/api/deployments/index.d.ts +6 -0
  98. package/lib/api/deployments/index.js +27 -0
  99. package/lib/api/diff/diff-formatter.d.ts +147 -0
  100. package/lib/api/diff/diff-formatter.js +225 -0
  101. package/lib/api/diff/index.d.ts +1 -0
  102. package/lib/api/diff/index.js +18 -0
  103. package/lib/api/environment/environment-access.d.ts +139 -0
  104. package/lib/api/environment/environment-access.js +205 -0
  105. package/lib/api/environment/environment-resources.d.ts +75 -0
  106. package/lib/api/environment/environment-resources.js +213 -0
  107. package/lib/api/environment/index.d.ts +3 -0
  108. package/lib/api/environment/index.js +20 -0
  109. package/lib/api/environment/placeholders.d.ts +10 -0
  110. package/lib/api/environment/placeholders.js +23 -0
  111. package/lib/api/garbage-collection/garbage-collector.d.ts +158 -0
  112. package/lib/api/garbage-collection/garbage-collector.js +614 -0
  113. package/lib/api/garbage-collection/index.d.ts +3 -0
  114. package/lib/api/garbage-collection/index.js +21 -0
  115. package/lib/api/garbage-collection/progress-printer.d.ts +23 -0
  116. package/lib/api/garbage-collection/progress-printer.js +80 -0
  117. package/lib/api/garbage-collection/stack-refresh.d.ts +49 -0
  118. package/lib/api/garbage-collection/stack-refresh.js +152 -0
  119. package/lib/api/hotswap/appsync-mapping-templates.d.ts +4 -0
  120. package/lib/api/hotswap/appsync-mapping-templates.js +162 -0
  121. package/lib/api/hotswap/code-build-projects.d.ts +4 -0
  122. package/lib/api/hotswap/code-build-projects.js +62 -0
  123. package/lib/api/hotswap/common.d.ts +89 -0
  124. package/lib/api/hotswap/common.js +137 -0
  125. package/lib/api/hotswap/ecs-services.d.ts +4 -0
  126. package/lib/api/hotswap/ecs-services.js +159 -0
  127. package/lib/api/hotswap/hotswap-deployments.d.ts +17 -0
  128. package/lib/api/hotswap/hotswap-deployments.js +441 -0
  129. package/lib/api/hotswap/index.d.ts +2 -0
  130. package/lib/api/hotswap/index.js +19 -0
  131. package/lib/api/hotswap/lambda-functions.d.ts +4 -0
  132. package/lib/api/hotswap/lambda-functions.js +297 -0
  133. package/lib/api/hotswap/s3-bucket-deployments.d.ts +5 -0
  134. package/lib/api/hotswap/s3-bucket-deployments.js +117 -0
  135. package/lib/api/hotswap/stepfunctions-state-machines.d.ts +4 -0
  136. package/lib/api/hotswap/stepfunctions-state-machines.js +48 -0
  137. package/lib/api/index.d.ts +25 -0
  138. package/lib/api/index.js +42 -0
  139. package/lib/api/io/index.d.ts +3 -1
  140. package/lib/api/io/index.js +18 -1
  141. package/lib/api/io/io-host.d.ts +15 -0
  142. package/lib/api/io/io-host.js +3 -0
  143. package/lib/api/io/io-message.d.ts +76 -0
  144. package/lib/api/io/io-message.js +3 -0
  145. package/lib/api/io/private/index.d.ts +7 -1
  146. package/lib/api/io/private/index.js +8 -5
  147. package/lib/api/io/private/io-default-messages.d.ts +21 -0
  148. package/lib/api/io/private/io-default-messages.js +59 -0
  149. package/lib/api/io/private/io-helper.d.ts +32 -0
  150. package/lib/api/io/private/io-helper.js +51 -0
  151. package/lib/api/io/private/level-priority.d.ts +11 -0
  152. package/lib/api/io/private/level-priority.js +33 -0
  153. package/lib/api/io/private/message-maker.d.ts +89 -0
  154. package/lib/api/io/private/message-maker.js +60 -0
  155. package/lib/api/io/private/messages.d.ts +178 -0
  156. package/lib/api/io/private/messages.js +534 -0
  157. package/lib/api/io/private/span.d.ts +93 -0
  158. package/lib/api/io/private/span.js +87 -0
  159. package/lib/api/io/private/testing/fake-io-host.d.ts +28 -0
  160. package/lib/api/io/private/testing/fake-io-host.js +41 -0
  161. package/lib/api/io/private/testing/index.d.ts +2 -0
  162. package/lib/api/io/private/testing/index.js +19 -0
  163. package/lib/api/io/private/testing/test-io-host.d.ts +27 -0
  164. package/lib/api/io/private/testing/test-io-host.js +61 -0
  165. package/lib/api/io/private/types.d.ts +4 -0
  166. package/lib/api/io/private/types.js +3 -0
  167. package/lib/api/io/toolkit-action.d.ts +4 -0
  168. package/lib/api/io/toolkit-action.js +3 -0
  169. package/lib/api/logs-monitor/find-cloudwatch-logs.d.ts +25 -0
  170. package/lib/api/logs-monitor/find-cloudwatch-logs.js +95 -0
  171. package/lib/api/logs-monitor/index.d.ts +2 -0
  172. package/lib/api/logs-monitor/index.js +19 -0
  173. package/lib/api/logs-monitor/logs-monitor.d.ts +76 -0
  174. package/lib/api/logs-monitor/logs-monitor.js +194 -0
  175. package/lib/api/notices.d.ts +210 -0
  176. package/lib/api/notices.js +430 -0
  177. package/lib/api/plugin/context-provider-plugin.d.ts +6 -0
  178. package/lib/api/plugin/context-provider-plugin.js +7 -0
  179. package/lib/api/plugin/index.d.ts +3 -0
  180. package/lib/api/plugin/index.js +20 -0
  181. package/lib/api/plugin/mode.d.ts +4 -0
  182. package/lib/api/plugin/mode.js +9 -0
  183. package/lib/api/plugin/plugin.d.ts +72 -0
  184. package/lib/api/plugin/plugin.js +132 -0
  185. package/lib/api/private.d.ts +1 -0
  186. package/lib/api/private.js +18 -0
  187. package/lib/api/refactoring/cloudformation.d.ts +15 -0
  188. package/lib/api/refactoring/cloudformation.js +3 -0
  189. package/lib/api/refactoring/digest.d.ts +26 -0
  190. package/lib/api/refactoring/digest.js +175 -0
  191. package/lib/api/refactoring/index.d.ts +51 -0
  192. package/lib/api/refactoring/index.js +223 -0
  193. package/lib/api/require-approval.d.ts +17 -0
  194. package/lib/api/require-approval.js +22 -0
  195. package/lib/api/resource-import/importer.d.ts +216 -0
  196. package/lib/api/resource-import/importer.js +331 -0
  197. package/lib/api/resource-import/index.d.ts +2 -0
  198. package/lib/api/resource-import/index.js +19 -0
  199. package/lib/api/resource-import/migrator.d.ts +26 -0
  200. package/lib/api/resource-import/migrator.js +73 -0
  201. package/lib/api/resource-metadata/index.d.ts +1 -0
  202. package/lib/api/resource-metadata/index.js +18 -0
  203. package/lib/api/resource-metadata/resource-metadata.d.ts +24 -0
  204. package/lib/api/resource-metadata/resource-metadata.js +42 -0
  205. package/lib/api/rwlock.d.ts +60 -0
  206. package/lib/api/rwlock.js +204 -0
  207. package/lib/api/settings.d.ts +26 -0
  208. package/lib/api/settings.js +107 -0
  209. package/lib/api/shared-private.d.ts +8 -6
  210. package/lib/api/shared-private.js +2838 -9213
  211. package/lib/api/shared-private.js.map +4 -4
  212. package/lib/api/shared-public.d.ts +18 -38
  213. package/lib/api/shared-public.js +2187 -25
  214. package/lib/api/shared-public.js.map +4 -4
  215. package/lib/api/stack-events/index.d.ts +4 -0
  216. package/lib/api/stack-events/index.js +23 -0
  217. package/lib/api/stack-events/stack-activity-monitor.d.ts +100 -0
  218. package/lib/api/stack-events/stack-activity-monitor.js +164 -0
  219. package/lib/api/stack-events/stack-event-poller.d.ts +69 -0
  220. package/lib/api/stack-events/stack-event-poller.js +130 -0
  221. package/lib/api/stack-events/stack-progress-monitor.d.ts +48 -0
  222. package/lib/api/stack-events/stack-progress-monitor.js +98 -0
  223. package/lib/api/stack-events/stack-status.d.ts +42 -0
  224. package/lib/api/stack-events/stack-status.js +90 -0
  225. package/lib/api/streams.d.ts +7 -0
  226. package/lib/api/streams.js +24 -0
  227. package/lib/api/tags.d.ts +9 -0
  228. package/lib/api/tags.js +10 -0
  229. package/lib/api/toolkit-error.d.ts +86 -0
  230. package/lib/api/toolkit-error.js +132 -0
  231. package/lib/api/toolkit-info.d.ts +52 -0
  232. package/lib/api/toolkit-info.js +157 -0
  233. package/lib/api/tree.d.ts +31 -0
  234. package/lib/api/tree.js +37 -0
  235. package/lib/api/work-graph/index.d.ts +3 -0
  236. package/lib/api/work-graph/index.js +20 -0
  237. package/lib/api/work-graph/work-graph-builder.d.ts +34 -0
  238. package/lib/api/work-graph/work-graph-builder.js +172 -0
  239. package/lib/api/work-graph/work-graph-types.d.ts +50 -0
  240. package/lib/api/work-graph/work-graph-types.js +13 -0
  241. package/lib/api/work-graph/work-graph.d.ts +72 -0
  242. package/lib/api/work-graph/work-graph.js +349 -0
  243. package/lib/context-providers/ami.d.ts +13 -0
  244. package/lib/context-providers/ami.js +52 -0
  245. package/lib/context-providers/availability-zones.d.ts +13 -0
  246. package/lib/context-providers/availability-zones.js +29 -0
  247. package/lib/context-providers/cc-api-provider.d.ts +30 -0
  248. package/lib/context-providers/cc-api-provider.js +145 -0
  249. package/lib/context-providers/endpoint-service-availability-zones.d.ts +13 -0
  250. package/lib/context-providers/endpoint-service-availability-zones.js +35 -0
  251. package/lib/context-providers/hosted-zones.d.ts +12 -0
  252. package/lib/context-providers/hosted-zones.js +69 -0
  253. package/lib/context-providers/index.d.ts +44 -0
  254. package/lib/context-providers/index.js +128 -0
  255. package/lib/context-providers/keys.d.ts +13 -0
  256. package/lib/context-providers/keys.js +54 -0
  257. package/lib/context-providers/load-balancers.d.ts +20 -0
  258. package/lib/context-providers/load-balancers.js +161 -0
  259. package/lib/context-providers/security-groups.d.ts +9 -0
  260. package/lib/context-providers/security-groups.js +69 -0
  261. package/lib/context-providers/ssm-parameters.d.ts +25 -0
  262. package/lib/context-providers/ssm-parameters.js +61 -0
  263. package/lib/context-providers/vpcs.d.ts +13 -0
  264. package/lib/context-providers/vpcs.js +291 -0
  265. package/lib/index.d.ts +1 -0
  266. package/lib/index.js +2 -1
  267. package/lib/payloads/bootstrap-environment-progress.d.ts +17 -0
  268. package/lib/payloads/bootstrap-environment-progress.js +3 -0
  269. package/lib/payloads/context.d.ts +9 -0
  270. package/lib/payloads/context.js +3 -0
  271. package/lib/payloads/deploy.d.ts +43 -0
  272. package/lib/payloads/deploy.js +3 -0
  273. package/lib/payloads/destroy.d.ts +23 -0
  274. package/lib/payloads/destroy.js +3 -0
  275. package/lib/payloads/diff.d.ts +31 -0
  276. package/lib/payloads/diff.js +22 -0
  277. package/lib/payloads/hotswap.d.ts +211 -0
  278. package/lib/payloads/hotswap.js +43 -0
  279. package/lib/payloads/index.d.ts +17 -0
  280. package/lib/payloads/index.js +34 -0
  281. package/lib/payloads/list.d.ts +4 -0
  282. package/lib/payloads/list.js +3 -0
  283. package/lib/payloads/logs-monitor.d.ts +33 -0
  284. package/lib/payloads/logs-monitor.js +3 -0
  285. package/lib/payloads/progress.d.ts +14 -0
  286. package/lib/payloads/progress.js +3 -0
  287. package/lib/payloads/refactor.d.ts +14 -0
  288. package/lib/payloads/refactor.js +3 -0
  289. package/lib/payloads/rollback.d.ts +17 -0
  290. package/lib/payloads/rollback.js +3 -0
  291. package/lib/payloads/sdk-trace.d.ts +20 -0
  292. package/lib/payloads/sdk-trace.js +3 -0
  293. package/lib/payloads/stack-activity.d.ts +53 -0
  294. package/lib/payloads/stack-activity.js +3 -0
  295. package/lib/payloads/stack-details.d.ts +17 -0
  296. package/lib/payloads/stack-details.js +3 -0
  297. package/lib/payloads/synth.d.ts +7 -0
  298. package/lib/payloads/synth.js +3 -0
  299. package/lib/payloads/types.d.ts +95 -0
  300. package/lib/payloads/types.js +3 -0
  301. package/lib/payloads/watch.d.ts +27 -0
  302. package/lib/payloads/watch.js +3 -0
  303. package/lib/private/activity-printer/base.d.ts +50 -0
  304. package/lib/private/activity-printer/base.js +120 -0
  305. package/lib/private/activity-printer/current.d.ts +26 -0
  306. package/lib/private/activity-printer/current.js +122 -0
  307. package/lib/private/activity-printer/display.d.ts +13 -0
  308. package/lib/private/activity-printer/display.js +81 -0
  309. package/lib/private/activity-printer/history.d.ts +32 -0
  310. package/lib/private/activity-printer/history.js +109 -0
  311. package/lib/private/activity-printer/index.d.ts +3 -0
  312. package/lib/private/activity-printer/index.js +20 -0
  313. package/lib/private/index.d.ts +1 -0
  314. package/lib/private/index.js +18 -0
  315. package/lib/private/util.d.ts +1 -1
  316. package/lib/private/util.js +22 -22
  317. package/lib/private/util.js.map +2 -2
  318. package/lib/toolkit/private/index.d.ts +2 -1
  319. package/lib/toolkit/private/index.js +1 -1
  320. package/lib/toolkit/toolkit.js +142 -124
  321. package/lib/toolkit/types.d.ts +0 -55
  322. package/lib/toolkit/types.js +1 -1
  323. package/lib/util/archive.d.ts +1 -0
  324. package/lib/util/archive.js +86 -0
  325. package/lib/util/arrays.d.ts +14 -0
  326. package/lib/util/arrays.js +36 -0
  327. package/lib/util/bool.d.ts +7 -0
  328. package/lib/util/bool.js +13 -0
  329. package/lib/util/bytes.d.ts +8 -0
  330. package/lib/util/bytes.js +21 -0
  331. package/lib/util/cloudformation.d.ts +16 -0
  332. package/lib/util/cloudformation.js +36 -0
  333. package/lib/util/content-hash.d.ts +5 -0
  334. package/lib/util/content-hash.js +43 -0
  335. package/lib/util/directories.d.ts +22 -0
  336. package/lib/util/directories.js +59 -0
  337. package/lib/util/format-error.d.ts +9 -0
  338. package/lib/util/format-error.js +22 -0
  339. package/lib/util/index.d.ts +18 -0
  340. package/lib/util/index.js +35 -0
  341. package/lib/util/json.d.ts +48 -0
  342. package/lib/util/json.js +68 -0
  343. package/lib/util/objects.d.ts +65 -0
  344. package/lib/util/objects.js +230 -0
  345. package/lib/util/package-info.d.ts +3 -0
  346. package/lib/util/package-info.js +22 -0
  347. package/lib/util/parallel.d.ts +6 -0
  348. package/lib/util/parallel.js +48 -0
  349. package/lib/util/serialize.d.ts +27 -0
  350. package/lib/util/serialize.js +86 -0
  351. package/lib/util/string-manipulation.d.ts +18 -0
  352. package/lib/util/string-manipulation.js +46 -0
  353. package/lib/util/type-brands.d.ts +39 -0
  354. package/lib/util/type-brands.js +39 -0
  355. package/lib/util/types.d.ts +27 -0
  356. package/lib/util/types.js +25 -0
  357. package/lib/util/version-range.d.ts +2 -0
  358. package/lib/util/version-range.js +36 -0
  359. package/lib/util/yaml-cfn.d.ts +15 -0
  360. package/lib/util/yaml-cfn.js +58 -0
  361. package/package.json +3 -4
@@ -0,0 +1,109 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.HistoryActivityPrinter = void 0;
4
+ const util = require("util");
5
+ const chalk = require("chalk");
6
+ const base_1 = require("./base");
7
+ const util_1 = require("../../util");
8
+ /**
9
+ * Activity Printer which shows a full log of all CloudFormation events
10
+ *
11
+ * When there hasn't been activity for a while, it will print the resources
12
+ * that are currently in progress, to show what's holding up the deployment.
13
+ */
14
+ class HistoryActivityPrinter extends base_1.ActivityPrinterBase {
15
+ /**
16
+ * Last time we printed something to the console.
17
+ *
18
+ * Used to measure timeout for progress reporting.
19
+ */
20
+ lastPrintTime = Date.now();
21
+ lastPrinted;
22
+ /**
23
+ * Number of ms of change absence before we tell the user about the resources that are currently in progress.
24
+ */
25
+ inProgressDelay = 30_000;
26
+ printable = new Array();
27
+ constructor(props) {
28
+ super(props);
29
+ }
30
+ activity(activity) {
31
+ this.printable.push(activity);
32
+ super.activity(activity);
33
+ }
34
+ stop() {
35
+ super.stop();
36
+ // Print failures at the end
37
+ if (this.failures.length > 0) {
38
+ this.stream.write('\nFailed resources:\n');
39
+ for (const failure of this.failures) {
40
+ // Root stack failures are not interesting
41
+ if (this.isActivityForTheStack(failure)) {
42
+ continue;
43
+ }
44
+ this.printOne(failure, false);
45
+ }
46
+ }
47
+ }
48
+ print() {
49
+ for (const activity of this.printable) {
50
+ this.printOne(activity);
51
+ this.lastPrinted = activity;
52
+ }
53
+ this.printable.splice(0, this.printable.length);
54
+ this.printInProgress(this.lastPrinted?.progress.formatted);
55
+ }
56
+ printOne(activity, progress) {
57
+ const event = activity.event;
58
+ const color = colorFromStatusResult(event.ResourceStatus);
59
+ let reasonColor = chalk.cyan;
60
+ let stackTrace = '';
61
+ const metadata = activity.metadata;
62
+ if (event.ResourceStatus && event.ResourceStatus.indexOf('FAILED') !== -1) {
63
+ if (progress == undefined || progress) {
64
+ event.ResourceStatusReason = event.ResourceStatusReason ? this.failureReason(activity) : '';
65
+ }
66
+ if (metadata) {
67
+ stackTrace = metadata.entry.trace ? `\n\t${metadata.entry.trace.join('\n\t\\_ ')}` : '';
68
+ }
69
+ reasonColor = chalk.red;
70
+ }
71
+ const resourceName = metadata ? metadata.constructPath : event.LogicalResourceId || '';
72
+ const logicalId = resourceName !== event.LogicalResourceId ? `(${event.LogicalResourceId}) ` : '';
73
+ this.stream.write(util.format('%s | %s%s | %s | %s | %s %s%s%s\n', event.StackName, progress !== false ? `${activity.progress.formatted} | ` : '', new Date(event.Timestamp).toLocaleTimeString(), color((0, util_1.padRight)(HistoryActivityPrinter.STATUS_WIDTH, (event.ResourceStatus || '').slice(0, HistoryActivityPrinter.STATUS_WIDTH))), // pad left and trim
74
+ (0, util_1.padRight)(this.resourceTypeColumnWidth, event.ResourceType || ''), color(chalk.bold(resourceName)), logicalId, reasonColor(chalk.bold(event.ResourceStatusReason ? event.ResourceStatusReason : '')), reasonColor(stackTrace)));
75
+ this.lastPrintTime = Date.now();
76
+ }
77
+ /**
78
+ * If some resources are taking a while to create, notify the user about what's currently in progress
79
+ */
80
+ printInProgress(progress) {
81
+ if (!progress || Date.now() < this.lastPrintTime + this.inProgressDelay) {
82
+ return;
83
+ }
84
+ if (Object.keys(this.resourcesInProgress).length > 0) {
85
+ this.stream.write(util.format('%s Currently in progress: %s\n', progress, chalk.bold(Object.keys(this.resourcesInProgress).join(', '))));
86
+ }
87
+ // We cheat a bit here. To prevent printInProgress() from repeatedly triggering,
88
+ // we set the timestamp into the future. It will be reset whenever a regular print
89
+ // occurs, after which we can be triggered again.
90
+ this.lastPrintTime = +Infinity;
91
+ }
92
+ }
93
+ exports.HistoryActivityPrinter = HistoryActivityPrinter;
94
+ function colorFromStatusResult(status) {
95
+ if (!status) {
96
+ return chalk.reset;
97
+ }
98
+ if (status.indexOf('FAILED') !== -1) {
99
+ return chalk.red;
100
+ }
101
+ if (status.indexOf('ROLLBACK') !== -1) {
102
+ return chalk.yellow;
103
+ }
104
+ if (status.indexOf('COMPLETE') !== -1) {
105
+ return chalk.green;
106
+ }
107
+ return chalk.reset;
108
+ }
109
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGlzdG9yeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImhpc3RvcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsNkJBQTZCO0FBQzdCLCtCQUErQjtBQUUvQixpQ0FBNkM7QUFFN0MscUNBQXNDO0FBRXRDOzs7OztHQUtHO0FBQ0gsTUFBYSxzQkFBdUIsU0FBUSwwQkFBbUI7SUFDN0Q7Ozs7T0FJRztJQUNLLGFBQWEsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7SUFFM0IsV0FBVyxDQUFpQjtJQUVwQzs7T0FFRztJQUNjLGVBQWUsR0FBRyxNQUFNLENBQUM7SUFFekIsU0FBUyxHQUFHLElBQUksS0FBSyxFQUFpQixDQUFDO0lBRXhELFlBQVksS0FBMkI7UUFDckMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2YsQ0FBQztJQUVNLFFBQVEsQ0FBQyxRQUF1QjtRQUNyQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUM5QixLQUFLLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzNCLENBQUM7SUFFTSxJQUFJO1FBQ1QsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO1FBRWIsNEJBQTRCO1FBQzVCLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDN0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsdUJBQXVCLENBQUMsQ0FBQztZQUMzQyxLQUFLLE1BQU0sT0FBTyxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDcEMsMENBQTBDO2dCQUMxQyxJQUFJLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO29CQUN4QyxTQUFTO2dCQUNYLENBQUM7Z0JBRUQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDaEMsQ0FBQztRQUNILENBQUM7SUFD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LEVBQUUsQ0FBQztRQUNwQyxPQUFPLEtBQUssQ0FBQyxHQUFHLENBQUM7SUFDbkIsQ0FBQztJQUNELElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3RDLE9BQU8sS0FBSyxDQUFDLE1BQU0sQ0FBQztJQUN0QixDQUFDO0lBQ0QsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDdEMsT0FBTyxLQUFLLENBQUMsS0FBSyxDQUFDO0lBQ3JCLENBQUM7SUFFRCxPQUFPLEtBQUssQ0FBQyxLQUFLLENBQUM7QUFDckIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIHV0aWwgZnJvbSAndXRpbCc7XG5pbXBvcnQgKiBhcyBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IEFjdGl2aXR5UHJpbnRlclByb3BzIH0gZnJvbSAnLi9iYXNlJztcbmltcG9ydCB7IEFjdGl2aXR5UHJpbnRlckJhc2UgfSBmcm9tICcuL2Jhc2UnO1xuaW1wb3J0IHR5cGUgeyBTdGFja0FjdGl2aXR5IH0gZnJvbSAnLi4vLi4vcGF5bG9hZHMnO1xuaW1wb3J0IHsgcGFkUmlnaHQgfSBmcm9tICcuLi8uLi91dGlsJztcblxuLyoqXG4gKiBBY3Rpdml0eSBQcmludGVyIHdoaWNoIHNob3dzIGEgZnVsbCBsb2cgb2YgYWxsIENsb3VkRm9ybWF0aW9uIGV2ZW50c1xuICpcbiAqIFdoZW4gdGhlcmUgaGFzbid0IGJlZW4gYWN0aXZpdHkgZm9yIGEgd2hpbGUsIGl0IHdpbGwgcHJpbnQgdGhlIHJlc291cmNlc1xuICogdGhhdCBhcmUgY3VycmVudGx5IGluIHByb2dyZXNzLCB0byBzaG93IHdoYXQncyBob2xkaW5nIHVwIHRoZSBkZXBsb3ltZW50LlxuICovXG5leHBvcnQgY2xhc3MgSGlzdG9yeUFjdGl2aXR5UHJpbnRlciBleHRlbmRzIEFjdGl2aXR5UHJpbnRlckJhc2Uge1xuICAvKipcbiAgICogTGFzdCB0aW1lIHdlIHByaW50ZWQgc29tZXRoaW5nIHRvIHRoZSBjb25zb2xlLlxuICAgKlxuICAgKiBVc2VkIHRvIG1lYXN1cmUgdGltZW91dCBmb3IgcHJvZ3Jlc3MgcmVwb3J0aW5nLlxuICAgKi9cbiAgcHJpdmF0ZSBsYXN0UHJpbnRUaW1lID0gRGF0ZS5ub3coKTtcblxuICBwcml2YXRlIGxhc3RQcmludGVkPzogU3RhY2tBY3Rpdml0eTtcblxuICAvKipcbiAgICogTnVtYmVyIG9mIG1zIG9mIGNoYW5nZSBhYnNlbmNlIGJlZm9yZSB3ZSB0ZWxsIHRoZSB1c2VyIGFib3V0IHRoZSByZXNvdXJjZXMgdGhhdCBhcmUgY3VycmVudGx5IGluIHByb2dyZXNzLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBpblByb2dyZXNzRGVsYXkgPSAzMF8wMDA7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBwcmludGFibGUgPSBuZXcgQXJyYXk8U3RhY2tBY3Rpdml0eT4oKTtcblxuICBjb25zdHJ1Y3Rvcihwcm9wczogQWN0aXZpdHlQcmludGVyUHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcyk7XG4gIH1cblxuICBwdWJsaWMgYWN0aXZpdHkoYWN0aXZpdHk6IFN0YWNrQWN0aXZpdHkpIHtcbiAgICB0aGlzLnByaW50YWJsZS5wdXNoKGFjdGl2aXR5KTtcbiAgICBzdXBlci5hY3Rpdml0eShhY3Rpdml0eSk7XG4gIH1cblxuICBwdWJsaWMgc3RvcCgpIHtcbiAgICBzdXBlci5zdG9wKCk7XG5cbiAgICAvLyBQcmludCBmYWlsdXJlcyBhdCB0aGUgZW5kXG4gICAgaWYgKHRoaXMuZmFpbHVyZXMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5zdHJlYW0ud3JpdGUoJ1xcbkZhaWxlZCByZXNvdXJjZXM6XFxuJyk7XG4gICAgICBmb3IgKGNvbnN0IGZhaWx1cmUgb2YgdGhpcy5mYWlsdXJlcykge1xuICAgICAgICAvLyBSb290IHN0YWNrIGZhaWx1cmVzIGFyZSBub3QgaW50ZXJlc3RpbmdcbiAgICAgICAgaWYgKHRoaXMuaXNBY3Rpdml0eUZvclRoZVN0YWNrKGZhaWx1cmUpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnByaW50T25lKGZhaWx1cmUsIGZhbHNlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgcHJpbnQoKSB7XG4gICAgZm9yIChjb25zdCBhY3Rpdml0eSBvZiB0aGlzLnByaW50YWJsZSkge1xuICAgICAgdGhpcy5wcmludE9uZShhY3Rpdml0eSk7XG4gICAgICB0aGlzLmxhc3RQcmludGVkID0gYWN0aXZpdHk7XG4gICAgfVxuICAgIHRoaXMucHJpbnRhYmxlLnNwbGljZSgwLCB0aGlzLnByaW50YWJsZS5sZW5ndGgpO1xuICAgIHRoaXMucHJpbnRJblByb2dyZXNzKHRoaXMubGFzdFByaW50ZWQ/LnByb2dyZXNzLmZvcm1hdHRlZCk7XG4gIH1cblxuICBwcml2YXRlIHByaW50T25lKGFjdGl2aXR5OiBTdGFja0FjdGl2aXR5LCBwcm9ncmVzcz86IGJvb2xlYW4pIHtcbiAgICBjb25zdCBldmVudCA9IGFjdGl2aXR5LmV2ZW50O1xuICAgIGNvbnN0IGNvbG9yID0gY29sb3JGcm9tU3RhdHVzUmVzdWx0KGV2ZW50LlJlc291cmNlU3RhdHVzKTtcbiAgICBsZXQgcmVhc29uQ29sb3IgPSBjaGFsay5jeWFuO1xuXG4gICAgbGV0IHN0YWNrVHJhY2UgPSAnJztcbiAgICBjb25zdCBtZXRhZGF0YSA9IGFjdGl2aXR5Lm1ldGFkYXRhO1xuXG4gICAgaWYgKGV2ZW50LlJlc291cmNlU3RhdHVzICYmIGV2ZW50LlJlc291cmNlU3RhdHVzLmluZGV4T2YoJ0ZBSUxFRCcpICE9PSAtMSkge1xuICAgICAgaWYgKHByb2dyZXNzID09IHVuZGVmaW5lZCB8fCBwcm9ncmVzcykge1xuICAgICAgICBldmVudC5SZXNvdXJjZVN0YXR1c1JlYXNvbiA9IGV2ZW50LlJlc291cmNlU3RhdHVzUmVhc29uID8gdGhpcy5mYWlsdXJlUmVhc29uKGFjdGl2aXR5KSA6ICcnO1xuICAgICAgfVxuICAgICAgaWYgKG1ldGFkYXRhKSB7XG4gICAgICAgIHN0YWNrVHJhY2UgPSBtZXRhZGF0YS5lbnRyeS50cmFjZSA/IGBcXG5cXHQke21ldGFkYXRhLmVudHJ5LnRyYWNlLmpvaW4oJ1xcblxcdFxcXFxfICcpfWAgOiAnJztcbiAgICAgIH1cbiAgICAgIHJlYXNvbkNvbG9yID0gY2hhbGsucmVkO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc291cmNlTmFtZSA9IG1ldGFkYXRhID8gbWV0YWRhdGEuY29uc3RydWN0UGF0aCA6IGV2ZW50LkxvZ2ljYWxSZXNvdXJjZUlkIHx8ICcnO1xuICAgIGNvbnN0IGxvZ2ljYWxJZCA9IHJlc291cmNlTmFtZSAhPT0gZXZlbnQuTG9naWNhbFJlc291cmNlSWQgPyBgKCR7ZXZlbnQuTG9naWNhbFJlc291cmNlSWR9KSBgIDogJyc7XG5cbiAgICB0aGlzLnN0cmVhbS53cml0ZShcbiAgICAgIHV0aWwuZm9ybWF0KFxuICAgICAgICAnJXMgfCAlcyVzIHwgJXMgfCAlcyB8ICVzICVzJXMlc1xcbicsXG4gICAgICAgIGV2ZW50LlN0YWNrTmFtZSxcbiAgICAgICAgcHJvZ3Jlc3MgIT09IGZhbHNlID8gYCR7YWN0aXZpdHkucHJvZ3Jlc3MuZm9ybWF0dGVkfSB8IGAgOiAnJyxcbiAgICAgICAgbmV3IERhdGUoZXZlbnQuVGltZXN0YW1wISkudG9Mb2NhbGVUaW1lU3RyaW5nKCksXG4gICAgICAgIGNvbG9yKHBhZFJpZ2h0KEhpc3RvcnlBY3Rpdml0eVByaW50ZXIuU1RBVFVTX1dJRFRILCAoZXZlbnQuUmVzb3VyY2VTdGF0dXMgfHwgJycpLnNsaWNlKDAsIEhpc3RvcnlBY3Rpdml0eVByaW50ZXIuU1RBVFVTX1dJRFRIKSkpLCAvLyBwYWQgbGVmdCBhbmQgdHJpbVxuICAgICAgICBwYWRSaWdodCh0aGlzLnJlc291cmNlVHlwZUNvbHVtbldpZHRoLCBldmVudC5SZXNvdXJjZVR5cGUgfHwgJycpLFxuICAgICAgICBjb2xvcihjaGFsay5ib2xkKHJlc291cmNlTmFtZSkpLFxuICAgICAgICBsb2dpY2FsSWQsXG4gICAgICAgIHJlYXNvbkNvbG9yKGNoYWxrLmJvbGQoZXZlbnQuUmVzb3VyY2VTdGF0dXNSZWFzb24gPyBldmVudC5SZXNvdXJjZVN0YXR1c1JlYXNvbiA6ICcnKSksXG4gICAgICAgIHJlYXNvbkNvbG9yKHN0YWNrVHJhY2UpLFxuICAgICAgKSxcbiAgICApO1xuXG4gICAgdGhpcy5sYXN0UHJpbnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJZiBzb21lIHJlc291cmNlcyBhcmUgdGFraW5nIGEgd2hpbGUgdG8gY3JlYXRlLCBub3RpZnkgdGhlIHVzZXIgYWJvdXQgd2hhdCdzIGN1cnJlbnRseSBpbiBwcm9ncmVzc1xuICAgKi9cbiAgcHJpdmF0ZSBwcmludEluUHJvZ3Jlc3MocHJvZ3Jlc3M/OiBzdHJpbmcpIHtcbiAgICBpZiAoIXByb2dyZXNzIHx8IERhdGUubm93KCkgPCB0aGlzLmxhc3RQcmludFRpbWUgKyB0aGlzLmluUHJvZ3Jlc3NEZWxheSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLnJlc291cmNlc0luUHJvZ3Jlc3MpLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuc3RyZWFtLndyaXRlKFxuICAgICAgICB1dGlsLmZvcm1hdChcbiAgICAgICAgICAnJXMgQ3VycmVudGx5IGluIHByb2dyZXNzOiAlc1xcbicsXG4gICAgICAgICAgcHJvZ3Jlc3MsXG4gICAgICAgICAgY2hhbGsuYm9sZChPYmplY3Qua2V5cyh0aGlzLnJlc291cmNlc0luUHJvZ3Jlc3MpLmpvaW4oJywgJykpLFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBXZSBjaGVhdCBhIGJpdCBoZXJlLiBUbyBwcmV2ZW50IHByaW50SW5Qcm9ncmVzcygpIGZyb20gcmVwZWF0ZWRseSB0cmlnZ2VyaW5nLFxuICAgIC8vIHdlIHNldCB0aGUgdGltZXN0YW1wIGludG8gdGhlIGZ1dHVyZS4gSXQgd2lsbCBiZSByZXNldCB3aGVuZXZlciBhIHJlZ3VsYXIgcHJpbnRcbiAgICAvLyBvY2N1cnMsIGFmdGVyIHdoaWNoIHdlIGNhbiBiZSB0cmlnZ2VyZWQgYWdhaW4uXG4gICAgdGhpcy5sYXN0UHJpbnRUaW1lID0gK0luZmluaXR5O1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbG9yRnJvbVN0YXR1c1Jlc3VsdChzdGF0dXM/OiBzdHJpbmcpIHtcbiAgaWYgKCFzdGF0dXMpIHtcbiAgICByZXR1cm4gY2hhbGsucmVzZXQ7XG4gIH1cblxuICBpZiAoc3RhdHVzLmluZGV4T2YoJ0ZBSUxFRCcpICE9PSAtMSkge1xuICAgIHJldHVybiBjaGFsay5yZWQ7XG4gIH1cbiAgaWYgKHN0YXR1cy5pbmRleE9mKCdST0xMQkFDSycpICE9PSAtMSkge1xuICAgIHJldHVybiBjaGFsay55ZWxsb3c7XG4gIH1cbiAgaWYgKHN0YXR1cy5pbmRleE9mKCdDT01QTEVURScpICE9PSAtMSkge1xuICAgIHJldHVybiBjaGFsay5ncmVlbjtcbiAgfVxuXG4gIHJldHVybiBjaGFsay5yZXNldDtcbn1cbiJdfQ==
@@ -0,0 +1,3 @@
1
+ export * from './base';
2
+ export * from './history';
3
+ export * from './current';
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./base"), exports);
18
+ __exportStar(require("./history"), exports);
19
+ __exportStar(require("./current"), exports);
20
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUEseUNBQXVCO0FBQ3ZCLDRDQUEwQjtBQUMxQiw0Q0FBMEIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2Jhc2UnO1xuZXhwb3J0ICogZnJvbSAnLi9oaXN0b3J5JztcbmV4cG9ydCAqIGZyb20gJy4vY3VycmVudCc7XG4iXX0=
@@ -0,0 +1 @@
1
+ export * from './activity-printer';
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./activity-printer"), exports);
18
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUEscURBQW1DIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9hY3Rpdml0eS1wcmludGVyJztcbiJdfQ==
@@ -1 +1 @@
1
- export * from '../../../tmp-toolkit-helpers/src/util';
1
+ export * from '../util';
@@ -81,13 +81,13 @@ __export(util_exports, {
81
81
  });
82
82
  module.exports = __toCommonJS(util_exports);
83
83
 
84
- // ../tmp-toolkit-helpers/src/util/archive.ts
84
+ // lib/util/archive.ts
85
85
  var import_console = require("console");
86
86
  var import_fs = require("fs");
87
87
  var path = __toESM(require("path"));
88
88
  var glob = __toESM(require("glob"));
89
89
 
90
- // ../tmp-toolkit-helpers/src/util/format-error.ts
90
+ // lib/util/format-error.ts
91
91
  function formatErrorMessage(error2) {
92
92
  if (error2 && Array.isArray(error2.errors)) {
93
93
  const innerMessages = error2.errors.map((innerError) => innerError?.message || innerError?.toString()).join("\n");
@@ -96,7 +96,7 @@ function formatErrorMessage(error2) {
96
96
  return error2?.message || error2?.toString() || "Unknown error";
97
97
  }
98
98
 
99
- // ../tmp-toolkit-helpers/src/util/archive.ts
99
+ // lib/util/archive.ts
100
100
  var archiver = require("archiver");
101
101
  async function zipDirectory(directory, outputFile) {
102
102
  const temporaryOutputFile = `${outputFile}.${randomString()}._tmp`;
@@ -153,7 +153,7 @@ function randomString() {
153
153
  return Math.random().toString(36).replace(/[^a-z0-9]+/g, "");
154
154
  }
155
155
 
156
- // ../tmp-toolkit-helpers/src/util/arrays.ts
156
+ // lib/util/arrays.ts
157
157
  function flatMap(xs, fn) {
158
158
  return flatten(xs.map(fn));
159
159
  }
@@ -173,12 +173,12 @@ function partition(collection, pred) {
173
173
  return ret;
174
174
  }
175
175
 
176
- // ../tmp-toolkit-helpers/src/util/bool.ts
176
+ // lib/util/bool.ts
177
177
  function numberFromBool(bool) {
178
178
  return +bool;
179
179
  }
180
180
 
181
- // ../tmp-toolkit-helpers/src/util/bytes.ts
181
+ // lib/util/bytes.ts
182
182
  function formatBytes(bytes, decimals = 2) {
183
183
  decimals = decimals < 0 ? 0 : decimals;
184
184
  if (bytes === 0) {
@@ -190,7 +190,7 @@ function formatBytes(bytes, decimals = 2) {
190
190
  return `${parseFloat((bytes / Math.pow(k, i)).toFixed(decimals))} ${sizes[i]}`;
191
191
  }
192
192
 
193
- // ../tmp-toolkit-helpers/src/util/cloudformation.ts
193
+ // lib/util/cloudformation.ts
194
194
  function validateSnsTopicArn(arn) {
195
195
  return /^arn:aws:sns:[a-z0-9\-]+:[0-9]+:[a-z0-9\-\_]+$/i.test(arn);
196
196
  }
@@ -209,7 +209,7 @@ function maxResourceTypeLength(template, startWidth = "AWS::CloudFormation::Stac
209
209
  return maxWidth;
210
210
  }
211
211
 
212
- // ../tmp-toolkit-helpers/src/util/content-hash.ts
212
+ // lib/util/content-hash.ts
213
213
  var crypto = __toESM(require("crypto"));
214
214
  function contentHash(data) {
215
215
  return crypto.createHash("sha256").update(data).digest("hex");
@@ -246,12 +246,12 @@ function contentHashAny(value) {
246
246
  }
247
247
  }
248
248
 
249
- // ../tmp-toolkit-helpers/src/util/directories.ts
249
+ // lib/util/directories.ts
250
250
  var fs2 = __toESM(require("fs"));
251
251
  var os = __toESM(require("os"));
252
252
  var path2 = __toESM(require("path"));
253
253
 
254
- // ../tmp-toolkit-helpers/src/api/toolkit-error.ts
254
+ // lib/api/toolkit-error.ts
255
255
  var TOOLKIT_ERROR_SYMBOL = Symbol.for("@aws-cdk/toolkit-lib.ToolkitError");
256
256
  var AUTHENTICATION_ERROR_SYMBOL = Symbol.for("@aws-cdk/toolkit-lib.AuthenticationError");
257
257
  var ASSEMBLY_ERROR_SYMBOL = Symbol.for("@aws-cdk/toolkit-lib.AssemblyError");
@@ -310,7 +310,7 @@ var ToolkitError = class _ToolkitError extends Error {
310
310
  }
311
311
  };
312
312
 
313
- // ../tmp-toolkit-helpers/src/util/directories.ts
313
+ // lib/util/directories.ts
314
314
  function cdkHomeDir() {
315
315
  const tmpDir = fs2.realpathSync(os.tmpdir());
316
316
  let home;
@@ -344,7 +344,7 @@ function bundledPackageRootDir(start, fail) {
344
344
  return _rootDir(start);
345
345
  }
346
346
 
347
- // ../tmp-toolkit-helpers/src/util/json.ts
347
+ // lib/util/json.ts
348
348
  function getResultObj(jsonObject, identifier, propertiesToReturn) {
349
349
  const propsObj = {};
350
350
  propertiesToReturn.forEach((propName) => {
@@ -365,7 +365,7 @@ function findJsonValue(jsonObject, path4) {
365
365
  return obj;
366
366
  }
367
367
 
368
- // ../tmp-toolkit-helpers/src/util/types.ts
368
+ // lib/util/types.ts
369
369
  function isObject(x) {
370
370
  return x !== null && typeof x === "object" && !isArray(x);
371
371
  }
@@ -374,7 +374,7 @@ function ifDefined(x, def) {
374
374
  return typeof x !== "undefined" ? x : def;
375
375
  }
376
376
 
377
- // ../tmp-toolkit-helpers/src/util/objects.ts
377
+ // lib/util/objects.ts
378
378
  function applyDefaults(hash, defaults) {
379
379
  const result = {};
380
380
  Object.keys(hash).forEach((k) => result[k] = hash[k]);
@@ -525,7 +525,7 @@ function transformObjectKeys(val, transform, exclude = {}) {
525
525
  return ret;
526
526
  }
527
527
 
528
- // ../tmp-toolkit-helpers/src/util/parallel.ts
528
+ // lib/util/parallel.ts
529
529
  async function parallelPromises(n, promises) {
530
530
  const ret = new Array();
531
531
  let count = 0;
@@ -563,7 +563,7 @@ async function parallelPromises(n, promises) {
563
563
  });
564
564
  }
565
565
 
566
- // ../tmp-toolkit-helpers/src/util/package-info.ts
566
+ // lib/util/package-info.ts
567
567
  var path3 = __toESM(require("path"));
568
568
  function displayVersion() {
569
569
  return `${versionNumber()} (build ${commit()})`;
@@ -578,10 +578,10 @@ function commit() {
578
578
  return require(path3.join(bundledPackageRootDir(__dirname), "build-info.json")).commit;
579
579
  }
580
580
 
581
- // ../tmp-toolkit-helpers/src/util/serialize.ts
581
+ // lib/util/serialize.ts
582
582
  var fs3 = __toESM(require("fs/promises"));
583
583
 
584
- // ../tmp-toolkit-helpers/src/util/yaml-cfn.ts
584
+ // lib/util/yaml-cfn.ts
585
585
  var yaml = __toESM(require("yaml"));
586
586
  var yaml_types = __toESM(require("yaml/types"));
587
587
  function serialize(obj) {
@@ -638,7 +638,7 @@ function parseYamlStrWithCfnTags(text) {
638
638
  });
639
639
  }
640
640
 
641
- // ../tmp-toolkit-helpers/src/util/serialize.ts
641
+ // lib/util/serialize.ts
642
642
  function toYAML(obj) {
643
643
  return serialize(obj);
644
644
  }
@@ -678,7 +678,7 @@ function replacerBufferWithInfo(_key, value) {
678
678
  return value;
679
679
  }
680
680
 
681
- // ../tmp-toolkit-helpers/src/util/string-manipulation.ts
681
+ // lib/util/string-manipulation.ts
682
682
  function padLeft(n, x, char = " ") {
683
683
  return char.repeat(Math.max(0, n - x.length)) + x;
684
684
  }
@@ -698,12 +698,12 @@ function lowerCaseFirstCharacter(str) {
698
698
  return str.length > 0 ? `${str[0].toLowerCase()}${str.slice(1)}` : str;
699
699
  }
700
700
 
701
- // ../tmp-toolkit-helpers/src/util/type-brands.ts
701
+ // lib/util/type-brands.ts
702
702
  function createBranded(value) {
703
703
  return value;
704
704
  }
705
705
 
706
- // ../tmp-toolkit-helpers/src/util/version-range.ts
706
+ // lib/util/version-range.ts
707
707
  var semver = __toESM(require("semver"));
708
708
  function rangeFromSemver(ver, targetType) {
709
709
  const re = ver.match(/^([^\d]*)([\d.]*)$/);
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["util.ts", "../../../tmp-toolkit-helpers/src/util/archive.ts", "../../../tmp-toolkit-helpers/src/util/format-error.ts", "../../../tmp-toolkit-helpers/src/util/arrays.ts", "../../../tmp-toolkit-helpers/src/util/bool.ts", "../../../tmp-toolkit-helpers/src/util/bytes.ts", "../../../tmp-toolkit-helpers/src/util/cloudformation.ts", "../../../tmp-toolkit-helpers/src/util/content-hash.ts", "../../../tmp-toolkit-helpers/src/util/directories.ts", "../../../tmp-toolkit-helpers/src/api/toolkit-error.ts", "../../../tmp-toolkit-helpers/src/util/json.ts", "../../../tmp-toolkit-helpers/src/util/types.ts", "../../../tmp-toolkit-helpers/src/util/objects.ts", "../../../tmp-toolkit-helpers/src/util/parallel.ts", "../../../tmp-toolkit-helpers/src/util/package-info.ts", "../../../tmp-toolkit-helpers/src/util/serialize.ts", "../../../tmp-toolkit-helpers/src/util/yaml-cfn.ts", "../../../tmp-toolkit-helpers/src/util/string-manipulation.ts", "../../../tmp-toolkit-helpers/src/util/type-brands.ts", "../../../tmp-toolkit-helpers/src/util/version-range.ts"],
4
- "sourcesContent": ["/* eslint-disable import/no-restricted-paths */\n\nexport * from '../../../tmp-toolkit-helpers/src/util';\n", "import { error } from 'console';\nimport { createWriteStream, promises as fs } from 'fs';\nimport * as path from 'path';\nimport * as glob from 'glob';\nimport { formatErrorMessage } from './format-error';\n\n// eslint-disable-next-line @typescript-eslint/no-require-imports\nconst archiver = require('archiver');\n\n// Adapted from cdk-assets\nexport async function zipDirectory(directory: string, outputFile: string): Promise<void> {\n // We write to a temporary file and rename at the last moment. This is so that if we are\n // interrupted during this process, we don't leave a half-finished file in the target location.\n const temporaryOutputFile = `${outputFile}.${randomString()}._tmp`;\n await writeZipFile(directory, temporaryOutputFile);\n await moveIntoPlace(temporaryOutputFile, outputFile);\n}\n\nfunction writeZipFile(directory: string, outputFile: string): Promise<void> {\n return new Promise(async (ok, fail) => {\n // The below options are needed to support following symlinks when building zip files:\n // - nodir: This will prevent symlinks themselves from being copied into the zip.\n // - follow: This will follow symlinks and copy the files within.\n const globOptions = {\n dot: true,\n nodir: true,\n follow: true,\n cwd: directory,\n };\n const files = glob.sync('**', globOptions); // The output here is already sorted\n\n const output = createWriteStream(outputFile);\n\n const archive = archiver('zip');\n archive.on('warning', fail);\n archive.on('error', fail);\n\n // archive has been finalized and the output file descriptor has closed, resolve promise\n // this has to be done before calling `finalize` since the events may fire immediately after.\n // see https://www.npmjs.com/package/archiver\n output.once('close', ok);\n\n archive.pipe(output);\n\n // Append files serially to ensure file order\n for (const file of files) {\n const fullPath = path.resolve(directory, file);\n // Exactly 2 promises\n // eslint-disable-next-line @cdklabs/promiseall-no-unbounded-parallelism\n const [data, stat] = await Promise.all([fs.readFile(fullPath), fs.stat(fullPath)]);\n archive.append(data, {\n name: file,\n mode: stat.mode,\n });\n }\n\n await archive.finalize();\n });\n}\n\n/**\n * Rename the file to the target location, taking into account:\n *\n * - That we may see EPERM on Windows while an Antivirus scanner still has the\n * file open, so retry a couple of times.\n * - This same function may be called in parallel and be interrupted at any point.\n */\nasync function moveIntoPlace(source: string, target: string) {\n let delay = 100;\n let attempts = 5;\n while (true) {\n try {\n // 'rename' is guaranteed to overwrite an existing target, as long as it is a file (not a directory)\n await fs.rename(source, target);\n return;\n } catch (e: any) {\n if (e.code !== 'EPERM' || attempts-- <= 0) {\n throw e;\n }\n error(formatErrorMessage(e));\n await sleep(Math.floor(Math.random() * delay));\n delay *= 2;\n }\n }\n}\n\nfunction sleep(ms: number) {\n return new Promise(ok => setTimeout(ok, ms));\n}\n\nfunction randomString() {\n return Math.random().toString(36).replace(/[^a-z0-9]+/g, '');\n}\n", "/**\n * Takes in an error and returns a correctly formatted string of its error message.\n * If it is an AggregateError, it will return a string with all the inner errors\n * formatted and separated by a newline.\n *\n * @param error The error to format\n * @returns A string with the error message(s) of the error\n */\nexport function formatErrorMessage(error: any): string {\n if (error && Array.isArray(error.errors)) {\n const innerMessages = error.errors\n .map((innerError: { message: any; toString: () => any }) => (innerError?.message || innerError?.toString()))\n .join('\\n');\n return `AggregateError: ${innerMessages}`;\n }\n\n // Fallback for regular Error or other types\n return error?.message || error?.toString() || 'Unknown error';\n}\n", "/**\n * Map a function over an array and concatenate the results\n */\nexport function flatMap<T, U>(xs: T[], fn: ((x: T, i: number) => U[])): U[] {\n return flatten(xs.map(fn));\n}\n\n/**\n * Flatten a list of lists into a list of elements\n */\nexport function flatten<T>(xs: T[][]): T[] {\n return Array.prototype.concat.apply([], xs);\n}\n\n/**\n * Partition a collection by removing and returning all elements that match a predicate\n *\n * Note: the input collection is modified in-place!\n */\nexport function partition<T>(collection: T[], pred: (x: T) => boolean): T[] {\n const ret: T[] = [];\n let i = 0;\n while (i < collection.length) {\n if (pred(collection[i])) {\n ret.push(collection.splice(i, 1)[0]);\n } else {\n i++;\n }\n }\n return ret;\n}\n", "/**\n * Converts a boolean into a number.\n *\n * @param bool input boolean\n * @returns 1 if bool is true, and 0 if false\n */\nexport function numberFromBool(bool: boolean): number {\n return +bool;\n}\n", "/**\n * Format bytes as a human readable string\n *\n * @param bytes Number of bytes to format\n * @param decimals Number of decimal places to show (default 2)\n * @returns Formatted string with appropriate unit suffix\n */\nexport function formatBytes(bytes: number, decimals: number = 2): string {\n decimals = decimals < 0 ? 0 : decimals;\n\n if (bytes === 0) {\n return '0 Bytes';\n }\n\n const k = 1024;\n const sizes = ['Bytes', 'KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB', 'ZiB', 'YiB'];\n\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n\n return `${parseFloat((bytes / Math.pow(k, i)).toFixed(decimals))} ${sizes[i]}`;\n}\n", "/**\n * Validate SNS topic arn\n */\nexport function validateSnsTopicArn(arn: string): boolean {\n return /^arn:aws:sns:[a-z0-9\\-]+:[0-9]+:[a-z0-9\\-\\_]+$/i.test(arn);\n}\n\n/**\n * Does a Stack Event have an error message based on the status.\n */\nexport function stackEventHasErrorMessage(status: string): boolean {\n return status.endsWith('_FAILED') || status === 'ROLLBACK_IN_PROGRESS' || status === 'UPDATE_ROLLBACK_IN_PROGRESS';\n}\n\n/**\n * Calculate the maximal length of all resource types for a given template.\n *\n * @param template the stack template to analyze\n * @param startWidth the initial width to start with. Defaults to the length of 'AWS::CloudFormation::Stack'.\n * @returns the determined width\n */\nexport function maxResourceTypeLength(template: any, startWidth = 'AWS::CloudFormation::Stack'.length): number {\n const resources = (template && template.Resources) || {};\n let maxWidth = startWidth;\n for (const id of Object.keys(resources)) {\n const type = resources[id].Type || '';\n if (type.length > maxWidth) {\n maxWidth = type.length;\n }\n }\n return maxWidth;\n}\n", "import * as crypto from 'crypto';\n\nexport function contentHash(data: string | Buffer | DataView) {\n return crypto.createHash('sha256').update(data).digest('hex');\n}\n\n/**\n * A stably sorted hash of an arbitrary JS object\n */\nexport function contentHashAny(value: unknown) {\n const ret = crypto.createHash('sha256');\n recurse(value);\n return ret.digest('hex');\n\n function recurse(x: unknown) {\n if (typeof x === 'string') {\n ret.update(x);\n return;\n }\n\n if (Array.isArray(x)) {\n ret.update('[');\n for (const e of x) {\n recurse(e);\n ret.update('||');\n }\n ret.update(']');\n return;\n }\n\n if (x && typeof x === 'object') {\n ret.update('{');\n for (const key of Object.keys(x).sort()) {\n ret.update(key);\n ret.update(':');\n recurse((x as any)[key]);\n }\n ret.update('}');\n return;\n }\n\n ret.update(`${x}${typeof x}`); // typeof to make sure hash('123') !== hash(123)\n }\n}\n", "import * as fs from 'fs';\nimport * as os from 'os';\nimport * as path from 'path';\nimport { ToolkitError } from '../api/toolkit-error';\n\n/**\n * Return a location that will be used as the CDK home directory.\n * Currently the only thing that is placed here is the cache.\n *\n * First try to use the users home directory (i.e. /home/someuser/),\n * but if that directory does not exist for some reason create a tmp directory.\n *\n * Typically it wouldn't make sense to create a one time use tmp directory for\n * the purpose of creating a cache, but since this only applies to users that do\n * not have a home directory (some CI systems?) this should be fine.\n */\nexport function cdkHomeDir() {\n const tmpDir = fs.realpathSync(os.tmpdir());\n let home;\n try {\n let userInfoHome: string | undefined = os.userInfo().homedir;\n // Node returns this if the user doesn't have a home directory\n /* c8 ignore start */ // will not happen in normal setups\n if (userInfoHome == '/var/empty') {\n userInfoHome = undefined;\n }\n /* c8 ignore stop */\n home = path.join((userInfoHome ?? os.homedir()).trim(), '.cdk');\n } catch {\n }\n return process.env.CDK_HOME\n ? path.resolve(process.env.CDK_HOME)\n : home || fs.mkdtempSync(path.join(tmpDir, '.cdk')).trim();\n}\n\nexport function cdkCacheDir() {\n return path.join(cdkHomeDir(), 'cache');\n}\n\n/**\n * From the start location, find the directory that contains the bundled package's package.json\n *\n * You must assume the caller of this function will be bundled and the package root dir\n * is not going to be the same as the package the caller currently lives in.\n */\nexport function bundledPackageRootDir(start: string): string;\nexport function bundledPackageRootDir(start: string, fail: true): string;\nexport function bundledPackageRootDir(start: string, fail: false): string | undefined;\nexport function bundledPackageRootDir(start: string, fail?: boolean) {\n function _rootDir(dirname: string): string | undefined {\n const manifestPath = path.join(dirname, 'package.json');\n if (fs.existsSync(manifestPath)) {\n return dirname;\n }\n if (path.dirname(dirname) === dirname) {\n if (fail ?? true) {\n throw new ToolkitError('Unable to find package manifest');\n }\n return undefined;\n }\n return _rootDir(path.dirname(dirname));\n }\n\n return _rootDir(start);\n}\n", "import type * as cxapi from '@aws-cdk/cx-api';\n\nconst TOOLKIT_ERROR_SYMBOL = Symbol.for('@aws-cdk/toolkit-lib.ToolkitError');\nconst AUTHENTICATION_ERROR_SYMBOL = Symbol.for('@aws-cdk/toolkit-lib.AuthenticationError');\nconst ASSEMBLY_ERROR_SYMBOL = Symbol.for('@aws-cdk/toolkit-lib.AssemblyError');\nconst CONTEXT_PROVIDER_ERROR_SYMBOL = Symbol.for('@aws-cdk/toolkit-lib.ContextProviderError');\n\n/**\n * Represents a general toolkit error in the AWS CDK Toolkit.\n */\nexport class ToolkitError extends Error {\n /**\n * Determines if a given error is an instance of ToolkitError.\n */\n public static isToolkitError(x: any): x is ToolkitError {\n return x !== null && typeof(x) === 'object' && TOOLKIT_ERROR_SYMBOL in x;\n }\n\n /**\n * Determines if a given error is an instance of AuthenticationError.\n */\n public static isAuthenticationError(x: any): x is AuthenticationError {\n return this.isToolkitError(x) && AUTHENTICATION_ERROR_SYMBOL in x;\n }\n\n /**\n * Determines if a given error is an instance of AssemblyError.\n */\n public static isAssemblyError(x: any): x is AssemblyError {\n return this.isToolkitError(x) && ASSEMBLY_ERROR_SYMBOL in x;\n }\n\n /**\n * Determines if a given error is an instance of AssemblyError.\n */\n public static isContextProviderError(x: any): x is ContextProviderError {\n return this.isToolkitError(x) && CONTEXT_PROVIDER_ERROR_SYMBOL in x;\n }\n\n /**\n * An AssemblyError with an original error as cause\n */\n public static withCause(message: string, error: unknown): ToolkitError {\n return new ToolkitError(message, 'toolkit', error);\n }\n\n /**\n * The type of the error, defaults to \"toolkit\".\n */\n public readonly type: string;\n\n /**\n * Denotes the source of the error as the toolkit.\n */\n public readonly source: 'toolkit' | 'user';\n\n /**\n * The specific original cause of the error, if available\n */\n public readonly cause?: unknown;\n\n constructor(message: string, type: string = 'toolkit', cause?: unknown) {\n super(message);\n Object.setPrototypeOf(this, ToolkitError.prototype);\n Object.defineProperty(this, TOOLKIT_ERROR_SYMBOL, { value: true });\n this.name = new.target.name;\n this.type = type;\n this.source = 'toolkit';\n this.cause = cause;\n }\n}\n\n/**\n * Represents an authentication-specific error in the AWS CDK Toolkit.\n */\nexport class AuthenticationError extends ToolkitError {\n /**\n * Denotes the source of the error as user.\n */\n public readonly source = 'user';\n\n constructor(message: string) {\n super(message, 'authentication');\n Object.setPrototypeOf(this, AuthenticationError.prototype);\n Object.defineProperty(this, AUTHENTICATION_ERROR_SYMBOL, { value: true });\n }\n}\n\n/**\n * Represents an error causes by cloud assembly synthesis\n *\n * This includes errors thrown during app execution, as well as failing annotations.\n */\nexport class AssemblyError extends ToolkitError {\n /**\n * An AssemblyError with an original error as cause\n */\n public static withCause(message: string, error: unknown): AssemblyError {\n return new AssemblyError(message, undefined, error);\n }\n\n /**\n * An AssemblyError with a list of stacks as cause\n */\n public static withStacks(message: string, stacks?: cxapi.CloudFormationStackArtifact[]): AssemblyError {\n return new AssemblyError(message, stacks);\n }\n\n /**\n * Denotes the source of the error as user.\n */\n public readonly source = 'user';\n\n /**\n * The stacks that caused the error, if available\n *\n * The `messages` property of each `cxapi.CloudFormationStackArtifact` will contain the respective errors.\n * Absence indicates synthesis didn't fully complete.\n */\n public readonly stacks?: cxapi.CloudFormationStackArtifact[];\n\n private constructor(message: string, stacks?: cxapi.CloudFormationStackArtifact[], cause?: unknown) {\n super(message, 'assembly', cause);\n Object.setPrototypeOf(this, AssemblyError.prototype);\n Object.defineProperty(this, ASSEMBLY_ERROR_SYMBOL, { value: true });\n this.stacks = stacks;\n }\n}\n\n/**\n * Represents an error originating from a Context Provider\n */\nexport class ContextProviderError extends ToolkitError {\n /**\n * Denotes the source of the error as user.\n */\n public readonly source = 'user';\n\n constructor(message: string) {\n super(message, 'context-provider');\n Object.setPrototypeOf(this, ContextProviderError.prototype);\n Object.defineProperty(this, CONTEXT_PROVIDER_ERROR_SYMBOL, { value: true });\n }\n}\n", "/**\n * This gets the values of the jsonObject at the paths specified in propertiesToReturn.\n *\n * For example, jsonObject = {\n * key1: 'abc',\n * key2: {\n * foo: 'qwerty',\n * bar: 'data',\n * }\n * }\n *\n * propertiesToReturn = ['key1', 'key2.foo'];\n *\n * The returned object is:\n *\n * ```\n * {\n * key1: 'abc',\n * 'key2.foo': 'qwerty',\n * Identifier: identifier\n * }\n * ```\n */\nexport function getResultObj(jsonObject: any, identifier: string, propertiesToReturn: string[]): {[key: string]: any} {\n const propsObj = {};\n propertiesToReturn.forEach((propName) => {\n Object.assign(propsObj, { [propName]: findJsonValue(jsonObject, propName) });\n });\n Object.assign(propsObj, { ['Identifier']: identifier });\n return propsObj;\n}\n\n/**\n * This finds the value of the jsonObject at the path. Path is delimited by '.'.\n *\n * For example, jsonObject = {\n * key1: 'abc',\n * key2: {\n * foo: 'qwerty',\n * bar: 'data',\n * }\n * }\n *\n * If path is 'key1', then it will return 'abc'.\n * If path is 'key2.foo', then it will return 'qwerty'.\n * If path is 'key2', then it will return the object:\n * {\n * foo: 'qwerty',\n * bar: 'data',\n * }\n *\n * If the path is not found, an Error will be thrown stating which token is missing.\n */\nexport function findJsonValue(jsonObject: any, path: string): any {\n const paths = path.split('.');\n let obj = jsonObject;\n paths.forEach(p => {\n obj = obj[p];\n if (obj === undefined) {\n throw new TypeError(`Cannot read field ${path}. ${p} is not found.`);\n }\n });\n return obj;\n}\n", "/**\n * Type of a map mapping strings to some arbitrary type\n *\n * Name is not ideal, but:\n *\n * - Cannot call it Object, that already means something.\n * - Cannot call it Dict or Dictionary, since in other languages\n * those also allow specifying the key type.\n */\nexport type Obj<T> = {[key: string]: T};\n\n/**\n * Return whether the given value is an object\n *\n * Even though arrays technically are objects, we usually want to treat them differently,\n * so we return false in those cases.\n */\nexport function isObject(x: any): x is Obj<any> {\n return x !== null && typeof x === 'object' && !isArray(x);\n}\n\n/**\n * Return whether the given value is an array\n */\nexport const isArray = Array.isArray;\n\n/**\n * Return the value of the first argument if it's not undefined, otherwise the default\n */\nexport function ifDefined<T>(x: T | undefined, def: T): T {\n return typeof x !== 'undefined' ? x : def;\n}\n", "import type { Obj } from './types';\nimport { isArray, isObject } from './types';\nimport { ToolkitError } from '../api/toolkit-error';\n\n/**\n * Return a new object by adding missing keys into another object\n */\nexport function applyDefaults(hash: any, defaults: any) {\n const result: any = { };\n\n Object.keys(hash).forEach(k => result[k] = hash[k]);\n\n Object.keys(defaults)\n .filter(k => !(k in result))\n .forEach(k => result[k] = defaults[k]);\n\n return result;\n}\n\n/**\n * Return whether the given parameter is an empty object or empty list.\n */\nexport function isEmpty(x: any) {\n if (x == null) {\n return false;\n }\n if (isArray(x)) {\n return x.length === 0;\n }\n return Object.keys(x).length === 0;\n}\n\n/**\n * Deep clone a tree of objects, lists or scalars\n *\n * Does not support cycles.\n */\nexport function deepClone(x: any): any {\n if (typeof x === 'undefined') {\n return undefined;\n }\n if (x === null) {\n return null;\n }\n if (isArray(x)) {\n return x.map(deepClone);\n }\n if (isObject(x)) {\n return makeObject(mapObject(x, (k, v) => [k, deepClone(v)] as [string, any]));\n }\n return x;\n}\n\n/**\n * Map over an object, treating it as a dictionary\n */\nexport function mapObject<T, U>(x: Obj<T>, fn: (key: string, value: T) => U): U[] {\n const ret: U[] = [];\n Object.keys(x).forEach(key => {\n ret.push(fn(key, x[key]));\n });\n return ret;\n}\n\n/**\n * Construct an object from a list of (k, v) pairs\n */\nexport function makeObject<T>(pairs: Array<[string, T]>): Obj<T> {\n const ret: Obj<T> = {};\n for (const pair of pairs) {\n ret[pair[0]] = pair[1];\n }\n return ret;\n}\n\n/**\n * Deep get a value from a tree of nested objects\n *\n * Returns undefined if any part of the path was unset or\n * not an object.\n */\nexport function deepGet(x: any, path: string[]): any {\n path = path.slice();\n\n while (path.length > 0 && isObject(x)) {\n const key = path.shift()!;\n x = x[key];\n }\n return path.length === 0 ? x : undefined;\n}\n\n/**\n * Deep set a value in a tree of nested objects\n *\n * Throws an error if any part of the path is not an object.\n */\nexport function deepSet(x: any, path: string[], value: any) {\n path = path.slice();\n\n if (path.length === 0) {\n throw new ToolkitError('Path may not be empty');\n }\n\n while (path.length > 1 && isObject(x)) {\n const key = path.shift()!;\n\n if (isPrototypePollutingKey(key)) {\n continue;\n }\n\n if (!(key in x)) {\n x[key] = {};\n }\n x = x[key];\n }\n\n if (!isObject(x)) {\n throw new ToolkitError(`Expected an object, got '${x}'`);\n }\n\n const finalKey = path[0];\n\n if (isPrototypePollutingKey(finalKey)) {\n return;\n }\n\n if (value !== undefined) {\n x[finalKey] = value;\n } else {\n delete x[finalKey];\n }\n}\n\n/**\n * Helper to detect prototype polluting keys\n *\n * A key matching this, MUST NOT be used in an assignment.\n * Use this to check user-input.\n */\nfunction isPrototypePollutingKey(key: string) {\n return key === '__proto__' || key === 'constructor' || key === 'prototype';\n}\n\n/**\n * Recursively merge objects together\n *\n * The leftmost object is mutated and returned. Arrays are not merged\n * but overwritten just like scalars.\n *\n * If an object is merged into a non-object, the non-object is lost.\n */\nexport function deepMerge(...objects: Array<Obj<any> | undefined>) {\n function mergeOne(target: Obj<any>, source: Obj<any>) {\n for (const key of Object.keys(source)) {\n if (isPrototypePollutingKey(key)) {\n continue;\n }\n\n const value = source[key];\n\n if (isObject(value)) {\n if (!isObject(target[key])) {\n target[key] = {};\n } // Overwrite on purpose\n mergeOne(target[key], value);\n } else if (typeof value !== 'undefined') {\n target[key] = value;\n }\n }\n }\n\n const others = objects.filter(x => x != null) as Array<Obj<any>>;\n\n if (others.length === 0) {\n return {};\n }\n const into = others.splice(0, 1)[0];\n\n others.forEach(other => mergeOne(into, other));\n return into;\n}\n\n/**\n * Splits the given object into two, such that:\n *\n * 1. The size of the first object (after stringified in UTF-8) is less than or equal to the provided size limit.\n * 2. Merging the two objects results in the original one.\n */\nexport function splitBySize(data: any, maxSizeBytes: number): [any, any] {\n if (maxSizeBytes < 2) {\n // It's impossible to fit anything in the first object\n return [undefined, data];\n }\n const entries = Object.entries(data);\n return recurse(0, 0);\n\n function recurse(index: number, runningTotalSize: number): [any, any] {\n if (index >= entries.length) {\n // Everything fits in the first object\n return [data, undefined];\n }\n\n const size = runningTotalSize + entrySize(entries[index]);\n return (size > maxSizeBytes) ? cutAt(index) : recurse(index + 1, size);\n }\n\n function entrySize(entry: [string, unknown]) {\n return Buffer.byteLength(JSON.stringify(Object.fromEntries([entry])));\n }\n\n function cutAt(index: number): [any, any] {\n return [\n Object.fromEntries(entries.slice(0, index)),\n Object.fromEntries(entries.slice(index)),\n ];\n }\n}\n\ntype Exclude = { [key: string]: Exclude | true };\n\n/**\n * This function transforms all keys (recursively) in the provided `val` object.\n *\n * @param val The object whose keys need to be transformed.\n * @param transform The function that will be applied to each key.\n * @param exclude The keys that will not be transformed and copied to output directly\n * @returns A new object with the same values as `val`, but with all keys transformed according to `transform`.\n */\nexport function transformObjectKeys(val: any, transform: (str: string) => string, exclude: Exclude = {}): any {\n if (val == null || typeof val !== 'object') {\n return val;\n }\n if (Array.isArray(val)) {\n // For arrays we just pass parent's exclude object directly\n // since it makes no sense to specify different exclude options for each array element\n return val.map((input: any) => transformObjectKeys(input, transform, exclude));\n }\n const ret: { [k: string]: any } = {};\n for (const [k, v] of Object.entries(val)) {\n const childExclude = exclude[k];\n if (childExclude === true) {\n // we don't transform this object if the key is specified in exclude\n ret[transform(k)] = v;\n } else {\n ret[transform(k)] = transformObjectKeys(v, transform, childExclude);\n }\n }\n return ret;\n}\n", "/**\n * Run a number of promise generators with max parallelism\n *\n * Order is not maintained between the input and output.\n */\nexport async function parallelPromises<A>(n: number, promises: Array<() => Promise<A>>): Promise<Array<A>> {\n const ret = new Array<A>();\n let count = 0;\n let error: Error | undefined;\n const queue = [...promises];\n\n return new Promise((ok, ko) => {\n tick();\n\n function tick() {\n if (count === 0 && error) {\n ko(error);\n return;\n }\n if (count === 0 && queue.length === 0) {\n ok(ret);\n return;\n }\n\n while (count < n && queue.length > 0 && !error) {\n const next = queue.shift();\n if (next !== undefined) {\n start(next);\n }\n }\n }\n\n function start(fn: () => Promise<A>) {\n count += 1;\n fn()\n .then((result) => {\n ret.push(result);\n })\n .catch((e) => {\n error = e;\n })\n .finally(() => {\n count -= 1;\n tick();\n });\n }\n });\n}\n", "import * as path from 'path';\nimport { bundledPackageRootDir } from './directories';\n\nexport function displayVersion() {\n return `${versionNumber()} (build ${commit()})`;\n}\n\nexport function isDeveloperBuild(): boolean {\n return versionNumber() === '0.0.0';\n}\n\nexport function versionNumber(): string {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n return require(path.join(bundledPackageRootDir(__dirname), 'package.json')).version.replace(/\\+[0-9a-f]+$/, '');\n}\n\nfunction commit(): string {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n return require(path.join(bundledPackageRootDir(__dirname), 'build-info.json')).commit;\n}\n", "import * as fs from 'fs/promises';\nimport { formatBytes } from './bytes';\nimport * as yaml_cfn from './yaml-cfn';\n\n/**\n * Stringify to YAML\n */\nexport function toYAML(obj: any): string {\n return yaml_cfn.serialize(obj);\n}\n\n/**\n * Parse either YAML or JSON\n */\nexport function deserializeStructure(str: string): any {\n return yaml_cfn.deserialize(str);\n}\n\n/**\n * Serialize to either YAML or JSON\n */\nexport function serializeStructure(object: any, json: boolean) {\n if (json) {\n return JSON.stringify(object, undefined, 2);\n } else {\n return toYAML(object);\n }\n}\n\n/**\n * Load a YAML or JSON file from disk\n */\nexport async function loadStructuredFile(fileName: string) {\n const contents = await fs.readFile(fileName, { encoding: 'utf-8' });\n return deserializeStructure(contents);\n}\n\n/**\n * Remove any template elements that we don't want to show users.\n */\nexport function obscureTemplate(template: any = {}) {\n if (template.Rules) {\n // see https://github.com/aws/aws-cdk/issues/17942\n if (template.Rules.CheckBootstrapVersion) {\n if (Object.keys(template.Rules).length > 1) {\n delete template.Rules.CheckBootstrapVersion;\n } else {\n delete template.Rules;\n }\n }\n }\n\n return template;\n}\n\n/**\n * Detects a buffer that has been converted to a JSON-like object\n * In Node, `Buffer`s have `toJSON()` method that converts the buffer\n * into a JS object that can be JSON stringified.\n * Unfortunately this conversion happens before the replacer is called,\n * so normal means of detecting a `Buffer` objet don't work anymore.\n * @see https://github.com/nodejs/node-v0.x-archive/issues/5110\n */\nfunction isJsonBuffer(value: any): value is {\n type: 'Buffer';\n data: number[];\n} {\n return typeof value === 'object'\n && 'type' in value\n && value.type === 'Buffer'\n && 'data' in value\n && Array.isArray(value.data);\n}\n\n/**\n * A JSON.stringify() replacer that converts Buffers into a string with information\n * Use this if you plan to print out JSON stringified objects that may contain a Buffer.\n * Without this, large buffers (think: Megabytes) will completely fill up the output\n * and even crash the system.\n */\nexport function replacerBufferWithInfo(_key: any, value: any): any {\n if (isJsonBuffer(value)) {\n return `<Buffer: ${formatBytes(value.data.length)}>`;\n }\n return value;\n}\n", "import * as yaml from 'yaml';\nimport type * as yaml_cst from 'yaml/parse-cst';\nimport * as yaml_types from 'yaml/types';\n\n/**\n * Serializes the given data structure into valid YAML.\n *\n * @param obj the data structure to serialize\n * @returns a string containing the YAML representation of {@param obj}\n */\nexport function serialize(obj: any): string {\n const oldFold = yaml_types.strOptions.fold.lineWidth;\n try {\n yaml_types.strOptions.fold.lineWidth = 0;\n return yaml.stringify(obj, { schema: 'yaml-1.1' });\n } finally {\n yaml_types.strOptions.fold.lineWidth = oldFold;\n }\n}\n\n/**\n * Deserialize the YAML into the appropriate data structure.\n *\n * @param str the string containing YAML\n * @returns the data structure the YAML represents\n * (most often in case of CloudFormation, an object)\n */\nexport function deserialize(str: string): any {\n return parseYamlStrWithCfnTags(str);\n}\n\nfunction makeTagForCfnIntrinsic(intrinsicName: string, addFnPrefix: boolean): yaml_types.Schema.CustomTag {\n return {\n identify(value: any) {\n return typeof value === 'string';\n },\n tag: `!${intrinsicName}`,\n resolve: (_doc: yaml.Document, cstNode: yaml_cst.CST.Node) => {\n const ret: any = {};\n ret[addFnPrefix ? `Fn::${intrinsicName}` : intrinsicName] =\n // the +1 is to account for the ! the short form begins with\n parseYamlStrWithCfnTags(cstNode.toString().substring(intrinsicName.length + 1));\n return ret;\n },\n };\n}\n\nconst shortForms: yaml_types.Schema.CustomTag[] = [\n 'Base64', 'Cidr', 'FindInMap', 'GetAZs', 'ImportValue', 'Join', 'Sub',\n 'Select', 'Split', 'Transform', 'And', 'Equals', 'If', 'Not', 'Or', 'GetAtt',\n].map(name => makeTagForCfnIntrinsic(name, true)).concat(\n makeTagForCfnIntrinsic('Ref', false),\n makeTagForCfnIntrinsic('Condition', false),\n);\n\nfunction parseYamlStrWithCfnTags(text: string): any {\n return yaml.parse(text, {\n customTags: shortForms,\n schema: 'core',\n });\n}\n", "/**\n * Pad 's' on the left with 'char' until it is n characters wide\n */\nexport function padLeft(n: number, x: string, char: string = ' '): string {\n return char.repeat(Math.max(0, n - x.length)) + x;\n}\n\n/**\n * Pad 's' on the right with 'char' until it is n characters wide\n */\nexport function padRight(n: number, x: string, char: string = ' '): string {\n return x + char.repeat(Math.max(0, n - x.length));\n}\n\n/**\n * Formats time in milliseconds (which we get from 'Date.getTime()')\n * to a human-readable time; returns time in seconds rounded to 2\n * decimal places.\n */\nexport function formatTime(num: number): number {\n return roundPercentage(millisecondsToSeconds(num));\n}\n\n/**\n * Rounds a decimal number to two decimal points.\n * The function is useful for fractions that need to be outputted as percentages.\n */\nfunction roundPercentage(num: number): number {\n return Math.round(100 * num) / 100;\n}\n\n/**\n * Given a time in milliseconds, return an equivalent amount in seconds.\n */\nfunction millisecondsToSeconds(num: number): number {\n return num / 1000;\n}\n\n/**\n * This function lower cases the first character of the string provided.\n */\nexport function lowerCaseFirstCharacter(str: string): string {\n return str.length > 0 ? `${str[0].toLowerCase()}${str.slice(1)}` : str;\n}\n", "/**\n * Type branding\n *\n * This allows marking certain types as having gone through particular operations.\n *\n * Branded types can be used anywhere the base type is expected, but the base type\n * cannot be used where a branded type is expected; the values have to go through\n * a type assertion operation to confirm their brand.\n *\n * Usage:\n *\n * ```\n * type ValidatedString = Branded<string, 'PassedMyValidation'>;\n *\n * function validate(x: string): asserts x is ValidatedString {\n * // ... throw an error if not\n * }\n *\n * function isValid(x: string): x is ValidatedString {\n * // ... throw an error if not\n * }\n * ```\n */\n\n// This construct purely happens at type checking time. There is no run-time impact.\n// Hence, we never even have to construct values of this type.\ndeclare const __brand: unique symbol;\n\nexport type Brand<B> = { [__brand]: B };\nexport type Branded<T, B> = T & Brand<B>;\n\n/**\n * Marks a value as being branded a certain way.\n *\n * You should in general avoid calling this, and use validation or\n * asserting functions instead. However, this can be useful to produce\n * values which are branded by construction (really just an elaborate\n * way to write 'as').\n */\n/* c8 ignore start */\nexport function createBranded<A extends Branded<any, any>>(value: TypeUnderlyingBrand<A>): A {\n return value as A;\n}\n/* c8 ignore stop */\n\ntype TypeUnderlyingBrand<A> = A extends Branded<infer T, any> ? T : never;\n", "import * as semver from 'semver';\nimport { ToolkitError } from '../api/toolkit-error';\n\n// bracket - https://docs.oracle.com/middleware/1212/core/MAVEN/maven_version.htm#MAVEN401\n// pep - https://www.python.org/dev/peps/pep-0440/#version-specifiers\nexport type RangeType = 'bracket' | 'pep'\n\nexport function rangeFromSemver(ver: string, targetType: RangeType) {\n const re = ver.match(/^([^\\d]*)([\\d.]*)$/);\n if (!re || !semver.valid(re[2])) {\n throw new ToolkitError('not a semver or unsupported range syntax');\n }\n const prefixPart = re[1];\n const verPart = re[2];\n\n switch (targetType) {\n case 'bracket':\n switch (prefixPart) {\n case '':\n // if there's no prefix and the remaining is a valid semver, there's no range specified\n return ver;\n case '^':\n return `[${verPart},${semver.major(verPart)+1}.0.0)`;\n default:\n throw new ToolkitError(`unsupported range syntax - ${prefixPart}`);\n }\n case 'pep':\n switch (prefixPart) {\n case '':\n // if there's no prefix and the remaining is a valid semver, there's no range specified\n return `==${ver}`;\n case '^':\n return `>=${verPart},<${semver.major(verPart)+1}.0.0`;\n default:\n throw new ToolkitError(`unsupported range syntax - ${prefixPart}`);\n }\n }\n}\n"],
3
+ "sources": ["util.ts", "../util/archive.ts", "../util/format-error.ts", "../util/arrays.ts", "../util/bool.ts", "../util/bytes.ts", "../util/cloudformation.ts", "../util/content-hash.ts", "../util/directories.ts", "../api/toolkit-error.ts", "../util/json.ts", "../util/types.ts", "../util/objects.ts", "../util/parallel.ts", "../util/package-info.ts", "../util/serialize.ts", "../util/yaml-cfn.ts", "../util/string-manipulation.ts", "../util/type-brands.ts", "../util/version-range.ts"],
4
+ "sourcesContent": ["/* eslint-disable import/no-restricted-paths */\n\nexport * from '../util';\n", "import { error } from 'console';\nimport { createWriteStream, promises as fs } from 'fs';\nimport * as path from 'path';\nimport * as glob from 'glob';\nimport { formatErrorMessage } from './format-error';\n\n// eslint-disable-next-line @typescript-eslint/no-require-imports\nconst archiver = require('archiver');\n\n// Adapted from cdk-assets\nexport async function zipDirectory(directory: string, outputFile: string): Promise<void> {\n // We write to a temporary file and rename at the last moment. This is so that if we are\n // interrupted during this process, we don't leave a half-finished file in the target location.\n const temporaryOutputFile = `${outputFile}.${randomString()}._tmp`;\n await writeZipFile(directory, temporaryOutputFile);\n await moveIntoPlace(temporaryOutputFile, outputFile);\n}\n\nfunction writeZipFile(directory: string, outputFile: string): Promise<void> {\n return new Promise(async (ok, fail) => {\n // The below options are needed to support following symlinks when building zip files:\n // - nodir: This will prevent symlinks themselves from being copied into the zip.\n // - follow: This will follow symlinks and copy the files within.\n const globOptions = {\n dot: true,\n nodir: true,\n follow: true,\n cwd: directory,\n };\n const files = glob.sync('**', globOptions); // The output here is already sorted\n\n const output = createWriteStream(outputFile);\n\n const archive = archiver('zip');\n archive.on('warning', fail);\n archive.on('error', fail);\n\n // archive has been finalized and the output file descriptor has closed, resolve promise\n // this has to be done before calling `finalize` since the events may fire immediately after.\n // see https://www.npmjs.com/package/archiver\n output.once('close', ok);\n\n archive.pipe(output);\n\n // Append files serially to ensure file order\n for (const file of files) {\n const fullPath = path.resolve(directory, file);\n // Exactly 2 promises\n // eslint-disable-next-line @cdklabs/promiseall-no-unbounded-parallelism\n const [data, stat] = await Promise.all([fs.readFile(fullPath), fs.stat(fullPath)]);\n archive.append(data, {\n name: file,\n mode: stat.mode,\n });\n }\n\n await archive.finalize();\n });\n}\n\n/**\n * Rename the file to the target location, taking into account:\n *\n * - That we may see EPERM on Windows while an Antivirus scanner still has the\n * file open, so retry a couple of times.\n * - This same function may be called in parallel and be interrupted at any point.\n */\nasync function moveIntoPlace(source: string, target: string) {\n let delay = 100;\n let attempts = 5;\n while (true) {\n try {\n // 'rename' is guaranteed to overwrite an existing target, as long as it is a file (not a directory)\n await fs.rename(source, target);\n return;\n } catch (e: any) {\n if (e.code !== 'EPERM' || attempts-- <= 0) {\n throw e;\n }\n error(formatErrorMessage(e));\n await sleep(Math.floor(Math.random() * delay));\n delay *= 2;\n }\n }\n}\n\nfunction sleep(ms: number) {\n return new Promise(ok => setTimeout(ok, ms));\n}\n\nfunction randomString() {\n return Math.random().toString(36).replace(/[^a-z0-9]+/g, '');\n}\n", "/**\n * Takes in an error and returns a correctly formatted string of its error message.\n * If it is an AggregateError, it will return a string with all the inner errors\n * formatted and separated by a newline.\n *\n * @param error The error to format\n * @returns A string with the error message(s) of the error\n */\nexport function formatErrorMessage(error: any): string {\n if (error && Array.isArray(error.errors)) {\n const innerMessages = error.errors\n .map((innerError: { message: any; toString: () => any }) => (innerError?.message || innerError?.toString()))\n .join('\\n');\n return `AggregateError: ${innerMessages}`;\n }\n\n // Fallback for regular Error or other types\n return error?.message || error?.toString() || 'Unknown error';\n}\n", "/**\n * Map a function over an array and concatenate the results\n */\nexport function flatMap<T, U>(xs: T[], fn: ((x: T, i: number) => U[])): U[] {\n return flatten(xs.map(fn));\n}\n\n/**\n * Flatten a list of lists into a list of elements\n */\nexport function flatten<T>(xs: T[][]): T[] {\n return Array.prototype.concat.apply([], xs);\n}\n\n/**\n * Partition a collection by removing and returning all elements that match a predicate\n *\n * Note: the input collection is modified in-place!\n */\nexport function partition<T>(collection: T[], pred: (x: T) => boolean): T[] {\n const ret: T[] = [];\n let i = 0;\n while (i < collection.length) {\n if (pred(collection[i])) {\n ret.push(collection.splice(i, 1)[0]);\n } else {\n i++;\n }\n }\n return ret;\n}\n", "/**\n * Converts a boolean into a number.\n *\n * @param bool input boolean\n * @returns 1 if bool is true, and 0 if false\n */\nexport function numberFromBool(bool: boolean): number {\n return +bool;\n}\n", "/**\n * Format bytes as a human readable string\n *\n * @param bytes Number of bytes to format\n * @param decimals Number of decimal places to show (default 2)\n * @returns Formatted string with appropriate unit suffix\n */\nexport function formatBytes(bytes: number, decimals: number = 2): string {\n decimals = decimals < 0 ? 0 : decimals;\n\n if (bytes === 0) {\n return '0 Bytes';\n }\n\n const k = 1024;\n const sizes = ['Bytes', 'KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB', 'ZiB', 'YiB'];\n\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n\n return `${parseFloat((bytes / Math.pow(k, i)).toFixed(decimals))} ${sizes[i]}`;\n}\n", "/**\n * Validate SNS topic arn\n */\nexport function validateSnsTopicArn(arn: string): boolean {\n return /^arn:aws:sns:[a-z0-9\\-]+:[0-9]+:[a-z0-9\\-\\_]+$/i.test(arn);\n}\n\n/**\n * Does a Stack Event have an error message based on the status.\n */\nexport function stackEventHasErrorMessage(status: string): boolean {\n return status.endsWith('_FAILED') || status === 'ROLLBACK_IN_PROGRESS' || status === 'UPDATE_ROLLBACK_IN_PROGRESS';\n}\n\n/**\n * Calculate the maximal length of all resource types for a given template.\n *\n * @param template the stack template to analyze\n * @param startWidth the initial width to start with. Defaults to the length of 'AWS::CloudFormation::Stack'.\n * @returns the determined width\n */\nexport function maxResourceTypeLength(template: any, startWidth = 'AWS::CloudFormation::Stack'.length): number {\n const resources = (template && template.Resources) || {};\n let maxWidth = startWidth;\n for (const id of Object.keys(resources)) {\n const type = resources[id].Type || '';\n if (type.length > maxWidth) {\n maxWidth = type.length;\n }\n }\n return maxWidth;\n}\n", "import * as crypto from 'crypto';\n\nexport function contentHash(data: string | Buffer | DataView) {\n return crypto.createHash('sha256').update(data).digest('hex');\n}\n\n/**\n * A stably sorted hash of an arbitrary JS object\n */\nexport function contentHashAny(value: unknown) {\n const ret = crypto.createHash('sha256');\n recurse(value);\n return ret.digest('hex');\n\n function recurse(x: unknown) {\n if (typeof x === 'string') {\n ret.update(x);\n return;\n }\n\n if (Array.isArray(x)) {\n ret.update('[');\n for (const e of x) {\n recurse(e);\n ret.update('||');\n }\n ret.update(']');\n return;\n }\n\n if (x && typeof x === 'object') {\n ret.update('{');\n for (const key of Object.keys(x).sort()) {\n ret.update(key);\n ret.update(':');\n recurse((x as any)[key]);\n }\n ret.update('}');\n return;\n }\n\n ret.update(`${x}${typeof x}`); // typeof to make sure hash('123') !== hash(123)\n }\n}\n", "import * as fs from 'fs';\nimport * as os from 'os';\nimport * as path from 'path';\nimport { ToolkitError } from '../api/toolkit-error';\n\n/**\n * Return a location that will be used as the CDK home directory.\n * Currently the only thing that is placed here is the cache.\n *\n * First try to use the users home directory (i.e. /home/someuser/),\n * but if that directory does not exist for some reason create a tmp directory.\n *\n * Typically it wouldn't make sense to create a one time use tmp directory for\n * the purpose of creating a cache, but since this only applies to users that do\n * not have a home directory (some CI systems?) this should be fine.\n */\nexport function cdkHomeDir() {\n const tmpDir = fs.realpathSync(os.tmpdir());\n let home;\n try {\n let userInfoHome: string | undefined = os.userInfo().homedir;\n // Node returns this if the user doesn't have a home directory\n /* c8 ignore start */ // will not happen in normal setups\n if (userInfoHome == '/var/empty') {\n userInfoHome = undefined;\n }\n /* c8 ignore stop */\n home = path.join((userInfoHome ?? os.homedir()).trim(), '.cdk');\n } catch {\n }\n return process.env.CDK_HOME\n ? path.resolve(process.env.CDK_HOME)\n : home || fs.mkdtempSync(path.join(tmpDir, '.cdk')).trim();\n}\n\nexport function cdkCacheDir() {\n return path.join(cdkHomeDir(), 'cache');\n}\n\n/**\n * From the start location, find the directory that contains the bundled package's package.json\n *\n * You must assume the caller of this function will be bundled and the package root dir\n * is not going to be the same as the package the caller currently lives in.\n */\nexport function bundledPackageRootDir(start: string): string;\nexport function bundledPackageRootDir(start: string, fail: true): string;\nexport function bundledPackageRootDir(start: string, fail: false): string | undefined;\nexport function bundledPackageRootDir(start: string, fail?: boolean) {\n function _rootDir(dirname: string): string | undefined {\n const manifestPath = path.join(dirname, 'package.json');\n if (fs.existsSync(manifestPath)) {\n return dirname;\n }\n if (path.dirname(dirname) === dirname) {\n if (fail ?? true) {\n throw new ToolkitError('Unable to find package manifest');\n }\n return undefined;\n }\n return _rootDir(path.dirname(dirname));\n }\n\n return _rootDir(start);\n}\n", "import type * as cxapi from '@aws-cdk/cx-api';\n\nconst TOOLKIT_ERROR_SYMBOL = Symbol.for('@aws-cdk/toolkit-lib.ToolkitError');\nconst AUTHENTICATION_ERROR_SYMBOL = Symbol.for('@aws-cdk/toolkit-lib.AuthenticationError');\nconst ASSEMBLY_ERROR_SYMBOL = Symbol.for('@aws-cdk/toolkit-lib.AssemblyError');\nconst CONTEXT_PROVIDER_ERROR_SYMBOL = Symbol.for('@aws-cdk/toolkit-lib.ContextProviderError');\n\n/**\n * Represents a general toolkit error in the AWS CDK Toolkit.\n */\nexport class ToolkitError extends Error {\n /**\n * Determines if a given error is an instance of ToolkitError.\n */\n public static isToolkitError(x: any): x is ToolkitError {\n return x !== null && typeof(x) === 'object' && TOOLKIT_ERROR_SYMBOL in x;\n }\n\n /**\n * Determines if a given error is an instance of AuthenticationError.\n */\n public static isAuthenticationError(x: any): x is AuthenticationError {\n return this.isToolkitError(x) && AUTHENTICATION_ERROR_SYMBOL in x;\n }\n\n /**\n * Determines if a given error is an instance of AssemblyError.\n */\n public static isAssemblyError(x: any): x is AssemblyError {\n return this.isToolkitError(x) && ASSEMBLY_ERROR_SYMBOL in x;\n }\n\n /**\n * Determines if a given error is an instance of AssemblyError.\n */\n public static isContextProviderError(x: any): x is ContextProviderError {\n return this.isToolkitError(x) && CONTEXT_PROVIDER_ERROR_SYMBOL in x;\n }\n\n /**\n * An AssemblyError with an original error as cause\n */\n public static withCause(message: string, error: unknown): ToolkitError {\n return new ToolkitError(message, 'toolkit', error);\n }\n\n /**\n * The type of the error, defaults to \"toolkit\".\n */\n public readonly type: string;\n\n /**\n * Denotes the source of the error as the toolkit.\n */\n public readonly source: 'toolkit' | 'user';\n\n /**\n * The specific original cause of the error, if available\n */\n public readonly cause?: unknown;\n\n constructor(message: string, type: string = 'toolkit', cause?: unknown) {\n super(message);\n Object.setPrototypeOf(this, ToolkitError.prototype);\n Object.defineProperty(this, TOOLKIT_ERROR_SYMBOL, { value: true });\n this.name = new.target.name;\n this.type = type;\n this.source = 'toolkit';\n this.cause = cause;\n }\n}\n\n/**\n * Represents an authentication-specific error in the AWS CDK Toolkit.\n */\nexport class AuthenticationError extends ToolkitError {\n /**\n * Denotes the source of the error as user.\n */\n public readonly source = 'user';\n\n constructor(message: string) {\n super(message, 'authentication');\n Object.setPrototypeOf(this, AuthenticationError.prototype);\n Object.defineProperty(this, AUTHENTICATION_ERROR_SYMBOL, { value: true });\n }\n}\n\n/**\n * Represents an error causes by cloud assembly synthesis\n *\n * This includes errors thrown during app execution, as well as failing annotations.\n */\nexport class AssemblyError extends ToolkitError {\n /**\n * An AssemblyError with an original error as cause\n */\n public static withCause(message: string, error: unknown): AssemblyError {\n return new AssemblyError(message, undefined, error);\n }\n\n /**\n * An AssemblyError with a list of stacks as cause\n */\n public static withStacks(message: string, stacks?: cxapi.CloudFormationStackArtifact[]): AssemblyError {\n return new AssemblyError(message, stacks);\n }\n\n /**\n * Denotes the source of the error as user.\n */\n public readonly source = 'user';\n\n /**\n * The stacks that caused the error, if available\n *\n * The `messages` property of each `cxapi.CloudFormationStackArtifact` will contain the respective errors.\n * Absence indicates synthesis didn't fully complete.\n */\n public readonly stacks?: cxapi.CloudFormationStackArtifact[];\n\n private constructor(message: string, stacks?: cxapi.CloudFormationStackArtifact[], cause?: unknown) {\n super(message, 'assembly', cause);\n Object.setPrototypeOf(this, AssemblyError.prototype);\n Object.defineProperty(this, ASSEMBLY_ERROR_SYMBOL, { value: true });\n this.stacks = stacks;\n }\n}\n\n/**\n * Represents an error originating from a Context Provider\n */\nexport class ContextProviderError extends ToolkitError {\n /**\n * Denotes the source of the error as user.\n */\n public readonly source = 'user';\n\n constructor(message: string) {\n super(message, 'context-provider');\n Object.setPrototypeOf(this, ContextProviderError.prototype);\n Object.defineProperty(this, CONTEXT_PROVIDER_ERROR_SYMBOL, { value: true });\n }\n}\n", "/**\n * This gets the values of the jsonObject at the paths specified in propertiesToReturn.\n *\n * For example, jsonObject = {\n * key1: 'abc',\n * key2: {\n * foo: 'qwerty',\n * bar: 'data',\n * }\n * }\n *\n * propertiesToReturn = ['key1', 'key2.foo'];\n *\n * The returned object is:\n *\n * ```\n * {\n * key1: 'abc',\n * 'key2.foo': 'qwerty',\n * Identifier: identifier\n * }\n * ```\n */\nexport function getResultObj(jsonObject: any, identifier: string, propertiesToReturn: string[]): {[key: string]: any} {\n const propsObj = {};\n propertiesToReturn.forEach((propName) => {\n Object.assign(propsObj, { [propName]: findJsonValue(jsonObject, propName) });\n });\n Object.assign(propsObj, { ['Identifier']: identifier });\n return propsObj;\n}\n\n/**\n * This finds the value of the jsonObject at the path. Path is delimited by '.'.\n *\n * For example, jsonObject = {\n * key1: 'abc',\n * key2: {\n * foo: 'qwerty',\n * bar: 'data',\n * }\n * }\n *\n * If path is 'key1', then it will return 'abc'.\n * If path is 'key2.foo', then it will return 'qwerty'.\n * If path is 'key2', then it will return the object:\n * {\n * foo: 'qwerty',\n * bar: 'data',\n * }\n *\n * If the path is not found, an Error will be thrown stating which token is missing.\n */\nexport function findJsonValue(jsonObject: any, path: string): any {\n const paths = path.split('.');\n let obj = jsonObject;\n paths.forEach(p => {\n obj = obj[p];\n if (obj === undefined) {\n throw new TypeError(`Cannot read field ${path}. ${p} is not found.`);\n }\n });\n return obj;\n}\n", "/**\n * Type of a map mapping strings to some arbitrary type\n *\n * Name is not ideal, but:\n *\n * - Cannot call it Object, that already means something.\n * - Cannot call it Dict or Dictionary, since in other languages\n * those also allow specifying the key type.\n */\nexport type Obj<T> = {[key: string]: T};\n\n/**\n * Return whether the given value is an object\n *\n * Even though arrays technically are objects, we usually want to treat them differently,\n * so we return false in those cases.\n */\nexport function isObject(x: any): x is Obj<any> {\n return x !== null && typeof x === 'object' && !isArray(x);\n}\n\n/**\n * Return whether the given value is an array\n */\nexport const isArray = Array.isArray;\n\n/**\n * Return the value of the first argument if it's not undefined, otherwise the default\n */\nexport function ifDefined<T>(x: T | undefined, def: T): T {\n return typeof x !== 'undefined' ? x : def;\n}\n", "import type { Obj } from './types';\nimport { isArray, isObject } from './types';\nimport { ToolkitError } from '../api/toolkit-error';\n\n/**\n * Return a new object by adding missing keys into another object\n */\nexport function applyDefaults(hash: any, defaults: any) {\n const result: any = { };\n\n Object.keys(hash).forEach(k => result[k] = hash[k]);\n\n Object.keys(defaults)\n .filter(k => !(k in result))\n .forEach(k => result[k] = defaults[k]);\n\n return result;\n}\n\n/**\n * Return whether the given parameter is an empty object or empty list.\n */\nexport function isEmpty(x: any) {\n if (x == null) {\n return false;\n }\n if (isArray(x)) {\n return x.length === 0;\n }\n return Object.keys(x).length === 0;\n}\n\n/**\n * Deep clone a tree of objects, lists or scalars\n *\n * Does not support cycles.\n */\nexport function deepClone(x: any): any {\n if (typeof x === 'undefined') {\n return undefined;\n }\n if (x === null) {\n return null;\n }\n if (isArray(x)) {\n return x.map(deepClone);\n }\n if (isObject(x)) {\n return makeObject(mapObject(x, (k, v) => [k, deepClone(v)] as [string, any]));\n }\n return x;\n}\n\n/**\n * Map over an object, treating it as a dictionary\n */\nexport function mapObject<T, U>(x: Obj<T>, fn: (key: string, value: T) => U): U[] {\n const ret: U[] = [];\n Object.keys(x).forEach(key => {\n ret.push(fn(key, x[key]));\n });\n return ret;\n}\n\n/**\n * Construct an object from a list of (k, v) pairs\n */\nexport function makeObject<T>(pairs: Array<[string, T]>): Obj<T> {\n const ret: Obj<T> = {};\n for (const pair of pairs) {\n ret[pair[0]] = pair[1];\n }\n return ret;\n}\n\n/**\n * Deep get a value from a tree of nested objects\n *\n * Returns undefined if any part of the path was unset or\n * not an object.\n */\nexport function deepGet(x: any, path: string[]): any {\n path = path.slice();\n\n while (path.length > 0 && isObject(x)) {\n const key = path.shift()!;\n x = x[key];\n }\n return path.length === 0 ? x : undefined;\n}\n\n/**\n * Deep set a value in a tree of nested objects\n *\n * Throws an error if any part of the path is not an object.\n */\nexport function deepSet(x: any, path: string[], value: any) {\n path = path.slice();\n\n if (path.length === 0) {\n throw new ToolkitError('Path may not be empty');\n }\n\n while (path.length > 1 && isObject(x)) {\n const key = path.shift()!;\n\n if (isPrototypePollutingKey(key)) {\n continue;\n }\n\n if (!(key in x)) {\n x[key] = {};\n }\n x = x[key];\n }\n\n if (!isObject(x)) {\n throw new ToolkitError(`Expected an object, got '${x}'`);\n }\n\n const finalKey = path[0];\n\n if (isPrototypePollutingKey(finalKey)) {\n return;\n }\n\n if (value !== undefined) {\n x[finalKey] = value;\n } else {\n delete x[finalKey];\n }\n}\n\n/**\n * Helper to detect prototype polluting keys\n *\n * A key matching this, MUST NOT be used in an assignment.\n * Use this to check user-input.\n */\nfunction isPrototypePollutingKey(key: string) {\n return key === '__proto__' || key === 'constructor' || key === 'prototype';\n}\n\n/**\n * Recursively merge objects together\n *\n * The leftmost object is mutated and returned. Arrays are not merged\n * but overwritten just like scalars.\n *\n * If an object is merged into a non-object, the non-object is lost.\n */\nexport function deepMerge(...objects: Array<Obj<any> | undefined>) {\n function mergeOne(target: Obj<any>, source: Obj<any>) {\n for (const key of Object.keys(source)) {\n if (isPrototypePollutingKey(key)) {\n continue;\n }\n\n const value = source[key];\n\n if (isObject(value)) {\n if (!isObject(target[key])) {\n target[key] = {};\n } // Overwrite on purpose\n mergeOne(target[key], value);\n } else if (typeof value !== 'undefined') {\n target[key] = value;\n }\n }\n }\n\n const others = objects.filter(x => x != null) as Array<Obj<any>>;\n\n if (others.length === 0) {\n return {};\n }\n const into = others.splice(0, 1)[0];\n\n others.forEach(other => mergeOne(into, other));\n return into;\n}\n\n/**\n * Splits the given object into two, such that:\n *\n * 1. The size of the first object (after stringified in UTF-8) is less than or equal to the provided size limit.\n * 2. Merging the two objects results in the original one.\n */\nexport function splitBySize(data: any, maxSizeBytes: number): [any, any] {\n if (maxSizeBytes < 2) {\n // It's impossible to fit anything in the first object\n return [undefined, data];\n }\n const entries = Object.entries(data);\n return recurse(0, 0);\n\n function recurse(index: number, runningTotalSize: number): [any, any] {\n if (index >= entries.length) {\n // Everything fits in the first object\n return [data, undefined];\n }\n\n const size = runningTotalSize + entrySize(entries[index]);\n return (size > maxSizeBytes) ? cutAt(index) : recurse(index + 1, size);\n }\n\n function entrySize(entry: [string, unknown]) {\n return Buffer.byteLength(JSON.stringify(Object.fromEntries([entry])));\n }\n\n function cutAt(index: number): [any, any] {\n return [\n Object.fromEntries(entries.slice(0, index)),\n Object.fromEntries(entries.slice(index)),\n ];\n }\n}\n\ntype Exclude = { [key: string]: Exclude | true };\n\n/**\n * This function transforms all keys (recursively) in the provided `val` object.\n *\n * @param val The object whose keys need to be transformed.\n * @param transform The function that will be applied to each key.\n * @param exclude The keys that will not be transformed and copied to output directly\n * @returns A new object with the same values as `val`, but with all keys transformed according to `transform`.\n */\nexport function transformObjectKeys(val: any, transform: (str: string) => string, exclude: Exclude = {}): any {\n if (val == null || typeof val !== 'object') {\n return val;\n }\n if (Array.isArray(val)) {\n // For arrays we just pass parent's exclude object directly\n // since it makes no sense to specify different exclude options for each array element\n return val.map((input: any) => transformObjectKeys(input, transform, exclude));\n }\n const ret: { [k: string]: any } = {};\n for (const [k, v] of Object.entries(val)) {\n const childExclude = exclude[k];\n if (childExclude === true) {\n // we don't transform this object if the key is specified in exclude\n ret[transform(k)] = v;\n } else {\n ret[transform(k)] = transformObjectKeys(v, transform, childExclude);\n }\n }\n return ret;\n}\n", "/**\n * Run a number of promise generators with max parallelism\n *\n * Order is not maintained between the input and output.\n */\nexport async function parallelPromises<A>(n: number, promises: Array<() => Promise<A>>): Promise<Array<A>> {\n const ret = new Array<A>();\n let count = 0;\n let error: Error | undefined;\n const queue = [...promises];\n\n return new Promise((ok, ko) => {\n tick();\n\n function tick() {\n if (count === 0 && error) {\n ko(error);\n return;\n }\n if (count === 0 && queue.length === 0) {\n ok(ret);\n return;\n }\n\n while (count < n && queue.length > 0 && !error) {\n const next = queue.shift();\n if (next !== undefined) {\n start(next);\n }\n }\n }\n\n function start(fn: () => Promise<A>) {\n count += 1;\n fn()\n .then((result) => {\n ret.push(result);\n })\n .catch((e) => {\n error = e;\n })\n .finally(() => {\n count -= 1;\n tick();\n });\n }\n });\n}\n", "import * as path from 'path';\nimport { bundledPackageRootDir } from './directories';\n\nexport function displayVersion() {\n return `${versionNumber()} (build ${commit()})`;\n}\n\nexport function isDeveloperBuild(): boolean {\n return versionNumber() === '0.0.0';\n}\n\nexport function versionNumber(): string {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n return require(path.join(bundledPackageRootDir(__dirname), 'package.json')).version.replace(/\\+[0-9a-f]+$/, '');\n}\n\nfunction commit(): string {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n return require(path.join(bundledPackageRootDir(__dirname), 'build-info.json')).commit;\n}\n", "import * as fs from 'fs/promises';\nimport { formatBytes } from './bytes';\nimport * as yaml_cfn from './yaml-cfn';\n\n/**\n * Stringify to YAML\n */\nexport function toYAML(obj: any): string {\n return yaml_cfn.serialize(obj);\n}\n\n/**\n * Parse either YAML or JSON\n */\nexport function deserializeStructure(str: string): any {\n return yaml_cfn.deserialize(str);\n}\n\n/**\n * Serialize to either YAML or JSON\n */\nexport function serializeStructure(object: any, json: boolean) {\n if (json) {\n return JSON.stringify(object, undefined, 2);\n } else {\n return toYAML(object);\n }\n}\n\n/**\n * Load a YAML or JSON file from disk\n */\nexport async function loadStructuredFile(fileName: string) {\n const contents = await fs.readFile(fileName, { encoding: 'utf-8' });\n return deserializeStructure(contents);\n}\n\n/**\n * Remove any template elements that we don't want to show users.\n */\nexport function obscureTemplate(template: any = {}) {\n if (template.Rules) {\n // see https://github.com/aws/aws-cdk/issues/17942\n if (template.Rules.CheckBootstrapVersion) {\n if (Object.keys(template.Rules).length > 1) {\n delete template.Rules.CheckBootstrapVersion;\n } else {\n delete template.Rules;\n }\n }\n }\n\n return template;\n}\n\n/**\n * Detects a buffer that has been converted to a JSON-like object\n * In Node, `Buffer`s have `toJSON()` method that converts the buffer\n * into a JS object that can be JSON stringified.\n * Unfortunately this conversion happens before the replacer is called,\n * so normal means of detecting a `Buffer` objet don't work anymore.\n * @see https://github.com/nodejs/node-v0.x-archive/issues/5110\n */\nfunction isJsonBuffer(value: any): value is {\n type: 'Buffer';\n data: number[];\n} {\n return typeof value === 'object'\n && 'type' in value\n && value.type === 'Buffer'\n && 'data' in value\n && Array.isArray(value.data);\n}\n\n/**\n * A JSON.stringify() replacer that converts Buffers into a string with information\n * Use this if you plan to print out JSON stringified objects that may contain a Buffer.\n * Without this, large buffers (think: Megabytes) will completely fill up the output\n * and even crash the system.\n */\nexport function replacerBufferWithInfo(_key: any, value: any): any {\n if (isJsonBuffer(value)) {\n return `<Buffer: ${formatBytes(value.data.length)}>`;\n }\n return value;\n}\n", "import * as yaml from 'yaml';\nimport type * as yaml_cst from 'yaml/parse-cst';\nimport * as yaml_types from 'yaml/types';\n\n/**\n * Serializes the given data structure into valid YAML.\n *\n * @param obj the data structure to serialize\n * @returns a string containing the YAML representation of {@param obj}\n */\nexport function serialize(obj: any): string {\n const oldFold = yaml_types.strOptions.fold.lineWidth;\n try {\n yaml_types.strOptions.fold.lineWidth = 0;\n return yaml.stringify(obj, { schema: 'yaml-1.1' });\n } finally {\n yaml_types.strOptions.fold.lineWidth = oldFold;\n }\n}\n\n/**\n * Deserialize the YAML into the appropriate data structure.\n *\n * @param str the string containing YAML\n * @returns the data structure the YAML represents\n * (most often in case of CloudFormation, an object)\n */\nexport function deserialize(str: string): any {\n return parseYamlStrWithCfnTags(str);\n}\n\nfunction makeTagForCfnIntrinsic(intrinsicName: string, addFnPrefix: boolean): yaml_types.Schema.CustomTag {\n return {\n identify(value: any) {\n return typeof value === 'string';\n },\n tag: `!${intrinsicName}`,\n resolve: (_doc: yaml.Document, cstNode: yaml_cst.CST.Node) => {\n const ret: any = {};\n ret[addFnPrefix ? `Fn::${intrinsicName}` : intrinsicName] =\n // the +1 is to account for the ! the short form begins with\n parseYamlStrWithCfnTags(cstNode.toString().substring(intrinsicName.length + 1));\n return ret;\n },\n };\n}\n\nconst shortForms: yaml_types.Schema.CustomTag[] = [\n 'Base64', 'Cidr', 'FindInMap', 'GetAZs', 'ImportValue', 'Join', 'Sub',\n 'Select', 'Split', 'Transform', 'And', 'Equals', 'If', 'Not', 'Or', 'GetAtt',\n].map(name => makeTagForCfnIntrinsic(name, true)).concat(\n makeTagForCfnIntrinsic('Ref', false),\n makeTagForCfnIntrinsic('Condition', false),\n);\n\nfunction parseYamlStrWithCfnTags(text: string): any {\n return yaml.parse(text, {\n customTags: shortForms,\n schema: 'core',\n });\n}\n", "/**\n * Pad 's' on the left with 'char' until it is n characters wide\n */\nexport function padLeft(n: number, x: string, char: string = ' '): string {\n return char.repeat(Math.max(0, n - x.length)) + x;\n}\n\n/**\n * Pad 's' on the right with 'char' until it is n characters wide\n */\nexport function padRight(n: number, x: string, char: string = ' '): string {\n return x + char.repeat(Math.max(0, n - x.length));\n}\n\n/**\n * Formats time in milliseconds (which we get from 'Date.getTime()')\n * to a human-readable time; returns time in seconds rounded to 2\n * decimal places.\n */\nexport function formatTime(num: number): number {\n return roundPercentage(millisecondsToSeconds(num));\n}\n\n/**\n * Rounds a decimal number to two decimal points.\n * The function is useful for fractions that need to be outputted as percentages.\n */\nfunction roundPercentage(num: number): number {\n return Math.round(100 * num) / 100;\n}\n\n/**\n * Given a time in milliseconds, return an equivalent amount in seconds.\n */\nfunction millisecondsToSeconds(num: number): number {\n return num / 1000;\n}\n\n/**\n * This function lower cases the first character of the string provided.\n */\nexport function lowerCaseFirstCharacter(str: string): string {\n return str.length > 0 ? `${str[0].toLowerCase()}${str.slice(1)}` : str;\n}\n", "/**\n * Type branding\n *\n * This allows marking certain types as having gone through particular operations.\n *\n * Branded types can be used anywhere the base type is expected, but the base type\n * cannot be used where a branded type is expected; the values have to go through\n * a type assertion operation to confirm their brand.\n *\n * Usage:\n *\n * ```\n * type ValidatedString = Branded<string, 'PassedMyValidation'>;\n *\n * function validate(x: string): asserts x is ValidatedString {\n * // ... throw an error if not\n * }\n *\n * function isValid(x: string): x is ValidatedString {\n * // ... throw an error if not\n * }\n * ```\n */\n\n// This construct purely happens at type checking time. There is no run-time impact.\n// Hence, we never even have to construct values of this type.\ndeclare const __brand: unique symbol;\n\nexport type Brand<B> = { [__brand]: B };\nexport type Branded<T, B> = T & Brand<B>;\n\n/**\n * Marks a value as being branded a certain way.\n *\n * You should in general avoid calling this, and use validation or\n * asserting functions instead. However, this can be useful to produce\n * values which are branded by construction (really just an elaborate\n * way to write 'as').\n */\n/* c8 ignore start */\nexport function createBranded<A extends Branded<any, any>>(value: TypeUnderlyingBrand<A>): A {\n return value as A;\n}\n/* c8 ignore stop */\n\ntype TypeUnderlyingBrand<A> = A extends Branded<infer T, any> ? T : never;\n", "import * as semver from 'semver';\nimport { ToolkitError } from '../api/toolkit-error';\n\n// bracket - https://docs.oracle.com/middleware/1212/core/MAVEN/maven_version.htm#MAVEN401\n// pep - https://www.python.org/dev/peps/pep-0440/#version-specifiers\nexport type RangeType = 'bracket' | 'pep'\n\nexport function rangeFromSemver(ver: string, targetType: RangeType) {\n const re = ver.match(/^([^\\d]*)([\\d.]*)$/);\n if (!re || !semver.valid(re[2])) {\n throw new ToolkitError('not a semver or unsupported range syntax');\n }\n const prefixPart = re[1];\n const verPart = re[2];\n\n switch (targetType) {\n case 'bracket':\n switch (prefixPart) {\n case '':\n // if there's no prefix and the remaining is a valid semver, there's no range specified\n return ver;\n case '^':\n return `[${verPart},${semver.major(verPart)+1}.0.0)`;\n default:\n throw new ToolkitError(`unsupported range syntax - ${prefixPart}`);\n }\n case 'pep':\n switch (prefixPart) {\n case '':\n // if there's no prefix and the remaining is a valid semver, there's no range specified\n return `==${ver}`;\n case '^':\n return `>=${verPart},<${semver.major(verPart)+1}.0.0`;\n default:\n throw new ToolkitError(`unsupported range syntax - ${prefixPart}`);\n }\n }\n}\n"],
5
5
  "mappings": "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",
6
6
  "names": ["error", "fs", "fs", "path", "error", "dirname", "path", "path", "error", "path", "fs"]
7
7
  }
@@ -1,6 +1,7 @@
1
1
  import type { ICloudAssemblySource } from '../../api/cloud-assembly';
2
2
  import { StackAssembly } from '../../api/cloud-assembly/private';
3
- import type { SdkProvider, IoHelper, PluginHost } from '../../api/shared-private';
3
+ import type { PluginHost } from '../../api/plugin';
4
+ import type { SdkProvider, IoHelper } from '../../api/shared-private';
4
5
  /**
5
6
  * Helper struct to pass internal services around.
6
7
  */
@@ -22,4 +22,4 @@ async function assemblyFromSource(ioHelper, assemblySource, cache = true) {
22
22
  }
23
23
  return new private_1.StackAssembly(await assemblySource.produce(), ioHelper);
24
24
  }
25
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQXdCQSxnREFXQztBQWpDRCw4REFBaUU7QUFZakU7Ozs7Ozs7OztHQVNHO0FBQ0ksS0FBSyxVQUFVLGtCQUFrQixDQUFDLFFBQWtCLEVBQUUsY0FBb0MsRUFBRSxRQUFpQixJQUFJO0lBQ3RILElBQUksY0FBYyxZQUFZLHVCQUFhLEVBQUUsQ0FBQztRQUM1QyxPQUFPLGNBQWMsQ0FBQztJQUN4QixDQUFDO0lBRUQsSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUNWLE1BQU0sR0FBRyxHQUFHLElBQUksdUJBQWEsQ0FBQyxNQUFNLGNBQWMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUN4RSxPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7SUFFRCxPQUFPLElBQUksdUJBQWEsQ0FBQyxNQUFNLGNBQWMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxRQUFRLENBQUMsQ0FBQztBQUNyRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiXG5pbXBvcnQgdHlwZSB7IElDbG91ZEFzc2VtYmx5U291cmNlIH0gZnJvbSAnLi4vLi4vYXBpL2Nsb3VkLWFzc2VtYmx5JztcbmltcG9ydCB7IFN0YWNrQXNzZW1ibHkgfSBmcm9tICcuLi8uLi9hcGkvY2xvdWQtYXNzZW1ibHkvcHJpdmF0ZSc7XG5pbXBvcnQgdHlwZSB7IFNka1Byb3ZpZGVyLCBJb0hlbHBlciwgUGx1Z2luSG9zdCB9IGZyb20gJy4uLy4uL2FwaS9zaGFyZWQtcHJpdmF0ZSc7XG5cbi8qKlxuICogSGVscGVyIHN0cnVjdCB0byBwYXNzIGludGVybmFsIHNlcnZpY2VzIGFyb3VuZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUb29sa2l0U2VydmljZXMge1xuICBzZGtQcm92aWRlcjogU2RrUHJvdmlkZXI7XG4gIGlvSGVscGVyOiBJb0hlbHBlcjtcbiAgcGx1Z2luSG9zdDogUGx1Z2luSG9zdDtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgVG9vbGtpdCBpbnRlcm5hbCBDbG91ZEFzc2VtYmx5IGZyb20gYSBDbG91ZEFzc2VtYmx5U291cmNlLlxuICpcbiAqIFRoZSBjYWxsZXIgYXNzdW1lcyBvd25lcnNoaXAgb2YgdGhlIHJldHVybmVkIGBTdGFja0Fzc2VtYmx5YCwgYW5kIGBkaXNwb3NlKClgXG4gKiBzaG91bGQgYmUgY2FsbGVkIG9uIHRoaXMgb2JqZWN0IGFmdGVyIHVzZS5cbiAqXG4gKiBAcGFyYW0gYXNzZW1ibHlTb3VyY2UgdGhlIHNvdXJjZSBmb3IgdGhlIGNsb3VkIGFzc2VtYmx5XG4gKiBAcGFyYW0gY2FjaGUgaWYgdGhlIGFzc2VtYmx5IHNob3VsZCBiZSBjYWNoZWQsIGRlZmF1bHQ6IGB0cnVlYFxuICogQHJldHVybnMgdGhlIENsb3VkQXNzZW1ibHkgb2JqZWN0XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhc3NlbWJseUZyb21Tb3VyY2UoaW9IZWxwZXI6IElvSGVscGVyLCBhc3NlbWJseVNvdXJjZTogSUNsb3VkQXNzZW1ibHlTb3VyY2UsIGNhY2hlOiBib29sZWFuID0gdHJ1ZSk6IFByb21pc2U8U3RhY2tBc3NlbWJseT4ge1xuICBpZiAoYXNzZW1ibHlTb3VyY2UgaW5zdGFuY2VvZiBTdGFja0Fzc2VtYmx5KSB7XG4gICAgcmV0dXJuIGFzc2VtYmx5U291cmNlO1xuICB9XG5cbiAgaWYgKGNhY2hlKSB7XG4gICAgY29uc3QgcmV0ID0gbmV3IFN0YWNrQXNzZW1ibHkoYXdhaXQgYXNzZW1ibHlTb3VyY2UucHJvZHVjZSgpLCBpb0hlbHBlcik7XG4gICAgcmV0dXJuIHJldDtcbiAgfVxuXG4gIHJldHVybiBuZXcgU3RhY2tBc3NlbWJseShhd2FpdCBhc3NlbWJseVNvdXJjZS5wcm9kdWNlKCksIGlvSGVscGVyKTtcbn1cbiJdfQ==
25
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQXlCQSxnREFXQztBQWxDRCw4REFBaUU7QUFhakU7Ozs7Ozs7OztHQVNHO0FBQ0ksS0FBSyxVQUFVLGtCQUFrQixDQUFDLFFBQWtCLEVBQUUsY0FBb0MsRUFBRSxRQUFpQixJQUFJO0lBQ3RILElBQUksY0FBYyxZQUFZLHVCQUFhLEVBQUUsQ0FBQztRQUM1QyxPQUFPLGNBQWMsQ0FBQztJQUN4QixDQUFDO0lBRUQsSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUNWLE1BQU0sR0FBRyxHQUFHLElBQUksdUJBQWEsQ0FBQyxNQUFNLGNBQWMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUN4RSxPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7SUFFRCxPQUFPLElBQUksdUJBQWEsQ0FBQyxNQUFNLGNBQWMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxRQUFRLENBQUMsQ0FBQztBQUNyRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiXG5pbXBvcnQgdHlwZSB7IElDbG91ZEFzc2VtYmx5U291cmNlIH0gZnJvbSAnLi4vLi4vYXBpL2Nsb3VkLWFzc2VtYmx5JztcbmltcG9ydCB7IFN0YWNrQXNzZW1ibHkgfSBmcm9tICcuLi8uLi9hcGkvY2xvdWQtYXNzZW1ibHkvcHJpdmF0ZSc7XG5pbXBvcnQgdHlwZSB7IFBsdWdpbkhvc3QgfSBmcm9tICcuLi8uLi9hcGkvcGx1Z2luJztcbmltcG9ydCB0eXBlIHsgU2RrUHJvdmlkZXIsIElvSGVscGVyIH0gZnJvbSAnLi4vLi4vYXBpL3NoYXJlZC1wcml2YXRlJztcblxuLyoqXG4gKiBIZWxwZXIgc3RydWN0IHRvIHBhc3MgaW50ZXJuYWwgc2VydmljZXMgYXJvdW5kLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRvb2xraXRTZXJ2aWNlcyB7XG4gIHNka1Byb3ZpZGVyOiBTZGtQcm92aWRlcjtcbiAgaW9IZWxwZXI6IElvSGVscGVyO1xuICBwbHVnaW5Ib3N0OiBQbHVnaW5Ib3N0O1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBUb29sa2l0IGludGVybmFsIENsb3VkQXNzZW1ibHkgZnJvbSBhIENsb3VkQXNzZW1ibHlTb3VyY2UuXG4gKlxuICogVGhlIGNhbGxlciBhc3N1bWVzIG93bmVyc2hpcCBvZiB0aGUgcmV0dXJuZWQgYFN0YWNrQXNzZW1ibHlgLCBhbmQgYGRpc3Bvc2UoKWBcbiAqIHNob3VsZCBiZSBjYWxsZWQgb24gdGhpcyBvYmplY3QgYWZ0ZXIgdXNlLlxuICpcbiAqIEBwYXJhbSBhc3NlbWJseVNvdXJjZSB0aGUgc291cmNlIGZvciB0aGUgY2xvdWQgYXNzZW1ibHlcbiAqIEBwYXJhbSBjYWNoZSBpZiB0aGUgYXNzZW1ibHkgc2hvdWxkIGJlIGNhY2hlZCwgZGVmYXVsdDogYHRydWVgXG4gKiBAcmV0dXJucyB0aGUgQ2xvdWRBc3NlbWJseSBvYmplY3RcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFzc2VtYmx5RnJvbVNvdXJjZShpb0hlbHBlcjogSW9IZWxwZXIsIGFzc2VtYmx5U291cmNlOiBJQ2xvdWRBc3NlbWJseVNvdXJjZSwgY2FjaGU6IGJvb2xlYW4gPSB0cnVlKTogUHJvbWlzZTxTdGFja0Fzc2VtYmx5PiB7XG4gIGlmIChhc3NlbWJseVNvdXJjZSBpbnN0YW5jZW9mIFN0YWNrQXNzZW1ibHkpIHtcbiAgICByZXR1cm4gYXNzZW1ibHlTb3VyY2U7XG4gIH1cblxuICBpZiAoY2FjaGUpIHtcbiAgICBjb25zdCByZXQgPSBuZXcgU3RhY2tBc3NlbWJseShhd2FpdCBhc3NlbWJseVNvdXJjZS5wcm9kdWNlKCksIGlvSGVscGVyKTtcbiAgICByZXR1cm4gcmV0O1xuICB9XG5cbiAgcmV0dXJuIG5ldyBTdGFja0Fzc2VtYmx5KGF3YWl0IGFzc2VtYmx5U291cmNlLnByb2R1Y2UoKSwgaW9IZWxwZXIpO1xufVxuIl19