@fjall/components-infrastructure 0.73.17 → 0.74.0

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 (51) hide show
  1. package/dist/lib/__tests__/patterns/__snapshots__/compute.test.js.snap +433 -0
  2. package/dist/lib/__tests__/patterns/compute.test.d.ts +1 -0
  3. package/dist/lib/__tests__/patterns/compute.test.js +137 -0
  4. package/dist/lib/__tests__/simple.test.d.ts +0 -0
  5. package/dist/lib/__tests__/simple.test.js +12 -0
  6. package/dist/lib/config/aws/disasterRecovery.d.ts +27 -0
  7. package/dist/lib/config/aws/disasterRecovery.js +227 -0
  8. package/dist/lib/patterns/aws/managedAccount.js +15 -2
  9. package/dist/lib/resources/aws/backup/backupPlan.d.ts +19 -0
  10. package/dist/lib/resources/aws/backup/backupPlan.js +71 -0
  11. package/dist/lib/resources/aws/backup/backupVault.d.ts +19 -0
  12. package/dist/lib/resources/aws/backup/backupVault.js +43 -0
  13. package/dist/lib/resources/aws/backup/index.d.ts +2 -0
  14. package/dist/lib/resources/aws/backup/index.js +19 -0
  15. package/dist/lib/resources/aws/index.d.ts +1 -0
  16. package/dist/lib/resources/aws/index.js +2 -1
  17. package/dist/lib/resources/aws/organisations/account.d.ts +37 -0
  18. package/dist/lib/resources/aws/organisations/account.js +220 -0
  19. package/dist/lib/resources/aws/organisations/delegatedAdministrator.d.ts +14 -0
  20. package/dist/lib/resources/aws/organisations/delegatedAdministrator.js +61 -0
  21. package/dist/lib/resources/aws/organisations/index.d.ts +8 -0
  22. package/dist/lib/resources/aws/organisations/index.js +22 -0
  23. package/dist/lib/resources/aws/organisations/interfaces.d.ts +105 -0
  24. package/dist/lib/resources/aws/organisations/interfaces.js +3 -0
  25. package/dist/lib/resources/aws/organisations/organisation.d.ts +47 -0
  26. package/dist/lib/resources/aws/organisations/organisation.js +263 -0
  27. package/dist/lib/resources/aws/organisations/organisationalUnit.d.ts +28 -0
  28. package/dist/lib/resources/aws/organisations/organisationalUnit.js +170 -0
  29. package/dist/lib/resources/aws/organisations/policy.d.ts +17 -0
  30. package/dist/lib/resources/aws/organisations/policy.js +93 -0
  31. package/dist/lib/resources/aws/organisations/trustedServiceAccess.d.ts +13 -0
  32. package/dist/lib/resources/aws/organisations/trustedServiceAccess.js +58 -0
  33. package/dist/lib/resources/aws/organisations/types.d.ts +165 -0
  34. package/dist/lib/resources/aws/organisations/types.js +36 -0
  35. package/dist/lib/utils/directTagging.d.ts +31 -0
  36. package/dist/lib/utils/directTagging.js +86 -0
  37. package/dist/lib/utils/fjallConstruct.d.ts +8 -0
  38. package/dist/lib/utils/fjallConstruct.js +18 -0
  39. package/dist/lib/utils/fjallStackSynthesizer.d.ts +9 -0
  40. package/dist/lib/utils/fjallStackSynthesizer.js +22 -0
  41. package/dist/lib/utils/getConfig.d.ts +1 -0
  42. package/dist/lib/utils/getConfig.js +2 -1
  43. package/dist/lib/utils/tagContext.d.ts +28 -0
  44. package/dist/lib/utils/tagContext.js +53 -0
  45. package/dist/lib/utils/tagSynthesizer.d.ts +13 -0
  46. package/dist/lib/utils/tagSynthesizer.js +55 -0
  47. package/package.json +3 -3
  48. package/dist/lib/patterns/aws/ec2.d.ts +0 -43
  49. package/dist/lib/patterns/aws/ec2.js +0 -123
  50. package/dist/lib/utils/getCidr.d.ts +0 -8
  51. package/dist/lib/utils/getCidr.js +0 -40
@@ -0,0 +1,433 @@
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`Infrastructure Testing Basic Infrastructure should match network stack snapshot: network-stack.json 1`] = `
4
+ {
5
+ "Parameters": {
6
+ "BootstrapVersion": {
7
+ "Default": "/cdk-bootstrap/hnb659fds/version",
8
+ "Description": "Version of the CDK Bootstrap resources in this environment, automatically retrieved from SSM Parameter Store. [cdk:skip]",
9
+ "Type": "AWS::SSM::Parameter::Value<String>",
10
+ },
11
+ },
12
+ "Resources": {
13
+ "vpcSnapshotTestDefaultVpcCONSTRUCT_ID_PLACEHOLDER": {
14
+ "Properties": {
15
+ "CidrBlock": "10.0.0.0/16",
16
+ "EnableDnsHostnames": true,
17
+ "EnableDnsSupport": true,
18
+ "InstanceTenancy": "default",
19
+ "Tags": [
20
+ {
21
+ "Key": "Name",
22
+ "Value": "vpc-SnapshotTestDefaultVpc",
23
+ },
24
+ ],
25
+ },
26
+ "Type": "AWS::EC2::VPC",
27
+ },
28
+ "vpcSnapshotTestDefaultVpcIGWCONSTRUCT_ID_PLACEHOLDER": {
29
+ "Properties": {
30
+ "Tags": [
31
+ {
32
+ "Key": "Name",
33
+ "Value": "vpc-SnapshotTestDefaultVpc",
34
+ },
35
+ ],
36
+ },
37
+ "Type": "AWS::EC2::InternetGateway",
38
+ },
39
+ "vpcSnapshotTestDefaultVpcPrivateSubnet1DefaultRouteCONSTRUCT_ID_PLACEHOLDER": {
40
+ "Properties": {
41
+ "DestinationCidrBlock": "0.0.0.0/0",
42
+ "NatGatewayId": {
43
+ "Ref": "vpcSnapshotTestDefaultVpcPublicSubnet1NATGatewayCONSTRUCT_ID_PLACEHOLDER",
44
+ },
45
+ "RouteTableId": {
46
+ "Ref": "vpcSnapshotTestDefaultVpcPrivateSubnet1RouteTableCONSTRUCT_ID_PLACEHOLDER",
47
+ },
48
+ },
49
+ "Type": "AWS::EC2::Route",
50
+ },
51
+ "vpcSnapshotTestDefaultVpcPrivateSubnet1RouteTableAssociationCONSTRUCT_ID_PLACEHOLDER": {
52
+ "Properties": {
53
+ "RouteTableId": {
54
+ "Ref": "vpcSnapshotTestDefaultVpcPrivateSubnet1RouteTableCONSTRUCT_ID_PLACEHOLDER",
55
+ },
56
+ "SubnetId": {
57
+ "Ref": "vpcSnapshotTestDefaultVpcPrivateSubnet1SubnetCONSTRUCT_ID_PLACEHOLDER",
58
+ },
59
+ },
60
+ "Type": "AWS::EC2::SubnetRouteTableAssociation",
61
+ },
62
+ "vpcSnapshotTestDefaultVpcPrivateSubnet1RouteTableCONSTRUCT_ID_PLACEHOLDER": {
63
+ "Properties": {
64
+ "Tags": [
65
+ {
66
+ "Key": "Name",
67
+ "Value": "SnapshotTestNetwork/vpc-SnapshotTestDefaultVpc/PrivateSubnet1",
68
+ },
69
+ ],
70
+ "VpcId": {
71
+ "Ref": "vpcSnapshotTestDefaultVpcCONSTRUCT_ID_PLACEHOLDER",
72
+ },
73
+ },
74
+ "Type": "AWS::EC2::RouteTable",
75
+ },
76
+ "vpcSnapshotTestDefaultVpcPrivateSubnet1SubnetCONSTRUCT_ID_PLACEHOLDER": {
77
+ "Properties": {
78
+ "AvailabilityZone": {
79
+ "Fn::Select": [
80
+ 0,
81
+ {
82
+ "Fn::GetAZs": "",
83
+ },
84
+ ],
85
+ },
86
+ "CidrBlock": "10.0.128.0/18",
87
+ "MapPublicIpOnLaunch": false,
88
+ "Tags": [
89
+ {
90
+ "Key": "aws-cdk:subnet-name",
91
+ "Value": "Private",
92
+ },
93
+ {
94
+ "Key": "aws-cdk:subnet-type",
95
+ "Value": "Private",
96
+ },
97
+ {
98
+ "Key": "Name",
99
+ "Value": "SnapshotTestNetwork/vpc-SnapshotTestDefaultVpc/PrivateSubnet1",
100
+ },
101
+ ],
102
+ "VpcId": {
103
+ "Ref": "vpcSnapshotTestDefaultVpcCONSTRUCT_ID_PLACEHOLDER",
104
+ },
105
+ },
106
+ "Type": "AWS::EC2::Subnet",
107
+ },
108
+ "vpcSnapshotTestDefaultVpcPrivateSubnet2DefaultRouteCONSTRUCT_ID_PLACEHOLDER": {
109
+ "Properties": {
110
+ "DestinationCidrBlock": "0.0.0.0/0",
111
+ "NatGatewayId": {
112
+ "Ref": "vpcSnapshotTestDefaultVpcPublicSubnet2NATGatewayCONSTRUCT_ID_PLACEHOLDER",
113
+ },
114
+ "RouteTableId": {
115
+ "Ref": "vpcSnapshotTestDefaultVpcPrivateSubnet2RouteTableCONSTRUCT_ID_PLACEHOLDER",
116
+ },
117
+ },
118
+ "Type": "AWS::EC2::Route",
119
+ },
120
+ "vpcSnapshotTestDefaultVpcPrivateSubnet2RouteTableAssociationCONSTRUCT_ID_PLACEHOLDER": {
121
+ "Properties": {
122
+ "RouteTableId": {
123
+ "Ref": "vpcSnapshotTestDefaultVpcPrivateSubnet2RouteTableCONSTRUCT_ID_PLACEHOLDER",
124
+ },
125
+ "SubnetId": {
126
+ "Ref": "vpcSnapshotTestDefaultVpcPrivateSubnet2SubnetCONSTRUCT_ID_PLACEHOLDER",
127
+ },
128
+ },
129
+ "Type": "AWS::EC2::SubnetRouteTableAssociation",
130
+ },
131
+ "vpcSnapshotTestDefaultVpcPrivateSubnet2RouteTableCONSTRUCT_ID_PLACEHOLDER": {
132
+ "Properties": {
133
+ "Tags": [
134
+ {
135
+ "Key": "Name",
136
+ "Value": "SnapshotTestNetwork/vpc-SnapshotTestDefaultVpc/PrivateSubnet2",
137
+ },
138
+ ],
139
+ "VpcId": {
140
+ "Ref": "vpcSnapshotTestDefaultVpcCONSTRUCT_ID_PLACEHOLDER",
141
+ },
142
+ },
143
+ "Type": "AWS::EC2::RouteTable",
144
+ },
145
+ "vpcSnapshotTestDefaultVpcPrivateSubnet2SubnetCONSTRUCT_ID_PLACEHOLDER": {
146
+ "Properties": {
147
+ "AvailabilityZone": {
148
+ "Fn::Select": [
149
+ 1,
150
+ {
151
+ "Fn::GetAZs": "",
152
+ },
153
+ ],
154
+ },
155
+ "CidrBlock": "10.0.192.0/18",
156
+ "MapPublicIpOnLaunch": false,
157
+ "Tags": [
158
+ {
159
+ "Key": "aws-cdk:subnet-name",
160
+ "Value": "Private",
161
+ },
162
+ {
163
+ "Key": "aws-cdk:subnet-type",
164
+ "Value": "Private",
165
+ },
166
+ {
167
+ "Key": "Name",
168
+ "Value": "SnapshotTestNetwork/vpc-SnapshotTestDefaultVpc/PrivateSubnet2",
169
+ },
170
+ ],
171
+ "VpcId": {
172
+ "Ref": "vpcSnapshotTestDefaultVpcCONSTRUCT_ID_PLACEHOLDER",
173
+ },
174
+ },
175
+ "Type": "AWS::EC2::Subnet",
176
+ },
177
+ "vpcSnapshotTestDefaultVpcPublicSubnet1DefaultRouteCONSTRUCT_ID_PLACEHOLDER": {
178
+ "DependsOn": [
179
+ "vpcSnapshotTestDefaultVpcVPCGWCONSTRUCT_ID_PLACEHOLDER",
180
+ ],
181
+ "Properties": {
182
+ "DestinationCidrBlock": "0.0.0.0/0",
183
+ "GatewayId": {
184
+ "Ref": "vpcSnapshotTestDefaultVpcIGWCONSTRUCT_ID_PLACEHOLDER",
185
+ },
186
+ "RouteTableId": {
187
+ "Ref": "vpcSnapshotTestDefaultVpcPublicSubnet1RouteTableCONSTRUCT_ID_PLACEHOLDER",
188
+ },
189
+ },
190
+ "Type": "AWS::EC2::Route",
191
+ },
192
+ "vpcSnapshotTestDefaultVpcPublicSubnet1EIPCONSTRUCT_ID_PLACEHOLDER": {
193
+ "Properties": {
194
+ "Domain": "vpc",
195
+ "Tags": [
196
+ {
197
+ "Key": "Name",
198
+ "Value": "SnapshotTestNetwork/vpc-SnapshotTestDefaultVpc/PublicSubnet1",
199
+ },
200
+ ],
201
+ },
202
+ "Type": "AWS::EC2::EIP",
203
+ },
204
+ "vpcSnapshotTestDefaultVpcPublicSubnet1NATGatewayCONSTRUCT_ID_PLACEHOLDER": {
205
+ "DependsOn": [
206
+ "vpcSnapshotTestDefaultVpcPublicSubnet1DefaultRouteCONSTRUCT_ID_PLACEHOLDER",
207
+ "vpcSnapshotTestDefaultVpcPublicSubnet1RouteTableAssociationCONSTRUCT_ID_PLACEHOLDER",
208
+ ],
209
+ "Properties": {
210
+ "AllocationId": {
211
+ "Fn::GetAtt": [
212
+ "vpcSnapshotTestDefaultVpcPublicSubnet1EIPCONSTRUCT_ID_PLACEHOLDER",
213
+ "AllocationId",
214
+ ],
215
+ },
216
+ "SubnetId": {
217
+ "Ref": "vpcSnapshotTestDefaultVpcPublicSubnet1SubnetCONSTRUCT_ID_PLACEHOLDER",
218
+ },
219
+ "Tags": [
220
+ {
221
+ "Key": "Name",
222
+ "Value": "SnapshotTestNetwork/vpc-SnapshotTestDefaultVpc/PublicSubnet1",
223
+ },
224
+ ],
225
+ },
226
+ "Type": "AWS::EC2::NatGateway",
227
+ },
228
+ "vpcSnapshotTestDefaultVpcPublicSubnet1RouteTableAssociationCONSTRUCT_ID_PLACEHOLDER": {
229
+ "Properties": {
230
+ "RouteTableId": {
231
+ "Ref": "vpcSnapshotTestDefaultVpcPublicSubnet1RouteTableCONSTRUCT_ID_PLACEHOLDER",
232
+ },
233
+ "SubnetId": {
234
+ "Ref": "vpcSnapshotTestDefaultVpcPublicSubnet1SubnetCONSTRUCT_ID_PLACEHOLDER",
235
+ },
236
+ },
237
+ "Type": "AWS::EC2::SubnetRouteTableAssociation",
238
+ },
239
+ "vpcSnapshotTestDefaultVpcPublicSubnet1RouteTableCONSTRUCT_ID_PLACEHOLDER": {
240
+ "Properties": {
241
+ "Tags": [
242
+ {
243
+ "Key": "Name",
244
+ "Value": "SnapshotTestNetwork/vpc-SnapshotTestDefaultVpc/PublicSubnet1",
245
+ },
246
+ ],
247
+ "VpcId": {
248
+ "Ref": "vpcSnapshotTestDefaultVpcCONSTRUCT_ID_PLACEHOLDER",
249
+ },
250
+ },
251
+ "Type": "AWS::EC2::RouteTable",
252
+ },
253
+ "vpcSnapshotTestDefaultVpcPublicSubnet1SubnetCONSTRUCT_ID_PLACEHOLDER": {
254
+ "Properties": {
255
+ "AvailabilityZone": {
256
+ "Fn::Select": [
257
+ 0,
258
+ {
259
+ "Fn::GetAZs": "",
260
+ },
261
+ ],
262
+ },
263
+ "CidrBlock": "10.0.0.0/18",
264
+ "MapPublicIpOnLaunch": true,
265
+ "Tags": [
266
+ {
267
+ "Key": "aws-cdk:subnet-name",
268
+ "Value": "Public",
269
+ },
270
+ {
271
+ "Key": "aws-cdk:subnet-type",
272
+ "Value": "Public",
273
+ },
274
+ {
275
+ "Key": "Name",
276
+ "Value": "SnapshotTestNetwork/vpc-SnapshotTestDefaultVpc/PublicSubnet1",
277
+ },
278
+ ],
279
+ "VpcId": {
280
+ "Ref": "vpcSnapshotTestDefaultVpcCONSTRUCT_ID_PLACEHOLDER",
281
+ },
282
+ },
283
+ "Type": "AWS::EC2::Subnet",
284
+ },
285
+ "vpcSnapshotTestDefaultVpcPublicSubnet2DefaultRouteCONSTRUCT_ID_PLACEHOLDER": {
286
+ "DependsOn": [
287
+ "vpcSnapshotTestDefaultVpcVPCGWCONSTRUCT_ID_PLACEHOLDER",
288
+ ],
289
+ "Properties": {
290
+ "DestinationCidrBlock": "0.0.0.0/0",
291
+ "GatewayId": {
292
+ "Ref": "vpcSnapshotTestDefaultVpcIGWCONSTRUCT_ID_PLACEHOLDER",
293
+ },
294
+ "RouteTableId": {
295
+ "Ref": "vpcSnapshotTestDefaultVpcPublicSubnet2RouteTableCONSTRUCT_ID_PLACEHOLDER",
296
+ },
297
+ },
298
+ "Type": "AWS::EC2::Route",
299
+ },
300
+ "vpcSnapshotTestDefaultVpcPublicSubnet2EIPCONSTRUCT_ID_PLACEHOLDER": {
301
+ "Properties": {
302
+ "Domain": "vpc",
303
+ "Tags": [
304
+ {
305
+ "Key": "Name",
306
+ "Value": "SnapshotTestNetwork/vpc-SnapshotTestDefaultVpc/PublicSubnet2",
307
+ },
308
+ ],
309
+ },
310
+ "Type": "AWS::EC2::EIP",
311
+ },
312
+ "vpcSnapshotTestDefaultVpcPublicSubnet2NATGatewayCONSTRUCT_ID_PLACEHOLDER": {
313
+ "DependsOn": [
314
+ "vpcSnapshotTestDefaultVpcPublicSubnet2DefaultRouteCONSTRUCT_ID_PLACEHOLDER",
315
+ "vpcSnapshotTestDefaultVpcPublicSubnet2RouteTableAssociationCONSTRUCT_ID_PLACEHOLDER",
316
+ ],
317
+ "Properties": {
318
+ "AllocationId": {
319
+ "Fn::GetAtt": [
320
+ "vpcSnapshotTestDefaultVpcPublicSubnet2EIPCONSTRUCT_ID_PLACEHOLDER",
321
+ "AllocationId",
322
+ ],
323
+ },
324
+ "SubnetId": {
325
+ "Ref": "vpcSnapshotTestDefaultVpcPublicSubnet2SubnetCONSTRUCT_ID_PLACEHOLDER",
326
+ },
327
+ "Tags": [
328
+ {
329
+ "Key": "Name",
330
+ "Value": "SnapshotTestNetwork/vpc-SnapshotTestDefaultVpc/PublicSubnet2",
331
+ },
332
+ ],
333
+ },
334
+ "Type": "AWS::EC2::NatGateway",
335
+ },
336
+ "vpcSnapshotTestDefaultVpcPublicSubnet2RouteTableAssociationCONSTRUCT_ID_PLACEHOLDER": {
337
+ "Properties": {
338
+ "RouteTableId": {
339
+ "Ref": "vpcSnapshotTestDefaultVpcPublicSubnet2RouteTableCONSTRUCT_ID_PLACEHOLDER",
340
+ },
341
+ "SubnetId": {
342
+ "Ref": "vpcSnapshotTestDefaultVpcPublicSubnet2SubnetCONSTRUCT_ID_PLACEHOLDER",
343
+ },
344
+ },
345
+ "Type": "AWS::EC2::SubnetRouteTableAssociation",
346
+ },
347
+ "vpcSnapshotTestDefaultVpcPublicSubnet2RouteTableCONSTRUCT_ID_PLACEHOLDER": {
348
+ "Properties": {
349
+ "Tags": [
350
+ {
351
+ "Key": "Name",
352
+ "Value": "SnapshotTestNetwork/vpc-SnapshotTestDefaultVpc/PublicSubnet2",
353
+ },
354
+ ],
355
+ "VpcId": {
356
+ "Ref": "vpcSnapshotTestDefaultVpcCONSTRUCT_ID_PLACEHOLDER",
357
+ },
358
+ },
359
+ "Type": "AWS::EC2::RouteTable",
360
+ },
361
+ "vpcSnapshotTestDefaultVpcPublicSubnet2SubnetCONSTRUCT_ID_PLACEHOLDER": {
362
+ "Properties": {
363
+ "AvailabilityZone": {
364
+ "Fn::Select": [
365
+ 1,
366
+ {
367
+ "Fn::GetAZs": "",
368
+ },
369
+ ],
370
+ },
371
+ "CidrBlock": "10.0.64.0/18",
372
+ "MapPublicIpOnLaunch": true,
373
+ "Tags": [
374
+ {
375
+ "Key": "aws-cdk:subnet-name",
376
+ "Value": "Public",
377
+ },
378
+ {
379
+ "Key": "aws-cdk:subnet-type",
380
+ "Value": "Public",
381
+ },
382
+ {
383
+ "Key": "Name",
384
+ "Value": "SnapshotTestNetwork/vpc-SnapshotTestDefaultVpc/PublicSubnet2",
385
+ },
386
+ ],
387
+ "VpcId": {
388
+ "Ref": "vpcSnapshotTestDefaultVpcCONSTRUCT_ID_PLACEHOLDER",
389
+ },
390
+ },
391
+ "Type": "AWS::EC2::Subnet",
392
+ },
393
+ "vpcSnapshotTestDefaultVpcVPCGWCONSTRUCT_ID_PLACEHOLDER": {
394
+ "Properties": {
395
+ "InternetGatewayId": {
396
+ "Ref": "vpcSnapshotTestDefaultVpcIGWCONSTRUCT_ID_PLACEHOLDER",
397
+ },
398
+ "VpcId": {
399
+ "Ref": "vpcSnapshotTestDefaultVpcCONSTRUCT_ID_PLACEHOLDER",
400
+ },
401
+ },
402
+ "Type": "AWS::EC2::VPCGatewayAttachment",
403
+ },
404
+ },
405
+ "Rules": {
406
+ "CheckBootstrapVersion": {
407
+ "Assertions": [
408
+ {
409
+ "Assert": {
410
+ "Fn::Not": [
411
+ {
412
+ "Fn::Contains": [
413
+ [
414
+ "1",
415
+ "2",
416
+ "3",
417
+ "4",
418
+ "5",
419
+ ],
420
+ {
421
+ "Ref": "BootstrapVersion",
422
+ },
423
+ ],
424
+ },
425
+ ],
426
+ },
427
+ "AssertDescription": "CDK bootstrap stack version 6 required. Please run 'cdk bootstrap' with a recent version of the CDK CLI.",
428
+ },
429
+ ],
430
+ },
431
+ },
432
+ }
433
+ `;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,137 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const setup_1 = require("../setup");
4
+ const app_1 = require("../../app");
5
+ describe("Infrastructure Testing", () => {
6
+ let app;
7
+ let stack;
8
+ beforeEach(() => {
9
+ // Set up clean test environment for each test
10
+ app = setup_1.TestUtils.createTestApp();
11
+ stack = setup_1.TestUtils.createTestStack(app);
12
+ // Reset App singleton for each test
13
+ app_1.default.instance = null;
14
+ });
15
+ describe("Basic Infrastructure", () => {
16
+ it("should create a simple stack", () => {
17
+ // Simple test to validate our setup works
18
+ const template = setup_1.TestUtils.getTemplate(stack);
19
+ expect(template.toJSON()).toHaveProperty("AWSTemplateFormatVersion");
20
+ });
21
+ it("should create App with default stacks", () => {
22
+ // Test the App singleton with default stacks
23
+ const fjallApp = app_1.default.getApp("TestApp");
24
+ // Create the default stacks
25
+ const networkStack = fjallApp.getDefaultNetworkStack();
26
+ const storageStack = fjallApp.getDefaultStorageStack();
27
+ const computeStack = fjallApp.getDefaultComputeStack();
28
+ // Verify stacks exist
29
+ expect(networkStack).toBeDefined();
30
+ expect(storageStack).toBeDefined();
31
+ expect(computeStack).toBeDefined();
32
+ // Verify stack names
33
+ expect(networkStack.getStack().stackName).toBe("TestAppNetwork");
34
+ expect(storageStack.getStack().stackName).toBe("TestAppStorage");
35
+ expect(computeStack.getStack().stackName).toBe("TestAppCompute");
36
+ });
37
+ it("should create VPC in network stack", () => {
38
+ const fjallApp = app_1.default.getApp("VpcTest");
39
+ const vpc = fjallApp.getDefaultVpc();
40
+ expect(vpc).toBeDefined();
41
+ // Get the network stack template
42
+ const networkStack = fjallApp.getDefaultNetworkStack();
43
+ const template = setup_1.TestUtils.getTemplate(networkStack.getStack());
44
+ // Verify VPC resources are created
45
+ template.hasResourceProperties("AWS::EC2::VPC", {
46
+ EnableDnsHostnames: true,
47
+ EnableDnsSupport: true
48
+ });
49
+ });
50
+ it("should match network stack snapshot", () => {
51
+ const fjallApp = app_1.default.getApp("SnapshotTest");
52
+ fjallApp.getDefaultVpc(); // Trigger VPC creation
53
+ const networkStack = fjallApp.getDefaultNetworkStack();
54
+ const template = setup_1.TestUtils.getSnapshotTemplate(networkStack.getStack());
55
+ const sanitisedTemplate = setup_1.TestUtils.sanitiseTemplate(template);
56
+ expect(sanitisedTemplate).toMatchSnapshot("network-stack.json");
57
+ });
58
+ it("should create ECR repository", () => {
59
+ const fjallApp = app_1.default.getApp("EcrTest");
60
+ const ecr = fjallApp.getDefaultContainerRegistry();
61
+ expect(ecr).toBeDefined();
62
+ // Get the network stack (where ECR is created)
63
+ const networkStack = fjallApp.getDefaultNetworkStack();
64
+ const template = setup_1.TestUtils.getTemplate(networkStack.getStack());
65
+ // Verify ECR repository is created
66
+ template.hasResourceProperties("AWS::ECR::Repository", {
67
+ RepositoryName: "EcrTestEcr"
68
+ });
69
+ });
70
+ });
71
+ describe("App Class", () => {
72
+ it("should be a singleton", () => {
73
+ const app1 = app_1.default.getApp("SingletonTest");
74
+ const app2 = app_1.default.getApp("SingletonTest");
75
+ expect(app1).toBe(app2);
76
+ });
77
+ it("should handle existing VPC configuration", () => {
78
+ const fjallApp = app_1.default.getApp("ExistingVpcTest");
79
+ // Configure to use existing VPC
80
+ fjallApp.useExistingVpc("vpc-existing123");
81
+ // This should not throw an error
82
+ expect(() => fjallApp.getDefaultVpc()).not.toThrow();
83
+ });
84
+ it("should create stacks with proper dependencies", () => {
85
+ const fjallApp = app_1.default.getApp("DependencyTest");
86
+ const networkStack = fjallApp.getDefaultNetworkStack();
87
+ const storageStack = fjallApp.getDefaultStorageStack();
88
+ const computeStack = fjallApp.getDefaultComputeStack();
89
+ // Storage should depend on network
90
+ expect(storageStack.getStack().dependencies).toContain(networkStack.getStack());
91
+ // Compute should depend on both network and storage
92
+ expect(computeStack.getStack().dependencies).toContain(networkStack.getStack());
93
+ expect(computeStack.getStack().dependencies).toContain(storageStack.getStack());
94
+ });
95
+ });
96
+ describe("Snapshot Tests", () => {
97
+ it("should match complete app infrastructure snapshot", () => {
98
+ const fjallApp = app_1.default.getApp("CompleteTest");
99
+ // Create all default infrastructure
100
+ fjallApp.getDefaultVpc();
101
+ fjallApp.getDefaultContainerRegistry();
102
+ const networkStack = fjallApp.getDefaultNetworkStack();
103
+ const storageStack = fjallApp.getDefaultStorageStack();
104
+ const computeStack = fjallApp.getDefaultComputeStack();
105
+ // Snapshot each stack
106
+ const networkTemplate = setup_1.TestUtils.sanitiseTemplate(setup_1.TestUtils.getSnapshotTemplate(networkStack.getStack()));
107
+ const storageTemplate = setup_1.TestUtils.sanitiseTemplate(setup_1.TestUtils.getSnapshotTemplate(storageStack.getStack()));
108
+ const computeTemplate = setup_1.TestUtils.sanitiseTemplate(setup_1.TestUtils.getSnapshotTemplate(computeStack.getStack()));
109
+ expect(networkTemplate).toMatchSnapshot("complete-network-stack.json");
110
+ expect(storageTemplate).toMatchSnapshot("complete-storage-stack.json");
111
+ expect(computeTemplate).toMatchSnapshot("complete-compute-stack.json");
112
+ });
113
+ });
114
+ describe("Integration Tests", () => {
115
+ it("should handle multiple apps without conflicts", () => {
116
+ // Reset singleton to test multiple apps
117
+ app_1.default.instance = null;
118
+ const app1 = app_1.default.getApp("App1");
119
+ const app2 = app_1.default.getApp("App2");
120
+ // Should be the same instance (singleton)
121
+ expect(app1).toBe(app2);
122
+ // But name should be from first creation
123
+ const vpc1 = app1.getDefaultVpc();
124
+ expect(vpc1).toBeDefined();
125
+ });
126
+ it("should apply tags correctly to resources", () => {
127
+ const fjallApp = app_1.default.getApp("TagTest");
128
+ fjallApp.getDefaultVpc();
129
+ const networkStack = fjallApp.getDefaultNetworkStack();
130
+ const template = setup_1.TestUtils.getTemplate(networkStack.getStack());
131
+ // Resources should be created (tags verified in snapshots)
132
+ const resources = template.toJSON().Resources;
133
+ expect(Object.keys(resources).length).toBeGreaterThan(0);
134
+ });
135
+ });
136
+ });
137
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcHV0ZS50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vbGliL19fdGVzdHNfXy9wYXR0ZXJucy9jb21wdXRlLnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFFQSxvQ0FBK0M7QUFDL0MsbUNBQTRCO0FBRTVCLFFBQVEsQ0FBQyx3QkFBd0IsRUFBRSxHQUFHLEVBQUU7SUFDdEMsSUFBSSxHQUFXLENBQUM7SUFDaEIsSUFBSSxLQUFZLENBQUM7SUFFakIsVUFBVSxDQUFDLEdBQUcsRUFBRTtRQUNkLDhDQUE4QztRQUM5QyxHQUFHLEdBQUcsaUJBQVMsQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUNoQyxLQUFLLEdBQUcsaUJBQVMsQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFdkMsb0NBQW9DO1FBQ25DLGFBQVcsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO0lBQy9CLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLHNCQUFzQixFQUFFLEdBQUcsRUFBRTtRQUNwQyxFQUFFLENBQUMsOEJBQThCLEVBQUUsR0FBRyxFQUFFO1lBQ3RDLDBDQUEwQztZQUMxQyxNQUFNLFFBQVEsR0FBRyxpQkFBUyxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM5QyxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsY0FBYyxDQUFDLDBCQUEwQixDQUFDLENBQUM7UUFDdkUsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsdUNBQXVDLEVBQUUsR0FBRyxFQUFFO1lBQy9DLDZDQUE2QztZQUM3QyxNQUFNLFFBQVEsR0FBRyxhQUFHLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBRXZDLDRCQUE0QjtZQUM1QixNQUFNLFlBQVksR0FBRyxRQUFRLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztZQUN2RCxNQUFNLFlBQVksR0FBRyxRQUFRLENBQUMsc0JBQXNCLEVBQUUs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QzNELE1BQU0sU0FBUyxHQUFHLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxTQUFTLENBQUM7WUFDOUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzNELENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFwcCBhcyBDZGtBcHAsIFN0YWNrIH0gZnJvbSBcImF3cy1jZGstbGliXCI7XG5pbXBvcnQgeyBUZW1wbGF0ZSB9IGZyb20gXCJhd3MtY2RrLWxpYi9hc3NlcnRpb25zXCI7XG5pbXBvcnQgeyBUZXN0VXRpbHMsIFRlc3REYXRhIH0gZnJvbSBcIi4uL3NldHVwXCI7XG5pbXBvcnQgQXBwIGZyb20gXCIuLi8uLi9hcHBcIjtcblxuZGVzY3JpYmUoXCJJbmZyYXN0cnVjdHVyZSBUZXN0aW5nXCIsICgpID0+IHtcbiAgbGV0IGFwcDogQ2RrQXBwO1xuICBsZXQgc3RhY2s6IFN0YWNrO1xuXG4gIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgIC8vIFNldCB1cCBjbGVhbiB0ZXN0IGVudmlyb25tZW50IGZvciBlYWNoIHRlc3RcbiAgICBhcHAgPSBUZXN0VXRpbHMuY3JlYXRlVGVzdEFwcCgpO1xuICAgIHN0YWNrID0gVGVzdFV0aWxzLmNyZWF0ZVRlc3RTdGFjayhhcHApO1xuXG4gICAgLy8gUmVzZXQgQXBwIHNpbmdsZXRvbiBmb3IgZWFjaCB0ZXN0XG4gICAgKEFwcCBhcyBhbnkpLmluc3RhbmNlID0gbnVsbDtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoXCJCYXNpYyBJbmZyYXN0cnVjdHVyZVwiLCAoKSA9PiB7XG4gICAgaXQoXCJzaG91bGQgY3JlYXRlIGEgc2ltcGxlIHN0YWNrXCIsICgpID0+IHtcbiAgICAgIC8vIFNpbXBsZSB0ZXN0IHRvIHZhbGlkYXRlIG91ciBzZXR1cCB3b3Jrc1xuICAgICAgY29uc3QgdGVtcGxhdGUgPSBUZXN0VXRpbHMuZ2V0VGVtcGxhdGUoc3RhY2spO1xuICAgICAgZXhwZWN0KHRlbXBsYXRlLnRvSlNPTigpKS50b0hhdmVQcm9wZXJ0eShcIkFXU1RlbXBsYXRlRm9ybWF0VmVyc2lvblwiKTtcbiAgICB9KTtcblxuICAgIGl0KFwic2hvdWxkIGNyZWF0ZSBBcHAgd2l0aCBkZWZhdWx0IHN0YWNrc1wiLCAoKSA9PiB7XG4gICAgICAvLyBUZXN0IHRoZSBBcHAgc2luZ2xldG9uIHdpdGggZGVmYXVsdCBzdGFja3NcbiAgICAgIGNvbnN0IGZqYWxsQXBwID0gQXBwLmdldEFwcChcIlRlc3RBcHBcIik7XG5cbiAgICAgIC8vIENyZWF0ZSB0aGUgZGVmYXVsdCBzdGFja3NcbiAgICAgIGNvbnN0IG5ldHdvcmtTdGFjayA9IGZqYWxsQXBwLmdldERlZmF1bHROZXR3b3JrU3RhY2soKTtcbiAgICAgIGNvbnN0IHN0b3JhZ2VTdGFjayA9IGZqYWxsQXBwLmdldERlZmF1bHRTdG9yYWdlU3RhY2soKTtcbiAgICAgIGNvbnN0IGNvbXB1dGVTdGFjayA9IGZqYWxsQXBwLmdldERlZmF1bHRDb21wdXRlU3RhY2soKTtcblxuICAgICAgLy8gVmVyaWZ5IHN0YWNrcyBleGlzdFxuICAgICAgZXhwZWN0KG5ldHdvcmtTdGFjaykudG9CZURlZmluZWQoKTtcbiAgICAgIGV4cGVjdChzdG9yYWdlU3RhY2spLnRvQmVEZWZpbmVkKCk7XG4gICAgICBleHBlY3QoY29tcHV0ZVN0YWNrKS50b0JlRGVmaW5lZCgpO1xuXG4gICAgICAvLyBWZXJpZnkgc3RhY2sgbmFtZXNcbiAgICAgIGV4cGVjdChuZXR3b3JrU3RhY2suZ2V0U3RhY2soKS5zdGFja05hbWUpLnRvQmUoXCJUZXN0QXBwTmV0d29ya1wiKTtcbiAgICAgIGV4cGVjdChzdG9yYWdlU3RhY2suZ2V0U3RhY2soKS5zdGFja05hbWUpLnRvQmUoXCJUZXN0QXBwU3RvcmFnZVwiKTtcbiAgICAgIGV4cGVjdChjb21wdXRlU3RhY2suZ2V0U3RhY2soKS5zdGFja05hbWUpLnRvQmUoXCJUZXN0QXBwQ29tcHV0ZVwiKTtcbiAgICB9KTtcblxuICAgIGl0KFwic2hvdWxkIGNyZWF0ZSBWUEMgaW4gbmV0d29yayBzdGFja1wiLCAoKSA9PiB7XG4gICAgICBjb25zdCBmamFsbEFwcCA9IEFwcC5nZXRBcHAoXCJWcGNUZXN0XCIpO1xuICAgICAgY29uc3QgdnBjID0gZmphbGxBcHAuZ2V0RGVmYXVsdFZwYygpO1xuXG4gICAgICBleHBlY3QodnBjKS50b0JlRGVmaW5lZCgpO1xuXG4gICAgICAvLyBHZXQgdGhlIG5ldHdvcmsgc3RhY2sgdGVtcGxhdGVcbiAgICAgIGNvbnN0IG5ldHdvcmtTdGFjayA9IGZqYWxsQXBwLmdldERlZmF1bHROZXR3b3JrU3RhY2soKTtcbiAgICAgIGNvbnN0IHRlbXBsYXRlID0gVGVzdFV0aWxzLmdldFRlbXBsYXRlKG5ldHdvcmtTdGFjay5nZXRTdGFjaygpKTtcblxuICAgICAgLy8gVmVyaWZ5IFZQQyByZXNvdXJjZXMgYXJlIGNyZWF0ZWRcbiAgICAgIHRlbXBsYXRlLmhhc1Jlc291cmNlUHJvcGVydGllcyhcIkFXUzo6RUMyOjpWUENcIiwge1xuICAgICAgICBFbmFibGVEbnNIb3N0bmFtZXM6IHRydWUsXG4gICAgICAgIEVuYWJsZURuc1N1cHBvcnQ6IHRydWVcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoXCJzaG91bGQgbWF0Y2ggbmV0d29yayBzdGFjayBzbmFwc2hvdFwiLCAoKSA9PiB7XG4gICAgICBjb25zdCBmamFsbEFwcCA9IEFwcC5nZXRBcHAoXCJTbmFwc2hvdFRlc3RcIik7XG4gICAgICBmamFsbEFwcC5nZXREZWZhdWx0VnBjKCk7IC8vIFRyaWdnZXIgVlBDIGNyZWF0aW9uXG5cbiAgICAgIGNvbnN0IG5ldHdvcmtTdGFjayA9IGZqYWxsQXBwLmdldERlZmF1bHROZXR3b3JrU3RhY2soKTtcbiAgICAgIGNvbnN0IHRlbXBsYXRlID0gVGVzdFV0aWxzLmdldFNuYXBzaG90VGVtcGxhdGUobmV0d29ya1N0YWNrLmdldFN0YWNrKCkpO1xuICAgICAgY29uc3Qgc2FuaXRpc2VkVGVtcGxhdGUgPSBUZXN0VXRpbHMuc2FuaXRpc2VUZW1wbGF0ZSh0ZW1wbGF0ZSk7XG5cbiAgICAgIGV4cGVjdChzYW5pdGlzZWRUZW1wbGF0ZSkudG9NYXRjaFNuYXBzaG90KFwibmV0d29yay1zdGFjay5qc29uXCIpO1xuICAgIH0pO1xuXG4gICAgaXQoXCJzaG91bGQgY3JlYXRlIEVDUiByZXBvc2l0b3J5XCIsICgpID0+IHtcbiAgICAgIGNvbnN0IGZqYWxsQXBwID0gQXBwLmdldEFwcChcIkVjclRlc3RcIik7XG4gICAgICBjb25zdCBlY3IgPSBmamFsbEFwcC5nZXREZWZhdWx0Q29udGFpbmVyUmVnaXN0cnkoKTtcblxuICAgICAgZXhwZWN0KGVjcikudG9CZURlZmluZWQoKTtcblxuICAgICAgLy8gR2V0IHRoZSBuZXR3b3JrIHN0YWNrICh3aGVyZSBFQ1IgaXMgY3JlYXRlZClcbiAgICAgIGNvbnN0IG5ldHdvcmtTdGFjayA9IGZqYWxsQXBwLmdldERlZmF1bHROZXR3b3JrU3RhY2soKTtcbiAgICAgIGNvbnN0IHRlbXBsYXRlID0gVGVzdFV0aWxzLmdldFRlbXBsYXRlKG5ldHdvcmtTdGFjay5nZXRTdGFjaygpKTtcblxuICAgICAgLy8gVmVyaWZ5IEVDUiByZXBvc2l0b3J5IGlzIGNyZWF0ZWRcbiAgICAgIHRlbXBsYXRlLmhhc1Jlc291cmNlUHJvcGVydGllcyhcIkFXUzo6RUNSOjpSZXBvc2l0b3J5XCIsIHtcbiAgICAgICAgUmVwb3NpdG9yeU5hbWU6IFwiRWNyVGVzdEVjclwiXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoXCJBcHAgQ2xhc3NcIiwgKCkgPT4ge1xuICAgIGl0KFwic2hvdWxkIGJlIGEgc2luZ2xldG9uXCIsICgpID0+IHtcbiAgICAgIGNvbnN0IGFwcDEgPSBBcHAuZ2V0QXBwKFwiU2luZ2xldG9uVGVzdFwiKTtcbiAgICAgIGNvbnN0IGFwcDIgPSBBcHAuZ2V0QXBwKFwiU2luZ2xldG9uVGVzdFwiKTtcblxuICAgICAgZXhwZWN0KGFwcDEpLnRvQmUoYXBwMik7XG4gICAgfSk7XG5cbiAgICBpdChcInNob3VsZCBoYW5kbGUgZXhpc3RpbmcgVlBDIGNvbmZpZ3VyYXRpb25cIiwgKCkgPT4ge1xuICAgICAgY29uc3QgZmphbGxBcHAgPSBBcHAuZ2V0QXBwKFwiRXhpc3RpbmdWcGNUZXN0XCIpO1xuXG4gICAgICAvLyBDb25maWd1cmUgdG8gdXNlIGV4aXN0aW5nIFZQQ1xuICAgICAgZmphbGxBcHAudXNlRXhpc3RpbmdWcGMoXCJ2cGMtZXhpc3RpbmcxMjNcIik7XG5cbiAgICAgIC8vIFRoaXMgc2hvdWxkIG5vdCB0aHJvdyBhbiBlcnJvclxuICAgICAgZXhwZWN0KCgpID0+IGZqYWxsQXBwLmdldERlZmF1bHRWcGMoKSkubm90LnRvVGhyb3coKTtcbiAgICB9KTtcblxuICAgIGl0KFwic2hvdWxkIGNyZWF0ZSBzdGFja3Mgd2l0aCBwcm9wZXIgZGVwZW5kZW5jaWVzXCIsICgpID0+IHtcbiAgICAgIGNvbnN0IGZqYWxsQXBwID0gQXBwLmdldEFwcChcIkRlcGVuZGVuY3lUZXN0XCIpO1xuXG4gICAgICBjb25zdCBuZXR3b3JrU3RhY2sgPSBmamFsbEFwcC5nZXREZWZhdWx0TmV0d29ya1N0YWNrKCk7XG4gICAgICBjb25zdCBzdG9yYWdlU3RhY2sgPSBmamFsbEFwcC5nZXREZWZhdWx0U3RvcmFnZVN0YWNrKCk7XG4gICAgICBjb25zdCBjb21wdXRlU3RhY2sgPSBmamFsbEFwcC5nZXREZWZhdWx0Q29tcHV0ZVN0YWNrKCk7XG5cbiAgICAgIC8vIFN0b3JhZ2Ugc2hvdWxkIGRlcGVuZCBvbiBuZXR3b3JrXG4gICAgICBleHBlY3Qoc3RvcmFnZVN0YWNrLmdldFN0YWNrKCkuZGVwZW5kZW5jaWVzKS50b0NvbnRhaW4oXG4gICAgICAgIG5ldHdvcmtTdGFjay5nZXRTdGFjaygpXG4gICAgICApO1xuXG4gICAgICAvLyBDb21wdXRlIHNob3VsZCBkZXBlbmQgb24gYm90aCBuZXR3b3JrIGFuZCBzdG9yYWdlXG4gICAgICBleHBlY3QoY29tcHV0ZVN0YWNrLmdldFN0YWNrKCkuZGVwZW5kZW5jaWVzKS50b0NvbnRhaW4oXG4gICAgICAgIG5ldHdvcmtTdGFjay5nZXRTdGFjaygpXG4gICAgICApO1xuICAgICAgZXhwZWN0KGNvbXB1dGVTdGFjay5nZXRTdGFjaygpLmRlcGVuZGVuY2llcykudG9Db250YWluKFxuICAgICAgICBzdG9yYWdlU3RhY2suZ2V0U3RhY2soKVxuICAgICAgKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoXCJTbmFwc2hvdCBUZXN0c1wiLCAoKSA9PiB7XG4gICAgaXQoXCJzaG91bGQgbWF0Y2ggY29tcGxldGUgYXBwIGluZnJhc3RydWN0dXJlIHNuYXBzaG90XCIsICgpID0+IHtcbiAgICAgIGNvbnN0IGZqYWxsQXBwID0gQXBwLmdldEFwcChcIkNvbXBsZXRlVGVzdFwiKTtcblxuICAgICAgLy8gQ3JlYXRlIGFsbCBkZWZhdWx0IGluZnJhc3RydWN0dXJlXG4gICAgICBmamFsbEFwcC5nZXREZWZhdWx0VnBjKCk7XG4gICAgICBmamFsbEFwcC5nZXREZWZhdWx0Q29udGFpbmVyUmVnaXN0cnkoKTtcblxuICAgICAgY29uc3QgbmV0d29ya1N0YWNrID0gZmphbGxBcHAuZ2V0RGVmYXVsdE5ldHdvcmtTdGFjaygpO1xuICAgICAgY29uc3Qgc3RvcmFnZVN0YWNrID0gZmphbGxBcHAuZ2V0RGVmYXVsdFN0b3JhZ2VTdGFjaygpO1xuICAgICAgY29uc3QgY29tcHV0ZVN0YWNrID0gZmphbGxBcHAuZ2V0RGVmYXVsdENvbXB1dGVTdGFjaygpO1xuXG4gICAgICAvLyBTbmFwc2hvdCBlYWNoIHN0YWNrXG4gICAgICBjb25zdCBuZXR3b3JrVGVtcGxhdGUgPSBUZXN0VXRpbHMuc2FuaXRpc2VUZW1wbGF0ZShcbiAgICAgICAgVGVzdFV0aWxzLmdldFNuYXBzaG90VGVtcGxhdGUobmV0d29ya1N0YWNrLmdldFN0YWNrKCkpXG4gICAgICApO1xuICAgICAgY29uc3Qgc3RvcmFnZVRlbXBsYXRlID0gVGVzdFV0aWxzLnNhbml0aXNlVGVtcGxhdGUoXG4gICAgICAgIFRlc3RVdGlscy5nZXRTbmFwc2hvdFRlbXBsYXRlKHN0b3JhZ2VTdGFjay5nZXRTdGFjaygpKVxuICAgICAgKTtcbiAgICAgIGNvbnN0IGNvbXB1dGVUZW1wbGF0ZSA9IFRlc3RVdGlscy5zYW5pdGlzZVRlbXBsYXRlKFxuICAgICAgICBUZXN0VXRpbHMuZ2V0U25hcHNob3RUZW1wbGF0ZShjb21wdXRlU3RhY2suZ2V0U3RhY2soKSlcbiAgICAgICk7XG5cbiAgICAgIGV4cGVjdChuZXR3b3JrVGVtcGxhdGUpLnRvTWF0Y2hTbmFwc2hvdChcImNvbXBsZXRlLW5ldHdvcmstc3RhY2suanNvblwiKTtcbiAgICAgIGV4cGVjdChzdG9yYWdlVGVtcGxhdGUpLnRvTWF0Y2hTbmFwc2hvdChcImNvbXBsZXRlLXN0b3JhZ2Utc3RhY2suanNvblwiKTtcbiAgICAgIGV4cGVjdChjb21wdXRlVGVtcGxhdGUpLnRvTWF0Y2hTbmFwc2hvdChcImNvbXBsZXRlLWNvbXB1dGUtc3RhY2suanNvblwiKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoXCJJbnRlZ3JhdGlvbiBUZXN0c1wiLCAoKSA9PiB7XG4gICAgaXQoXCJzaG91bGQgaGFuZGxlIG11bHRpcGxlIGFwcHMgd2l0aG91dCBjb25mbGljdHNcIiwgKCkgPT4ge1xuICAgICAgLy8gUmVzZXQgc2luZ2xldG9uIHRvIHRlc3QgbXVsdGlwbGUgYXBwc1xuICAgICAgKEFwcCBhcyBhbnkpLmluc3RhbmNlID0gbnVsbDtcblxuICAgICAgY29uc3QgYXBwMSA9IEFwcC5nZXRBcHAoXCJBcHAxXCIpO1xuICAgICAgY29uc3QgYXBwMiA9IEFwcC5nZXRBcHAoXCJBcHAyXCIpO1xuXG4gICAgICAvLyBTaG91bGQgYmUgdGhlIHNhbWUgaW5zdGFuY2UgKHNpbmdsZXRvbilcbiAgICAgIGV4cGVjdChhcHAxKS50b0JlKGFwcDIpO1xuXG4gICAgICAvLyBCdXQgbmFtZSBzaG91bGQgYmUgZnJvbSBmaXJzdCBjcmVhdGlvblxuICAgICAgY29uc3QgdnBjMSA9IGFwcDEuZ2V0RGVmYXVsdFZwYygpO1xuICAgICAgZXhwZWN0KHZwYzEpLnRvQmVEZWZpbmVkKCk7XG4gICAgfSk7XG5cbiAgICBpdChcInNob3VsZCBhcHBseSB0YWdzIGNvcnJlY3RseSB0byByZXNvdXJjZXNcIiwgKCkgPT4ge1xuICAgICAgY29uc3QgZmphbGxBcHAgPSBBcHAuZ2V0QXBwKFwiVGFnVGVzdFwiKTtcbiAgICAgIGZqYWxsQXBwLmdldERlZmF1bHRWcGMoKTtcblxuICAgICAgY29uc3QgbmV0d29ya1N0YWNrID0gZmphbGxBcHAuZ2V0RGVmYXVsdE5ldHdvcmtTdGFjaygpO1xuICAgICAgY29uc3QgdGVtcGxhdGUgPSBUZXN0VXRpbHMuZ2V0VGVtcGxhdGUobmV0d29ya1N0YWNrLmdldFN0YWNrKCkpO1xuXG4gICAgICAvLyBSZXNvdXJjZXMgc2hvdWxkIGJlIGNyZWF0ZWQgKHRhZ3MgdmVyaWZpZWQgaW4gc25hcHNob3RzKVxuICAgICAgY29uc3QgcmVzb3VyY2VzID0gdGVtcGxhdGUudG9KU09OKCkuUmVzb3VyY2VzO1xuICAgICAgZXhwZWN0KE9iamVjdC5rZXlzKHJlc291cmNlcykubGVuZ3RoKS50b0JlR3JlYXRlclRoYW4oMCk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=
File without changes
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ describe("Simple Test", () => {
3
+ it("should pass basic test", () => {
4
+ expect(1 + 1).toBe(2);
5
+ });
6
+ it("should handle basic CDK imports", () => {
7
+ const { App } = require("aws-cdk-lib");
8
+ const app = new App();
9
+ expect(app).toBeDefined();
10
+ });
11
+ });
12
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2ltcGxlLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvX190ZXN0c19fL3NpbXBsZS50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxRQUFRLENBQUMsYUFBYSxFQUFFLEdBQUcsRUFBRTtJQUMzQixFQUFFLENBQUMsd0JBQXdCLEVBQUUsR0FBRyxFQUFFO1FBQ2hDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3hCLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLGlDQUFpQyxFQUFFLEdBQUcsRUFBRTtRQUN6QyxNQUFNLEVBQUUsR0FBRyxFQUFFLEdBQUcsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ3ZDLE1BQU0sR0FBRyxHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7UUFDdEIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQzVCLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJkZXNjcmliZShcIlNpbXBsZSBUZXN0XCIsICgpID0+IHtcbiAgaXQoXCJzaG91bGQgcGFzcyBiYXNpYyB0ZXN0XCIsICgpID0+IHtcbiAgICBleHBlY3QoMSArIDEpLnRvQmUoMik7XG4gIH0pO1xuXG4gIGl0KFwic2hvdWxkIGhhbmRsZSBiYXNpYyBDREsgaW1wb3J0c1wiLCAoKSA9PiB7XG4gICAgY29uc3QgeyBBcHAgfSA9IHJlcXVpcmUoXCJhd3MtY2RrLWxpYlwiKTtcbiAgICBjb25zdCBhcHAgPSBuZXcgQXBwKCk7XG4gICAgZXhwZWN0KGFwcCkudG9CZURlZmluZWQoKTtcbiAgfSk7XG59KTtcbiJdfQ==
@@ -0,0 +1,27 @@
1
+ import { Construct } from "constructs";
2
+ import { BackupVault, BackupPlan } from "../../resources/aws/backup";
3
+ import { BackupPlanRule } from "aws-cdk-lib/aws-backup";
4
+ export interface CustomBackupPlanConfig {
5
+ planName: string;
6
+ rules: BackupPlanRule[];
7
+ tagValue: string;
8
+ }
9
+ export interface DisasterRecoveryProps {
10
+ region: string;
11
+ accountId: string;
12
+ customBackupPlans?: CustomBackupPlanConfig[];
13
+ }
14
+ export declare class DisasterRecovery extends Construct {
15
+ readonly backupVault: BackupVault;
16
+ readonly backupPlans: {
17
+ standard: BackupPlan;
18
+ resilient: BackupPlan;
19
+ enterprise: BackupPlan;
20
+ };
21
+ readonly customBackupPlans?: BackupPlan[];
22
+ constructor(scope: Construct, id: string, props: DisasterRecoveryProps);
23
+ private createStandardBackupRules;
24
+ private createResilientBackupRules;
25
+ private createEnterpriseBackupRules;
26
+ private createCopyActions;
27
+ }