@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,32 +1,27 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.StorageFactory = exports.Storage = exports.isStorage = void 0;
4
- exports.validateStorageProps = validateStorageProps;
5
- const constructs_1 = require("constructs");
6
- const aws_s3_1 = require("aws-cdk-lib/aws-s3");
7
- const aws_s3_deployment_1 = require("aws-cdk-lib/aws-s3-deployment");
8
- const aws_kms_1 = require("aws-cdk-lib/aws-kms");
9
- const aws_cdk_lib_1 = require("aws-cdk-lib");
10
- const storage_1 = require("../../resources/aws/storage");
11
- const validationLogger_js_1 = require("../../utils/validationLogger.js");
12
- var storage_js_1 = require("./interfaces/storage.js");
13
- Object.defineProperty(exports, "isStorage", { enumerable: true, get: function () { return storage_js_1.isStorage; } });
1
+ import { Construct } from "constructs";
2
+ import { BucketEncryption, HttpMethods } from "aws-cdk-lib/aws-s3";
3
+ import { BucketDeployment, Source, CacheControl } from "aws-cdk-lib/aws-s3-deployment";
4
+ import { Key } from "aws-cdk-lib/aws-kms";
5
+ import { CfnOutput, Duration, RemovalPolicy, Stack } from "aws-cdk-lib";
6
+ import { S3Bucket } from "../../resources/aws/storage/index.js";
7
+ import { FjallLogger } from "../../utils/validationLogger.js";
8
+ export { isStorage } from "./interfaces/storage.js";
14
9
  function toBucketEncryption(encryption) {
15
10
  if (!encryption)
16
11
  return undefined;
17
12
  return encryption === "AES256"
18
- ? aws_s3_1.BucketEncryption.S3_MANAGED
19
- : aws_s3_1.BucketEncryption.KMS;
13
+ ? BucketEncryption.S3_MANAGED
14
+ : BucketEncryption.KMS;
20
15
  }
21
16
  function toHttpMethod(method) {
22
17
  const methodMap = {
23
- GET: aws_s3_1.HttpMethods.GET,
24
- PUT: aws_s3_1.HttpMethods.PUT,
25
- POST: aws_s3_1.HttpMethods.POST,
26
- DELETE: aws_s3_1.HttpMethods.DELETE,
27
- HEAD: aws_s3_1.HttpMethods.HEAD
18
+ GET: HttpMethods.GET,
19
+ PUT: HttpMethods.PUT,
20
+ POST: HttpMethods.POST,
21
+ DELETE: HttpMethods.DELETE,
22
+ HEAD: HttpMethods.HEAD
28
23
  };
29
- return methodMap[method] ?? aws_s3_1.HttpMethods.GET;
24
+ return methodMap[method] ?? HttpMethods.GET;
30
25
  }
31
26
  function toCorsRules(cors) {
32
27
  if (!cors)
@@ -39,24 +34,26 @@ function toCorsRules(cors) {
39
34
  ...(rule.maxAge !== undefined && { maxAge: rule.maxAge })
40
35
  }));
41
36
  }
42
- function validateStorageProps(props) {
37
+ export function validateStorageProps(props) {
43
38
  if (props.encryption === "KMS" && !props.kmsKeyArn) {
44
- validationLogger_js_1.FjallLogger.warn("'encryption' is set to 'KMS' but 'kmsKeyArn' is not provided. " +
39
+ FjallLogger.warn("'encryption' is set to 'KMS' but 'kmsKeyArn' is not provided. " +
45
40
  "The bucket will use the default AWS managed key.");
46
41
  }
47
42
  if (props.kmsKeyArn && props.encryption !== "KMS") {
48
- validationLogger_js_1.FjallLogger.warn("'kmsKeyArn' is provided but 'encryption' is not set to 'KMS'. " +
43
+ FjallLogger.warn("'kmsKeyArn' is provided but 'encryption' is not set to 'KMS'. " +
49
44
  "The KMS key will be ignored. Set encryption: 'KMS' to use the key.");
50
45
  }
51
46
  }
52
- class Storage extends constructs_1.Construct {
47
+ export class Storage extends Construct {
48
+ connectorType = "storage";
49
+ bucket;
50
+ bucketDeployment;
53
51
  constructor(scope, id, props) {
54
52
  super(scope, id);
55
- this.connectorType = "storage";
56
53
  const encryptionKey = props.kmsKeyArn
57
- ? aws_kms_1.Key.fromKeyArn(this, `${id}KmsKey`, props.kmsKeyArn)
54
+ ? Key.fromKeyArn(this, `${id}KmsKey`, props.kmsKeyArn)
58
55
  : undefined;
59
- this.bucket = new storage_1.S3Bucket(this, `${id}Bucket`, {
56
+ this.bucket = new S3Bucket(this, `${id}Bucket`, {
60
57
  bucketName: props.bucketName,
61
58
  versioned: props.versioned,
62
59
  encryption: toBucketEncryption(props.encryption),
@@ -64,7 +61,8 @@ class Storage extends constructs_1.Construct {
64
61
  backupVaultTier: props.backupVaultTier,
65
62
  publicReadAccess: props.publicReadAccess,
66
63
  websiteHosting: props.websiteHosting,
67
- ...(props.cors && { cors: toCorsRules(props.cors) })
64
+ ...(props.cors && { cors: toCorsRules(props.cors) }),
65
+ ...(props.retain && { removalPolicy: RemovalPolicy.RETAIN })
68
66
  });
69
67
  if (props.deployment) {
70
68
  this.bucketDeployment = this.createDeployment(id, props.deployment);
@@ -74,13 +72,13 @@ class Storage extends constructs_1.Construct {
74
72
  createDeployment(id, config) {
75
73
  const cacheControlHeaders = [];
76
74
  if (config.cacheControl?.maxAge !== undefined) {
77
- cacheControlHeaders.push(aws_s3_deployment_1.CacheControl.maxAge(aws_cdk_lib_1.Duration.seconds(config.cacheControl.maxAge)));
75
+ cacheControlHeaders.push(CacheControl.maxAge(Duration.seconds(config.cacheControl.maxAge)));
78
76
  }
79
77
  if (config.cacheControl?.immutable) {
80
- cacheControlHeaders.push(aws_s3_deployment_1.CacheControl.immutable());
78
+ cacheControlHeaders.push(CacheControl.immutable());
81
79
  }
82
- return new aws_s3_deployment_1.BucketDeployment(this, `${id}Deployment`, {
83
- sources: [aws_s3_deployment_1.Source.asset(config.source)],
80
+ return new BucketDeployment(this, `${id}Deployment`, {
81
+ sources: [Source.asset(config.source)],
84
82
  destinationBucket: this.bucket,
85
83
  prune: config.prune ?? true,
86
84
  ...(cacheControlHeaders.length > 0 && {
@@ -89,14 +87,14 @@ class Storage extends constructs_1.Construct {
89
87
  });
90
88
  }
91
89
  addOutputs(id) {
92
- const stackName = aws_cdk_lib_1.Stack.of(this).stackName;
93
- new aws_cdk_lib_1.CfnOutput(this, `${id}BucketArn`, {
90
+ const stackName = Stack.of(this).stackName;
91
+ new CfnOutput(this, `${id}BucketArn`, {
94
92
  key: `${stackName}${id}BucketArn`,
95
93
  exportName: `${stackName}${id}BucketArn`,
96
94
  value: this.bucket.bucketArn,
97
95
  description: `S3 Bucket ARN for ${id}`
98
96
  });
99
- new aws_cdk_lib_1.CfnOutput(this, `${id}BucketName`, {
97
+ new CfnOutput(this, `${id}BucketName`, {
100
98
  key: `${stackName}${id}BucketName`,
101
99
  exportName: `${stackName}${id}BucketName`,
102
100
  value: this.bucket.bucketName,
@@ -152,8 +150,7 @@ class Storage extends constructs_1.Construct {
152
150
  this.bucket.addObjectRemovedNotification(dest, ...filters);
153
151
  }
154
152
  }
155
- exports.Storage = Storage;
156
- class StorageFactory {
153
+ export class StorageFactory {
157
154
  static build(id, props = {}) {
158
155
  const { stackPlacement, ...s3Props } = props;
159
156
  const fn = (_app, scope) => {
@@ -166,5 +163,3 @@ class StorageFactory {
166
163
  return fn;
167
164
  }
168
165
  }
169
- exports.StorageFactory = StorageFactory;
170
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmFnZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYi9wYXR0ZXJucy9hd3Mvc3RvcmFnZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUF5R0Esb0RBY0M7QUF2SEQsMkNBQXVDO0FBQ3ZDLCtDQVE0QjtBQUM1QixxRUFJdUM7QUFFdkMsaURBQTBDO0FBQzFDLDZDQUF5RDtBQUd6RCx5REFHcUM7QUFFckMseUVBQThEO0FBSTlELHNEQUFtRTtBQUEzQyx1R0FBQSxTQUFTLE9BQUE7QUE2Q2pDLFNBQVMsa0JBQWtCLENBQ3pCLFVBQTZCO0lBRTdCLElBQUksQ0FBQyxVQUFVO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDbEMsT0FBTyxVQUFVLEtBQUssUUFBUTtRQUM1QixDQUFDLENBQUMseUJBQWdCLENBQUMsVUFBVTtRQUM3QixDQUFDLENBQUMseUJBQWdCLENBQUMsR0FBRyxDQUFDO0FBQzNCLENBQUM7QUFFRCxTQUFTLFlBQVksQ0FBQyxNQUFjO0lBQ2xDLE1BQU0sU0FBUyxHQUFnQztRQUM3QyxHQUFHLEVBQUUsb0JBQVcsQ0FBQyxHQUFHO1FBQ3BCLEdBQUcsRUFBRSxvQkFBVyxDQUFDLEdBQUc7UUFDcEIsSUFBSSxFQUFFLG9CQUFXLENBQUMsSUFBSTtRQUN0QixNQUFNLEVBQUUsb0JBQVcsQ0FBQyxNQUFNO1FBQzFCLElBQUksRUFBRSxvQkFBVyxDQUFDLElBQUk7S0FDdkIsQ0FBQztJQUNGLE9BQU8sU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLG9CQUFXLENBQUMsR0FBRyxDQUFDO0FBQzlDLENBQUM7QUFFRCxTQUFTLFdBQVcsQ0FBQyxJQUFpQjtJQUNwQyxJQUFJLENBQUMsSUFBSTtRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQzVCLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztRQUN6QixjQUFjLEVBQUUsSUFBSSxDQUFDLGNBQWM7UUFDbkMsY0FB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IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQge1xuICB0eXBlIElCdWNrZXQsXG4gIHR5cGUgRXZlbnRUeXBlLFxuICB0eXBlIElCdWNrZXROb3RpZmljYXRpb25EZXN0aW5hdGlvbixcbiAgdHlwZSBOb3RpZmljYXRpb25LZXlGaWx0ZXIsXG4gIEJ1Y2tldEVuY3J5cHRpb24sXG4gIEh0dHBNZXRob2RzLFxuICB0eXBlIENvcnNSdWxlIGFzIENka0NvcnNSdWxlXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtczNcIjtcbmltcG9ydCB7XG4gIEJ1Y2tldERlcGxveW1lbnQsXG4gIFNvdXJjZSxcbiAgQ2FjaGVDb250cm9sXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtczMtZGVwbG95bWVudFwiO1xuaW1wb3J0IHsgdHlwZSBJR3JhbnRhYmxlLCB0eXBlIEdyYW50IH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1pYW1cIjtcbmltcG9ydCB7IEtleSB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3Mta21zXCI7XG5pbXBvcnQgeyBDZm5PdXRwdXQsIER1cmF0aW9uLCBTdGFjayB9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuXG5pbXBvcnQgdHlwZSBBcHAgZnJvbSBcIi4uLy4uL2FwcFwiO1xuaW1wb3J0IHtcbiAgUzNCdWNrZXQsXG4gIHR5cGUgV2Vic2l0ZUhvc3RpbmdDb25maWdcbn0gZnJvbSBcIi4uLy4uL3Jlc291cmNlcy9hd3Mvc3RvcmFnZVwiO1xuaW1wb3J0IHsgdHlwZSBCYWNrdXBUaWVyIH0gZnJvbSBcIi4uLy4uL3V0aWxzL2JhY2t1cFRpZXJNYXBwaW5nXCI7XG5pbXBvcnQgeyBGamFsbExvZ2dlciB9IGZyb20gXCIuLi8uLi91dGlscy92YWxpZGF0aW9uTG9nZ2VyLmpzXCI7XG5pbXBvcnQgeyB0eXBlIElTdG9yYWdlIH0gZnJvbSBcIi4vaW50ZXJmYWNlcy9zdG9yYWdlLmpzXCI7XG5pbXBvcnQgeyB0eXBlIElTdG9yYWdlQ29ubmVjdG9yIH0gZnJvbSBcIi4vaW50ZXJmYWNlcy9jb25uZWN0b3IuanNcIjtcblxuZXhwb3J0IHsgdHlwZSBJU3RvcmFnZSwgaXNTdG9yYWdlIH0gZnJvbSBcIi4vaW50ZXJmYWNlcy9zdG9yYWdlLmpzXCI7XG5leHBvcnQgeyB0eXBlIFdlYnNpdGVIb3N0aW5nQ29uZmlnIH0gZnJvbSBcIi4uLy4uL3Jlc291cmNlcy9hd3Mvc3RvcmFnZVwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIENvcnNSdWxlIHtcbiAgcmVhZG9ubHkgYWxsb3dlZE9yaWdpbnM6IHN0cmluZ1tdO1xuICByZWFkb25seSBhbGxvd2VkTWV0aG9kczogc3RyaW5nW107XG4gIHJlYWRvbmx5IGFsbG93ZWRIZWFkZXJzPzogc3RyaW5nW107XG4gIHJlYWRvbmx5IGV4cG9zZWRIZWFkZXJzPzogc3RyaW5nW107XG4gIHJlYWRvbmx5IG1heEFnZT86IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTM0RlcGxveW1lbnRDb25maWcge1xuICAvKiogUGF0aCB0byB0aGUgYXNzZXQgZGlyZWN0b3J5IChyZWxhdGl2ZSB0byBDREsgYXBwIHJvb3QpICovXG4gIHNvdXJjZTogc3RyaW5nO1xuICAvKiogV2hldGhlciB0byByZW1vdmUgZmlsZXMgZnJvbSBidWNrZXQgdGhhdCBhcmUgbm90IGluIHRoZSBzb3VyY2UuIERlZmF1bHQ6IHRydWUgKi9cbiAgcHJ1bmU/OiBib29sZWFuO1xuICAvKiogQ2FjaGUgY29udHJvbCBzZXR0aW5ncyBmb3IgdXBsb2FkZWQgZmlsZXMgKi9cbiAgY2FjaGVDb250cm9sPzoge1xuICAgIC8qKiBNYXggYWdlIGluIHNlY29uZHMgKGUuZy4sIDMxNTM2MDAwIGZvciAxIHllYXIpICovXG4gICAgbWF4QWdlPzogbnVtYmVyO1xuICAgIC8qKiBNYXJrIGFzIGltbXV0YWJsZSAoYnJvd3NlciB3aWxsIG5vdCByZXZhbGlkYXRlKSAqL1xuICAgIGltbXV0YWJsZT86IGJvb2xlYW47XG4gIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUzNQcm9wcyB7XG4gIHJlYWRvbmx5IGJ1Y2tldE5hbWU/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHB1YmxpY1JlYWRBY2Nlc3M/OiBib29sZWFuO1xuICByZWFkb25seSB3ZWJzaXRlSG9zdGluZz86IFdlYnNpdGVIb3N0aW5nQ29uZmlnO1xuICByZWFkb25seSB2ZXJzaW9uZWQ/OiBib29sZWFuO1xuICByZWFkb25seSBlbmNyeXB0aW9uPzogXCJBRVMyNTZcIiB8IFwiS01TXCI7XG4gIHJlYWRvbmx5IGttc0tleUFybj86IHN0cmluZztcbiAgcmVhZG9ubHkgYmFja3VwVmF1bHRUaWVyPzogQmFja3VwVGllcjtcbiAgcmVhZG9ubHkgY29ycz86IENvcnNSdWxlW107XG4gIHJlYWRvbmx5IGRlcGxveW1lbnQ/OiBTM0RlcGxveW1lbnRDb25maWc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RvcmFnZUJ1aWxkUHJvcHMgZXh0ZW5kcyBTM1Byb3BzIHtcbiAgcmVhZG9ubHkgc3RhY2tQbGFjZW1lbnQ/OiBcInN0b3JhZ2VcIiB8IFwiY2RuXCIgfCBcImNvbXB1dGVcIjtcbn1cblxuZXhwb3J0IHR5cGUgU3RvcmFnZUZhY3RvcnlGbiA9ICgoYXBwOiBBcHAsIHNjb3BlOiBDb25zdHJ1Y3QpID0+IFN0b3JhZ2UpICYge1xuICBzdGFja1BsYWNlbWVudD86IFwic3RvcmFnZVwiIHwgXCJjZG5cIiB8IFwiY29tcHV0ZVwiO1xufTtcblxuZnVuY3Rpb24gdG9CdWNrZXRFbmNyeXB0aW9uKFxuICBlbmNyeXB0aW9uPzogXCJBRVMyNTZcIiB8IFwiS01TXCJcbik6IEJ1Y2tldEVuY3J5cHRpb24gfCB1bmRlZmluZWQge1xuICBpZiAoIWVuY3J5cHRpb24pIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiBlbmNyeXB0aW9uID09PSBcIkFFUzI1NlwiXG4gICAgPyBCdWNrZXRFbmNyeXB0aW9uLlMzX01BTkFHRURcbiAgICA6IEJ1Y2tldEVuY3J5cHRpb24uS01TO1xufVxuXG5mdW5jdGlvbiB0b0h0dHBNZXRob2QobWV0aG9kOiBzdHJpbmcpOiBIdHRwTWV0aG9kcyB7XG4gIGNvbnN0IG1ldGhvZE1hcDogUmVjb3JkPHN0cmluZywgSHR0cE1ldGhvZHM+ID0ge1xuICAgIEdFVDogSHR0cE1ldGhvZHMuR0VULFxuICAgIFBVVDogSHR0cE1ldGhvZHMuUFVULFxuICAgIFBPU1Q6IEh0dHBNZXRob2RzLlBPU1QsXG4gICAgREVMRVRFOiBIdHRwTWV0aG9kcy5ERUxFVEUsXG4gICAgSEVBRDogSHR0cE1ldGhvZHMuSEVBRFxuICB9O1xuICByZXR1cm4gbWV0aG9kTWFwW21ldGhvZF0gPz8gSHR0cE1ldGhvZHMuR0VUO1xufVxuXG5mdW5jdGlvbiB0b0NvcnNSdWxlcyhjb3JzPzogQ29yc1J1bGVbXSk6IENka0NvcnNSdWxlW10gfCB1bmRlZmluZWQge1xuICBpZiAoIWNvcnMpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiBjb3JzLm1hcCgocnVsZSkgPT4gKHtcbiAgICBhbGxvd2VkT3JpZ2luczogcnVsZS5hbGxvd2VkT3JpZ2lucyxcbiAgICBhbGxvd2VkTWV0aG9kczogcnVsZS5hbGxvd2VkTWV0aG9kcy5tYXAodG9IdHRwTWV0aG9kKSxcbiAgICAuLi4ocnVsZS5hbGxvd2VkSGVhZGVycyAmJiB7IGFsbG93ZWRIZWFkZXJzOiBydWxlLmFsbG93ZWRIZWFkZXJzIH0pLFxuICAgIC4uLihydWxlLmV4cG9zZWRIZWFkZXJzICYmIHsgZXhwb3NlZEhlYWRlcnM6IHJ1bGUuZXhwb3NlZEhlYWRlcnMgfSksXG4gICAgLi4uKHJ1bGUubWF4QWdlICE9PSB1bmRlZmluZWQgJiYgeyBtYXhBZ2U6IHJ1bGUubWF4QWdlIH0pXG4gIH0pKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlU3RvcmFnZVByb3BzKHByb3BzOiBTM1Byb3BzKTogdm9pZCB7XG4gIGlmIChwcm9wcy5lbmNyeXB0aW9uID09PSBcIktNU1wiICYmICFwcm9wcy5rbXNLZXlBcm4pIHtcbiAgICBGamFsbExvZ2dlci53YXJuKFxuICAgICAgXCInZW5jcnlwdGlvbicgaXMgc2V0IHRvICdLTVMnIGJ1dCAna21zS2V5QXJuJyBpcyBub3QgcHJvdmlkZWQuIFwiICtcbiAgICAgICAgXCJUaGUgYnVja2V0IHdpbGwgdXNlIHRoZSBkZWZhdWx0IEFXUyBtYW5hZ2VkIGtleS5cIlxuICAgICk7XG4gIH1cblxuICBpZiAocHJvcHMua21zS2V5QXJuICYmIHByb3BzLmVuY3J5cHRpb24gIT09IFwiS01TXCIpIHtcbiAgICBGamFsbExvZ2dlci53YXJuKFxuICAgICAgXCIna21zS2V5QXJuJyBpcyBwcm92aWRlZCBidXQgJ2VuY3J5cHRpb24nIGlzIG5vdCBzZXQgdG8gJ0tNUycuIFwiICtcbiAgICAgICAgXCJUaGUgS01TIGtleSB3aWxsIGJlIGlnbm9yZWQuIFNldCBlbmNyeXB0aW9uOiAnS01TJyB0byB1c2UgdGhlIGtleS5cIlxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFN0b3JhZ2UgZXh0ZW5kcyBDb25zdHJ1Y3QgaW1wbGVtZW50cyBJU3RvcmFnZSwgSVN0b3JhZ2VDb25uZWN0b3Ige1xuICBwdWJsaWMgcmVhZG9ubHkgY29ubmVjdG9yVHlwZSA9IFwic3RvcmFnZVwiIGFzIGNvbnN0O1xuICBwcml2YXRlIHJlYWRvbmx5IGJ1Y2tldDogUzNCdWNrZXQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgYnVja2V0RGVwbG95bWVudD86IEJ1Y2tldERlcGxveW1lbnQ7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IFMzUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgY29uc3QgZW5jcnlwdGlvbktleSA9IHByb3BzLmttc0tleUFyblxuICAgICAgPyBLZXkuZnJvbUtleUFybih0aGlzLCBgJHtpZH1LbXNLZXlgLCBwcm9wcy5rbXNLZXlBcm4pXG4gICAgICA6IHVuZGVmaW5lZDtcblxuICAgIHRoaXMuYnVja2V0ID0gbmV3IFMzQnVja2V0KHRoaXMsIGAke2lkfUJ1Y2tldGAsIHtcbiAgICAgIGJ1Y2tldE5hbWU6IHByb3BzLmJ1Y2tldE5hbWUsXG4gICAgICB2ZXJzaW9uZWQ6IHByb3BzLnZlcnNpb25lZCxcbiAgICAgIGVuY3J5cHRpb246IHRvQnVja2V0RW5jcnlwdGlvbihwcm9wcy5lbmNyeXB0aW9uKSxcbiAgICAgIGVuY3J5cHRpb25LZXksXG4gICAgICBiYWNrdXBWYXVsdFRpZXI6IHByb3BzLmJhY2t1cFZhdWx0VGllcixcbiAgICAgIHB1YmxpY1JlYWRBY2Nlc3M6IHByb3BzLnB1YmxpY1JlYWRBY2Nlc3MsXG4gICAgICB3ZWJzaXRlSG9zdGluZzogcHJvcHMud2Vic2l0ZUhvc3RpbmcsXG4gICAgICAuLi4ocHJvcHMuY29ycyAmJiB7IGNvcnM6IHRvQ29yc1J1bGVzKHByb3BzLmNvcnMpIH0pXG4gICAgfSk7XG5cbiAgICBpZiAocHJvcHMuZGVwbG95bWVudCkge1xuICAgICAgdGhpcy5idWNrZXREZXBsb3ltZW50ID0gdGhpcy5jcmVhdGVEZXBsb3ltZW50KGlkLCBwcm9wcy5kZXBsb3ltZW50KTtcbiAgICB9XG5cbiAgICB0aGlzLmFkZE91dHB1dHMoaWQpO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVEZXBsb3ltZW50KFxuICAgIGlkOiBzdHJpbmcsXG4gICAgY29uZmlnOiBTM0RlcGxveW1lbnRDb25maWdcbiAgKTogQnVja2V0RGVwbG95bWVudCB7XG4gICAgY29uc3QgY2FjaGVDb250cm9sSGVhZGVyczogQ2FjaGVDb250cm9sW10gPSBbXTtcblxuICAgIGlmIChjb25maWcuY2FjaGVDb250cm9sPy5tYXhBZ2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY2FjaGVDb250cm9sSGVhZGVycy5wdXNoKFxuICAgICAgICBDYWNoZUNvbnRyb2wubWF4QWdlKER1cmF0aW9uLnNlY29uZHMoY29uZmlnLmNhY2hlQ29udHJvbC5tYXhBZ2UpKVxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5jYWNoZUNvbnRyb2w/LmltbXV0YWJsZSkge1xuICAgICAgY2FjaGVDb250cm9sSGVhZGVycy5wdXNoKENhY2hlQ29udHJvbC5pbW11dGFibGUoKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBCdWNrZXREZXBsb3ltZW50KHRoaXMsIGAke2lkfURlcGxveW1lbnRgLCB7XG4gICAgICBzb3VyY2VzOiBbU291cmNlLmFzc2V0KGNvbmZpZy5zb3VyY2UpXSxcbiAgICAgIGRlc3RpbmF0aW9uQnVja2V0OiB0aGlzLmJ1Y2tldCxcbiAgICAgIHBydW5lOiBjb25maWcucHJ1bmUgPz8gdHJ1ZSxcbiAgICAgIC4uLihjYWNoZUNvbnRyb2xIZWFkZXJzLmxlbmd0aCA+IDAgJiYge1xuICAgICAgICBjYWNoZUNvbnRyb2w6IGNhY2hlQ29udHJvbEhlYWRlcnNcbiAgICAgIH0pXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFkZE91dHB1dHMoaWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHN0YWNrTmFtZSA9IFN0YWNrLm9mKHRoaXMpLnN0YWNrTmFtZTtcblxuICAgIG5ldyBDZm5PdXRwdXQodGhpcywgYCR7aWR9QnVja2V0QXJuYCwge1xuICAgICAga2V5OiBgJHtzdGFja05hbWV9JHtpZH1CdWNrZXRBcm5gLFxuICAgICAgZXhwb3J0TmFtZTogYCR7c3RhY2tOYW1lfSR7aWR9QnVja2V0QXJuYCxcbiAgICAgIHZhbHVlOiB0aGlzLmJ1Y2tldC5idWNrZXRBcm4sXG4gICAgICBkZXNjcmlwdGlvbjogYFMzIEJ1Y2tldCBBUk4gZm9yICR7aWR9YFxuICAgIH0pO1xuXG4gICAgbmV3IENmbk91dHB1dCh0aGlzLCBgJHtpZH1CdWNrZXROYW1lYCwge1xuICAgICAga2V5OiBgJHtzdGFja05hbWV9JHtpZH1CdWNrZXROYW1lYCxcbiAgICAgIGV4cG9ydE5hbWU6IGAke3N0YWNrTmFtZX0ke2lkfUJ1Y2tldE5hbWVgLFxuICAgICAgdmFsdWU6IHRoaXMuYnVja2V0LmJ1Y2tldE5hbWUsXG4gICAgICBkZXNjcmlwdGlvbjogYFMzIEJ1Y2tldCBOYW1lIGZvciAke2lkfWBcbiAgICB9KTtcbiAgfVxuXG4gIGdldEJ1Y2tldCgpOiBJQnVja2V0IHtcbiAgICByZXR1cm4gdGhpcy5idWNrZXQ7XG4gIH1cblxuICBnZXRCdWNrZXROYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuYnVja2V0LmJ1Y2tldE5hbWU7XG4gIH1cblxuICBnZXRCdWNrZXRBcm4oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5idWNrZXQuYnVja2V0QXJuO1xuICB9XG5cbiAgZ2V0QnVja2V0RG9tYWluTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmJ1Y2tldC5idWNrZXREb21haW5OYW1lO1xuICB9XG5cbiAgZ2V0QnVja2V0UmVnaW9uYWxEb21haW5OYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuYnVja2V0LmJ1Y2tldFJlZ2lvbmFsRG9tYWluTmFtZTtcbiAgfVxuXG4gIGdldFdlYnNpdGVVcmwoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5idWNrZXQuYnVja2V0V2Vic2l0ZVVybDtcbiAgfVxuXG4gIGdldERlcGxveW1lbnQoKTogQnVja2V0RGVwbG95bWVudCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuYnVja2V0RGVwbG95bWVudDtcbiAgfVxuXG4gIGdyYW50UmVhZChncmFudGVlOiBJR3JhbnRhYmxlKTogR3JhbnQge1xuICAgIHJldHVybiB0aGlzLmJ1Y2tldC5ncmFudFJlYWQoZ3JhbnRlZSk7XG4gIH1cblxuICBncmFudFdyaXRlKGdyYW50ZWU6IElHcmFudGFibGUpOiBHcmFudCB7XG4gICAgcmV0dXJuIHRoaXMuYnVja2V0LmdyYW50V3JpdGUoZ3JhbnRlZSk7XG4gIH1cblxuICBncmFudFJlYWRXcml0ZShncmFudGVlOiBJR3JhbnRhYmxlKTogR3JhbnQge1xuICAgIHJldHVybiB0aGlzLmJ1Y2tldC5ncmFudFJlYWRXcml0ZShncmFudGVlKTtcbiAgfVxuXG4gIGdyYW50RGVsZXRlKGdyYW50ZWU6IElHcmFudGFibGUpOiBHcmFudCB7XG4gICAgcmV0dXJuIHRoaXMuYnVja2V0LmdyYW50RGVsZXRlKGdyYW50ZWUpO1xuICB9XG5cbiAgZ3JhbnRQdXQoZ3JhbnRlZTogSUdyYW50YWJsZSk6IEdyYW50IHtcbiAgICByZXR1cm4gdGhpcy5idWNrZXQuZ3JhbnRQdXQoZ3JhbnRlZSk7XG4gIH1cblxuICBncmFudFB1YmxpY0FjY2VzcyguLi5rZXlQcmVmaXg6IHN0cmluZ1tdKTogR3JhbnQge1xuICAgIHJldHVybiB0aGlzLmJ1Y2tldC5ncmFudFB1YmxpY0FjY2VzcyguLi5rZXlQcmVmaXgpO1xuICB9XG5cbiAgYWRkRXZlbnROb3RpZmljYXRpb24oXG4gICAgZXZlbnQ6IEV2ZW50VHlwZSxcbiAgICBkZXN0OiBJQnVja2V0Tm90aWZpY2F0aW9uRGVzdGluYXRpb24sXG4gICAgLi4uZmlsdGVyczogTm90aWZpY2F0aW9uS2V5RmlsdGVyW11cbiAgKTogdm9pZCB7XG4gICAgdGhpcy5idWNrZXQuYWRkRXZlbnROb3RpZmljYXRpb24oZXZlbnQsIGRlc3QsIC4uLmZpbHRlcnMpO1xuICB9XG5cbiAgYWRkT2JqZWN0Q3JlYXRlZE5vdGlmaWNhdGlvbihcbiAgICBkZXN0OiBJQnVja2V0Tm90aWZpY2F0aW9uRGVzdGluYXRpb24sXG4gICAgLi4uZmlsdGVyczogTm90aWZpY2F0aW9uS2V5RmlsdGVyW11cbiAgKTogdm9pZCB7XG4gICAgdGhpcy5idWNrZXQuYWRkT2JqZWN0Q3JlYXRlZE5vdGlmaWNhdGlvbihkZXN0LCAuLi5maWx0ZXJzKTtcbiAgfVxuXG4gIGFkZE9iamVjdFJlbW92ZWROb3RpZmljYXRpb24oXG4gICAgZGVzdDogSUJ1Y2tldE5vdGlmaWNhdGlvbkRlc3RpbmF0aW9uLFxuICAgIC4uLmZpbHRlcnM6IE5vdGlmaWNhdGlvbktleUZpbHRlcltdXG4gICk6IHZvaWQge1xuICAgIHRoaXMuYnVja2V0LmFkZE9iamVjdFJlbW92ZWROb3RpZmljYXRpb24oZGVzdCwgLi4uZmlsdGVycyk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFN0b3JhZ2VGYWN0b3J5IHtcbiAgc3RhdGljIGJ1aWxkKGlkOiBzdHJpbmcsIHByb3BzOiBTdG9yYWdlQnVpbGRQcm9wcyA9IHt9KTogU3RvcmFnZUZhY3RvcnlGbiB7XG4gICAgY29uc3QgeyBzdGFja1BsYWNlbWVudCwgLi4uczNQcm9wcyB9ID0gcHJvcHM7XG4gICAgY29uc3QgZm46IFN0b3JhZ2VGYWN0b3J5Rm4gPSAoX2FwcDogQXBwLCBzY29wZTogQ29uc3RydWN0KSA9PiB7XG4gICAgICB2YWxpZGF0ZVN0b3JhZ2VQcm9wcyhzM1Byb3BzKTtcbiAgICAgIHJldHVybiBuZXcgU3RvcmFnZShzY29wZSwgaWQsIHMzUHJvcHMpO1xuICAgIH07XG4gICAgaWYgKHN0YWNrUGxhY2VtZW50KSB7XG4gICAgICBmbi5zdGFja1BsYWNlbWVudCA9IHN0YWNrUGxhY2VtZW50O1xuICAgIH1cbiAgICByZXR1cm4gZm47XG4gIH1cbn1cbiJdfQ==
@@ -1,24 +1,21 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.SubdomainHostedZone = void 0;
4
- const route53 = require("aws-cdk-lib/aws-route53");
5
- const aws_cdk_lib_1 = require("aws-cdk-lib");
6
- const iam_1 = require("../../resources/aws/iam");
7
- const getAccountId_1 = require("../../utils/getAccountId");
8
- const app_1 = require("../../app");
9
- class SubdomainHostedZone extends aws_cdk_lib_1.Stack {
1
+ import * as route53 from "aws-cdk-lib/aws-route53";
2
+ import { CfnOutput, Stack } from "aws-cdk-lib";
3
+ import { Role } from "../../resources/aws/iam/index.js";
4
+ import getAccountId from "../../utils/getAccountId.js";
5
+ import App from "../../app.js";
6
+ export class SubdomainHostedZone extends Stack {
10
7
  constructor(id, props) {
11
- super(app_1.default.getInstance(), id);
8
+ super(App.getInstance(), id);
12
9
  // DelegationRoleArn
13
- const delegationRoleArn = aws_cdk_lib_1.Stack.of(this).formatArn({
14
- account: (0, getAccountId_1.default)(props.parentAccountName),
10
+ const delegationRoleArn = Stack.of(this).formatArn({
11
+ account: getAccountId(props.parentAccountName),
15
12
  region: "",
16
13
  resource: "role",
17
14
  resourceName: `${props.parentHostedZoneName.split(".", 1)}DelegateHostedZoneRole`,
18
15
  service: "iam"
19
16
  });
20
17
  // Delegate Hosted Zone Role
21
- const hostedZoneDelegationRole = iam_1.Role.fromRoleArn(this, "hostedZoneDelegationRole", delegationRoleArn);
18
+ const hostedZoneDelegationRole = Role.fromRoleArn(this, "hostedZoneDelegationRole", delegationRoleArn);
22
19
  // Subdomains
23
20
  const delegatedHostedZone = new route53.HostedZone(this, `${props.delegatedZone}HostedZone`, {
24
21
  zoneName: props.delegatedZone
@@ -28,12 +25,10 @@ class SubdomainHostedZone extends aws_cdk_lib_1.Stack {
28
25
  delegatedZone: delegatedHostedZone,
29
26
  parentHostedZoneName: props.parentHostedZoneName
30
27
  });
31
- new aws_cdk_lib_1.CfnOutput(this, `${props.delegatedZone.split(".").join("")}HostedZoneId`, {
28
+ new CfnOutput(this, `${props.delegatedZone.split(".").join("")}HostedZoneId`, {
32
29
  key: `${props.delegatedZone.split(".").join("")}HostedZoneId`,
33
30
  value: delegatedHostedZone.hostedZoneId,
34
31
  exportName: `${props.delegatedZone.split(".").join("")}HostedZoneId`
35
32
  });
36
33
  }
37
34
  }
38
- exports.SubdomainHostedZone = SubdomainHostedZone;
39
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3ViZG9tYWluSG9zdGVkWm9uZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYi9wYXR0ZXJucy9hd3Mvc3ViZG9tYWluSG9zdGVkWm9uZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxtREFBbUQ7QUFDbkQsNkNBQStDO0FBQy9DLGlEQUErQztBQUMvQywyREFBb0Q7QUFDcEQsbUNBQTRCO0FBUTVCLE1BQWEsbUJBQW9CLFNBQVEsbUJBQUs7SUFDNUMsWUFBWSxFQUFVLEVBQUUsS0FBK0I7UUFDckQsS0FBSyxDQUFDLGFBQUcsQ0FBQyxXQUFXLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUU3QixvQkFBb0I7UUFDcEIsTUFBTSxpQkFBaUIsR0FBRyxtQkFBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDakQsT0FBTyxFQUFFLElBQUEsc0JBQVksRUFBQyxLQUFLLENBQUMsaUJBQWlCLENBQUM7WUFDOUMsTUFBTSxFQUFFLEVBQUU7WUFDVixRQUFRLEVBQUUsTUFBTTtZQUNoQixZQUFZLEVBQUUsR0FBRyxLQUFLLENBQUMsb0JBQW9CLENBQUMsS0FBSyxDQUMvQyxHQUFHLEVBQ0gsQ0FBQyxDQUNGLHdCQUF3QjtZQUN6QixPQUFPLEVBQUUsS0FBSztTQUNmLENBQUMsQ0FBQztRQUVILDRCQUE0QjtRQUM1QixNQUFNLHdCQUF3QixHQUFHLFVBQUksQ0FBQyxXQUFXLENBQy9DLElBQUksRUFDSiwwQkFBMEIsRUFDMUIsaUJBQWlCLENBQ2xCLENBQUM7UUFFRixhQUFhO1FBQ2IsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLE9BQU8sQ0FBQyxVQUFVLENBQ2hELElBQUksRUFDSixHQUFHLEtBQUssQ0FBQyxhQUFhLFlBQVksRUFDbEM7WUFDRSxRQUFRLEVBQUUsS0FBSyxDQUFDLGFBQWE7U0FDOUIsQ0FDRixDQUFDO1FBRUYsSUFBSSxPQUFPLENBQUMsZ0NBQWdDLENBQzFDLElBQUksRUFDSixHQUFHLEtBQUssQ0FBQyxhQUFhLGdCQUFnQixFQUN0QztZQUNFLGNBQWMsRUFBRSx3QkFBd0I7WUFDeEMsYUFBYSxFQUFFLG1CQUFtQjtZQUNsQyxvQkFBb0IsRUFBRSxLQUFLLENBQUMsb0JBQW9CO1NBQ2pELENBQ0YsQ0FBQztRQUVGLElBQUksdUJBQVMsQ0FDWCxJQUFJLEVBQ0osR0FBRyxLQUFLLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLGNBQWMsRUFDeEQ7WUFDRSxHQUFHLEVBQUUsR0FBRyxLQUFLLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLGNBQWM7WUFDN0QsS0FBSyxFQUFFLG1CQUFtQixDQUFDLFlBQVk7WUFDdkMsVUFBVSxFQUFFLEdBQUcsS0FBSyxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxjQUFjO1NBQ3JFLENBQ0YsQ0FBQztJQUNKLENBQUM7Q0FDRjtBQXBERCxrREFvREMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyByb3V0ZTUzIGZyb20gXCJhd3MtY2RrLWxpYi9hd3Mtcm91dGU1M1wiO1xuaW1wb3J0IHsgQ2ZuT3V0cHV0LCBTdGFjayB9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuaW1wb3J0IHsgUm9sZSB9IGZyb20gXCIuLi8uLi9yZXNvdXJjZXMvYXdzL2lhbVwiO1xuaW1wb3J0IGdldEFjY291bnRJZCBmcm9tIFwiLi4vLi4vdXRpbHMvZ2V0QWNjb3VudElkXCI7XG5pbXBvcnQgQXBwIGZyb20gXCIuLi8uLi9hcHBcIjtcblxuZXhwb3J0IGludGVyZmFjZSBzdWJkb21haW5Ib3N0ZWRab25lUHJvcHMge1xuICBkZWxlZ2F0ZWRab25lOiBzdHJpbmc7XG4gIHBhcmVudEhvc3RlZFpvbmVOYW1lOiBzdHJpbmc7XG4gIHBhcmVudEFjY291bnROYW1lOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjbGFzcyBTdWJkb21haW5Ib3N0ZWRab25lIGV4dGVuZHMgU3RhY2sge1xuICBjb25zdHJ1Y3RvcihpZDogc3RyaW5nLCBwcm9wczogc3ViZG9tYWluSG9zdGVkWm9uZVByb3BzKSB7XG4gICAgc3VwZXIoQXBwLmdldEluc3RhbmNlKCksIGlkKTtcblxuICAgIC8vIERlbGVnYXRpb25Sb2xlQXJuXG4gICAgY29uc3QgZGVsZWdhdGlvblJvbGVBcm4gPSBTdGFjay5vZih0aGlzKS5mb3JtYXRBcm4oe1xuICAgICAgYWNjb3VudDogZ2V0QWNjb3VudElkKHByb3BzLnBhcmVudEFjY291bnROYW1lKSxcbiAgICAgIHJlZ2lvbjogXCJcIixcbiAgICAgIHJlc291cmNlOiBcInJvbGVcIixcbiAgICAgIHJlc291cmNlTmFtZTogYCR7cHJvcHMucGFyZW50SG9zdGVkWm9uZU5hbWUuc3BsaXQoXG4gICAgICAgIFwiLlwiLFxuICAgICAgICAxXG4gICAgICApfURlbGVnYXRlSG9zdGVkWm9uZVJvbGVgLFxuICAgICAgc2VydmljZTogXCJpYW1cIlxuICAgIH0pO1xuXG4gICAgLy8gRGVsZWdhdGUgSG9zdGVkIFpvbmUgUm9sZVxuICAgIGNvbnN0IGhvc3RlZFpvbmVEZWxlZ2F0aW9uUm9sZSA9IFJvbGUuZnJvbVJvbGVBcm4oXG4gICAgICB0aGlzLFxuICAgICAgXCJob3N0ZWRab25lRGVsZWdhdGlvblJvbGVcIixcbiAgICAgIGRlbGVnYXRpb25Sb2xlQXJuXG4gICAgKTtcblxuICAgIC8vIFN1YmRvbWFpbnNcbiAgICBjb25zdCBkZWxlZ2F0ZWRIb3N0ZWRab25lID0gbmV3IHJvdXRlNTMuSG9zdGVkWm9uZShcbiAgICAgIHRoaXMsXG4gICAgICBgJHtwcm9wcy5kZWxlZ2F0ZWRab25lfUhvc3RlZFpvbmVgLFxuICAgICAge1xuICAgICAgICB6b25lTmFtZTogcHJvcHMuZGVsZWdhdGVkWm9uZVxuICAgICAgfVxuICAgICk7XG5cbiAgICBuZXcgcm91dGU1My5Dcm9zc0FjY291bnRab25lRGVsZWdhdGlvblJlY29yZChcbiAgICAgIHRoaXMsXG4gICAgICBgJHtwcm9wcy5kZWxlZ2F0ZWRab25lfURlbGVnYXRpb25Sb2xlYCxcbiAgICAgIHtcbiAgICAgICAgZGVsZWdhdGlvblJvbGU6IGhvc3RlZFpvbmVEZWxlZ2F0aW9uUm9sZSxcbiAgICAgICAgZGVsZWdhdGVkWm9uZTogZGVsZWdhdGVkSG9zdGVkWm9uZSxcbiAgICAgICAgcGFyZW50SG9zdGVkWm9uZU5hbWU6IHByb3BzLnBhcmVudEhvc3RlZFpvbmVOYW1lXG4gICAgICB9XG4gICAgKTtcblxuICAgIG5ldyBDZm5PdXRwdXQoXG4gICAgICB0aGlzLFxuICAgICAgYCR7cHJvcHMuZGVsZWdhdGVkWm9uZS5zcGxpdChcIi5cIikuam9pbihcIlwiKX1Ib3N0ZWRab25lSWRgLFxuICAgICAge1xuICAgICAgICBrZXk6IGAke3Byb3BzLmRlbGVnYXRlZFpvbmUuc3BsaXQoXCIuXCIpLmpvaW4oXCJcIil9SG9zdGVkWm9uZUlkYCxcbiAgICAgICAgdmFsdWU6IGRlbGVnYXRlZEhvc3RlZFpvbmUuaG9zdGVkWm9uZUlkLFxuICAgICAgICBleHBvcnROYW1lOiBgJHtwcm9wcy5kZWxlZ2F0ZWRab25lLnNwbGl0KFwiLlwiKS5qb2luKFwiXCIpfUhvc3RlZFpvbmVJZGBcbiAgICAgIH1cbiAgICApO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,37 @@
1
+ import { type IAliasRecordTarget } from "aws-cdk-lib/aws-route53";
2
+ import type { FjallTarget } from "../interfaces/domain.js";
3
+ /**
4
+ * Intersection of the introspectable `FjallTarget` discriminant (used for
5
+ * eject + deploy ordering) and CDK's `IAliasRecordTarget` (used for synth).
6
+ * Every helper in this module returns this intersection so downstream code
7
+ * can treat the same value as either without re-resolving.
8
+ */
9
+ export type FjallAliasTarget = FjallTarget & IAliasRecordTarget;
10
+ /**
11
+ * Target helper for a Fjall ECS/ALB-fronted app.
12
+ *
13
+ * Requires the app stack to publish exports `${safeApp}AlbDnsName` and
14
+ * `${safeApp}AlbHostedZoneId`. Phase 2 wires these emitters; until then,
15
+ * deploys fail at CloudFormation execution with "No export named … found".
16
+ */
17
+ export declare function fjallApp(appName: string): FjallAliasTarget;
18
+ /**
19
+ * Target helper for a Fjall CloudFront-fronted app.
20
+ *
21
+ * Requires the CDN stack to publish export `${safeApp}CdnDistributionDomainName`.
22
+ * Phase 2 wires the emitter.
23
+ */
24
+ export declare function fjallCdn(appName: string): FjallAliasTarget;
25
+ /**
26
+ * Target helper for a Fjall S3 static-site bucket.
27
+ *
28
+ * Requires the bucket stack to publish exports `${safeBucket}WebsiteEndpoint`
29
+ * and `${safeBucket}WebsiteHostedZoneId`. Phase 2 wires these emitters.
30
+ */
31
+ export declare function fjallBucket(bucketName: string): FjallAliasTarget;
32
+ /**
33
+ * Target helper for an arbitrary `(dnsName, hostedZoneId)` pair. Accepts
34
+ * literal strings or CDK tokens (e.g. a `CfnOutput.value`). No
35
+ * `Fn.importValue` wrapping — the values pass through verbatim.
36
+ */
37
+ export declare function aliasTo(dnsName: string, hostedZoneId: string): FjallAliasTarget;
@@ -0,0 +1,66 @@
1
+ import { resolveBucketTarget, resolveCdnTarget, resolveCustomTarget, resolveEcsTarget } from "./targetResolution.js";
2
+ /**
3
+ * Target helper for a Fjall ECS/ALB-fronted app.
4
+ *
5
+ * Requires the app stack to publish exports `${safeApp}AlbDnsName` and
6
+ * `${safeApp}AlbHostedZoneId`. Phase 2 wires these emitters; until then,
7
+ * deploys fail at CloudFormation execution with "No export named … found".
8
+ */
9
+ export function fjallApp(appName) {
10
+ const resolved = resolveEcsTarget(appName);
11
+ return {
12
+ kind: "ecs",
13
+ appName,
14
+ bind(record, zone) {
15
+ return resolved.bind(record, zone);
16
+ }
17
+ };
18
+ }
19
+ /**
20
+ * Target helper for a Fjall CloudFront-fronted app.
21
+ *
22
+ * Requires the CDN stack to publish export `${safeApp}CdnDistributionDomainName`.
23
+ * Phase 2 wires the emitter.
24
+ */
25
+ export function fjallCdn(appName) {
26
+ const resolved = resolveCdnTarget(appName);
27
+ return {
28
+ kind: "cdn",
29
+ appName,
30
+ bind(record, zone) {
31
+ return resolved.bind(record, zone);
32
+ }
33
+ };
34
+ }
35
+ /**
36
+ * Target helper for a Fjall S3 static-site bucket.
37
+ *
38
+ * Requires the bucket stack to publish exports `${safeBucket}WebsiteEndpoint`
39
+ * and `${safeBucket}WebsiteHostedZoneId`. Phase 2 wires these emitters.
40
+ */
41
+ export function fjallBucket(bucketName) {
42
+ const resolved = resolveBucketTarget(bucketName);
43
+ return {
44
+ kind: "bucket",
45
+ bucketName,
46
+ bind(record, zone) {
47
+ return resolved.bind(record, zone);
48
+ }
49
+ };
50
+ }
51
+ /**
52
+ * Target helper for an arbitrary `(dnsName, hostedZoneId)` pair. Accepts
53
+ * literal strings or CDK tokens (e.g. a `CfnOutput.value`). No
54
+ * `Fn.importValue` wrapping — the values pass through verbatim.
55
+ */
56
+ export function aliasTo(dnsName, hostedZoneId) {
57
+ const resolved = resolveCustomTarget(dnsName, hostedZoneId);
58
+ return {
59
+ kind: "custom",
60
+ dnsName,
61
+ hostedZoneId,
62
+ bind(record, zone) {
63
+ return resolved.bind(record, zone);
64
+ }
65
+ };
66
+ }
@@ -0,0 +1,2 @@
1
+ export { fjallApp, fjallCdn, fjallBucket, aliasTo, type FjallAliasTarget } from "./fjallTargets.js";
2
+ export { CLOUDFRONT_HOSTED_ZONE_ID } from "./targetResolution.js";
@@ -0,0 +1,2 @@
1
+ export { fjallApp, fjallCdn, fjallBucket, aliasTo } from "./fjallTargets.js";
2
+ export { CLOUDFRONT_HOSTED_ZONE_ID } from "./targetResolution.js";
@@ -0,0 +1,76 @@
1
+ import { type IAliasRecordTarget } from "aws-cdk-lib/aws-route53";
2
+ import type { FjallTarget } from "../interfaces/domain.js";
3
+ /**
4
+ * Cross-phase export-name contract.
5
+ *
6
+ * Phase 1 DEFINES these export names; Phase 2 is responsible for wiring the
7
+ * emitting stacks (`computeEcs.ts`, `cdn.ts`, `storage.ts`) to publish each
8
+ * `CfnOutput` with the matching `exportName`. Until Phase 2 lands the
9
+ * producers, a deploy of any `Domain` with a typed target fails at
10
+ * CloudFormation execution with "No export named … found" — the helpers
11
+ * compile and synthesise, but the cross-stack import resolves at deploy.
12
+ *
13
+ * Producer-consumer matrix (see Phase 1 plan §3, D6 / T0.5):
14
+ *
15
+ * | Producer (Phase 2) | Consumer (Phase 1) | Export name |
16
+ * |-----------------------------|-------------------------|------------------------------------------|
17
+ * | `computeEcs.ts` app stack | `resolveEcsTarget` | `${safeApp}AlbDnsName` |
18
+ * | `computeEcs.ts` app stack | `resolveEcsTarget` | `${safeApp}AlbHostedZoneId` |
19
+ * | `cdn.ts` CDN stack | `resolveCdnTarget` | `${safeApp}CdnDistributionDomainName` |
20
+ * | `storage.ts` bucket stack | `resolveBucketTarget` | `${safeBucket}WebsiteEndpoint` |
21
+ * | `storage.ts` bucket stack | `resolveBucketTarget` | `${safeBucket}WebsiteHostedZoneId` |
22
+ */
23
+ export declare const EXPORT_NAMES: {
24
+ readonly ALB_DNS: (safeApp: string) => string;
25
+ readonly ALB_HOSTED_ZONE_ID: (safeApp: string) => string;
26
+ readonly CDN_DOMAIN: (safeApp: string) => string;
27
+ readonly BUCKET_WEBSITE_ENDPOINT: (safeBucket: string) => string;
28
+ readonly BUCKET_WEBSITE_HZ_ID: (safeBucket: string) => string;
29
+ };
30
+ /** Route53-reserved hosted-zone id for CloudFront distributions. */
31
+ export declare const CLOUDFRONT_HOSTED_ZONE_ID = "Z2FDTNDATAQYW2";
32
+ /**
33
+ * Resolve a Fjall ECS/ALB-fronted app to an `IAliasRecordTarget`.
34
+ *
35
+ * Requires the app stack to publish exports:
36
+ * - `${safeApp}AlbDnsName`
37
+ * - `${safeApp}AlbHostedZoneId`
38
+ *
39
+ * Phase 2 wires the emitters; until then, deploys of typed targets fail with
40
+ * "No export named … found".
41
+ */
42
+ export declare function resolveEcsTarget(appName: string): IAliasRecordTarget;
43
+ /**
44
+ * Resolve a Fjall CloudFront-fronted app to an `IAliasRecordTarget`.
45
+ *
46
+ * Requires the CDN stack to publish export `${safeApp}CdnDistributionDomainName`.
47
+ * The CloudFront hosted-zone id is the globally fixed `Z2FDTNDATAQYW2`.
48
+ *
49
+ * Phase 2 wires the emitter; until then, deploys of typed targets fail with
50
+ * "No export named … found".
51
+ */
52
+ export declare function resolveCdnTarget(appName: string): IAliasRecordTarget;
53
+ /**
54
+ * Resolve a Fjall S3 static-site bucket to an `IAliasRecordTarget`.
55
+ *
56
+ * Requires the bucket stack to publish exports:
57
+ * - `${safeBucket}WebsiteEndpoint`
58
+ * - `${safeBucket}WebsiteHostedZoneId`
59
+ *
60
+ * Phase 2 wires the emitters; until then, deploys of typed targets fail with
61
+ * "No export named … found".
62
+ */
63
+ export declare function resolveBucketTarget(bucketName: string): IAliasRecordTarget;
64
+ /**
65
+ * Pure passthrough — accepts concrete DNS name + hosted-zone id (or CDK
66
+ * tokens) and forwards them unchanged. No `Fn.importValue` wrapping.
67
+ */
68
+ export declare function resolveCustomTarget(dnsName: string, hostedZoneId: string): IAliasRecordTarget;
69
+ /**
70
+ * Resolve a `FjallTarget` to its raw DNS-name string. The return value is a
71
+ * CloudFormation token for the ECS/CDN/bucket variants — Phase 2 resolves the
72
+ * concrete host via `describeStackResources` after deploy. Used only by
73
+ * `externalRecordsPattern.ts` where no Route53 resource exists and manual
74
+ * record emission needs a string value.
75
+ */
76
+ export declare function resolveTargetToDnsName(target: FjallTarget): string;
@@ -0,0 +1,119 @@
1
+ import { Fn } from "aws-cdk-lib";
2
+ import { toPascalCase } from "../../../utils/capitaliseString.js";
3
+ /**
4
+ * Cross-phase export-name contract.
5
+ *
6
+ * Phase 1 DEFINES these export names; Phase 2 is responsible for wiring the
7
+ * emitting stacks (`computeEcs.ts`, `cdn.ts`, `storage.ts`) to publish each
8
+ * `CfnOutput` with the matching `exportName`. Until Phase 2 lands the
9
+ * producers, a deploy of any `Domain` with a typed target fails at
10
+ * CloudFormation execution with "No export named … found" — the helpers
11
+ * compile and synthesise, but the cross-stack import resolves at deploy.
12
+ *
13
+ * Producer-consumer matrix (see Phase 1 plan §3, D6 / T0.5):
14
+ *
15
+ * | Producer (Phase 2) | Consumer (Phase 1) | Export name |
16
+ * |-----------------------------|-------------------------|------------------------------------------|
17
+ * | `computeEcs.ts` app stack | `resolveEcsTarget` | `${safeApp}AlbDnsName` |
18
+ * | `computeEcs.ts` app stack | `resolveEcsTarget` | `${safeApp}AlbHostedZoneId` |
19
+ * | `cdn.ts` CDN stack | `resolveCdnTarget` | `${safeApp}CdnDistributionDomainName` |
20
+ * | `storage.ts` bucket stack | `resolveBucketTarget` | `${safeBucket}WebsiteEndpoint` |
21
+ * | `storage.ts` bucket stack | `resolveBucketTarget` | `${safeBucket}WebsiteHostedZoneId` |
22
+ */
23
+ export const EXPORT_NAMES = {
24
+ ALB_DNS: (safeApp) => `${safeApp}AlbDnsName`,
25
+ ALB_HOSTED_ZONE_ID: (safeApp) => `${safeApp}AlbHostedZoneId`,
26
+ CDN_DOMAIN: (safeApp) => `${safeApp}CdnDistributionDomainName`,
27
+ BUCKET_WEBSITE_ENDPOINT: (safeBucket) => `${safeBucket}WebsiteEndpoint`,
28
+ BUCKET_WEBSITE_HZ_ID: (safeBucket) => `${safeBucket}WebsiteHostedZoneId`
29
+ };
30
+ /** Route53-reserved hosted-zone id for CloudFront distributions. */
31
+ export const CLOUDFRONT_HOSTED_ZONE_ID = "Z2FDTNDATAQYW2";
32
+ /**
33
+ * Build an object satisfying CDK's `IAliasRecordTarget` shape. The
34
+ * `bind(record, zone?)` signature mirrors `aws-cdk-lib/aws-route53` exactly so
35
+ * future CDK tightenings of the interface continue to compile.
36
+ */
37
+ function buildAliasTarget(dnsName, hostedZoneId) {
38
+ return {
39
+ bind(_record, _zone) {
40
+ return { dnsName, hostedZoneId };
41
+ }
42
+ };
43
+ }
44
+ /**
45
+ * Resolve a Fjall ECS/ALB-fronted app to an `IAliasRecordTarget`.
46
+ *
47
+ * Requires the app stack to publish exports:
48
+ * - `${safeApp}AlbDnsName`
49
+ * - `${safeApp}AlbHostedZoneId`
50
+ *
51
+ * Phase 2 wires the emitters; until then, deploys of typed targets fail with
52
+ * "No export named … found".
53
+ */
54
+ export function resolveEcsTarget(appName) {
55
+ const safeApp = toPascalCase(appName);
56
+ const dnsName = Fn.importValue(EXPORT_NAMES.ALB_DNS(safeApp));
57
+ const hostedZoneId = Fn.importValue(EXPORT_NAMES.ALB_HOSTED_ZONE_ID(safeApp));
58
+ return buildAliasTarget(dnsName, hostedZoneId);
59
+ }
60
+ /**
61
+ * Resolve a Fjall CloudFront-fronted app to an `IAliasRecordTarget`.
62
+ *
63
+ * Requires the CDN stack to publish export `${safeApp}CdnDistributionDomainName`.
64
+ * The CloudFront hosted-zone id is the globally fixed `Z2FDTNDATAQYW2`.
65
+ *
66
+ * Phase 2 wires the emitter; until then, deploys of typed targets fail with
67
+ * "No export named … found".
68
+ */
69
+ export function resolveCdnTarget(appName) {
70
+ const safeApp = toPascalCase(appName);
71
+ const dnsName = Fn.importValue(EXPORT_NAMES.CDN_DOMAIN(safeApp));
72
+ return buildAliasTarget(dnsName, CLOUDFRONT_HOSTED_ZONE_ID);
73
+ }
74
+ /**
75
+ * Resolve a Fjall S3 static-site bucket to an `IAliasRecordTarget`.
76
+ *
77
+ * Requires the bucket stack to publish exports:
78
+ * - `${safeBucket}WebsiteEndpoint`
79
+ * - `${safeBucket}WebsiteHostedZoneId`
80
+ *
81
+ * Phase 2 wires the emitters; until then, deploys of typed targets fail with
82
+ * "No export named … found".
83
+ */
84
+ export function resolveBucketTarget(bucketName) {
85
+ const safeBucket = toPascalCase(bucketName);
86
+ const dnsName = Fn.importValue(EXPORT_NAMES.BUCKET_WEBSITE_ENDPOINT(safeBucket));
87
+ const hostedZoneId = Fn.importValue(EXPORT_NAMES.BUCKET_WEBSITE_HZ_ID(safeBucket));
88
+ return buildAliasTarget(dnsName, hostedZoneId);
89
+ }
90
+ /**
91
+ * Pure passthrough — accepts concrete DNS name + hosted-zone id (or CDK
92
+ * tokens) and forwards them unchanged. No `Fn.importValue` wrapping.
93
+ */
94
+ export function resolveCustomTarget(dnsName, hostedZoneId) {
95
+ return buildAliasTarget(dnsName, hostedZoneId);
96
+ }
97
+ /**
98
+ * Resolve a `FjallTarget` to its raw DNS-name string. The return value is a
99
+ * CloudFormation token for the ECS/CDN/bucket variants — Phase 2 resolves the
100
+ * concrete host via `describeStackResources` after deploy. Used only by
101
+ * `externalRecordsPattern.ts` where no Route53 resource exists and manual
102
+ * record emission needs a string value.
103
+ */
104
+ export function resolveTargetToDnsName(target) {
105
+ switch (target.kind) {
106
+ case "ecs":
107
+ return Fn.importValue(EXPORT_NAMES.ALB_DNS(toPascalCase(target.appName)));
108
+ case "cdn":
109
+ return Fn.importValue(EXPORT_NAMES.CDN_DOMAIN(toPascalCase(target.appName)));
110
+ case "bucket":
111
+ return Fn.importValue(EXPORT_NAMES.BUCKET_WEBSITE_ENDPOINT(toPascalCase(target.bucketName)));
112
+ case "custom":
113
+ return target.dnsName;
114
+ default: {
115
+ const _exhaustive = target;
116
+ throw new Error(`Unsupported FjallTarget kind: ${String(_exhaustive.kind)}`);
117
+ }
118
+ }
119
+ }
@@ -0,0 +1 @@
1
+ export * from "./aws/index.js";
@@ -0,0 +1 @@
1
+ export * from "./aws/index.js";
@@ -0,0 +1,15 @@
1
+ import { Connections, type IConnectable } from "aws-cdk-lib/aws-ec2";
2
+ import { Construct } from "constructs";
3
+ import type { ClickHouseProps, ClickHouseOutputs } from "./clickhouseTypes.js";
4
+ /**
5
+ * ClickHouse analytics infrastructure.
6
+ *
7
+ * Creates a single-node ClickHouse instance on ECS EC2 with a dedicated
8
+ * gp3 EBS volume for data persistence. Designed for analytical workloads
9
+ * (cost aggregation, deployment metrics, audit logs) rather than OLTP.
10
+ */
11
+ export default class ClickHouse extends Construct implements IConnectable {
12
+ readonly connections: Connections;
13
+ readonly outputs: ClickHouseOutputs;
14
+ constructor(scope: Construct, id: string, props: ClickHouseProps);
15
+ }