@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,24 +1,15 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.isGlobalAuroraDatabase = exports.isInstanceDatabase = exports.isAuroraDatabase = exports.isDynamoDBDatabase = exports.isRelationalDatabase = exports.RelationalDatabase = exports.DynamoDBDatabase = exports.DatabaseFactory = exports.DATABASE_ENGINE_CONFIG = exports.USE_CMK = exports.AWS_MANAGED = exports.isCMKRequested = exports.isAwsManagedKey = void 0;
4
- exports.getAuroraClusterEngine = getAuroraClusterEngine;
5
- exports.getInstanceEngine = getInstanceEngine;
6
- exports.getEngineConfig = getEngineConfig;
7
- const constructs_1 = require("constructs");
8
- const aws_cdk_lib_1 = require("aws-cdk-lib");
9
- const database_1 = require("../../resources/aws/database");
10
- const rdsAuroraGlobal_1 = require("../../resources/aws/database/rdsAuroraGlobal");
11
- const dynamodb_1 = require("../../resources/aws/database/dynamodb");
12
- const validationLogger_js_1 = require("../../utils/validationLogger.js");
13
- const capitaliseString_js_1 = require("../../utils/capitaliseString.js");
14
- const aws_rds_1 = require("aws-cdk-lib/aws-rds");
15
- const aws_cdk_lib_2 = require("aws-cdk-lib");
16
- var databaseTypes_1 = require("../../utils/databaseTypes");
17
- Object.defineProperty(exports, "isAwsManagedKey", { enumerable: true, get: function () { return databaseTypes_1.isAwsManagedKey; } });
18
- Object.defineProperty(exports, "isCMKRequested", { enumerable: true, get: function () { return databaseTypes_1.isCMKRequested; } });
19
- Object.defineProperty(exports, "AWS_MANAGED", { enumerable: true, get: function () { return databaseTypes_1.AWS_MANAGED; } });
20
- Object.defineProperty(exports, "USE_CMK", { enumerable: true, get: function () { return databaseTypes_1.USE_CMK; } });
21
- exports.DATABASE_ENGINE_CONFIG = Object.freeze({
1
+ import { Construct } from "constructs";
2
+ import { CfnOutput, Fn, Stack } from "aws-cdk-lib";
3
+ import { Topic } from "aws-cdk-lib/aws-sns";
4
+ import { RdsAurora, RdsInstance } from "../../resources/aws/database/index.js";
5
+ import { RdsAuroraGlobal } from "../../resources/aws/database/rdsAuroraGlobal.js";
6
+ import { DynamoDBTable } from "../../resources/aws/database/dynamodb.js";
7
+ import { FjallLogger, warnIfPropertiesIgnored } from "../../utils/validationLogger.js";
8
+ import { toPascalCase } from "../../utils/capitaliseString.js";
9
+ import { DatabaseClusterEngine, DatabaseInstanceEngine, AuroraPostgresEngineVersion, AuroraMysqlEngineVersion, PostgresEngineVersion, MysqlEngineVersion } from "aws-cdk-lib/aws-rds";
10
+ import { Duration } from "aws-cdk-lib";
11
+ export { isAwsManagedKey, isCMKRequested, AWS_MANAGED, USE_CMK } from "../../utils/databaseTypes.js";
12
+ export const DATABASE_ENGINE_CONFIG = Object.freeze({
22
13
  postgresql: {
23
14
  aurora: { version: "16.6", majorVersion: "16" },
24
15
  instance: { version: "17.5", majorVersion: "17" },
@@ -37,40 +28,40 @@ exports.DATABASE_ENGINE_CONFIG = Object.freeze({
37
28
  });
38
29
  const AURORA_ENGINE_FACTORIES = {
39
30
  postgresql: () => {
40
- const { version, majorVersion } = exports.DATABASE_ENGINE_CONFIG.postgresql.aurora;
41
- return aws_rds_1.DatabaseClusterEngine.auroraPostgres({
42
- version: aws_rds_1.AuroraPostgresEngineVersion.of(version, majorVersion)
31
+ const { version, majorVersion } = DATABASE_ENGINE_CONFIG.postgresql.aurora;
32
+ return DatabaseClusterEngine.auroraPostgres({
33
+ version: AuroraPostgresEngineVersion.of(version, majorVersion)
43
34
  });
44
35
  },
45
36
  mysql: () => {
46
- const { version, majorVersion } = exports.DATABASE_ENGINE_CONFIG.mysql.aurora;
47
- return aws_rds_1.DatabaseClusterEngine.auroraMysql({
48
- version: aws_rds_1.AuroraMysqlEngineVersion.of(version, majorVersion)
37
+ const { version, majorVersion } = DATABASE_ENGINE_CONFIG.mysql.aurora;
38
+ return DatabaseClusterEngine.auroraMysql({
39
+ version: AuroraMysqlEngineVersion.of(version, majorVersion)
49
40
  });
50
41
  }
51
42
  };
52
43
  const INSTANCE_ENGINE_FACTORIES = {
53
44
  postgresql: () => {
54
- const { version, majorVersion } = exports.DATABASE_ENGINE_CONFIG.postgresql.instance;
55
- return aws_rds_1.DatabaseInstanceEngine.postgres({
56
- version: aws_rds_1.PostgresEngineVersion.of(version, majorVersion)
45
+ const { version, majorVersion } = DATABASE_ENGINE_CONFIG.postgresql.instance;
46
+ return DatabaseInstanceEngine.postgres({
47
+ version: PostgresEngineVersion.of(version, majorVersion)
57
48
  });
58
49
  },
59
50
  mysql: () => {
60
- const { version, majorVersion } = exports.DATABASE_ENGINE_CONFIG.mysql.instance;
61
- return aws_rds_1.DatabaseInstanceEngine.mysql({
62
- version: aws_rds_1.MysqlEngineVersion.of(version, majorVersion)
51
+ const { version, majorVersion } = DATABASE_ENGINE_CONFIG.mysql.instance;
52
+ return DatabaseInstanceEngine.mysql({
53
+ version: MysqlEngineVersion.of(version, majorVersion)
63
54
  });
64
55
  }
65
56
  };
66
- function getAuroraClusterEngine(engine) {
57
+ export function getAuroraClusterEngine(engine) {
67
58
  return AURORA_ENGINE_FACTORIES[engine]();
68
59
  }
69
- function getInstanceEngine(engine) {
60
+ export function getInstanceEngine(engine) {
70
61
  return INSTANCE_ENGINE_FACTORIES[engine]();
71
62
  }
72
- function getEngineConfig(engine) {
73
- const config = exports.DATABASE_ENGINE_CONFIG[engine];
63
+ export function getEngineConfig(engine) {
64
+ const config = DATABASE_ENGINE_CONFIG[engine];
74
65
  return {
75
66
  defaultUsername: config.defaultUsername,
76
67
  sslParameters: config.sslParameters,
@@ -84,14 +75,14 @@ function validateDynamoDBProps(props) {
84
75
  // Validate provisioned capacity
85
76
  if (props.billingMode === "PROVISIONED") {
86
77
  if (!props.readCapacity || !props.writeCapacity) {
87
- validationLogger_js_1.FjallLogger.warn("'billingMode' is PROVISIONED but capacity not specified. " +
78
+ FjallLogger.warn("'billingMode' is PROVISIONED but capacity not specified. " +
88
79
  "Using default values. Consider specifying 'readCapacity' and 'writeCapacity'.");
89
80
  }
90
81
  }
91
82
  // Warn about capacity with on-demand billing
92
83
  if (props.billingMode !== "PROVISIONED") {
93
84
  if (props.readCapacity || props.writeCapacity) {
94
- validationLogger_js_1.FjallLogger.warn("'readCapacity' or 'writeCapacity' specified but 'billingMode' " +
85
+ FjallLogger.warn("'readCapacity' or 'writeCapacity' specified but 'billingMode' " +
95
86
  "is not PROVISIONED. Capacity settings will be ignored.");
96
87
  }
97
88
  }
@@ -101,7 +92,7 @@ function validateDynamoDBProps(props) {
101
92
  for (const gsi of props.globalSecondaryIndexes) {
102
93
  if (gsi.partitionKey.name === tablePartitionKey &&
103
94
  gsi.sortKey?.name === props.sortKey?.name) {
104
- validationLogger_js_1.FjallLogger.warn(`GSI '${gsi.indexName}' has the same key schema as the table. ` +
95
+ FjallLogger.warn(`GSI '${gsi.indexName}' has the same key schema as the table. ` +
105
96
  "This may not provide the query flexibility you need.");
106
97
  }
107
98
  }
@@ -119,11 +110,11 @@ function validateRelationalDatabaseProps(props) {
119
110
  "Specify the AWS region where the primary cluster will be created.");
120
111
  }
121
112
  // Instance-only options on Aurora/GlobalAurora
122
- (0, validationLogger_js_1.warnIfPropertiesIgnored)(props, ["readReplica", "multiAz", "allocatedStorage"], "Instance", "Instance database");
113
+ warnIfPropertiesIgnored(props, ["readReplica", "multiAz", "allocatedStorage"], "Instance", "Instance database");
123
114
  // Aurora-only options on Instance
124
- (0, validationLogger_js_1.warnIfPropertiesIgnored)(props, ["readers", "writer", "backupRetention"], ["Aurora", "GlobalAurora"], "Aurora database");
115
+ warnIfPropertiesIgnored(props, ["readers", "writer", "backupRetention"], ["Aurora", "GlobalAurora"], "Aurora database");
125
116
  // GlobalAurora-only options on non-global databases
126
- (0, validationLogger_js_1.warnIfPropertiesIgnored)(props, ["primaryRegion", "secondaryRegions", "enableGlobalWriteForwarding"], "GlobalAurora", "GlobalAurora database");
117
+ warnIfPropertiesIgnored(props, ["primaryRegion", "secondaryRegions", "enableGlobalWriteForwarding"], "GlobalAurora", "GlobalAurora database");
127
118
  }
128
119
  /**
129
120
  * Validates database props and logs warnings for ignored or misconfigured options.
@@ -157,7 +148,7 @@ function validateDatabaseProps(props) {
157
148
  * cache.getTableName(); // Available
158
149
  * cache.grantReadWriteData(lambda); // Available
159
150
  */
160
- class DatabaseFactory {
151
+ export class DatabaseFactory {
161
152
  static build(id, props) {
162
153
  return (app, scope) => {
163
154
  validateDatabaseProps(props);
@@ -172,7 +163,6 @@ class DatabaseFactory {
172
163
  };
173
164
  }
174
165
  }
175
- exports.DatabaseFactory = DatabaseFactory;
176
166
  /**
177
167
  * DynamoDB database wrapper implementing IDynamoDBDatabase interface.
178
168
  * Provides type-safe access to DynamoDB table operations.
@@ -184,11 +174,13 @@ exports.DatabaseFactory = DatabaseFactory;
184
174
  * }));
185
175
  * cache.grantReadWriteData(lambda);
186
176
  */
187
- class DynamoDBDatabase extends constructs_1.Construct {
177
+ export class DynamoDBDatabase extends Construct {
178
+ databaseType = "DynamoDB";
179
+ connectorType = "dynamodb";
180
+ id;
181
+ table;
188
182
  constructor(scope, id, props) {
189
183
  super(scope, id);
190
- this.databaseType = "DynamoDB";
191
- this.connectorType = "dynamodb";
192
184
  this.id = id;
193
185
  const tableProps = {
194
186
  partitionKey: props.partitionKey,
@@ -203,7 +195,7 @@ class DynamoDBDatabase extends constructs_1.Construct {
203
195
  encryption: props.encryption,
204
196
  removalPolicy: props.removalPolicy
205
197
  };
206
- this.table = new dynamodb_1.DynamoDBTable(this, id, tableProps);
198
+ this.table = new DynamoDBTable(this, id, tableProps);
207
199
  }
208
200
  getTableName() {
209
201
  return this.table.getTableName();
@@ -233,7 +225,6 @@ class DynamoDBDatabase extends constructs_1.Construct {
233
225
  return this.table.grantStreamRead(grantee);
234
226
  }
235
227
  }
236
- exports.DynamoDBDatabase = DynamoDBDatabase;
237
228
  /**
238
229
  * Relational database wrapper implementing IRelationalDatabase interface.
239
230
  * Supports Aurora, RDS Instance, and GlobalAurora database types.
@@ -245,10 +236,17 @@ exports.DynamoDBDatabase = DynamoDBDatabase;
245
236
  * }));
246
237
  * db.grantConnect(lambda);
247
238
  */
248
- class RelationalDatabase extends constructs_1.Construct {
239
+ export class RelationalDatabase extends Construct {
240
+ id;
241
+ scope;
242
+ vpc;
243
+ databaseType;
244
+ connectorType = "relational";
245
+ connections;
246
+ _databaseName;
247
+ database;
249
248
  constructor(scope, id, props) {
250
249
  super(scope, id);
251
- this.connectorType = "relational";
252
250
  this.id = id;
253
251
  this.scope = scope;
254
252
  this.databaseType = props.type;
@@ -259,6 +257,17 @@ class RelationalDatabase extends constructs_1.Construct {
259
257
  this._databaseName = props.databaseName;
260
258
  this.addDatabase(props);
261
259
  }
260
+ resolveAlertsTopic(alertsTopic) {
261
+ if (alertsTopic === undefined)
262
+ return undefined;
263
+ if (typeof alertsTopic === "string") {
264
+ const arn = alertsTopic.startsWith("import:")
265
+ ? Fn.importValue(alertsTopic.slice("import:".length))
266
+ : alertsTopic;
267
+ return Topic.fromTopicArn(this, "AlertsTopic", arn);
268
+ }
269
+ return alertsTopic;
270
+ }
262
271
  addDatabase(props) {
263
272
  switch (props.type) {
264
273
  case "Aurora":
@@ -283,10 +292,10 @@ class RelationalDatabase extends constructs_1.Construct {
283
292
  const resolvedEngine = props.engine ?? getAuroraClusterEngine(resolvedDatabaseEngine);
284
293
  const engineConfig = getEngineConfig(resolvedDatabaseEngine);
285
294
  if (props.publiclyAccessible) {
286
- validationLogger_js_1.FjallLogger.warn(`Aurora database '${props.databaseName}' is configured with public accessibility. ` +
295
+ FjallLogger.warn(`Aurora database '${props.databaseName}' is configured with public accessibility. ` +
287
296
  "This is a security risk and should only be used for development.");
288
297
  }
289
- this.database = new database_1.RdsAurora(this, `${props.databaseName}Rds`, {
298
+ this.database = new RdsAurora(this, `${props.databaseName}Rds`, {
290
299
  vpc: props.vpc,
291
300
  databaseName: props.databaseName,
292
301
  engine: resolvedEngine,
@@ -306,7 +315,10 @@ class RelationalDatabase extends constructs_1.Construct {
306
315
  snapshotUsername: props.snapshotUsername,
307
316
  allowVpcAccess: props.allowVpcAccess,
308
317
  publiclyAccessible: props.publiclyAccessible,
309
- allowedIpCidr: props.allowedIpCidr
318
+ allowedIpCidr: props.allowedIpCidr,
319
+ alertsTopic: this.resolveAlertsTopic(props.alertsTopic),
320
+ alarms: props.alarms,
321
+ applicationId: props.applicationId
310
322
  });
311
323
  this.connections = this.database.connections;
312
324
  this.addDatabaseOutputs(props);
@@ -319,7 +331,7 @@ class RelationalDatabase extends constructs_1.Construct {
319
331
  const resolvedDatabaseEngine = props.databaseEngine ?? "postgresql";
320
332
  const resolvedEngine = props.engine ?? getAuroraClusterEngine(resolvedDatabaseEngine);
321
333
  const engineConfig = getEngineConfig(resolvedDatabaseEngine);
322
- this.database = new rdsAuroraGlobal_1.RdsAuroraGlobal(this, `${props.databaseName}RdsGlobal`, {
334
+ this.database = new RdsAuroraGlobal(this, `${props.databaseName}RdsGlobal`, {
323
335
  vpc: props.vpc,
324
336
  databaseName: props.databaseName,
325
337
  primaryRegion: props.primaryRegion,
@@ -351,7 +363,7 @@ class RelationalDatabase extends constructs_1.Construct {
351
363
  const resolvedDatabaseEngine = props.databaseEngine ?? "postgresql";
352
364
  const resolvedEngine = props.engine ?? getInstanceEngine(resolvedDatabaseEngine);
353
365
  const engineConfig = getEngineConfig(resolvedDatabaseEngine);
354
- this.database = new database_1.RdsInstance(this, `${props.databaseName}Rds`, {
366
+ this.database = new RdsInstance(this, `${props.databaseName}Rds`, {
355
367
  vpc: props.vpc,
356
368
  databaseName: props.databaseName,
357
369
  instanceType: props.instanceType,
@@ -361,7 +373,7 @@ class RelationalDatabase extends constructs_1.Construct {
361
373
  engineConfig,
362
374
  multiAz: props.multiAz,
363
375
  backupRetention: props.backupRetention !== undefined
364
- ? aws_cdk_lib_2.Duration.days(props.backupRetention)
376
+ ? Duration.days(props.backupRetention)
365
377
  : undefined,
366
378
  databaseInsights: props.databaseInsights,
367
379
  proxy: props.proxy,
@@ -371,36 +383,39 @@ class RelationalDatabase extends constructs_1.Construct {
371
383
  publiclyAccessible: props.publiclyAccessible,
372
384
  deletionProtection: props.deletionProtection,
373
385
  snapshotIdentifier: props.snapshotIdentifier,
374
- snapshotUsername: props.snapshotUsername
386
+ snapshotUsername: props.snapshotUsername,
387
+ alertsTopic: this.resolveAlertsTopic(props.alertsTopic),
388
+ alarms: props.alarms,
389
+ applicationId: props.applicationId
375
390
  });
376
391
  this.connections = this.database.connections;
377
392
  this.addDatabaseOutputs(props);
378
393
  }
379
394
  addDatabaseOutputs(props) {
380
395
  const endpoint = this.database.getHostEndpoint();
381
- const stackName = aws_cdk_lib_1.Stack.of(this).stackName;
396
+ const stackName = Stack.of(this).stackName;
382
397
  // Sanitise for CfnOutput names — CloudFormation export names only allow [a-zA-Z0-9:-]
383
- const outputName = (0, capitaliseString_js_1.toPascalCase)(props.databaseName);
384
- new aws_cdk_lib_1.CfnOutput(this, `${outputName}Endpoint`, {
398
+ const outputName = toPascalCase(props.databaseName);
399
+ new CfnOutput(this, `${outputName}Endpoint`, {
385
400
  key: `${stackName}${outputName}Endpoint`,
386
401
  exportName: `${stackName}${outputName}Endpoint`,
387
402
  value: endpoint,
388
403
  description: `Database Endpoint for ${props.databaseName}`
389
404
  });
390
- new aws_cdk_lib_1.CfnOutput(this, `${outputName}Port`, {
405
+ new CfnOutput(this, `${outputName}Port`, {
391
406
  key: `${stackName}${outputName}Port`,
392
407
  exportName: `${stackName}${outputName}Port`,
393
408
  value: this.database.getHostPort(),
394
409
  description: `Database Port for ${props.databaseName}`
395
410
  });
396
- new aws_cdk_lib_1.CfnOutput(this, `${outputName}DatabaseName`, {
411
+ new CfnOutput(this, `${outputName}DatabaseName`, {
397
412
  key: `${stackName}${outputName}DatabaseName`,
398
413
  exportName: `${stackName}${outputName}DatabaseName`,
399
414
  value: props.databaseName,
400
415
  description: `Database Name for ${props.databaseName}`
401
416
  });
402
417
  const credentials = this.database.getCredentials();
403
- new aws_cdk_lib_1.CfnOutput(this, `${outputName}SecretArn`, {
418
+ new CfnOutput(this, `${outputName}SecretArn`, {
404
419
  key: `${stackName}${outputName}SecretArn`,
405
420
  exportName: `${stackName}${outputName}SecretArn`,
406
421
  value: credentials.secret.secretArn,
@@ -427,12 +442,5 @@ class RelationalDatabase extends constructs_1.Construct {
427
442
  this.connections.allowDefaultPortFrom(grantee);
428
443
  }
429
444
  }
430
- exports.RelationalDatabase = RelationalDatabase;
431
445
  // Re-export interface types
432
- var database_js_1 = require("./interfaces/database.js");
433
- Object.defineProperty(exports, "isRelationalDatabase", { enumerable: true, get: function () { return database_js_1.isRelationalDatabase; } });
434
- Object.defineProperty(exports, "isDynamoDBDatabase", { enumerable: true, get: function () { return database_js_1.isDynamoDBDatabase; } });
435
- Object.defineProperty(exports, "isAuroraDatabase", { enumerable: true, get: function () { return database_js_1.isAuroraDatabase; } });
436
- Object.defineProperty(exports, "isInstanceDatabase", { enumerable: true, get: function () { return database_js_1.isInstanceDatabase; } });
437
- Object.defineProperty(exports, "isGlobalAuroraDatabase", { enumerable: true, get: function () { return database_js_1.isGlobalAuroraDatabase; } });
438
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YWJhc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9saWIvcGF0dGVybnMvYXdzL2RhdGFiYXNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQTRJQSx3REFFQztBQUVELDhDQUVDO0FBRUQsMENBT0M7QUEzSkQsMkNBQXVDO0FBQ3ZDLDZDQUErQztBQUcvQywyREFBc0U7QUFDdEUsa0ZBQStFO0FBQy9FLG9FQUsrQztBQUMvQyx5RUFHeUM7QUFDekMseUVBQStEO0FBb0IvRCxpREFTNkI7QUFDN0IsNkNBQXVDO0FBZXZDLDJEQWtCbUM7QUFKakMsZ0hBQUEsZUFBZSxPQUFBO0FBQ2YsK0dBQUEsY0FBYyxPQUFBO0FBQ2QsNEdBQUEsV0FBVyxPQUFBO0FBQ1gsd0dBQUEsT0FBTyxPQUFBO0FBR0ksUUFBQSxzQkFBc0IsR0FTL0IsTUFBTSxDQUFDLE1BQU0sQ0FBQztJQUNoQixVQUFVLEVBQUU7UUFDVixNQUFNLEVBQUUsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUU7UUFDL0MsUUFBUSxFQUFFLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFO1FBQ2pELGVBQWUsRUFBRSxVQUFVO1FBQzNCLGFBQWEsRUFBRSxFQUFFLGVBQWUsRUFBRSxHQUFHLEVBQUU7UUFDdkMsZUFBZSxFQUFFLDhDQUE4QztLQUNoRTtJQUNELEtBQUssRUFBRTtRQUNMLHdFQUF3RTtRQUN4RSxNQUFNLEVBQUUsRUFBRSxPQUFPLEVBQUUseUJBQXlCLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRTtRQUN0RSxRQUFRLEVBQUUsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUU7UUFDbkQsZUFBZSxFQUFFLE9BQU87UUFDeEIsYUFBYSxFQUFFLEVBQUUsd0JBQXdCLEVBQUUsSUFBSSxFQUFFO1FBQ2pELGVBQWUsRUFBRSx5Q0FBeUM7S0FDM0Q7Q0FD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QUFDO0lBQ2pELENBQUM7Q0FDRjtBQWxPRCxnREFrT0M7QUFTRCw0QkFBNEI7QUFDNUIsd0RBV2tDO0FBTGhDLG1IQUFBLG9CQUFvQixPQUFBO0FBQ3BCLGlIQUFBLGtCQUFrQixPQUFBO0FBQ2xCLCtHQUFBLGdCQUFnQixPQUFBO0FBQ2hCLGlIQUFBLGtCQUFrQixPQUFBO0FBQ2xCLHFIQUFBLHNCQUFzQixPQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB7IENmbk91dHB1dCwgU3RhY2sgfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcblxuaW1wb3J0IHR5cGUgQXBwIGZyb20gXCIuLi8uLi9hcHBcIjtcbmltcG9ydCB7IFJkc0F1cm9yYSwgUmRzSW5zdGFuY2UgfSBmcm9tIFwiLi4vLi4vcmVzb3VyY2VzL2F3cy9kYXRhYmFzZVwiO1xuaW1wb3J0IHsgUmRzQXVyb3JhR2xvYmFsIH0gZnJvbSBcIi4uLy4uL3Jlc291cmNlcy9hd3MvZGF0YWJhc2UvcmRzQXVyb3JhR2xvYmFsXCI7XG5pbXBvcnQge1xuICBEeW5hbW9EQlRhYmxlLFxuICB0eXBlIER5bmFtb0RCS2V5U2NoZW1hLFxuICB0eXBlIER5bmFtb0RCR2xvYmFsU2Vjb25kYXJ5SW5kZXgsXG4gIHR5cGUgRHluYW1vREJUYWJsZVByb3BzXG59IGZyb20gXCIuLi8uLi9yZXNvdXJjZXMvYXdzL2RhdGFiYXNlL2R5bmFtb2RiXCI7XG5pbXBvcnQge1xuICBGamFsbExvZ2dlcixcbiAgd2FybklmUHJvcGVydGllc0lnbm9yZWRcbn0gZnJvbSBcIi4uLy4uL3V0aWxzL3ZhbGlkYXRpb25Mb2dnZXIuanNcIjtcbmltcG9ydCB7IHRvUGFzY2FsQ2FzZSB9IGZyb20gXCIuLi8uLi91dGlscy9jYXBpdGFsaXNlU3RyaW5nLmpzXCI7XG5cbmltcG9ydCB7XG4gIHR5cGUgQ29ubmVjdGlvbnMsXG4gIHR5cGUgSUNvbm5lY3RhYmxlLFxuICB0eXBlIElWcGNcbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1lYzJcIjtcbmltcG9ydCB7IHR5cGUgSVRhYmxlIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1keW5hbW9kYlwiO1xuaW1wb3J0IHsgdHlwZSBTZWNyZXQgfSBmcm9tIFwiLi4vLi4vcmVzb3VyY2VzL2F3cy9zZWNyZXRzXCI7XG5pbXBvcnQgeyB0eXBlIElHcmFudGFibGUsIHR5cGUgR3JhbnQgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWlhbVwiO1xuaW1wb3J0IHtcbiAgdHlwZSBJUmVsYXRpb25hbERhdGFiYXNlLFxuICB0eXBlIElEeW5hbW9EQkRhdGFiYXNlLFxuICB0eXBlIEFueURhdGFiYXNlLFxuICB0eXBlIFJlbGF0aW9uYWxEYXRhYmFzZVR5cGVcbn0gZnJvbSBcIi4vaW50ZXJmYWNlcy9kYXRhYmFzZS5qc1wiO1xuaW1wb3J0IHtcbiAgdHlwZSBJRHluYW1vREJDb25uZWN0b3IsXG4gIHR5cGUgSVNlY3VyaXR5R3JvdXBDb25uZWN0b3Jcbn0gZnJvbSBcIi4vaW50ZXJmYWNlcy9jb25uZWN0b3IuanNcIjtcbmltcG9ydCB7XG4gIHR5cGUgSUluc3RhbmNlRW5naW5lLFxuICB0eXBlIElDbHVzdGVyRW5naW5lLFxuICBEYXRhYmFzZUNsdXN0ZXJFbmdpbmUsXG4gIERhdGFiYXNlSW5zdGFuY2VFbmdpbmUsXG4gIEF1cm9yYVBvc3RncmVzRW5naW5lVmVyc2lvbixcbiAgQXVyb3JhTXlzcWxFbmdpbmVWZXJzaW9uLFxuICBQb3N0Z3Jlc0VuZ2luZVZlcnNpb24sXG4gIE15c3FsRW5naW5lVmVyc2lvblxufSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXJkc1wiO1xuaW1wb3J0IHsgRHVyYXRpb24gfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcbmltcG9ydCB7XG4gIHR5cGUgRGF0YWJhc2VFbmdpbmUsXG4gIHR5cGUgRW5naW5lQ29uZmlnLFxuICB0eXBlIFByb3h5Q29uZmlnLFxuICB0eXBlIFJlYWRSZXBsaWNhQ29uZmlnLFxuICB0eXBlIENyZWRlbnRpYWxzQ29uZmlnLFxuICB0eXBlIEVuY3J5cHRpb25Db25maWcsXG4gIHR5cGUgRGF0YWJhc2VJbnNpZ2h0c0NvbmZpZyxcbiAgdHlwZSBBdXJvcmFFbmNyeXB0aW9uQ29uZmlnLFxuICB0eXBlIEF1cm9yYVdyaXRlckNvbmZpZyxcbiAgdHlwZSBBdXJvcmFSZWFkZXJzQ29uZmlnXG59IGZyb20gXCIuLi8uLi91dGlscy9kYXRhYmFzZVR5cGVzXCI7XG5cbmV4cG9ydCB0eXBlIHsgRGF0YWJhc2VFbmdpbmUsIEVuZ2luZUNvbmZpZyB9IGZyb20gXCIuLi8uLi91dGlscy9kYXRhYmFzZVR5cGVzXCI7XG5leHBvcnQge1xuICB0eXBlIFByb3h5Q29uZmlnLFxuICB0eXBlIFJlYWRSZXBsaWNhQ29uZmlnLFxuICB0eXBlIENyZWRlbnRpYWxzQ29uZmlnLFxuICB0eXBlIFNlY3JldFJvdGF0aW9uQ29uZmlnLFxuICB0eXBlIEVuY3J5cHRpb25Db25maWcsXG4gIHR5cGUgRGF0YWJhc2VJbnNpZ2h0c0NvbmZpZyxcbiAgdHlwZSBBd3NNYW5hZ2VkS2V5LFxuICB0eXBlIEN1c3RvbWVyTWFuYWdlZEtleU1hcmtlcixcbiAgdHlwZSBFbmNyeXB0aW9uS2V5U3BlYyxcbiAgdHlwZSBBdXJvcmFFbmNyeXB0aW9uQ29uZmlnLFxuICB0eXBlIEF1cm9yYVJlYWRlckNvbmZpZyxcbiAgdHlwZSBBdXJvcmFXcml0ZXJDb25maWcsXG4gIHR5cGUgQXVyb3JhUmVhZGVyc0NvbmZpZyxcbiAgaXNBd3NNYW5hZ2VkS2V5LFxuICBpc0NNS1JlcXVlc3RlZCxcbiAgQVdTX01BTkFHRUQsXG4gIFVTRV9DTUtcbn0gZnJvbSBcIi4uLy4uL3V0aWxzL2RhdGFiYXNlVHlwZXNcIjtcblxuZXhwb3J0IGNvbnN0IERBVEFCQVNFX0VOR0lORV9DT05GSUc6IFJlY29yZDxcbiAgRGF0YWJhc2VFbmdpbmUsXG4gIHtcbiAgICBhdXJvcmE6IHsgdmVyc2lvbjogc3RyaW5nOyBtYWpvclZlcnNpb246IHN0cmluZyB9O1xuICAgIGluc3RhbmNlOiB7IHZlcnNpb246IHN0cmluZzsgbWFqb3JWZXJzaW9uOiBzdHJpbmcgfTtcbiAgICBkZWZhdWx0VXNlcm5hbWU6IHN0cmluZztcbiAgICBzc2xQYXJhbWV0ZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAgIHJvdGF0aW9uQXBwTmFtZTogc3RyaW5nO1xuICB9XG4+ID0gT2JqZWN0LmZyZWV6ZSh7XG4gIHBvc3RncmVzcWw6IHtcbiAgICBhdXJvcmE6IHsgdmVyc2lvbjogXCIxNi42XCIsIG1ham9yVmVyc2lvbjogXCIxNlwiIH0sXG4gICAgaW5zdGFuY2U6IHsgdmVyc2lvbjogXCIxNy41XCIsIG1ham9yVmVyc2lvbjogXCIxN1wiIH0sXG4gICAgZGVmYXVsdFVzZXJuYW1lOiBcInBvc3RncmVzXCIsXG4gICAgc3NsUGFyYW1ldGVyczogeyBcInJkcy5mb3JjZV9zc2xcIjogXCIxXCIgfSxcbiAgICByb3RhdGlvbkFwcE5hbWU6IFwiU2VjcmV0c01hbmFnZXJSRFNQb3N0Z3JlU1FMUm90YXRpb25NdWx0aVVzZXJcIlxuICB9LFxuICBteXNxbDoge1xuICAgIC8vIG1ham9yVmVyc2lvbiBtdXN0IGJlIEF1cm9yYSB2ZXJzaW9uICgzLjA4LjApLCBOT1QgTXlTUUwgdmVyc2lvbiAoOC4wKVxuICAgIGF1cm9yYTogeyB2ZXJzaW9uOiBcIjguMC5teXNxbF9hdXJvcmEuMy4wOC4wXCIsIG1ham9yVmVyc2lvbjogXCIzLjA4LjBcIiB9LFxuICAgIGluc3RhbmNlOiB7IHZlcnNpb246IFwiOC40LjRcIiwgbWFqb3JWZXJzaW9uOiBcIjguNFwiIH0sXG4gICAgZGVmYXVsdFVzZXJuYW1lOiBcImFkbWluXCIsXG4gICAgc3NsUGFyYW1ldGVyczogeyByZXF1aXJlX3NlY3VyZV90cmFuc3BvcnQ6IFwiT05cIiB9LFxuICAgIHJvdGF0aW9uQXBwTmFtZTogXCJTZWNyZXRzTWFuYWdlclJEU015U1FMUm90YXRpb25NdWx0aVVzZXJcIlxuICB9XG59KTtcblxuY29uc3QgQVVST1JBX0VOR0lORV9GQUNUT1JJRVM6IFJlY29yZDxEYXRhYmFzZUVuZ2luZSwgKCkgPT4gSUNsdXN0ZXJFbmdpbmU+ID0ge1xuICBwb3N0Z3Jlc3FsOiAoKSA9PiB7XG4gICAgY29uc3QgeyB2ZXJzaW9uLCBtYWpvclZlcnNpb24gfSA9IERBVEFCQVNFX0VOR0lORV9DT05GSUcucG9zdGdyZXNxbC5hdXJvcmE7XG4gICAgcmV0dXJuIERhdGFiYXNlQ2x1c3RlckVuZ2luZS5hdXJvcmFQb3N0Z3Jlcyh7XG4gICAgICB2ZXJzaW9uOiBBdXJvcmFQb3N0Z3Jlc0VuZ2luZVZlcnNpb24ub2YodmVyc2lvbiwgbWFqb3JWZXJzaW9uKVxuICAgIH0pO1xuICB9LFxuICBteXNxbDogKCkgPT4ge1xuICAgIGNvbnN0IHsgdmVyc2lvbiwgbWFqb3JWZXJzaW9uIH0gPSBEQVRBQkFTRV9FTkdJTkVfQ09ORklHLm15c3FsLmF1cm9yYTtcbiAgICByZXR1cm4gRGF0YWJhc2VDbHVzdGVyRW5naW5lLmF1cm9yYU15c3FsKHtcbiAgICAgIHZlcnNpb246IEF1cm9yYU15c3FsRW5naW5lVmVyc2lvbi5vZih2ZXJzaW9uLCBtYWpvclZlcnNpb24pXG4gICAgfSk7XG4gIH1cbn07XG5cbmNvbnN0IElOU1RBTkNFX0VOR0lORV9GQUNUT1JJRVM6IFJlY29yZDxEYXRhYmFzZUVuZ2luZSwgKCkgPT4gSUluc3RhbmNlRW5naW5lPiA9XG4gIHtcbiAgICBwb3N0Z3Jlc3FsOiAoKSA9PiB7XG4gICAgICBjb25zdCB7IHZlcnNpb24sIG1ham9yVmVyc2lvbiB9ID1cbiAgICAgICAgREFUQUJBU0VfRU5HSU5FX0NPTkZJRy5wb3N0Z3Jlc3FsLmluc3RhbmNlO1xuICAgICAgcmV0dXJuIERhdGFiYXNlSW5zdGFuY2VFbmdpbmUucG9zdGdyZXMoe1xuICAgICAgICB2ZXJzaW9uOiBQb3N0Z3Jlc0VuZ2luZVZlcnNpb24ub2YodmVyc2lvbiwgbWFqb3JWZXJzaW9uKVxuICAgICAgfSk7XG4gICAgfSxcbiAgICBteXNxbDogKCkgPT4ge1xuICAgICAgY29uc3QgeyB2ZXJzaW9uLCBtYWpvclZlcnNpb24gfSA9IERBVEFCQVNFX0VOR0lORV9DT05GSUcubXlzcWwuaW5zdGFuY2U7XG4gICAgICByZXR1cm4gRGF0YWJhc2VJbnN0YW5jZUVuZ2luZS5teXNxbCh7XG4gICAgICAgIHZlcnNpb246IE15c3FsRW5naW5lVmVyc2lvbi5vZih2ZXJzaW9uLCBtYWpvclZlcnNpb24pXG4gICAgICB9KTtcbiAgICB9XG4gIH07XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRBdXJvcmFDbHVzdGVyRW5naW5lKGVuZ2luZTogRGF0YWJhc2VFbmdpbmUpOiBJQ2x1c3RlckVuZ2luZSB7XG4gIHJldHVybiBBVVJPUkFfRU5HSU5FX0ZBQ1RPUklFU1tlbmdpbmVdKCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRJbnN0YW5jZUVuZ2luZShlbmdpbmU6IERhdGFiYXNlRW5naW5lKTogSUluc3RhbmNlRW5naW5lIHtcbiAgcmV0dXJuIElOU1RBTkNFX0VOR0lORV9GQUNUT1JJRVNbZW5naW5lXSgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RW5naW5lQ29uZmlnKGVuZ2luZTogRGF0YWJhc2VFbmdpbmUpOiBFbmdpbmVDb25maWcge1xuICBjb25zdCBjb25maWcgPSBEQVRBQkFTRV9FTkdJTkVfQ09ORklHW2VuZ2luZV07XG4gIHJldHVybiB7XG4gICAgZGVmYXVsdFVzZXJuYW1lOiBjb25maWcuZGVmYXVsdFVzZXJuYW1lLFxuICAgIHNzbFBhcmFtZXRlcnM6IGNvbmZpZy5zc2xQYXJhbWV0ZXJzLFxuICAgIHJvdGF0aW9uQXBwTmFtZTogY29uZmlnLnJvdGF0aW9uQXBwTmFtZVxuICB9O1xufVxuXG4vKipcbiAqIEJhc2UgcHJvcHMgZm9yIGRhdGFiYXNlIGNvbmZpZ3VyYXRpb24uXG4gKi9cbnR5cGUgQmFzZURhdGFiYXNlUHJvcHMgPSB7XG4gIHZwYz86IElWcGM7XG4gIGRhdGFiYXNlTmFtZTogc3RyaW5nO1xuICBpbnN0YW5jZVR5cGU/OiBzdHJpbmc7XG4gIGRlbGV0aW9uUHJvdGVjdGlvbj86IGJvb2xlYW47XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIEF1cm9yYURhdGFiYXNlUHJvcHMgZXh0ZW5kcyBCYXNlRGF0YWJhc2VQcm9wcyB7XG4gIHR5cGU6IFwiQXVyb3JhXCI7XG4gIGRhdGFiYXNlRW5naW5lPzogRGF0YWJhc2VFbmdpbmU7XG4gIC8qKiBPdmVycmlkZXMgZGF0YWJhc2VFbmdpbmUgaWYgcHJvdmlkZWQgKi9cbiAgZW5naW5lPzogSUNsdXN0ZXJFbmdpbmU7XG4gIHdyaXRlcj86IEF1cm9yYVdyaXRlckNvbmZpZztcbiAgcmVhZGVycz86IEF1cm9yYVJlYWRlcnNDb25maWcgfCBmYWxzZTtcbiAgcHJveHk/OiBQcm94eUNvbmZpZyB8IGZhbHNlO1xuICBjcmVkZW50aWFscz86IENyZWRlbnRpYWxzQ29uZmlnO1xuICAvKiogREVTVFJVQ1RJVkU6IENoYW5naW5nIHN0b3JhZ2VLZXkgY2F1c2VzIGNsdXN0ZXIgcmVwbGFjZW1lbnQgKi9cbiAgZW5jcnlwdGlvbj86IEF1cm9yYUVuY3J5cHRpb25Db25maWc7XG4gIGJhY2t1cFJldGVudGlvbj86IG51bWJlcjtcbiAgbW9uaXRvcmluZ0ludGVydmFsPzogRHVyYXRpb247XG4gIHByZWZlcnJlZE1haW50ZW5hbmNlV2luZG93Pzogc3RyaW5nO1xuICBwb3J0PzogbnVtYmVyO1xuICBkYXRhYmFzZUluc2lnaHRzPzogRGF0YWJhc2VJbnNpZ2h0c0NvbmZpZyB8IGZhbHNlO1xuICAvKiogQVJOIG9yIGlkZW50aWZpZXIgb2YgREIgY2x1c3RlciBzbmFwc2hvdCB0byByZXN0b3JlIGZyb20gKi9cbiAgc25hcHNob3RJZGVudGlmaWVyPzogc3RyaW5nO1xuICAvKiogVXNlcm5hbWUgZnJvbSB0aGUgc25hcHNob3QgKHJlcXVpcmVkIHdoZW4gcmVzdG9yaW5nIGZyb20gc25hcHNob3QgdG8gcmVzZXQgcGFzc3dvcmQpICovXG4gIHNuYXBzaG90VXNlcm5hbWU/OiBzdHJpbmc7XG4gIC8qKiBBbGxvdyBhY2Nlc3MgZnJvbSBWUEMgQ0lEUiAoYXZvaWRzIGNyb3NzLXN0YWNrIGN5Y2xpYyBkZXBlbmRlbmNpZXMgd2l0aCBMYW1iZGEpICovXG4gIGFsbG93VnBjQWNjZXNzPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIE1ha2UgZGF0YWJhc2UgcHVibGljbHkgYWNjZXNzaWJsZSBmcm9tIHRoZSBpbnRlcm5ldC5cbiAgICogV0FSTklORzogVGhpcyBpcyBhIHNlY3VyaXR5IHJpc2sgYW5kIHNob3VsZCBvbmx5IGJlIHVzZWQgZm9yIGRldmVsb3BtZW50XG4gICAqIG9yIHdoZW4gYnVpbGRpbmcgUGF5bG9hZCBhcHBzIGxvY2FsbHkgdGhhdCBuZWVkIGRhdGFiYXNlIGFjY2Vzcy5cbiAgICogV2hlbiBlbmFibGVkLCB0aGUgZGF0YWJhc2UgaXMgcGxhY2VkIGluIHB1YmxpYyBzdWJuZXRzLlxuICAgKi9cbiAgcHVibGljbHlBY2Nlc3NpYmxlPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIElQIGFkZHJlc3MgdG8gYWxsb3cgYWNjZXNzIGZyb20gd2hlbiBwdWJsaWNseUFjY2Vzc2libGUgaXMgdHJ1ZS5cbiAgICogSWYgbm90IHNwZWNpZmllZCwgYWNjZXNzIGlzIHJlc3RyaWN0ZWQgdG8gVlBDIG9ubHkgZXZlbiB3aGVuIHB1YmxpYy5cbiAgICogRm9ybWF0OiBDSURSIG5vdGF0aW9uIChlLmcuLCBcIjIwMy4wLjExMy4wLzMyXCIgZm9yIHNpbmdsZSBJUClcbiAgICovXG4gIGFsbG93ZWRJcENpZHI/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2xvYmFsQXVyb3JhRGF0YWJhc2VQcm9wcyBleHRlbmRzIEJhc2VEYXRhYmFzZVByb3BzIHtcbiAgdHlwZTogXCJHbG9iYWxBdXJvcmFcIjtcbiAgcHJpbWFyeVJlZ2lvbjogc3RyaW5nO1xuICBzZWNvbmRhcnlSZWdpb25zPzogc3RyaW5nW107XG4gIGdsb2JhbENsdXN0ZXJJZGVudGlmaWVyPzogc3RyaW5nO1xuICBlbmFibGVHbG9iYWxXcml0ZUZvcndhcmRpbmc/OiBib29sZWFuO1xuICBkYXRhYmFzZUVuZ2luZT86IERhdGFiYXNlRW5naW5lO1xuICAvKiogT3ZlcnJpZGVzIGRhdGFiYXNlRW5naW5lIGlmIHByb3ZpZGVkICovXG4gIGVuZ2luZT86IElDbHVzdGVyRW5naW5lO1xuICB3cml0ZXI/OiBBdXJvcmFXcml0ZXJDb25maWc7XG4gIHJlYWRlcnM/OiBBdXJvcmFSZWFkZXJzQ29uZmlnIHwgZmFsc2U7XG4gIHByb3h5PzogUHJveHlDb25maWcgfCBmYWxzZTtcbiAgY3JlZGVudGlhbHM/OiBDcmVkZW50aWFsc0NvbmZpZztcbiAgLyoqIERFU1RSVUNUSVZFOiBDaGFuZ2luZyBzdG9yYWdlS2V5IGNhdXNlcyBjbHVzdGVyIHJlcGxhY2VtZW50ICovXG4gIGVuY3J5cHRpb24/OiBBdXJvcmFFbmNyeXB0aW9uQ29uZmlnO1xuICBiYWNrdXBSZXRlbnRpb24/OiBudW1iZXI7XG4gIG1vbml0b3JpbmdJbnRlcnZhbD86IER1cmF0aW9uO1xuICBwcmVmZXJyZWRNYWludGVuYW5jZVdpbmRvdz86IHN0cmluZztcbiAgcG9ydD86IG51bWJlcjtcbiAgZGF0YWJhc2VJbnNpZ2h0cz86IERhdGFiYXNlSW5zaWdodHNDb25maWcgfCBmYWxzZTtcbiAgLyoqIEFSTiBvciBpZGVudGlmaWVyIG9mIERCIGNsdXN0ZXIgc25hcHNob3QgdG8gcmVzdG9yZSBmcm9tICovXG4gIHNuYXBzaG90SWRlbnRpZmllcj86IHN0cmluZztcbiAgLyoqIFVzZXJuYW1lIGZyb20gdGhlIHNuYXBzaG90IChyZXF1aXJlZCB3aGVuIHJlc3RvcmluZyBmcm9tIHNuYXBzaG90IHRvIHJlc2V0IHBhc3N3b3JkKSAqL1xuICBzbmFwc2hvdFVzZXJuYW1lPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEluc3RhbmNlRGF0YWJhc2VQcm9wcyBleHRlbmRzIEJhc2VEYXRhYmFzZVByb3BzIHtcbiAgdHlwZTogXCJJbnN0YW5jZVwiO1xuICBkYXRhYmFzZUVuZ2luZT86IERhdGFiYXNlRW5naW5lO1xuICAvKiogT3ZlcnJpZGVzIGRhdGFiYXNlRW5naW5lIGlmIHByb3ZpZGVkICovXG4gIGVuZ2luZT86IElJbnN0YW5jZUVuZ2luZTtcbiAgYWxsb2NhdGVkU3RvcmFnZT86IG51bWJlcjtcbiAgcG9ydD86IG51bWJlcjtcbiAgbXVsdGlBej86IGJvb2xlYW47XG4gIGJhY2t1cFJldGVudGlvbj86IG51bWJlcjtcbiAgZGF0YWJhc2VJbnNpZ2h0cz86IERhdGFiYXNlSW5zaWdodHNDb25maWcgfCBmYWxzZTtcbiAgcHJveHk/OiBQcm94eUNvbmZpZyB8IGZhbHNlO1xuICByZWFkUmVwbGljYT86IFJlYWRSZXBsaWNhQ29uZmlnIHwgZmFsc2U7XG4gIGNyZWRlbnRpYWxzPzogQ3JlZGVudGlhbHNDb25maWc7XG4gIGVuY3J5cHRpb24/OiBFbmNyeXB0aW9uQ29uZmlnO1xuICBwdWJsaWNseUFjY2Vzc2libGU/OiBib29sZWFuO1xuICAvKiogQVJOIG9yIGlkZW50aWZpZXIgb2YgREIgaW5zdGFuY2Ugc25hcHNob3QgdG8gcmVzdG9yZSBmcm9tICovXG4gIHNuYXBzaG90SWRlbnRpZmllcj86IHN0cmluZztcbiAgLyoqIFVzZXJuYW1lIGZyb20gdGhlIHNuYXBzaG90IChyZXF1aXJlZCB3aGVuIHJlc3RvcmluZyBmcm9tIHNuYXBzaG90IHRvIHJlc2V0IHBhc3N3b3JkKSAqL1xuICBzbmFwc2hvdFVzZXJuYW1lPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIER5bmFtb0RCIHRhYmxlIGNvbmZpZ3VyYXRpb24gcHJvcGVydGllcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEeW5hbW9EQkRhdGFiYXNlUHJvcHMge1xuICB0eXBlOiBcIkR5bmFtb0RCXCI7XG4gIHBhcnRpdGlvbktleTogRHluYW1vREJLZXlTY2hlbWE7XG4gIHNvcnRLZXk/OiBEeW5hbW9EQktleVNjaGVtYTtcbiAgYmlsbGluZ01vZGU/OiBcIlBBWV9QRVJfUkVRVUVTVFwiIHwgXCJQUk9WSVNJT05FRFwiO1xuICByZWFkQ2FwYWNpdHk/OiBudW1iZXI7XG4gIHdyaXRlQ2FwYWNpdHk/OiBudW1iZXI7XG4gIGdsb2JhbFNlY29uZGFyeUluZGV4ZXM/OiBEeW5hbW9EQkdsb2JhbFNlY29uZGFyeUluZGV4W107XG4gIHRpbWVUb0xpdmVBdHRyaWJ1dGU/OiBzdHJpbmc7XG4gIHN0cmVhbT86IFwiTkVXX0lNQUdFXCIgfCBcIk9MRF9JTUFHRVwiIHwgXCJORVdfQU5EX09MRF9JTUFHRVNcIiB8IFwiS0VZU19PTkxZXCI7XG4gIHBvaW50SW5UaW1lUmVjb3Zlcnk/OiBib29sZWFuO1xuICBlbmNyeXB0aW9uPzogXCJBV1NfT1dORURcIiB8IFwiQVdTX01BTkFHRURcIiB8IFwiQ1VTVE9NRVJfTUFOQUdFRFwiO1xuICByZW1vdmFsUG9saWN5PzogXCJERVNUUk9ZXCIgfCBcIlJFVEFJTlwiIHwgXCJTTkFQU0hPVFwiO1xufVxuXG4vKipcbiAqIFJlbGF0aW9uYWwgZGF0YWJhc2UgcHJvcHMgdW5pb24gKEF1cm9yYSwgSW5zdGFuY2UsIEdsb2JhbEF1cm9yYSkuXG4gKi9cbmV4cG9ydCB0eXBlIElSZWxhdGlvbmFsRGF0YWJhc2VQcm9wcyA9XG4gIHwgQXVyb3JhRGF0YWJhc2VQcm9wc1xuICB8IEluc3RhbmNlRGF0YWJhc2VQcm9wc1xuICB8IEdsb2JhbEF1cm9yYURhdGFiYXNlUHJvcHM7XG5cbi8qKlxuICogQWxsIGRhdGFiYXNlIHByb3BzIHVuaW9uLlxuICovXG5leHBvcnQgdHlwZSBJRGF0YWJhc2VQcm9wcyA9XG4gIHwgQXVyb3JhRGF0YWJhc2VQcm9wc1xuICB8IEluc3RhbmNlRGF0YWJhc2VQcm9wc1xuICB8IEdsb2JhbEF1cm9yYURhdGFiYXNlUHJvcHNcbiAgfCBEeW5hbW9EQkRhdGFiYXNlUHJvcHM7XG5cbi8qKlxuICogVmFsaWRhdGVzIER5bmFtb0RCIHByb3BzIGFuZCBsb2dzIHdhcm5pbmdzIGZvciBtaXNjb25maWd1cmVkIG9wdGlvbnMuXG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlRHluYW1vREJQcm9wcyhwcm9wczogRHluYW1vREJEYXRhYmFzZVByb3BzKTogdm9pZCB7XG4gIC8vIFZhbGlkYXRlIHByb3Zpc2lvbmVkIGNhcGFjaXR5XG4gIGlmIChwcm9wcy5iaWxsaW5nTW9kZSA9PT0gXCJQUk9WSVNJT05FRFwiKSB7XG4gICAgaWYgKCFwcm9wcy5yZWFkQ2FwYWNpdHkgfHwgIXByb3BzLndyaXRlQ2FwYWNpdHkpIHtcbiAgICAgIEZqYWxsTG9nZ2VyLndhcm4oXG4gICAgICAgIFwiJ2JpbGxpbmdNb2RlJyBpcyBQUk9WSVNJT05FRCBidXQgY2FwYWNpdHkgbm90IHNwZWNpZmllZC4gXCIgK1xuICAgICAgICAgIFwiVXNpbmcgZGVmYXVsdCB2YWx1ZXMuIENvbnNpZGVyIHNwZWNpZnlpbmcgJ3JlYWRDYXBhY2l0eScgYW5kICd3cml0ZUNhcGFjaXR5Jy5cIlxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvLyBXYXJuIGFib3V0IGNhcGFjaXR5IHdpdGggb24tZGVtYW5kIGJpbGxpbmdcbiAgaWYgKHByb3BzLmJpbGxpbmdNb2RlICE9PSBcIlBST1ZJU0lPTkVEXCIpIHtcbiAgICBpZiAocHJvcHMucmVhZENhcGFjaXR5IHx8IHByb3BzLndyaXRlQ2FwYWNpdHkpIHtcbiAgICAgIEZqYWxsTG9nZ2VyLndhcm4oXG4gICAgICAgIFwiJ3JlYWRDYXBhY2l0eScgb3IgJ3dyaXRlQ2FwYWNpdHknIHNwZWNpZmllZCBidXQgJ2JpbGxpbmdNb2RlJyBcIiArXG4gICAgICAgICAgXCJpcyBub3QgUFJPVklTSU9ORUQuIENhcGFjaXR5IHNldHRpbmdzIHdpbGwgYmUgaWdub3JlZC5cIlxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvLyBWYWxpZGF0ZSBHU0kgcGFydGl0aW9uIGtleXMgYXJlIGRpZmZlcmVudCBmcm9tIHRhYmxlIHBhcnRpdGlvbiBrZXlcbiAgaWYgKHByb3BzLmdsb2JhbFNlY29uZGFyeUluZGV4ZXMpIHtcbiAgICBjb25zdCB0YWJsZVBhcnRpdGlvbktleSA9IHByb3BzLnBhcnRpdGlvbktleS5uYW1lO1xuICAgIGZvciAoY29uc3QgZ3NpIG9mIHByb3BzLmdsb2JhbFNlY29uZGFyeUluZGV4ZXMpIHtcbiAgICAgIGlmIChcbiAgICAgICAgZ3NpLnBhcnRpdGlvbktleS5uYW1lID09PSB0YWJsZVBhcnRpdGlvbktleSAmJlxuICAgICAgICBnc2kuc29ydEtleT8ubmFtZSA9PT0gcHJvcHMuc29ydEtleT8ubmFtZVxuICAgICAgKSB7XG4gICAgICAgIEZqYWxsTG9nZ2VyLndhcm4oXG4gICAgICAgICAgYEdTSSAnJHtnc2kuaW5kZXhOYW1lfScgaGFzIHRoZSBzYW1lIGtleSBzY2hlbWEgYXMgdGhlIHRhYmxlLiBgICtcbiAgICAgICAgICAgIFwiVGhpcyBtYXkgbm90IHByb3ZpZGUgdGhlIHF1ZXJ5IGZsZXhpYmlsaXR5IHlvdSBuZWVkLlwiXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogVmFsaWRhdGVzIHJlbGF0aW9uYWwgZGF0YWJhc2UgcHJvcHMgYW5kIGxvZ3Mgd2FybmluZ3MgZm9yIGlnbm9yZWQgb3IgbWlzY29uZmlndXJlZCBvcHRpb25zLlxuICogVGhlc2UgY2hlY2tzIGhlbHAgY2F0Y2ggaXNzdWVzIHdoZW4gcHJvcHMgY29tZSBmcm9tIGR5bmFtaWMgc291cmNlcyB3aGVyZVxuICogVHlwZVNjcmlwdCdzIGNvbXBpbGUtdGltZSBjaGVja3MgbWF5IG5vdCBhcHBseS5cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVSZWxhdGlvbmFsRGF0YWJhc2VQcm9wcyhcbiAgcHJvcHM6IElSZWxhdGlvbmFsRGF0YWJhc2VQcm9wc1xuKTogdm9pZCB7XG4gIC8vIEdsb2JhbEF1cm9yYSByZXF1aXJlcyBwcmltYXJ5UmVnaW9uXG4gIGlmIChwcm9wcy50eXBlID09PSBcIkdsb2JhbEF1cm9yYVwiICYmICFwcm9wcy5wcmltYXJ5UmVnaW9uKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgXCJHbG9iYWxBdXJvcmEgZGF0YWJhc2UgcmVxdWlyZXMgJ3ByaW1hcnlSZWdpb24nLiBcIiArXG4gICAgICAgIFwiU3BlY2lmeSB0aGUgQVdTIHJlZ2lvbiB3aGVyZSB0aGUgcHJpbWFyeSBjbHVzdGVyIHdpbGwgYmUgY3JlYXRlZC5cIlxuICAgICk7XG4gIH1cblxuICAvLyBJbnN0YW5jZS1vbmx5IG9wdGlvbnMgb24gQXVyb3JhL0dsb2JhbEF1cm9yYVxuICB3YXJuSWZQcm9wZXJ0aWVzSWdub3JlZChcbiAgICBwcm9wcyxcbiAgICBbXCJyZWFkUmVwbGljYVwiLCBcIm11bHRpQXpcIiwgXCJhbGxvY2F0ZWRTdG9yYWdlXCJdLFxuICAgIFwiSW5zdGFuY2VcIixcbiAgICBcIkluc3RhbmNlIGRhdGFiYXNlXCJcbiAgKTtcblxuICAvLyBBdXJvcmEtb25seSBvcHRpb25zIG9uIEluc3RhbmNlXG4gIHdhcm5JZlByb3BlcnRpZXNJZ25vcmVkKFxuICAgIHByb3BzLFxuICAgIFtcInJlYWRlcnNcIiwgXCJ3cml0ZXJcIiwgXCJiYWNrdXBSZXRlbnRpb25cIl0sXG4gICAgW1wiQXVyb3JhXCIsIFwiR2xvYmFsQXVyb3JhXCJdLFxuICAgIFwiQXVyb3JhIGRhdGFiYXNlXCJcbiAgKTtcblxuICAvLyBHbG9iYWxBdXJvcmEtb25seSBvcHRpb25zIG9uIG5vbi1nbG9iYWwgZGF0YWJhc2VzXG4gIHdhcm5JZlByb3BlcnRpZXNJZ25vcmVkKFxuICAgIHByb3BzLFxuICAgIFtcInByaW1hcnlSZWdpb25cIiwgXCJzZWNvbmRhcnlSZWdpb25zXCIsIFwiZW5hYmxlR2xvYmFsV3JpdGVGb3J3YXJkaW5nXCJdLFxuICAgIFwiR2xvYmFsQXVyb3JhXCIsXG4gICAgXCJHbG9iYWxBdXJvcmEgZGF0YWJhc2VcIlxuICApO1xufVxuXG4vKipcbiAqIFZhbGlkYXRlcyBkYXRhYmFzZSBwcm9wcyBhbmQgbG9ncyB3YXJuaW5ncyBmb3IgaWdub3JlZCBvciBtaXNjb25maWd1cmVkIG9wdGlvbnMuXG4gKiBEaXNwYXRjaGVzIHRvIHR5cGUtc3BlY2lmaWMgdmFsaWRhdG9ycyBiYXNlZCBvbiB0aGUgZGF0YWJhc2UgdHlwZS5cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVEYXRhYmFzZVByb3BzKHByb3BzOiBJRGF0YWJhc2VQcm9wcyk6IHZvaWQge1xuICBpZiAocHJvcHMudHlwZSA9PT0gXCJEeW5hbW9EQlwiKSB7XG4gICAgdmFsaWRhdGVEeW5hbW9EQlByb3BzKHByb3BzKTtcbiAgfSBlbHNlIHtcbiAgICB2YWxpZGF0ZVJlbGF0aW9uYWxEYXRhYmFzZVByb3BzKHByb3BzKTtcbiAgfVxufVxuXG4vKipcbiAqIEZhY3RvcnkgZm9yIGNyZWF0aW5nIHR5cGUtc2FmZSBkYXRhYmFzZSByZXNvdXJjZXMuXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEF1cm9yYSBkYXRhYmFzZSAtIHJldHVybnMgUmVsYXRpb25hbERhdGFiYXNlXG4gKiBjb25zdCBhdXJvcmEgPSBhcHAuYWRkRGF0YWJhc2UoRGF0YWJhc2VGYWN0b3J5LmJ1aWxkKFwiTWFpblwiLCB7XG4gKiAgIHR5cGU6IFwiQXVyb3JhXCIsXG4gKiAgIGRhdGFiYXNlTmFtZTogXCJteV9hcHBcIlxuICogfSkpO1xuICogYXVyb3JhLmdldEhvc3RFbmRwb2ludCgpOyAvLyBBdmFpbGFibGVcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gRHluYW1vREIgdGFibGUgLSByZXR1cm5zIER5bmFtb0RCRGF0YWJhc2VcbiAqIGNvbnN0IGNhY2hlID0gYXBwLmFkZERhdGFiYXNlKERhdGFiYXNlRmFjdG9yeS5idWlsZChcIkNhY2hlXCIsIHtcbiAqICAgdHlwZTogXCJEeW5hbW9EQlwiLFxuICogICBwYXJ0aXRpb25LZXk6IHsgbmFtZTogXCJpZFwiLCB0eXBlOiBcIlNcIiB9XG4gKiB9KSk7XG4gKiBjYWNoZS5nZXRUYWJsZU5hbWUoKTsgLy8gQXZhaWxhYmxlXG4gKiBjYWNoZS5ncmFudFJlYWRXcml0ZURhdGEobGFtYmRhKTsgLy8gQXZhaWxhYmxlXG4gKi9cbmV4cG9ydCBjbGFzcyBEYXRhYmFzZUZhY3Rvcnkge1xuICBzdGF0aWMgYnVpbGQoXG4gICAgaWQ6IHN0cmluZyxcbiAgICBwcm9wczogQXVyb3JhRGF0YWJhc2VQcm9wc1xuICApOiAoYXBwOiBBcHAsIHNjb3BlOiBDb25zdHJ1Y3QpID0+IFJlbGF0aW9uYWxEYXRhYmFzZTtcbiAgc3RhdGljIGJ1aWxkKFxuICAgIGlkOiBzdHJpbmcsXG4gICAgcHJvcHM6IEluc3RhbmNlRGF0YWJhc2VQcm9wc1xuICApOiAoYXBwOiBBcHAsIHNjb3BlOiBDb25zdHJ1Y3QpID0+IFJlbGF0aW9uYWxEYXRhYmFzZTtcbiAgc3RhdGljIGJ1aWxkKFxuICAgIGlkOiBzdHJpbmcsXG4gICAgcHJvcHM6IEdsb2JhbEF1cm9yYURhdGFiYXNlUHJvcHNcbiAgKTogKGFwcDogQXBwLCBzY29wZTogQ29uc3RydWN0KSA9PiBSZWxhdGlvbmFsRGF0YWJhc2U7XG4gIHN0YXRpYyBidWlsZChcbiAgICBpZDogc3RyaW5nLFxuICAgIHByb3BzOiBEeW5hbW9EQkRhdGFiYXNlUHJvcHNcbiAgKTogKGFwcDogQXBwLCBzY29wZTogQ29uc3RydWN0KSA9PiBEeW5hbW9EQkRhdGFiYXNlO1xuICBzdGF0aWMgYnVpbGQoXG4gICAgaWQ6IHN0cmluZyxcbiAgICBwcm9wczogSURhdGFiYXNlUHJvcHNcbiAgKTogKGFwcDogQXBwLCBzY29wZTogQ29uc3RydWN0KSA9PiBBbnlEYXRhYmFzZSB7XG4gICAgcmV0dXJuIChhcHA6IEFwcCwgc2NvcGU6IENvbnN0cnVjdCk6IEFueURhdGFiYXNlID0+IHtcbiAgICAgIHZhbGlkYXRlRGF0YWJhc2VQcm9wcyhwcm9wcyk7XG5cbiAgICAgIGlmIChwcm9wcy50eXBlID09PSBcIkR5bmFtb0RCXCIpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBEeW5hbW9EQkRhdGFiYXNlKHNjb3BlLCBpZCwgcHJvcHMpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBkYXRhYmFzZVByb3BzOiBJUmVsYXRpb25hbERhdGFiYXNlUHJvcHMgPSB7XG4gICAgICAgIC4uLnsgdnBjOiBhcHAuZ2V0VnBjKCkgfSxcbiAgICAgICAgLi4ucHJvcHNcbiAgICAgIH07XG4gICAgICByZXR1cm4gbmV3IFJlbGF0aW9uYWxEYXRhYmFzZShzY29wZSwgaWQsIGRhdGFiYXNlUHJvcHMpO1xuICAgIH07XG4gIH1cbn1cblxuLyoqXG4gKiBEeW5hbW9EQiBkYXRhYmFzZSB3cmFwcGVyIGltcGxlbWVudGluZyBJRHluYW1vREJEYXRhYmFzZSBpbnRlcmZhY2UuXG4gKiBQcm92aWRlcyB0eXBlLXNhZmUgYWNjZXNzIHRvIER5bmFtb0RCIHRhYmxlIG9wZXJhdGlvbnMuXG4gKlxuICogQGV4YW1wbGVcbiAqIGNvbnN0IGNhY2hlID0gYXBwLmFkZERhdGFiYXNlKERhdGFiYXNlRmFjdG9yeS5idWlsZChcIkNhY2hlXCIsIHtcbiAqICAgdHlwZTogXCJEeW5hbW9EQlwiLFxuICogICBwYXJ0aXRpb25LZXk6IHsgbmFtZTogXCJpZFwiLCB0eXBlOiBcIlNcIiB9XG4gKiB9KSk7XG4gKiBjYWNoZS5ncmFudFJlYWRXcml0ZURhdGEobGFtYmRhKTtcbiAqL1xuZXhwb3J0IGNsYXNzIER5bmFtb0RCRGF0YWJhc2VcbiAgZXh0ZW5kcyBDb25zdHJ1Y3RcbiAgaW1wbGVtZW50cyBJRHluYW1vREJEYXRhYmFzZSwgSUR5bmFtb0RCQ29ubmVjdG9yXG57XG4gIHB1YmxpYyByZWFkb25seSBkYXRhYmFzZVR5cGUgPSBcIkR5bmFtb0RCXCIgYXMgY29uc3Q7XG4gIHB1YmxpYyByZWFkb25seSBjb25uZWN0b3JUeXBlID0gXCJkeW5hbW9kYlwiIGFzIGNvbnN0O1xuICBwdWJsaWMgcmVhZG9ubHkgaWQ6IHN0cmluZztcblxuICBwcml2YXRlIHJlYWRvbmx5IHRhYmxlOiBEeW5hbW9EQlRhYmxlO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBEeW5hbW9EQkRhdGFiYXNlUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuICAgIHRoaXMuaWQgPSBpZDtcblxuICAgIGNvbnN0IHRhYmxlUHJvcHM6IER5bmFtb0RCVGFibGVQcm9wcyA9IHtcbiAgICAgIHBhcnRpdGlvbktleTogcHJvcHMucGFydGl0aW9uS2V5LFxuICAgICAgc29ydEtleTogcHJvcHMuc29ydEtleSxcbiAgICAgIGJpbGxpbmdNb2RlOiBwcm9wcy5iaWxsaW5nTW9kZSxcbiAgICAgIHJlYWRDYXBhY2l0eTogcHJvcHMucmVhZENhcGFjaXR5LFxuICAgICAgd3JpdGVDYXBhY2l0eTogcHJvcHMud3JpdGVDYXBhY2l0eSxcbiAgICAgIGdsb2JhbFNlY29uZGFyeUluZGV4ZXM6IHByb3BzLmdsb2JhbFNlY29uZGFyeUluZGV4ZXMsXG4gICAgICB0aW1lVG9MaXZlQXR0cmlidXRlOiBwcm9wcy50aW1lVG9MaXZlQXR0cmlidXRlLFxuICAgICAgc3RyZWFtOiBwcm9wcy5zdHJlYW0sXG4gICAgICBwb2ludEluVGltZVJlY292ZXJ5OiBwcm9wcy5wb2ludEluVGltZVJlY292ZXJ5LFxuICAgICAgZW5jcnlwdGlvbjogcHJvcHMuZW5jcnlwdGlvbixcbiAgICAgIHJlbW92YWxQb2xpY3k6IHByb3BzLnJlbW92YWxQb2xpY3lcbiAgICB9O1xuICAgIHRoaXMudGFibGUgPSBuZXcgRHluYW1vREJUYWJsZSh0aGlzLCBpZCwgdGFibGVQcm9wcyk7XG4gIH1cblxuICBnZXRUYWJsZU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy50YWJsZS5nZXRUYWJsZU5hbWUoKTtcbiAgfVxuXG4gIGdldFRhYmxlQXJuKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMudGFibGUuZ2V0VGFibGVBcm4oKTtcbiAgfVxuXG4gIGdldFRhYmxlKCk6IElUYWJsZSB7XG4gICAgcmV0dXJuIHRoaXMudGFibGUuZ2V0VGFibGUoKTtcbiAgfVxuXG4gIGdldFN0cmVhbUFybigpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnRhYmxlLmdldFRhYmxlU3RyZWFtQXJuKCk7XG4gIH1cblxuICBncmFudFJlYWREYXRhKGdyYW50ZWU6IElHcmFudGFibGUpOiBHcmFudCB7XG4gICAgcmV0dXJuIHRoaXMudGFibGUuZ3JhbnRSZWFkKGdyYW50ZWUpO1xuICB9XG5cbiAgZ3JhbnRXcml0ZURhdGEoZ3JhbnRlZTogSUdyYW50YWJsZSk6IEdyYW50IHtcbiAgICByZXR1cm4gdGhpcy50YWJsZS5ncmFudFdyaXRlKGdyYW50ZWUpO1xuICB9XG5cbiAgZ3JhbnRSZWFkV3JpdGVEYXRhKGdyYW50ZWU6IElHcmFudGFibGUpOiBHcmFudCB7XG4gICAgcmV0dXJuIHRoaXMudGFibGUuZ3JhbnRSZWFkV3JpdGUoZ3JhbnRlZSk7XG4gIH1cblxuICBncmFudEZ1bGxBY2Nlc3MoZ3JhbnRlZTogSUdyYW50YWJsZSk6IEdyYW50IHtcbiAgICByZXR1cm4gdGhpcy50YWJsZS5ncmFudEZ1bGxBY2Nlc3MoZ3JhbnRlZSk7XG4gIH1cblxuICBncmFudFN0cmVhbVJlYWQoZ3JhbnRlZTogSUdyYW50YWJsZSk6IEdyYW50IHtcbiAgICByZXR1cm4gdGhpcy50YWJsZS5ncmFudFN0cmVhbVJlYWQoZ3JhbnRlZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBSZWxhdGlvbmFsIGRhdGFiYXNlIHdyYXBwZXIgaW1wbGVtZW50aW5nIElSZWxhdGlvbmFsRGF0YWJhc2UgaW50ZXJmYWNlLlxuICogU3VwcG9ydHMgQXVyb3JhLCBSRFMgSW5zdGFuY2UsIGFuZCBHbG9iYWxBdXJvcmEgZGF0YWJhc2UgdHlwZXMuXG4gKlxuICogQGV4YW1wbGVcbiAqIGNvbnN0IGRiID0gYXBwLmFkZERhdGFiYXNlKERhdGFiYXNlRmFjdG9yeS5idWlsZChcIk1haW5cIiwge1xuICogICB0eXBlOiBcIkF1cm9yYVwiLFxuICogICBkYXRhYmFzZU5hbWU6IFwibXlfYXBwXCJcbiAqIH0pKTtcbiAqIGRiLmdyYW50Q29ubmVjdChsYW1iZGEpO1xuICovXG5leHBvcnQgY2xhc3MgUmVsYXRpb25hbERhdGFiYXNlXG4gIGV4dGVuZHMgQ29uc3RydWN0XG4gIGltcGxlbWVudHMgSVJlbGF0aW9uYWxEYXRhYmFzZSwgSVNlY3VyaXR5R3JvdXBDb25uZWN0b3JcbntcbiAgcHVibGljIHJlYWRvbmx5IGlkOiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSBzY29wZTogQ29uc3RydWN0O1xuICBwdWJsaWMgcmVhZG9ubHkgdnBjOiBJVnBjO1xuICBwdWJsaWMgcmVhZG9ubHkgZGF0YWJhc2VUeXBlOiBSZWxhdGlvbmFsRGF0YWJhc2VUeXBlO1xuICBwdWJsaWMgcmVhZG9ubHkgY29ubmVjdG9yVHlwZSA9IFwicmVsYXRpb25hbFwiIGFzIGNvbnN0O1xuXG4gIHB1YmxpYyBjb25uZWN0aW9ucyE6IENvbm5lY3Rpb25zO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2RhdGFiYXNlTmFtZTogc3RyaW5nO1xuICBwcml2YXRlIGRhdGFiYXNlITogUmRzQXVyb3JhIHwgUmRzSW5zdGFuY2UgfCBSZHNBdXJvcmFHbG9iYWw7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IElSZWxhdGlvbmFsRGF0YWJhc2VQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG4gICAgdGhpcy5pZCA9IGlkO1xuICAgIHRoaXMuc2NvcGUgPSBzY29wZTtcbiAgICB0aGlzLmRhdGFiYXNlVHlwZSA9IHByb3BzLnR5cGU7XG4gICAgaWYgKCFwcm9wcy52cGMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlZQQyBpcyByZXF1aXJlZCBmb3IgcmVsYXRpb25hbCBkYXRhYmFzZVwiKTtcbiAgICB9XG4gICAgdGhpcy52cGMgPSBwcm9wcy52cGM7XG5cbiAgICB0aGlzLl9kYXRhYmFzZU5hbWUgPSBwcm9wcy5kYXRhYmFzZU5hbWU7XG4gICAgdGhpcy5hZGREYXRhYmFzZShwcm9wcyk7XG4gIH1cblxuICBhZGREYXRhYmFzZShwcm9wczogSVJlbGF0aW9uYWxEYXRhYmFzZVByb3BzKSB7XG4gICAgc3dpdGNoIChwcm9wcy50eXBlKSB7XG4gICAgICBjYXNlIFwiQXVyb3JhXCI6XG4gICAgICAgIHRoaXMuYWRkQXVyb3JhKHByb3BzKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiR2xvYmFsQXVyb3JhXCI6XG4gICAgICAgIHRoaXMuYWRkQXVyb3JhR2xvYmFsKHByb3BzKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiSW5zdGFuY2VcIjpcbiAgICAgICAgdGhpcy5hZGRSZHNJbnN0YW5jZShwcm9wcyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDoge1xuICAgICAgICBjb25zdCBfZXhoYXVzdGl2ZTogbmV2ZXIgPSBwcm9wcztcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBVbnN1cHBvcnRlZCBkYXRhYmFzZSB0eXBlOiAke1N0cmluZygoX2V4aGF1c3RpdmUgYXMgSVJlbGF0aW9uYWxEYXRhYmFzZVByb3BzKS50eXBlKX1gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhZGRBdXJvcmEocHJvcHM6IEF1cm9yYURhdGFiYXNlUHJvcHMpIHtcbiAgICBpZiAoIXByb3BzLnZwYykgdGhyb3cgbmV3IEVycm9yKFwiVlBDIGlzIHJlcXVpcmVkIGZvciBBdXJvcmEgZGF0YWJhc2VcIik7XG5cbiAgICBjb25zdCByZXNvbHZlZERhdGFiYXNlRW5naW5lID0gcHJvcHMuZGF0YWJhc2VFbmdpbmUgPz8gXCJwb3N0Z3Jlc3FsXCI7XG4gICAgY29uc3QgcmVzb2x2ZWRFbmdpbmUgPVxuICAgICAgcHJvcHMuZW5naW5lID8/IGdldEF1cm9yYUNsdXN0ZXJFbmdpbmUocmVzb2x2ZWREYXRhYmFzZUVuZ2luZSk7XG4gICAgY29uc3QgZW5naW5lQ29uZmlnID0gZ2V0RW5naW5lQ29uZmlnKHJlc29sdmVkRGF0YWJhc2VFbmdpbmUpO1xuXG4gICAgaWYgKHByb3BzLnB1YmxpY2x5QWNjZXNzaWJsZSkge1xuICAgICAgRmphbGxMb2dnZXIud2FybihcbiAgICAgICAgYEF1cm9yYSBkYXRhYmFzZSAnJHtwcm9wcy5kYXRhYmFzZU5hbWV9JyBpcyBjb25maWd1cmVkIHdpdGggcHVibGljIGFjY2Vzc2liaWxpdHkuIGAgK1xuICAgICAgICAgIFwiVGhpcyBpcyBhIHNlY3VyaXR5IHJpc2sgYW5kIHNob3VsZCBvbmx5IGJlIHVzZWQgZm9yIGRldmVsb3BtZW50LlwiXG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMuZGF0YWJhc2UgPSBuZXcgUmRzQXVyb3JhKHRoaXMsIGAke3Byb3BzLmRhdGFiYXNlTmFtZX1SZHNgLCB7XG4gICAgICB2cGM6IHByb3BzLnZwYyxcbiAgICAgIGRhdGFiYXNlTmFtZTogcHJvcHMuZGF0YWJhc2VOYW1lLFxuICAgICAgZW5naW5lOiByZXNvbHZlZEVuZ2luZSxcbiAgICAgIGVuZ2luZUNvbmZpZyxcbiAgICAgIHdyaXRlcjogcHJvcHMud3JpdGVyLFxuICAgICAgcmVhZGVyczogcHJvcHMucmVhZGVycyxcbiAgICAgIHByb3h5OiBwcm9wcy5wcm94eSxcbiAgICAgIGNyZWRlbnRpYWxzOiBwcm9wcy5jcmVkZW50aWFscyxcbiAgICAgIGVuY3J5cHRpb246IHByb3BzLmVuY3J5cHRpb24sXG4gICAgICBiYWNrdXBSZXRlbnRpb246IHByb3BzLmJhY2t1cFJldGVudGlvbixcbiAgICAgIG1vbml0b3JpbmdJbnRlcnZhbDogcHJvcHMubW9uaXRvcmluZ0ludGVydmFsLFxuICAgICAgcHJlZmVycmVkTWFpbnRlbmFuY2VXaW5kb3c6IHByb3BzLnByZWZlcnJlZE1haW50ZW5hbmNlV2luZG93LFxuICAgICAgcG9ydDogcHJvcHMucG9ydCxcbiAgICAgIGRhdGFiYXNlSW5zaWdodHM6IHByb3BzLmRhdGFiYXNlSW5zaWdodHMsXG4gICAgICBkZWxldGlvblByb3RlY3Rpb246IHByb3BzLmRlbGV0aW9uUHJvdGVjdGlvbixcbiAgICAgIHNuYXBzaG90SWRlbnRpZmllcjogcHJvcHMuc25hcHNob3RJZGVudGlmaWVyLFxuICAgICAgc25hcHNob3RVc2VybmFtZTogcHJvcHMuc25hcHNob3RVc2VybmFtZSxcbiAgICAgIGFsbG93VnBjQWNjZXNzOiBwcm9wcy5hbGxvd1ZwY0FjY2VzcyxcbiAgICAgIHB1YmxpY2x5QWNjZXNzaWJsZTogcHJvcHMucHVibGljbHlBY2Nlc3NpYmxlLFxuICAgICAgYWxsb3dlZElwQ2lkcjogcHJvcHMuYWxsb3dlZElwQ2lkclxuICAgIH0pO1xuICAgIHRoaXMuY29ubmVjdGlvbnMgPSB0aGlzLmRhdGFiYXNlLmNvbm5lY3Rpb25zO1xuICAgIHRoaXMuYWRkRGF0YWJhc2VPdXRwdXRzKHByb3BzKTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkQXVyb3JhR2xvYmFsKHByb3BzOiBHbG9iYWxBdXJvcmFEYXRhYmFzZVByb3BzKSB7XG4gICAgaWYgKCFwcm9wcy52cGMpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJWUEMgaXMgcmVxdWlyZWQgZm9yIEdsb2JhbCBBdXJvcmEgZGF0YWJhc2VcIik7XG4gICAgaWYgKCFwcm9wcy5wcmltYXJ5UmVnaW9uKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwicHJpbWFyeVJlZ2lvbiBpcyByZXF1aXJlZCBmb3IgR2xvYmFsIEF1cm9yYSBkYXRhYmFzZVwiKTtcblxuICAgIGNvbnN0IHJlc29sdmVkRGF0YWJhc2VFbmdpbmUgPSBwcm9wcy5kYXRhYmFzZUVuZ2luZSA/PyBcInBvc3RncmVzcWxcIjtcbiAgICBjb25zdCByZXNvbHZlZEVuZ2luZSA9XG4gICAgICBwcm9wcy5lbmdpbmUgPz8gZ2V0QXVyb3JhQ2x1c3RlckVuZ2luZShyZXNvbHZlZERhdGFiYXNlRW5naW5lKTtcbiAgICBjb25zdCBlbmdpbmVDb25maWcgPSBnZXRFbmdpbmVDb25maWcocmVzb2x2ZWREYXRhYmFzZUVuZ2luZSk7XG5cbiAgICB0aGlzLmRhdGFiYXNlID0gbmV3IFJkc0F1cm9yYUdsb2JhbChcbiAgICAgIHRoaXMsXG4gICAgICBgJHtwcm9wcy5kYXRhYmFzZU5hbWV9UmRzR2xvYmFsYCxcbiAgICAgIHtcbiAgICAgICAgdnBjOiBwcm9wcy52cGMsXG4gICAgICAgIGRhdGFiYXNlTmFtZTogcHJvcHMuZGF0YWJhc2VOYW1lLFxuICAgICAgICBwcmltYXJ5UmVnaW9uOiBwcm9wcy5wcmltYXJ5UmVnaW9uLFxuICAgICAgICBzZWNvbmRhcnlSZWdpb25zOiBwcm9wcy5zZWNvbmRhcnlSZWdpb25zLFxuICAgICAgICBnbG9iYWxDbHVzdGVySWRlbnRpZmllcjogcHJvcHMuZ2xvYmFsQ2x1c3RlcklkZW50aWZpZXIsXG4gICAgICAgIGVuZ2luZTogcmVzb2x2ZWRFbmdpbmUsXG4gICAgICAgIGVuZ2luZUNvbmZpZyxcbiAgICAgICAgZW5hYmxlR2xvYmFsV3JpdGVGb3J3YXJkaW5nOiBwcm9wcy5lbmFibGVHbG9iYWxXcml0ZUZvcndhcmRpbmcsXG4gICAgICAgIHdyaXRlcjogcHJvcHMud3JpdGVyLFxuICAgICAgICByZWFkZXJzOiBwcm9wcy5yZWFkZXJzLFxuICAgICAgICBwcm94eTogcHJvcHMucHJveHksXG4gICAgICAgIGNyZWRlbnRpYWxzOiBwcm9wcy5jcmVkZW50aWFscyxcbiAgICAgICAgZW5jcnlwdGlvbjogcHJvcHMuZW5jcnlwdGlvbixcbiAgICAgICAgYmFja3VwUmV0ZW50aW9uOiBwcm9wcy5iYWNrdXBSZXRlbnRpb24sXG4gICAgICAgIG1vbml0b3JpbmdJbnRlcnZhbDogcHJvcHMubW9uaXRvcmluZ0ludGVydmFsLFxuICAgICAgICBwcmVmZXJyZWRNYWludGVuYW5jZVdpbmRvdzogcHJvcHMucHJlZmVycmVkTWFpbnRlbmFuY2VXaW5kb3csXG4gICAgICAgIHBvcnQ6IHByb3BzLnBvcnQsXG4gICAgICAgIGRhdGFiYXNlSW5zaWdodHM6IHByb3BzLmRhdGFiYXNlSW5zaWdodHMsXG4gICAgICAgIGRlbGV0aW9uUHJvdGVjdGlvbjogcHJvcHMuZGVsZXRpb25Qcm90ZWN0aW9uLFxuICAgICAgICBzbmFwc2hvdElkZW50aWZpZXI6IHByb3BzLnNuYXBzaG90SWRlbnRpZmllcixcbiAgICAgICAgc25hcHNob3RVc2VybmFtZTogcHJvcHMuc25hcHNob3RVc2VybmFtZVxuICAgICAgfVxuICAgICk7XG4gICAgdGhpcy5jb25uZWN0aW9ucyA9IHRoaXMuZGF0YWJhc2UuY29ubmVjdGlvbnM7XG4gICAgdGhpcy5hZGREYXRhYmFzZU91dHB1dHMocHJvcHMpO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRSZHNJbnN0YW5jZShwcm9wczogSW5zdGFuY2VEYXRhYmFzZVByb3BzKSB7XG4gICAgaWYgKCFwcm9wcy52cGMpIHRocm93IG5ldyBFcnJvcihcIlZQQyBpcyByZXF1aXJlZCBmb3IgSW5zdGFuY2UgZGF0YWJhc2VcIik7XG5cbiAgICBjb25zdCByZXNvbHZlZERhdGFiYXNlRW5naW5lID0gcHJvcHMuZGF0YWJhc2VFbmdpbmUgPz8gXCJwb3N0Z3Jlc3FsXCI7XG4gICAgY29uc3QgcmVzb2x2ZWRFbmdpbmUgPVxuICAgICAgcHJvcHMuZW5naW5lID8/IGdldEluc3RhbmNlRW5naW5lKHJlc29sdmVkRGF0YWJhc2VFbmdpbmUpO1xuICAgIGNvbnN0IGVuZ2luZUNvbmZpZyA9IGdldEVuZ2luZUNvbmZpZyhyZXNvbHZlZERhdGFiYXNlRW5naW5lKTtcblxuICAgIHRoaXMuZGF0YWJhc2UgPSBuZXcgUmRzSW5zdGFuY2UodGhpcywgYCR7cHJvcHMuZGF0YWJhc2VOYW1lfVJkc2AsIHtcbiAgICAgIHZwYzogcHJvcHMudnBjLFxuICAgICAgZGF0YWJhc2VOYW1lOiBwcm9wcy5kYXRhYmFzZU5hbWUsXG4gICAgICBpbnN0YW5jZVR5cGU6IHByb3BzLmluc3RhbmNlVHlwZSxcbiAgICAgIGFsbG9jYXRlZFN0b3JhZ2U6IHByb3BzLmFsbG9jYXRlZFN0b3JhZ2UsXG4gICAgICBwb3J0OiBwcm9wcy5wb3J0LFxuICAgICAgZW5naW5lOiByZXNvbHZlZEVuZ2luZSxcbiAgICAgIGVuZ2luZUNvbmZpZyxcbiAgICAgIG11bHRpQXo6IHByb3BzLm11bHRpQXosXG4gICAgICBiYWNrdXBSZXRlbnRpb246XG4gICAgICAgIHByb3BzLmJhY2t1cFJldGVudGlvbiAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgPyBEdXJhdGlvbi5kYXlzKHByb3BzLmJhY2t1cFJldGVudGlvbilcbiAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgIGRhdGFiYXNlSW5zaWdodHM6IHByb3BzLmRhdGFiYXNlSW5zaWdodHMsXG4gICAgICBwcm94eTogcHJvcHMucHJveHksXG4gICAgICByZWFkUmVwbGljYTogcHJvcHMucmVhZFJlcGxpY2EsXG4gICAgICBjcmVkZW50aWFsczogcHJvcHMuY3JlZGVudGlhbHMsXG4gICAgICBlbmNyeXB0aW9uOiBwcm9wcy5lbmNyeXB0aW9uLFxuICAgICAgcHVibGljbHlBY2Nlc3NpYmxlOiBwcm9wcy5wdWJsaWNseUFjY2Vzc2libGUsXG4gICAgICBkZWxldGlvblByb3RlY3Rpb246IHByb3BzLmRlbGV0aW9uUHJvdGVjdGlvbixcbiAgICAgIHNuYXBzaG90SWRlbnRpZmllcjogcHJvcHMuc25hcHNob3RJZGVudGlmaWVyLFxuICAgICAgc25hcHNob3RVc2VybmFtZTogcHJvcHMuc25hcHNob3RVc2VybmFtZVxuICAgIH0pO1xuICAgIHRoaXMuY29ubmVjdGlvbnMgPSB0aGlzLmRhdGFiYXNlLmNvbm5lY3Rpb25zO1xuICAgIHRoaXMuYWRkRGF0YWJhc2VPdXRwdXRzKHByb3BzKTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkRGF0YWJhc2VPdXRwdXRzKHByb3BzOiBJUmVsYXRpb25hbERhdGFiYXNlUHJvcHMpIHtcbiAgICBjb25zdCBlbmRwb2ludCA9IHRoaXMuZGF0YWJhc2UuZ2V0SG9zdEVuZHBvaW50KCk7XG4gICAgY29uc3Qgc3RhY2tOYW1lID0gU3RhY2sub2YodGhpcykuc3RhY2tOYW1lO1xuICAgIC8vIFNhbml0aXNlIGZvciBDZm5PdXRwdXQgbmFtZXMg4oCUIENsb3VkRm9ybWF0aW9uIGV4cG9ydCBuYW1lcyBvbmx5IGFsbG93IFthLXpBLVowLTk6LV1cbiAgICBjb25zdCBvdXRwdXROYW1lID0gdG9QYXNjYWxDYXNlKHByb3BzLmRhdGFiYXNlTmFtZSk7XG5cbiAgICBuZXcgQ2ZuT3V0cHV0KHRoaXMsIGAke291dHB1dE5hbWV9RW5kcG9pbnRgLCB7XG4gICAgICBrZXk6IGAke3N0YWNrTmFtZX0ke291dHB1dE5hbWV9RW5kcG9pbnRgLFxuICAgICAgZXhwb3J0TmFtZTogYCR7c3RhY2tOYW1lfSR7b3V0cHV0TmFtZX1FbmRwb2ludGAsXG4gICAgICB2YWx1ZTogZW5kcG9pbnQsXG4gICAgICBkZXNjcmlwdGlvbjogYERhdGFiYXNlIEVuZHBvaW50IGZvciAke3Byb3BzLmRhdGFiYXNlTmFtZX1gXG4gICAgfSk7XG5cbiAgICBuZXcgQ2ZuT3V0cHV0KHRoaXMsIGAke291dHB1dE5hbWV9UG9ydGAsIHtcbiAgICAgIGtleTogYCR7c3RhY2tOYW1lfSR7b3V0cHV0TmFtZX1Qb3J0YCxcbiAgICAgIGV4cG9ydE5hbWU6IGAke3N0YWNrTmFtZX0ke291dHB1dE5hbWV9UG9ydGAsXG4gICAgICB2YWx1ZTogdGhpcy5kYXRhYmFzZS5nZXRIb3N0UG9ydCgpLFxuICAgICAgZGVzY3JpcHRpb246IGBEYXRhYmFzZSBQb3J0IGZvciAke3Byb3BzLmRhdGFiYXNlTmFtZX1gXG4gICAgfSk7XG5cbiAgICBuZXcgQ2ZuT3V0cHV0KHRoaXMsIGAke291dHB1dE5hbWV9RGF0YWJhc2VOYW1lYCwge1xuICAgICAga2V5OiBgJHtzdGFja05hbWV9JHtvdXRwdXROYW1lfURhdGFiYXNlTmFtZWAsXG4gICAgICBleHBvcnROYW1lOiBgJHtzdGFja05hbWV9JHtvdXRwdXROYW1lfURhdGFiYXNlTmFtZWAsXG4gICAgICB2YWx1ZTogcHJvcHMuZGF0YWJhc2VOYW1lLFxuICAgICAgZGVzY3JpcHRpb246IGBEYXRhYmFzZSBOYW1lIGZvciAke3Byb3BzLmRhdGFiYXNlTmFtZX1gXG4gICAgfSk7XG5cbiAgICBjb25zdCBjcmVkZW50aWFscyA9IHRoaXMuZGF0YWJhc2UuZ2V0Q3JlZGVudGlhbHMoKTtcbiAgICBuZXcgQ2ZuT3V0cHV0KHRoaXMsIGAke291dHB1dE5hbWV9U2VjcmV0QXJuYCwge1xuICAgICAga2V5OiBgJHtzdGFja05hbWV9JHtvdXRwdXROYW1lfVNlY3JldEFybmAsXG4gICAgICBleHBvcnROYW1lOiBgJHtzdGFja05hbWV9JHtvdXRwdXROYW1lfVNlY3JldEFybmAsXG4gICAgICB2YWx1ZTogY3JlZGVudGlhbHMuc2VjcmV0LnNlY3JldEFybixcbiAgICAgIGRlc2NyaXB0aW9uOiBgRGF0YWJhc2UgQ3JlZGVudGlhbHMgU2VjcmV0IEFSTiBmb3IgJHtwcm9wcy5kYXRhYmFzZU5hbWV9YFxuICAgIH0pO1xuICB9XG5cbiAgZ2V0Q3JlZGVudGlhbHMoKTogU2VjcmV0IHtcbiAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5nZXRDcmVkZW50aWFscygpO1xuICB9XG5cbiAgZ2V0SG9zdEVuZHBvaW50KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UuZ2V0SG9zdEVuZHBvaW50KCk7XG4gIH1cblxuICBnZXRIb3N0UG9ydCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLmdldEhvc3RQb3J0KCk7XG4gIH1cblxuICBnZXREYXRhYmFzZU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YWJhc2VOYW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50IGNvbm5lY3QgcGVybWlzc2lvbnMgdG8gYSBncmFudGVlIGJ5IGFkZGluZyBpdCB0byB0aGUgZGF0YWJhc2Ugc2VjdXJpdHkgZ3JvdXAuXG4gICAqIEBwYXJhbSBncmFudGVlIFRoZSBjb25uZWN0YWJsZSBwcmluY2lwYWwgdG8gZ3JhbnQgY29ubmVjdCBwZXJtaXNzaW9ucyB0b1xuICAgKi9cbiAgZ3JhbnRDb25uZWN0KGdyYW50ZWU6IElDb25uZWN0YWJsZSk6IHZvaWQge1xuICAgIHRoaXMuY29ubmVjdGlvbnMuYWxsb3dEZWZhdWx0UG9ydEZyb20oZ3JhbnRlZSk7XG4gIH1cbn1cblxuLy8gUmUtZXhwb3J0IER5bmFtb0RCIHR5cGVzIGZvciBjb252ZW5pZW5jZVxuZXhwb3J0IHR5cGUge1xuICBEeW5hbW9EQktleVNjaGVtYSxcbiAgRHluYW1vREJHbG9iYWxTZWNvbmRhcnlJbmRleCxcbiAgRHluYW1vREJUYWJsZVByb3BzXG59IGZyb20gXCIuLi8uLi9yZXNvdXJjZXMvYXdzL2RhdGFiYXNlL2R5bmFtb2RiXCI7XG5cbi8vIFJlLWV4cG9ydCBpbnRlcmZhY2UgdHlwZXNcbmV4cG9ydCB7XG4gIHR5cGUgSVJlbGF0aW9uYWxEYXRhYmFzZSxcbiAgdHlwZSBJRHluYW1vREJEYXRhYmFzZSxcbiAgdHlwZSBBbnlEYXRhYmFzZSxcbiAgdHlwZSBEYXRhYmFzZVR5cGUsXG4gIHR5cGUgUmVsYXRpb25hbERhdGFiYXNlVHlwZSxcbiAgaXNSZWxhdGlvbmFsRGF0YWJhc2UsXG4gIGlzRHluYW1vREJEYXRhYmFzZSxcbiAgaXNBdXJvcmFEYXRhYmFzZSxcbiAgaXNJbnN0YW5jZURhdGFiYXNlLFxuICBpc0dsb2JhbEF1cm9yYURhdGFiYXNlXG59IGZyb20gXCIuL2ludGVyZmFjZXMvZGF0YWJhc2UuanNcIjtcbiJdfQ==
446
+ export { isRelationalDatabase, isDynamoDBDatabase, isAuroraDatabase, isInstanceDatabase, isGlobalAuroraDatabase } from "./interfaces/database.js";
@@ -0,0 +1,17 @@
1
+ import type { Construct } from "constructs";
2
+ import type { IHostedZone } from "aws-cdk-lib/aws-route53";
3
+ import type { ICertificate } from "aws-cdk-lib/aws-certificatemanager";
4
+ import type { ExternalDelegatedProps, ManualRecord } from "./interfaces/domain.js";
5
+ export interface DelegatedDomainPatternResult {
6
+ readonly hostedZone: IHostedZone;
7
+ readonly certificates: Map<string, ICertificate>;
8
+ readonly nameServers: string[];
9
+ readonly manualRecords: ManualRecord[];
10
+ }
11
+ /**
12
+ * Composition for `registrar: "external-delegated"`. Creates a hosted zone
13
+ * for `{delegatedSubdomain}.{zoneName}` — the user adds NS records at their
14
+ * external registrar to delegate the subdomain to Fjall. No cross-account
15
+ * delegation role is required because Fjall is not creating the parent zone.
16
+ */
17
+ export declare function composeDelegatedDomain(scope: Construct, props: ExternalDelegatedProps): DelegatedDomainPatternResult;
@@ -0,0 +1,54 @@
1
+ import { HostedZone } from "../../resources/aws/networking/hostedZone.js";
2
+ import { DomainCertificate } from "../../resources/aws/networking/domainCertificate.js";
3
+ import { composeTypedDnsRecords } from "./dnsRecordComposer.js";
4
+ import { toPascalCase, getSafeZoneName } from "../../utils/capitaliseString.js";
5
+ /**
6
+ * Composition for `registrar: "external-delegated"`. Creates a hosted zone
7
+ * for `{delegatedSubdomain}.{zoneName}` — the user adds NS records at their
8
+ * external registrar to delegate the subdomain to Fjall. No cross-account
9
+ * delegation role is required because Fjall is not creating the parent zone.
10
+ */
11
+ export function composeDelegatedDomain(scope, props) {
12
+ const effectiveZone = `${props.delegatedSubdomain}.${props.zoneName}`;
13
+ const safeZone = toPascalCase(getSafeZoneName(effectiveZone));
14
+ const hostedZoneConstruct = new HostedZone(scope, `${safeZone}HostedZone`, {
15
+ zoneName: effectiveZone,
16
+ createDelegationRole: false,
17
+ costAllocationEnvironment: props.costAllocationEnvironment,
18
+ costAllocationDomain: props.zoneName
19
+ });
20
+ const certificates = new Map();
21
+ (props.certificates ?? []).forEach((cert, index) => {
22
+ const normalised = normaliseCertificate(cert);
23
+ const safeCertName = toPascalCase(normalised.domainName.split(".").join(""));
24
+ const dc = new DomainCertificate(scope, `${safeZone}${safeCertName}Cert${index}`, {
25
+ domainName: normalised.domainName,
26
+ subjectAlternativeNames: normalised.subjectAlternativeNames,
27
+ transparencyLogging: normalised.transparencyLogging,
28
+ hostedZone: hostedZoneConstruct.hostedZone,
29
+ costAllocationEnvironment: props.costAllocationEnvironment,
30
+ costAllocationDomain: props.zoneName
31
+ });
32
+ certificates.set(normalised.domainName, dc.certificate);
33
+ });
34
+ if (props.records && props.records.length > 0) {
35
+ composeTypedDnsRecords(scope, hostedZoneConstruct.hostedZone, effectiveZone, props.records);
36
+ }
37
+ const nameServers = hostedZoneConstruct.nameServers ?? [];
38
+ return {
39
+ hostedZone: hostedZoneConstruct.hostedZone,
40
+ certificates,
41
+ nameServers,
42
+ manualRecords: []
43
+ };
44
+ }
45
+ function normaliseCertificate(cert) {
46
+ if (typeof cert === "string") {
47
+ return { domainName: cert };
48
+ }
49
+ return {
50
+ domainName: cert.domainName,
51
+ subjectAlternativeNames: cert.subjectAlternativeNames,
52
+ transparencyLogging: cert.transparencyLogging
53
+ };
54
+ }
@@ -0,0 +1,25 @@
1
+ import type { Construct } from "constructs";
2
+ import type { IHostedZone } from "aws-cdk-lib/aws-route53";
3
+ import type { DnsRecord, DnsRecordInput } from "./interfaces/domain.js";
4
+ /**
5
+ * Legacy composer consumed by `DomainFactory` (deleted in Phase 2). Accepts
6
+ * the `DnsRecordInput` shape from the BIND-primary era where ALIAS sentinels
7
+ * live in `value`. Typed targets are not supported here; use
8
+ * `composeTypedDnsRecords` instead.
9
+ */
10
+ export declare function composeDnsRecords(scope: Construct, zone: IHostedZone, zoneName: string, records: DnsRecordInput[]): void;
11
+ /**
12
+ * Typed composer consumed by the new `Domain` construct. Accepts the
13
+ * discriminated `DnsRecord` union (`StandardRecord | AliasRecord`).
14
+ *
15
+ * `AliasRecord` entries MUST carry a `target` produced by `fjallApp()`,
16
+ * `fjallCdn()`, `fjallBucket()`, or `aliasTo()` — those helpers return
17
+ * `FjallTarget & IAliasRecordTarget` so `target.bind()` is guaranteed. A
18
+ * runtime guard catches user-crafted `{ kind, ... }` literals that lack
19
+ * `bind()`.
20
+ *
21
+ * Construct-id formula (`${safeZone}${safeName}${type}Record${index}`) is
22
+ * byte-identical to the legacy composer — this is an eject-contract
23
+ * invariant (Phase 3 depends on stable IDs).
24
+ */
25
+ export declare function composeTypedDnsRecords(scope: Construct, zone: IHostedZone, zoneName: string, records: DnsRecord[]): void;