@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.
- package/.jsii +4 -4
- package/README.md +76 -98
- package/lib/document-processing/adapter/queued-s3-adapter.js +1 -1
- package/lib/document-processing/agentic-document-processing.js +1 -1
- package/lib/document-processing/base-document-processing.js +1 -1
- package/lib/document-processing/bedrock-document-processing.js +1 -1
- package/lib/document-processing/default-document-processing-config.js +1 -1
- package/lib/document-processing/tests/agentic-document-processing.test.js +104 -60
- package/lib/document-processing/tests/base-document-processing-nag.test.d.ts +1 -0
- package/lib/document-processing/tests/base-document-processing-nag.test.js +161 -0
- package/lib/document-processing/tests/base-document-processing.test.d.ts +1 -0
- package/lib/document-processing/tests/base-document-processing.test.js +499 -0
- package/lib/document-processing/tests/bedrock-document-processing.test.js +212 -36
- package/lib/document-processing/tests/queued-s3-adapter-nag.test.d.ts +1 -0
- package/lib/document-processing/tests/queued-s3-adapter-nag.test.js +122 -0
- package/lib/document-processing/tests/queued-s3-adapter.test.d.ts +1 -0
- package/lib/document-processing/tests/queued-s3-adapter.test.js +276 -0
- package/lib/framework/agents/base-agent.js +1 -1
- package/lib/framework/agents/batch-agent.js +1 -1
- package/lib/framework/agents/default-agent-config.js +1 -1
- package/lib/framework/bedrock/bedrock.js +1 -1
- package/lib/framework/custom-resource/default-runtimes.js +1 -1
- package/lib/framework/foundation/access-log.js +1 -1
- package/lib/framework/foundation/eventbridge-broker.js +1 -1
- package/lib/framework/foundation/network.js +1 -1
- package/lib/framework/tests/access-log.test.d.ts +1 -0
- package/lib/framework/tests/access-log.test.js +146 -0
- package/lib/framework/tests/batch-agent.test.d.ts +1 -0
- package/lib/framework/tests/batch-agent.test.js +164 -0
- package/lib/framework/tests/bedrock.test.d.ts +1 -0
- package/lib/framework/tests/bedrock.test.js +68 -0
- package/lib/framework/tests/eventbridge-broker.test.d.ts +1 -0
- package/lib/framework/tests/eventbridge-broker.test.js +73 -0
- package/lib/framework/tests/framework-nag.test.d.ts +1 -0
- package/lib/framework/tests/framework-nag.test.js +155 -0
- package/lib/framework/tests/network.test.d.ts +1 -0
- package/lib/framework/tests/network.test.js +120 -0
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/lib/utilities/data-loader.js +1 -1
- package/lib/utilities/lambda-iam-utils.js +1 -1
- package/lib/utilities/observability/cloudfront-distribution-observability-property-injector.js +1 -1
- package/lib/utilities/observability/default-observability-config.js +1 -1
- package/lib/utilities/observability/lambda-observability-property-injector.js +1 -1
- package/lib/utilities/observability/log-group-data-protection-utils.js +1 -1
- package/lib/utilities/observability/powertools-config.js +1 -1
- package/lib/utilities/observability/state-machine-observability-property-injector.js +1 -1
- package/lib/webapp/frontend-construct.js +1 -1
- package/package.json +8 -8
|
@@ -0,0 +1,146 @@
|
|
|
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 access_log_1 = require("../foundation/access-log");
|
|
6
|
+
describe('AccessLog', () => {
|
|
7
|
+
let stack;
|
|
8
|
+
beforeEach(() => {
|
|
9
|
+
stack = new aws_cdk_lib_1.Stack(undefined, 'TestStack', {
|
|
10
|
+
env: { account: '123456789012', region: 'us-east-1' },
|
|
11
|
+
});
|
|
12
|
+
});
|
|
13
|
+
test('creates bucket with default configuration', () => {
|
|
14
|
+
new access_log_1.AccessLog(stack, 'AccessLog');
|
|
15
|
+
const template = assertions_1.Template.fromStack(stack);
|
|
16
|
+
template.resourceCountIs('AWS::S3::Bucket', 1);
|
|
17
|
+
template.hasResourceProperties('AWS::S3::Bucket', {
|
|
18
|
+
BucketName: 'access-logs-123456789012-us-east-1',
|
|
19
|
+
BucketEncryption: {
|
|
20
|
+
ServerSideEncryptionConfiguration: [{
|
|
21
|
+
ServerSideEncryptionByDefault: { SSEAlgorithm: 'AES256' },
|
|
22
|
+
}],
|
|
23
|
+
},
|
|
24
|
+
PublicAccessBlockConfiguration: assertions_1.Match.objectLike({
|
|
25
|
+
BlockPublicAcls: true,
|
|
26
|
+
BlockPublicPolicy: true,
|
|
27
|
+
IgnorePublicAcls: true,
|
|
28
|
+
RestrictPublicBuckets: true,
|
|
29
|
+
}),
|
|
30
|
+
});
|
|
31
|
+
});
|
|
32
|
+
test('creates bucket with custom name', () => {
|
|
33
|
+
new access_log_1.AccessLog(stack, 'AccessLog', {
|
|
34
|
+
bucketName: 'custom-logs',
|
|
35
|
+
});
|
|
36
|
+
const template = assertions_1.Template.fromStack(stack);
|
|
37
|
+
template.hasResourceProperties('AWS::S3::Bucket', {
|
|
38
|
+
BucketName: 'custom-logs-123456789012-us-east-1',
|
|
39
|
+
});
|
|
40
|
+
});
|
|
41
|
+
test('applies default lifecycle rules', () => {
|
|
42
|
+
new access_log_1.AccessLog(stack, 'AccessLog');
|
|
43
|
+
const template = assertions_1.Template.fromStack(stack);
|
|
44
|
+
template.hasResourceProperties('AWS::S3::Bucket', {
|
|
45
|
+
LifecycleConfiguration: {
|
|
46
|
+
Rules: assertions_1.Match.arrayWith([
|
|
47
|
+
assertions_1.Match.objectLike({
|
|
48
|
+
Status: 'Enabled',
|
|
49
|
+
Transitions: assertions_1.Match.arrayWith([
|
|
50
|
+
{ StorageClass: 'STANDARD_IA', TransitionInDays: 30 },
|
|
51
|
+
{ StorageClass: 'GLACIER', TransitionInDays: 90 },
|
|
52
|
+
]),
|
|
53
|
+
ExpirationInDays: 365,
|
|
54
|
+
}),
|
|
55
|
+
]),
|
|
56
|
+
},
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
test('applies custom lifecycle rules', () => {
|
|
60
|
+
new access_log_1.AccessLog(stack, 'AccessLog', {
|
|
61
|
+
lifecycleRules: [{
|
|
62
|
+
id: 'CustomRule',
|
|
63
|
+
enabled: true,
|
|
64
|
+
expiration: aws_cdk_lib_1.Duration.days(180),
|
|
65
|
+
}],
|
|
66
|
+
});
|
|
67
|
+
const template = assertions_1.Template.fromStack(stack);
|
|
68
|
+
template.hasResourceProperties('AWS::S3::Bucket', {
|
|
69
|
+
LifecycleConfiguration: {
|
|
70
|
+
Rules: [assertions_1.Match.objectLike({ ExpirationInDays: 180 })],
|
|
71
|
+
},
|
|
72
|
+
});
|
|
73
|
+
});
|
|
74
|
+
test('enables versioning when specified', () => {
|
|
75
|
+
new access_log_1.AccessLog(stack, 'AccessLog', { versioned: true });
|
|
76
|
+
const template = assertions_1.Template.fromStack(stack);
|
|
77
|
+
template.hasResourceProperties('AWS::S3::Bucket', {
|
|
78
|
+
VersioningConfiguration: { Status: 'Enabled' },
|
|
79
|
+
});
|
|
80
|
+
});
|
|
81
|
+
test('adds bucket policy for S3 and CloudWatch Logs', () => {
|
|
82
|
+
new access_log_1.AccessLog(stack, 'AccessLog');
|
|
83
|
+
const template = assertions_1.Template.fromStack(stack);
|
|
84
|
+
template.hasResourceProperties('AWS::S3::BucketPolicy', {
|
|
85
|
+
PolicyDocument: {
|
|
86
|
+
Statement: assertions_1.Match.arrayWith([
|
|
87
|
+
assertions_1.Match.objectLike({
|
|
88
|
+
Sid: 'AllowAccessLogDelivery',
|
|
89
|
+
Effect: 'Allow',
|
|
90
|
+
Principal: {
|
|
91
|
+
Service: assertions_1.Match.arrayWith(['logging.s3.amazonaws.com', 'delivery.logs.amazonaws.com']),
|
|
92
|
+
},
|
|
93
|
+
Action: assertions_1.Match.arrayWith(['s3:PutObject', 's3:GetBucketAcl', 's3:ListBucket']),
|
|
94
|
+
}),
|
|
95
|
+
]),
|
|
96
|
+
},
|
|
97
|
+
});
|
|
98
|
+
});
|
|
99
|
+
test('adds bucket policy for ELB', () => {
|
|
100
|
+
new access_log_1.AccessLog(stack, 'AccessLog');
|
|
101
|
+
const template = assertions_1.Template.fromStack(stack);
|
|
102
|
+
template.hasResourceProperties('AWS::S3::BucketPolicy', {
|
|
103
|
+
PolicyDocument: {
|
|
104
|
+
Statement: assertions_1.Match.arrayWith([
|
|
105
|
+
assertions_1.Match.objectLike({
|
|
106
|
+
Sid: 'AllowELBAccessLogDelivery',
|
|
107
|
+
Effect: 'Allow',
|
|
108
|
+
Principal: { Service: 'elasticloadbalancing.amazonaws.com' },
|
|
109
|
+
Action: 's3:PutObject',
|
|
110
|
+
}),
|
|
111
|
+
]),
|
|
112
|
+
},
|
|
113
|
+
});
|
|
114
|
+
});
|
|
115
|
+
test('enforces SSL', () => {
|
|
116
|
+
new access_log_1.AccessLog(stack, 'AccessLog');
|
|
117
|
+
const template = assertions_1.Template.fromStack(stack);
|
|
118
|
+
template.hasResourceProperties('AWS::S3::BucketPolicy', {
|
|
119
|
+
PolicyDocument: {
|
|
120
|
+
Statement: assertions_1.Match.arrayWith([
|
|
121
|
+
assertions_1.Match.objectLike({
|
|
122
|
+
Effect: 'Deny',
|
|
123
|
+
Condition: { Bool: { 'aws:SecureTransport': 'false' } },
|
|
124
|
+
}),
|
|
125
|
+
]),
|
|
126
|
+
},
|
|
127
|
+
});
|
|
128
|
+
});
|
|
129
|
+
test('getLogPath returns correct path', () => {
|
|
130
|
+
const accessLog = new access_log_1.AccessLog(stack, 'AccessLog');
|
|
131
|
+
expect(accessLog.getLogPath('alb')).toBe('access-logs-123456789012-us-east-1/access-logs/alb');
|
|
132
|
+
expect(accessLog.getLogPath('alb', 'my-alb')).toBe('access-logs-123456789012-us-east-1/access-logs/alb/my-alb');
|
|
133
|
+
});
|
|
134
|
+
test('getLogUri returns correct S3 URI', () => {
|
|
135
|
+
const accessLog = new access_log_1.AccessLog(stack, 'AccessLog');
|
|
136
|
+
expect(accessLog.getLogUri('cloudfront')).toBe('s3://access-logs-123456789012-us-east-1/access-logs/cloudfront');
|
|
137
|
+
expect(accessLog.getLogUri('cloudfront', 'my-dist')).toBe('s3://access-logs-123456789012-us-east-1/access-logs/cloudfront/my-dist');
|
|
138
|
+
});
|
|
139
|
+
test('uses custom bucket prefix', () => {
|
|
140
|
+
const accessLog = new access_log_1.AccessLog(stack, 'AccessLog', {
|
|
141
|
+
bucketPrefix: 'custom-prefix',
|
|
142
|
+
});
|
|
143
|
+
expect(accessLog.getLogPath('s3')).toBe('access-logs-123456789012-us-east-1/custom-prefix/s3');
|
|
144
|
+
});
|
|
145
|
+
});
|
|
146
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNjZXNzLWxvZy50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdXNlLWNhc2VzL2ZyYW1ld29yay90ZXN0cy9hY2Nlc3MtbG9nLnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSw2Q0FBOEM7QUFDOUMsdURBQXlEO0FBQ3pELHlEQUFxRDtBQUVyRCxRQUFRLENBQUMsV0FBVyxFQUFFLEdBQUcsRUFBRTtJQUN6QixJQUFJLEtBQVksQ0FBQztJQUVqQixVQUFVLENBQUMsR0FBRyxFQUFFO1FBQ2QsS0FBSyxHQUFHLElBQUksbUJBQUssQ0FBQyxTQUFTLEVBQUUsV0FBVyxFQUFFO1lBQ3hDLEdBQUcsRUFBRSxFQUFFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRTtTQUN0RCxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILElBQUksQ0FBQywyQ0FBMkMsRUFBRSxHQUFHLEVBQUU7UUFDckQsSUFBSSxzQkFBUyxDQUFDLEtBQUssRUFBRSxXQUFXLENBQUMsQ0FBQztRQUVsQyxNQUFNLFFBQVEsR0FBRyxxQkFBUSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMzQyxRQUFRLENBQUMsZUFBZSxDQUFDLGlCQUFpQixFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQy9DLFFBQVEsQ0FBQyxxQkFBcUIsQ0FBQyxpQkFBaUIsRUFBRTtZQUNoRCxVQUFVLEVBQUUsb0NBQW9DO1lBQ2hELGdCQUFnQixFQUFFO2dCQUNoQixpQ0FBaUMsRUFBRSxDQUFDO3dCQUNsQyw2QkFBNkIsRUFBRSxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUU7cUJBQzFELENBQUM7YUFDSDtZQUNELDhCQUE4QixFQUFFLGtCQUFLLENBQUMsVUFBVSxDQUFDO2dCQUMvQyxlQUFlLEVBQUUsSUFBSTtnQkFDckIsaUJBQWlCLEVBQUUsSUFBSTtnQkFDdkIsZ0JBQWdCLEVBQUUsSUFBSTtnQkFDdEIscUJBQXFC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QUFFLEdBQUcsRUFBRTtRQUNyQyxNQUFNLFNBQVMsR0FBRyxJQUFJLHNCQUFTLENBQUMsS0FBSyxFQUFFLFdBQVcsRUFBRTtZQUNsRCxZQUFZLEVBQUUsZUFBZTtTQUM5QixDQUFDLENBQUM7UUFDSCxNQUFNLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxxREFBcUQsQ0FBQyxDQUFDO0lBQ2pHLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTdGFjaywgRHVyYXRpb24gfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgeyBUZW1wbGF0ZSwgTWF0Y2ggfSBmcm9tICdhd3MtY2RrLWxpYi9hc3NlcnRpb25zJztcbmltcG9ydCB7IEFjY2Vzc0xvZyB9IGZyb20gJy4uL2ZvdW5kYXRpb24vYWNjZXNzLWxvZyc7XG5cbmRlc2NyaWJlKCdBY2Nlc3NMb2cnLCAoKSA9PiB7XG4gIGxldCBzdGFjazogU3RhY2s7XG5cbiAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgc3RhY2sgPSBuZXcgU3RhY2sodW5kZWZpbmVkLCAnVGVzdFN0YWNrJywge1xuICAgICAgZW52OiB7IGFjY291bnQ6ICcxMjM0NTY3ODkwMTInLCByZWdpb246ICd1cy1lYXN0LTEnIH0sXG4gICAgfSk7XG4gIH0pO1xuXG4gIHRlc3QoJ2NyZWF0ZXMgYnVja2V0IHdpdGggZGVmYXVsdCBjb25maWd1cmF0aW9uJywgKCkgPT4ge1xuICAgIG5ldyBBY2Nlc3NMb2coc3RhY2ssICdBY2Nlc3NMb2cnKTtcblxuICAgIGNvbnN0IHRlbXBsYXRlID0gVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKTtcbiAgICB0ZW1wbGF0ZS5yZXNvdXJjZUNvdW50SXMoJ0FXUzo6UzM6OkJ1Y2tldCcsIDEpO1xuICAgIHRlbXBsYXRlLmhhc1Jlc291cmNlUHJvcGVydGllcygnQVdTOjpTMzo6QnVja2V0Jywge1xuICAgICAgQnVja2V0TmFtZTogJ2FjY2Vzcy1sb2dzLTEyMzQ1Njc4OTAxMi11cy1lYXN0LTEnLFxuICAgICAgQnVja2V0RW5jcnlwdGlvbjoge1xuICAgICAgICBTZXJ2ZXJTaWRlRW5jcnlwdGlvbkNvbmZpZ3VyYXRpb246IFt7XG4gICAgICAgICAgU2VydmVyU2lkZUVuY3J5cHRpb25CeURlZmF1bHQ6IHsgU1NFQWxnb3JpdGhtOiAnQUVTMjU2JyB9LFxuICAgICAgICB9XSxcbiAgICAgIH0sXG4gICAgICBQdWJsaWNBY2Nlc3NCbG9ja0NvbmZpZ3VyYXRpb246IE1hdGNoLm9iamVjdExpa2Uoe1xuICAgICAgICBCbG9ja1B1YmxpY0FjbHM6IHRydWUsXG4gICAgICAgIEJsb2NrUHVibGljUG9saWN5OiB0cnVlLFxuICAgICAgICBJZ25vcmVQdWJsaWNBY2xzOiB0cnVlLFxuICAgICAgICBSZXN0cmljdFB1YmxpY0J1Y2tldHM6IHRydWUsXG4gICAgICB9KSxcbiAgICB9KTtcbiAgfSk7XG5cbiAgdGVzdCgnY3JlYXRlcyBidWNrZXQgd2l0aCBjdXN0b20gbmFtZScsICgpID0+IHtcbiAgICBuZXcgQWNjZXNzTG9nKHN0YWNrLCAnQWNjZXNzTG9nJywge1xuICAgICAgYnVja2V0TmFtZTogJ2N1c3RvbS1sb2dzJyxcbiAgICB9KTtcblxuICAgIGNvbnN0IHRlbXBsYXRlID0gVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKTtcbiAgICB0ZW1wbGF0ZS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6UzM6OkJ1Y2tldCcsIHtcbiAgICAgIEJ1Y2tldE5hbWU6ICdjdXN0b20tbG9ncy0xMjM0NTY3ODkwMTItdXMtZWFzdC0xJyxcbiAgICB9KTtcbiAgfSk7XG5cbiAgdGVzdCgnYXBwbGllcyBkZWZhdWx0IGxpZmVjeWNsZSBydWxlcycsICgpID0+IHtcbiAgICBuZXcgQWNjZXNzTG9nKHN0YWNrLCAnQWNjZXNzTG9nJyk7XG5cbiAgICBjb25zdCB0ZW1wbGF0ZSA9IFRlbXBsYXRlLmZyb21TdGFjayhzdGFjayk7XG4gICAgdGVtcGxhdGUuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OlMzOjpCdWNrZXQnLCB7XG4gICAgICBMaWZlY3ljbGVDb25maWd1cmF0aW9uOiB7XG4gICAgICAgIFJ1bGVzOiBNYXRjaC5hcnJheVdpdGgoW1xuICAgICAgICAgIE1hdGNoLm9iamVjdExpa2Uoe1xuICAgICAgICAgICAgU3RhdHVzOiAnRW5hYmxlZCcsXG4gICAgICAgICAgICBUcmFuc2l0aW9uczogTWF0Y2guYXJyYXlXaXRoKFtcbiAgICAgICAgICAgICAgeyBTdG9yYWdlQ2xhc3M6ICdTVEFOREFSRF9JQScsIFRyYW5zaXRpb25JbkRheXM6IDMwIH0sXG4gICAgICAgICAgICAgIHsgU3RvcmFnZUNsYXNzOiAnR0xBQ0lFUicsIFRyYW5zaXRpb25JbkRheXM6IDkwIH0sXG4gICAgICAgICAgICBdKSxcbiAgICAgICAgICAgIEV4cGlyYXRpb25JbkRheXM6IDM2NSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgXSksXG4gICAgICB9LFxuICAgIH0pO1xuICB9KTtcblxuICB0ZXN0KCdhcHBsaWVzIGN1c3RvbSBsaWZlY3ljbGUgcnVsZXMnLCAoKSA9PiB7XG4gICAgbmV3IEFjY2Vzc0xvZyhzdGFjaywgJ0FjY2Vzc0xvZycsIHtcbiAgICAgIGxpZmVjeWNsZVJ1bGVzOiBbe1xuICAgICAgICBpZDogJ0N1c3RvbVJ1bGUnLFxuICAgICAgICBlbmFibGVkOiB0cnVlLFxuICAgICAgICBleHBpcmF0aW9uOiBEdXJhdGlvbi5kYXlzKDE4MCksXG4gICAgICB9XSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHRlbXBsYXRlID0gVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKTtcbiAgICB0ZW1wbGF0ZS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6UzM6OkJ1Y2tldCcsIHtcbiAgICAgIExpZmVjeWNsZUNvbmZpZ3VyYXRpb246IHtcbiAgICAgICAgUnVsZXM6IFtNYXRjaC5vYmplY3RMaWtlKHsgRXhwaXJhdGlvbkluRGF5czogMTgwIH0pXSxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH0pO1xuXG4gIHRlc3QoJ2VuYWJsZXMgdmVyc2lvbmluZyB3aGVuIHNwZWNpZmllZCcsICgpID0+IHtcbiAgICBuZXcgQWNjZXNzTG9nKHN0YWNrLCAnQWNjZXNzTG9nJywgeyB2ZXJzaW9uZWQ6IHRydWUgfSk7XG5cbiAgICBjb25zdCB0ZW1wbGF0ZSA9IFRlbXBsYXRlLmZyb21TdGFjayhzdGFjayk7XG4gICAgdGVtcGxhdGUuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OlMzOjpCdWNrZXQnLCB7XG4gICAgICBWZXJzaW9uaW5nQ29uZmlndXJhdGlvbjogeyBTdGF0dXM6ICdFbmFibGVkJyB9LFxuICAgIH0pO1xuICB9KTtcblxuICB0ZXN0KCdhZGRzIGJ1Y2tldCBwb2xpY3kgZm9yIFMzIGFuZCBDbG91ZFdhdGNoIExvZ3MnLCAoKSA9PiB7XG4gICAgbmV3IEFjY2Vzc0xvZyhzdGFjaywgJ0FjY2Vzc0xvZycpO1xuXG4gICAgY29uc3QgdGVtcGxhdGUgPSBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spO1xuICAgIHRlbXBsYXRlLmhhc1Jlc291cmNlUHJvcGVydGllcygnQVdTOjpTMzo6QnVja2V0UG9saWN5Jywge1xuICAgICAgUG9saWN5RG9jdW1lbnQ6IHtcbiAgICAgICAgU3RhdGVtZW50OiBNYXRjaC5hcnJheVdpdGgoW1xuICAgICAgICAgIE1hdGNoLm9iamVjdExpa2Uoe1xuICAgICAgICAgICAgU2lkOiAnQWxsb3dBY2Nlc3NMb2dEZWxpdmVyeScsXG4gICAgICAgICAgICBFZmZlY3Q6ICdBbGxvdycsXG4gICAgICAgICAgICBQcmluY2lwYWw6IHtcbiAgICAgICAgICAgICAgU2VydmljZTogTWF0Y2guYXJyYXlXaXRoKFsnbG9nZ2luZy5zMy5hbWF6b25hd3MuY29tJywgJ2RlbGl2ZXJ5LmxvZ3MuYW1hem9uYXdzLmNvbSddKSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBBY3Rpb246IE1hdGNoLmFycmF5V2l0aChbJ3MzOlB1dE9iamVjdCcsICdzMzpHZXRCdWNrZXRBY2wnLCAnczM6TGlzdEJ1Y2tldCddKSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgXSksXG4gICAgICB9LFxuICAgIH0pO1xuICB9KTtcblxuICB0ZXN0KCdhZGRzIGJ1Y2tldCBwb2xpY3kgZm9yIEVMQicsICgpID0+IHtcbiAgICBuZXcgQWNjZXNzTG9nKHN0YWNrLCAnQWNjZXNzTG9nJyk7XG5cbiAgICBjb25zdCB0ZW1wbGF0ZSA9IFRlbXBsYXRlLmZyb21TdGFjayhzdGFjayk7XG4gICAgdGVtcGxhdGUuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OlMzOjpCdWNrZXRQb2xpY3knLCB7XG4gICAgICBQb2xpY3lEb2N1bWVudDoge1xuICAgICAgICBTdGF0ZW1lbnQ6IE1hdGNoLmFycmF5V2l0aChbXG4gICAgICAgICAgTWF0Y2gub2JqZWN0TGlrZSh7XG4gICAgICAgICAgICBTaWQ6ICdBbGxvd0VMQkFjY2Vzc0xvZ0RlbGl2ZXJ5JyxcbiAgICAgICAgICAgIEVmZmVjdDogJ0FsbG93JyxcbiAgICAgICAgICAgIFByaW5jaXBhbDogeyBTZXJ2aWNlOiAnZWxhc3RpY2xvYWRiYWxhbmNpbmcuYW1hem9uYXdzLmNvbScgfSxcbiAgICAgICAgICAgIEFjdGlvbjogJ3MzOlB1dE9iamVjdCcsXG4gICAgICAgICAgfSksXG4gICAgICAgIF0pLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfSk7XG5cbiAgdGVzdCgnZW5mb3JjZXMgU1NMJywgKCkgPT4ge1xuICAgIG5ldyBBY2Nlc3NMb2coc3RhY2ssICdBY2Nlc3NMb2cnKTtcblxuICAgIGNvbnN0IHRlbXBsYXRlID0gVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKTtcbiAgICB0ZW1wbGF0ZS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6UzM6OkJ1Y2tldFBvbGljeScsIHtcbiAgICAgIFBvbGljeURvY3VtZW50OiB7XG4gICAgICAgIFN0YXRlbWVudDogTWF0Y2guYXJyYXlXaXRoKFtcbiAgICAgICAgICBNYXRjaC5vYmplY3RMaWtlKHtcbiAgICAgICAgICAgIEVmZmVjdDogJ0RlbnknLFxuICAgICAgICAgICAgQ29uZGl0aW9uOiB7IEJvb2w6IHsgJ2F3czpTZWN1cmVUcmFuc3BvcnQnOiAnZmFsc2UnIH0gfSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgXSksXG4gICAgICB9LFxuICAgIH0pO1xuICB9KTtcblxuICB0ZXN0KCdnZXRMb2dQYXRoIHJldHVybnMgY29ycmVjdCBwYXRoJywgKCkgPT4ge1xuICAgIGNvbnN0IGFjY2Vzc0xvZyA9IG5ldyBBY2Nlc3NMb2coc3RhY2ssICdBY2Nlc3NMb2cnKTtcbiAgICBleHBlY3QoYWNjZXNzTG9nLmdldExvZ1BhdGgoJ2FsYicpKS50b0JlKCdhY2Nlc3MtbG9ncy0xMjM0NTY3ODkwMTItdXMtZWFzdC0xL2FjY2Vzcy1sb2dzL2FsYicpO1xuICAgIGV4cGVjdChhY2Nlc3NMb2cuZ2V0TG9nUGF0aCgnYWxiJywgJ215LWFsYicpKS50b0JlKCdhY2Nlc3MtbG9ncy0xMjM0NTY3ODkwMTItdXMtZWFzdC0xL2FjY2Vzcy1sb2dzL2FsYi9teS1hbGInKTtcbiAgfSk7XG5cbiAgdGVzdCgnZ2V0TG9nVXJpIHJldHVybnMgY29ycmVjdCBTMyBVUkknLCAoKSA9PiB7XG4gICAgY29uc3QgYWNjZXNzTG9nID0gbmV3IEFjY2Vzc0xvZyhzdGFjaywgJ0FjY2Vzc0xvZycpO1xuICAgIGV4cGVjdChhY2Nlc3NMb2cuZ2V0TG9nVXJpKCdjbG91ZGZyb250JykpLnRvQmUoJ3MzOi8vYWNjZXNzLWxvZ3MtMTIzNDU2Nzg5MDEyLXVzLWVhc3QtMS9hY2Nlc3MtbG9ncy9jbG91ZGZyb250Jyk7XG4gICAgZXhwZWN0KGFjY2Vzc0xvZy5nZXRMb2dVcmkoJ2Nsb3VkZnJvbnQnLCAnbXktZGlzdCcpKS50b0JlKCdzMzovL2FjY2Vzcy1sb2dzLTEyMzQ1Njc4OTAxMi11cy1lYXN0LTEvYWNjZXNzLWxvZ3MvY2xvdWRmcm9udC9teS1kaXN0Jyk7XG4gIH0pO1xuXG4gIHRlc3QoJ3VzZXMgY3VzdG9tIGJ1Y2tldCBwcmVmaXgnLCAoKSA9PiB7XG4gICAgY29uc3QgYWNjZXNzTG9nID0gbmV3IEFjY2Vzc0xvZyhzdGFjaywgJ0FjY2Vzc0xvZycsIHtcbiAgICAgIGJ1Y2tldFByZWZpeDogJ2N1c3RvbS1wcmVmaXgnLFxuICAgIH0pO1xuICAgIGV4cGVjdChhY2Nlc3NMb2cuZ2V0TG9nUGF0aCgnczMnKSkudG9CZSgnYWNjZXNzLWxvZ3MtMTIzNDU2Nzg5MDEyLXVzLWVhc3QtMS9jdXN0b20tcHJlZml4L3MzJyk7XG4gIH0pO1xufSk7XG4iXX0=
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,164 @@
|
|
|
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 batch_agent_1 = require("../agents/batch-agent");
|
|
9
|
+
const network_1 = require("../foundation/network");
|
|
10
|
+
describe('BatchAgent', () => {
|
|
11
|
+
let stack;
|
|
12
|
+
let systemPrompt;
|
|
13
|
+
const testModel = aws_bedrock_1.FoundationModelIdentifier.ANTHROPIC_CLAUDE_3_SONNET_20240229_V1_0;
|
|
14
|
+
beforeEach(() => {
|
|
15
|
+
stack = new aws_cdk_lib_1.Stack(undefined, 'TestStack', {
|
|
16
|
+
env: { account: '123456789012', region: 'us-east-1' },
|
|
17
|
+
});
|
|
18
|
+
systemPrompt = new aws_s3_assets_1.Asset(stack, 'SystemPrompt', {
|
|
19
|
+
path: path.join(__dirname, '../agents/resources/default-strands-agent/batch.py'),
|
|
20
|
+
});
|
|
21
|
+
});
|
|
22
|
+
test('creates Lambda function with correct configuration', () => {
|
|
23
|
+
new batch_agent_1.BatchAgent(stack, 'Agent', {
|
|
24
|
+
agentName: 'TestAgent',
|
|
25
|
+
prompt: 'Test prompt',
|
|
26
|
+
agentDefinition: {
|
|
27
|
+
bedrockModel: { fmModelId: testModel },
|
|
28
|
+
systemPrompt,
|
|
29
|
+
},
|
|
30
|
+
});
|
|
31
|
+
const template = assertions_1.Template.fromStack(stack);
|
|
32
|
+
template.resourceCountIs('AWS::Lambda::Function', 1);
|
|
33
|
+
template.hasResourceProperties('AWS::Lambda::Function', {
|
|
34
|
+
Runtime: assertions_1.Match.stringLikeRegexp('python3\\.1[23]'),
|
|
35
|
+
Timeout: 600,
|
|
36
|
+
MemorySize: 1024,
|
|
37
|
+
Environment: {
|
|
38
|
+
Variables: assertions_1.Match.objectLike({
|
|
39
|
+
MODEL_ID: testModel.modelId,
|
|
40
|
+
INVOKE_TYPE: 'batch',
|
|
41
|
+
PROMPT: 'Test prompt',
|
|
42
|
+
}),
|
|
43
|
+
},
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
test('creates IAM role with Bedrock permissions', () => {
|
|
47
|
+
new batch_agent_1.BatchAgent(stack, 'Agent', {
|
|
48
|
+
agentName: 'TestAgent',
|
|
49
|
+
prompt: 'Test prompt',
|
|
50
|
+
agentDefinition: {
|
|
51
|
+
bedrockModel: { fmModelId: testModel },
|
|
52
|
+
systemPrompt,
|
|
53
|
+
},
|
|
54
|
+
});
|
|
55
|
+
const template = assertions_1.Template.fromStack(stack);
|
|
56
|
+
template.hasResourceProperties('AWS::IAM::Role', {
|
|
57
|
+
AssumeRolePolicyDocument: {
|
|
58
|
+
Statement: assertions_1.Match.arrayWith([
|
|
59
|
+
assertions_1.Match.objectLike({
|
|
60
|
+
Principal: { Service: 'lambda.amazonaws.com' },
|
|
61
|
+
}),
|
|
62
|
+
]),
|
|
63
|
+
},
|
|
64
|
+
});
|
|
65
|
+
template.hasResourceProperties('AWS::IAM::Policy', {
|
|
66
|
+
PolicyDocument: {
|
|
67
|
+
Statement: assertions_1.Match.arrayWith([
|
|
68
|
+
assertions_1.Match.objectLike({
|
|
69
|
+
Action: assertions_1.Match.arrayWith(['bedrock:InvokeModel']),
|
|
70
|
+
}),
|
|
71
|
+
]),
|
|
72
|
+
},
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
test('creates KMS key for environment encryption', () => {
|
|
76
|
+
new batch_agent_1.BatchAgent(stack, 'Agent', {
|
|
77
|
+
agentName: 'TestAgent',
|
|
78
|
+
prompt: 'Test prompt',
|
|
79
|
+
agentDefinition: {
|
|
80
|
+
bedrockModel: { fmModelId: testModel },
|
|
81
|
+
systemPrompt,
|
|
82
|
+
},
|
|
83
|
+
});
|
|
84
|
+
const template = assertions_1.Template.fromStack(stack);
|
|
85
|
+
// At least one KMS key exists (agent encryption key, plus potentially asset deployment key)
|
|
86
|
+
const keys = template.findResources('AWS::KMS::Key');
|
|
87
|
+
expect(Object.keys(keys).length).toBeGreaterThanOrEqual(1);
|
|
88
|
+
// Verify at least one key has rotation enabled
|
|
89
|
+
const hasRotationEnabled = Object.values(keys).some((key) => key.Properties.EnableKeyRotation === true);
|
|
90
|
+
expect(hasRotationEnabled).toBe(true);
|
|
91
|
+
});
|
|
92
|
+
test('configures VPC when network provided', () => {
|
|
93
|
+
const network = new network_1.Network(stack, 'Network');
|
|
94
|
+
new batch_agent_1.BatchAgent(stack, 'Agent', {
|
|
95
|
+
agentName: 'TestAgent',
|
|
96
|
+
prompt: 'Test prompt',
|
|
97
|
+
network,
|
|
98
|
+
agentDefinition: {
|
|
99
|
+
bedrockModel: { fmModelId: testModel },
|
|
100
|
+
systemPrompt,
|
|
101
|
+
},
|
|
102
|
+
});
|
|
103
|
+
const template = assertions_1.Template.fromStack(stack);
|
|
104
|
+
template.hasResourceProperties('AWS::Lambda::Function', {
|
|
105
|
+
VpcConfig: assertions_1.Match.objectLike({
|
|
106
|
+
SubnetIds: assertions_1.Match.anyValue(),
|
|
107
|
+
}),
|
|
108
|
+
});
|
|
109
|
+
});
|
|
110
|
+
test('sets EXPECT_JSON environment variable when expectJson is true', () => {
|
|
111
|
+
new batch_agent_1.BatchAgent(stack, 'Agent', {
|
|
112
|
+
agentName: 'TestAgent',
|
|
113
|
+
prompt: 'Test prompt',
|
|
114
|
+
expectJson: true,
|
|
115
|
+
agentDefinition: {
|
|
116
|
+
bedrockModel: { fmModelId: testModel },
|
|
117
|
+
systemPrompt,
|
|
118
|
+
},
|
|
119
|
+
});
|
|
120
|
+
const template = assertions_1.Template.fromStack(stack);
|
|
121
|
+
template.hasResourceProperties('AWS::Lambda::Function', {
|
|
122
|
+
Environment: {
|
|
123
|
+
Variables: assertions_1.Match.objectLike({
|
|
124
|
+
EXPECT_JSON: 'True',
|
|
125
|
+
}),
|
|
126
|
+
},
|
|
127
|
+
});
|
|
128
|
+
});
|
|
129
|
+
test('enables observability with Powertools configuration', () => {
|
|
130
|
+
new batch_agent_1.BatchAgent(stack, 'Agent', {
|
|
131
|
+
agentName: 'TestAgent',
|
|
132
|
+
prompt: 'Test prompt',
|
|
133
|
+
enableObservability: true,
|
|
134
|
+
agentDefinition: {
|
|
135
|
+
bedrockModel: { fmModelId: testModel },
|
|
136
|
+
systemPrompt,
|
|
137
|
+
},
|
|
138
|
+
});
|
|
139
|
+
const template = assertions_1.Template.fromStack(stack);
|
|
140
|
+
template.hasResourceProperties('AWS::Lambda::Function', {
|
|
141
|
+
Environment: {
|
|
142
|
+
Variables: assertions_1.Match.objectLike({
|
|
143
|
+
POWERTOOLS_SERVICE_NAME: assertions_1.Match.anyValue(),
|
|
144
|
+
POWERTOOLS_METRICS_NAMESPACE: assertions_1.Match.anyValue(),
|
|
145
|
+
}),
|
|
146
|
+
},
|
|
147
|
+
});
|
|
148
|
+
});
|
|
149
|
+
test('grants read access to system prompt asset', () => {
|
|
150
|
+
new batch_agent_1.BatchAgent(stack, 'Agent', {
|
|
151
|
+
agentName: 'TestAgent',
|
|
152
|
+
prompt: 'Test prompt',
|
|
153
|
+
agentDefinition: {
|
|
154
|
+
bedrockModel: { fmModelId: testModel },
|
|
155
|
+
systemPrompt,
|
|
156
|
+
},
|
|
157
|
+
});
|
|
158
|
+
const template = assertions_1.Template.fromStack(stack);
|
|
159
|
+
// Verify that IAM policies exist (S3 permissions are granted via Asset construct)
|
|
160
|
+
const policies = template.findResources('AWS::IAM::Policy');
|
|
161
|
+
expect(Object.keys(policies).length).toBeGreaterThan(0);
|
|
162
|
+
});
|
|
163
|
+
});
|
|
164
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmF0Y2gtYWdlbnQudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3VzZS1jYXNlcy9mcmFtZXdvcmsvdGVzdHMvYmF0Y2gtYWdlbnQudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLDZCQUE2QjtBQUM3Qiw2Q0FBb0M7QUFDcEMsdURBQXlEO0FBQ3pELHlEQUFvRTtBQUNwRSw2REFBa0Q7QUFDbEQsdURBQW1EO0FBQ25ELG1EQUFnRDtBQUVoRCxRQUFRLENBQUMsWUFBWSxFQUFFLEdBQUcsRUFBRTtJQUMxQixJQUFJLEtBQVksQ0FBQztJQUNqQixJQUFJLFlBQW1CLENBQUM7SUFDeEIsTUFBTSxTQUFTLEdBQUcsdUNBQXlCLENBQUMsdUNBQXVDLENBQUM7SUFFcEYsVUFBVSxDQUFDLEdBQUcsRUFBRTtRQUNkLEtBQUssR0FBRyxJQUFJLG1CQUFLLENBQUMsU0FBUyxFQUFFLFdBQVcsRUFBRTtZQUN4QyxHQUFHLEVBQUUsRUFBRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUU7U0FDdEQsQ0FBQyxDQUFDO1FBRUgsWUFBWSxHQUFHLElBQUkscUJBQUssQ0FBQyxLQUFLLEVBQUUsY0FBYyxFQUFFO1lBQzlDLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxvREFBb0QsQ0FBQztTQUNqRixDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILElBQUksQ0FBQyxvREFBb0QsRUFBRSxHQUFHLEVBQUU7UUFDOUQsSUFBSSx3QkFBVSxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUU7WUFDN0IsU0FBUyxFQUFFLFdBQVc7WUFDdEIsTUFBTSxFQUFFLGFBQWE7WUFDckIsZUFBZSxFQUFFO2dCQUNmLFlBQVksRUFBRSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUU7Z0JBQ3RDLFlBQVk7YUFDYjtTQUNGLENBQUMsQ0FBQztRQUVILE1BQU0sUUFBUSxHQUFHLHFCQUFR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LENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMxRCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IFN0YWNrIH0gZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0IHsgVGVtcGxhdGUsIE1hdGNoIH0gZnJvbSAnYXdzLWNkay1saWIvYXNzZXJ0aW9ucyc7XG5pbXBvcnQgeyBGb3VuZGF0aW9uTW9kZWxJZGVudGlmaWVyIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWJlZHJvY2snO1xuaW1wb3J0IHsgQXNzZXQgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtczMtYXNzZXRzJztcbmltcG9ydCB7IEJhdGNoQWdlbnQgfSBmcm9tICcuLi9hZ2VudHMvYmF0Y2gtYWdlbnQnO1xuaW1wb3J0IHsgTmV0d29yayB9IGZyb20gJy4uL2ZvdW5kYXRpb24vbmV0d29yayc7XG5cbmRlc2NyaWJlKCdCYXRjaEFnZW50JywgKCkgPT4ge1xuICBsZXQgc3RhY2s6IFN0YWNrO1xuICBsZXQgc3lzdGVtUHJvbXB0OiBBc3NldDtcbiAgY29uc3QgdGVzdE1vZGVsID0gRm91bmRhdGlvbk1vZGVsSWRlbnRpZmllci5BTlRIUk9QSUNfQ0xBVURFXzNfU09OTkVUXzIwMjQwMjI5X1YxXzA7XG5cbiAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgc3RhY2sgPSBuZXcgU3RhY2sodW5kZWZpbmVkLCAnVGVzdFN0YWNrJywge1xuICAgICAgZW52OiB7IGFjY291bnQ6ICcxMjM0NTY3ODkwMTInLCByZWdpb246ICd1cy1lYXN0LTEnIH0sXG4gICAgfSk7XG5cbiAgICBzeXN0ZW1Qcm9tcHQgPSBuZXcgQXNzZXQoc3RhY2ssICdTeXN0ZW1Qcm9tcHQnLCB7XG4gICAgICBwYXRoOiBwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4vYWdlbnRzL3Jlc291cmNlcy9kZWZhdWx0LXN0cmFuZHMtYWdlbnQvYmF0Y2gucHknKSxcbiAgICB9KTtcbiAgfSk7XG5cbiAgdGVzdCgnY3JlYXRlcyBMYW1iZGEgZnVuY3Rpb24gd2l0aCBjb3JyZWN0IGNvbmZpZ3VyYXRpb24nLCAoKSA9PiB7XG4gICAgbmV3IEJhdGNoQWdlbnQoc3RhY2ssICdBZ2VudCcsIHtcbiAgICAgIGFnZW50TmFtZTogJ1Rlc3RBZ2VudCcsXG4gICAgICBwcm9tcHQ6ICdUZXN0IHByb21wdCcsXG4gICAgICBhZ2VudERlZmluaXRpb246IHtcbiAgICAgICAgYmVkcm9ja01vZGVsOiB7IGZtTW9kZWxJZDogdGVzdE1vZGVsIH0sXG4gICAgICAgIHN5c3RlbVByb21wdCxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBjb25zdCB0ZW1wbGF0ZSA9IFRlbXBsYXRlLmZyb21TdGFjayhzdGFjayk7XG4gICAgdGVtcGxhdGUucmVzb3VyY2VDb3VudElzKCdBV1M6OkxhbWJkYTo6RnVuY3Rpb24nLCAxKTtcbiAgICB0ZW1wbGF0ZS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6TGFtYmRhOjpGdW5jdGlvbicsIHtcbiAgICAgIFJ1bnRpbWU6IE1hdGNoLnN0cmluZ0xpa2VSZWdleHAoJ3B5dGhvbjNcXFxcLjFbMjNdJyksXG4gICAgICBUaW1lb3V0OiA2MDAsXG4gICAgICBNZW1vcnlTaXplOiAxMDI0LFxuICAgICAgRW52aXJvbm1lbnQ6IHtcbiAgICAgICAgVmFyaWFibGVzOiBNYXRjaC5vYmplY3RMaWtlKHtcbiAgICAgICAgICBNT0RFTF9JRDogdGVzdE1vZGVsLm1vZGVsSWQsXG4gICAgICAgICAgSU5WT0tFX1RZUEU6ICdiYXRjaCcsXG4gICAgICAgICAgUFJPTVBUOiAnVGVzdCBwcm9tcHQnLFxuICAgICAgICB9KSxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH0pO1xuXG4gIHRlc3QoJ2NyZWF0ZXMgSUFNIHJvbGUgd2l0aCBCZWRyb2NrIHBlcm1pc3Npb25zJywgKCkgPT4ge1xuICAgIG5ldyBCYXRjaEFnZW50KHN0YWNrLCAnQWdlbnQnLCB7XG4gICAgICBhZ2VudE5hbWU6ICdUZXN0QWdlbnQnLFxuICAgICAgcHJvbXB0OiAnVGVzdCBwcm9tcHQnLFxuICAgICAgYWdlbnREZWZpbml0aW9uOiB7XG4gICAgICAgIGJlZHJvY2tNb2RlbDogeyBmbU1vZGVsSWQ6IHRlc3RNb2RlbCB9LFxuICAgICAgICBzeXN0ZW1Qcm9tcHQsXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgY29uc3QgdGVtcGxhdGUgPSBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spO1xuICAgIHRlbXBsYXRlLmhhc1Jlc291cmNlUHJvcGVydGllcygnQVdTOjpJQU06OlJvbGUnLCB7XG4gICAgICBBc3N1bWVSb2xlUG9saWN5RG9jdW1lbnQ6IHtcbiAgICAgICAgU3RhdGVtZW50OiBNYXRjaC5hcnJheVdpdGgoW1xuICAgICAgICAgIE1hdGNoLm9iamVjdExpa2Uoe1xuICAgICAgICAgICAgUHJpbmNpcGFsOiB7IFNlcnZpY2U6ICdsYW1iZGEuYW1hem9uYXdzLmNvbScgfSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgXSksXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgdGVtcGxhdGUuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OklBTTo6UG9saWN5Jywge1xuICAgICAgUG9saWN5RG9jdW1lbnQ6IHtcbiAgICAgICAgU3RhdGVtZW50OiBNYXRjaC5hcnJheVdpdGgoW1xuICAgICAgICAgIE1hdGNoLm9iamVjdExpa2Uoe1xuICAgICAgICAgICAgQWN0aW9uOiBNYXRjaC5hcnJheVdpdGgoWydiZWRyb2NrOkludm9rZU1vZGVsJ10pLFxuICAgICAgICAgIH0pLFxuICAgICAgICBdKSxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH0pO1xuXG4gIHRlc3QoJ2NyZWF0ZXMgS01TIGtleSBmb3IgZW52aXJvbm1lbnQgZW5jcnlwdGlvbicsICgpID0+IHtcbiAgICBuZXcgQmF0Y2hBZ2VudChzdGFjaywgJ0FnZW50Jywge1xuICAgICAgYWdlbnROYW1lOiAnVGVzdEFnZW50JyxcbiAgICAgIHByb21wdDogJ1Rlc3QgcHJvbXB0JyxcbiAgICAgIGFnZW50RGVmaW5pdGlvbjoge1xuICAgICAgICBiZWRyb2NrTW9kZWw6IHsgZm1Nb2RlbElkOiB0ZXN0TW9kZWwgfSxcbiAgICAgICAgc3lzdGVtUHJvbXB0LFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHRlbXBsYXRlID0gVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKTtcbiAgICAvLyBBdCBsZWFzdCBvbmUgS01TIGtleSBleGlzdHMgKGFnZW50IGVuY3J5cHRpb24ga2V5LCBwbHVzIHBvdGVudGlhbGx5IGFzc2V0IGRlcGxveW1lbnQga2V5KVxuICAgIGNvbnN0IGtleXMgPSB0ZW1wbGF0ZS5maW5kUmVzb3VyY2VzKCdBV1M6OktNUzo6S2V5Jyk7XG4gICAgZXhwZWN0KE9iamVjdC5rZXlzKGtleXMpLmxlbmd0aCkudG9CZUdyZWF0ZXJUaGFuT3JFcXVhbCgxKTtcblxuICAgIC8vIFZlcmlmeSBhdCBsZWFzdCBvbmUga2V5IGhhcyByb3RhdGlvbiBlbmFibGVkXG4gICAgY29uc3QgaGFzUm90YXRpb25FbmFibGVkID0gT2JqZWN0LnZhbHVlcyhrZXlzKS5zb21lKChrZXk6IGFueSkgPT5cbiAgICAgIGtleS5Qcm9wZXJ0aWVzLkVuYWJsZUtleVJvdGF0aW9uID09PSB0cnVlLFxuICAgICk7XG4gICAgZXhwZWN0KGhhc1JvdGF0aW9uRW5hYmxlZCkudG9CZSh0cnVlKTtcbiAgfSk7XG5cbiAgdGVzdCgnY29uZmlndXJlcyBWUEMgd2hlbiBuZXR3b3JrIHByb3ZpZGVkJywgKCkgPT4ge1xuICAgIGNvbnN0IG5ldHdvcmsgPSBuZXcgTmV0d29yayhzdGFjaywgJ05ldHdvcmsnKTtcblxuICAgIG5ldyBCYXRjaEFnZW50KHN0YWNrLCAnQWdlbnQnLCB7XG4gICAgICBhZ2VudE5hbWU6ICdUZXN0QWdlbnQnLFxuICAgICAgcHJvbXB0OiAnVGVzdCBwcm9tcHQnLFxuICAgICAgbmV0d29yayxcbiAgICAgIGFnZW50RGVmaW5pdGlvbjoge1xuICAgICAgICBiZWRyb2NrTW9kZWw6IHsgZm1Nb2RlbElkOiB0ZXN0TW9kZWwgfSxcbiAgICAgICAgc3lzdGVtUHJvbXB0LFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHRlbXBsYXRlID0gVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKTtcbiAgICB0ZW1wbGF0ZS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6TGFtYmRhOjpGdW5jdGlvbicsIHtcbiAgICAgIFZwY0NvbmZpZzogTWF0Y2gub2JqZWN0TGlrZSh7XG4gICAgICAgIFN1Ym5ldElkczogTWF0Y2guYW55VmFsdWUoKSxcbiAgICAgIH0pLFxuICAgIH0pO1xuICB9KTtcblxuICB0ZXN0KCdzZXRzIEVYUEVDVF9KU09OIGVudmlyb25tZW50IHZhcmlhYmxlIHdoZW4gZXhwZWN0SnNvbiBpcyB0cnVlJywgKCkgPT4ge1xuICAgIG5ldyBCYXRjaEFnZW50KHN0YWNrLCAnQWdlbnQnLCB7XG4gICAgICBhZ2VudE5hbWU6ICdUZXN0QWdlbnQnLFxuICAgICAgcHJvbXB0OiAnVGVzdCBwcm9tcHQnLFxuICAgICAgZXhwZWN0SnNvbjogdHJ1ZSxcbiAgICAgIGFnZW50RGVmaW5pdGlvbjoge1xuICAgICAgICBiZWRyb2NrTW9kZWw6IHsgZm1Nb2RlbElkOiB0ZXN0TW9kZWwgfSxcbiAgICAgICAgc3lzdGVtUHJvbXB0LFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHRlbXBsYXRlID0gVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKTtcbiAgICB0ZW1wbGF0ZS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6TGFtYmRhOjpGdW5jdGlvbicsIHtcbiAgICAgIEVudmlyb25tZW50OiB7XG4gICAgICAgIFZhcmlhYmxlczogTWF0Y2gub2JqZWN0TGlrZSh7XG4gICAgICAgICAgRVhQRUNUX0pTT046ICdUcnVlJyxcbiAgICAgICAgfSksXG4gICAgICB9LFxuICAgIH0pO1xuICB9KTtcblxuICB0ZXN0KCdlbmFibGVzIG9ic2VydmFiaWxpdHkgd2l0aCBQb3dlcnRvb2xzIGNvbmZpZ3VyYXRpb24nLCAoKSA9PiB7XG4gICAgbmV3IEJhdGNoQWdlbnQoc3RhY2ssICdBZ2VudCcsIHtcbiAgICAgIGFnZW50TmFtZTogJ1Rlc3RBZ2VudCcsXG4gICAgICBwcm9tcHQ6ICdUZXN0IHByb21wdCcsXG4gICAgICBlbmFibGVPYnNlcnZhYmlsaXR5OiB0cnVlLFxuICAgICAgYWdlbnREZWZpbml0aW9uOiB7XG4gICAgICAgIGJlZHJvY2tNb2RlbDogeyBmbU1vZGVsSWQ6IHRlc3RNb2RlbCB9LFxuICAgICAgICBzeXN0ZW1Qcm9tcHQsXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgY29uc3QgdGVtcGxhdGUgPSBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spO1xuICAgIHRlbXBsYXRlLmhhc1Jlc291cmNlUHJvcGVydGllcygnQVdTOjpMYW1iZGE6OkZ1bmN0aW9uJywge1xuICAgICAgRW52aXJvbm1lbnQ6IHtcbiAgICAgICAgVmFyaWFibGVzOiBNYXRjaC5vYmplY3RMaWtlKHtcbiAgICAgICAgICBQT1dFUlRPT0xTX1NFUlZJQ0VfTkFNRTogTWF0Y2guYW55VmFsdWUoKSxcbiAgICAgICAgICBQT1dFUlRPT0xTX01FVFJJQ1NfTkFNRVNQQUNFOiBNYXRjaC5hbnlWYWx1ZSgpLFxuICAgICAgICB9KSxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH0pO1xuXG4gIHRlc3QoJ2dyYW50cyByZWFkIGFjY2VzcyB0byBzeXN0ZW0gcHJvbXB0IGFzc2V0JywgKCkgPT4ge1xuICAgIG5ldyBCYXRjaEFnZW50KHN0YWNrLCAnQWdlbnQnLCB7XG4gICAgICBhZ2VudE5hbWU6ICdUZXN0QWdlbnQnLFxuICAgICAgcHJvbXB0OiAnVGVzdCBwcm9tcHQnLFxuICAgICAgYWdlbnREZWZpbml0aW9uOiB7XG4gICAgICAgIGJlZHJvY2tNb2RlbDogeyBmbU1vZGVsSWQ6IHRlc3RNb2RlbCB9LFxuICAgICAgICBzeXN0ZW1Qcm9tcHQsXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgY29uc3QgdGVtcGxhdGUgPSBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spO1xuICAgIC8vIFZlcmlmeSB0aGF0IElBTSBwb2xpY2llcyBleGlzdCAoUzMgcGVybWlzc2lvbnMgYXJlIGdyYW50ZWQgdmlhIEFzc2V0IGNvbnN0cnVjdClcbiAgICBjb25zdCBwb2xpY2llcyA9IHRlbXBsYXRlLmZpbmRSZXNvdXJjZXMoJ0FXUzo6SUFNOjpQb2xpY3knKTtcbiAgICBleHBlY3QoT2JqZWN0LmtleXMocG9saWNpZXMpLmxlbmd0aCkudG9CZUdyZWF0ZXJUaGFuKDApO1xuICB9KTtcbn0pO1xuIl19
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const aws_cdk_lib_1 = require("aws-cdk-lib");
|
|
4
|
+
const aws_bedrock_1 = require("aws-cdk-lib/aws-bedrock");
|
|
5
|
+
const bedrock_1 = require("../bedrock/bedrock");
|
|
6
|
+
describe('BedrockModelUtils', () => {
|
|
7
|
+
let stack;
|
|
8
|
+
const testModel = aws_bedrock_1.FoundationModelIdentifier.ANTHROPIC_CLAUDE_3_SONNET_20240229_V1_0;
|
|
9
|
+
beforeEach(() => {
|
|
10
|
+
stack = new aws_cdk_lib_1.Stack(undefined, 'TestStack', {
|
|
11
|
+
env: { account: '123456789012', region: 'us-east-1' },
|
|
12
|
+
});
|
|
13
|
+
});
|
|
14
|
+
test('deriveActualModelId returns model ID without cross-region inference', () => {
|
|
15
|
+
const modelId = bedrock_1.BedrockModelUtils.deriveActualModelId({
|
|
16
|
+
fmModelId: testModel,
|
|
17
|
+
useCrossRegionInference: false,
|
|
18
|
+
});
|
|
19
|
+
expect(modelId).toBe(testModel.modelId);
|
|
20
|
+
});
|
|
21
|
+
test('deriveActualModelId returns prefixed model ID with cross-region inference', () => {
|
|
22
|
+
const modelId = bedrock_1.BedrockModelUtils.deriveActualModelId({
|
|
23
|
+
fmModelId: testModel,
|
|
24
|
+
useCrossRegionInference: true,
|
|
25
|
+
crossRegionInferencePrefix: bedrock_1.BedrockCrossRegionInferencePrefix.US,
|
|
26
|
+
});
|
|
27
|
+
expect(modelId).toBe(`us.${testModel.modelId}`);
|
|
28
|
+
});
|
|
29
|
+
test('deriveActualModelId uses EU prefix when specified', () => {
|
|
30
|
+
const modelId = bedrock_1.BedrockModelUtils.deriveActualModelId({
|
|
31
|
+
fmModelId: testModel,
|
|
32
|
+
useCrossRegionInference: true,
|
|
33
|
+
crossRegionInferencePrefix: bedrock_1.BedrockCrossRegionInferencePrefix.EU,
|
|
34
|
+
});
|
|
35
|
+
expect(modelId).toBe(`eu.${testModel.modelId}`);
|
|
36
|
+
});
|
|
37
|
+
test('deriveActualModelId uses default model when not specified', () => {
|
|
38
|
+
const modelId = bedrock_1.BedrockModelUtils.deriveActualModelId();
|
|
39
|
+
expect(modelId).toBe(aws_bedrock_1.FoundationModelIdentifier.ANTHROPIC_CLAUDE_SONNET_4_20250514_V1_0.modelId);
|
|
40
|
+
});
|
|
41
|
+
test('generateModelIAMPermissions creates policy for foundation model', () => {
|
|
42
|
+
const policy = bedrock_1.BedrockModelUtils.generateModelIAMPermissions(stack, {
|
|
43
|
+
fmModelId: testModel,
|
|
44
|
+
});
|
|
45
|
+
const statement = policy.toJSON();
|
|
46
|
+
expect(statement.Effect).toBe('Allow');
|
|
47
|
+
expect(statement.Action).toEqual([
|
|
48
|
+
'bedrock:InvokeModel',
|
|
49
|
+
'bedrock:InvokeModelWithResponseStream',
|
|
50
|
+
]);
|
|
51
|
+
expect(statement.Resource).toContainEqual(`arn:aws:bedrock:*::foundation-model/${testModel.modelId}`);
|
|
52
|
+
});
|
|
53
|
+
test('generateModelIAMPermissions includes inference profile ARN', () => {
|
|
54
|
+
const policy = bedrock_1.BedrockModelUtils.generateModelIAMPermissions(stack, {
|
|
55
|
+
fmModelId: testModel,
|
|
56
|
+
useCrossRegionInference: true,
|
|
57
|
+
crossRegionInferencePrefix: bedrock_1.BedrockCrossRegionInferencePrefix.US,
|
|
58
|
+
});
|
|
59
|
+
const statement = policy.toJSON();
|
|
60
|
+
expect(statement.Resource).toContainEqual(`arn:aws:bedrock:us-east-1:123456789012:inference-profile/us.${testModel.modelId}`);
|
|
61
|
+
});
|
|
62
|
+
test('generateModelIAMPermissions uses default US prefix', () => {
|
|
63
|
+
const policy = bedrock_1.BedrockModelUtils.generateModelIAMPermissions(stack);
|
|
64
|
+
const statement = policy.toJSON();
|
|
65
|
+
expect(statement.Resource).toContainEqual(expect.stringContaining('inference-profile/us.'));
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmVkcm9jay50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdXNlLWNhc2VzL2ZyYW1ld29yay90ZXN0cy9iZWRyb2NrLnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSw2Q0FBb0M7QUFDcEMseURBQW9FO0FBQ3BFLGdEQUEwRjtBQUUxRixRQUFRLENBQUMsbUJBQW1CLEVBQUUsR0FBRyxFQUFFO0lBQ2pDLElBQUksS0FBWSxDQUFDO0lBQ2pCLE1BQU0sU0FBUyxHQUFHLHVDQUF5QixDQUFDLHVDQUF1QyxDQUFDO0lBRXBGLFVBQVUsQ0FBQyxHQUFHLEVBQUU7UUFDZCxLQUFLLEdBQUcsSUFBSSxtQkFBSyxDQUFDLFNBQVMsRUFBRSxXQUFXLEVBQUU7WUFDeEMsR0FBRyxFQUFFLEVBQUUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFO1NBQ3RELENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsSUFBSSxDQUFDLHFFQUFxRSxFQUFFLEdBQUcsRUFBRTtRQUMvRSxNQUFNLE9BQU8sR0FBRywyQkFBaUIsQ0FBQyxtQkFBbUIsQ0FBQztZQUNwRCxTQUFTLEVBQUUsU0FBUztZQUNwQix1QkFBdUIsRUFBRSxLQUFLO1NBQy9CLENBQUMsQ0FBQztRQUVILE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzFDLENBQUMsQ0FBQyxDQUFDO0lBRUgsSUFBSSxDQUFDLDJFQUEyRSxFQUFFLEdBQUcsRUFBRTtRQUNyRixNQUFNLE9BQU8sR0FBRywyQkFBaUIsQ0FBQyxtQkFBbUIsQ0FBQztZQUNwRCxTQUFTLEVBQUUsU0FBUztZQUNwQix1QkFBdUIsRUFBRSxJQUFJO1lBQzdCLDBCQUEwQixFQUFFLDJDQUFpQyxDQUFDLEVBQUU7U0FDakUsQ0FBQyxDQUFDO1FBRUgsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLFNBQVMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBQ2xELENBQUMsQ0FBQyxDQUFDO0lBRUgsSUFBSSxDQUFDLG1EQUFtRCxFQUFFLEdBQUcsRUFBRTtRQUM3RCxNQUFNLE9BQU8sR0FBRywyQkFBaUIsQ0FBQyxtQkFBbUIsQ0FBQztZQUNwRCxTQUFTLEVBQUUsU0FBUztZQUNwQix1QkFBdUIsRUFBRSxJQUFJO1lBQzdCLDBCQUEwQixFQUFFLDJDQUFpQyxDQUFDLEVBQUU7U0FDakUsQ0FBQyxDQUFDO1FBRUgsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLFNBQVMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBQ2xELENBQUMsQ0FBQyxDQUFDO0lBRUgsSUFBSSxDQUFDLDJEQUEyRCxFQUFFLEdBQUcsRUFBRTtRQUNyRSxNQUFNLE9BQU8sR0FBRywyQkFBaUIsQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBRXhELE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsdUNBQXlCLENBQUMsdUNBQXVDLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDbEcsQ0FBQyxDQUFDLENBQUM7SUFFSCxJQUFJLENBQUMsaUVBQWlFLEVBQUUsR0FBRyxFQUFFO1FBQzNFLE1BQU0sTUFBTSxHQUFHLDJCQUFpQixDQUFDLDJCQUEyQixDQUFDLEtBQUssRUFBRTtZQUNsRSxTQUFTLEVBQUUsU0FBUztTQUNyQixDQUFDLENBQUM7UUFFSCxNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDbEMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDdkMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUM7WUFDL0IscUJBQXFCO1lBQ3JCLHVDQUF1QztTQUN4QyxDQUFDLENBQUM7UUFDSCxNQUFNLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDLGNBQWMsQ0FDdkMsdUNBQXVDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsQ0FDM0QsQ0FBQztJQUNKLENBQUMsQ0FBQyxDQUFDO0lBRUgsSUFBSSxDQUFDLDREQUE0RCxFQUFFLEdBQUcsRUFBRTtRQUN0RSxNQUFNLE1BQU0sR0FBRywyQkFBaUIsQ0FBQywyQkFBMkIsQ0FBQyxLQUFLLEVBQUU7WUFDbEUsU0FBUyxFQUFFLFNBQVM7WUFDcEIsdUJBQXVCLEVBQUUsSUFBSTtZQUM3QiwwQkFBMEIsRUFBRSwyQ0FBaUMsQ0FBQyxFQUFFO1NBQ2pFLENBQUMsQ0FBQztRQUVILE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNsQyxNQUFNLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDLGNBQWMsQ0FDdkMsK0RBQStELFNBQVMsQ0FBQyxPQUFPLEVBQUUsQ0FDbkYsQ0FBQztJQUNKLENBQUMsQ0FBQyxDQUFDO0lBRUgsSUFBSSxDQUFDLG9EQUFvRCxFQUFFLEdBQUcsRUFBRTtRQUM5RCxNQUFNLE1BQU0sR0FBRywyQkFBaUIsQ0FBQywyQkFBMkIsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUVwRSxNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDbEMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxjQUFjLENBQ3ZDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyx1QkFBdUIsQ0FBQyxDQUNqRCxDQUFDO0lBQ0osQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFN0YWNrIH0gZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0IHsgRm91bmRhdGlvbk1vZGVsSWRlbnRpZmllciB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1iZWRyb2NrJztcbmltcG9ydCB7IEJlZHJvY2tDcm9zc1JlZ2lvbkluZmVyZW5jZVByZWZpeCwgQmVkcm9ja01vZGVsVXRpbHMgfSBmcm9tICcuLi9iZWRyb2NrL2JlZHJvY2snO1xuXG5kZXNjcmliZSgnQmVkcm9ja01vZGVsVXRpbHMnLCAoKSA9PiB7XG4gIGxldCBzdGFjazogU3RhY2s7XG4gIGNvbnN0IHRlc3RNb2RlbCA9IEZvdW5kYXRpb25Nb2RlbElkZW50aWZpZXIuQU5USFJPUElDX0NMQVVERV8zX1NPTk5FVF8yMDI0MDIyOV9WMV8wO1xuXG4gIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgIHN0YWNrID0gbmV3IFN0YWNrKHVuZGVmaW5lZCwgJ1Rlc3RTdGFjaycsIHtcbiAgICAgIGVudjogeyBhY2NvdW50OiAnMTIzNDU2Nzg5MDEyJywgcmVnaW9uOiAndXMtZWFzdC0xJyB9LFxuICAgIH0pO1xuICB9KTtcblxuICB0ZXN0KCdkZXJpdmVBY3R1YWxNb2RlbElkIHJldHVybnMgbW9kZWwgSUQgd2l0aG91dCBjcm9zcy1yZWdpb24gaW5mZXJlbmNlJywgKCkgPT4ge1xuICAgIGNvbnN0IG1vZGVsSWQgPSBCZWRyb2NrTW9kZWxVdGlscy5kZXJpdmVBY3R1YWxNb2RlbElkKHtcbiAgICAgIGZtTW9kZWxJZDogdGVzdE1vZGVsLFxuICAgICAgdXNlQ3Jvc3NSZWdpb25JbmZlcmVuY2U6IGZhbHNlLFxuICAgIH0pO1xuXG4gICAgZXhwZWN0KG1vZGVsSWQpLnRvQmUodGVzdE1vZGVsLm1vZGVsSWQpO1xuICB9KTtcblxuICB0ZXN0KCdkZXJpdmVBY3R1YWxNb2RlbElkIHJldHVybnMgcHJlZml4ZWQgbW9kZWwgSUQgd2l0aCBjcm9zcy1yZWdpb24gaW5mZXJlbmNlJywgKCkgPT4ge1xuICAgIGNvbnN0IG1vZGVsSWQgPSBCZWRyb2NrTW9kZWxVdGlscy5kZXJpdmVBY3R1YWxNb2RlbElkKHtcbiAgICAgIGZtTW9kZWxJZDogdGVzdE1vZGVsLFxuICAgICAgdXNlQ3Jvc3NSZWdpb25JbmZlcmVuY2U6IHRydWUsXG4gICAgICBjcm9zc1JlZ2lvbkluZmVyZW5jZVByZWZpeDogQmVkcm9ja0Nyb3NzUmVnaW9uSW5mZXJlbmNlUHJlZml4LlVTLFxuICAgIH0pO1xuXG4gICAgZXhwZWN0KG1vZGVsSWQpLnRvQmUoYHVzLiR7dGVzdE1vZGVsLm1vZGVsSWR9YCk7XG4gIH0pO1xuXG4gIHRlc3QoJ2Rlcml2ZUFjdHVhbE1vZGVsSWQgdXNlcyBFVSBwcmVmaXggd2hlbiBzcGVjaWZpZWQnLCAoKSA9PiB7XG4gICAgY29uc3QgbW9kZWxJZCA9IEJlZHJvY2tNb2RlbFV0aWxzLmRlcml2ZUFjdHVhbE1vZGVsSWQoe1xuICAgICAgZm1Nb2RlbElkOiB0ZXN0TW9kZWwsXG4gICAgICB1c2VDcm9zc1JlZ2lvbkluZmVyZW5jZTogdHJ1ZSxcbiAgICAgIGNyb3NzUmVnaW9uSW5mZXJlbmNlUHJlZml4OiBCZWRyb2NrQ3Jvc3NSZWdpb25JbmZlcmVuY2VQcmVmaXguRVUsXG4gICAgfSk7XG5cbiAgICBleHBlY3QobW9kZWxJZCkudG9CZShgZXUuJHt0ZXN0TW9kZWwubW9kZWxJZH1gKTtcbiAgfSk7XG5cbiAgdGVzdCgnZGVyaXZlQWN0dWFsTW9kZWxJZCB1c2VzIGRlZmF1bHQgbW9kZWwgd2hlbiBub3Qgc3BlY2lmaWVkJywgKCkgPT4ge1xuICAgIGNvbnN0IG1vZGVsSWQgPSBCZWRyb2NrTW9kZWxVdGlscy5kZXJpdmVBY3R1YWxNb2RlbElkKCk7XG5cbiAgICBleHBlY3QobW9kZWxJZCkudG9CZShGb3VuZGF0aW9uTW9kZWxJZGVudGlmaWVyLkFOVEhST1BJQ19DTEFVREVfU09OTkVUXzRfMjAyNTA1MTRfVjFfMC5tb2RlbElkKTtcbiAgfSk7XG5cbiAgdGVzdCgnZ2VuZXJhdGVNb2RlbElBTVBlcm1pc3Npb25zIGNyZWF0ZXMgcG9saWN5IGZvciBmb3VuZGF0aW9uIG1vZGVsJywgKCkgPT4ge1xuICAgIGNvbnN0IHBvbGljeSA9IEJlZHJvY2tNb2RlbFV0aWxzLmdlbmVyYXRlTW9kZWxJQU1QZXJtaXNzaW9ucyhzdGFjaywge1xuICAgICAgZm1Nb2RlbElkOiB0ZXN0TW9kZWwsXG4gICAgfSk7XG5cbiAgICBjb25zdCBzdGF0ZW1lbnQgPSBwb2xpY3kudG9KU09OKCk7XG4gICAgZXhwZWN0KHN0YXRlbWVudC5FZmZlY3QpLnRvQmUoJ0FsbG93Jyk7XG4gICAgZXhwZWN0KHN0YXRlbWVudC5BY3Rpb24pLnRvRXF1YWwoW1xuICAgICAgJ2JlZHJvY2s6SW52b2tlTW9kZWwnLFxuICAgICAgJ2JlZHJvY2s6SW52b2tlTW9kZWxXaXRoUmVzcG9uc2VTdHJlYW0nLFxuICAgIF0pO1xuICAgIGV4cGVjdChzdGF0ZW1lbnQuUmVzb3VyY2UpLnRvQ29udGFpbkVxdWFsKFxuICAgICAgYGFybjphd3M6YmVkcm9jazoqOjpmb3VuZGF0aW9uLW1vZGVsLyR7dGVzdE1vZGVsLm1vZGVsSWR9YCxcbiAgICApO1xuICB9KTtcblxuICB0ZXN0KCdnZW5lcmF0ZU1vZGVsSUFNUGVybWlzc2lvbnMgaW5jbHVkZXMgaW5mZXJlbmNlIHByb2ZpbGUgQVJOJywgKCkgPT4ge1xuICAgIGNvbnN0IHBvbGljeSA9IEJlZHJvY2tNb2RlbFV0aWxzLmdlbmVyYXRlTW9kZWxJQU1QZXJtaXNzaW9ucyhzdGFjaywge1xuICAgICAgZm1Nb2RlbElkOiB0ZXN0TW9kZWwsXG4gICAgICB1c2VDcm9zc1JlZ2lvbkluZmVyZW5jZTogdHJ1ZSxcbiAgICAgIGNyb3NzUmVnaW9uSW5mZXJlbmNlUHJlZml4OiBCZWRyb2NrQ3Jvc3NSZWdpb25JbmZlcmVuY2VQcmVmaXguVVMsXG4gICAgfSk7XG5cbiAgICBjb25zdCBzdGF0ZW1lbnQgPSBwb2xpY3kudG9KU09OKCk7XG4gICAgZXhwZWN0KHN0YXRlbWVudC5SZXNvdXJjZSkudG9Db250YWluRXF1YWwoXG4gICAgICBgYXJuOmF3czpiZWRyb2NrOnVzLWVhc3QtMToxMjM0NTY3ODkwMTI6aW5mZXJlbmNlLXByb2ZpbGUvdXMuJHt0ZXN0TW9kZWwubW9kZWxJZH1gLFxuICAgICk7XG4gIH0pO1xuXG4gIHRlc3QoJ2dlbmVyYXRlTW9kZWxJQU1QZXJtaXNzaW9ucyB1c2VzIGRlZmF1bHQgVVMgcHJlZml4JywgKCkgPT4ge1xuICAgIGNvbnN0IHBvbGljeSA9IEJlZHJvY2tNb2RlbFV0aWxzLmdlbmVyYXRlTW9kZWxJQU1QZXJtaXNzaW9ucyhzdGFjayk7XG5cbiAgICBjb25zdCBzdGF0ZW1lbnQgPSBwb2xpY3kudG9KU09OKCk7XG4gICAgZXhwZWN0KHN0YXRlbWVudC5SZXNvdXJjZSkudG9Db250YWluRXF1YWwoXG4gICAgICBleHBlY3Quc3RyaW5nQ29udGFpbmluZygnaW5mZXJlbmNlLXByb2ZpbGUvdXMuJyksXG4gICAgKTtcbiAgfSk7XG59KTtcbiJdfQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,73 @@
|
|
|
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_kms_1 = require("aws-cdk-lib/aws-kms");
|
|
6
|
+
const eventbridge_broker_1 = require("../foundation/eventbridge-broker");
|
|
7
|
+
describe('EventbridgeBroker', () => {
|
|
8
|
+
let stack;
|
|
9
|
+
beforeEach(() => {
|
|
10
|
+
stack = new aws_cdk_lib_1.Stack();
|
|
11
|
+
});
|
|
12
|
+
test('creates EventBus with KMS encryption', () => {
|
|
13
|
+
new eventbridge_broker_1.EventbridgeBroker(stack, 'Broker', {
|
|
14
|
+
eventSource: 'test.source',
|
|
15
|
+
});
|
|
16
|
+
const template = assertions_1.Template.fromStack(stack);
|
|
17
|
+
template.resourceCountIs('AWS::Events::EventBus', 1);
|
|
18
|
+
template.resourceCountIs('AWS::KMS::Key', 1);
|
|
19
|
+
template.hasResourceProperties('AWS::KMS::Key', {
|
|
20
|
+
EnableKeyRotation: true,
|
|
21
|
+
});
|
|
22
|
+
});
|
|
23
|
+
test('uses custom KMS key when provided', () => {
|
|
24
|
+
const customKey = new aws_kms_1.Key(stack, 'CustomKey');
|
|
25
|
+
new eventbridge_broker_1.EventbridgeBroker(stack, 'Broker', {
|
|
26
|
+
eventSource: 'test.source',
|
|
27
|
+
kmsKey: customKey,
|
|
28
|
+
});
|
|
29
|
+
const template = assertions_1.Template.fromStack(stack);
|
|
30
|
+
template.resourceCountIs('AWS::KMS::Key', 1);
|
|
31
|
+
});
|
|
32
|
+
test('sets custom event bus name', () => {
|
|
33
|
+
new eventbridge_broker_1.EventbridgeBroker(stack, 'Broker', {
|
|
34
|
+
eventSource: 'test.source',
|
|
35
|
+
name: 'CustomEventBus',
|
|
36
|
+
});
|
|
37
|
+
const template = assertions_1.Template.fromStack(stack);
|
|
38
|
+
template.hasResourceProperties('AWS::Events::EventBus', {
|
|
39
|
+
Name: 'CustomEventBus',
|
|
40
|
+
});
|
|
41
|
+
});
|
|
42
|
+
test('applies RETAIN removal policy', () => {
|
|
43
|
+
new eventbridge_broker_1.EventbridgeBroker(stack, 'Broker', {
|
|
44
|
+
eventSource: 'test.source',
|
|
45
|
+
removalPolicy: aws_cdk_lib_1.RemovalPolicy.RETAIN,
|
|
46
|
+
});
|
|
47
|
+
const template = assertions_1.Template.fromStack(stack);
|
|
48
|
+
template.hasResource('AWS::KMS::Key', {
|
|
49
|
+
DeletionPolicy: 'Retain',
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
test('applies DESTROY removal policy by default', () => {
|
|
53
|
+
new eventbridge_broker_1.EventbridgeBroker(stack, 'Broker', {
|
|
54
|
+
eventSource: 'test.source',
|
|
55
|
+
});
|
|
56
|
+
const template = assertions_1.Template.fromStack(stack);
|
|
57
|
+
template.hasResource('AWS::KMS::Key', {
|
|
58
|
+
DeletionPolicy: 'Delete',
|
|
59
|
+
});
|
|
60
|
+
});
|
|
61
|
+
test('sendViaSfnChain creates EventBridge PutEvents task', () => {
|
|
62
|
+
const broker = new eventbridge_broker_1.EventbridgeBroker(stack, 'Broker', {
|
|
63
|
+
eventSource: 'test.source',
|
|
64
|
+
});
|
|
65
|
+
const task = broker.sendViaSfnChain('TestEvent', { key: 'value' });
|
|
66
|
+
expect(task).toBeDefined();
|
|
67
|
+
const stateJson = task.toStateJson();
|
|
68
|
+
expect(stateJson.Type).toBe('Task');
|
|
69
|
+
expect(stateJson.Parameters.Entries[0].Source).toBe('test.source');
|
|
70
|
+
expect(stateJson.Parameters.Entries[0].DetailType).toBe('TestEvent');
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZlbnRicmlkZ2UtYnJva2VyLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi91c2UtY2FzZXMvZnJhbWV3b3JrL3Rlc3RzL2V2ZW50YnJpZGdlLWJyb2tlci50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsNkNBQW1EO0FBQ25ELHVEQUFrRDtBQUNsRCxpREFBMEM7QUFDMUMseUVBQXFFO0FBRXJFLFFBQVEsQ0FBQyxtQkFBbUIsRUFBRSxHQUFHLEVBQUU7SUFDakMsSUFBSSxLQUFZLENBQUM7SUFFakIsVUFBVSxDQUFDLEdBQUcsRUFBRTtRQUNkLEtBQUssR0FBRyxJQUFJLG1CQUFLLEVBQUUsQ0FBQztJQUN0QixDQUFDLENBQUMsQ0FBQztJQUVILElBQUksQ0FBQyxzQ0FBc0MsRUFBRSxHQUFHLEVBQUU7UUFDaEQsSUFBSSxzQ0FBaUIsQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFO1lBQ3JDLFdBQVcsRUFBRSxhQUFhO1NBQzNCLENBQUMsQ0FBQztRQUVILE1BQU0sUUFBUSxHQUFHLHFCQUFRLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzNDLFFBQVEsQ0FBQyxlQUFlLENBQUMsdUJBQXVCLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDckQsUUFBUSxDQUFDLGVBQWUsQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFFN0MsUUFBUSxDQUFDLHFCQUFxQixDQUFDLGVBQWUsRUFBRTtZQUM5QyxpQkFBaUIsRUFBRSxJQUFJO1NBQ3hCLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsSUFBSSxDQUFDLG1DQUFtQyxFQUFFLEdBQUcsRUFBRTtRQUM3QyxNQUFNLFNBQVMsR0FBRyxJQUFJLGFBQUcsQ0FBQyxLQUFLLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDOUMsSUFBSSxzQ0FBaUIsQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFO1lBQ3JDLFdBQVcsRUFBRSxhQUFhO1lBQzFCLE1BQU0sRUFBRSxTQUFTO1NBQ2xCLENBQUMsQ0FBQztRQUVILE1BQU0sUUFBUSxHQUFHLHFCQUFRLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzNDLFFBQVEsQ0FBQyxlQUFlLENBQUMsZUFBZSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQy9DLENBQUMsQ0FBQyxDQUFDO0lBRUgsSUFBSSxDQUFDLDRCQUE0QixFQUFFLEdBQUcsRUFBRTtRQUN0QyxJQUFJLHNDQUFpQixDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUU7WUFDckMsV0FBVyxFQUFFLGFBQWE7WUFDMUIsSUFBSSxFQUFFLGdCQUFnQjtTQUN2QixDQUFDLENBQUM7UUFFSCxNQUFNLFFBQVEsR0FBRyxxQkFBUSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMzQyxRQUFRLENBQUMscUJBQXFCLENBQUMsdUJBQXVCLEVBQUU7WUFDdEQsSUFBSSxFQUFFLGdCQUFnQjtTQUN2QixDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILElBQUksQ0FBQywrQkFBK0IsRUFBRSxHQUFHLEVBQUU7UUFDekMsSUFBSSxzQ0FBaUIsQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFO1lBQ3JDLFdBQVcsRUFBRSxhQUFhO1lBQzFCLGFBQWEsRUFBRSwyQkFBYSxDQUFDLE1BQU07U0FDcEMsQ0FBQyxDQUFDO1FBRUgsTUFBTSxRQUFRLEdBQUcscUJBQVEsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDM0MsUUFBUSxDQUFDLFdBQVcsQ0FBQyxlQUFlLEVBQUU7WUFDcEMsY0FBYyxFQUFFLFFBQVE7U0FDekIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxJQUFJLENBQUMsMkNBQTJDLEVBQUUsR0FBRyxFQUFFO1FBQ3JELElBQUksc0NBQWlCLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRTtZQUNyQyxXQUFXLEVBQUUsYUFBYTtTQUMzQixDQUFDLENBQUM7UUFFSCxNQUFNLFFBQVEsR0FBRyxxQkFBUSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMzQyxRQUFRLENBQUMsV0FBVyxDQUFDLGVBQWUsRUFBRTtZQUNwQyxjQUFjLEVBQUUsUUFBUTtTQUN6QixDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILElBQUksQ0FBQyxvREFBb0QsRUFBRSxHQUFHLEVBQUU7UUFDOUQsTUFBTSxNQUFNLEdBQUcsSUFBSSxzQ0FBaUIsQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFO1lBQ3BELFdBQVcsRUFBRSxhQUFhO1NBQzNCLENBQUMsQ0FBQztRQUVILE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxlQUFlLENBQUMsV0FBVyxFQUFFLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFFbkUsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQzNCLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQVMsQ0FBQztRQUM1QyxNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNwQyxNQUFNLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ25FLE1BQU0sQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDdkUsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFJlbW92YWxQb2xpY3ksIFN0YWNrIH0gZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0IHsgVGVtcGxhdGUgfSBmcm9tICdhd3MtY2RrLWxpYi9hc3NlcnRpb25zJztcbmltcG9ydCB7IEtleSB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1rbXMnO1xuaW1wb3J0IHsgRXZlbnRicmlkZ2VCcm9rZXIgfSBmcm9tICcuLi9mb3VuZGF0aW9uL2V2ZW50YnJpZGdlLWJyb2tlcic7XG5cbmRlc2NyaWJlKCdFdmVudGJyaWRnZUJyb2tlcicsICgpID0+IHtcbiAgbGV0IHN0YWNrOiBTdGFjaztcblxuICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICBzdGFjayA9IG5ldyBTdGFjaygpO1xuICB9KTtcblxuICB0ZXN0KCdjcmVhdGVzIEV2ZW50QnVzIHdpdGggS01TIGVuY3J5cHRpb24nLCAoKSA9PiB7XG4gICAgbmV3IEV2ZW50YnJpZGdlQnJva2VyKHN0YWNrLCAnQnJva2VyJywge1xuICAgICAgZXZlbnRTb3VyY2U6ICd0ZXN0LnNvdXJjZScsXG4gICAgfSk7XG5cbiAgICBjb25zdCB0ZW1wbGF0ZSA9IFRlbXBsYXRlLmZyb21TdGFjayhzdGFjayk7XG4gICAgdGVtcGxhdGUucmVzb3VyY2VDb3VudElzKCdBV1M6OkV2ZW50czo6RXZlbnRCdXMnLCAxKTtcbiAgICB0ZW1wbGF0ZS5yZXNvdXJjZUNvdW50SXMoJ0FXUzo6S01TOjpLZXknLCAxKTtcblxuICAgIHRlbXBsYXRlLmhhc1Jlc291cmNlUHJvcGVydGllcygnQVdTOjpLTVM6OktleScsIHtcbiAgICAgIEVuYWJsZUtleVJvdGF0aW9uOiB0cnVlLFxuICAgIH0pO1xuICB9KTtcblxuICB0ZXN0KCd1c2VzIGN1c3RvbSBLTVMga2V5IHdoZW4gcHJvdmlkZWQnLCAoKSA9PiB7XG4gICAgY29uc3QgY3VzdG9tS2V5ID0gbmV3IEtleShzdGFjaywgJ0N1c3RvbUtleScpO1xuICAgIG5ldyBFdmVudGJyaWRnZUJyb2tlcihzdGFjaywgJ0Jyb2tlcicsIHtcbiAgICAgIGV2ZW50U291cmNlOiAndGVzdC5zb3VyY2UnLFxuICAgICAga21zS2V5OiBjdXN0b21LZXksXG4gICAgfSk7XG5cbiAgICBjb25zdCB0ZW1wbGF0ZSA9IFRlbXBsYXRlLmZyb21TdGFjayhzdGFjayk7XG4gICAgdGVtcGxhdGUucmVzb3VyY2VDb3VudElzKCdBV1M6OktNUzo6S2V5JywgMSk7XG4gIH0pO1xuXG4gIHRlc3QoJ3NldHMgY3VzdG9tIGV2ZW50IGJ1cyBuYW1lJywgKCkgPT4ge1xuICAgIG5ldyBFdmVudGJyaWRnZUJyb2tlcihzdGFjaywgJ0Jyb2tlcicsIHtcbiAgICAgIGV2ZW50U291cmNlOiAndGVzdC5zb3VyY2UnLFxuICAgICAgbmFtZTogJ0N1c3RvbUV2ZW50QnVzJyxcbiAgICB9KTtcblxuICAgIGNvbnN0IHRlbXBsYXRlID0gVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKTtcbiAgICB0ZW1wbGF0ZS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6RXZlbnRzOjpFdmVudEJ1cycsIHtcbiAgICAgIE5hbWU6ICdDdXN0b21FdmVudEJ1cycsXG4gICAgfSk7XG4gIH0pO1xuXG4gIHRlc3QoJ2FwcGxpZXMgUkVUQUlOIHJlbW92YWwgcG9saWN5JywgKCkgPT4ge1xuICAgIG5ldyBFdmVudGJyaWRnZUJyb2tlcihzdGFjaywgJ0Jyb2tlcicsIHtcbiAgICAgIGV2ZW50U291cmNlOiAndGVzdC5zb3VyY2UnLFxuICAgICAgcmVtb3ZhbFBvbGljeTogUmVtb3ZhbFBvbGljeS5SRVRBSU4sXG4gICAgfSk7XG5cbiAgICBjb25zdCB0ZW1wbGF0ZSA9IFRlbXBsYXRlLmZyb21TdGFjayhzdGFjayk7XG4gICAgdGVtcGxhdGUuaGFzUmVzb3VyY2UoJ0FXUzo6S01TOjpLZXknLCB7XG4gICAgICBEZWxldGlvblBvbGljeTogJ1JldGFpbicsXG4gICAgfSk7XG4gIH0pO1xuXG4gIHRlc3QoJ2FwcGxpZXMgREVTVFJPWSByZW1vdmFsIHBvbGljeSBieSBkZWZhdWx0JywgKCkgPT4ge1xuICAgIG5ldyBFdmVudGJyaWRnZUJyb2tlcihzdGFjaywgJ0Jyb2tlcicsIHtcbiAgICAgIGV2ZW50U291cmNlOiAndGVzdC5zb3VyY2UnLFxuICAgIH0pO1xuXG4gICAgY29uc3QgdGVtcGxhdGUgPSBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spO1xuICAgIHRlbXBsYXRlLmhhc1Jlc291cmNlKCdBV1M6OktNUzo6S2V5Jywge1xuICAgICAgRGVsZXRpb25Qb2xpY3k6ICdEZWxldGUnLFxuICAgIH0pO1xuICB9KTtcblxuICB0ZXN0KCdzZW5kVmlhU2ZuQ2hhaW4gY3JlYXRlcyBFdmVudEJyaWRnZSBQdXRFdmVudHMgdGFzaycsICgpID0+IHtcbiAgICBjb25zdCBicm9rZXIgPSBuZXcgRXZlbnRicmlkZ2VCcm9rZXIoc3RhY2ssICdCcm9rZXInLCB7XG4gICAgICBldmVudFNvdXJjZTogJ3Rlc3Quc291cmNlJyxcbiAgICB9KTtcblxuICAgIGNvbnN0IHRhc2sgPSBicm9rZXIuc2VuZFZpYVNmbkNoYWluKCdUZXN0RXZlbnQnLCB7IGtleTogJ3ZhbHVlJyB9KTtcblxuICAgIGV4cGVjdCh0YXNrKS50b0JlRGVmaW5lZCgpO1xuICAgIGNvbnN0IHN0YXRlSnNvbiA9IHRhc2sudG9TdGF0ZUpzb24oKSBhcyBhbnk7XG4gICAgZXhwZWN0KHN0YXRlSnNvbi5UeXBlKS50b0JlKCdUYXNrJyk7XG4gICAgZXhwZWN0KHN0YXRlSnNvbi5QYXJhbWV0ZXJzLkVudHJpZXNbMF0uU291cmNlKS50b0JlKCd0ZXN0LnNvdXJjZScpO1xuICAgIGV4cGVjdChzdGF0ZUpzb24uUGFyYW1ldGVycy5FbnRyaWVzWzBdLkRldGFpbFR5cGUpLnRvQmUoJ1Rlc3RFdmVudCcpO1xuICB9KTtcbn0pO1xuIl19
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|