@aws-cdk/toolkit-lib 0.3.2 → 0.3.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (392) hide show
  1. package/api-extractor.json +3 -0
  2. package/build-info.json +2 -2
  3. package/db.json.gz +0 -0
  4. package/lib/actions/bootstrap/index.d.ts +1 -1
  5. package/lib/actions/bootstrap/index.js +5 -5
  6. package/lib/actions/bootstrap/private/helpers.js +3 -3
  7. package/lib/actions/deploy/index.d.ts +1 -1
  8. package/lib/actions/deploy/index.js +1 -1
  9. package/lib/actions/deploy/private/deploy-options.d.ts +1 -1
  10. package/lib/actions/deploy/private/deploy-options.js +1 -1
  11. package/lib/actions/deploy/private/helpers.d.ts +3 -2
  12. package/lib/actions/deploy/private/helpers.js +3 -3
  13. package/lib/actions/diff/index.d.ts +1 -1
  14. package/lib/actions/diff/index.js +1 -1
  15. package/lib/actions/diff/private/helpers.d.ts +5 -9
  16. package/lib/actions/diff/private/helpers.js +13 -30
  17. package/lib/actions/refactor/index.d.ts +12 -0
  18. package/lib/actions/refactor/index.js +1 -1
  19. package/lib/api/aws-auth/account-cache.d.ts +41 -0
  20. package/lib/api/aws-auth/account-cache.js +108 -0
  21. package/lib/api/aws-auth/awscli-compatible.d.ts +70 -0
  22. package/lib/api/aws-auth/awscli-compatible.js +250 -0
  23. package/lib/api/aws-auth/cached.d.ts +11 -0
  24. package/lib/api/aws-auth/cached.js +26 -0
  25. package/lib/api/aws-auth/credential-plugins.d.ts +38 -0
  26. package/lib/api/aws-auth/credential-plugins.js +154 -0
  27. package/lib/api/aws-auth/private/index.d.ts +11 -0
  28. package/lib/api/aws-auth/private/index.js +37 -0
  29. package/lib/api/aws-auth/provider-caching.d.ts +13 -0
  30. package/lib/api/aws-auth/provider-caching.js +24 -0
  31. package/lib/api/aws-auth/proxy-agent.d.ts +13 -0
  32. package/lib/api/aws-auth/proxy-agent.js +54 -0
  33. package/lib/api/aws-auth/sdk-logger.d.ts +69 -0
  34. package/lib/api/aws-auth/sdk-logger.js +128 -0
  35. package/lib/api/aws-auth/sdk-provider.d.ts +195 -0
  36. package/lib/api/aws-auth/sdk-provider.js +373 -0
  37. package/lib/api/aws-auth/sdk.d.ts +235 -0
  38. package/lib/api/aws-auth/sdk.js +391 -0
  39. package/lib/api/aws-auth/tracing.d.ts +11 -0
  40. package/lib/api/aws-auth/tracing.js +60 -0
  41. package/lib/api/aws-auth/user-agent.d.ts +7 -0
  42. package/lib/api/aws-auth/user-agent.js +20 -0
  43. package/lib/api/aws-auth/util.d.ts +6 -0
  44. package/lib/api/aws-auth/util.js +21 -0
  45. package/lib/api/bootstrap/bootstrap-environment.d.ts +35 -0
  46. package/lib/api/bootstrap/bootstrap-environment.js +323 -0
  47. package/lib/api/bootstrap/bootstrap-props.d.ts +130 -0
  48. package/lib/api/bootstrap/bootstrap-props.js +14 -0
  49. package/lib/api/bootstrap/deploy-bootstrap.d.ts +39 -0
  50. package/lib/api/bootstrap/deploy-bootstrap.js +147 -0
  51. package/lib/api/bootstrap/index.d.ts +3 -0
  52. package/lib/api/bootstrap/index.js +23 -0
  53. package/lib/api/bootstrap/legacy-template.d.ts +2 -0
  54. package/lib/api/bootstrap/legacy-template.js +82 -0
  55. package/lib/api/cloud-assembly/environment.d.ts +43 -0
  56. package/lib/api/cloud-assembly/environment.js +127 -0
  57. package/lib/api/cloud-assembly/index.d.ts +1 -1
  58. package/lib/api/cloud-assembly/index.js +5 -4
  59. package/lib/api/cloud-assembly/private/context-aware-source.d.ts +1 -1
  60. package/lib/api/cloud-assembly/private/context-aware-source.js +7 -7
  61. package/lib/api/cloud-assembly/private/exec.js +3 -3
  62. package/lib/api/cloud-assembly/private/prepare-source.d.ts +2 -1
  63. package/lib/api/cloud-assembly/private/prepare-source.js +17 -15
  64. package/lib/api/cloud-assembly/private/readable-assembly.d.ts +1 -1
  65. package/lib/api/cloud-assembly/private/readable-assembly.js +1 -1
  66. package/lib/api/cloud-assembly/private/source-builder.d.ts +10 -8
  67. package/lib/api/cloud-assembly/private/source-builder.js +43 -24
  68. package/lib/api/cloud-assembly/private/stack-assembly.d.ts +2 -1
  69. package/lib/api/cloud-assembly/private/stack-assembly.js +16 -15
  70. package/lib/api/cloud-assembly/source-builder.d.ts +19 -0
  71. package/lib/api/cloud-assembly/source-builder.js +1 -1
  72. package/lib/api/cloud-assembly/stack-assembly.d.ts +55 -0
  73. package/lib/api/cloud-assembly/stack-assembly.js +139 -0
  74. package/lib/api/cloud-assembly/stack-collection.d.ts +27 -0
  75. package/lib/api/cloud-assembly/stack-collection.js +112 -0
  76. package/lib/api/cloud-assembly/stack-selector.d.ts +81 -2
  77. package/lib/api/cloud-assembly/stack-selector.js +62 -5
  78. package/lib/api/cloudformation/evaluate-cloudformation-template.d.ts +85 -0
  79. package/lib/api/cloudformation/evaluate-cloudformation-template.js +456 -0
  80. package/lib/api/cloudformation/index.d.ts +4 -0
  81. package/lib/api/cloudformation/index.js +21 -0
  82. package/lib/api/cloudformation/nested-stack-helpers.d.ts +25 -0
  83. package/lib/api/cloudformation/nested-stack-helpers.js +86 -0
  84. package/lib/api/cloudformation/stack-helpers.d.ts +96 -0
  85. package/lib/api/cloudformation/stack-helpers.js +163 -0
  86. package/lib/api/cloudformation/template-body-parameter.d.ts +22 -0
  87. package/lib/api/cloudformation/template-body-parameter.js +104 -0
  88. package/lib/api/context.d.ts +40 -0
  89. package/lib/api/context.js +84 -0
  90. package/lib/api/deployments/asset-manifest-builder.d.ts +8 -0
  91. package/lib/api/deployments/asset-manifest-builder.js +33 -0
  92. package/lib/api/deployments/asset-publishing.d.ts +60 -0
  93. package/lib/api/deployments/asset-publishing.js +144 -0
  94. package/lib/api/deployments/assets.d.ts +11 -0
  95. package/lib/api/deployments/assets.js +108 -0
  96. package/lib/api/deployments/cfn-api.d.ts +145 -0
  97. package/lib/api/deployments/cfn-api.js +444 -0
  98. package/lib/api/deployments/checks.d.ts +9 -0
  99. package/lib/api/deployments/checks.js +72 -0
  100. package/lib/api/deployments/deploy-stack.d.ts +164 -0
  101. package/lib/api/deployments/deploy-stack.js +490 -0
  102. package/lib/api/deployments/deployment-method.d.ts +24 -0
  103. package/lib/api/deployments/deployment-method.js +3 -0
  104. package/lib/api/deployments/deployment-result.d.ts +21 -0
  105. package/lib/api/deployments/deployment-result.js +10 -0
  106. package/lib/api/deployments/deployments.d.ts +289 -0
  107. package/lib/api/deployments/deployments.js +355 -0
  108. package/lib/api/deployments/index.d.ts +6 -0
  109. package/lib/api/deployments/index.js +27 -0
  110. package/lib/api/diff/diff-formatter.d.ts +147 -0
  111. package/lib/api/diff/diff-formatter.js +225 -0
  112. package/lib/api/diff/index.d.ts +1 -0
  113. package/lib/api/diff/index.js +18 -0
  114. package/lib/api/environment/environment-access.d.ts +139 -0
  115. package/lib/api/environment/environment-access.js +205 -0
  116. package/lib/api/environment/environment-resources.d.ts +75 -0
  117. package/lib/api/environment/environment-resources.js +213 -0
  118. package/lib/api/environment/index.d.ts +3 -0
  119. package/lib/api/environment/index.js +20 -0
  120. package/lib/api/environment/placeholders.d.ts +10 -0
  121. package/lib/api/environment/placeholders.js +23 -0
  122. package/lib/api/garbage-collection/garbage-collector.d.ts +158 -0
  123. package/lib/api/garbage-collection/garbage-collector.js +614 -0
  124. package/lib/api/garbage-collection/index.d.ts +3 -0
  125. package/lib/api/garbage-collection/index.js +21 -0
  126. package/lib/api/garbage-collection/progress-printer.d.ts +23 -0
  127. package/lib/api/garbage-collection/progress-printer.js +80 -0
  128. package/lib/api/garbage-collection/stack-refresh.d.ts +49 -0
  129. package/lib/api/garbage-collection/stack-refresh.js +152 -0
  130. package/lib/api/hotswap/appsync-mapping-templates.d.ts +4 -0
  131. package/lib/api/hotswap/appsync-mapping-templates.js +162 -0
  132. package/lib/api/hotswap/code-build-projects.d.ts +4 -0
  133. package/lib/api/hotswap/code-build-projects.js +62 -0
  134. package/lib/api/hotswap/common.d.ts +89 -0
  135. package/lib/api/hotswap/common.js +137 -0
  136. package/lib/api/hotswap/ecs-services.d.ts +4 -0
  137. package/lib/api/hotswap/ecs-services.js +159 -0
  138. package/lib/api/hotswap/hotswap-deployments.d.ts +17 -0
  139. package/lib/api/hotswap/hotswap-deployments.js +441 -0
  140. package/lib/api/hotswap/index.d.ts +2 -0
  141. package/lib/api/hotswap/index.js +19 -0
  142. package/lib/api/hotswap/lambda-functions.d.ts +4 -0
  143. package/lib/api/hotswap/lambda-functions.js +297 -0
  144. package/lib/api/hotswap/s3-bucket-deployments.d.ts +5 -0
  145. package/lib/api/hotswap/s3-bucket-deployments.js +117 -0
  146. package/lib/api/hotswap/stepfunctions-state-machines.d.ts +4 -0
  147. package/lib/api/hotswap/stepfunctions-state-machines.js +48 -0
  148. package/lib/api/index.d.ts +24 -0
  149. package/lib/api/index.js +41 -0
  150. package/lib/api/io/index.d.ts +3 -1
  151. package/lib/api/io/index.js +18 -1
  152. package/lib/api/io/io-host.d.ts +15 -0
  153. package/lib/api/io/io-host.js +3 -0
  154. package/lib/api/io/io-message.d.ts +76 -0
  155. package/lib/api/io/io-message.js +3 -0
  156. package/lib/api/io/private/index.d.ts +7 -1
  157. package/lib/api/io/private/index.js +8 -5
  158. package/lib/api/io/private/io-default-messages.d.ts +21 -0
  159. package/lib/api/io/private/io-default-messages.js +59 -0
  160. package/lib/api/io/private/io-helper.d.ts +32 -0
  161. package/lib/api/io/private/io-helper.js +51 -0
  162. package/lib/api/io/private/level-priority.d.ts +11 -0
  163. package/lib/api/io/private/level-priority.js +33 -0
  164. package/lib/api/io/private/message-maker.d.ts +89 -0
  165. package/lib/api/io/private/message-maker.js +60 -0
  166. package/lib/api/io/private/messages.d.ts +178 -0
  167. package/lib/api/io/private/messages.js +534 -0
  168. package/lib/api/io/private/sdk-logger.d.ts +1 -1
  169. package/lib/api/io/private/sdk-logger.js +6 -6
  170. package/lib/api/io/private/span.d.ts +93 -0
  171. package/lib/api/io/private/span.js +87 -0
  172. package/lib/api/io/private/testing/fake-io-host.d.ts +28 -0
  173. package/lib/api/io/private/testing/fake-io-host.js +41 -0
  174. package/lib/api/io/private/testing/index.d.ts +2 -0
  175. package/lib/api/io/private/testing/index.js +19 -0
  176. package/lib/api/io/private/testing/test-io-host.d.ts +27 -0
  177. package/lib/api/io/private/testing/test-io-host.js +61 -0
  178. package/lib/api/io/private/types.d.ts +4 -0
  179. package/lib/api/io/private/types.js +3 -0
  180. package/lib/api/io/toolkit-action.d.ts +4 -0
  181. package/lib/api/io/toolkit-action.js +3 -0
  182. package/lib/api/logs-monitor/find-cloudwatch-logs.d.ts +25 -0
  183. package/lib/api/logs-monitor/find-cloudwatch-logs.js +95 -0
  184. package/lib/api/logs-monitor/index.d.ts +2 -0
  185. package/lib/api/logs-monitor/index.js +19 -0
  186. package/lib/api/logs-monitor/logs-monitor.d.ts +76 -0
  187. package/lib/api/logs-monitor/logs-monitor.js +194 -0
  188. package/lib/api/notices/cached-data-source.d.ts +13 -0
  189. package/lib/api/notices/cached-data-source.js +77 -0
  190. package/lib/api/notices/filter.d.ts +59 -0
  191. package/lib/api/notices/filter.js +189 -0
  192. package/lib/api/notices/index.d.ts +1 -0
  193. package/lib/api/notices/index.js +18 -0
  194. package/lib/api/notices/notices.d.ts +111 -0
  195. package/lib/api/notices/notices.js +131 -0
  196. package/lib/api/notices/types.d.ts +37 -0
  197. package/lib/api/notices/types.js +3 -0
  198. package/lib/api/notices/web-data-source.d.ts +9 -0
  199. package/lib/api/notices/web-data-source.js +70 -0
  200. package/lib/api/plugin/context-provider-plugin.d.ts +6 -0
  201. package/lib/api/plugin/context-provider-plugin.js +7 -0
  202. package/lib/api/plugin/index.d.ts +3 -0
  203. package/lib/api/plugin/index.js +20 -0
  204. package/lib/api/plugin/mode.d.ts +4 -0
  205. package/lib/api/plugin/mode.js +9 -0
  206. package/lib/api/plugin/plugin.d.ts +70 -0
  207. package/lib/api/plugin/plugin.js +127 -0
  208. package/lib/api/private.d.ts +1 -0
  209. package/lib/api/private.js +18 -0
  210. package/lib/api/refactoring/cloudformation.d.ts +38 -0
  211. package/lib/api/refactoring/cloudformation.js +56 -0
  212. package/lib/api/refactoring/digest.d.ts +26 -0
  213. package/lib/api/refactoring/digest.js +175 -0
  214. package/lib/api/refactoring/exclude.d.ts +29 -0
  215. package/lib/api/refactoring/exclude.js +94 -0
  216. package/lib/api/refactoring/index.d.ts +32 -0
  217. package/lib/api/refactoring/index.js +191 -0
  218. package/lib/api/require-approval.d.ts +17 -0
  219. package/lib/api/require-approval.js +22 -0
  220. package/lib/api/resource-import/importer.d.ts +216 -0
  221. package/lib/api/resource-import/importer.js +331 -0
  222. package/lib/api/resource-import/index.d.ts +2 -0
  223. package/lib/api/resource-import/index.js +19 -0
  224. package/lib/api/resource-import/migrator.d.ts +26 -0
  225. package/lib/api/resource-import/migrator.js +73 -0
  226. package/lib/api/resource-metadata/index.d.ts +1 -0
  227. package/lib/api/resource-metadata/index.js +18 -0
  228. package/lib/api/resource-metadata/resource-metadata.d.ts +24 -0
  229. package/lib/api/resource-metadata/resource-metadata.js +42 -0
  230. package/lib/api/rwlock.d.ts +60 -0
  231. package/lib/api/rwlock.js +204 -0
  232. package/lib/api/settings.d.ts +26 -0
  233. package/lib/api/settings.js +107 -0
  234. package/lib/api/shared-private.d.ts +8 -6
  235. package/lib/api/shared-private.js +31 -12561
  236. package/lib/api/stack-events/index.d.ts +4 -0
  237. package/lib/api/stack-events/index.js +23 -0
  238. package/lib/api/stack-events/stack-activity-monitor.d.ts +100 -0
  239. package/lib/api/stack-events/stack-activity-monitor.js +164 -0
  240. package/lib/api/stack-events/stack-event-poller.d.ts +69 -0
  241. package/lib/api/stack-events/stack-event-poller.js +130 -0
  242. package/lib/api/stack-events/stack-progress-monitor.d.ts +48 -0
  243. package/lib/api/stack-events/stack-progress-monitor.js +98 -0
  244. package/lib/api/stack-events/stack-status.d.ts +42 -0
  245. package/lib/api/stack-events/stack-status.js +90 -0
  246. package/lib/api/streams.d.ts +7 -0
  247. package/lib/api/streams.js +24 -0
  248. package/lib/api/tags.d.ts +9 -0
  249. package/lib/api/tags.js +10 -0
  250. package/lib/api/toolkit-info.d.ts +52 -0
  251. package/lib/api/toolkit-info.js +157 -0
  252. package/lib/api/tree.d.ts +31 -0
  253. package/lib/api/tree.js +37 -0
  254. package/lib/api/work-graph/index.d.ts +3 -0
  255. package/lib/api/work-graph/index.js +20 -0
  256. package/lib/api/work-graph/work-graph-builder.d.ts +34 -0
  257. package/lib/api/work-graph/work-graph-builder.js +172 -0
  258. package/lib/api/work-graph/work-graph-types.d.ts +50 -0
  259. package/lib/api/work-graph/work-graph-types.js +13 -0
  260. package/lib/api/work-graph/work-graph.d.ts +72 -0
  261. package/lib/api/work-graph/work-graph.js +349 -0
  262. package/lib/context-providers/ami.d.ts +13 -0
  263. package/lib/context-providers/ami.js +52 -0
  264. package/lib/context-providers/availability-zones.d.ts +13 -0
  265. package/lib/context-providers/availability-zones.js +29 -0
  266. package/lib/context-providers/cc-api-provider.d.ts +30 -0
  267. package/lib/context-providers/cc-api-provider.js +145 -0
  268. package/lib/context-providers/endpoint-service-availability-zones.d.ts +13 -0
  269. package/lib/context-providers/endpoint-service-availability-zones.js +35 -0
  270. package/lib/context-providers/hosted-zones.d.ts +12 -0
  271. package/lib/context-providers/hosted-zones.js +69 -0
  272. package/lib/context-providers/index.d.ts +44 -0
  273. package/lib/context-providers/index.js +128 -0
  274. package/lib/context-providers/keys.d.ts +13 -0
  275. package/lib/context-providers/keys.js +54 -0
  276. package/lib/context-providers/load-balancers.d.ts +20 -0
  277. package/lib/context-providers/load-balancers.js +161 -0
  278. package/lib/context-providers/security-groups.d.ts +9 -0
  279. package/lib/context-providers/security-groups.js +69 -0
  280. package/lib/context-providers/ssm-parameters.d.ts +25 -0
  281. package/lib/context-providers/ssm-parameters.js +61 -0
  282. package/lib/context-providers/vpcs.d.ts +13 -0
  283. package/lib/context-providers/vpcs.js +291 -0
  284. package/lib/index.d.ts +4 -1
  285. package/lib/index.js +5 -2
  286. package/lib/index_bg.wasm +0 -0
  287. package/lib/payloads/bootstrap-environment-progress.d.ts +17 -0
  288. package/lib/payloads/bootstrap-environment-progress.js +3 -0
  289. package/lib/payloads/context.d.ts +9 -0
  290. package/lib/payloads/context.js +3 -0
  291. package/lib/payloads/deploy.d.ts +50 -0
  292. package/lib/payloads/deploy.js +3 -0
  293. package/lib/payloads/destroy.d.ts +23 -0
  294. package/lib/payloads/destroy.js +3 -0
  295. package/lib/payloads/diff.d.ts +31 -0
  296. package/lib/payloads/diff.js +22 -0
  297. package/lib/payloads/hotswap.d.ts +212 -0
  298. package/lib/payloads/hotswap.js +43 -0
  299. package/lib/payloads/index.d.ts +17 -0
  300. package/lib/payloads/index.js +34 -0
  301. package/lib/payloads/list.d.ts +4 -0
  302. package/lib/payloads/list.js +3 -0
  303. package/lib/payloads/logs-monitor.d.ts +33 -0
  304. package/lib/payloads/logs-monitor.js +3 -0
  305. package/lib/payloads/progress.d.ts +14 -0
  306. package/lib/payloads/progress.js +3 -0
  307. package/lib/payloads/refactor.d.ts +14 -0
  308. package/lib/payloads/refactor.js +3 -0
  309. package/lib/payloads/rollback.d.ts +17 -0
  310. package/lib/payloads/rollback.js +3 -0
  311. package/lib/payloads/sdk-trace.d.ts +20 -0
  312. package/lib/payloads/sdk-trace.js +3 -0
  313. package/lib/payloads/stack-activity.d.ts +53 -0
  314. package/lib/payloads/stack-activity.js +3 -0
  315. package/lib/payloads/stack-details.d.ts +17 -0
  316. package/lib/payloads/stack-details.js +3 -0
  317. package/lib/payloads/synth.d.ts +7 -0
  318. package/lib/payloads/synth.js +3 -0
  319. package/lib/payloads/types.d.ts +95 -0
  320. package/lib/payloads/types.js +3 -0
  321. package/lib/payloads/watch.d.ts +27 -0
  322. package/lib/payloads/watch.js +3 -0
  323. package/lib/private/activity-printer/base.d.ts +50 -0
  324. package/lib/private/activity-printer/base.js +120 -0
  325. package/lib/private/activity-printer/current.d.ts +26 -0
  326. package/lib/private/activity-printer/current.js +122 -0
  327. package/lib/private/activity-printer/display.d.ts +13 -0
  328. package/lib/private/activity-printer/display.js +81 -0
  329. package/lib/private/activity-printer/history.d.ts +32 -0
  330. package/lib/private/activity-printer/history.js +109 -0
  331. package/lib/private/activity-printer/index.d.ts +3 -0
  332. package/lib/private/activity-printer/index.js +20 -0
  333. package/lib/private/index.d.ts +1 -0
  334. package/lib/private/index.js +18 -0
  335. package/lib/toolkit/non-interactive-io-host.js +5 -4
  336. package/lib/toolkit/private/index.d.ts +2 -1
  337. package/lib/toolkit/private/index.js +1 -1
  338. package/lib/toolkit/toolkit-error.d.ts +86 -0
  339. package/lib/toolkit/toolkit-error.js +132 -0
  340. package/lib/toolkit/toolkit.d.ts +2 -2
  341. package/lib/toolkit/toolkit.js +161 -130
  342. package/lib/toolkit/types.d.ts +0 -55
  343. package/lib/toolkit/types.js +1 -1
  344. package/lib/util/archive.d.ts +1 -0
  345. package/lib/util/archive.js +86 -0
  346. package/lib/util/arrays.d.ts +14 -0
  347. package/lib/util/arrays.js +36 -0
  348. package/lib/util/bool.d.ts +7 -0
  349. package/lib/util/bool.js +13 -0
  350. package/lib/util/bytes.d.ts +8 -0
  351. package/lib/util/bytes.js +21 -0
  352. package/lib/util/cloudformation.d.ts +16 -0
  353. package/lib/util/cloudformation.js +36 -0
  354. package/lib/util/content-hash.d.ts +5 -0
  355. package/lib/util/content-hash.js +43 -0
  356. package/lib/util/directories.d.ts +22 -0
  357. package/lib/util/directories.js +59 -0
  358. package/lib/util/format-error.d.ts +9 -0
  359. package/lib/util/format-error.js +22 -0
  360. package/lib/util/index.d.ts +19 -0
  361. package/lib/util/index.js +36 -0
  362. package/lib/util/json.d.ts +48 -0
  363. package/lib/util/json.js +68 -0
  364. package/lib/util/net.d.ts +9 -0
  365. package/lib/util/net.js +60 -0
  366. package/lib/util/objects.d.ts +65 -0
  367. package/lib/util/objects.js +230 -0
  368. package/lib/util/package-info.d.ts +3 -0
  369. package/lib/util/package-info.js +22 -0
  370. package/lib/util/parallel.d.ts +6 -0
  371. package/lib/util/parallel.js +48 -0
  372. package/lib/util/serialize.d.ts +27 -0
  373. package/lib/util/serialize.js +86 -0
  374. package/lib/util/string-manipulation.d.ts +18 -0
  375. package/lib/util/string-manipulation.js +46 -0
  376. package/lib/util/type-brands.d.ts +39 -0
  377. package/lib/util/type-brands.js +39 -0
  378. package/lib/util/types.d.ts +27 -0
  379. package/lib/util/types.js +25 -0
  380. package/lib/util/version-range.d.ts +2 -0
  381. package/lib/util/version-range.js +36 -0
  382. package/lib/util/yaml-cfn.d.ts +15 -0
  383. package/lib/util/yaml-cfn.js +58 -0
  384. package/package.json +26 -28
  385. package/tsdoc.json +15 -0
  386. package/lib/api/shared-private.js.map +0 -7
  387. package/lib/api/shared-public.d.ts +0 -2159
  388. package/lib/api/shared-public.js +0 -1110
  389. package/lib/api/shared-public.js.map +0 -7
  390. package/lib/private/util.d.ts +0 -1
  391. package/lib/private/util.js +0 -787
  392. package/lib/private/util.js.map +0 -7
@@ -0,0 +1,6 @@
1
+ export interface ContextProviderPlugin {
2
+ getValue(args: {
3
+ [key: string]: any;
4
+ }): Promise<any>;
5
+ }
6
+ export declare function isContextProviderPlugin(x: unknown): x is ContextProviderPlugin;
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isContextProviderPlugin = isContextProviderPlugin;
4
+ function isContextProviderPlugin(x) {
5
+ return typeof x === 'object' && !!x && !!x.getValue;
6
+ }
7
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGV4dC1wcm92aWRlci1wbHVnaW4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJjb250ZXh0LXByb3ZpZGVyLXBsdWdpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUlBLDBEQUVDO0FBRkQsU0FBZ0IsdUJBQXVCLENBQUMsQ0FBVTtJQUNoRCxPQUFPLE9BQU8sQ0FBQyxLQUFLLFFBQVEsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBRSxDQUFTLENBQUMsUUFBUSxDQUFDO0FBQy9ELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgaW50ZXJmYWNlIENvbnRleHRQcm92aWRlclBsdWdpbiB7XG4gIGdldFZhbHVlKGFyZ3M6IHsgW2tleTogc3RyaW5nXTogYW55IH0pOiBQcm9taXNlPGFueT47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0NvbnRleHRQcm92aWRlclBsdWdpbih4OiB1bmtub3duKTogeCBpcyBDb250ZXh0UHJvdmlkZXJQbHVnaW4ge1xuICByZXR1cm4gdHlwZW9mIHggPT09ICdvYmplY3QnICYmICEheCAmJiAhISh4IGFzIGFueSkuZ2V0VmFsdWU7XG59XG4iXX0=
@@ -0,0 +1,3 @@
1
+ export * from './plugin';
2
+ export * from './mode';
3
+ export * from './context-provider-plugin';
@@ -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("./plugin"), exports);
18
+ __exportStar(require("./mode"), exports);
19
+ __exportStar(require("./context-provider-plugin"), exports);
20
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsMkNBQXlCO0FBQ3pCLHlDQUF1QjtBQUN2Qiw0REFBMEMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL3BsdWdpbic7XG5leHBvcnQgKiBmcm9tICcuL21vZGUnO1xuZXhwb3J0ICogZnJvbSAnLi9jb250ZXh0LXByb3ZpZGVyLXBsdWdpbic7XG4iXX0=
@@ -0,0 +1,4 @@
1
+ export declare enum Mode {
2
+ ForReading,
3
+ ForWriting
4
+ }
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Mode = void 0;
4
+ var Mode;
5
+ (function (Mode) {
6
+ Mode[Mode["ForReading"] = 0] = "ForReading";
7
+ Mode[Mode["ForWriting"] = 1] = "ForWriting";
8
+ })(Mode || (exports.Mode = Mode = {}));
9
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIm1vZGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBRUEsSUFBWSxJQUdYO0FBSEQsV0FBWSxJQUFJO0lBQ2QsMEJBQWEsQ0FBNEIsZ0JBQUEsQ0FBQTtJQUN6QywwQkFBYSxDQUE0QixnQkFBQSxDQUFBO0FBQzNDLENBQUMsRUFIVyxJQUFJLG9CQUFKLElBQUksUUFHZiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgRm9yUmVhZGluZyBhcyBQbHVnaW5Gb3JSZWFkaW5nLCBGb3JXcml0aW5nIGFzIFBsdWdpbkZvcldyaXRpbmcgfSBmcm9tICdAYXdzLWNkay9jbGktcGx1Z2luLWNvbnRyYWN0JztcblxuZXhwb3J0IGVudW0gTW9kZSB7XG4gIEZvclJlYWRpbmcgPSAwIHNhdGlzZmllcyBQbHVnaW5Gb3JSZWFkaW5nLFxuICBGb3JXcml0aW5nID0gMSBzYXRpc2ZpZXMgUGx1Z2luRm9yV3JpdGluZyxcbn1cbiJdfQ==
@@ -0,0 +1,70 @@
1
+ import type { CredentialProviderSource, IPluginHost } from '@aws-cdk/cli-plugin-contract';
2
+ import { type ContextProviderPlugin } from './context-provider-plugin';
3
+ import type { IIoHost } from '../io';
4
+ /**
5
+ * Class to manage a plugin collection
6
+ *
7
+ * It provides a `load()` function that loads a JavaScript
8
+ * module from disk, and gives it access to the `IPluginHost` interface
9
+ * to register itself.
10
+ */
11
+ export declare class PluginHost implements IPluginHost {
12
+ /**
13
+ * Access the currently registered CredentialProviderSources. New sources can
14
+ * be registered using the +registerCredentialProviderSource+ method.
15
+ */
16
+ readonly credentialProviderSources: CredentialProviderSource[];
17
+ readonly contextProviderPlugins: Record<string, ContextProviderPlugin>;
18
+ ioHost?: IIoHost;
19
+ private readonly alreadyLoaded;
20
+ /**
21
+ * Loads a plug-in into this PluginHost.
22
+ *
23
+ * Will use `require.resolve()` to get the most accurate representation of what
24
+ * code will get loaded in error messages. As such, it will not work in
25
+ * unit tests with Jest virtual modules becauase of <https://github.com/jestjs/jest/issues/9543>.
26
+ *
27
+ * @param moduleSpec the specification (path or name) of the plug-in module to be loaded.
28
+ * @param ioHost the I/O host to use for printing progress information
29
+ */
30
+ load(moduleSpec: string, ioHost?: IIoHost): void;
31
+ /**
32
+ * Allows plug-ins to register new CredentialProviderSources.
33
+ *
34
+ * @param source a new CredentialProviderSource to register.
35
+ */
36
+ registerCredentialProviderSource(source: CredentialProviderSource): void;
37
+ /**
38
+ * (EXPERIMENTAL) Allow plugins to register context providers
39
+ *
40
+ * Context providers are objects with the following method:
41
+ *
42
+ * ```ts
43
+ * getValue(args: {[key: string]: any}): Promise<any>;
44
+ * ```
45
+ *
46
+ * Currently, they cannot reuse the CDK's authentication mechanisms, so they
47
+ * must be prepared to either not make AWS calls or use their own source of
48
+ * AWS credentials.
49
+ *
50
+ * This feature is experimental, and only intended to be used internally at Amazon
51
+ * as a trial.
52
+ *
53
+ * After registering with 'my-plugin-name', the provider must be addressed as follows:
54
+ *
55
+ * ```ts
56
+ * const value = ContextProvider.getValue(this, {
57
+ * providerName: 'plugin',
58
+ * props: {
59
+ * pluginName: 'my-plugin-name',
60
+ * myParameter1: 'xyz',
61
+ * },
62
+ * includeEnvironment: true | false,
63
+ * dummyValue: 'what-to-return-on-the-first-pass',
64
+ * })
65
+ * ```
66
+ *
67
+ * @experimental
68
+ */
69
+ registerContextProviderAlpha(pluginProviderName: string, provider: ContextProviderPlugin): void;
70
+ }
@@ -0,0 +1,127 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PluginHost = void 0;
4
+ const util_1 = require("util");
5
+ const context_provider_plugin_1 = require("./context-provider-plugin");
6
+ const toolkit_error_1 = require("../../toolkit/toolkit-error");
7
+ const private_1 = require("../io/private");
8
+ /**
9
+ * Class to manage a plugin collection
10
+ *
11
+ * It provides a `load()` function that loads a JavaScript
12
+ * module from disk, and gives it access to the `IPluginHost` interface
13
+ * to register itself.
14
+ */
15
+ class PluginHost {
16
+ /**
17
+ * Access the currently registered CredentialProviderSources. New sources can
18
+ * be registered using the +registerCredentialProviderSource+ method.
19
+ */
20
+ credentialProviderSources = new Array();
21
+ contextProviderPlugins = {};
22
+ ioHost;
23
+ alreadyLoaded = new Set();
24
+ /**
25
+ * Loads a plug-in into this PluginHost.
26
+ *
27
+ * Will use `require.resolve()` to get the most accurate representation of what
28
+ * code will get loaded in error messages. As such, it will not work in
29
+ * unit tests with Jest virtual modules becauase of <https://github.com/jestjs/jest/issues/9543>.
30
+ *
31
+ * @param moduleSpec the specification (path or name) of the plug-in module to be loaded.
32
+ * @param ioHost the I/O host to use for printing progress information
33
+ */
34
+ load(moduleSpec, ioHost) {
35
+ try {
36
+ const resolved = require.resolve(moduleSpec);
37
+ if (ioHost) {
38
+ new private_1.IoDefaultMessages(private_1.IoHelper.fromIoHost(ioHost, 'init')).debug(`Loading plug-in: ${resolved} from ${moduleSpec}`);
39
+ }
40
+ return this._doLoad(resolved);
41
+ }
42
+ catch (e) {
43
+ // according to Node.js docs `MODULE_NOT_FOUND` is the only possible error here
44
+ // @see https://nodejs.org/api/modules.html#requireresolverequest-options
45
+ // Not using `withCause()` here, since the node error contains a "Require Stack"
46
+ // as part of the error message that is inherently useless to our users.
47
+ throw new toolkit_error_1.ToolkitError(`Unable to resolve plug-in: Cannot find module '${moduleSpec}': ${e}`);
48
+ }
49
+ }
50
+ /**
51
+ * Do the loading given an already-resolved module name
52
+ *
53
+ * @internal
54
+ */
55
+ _doLoad(resolved) {
56
+ try {
57
+ if (this.alreadyLoaded.has(resolved)) {
58
+ return;
59
+ }
60
+ /* eslint-disable @typescript-eslint/no-require-imports */
61
+ const plugin = require(resolved);
62
+ /* eslint-enable */
63
+ if (!isPlugin(plugin)) {
64
+ throw new toolkit_error_1.ToolkitError(`Module ${resolved} is not a valid plug-in, or has an unsupported version.`);
65
+ }
66
+ if (plugin.init) {
67
+ plugin.init(this);
68
+ }
69
+ this.alreadyLoaded.add(resolved);
70
+ }
71
+ catch (e) {
72
+ throw toolkit_error_1.ToolkitError.withCause(`Unable to load plug-in '${resolved}'`, e);
73
+ }
74
+ function isPlugin(x) {
75
+ return x != null && x.version === '1';
76
+ }
77
+ }
78
+ /**
79
+ * Allows plug-ins to register new CredentialProviderSources.
80
+ *
81
+ * @param source a new CredentialProviderSource to register.
82
+ */
83
+ registerCredentialProviderSource(source) {
84
+ // Forward to the right credentials-related plugin host
85
+ this.credentialProviderSources.push(source);
86
+ }
87
+ /**
88
+ * (EXPERIMENTAL) Allow plugins to register context providers
89
+ *
90
+ * Context providers are objects with the following method:
91
+ *
92
+ * ```ts
93
+ * getValue(args: {[key: string]: any}): Promise<any>;
94
+ * ```
95
+ *
96
+ * Currently, they cannot reuse the CDK's authentication mechanisms, so they
97
+ * must be prepared to either not make AWS calls or use their own source of
98
+ * AWS credentials.
99
+ *
100
+ * This feature is experimental, and only intended to be used internally at Amazon
101
+ * as a trial.
102
+ *
103
+ * After registering with 'my-plugin-name', the provider must be addressed as follows:
104
+ *
105
+ * ```ts
106
+ * const value = ContextProvider.getValue(this, {
107
+ * providerName: 'plugin',
108
+ * props: {
109
+ * pluginName: 'my-plugin-name',
110
+ * myParameter1: 'xyz',
111
+ * },
112
+ * includeEnvironment: true | false,
113
+ * dummyValue: 'what-to-return-on-the-first-pass',
114
+ * })
115
+ * ```
116
+ *
117
+ * @experimental
118
+ */
119
+ registerContextProviderAlpha(pluginProviderName, provider) {
120
+ if (!(0, context_provider_plugin_1.isContextProviderPlugin)(provider)) {
121
+ throw new toolkit_error_1.ToolkitError(`Object you gave me does not look like a ContextProviderPlugin: ${(0, util_1.inspect)(provider)}`);
122
+ }
123
+ this.contextProviderPlugins[pluginProviderName] = provider;
124
+ }
125
+ }
126
+ exports.PluginHost = PluginHost;
127
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsicGx1Z2luLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLCtCQUErQjtBQUUvQix1RUFBZ0c7QUFDaEcsK0RBQTJEO0FBRTNELDJDQUE0RDtBQUU1RDs7Ozs7O0dBTUc7QUFDSCxNQUFhLFVBQVU7SUFDckI7OztPQUdHO0lBQ2EseUJBQXlCLEdBQUcsSUFBSSxLQUFLLEVBQTRCLENBQUM7SUFFbEUsc0JBQXNCLEdBQTBDLEVBQUUsQ0FBQztJQUU1RSxNQUFNLENBQVc7SUFFUCxhQUFhLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztJQUVuRDs7Ozs7Ozs7O09BU0c7SUFDSSxJQUFJLENBQUMsVUFBa0IsRUFBRSxNQUFnQjtRQUM5QyxJQUFJLENBQUM7WUFDSCxNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQzdDLElBQUksTUFBTSxFQUFFLENBQUM7Z0JBQ1gsSUFBSSwyQkFBaUIsQ0FBQyxrQkFBUSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsb0JBQW9CLFFBQVEsU0FBUyxVQUFVLEVBQUUsQ0FBQyxDQUFDO1lBQ3RILENBQUM7WUFDRCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDaEMsQ0FBQztRQUFDLE9BQU8sQ0FBTSxFQUFFLENBQUM7WUFDaEIsK0VBQStFO1lBQy9FLHlFQUF5RTtZQUN6RSxnRkFBZ0Y7WUFDaEYsd0VBQXdFO1lBQ3hFLE1BQU0sSUFBSSw0QkFBWSxDQUFDLGtEQUFrRCxVQUFVLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNoRyxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxPQUFPLENBQUMsUUFBZ0I7UUFDN0IsSUFBSSxDQUFDO1lBQ0gsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO2dCQUNyQyxPQUFPO1lBQ1QsQ0FBQztZQUVELDBEQUEwRDtZQUMxRCxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDakMsbUJBQW1CO1lBQ25CLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztnQkFDdEIsTUFBTSxJQUFJLDRCQUFZLENBQUMsVUFBVSxRQUFRLHlEQUF5RCxDQUFDLENBQUM7WUFDdEcsQ0FBQztZQUNELElBQUksTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUNoQixNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3BCLENBQUM7WUFFRCxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNuQyxDQUFDO1FBQUMsT0FBTyxDQUFNLEVBQUUsQ0FBQztZQUNoQixNQUFNLDRCQUFZLENBQUMsU0FBUyxDQUFDLDJCQUEyQixRQUFRLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUMxRSxDQUFDO1FBRUQsU0FBUyxRQUFRLENBQUMsQ0FBTTtZQUN0QixPQUFPLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxDQUFDLE9BQU8sS0FBSyxHQUFHLENBQUM7UUFDeEMsQ0FBQztJQUNILENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksZ0NBQWdDLENBQUMsTUFBZ0M7UUFDdEUsdURBQXVEO1FBQ3ZELElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O09BK0JHO0lBQ0ksNEJBQTRCLENBQUMsa0JBQTBCLEVBQUUsUUFBK0I7UUFDN0YsSUFBSSxDQUFDLElBQUEsaURBQXVCLEVBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztZQUN2QyxNQUFNLElBQUksNEJBQVksQ0FBQyxrRUFBa0UsSUFBQSxjQUFPLEVBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2hILENBQUM7UUFDRCxJQUFJLENBQUMsc0JBQXNCLENBQUMsa0JBQWtCLENBQUMsR0FBRyxRQUFRLENBQUM7SUFDN0QsQ0FBQztDQUNGO0FBdEhELGdDQXNIQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGluc3BlY3QgfSBmcm9tICd1dGlsJztcbmltcG9ydCB0eXBlIHsgQ3JlZGVudGlhbFByb3ZpZGVyU291cmNlLCBJUGx1Z2luSG9zdCwgUGx1Z2luIH0gZnJvbSAnQGF3cy1jZGsvY2xpLXBsdWdpbi1jb250cmFjdCc7XG5pbXBvcnQgeyB0eXBlIENvbnRleHRQcm92aWRlclBsdWdpbiwgaXNDb250ZXh0UHJvdmlkZXJQbHVnaW4gfSBmcm9tICcuL2NvbnRleHQtcHJvdmlkZXItcGx1Z2luJztcbmltcG9ydCB7IFRvb2xraXRFcnJvciB9IGZyb20gJy4uLy4uL3Rvb2xraXQvdG9vbGtpdC1lcnJvcic7XG5pbXBvcnQgdHlwZSB7IElJb0hvc3QgfSBmcm9tICcuLi9pbyc7XG5pbXBvcnQgeyBJb0RlZmF1bHRNZXNzYWdlcywgSW9IZWxwZXIgfSBmcm9tICcuLi9pby9wcml2YXRlJztcblxuLyoqXG4gKiBDbGFzcyB0byBtYW5hZ2UgYSBwbHVnaW4gY29sbGVjdGlvblxuICpcbiAqIEl0IHByb3ZpZGVzIGEgYGxvYWQoKWAgZnVuY3Rpb24gdGhhdCBsb2FkcyBhIEphdmFTY3JpcHRcbiAqIG1vZHVsZSBmcm9tIGRpc2ssIGFuZCBnaXZlcyBpdCBhY2Nlc3MgdG8gdGhlIGBJUGx1Z2luSG9zdGAgaW50ZXJmYWNlXG4gKiB0byByZWdpc3RlciBpdHNlbGYuXG4gKi9cbmV4cG9ydCBjbGFzcyBQbHVnaW5Ib3N0IGltcGxlbWVudHMgSVBsdWdpbkhvc3Qge1xuICAvKipcbiAgICogQWNjZXNzIHRoZSBjdXJyZW50bHkgcmVnaXN0ZXJlZCBDcmVkZW50aWFsUHJvdmlkZXJTb3VyY2VzLiBOZXcgc291cmNlcyBjYW5cbiAgICogYmUgcmVnaXN0ZXJlZCB1c2luZyB0aGUgK3JlZ2lzdGVyQ3JlZGVudGlhbFByb3ZpZGVyU291cmNlKyBtZXRob2QuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgY3JlZGVudGlhbFByb3ZpZGVyU291cmNlcyA9IG5ldyBBcnJheTxDcmVkZW50aWFsUHJvdmlkZXJTb3VyY2U+KCk7XG5cbiAgcHVibGljIHJlYWRvbmx5IGNvbnRleHRQcm92aWRlclBsdWdpbnM6IFJlY29yZDxzdHJpbmcsIENvbnRleHRQcm92aWRlclBsdWdpbj4gPSB7fTtcblxuICBwdWJsaWMgaW9Ib3N0PzogSUlvSG9zdDtcblxuICBwcml2YXRlIHJlYWRvbmx5IGFscmVhZHlMb2FkZWQgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAvKipcbiAgICogTG9hZHMgYSBwbHVnLWluIGludG8gdGhpcyBQbHVnaW5Ib3N0LlxuICAgKlxuICAgKiBXaWxsIHVzZSBgcmVxdWlyZS5yZXNvbHZlKClgIHRvIGdldCB0aGUgbW9zdCBhY2N1cmF0ZSByZXByZXNlbnRhdGlvbiBvZiB3aGF0XG4gICAqIGNvZGUgd2lsbCBnZXQgbG9hZGVkIGluIGVycm9yIG1lc3NhZ2VzLiBBcyBzdWNoLCBpdCB3aWxsIG5vdCB3b3JrIGluXG4gICAqIHVuaXQgdGVzdHMgd2l0aCBKZXN0IHZpcnR1YWwgbW9kdWxlcyBiZWNhdWFzZSBvZiA8aHR0cHM6Ly9naXRodWIuY29tL2plc3Rqcy9qZXN0L2lzc3Vlcy85NTQzPi5cbiAgICpcbiAgICogQHBhcmFtIG1vZHVsZVNwZWMgdGhlIHNwZWNpZmljYXRpb24gKHBhdGggb3IgbmFtZSkgb2YgdGhlIHBsdWctaW4gbW9kdWxlIHRvIGJlIGxvYWRlZC5cbiAgICogQHBhcmFtIGlvSG9zdCB0aGUgSS9PIGhvc3QgdG8gdXNlIGZvciBwcmludGluZyBwcm9ncmVzcyBpbmZvcm1hdGlvblxuICAgKi9cbiAgcHVibGljIGxvYWQobW9kdWxlU3BlYzogc3RyaW5nLCBpb0hvc3Q/OiBJSW9Ib3N0KSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc29sdmVkID0gcmVxdWlyZS5yZXNvbHZlKG1vZHVsZVNwZWMpO1xuICAgICAgaWYgKGlvSG9zdCkge1xuICAgICAgICBuZXcgSW9EZWZhdWx0TWVzc2FnZXMoSW9IZWxwZXIuZnJvbUlvSG9zdChpb0hvc3QsICdpbml0JykpLmRlYnVnKGBMb2FkaW5nIHBsdWctaW46ICR7cmVzb2x2ZWR9IGZyb20gJHttb2R1bGVTcGVjfWApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuX2RvTG9hZChyZXNvbHZlZCk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAvLyBhY2NvcmRpbmcgdG8gTm9kZS5qcyBkb2NzIGBNT0RVTEVfTk9UX0ZPVU5EYCBpcyB0aGUgb25seSBwb3NzaWJsZSBlcnJvciBoZXJlXG4gICAgICAvLyBAc2VlIGh0dHBzOi8vbm9kZWpzLm9yZy9hcGkvbW9kdWxlcy5odG1sI3JlcXVpcmVyZXNvbHZlcmVxdWVzdC1vcHRpb25zXG4gICAgICAvLyBOb3QgdXNpbmcgYHdpdGhDYXVzZSgpYCBoZXJlLCBzaW5jZSB0aGUgbm9kZSBlcnJvciBjb250YWlucyBhIFwiUmVxdWlyZSBTdGFja1wiXG4gICAgICAvLyBhcyBwYXJ0IG9mIHRoZSBlcnJvciBtZXNzYWdlIHRoYXQgaXMgaW5oZXJlbnRseSB1c2VsZXNzIHRvIG91ciB1c2Vycy5cbiAgICAgIHRocm93IG5ldyBUb29sa2l0RXJyb3IoYFVuYWJsZSB0byByZXNvbHZlIHBsdWctaW46IENhbm5vdCBmaW5kIG1vZHVsZSAnJHttb2R1bGVTcGVjfSc6ICR7ZX1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRG8gdGhlIGxvYWRpbmcgZ2l2ZW4gYW4gYWxyZWFkeS1yZXNvbHZlZCBtb2R1bGUgbmFtZVxuICAgKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHB1YmxpYyBfZG9Mb2FkKHJlc29sdmVkOiBzdHJpbmcpIHtcbiAgICB0cnkge1xuICAgICAgaWYgKHRoaXMuYWxyZWFkeUxvYWRlZC5oYXMocmVzb2x2ZWQpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0cyAqL1xuICAgICAgY29uc3QgcGx1Z2luID0gcmVxdWlyZShyZXNvbHZlZCk7XG4gICAgICAvKiBlc2xpbnQtZW5hYmxlICovXG4gICAgICBpZiAoIWlzUGx1Z2luKHBsdWdpbikpIHtcbiAgICAgICAgdGhyb3cgbmV3IFRvb2xraXRFcnJvcihgTW9kdWxlICR7cmVzb2x2ZWR9IGlzIG5vdCBhIHZhbGlkIHBsdWctaW4sIG9yIGhhcyBhbiB1bnN1cHBvcnRlZCB2ZXJzaW9uLmApO1xuICAgICAgfVxuICAgICAgaWYgKHBsdWdpbi5pbml0KSB7XG4gICAgICAgIHBsdWdpbi5pbml0KHRoaXMpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmFscmVhZHlMb2FkZWQuYWRkKHJlc29sdmVkKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IFRvb2xraXRFcnJvci53aXRoQ2F1c2UoYFVuYWJsZSB0byBsb2FkIHBsdWctaW4gJyR7cmVzb2x2ZWR9J2AsIGUpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzUGx1Z2luKHg6IGFueSk6IHggaXMgUGx1Z2luIHtcbiAgICAgIHJldHVybiB4ICE9IG51bGwgJiYgeC52ZXJzaW9uID09PSAnMSc7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFsbG93cyBwbHVnLWlucyB0byByZWdpc3RlciBuZXcgQ3JlZGVudGlhbFByb3ZpZGVyU291cmNlcy5cbiAgICpcbiAgICogQHBhcmFtIHNvdXJjZSBhIG5ldyBDcmVkZW50aWFsUHJvdmlkZXJTb3VyY2UgdG8gcmVnaXN0ZXIuXG4gICAqL1xuICBwdWJsaWMgcmVnaXN0ZXJDcmVkZW50aWFsUHJvdmlkZXJTb3VyY2Uoc291cmNlOiBDcmVkZW50aWFsUHJvdmlkZXJTb3VyY2UpIHtcbiAgICAvLyBGb3J3YXJkIHRvIHRoZSByaWdodCBjcmVkZW50aWFscy1yZWxhdGVkIHBsdWdpbiBob3N0XG4gICAgdGhpcy5jcmVkZW50aWFsUHJvdmlkZXJTb3VyY2VzLnB1c2goc291cmNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiAoRVhQRVJJTUVOVEFMKSBBbGxvdyBwbHVnaW5zIHRvIHJlZ2lzdGVyIGNvbnRleHQgcHJvdmlkZXJzXG4gICAqXG4gICAqIENvbnRleHQgcHJvdmlkZXJzIGFyZSBvYmplY3RzIHdpdGggdGhlIGZvbGxvd2luZyBtZXRob2Q6XG4gICAqXG4gICAqIGBgYHRzXG4gICAqICAgZ2V0VmFsdWUoYXJnczoge1trZXk6IHN0cmluZ106IGFueX0pOiBQcm9taXNlPGFueT47XG4gICAqIGBgYFxuICAgKlxuICAgKiBDdXJyZW50bHksIHRoZXkgY2Fubm90IHJldXNlIHRoZSBDREsncyBhdXRoZW50aWNhdGlvbiBtZWNoYW5pc21zLCBzbyB0aGV5XG4gICAqIG11c3QgYmUgcHJlcGFyZWQgdG8gZWl0aGVyIG5vdCBtYWtlIEFXUyBjYWxscyBvciB1c2UgdGhlaXIgb3duIHNvdXJjZSBvZlxuICAgKiBBV1MgY3JlZGVudGlhbHMuXG4gICAqXG4gICAqIFRoaXMgZmVhdHVyZSBpcyBleHBlcmltZW50YWwsIGFuZCBvbmx5IGludGVuZGVkIHRvIGJlIHVzZWQgaW50ZXJuYWxseSBhdCBBbWF6b25cbiAgICogYXMgYSB0cmlhbC5cbiAgICpcbiAgICogQWZ0ZXIgcmVnaXN0ZXJpbmcgd2l0aCAnbXktcGx1Z2luLW5hbWUnLCB0aGUgcHJvdmlkZXIgbXVzdCBiZSBhZGRyZXNzZWQgYXMgZm9sbG93czpcbiAgICpcbiAgICogYGBgdHNcbiAgICogY29uc3QgdmFsdWUgPSBDb250ZXh0UHJvdmlkZXIuZ2V0VmFsdWUodGhpcywge1xuICAgKiAgIHByb3ZpZGVyTmFtZTogJ3BsdWdpbicsXG4gICAqICAgcHJvcHM6IHtcbiAgICogICAgIHBsdWdpbk5hbWU6ICdteS1wbHVnaW4tbmFtZScsXG4gICAqICAgICBteVBhcmFtZXRlcjE6ICd4eXonLFxuICAgKiAgIH0sXG4gICAqICAgaW5jbHVkZUVudmlyb25tZW50OiB0cnVlIHwgZmFsc2UsXG4gICAqICAgZHVtbXlWYWx1ZTogJ3doYXQtdG8tcmV0dXJuLW9uLXRoZS1maXJzdC1wYXNzJyxcbiAgICogfSlcbiAgICogYGBgXG4gICAqXG4gICAqIEBleHBlcmltZW50YWxcbiAgICovXG4gIHB1YmxpYyByZWdpc3RlckNvbnRleHRQcm92aWRlckFscGhhKHBsdWdpblByb3ZpZGVyTmFtZTogc3RyaW5nLCBwcm92aWRlcjogQ29udGV4dFByb3ZpZGVyUGx1Z2luKSB7XG4gICAgaWYgKCFpc0NvbnRleHRQcm92aWRlclBsdWdpbihwcm92aWRlcikpIHtcbiAgICAgIHRocm93IG5ldyBUb29sa2l0RXJyb3IoYE9iamVjdCB5b3UgZ2F2ZSBtZSBkb2VzIG5vdCBsb29rIGxpa2UgYSBDb250ZXh0UHJvdmlkZXJQbHVnaW46ICR7aW5zcGVjdChwcm92aWRlcil9YCk7XG4gICAgfVxuICAgIHRoaXMuY29udGV4dFByb3ZpZGVyUGx1Z2luc1twbHVnaW5Qcm92aWRlck5hbWVdID0gcHJvdmlkZXI7XG4gIH1cbn1cbiJdfQ==
@@ -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,38 @@
1
+ import type { TypedMapping } from '@aws-cdk/cloudformation-diff';
2
+ import type * as cxapi from '@aws-cdk/cx-api';
3
+ export interface CloudFormationTemplate {
4
+ Resources?: {
5
+ [logicalId: string]: {
6
+ Type: string;
7
+ Properties?: any;
8
+ Metadata?: Record<string, any>;
9
+ };
10
+ };
11
+ }
12
+ export interface CloudFormationStack {
13
+ readonly environment: cxapi.Environment;
14
+ readonly stackName: string;
15
+ readonly template: CloudFormationTemplate;
16
+ }
17
+ /**
18
+ * This class mirrors the `ResourceLocation` interface from CloudFormation,
19
+ * but is richer, since it has a reference to the stack object, rather than
20
+ * merely the stack name.
21
+ */
22
+ export declare class ResourceLocation {
23
+ readonly stack: CloudFormationStack;
24
+ readonly logicalResourceId: string;
25
+ constructor(stack: CloudFormationStack, logicalResourceId: string);
26
+ toPath(): string;
27
+ getType(): string;
28
+ equalTo(other: ResourceLocation): boolean;
29
+ }
30
+ /**
31
+ * A mapping between a source and a destination location.
32
+ */
33
+ export declare class ResourceMapping {
34
+ readonly source: ResourceLocation;
35
+ readonly destination: ResourceLocation;
36
+ constructor(source: ResourceLocation, destination: ResourceLocation);
37
+ toTypedMapping(): TypedMapping;
38
+ }
@@ -0,0 +1,56 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ResourceMapping = exports.ResourceLocation = void 0;
4
+ /**
5
+ * This class mirrors the `ResourceLocation` interface from CloudFormation,
6
+ * but is richer, since it has a reference to the stack object, rather than
7
+ * merely the stack name.
8
+ */
9
+ class ResourceLocation {
10
+ stack;
11
+ logicalResourceId;
12
+ constructor(stack, logicalResourceId) {
13
+ this.stack = stack;
14
+ this.logicalResourceId = logicalResourceId;
15
+ }
16
+ toPath() {
17
+ const stack = this.stack;
18
+ const resource = stack.template.Resources?.[this.logicalResourceId];
19
+ const result = resource?.Metadata?.['aws:cdk:path'];
20
+ if (result != null) {
21
+ return result;
22
+ }
23
+ // If the path is not available, we can use stack name and logical ID
24
+ return `${stack.stackName}.${this.logicalResourceId}`;
25
+ }
26
+ getType() {
27
+ const resource = this.stack.template.Resources?.[this.logicalResourceId ?? ''];
28
+ return resource?.Type ?? 'Unknown';
29
+ }
30
+ equalTo(other) {
31
+ return this.logicalResourceId === other.logicalResourceId && this.stack.stackName === other.stack.stackName;
32
+ }
33
+ }
34
+ exports.ResourceLocation = ResourceLocation;
35
+ /**
36
+ * A mapping between a source and a destination location.
37
+ */
38
+ class ResourceMapping {
39
+ source;
40
+ destination;
41
+ constructor(source, destination) {
42
+ this.source = source;
43
+ this.destination = destination;
44
+ }
45
+ toTypedMapping() {
46
+ return {
47
+ // the type is the same in both source and destination,
48
+ // so we can use either one
49
+ type: this.source.getType(),
50
+ sourcePath: this.source.toPath(),
51
+ destinationPath: this.destination.toPath(),
52
+ };
53
+ }
54
+ }
55
+ exports.ResourceMapping = ResourceMapping;
56
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xvdWRmb3JtYXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJjbG91ZGZvcm1hdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFtQkE7Ozs7R0FJRztBQUNILE1BQWEsZ0JBQWdCO0lBQ0M7SUFBNEM7SUFBeEUsWUFBNEIsS0FBMEIsRUFBa0IsaUJBQXlCO1FBQXJFLFVBQUssR0FBTCxLQUFLLENBQXFCO1FBQWtCLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBUTtJQUNqRyxDQUFDO0lBRU0sTUFBTTtRQUNYLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDekIsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUNwRSxNQUFNLE1BQU0sR0FBRyxRQUFRLEVBQUUsUUFBUSxFQUFFLENBQUMsY0FBYyxDQUFDLENBQUM7UUFFcEQsSUFBSSxNQUFNLElBQUksSUFBSSxFQUFFLENBQUM7WUFDbkIsT0FBTyxNQUFNLENBQUM7UUFDaEIsQ0FBQztRQUVELHFFQUFxRTtRQUNyRSxPQUFPLEdBQUcsS0FBSyxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztJQUN4RCxDQUFDO0lBRU0sT0FBTztRQUNaLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUMvRSxPQUFPLFFBQVEsRUFBRSxJQUFJLElBQUksU0FBUyxDQUFDO0lBQ3JDLENBQUM7SUFFTSxPQUFPLENBQUMsS0FBdUI7UUFDcEMsT0FBTyxJQUFJLENBQUMsaUJBQWlCLEtBQUssS0FBSyxDQUFDLGlCQUFpQixJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxLQUFLLEtBQUssQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDO0lBQzlHLENBQUM7Q0FDRjtBQXpCRCw0Q0F5QkM7QUFFRDs7R0FFRztBQUNILE1BQWEsZUFBZTtJQUNFO0lBQTBDO0lBQXRFLFlBQTRCLE1BQXdCLEVBQWtCLFdBQTZCO1FBQXZFLFdBQU0sR0FBTixNQUFNLENBQWtCO1FBQWtCLGdCQUFXLEdBQVgsV0FBVyxDQUFrQjtJQUNuRyxDQUFDO0lBRU0sY0FBYztRQUNuQixPQUFPO1lBQ0wsdURBQXVEO1lBQ3ZELDJCQUEyQjtZQUMzQixJQUFJLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUU7WUFDM0IsVUFBVSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFO1lBQ2hDLGVBQWUsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRTtTQUMzQyxDQUFDO0lBQ0osQ0FBQztDQUNGO0FBYkQsMENBYUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFR5cGVkTWFwcGluZyB9IGZyb20gJ0Bhd3MtY2RrL2Nsb3VkZm9ybWF0aW9uLWRpZmYnO1xuaW1wb3J0IHR5cGUgKiBhcyBjeGFwaSBmcm9tICdAYXdzLWNkay9jeC1hcGknO1xuXG5leHBvcnQgaW50ZXJmYWNlIENsb3VkRm9ybWF0aW9uVGVtcGxhdGUge1xuICBSZXNvdXJjZXM/OiB7XG4gICAgW2xvZ2ljYWxJZDogc3RyaW5nXToge1xuICAgICAgVHlwZTogc3RyaW5nO1xuICAgICAgUHJvcGVydGllcz86IGFueTtcbiAgICAgIE1ldGFkYXRhPzogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICB9O1xuICB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENsb3VkRm9ybWF0aW9uU3RhY2sge1xuICByZWFkb25seSBlbnZpcm9ubWVudDogY3hhcGkuRW52aXJvbm1lbnQ7XG4gIHJlYWRvbmx5IHN0YWNrTmFtZTogc3RyaW5nO1xuICByZWFkb25seSB0ZW1wbGF0ZTogQ2xvdWRGb3JtYXRpb25UZW1wbGF0ZTtcbn1cblxuLyoqXG4gKiBUaGlzIGNsYXNzIG1pcnJvcnMgdGhlIGBSZXNvdXJjZUxvY2F0aW9uYCBpbnRlcmZhY2UgZnJvbSBDbG91ZEZvcm1hdGlvbixcbiAqIGJ1dCBpcyByaWNoZXIsIHNpbmNlIGl0IGhhcyBhIHJlZmVyZW5jZSB0byB0aGUgc3RhY2sgb2JqZWN0LCByYXRoZXIgdGhhblxuICogbWVyZWx5IHRoZSBzdGFjayBuYW1lLlxuICovXG5leHBvcnQgY2xhc3MgUmVzb3VyY2VMb2NhdGlvbiB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSBzdGFjazogQ2xvdWRGb3JtYXRpb25TdGFjaywgcHVibGljIHJlYWRvbmx5IGxvZ2ljYWxSZXNvdXJjZUlkOiBzdHJpbmcpIHtcbiAgfVxuXG4gIHB1YmxpYyB0b1BhdGgoKTogc3RyaW5nIHtcbiAgICBjb25zdCBzdGFjayA9IHRoaXMuc3RhY2s7XG4gICAgY29uc3QgcmVzb3VyY2UgPSBzdGFjay50ZW1wbGF0ZS5SZXNvdXJjZXM/Llt0aGlzLmxvZ2ljYWxSZXNvdXJjZUlkXTtcbiAgICBjb25zdCByZXN1bHQgPSByZXNvdXJjZT8uTWV0YWRhdGE/LlsnYXdzOmNkazpwYXRoJ107XG5cbiAgICBpZiAocmVzdWx0ICE9IG51bGwpIHtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlIHBhdGggaXMgbm90IGF2YWlsYWJsZSwgd2UgY2FuIHVzZSBzdGFjayBuYW1lIGFuZCBsb2dpY2FsIElEXG4gICAgcmV0dXJuIGAke3N0YWNrLnN0YWNrTmFtZX0uJHt0aGlzLmxvZ2ljYWxSZXNvdXJjZUlkfWA7XG4gIH1cblxuICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgIGNvbnN0IHJlc291cmNlID0gdGhpcy5zdGFjay50ZW1wbGF0ZS5SZXNvdXJjZXM/Llt0aGlzLmxvZ2ljYWxSZXNvdXJjZUlkID8/ICcnXTtcbiAgICByZXR1cm4gcmVzb3VyY2U/LlR5cGUgPz8gJ1Vua25vd24nO1xuICB9XG5cbiAgcHVibGljIGVxdWFsVG8ob3RoZXI6IFJlc291cmNlTG9jYXRpb24pOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5sb2dpY2FsUmVzb3VyY2VJZCA9PT0gb3RoZXIubG9naWNhbFJlc291cmNlSWQgJiYgdGhpcy5zdGFjay5zdGFja05hbWUgPT09IG90aGVyLnN0YWNrLnN0YWNrTmFtZTtcbiAgfVxufVxuXG4vKipcbiAqIEEgbWFwcGluZyBiZXR3ZWVuIGEgc291cmNlIGFuZCBhIGRlc3RpbmF0aW9uIGxvY2F0aW9uLlxuICovXG5leHBvcnQgY2xhc3MgUmVzb3VyY2VNYXBwaW5nIHtcbiAgY29uc3RydWN0b3IocHVibGljIHJlYWRvbmx5IHNvdXJjZTogUmVzb3VyY2VMb2NhdGlvbiwgcHVibGljIHJlYWRvbmx5IGRlc3RpbmF0aW9uOiBSZXNvdXJjZUxvY2F0aW9uKSB7XG4gIH1cblxuICBwdWJsaWMgdG9UeXBlZE1hcHBpbmcoKTogVHlwZWRNYXBwaW5nIHtcbiAgICByZXR1cm4ge1xuICAgICAgLy8gdGhlIHR5cGUgaXMgdGhlIHNhbWUgaW4gYm90aCBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uLFxuICAgICAgLy8gc28gd2UgY2FuIHVzZSBlaXRoZXIgb25lXG4gICAgICB0eXBlOiB0aGlzLnNvdXJjZS5nZXRUeXBlKCksXG4gICAgICBzb3VyY2VQYXRoOiB0aGlzLnNvdXJjZS50b1BhdGgoKSxcbiAgICAgIGRlc3RpbmF0aW9uUGF0aDogdGhpcy5kZXN0aW5hdGlvbi50b1BhdGgoKSxcbiAgICB9O1xuICB9XG59XG5cbiJdfQ==
@@ -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=