@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,95 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.findCloudWatchLogGroups = findCloudWatchLogGroups;
4
+ const util_1 = require("../../util");
5
+ const cloudformation_1 = require("../cloudformation");
6
+ const environment_1 = require("../environment");
7
+ const private_1 = require("../io/private");
8
+ const plugin_1 = require("../plugin");
9
+ const toolkit_info_1 = require("../toolkit-info");
10
+ // resource types that have associated CloudWatch Log Groups that should _not_ be monitored
11
+ const IGNORE_LOGS_RESOURCE_TYPES = ['AWS::EC2::FlowLog', 'AWS::CloudTrail::Trail', 'AWS::CodeBuild::Project'];
12
+ async function findCloudWatchLogGroups(sdkProvider, ioHelper, stackArtifact) {
13
+ let sdk;
14
+ const resolvedEnv = await sdkProvider.resolveEnvironment(stackArtifact.environment);
15
+ // try to assume the lookup role and fallback to the default credentials
16
+ try {
17
+ sdk = (await new environment_1.EnvironmentAccess(sdkProvider, toolkit_info_1.DEFAULT_TOOLKIT_STACK_NAME, ioHelper).accessStackForLookup(stackArtifact)).sdk;
18
+ }
19
+ catch (e) {
20
+ await ioHelper.notify(private_1.IO.DEFAULT_TOOLKIT_DEBUG.msg(`Failed to access SDK environment: ${(0, util_1.formatErrorMessage)(e)}`));
21
+ sdk = (await sdkProvider.forEnvironment(resolvedEnv, plugin_1.Mode.ForReading)).sdk;
22
+ }
23
+ const listStackResources = new cloudformation_1.LazyListStackResources(sdk, stackArtifact.stackName);
24
+ const evaluateCfnTemplate = new cloudformation_1.EvaluateCloudFormationTemplate({
25
+ stackArtifact,
26
+ parameters: {},
27
+ account: resolvedEnv.account,
28
+ region: resolvedEnv.region,
29
+ partition: (await sdk.currentAccount()).partition,
30
+ sdk,
31
+ });
32
+ const stackResources = await listStackResources.listStackResources();
33
+ const logGroupNames = findAllLogGroupNames(stackResources, evaluateCfnTemplate);
34
+ return {
35
+ env: resolvedEnv,
36
+ sdk,
37
+ logGroupNames,
38
+ };
39
+ }
40
+ /**
41
+ * Determine if a CloudWatch Log Group is associated
42
+ * with an ignored resource
43
+ */
44
+ function isReferencedFromIgnoredResource(logGroupResource, evaluateCfnTemplate) {
45
+ const resourcesReferencingLogGroup = evaluateCfnTemplate.findReferencesTo(logGroupResource.LogicalResourceId);
46
+ return resourcesReferencingLogGroup.some((reference) => {
47
+ return IGNORE_LOGS_RESOURCE_TYPES.includes(reference.Type);
48
+ });
49
+ }
50
+ const cloudWatchLogsResolvers = {
51
+ 'AWS::Logs::LogGroup': (resource, evaluateCfnTemplate) => {
52
+ if (isReferencedFromIgnoredResource(resource, evaluateCfnTemplate)) {
53
+ return undefined;
54
+ }
55
+ return resource.PhysicalResourceId?.toString();
56
+ },
57
+ // Resource types that will create a CloudWatch log group with a specific name if one is not provided.
58
+ // The keys are CFN resource types, and the values are the name of the physical name property of that resource
59
+ // and the service name that is used in the automatically created CloudWatch log group.
60
+ 'AWS::Lambda::Function': (resource, evaluateCfnTemplate) => {
61
+ const loggingConfig = evaluateCfnTemplate.getResourceProperty(resource.LogicalResourceId, 'LoggingConfig');
62
+ if (loggingConfig?.LogGroup) {
63
+ // if LogGroup is a string then use it as the LogGroupName as it is referred by LogGroup.fromLogGroupArn in CDK
64
+ if (typeof loggingConfig.LogGroup === 'string') {
65
+ return loggingConfig.LogGroup;
66
+ }
67
+ // if { Ref: '...' } is used then try to resolve the LogGroupName from the referenced resource in the template
68
+ if (typeof loggingConfig.LogGroup === 'object') {
69
+ if (loggingConfig.LogGroup.Ref) {
70
+ return evaluateCfnTemplate.getResourceProperty(loggingConfig.LogGroup.Ref, 'LogGroupName');
71
+ }
72
+ }
73
+ }
74
+ return `/aws/lambda/${resource.PhysicalResourceId}`;
75
+ },
76
+ };
77
+ /**
78
+ * Find all CloudWatch Log Groups in the deployed template.
79
+ * This will find both explicitly created Log Groups (excluding those associated with ignored resources)
80
+ * and Log Groups created implicitly (i.e. Lambda Functions)
81
+ */
82
+ function findAllLogGroupNames(stackResources, evaluateCfnTemplate) {
83
+ const logGroupNames = [];
84
+ for (const resource of stackResources) {
85
+ const logGroupResolver = cloudWatchLogsResolvers[resource.ResourceType];
86
+ if (logGroupResolver) {
87
+ const logGroupName = logGroupResolver(resource, evaluateCfnTemplate);
88
+ if (logGroupName) {
89
+ logGroupNames.push(logGroupName);
90
+ }
91
+ }
92
+ }
93
+ return logGroupNames;
94
+ }
95
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmluZC1jbG91ZHdhdGNoLWxvZ3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJmaW5kLWNsb3Vkd2F0Y2gtbG9ncy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQXNDQSwwREFpQ0M7QUFyRUQscUNBQWdEO0FBRWhELHNEQUEyRjtBQUMzRixnREFBbUQ7QUFDbkQsMkNBQW1DO0FBRW5DLHNDQUFpQztBQUNqQyxrREFBNkQ7QUFFN0QsMkZBQTJGO0FBQzNGLE1BQU0sMEJBQTBCLEdBQUcsQ0FBQyxtQkFBbUIsRUFBRSx3QkFBd0IsRUFBRSx5QkFBeUIsQ0FBQyxDQUFDO0FBMEJ2RyxLQUFLLFVBQVUsdUJBQXVCLENBQzNDLFdBQXdCLEVBQ3hCLFFBQWtCLEVBQ2xCLGFBQTBDO0lBRTFDLElBQUksR0FBUSxDQUFDO0lBQ2IsTUFBTSxXQUFXLEdBQUcsTUFBTSxXQUFXLENBQUMsa0JBQWtCLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ3BGLHdFQUF3RTtJQUN4RSxJQUFJLENBQUM7UUFDSCxHQUFHLEdBQUcsQ0FBQyxNQUFNLElBQUksK0JBQWlCLENBQUMsV0FBVyxFQUFFLHlDQUEwQixFQUFFLFFBQVEsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO0lBQ2pJLENBQUM7SUFBQyxPQUFPLENBQU0sRUFBRSxDQUFDO1FBQ2hCLE1BQU0sUUFBUSxDQUFDLE1BQU0sQ0FBQyxZQUFFLENBQUMscUJBQXFCLENBQUMsR0FBRyxDQUFDLHFDQUFxQyxJQUFBLHlCQUFrQixFQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ2xILEdBQUcsR0FBRyxDQUFDLE1BQU0sV0FBVyxDQUFDLGNBQWMsQ0FBQyxXQUFXLEVBQUUsYUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO0lBQzdFLENBQUM7SUFFRCxNQUFNLGtCQUFrQixHQUFHLElBQUksdUNBQXNCLENBQUMs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Q0FBQztZQUNyRSxJQUFJLFlBQVksRUFBRSxDQUFDO2dCQUNqQixhQUFhLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQ25DLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sYUFBYSxDQUFDO0FBQ3ZCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IENsb3VkRm9ybWF0aW9uU3RhY2tBcnRpZmFjdCwgRW52aXJvbm1lbnQgfSBmcm9tICdAYXdzLWNkay9jeC1hcGknO1xuaW1wb3J0IHR5cGUgeyBTdGFja1Jlc291cmNlU3VtbWFyeSB9IGZyb20gJ0Bhd3Mtc2RrL2NsaWVudC1jbG91ZGZvcm1hdGlvbic7XG5pbXBvcnQgeyBmb3JtYXRFcnJvck1lc3NhZ2UgfSBmcm9tICcuLi8uLi91dGlsJztcbmltcG9ydCB0eXBlIHsgU0RLLCBTZGtQcm92aWRlciB9IGZyb20gJy4uL2F3cy1hdXRoL3ByaXZhdGUnO1xuaW1wb3J0IHsgRXZhbHVhdGVDbG91ZEZvcm1hdGlvblRlbXBsYXRlLCBMYXp5TGlzdFN0YWNrUmVzb3VyY2VzIH0gZnJvbSAnLi4vY2xvdWRmb3JtYXRpb24nO1xuaW1wb3J0IHsgRW52aXJvbm1lbnRBY2Nlc3MgfSBmcm9tICcuLi9lbnZpcm9ubWVudCc7XG5pbXBvcnQgeyBJTyB9IGZyb20gJy4uL2lvL3ByaXZhdGUnO1xuaW1wb3J0IHR5cGUgeyBJb0hlbHBlciB9IGZyb20gJy4uL2lvL3ByaXZhdGUnO1xuaW1wb3J0IHsgTW9kZSB9IGZyb20gJy4uL3BsdWdpbic7XG5pbXBvcnQgeyBERUZBVUxUX1RPT0xLSVRfU1RBQ0tfTkFNRSB9IGZyb20gJy4uL3Rvb2xraXQtaW5mbyc7XG5cbi8vIHJlc291cmNlIHR5cGVzIHRoYXQgaGF2ZSBhc3NvY2lhdGVkIENsb3VkV2F0Y2ggTG9nIEdyb3VwcyB0aGF0IHNob3VsZCBfbm90XyBiZSBtb25pdG9yZWRcbmNvbnN0IElHTk9SRV9MT0dTX1JFU09VUkNFX1RZUEVTID0gWydBV1M6OkVDMjo6Rmxvd0xvZycsICdBV1M6OkNsb3VkVHJhaWw6OlRyYWlsJywgJ0FXUzo6Q29kZUJ1aWxkOjpQcm9qZWN0J107XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBuZWVkZWQgdG8gbW9uaXRvciBDbG91ZFdhdGNoIExvZyBHcm91cHNcbiAqIGZvdW5kIGluIGEgZ2l2ZW4gQ2xvdWRGb3JtYXRpb24gU3RhY2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGb3VuZExvZ0dyb3Vwc1Jlc3VsdCB7XG4gIC8qKlxuICAgKiBUaGUgcmVzb2x2ZWQgZW52aXJvbm1lbnQgKGFjY291bnQvcmVnaW9uKSB0aGF0IHRoZSBsb2dcbiAgICogZ3JvdXBzIGFyZSBkZXBsb3llZCBpblxuICAgKi9cbiAgcmVhZG9ubHkgZW52OiBFbnZpcm9ubWVudDtcblxuICAvKipcbiAgICogVGhlIFNESyB0aGF0IGNhbiBiZSB1c2VkIHRvIHJlYWQgZXZlbnRzIGZyb20gdGhlIENsb3VkV2F0Y2hcbiAgICogTG9nIEdyb3VwcyBpbiB0aGUgZ2l2ZW4gZW52aXJvbm1lbnRcbiAgICovXG4gIHJlYWRvbmx5IHNkazogU0RLO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZXMgb2YgdGhlIHJlbGV2YW50IENsb3VkV2F0Y2ggTG9nIEdyb3Vwc1xuICAgKiBpbiB0aGUgZ2l2ZW4gQ2xvdWRGb3JtYXRpb24gdGVtcGxhdGVcbiAgICovXG4gIHJlYWRvbmx5IGxvZ0dyb3VwTmFtZXM6IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmluZENsb3VkV2F0Y2hMb2dHcm91cHMoXG4gIHNka1Byb3ZpZGVyOiBTZGtQcm92aWRlcixcbiAgaW9IZWxwZXI6IElvSGVscGVyLFxuICBzdGFja0FydGlmYWN0OiBDbG91ZEZvcm1hdGlvblN0YWNrQXJ0aWZhY3QsXG4pOiBQcm9taXNlPEZvdW5kTG9nR3JvdXBzUmVzdWx0PiB7XG4gIGxldCBzZGs6IFNESztcbiAgY29uc3QgcmVzb2x2ZWRFbnYgPSBhd2FpdCBzZGtQcm92aWRlci5yZXNvbHZlRW52aXJvbm1lbnQoc3RhY2tBcnRpZmFjdC5lbnZpcm9ubWVudCk7XG4gIC8vIHRyeSB0byBhc3N1bWUgdGhlIGxvb2t1cCByb2xlIGFuZCBmYWxsYmFjayB0byB0aGUgZGVmYXVsdCBjcmVkZW50aWFsc1xuICB0cnkge1xuICAgIHNkayA9IChhd2FpdCBuZXcgRW52aXJvbm1lbnRBY2Nlc3Moc2RrUHJvdmlkZXIsIERFRkFVTFRfVE9PTEtJVF9TVEFDS19OQU1FLCBpb0hlbHBlcikuYWNjZXNzU3RhY2tGb3JMb29rdXAoc3RhY2tBcnRpZmFjdCkpLnNkaztcbiAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgYXdhaXQgaW9IZWxwZXIubm90aWZ5KElPLkRFRkFVTFRfVE9PTEtJVF9ERUJVRy5tc2coYEZhaWxlZCB0byBhY2Nlc3MgU0RLIGVudmlyb25tZW50OiAke2Zvcm1hdEVycm9yTWVzc2FnZShlKX1gKSk7XG4gICAgc2RrID0gKGF3YWl0IHNka1Byb3ZpZGVyLmZvckVudmlyb25tZW50KHJlc29sdmVkRW52LCBNb2RlLkZvclJlYWRpbmcpKS5zZGs7XG4gIH1cblxuICBjb25zdCBsaXN0U3RhY2tSZXNvdXJjZXMgPSBuZXcgTGF6eUxpc3RTdGFja1Jlc291cmNlcyhzZGssIHN0YWNrQXJ0aWZhY3Quc3RhY2tOYW1lKTtcbiAgY29uc3QgZXZhbHVhdGVDZm5UZW1wbGF0ZSA9IG5ldyBFdmFsdWF0ZUNsb3VkRm9ybWF0aW9uVGVtcGxhdGUoe1xuICAgIHN0YWNrQXJ0aWZhY3QsXG4gICAgcGFyYW1ldGVyczoge30sXG4gICAgYWNjb3VudDogcmVzb2x2ZWRFbnYuYWNjb3VudCxcbiAgICByZWdpb246IHJlc29sdmVkRW52LnJlZ2lvbixcbiAgICBwYXJ0aXRpb246IChhd2FpdCBzZGsuY3VycmVudEFjY291bnQoKSkucGFydGl0aW9uLFxuICAgIHNkayxcbiAgfSk7XG5cbiAgY29uc3Qgc3RhY2tSZXNvdXJjZXMgPSBhd2FpdCBsaXN0U3RhY2tSZXNvdXJjZXMubGlzdFN0YWNrUmVzb3VyY2VzKCk7XG4gIGNvbnN0IGxvZ0dyb3VwTmFtZXMgPSBmaW5kQWxsTG9nR3JvdXBOYW1lcyhzdGFja1Jlc291cmNlcywgZXZhbHVhdGVDZm5UZW1wbGF0ZSk7XG5cbiAgcmV0dXJuIHtcbiAgICBlbnY6IHJlc29sdmVkRW52LFxuICAgIHNkayxcbiAgICBsb2dHcm91cE5hbWVzLFxuICB9O1xufVxuXG4vKipcbiAqIERldGVybWluZSBpZiBhIENsb3VkV2F0Y2ggTG9nIEdyb3VwIGlzIGFzc29jaWF0ZWRcbiAqIHdpdGggYW4gaWdub3JlZCByZXNvdXJjZVxuICovXG5mdW5jdGlvbiBpc1JlZmVyZW5jZWRGcm9tSWdub3JlZFJlc291cmNlKFxuICBsb2dHcm91cFJlc291cmNlOiBTdGFja1Jlc291cmNlU3VtbWFyeSxcbiAgZXZhbHVhdGVDZm5UZW1wbGF0ZTogRXZhbHVhdGVDbG91ZEZvcm1hdGlvblRlbXBsYXRlLFxuKTogYm9vbGVhbiB7XG4gIGNvbnN0IHJlc291cmNlc1JlZmVyZW5jaW5nTG9nR3JvdXAgPSBldmFsdWF0ZUNmblRlbXBsYXRlLmZpbmRSZWZlcmVuY2VzVG8obG9nR3JvdXBSZXNvdXJjZS5Mb2dpY2FsUmVzb3VyY2VJZCEpO1xuICByZXR1cm4gcmVzb3VyY2VzUmVmZXJlbmNpbmdMb2dHcm91cC5zb21lKChyZWZlcmVuY2UpID0+IHtcbiAgICByZXR1cm4gSUdOT1JFX0xPR1NfUkVTT1VSQ0VfVFlQRVMuaW5jbHVkZXMocmVmZXJlbmNlLlR5cGUpO1xuICB9KTtcbn1cblxudHlwZSBDbG91ZFdhdGNoTG9nc1Jlc29sdmVyID0gKFxuICByZXNvdXJjZTogU3RhY2tSZXNvdXJjZVN1bW1hcnksXG4gIGV2YWx1YXRlQ2ZuVGVtcGxhdGU6IEV2YWx1YXRlQ2xvdWRGb3JtYXRpb25UZW1wbGF0ZSxcbikgPT4gc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG5jb25zdCBjbG91ZFdhdGNoTG9nc1Jlc29sdmVyczogUmVjb3JkPHN0cmluZywgQ2xvdWRXYXRjaExvZ3NSZXNvbHZlcj4gPSB7XG4gICdBV1M6OkxvZ3M6OkxvZ0dyb3VwJzogKHJlc291cmNlLCBldmFsdWF0ZUNmblRlbXBsYXRlKSA9PiB7XG4gICAgaWYgKGlzUmVmZXJlbmNlZEZyb21JZ25vcmVkUmVzb3VyY2UocmVzb3VyY2UsIGV2YWx1YXRlQ2ZuVGVtcGxhdGUpKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4gcmVzb3VyY2UuUGh5c2ljYWxSZXNvdXJjZUlkPy50b1N0cmluZygpO1xuICB9LFxuXG4gIC8vIFJlc291cmNlIHR5cGVzIHRoYXQgd2lsbCBjcmVhdGUgYSBDbG91ZFdhdGNoIGxvZyBncm91cCB3aXRoIGEgc3BlY2lmaWMgbmFtZSBpZiBvbmUgaXMgbm90IHByb3ZpZGVkLlxuICAvLyBUaGUga2V5cyBhcmUgQ0ZOIHJlc291cmNlIHR5cGVzLCBhbmQgdGhlIHZhbHVlcyBhcmUgdGhlIG5hbWUgb2YgdGhlIHBoeXNpY2FsIG5hbWUgcHJvcGVydHkgb2YgdGhhdCByZXNvdXJjZVxuICAvLyBhbmQgdGhlIHNlcnZpY2UgbmFtZSB0aGF0IGlzIHVzZWQgaW4gdGhlIGF1dG9tYXRpY2FsbHkgY3JlYXRlZCBDbG91ZFdhdGNoIGxvZyBncm91cC5cbiAgJ0FXUzo6TGFtYmRhOjpGdW5jdGlvbic6IChyZXNvdXJjZSwgZXZhbHVhdGVDZm5UZW1wbGF0ZSkgPT4ge1xuICAgIGNvbnN0IGxvZ2dpbmdDb25maWcgPSBldmFsdWF0ZUNmblRlbXBsYXRlLmdldFJlc291cmNlUHJvcGVydHkocmVzb3VyY2UuTG9naWNhbFJlc291cmNlSWQhLCAnTG9nZ2luZ0NvbmZpZycpO1xuICAgIGlmIChsb2dnaW5nQ29uZmlnPy5Mb2dHcm91cCkge1xuICAgICAgLy8gaWYgTG9nR3JvdXAgaXMgYSBzdHJpbmcgdGhlbiB1c2UgaXQgYXMgdGhlIExvZ0dyb3VwTmFtZSBhcyBpdCBpcyByZWZlcnJlZCBieSBMb2dHcm91cC5mcm9tTG9nR3JvdXBBcm4gaW4gQ0RLXG4gICAgICBpZiAodHlwZW9mIGxvZ2dpbmdDb25maWcuTG9nR3JvdXAgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiBsb2dnaW5nQ29uZmlnLkxvZ0dyb3VwO1xuICAgICAgfVxuXG4gICAgICAvLyBpZiB7IFJlZjogJy4uLicgfSBpcyB1c2VkIHRoZW4gdHJ5IHRvIHJlc29sdmUgdGhlIExvZ0dyb3VwTmFtZSBmcm9tIHRoZSByZWZlcmVuY2VkIHJlc291cmNlIGluIHRoZSB0ZW1wbGF0ZVxuICAgICAgaWYgKHR5cGVvZiBsb2dnaW5nQ29uZmlnLkxvZ0dyb3VwID09PSAnb2JqZWN0Jykge1xuICAgICAgICBpZiAobG9nZ2luZ0NvbmZpZy5Mb2dHcm91cC5SZWYpIHtcbiAgICAgICAgICByZXR1cm4gZXZhbHVhdGVDZm5UZW1wbGF0ZS5nZXRSZXNvdXJjZVByb3BlcnR5KGxvZ2dpbmdDb25maWcuTG9nR3JvdXAuUmVmLCAnTG9nR3JvdXBOYW1lJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gYC9hd3MvbGFtYmRhLyR7cmVzb3VyY2UuUGh5c2ljYWxSZXNvdXJjZUlkfWA7XG4gIH0sXG59O1xuXG4vKipcbiAqIEZpbmQgYWxsIENsb3VkV2F0Y2ggTG9nIEdyb3VwcyBpbiB0aGUgZGVwbG95ZWQgdGVtcGxhdGUuXG4gKiBUaGlzIHdpbGwgZmluZCBib3RoIGV4cGxpY2l0bHkgY3JlYXRlZCBMb2cgR3JvdXBzIChleGNsdWRpbmcgdGhvc2UgYXNzb2NpYXRlZCB3aXRoIGlnbm9yZWQgcmVzb3VyY2VzKVxuICogYW5kIExvZyBHcm91cHMgY3JlYXRlZCBpbXBsaWNpdGx5IChpLmUuIExhbWJkYSBGdW5jdGlvbnMpXG4gKi9cbmZ1bmN0aW9uIGZpbmRBbGxMb2dHcm91cE5hbWVzKFxuICBzdGFja1Jlc291cmNlczogU3RhY2tSZXNvdXJjZVN1bW1hcnlbXSxcbiAgZXZhbHVhdGVDZm5UZW1wbGF0ZTogRXZhbHVhdGVDbG91ZEZvcm1hdGlvblRlbXBsYXRlLFxuKTogc3RyaW5nW10ge1xuICBjb25zdCBsb2dHcm91cE5hbWVzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIGZvciAoY29uc3QgcmVzb3VyY2Ugb2Ygc3RhY2tSZXNvdXJjZXMpIHtcbiAgICBjb25zdCBsb2dHcm91cFJlc29sdmVyID0gY2xvdWRXYXRjaExvZ3NSZXNvbHZlcnNbcmVzb3VyY2UuUmVzb3VyY2VUeXBlIV07XG4gICAgaWYgKGxvZ0dyb3VwUmVzb2x2ZXIpIHtcbiAgICAgIGNvbnN0IGxvZ0dyb3VwTmFtZSA9IGxvZ0dyb3VwUmVzb2x2ZXIocmVzb3VyY2UsIGV2YWx1YXRlQ2ZuVGVtcGxhdGUpO1xuICAgICAgaWYgKGxvZ0dyb3VwTmFtZSkge1xuICAgICAgICBsb2dHcm91cE5hbWVzLnB1c2gobG9nR3JvdXBOYW1lKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbG9nR3JvdXBOYW1lcztcbn1cbiJdfQ==
@@ -0,0 +1,2 @@
1
+ export * from './logs-monitor';
2
+ export * from './find-cloudwatch-logs';
@@ -0,0 +1,19 @@
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("./logs-monitor"), exports);
18
+ __exportStar(require("./find-cloudwatch-logs"), exports);
19
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsaURBQStCO0FBQy9CLHlEQUF1QyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vbG9ncy1tb25pdG9yJztcbmV4cG9ydCAqIGZyb20gJy4vZmluZC1jbG91ZHdhdGNoLWxvZ3MnO1xuIl19
@@ -0,0 +1,76 @@
1
+ import type * as cxapi from '@aws-cdk/cx-api';
2
+ import type { SDK } from '../aws-auth/private';
3
+ import type { IoHelper } from '../io/private';
4
+ export interface CloudWatchLogEventMonitorProps {
5
+ /**
6
+ * The IoHost used for messaging
7
+ */
8
+ readonly ioHelper: IoHelper;
9
+ /**
10
+ * The time from which we start reading log messages
11
+ *
12
+ * @default - now
13
+ */
14
+ readonly startTime?: Date;
15
+ }
16
+ export declare class CloudWatchLogEventMonitor {
17
+ /**
18
+ * Determines which events not to display
19
+ */
20
+ private startTime;
21
+ /**
22
+ * Map of environment (account:region) to LogGroupsAccessSettings
23
+ */
24
+ private readonly envsLogGroupsAccessSettings;
25
+ /**
26
+ * After reading events from all CloudWatch log groups
27
+ * how long should we wait to read more events.
28
+ *
29
+ * If there is some error with reading events (i.e. Throttle)
30
+ * then this is also how long we wait until we try again
31
+ */
32
+ private readonly pollingInterval;
33
+ monitorId?: string;
34
+ private readonly ioHelper;
35
+ constructor(props: CloudWatchLogEventMonitorProps);
36
+ /**
37
+ * resume reading/printing events
38
+ */
39
+ activate(): Promise<void>;
40
+ /**
41
+ * deactivates the monitor so no new events are read
42
+ * use case for this is when we are in the middle of performing a deployment
43
+ * and don't want to interweave all the logs together with the CFN
44
+ * deployment logs
45
+ *
46
+ * Also resets the start time to be when the new deployment was triggered
47
+ * and clears the list of tracked log groups
48
+ */
49
+ deactivate(): Promise<void>;
50
+ /**
51
+ * Adds CloudWatch log groups to read log events from.
52
+ * Since we could be watching multiple stacks that deploy to
53
+ * multiple environments (account+region), we need to store a list of log groups
54
+ * per env along with the SDK object that has access to read from
55
+ * that environment.
56
+ */
57
+ addLogGroups(env: cxapi.Environment, sdk: SDK, logGroupNames: string[]): void;
58
+ private logGroupNames;
59
+ private scheduleNextTick;
60
+ private tick;
61
+ /**
62
+ * Reads all new log events from a set of CloudWatch Log Groups
63
+ * in parallel
64
+ */
65
+ private readNewEvents;
66
+ /**
67
+ * Print out a cloudwatch event
68
+ */
69
+ private print;
70
+ /**
71
+ * Reads all new log events from a CloudWatch Log Group
72
+ * starting at either the time the hotswap was triggered or
73
+ * when the last event was read on the previous tick
74
+ */
75
+ private readEventsFromLogGroup;
76
+ }
@@ -0,0 +1,194 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CloudWatchLogEventMonitor = void 0;
4
+ const util = require("util");
5
+ const chalk = require("chalk");
6
+ const uuid = require("uuid");
7
+ const util_1 = require("../../util");
8
+ const private_1 = require("../io/private");
9
+ class CloudWatchLogEventMonitor {
10
+ /**
11
+ * Determines which events not to display
12
+ */
13
+ startTime;
14
+ /**
15
+ * Map of environment (account:region) to LogGroupsAccessSettings
16
+ */
17
+ envsLogGroupsAccessSettings = new Map();
18
+ /**
19
+ * After reading events from all CloudWatch log groups
20
+ * how long should we wait to read more events.
21
+ *
22
+ * If there is some error with reading events (i.e. Throttle)
23
+ * then this is also how long we wait until we try again
24
+ */
25
+ pollingInterval = 2_000;
26
+ monitorId;
27
+ ioHelper;
28
+ constructor(props) {
29
+ this.startTime = props.startTime?.getTime() ?? Date.now();
30
+ this.ioHelper = props.ioHelper;
31
+ }
32
+ /**
33
+ * resume reading/printing events
34
+ */
35
+ async activate() {
36
+ this.monitorId = uuid.v4();
37
+ await this.ioHelper.notify(private_1.IO.CDK_TOOLKIT_I5032.msg('Start monitoring log groups', {
38
+ monitor: this.monitorId,
39
+ logGroupNames: this.logGroupNames(),
40
+ }));
41
+ await this.tick();
42
+ this.scheduleNextTick();
43
+ }
44
+ /**
45
+ * deactivates the monitor so no new events are read
46
+ * use case for this is when we are in the middle of performing a deployment
47
+ * and don't want to interweave all the logs together with the CFN
48
+ * deployment logs
49
+ *
50
+ * Also resets the start time to be when the new deployment was triggered
51
+ * and clears the list of tracked log groups
52
+ */
53
+ async deactivate() {
54
+ const oldMonitorId = this.monitorId;
55
+ this.monitorId = undefined;
56
+ this.startTime = Date.now();
57
+ await this.ioHelper.notify(private_1.IO.CDK_TOOLKIT_I5034.msg('Stopped monitoring log groups', {
58
+ monitor: oldMonitorId,
59
+ logGroupNames: this.logGroupNames(),
60
+ }));
61
+ this.envsLogGroupsAccessSettings.clear();
62
+ }
63
+ /**
64
+ * Adds CloudWatch log groups to read log events from.
65
+ * Since we could be watching multiple stacks that deploy to
66
+ * multiple environments (account+region), we need to store a list of log groups
67
+ * per env along with the SDK object that has access to read from
68
+ * that environment.
69
+ */
70
+ addLogGroups(env, sdk, logGroupNames) {
71
+ const awsEnv = `${env.account}:${env.region}`;
72
+ const logGroupsStartTimes = logGroupNames.reduce((acc, groupName) => {
73
+ acc[groupName] = this.startTime;
74
+ return acc;
75
+ }, {});
76
+ this.envsLogGroupsAccessSettings.set(awsEnv, {
77
+ sdk,
78
+ logGroupsStartTimes: {
79
+ ...this.envsLogGroupsAccessSettings.get(awsEnv)?.logGroupsStartTimes,
80
+ ...logGroupsStartTimes,
81
+ },
82
+ });
83
+ }
84
+ logGroupNames() {
85
+ return Array.from(this.envsLogGroupsAccessSettings.values()).flatMap((settings) => Object.keys(settings.logGroupsStartTimes));
86
+ }
87
+ scheduleNextTick() {
88
+ if (!this.monitorId) {
89
+ return;
90
+ }
91
+ setTimeout(() => void this.tick(), this.pollingInterval);
92
+ }
93
+ async tick() {
94
+ // excluding from codecoverage because this
95
+ // doesn't always run (depends on timing)
96
+ /* c8 ignore start */
97
+ if (!this.monitorId) {
98
+ return;
99
+ }
100
+ /* c8 ignore stop */
101
+ try {
102
+ const events = (0, util_1.flatten)(await this.readNewEvents());
103
+ for (const event of events) {
104
+ await this.print(event);
105
+ }
106
+ // We might have been stop()ped while the network call was in progress.
107
+ if (!this.monitorId) {
108
+ return;
109
+ }
110
+ }
111
+ catch (e) {
112
+ await this.ioHelper.notify(private_1.IO.CDK_TOOLKIT_E5035.msg(`Error occurred while monitoring logs: ${String(e)}`, { error: e }));
113
+ }
114
+ this.scheduleNextTick();
115
+ }
116
+ /**
117
+ * Reads all new log events from a set of CloudWatch Log Groups
118
+ * in parallel
119
+ */
120
+ async readNewEvents() {
121
+ const promises = [];
122
+ for (const settings of this.envsLogGroupsAccessSettings.values()) {
123
+ for (const group of Object.keys(settings.logGroupsStartTimes)) {
124
+ promises.push(this.readEventsFromLogGroup(settings, group));
125
+ }
126
+ }
127
+ // Limited set of log groups
128
+ // eslint-disable-next-line @cdklabs/promiseall-no-unbounded-parallelism
129
+ return Promise.all(promises);
130
+ }
131
+ /**
132
+ * Print out a cloudwatch event
133
+ */
134
+ async print(event) {
135
+ await this.ioHelper.notify(private_1.IO.CDK_TOOLKIT_I5033.msg(util.format('[%s] %s %s', chalk.blue(event.logGroupName), chalk.yellow(event.timestamp.toLocaleTimeString()), event.message.trim()), event));
136
+ }
137
+ /**
138
+ * Reads all new log events from a CloudWatch Log Group
139
+ * starting at either the time the hotswap was triggered or
140
+ * when the last event was read on the previous tick
141
+ */
142
+ async readEventsFromLogGroup(logGroupsAccessSettings, logGroupName) {
143
+ const events = [];
144
+ // log events from some service are ingested faster than others
145
+ // so we need to track the start/end time for each log group individually
146
+ // to make sure that we process all events from each log group
147
+ const startTime = logGroupsAccessSettings.logGroupsStartTimes[logGroupName] ?? this.startTime;
148
+ let endTime = startTime;
149
+ try {
150
+ const response = await logGroupsAccessSettings.sdk.cloudWatchLogs().filterLogEvents({
151
+ logGroupName: logGroupName,
152
+ limit: 100,
153
+ startTime: startTime,
154
+ });
155
+ const filteredEvents = response.events ?? [];
156
+ for (const event of filteredEvents) {
157
+ if (event.message) {
158
+ events.push({
159
+ message: event.message,
160
+ logGroupName,
161
+ timestamp: event.timestamp ? new Date(event.timestamp) : new Date(),
162
+ });
163
+ if (event.timestamp && endTime < event.timestamp) {
164
+ endTime = event.timestamp;
165
+ }
166
+ }
167
+ }
168
+ // As long as there are _any_ events in the log group `filterLogEvents` will return a nextToken.
169
+ // This is true even if these events are before `startTime`. So if we have 100 events and a nextToken
170
+ // then assume that we have hit the limit and let the user know some messages have been suppressed.
171
+ // We are essentially showing them a sampling (10000 events printed out is not very useful)
172
+ if (filteredEvents.length === 100 && response.nextToken) {
173
+ events.push({
174
+ message: '>>> `watch` shows only the first 100 log messages - the rest have been truncated...',
175
+ logGroupName,
176
+ timestamp: new Date(endTime),
177
+ });
178
+ }
179
+ }
180
+ catch (e) {
181
+ // with Lambda functions the CloudWatch is not created
182
+ // until something is logged, so just keep polling until
183
+ // there is somthing to find
184
+ if (e.name === 'ResourceNotFoundException') {
185
+ return [];
186
+ }
187
+ throw e;
188
+ }
189
+ logGroupsAccessSettings.logGroupsStartTimes[logGroupName] = endTime + 1;
190
+ return events;
191
+ }
192
+ }
193
+ exports.CloudWatchLogEventMonitor = CloudWatchLogEventMonitor;
194
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9ncy1tb25pdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsibG9ncy1tb25pdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZCQUE2QjtBQUU3QiwrQkFBK0I7QUFDL0IsNkJBQTZCO0FBRTdCLHFDQUFxQztBQUVyQywyQ0FBbUM7QUFvQ25DLE1BQWEseUJBQXlCO0lBQ3BDOztPQUVHO0lBQ0ssU0FBUyxDQUFTO0lBRTFCOztPQUVHO0lBQ2MsMkJBQTJCLEdBQUcsSUFBSSxHQUFHLEVBQW1DLENBQUM7SUFFMUY7Ozs7OztPQU1HO0lBQ2MsZUFBZSxHQUFXLEtBQUssQ0FBQztJQUUxQyxTQUFTLENBQVU7SUFDVCxRQUFRLENBQVc7SUFFcEMsWUFBWSxLQUFxQztRQUMvQyxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQyxTQUFTLEVBQUUsT0FBTyxFQUFFLElBQUksSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQzFELElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQztJQUNqQyxDQUFDO0lBRUQ7O09BRUc7SUFDSSxLQUFLLENBQUMsUUFBUTtRQUNuQixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUUzQixNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLFlBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsNkJBQTZCLEVBQUU7WUFDakYsT0FBTyxFQUFFLElBQUksQ0FBQyxTQUFTO1lBQ3ZCLGFBQWEsRUFBRSxJQUFJLENBQUMsYUFBYSxFQUFFO1NBQ3BDLENBQUMsQ0FBQyxDQUFDO1FBRUosTUFBTSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDbEIsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUVEOzs7Ozs7OztPQVFHO0lBQ0ksS0FBSyxDQUFDLFVBQVU7UUFDckIsTUFBTSxZQUFZLEdBQUcsSUFBSSxD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QU8sQ0FBQztpQkFDN0IsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztRQUNILENBQUM7UUFBQyxPQUFPLENBQU0sRUFBRSxDQUFDO1lBQ2hCLHNEQUFzRDtZQUN0RCx3REFBd0Q7WUFDeEQsNEJBQTRCO1lBQzVCLElBQUksQ0FBQyxDQUFDLElBQUksS0FBSywyQkFBMkIsRUFBRSxDQUFDO2dCQUMzQyxPQUFPLEVBQUUsQ0FBQztZQUNaLENBQUM7WUFDRCxNQUFNLENBQUMsQ0FBQztRQUNWLENBQUM7UUFDRCx1QkFBdUIsQ0FBQyxtQkFBbUIsQ0FBQyxZQUFZLENBQUMsR0FBRyxPQUFPLEdBQUcsQ0FBQyxDQUFDO1FBQ3hFLE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7Q0FDRjtBQTNORCw4REEyTkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyB1dGlsIGZyb20gJ3V0aWwnO1xuaW1wb3J0IHR5cGUgKiBhcyBjeGFwaSBmcm9tICdAYXdzLWNkay9jeC1hcGknO1xuaW1wb3J0ICogYXMgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0ICogYXMgdXVpZCBmcm9tICd1dWlkJztcbmltcG9ydCB0eXBlIHsgQ2xvdWRXYXRjaExvZ0V2ZW50IH0gZnJvbSAnLi4vLi4vcGF5bG9hZHMvbG9ncy1tb25pdG9yJztcbmltcG9ydCB7IGZsYXR0ZW4gfSBmcm9tICcuLi8uLi91dGlsJztcbmltcG9ydCB0eXBlIHsgU0RLIH0gZnJvbSAnLi4vYXdzLWF1dGgvcHJpdmF0ZSc7XG5pbXBvcnQgeyBJTyB9IGZyb20gJy4uL2lvL3ByaXZhdGUnO1xuaW1wb3J0IHR5cGUgeyBJb0hlbHBlciB9IGZyb20gJy4uL2lvL3ByaXZhdGUnO1xuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gdHJhY2tpbmcgaW5mb3JtYXRpb24gb24gdGhlIGxvZyBncm91cHMgdGhhdCBhcmVcbiAqIGJlaW5nIG1vbml0b3JlZFxuICovXG5pbnRlcmZhY2UgTG9nR3JvdXBzQWNjZXNzU2V0dGluZ3Mge1xuICAvKipcbiAgICogVGhlIFNESyBmb3IgYSBnaXZlbiBlbnZpcm9ubWVudCAoYWNjb3VudC9yZWdpb24pXG4gICAqL1xuICByZWFkb25seSBzZGs6IFNESztcblxuICAvKipcbiAgICogQSBtYXAgb2YgbG9nIGdyb3VwcyBhbmQgYXNzb2NpYXRlZCBzdGFydFRpbWUgaW4gYSBnaXZlbiBhY2NvdW50LlxuICAgKlxuICAgKiBUaGUgbW9uaXRvciB3aWxsIHJlYWQgZXZlbnRzIGZyb20gdGhlIGxvZyBncm91cCBzdGFydGluZyBhdCB0aGVcbiAgICogYXNzb2NpYXRlZCBzdGFydFRpbWVcbiAgICovXG4gIHJlYWRvbmx5IGxvZ0dyb3Vwc1N0YXJ0VGltZXM6IHsgW2xvZ0dyb3VwTmFtZTogc3RyaW5nXTogbnVtYmVyIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2xvdWRXYXRjaExvZ0V2ZW50TW9uaXRvclByb3BzIHtcbiAgLyoqXG4gICAqIFRoZSBJb0hvc3QgdXNlZCBmb3IgbWVzc2FnaW5nXG4gICAqL1xuICByZWFkb25seSBpb0hlbHBlcjogSW9IZWxwZXI7XG5cbiAgLyoqXG4gICAqIFRoZSB0aW1lIGZyb20gd2hpY2ggd2Ugc3RhcnQgcmVhZGluZyBsb2cgbWVzc2FnZXNcbiAgICpcbiAgICogQGRlZmF1bHQgLSBub3dcbiAgICovXG4gIHJlYWRvbmx5IHN0YXJ0VGltZT86IERhdGU7XG59XG5cbmV4cG9ydCBjbGFzcyBDbG91ZFdhdGNoTG9nRXZlbnRNb25pdG9yIHtcbiAgLyoqXG4gICAqIERldGVybWluZXMgd2hpY2ggZXZlbnRzIG5vdCB0byBkaXNwbGF5XG4gICAqL1xuICBwcml2YXRlIHN0YXJ0VGltZTogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBNYXAgb2YgZW52aXJvbm1lbnQgKGFjY291bnQ6cmVnaW9uKSB0byBMb2dHcm91cHNBY2Nlc3NTZXR0aW5nc1xuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBlbnZzTG9nR3JvdXBzQWNjZXNzU2V0dGluZ3MgPSBuZXcgTWFwPHN0cmluZywgTG9nR3JvdXBzQWNjZXNzU2V0dGluZ3M+KCk7XG5cbiAgLyoqXG4gICAqIEFmdGVyIHJlYWRpbmcgZXZlbnRzIGZyb20gYWxsIENsb3VkV2F0Y2ggbG9nIGdyb3Vwc1xuICAgKiBob3cgbG9uZyBzaG91bGQgd2Ugd2FpdCB0byByZWFkIG1vcmUgZXZlbnRzLlxuICAgKlxuICAgKiBJZiB0aGVyZSBpcyBzb21lIGVycm9yIHdpdGggcmVhZGluZyBldmVudHMgKGkuZS4gVGhyb3R0bGUpXG4gICAqIHRoZW4gdGhpcyBpcyBhbHNvIGhvdyBsb25nIHdlIHdhaXQgdW50aWwgd2UgdHJ5IGFnYWluXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHBvbGxpbmdJbnRlcnZhbDogbnVtYmVyID0gMl8wMDA7XG5cbiAgcHVibGljIG1vbml0b3JJZD86IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBpb0hlbHBlcjogSW9IZWxwZXI7XG5cbiAgY29uc3RydWN0b3IocHJvcHM6IENsb3VkV2F0Y2hMb2dFdmVudE1vbml0b3JQcm9wcykge1xuICAgIHRoaXMuc3RhcnRUaW1lID0gcHJvcHMuc3RhcnRUaW1lPy5nZXRUaW1lKCkgPz8gRGF0ZS5ub3coKTtcbiAgICB0aGlzLmlvSGVscGVyID0gcHJvcHMuaW9IZWxwZXI7XG4gIH1cblxuICAvKipcbiAgICogcmVzdW1lIHJlYWRpbmcvcHJpbnRpbmcgZXZlbnRzXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgYWN0aXZhdGUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5tb25pdG9ySWQgPSB1dWlkLnY0KCk7XG5cbiAgICBhd2FpdCB0aGlzLmlvSGVscGVyLm5vdGlmeShJTy5DREtfVE9PTEtJVF9JNTAzMi5tc2coJ1N0YXJ0IG1vbml0b3JpbmcgbG9nIGdyb3VwcycsIHtcbiAgICAgIG1vbml0b3I6IHRoaXMubW9uaXRvcklkLFxuICAgICAgbG9nR3JvdXBOYW1lczogdGhpcy5sb2dHcm91cE5hbWVzKCksXG4gICAgfSkpO1xuXG4gICAgYXdhaXQgdGhpcy50aWNrKCk7XG4gICAgdGhpcy5zY2hlZHVsZU5leHRUaWNrKCk7XG4gIH1cblxuICAvKipcbiAgICogZGVhY3RpdmF0ZXMgdGhlIG1vbml0b3Igc28gbm8gbmV3IGV2ZW50cyBhcmUgcmVhZFxuICAgKiB1c2UgY2FzZSBmb3IgdGhpcyBpcyB3aGVuIHdlIGFyZSBpbiB0aGUgbWlkZGxlIG9mIHBlcmZvcm1pbmcgYSBkZXBsb3ltZW50XG4gICAqIGFuZCBkb24ndCB3YW50IHRvIGludGVyd2VhdmUgYWxsIHRoZSBsb2dzIHRvZ2V0aGVyIHdpdGggdGhlIENGTlxuICAgKiBkZXBsb3ltZW50IGxvZ3NcbiAgICpcbiAgICogQWxzbyByZXNldHMgdGhlIHN0YXJ0IHRpbWUgdG8gYmUgd2hlbiB0aGUgbmV3IGRlcGxveW1lbnQgd2FzIHRyaWdnZXJlZFxuICAgKiBhbmQgY2xlYXJzIHRoZSBsaXN0IG9mIHRyYWNrZWQgbG9nIGdyb3Vwc1xuICAgKi9cbiAgcHVibGljIGFzeW5jIGRlYWN0aXZhdGUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgb2xkTW9uaXRvcklkID0gdGhpcy5tb25pdG9ySWQhO1xuICAgIHRoaXMubW9uaXRvcklkID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcblxuICAgIGF3YWl0IHRoaXMuaW9IZWxwZXIubm90aWZ5KElPLkNES19UT09MS0lUX0k1MDM0Lm1zZygnU3RvcHBlZCBtb25pdG9yaW5nIGxvZyBncm91cHMnLCB7XG4gICAgICBtb25pdG9yOiBvbGRNb25pdG9ySWQsXG4gICAgICBsb2dHcm91cE5hbWVzOiB0aGlzLmxvZ0dyb3VwTmFtZXMoKSxcbiAgICB9KSk7XG5cbiAgICB0aGlzLmVudnNMb2dHcm91cHNBY2Nlc3NTZXR0aW5ncy5jbGVhcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgQ2xvdWRXYXRjaCBsb2cgZ3JvdXBzIHRvIHJlYWQgbG9nIGV2ZW50cyBmcm9tLlxuICAgKiBTaW5jZSB3ZSBjb3VsZCBiZSB3YXRjaGluZyBtdWx0aXBsZSBzdGFja3MgdGhhdCBkZXBsb3kgdG9cbiAgICogbXVsdGlwbGUgZW52aXJvbm1lbnRzIChhY2NvdW50K3JlZ2lvbiksIHdlIG5lZWQgdG8gc3RvcmUgYSBsaXN0IG9mIGxvZyBncm91cHNcbiAgICogcGVyIGVudiBhbG9uZyB3aXRoIHRoZSBTREsgb2JqZWN0IHRoYXQgaGFzIGFjY2VzcyB0byByZWFkIGZyb21cbiAgICogdGhhdCBlbnZpcm9ubWVudC5cbiAgICovXG4gIHB1YmxpYyBhZGRMb2dHcm91cHMoZW52OiBjeGFwaS5FbnZpcm9ubWVudCwgc2RrOiBTREssIGxvZ0dyb3VwTmFtZXM6IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgY29uc3QgYXdzRW52ID0gYCR7ZW52LmFjY291bnR9OiR7ZW52LnJlZ2lvbn1gO1xuICAgIGNvbnN0IGxvZ0dyb3Vwc1N0YXJ0VGltZXMgPSBsb2dHcm91cE5hbWVzLnJlZHVjZShcbiAgICAgIChhY2MsIGdyb3VwTmFtZSkgPT4ge1xuICAgICAgICBhY2NbZ3JvdXBOYW1lXSA9IHRoaXMuc3RhcnRUaW1lO1xuICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgfSxcbiAgICAgIHt9IGFzIHsgW2xvZ0dyb3VwTmFtZTogc3RyaW5nXTogbnVtYmVyIH0sXG4gICAgKTtcbiAgICB0aGlzLmVudnNMb2dHcm91cHNBY2Nlc3NTZXR0aW5ncy5zZXQoYXdzRW52LCB7XG4gICAgICBzZGssXG4gICAgICBsb2dHcm91cHNTdGFydFRpbWVzOiB7XG4gICAgICAgIC4uLnRoaXMuZW52c0xvZ0dyb3Vwc0FjY2Vzc1NldHRpbmdzLmdldChhd3NFbnYpPy5sb2dHcm91cHNTdGFydFRpbWVzLFxuICAgICAgICAuLi5sb2dHcm91cHNTdGFydFRpbWVzLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgbG9nR3JvdXBOYW1lcygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5lbnZzTG9nR3JvdXBzQWNjZXNzU2V0dGluZ3MudmFsdWVzKCkpLmZsYXRNYXAoKHNldHRpbmdzKSA9PiBPYmplY3Qua2V5cyhzZXR0aW5ncy5sb2dHcm91cHNTdGFydFRpbWVzKSk7XG4gIH1cblxuICBwcml2YXRlIHNjaGVkdWxlTmV4dFRpY2soKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLm1vbml0b3JJZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHNldFRpbWVvdXQoKCkgPT4gdm9pZCB0aGlzLnRpY2soKSwgdGhpcy5wb2xsaW5nSW50ZXJ2YWwpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB0aWNrKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIGV4Y2x1ZGluZyBmcm9tIGNvZGVjb3ZlcmFnZSBiZWNhdXNlIHRoaXNcbiAgICAvLyBkb2Vzbid0IGFsd2F5cyBydW4gKGRlcGVuZHMgb24gdGltaW5nKVxuICAgIC8qIGM4IGlnbm9yZSBzdGFydCAqL1xuICAgIGlmICghdGhpcy5tb25pdG9ySWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLyogYzggaWdub3JlIHN0b3AgKi9cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBldmVudHMgPSBmbGF0dGVuKGF3YWl0IHRoaXMucmVhZE5ld0V2ZW50cygpKTtcbiAgICAgIGZvciAoY29uc3QgZXZlbnQgb2YgZXZlbnRzKSB7XG4gICAgICAgIGF3YWl0IHRoaXMucHJpbnQoZXZlbnQpO1xuICAgICAgfVxuXG4gICAgICAvLyBXZSBtaWdodCBoYXZlIGJlZW4gc3RvcCgpcGVkIHdoaWxlIHRoZSBuZXR3b3JrIGNhbGwgd2FzIGluIHByb2dyZXNzLlxuICAgICAgaWYgKCF0aGlzLm1vbml0b3JJZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICBhd2FpdCB0aGlzLmlvSGVscGVyLm5vdGlmeShJTy5DREtfVE9PTEtJVF9FNTAzNS5tc2coYEVycm9yIG9jY3VycmVkIHdoaWxlIG1vbml0b3JpbmcgbG9nczogJHtTdHJpbmcoZSl9YCwgeyBlcnJvcjogZSB9KSk7XG4gICAgfVxuXG4gICAgdGhpcy5zY2hlZHVsZU5leHRUaWNrKCk7XG4gIH1cblxuICAvKipcbiAgICogUmVhZHMgYWxsIG5ldyBsb2cgZXZlbnRzIGZyb20gYSBzZXQgb2YgQ2xvdWRXYXRjaCBMb2cgR3JvdXBzXG4gICAqIGluIHBhcmFsbGVsXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJlYWROZXdFdmVudHMoKTogUHJvbWlzZTxBcnJheTxBcnJheTxDbG91ZFdhdGNoTG9nRXZlbnQ+Pj4ge1xuICAgIGNvbnN0IHByb21pc2VzOiBBcnJheTxQcm9taXNlPEFycmF5PENsb3VkV2F0Y2hMb2dFdmVudD4+PiA9IFtdO1xuICAgIGZvciAoY29uc3Qgc2V0dGluZ3Mgb2YgdGhpcy5lbnZzTG9nR3JvdXBzQWNjZXNzU2V0dGluZ3MudmFsdWVzKCkpIHtcbiAgICAgIGZvciAoY29uc3QgZ3JvdXAgb2YgT2JqZWN0LmtleXMoc2V0dGluZ3MubG9nR3JvdXBzU3RhcnRUaW1lcykpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaCh0aGlzLnJlYWRFdmVudHNGcm9tTG9nR3JvdXAoc2V0dGluZ3MsIGdyb3VwKSk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIExpbWl0ZWQgc2V0IG9mIGxvZyBncm91cHNcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGNka2xhYnMvcHJvbWlzZWFsbC1uby11bmJvdW5kZWQtcGFyYWxsZWxpc21cbiAgICByZXR1cm4gUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFByaW50IG91dCBhIGNsb3Vkd2F0Y2ggZXZlbnRcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcHJpbnQoZXZlbnQ6IENsb3VkV2F0Y2hMb2dFdmVudCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuaW9IZWxwZXIubm90aWZ5KElPLkNES19UT09MS0lUX0k1MDMzLm1zZyhcbiAgICAgIHV0aWwuZm9ybWF0KFxuICAgICAgICAnWyVzXSAlcyAlcycsXG4gICAgICAgIGNoYWxrLmJsdWUoZXZlbnQubG9nR3JvdXBOYW1lKSxcbiAgICAgICAgY2hhbGsueWVsbG93KGV2ZW50LnRpbWVzdGFtcC50b0xvY2FsZVRpbWVTdHJpbmcoKSksXG4gICAgICAgIGV2ZW50Lm1lc3NhZ2UudHJpbSgpLFxuICAgICAgKSxcbiAgICAgIGV2ZW50LFxuICAgICkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlYWRzIGFsbCBuZXcgbG9nIGV2ZW50cyBmcm9tIGEgQ2xvdWRXYXRjaCBMb2cgR3JvdXBcbiAgICogc3RhcnRpbmcgYXQgZWl0aGVyIHRoZSB0aW1lIHRoZSBob3Rzd2FwIHdhcyB0cmlnZ2VyZWQgb3JcbiAgICogd2hlbiB0aGUgbGFzdCBldmVudCB3YXMgcmVhZCBvbiB0aGUgcHJldmlvdXMgdGlja1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyByZWFkRXZlbnRzRnJvbUxvZ0dyb3VwKFxuICAgIGxvZ0dyb3Vwc0FjY2Vzc1NldHRpbmdzOiBMb2dHcm91cHNBY2Nlc3NTZXR0aW5ncyxcbiAgICBsb2dHcm91cE5hbWU6IHN0cmluZyxcbiAgKTogUHJvbWlzZTxBcnJheTxDbG91ZFdhdGNoTG9nRXZlbnQ+PiB7XG4gICAgY29uc3QgZXZlbnRzOiBDbG91ZFdhdGNoTG9nRXZlbnRbXSA9IFtdO1xuXG4gICAgLy8gbG9nIGV2ZW50cyBmcm9tIHNvbWUgc2VydmljZSBhcmUgaW5nZXN0ZWQgZmFzdGVyIHRoYW4gb3RoZXJzXG4gICAgLy8gc28gd2UgbmVlZCB0byB0cmFjayB0aGUgc3RhcnQvZW5kIHRpbWUgZm9yIGVhY2ggbG9nIGdyb3VwIGluZGl2aWR1YWxseVxuICAgIC8vIHRvIG1ha2Ugc3VyZSB0aGF0IHdlIHByb2Nlc3MgYWxsIGV2ZW50cyBmcm9tIGVhY2ggbG9nIGdyb3VwXG4gICAgY29uc3Qgc3RhcnRUaW1lID0gbG9nR3JvdXBzQWNjZXNzU2V0dGluZ3MubG9nR3JvdXBzU3RhcnRUaW1lc1tsb2dHcm91cE5hbWVdID8/IHRoaXMuc3RhcnRUaW1lO1xuICAgIGxldCBlbmRUaW1lID0gc3RhcnRUaW1lO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGxvZ0dyb3Vwc0FjY2Vzc1NldHRpbmdzLnNkay5jbG91ZFdhdGNoTG9ncygpLmZpbHRlckxvZ0V2ZW50cyh7XG4gICAgICAgIGxvZ0dyb3VwTmFtZTogbG9nR3JvdXBOYW1lLFxuICAgICAgICBsaW1pdDogMTAwLFxuICAgICAgICBzdGFydFRpbWU6IHN0YXJ0VGltZSxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZmlsdGVyZWRFdmVudHMgPSByZXNwb25zZS5ldmVudHMgPz8gW107XG5cbiAgICAgIGZvciAoY29uc3QgZXZlbnQgb2YgZmlsdGVyZWRFdmVudHMpIHtcbiAgICAgICAgaWYgKGV2ZW50Lm1lc3NhZ2UpIHtcbiAgICAgICAgICBldmVudHMucHVzaCh7XG4gICAgICAgICAgICBtZXNzYWdlOiBldmVudC5tZXNzYWdlLFxuICAgICAgICAgICAgbG9nR3JvdXBOYW1lLFxuICAgICAgICAgICAgdGltZXN0YW1wOiBldmVudC50aW1lc3RhbXAgPyBuZXcgRGF0ZShldmVudC50aW1lc3RhbXApIDogbmV3IERhdGUoKSxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGlmIChldmVudC50aW1lc3RhbXAgJiYgZW5kVGltZSA8IGV2ZW50LnRpbWVzdGFtcCkge1xuICAgICAgICAgICAgZW5kVGltZSA9IGV2ZW50LnRpbWVzdGFtcDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIEFzIGxvbmcgYXMgdGhlcmUgYXJlIF9hbnlfIGV2ZW50cyBpbiB0aGUgbG9nIGdyb3VwIGBmaWx0ZXJMb2dFdmVudHNgIHdpbGwgcmV0dXJuIGEgbmV4dFRva2VuLlxuICAgICAgLy8gVGhpcyBpcyB0cnVlIGV2ZW4gaWYgdGhlc2UgZXZlbnRzIGFyZSBiZWZvcmUgYHN0YXJ0VGltZWAuIFNvIGlmIHdlIGhhdmUgMTAwIGV2ZW50cyBhbmQgYSBuZXh0VG9rZW5cbiAgICAgIC8vIHRoZW4gYXNzdW1lIHRoYXQgd2UgaGF2ZSBoaXQgdGhlIGxpbWl0IGFuZCBsZXQgdGhlIHVzZXIga25vdyBzb21lIG1lc3NhZ2VzIGhhdmUgYmVlbiBzdXBwcmVzc2VkLlxuICAgICAgLy8gV2UgYXJlIGVzc2VudGlhbGx5IHNob3dpbmcgdGhlbSBhIHNhbXBsaW5nICgxMDAwMCBldmVudHMgcHJpbnRlZCBvdXQgaXMgbm90IHZlcnkgdXNlZnVsKVxuICAgICAgaWYgKGZpbHRlcmVkRXZlbnRzLmxlbmd0aCA9PT0gMTAwICYmIHJlc3BvbnNlLm5leHRUb2tlbikge1xuICAgICAgICBldmVudHMucHVzaCh7XG4gICAgICAgICAgbWVzc2FnZTogJz4+PiBgd2F0Y2hgIHNob3dzIG9ubHkgdGhlIGZpcnN0IDEwMCBsb2cgbWVzc2FnZXMgLSB0aGUgcmVzdCBoYXZlIGJlZW4gdHJ1bmNhdGVkLi4uJyxcbiAgICAgICAgICBsb2dHcm91cE5hbWUsXG4gICAgICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZShlbmRUaW1lKSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAvLyB3aXRoIExhbWJkYSBmdW5jdGlvbnMgdGhlIENsb3VkV2F0Y2ggaXMgbm90IGNyZWF0ZWRcbiAgICAgIC8vIHVudGlsIHNvbWV0aGluZyBpcyBsb2dnZWQsIHNvIGp1c3Qga2VlcCBwb2xsaW5nIHVudGlsXG4gICAgICAvLyB0aGVyZSBpcyBzb210aGluZyB0byBmaW5kXG4gICAgICBpZiAoZS5uYW1lID09PSAnUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gICAgbG9nR3JvdXBzQWNjZXNzU2V0dGluZ3MubG9nR3JvdXBzU3RhcnRUaW1lc1tsb2dHcm91cE5hbWVdID0gZW5kVGltZSArIDE7XG4gICAgcmV0dXJuIGV2ZW50cztcbiAgfVxufVxuIl19
@@ -0,0 +1,13 @@
1
+ import type { Notice, NoticeDataSource } from './types';
2
+ import type { IoDefaultMessages } from '../io/private';
3
+ export declare class CachedDataSource implements NoticeDataSource {
4
+ private readonly ioMessages;
5
+ private readonly fileName;
6
+ private readonly dataSource;
7
+ private readonly skipCache?;
8
+ constructor(ioMessages: IoDefaultMessages, fileName: string, dataSource: NoticeDataSource, skipCache?: boolean | undefined);
9
+ fetch(): Promise<Notice[]>;
10
+ private fetchInner;
11
+ private load;
12
+ private save;
13
+ }
@@ -0,0 +1,77 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CachedDataSource = void 0;
4
+ const fs = require("fs-extra");
5
+ const toolkit_error_1 = require("../../toolkit/toolkit-error");
6
+ const TIME_TO_LIVE_SUCCESS = 60 * 60 * 1000; // 1 hour
7
+ const TIME_TO_LIVE_ERROR = 1 * 60 * 1000; // 1 minute
8
+ class CachedDataSource {
9
+ ioMessages;
10
+ fileName;
11
+ dataSource;
12
+ skipCache;
13
+ constructor(ioMessages, fileName, dataSource, skipCache) {
14
+ this.ioMessages = ioMessages;
15
+ this.fileName = fileName;
16
+ this.dataSource = dataSource;
17
+ this.skipCache = skipCache;
18
+ }
19
+ async fetch() {
20
+ const cachedData = await this.load();
21
+ const data = cachedData.notices;
22
+ const expiration = cachedData.expiration ?? 0;
23
+ if (Date.now() > expiration || this.skipCache) {
24
+ let updatedData = cachedData;
25
+ try {
26
+ updatedData = await this.fetchInner();
27
+ }
28
+ catch (e) {
29
+ this.ioMessages.debug(`Could not refresh notices: ${e}`);
30
+ updatedData = {
31
+ expiration: Date.now() + TIME_TO_LIVE_ERROR,
32
+ notices: [],
33
+ };
34
+ throw toolkit_error_1.ToolkitError.withCause('Failed to load CDK notices. Please try again later.', e);
35
+ }
36
+ finally {
37
+ await this.save(updatedData);
38
+ }
39
+ return updatedData.notices;
40
+ }
41
+ else {
42
+ this.ioMessages.debug(`Reading cached notices from ${this.fileName}`);
43
+ return data;
44
+ }
45
+ }
46
+ async fetchInner() {
47
+ return {
48
+ expiration: Date.now() + TIME_TO_LIVE_SUCCESS,
49
+ notices: await this.dataSource.fetch(),
50
+ };
51
+ }
52
+ async load() {
53
+ const defaultValue = {
54
+ expiration: 0,
55
+ notices: [],
56
+ };
57
+ try {
58
+ return fs.existsSync(this.fileName)
59
+ ? await fs.readJSON(this.fileName)
60
+ : defaultValue;
61
+ }
62
+ catch (e) {
63
+ this.ioMessages.debug(`Failed to load notices from cache: ${e}`);
64
+ return defaultValue;
65
+ }
66
+ }
67
+ async save(cached) {
68
+ try {
69
+ await fs.writeJSON(this.fileName, cached);
70
+ }
71
+ catch (e) {
72
+ this.ioMessages.debug(`Failed to store notices in the cache: ${e}`);
73
+ }
74
+ }
75
+ }
76
+ exports.CachedDataSource = CachedDataSource;
77
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FjaGVkLWRhdGEtc291cmNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiY2FjaGVkLWRhdGEtc291cmNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLCtCQUErQjtBQUUvQiwrREFBMkQ7QUFRM0QsTUFBTSxvQkFBb0IsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLFNBQVM7QUFDdEQsTUFBTSxrQkFBa0IsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLFdBQVc7QUFFckQsTUFBYSxnQkFBZ0I7SUFFUjtJQUNBO0lBQ0E7SUFDQTtJQUpuQixZQUNtQixVQUE2QixFQUM3QixRQUFnQixFQUNoQixVQUE0QixFQUM1QixTQUFtQjtRQUhuQixlQUFVLEdBQVYsVUFBVSxDQUFtQjtRQUM3QixhQUFRLEdBQVIsUUFBUSxDQUFRO1FBQ2hCLGVBQVUsR0FBVixVQUFVLENBQWtCO1FBQzVCLGNBQVMsR0FBVCxTQUFTLENBQVU7SUFFdEMsQ0FBQztJQUVELEtBQUssQ0FBQyxLQUFLO1FBQ1QsTUFBTSxVQUFVLEdBQUcsTUFBTSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDckMsTUFBTSxJQUFJLEdBQUcsVUFBVSxDQUFDLE9BQU8sQ0FBQztRQUNoQyxNQUFNLFVBQVUsR0FBRyxVQUFVLENBQUMsVUFBVSxJQUFJLENBQUMsQ0FBQztRQUU5QyxJQUFJLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxVQUFVLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQzlDLElBQUksV0FBVyxHQUFrQixVQUFVLENBQUM7WUFFNUMsSUFBSSxDQUFDO2dCQUNILFdBQVcsR0FBRyxNQUFNLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUN4QyxDQUFDO1lBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztnQkFDWCxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyw4QkFBOEIsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDekQsV0FBVyxHQUFHO29CQUNaLFVBQVUsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsa0JBQWtCO29CQUMzQyxPQUFPLEVBQUUsRUFBRTtpQkFDWixDQUFDO2dCQUNGLE1BQU0sNEJBQVksQ0FBQyxTQUFTLENBQUMscURBQXFELEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDekYsQ0FBQztvQkFBUyxDQUFDO2dCQUNULE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUMvQixDQUFDO1lBQ0QsT0FBTyxXQUFXLENBQUMsT0FBTyxDQUFDO1FBQzdCLENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsK0JBQStCLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1lBQ3RFLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztJQUNILENBQUM7SUFFTyxLQUFLLENBQUMsVUFBVTtRQUN0QixPQUFPO1lBQ0wsVUFBVSxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxvQkFBb0I7WUFDN0MsT0FBTyxFQUFFLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUU7U0FDdkMsQ0FBQztJQUNKLENBQUM7SUFFTyxLQUFLLENBQUMsSUFBSTtRQUNoQixNQUFNLFlBQVksR0FBRztZQUNuQixVQUFVLEVBQUUsQ0FBQztZQUNiLE9BQU8sRUFBRSxFQUFFO1NBQ1osQ0FBQztRQUVGLElBQUksQ0FBQztZQUNILE9BQU8sRUFBRSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDO2dCQUNqQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQWtCO2dCQUNuRCxDQUFDLENBQUMsWUFBWSxDQUFDO1FBQ25CLENBQUM7UUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ1gsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsc0NBQXNDLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDakUsT0FBTyxZQUFZLENBQUM7UUFDdEIsQ0FBQztJQUNILENBQUM7SUFFTyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQXFCO1FBQ3RDLElBQUksQ0FBQztZQUNILE1BQU0sRUFBRSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQzVDLENBQUM7UUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ1gsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMseUNBQXlDLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDdEUsQ0FBQztJQUNILENBQUM7Q0FDRjtBQWxFRCw0Q0FrRUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBmcyBmcm9tICdmcy1leHRyYSc7XG5pbXBvcnQgdHlwZSB7IE5vdGljZSwgTm90aWNlRGF0YVNvdXJjZSB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgVG9vbGtpdEVycm9yIH0gZnJvbSAnLi4vLi4vdG9vbGtpdC90b29sa2l0LWVycm9yJztcbmltcG9ydCB0eXBlIHsgSW9EZWZhdWx0TWVzc2FnZXMgfSBmcm9tICcuLi9pby9wcml2YXRlJztcblxuaW50ZXJmYWNlIENhY2hlZE5vdGljZXMge1xuICBleHBpcmF0aW9uOiBudW1iZXI7XG4gIG5vdGljZXM6IE5vdGljZVtdO1xufVxuXG5jb25zdCBUSU1FX1RPX0xJVkVfU1VDQ0VTUyA9IDYwICogNjAgKiAxMDAwOyAvLyAxIGhvdXJcbmNvbnN0IFRJTUVfVE9fTElWRV9FUlJPUiA9IDEgKiA2MCAqIDEwMDA7IC8vIDEgbWludXRlXG5cbmV4cG9ydCBjbGFzcyBDYWNoZWREYXRhU291cmNlIGltcGxlbWVudHMgTm90aWNlRGF0YVNvdXJjZSB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgaW9NZXNzYWdlczogSW9EZWZhdWx0TWVzc2FnZXMsXG4gICAgcHJpdmF0ZSByZWFkb25seSBmaWxlTmFtZTogc3RyaW5nLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgZGF0YVNvdXJjZTogTm90aWNlRGF0YVNvdXJjZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHNraXBDYWNoZT86IGJvb2xlYW4sXG4gICkge1xuICB9XG5cbiAgYXN5bmMgZmV0Y2goKTogUHJvbWlzZTxOb3RpY2VbXT4ge1xuICAgIGNvbnN0IGNhY2hlZERhdGEgPSBhd2FpdCB0aGlzLmxvYWQoKTtcbiAgICBjb25zdCBkYXRhID0gY2FjaGVkRGF0YS5ub3RpY2VzO1xuICAgIGNvbnN0IGV4cGlyYXRpb24gPSBjYWNoZWREYXRhLmV4cGlyYXRpb24gPz8gMDtcblxuICAgIGlmIChEYXRlLm5vdygpID4gZXhwaXJhdGlvbiB8fCB0aGlzLnNraXBDYWNoZSkge1xuICAgICAgbGV0IHVwZGF0ZWREYXRhOiBDYWNoZWROb3RpY2VzID0gY2FjaGVkRGF0YTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgdXBkYXRlZERhdGEgPSBhd2FpdCB0aGlzLmZldGNoSW5uZXIoKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdGhpcy5pb01lc3NhZ2VzLmRlYnVnKGBDb3VsZCBub3QgcmVmcmVzaCBub3RpY2VzOiAke2V9YCk7XG4gICAgICAgIHVwZGF0ZWREYXRhID0ge1xuICAgICAgICAgIGV4cGlyYXRpb246IERhdGUubm93KCkgKyBUSU1FX1RPX0xJVkVfRVJST1IsXG4gICAgICAgICAgbm90aWNlczogW10sXG4gICAgICAgIH07XG4gICAgICAgIHRocm93IFRvb2xraXRFcnJvci53aXRoQ2F1c2UoJ0ZhaWxlZCB0byBsb2FkIENESyBub3RpY2VzLiBQbGVhc2UgdHJ5IGFnYWluIGxhdGVyLicsIGUpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5zYXZlKHVwZGF0ZWREYXRhKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB1cGRhdGVkRGF0YS5ub3RpY2VzO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmlvTWVzc2FnZXMuZGVidWcoYFJlYWRpbmcgY2FjaGVkIG5vdGljZXMgZnJvbSAke3RoaXMuZmlsZU5hbWV9YCk7XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGZldGNoSW5uZXIoKTogUHJvbWlzZTxDYWNoZWROb3RpY2VzPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGV4cGlyYXRpb246IERhdGUubm93KCkgKyBUSU1FX1RPX0xJVkVfU1VDQ0VTUyxcbiAgICAgIG5vdGljZXM6IGF3YWl0IHRoaXMuZGF0YVNvdXJjZS5mZXRjaCgpLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGxvYWQoKTogUHJvbWlzZTxDYWNoZWROb3RpY2VzPiB7XG4gICAgY29uc3QgZGVmYXVsdFZhbHVlID0ge1xuICAgICAgZXhwaXJhdGlvbjogMCxcbiAgICAgIG5vdGljZXM6IFtdLFxuICAgIH07XG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGZzLmV4aXN0c1N5bmModGhpcy5maWxlTmFtZSlcbiAgICAgICAgPyBhd2FpdCBmcy5yZWFkSlNPTih0aGlzLmZpbGVOYW1lKSBhcyBDYWNoZWROb3RpY2VzXG4gICAgICAgIDogZGVmYXVsdFZhbHVlO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRoaXMuaW9NZXNzYWdlcy5kZWJ1ZyhgRmFpbGVkIHRvIGxvYWQgbm90aWNlcyBmcm9tIGNhY2hlOiAke2V9YCk7XG4gICAgICByZXR1cm4gZGVmYXVsdFZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgc2F2ZShjYWNoZWQ6IENhY2hlZE5vdGljZXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgZnMud3JpdGVKU09OKHRoaXMuZmlsZU5hbWUsIGNhY2hlZCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhpcy5pb01lc3NhZ2VzLmRlYnVnKGBGYWlsZWQgdG8gc3RvcmUgbm90aWNlcyBpbiB0aGUgY2FjaGU6ICR7ZX1gKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,59 @@
1
+ import { type IoDefaultMessages } from '../io/private';
2
+ import type { BootstrappedEnvironment, Notice } from './types';
3
+ export interface NoticesFilterFilterOptions {
4
+ readonly data: Notice[];
5
+ readonly cliVersion: string;
6
+ readonly outDir: string;
7
+ readonly bootstrappedEnvironments: BootstrappedEnvironment[];
8
+ }
9
+ export declare class NoticesFilter {
10
+ private readonly ioMessages;
11
+ constructor(ioMessages: IoDefaultMessages);
12
+ filter(options: NoticesFilterFilterOptions): FilteredNotice[];
13
+ /**
14
+ * From a set of input options, return the notices components we are searching for
15
+ */
16
+ private otherComponents;
17
+ /**
18
+ * Based on a set of component names, find all notices that match one of the given components
19
+ */
20
+ private findForNamedComponents;
21
+ /**
22
+ * Whether the given "affected component" name applies to the given actual component name.
23
+ *
24
+ * The name matches if the name is exactly the same, or the name in the notice
25
+ * is a prefix of the node name when the query ends in '.'.
26
+ */
27
+ private componentNameMatches;
28
+ /**
29
+ * Adds dynamic values from the given ActualComponents
30
+ *
31
+ * If there are multiple components with the same dynamic name, they are joined
32
+ * by a comma.
33
+ */
34
+ private addDynamicValues;
35
+ /**
36
+ * Treat 'framework' as an alias for either `aws-cdk-lib.` or `@aws-cdk/core.`.
37
+ *
38
+ * Because it's EITHER `aws-cdk-lib` or `@aws-cdk/core`, we need to add multiple
39
+ * arrays at the top level.
40
+ */
41
+ private resolveAliases;
42
+ /**
43
+ * Load the construct tree from the given directory and return its components
44
+ */
45
+ private constructTreeComponents;
46
+ }
47
+ /**
48
+ * Notice after passing the filter. A filter can augment a notice with
49
+ * dynamic values as it has access to the dynamic matching data.
50
+ */
51
+ export declare class FilteredNotice {
52
+ readonly notice: Notice;
53
+ private readonly dynamicValues;
54
+ constructor(notice: Notice);
55
+ addDynamicValue(key: string, value: string): void;
56
+ format(): string;
57
+ private formatOverview;
58
+ private resolveDynamicValues;
59
+ }