@fjall/components-infrastructure 0.89.5 → 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 +60 -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 +81 -71
  181. package/dist/lib/resources/aws/database/dynamodb.js +24 -27
  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,56 +1,35 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getConfig = getConfig;
4
- const app_1 = require("../app");
5
- const validationLogger_1 = require("./validationLogger");
6
- function getConfig(accountName) {
7
- const app = app_1.default.getInstance();
1
+ import App from "../app.js";
2
+ import { parseOrgConfig } from "./orgConfigParser.js";
3
+ import { FjallLogger } from "./validationLogger.js";
4
+ export function getConfig(accountName) {
5
+ const app = App.getInstance();
8
6
  const config = {
9
7
  region: process.env.AWS_REGION || "us-east-1",
10
8
  environment: "unknown",
11
- existingAccounts: [],
12
9
  secondaryRegions: [],
13
10
  allRegions: []
14
11
  };
15
12
  if (!process.env.AWS_REGION)
16
- validationLogger_1.FjallLogger.warn("AWS_REGION is not set, defaulting to us-east-1");
17
- let providerAccounts = [];
13
+ FjallLogger.warn("AWS_REGION is not set, defaulting to us-east-1");
18
14
  // Primary: read org config from CDK context (injected by CLI/worker)
19
15
  const orgConfigRaw = app.node.tryGetContext("orgConfig");
20
- if (typeof orgConfigRaw === "string") {
21
- try {
22
- const orgConfig = JSON.parse(orgConfigRaw);
23
- providerAccounts = Array.isArray(orgConfig.providerAccounts)
24
- ? orgConfig.providerAccounts
25
- : [];
26
- config.primaryRegion =
27
- typeof orgConfig.primaryRegion === "string"
28
- ? orgConfig.primaryRegion
29
- : undefined;
30
- config.secondaryRegions = Array.isArray(orgConfig.secondaryRegions)
31
- ? orgConfig.secondaryRegions
32
- : [];
33
- config.disasterRecoveryRegion =
34
- typeof orgConfig.disasterRecoveryRegion === "string"
35
- ? orgConfig.disasterRecoveryRegion
36
- : undefined;
37
- // Compute allRegions from org config fields
38
- const regions = new Set();
39
- if (config.primaryRegion)
40
- regions.add(config.primaryRegion);
41
- for (const r of config.secondaryRegions)
42
- regions.add(r);
43
- if (config.disasterRecoveryRegion)
44
- regions.add(config.disasterRecoveryRegion);
45
- config.allRegions = [...regions];
46
- }
47
- catch (error) {
48
- validationLogger_1.FjallLogger.warn(`Failed to parse orgConfig from CDK context: ${error instanceof Error ? error.message : String(error)}`);
49
- }
50
- }
51
- else {
52
- validationLogger_1.FjallLogger.warn("No orgConfig context provided — org-level config (accounts, regions) will be empty");
16
+ if (typeof orgConfigRaw !== "string") {
17
+ FjallLogger.warn("No orgConfig context provided — org-level config (accounts, regions) will be empty");
53
18
  }
19
+ const orgConfig = parseOrgConfig(typeof orgConfigRaw === "string" ? orgConfigRaw : undefined);
20
+ const providerAccounts = orgConfig.providerAccounts;
21
+ config.primaryRegion = orgConfig.primaryRegion;
22
+ config.secondaryRegions = orgConfig.secondaryRegions;
23
+ config.disasterRecoveryRegion = orgConfig.disasterRecoveryRegion;
24
+ // Compute allRegions from org config fields
25
+ const regions = new Set();
26
+ if (config.primaryRegion)
27
+ regions.add(config.primaryRegion);
28
+ for (const r of config.secondaryRegions)
29
+ regions.add(r);
30
+ if (config.disasterRecoveryRegion)
31
+ regions.add(config.disasterRecoveryRegion);
32
+ config.allRegions = [...regions];
54
33
  // Build account IDs map from provider accounts (name → id)
55
34
  if (providerAccounts.length > 0) {
56
35
  config.accountIds = {};
@@ -59,8 +38,12 @@ function getConfig(accountName) {
59
38
  }
60
39
  }
61
40
  // If unspecified account name - try to retrieve from context
62
- if (!accountName)
63
- accountName = app.node.tryGetContext("accountName");
41
+ if (!accountName) {
42
+ const contextAccountName = app.node.tryGetContext("accountName");
43
+ if (typeof contextAccountName === "string") {
44
+ accountName = contextAccountName;
45
+ }
46
+ }
64
47
  // If we have an account name - look for associated provider account
65
48
  if (accountName) {
66
49
  const providerAccount = providerAccounts.find((pa) => pa.name === accountName);
@@ -94,5 +77,4 @@ function getConfig(accountName) {
94
77
  }
95
78
  return config;
96
79
  }
97
- exports.default = getConfig;
98
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0Q29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vbGliL3V0aWxzL2dldENvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQW1CQSw4QkF3R0M7QUF6SEQsZ0NBQXlCO0FBRXpCLHlEQUFpRDtBQWVqRCxTQUFnQixTQUFTLENBQUMsV0FBb0I7SUFDNUMsTUFBTSxHQUFHLEdBQUcsYUFBRyxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBRTlCLE1BQU0sTUFBTSxHQUFXO1FBQ3JCLE1BQU0sRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLFVBQVUsSUFBSSxXQUFXO1FBQzdDLFdBQVcsRUFBRSxTQUFTO1FBQ3RCLGdCQUFnQixFQUFFLEVBQUU7UUFDcEIsZ0JBQWdCLEVBQUUsRUFBRTtRQUNwQixVQUFVLEVBQUUsRUFBRTtLQUNmLENBQUM7SUFFRixJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFVO1FBQ3pCLDhCQUFXLENBQUMsSUFBSSxDQUFDLGdEQUFnRCxDQUFDLENBQUM7SUFFckUsSUFBSSxnQkFBZ0IsR0FBc0IsRUFBRSxDQUFDO0lBRTdDLHFFQUFxRTtJQUNyRSxNQUFNLFlBQVksR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUV6RCxJQUFJLE9BQU8sWUFBWSxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQ3JDLElBQUksQ0FBQztZQUNILE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUE0QixDQUFDO1lBQ3RFLGdCQUFnQixHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLGdCQUFnQixDQUFDO2dCQUMxRCxDQUFDLENBQUUsU0FBUyxDQUFDLGdCQUFzQztnQkFDbkQsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNQLE1BQU0sQ0FBQyxhQUFhO2dCQUNsQixPQUFPLFNBQVMsQ0FBQyxhQUFhLEtBQUssUUFBUTtvQkFDekMs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LENBQzNDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxLQUFLLFNBQVMsQ0FDNUIsQ0FBQztZQUNGLElBQUksZUFBZSxFQUFFLENBQUM7Z0JBQ3BCLE1BQU0sQ0FBQyxXQUFXLEdBQUcsZUFBZSxDQUFDLElBQUksQ0FBQztnQkFDMUMsTUFBTSxDQUFDLFdBQVcsR0FBRyxlQUFlLENBQUMsV0FBVyxDQUFDO1lBQ25ELENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVELHdEQUF3RDtJQUN4RCxNQUFNLGtCQUFrQixHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQ2pFLElBQUksT0FBTyxrQkFBa0IsS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUMzQyxNQUFNLENBQUMsV0FBVyxHQUFHLGtCQUFrQixDQUFDO0lBQzFDLENBQUM7U0FBTSxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsV0FBVyxJQUFJLE1BQU0sQ0FBQyxXQUFXLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDdkUsNkRBQTZEO1FBQzdELE1BQU0sQ0FBQyxXQUFXLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUM7SUFDL0MsQ0FBQztJQUVELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7QUFFRCxrQkFBZSxTQUFTLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB0eXBlIEFjY291bnQgfSBmcm9tIFwiQGF3cy1zZGsvY2xpZW50LW9yZ2FuaXphdGlvbnNcIjtcblxuaW1wb3J0IEFwcCBmcm9tIFwiLi4vYXBwXCI7XG5pbXBvcnQgeyB0eXBlIFByb3ZpZGVyQWNjb3VudCB9IGZyb20gXCJAZmphbGwvdXRpbFwiO1xuaW1wb3J0IHsgRmphbGxMb2dnZXIgfSBmcm9tIFwiLi92YWxpZGF0aW9uTG9nZ2VyXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29uZmlnIHtcbiAgcmVnaW9uOiBzdHJpbmc7XG4gIGVudmlyb25tZW50OiBzdHJpbmc7XG4gIGV4aXN0aW5nQWNjb3VudHM6IEFjY291bnRbXTtcbiAgYWNjb3VudElkPzogc3RyaW5nO1xuICBhY2NvdW50TmFtZT86IHN0cmluZztcbiAgYWNjb3VudElkcz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIHByaW1hcnlSZWdpb24/OiBzdHJpbmc7XG4gIHNlY29uZGFyeVJlZ2lvbnM6IHN0cmluZ1tdO1xuICBhbGxSZWdpb25zOiBzdHJpbmdbXTtcbiAgZGlzYXN0ZXJSZWNvdmVyeVJlZ2lvbj86IHN0cmluZztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldENvbmZpZyhhY2NvdW50TmFtZT86IHN0cmluZyk6IENvbmZpZyB7XG4gIGNvbnN0IGFwcCA9IEFwcC5nZXRJbnN0YW5jZSgpO1xuXG4gIGNvbnN0IGNvbmZpZzogQ29uZmlnID0ge1xuICAgIHJlZ2lvbjogcHJvY2Vzcy5lbnYuQVdTX1JFR0lPTiB8fCBcInVzLWVhc3QtMVwiLFxuICAgIGVudmlyb25tZW50OiBcInVua25vd25cIixcbiAgICBleGlzdGluZ0FjY291bnRzOiBbXSxcbiAgICBzZWNvbmRhcnlSZWdpb25zOiBbXSxcbiAgICBhbGxSZWdpb25zOiBbXVxuICB9O1xuXG4gIGlmICghcHJvY2Vzcy5lbnYuQVdTX1JFR0lPTilcbiAgICBGamFsbExvZ2dlci53YXJuKFwiQVdTX1JFR0lPTiBpcyBub3Qgc2V0LCBkZWZhdWx0aW5nIHRvIHVzLWVhc3QtMVwiKTtcblxuICBsZXQgcHJvdmlkZXJBY2NvdW50czogUHJvdmlkZXJBY2NvdW50W10gPSBbXTtcblxuICAvLyBQcmltYXJ5OiByZWFkIG9yZyBjb25maWcgZnJvbSBDREsgY29udGV4dCAoaW5qZWN0ZWQgYnkgQ0xJL3dvcmtlcilcbiAgY29uc3Qgb3JnQ29uZmlnUmF3ID0gYXBwLm5vZGUudHJ5R2V0Q29udGV4dChcIm9yZ0NvbmZpZ1wiKTtcblxuICBpZiAodHlwZW9mIG9yZ0NvbmZpZ1JhdyA9PT0gXCJzdHJpbmdcIikge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBvcmdDb25maWcgPSBKU09OLnBhcnNlKG9yZ0NvbmZpZ1JhdykgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICBwcm92aWRlckFjY291bnRzID0gQXJyYXkuaXNBcnJheShvcmdDb25maWcucHJvdmlkZXJBY2NvdW50cylcbiAgICAgICAgPyAob3JnQ29uZmlnLnByb3ZpZGVyQWNjb3VudHMgYXMgUHJvdmlkZXJBY2NvdW50W10pXG4gICAgICAgIDogW107XG4gICAgICBjb25maWcucHJpbWFyeVJlZ2lvbiA9XG4gICAgICAgIHR5cGVvZiBvcmdDb25maWcucHJpbWFyeVJlZ2lvbiA9PT0gXCJzdHJpbmdcIlxuICAgICAgICAgID8gb3JnQ29uZmlnLnByaW1hcnlSZWdpb25cbiAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgIGNvbmZpZy5zZWNvbmRhcnlSZWdpb25zID0gQXJyYXkuaXNBcnJheShvcmdDb25maWcuc2Vjb25kYXJ5UmVnaW9ucylcbiAgICAgICAgPyAob3JnQ29uZmlnLnNlY29uZGFyeVJlZ2lvbnMgYXMgc3RyaW5nW10pXG4gICAgICAgIDogW107XG4gICAgICBjb25maWcuZGlzYXN0ZXJSZWNvdmVyeVJlZ2lvbiA9XG4gICAgICAgIHR5cGVvZiBvcmdDb25maWcuZGlzYXN0ZXJSZWNvdmVyeVJlZ2lvbiA9PT0gXCJzdHJpbmdcIlxuICAgICAgICAgID8gb3JnQ29uZmlnLmRpc2FzdGVyUmVjb3ZlcnlSZWdpb25cbiAgICAgICAgICA6IHVuZGVmaW5lZDtcblxuICAgICAgLy8gQ29tcHV0ZSBhbGxSZWdpb25zIGZyb20gb3JnIGNvbmZpZyBmaWVsZHNcbiAgICAgIGNvbnN0IHJlZ2lvbnMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICAgIGlmIChjb25maWcucHJpbWFyeVJlZ2lvbikgcmVnaW9ucy5hZGQoY29uZmlnLnByaW1hcnlSZWdpb24pO1xuICAgICAgZm9yIChjb25zdCByIG9mIGNvbmZpZy5zZWNvbmRhcnlSZWdpb25zKSByZWdpb25zLmFkZChyKTtcbiAgICAgIGlmIChjb25maWcuZGlzYXN0ZXJSZWNvdmVyeVJlZ2lvbilcbiAgICAgICAgcmVnaW9ucy5hZGQoY29uZmlnLmRpc2FzdGVyUmVjb3ZlcnlSZWdpb24pO1xuICAgICAgY29uZmlnLmFsbFJlZ2lvbnMgPSBbLi4ucmVnaW9uc107XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIEZqYWxsTG9nZ2VyLndhcm4oXG4gICAgICAgIGBGYWlsZWQgdG8gcGFyc2Ugb3JnQ29uZmlnIGZyb20gQ0RLIGNvbnRleHQ6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfWBcbiAgICAgICk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIEZqYWxsTG9nZ2VyLndhcm4oXG4gICAgICBcIk5vIG9yZ0NvbmZpZyBjb250ZXh0IHByb3ZpZGVkIOKAlCBvcmctbGV2ZWwgY29uZmlnIChhY2NvdW50cywgcmVnaW9ucykgd2lsbCBiZSBlbXB0eVwiXG4gICAgKTtcbiAgfVxuXG4gIC8vIEJ1aWxkIGFjY291bnQgSURzIG1hcCBmcm9tIHByb3ZpZGVyIGFjY291bnRzIChuYW1lIOKGkiBpZClcbiAgaWYgKHByb3ZpZGVyQWNjb3VudHMubGVuZ3RoID4gMCkge1xuICAgIGNvbmZpZy5hY2NvdW50SWRzID0ge307XG4gICAgZm9yIChjb25zdCBwYSBvZiBwcm92aWRlckFjY291bnRzKSB7XG4gICAgICBjb25maWcuYWNjb3VudElkc1twYS5uYW1lXSA9IHBhLmlkO1xuICAgIH1cbiAgfVxuXG4gIC8vIElmIHVuc3BlY2lmaWVkIGFjY291bnQgbmFtZSAtIHRyeSB0byByZXRyaWV2ZSBmcm9tIGNvbnRleHRcbiAgaWYgKCFhY2NvdW50TmFtZSkgYWNjb3VudE5hbWUgPSBhcHAubm9kZS50cnlHZXRDb250ZXh0KFwiYWNjb3VudE5hbWVcIik7XG4gIC8vIElmIHdlIGhhdmUgYW4gYWNjb3VudCBuYW1lIC0gbG9vayBmb3IgYXNzb2NpYXRlZCBwcm92aWRlciBhY2NvdW50XG4gIGlmIChhY2NvdW50TmFtZSkge1xuICAgIGNvbnN0IHByb3ZpZGVyQWNjb3VudCA9IHByb3ZpZGVyQWNjb3VudHMuZmluZChcbiAgICAgIChwYSkgPT4gcGEubmFtZSA9PT0gYWNjb3VudE5hbWVcbiAgICApO1xuICAgIGlmIChwcm92aWRlckFjY291bnQpIHtcbiAgICAgIGNvbmZpZy5hY2NvdW50SWQgPSBwcm92aWRlckFjY291bnQuaWQ7XG4gICAgICBjb25maWcuYWNjb3VudE5hbWUgPSBwcm92aWRlckFjY291bnQubmFtZTtcbiAgICAgIGNvbmZpZy5lbnZpcm9ubWVudCA9IHByb3ZpZGVyQWNjb3VudC5lbnZpcm9ubWVudDtcbiAgICB9XG4gIH1cblxuICAvLyBJZiB3ZSBzdGlsbCBkb24ndCBoYXZlIGFuIGFjY291bnQgbmFtZSAtIHRyeSB0byByZXRyaWV2ZSBhY2NvdW50SWQgZnJvbSBjb250ZXh0XG4gIGlmICghY29uZmlnLmFjY291bnROYW1lKSB7XG4gICAgY29uc3QgYWNjb3VudElkID0gYXBwLm5vZGUudHJ5R2V0Q29udGV4dChcImFjY291bnRJZFwiKTtcbiAgICAvLyBJZiB3ZSBmaW5kIGFuIGFjY291bnRJZCAtIHJldHJpZXZlIHRoZSBhc3NvY2lhdGVkIGFjY291bnQgZnJvbSBjb25maWdcbiAgICBpZiAodHlwZW9mIGFjY291bnRJZCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgY29uZmlnLmFjY291bnRJZCA9IGFjY291bnRJZDtcblxuICAgICAgY29uc3QgcHJvdmlkZXJBY2NvdW50ID0gcHJvdmlkZXJBY2NvdW50cy5maW5kKFxuICAgICAgICAocGEpID0+IHBhLmlkID09PSBhY2NvdW50SWRcbiAgICAgICk7XG4gICAgICBpZiAocHJvdmlkZXJBY2NvdW50KSB7XG4gICAgICAgIGNvbmZpZy5hY2NvdW50TmFtZSA9IHByb3ZpZGVyQWNjb3VudC5uYW1lO1xuICAgICAgICBjb25maWcuZW52aXJvbm1lbnQgPSBwcm92aWRlckFjY291bnQuZW52aXJvbm1lbnQ7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gQ2hlY2sgZm9yIGVudmlyb25tZW50IGZyb20gY29udGV4dCAoaGlnaGVzdCBwcmlvcml0eSlcbiAgY29uc3QgY29udGV4dEVudmlyb25tZW50ID0gYXBwLm5vZGUudHJ5R2V0Q29udGV4dChcImVudmlyb25tZW50XCIpO1xuICBpZiAodHlwZW9mIGNvbnRleHRFbnZpcm9ubWVudCA9PT0gXCJzdHJpbmdcIikge1xuICAgIGNvbmZpZy5lbnZpcm9ubWVudCA9IGNvbnRleHRFbnZpcm9ubWVudDtcbiAgfSBlbHNlIGlmIChwcm9jZXNzLmVudi5FTlZJUk9OTUVOVCAmJiBjb25maWcuZW52aXJvbm1lbnQgPT09IFwidW5rbm93blwiKSB7XG4gICAgLy8gRmFsbCBiYWNrIHRvIEVOVklST05NRU5UIHZhcmlhYmxlIGlmIG5vIG90aGVyIHNvdXJjZSBmb3VuZFxuICAgIGNvbmZpZy5lbnZpcm9ubWVudCA9IHByb2Nlc3MuZW52LkVOVklST05NRU5UO1xuICB9XG5cbiAgcmV0dXJuIGNvbmZpZztcbn1cblxuZXhwb3J0IGRlZmF1bHQgZ2V0Q29uZmlnO1xuIl19
80
+ export default getConfig;
@@ -1,20 +1,16 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.default = getStackOutput;
4
- const fs_1 = require("fs");
5
- function getStackOutput(stackname, key) {
1
+ import { accessSync, readFileSync, constants } from "fs";
2
+ export default function getStackOutput(stackname, key) {
6
3
  const path = `./output/${stackname}.json`;
7
4
  try {
8
- (0, fs_1.accessSync)(path, fs_1.constants.R_OK);
5
+ accessSync(path, constants.R_OK);
9
6
  }
10
7
  catch (_error) {
11
8
  // File does not exist or we do not have permissions to read it
12
9
  return undefined;
13
10
  }
14
- const stackOutputFile = (0, fs_1.readFileSync)(path, "utf8");
11
+ const stackOutputFile = readFileSync(path, "utf8");
15
12
  const stackOuput = JSON.parse(stackOutputFile);
16
13
  for (const [, value] of Object.entries(stackOuput)) {
17
14
  return value[`${key}`];
18
15
  }
19
16
  }
20
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0U3RhY2tPdXRwdXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvdXRpbHMvZ2V0U3RhY2tPdXRwdXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFRQSxpQ0FlQztBQXZCRCwyQkFBeUQ7QUFRekQsU0FBd0IsY0FBYyxDQUFDLFNBQWlCLEVBQUUsR0FBVztJQUNuRSxNQUFNLElBQUksR0FBRyxZQUFZLFNBQVMsT0FBTyxDQUFDO0lBRTFDLElBQUksQ0FBQztRQUNILElBQUEsZUFBVSxFQUFDLElBQUksRUFBRSxjQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUFDLE9BQU8sTUFBTSxFQUFFLENBQUM7UUFDaEIsK0RBQStEO1FBQy9ELE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFRCxNQUFNLGVBQWUsR0FBRyxJQUFBLGlCQUFZLEVBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ25ELE1BQU0sVUFBVSxHQUFjLElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLENBQUM7SUFDMUQsS0FBSyxNQUFNLENBQUMsRUFBRSxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7UUFDbkQsT0FBTyxLQUFLLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBQ3pCLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgYWNjZXNzU3luYywgcmVhZEZpbGVTeW5jLCBjb25zdGFudHMgfSBmcm9tIFwiZnNcIjtcblxuaW50ZXJmYWNlIFN0YWNrSlNPTiB7XG4gIFN0YWNrTmFtZToge1xuICAgIE91dHB1dHM6IHN0cmluZztcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0U3RhY2tPdXRwdXQoc3RhY2tuYW1lOiBzdHJpbmcsIGtleTogc3RyaW5nKSB7XG4gIGNvbnN0IHBhdGggPSBgLi9vdXRwdXQvJHtzdGFja25hbWV9Lmpzb25gO1xuXG4gIHRyeSB7XG4gICAgYWNjZXNzU3luYyhwYXRoLCBjb25zdGFudHMuUl9PSyk7XG4gIH0gY2F0Y2ggKF9lcnJvcikge1xuICAgIC8vIEZpbGUgZG9lcyBub3QgZXhpc3Qgb3Igd2UgZG8gbm90IGhhdmUgcGVybWlzc2lvbnMgdG8gcmVhZCBpdFxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBjb25zdCBzdGFja091dHB1dEZpbGUgPSByZWFkRmlsZVN5bmMocGF0aCwgXCJ1dGY4XCIpO1xuICBjb25zdCBzdGFja091cHV0OiBTdGFja0pTT04gPSBKU09OLnBhcnNlKHN0YWNrT3V0cHV0RmlsZSk7XG4gIGZvciAoY29uc3QgWywgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHN0YWNrT3VwdXQpKSB7XG4gICAgcmV0dXJuIHZhbHVlW2Ake2tleX1gXTtcbiAgfVxufVxuIl19
@@ -1,12 +1,12 @@
1
- export * from "./backupTierMapping";
2
- export * from "./capitaliseString";
3
- export * from "./connections";
4
- export * from "./databaseTypes";
5
- export * from "./getConfig";
6
- export * from "./removalPolicy";
7
- export * from "./resourceNaming";
8
- export * from "./standardTagsAspect";
9
- export * from "./validationLogger";
10
- export * from "./env";
11
- export * from "./vpcUtils";
12
- export * from "./domainTypes";
1
+ export * from "./backupTierMapping.js";
2
+ export * from "./capitaliseString.js";
3
+ export * from "./connections.js";
4
+ export * from "./databaseTypes.js";
5
+ export * from "./getConfig.js";
6
+ export * from "./removalPolicy.js";
7
+ export * from "./resourceNaming.js";
8
+ export * from "./standardTagsAspect.js";
9
+ export * from "./validationLogger.js";
10
+ export * from "./env.js";
11
+ export * from "./vpcUtils.js";
12
+ export * from "./domainTypes.js";
@@ -1,29 +1,12 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
- for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
- };
16
- Object.defineProperty(exports, "__esModule", { value: true });
17
- __exportStar(require("./backupTierMapping"), exports);
18
- __exportStar(require("./capitaliseString"), exports);
19
- __exportStar(require("./connections"), exports);
20
- __exportStar(require("./databaseTypes"), exports);
21
- __exportStar(require("./getConfig"), exports);
22
- __exportStar(require("./removalPolicy"), exports);
23
- __exportStar(require("./resourceNaming"), exports);
24
- __exportStar(require("./standardTagsAspect"), exports);
25
- __exportStar(require("./validationLogger"), exports);
26
- __exportStar(require("./env"), exports);
27
- __exportStar(require("./vpcUtils"), exports);
28
- __exportStar(require("./domainTypes"), exports);
29
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvdXRpbHMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLHNEQUFvQztBQUNwQyxxREFBbUM7QUFDbkMsZ0RBQThCO0FBQzlCLGtEQUFnQztBQUNoQyw4Q0FBNEI7QUFDNUIsa0RBQWdDO0FBQ2hDLG1EQUFpQztBQUNqQyx1REFBcUM7QUFDckMscURBQW1DO0FBQ25DLHdDQUFzQjtBQUN0Qiw2Q0FBMkI7QUFDM0IsZ0RBQThCIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSBcIi4vYmFja3VwVGllck1hcHBpbmdcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2NhcGl0YWxpc2VTdHJpbmdcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2Nvbm5lY3Rpb25zXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9kYXRhYmFzZVR5cGVzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9nZXRDb25maWdcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3JlbW92YWxQb2xpY3lcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3Jlc291cmNlTmFtaW5nXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9zdGFuZGFyZFRhZ3NBc3BlY3RcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3ZhbGlkYXRpb25Mb2dnZXJcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2VudlwiO1xuZXhwb3J0ICogZnJvbSBcIi4vdnBjVXRpbHNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2RvbWFpblR5cGVzXCI7XG4iXX0=
1
+ export * from "./backupTierMapping.js";
2
+ export * from "./capitaliseString.js";
3
+ export * from "./connections.js";
4
+ export * from "./databaseTypes.js";
5
+ export * from "./getConfig.js";
6
+ export * from "./removalPolicy.js";
7
+ export * from "./resourceNaming.js";
8
+ export * from "./standardTagsAspect.js";
9
+ export * from "./validationLogger.js";
10
+ export * from "./env.js";
11
+ export * from "./vpcUtils.js";
12
+ export * from "./domainTypes.js";
@@ -17,8 +17,8 @@
17
17
  * the Zod schemas to match. Future work: extract to shared @fjall/types package.
18
18
  */
19
19
  import type { CloudAssembly } from "aws-cdk-lib/cx-api";
20
- /** Current manifest schema version. Must match MANIFEST_SCHEMA_VERSION in CLI's FjallManifest.ts */
21
- declare const MANIFEST_SCHEMA_VERSION: 1;
20
+ import { type ResourceMapEntry, MANIFEST_SCHEMA_VERSION } from "@fjall/util/constructMap";
21
+ import { type ResourceCategory } from "@fjall/util/resourceCategorisation";
22
22
  /**
23
23
  * Service configuration extracted from ECS services.
24
24
  */
@@ -97,6 +97,8 @@ export interface FjallManifest {
97
97
  ecr?: ManifestEcr;
98
98
  /** Template hashes by stack name */
99
99
  stacks: Record<string, ManifestStackHash>;
100
+ /** Resource map: logicalId → construct context for topology grouping */
101
+ resourceMap?: Record<string, ResourceMapEntry>;
100
102
  }
101
103
  /**
102
104
  * Collected manifest data during synthesis.
@@ -108,7 +110,17 @@ export declare class ManifestCollector {
108
110
  private pattern?;
109
111
  private ecr?;
110
112
  private appName;
113
+ private constructGroups;
111
114
  constructor(appName: string);
115
+ /**
116
+ * Set the construct group mapping based on stack type.
117
+ * Defaults to Account groups if not set.
118
+ */
119
+ setConstructGroups(groups: Readonly<Record<string, ResourceCategory>>): void;
120
+ /**
121
+ * Get the current construct group mapping.
122
+ */
123
+ getConstructGroups(): Readonly<Record<string, ResourceCategory>>;
112
124
  /**
113
125
  * Add a service configuration.
114
126
  */
@@ -171,4 +183,3 @@ export declare function getCurrentCollector(): ManifestCollector | null;
171
183
  * Reset the global collector (for testing).
172
184
  */
173
185
  export declare function resetManifestCollector(): void;
174
- export {};
@@ -1,4 +1,3 @@
1
- "use strict";
2
1
  /**
3
2
  * Fjall Manifest Writer.
4
3
  *
@@ -17,31 +16,38 @@
17
16
  * the authoritative source for validation. If you modify these interfaces, update
18
17
  * the Zod schemas to match. Future work: extract to shared @fjall/types package.
19
18
  */
20
- Object.defineProperty(exports, "__esModule", { value: true });
21
- exports.ManifestCollector = void 0;
22
- exports.writeManifest = writeManifest;
23
- exports.readExistingManifest = readExistingManifest;
24
- exports.getManifestCollector = getManifestCollector;
25
- exports.getCurrentCollector = getCurrentCollector;
26
- exports.resetManifestCollector = resetManifestCollector;
27
- const fs_1 = require("fs");
28
- const path_1 = require("path");
29
- const crypto_1 = require("crypto");
30
- const validationLogger_js_1 = require("./validationLogger.js");
31
- /** Current manifest schema version. Must match MANIFEST_SCHEMA_VERSION in CLI's FjallManifest.ts */
32
- const MANIFEST_SCHEMA_VERSION = 1;
33
- /** Manifest file name */
34
- const MANIFEST_FILE_NAME = "fjall-manifest.json";
19
+ import { writeFileSync, readFileSync, existsSync, readdirSync } from "fs";
20
+ import { join, basename } from "path";
21
+ import { createHash } from "crypto";
22
+ import { buildConstructMap, constructMapToRecord, ACCOUNT_CONSTRUCT_GROUPS, FJALL_MANIFEST_FILENAME, MANIFEST_SCHEMA_VERSION } from "@fjall/util/constructMap";
23
+ import { FjallLogger } from "./validationLogger.js";
35
24
  /**
36
25
  * Collected manifest data during synthesis.
37
26
  * Stores all data that will be written to the manifest file.
38
27
  */
39
- class ManifestCollector {
28
+ export class ManifestCollector {
29
+ services = [];
30
+ lambdas = [];
31
+ pattern;
32
+ ecr;
33
+ appName;
34
+ constructGroups = ACCOUNT_CONSTRUCT_GROUPS;
40
35
  constructor(appName) {
41
- this.services = [];
42
- this.lambdas = [];
43
36
  this.appName = appName;
44
37
  }
38
+ /**
39
+ * Set the construct group mapping based on stack type.
40
+ * Defaults to Account groups if not set.
41
+ */
42
+ setConstructGroups(groups) {
43
+ this.constructGroups = groups;
44
+ }
45
+ /**
46
+ * Get the current construct group mapping.
47
+ */
48
+ getConstructGroups() {
49
+ return this.constructGroups;
50
+ }
45
51
  /**
46
52
  * Add a service configuration.
47
53
  */
@@ -101,20 +107,19 @@ class ManifestCollector {
101
107
  return this.appName;
102
108
  }
103
109
  }
104
- exports.ManifestCollector = ManifestCollector;
105
110
  /**
106
111
  * Compute SHA-256 hash of a CloudFormation template file.
107
112
  * Normalises JSON to ensure consistent hashes.
108
113
  */
109
114
  function computeTemplateHash(templatePath) {
110
115
  try {
111
- const content = (0, fs_1.readFileSync)(templatePath, "utf-8");
116
+ const content = readFileSync(templatePath, "utf-8");
112
117
  const normalised = JSON.stringify(JSON.parse(content));
113
- return (0, crypto_1.createHash)("sha256").update(normalised).digest("hex");
118
+ return createHash("sha256").update(normalised).digest("hex");
114
119
  }
115
120
  catch (error) {
116
121
  const errorMessage = error instanceof Error ? error.message : String(error);
117
- validationLogger_js_1.FjallLogger.warn(`Failed to compute hash for ${templatePath}: ${errorMessage}`);
122
+ FjallLogger.warn(`Failed to compute hash for ${templatePath}: ${errorMessage}`);
118
123
  return null;
119
124
  }
120
125
  }
@@ -125,11 +130,11 @@ function computeStackHashes(cdkOutPath) {
125
130
  const stacks = {};
126
131
  const synthTimestamp = new Date().toISOString();
127
132
  try {
128
- const files = (0, fs_1.readdirSync)(cdkOutPath);
133
+ const files = readdirSync(cdkOutPath);
129
134
  const templateFiles = files.filter((f) => f.endsWith(".template.json"));
130
135
  for (const templateFile of templateFiles) {
131
- const templatePath = (0, path_1.join)(cdkOutPath, templateFile);
132
- const stackName = (0, path_1.basename)(templateFile, ".template.json");
136
+ const templatePath = join(cdkOutPath, templateFile);
137
+ const stackName = basename(templateFile, ".template.json");
133
138
  const hash = computeTemplateHash(templatePath);
134
139
  if (hash) {
135
140
  stacks[stackName] = {
@@ -141,7 +146,7 @@ function computeStackHashes(cdkOutPath) {
141
146
  }
142
147
  catch (error) {
143
148
  const errorMessage = error instanceof Error ? error.message : String(error);
144
- validationLogger_js_1.FjallLogger.warn(`Failed to read cdk.out for hash computation: ${errorMessage}`);
149
+ FjallLogger.warn(`Failed to read cdk.out for hash computation: ${errorMessage}`);
145
150
  }
146
151
  return stacks;
147
152
  }
@@ -151,17 +156,22 @@ function computeStackHashes(cdkOutPath) {
151
156
  * @param assembly - The CloudAssembly from synth
152
157
  * @param collector - The manifest collector with service data
153
158
  */
154
- function writeManifest(assembly, collector) {
159
+ export function writeManifest(assembly, collector) {
155
160
  const cdkOutPath = assembly.directory;
156
- const manifestPath = (0, path_1.join)(cdkOutPath, MANIFEST_FILE_NAME);
161
+ const manifestPath = join(cdkOutPath, FJALL_MANIFEST_FILENAME);
157
162
  const stacks = computeStackHashes(cdkOutPath);
163
+ // Build resource map from CDK manifest metadata
164
+ const constructMap = buildConstructMap(cdkOutPath, collector.getConstructGroups());
158
165
  const manifest = {
159
166
  version: MANIFEST_SCHEMA_VERSION,
160
167
  generatedAt: new Date().toISOString(),
161
168
  appName: collector.getAppName(),
162
169
  services: collector.getServices(),
163
170
  lambdas: collector.getLambdas(),
164
- stacks
171
+ stacks,
172
+ ...(constructMap.size > 0
173
+ ? { resourceMap: constructMapToRecord(constructMap) }
174
+ : {})
165
175
  };
166
176
  const pattern = collector.getPattern();
167
177
  if (pattern) {
@@ -172,29 +182,37 @@ function writeManifest(assembly, collector) {
172
182
  manifest.ecr = ecr;
173
183
  }
174
184
  try {
175
- (0, fs_1.writeFileSync)(manifestPath, JSON.stringify(manifest, null, 2), "utf-8");
176
- validationLogger_js_1.FjallLogger.info(`Fjall manifest written to ${manifestPath}`);
185
+ writeFileSync(manifestPath, JSON.stringify(manifest, null, 2), "utf-8");
186
+ FjallLogger.info(`Fjall manifest written to ${manifestPath}`);
177
187
  }
178
188
  catch (error) {
179
189
  const errorMessage = error instanceof Error ? error.message : String(error);
180
- validationLogger_js_1.FjallLogger.warn(`Failed to write Fjall manifest: ${errorMessage}`);
190
+ FjallLogger.warn(`Failed to write Fjall manifest: ${errorMessage}`);
181
191
  }
182
192
  }
183
193
  /**
184
194
  * Read an existing manifest file (for preserving deployment history).
185
195
  */
186
- function readExistingManifest(cdkOutPath) {
187
- const manifestPath = (0, path_1.join)(cdkOutPath, MANIFEST_FILE_NAME);
188
- if (!(0, fs_1.existsSync)(manifestPath)) {
196
+ export function readExistingManifest(cdkOutPath) {
197
+ const manifestPath = join(cdkOutPath, FJALL_MANIFEST_FILENAME);
198
+ if (!existsSync(manifestPath)) {
189
199
  return null;
190
200
  }
191
201
  try {
192
- const content = (0, fs_1.readFileSync)(manifestPath, "utf-8");
193
- return JSON.parse(content);
202
+ const content = readFileSync(manifestPath, "utf-8");
203
+ const parsed = JSON.parse(content);
204
+ if (typeof parsed !== "object" ||
205
+ parsed === null ||
206
+ !("version" in parsed) ||
207
+ !("appName" in parsed)) {
208
+ FjallLogger.warn("Existing manifest has unexpected shape");
209
+ return null;
210
+ }
211
+ return parsed;
194
212
  }
195
213
  catch (error) {
196
214
  const message = error instanceof Error ? error.message : String(error);
197
- validationLogger_js_1.FjallLogger.warn(`Failed to parse existing manifest: ${message}`);
215
+ FjallLogger.warn(`Failed to parse existing manifest: ${message}`);
198
216
  return null;
199
217
  }
200
218
  }
@@ -211,7 +229,7 @@ let globalCollector = null;
211
229
  * Get or create the global manifest collector.
212
230
  * Called by App during construction to initialise the collector.
213
231
  */
214
- function getManifestCollector(appName) {
232
+ export function getManifestCollector(appName) {
215
233
  if (!globalCollector || globalCollector.getAppName() !== appName) {
216
234
  globalCollector = new ManifestCollector(appName);
217
235
  }
@@ -221,13 +239,12 @@ function getManifestCollector(appName) {
221
239
  * Get the current global manifest collector.
222
240
  * Returns null if not initialised.
223
241
  */
224
- function getCurrentCollector() {
242
+ export function getCurrentCollector() {
225
243
  return globalCollector;
226
244
  }
227
245
  /**
228
246
  * Reset the global collector (for testing).
229
247
  */
230
- function resetManifestCollector() {
248
+ export function resetManifestCollector() {
231
249
  globalCollector = null;
232
250
  }
233
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFuaWZlc3RXcml0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvdXRpbHMvbWFuaWZlc3RXcml0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7OztHQWlCRzs7O0FBa1BILHNDQW1DQztBQUtELG9EQWVDO0FBZ0JELG9EQUtDO0FBTUQsa0RBRUM7QUFLRCx3REFFQztBQTNVRCwyQkFBMEU7QUFDMUUsK0JBQXNDO0FBQ3RDLG1DQUFvQztBQUdwQywrREFBb0Q7QUFFcEQsb0dBQW9HO0FBQ3BHLE1BQU0sdUJBQXVCLEdBQUcsQ0FBVSxDQUFDO0FBdUYzQyx5QkFBeUI7QUFDekIsTUFBTSxrQkFBa0IsR0FBRyxxQkFBcUIsQ0FBQztBQUVqRDs7O0dBR0c7QUFDSCxNQUFhLGlCQUFpQjtJQU81QixZQUFZLE9BQWU7UUFObkIsYUFBUSxHQUFzQixFQUFFLENBQUM7UUFDakMsWUFBTyxHQUFxQixFQUFFLENBQUM7UUFNckMsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7SUFDekIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsVUFBVSxDQUFDLE9BQXdCO1FBQ2pDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUN4RCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUM5QixDQUFDO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0gsU0FBUyxDQUFDLE1BQXNCO1FBQzlCLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUN0RCxJQUFJ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Ozs7R0FHRztBQUNILFNBQWdCLG9CQUFvQixDQUFDLE9BQWU7SUFDbEQsSUFBSSxDQUFDLGVBQWUsSUFBSSxlQUFlLENBQUMsVUFBVSxFQUFFLEtBQUssT0FBTyxFQUFFLENBQUM7UUFDakUsZUFBZSxHQUFHLElBQUksaUJBQWlCLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDbkQsQ0FBQztJQUNELE9BQU8sZUFBZSxDQUFDO0FBQ3pCLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxTQUFnQixtQkFBbUI7SUFDakMsT0FBTyxlQUFlLENBQUM7QUFDekIsQ0FBQztBQUVEOztHQUVHO0FBQ0gsU0FBZ0Isc0JBQXNCO0lBQ3BDLGVBQWUsR0FBRyxJQUFJLENBQUM7QUFDekIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRmphbGwgTWFuaWZlc3QgV3JpdGVyLlxuICpcbiAqIFdyaXRlcyBhIG1hbmlmZXN0IGZpbGUgZHVyaW5nIENESyBzeW50aGVzaXMgdGhhdCBjb250YWlucyByZXNvbHZlZCBzZXJ2aWNlXG4gKiBjb25maWd1cmF0aW9uLCBwYXR0ZXJuIGRldGFpbHMsIGFuZCB0ZW1wbGF0ZSBoYXNoZXMuIFRoaXMgcmVwbGFjZXMgZnJhZ2lsZVxuICogQVNUIHBhcnNpbmcgb2YgaW5mcmFzdHJ1Y3R1cmUudHMgaW4gdGhlIENMSS5cbiAqXG4gKiBUaGUgbWFuaWZlc3QgaXMgd3JpdHRlbiB0byBjZGsub3V0L2ZqYWxsLW1hbmlmZXN0Lmpzb24gYWZ0ZXIgc3ludGhlc2lzLlxuICpcbiAqIE5PVEU6IFRoaXMgZmlsZSB1c2VzIHN5bmNocm9ub3VzIGZpbGUgb3BlcmF0aW9ucyAod3JpdGVGaWxlU3luYywgcmVhZEZpbGVTeW5jLCBldGMuKVxuICogYmVjYXVzZSBDREsgc3ludGhlc2lzIGlzIGluaGVyZW50bHkgc3luY2hyb25vdXMuIFRoZSBzeW50aCgpIG1ldGhvZCBibG9ja3MgdW50aWxcbiAqIGNvbXBsZXRlLCBzbyBhc3luYyBvcGVyYXRpb25zIHdvdWxkIHByb3ZpZGUgbm8gYmVuZWZpdCBhbmQgYWRkIGNvbXBsZXhpdHkuXG4gKlxuICogVFlQRSBEVVBMSUNBVElPTiBOT1RFOiBUaGUgaW50ZXJmYWNlcyBiZWxvdyAoTWFuaWZlc3RTZXJ2aWNlLCBNYW5pZmVzdFBhdHRlcm4sIGV0Yy4pXG4gKiBhcmUgbWlycm9yZWQgYnkgWm9kIHNjaGVtYXMgaW4gY2xpL3NyYy90eXBlcy9GamFsbE1hbmlmZXN0LnRzLiBUaGUgQ0xJIHNjaGVtYXMgYXJlXG4gKiB0aGUgYXV0aG9yaXRhdGl2ZSBzb3VyY2UgZm9yIHZhbGlkYXRpb24uIElmIHlvdSBtb2RpZnkgdGhlc2UgaW50ZXJmYWNlcywgdXBkYXRlXG4gKiB0aGUgWm9kIHNjaGVtYXMgdG8gbWF0Y2guIEZ1dHVyZSB3b3JrOiBleHRyYWN0IHRvIHNoYXJlZCBAZmphbGwvdHlwZXMgcGFja2FnZS5cbiAqL1xuXG5pbXBvcnQgeyB3cml0ZUZpbGVTeW5jLCByZWFkRmlsZVN5bmMsIGV4aXN0c1N5bmMsIHJlYWRkaXJTeW5jIH0gZnJvbSBcImZzXCI7XG5pbXBvcnQgeyBqb2luLCBiYXNlbmFtZSB9IGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgeyBjcmVhdGVIYXNoIH0gZnJvbSBcImNyeXB0b1wiO1xuaW1wb3J0IHR5cGUgeyBDbG91ZEFzc2VtYmx5IH0gZnJvbSBcImF3cy1jZGstbGliL2N4LWFwaVwiO1xuXG5pbXBvcnQgeyBGamFsbExvZ2dlciB9IGZyb20gXCIuL3ZhbGlkYXRpb25Mb2dnZXIuanNcIjtcblxuLyoqIEN1cnJlbnQgbWFuaWZlc3Qgc2NoZW1hIHZlcnNpb24uIE11c3QgbWF0Y2ggTUFOSUZFU1RfU0NIRU1BX1ZFUlNJT04gaW4gQ0xJJ3MgRmphbGxNYW5pZmVzdC50cyAqL1xuY29uc3QgTUFOSUZFU1RfU0NIRU1BX1ZFUlNJT04gPSAxIGFzIGNvbnN0O1xuXG4vKipcbiAqIFNlcnZpY2UgY29uZmlndXJhdGlvbiBleHRyYWN0ZWQgZnJvbSBFQ1Mgc2VydmljZXMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWFuaWZlc3RTZXJ2aWNlIHtcbiAgLyoqIFNlcnZpY2UgbmFtZSAobXVzdCBtYXRjaCBFQ1Mgc2VydmljZSBuYW1lKSAqL1xuICBuYW1lOiBzdHJpbmc7XG4gIC8qKiBDbHVzdGVyIG5hbWUgdGhpcyBzZXJ2aWNlIGJlbG9uZ3MgdG8gKi9cbiAgY2x1c3Rlck5hbWU/OiBzdHJpbmc7XG4gIC8qKiBQYXRoIHRvIERvY2tlcmZpbGUgcmVsYXRpdmUgdG8gYXBwIHJvb3QgKi9cbiAgZG9ja2VyZmlsZVBhdGg/OiBzdHJpbmc7XG4gIC8qKiBEb2NrZXIgYnVpbGQgdGFyZ2V0IGZvciBtdWx0aS1zdGFnZSBidWlsZHMgKi9cbiAgZG9ja2VyVGFyZ2V0Pzogc3RyaW5nO1xuICAvKiogQ29udGFpbmVyIHBvcnQgKi9cbiAgY29udGFpbmVyUG9ydD86IG51bWJlcjtcbiAgLyoqIFNTTSBzZWNyZXRzIGNvbmZpZ3VyZWQgZm9yIHRoaXMgc2VydmljZSAoYWdncmVnYXRlZCBmcm9tIGFsbCBjb250YWluZXJzKSAqL1xuICBzZWNyZXRzPzogc3RyaW5nW107XG4gIC8qKiBTU00gc2VjcmV0cyBwYXRoIChkZXJpdmVkIG9yIGV4cGxpY2l0KSAqL1xuICBzc21TZWNyZXRzUGF0aD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXR0ZXJuIGNvbmZpZ3VyYXRpb24gZXh0cmFjdGVkIGZyb20gUGF0dGVybkZhY3RvcnkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWFuaWZlc3RQYXR0ZXJuIHtcbiAgLyoqIFBhdHRlcm4gdHlwZSAqL1xuICB0eXBlOiBcInBheWxvYWRcIjtcbiAgLyoqIFBhdHRlcm4gbmFtZSAoQ01TIG5hbWUpICovXG4gIG5hbWU6IHN0cmluZztcbiAgLyoqIFNvdXJjZSBkaXJlY3RvcnkgY29udGFpbmluZyBidWlsZCBvdXRwdXQgKi9cbiAgc291cmNlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogRUNSIGNvbmZpZ3VyYXRpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWFuaWZlc3RFY3Ige1xuICAvKiogRUNSIHJlcG9zaXRvcnkgbmFtZSAqL1xuICByZXBvc2l0b3J5TmFtZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIExhbWJkYSBmdW5jdGlvbiBjb25maWd1cmF0aW9uIGV4dHJhY3RlZCBmcm9tIExhbWJkYSBjb21wdXRlLlxuICogRW5hYmxlcyBDTEkgZGlzY292ZXJ5IG9mIExhbWJkYSBmdW5jdGlvbnMgZm9yIHNlY3JldHMgbWFuYWdlbWVudC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNYW5pZmVzdExhbWJkYSB7XG4gIC8qKiBMYW1iZGEgZnVuY3Rpb24gbmFtZSAoY29uc3RydWN0IElEKSAqL1xuICBuYW1lOiBzdHJpbmc7XG4gIC8qKiBTU00gc2VjcmV0cyBjb25maWd1cmVkIGZvciB0aGlzIExhbWJkYSAqL1xuICBzZWNyZXRzPzogc3RyaW5nW107XG4gIC8qKiBTU00gc2VjcmV0cyBwYXRoIChkZXJpdmVkIG9yIGV4cGxpY2l0KSAqL1xuICBzc21TZWNyZXRzUGF0aD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBTdGFjayBoYXNoIGVudHJ5IGNvbXB1dGVkIGZyb20gc3ludGhlc2lzZWQgdGVtcGxhdGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWFuaWZlc3RTdGFja0hhc2gge1xuICAvKiogU0hBLTI1NiBoYXNoIG9mIHRoZSBzeW50aGVzaXNlZCB0ZW1wbGF0ZSAqL1xuICB0ZW1wbGF0ZUhhc2g6IHN0cmluZztcbiAgLyoqIElTTyB0aW1lc3RhbXAgd2hlbiBzeW50aCBjb21wbGV0ZWQgKi9cbiAgc3ludGhUaW1lc3RhbXA6IHN0cmluZztcbn1cblxuLyoqXG4gKiBGamFsbCBtYW5pZmVzdCAtIGdlbmVyYXRlZCBkdXJpbmcgQ0RLIHN5bnRoLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZqYWxsTWFuaWZlc3Qge1xuICAvKiogU2NoZW1hIHZlcnNpb24gZm9yIGZ1dHVyZSBjb21wYXRpYmlsaXR5ICovXG4gIHZlcnNpb246IHR5cGVvZiBNQU5JRkVTVF9TQ0hFTUFfVkVSU0lPTjtcbiAgLyoqIElTTyB0aW1lc3RhbXAgd2hlbiBtYW5pZmVzdCB3YXMgZ2VuZXJhdGVkICovXG4gIGdlbmVyYXRlZEF0OiBzdHJpbmc7XG4gIC8qKiBBcHBsaWNhdGlvbiBuYW1lICovXG4gIGFwcE5hbWU6IHN0cmluZztcbiAgLyoqIFJlc29sdmVkIHNlcnZpY2UgY29uZmlndXJhdGlvbnMgKi9cbiAgc2VydmljZXM6IE1hbmlmZXN0U2VydmljZVtdO1xuICAvKiogTGFtYmRhIGZ1bmN0aW9uIGNvbmZpZ3VyYXRpb25zICovXG4gIGxhbWJkYXM6IE1hbmlmZXN0TGFtYmRhW107XG4gIC8qKiBQYXR0ZXJuIGNvbmZpZ3VyYXRpb24gKGlmIHVzaW5nIFBhdHRlcm5GYWN0b3J5KSAqL1xuICBwYXR0ZXJuPzogTWFuaWZlc3RQYXR0ZXJuO1xuICAvKiogRUNSIGNvbmZpZ3VyYXRpb24gKi9cbiAgZWNyPzogTWFuaWZlc3RFY3I7XG4gIC8qKiBUZW1wbGF0ZSBoYXNoZXMgYnkgc3RhY2sgbmFtZSAqL1xuICBzdGFja3M6IFJlY29yZDxzdHJpbmcsIE1hbmlmZXN0U3RhY2tIYXNoPjtcbn1cblxuLyoqIE1hbmlmZXN0IGZpbGUgbmFtZSAqL1xuY29uc3QgTUFOSUZFU1RfRklMRV9OQU1FID0gXCJmamFsbC1tYW5pZmVzdC5qc29uXCI7XG5cbi8qKlxuICogQ29sbGVjdGVkIG1hbmlmZXN0IGRhdGEgZHVyaW5nIHN5bnRoZXNpcy5cbiAqIFN0b3JlcyBhbGwgZGF0YSB0aGF0IHdpbGwgYmUgd3JpdHRlbiB0byB0aGUgbWFuaWZlc3QgZmlsZS5cbiAqL1xuZXhwb3J0IGNsYXNzIE1hbmlmZXN0Q29sbGVjdG9yIHtcbiAgcHJpdmF0ZSBzZXJ2aWNlczogTWFuaWZlc3RTZXJ2aWNlW10gPSBbXTtcbiAgcHJpdmF0ZSBsYW1iZGFzOiBNYW5pZmVzdExhbWJkYVtdID0gW107XG4gIHByaXZhdGUgcGF0dGVybj86IE1hbmlmZXN0UGF0dGVybjtcbiAgcHJpdmF0ZSBlY3I/OiBNYW5pZmVzdEVjcjtcbiAgcHJpdmF0ZSBhcHBOYW1lOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoYXBwTmFtZTogc3RyaW5nKSB7XG4gICAgdGhpcy5hcHBOYW1lID0gYXBwTmFtZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBzZXJ2aWNlIGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICBhZGRTZXJ2aWNlKHNlcnZpY2U6IE1hbmlmZXN0U2VydmljZSk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zZXJ2aWNlcy5zb21lKChzKSA9PiBzLm5hbWUgPT09IHNlcnZpY2UubmFtZSkpIHtcbiAgICAgIHRoaXMuc2VydmljZXMucHVzaChzZXJ2aWNlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgTGFtYmRhIGZ1bmN0aW9uIGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICBhZGRMYW1iZGEobGFtYmRhOiBNYW5pZmVzdExhbWJkYSk6IHZvaWQge1xuICAgIGlmICghdGhpcy5sYW1iZGFzLnNvbWUoKGwpID0+IGwubmFtZSA9PT0gbGFtYmRhLm5hbWUpKSB7XG4gICAgICB0aGlzLmxhbWJkYXMucHVzaChsYW1iZGEpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIHBhdHRlcm4gY29uZmlndXJhdGlvbi5cbiAgICovXG4gIHNldFBhdHRlcm4ocGF0dGVybjogTWFuaWZlc3RQYXR0ZXJuKTogdm9pZCB7XG4gICAgdGhpcy5wYXR0ZXJuID0gcGF0dGVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIEVDUiByZXBvc2l0b3J5IGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICBzZXRFY3IoZWNyOiBNYW5pZmVzdEVjcik6IHZvaWQge1xuICAgIHRoaXMuZWNyID0gZWNyO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBjb2xsZWN0ZWQgc2VydmljZXMuXG4gICAqL1xuICBnZXRTZXJ2aWNlcygpOiBNYW5pZmVzdFNlcnZpY2VbXSB7XG4gICAgcmV0dXJuIHRoaXMuc2VydmljZXM7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGNvbGxlY3RlZCBMYW1iZGEgZnVuY3Rpb25zLlxuICAgKi9cbiAgZ2V0TGFtYmRhcygpOiBNYW5pZmVzdExhbWJkYVtdIHtcbiAgICByZXR1cm4gdGhpcy5sYW1iZGFzO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBwYXR0ZXJuIGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICBnZXRQYXR0ZXJuKCk6IE1hbmlmZXN0UGF0dGVybiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMucGF0dGVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgRUNSIGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICBnZXRFY3IoKTogTWFuaWZlc3RFY3IgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmVjcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGFwcGxpY2F0aW9uIG5hbWUuXG4gICAqL1xuICBnZXRBcHBOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuYXBwTmFtZTtcbiAgfVxufVxuXG4vKipcbiAqIENvbXB1dGUgU0hBLTI1NiBoYXNoIG9mIGEgQ2xvdWRGb3JtYXRpb24gdGVtcGxhdGUgZmlsZS5cbiAqIE5vcm1hbGlzZXMgSlNPTiB0byBlbnN1cmUgY29uc2lzdGVudCBoYXNoZXMuXG4gKi9cbmZ1bmN0aW9uIGNvbXB1dGVUZW1wbGF0ZUhhc2godGVtcGxhdGVQYXRoOiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBjb250ZW50ID0gcmVhZEZpbGVTeW5jKHRlbXBsYXRlUGF0aCwgXCJ1dGYtOFwiKTtcbiAgICBjb25zdCBub3JtYWxpc2VkID0gSlNPTi5zdHJpbmdpZnkoSlNPTi5wYXJzZShjb250ZW50KSk7XG4gICAgcmV0dXJuIGNyZWF0ZUhhc2goXCJzaGEyNTZcIikudXBkYXRlKG5vcm1hbGlzZWQpLmRpZ2VzdChcImhleFwiKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcik7XG4gICAgRmphbGxMb2dnZXIud2FybihcbiAgICAgIGBGYWlsZWQgdG8gY29tcHV0ZSBoYXNoIGZvciAke3RlbXBsYXRlUGF0aH06ICR7ZXJyb3JNZXNzYWdlfWBcbiAgICApO1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbi8qKlxuICogRmluZCBhbGwgdGVtcGxhdGUgZmlsZXMgaW4gY2RrLm91dCBhbmQgY29tcHV0ZSB0aGVpciBoYXNoZXMuXG4gKi9cbmZ1bmN0aW9uIGNvbXB1dGVTdGFja0hhc2hlcyhcbiAgY2RrT3V0UGF0aDogc3RyaW5nXG4pOiBSZWNvcmQ8c3RyaW5nLCBNYW5pZmVzdFN0YWNrSGFzaD4ge1xuICBjb25zdCBzdGFja3M6IFJlY29yZDxzdHJpbmcsIE1hbmlmZXN0U3RhY2tIYXNoPiA9IHt9O1xuICBjb25zdCBzeW50aFRpbWVzdGFtcCA9IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKTtcblxuICB0cnkge1xuICAgIGNvbnN0IGZpbGVzID0gcmVhZGRpclN5bmMoY2RrT3V0UGF0aCk7XG4gICAgY29uc3QgdGVtcGxhdGVGaWxlcyA9IGZpbGVzLmZpbHRlcigoZikgPT4gZi5lbmRzV2l0aChcIi50ZW1wbGF0ZS5qc29uXCIpKTtcblxuICAgIGZvciAoY29uc3QgdGVtcGxhdGVGaWxlIG9mIHRlbXBsYXRlRmlsZXMpIHtcbiAgICAgIGNvbnN0IHRlbXBsYXRlUGF0aCA9IGpvaW4oY2RrT3V0UGF0aCwgdGVtcGxhdGVGaWxlKTtcbiAgICAgIGNvbnN0IHN0YWNrTmFtZSA9IGJhc2VuYW1lKHRlbXBsYXRlRmlsZSwgXCIudGVtcGxhdGUuanNvblwiKTtcbiAgICAgIGNvbnN0IGhhc2ggPSBjb21wdXRlVGVtcGxhdGVIYXNoKHRlbXBsYXRlUGF0aCk7XG5cbiAgICAgIGlmIChoYXNoKSB7XG4gICAgICAgIHN0YWNrc1tzdGFja05hbWVdID0ge1xuICAgICAgICAgIHRlbXBsYXRlSGFzaDogaGFzaCxcbiAgICAgICAgICBzeW50aFRpbWVzdGFtcFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcik7XG4gICAgRmphbGxMb2dnZXIud2FybihcbiAgICAgIGBGYWlsZWQgdG8gcmVhZCBjZGsub3V0IGZvciBoYXNoIGNvbXB1dGF0aW9uOiAke2Vycm9yTWVzc2FnZX1gXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBzdGFja3M7XG59XG5cbi8qKlxuICogV3JpdGUgdGhlIG1hbmlmZXN0IGZpbGUgdG8gY2RrLm91dC5cbiAqXG4gKiBAcGFyYW0gYXNzZW1ibHkgLSBUaGUgQ2xvdWRBc3NlbWJseSBmcm9tIHN5bnRoXG4gKiBAcGFyYW0gY29sbGVjdG9yIC0gVGhlIG1hbmlmZXN0IGNvbGxlY3RvciB3aXRoIHNlcnZpY2UgZGF0YVxuICovXG5leHBvcnQgZnVuY3Rpb24gd3JpdGVNYW5pZmVzdChcbiAgYXNzZW1ibHk6IENsb3VkQXNzZW1ibHksXG4gIGNvbGxlY3RvcjogTWFuaWZlc3RDb2xsZWN0b3Jcbik6IHZvaWQge1xuICBjb25zdCBjZGtPdXRQYXRoID0gYXNzZW1ibHkuZGlyZWN0b3J5O1xuICBjb25zdCBtYW5pZmVzdFBhdGggPSBqb2luKGNka091dFBhdGgsIE1BTklGRVNUX0ZJTEVfTkFNRSk7XG5cbiAgY29uc3Qgc3RhY2tzID0gY29tcHV0ZVN0YWNrSGFzaGVzKGNka091dFBhdGgpO1xuXG4gIGNvbnN0IG1hbmlmZXN0OiBGamFsbE1hbmlmZXN0ID0ge1xuICAgIHZlcnNpb246IE1BTklGRVNUX1NDSEVNQV9WRVJTSU9OLFxuICAgIGdlbmVyYXRlZEF0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgYXBwTmFtZTogY29sbGVjdG9yLmdldEFwcE5hbWUoKSxcbiAgICBzZXJ2aWNlczogY29sbGVjdG9yLmdldFNlcnZpY2VzKCksXG4gICAgbGFtYmRhczogY29sbGVjdG9yLmdldExhbWJkYXMoKSxcbiAgICBzdGFja3NcbiAgfTtcblxuICBjb25zdCBwYXR0ZXJuID0gY29sbGVjdG9yLmdldFBhdHRlcm4oKTtcbiAgaWYgKHBhdHRlcm4pIHtcbiAgICBtYW5pZmVzdC5wYXR0ZXJuID0gcGF0dGVybjtcbiAgfVxuXG4gIGNvbnN0IGVjciA9IGNvbGxlY3Rvci5nZXRFY3IoKTtcbiAgaWYgKGVjcikge1xuICAgIG1hbmlmZXN0LmVjciA9IGVjcjtcbiAgfVxuXG4gIHRyeSB7XG4gICAgd3JpdGVGaWxlU3luYyhtYW5pZmVzdFBhdGgsIEpTT04uc3RyaW5naWZ5KG1hbmlmZXN0LCBudWxsLCAyKSwgXCJ1dGYtOFwiKTtcbiAgICBGamFsbExvZ2dlci5pbmZvKGBGamFsbCBtYW5pZmVzdCB3cml0dGVuIHRvICR7bWFuaWZlc3RQYXRofWApO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKTtcbiAgICBGamFsbExvZ2dlci53YXJuKGBGYWlsZWQgdG8gd3JpdGUgRmphbGwgbWFuaWZlc3Q6ICR7ZXJyb3JNZXNzYWdlfWApO1xuICB9XG59XG5cbi8qKlxuICogUmVhZCBhbiBleGlzdGluZyBtYW5pZmVzdCBmaWxlIChmb3IgcHJlc2VydmluZyBkZXBsb3ltZW50IGhpc3RvcnkpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVhZEV4aXN0aW5nTWFuaWZlc3QoY2RrT3V0UGF0aDogc3RyaW5nKTogRmphbGxNYW5pZmVzdCB8IG51bGwge1xuICBjb25zdCBtYW5pZmVzdFBhdGggPSBqb2luKGNka091dFBhdGgsIE1BTklGRVNUX0ZJTEVfTkFNRSk7XG5cbiAgaWYgKCFleGlzdHNTeW5jKG1hbmlmZXN0UGF0aCkpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHRyeSB7XG4gICAgY29uc3QgY29udGVudCA9IHJlYWRGaWxlU3luYyhtYW5pZmVzdFBhdGgsIFwidXRmLThcIik7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UoY29udGVudCkgYXMgRmphbGxNYW5pZmVzdDtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zdCBtZXNzYWdlID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpO1xuICAgIEZqYWxsTG9nZ2VyLndhcm4oYEZhaWxlZCB0byBwYXJzZSBleGlzdGluZyBtYW5pZmVzdDogJHttZXNzYWdlfWApO1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbi8qKlxuICogR2xvYmFsIG1hbmlmZXN0IGNvbGxlY3RvciBpbnN0YW5jZS5cbiAqXG4gKiBDREsncyBhcmNoaXRlY3R1cmUgZ3VhcmFudGVlcyBvbmUgQXBwIHBlciBwcm9jZXNzLCBzbyBhIGdsb2JhbCBzaW5nbGV0b24gaXMgc2FmZSBoZXJlLlxuICogVGhlIGNvbGxlY3RvciBpcyBjcmVhdGVkIHdoZW4gQXBwIGlzIGNvbnN0cnVjdGVkIGFuZCB1c2VkIHRocm91Z2hvdXQgc3ludGhlc2lzLlxuICogcmVzZXRNYW5pZmVzdENvbGxlY3RvcigpIGlzIHByb3ZpZGVkIGZvciB0ZXN0aW5nIHNjZW5hcmlvcyB3aGVyZSBtdWx0aXBsZSBBcHBzXG4gKiBtYXkgYmUgY3JlYXRlZCBpbiB0aGUgc2FtZSBwcm9jZXNzLlxuICovXG5sZXQgZ2xvYmFsQ29sbGVjdG9yOiBNYW5pZmVzdENvbGxlY3RvciB8IG51bGwgPSBudWxsO1xuXG4vKipcbiAqIEdldCBvciBjcmVhdGUgdGhlIGdsb2JhbCBtYW5pZmVzdCBjb2xsZWN0b3IuXG4gKiBDYWxsZWQgYnkgQXBwIGR1cmluZyBjb25zdHJ1Y3Rpb24gdG8gaW5pdGlhbGlzZSB0aGUgY29sbGVjdG9yLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TWFuaWZlc3RDb2xsZWN0b3IoYXBwTmFtZTogc3RyaW5nKTogTWFuaWZlc3RDb2xsZWN0b3Ige1xuICBpZiAoIWdsb2JhbENvbGxlY3RvciB8fCBnbG9iYWxDb2xsZWN0b3IuZ2V0QXBwTmFtZSgpICE9PSBhcHBOYW1lKSB7XG4gICAgZ2xvYmFsQ29sbGVjdG9yID0gbmV3IE1hbmlmZXN0Q29sbGVjdG9yKGFwcE5hbWUpO1xuICB9XG4gIHJldHVybiBnbG9iYWxDb2xsZWN0b3I7XG59XG5cbi8qKlxuICogR2V0IHRoZSBjdXJyZW50IGdsb2JhbCBtYW5pZmVzdCBjb2xsZWN0b3IuXG4gKiBSZXR1cm5zIG51bGwgaWYgbm90IGluaXRpYWxpc2VkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q3VycmVudENvbGxlY3RvcigpOiBNYW5pZmVzdENvbGxlY3RvciB8IG51bGwge1xuICByZXR1cm4gZ2xvYmFsQ29sbGVjdG9yO1xufVxuXG4vKipcbiAqIFJlc2V0IHRoZSBnbG9iYWwgY29sbGVjdG9yIChmb3IgdGVzdGluZykuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNldE1hbmlmZXN0Q29sbGVjdG9yKCk6IHZvaWQge1xuICBnbG9iYWxDb2xsZWN0b3IgPSBudWxsO1xufVxuIl19
@@ -0,0 +1,14 @@
1
+ import { type ProviderAccount } from "@fjall/util/config";
2
+ export interface ParsedOrgConfig {
3
+ providerAccounts: ProviderAccount[];
4
+ primaryRegion?: string;
5
+ secondaryRegions: string[];
6
+ disasterRecoveryRegion?: string;
7
+ }
8
+ /**
9
+ * Parse orgConfig JSON from CDK context into a validated structure.
10
+ *
11
+ * Shared across env.ts, getConfig.ts, and disasterRecovery.ts to avoid
12
+ * duplicating the same JSON.parse + field extraction + type guard pattern.
13
+ */
14
+ export declare function parseOrgConfig(raw: string | undefined): ParsedOrgConfig;
@@ -0,0 +1,49 @@
1
+ import { FjallLogger } from "./validationLogger.js";
2
+ /**
3
+ * Parse orgConfig JSON from CDK context into a validated structure.
4
+ *
5
+ * Shared across env.ts, getConfig.ts, and disasterRecovery.ts to avoid
6
+ * duplicating the same JSON.parse + field extraction + type guard pattern.
7
+ */
8
+ export function parseOrgConfig(raw) {
9
+ const empty = {
10
+ providerAccounts: [],
11
+ secondaryRegions: []
12
+ };
13
+ if (!raw)
14
+ return empty;
15
+ try {
16
+ const parsed = JSON.parse(raw);
17
+ if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed))
18
+ return empty;
19
+ const obj = parsed;
20
+ const providerAccounts = Array.isArray(obj.providerAccounts)
21
+ ? obj.providerAccounts.filter((item) => typeof item === "object" &&
22
+ item !== null &&
23
+ typeof item.id === "string" &&
24
+ typeof item.name === "string" &&
25
+ typeof item.environment === "string" &&
26
+ (item.managed === undefined ||
27
+ typeof item.managed === "boolean") &&
28
+ (item.oidcRoleArn === undefined ||
29
+ typeof item.oidcRoleArn === "string"))
30
+ : [];
31
+ const primaryRegion = typeof obj.primaryRegion === "string" ? obj.primaryRegion : undefined;
32
+ const secondaryRegions = Array.isArray(obj.secondaryRegions)
33
+ ? obj.secondaryRegions.filter((item) => typeof item === "string")
34
+ : [];
35
+ const disasterRecoveryRegion = typeof obj.disasterRecoveryRegion === "string"
36
+ ? obj.disasterRecoveryRegion
37
+ : undefined;
38
+ return {
39
+ providerAccounts,
40
+ primaryRegion,
41
+ secondaryRegions,
42
+ disasterRecoveryRegion
43
+ };
44
+ }
45
+ catch (error) {
46
+ FjallLogger.warn(`[fjall] Failed to parse orgConfig from CDK context: ${error instanceof Error ? error.message : String(error)}`);
47
+ return empty;
48
+ }
49
+ }
@@ -1,16 +1,12 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.toRemovalPolicy = toRemovalPolicy;
4
- const aws_cdk_lib_1 = require("aws-cdk-lib");
5
- function toRemovalPolicy(value) {
1
+ import { RemovalPolicy } from "aws-cdk-lib";
2
+ export function toRemovalPolicy(value) {
6
3
  switch (value) {
7
4
  case "DESTROY":
8
- return aws_cdk_lib_1.RemovalPolicy.DESTROY;
5
+ return RemovalPolicy.DESTROY;
9
6
  case "SNAPSHOT":
10
- return aws_cdk_lib_1.RemovalPolicy.SNAPSHOT;
7
+ return RemovalPolicy.SNAPSHOT;
11
8
  case "RETAIN":
12
9
  default:
13
- return aws_cdk_lib_1.RemovalPolicy.RETAIN;
10
+ return RemovalPolicy.RETAIN;
14
11
  }
15
12
  }
16
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVtb3ZhbFBvbGljeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi91dGlscy9yZW1vdmFsUG9saWN5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBRUEsMENBWUM7QUFkRCw2Q0FBNEM7QUFFNUMsU0FBZ0IsZUFBZSxDQUM3QixLQUF5QztJQUV6QyxRQUFRLEtBQUssRUFBRSxDQUFDO1FBQ2QsS0FBSyxTQUFTO1lBQ1osT0FBTywyQkFBYSxDQUFDLE9BQU8sQ0FBQztRQUMvQixLQUFLLFVBQVU7WUFDYixPQUFPLDJCQUFhLENBQUMsUUFBUSxDQUFDO1FBQ2hDLEtBQUssUUFBUSxDQUFDO1FBQ2Q7WUFDRSxPQUFPLDJCQUFhLENBQUMsTUFBTSxDQUFDO0lBQ2hDLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUmVtb3ZhbFBvbGljeSB9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuXG5leHBvcnQgZnVuY3Rpb24gdG9SZW1vdmFsUG9saWN5KFxuICB2YWx1ZT86IFwiREVTVFJPWVwiIHwgXCJSRVRBSU5cIiB8IFwiU05BUFNIT1RcIlxuKTogUmVtb3ZhbFBvbGljeSB7XG4gIHN3aXRjaCAodmFsdWUpIHtcbiAgICBjYXNlIFwiREVTVFJPWVwiOlxuICAgICAgcmV0dXJuIFJlbW92YWxQb2xpY3kuREVTVFJPWTtcbiAgICBjYXNlIFwiU05BUFNIT1RcIjpcbiAgICAgIHJldHVybiBSZW1vdmFsUG9saWN5LlNOQVBTSE9UO1xuICAgIGNhc2UgXCJSRVRBSU5cIjpcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIFJlbW92YWxQb2xpY3kuUkVUQUlOO1xuICB9XG59XG4iXX0=