@fjall/components-infrastructure 0.73.15 → 0.73.17

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 (47) hide show
  1. package/dist/lib/config/aws/ipamPoolId.js +1 -5
  2. package/dist/lib/patterns/aws/ec2.d.ts +43 -0
  3. package/dist/lib/patterns/aws/ec2.js +123 -0
  4. package/dist/lib/resources/aws/database/rdsAuroraGlobal.js +3 -3
  5. package/dist/lib/resources/aws/networking/ipamPool.js +3 -3
  6. package/dist/lib/utils/getCidr.d.ts +8 -0
  7. package/dist/lib/utils/getCidr.js +40 -0
  8. package/package.json +3 -3
  9. package/dist/lib/__tests__/patterns/__snapshots__/compute.test.js.snap +0 -433
  10. package/dist/lib/__tests__/patterns/compute.test.d.ts +0 -1
  11. package/dist/lib/__tests__/patterns/compute.test.js +0 -137
  12. package/dist/lib/__tests__/simple.test.d.ts +0 -0
  13. package/dist/lib/__tests__/simple.test.js +0 -12
  14. package/dist/lib/resources/aws/backup/backupPlan.d.ts +0 -24
  15. package/dist/lib/resources/aws/backup/backupPlan.js +0 -172
  16. package/dist/lib/resources/aws/backup/backupVault.d.ts +0 -19
  17. package/dist/lib/resources/aws/backup/backupVault.js +0 -44
  18. package/dist/lib/resources/aws/backup/index.d.ts +0 -2
  19. package/dist/lib/resources/aws/backup/index.js +0 -19
  20. package/dist/lib/resources/aws/organisations/account.d.ts +0 -37
  21. package/dist/lib/resources/aws/organisations/account.js +0 -220
  22. package/dist/lib/resources/aws/organisations/delegatedAdministrator.d.ts +0 -14
  23. package/dist/lib/resources/aws/organisations/delegatedAdministrator.js +0 -61
  24. package/dist/lib/resources/aws/organisations/index.d.ts +0 -8
  25. package/dist/lib/resources/aws/organisations/index.js +0 -22
  26. package/dist/lib/resources/aws/organisations/interfaces.d.ts +0 -105
  27. package/dist/lib/resources/aws/organisations/interfaces.js +0 -3
  28. package/dist/lib/resources/aws/organisations/organisation.d.ts +0 -47
  29. package/dist/lib/resources/aws/organisations/organisation.js +0 -263
  30. package/dist/lib/resources/aws/organisations/organisationalUnit.d.ts +0 -28
  31. package/dist/lib/resources/aws/organisations/organisationalUnit.js +0 -170
  32. package/dist/lib/resources/aws/organisations/policy.d.ts +0 -17
  33. package/dist/lib/resources/aws/organisations/policy.js +0 -93
  34. package/dist/lib/resources/aws/organisations/trustedServiceAccess.d.ts +0 -13
  35. package/dist/lib/resources/aws/organisations/trustedServiceAccess.js +0 -58
  36. package/dist/lib/resources/aws/organisations/types.d.ts +0 -165
  37. package/dist/lib/resources/aws/organisations/types.js +0 -36
  38. package/dist/lib/utils/directTagging.d.ts +0 -31
  39. package/dist/lib/utils/directTagging.js +0 -86
  40. package/dist/lib/utils/fjallConstruct.d.ts +0 -8
  41. package/dist/lib/utils/fjallConstruct.js +0 -18
  42. package/dist/lib/utils/fjallStackSynthesizer.d.ts +0 -9
  43. package/dist/lib/utils/fjallStackSynthesizer.js +0 -22
  44. package/dist/lib/utils/tagContext.d.ts +0 -28
  45. package/dist/lib/utils/tagContext.js +0 -53
  46. package/dist/lib/utils/tagSynthesizer.d.ts +0 -13
  47. package/dist/lib/utils/tagSynthesizer.js +0 -55
@@ -1,172 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.BackupPlan = void 0;
4
- const constructs_1 = require("constructs");
5
- const aws_cdk_lib_1 = require("aws-cdk-lib");
6
- const backup = require("aws-cdk-lib/aws-backup");
7
- const events = require("aws-cdk-lib/aws-events");
8
- const iam = require("aws-cdk-lib/aws-iam");
9
- class BackupPlan extends constructs_1.Construct {
10
- constructor(scope, id, props) {
11
- super(scope, id);
12
- const tagKey = props.tagKey || "fjall:disasterRecovery:tier";
13
- // Create backup plan with tier-specific rules
14
- this.plan = new backup.BackupPlan(this, `${id}Plan`, {
15
- backupPlanName: props.planName,
16
- backupVault: props.vault.vault,
17
- backupPlanRules: this.createBackupRules(props)
18
- });
19
- // Create tag-based selection
20
- this.selection = new backup.BackupSelection(this, `${id}Selection`, {
21
- backupPlan: this.plan,
22
- resources: [
23
- backup.BackupResource.fromTag(tagKey, props.tier)
24
- ],
25
- role: this.createBackupRole(props)
26
- });
27
- // Export plan ARN
28
- this.planArn = new aws_cdk_lib_1.CfnOutput(this, `${id}PlanArn`, {
29
- key: `${id}PlanArn`,
30
- value: this.plan.backupPlanArn,
31
- exportName: `BackupPlanArn-${props.planName}`
32
- });
33
- }
34
- createBackupRules(props) {
35
- const rules = [];
36
- switch (props.tier) {
37
- case "standard":
38
- // Daily backups, 90-day retention, no cold storage (not cost effective for short retention)
39
- rules.push(new backup.BackupPlanRule({
40
- ruleName: `${props.planName}-daily`,
41
- scheduleExpression: events.Schedule.cron({ hour: '2', minute: '0' }), // 2 AM daily
42
- deleteAfter: aws_cdk_lib_1.Duration.days(90),
43
- startWindow: aws_cdk_lib_1.Duration.minutes(60),
44
- completionWindow: aws_cdk_lib_1.Duration.hours(12)
45
- }));
46
- break;
47
- case "resilient":
48
- // Daily backups with continuous backup, 1-year retention, cross-region replication
49
- rules.push(new backup.BackupPlanRule({
50
- ruleName: `${props.planName}-daily`,
51
- scheduleExpression: events.Schedule.cron({ hour: '2', minute: '0' }), // 2 AM daily
52
- deleteAfter: aws_cdk_lib_1.Duration.days(365),
53
- moveToColdStorageAfter: aws_cdk_lib_1.Duration.days(90), // Minimum allowed
54
- enableContinuousBackup: true,
55
- startWindow: aws_cdk_lib_1.Duration.minutes(60),
56
- completionWindow: aws_cdk_lib_1.Duration.hours(12),
57
- copyActions: this.createCopyActions(props, aws_cdk_lib_1.Duration.days(365), aws_cdk_lib_1.Duration.days(90))
58
- }));
59
- break;
60
- case "enterprise":
61
- // Continuous backup (35-day max PITR window)
62
- rules.push(new backup.BackupPlanRule({
63
- ruleName: `${props.planName}-continuous`,
64
- scheduleExpression: events.Schedule.cron({ hour: '2', minute: '0' }), // Daily for continuous backup
65
- deleteAfter: aws_cdk_lib_1.Duration.days(35), // AWS max for continuous backup
66
- enableContinuousBackup: true,
67
- startWindow: aws_cdk_lib_1.Duration.minutes(60),
68
- completionWindow: aws_cdk_lib_1.Duration.hours(12),
69
- copyActions: this.createCopyActions(props, aws_cdk_lib_1.Duration.days(35), undefined)
70
- }));
71
- // Hourly snapshots for long-term compliance (7 years)
72
- rules.push(new backup.BackupPlanRule({
73
- ruleName: `${props.planName}-hourly-compliance`,
74
- scheduleExpression: events.Schedule.cron({ minute: '0' }), // Every hour
75
- deleteAfter: aws_cdk_lib_1.Duration.days(2555), // 7 years
76
- moveToColdStorageAfter: aws_cdk_lib_1.Duration.days(365), // Move to cold after 1 year
77
- startWindow: aws_cdk_lib_1.Duration.minutes(60),
78
- completionWindow: aws_cdk_lib_1.Duration.hours(2),
79
- copyActions: this.createCopyActions(props, aws_cdk_lib_1.Duration.days(2555), aws_cdk_lib_1.Duration.days(365))
80
- }));
81
- break;
82
- }
83
- return rules;
84
- }
85
- createCopyActions(props, deleteAfter, moveToColdStorageAfter) {
86
- const actions = [];
87
- // Cross-region replication (for resilient and enterprise)
88
- if (props.replicationVaultArn) {
89
- const actionProps = {
90
- destinationBackupVault: backup.BackupVault.fromBackupVaultArn(this, `${props.planName}ReplicationVaultRef`, props.replicationVaultArn),
91
- deleteAfter: deleteAfter,
92
- // Only add cold storage if specified and >= 90 days
93
- ...(moveToColdStorageAfter && moveToColdStorageAfter.toDays() >= 90
94
- ? { moveToColdStorageAfter: moveToColdStorageAfter }
95
- : {})
96
- };
97
- actions.push(actionProps);
98
- }
99
- // Cross-account DR vault (enterprise only)
100
- if (props.drVaultArn && props.drAccountId) {
101
- const actionProps = {
102
- destinationBackupVault: backup.BackupVault.fromBackupVaultArn(this, `${props.planName}DrVaultRef`, props.drVaultArn),
103
- deleteAfter: deleteAfter,
104
- // Only add cold storage if specified and >= 90 days
105
- ...(moveToColdStorageAfter && moveToColdStorageAfter.toDays() >= 90
106
- ? { moveToColdStorageAfter: moveToColdStorageAfter }
107
- : {})
108
- };
109
- actions.push(actionProps);
110
- }
111
- return actions.length > 0 ? actions : undefined;
112
- }
113
- createBackupRole(props) {
114
- const role = new iam.Role(this, `${props.planName}BackupRole`, {
115
- assumedBy: new iam.ServicePrincipal("backup.amazonaws.com"),
116
- description: `Backup role for ${props.planName} (${props.tier} tier)`,
117
- managedPolicies: [
118
- // Core backup policies
119
- iam.ManagedPolicy.fromAwsManagedPolicyName("service-role/AWSBackupServiceRolePolicyForBackup"),
120
- iam.ManagedPolicy.fromAwsManagedPolicyName("service-role/AWSBackupServiceRolePolicyForRestores"),
121
- // S3 backup support
122
- iam.ManagedPolicy.fromAwsManagedPolicyName("AWSBackupServiceRolePolicyForS3Backup"),
123
- iam.ManagedPolicy.fromAwsManagedPolicyName("AWSBackupServiceRolePolicyForS3Restore")
124
- ]
125
- });
126
- // Add RDS continuous backup permissions for resilient/enterprise tiers
127
- if (props.tier === "resilient" || props.tier === "enterprise") {
128
- role.addToPolicy(new iam.PolicyStatement({
129
- effect: iam.Effect.ALLOW,
130
- actions: [
131
- "rds:ModifyDBInstance",
132
- "rds:DescribeDBInstanceAutomatedBackups",
133
- "rds:RestoreDBInstanceToPointInTime",
134
- "rds:DescribeDBInstances",
135
- "rds:DescribeDBClusters",
136
- "rds:RestoreDBClusterToPointInTime"
137
- ],
138
- resources: ["*"]
139
- }));
140
- }
141
- // Add cross-account permissions if needed
142
- if (props.drAccountId) {
143
- role.addToPolicy(new iam.PolicyStatement({
144
- effect: iam.Effect.ALLOW,
145
- actions: [
146
- "backup:CopyIntoBackupVault",
147
- "backup:CopyFromBackupVault"
148
- ],
149
- resources: [`arn:aws:backup:*:${props.drAccountId}:backup-vault:*`]
150
- }));
151
- }
152
- // Add cross-region permissions if needed
153
- if (props.replicationVaultArn) {
154
- role.addToPolicy(new iam.PolicyStatement({
155
- effect: iam.Effect.ALLOW,
156
- actions: [
157
- "backup:CopyIntoBackupVault",
158
- "backup:CopyFromBackupVault"
159
- ],
160
- resources: [props.replicationVaultArn]
161
- }));
162
- }
163
- return role;
164
- }
165
- static build(id, props) {
166
- return (scope) => {
167
- return new BackupPlan(scope, id, props);
168
- };
169
- }
170
- }
171
- exports.BackupPlan = BackupPlan;
172
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFja3VwUGxhbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYi9yZXNvdXJjZXMvYXdzL2JhY2t1cC9iYWNrdXBQbGFuLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDJDQUF1QztBQUN2Qyw2Q0FBa0Q7QUFDbEQsaURBQWlEO0FBQ2pELGlEQUFpRDtBQUNqRCwyQ0FBMkM7QUFlM0MsTUFBYSxVQUFXLFNBQVEsc0JBQVM7SUFLdkMsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUFzQjtRQUM5RCxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWpCLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUFNLElBQUksNkJBQTZCLENBQUM7UUFFN0QsOENBQThDO1FBQzlDLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFO1lBQ25ELGNBQWMsRUFBRSxLQUFLLENBQUMsUUFBUTtZQUM5QixXQUFXLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFLO1lBQzlCLGVBQWUsRUFBRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDO1NBQy9DLENBQUMsQ0FBQztRQUVILDZCQUE2QjtRQUM3QixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksTUFBTSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLFdBQVcsRUFBRTtZQUNsRSxVQUFVLEVBQUUsSUFBSSxDQUFDLElBQUk7WUFDckIsU0FBUyxFQUFFO2dCQUNULE1BQU0sQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDO2FBQ2xEO1lBQ0QsSUFBSSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUM7U0FDbkMsQ0FBQyxDQUFDO1FBRUgsa0JBQWtCO1FBQ2xCLElBQUksQ0FB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NEI7b0JBQzVCLDRCQUE0QjtpQkFDN0I7Z0JBQ0QsU0FBUyxFQUFFLENBQUMsb0JBQW9CLEtBQUssQ0FBQyxXQUFXLGlCQUFpQixDQUFDO2FBQ3BFLENBQUMsQ0FBQyxDQUFDO1FBQ04sQ0FBQztRQUVELHlDQUF5QztRQUN6QyxJQUFJLEtBQUssQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1lBQzlCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxHQUFHLENBQUMsZUFBZSxDQUFDO2dCQUN2QyxNQUFNLEVBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLO2dCQUN4QixPQUFPLEVBQUU7b0JBQ1AsNEJBQTRCO29CQUM1Qiw0QkFBNEI7aUJBQzdCO2dCQUNELFNBQVMsRUFBRSxDQUFDLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQzthQUN2QyxDQUFDLENBQUMsQ0FBQztRQUNOLENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQVUsRUFBRSxLQUFzQjtRQUM3QyxPQUFPLENBQUMsS0FBZ0IsRUFBRSxFQUFFO1lBQzFCLE9BQU8sSUFBSSxVQUFVLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUMxQyxDQUFDLENBQUM7SUFDSixDQUFDO0NBQ0Y7QUEvTUQsZ0NBK01DIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB7IER1cmF0aW9uLCBDZm5PdXRwdXQgfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcbmltcG9ydCAqIGFzIGJhY2t1cCBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWJhY2t1cFwiO1xuaW1wb3J0ICogYXMgZXZlbnRzIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZXZlbnRzXCI7XG5pbXBvcnQgKiBhcyBpYW0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1pYW1cIjtcbmltcG9ydCB7IEJhY2t1cFZhdWx0IH0gZnJvbSBcIi4vYmFja3VwVmF1bHRcIjtcblxuZXhwb3J0IHR5cGUgQmFja3VwVGllciA9IFwic3RhbmRhcmRcIiB8IFwicmVzaWxpZW50XCIgfCBcImVudGVycHJpc2VcIjtcblxuZXhwb3J0IGludGVyZmFjZSBCYWNrdXBQbGFuUHJvcHMge1xuICBwbGFuTmFtZTogc3RyaW5nO1xuICB0aWVyOiBCYWNrdXBUaWVyO1xuICB2YXVsdDogQmFja3VwVmF1bHQ7XG4gIHJlcGxpY2F0aW9uVmF1bHRBcm4/OiBzdHJpbmc7ICAvLyBBUk4gb2YgdmF1bHQgaW4gZGlmZmVyZW50IHJlZ2lvblxuICBkclZhdWx0QXJuPzogc3RyaW5nOyAgICAgICAgICAgLy8gQVJOIG9mIHZhdWx0IGluIERSIGFjY291bnRcbiAgZHJBY2NvdW50SWQ/OiBzdHJpbmc7ICAgICAgICAgIC8vIERSIGFjY291bnQgSUQgZm9yIHBlcm1pc3Npb25zXG4gIHRhZ0tleT86IHN0cmluZzsgICAgICAgICAgICAgICAvLyBEZWZhdWx0OiBcImZqYWxsOmRpc2FzdGVyUmVjb3Zlcnk6dGllclwiXG59XG5cbmV4cG9ydCBjbGFzcyBCYWNrdXBQbGFuIGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgcHVibGljIHJlYWRvbmx5IHBsYW46IGJhY2t1cC5CYWNrdXBQbGFuO1xuICBwdWJsaWMgcmVhZG9ubHkgc2VsZWN0aW9uOiBiYWNrdXAuQmFja3VwU2VsZWN0aW9uO1xuICBwdWJsaWMgcmVhZG9ubHkgcGxhbkFybjogQ2ZuT3V0cHV0O1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBCYWNrdXBQbGFuUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgY29uc3QgdGFnS2V5ID0gcHJvcHMudGFnS2V5IHx8IFwiZmphbGw6ZGlzYXN0ZXJSZWNvdmVyeTp0aWVyXCI7XG5cbiAgICAvLyBDcmVhdGUgYmFja3VwIHBsYW4gd2l0aCB0aWVyLXNwZWNpZmljIHJ1bGVzXG4gICAgdGhpcy5wbGFuID0gbmV3IGJhY2t1cC5CYWNrdXBQbGFuKHRoaXMsIGAke2lkfVBsYW5gLCB7XG4gICAgICBiYWNrdXBQbGFuTmFtZTogcHJvcHMucGxhbk5hbWUsXG4gICAgICBiYWNrdXBWYXVsdDogcHJvcHMudmF1bHQudmF1bHQsXG4gICAgICBiYWNrdXBQbGFuUnVsZXM6IHRoaXMuY3JlYXRlQmFja3VwUnVsZXMocHJvcHMpXG4gICAgfSk7XG5cbiAgICAvLyBDcmVhdGUgdGFnLWJhc2VkIHNlbGVjdGlvblxuICAgIHRoaXMuc2VsZWN0aW9uID0gbmV3IGJhY2t1cC5CYWNrdXBTZWxlY3Rpb24odGhpcywgYCR7aWR9U2VsZWN0aW9uYCwge1xuICAgICAgYmFja3VwUGxhbjogdGhpcy5wbGFuLFxuICAgICAgcmVzb3VyY2VzOiBbXG4gICAgICAgIGJhY2t1cC5CYWNrdXBSZXNvdXJjZS5mcm9tVGFnKHRhZ0tleSwgcHJvcHMudGllcilcbiAgICAgIF0sXG4gICAgICByb2xlOiB0aGlzLmNyZWF0ZUJhY2t1cFJvbGUocHJvcHMpXG4gICAgfSk7XG5cbiAgICAvLyBFeHBvcnQgcGxhbiBBUk5cbiAgICB0aGlzLnBsYW5Bcm4gPSBuZXcgQ2ZuT3V0cHV0KHRoaXMsIGAke2lkfVBsYW5Bcm5gLCB7XG4gICAgICBrZXk6IGAke2lkfVBsYW5Bcm5gLFxuICAgICAgdmFsdWU6IHRoaXMucGxhbi5iYWNrdXBQbGFuQXJuLFxuICAgICAgZXhwb3J0TmFtZTogYEJhY2t1cFBsYW5Bcm4tJHtwcm9wcy5wbGFuTmFtZX1gXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUJhY2t1cFJ1bGVzKHByb3BzOiBCYWNrdXBQbGFuUHJvcHMpOiBiYWNrdXAuQmFja3VwUGxhblJ1bGVbXSB7XG4gICAgY29uc3QgcnVsZXM6IGJhY2t1cC5CYWNrdXBQbGFuUnVsZVtdID0gW107XG5cbiAgICBzd2l0Y2ggKHByb3BzLnRpZXIpIHtcbiAgICAgIGNhc2UgXCJzdGFuZGFyZFwiOlxuICAgICAgICAvLyBEYWlseSBiYWNrdXBzLCA5MC1kYXkgcmV0ZW50aW9uLCBubyBjb2xkIHN0b3JhZ2UgKG5vdCBjb3N0IGVmZmVjdGl2ZSBmb3Igc2hvcnQgcmV0ZW50aW9uKVxuICAgICAgICBydWxlcy5wdXNoKFxuICAgICAgICAgIG5ldyBiYWNrdXAuQmFja3VwUGxhblJ1bGUoe1xuICAgICAgICAgICAgcnVsZU5hbWU6IGAke3Byb3BzLnBsYW5OYW1lfS1kYWlseWAsXG4gICAgICAgICAgICBzY2hlZHVsZUV4cHJlc3Npb246IGV2ZW50cy5TY2hlZHVsZS5jcm9uKHsgaG91cjogJzInLCBtaW51dGU6ICcwJyB9KSwgLy8gMiBBTSBkYWlseVxuICAgICAgICAgICAgZGVsZXRlQWZ0ZXI6IER1cmF0aW9uLmRheXMoOTApLFxuICAgICAgICAgICAgc3RhcnRXaW5kb3c6IER1cmF0aW9uLm1pbnV0ZXMoNjApLFxuICAgICAgICAgICAgY29tcGxldGlvbldpbmRvdzogRHVyYXRpb24uaG91cnMoMTIpXG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgXCJyZXNpbGllbnRcIjpcbiAgICAgICAgLy8gRGFpbHkgYmFja3VwcyB3aXRoIGNvbnRpbnVvdXMgYmFja3VwLCAxLXllYXIgcmV0ZW50aW9uLCBjcm9zcy1yZWdpb24gcmVwbGljYXRpb25cbiAgICAgICAgcnVsZXMucHVzaChcbiAgICAgICAgICBuZXcgYmFja3VwLkJhY2t1cFBsYW5SdWxlKHtcbiAgICAgICAgICAgIHJ1bGVOYW1lOiBgJHtwcm9wcy5wbGFuTmFtZX0tZGFpbHlgLFxuICAgICAgICAgICAgc2NoZWR1bGVFeHByZXNzaW9uOiBldmVudHMuU2NoZWR1bGUuY3Jvbih7IGhvdXI6ICcyJywgbWludXRlOiAnMCcgfSksIC8vIDIgQU0gZGFpbHlcbiAgICAgICAgICAgIGRlbGV0ZUFmdGVyOiBEdXJhdGlvbi5kYXlzKDM2NSksXG4gICAgICAgICAgICBtb3ZlVG9Db2xkU3RvcmFnZUFmdGVyOiBEdXJhdGlvbi5kYXlzKDkwKSwgLy8gTWluaW11bSBhbGxvd2VkXG4gICAgICAgICAgICBlbmFibGVDb250aW51b3VzQmFja3VwOiB0cnVlLFxuICAgICAgICAgICAgc3RhcnRXaW5kb3c6IER1cmF0aW9uLm1pbnV0ZXMoNjApLFxuICAgICAgICAgICAgY29tcGxldGlvbldpbmRvdzogRHVyYXRpb24uaG91cnMoMTIpLFxuICAgICAgICAgICAgY29weUFjdGlvbnM6IHRoaXMuY3JlYXRlQ29weUFjdGlvbnMocHJvcHMsIER1cmF0aW9uLmRheXMoMzY1KSwgRHVyYXRpb24uZGF5cyg5MCkpXG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgXCJlbnRlcnByaXNlXCI6XG4gICAgICAgIC8vIENvbnRpbnVvdXMgYmFja3VwICgzNS1kYXkgbWF4IFBJVFIgd2luZG93KVxuICAgICAgICBydWxlcy5wdXNoKFxuICAgICAgICAgIG5ldyBiYWNrdXAuQmFja3VwUGxhblJ1bGUoe1xuICAgICAgICAgICAgcnVsZU5hbWU6IGAke3Byb3BzLnBsYW5OYW1lfS1jb250aW51b3VzYCxcbiAgICAgICAgICAgIHNjaGVkdWxlRXhwcmVzc2lvbjogZXZlbnRzLlNjaGVkdWxlLmNyb24oeyBob3VyOiAnMicsIG1pbnV0ZTogJzAnIH0pLCAvLyBEYWlseSBmb3IgY29udGludW91cyBiYWNrdXBcbiAgICAgICAgICAgIGRlbGV0ZUFmdGVyOiBEdXJhdGlvbi5kYXlzKDM1KSwgLy8gQVdTIG1heCBmb3IgY29udGludW91cyBiYWNrdXBcbiAgICAgICAgICAgIGVuYWJsZUNvbnRpbnVvdXNCYWNrdXA6IHRydWUsXG4gICAgICAgICAgICBzdGFydFdpbmRvdzogRHVyYXRpb24ubWludXRlcyg2MCksXG4gICAgICAgICAgICBjb21wbGV0aW9uV2luZG93OiBEdXJhdGlvbi5ob3VycygxMiksXG4gICAgICAgICAgICBjb3B5QWN0aW9uczogdGhpcy5jcmVhdGVDb3B5QWN0aW9ucyhwcm9wcywgRHVyYXRpb24uZGF5cygzNSksIHVuZGVmaW5lZClcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuXG4gICAgICAgIC8vIEhvdXJseSBzbmFwc2hvdHMgZm9yIGxvbmctdGVybSBjb21wbGlhbmNlICg3IHllYXJzKVxuICAgICAgICBydWxlcy5wdXNoKFxuICAgICAgICAgIG5ldyBiYWNrdXAuQmFja3VwUGxhblJ1bGUoe1xuICAgICAgICAgICAgcnVsZU5hbWU6IGAke3Byb3BzLnBsYW5OYW1lfS1ob3VybHktY29tcGxpYW5jZWAsXG4gICAgICAgICAgICBzY2hlZHVsZUV4cHJlc3Npb246IGV2ZW50cy5TY2hlZHVsZS5jcm9uKHsgbWludXRlOiAnMCcgfSksIC8vIEV2ZXJ5IGhvdXJcbiAgICAgICAgICAgIGRlbGV0ZUFmdGVyOiBEdXJhdGlvbi5kYXlzKDI1NTUpLCAvLyA3IHllYXJzXG4gICAgICAgICAgICBtb3ZlVG9Db2xkU3RvcmFnZUFmdGVyOiBEdXJhdGlvbi5kYXlzKDM2NSksIC8vIE1vdmUgdG8gY29sZCBhZnRlciAxIHllYXJcbiAgICAgICAgICAgIHN0YXJ0V2luZG93OiBEdXJhdGlvbi5taW51dGVzKDYwKSxcbiAgICAgICAgICAgIGNvbXBsZXRpb25XaW5kb3c6IER1cmF0aW9uLmhvdXJzKDIpLFxuICAgICAgICAgICAgY29weUFjdGlvbnM6IHRoaXMuY3JlYXRlQ29weUFjdGlvbnMocHJvcHMsIER1cmF0aW9uLmRheXMoMjU1NSksIER1cmF0aW9uLmRheXMoMzY1KSlcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICByZXR1cm4gcnVsZXM7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUNvcHlBY3Rpb25zKFxuICAgIHByb3BzOiBCYWNrdXBQbGFuUHJvcHMsXG4gICAgZGVsZXRlQWZ0ZXI6IER1cmF0aW9uLFxuICAgIG1vdmVUb0NvbGRTdG9yYWdlQWZ0ZXI/OiBEdXJhdGlvblxuICApOiBiYWNrdXAuQmFja3VwUGxhbkNvcHlBY3Rpb25Qcm9wc1tdIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBhY3Rpb25zOiBiYWNrdXAuQmFja3VwUGxhbkNvcHlBY3Rpb25Qcm9wc1tdID0gW107XG5cbiAgICAvLyBDcm9zcy1yZWdpb24gcmVwbGljYXRpb24gKGZvciByZXNpbGllbnQgYW5kIGVudGVycHJpc2UpXG4gICAgaWYgKHByb3BzLnJlcGxpY2F0aW9uVmF1bHRBcm4pIHtcbiAgICAgIGNvbnN0IGFjdGlvblByb3BzOiBiYWNrdXAuQmFja3VwUGxhbkNvcHlBY3Rpb25Qcm9wcyA9IHtcbiAgICAgICAgZGVzdGluYXRpb25CYWNrdXBWYXVsdDogYmFja3VwLkJhY2t1cFZhdWx0LmZyb21CYWNrdXBWYXVsdEFybihcbiAgICAgICAgICB0aGlzLFxuICAgICAgICAgIGAke3Byb3BzLnBsYW5OYW1lfVJlcGxpY2F0aW9uVmF1bHRSZWZgLFxuICAgICAgICAgIHByb3BzLnJlcGxpY2F0aW9uVmF1bHRBcm5cbiAgICAgICAgKSxcbiAgICAgICAgZGVsZXRlQWZ0ZXI6IGRlbGV0ZUFmdGVyLFxuICAgICAgICAvLyBPbmx5IGFkZCBjb2xkIHN0b3JhZ2UgaWYgc3BlY2lmaWVkIGFuZCA+PSA5MCBkYXlzXG4gICAgICAgIC4uLihtb3ZlVG9Db2xkU3RvcmFnZUFmdGVyICYmIG1vdmVUb0NvbGRTdG9yYWdlQWZ0ZXIudG9EYXlzKCkgPj0gOTBcbiAgICAgICAgICA/IHsgbW92ZVRvQ29sZFN0b3JhZ2VBZnRlcjogbW92ZVRvQ29sZFN0b3JhZ2VBZnRlciB9XG4gICAgICAgICAgOiB7fSlcbiAgICAgIH07XG5cbiAgICAgIGFjdGlvbnMucHVzaChhY3Rpb25Qcm9wcyk7XG4gICAgfVxuXG4gICAgLy8gQ3Jvc3MtYWNjb3VudCBEUiB2YXVsdCAoZW50ZXJwcmlzZSBvbmx5KVxuICAgIGlmIChwcm9wcy5kclZhdWx0QXJuICYmIHByb3BzLmRyQWNjb3VudElkKSB7XG4gICAgICBjb25zdCBhY3Rpb25Qcm9wczogYmFja3VwLkJhY2t1cFBsYW5Db3B5QWN0aW9uUHJvcHMgPSB7XG4gICAgICAgIGRlc3RpbmF0aW9uQmFja3VwVmF1bHQ6IGJhY2t1cC5CYWNrdXBWYXVsdC5mcm9tQmFja3VwVmF1bHRBcm4oXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICBgJHtwcm9wcy5wbGFuTmFtZX1EclZhdWx0UmVmYCxcbiAgICAgICAgICBwcm9wcy5kclZhdWx0QXJuXG4gICAgICAgICksXG4gICAgICAgIGRlbGV0ZUFmdGVyOiBkZWxldGVBZnRlcixcbiAgICAgICAgLy8gT25seSBhZGQgY29sZCBzdG9yYWdlIGlmIHNwZWNpZmllZCBhbmQgPj0gOTAgZGF5c1xuICAgICAgICAuLi4obW92ZVRvQ29sZFN0b3JhZ2VBZnRlciAmJiBtb3ZlVG9Db2xkU3RvcmFnZUFmdGVyLnRvRGF5cygpID49IDkwXG4gICAgICAgICAgPyB7IG1vdmVUb0NvbGRTdG9yYWdlQWZ0ZXI6IG1vdmVUb0NvbGRTdG9yYWdlQWZ0ZXIgfVxuICAgICAgICAgIDoge30pXG4gICAgICB9O1xuXG4gICAgICBhY3Rpb25zLnB1c2goYWN0aW9uUHJvcHMpO1xuICAgIH1cblxuICAgIHJldHVybiBhY3Rpb25zLmxlbmd0aCA+IDAgPyBhY3Rpb25zIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVCYWNrdXBSb2xlKHByb3BzOiBCYWNrdXBQbGFuUHJvcHMpOiBpYW0uUm9sZSB7XG4gICAgY29uc3Qgcm9sZSA9IG5ldyBpYW0uUm9sZSh0aGlzLCBgJHtwcm9wcy5wbGFuTmFtZX1CYWNrdXBSb2xlYCwge1xuICAgICAgYXNzdW1lZEJ5OiBuZXcgaWFtLlNlcnZpY2VQcmluY2lwYWwoXCJiYWNrdXAuYW1hem9uYXdzLmNvbVwiKSxcbiAgICAgIGRlc2NyaXB0aW9uOiBgQmFja3VwIHJvbGUgZm9yICR7cHJvcHMucGxhbk5hbWV9ICgke3Byb3BzLnRpZXJ9IHRpZXIpYCxcbiAgICAgIG1hbmFnZWRQb2xpY2llczogW1xuICAgICAgICAvLyBDb3JlIGJhY2t1cCBwb2xpY2llc1xuICAgICAgICBpYW0uTWFuYWdlZFBvbGljeS5mcm9tQXdzTWFuYWdlZFBvbGljeU5hbWUoXCJzZXJ2aWNlLXJvbGUvQVdTQmFja3VwU2VydmljZVJvbGVQb2xpY3lGb3JCYWNrdXBcIiksXG4gICAgICAgIGlhbS5NYW5hZ2VkUG9saWN5LmZyb21Bd3NNYW5hZ2VkUG9saWN5TmFtZShcInNlcnZpY2Utcm9sZS9BV1NCYWNrdXBTZXJ2aWNlUm9sZVBvbGljeUZvclJlc3RvcmVzXCIpLFxuICAgICAgICAvLyBTMyBiYWNrdXAgc3VwcG9ydFxuICAgICAgICBpYW0uTWFuYWdlZFBvbGljeS5mcm9tQXdzTWFuYWdlZFBvbGljeU5hbWUoXCJBV1NCYWNrdXBTZXJ2aWNlUm9sZVBvbGljeUZvclMzQmFja3VwXCIpLFxuICAgICAgICBpYW0uTWFuYWdlZFBvbGljeS5mcm9tQXdzTWFuYWdlZFBvbGljeU5hbWUoXCJBV1NCYWNrdXBTZXJ2aWNlUm9sZVBvbGljeUZvclMzUmVzdG9yZVwiKVxuICAgICAgXVxuICAgIH0pO1xuXG4gICAgLy8gQWRkIFJEUyBjb250aW51b3VzIGJhY2t1cCBwZXJtaXNzaW9ucyBmb3IgcmVzaWxpZW50L2VudGVycHJpc2UgdGllcnNcbiAgICBpZiAocHJvcHMudGllciA9PT0gXCJyZXNpbGllbnRcIiB8fCBwcm9wcy50aWVyID09PSBcImVudGVycHJpc2VcIikge1xuICAgICAgcm9sZS5hZGRUb1BvbGljeShuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgIGVmZmVjdDogaWFtLkVmZmVjdC5BTExPVyxcbiAgICAgICAgYWN0aW9uczogW1xuICAgICAgICAgIFwicmRzOk1vZGlmeURCSW5zdGFuY2VcIixcbiAgICAgICAgICBcInJkczpEZXNjcmliZURCSW5zdGFuY2VBdXRvbWF0ZWRCYWNrdXBzXCIsXG4gICAgICAgICAgXCJyZHM6UmVzdG9yZURCSW5zdGFuY2VUb1BvaW50SW5UaW1lXCIsXG4gICAgICAgICAgXCJyZHM6RGVzY3JpYmVEQkluc3RhbmNlc1wiLFxuICAgICAgICAgIFwicmRzOkRlc2NyaWJlREJDbHVzdGVyc1wiLFxuICAgICAgICAgIFwicmRzOlJlc3RvcmVEQkNsdXN0ZXJUb1BvaW50SW5UaW1lXCJcbiAgICAgICAgXSxcbiAgICAgICAgcmVzb3VyY2VzOiBbXCIqXCJdXG4gICAgICB9KSk7XG4gICAgfVxuXG4gICAgLy8gQWRkIGNyb3NzLWFjY291bnQgcGVybWlzc2lvbnMgaWYgbmVlZGVkXG4gICAgaWYgKHByb3BzLmRyQWNjb3VudElkKSB7XG4gICAgICByb2xlLmFkZFRvUG9saWN5KG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgZWZmZWN0OiBpYW0uRWZmZWN0LkFMTE9XLFxuICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAgXCJiYWNrdXA6Q29weUludG9CYWNrdXBWYXVsdFwiLFxuICAgICAgICAgIFwiYmFja3VwOkNvcHlGcm9tQmFja3VwVmF1bHRcIlxuICAgICAgICBdLFxuICAgICAgICByZXNvdXJjZXM6IFtgYXJuOmF3czpiYWNrdXA6Kjoke3Byb3BzLmRyQWNjb3VudElkfTpiYWNrdXAtdmF1bHQ6KmBdXG4gICAgICB9KSk7XG4gICAgfVxuXG4gICAgLy8gQWRkIGNyb3NzLXJlZ2lvbiBwZXJtaXNzaW9ucyBpZiBuZWVkZWRcbiAgICBpZiAocHJvcHMucmVwbGljYXRpb25WYXVsdEFybikge1xuICAgICAgcm9sZS5hZGRUb1BvbGljeShuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgIGVmZmVjdDogaWFtLkVmZmVjdC5BTExPVyxcbiAgICAgICAgYWN0aW9uczogW1xuICAgICAgICAgIFwiYmFja3VwOkNvcHlJbnRvQmFja3VwVmF1bHRcIixcbiAgICAgICAgICBcImJhY2t1cDpDb3B5RnJvbUJhY2t1cFZhdWx0XCJcbiAgICAgICAgXSxcbiAgICAgICAgcmVzb3VyY2VzOiBbcHJvcHMucmVwbGljYXRpb25WYXVsdEFybl1cbiAgICAgIH0pKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcm9sZTtcbiAgfVxuXG4gIHN0YXRpYyBidWlsZChpZDogc3RyaW5nLCBwcm9wczogQmFja3VwUGxhblByb3BzKSB7XG4gICAgcmV0dXJuIChzY29wZTogQ29uc3RydWN0KSA9PiB7XG4gICAgICByZXR1cm4gbmV3IEJhY2t1cFBsYW4oc2NvcGUsIGlkLCBwcm9wcyk7XG4gICAgfTtcbiAgfVxufVxuIl19
@@ -1,19 +0,0 @@
1
- import { Construct } from "constructs";
2
- import { CfnOutput, RemovalPolicy } from "aws-cdk-lib";
3
- import * as backup from "aws-cdk-lib/aws-backup";
4
- import * as iam from "aws-cdk-lib/aws-iam";
5
- import { CustomerManagedKey } from "../secrets/kms";
6
- export interface BackupVaultProps {
7
- vaultName: string;
8
- encryptionKey?: CustomerManagedKey;
9
- accessPolicy?: iam.PolicyDocument;
10
- lockConfiguration?: backup.LockConfiguration;
11
- removalPolicy?: RemovalPolicy;
12
- }
13
- export declare class BackupVault extends Construct {
14
- readonly vault: backup.BackupVault;
15
- readonly vaultArn: CfnOutput;
16
- readonly vaultName: CfnOutput;
17
- constructor(scope: Construct, id: string, props: BackupVaultProps);
18
- static build(id: string, props: BackupVaultProps): (scope: Construct) => BackupVault;
19
- }
@@ -1,44 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.BackupVault = void 0;
4
- const constructs_1 = require("constructs");
5
- const aws_cdk_lib_1 = require("aws-cdk-lib");
6
- const backup = require("aws-cdk-lib/aws-backup");
7
- const kms_1 = require("../secrets/kms");
8
- class BackupVault extends constructs_1.Construct {
9
- constructor(scope, id, props) {
10
- super(scope, id);
11
- // Create or use existing KMS key following existing pattern
12
- const encryptionKey = props.encryptionKey || new kms_1.CustomerManagedKey(this, `${id}Key`, {
13
- description: `Encryption key for backup vault ${props.vaultName}`,
14
- aliasName: `alias/${props.vaultName}-key`
15
- });
16
- // Create backup vault with CDK L2 construct
17
- this.vault = new backup.BackupVault(this, `${id}Vault`, {
18
- backupVaultName: props.vaultName,
19
- encryptionKey: encryptionKey.key,
20
- accessPolicy: props.accessPolicy,
21
- lockConfiguration: props.lockConfiguration,
22
- removalPolicy: props.removalPolicy || aws_cdk_lib_1.RemovalPolicy.RETAIN
23
- });
24
- // Export vault details following existing CfnOutput pattern
25
- this.vaultArn = new aws_cdk_lib_1.CfnOutput(this, `${id}VaultArn`, {
26
- key: `${id}VaultArn`,
27
- value: this.vault.backupVaultArn,
28
- exportName: `BackupVaultArn-${props.vaultName}`
29
- });
30
- this.vaultName = new aws_cdk_lib_1.CfnOutput(this, `${id}VaultName`, {
31
- key: `${id}VaultName`,
32
- value: this.vault.backupVaultName,
33
- exportName: `BackupVaultName-${props.vaultName}`
34
- });
35
- }
36
- // Factory method following existing patterns
37
- static build(id, props) {
38
- return (scope) => {
39
- return new BackupVault(scope, id, props);
40
- };
41
- }
42
- }
43
- exports.BackupVault = BackupVault;
44
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFja3VwVmF1bHQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWIvcmVzb3VyY2VzL2F3cy9iYWNrdXAvYmFja3VwVmF1bHQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsMkNBQXVDO0FBQ3ZDLDZDQUF1RDtBQUN2RCxpREFBaUQ7QUFFakQsd0NBQW9EO0FBVXBELE1BQWEsV0FBWSxTQUFRLHNCQUFTO0lBS3hDLFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBdUI7UUFDL0QsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQiw0REFBNEQ7UUFDNUQsTUFBTSxhQUFhLEdBQUcsS0FBSyxDQUFDLGFBQWEsSUFBSSxJQUFJLHdCQUFrQixDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFO1lBQ3BGLFdBQVcsRUFBRSxtQ0FBbUMsS0FBSyxDQUFDLFNBQVMsRUFBRTtZQUNqRSxTQUFTLEVBQUUsU0FBUyxLQUFLLENBQUMsU0FBUyxNQUFNO1NBQzFDLENBQUMsQ0FBQztRQUVILDRDQUE0QztRQUM1QyxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksTUFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRTtZQUN0RCxlQUFlLEVBQUUsS0FBSyxDQUFDLFNBQVM7WUFDaEMsYUFBYSxFQUFFLGFBQWEsQ0FBQyxHQUFHO1lBQ2hDLFlBQVksRUFBRSxLQUFLLENBQUMsWUFBWTtZQUNoQyxpQkFBaUIsRUFBRSxLQUFLLENBQUMsaUJBQWlCO1lBQzFDLGFBQWEsRUFBRSxLQUFLLENBQUMsYUFBYSxJQUFJLDJCQUFhLENBQUMsTUFBTTtTQUMzRCxDQUFDLENBQUM7UUFFSCw0REFBNEQ7UUFDNUQsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLHVCQUFTLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxVQUFVLEVBQUU7WUFDbkQsR0FBRyxFQUFFLEdBQUcsRUFBRSxVQUFVO1lBQ3BCLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWM7WUFDaEMsVUFBVSxFQUFFLGtCQUFrQixLQUFLLENBQUMsU0FBUyxFQUFFO1NBQ2hELENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSx1QkFBUyxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFO1lBQ3JELEdBQUcsRUFBRSxHQUFHLEVBQUUsV0FBVztZQUNyQixLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlO1lBQ2pDLFVBQVUsRUFBRSxtQkFBbUIsS0FBSyxDQUFDLFNBQVMsRUFBRTtTQUNqRCxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsNkNBQTZDO0lBQzdDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBVSxFQUFFLEtBQXVCO1FBQzlDLE9BQU8sQ0FBQyxLQUFnQixFQUFFLEVBQUU7WUFDMUIsT0FBTyxJQUFJLFdBQVcsQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzNDLENBQUMsQ0FBQztJQUNKLENBQUM7Q0FDRjtBQTNDRCxrQ0EyQ0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuaW1wb3J0IHsgQ2ZuT3V0cHV0LCBSZW1vdmFsUG9saWN5IH0gZnJvbSBcImF3cy1jZGstbGliXCI7XG5pbXBvcnQgKiBhcyBiYWNrdXAgZnJvbSBcImF3cy1jZGstbGliL2F3cy1iYWNrdXBcIjtcbmltcG9ydCAqIGFzIGlhbSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWlhbVwiO1xuaW1wb3J0IHsgQ3VzdG9tZXJNYW5hZ2VkS2V5IH0gZnJvbSBcIi4uL3NlY3JldHMva21zXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQmFja3VwVmF1bHRQcm9wcyB7XG4gIHZhdWx0TmFtZTogc3RyaW5nO1xuICBlbmNyeXB0aW9uS2V5PzogQ3VzdG9tZXJNYW5hZ2VkS2V5O1xuICBhY2Nlc3NQb2xpY3k/OiBpYW0uUG9saWN5RG9jdW1lbnQ7XG4gIGxvY2tDb25maWd1cmF0aW9uPzogYmFja3VwLkxvY2tDb25maWd1cmF0aW9uO1xuICByZW1vdmFsUG9saWN5PzogUmVtb3ZhbFBvbGljeTtcbn1cblxuZXhwb3J0IGNsYXNzIEJhY2t1cFZhdWx0IGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgcHVibGljIHJlYWRvbmx5IHZhdWx0OiBiYWNrdXAuQmFja3VwVmF1bHQ7XG4gIHB1YmxpYyByZWFkb25seSB2YXVsdEFybjogQ2ZuT3V0cHV0O1xuICBwdWJsaWMgcmVhZG9ubHkgdmF1bHROYW1lOiBDZm5PdXRwdXQ7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IEJhY2t1cFZhdWx0UHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgLy8gQ3JlYXRlIG9yIHVzZSBleGlzdGluZyBLTVMga2V5IGZvbGxvd2luZyBleGlzdGluZyBwYXR0ZXJuXG4gICAgY29uc3QgZW5jcnlwdGlvbktleSA9IHByb3BzLmVuY3J5cHRpb25LZXkgfHwgbmV3IEN1c3RvbWVyTWFuYWdlZEtleSh0aGlzLCBgJHtpZH1LZXlgLCB7XG4gICAgICBkZXNjcmlwdGlvbjogYEVuY3J5cHRpb24ga2V5IGZvciBiYWNrdXAgdmF1bHQgJHtwcm9wcy52YXVsdE5hbWV9YCxcbiAgICAgIGFsaWFzTmFtZTogYGFsaWFzLyR7cHJvcHMudmF1bHROYW1lfS1rZXlgXG4gICAgfSk7XG5cbiAgICAvLyBDcmVhdGUgYmFja3VwIHZhdWx0IHdpdGggQ0RLIEwyIGNvbnN0cnVjdFxuICAgIHRoaXMudmF1bHQgPSBuZXcgYmFja3VwLkJhY2t1cFZhdWx0KHRoaXMsIGAke2lkfVZhdWx0YCwge1xuICAgICAgYmFja3VwVmF1bHROYW1lOiBwcm9wcy52YXVsdE5hbWUsXG4gICAgICBlbmNyeXB0aW9uS2V5OiBlbmNyeXB0aW9uS2V5LmtleSxcbiAgICAgIGFjY2Vzc1BvbGljeTogcHJvcHMuYWNjZXNzUG9saWN5LFxuICAgICAgbG9ja0NvbmZpZ3VyYXRpb246IHByb3BzLmxvY2tDb25maWd1cmF0aW9uLFxuICAgICAgcmVtb3ZhbFBvbGljeTogcHJvcHMucmVtb3ZhbFBvbGljeSB8fCBSZW1vdmFsUG9saWN5LlJFVEFJTlxuICAgIH0pO1xuXG4gICAgLy8gRXhwb3J0IHZhdWx0IGRldGFpbHMgZm9sbG93aW5nIGV4aXN0aW5nIENmbk91dHB1dCBwYXR0ZXJuXG4gICAgdGhpcy52YXVsdEFybiA9IG5ldyBDZm5PdXRwdXQodGhpcywgYCR7aWR9VmF1bHRBcm5gLCB7XG4gICAgICBrZXk6IGAke2lkfVZhdWx0QXJuYCxcbiAgICAgIHZhbHVlOiB0aGlzLnZhdWx0LmJhY2t1cFZhdWx0QXJuLFxuICAgICAgZXhwb3J0TmFtZTogYEJhY2t1cFZhdWx0QXJuLSR7cHJvcHMudmF1bHROYW1lfWBcbiAgICB9KTtcblxuICAgIHRoaXMudmF1bHROYW1lID0gbmV3IENmbk91dHB1dCh0aGlzLCBgJHtpZH1WYXVsdE5hbWVgLCB7XG4gICAgICBrZXk6IGAke2lkfVZhdWx0TmFtZWAsXG4gICAgICB2YWx1ZTogdGhpcy52YXVsdC5iYWNrdXBWYXVsdE5hbWUsXG4gICAgICBleHBvcnROYW1lOiBgQmFja3VwVmF1bHROYW1lLSR7cHJvcHMudmF1bHROYW1lfWBcbiAgICB9KTtcbiAgfVxuXG4gIC8vIEZhY3RvcnkgbWV0aG9kIGZvbGxvd2luZyBleGlzdGluZyBwYXR0ZXJuc1xuICBzdGF0aWMgYnVpbGQoaWQ6IHN0cmluZywgcHJvcHM6IEJhY2t1cFZhdWx0UHJvcHMpIHtcbiAgICByZXR1cm4gKHNjb3BlOiBDb25zdHJ1Y3QpID0+IHtcbiAgICAgIHJldHVybiBuZXcgQmFja3VwVmF1bHQoc2NvcGUsIGlkLCBwcm9wcyk7XG4gICAgfTtcbiAgfVxufVxuIl19
@@ -1,2 +0,0 @@
1
- export * from "./backupVault";
2
- export * from "./backupPlan";
@@ -1,19 +0,0 @@
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("./backupVault"), exports);
18
- __exportStar(require("./backupPlan"), exports);
19
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWIvcmVzb3VyY2VzL2F3cy9iYWNrdXAvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLGdEQUE4QjtBQUM5QiwrQ0FBNkIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tIFwiLi9iYWNrdXBWYXVsdFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vYmFja3VwUGxhblwiO1xuIl19
@@ -1,37 +0,0 @@
1
- import { Construct } from "constructs";
2
- import { IAccount, IPolicy } from "./interfaces";
3
- import { AccountProps } from "./types";
4
- /**
5
- * AWS Account construct for managing member accounts
6
- */
7
- export declare class Account extends Construct implements IAccount {
8
- readonly accountId: string;
9
- readonly accountArn: string;
10
- readonly accountName: string;
11
- readonly email: string;
12
- constructor(scope: Construct, id: string, props: AccountProps);
13
- /**
14
- * Attach policy to this account
15
- */
16
- attachPolicy(policy: IPolicy): void;
17
- /**
18
- * Delegate administrator privileges for a service
19
- */
20
- delegateAdministrator(servicePrincipal: string): void;
21
- /**
22
- * Helper to normalize account names for construct IDs
23
- */
24
- private normalizeAccountName;
25
- /**
26
- * Helper to normalize policy names for construct IDs
27
- */
28
- private normalizePolicyName;
29
- /**
30
- * Helper to normalize service names for construct IDs
31
- */
32
- private normalizeServiceName;
33
- /**
34
- * Get the root ID (placeholder - would need custom logic to get this)
35
- */
36
- private getRootId;
37
- }
@@ -1,220 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.Account = void 0;
4
- const aws_cdk_lib_1 = require("aws-cdk-lib");
5
- const customResources = require("aws-cdk-lib/custom-resources");
6
- const aws_iam_1 = require("aws-cdk-lib/aws-iam");
7
- const constructs_1 = require("constructs");
8
- const types_1 = require("./types");
9
- const awsCustomResource_1 = require("../utilities/awsCustomResource");
10
- /**
11
- * AWS Account construct for managing member accounts
12
- */
13
- class Account extends constructs_1.Construct {
14
- constructor(scope, id, props) {
15
- super(scope, id);
16
- this.accountName = props.accountName;
17
- this.email = props.email;
18
- const importOnDuplicate = props.importOnDuplicate ?? true;
19
- const removalPolicy = props.removalPolicy ?? aws_cdk_lib_1.RemovalPolicy.RETAIN;
20
- const iamUserAccessToBilling = props.iamUserAccessToBilling ?? types_1.IamUserAccessToBilling.ALLOW;
21
- const roleName = props.roleName ?? "OrganisationAccountAccessRole";
22
- // Create account
23
- const accountResource = new awsCustomResource_1.AwsCustomResource(this, "AccountResource", {
24
- functionName: `manageAccount${this.normalizeAccountName(props.accountName)}`,
25
- onCreate: {
26
- service: "organizations",
27
- action: "CreateAccountCommand",
28
- parameters: {
29
- Email: props.email,
30
- AccountName: props.accountName,
31
- RoleName: roleName,
32
- IamUserAccessToBilling: iamUserAccessToBilling
33
- },
34
- physicalResourceId: customResources.PhysicalResourceId.of(`account-${props.email}`),
35
- ignoreErrorCodesMatching: importOnDuplicate
36
- ? "FinalizingOrganizationException|AlreadyInOrganizationException"
37
- : undefined
38
- },
39
- onUpdate: {
40
- service: "organizations",
41
- action: "DescribeAccountCommand",
42
- parameters: {
43
- AccountId: this.accountId
44
- },
45
- physicalResourceId: customResources.PhysicalResourceId.of(`account-${props.email}`)
46
- },
47
- onDelete: removalPolicy === aws_cdk_lib_1.RemovalPolicy.DESTROY
48
- ? {
49
- service: "organizations",
50
- action: "CloseAccountCommand",
51
- parameters: {
52
- AccountId: this.accountId
53
- }
54
- }
55
- : undefined,
56
- resourceType: "Custom::Account",
57
- policy: customResources.AwsCustomResourcePolicy.fromStatements([
58
- new aws_iam_1.PolicyStatement({
59
- actions: [
60
- "organizations:CreateAccount",
61
- "organizations:DescribeAccount",
62
- "organizations:CloseAccount",
63
- "organizations:ListAccounts",
64
- "organizations:MoveAccount"
65
- ],
66
- resources: ["*"],
67
- effect: aws_iam_1.Effect.ALLOW
68
- })
69
- ])
70
- });
71
- // Get account details from the create operation
72
- this.accountId = accountResource.getResponseField("CreateAccountStatus.AccountId");
73
- this.accountArn = `arn:aws:organizations::${this.node.tryGetContext("account")}:account/o-${this.node.tryGetContext("organisationId")}/${this.accountId}`;
74
- // Move account to the specified parent OU (if not root)
75
- if (props.parent.organisationalUnitName !== "Root") {
76
- new awsCustomResource_1.AwsCustomResource(this, "MoveAccount", {
77
- functionName: `moveAccount${this.normalizeAccountName(props.accountName)}`,
78
- onCreate: {
79
- service: "organizations",
80
- action: "MoveAccountCommand",
81
- parameters: {
82
- AccountId: this.accountId,
83
- SourceParentId: this.getRootId(),
84
- DestinationParentId: props.parent.organisationalUnitId
85
- },
86
- physicalResourceId: customResources.PhysicalResourceId.of(`move-account-${this.accountId}-to-${props.parent.organisationalUnitId}`)
87
- },
88
- resourceType: "Custom::MoveAccount",
89
- policy: customResources.AwsCustomResourcePolicy.fromStatements([
90
- new aws_iam_1.PolicyStatement({
91
- actions: ["organizations:MoveAccount", "organizations:ListRoots"],
92
- resources: ["*"],
93
- effect: aws_iam_1.Effect.ALLOW
94
- })
95
- ])
96
- });
97
- }
98
- // Export account details
99
- new aws_cdk_lib_1.CfnOutput(this, "AccountId", {
100
- key: `${id}Id`,
101
- value: this.accountId,
102
- exportName: `${id}Id`
103
- });
104
- new aws_cdk_lib_1.CfnOutput(this, "AccountArn", {
105
- key: `${id}Arn`,
106
- value: this.accountArn,
107
- exportName: `${id}Arn`
108
- });
109
- }
110
- /**
111
- * Attach policy to this account
112
- */
113
- attachPolicy(policy) {
114
- const policyName = this.normalizePolicyName(policy.policyName);
115
- new awsCustomResource_1.AwsCustomResource(this, `AttachPolicy${policyName}`, {
116
- functionName: `attachPolicyToAccount${policyName}${this.normalizeAccountName(this.accountName)}`,
117
- onCreate: {
118
- service: "organizations",
119
- action: "AttachPolicyCommand",
120
- parameters: {
121
- PolicyId: policy.policyId,
122
- TargetId: this.accountId
123
- },
124
- physicalResourceId: customResources.PhysicalResourceId.of(`attach-policy-${policy.policyId}-to-${this.accountId}`)
125
- },
126
- onDelete: {
127
- service: "organizations",
128
- action: "DetachPolicyCommand",
129
- parameters: {
130
- PolicyId: policy.policyId,
131
- TargetId: this.accountId
132
- }
133
- },
134
- resourceType: "Custom::AttachPolicyToAccount",
135
- policy: customResources.AwsCustomResourcePolicy.fromStatements([
136
- new aws_iam_1.PolicyStatement({
137
- actions: [
138
- "organizations:AttachPolicy",
139
- "organizations:DetachPolicy",
140
- "organizations:ListPoliciesForTarget"
141
- ],
142
- resources: ["*"],
143
- effect: aws_iam_1.Effect.ALLOW
144
- })
145
- ])
146
- });
147
- }
148
- /**
149
- * Delegate administrator privileges for a service
150
- */
151
- delegateAdministrator(servicePrincipal) {
152
- const serviceName = this.normalizeServiceName(servicePrincipal);
153
- new awsCustomResource_1.AwsCustomResource(this, `DelegateAdmin${serviceName}`, {
154
- functionName: `delegateAdmin${serviceName}${this.normalizeAccountName(this.accountName)}`,
155
- onCreate: {
156
- service: "organizations",
157
- action: "RegisterDelegatedAdministratorCommand",
158
- parameters: {
159
- AccountId: this.accountId,
160
- ServicePrincipal: servicePrincipal
161
- },
162
- physicalResourceId: customResources.PhysicalResourceId.of(`delegate-admin-${servicePrincipal}-to-${this.accountId}`)
163
- },
164
- onDelete: {
165
- service: "organizations",
166
- action: "DeregisterDelegatedAdministratorCommand",
167
- parameters: {
168
- AccountId: this.accountId,
169
- ServicePrincipal: servicePrincipal
170
- }
171
- },
172
- resourceType: "Custom::DelegateAdministrator",
173
- policy: customResources.AwsCustomResourcePolicy.fromStatements([
174
- new aws_iam_1.PolicyStatement({
175
- actions: [
176
- "organizations:RegisterDelegatedAdministrator",
177
- "organizations:DeregisterDelegatedAdministrator",
178
- "organizations:ListDelegatedAdministrators"
179
- ],
180
- resources: ["*"],
181
- effect: aws_iam_1.Effect.ALLOW
182
- })
183
- ])
184
- });
185
- }
186
- /**
187
- * Helper to normalize account names for construct IDs
188
- */
189
- normalizeAccountName(accountName) {
190
- return accountName
191
- .replace(/[^a-zA-Z0-9]/g, "")
192
- .replace(/^([a-z])/, (match) => match.toUpperCase());
193
- }
194
- /**
195
- * Helper to normalize policy names for construct IDs
196
- */
197
- normalizePolicyName(policyName) {
198
- return policyName
199
- .replace(/[^a-zA-Z0-9]/g, "")
200
- .replace(/^([a-z])/, (match) => match.toUpperCase());
201
- }
202
- /**
203
- * Helper to normalize service names for construct IDs
204
- */
205
- normalizeServiceName(servicePrincipal) {
206
- return servicePrincipal
207
- .replace(/[^a-zA-Z0-9]/g, "")
208
- .replace(/^([a-z])/, (match) => match.toUpperCase());
209
- }
210
- /**
211
- * Get the root ID (placeholder - would need custom logic to get this)
212
- */
213
- getRootId() {
214
- // This would need to be implemented with a custom resource to get the root ID
215
- // For now, using a placeholder
216
- return this.node.tryGetContext("organisationRootId") || "r-placeholder";
217
- }
218
- }
219
- exports.Account = Account;
220
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNjb3VudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYi9yZXNvdXJjZXMvYXdzL29yZ2FuaXNhdGlvbnMvYWNjb3VudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw2Q0FBdUQ7QUFDdkQsZ0VBQWdFO0FBQ2hFLGlEQUE4RDtBQUM5RCwyQ0FBdUM7QUFFdkMsbUNBQStEO0FBQy9ELHNFQUFtRTtBQUVuRTs7R0FFRztBQUNILE1BQWEsT0FBUSxTQUFRLHNCQUFTO0lBTXBDLFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBbUI7UUFDM0QsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQixJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQyxXQUFXLENBQUM7UUFDckMsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDO1FBQ3pCLE1BQU0saUJBQWlCLEdBQUcsS0FBSyxDQUFDLGlCQUFpQixJQUFJLElBQUksQ0FBQztRQUMxRCxNQUFNLGFBQWEsR0FBRyxLQUFLLENBQUMsYUFBYSxJQUFJLDJCQUFhLENBQUMsTUFBTSxDQUFDO1FBQ2xFLE1BQU0sc0JBQXNCLEdBQzFCLEtBQUssQ0FBQyxzQkFBc0IsSUFBSSw4QkFBc0IsQ0FBQyxLQUFLLENBQUM7UUFDL0QsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLFFBQVEsSUFBSSwrQkFBK0IsQ0FBQztRQUVuRSxpQkFBaUI7UUFDakIsTUFBTSxlQUFlLEdBQUcsSUFBSSxxQ0FBaUIsQ0FBQyxJQUFJLEVBQUUsaUJBQWlCLEVBQUU7WUFDckUsWUFBWSxFQUFFLGdCQUFnQixJQUFJLENBQUMsb0JBQW9CLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxFQUFFO1lBQzVFLFFBQVEsRUFBRTtnQkFDUixPQUFPLEVBQUUsZUFBZTtnQkFDeEIsTUFBTSxFQUFFLHNCQUFzQjtnQkFDOUIsVUFBVSxFQUFFO29CQUNWLEtB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TyxDQUFDLFVBQVUsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7SUFDekQsQ0FBQztJQUVEOztPQUVHO0lBQ0ssU0FBUztRQUNmLDhFQUE4RTtRQUM5RSwrQkFBK0I7UUFDL0IsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLGVBQWUsQ0FBQztJQUMxRSxDQUFDO0NBQ0Y7QUE5T0QsMEJBOE9DIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2ZuT3V0cHV0LCBSZW1vdmFsUG9saWN5IH0gZnJvbSBcImF3cy1jZGstbGliXCI7XG5pbXBvcnQgKiBhcyBjdXN0b21SZXNvdXJjZXMgZnJvbSBcImF3cy1jZGstbGliL2N1c3RvbS1yZXNvdXJjZXNcIjtcbmltcG9ydCB7IEVmZmVjdCwgUG9saWN5U3RhdGVtZW50IH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1pYW1cIjtcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQgeyBJQWNjb3VudCwgSVBvbGljeSB9IGZyb20gXCIuL2ludGVyZmFjZXNcIjtcbmltcG9ydCB7IEFjY291bnRQcm9wcywgSWFtVXNlckFjY2Vzc1RvQmlsbGluZyB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBBd3NDdXN0b21SZXNvdXJjZSB9IGZyb20gXCIuLi91dGlsaXRpZXMvYXdzQ3VzdG9tUmVzb3VyY2VcIjtcblxuLyoqXG4gKiBBV1MgQWNjb3VudCBjb25zdHJ1Y3QgZm9yIG1hbmFnaW5nIG1lbWJlciBhY2NvdW50c1xuICovXG5leHBvcnQgY2xhc3MgQWNjb3VudCBleHRlbmRzIENvbnN0cnVjdCBpbXBsZW1lbnRzIElBY2NvdW50IHtcbiAgcmVhZG9ubHkgYWNjb3VudElkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGFjY291bnRBcm46IHN0cmluZztcbiAgcmVhZG9ubHkgYWNjb3VudE5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgZW1haWw6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogQWNjb3VudFByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIHRoaXMuYWNjb3VudE5hbWUgPSBwcm9wcy5hY2NvdW50TmFtZTtcbiAgICB0aGlzLmVtYWlsID0gcHJvcHMuZW1haWw7XG4gICAgY29uc3QgaW1wb3J0T25EdXBsaWNhdGUgPSBwcm9wcy5pbXBvcnRPbkR1cGxpY2F0ZSA/PyB0cnVlO1xuICAgIGNvbnN0IHJlbW92YWxQb2xpY3kgPSBwcm9wcy5yZW1vdmFsUG9saWN5ID8/IFJlbW92YWxQb2xpY3kuUkVUQUlOO1xuICAgIGNvbnN0IGlhbVVzZXJBY2Nlc3NUb0JpbGxpbmcgPVxuICAgICAgcHJvcHMuaWFtVXNlckFjY2Vzc1RvQmlsbGluZyA/PyBJYW1Vc2VyQWNjZXNzVG9CaWxsaW5nLkFMTE9XO1xuICAgIGNvbnN0IHJvbGVOYW1lID0gcHJvcHMucm9sZU5hbWUgPz8gXCJPcmdhbmlzYXRpb25BY2NvdW50QWNjZXNzUm9sZVwiO1xuXG4gICAgLy8gQ3JlYXRlIGFjY291bnRcbiAgICBjb25zdCBhY2NvdW50UmVzb3VyY2UgPSBuZXcgQXdzQ3VzdG9tUmVzb3VyY2UodGhpcywgXCJBY2NvdW50UmVzb3VyY2VcIiwge1xuICAgICAgZnVuY3Rpb25OYW1lOiBgbWFuYWdlQWNjb3VudCR7dGhpcy5ub3JtYWxpemVBY2NvdW50TmFtZShwcm9wcy5hY2NvdW50TmFtZSl9YCxcbiAgICAgIG9uQ3JlYXRlOiB7XG4gICAgICAgIHNlcnZpY2U6IFwib3JnYW5pemF0aW9uc1wiLFxuICAgICAgICBhY3Rpb246IFwiQ3JlYXRlQWNjb3VudENvbW1hbmRcIixcbiAgICAgICAgcGFyYW1ldGVyczoge1xuICAgICAgICAgIEVtYWlsOiBwcm9wcy5lbWFpbCxcbiAgICAgICAgICBBY2NvdW50TmFtZTogcHJvcHMuYWNjb3VudE5hbWUsXG4gICAgICAgICAgUm9sZU5hbWU6IHJvbGVOYW1lLFxuICAgICAgICAgIElhbVVzZXJBY2Nlc3NUb0JpbGxpbmc6IGlhbVVzZXJBY2Nlc3NUb0JpbGxpbmdcbiAgICAgICAgfSxcbiAgICAgICAgcGh5c2ljYWxSZXNvdXJjZUlkOiBjdXN0b21SZXNvdXJjZXMuUGh5c2ljYWxSZXNvdXJjZUlkLm9mKFxuICAgICAgICAgIGBhY2NvdW50LSR7cHJvcHMuZW1haWx9YFxuICAgICAgICApLFxuICAgICAgICBpZ25vcmVFcnJvckNvZGVzTWF0Y2hpbmc6IGltcG9ydE9uRHVwbGljYXRlXG4gICAgICAgICAgPyBcIkZpbmFsaXppbmdPcmdhbml6YXRpb25FeGNlcHRpb258QWxyZWFkeUluT3JnYW5pemF0aW9uRXhjZXB0aW9uXCJcbiAgICAgICAgICA6IHVuZGVmaW5lZFxuICAgICAgfSxcbiAgICAgIG9uVXBkYXRlOiB7XG4gICAgICAgIHNlcnZpY2U6IFwib3JnYW5pemF0aW9uc1wiLFxuICAgICAgICBhY3Rpb246IFwiRGVzY3JpYmVBY2NvdW50Q29tbWFuZFwiLFxuICAgICAgICBwYXJhbWV0ZXJzOiB7XG4gICAgICAgICAgQWNjb3VudElkOiB0aGlzLmFjY291bnRJZFxuICAgICAgICB9LFxuICAgICAgICBwaHlzaWNhbFJlc291cmNlSWQ6IGN1c3RvbVJlc291cmNlcy5QaHlzaWNhbFJlc291cmNlSWQub2YoXG4gICAgICAgICAgYGFjY291bnQtJHtwcm9wcy5lbWFpbH1gXG4gICAgICAgIClcbiAgICAgIH0sXG4gICAgICBvbkRlbGV0ZTpcbiAgICAgICAgcmVtb3ZhbFBvbGljeSA9PT0gUmVtb3ZhbFBvbGljeS5ERVNUUk9ZXG4gICAgICAgICAgPyB7XG4gICAgICAgICAgICAgIHNlcnZpY2U6IFwib3JnYW5pemF0aW9uc1wiLFxuICAgICAgICAgICAgICBhY3Rpb246IFwiQ2xvc2VBY2NvdW50Q29tbWFuZFwiLFxuICAgICAgICAgICAgICBwYXJhbWV0ZXJzOiB7XG4gICAgICAgICAgICAgICAgQWNjb3VudElkOiB0aGlzLmFjY291bnRJZFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICByZXNvdXJjZVR5cGU6IFwiQ3VzdG9tOjpBY2NvdW50XCIsXG4gICAgICBwb2xpY3k6IGN1c3RvbVJlc291cmNlcy5Bd3NDdXN0b21SZXNvdXJjZVBvbGljeS5mcm9tU3RhdGVtZW50cyhbXG4gICAgICAgIG5ldyBQb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgICAgIFwib3JnYW5pemF0aW9uczpDcmVhdGVBY2NvdW50XCIsXG4gICAgICAgICAgICBcIm9yZ2FuaXphdGlvbnM6RGVzY3JpYmVBY2NvdW50XCIsXG4gICAgICAgICAgICBcIm9yZ2FuaXphdGlvbnM6Q2xvc2VBY2NvdW50XCIsXG4gICAgICAgICAgICBcIm9yZ2FuaXphdGlvbnM6TGlzdEFjY291bnRzXCIsXG4gICAgICAgICAgICBcIm9yZ2FuaXphdGlvbnM6TW92ZUFjY291bnRcIlxuICAgICAgICAgIF0sXG4gICAgICAgICAgcmVzb3VyY2VzOiBbXCIqXCJdLFxuICAgICAgICAgIGVmZmVjdDogRWZmZWN0LkFMTE9XXG4gICAgICAgIH0pXG4gICAgICBdKVxuICAgIH0pO1xuXG4gICAgLy8gR2V0IGFjY291bnQgZGV0YWlscyBmcm9tIHRoZSBjcmVhdGUgb3BlcmF0aW9uXG4gICAgdGhpcy5hY2NvdW50SWQgPSBhY2NvdW50UmVzb3VyY2UuZ2V0UmVzcG9uc2VGaWVsZChcbiAgICAgIFwiQ3JlYXRlQWNjb3VudFN0YXR1cy5BY2NvdW50SWRcIlxuICAgICk7XG4gICAgdGhpcy5hY2NvdW50QXJuID0gYGFybjphd3M6b3JnYW5pemF0aW9uczo6JHt0aGlzLm5vZGUudHJ5R2V0Q29udGV4dChcImFjY291bnRcIil9OmFjY291bnQvby0ke3RoaXMubm9kZS50cnlHZXRDb250ZXh0KFwib3JnYW5pc2F0aW9uSWRcIil9LyR7dGhpcy5hY2NvdW50SWR9YDtcblxuICAgIC8vIE1vdmUgYWNjb3VudCB0byB0aGUgc3BlY2lmaWVkIHBhcmVudCBPVSAoaWYgbm90IHJvb3QpXG4gICAgaWYgKHByb3BzLnBhcmVudC5vcmdhbmlzYXRpb25hbFVuaXROYW1lICE9PSBcIlJvb3RcIikge1xuICAgICAgbmV3IEF3c0N1c3RvbVJlc291cmNlKHRoaXMsIFwiTW92ZUFjY291bnRcIiwge1xuICAgICAgICBmdW5jdGlvbk5hbWU6IGBtb3ZlQWNjb3VudCR7dGhpcy5ub3JtYWxpemVBY2NvdW50TmFtZShwcm9wcy5hY2NvdW50TmFtZSl9YCxcbiAgICAgICAgb25DcmVhdGU6IHtcbiAgICAgICAgICBzZXJ2aWNlOiBcIm9yZ2FuaXphdGlvbnNcIixcbiAgICAgICAgICBhY3Rpb246IFwiTW92ZUFjY291bnRDb21tYW5kXCIsXG4gICAgICAgICAgcGFyYW1ldGVyczoge1xuICAgICAgICAgICAgQWNjb3VudElkOiB0aGlzLmFjY291bnRJZCxcbiAgICAgICAgICAgIFNvdXJjZVBhcmVudElkOiB0aGlzLmdldFJvb3RJZCgpLFxuICAgICAgICAgICAgRGVzdGluYXRpb25QYXJlbnRJZDogcHJvcHMucGFyZW50Lm9yZ2FuaXNhdGlvbmFsVW5pdElkXG4gICAgICAgICAgfSxcbiAgICAgICAgICBwaHlzaWNhbFJlc291cmNlSWQ6IGN1c3RvbVJlc291cmNlcy5QaHlzaWNhbFJlc291cmNlSWQub2YoXG4gICAgICAgICAgICBgbW92ZS1hY2NvdW50LSR7dGhpcy5hY2NvdW50SWR9LXRvLSR7cHJvcHMucGFyZW50Lm9yZ2FuaXNhdGlvbmFsVW5pdElkfWBcbiAgICAgICAgICApXG4gICAgICAgIH0sXG4gICAgICAgIHJlc291cmNlVHlwZTogXCJDdXN0b206Ok1vdmVBY2NvdW50XCIsXG4gICAgICAgIHBvbGljeTogY3VzdG9tUmVzb3VyY2VzLkF3c0N1c3RvbVJlc291cmNlUG9saWN5LmZyb21TdGF0ZW1lbnRzKFtcbiAgICAgICAgICBuZXcgUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgICAgIGFjdGlvbnM6IFtcIm9yZ2FuaXphdGlvbnM6TW92ZUFjY291bnRcIiwgXCJvcmdhbml6YXRpb25zOkxpc3RSb290c1wiXSxcbiAgICAgICAgICAgIHJlc291cmNlczogW1wiKlwiXSxcbiAgICAgICAgICAgIGVmZmVjdDogRWZmZWN0LkFMTE9XXG4gICAgICAgICAgfSlcbiAgICAgICAgXSlcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIEV4cG9ydCBhY2NvdW50IGRldGFpbHNcbiAgICBuZXcgQ2ZuT3V0cHV0KHRoaXMsIFwiQWNjb3VudElkXCIsIHtcbiAgICAgIGtleTogYCR7aWR9SWRgLFxuICAgICAgdmFsdWU6IHRoaXMuYWNjb3VudElkLFxuICAgICAgZXhwb3J0TmFtZTogYCR7aWR9SWRgXG4gICAgfSk7XG5cbiAgICBuZXcgQ2ZuT3V0cHV0KHRoaXMsIFwiQWNjb3VudEFyblwiLCB7XG4gICAgICBrZXk6IGAke2lkfUFybmAsXG4gICAgICB2YWx1ZTogdGhpcy5hY2NvdW50QXJuLFxuICAgICAgZXhwb3J0TmFtZTogYCR7aWR9QXJuYFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEF0dGFjaCBwb2xpY3kgdG8gdGhpcyBhY2NvdW50XG4gICAqL1xuICBhdHRhY2hQb2xpY3kocG9saWN5OiBJUG9saWN5KTogdm9pZCB7XG4gICAgY29uc3QgcG9saWN5TmFtZSA9IHRoaXMubm9ybWFsaXplUG9saWN5TmFtZShwb2xpY3kucG9saWN5TmFtZSk7XG5cbiAgICBuZXcgQXdzQ3VzdG9tUmVzb3VyY2UodGhpcywgYEF0dGFjaFBvbGljeSR7cG9saWN5TmFtZX1gLCB7XG4gICAgICBmdW5jdGlvbk5hbWU6IGBhdHRhY2hQb2xpY3lUb0FjY291bnQke3BvbGljeU5hbWV9JHt0aGlzLm5vcm1hbGl6ZUFjY291bnROYW1lKHRoaXMuYWNjb3VudE5hbWUpfWAsXG4gICAgICBvbkNyZWF0ZToge1xuICAgICAgICBzZXJ2aWNlOiBcIm9yZ2FuaXphdGlvbnNcIixcbiAgICAgICAgYWN0aW9uOiBcIkF0dGFjaFBvbGljeUNvbW1hbmRcIixcbiAgICAgICAgcGFyYW1ldGVyczoge1xuICAgICAgICAgIFBvbGljeUlkOiBwb2xpY3kucG9saWN5SWQsXG4gICAgICAgICAgVGFyZ2V0SWQ6IHRoaXMuYWNjb3VudElkXG4gICAgICAgIH0sXG4gICAgICAgIHBoeXNpY2FsUmVzb3VyY2VJZDogY3VzdG9tUmVzb3VyY2VzLlBoeXNpY2FsUmVzb3VyY2VJZC5vZihcbiAgICAgICAgICBgYXR0YWNoLXBvbGljeS0ke3BvbGljeS5wb2xpY3lJZH0tdG8tJHt0aGlzLmFjY291bnRJZH1gXG4gICAgICAgIClcbiAgICAgIH0sXG4gICAgICBvbkRlbGV0ZToge1xuICAgICAgICBzZXJ2aWNlOiBcIm9yZ2FuaXphdGlvbnNcIixcbiAgICAgICAgYWN0aW9uOiBcIkRldGFjaFBvbGljeUNvbW1hbmRcIixcbiAgICAgICAgcGFyYW1ldGVyczoge1xuICAgICAgICAgIFBvbGljeUlkOiBwb2xpY3kucG9saWN5SWQsXG4gICAgICAgICAgVGFyZ2V0SWQ6IHRoaXMuYWNjb3VudElkXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICByZXNvdXJjZVR5cGU6IFwiQ3VzdG9tOjpBdHRhY2hQb2xpY3lUb0FjY291bnRcIixcbiAgICAgIHBvbGljeTogY3VzdG9tUmVzb3VyY2VzLkF3c0N1c3RvbVJlc291cmNlUG9saWN5LmZyb21TdGF0ZW1lbnRzKFtcbiAgICAgICAgbmV3IFBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgICAgYWN0aW9uczogW1xuICAgICAgICAgICAgXCJvcmdhbml6YXRpb25zOkF0dGFjaFBvbGljeVwiLFxuICAgICAgICAgICAgXCJvcmdhbml6YXRpb25zOkRldGFjaFBvbGljeVwiLFxuICAgICAgICAgICAgXCJvcmdhbml6YXRpb25zOkxpc3RQb2xpY2llc0ZvclRhcmdldFwiXG4gICAgICAgICAgXSxcbiAgICAgICAgICByZXNvdXJjZXM6IFtcIipcIl0sXG4gICAgICAgICAgZWZmZWN0OiBFZmZlY3QuQUxMT1dcbiAgICAgICAgfSlcbiAgICAgIF0pXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRGVsZWdhdGUgYWRtaW5pc3RyYXRvciBwcml2aWxlZ2VzIGZvciBhIHNlcnZpY2VcbiAgICovXG4gIGRlbGVnYXRlQWRtaW5pc3RyYXRvcihzZXJ2aWNlUHJpbmNpcGFsOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBzZXJ2aWNlTmFtZSA9IHRoaXMubm9ybWFsaXplU2VydmljZU5hbWUoc2VydmljZVByaW5jaXBhbCk7XG5cbiAgICBuZXcgQXdzQ3VzdG9tUmVzb3VyY2UodGhpcywgYERlbGVnYXRlQWRtaW4ke3NlcnZpY2VOYW1lfWAsIHtcbiAgICAgIGZ1bmN0aW9uTmFtZTogYGRlbGVnYXRlQWRtaW4ke3NlcnZpY2VOYW1lfSR7dGhpcy5ub3JtYWxpemVBY2NvdW50TmFtZSh0aGlzLmFjY291bnROYW1lKX1gLFxuICAgICAgb25DcmVhdGU6IHtcbiAgICAgICAgc2VydmljZTogXCJvcmdhbml6YXRpb25zXCIsXG4gICAgICAgIGFjdGlvbjogXCJSZWdpc3RlckRlbGVnYXRlZEFkbWluaXN0cmF0b3JDb21tYW5kXCIsXG4gICAgICAgIHBhcmFtZXRlcnM6IHtcbiAgICAgICAgICBBY2NvdW50SWQ6IHRoaXMuYWNjb3VudElkLFxuICAgICAgICAgIFNlcnZpY2VQcmluY2lwYWw6IHNlcnZpY2VQcmluY2lwYWxcbiAgICAgICAgfSxcbiAgICAgICAgcGh5c2ljYWxSZXNvdXJjZUlkOiBjdXN0b21SZXNvdXJjZXMuUGh5c2ljYWxSZXNvdXJjZUlkLm9mKFxuICAgICAgICAgIGBkZWxlZ2F0ZS1hZG1pbi0ke3NlcnZpY2VQcmluY2lwYWx9LXRvLSR7dGhpcy5hY2NvdW50SWR9YFxuICAgICAgICApXG4gICAgICB9LFxuICAgICAgb25EZWxldGU6IHtcbiAgICAgICAgc2VydmljZTogXCJvcmdhbml6YXRpb25zXCIsXG4gICAgICAgIGFjdGlvbjogXCJEZXJlZ2lzdGVyRGVsZWdhdGVkQWRtaW5pc3RyYXRvckNvbW1hbmRcIixcbiAgICAgICAgcGFyYW1ldGVyczoge1xuICAgICAgICAgIEFjY291bnRJZDogdGhpcy5hY2NvdW50SWQsXG4gICAgICAgICAgU2VydmljZVByaW5jaXBhbDogc2VydmljZVByaW5jaXBhbFxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgcmVzb3VyY2VUeXBlOiBcIkN1c3RvbTo6RGVsZWdhdGVBZG1pbmlzdHJhdG9yXCIsXG4gICAgICBwb2xpY3k6IGN1c3RvbVJlc291cmNlcy5Bd3NDdXN0b21SZXNvdXJjZVBvbGljeS5mcm9tU3RhdGVtZW50cyhbXG4gICAgICAgIG5ldyBQb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgICAgIFwib3JnYW5pemF0aW9uczpSZWdpc3RlckRlbGVnYXRlZEFkbWluaXN0cmF0b3JcIixcbiAgICAgICAgICAgIFwib3JnYW5pemF0aW9uczpEZXJlZ2lzdGVyRGVsZWdhdGVkQWRtaW5pc3RyYXRvclwiLFxuICAgICAgICAgICAgXCJvcmdhbml6YXRpb25zOkxpc3REZWxlZ2F0ZWRBZG1pbmlzdHJhdG9yc1wiXG4gICAgICAgICAgXSxcbiAgICAgICAgICByZXNvdXJjZXM6IFtcIipcIl0sXG4gICAgICAgICAgZWZmZWN0OiBFZmZlY3QuQUxMT1dcbiAgICAgICAgfSlcbiAgICAgIF0pXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogSGVscGVyIHRvIG5vcm1hbGl6ZSBhY2NvdW50IG5hbWVzIGZvciBjb25zdHJ1Y3QgSURzXG4gICAqL1xuICBwcml2YXRlIG5vcm1hbGl6ZUFjY291bnROYW1lKGFjY291bnROYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBhY2NvdW50TmFtZVxuICAgICAgLnJlcGxhY2UoL1teYS16QS1aMC05XS9nLCBcIlwiKVxuICAgICAgLnJlcGxhY2UoL14oW2Etel0pLywgKG1hdGNoKSA9PiBtYXRjaC50b1VwcGVyQ2FzZSgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIZWxwZXIgdG8gbm9ybWFsaXplIHBvbGljeSBuYW1lcyBmb3IgY29uc3RydWN0IElEc1xuICAgKi9cbiAgcHJpdmF0ZSBub3JtYWxpemVQb2xpY3lOYW1lKHBvbGljeU5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHBvbGljeU5hbWVcbiAgICAgIC5yZXBsYWNlKC9bXmEtekEtWjAtOV0vZywgXCJcIilcbiAgICAgIC5yZXBsYWNlKC9eKFthLXpdKS8sIChtYXRjaCkgPT4gbWF0Y2gudG9VcHBlckNhc2UoKSk7XG4gIH1cblxuICAvKipcbiAgICogSGVscGVyIHRvIG5vcm1hbGl6ZSBzZXJ2aWNlIG5hbWVzIGZvciBjb25zdHJ1Y3QgSURzXG4gICAqL1xuICBwcml2YXRlIG5vcm1hbGl6ZVNlcnZpY2VOYW1lKHNlcnZpY2VQcmluY2lwYWw6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHNlcnZpY2VQcmluY2lwYWxcbiAgICAgIC5yZXBsYWNlKC9bXmEtekEtWjAtOV0vZywgXCJcIilcbiAgICAgIC5yZXBsYWNlKC9eKFthLXpdKS8sIChtYXRjaCkgPT4gbWF0Y2gudG9VcHBlckNhc2UoKSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSByb290IElEIChwbGFjZWhvbGRlciAtIHdvdWxkIG5lZWQgY3VzdG9tIGxvZ2ljIHRvIGdldCB0aGlzKVxuICAgKi9cbiAgcHJpdmF0ZSBnZXRSb290SWQoKTogc3RyaW5nIHtcbiAgICAvLyBUaGlzIHdvdWxkIG5lZWQgdG8gYmUgaW1wbGVtZW50ZWQgd2l0aCBhIGN1c3RvbSByZXNvdXJjZSB0byBnZXQgdGhlIHJvb3QgSURcbiAgICAvLyBGb3Igbm93LCB1c2luZyBhIHBsYWNlaG9sZGVyXG4gICAgcmV0dXJuIHRoaXMubm9kZS50cnlHZXRDb250ZXh0KFwib3JnYW5pc2F0aW9uUm9vdElkXCIpIHx8IFwici1wbGFjZWhvbGRlclwiO1xuICB9XG59XG4iXX0=
@@ -1,14 +0,0 @@
1
- import { Construct } from "constructs";
2
- import { DelegatedAdministratorProps } from "./types";
3
- /**
4
- * AWS Organisations Delegated Administrator construct
5
- */
6
- export declare class DelegatedAdministrator extends Construct {
7
- readonly servicePrincipal: string;
8
- readonly accountId: string;
9
- constructor(scope: Construct, id: string, props: DelegatedAdministratorProps);
10
- /**
11
- * Helper to normalize service names for construct IDs
12
- */
13
- private normalizeServiceName;
14
- }