@fjall/components-infrastructure 0.89.4 → 0.89.6

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 (378) hide show
  1. package/LICENSE +50 -21
  2. package/dist/index.d.ts +1 -1
  3. package/dist/index.js +1 -18
  4. package/dist/lib/app.d.ts +12 -12
  5. package/dist/lib/app.js +61 -56
  6. package/dist/lib/aspects/index.d.ts +1 -1
  7. package/dist/lib/aspects/index.js +1 -6
  8. package/dist/lib/aspects/resourceInventory.js +6 -13
  9. package/dist/lib/config/audit.js +1 -5
  10. package/dist/lib/config/aws/accessAnalyser.d.ts +11 -0
  11. package/dist/lib/config/aws/accessAnalyser.js +17 -0
  12. package/dist/lib/config/aws/accountAuditRole.js +11 -15
  13. package/dist/lib/config/aws/accountMonitoringRole.js +25 -29
  14. package/dist/lib/config/aws/alarmTopic.d.ts +8 -0
  15. package/dist/lib/config/aws/alarmTopic.js +19 -0
  16. package/dist/lib/config/aws/cloudTrail.js +4 -9
  17. package/dist/lib/config/aws/configRecorder.d.ts +16 -0
  18. package/dist/lib/config/aws/configRecorder.js +51 -0
  19. package/dist/lib/config/aws/configRulePreset.d.ts +13 -0
  20. package/dist/lib/config/aws/configRulePreset.js +62 -0
  21. package/dist/lib/config/aws/disasterRecovery.d.ts +1 -1
  22. package/dist/lib/config/aws/disasterRecovery.js +56 -73
  23. package/dist/lib/config/aws/ebsDefaultEncryption.d.ts +8 -0
  24. package/dist/lib/config/aws/ebsDefaultEncryption.js +41 -0
  25. package/dist/lib/config/aws/ecrDefaultImage.js +25 -30
  26. package/dist/lib/config/aws/eventBus.js +8 -11
  27. package/dist/lib/config/aws/guardDutyDetector.d.ts +16 -0
  28. package/dist/lib/config/aws/guardDutyDetector.js +26 -0
  29. package/dist/lib/config/aws/identityCenter.d.ts +1 -1
  30. package/dist/lib/config/aws/identityCenter.js +23 -25
  31. package/dist/lib/config/aws/identityCenterGroupMembership.js +18 -22
  32. package/dist/lib/config/aws/index.d.ts +19 -8
  33. package/dist/lib/config/aws/index.js +19 -25
  34. package/dist/lib/config/aws/inspectorEnablement.d.ts +9 -0
  35. package/dist/lib/config/aws/inspectorEnablement.js +51 -0
  36. package/dist/lib/config/aws/ipam.js +9 -13
  37. package/dist/lib/config/aws/oidcConnector.js +8 -12
  38. package/dist/lib/config/aws/platform.js +1 -5
  39. package/dist/lib/config/aws/s3BlockPublicAccess.d.ts +9 -0
  40. package/dist/lib/config/aws/s3BlockPublicAccess.js +55 -0
  41. package/dist/lib/config/aws/scpPreset.d.ts +21 -0
  42. package/dist/lib/config/aws/scpPreset.js +311 -0
  43. package/dist/lib/config/aws/securityBaseline.d.ts +15 -0
  44. package/dist/lib/config/aws/securityBaseline.js +27 -0
  45. package/dist/lib/config/aws/securityHubHub.d.ts +15 -0
  46. package/dist/lib/config/aws/securityHubHub.js +28 -0
  47. package/dist/lib/config/aws/securityServicesAdmin.d.ts +20 -0
  48. package/dist/lib/config/aws/securityServicesAdmin.js +115 -0
  49. package/dist/lib/config/index.d.ts +2 -2
  50. package/dist/lib/config/index.js +2 -21
  51. package/dist/lib/index.d.ts +4 -4
  52. package/dist/lib/index.js +5 -26
  53. package/dist/lib/patterns/aws/account.d.ts +17 -1
  54. package/dist/lib/patterns/aws/account.js +61 -33
  55. package/dist/lib/patterns/aws/apexDomainPattern.d.ts +26 -0
  56. package/dist/lib/patterns/aws/apexDomainPattern.js +91 -0
  57. package/dist/lib/patterns/aws/auditRole.js +13 -16
  58. package/dist/lib/patterns/aws/buildkite.d.ts +1 -1
  59. package/dist/lib/patterns/aws/buildkite.js +70 -75
  60. package/dist/lib/patterns/aws/cdn.d.ts +5 -5
  61. package/dist/lib/patterns/aws/cdn.js +22 -28
  62. package/dist/lib/patterns/aws/compute.d.ts +1 -1
  63. package/dist/lib/patterns/aws/compute.js +31 -44
  64. package/dist/lib/patterns/aws/computeEc2.d.ts +1 -1
  65. package/dist/lib/patterns/aws/computeEc2.js +11 -14
  66. package/dist/lib/patterns/aws/computeEcs.d.ts +18 -2
  67. package/dist/lib/patterns/aws/computeEcs.js +41 -31
  68. package/dist/lib/patterns/aws/computeLambda.d.ts +2 -2
  69. package/dist/lib/patterns/aws/computeLambda.js +24 -31
  70. package/dist/lib/patterns/aws/database.d.ts +16 -7
  71. package/dist/lib/patterns/aws/database.js +81 -73
  72. package/dist/lib/patterns/aws/delegatedDomainPattern.d.ts +17 -0
  73. package/dist/lib/patterns/aws/delegatedDomainPattern.js +54 -0
  74. package/dist/lib/patterns/aws/dnsRecordComposer.d.ts +25 -0
  75. package/dist/lib/patterns/aws/dnsRecordComposer.js +225 -0
  76. package/dist/lib/patterns/aws/domain.d.ts +32 -0
  77. package/dist/lib/patterns/aws/domain.js +115 -0
  78. package/dist/lib/patterns/aws/domainDelegation.d.ts +3 -3
  79. package/dist/lib/patterns/aws/domainDelegation.js +28 -37
  80. package/dist/lib/patterns/aws/domainFactory.d.ts +20 -5
  81. package/dist/lib/patterns/aws/domainFactory.js +48 -10
  82. package/dist/lib/patterns/aws/domainValidation.d.ts +11 -0
  83. package/dist/lib/patterns/aws/domainValidation.js +145 -0
  84. package/dist/lib/patterns/aws/externalRecordsPattern.d.ts +18 -0
  85. package/dist/lib/patterns/aws/externalRecordsPattern.js +141 -0
  86. package/dist/lib/patterns/aws/fivetranProxy.d.ts +1 -1
  87. package/dist/lib/patterns/aws/fivetranProxy.js +6 -11
  88. package/dist/lib/patterns/aws/index.d.ts +21 -19
  89. package/dist/lib/patterns/aws/index.js +25 -36
  90. package/dist/lib/patterns/aws/interfaces/cdn.js +1 -5
  91. package/dist/lib/patterns/aws/interfaces/compute.js +4 -11
  92. package/dist/lib/patterns/aws/interfaces/connector.js +1 -15
  93. package/dist/lib/patterns/aws/interfaces/database.d.ts +1 -1
  94. package/dist/lib/patterns/aws/interfaces/database.js +6 -15
  95. package/dist/lib/patterns/aws/interfaces/domain.d.ts +80 -2
  96. package/dist/lib/patterns/aws/interfaces/domain.js +1 -6
  97. package/dist/lib/patterns/aws/interfaces/index.js +8 -41
  98. package/dist/lib/patterns/aws/interfaces/messaging.js +4 -11
  99. package/dist/lib/patterns/aws/interfaces/organisation.d.ts +1 -1
  100. package/dist/lib/patterns/aws/interfaces/organisation.js +4 -11
  101. package/dist/lib/patterns/aws/interfaces/pattern.js +2 -7
  102. package/dist/lib/patterns/aws/interfaces/storage.js +1 -5
  103. package/dist/lib/patterns/aws/managedIdentityCenter.js +7 -12
  104. package/dist/lib/patterns/aws/messaging.d.ts +7 -7
  105. package/dist/lib/patterns/aws/messaging.js +22 -33
  106. package/dist/lib/patterns/aws/network.d.ts +2 -2
  107. package/dist/lib/patterns/aws/network.js +9 -14
  108. package/dist/lib/patterns/aws/organisation.d.ts +6 -2
  109. package/dist/lib/patterns/aws/organisation.js +34 -35
  110. package/dist/lib/patterns/aws/organisationFactory.d.ts +3 -3
  111. package/dist/lib/patterns/aws/organisationFactory.js +7 -12
  112. package/dist/lib/patterns/aws/pattern.js +6 -12
  113. package/dist/lib/patterns/aws/payload.js +73 -63
  114. package/dist/lib/patterns/aws/platform.d.ts +6 -3
  115. package/dist/lib/patterns/aws/platform.js +15 -15
  116. package/dist/lib/patterns/aws/storage.d.ts +6 -4
  117. package/dist/lib/patterns/aws/storage.js +35 -40
  118. package/dist/lib/patterns/aws/subdomainHostedZone.js +11 -16
  119. package/dist/lib/patterns/aws/targets/fjallTargets.d.ts +37 -0
  120. package/dist/lib/patterns/aws/targets/fjallTargets.js +66 -0
  121. package/dist/lib/patterns/aws/targets/index.d.ts +2 -0
  122. package/dist/lib/patterns/aws/targets/index.js +2 -0
  123. package/dist/lib/patterns/aws/targets/targetResolution.d.ts +76 -0
  124. package/dist/lib/patterns/aws/targets/targetResolution.js +119 -0
  125. package/dist/lib/patterns/index.d.ts +1 -0
  126. package/dist/lib/patterns/index.js +1 -0
  127. package/dist/lib/resources/aws/analytics/clickhouse.d.ts +15 -0
  128. package/dist/lib/resources/aws/analytics/clickhouse.js +292 -0
  129. package/dist/lib/resources/aws/analytics/clickhouseConstants.d.ts +73 -0
  130. package/dist/lib/resources/aws/analytics/clickhouseConstants.js +87 -0
  131. package/dist/lib/resources/aws/analytics/clickhouseSecurityGroup.d.ts +13 -0
  132. package/dist/lib/resources/aws/analytics/clickhouseSecurityGroup.js +28 -0
  133. package/dist/lib/resources/aws/analytics/clickhouseTypes.d.ts +47 -0
  134. package/dist/lib/resources/aws/analytics/clickhouseTypes.js +1 -0
  135. package/dist/lib/resources/aws/analytics/clickhouseUserData.d.ts +5 -0
  136. package/dist/lib/resources/aws/analytics/clickhouseUserData.js +248 -0
  137. package/dist/lib/resources/aws/analytics/index.d.ts +2 -0
  138. package/dist/lib/resources/aws/analytics/index.js +1 -0
  139. package/dist/lib/resources/aws/audit/auditRole.js +10 -15
  140. package/dist/lib/resources/aws/audit/index.d.ts +1 -1
  141. package/dist/lib/resources/aws/audit/index.js +1 -6
  142. package/dist/lib/resources/aws/backup/backupPlan.d.ts +1 -1
  143. package/dist/lib/resources/aws/backup/backupPlan.js +14 -16
  144. package/dist/lib/resources/aws/backup/backupVault.d.ts +1 -1
  145. package/dist/lib/resources/aws/backup/backupVault.js +13 -15
  146. package/dist/lib/resources/aws/backup/index.d.ts +2 -2
  147. package/dist/lib/resources/aws/backup/index.js +2 -19
  148. package/dist/lib/resources/aws/base/awsStack.js +17 -19
  149. package/dist/lib/resources/aws/base/index.d.ts +1 -1
  150. package/dist/lib/resources/aws/base/index.js +1 -18
  151. package/dist/lib/resources/aws/cdn/cloudFront.js +40 -42
  152. package/dist/lib/resources/aws/cdn/index.d.ts +1 -1
  153. package/dist/lib/resources/aws/cdn/index.js +1 -18
  154. package/dist/lib/resources/aws/compute/ec2.js +39 -39
  155. package/dist/lib/resources/aws/compute/ecs.d.ts +18 -396
  156. package/dist/lib/resources/aws/compute/ecs.js +105 -976
  157. package/dist/lib/resources/aws/compute/ecsCapacityProviderAspect.d.ts +22 -0
  158. package/dist/lib/resources/aws/compute/ecsCapacityProviderAspect.js +35 -0
  159. package/dist/lib/resources/aws/compute/ecsConstants.d.ts +20 -0
  160. package/dist/lib/resources/aws/compute/ecsConstants.js +49 -0
  161. package/dist/lib/resources/aws/compute/ecsContext.d.ts +12 -0
  162. package/dist/lib/resources/aws/compute/ecsContext.js +1 -0
  163. package/dist/lib/resources/aws/compute/ecsImages.d.ts +4 -0
  164. package/dist/lib/resources/aws/compute/ecsImages.js +35 -0
  165. package/dist/lib/resources/aws/compute/ecsNetworking.d.ts +28 -0
  166. package/dist/lib/resources/aws/compute/ecsNetworking.js +290 -0
  167. package/dist/lib/resources/aws/compute/ecsRoles.d.ts +15 -0
  168. package/dist/lib/resources/aws/compute/ecsRoles.js +110 -0
  169. package/dist/lib/resources/aws/compute/ecsServiceFactory.d.ts +33 -0
  170. package/dist/lib/resources/aws/compute/ecsServiceFactory.js +183 -0
  171. package/dist/lib/resources/aws/compute/ecsTaskDefinition.d.ts +30 -0
  172. package/dist/lib/resources/aws/compute/ecsTaskDefinition.js +168 -0
  173. package/dist/lib/resources/aws/compute/ecsTypes.d.ts +337 -0
  174. package/dist/lib/resources/aws/compute/ecsTypes.js +10 -0
  175. package/dist/lib/resources/aws/compute/ecsValidation.d.ts +18 -0
  176. package/dist/lib/resources/aws/compute/ecsValidation.js +72 -0
  177. package/dist/lib/resources/aws/compute/index.d.ts +3 -3
  178. package/dist/lib/resources/aws/compute/index.js +3 -20
  179. package/dist/lib/resources/aws/compute/lambda.d.ts +10 -2
  180. package/dist/lib/resources/aws/compute/lambda.js +82 -70
  181. package/dist/lib/resources/aws/database/dynamodb.js +27 -28
  182. package/dist/lib/resources/aws/database/index.d.ts +7 -7
  183. package/dist/lib/resources/aws/database/index.js +14 -33
  184. package/dist/lib/resources/aws/database/rdsAurora.d.ts +10 -2
  185. package/dist/lib/resources/aws/database/rdsAurora.js +76 -61
  186. package/dist/lib/resources/aws/database/rdsAuroraGlobal.d.ts +2 -2
  187. package/dist/lib/resources/aws/database/rdsAuroraGlobal.js +24 -21
  188. package/dist/lib/resources/aws/database/rdsDefaults.js +3 -7
  189. package/dist/lib/resources/aws/database/rdsHelpers.d.ts +2 -2
  190. package/dist/lib/resources/aws/database/rdsHelpers.js +21 -29
  191. package/dist/lib/resources/aws/database/rdsInstance.d.ts +11 -3
  192. package/dist/lib/resources/aws/database/rdsInstance.js +101 -83
  193. package/dist/lib/resources/aws/database/rdsProxyOutput.js +5 -9
  194. package/dist/lib/resources/aws/iam/delegationRole.d.ts +18 -0
  195. package/dist/lib/resources/aws/iam/delegationRole.js +60 -0
  196. package/dist/lib/resources/aws/iam/identityCenter/assignment.js +4 -9
  197. package/dist/lib/resources/aws/iam/identityCenter/group.js +5 -9
  198. package/dist/lib/resources/aws/iam/identityCenter/index.d.ts +3 -3
  199. package/dist/lib/resources/aws/iam/identityCenter/index.js +3 -20
  200. package/dist/lib/resources/aws/iam/identityCenter/permissionSet.d.ts +1 -1
  201. package/dist/lib/resources/aws/iam/identityCenter/permissionSet.js +5 -9
  202. package/dist/lib/resources/aws/iam/index.d.ts +5 -4
  203. package/dist/lib/resources/aws/iam/index.js +5 -21
  204. package/dist/lib/resources/aws/iam/instanceProfile.js +2 -7
  205. package/dist/lib/resources/aws/iam/managedPolicy.js +2 -7
  206. package/dist/lib/resources/aws/iam/policy.js +2 -7
  207. package/dist/lib/resources/aws/iam/role.js +2 -7
  208. package/dist/lib/resources/aws/index.d.ts +7 -7
  209. package/dist/lib/resources/aws/index.js +7 -24
  210. package/dist/lib/resources/aws/logging/cloudTrail.d.ts +1 -1
  211. package/dist/lib/resources/aws/logging/cloudTrail.js +18 -22
  212. package/dist/lib/resources/aws/logging/index.d.ts +2 -2
  213. package/dist/lib/resources/aws/logging/index.js +2 -19
  214. package/dist/lib/resources/aws/logging/logGroup.js +4 -10
  215. package/dist/lib/resources/aws/messaging/eventbridge.js +11 -14
  216. package/dist/lib/resources/aws/messaging/index.d.ts +4 -4
  217. package/dist/lib/resources/aws/messaging/index.js +4 -21
  218. package/dist/lib/resources/aws/messaging/sns.js +11 -14
  219. package/dist/lib/resources/aws/messaging/sqs.js +32 -34
  220. package/dist/lib/resources/aws/messaging/utils.d.ts +1 -1
  221. package/dist/lib/resources/aws/messaging/utils.js +1 -6
  222. package/dist/lib/resources/aws/monitoring/alarmDefaults.d.ts +36 -0
  223. package/dist/lib/resources/aws/monitoring/alarmDefaults.js +34 -0
  224. package/dist/lib/resources/aws/monitoring/ecsAlarms.d.ts +21 -0
  225. package/dist/lib/resources/aws/monitoring/ecsAlarms.js +88 -0
  226. package/dist/lib/resources/aws/monitoring/index.d.ts +4 -0
  227. package/dist/lib/resources/aws/monitoring/index.js +4 -5
  228. package/dist/lib/resources/aws/monitoring/lambdaAlarms.d.ts +18 -0
  229. package/dist/lib/resources/aws/monitoring/lambdaAlarms.js +44 -0
  230. package/dist/lib/resources/aws/monitoring/rdsAlarms.d.ts +20 -0
  231. package/dist/lib/resources/aws/monitoring/rdsAlarms.js +52 -0
  232. package/dist/lib/resources/aws/networking/crossAccountDelegationRecord.d.ts +17 -0
  233. package/dist/lib/resources/aws/networking/crossAccountDelegationRecord.js +26 -0
  234. package/dist/lib/resources/aws/networking/dnsRecord/aRecord.d.ts +12 -0
  235. package/dist/lib/resources/aws/networking/dnsRecord/aRecord.js +21 -0
  236. package/dist/lib/resources/aws/networking/dnsRecord/aaaaRecord.d.ts +12 -0
  237. package/dist/lib/resources/aws/networking/dnsRecord/aaaaRecord.js +22 -0
  238. package/dist/lib/resources/aws/networking/dnsRecord/aliasRecord.d.ts +12 -0
  239. package/dist/lib/resources/aws/networking/dnsRecord/aliasRecord.js +23 -0
  240. package/dist/lib/resources/aws/networking/dnsRecord/caaRecord.d.ts +17 -0
  241. package/dist/lib/resources/aws/networking/dnsRecord/caaRecord.js +21 -0
  242. package/dist/lib/resources/aws/networking/dnsRecord/cnameRecord.d.ts +12 -0
  243. package/dist/lib/resources/aws/networking/dnsRecord/cnameRecord.js +22 -0
  244. package/dist/lib/resources/aws/networking/dnsRecord/dnsRecordBase.d.ts +17 -0
  245. package/dist/lib/resources/aws/networking/dnsRecord/dnsRecordBase.js +17 -0
  246. package/dist/lib/resources/aws/networking/dnsRecord/index.d.ts +10 -0
  247. package/dist/lib/resources/aws/networking/dnsRecord/index.js +10 -0
  248. package/dist/lib/resources/aws/networking/dnsRecord/mxRecord.d.ts +16 -0
  249. package/dist/lib/resources/aws/networking/dnsRecord/mxRecord.js +21 -0
  250. package/dist/lib/resources/aws/networking/dnsRecord/nsRecord.d.ts +12 -0
  251. package/dist/lib/resources/aws/networking/dnsRecord/nsRecord.js +21 -0
  252. package/dist/lib/resources/aws/networking/dnsRecord/srvRecord.d.ts +18 -0
  253. package/dist/lib/resources/aws/networking/dnsRecord/srvRecord.js +21 -0
  254. package/dist/lib/resources/aws/networking/dnsRecord/txtRecord.d.ts +12 -0
  255. package/dist/lib/resources/aws/networking/dnsRecord/txtRecord.js +21 -0
  256. package/dist/lib/resources/aws/networking/domain.d.ts +1 -1
  257. package/dist/lib/resources/aws/networking/domain.js +32 -34
  258. package/dist/lib/resources/aws/networking/domainCertificate.d.ts +8 -3
  259. package/dist/lib/resources/aws/networking/domainCertificate.js +22 -16
  260. package/dist/lib/resources/aws/networking/hostedZone.d.ts +23 -19
  261. package/dist/lib/resources/aws/networking/hostedZone.js +70 -134
  262. package/dist/lib/resources/aws/networking/index.d.ts +8 -7
  263. package/dist/lib/resources/aws/networking/index.js +8 -24
  264. package/dist/lib/resources/aws/networking/ipam.js +2 -7
  265. package/dist/lib/resources/aws/networking/ipamPool.d.ts +1 -1
  266. package/dist/lib/resources/aws/networking/ipamPool.js +45 -55
  267. package/dist/lib/resources/aws/networking/securityGroup.js +2 -7
  268. package/dist/lib/resources/aws/networking/vpc.d.ts +1 -1
  269. package/dist/lib/resources/aws/networking/vpc.js +17 -21
  270. package/dist/lib/resources/aws/organisation/costAllocationTagActivator.d.ts +1 -1
  271. package/dist/lib/resources/aws/organisation/costAllocationTagActivator.js +11 -15
  272. package/dist/lib/resources/aws/organisation/index.d.ts +5 -5
  273. package/dist/lib/resources/aws/organisation/index.js +4 -12
  274. package/dist/lib/resources/aws/organisation/organisation.js +5 -7
  275. package/dist/lib/resources/aws/organisation/organisationAccount.js +7 -10
  276. package/dist/lib/resources/aws/organisation/organisationPolicy.js +5 -9
  277. package/dist/lib/resources/aws/organisation/organisationalUnit.js +1 -3
  278. package/dist/lib/resources/aws/secrets/alias.js +2 -7
  279. package/dist/lib/resources/aws/secrets/index.d.ts +4 -4
  280. package/dist/lib/resources/aws/secrets/index.js +4 -21
  281. package/dist/lib/resources/aws/secrets/kms.js +15 -18
  282. package/dist/lib/resources/aws/secrets/parameter.d.ts +3 -3
  283. package/dist/lib/resources/aws/secrets/parameter.js +19 -22
  284. package/dist/lib/resources/aws/secrets/secret.d.ts +2 -2
  285. package/dist/lib/resources/aws/secrets/secret.js +12 -14
  286. package/dist/lib/resources/aws/storage/ecr.d.ts +2 -2
  287. package/dist/lib/resources/aws/storage/ecr.js +7 -13
  288. package/dist/lib/resources/aws/storage/index.d.ts +2 -2
  289. package/dist/lib/resources/aws/storage/index.js +2 -19
  290. package/dist/lib/resources/aws/storage/s3.d.ts +1 -1
  291. package/dist/lib/resources/aws/storage/s3.js +24 -12
  292. package/dist/lib/resources/aws/utilities/awsCustomResource.js +3 -7
  293. package/dist/lib/resources/aws/utilities/codeBuild.js +7 -12
  294. package/dist/lib/resources/aws/utilities/customResource.js +14 -17
  295. package/dist/lib/resources/aws/utilities/customResourceProvider.js +2 -7
  296. package/dist/lib/resources/aws/utilities/index.d.ts +5 -5
  297. package/dist/lib/resources/aws/utilities/index.js +5 -22
  298. package/dist/lib/resources/aws/utilities/resourceShare.js +2 -7
  299. package/dist/lib/resources/index.d.ts +1 -1
  300. package/dist/lib/resources/index.js +1 -18
  301. package/dist/lib/types.js +1 -3
  302. package/dist/lib/utils/accountsUtils.d.ts +5 -0
  303. package/dist/lib/utils/accountsUtils.js +18 -0
  304. package/dist/lib/utils/addSuffixToEmail.js +1 -5
  305. package/dist/lib/utils/backupTierMapping.js +2 -6
  306. package/dist/lib/utils/capitaliseString.js +1 -10
  307. package/dist/lib/utils/connections.js +9 -13
  308. package/dist/lib/utils/connector.js +10 -23
  309. package/dist/lib/utils/constructMap.d.ts +33 -0
  310. package/dist/lib/utils/constructMap.js +154 -0
  311. package/dist/lib/utils/databaseTypes.js +4 -10
  312. package/dist/lib/utils/dnsRecords.d.ts +1 -1
  313. package/dist/lib/utils/dnsRecords.js +23 -27
  314. package/dist/lib/utils/domainTypes.d.ts +0 -1
  315. package/dist/lib/utils/domainTypes.js +2 -10
  316. package/dist/lib/utils/env.js +14 -26
  317. package/dist/lib/utils/getAccountId.js +3 -7
  318. package/dist/lib/utils/getAsync.js +7 -10
  319. package/dist/lib/utils/getConfig.d.ts +0 -2
  320. package/dist/lib/utils/getConfig.js +29 -47
  321. package/dist/lib/utils/getStackOutput.js +4 -8
  322. package/dist/lib/utils/index.d.ts +12 -12
  323. package/dist/lib/utils/index.js +12 -29
  324. package/dist/lib/utils/manifestWriter.d.ts +14 -3
  325. package/dist/lib/utils/manifestWriter.js +60 -43
  326. package/dist/lib/utils/orgConfigParser.d.ts +14 -0
  327. package/dist/lib/utils/orgConfigParser.js +49 -0
  328. package/dist/lib/utils/removalPolicy.js +5 -9
  329. package/dist/lib/utils/resourceNaming.js +11 -16
  330. package/dist/lib/utils/standardTagsAspect.js +9 -16
  331. package/dist/lib/utils/stripAndCamelCase.js +1 -5
  332. package/dist/lib/utils/validationLogger.js +12 -18
  333. package/dist/lib/utils/vpcUtils.js +5 -10
  334. package/package.json +25 -8
  335. package/dist/lib/config/aws/accountId.d.ts +0 -6
  336. package/dist/lib/config/aws/accountId.js +0 -32
  337. package/dist/lib/config/aws/backupGlobalSettings.d.ts +0 -29
  338. package/dist/lib/config/aws/backupGlobalSettings.js +0 -49
  339. package/dist/lib/config/aws/costAllocationTags.d.ts +0 -12
  340. package/dist/lib/config/aws/costAllocationTags.js +0 -47
  341. package/dist/lib/config/aws/ipamDelegateAdmin.d.ts +0 -8
  342. package/dist/lib/config/aws/ipamDelegateAdmin.js +0 -57
  343. package/dist/lib/config/aws/ipamPoolId.d.ts +0 -16
  344. package/dist/lib/config/aws/ipamPoolId.js +0 -42
  345. package/dist/lib/config/aws/organisation.d.ts +0 -30
  346. package/dist/lib/config/aws/organisation.js +0 -92
  347. package/dist/lib/config/aws/organisationId.d.ts +0 -7
  348. package/dist/lib/config/aws/organisationId.js +0 -45
  349. package/dist/lib/config/aws/organisationsAccess.d.ts +0 -10
  350. package/dist/lib/config/aws/organisationsAccess.js +0 -49
  351. package/dist/lib/config/aws/ramSharing.d.ts +0 -4
  352. package/dist/lib/config/aws/ramSharing.js +0 -34
  353. package/dist/lib/config/monitoring.d.ts +0 -18
  354. package/dist/lib/config/monitoring.js +0 -22
  355. package/dist/lib/patterns/aws/connections.d.ts +0 -46
  356. package/dist/lib/patterns/aws/connections.js +0 -159
  357. package/dist/lib/patterns/aws/hostedZone.d.ts +0 -28
  358. package/dist/lib/patterns/aws/hostedZone.js +0 -150
  359. package/dist/lib/patterns/aws/managedAccount.d.ts +0 -9
  360. package/dist/lib/patterns/aws/managedAccount.js +0 -55
  361. package/dist/lib/patterns/aws/managedOrganisation.d.ts +0 -36
  362. package/dist/lib/patterns/aws/managedOrganisation.js +0 -97
  363. package/dist/lib/patterns/aws/managedPlatform.d.ts +0 -12
  364. package/dist/lib/patterns/aws/managedPlatform.js +0 -29
  365. package/dist/lib/resources/aws/database/database.d.ts +0 -14
  366. package/dist/lib/resources/aws/database/database.js +0 -28
  367. package/dist/lib/resources/aws/database/databaseInstance.d.ts +0 -15
  368. package/dist/lib/resources/aws/database/databaseInstance.js +0 -30
  369. package/dist/lib/resources/aws/database/migrationLambda.d.ts +0 -80
  370. package/dist/lib/resources/aws/database/migrationLambda.js +0 -119
  371. package/dist/lib/resources/aws/iam/identityCenter/attachManagedPolicy.d.ts +0 -13
  372. package/dist/lib/resources/aws/iam/identityCenter/attachManagedPolicy.js +0 -51
  373. package/dist/lib/resources/aws/iam/securityGroup.d.ts +0 -5
  374. package/dist/lib/resources/aws/iam/securityGroup.js +0 -14
  375. package/dist/lib/resources/aws/monitoring/monitoringRole.d.ts +0 -29
  376. package/dist/lib/resources/aws/monitoring/monitoringRole.js +0 -120
  377. package/dist/lib/utils/capitalizeString.d.ts +0 -12
  378. package/dist/lib/utils/capitalizeString.js +0 -30
@@ -1,18 +1,11 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.DEFAULT_POSTGRES_ENGINE_CONFIG = void 0;
4
- exports.resolveStorageEncryptionKey = resolveStorageEncryptionKey;
5
- exports.resolvePerformanceInsightsKey = resolvePerformanceInsightsKey;
6
- exports.resolveDatabaseInsights = resolveDatabaseInsights;
7
- exports.addMultiUserSecretRotation = addMultiUserSecretRotation;
8
- const aws_cdk_lib_1 = require("aws-cdk-lib");
9
- const aws_secretsmanager_1 = require("aws-cdk-lib/aws-secretsmanager");
10
- const secrets_1 = require("../secrets");
11
- const resourceNaming_1 = require("../../../utils/resourceNaming");
12
- const rdsDefaults_1 = require("./rdsDefaults");
13
- const databaseTypes_1 = require("../../../utils/databaseTypes");
1
+ import { Duration } from "aws-cdk-lib";
2
+ import { SecretRotation, SecretRotationApplication } from "aws-cdk-lib/aws-secretsmanager";
3
+ import { CustomerManagedKey, Secret } from "../secrets/index.js";
4
+ import { ResourceNaming } from "../../../utils/resourceNaming.js";
5
+ import { RDS_DEFAULTS } from "./rdsDefaults.js";
6
+ import { isAwsManagedKey, isCMKRequested } from "../../../utils/databaseTypes.js";
14
7
  /** Default PostgreSQL engine configuration used by both Aurora and Instance constructs. */
15
- exports.DEFAULT_POSTGRES_ENGINE_CONFIG = {
8
+ export const DEFAULT_POSTGRES_ENGINE_CONFIG = {
16
9
  defaultUsername: "postgres",
17
10
  sslParameters: { "rds.force_ssl": "1" },
18
11
  rotationAppName: "SecretsManagerRDSPostgreSQLRotationMultiUser"
@@ -23,11 +16,11 @@ exports.DEFAULT_POSTGRES_ENGINE_CONFIG = {
23
16
  * - AWS managed / undefined → returns undefined (CDK default)
24
17
  * - IKey → returns the key as-is
25
18
  */
26
- function resolveStorageEncryptionKey(scope, databaseName, storageKey) {
27
- if ((0, databaseTypes_1.isCMKRequested)(storageKey)) {
28
- return new secrets_1.CustomerManagedKey(scope, `${databaseName}ClusterEncryptionKey`, { aliasName: `cmk/rds/${databaseName}/encryptionKey` }).key;
19
+ export function resolveStorageEncryptionKey(scope, databaseName, storageKey) {
20
+ if (isCMKRequested(storageKey)) {
21
+ return new CustomerManagedKey(scope, `${databaseName}ClusterEncryptionKey`, { aliasName: `cmk/rds/${databaseName}/encryptionKey` }).key;
29
22
  }
30
- if ((0, databaseTypes_1.isAwsManagedKey)(storageKey) || storageKey === undefined) {
23
+ if (isAwsManagedKey(storageKey) || storageKey === undefined) {
31
24
  return undefined;
32
25
  }
33
26
  return storageKey;
@@ -36,14 +29,14 @@ function resolveStorageEncryptionKey(scope, databaseName, storageKey) {
36
29
  * Resolve a Performance Insights encryption key spec into an IKey or undefined.
37
30
  * Only creates a CMK when PI is enabled and CMK is requested.
38
31
  */
39
- function resolvePerformanceInsightsKey(scope, databaseName, piEnabled, encryptionKey) {
40
- if (piEnabled && (0, databaseTypes_1.isCMKRequested)(encryptionKey)) {
41
- return new secrets_1.CustomerManagedKey(scope, `${databaseName}PerformanceInsightsKey`, { aliasName: `cmk/rds/${databaseName}/InsightsKey` }).key;
32
+ export function resolvePerformanceInsightsKey(scope, databaseName, piEnabled, encryptionKey) {
33
+ if (piEnabled && isCMKRequested(encryptionKey)) {
34
+ return new CustomerManagedKey(scope, `${databaseName}PerformanceInsightsKey`, { aliasName: `cmk/rds/${databaseName}/InsightsKey` }).key;
42
35
  }
43
36
  return undefined;
44
37
  }
45
38
  /** Resolve the databaseInsights prop into an enabled flag and optional config object. */
46
- function resolveDatabaseInsights(databaseInsights) {
39
+ export function resolveDatabaseInsights(databaseInsights) {
47
40
  const piEnabled = databaseInsights !== false;
48
41
  const piConfig = piEnabled && typeof databaseInsights === "object"
49
42
  ? databaseInsights
@@ -54,16 +47,16 @@ function resolveDatabaseInsights(databaseInsights) {
54
47
  * Add multi-user secret rotation to a database construct.
55
48
  * Shared between RdsAurora and RdsInstance.
56
49
  */
57
- function addMultiUserSecretRotation(params) {
50
+ export function addMultiUserSecretRotation(params) {
58
51
  const rotationConfig = params.credentialsConfig?.secretRotation;
59
52
  const rotationPeriod = (typeof rotationConfig === "object" &&
60
53
  rotationConfig?.automaticallyAfter) ||
61
- aws_cdk_lib_1.Duration.days(30);
62
- const masterSecret = new secrets_1.Secret(params.scope, `${params.databaseName}MasterSecret`, {
63
- secretName: resourceNaming_1.ResourceNaming.masterSecretName(params.constructId)
54
+ Duration.days(30);
55
+ const masterSecret = new Secret(params.scope, `${params.databaseName}MasterSecret`, {
56
+ secretName: ResourceNaming.masterSecretName(params.constructId)
64
57
  });
65
- new aws_secretsmanager_1.SecretRotation(params.scope, `${params.databaseName}SecretRotation`, {
66
- application: new aws_secretsmanager_1.SecretRotationApplication(params.engineConfig.rotationAppName, rdsDefaults_1.RDS_DEFAULTS.ROTATION_APP_VERSION, { isMultiUser: true }),
58
+ new SecretRotation(params.scope, `${params.databaseName}SecretRotation`, {
59
+ application: new SecretRotationApplication(params.engineConfig.rotationAppName, RDS_DEFAULTS.ROTATION_APP_VERSION, { isMultiUser: true }),
67
60
  secret: params.databaseSecret,
68
61
  masterSecret: masterSecret.secret,
69
62
  target: params.target,
@@ -72,4 +65,3 @@ function addMultiUserSecretRotation(params) {
72
65
  });
73
66
  return masterSecret;
74
67
  }
75
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmRzSGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYi9yZXNvdXJjZXMvYXdzL2RhdGFiYXNlL3Jkc0hlbHBlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBa0NBLGtFQWdCQztBQU1ELHNFQWNDO0FBR0QsMERBWUM7QUFNRCxnRUFzQ0M7QUFqSUQsNkNBQXVDO0FBSXZDLHVFQUd3QztBQUV4Qyx3Q0FBd0Q7QUFDeEQsa0VBQStEO0FBQy9ELCtDQUE2QztBQUM3QyxnRUFPc0M7QUFFdEMsMkZBQTJGO0FBQzlFLFFBQUEsOEJBQThCLEdBQWlCO0lBQzFELGVBQWUsRUFBRSxVQUFVO0lBQzNCLGFBQWEsRUFBRSxFQUFFLGVBQWUsRUFBRSxHQUFHLEVBQUU7SUFDdkMsZUFBZSxFQUFFLDhDQUE4QztDQUNoRSxDQUFDO0FBRUY7Ozs7O0dBS0c7QUFDSCxTQUFnQiwyQkFBMkIsQ0FDekMsS0FBZ0IsRUFDaEIsWUFBZ0MsRUFDaEMsVUFBeUM7SUFFekMsSUFBSSxJQUFBLDhCQUFjLEVBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztRQUMvQixPQUFPLElBQUksNEJBQWtCLENBQzNCLEtBQUssRUFDTCxHQUFHLFlBQVksc0JBQXNCLEVBQ3JDLEVBQUUsU0FBUyxFQUFFLFdBQVcsWUFBWSxnQkFBZ0IsRUFBRSxDQUN2RCxDQUFDLEdBQUcsQ0FBQztJQUNSLENBQUM7SUFDRCxJQUFJLElBQUEsK0JBQWUsRUFBQyxVQUFVLENBQUMsSUFBSSxVQUFVLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDNUQsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUNELE9BQU8sVUFBVSxDQUFDO0FBQ3BCLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxTQUFnQiw2QkFBNkIsQ0FDM0MsS0FBZ0IsRUFDaEIsWUFBZ0MsRUFDaEMsU0FBa0IsRUFDbEIsYUFBNEM7SUFFNUMsSUFBSSxTQUFTLElBQUksSUFBQSw4QkFBYyxFQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUM7UUFDL0MsT0FBTyxJQUFJLDRCQUFrQixDQUMzQixLQUFLLEVBQ0wsR0FBRyxZQUFZLHdCQUF3QixFQUN2QyxFQUFFLFNBQVMsRUFBRSxXQUFXLFlBQVksY0FBYyxFQUFFLENBQ3JELENBQUMsR0FBRyxDQUFDO0lBQ1IsQ0FBQztJQUNELE9BQU8sU0FBUyxDQUFDO0FBQ25CLENBQUM7QUFFRCx5RkFBeUY7QUFDekYsU0FBZ0IsdUJBQXVCLENBQ3JDLGdCQUE0RDtJQUs1RCxNQUFNLFNBQVMsR0FBRyxnQkFBZ0IsS0FBSyxLQUFLLENBQUM7SUFDN0MsTUFBTSxRQUFRLEdBQ1osU0FBUyxJQUFJLE9BQU8sZ0JBQWdCLEtBQUssUUFBUTtRQUMvQyxDQUFDLENBQUMsZ0JBQWdCO1FBQ2xCLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDaEIsT0FBTyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsQ0FBQztBQUNqQyxDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsU0FBZ0IsMEJBQTBCLENBQUMsTUFTMUM7SUFDQyxNQUFNLGNBQWMsR0FBRyxNQUFNLENBQUMsaUJBQWlCLEVBQUUsY0FBYyxDQUFDO0lBQ2hFLE1BQU0sY0FBYyxHQUNsQixDQUFDLE9BQU8sY0FBYyxLQUFLLFFBQVE7UUFDakMsY0FBYyxFQUFFLGtCQUFrQixDQUFDO1FBQ3JDLHNCQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBRXBCLE1BQU0sWUFBWSxHQUFHLElBQUksZ0JBQU0sQ0FDN0IsTUFBTSxDQUFDLEtBQUssRUFDWixHQUFHLE1BQU0sQ0FBQyxZQUFZLGNBQWMsRUFDcEM7UUFDRSxVQUFVLEVBQUUsK0JBQWMsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDO0tBQ2hFLENBQ0YsQ0FBQztJQUVGLElBQUksbUNBQWMsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLEdBQUcsTUFBTSxDQUFDLFlBQVksZ0JBQWdCLEVBQUU7UUFDdkUsV0FBVyxFQUFFLElBQUksOENBQXlCLENBQ3hDLE1BQU0sQ0FBQyxZQUFZLENBQUMsZUFBZSxFQUNuQywwQkFBWSxDQUFDLG9CQUFvQixFQUNqQyxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsQ0FDdEI7UUFDRCxNQUFNLEVBQUUsTUFBTSxDQUFDLGNBQWM7UUFDN0IsWUFBWSxFQUFFLFlBQVksQ0FBQyxNQUFNO1FBQ2pDLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTTtRQUNyQixHQUFHLEVBQUUsTUFBTSxDQUFDLEdBQUc7UUFDZixrQkFBa0IsRUFBRSxjQUFjO0tBQ25DLENBQUMsQ0FBQztJQUVILE9BQU8sWUFBWSxDQUFDO0FBQ3RCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEdXJhdGlvbiB9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuaW1wb3J0IHsgdHlwZSBJS2V5IH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1rbXNcIjtcbmltcG9ydCB7IHR5cGUgSVZwYywgdHlwZSBJQ29ubmVjdGFibGUgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWVjMlwiO1xuaW1wb3J0IHsgdHlwZSBJU2VjcmV0IH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1zZWNyZXRzbWFuYWdlclwiO1xuaW1wb3J0IHtcbiAgU2VjcmV0Um90YXRpb24sXG4gIFNlY3JldFJvdGF0aW9uQXBwbGljYXRpb25cbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1zZWNyZXRzbWFuYWdlclwiO1xuaW1wb3J0IHR5cGUgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuaW1wb3J0IHsgQ3VzdG9tZXJNYW5hZ2VkS2V5LCBTZWNyZXQgfSBmcm9tIFwiLi4vc2VjcmV0c1wiO1xuaW1wb3J0IHsgUmVzb3VyY2VOYW1pbmcgfSBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvcmVzb3VyY2VOYW1pbmdcIjtcbmltcG9ydCB7IFJEU19ERUZBVUxUUyB9IGZyb20gXCIuL3Jkc0RlZmF1bHRzXCI7XG5pbXBvcnQge1xuICB0eXBlIERhdGFiYXNlSW5zaWdodHNDb25maWcsXG4gIHR5cGUgRW5naW5lQ29uZmlnLFxuICB0eXBlIEVuY3J5cHRpb25LZXlTcGVjLFxuICB0eXBlIENyZWRlbnRpYWxzQ29uZmlnLFxuICBpc0F3c01hbmFnZWRLZXksXG4gIGlzQ01LUmVxdWVzdGVkXG59IGZyb20gXCIuLi8uLi8uLi91dGlscy9kYXRhYmFzZVR5cGVzXCI7XG5cbi8qKiBEZWZhdWx0IFBvc3RncmVTUUwgZW5naW5lIGNvbmZpZ3VyYXRpb24gdXNlZCBieSBib3RoIEF1cm9yYSBhbmQgSW5zdGFuY2UgY29uc3RydWN0cy4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX1BPU1RHUkVTX0VOR0lORV9DT05GSUc6IEVuZ2luZUNvbmZpZyA9IHtcbiAgZGVmYXVsdFVzZXJuYW1lOiBcInBvc3RncmVzXCIsXG4gIHNzbFBhcmFtZXRlcnM6IHsgXCJyZHMuZm9yY2Vfc3NsXCI6IFwiMVwiIH0sXG4gIHJvdGF0aW9uQXBwTmFtZTogXCJTZWNyZXRzTWFuYWdlclJEU1Bvc3RncmVTUUxSb3RhdGlvbk11bHRpVXNlclwiXG59O1xuXG4vKipcbiAqIFJlc29sdmUgYSBzdG9yYWdlIGVuY3J5cHRpb24ga2V5IHNwZWMgaW50byBhbiBJS2V5IG9yIHVuZGVmaW5lZC5cbiAqIC0gQ01LIG1hcmtlciDihpIgY3JlYXRlcyBhIG5ldyBDdXN0b21lck1hbmFnZWRLZXlcbiAqIC0gQVdTIG1hbmFnZWQgLyB1bmRlZmluZWQg4oaSIHJldHVybnMgdW5kZWZpbmVkIChDREsgZGVmYXVsdClcbiAqIC0gSUtleSDihpIgcmV0dXJucyB0aGUga2V5IGFzLWlzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlU3RvcmFnZUVuY3J5cHRpb25LZXkoXG4gIHNjb3BlOiBDb25zdHJ1Y3QsXG4gIGRhdGFiYXNlTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBzdG9yYWdlS2V5OiBFbmNyeXB0aW9uS2V5U3BlYyB8IHVuZGVmaW5lZFxuKTogSUtleSB8IHVuZGVmaW5lZCB7XG4gIGlmIChpc0NNS1JlcXVlc3RlZChzdG9yYWdlS2V5KSkge1xuICAgIHJldHVybiBuZXcgQ3VzdG9tZXJNYW5hZ2VkS2V5KFxuICAgICAgc2NvcGUsXG4gICAgICBgJHtkYXRhYmFzZU5hbWV9Q2x1c3RlckVuY3J5cHRpb25LZXlgLFxuICAgICAgeyBhbGlhc05hbWU6IGBjbWsvcmRzLyR7ZGF0YWJhc2VOYW1lfS9lbmNyeXB0aW9uS2V5YCB9XG4gICAgKS5rZXk7XG4gIH1cbiAgaWYgKGlzQXdzTWFuYWdlZEtleShzdG9yYWdlS2V5KSB8fCBzdG9yYWdlS2V5ID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIHJldHVybiBzdG9yYWdlS2V5O1xufVxuXG4vKipcbiAqIFJlc29sdmUgYSBQZXJmb3JtYW5jZSBJbnNpZ2h0cyBlbmNyeXB0aW9uIGtleSBzcGVjIGludG8gYW4gSUtleSBvciB1bmRlZmluZWQuXG4gKiBPbmx5IGNyZWF0ZXMgYSBDTUsgd2hlbiBQSSBpcyBlbmFibGVkIGFuZCBDTUsgaXMgcmVxdWVzdGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVBlcmZvcm1hbmNlSW5zaWdodHNLZXkoXG4gIHNjb3BlOiBDb25zdHJ1Y3QsXG4gIGRhdGFiYXNlTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBwaUVuYWJsZWQ6IGJvb2xlYW4sXG4gIGVuY3J5cHRpb25LZXk6IEVuY3J5cHRpb25LZXlTcGVjIHwgdW5kZWZpbmVkXG4pOiBJS2V5IHwgdW5kZWZpbmVkIHtcbiAgaWYgKHBpRW5hYmxlZCAmJiBpc0NNS1JlcXVlc3RlZChlbmNyeXB0aW9uS2V5KSkge1xuICAgIHJldHVybiBuZXcgQ3VzdG9tZXJNYW5hZ2VkS2V5KFxuICAgICAgc2NvcGUsXG4gICAgICBgJHtkYXRhYmFzZU5hbWV9UGVyZm9ybWFuY2VJbnNpZ2h0c0tleWAsXG4gICAgICB7IGFsaWFzTmFtZTogYGNtay9yZHMvJHtkYXRhYmFzZU5hbWV9L0luc2lnaHRzS2V5YCB9XG4gICAgKS5rZXk7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqIFJlc29sdmUgdGhlIGRhdGFiYXNlSW5zaWdodHMgcHJvcCBpbnRvIGFuIGVuYWJsZWQgZmxhZyBhbmQgb3B0aW9uYWwgY29uZmlnIG9iamVjdC4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlRGF0YWJhc2VJbnNpZ2h0cyhcbiAgZGF0YWJhc2VJbnNpZ2h0czogRGF0YWJhc2VJbnNpZ2h0c0NvbmZpZyB8IGZhbHNlIHwgdW5kZWZpbmVkXG4pOiB7XG4gIHBpRW5hYmxlZDogYm9vbGVhbjtcbiAgcGlDb25maWc6IERhdGFiYXNlSW5zaWdodHNDb25maWcgfCB1bmRlZmluZWQ7XG59IHtcbiAgY29uc3QgcGlFbmFibGVkID0gZGF0YWJhc2VJbnNpZ2h0cyAhPT0gZmFsc2U7XG4gIGNvbnN0IHBpQ29uZmlnID1cbiAgICBwaUVuYWJsZWQgJiYgdHlwZW9mIGRhdGFiYXNlSW5zaWdodHMgPT09IFwib2JqZWN0XCJcbiAgICAgID8gZGF0YWJhc2VJbnNpZ2h0c1xuICAgICAgOiB1bmRlZmluZWQ7XG4gIHJldHVybiB7IHBpRW5hYmxlZCwgcGlDb25maWcgfTtcbn1cblxuLyoqXG4gKiBBZGQgbXVsdGktdXNlciBzZWNyZXQgcm90YXRpb24gdG8gYSBkYXRhYmFzZSBjb25zdHJ1Y3QuXG4gKiBTaGFyZWQgYmV0d2VlbiBSZHNBdXJvcmEgYW5kIFJkc0luc3RhbmNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYWRkTXVsdGlVc2VyU2VjcmV0Um90YXRpb24ocGFyYW1zOiB7XG4gIHNjb3BlOiBDb25zdHJ1Y3Q7XG4gIGRhdGFiYXNlTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBjb25zdHJ1Y3RJZDogc3RyaW5nO1xuICBlbmdpbmVDb25maWc6IEVuZ2luZUNvbmZpZztcbiAgY3JlZGVudGlhbHNDb25maWc6IENyZWRlbnRpYWxzQ29uZmlnIHwgdW5kZWZpbmVkO1xuICBkYXRhYmFzZVNlY3JldDogSVNlY3JldDtcbiAgdGFyZ2V0OiBJQ29ubmVjdGFibGU7XG4gIHZwYzogSVZwYztcbn0pOiBTZWNyZXQge1xuICBjb25zdCByb3RhdGlvbkNvbmZpZyA9IHBhcmFtcy5jcmVkZW50aWFsc0NvbmZpZz8uc2VjcmV0Um90YXRpb247XG4gIGNvbnN0IHJvdGF0aW9uUGVyaW9kID1cbiAgICAodHlwZW9mIHJvdGF0aW9uQ29uZmlnID09PSBcIm9iamVjdFwiICYmXG4gICAgICByb3RhdGlvbkNvbmZpZz8uYXV0b21hdGljYWxseUFmdGVyKSB8fFxuICAgIER1cmF0aW9uLmRheXMoMzApO1xuXG4gIGNvbnN0IG1hc3RlclNlY3JldCA9IG5ldyBTZWNyZXQoXG4gICAgcGFyYW1zLnNjb3BlLFxuICAgIGAke3BhcmFtcy5kYXRhYmFzZU5hbWV9TWFzdGVyU2VjcmV0YCxcbiAgICB7XG4gICAgICBzZWNyZXROYW1lOiBSZXNvdXJjZU5hbWluZy5tYXN0ZXJTZWNyZXROYW1lKHBhcmFtcy5jb25zdHJ1Y3RJZClcbiAgICB9XG4gICk7XG5cbiAgbmV3IFNlY3JldFJvdGF0aW9uKHBhcmFtcy5zY29wZSwgYCR7cGFyYW1zLmRhdGFiYXNlTmFtZX1TZWNyZXRSb3RhdGlvbmAsIHtcbiAgICBhcHBsaWNhdGlvbjogbmV3IFNlY3JldFJvdGF0aW9uQXBwbGljYXRpb24oXG4gICAgICBwYXJhbXMuZW5naW5lQ29uZmlnLnJvdGF0aW9uQXBwTmFtZSxcbiAgICAgIFJEU19ERUZBVUxUUy5ST1RBVElPTl9BUFBfVkVSU0lPTixcbiAgICAgIHsgaXNNdWx0aVVzZXI6IHRydWUgfVxuICAgICksXG4gICAgc2VjcmV0OiBwYXJhbXMuZGF0YWJhc2VTZWNyZXQsXG4gICAgbWFzdGVyU2VjcmV0OiBtYXN0ZXJTZWNyZXQuc2VjcmV0LFxuICAgIHRhcmdldDogcGFyYW1zLnRhcmdldCxcbiAgICB2cGM6IHBhcmFtcy52cGMsXG4gICAgYXV0b21hdGljYWxseUFmdGVyOiByb3RhdGlvblBlcmlvZFxuICB9KTtcblxuICByZXR1cm4gbWFzdGVyU2VjcmV0O1xufVxuIl19
@@ -3,9 +3,11 @@ import { Connections, type IConnectable, type IVpc } from "aws-cdk-lib/aws-ec2";
3
3
  import { type IInstanceEngine } from "aws-cdk-lib/aws-rds";
4
4
  import { Construct } from "constructs";
5
5
  import { SecurityGroup } from "../networking/securityGroup.js";
6
- import { Secret } from "../secrets";
7
- import { type StackBuilder } from "../base/awsStack";
8
- import { type EngineConfig, type ProxyConfig, type ReadReplicaConfig, type CredentialsConfig, type EncryptionConfig, type DatabaseInsightsConfig } from "../../../utils/databaseTypes";
6
+ import { Secret } from "../secrets/index.js";
7
+ import { type StackBuilder } from "../base/awsStack.js";
8
+ import { type EngineConfig, type ProxyConfig, type ReadReplicaConfig, type CredentialsConfig, type EncryptionConfig, type DatabaseInsightsConfig } from "../../../utils/databaseTypes.js";
9
+ import type { ITopic } from "aws-cdk-lib/aws-sns";
10
+ import { type RdsAlarmThresholds } from "../monitoring/index.js";
9
11
  interface RdsProps {
10
12
  vpc: IVpc;
11
13
  databaseName?: string;
@@ -33,6 +35,12 @@ interface RdsProps {
33
35
  snapshotIdentifier?: string;
34
36
  /** Username from the snapshot (required when restoring from snapshot to reset password) */
35
37
  snapshotUsername?: string;
38
+ /** SNS topic for alarm notifications. Required for alarm creation. */
39
+ alertsTopic?: ITopic;
40
+ /** Alarm thresholds. false to disable, undefined for defaults, object to override. */
41
+ alarms?: RdsAlarmThresholds | false;
42
+ /** Application ID for alarm tagging. */
43
+ applicationId?: string;
36
44
  }
37
45
  export declare class RdsInstance extends Construct implements IConnectable {
38
46
  connections: Connections;
@@ -1,29 +1,39 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.RdsInstance = void 0;
4
- const aws_cdk_lib_1 = require("aws-cdk-lib");
5
- const aws_ec2_1 = require("aws-cdk-lib/aws-ec2");
6
- const aws_rds_1 = require("aws-cdk-lib/aws-rds");
7
- const aws_lambda_1 = require("aws-cdk-lib/aws-lambda");
8
- const aws_iam_1 = require("aws-cdk-lib/aws-iam");
9
- const constructs_1 = require("constructs");
10
- const securityGroup_js_1 = require("../networking/securityGroup.js");
11
- const secrets_1 = require("../secrets");
12
- const customResource_1 = require("../utilities/customResource");
13
- const _1 = require("./");
14
- const rdsDefaults_1 = require("./rdsDefaults");
15
- const rdsHelpers_1 = require("./rdsHelpers");
16
- const databaseTypes_1 = require("../../../utils/databaseTypes");
17
- const resourceNaming_1 = require("../../../utils/resourceNaming");
18
- const rdsProxyOutput_1 = require("./rdsProxyOutput");
19
- class RdsInstance extends constructs_1.Construct {
1
+ import { Duration, RemovalPolicy } from "aws-cdk-lib";
2
+ import { Connections, InstanceType, Port, SubnetType } from "aws-cdk-lib/aws-ec2";
3
+ import { CaCertificate, Credentials, DatabaseInstance, DatabaseInstanceFromSnapshot, DatabaseInstanceEngine, DatabaseInstanceReadReplica, DatabaseProxy, ParameterGroup, PostgresEngineVersion, ProxyTarget, SnapshotCredentials, StorageType } from "aws-cdk-lib/aws-rds";
4
+ import { Runtime } from "aws-cdk-lib/aws-lambda";
5
+ import { PolicyStatement, Effect } from "aws-cdk-lib/aws-iam";
6
+ import { Construct } from "constructs";
7
+ import { SecurityGroup } from "../networking/securityGroup.js";
8
+ import { CustomerManagedKey, Secret } from "../secrets/index.js";
9
+ import { CustomResource } from "../utilities/customResource.js";
10
+ import { getDatabaseInsightsRetention } from "./index.js";
11
+ import { RDS_DEFAULTS } from "./rdsDefaults.js";
12
+ import { DEFAULT_POSTGRES_ENGINE_CONFIG, resolveDatabaseInsights, resolveStorageEncryptionKey, resolvePerformanceInsightsKey, addMultiUserSecretRotation } from "./rdsHelpers.js";
13
+ import { isCMKRequested } from "../../../utils/databaseTypes.js";
14
+ import { ResourceNaming } from "../../../utils/resourceNaming.js";
15
+ import { addProxyCfnOutput } from "./rdsProxyOutput.js";
16
+ import { createRdsAlarms } from "../monitoring/index.js";
17
+ export class RdsInstance extends Construct {
18
+ connections;
19
+ databaseSecurityGroup;
20
+ vpc;
21
+ port;
22
+ engineConfig;
23
+ databaseCredentials;
24
+ database;
25
+ masterSecret;
26
+ databaseProxy;
27
+ databaseProxySecurityGroup;
28
+ readReplicaSecurityGroup;
29
+ constructId;
20
30
  constructor(scope, id, props) {
21
31
  super(scope, id);
22
32
  this.constructId = id;
23
- this.port = props.port || rdsDefaults_1.RDS_DEFAULTS.DEFAULT_PORT;
33
+ this.port = props.port || RDS_DEFAULTS.DEFAULT_PORT;
24
34
  this.vpc = props.vpc;
25
35
  // PostgreSQL fallback for direct usage - ensure engine and engineConfig match
26
- this.engineConfig = props.engineConfig ?? rdsHelpers_1.DEFAULT_POSTGRES_ENGINE_CONFIG;
36
+ this.engineConfig = props.engineConfig ?? DEFAULT_POSTGRES_ENGINE_CONFIG;
27
37
  this.addDatabase(props);
28
38
  // Secret rotation enabled by default (opt-out with secretRotation: false)
29
39
  const secretRotationDisabled = props.credentials?.secretRotation === false;
@@ -36,14 +46,24 @@ class RdsInstance extends constructs_1.Construct {
36
46
  if (props.readReplica !== undefined && props.readReplica !== false) {
37
47
  this.addReadReplica(props);
38
48
  }
49
+ if (props.alertsTopic && props.alarms !== false) {
50
+ createRdsAlarms({
51
+ scope: this,
52
+ databaseName: this.constructId,
53
+ database: this.database,
54
+ config: typeof props.alarms === "object" ? props.alarms : {},
55
+ alarmTopic: props.alertsTopic,
56
+ applicationId: props.applicationId
57
+ });
58
+ }
39
59
  }
40
60
  addDatabase(props) {
41
61
  // Username priority: snapshotUsername > credentials.username > engine default
42
62
  const username = props.snapshotIdentifier && props.snapshotUsername
43
63
  ? props.snapshotUsername
44
64
  : (props.credentials?.username ?? this.engineConfig.defaultUsername);
45
- this.databaseCredentials = new secrets_1.Secret(this, `${props.databaseName}Credentials`, {
46
- secretName: resourceNaming_1.ResourceNaming.credentialsSecretName(this.constructId),
65
+ this.databaseCredentials = new Secret(this, `${props.databaseName}Credentials`, {
66
+ secretName: ResourceNaming.credentialsSecretName(this.constructId),
47
67
  generateSecretString: {
48
68
  secretStringTemplate: JSON.stringify({
49
69
  username
@@ -53,36 +73,36 @@ class RdsInstance extends constructs_1.Construct {
53
73
  generateStringKey: "password"
54
74
  }
55
75
  });
56
- this.databaseSecurityGroup = new securityGroup_js_1.SecurityGroup(this, `${props.databaseName}SecurityGroup`, {
76
+ this.databaseSecurityGroup = new SecurityGroup(this, `${props.databaseName}SecurityGroup`, {
57
77
  vpc: this.vpc,
58
78
  description: `Security group for RDS database instance ${props.databaseName}`
59
79
  });
60
80
  // Self-referencing rule for multi-AZ communication
61
- this.databaseSecurityGroup.addIngressRule(this.databaseSecurityGroup, aws_ec2_1.Port.tcp(this.port));
62
- this.connections = new aws_ec2_1.Connections({
81
+ this.databaseSecurityGroup.addIngressRule(this.databaseSecurityGroup, Port.tcp(this.port));
82
+ this.connections = new Connections({
63
83
  securityGroups: [this.databaseSecurityGroup],
64
- defaultPort: aws_ec2_1.Port.tcp(this.port)
84
+ defaultPort: Port.tcp(this.port)
65
85
  });
66
- const storageEncryptionKey = (0, rdsHelpers_1.resolveStorageEncryptionKey)(this, props.databaseName, props.encryption?.storageKey);
67
- const { piEnabled, piConfig } = (0, rdsHelpers_1.resolveDatabaseInsights)(props.databaseInsights);
68
- const performanceInsightsEncryptionKey = (0, rdsHelpers_1.resolvePerformanceInsightsKey)(this, props.databaseName, piEnabled, piConfig?.encryptionKey);
86
+ const storageEncryptionKey = resolveStorageEncryptionKey(this, props.databaseName, props.encryption?.storageKey);
87
+ const { piEnabled, piConfig } = resolveDatabaseInsights(props.databaseInsights);
88
+ const performanceInsightsEncryptionKey = resolvePerformanceInsightsKey(this, props.databaseName, piEnabled, piConfig?.encryptionKey);
69
89
  const diMode = piConfig?.mode ?? "standard";
70
90
  const performanceInsightsRetention = piEnabled
71
- ? (0, _1.getDatabaseInsightsRetention)(diMode)
91
+ ? getDatabaseInsightsRetention(diMode)
72
92
  : undefined;
73
93
  const engine = props.engine ||
74
- aws_rds_1.DatabaseInstanceEngine.postgres({
75
- version: aws_rds_1.PostgresEngineVersion.VER_17_5
94
+ DatabaseInstanceEngine.postgres({
95
+ version: PostgresEngineVersion.VER_17_5
76
96
  });
77
- const parameterGroup = new aws_rds_1.ParameterGroup(this, `${props.databaseName}ParameterGroup`, {
97
+ const parameterGroup = new ParameterGroup(this, `${props.databaseName}ParameterGroup`, {
78
98
  engine,
79
99
  description: `Parameter group for ${props.databaseName} with security defaults`,
80
100
  parameters: this.engineConfig.sslParameters
81
101
  });
82
102
  // Use PUBLIC subnet for publiclyAccessible databases (e.g., tinkerer tier without NAT)
83
103
  const subnetType = props.publiclyAccessible
84
- ? aws_ec2_1.SubnetType.PUBLIC
85
- : aws_ec2_1.SubnetType.PRIVATE_WITH_EGRESS;
104
+ ? SubnetType.PUBLIC
105
+ : SubnetType.PRIVATE_WITH_EGRESS;
86
106
  const commonInstanceProps = {
87
107
  vpc: this.vpc,
88
108
  vpcSubnets: {
@@ -92,50 +112,50 @@ class RdsInstance extends constructs_1.Construct {
92
112
  engine,
93
113
  parameterGroup,
94
114
  allocatedStorage: props.allocatedStorage,
95
- backupRetention: props.backupRetention || aws_cdk_lib_1.Duration.days(14),
115
+ backupRetention: props.backupRetention || Duration.days(14),
96
116
  preferredBackupWindow: props.preferredBackupWindow || "02:00-03:00",
97
117
  storageEncrypted: true,
98
118
  storageEncryptionKey,
99
- storageType: aws_rds_1.StorageType.GP3,
100
- caCertificate: aws_rds_1.CaCertificate.RDS_CA_RSA4096_G1,
101
- removalPolicy: aws_cdk_lib_1.RemovalPolicy.SNAPSHOT,
119
+ storageType: StorageType.GP3,
120
+ caCertificate: CaCertificate.RDS_CA_RSA4096_G1,
121
+ removalPolicy: RemovalPolicy.SNAPSHOT,
102
122
  deleteAutomatedBackups: false,
103
123
  enablePerformanceInsights: piEnabled,
104
124
  performanceInsightEncryptionKey: performanceInsightsEncryptionKey,
105
125
  performanceInsightRetention: performanceInsightsRetention,
106
- instanceIdentifier: resourceNaming_1.ResourceNaming.dbInstanceId(this.constructId),
126
+ instanceIdentifier: ResourceNaming.dbInstanceId(this.constructId),
107
127
  instanceType: props.instanceType
108
- ? new aws_ec2_1.InstanceType(props.instanceType)
109
- : new aws_ec2_1.InstanceType("t4g.large"),
128
+ ? new InstanceType(props.instanceType)
129
+ : new InstanceType("t4g.large"),
110
130
  maxAllocatedStorage: props.maxAllocatedStorage || 500,
111
- monitoringInterval: props.monitoringInterval || rdsDefaults_1.RDS_DEFAULTS.MONITORING_INTERVAL,
131
+ monitoringInterval: props.monitoringInterval || RDS_DEFAULTS.MONITORING_INTERVAL,
112
132
  multiAz: props.multiAz !== false,
113
133
  port: this.port,
114
134
  deletionProtection: props.deletionProtection ?? true,
115
135
  preferredMaintenanceWindow: props.preferredMaintenanceWindow ||
116
- rdsDefaults_1.RDS_DEFAULTS.PREFERRED_MAINTENANCE_WINDOW,
136
+ RDS_DEFAULTS.PREFERRED_MAINTENANCE_WINDOW,
117
137
  publiclyAccessible: props.publiclyAccessible ?? false
118
138
  };
119
139
  if (props.snapshotIdentifier) {
120
140
  // Create from snapshot
121
- this.database = new aws_rds_1.DatabaseInstanceFromSnapshot(this, `${props.databaseName}Database`, {
141
+ this.database = new DatabaseInstanceFromSnapshot(this, `${props.databaseName}Database`, {
122
142
  ...commonInstanceProps,
123
143
  snapshotIdentifier: props.snapshotIdentifier,
124
144
  // For snapshots, credentials are used to reset the password
125
- credentials: aws_rds_1.SnapshotCredentials.fromSecret(this.databaseCredentials.secret)
145
+ credentials: SnapshotCredentials.fromSecret(this.databaseCredentials.secret)
126
146
  });
127
147
  }
128
148
  else {
129
149
  // Create new instance
130
- this.database = new aws_rds_1.DatabaseInstance(this, `${props.databaseName}Database`, {
150
+ this.database = new DatabaseInstance(this, `${props.databaseName}Database`, {
131
151
  ...commonInstanceProps,
132
152
  databaseName: props.databaseName,
133
- credentials: aws_rds_1.Credentials.fromSecret(this.databaseCredentials.secret)
153
+ credentials: Credentials.fromSecret(this.databaseCredentials.secret)
134
154
  });
135
155
  }
136
156
  }
137
157
  rotateSecret(props) {
138
- this.masterSecret = (0, rdsHelpers_1.addMultiUserSecretRotation)({
158
+ this.masterSecret = addMultiUserSecretRotation({
139
159
  scope: this,
140
160
  databaseName: props.databaseName,
141
161
  constructId: this.constructId,
@@ -151,55 +171,55 @@ class RdsInstance extends constructs_1.Construct {
151
171
  return;
152
172
  const proxyConfig = props.proxy;
153
173
  const vpcSubnets = proxyConfig.vpcSubnets ?? {
154
- subnetType: aws_ec2_1.SubnetType.PRIVATE_WITH_EGRESS
174
+ subnetType: SubnetType.PRIVATE_WITH_EGRESS
155
175
  };
156
- this.databaseProxySecurityGroup = new securityGroup_js_1.SecurityGroup(this, `${props.databaseName}ProxySecurityGroup`, {
176
+ this.databaseProxySecurityGroup = new SecurityGroup(this, `${props.databaseName}ProxySecurityGroup`, {
157
177
  vpc: this.vpc,
158
178
  description: `Security group for RDS Proxy for ${props.databaseName}`
159
179
  });
160
180
  // Allow proxy to connect to database
161
- this.databaseSecurityGroup.addIngressRule(this.databaseProxySecurityGroup, aws_ec2_1.Port.tcp(this.port), "Allow RDS Proxy to connect to database");
162
- this.databaseProxy = new aws_rds_1.DatabaseProxy(this, `${props.databaseName}DatabaseProxy`, {
163
- dbProxyName: resourceNaming_1.ResourceNaming.proxyName(this.constructId),
164
- proxyTarget: aws_rds_1.ProxyTarget.fromInstance(this.database),
181
+ this.databaseSecurityGroup.addIngressRule(this.databaseProxySecurityGroup, Port.tcp(this.port), "Allow RDS Proxy to connect to database");
182
+ this.databaseProxy = new DatabaseProxy(this, `${props.databaseName}DatabaseProxy`, {
183
+ dbProxyName: ResourceNaming.proxyName(this.constructId),
184
+ proxyTarget: ProxyTarget.fromInstance(this.database),
165
185
  secrets: [this.databaseCredentials.secret],
166
186
  securityGroups: [this.databaseProxySecurityGroup],
167
187
  vpc: this.vpc,
168
188
  vpcSubnets,
169
189
  requireTLS: proxyConfig.requireTLS ?? true,
170
190
  borrowTimeout: proxyConfig.connectionBorrowTimeout
171
- ? aws_cdk_lib_1.Duration.seconds(proxyConfig.connectionBorrowTimeout)
172
- : aws_cdk_lib_1.Duration.seconds(120),
191
+ ? Duration.seconds(proxyConfig.connectionBorrowTimeout)
192
+ : Duration.seconds(120),
173
193
  maxConnectionsPercent: proxyConfig.maxConnections,
174
194
  maxIdleConnectionsPercent: proxyConfig.maxIdleConnections
175
195
  });
176
- (0, rdsProxyOutput_1.addProxyCfnOutput)(this, this.constructId, props.databaseName, this.databaseProxy);
196
+ addProxyCfnOutput(this, this.constructId, props.databaseName, this.databaseProxy);
177
197
  }
178
198
  addReadReplica(props) {
179
199
  if (!props.readReplica)
180
200
  return;
181
201
  const replicaConfig = props.readReplica;
182
202
  const replicaInstanceType = replicaConfig.instanceType ?? props.instanceType ?? "t4g.large";
183
- const { piEnabled, piConfig } = (0, rdsHelpers_1.resolveDatabaseInsights)(props.databaseInsights);
184
- const readReplicaPerformanceInsightsKey = piEnabled && (0, databaseTypes_1.isCMKRequested)(piConfig?.encryptionKey)
185
- ? new secrets_1.CustomerManagedKey(this, `${props.databaseName}ReadReplicaReaderInsightsKey`, {
203
+ const { piEnabled, piConfig } = resolveDatabaseInsights(props.databaseInsights);
204
+ const readReplicaPerformanceInsightsKey = piEnabled && isCMKRequested(piConfig?.encryptionKey)
205
+ ? new CustomerManagedKey(this, `${props.databaseName}ReadReplicaReaderInsightsKey`, {
186
206
  aliasName: `cmk/rds/${props.databaseName}/ReadReplicaInsightsKey`
187
207
  }).key
188
208
  : undefined;
189
- this.readReplicaSecurityGroup = new securityGroup_js_1.SecurityGroup(this, `${props.databaseName}ReadReplicaSecurityGroup`, {
209
+ this.readReplicaSecurityGroup = new SecurityGroup(this, `${props.databaseName}ReadReplicaSecurityGroup`, {
190
210
  vpc: this.vpc,
191
211
  description: `Security group for RDS read replica of ${props.databaseName}`
192
212
  });
193
213
  // Allow primary database to replicate to read replica
194
- this.readReplicaSecurityGroup.addIngressRule(this.databaseSecurityGroup, aws_ec2_1.Port.tcp(this.port), "Allow primary database to replicate to read replica");
214
+ this.readReplicaSecurityGroup.addIngressRule(this.databaseSecurityGroup, Port.tcp(this.port), "Allow primary database to replicate to read replica");
195
215
  // Deletion waiter ensures primary is "available" before CloudFormation deletes it.
196
216
  // When the read replica is deleted, the primary enters "modifying" state.
197
217
  // Without this waiter, the final snapshot creation fails.
198
- const instanceId = resourceNaming_1.ResourceNaming.dbInstanceId(this.constructId);
199
- const waiterTimeout = aws_cdk_lib_1.Duration.minutes(10);
200
- const deletionWaiter = new customResource_1.CustomResource(this, `${props.databaseName}DeletionWaiter`, {
201
- runtime: aws_lambda_1.Runtime.NODEJS_22_X,
202
- timeout: waiterTimeout.plus(aws_cdk_lib_1.Duration.seconds(30)),
218
+ const instanceId = ResourceNaming.dbInstanceId(this.constructId);
219
+ const waiterTimeout = Duration.minutes(10);
220
+ const deletionWaiter = new CustomResource(this, `${props.databaseName}DeletionWaiter`, {
221
+ runtime: Runtime.NODEJS_22_X,
222
+ timeout: waiterTimeout.plus(Duration.seconds(30)),
203
223
  lambdaDescription: `${props.databaseName} deletion waiter`,
204
224
  inlineCode: `
205
225
  const { RDSClient } = require('@aws-sdk/client-rds');
@@ -234,8 +254,8 @@ exports.handler = async (event) => {
234
254
  };
235
255
  `,
236
256
  inlinePolicy: [
237
- new aws_iam_1.PolicyStatement({
238
- effect: aws_iam_1.Effect.ALLOW,
257
+ new PolicyStatement({
258
+ effect: Effect.ALLOW,
239
259
  actions: ["rds:DescribeDBInstances"],
240
260
  resources: ["*"]
241
261
  })
@@ -246,34 +266,34 @@ exports.handler = async (event) => {
246
266
  }
247
267
  });
248
268
  deletionWaiter.resource.node.addDependency(this.database);
249
- const readReplica = new aws_rds_1.DatabaseInstanceReadReplica(this, `${props.databaseName}ReadReplica`, {
269
+ const readReplica = new DatabaseInstanceReadReplica(this, `${props.databaseName}ReadReplica`, {
250
270
  sourceDatabaseInstance: this.database,
251
271
  vpc: this.vpc,
252
272
  vpcSubnets: {
253
- subnetType: aws_ec2_1.SubnetType.PRIVATE_WITH_EGRESS
273
+ subnetType: SubnetType.PRIVATE_WITH_EGRESS
254
274
  },
255
275
  securityGroups: [this.readReplicaSecurityGroup],
256
276
  allocatedStorage: props.allocatedStorage,
257
277
  storageEncrypted: true,
258
- storageType: aws_rds_1.StorageType.GP3,
259
- caCertificate: aws_rds_1.CaCertificate.RDS_CA_RSA4096_G1,
260
- removalPolicy: aws_cdk_lib_1.RemovalPolicy.DESTROY,
278
+ storageType: StorageType.GP3,
279
+ caCertificate: CaCertificate.RDS_CA_RSA4096_G1,
280
+ removalPolicy: RemovalPolicy.DESTROY,
261
281
  deleteAutomatedBackups: false,
262
282
  enablePerformanceInsights: piEnabled,
263
283
  performanceInsightEncryptionKey: readReplicaPerformanceInsightsKey,
264
284
  performanceInsightRetention: piEnabled
265
- ? (0, _1.getDatabaseInsightsRetention)(piConfig?.mode ?? "standard")
285
+ ? getDatabaseInsightsRetention(piConfig?.mode ?? "standard")
266
286
  : undefined,
267
- instanceIdentifier: resourceNaming_1.ResourceNaming.readReplicaId(this.constructId),
268
- instanceType: new aws_ec2_1.InstanceType(replicaInstanceType),
287
+ instanceIdentifier: ResourceNaming.readReplicaId(this.constructId),
288
+ instanceType: new InstanceType(replicaInstanceType),
269
289
  availabilityZone: replicaConfig.availabilityZone,
270
290
  maxAllocatedStorage: props.maxAllocatedStorage || 500,
271
- monitoringInterval: props.monitoringInterval || rdsDefaults_1.RDS_DEFAULTS.MONITORING_INTERVAL,
291
+ monitoringInterval: props.monitoringInterval || RDS_DEFAULTS.MONITORING_INTERVAL,
272
292
  multiAz: props.multiAz !== false,
273
293
  port: this.port,
274
294
  deletionProtection: props.deletionProtection ?? true,
275
295
  preferredMaintenanceWindow: props.preferredMaintenanceWindow ||
276
- rdsDefaults_1.RDS_DEFAULTS.PREFERRED_MAINTENANCE_WINDOW
296
+ RDS_DEFAULTS.PREFERRED_MAINTENANCE_WINDOW
277
297
  });
278
298
  readReplica.node.addDependency(deletionWaiter.resource);
279
299
  }
@@ -305,5 +325,3 @@ exports.handler = async (event) => {
305
325
  };
306
326
  }
307
327
  }
308
- exports.RdsInstance = RdsInstance;
309
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmRzSW5zdGFuY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWIvcmVzb3VyY2VzL2F3cy9kYXRhYmFzZS9yZHNJbnN0YW5jZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw2Q0FBc0Q7QUFDdEQsaURBUTZCO0FBQzdCLGlEQWU2QjtBQUM3Qix1REFBaUQ7QUFDakQsaURBQThEO0FBQzlELDJDQUF1QztBQUN2QyxxRUFBK0Q7QUFDL0Qsd0NBQXdEO0FBQ3hELGdFQUE2RDtBQUU3RCx5QkFBa0Q7QUFDbEQsK0NBQTZDO0FBQzdDLDZDQU1zQjtBQUN0QixnRUFRc0M7QUFDdEMsa0VBQStEO0FBQy9ELHFEQUFxRDtBQStCckQsTUFBYSxXQUFZLFNBQVEsc0JBQVM7SUFnQnhDLFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBZTtRQUN2RCxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWpCLElBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUksSUFBSSwwQkFBWSxDQUFDLFlBQVksQ0FBQztRQUNwRCxJQUFJLENBQUMsR0FBRyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUM7UUFFckIsOEVBQThFO1FBQzlFLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDLFlBQVksSUFBSSwyQ0FBOEIsQ0FBQztRQUV6RSxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRXhCLDBFQUEwRTtRQUMxRSxNQUFNLHNCQUFzQixHQUFHLEtBQUssQ0FBQyxXQUFXLEVBQUUsY0FBYyxLQUFLLEtBQUssQ0FBQztRQUMzRSxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztZQUM1QixJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzNCLENBQUM7UUFFRCxJQUFJLEtBQUssQ0FBQyxLQUFLLEtB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QUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDM0IsQ0FBQztJQUVELGNBQWM7UUFDWixPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FBQztJQUNsQyxDQUFDO0lBRUQsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFVLEVBQUUsS0FBZTtRQUN0QyxPQUFPLENBQUMsRUFBZ0IsRUFBRSxFQUFFO1lBQzFCLE1BQU0sUUFBUSxHQUFhO2dCQUN6QixHQUFHLEtBQUs7Z0JBQ1IsR0FBRztvQkFDRCxHQUFHLEVBQUUsRUFBRSxDQUFDLFVBQVUsRUFBRSxJQUFJLEtBQUssQ0FBQyxHQUFHO29CQUNqQyxnQkFBZ0IsRUFBRSxLQUFLLEVBQUUsZ0JBQWdCLElBQUksRUFBRTtvQkFDL0MsWUFBWSxFQUFFLEtBQUssQ0FBQyxZQUFZLElBQUksR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsRUFBRTtpQkFDL0Q7YUFDRixDQUFDO1lBRUYsT0FBTyxJQUFJLElBQUksQ0FBQyxFQUFFLENBQUMsUUFBUSxFQUFFLEVBQUUsRUFBRSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQy9DLENBQUMsQ0FBQztJQUNKLENBQUM7Q0FDRjtBQXJhRCxrQ0FxYUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEdXJhdGlvbiwgUmVtb3ZhbFBvbGljeSB9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuaW1wb3J0IHtcbiAgQ29ubmVjdGlvbnMsXG4gIHR5cGUgSUNvbm5lY3RhYmxlLFxuICBJbnN0YW5jZVR5cGUsXG4gIHR5cGUgSVZwYyxcbiAgUG9ydCxcbiAgdHlwZSBTdWJuZXRTZWxlY3Rpb24sXG4gIFN1Ym5ldFR5cGVcbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1lYzJcIjtcbmltcG9ydCB7XG4gIENhQ2VydGlmaWNhdGUsXG4gIENyZWRlbnRpYWxzLFxuICBEYXRhYmFzZUluc3RhbmNlLFxuICBEYXRhYmFzZUluc3RhbmNlRnJvbVNuYXBzaG90LFxuICBEYXRhYmFzZUluc3RhbmNlRW5naW5lLFxuICBEYXRhYmFzZUluc3RhbmNlUmVhZFJlcGxpY2EsXG4gIERhdGFiYXNlUHJveHksXG4gIHR5cGUgSURhdGFiYXNlSW5zdGFuY2UsXG4gIHR5cGUgSUluc3RhbmNlRW5naW5lLFxuICBQYXJhbWV0ZXJHcm91cCxcbiAgUG9zdGdyZXNFbmdpbmVWZXJzaW9uLFxuICBQcm94eVRhcmdldCxcbiAgU25hcHNob3RDcmVkZW50aWFscyxcbiAgU3RvcmFnZVR5cGVcbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1yZHNcIjtcbmltcG9ydCB7IFJ1bnRpbWUgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWxhbWJkYVwiO1xuaW1wb3J0IHsgUG9saWN5U3RhdGVtZW50LCBFZmZlY3QgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWlhbVwiO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB7IFNlY3VyaXR5R3JvdXAgfSBmcm9tIFwiLi4vbmV0d29ya2luZy9zZWN1cml0eUdyb3VwLmpzXCI7XG5pbXBvcnQgeyBDdXN0b21lck1hbmFnZWRLZXksIFNlY3JldCB9IGZyb20gXCIuLi9zZWNyZXRzXCI7XG5pbXBvcnQgeyBDdXN0b21SZXNvdXJjZSB9IGZyb20gXCIuLi91dGlsaXRpZXMvY3VzdG9tUmVzb3VyY2VcIjtcbmltcG9ydCB7IHR5cGUgU3RhY2tCdWlsZGVyIH0gZnJvbSBcIi4uL2Jhc2UvYXdzU3RhY2tcIjtcbmltcG9ydCB7IGdldERhdGFiYXNlSW5zaWdodHNSZXRlbnRpb24gfSBmcm9tIFwiLi9cIjtcbmltcG9ydCB7IFJEU19ERUZBVUxUUyB9IGZyb20gXCIuL3Jkc0RlZmF1bHRzXCI7XG5pbXBvcnQge1xuICBERUZBVUxUX1BPU1RHUkVTX0VOR0lORV9DT05GSUcsXG4gIHJlc29sdmVEYXRhYmFzZUluc2lnaHRzLFxuICByZXNvbHZlU3RvcmFnZUVuY3J5cHRpb25LZXksXG4gIHJlc29sdmVQZXJmb3JtYW5jZUluc2lnaHRzS2V5LFxuICBhZGRNdWx0aVVzZXJTZWNyZXRSb3RhdGlvblxufSBmcm9tIFwiLi9yZHNIZWxwZXJzXCI7XG5pbXBvcnQge1xuICB0eXBlIEVuZ2luZUNvbmZpZyxcbiAgdHlwZSBQcm94eUNvbmZpZyxcbiAgdHlwZSBSZWFkUmVwbGljYUNvbmZpZyxcbiAgdHlwZSBDcmVkZW50aWFsc0NvbmZpZyxcbiAgdHlwZSBFbmNyeXB0aW9uQ29uZmlnLFxuICB0eXBlIERhdGFiYXNlSW5zaWdodHNDb25maWcsXG4gIGlzQ01LUmVxdWVzdGVkXG59IGZyb20gXCIuLi8uLi8uLi91dGlscy9kYXRhYmFzZVR5cGVzXCI7XG5pbXBvcnQgeyBSZXNvdXJjZU5hbWluZyB9IGZyb20gXCIuLi8uLi8uLi91dGlscy9yZXNvdXJjZU5hbWluZ1wiO1xuaW1wb3J0IHsgYWRkUHJveHlDZm5PdXRwdXQgfSBmcm9tIFwiLi9yZHNQcm94eU91dHB1dFwiO1xuXG5pbnRlcmZhY2UgUmRzUHJvcHMge1xuICB2cGM6IElWcGM7XG4gIGRhdGFiYXNlTmFtZT86IHN0cmluZztcbiAgZW5naW5lPzogSUluc3RhbmNlRW5naW5lO1xuICBlbmdpbmVDb25maWc/OiBFbmdpbmVDb25maWc7XG4gIGluc3RhbmNlVHlwZT86IHN0cmluZztcbiAgbWF4QWxsb2NhdGVkU3RvcmFnZT86IG51bWJlcjtcbiAgYWxsb2NhdGVkU3RvcmFnZT86IG51bWJlcjtcbiAgYmFja3VwUmV0ZW50aW9uPzogRHVyYXRpb247XG4gIHByZWZlcnJlZEJhY2t1cFdpbmRvdz86IHN0cmluZztcbiAgY2x1c3RlcklkZW50aWZpZXI/OiBzdHJpbmc7XG4gIG1vbml0b3JpbmdJbnRlcnZhbD86IER1cmF0aW9uO1xuICBwcmVmZXJyZWRNYWludGVuYW5jZVdpbmRvdz86IHN0cmluZztcbiAgcG9ydD86IG51bWJlcjtcbiAgZGF0YWJhc2VJbnNpZ2h0cz86IERhdGFiYXNlSW5zaWdodHNDb25maWcgfCBmYWxzZTtcbiAgc2VjdXJpdHlHcm91cElkcz86IHN0cmluZ1tdO1xuICBtdWx0aUF6PzogYm9vbGVhbjtcbiAgcHJveHk/OiBQcm94eUNvbmZpZyB8IGZhbHNlO1xuICByZWFkUmVwbGljYT86IFJlYWRSZXBsaWNhQ29uZmlnIHwgZmFsc2U7XG4gIGNyZWRlbnRpYWxzPzogQ3JlZGVudGlhbHNDb25maWc7XG4gIGVuY3J5cHRpb24/OiBFbmNyeXB0aW9uQ29uZmlnO1xuICBwdWJsaWNseUFjY2Vzc2libGU/OiBib29sZWFuO1xuICBkZWxldGlvblByb3RlY3Rpb24/OiBib29sZWFuO1xuICAvKiogQVJOIG9yIGlkZW50aWZpZXIgb2YgREIgaW5zdGFuY2Ugc25hcHNob3QgdG8gcmVzdG9yZSBmcm9tICovXG4gIHNuYXBzaG90SWRlbnRpZmllcj86IHN0cmluZztcbiAgLyoqIFVzZXJuYW1lIGZyb20gdGhlIHNuYXBzaG90IChyZXF1aXJlZCB3aGVuIHJlc3RvcmluZyBmcm9tIHNuYXBzaG90IHRvIHJlc2V0IHBhc3N3b3JkKSAqL1xuICBzbmFwc2hvdFVzZXJuYW1lPzogc3RyaW5nO1xufVxuXG5leHBvcnQgY2xhc3MgUmRzSW5zdGFuY2UgZXh0ZW5kcyBDb25zdHJ1Y3QgaW1wbGVtZW50cyBJQ29ubmVjdGFibGUge1xuICBwdWJsaWMgY29ubmVjdGlvbnMhOiBDb25uZWN0aW9ucztcbiAgcHVibGljIGRhdGFiYXNlU2VjdXJpdHlHcm91cCE6IFNlY3VyaXR5R3JvdXA7XG4gIHB1YmxpYyB2cGMhOiBJVnBjO1xuXG4gIHByaXZhdGUgcG9ydCE6IG51bWJlcjtcbiAgcHJpdmF0ZSBlbmdpbmVDb25maWchOiBFbmdpbmVDb25maWc7XG4gIHByaXZhdGUgZGF0YWJhc2VDcmVkZW50aWFscyE6IFNlY3JldDtcbiAgcHJpdmF0ZSBkYXRhYmFzZSE6IElEYXRhYmFzZUluc3RhbmNlO1xuICBwcml2YXRlIG1hc3RlclNlY3JldD86IFNlY3JldDtcbiAgcHJpdmF0ZSBkYXRhYmFzZVByb3h5PzogRGF0YWJhc2VQcm94eTtcbiAgcHJpdmF0ZSBkYXRhYmFzZVByb3h5U2VjdXJpdHlHcm91cD86IFNlY3VyaXR5R3JvdXA7XG4gIHByaXZhdGUgcmVhZFJlcGxpY2FTZWN1cml0eUdyb3VwPzogU2VjdXJpdHlHcm91cDtcblxuICBwcml2YXRlIHJlYWRvbmx5IGNvbnN0cnVjdElkOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IFJkc1Byb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIHRoaXMuY29uc3RydWN0SWQgPSBpZDtcbiAgICB0aGlzLnBvcnQgPSBwcm9wcy5wb3J0IHx8IFJEU19ERUZBVUxUUy5ERUZBVUxUX1BPUlQ7XG4gICAgdGhpcy52cGMgPSBwcm9wcy52cGM7XG5cbiAgICAvLyBQb3N0Z3JlU1FMIGZhbGxiYWNrIGZvciBkaXJlY3QgdXNhZ2UgLSBlbnN1cmUgZW5naW5lIGFuZCBlbmdpbmVDb25maWcgbWF0Y2hcbiAgICB0aGlzLmVuZ2luZUNvbmZpZyA9IHByb3BzLmVuZ2luZUNvbmZpZyA/PyBERUZBVUxUX1BPU1RHUkVTX0VOR0lORV9DT05GSUc7XG5cbiAgICB0aGlzLmFkZERhdGFiYXNlKHByb3BzKTtcblxuICAgIC8vIFNlY3JldCByb3RhdGlvbiBlbmFibGVkIGJ5IGRlZmF1bHQgKG9wdC1vdXQgd2l0aCBzZWNyZXRSb3RhdGlvbjogZmFsc2UpXG4gICAgY29uc3Qgc2VjcmV0Um90YXRpb25EaXNhYmxlZCA9IHByb3BzLmNyZWRlbnRpYWxzPy5zZWNyZXRSb3RhdGlvbiA9PT0gZmFsc2U7XG4gICAgaWYgKCFzZWNyZXRSb3RhdGlvbkRpc2FibGVkKSB7XG4gICAgICB0aGlzLnJvdGF0ZVNlY3JldChwcm9wcyk7XG4gICAgfVxuXG4gICAgaWYgKHByb3BzLnByb3h5ICE9PSB1bmRlZmluZWQgJiYgcHJvcHMucHJveHkgIT09IGZhbHNlKSB7XG4gICAgICB0aGlzLmFkZFByb3h5KHByb3BzKTtcbiAgICB9XG5cbiAgICBpZiAocHJvcHMucmVhZFJlcGxpY2EgIT09IHVuZGVmaW5lZCAmJiBwcm9wcy5yZWFkUmVwbGljYSAhPT0gZmFsc2UpIHtcbiAgICAgIHRoaXMuYWRkUmVhZFJlcGxpY2EocHJvcHMpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYWRkRGF0YWJhc2UocHJvcHM6IFJkc1Byb3BzKSB7XG4gICAgLy8gVXNlcm5hbWUgcHJpb3JpdHk6IHNuYXBzaG90VXNlcm5hbWUgPiBjcmVkZW50aWFscy51c2VybmFtZSA+IGVuZ2luZSBkZWZhdWx0XG4gICAgY29uc3QgdXNlcm5hbWUgPVxuICAgICAgcHJvcHMuc25hcHNob3RJZGVudGlmaWVyICYmIHByb3BzLnNuYXBzaG90VXNlcm5hbWVcbiAgICAgICAgPyBwcm9wcy5zbmFwc2hvdFVzZXJuYW1lXG4gICAgICAgIDogKHByb3BzLmNyZWRlbnRpYWxzPy51c2VybmFtZSA/PyB0aGlzLmVuZ2luZUNvbmZpZy5kZWZhdWx0VXNlcm5hbWUpO1xuICAgIHRoaXMuZGF0YWJhc2VDcmVkZW50aWFscyA9IG5ldyBTZWNyZXQoXG4gICAgICB0aGlzLFxuICAgICAgYCR7cHJvcHMuZGF0YWJhc2VOYW1lfUNyZWRlbnRpYWxzYCxcbiAgICAgIHtcbiAgICAgICAgc2VjcmV0TmFtZTogUmVzb3VyY2VOYW1pbmcuY3JlZGVudGlhbHNTZWNyZXROYW1lKHRoaXMuY29uc3RydWN0SWQpLFxuICAgICAgICBnZW5lcmF0ZVNlY3JldFN0cmluZzoge1xuICAgICAgICAgIHNlY3JldFN0cmluZ1RlbXBsYXRlOiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICB1c2VybmFtZVxuICAgICAgICAgIH0pLFxuICAgICAgICAgIGV4Y2x1ZGVQdW5jdHVhdGlvbjogdHJ1ZSxcbiAgICAgICAgICBpbmNsdWRlU3BhY2U6IGZhbHNlLFxuICAgICAgICAgIGdlbmVyYXRlU3RyaW5nS2V5OiBcInBhc3N3b3JkXCJcbiAgICAgICAgfVxuICAgICAgfVxuICAgICk7XG5cbiAgICB0aGlzLmRhdGFiYXNlU2VjdXJpdHlHcm91cCA9IG5ldyBTZWN1cml0eUdyb3VwKFxuICAgICAgdGhpcyxcbiAgICAgIGAke3Byb3BzLmRhdGFiYXNlTmFtZX1TZWN1cml0eUdyb3VwYCxcbiAgICAgIHtcbiAgICAgICAgdnBjOiB0aGlzLnZwYyxcbiAgICAgICAgZGVzY3JpcHRpb246IGBTZWN1cml0eSBncm91cCBmb3IgUkRTIGRhdGFiYXNlIGluc3RhbmNlICR7cHJvcHMuZGF0YWJhc2VOYW1lfWBcbiAgICAgIH1cbiAgICApO1xuXG4gICAgLy8gU2VsZi1yZWZlcmVuY2luZyBydWxlIGZvciBtdWx0aS1BWiBjb21tdW5pY2F0aW9uXG4gICAgdGhpcy5kYXRhYmFzZVNlY3VyaXR5R3JvdXAuYWRkSW5ncmVzc1J1bGUoXG4gICAgICB0aGlzLmRhdGFiYXNlU2VjdXJpdHlHcm91cCxcbiAgICAgIFBvcnQudGNwKHRoaXMucG9ydClcbiAgICApO1xuXG4gICAgdGhpcy5jb25uZWN0aW9ucyA9IG5ldyBDb25uZWN0aW9ucyh7XG4gICAgICBzZWN1cml0eUdyb3VwczogW3RoaXMuZGF0YWJhc2VTZWN1cml0eUdyb3VwXSxcbiAgICAgIGRlZmF1bHRQb3J0OiBQb3J0LnRjcCh0aGlzLnBvcnQpXG4gICAgfSk7XG5cbiAgICBjb25zdCBzdG9yYWdlRW5jcnlwdGlvbktleSA9IHJlc29sdmVTdG9yYWdlRW5jcnlwdGlvbktleShcbiAgICAgIHRoaXMsXG4gICAgICBwcm9wcy5kYXRhYmFzZU5hbWUsXG4gICAgICBwcm9wcy5lbmNyeXB0aW9uPy5zdG9yYWdlS2V5XG4gICAgKTtcblxuICAgIGNvbnN0IHsgcGlFbmFibGVkLCBwaUNvbmZpZyB9ID0gcmVzb2x2ZURhdGFiYXNlSW5zaWdodHMoXG4gICAgICBwcm9wcy5kYXRhYmFzZUluc2lnaHRzXG4gICAgKTtcblxuICAgIGNvbnN0IHBlcmZvcm1hbmNlSW5zaWdodHNFbmNyeXB0aW9uS2V5ID0gcmVzb2x2ZVBlcmZvcm1hbmNlSW5zaWdodHNLZXkoXG4gICAgICB0aGlzLFxuICAgICAgcHJvcHMuZGF0YWJhc2VOYW1lLFxuICAgICAgcGlFbmFibGVkLFxuICAgICAgcGlDb25maWc/LmVuY3J5cHRpb25LZXlcbiAgICApO1xuXG4gICAgY29uc3QgZGlNb2RlID0gcGlDb25maWc/Lm1vZGUgPz8gXCJzdGFuZGFyZFwiO1xuICAgIGNvbnN0IHBlcmZvcm1hbmNlSW5zaWdodHNSZXRlbnRpb24gPSBwaUVuYWJsZWRcbiAgICAgID8gZ2V0RGF0YWJhc2VJbnNpZ2h0c1JldGVudGlvbihkaU1vZGUpXG4gICAgICA6IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IGVuZ2luZSA9XG4gICAgICBwcm9wcy5lbmdpbmUgfHxcbiAgICAgIERhdGFiYXNlSW5zdGFuY2VFbmdpbmUucG9zdGdyZXMoe1xuICAgICAgICB2ZXJzaW9uOiBQb3N0Z3Jlc0VuZ2luZVZlcnNpb24uVkVSXzE3XzVcbiAgICAgIH0pO1xuXG4gICAgY29uc3QgcGFyYW1ldGVyR3JvdXAgPSBuZXcgUGFyYW1ldGVyR3JvdXAoXG4gICAgICB0aGlzLFxuICAgICAgYCR7cHJvcHMuZGF0YWJhc2VOYW1lfVBhcmFtZXRlckdyb3VwYCxcbiAgICAgIHtcbiAgICAgICAgZW5naW5lLFxuICAgICAgICBkZXNjcmlwdGlvbjogYFBhcmFtZXRlciBncm91cCBmb3IgJHtwcm9wcy5kYXRhYmFzZU5hbWV9IHdpdGggc2VjdXJpdHkgZGVmYXVsdHNgLFxuICAgICAgICBwYXJhbWV0ZXJzOiB0aGlzLmVuZ2luZUNvbmZpZy5zc2xQYXJhbWV0ZXJzXG4gICAgICB9XG4gICAgKTtcblxuICAgIC8vIFVzZSBQVUJMSUMgc3VibmV0IGZvciBwdWJsaWNseUFjY2Vzc2libGUgZGF0YWJhc2VzIChlLmcuLCB0aW5rZXJlciB0aWVyIHdpdGhvdXQgTkFUKVxuICAgIGNvbnN0IHN1Ym5ldFR5cGUgPSBwcm9wcy5wdWJsaWNseUFjY2Vzc2libGVcbiAgICAgID8gU3VibmV0VHlwZS5QVUJMSUNcbiAgICAgIDogU3VibmV0VHlwZS5QUklWQVRFX1dJVEhfRUdSRVNTO1xuXG4gICAgY29uc3QgY29tbW9uSW5zdGFuY2VQcm9wcyA9IHtcbiAgICAgIHZwYzogdGhpcy52cGMsXG4gICAgICB2cGNTdWJuZXRzOiB7XG4gICAgICAgIHN1Ym5ldFR5cGVcbiAgICAgIH0sXG4gICAgICBzZWN1cml0eUdyb3VwczogW3RoaXMuZGF0YWJhc2VTZWN1cml0eUdyb3VwXSxcbiAgICAgIGVuZ2luZSxcbiAgICAgIHBhcmFtZXRlckdyb3VwLFxuICAgICAgYWxsb2NhdGVkU3RvcmFnZTogcHJvcHMuYWxsb2NhdGVkU3RvcmFnZSxcbiAgICAgIGJhY2t1cFJldGVudGlvbjogcHJvcHMuYmFja3VwUmV0ZW50aW9uIHx8IER1cmF0aW9uLmRheXMoMTQpLFxuICAgICAgcHJlZmVycmVkQmFja3VwV2luZG93OiBwcm9wcy5wcmVmZXJyZWRCYWNrdXBXaW5kb3cgfHwgXCIwMjowMC0wMzowMFwiLFxuICAgICAgc3RvcmFnZUVuY3J5cHRlZDogdHJ1ZSxcbiAgICAgIHN0b3JhZ2VFbmNyeXB0aW9uS2V5LFxuICAgICAgc3RvcmFnZVR5cGU6IFN0b3JhZ2VUeXBlLkdQMyxcbiAgICAgIGNhQ2VydGlmaWNhdGU6IENhQ2VydGlmaWNhdGUuUkRTX0NBX1JTQTQwOTZfRzEsXG4gICAgICByZW1vdmFsUG9saWN5OiBSZW1vdmFsUG9saWN5LlNOQVBTSE9ULFxuICAgICAgZGVsZXRlQXV0b21hdGVkQmFja3VwczogZmFsc2UsXG4gICAgICBlbmFibGVQZXJmb3JtYW5jZUluc2lnaHRzOiBwaUVuYWJsZWQsXG4gICAgICBwZXJmb3JtYW5jZUluc2lnaHRFbmNyeXB0aW9uS2V5OiBwZXJmb3JtYW5jZUluc2lnaHRzRW5jcnlwdGlvbktleSxcbiAgICAgIHBlcmZvcm1hbmNlSW5zaWdodFJldGVudGlvbjogcGVyZm9ybWFuY2VJbnNpZ2h0c1JldGVudGlvbixcbiAgICAgIGluc3RhbmNlSWRlbnRpZmllcjogUmVzb3VyY2VOYW1pbmcuZGJJbnN0YW5jZUlkKHRoaXMuY29uc3RydWN0SWQpLFxuICAgICAgaW5zdGFuY2VUeXBlOiBwcm9wcy5pbnN0YW5jZVR5cGVcbiAgICAgICAgPyBuZXcgSW5zdGFuY2VUeXBlKHByb3BzLmluc3RhbmNlVHlwZSlcbiAgICAgICAgOiBuZXcgSW5zdGFuY2VUeXBlKFwidDRnLmxhcmdlXCIpLFxuICAgICAgbWF4QWxsb2NhdGVkU3RvcmFnZTogcHJvcHMubWF4QWxsb2NhdGVkU3RvcmFnZSB8fCA1MDAsXG4gICAgICBtb25pdG9yaW5nSW50ZXJ2YWw6XG4gICAgICAgIHByb3BzLm1vbml0b3JpbmdJbnRlcnZhbCB8fCBSRFNfREVGQVVMVFMuTU9OSVRPUklOR19JTlRFUlZBTCxcbiAgICAgIG11bHRpQXo6IHByb3BzLm11bHRpQXogIT09IGZhbHNlLFxuICAgICAgcG9ydDogdGhpcy5wb3J0LFxuICAgICAgZGVsZXRpb25Qcm90ZWN0aW9uOiBwcm9wcy5kZWxldGlvblByb3RlY3Rpb24gPz8gdHJ1ZSxcbiAgICAgIHByZWZlcnJlZE1haW50ZW5hbmNlV2luZG93OlxuICAgICAgICBwcm9wcy5wcmVmZXJyZWRNYWludGVuYW5jZVdpbmRvdyB8fFxuICAgICAgICBSRFNfREVGQVVMVFMuUFJFRkVSUkVEX01BSU5URU5BTkNFX1dJTkRPVyxcbiAgICAgIHB1YmxpY2x5QWNjZXNzaWJsZTogcHJvcHMucHVibGljbHlBY2Nlc3NpYmxlID8/IGZhbHNlXG4gICAgfTtcblxuICAgIGlmIChwcm9wcy5zbmFwc2hvdElkZW50aWZpZXIpIHtcbiAgICAgIC8vIENyZWF0ZSBmcm9tIHNuYXBzaG90XG4gICAgICB0aGlzLmRhdGFiYXNlID0gbmV3IERhdGFiYXNlSW5zdGFuY2VGcm9tU25hcHNob3QoXG4gICAgICAgIHRoaXMsXG4gICAgICAgIGAke3Byb3BzLmRhdGFiYXNlTmFtZX1EYXRhYmFzZWAsXG4gICAgICAgIHtcbiAgICAgICAgICAuLi5jb21tb25JbnN0YW5jZVByb3BzLFxuICAgICAgICAgIHNuYXBzaG90SWRlbnRpZmllcjogcHJvcHMuc25hcHNob3RJZGVudGlmaWVyLFxuICAgICAgICAgIC8vIEZvciBzbmFwc2hvdHMsIGNyZWRlbnRpYWxzIGFyZSB1c2VkIHRvIHJlc2V0IHRoZSBwYXNzd29yZFxuICAgICAgICAgIGNyZWRlbnRpYWxzOiBTbmFwc2hvdENyZWRlbnRpYWxzLmZyb21TZWNyZXQoXG4gICAgICAgICAgICB0aGlzLmRhdGFiYXNlQ3JlZGVudGlhbHMuc2VjcmV0XG4gICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBDcmVhdGUgbmV3IGluc3RhbmNlXG4gICAgICB0aGlzLmRhdGFiYXNlID0gbmV3IERhdGFiYXNlSW5zdGFuY2UoXG4gICAgICAgIHRoaXMsXG4gICAgICAgIGAke3Byb3BzLmRhdGFiYXNlTmFtZX1EYXRhYmFzZWAsXG4gICAgICAgIHtcbiAgICAgICAgICAuLi5jb21tb25JbnN0YW5jZVByb3BzLFxuICAgICAgICAgIGRhdGFiYXNlTmFtZTogcHJvcHMuZGF0YWJhc2VOYW1lLFxuICAgICAgICAgIGNyZWRlbnRpYWxzOiBDcmVkZW50aWFscy5mcm9tU2VjcmV0KHRoaXMuZGF0YWJhc2VDcmVkZW50aWFscy5zZWNyZXQpXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByb3RhdGVTZWNyZXQocHJvcHM6IFJkc1Byb3BzKSB7XG4gICAgdGhpcy5tYXN0ZXJTZWNyZXQgPSBhZGRNdWx0aVVzZXJTZWNyZXRSb3RhdGlvbih7XG4gICAgICBzY29wZTogdGhpcyxcbiAgICAgIGRhdGFiYXNlTmFtZTogcHJvcHMuZGF0YWJhc2VOYW1lLFxuICAgICAgY29uc3RydWN0SWQ6IHRoaXMuY29uc3RydWN0SWQsXG4gICAgICBlbmdpbmVDb25maWc6IHRoaXMuZW5naW5lQ29uZmlnLFxuICAgICAgY3JlZGVudGlhbHNDb25maWc6IHByb3BzLmNyZWRlbnRpYWxzLFxuICAgICAgZGF0YWJhc2VTZWNyZXQ6IHRoaXMuZGF0YWJhc2VDcmVkZW50aWFscy5zZWNyZXQsXG4gICAgICB0YXJnZXQ6IHRoaXMuZGF0YWJhc2UsXG4gICAgICB2cGM6IHRoaXMudnBjXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFkZFByb3h5KHByb3BzOiBSZHNQcm9wcykge1xuICAgIGlmICghcHJvcHMucHJveHkpIHJldHVybjtcbiAgICBjb25zdCBwcm94eUNvbmZpZyA9IHByb3BzLnByb3h5O1xuICAgIGNvbnN0IHZwY1N1Ym5ldHM6IFN1Ym5ldFNlbGVjdGlvbiA9IHByb3h5Q29uZmlnLnZwY1N1Ym5ldHMgPz8ge1xuICAgICAgc3VibmV0VHlwZTogU3VibmV0VHlwZS5QUklWQVRFX1dJVEhfRUdSRVNTXG4gICAgfTtcblxuICAgIHRoaXMuZGF0YWJhc2VQcm94eVNlY3VyaXR5R3JvdXAgPSBuZXcgU2VjdXJpdHlHcm91cChcbiAgICAgIHRoaXMsXG4gICAgICBgJHtwcm9wcy5kYXRhYmFzZU5hbWV9UHJveHlTZWN1cml0eUdyb3VwYCxcbiAgICAgIHtcbiAgICAgICAgdnBjOiB0aGlzLnZwYyxcbiAgICAgICAgZGVzY3JpcHRpb246IGBTZWN1cml0eSBncm91cCBmb3IgUkRTIFByb3h5IGZvciAke3Byb3BzLmRhdGFiYXNlTmFtZX1gXG4gICAgICB9XG4gICAgKTtcblxuICAgIC8vIEFsbG93IHByb3h5IHRvIGNvbm5lY3QgdG8gZGF0YWJhc2VcbiAgICB0aGlzLmRhdGFiYXNlU2VjdXJpdHlHcm91cC5hZGRJbmdyZXNzUnVsZShcbiAgICAgIHRoaXMuZGF0YWJhc2VQcm94eVNlY3VyaXR5R3JvdXAsXG4gICAgICBQb3J0LnRjcCh0aGlzLnBvcnQpLFxuICAgICAgXCJBbGxvdyBSRFMgUHJveHkgdG8gY29ubmVjdCB0byBkYXRhYmFzZVwiXG4gICAgKTtcblxuICAgIHRoaXMuZGF0YWJhc2VQcm94eSA9IG5ldyBEYXRhYmFzZVByb3h5KFxuICAgICAgdGhpcyxcbiAgICAgIGAke3Byb3BzLmRhdGFiYXNlTmFtZX1EYXRhYmFzZVByb3h5YCxcbiAgICAgIHtcbiAgICAgICAgZGJQcm94eU5hbWU6IFJlc291cmNlTmFtaW5nLnByb3h5TmFtZSh0aGlzLmNvbnN0cnVjdElkKSxcbiAgICAgICAgcHJveHlUYXJnZXQ6IFByb3h5VGFyZ2V0LmZyb21JbnN0YW5jZSh0aGlzLmRhdGFiYXNlKSxcbiAgICAgICAgc2VjcmV0czogW3RoaXMuZGF0YWJhc2VDcmVkZW50aWFscy5zZWNyZXRdLFxuICAgICAgICBzZWN1cml0eUdyb3VwczogW3RoaXMuZGF0YWJhc2VQcm94eVNlY3VyaXR5R3JvdXBdLFxuICAgICAgICB2cGM6IHRoaXMudnBjLFxuICAgICAgICB2cGNTdWJuZXRzLFxuICAgICAgICByZXF1aXJlVExTOiBwcm94eUNvbmZpZy5yZXF1aXJlVExTID8/IHRydWUsXG4gICAgICAgIGJvcnJvd1RpbWVvdXQ6IHByb3h5Q29uZmlnLmNvbm5lY3Rpb25Cb3Jyb3dUaW1lb3V0XG4gICAgICAgICAgPyBEdXJhdGlvbi5zZWNvbmRzKHByb3h5Q29uZmlnLmNvbm5lY3Rpb25Cb3Jyb3dUaW1lb3V0KVxuICAgICAgICAgIDogRHVyYXRpb24uc2Vjb25kcygxMjApLFxuICAgICAgICBtYXhDb25uZWN0aW9uc1BlcmNlbnQ6IHByb3h5Q29uZmlnLm1heENvbm5lY3Rpb25zLFxuICAgICAgICBtYXhJZGxlQ29ubmVjdGlvbnNQZXJjZW50OiBwcm94eUNvbmZpZy5tYXhJZGxlQ29ubmVjdGlvbnNcbiAgICAgIH1cbiAgICApO1xuXG4gICAgYWRkUHJveHlDZm5PdXRwdXQoXG4gICAgICB0aGlzLFxuICAgICAgdGhpcy5jb25zdHJ1Y3RJZCxcbiAgICAgIHByb3BzLmRhdGFiYXNlTmFtZSxcbiAgICAgIHRoaXMuZGF0YWJhc2VQcm94eVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGFkZFJlYWRSZXBsaWNhKHByb3BzOiBSZHNQcm9wcykge1xuICAgIGlmICghcHJvcHMucmVhZFJlcGxpY2EpIHJldHVybjtcbiAgICBjb25zdCByZXBsaWNhQ29uZmlnID0gcHJvcHMucmVhZFJlcGxpY2E7XG4gICAgY29uc3QgcmVwbGljYUluc3RhbmNlVHlwZSA9XG4gICAgICByZXBsaWNhQ29uZmlnLmluc3RhbmNlVHlwZSA/PyBwcm9wcy5pbnN0YW5jZVR5cGUgPz8gXCJ0NGcubGFyZ2VcIjtcblxuICAgIGNvbnN0IHsgcGlFbmFibGVkLCBwaUNvbmZpZyB9ID0gcmVzb2x2ZURhdGFiYXNlSW5zaWdodHMoXG4gICAgICBwcm9wcy5kYXRhYmFzZUluc2lnaHRzXG4gICAgKTtcblxuICAgIGNvbnN0IHJlYWRSZXBsaWNhUGVyZm9ybWFuY2VJbnNpZ2h0c0tleSA9XG4gICAgICBwaUVuYWJsZWQgJiYgaXNDTUtSZXF1ZXN0ZWQocGlDb25maWc/LmVuY3J5cHRpb25LZXkpXG4gICAgICAgID8gbmV3IEN1c3RvbWVyTWFuYWdlZEtleShcbiAgICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgICBgJHtwcm9wcy5kYXRhYmFzZU5hbWV9UmVhZFJlcGxpY2FSZWFkZXJJbnNpZ2h0c0tleWAsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGFsaWFzTmFtZTogYGNtay9yZHMvJHtwcm9wcy5kYXRhYmFzZU5hbWV9L1JlYWRSZXBsaWNhSW5zaWdodHNLZXlgXG4gICAgICAgICAgICB9XG4gICAgICAgICAgKS5rZXlcbiAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICB0aGlzLnJlYWRSZXBsaWNhU2VjdXJpdHlHcm91cCA9IG5ldyBTZWN1cml0eUdyb3VwKFxuICAgICAgdGhpcyxcbiAgICAgIGAke3Byb3BzLmRhdGFiYXNlTmFtZX1SZWFkUmVwbGljYVNlY3VyaXR5R3JvdXBgLFxuICAgICAge1xuICAgICAgICB2cGM6IHRoaXMudnBjLFxuICAgICAgICBkZXNjcmlwdGlvbjogYFNlY3VyaXR5IGdyb3VwIGZvciBSRFMgcmVhZCByZXBsaWNhIG9mICR7cHJvcHMuZGF0YWJhc2VOYW1lfWBcbiAgICAgIH1cbiAgICApO1xuXG4gICAgLy8gQWxsb3cgcHJpbWFyeSBkYXRhYmFzZSB0byByZXBsaWNhdGUgdG8gcmVhZCByZXBsaWNhXG4gICAgdGhpcy5yZWFkUmVwbGljYVNlY3VyaXR5R3JvdXAuYWRkSW5ncmVzc1J1bGUoXG4gICAgICB0aGlzLmRhdGFiYXNlU2VjdXJpdHlHcm91cCxcbiAgICAgIFBvcnQudGNwKHRoaXMucG9ydCksXG4gICAgICBcIkFsbG93IHByaW1hcnkgZGF0YWJhc2UgdG8gcmVwbGljYXRlIHRvIHJlYWQgcmVwbGljYVwiXG4gICAgKTtcblxuICAgIC8vIERlbGV0aW9uIHdhaXRlciBlbnN1cmVzIHByaW1hcnkgaXMgXCJhdmFpbGFibGVcIiBiZWZvcmUgQ2xvdWRGb3JtYXRpb24gZGVsZXRlcyBpdC5cbiAgICAvLyBXaGVuIHRoZSByZWFkIHJlcGxpY2EgaXMgZGVsZXRlZCwgdGhlIHByaW1hcnkgZW50ZXJzIFwibW9kaWZ5aW5nXCIgc3RhdGUuXG4gICAgLy8gV2l0aG91dCB0aGlzIHdhaXRlciwgdGhlIGZpbmFsIHNuYXBzaG90IGNyZWF0aW9uIGZhaWxzLlxuICAgIGNvbnN0IGluc3RhbmNlSWQgPSBSZXNvdXJjZU5hbWluZy5kYkluc3RhbmNlSWQodGhpcy5jb25zdHJ1Y3RJZCk7XG4gICAgY29uc3Qgd2FpdGVyVGltZW91dCA9IER1cmF0aW9uLm1pbnV0ZXMoMTApO1xuICAgIGNvbnN0IGRlbGV0aW9uV2FpdGVyID0gbmV3IEN1c3RvbVJlc291cmNlKFxuICAgICAgdGhpcyxcbiAgICAgIGAke3Byb3BzLmRhdGFiYXNlTmFtZX1EZWxldGlvbldhaXRlcmAsXG4gICAgICB7XG4gICAgICAgIHJ1bnRpbWU6IFJ1bnRpbWUuTk9ERUpTXzIyX1gsXG4gICAgICAgIHRpbWVvdXQ6IHdhaXRlclRpbWVvdXQucGx1cyhEdXJhdGlvbi5zZWNvbmRzKDMwKSksXG4gICAgICAgIGxhbWJkYURlc2NyaXB0aW9uOiBgJHtwcm9wcy5kYXRhYmFzZU5hbWV9IGRlbGV0aW9uIHdhaXRlcmAsXG4gICAgICAgIGlubGluZUNvZGU6IGBcbmNvbnN0IHsgUkRTQ2xpZW50IH0gPSByZXF1aXJlKCdAYXdzLXNkay9jbGllbnQtcmRzJyk7XG5jb25zdCB7IHdhaXRVbnRpbERCSW5zdGFuY2VBdmFpbGFibGUgfSA9IHJlcXVpcmUoJ0Bhd3Mtc2RrL2NsaWVudC1yZHMnKTtcblxuZXhwb3J0cy5oYW5kbGVyID0gYXN5bmMgKGV2ZW50KSA9PiB7XG4gIGNvbnNvbGUubG9nKCdFdmVudDonLCBKU09OLnN0cmluZ2lmeShldmVudCwgbnVsbCwgMikpO1xuICBjb25zdCBpbnN0YW5jZUlkID0gZXZlbnQuUmVzb3VyY2VQcm9wZXJ0aWVzLkluc3RhbmNlSWRlbnRpZmllcjtcbiAgY29uc3QgcGh5c2ljYWxSZXNvdXJjZUlkID0gZXZlbnQuUGh5c2ljYWxSZXNvdXJjZUlkIHx8IGV2ZW50LkxvZ2ljYWxSZXNvdXJjZUlkIHx8ICdyZHMtZGVsZXRpb24td2FpdGVyJztcblxuICBpZiAoZXZlbnQuUmVxdWVzdFR5cGUgPT09ICdEZWxldGUnKSB7XG4gICAgY29uc29sZS5sb2coJ1dhaXRpbmcgZm9yIGluc3RhbmNlIHRvIGJlIGF2YWlsYWJsZTonLCBpbnN0YW5jZUlkKTtcbiAgICBjb25zdCBjbGllbnQgPSBuZXcgUkRTQ2xpZW50KHt9KTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgd2FpdFVudGlsREJJbnN0YW5jZUF2YWlsYWJsZShcbiAgICAgICAgeyBjbGllbnQsIG1heFdhaXRUaW1lOiAke3dhaXRlclRpbWVvdXQudG9TZWNvbmRzKCl9LCBtaW5EZWxheTogMTAsIG1heERlbGF5OiAzMCB9LFxuICAgICAgICB7IERCSW5zdGFuY2VJZGVudGlmaWVyOiBpbnN0YW5jZUlkIH1cbiAgICAgICk7XG4gICAgICBjb25zb2xlLmxvZygnSW5zdGFuY2UgaXMgYXZhaWxhYmxlLCBkZWxldGlvbiBjYW4gcHJvY2VlZCcpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoZXJyb3IubmFtZSA9PT0gJ1Jlc291cmNlTm90Rm91bmRFcnJvcicgfHxcbiAgICAgICAgICBlcnJvci5tZXNzYWdlPy5pbmNsdWRlcygnREJJbnN0YW5jZU5vdEZvdW5kJykgfHxcbiAgICAgICAgICBlcnJvci5zdGF0ZSA9PT0gJ0ZBSUxVUkUnKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdJbnN0YW5jZSBub3QgZm91bmQgb3Igd2FpdGVyIGZhaWxlZCwgcHJvY2VlZGluZyB3aXRoIGRlbGV0aW9uJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciB3YWl0aW5nIGZvciBpbnN0YW5jZTonLCBlcnJvcik7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4geyBQaHlzaWNhbFJlc291cmNlSWQ6IHBoeXNpY2FsUmVzb3VyY2VJZCB9O1xufTtcbiAgICAgICAgYCxcbiAgICAgICAgaW5saW5lUG9saWN5OiBbXG4gICAgICAgICAgbmV3IFBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgICAgICBlZmZlY3Q6IEVmZmVjdC5BTExPVyxcbiAgICAgICAgICAgIGFjdGlvbnM6IFtcInJkczpEZXNjcmliZURCSW5zdGFuY2VzXCJdLFxuICAgICAgICAgICAgcmVzb3VyY2VzOiBbXCIqXCJdXG4gICAgICAgICAgfSlcbiAgICAgICAgXSxcbiAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgIEluc3RhbmNlSWRlbnRpZmllcjogaW5zdGFuY2VJZCxcbiAgICAgICAgICBWZXJzaW9uOiBcIjEuMC4wXCJcbiAgICAgICAgfVxuICAgICAgfVxuICAgICk7XG5cbiAgICBkZWxldGlvbldhaXRlci5yZXNvdXJjZS5ub2RlLmFkZERlcGVuZGVuY3kodGhpcy5kYXRhYmFzZSk7XG5cbiAgICBjb25zdCByZWFkUmVwbGljYSA9IG5ldyBEYXRhYmFzZUluc3RhbmNlUmVhZFJlcGxpY2EoXG4gICAgICB0aGlzLFxuICAgICAgYCR7cHJvcHMuZGF0YWJhc2VOYW1lfVJlYWRSZXBsaWNhYCxcbiAgICAgIHtcbiAgICAgICAgc291cmNlRGF0YWJhc2VJbnN0YW5jZTogdGhpcy5kYXRhYmFzZSxcbiAgICAgICAgdnBjOiB0aGlzLnZwYyxcbiAgICAgICAgdnBjU3VibmV0czoge1xuICAgICAgICAgIHN1Ym5ldFR5cGU6IFN1Ym5ldFR5cGUuUFJJVkFURV9XSVRIX0VHUkVTU1xuICAgICAgICB9LFxuICAgICAgICBzZWN1cml0eUdyb3VwczogW3RoaXMucmVhZFJlcGxpY2FTZWN1cml0eUdyb3VwXSxcbiAgICAgICAgYWxsb2NhdGVkU3RvcmFnZTogcHJvcHMuYWxsb2NhdGVkU3RvcmFnZSxcbiAgICAgICAgc3RvcmFnZUVuY3J5cHRlZDogdHJ1ZSxcbiAgICAgICAgc3RvcmFnZVR5cGU6IFN0b3JhZ2VUeXBlLkdQMyxcbiAgICAgICAgY2FDZXJ0aWZpY2F0ZTogQ2FDZXJ0aWZpY2F0ZS5SRFNfQ0FfUlNBNDA5Nl9HMSxcbiAgICAgICAgcmVtb3ZhbFBvbGljeTogUmVtb3ZhbFBvbGljeS5ERVNUUk9ZLFxuICAgICAgICBkZWxldGVBdXRvbWF0ZWRCYWNrdXBzOiBmYWxzZSxcbiAgICAgICAgZW5hYmxlUGVyZm9ybWFuY2VJbnNpZ2h0czogcGlFbmFibGVkLFxuICAgICAgICBwZXJmb3JtYW5jZUluc2lnaHRFbmNyeXB0aW9uS2V5OiByZWFkUmVwbGljYVBlcmZvcm1hbmNlSW5zaWdodHNLZXksXG4gICAgICAgIHBlcmZvcm1hbmNlSW5zaWdodFJldGVudGlvbjogcGlFbmFibGVkXG4gICAgICAgICAgPyBnZXREYXRhYmFzZUluc2lnaHRzUmV0ZW50aW9uKHBpQ29uZmlnPy5tb2RlID8/IFwic3RhbmRhcmRcIilcbiAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgaW5zdGFuY2VJZGVudGlmaWVyOiBSZXNvdXJjZU5hbWluZy5yZWFkUmVwbGljYUlkKHRoaXMuY29uc3RydWN0SWQpLFxuICAgICAgICBpbnN0YW5jZVR5cGU6IG5ldyBJbnN0YW5jZVR5cGUocmVwbGljYUluc3RhbmNlVHlwZSksXG4gICAgICAgIGF2YWlsYWJpbGl0eVpvbmU6IHJlcGxpY2FDb25maWcuYXZhaWxhYmlsaXR5Wm9uZSxcbiAgICAgICAgbWF4QWxsb2NhdGVkU3RvcmFnZTogcHJvcHMubWF4QWxsb2NhdGVkU3RvcmFnZSB8fCA1MDAsXG4gICAgICAgIG1vbml0b3JpbmdJbnRlcnZhbDpcbiAgICAgICAgICBwcm9wcy5tb25pdG9yaW5nSW50ZXJ2YWwgfHwgUkRTX0RFRkFVTFRTLk1PTklUT1JJTkdfSU5URVJWQUwsXG4gICAgICAgIG11bHRpQXo6IHByb3BzLm11bHRpQXogIT09IGZhbHNlLFxuICAgICAgICBwb3J0OiB0aGlzLnBvcnQsXG4gICAgICAgIGRlbGV0aW9uUHJvdGVjdGlvbjogcHJvcHMuZGVsZXRpb25Qcm90ZWN0aW9uID8/IHRydWUsXG4gICAgICAgIHByZWZlcnJlZE1haW50ZW5hbmNlV2luZG93OlxuICAgICAgICAgIHByb3BzLnByZWZlcnJlZE1haW50ZW5hbmNlV2luZG93IHx8XG4gICAgICAgICAgUkRTX0RFRkFVTFRTLlBSRUZFUlJFRF9NQUlOVEVOQU5DRV9XSU5ET1dcbiAgICAgIH1cbiAgICApO1xuXG4gICAgcmVhZFJlcGxpY2Eubm9kZS5hZGREZXBlbmRlbmN5KGRlbGV0aW9uV2FpdGVyLnJlc291cmNlKTtcbiAgfVxuXG4gIGdldEhvc3RFbmRwb2ludCgpIHtcbiAgICBpZiAodGhpcy5kYXRhYmFzZVByb3h5KSB7XG4gICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZVByb3h5LmVuZHBvaW50O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5kYkluc3RhbmNlRW5kcG9pbnRBZGRyZXNzO1xuICAgIH1cbiAgfVxuXG4gIGdldEhvc3RQb3J0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFN0cmluZyh0aGlzLnBvcnQpO1xuICB9XG5cbiAgZ2V0Q3JlZGVudGlhbHMoKTogU2VjcmV0IHtcbiAgICByZXR1cm4gdGhpcy5kYXRhYmFzZUNyZWRlbnRpYWxzO1xuICB9XG5cbiAgc3RhdGljIGJ1aWxkKGlkOiBzdHJpbmcsIHByb3BzOiBSZHNQcm9wcyk6IChzYjogU3RhY2tCdWlsZGVyKSA9PiBDb25zdHJ1Y3Qge1xuICAgIHJldHVybiAoc2I6IFN0YWNrQnVpbGRlcikgPT4ge1xuICAgICAgY29uc3QgbmV3UHJvcHM6IFJkc1Byb3BzID0ge1xuICAgICAgICAuLi5wcm9wcyxcbiAgICAgICAgLi4ue1xuICAgICAgICAgIHZwYzogc2IuZ2V0TmV0d29yaygpIHx8IHByb3BzLnZwYyxcbiAgICAgICAgICBzZWN1cml0eUdyb3VwSWRzOiBwcm9wcz8uc2VjdXJpdHlHcm91cElkcyA/PyBbXSxcbiAgICAgICAgICBkYXRhYmFzZU5hbWU6IHByb3BzLmRhdGFiYXNlTmFtZSB8fCBgJHtpZC5yZXBsYWNlKFwiUmRzXCIsIFwiXCIpfWBcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgcmV0dXJuIG5ldyB0aGlzKHNiLmdldFN0YWNrKCksIGlkLCBuZXdQcm9wcyk7XG4gICAgfTtcbiAgfVxufVxuIl19
@@ -1,18 +1,14 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.addProxyCfnOutput = addProxyCfnOutput;
4
- const aws_cdk_lib_1 = require("aws-cdk-lib");
5
- const capitaliseString_1 = require("../../../utils/capitaliseString");
1
+ import { CfnOutput } from "aws-cdk-lib";
2
+ import { toPascalCase } from "../../../utils/capitaliseString.js";
6
3
  /**
7
4
  * Add a CfnOutput for the RDS proxy endpoint.
8
5
  * Shared by RdsAurora and RdsInstance constructs.
9
6
  */
10
- function addProxyCfnOutput(scope, constructId, databaseName, proxy) {
11
- const outputName = (0, capitaliseString_1.toPascalCase)(databaseName || constructId);
12
- new aws_cdk_lib_1.CfnOutput(scope, `${outputName}ProxyEndpointOutput`, {
7
+ export function addProxyCfnOutput(scope, constructId, databaseName, proxy) {
8
+ const outputName = toPascalCase(databaseName || constructId);
9
+ new CfnOutput(scope, `${outputName}ProxyEndpointOutput`, {
13
10
  key: `${outputName}ProxyEndpoint`,
14
11
  exportName: `${outputName}ProxyEndpoint`,
15
12
  value: proxy.endpoint
16
13
  });
17
14
  }
18
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmRzUHJveHlPdXRwdXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWIvcmVzb3VyY2VzL2F3cy9kYXRhYmFzZS9yZHNQcm94eU91dHB1dC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQVNBLDhDQVlDO0FBckJELDZDQUF3QztBQUd4QyxzRUFBK0Q7QUFFL0Q7OztHQUdHO0FBQ0gsU0FBZ0IsaUJBQWlCLENBQy9CLEtBQWdCLEVBQ2hCLFdBQW1CLEVBQ25CLFlBQWdDLEVBQ2hDLEtBQW9CO0lBRXBCLE1BQU0sVUFBVSxHQUFHLElBQUEsK0JBQVksRUFBQyxZQUFZLElBQUksV0FBVyxDQUFDLENBQUM7SUFDN0QsSUFBSSx1QkFBUyxDQUFDLEtBQUssRUFBRSxHQUFHLFVBQVUscUJBQXFCLEVBQUU7UUFDdkQsR0FBRyxFQUFFLEdBQUcsVUFBVSxlQUFlO1FBQ2pDLFVBQVUsRUFBRSxHQUFHLFVBQVUsZUFBZTtRQUN4QyxLQUFLLEVBQUUsS0FBSyxDQUFDLFFBQVE7S0FDdEIsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENmbk91dHB1dCB9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuaW1wb3J0IHR5cGUgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuaW1wb3J0IHR5cGUgeyBEYXRhYmFzZVByb3h5IH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1yZHNcIjtcbmltcG9ydCB7IHRvUGFzY2FsQ2FzZSB9IGZyb20gXCIuLi8uLi8uLi91dGlscy9jYXBpdGFsaXNlU3RyaW5nXCI7XG5cbi8qKlxuICogQWRkIGEgQ2ZuT3V0cHV0IGZvciB0aGUgUkRTIHByb3h5IGVuZHBvaW50LlxuICogU2hhcmVkIGJ5IFJkc0F1cm9yYSBhbmQgUmRzSW5zdGFuY2UgY29uc3RydWN0cy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkZFByb3h5Q2ZuT3V0cHV0KFxuICBzY29wZTogQ29uc3RydWN0LFxuICBjb25zdHJ1Y3RJZDogc3RyaW5nLFxuICBkYXRhYmFzZU5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgcHJveHk6IERhdGFiYXNlUHJveHlcbik6IHZvaWQge1xuICBjb25zdCBvdXRwdXROYW1lID0gdG9QYXNjYWxDYXNlKGRhdGFiYXNlTmFtZSB8fCBjb25zdHJ1Y3RJZCk7XG4gIG5ldyBDZm5PdXRwdXQoc2NvcGUsIGAke291dHB1dE5hbWV9UHJveHlFbmRwb2ludE91dHB1dGAsIHtcbiAgICBrZXk6IGAke291dHB1dE5hbWV9UHJveHlFbmRwb2ludGAsXG4gICAgZXhwb3J0TmFtZTogYCR7b3V0cHV0TmFtZX1Qcm94eUVuZHBvaW50YCxcbiAgICB2YWx1ZTogcHJveHkuZW5kcG9pbnRcbiAgfSk7XG59XG4iXX0=
@@ -0,0 +1,18 @@
1
+ import { Construct } from "constructs";
2
+ import { type IRole } from "aws-cdk-lib/aws-iam";
3
+ import type { IHostedZone } from "aws-cdk-lib/aws-route53";
4
+ export interface DelegationRoleProps {
5
+ readonly zoneName: string;
6
+ readonly hostedZone: IHostedZone;
7
+ readonly organisationIdExportName?: string;
8
+ readonly description?: string;
9
+ readonly costAllocationEnvironment?: string;
10
+ readonly costAllocationDomain?: string;
11
+ }
12
+ export declare class DelegationRole extends Construct {
13
+ readonly role: IRole;
14
+ readonly roleArn: string;
15
+ readonly description: string;
16
+ readonly exportName: string;
17
+ constructor(scope: Construct, id: string, props: DelegationRoleProps);
18
+ }