@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.
- package/LICENSE +50 -21
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -18
- package/dist/lib/app.d.ts +12 -12
- package/dist/lib/app.js +61 -56
- package/dist/lib/aspects/index.d.ts +1 -1
- package/dist/lib/aspects/index.js +1 -6
- package/dist/lib/aspects/resourceInventory.js +6 -13
- package/dist/lib/config/audit.js +1 -5
- package/dist/lib/config/aws/accessAnalyser.d.ts +11 -0
- package/dist/lib/config/aws/accessAnalyser.js +17 -0
- package/dist/lib/config/aws/accountAuditRole.js +11 -15
- package/dist/lib/config/aws/accountMonitoringRole.js +25 -29
- package/dist/lib/config/aws/alarmTopic.d.ts +8 -0
- package/dist/lib/config/aws/alarmTopic.js +19 -0
- package/dist/lib/config/aws/cloudTrail.js +4 -9
- package/dist/lib/config/aws/configRecorder.d.ts +16 -0
- package/dist/lib/config/aws/configRecorder.js +51 -0
- package/dist/lib/config/aws/configRulePreset.d.ts +13 -0
- package/dist/lib/config/aws/configRulePreset.js +62 -0
- package/dist/lib/config/aws/disasterRecovery.d.ts +1 -1
- package/dist/lib/config/aws/disasterRecovery.js +56 -73
- package/dist/lib/config/aws/ebsDefaultEncryption.d.ts +8 -0
- package/dist/lib/config/aws/ebsDefaultEncryption.js +41 -0
- package/dist/lib/config/aws/ecrDefaultImage.js +25 -30
- package/dist/lib/config/aws/eventBus.js +8 -11
- package/dist/lib/config/aws/guardDutyDetector.d.ts +16 -0
- package/dist/lib/config/aws/guardDutyDetector.js +26 -0
- package/dist/lib/config/aws/identityCenter.d.ts +1 -1
- package/dist/lib/config/aws/identityCenter.js +23 -25
- package/dist/lib/config/aws/identityCenterGroupMembership.js +18 -22
- package/dist/lib/config/aws/index.d.ts +19 -8
- package/dist/lib/config/aws/index.js +19 -25
- package/dist/lib/config/aws/inspectorEnablement.d.ts +9 -0
- package/dist/lib/config/aws/inspectorEnablement.js +51 -0
- package/dist/lib/config/aws/ipam.js +9 -13
- package/dist/lib/config/aws/oidcConnector.js +8 -12
- package/dist/lib/config/aws/platform.js +1 -5
- package/dist/lib/config/aws/s3BlockPublicAccess.d.ts +9 -0
- package/dist/lib/config/aws/s3BlockPublicAccess.js +55 -0
- package/dist/lib/config/aws/scpPreset.d.ts +21 -0
- package/dist/lib/config/aws/scpPreset.js +311 -0
- package/dist/lib/config/aws/securityBaseline.d.ts +15 -0
- package/dist/lib/config/aws/securityBaseline.js +27 -0
- package/dist/lib/config/aws/securityHubHub.d.ts +15 -0
- package/dist/lib/config/aws/securityHubHub.js +28 -0
- package/dist/lib/config/aws/securityServicesAdmin.d.ts +20 -0
- package/dist/lib/config/aws/securityServicesAdmin.js +115 -0
- package/dist/lib/config/index.d.ts +2 -2
- package/dist/lib/config/index.js +2 -21
- package/dist/lib/index.d.ts +4 -4
- package/dist/lib/index.js +5 -26
- package/dist/lib/patterns/aws/account.d.ts +17 -1
- package/dist/lib/patterns/aws/account.js +60 -33
- package/dist/lib/patterns/aws/apexDomainPattern.d.ts +26 -0
- package/dist/lib/patterns/aws/apexDomainPattern.js +91 -0
- package/dist/lib/patterns/aws/auditRole.js +13 -16
- package/dist/lib/patterns/aws/buildkite.d.ts +1 -1
- package/dist/lib/patterns/aws/buildkite.js +70 -75
- package/dist/lib/patterns/aws/cdn.d.ts +5 -5
- package/dist/lib/patterns/aws/cdn.js +22 -28
- package/dist/lib/patterns/aws/compute.d.ts +1 -1
- package/dist/lib/patterns/aws/compute.js +31 -44
- package/dist/lib/patterns/aws/computeEc2.d.ts +1 -1
- package/dist/lib/patterns/aws/computeEc2.js +11 -14
- package/dist/lib/patterns/aws/computeEcs.d.ts +18 -2
- package/dist/lib/patterns/aws/computeEcs.js +41 -31
- package/dist/lib/patterns/aws/computeLambda.d.ts +2 -2
- package/dist/lib/patterns/aws/computeLambda.js +24 -31
- package/dist/lib/patterns/aws/database.d.ts +16 -7
- package/dist/lib/patterns/aws/database.js +81 -73
- package/dist/lib/patterns/aws/delegatedDomainPattern.d.ts +17 -0
- package/dist/lib/patterns/aws/delegatedDomainPattern.js +54 -0
- package/dist/lib/patterns/aws/dnsRecordComposer.d.ts +25 -0
- package/dist/lib/patterns/aws/dnsRecordComposer.js +225 -0
- package/dist/lib/patterns/aws/domain.d.ts +32 -0
- package/dist/lib/patterns/aws/domain.js +115 -0
- package/dist/lib/patterns/aws/domainDelegation.d.ts +3 -3
- package/dist/lib/patterns/aws/domainDelegation.js +28 -37
- package/dist/lib/patterns/aws/domainFactory.d.ts +20 -5
- package/dist/lib/patterns/aws/domainFactory.js +48 -10
- package/dist/lib/patterns/aws/domainValidation.d.ts +11 -0
- package/dist/lib/patterns/aws/domainValidation.js +145 -0
- package/dist/lib/patterns/aws/externalRecordsPattern.d.ts +18 -0
- package/dist/lib/patterns/aws/externalRecordsPattern.js +141 -0
- package/dist/lib/patterns/aws/fivetranProxy.d.ts +1 -1
- package/dist/lib/patterns/aws/fivetranProxy.js +6 -11
- package/dist/lib/patterns/aws/index.d.ts +21 -19
- package/dist/lib/patterns/aws/index.js +25 -36
- package/dist/lib/patterns/aws/interfaces/cdn.js +1 -5
- package/dist/lib/patterns/aws/interfaces/compute.js +4 -11
- package/dist/lib/patterns/aws/interfaces/connector.js +1 -15
- package/dist/lib/patterns/aws/interfaces/database.d.ts +1 -1
- package/dist/lib/patterns/aws/interfaces/database.js +6 -15
- package/dist/lib/patterns/aws/interfaces/domain.d.ts +80 -2
- package/dist/lib/patterns/aws/interfaces/domain.js +1 -6
- package/dist/lib/patterns/aws/interfaces/index.js +8 -41
- package/dist/lib/patterns/aws/interfaces/messaging.js +4 -11
- package/dist/lib/patterns/aws/interfaces/organisation.d.ts +1 -1
- package/dist/lib/patterns/aws/interfaces/organisation.js +4 -11
- package/dist/lib/patterns/aws/interfaces/pattern.js +2 -7
- package/dist/lib/patterns/aws/interfaces/storage.js +1 -5
- package/dist/lib/patterns/aws/managedIdentityCenter.js +7 -12
- package/dist/lib/patterns/aws/messaging.d.ts +7 -7
- package/dist/lib/patterns/aws/messaging.js +22 -33
- package/dist/lib/patterns/aws/network.d.ts +2 -2
- package/dist/lib/patterns/aws/network.js +9 -14
- package/dist/lib/patterns/aws/organisation.d.ts +6 -2
- package/dist/lib/patterns/aws/organisation.js +34 -35
- package/dist/lib/patterns/aws/organisationFactory.d.ts +3 -3
- package/dist/lib/patterns/aws/organisationFactory.js +7 -12
- package/dist/lib/patterns/aws/pattern.js +6 -12
- package/dist/lib/patterns/aws/payload.js +73 -63
- package/dist/lib/patterns/aws/platform.d.ts +6 -3
- package/dist/lib/patterns/aws/platform.js +15 -15
- package/dist/lib/patterns/aws/storage.d.ts +6 -4
- package/dist/lib/patterns/aws/storage.js +35 -40
- package/dist/lib/patterns/aws/subdomainHostedZone.js +11 -16
- package/dist/lib/patterns/aws/targets/fjallTargets.d.ts +37 -0
- package/dist/lib/patterns/aws/targets/fjallTargets.js +66 -0
- package/dist/lib/patterns/aws/targets/index.d.ts +2 -0
- package/dist/lib/patterns/aws/targets/index.js +2 -0
- package/dist/lib/patterns/aws/targets/targetResolution.d.ts +76 -0
- package/dist/lib/patterns/aws/targets/targetResolution.js +119 -0
- package/dist/lib/patterns/index.d.ts +1 -0
- package/dist/lib/patterns/index.js +1 -0
- package/dist/lib/resources/aws/analytics/clickhouse.d.ts +15 -0
- package/dist/lib/resources/aws/analytics/clickhouse.js +292 -0
- package/dist/lib/resources/aws/analytics/clickhouseConstants.d.ts +73 -0
- package/dist/lib/resources/aws/analytics/clickhouseConstants.js +87 -0
- package/dist/lib/resources/aws/analytics/clickhouseSecurityGroup.d.ts +13 -0
- package/dist/lib/resources/aws/analytics/clickhouseSecurityGroup.js +28 -0
- package/dist/lib/resources/aws/analytics/clickhouseTypes.d.ts +47 -0
- package/dist/lib/resources/aws/analytics/clickhouseTypes.js +1 -0
- package/dist/lib/resources/aws/analytics/clickhouseUserData.d.ts +5 -0
- package/dist/lib/resources/aws/analytics/clickhouseUserData.js +248 -0
- package/dist/lib/resources/aws/analytics/index.d.ts +2 -0
- package/dist/lib/resources/aws/analytics/index.js +1 -0
- package/dist/lib/resources/aws/audit/auditRole.js +10 -15
- package/dist/lib/resources/aws/audit/index.d.ts +1 -1
- package/dist/lib/resources/aws/audit/index.js +1 -6
- package/dist/lib/resources/aws/backup/backupPlan.d.ts +1 -1
- package/dist/lib/resources/aws/backup/backupPlan.js +14 -16
- package/dist/lib/resources/aws/backup/backupVault.d.ts +1 -1
- package/dist/lib/resources/aws/backup/backupVault.js +13 -15
- package/dist/lib/resources/aws/backup/index.d.ts +2 -2
- package/dist/lib/resources/aws/backup/index.js +2 -19
- package/dist/lib/resources/aws/base/awsStack.js +17 -19
- package/dist/lib/resources/aws/base/index.d.ts +1 -1
- package/dist/lib/resources/aws/base/index.js +1 -18
- package/dist/lib/resources/aws/cdn/cloudFront.js +40 -42
- package/dist/lib/resources/aws/cdn/index.d.ts +1 -1
- package/dist/lib/resources/aws/cdn/index.js +1 -18
- package/dist/lib/resources/aws/compute/ec2.js +39 -39
- package/dist/lib/resources/aws/compute/ecs.d.ts +18 -396
- package/dist/lib/resources/aws/compute/ecs.js +105 -976
- package/dist/lib/resources/aws/compute/ecsCapacityProviderAspect.d.ts +22 -0
- package/dist/lib/resources/aws/compute/ecsCapacityProviderAspect.js +35 -0
- package/dist/lib/resources/aws/compute/ecsConstants.d.ts +20 -0
- package/dist/lib/resources/aws/compute/ecsConstants.js +49 -0
- package/dist/lib/resources/aws/compute/ecsContext.d.ts +12 -0
- package/dist/lib/resources/aws/compute/ecsContext.js +1 -0
- package/dist/lib/resources/aws/compute/ecsImages.d.ts +4 -0
- package/dist/lib/resources/aws/compute/ecsImages.js +35 -0
- package/dist/lib/resources/aws/compute/ecsNetworking.d.ts +28 -0
- package/dist/lib/resources/aws/compute/ecsNetworking.js +290 -0
- package/dist/lib/resources/aws/compute/ecsRoles.d.ts +15 -0
- package/dist/lib/resources/aws/compute/ecsRoles.js +110 -0
- package/dist/lib/resources/aws/compute/ecsServiceFactory.d.ts +33 -0
- package/dist/lib/resources/aws/compute/ecsServiceFactory.js +183 -0
- package/dist/lib/resources/aws/compute/ecsTaskDefinition.d.ts +30 -0
- package/dist/lib/resources/aws/compute/ecsTaskDefinition.js +168 -0
- package/dist/lib/resources/aws/compute/ecsTypes.d.ts +337 -0
- package/dist/lib/resources/aws/compute/ecsTypes.js +10 -0
- package/dist/lib/resources/aws/compute/ecsValidation.d.ts +18 -0
- package/dist/lib/resources/aws/compute/ecsValidation.js +72 -0
- package/dist/lib/resources/aws/compute/index.d.ts +3 -3
- package/dist/lib/resources/aws/compute/index.js +3 -20
- package/dist/lib/resources/aws/compute/lambda.d.ts +10 -2
- package/dist/lib/resources/aws/compute/lambda.js +81 -71
- package/dist/lib/resources/aws/database/dynamodb.js +24 -27
- package/dist/lib/resources/aws/database/index.d.ts +7 -7
- package/dist/lib/resources/aws/database/index.js +14 -33
- package/dist/lib/resources/aws/database/rdsAurora.d.ts +10 -2
- package/dist/lib/resources/aws/database/rdsAurora.js +76 -61
- package/dist/lib/resources/aws/database/rdsAuroraGlobal.d.ts +2 -2
- package/dist/lib/resources/aws/database/rdsAuroraGlobal.js +24 -21
- package/dist/lib/resources/aws/database/rdsDefaults.js +3 -7
- package/dist/lib/resources/aws/database/rdsHelpers.d.ts +2 -2
- package/dist/lib/resources/aws/database/rdsHelpers.js +21 -29
- package/dist/lib/resources/aws/database/rdsInstance.d.ts +11 -3
- package/dist/lib/resources/aws/database/rdsInstance.js +101 -83
- package/dist/lib/resources/aws/database/rdsProxyOutput.js +5 -9
- package/dist/lib/resources/aws/iam/delegationRole.d.ts +18 -0
- package/dist/lib/resources/aws/iam/delegationRole.js +60 -0
- package/dist/lib/resources/aws/iam/identityCenter/assignment.js +4 -9
- package/dist/lib/resources/aws/iam/identityCenter/group.js +5 -9
- package/dist/lib/resources/aws/iam/identityCenter/index.d.ts +3 -3
- package/dist/lib/resources/aws/iam/identityCenter/index.js +3 -20
- package/dist/lib/resources/aws/iam/identityCenter/permissionSet.d.ts +1 -1
- package/dist/lib/resources/aws/iam/identityCenter/permissionSet.js +5 -9
- package/dist/lib/resources/aws/iam/index.d.ts +5 -4
- package/dist/lib/resources/aws/iam/index.js +5 -21
- package/dist/lib/resources/aws/iam/instanceProfile.js +2 -7
- package/dist/lib/resources/aws/iam/managedPolicy.js +2 -7
- package/dist/lib/resources/aws/iam/policy.js +2 -7
- package/dist/lib/resources/aws/iam/role.js +2 -7
- package/dist/lib/resources/aws/index.d.ts +7 -7
- package/dist/lib/resources/aws/index.js +7 -24
- package/dist/lib/resources/aws/logging/cloudTrail.d.ts +1 -1
- package/dist/lib/resources/aws/logging/cloudTrail.js +18 -22
- package/dist/lib/resources/aws/logging/index.d.ts +2 -2
- package/dist/lib/resources/aws/logging/index.js +2 -19
- package/dist/lib/resources/aws/logging/logGroup.js +4 -10
- package/dist/lib/resources/aws/messaging/eventbridge.js +11 -14
- package/dist/lib/resources/aws/messaging/index.d.ts +4 -4
- package/dist/lib/resources/aws/messaging/index.js +4 -21
- package/dist/lib/resources/aws/messaging/sns.js +11 -14
- package/dist/lib/resources/aws/messaging/sqs.js +32 -34
- package/dist/lib/resources/aws/messaging/utils.d.ts +1 -1
- package/dist/lib/resources/aws/messaging/utils.js +1 -6
- package/dist/lib/resources/aws/monitoring/alarmDefaults.d.ts +36 -0
- package/dist/lib/resources/aws/monitoring/alarmDefaults.js +34 -0
- package/dist/lib/resources/aws/monitoring/ecsAlarms.d.ts +21 -0
- package/dist/lib/resources/aws/monitoring/ecsAlarms.js +88 -0
- package/dist/lib/resources/aws/monitoring/index.d.ts +4 -0
- package/dist/lib/resources/aws/monitoring/index.js +4 -5
- package/dist/lib/resources/aws/monitoring/lambdaAlarms.d.ts +18 -0
- package/dist/lib/resources/aws/monitoring/lambdaAlarms.js +44 -0
- package/dist/lib/resources/aws/monitoring/rdsAlarms.d.ts +20 -0
- package/dist/lib/resources/aws/monitoring/rdsAlarms.js +52 -0
- package/dist/lib/resources/aws/networking/crossAccountDelegationRecord.d.ts +17 -0
- package/dist/lib/resources/aws/networking/crossAccountDelegationRecord.js +26 -0
- package/dist/lib/resources/aws/networking/dnsRecord/aRecord.d.ts +12 -0
- package/dist/lib/resources/aws/networking/dnsRecord/aRecord.js +21 -0
- package/dist/lib/resources/aws/networking/dnsRecord/aaaaRecord.d.ts +12 -0
- package/dist/lib/resources/aws/networking/dnsRecord/aaaaRecord.js +22 -0
- package/dist/lib/resources/aws/networking/dnsRecord/aliasRecord.d.ts +12 -0
- package/dist/lib/resources/aws/networking/dnsRecord/aliasRecord.js +23 -0
- package/dist/lib/resources/aws/networking/dnsRecord/caaRecord.d.ts +17 -0
- package/dist/lib/resources/aws/networking/dnsRecord/caaRecord.js +21 -0
- package/dist/lib/resources/aws/networking/dnsRecord/cnameRecord.d.ts +12 -0
- package/dist/lib/resources/aws/networking/dnsRecord/cnameRecord.js +22 -0
- package/dist/lib/resources/aws/networking/dnsRecord/dnsRecordBase.d.ts +17 -0
- package/dist/lib/resources/aws/networking/dnsRecord/dnsRecordBase.js +17 -0
- package/dist/lib/resources/aws/networking/dnsRecord/index.d.ts +10 -0
- package/dist/lib/resources/aws/networking/dnsRecord/index.js +10 -0
- package/dist/lib/resources/aws/networking/dnsRecord/mxRecord.d.ts +16 -0
- package/dist/lib/resources/aws/networking/dnsRecord/mxRecord.js +21 -0
- package/dist/lib/resources/aws/networking/dnsRecord/nsRecord.d.ts +12 -0
- package/dist/lib/resources/aws/networking/dnsRecord/nsRecord.js +21 -0
- package/dist/lib/resources/aws/networking/dnsRecord/srvRecord.d.ts +18 -0
- package/dist/lib/resources/aws/networking/dnsRecord/srvRecord.js +21 -0
- package/dist/lib/resources/aws/networking/dnsRecord/txtRecord.d.ts +12 -0
- package/dist/lib/resources/aws/networking/dnsRecord/txtRecord.js +21 -0
- package/dist/lib/resources/aws/networking/domain.d.ts +1 -1
- package/dist/lib/resources/aws/networking/domain.js +32 -34
- package/dist/lib/resources/aws/networking/domainCertificate.d.ts +8 -3
- package/dist/lib/resources/aws/networking/domainCertificate.js +22 -16
- package/dist/lib/resources/aws/networking/hostedZone.d.ts +23 -19
- package/dist/lib/resources/aws/networking/hostedZone.js +70 -134
- package/dist/lib/resources/aws/networking/index.d.ts +8 -7
- package/dist/lib/resources/aws/networking/index.js +8 -24
- package/dist/lib/resources/aws/networking/ipam.js +2 -7
- package/dist/lib/resources/aws/networking/ipamPool.d.ts +1 -1
- package/dist/lib/resources/aws/networking/ipamPool.js +45 -55
- package/dist/lib/resources/aws/networking/securityGroup.js +2 -7
- package/dist/lib/resources/aws/networking/vpc.d.ts +1 -1
- package/dist/lib/resources/aws/networking/vpc.js +17 -21
- package/dist/lib/resources/aws/organisation/costAllocationTagActivator.d.ts +1 -1
- package/dist/lib/resources/aws/organisation/costAllocationTagActivator.js +11 -15
- package/dist/lib/resources/aws/organisation/index.d.ts +5 -5
- package/dist/lib/resources/aws/organisation/index.js +4 -12
- package/dist/lib/resources/aws/organisation/organisation.js +5 -7
- package/dist/lib/resources/aws/organisation/organisationAccount.js +7 -10
- package/dist/lib/resources/aws/organisation/organisationPolicy.js +5 -9
- package/dist/lib/resources/aws/organisation/organisationalUnit.js +1 -3
- package/dist/lib/resources/aws/secrets/alias.js +2 -7
- package/dist/lib/resources/aws/secrets/index.d.ts +4 -4
- package/dist/lib/resources/aws/secrets/index.js +4 -21
- package/dist/lib/resources/aws/secrets/kms.js +15 -18
- package/dist/lib/resources/aws/secrets/parameter.d.ts +3 -3
- package/dist/lib/resources/aws/secrets/parameter.js +19 -22
- package/dist/lib/resources/aws/secrets/secret.d.ts +2 -2
- package/dist/lib/resources/aws/secrets/secret.js +12 -14
- package/dist/lib/resources/aws/storage/ecr.d.ts +2 -2
- package/dist/lib/resources/aws/storage/ecr.js +7 -13
- package/dist/lib/resources/aws/storage/index.d.ts +2 -2
- package/dist/lib/resources/aws/storage/index.js +2 -19
- package/dist/lib/resources/aws/storage/s3.d.ts +1 -1
- package/dist/lib/resources/aws/storage/s3.js +24 -12
- package/dist/lib/resources/aws/utilities/awsCustomResource.js +3 -7
- package/dist/lib/resources/aws/utilities/codeBuild.js +7 -12
- package/dist/lib/resources/aws/utilities/customResource.js +14 -17
- package/dist/lib/resources/aws/utilities/customResourceProvider.js +2 -7
- package/dist/lib/resources/aws/utilities/index.d.ts +5 -5
- package/dist/lib/resources/aws/utilities/index.js +5 -22
- package/dist/lib/resources/aws/utilities/resourceShare.js +2 -7
- package/dist/lib/resources/index.d.ts +1 -1
- package/dist/lib/resources/index.js +1 -18
- package/dist/lib/types.js +1 -3
- package/dist/lib/utils/accountsUtils.d.ts +5 -0
- package/dist/lib/utils/accountsUtils.js +18 -0
- package/dist/lib/utils/addSuffixToEmail.js +1 -5
- package/dist/lib/utils/backupTierMapping.js +2 -6
- package/dist/lib/utils/capitaliseString.js +1 -10
- package/dist/lib/utils/connections.js +9 -13
- package/dist/lib/utils/connector.js +10 -23
- package/dist/lib/utils/constructMap.d.ts +33 -0
- package/dist/lib/utils/constructMap.js +154 -0
- package/dist/lib/utils/databaseTypes.js +4 -10
- package/dist/lib/utils/dnsRecords.d.ts +1 -1
- package/dist/lib/utils/dnsRecords.js +23 -27
- package/dist/lib/utils/domainTypes.d.ts +0 -1
- package/dist/lib/utils/domainTypes.js +2 -10
- package/dist/lib/utils/env.js +14 -26
- package/dist/lib/utils/getAccountId.js +3 -7
- package/dist/lib/utils/getAsync.js +7 -10
- package/dist/lib/utils/getConfig.d.ts +0 -2
- package/dist/lib/utils/getConfig.js +29 -47
- package/dist/lib/utils/getStackOutput.js +4 -8
- package/dist/lib/utils/index.d.ts +12 -12
- package/dist/lib/utils/index.js +12 -29
- package/dist/lib/utils/manifestWriter.d.ts +14 -3
- package/dist/lib/utils/manifestWriter.js +60 -43
- package/dist/lib/utils/orgConfigParser.d.ts +14 -0
- package/dist/lib/utils/orgConfigParser.js +49 -0
- package/dist/lib/utils/removalPolicy.js +5 -9
- package/dist/lib/utils/resourceNaming.js +11 -16
- package/dist/lib/utils/standardTagsAspect.js +9 -16
- package/dist/lib/utils/stripAndCamelCase.js +1 -5
- package/dist/lib/utils/validationLogger.js +12 -18
- package/dist/lib/utils/vpcUtils.js +5 -10
- package/package.json +25 -8
- package/dist/lib/config/aws/accountId.d.ts +0 -6
- package/dist/lib/config/aws/accountId.js +0 -32
- package/dist/lib/config/aws/backupGlobalSettings.d.ts +0 -29
- package/dist/lib/config/aws/backupGlobalSettings.js +0 -49
- package/dist/lib/config/aws/costAllocationTags.d.ts +0 -12
- package/dist/lib/config/aws/costAllocationTags.js +0 -47
- package/dist/lib/config/aws/ipamDelegateAdmin.d.ts +0 -8
- package/dist/lib/config/aws/ipamDelegateAdmin.js +0 -57
- package/dist/lib/config/aws/ipamPoolId.d.ts +0 -16
- package/dist/lib/config/aws/ipamPoolId.js +0 -42
- package/dist/lib/config/aws/organisation.d.ts +0 -30
- package/dist/lib/config/aws/organisation.js +0 -92
- package/dist/lib/config/aws/organisationId.d.ts +0 -7
- package/dist/lib/config/aws/organisationId.js +0 -45
- package/dist/lib/config/aws/organisationsAccess.d.ts +0 -10
- package/dist/lib/config/aws/organisationsAccess.js +0 -49
- package/dist/lib/config/aws/ramSharing.d.ts +0 -4
- package/dist/lib/config/aws/ramSharing.js +0 -34
- package/dist/lib/config/monitoring.d.ts +0 -18
- package/dist/lib/config/monitoring.js +0 -22
- package/dist/lib/patterns/aws/connections.d.ts +0 -46
- package/dist/lib/patterns/aws/connections.js +0 -159
- package/dist/lib/patterns/aws/hostedZone.d.ts +0 -28
- package/dist/lib/patterns/aws/hostedZone.js +0 -150
- package/dist/lib/patterns/aws/managedAccount.d.ts +0 -9
- package/dist/lib/patterns/aws/managedAccount.js +0 -55
- package/dist/lib/patterns/aws/managedOrganisation.d.ts +0 -36
- package/dist/lib/patterns/aws/managedOrganisation.js +0 -97
- package/dist/lib/patterns/aws/managedPlatform.d.ts +0 -12
- package/dist/lib/patterns/aws/managedPlatform.js +0 -29
- package/dist/lib/resources/aws/database/database.d.ts +0 -14
- package/dist/lib/resources/aws/database/database.js +0 -28
- package/dist/lib/resources/aws/database/databaseInstance.d.ts +0 -15
- package/dist/lib/resources/aws/database/databaseInstance.js +0 -30
- package/dist/lib/resources/aws/database/migrationLambda.d.ts +0 -80
- package/dist/lib/resources/aws/database/migrationLambda.js +0 -119
- package/dist/lib/resources/aws/iam/identityCenter/attachManagedPolicy.d.ts +0 -13
- package/dist/lib/resources/aws/iam/identityCenter/attachManagedPolicy.js +0 -51
- package/dist/lib/resources/aws/iam/securityGroup.d.ts +0 -5
- package/dist/lib/resources/aws/iam/securityGroup.js +0 -14
- package/dist/lib/resources/aws/monitoring/monitoringRole.d.ts +0 -29
- package/dist/lib/resources/aws/monitoring/monitoringRole.js +0 -120
- package/dist/lib/utils/capitalizeString.d.ts +0 -12
- package/dist/lib/utils/capitalizeString.js +0 -30
|
@@ -1,56 +1,35 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
const
|
|
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
|
-
|
|
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
|
|
21
|
-
|
|
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
|
-
|
|
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
|
-
|
|
98
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0Q29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vbGliL3V0aWxzL2dldENvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQW1CQSw4QkF3R0M7QUF6SEQsZ0NBQXlCO0FBRXpCLHlEQUFpRDtBQWVqRCxTQUFnQixTQUFTLENBQUMsV0FBb0I7SUFDNUMsTUFBTSxHQUFHLEdBQUcsYUFBRyxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBRTlCLE1BQU0sTUFBTSxHQUFXO1FBQ3JCLE1BQU0sRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLFVBQVUsSUFBSSxXQUFXO1FBQzdDLFdBQVcsRUFBRSxTQUFTO1FBQ3RCLGdCQUFnQixFQUFFLEVBQUU7UUFDcEIsZ0JBQWdCLEVBQUUsRUFBRTtRQUNwQixVQUFVLEVBQUUsRUFBRTtLQUNmLENBQUM7SUFFRixJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFVO1FBQ3pCLDhCQUFXLENBQUMsSUFBSSxDQUFDLGdEQUFnRCxDQUFDLENBQUM7SUFFckUsSUFBSSxnQkFBZ0IsR0FBc0IsRUFBRSxDQUFDO0lBRTdDLHFFQUFxRTtJQUNyRSxNQUFNLFlBQVksR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUV6RCxJQUFJLE9BQU8sWUFBWSxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQ3JDLElBQUksQ0FBQztZQUNILE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUE0QixDQUFDO1lBQ3RFLGdCQUFnQixHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLGdCQUFnQixDQUFDO2dCQUMxRCxDQUFDLENBQUUsU0FBUyxDQUFDLGdCQUFzQztnQkFDbkQsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNQLE1BQU0sQ0FBQyxhQUFhO2dCQUNsQixPQUFPLFNBQVMsQ0FBQyxhQUFhLEtBQUssUUFBUTtvQkFDekMs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LENBQzNDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxLQUFLLFNBQVMsQ0FDNUIsQ0FBQztZQUNGLElBQUksZUFBZSxFQUFFLENBQUM7Z0JBQ3BCLE1BQU0sQ0FBQyxXQUFXLEdBQUcsZUFBZSxDQUFDLElBQUksQ0FBQztnQkFDMUMsTUFBTSxDQUFDLFdBQVcsR0FBRyxlQUFlLENBQUMsV0FBVyxDQUFDO1lBQ25ELENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVELHdEQUF3RDtJQUN4RCxNQUFNLGtCQUFrQixHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQ2pFLElBQUksT0FBTyxrQkFBa0IsS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUMzQyxNQUFNLENBQUMsV0FBVyxHQUFHLGtCQUFrQixDQUFDO0lBQzFDLENBQUM7U0FBTSxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsV0FBVyxJQUFJLE1BQU0sQ0FBQyxXQUFXLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDdkUsNkRBQTZEO1FBQzdELE1BQU0sQ0FBQyxXQUFXLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUM7SUFDL0MsQ0FBQztJQUVELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7QUFFRCxrQkFBZSxTQUFTLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB0eXBlIEFjY291bnQgfSBmcm9tIFwiQGF3cy1zZGsvY2xpZW50LW9yZ2FuaXphdGlvbnNcIjtcblxuaW1wb3J0IEFwcCBmcm9tIFwiLi4vYXBwXCI7XG5pbXBvcnQgeyB0eXBlIFByb3ZpZGVyQWNjb3VudCB9IGZyb20gXCJAZmphbGwvdXRpbFwiO1xuaW1wb3J0IHsgRmphbGxMb2dnZXIgfSBmcm9tIFwiLi92YWxpZGF0aW9uTG9nZ2VyXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29uZmlnIHtcbiAgcmVnaW9uOiBzdHJpbmc7XG4gIGVudmlyb25tZW50OiBzdHJpbmc7XG4gIGV4aXN0aW5nQWNjb3VudHM6IEFjY291bnRbXTtcbiAgYWNjb3VudElkPzogc3RyaW5nO1xuICBhY2NvdW50TmFtZT86IHN0cmluZztcbiAgYWNjb3VudElkcz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIHByaW1hcnlSZWdpb24/OiBzdHJpbmc7XG4gIHNlY29uZGFyeVJlZ2lvbnM6IHN0cmluZ1tdO1xuICBhbGxSZWdpb25zOiBzdHJpbmdbXTtcbiAgZGlzYXN0ZXJSZWNvdmVyeVJlZ2lvbj86IHN0cmluZztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldENvbmZpZyhhY2NvdW50TmFtZT86IHN0cmluZyk6IENvbmZpZyB7XG4gIGNvbnN0IGFwcCA9IEFwcC5nZXRJbnN0YW5jZSgpO1xuXG4gIGNvbnN0IGNvbmZpZzogQ29uZmlnID0ge1xuICAgIHJlZ2lvbjogcHJvY2Vzcy5lbnYuQVdTX1JFR0lPTiB8fCBcInVzLWVhc3QtMVwiLFxuICAgIGVudmlyb25tZW50OiBcInVua25vd25cIixcbiAgICBleGlzdGluZ0FjY291bnRzOiBbXSxcbiAgICBzZWNvbmRhcnlSZWdpb25zOiBbXSxcbiAgICBhbGxSZWdpb25zOiBbXVxuICB9O1xuXG4gIGlmICghcHJvY2Vzcy5lbnYuQVdTX1JFR0lPTilcbiAgICBGamFsbExvZ2dlci53YXJuKFwiQVdTX1JFR0lPTiBpcyBub3Qgc2V0LCBkZWZhdWx0aW5nIHRvIHVzLWVhc3QtMVwiKTtcblxuICBsZXQgcHJvdmlkZXJBY2NvdW50czogUHJvdmlkZXJBY2NvdW50W10gPSBbXTtcblxuICAvLyBQcmltYXJ5OiByZWFkIG9yZyBjb25maWcgZnJvbSBDREsgY29udGV4dCAoaW5qZWN0ZWQgYnkgQ0xJL3dvcmtlcilcbiAgY29uc3Qgb3JnQ29uZmlnUmF3ID0gYXBwLm5vZGUudHJ5R2V0Q29udGV4dChcIm9yZ0NvbmZpZ1wiKTtcblxuICBpZiAodHlwZW9mIG9yZ0NvbmZpZ1JhdyA9PT0gXCJzdHJpbmdcIikge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBvcmdDb25maWcgPSBKU09OLnBhcnNlKG9yZ0NvbmZpZ1JhdykgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICBwcm92aWRlckFjY291bnRzID0gQXJyYXkuaXNBcnJheShvcmdDb25maWcucHJvdmlkZXJBY2NvdW50cylcbiAgICAgICAgPyAob3JnQ29uZmlnLnByb3ZpZGVyQWNjb3VudHMgYXMgUHJvdmlkZXJBY2NvdW50W10pXG4gICAgICAgIDogW107XG4gICAgICBjb25maWcucHJpbWFyeVJlZ2lvbiA9XG4gICAgICAgIHR5cGVvZiBvcmdDb25maWcucHJpbWFyeVJlZ2lvbiA9PT0gXCJzdHJpbmdcIlxuICAgICAgICAgID8gb3JnQ29uZmlnLnByaW1hcnlSZWdpb25cbiAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgIGNvbmZpZy5zZWNvbmRhcnlSZWdpb25zID0gQXJyYXkuaXNBcnJheShvcmdDb25maWcuc2Vjb25kYXJ5UmVnaW9ucylcbiAgICAgICAgPyAob3JnQ29uZmlnLnNlY29uZGFyeVJlZ2lvbnMgYXMgc3RyaW5nW10pXG4gICAgICAgIDogW107XG4gICAgICBjb25maWcuZGlzYXN0ZXJSZWNvdmVyeVJlZ2lvbiA9XG4gICAgICAgIHR5cGVvZiBvcmdDb25maWcuZGlzYXN0ZXJSZWNvdmVyeVJlZ2lvbiA9PT0gXCJzdHJpbmdcIlxuICAgICAgICAgID8gb3JnQ29uZmlnLmRpc2FzdGVyUmVjb3ZlcnlSZWdpb25cbiAgICAgICAgICA6IHVuZGVmaW5lZDtcblxuICAgICAgLy8gQ29tcHV0ZSBhbGxSZWdpb25zIGZyb20gb3JnIGNvbmZpZyBmaWVsZHNcbiAgICAgIGNvbnN0IHJlZ2lvbnMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICAgIGlmIChjb25maWcucHJpbWFyeVJlZ2lvbikgcmVnaW9ucy5hZGQoY29uZmlnLnByaW1hcnlSZWdpb24pO1xuICAgICAgZm9yIChjb25zdCByIG9mIGNvbmZpZy5zZWNvbmRhcnlSZWdpb25zKSByZWdpb25zLmFkZChyKTtcbiAgICAgIGlmIChjb25maWcuZGlzYXN0ZXJSZWNvdmVyeVJlZ2lvbilcbiAgICAgICAgcmVnaW9ucy5hZGQoY29uZmlnLmRpc2FzdGVyUmVjb3ZlcnlSZWdpb24pO1xuICAgICAgY29uZmlnLmFsbFJlZ2lvbnMgPSBbLi4ucmVnaW9uc107XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIEZqYWxsTG9nZ2VyLndhcm4oXG4gICAgICAgIGBGYWlsZWQgdG8gcGFyc2Ugb3JnQ29uZmlnIGZyb20gQ0RLIGNvbnRleHQ6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfWBcbiAgICAgICk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIEZqYWxsTG9nZ2VyLndhcm4oXG4gICAgICBcIk5vIG9yZ0NvbmZpZyBjb250ZXh0IHByb3ZpZGVkIOKAlCBvcmctbGV2ZWwgY29uZmlnIChhY2NvdW50cywgcmVnaW9ucykgd2lsbCBiZSBlbXB0eVwiXG4gICAgKTtcbiAgfVxuXG4gIC8vIEJ1aWxkIGFjY291bnQgSURzIG1hcCBmcm9tIHByb3ZpZGVyIGFjY291bnRzIChuYW1lIOKGkiBpZClcbiAgaWYgKHByb3ZpZGVyQWNjb3VudHMubGVuZ3RoID4gMCkge1xuICAgIGNvbmZpZy5hY2NvdW50SWRzID0ge307XG4gICAgZm9yIChjb25zdCBwYSBvZiBwcm92aWRlckFjY291bnRzKSB7XG4gICAgICBjb25maWcuYWNjb3VudElkc1twYS5uYW1lXSA9IHBhLmlkO1xuICAgIH1cbiAgfVxuXG4gIC8vIElmIHVuc3BlY2lmaWVkIGFjY291bnQgbmFtZSAtIHRyeSB0byByZXRyaWV2ZSBmcm9tIGNvbnRleHRcbiAgaWYgKCFhY2NvdW50TmFtZSkgYWNjb3VudE5hbWUgPSBhcHAubm9kZS50cnlHZXRDb250ZXh0KFwiYWNjb3VudE5hbWVcIik7XG4gIC8vIElmIHdlIGhhdmUgYW4gYWNjb3VudCBuYW1lIC0gbG9vayBmb3IgYXNzb2NpYXRlZCBwcm92aWRlciBhY2NvdW50XG4gIGlmIChhY2NvdW50TmFtZSkge1xuICAgIGNvbnN0IHByb3ZpZGVyQWNjb3VudCA9IHByb3ZpZGVyQWNjb3VudHMuZmluZChcbiAgICAgIChwYSkgPT4gcGEubmFtZSA9PT0gYWNjb3VudE5hbWVcbiAgICApO1xuICAgIGlmIChwcm92aWRlckFjY291bnQpIHtcbiAgICAgIGNvbmZpZy5hY2NvdW50SWQgPSBwcm92aWRlckFjY291bnQuaWQ7XG4gICAgICBjb25maWcuYWNjb3VudE5hbWUgPSBwcm92aWRlckFjY291bnQubmFtZTtcbiAgICAgIGNvbmZpZy5lbnZpcm9ubWVudCA9IHByb3ZpZGVyQWNjb3VudC5lbnZpcm9ubWVudDtcbiAgICB9XG4gIH1cblxuICAvLyBJZiB3ZSBzdGlsbCBkb24ndCBoYXZlIGFuIGFjY291bnQgbmFtZSAtIHRyeSB0byByZXRyaWV2ZSBhY2NvdW50SWQgZnJvbSBjb250ZXh0XG4gIGlmICghY29uZmlnLmFjY291bnROYW1lKSB7XG4gICAgY29uc3QgYWNjb3VudElkID0gYXBwLm5vZGUudHJ5R2V0Q29udGV4dChcImFjY291bnRJZFwiKTtcbiAgICAvLyBJZiB3ZSBmaW5kIGFuIGFjY291bnRJZCAtIHJldHJpZXZlIHRoZSBhc3NvY2lhdGVkIGFjY291bnQgZnJvbSBjb25maWdcbiAgICBpZiAodHlwZW9mIGFjY291bnRJZCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgY29uZmlnLmFjY291bnRJZCA9IGFjY291bnRJZDtcblxuICAgICAgY29uc3QgcHJvdmlkZXJBY2NvdW50ID0gcHJvdmlkZXJBY2NvdW50cy5maW5kKFxuICAgICAgICAocGEpID0+IHBhLmlkID09PSBhY2NvdW50SWRcbiAgICAgICk7XG4gICAgICBpZiAocHJvdmlkZXJBY2NvdW50KSB7XG4gICAgICAgIGNvbmZpZy5hY2NvdW50TmFtZSA9IHByb3ZpZGVyQWNjb3VudC5uYW1lO1xuICAgICAgICBjb25maWcuZW52aXJvbm1lbnQgPSBwcm92aWRlckFjY291bnQuZW52aXJvbm1lbnQ7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gQ2hlY2sgZm9yIGVudmlyb25tZW50IGZyb20gY29udGV4dCAoaGlnaGVzdCBwcmlvcml0eSlcbiAgY29uc3QgY29udGV4dEVudmlyb25tZW50ID0gYXBwLm5vZGUudHJ5R2V0Q29udGV4dChcImVudmlyb25tZW50XCIpO1xuICBpZiAodHlwZW9mIGNvbnRleHRFbnZpcm9ubWVudCA9PT0gXCJzdHJpbmdcIikge1xuICAgIGNvbmZpZy5lbnZpcm9ubWVudCA9IGNvbnRleHRFbnZpcm9ubWVudDtcbiAgfSBlbHNlIGlmIChwcm9jZXNzLmVudi5FTlZJUk9OTUVOVCAmJiBjb25maWcuZW52aXJvbm1lbnQgPT09IFwidW5rbm93blwiKSB7XG4gICAgLy8gRmFsbCBiYWNrIHRvIEVOVklST05NRU5UIHZhcmlhYmxlIGlmIG5vIG90aGVyIHNvdXJjZSBmb3VuZFxuICAgIGNvbmZpZy5lbnZpcm9ubWVudCA9IHByb2Nlc3MuZW52LkVOVklST05NRU5UO1xuICB9XG5cbiAgcmV0dXJuIGNvbmZpZztcbn1cblxuZXhwb3J0IGRlZmF1bHQgZ2V0Q29uZmlnO1xuIl19
|
|
80
|
+
export default getConfig;
|
|
@@ -1,20 +1,16 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
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
|
-
|
|
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 =
|
|
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";
|
package/dist/lib/utils/index.js
CHANGED
|
@@ -1,29 +1,12 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
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
|
-
|
|
21
|
-
|
|
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
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
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 =
|
|
116
|
+
const content = readFileSync(templatePath, "utf-8");
|
|
112
117
|
const normalised = JSON.stringify(JSON.parse(content));
|
|
113
|
-
return
|
|
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
|
-
|
|
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 =
|
|
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 =
|
|
132
|
-
const stackName =
|
|
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
|
-
|
|
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 =
|
|
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
|
-
|
|
176
|
-
|
|
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
|
-
|
|
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 =
|
|
188
|
-
if (!
|
|
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 =
|
|
193
|
-
|
|
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
|
-
|
|
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
|
-
|
|
2
|
-
|
|
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
|
|
5
|
+
return RemovalPolicy.DESTROY;
|
|
9
6
|
case "SNAPSHOT":
|
|
10
|
-
return
|
|
7
|
+
return RemovalPolicy.SNAPSHOT;
|
|
11
8
|
case "RETAIN":
|
|
12
9
|
default:
|
|
13
|
-
return
|
|
10
|
+
return RemovalPolicy.RETAIN;
|
|
14
11
|
}
|
|
15
12
|
}
|
|
16
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVtb3ZhbFBvbGljeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi91dGlscy9yZW1vdmFsUG9saWN5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBRUEsMENBWUM7QUFkRCw2Q0FBNEM7QUFFNUMsU0FBZ0IsZUFBZSxDQUM3QixLQUF5QztJQUV6QyxRQUFRLEtBQUssRUFBRSxDQUFDO1FBQ2QsS0FBSyxTQUFTO1lBQ1osT0FBTywyQkFBYSxDQUFDLE9BQU8sQ0FBQztRQUMvQixLQUFLLFVBQVU7WUFDYixPQUFPLDJCQUFhLENBQUMsUUFBUSxDQUFDO1FBQ2hDLEtBQUssUUFBUSxDQUFDO1FBQ2Q7WUFDRSxPQUFPLDJCQUFhLENBQUMsTUFBTSxDQUFDO0lBQ2hDLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUmVtb3ZhbFBvbGljeSB9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuXG5leHBvcnQgZnVuY3Rpb24gdG9SZW1vdmFsUG9saWN5KFxuICB2YWx1ZT86IFwiREVTVFJPWVwiIHwgXCJSRVRBSU5cIiB8IFwiU05BUFNIT1RcIlxuKTogUmVtb3ZhbFBvbGljeSB7XG4gIHN3aXRjaCAodmFsdWUpIHtcbiAgICBjYXNlIFwiREVTVFJPWVwiOlxuICAgICAgcmV0dXJuIFJlbW92YWxQb2xpY3kuREVTVFJPWTtcbiAgICBjYXNlIFwiU05BUFNIT1RcIjpcbiAgICAgIHJldHVybiBSZW1vdmFsUG9saWN5LlNOQVBTSE9UO1xuICAgIGNhc2UgXCJSRVRBSU5cIjpcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIFJlbW92YWxQb2xpY3kuUkVUQUlOO1xuICB9XG59XG4iXX0=
|