@cdklabs/cdk-appmod-catalog-blueprints 1.3.0 → 1.4.1

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,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 {};