@cdklabs/cdk-appmod-catalog-blueprints 1.3.0 → 1.4.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 (48) hide show
  1. package/.jsii +4 -4
  2. package/README.md +76 -98
  3. package/lib/document-processing/adapter/queued-s3-adapter.js +1 -1
  4. package/lib/document-processing/agentic-document-processing.js +1 -1
  5. package/lib/document-processing/base-document-processing.js +1 -1
  6. package/lib/document-processing/bedrock-document-processing.js +1 -1
  7. package/lib/document-processing/default-document-processing-config.js +1 -1
  8. package/lib/document-processing/tests/agentic-document-processing.test.js +104 -60
  9. package/lib/document-processing/tests/base-document-processing-nag.test.d.ts +1 -0
  10. package/lib/document-processing/tests/base-document-processing-nag.test.js +161 -0
  11. package/lib/document-processing/tests/base-document-processing.test.d.ts +1 -0
  12. package/lib/document-processing/tests/base-document-processing.test.js +499 -0
  13. package/lib/document-processing/tests/bedrock-document-processing.test.js +212 -36
  14. package/lib/document-processing/tests/queued-s3-adapter-nag.test.d.ts +1 -0
  15. package/lib/document-processing/tests/queued-s3-adapter-nag.test.js +122 -0
  16. package/lib/document-processing/tests/queued-s3-adapter.test.d.ts +1 -0
  17. package/lib/document-processing/tests/queued-s3-adapter.test.js +276 -0
  18. package/lib/framework/agents/base-agent.js +1 -1
  19. package/lib/framework/agents/batch-agent.js +1 -1
  20. package/lib/framework/agents/default-agent-config.js +1 -1
  21. package/lib/framework/bedrock/bedrock.js +1 -1
  22. package/lib/framework/custom-resource/default-runtimes.js +1 -1
  23. package/lib/framework/foundation/access-log.js +1 -1
  24. package/lib/framework/foundation/eventbridge-broker.js +1 -1
  25. package/lib/framework/foundation/network.js +1 -1
  26. package/lib/framework/tests/access-log.test.d.ts +1 -0
  27. package/lib/framework/tests/access-log.test.js +146 -0
  28. package/lib/framework/tests/batch-agent.test.d.ts +1 -0
  29. package/lib/framework/tests/batch-agent.test.js +164 -0
  30. package/lib/framework/tests/bedrock.test.d.ts +1 -0
  31. package/lib/framework/tests/bedrock.test.js +68 -0
  32. package/lib/framework/tests/eventbridge-broker.test.d.ts +1 -0
  33. package/lib/framework/tests/eventbridge-broker.test.js +73 -0
  34. package/lib/framework/tests/framework-nag.test.d.ts +1 -0
  35. package/lib/framework/tests/framework-nag.test.js +155 -0
  36. package/lib/framework/tests/network.test.d.ts +1 -0
  37. package/lib/framework/tests/network.test.js +120 -0
  38. package/lib/tsconfig.tsbuildinfo +1 -1
  39. package/lib/utilities/data-loader.js +1 -1
  40. package/lib/utilities/lambda-iam-utils.js +1 -1
  41. package/lib/utilities/observability/cloudfront-distribution-observability-property-injector.js +1 -1
  42. package/lib/utilities/observability/default-observability-config.js +1 -1
  43. package/lib/utilities/observability/lambda-observability-property-injector.js +1 -1
  44. package/lib/utilities/observability/log-group-data-protection-utils.js +1 -1
  45. package/lib/utilities/observability/powertools-config.js +1 -1
  46. package/lib/utilities/observability/state-machine-observability-property-injector.js +1 -1
  47. package/lib/webapp/frontend-construct.js +1 -1
  48. package/package.json +8 -8
@@ -0,0 +1,155 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const path = require("path");
4
+ const aws_cdk_lib_1 = require("aws-cdk-lib");
5
+ const assertions_1 = require("aws-cdk-lib/assertions");
6
+ const aws_bedrock_1 = require("aws-cdk-lib/aws-bedrock");
7
+ const aws_s3_assets_1 = require("aws-cdk-lib/aws-s3-assets");
8
+ const cdk_nag_1 = require("cdk-nag");
9
+ const batch_agent_1 = require("../agents/batch-agent");
10
+ const access_log_1 = require("../foundation/access-log");
11
+ const eventbridge_broker_1 = require("../foundation/eventbridge-broker");
12
+ const network_1 = require("../foundation/network");
13
+ const testModel = aws_bedrock_1.FoundationModelIdentifier.ANTHROPIC_CLAUDE_3_SONNET_20240229_V1_0;
14
+ describe('Framework CDK Nag Tests', () => {
15
+ describe('AccessLog', () => {
16
+ test('passes CDK Nag checks', () => {
17
+ const stack = new aws_cdk_lib_1.Stack(undefined, 'TestStack', {
18
+ env: { account: '123456789012', region: 'us-east-1' },
19
+ });
20
+ new access_log_1.AccessLog(stack, 'AccessLog');
21
+ aws_cdk_lib_1.Aspects.of(stack).add(new cdk_nag_1.AwsSolutionsChecks({ verbose: true }));
22
+ cdk_nag_1.NagSuppressions.addStackSuppressions(stack, [
23
+ {
24
+ id: 'AwsSolutions-S1',
25
+ reason: 'Access log bucket does not need its own access logging to avoid circular dependency',
26
+ },
27
+ ]);
28
+ const errors = assertions_1.Annotations.fromStack(stack).findError('*', assertions_1.Match.stringLikeRegexp('AwsSolutions-.*'));
29
+ expect(errors).toHaveLength(0);
30
+ });
31
+ });
32
+ describe('Network', () => {
33
+ test('passes CDK Nag checks for public VPC', () => {
34
+ const stack = new aws_cdk_lib_1.Stack();
35
+ new network_1.Network(stack, 'Network');
36
+ aws_cdk_lib_1.Aspects.of(stack).add(new cdk_nag_1.AwsSolutionsChecks({ verbose: true }));
37
+ cdk_nag_1.NagSuppressions.addStackSuppressions(stack, [
38
+ {
39
+ id: 'AwsSolutions-VPC7',
40
+ reason: 'VPC Flow Logs are optional and should be enabled by users based on requirements',
41
+ },
42
+ ]);
43
+ const errors = assertions_1.Annotations.fromStack(stack).findError('*', assertions_1.Match.stringLikeRegexp('AwsSolutions-.*'));
44
+ expect(errors).toHaveLength(0);
45
+ });
46
+ test('passes CDK Nag checks for private VPC', () => {
47
+ const stack = new aws_cdk_lib_1.Stack();
48
+ new network_1.Network(stack, 'Network', { private: true });
49
+ aws_cdk_lib_1.Aspects.of(stack).add(new cdk_nag_1.AwsSolutionsChecks({ verbose: true }));
50
+ cdk_nag_1.NagSuppressions.addStackSuppressions(stack, [
51
+ {
52
+ id: 'AwsSolutions-VPC7',
53
+ reason: 'VPC Flow Logs are optional and should be enabled by users based on requirements',
54
+ },
55
+ ]);
56
+ const errors = assertions_1.Annotations.fromStack(stack).findError('*', assertions_1.Match.stringLikeRegexp('AwsSolutions-.*'));
57
+ expect(errors).toHaveLength(0);
58
+ });
59
+ });
60
+ describe('EventbridgeBroker', () => {
61
+ test('passes CDK Nag checks', () => {
62
+ const stack = new aws_cdk_lib_1.Stack();
63
+ new eventbridge_broker_1.EventbridgeBroker(stack, 'Broker', {
64
+ eventSource: 'test.source',
65
+ });
66
+ aws_cdk_lib_1.Aspects.of(stack).add(new cdk_nag_1.AwsSolutionsChecks({ verbose: true }));
67
+ const errors = assertions_1.Annotations.fromStack(stack).findError('*', assertions_1.Match.stringLikeRegexp('AwsSolutions-.*'));
68
+ expect(errors).toHaveLength(0);
69
+ });
70
+ });
71
+ describe('BatchAgent', () => {
72
+ test('passes CDK Nag checks', () => {
73
+ const stack = new aws_cdk_lib_1.Stack(undefined, 'TestStack', {
74
+ env: { account: '123456789012', region: 'us-east-1' },
75
+ });
76
+ const systemPrompt = new aws_s3_assets_1.Asset(stack, 'SystemPrompt', {
77
+ path: path.join(__dirname, '../agents/resources/default-strands-agent/batch.py'),
78
+ });
79
+ new batch_agent_1.BatchAgent(stack, 'Agent', {
80
+ agentName: 'TestAgent',
81
+ prompt: 'Test prompt',
82
+ agentDefinition: {
83
+ bedrockModel: { fmModelId: testModel },
84
+ systemPrompt,
85
+ },
86
+ });
87
+ aws_cdk_lib_1.Aspects.of(stack).add(new cdk_nag_1.AwsSolutionsChecks({ verbose: true }));
88
+ cdk_nag_1.NagSuppressions.addStackSuppressions(stack, [
89
+ {
90
+ id: 'AwsSolutions-IAM4',
91
+ reason: 'Managed policies are acceptable for Lambda execution role',
92
+ appliesTo: ['Policy::arn:<AWS::Partition>:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole'],
93
+ },
94
+ {
95
+ id: 'AwsSolutions-IAM5',
96
+ reason: 'Wildcard permissions required for S3 asset access, Bedrock model invocation, and CloudWatch Logs',
97
+ appliesTo: [
98
+ 'Action::s3:GetObject*',
99
+ 'Action::s3:GetBucket*',
100
+ 'Action::s3:List*',
101
+ 'Resource::*',
102
+ 'Resource::arn:aws:bedrock:*::foundation-model/anthropic.claude-3-sonnet-20240229-v1:0',
103
+ 'Resource::arn:aws:logs:us-east-1:123456789012:log-group:/aws/lambda/TestAgent-teststackagentaa2af0c4:*',
104
+ ],
105
+ },
106
+ {
107
+ id: 'AwsSolutions-L1',
108
+ reason: 'Lambda runtime is managed by construct defaults',
109
+ },
110
+ ]);
111
+ const errors = assertions_1.Annotations.fromStack(stack).findError('*', assertions_1.Match.stringLikeRegexp('AwsSolutions-.*'));
112
+ expect(errors).toHaveLength(0);
113
+ });
114
+ test('passes CDK Nag checks with VPC configuration', () => {
115
+ const stack = new aws_cdk_lib_1.Stack(undefined, 'TestStack', {
116
+ env: { account: '123456789012', region: 'us-east-1' },
117
+ });
118
+ const network = new network_1.Network(stack, 'Network');
119
+ const systemPrompt = new aws_s3_assets_1.Asset(stack, 'SystemPrompt', {
120
+ path: path.join(__dirname, '../agents/resources/default-strands-agent/batch.py'),
121
+ });
122
+ new batch_agent_1.BatchAgent(stack, 'Agent', {
123
+ agentName: 'TestAgent',
124
+ prompt: 'Test prompt',
125
+ network,
126
+ agentDefinition: {
127
+ bedrockModel: { fmModelId: testModel },
128
+ systemPrompt,
129
+ },
130
+ });
131
+ aws_cdk_lib_1.Aspects.of(stack).add(new cdk_nag_1.AwsSolutionsChecks({ verbose: true }));
132
+ cdk_nag_1.NagSuppressions.addStackSuppressions(stack, [
133
+ {
134
+ id: 'AwsSolutions-IAM4',
135
+ reason: 'Managed policies are acceptable for Lambda execution role',
136
+ },
137
+ {
138
+ id: 'AwsSolutions-IAM5',
139
+ reason: 'Wildcard permissions required for VPC, S3, and Bedrock access',
140
+ },
141
+ {
142
+ id: 'AwsSolutions-L1',
143
+ reason: 'Lambda runtime is managed by construct defaults',
144
+ },
145
+ {
146
+ id: 'AwsSolutions-VPC7',
147
+ reason: 'VPC Flow Logs are optional',
148
+ },
149
+ ]);
150
+ const errors = assertions_1.Annotations.fromStack(stack).findError('*', assertions_1.Match.stringLikeRegexp('AwsSolutions-.*'));
151
+ expect(errors).toHaveLength(0);
152
+ });
153
+ });
154
+ });
155
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnJhbWV3b3JrLW5hZy50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdXNlLWNhc2VzL2ZyYW1ld29yay90ZXN0cy9mcmFtZXdvcmstbmFnLnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSw2QkFBNkI7QUFDN0IsNkNBQTZDO0FBQzdDLHVEQUE0RDtBQUM1RCx5REFBb0U7QUFDcEUsNkRBQWtEO0FBQ2xELHFDQUE4RDtBQUM5RCx1REFBbUQ7QUFDbkQseURBQXFEO0FBQ3JELHlFQUFxRTtBQUNyRSxtREFBZ0Q7QUFFaEQsTUFBTSxTQUFTLEdBQUcsdUNBQXlCLENBQUMsdUNBQXVDLENBQUM7QUFFcEYsUUFBUSxDQUFDLHlCQUF5QixFQUFFLEdBQUcsRUFBRTtJQUN2QyxRQUFRLENBQUMsV0FBVyxFQUFFLEdBQUcsRUFBRTtRQUN6QixJQUFJLENBQUMsdUJBQXVCLEVBQUUsR0FBRyxFQUFFO1lBQ2pDLE1BQU0sS0FBSyxHQUFHLElBQUksbUJBQUssQ0FBQyxTQUFTLEVBQUUsV0FBVyxFQUFFO2dCQUM5QyxHQUFHLEVBQUUsRUFBRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUU7YUFDdEQsQ0FBQyxDQUFDO1lBRUgsSUFBSSxzQkFBUyxDQUFDLEtBQUssRUFBRSxXQUFXLENBQUMsQ0FBQztZQUVsQyxxQkFBTyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSw0QkFBa0IsQ0FBQyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFFakUseUJBQWUsQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLEVBQUU7Z0JBQzFDO29CQUNFLEVBQUUsRUFBRSxpQkFBaUI7b0JBQ3JCLE1BQU0sRUFBRSxxRkFBcUY7aUJBQzlGO2FBQ0YsQ0FBQyxDQUFDO1lBRUgsTUFBTSxNQUFNLEdBQUcsd0JBQVcsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENB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YjthQUNGLENBQUMsQ0FBQztZQUVILHFCQUFPLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLDRCQUFrQixDQUFDLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztZQUVqRSx5QkFBZSxDQUFDLG9CQUFvQixDQUFDLEtBQUssRUFBRTtnQkFDMUM7b0JBQ0UsRUFBRSxFQUFFLG1CQUFtQjtvQkFDdkIsTUFBTSxFQUFFLDJEQUEyRDtpQkFDcEU7Z0JBQ0Q7b0JBQ0UsRUFBRSxFQUFFLG1CQUFtQjtvQkFDdkIsTUFBTSxFQUFFLCtEQUErRDtpQkFDeEU7Z0JBQ0Q7b0JBQ0UsRUFBRSxFQUFFLGlCQUFpQjtvQkFDckIsTUFBTSxFQUFFLGlEQUFpRDtpQkFDMUQ7Z0JBQ0Q7b0JBQ0UsRUFBRSxFQUFFLG1CQUFtQjtvQkFDdkIsTUFBTSxFQUFFLDRCQUE0QjtpQkFDckM7YUFDRixDQUFDLENBQUM7WUFFSCxNQUFNLE1BQU0sR0FBRyx3QkFBVyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLGtCQUFLLENBQUMsZ0JBQWdCLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDO1lBQ3RHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDakMsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IEFzcGVjdHMsIFN0YWNrIH0gZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0IHsgQW5ub3RhdGlvbnMsIE1hdGNoIH0gZnJvbSAnYXdzLWNkay1saWIvYXNzZXJ0aW9ucyc7XG5pbXBvcnQgeyBGb3VuZGF0aW9uTW9kZWxJZGVudGlmaWVyIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWJlZHJvY2snO1xuaW1wb3J0IHsgQXNzZXQgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtczMtYXNzZXRzJztcbmltcG9ydCB7IEF3c1NvbHV0aW9uc0NoZWNrcywgTmFnU3VwcHJlc3Npb25zIH0gZnJvbSAnY2RrLW5hZyc7XG5pbXBvcnQgeyBCYXRjaEFnZW50IH0gZnJvbSAnLi4vYWdlbnRzL2JhdGNoLWFnZW50JztcbmltcG9ydCB7IEFjY2Vzc0xvZyB9IGZyb20gJy4uL2ZvdW5kYXRpb24vYWNjZXNzLWxvZyc7XG5pbXBvcnQgeyBFdmVudGJyaWRnZUJyb2tlciB9IGZyb20gJy4uL2ZvdW5kYXRpb24vZXZlbnRicmlkZ2UtYnJva2VyJztcbmltcG9ydCB7IE5ldHdvcmsgfSBmcm9tICcuLi9mb3VuZGF0aW9uL25ldHdvcmsnO1xuXG5jb25zdCB0ZXN0TW9kZWwgPSBGb3VuZGF0aW9uTW9kZWxJZGVudGlmaWVyLkFOVEhST1BJQ19DTEFVREVfM19TT05ORVRfMjAyNDAyMjlfVjFfMDtcblxuZGVzY3JpYmUoJ0ZyYW1ld29yayBDREsgTmFnIFRlc3RzJywgKCkgPT4ge1xuICBkZXNjcmliZSgnQWNjZXNzTG9nJywgKCkgPT4ge1xuICAgIHRlc3QoJ3Bhc3NlcyBDREsgTmFnIGNoZWNrcycsICgpID0+IHtcbiAgICAgIGNvbnN0IHN0YWNrID0gbmV3IFN0YWNrKHVuZGVmaW5lZCwgJ1Rlc3RTdGFjaycsIHtcbiAgICAgICAgZW52OiB7IGFjY291bnQ6ICcxMjM0NTY3ODkwMTInLCByZWdpb246ICd1cy1lYXN0LTEnIH0sXG4gICAgICB9KTtcblxuICAgICAgbmV3IEFjY2Vzc0xvZyhzdGFjaywgJ0FjY2Vzc0xvZycpO1xuXG4gICAgICBBc3BlY3RzLm9mKHN0YWNrKS5hZGQobmV3IEF3c1NvbHV0aW9uc0NoZWNrcyh7IHZlcmJvc2U6IHRydWUgfSkpO1xuXG4gICAgICBOYWdTdXBwcmVzc2lvbnMuYWRkU3RhY2tTdXBwcmVzc2lvbnMoc3RhY2ssIFtcbiAgICAgICAge1xuICAgICAgICAgIGlkOiAnQXdzU29sdXRpb25zLVMxJyxcbiAgICAgICAgICByZWFzb246ICdBY2Nlc3MgbG9nIGJ1Y2tldCBkb2VzIG5vdCBuZWVkIGl0cyBvd24gYWNjZXNzIGxvZ2dpbmcgdG8gYXZvaWQgY2lyY3VsYXIgZGVwZW5kZW5jeScsXG4gICAgICAgIH0sXG4gICAgICBdKTtcblxuICAgICAgY29uc3QgZXJyb3JzID0gQW5ub3RhdGlvbnMuZnJvbVN0YWNrKHN0YWNrKS5maW5kRXJyb3IoJyonLCBNYXRjaC5zdHJpbmdMaWtlUmVnZXhwKCdBd3NTb2x1dGlvbnMtLionKSk7XG4gICAgICBleHBlY3QoZXJyb3JzKS50b0hhdmVMZW5ndGgoMCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdOZXR3b3JrJywgKCkgPT4ge1xuICAgIHRlc3QoJ3Bhc3NlcyBDREsgTmFnIGNoZWNrcyBmb3IgcHVibGljIFZQQycsICgpID0+IHtcbiAgICAgIGNvbnN0IHN0YWNrID0gbmV3IFN0YWNrKCk7XG4gICAgICBuZXcgTmV0d29yayhzdGFjaywgJ05ldHdvcmsnKTtcblxuICAgICAgQXNwZWN0cy5vZihzdGFjaykuYWRkKG5ldyBBd3NTb2x1dGlvbnNDaGVja3MoeyB2ZXJib3NlOiB0cnVlIH0pKTtcblxuICAgICAgTmFnU3VwcHJlc3Npb25zLmFkZFN0YWNrU3VwcHJlc3Npb25zKHN0YWNrLCBbXG4gICAgICAgIHtcbiAgICAgICAgICBpZDogJ0F3c1NvbHV0aW9ucy1WUEM3JyxcbiAgICAgICAgICByZWFzb246ICdWUEMgRmxvdyBMb2dzIGFyZSBvcHRpb25hbCBhbmQgc2hvdWxkIGJlIGVuYWJsZWQgYnkgdXNlcnMgYmFzZWQgb24gcmVxdWlyZW1lbnRzJyxcbiAgICAgICAgfSxcbiAgICAgIF0pO1xuXG4gICAgICBjb25zdCBlcnJvcnMgPSBBbm5vdGF0aW9ucy5mcm9tU3RhY2soc3RhY2spLmZpbmRFcnJvcignKicsIE1hdGNoLnN0cmluZ0xpa2VSZWdleHAoJ0F3c1NvbHV0aW9ucy0uKicpKTtcbiAgICAgIGV4cGVjdChlcnJvcnMpLnRvSGF2ZUxlbmd0aCgwKTtcbiAgICB9KTtcblxuICAgIHRlc3QoJ3Bhc3NlcyBDREsgTmFnIGNoZWNrcyBmb3IgcHJpdmF0ZSBWUEMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBzdGFjayA9IG5ldyBTdGFjaygpO1xuICAgICAgbmV3IE5ldHdvcmsoc3RhY2ssICdOZXR3b3JrJywgeyBwcml2YXRlOiB0cnVlIH0pO1xuXG4gICAgICBBc3BlY3RzLm9mKHN0YWNrKS5hZGQobmV3IEF3c1NvbHV0aW9uc0NoZWNrcyh7IHZlcmJvc2U6IHRydWUgfSkpO1xuXG4gICAgICBOYWdTdXBwcmVzc2lvbnMuYWRkU3RhY2tTdXBwcmVzc2lvbnMoc3RhY2ssIFtcbiAgICAgICAge1xuICAgICAgICAgIGlkOiAnQXdzU29sdXRpb25zLVZQQzcnLFxuICAgICAgICAgIHJlYXNvbjogJ1ZQQyBGbG93IExvZ3MgYXJlIG9wdGlvbmFsIGFuZCBzaG91bGQgYmUgZW5hYmxlZCBieSB1c2VycyBiYXNlZCBvbiByZXF1aXJlbWVudHMnLFxuICAgICAgICB9LFxuICAgICAgXSk7XG5cbiAgICAgIGNvbnN0IGVycm9ycyA9IEFubm90YXRpb25zLmZyb21TdGFjayhzdGFjaykuZmluZEVycm9yKCcqJywgTWF0Y2guc3RyaW5nTGlrZVJlZ2V4cCgnQXdzU29sdXRpb25zLS4qJykpO1xuICAgICAgZXhwZWN0KGVycm9ycykudG9IYXZlTGVuZ3RoKDApO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnRXZlbnRicmlkZ2VCcm9rZXInLCAoKSA9PiB7XG4gICAgdGVzdCgncGFzc2VzIENESyBOYWcgY2hlY2tzJywgKCkgPT4ge1xuICAgICAgY29uc3Qgc3RhY2sgPSBuZXcgU3RhY2soKTtcbiAgICAgIG5ldyBFdmVudGJyaWRnZUJyb2tlcihzdGFjaywgJ0Jyb2tlcicsIHtcbiAgICAgICAgZXZlbnRTb3VyY2U6ICd0ZXN0LnNvdXJjZScsXG4gICAgICB9KTtcblxuICAgICAgQXNwZWN0cy5vZihzdGFjaykuYWRkKG5ldyBBd3NTb2x1dGlvbnNDaGVja3MoeyB2ZXJib3NlOiB0cnVlIH0pKTtcbiAgICAgIGNvbnN0IGVycm9ycyA9IEFubm90YXRpb25zLmZyb21TdGFjayhzdGFjaykuZmluZEVycm9yKCcqJywgTWF0Y2guc3RyaW5nTGlrZVJlZ2V4cCgnQXdzU29sdXRpb25zLS4qJykpO1xuICAgICAgZXhwZWN0KGVycm9ycykudG9IYXZlTGVuZ3RoKDApO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnQmF0Y2hBZ2VudCcsICgpID0+IHtcbiAgICB0ZXN0KCdwYXNzZXMgQ0RLIE5hZyBjaGVja3MnLCAoKSA9PiB7XG4gICAgICBjb25zdCBzdGFjayA9IG5ldyBTdGFjayh1bmRlZmluZWQsICdUZXN0U3RhY2snLCB7XG4gICAgICAgIGVudjogeyBhY2NvdW50OiAnMTIzNDU2Nzg5MDEyJywgcmVnaW9uOiAndXMtZWFzdC0xJyB9LFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHN5c3RlbVByb21wdCA9IG5ldyBBc3NldChzdGFjaywgJ1N5c3RlbVByb21wdCcsIHtcbiAgICAgICAgcGF0aDogcGF0aC5qb2luKF9fZGlybmFtZSwgJy4uL2FnZW50cy9yZXNvdXJjZXMvZGVmYXVsdC1zdHJhbmRzLWFnZW50L2JhdGNoLnB5JyksXG4gICAgICB9KTtcblxuICAgICAgbmV3IEJhdGNoQWdlbnQoc3RhY2ssICdBZ2VudCcsIHtcbiAgICAgICAgYWdlbnROYW1lOiAnVGVzdEFnZW50JyxcbiAgICAgICAgcHJvbXB0OiAnVGVzdCBwcm9tcHQnLFxuICAgICAgICBhZ2VudERlZmluaXRpb246IHtcbiAgICAgICAgICBiZWRyb2NrTW9kZWw6IHsgZm1Nb2RlbElkOiB0ZXN0TW9kZWwgfSxcbiAgICAgICAgICBzeXN0ZW1Qcm9tcHQsXG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgQXNwZWN0cy5vZihzdGFjaykuYWRkKG5ldyBBd3NTb2x1dGlvbnNDaGVja3MoeyB2ZXJib3NlOiB0cnVlIH0pKTtcblxuICAgICAgTmFnU3VwcHJlc3Npb25zLmFkZFN0YWNrU3VwcHJlc3Npb25zKHN0YWNrLCBbXG4gICAgICAgIHtcbiAgICAgICAgICBpZDogJ0F3c1NvbHV0aW9ucy1JQU00JyxcbiAgICAgICAgICByZWFzb246ICdNYW5hZ2VkIHBvbGljaWVzIGFyZSBhY2NlcHRhYmxlIGZvciBMYW1iZGEgZXhlY3V0aW9uIHJvbGUnLFxuICAgICAgICAgIGFwcGxpZXNUbzogWydQb2xpY3k6OmFybjo8QVdTOjpQYXJ0aXRpb24+OmlhbTo6YXdzOnBvbGljeS9zZXJ2aWNlLXJvbGUvQVdTTGFtYmRhQmFzaWNFeGVjdXRpb25Sb2xlJ10sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBpZDogJ0F3c1NvbHV0aW9ucy1JQU01JyxcbiAgICAgICAgICByZWFzb246ICdXaWxkY2FyZCBwZXJtaXNzaW9ucyByZXF1aXJlZCBmb3IgUzMgYXNzZXQgYWNjZXNzLCBCZWRyb2NrIG1vZGVsIGludm9jYXRpb24sIGFuZCBDbG91ZFdhdGNoIExvZ3MnLFxuICAgICAgICAgIGFwcGxpZXNUbzogW1xuICAgICAgICAgICAgJ0FjdGlvbjo6czM6R2V0T2JqZWN0KicsXG4gICAgICAgICAgICAnQWN0aW9uOjpzMzpHZXRCdWNrZXQqJyxcbiAgICAgICAgICAgICdBY3Rpb246OnMzOkxpc3QqJyxcbiAgICAgICAgICAgICdSZXNvdXJjZTo6KicsXG4gICAgICAgICAgICAnUmVzb3VyY2U6OmFybjphd3M6YmVkcm9jazoqOjpmb3VuZGF0aW9uLW1vZGVsL2FudGhyb3BpYy5jbGF1ZGUtMy1zb25uZXQtMjAyNDAyMjktdjE6MCcsXG4gICAgICAgICAgICAnUmVzb3VyY2U6OmFybjphd3M6bG9nczp1cy1lYXN0LTE6MTIzNDU2Nzg5MDEyOmxvZy1ncm91cDovYXdzL2xhbWJkYS9UZXN0QWdlbnQtdGVzdHN0YWNrYWdlbnRhYTJhZjBjNDoqJyxcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgaWQ6ICdBd3NTb2x1dGlvbnMtTDEnLFxuICAgICAgICAgIHJlYXNvbjogJ0xhbWJkYSBydW50aW1lIGlzIG1hbmFnZWQgYnkgY29uc3RydWN0IGRlZmF1bHRzJyxcbiAgICAgICAgfSxcbiAgICAgIF0pO1xuXG4gICAgICBjb25zdCBlcnJvcnMgPSBBbm5vdGF0aW9ucy5mcm9tU3RhY2soc3RhY2spLmZpbmRFcnJvcignKicsIE1hdGNoLnN0cmluZ0xpa2VSZWdleHAoJ0F3c1NvbHV0aW9ucy0uKicpKTtcbiAgICAgIGV4cGVjdChlcnJvcnMpLnRvSGF2ZUxlbmd0aCgwKTtcbiAgICB9KTtcblxuICAgIHRlc3QoJ3Bhc3NlcyBDREsgTmFnIGNoZWNrcyB3aXRoIFZQQyBjb25maWd1cmF0aW9uJywgKCkgPT4ge1xuICAgICAgY29uc3Qgc3RhY2sgPSBuZXcgU3RhY2sodW5kZWZpbmVkLCAnVGVzdFN0YWNrJywge1xuICAgICAgICBlbnY6IHsgYWNjb3VudDogJzEyMzQ1Njc4OTAxMicsIHJlZ2lvbjogJ3VzLWVhc3QtMScgfSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBuZXR3b3JrID0gbmV3IE5ldHdvcmsoc3RhY2ssICdOZXR3b3JrJyk7XG4gICAgICBjb25zdCBzeXN0ZW1Qcm9tcHQgPSBuZXcgQXNzZXQoc3RhY2ssICdTeXN0ZW1Qcm9tcHQnLCB7XG4gICAgICAgIHBhdGg6IHBhdGguam9pbihfX2Rpcm5hbWUsICcuLi9hZ2VudHMvcmVzb3VyY2VzL2RlZmF1bHQtc3RyYW5kcy1hZ2VudC9iYXRjaC5weScpLFxuICAgICAgfSk7XG5cbiAgICAgIG5ldyBCYXRjaEFnZW50KHN0YWNrLCAnQWdlbnQnLCB7XG4gICAgICAgIGFnZW50TmFtZTogJ1Rlc3RBZ2VudCcsXG4gICAgICAgIHByb21wdDogJ1Rlc3QgcHJvbXB0JyxcbiAgICAgICAgbmV0d29yayxcbiAgICAgICAgYWdlbnREZWZpbml0aW9uOiB7XG4gICAgICAgICAgYmVkcm9ja01vZGVsOiB7IGZtTW9kZWxJZDogdGVzdE1vZGVsIH0sXG4gICAgICAgICAgc3lzdGVtUHJvbXB0LFxuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIEFzcGVjdHMub2Yoc3RhY2spLmFkZChuZXcgQXdzU29sdXRpb25zQ2hlY2tzKHsgdmVyYm9zZTogdHJ1ZSB9KSk7XG5cbiAgICAgIE5hZ1N1cHByZXNzaW9ucy5hZGRTdGFja1N1cHByZXNzaW9ucyhzdGFjaywgW1xuICAgICAgICB7XG4gICAgICAgICAgaWQ6ICdBd3NTb2x1dGlvbnMtSUFNNCcsXG4gICAgICAgICAgcmVhc29uOiAnTWFuYWdlZCBwb2xpY2llcyBhcmUgYWNjZXB0YWJsZSBmb3IgTGFtYmRhIGV4ZWN1dGlvbiByb2xlJyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGlkOiAnQXdzU29sdXRpb25zLUlBTTUnLFxuICAgICAgICAgIHJlYXNvbjogJ1dpbGRjYXJkIHBlcm1pc3Npb25zIHJlcXVpcmVkIGZvciBWUEMsIFMzLCBhbmQgQmVkcm9jayBhY2Nlc3MnLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgaWQ6ICdBd3NTb2x1dGlvbnMtTDEnLFxuICAgICAgICAgIHJlYXNvbjogJ0xhbWJkYSBydW50aW1lIGlzIG1hbmFnZWQgYnkgY29uc3RydWN0IGRlZmF1bHRzJyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGlkOiAnQXdzU29sdXRpb25zLVZQQzcnLFxuICAgICAgICAgIHJlYXNvbjogJ1ZQQyBGbG93IExvZ3MgYXJlIG9wdGlvbmFsJyxcbiAgICAgICAgfSxcbiAgICAgIF0pO1xuXG4gICAgICBjb25zdCBlcnJvcnMgPSBBbm5vdGF0aW9ucy5mcm9tU3RhY2soc3RhY2spLmZpbmRFcnJvcignKicsIE1hdGNoLnN0cmluZ0xpa2VSZWdleHAoJ0F3c1NvbHV0aW9ucy0uKicpKTtcbiAgICAgIGV4cGVjdChlcnJvcnMpLnRvSGF2ZUxlbmd0aCgwKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,120 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const aws_cdk_lib_1 = require("aws-cdk-lib");
4
+ const assertions_1 = require("aws-cdk-lib/assertions");
5
+ const aws_ec2_1 = require("aws-cdk-lib/aws-ec2");
6
+ const network_1 = require("../foundation/network");
7
+ describe('Network', () => {
8
+ let stack;
9
+ beforeEach(() => {
10
+ stack = new aws_cdk_lib_1.Stack();
11
+ });
12
+ test('creates VPC with default configuration', () => {
13
+ new network_1.Network(stack, 'Network');
14
+ const template = assertions_1.Template.fromStack(stack);
15
+ template.resourceCountIs('AWS::EC2::VPC', 1);
16
+ template.hasResourceProperties('AWS::EC2::VPC', {
17
+ CidrBlock: '10.0.0.0/16',
18
+ });
19
+ });
20
+ test('creates public, private, and isolated subnets by default', () => {
21
+ new network_1.Network(stack, 'Network');
22
+ const template = assertions_1.Template.fromStack(stack);
23
+ const subnets = template.findResources('AWS::EC2::Subnet');
24
+ expect(Object.keys(subnets).length).toBeGreaterThan(0);
25
+ const subnetTags = Object.values(subnets).map((s) => s.Properties.Tags?.find((t) => t.Key === 'aws-cdk:subnet-name')?.Value);
26
+ expect(subnetTags).toContain('Public');
27
+ expect(subnetTags).toContain('Private');
28
+ expect(subnetTags).toContain('Isolated');
29
+ });
30
+ test('creates NAT gateway by default', () => {
31
+ new network_1.Network(stack, 'Network');
32
+ const template = assertions_1.Template.fromStack(stack);
33
+ template.resourceCountIs('AWS::EC2::NatGateway', 1);
34
+ });
35
+ test('creates private VPC without NAT gateway', () => {
36
+ new network_1.Network(stack, 'Network', { private: true });
37
+ const template = assertions_1.Template.fromStack(stack);
38
+ template.resourceCountIs('AWS::EC2::NatGateway', 0);
39
+ template.resourceCountIs('AWS::EC2::InternetGateway', 0);
40
+ });
41
+ test('creates only isolated subnets for private VPC', () => {
42
+ new network_1.Network(stack, 'Network', { private: true });
43
+ const template = assertions_1.Template.fromStack(stack);
44
+ const subnets = template.findResources('AWS::EC2::Subnet');
45
+ const subnetTags = Object.values(subnets).map((s) => s.Properties.Tags?.find((t) => t.Key === 'aws-cdk:subnet-name')?.Value);
46
+ expect(subnetTags.every((tag) => tag === 'Isolated')).toBe(true);
47
+ });
48
+ test('uses custom CIDR block', () => {
49
+ new network_1.Network(stack, 'Network', {
50
+ ipAddresses: aws_ec2_1.IpAddresses.cidr('172.16.0.0/16'),
51
+ });
52
+ const template = assertions_1.Template.fromStack(stack);
53
+ template.hasResourceProperties('AWS::EC2::VPC', {
54
+ CidrBlock: '172.16.0.0/16',
55
+ });
56
+ });
57
+ test('configures custom NAT gateways count', () => {
58
+ new network_1.Network(stack, 'Network', { natGateways: 2 });
59
+ const template = assertions_1.Template.fromStack(stack);
60
+ template.resourceCountIs('AWS::EC2::NatGateway', 2);
61
+ });
62
+ test('sets custom VPC name', () => {
63
+ new network_1.Network(stack, 'Network', { vpcName: 'MyCustomVPC' });
64
+ const template = assertions_1.Template.fromStack(stack);
65
+ template.hasResourceProperties('AWS::EC2::VPC', {
66
+ Tags: assertions_1.Match.arrayWith([
67
+ { Key: 'Name', Value: 'MyCustomVPC' },
68
+ ]),
69
+ });
70
+ });
71
+ test('creates interface endpoint with security group', () => {
72
+ const network = new network_1.Network(stack, 'Network');
73
+ network.createServiceEndpoint('Lambda', aws_ec2_1.InterfaceVpcEndpointAwsService.LAMBDA);
74
+ const template = assertions_1.Template.fromStack(stack);
75
+ template.resourceCountIs('AWS::EC2::VPCEndpoint', 1);
76
+ template.hasResourceProperties('AWS::EC2::VPCEndpoint', {
77
+ VpcEndpointType: 'Interface',
78
+ });
79
+ template.resourceCountIs('AWS::EC2::SecurityGroup', 1);
80
+ });
81
+ test('creates S3 gateway endpoint when S3 service requested', () => {
82
+ const network = new network_1.Network(stack, 'Network');
83
+ network.createServiceEndpoint('S3', aws_ec2_1.InterfaceVpcEndpointAwsService.S3);
84
+ const template = assertions_1.Template.fromStack(stack);
85
+ template.hasResourceProperties('AWS::EC2::VPCEndpoint', {
86
+ ServiceName: assertions_1.Match.objectLike({
87
+ 'Fn::Join': assertions_1.Match.arrayWith([
88
+ assertions_1.Match.arrayWith([assertions_1.Match.stringLikeRegexp('s3')]),
89
+ ]),
90
+ }),
91
+ VpcEndpointType: 'Gateway',
92
+ });
93
+ });
94
+ test('security group allows HTTPS from custom peer', () => {
95
+ const network = new network_1.Network(stack, 'Network');
96
+ network.createServiceEndpoint('Lambda', aws_ec2_1.InterfaceVpcEndpointAwsService.LAMBDA, aws_ec2_1.Peer.ipv4('10.0.0.0/8'));
97
+ const template = assertions_1.Template.fromStack(stack);
98
+ template.hasResourceProperties('AWS::EC2::SecurityGroup', {
99
+ SecurityGroupIngress: assertions_1.Match.arrayWith([
100
+ assertions_1.Match.objectLike({
101
+ IpProtocol: 'tcp',
102
+ FromPort: 443,
103
+ ToPort: 443,
104
+ CidrIp: '10.0.0.0/8',
105
+ }),
106
+ ]),
107
+ });
108
+ });
109
+ test('applicationSubnetSelection returns correct subnet type for public VPC', () => {
110
+ const network = new network_1.Network(stack, 'Network');
111
+ const selection = network.applicationSubnetSelection();
112
+ expect(selection.subnetType).toBe(aws_ec2_1.SubnetType.PRIVATE_WITH_EGRESS);
113
+ });
114
+ test('applicationSubnetSelection returns correct subnet type for private VPC', () => {
115
+ const network = new network_1.Network(stack, 'Network', { private: true });
116
+ const selection = network.applicationSubnetSelection();
117
+ expect(selection.subnetType).toBe(aws_ec2_1.SubnetType.PRIVATE_ISOLATED);
118
+ });
119
+ });
120
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV0d29yay50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdXNlLWNhc2VzL2ZyYW1ld29yay90ZXN0cy9uZXR3b3JrLnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSw2Q0FBb0M7QUFDcEMsdURBQXlEO0FBQ3pELGlEQUFvRztBQUNwRyxtREFBZ0Q7QUFFaEQsUUFBUSxDQUFDLFNBQVMsRUFBRSxHQUFHLEVBQUU7SUFDdkIsSUFBSSxLQUFZLENBQUM7SUFFakIsVUFBVSxDQUFDLEdBQUcsRUFBRTtRQUNkLEtBQUssR0FBRyxJQUFJLG1CQUFLLEVBQUUsQ0FBQztJQUN0QixDQUFDLENBQUMsQ0FBQztJQUVILElBQUksQ0FBQyx3Q0FBd0MsRUFBRSxHQUFHLEVBQUU7UUFDbEQsSUFBSSxpQkFBTyxDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQztRQUU5QixNQUFNLFFBQVEsR0FBRyxxQkFBUSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMzQyxRQUFRLENBQUMsZUFBZSxDQUFDLGVBQWUsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUM3QyxRQUFRLENBQUMscUJBQXFCLENBQUMsZUFBZSxFQUFFO1lBQzlDLFNBQVMsRUFBRSxhQUFhO1NBQ3pCLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsSUFBSSxDQUFDLDBEQUEwRCxFQUFFLEdBQUcsRUFBRTtRQUNwRSxJQUFJLGlCQUFPLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBRTlCLE1BQU0sUUFBUSxHQUFHLHFCQUFRLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzNDLE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUMzRCxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FB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b0IsRUFBRSxrQkFBSyxDQUFDLFNBQVMsQ0FBQztnQkFDcEMsa0JBQUssQ0FBQyxVQUFVLENBQUM7b0JBQ2YsVUFBVSxFQUFFLEtBQUs7b0JBQ2pCLFFBQVEsRUFBRSxHQUFHO29CQUNiLE1BQU0sRUFBRSxHQUFHO29CQUNYLE1BQU0sRUFBRSxZQUFZO2lCQUNyQixDQUFDO2FBQ0gsQ0FBQztTQUNILENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsSUFBSSxDQUFDLHVFQUF1RSxFQUFFLEdBQUcsRUFBRTtRQUNqRixNQUFNLE9BQU8sR0FBRyxJQUFJLGlCQUFPLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQzlDLE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQywwQkFBMEIsRUFBRSxDQUFDO1FBQ3ZELE1BQU0sQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFDLG9CQUFVLENBQUMsbUJBQW1CLENBQUMsQ0FBQztJQUNwRSxDQUFDLENBQUMsQ0FBQztJQUVILElBQUksQ0FBQyx3RUFBd0UsRUFBRSxHQUFHLEVBQUU7UUFDbEYsTUFBTSxPQUFPLEdBQUcsSUFBSSxpQkFBTyxDQUFDLEtBQUssRUFBRSxTQUFTLEVBQUUsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUNqRSxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsMEJBQTBCLEVBQUUsQ0FBQztRQUN2RCxNQUFNLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBQyxvQkFBVSxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDakUsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFN0YWNrIH0gZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0IHsgVGVtcGxhdGUsIE1hdGNoIH0gZnJvbSAnYXdzLWNkay1saWIvYXNzZXJ0aW9ucyc7XG5pbXBvcnQgeyBJbnRlcmZhY2VWcGNFbmRwb2ludEF3c1NlcnZpY2UsIElwQWRkcmVzc2VzLCBQZWVyLCBTdWJuZXRUeXBlIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWVjMic7XG5pbXBvcnQgeyBOZXR3b3JrIH0gZnJvbSAnLi4vZm91bmRhdGlvbi9uZXR3b3JrJztcblxuZGVzY3JpYmUoJ05ldHdvcmsnLCAoKSA9PiB7XG4gIGxldCBzdGFjazogU3RhY2s7XG5cbiAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgc3RhY2sgPSBuZXcgU3RhY2soKTtcbiAgfSk7XG5cbiAgdGVzdCgnY3JlYXRlcyBWUEMgd2l0aCBkZWZhdWx0IGNvbmZpZ3VyYXRpb24nLCAoKSA9PiB7XG4gICAgbmV3IE5ldHdvcmsoc3RhY2ssICdOZXR3b3JrJyk7XG5cbiAgICBjb25zdCB0ZW1wbGF0ZSA9IFRlbXBsYXRlLmZyb21TdGFjayhzdGFjayk7XG4gICAgdGVtcGxhdGUucmVzb3VyY2VDb3VudElzKCdBV1M6OkVDMjo6VlBDJywgMSk7XG4gICAgdGVtcGxhdGUuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OkVDMjo6VlBDJywge1xuICAgICAgQ2lkckJsb2NrOiAnMTAuMC4wLjAvMTYnLFxuICAgIH0pO1xuICB9KTtcblxuICB0ZXN0KCdjcmVhdGVzIHB1YmxpYywgcHJpdmF0ZSwgYW5kIGlzb2xhdGVkIHN1Ym5ldHMgYnkgZGVmYXVsdCcsICgpID0+IHtcbiAgICBuZXcgTmV0d29yayhzdGFjaywgJ05ldHdvcmsnKTtcblxuICAgIGNvbnN0IHRlbXBsYXRlID0gVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKTtcbiAgICBjb25zdCBzdWJuZXRzID0gdGVtcGxhdGUuZmluZFJlc291cmNlcygnQVdTOjpFQzI6OlN1Ym5ldCcpO1xuICAgIGV4cGVjdChPYmplY3Qua2V5cyhzdWJuZXRzKS5sZW5ndGgpLnRvQmVHcmVhdGVyVGhhbigwKTtcblxuICAgIGNvbnN0IHN1Ym5ldFRhZ3MgPSBPYmplY3QudmFsdWVzKHN1Ym5ldHMpLm1hcCgoczogYW55KSA9PlxuICAgICAgcy5Qcm9wZXJ0aWVzLlRhZ3M/LmZpbmQoKHQ6IGFueSkgPT4gdC5LZXkgPT09ICdhd3MtY2RrOnN1Ym5ldC1uYW1lJyk/LlZhbHVlLFxuICAgICk7XG5cbiAgICBleHBlY3Qoc3VibmV0VGFncykudG9Db250YWluKCdQdWJsaWMnKTtcbiAgICBleHBlY3Qoc3VibmV0VGFncykudG9Db250YWluKCdQcml2YXRlJyk7XG4gICAgZXhwZWN0KHN1Ym5ldFRhZ3MpLnRvQ29udGFpbignSXNvbGF0ZWQnKTtcbiAgfSk7XG5cbiAgdGVzdCgnY3JlYXRlcyBOQVQgZ2F0ZXdheSBieSBkZWZhdWx0JywgKCkgPT4ge1xuICAgIG5ldyBOZXR3b3JrKHN0YWNrLCAnTmV0d29yaycpO1xuXG4gICAgY29uc3QgdGVtcGxhdGUgPSBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spO1xuICAgIHRlbXBsYXRlLnJlc291cmNlQ291bnRJcygnQVdTOjpFQzI6Ok5hdEdhdGV3YXknLCAxKTtcbiAgfSk7XG5cbiAgdGVzdCgnY3JlYXRlcyBwcml2YXRlIFZQQyB3aXRob3V0IE5BVCBnYXRld2F5JywgKCkgPT4ge1xuICAgIG5ldyBOZXR3b3JrKHN0YWNrLCAnTmV0d29yaycsIHsgcHJpdmF0ZTogdHJ1ZSB9KTtcblxuICAgIGNvbnN0IHRlbXBsYXRlID0gVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKTtcbiAgICB0ZW1wbGF0ZS5yZXNvdXJjZUNvdW50SXMoJ0FXUzo6RUMyOjpOYXRHYXRld2F5JywgMCk7XG4gICAgdGVtcGxhdGUucmVzb3VyY2VDb3VudElzKCdBV1M6OkVDMjo6SW50ZXJuZXRHYXRld2F5JywgMCk7XG4gIH0pO1xuXG4gIHRlc3QoJ2NyZWF0ZXMgb25seSBpc29sYXRlZCBzdWJuZXRzIGZvciBwcml2YXRlIFZQQycsICgpID0+IHtcbiAgICBuZXcgTmV0d29yayhzdGFjaywgJ05ldHdvcmsnLCB7IHByaXZhdGU6IHRydWUgfSk7XG5cbiAgICBjb25zdCB0ZW1wbGF0ZSA9IFRlbXBsYXRlLmZyb21TdGFjayhzdGFjayk7XG4gICAgY29uc3Qgc3VibmV0cyA9IHRlbXBsYXRlLmZpbmRSZXNvdXJjZXMoJ0FXUzo6RUMyOjpTdWJuZXQnKTtcbiAgICBjb25zdCBzdWJuZXRUYWdzID0gT2JqZWN0LnZhbHVlcyhzdWJuZXRzKS5tYXAoKHM6IGFueSkgPT5cbiAgICAgIHMuUHJvcGVydGllcy5UYWdzPy5maW5kKCh0OiBhbnkpID0+IHQuS2V5ID09PSAnYXdzLWNkazpzdWJuZXQtbmFtZScpPy5WYWx1ZSxcbiAgICApO1xuXG4gICAgZXhwZWN0KHN1Ym5ldFRhZ3MuZXZlcnkoKHRhZzogc3RyaW5nKSA9PiB0YWcgPT09ICdJc29sYXRlZCcpKS50b0JlKHRydWUpO1xuICB9KTtcblxuICB0ZXN0KCd1c2VzIGN1c3RvbSBDSURSIGJsb2NrJywgKCkgPT4ge1xuICAgIG5ldyBOZXR3b3JrKHN0YWNrLCAnTmV0d29yaycsIHtcbiAgICAgIGlwQWRkcmVzc2VzOiBJcEFkZHJlc3Nlcy5jaWRyKCcxNzIuMTYuMC4wLzE2JyksXG4gICAgfSk7XG5cbiAgICBjb25zdCB0ZW1wbGF0ZSA9IFRlbXBsYXRlLmZyb21TdGFjayhzdGFjayk7XG4gICAgdGVtcGxhdGUuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OkVDMjo6VlBDJywge1xuICAgICAgQ2lkckJsb2NrOiAnMTcyLjE2LjAuMC8xNicsXG4gICAgfSk7XG4gIH0pO1xuXG4gIHRlc3QoJ2NvbmZpZ3VyZXMgY3VzdG9tIE5BVCBnYXRld2F5cyBjb3VudCcsICgpID0+IHtcbiAgICBuZXcgTmV0d29yayhzdGFjaywgJ05ldHdvcmsnLCB7IG5hdEdhdGV3YXlzOiAyIH0pO1xuXG4gICAgY29uc3QgdGVtcGxhdGUgPSBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spO1xuICAgIHRlbXBsYXRlLnJlc291cmNlQ291bnRJcygnQVdTOjpFQzI6Ok5hdEdhdGV3YXknLCAyKTtcbiAgfSk7XG5cbiAgdGVzdCgnc2V0cyBjdXN0b20gVlBDIG5hbWUnLCAoKSA9PiB7XG4gICAgbmV3IE5ldHdvcmsoc3RhY2ssICdOZXR3b3JrJywgeyB2cGNOYW1lOiAnTXlDdXN0b21WUEMnIH0pO1xuXG4gICAgY29uc3QgdGVtcGxhdGUgPSBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spO1xuICAgIHRlbXBsYXRlLmhhc1Jlc291cmNlUHJvcGVydGllcygnQVdTOjpFQzI6OlZQQycsIHtcbiAgICAgIFRhZ3M6IE1hdGNoLmFycmF5V2l0aChbXG4gICAgICAgIHsgS2V5OiAnTmFtZScsIFZhbHVlOiAnTXlDdXN0b21WUEMnIH0sXG4gICAgICBdKSxcbiAgICB9KTtcbiAgfSk7XG5cbiAgdGVzdCgnY3JlYXRlcyBpbnRlcmZhY2UgZW5kcG9pbnQgd2l0aCBzZWN1cml0eSBncm91cCcsICgpID0+IHtcbiAgICBjb25zdCBuZXR3b3JrID0gbmV3IE5ldHdvcmsoc3RhY2ssICdOZXR3b3JrJyk7XG4gICAgbmV0d29yay5jcmVhdGVTZXJ2aWNlRW5kcG9pbnQoJ0xhbWJkYScsIEludGVyZmFjZVZwY0VuZHBvaW50QXdzU2VydmljZS5MQU1CREEpO1xuXG4gICAgY29uc3QgdGVtcGxhdGUgPSBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spO1xuICAgIHRlbXBsYXRlLnJlc291cmNlQ291bnRJcygnQVdTOjpFQzI6OlZQQ0VuZHBvaW50JywgMSk7XG4gICAgdGVtcGxhdGUuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OkVDMjo6VlBDRW5kcG9pbnQnLCB7XG4gICAgICBWcGNFbmRwb2ludFR5cGU6ICdJbnRlcmZhY2UnLFxuICAgIH0pO1xuICAgIHRlbXBsYXRlLnJlc291cmNlQ291bnRJcygnQVdTOjpFQzI6OlNlY3VyaXR5R3JvdXAnLCAxKTtcbiAgfSk7XG5cbiAgdGVzdCgnY3JlYXRlcyBTMyBnYXRld2F5IGVuZHBvaW50IHdoZW4gUzMgc2VydmljZSByZXF1ZXN0ZWQnLCAoKSA9PiB7XG4gICAgY29uc3QgbmV0d29yayA9IG5ldyBOZXR3b3JrKHN0YWNrLCAnTmV0d29yaycpO1xuICAgIG5ldHdvcmsuY3JlYXRlU2VydmljZUVuZHBvaW50KCdTMycsIEludGVyZmFjZVZwY0VuZHBvaW50QXdzU2VydmljZS5TMyk7XG5cbiAgICBjb25zdCB0ZW1wbGF0ZSA9IFRlbXBsYXRlLmZyb21TdGFjayhzdGFjayk7XG4gICAgdGVtcGxhdGUuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OkVDMjo6VlBDRW5kcG9pbnQnLCB7XG4gICAgICBTZXJ2aWNlTmFtZTogTWF0Y2gub2JqZWN0TGlrZSh7XG4gICAgICAgICdGbjo6Sm9pbic6IE1hdGNoLmFycmF5V2l0aChbXG4gICAgICAgICAgTWF0Y2guYXJyYXlXaXRoKFtNYXRjaC5zdHJpbmdMaWtlUmVnZXhwKCdzMycpXSksXG4gICAgICAgIF0pLFxuICAgICAgfSksXG4gICAgICBWcGNFbmRwb2ludFR5cGU6ICdHYXRld2F5JyxcbiAgICB9KTtcbiAgfSk7XG5cbiAgdGVzdCgnc2VjdXJpdHkgZ3JvdXAgYWxsb3dzIEhUVFBTIGZyb20gY3VzdG9tIHBlZXInLCAoKSA9PiB7XG4gICAgY29uc3QgbmV0d29yayA9IG5ldyBOZXR3b3JrKHN0YWNrLCAnTmV0d29yaycpO1xuICAgIG5ldHdvcmsuY3JlYXRlU2VydmljZUVuZHBvaW50KCdMYW1iZGEnLCBJbnRlcmZhY2VWcGNFbmRwb2ludEF3c1NlcnZpY2UuTEFNQkRBLCBQZWVyLmlwdjQoJzEwLjAuMC4wLzgnKSk7XG5cbiAgICBjb25zdCB0ZW1wbGF0ZSA9IFRlbXBsYXRlLmZyb21TdGFjayhzdGFjayk7XG4gICAgdGVtcGxhdGUuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OkVDMjo6U2VjdXJpdHlHcm91cCcsIHtcbiAgICAgIFNlY3VyaXR5R3JvdXBJbmdyZXNzOiBNYXRjaC5hcnJheVdpdGgoW1xuICAgICAgICBNYXRjaC5vYmplY3RMaWtlKHtcbiAgICAgICAgICBJcFByb3RvY29sOiAndGNwJyxcbiAgICAgICAgICBGcm9tUG9ydDogNDQzLFxuICAgICAgICAgIFRvUG9ydDogNDQzLFxuICAgICAgICAgIENpZHJJcDogJzEwLjAuMC4wLzgnLFxuICAgICAgICB9KSxcbiAgICAgIF0pLFxuICAgIH0pO1xuICB9KTtcblxuICB0ZXN0KCdhcHBsaWNhdGlvblN1Ym5ldFNlbGVjdGlvbiByZXR1cm5zIGNvcnJlY3Qgc3VibmV0IHR5cGUgZm9yIHB1YmxpYyBWUEMnLCAoKSA9PiB7XG4gICAgY29uc3QgbmV0d29yayA9IG5ldyBOZXR3b3JrKHN0YWNrLCAnTmV0d29yaycpO1xuICAgIGNvbnN0IHNlbGVjdGlvbiA9IG5ldHdvcmsuYXBwbGljYXRpb25TdWJuZXRTZWxlY3Rpb24oKTtcbiAgICBleHBlY3Qoc2VsZWN0aW9uLnN1Ym5ldFR5cGUpLnRvQmUoU3VibmV0VHlwZS5QUklWQVRFX1dJVEhfRUdSRVNTKTtcbiAgfSk7XG5cbiAgdGVzdCgnYXBwbGljYXRpb25TdWJuZXRTZWxlY3Rpb24gcmV0dXJucyBjb3JyZWN0IHN1Ym5ldCB0eXBlIGZvciBwcml2YXRlIFZQQycsICgpID0+IHtcbiAgICBjb25zdCBuZXR3b3JrID0gbmV3IE5ldHdvcmsoc3RhY2ssICdOZXR3b3JrJywgeyBwcml2YXRlOiB0cnVlIH0pO1xuICAgIGNvbnN0IHNlbGVjdGlvbiA9IG5ldHdvcmsuYXBwbGljYXRpb25TdWJuZXRTZWxlY3Rpb24oKTtcbiAgICBleHBlY3Qoc2VsZWN0aW9uLnN1Ym5ldFR5cGUpLnRvQmUoU3VibmV0VHlwZS5QUklWQVRFX0lTT0xBVEVEKTtcbiAgfSk7XG59KTtcbiJdfQ==