@aws-cdk/toolkit-lib 0.3.1 → 0.3.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (367) hide show
  1. package/README.md +1 -1
  2. package/build-info.json +2 -2
  3. package/db.json.gz +0 -0
  4. package/lib/actions/bootstrap/index.d.ts +1 -1
  5. package/lib/actions/bootstrap/index.js +5 -5
  6. package/lib/actions/deploy/index.d.ts +1 -1
  7. package/lib/actions/deploy/index.js +1 -1
  8. package/lib/actions/deploy/private/deploy-options.d.ts +1 -1
  9. package/lib/actions/deploy/private/deploy-options.js +1 -1
  10. package/lib/actions/deploy/private/helpers.d.ts +3 -2
  11. package/lib/actions/deploy/private/helpers.js +3 -3
  12. package/lib/actions/diff/private/helpers.d.ts +5 -9
  13. package/lib/actions/diff/private/helpers.js +6 -23
  14. package/lib/api/aws-auth/account-cache.d.ts +41 -0
  15. package/lib/api/aws-auth/account-cache.js +108 -0
  16. package/lib/api/aws-auth/awscli-compatible.d.ts +70 -0
  17. package/lib/api/aws-auth/awscli-compatible.js +250 -0
  18. package/lib/api/aws-auth/cached.d.ts +11 -0
  19. package/lib/api/aws-auth/cached.js +26 -0
  20. package/lib/api/aws-auth/credential-plugins.d.ts +38 -0
  21. package/lib/api/aws-auth/credential-plugins.js +154 -0
  22. package/lib/api/aws-auth/private/index.d.ts +11 -0
  23. package/lib/api/aws-auth/private/index.js +37 -0
  24. package/lib/api/aws-auth/provider-caching.d.ts +13 -0
  25. package/lib/api/aws-auth/provider-caching.js +24 -0
  26. package/lib/api/aws-auth/proxy-agent.d.ts +13 -0
  27. package/lib/api/aws-auth/proxy-agent.js +54 -0
  28. package/lib/api/aws-auth/sdk-logger.d.ts +69 -0
  29. package/lib/api/aws-auth/sdk-logger.js +128 -0
  30. package/lib/api/aws-auth/sdk-provider.d.ts +195 -0
  31. package/lib/api/aws-auth/sdk-provider.js +373 -0
  32. package/lib/api/aws-auth/sdk.d.ts +235 -0
  33. package/lib/api/aws-auth/sdk.js +391 -0
  34. package/lib/api/aws-auth/tracing.d.ts +11 -0
  35. package/lib/api/aws-auth/tracing.js +60 -0
  36. package/lib/api/aws-auth/types.d.ts +79 -1
  37. package/lib/api/aws-auth/types.js +74 -1
  38. package/lib/api/aws-auth/user-agent.d.ts +7 -0
  39. package/lib/api/aws-auth/user-agent.js +20 -0
  40. package/lib/api/aws-auth/util.d.ts +6 -0
  41. package/lib/api/aws-auth/util.js +21 -0
  42. package/lib/api/bootstrap/bootstrap-environment.d.ts +35 -0
  43. package/lib/api/bootstrap/bootstrap-environment.js +323 -0
  44. package/lib/api/bootstrap/bootstrap-props.d.ts +130 -0
  45. package/lib/api/bootstrap/bootstrap-props.js +14 -0
  46. package/lib/api/bootstrap/deploy-bootstrap.d.ts +39 -0
  47. package/lib/api/bootstrap/deploy-bootstrap.js +147 -0
  48. package/lib/api/bootstrap/index.d.ts +3 -0
  49. package/lib/api/bootstrap/index.js +23 -0
  50. package/lib/api/bootstrap/legacy-template.d.ts +2 -0
  51. package/lib/api/bootstrap/legacy-template.js +82 -0
  52. package/lib/api/cloud-assembly/environment.d.ts +43 -0
  53. package/lib/api/cloud-assembly/environment.js +127 -0
  54. package/lib/api/cloud-assembly/index.d.ts +1 -1
  55. package/lib/api/cloud-assembly/index.js +3 -3
  56. package/lib/api/cloud-assembly/private/context-aware-source.d.ts +1 -1
  57. package/lib/api/cloud-assembly/private/context-aware-source.js +5 -5
  58. package/lib/api/cloud-assembly/private/prepare-source.d.ts +2 -1
  59. package/lib/api/cloud-assembly/private/prepare-source.js +14 -12
  60. package/lib/api/cloud-assembly/private/readable-assembly.d.ts +1 -1
  61. package/lib/api/cloud-assembly/private/readable-assembly.js +1 -1
  62. package/lib/api/cloud-assembly/private/source-builder.js +10 -8
  63. package/lib/api/cloud-assembly/private/stack-assembly.d.ts +2 -1
  64. package/lib/api/cloud-assembly/private/stack-assembly.js +10 -9
  65. package/lib/api/cloud-assembly/stack-assembly.d.ts +55 -0
  66. package/lib/api/cloud-assembly/stack-assembly.js +139 -0
  67. package/lib/api/cloud-assembly/stack-collection.d.ts +27 -0
  68. package/lib/api/cloud-assembly/stack-collection.js +112 -0
  69. package/lib/api/cloud-assembly/stack-selector.d.ts +81 -2
  70. package/lib/api/cloud-assembly/stack-selector.js +62 -5
  71. package/lib/api/cloudformation/evaluate-cloudformation-template.d.ts +85 -0
  72. package/lib/api/cloudformation/evaluate-cloudformation-template.js +456 -0
  73. package/lib/api/cloudformation/index.d.ts +4 -0
  74. package/lib/api/cloudformation/index.js +21 -0
  75. package/lib/api/cloudformation/nested-stack-helpers.d.ts +25 -0
  76. package/lib/api/cloudformation/nested-stack-helpers.js +86 -0
  77. package/lib/api/cloudformation/stack-helpers.d.ts +96 -0
  78. package/lib/api/cloudformation/stack-helpers.js +163 -0
  79. package/lib/api/cloudformation/template-body-parameter.d.ts +22 -0
  80. package/lib/api/cloudformation/template-body-parameter.js +104 -0
  81. package/lib/api/context.d.ts +40 -0
  82. package/lib/api/context.js +84 -0
  83. package/lib/api/deployments/asset-manifest-builder.d.ts +8 -0
  84. package/lib/api/deployments/asset-manifest-builder.js +33 -0
  85. package/lib/api/deployments/asset-publishing.d.ts +60 -0
  86. package/lib/api/deployments/asset-publishing.js +144 -0
  87. package/lib/api/deployments/assets.d.ts +11 -0
  88. package/lib/api/deployments/assets.js +109 -0
  89. package/lib/api/deployments/cfn-api.d.ts +145 -0
  90. package/lib/api/deployments/cfn-api.js +444 -0
  91. package/lib/api/deployments/checks.d.ts +9 -0
  92. package/lib/api/deployments/checks.js +72 -0
  93. package/lib/api/deployments/deploy-stack.d.ts +164 -0
  94. package/lib/api/deployments/deploy-stack.js +490 -0
  95. package/lib/api/deployments/deployment-method.d.ts +24 -0
  96. package/lib/api/deployments/deployment-method.js +3 -0
  97. package/lib/api/deployments/deployment-result.d.ts +21 -0
  98. package/lib/api/deployments/deployment-result.js +10 -0
  99. package/lib/api/deployments/deployments.d.ts +289 -0
  100. package/lib/api/deployments/deployments.js +355 -0
  101. package/lib/api/deployments/index.d.ts +6 -0
  102. package/lib/api/deployments/index.js +27 -0
  103. package/lib/api/diff/diff-formatter.d.ts +147 -0
  104. package/lib/api/diff/diff-formatter.js +225 -0
  105. package/lib/api/diff/index.d.ts +1 -0
  106. package/lib/api/diff/index.js +18 -0
  107. package/lib/api/environment/environment-access.d.ts +139 -0
  108. package/lib/api/environment/environment-access.js +205 -0
  109. package/lib/api/environment/environment-resources.d.ts +75 -0
  110. package/lib/api/environment/environment-resources.js +213 -0
  111. package/lib/api/environment/index.d.ts +3 -0
  112. package/lib/api/environment/index.js +20 -0
  113. package/lib/api/environment/placeholders.d.ts +10 -0
  114. package/lib/api/environment/placeholders.js +23 -0
  115. package/lib/api/garbage-collection/garbage-collector.d.ts +158 -0
  116. package/lib/api/garbage-collection/garbage-collector.js +614 -0
  117. package/lib/api/garbage-collection/index.d.ts +3 -0
  118. package/lib/api/garbage-collection/index.js +21 -0
  119. package/lib/api/garbage-collection/progress-printer.d.ts +23 -0
  120. package/lib/api/garbage-collection/progress-printer.js +80 -0
  121. package/lib/api/garbage-collection/stack-refresh.d.ts +49 -0
  122. package/lib/api/garbage-collection/stack-refresh.js +152 -0
  123. package/lib/api/hotswap/appsync-mapping-templates.d.ts +4 -0
  124. package/lib/api/hotswap/appsync-mapping-templates.js +162 -0
  125. package/lib/api/hotswap/code-build-projects.d.ts +4 -0
  126. package/lib/api/hotswap/code-build-projects.js +62 -0
  127. package/lib/api/hotswap/common.d.ts +89 -0
  128. package/lib/api/hotswap/common.js +137 -0
  129. package/lib/api/hotswap/ecs-services.d.ts +4 -0
  130. package/lib/api/hotswap/ecs-services.js +159 -0
  131. package/lib/api/hotswap/hotswap-deployments.d.ts +17 -0
  132. package/lib/api/hotswap/hotswap-deployments.js +441 -0
  133. package/lib/api/hotswap/index.d.ts +2 -0
  134. package/lib/api/hotswap/index.js +19 -0
  135. package/lib/api/hotswap/lambda-functions.d.ts +4 -0
  136. package/lib/api/hotswap/lambda-functions.js +297 -0
  137. package/lib/api/hotswap/s3-bucket-deployments.d.ts +5 -0
  138. package/lib/api/hotswap/s3-bucket-deployments.js +117 -0
  139. package/lib/api/hotswap/stepfunctions-state-machines.d.ts +4 -0
  140. package/lib/api/hotswap/stepfunctions-state-machines.js +48 -0
  141. package/lib/api/index.d.ts +25 -0
  142. package/lib/api/index.js +42 -0
  143. package/lib/api/io/index.d.ts +3 -1
  144. package/lib/api/io/index.js +18 -1
  145. package/lib/api/io/io-host.d.ts +15 -0
  146. package/lib/api/io/io-host.js +3 -0
  147. package/lib/api/io/io-message.d.ts +76 -0
  148. package/lib/api/io/io-message.js +3 -0
  149. package/lib/api/io/private/index.d.ts +7 -1
  150. package/lib/api/io/private/index.js +8 -5
  151. package/lib/api/io/private/io-default-messages.d.ts +21 -0
  152. package/lib/api/io/private/io-default-messages.js +59 -0
  153. package/lib/api/io/private/io-helper.d.ts +32 -0
  154. package/lib/api/io/private/io-helper.js +51 -0
  155. package/lib/api/io/private/level-priority.d.ts +11 -0
  156. package/lib/api/io/private/level-priority.js +33 -0
  157. package/lib/api/io/private/message-maker.d.ts +89 -0
  158. package/lib/api/io/private/message-maker.js +60 -0
  159. package/lib/api/io/private/messages.d.ts +178 -0
  160. package/lib/api/io/private/messages.js +534 -0
  161. package/lib/api/io/private/span.d.ts +93 -0
  162. package/lib/api/io/private/span.js +87 -0
  163. package/lib/api/io/private/testing/fake-io-host.d.ts +28 -0
  164. package/lib/api/io/private/testing/fake-io-host.js +41 -0
  165. package/lib/api/io/private/testing/index.d.ts +2 -0
  166. package/lib/api/io/private/testing/index.js +19 -0
  167. package/lib/api/io/private/testing/test-io-host.d.ts +27 -0
  168. package/lib/api/io/private/testing/test-io-host.js +61 -0
  169. package/lib/api/io/private/types.d.ts +4 -0
  170. package/lib/api/io/private/types.js +3 -0
  171. package/lib/api/io/toolkit-action.d.ts +4 -0
  172. package/lib/api/io/toolkit-action.js +3 -0
  173. package/lib/api/logs-monitor/find-cloudwatch-logs.d.ts +25 -0
  174. package/lib/api/logs-monitor/find-cloudwatch-logs.js +95 -0
  175. package/lib/api/logs-monitor/index.d.ts +2 -0
  176. package/lib/api/logs-monitor/index.js +19 -0
  177. package/lib/api/logs-monitor/logs-monitor.d.ts +76 -0
  178. package/lib/api/logs-monitor/logs-monitor.js +194 -0
  179. package/lib/api/notices.d.ts +210 -0
  180. package/lib/api/notices.js +430 -0
  181. package/lib/api/plugin/context-provider-plugin.d.ts +6 -0
  182. package/lib/api/plugin/context-provider-plugin.js +7 -0
  183. package/lib/api/plugin/index.d.ts +3 -0
  184. package/lib/api/plugin/index.js +20 -0
  185. package/lib/api/plugin/mode.d.ts +4 -0
  186. package/lib/api/plugin/mode.js +9 -0
  187. package/lib/api/plugin/plugin.d.ts +72 -0
  188. package/lib/api/plugin/plugin.js +132 -0
  189. package/lib/api/private.d.ts +1 -0
  190. package/lib/api/private.js +18 -0
  191. package/lib/api/refactoring/cloudformation.d.ts +15 -0
  192. package/lib/api/refactoring/cloudformation.js +3 -0
  193. package/lib/api/refactoring/digest.d.ts +26 -0
  194. package/lib/api/refactoring/digest.js +175 -0
  195. package/lib/api/refactoring/index.d.ts +51 -0
  196. package/lib/api/refactoring/index.js +223 -0
  197. package/lib/api/require-approval.d.ts +17 -0
  198. package/lib/api/require-approval.js +22 -0
  199. package/lib/api/resource-import/importer.d.ts +216 -0
  200. package/lib/api/resource-import/importer.js +331 -0
  201. package/lib/api/resource-import/index.d.ts +2 -0
  202. package/lib/api/resource-import/index.js +19 -0
  203. package/lib/api/resource-import/migrator.d.ts +26 -0
  204. package/lib/api/resource-import/migrator.js +73 -0
  205. package/lib/api/resource-metadata/index.d.ts +1 -0
  206. package/lib/api/resource-metadata/index.js +18 -0
  207. package/lib/api/resource-metadata/resource-metadata.d.ts +24 -0
  208. package/lib/api/resource-metadata/resource-metadata.js +42 -0
  209. package/lib/api/rwlock.d.ts +60 -0
  210. package/lib/api/rwlock.js +204 -0
  211. package/lib/api/settings.d.ts +26 -0
  212. package/lib/api/settings.js +107 -0
  213. package/lib/api/shared-private.d.ts +8 -5
  214. package/lib/api/shared-private.js +2921 -9246
  215. package/lib/api/shared-private.js.map +4 -4
  216. package/lib/api/shared-public.d.ts +179 -37
  217. package/lib/api/shared-public.js +3106 -16
  218. package/lib/api/shared-public.js.map +4 -4
  219. package/lib/api/stack-events/index.d.ts +4 -0
  220. package/lib/api/stack-events/index.js +23 -0
  221. package/lib/api/stack-events/stack-activity-monitor.d.ts +100 -0
  222. package/lib/api/stack-events/stack-activity-monitor.js +164 -0
  223. package/lib/api/stack-events/stack-event-poller.d.ts +69 -0
  224. package/lib/api/stack-events/stack-event-poller.js +130 -0
  225. package/lib/api/stack-events/stack-progress-monitor.d.ts +48 -0
  226. package/lib/api/stack-events/stack-progress-monitor.js +98 -0
  227. package/lib/api/stack-events/stack-status.d.ts +42 -0
  228. package/lib/api/stack-events/stack-status.js +90 -0
  229. package/lib/api/streams.d.ts +7 -0
  230. package/lib/api/streams.js +24 -0
  231. package/lib/api/tags.d.ts +9 -0
  232. package/lib/api/tags.js +10 -0
  233. package/lib/api/toolkit-error.d.ts +86 -0
  234. package/lib/api/toolkit-error.js +132 -0
  235. package/lib/api/toolkit-info.d.ts +52 -0
  236. package/lib/api/toolkit-info.js +157 -0
  237. package/lib/api/tree.d.ts +31 -0
  238. package/lib/api/tree.js +37 -0
  239. package/lib/api/work-graph/index.d.ts +3 -0
  240. package/lib/api/work-graph/index.js +20 -0
  241. package/lib/api/work-graph/work-graph-builder.d.ts +34 -0
  242. package/lib/api/work-graph/work-graph-builder.js +172 -0
  243. package/lib/api/work-graph/work-graph-types.d.ts +50 -0
  244. package/lib/api/work-graph/work-graph-types.js +13 -0
  245. package/lib/api/work-graph/work-graph.d.ts +72 -0
  246. package/lib/api/work-graph/work-graph.js +349 -0
  247. package/lib/context-providers/ami.d.ts +13 -0
  248. package/lib/context-providers/ami.js +52 -0
  249. package/lib/context-providers/availability-zones.d.ts +13 -0
  250. package/lib/context-providers/availability-zones.js +29 -0
  251. package/lib/context-providers/cc-api-provider.d.ts +30 -0
  252. package/lib/context-providers/cc-api-provider.js +145 -0
  253. package/lib/context-providers/endpoint-service-availability-zones.d.ts +13 -0
  254. package/lib/context-providers/endpoint-service-availability-zones.js +35 -0
  255. package/lib/context-providers/hosted-zones.d.ts +12 -0
  256. package/lib/context-providers/hosted-zones.js +69 -0
  257. package/lib/context-providers/index.d.ts +44 -0
  258. package/lib/context-providers/index.js +128 -0
  259. package/lib/context-providers/keys.d.ts +13 -0
  260. package/lib/context-providers/keys.js +54 -0
  261. package/lib/context-providers/load-balancers.d.ts +20 -0
  262. package/lib/context-providers/load-balancers.js +161 -0
  263. package/lib/context-providers/security-groups.d.ts +9 -0
  264. package/lib/context-providers/security-groups.js +69 -0
  265. package/lib/context-providers/ssm-parameters.d.ts +25 -0
  266. package/lib/context-providers/ssm-parameters.js +61 -0
  267. package/lib/context-providers/vpcs.d.ts +13 -0
  268. package/lib/context-providers/vpcs.js +291 -0
  269. package/lib/index.d.ts +1 -0
  270. package/lib/index.js +2 -1
  271. package/lib/index_bg.wasm +0 -0
  272. package/lib/payloads/bootstrap-environment-progress.d.ts +17 -0
  273. package/lib/payloads/bootstrap-environment-progress.js +3 -0
  274. package/lib/payloads/context.d.ts +9 -0
  275. package/lib/payloads/context.js +3 -0
  276. package/lib/payloads/deploy.d.ts +43 -0
  277. package/lib/payloads/deploy.js +3 -0
  278. package/lib/payloads/destroy.d.ts +23 -0
  279. package/lib/payloads/destroy.js +3 -0
  280. package/lib/payloads/diff.d.ts +31 -0
  281. package/lib/payloads/diff.js +22 -0
  282. package/lib/payloads/hotswap.d.ts +211 -0
  283. package/lib/payloads/hotswap.js +43 -0
  284. package/lib/payloads/index.d.ts +17 -0
  285. package/lib/payloads/index.js +34 -0
  286. package/lib/payloads/list.d.ts +4 -0
  287. package/lib/payloads/list.js +3 -0
  288. package/lib/payloads/logs-monitor.d.ts +33 -0
  289. package/lib/payloads/logs-monitor.js +3 -0
  290. package/lib/payloads/progress.d.ts +14 -0
  291. package/lib/payloads/progress.js +3 -0
  292. package/lib/payloads/refactor.d.ts +14 -0
  293. package/lib/payloads/refactor.js +3 -0
  294. package/lib/payloads/rollback.d.ts +17 -0
  295. package/lib/payloads/rollback.js +3 -0
  296. package/lib/payloads/sdk-trace.d.ts +20 -0
  297. package/lib/payloads/sdk-trace.js +3 -0
  298. package/lib/payloads/stack-activity.d.ts +53 -0
  299. package/lib/payloads/stack-activity.js +3 -0
  300. package/lib/payloads/stack-details.d.ts +17 -0
  301. package/lib/payloads/stack-details.js +3 -0
  302. package/lib/payloads/synth.d.ts +7 -0
  303. package/lib/payloads/synth.js +3 -0
  304. package/lib/payloads/types.d.ts +95 -0
  305. package/lib/payloads/types.js +3 -0
  306. package/lib/payloads/watch.d.ts +27 -0
  307. package/lib/payloads/watch.js +3 -0
  308. package/lib/private/activity-printer/base.d.ts +50 -0
  309. package/lib/private/activity-printer/base.js +120 -0
  310. package/lib/private/activity-printer/current.d.ts +26 -0
  311. package/lib/private/activity-printer/current.js +122 -0
  312. package/lib/private/activity-printer/display.d.ts +13 -0
  313. package/lib/private/activity-printer/display.js +81 -0
  314. package/lib/private/activity-printer/history.d.ts +32 -0
  315. package/lib/private/activity-printer/history.js +109 -0
  316. package/lib/private/activity-printer/index.d.ts +3 -0
  317. package/lib/private/activity-printer/index.js +20 -0
  318. package/lib/private/index.d.ts +1 -0
  319. package/lib/private/index.js +18 -0
  320. package/lib/private/util.d.ts +1 -1
  321. package/lib/private/util.js +22 -22
  322. package/lib/private/util.js.map +2 -2
  323. package/lib/toolkit/private/index.d.ts +2 -0
  324. package/lib/toolkit/private/index.js +1 -1
  325. package/lib/toolkit/toolkit.d.ts +16 -0
  326. package/lib/toolkit/toolkit.js +158 -124
  327. package/lib/toolkit/types.d.ts +0 -55
  328. package/lib/toolkit/types.js +1 -1
  329. package/lib/util/archive.d.ts +1 -0
  330. package/lib/util/archive.js +86 -0
  331. package/lib/util/arrays.d.ts +14 -0
  332. package/lib/util/arrays.js +36 -0
  333. package/lib/util/bool.d.ts +7 -0
  334. package/lib/util/bool.js +13 -0
  335. package/lib/util/bytes.d.ts +8 -0
  336. package/lib/util/bytes.js +21 -0
  337. package/lib/util/cloudformation.d.ts +16 -0
  338. package/lib/util/cloudformation.js +36 -0
  339. package/lib/util/content-hash.d.ts +5 -0
  340. package/lib/util/content-hash.js +43 -0
  341. package/lib/util/directories.d.ts +22 -0
  342. package/lib/util/directories.js +59 -0
  343. package/lib/util/format-error.d.ts +9 -0
  344. package/lib/util/format-error.js +22 -0
  345. package/lib/util/index.d.ts +18 -0
  346. package/lib/util/index.js +35 -0
  347. package/lib/util/json.d.ts +48 -0
  348. package/lib/util/json.js +68 -0
  349. package/lib/util/objects.d.ts +65 -0
  350. package/lib/util/objects.js +230 -0
  351. package/lib/util/package-info.d.ts +3 -0
  352. package/lib/util/package-info.js +22 -0
  353. package/lib/util/parallel.d.ts +6 -0
  354. package/lib/util/parallel.js +48 -0
  355. package/lib/util/serialize.d.ts +27 -0
  356. package/lib/util/serialize.js +86 -0
  357. package/lib/util/string-manipulation.d.ts +18 -0
  358. package/lib/util/string-manipulation.js +46 -0
  359. package/lib/util/type-brands.d.ts +39 -0
  360. package/lib/util/type-brands.js +39 -0
  361. package/lib/util/types.d.ts +27 -0
  362. package/lib/util/types.js +25 -0
  363. package/lib/util/version-range.d.ts +2 -0
  364. package/lib/util/version-range.js +36 -0
  365. package/lib/util/yaml-cfn.d.ts +15 -0
  366. package/lib/util/yaml-cfn.js +58 -0
  367. package/package.json +12 -13
@@ -0,0 +1,132 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PluginHost = exports.TESTING = void 0;
4
+ exports.markTesting = markTesting;
5
+ const util_1 = require("util");
6
+ const context_provider_plugin_1 = require("./context-provider-plugin");
7
+ const private_1 = require("../private");
8
+ const toolkit_error_1 = require("../toolkit-error");
9
+ exports.TESTING = false;
10
+ function markTesting() {
11
+ exports.TESTING = true;
12
+ }
13
+ /**
14
+ * Class to manage a plugin collection
15
+ *
16
+ * It provides a `load()` function that loads a JavaScript
17
+ * module from disk, and gives it access to the `IPluginHost` interface
18
+ * to register itself.
19
+ */
20
+ class PluginHost {
21
+ /**
22
+ * Access the currently registered CredentialProviderSources. New sources can
23
+ * be registered using the +registerCredentialProviderSource+ method.
24
+ */
25
+ credentialProviderSources = new Array();
26
+ contextProviderPlugins = {};
27
+ ioHost;
28
+ alreadyLoaded = new Set();
29
+ /**
30
+ * Loads a plug-in into this PluginHost.
31
+ *
32
+ * Will use `require.resolve()` to get the most accurate representation of what
33
+ * code will get loaded in error messages. As such, it will not work in
34
+ * unit tests with Jest virtual modules becauase of <https://github.com/jestjs/jest/issues/9543>.
35
+ *
36
+ * @param moduleSpec the specification (path or name) of the plug-in module to be loaded.
37
+ * @param ioHost the I/O host to use for printing progress information
38
+ */
39
+ load(moduleSpec, ioHost) {
40
+ try {
41
+ const resolved = require.resolve(moduleSpec);
42
+ if (ioHost) {
43
+ new private_1.IoDefaultMessages(private_1.IoHelper.fromIoHost(ioHost, 'init')).debug(`Loading plug-in: ${resolved} from ${moduleSpec}`);
44
+ }
45
+ return this._doLoad(resolved);
46
+ }
47
+ catch (e) {
48
+ // according to Node.js docs `MODULE_NOT_FOUND` is the only possible error here
49
+ // @see https://nodejs.org/api/modules.html#requireresolverequest-options
50
+ // Not using `withCause()` here, since the node error contains a "Require Stack"
51
+ // as part of the error message that is inherently useless to our users.
52
+ throw new toolkit_error_1.ToolkitError(`Unable to resolve plug-in: Cannot find module '${moduleSpec}': ${e}`);
53
+ }
54
+ }
55
+ /**
56
+ * Do the loading given an already-resolved module name
57
+ *
58
+ * @internal
59
+ */
60
+ _doLoad(resolved) {
61
+ try {
62
+ if (this.alreadyLoaded.has(resolved)) {
63
+ return;
64
+ }
65
+ /* eslint-disable @typescript-eslint/no-require-imports */
66
+ const plugin = require(resolved);
67
+ /* eslint-enable */
68
+ if (!isPlugin(plugin)) {
69
+ throw new toolkit_error_1.ToolkitError(`Module ${resolved} is not a valid plug-in, or has an unsupported version.`);
70
+ }
71
+ if (plugin.init) {
72
+ plugin.init(this);
73
+ }
74
+ this.alreadyLoaded.add(resolved);
75
+ }
76
+ catch (e) {
77
+ throw toolkit_error_1.ToolkitError.withCause(`Unable to load plug-in '${resolved}'`, e);
78
+ }
79
+ function isPlugin(x) {
80
+ return x != null && x.version === '1';
81
+ }
82
+ }
83
+ /**
84
+ * Allows plug-ins to register new CredentialProviderSources.
85
+ *
86
+ * @param source a new CredentialProviderSource to register.
87
+ */
88
+ registerCredentialProviderSource(source) {
89
+ // Forward to the right credentials-related plugin host
90
+ this.credentialProviderSources.push(source);
91
+ }
92
+ /**
93
+ * (EXPERIMENTAL) Allow plugins to register context providers
94
+ *
95
+ * Context providers are objects with the following method:
96
+ *
97
+ * ```ts
98
+ * getValue(args: {[key: string]: any}): Promise<any>;
99
+ * ```
100
+ *
101
+ * Currently, they cannot reuse the CDK's authentication mechanisms, so they
102
+ * must be prepared to either not make AWS calls or use their own source of
103
+ * AWS credentials.
104
+ *
105
+ * This feature is experimental, and only intended to be used internally at Amazon
106
+ * as a trial.
107
+ *
108
+ * After registering with 'my-plugin-name', the provider must be addressed as follows:
109
+ *
110
+ * ```ts
111
+ * const value = ContextProvider.getValue(this, {
112
+ * providerName: 'plugin',
113
+ * props: {
114
+ * pluginName: 'my-plugin-name',
115
+ * myParameter1: 'xyz',
116
+ * },
117
+ * includeEnvironment: true | false,
118
+ * dummyValue: 'what-to-return-on-the-first-pass',
119
+ * })
120
+ * ```
121
+ *
122
+ * @experimental
123
+ */
124
+ registerContextProviderAlpha(pluginProviderName, provider) {
125
+ if (!(0, context_provider_plugin_1.isContextProviderPlugin)(provider)) {
126
+ throw new toolkit_error_1.ToolkitError(`Object you gave me does not look like a ContextProviderPlugin: ${(0, util_1.inspect)(provider)}`);
127
+ }
128
+ this.contextProviderPlugins[pluginProviderName] = provider;
129
+ }
130
+ }
131
+ exports.PluginHost = PluginHost;
132
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsicGx1Z2luLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQVNBLGtDQUVDO0FBWEQsK0JBQStCO0FBRS9CLHVFQUFnRztBQUVoRyx3Q0FBeUQ7QUFDekQsb0RBQWdEO0FBRXJDLFFBQUEsT0FBTyxHQUFHLEtBQUssQ0FBQztBQUUzQixTQUFnQixXQUFXO0lBQ3pCLGVBQU8sR0FBRyxJQUFJLENBQUM7QUFDakIsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILE1BQWEsVUFBVTtJQUNyQjs7O09BR0c7SUFDYSx5QkFBeUIsR0FBRyxJQUFJLEtBQUssRUFBNEIsQ0FBQztJQUVsRSxzQkFBc0IsR0FBMEMsRUFBRSxDQUFDO0lBRTVFLE1BQU0sQ0FBVztJQUVQLGFBQWEsR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO0lBRW5EOzs7Ozs7Ozs7T0FTRztJQUNJLElBQUksQ0FBQyxVQUFrQixFQUFFLE1BQWdCO1FBQzlDLElBQUksQ0FBQztZQUNILE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDN0MsSUFBSSxNQUFNLEVBQUUsQ0FBQztnQkFDWCxJQUFJLDJCQUFpQixDQUFDLGtCQUFRLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxvQkFBb0IsUUFBUSxTQUFTLFVBQVUsRUFBRSxDQUFDLENBQUM7WUFDdEgsQ0FBQztZQUNELE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNoQyxDQUFDO1FBQUMsT0FBTyxDQUFNLEVBQUUsQ0FBQztZQUNoQiwrRUFBK0U7WUFDL0UseUVBQXlFO1lBQ3pFLGdGQUFnRjtZQUNoRix3RUFBd0U7WUFDeEUsTUFBTSxJQUFJLDRCQUFZLENBQUMsa0RBQWtELFVBQVUsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2hHLENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLE9BQU8sQ0FBQyxRQUFnQjtRQUM3QixJQUFJLENBQUM7WUFDSCxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7Z0JBQ3JDLE9BQU87WUFDVCxDQUFDO1lBRUQsMERBQTBEO1lBQzFELE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNqQyxtQkFBbUI7WUFDbkIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO2dCQUN0QixNQUFNLElBQUksNEJBQVksQ0FBQyxVQUFVLFFBQVEseURBQXlELENBQUMsQ0FBQztZQUN0RyxDQUFDO1lBQ0QsSUFBSSxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ2hCLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDcEIsQ0FBQztZQUVELElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ25DLENBQUM7UUFBQyxPQUFPLENBQU0sRUFBRSxDQUFDO1lBQ2hCLE1BQU0sNEJBQVksQ0FBQyxTQUFTLENBQUMsMkJBQTJCLFFBQVEsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzFFLENBQUM7UUFFRCxTQUFTLFFBQVEsQ0FBQyxDQUFNO1lBQ3RCLE9BQU8sQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLENBQUMsT0FBTyxLQUFLLEdBQUcsQ0FBQztRQUN4QyxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxnQ0FBZ0MsQ0FBQyxNQUFnQztRQUN0RSx1REFBdUQ7UUFDdkQsSUFBSSxDQUFDLHlCQUF5QixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7T0ErQkc7SUFDSSw0QkFBNEIsQ0FBQyxrQkFBMEIsRUFBRSxRQUErQjtRQUM3RixJQUFJLENBQUMsSUFBQSxpREFBdUIsRUFBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1lBQ3ZDLE1BQU0sSUFBSSw0QkFBWSxDQUFDLGtFQUFrRSxJQUFBLGNBQU8sRUFBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDaEgsQ0FBQztRQUNELElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLFFBQVEsQ0FBQztJQUM3RCxDQUFDO0NBQ0Y7QUF0SEQsZ0NBc0hDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaW5zcGVjdCB9IGZyb20gJ3V0aWwnO1xuaW1wb3J0IHR5cGUgeyBDcmVkZW50aWFsUHJvdmlkZXJTb3VyY2UsIElQbHVnaW5Ib3N0LCBQbHVnaW4gfSBmcm9tICdAYXdzLWNkay9jbGktcGx1Z2luLWNvbnRyYWN0JztcbmltcG9ydCB7IHR5cGUgQ29udGV4dFByb3ZpZGVyUGx1Z2luLCBpc0NvbnRleHRQcm92aWRlclBsdWdpbiB9IGZyb20gJy4vY29udGV4dC1wcm92aWRlci1wbHVnaW4nO1xuaW1wb3J0IHR5cGUgeyBJSW9Ib3N0IH0gZnJvbSAnLi4vaW8nO1xuaW1wb3J0IHsgSW9EZWZhdWx0TWVzc2FnZXMsIElvSGVscGVyIH0gZnJvbSAnLi4vcHJpdmF0ZSc7XG5pbXBvcnQgeyBUb29sa2l0RXJyb3IgfSBmcm9tICcuLi90b29sa2l0LWVycm9yJztcblxuZXhwb3J0IGxldCBURVNUSU5HID0gZmFsc2U7XG5cbmV4cG9ydCBmdW5jdGlvbiBtYXJrVGVzdGluZygpIHtcbiAgVEVTVElORyA9IHRydWU7XG59XG5cbi8qKlxuICogQ2xhc3MgdG8gbWFuYWdlIGEgcGx1Z2luIGNvbGxlY3Rpb25cbiAqXG4gKiBJdCBwcm92aWRlcyBhIGBsb2FkKClgIGZ1bmN0aW9uIHRoYXQgbG9hZHMgYSBKYXZhU2NyaXB0XG4gKiBtb2R1bGUgZnJvbSBkaXNrLCBhbmQgZ2l2ZXMgaXQgYWNjZXNzIHRvIHRoZSBgSVBsdWdpbkhvc3RgIGludGVyZmFjZVxuICogdG8gcmVnaXN0ZXIgaXRzZWxmLlxuICovXG5leHBvcnQgY2xhc3MgUGx1Z2luSG9zdCBpbXBsZW1lbnRzIElQbHVnaW5Ib3N0IHtcbiAgLyoqXG4gICAqIEFjY2VzcyB0aGUgY3VycmVudGx5IHJlZ2lzdGVyZWQgQ3JlZGVudGlhbFByb3ZpZGVyU291cmNlcy4gTmV3IHNvdXJjZXMgY2FuXG4gICAqIGJlIHJlZ2lzdGVyZWQgdXNpbmcgdGhlICtyZWdpc3RlckNyZWRlbnRpYWxQcm92aWRlclNvdXJjZSsgbWV0aG9kLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGNyZWRlbnRpYWxQcm92aWRlclNvdXJjZXMgPSBuZXcgQXJyYXk8Q3JlZGVudGlhbFByb3ZpZGVyU291cmNlPigpO1xuXG4gIHB1YmxpYyByZWFkb25seSBjb250ZXh0UHJvdmlkZXJQbHVnaW5zOiBSZWNvcmQ8c3RyaW5nLCBDb250ZXh0UHJvdmlkZXJQbHVnaW4+ID0ge307XG5cbiAgcHVibGljIGlvSG9zdD86IElJb0hvc3Q7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBhbHJlYWR5TG9hZGVkID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgLyoqXG4gICAqIExvYWRzIGEgcGx1Zy1pbiBpbnRvIHRoaXMgUGx1Z2luSG9zdC5cbiAgICpcbiAgICogV2lsbCB1c2UgYHJlcXVpcmUucmVzb2x2ZSgpYCB0byBnZXQgdGhlIG1vc3QgYWNjdXJhdGUgcmVwcmVzZW50YXRpb24gb2Ygd2hhdFxuICAgKiBjb2RlIHdpbGwgZ2V0IGxvYWRlZCBpbiBlcnJvciBtZXNzYWdlcy4gQXMgc3VjaCwgaXQgd2lsbCBub3Qgd29yayBpblxuICAgKiB1bml0IHRlc3RzIHdpdGggSmVzdCB2aXJ0dWFsIG1vZHVsZXMgYmVjYXVhc2Ugb2YgPGh0dHBzOi8vZ2l0aHViLmNvbS9qZXN0anMvamVzdC9pc3N1ZXMvOTU0Mz4uXG4gICAqXG4gICAqIEBwYXJhbSBtb2R1bGVTcGVjIHRoZSBzcGVjaWZpY2F0aW9uIChwYXRoIG9yIG5hbWUpIG9mIHRoZSBwbHVnLWluIG1vZHVsZSB0byBiZSBsb2FkZWQuXG4gICAqIEBwYXJhbSBpb0hvc3QgdGhlIEkvTyBob3N0IHRvIHVzZSBmb3IgcHJpbnRpbmcgcHJvZ3Jlc3MgaW5mb3JtYXRpb25cbiAgICovXG4gIHB1YmxpYyBsb2FkKG1vZHVsZVNwZWM6IHN0cmluZywgaW9Ib3N0PzogSUlvSG9zdCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNvbHZlZCA9IHJlcXVpcmUucmVzb2x2ZShtb2R1bGVTcGVjKTtcbiAgICAgIGlmIChpb0hvc3QpIHtcbiAgICAgICAgbmV3IElvRGVmYXVsdE1lc3NhZ2VzKElvSGVscGVyLmZyb21Jb0hvc3QoaW9Ib3N0LCAnaW5pdCcpKS5kZWJ1ZyhgTG9hZGluZyBwbHVnLWluOiAke3Jlc29sdmVkfSBmcm9tICR7bW9kdWxlU3BlY31gKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLl9kb0xvYWQocmVzb2x2ZWQpO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgLy8gYWNjb3JkaW5nIHRvIE5vZGUuanMgZG9jcyBgTU9EVUxFX05PVF9GT1VORGAgaXMgdGhlIG9ubHkgcG9zc2libGUgZXJyb3IgaGVyZVxuICAgICAgLy8gQHNlZSBodHRwczovL25vZGVqcy5vcmcvYXBpL21vZHVsZXMuaHRtbCNyZXF1aXJlcmVzb2x2ZXJlcXVlc3Qtb3B0aW9uc1xuICAgICAgLy8gTm90IHVzaW5nIGB3aXRoQ2F1c2UoKWAgaGVyZSwgc2luY2UgdGhlIG5vZGUgZXJyb3IgY29udGFpbnMgYSBcIlJlcXVpcmUgU3RhY2tcIlxuICAgICAgLy8gYXMgcGFydCBvZiB0aGUgZXJyb3IgbWVzc2FnZSB0aGF0IGlzIGluaGVyZW50bHkgdXNlbGVzcyB0byBvdXIgdXNlcnMuXG4gICAgICB0aHJvdyBuZXcgVG9vbGtpdEVycm9yKGBVbmFibGUgdG8gcmVzb2x2ZSBwbHVnLWluOiBDYW5ub3QgZmluZCBtb2R1bGUgJyR7bW9kdWxlU3BlY30nOiAke2V9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERvIHRoZSBsb2FkaW5nIGdpdmVuIGFuIGFscmVhZHktcmVzb2x2ZWQgbW9kdWxlIG5hbWVcbiAgICpcbiAgICogQGludGVybmFsXG4gICAqL1xuICBwdWJsaWMgX2RvTG9hZChyZXNvbHZlZDogc3RyaW5nKSB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICh0aGlzLmFscmVhZHlMb2FkZWQuaGFzKHJlc29sdmVkKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHMgKi9cbiAgICAgIGNvbnN0IHBsdWdpbiA9IHJlcXVpcmUocmVzb2x2ZWQpO1xuICAgICAgLyogZXNsaW50LWVuYWJsZSAqL1xuICAgICAgaWYgKCFpc1BsdWdpbihwbHVnaW4pKSB7XG4gICAgICAgIHRocm93IG5ldyBUb29sa2l0RXJyb3IoYE1vZHVsZSAke3Jlc29sdmVkfSBpcyBub3QgYSB2YWxpZCBwbHVnLWluLCBvciBoYXMgYW4gdW5zdXBwb3J0ZWQgdmVyc2lvbi5gKTtcbiAgICAgIH1cbiAgICAgIGlmIChwbHVnaW4uaW5pdCkge1xuICAgICAgICBwbHVnaW4uaW5pdCh0aGlzKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5hbHJlYWR5TG9hZGVkLmFkZChyZXNvbHZlZCk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyBUb29sa2l0RXJyb3Iud2l0aENhdXNlKGBVbmFibGUgdG8gbG9hZCBwbHVnLWluICcke3Jlc29sdmVkfSdgLCBlKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc1BsdWdpbih4OiBhbnkpOiB4IGlzIFBsdWdpbiB7XG4gICAgICByZXR1cm4geCAhPSBudWxsICYmIHgudmVyc2lvbiA9PT0gJzEnO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBbGxvd3MgcGx1Zy1pbnMgdG8gcmVnaXN0ZXIgbmV3IENyZWRlbnRpYWxQcm92aWRlclNvdXJjZXMuXG4gICAqXG4gICAqIEBwYXJhbSBzb3VyY2UgYSBuZXcgQ3JlZGVudGlhbFByb3ZpZGVyU291cmNlIHRvIHJlZ2lzdGVyLlxuICAgKi9cbiAgcHVibGljIHJlZ2lzdGVyQ3JlZGVudGlhbFByb3ZpZGVyU291cmNlKHNvdXJjZTogQ3JlZGVudGlhbFByb3ZpZGVyU291cmNlKSB7XG4gICAgLy8gRm9yd2FyZCB0byB0aGUgcmlnaHQgY3JlZGVudGlhbHMtcmVsYXRlZCBwbHVnaW4gaG9zdFxuICAgIHRoaXMuY3JlZGVudGlhbFByb3ZpZGVyU291cmNlcy5wdXNoKHNvdXJjZSk7XG4gIH1cblxuICAvKipcbiAgICogKEVYUEVSSU1FTlRBTCkgQWxsb3cgcGx1Z2lucyB0byByZWdpc3RlciBjb250ZXh0IHByb3ZpZGVyc1xuICAgKlxuICAgKiBDb250ZXh0IHByb3ZpZGVycyBhcmUgb2JqZWN0cyB3aXRoIHRoZSBmb2xsb3dpbmcgbWV0aG9kOlxuICAgKlxuICAgKiBgYGB0c1xuICAgKiAgIGdldFZhbHVlKGFyZ3M6IHtba2V5OiBzdHJpbmddOiBhbnl9KTogUHJvbWlzZTxhbnk+O1xuICAgKiBgYGBcbiAgICpcbiAgICogQ3VycmVudGx5LCB0aGV5IGNhbm5vdCByZXVzZSB0aGUgQ0RLJ3MgYXV0aGVudGljYXRpb24gbWVjaGFuaXNtcywgc28gdGhleVxuICAgKiBtdXN0IGJlIHByZXBhcmVkIHRvIGVpdGhlciBub3QgbWFrZSBBV1MgY2FsbHMgb3IgdXNlIHRoZWlyIG93biBzb3VyY2Ugb2ZcbiAgICogQVdTIGNyZWRlbnRpYWxzLlxuICAgKlxuICAgKiBUaGlzIGZlYXR1cmUgaXMgZXhwZXJpbWVudGFsLCBhbmQgb25seSBpbnRlbmRlZCB0byBiZSB1c2VkIGludGVybmFsbHkgYXQgQW1hem9uXG4gICAqIGFzIGEgdHJpYWwuXG4gICAqXG4gICAqIEFmdGVyIHJlZ2lzdGVyaW5nIHdpdGggJ215LXBsdWdpbi1uYW1lJywgdGhlIHByb3ZpZGVyIG11c3QgYmUgYWRkcmVzc2VkIGFzIGZvbGxvd3M6XG4gICAqXG4gICAqIGBgYHRzXG4gICAqIGNvbnN0IHZhbHVlID0gQ29udGV4dFByb3ZpZGVyLmdldFZhbHVlKHRoaXMsIHtcbiAgICogICBwcm92aWRlck5hbWU6ICdwbHVnaW4nLFxuICAgKiAgIHByb3BzOiB7XG4gICAqICAgICBwbHVnaW5OYW1lOiAnbXktcGx1Z2luLW5hbWUnLFxuICAgKiAgICAgbXlQYXJhbWV0ZXIxOiAneHl6JyxcbiAgICogICB9LFxuICAgKiAgIGluY2x1ZGVFbnZpcm9ubWVudDogdHJ1ZSB8IGZhbHNlLFxuICAgKiAgIGR1bW15VmFsdWU6ICd3aGF0LXRvLXJldHVybi1vbi10aGUtZmlyc3QtcGFzcycsXG4gICAqIH0pXG4gICAqIGBgYFxuICAgKlxuICAgKiBAZXhwZXJpbWVudGFsXG4gICAqL1xuICBwdWJsaWMgcmVnaXN0ZXJDb250ZXh0UHJvdmlkZXJBbHBoYShwbHVnaW5Qcm92aWRlck5hbWU6IHN0cmluZywgcHJvdmlkZXI6IENvbnRleHRQcm92aWRlclBsdWdpbikge1xuICAgIGlmICghaXNDb250ZXh0UHJvdmlkZXJQbHVnaW4ocHJvdmlkZXIpKSB7XG4gICAgICB0aHJvdyBuZXcgVG9vbGtpdEVycm9yKGBPYmplY3QgeW91IGdhdmUgbWUgZG9lcyBub3QgbG9vayBsaWtlIGEgQ29udGV4dFByb3ZpZGVyUGx1Z2luOiAke2luc3BlY3QocHJvdmlkZXIpfWApO1xuICAgIH1cbiAgICB0aGlzLmNvbnRleHRQcm92aWRlclBsdWdpbnNbcGx1Z2luUHJvdmlkZXJOYW1lXSA9IHByb3ZpZGVyO1xuICB9XG59XG4iXX0=
@@ -0,0 +1 @@
1
+ export * from './io/private';
@@ -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("./io/private"), exports);
18
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJpdmF0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInByaXZhdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLCtDQUE2QiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vaW8vcHJpdmF0ZSc7XG4iXX0=
@@ -0,0 +1,15 @@
1
+ import type * as cxapi from '@aws-cdk/cx-api';
2
+ export interface CloudFormationTemplate {
3
+ Resources?: {
4
+ [logicalId: string]: {
5
+ Type: string;
6
+ Properties?: any;
7
+ Metadata?: Record<string, any>;
8
+ };
9
+ };
10
+ }
11
+ export interface CloudFormationStack {
12
+ readonly environment: cxapi.Environment;
13
+ readonly stackName: string;
14
+ readonly template: CloudFormationTemplate;
15
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xvdWRmb3JtYXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJjbG91ZGZvcm1hdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgKiBhcyBjeGFwaSBmcm9tICdAYXdzLWNkay9jeC1hcGknO1xuXG5leHBvcnQgaW50ZXJmYWNlIENsb3VkRm9ybWF0aW9uVGVtcGxhdGUge1xuICBSZXNvdXJjZXM/OiB7XG4gICAgW2xvZ2ljYWxJZDogc3RyaW5nXToge1xuICAgICAgVHlwZTogc3RyaW5nO1xuICAgICAgUHJvcGVydGllcz86IGFueTtcbiAgICAgIE1ldGFkYXRhPzogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICB9O1xuICB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENsb3VkRm9ybWF0aW9uU3RhY2sge1xuICByZWFkb25seSBlbnZpcm9ubWVudDogY3hhcGkuRW52aXJvbm1lbnQ7XG4gIHJlYWRvbmx5IHN0YWNrTmFtZTogc3RyaW5nO1xuICByZWFkb25seSB0ZW1wbGF0ZTogQ2xvdWRGb3JtYXRpb25UZW1wbGF0ZTtcbn1cbiJdfQ==
@@ -0,0 +1,26 @@
1
+ import type { CloudFormationTemplate } from './cloudformation';
2
+ /**
3
+ * Computes the digest for each resource in the template.
4
+ *
5
+ * Conceptually, the digest is computed as:
6
+ *
7
+ * d(resource) = hash(type + physicalId) , if physicalId is defined
8
+ * = hash(type + properties + dependencies.map(d)) , otherwise
9
+ *
10
+ * where `hash` is a cryptographic hash function. In other words, if a resource has
11
+ * a physical ID, we use the physical ID plus its type to uniquely identify
12
+ * that resource. In this case, the digest can be computed from these two fields
13
+ * alone. A corollary is that such resources can be renamed and have their
14
+ * properties updated at the same time, and still be considered equivalent.
15
+ *
16
+ * Otherwise, the digest is computed from its type, its own properties (that is,
17
+ * excluding properties that refer to other resources), and the digests of each of
18
+ * its dependencies.
19
+ *
20
+ * The digest of a resource, defined recursively this way, remains stable even if
21
+ * one or more of its dependencies gets renamed. Since the resources in a
22
+ * CloudFormation template form a directed acyclic graph, this function is
23
+ * well-defined.
24
+ */
25
+ export declare function computeResourceDigests(template: CloudFormationTemplate): Record<string, string>;
26
+ export declare function hashObject(obj: any): string;
@@ -0,0 +1,175 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.computeResourceDigests = computeResourceDigests;
4
+ exports.hashObject = hashObject;
5
+ const crypto = require("node:crypto");
6
+ const util_1 = require("@aws-cdk/cloudformation-diff/lib/diff/util");
7
+ /**
8
+ * Computes the digest for each resource in the template.
9
+ *
10
+ * Conceptually, the digest is computed as:
11
+ *
12
+ * d(resource) = hash(type + physicalId) , if physicalId is defined
13
+ * = hash(type + properties + dependencies.map(d)) , otherwise
14
+ *
15
+ * where `hash` is a cryptographic hash function. In other words, if a resource has
16
+ * a physical ID, we use the physical ID plus its type to uniquely identify
17
+ * that resource. In this case, the digest can be computed from these two fields
18
+ * alone. A corollary is that such resources can be renamed and have their
19
+ * properties updated at the same time, and still be considered equivalent.
20
+ *
21
+ * Otherwise, the digest is computed from its type, its own properties (that is,
22
+ * excluding properties that refer to other resources), and the digests of each of
23
+ * its dependencies.
24
+ *
25
+ * The digest of a resource, defined recursively this way, remains stable even if
26
+ * one or more of its dependencies gets renamed. Since the resources in a
27
+ * CloudFormation template form a directed acyclic graph, this function is
28
+ * well-defined.
29
+ */
30
+ function computeResourceDigests(template) {
31
+ const resources = template.Resources || {};
32
+ const graph = {};
33
+ const reverseGraph = {};
34
+ // 1. Build adjacency lists
35
+ for (const id of Object.keys(resources)) {
36
+ graph[id] = new Set();
37
+ reverseGraph[id] = new Set();
38
+ }
39
+ // 2. Detect dependencies by searching for Ref/Fn::GetAtt
40
+ const findDependencies = (value) => {
41
+ if (!value || typeof value !== 'object')
42
+ return [];
43
+ if (Array.isArray(value)) {
44
+ return value.flatMap(findDependencies);
45
+ }
46
+ if ('Ref' in value) {
47
+ return [value.Ref];
48
+ }
49
+ if ('Fn::GetAtt' in value) {
50
+ const refTarget = Array.isArray(value['Fn::GetAtt']) ? value['Fn::GetAtt'][0] : value['Fn::GetAtt'].split('.')[0];
51
+ return [refTarget];
52
+ }
53
+ if ('DependsOn' in value) {
54
+ return [value.DependsOn];
55
+ }
56
+ return Object.values(value).flatMap(findDependencies);
57
+ };
58
+ for (const [id, res] of Object.entries(resources)) {
59
+ const deps = findDependencies(res || {});
60
+ for (const dep of deps) {
61
+ if (dep in resources && dep !== id) {
62
+ graph[id].add(dep);
63
+ reverseGraph[dep].add(id);
64
+ }
65
+ }
66
+ }
67
+ // 3. Topological sort
68
+ const outDegree = Object.keys(graph).reduce((acc, k) => {
69
+ acc[k] = graph[k].size;
70
+ return acc;
71
+ }, {});
72
+ const queue = Object.keys(outDegree).filter((k) => outDegree[k] === 0);
73
+ const order = [];
74
+ while (queue.length > 0) {
75
+ const node = queue.shift();
76
+ order.push(node);
77
+ for (const nxt of reverseGraph[node]) {
78
+ outDegree[nxt]--;
79
+ if (outDegree[nxt] === 0) {
80
+ queue.push(nxt);
81
+ }
82
+ }
83
+ }
84
+ // 4. Compute digests in sorted order
85
+ const result = {};
86
+ for (const id of order) {
87
+ const resource = resources[id];
88
+ const resourceProperties = resource.Properties ?? {};
89
+ const model = (0, util_1.loadResourceModel)(resource.Type);
90
+ const identifier = intersection(Object.keys(resourceProperties), model?.primaryIdentifier ?? []);
91
+ let toHash;
92
+ if (identifier.length === model?.primaryIdentifier?.length) {
93
+ // The resource has a physical ID defined, so we can
94
+ // use the ID and the type as the identity of the resource.
95
+ toHash =
96
+ resource.Type +
97
+ identifier
98
+ .sort()
99
+ .map((attr) => JSON.stringify(resourceProperties[attr]))
100
+ .join('');
101
+ }
102
+ else {
103
+ // The resource does not have a physical ID defined, so we need to
104
+ // compute the digest based on its properties and dependencies.
105
+ const depDigests = Array.from(graph[id]).map((d) => result[d]);
106
+ const propertiesHash = hashObject(stripReferences(stripConstructPath(resource)));
107
+ toHash = resource.Type + propertiesHash + depDigests.join('');
108
+ }
109
+ result[id] = crypto.createHash('sha256').update(toHash).digest('hex');
110
+ }
111
+ return result;
112
+ }
113
+ function hashObject(obj) {
114
+ const hash = crypto.createHash('sha256');
115
+ function addToHash(value) {
116
+ if (value == null) {
117
+ addToHash('null');
118
+ }
119
+ else if (typeof value === 'object') {
120
+ if (Array.isArray(value)) {
121
+ value.forEach(addToHash);
122
+ }
123
+ else {
124
+ Object.keys(value)
125
+ .sort()
126
+ .forEach((key) => {
127
+ hash.update(key);
128
+ addToHash(value[key]);
129
+ });
130
+ }
131
+ }
132
+ else {
133
+ hash.update(typeof value + value.toString());
134
+ }
135
+ }
136
+ addToHash(obj);
137
+ return hash.digest('hex');
138
+ }
139
+ /**
140
+ * Removes sub-properties containing Ref or Fn::GetAtt to avoid hashing
141
+ * references themselves but keeps the property structure.
142
+ */
143
+ function stripReferences(value) {
144
+ if (!value || typeof value !== 'object')
145
+ return value;
146
+ if (Array.isArray(value)) {
147
+ return value.map(stripReferences);
148
+ }
149
+ if ('Ref' in value) {
150
+ return { __cloud_ref__: 'Ref' };
151
+ }
152
+ if ('Fn::GetAtt' in value) {
153
+ return { __cloud_ref__: 'Fn::GetAtt' };
154
+ }
155
+ if ('DependsOn' in value) {
156
+ return { __cloud_ref__: 'DependsOn' };
157
+ }
158
+ const result = {};
159
+ for (const [k, v] of Object.entries(value)) {
160
+ result[k] = stripReferences(v);
161
+ }
162
+ return result;
163
+ }
164
+ function stripConstructPath(resource) {
165
+ if (resource?.Metadata?.['aws:cdk:path'] == null) {
166
+ return resource;
167
+ }
168
+ const copy = JSON.parse(JSON.stringify(resource));
169
+ delete copy.Metadata['aws:cdk:path'];
170
+ return copy;
171
+ }
172
+ function intersection(a, b) {
173
+ return a.filter((value) => b.includes(value));
174
+ }
175
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlnZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZGlnZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBMkJBLHdEQTBGQztBQUVELGdDQXdCQztBQS9JRCxzQ0FBc0M7QUFDdEMscUVBQStFO0FBRy9FOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0JHO0FBQ0gsU0FBZ0Isc0JBQXNCLENBQUMsUUFBZ0M7SUFDckUsTUFBTSxTQUFTLEdBQUcsUUFBUSxDQUFDLFNBQVMsSUFBSSxFQUFFLENBQUM7SUFDM0MsTUFBTSxLQUFLLEdBQWdDLEVBQUUsQ0FBQztJQUM5QyxNQUFNLFlBQVksR0FBZ0MsRUFBRSxDQUFDO0lBRXJELDJCQUEyQjtJQUMzQixLQUFLLE1BQU0sRUFBRSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztRQUN4QyxLQUFLLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUN0QixZQUFZLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUMvQixDQUFDO0lBRUQseURBQXlEO0lBQ3pELE1BQU0sZ0JBQWdCLEdBQUcsQ0FBQyxLQUFVLEVBQVksRUFBRTtRQUNoRCxJQUFJLENBQUMsS0FBSyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVE7WUFBRSxPQUFPLEVBQUUsQ0FBQztRQUNuRCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUN6QixPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUN6QyxDQUFDO1FBQ0QsSUFBSSxLQUFLLElBQUksS0FBSyxFQUFFLENBQUM7WUFDbkIsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNyQixDQUFDO1FBQ0QsSUFBSSxZQUFZLElBQUksS0FBSyxFQUFFLENBQUM7WUFDMUIsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFD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Q0FBQyxDQUFDO0FBQ2hELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBjcnlwdG8gZnJvbSAnbm9kZTpjcnlwdG8nO1xuaW1wb3J0IHsgbG9hZFJlc291cmNlTW9kZWwgfSBmcm9tICdAYXdzLWNkay9jbG91ZGZvcm1hdGlvbi1kaWZmL2xpYi9kaWZmL3V0aWwnO1xuaW1wb3J0IHR5cGUgeyBDbG91ZEZvcm1hdGlvblRlbXBsYXRlIH0gZnJvbSAnLi9jbG91ZGZvcm1hdGlvbic7XG5cbi8qKlxuICogQ29tcHV0ZXMgdGhlIGRpZ2VzdCBmb3IgZWFjaCByZXNvdXJjZSBpbiB0aGUgdGVtcGxhdGUuXG4gKlxuICogQ29uY2VwdHVhbGx5LCB0aGUgZGlnZXN0IGlzIGNvbXB1dGVkIGFzOlxuICpcbiAqICAgICBkKHJlc291cmNlKSA9IGhhc2godHlwZSArIHBoeXNpY2FsSWQpICAgICAgICAgICAgICAgICAgICAgICAsIGlmIHBoeXNpY2FsSWQgaXMgZGVmaW5lZFxuICogICAgICAgICAgICAgICAgID0gaGFzaCh0eXBlICsgcHJvcGVydGllcyArIGRlcGVuZGVuY2llcy5tYXAoZCkpICwgb3RoZXJ3aXNlXG4gKlxuICogd2hlcmUgYGhhc2hgIGlzIGEgY3J5cHRvZ3JhcGhpYyBoYXNoIGZ1bmN0aW9uLiBJbiBvdGhlciB3b3JkcywgaWYgYSByZXNvdXJjZSBoYXNcbiAqIGEgcGh5c2ljYWwgSUQsIHdlIHVzZSB0aGUgcGh5c2ljYWwgSUQgcGx1cyBpdHMgdHlwZSB0byB1bmlxdWVseSBpZGVudGlmeVxuICogdGhhdCByZXNvdXJjZS4gSW4gdGhpcyBjYXNlLCB0aGUgZGlnZXN0IGNhbiBiZSBjb21wdXRlZCBmcm9tIHRoZXNlIHR3byBmaWVsZHNcbiAqIGFsb25lLiBBIGNvcm9sbGFyeSBpcyB0aGF0IHN1Y2ggcmVzb3VyY2VzIGNhbiBiZSByZW5hbWVkIGFuZCBoYXZlIHRoZWlyXG4gKiBwcm9wZXJ0aWVzIHVwZGF0ZWQgYXQgdGhlIHNhbWUgdGltZSwgYW5kIHN0aWxsIGJlIGNvbnNpZGVyZWQgZXF1aXZhbGVudC5cbiAqXG4gKiBPdGhlcndpc2UsIHRoZSBkaWdlc3QgaXMgY29tcHV0ZWQgZnJvbSBpdHMgdHlwZSwgaXRzIG93biBwcm9wZXJ0aWVzICh0aGF0IGlzLFxuICogZXhjbHVkaW5nIHByb3BlcnRpZXMgdGhhdCByZWZlciB0byBvdGhlciByZXNvdXJjZXMpLCBhbmQgdGhlIGRpZ2VzdHMgb2YgZWFjaCBvZlxuICogaXRzIGRlcGVuZGVuY2llcy5cbiAqXG4gKiBUaGUgZGlnZXN0IG9mIGEgcmVzb3VyY2UsIGRlZmluZWQgcmVjdXJzaXZlbHkgdGhpcyB3YXksIHJlbWFpbnMgc3RhYmxlIGV2ZW4gaWZcbiAqIG9uZSBvciBtb3JlIG9mIGl0cyBkZXBlbmRlbmNpZXMgZ2V0cyByZW5hbWVkLiBTaW5jZSB0aGUgcmVzb3VyY2VzIGluIGFcbiAqIENsb3VkRm9ybWF0aW9uIHRlbXBsYXRlIGZvcm0gYSBkaXJlY3RlZCBhY3ljbGljIGdyYXBoLCB0aGlzIGZ1bmN0aW9uIGlzXG4gKiB3ZWxsLWRlZmluZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlUmVzb3VyY2VEaWdlc3RzKHRlbXBsYXRlOiBDbG91ZEZvcm1hdGlvblRlbXBsYXRlKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIGNvbnN0IHJlc291cmNlcyA9IHRlbXBsYXRlLlJlc291cmNlcyB8fCB7fTtcbiAgY29uc3QgZ3JhcGg6IFJlY29yZDxzdHJpbmcsIFNldDxzdHJpbmc+PiA9IHt9O1xuICBjb25zdCByZXZlcnNlR3JhcGg6IFJlY29yZDxzdHJpbmcsIFNldDxzdHJpbmc+PiA9IHt9O1xuXG4gIC8vIDEuIEJ1aWxkIGFkamFjZW5jeSBsaXN0c1xuICBmb3IgKGNvbnN0IGlkIG9mIE9iamVjdC5rZXlzKHJlc291cmNlcykpIHtcbiAgICBncmFwaFtpZF0gPSBuZXcgU2V0KCk7XG4gICAgcmV2ZXJzZUdyYXBoW2lkXSA9IG5ldyBTZXQoKTtcbiAgfVxuXG4gIC8vIDIuIERldGVjdCBkZXBlbmRlbmNpZXMgYnkgc2VhcmNoaW5nIGZvciBSZWYvRm46OkdldEF0dFxuICBjb25zdCBmaW5kRGVwZW5kZW5jaWVzID0gKHZhbHVlOiBhbnkpOiBzdHJpbmdbXSA9PiB7XG4gICAgaWYgKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSByZXR1cm4gW107XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICByZXR1cm4gdmFsdWUuZmxhdE1hcChmaW5kRGVwZW5kZW5jaWVzKTtcbiAgICB9XG4gICAgaWYgKCdSZWYnIGluIHZhbHVlKSB7XG4gICAgICByZXR1cm4gW3ZhbHVlLlJlZl07XG4gICAgfVxuICAgIGlmICgnRm46OkdldEF0dCcgaW4gdmFsdWUpIHtcbiAgICAgIGNvbnN0IHJlZlRhcmdldCA9IEFycmF5LmlzQXJyYXkodmFsdWVbJ0ZuOjpHZXRBdHQnXSkgPyB2YWx1ZVsnRm46OkdldEF0dCddWzBdIDogdmFsdWVbJ0ZuOjpHZXRBdHQnXS5zcGxpdCgnLicpWzBdO1xuICAgICAgcmV0dXJuIFtyZWZUYXJnZXRdO1xuICAgIH1cbiAgICBpZiAoJ0RlcGVuZHNPbicgaW4gdmFsdWUpIHtcbiAgICAgIHJldHVybiBbdmFsdWUuRGVwZW5kc09uXTtcbiAgICB9XG4gICAgcmV0dXJuIE9iamVjdC52YWx1ZXModmFsdWUpLmZsYXRNYXAoZmluZERlcGVuZGVuY2llcyk7XG4gIH07XG5cbiAgZm9yIChjb25zdCBbaWQsIHJlc10gb2YgT2JqZWN0LmVudHJpZXMocmVzb3VyY2VzKSkge1xuICAgIGNvbnN0IGRlcHMgPSBmaW5kRGVwZW5kZW5jaWVzKHJlcyB8fCB7fSk7XG4gICAgZm9yIChjb25zdCBkZXAgb2YgZGVwcykge1xuICAgICAgaWYgKGRlcCBpbiByZXNvdXJjZXMgJiYgZGVwICE9PSBpZCkge1xuICAgICAgICBncmFwaFtpZF0uYWRkKGRlcCk7XG4gICAgICAgIHJldmVyc2VHcmFwaFtkZXBdLmFkZChpZCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gMy4gVG9wb2xvZ2ljYWwgc29ydFxuICBjb25zdCBvdXREZWdyZWUgPSBPYmplY3Qua2V5cyhncmFwaCkucmVkdWNlKChhY2MsIGspID0+IHtcbiAgICBhY2Nba10gPSBncmFwaFtrXS5zaXplO1xuICAgIHJldHVybiBhY2M7XG4gIH0sIHt9IGFzIFJlY29yZDxzdHJpbmcsIG51bWJlcj4pO1xuXG4gIGNvbnN0IHF1ZXVlID0gT2JqZWN0LmtleXMob3V0RGVncmVlKS5maWx0ZXIoKGspID0+IG91dERlZ3JlZVtrXSA9PT0gMCk7XG4gIGNvbnN0IG9yZGVyOiBzdHJpbmdbXSA9IFtdO1xuXG4gIHdoaWxlIChxdWV1ZS5sZW5ndGggPiAwKSB7XG4gICAgY29uc3Qgbm9kZSA9IHF1ZXVlLnNoaWZ0KCkhO1xuICAgIG9yZGVyLnB1c2gobm9kZSk7XG4gICAgZm9yIChjb25zdCBueHQgb2YgcmV2ZXJzZUdyYXBoW25vZGVdKSB7XG4gICAgICBvdXREZWdyZWVbbnh0XS0tO1xuICAgICAgaWYgKG91dERlZ3JlZVtueHRdID09PSAwKSB7XG4gICAgICAgIHF1ZXVlLnB1c2gobnh0KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyA0LiBDb21wdXRlIGRpZ2VzdHMgaW4gc29ydGVkIG9yZGVyXG4gIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBmb3IgKGNvbnN0IGlkIG9mIG9yZGVyKSB7XG4gICAgY29uc3QgcmVzb3VyY2UgPSByZXNvdXJjZXNbaWRdO1xuICAgIGNvbnN0IHJlc291cmNlUHJvcGVydGllcyA9IHJlc291cmNlLlByb3BlcnRpZXMgPz8ge307XG4gICAgY29uc3QgbW9kZWwgPSBsb2FkUmVzb3VyY2VNb2RlbChyZXNvdXJjZS5UeXBlKTtcbiAgICBjb25zdCBpZGVudGlmaWVyID0gaW50ZXJzZWN0aW9uKE9iamVjdC5rZXlzKHJlc291cmNlUHJvcGVydGllcyksIG1vZGVsPy5wcmltYXJ5SWRlbnRpZmllciA/PyBbXSk7XG4gICAgbGV0IHRvSGFzaDogc3RyaW5nO1xuXG4gICAgaWYgKGlkZW50aWZpZXIubGVuZ3RoID09PSBtb2RlbD8ucHJpbWFyeUlkZW50aWZpZXI/Lmxlbmd0aCkge1xuICAgICAgLy8gVGhlIHJlc291cmNlIGhhcyBhIHBoeXNpY2FsIElEIGRlZmluZWQsIHNvIHdlIGNhblxuICAgICAgLy8gdXNlIHRoZSBJRCBhbmQgdGhlIHR5cGUgYXMgdGhlIGlkZW50aXR5IG9mIHRoZSByZXNvdXJjZS5cbiAgICAgIHRvSGFzaCA9XG4gICAgICAgIHJlc291cmNlLlR5cGUgK1xuICAgICAgICBpZGVudGlmaWVyXG4gICAgICAgICAgLnNvcnQoKVxuICAgICAgICAgIC5tYXAoKGF0dHIpID0+IEpTT04uc3RyaW5naWZ5KHJlc291cmNlUHJvcGVydGllc1thdHRyXSkpXG4gICAgICAgICAgLmpvaW4oJycpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUaGUgcmVzb3VyY2UgZG9lcyBub3QgaGF2ZSBhIHBoeXNpY2FsIElEIGRlZmluZWQsIHNvIHdlIG5lZWQgdG9cbiAgICAgIC8vIGNvbXB1dGUgdGhlIGRpZ2VzdCBiYXNlZCBvbiBpdHMgcHJvcGVydGllcyBhbmQgZGVwZW5kZW5jaWVzLlxuICAgICAgY29uc3QgZGVwRGlnZXN0cyA9IEFycmF5LmZyb20oZ3JhcGhbaWRdKS5tYXAoKGQpID0+IHJlc3VsdFtkXSk7XG4gICAgICBjb25zdCBwcm9wZXJ0aWVzSGFzaCA9IGhhc2hPYmplY3Qoc3RyaXBSZWZlcmVuY2VzKHN0cmlwQ29uc3RydWN0UGF0aChyZXNvdXJjZSkpKTtcbiAgICAgIHRvSGFzaCA9IHJlc291cmNlLlR5cGUgKyBwcm9wZXJ0aWVzSGFzaCArIGRlcERpZ2VzdHMuam9pbignJyk7XG4gICAgfVxuXG4gICAgcmVzdWx0W2lkXSA9IGNyeXB0by5jcmVhdGVIYXNoKCdzaGEyNTYnKS51cGRhdGUodG9IYXNoKS5kaWdlc3QoJ2hleCcpO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhhc2hPYmplY3Qob2JqOiBhbnkpOiBzdHJpbmcge1xuICBjb25zdCBoYXNoID0gY3J5cHRvLmNyZWF0ZUhhc2goJ3NoYTI1NicpO1xuXG4gIGZ1bmN0aW9uIGFkZFRvSGFzaCh2YWx1ZTogYW55KSB7XG4gICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgIGFkZFRvSGFzaCgnbnVsbCcpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHZhbHVlLmZvckVhY2goYWRkVG9IYXNoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIE9iamVjdC5rZXlzKHZhbHVlKVxuICAgICAgICAgIC5zb3J0KClcbiAgICAgICAgICAuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgICAgICBoYXNoLnVwZGF0ZShrZXkpO1xuICAgICAgICAgICAgYWRkVG9IYXNoKHZhbHVlW2tleV0pO1xuICAgICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBoYXNoLnVwZGF0ZSh0eXBlb2YgdmFsdWUgKyB2YWx1ZS50b1N0cmluZygpKTtcbiAgICB9XG4gIH1cblxuICBhZGRUb0hhc2gob2JqKTtcbiAgcmV0dXJuIGhhc2guZGlnZXN0KCdoZXgnKTtcbn1cblxuLyoqXG4gKiBSZW1vdmVzIHN1Yi1wcm9wZXJ0aWVzIGNvbnRhaW5pbmcgUmVmIG9yIEZuOjpHZXRBdHQgdG8gYXZvaWQgaGFzaGluZ1xuICogcmVmZXJlbmNlcyB0aGVtc2VsdmVzIGJ1dCBrZWVwcyB0aGUgcHJvcGVydHkgc3RydWN0dXJlLlxuICovXG5mdW5jdGlvbiBzdHJpcFJlZmVyZW5jZXModmFsdWU6IGFueSk6IGFueSB7XG4gIGlmICghdmFsdWUgfHwgdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JykgcmV0dXJuIHZhbHVlO1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gdmFsdWUubWFwKHN0cmlwUmVmZXJlbmNlcyk7XG4gIH1cbiAgaWYgKCdSZWYnIGluIHZhbHVlKSB7XG4gICAgcmV0dXJuIHsgX19jbG91ZF9yZWZfXzogJ1JlZicgfTtcbiAgfVxuICBpZiAoJ0ZuOjpHZXRBdHQnIGluIHZhbHVlKSB7XG4gICAgcmV0dXJuIHsgX19jbG91ZF9yZWZfXzogJ0ZuOjpHZXRBdHQnIH07XG4gIH1cbiAgaWYgKCdEZXBlbmRzT24nIGluIHZhbHVlKSB7XG4gICAgcmV0dXJuIHsgX19jbG91ZF9yZWZfXzogJ0RlcGVuZHNPbicgfTtcbiAgfVxuICBjb25zdCByZXN1bHQ6IGFueSA9IHt9O1xuICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBPYmplY3QuZW50cmllcyh2YWx1ZSkpIHtcbiAgICByZXN1bHRba10gPSBzdHJpcFJlZmVyZW5jZXModik7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gc3RyaXBDb25zdHJ1Y3RQYXRoKHJlc291cmNlOiBhbnkpOiBhbnkge1xuICBpZiAocmVzb3VyY2U/Lk1ldGFkYXRhPy5bJ2F3czpjZGs6cGF0aCddID09IG51bGwpIHtcbiAgICByZXR1cm4gcmVzb3VyY2U7XG4gIH1cblxuICBjb25zdCBjb3B5ID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShyZXNvdXJjZSkpO1xuICBkZWxldGUgY29weS5NZXRhZGF0YVsnYXdzOmNkazpwYXRoJ107XG4gIHJldHVybiBjb3B5O1xufVxuXG5mdW5jdGlvbiBpbnRlcnNlY3Rpb248VD4oYTogVFtdLCBiOiBUW10pOiBUW10ge1xuICByZXR1cm4gYS5maWx0ZXIoKHZhbHVlKSA9PiBiLmluY2x1ZGVzKHZhbHVlKSk7XG59XG4iXX0=
@@ -0,0 +1,51 @@
1
+ import type { TypedMapping } from '@aws-cdk/cloudformation-diff';
2
+ import type { SdkProvider } from '../aws-auth/private';
3
+ import type { CloudFormationStack } from './cloudformation';
4
+ /**
5
+ * Represents a set of possible movements of a resource from one location
6
+ * to another. In the ideal case, there is only one source and only one
7
+ * destination.
8
+ */
9
+ export type ResourceMovement = [ResourceLocation[], ResourceLocation[]];
10
+ export declare class AmbiguityError extends Error {
11
+ readonly movements: ResourceMovement[];
12
+ constructor(movements: ResourceMovement[]);
13
+ paths(): [string[], string[]][];
14
+ }
15
+ /**
16
+ * This class mirrors the `ResourceLocation` interface from CloudFormation,
17
+ * but is richer, since it has a reference to the stack object, rather than
18
+ * merely the stack name.
19
+ */
20
+ export declare class ResourceLocation {
21
+ readonly stack: CloudFormationStack;
22
+ readonly logicalResourceId: string;
23
+ constructor(stack: CloudFormationStack, logicalResourceId: string);
24
+ toPath(): string;
25
+ getType(): string;
26
+ equalTo(other: ResourceLocation): boolean;
27
+ }
28
+ /**
29
+ * A mapping between a source and a destination location.
30
+ */
31
+ export declare class ResourceMapping {
32
+ readonly source: ResourceLocation;
33
+ readonly destination: ResourceLocation;
34
+ constructor(source: ResourceLocation, destination: ResourceLocation);
35
+ toTypedMapping(): TypedMapping;
36
+ }
37
+ export declare function resourceMovements(before: CloudFormationStack[], after: CloudFormationStack[]): ResourceMovement[];
38
+ export declare function ambiguousMovements(movements: ResourceMovement[]): ResourceMovement[];
39
+ /**
40
+ * Converts a list of unambiguous resource movements into a list of resource mappings.
41
+ *
42
+ */
43
+ export declare function resourceMappings(movements: ResourceMovement[], stacks?: CloudFormationStack[]): ResourceMapping[];
44
+ /**
45
+ * Compares the deployed state to the cloud assembly state, and finds all resources
46
+ * that were moved from one location (stack + logical ID) to another. The comparison
47
+ * is done per environment.
48
+ */
49
+ export declare function findResourceMovements(stacks: CloudFormationStack[], sdkProvider: SdkProvider): Promise<ResourceMovement[]>;
50
+ export declare function formatTypedMappings(mappings: TypedMapping[]): string;
51
+ export declare function formatAmbiguousMappings(paths: [string[], string[]][]): string;