From 46353f3147a60351ba1dae2b2ce80378facf1aac Mon Sep 17 00:00:00 2001 From: Michael Sambol Date: Thu, 12 Oct 2023 20:01:11 -0600 Subject: [PATCH 1/8] feat(lambda): add grantInvokeCompositePrincipal method --- .../lambda-permissions.assets.json | 4 +- .../lambda-permissions.template.json | 27 +++++ .../manifest.json | 15 ++- .../integ.permissions.js.snapshot/tree.json | 43 +++++++ .../test/aws-lambda/test/integ.permissions.ts | 5 + .../lib/experimental/edge-function.ts | 3 + .../aws-cdk-lib/aws-iam/lib/principals.ts | 2 +- packages/aws-cdk-lib/aws-lambda/README.md | 12 ++ .../aws-lambda/lib/function-base.ts | 18 +++ .../aws-lambda/test/function.test.ts | 105 ++++++++++++++++++ 10 files changed, 230 insertions(+), 4 deletions(-) diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-lambda/test/integ.permissions.js.snapshot/lambda-permissions.assets.json b/packages/@aws-cdk-testing/framework-integ/test/aws-lambda/test/integ.permissions.js.snapshot/lambda-permissions.assets.json index a616570d5991e..83a0c064704f4 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-lambda/test/integ.permissions.js.snapshot/lambda-permissions.assets.json +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-lambda/test/integ.permissions.js.snapshot/lambda-permissions.assets.json @@ -1,7 +1,7 @@ { "version": "34.0.0", "files": { - "2adef3146bf9b791f99ead4ebf32a256c30ae16434fd75ba4d1effea0b723345": { + "10f952d6d812f623d3210a933651cda34426040182d1daf8f4188baa5b152ce8": { "source": { "path": "lambda-permissions.template.json", "packaging": "file" @@ -9,7 +9,7 @@ "destinations": { "current_account-current_region": { "bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}", - "objectKey": "2adef3146bf9b791f99ead4ebf32a256c30ae16434fd75ba4d1effea0b723345.json", + "objectKey": "10f952d6d812f623d3210a933651cda34426040182d1daf8f4188baa5b152ce8.json", "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}" } } diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-lambda/test/integ.permissions.js.snapshot/lambda-permissions.template.json b/packages/@aws-cdk-testing/framework-integ/test/aws-lambda/test/integ.permissions.js.snapshot/lambda-permissions.template.json index 4233e07b68006..9a44b7469ef7a 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-lambda/test/integ.permissions.js.snapshot/lambda-permissions.template.json +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-lambda/test/integ.permissions.js.snapshot/lambda-permissions.template.json @@ -77,6 +77,33 @@ "Principal": "*", "PrincipalOrgID": "o-xxxxxxxxxx" } + }, + "MyLambdaInvokemcfVL7pJA0SB0Bm8yGhELN3cZ1c8fYqVoNxjNP4pYCE95D85164": { + "Type": "AWS::Lambda::Permission", + "Properties": { + "Action": "lambda:InvokeFunction", + "FunctionName": { + "Fn::GetAtt": [ + "MyLambdaCCE802FB", + "Arn" + ] + }, + "Principal": "*", + "PrincipalOrgID": "o-zzzzzzzzzz" + } + }, + "MyLambdaInvokeFcyXBRX02EWa52GlFECQiCzDt0fdRUDi4mo4foC5aU41318F58": { + "Type": "AWS::Lambda::Permission", + "Properties": { + "Action": "lambda:InvokeFunction", + "FunctionName": { + "Fn::GetAtt": [ + "MyLambdaCCE802FB", + "Arn" + ] + }, + "Principal": "apigateway.amazonaws.com" + } } }, "Parameters": { diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-lambda/test/integ.permissions.js.snapshot/manifest.json b/packages/@aws-cdk-testing/framework-integ/test/aws-lambda/test/integ.permissions.js.snapshot/manifest.json index e8c1d380d6edd..1299516f8de07 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-lambda/test/integ.permissions.js.snapshot/manifest.json +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-lambda/test/integ.permissions.js.snapshot/manifest.json @@ -14,10 +14,11 @@ "environment": "aws://unknown-account/unknown-region", "properties": { "templateFile": "lambda-permissions.template.json", + "terminationProtection": false, "validateOnSynth": false, "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-deploy-role-${AWS::AccountId}-${AWS::Region}", "cloudFormationExecutionRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-cfn-exec-role-${AWS::AccountId}-${AWS::Region}", - "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/2adef3146bf9b791f99ead4ebf32a256c30ae16434fd75ba4d1effea0b723345.json", + "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/10f952d6d812f623d3210a933651cda34426040182d1daf8f4188baa5b152ce8.json", "requiresBootstrapStackVersion": 6, "bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version", "additionalDependencies": [ @@ -57,6 +58,18 @@ "data": "MyLambdaInvoke138AF9IJcZORjZNKCKShZMMuVQwCnUkbFqMoQf5of0C1F7DFD8" } ], + "/lambda-permissions/MyLambda/InvokemcfVL7pJA0SB0Bm8yGhELN3cZ1c8fYqVoNxjNP4pYCE=": [ + { + "type": "aws:cdk:logicalId", + "data": "MyLambdaInvokemcfVL7pJA0SB0Bm8yGhELN3cZ1c8fYqVoNxjNP4pYCE95D85164" + } + ], + "/lambda-permissions/MyLambda/InvokeFcyXBRX02EWa52GlF+ECQiCzDt0fdRUDi4mo4foC5aU=": [ + { + "type": "aws:cdk:logicalId", + "data": "MyLambdaInvokeFcyXBRX02EWa52GlFECQiCzDt0fdRUDi4mo4foC5aU41318F58" + } + ], "/lambda-permissions/BootstrapVersion": [ { "type": "aws:cdk:logicalId", diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-lambda/test/integ.permissions.js.snapshot/tree.json b/packages/@aws-cdk-testing/framework-integ/test/aws-lambda/test/integ.permissions.js.snapshot/tree.json index 5e471d9888232..1d0b9aaa4919b 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-lambda/test/integ.permissions.js.snapshot/tree.json +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-lambda/test/integ.permissions.js.snapshot/tree.json @@ -136,6 +136,49 @@ "fqn": "aws-cdk-lib.aws_lambda.CfnPermission", "version": "0.0.0" } + }, + "InvokemcfVL7pJA0SB0Bm8yGhELN3cZ1c8fYqVoNxjNP4pYCE=": { + "id": "InvokemcfVL7pJA0SB0Bm8yGhELN3cZ1c8fYqVoNxjNP4pYCE=", + "path": "lambda-permissions/MyLambda/InvokemcfVL7pJA0SB0Bm8yGhELN3cZ1c8fYqVoNxjNP4pYCE=", + "attributes": { + "aws:cdk:cloudformation:type": "AWS::Lambda::Permission", + "aws:cdk:cloudformation:props": { + "action": "lambda:InvokeFunction", + "functionName": { + "Fn::GetAtt": [ + "MyLambdaCCE802FB", + "Arn" + ] + }, + "principal": "*", + "principalOrgId": "o-zzzzzzzzzz" + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_lambda.CfnPermission", + "version": "0.0.0" + } + }, + "InvokeFcyXBRX02EWa52GlF+ECQiCzDt0fdRUDi4mo4foC5aU=": { + "id": "InvokeFcyXBRX02EWa52GlF+ECQiCzDt0fdRUDi4mo4foC5aU=", + "path": "lambda-permissions/MyLambda/InvokeFcyXBRX02EWa52GlF+ECQiCzDt0fdRUDi4mo4foC5aU=", + "attributes": { + "aws:cdk:cloudformation:type": "AWS::Lambda::Permission", + "aws:cdk:cloudformation:props": { + "action": "lambda:InvokeFunction", + "functionName": { + "Fn::GetAtt": [ + "MyLambdaCCE802FB", + "Arn" + ] + }, + "principal": "apigateway.amazonaws.com" + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_lambda.CfnPermission", + "version": "0.0.0" + } } }, "constructInfo": { diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-lambda/test/integ.permissions.ts b/packages/@aws-cdk-testing/framework-integ/test/aws-lambda/test/integ.permissions.ts index d0f1e6d583b19..eb7c712c92126 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-lambda/test/integ.permissions.ts +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-lambda/test/integ.permissions.ts @@ -16,3 +16,8 @@ const fn = new lambda.Function(stack, 'MyLambda', { fn.grantInvoke(new iam.AnyPrincipal().inOrganization('o-yyyyyyyyyy')); fn.grantInvoke(new iam.OrganizationPrincipal('o-xxxxxxxxxx')); + +fn.grantInvokeCompositePrincipal(new iam.CompositePrincipal( + new iam.OrganizationPrincipal('o-zzzzzzzzzz'), + new iam.ServicePrincipal('apigateway.amazonaws.com'), +)); diff --git a/packages/aws-cdk-lib/aws-cloudfront/lib/experimental/edge-function.ts b/packages/aws-cdk-lib/aws-cloudfront/lib/experimental/edge-function.ts index 5565c99feeb91..bb4f3645777ad 100644 --- a/packages/aws-cdk-lib/aws-cloudfront/lib/experimental/edge-function.ts +++ b/packages/aws-cdk-lib/aws-cloudfront/lib/experimental/edge-function.ts @@ -124,6 +124,9 @@ export class EdgeFunction extends Resource implements lambda.IVersion { public grantInvokeUrl(identity: iam.IGrantable): iam.Grant { return this.lambda.grantInvokeUrl(identity); } + public grantInvokeCompositePrincipal(compositePrincipals: iam.CompositePrincipal): iam.Grant[] { + return this.lambda.grantInvokeCompositePrincipal(compositePrincipals); + } public metric(metricName: string, props?: cloudwatch.MetricOptions): cloudwatch.Metric { return this.lambda.metric(metricName, { ...props, region: EdgeFunction.EDGE_REGION }); } diff --git a/packages/aws-cdk-lib/aws-iam/lib/principals.ts b/packages/aws-cdk-lib/aws-iam/lib/principals.ts index 0f53e3af4748d..aa3b34e597a6b 100644 --- a/packages/aws-cdk-lib/aws-iam/lib/principals.ts +++ b/packages/aws-cdk-lib/aws-iam/lib/principals.ts @@ -825,7 +825,7 @@ export class StarPrincipal extends PrincipalBase { */ export class CompositePrincipal extends PrincipalBase { public readonly assumeRoleAction: string; - private readonly principals = new Array(); + public readonly principals = new Array(); constructor(...principals: IPrincipal[]) { super(); diff --git a/packages/aws-cdk-lib/aws-lambda/README.md b/packages/aws-cdk-lib/aws-lambda/README.md index 9ca02df90c743..56532d6353634 100644 --- a/packages/aws-cdk-lib/aws-lambda/README.md +++ b/packages/aws-cdk-lib/aws-lambda/README.md @@ -249,6 +249,18 @@ const servicePrincipalWithConditions = servicePrincipal.withConditions({ fn.grantInvoke(servicePrincipalWithConditions); ``` +### Grant function access to CompositePrincipal + +```ts +declare const fn: lambda.Function; +const compositePrincipal = new iam.CompositePrincipal( + new iam.OrganizationPrincipal('o-zzzzzzzzzz'), + new iam.ServicePrincipal('apigateway.amazonaws.com'), +) + +fn.grantInvokeCompositePrincipal(compositePrincipal); +``` + ## Versions You can use diff --git a/packages/aws-cdk-lib/aws-lambda/lib/function-base.ts b/packages/aws-cdk-lib/aws-lambda/lib/function-base.ts index 3822c2747d8cc..8dcbf2caa66ad 100644 --- a/packages/aws-cdk-lib/aws-lambda/lib/function-base.ts +++ b/packages/aws-cdk-lib/aws-lambda/lib/function-base.ts @@ -102,6 +102,11 @@ export interface IFunction extends IResource, ec2.IConnectable, iam.IGrantable { */ grantInvokeUrl(identity: iam.IGrantable): iam.Grant; + /** + * Grant multiple principals the ability to invoke this Lambda via CompositePrincipal + */ + grantInvokeCompositePrincipal(principals: iam.CompositePrincipal): iam.Grant[]; + /** * Return the given named metric for this Lambda */ @@ -449,6 +454,19 @@ export abstract class FunctionBase extends Resource implements IFunction, ec2.IC return grant; } + /** + * Grant multiple principals the ability to invoke this Lambda via CompositePrincipal + */ + public grantInvokeCompositePrincipal(compositePrincipals: iam.CompositePrincipal): iam.Grant[] { + let grants: iam.Grant[] = []; + + compositePrincipals.principals.forEach( (principal) => { + grants.push(this.grantInvoke(principal)); + }); + + return grants; + } + public addEventSource(source: IEventSource) { source.bind(this); } diff --git a/packages/aws-cdk-lib/aws-lambda/test/function.test.ts b/packages/aws-cdk-lib/aws-lambda/test/function.test.ts index 7db58fbf2875d..5bd6451e2e56e 100644 --- a/packages/aws-cdk-lib/aws-lambda/test/function.test.ts +++ b/packages/aws-cdk-lib/aws-lambda/test/function.test.ts @@ -1525,6 +1525,111 @@ describe('function', () => { }); }); + describe('grantInvokeCompositePrincipal', () => { + test('adds iam:InvokeFunction for a CompositePrincipal (two accounts)', () => { + // GIVEN + const stack = new cdk.Stack(); + const compositePrincipal = new iam.CompositePrincipal( + new iam.AccountPrincipal('1234'), + new iam.AccountPrincipal('5678'), + ); + + const fn = new lambda.Function(stack, 'Function', { + code: lambda.Code.fromInline('xxx'), + handler: 'index.handler', + runtime: lambda.Runtime.NODEJS_LATEST, + }); + + // WHEN + fn.grantInvokeCompositePrincipal(compositePrincipal); + + // THEN + Template.fromStack(stack).hasResourceProperties('AWS::Lambda::Permission', { + Action: 'lambda:InvokeFunction', + FunctionName: { + 'Fn::GetAtt': [ + 'Function76856677', + 'Arn', + ], + }, + Principal: '1234', + }); + Template.fromStack(stack).hasResourceProperties('AWS::Lambda::Permission', { + Action: 'lambda:InvokeFunction', + FunctionName: { + 'Fn::GetAtt': [ + 'Function76856677', + 'Arn', + ], + }, + Principal: '5678', + }); + }); + + test('adds iam:InvokeFunction for a CompositePrincipal (multiple types)', () => { + // GIVEN + const stack = new cdk.Stack(); + const compositePrincipal = new iam.CompositePrincipal( + new iam.AccountPrincipal('1234'), + new iam.ServicePrincipal('apigateway.amazonaws.com'), + new iam.ArnPrincipal('arn:aws:iam::123456789012:role/someRole'), + new iam.OrganizationPrincipal('my-org-id'), + ); + + const fn = new lambda.Function(stack, 'Function', { + code: lambda.Code.fromInline('xxx'), + handler: 'index.handler', + runtime: lambda.Runtime.NODEJS_LATEST, + }); + + // WHEN + fn.grantInvokeCompositePrincipal(compositePrincipal); + + // THEN + Template.fromStack(stack).hasResourceProperties('AWS::Lambda::Permission', { + Action: 'lambda:InvokeFunction', + FunctionName: { + 'Fn::GetAtt': [ + 'Function76856677', + 'Arn', + ], + }, + Principal: '1234', + }); + Template.fromStack(stack).hasResourceProperties('AWS::Lambda::Permission', { + Action: 'lambda:InvokeFunction', + FunctionName: { + 'Fn::GetAtt': [ + 'Function76856677', + 'Arn', + ], + }, + Principal: 'apigateway.amazonaws.com', + }); + Template.fromStack(stack).hasResourceProperties('AWS::Lambda::Permission', { + Action: 'lambda:InvokeFunction', + FunctionName: { + 'Fn::GetAtt': [ + 'Function76856677', + 'Arn', + ], + }, + Principal: 'arn:aws:iam::123456789012:role/someRole', + }); + Template.fromStack(stack).hasResourceProperties('AWS::Lambda::Permission', { + Action: 'lambda:InvokeFunction', + FunctionName: { + 'Fn::GetAtt': [ + 'Function76856677', + 'Arn', + ], + }, + Principal: '*', + PrincipalOrgID: 'my-org-id', + }); + }); + }); + test('Can use metricErrors on a lambda Function', () => { // GIVEN const stack = new cdk.Stack(); From 13e01b1b15615220bd2d2726b56aea0b708879b6 Mon Sep 17 00:00:00 2001 From: Michael Sambol Date: Thu, 12 Oct 2023 20:44:08 -0600 Subject: [PATCH 2/8] add getter for principals --- packages/aws-cdk-lib/aws-iam/lib/principals.ts | 6 +++++- packages/aws-cdk-lib/aws-lambda/lib/function-base.ts | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/aws-cdk-lib/aws-iam/lib/principals.ts b/packages/aws-cdk-lib/aws-iam/lib/principals.ts index aa3b34e597a6b..c3750a9d82125 100644 --- a/packages/aws-cdk-lib/aws-iam/lib/principals.ts +++ b/packages/aws-cdk-lib/aws-iam/lib/principals.ts @@ -825,7 +825,7 @@ export class StarPrincipal extends PrincipalBase { */ export class CompositePrincipal extends PrincipalBase { public readonly assumeRoleAction: string; - public readonly principals = new Array(); + private readonly principals = new Array(); constructor(...principals: IPrincipal[]) { super(); @@ -883,6 +883,10 @@ export class CompositePrincipal extends PrincipalBase { if (inner.some(x => x === undefined)) { return undefined; } return `CompositePrincipal[${inner.join(',')}]`; } + + public getPrincipals() { + return this.principals; + } } /** diff --git a/packages/aws-cdk-lib/aws-lambda/lib/function-base.ts b/packages/aws-cdk-lib/aws-lambda/lib/function-base.ts index 8dcbf2caa66ad..a5015b775e2f6 100644 --- a/packages/aws-cdk-lib/aws-lambda/lib/function-base.ts +++ b/packages/aws-cdk-lib/aws-lambda/lib/function-base.ts @@ -460,7 +460,7 @@ export abstract class FunctionBase extends Resource implements IFunction, ec2.IC public grantInvokeCompositePrincipal(compositePrincipals: iam.CompositePrincipal): iam.Grant[] { let grants: iam.Grant[] = []; - compositePrincipals.principals.forEach( (principal) => { + compositePrincipals.getPrincipals().forEach((principal) => { grants.push(this.grantInvoke(principal)); }); From e82f7d1e0361d016550ef793c3f1dbf3eafa164d Mon Sep 17 00:00:00 2001 From: Michael Sambol Date: Thu, 12 Oct 2023 20:53:25 -0600 Subject: [PATCH 3/8] add type for getPrincipals --- packages/aws-cdk-lib/aws-iam/lib/principals.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/aws-cdk-lib/aws-iam/lib/principals.ts b/packages/aws-cdk-lib/aws-iam/lib/principals.ts index c3750a9d82125..9280390ebfc7b 100644 --- a/packages/aws-cdk-lib/aws-iam/lib/principals.ts +++ b/packages/aws-cdk-lib/aws-iam/lib/principals.ts @@ -884,7 +884,7 @@ export class CompositePrincipal extends PrincipalBase { return `CompositePrincipal[${inner.join(',')}]`; } - public getPrincipals() { + public getPrincipals(): IPrincipal[] { return this.principals; } } From d8164464ba0c9bbadf708a07e9c99eb9fd993719 Mon Sep 17 00:00:00 2001 From: Michael Sambol Date: Thu, 12 Oct 2023 20:55:34 -0600 Subject: [PATCH 4/8] change name of getter --- packages/aws-cdk-lib/aws-iam/lib/principals.ts | 18 +++++++++--------- .../aws-lambda/lib/function-base.ts | 2 +- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/packages/aws-cdk-lib/aws-iam/lib/principals.ts b/packages/aws-cdk-lib/aws-iam/lib/principals.ts index 9280390ebfc7b..bd0e58c7a7ad1 100644 --- a/packages/aws-cdk-lib/aws-iam/lib/principals.ts +++ b/packages/aws-cdk-lib/aws-iam/lib/principals.ts @@ -825,7 +825,7 @@ export class StarPrincipal extends PrincipalBase { */ export class CompositePrincipal extends PrincipalBase { public readonly assumeRoleAction: string; - private readonly principals = new Array(); + private readonly _principals = new Array(); constructor(...principals: IPrincipal[]) { super(); @@ -843,12 +843,12 @@ export class CompositePrincipal extends PrincipalBase { * @param principals IAM principals that will be added to the composite principal */ public addPrincipals(...principals: IPrincipal[]): this { - this.principals.push(...principals); + this._principals.push(...principals); return this; } public addToAssumeRolePolicy(doc: PolicyDocument) { - for (const p of this.principals) { + for (const p of this._principals) { defaultAddPrincipalToAssumeRole(p, doc); } } @@ -856,7 +856,7 @@ export class CompositePrincipal extends PrincipalBase { public get policyFragment(): PrincipalPolicyFragment { // We only have a problem with conditions if we are trying to render composite // princpals into a single statement (which is when `policyFragment` would get called) - for (const p of this.principals) { + for (const p of this._principals) { const fragment = p.policyFragment; if (fragment.conditions && Object.keys(fragment.conditions).length > 0) { throw new Error( @@ -867,7 +867,7 @@ export class CompositePrincipal extends PrincipalBase { const principalJson: { [key: string]: string[] } = {}; - for (const p of this.principals) { + for (const p of this._principals) { mergePrincipal(principalJson, p.policyFragment.principalJson); } @@ -875,17 +875,17 @@ export class CompositePrincipal extends PrincipalBase { } public toString() { - return `CompositePrincipal(${this.principals})`; + return `CompositePrincipal(${this._principals})`; } public dedupeString(): string | undefined { - const inner = this.principals.map(ComparablePrincipal.dedupeStringFor); + const inner = this._principals.map(ComparablePrincipal.dedupeStringFor); if (inner.some(x => x === undefined)) { return undefined; } return `CompositePrincipal[${inner.join(',')}]`; } - public getPrincipals(): IPrincipal[] { - return this.principals; + public get principals(): IPrincipal[] { + return this._principals; } } diff --git a/packages/aws-cdk-lib/aws-lambda/lib/function-base.ts b/packages/aws-cdk-lib/aws-lambda/lib/function-base.ts index a5015b775e2f6..94ff69d1c498d 100644 --- a/packages/aws-cdk-lib/aws-lambda/lib/function-base.ts +++ b/packages/aws-cdk-lib/aws-lambda/lib/function-base.ts @@ -460,7 +460,7 @@ export abstract class FunctionBase extends Resource implements IFunction, ec2.IC public grantInvokeCompositePrincipal(compositePrincipals: iam.CompositePrincipal): iam.Grant[] { let grants: iam.Grant[] = []; - compositePrincipals.getPrincipals().forEach((principal) => { + compositePrincipals.principals.forEach((principal) => { grants.push(this.grantInvoke(principal)); }); From bb246c46860d7f375f76bbe951031de88e313f22 Mon Sep 17 00:00:00 2001 From: Michael Sambol Date: Thu, 12 Oct 2023 21:15:08 -0600 Subject: [PATCH 5/8] add docstring --- packages/aws-cdk-lib/aws-iam/lib/principals.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/aws-cdk-lib/aws-iam/lib/principals.ts b/packages/aws-cdk-lib/aws-iam/lib/principals.ts index bd0e58c7a7ad1..0b944afa1a4af 100644 --- a/packages/aws-cdk-lib/aws-iam/lib/principals.ts +++ b/packages/aws-cdk-lib/aws-iam/lib/principals.ts @@ -884,6 +884,9 @@ export class CompositePrincipal extends PrincipalBase { return `CompositePrincipal[${inner.join(',')}]`; } + /** + * Returns the principals that make up the CompositePrincipal + */ public get principals(): IPrincipal[] { return this._principals; } From 97fe760a5e5bff85eaf31b0bbd5527711848b937 Mon Sep 17 00:00:00 2001 From: Michael Sambol Date: Fri, 13 Oct 2023 07:09:34 -0600 Subject: [PATCH 6/8] add feedback from Luca --- .../lambda-permissions.assets.json | 4 +- .../lambda-permissions.template.json | 55 ++++++++ .../manifest.json | 20 ++- .../integ.permissions.js.snapshot/tree.json | 117 ++++++++++++++++++ .../test/aws-lambda/test/integ.permissions.ts | 6 + packages/aws-cdk-lib/aws-lambda/README.md | 6 +- .../aws-lambda/lib/function-base.ts | 8 +- 7 files changed, 204 insertions(+), 12 deletions(-) diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-lambda/test/integ.permissions.js.snapshot/lambda-permissions.assets.json b/packages/@aws-cdk-testing/framework-integ/test/aws-lambda/test/integ.permissions.js.snapshot/lambda-permissions.assets.json index 83a0c064704f4..3a99e3cc9217f 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-lambda/test/integ.permissions.js.snapshot/lambda-permissions.assets.json +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-lambda/test/integ.permissions.js.snapshot/lambda-permissions.assets.json @@ -1,7 +1,7 @@ { "version": "34.0.0", "files": { - "10f952d6d812f623d3210a933651cda34426040182d1daf8f4188baa5b152ce8": { + "aa805917ebda25909f4cf14741f340e1c2e882f51af4b9d47120f9d5fa5e8ad8": { "source": { "path": "lambda-permissions.template.json", "packaging": "file" @@ -9,7 +9,7 @@ "destinations": { "current_account-current_region": { "bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}", - "objectKey": "10f952d6d812f623d3210a933651cda34426040182d1daf8f4188baa5b152ce8.json", + "objectKey": "aa805917ebda25909f4cf14741f340e1c2e882f51af4b9d47120f9d5fa5e8ad8.json", "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}" } } diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-lambda/test/integ.permissions.js.snapshot/lambda-permissions.template.json b/packages/@aws-cdk-testing/framework-integ/test/aws-lambda/test/integ.permissions.js.snapshot/lambda-permissions.template.json index 9a44b7469ef7a..b26e733ea4802 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-lambda/test/integ.permissions.js.snapshot/lambda-permissions.template.json +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-lambda/test/integ.permissions.js.snapshot/lambda-permissions.template.json @@ -78,6 +78,18 @@ "PrincipalOrgID": "o-xxxxxxxxxx" } }, + "MyLambdaFunctionUrlC2055677": { + "Type": "AWS::Lambda::Url", + "Properties": { + "AuthType": "AWS_IAM", + "TargetFunctionArn": { + "Fn::GetAtt": [ + "MyLambdaCCE802FB", + "Arn" + ] + } + } + }, "MyLambdaInvokemcfVL7pJA0SB0Bm8yGhELN3cZ1c8fYqVoNxjNP4pYCE95D85164": { "Type": "AWS::Lambda::Permission", "Properties": { @@ -104,6 +116,49 @@ }, "Principal": "apigateway.amazonaws.com" } + }, + "MyRoleF48FFE04": { + "Type": "AWS::IAM::Role", + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": { + "Service": "lambda.amazonaws.com" + } + } + ], + "Version": "2012-10-17" + } + } + }, + "MyRoleDefaultPolicyA36BE1DD": { + "Type": "AWS::IAM::Policy", + "Properties": { + "PolicyDocument": { + "Statement": [ + { + "Action": "lambda:InvokeFunctionUrl", + "Effect": "Allow", + "Resource": { + "Fn::GetAtt": [ + "MyLambdaCCE802FB", + "Arn" + ] + } + } + ], + "Version": "2012-10-17" + }, + "PolicyName": "MyRoleDefaultPolicyA36BE1DD", + "Roles": [ + { + "Ref": "MyRoleF48FFE04" + } + ] + } } }, "Parameters": { diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-lambda/test/integ.permissions.js.snapshot/manifest.json b/packages/@aws-cdk-testing/framework-integ/test/aws-lambda/test/integ.permissions.js.snapshot/manifest.json index 1299516f8de07..0c877b6a34374 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-lambda/test/integ.permissions.js.snapshot/manifest.json +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-lambda/test/integ.permissions.js.snapshot/manifest.json @@ -18,7 +18,7 @@ "validateOnSynth": false, "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-deploy-role-${AWS::AccountId}-${AWS::Region}", "cloudFormationExecutionRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-cfn-exec-role-${AWS::AccountId}-${AWS::Region}", - "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/10f952d6d812f623d3210a933651cda34426040182d1daf8f4188baa5b152ce8.json", + "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/aa805917ebda25909f4cf14741f340e1c2e882f51af4b9d47120f9d5fa5e8ad8.json", "requiresBootstrapStackVersion": 6, "bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version", "additionalDependencies": [ @@ -58,6 +58,12 @@ "data": "MyLambdaInvoke138AF9IJcZORjZNKCKShZMMuVQwCnUkbFqMoQf5of0C1F7DFD8" } ], + "/lambda-permissions/MyLambda/FunctionUrl/Resource": [ + { + "type": "aws:cdk:logicalId", + "data": "MyLambdaFunctionUrlC2055677" + } + ], "/lambda-permissions/MyLambda/InvokemcfVL7pJA0SB0Bm8yGhELN3cZ1c8fYqVoNxjNP4pYCE=": [ { "type": "aws:cdk:logicalId", @@ -70,6 +76,18 @@ "data": "MyLambdaInvokeFcyXBRX02EWa52GlFECQiCzDt0fdRUDi4mo4foC5aU41318F58" } ], + "/lambda-permissions/MyRole/Resource": [ + { + "type": "aws:cdk:logicalId", + "data": "MyRoleF48FFE04" + } + ], + "/lambda-permissions/MyRole/DefaultPolicy/Resource": [ + { + "type": "aws:cdk:logicalId", + "data": "MyRoleDefaultPolicyA36BE1DD" + } + ], "/lambda-permissions/BootstrapVersion": [ { "type": "aws:cdk:logicalId", diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-lambda/test/integ.permissions.js.snapshot/tree.json b/packages/@aws-cdk-testing/framework-integ/test/aws-lambda/test/integ.permissions.js.snapshot/tree.json index 1d0b9aaa4919b..9dc5cbf75876c 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-lambda/test/integ.permissions.js.snapshot/tree.json +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-lambda/test/integ.permissions.js.snapshot/tree.json @@ -137,6 +137,36 @@ "version": "0.0.0" } }, + "FunctionUrl": { + "id": "FunctionUrl", + "path": "lambda-permissions/MyLambda/FunctionUrl", + "children": { + "Resource": { + "id": "Resource", + "path": "lambda-permissions/MyLambda/FunctionUrl/Resource", + "attributes": { + "aws:cdk:cloudformation:type": "AWS::Lambda::Url", + "aws:cdk:cloudformation:props": { + "authType": "AWS_IAM", + "targetFunctionArn": { + "Fn::GetAtt": [ + "MyLambdaCCE802FB", + "Arn" + ] + } + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_lambda.CfnUrl", + "version": "0.0.0" + } + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_lambda.FunctionUrl", + "version": "0.0.0" + } + }, "InvokemcfVL7pJA0SB0Bm8yGhELN3cZ1c8fYqVoNxjNP4pYCE=": { "id": "InvokemcfVL7pJA0SB0Bm8yGhELN3cZ1c8fYqVoNxjNP4pYCE=", "path": "lambda-permissions/MyLambda/InvokemcfVL7pJA0SB0Bm8yGhELN3cZ1c8fYqVoNxjNP4pYCE=", @@ -186,6 +216,93 @@ "version": "0.0.0" } }, + "MyRole": { + "id": "MyRole", + "path": "lambda-permissions/MyRole", + "children": { + "ImportMyRole": { + "id": "ImportMyRole", + "path": "lambda-permissions/MyRole/ImportMyRole", + "constructInfo": { + "fqn": "aws-cdk-lib.Resource", + "version": "0.0.0" + } + }, + "Resource": { + "id": "Resource", + "path": "lambda-permissions/MyRole/Resource", + "attributes": { + "aws:cdk:cloudformation:type": "AWS::IAM::Role", + "aws:cdk:cloudformation:props": { + "assumeRolePolicyDocument": { + "Statement": [ + { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": { + "Service": "lambda.amazonaws.com" + } + } + ], + "Version": "2012-10-17" + } + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_iam.CfnRole", + "version": "0.0.0" + } + }, + "DefaultPolicy": { + "id": "DefaultPolicy", + "path": "lambda-permissions/MyRole/DefaultPolicy", + "children": { + "Resource": { + "id": "Resource", + "path": "lambda-permissions/MyRole/DefaultPolicy/Resource", + "attributes": { + "aws:cdk:cloudformation:type": "AWS::IAM::Policy", + "aws:cdk:cloudformation:props": { + "policyDocument": { + "Statement": [ + { + "Action": "lambda:InvokeFunctionUrl", + "Effect": "Allow", + "Resource": { + "Fn::GetAtt": [ + "MyLambdaCCE802FB", + "Arn" + ] + } + } + ], + "Version": "2012-10-17" + }, + "policyName": "MyRoleDefaultPolicyA36BE1DD", + "roles": [ + { + "Ref": "MyRoleF48FFE04" + } + ] + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_iam.CfnPolicy", + "version": "0.0.0" + } + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_iam.Policy", + "version": "0.0.0" + } + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_iam.Role", + "version": "0.0.0" + } + }, "BootstrapVersion": { "id": "BootstrapVersion", "path": "lambda-permissions/BootstrapVersion", diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-lambda/test/integ.permissions.ts b/packages/@aws-cdk-testing/framework-integ/test/aws-lambda/test/integ.permissions.ts index eb7c712c92126..40c55e6548378 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-lambda/test/integ.permissions.ts +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-lambda/test/integ.permissions.ts @@ -17,6 +17,12 @@ fn.grantInvoke(new iam.AnyPrincipal().inOrganization('o-yyyyyyyyyy')); fn.grantInvoke(new iam.OrganizationPrincipal('o-xxxxxxxxxx')); +const fnUrl = fn.addFunctionUrl(); +const role = new iam.Role(stack, 'MyRole', { + assumedBy: new iam.ServicePrincipal('lambda.amazonaws.com'), +}); +fnUrl.grantInvokeUrl(role); + fn.grantInvokeCompositePrincipal(new iam.CompositePrincipal( new iam.OrganizationPrincipal('o-zzzzzzzzzz'), new iam.ServicePrincipal('apigateway.amazonaws.com'), diff --git a/packages/aws-cdk-lib/aws-lambda/README.md b/packages/aws-cdk-lib/aws-lambda/README.md index 56532d6353634..1f18942c2128e 100644 --- a/packages/aws-cdk-lib/aws-lambda/README.md +++ b/packages/aws-cdk-lib/aws-lambda/README.md @@ -249,14 +249,16 @@ const servicePrincipalWithConditions = servicePrincipal.withConditions({ fn.grantInvoke(servicePrincipalWithConditions); ``` -### Grant function access to CompositePrincipal +### Grant function access to a CompositePrincipal + +To grant invoke permissions to a `CompositePrincipal` use the `grantInvokeCompositePrincipal` method: ```ts declare const fn: lambda.Function; const compositePrincipal = new iam.CompositePrincipal( new iam.OrganizationPrincipal('o-zzzzzzzzzz'), new iam.ServicePrincipal('apigateway.amazonaws.com'), -) +); fn.grantInvokeCompositePrincipal(compositePrincipal); ``` diff --git a/packages/aws-cdk-lib/aws-lambda/lib/function-base.ts b/packages/aws-cdk-lib/aws-lambda/lib/function-base.ts index 94ff69d1c498d..89a5e8da42b3a 100644 --- a/packages/aws-cdk-lib/aws-lambda/lib/function-base.ts +++ b/packages/aws-cdk-lib/aws-lambda/lib/function-base.ts @@ -458,13 +458,7 @@ export abstract class FunctionBase extends Resource implements IFunction, ec2.IC * Grant multiple principals the ability to invoke this Lambda via CompositePrincipal */ public grantInvokeCompositePrincipal(compositePrincipals: iam.CompositePrincipal): iam.Grant[] { - let grants: iam.Grant[] = []; - - compositePrincipals.principals.forEach((principal) => { - grants.push(this.grantInvoke(principal)); - }); - - return grants; + return compositePrincipals.principals.map((principal) => this.grantInvoke(principal)); } public addEventSource(source: IEventSource) { From 914daa521d02ac569178caef139fc3151d8cb65b Mon Sep 17 00:00:00 2001 From: Michael Sambol Date: Wed, 18 Oct 2023 19:27:48 -0600 Subject: [PATCH 7/8] add feedback from Vinayak --- .../lambda-permissions.assets.json | 4 +- .../lambda-permissions.template.json | 4 +- .../manifest.json | 15 +- .../integ.permissions.js.snapshot/tree.json | 88 +- .../test/aws-lambda/test/integ.permissions.ts | 2 +- packages/@aws-cdk/aws-synthetics-alpha/.jsii | 5669 +++++++++++++++++ .../aws-synthetics-alpha/.warnings.jsii.js | 217 + .../aws-synthetics-alpha/lib/canary.d.ts | 308 + .../aws-synthetics-alpha/lib/canary.js | 439 ++ .../aws-synthetics-alpha/lib/code.d.ts | 107 + .../@aws-cdk/aws-synthetics-alpha/lib/code.js | 253 + .../aws-synthetics-alpha/lib/index.d.ts | 4 + .../aws-synthetics-alpha/lib/index.js | 22 + .../aws-synthetics-alpha/lib/runtime.d.ts | 280 + .../aws-synthetics-alpha/lib/runtime.js | 302 + .../aws-synthetics-alpha/lib/schedule.d.ts | 73 + .../aws-synthetics-alpha/lib/schedule.js | 113 + .../test/canary.test.d.ts | 1 + .../aws-synthetics-alpha/test/canary.test.js | 701 ++ .../aws-synthetics-alpha/test/code.test.d.ts | 1 + .../aws-synthetics-alpha/test/code.test.js | 220 + .../test/integ.canary-auto-delete-lambda.d.ts | 1 + .../test/integ.canary-auto-delete-lambda.js | 57 + .../test/integ.canary.d.ts | 1 + .../aws-synthetics-alpha/test/integ.canary.js | 112 + .../aws-synthetics-alpha/test/integ.vpc.d.ts | 1 + .../aws-synthetics-alpha/test/integ.vpc.js | 27 + .../test/metric.test.d.ts | 1 + .../aws-synthetics-alpha/test/metric.test.js | 59 + .../test/schedule.test.d.ts | 1 + .../test/schedule.test.js | 25 + .../aws-synthetics-alpha/tsconfig.json | 53 + .../lib/experimental/edge-function.ts | 4 +- .../aws-lambda/lib/function-base.ts | 6 +- 34 files changed, 9114 insertions(+), 57 deletions(-) create mode 100644 packages/@aws-cdk/aws-synthetics-alpha/.jsii create mode 100644 packages/@aws-cdk/aws-synthetics-alpha/.warnings.jsii.js create mode 100644 packages/@aws-cdk/aws-synthetics-alpha/lib/canary.d.ts create mode 100644 packages/@aws-cdk/aws-synthetics-alpha/lib/canary.js create mode 100644 packages/@aws-cdk/aws-synthetics-alpha/lib/code.d.ts create mode 100644 packages/@aws-cdk/aws-synthetics-alpha/lib/code.js create mode 100644 packages/@aws-cdk/aws-synthetics-alpha/lib/index.d.ts create mode 100644 packages/@aws-cdk/aws-synthetics-alpha/lib/index.js create mode 100644 packages/@aws-cdk/aws-synthetics-alpha/lib/runtime.d.ts create mode 100644 packages/@aws-cdk/aws-synthetics-alpha/lib/runtime.js create mode 100644 packages/@aws-cdk/aws-synthetics-alpha/lib/schedule.d.ts create mode 100644 packages/@aws-cdk/aws-synthetics-alpha/lib/schedule.js create mode 100644 packages/@aws-cdk/aws-synthetics-alpha/test/canary.test.d.ts create mode 100644 packages/@aws-cdk/aws-synthetics-alpha/test/canary.test.js create mode 100644 packages/@aws-cdk/aws-synthetics-alpha/test/code.test.d.ts create mode 100644 packages/@aws-cdk/aws-synthetics-alpha/test/code.test.js create mode 100644 packages/@aws-cdk/aws-synthetics-alpha/test/integ.canary-auto-delete-lambda.d.ts create mode 100644 packages/@aws-cdk/aws-synthetics-alpha/test/integ.canary-auto-delete-lambda.js create mode 100644 packages/@aws-cdk/aws-synthetics-alpha/test/integ.canary.d.ts create mode 100644 packages/@aws-cdk/aws-synthetics-alpha/test/integ.canary.js create mode 100644 packages/@aws-cdk/aws-synthetics-alpha/test/integ.vpc.d.ts create mode 100644 packages/@aws-cdk/aws-synthetics-alpha/test/integ.vpc.js create mode 100644 packages/@aws-cdk/aws-synthetics-alpha/test/metric.test.d.ts create mode 100644 packages/@aws-cdk/aws-synthetics-alpha/test/metric.test.js create mode 100644 packages/@aws-cdk/aws-synthetics-alpha/test/schedule.test.d.ts create mode 100644 packages/@aws-cdk/aws-synthetics-alpha/test/schedule.test.js create mode 100644 packages/@aws-cdk/aws-synthetics-alpha/tsconfig.json diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-lambda/test/integ.permissions.js.snapshot/lambda-permissions.assets.json b/packages/@aws-cdk-testing/framework-integ/test/aws-lambda/test/integ.permissions.js.snapshot/lambda-permissions.assets.json index 3a99e3cc9217f..0fd8578c0072d 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-lambda/test/integ.permissions.js.snapshot/lambda-permissions.assets.json +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-lambda/test/integ.permissions.js.snapshot/lambda-permissions.assets.json @@ -1,7 +1,7 @@ { "version": "34.0.0", "files": { - "aa805917ebda25909f4cf14741f340e1c2e882f51af4b9d47120f9d5fa5e8ad8": { + "4a7337dac9cfd962c6206c10044011cbcfe4c604459c5eada3df438eb578f341": { "source": { "path": "lambda-permissions.template.json", "packaging": "file" @@ -9,7 +9,7 @@ "destinations": { "current_account-current_region": { "bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}", - "objectKey": "aa805917ebda25909f4cf14741f340e1c2e882f51af4b9d47120f9d5fa5e8ad8.json", + "objectKey": "4a7337dac9cfd962c6206c10044011cbcfe4c604459c5eada3df438eb578f341.json", "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}" } } diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-lambda/test/integ.permissions.js.snapshot/lambda-permissions.template.json b/packages/@aws-cdk-testing/framework-integ/test/aws-lambda/test/integ.permissions.js.snapshot/lambda-permissions.template.json index b26e733ea4802..7ac3e75fde374 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-lambda/test/integ.permissions.js.snapshot/lambda-permissions.template.json +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-lambda/test/integ.permissions.js.snapshot/lambda-permissions.template.json @@ -90,7 +90,7 @@ } } }, - "MyLambdaInvokemcfVL7pJA0SB0Bm8yGhELN3cZ1c8fYqVoNxjNP4pYCE95D85164": { + "MyLambdaInvokeSz2P2C4jOiX4AmIs1ANCq2qfq8PhgVeKtRAVyAkFmM7C8BE4B5": { "Type": "AWS::Lambda::Permission", "Properties": { "Action": "lambda:InvokeFunction", @@ -101,7 +101,7 @@ ] }, "Principal": "*", - "PrincipalOrgID": "o-zzzzzzzzzz" + "PrincipalOrgID": "o-mmmmmmmmmm" } }, "MyLambdaInvokeFcyXBRX02EWa52GlFECQiCzDt0fdRUDi4mo4foC5aU41318F58": { diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-lambda/test/integ.permissions.js.snapshot/manifest.json b/packages/@aws-cdk-testing/framework-integ/test/aws-lambda/test/integ.permissions.js.snapshot/manifest.json index 0c877b6a34374..da8aab0b10e64 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-lambda/test/integ.permissions.js.snapshot/manifest.json +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-lambda/test/integ.permissions.js.snapshot/manifest.json @@ -18,7 +18,7 @@ "validateOnSynth": false, "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-deploy-role-${AWS::AccountId}-${AWS::Region}", "cloudFormationExecutionRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-cfn-exec-role-${AWS::AccountId}-${AWS::Region}", - "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/aa805917ebda25909f4cf14741f340e1c2e882f51af4b9d47120f9d5fa5e8ad8.json", + "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/4a7337dac9cfd962c6206c10044011cbcfe4c604459c5eada3df438eb578f341.json", "requiresBootstrapStackVersion": 6, "bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version", "additionalDependencies": [ @@ -64,10 +64,10 @@ "data": "MyLambdaFunctionUrlC2055677" } ], - "/lambda-permissions/MyLambda/InvokemcfVL7pJA0SB0Bm8yGhELN3cZ1c8fYqVoNxjNP4pYCE=": [ + "/lambda-permissions/MyLambda/InvokeSz2P2C4jO--iX4AmIs1ANCq2qfq8PhgVeKtRAVyAkFmM=": [ { "type": "aws:cdk:logicalId", - "data": "MyLambdaInvokemcfVL7pJA0SB0Bm8yGhELN3cZ1c8fYqVoNxjNP4pYCE95D85164" + "data": "MyLambdaInvokeSz2P2C4jOiX4AmIs1ANCq2qfq8PhgVeKtRAVyAkFmM7C8BE4B5" } ], "/lambda-permissions/MyLambda/InvokeFcyXBRX02EWa52GlF+ECQiCzDt0fdRUDi4mo4foC5aU=": [ @@ -99,6 +99,15 @@ "type": "aws:cdk:logicalId", "data": "CheckBootstrapVersion" } + ], + "MyLambdaInvokemcfVL7pJA0SB0Bm8yGhELN3cZ1c8fYqVoNxjNP4pYCE95D85164": [ + { + "type": "aws:cdk:logicalId", + "data": "MyLambdaInvokemcfVL7pJA0SB0Bm8yGhELN3cZ1c8fYqVoNxjNP4pYCE95D85164", + "trace": [ + "!!DESTRUCTIVE_CHANGES: WILL_DESTROY" + ] + } ] }, "displayName": "lambda-permissions" diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-lambda/test/integ.permissions.js.snapshot/tree.json b/packages/@aws-cdk-testing/framework-integ/test/aws-lambda/test/integ.permissions.js.snapshot/tree.json index 9dc5cbf75876c..2fdf6450ac79c 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-lambda/test/integ.permissions.js.snapshot/tree.json +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-lambda/test/integ.permissions.js.snapshot/tree.json @@ -20,8 +20,8 @@ "id": "ImportServiceRole", "path": "lambda-permissions/MyLambda/ServiceRole/ImportServiceRole", "constructInfo": { - "fqn": "aws-cdk-lib.Resource", - "version": "0.0.0" + "fqn": "constructs.Construct", + "version": "10.2.70" } }, "Resource": { @@ -59,14 +59,14 @@ } }, "constructInfo": { - "fqn": "aws-cdk-lib.aws_iam.CfnRole", - "version": "0.0.0" + "fqn": "constructs.Construct", + "version": "10.2.70" } } }, "constructInfo": { - "fqn": "aws-cdk-lib.aws_iam.Role", - "version": "0.0.0" + "fqn": "constructs.Construct", + "version": "10.2.70" } }, "Resource": { @@ -89,8 +89,8 @@ } }, "constructInfo": { - "fqn": "aws-cdk-lib.aws_lambda.CfnFunction", - "version": "0.0.0" + "fqn": "constructs.Construct", + "version": "10.2.70" } }, "Invokehl--ab6+Vr41INt1IUX--IhhCesB4gzNedP5IURKNgciw=": { @@ -111,8 +111,8 @@ } }, "constructInfo": { - "fqn": "aws-cdk-lib.aws_lambda.CfnPermission", - "version": "0.0.0" + "fqn": "constructs.Construct", + "version": "10.2.70" } }, "Invoke138AF9IJcZORjZ--NKCKShZMMuVQwCnUkbFqMoQf5of0=": { @@ -133,8 +133,8 @@ } }, "constructInfo": { - "fqn": "aws-cdk-lib.aws_lambda.CfnPermission", - "version": "0.0.0" + "fqn": "constructs.Construct", + "version": "10.2.70" } }, "FunctionUrl": { @@ -157,19 +157,19 @@ } }, "constructInfo": { - "fqn": "aws-cdk-lib.aws_lambda.CfnUrl", - "version": "0.0.0" + "fqn": "constructs.Construct", + "version": "10.2.70" } } }, "constructInfo": { - "fqn": "aws-cdk-lib.aws_lambda.FunctionUrl", - "version": "0.0.0" + "fqn": "constructs.Construct", + "version": "10.2.70" } }, - "InvokemcfVL7pJA0SB0Bm8yGhELN3cZ1c8fYqVoNxjNP4pYCE=": { - "id": "InvokemcfVL7pJA0SB0Bm8yGhELN3cZ1c8fYqVoNxjNP4pYCE=", - "path": "lambda-permissions/MyLambda/InvokemcfVL7pJA0SB0Bm8yGhELN3cZ1c8fYqVoNxjNP4pYCE=", + "InvokeSz2P2C4jO--iX4AmIs1ANCq2qfq8PhgVeKtRAVyAkFmM=": { + "id": "InvokeSz2P2C4jO--iX4AmIs1ANCq2qfq8PhgVeKtRAVyAkFmM=", + "path": "lambda-permissions/MyLambda/InvokeSz2P2C4jO--iX4AmIs1ANCq2qfq8PhgVeKtRAVyAkFmM=", "attributes": { "aws:cdk:cloudformation:type": "AWS::Lambda::Permission", "aws:cdk:cloudformation:props": { @@ -181,12 +181,12 @@ ] }, "principal": "*", - "principalOrgId": "o-zzzzzzzzzz" + "principalOrgId": "o-mmmmmmmmmm" } }, "constructInfo": { - "fqn": "aws-cdk-lib.aws_lambda.CfnPermission", - "version": "0.0.0" + "fqn": "constructs.Construct", + "version": "10.2.70" } }, "InvokeFcyXBRX02EWa52GlF+ECQiCzDt0fdRUDi4mo4foC5aU=": { @@ -206,14 +206,14 @@ } }, "constructInfo": { - "fqn": "aws-cdk-lib.aws_lambda.CfnPermission", - "version": "0.0.0" + "fqn": "constructs.Construct", + "version": "10.2.70" } } }, "constructInfo": { - "fqn": "aws-cdk-lib.aws_lambda.Function", - "version": "0.0.0" + "fqn": "constructs.Construct", + "version": "10.2.70" } }, "MyRole": { @@ -224,8 +224,8 @@ "id": "ImportMyRole", "path": "lambda-permissions/MyRole/ImportMyRole", "constructInfo": { - "fqn": "aws-cdk-lib.Resource", - "version": "0.0.0" + "fqn": "constructs.Construct", + "version": "10.2.70" } }, "Resource": { @@ -249,8 +249,8 @@ } }, "constructInfo": { - "fqn": "aws-cdk-lib.aws_iam.CfnRole", - "version": "0.0.0" + "fqn": "constructs.Construct", + "version": "10.2.70" } }, "DefaultPolicy": { @@ -287,42 +287,42 @@ } }, "constructInfo": { - "fqn": "aws-cdk-lib.aws_iam.CfnPolicy", - "version": "0.0.0" + "fqn": "constructs.Construct", + "version": "10.2.70" } } }, "constructInfo": { - "fqn": "aws-cdk-lib.aws_iam.Policy", - "version": "0.0.0" + "fqn": "constructs.Construct", + "version": "10.2.70" } } }, "constructInfo": { - "fqn": "aws-cdk-lib.aws_iam.Role", - "version": "0.0.0" + "fqn": "constructs.Construct", + "version": "10.2.70" } }, "BootstrapVersion": { "id": "BootstrapVersion", "path": "lambda-permissions/BootstrapVersion", "constructInfo": { - "fqn": "aws-cdk-lib.CfnParameter", - "version": "0.0.0" + "fqn": "constructs.Construct", + "version": "10.2.70" } }, "CheckBootstrapVersion": { "id": "CheckBootstrapVersion", "path": "lambda-permissions/CheckBootstrapVersion", "constructInfo": { - "fqn": "aws-cdk-lib.CfnRule", - "version": "0.0.0" + "fqn": "constructs.Construct", + "version": "10.2.70" } } }, "constructInfo": { - "fqn": "aws-cdk-lib.Stack", - "version": "0.0.0" + "fqn": "constructs.Construct", + "version": "10.2.70" } }, "Tree": { @@ -335,8 +335,8 @@ } }, "constructInfo": { - "fqn": "aws-cdk-lib.App", - "version": "0.0.0" + "fqn": "constructs.Construct", + "version": "10.2.70" } } } \ No newline at end of file diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-lambda/test/integ.permissions.ts b/packages/@aws-cdk-testing/framework-integ/test/aws-lambda/test/integ.permissions.ts index 40c55e6548378..ce56cd25c0f8a 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-lambda/test/integ.permissions.ts +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-lambda/test/integ.permissions.ts @@ -24,6 +24,6 @@ const role = new iam.Role(stack, 'MyRole', { fnUrl.grantInvokeUrl(role); fn.grantInvokeCompositePrincipal(new iam.CompositePrincipal( - new iam.OrganizationPrincipal('o-zzzzzzzzzz'), + new iam.OrganizationPrincipal('o-mmmmmmmmmm'), new iam.ServicePrincipal('apigateway.amazonaws.com'), )); diff --git a/packages/@aws-cdk/aws-synthetics-alpha/.jsii b/packages/@aws-cdk/aws-synthetics-alpha/.jsii new file mode 100644 index 0000000000000..5b406d8d2b5cd --- /dev/null +++ b/packages/@aws-cdk/aws-synthetics-alpha/.jsii @@ -0,0 +1,5669 @@ +{ + "author": { + "name": "Amazon Web Services", + "organization": true, + "roles": [ + "author" + ], + "url": "https://aws.amazon.com" + }, + "dependencies": { + "aws-cdk-lib": "^0.0.0", + "constructs": "^10.0.0" + }, + "dependencyClosure": { + "@aws-cdk/asset-awscli-v1": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.Asset.AwsCliV1", + "packageId": "Amazon.CDK.Asset.AwsCliV1" + }, + "go": { + "moduleName": "github.com/cdklabs/awscdk-asset-awscli-go", + "packageName": "awscliv1" + }, + "java": { + "maven": { + "artifactId": "cdk-asset-awscli-v1", + "groupId": "software.amazon.awscdk" + }, + "package": "software.amazon.awscdk.cdk.asset.awscli.v1" + }, + "js": { + "npm": "@aws-cdk/asset-awscli-v1" + }, + "python": { + "distName": "aws-cdk.asset-awscli-v1", + "module": "aws_cdk.asset_awscli_v1" + } + } + }, + "@aws-cdk/asset-kubectl-v20": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.Asset.KubectlV20", + "packageId": "Amazon.CDK.Asset.KubectlV20" + }, + "go": { + "moduleName": "github.com/cdklabs/awscdk-asset-kubectl-go", + "packageName": "kubectlv20" + }, + "java": { + "maven": { + "artifactId": "cdk-asset-kubectl-v20", + "groupId": "software.amazon.awscdk" + }, + "package": "software.amazon.awscdk.cdk.asset.kubectl.v20" + }, + "js": { + "npm": "@aws-cdk/asset-kubectl-v20" + }, + "python": { + "distName": "aws-cdk.asset-kubectl-v20", + "module": "aws_cdk.asset_kubectl_v20" + } + } + }, + "@aws-cdk/asset-node-proxy-agent-v6": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.Asset.NodeProxyAgentV6", + "packageId": "Amazon.CDK.Asset.NodeProxyAgentV6" + }, + "go": { + "moduleName": "github.com/cdklabs/awscdk-asset-node-proxy-agent-go", + "packageName": "nodeproxyagentv6" + }, + "java": { + "maven": { + "artifactId": "cdk-asset-node-proxy-agent-v6", + "groupId": "software.amazon.awscdk" + }, + "package": "software.amazon.awscdk.cdk.asset.node.proxy.agent.v6" + }, + "js": { + "npm": "@aws-cdk/asset-node-proxy-agent-v6" + }, + "python": { + "distName": "aws-cdk.asset-node-proxy-agent-v6", + "module": "aws_cdk.asset_node_proxy_agent_v6" + } + } + }, + "aws-cdk-lib": { + "submodules": { + "aws-cdk-lib.alexa_ask": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.Alexa.Ask" + }, + "java": { + "package": "software.amazon.awscdk.alexa.ask" + }, + "python": { + "module": "aws_cdk.alexa_ask" + } + } + }, + "aws-cdk-lib.assertions": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.Assertions" + }, + "java": { + "package": "software.amazon.awscdk.assertions" + }, + "python": { + "module": "aws_cdk.assertions" + } + } + }, + "aws-cdk-lib.assets": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.Assets" + }, + "java": { + "package": "software.amazon.awscdk.assets" + }, + "python": { + "module": "aws_cdk.assets" + } + } + }, + "aws-cdk-lib.aws_accessanalyzer": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.AccessAnalyzer" + }, + "java": { + "package": "software.amazon.awscdk.services.accessanalyzer" + }, + "python": { + "module": "aws_cdk.aws_accessanalyzer" + } + } + }, + "aws-cdk-lib.aws_acmpca": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.ACMPCA" + }, + "java": { + "package": "software.amazon.awscdk.services.acmpca" + }, + "python": { + "module": "aws_cdk.aws_acmpca" + } + } + }, + "aws-cdk-lib.aws_amazonmq": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.AmazonMQ" + }, + "java": { + "package": "software.amazon.awscdk.services.amazonmq" + }, + "python": { + "module": "aws_cdk.aws_amazonmq" + } + } + }, + "aws-cdk-lib.aws_amplify": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.Amplify" + }, + "java": { + "package": "software.amazon.awscdk.services.amplify" + }, + "python": { + "module": "aws_cdk.aws_amplify" + } + } + }, + "aws-cdk-lib.aws_amplifyuibuilder": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.AmplifyUIBuilder" + }, + "java": { + "package": "software.amazon.awscdk.services.amplifyuibuilder" + }, + "python": { + "module": "aws_cdk.aws_amplifyuibuilder" + } + } + }, + "aws-cdk-lib.aws_apigateway": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.APIGateway" + }, + "java": { + "package": "software.amazon.awscdk.services.apigateway" + }, + "python": { + "module": "aws_cdk.aws_apigateway" + } + } + }, + "aws-cdk-lib.aws_apigatewayv2": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.Apigatewayv2" + }, + "java": { + "package": "software.amazon.awscdk.services.apigatewayv2" + }, + "python": { + "module": "aws_cdk.aws_apigatewayv2" + } + } + }, + "aws-cdk-lib.aws_appconfig": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.AppConfig" + }, + "java": { + "package": "software.amazon.awscdk.services.appconfig" + }, + "python": { + "module": "aws_cdk.aws_appconfig" + } + } + }, + "aws-cdk-lib.aws_appflow": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.AppFlow" + }, + "java": { + "package": "software.amazon.awscdk.services.appflow" + }, + "python": { + "module": "aws_cdk.aws_appflow" + } + } + }, + "aws-cdk-lib.aws_appintegrations": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.AppIntegrations" + }, + "java": { + "package": "software.amazon.awscdk.services.appintegrations" + }, + "python": { + "module": "aws_cdk.aws_appintegrations" + } + } + }, + "aws-cdk-lib.aws_applicationautoscaling": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.ApplicationAutoScaling" + }, + "java": { + "package": "software.amazon.awscdk.services.applicationautoscaling" + }, + "python": { + "module": "aws_cdk.aws_applicationautoscaling" + } + } + }, + "aws-cdk-lib.aws_applicationinsights": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.ApplicationInsights" + }, + "java": { + "package": "software.amazon.awscdk.services.applicationinsights" + }, + "python": { + "module": "aws_cdk.aws_applicationinsights" + } + } + }, + "aws-cdk-lib.aws_appmesh": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.AppMesh" + }, + "java": { + "package": "software.amazon.awscdk.services.appmesh" + }, + "python": { + "module": "aws_cdk.aws_appmesh" + } + } + }, + "aws-cdk-lib.aws_apprunner": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.AppRunner" + }, + "java": { + "package": "software.amazon.awscdk.services.apprunner" + }, + "python": { + "module": "aws_cdk.aws_apprunner" + } + } + }, + "aws-cdk-lib.aws_appstream": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.AppStream" + }, + "java": { + "package": "software.amazon.awscdk.services.appstream" + }, + "python": { + "module": "aws_cdk.aws_appstream" + } + } + }, + "aws-cdk-lib.aws_appsync": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.AppSync" + }, + "java": { + "package": "software.amazon.awscdk.services.appsync" + }, + "python": { + "module": "aws_cdk.aws_appsync" + } + } + }, + "aws-cdk-lib.aws_aps": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.APS" + }, + "java": { + "package": "software.amazon.awscdk.services.aps" + }, + "python": { + "module": "aws_cdk.aws_aps" + } + } + }, + "aws-cdk-lib.aws_athena": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.Athena" + }, + "java": { + "package": "software.amazon.awscdk.services.athena" + }, + "python": { + "module": "aws_cdk.aws_athena" + } + } + }, + "aws-cdk-lib.aws_auditmanager": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.AuditManager" + }, + "java": { + "package": "software.amazon.awscdk.services.auditmanager" + }, + "python": { + "module": "aws_cdk.aws_auditmanager" + } + } + }, + "aws-cdk-lib.aws_autoscaling": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.AutoScaling" + }, + "java": { + "package": "software.amazon.awscdk.services.autoscaling" + }, + "python": { + "module": "aws_cdk.aws_autoscaling" + } + } + }, + "aws-cdk-lib.aws_autoscaling_common": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.AutoScaling.Common" + }, + "java": { + "package": "software.amazon.awscdk.services.autoscaling.common" + }, + "python": { + "module": "aws_cdk.aws_autoscaling_common" + } + } + }, + "aws-cdk-lib.aws_autoscaling_hooktargets": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.AutoScaling.HookTargets" + }, + "java": { + "package": "software.amazon.awscdk.services.autoscaling.hooktargets" + }, + "python": { + "module": "aws_cdk.aws_autoscaling_hooktargets" + } + } + }, + "aws-cdk-lib.aws_autoscalingplans": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.AutoScalingPlans" + }, + "java": { + "package": "software.amazon.awscdk.services.autoscalingplans" + }, + "python": { + "module": "aws_cdk.aws_autoscalingplans" + } + } + }, + "aws-cdk-lib.aws_backup": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.Backup" + }, + "java": { + "package": "software.amazon.awscdk.services.backup" + }, + "python": { + "module": "aws_cdk.aws_backup" + } + } + }, + "aws-cdk-lib.aws_backupgateway": { + "targets": { + "dotnet": { + "package": "Amazon.CDK.AWS.BackupGateway" + }, + "java": { + "package": "services.backupgateway" + }, + "python": { + "module": "aws_cdk.aws_backupgateway" + } + } + }, + "aws-cdk-lib.aws_batch": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.Batch" + }, + "java": { + "package": "software.amazon.awscdk.services.batch" + }, + "python": { + "module": "aws_cdk.aws_batch" + } + } + }, + "aws-cdk-lib.aws_billingconductor": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.BillingConductor" + }, + "java": { + "package": "software.amazon.awscdk.services.billingconductor" + }, + "python": { + "module": "aws_cdk.aws_billingconductor" + } + } + }, + "aws-cdk-lib.aws_budgets": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.Budgets" + }, + "java": { + "package": "software.amazon.awscdk.services.budgets" + }, + "python": { + "module": "aws_cdk.aws_budgets" + } + } + }, + "aws-cdk-lib.aws_cassandra": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.Cassandra" + }, + "java": { + "package": "software.amazon.awscdk.services.cassandra" + }, + "python": { + "module": "aws_cdk.aws_cassandra" + } + } + }, + "aws-cdk-lib.aws_ce": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.CE" + }, + "java": { + "package": "software.amazon.awscdk.services.ce" + }, + "python": { + "module": "aws_cdk.aws_ce" + } + } + }, + "aws-cdk-lib.aws_certificatemanager": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.CertificateManager" + }, + "java": { + "package": "software.amazon.awscdk.services.certificatemanager" + }, + "python": { + "module": "aws_cdk.aws_certificatemanager" + } + } + }, + "aws-cdk-lib.aws_chatbot": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.Chatbot" + }, + "java": { + "package": "software.amazon.awscdk.services.chatbot" + }, + "python": { + "module": "aws_cdk.aws_chatbot" + } + } + }, + "aws-cdk-lib.aws_cleanrooms": { + "targets": { + "dotnet": { + "package": "Amazon.CDK.AWS.CleanRooms" + }, + "java": { + "package": "services.cleanrooms" + }, + "python": { + "module": "aws_cdk.aws_cleanrooms" + } + } + }, + "aws-cdk-lib.aws_cloud9": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.Cloud9" + }, + "java": { + "package": "software.amazon.awscdk.services.cloud9" + }, + "python": { + "module": "aws_cdk.aws_cloud9" + } + } + }, + "aws-cdk-lib.aws_cloudformation": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.CloudFormation" + }, + "java": { + "package": "software.amazon.awscdk.services.cloudformation" + }, + "python": { + "module": "aws_cdk.aws_cloudformation" + } + } + }, + "aws-cdk-lib.aws_cloudfront": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.CloudFront" + }, + "java": { + "package": "software.amazon.awscdk.services.cloudfront" + }, + "python": { + "module": "aws_cdk.aws_cloudfront" + } + } + }, + "aws-cdk-lib.aws_cloudfront.experimental": {}, + "aws-cdk-lib.aws_cloudfront_origins": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.CloudFront.Origins" + }, + "java": { + "package": "software.amazon.awscdk.services.cloudfront.origins" + }, + "python": { + "module": "aws_cdk.aws_cloudfront_origins" + } + } + }, + "aws-cdk-lib.aws_cloudtrail": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.CloudTrail" + }, + "java": { + "package": "software.amazon.awscdk.services.cloudtrail" + }, + "python": { + "module": "aws_cdk.aws_cloudtrail" + } + } + }, + "aws-cdk-lib.aws_cloudwatch": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.CloudWatch" + }, + "java": { + "package": "software.amazon.awscdk.services.cloudwatch" + }, + "python": { + "module": "aws_cdk.aws_cloudwatch" + } + } + }, + "aws-cdk-lib.aws_cloudwatch_actions": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.CloudWatch.Actions" + }, + "java": { + "package": "software.amazon.awscdk.services.cloudwatch.actions" + }, + "python": { + "module": "aws_cdk.aws_cloudwatch_actions" + } + } + }, + "aws-cdk-lib.aws_codeartifact": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.CodeArtifact" + }, + "java": { + "package": "software.amazon.awscdk.services.codeartifact" + }, + "python": { + "module": "aws_cdk.aws_codeartifact" + } + } + }, + "aws-cdk-lib.aws_codebuild": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.CodeBuild" + }, + "java": { + "package": "software.amazon.awscdk.services.codebuild" + }, + "python": { + "module": "aws_cdk.aws_codebuild" + } + } + }, + "aws-cdk-lib.aws_codecommit": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.CodeCommit" + }, + "java": { + "package": "software.amazon.awscdk.services.codecommit" + }, + "python": { + "module": "aws_cdk.aws_codecommit" + } + } + }, + "aws-cdk-lib.aws_codedeploy": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.CodeDeploy" + }, + "java": { + "package": "software.amazon.awscdk.services.codedeploy" + }, + "python": { + "module": "aws_cdk.aws_codedeploy" + } + } + }, + "aws-cdk-lib.aws_codeguruprofiler": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.CodeGuruProfiler" + }, + "java": { + "package": "software.amazon.awscdk.services.codeguruprofiler" + }, + "python": { + "module": "aws_cdk.aws_codeguruprofiler" + } + } + }, + "aws-cdk-lib.aws_codegurureviewer": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.CodeGuruReviewer" + }, + "java": { + "package": "software.amazon.awscdk.services.codegurureviewer" + }, + "python": { + "module": "aws_cdk.aws_codegurureviewer" + } + } + }, + "aws-cdk-lib.aws_codepipeline": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.CodePipeline" + }, + "java": { + "package": "software.amazon.awscdk.services.codepipeline" + }, + "python": { + "module": "aws_cdk.aws_codepipeline" + } + } + }, + "aws-cdk-lib.aws_codepipeline_actions": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.CodePipeline.Actions" + }, + "java": { + "package": "software.amazon.awscdk.services.codepipeline.actions" + }, + "python": { + "module": "aws_cdk.aws_codepipeline_actions" + } + } + }, + "aws-cdk-lib.aws_codestar": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.Codestar" + }, + "java": { + "package": "software.amazon.awscdk.services.codestar" + }, + "python": { + "module": "aws_cdk.aws_codestar" + } + } + }, + "aws-cdk-lib.aws_codestarconnections": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.CodeStarConnections" + }, + "java": { + "package": "software.amazon.awscdk.services.codestarconnections" + }, + "python": { + "module": "aws_cdk.aws_codestarconnections" + } + } + }, + "aws-cdk-lib.aws_codestarnotifications": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.CodeStarNotifications" + }, + "java": { + "package": "software.amazon.awscdk.services.codestarnotifications" + }, + "python": { + "module": "aws_cdk.aws_codestarnotifications" + } + } + }, + "aws-cdk-lib.aws_cognito": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.Cognito" + }, + "java": { + "package": "software.amazon.awscdk.services.cognito" + }, + "python": { + "module": "aws_cdk.aws_cognito" + } + } + }, + "aws-cdk-lib.aws_comprehend": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.Comprehend" + }, + "java": { + "package": "software.amazon.awscdk.services.comprehend" + }, + "python": { + "module": "aws_cdk.aws_comprehend" + } + } + }, + "aws-cdk-lib.aws_config": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.Config" + }, + "java": { + "package": "software.amazon.awscdk.services.config" + }, + "python": { + "module": "aws_cdk.aws_config" + } + } + }, + "aws-cdk-lib.aws_connect": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.Connect" + }, + "java": { + "package": "software.amazon.awscdk.services.connect" + }, + "python": { + "module": "aws_cdk.aws_connect" + } + } + }, + "aws-cdk-lib.aws_connectcampaigns": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.ConnectCampaigns" + }, + "java": { + "package": "software.amazon.awscdk.services.connectcampaigns" + }, + "python": { + "module": "aws_cdk.aws_connectcampaigns" + } + } + }, + "aws-cdk-lib.aws_controltower": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.ControlTower" + }, + "java": { + "package": "software.amazon.awscdk.services.controltower" + }, + "python": { + "module": "aws_cdk.aws_controltower" + } + } + }, + "aws-cdk-lib.aws_cur": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.CUR" + }, + "java": { + "package": "software.amazon.awscdk.services.cur" + }, + "python": { + "module": "aws_cdk.aws_cur" + } + } + }, + "aws-cdk-lib.aws_customerprofiles": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.CustomerProfiles" + }, + "java": { + "package": "software.amazon.awscdk.services.customerprofiles" + }, + "python": { + "module": "aws_cdk.aws_customerprofiles" + } + } + }, + "aws-cdk-lib.aws_databrew": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.DataBrew" + }, + "java": { + "package": "software.amazon.awscdk.services.databrew" + }, + "python": { + "module": "aws_cdk.aws_databrew" + } + } + }, + "aws-cdk-lib.aws_datapipeline": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.DataPipeline" + }, + "java": { + "package": "software.amazon.awscdk.services.datapipeline" + }, + "python": { + "module": "aws_cdk.aws_datapipeline" + } + } + }, + "aws-cdk-lib.aws_datasync": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.DataSync" + }, + "java": { + "package": "software.amazon.awscdk.services.datasync" + }, + "python": { + "module": "aws_cdk.aws_datasync" + } + } + }, + "aws-cdk-lib.aws_dax": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.DAX" + }, + "java": { + "package": "software.amazon.awscdk.services.dax" + }, + "python": { + "module": "aws_cdk.aws_dax" + } + } + }, + "aws-cdk-lib.aws_detective": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.Detective" + }, + "java": { + "package": "software.amazon.awscdk.services.detective" + }, + "python": { + "module": "aws_cdk.aws_detective" + } + } + }, + "aws-cdk-lib.aws_devicefarm": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.DeviceFarm" + }, + "java": { + "package": "software.amazon.awscdk.services.devicefarm" + }, + "python": { + "module": "aws_cdk.aws_devicefarm" + } + } + }, + "aws-cdk-lib.aws_devopsguru": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.DevOpsGuru" + }, + "java": { + "package": "software.amazon.awscdk.services.devopsguru" + }, + "python": { + "module": "aws_cdk.aws_devopsguru" + } + } + }, + "aws-cdk-lib.aws_directoryservice": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.DirectoryService" + }, + "java": { + "package": "software.amazon.awscdk.services.directoryservice" + }, + "python": { + "module": "aws_cdk.aws_directoryservice" + } + } + }, + "aws-cdk-lib.aws_dlm": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.DLM" + }, + "java": { + "package": "software.amazon.awscdk.services.dlm" + }, + "python": { + "module": "aws_cdk.aws_dlm" + } + } + }, + "aws-cdk-lib.aws_dms": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.DMS" + }, + "java": { + "package": "software.amazon.awscdk.services.dms" + }, + "python": { + "module": "aws_cdk.aws_dms" + } + } + }, + "aws-cdk-lib.aws_docdb": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.DocDB" + }, + "java": { + "package": "software.amazon.awscdk.services.docdb" + }, + "python": { + "module": "aws_cdk.aws_docdb" + } + } + }, + "aws-cdk-lib.aws_docdbelastic": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.DocDBElastic" + }, + "java": { + "package": "software.amazon.awscdk.services.docdbelastic" + }, + "python": { + "module": "aws_cdk.aws_docdbelastic" + } + } + }, + "aws-cdk-lib.aws_dynamodb": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.DynamoDB" + }, + "java": { + "package": "software.amazon.awscdk.services.dynamodb" + }, + "python": { + "module": "aws_cdk.aws_dynamodb" + } + } + }, + "aws-cdk-lib.aws_ec2": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.EC2" + }, + "java": { + "package": "software.amazon.awscdk.services.ec2" + }, + "python": { + "module": "aws_cdk.aws_ec2" + } + } + }, + "aws-cdk-lib.aws_ecr": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.ECR" + }, + "java": { + "package": "software.amazon.awscdk.services.ecr" + }, + "python": { + "module": "aws_cdk.aws_ecr" + } + } + }, + "aws-cdk-lib.aws_ecr_assets": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.Ecr.Assets" + }, + "java": { + "package": "software.amazon.awscdk.services.ecr.assets" + }, + "python": { + "module": "aws_cdk.aws_ecr_assets" + } + } + }, + "aws-cdk-lib.aws_ecs": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.ECS" + }, + "java": { + "package": "software.amazon.awscdk.services.ecs" + }, + "python": { + "module": "aws_cdk.aws_ecs" + } + } + }, + "aws-cdk-lib.aws_ecs_patterns": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.ECS.Patterns" + }, + "java": { + "package": "software.amazon.awscdk.services.ecs.patterns" + }, + "python": { + "module": "aws_cdk.aws_ecs_patterns" + } + } + }, + "aws-cdk-lib.aws_efs": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.EFS" + }, + "java": { + "package": "software.amazon.awscdk.services.efs" + }, + "python": { + "module": "aws_cdk.aws_efs" + } + } + }, + "aws-cdk-lib.aws_eks": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.EKS" + }, + "java": { + "package": "software.amazon.awscdk.services.eks" + }, + "python": { + "module": "aws_cdk.aws_eks" + } + } + }, + "aws-cdk-lib.aws_elasticache": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.ElastiCache" + }, + "java": { + "package": "software.amazon.awscdk.services.elasticache" + }, + "python": { + "module": "aws_cdk.aws_elasticache" + } + } + }, + "aws-cdk-lib.aws_elasticbeanstalk": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.ElasticBeanstalk" + }, + "java": { + "package": "software.amazon.awscdk.services.elasticbeanstalk" + }, + "python": { + "module": "aws_cdk.aws_elasticbeanstalk" + } + } + }, + "aws-cdk-lib.aws_elasticloadbalancing": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.ElasticLoadBalancing" + }, + "java": { + "package": "software.amazon.awscdk.services.elasticloadbalancing" + }, + "python": { + "module": "aws_cdk.aws_elasticloadbalancing" + } + } + }, + "aws-cdk-lib.aws_elasticloadbalancingv2": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.ElasticLoadBalancingV2" + }, + "java": { + "package": "software.amazon.awscdk.services.elasticloadbalancingv2" + }, + "python": { + "module": "aws_cdk.aws_elasticloadbalancingv2" + } + } + }, + "aws-cdk-lib.aws_elasticloadbalancingv2_actions": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.ElasticLoadBalancingV2.Actions" + }, + "java": { + "package": "software.amazon.awscdk.services.elasticloadbalancingv2.actions" + }, + "python": { + "module": "aws_cdk.aws_elasticloadbalancingv2_actions" + } + } + }, + "aws-cdk-lib.aws_elasticloadbalancingv2_targets": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.ElasticLoadBalancingV2.Targets" + }, + "java": { + "package": "software.amazon.awscdk.services.elasticloadbalancingv2.targets" + }, + "python": { + "module": "aws_cdk.aws_elasticloadbalancingv2_targets" + } + } + }, + "aws-cdk-lib.aws_elasticsearch": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.Elasticsearch" + }, + "java": { + "package": "software.amazon.awscdk.services.elasticsearch" + }, + "python": { + "module": "aws_cdk.aws_elasticsearch" + } + } + }, + "aws-cdk-lib.aws_emr": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.EMR" + }, + "java": { + "package": "software.amazon.awscdk.services.emr" + }, + "python": { + "module": "aws_cdk.aws_emr" + } + } + }, + "aws-cdk-lib.aws_emrcontainers": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.EMRContainers" + }, + "java": { + "package": "software.amazon.awscdk.services.emrcontainers" + }, + "python": { + "module": "aws_cdk.aws_emrcontainers" + } + } + }, + "aws-cdk-lib.aws_emrserverless": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.EMRServerless" + }, + "java": { + "package": "software.amazon.awscdk.services.emrserverless" + }, + "python": { + "module": "aws_cdk.aws_emrserverless" + } + } + }, + "aws-cdk-lib.aws_entityresolution": { + "targets": { + "dotnet": { + "package": "Amazon.CDK.AWS.EntityResolution" + }, + "java": { + "package": "services.entityresolution" + }, + "python": { + "module": "aws_cdk.aws_entityresolution" + } + } + }, + "aws-cdk-lib.aws_events": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.Events" + }, + "java": { + "package": "software.amazon.awscdk.services.events" + }, + "python": { + "module": "aws_cdk.aws_events" + } + } + }, + "aws-cdk-lib.aws_events_targets": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.Events.Targets" + }, + "java": { + "package": "software.amazon.awscdk.services.events.targets" + }, + "python": { + "module": "aws_cdk.aws_events_targets" + } + } + }, + "aws-cdk-lib.aws_eventschemas": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.EventSchemas" + }, + "java": { + "package": "software.amazon.awscdk.services.eventschemas" + }, + "python": { + "module": "aws_cdk.aws_eventschemas" + } + } + }, + "aws-cdk-lib.aws_evidently": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.Evidently" + }, + "java": { + "package": "software.amazon.awscdk.services.evidently" + }, + "python": { + "module": "aws_cdk.aws_evidently" + } + } + }, + "aws-cdk-lib.aws_finspace": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.FinSpace" + }, + "java": { + "package": "software.amazon.awscdk.services.finspace" + }, + "python": { + "module": "aws_cdk.aws_finspace" + } + } + }, + "aws-cdk-lib.aws_fis": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.FIS" + }, + "java": { + "package": "software.amazon.awscdk.services.fis" + }, + "python": { + "module": "aws_cdk.aws_fis" + } + } + }, + "aws-cdk-lib.aws_fms": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.FMS" + }, + "java": { + "package": "software.amazon.awscdk.services.fms" + }, + "python": { + "module": "aws_cdk.aws_fms" + } + } + }, + "aws-cdk-lib.aws_forecast": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.Forecast" + }, + "java": { + "package": "software.amazon.awscdk.services.forecast" + }, + "python": { + "module": "aws_cdk.aws_forecast" + } + } + }, + "aws-cdk-lib.aws_frauddetector": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.FraudDetector" + }, + "java": { + "package": "software.amazon.awscdk.services.frauddetector" + }, + "python": { + "module": "aws_cdk.aws_frauddetector" + } + } + }, + "aws-cdk-lib.aws_fsx": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.FSx" + }, + "java": { + "package": "software.amazon.awscdk.services.fsx" + }, + "python": { + "module": "aws_cdk.aws_fsx" + } + } + }, + "aws-cdk-lib.aws_gamelift": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.GameLift" + }, + "java": { + "package": "software.amazon.awscdk.services.gamelift" + }, + "python": { + "module": "aws_cdk.aws_gamelift" + } + } + }, + "aws-cdk-lib.aws_globalaccelerator": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.GlobalAccelerator" + }, + "java": { + "package": "software.amazon.awscdk.services.globalaccelerator" + }, + "python": { + "module": "aws_cdk.aws_globalaccelerator" + } + } + }, + "aws-cdk-lib.aws_globalaccelerator_endpoints": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.GlobalAccelerator.Endpoints" + }, + "java": { + "package": "software.amazon.awscdk.services.globalaccelerator.endpoints" + }, + "python": { + "module": "aws_cdk.aws_globalaccelerator_endpoints" + } + } + }, + "aws-cdk-lib.aws_glue": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.Glue" + }, + "java": { + "package": "software.amazon.awscdk.services.glue" + }, + "python": { + "module": "aws_cdk.aws_glue" + } + } + }, + "aws-cdk-lib.aws_grafana": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.Grafana" + }, + "java": { + "package": "software.amazon.awscdk.services.grafana" + }, + "python": { + "module": "aws_cdk.aws_grafana" + } + } + }, + "aws-cdk-lib.aws_greengrass": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.Greengrass" + }, + "java": { + "package": "software.amazon.awscdk.services.greengrass" + }, + "python": { + "module": "aws_cdk.aws_greengrass" + } + } + }, + "aws-cdk-lib.aws_greengrassv2": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.GreengrassV2" + }, + "java": { + "package": "software.amazon.awscdk.services.greengrassv2" + }, + "python": { + "module": "aws_cdk.aws_greengrassv2" + } + } + }, + "aws-cdk-lib.aws_groundstation": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.GroundStation" + }, + "java": { + "package": "software.amazon.awscdk.services.groundstation" + }, + "python": { + "module": "aws_cdk.aws_groundstation" + } + } + }, + "aws-cdk-lib.aws_guardduty": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.GuardDuty" + }, + "java": { + "package": "software.amazon.awscdk.services.guardduty" + }, + "python": { + "module": "aws_cdk.aws_guardduty" + } + } + }, + "aws-cdk-lib.aws_healthimaging": { + "targets": { + "dotnet": { + "package": "Amazon.CDK.AWS.HealthImaging" + }, + "java": { + "package": "services.healthimaging" + }, + "python": { + "module": "aws_cdk.aws_healthimaging" + } + } + }, + "aws-cdk-lib.aws_healthlake": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.HealthLake" + }, + "java": { + "package": "software.amazon.awscdk.services.healthlake" + }, + "python": { + "module": "aws_cdk.aws_healthlake" + } + } + }, + "aws-cdk-lib.aws_iam": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.IAM" + }, + "java": { + "package": "software.amazon.awscdk.services.iam" + }, + "python": { + "module": "aws_cdk.aws_iam" + } + } + }, + "aws-cdk-lib.aws_identitystore": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.IdentityStore" + }, + "java": { + "package": "software.amazon.awscdk.services.identitystore" + }, + "python": { + "module": "aws_cdk.aws_identitystore" + } + } + }, + "aws-cdk-lib.aws_imagebuilder": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.ImageBuilder" + }, + "java": { + "package": "software.amazon.awscdk.services.imagebuilder" + }, + "python": { + "module": "aws_cdk.aws_imagebuilder" + } + } + }, + "aws-cdk-lib.aws_inspector": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.Inspector" + }, + "java": { + "package": "software.amazon.awscdk.services.inspector" + }, + "python": { + "module": "aws_cdk.aws_inspector" + } + } + }, + "aws-cdk-lib.aws_inspectorv2": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.InspectorV2" + }, + "java": { + "package": "software.amazon.awscdk.services.inspectorv2" + }, + "python": { + "module": "aws_cdk.aws_inspectorv2" + } + } + }, + "aws-cdk-lib.aws_internetmonitor": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.InternetMonitor" + }, + "java": { + "package": "software.amazon.awscdk.services.internetmonitor" + }, + "python": { + "module": "aws_cdk.aws_internetmonitor" + } + } + }, + "aws-cdk-lib.aws_iot": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.IoT" + }, + "java": { + "package": "software.amazon.awscdk.services.iot" + }, + "python": { + "module": "aws_cdk.aws_iot" + } + } + }, + "aws-cdk-lib.aws_iot1click": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.IoT1Click" + }, + "java": { + "package": "software.amazon.awscdk.services.iot1click" + }, + "python": { + "module": "aws_cdk.aws_iot1click" + } + } + }, + "aws-cdk-lib.aws_iotanalytics": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.IoTAnalytics" + }, + "java": { + "package": "software.amazon.awscdk.services.iotanalytics" + }, + "python": { + "module": "aws_cdk.aws_iotanalytics" + } + } + }, + "aws-cdk-lib.aws_iotcoredeviceadvisor": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.IoTCoreDeviceAdvisor" + }, + "java": { + "package": "software.amazon.awscdk.services.iotcoredeviceadvisor" + }, + "python": { + "module": "aws_cdk.aws_iotcoredeviceadvisor" + } + } + }, + "aws-cdk-lib.aws_iotevents": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.IoTEvents" + }, + "java": { + "package": "software.amazon.awscdk.services.iotevents" + }, + "python": { + "module": "aws_cdk.aws_iotevents" + } + } + }, + "aws-cdk-lib.aws_iotfleethub": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.IoTFleetHub" + }, + "java": { + "package": "software.amazon.awscdk.services.iotfleethub" + }, + "python": { + "module": "aws_cdk.aws_iotfleethub" + } + } + }, + "aws-cdk-lib.aws_iotfleetwise": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.IoTFleetWise" + }, + "java": { + "package": "software.amazon.awscdk.services.iotfleetwise" + }, + "python": { + "module": "aws_cdk.aws_iotfleetwise" + } + } + }, + "aws-cdk-lib.aws_iotsitewise": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.IoTSiteWise" + }, + "java": { + "package": "software.amazon.awscdk.services.iotsitewise" + }, + "python": { + "module": "aws_cdk.aws_iotsitewise" + } + } + }, + "aws-cdk-lib.aws_iotthingsgraph": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.IoTThingsGraph" + }, + "java": { + "package": "software.amazon.awscdk.services.iotthingsgraph" + }, + "python": { + "module": "aws_cdk.aws_iotthingsgraph" + } + } + }, + "aws-cdk-lib.aws_iottwinmaker": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.IoTTwinMaker" + }, + "java": { + "package": "software.amazon.awscdk.services.iottwinmaker" + }, + "python": { + "module": "aws_cdk.aws_iottwinmaker" + } + } + }, + "aws-cdk-lib.aws_iotwireless": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.IoTWireless" + }, + "java": { + "package": "software.amazon.awscdk.services.iotwireless" + }, + "python": { + "module": "aws_cdk.aws_iotwireless" + } + } + }, + "aws-cdk-lib.aws_ivs": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.Ivs" + }, + "java": { + "package": "software.amazon.awscdk.services.ivs" + }, + "python": { + "module": "aws_cdk.aws_ivs" + } + } + }, + "aws-cdk-lib.aws_ivschat": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.IVSChat" + }, + "java": { + "package": "software.amazon.awscdk.services.ivschat" + }, + "python": { + "module": "aws_cdk.aws_ivschat" + } + } + }, + "aws-cdk-lib.aws_kafkaconnect": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.KafkaConnect" + }, + "java": { + "package": "software.amazon.awscdk.services.kafkaconnect" + }, + "python": { + "module": "aws_cdk.aws_kafkaconnect" + } + } + }, + "aws-cdk-lib.aws_kendra": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.Kendra" + }, + "java": { + "package": "software.amazon.awscdk.services.kendra" + }, + "python": { + "module": "aws_cdk.aws_kendra" + } + } + }, + "aws-cdk-lib.aws_kendraranking": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.KendraRanking" + }, + "java": { + "package": "software.amazon.awscdk.services.kendraranking" + }, + "python": { + "module": "aws_cdk.aws_kendraranking" + } + } + }, + "aws-cdk-lib.aws_kinesis": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.Kinesis" + }, + "java": { + "package": "software.amazon.awscdk.services.kinesis" + }, + "python": { + "module": "aws_cdk.aws_kinesis" + } + } + }, + "aws-cdk-lib.aws_kinesisanalytics": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.KinesisAnalytics" + }, + "java": { + "package": "software.amazon.awscdk.services.kinesisanalytics" + }, + "python": { + "module": "aws_cdk.aws_kinesisanalytics" + } + } + }, + "aws-cdk-lib.aws_kinesisanalyticsv2": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.KinesisAnalyticsV2" + }, + "java": { + "package": "software.amazon.awscdk.services.kinesisanalyticsv2" + }, + "python": { + "module": "aws_cdk.aws_kinesisanalyticsv2" + } + } + }, + "aws-cdk-lib.aws_kinesisfirehose": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.KinesisFirehose" + }, + "java": { + "package": "software.amazon.awscdk.services.kinesisfirehose" + }, + "python": { + "module": "aws_cdk.aws_kinesisfirehose" + } + } + }, + "aws-cdk-lib.aws_kinesisvideo": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.KinesisVideo" + }, + "java": { + "package": "software.amazon.awscdk.services.kinesisvideo" + }, + "python": { + "module": "aws_cdk.aws_kinesisvideo" + } + } + }, + "aws-cdk-lib.aws_kms": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.KMS" + }, + "java": { + "package": "software.amazon.awscdk.services.kms" + }, + "python": { + "module": "aws_cdk.aws_kms" + } + } + }, + "aws-cdk-lib.aws_lakeformation": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.LakeFormation" + }, + "java": { + "package": "software.amazon.awscdk.services.lakeformation" + }, + "python": { + "module": "aws_cdk.aws_lakeformation" + } + } + }, + "aws-cdk-lib.aws_lambda": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.Lambda" + }, + "java": { + "package": "software.amazon.awscdk.services.lambda" + }, + "python": { + "module": "aws_cdk.aws_lambda" + } + } + }, + "aws-cdk-lib.aws_lambda_destinations": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.Lambda.Destinations" + }, + "java": { + "package": "software.amazon.awscdk.services.lambda.destinations" + }, + "python": { + "module": "aws_cdk.aws_lambda_destinations" + } + } + }, + "aws-cdk-lib.aws_lambda_event_sources": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.Lambda.EventSources" + }, + "java": { + "package": "software.amazon.awscdk.services.lambda.eventsources" + }, + "python": { + "module": "aws_cdk.aws_lambda_event_sources" + } + } + }, + "aws-cdk-lib.aws_lambda_nodejs": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.Lambda.Nodejs" + }, + "java": { + "package": "software.amazon.awscdk.services.lambda.nodejs" + }, + "python": { + "module": "aws_cdk.aws_lambda_nodejs" + } + } + }, + "aws-cdk-lib.aws_lex": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.Lex" + }, + "java": { + "package": "software.amazon.awscdk.services.lex" + }, + "python": { + "module": "aws_cdk.aws_lex" + } + } + }, + "aws-cdk-lib.aws_licensemanager": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.LicenseManager" + }, + "java": { + "package": "software.amazon.awscdk.services.licensemanager" + }, + "python": { + "module": "aws_cdk.aws_licensemanager" + } + } + }, + "aws-cdk-lib.aws_lightsail": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.Lightsail" + }, + "java": { + "package": "software.amazon.awscdk.services.lightsail" + }, + "python": { + "module": "aws_cdk.aws_lightsail" + } + } + }, + "aws-cdk-lib.aws_location": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.Location" + }, + "java": { + "package": "software.amazon.awscdk.services.location" + }, + "python": { + "module": "aws_cdk.aws_location" + } + } + }, + "aws-cdk-lib.aws_logs": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.Logs" + }, + "java": { + "package": "software.amazon.awscdk.services.logs" + }, + "python": { + "module": "aws_cdk.aws_logs" + } + } + }, + "aws-cdk-lib.aws_logs_destinations": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.Logs.Destinations" + }, + "java": { + "package": "software.amazon.awscdk.services.logs.destinations" + }, + "python": { + "module": "aws_cdk.aws_logs_destinations" + } + } + }, + "aws-cdk-lib.aws_lookoutequipment": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.LookoutEquipment" + }, + "java": { + "package": "software.amazon.awscdk.services.lookoutequipment" + }, + "python": { + "module": "aws_cdk.aws_lookoutequipment" + } + } + }, + "aws-cdk-lib.aws_lookoutmetrics": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.LookoutMetrics" + }, + "java": { + "package": "software.amazon.awscdk.services.lookoutmetrics" + }, + "python": { + "module": "aws_cdk.aws_lookoutmetrics" + } + } + }, + "aws-cdk-lib.aws_lookoutvision": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.LookoutVision" + }, + "java": { + "package": "software.amazon.awscdk.services.lookoutvision" + }, + "python": { + "module": "aws_cdk.aws_lookoutvision" + } + } + }, + "aws-cdk-lib.aws_m2": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.M2" + }, + "java": { + "package": "software.amazon.awscdk.services.m2" + }, + "python": { + "module": "aws_cdk.aws_m2" + } + } + }, + "aws-cdk-lib.aws_macie": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.Macie" + }, + "java": { + "package": "software.amazon.awscdk.services.macie" + }, + "python": { + "module": "aws_cdk.aws_macie" + } + } + }, + "aws-cdk-lib.aws_managedblockchain": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.ManagedBlockchain" + }, + "java": { + "package": "software.amazon.awscdk.services.managedblockchain" + }, + "python": { + "module": "aws_cdk.aws_managedblockchain" + } + } + }, + "aws-cdk-lib.aws_mediaconnect": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.MediaConnect" + }, + "java": { + "package": "software.amazon.awscdk.services.mediaconnect" + }, + "python": { + "module": "aws_cdk.aws_mediaconnect" + } + } + }, + "aws-cdk-lib.aws_mediaconvert": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.MediaConvert" + }, + "java": { + "package": "software.amazon.awscdk.services.mediaconvert" + }, + "python": { + "module": "aws_cdk.aws_mediaconvert" + } + } + }, + "aws-cdk-lib.aws_medialive": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.MediaLive" + }, + "java": { + "package": "software.amazon.awscdk.services.medialive" + }, + "python": { + "module": "aws_cdk.aws_medialive" + } + } + }, + "aws-cdk-lib.aws_mediapackage": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.MediaPackage" + }, + "java": { + "package": "software.amazon.awscdk.services.mediapackage" + }, + "python": { + "module": "aws_cdk.aws_mediapackage" + } + } + }, + "aws-cdk-lib.aws_mediapackagev2": { + "targets": { + "dotnet": { + "package": "Amazon.CDK.AWS.MediaPackageV2" + }, + "java": { + "package": "services.mediapackagev2" + }, + "python": { + "module": "aws_cdk.aws_mediapackagev2" + } + } + }, + "aws-cdk-lib.aws_mediastore": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.MediaStore" + }, + "java": { + "package": "software.amazon.awscdk.services.mediastore" + }, + "python": { + "module": "aws_cdk.aws_mediastore" + } + } + }, + "aws-cdk-lib.aws_mediatailor": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.MediaTailor" + }, + "java": { + "package": "software.amazon.awscdk.services.mediatailor" + }, + "python": { + "module": "aws_cdk.aws_mediatailor" + } + } + }, + "aws-cdk-lib.aws_memorydb": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.MemoryDB" + }, + "java": { + "package": "software.amazon.awscdk.services.memorydb" + }, + "python": { + "module": "aws_cdk.aws_memorydb" + } + } + }, + "aws-cdk-lib.aws_msk": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.MSK" + }, + "java": { + "package": "software.amazon.awscdk.services.msk" + }, + "python": { + "module": "aws_cdk.aws_msk" + } + } + }, + "aws-cdk-lib.aws_mwaa": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.MWAA" + }, + "java": { + "package": "software.amazon.awscdk.services.mwaa" + }, + "python": { + "module": "aws_cdk.aws_mwaa" + } + } + }, + "aws-cdk-lib.aws_neptune": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.Neptune" + }, + "java": { + "package": "software.amazon.awscdk.services.neptune" + }, + "python": { + "module": "aws_cdk.aws_neptune" + } + } + }, + "aws-cdk-lib.aws_networkfirewall": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.NetworkFirewall" + }, + "java": { + "package": "software.amazon.awscdk.services.networkfirewall" + }, + "python": { + "module": "aws_cdk.aws_networkfirewall" + } + } + }, + "aws-cdk-lib.aws_networkmanager": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.NetworkManager" + }, + "java": { + "package": "software.amazon.awscdk.services.networkmanager" + }, + "python": { + "module": "aws_cdk.aws_networkmanager" + } + } + }, + "aws-cdk-lib.aws_nimblestudio": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.NimbleStudio" + }, + "java": { + "package": "software.amazon.awscdk.services.nimblestudio" + }, + "python": { + "module": "aws_cdk.aws_nimblestudio" + } + } + }, + "aws-cdk-lib.aws_oam": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.Oam" + }, + "java": { + "package": "software.amazon.awscdk.services.oam" + }, + "python": { + "module": "aws_cdk.aws_oam" + } + } + }, + "aws-cdk-lib.aws_omics": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.Omics" + }, + "java": { + "package": "software.amazon.awscdk.services.omics" + }, + "python": { + "module": "aws_cdk.aws_omics" + } + } + }, + "aws-cdk-lib.aws_opensearchserverless": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.OpenSearchServerless" + }, + "java": { + "package": "software.amazon.awscdk.services.opensearchserverless" + }, + "python": { + "module": "aws_cdk.aws_opensearchserverless" + } + } + }, + "aws-cdk-lib.aws_opensearchservice": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.OpenSearchService" + }, + "java": { + "package": "software.amazon.awscdk.services.opensearchservice" + }, + "python": { + "module": "aws_cdk.aws_opensearchservice" + } + } + }, + "aws-cdk-lib.aws_opsworks": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.OpsWorks" + }, + "java": { + "package": "software.amazon.awscdk.services.opsworks" + }, + "python": { + "module": "aws_cdk.aws_opsworks" + } + } + }, + "aws-cdk-lib.aws_opsworkscm": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.OpsWorksCM" + }, + "java": { + "package": "software.amazon.awscdk.services.opsworkscm" + }, + "python": { + "module": "aws_cdk.aws_opsworkscm" + } + } + }, + "aws-cdk-lib.aws_organizations": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.Organizations" + }, + "java": { + "package": "software.amazon.awscdk.services.organizations" + }, + "python": { + "module": "aws_cdk.aws_organizations" + } + } + }, + "aws-cdk-lib.aws_osis": { + "targets": { + "dotnet": { + "package": "Amazon.CDK.AWS.OSIS" + }, + "java": { + "package": "services.osis" + }, + "python": { + "module": "aws_cdk.aws_osis" + } + } + }, + "aws-cdk-lib.aws_panorama": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.Panorama" + }, + "java": { + "package": "software.amazon.awscdk.services.panorama" + }, + "python": { + "module": "aws_cdk.aws_panorama" + } + } + }, + "aws-cdk-lib.aws_pcaconnectorad": { + "targets": { + "dotnet": { + "package": "Amazon.CDK.AWS.PCAConnectorAD" + }, + "java": { + "package": "services.pcaconnectorad" + }, + "python": { + "module": "aws_cdk.aws_pcaconnectorad" + } + } + }, + "aws-cdk-lib.aws_personalize": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.Personalize" + }, + "java": { + "package": "software.amazon.awscdk.services.personalize" + }, + "python": { + "module": "aws_cdk.aws_personalize" + } + } + }, + "aws-cdk-lib.aws_pinpoint": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.Pinpoint" + }, + "java": { + "package": "software.amazon.awscdk.services.pinpoint" + }, + "python": { + "module": "aws_cdk.aws_pinpoint" + } + } + }, + "aws-cdk-lib.aws_pinpointemail": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.PinpointEmail" + }, + "java": { + "package": "software.amazon.awscdk.services.pinpointemail" + }, + "python": { + "module": "aws_cdk.aws_pinpointemail" + } + } + }, + "aws-cdk-lib.aws_pipes": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.Pipes" + }, + "java": { + "package": "software.amazon.awscdk.services.pipes" + }, + "python": { + "module": "aws_cdk.aws_pipes" + } + } + }, + "aws-cdk-lib.aws_proton": { + "targets": { + "dotnet": { + "package": "Amazon.CDK.AWS.Proton" + }, + "java": { + "package": "services.proton" + }, + "python": { + "module": "aws_cdk.aws_proton" + } + } + }, + "aws-cdk-lib.aws_qldb": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.QLDB" + }, + "java": { + "package": "software.amazon.awscdk.services.qldb" + }, + "python": { + "module": "aws_cdk.aws_qldb" + } + } + }, + "aws-cdk-lib.aws_quicksight": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.QuickSight" + }, + "java": { + "package": "software.amazon.awscdk.services.quicksight" + }, + "python": { + "module": "aws_cdk.aws_quicksight" + } + } + }, + "aws-cdk-lib.aws_ram": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.RAM" + }, + "java": { + "package": "software.amazon.awscdk.services.ram" + }, + "python": { + "module": "aws_cdk.aws_ram" + } + } + }, + "aws-cdk-lib.aws_rds": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.RDS" + }, + "java": { + "package": "software.amazon.awscdk.services.rds" + }, + "python": { + "module": "aws_cdk.aws_rds" + } + } + }, + "aws-cdk-lib.aws_redshift": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.Redshift" + }, + "java": { + "package": "software.amazon.awscdk.services.redshift" + }, + "python": { + "module": "aws_cdk.aws_redshift" + } + } + }, + "aws-cdk-lib.aws_redshiftserverless": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.RedshiftServerless" + }, + "java": { + "package": "software.amazon.awscdk.services.redshiftserverless" + }, + "python": { + "module": "aws_cdk.aws_redshiftserverless" + } + } + }, + "aws-cdk-lib.aws_refactorspaces": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.RefactorSpaces" + }, + "java": { + "package": "software.amazon.awscdk.services.refactorspaces" + }, + "python": { + "module": "aws_cdk.aws_refactorspaces" + } + } + }, + "aws-cdk-lib.aws_rekognition": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.Rekognition" + }, + "java": { + "package": "software.amazon.awscdk.services.rekognition" + }, + "python": { + "module": "aws_cdk.aws_rekognition" + } + } + }, + "aws-cdk-lib.aws_resiliencehub": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.ResilienceHub" + }, + "java": { + "package": "software.amazon.awscdk.services.resiliencehub" + }, + "python": { + "module": "aws_cdk.aws_resiliencehub" + } + } + }, + "aws-cdk-lib.aws_resourceexplorer2": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.ResourceExplorer2" + }, + "java": { + "package": "software.amazon.awscdk.services.resourceexplorer2" + }, + "python": { + "module": "aws_cdk.aws_resourceexplorer2" + } + } + }, + "aws-cdk-lib.aws_resourcegroups": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.ResourceGroups" + }, + "java": { + "package": "software.amazon.awscdk.services.resourcegroups" + }, + "python": { + "module": "aws_cdk.aws_resourcegroups" + } + } + }, + "aws-cdk-lib.aws_robomaker": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.RoboMaker" + }, + "java": { + "package": "software.amazon.awscdk.services.robomaker" + }, + "python": { + "module": "aws_cdk.aws_robomaker" + } + } + }, + "aws-cdk-lib.aws_rolesanywhere": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.RolesAnywhere" + }, + "java": { + "package": "software.amazon.awscdk.services.rolesanywhere" + }, + "python": { + "module": "aws_cdk.aws_rolesanywhere" + } + } + }, + "aws-cdk-lib.aws_route53": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.Route53" + }, + "java": { + "package": "software.amazon.awscdk.services.route53" + }, + "python": { + "module": "aws_cdk.aws_route53" + } + } + }, + "aws-cdk-lib.aws_route53_patterns": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.Route53.Patterns" + }, + "java": { + "package": "software.amazon.awscdk.services.route53.patterns" + }, + "python": { + "module": "aws_cdk.aws_route53_patterns" + } + } + }, + "aws-cdk-lib.aws_route53_targets": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.Route53.Targets" + }, + "java": { + "package": "software.amazon.awscdk.services.route53.targets" + }, + "python": { + "module": "aws_cdk.aws_route53_targets" + } + } + }, + "aws-cdk-lib.aws_route53recoverycontrol": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.Route53RecoveryControl" + }, + "java": { + "package": "software.amazon.awscdk.services.route53recoverycontrol" + }, + "python": { + "module": "aws_cdk.aws_route53recoverycontrol" + } + } + }, + "aws-cdk-lib.aws_route53recoveryreadiness": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.Route53RecoveryReadiness" + }, + "java": { + "package": "software.amazon.awscdk.services.route53recoveryreadiness" + }, + "python": { + "module": "aws_cdk.aws_route53recoveryreadiness" + } + } + }, + "aws-cdk-lib.aws_route53resolver": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.Route53Resolver" + }, + "java": { + "package": "software.amazon.awscdk.services.route53resolver" + }, + "python": { + "module": "aws_cdk.aws_route53resolver" + } + } + }, + "aws-cdk-lib.aws_rum": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.RUM" + }, + "java": { + "package": "software.amazon.awscdk.services.rum" + }, + "python": { + "module": "aws_cdk.aws_rum" + } + } + }, + "aws-cdk-lib.aws_s3": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.S3" + }, + "java": { + "package": "software.amazon.awscdk.services.s3" + }, + "python": { + "module": "aws_cdk.aws_s3" + } + } + }, + "aws-cdk-lib.aws_s3_assets": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.S3.Assets" + }, + "java": { + "package": "software.amazon.awscdk.services.s3.assets" + }, + "python": { + "module": "aws_cdk.aws_s3_assets" + } + } + }, + "aws-cdk-lib.aws_s3_deployment": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.S3.Deployment" + }, + "java": { + "package": "software.amazon.awscdk.services.s3.deployment" + }, + "python": { + "module": "aws_cdk.aws_s3_deployment" + } + } + }, + "aws-cdk-lib.aws_s3_notifications": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.S3.Notifications" + }, + "java": { + "package": "software.amazon.awscdk.services.s3.notifications" + }, + "python": { + "module": "aws_cdk.aws_s3_notifications" + } + } + }, + "aws-cdk-lib.aws_s3objectlambda": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.S3ObjectLambda" + }, + "java": { + "package": "software.amazon.awscdk.services.s3objectlambda" + }, + "python": { + "module": "aws_cdk.aws_s3objectlambda" + } + } + }, + "aws-cdk-lib.aws_s3outposts": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.S3Outposts" + }, + "java": { + "package": "software.amazon.awscdk.services.s3outposts" + }, + "python": { + "module": "aws_cdk.aws_s3outposts" + } + } + }, + "aws-cdk-lib.aws_sagemaker": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.Sagemaker" + }, + "java": { + "package": "software.amazon.awscdk.services.sagemaker" + }, + "python": { + "module": "aws_cdk.aws_sagemaker" + } + } + }, + "aws-cdk-lib.aws_sam": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.SAM" + }, + "java": { + "package": "software.amazon.awscdk.services.sam" + }, + "python": { + "module": "aws_cdk.aws_sam" + } + } + }, + "aws-cdk-lib.aws_scheduler": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.Scheduler" + }, + "java": { + "package": "software.amazon.awscdk.services.scheduler" + }, + "python": { + "module": "aws_cdk.aws_scheduler" + } + } + }, + "aws-cdk-lib.aws_sdb": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.SDB" + }, + "java": { + "package": "software.amazon.awscdk.services.sdb" + }, + "python": { + "module": "aws_cdk.aws_sdb" + } + } + }, + "aws-cdk-lib.aws_secretsmanager": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.SecretsManager" + }, + "java": { + "package": "software.amazon.awscdk.services.secretsmanager" + }, + "python": { + "module": "aws_cdk.aws_secretsmanager" + } + } + }, + "aws-cdk-lib.aws_securityhub": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.SecurityHub" + }, + "java": { + "package": "software.amazon.awscdk.services.securityhub" + }, + "python": { + "module": "aws_cdk.aws_securityhub" + } + } + }, + "aws-cdk-lib.aws_servicecatalog": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.Servicecatalog" + }, + "java": { + "package": "software.amazon.awscdk.services.servicecatalog" + }, + "python": { + "module": "aws_cdk.aws_servicecatalog" + } + } + }, + "aws-cdk-lib.aws_servicecatalogappregistry": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.Servicecatalogappregistry" + }, + "java": { + "package": "software.amazon.awscdk.services.servicecatalogappregistry" + }, + "python": { + "module": "aws_cdk.aws_servicecatalogappregistry" + } + } + }, + "aws-cdk-lib.aws_servicediscovery": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.ServiceDiscovery" + }, + "java": { + "package": "software.amazon.awscdk.services.servicediscovery" + }, + "python": { + "module": "aws_cdk.aws_servicediscovery" + } + } + }, + "aws-cdk-lib.aws_ses": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.SES" + }, + "java": { + "package": "software.amazon.awscdk.services.ses" + }, + "python": { + "module": "aws_cdk.aws_ses" + } + } + }, + "aws-cdk-lib.aws_ses_actions": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.SES.Actions" + }, + "java": { + "package": "software.amazon.awscdk.services.ses.actions" + }, + "python": { + "module": "aws_cdk.aws_ses_actions" + } + } + }, + "aws-cdk-lib.aws_shield": { + "targets": { + "dotnet": { + "package": "Amazon.CDK.AWS.Shield" + }, + "java": { + "package": "services.shield" + }, + "python": { + "module": "aws_cdk.aws_shield" + } + } + }, + "aws-cdk-lib.aws_signer": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.Signer" + }, + "java": { + "package": "software.amazon.awscdk.services.signer" + }, + "python": { + "module": "aws_cdk.aws_signer" + } + } + }, + "aws-cdk-lib.aws_simspaceweaver": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.SimSpaceWeaver" + }, + "java": { + "package": "software.amazon.awscdk.services.simspaceweaver" + }, + "python": { + "module": "aws_cdk.aws_simspaceweaver" + } + } + }, + "aws-cdk-lib.aws_sns": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.SNS" + }, + "java": { + "package": "software.amazon.awscdk.services.sns" + }, + "python": { + "module": "aws_cdk.aws_sns" + } + } + }, + "aws-cdk-lib.aws_sns_subscriptions": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.SNS.Subscriptions" + }, + "java": { + "package": "software.amazon.awscdk.services.sns.subscriptions" + }, + "python": { + "module": "aws_cdk.aws_sns_subscriptions" + } + } + }, + "aws-cdk-lib.aws_sqs": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.SQS" + }, + "java": { + "package": "software.amazon.awscdk.services.sqs" + }, + "python": { + "module": "aws_cdk.aws_sqs" + } + } + }, + "aws-cdk-lib.aws_ssm": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.SSM" + }, + "java": { + "package": "software.amazon.awscdk.services.ssm" + }, + "python": { + "module": "aws_cdk.aws_ssm" + } + } + }, + "aws-cdk-lib.aws_ssmcontacts": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.SSMContacts" + }, + "java": { + "package": "software.amazon.awscdk.services.ssmcontacts" + }, + "python": { + "module": "aws_cdk.aws_ssmcontacts" + } + } + }, + "aws-cdk-lib.aws_ssmincidents": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.SSMIncidents" + }, + "java": { + "package": "software.amazon.awscdk.services.ssmincidents" + }, + "python": { + "module": "aws_cdk.aws_ssmincidents" + } + } + }, + "aws-cdk-lib.aws_sso": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.SSO" + }, + "java": { + "package": "software.amazon.awscdk.services.sso" + }, + "python": { + "module": "aws_cdk.aws_sso" + } + } + }, + "aws-cdk-lib.aws_stepfunctions": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.StepFunctions" + }, + "java": { + "package": "software.amazon.awscdk.services.stepfunctions" + }, + "python": { + "module": "aws_cdk.aws_stepfunctions" + } + } + }, + "aws-cdk-lib.aws_stepfunctions_tasks": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.StepFunctions.Tasks" + }, + "java": { + "package": "software.amazon.awscdk.services.stepfunctions.tasks" + }, + "python": { + "module": "aws_cdk.aws_stepfunctions_tasks" + } + } + }, + "aws-cdk-lib.aws_supportapp": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.SupportApp" + }, + "java": { + "package": "software.amazon.awscdk.services.supportapp" + }, + "python": { + "module": "aws_cdk.aws_supportapp" + } + } + }, + "aws-cdk-lib.aws_synthetics": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.Synthetics" + }, + "java": { + "package": "software.amazon.awscdk.services.synthetics" + }, + "python": { + "module": "aws_cdk.aws_synthetics" + } + } + }, + "aws-cdk-lib.aws_systemsmanagersap": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.SystemsManagerSAP" + }, + "java": { + "package": "software.amazon.awscdk.services.systemsmanagersap" + }, + "python": { + "module": "aws_cdk.aws_systemsmanagersap" + } + } + }, + "aws-cdk-lib.aws_timestream": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.Timestream" + }, + "java": { + "package": "software.amazon.awscdk.services.timestream" + }, + "python": { + "module": "aws_cdk.aws_timestream" + } + } + }, + "aws-cdk-lib.aws_transfer": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.Transfer" + }, + "java": { + "package": "software.amazon.awscdk.services.transfer" + }, + "python": { + "module": "aws_cdk.aws_transfer" + } + } + }, + "aws-cdk-lib.aws_verifiedpermissions": { + "targets": { + "dotnet": { + "package": "Amazon.CDK.AWS.VerifiedPermissions" + }, + "java": { + "package": "services.verifiedpermissions" + }, + "python": { + "module": "aws_cdk.aws_verifiedpermissions" + } + } + }, + "aws-cdk-lib.aws_voiceid": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.VoiceID" + }, + "java": { + "package": "software.amazon.awscdk.services.voiceid" + }, + "python": { + "module": "aws_cdk.aws_voiceid" + } + } + }, + "aws-cdk-lib.aws_vpclattice": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.VpcLattice" + }, + "java": { + "package": "software.amazon.awscdk.services.vpclattice" + }, + "python": { + "module": "aws_cdk.aws_vpclattice" + } + } + }, + "aws-cdk-lib.aws_waf": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.WAF" + }, + "java": { + "package": "software.amazon.awscdk.services.waf" + }, + "python": { + "module": "aws_cdk.aws_waf" + } + } + }, + "aws-cdk-lib.aws_wafregional": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.WAFRegional" + }, + "java": { + "package": "software.amazon.awscdk.services.waf.regional" + }, + "python": { + "module": "aws_cdk.aws_wafregional" + } + } + }, + "aws-cdk-lib.aws_wafv2": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.WAFv2" + }, + "java": { + "package": "software.amazon.awscdk.services.wafv2" + }, + "python": { + "module": "aws_cdk.aws_wafv2" + } + } + }, + "aws-cdk-lib.aws_wisdom": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.Wisdom" + }, + "java": { + "package": "software.amazon.awscdk.services.wisdom" + }, + "python": { + "module": "aws_cdk.aws_wisdom" + } + } + }, + "aws-cdk-lib.aws_workspaces": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.WorkSpaces" + }, + "java": { + "package": "software.amazon.awscdk.services.workspaces" + }, + "python": { + "module": "aws_cdk.aws_workspaces" + } + } + }, + "aws-cdk-lib.aws_workspacesweb": { + "targets": { + "dotnet": { + "package": "Amazon.CDK.AWS.WorkSpacesWeb" + }, + "java": { + "package": "services.workspacesweb" + }, + "python": { + "module": "aws_cdk.aws_workspacesweb" + } + } + }, + "aws-cdk-lib.aws_xray": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.AWS.XRay" + }, + "java": { + "package": "software.amazon.awscdk.services.xray" + }, + "python": { + "module": "aws_cdk.aws_xray" + } + } + }, + "aws-cdk-lib.cloud_assembly_schema": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.CloudAssembly.Schema" + }, + "java": { + "package": "software.amazon.awscdk.cloudassembly.schema" + }, + "python": { + "module": "aws_cdk.cloud_assembly_schema" + } + } + }, + "aws-cdk-lib.cloudformation_include": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.CloudFormation.Include" + }, + "java": { + "package": "software.amazon.awscdk.cloudformation.include" + }, + "python": { + "module": "aws_cdk.cloudformation_include" + } + } + }, + "aws-cdk-lib.custom_resources": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.CustomResources" + }, + "java": { + "package": "software.amazon.awscdk.customresources" + }, + "python": { + "module": "aws_cdk.custom_resources" + } + } + }, + "aws-cdk-lib.cx_api": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.CXAPI" + }, + "java": { + "package": "software.amazon.awscdk.cxapi" + }, + "python": { + "module": "aws_cdk.cx_api" + } + } + }, + "aws-cdk-lib.lambda_layer_awscli": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.LambdaLayer.AwsCli" + }, + "java": { + "package": "software.amazon.awscdk.lambdalayer.awscli" + }, + "python": { + "module": "aws_cdk.lambda_layer_awscli" + } + } + }, + "aws-cdk-lib.lambda_layer_kubectl": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.LambdaLayer.Kubectl" + }, + "java": { + "package": "software.amazon.awscdk.lambdalayer.kubectl" + }, + "python": { + "module": "aws_cdk.lambda_layer_kubectl" + } + } + }, + "aws-cdk-lib.lambda_layer_node_proxy_agent": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.LambdaLayer.NodeProxyAgent" + }, + "java": { + "package": "software.amazon.awscdk.lambda.layer.node.proxy.agent" + }, + "python": { + "module": "aws_cdk.lambda_layer_node_proxy_agent" + } + } + }, + "aws-cdk-lib.pipelines": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.Pipelines" + }, + "java": { + "package": "software.amazon.awscdk.pipelines" + }, + "python": { + "module": "aws_cdk.pipelines" + } + } + }, + "aws-cdk-lib.region_info": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.RegionInfo" + }, + "java": { + "package": "software.amazon.awscdk.regioninfo" + }, + "python": { + "module": "aws_cdk.region_info" + } + } + }, + "aws-cdk-lib.triggers": { + "targets": { + "dotnet": { + "namespace": "Amazon.CDK.Triggers" + }, + "java": { + "package": "software.amazon.awscdk.triggers" + }, + "python": { + "module": "aws_cdk.triggers" + } + } + } + }, + "targets": { + "dotnet": { + "iconUrl": "https://raw.githubusercontent.com/aws/aws-cdk/main/logo/default-256-dark.png", + "namespace": "Amazon.CDK", + "packageId": "Amazon.CDK.Lib" + }, + "go": { + "moduleName": "github.com/aws/aws-cdk-go", + "packageName": "awscdk" + }, + "java": { + "maven": { + "artifactId": "aws-cdk-lib", + "groupId": "software.amazon.awscdk" + }, + "package": "software.amazon.awscdk" + }, + "js": { + "npm": "aws-cdk-lib" + }, + "python": { + "distName": "aws-cdk-lib", + "module": "aws_cdk" + } + } + }, + "constructs": { + "targets": { + "dotnet": { + "namespace": "Constructs", + "packageId": "Constructs" + }, + "go": { + "moduleName": "github.com/aws/constructs-go" + }, + "java": { + "maven": { + "artifactId": "constructs", + "groupId": "software.constructs" + }, + "package": "software.constructs" + }, + "js": { + "npm": "constructs" + }, + "python": { + "distName": "constructs", + "module": "constructs" + } + } + } + }, + "description": "This module is deprecated. All constructs are now available under aws-cdk-lib/aws-synthetics", + "docs": { + "stability": "deprecated" + }, + "homepage": "https://github.com/aws/aws-cdk", + "jsiiVersion": "5.2.9 (build 00bbc31)", + "keywords": [ + "aws", + "cdk", + "constructs", + "AWS::Synthetics", + "aws-synthetics" + ], + "license": "Apache-2.0", + "metadata": { + "jsii": { + "compiledWithDeprecationWarnings": true, + "pacmak": { + "hasDefaultInterfaces": true + }, + "rosetta": { + "strict": true + } + } + }, + "name": "@aws-cdk/aws-synthetics-alpha", + "readme": { + "markdown": "# Amazon CloudWatch Synthetics Construct Library\n\n\n---\n\n![Deprecated](https://img.shields.io/badge/deprecated-critical.svg?style=for-the-badge)\n\n> This API may emit warnings. Backward compatibility is not guaranteed.\n\n---\n\n\n\nAll constructs moved to aws-cdk-lib/aws-synthetics.\n\nAmazon CloudWatch Synthetics allow you to monitor your application by generating **synthetic** traffic. The traffic is produced by a **canary**: a configurable script that runs on a schedule. You configure the canary script to follow the same routes and perform the same actions as a user, which allows you to continually verify your user experience even when you don't have any traffic on your applications.\n\n## Canary\n\nTo illustrate how to use a canary, assume your application defines the following endpoint:\n\n```console\n% curl \"https://api.example.com/user/books/topbook/\"\nThe Hitchhikers Guide to the Galaxy\n```\n\nThe below code defines a canary that will hit the `books/topbook` endpoint every 5 minutes:\n\n```ts\nconst canary = new synthetics.Canary(this, 'MyCanary', {\n schedule: synthetics.Schedule.rate(Duration.minutes(5)),\n test: synthetics.Test.custom({\n code: synthetics.Code.fromAsset(path.join(__dirname, 'canary')),\n handler: 'index.handler',\n }),\n runtime: synthetics.Runtime.SYNTHETICS_NODEJS_PUPPETEER_4_0,\n environmentVariables: {\n stage: 'prod',\n },\n});\n```\n\nThe following is an example of an `index.js` file which exports the `handler` function:\n\n```js\nconst synthetics = require('Synthetics');\nconst log = require('SyntheticsLogger');\n\nconst pageLoadBlueprint = async function () {\n // Configure the stage of the API using environment variables\n const url = `https://api.example.com/${process.env.stage}/user/books/topbook/`;\n\n const page = await synthetics.getPage();\n const response = await page.goto(url, { waitUntil: 'domcontentloaded', timeout: 30000 });\n // Wait for page to render. Increase or decrease wait time based on endpoint being monitored.\n await page.waitFor(15000);\n // This will take a screenshot that will be included in test output artifacts.\n await synthetics.takeScreenshot('loaded', 'loaded');\n const pageTitle = await page.title();\n log.info('Page title: ' + pageTitle);\n if (response.status() !== 200) {\n throw 'Failed to load page!';\n }\n};\n\nexports.handler = async () => {\n return await pageLoadBlueprint();\n};\n```\n\n> **Note:** The function **must** be called `handler`.\n\nThe canary will automatically produce a CloudWatch Dashboard:\n\n![UI Screenshot](images/ui-screenshot.png)\n\nThe Canary code will be executed in a lambda function created by Synthetics on your behalf. The Lambda function includes a custom [runtime](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Canaries_Library.html) provided by Synthetics. The provided runtime includes a variety of handy tools such as [Puppeteer](https://www.npmjs.com/package/puppeteer-core) (for nodejs based one) and Chromium.\n\nTo learn more about Synthetics capabilities, check out the [docs](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Canaries.html).\n\n### Canary Schedule\n\nYou can specify the schedule on which a canary runs by providing a\n[`Schedule`](https://docs.aws.amazon.com/cdk/api/latest/docs/@aws-cdk_aws-synthetics.Schedule.html)\nobject to the `schedule` property.\n\nConfigure a run rate of up to 60 minutes with `Schedule.rate`:\n\n```ts\nconst schedule = synthetics.Schedule.rate(Duration.minutes(5)); // Runs every 5 minutes.\n```\n\nYou can also specify a [cron expression](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Canaries_cron.html) with `Schedule.cron`:\n\n```ts\nconst schedule = synthetics.Schedule.cron({\n hour: '0,8,16', // Run at 12am, 8am, 4pm UTC every day\n});\n```\n\nIf you want the canary to run just once upon deployment, you can use `Schedule.once()`.\n\n### Deleting underlying resources on canary deletion\n\nWhen you delete a lambda, the following underlying resources are isolated in your AWS account:\n\n - Lambda Function that runs your canary script\n - S3 Bucket for artifact storage\n - IAM roles and policies\n - Log Groups in CloudWatch Logs.\n\nTo learn more about these underlying resources, see\n[Synthetics Canaries Deletion](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/synthetics_canaries_deletion.html).\n\nIn the CDK, you can configure your canary to delete the underlying lambda function when the canary is deleted.\nThis can be provisioned by setting `cleanup: Cleanup.LAMBDA`. Note that this\nwill create a custom resource under the hood that takes care of the lambda deletion for you.\n\n```ts\nconst canary = new synthetics.Canary(this, 'Canary', {\n test: synthetics.Test.custom({\n handler: 'index.handler',\n code: synthetics.Code.fromInline('/* Synthetics handler code'),\n }),\n cleanup: synthetics.Cleanup.LAMBDA,\n runtime: synthetics.Runtime.SYNTHETICS_NODEJS_PUPPETEER_4_0,\n});\n```\n\n> Note: To properly clean up your canary on deletion, you still have to manually delete other resources\n> like S3 buckets and CloudWatch logs.\n\n### Configuring the Canary Script\n\nTo configure the script the canary executes, use the `test` property. The `test` property accepts a `Test` instance that can be initialized by the `Test` class static methods. Currently, the only implemented method is `Test.custom()`, which allows you to bring your own code. In the future, other methods will be added. `Test.custom()` accepts `code` and `handler` properties -- both are required by Synthetics to create a lambda function on your behalf.\n\nThe `synthetics.Code` class exposes static methods to bundle your code artifacts:\n\n - `code.fromInline(code)` - specify an inline script.\n - `code.fromAsset(path)` - specify a .zip file or a directory in the local filesystem which will be zipped and uploaded to S3 on deployment. See the above Note for directory structure.\n - `code.fromBucket(bucket, key[, objectVersion])` - specify an S3 object that contains the .zip file of your runtime code. See the above Note for directory structure.\n\nUsing the `Code` class static initializers:\n\n```ts\n// To supply the code inline:\nnew synthetics.Canary(this, 'Inline Canary', {\n test: synthetics.Test.custom({\n code: synthetics.Code.fromInline('/* Synthetics handler code */'),\n handler: 'index.handler', // must be 'index.handler'\n }),\n runtime: synthetics.Runtime.SYNTHETICS_NODEJS_PUPPETEER_4_0,\n});\n\n// To supply the code from your local filesystem:\nnew synthetics.Canary(this, 'Asset Canary', {\n test: synthetics.Test.custom({\n code: synthetics.Code.fromAsset(path.join(__dirname, 'canary')),\n handler: 'index.handler', // must end with '.handler'\n }),\n runtime: synthetics.Runtime.SYNTHETICS_NODEJS_PUPPETEER_4_0,\n});\n\n// To supply the code from a S3 bucket:\nimport * as s3 from 'aws-cdk-lib/aws-s3';\nconst bucket = new s3.Bucket(this, 'Code Bucket');\nnew synthetics.Canary(this, 'Bucket Canary', {\n test: synthetics.Test.custom({\n code: synthetics.Code.fromBucket(bucket, 'canary.zip'),\n handler: 'index.handler', // must end with '.handler'\n }),\n runtime: synthetics.Runtime.SYNTHETICS_NODEJS_PUPPETEER_4_0,\n});\n```\n\n> **Note:** Synthetics have a specified folder structure for canaries. For Node scripts supplied via `code.fromAsset()` or `code.fromBucket()`, the canary resource requires the following folder structure:\n>\n> ```plaintext\n> canary/\n> ├── nodejs/\n> ├── node_modules/\n> ├── .js\n> ```\n>\n>\n> For Python scripts supplied via `code.fromAsset()` or `code.fromBucket()`, the canary resource requires the following folder structure:\n>\n> ```plaintext\n> canary/\n> ├── python/\n> ├── .py\n> ```\n>\n> See Synthetics [docs](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Canaries_WritingCanary.html).\n\n### Running a canary on a VPC\n\nYou can specify what [VPC a canary executes in](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Canaries_VPC.html).\nThis can allow for monitoring services that may be internal to a specific VPC. To place a canary within a VPC, you can specify the `vpc` property with the desired `VPC` to place then canary in.\nThis will automatically attach the appropriate IAM permissions to attach to the VPC. This will also create a Security Group and attach to the default subnets for the VPC unless specified via `vpcSubnets` and `securityGroups`.\n\n```ts\nimport * as ec2 from 'aws-cdk-lib/aws-ec2';\n\ndeclare const vpc: ec2.IVpc;\nnew synthetics.Canary(this, 'Vpc Canary', {\n test: synthetics.Test.custom({\n code: synthetics.Code.fromAsset(path.join(__dirname, 'canary')),\n handler: 'index.handler',\n }),\n runtime: synthetics.Runtime.SYNTHETICS_NODEJS_PUPPETEER_4_0,\n vpc,\n});\n```\n\n> **Note:** By default, the Synthetics runtime needs access to the S3 and CloudWatch APIs, which will fail in a private subnet without internet access enabled (e.g. an isolated subnnet).\n>\n> Ensure that the Canary is placed in a VPC either with internet connectivity or with VPC Endpoints for S3 and CloudWatch enabled and configured.\n>\n> See [Synthetics VPC docs](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Canaries_VPC.html).\n\n### Alarms\n\nYou can configure a CloudWatch Alarm on a canary metric. Metrics are emitted by CloudWatch automatically and can be accessed by the following APIs:\n\n- `canary.metricSuccessPercent()` - percentage of successful canary runs over a given time\n- `canary.metricDuration()` - how much time each canary run takes, in seconds.\n- `canary.metricFailed()` - number of failed canary runs over a given time\n\nCreate an alarm that tracks the canary metric:\n\n```ts\nimport * as cloudwatch from 'aws-cdk-lib/aws-cloudwatch';\n\ndeclare const canary: synthetics.Canary;\nnew cloudwatch.Alarm(this, 'CanaryAlarm', {\n metric: canary.metricSuccessPercent(),\n evaluationPeriods: 2,\n threshold: 90,\n comparisonOperator: cloudwatch.ComparisonOperator.LESS_THAN_THRESHOLD,\n});\n```\n\n### Artifacts\n\nYou can pass an S3 bucket to store artifacts from canary runs. If you do not,\none will be auto-generated when the canary is created. You may add\n[lifecycle rules](https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-lifecycle-mgmt.html)\nto the auto-generated bucket.\n\n```ts\nconst canary = new synthetics.Canary(this, 'MyCanary', {\n schedule: synthetics.Schedule.rate(Duration.minutes(5)),\n test: synthetics.Test.custom({\n code: synthetics.Code.fromAsset(path.join(__dirname, 'canary')),\n handler: 'index.handler',\n }),\n runtime: synthetics.Runtime.SYNTHETICS_NODEJS_PUPPETEER_4_0,\n artifactsBucketLifecycleRules: [{\n expiration: Duration.days(30),\n }],\n});\n```\n" + }, + "repository": { + "directory": "packages/@aws-cdk/aws-synthetics-alpha", + "type": "git", + "url": "https://github.com/aws/aws-cdk.git" + }, + "schema": "jsii/0.10.0", + "targets": { + "dotnet": { + "iconUrl": "https://raw.githubusercontent.com/aws/aws-cdk/main/logo/default-256-dark.png", + "namespace": "Amazon.CDK.AWS.Synthetics.Alpha", + "packageId": "Amazon.CDK.AWS.Synthetics.Alpha" + }, + "go": { + "moduleName": "github.com/aws/aws-cdk-go", + "packageName": "awscdksyntheticsalpha" + }, + "java": { + "maven": { + "artifactId": "synthetics-alpha", + "groupId": "software.amazon.awscdk" + }, + "package": "software.amazon.awscdk.services.synthetics.alpha" + }, + "js": { + "npm": "@aws-cdk/aws-synthetics-alpha" + }, + "python": { + "classifiers": [ + "Framework :: AWS CDK", + "Framework :: AWS CDK :: 2" + ], + "distName": "aws-cdk.aws-synthetics-alpha", + "module": "aws_cdk.aws_synthetics_alpha" + } + }, + "types": { + "@aws-cdk/aws-synthetics-alpha.ArtifactsBucketLocation": { + "assembly": "@aws-cdk/aws-synthetics-alpha", + "datatype": true, + "docs": { + "remarks": "The artifacts bucket location **cannot**\nbe updated once the canary is created.", + "stability": "deprecated", + "summary": "Options for specifying the s3 location that stores the data of each canary run." + }, + "fqn": "@aws-cdk/aws-synthetics-alpha.ArtifactsBucketLocation", + "kind": "interface", + "locationInModule": { + "filename": "lib/canary.ts", + "line": 81 + }, + "name": "ArtifactsBucketLocation", + "properties": [ + { + "abstract": true, + "docs": { + "stability": "deprecated", + "summary": "The s3 location that stores the data of each run." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/canary.ts", + "line": 85 + }, + "name": "bucket", + "type": { + "fqn": "aws-cdk-lib.aws_s3.IBucket" + } + }, + { + "abstract": true, + "docs": { + "default": "- no prefix", + "remarks": "Specify this if you want a more specific path within the artifacts bucket.", + "stability": "deprecated", + "summary": "The S3 bucket prefix." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/canary.ts", + "line": 92 + }, + "name": "prefix", + "optional": true, + "type": { + "primitive": "string" + } + } + ], + "symbolId": "lib/canary:ArtifactsBucketLocation" + }, + "@aws-cdk/aws-synthetics-alpha.AssetCode": { + "assembly": "@aws-cdk/aws-synthetics-alpha", + "base": "@aws-cdk/aws-synthetics-alpha.Code", + "docs": { + "stability": "deprecated", + "summary": "Canary code from an Asset." + }, + "fqn": "@aws-cdk/aws-synthetics-alpha.AssetCode", + "initializer": { + "docs": { + "stability": "deprecated" + }, + "locationInModule": { + "filename": "lib/code.ts", + "line": 92 + }, + "parameters": [ + { + "docs": { + "summary": "The path to the asset file or directory." + }, + "name": "assetPath", + "type": { + "primitive": "string" + } + }, + { + "name": "options", + "optional": true, + "type": { + "fqn": "aws-cdk-lib.aws_s3_assets.AssetOptions" + } + } + ] + }, + "kind": "class", + "locationInModule": { + "filename": "lib/code.ts", + "line": 86 + }, + "methods": [ + { + "docs": { + "stability": "deprecated", + "summary": "Called when the canary is initialized to allow this object to bind to the stack, add resources and have fun." + }, + "locationInModule": { + "filename": "lib/code.ts", + "line": 100 + }, + "name": "bind", + "overrides": "@aws-cdk/aws-synthetics-alpha.Code", + "parameters": [ + { + "name": "scope", + "type": { + "fqn": "constructs.Construct" + } + }, + { + "name": "handler", + "type": { + "primitive": "string" + } + }, + { + "name": "family", + "type": { + "fqn": "@aws-cdk/aws-synthetics-alpha.RuntimeFamily" + } + } + ], + "returns": { + "type": { + "fqn": "@aws-cdk/aws-synthetics-alpha.CodeConfig" + } + } + } + ], + "name": "AssetCode", + "symbolId": "lib/code:AssetCode" + }, + "@aws-cdk/aws-synthetics-alpha.Canary": { + "assembly": "@aws-cdk/aws-synthetics-alpha", + "base": "aws-cdk-lib.Resource", + "docs": { + "stability": "deprecated", + "summary": "Define a new Canary." + }, + "fqn": "@aws-cdk/aws-synthetics-alpha.Canary", + "initializer": { + "docs": { + "stability": "deprecated" + }, + "locationInModule": { + "filename": "lib/canary.ts", + "line": 286 + }, + "parameters": [ + { + "name": "scope", + "type": { + "fqn": "constructs.Construct" + } + }, + { + "name": "id", + "type": { + "primitive": "string" + } + }, + { + "name": "props", + "type": { + "fqn": "@aws-cdk/aws-synthetics-alpha.CanaryProps" + } + } + ] + }, + "interfaces": [ + "aws-cdk-lib.aws_ec2.IConnectable" + ], + "kind": "class", + "locationInModule": { + "filename": "lib/canary.ts", + "line": 248 + }, + "methods": [ + { + "docs": { + "default": "avg over 5 minutes", + "stability": "deprecated", + "summary": "Measure the Duration of a single canary run, in seconds." + }, + "locationInModule": { + "filename": "lib/canary.ts", + "line": 387 + }, + "name": "metricDuration", + "parameters": [ + { + "docs": { + "summary": "- configuration options for the metric." + }, + "name": "options", + "optional": true, + "type": { + "fqn": "aws-cdk-lib.aws_cloudwatch.MetricOptions" + } + } + ], + "returns": { + "type": { + "fqn": "aws-cdk-lib.aws_cloudwatch.Metric" + } + } + }, + { + "docs": { + "remarks": "Default: sum over 5 minutes", + "stability": "deprecated", + "summary": "Measure the number of failed canary runs over a given time period." + }, + "locationInModule": { + "filename": "lib/canary.ts", + "line": 413 + }, + "name": "metricFailed", + "parameters": [ + { + "docs": { + "summary": "- configuration options for the metric." + }, + "name": "options", + "optional": true, + "type": { + "fqn": "aws-cdk-lib.aws_cloudwatch.MetricOptions" + } + } + ], + "returns": { + "type": { + "fqn": "aws-cdk-lib.aws_cloudwatch.Metric" + } + } + }, + { + "docs": { + "default": "avg over 5 minutes", + "stability": "deprecated", + "summary": "Measure the percentage of successful canary runs." + }, + "locationInModule": { + "filename": "lib/canary.ts", + "line": 402 + }, + "name": "metricSuccessPercent", + "parameters": [ + { + "docs": { + "summary": "- configuration options for the metric." + }, + "name": "options", + "optional": true, + "type": { + "fqn": "aws-cdk-lib.aws_cloudwatch.MetricOptions" + } + } + ], + "returns": { + "type": { + "fqn": "aws-cdk-lib.aws_cloudwatch.Metric" + } + } + } + ], + "name": "Canary", + "properties": [ + { + "docs": { + "stability": "deprecated", + "summary": "Bucket where data from each canary run is stored." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/canary.ts", + "line": 275 + }, + "name": "artifactsBucket", + "type": { + "fqn": "aws-cdk-lib.aws_s3.IBucket" + } + }, + { + "docs": { + "custom": { + "attribute": "true" + }, + "stability": "deprecated", + "summary": "The canary ID." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/canary.ts", + "line": 258 + }, + "name": "canaryId", + "type": { + "primitive": "string" + } + }, + { + "docs": { + "custom": { + "attribute": "true" + }, + "stability": "deprecated", + "summary": "The canary Name." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/canary.ts", + "line": 270 + }, + "name": "canaryName", + "type": { + "primitive": "string" + } + }, + { + "docs": { + "custom": { + "attribute": "true" + }, + "remarks": "For example, 'RUNNING', 'STOPPED', 'NOT STARTED', or 'ERROR'.", + "stability": "deprecated", + "summary": "The state of the canary." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/canary.ts", + "line": 264 + }, + "name": "canaryState", + "type": { + "primitive": "string" + } + }, + { + "docs": { + "remarks": "Will fail if not a VPC-enabled Canary", + "stability": "deprecated", + "summary": "Access the Connections object." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/canary.ts", + "line": 372 + }, + "name": "connections", + "overrides": "aws-cdk-lib.aws_ec2.IConnectable", + "type": { + "fqn": "aws-cdk-lib.aws_ec2.Connections" + } + }, + { + "docs": { + "stability": "deprecated", + "summary": "Execution role associated with this Canary." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/canary.ts", + "line": 252 + }, + "name": "role", + "type": { + "fqn": "aws-cdk-lib.aws_iam.IRole" + } + } + ], + "symbolId": "lib/canary:Canary" + }, + "@aws-cdk/aws-synthetics-alpha.CanaryProps": { + "assembly": "@aws-cdk/aws-synthetics-alpha", + "datatype": true, + "docs": { + "stability": "deprecated", + "summary": "Properties for a canary." + }, + "fqn": "@aws-cdk/aws-synthetics-alpha.CanaryProps", + "kind": "interface", + "locationInModule": { + "filename": "lib/canary.ts", + "line": 98 + }, + "name": "CanaryProps", + "properties": [ + { + "abstract": true, + "docs": { + "see": "https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Canaries_Library.html", + "stability": "deprecated", + "summary": "Specify the runtime version to use for the canary." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/canary.ts", + "line": 176 + }, + "name": "runtime", + "type": { + "fqn": "@aws-cdk/aws-synthetics-alpha.Runtime" + } + }, + { + "abstract": true, + "docs": { + "remarks": "Use `Test.custom()` to specify the test to run.", + "stability": "deprecated", + "summary": "The type of test that you want your canary to run." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/canary.ts", + "line": 181 + }, + "name": "test", + "type": { + "fqn": "@aws-cdk/aws-synthetics-alpha.Test" + } + }, + { + "abstract": true, + "docs": { + "default": "- no rules applied to the generated bucket.", + "remarks": "Has no effect\nif a bucket is passed to `artifactsBucketLocation`. If you pass a bucket\nto `artifactsBucketLocation`, you can add lifecycle rules to the bucket\nitself.", + "stability": "deprecated", + "summary": "Lifecycle rules for the generated canary artifact bucket." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/canary.ts", + "line": 242 + }, + "name": "artifactsBucketLifecycleRules", + "optional": true, + "type": { + "collection": { + "elementtype": { + "fqn": "aws-cdk-lib.aws_s3.LifecycleRule" + }, + "kind": "array" + } + } + }, + { + "abstract": true, + "docs": { + "default": "- A new s3 bucket will be created without a prefix.", + "stability": "deprecated", + "summary": "The s3 location that stores the data of the canary runs." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/canary.ts", + "line": 104 + }, + "name": "artifactsBucketLocation", + "optional": true, + "type": { + "fqn": "@aws-cdk/aws-synthetics-alpha.ArtifactsBucketLocation" + } + }, + { + "abstract": true, + "docs": { + "default": "- A unique name will be generated from the construct ID", + "remarks": "Be sure to give it a descriptive name that distinguishes it from\nother canaries in your account.\n\nDo not include secrets or proprietary information in your canary name. The canary name\nmakes up part of the canary ARN, which is included in outbound calls over the internet.", + "see": "https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/servicelens_canaries_security.html", + "stability": "deprecated", + "summary": "The name of the canary." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/canary.ts", + "line": 169 + }, + "name": "canaryName", + "optional": true, + "type": { + "primitive": "string" + } + }, + { + "abstract": true, + "docs": { + "default": "Cleanup.NOTHING", + "remarks": "Using `Cleanup.LAMBDA` will create a Custom Resource to achieve this.", + "stability": "deprecated", + "summary": "Specify the underlying resources to be cleaned up when the canary is deleted." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/canary.ts", + "line": 232 + }, + "name": "cleanup", + "optional": true, + "type": { + "fqn": "@aws-cdk/aws-synthetics-alpha.Cleanup" + } + }, + { + "abstract": true, + "docs": { + "default": "false", + "deprecated": "this feature has been deprecated by the service team, use `cleanup: Cleanup.LAMBDA` instead which will use a Custom Resource to achieve the same effect.", + "see": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-synthetics-canary.html#cfn-synthetics-canary-deletelambdaresourcesoncanarydeletion", + "stability": "deprecated", + "summary": "Whether or not to delete the lambda resources when the canary is deleted." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/canary.ts", + "line": 224 + }, + "name": "enableAutoDeleteLambdas", + "optional": true, + "type": { + "primitive": "boolean" + } + }, + { + "abstract": true, + "docs": { + "default": "- No environment variables.", + "remarks": "Use environment variables\nto apply configuration changes, such as test and production environment configurations, without changing your\nCanary script source code.", + "stability": "deprecated", + "summary": "Key-value pairs that the Synthetics caches and makes available for your canary scripts." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/canary.ts", + "line": 190 + }, + "name": "environmentVariables", + "optional": true, + "type": { + "collection": { + "elementtype": { + "primitive": "string" + }, + "kind": "map" + } + } + }, + { + "abstract": true, + "docs": { + "default": "Duration.days(31)", + "stability": "deprecated", + "summary": "How many days should failed runs be retained." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/canary.ts", + "line": 157 + }, + "name": "failureRetentionPeriod", + "optional": true, + "type": { + "fqn": "aws-cdk-lib.Duration" + } + }, + { + "abstract": true, + "docs": { + "default": "- A unique role will be generated for this canary.\nYou can add permissions to roles by calling 'addToRolePolicy'.", + "remarks": "This is the role that will be assumed by the canary upon execution.\nIt controls the permissions that the canary will have. The role must\nbe assumable by the AWS Lambda service principal.\n\nIf not supplied, a role will be created with all the required permissions.\nIf you provide a Role, you must add the required permissions.", + "see": "required permissions: https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-synthetics-canary.html#cfn-synthetics-canary-executionrolearn", + "stability": "deprecated", + "summary": "Canary execution role." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/canary.ts", + "line": 121 + }, + "name": "role", + "optional": true, + "type": { + "fqn": "aws-cdk-lib.aws_iam.IRole" + } + }, + { + "abstract": true, + "docs": { + "default": "'rate(5 minutes)'", + "remarks": "For example, if you set `schedule` to `rate(10 minutes)`, then the canary will run every 10 minutes.\nYou can set the schedule with `Schedule.rate(Duration)` (recommended) or you can specify an expression using `Schedule.expression()`.", + "stability": "deprecated", + "summary": "Specify the schedule for how often the canary runs." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/canary.ts", + "line": 136 + }, + "name": "schedule", + "optional": true, + "type": { + "fqn": "@aws-cdk/aws-synthetics-alpha.Schedule" + } + }, + { + "abstract": true, + "docs": { + "default": "- If the canary is placed within a VPC and a security group is\nnot specified a dedicated security group will be created for this canary.", + "remarks": "You must provide `vpc` when using this prop.", + "stability": "deprecated", + "summary": "The list of security groups to associate with the canary's network interfaces." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/canary.ts", + "line": 214 + }, + "name": "securityGroups", + "optional": true, + "type": { + "collection": { + "elementtype": { + "fqn": "aws-cdk-lib.aws_ec2.ISecurityGroup" + }, + "kind": "array" + } + } + }, + { + "abstract": true, + "docs": { + "default": "true", + "stability": "deprecated", + "summary": "Whether or not the canary should start after creation." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/canary.ts", + "line": 143 + }, + "name": "startAfterCreation", + "optional": true, + "type": { + "primitive": "boolean" + } + }, + { + "abstract": true, + "docs": { + "default": "Duration.days(31)", + "stability": "deprecated", + "summary": "How many days should successful runs be retained." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/canary.ts", + "line": 150 + }, + "name": "successRetentionPeriod", + "optional": true, + "type": { + "fqn": "aws-cdk-lib.Duration" + } + }, + { + "abstract": true, + "docs": { + "default": "- no limit", + "remarks": "For example, if you set `timeToLive` to be 1 hour and `schedule` to be `rate(10 minutes)`,\nyour canary will run at 10 minute intervals for an hour, for a total of 6 times.", + "stability": "deprecated", + "summary": "How long the canary will be in a 'RUNNING' state." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/canary.ts", + "line": 129 + }, + "name": "timeToLive", + "optional": true, + "type": { + "fqn": "aws-cdk-lib.Duration" + } + }, + { + "abstract": true, + "docs": { + "default": "- Not in VPC", + "remarks": "Specify this if the canary needs to access resources in a VPC.", + "stability": "deprecated", + "summary": "The VPC where this canary is run." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/canary.ts", + "line": 199 + }, + "name": "vpc", + "optional": true, + "type": { + "fqn": "aws-cdk-lib.aws_ec2.IVpc" + } + }, + { + "abstract": true, + "docs": { + "default": "- the Vpc default strategy if not specified", + "remarks": "You must provide `vpc` when using this prop.", + "stability": "deprecated", + "summary": "Where to place the network interfaces within the VPC." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/canary.ts", + "line": 206 + }, + "name": "vpcSubnets", + "optional": true, + "type": { + "fqn": "aws-cdk-lib.aws_ec2.SubnetSelection" + } + } + ], + "symbolId": "lib/canary:CanaryProps" + }, + "@aws-cdk/aws-synthetics-alpha.Cleanup": { + "assembly": "@aws-cdk/aws-synthetics-alpha", + "docs": { + "stability": "deprecated", + "summary": "Different ways to clean up underlying Canary resources when the Canary is deleted." + }, + "fqn": "@aws-cdk/aws-synthetics-alpha.Cleanup", + "kind": "enum", + "locationInModule": { + "filename": "lib/canary.ts", + "line": 62 + }, + "members": [ + { + "docs": { + "remarks": "The user is responsible for cleaning up\nall resources left behind by the Canary.", + "stability": "deprecated", + "summary": "Clean up nothing." + }, + "name": "NOTHING" + }, + { + "docs": { + "remarks": "The user is\nresponsible for cleaning up all other resources left behind\nby the Canary.", + "stability": "deprecated", + "summary": "Clean up the underlying Lambda function only." + }, + "name": "LAMBDA" + } + ], + "name": "Cleanup", + "symbolId": "lib/canary:Cleanup" + }, + "@aws-cdk/aws-synthetics-alpha.Code": { + "abstract": true, + "assembly": "@aws-cdk/aws-synthetics-alpha", + "docs": { + "stability": "deprecated", + "summary": "The code the canary should execute." + }, + "fqn": "@aws-cdk/aws-synthetics-alpha.Code", + "initializer": { + "docs": { + "stability": "deprecated" + } + }, + "kind": "class", + "locationInModule": { + "filename": "lib/code.ts", + "line": 12 + }, + "methods": [ + { + "docs": { + "remarks": "Path must include the folder structure `nodejs/node_modules/myCanaryFilename.js`.", + "returns": "`AssetCode` associated with the specified path.", + "see": "https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Canaries_WritingCanary.html#CloudWatch_Synthetics_Canaries_write_from_scratch", + "stability": "deprecated", + "summary": "Specify code from a local path." + }, + "locationInModule": { + "filename": "lib/code.ts", + "line": 33 + }, + "name": "fromAsset", + "parameters": [ + { + "docs": { + "summary": "Either a directory or a .zip file." + }, + "name": "assetPath", + "type": { + "primitive": "string" + } + }, + { + "name": "options", + "optional": true, + "type": { + "fqn": "aws-cdk-lib.aws_s3_assets.AssetOptions" + } + } + ], + "returns": { + "type": { + "fqn": "@aws-cdk/aws-synthetics-alpha.AssetCode" + } + }, + "static": true + }, + { + "docs": { + "remarks": "The object in the s3 bucket must be a .zip file that contains\nthe structure `nodejs/node_modules/myCanaryFilename.js`.", + "returns": "`S3Code` associated with the specified S3 object.", + "see": "https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Canaries_WritingCanary.html#CloudWatch_Synthetics_Canaries_write_from_scratch", + "stability": "deprecated", + "summary": "Specify code from an s3 bucket." + }, + "locationInModule": { + "filename": "lib/code.ts", + "line": 48 + }, + "name": "fromBucket", + "parameters": [ + { + "docs": { + "summary": "The S3 bucket." + }, + "name": "bucket", + "type": { + "fqn": "aws-cdk-lib.aws_s3.IBucket" + } + }, + { + "docs": { + "summary": "The object key." + }, + "name": "key", + "type": { + "primitive": "string" + } + }, + { + "docs": { + "summary": "Optional S3 object version." + }, + "name": "objectVersion", + "optional": true, + "type": { + "primitive": "string" + } + } + ], + "returns": { + "type": { + "fqn": "@aws-cdk/aws-synthetics-alpha.S3Code" + } + }, + "static": true + }, + { + "docs": { + "returns": "`InlineCode` with inline code.", + "stability": "deprecated", + "summary": "Specify code inline." + }, + "locationInModule": { + "filename": "lib/code.ts", + "line": 21 + }, + "name": "fromInline", + "parameters": [ + { + "docs": { + "summary": "The actual handler code (limited to 5MB)." + }, + "name": "code", + "type": { + "primitive": "string" + } + } + ], + "returns": { + "type": { + "fqn": "@aws-cdk/aws-synthetics-alpha.InlineCode" + } + }, + "static": true + }, + { + "abstract": true, + "docs": { + "returns": "a bound `CodeConfig`.", + "stability": "deprecated", + "summary": "Called when the canary is initialized to allow this object to bind to the stack, add resources and have fun." + }, + "locationInModule": { + "filename": "lib/code.ts", + "line": 61 + }, + "name": "bind", + "parameters": [ + { + "docs": { + "remarks": "Don't be smart about trying to down-cast or\nassume it's initialized. You may just use it as a construct scope.", + "summary": "The binding scope." + }, + "name": "scope", + "type": { + "fqn": "constructs.Construct" + } + }, + { + "name": "handler", + "type": { + "primitive": "string" + } + }, + { + "name": "family", + "type": { + "fqn": "@aws-cdk/aws-synthetics-alpha.RuntimeFamily" + } + } + ], + "returns": { + "type": { + "fqn": "@aws-cdk/aws-synthetics-alpha.CodeConfig" + } + } + } + ], + "name": "Code", + "symbolId": "lib/code:Code" + }, + "@aws-cdk/aws-synthetics-alpha.CodeConfig": { + "assembly": "@aws-cdk/aws-synthetics-alpha", + "datatype": true, + "docs": { + "stability": "deprecated", + "summary": "Configuration of the code class." + }, + "fqn": "@aws-cdk/aws-synthetics-alpha.CodeConfig", + "kind": "interface", + "locationInModule": { + "filename": "lib/code.ts", + "line": 67 + }, + "name": "CodeConfig", + "properties": [ + { + "abstract": true, + "docs": { + "default": "- none", + "stability": "deprecated", + "summary": "Inline code (mutually exclusive with `s3Location`)." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/code.ts", + "line": 80 + }, + "name": "inlineCode", + "optional": true, + "type": { + "primitive": "string" + } + }, + { + "abstract": true, + "docs": { + "default": "- none", + "stability": "deprecated", + "summary": "The location of the code in S3 (mutually exclusive with `inlineCode`)." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/code.ts", + "line": 73 + }, + "name": "s3Location", + "optional": true, + "type": { + "fqn": "aws-cdk-lib.aws_s3.Location" + } + } + ], + "symbolId": "lib/code:CodeConfig" + }, + "@aws-cdk/aws-synthetics-alpha.CronOptions": { + "assembly": "@aws-cdk/aws-synthetics-alpha", + "datatype": true, + "docs": { + "remarks": "All fields are strings so you can use complex expressions. Absence of\na field implies '*' or '?', whichever one is appropriate.", + "see": "https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Canaries_cron.html", + "stability": "deprecated", + "summary": "Options to configure a cron expression." + }, + "fqn": "@aws-cdk/aws-synthetics-alpha.CronOptions", + "kind": "interface", + "locationInModule": { + "filename": "lib/schedule.ts", + "line": 82 + }, + "name": "CronOptions", + "properties": [ + { + "abstract": true, + "docs": { + "default": "- Every day of the month", + "stability": "deprecated", + "summary": "The day of the month to run this rule at." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/schedule.ts", + "line": 102 + }, + "name": "day", + "optional": true, + "type": { + "primitive": "string" + } + }, + { + "abstract": true, + "docs": { + "default": "- Every hour", + "stability": "deprecated", + "summary": "The hour to run this rule at." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/schedule.ts", + "line": 95 + }, + "name": "hour", + "optional": true, + "type": { + "primitive": "string" + } + }, + { + "abstract": true, + "docs": { + "default": "- Every minute", + "stability": "deprecated", + "summary": "The minute to run this rule at." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/schedule.ts", + "line": 88 + }, + "name": "minute", + "optional": true, + "type": { + "primitive": "string" + } + }, + { + "abstract": true, + "docs": { + "default": "- Every month", + "stability": "deprecated", + "summary": "The month to run this rule at." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/schedule.ts", + "line": 109 + }, + "name": "month", + "optional": true, + "type": { + "primitive": "string" + } + }, + { + "abstract": true, + "docs": { + "default": "- Any day of the week", + "stability": "deprecated", + "summary": "The day of the week to run this rule at." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/schedule.ts", + "line": 116 + }, + "name": "weekDay", + "optional": true, + "type": { + "primitive": "string" + } + } + ], + "symbolId": "lib/schedule:CronOptions" + }, + "@aws-cdk/aws-synthetics-alpha.CustomTestOptions": { + "assembly": "@aws-cdk/aws-synthetics-alpha", + "datatype": true, + "docs": { + "stability": "deprecated", + "summary": "Properties for specifying a test." + }, + "fqn": "@aws-cdk/aws-synthetics-alpha.CustomTestOptions", + "kind": "interface", + "locationInModule": { + "filename": "lib/canary.ts", + "line": 46 + }, + "name": "CustomTestOptions", + "properties": [ + { + "abstract": true, + "docs": { + "stability": "deprecated", + "summary": "The code of the canary script." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/canary.ts", + "line": 50 + }, + "name": "code", + "type": { + "fqn": "@aws-cdk/aws-synthetics-alpha.Code" + } + }, + { + "abstract": true, + "docs": { + "remarks": "Must end with `.handler`.", + "stability": "deprecated", + "summary": "The handler for the code." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/canary.ts", + "line": 55 + }, + "name": "handler", + "type": { + "primitive": "string" + } + } + ], + "symbolId": "lib/canary:CustomTestOptions" + }, + "@aws-cdk/aws-synthetics-alpha.InlineCode": { + "assembly": "@aws-cdk/aws-synthetics-alpha", + "base": "@aws-cdk/aws-synthetics-alpha.Code", + "docs": { + "stability": "deprecated", + "summary": "Canary code from an inline string." + }, + "fqn": "@aws-cdk/aws-synthetics-alpha.InlineCode", + "initializer": { + "docs": { + "stability": "deprecated" + }, + "locationInModule": { + "filename": "lib/code.ts", + "line": 160 + }, + "parameters": [ + { + "name": "code", + "type": { + "primitive": "string" + } + } + ] + }, + "kind": "class", + "locationInModule": { + "filename": "lib/code.ts", + "line": 159 + }, + "methods": [ + { + "docs": { + "stability": "deprecated", + "summary": "Called when the canary is initialized to allow this object to bind to the stack, add resources and have fun." + }, + "locationInModule": { + "filename": "lib/code.ts", + "line": 168 + }, + "name": "bind", + "overrides": "@aws-cdk/aws-synthetics-alpha.Code", + "parameters": [ + { + "name": "_scope", + "type": { + "fqn": "constructs.Construct" + } + }, + { + "name": "handler", + "type": { + "primitive": "string" + } + }, + { + "name": "_family", + "type": { + "fqn": "@aws-cdk/aws-synthetics-alpha.RuntimeFamily" + } + } + ], + "returns": { + "type": { + "fqn": "@aws-cdk/aws-synthetics-alpha.CodeConfig" + } + } + } + ], + "name": "InlineCode", + "symbolId": "lib/code:InlineCode" + }, + "@aws-cdk/aws-synthetics-alpha.Runtime": { + "assembly": "@aws-cdk/aws-synthetics-alpha", + "docs": { + "stability": "deprecated", + "summary": "Runtime options for a canary." + }, + "fqn": "@aws-cdk/aws-synthetics-alpha.Runtime", + "initializer": { + "docs": { + "stability": "deprecated" + }, + "locationInModule": { + "filename": "lib/runtime.ts", + "line": 301 + }, + "parameters": [ + { + "docs": { + "summary": "The name of the runtime version." + }, + "name": "name", + "type": { + "primitive": "string" + } + }, + { + "docs": { + "summary": "The Lambda runtime family." + }, + "name": "family", + "type": { + "fqn": "@aws-cdk/aws-synthetics-alpha.RuntimeFamily" + } + } + ] + }, + "kind": "class", + "locationInModule": { + "filename": "lib/runtime.ts", + "line": 24 + }, + "name": "Runtime", + "properties": [ + { + "const": true, + "docs": { + "deprecated": "Use the latest version instead", + "remarks": "`syn-1.0` includes the following:\n\n- Synthetics library 1.0\n- Synthetics handler code 1.0\n- Lambda runtime Node.js 10.x\n- Puppeteer-core version 1.14.0\n- The Chromium version that matches Puppeteer-core 1.14.0", + "see": "https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Library_nodejs_puppeteer.html#CloudWatch_Synthetics_runtimeversion-1.0", + "stability": "deprecated", + "summary": "**Deprecated by AWS Synthetics. You can't create canaries with deprecated runtimes.**." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/runtime.ts", + "line": 39 + }, + "name": "SYNTHETICS_1_0", + "static": true, + "type": { + "fqn": "@aws-cdk/aws-synthetics-alpha.Runtime" + } + }, + { + "const": true, + "docs": { + "deprecated": "Use the latest version instead", + "remarks": "`syn-nodejs-2.0` includes the following:\n- Lambda runtime Node.js 10.x\n- Puppeteer-core version 3.3.0\n- Chromium version 83.0.4103.0", + "see": "https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Library_nodejs_puppeteer.html#CloudWatch_Synthetics_runtimeversion-2.0", + "stability": "deprecated", + "summary": "**Deprecated by AWS Synthetics. You can't create canaries with deprecated runtimes.**." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/runtime.ts", + "line": 52 + }, + "name": "SYNTHETICS_NODEJS_2_0", + "static": true, + "type": { + "fqn": "@aws-cdk/aws-synthetics-alpha.Runtime" + } + }, + { + "const": true, + "docs": { + "deprecated": "Use the latest version instead", + "remarks": "`syn-nodejs-2.1` includes the following:\n- Lambda runtime Node.js 10.x\n- Puppeteer-core version 3.3.0\n- Chromium version 83.0.4103.0", + "see": "https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Library_nodejs_puppeteer.html#CloudWatch_Synthetics_runtimeversion-2.1", + "stability": "deprecated", + "summary": "**Deprecated by AWS Synthetics. You can't create canaries with deprecated runtimes.**." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/runtime.ts", + "line": 65 + }, + "name": "SYNTHETICS_NODEJS_2_1", + "static": true, + "type": { + "fqn": "@aws-cdk/aws-synthetics-alpha.Runtime" + } + }, + { + "const": true, + "docs": { + "deprecated": "Use the latest version instead", + "remarks": "`syn-nodejs-2.2` includes the following:\n- Lambda runtime Node.js 10.x\n- Puppeteer-core version 3.3.0\n- Chromium version 83.0.4103.0", + "see": "https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Library_nodejs_puppeteer.html#CloudWatch_Synthetics_runtimeversion-2.2", + "stability": "deprecated", + "summary": "**Deprecated by AWS Synthetics. You can't create canaries with deprecated runtimes.**." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/runtime.ts", + "line": 78 + }, + "name": "SYNTHETICS_NODEJS_2_2", + "static": true, + "type": { + "fqn": "@aws-cdk/aws-synthetics-alpha.Runtime" + } + }, + { + "const": true, + "docs": { + "deprecated": "Use the latest version instead", + "remarks": "`syn-nodejs-puppeteer-3.0` includes the following:\n- Lambda runtime Node.js 12.x\n- Puppeteer-core version 5.5.0\n- Chromium version 88.0.4298.0", + "see": "https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Library_nodejs_puppeteer.html#CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-3.0", + "stability": "deprecated", + "summary": "**Deprecated by AWS Synthetics. You can't create canaries with deprecated runtimes.**." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/runtime.ts", + "line": 91 + }, + "name": "SYNTHETICS_NODEJS_PUPPETEER_3_0", + "static": true, + "type": { + "fqn": "@aws-cdk/aws-synthetics-alpha.Runtime" + } + }, + { + "const": true, + "docs": { + "deprecated": "Use the latest version instead", + "remarks": "`syn-nodejs-puppeteer-3.1` includes the following:\n- Lambda runtime Node.js 12.x\n- Puppeteer-core version 5.5.0\n- Chromium version 88.0.4298.0", + "see": "https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Library_nodejs_puppeteer.html#CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-3.1", + "stability": "deprecated", + "summary": "**Deprecated by AWS Synthetics. You can't create canaries with deprecated runtimes.**." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/runtime.ts", + "line": 104 + }, + "name": "SYNTHETICS_NODEJS_PUPPETEER_3_1", + "static": true, + "type": { + "fqn": "@aws-cdk/aws-synthetics-alpha.Runtime" + } + }, + { + "const": true, + "docs": { + "deprecated": "Use the latest version instead", + "remarks": "`syn-nodejs-puppeteer-3.2` includes the following:\n- Lambda runtime Node.js 12.x\n- Puppeteer-core version 5.5.0\n- Chromium version 88.0.4298.0", + "see": "https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Library_nodejs_puppeteer.html#CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-3.2", + "stability": "deprecated", + "summary": "**Deprecated by AWS Synthetics. You can't create canaries with deprecated runtimes.**." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/runtime.ts", + "line": 117 + }, + "name": "SYNTHETICS_NODEJS_PUPPETEER_3_2", + "static": true, + "type": { + "fqn": "@aws-cdk/aws-synthetics-alpha.Runtime" + } + }, + { + "const": true, + "docs": { + "deprecated": "Use the latest version instead", + "remarks": "- Lambda runtime Node.js 12.x\n- Puppeteer-core version 5.5.0\n- Chromium version 88.0.4298.0", + "see": "https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Library_nodejs_puppeteer.html#CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-3.3", + "stability": "deprecated", + "summary": "`syn-nodejs-puppeteer-3.3` includes the following: **Deprecated by AWS Synthetics. You can't create canaries with deprecated runtimes.**." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/runtime.ts", + "line": 130 + }, + "name": "SYNTHETICS_NODEJS_PUPPETEER_3_3", + "static": true, + "type": { + "fqn": "@aws-cdk/aws-synthetics-alpha.Runtime" + } + }, + { + "const": true, + "docs": { + "deprecated": "Use the latest version instead", + "remarks": "`syn-nodejs-puppeteer-3.4` includes the following:\n- Lambda runtime Node.js 12.x\n- Puppeteer-core version 5.5.0\n- Chromium version 88.0.4298.0", + "see": "https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Library_nodejs_puppeteer.html#CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-3.4", + "stability": "deprecated", + "summary": "**Deprecated by AWS Synthetics. You can't create canaries with deprecated runtimes.**." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/runtime.ts", + "line": 143 + }, + "name": "SYNTHETICS_NODEJS_PUPPETEER_3_4", + "static": true, + "type": { + "fqn": "@aws-cdk/aws-synthetics-alpha.Runtime" + } + }, + { + "const": true, + "docs": { + "see": "https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Library_nodejs_puppeteer.html#CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-3.5", + "stability": "deprecated", + "summary": "`syn-nodejs-puppeteer-3.5` includes the following: - Lambda runtime Node.js 14.x - Puppeteer-core version 10.1.0 - Chromium version 92.0.4512." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/runtime.ts", + "line": 153 + }, + "name": "SYNTHETICS_NODEJS_PUPPETEER_3_5", + "static": true, + "type": { + "fqn": "@aws-cdk/aws-synthetics-alpha.Runtime" + } + }, + { + "const": true, + "docs": { + "see": "https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Library_nodejs_puppeteer.html#CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-3.6", + "stability": "deprecated", + "summary": "`syn-nodejs-puppeteer-3.6` includes the following: - Lambda runtime Node.js 14.x - Puppeteer-core version 10.1.0 - Chromium version 92.0.4512." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/runtime.ts", + "line": 163 + }, + "name": "SYNTHETICS_NODEJS_PUPPETEER_3_6", + "static": true, + "type": { + "fqn": "@aws-cdk/aws-synthetics-alpha.Runtime" + } + }, + { + "const": true, + "docs": { + "remarks": "New Features:\n- **Logging enhancement**: The canary will upload logs to Amazon S3 even if it times out or crashes.\n- **Lambda layer size reduced**: The size of the Lambda layer used for canaries is reduced by 34%.", + "see": "https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Library_nodejs_puppeteer.html#CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-3.7", + "stability": "deprecated", + "summary": "`syn-nodejs-puppeteer-3.7` includes the following: - Lambda runtime Node.js 14.x - Puppeteer-core version 10.1.0 - Chromium version 92.0.4512." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/runtime.ts", + "line": 177 + }, + "name": "SYNTHETICS_NODEJS_PUPPETEER_3_7", + "static": true, + "type": { + "fqn": "@aws-cdk/aws-synthetics-alpha.Runtime" + } + }, + { + "const": true, + "docs": { + "remarks": "New Features:\n- **Profile cleanup**: Chromium profiles are now cleaned up after each canary run.", + "see": "https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Library_nodejs_puppeteer.html#CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-3.8", + "stability": "deprecated", + "summary": "`syn-nodejs-puppeteer-3.8` includes the following: - Lambda runtime Node.js 14.x - Puppeteer-core version 10.1.0 - Chromium version 92.0.4512." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/runtime.ts", + "line": 190 + }, + "name": "SYNTHETICS_NODEJS_PUPPETEER_3_8", + "static": true, + "type": { + "fqn": "@aws-cdk/aws-synthetics-alpha.Runtime" + } + }, + { + "const": true, + "docs": { + "remarks": "- Lambda runtime Node.js 14.x\n- Puppeteer-core version 5.5.0\n- Chromium version 92.0.4512\n\nNew Features:\n- **Dependency upgrades**: Upgrades some third-party dependency packages.", + "see": "https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Library_nodejs_puppeteer.html#CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-3.9", + "stability": "deprecated", + "summary": "`syn-nodejs-puppeteer-3.9` includes the following:." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/runtime.ts", + "line": 204 + }, + "name": "SYNTHETICS_NODEJS_PUPPETEER_3_9", + "static": true, + "type": { + "fqn": "@aws-cdk/aws-synthetics-alpha.Runtime" + } + }, + { + "const": true, + "docs": { + "remarks": "New Features:\n- **Dependency upgrades**: The Node.js dependency is updated to 16.x.", + "see": "https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Library_nodejs_puppeteer.html#CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-4.0", + "stability": "deprecated", + "summary": "`syn-nodejs-puppeteer-4.0` includes the following: - Lambda runtime Node.js 16.x - Puppeteer-core version 5.5.0 - Chromium version 92.0.4512." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/runtime.ts", + "line": 217 + }, + "name": "SYNTHETICS_NODEJS_PUPPETEER_4_0", + "static": true, + "type": { + "fqn": "@aws-cdk/aws-synthetics-alpha.Runtime" + } + }, + { + "const": true, + "docs": { + "remarks": "New Features:\n- **Dependency upgrade**: The Puppeteer-core version is updated to 19.7.0. The Chromium version is upgraded to 111.0.5563.146.", + "see": "https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Library_nodejs_puppeteer.html#CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-5.0", + "stability": "deprecated", + "summary": "`syn-nodejs-puppeteer-5.0` includes the following: - Lambda runtime Node.js 16.x - Puppeteer-core version 19.7.0 - Chromium version 111.0.5563.146." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/runtime.ts", + "line": 230 + }, + "name": "SYNTHETICS_NODEJS_PUPPETEER_5_0", + "static": true, + "type": { + "fqn": "@aws-cdk/aws-synthetics-alpha.Runtime" + } + }, + { + "const": true, + "docs": { + "remarks": "Bug fixes:\n- **Bug fix**: This runtime fixes a bug in `syn-nodejs-puppeteer-5.0` where the HAR files created by the canaries were missing request headers.", + "see": "https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Library_nodejs_puppeteer.html#CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-5.1", + "stability": "deprecated", + "summary": "`syn-nodejs-puppeteer-5.1` includes the following: - Lambda runtime Node.js 16.x - Puppeteer-core version 19.7.0 - Chromium version 111.0.5563.146." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/runtime.ts", + "line": 243 + }, + "name": "SYNTHETICS_NODEJS_PUPPETEER_5_1", + "static": true, + "type": { + "fqn": "@aws-cdk/aws-synthetics-alpha.Runtime" + } + }, + { + "const": true, + "docs": { + "see": "https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Library_python_selenium.html#CloudWatch_Synthetics_runtimeversion-syn-python-selenium-1.0", + "stability": "deprecated", + "summary": "`syn-python-selenium-1.0` includes the following: - Lambda runtime Python 3.8 - Selenium version 3.141.0 - Chromium version 83.0.4103.0." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/runtime.ts", + "line": 253 + }, + "name": "SYNTHETICS_PYTHON_SELENIUM_1_0", + "static": true, + "type": { + "fqn": "@aws-cdk/aws-synthetics-alpha.Runtime" + } + }, + { + "const": true, + "docs": { + "remarks": "New Features:\n- **Custom handler function**: You can now use a custom handler function for your canary scripts.\n- **Configuration options for adding metrics and step failure configurations**: These options were already available in runtimes for Node.js canaries.\n- **Custom arguments in Chrome**: You can now open a browser in incognito mode or pass in proxy server configuration.\n- **Cross-Region artifact buckets**: A canary can store its artifacts in an Amazon S3 bucket in a different Region.", + "see": "https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Library_python_selenium.html#CloudWatch_Synthetics_runtimeversion-syn-python-selenium-1.1", + "stability": "deprecated", + "summary": "`syn-python-selenium-1.1` includes the following: - Lambda runtime Python 3.8 - Selenium version 3.141.0 - Chromium version 83.0.4103.0." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/runtime.ts", + "line": 269 + }, + "name": "SYNTHETICS_PYTHON_SELENIUM_1_1", + "static": true, + "type": { + "fqn": "@aws-cdk/aws-synthetics-alpha.Runtime" + } + }, + { + "const": true, + "docs": { + "remarks": "New Features:\n- **Updated dependencies**: The only new features in this runtime are the updated dependencies.", + "see": "https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Library_python_selenium.html#CloudWatch_Synthetics_runtimeversion-syn-python-selenium-1.2", + "stability": "deprecated", + "summary": "`syn-python-selenium-1.2` includes the following: - Lambda runtime Python 3.8 - Selenium version 3.141.0 - Chromium version 92.0.4512.0." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/runtime.ts", + "line": 282 + }, + "name": "SYNTHETICS_PYTHON_SELENIUM_1_2", + "static": true, + "type": { + "fqn": "@aws-cdk/aws-synthetics-alpha.Runtime" + } + }, + { + "const": true, + "docs": { + "remarks": "New Features:\n- **More precise timestamps**: The start time and stop time of canary runs are now precise to the millisecond.", + "see": "https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Library_python_selenium.html#CloudWatch_Synthetics_runtimeversion-syn-python-selenium-1.3", + "stability": "deprecated", + "summary": "`syn-python-selenium-1.3` includes the following: - Lambda runtime Python 3.8 - Selenium version 3.141.0 - Chromium version 92.0.4512.0." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/runtime.ts", + "line": 295 + }, + "name": "SYNTHETICS_PYTHON_SELENIUM_1_3", + "static": true, + "type": { + "fqn": "@aws-cdk/aws-synthetics-alpha.Runtime" + } + }, + { + "docs": { + "stability": "deprecated", + "summary": "The Lambda runtime family." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/runtime.ts", + "line": 301 + }, + "name": "family", + "type": { + "fqn": "@aws-cdk/aws-synthetics-alpha.RuntimeFamily" + } + }, + { + "docs": { + "stability": "deprecated", + "summary": "The name of the runtime version." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/runtime.ts", + "line": 301 + }, + "name": "name", + "type": { + "primitive": "string" + } + } + ], + "symbolId": "lib/runtime:Runtime" + }, + "@aws-cdk/aws-synthetics-alpha.RuntimeFamily": { + "assembly": "@aws-cdk/aws-synthetics-alpha", + "docs": { + "stability": "deprecated", + "summary": "All known Lambda runtime families." + }, + "fqn": "@aws-cdk/aws-synthetics-alpha.RuntimeFamily", + "kind": "enum", + "locationInModule": { + "filename": "lib/runtime.ts", + "line": 4 + }, + "members": [ + { + "docs": { + "stability": "deprecated", + "summary": "All Lambda runtimes that depend on Node.js." + }, + "name": "NODEJS" + }, + { + "docs": { + "stability": "deprecated", + "summary": "All lambda runtimes that depend on Python." + }, + "name": "PYTHON" + }, + { + "docs": { + "stability": "deprecated", + "summary": "Any future runtime family." + }, + "name": "OTHER" + } + ], + "name": "RuntimeFamily", + "symbolId": "lib/runtime:RuntimeFamily" + }, + "@aws-cdk/aws-synthetics-alpha.S3Code": { + "assembly": "@aws-cdk/aws-synthetics-alpha", + "base": "@aws-cdk/aws-synthetics-alpha.Code", + "docs": { + "stability": "deprecated", + "summary": "S3 bucket path to the code zip file." + }, + "fqn": "@aws-cdk/aws-synthetics-alpha.S3Code", + "initializer": { + "docs": { + "stability": "deprecated" + }, + "locationInModule": { + "filename": "lib/code.ts", + "line": 184 + }, + "parameters": [ + { + "name": "bucket", + "type": { + "fqn": "aws-cdk-lib.aws_s3.IBucket" + } + }, + { + "name": "key", + "type": { + "primitive": "string" + } + }, + { + "name": "objectVersion", + "optional": true, + "type": { + "primitive": "string" + } + } + ] + }, + "kind": "class", + "locationInModule": { + "filename": "lib/code.ts", + "line": 183 + }, + "methods": [ + { + "docs": { + "stability": "deprecated", + "summary": "Called when the canary is initialized to allow this object to bind to the stack, add resources and have fun." + }, + "locationInModule": { + "filename": "lib/code.ts", + "line": 188 + }, + "name": "bind", + "overrides": "@aws-cdk/aws-synthetics-alpha.Code", + "parameters": [ + { + "name": "_scope", + "type": { + "fqn": "constructs.Construct" + } + }, + { + "name": "_handler", + "type": { + "primitive": "string" + } + }, + { + "name": "_family", + "type": { + "fqn": "@aws-cdk/aws-synthetics-alpha.RuntimeFamily" + } + } + ], + "returns": { + "type": { + "fqn": "@aws-cdk/aws-synthetics-alpha.CodeConfig" + } + } + } + ], + "name": "S3Code", + "symbolId": "lib/code:S3Code" + }, + "@aws-cdk/aws-synthetics-alpha.Schedule": { + "assembly": "@aws-cdk/aws-synthetics-alpha", + "docs": { + "stability": "deprecated", + "summary": "Schedule for canary runs." + }, + "fqn": "@aws-cdk/aws-synthetics-alpha.Schedule", + "kind": "class", + "locationInModule": { + "filename": "lib/schedule.ts", + "line": 6 + }, + "methods": [ + { + "docs": { + "stability": "deprecated", + "summary": "Create a schedule from a set of cron fields." + }, + "locationInModule": { + "filename": "lib/schedule.ts", + "line": 48 + }, + "name": "cron", + "parameters": [ + { + "name": "options", + "type": { + "fqn": "@aws-cdk/aws-synthetics-alpha.CronOptions" + } + } + ], + "returns": { + "type": { + "fqn": "@aws-cdk/aws-synthetics-alpha.Schedule" + } + }, + "static": true + }, + { + "docs": { + "remarks": "The expression must be in a `rate(number units)` format.\nFor example, `Schedule.expression('rate(10 minutes)')`", + "stability": "deprecated", + "summary": "Construct a schedule from a literal schedule expression." + }, + "locationInModule": { + "filename": "lib/schedule.ts", + "line": 21 + }, + "name": "expression", + "parameters": [ + { + "docs": { + "summary": "The expression to use." + }, + "name": "expression", + "type": { + "primitive": "string" + } + } + ], + "returns": { + "type": { + "fqn": "@aws-cdk/aws-synthetics-alpha.Schedule" + } + }, + "static": true + }, + { + "docs": { + "stability": "deprecated", + "summary": "The canary will be executed once." + }, + "locationInModule": { + "filename": "lib/schedule.ts", + "line": 11 + }, + "name": "once", + "returns": { + "type": { + "fqn": "@aws-cdk/aws-synthetics-alpha.Schedule" + } + }, + "static": true + }, + { + "docs": { + "remarks": "Allowed values: 0 (for a single run) or between 1 and 60 minutes.\nTo specify a single run, you can use `Schedule.once()`.", + "stability": "deprecated", + "summary": "Construct a schedule from an interval." + }, + "locationInModule": { + "filename": "lib/schedule.ts", + "line": 31 + }, + "name": "rate", + "parameters": [ + { + "docs": { + "summary": "The interval at which to run the canary." + }, + "name": "interval", + "type": { + "fqn": "aws-cdk-lib.Duration" + } + } + ], + "returns": { + "type": { + "fqn": "@aws-cdk/aws-synthetics-alpha.Schedule" + } + }, + "static": true + } + ], + "name": "Schedule", + "properties": [ + { + "docs": { + "stability": "deprecated", + "summary": "The Schedule expression." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/schedule.ts", + "line": 71 + }, + "name": "expressionString", + "type": { + "primitive": "string" + } + } + ], + "symbolId": "lib/schedule:Schedule" + }, + "@aws-cdk/aws-synthetics-alpha.Test": { + "assembly": "@aws-cdk/aws-synthetics-alpha", + "docs": { + "stability": "deprecated", + "summary": "Specify a test that the canary should run." + }, + "fqn": "@aws-cdk/aws-synthetics-alpha.Test", + "kind": "class", + "locationInModule": { + "filename": "lib/canary.ts", + "line": 22 + }, + "methods": [ + { + "docs": { + "returns": "`Test` associated with the specified Code object", + "stability": "deprecated", + "summary": "Specify a custom test with your own code." + }, + "locationInModule": { + "filename": "lib/canary.ts", + "line": 29 + }, + "name": "custom", + "parameters": [ + { + "docs": { + "summary": "The configuration options." + }, + "name": "options", + "type": { + "fqn": "@aws-cdk/aws-synthetics-alpha.CustomTestOptions" + } + } + ], + "returns": { + "type": { + "fqn": "@aws-cdk/aws-synthetics-alpha.Test" + } + }, + "static": true + } + ], + "name": "Test", + "properties": [ + { + "docs": { + "stability": "deprecated", + "summary": "The code that the canary should run." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/canary.ts", + "line": 39 + }, + "name": "code", + "type": { + "fqn": "@aws-cdk/aws-synthetics-alpha.Code" + } + }, + { + "docs": { + "stability": "deprecated", + "summary": "The handler of the canary." + }, + "immutable": true, + "locationInModule": { + "filename": "lib/canary.ts", + "line": 39 + }, + "name": "handler", + "type": { + "primitive": "string" + } + } + ], + "symbolId": "lib/canary:Test" + } + }, + "version": "0.0.0", + "fingerprint": "eliGrMXxfQFvAyrkm3mPEt33RTLI1n1EjGZvT0Zr/JM=" +} \ No newline at end of file diff --git a/packages/@aws-cdk/aws-synthetics-alpha/.warnings.jsii.js b/packages/@aws-cdk/aws-synthetics-alpha/.warnings.jsii.js new file mode 100644 index 0000000000000..5d9b8d489edb2 --- /dev/null +++ b/packages/@aws-cdk/aws-synthetics-alpha/.warnings.jsii.js @@ -0,0 +1,217 @@ +function _aws_cdk_aws_synthetics_alpha_Test(p) { +} +function _aws_cdk_aws_synthetics_alpha_CustomTestOptions(p) { + if (p == null) + return; + visitedObjects.add(p); + try { + if ("code" in p) + print("@aws-cdk/aws-synthetics-alpha.CustomTestOptions#code", ""); + if (!visitedObjects.has(p.code)) + _aws_cdk_aws_synthetics_alpha_Code(p.code); + if ("handler" in p) + print("@aws-cdk/aws-synthetics-alpha.CustomTestOptions#handler", ""); + } + finally { + visitedObjects.delete(p); + } +} +function _aws_cdk_aws_synthetics_alpha_Cleanup(p) { + if (p == null) + return; + visitedObjects.add(p); + try { + print("@aws-cdk/aws-synthetics-alpha.Cleanup", ""); + const ns = require("./lib/canary.js"); + if (Object.values(ns.Cleanup).filter(x => x === p).length > 1) + return; + if (p === ns.Cleanup.NOTHING) + print("@aws-cdk/aws-synthetics-alpha.Cleanup#NOTHING", ""); + if (p === ns.Cleanup.LAMBDA) + print("@aws-cdk/aws-synthetics-alpha.Cleanup#LAMBDA", ""); + } + finally { + visitedObjects.delete(p); + } +} +function _aws_cdk_aws_synthetics_alpha_ArtifactsBucketLocation(p) { + if (p == null) + return; + visitedObjects.add(p); + try { + if ("bucket" in p) + print("@aws-cdk/aws-synthetics-alpha.ArtifactsBucketLocation#bucket", ""); + if ("prefix" in p) + print("@aws-cdk/aws-synthetics-alpha.ArtifactsBucketLocation#prefix", ""); + } + finally { + visitedObjects.delete(p); + } +} +function _aws_cdk_aws_synthetics_alpha_CanaryProps(p) { + if (p == null) + return; + visitedObjects.add(p); + try { + if ("runtime" in p) + print("@aws-cdk/aws-synthetics-alpha.CanaryProps#runtime", ""); + if (!visitedObjects.has(p.runtime)) + _aws_cdk_aws_synthetics_alpha_Runtime(p.runtime); + if ("test" in p) + print("@aws-cdk/aws-synthetics-alpha.CanaryProps#test", ""); + if (!visitedObjects.has(p.test)) + _aws_cdk_aws_synthetics_alpha_Test(p.test); + if ("artifactsBucketLifecycleRules" in p) + print("@aws-cdk/aws-synthetics-alpha.CanaryProps#artifactsBucketLifecycleRules", ""); + if (p.artifactsBucketLifecycleRules != null) + for (const o of p.artifactsBucketLifecycleRules) + if (!visitedObjects.has(o)) + require("aws-cdk-lib/.warnings.jsii.js").aws_cdk_lib_aws_s3_LifecycleRule(o); + if ("artifactsBucketLocation" in p) + print("@aws-cdk/aws-synthetics-alpha.CanaryProps#artifactsBucketLocation", ""); + if (!visitedObjects.has(p.artifactsBucketLocation)) + _aws_cdk_aws_synthetics_alpha_ArtifactsBucketLocation(p.artifactsBucketLocation); + if ("canaryName" in p) + print("@aws-cdk/aws-synthetics-alpha.CanaryProps#canaryName", ""); + if ("cleanup" in p) + print("@aws-cdk/aws-synthetics-alpha.CanaryProps#cleanup", ""); + if (!visitedObjects.has(p.cleanup)) + _aws_cdk_aws_synthetics_alpha_Cleanup(p.cleanup); + if ("enableAutoDeleteLambdas" in p) + print("@aws-cdk/aws-synthetics-alpha.CanaryProps#enableAutoDeleteLambdas", "this feature has been deprecated by the service team, use `cleanup: Cleanup.LAMBDA` instead which will use a Custom Resource to achieve the same effect."); + if ("environmentVariables" in p) + print("@aws-cdk/aws-synthetics-alpha.CanaryProps#environmentVariables", ""); + if ("failureRetentionPeriod" in p) + print("@aws-cdk/aws-synthetics-alpha.CanaryProps#failureRetentionPeriod", ""); + if ("role" in p) + print("@aws-cdk/aws-synthetics-alpha.CanaryProps#role", ""); + if ("schedule" in p) + print("@aws-cdk/aws-synthetics-alpha.CanaryProps#schedule", ""); + if (!visitedObjects.has(p.schedule)) + _aws_cdk_aws_synthetics_alpha_Schedule(p.schedule); + if ("securityGroups" in p) + print("@aws-cdk/aws-synthetics-alpha.CanaryProps#securityGroups", ""); + if (p.securityGroups != null) + for (const o of p.securityGroups) + if (!visitedObjects.has(o)) + require("aws-cdk-lib/.warnings.jsii.js").aws_cdk_lib_aws_ec2_ISecurityGroup(o); + if ("startAfterCreation" in p) + print("@aws-cdk/aws-synthetics-alpha.CanaryProps#startAfterCreation", ""); + if ("successRetentionPeriod" in p) + print("@aws-cdk/aws-synthetics-alpha.CanaryProps#successRetentionPeriod", ""); + if ("timeToLive" in p) + print("@aws-cdk/aws-synthetics-alpha.CanaryProps#timeToLive", ""); + if ("vpc" in p) + print("@aws-cdk/aws-synthetics-alpha.CanaryProps#vpc", ""); + if ("vpcSubnets" in p) + print("@aws-cdk/aws-synthetics-alpha.CanaryProps#vpcSubnets", ""); + } + finally { + visitedObjects.delete(p); + } +} +function _aws_cdk_aws_synthetics_alpha_Canary(p) { +} +function _aws_cdk_aws_synthetics_alpha_Code(p) { +} +function _aws_cdk_aws_synthetics_alpha_CodeConfig(p) { + if (p == null) + return; + visitedObjects.add(p); + try { + if ("inlineCode" in p) + print("@aws-cdk/aws-synthetics-alpha.CodeConfig#inlineCode", ""); + if ("s3Location" in p) + print("@aws-cdk/aws-synthetics-alpha.CodeConfig#s3Location", ""); + } + finally { + visitedObjects.delete(p); + } +} +function _aws_cdk_aws_synthetics_alpha_AssetCode(p) { +} +function _aws_cdk_aws_synthetics_alpha_InlineCode(p) { +} +function _aws_cdk_aws_synthetics_alpha_S3Code(p) { +} +function _aws_cdk_aws_synthetics_alpha_RuntimeFamily(p) { + if (p == null) + return; + visitedObjects.add(p); + try { + print("@aws-cdk/aws-synthetics-alpha.RuntimeFamily", ""); + const ns = require("./lib/runtime.js"); + if (Object.values(ns.RuntimeFamily).filter(x => x === p).length > 1) + return; + if (p === ns.RuntimeFamily.NODEJS) + print("@aws-cdk/aws-synthetics-alpha.RuntimeFamily#NODEJS", ""); + if (p === ns.RuntimeFamily.PYTHON) + print("@aws-cdk/aws-synthetics-alpha.RuntimeFamily#PYTHON", ""); + if (p === ns.RuntimeFamily.OTHER) + print("@aws-cdk/aws-synthetics-alpha.RuntimeFamily#OTHER", ""); + } + finally { + visitedObjects.delete(p); + } +} +function _aws_cdk_aws_synthetics_alpha_Runtime(p) { +} +function _aws_cdk_aws_synthetics_alpha_Schedule(p) { +} +function _aws_cdk_aws_synthetics_alpha_CronOptions(p) { + if (p == null) + return; + visitedObjects.add(p); + try { + if ("day" in p) + print("@aws-cdk/aws-synthetics-alpha.CronOptions#day", ""); + if ("hour" in p) + print("@aws-cdk/aws-synthetics-alpha.CronOptions#hour", ""); + if ("minute" in p) + print("@aws-cdk/aws-synthetics-alpha.CronOptions#minute", ""); + if ("month" in p) + print("@aws-cdk/aws-synthetics-alpha.CronOptions#month", ""); + if ("weekDay" in p) + print("@aws-cdk/aws-synthetics-alpha.CronOptions#weekDay", ""); + } + finally { + visitedObjects.delete(p); + } +} +function print(name, deprecationMessage) { + const deprecated = process.env.JSII_DEPRECATED; + const deprecationMode = ["warn", "fail", "quiet"].includes(deprecated) ? deprecated : "warn"; + const message = `${name} is deprecated.\n ${deprecationMessage.trim()}\n This API will be removed in the next major release.`; + switch (deprecationMode) { + case "fail": + throw new DeprecationError(message); + case "warn": + console.warn("[WARNING]", message); + break; + } +} +function getPropertyDescriptor(obj, prop) { + const descriptor = Object.getOwnPropertyDescriptor(obj, prop); + if (descriptor) { + return descriptor; + } + const proto = Object.getPrototypeOf(obj); + const prototypeDescriptor = proto && getPropertyDescriptor(proto, prop); + if (prototypeDescriptor) { + return prototypeDescriptor; + } + return {}; +} +const visitedObjects = new Set(); +class DeprecationError extends Error { + constructor(...args) { + super(...args); + Object.defineProperty(this, "name", { + configurable: false, + enumerable: true, + value: "DeprecationError", + writable: false, + }); + } +} +module.exports = { print, getPropertyDescriptor, DeprecationError, _aws_cdk_aws_synthetics_alpha_Test, _aws_cdk_aws_synthetics_alpha_CustomTestOptions, _aws_cdk_aws_synthetics_alpha_Cleanup, _aws_cdk_aws_synthetics_alpha_ArtifactsBucketLocation, _aws_cdk_aws_synthetics_alpha_CanaryProps, _aws_cdk_aws_synthetics_alpha_Canary, _aws_cdk_aws_synthetics_alpha_Code, _aws_cdk_aws_synthetics_alpha_CodeConfig, _aws_cdk_aws_synthetics_alpha_AssetCode, _aws_cdk_aws_synthetics_alpha_InlineCode, _aws_cdk_aws_synthetics_alpha_S3Code, _aws_cdk_aws_synthetics_alpha_RuntimeFamily, _aws_cdk_aws_synthetics_alpha_Runtime, _aws_cdk_aws_synthetics_alpha_Schedule, _aws_cdk_aws_synthetics_alpha_CronOptions }; diff --git a/packages/@aws-cdk/aws-synthetics-alpha/lib/canary.d.ts b/packages/@aws-cdk/aws-synthetics-alpha/lib/canary.d.ts new file mode 100644 index 0000000000000..c964ced1e48ee --- /dev/null +++ b/packages/@aws-cdk/aws-synthetics-alpha/lib/canary.d.ts @@ -0,0 +1,308 @@ +import { Metric, MetricOptions } from 'aws-cdk-lib/aws-cloudwatch'; +import * as ec2 from 'aws-cdk-lib/aws-ec2'; +import * as iam from 'aws-cdk-lib/aws-iam'; +import * as s3 from 'aws-cdk-lib/aws-s3'; +import * as cdk from 'aws-cdk-lib/core'; +import { Construct } from 'constructs'; +import { Code } from './code'; +import { Runtime } from './runtime'; +import { Schedule } from './schedule'; +/** + * Specify a test that the canary should run + */ +export declare class Test { + readonly code: Code; + readonly handler: string; + /** + * Specify a custom test with your own code + * + * @returns `Test` associated with the specified Code object + * @param options The configuration options + */ + static custom(options: CustomTestOptions): Test; + /** + * Construct a Test property + * + * @param code The code that the canary should run + * @param handler The handler of the canary + */ + private constructor(); +} +/** + * Properties for specifying a test + */ +export interface CustomTestOptions { + /** + * The code of the canary script + */ + readonly code: Code; + /** + * The handler for the code. Must end with `.handler`. + */ + readonly handler: string; +} +/** + * Different ways to clean up underlying Canary resources + * when the Canary is deleted. + */ +export declare enum Cleanup { + /** + * Clean up nothing. The user is responsible for cleaning up + * all resources left behind by the Canary. + */ + NOTHING = "nothing", + /** + * Clean up the underlying Lambda function only. The user is + * responsible for cleaning up all other resources left behind + * by the Canary. + */ + LAMBDA = "lambda" +} +/** + * Options for specifying the s3 location that stores the data of each canary run. The artifacts bucket location **cannot** + * be updated once the canary is created. + */ +export interface ArtifactsBucketLocation { + /** + * The s3 location that stores the data of each run. + */ + readonly bucket: s3.IBucket; + /** + * The S3 bucket prefix. Specify this if you want a more specific path within the artifacts bucket. + * + * @default - no prefix + */ + readonly prefix?: string; +} +/** + * Properties for a canary + */ +export interface CanaryProps { + /** + * The s3 location that stores the data of the canary runs. + * + * @default - A new s3 bucket will be created without a prefix. + */ + readonly artifactsBucketLocation?: ArtifactsBucketLocation; + /** + * Canary execution role. + * + * This is the role that will be assumed by the canary upon execution. + * It controls the permissions that the canary will have. The role must + * be assumable by the AWS Lambda service principal. + * + * If not supplied, a role will be created with all the required permissions. + * If you provide a Role, you must add the required permissions. + * + * @see required permissions: https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-synthetics-canary.html#cfn-synthetics-canary-executionrolearn + * + * @default - A unique role will be generated for this canary. + * You can add permissions to roles by calling 'addToRolePolicy'. + */ + readonly role?: iam.IRole; + /** + * How long the canary will be in a 'RUNNING' state. For example, if you set `timeToLive` to be 1 hour and `schedule` to be `rate(10 minutes)`, + * your canary will run at 10 minute intervals for an hour, for a total of 6 times. + * + * @default - no limit + */ + readonly timeToLive?: cdk.Duration; + /** + * Specify the schedule for how often the canary runs. For example, if you set `schedule` to `rate(10 minutes)`, then the canary will run every 10 minutes. + * You can set the schedule with `Schedule.rate(Duration)` (recommended) or you can specify an expression using `Schedule.expression()`. + * @default 'rate(5 minutes)' + */ + readonly schedule?: Schedule; + /** + * Whether or not the canary should start after creation. + * + * @default true + */ + readonly startAfterCreation?: boolean; + /** + * How many days should successful runs be retained. + * + * @default Duration.days(31) + */ + readonly successRetentionPeriod?: cdk.Duration; + /** + * How many days should failed runs be retained. + * + * @default Duration.days(31) + */ + readonly failureRetentionPeriod?: cdk.Duration; + /** + * The name of the canary. Be sure to give it a descriptive name that distinguishes it from + * other canaries in your account. + * + * Do not include secrets or proprietary information in your canary name. The canary name + * makes up part of the canary ARN, which is included in outbound calls over the internet. + * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/servicelens_canaries_security.html + * + * @default - A unique name will be generated from the construct ID + */ + readonly canaryName?: string; + /** + * Specify the runtime version to use for the canary. + * + * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Canaries_Library.html + */ + readonly runtime: Runtime; + /** + * The type of test that you want your canary to run. Use `Test.custom()` to specify the test to run. + */ + readonly test: Test; + /** + * Key-value pairs that the Synthetics caches and makes available for your canary scripts. Use environment variables + * to apply configuration changes, such as test and production environment configurations, without changing your + * Canary script source code. + * + * @default - No environment variables. + */ + readonly environmentVariables?: { + [key: string]: string; + }; + /** + * The VPC where this canary is run. + * + * Specify this if the canary needs to access resources in a VPC. + * + * @default - Not in VPC + */ + readonly vpc?: ec2.IVpc; + /** + * Where to place the network interfaces within the VPC. You must provide `vpc` when using this prop. + * + * @default - the Vpc default strategy if not specified + */ + readonly vpcSubnets?: ec2.SubnetSelection; + /** + * The list of security groups to associate with the canary's network interfaces. You must provide `vpc` when using this prop. + * + * @default - If the canary is placed within a VPC and a security group is + * not specified a dedicated security group will be created for this canary. + */ + readonly securityGroups?: ec2.ISecurityGroup[]; + /** + * Whether or not to delete the lambda resources when the canary is deleted + * + * @see https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-synthetics-canary.html#cfn-synthetics-canary-deletelambdaresourcesoncanarydeletion + * + * @default false + * @deprecated this feature has been deprecated by the service team, use `cleanup: Cleanup.LAMBDA` instead which will use a Custom Resource to achieve the same effect. + */ + readonly enableAutoDeleteLambdas?: boolean; + /** + * Specify the underlying resources to be cleaned up when the canary is deleted. + * Using `Cleanup.LAMBDA` will create a Custom Resource to achieve this. + * + * @default Cleanup.NOTHING + */ + readonly cleanup?: Cleanup; + /** + * Lifecycle rules for the generated canary artifact bucket. Has no effect + * if a bucket is passed to `artifactsBucketLocation`. If you pass a bucket + * to `artifactsBucketLocation`, you can add lifecycle rules to the bucket + * itself. + * + * @default - no rules applied to the generated bucket. + */ + readonly artifactsBucketLifecycleRules?: Array; +} +/** + * Define a new Canary + */ +export declare class Canary extends cdk.Resource implements ec2.IConnectable { + /** + * Execution role associated with this Canary. + */ + readonly role: iam.IRole; + /** + * The canary ID + * @attribute + */ + readonly canaryId: string; + /** + * The state of the canary. For example, 'RUNNING', 'STOPPED', 'NOT STARTED', or 'ERROR'. + * @attribute + */ + readonly canaryState: string; + /** + * The canary Name + * @attribute + */ + readonly canaryName: string; + /** + * Bucket where data from each canary run is stored. + */ + readonly artifactsBucket: s3.IBucket; + /** + * Actual connections object for the underlying Lambda + * + * May be unset, in which case the canary Lambda is not configured for use in a VPC. + * @internal + */ + private readonly _connections?; + private readonly _resource; + constructor(scope: Construct, id: string, props: CanaryProps); + private cleanupUnderlyingResources; + /** + * Access the Connections object + * + * Will fail if not a VPC-enabled Canary + */ + get connections(): ec2.Connections; + /** + * Measure the Duration of a single canary run, in seconds. + * + * @param options - configuration options for the metric + * + * @default avg over 5 minutes + */ + metricDuration(options?: MetricOptions): Metric; + /** + * Measure the percentage of successful canary runs. + * + * @param options - configuration options for the metric + * + * @default avg over 5 minutes + */ + metricSuccessPercent(options?: MetricOptions): Metric; + /** + * Measure the number of failed canary runs over a given time period. + * + * Default: sum over 5 minutes + * + * @param options - configuration options for the metric + */ + metricFailed(options?: MetricOptions): Metric; + /** + * Returns a default role for the canary + */ + private createDefaultRole; + private logGroupArn; + private lambdaArn; + /** + * Returns the code object taken in by the canary resource. + */ + private createCode; + /** + * Verifies that the handler name matches the conventions given a certain runtime. + * + * @see https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-synthetics-canary-code.html#cfn-synthetics-canary-code-handler + * @param handler - the name of the handler + * @param runtime - the runtime version + */ + private validateHandler; + private createRunConfig; + /** + * Returns a canary schedule object + */ + private createSchedule; + private createVpcConfig; + /** + * Creates a unique name for the canary. The generated name is the physical ID of the canary. + */ + private generateUniqueName; + private cannedMetric; +} diff --git a/packages/@aws-cdk/aws-synthetics-alpha/lib/canary.js b/packages/@aws-cdk/aws-synthetics-alpha/lib/canary.js new file mode 100644 index 0000000000000..0ccc6c68dd552 --- /dev/null +++ b/packages/@aws-cdk/aws-synthetics-alpha/lib/canary.js @@ -0,0 +1,439 @@ +"use strict"; +var _a, _b; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Canary = exports.Cleanup = exports.Test = void 0; +const jsiiDeprecationWarnings = require("../.warnings.jsii.js"); +const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti"); +const crypto = require("crypto"); +const aws_cloudwatch_1 = require("aws-cdk-lib/aws-cloudwatch"); +const ec2 = require("aws-cdk-lib/aws-ec2"); +const iam = require("aws-cdk-lib/aws-iam"); +const s3 = require("aws-cdk-lib/aws-s3"); +const cdk = require("aws-cdk-lib/core"); +const runtime_1 = require("./runtime"); +const synthetics_canned_metrics_generated_1 = require("aws-cdk-lib/aws-synthetics/lib/synthetics-canned-metrics.generated"); +const aws_synthetics_1 = require("aws-cdk-lib/aws-synthetics"); +const core_1 = require("aws-cdk-lib/core"); +const path = require("path"); +const AUTO_DELETE_UNDERLYING_RESOURCES_RESOURCE_TYPE = 'Custom::SyntheticsAutoDeleteUnderlyingResources'; +const AUTO_DELETE_UNDERLYING_RESOURCES_TAG = 'aws-cdk:auto-delete-underlying-resources'; +/** + * Specify a test that the canary should run + */ +class Test { + /** + * Specify a custom test with your own code + * + * @returns `Test` associated with the specified Code object + * @param options The configuration options + */ + static custom(options) { + try { + jsiiDeprecationWarnings.print("@aws-cdk/aws-synthetics-alpha.Test#custom", ""); + jsiiDeprecationWarnings._aws_cdk_aws_synthetics_alpha_CustomTestOptions(options); + } + catch (error) { + if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { + Error.captureStackTrace(error, this.custom); + } + throw error; + } + return new Test(options.code, options.handler); + } + /** + * Construct a Test property + * + * @param code The code that the canary should run + * @param handler The handler of the canary + */ + constructor(code, handler) { + this.code = code; + this.handler = handler; + } +} +exports.Test = Test; +_a = JSII_RTTI_SYMBOL_1; +Test[_a] = { fqn: "@aws-cdk/aws-synthetics-alpha.Test", version: "0.0.0" }; +/** + * Different ways to clean up underlying Canary resources + * when the Canary is deleted. + */ +var Cleanup; +(function (Cleanup) { + /** + * Clean up nothing. The user is responsible for cleaning up + * all resources left behind by the Canary. + */ + Cleanup["NOTHING"] = "nothing"; + /** + * Clean up the underlying Lambda function only. The user is + * responsible for cleaning up all other resources left behind + * by the Canary. + */ + Cleanup["LAMBDA"] = "lambda"; +})(Cleanup || (exports.Cleanup = Cleanup = {})); +/** + * Define a new Canary + */ +class Canary extends cdk.Resource { + constructor(scope, id, props) { + try { + jsiiDeprecationWarnings.print("@aws-cdk/aws-synthetics-alpha.Canary", ""); + jsiiDeprecationWarnings._aws_cdk_aws_synthetics_alpha_CanaryProps(props); + } + catch (error) { + if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { + Error.captureStackTrace(error, Canary); + } + throw error; + } + if (props.canaryName && !cdk.Token.isUnresolved(props.canaryName)) { + validateName(props.canaryName); + } + super(scope, id, { + physicalName: props.canaryName || cdk.Lazy.string({ + produce: () => this.generateUniqueName(), + }), + }); + this.artifactsBucket = props.artifactsBucketLocation?.bucket ?? new s3.Bucket(this, 'ArtifactsBucket', { + encryption: s3.BucketEncryption.KMS_MANAGED, + enforceSSL: true, + lifecycleRules: props.artifactsBucketLifecycleRules, + }); + this.role = props.role ?? this.createDefaultRole(props); + if (props.vpc) { + // Security Groups are created and/or appended in `createVpcConfig`. + this._connections = new ec2.Connections({}); + } + const resource = new aws_synthetics_1.CfnCanary(this, 'Resource', { + artifactS3Location: this.artifactsBucket.s3UrlForObject(props.artifactsBucketLocation?.prefix), + executionRoleArn: this.role.roleArn, + startCanaryAfterCreation: props.startAfterCreation ?? true, + runtimeVersion: props.runtime.name, + name: this.physicalName, + schedule: this.createSchedule(props), + failureRetentionPeriod: props.failureRetentionPeriod?.toDays(), + successRetentionPeriod: props.successRetentionPeriod?.toDays(), + code: this.createCode(props), + runConfig: this.createRunConfig(props), + vpcConfig: this.createVpcConfig(props), + }); + this._resource = resource; + this.canaryId = resource.attrId; + this.canaryState = resource.attrState; + this.canaryName = this.getResourceNameAttribute(resource.ref); + if (props.cleanup === Cleanup.LAMBDA ?? props.enableAutoDeleteLambdas) { + this.cleanupUnderlyingResources(); + } + } + cleanupUnderlyingResources() { + const provider = core_1.CustomResourceProvider.getOrCreateProvider(this, AUTO_DELETE_UNDERLYING_RESOURCES_RESOURCE_TYPE, { + codeDirectory: path.join(__dirname, '..', 'custom-resource-handlers', 'dist', 'aws-synthetics-alpha', 'auto-delete-underlying-resources-handler'), + useCfnResponseWrapper: false, + runtime: core_1.CustomResourceProviderRuntime.NODEJS_18_X, + description: `Lambda function for auto-deleting underlying resources created by ${this.canaryName}.`, + policyStatements: [{ + Effect: 'Allow', + Action: ['lambda:DeleteFunction'], + Resource: this.lambdaArn(), + }, { + Effect: 'Allow', + Action: ['synthetics:GetCanary'], + Resource: '*', + }], + }); + new core_1.CustomResource(this, 'AutoDeleteUnderlyingResourcesCustomResource', { + resourceType: AUTO_DELETE_UNDERLYING_RESOURCES_RESOURCE_TYPE, + serviceToken: provider.serviceToken, + properties: { + CanaryName: this.canaryName, + }, + }); + // We also tag the canary to record the fact that we want it autodeleted. + // The custom resource will check this tag before actually doing the delete. + // Because tagging and untagging will ALWAYS happen before the CR is deleted, + // we can set `autoDeleteLambda: false` without the removal of the CR emptying + // the lambda as a side effect. + cdk.Tags.of(this._resource).add(AUTO_DELETE_UNDERLYING_RESOURCES_TAG, 'true'); + } + /** + * Access the Connections object + * + * Will fail if not a VPC-enabled Canary + */ + get connections() { + try { + jsiiDeprecationWarnings.print("@aws-cdk/aws-synthetics-alpha.Canary#connections", ""); + } + catch (error) { + if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { + Error.captureStackTrace(error, jsiiDeprecationWarnings.getPropertyDescriptor(this, "connections").get); + } + throw error; + } + if (!this._connections) { + // eslint-disable-next-line max-len + throw new Error('Only VPC-associated Canaries have security groups to manage. Supply the "vpc" parameter when creating the Canary.'); + } + return this._connections; + } + /** + * Measure the Duration of a single canary run, in seconds. + * + * @param options - configuration options for the metric + * + * @default avg over 5 minutes + */ + metricDuration(options) { + try { + jsiiDeprecationWarnings.print("@aws-cdk/aws-synthetics-alpha.Canary#metricDuration", ""); + } + catch (error) { + if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { + Error.captureStackTrace(error, this.metricDuration); + } + throw error; + } + return new aws_cloudwatch_1.Metric({ + ...synthetics_canned_metrics_generated_1.CloudWatchSyntheticsMetrics.durationMaximum({ CanaryName: this.canaryName }), + ...{ statistic: 'Average' }, + ...options, + }).attachTo(this); + } + /** + * Measure the percentage of successful canary runs. + * + * @param options - configuration options for the metric + * + * @default avg over 5 minutes + */ + metricSuccessPercent(options) { + try { + jsiiDeprecationWarnings.print("@aws-cdk/aws-synthetics-alpha.Canary#metricSuccessPercent", ""); + } + catch (error) { + if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { + Error.captureStackTrace(error, this.metricSuccessPercent); + } + throw error; + } + return this.cannedMetric(synthetics_canned_metrics_generated_1.CloudWatchSyntheticsMetrics.successPercentAverage, options); + } + /** + * Measure the number of failed canary runs over a given time period. + * + * Default: sum over 5 minutes + * + * @param options - configuration options for the metric + */ + metricFailed(options) { + try { + jsiiDeprecationWarnings.print("@aws-cdk/aws-synthetics-alpha.Canary#metricFailed", ""); + } + catch (error) { + if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { + Error.captureStackTrace(error, this.metricFailed); + } + throw error; + } + return this.cannedMetric(synthetics_canned_metrics_generated_1.CloudWatchSyntheticsMetrics.failedSum, options); + } + /** + * Returns a default role for the canary + */ + createDefaultRole(props) { + const prefix = props.artifactsBucketLocation?.prefix; + // Created role will need these policies to run the Canary. + // https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-synthetics-canary.html#cfn-synthetics-canary-executionrolearn + const policy = new iam.PolicyDocument({ + statements: [ + new iam.PolicyStatement({ + resources: ['*'], + actions: ['s3:ListAllMyBuckets'], + }), + new iam.PolicyStatement({ + resources: [this.artifactsBucket.bucketArn], + actions: ['s3:GetBucketLocation'], + }), + new iam.PolicyStatement({ + resources: [this.artifactsBucket.arnForObjects(`${prefix ? prefix + '/*' : '*'}`)], + actions: ['s3:PutObject'], + }), + new iam.PolicyStatement({ + resources: ['*'], + actions: ['cloudwatch:PutMetricData'], + conditions: { StringEquals: { 'cloudwatch:namespace': 'CloudWatchSynthetics' } }, + }), + new iam.PolicyStatement({ + resources: [this.logGroupArn()], + actions: ['logs:CreateLogStream', 'logs:CreateLogGroup', 'logs:PutLogEvents'], + }), + ], + }); + const managedPolicies = []; + if (props.vpc) { + // Policy that will have ENI creation permissions + managedPolicies.push(iam.ManagedPolicy.fromAwsManagedPolicyName('service-role/AWSLambdaVPCAccessExecutionRole')); + } + return new iam.Role(this, 'ServiceRole', { + assumedBy: new iam.ServicePrincipal('lambda.amazonaws.com'), + inlinePolicies: { + canaryPolicy: policy, + }, + managedPolicies, + }); + } + logGroupArn() { + return cdk.Stack.of(this).formatArn({ + service: 'logs', + resource: 'log-group', + arnFormat: cdk.ArnFormat.COLON_RESOURCE_NAME, + resourceName: '/aws/lambda/cwsyn-*', + }); + } + lambdaArn() { + return cdk.Stack.of(this).formatArn({ + service: 'lambda', + resource: 'function', + arnFormat: cdk.ArnFormat.COLON_RESOURCE_NAME, + resourceName: 'cwsyn-*', + }); + } + /** + * Returns the code object taken in by the canary resource. + */ + createCode(props) { + this.validateHandler(props.test.handler, props.runtime); + const codeConfig = { + handler: props.test.handler, + ...props.test.code.bind(this, props.test.handler, props.runtime.family), + }; + return { + handler: codeConfig.handler, + script: codeConfig.inlineCode, + s3Bucket: codeConfig.s3Location?.bucketName, + s3Key: codeConfig.s3Location?.objectKey, + s3ObjectVersion: codeConfig.s3Location?.objectVersion, + }; + } + /** + * Verifies that the handler name matches the conventions given a certain runtime. + * + * @see https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-synthetics-canary-code.html#cfn-synthetics-canary-code-handler + * @param handler - the name of the handler + * @param runtime - the runtime version + */ + validateHandler(handler, runtime) { + const oldRuntimes = [ + runtime_1.Runtime.SYNTHETICS_PYTHON_SELENIUM_1_0, + runtime_1.Runtime.SYNTHETICS_NODEJS_PUPPETEER_3_0, + runtime_1.Runtime.SYNTHETICS_NODEJS_PUPPETEER_3_1, + runtime_1.Runtime.SYNTHETICS_NODEJS_PUPPETEER_3_2, + runtime_1.Runtime.SYNTHETICS_NODEJS_PUPPETEER_3_3, + ]; + if (oldRuntimes.includes(runtime)) { + if (!handler.match(/^[0-9A-Za-z_\\-]+\.handler*$/)) { + throw new Error(`Canary Handler must be specified as \'fileName.handler\' for legacy runtimes, received ${handler}`); + } + } + else { + if (!handler.match(/^([0-9a-zA-Z_-]+\/)*[0-9A-Za-z_\\-]+\.[A-Za-z_][A-Za-z0-9_]*$/)) { + throw new Error(`Canary Handler must be specified either as \'fileName.handler\', \'fileName.functionName\', or \'folder/fileName.functionName\', received ${handler}`); + } + } + if (handler.length < 1 || handler.length > 128) { + throw new Error(`Canary Handler length must be between 1 and 128, received ${handler.length}`); + } + } + createRunConfig(props) { + if (!props.environmentVariables) { + return undefined; + } + return { + environmentVariables: props.environmentVariables, + }; + } + /** + * Returns a canary schedule object + */ + createSchedule(props) { + return { + durationInSeconds: String(`${props.timeToLive?.toSeconds() ?? 0}`), + expression: props.schedule?.expressionString ?? 'rate(5 minutes)', + }; + } + createVpcConfig(props) { + if (!props.vpc) { + if (props.vpcSubnets != null || props.securityGroups != null) { + throw new Error("You must provide the 'vpc' prop when using VPC-related properties."); + } + return undefined; + } + const { subnetIds } = props.vpc.selectSubnets(props.vpcSubnets); + if (subnetIds.length < 1) { + throw new Error('No matching subnets found in the VPC.'); + } + let securityGroups; + if (props.securityGroups && props.securityGroups.length > 0) { + securityGroups = props.securityGroups; + } + else { + const securityGroup = new ec2.SecurityGroup(this, 'SecurityGroup', { + vpc: props.vpc, + description: 'Automatic security group for Canary ' + cdk.Names.uniqueId(this), + }); + securityGroups = [securityGroup]; + } + this._connections.addSecurityGroup(...securityGroups); + return { + vpcId: props.vpc.vpcId, + subnetIds, + securityGroupIds: cdk.Lazy.list({ produce: () => this.connections.securityGroups.map(sg => sg.securityGroupId) }), + }; + } + /** + * Creates a unique name for the canary. The generated name is the physical ID of the canary. + */ + generateUniqueName() { + const name = cdk.Names.uniqueId(this).toLowerCase().replace(' ', '-'); + if (name.length <= 21) { + return name; + } + else { + return name.substring(0, 15) + nameHash(name); + } + } + cannedMetric(fn, props) { + return new aws_cloudwatch_1.Metric({ + ...fn({ CanaryName: this.canaryName }), + ...props, + }).attachTo(this); + } +} +exports.Canary = Canary; +_b = JSII_RTTI_SYMBOL_1; +Canary[_b] = { fqn: "@aws-cdk/aws-synthetics-alpha.Canary", version: "0.0.0" }; +/** + * Take a hash of the given name. + * + * @param name the name to be hashed + */ +function nameHash(name) { + const md5 = crypto.createHash('sha256').update(name).digest('hex'); + return md5.slice(0, 6); +} +const nameRegex = /^[0-9a-z_\-]+$/; +/** + * Verifies that the name fits the regex expression: ^[0-9a-z_\-]+$. + * + * @param name - the given name of the canary + */ +function validateName(name) { + if (name.length > 21) { + throw new Error(`Canary name is too large, must be between 1 and 21 characters, but is ${name.length} (got "${name}")`); + } + if (!nameRegex.test(name)) { + throw new Error(`Canary name must be lowercase, numbers, hyphens, or underscores (got "${name}")`); + } +} +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FuYXJ5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiY2FuYXJ5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLGlDQUFpQztBQUNqQywrREFBZ0Y7QUFDaEYsMkNBQTJDO0FBQzNDLDJDQUEyQztBQUMzQyx5Q0FBeUM7QUFDekMsd0NBQXdDO0FBR3hDLHVDQUFvQztBQUVwQyw0SEFBaUg7QUFDakgsK0RBQXVEO0FBQ3ZELDJDQUF5RztBQUN6Ryw2QkFBNkI7QUFFN0IsTUFBTSw4Q0FBOEMsR0FBRyxpREFBaUQsQ0FBQztBQUN6RyxNQUFNLG9DQUFvQyxHQUFHLDBDQUEwQyxDQUFDO0FBRXhGOztHQUVHO0FBQ0gsTUFBYSxJQUFJO0lBQ2Y7Ozs7O09BS0c7SUFDSSxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQTBCOzs7Ozs7Ozs7OztRQUM3QyxPQUFPLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0tBQ2hEO0lBRUQ7Ozs7O09BS0c7SUFDSCxZQUFvQyxJQUFVLEVBQWtCLE9BQWU7UUFBM0MsU0FBSSxHQUFKLElBQUksQ0FBTTtRQUFrQixZQUFPLEdBQVAsT0FBTyxDQUFRO0tBQzlFOztBQWxCSCxvQkFtQkM7OztBQWlCRDs7O0dBR0c7QUFDSCxJQUFZLE9BYVg7QUFiRCxXQUFZLE9BQU87SUFDakI7OztPQUdHO0lBQ0gsOEJBQW1CLENBQUE7SUFFbkI7Ozs7T0FJRztJQUNILDRCQUFpQixDQUFBO0FBQ25CLENBQUMsRUFiVyxPQUFPLHVCQUFQLE9BQU8sUUFhbEI7QUEwS0Q7O0dBRUc7QUFDSCxNQUFhLE1BQU8sU0FBUSxHQUFHLENBQUMsUUFBUTtJQXNDdEMsWUFBbUIsS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBa0I7Ozs7Ozs7K0NBdEN4RCxNQUFNOzs7O1FBdUNmLElBQUksS0FBSyxDQUFDLFVBQVUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsWUFBWSxD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SUFDaEMsSUFBSSxJQUFJLENBQUMsTUFBTSxHQUFHLEVBQUUsRUFBRTtRQUNwQixNQUFNLElBQUksS0FBSyxDQUFDLHlFQUF5RSxJQUFJLENBQUMsTUFBTSxVQUFVLElBQUksSUFBSSxDQUFDLENBQUM7S0FDekg7SUFDRCxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRTtRQUN6QixNQUFNLElBQUksS0FBSyxDQUFDLHlFQUF5RSxJQUFJLElBQUksQ0FBQyxDQUFDO0tBQ3BHO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGNyeXB0byBmcm9tICdjcnlwdG8nO1xuaW1wb3J0IHsgTWV0cmljLCBNZXRyaWNPcHRpb25zLCBNZXRyaWNQcm9wcyB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1jbG91ZHdhdGNoJztcbmltcG9ydCAqIGFzIGVjMiBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZWMyJztcbmltcG9ydCAqIGFzIGlhbSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtaWFtJztcbmltcG9ydCAqIGFzIHMzIGZyb20gJ2F3cy1jZGstbGliL2F3cy1zMyc7XG5pbXBvcnQgKiBhcyBjZGsgZnJvbSAnYXdzLWNkay1saWIvY29yZSc7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCB7IENvZGUgfSBmcm9tICcuL2NvZGUnO1xuaW1wb3J0IHsgUnVudGltZSB9IGZyb20gJy4vcnVudGltZSc7XG5pbXBvcnQgeyBTY2hlZHVsZSB9IGZyb20gJy4vc2NoZWR1bGUnO1xuaW1wb3J0IHsgQ2xvdWRXYXRjaFN5bnRoZXRpY3NNZXRyaWNzIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLXN5bnRoZXRpY3MvbGliL3N5bnRoZXRpY3MtY2FubmVkLW1ldHJpY3MuZ2VuZXJhdGVkJztcbmltcG9ydCB7IENmbkNhbmFyeSB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1zeW50aGV0aWNzJztcbmltcG9ydCB7IEN1c3RvbVJlc291cmNlLCBDdXN0b21SZXNvdXJjZVByb3ZpZGVyLCBDdXN0b21SZXNvdXJjZVByb3ZpZGVyUnVudGltZSB9IGZyb20gJ2F3cy1jZGstbGliL2NvcmUnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcblxuY29uc3QgQVVUT19ERUxFVEVfVU5ERVJMWUlOR19SRVNPVVJDRVNfUkVTT1VSQ0VfVFlQRSA9ICdDdXN0b206OlN5bnRoZXRpY3NBdXRvRGVsZXRlVW5kZXJseWluZ1Jlc291cmNlcyc7XG5jb25zdCBBVVRPX0RFTEVURV9VTkRFUkxZSU5HX1JFU09VUkNFU19UQUcgPSAnYXdzLWNkazphdXRvLWRlbGV0ZS11bmRlcmx5aW5nLXJlc291cmNlcyc7XG5cbi8qKlxuICogU3BlY2lmeSBhIHRlc3QgdGhhdCB0aGUgY2FuYXJ5IHNob3VsZCBydW5cbiAqL1xuZXhwb3J0IGNsYXNzIFRlc3Qge1xuICAvKipcbiAgICogU3BlY2lmeSBhIGN1c3RvbSB0ZXN0IHdpdGggeW91ciBvd24gY29kZVxuICAgKlxuICAgKiBAcmV0dXJucyBgVGVzdGAgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQgQ29kZSBvYmplY3RcbiAgICogQHBhcmFtIG9wdGlvbnMgVGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9uc1xuICAgKi9cbiAgcHVibGljIHN0YXRpYyBjdXN0b20ob3B0aW9uczogQ3VzdG9tVGVzdE9wdGlvbnMpOiBUZXN0IHtcbiAgICByZXR1cm4gbmV3IFRlc3Qob3B0aW9ucy5jb2RlLCBvcHRpb25zLmhhbmRsZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdCBhIFRlc3QgcHJvcGVydHlcbiAgICpcbiAgICogQHBhcmFtIGNvZGUgVGhlIGNvZGUgdGhhdCB0aGUgY2FuYXJ5IHNob3VsZCBydW5cbiAgICogQHBhcmFtIGhhbmRsZXIgVGhlIGhhbmRsZXIgb2YgdGhlIGNhbmFyeVxuICAgKi9cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihwdWJsaWMgcmVhZG9ubHkgY29kZTogQ29kZSwgcHVibGljIHJlYWRvbmx5IGhhbmRsZXI6IHN0cmluZykge1xuICB9XG59XG5cbi8qKlxuICogUHJvcGVydGllcyBmb3Igc3BlY2lmeWluZyBhIHRlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDdXN0b21UZXN0T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgY29kZSBvZiB0aGUgY2FuYXJ5IHNjcmlwdFxuICAgKi9cbiAgcmVhZG9ubHkgY29kZTogQ29kZSxcblxuICAvKipcbiAgICogVGhlIGhhbmRsZXIgZm9yIHRoZSBjb2RlLiBNdXN0IGVuZCB3aXRoIGAuaGFuZGxlcmAuXG4gICAqL1xuICByZWFkb25seSBoYW5kbGVyOiBzdHJpbmcsXG59XG5cbi8qKlxuICogRGlmZmVyZW50IHdheXMgdG8gY2xlYW4gdXAgdW5kZXJseWluZyBDYW5hcnkgcmVzb3VyY2VzXG4gKiB3aGVuIHRoZSBDYW5hcnkgaXMgZGVsZXRlZC5cbiAqL1xuZXhwb3J0IGVudW0gQ2xlYW51cCB7XG4gIC8qKlxuICAgKiBDbGVhbiB1cCBub3RoaW5nLiBUaGUgdXNlciBpcyByZXNwb25zaWJsZSBmb3IgY2xlYW5pbmcgdXBcbiAgICogYWxsIHJlc291cmNlcyBsZWZ0IGJlaGluZCBieSB0aGUgQ2FuYXJ5LlxuICAgKi9cbiAgTk9USElORyA9ICdub3RoaW5nJyxcblxuICAvKipcbiAgICogQ2xlYW4gdXAgdGhlIHVuZGVybHlpbmcgTGFtYmRhIGZ1bmN0aW9uIG9ubHkuIFRoZSB1c2VyIGlzXG4gICAqIHJlc3BvbnNpYmxlIGZvciBjbGVhbmluZyB1cCBhbGwgb3RoZXIgcmVzb3VyY2VzIGxlZnQgYmVoaW5kXG4gICAqIGJ5IHRoZSBDYW5hcnkuXG4gICAqL1xuICBMQU1CREEgPSAnbGFtYmRhJyxcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBzcGVjaWZ5aW5nIHRoZSBzMyBsb2NhdGlvbiB0aGF0IHN0b3JlcyB0aGUgZGF0YSBvZiBlYWNoIGNhbmFyeSBydW4uIFRoZSBhcnRpZmFjdHMgYnVja2V0IGxvY2F0aW9uICoqY2Fubm90KipcbiAqIGJlIHVwZGF0ZWQgb25jZSB0aGUgY2FuYXJ5IGlzIGNyZWF0ZWQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXJ0aWZhY3RzQnVja2V0TG9jYXRpb24ge1xuICAvKipcbiAgICogVGhlIHMzIGxvY2F0aW9uIHRoYXQgc3RvcmVzIHRoZSBkYXRhIG9mIGVhY2ggcnVuLlxuICAgKi9cbiAgcmVhZG9ubHkgYnVja2V0OiBzMy5JQnVja2V0O1xuXG4gIC8qKlxuICAgKiBUaGUgUzMgYnVja2V0IHByZWZpeC4gU3BlY2lmeSB0aGlzIGlmIHlvdSB3YW50IGEgbW9yZSBzcGVjaWZpYyBwYXRoIHdpdGhpbiB0aGUgYXJ0aWZhY3RzIGJ1Y2tldC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBwcmVmaXhcbiAgICovXG4gIHJlYWRvbmx5IHByZWZpeD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBhIGNhbmFyeVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENhbmFyeVByb3BzIHtcbiAgLyoqXG4gICAqIFRoZSBzMyBsb2NhdGlvbiB0aGF0IHN0b3JlcyB0aGUgZGF0YSBvZiB0aGUgY2FuYXJ5IHJ1bnMuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gQSBuZXcgczMgYnVja2V0IHdpbGwgYmUgY3JlYXRlZCB3aXRob3V0IGEgcHJlZml4LlxuICAgKi9cbiAgcmVhZG9ubHkgYXJ0aWZhY3RzQnVja2V0TG9jYXRpb24/OiBBcnRpZmFjdHNCdWNrZXRMb2NhdGlvbjtcblxuICAvKipcbiAgICogQ2FuYXJ5IGV4ZWN1dGlvbiByb2xlLlxuICAgKlxuICAgKiBUaGlzIGlzIHRoZSByb2xlIHRoYXQgd2lsbCBiZSBhc3N1bWVkIGJ5IHRoZSBjYW5hcnkgdXBvbiBleGVjdXRpb24uXG4gICAqIEl0IGNvbnRyb2xzIHRoZSBwZXJtaXNzaW9ucyB0aGF0IHRoZSBjYW5hcnkgd2lsbCBoYXZlLiBUaGUgcm9sZSBtdXN0XG4gICAqIGJlIGFzc3VtYWJsZSBieSB0aGUgQVdTIExhbWJkYSBzZXJ2aWNlIHByaW5jaXBhbC5cbiAgICpcbiAgICogSWYgbm90IHN1cHBsaWVkLCBhIHJvbGUgd2lsbCBiZSBjcmVhdGVkIHdpdGggYWxsIHRoZSByZXF1aXJlZCBwZXJtaXNzaW9ucy5cbiAgICogSWYgeW91IHByb3ZpZGUgYSBSb2xlLCB5b3UgbXVzdCBhZGQgdGhlIHJlcXVpcmVkIHBlcm1pc3Npb25zLlxuICAgKlxuICAgKiBAc2VlIHJlcXVpcmVkIHBlcm1pc3Npb25zOiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTQ2xvdWRGb3JtYXRpb24vbGF0ZXN0L1VzZXJHdWlkZS9hd3MtcmVzb3VyY2Utc3ludGhldGljcy1jYW5hcnkuaHRtbCNjZm4tc3ludGhldGljcy1jYW5hcnktZXhlY3V0aW9ucm9sZWFyblxuICAgKlxuICAgKiBAZGVmYXVsdCAtIEEgdW5pcXVlIHJvbGUgd2lsbCBiZSBnZW5lcmF0ZWQgZm9yIHRoaXMgY2FuYXJ5LlxuICAgKiBZb3UgY2FuIGFkZCBwZXJtaXNzaW9ucyB0byByb2xlcyBieSBjYWxsaW5nICdhZGRUb1JvbGVQb2xpY3knLlxuICAgKi9cbiAgcmVhZG9ubHkgcm9sZT86IGlhbS5JUm9sZTtcblxuICAvKipcbiAgICogSG93IGxvbmcgdGhlIGNhbmFyeSB3aWxsIGJlIGluIGEgJ1JVTk5JTkcnIHN0YXRlLiBGb3IgZXhhbXBsZSwgaWYgeW91IHNldCBgdGltZVRvTGl2ZWAgdG8gYmUgMSBob3VyIGFuZCBgc2NoZWR1bGVgIHRvIGJlIGByYXRlKDEwIG1pbnV0ZXMpYCxcbiAgICogeW91ciBjYW5hcnkgd2lsbCBydW4gYXQgMTAgbWludXRlIGludGVydmFscyBmb3IgYW4gaG91ciwgZm9yIGEgdG90YWwgb2YgNiB0aW1lcy5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBsaW1pdFxuICAgKi9cbiAgcmVhZG9ubHkgdGltZVRvTGl2ZT86IGNkay5EdXJhdGlvbjtcblxuICAvKipcbiAgICogU3BlY2lmeSB0aGUgc2NoZWR1bGUgZm9yIGhvdyBvZnRlbiB0aGUgY2FuYXJ5IHJ1bnMuIEZvciBleGFtcGxlLCBpZiB5b3Ugc2V0IGBzY2hlZHVsZWAgdG8gYHJhdGUoMTAgbWludXRlcylgLCB0aGVuIHRoZSBjYW5hcnkgd2lsbCBydW4gZXZlcnkgMTAgbWludXRlcy5cbiAgICogWW91IGNhbiBzZXQgdGhlIHNjaGVkdWxlIHdpdGggYFNjaGVkdWxlLnJhdGUoRHVyYXRpb24pYCAocmVjb21tZW5kZWQpIG9yIHlvdSBjYW4gc3BlY2lmeSBhbiBleHByZXNzaW9uIHVzaW5nIGBTY2hlZHVsZS5leHByZXNzaW9uKClgLlxuICAgKiBAZGVmYXVsdCAncmF0ZSg1IG1pbnV0ZXMpJ1xuICAgKi9cbiAgcmVhZG9ubHkgc2NoZWR1bGU/OiBTY2hlZHVsZTtcblxuICAvKipcbiAgICogV2hldGhlciBvciBub3QgdGhlIGNhbmFyeSBzaG91bGQgc3RhcnQgYWZ0ZXIgY3JlYXRpb24uXG4gICAqXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHJlYWRvbmx5IHN0YXJ0QWZ0ZXJDcmVhdGlvbj86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEhvdyBtYW55IGRheXMgc2hvdWxkIHN1Y2Nlc3NmdWwgcnVucyBiZSByZXRhaW5lZC5cbiAgICpcbiAgICogQGRlZmF1bHQgRHVyYXRpb24uZGF5cygzMSlcbiAgICovXG4gIHJlYWRvbmx5IHN1Y2Nlc3NSZXRlbnRpb25QZXJpb2Q/OiBjZGsuRHVyYXRpb247XG5cbiAgLyoqXG4gICAqIEhvdyBtYW55IGRheXMgc2hvdWxkIGZhaWxlZCBydW5zIGJlIHJldGFpbmVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCBEdXJhdGlvbi5kYXlzKDMxKVxuICAgKi9cbiAgcmVhZG9ubHkgZmFpbHVyZVJldGVudGlvblBlcmlvZD86IGNkay5EdXJhdGlvbjtcblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIGNhbmFyeS4gQmUgc3VyZSB0byBnaXZlIGl0IGEgZGVzY3JpcHRpdmUgbmFtZSB0aGF0IGRpc3Rpbmd1aXNoZXMgaXQgZnJvbVxuICAgKiBvdGhlciBjYW5hcmllcyBpbiB5b3VyIGFjY291bnQuXG4gICAqXG4gICAqIERvIG5vdCBpbmNsdWRlIHNlY3JldHMgb3IgcHJvcHJpZXRhcnkgaW5mb3JtYXRpb24gaW4geW91ciBjYW5hcnkgbmFtZS4gVGhlIGNhbmFyeSBuYW1lXG4gICAqIG1ha2VzIHVwIHBhcnQgb2YgdGhlIGNhbmFyeSBBUk4sIHdoaWNoIGlzIGluY2x1ZGVkIGluIG91dGJvdW5kIGNhbGxzIG92ZXIgdGhlIGludGVybmV0LlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZFdhdGNoL2xhdGVzdC9tb25pdG9yaW5nL3NlcnZpY2VsZW5zX2NhbmFyaWVzX3NlY3VyaXR5Lmh0bWxcbiAgICpcbiAgICogQGRlZmF1bHQgLSBBIHVuaXF1ZSBuYW1lIHdpbGwgYmUgZ2VuZXJhdGVkIGZyb20gdGhlIGNvbnN0cnVjdCBJRFxuICAgKi9cbiAgcmVhZG9ubHkgY2FuYXJ5TmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogU3BlY2lmeSB0aGUgcnVudGltZSB2ZXJzaW9uIHRvIHVzZSBmb3IgdGhlIGNhbmFyeS5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRXYXRjaC9sYXRlc3QvbW9uaXRvcmluZy9DbG91ZFdhdGNoX1N5bnRoZXRpY3NfQ2FuYXJpZXNfTGlicmFyeS5odG1sXG4gICAqL1xuICByZWFkb25seSBydW50aW1lOiBSdW50aW1lO1xuXG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiB0ZXN0IHRoYXQgeW91IHdhbnQgeW91ciBjYW5hcnkgdG8gcnVuLiBVc2UgYFRlc3QuY3VzdG9tKClgIHRvIHNwZWNpZnkgdGhlIHRlc3QgdG8gcnVuLlxuICAgKi9cbiAgcmVhZG9ubHkgdGVzdDogVGVzdDtcblxuICAvKipcbiAgICogS2V5LXZhbHVlIHBhaXJzIHRoYXQgdGhlIFN5bnRoZXRpY3MgY2FjaGVzIGFuZCBtYWtlcyBhdmFpbGFibGUgZm9yIHlvdXIgY2FuYXJ5IHNjcmlwdHMuIFVzZSBlbnZpcm9ubWVudCB2YXJpYWJsZXNcbiAgICogdG8gYXBwbHkgY29uZmlndXJhdGlvbiBjaGFuZ2VzLCBzdWNoIGFzIHRlc3QgYW5kIHByb2R1Y3Rpb24gZW52aXJvbm1lbnQgY29uZmlndXJhdGlvbnMsIHdpdGhvdXQgY2hhbmdpbmcgeW91clxuICAgKiBDYW5hcnkgc2NyaXB0IHNvdXJjZSBjb2RlLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIGVudmlyb25tZW50IHZhcmlhYmxlcy5cbiAgICovXG4gIHJlYWRvbmx5IGVudmlyb25tZW50VmFyaWFibGVzPzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfTtcblxuICAvKipcbiAgICogVGhlIFZQQyB3aGVyZSB0aGlzIGNhbmFyeSBpcyBydW4uXG4gICAqXG4gICAqIFNwZWNpZnkgdGhpcyBpZiB0aGUgY2FuYXJ5IG5lZWRzIHRvIGFjY2VzcyByZXNvdXJjZXMgaW4gYSBWUEMuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm90IGluIFZQQ1xuICAgKi9cbiAgcmVhZG9ubHkgdnBjPzogZWMyLklWcGM7XG5cbiAgLyoqXG4gICAqIFdoZXJlIHRvIHBsYWNlIHRoZSBuZXR3b3JrIGludGVyZmFjZXMgd2l0aGluIHRoZSBWUEMuIFlvdSBtdXN0IHByb3ZpZGUgYHZwY2Agd2hlbiB1c2luZyB0aGlzIHByb3AuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdGhlIFZwYyBkZWZhdWx0IHN0cmF0ZWd5IGlmIG5vdCBzcGVjaWZpZWRcbiAgICovXG4gIHJlYWRvbmx5IHZwY1N1Ym5ldHM/OiBlYzIuU3VibmV0U2VsZWN0aW9uO1xuXG4gIC8qKlxuICAgKiBUaGUgbGlzdCBvZiBzZWN1cml0eSBncm91cHMgdG8gYXNzb2NpYXRlIHdpdGggdGhlIGNhbmFyeSdzIG5ldHdvcmsgaW50ZXJmYWNlcy4gWW91IG11c3QgcHJvdmlkZSBgdnBjYCB3aGVuIHVzaW5nIHRoaXMgcHJvcC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBJZiB0aGUgY2FuYXJ5IGlzIHBsYWNlZCB3aXRoaW4gYSBWUEMgYW5kIGEgc2VjdXJpdHkgZ3JvdXAgaXNcbiAgICogbm90IHNwZWNpZmllZCBhIGRlZGljYXRlZCBzZWN1cml0eSBncm91cCB3aWxsIGJlIGNyZWF0ZWQgZm9yIHRoaXMgY2FuYXJ5LlxuICAgKi9cbiAgcmVhZG9ubHkgc2VjdXJpdHlHcm91cHM/OiBlYzIuSVNlY3VyaXR5R3JvdXBbXTtcblxuICAvKipcbiAgICogV2hldGhlciBvciBub3QgdG8gZGVsZXRlIHRoZSBsYW1iZGEgcmVzb3VyY2VzIHdoZW4gdGhlIGNhbmFyeSBpcyBkZWxldGVkXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0Nsb3VkRm9ybWF0aW9uL2xhdGVzdC9Vc2VyR3VpZGUvYXdzLXJlc291cmNlLXN5bnRoZXRpY3MtY2FuYXJ5Lmh0bWwjY2ZuLXN5bnRoZXRpY3MtY2FuYXJ5LWRlbGV0ZWxhbWJkYXJlc291cmNlc29uY2FuYXJ5ZGVsZXRpb25cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICogQGRlcHJlY2F0ZWQgdGhpcyBmZWF0dXJlIGhhcyBiZWVuIGRlcHJlY2F0ZWQgYnkgdGhlIHNlcnZpY2UgdGVhbSwgdXNlIGBjbGVhbnVwOiBDbGVhbnVwLkxBTUJEQWAgaW5zdGVhZCB3aGljaCB3aWxsIHVzZSBhIEN1c3RvbSBSZXNvdXJjZSB0byBhY2hpZXZlIHRoZSBzYW1lIGVmZmVjdC5cbiAgICovXG4gIHJlYWRvbmx5IGVuYWJsZUF1dG9EZWxldGVMYW1iZGFzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogU3BlY2lmeSB0aGUgdW5kZXJseWluZyByZXNvdXJjZXMgdG8gYmUgY2xlYW5lZCB1cCB3aGVuIHRoZSBjYW5hcnkgaXMgZGVsZXRlZC5cbiAgICogVXNpbmcgYENsZWFudXAuTEFNQkRBYCB3aWxsIGNyZWF0ZSBhIEN1c3RvbSBSZXNvdXJjZSB0byBhY2hpZXZlIHRoaXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IENsZWFudXAuTk9USElOR1xuICAgKi9cbiAgcmVhZG9ubHkgY2xlYW51cD86IENsZWFudXA7XG5cbiAgLyoqXG4gICAqIExpZmVjeWNsZSBydWxlcyBmb3IgdGhlIGdlbmVyYXRlZCBjYW5hcnkgYXJ0aWZhY3QgYnVja2V0LiBIYXMgbm8gZWZmZWN0XG4gICAqIGlmIGEgYnVja2V0IGlzIHBhc3NlZCB0byBgYXJ0aWZhY3RzQnVja2V0TG9jYXRpb25gLiBJZiB5b3UgcGFzcyBhIGJ1Y2tldFxuICAgKiB0byBgYXJ0aWZhY3RzQnVja2V0TG9jYXRpb25gLCB5b3UgY2FuIGFkZCBsaWZlY3ljbGUgcnVsZXMgdG8gdGhlIGJ1Y2tldFxuICAgKiBpdHNlbGYuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gcnVsZXMgYXBwbGllZCB0byB0aGUgZ2VuZXJhdGVkIGJ1Y2tldC5cbiAgICovXG4gIHJlYWRvbmx5IGFydGlmYWN0c0J1Y2tldExpZmVjeWNsZVJ1bGVzPzogQXJyYXk8czMuTGlmZWN5Y2xlUnVsZT47XG59XG5cbi8qKlxuICogRGVmaW5lIGEgbmV3IENhbmFyeVxuICovXG5leHBvcnQgY2xhc3MgQ2FuYXJ5IGV4dGVuZHMgY2RrLlJlc291cmNlIGltcGxlbWVudHMgZWMyLklDb25uZWN0YWJsZSB7XG4gIC8qKlxuICAgKiBFeGVjdXRpb24gcm9sZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBDYW5hcnkuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcm9sZTogaWFtLklSb2xlO1xuXG4gIC8qKlxuICAgKiBUaGUgY2FuYXJ5IElEXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBjYW5hcnlJZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgc3RhdGUgb2YgdGhlIGNhbmFyeS4gRm9yIGV4YW1wbGUsICdSVU5OSU5HJywgJ1NUT1BQRUQnLCAnTk9UIFNUQVJURUQnLCBvciAnRVJST1InLlxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgY2FuYXJ5U3RhdGU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGNhbmFyeSBOYW1lXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBjYW5hcnlOYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEJ1Y2tldCB3aGVyZSBkYXRhIGZyb20gZWFjaCBjYW5hcnkgcnVuIGlzIHN0b3JlZC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBhcnRpZmFjdHNCdWNrZXQ6IHMzLklCdWNrZXQ7XG5cbiAgLyoqXG4gICAqIEFjdHVhbCBjb25uZWN0aW9ucyBvYmplY3QgZm9yIHRoZSB1bmRlcmx5aW5nIExhbWJkYVxuICAgKlxuICAgKiBNYXkgYmUgdW5zZXQsIGluIHdoaWNoIGNhc2UgdGhlIGNhbmFyeSBMYW1iZGEgaXMgbm90IGNvbmZpZ3VyZWQgZm9yIHVzZSBpbiBhIFZQQy5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9jb25uZWN0aW9ucz86IGVjMi5Db25uZWN0aW9ucztcbiAgcHJpdmF0ZSByZWFkb25seSBfcmVzb3VyY2U6IENmbkNhbmFyeTtcblxuICBwdWJsaWMgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IENhbmFyeVByb3BzKSB7XG4gICAgaWYgKHByb3BzLmNhbmFyeU5hbWUgJiYgIWNkay5Ub2tlbi5pc1VucmVzb2x2ZWQocHJvcHMuY2FuYXJ5TmFtZSkpIHtcbiAgICAgIHZhbGlkYXRlTmFtZShwcm9wcy5jYW5hcnlOYW1lKTtcbiAgICB9XG5cbiAgICBzdXBlcihzY29wZSwgaWQsIHtcbiAgICAgIHBoeXNpY2FsTmFtZTogcHJvcHMuY2FuYXJ5TmFtZSB8fCBjZGsuTGF6eS5zdHJpbmcoe1xuICAgICAgICBwcm9kdWNlOiAoKSA9PiB0aGlzLmdlbmVyYXRlVW5pcXVlTmFtZSgpLFxuICAgICAgfSksXG4gICAgfSk7XG5cbiAgICB0aGlzLmFydGlmYWN0c0J1Y2tldCA9IHByb3BzLmFydGlmYWN0c0J1Y2tldExvY2F0aW9uPy5idWNrZXQgPz8gbmV3IHMzLkJ1Y2tldCh0aGlzLCAnQXJ0aWZhY3RzQnVja2V0Jywge1xuICAgICAgZW5jcnlwdGlvbjogczMuQnVja2V0RW5jcnlwdGlvbi5LTVNfTUFOQUdFRCxcbiAgICAgIGVuZm9yY2VTU0w6IHRydWUsXG4gICAgICBsaWZlY3ljbGVSdWxlczogcHJvcHMuYXJ0aWZhY3RzQnVja2V0TGlmZWN5Y2xlUnVsZXMsXG4gICAgfSk7XG5cbiAgICB0aGlzLnJvbGUgPSBwcm9wcy5yb2xlID8/IHRoaXMuY3JlYXRlRGVmYXVsdFJvbGUocHJvcHMpO1xuXG4gICAgaWYgKHByb3BzLnZwYykge1xuICAgICAgLy8gU2VjdXJpdHkgR3JvdXBzIGFyZSBjcmVhdGVkIGFuZC9vciBhcHBlbmRlZCBpbiBgY3JlYXRlVnBjQ29uZmlnYC5cbiAgICAgIHRoaXMuX2Nvbm5lY3Rpb25zID0gbmV3IGVjMi5Db25uZWN0aW9ucyh7fSk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzb3VyY2U6IENmbkNhbmFyeSA9IG5ldyBDZm5DYW5hcnkodGhpcywgJ1Jlc291cmNlJywge1xuICAgICAgYXJ0aWZhY3RTM0xvY2F0aW9uOiB0aGlzLmFydGlmYWN0c0J1Y2tldC5zM1VybEZvck9iamVjdChwcm9wcy5hcnRpZmFjdHNCdWNrZXRMb2NhdGlvbj8ucHJlZml4KSxcbiAgICAgIGV4ZWN1dGlvblJvbGVBcm46IHRoaXMucm9sZS5yb2xlQXJuLFxuICAgICAgc3RhcnRDYW5hcnlBZnRlckNyZWF0aW9uOiBwcm9wcy5zdGFydEFmdGVyQ3JlYXRpb24gPz8gdHJ1ZSxcbiAgICAgIHJ1bnRpbWVWZXJzaW9uOiBwcm9wcy5ydW50aW1lLm5hbWUsXG4gICAgICBuYW1lOiB0aGlzLnBoeXNpY2FsTmFtZSxcbiAgICAgIHNjaGVkdWxlOiB0aGlzLmNyZWF0ZVNjaGVkdWxlKHByb3BzKSxcbiAgICAgIGZhaWx1cmVSZXRlbnRpb25QZXJpb2Q6IHByb3BzLmZhaWx1cmVSZXRlbnRpb25QZXJpb2Q/LnRvRGF5cygpLFxuICAgICAgc3VjY2Vzc1JldGVudGlvblBlcmlvZDogcHJvcHMuc3VjY2Vzc1JldGVudGlvblBlcmlvZD8udG9EYXlzKCksXG4gICAgICBjb2RlOiB0aGlzLmNyZWF0ZUNvZGUocHJvcHMpLFxuICAgICAgcnVuQ29uZmlnOiB0aGlzLmNyZWF0ZVJ1bkNvbmZpZyhwcm9wcyksXG4gICAgICB2cGNDb25maWc6IHRoaXMuY3JlYXRlVnBjQ29uZmlnKHByb3BzKSxcbiAgICB9KTtcbiAgICB0aGlzLl9yZXNvdXJjZSA9IHJlc291cmNlO1xuXG4gICAgdGhpcy5jYW5hcnlJZCA9IHJlc291cmNlLmF0dHJJZDtcbiAgICB0aGlzLmNhbmFyeVN0YXRlID0gcmVzb3VyY2UuYXR0clN0YXRlO1xuICAgIHRoaXMuY2FuYXJ5TmFtZSA9IHRoaXMuZ2V0UmVzb3VyY2VOYW1lQXR0cmlidXRlKHJlc291cmNlLnJlZik7XG5cbiAgICBpZiAocHJvcHMuY2xlYW51cCA9PT0gQ2xlYW51cC5MQU1CREEgPz8gcHJvcHMuZW5hYmxlQXV0b0RlbGV0ZUxhbWJkYXMpIHtcbiAgICAgIHRoaXMuY2xlYW51cFVuZGVybHlpbmdSZXNvdXJjZXMoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNsZWFudXBVbmRlcmx5aW5nUmVzb3VyY2VzKCkge1xuICAgIGNvbnN0IHByb3ZpZGVyID0gQ3VzdG9tUmVzb3VyY2VQcm92aWRlci5nZXRPckNyZWF0ZVByb3ZpZGVyKHRoaXMsIEFVVE9fREVMRVRFX1VOREVSTFlJTkdfUkVTT1VSQ0VTX1JFU09VUkNFX1RZUEUsIHtcbiAgICAgIGNvZGVEaXJlY3Rvcnk6IHBhdGguam9pbihfX2Rpcm5hbWUsICcuLicsICdjdXN0b20tcmVzb3VyY2UtaGFuZGxlcnMnLCAnZGlzdCcsICdhd3Mtc3ludGhldGljcy1hbHBoYScsICdhdXRvLWRlbGV0ZS11bmRlcmx5aW5nLXJlc291cmNlcy1oYW5kbGVyJyksXG4gICAgICB1c2VDZm5SZXNwb25zZVdyYXBwZXI6IGZhbHNlLFxuICAgICAgcnVudGltZTogQ3VzdG9tUmVzb3VyY2VQcm92aWRlclJ1bnRpbWUuTk9ERUpTXzE4X1gsXG4gICAgICBkZXNjcmlwdGlvbjogYExhbWJkYSBmdW5jdGlvbiBmb3IgYXV0by1kZWxldGluZyB1bmRlcmx5aW5nIHJlc291cmNlcyBjcmVhdGVkIGJ5ICR7dGhpcy5jYW5hcnlOYW1lfS5gLFxuICAgICAgcG9saWN5U3RhdGVtZW50czogW3tcbiAgICAgICAgRWZmZWN0OiAnQWxsb3cnLFxuICAgICAgICBBY3Rpb246IFsnbGFtYmRhOkRlbGV0ZUZ1bmN0aW9uJ10sXG4gICAgICAgIFJlc291cmNlOiB0aGlzLmxhbWJkYUFybigpLFxuICAgICAgfSwge1xuICAgICAgICBFZmZlY3Q6ICdBbGxvdycsXG4gICAgICAgIEFjdGlvbjogWydzeW50aGV0aWNzOkdldENhbmFyeSddLFxuICAgICAgICBSZXNvdXJjZTogJyonLFxuICAgICAgfV0sXG4gICAgfSk7XG5cbiAgICBuZXcgQ3VzdG9tUmVzb3VyY2UodGhpcywgJ0F1dG9EZWxldGVVbmRlcmx5aW5nUmVzb3VyY2VzQ3VzdG9tUmVzb3VyY2UnLCB7XG4gICAgICByZXNvdXJjZVR5cGU6IEFVVE9fREVMRVRFX1VOREVSTFlJTkdfUkVTT1VSQ0VTX1JFU09VUkNFX1RZUEUsXG4gICAgICBzZXJ2aWNlVG9rZW46IHByb3ZpZGVyLnNlcnZpY2VUb2tlbixcbiAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgQ2FuYXJ5TmFtZTogdGhpcy5jYW5hcnlOYW1lLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIC8vIFdlIGFsc28gdGFnIHRoZSBjYW5hcnkgdG8gcmVjb3JkIHRoZSBmYWN0IHRoYXQgd2Ugd2FudCBpdCBhdXRvZGVsZXRlZC5cbiAgICAvLyBUaGUgY3VzdG9tIHJlc291cmNlIHdpbGwgY2hlY2sgdGhpcyB0YWcgYmVmb3JlIGFjdHVhbGx5IGRvaW5nIHRoZSBkZWxldGUuXG4gICAgLy8gQmVjYXVzZSB0YWdnaW5nIGFuZCB1bnRhZ2dpbmcgd2lsbCBBTFdBWVMgaGFwcGVuIGJlZm9yZSB0aGUgQ1IgaXMgZGVsZXRlZCxcbiAgICAvLyB3ZSBjYW4gc2V0IGBhdXRvRGVsZXRlTGFtYmRhOiBmYWxzZWAgd2l0aG91dCB0aGUgcmVtb3ZhbCBvZiB0aGUgQ1IgZW1wdHlpbmdcbiAgICAvLyB0aGUgbGFtYmRhIGFzIGEgc2lkZSBlZmZlY3QuXG4gICAgY2RrLlRhZ3Mub2YodGhpcy5fcmVzb3VyY2UpLmFkZChBVVRPX0RFTEVURV9VTkRFUkxZSU5HX1JFU09VUkNFU19UQUcsICd0cnVlJyk7XG4gIH1cblxuICAvKipcbiAgICogQWNjZXNzIHRoZSBDb25uZWN0aW9ucyBvYmplY3RcbiAgICpcbiAgICogV2lsbCBmYWlsIGlmIG5vdCBhIFZQQy1lbmFibGVkIENhbmFyeVxuICAgKi9cbiAgcHVibGljIGdldCBjb25uZWN0aW9ucygpOiBlYzIuQ29ubmVjdGlvbnMge1xuICAgIGlmICghdGhpcy5fY29ubmVjdGlvbnMpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBtYXgtbGVuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ09ubHkgVlBDLWFzc29jaWF0ZWQgQ2FuYXJpZXMgaGF2ZSBzZWN1cml0eSBncm91cHMgdG8gbWFuYWdlLiBTdXBwbHkgdGhlIFwidnBjXCIgcGFyYW1ldGVyIHdoZW4gY3JlYXRpbmcgdGhlIENhbmFyeS4nKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2Nvbm5lY3Rpb25zO1xuICB9XG5cbiAgLyoqXG4gICAqIE1lYXN1cmUgdGhlIER1cmF0aW9uIG9mIGEgc2luZ2xlIGNhbmFyeSBydW4sIGluIHNlY29uZHMuXG4gICAqXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gY29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB0aGUgbWV0cmljXG4gICAqXG4gICAqIEBkZWZhdWx0IGF2ZyBvdmVyIDUgbWludXRlc1xuICAgKi9cbiAgcHVibGljIG1ldHJpY0R1cmF0aW9uKG9wdGlvbnM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljIHtcbiAgICByZXR1cm4gbmV3IE1ldHJpYyh7XG4gICAgICAuLi5DbG91ZFdhdGNoU3ludGhldGljc01ldHJpY3MuZHVyYXRpb25NYXhpbXVtKHsgQ2FuYXJ5TmFtZTogdGhpcy5jYW5hcnlOYW1lIH0pLFxuICAgICAgLi4ueyBzdGF0aXN0aWM6ICdBdmVyYWdlJyB9LFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICB9KS5hdHRhY2hUbyh0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZWFzdXJlIHRoZSBwZXJjZW50YWdlIG9mIHN1Y2Nlc3NmdWwgY2FuYXJ5IHJ1bnMuXG4gICAqXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gY29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB0aGUgbWV0cmljXG4gICAqXG4gICAqIEBkZWZhdWx0IGF2ZyBvdmVyIDUgbWludXRlc1xuICAgKi9cbiAgcHVibGljIG1ldHJpY1N1Y2Nlc3NQZXJjZW50KG9wdGlvbnM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljIHtcbiAgICByZXR1cm4gdGhpcy5jYW5uZWRNZXRyaWMoQ2xvdWRXYXRjaFN5bnRoZXRpY3NNZXRyaWNzLnN1Y2Nlc3NQZXJjZW50QXZlcmFnZSwgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogTWVhc3VyZSB0aGUgbnVtYmVyIG9mIGZhaWxlZCBjYW5hcnkgcnVucyBvdmVyIGEgZ2l2ZW4gdGltZSBwZXJpb2QuXG4gICAqXG4gICAqIERlZmF1bHQ6IHN1bSBvdmVyIDUgbWludXRlc1xuICAgKlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhlIG1ldHJpY1xuICAgKi9cbiAgcHVibGljIG1ldHJpY0ZhaWxlZChvcHRpb25zPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYyB7XG4gICAgcmV0dXJuIHRoaXMuY2FubmVkTWV0cmljKENsb3VkV2F0Y2hTeW50aGV0aWNzTWV0cmljcy5mYWlsZWRTdW0sIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBkZWZhdWx0IHJvbGUgZm9yIHRoZSBjYW5hcnlcbiAgICovXG4gIHByaXZhdGUgY3JlYXRlRGVmYXVsdFJvbGUocHJvcHM6IENhbmFyeVByb3BzKTogaWFtLklSb2xlIHtcbiAgICBjb25zdCBwcmVmaXggPSBwcm9wcy5hcnRpZmFjdHNCdWNrZXRMb2NhdGlvbj8ucHJlZml4O1xuXG4gICAgLy8gQ3JlYXRlZCByb2xlIHdpbGwgbmVlZCB0aGVzZSBwb2xpY2llcyB0byBydW4gdGhlIENhbmFyeS5cbiAgICAvLyBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTQ2xvdWRGb3JtYXRpb24vbGF0ZXN0L1VzZXJHdWlkZS9hd3MtcmVzb3VyY2Utc3ludGhldGljcy1jYW5hcnkuaHRtbCNjZm4tc3ludGhldGljcy1jYW5hcnktZXhlY3V0aW9ucm9sZWFyblxuICAgIGNvbnN0IHBvbGljeSA9IG5ldyBpYW0uUG9saWN5RG9jdW1lbnQoe1xuICAgICAgc3RhdGVtZW50czogW1xuICAgICAgICBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgICAgcmVzb3VyY2VzOiBbJyonXSxcbiAgICAgICAgICBhY3Rpb25zOiBbJ3MzOkxpc3RBbGxNeUJ1Y2tldHMnXSxcbiAgICAgICAgfSksXG4gICAgICAgIG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgICByZXNvdXJjZXM6IFt0aGlzLmFydGlmYWN0c0J1Y2tldC5idWNrZXRBcm5dLFxuICAgICAgICAgIGFjdGlvbnM6IFsnczM6R2V0QnVja2V0TG9jYXRpb24nXSxcbiAgICAgICAgfSksXG4gICAgICAgIG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgICByZXNvdXJjZXM6IFt0aGlzLmFydGlmYWN0c0J1Y2tldC5hcm5Gb3JPYmplY3RzKGAke3ByZWZpeCA/IHByZWZpeCsnLyonIDogJyonfWApXSxcbiAgICAgICAgICBhY3Rpb25zOiBbJ3MzOlB1dE9iamVjdCddLFxuICAgICAgICB9KSxcbiAgICAgICAgbmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICAgIHJlc291cmNlczogWycqJ10sXG4gICAgICAgICAgYWN0aW9uczogWydjbG91ZHdhdGNoOlB1dE1ldHJpY0RhdGEnXSxcbiAgICAgICAgICBjb25kaXRpb25zOiB7IFN0cmluZ0VxdWFsczogeyAnY2xvdWR3YXRjaDpuYW1lc3BhY2UnOiAnQ2xvdWRXYXRjaFN5bnRoZXRpY3MnIH0gfSxcbiAgICAgICAgfSksXG4gICAgICAgIG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgICByZXNvdXJjZXM6IFt0aGlzLmxvZ0dyb3VwQXJuKCldLFxuICAgICAgICAgIGFjdGlvbnM6IFsnbG9nczpDcmVhdGVMb2dTdHJlYW0nLCAnbG9nczpDcmVhdGVMb2dHcm91cCcsICdsb2dzOlB1dExvZ0V2ZW50cyddLFxuICAgICAgICB9KSxcbiAgICAgIF0sXG4gICAgfSk7XG5cbiAgICBjb25zdCBtYW5hZ2VkUG9saWNpZXM6IGlhbS5JTWFuYWdlZFBvbGljeVtdID0gW107XG5cbiAgICBpZiAocHJvcHMudnBjKSB7XG4gICAgICAvLyBQb2xpY3kgdGhhdCB3aWxsIGhhdmUgRU5JIGNyZWF0aW9uIHBlcm1pc3Npb25zXG4gICAgICBtYW5hZ2VkUG9saWNpZXMucHVzaChpYW0uTWFuYWdlZFBvbGljeS5mcm9tQXdzTWFuYWdlZFBvbGljeU5hbWUoJ3NlcnZpY2Utcm9sZS9BV1NMYW1iZGFWUENBY2Nlc3NFeGVjdXRpb25Sb2xlJykpO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgaWFtLlJvbGUodGhpcywgJ1NlcnZpY2VSb2xlJywge1xuICAgICAgYXNzdW1lZEJ5OiBuZXcgaWFtLlNlcnZpY2VQcmluY2lwYWwoJ2xhbWJkYS5hbWF6b25hd3MuY29tJyksXG4gICAgICBpbmxpbmVQb2xpY2llczoge1xuICAgICAgICBjYW5hcnlQb2xpY3k6IHBvbGljeSxcbiAgICAgIH0sXG4gICAgICBtYW5hZ2VkUG9saWNpZXMsXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGxvZ0dyb3VwQXJuKCkge1xuICAgIHJldHVybiBjZGsuU3RhY2sub2YodGhpcykuZm9ybWF0QXJuKHtcbiAgICAgIHNlcnZpY2U6ICdsb2dzJyxcbiAgICAgIHJlc291cmNlOiAnbG9nLWdyb3VwJyxcbiAgICAgIGFybkZvcm1hdDogY2RrLkFybkZvcm1hdC5DT0xPTl9SRVNPVVJDRV9OQU1FLFxuICAgICAgcmVzb3VyY2VOYW1lOiAnL2F3cy9sYW1iZGEvY3dzeW4tKicsXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGxhbWJkYUFybigpIHtcbiAgICByZXR1cm4gY2RrLlN0YWNrLm9mKHRoaXMpLmZvcm1hdEFybih7XG4gICAgICBzZXJ2aWNlOiAnbGFtYmRhJyxcbiAgICAgIHJlc291cmNlOiAnZnVuY3Rpb24nLFxuICAgICAgYXJuRm9ybWF0OiBjZGsuQXJuRm9ybWF0LkNPTE9OX1JFU09VUkNFX05BTUUsXG4gICAgICByZXNvdXJjZU5hbWU6ICdjd3N5bi0qJyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjb2RlIG9iamVjdCB0YWtlbiBpbiBieSB0aGUgY2FuYXJ5IHJlc291cmNlLlxuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVDb2RlKHByb3BzOiBDYW5hcnlQcm9wcyk6IENmbkNhbmFyeS5Db2RlUHJvcGVydHkge1xuICAgIHRoaXMudmFsaWRhdGVIYW5kbGVyKHByb3BzLnRlc3QuaGFuZGxlciwgcHJvcHMucnVudGltZSk7XG4gICAgY29uc3QgY29kZUNvbmZpZyA9IHtcbiAgICAgIGhhbmRsZXI6IHByb3BzLnRlc3QuaGFuZGxlcixcbiAgICAgIC4uLnByb3BzLnRlc3QuY29kZS5iaW5kKHRoaXMsIHByb3BzLnRlc3QuaGFuZGxlciwgcHJvcHMucnVudGltZS5mYW1pbHkpLFxuICAgIH07XG4gICAgcmV0dXJuIHtcbiAgICAgIGhhbmRsZXI6IGNvZGVDb25maWcuaGFuZGxlcixcbiAgICAgIHNjcmlwdDogY29kZUNvbmZpZy5pbmxpbmVDb2RlLFxuICAgICAgczNCdWNrZXQ6IGNvZGVDb25maWcuczNMb2NhdGlvbj8uYnVja2V0TmFtZSxcbiAgICAgIHMzS2V5OiBjb2RlQ29uZmlnLnMzTG9jYXRpb24/Lm9iamVjdEtleSxcbiAgICAgIHMzT2JqZWN0VmVyc2lvbjogY29kZUNvbmZpZy5zM0xvY2F0aW9uPy5vYmplY3RWZXJzaW9uLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpZXMgdGhhdCB0aGUgaGFuZGxlciBuYW1lIG1hdGNoZXMgdGhlIGNvbnZlbnRpb25zIGdpdmVuIGEgY2VydGFpbiBydW50aW1lLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NDbG91ZEZvcm1hdGlvbi9sYXRlc3QvVXNlckd1aWRlL2F3cy1wcm9wZXJ0aWVzLXN5bnRoZXRpY3MtY2FuYXJ5LWNvZGUuaHRtbCNjZm4tc3ludGhldGljcy1jYW5hcnktY29kZS1oYW5kbGVyXG4gICAqIEBwYXJhbSBoYW5kbGVyIC0gdGhlIG5hbWUgb2YgdGhlIGhhbmRsZXJcbiAgICogQHBhcmFtIHJ1bnRpbWUgLSB0aGUgcnVudGltZSB2ZXJzaW9uXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlSGFuZGxlcihoYW5kbGVyOiBzdHJpbmcsIHJ1bnRpbWU6IFJ1bnRpbWUpIHtcbiAgICBjb25zdCBvbGRSdW50aW1lcyA9IFtcbiAgICAgIFJ1bnRpbWUuU1lOVEhFVElDU19QWVRIT05fU0VMRU5JVU1fMV8wLFxuICAgICAgUnVudGltZS5TWU5USEVUSUNTX05PREVKU19QVVBQRVRFRVJfM18wLFxuICAgICAgUnVudGltZS5TWU5USEVUSUNTX05PREVKU19QVVBQRVRFRVJfM18xLFxuICAgICAgUnVudGltZS5TWU5USEVUSUNTX05PREVKU19QVVBQRVRFRVJfM18yLFxuICAgICAgUnVudGltZS5TWU5USEVUSUNTX05PREVKU19QVVBQRVRFRVJfM18zLFxuICAgIF07XG4gICAgaWYgKG9sZFJ1bnRpbWVzLmluY2x1ZGVzKHJ1bnRpbWUpKSB7XG4gICAgICBpZiAoIWhhbmRsZXIubWF0Y2goL15bMC05QS1aYS16X1xcXFwtXStcXC5oYW5kbGVyKiQvKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbmFyeSBIYW5kbGVyIG11c3QgYmUgc3BlY2lmaWVkIGFzIFxcJ2ZpbGVOYW1lLmhhbmRsZXJcXCcgZm9yIGxlZ2FjeSBydW50aW1lcywgcmVjZWl2ZWQgJHtoYW5kbGVyfWApO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIWhhbmRsZXIubWF0Y2goL14oWzAtOWEtekEtWl8tXStcXC8pKlswLTlBLVphLXpfXFxcXC1dK1xcLltBLVphLXpfXVtBLVphLXowLTlfXSokLykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5hcnkgSGFuZGxlciBtdXN0IGJlIHNwZWNpZmllZCBlaXRoZXIgYXMgXFwnZmlsZU5hbWUuaGFuZGxlclxcJywgXFwnZmlsZU5hbWUuZnVuY3Rpb25OYW1lXFwnLCBvciBcXCdmb2xkZXIvZmlsZU5hbWUuZnVuY3Rpb25OYW1lXFwnLCByZWNlaXZlZCAke2hhbmRsZXJ9YCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChoYW5kbGVyLmxlbmd0aCA8IDEgfHwgaGFuZGxlci5sZW5ndGggPiAxMjgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ2FuYXJ5IEhhbmRsZXIgbGVuZ3RoIG11c3QgYmUgYmV0d2VlbiAxIGFuZCAxMjgsIHJlY2VpdmVkICR7aGFuZGxlci5sZW5ndGh9YCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVSdW5Db25maWcocHJvcHM6IENhbmFyeVByb3BzKTogQ2ZuQ2FuYXJ5LlJ1bkNvbmZpZ1Byb3BlcnR5IHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIXByb3BzLmVudmlyb25tZW50VmFyaWFibGVzKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgZW52aXJvbm1lbnRWYXJpYWJsZXM6IHByb3BzLmVudmlyb25tZW50VmFyaWFibGVzLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIGNhbmFyeSBzY2hlZHVsZSBvYmplY3RcbiAgICovXG4gIHByaXZhdGUgY3JlYXRlU2NoZWR1bGUocHJvcHM6IENhbmFyeVByb3BzKTogQ2ZuQ2FuYXJ5LlNjaGVkdWxlUHJvcGVydHkge1xuICAgIHJldHVybiB7XG4gICAgICBkdXJhdGlvbkluU2Vjb25kczogU3RyaW5nKGAke3Byb3BzLnRpbWVUb0xpdmU/LnRvU2Vjb25kcygpID8/IDB9YCksXG4gICAgICBleHByZXNzaW9uOiBwcm9wcy5zY2hlZHVsZT8uZXhwcmVzc2lvblN0cmluZyA/PyAncmF0ZSg1IG1pbnV0ZXMpJyxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVWcGNDb25maWcocHJvcHM6IENhbmFyeVByb3BzKTogQ2ZuQ2FuYXJ5LlZQQ0NvbmZpZ1Byb3BlcnR5IHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIXByb3BzLnZwYykge1xuICAgICAgaWYgKHByb3BzLnZwY1N1Ym5ldHMgIT0gbnVsbCB8fCBwcm9wcy5zZWN1cml0eUdyb3VwcyAhPSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIllvdSBtdXN0IHByb3ZpZGUgdGhlICd2cGMnIHByb3Agd2hlbiB1c2luZyBWUEMtcmVsYXRlZCBwcm9wZXJ0aWVzLlwiKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBjb25zdCB7IHN1Ym5ldElkcyB9ID0gcHJvcHMudnBjLnNlbGVjdFN1Ym5ldHMocHJvcHMudnBjU3VibmV0cyk7XG4gICAgaWYgKHN1Ym5ldElkcy5sZW5ndGggPCAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIG1hdGNoaW5nIHN1Ym5ldHMgZm91bmQgaW4gdGhlIFZQQy4nKTtcbiAgICB9XG5cbiAgICBsZXQgc2VjdXJpdHlHcm91cHM6IGVjMi5JU2VjdXJpdHlHcm91cFtdO1xuICAgIGlmIChwcm9wcy5zZWN1cml0eUdyb3VwcyAmJiBwcm9wcy5zZWN1cml0eUdyb3Vwcy5sZW5ndGggPiAwKSB7XG4gICAgICBzZWN1cml0eUdyb3VwcyA9IHByb3BzLnNlY3VyaXR5R3JvdXBzO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBzZWN1cml0eUdyb3VwID0gbmV3IGVjMi5TZWN1cml0eUdyb3VwKHRoaXMsICdTZWN1cml0eUdyb3VwJywge1xuICAgICAgICB2cGM6IHByb3BzLnZwYyxcbiAgICAgICAgZGVzY3JpcHRpb246ICdBdXRvbWF0aWMgc2VjdXJpdHkgZ3JvdXAgZm9yIENhbmFyeSAnICsgY2RrLk5hbWVzLnVuaXF1ZUlkKHRoaXMpLFxuICAgICAgfSk7XG4gICAgICBzZWN1cml0eUdyb3VwcyA9IFtzZWN1cml0eUdyb3VwXTtcbiAgICB9XG4gICAgdGhpcy5fY29ubmVjdGlvbnMhLmFkZFNlY3VyaXR5R3JvdXAoLi4uc2VjdXJpdHlHcm91cHMpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHZwY0lkOiBwcm9wcy52cGMudnBjSWQsXG4gICAgICBzdWJuZXRJZHMsXG4gICAgICBzZWN1cml0eUdyb3VwSWRzOiBjZGsuTGF6eS5saXN0KHsgcHJvZHVjZTogKCkgPT4gdGhpcy5jb25uZWN0aW9ucy5zZWN1cml0eUdyb3Vwcy5tYXAoc2cgPT4gc2cuc2VjdXJpdHlHcm91cElkKSB9KSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSB1bmlxdWUgbmFtZSBmb3IgdGhlIGNhbmFyeS4gVGhlIGdlbmVyYXRlZCBuYW1lIGlzIHRoZSBwaHlzaWNhbCBJRCBvZiB0aGUgY2FuYXJ5LlxuICAgKi9cbiAgcHJpdmF0ZSBnZW5lcmF0ZVVuaXF1ZU5hbWUoKTogc3RyaW5nIHtcbiAgICBjb25zdCBuYW1lID0gY2RrLk5hbWVzLnVuaXF1ZUlkKHRoaXMpLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgnICcsICctJyk7XG4gICAgaWYgKG5hbWUubGVuZ3RoIDw9IDIxKSB7XG4gICAgICByZXR1cm4gbmFtZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG5hbWUuc3Vic3RyaW5nKDAsIDE1KSArIG5hbWVIYXNoKG5hbWUpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY2FubmVkTWV0cmljKFxuICAgIGZuOiAoZGltczogeyBDYW5hcnlOYW1lOiBzdHJpbmcgfSkgPT4gTWV0cmljUHJvcHMsXG4gICAgcHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljIHtcbiAgICByZXR1cm4gbmV3IE1ldHJpYyh7XG4gICAgICAuLi5mbih7IENhbmFyeU5hbWU6IHRoaXMuY2FuYXJ5TmFtZSB9KSxcbiAgICAgIC4uLnByb3BzLFxuICAgIH0pLmF0dGFjaFRvKHRoaXMpO1xuICB9XG59XG5cbi8qKlxuICogVGFrZSBhIGhhc2ggb2YgdGhlIGdpdmVuIG5hbWUuXG4gKlxuICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgdG8gYmUgaGFzaGVkXG4gKi9cbmZ1bmN0aW9uIG5hbWVIYXNoKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IG1kNSA9IGNyeXB0by5jcmVhdGVIYXNoKCdzaGEyNTYnKS51cGRhdGUobmFtZSkuZGlnZXN0KCdoZXgnKTtcbiAgcmV0dXJuIG1kNS5zbGljZSgwLCA2KTtcbn1cblxuY29uc3QgbmFtZVJlZ2V4OiBSZWdFeHAgPSAvXlswLTlhLXpfXFwtXSskLztcblxuLyoqXG4gKiBWZXJpZmllcyB0aGF0IHRoZSBuYW1lIGZpdHMgdGhlIHJlZ2V4IGV4cHJlc3Npb246IF5bMC05YS16X1xcLV0rJC5cbiAqXG4gKiBAcGFyYW0gbmFtZSAtIHRoZSBnaXZlbiBuYW1lIG9mIHRoZSBjYW5hcnlcbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVOYW1lKG5hbWU6IHN0cmluZykge1xuICBpZiAobmFtZS5sZW5ndGggPiAyMSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgQ2FuYXJ5IG5hbWUgaXMgdG9vIGxhcmdlLCBtdXN0IGJlIGJldHdlZW4gMSBhbmQgMjEgY2hhcmFjdGVycywgYnV0IGlzICR7bmFtZS5sZW5ndGh9IChnb3QgXCIke25hbWV9XCIpYCk7XG4gIH1cbiAgaWYgKCFuYW1lUmVnZXgudGVzdChuYW1lKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgQ2FuYXJ5IG5hbWUgbXVzdCBiZSBsb3dlcmNhc2UsIG51bWJlcnMsIGh5cGhlbnMsIG9yIHVuZGVyc2NvcmVzIChnb3QgXCIke25hbWV9XCIpYCk7XG4gIH1cbn1cbiJdfQ== \ No newline at end of file diff --git a/packages/@aws-cdk/aws-synthetics-alpha/lib/code.d.ts b/packages/@aws-cdk/aws-synthetics-alpha/lib/code.d.ts new file mode 100644 index 0000000000000..6c4513ef76e93 --- /dev/null +++ b/packages/@aws-cdk/aws-synthetics-alpha/lib/code.d.ts @@ -0,0 +1,107 @@ +import * as s3 from 'aws-cdk-lib/aws-s3'; +import * as s3_assets from 'aws-cdk-lib/aws-s3-assets'; +import { Construct } from 'constructs'; +import { RuntimeFamily } from './runtime'; +/** + * The code the canary should execute + */ +export declare abstract class Code { + /** + * Specify code inline. + * + * @param code The actual handler code (limited to 5MB) + * + * @returns `InlineCode` with inline code. + */ + static fromInline(code: string): InlineCode; + /** + * Specify code from a local path. Path must include the folder structure `nodejs/node_modules/myCanaryFilename.js`. + * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Canaries_WritingCanary.html#CloudWatch_Synthetics_Canaries_write_from_scratch + * + * @param assetPath Either a directory or a .zip file + * + * @returns `AssetCode` associated with the specified path. + */ + static fromAsset(assetPath: string, options?: s3_assets.AssetOptions): AssetCode; + /** + * Specify code from an s3 bucket. The object in the s3 bucket must be a .zip file that contains + * the structure `nodejs/node_modules/myCanaryFilename.js`. + * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Canaries_WritingCanary.html#CloudWatch_Synthetics_Canaries_write_from_scratch + * + * @param bucket The S3 bucket + * @param key The object key + * @param objectVersion Optional S3 object version + * + * @returns `S3Code` associated with the specified S3 object. + */ + static fromBucket(bucket: s3.IBucket, key: string, objectVersion?: string): S3Code; + /** + * Called when the canary is initialized to allow this object to bind + * to the stack, add resources and have fun. + * + * @param scope The binding scope. Don't be smart about trying to down-cast or + * assume it's initialized. You may just use it as a construct scope. + * + * @returns a bound `CodeConfig`. + */ + abstract bind(scope: Construct, handler: string, family: RuntimeFamily): CodeConfig; +} +/** + * Configuration of the code class + */ +export interface CodeConfig { + /** + * The location of the code in S3 (mutually exclusive with `inlineCode`). + * + * @default - none + */ + readonly s3Location?: s3.Location; + /** + * Inline code (mutually exclusive with `s3Location`). + * + * @default - none + */ + readonly inlineCode?: string; +} +/** + * Canary code from an Asset + */ +export declare class AssetCode extends Code { + private assetPath; + private options?; + private asset?; + /** + * @param assetPath The path to the asset file or directory. + */ + constructor(assetPath: string, options?: s3_assets.AssetOptions | undefined); + bind(scope: Construct, handler: string, family: RuntimeFamily): CodeConfig; + /** + * Validates requirements specified by the canary resource. For example, the canary code with handler `index.handler` + * must be found in the file structure `nodejs/node_modules/index.js`. + * + * Requires path to be either zip file or directory. + * Requires asset directory to have the structure 'nodejs/node_modules'. + * Requires canary file to be directly inside node_modules folder. + * Requires canary file name matches the handler name. + * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Canaries_WritingCanary.html + */ + private validateCanaryAsset; +} +/** + * Canary code from an inline string. + */ +export declare class InlineCode extends Code { + private code; + constructor(code: string); + bind(_scope: Construct, handler: string, _family: RuntimeFamily): CodeConfig; +} +/** + * S3 bucket path to the code zip file + */ +export declare class S3Code extends Code { + private bucket; + private key; + private objectVersion?; + constructor(bucket: s3.IBucket, key: string, objectVersion?: string | undefined); + bind(_scope: Construct, _handler: string, _family: RuntimeFamily): CodeConfig; +} diff --git a/packages/@aws-cdk/aws-synthetics-alpha/lib/code.js b/packages/@aws-cdk/aws-synthetics-alpha/lib/code.js new file mode 100644 index 0000000000000..4ad0c096559e5 --- /dev/null +++ b/packages/@aws-cdk/aws-synthetics-alpha/lib/code.js @@ -0,0 +1,253 @@ +"use strict"; +var _a, _b, _c, _d; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.S3Code = exports.InlineCode = exports.AssetCode = exports.Code = void 0; +const jsiiDeprecationWarnings = require("../.warnings.jsii.js"); +const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti"); +const fs = require("fs"); +const path = require("path"); +const s3_assets = require("aws-cdk-lib/aws-s3-assets"); +const runtime_1 = require("./runtime"); +const core_1 = require("aws-cdk-lib/core"); +/** + * The code the canary should execute + */ +class Code { + /** + * Specify code inline. + * + * @param code The actual handler code (limited to 5MB) + * + * @returns `InlineCode` with inline code. + */ + static fromInline(code) { + try { + jsiiDeprecationWarnings.print("@aws-cdk/aws-synthetics-alpha.Code#fromInline", ""); + } + catch (error) { + if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { + Error.captureStackTrace(error, this.fromInline); + } + throw error; + } + return new InlineCode(code); + } + /** + * Specify code from a local path. Path must include the folder structure `nodejs/node_modules/myCanaryFilename.js`. + * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Canaries_WritingCanary.html#CloudWatch_Synthetics_Canaries_write_from_scratch + * + * @param assetPath Either a directory or a .zip file + * + * @returns `AssetCode` associated with the specified path. + */ + static fromAsset(assetPath, options) { + try { + jsiiDeprecationWarnings.print("@aws-cdk/aws-synthetics-alpha.Code#fromAsset", ""); + } + catch (error) { + if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { + Error.captureStackTrace(error, this.fromAsset); + } + throw error; + } + return new AssetCode(assetPath, options); + } + /** + * Specify code from an s3 bucket. The object in the s3 bucket must be a .zip file that contains + * the structure `nodejs/node_modules/myCanaryFilename.js`. + * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Canaries_WritingCanary.html#CloudWatch_Synthetics_Canaries_write_from_scratch + * + * @param bucket The S3 bucket + * @param key The object key + * @param objectVersion Optional S3 object version + * + * @returns `S3Code` associated with the specified S3 object. + */ + static fromBucket(bucket, key, objectVersion) { + try { + jsiiDeprecationWarnings.print("@aws-cdk/aws-synthetics-alpha.Code#fromBucket", ""); + } + catch (error) { + if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { + Error.captureStackTrace(error, this.fromBucket); + } + throw error; + } + return new S3Code(bucket, key, objectVersion); + } +} +exports.Code = Code; +_a = JSII_RTTI_SYMBOL_1; +Code[_a] = { fqn: "@aws-cdk/aws-synthetics-alpha.Code", version: "0.0.0" }; +/** + * Canary code from an Asset + */ +class AssetCode extends Code { + /** + * @param assetPath The path to the asset file or directory. + */ + constructor(assetPath, options) { + super(); + this.assetPath = assetPath; + this.options = options; + try { + jsiiDeprecationWarnings.print("@aws-cdk/aws-synthetics-alpha.AssetCode", ""); + } + catch (error) { + if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { + Error.captureStackTrace(error, AssetCode); + } + throw error; + } + if (!fs.existsSync(this.assetPath)) { + throw new Error(`${this.assetPath} is not a valid path`); + } + } + bind(scope, handler, family) { + try { + jsiiDeprecationWarnings.print("@aws-cdk/aws-synthetics-alpha.AssetCode#bind", ""); + jsiiDeprecationWarnings._aws_cdk_aws_synthetics_alpha_RuntimeFamily(family); + } + catch (error) { + if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { + Error.captureStackTrace(error, this.bind); + } + throw error; + } + // If the same AssetCode is used multiple times, retain only the first instantiation. + if (!this.asset) { + this.asset = new s3_assets.Asset(scope, 'Code', { + path: this.assetPath, + ...this.options, + }); + } + this.validateCanaryAsset(scope, handler, family); + return { + s3Location: { + bucketName: this.asset.s3BucketName, + objectKey: this.asset.s3ObjectKey, + }, + }; + } + /** + * Validates requirements specified by the canary resource. For example, the canary code with handler `index.handler` + * must be found in the file structure `nodejs/node_modules/index.js`. + * + * Requires path to be either zip file or directory. + * Requires asset directory to have the structure 'nodejs/node_modules'. + * Requires canary file to be directly inside node_modules folder. + * Requires canary file name matches the handler name. + * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Canaries_WritingCanary.html + */ + validateCanaryAsset(scope, handler, family) { + if (!this.asset) { + throw new Error("'validateCanaryAsset' must be called after 'this.asset' is instantiated"); + } + // Get the staged (or copied) asset path. + // `this.asset.assetPath` is relative to the `outdir`, not the `assetOutDir`. + const asmManifestDir = core_1.Stage.of(scope)?.outdir; + const assetPath = asmManifestDir ? path.join(asmManifestDir, this.asset.assetPath) : this.assetPath; + if (path.extname(assetPath) !== '.zip') { + if (!fs.lstatSync(assetPath).isDirectory()) { + throw new Error(`Asset must be a .zip file or a directory (${this.assetPath})`); + } + const filename = handler.split('.')[0]; + const nodeFilename = `${filename}.js`; + const pythonFilename = `${filename}.py`; + if (family === runtime_1.RuntimeFamily.NODEJS && !fs.existsSync(path.join(assetPath, 'nodejs', 'node_modules', nodeFilename))) { + throw new Error(`The canary resource requires that the handler is present at "nodejs/node_modules/${nodeFilename}" but not found at ${this.assetPath} (https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Canaries_WritingCanary_Nodejs.html)`); + } + if (family === runtime_1.RuntimeFamily.PYTHON && !fs.existsSync(path.join(assetPath, 'python', pythonFilename))) { + throw new Error(`The canary resource requires that the handler is present at "python/${pythonFilename}" but not found at ${this.assetPath} (https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Canaries_WritingCanary_Python.html)`); + } + } + } +} +exports.AssetCode = AssetCode; +_b = JSII_RTTI_SYMBOL_1; +AssetCode[_b] = { fqn: "@aws-cdk/aws-synthetics-alpha.AssetCode", version: "0.0.0" }; +/** + * Canary code from an inline string. + */ +class InlineCode extends Code { + constructor(code) { + super(); + this.code = code; + try { + jsiiDeprecationWarnings.print("@aws-cdk/aws-synthetics-alpha.InlineCode", ""); + } + catch (error) { + if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { + Error.captureStackTrace(error, InlineCode); + } + throw error; + } + if (code.length === 0) { + throw new Error('Canary inline code cannot be empty'); + } + } + bind(_scope, handler, _family) { + try { + jsiiDeprecationWarnings.print("@aws-cdk/aws-synthetics-alpha.InlineCode#bind", ""); + jsiiDeprecationWarnings._aws_cdk_aws_synthetics_alpha_RuntimeFamily(_family); + } + catch (error) { + if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { + Error.captureStackTrace(error, this.bind); + } + throw error; + } + if (handler !== 'index.handler') { + throw new Error(`The handler for inline code must be "index.handler" (got "${handler}")`); + } + return { + inlineCode: this.code, + }; + } +} +exports.InlineCode = InlineCode; +_c = JSII_RTTI_SYMBOL_1; +InlineCode[_c] = { fqn: "@aws-cdk/aws-synthetics-alpha.InlineCode", version: "0.0.0" }; +/** + * S3 bucket path to the code zip file + */ +class S3Code extends Code { + constructor(bucket, key, objectVersion) { + super(); + this.bucket = bucket; + this.key = key; + this.objectVersion = objectVersion; + try { + jsiiDeprecationWarnings.print("@aws-cdk/aws-synthetics-alpha.S3Code", ""); + } + catch (error) { + if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { + Error.captureStackTrace(error, S3Code); + } + throw error; + } + } + bind(_scope, _handler, _family) { + try { + jsiiDeprecationWarnings.print("@aws-cdk/aws-synthetics-alpha.S3Code#bind", ""); + jsiiDeprecationWarnings._aws_cdk_aws_synthetics_alpha_RuntimeFamily(_family); + } + catch (error) { + if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { + Error.captureStackTrace(error, this.bind); + } + throw error; + } + return { + s3Location: { + bucketName: this.bucket.bucketName, + objectKey: this.key, + objectVersion: this.objectVersion, + }, + }; + } +} +exports.S3Code = S3Code; +_d = JSII_RTTI_SYMBOL_1; +S3Code[_d] = { fqn: "@aws-cdk/aws-synthetics-alpha.S3Code", version: "0.0.0" }; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29kZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImNvZGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEseUJBQXlCO0FBQ3pCLDZCQUE2QjtBQUU3Qix1REFBdUQ7QUFFdkQsdUNBQTBDO0FBQzFDLDJDQUF5QztBQUV6Qzs7R0FFRztBQUNILE1BQXNCLElBQUk7SUFFeEI7Ozs7OztPQU1HO0lBQ0ksTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFZOzs7Ozs7Ozs7O1FBQ25DLE9BQU8sSUFBSSxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7S0FDN0I7SUFFRDs7Ozs7OztPQU9HO0lBQ0ksTUFBTSxDQUFDLFNBQVMsQ0FBQyxTQUFpQixFQUFFLE9BQWdDOzs7Ozs7Ozs7O1FBQ3pFLE9BQU8sSUFBSSxTQUFTLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0tBQzFDO0lBRUQ7Ozs7Ozs7Ozs7T0FVRztJQUNJLE1BQU0sQ0FBQyxVQUFVLENBQUMsTUFBa0IsRUFBRSxHQUFXLEVBQUUsYUFBc0I7Ozs7Ozs7Ozs7UUFDOUUsT0FBTyxJQUFJLE1BQU0sQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLGFBQWEsQ0FBQyxDQUFDO0tBQy9DOztBQXRDSCxvQkFrREM7OztBQXFCRDs7R0FFRztBQUNILE1BQWEsU0FBVSxTQUFRLElBQUk7SUFHakM7O09BRUc7SUFDSCxZQUEyQixTQUFpQixFQUFVLE9BQWdDO1FBQ3BGLEtBQUssRUFBRSxDQUFDO1FBRGlCLGNBQVMsR0FBVCxTQUFTLENBQVE7UUFBVSxZQUFPLEdBQVAsT0FBTyxDQUF5Qjs7Ozs7OytDQU4zRSxTQUFTOzs7O1FBU2xCLElBQUksQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRTtZQUNsQyxNQUFNLElBQUksS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsc0JBQXNCLENBQUMsQ0FBQztTQUMxRDtLQUNGO0lBRU0sSUFBSSxDQUFDLEtB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QUFDO1NBQ3ZEO0tBQ0Y7SUFFTSxJQUFJLENBQUMsTUFBaUIsRUFBRSxPQUFlLEVBQUUsT0FBc0I7Ozs7Ozs7Ozs7O1FBRXBFLElBQUksT0FBTyxLQUFLLGVBQWUsRUFBRTtZQUMvQixNQUFNLElBQUksS0FBSyxDQUFDLDZEQUE2RCxPQUFPLElBQUksQ0FBQyxDQUFDO1NBQzNGO1FBRUQsT0FBTztZQUNMLFVBQVUsRUFBRSxJQUFJLENBQUMsSUFBSTtTQUN0QixDQUFDO0tBQ0g7O0FBbEJILGdDQW1CQzs7O0FBRUQ7O0dBRUc7QUFDSCxNQUFhLE1BQU8sU0FBUSxJQUFJO0lBQzlCLFlBQTJCLE1BQWtCLEVBQVUsR0FBVyxFQUFVLGFBQXNCO1FBQ2hHLEtBQUssRUFBRSxDQUFDO1FBRGlCLFdBQU0sR0FBTixNQUFNLENBQVk7UUFBVSxRQUFHLEdBQUgsR0FBRyxDQUFRO1FBQVUsa0JBQWEsR0FBYixhQUFhLENBQVM7Ozs7OzsrQ0FEdkYsTUFBTTs7OztLQUdoQjtJQUVNLElBQUksQ0FBQyxNQUFpQixFQUFFLFFBQWdCLEVBQUUsT0FBc0I7Ozs7Ozs7Ozs7O1FBQ3JFLE9BQU87WUFDTCxVQUFVLEVBQUU7Z0JBQ1YsVUFBVSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVTtnQkFDbEMsU0FBUyxFQUFFLElBQUksQ0FBQyxHQUFHO2dCQUNuQixhQUFhLEVBQUUsSUFBSSxDQUFDLGFBQWE7YUFDbEM7U0FDRixDQUFDO0tBQ0g7O0FBYkgsd0JBY0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBmcyBmcm9tICdmcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0ICogYXMgczMgZnJvbSAnYXdzLWNkay1saWIvYXdzLXMzJztcbmltcG9ydCAqIGFzIHMzX2Fzc2V0cyBmcm9tICdhd3MtY2RrLWxpYi9hd3MtczMtYXNzZXRzJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgUnVudGltZUZhbWlseSB9IGZyb20gJy4vcnVudGltZSc7XG5pbXBvcnQgeyBTdGFnZSB9IGZyb20gJ2F3cy1jZGstbGliL2NvcmUnO1xuXG4vKipcbiAqIFRoZSBjb2RlIHRoZSBjYW5hcnkgc2hvdWxkIGV4ZWN1dGVcbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIENvZGUge1xuXG4gIC8qKlxuICAgKiBTcGVjaWZ5IGNvZGUgaW5saW5lLlxuICAgKlxuICAgKiBAcGFyYW0gY29kZSBUaGUgYWN0dWFsIGhhbmRsZXIgY29kZSAobGltaXRlZCB0byA1TUIpXG4gICAqXG4gICAqIEByZXR1cm5zIGBJbmxpbmVDb2RlYCB3aXRoIGlubGluZSBjb2RlLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tSW5saW5lKGNvZGU6IHN0cmluZyk6IElubGluZUNvZGUge1xuICAgIHJldHVybiBuZXcgSW5saW5lQ29kZShjb2RlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTcGVjaWZ5IGNvZGUgZnJvbSBhIGxvY2FsIHBhdGguIFBhdGggbXVzdCBpbmNsdWRlIHRoZSBmb2xkZXIgc3RydWN0dXJlIGBub2RlanMvbm9kZV9tb2R1bGVzL215Q2FuYXJ5RmlsZW5hbWUuanNgLlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZFdhdGNoL2xhdGVzdC9tb25pdG9yaW5nL0Nsb3VkV2F0Y2hfU3ludGhldGljc19DYW5hcmllc19Xcml0aW5nQ2FuYXJ5Lmh0bWwjQ2xvdWRXYXRjaF9TeW50aGV0aWNzX0NhbmFyaWVzX3dyaXRlX2Zyb21fc2NyYXRjaFxuICAgKlxuICAgKiBAcGFyYW0gYXNzZXRQYXRoIEVpdGhlciBhIGRpcmVjdG9yeSBvciBhIC56aXAgZmlsZVxuICAgKlxuICAgKiBAcmV0dXJucyBgQXNzZXRDb2RlYCBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBwYXRoLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tQXNzZXQoYXNzZXRQYXRoOiBzdHJpbmcsIG9wdGlvbnM/OiBzM19hc3NldHMuQXNzZXRPcHRpb25zKTogQXNzZXRDb2RlIHtcbiAgICByZXR1cm4gbmV3IEFzc2V0Q29kZShhc3NldFBhdGgsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNwZWNpZnkgY29kZSBmcm9tIGFuIHMzIGJ1Y2tldC4gVGhlIG9iamVjdCBpbiB0aGUgczMgYnVja2V0IG11c3QgYmUgYSAuemlwIGZpbGUgdGhhdCBjb250YWluc1xuICAgKiB0aGUgc3RydWN0dXJlIGBub2RlanMvbm9kZV9tb2R1bGVzL215Q2FuYXJ5RmlsZW5hbWUuanNgLlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZFdhdGNoL2xhdGVzdC9tb25pdG9yaW5nL0Nsb3VkV2F0Y2hfU3ludGhldGljc19DYW5hcmllc19Xcml0aW5nQ2FuYXJ5Lmh0bWwjQ2xvdWRXYXRjaF9TeW50aGV0aWNzX0NhbmFyaWVzX3dyaXRlX2Zyb21fc2NyYXRjaFxuICAgKlxuICAgKiBAcGFyYW0gYnVja2V0IFRoZSBTMyBidWNrZXRcbiAgICogQHBhcmFtIGtleSBUaGUgb2JqZWN0IGtleVxuICAgKiBAcGFyYW0gb2JqZWN0VmVyc2lvbiBPcHRpb25hbCBTMyBvYmplY3QgdmVyc2lvblxuICAgKlxuICAgKiBAcmV0dXJucyBgUzNDb2RlYCBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBTMyBvYmplY3QuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21CdWNrZXQoYnVja2V0OiBzMy5JQnVja2V0LCBrZXk6IHN0cmluZywgb2JqZWN0VmVyc2lvbj86IHN0cmluZyk6IFMzQ29kZSB7XG4gICAgcmV0dXJuIG5ldyBTM0NvZGUoYnVja2V0LCBrZXksIG9iamVjdFZlcnNpb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIHRoZSBjYW5hcnkgaXMgaW5pdGlhbGl6ZWQgdG8gYWxsb3cgdGhpcyBvYmplY3QgdG8gYmluZFxuICAgKiB0byB0aGUgc3RhY2ssIGFkZCByZXNvdXJjZXMgYW5kIGhhdmUgZnVuLlxuICAgKlxuICAgKiBAcGFyYW0gc2NvcGUgVGhlIGJpbmRpbmcgc2NvcGUuIERvbid0IGJlIHNtYXJ0IGFib3V0IHRyeWluZyB0byBkb3duLWNhc3Qgb3JcbiAgICogICAgICAgICAgICAgIGFzc3VtZSBpdCdzIGluaXRpYWxpemVkLiBZb3UgbWF5IGp1c3QgdXNlIGl0IGFzIGEgY29uc3RydWN0IHNjb3BlLlxuICAgKlxuICAgKiBAcmV0dXJucyBhIGJvdW5kIGBDb2RlQ29uZmlnYC5cbiAgICovXG4gIHB1YmxpYyBhYnN0cmFjdCBiaW5kKHNjb3BlOiBDb25zdHJ1Y3QsIGhhbmRsZXI6IHN0cmluZywgZmFtaWx5OiBSdW50aW1lRmFtaWx5KTogQ29kZUNvbmZpZztcbn1cblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIG9mIHRoZSBjb2RlIGNsYXNzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29kZUNvbmZpZyB7XG4gIC8qKlxuICAgKiBUaGUgbG9jYXRpb24gb2YgdGhlIGNvZGUgaW4gUzMgKG11dHVhbGx5IGV4Y2x1c2l2ZSB3aXRoIGBpbmxpbmVDb2RlYCkuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm9uZVxuICAgKi9cbiAgcmVhZG9ubHkgczNMb2NhdGlvbj86IHMzLkxvY2F0aW9uO1xuXG4gIC8qKlxuICAgKiBJbmxpbmUgY29kZSAobXV0dWFsbHkgZXhjbHVzaXZlIHdpdGggYHMzTG9jYXRpb25gKS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBub25lXG4gICAqL1xuICByZWFkb25seSBpbmxpbmVDb2RlPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIENhbmFyeSBjb2RlIGZyb20gYW4gQXNzZXRcbiAqL1xuZXhwb3J0IGNsYXNzIEFzc2V0Q29kZSBleHRlbmRzIENvZGUge1xuICBwcml2YXRlIGFzc2V0PzogczNfYXNzZXRzLkFzc2V0O1xuXG4gIC8qKlxuICAgKiBAcGFyYW0gYXNzZXRQYXRoIFRoZSBwYXRoIHRvIHRoZSBhc3NldCBmaWxlIG9yIGRpcmVjdG9yeS5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIGFzc2V0UGF0aDogc3RyaW5nLCBwcml2YXRlIG9wdGlvbnM/OiBzM19hc3NldHMuQXNzZXRPcHRpb25zKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIGlmICghZnMuZXhpc3RzU3luYyh0aGlzLmFzc2V0UGF0aCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzLmFzc2V0UGF0aH0gaXMgbm90IGEgdmFsaWQgcGF0aGApO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBiaW5kKHNjb3BlOiBDb25zdHJ1Y3QsIGhhbmRsZXI6IHN0cmluZywgZmFtaWx5OiBSdW50aW1lRmFtaWx5KTogQ29kZUNvbmZpZyB7XG4gICAgLy8gSWYgdGhlIHNhbWUgQXNzZXRDb2RlIGlzIHVzZWQgbXVsdGlwbGUgdGltZXMsIHJldGFpbiBvbmx5IHRoZSBmaXJzdCBpbnN0YW50aWF0aW9uLlxuICAgIGlmICghdGhpcy5hc3NldCkge1xuICAgICAgdGhpcy5hc3NldCA9IG5ldyBzM19hc3NldHMuQXNzZXQoc2NvcGUsICdDb2RlJywge1xuICAgICAgICBwYXRoOiB0aGlzLmFzc2V0UGF0aCxcbiAgICAgICAgLi4udGhpcy5vcHRpb25zLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy52YWxpZGF0ZUNhbmFyeUFzc2V0KHNjb3BlLCBoYW5kbGVyLCBmYW1pbHkpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHMzTG9jYXRpb246IHtcbiAgICAgICAgYnVja2V0TmFtZTogdGhpcy5hc3NldC5zM0J1Y2tldE5hbWUsXG4gICAgICAgIG9iamVjdEtleTogdGhpcy5hc3NldC5zM09iamVjdEtleSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgcmVxdWlyZW1lbnRzIHNwZWNpZmllZCBieSB0aGUgY2FuYXJ5IHJlc291cmNlLiBGb3IgZXhhbXBsZSwgdGhlIGNhbmFyeSBjb2RlIHdpdGggaGFuZGxlciBgaW5kZXguaGFuZGxlcmBcbiAgICogbXVzdCBiZSBmb3VuZCBpbiB0aGUgZmlsZSBzdHJ1Y3R1cmUgYG5vZGVqcy9ub2RlX21vZHVsZXMvaW5kZXguanNgLlxuICAgKlxuICAgKiBSZXF1aXJlcyBwYXRoIHRvIGJlIGVpdGhlciB6aXAgZmlsZSBvciBkaXJlY3RvcnkuXG4gICAqIFJlcXVpcmVzIGFzc2V0IGRpcmVjdG9yeSB0byBoYXZlIHRoZSBzdHJ1Y3R1cmUgJ25vZGVqcy9ub2RlX21vZHVsZXMnLlxuICAgKiBSZXF1aXJlcyBjYW5hcnkgZmlsZSB0byBiZSBkaXJlY3RseSBpbnNpZGUgbm9kZV9tb2R1bGVzIGZvbGRlci5cbiAgICogUmVxdWlyZXMgY2FuYXJ5IGZpbGUgbmFtZSBtYXRjaGVzIHRoZSBoYW5kbGVyIG5hbWUuXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkV2F0Y2gvbGF0ZXN0L21vbml0b3JpbmcvQ2xvdWRXYXRjaF9TeW50aGV0aWNzX0NhbmFyaWVzX1dyaXRpbmdDYW5hcnkuaHRtbFxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZUNhbmFyeUFzc2V0KHNjb3BlOiBDb25zdHJ1Y3QsIGhhbmRsZXI6IHN0cmluZywgZmFtaWx5OiBSdW50aW1lRmFtaWx5KSB7XG4gICAgaWYgKCF0aGlzLmFzc2V0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCIndmFsaWRhdGVDYW5hcnlBc3NldCcgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgJ3RoaXMuYXNzZXQnIGlzIGluc3RhbnRpYXRlZFwiKTtcbiAgICB9XG5cbiAgICAvLyBHZXQgdGhlIHN0YWdlZCAob3IgY29waWVkKSBhc3NldCBwYXRoLlxuICAgIC8vIGB0aGlzLmFzc2V0LmFzc2V0UGF0aGAgaXMgcmVsYXRpdmUgdG8gdGhlIGBvdXRkaXJgLCBub3QgdGhlIGBhc3NldE91dERpcmAuXG4gICAgY29uc3QgYXNtTWFuaWZlc3REaXIgPSBTdGFnZS5vZihzY29wZSk/Lm91dGRpcjtcbiAgICBjb25zdCBhc3NldFBhdGggPSBhc21NYW5pZmVzdERpciA/IHBhdGguam9pbihhc21NYW5pZmVzdERpciwgdGhpcy5hc3NldC5hc3NldFBhdGgpOiB0aGlzLmFzc2V0UGF0aDtcblxuICAgIGlmIChwYXRoLmV4dG5hbWUoYXNzZXRQYXRoKSAhPT0gJy56aXAnKSB7XG4gICAgICBpZiAoIWZzLmxzdGF0U3luYyhhc3NldFBhdGgpLmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBBc3NldCBtdXN0IGJlIGEgLnppcCBmaWxlIG9yIGEgZGlyZWN0b3J5ICgke3RoaXMuYXNzZXRQYXRofSlgKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGZpbGVuYW1lID0gaGFuZGxlci5zcGxpdCgnLicpWzBdO1xuICAgICAgY29uc3Qgbm9kZUZpbGVuYW1lID0gYCR7ZmlsZW5hbWV9LmpzYDtcbiAgICAgIGNvbnN0IHB5dGhvbkZpbGVuYW1lID0gYCR7ZmlsZW5hbWV9LnB5YDtcbiAgICAgIGlmIChmYW1pbHkgPT09IFJ1bnRpbWVGYW1pbHkuTk9ERUpTICYmICFmcy5leGlzdHNTeW5jKHBhdGguam9pbihhc3NldFBhdGgsICdub2RlanMnLCAnbm9kZV9tb2R1bGVzJywgbm9kZUZpbGVuYW1lKSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgY2FuYXJ5IHJlc291cmNlIHJlcXVpcmVzIHRoYXQgdGhlIGhhbmRsZXIgaXMgcHJlc2VudCBhdCBcIm5vZGVqcy9ub2RlX21vZHVsZXMvJHtub2RlRmlsZW5hbWV9XCIgYnV0IG5vdCBmb3VuZCBhdCAke3RoaXMuYXNzZXRQYXRofSAoaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkV2F0Y2gvbGF0ZXN0L21vbml0b3JpbmcvQ2xvdWRXYXRjaF9TeW50aGV0aWNzX0NhbmFyaWVzX1dyaXRpbmdDYW5hcnlfTm9kZWpzLmh0bWwpYCk7XG4gICAgICB9XG4gICAgICBpZiAoZmFtaWx5ID09PSBSdW50aW1lRmFtaWx5LlBZVEhPTiAmJiAhZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oYXNzZXRQYXRoLCAncHl0aG9uJywgcHl0aG9uRmlsZW5hbWUpKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBjYW5hcnkgcmVzb3VyY2UgcmVxdWlyZXMgdGhhdCB0aGUgaGFuZGxlciBpcyBwcmVzZW50IGF0IFwicHl0aG9uLyR7cHl0aG9uRmlsZW5hbWV9XCIgYnV0IG5vdCBmb3VuZCBhdCAke3RoaXMuYXNzZXRQYXRofSAoaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkV2F0Y2gvbGF0ZXN0L21vbml0b3JpbmcvQ2xvdWRXYXRjaF9TeW50aGV0aWNzX0NhbmFyaWVzX1dyaXRpbmdDYW5hcnlfUHl0aG9uLmh0bWwpYCk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQ2FuYXJ5IGNvZGUgZnJvbSBhbiBpbmxpbmUgc3RyaW5nLlxuICovXG5leHBvcnQgY2xhc3MgSW5saW5lQ29kZSBleHRlbmRzIENvZGUge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBjb2RlOiBzdHJpbmcpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgaWYgKGNvZGUubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NhbmFyeSBpbmxpbmUgY29kZSBjYW5ub3QgYmUgZW1wdHknKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgYmluZChfc2NvcGU6IENvbnN0cnVjdCwgaGFuZGxlcjogc3RyaW5nLCBfZmFtaWx5OiBSdW50aW1lRmFtaWx5KTogQ29kZUNvbmZpZyB7XG5cbiAgICBpZiAoaGFuZGxlciAhPT0gJ2luZGV4LmhhbmRsZXInKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBoYW5kbGVyIGZvciBpbmxpbmUgY29kZSBtdXN0IGJlIFwiaW5kZXguaGFuZGxlclwiIChnb3QgXCIke2hhbmRsZXJ9XCIpYCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGlubGluZUNvZGU6IHRoaXMuY29kZSxcbiAgICB9O1xuICB9XG59XG5cbi8qKlxuICogUzMgYnVja2V0IHBhdGggdG8gdGhlIGNvZGUgemlwIGZpbGVcbiAqL1xuZXhwb3J0IGNsYXNzIFMzQ29kZSBleHRlbmRzIENvZGUge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBidWNrZXQ6IHMzLklCdWNrZXQsIHByaXZhdGUga2V5OiBzdHJpbmcsIHByaXZhdGUgb2JqZWN0VmVyc2lvbj86IHN0cmluZykge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBwdWJsaWMgYmluZChfc2NvcGU6IENvbnN0cnVjdCwgX2hhbmRsZXI6IHN0cmluZywgX2ZhbWlseTogUnVudGltZUZhbWlseSk6IENvZGVDb25maWcge1xuICAgIHJldHVybiB7XG4gICAgICBzM0xvY2F0aW9uOiB7XG4gICAgICAgIGJ1Y2tldE5hbWU6IHRoaXMuYnVja2V0LmJ1Y2tldE5hbWUsXG4gICAgICAgIG9iamVjdEtleTogdGhpcy5rZXksXG4gICAgICAgIG9iamVjdFZlcnNpb246IHRoaXMub2JqZWN0VmVyc2lvbixcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxufVxuIl19 \ No newline at end of file diff --git a/packages/@aws-cdk/aws-synthetics-alpha/lib/index.d.ts b/packages/@aws-cdk/aws-synthetics-alpha/lib/index.d.ts new file mode 100644 index 0000000000000..6d568ad6cec84 --- /dev/null +++ b/packages/@aws-cdk/aws-synthetics-alpha/lib/index.d.ts @@ -0,0 +1,4 @@ +export * from './canary'; +export * from './code'; +export * from './runtime'; +export * from './schedule'; diff --git a/packages/@aws-cdk/aws-synthetics-alpha/lib/index.js b/packages/@aws-cdk/aws-synthetics-alpha/lib/index.js new file mode 100644 index 0000000000000..dbca29433d92f --- /dev/null +++ b/packages/@aws-cdk/aws-synthetics-alpha/lib/index.js @@ -0,0 +1,22 @@ +"use strict"; +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __exportStar = (this && this.__exportStar) || function(m, exports) { + for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +__exportStar(require("./canary"), exports); +__exportStar(require("./code"), exports); +__exportStar(require("./runtime"), exports); +__exportStar(require("./schedule"), exports); +// AWS::Synthetics CloudFormation Resources: +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsMkNBQXlCO0FBQ3pCLHlDQUF1QjtBQUN2Qiw0Q0FBMEI7QUFDMUIsNkNBQTJCO0FBRTNCLDRDQUE0QyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vY2FuYXJ5JztcbmV4cG9ydCAqIGZyb20gJy4vY29kZSc7XG5leHBvcnQgKiBmcm9tICcuL3J1bnRpbWUnO1xuZXhwb3J0ICogZnJvbSAnLi9zY2hlZHVsZSc7XG5cbi8vIEFXUzo6U3ludGhldGljcyBDbG91ZEZvcm1hdGlvbiBSZXNvdXJjZXM6XG4iXX0= \ No newline at end of file diff --git a/packages/@aws-cdk/aws-synthetics-alpha/lib/runtime.d.ts b/packages/@aws-cdk/aws-synthetics-alpha/lib/runtime.d.ts new file mode 100644 index 0000000000000..1537bad63b638 --- /dev/null +++ b/packages/@aws-cdk/aws-synthetics-alpha/lib/runtime.d.ts @@ -0,0 +1,280 @@ +/** + * All known Lambda runtime families. + */ +export declare enum RuntimeFamily { + /** + * All Lambda runtimes that depend on Node.js. + */ + NODEJS = 0, + /** + * All lambda runtimes that depend on Python. + */ + PYTHON = 1, + /** + * Any future runtime family. + */ + OTHER = 2 +} +/** + * Runtime options for a canary + */ +export declare class Runtime { + readonly name: string; + readonly family: RuntimeFamily; + /** + * **Deprecated by AWS Synthetics. You can't create canaries with deprecated runtimes.** + * + * `syn-1.0` includes the following: + * + * - Synthetics library 1.0 + * - Synthetics handler code 1.0 + * - Lambda runtime Node.js 10.x + * - Puppeteer-core version 1.14.0 + * - The Chromium version that matches Puppeteer-core 1.14.0 + * + * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Library_nodejs_puppeteer.html#CloudWatch_Synthetics_runtimeversion-1.0 + * @deprecated Use the latest version instead + */ + static readonly SYNTHETICS_1_0: Runtime; + /** + * **Deprecated by AWS Synthetics. You can't create canaries with deprecated runtimes.** + * + * `syn-nodejs-2.0` includes the following: + * - Lambda runtime Node.js 10.x + * - Puppeteer-core version 3.3.0 + * - Chromium version 83.0.4103.0 + * + * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Library_nodejs_puppeteer.html#CloudWatch_Synthetics_runtimeversion-2.0 + * @deprecated Use the latest version instead + */ + static readonly SYNTHETICS_NODEJS_2_0: Runtime; + /** + * **Deprecated by AWS Synthetics. You can't create canaries with deprecated runtimes.** + * + * `syn-nodejs-2.1` includes the following: + * - Lambda runtime Node.js 10.x + * - Puppeteer-core version 3.3.0 + * - Chromium version 83.0.4103.0 + * + * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Library_nodejs_puppeteer.html#CloudWatch_Synthetics_runtimeversion-2.1 + * @deprecated Use the latest version instead + */ + static readonly SYNTHETICS_NODEJS_2_1: Runtime; + /** + * **Deprecated by AWS Synthetics. You can't create canaries with deprecated runtimes.** + * + * `syn-nodejs-2.2` includes the following: + * - Lambda runtime Node.js 10.x + * - Puppeteer-core version 3.3.0 + * - Chromium version 83.0.4103.0 + * + * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Library_nodejs_puppeteer.html#CloudWatch_Synthetics_runtimeversion-2.2 + * @deprecated Use the latest version instead + */ + static readonly SYNTHETICS_NODEJS_2_2: Runtime; + /** + * **Deprecated by AWS Synthetics. You can't create canaries with deprecated runtimes.** + * + * `syn-nodejs-puppeteer-3.0` includes the following: + * - Lambda runtime Node.js 12.x + * - Puppeteer-core version 5.5.0 + * - Chromium version 88.0.4298.0 + * + * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Library_nodejs_puppeteer.html#CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-3.0 + * @deprecated Use the latest version instead + */ + static readonly SYNTHETICS_NODEJS_PUPPETEER_3_0: Runtime; + /** + * **Deprecated by AWS Synthetics. You can't create canaries with deprecated runtimes.** + * + * `syn-nodejs-puppeteer-3.1` includes the following: + * - Lambda runtime Node.js 12.x + * - Puppeteer-core version 5.5.0 + * - Chromium version 88.0.4298.0 + * + * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Library_nodejs_puppeteer.html#CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-3.1 + * @deprecated Use the latest version instead + */ + static readonly SYNTHETICS_NODEJS_PUPPETEER_3_1: Runtime; + /** + * **Deprecated by AWS Synthetics. You can't create canaries with deprecated runtimes.** + * + * `syn-nodejs-puppeteer-3.2` includes the following: + * - Lambda runtime Node.js 12.x + * - Puppeteer-core version 5.5.0 + * - Chromium version 88.0.4298.0 + * + * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Library_nodejs_puppeteer.html#CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-3.2 + * @deprecated Use the latest version instead + */ + static readonly SYNTHETICS_NODEJS_PUPPETEER_3_2: Runtime; + /** + * `syn-nodejs-puppeteer-3.3` includes the following: + * **Deprecated by AWS Synthetics. You can't create canaries with deprecated runtimes.** + * + * - Lambda runtime Node.js 12.x + * - Puppeteer-core version 5.5.0 + * - Chromium version 88.0.4298.0 + * + * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Library_nodejs_puppeteer.html#CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-3.3 + * @deprecated Use the latest version instead + */ + static readonly SYNTHETICS_NODEJS_PUPPETEER_3_3: Runtime; + /** + * **Deprecated by AWS Synthetics. You can't create canaries with deprecated runtimes.** + * + * `syn-nodejs-puppeteer-3.4` includes the following: + * - Lambda runtime Node.js 12.x + * - Puppeteer-core version 5.5.0 + * - Chromium version 88.0.4298.0 + * + * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Library_nodejs_puppeteer.html#CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-3.4 + * @deprecated Use the latest version instead + */ + static readonly SYNTHETICS_NODEJS_PUPPETEER_3_4: Runtime; + /** + * `syn-nodejs-puppeteer-3.5` includes the following: + * - Lambda runtime Node.js 14.x + * - Puppeteer-core version 10.1.0 + * - Chromium version 92.0.4512 + * + * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Library_nodejs_puppeteer.html#CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-3.5 + */ + static readonly SYNTHETICS_NODEJS_PUPPETEER_3_5: Runtime; + /** + * `syn-nodejs-puppeteer-3.6` includes the following: + * - Lambda runtime Node.js 14.x + * - Puppeteer-core version 10.1.0 + * - Chromium version 92.0.4512 + * + * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Library_nodejs_puppeteer.html#CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-3.6 + */ + static readonly SYNTHETICS_NODEJS_PUPPETEER_3_6: Runtime; + /** + * `syn-nodejs-puppeteer-3.7` includes the following: + * - Lambda runtime Node.js 14.x + * - Puppeteer-core version 10.1.0 + * - Chromium version 92.0.4512 + * + * New Features: + * - **Logging enhancement**: The canary will upload logs to Amazon S3 even if it times out or crashes. + * - **Lambda layer size reduced**: The size of the Lambda layer used for canaries is reduced by 34%. + * + * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Library_nodejs_puppeteer.html#CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-3.7 + */ + static readonly SYNTHETICS_NODEJS_PUPPETEER_3_7: Runtime; + /** + * `syn-nodejs-puppeteer-3.8` includes the following: + * - Lambda runtime Node.js 14.x + * - Puppeteer-core version 10.1.0 + * - Chromium version 92.0.4512 + * + * New Features: + * - **Profile cleanup**: Chromium profiles are now cleaned up after each canary run. + * + * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Library_nodejs_puppeteer.html#CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-3.8 + */ + static readonly SYNTHETICS_NODEJS_PUPPETEER_3_8: Runtime; + /** + * `syn-nodejs-puppeteer-3.9` includes the following: + * + * - Lambda runtime Node.js 14.x + * - Puppeteer-core version 5.5.0 + * - Chromium version 92.0.4512 + * + * New Features: + * - **Dependency upgrades**: Upgrades some third-party dependency packages. + * + * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Library_nodejs_puppeteer.html#CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-3.9 + */ + static readonly SYNTHETICS_NODEJS_PUPPETEER_3_9: Runtime; + /** + * `syn-nodejs-puppeteer-4.0` includes the following: + * - Lambda runtime Node.js 16.x + * - Puppeteer-core version 5.5.0 + * - Chromium version 92.0.4512 + * + * New Features: + * - **Dependency upgrades**: The Node.js dependency is updated to 16.x. + * + * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Library_nodejs_puppeteer.html#CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-4.0 + */ + static readonly SYNTHETICS_NODEJS_PUPPETEER_4_0: Runtime; + /** + * `syn-nodejs-puppeteer-5.0` includes the following: + * - Lambda runtime Node.js 16.x + * - Puppeteer-core version 19.7.0 + * - Chromium version 111.0.5563.146 + * + * New Features: + * - **Dependency upgrade**: The Puppeteer-core version is updated to 19.7.0. The Chromium version is upgraded to 111.0.5563.146. + * + * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Library_nodejs_puppeteer.html#CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-5.0 + */ + static readonly SYNTHETICS_NODEJS_PUPPETEER_5_0: Runtime; + /** + * `syn-nodejs-puppeteer-5.1` includes the following: + * - Lambda runtime Node.js 16.x + * - Puppeteer-core version 19.7.0 + * - Chromium version 111.0.5563.146 + * + * Bug fixes: + * - **Bug fix**: This runtime fixes a bug in `syn-nodejs-puppeteer-5.0` where the HAR files created by the canaries were missing request headers. + * + * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Library_nodejs_puppeteer.html#CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-5.1 + */ + static readonly SYNTHETICS_NODEJS_PUPPETEER_5_1: Runtime; + /** + * `syn-python-selenium-1.0` includes the following: + * - Lambda runtime Python 3.8 + * - Selenium version 3.141.0 + * - Chromium version 83.0.4103.0 + * + * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Library_python_selenium.html#CloudWatch_Synthetics_runtimeversion-syn-python-selenium-1.0 + */ + static readonly SYNTHETICS_PYTHON_SELENIUM_1_0: Runtime; + /** + * `syn-python-selenium-1.1` includes the following: + * - Lambda runtime Python 3.8 + * - Selenium version 3.141.0 + * - Chromium version 83.0.4103.0 + * + * New Features: + * - **Custom handler function**: You can now use a custom handler function for your canary scripts. + * - **Configuration options for adding metrics and step failure configurations**: These options were already available in runtimes for Node.js canaries. + * - **Custom arguments in Chrome**: You can now open a browser in incognito mode or pass in proxy server configuration. + * - **Cross-Region artifact buckets**: A canary can store its artifacts in an Amazon S3 bucket in a different Region. + * + * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Library_python_selenium.html#CloudWatch_Synthetics_runtimeversion-syn-python-selenium-1.1 + */ + static readonly SYNTHETICS_PYTHON_SELENIUM_1_1: Runtime; + /** + * `syn-python-selenium-1.2` includes the following: + * - Lambda runtime Python 3.8 + * - Selenium version 3.141.0 + * - Chromium version 92.0.4512.0 + * + * New Features: + * - **Updated dependencies**: The only new features in this runtime are the updated dependencies. + * + * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Library_python_selenium.html#CloudWatch_Synthetics_runtimeversion-syn-python-selenium-1.2 + */ + static readonly SYNTHETICS_PYTHON_SELENIUM_1_2: Runtime; + /** + * `syn-python-selenium-1.3` includes the following: + * - Lambda runtime Python 3.8 + * - Selenium version 3.141.0 + * - Chromium version 92.0.4512.0 + * + * New Features: + * - **More precise timestamps**: The start time and stop time of canary runs are now precise to the millisecond. + * + * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Library_python_selenium.html#CloudWatch_Synthetics_runtimeversion-syn-python-selenium-1.3 + */ + static readonly SYNTHETICS_PYTHON_SELENIUM_1_3: Runtime; + /** + * @param name The name of the runtime version + * @param family The Lambda runtime family + */ + constructor(name: string, family: RuntimeFamily); +} diff --git a/packages/@aws-cdk/aws-synthetics-alpha/lib/runtime.js b/packages/@aws-cdk/aws-synthetics-alpha/lib/runtime.js new file mode 100644 index 0000000000000..545c77d0fe8a9 --- /dev/null +++ b/packages/@aws-cdk/aws-synthetics-alpha/lib/runtime.js @@ -0,0 +1,302 @@ +"use strict"; +var _a; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Runtime = exports.RuntimeFamily = void 0; +const jsiiDeprecationWarnings = require("../.warnings.jsii.js"); +const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti"); +/** + * All known Lambda runtime families. + */ +var RuntimeFamily; +(function (RuntimeFamily) { + /** + * All Lambda runtimes that depend on Node.js. + */ + RuntimeFamily[RuntimeFamily["NODEJS"] = 0] = "NODEJS"; + /** + * All lambda runtimes that depend on Python. + */ + RuntimeFamily[RuntimeFamily["PYTHON"] = 1] = "PYTHON"; + /** + * Any future runtime family. + */ + RuntimeFamily[RuntimeFamily["OTHER"] = 2] = "OTHER"; +})(RuntimeFamily || (exports.RuntimeFamily = RuntimeFamily = {})); +/** + * Runtime options for a canary + */ +class Runtime { + /** + * @param name The name of the runtime version + * @param family The Lambda runtime family + */ + constructor(name, family) { + this.name = name; + this.family = family; + try { + jsiiDeprecationWarnings.print("@aws-cdk/aws-synthetics-alpha.Runtime", ""); + jsiiDeprecationWarnings._aws_cdk_aws_synthetics_alpha_RuntimeFamily(family); + } + catch (error) { + if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { + Error.captureStackTrace(error, Runtime); + } + throw error; + } + } +} +exports.Runtime = Runtime; +_a = JSII_RTTI_SYMBOL_1; +Runtime[_a] = { fqn: "@aws-cdk/aws-synthetics-alpha.Runtime", version: "0.0.0" }; +/** + * **Deprecated by AWS Synthetics. You can't create canaries with deprecated runtimes.** + * + * `syn-1.0` includes the following: + * + * - Synthetics library 1.0 + * - Synthetics handler code 1.0 + * - Lambda runtime Node.js 10.x + * - Puppeteer-core version 1.14.0 + * - The Chromium version that matches Puppeteer-core 1.14.0 + * + * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Library_nodejs_puppeteer.html#CloudWatch_Synthetics_runtimeversion-1.0 + * @deprecated Use the latest version instead + */ +Runtime.SYNTHETICS_1_0 = new Runtime('syn-1.0', RuntimeFamily.NODEJS); +/** + * **Deprecated by AWS Synthetics. You can't create canaries with deprecated runtimes.** + * + * `syn-nodejs-2.0` includes the following: + * - Lambda runtime Node.js 10.x + * - Puppeteer-core version 3.3.0 + * - Chromium version 83.0.4103.0 + * + * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Library_nodejs_puppeteer.html#CloudWatch_Synthetics_runtimeversion-2.0 + * @deprecated Use the latest version instead + */ +Runtime.SYNTHETICS_NODEJS_2_0 = new Runtime('syn-nodejs-2.0', RuntimeFamily.NODEJS); +/** + * **Deprecated by AWS Synthetics. You can't create canaries with deprecated runtimes.** + * + * `syn-nodejs-2.1` includes the following: + * - Lambda runtime Node.js 10.x + * - Puppeteer-core version 3.3.0 + * - Chromium version 83.0.4103.0 + * + * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Library_nodejs_puppeteer.html#CloudWatch_Synthetics_runtimeversion-2.1 + * @deprecated Use the latest version instead + */ +Runtime.SYNTHETICS_NODEJS_2_1 = new Runtime('syn-nodejs-2.1', RuntimeFamily.NODEJS); +/** + * **Deprecated by AWS Synthetics. You can't create canaries with deprecated runtimes.** + * + * `syn-nodejs-2.2` includes the following: + * - Lambda runtime Node.js 10.x + * - Puppeteer-core version 3.3.0 + * - Chromium version 83.0.4103.0 + * + * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Library_nodejs_puppeteer.html#CloudWatch_Synthetics_runtimeversion-2.2 + * @deprecated Use the latest version instead + */ +Runtime.SYNTHETICS_NODEJS_2_2 = new Runtime('syn-nodejs-2.2', RuntimeFamily.NODEJS); +/** + * **Deprecated by AWS Synthetics. You can't create canaries with deprecated runtimes.** + * + * `syn-nodejs-puppeteer-3.0` includes the following: + * - Lambda runtime Node.js 12.x + * - Puppeteer-core version 5.5.0 + * - Chromium version 88.0.4298.0 + * + * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Library_nodejs_puppeteer.html#CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-3.0 + * @deprecated Use the latest version instead + */ +Runtime.SYNTHETICS_NODEJS_PUPPETEER_3_0 = new Runtime('syn-nodejs-puppeteer-3.0', RuntimeFamily.NODEJS); +/** + * **Deprecated by AWS Synthetics. You can't create canaries with deprecated runtimes.** + * + * `syn-nodejs-puppeteer-3.1` includes the following: + * - Lambda runtime Node.js 12.x + * - Puppeteer-core version 5.5.0 + * - Chromium version 88.0.4298.0 + * + * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Library_nodejs_puppeteer.html#CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-3.1 + * @deprecated Use the latest version instead + */ +Runtime.SYNTHETICS_NODEJS_PUPPETEER_3_1 = new Runtime('syn-nodejs-puppeteer-3.1', RuntimeFamily.NODEJS); +/** + * **Deprecated by AWS Synthetics. You can't create canaries with deprecated runtimes.** + * + * `syn-nodejs-puppeteer-3.2` includes the following: + * - Lambda runtime Node.js 12.x + * - Puppeteer-core version 5.5.0 + * - Chromium version 88.0.4298.0 + * + * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Library_nodejs_puppeteer.html#CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-3.2 + * @deprecated Use the latest version instead + */ +Runtime.SYNTHETICS_NODEJS_PUPPETEER_3_2 = new Runtime('syn-nodejs-puppeteer-3.2', RuntimeFamily.NODEJS); +/** + * `syn-nodejs-puppeteer-3.3` includes the following: + * **Deprecated by AWS Synthetics. You can't create canaries with deprecated runtimes.** + * + * - Lambda runtime Node.js 12.x + * - Puppeteer-core version 5.5.0 + * - Chromium version 88.0.4298.0 + * + * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Library_nodejs_puppeteer.html#CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-3.3 + * @deprecated Use the latest version instead + */ +Runtime.SYNTHETICS_NODEJS_PUPPETEER_3_3 = new Runtime('syn-nodejs-puppeteer-3.3', RuntimeFamily.NODEJS); +/** + * **Deprecated by AWS Synthetics. You can't create canaries with deprecated runtimes.** + * + * `syn-nodejs-puppeteer-3.4` includes the following: + * - Lambda runtime Node.js 12.x + * - Puppeteer-core version 5.5.0 + * - Chromium version 88.0.4298.0 + * + * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Library_nodejs_puppeteer.html#CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-3.4 + * @deprecated Use the latest version instead + */ +Runtime.SYNTHETICS_NODEJS_PUPPETEER_3_4 = new Runtime('syn-nodejs-puppeteer-3.4', RuntimeFamily.NODEJS); +/** + * `syn-nodejs-puppeteer-3.5` includes the following: + * - Lambda runtime Node.js 14.x + * - Puppeteer-core version 10.1.0 + * - Chromium version 92.0.4512 + * + * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Library_nodejs_puppeteer.html#CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-3.5 + */ +Runtime.SYNTHETICS_NODEJS_PUPPETEER_3_5 = new Runtime('syn-nodejs-puppeteer-3.5', RuntimeFamily.NODEJS); +/** + * `syn-nodejs-puppeteer-3.6` includes the following: + * - Lambda runtime Node.js 14.x + * - Puppeteer-core version 10.1.0 + * - Chromium version 92.0.4512 + * + * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Library_nodejs_puppeteer.html#CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-3.6 + */ +Runtime.SYNTHETICS_NODEJS_PUPPETEER_3_6 = new Runtime('syn-nodejs-puppeteer-3.6', RuntimeFamily.NODEJS); +/** + * `syn-nodejs-puppeteer-3.7` includes the following: + * - Lambda runtime Node.js 14.x + * - Puppeteer-core version 10.1.0 + * - Chromium version 92.0.4512 + * + * New Features: + * - **Logging enhancement**: The canary will upload logs to Amazon S3 even if it times out or crashes. + * - **Lambda layer size reduced**: The size of the Lambda layer used for canaries is reduced by 34%. + * + * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Library_nodejs_puppeteer.html#CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-3.7 + */ +Runtime.SYNTHETICS_NODEJS_PUPPETEER_3_7 = new Runtime('syn-nodejs-puppeteer-3.7', RuntimeFamily.NODEJS); +/** + * `syn-nodejs-puppeteer-3.8` includes the following: + * - Lambda runtime Node.js 14.x + * - Puppeteer-core version 10.1.0 + * - Chromium version 92.0.4512 + * + * New Features: + * - **Profile cleanup**: Chromium profiles are now cleaned up after each canary run. + * + * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Library_nodejs_puppeteer.html#CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-3.8 + */ +Runtime.SYNTHETICS_NODEJS_PUPPETEER_3_8 = new Runtime('syn-nodejs-puppeteer-3.8', RuntimeFamily.NODEJS); +/** + * `syn-nodejs-puppeteer-3.9` includes the following: + * + * - Lambda runtime Node.js 14.x + * - Puppeteer-core version 5.5.0 + * - Chromium version 92.0.4512 + * + * New Features: + * - **Dependency upgrades**: Upgrades some third-party dependency packages. + * + * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Library_nodejs_puppeteer.html#CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-3.9 + */ +Runtime.SYNTHETICS_NODEJS_PUPPETEER_3_9 = new Runtime('syn-nodejs-puppeteer-3.9', RuntimeFamily.NODEJS); +/** + * `syn-nodejs-puppeteer-4.0` includes the following: + * - Lambda runtime Node.js 16.x + * - Puppeteer-core version 5.5.0 + * - Chromium version 92.0.4512 + * + * New Features: + * - **Dependency upgrades**: The Node.js dependency is updated to 16.x. + * + * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Library_nodejs_puppeteer.html#CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-4.0 + */ +Runtime.SYNTHETICS_NODEJS_PUPPETEER_4_0 = new Runtime('syn-nodejs-puppeteer-4.0', RuntimeFamily.NODEJS); +/** + * `syn-nodejs-puppeteer-5.0` includes the following: + * - Lambda runtime Node.js 16.x + * - Puppeteer-core version 19.7.0 + * - Chromium version 111.0.5563.146 + * + * New Features: + * - **Dependency upgrade**: The Puppeteer-core version is updated to 19.7.0. The Chromium version is upgraded to 111.0.5563.146. + * + * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Library_nodejs_puppeteer.html#CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-5.0 + */ +Runtime.SYNTHETICS_NODEJS_PUPPETEER_5_0 = new Runtime('syn-nodejs-puppeteer-5.0', RuntimeFamily.NODEJS); +/** + * `syn-nodejs-puppeteer-5.1` includes the following: + * - Lambda runtime Node.js 16.x + * - Puppeteer-core version 19.7.0 + * - Chromium version 111.0.5563.146 + * + * Bug fixes: + * - **Bug fix**: This runtime fixes a bug in `syn-nodejs-puppeteer-5.0` where the HAR files created by the canaries were missing request headers. + * + * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Library_nodejs_puppeteer.html#CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-5.1 + */ +Runtime.SYNTHETICS_NODEJS_PUPPETEER_5_1 = new Runtime('syn-nodejs-puppeteer-5.1', RuntimeFamily.NODEJS); +/** + * `syn-python-selenium-1.0` includes the following: + * - Lambda runtime Python 3.8 + * - Selenium version 3.141.0 + * - Chromium version 83.0.4103.0 + * + * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Library_python_selenium.html#CloudWatch_Synthetics_runtimeversion-syn-python-selenium-1.0 + */ +Runtime.SYNTHETICS_PYTHON_SELENIUM_1_0 = new Runtime('syn-python-selenium-1.0', RuntimeFamily.PYTHON); +/** + * `syn-python-selenium-1.1` includes the following: + * - Lambda runtime Python 3.8 + * - Selenium version 3.141.0 + * - Chromium version 83.0.4103.0 + * + * New Features: + * - **Custom handler function**: You can now use a custom handler function for your canary scripts. + * - **Configuration options for adding metrics and step failure configurations**: These options were already available in runtimes for Node.js canaries. + * - **Custom arguments in Chrome**: You can now open a browser in incognito mode or pass in proxy server configuration. + * - **Cross-Region artifact buckets**: A canary can store its artifacts in an Amazon S3 bucket in a different Region. + * + * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Library_python_selenium.html#CloudWatch_Synthetics_runtimeversion-syn-python-selenium-1.1 + */ +Runtime.SYNTHETICS_PYTHON_SELENIUM_1_1 = new Runtime('syn-python-selenium-1.1', RuntimeFamily.PYTHON); +/** + * `syn-python-selenium-1.2` includes the following: + * - Lambda runtime Python 3.8 + * - Selenium version 3.141.0 + * - Chromium version 92.0.4512.0 + * + * New Features: + * - **Updated dependencies**: The only new features in this runtime are the updated dependencies. + * + * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Library_python_selenium.html#CloudWatch_Synthetics_runtimeversion-syn-python-selenium-1.2 + */ +Runtime.SYNTHETICS_PYTHON_SELENIUM_1_2 = new Runtime('syn-python-selenium-1.2', RuntimeFamily.PYTHON); +/** + * `syn-python-selenium-1.3` includes the following: + * - Lambda runtime Python 3.8 + * - Selenium version 3.141.0 + * - Chromium version 92.0.4512.0 + * + * New Features: + * - **More precise timestamps**: The start time and stop time of canary runs are now precise to the millisecond. + * + * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Library_python_selenium.html#CloudWatch_Synthetics_runtimeversion-syn-python-selenium-1.3 + */ +Runtime.SYNTHETICS_PYTHON_SELENIUM_1_3 = new Runtime('syn-python-selenium-1.3', RuntimeFamily.PYTHON); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInJ1bnRpbWUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUE7O0dBRUc7QUFDSCxJQUFZLGFBZVg7QUFmRCxXQUFZLGFBQWE7SUFDdkI7O09BRUc7SUFDSCxxREFBTSxDQUFBO0lBRU47O09BRUc7SUFDSCxxREFBTSxDQUFBO0lBRU47O09BRUc7SUFDSCxtREFBSyxDQUFBO0FBQ1AsQ0FBQyxFQWZXLGFBQWEsNkJBQWIsYUFBYSxRQWV4QjtBQUVEOztHQUVHO0FBQ0gsTUFBYSxPQUFPO0lBaVJsQjs7O1FBR0k7SUFDSixZQUFtQyxJQUFZLEVBQWtCLE1BQXFCO1FBQW5ELFNBQUksR0FBSixJQUFJLENBQVE7UUFBa0IsV0FBTSxHQUFOLE1BQU0sQ0FBZTs7Ozs7OzsrQ0FyUjNFLE9BQU87Ozs7S0FzUmpCOztBQXRSSCwwQkF1UkM7OztBQXRSQzs7Ozs7Ozs7Ozs7OztHQWFHO0FBQ29CLHNCQUFjLEdBQUcsSUFBSSxPQUFPLENBQUMsU0FBUyxFQUFFLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUVyRjs7Ozs7Ozs7OztHQVVHO0FBQ29CLDZCQUFxQixHQUFHLElBQUksT0FBTyxDQUFDLGdCQUFnQixFQUFFLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUVuRzs7Ozs7Ozs7OztHQVVHO0FBQ29CLDZCQUFxQixHQUFHLElBQUksT0FBTyxDQUFDLGdCQUFnQixFQUFFLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUVuRzs7Ozs7Ozs7OztHQVVHO0FBQ29CLDZCQUFxQixHQUFHLElBQUksT0FBTyxDQUFDLGdCQUFnQixFQUFFLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUVuRzs7Ozs7Ozs7OztHQVVHO0FBQ29CLHVDQUErQixHQUFHLElBQUksT0FBTyxDQUFDLDBCQUEwQixFQUFFLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUV2SDs7Ozs7Ozs7OztHQVVHO0FBQ29CLHVDQUErQixHQUFHLElBQUksT0FBTyxDQUFDLDBCQUEwQixFQUFFLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUV2SDs7Ozs7Ozs7OztHQVVHO0FBQ29CLHVDQUErQixHQUFHLElBQUksT0FBTyxDQUFDLDBCQUEwQixFQUFFLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUV2SDs7Ozs7Ozs7OztHQVVHO0FBQ29CLHVDQUErQixHQUFHLElBQUksT0FBTyxDQUFDLDBCQUEwQixFQUFFLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUV2SDs7Ozs7Ozs7OztHQVVHO0FBQ29CLHVDQUErQixHQUFHLElBQUksT0FBTyxDQUFDLDBCQUEwQixFQUFFLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUV2SDs7Ozs7OztHQU9HO0FBQ29CLHVDQUErQixHQUFHLElBQUksT0FBTyxDQUFDLDBCQUEwQixFQUFFLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUV2SDs7Ozs7OztHQU9HO0FBQ29CLHVDQUErQixHQUFHLElBQUksT0FBTyxDQUFDLDBCQUEwQixFQUFFLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUV2SDs7Ozs7Ozs7Ozs7R0FXRztBQUNvQix1Q0FBK0IsR0FBRyxJQUFJLE9BQU8sQ0FBQywwQkFBMEIsRUFBRSxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7QUFFdkg7Ozs7Ozs7Ozs7R0FVRztBQUNvQix1Q0FBK0IsR0FBRyxJQUFJLE9BQU8sQ0FBQywwQkFBMEIsRUFBRSxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7QUFFdkg7Ozs7Ozs7Ozs7O0dBV0c7QUFDb0IsdUNBQStCLEdBQUcsSUFBSSxPQUFPLENBQUMsMEJBQTBCLEVBQUUsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBRXZIOzs7Ozs7Ozs7O0dBVUc7QUFDb0IsdUNBQStCLEdBQUcsSUFBSSxPQUFPLENBQUMsMEJBQTBCLEVBQUUsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBRXZIOzs7Ozs7Ozs7O0dBVUc7QUFDb0IsdUNBQStCLEdBQUcsSUFBSSxPQUFPLENBQUMsMEJBQTBCLEVBQUUsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBRXZIOzs7Ozs7Ozs7O0dBVUc7QUFDb0IsdUNBQStCLEdBQUcsSUFBSSxPQUFPLENBQUMsMEJBQTBCLEVBQUUsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBRXZIOzs7Ozs7O0dBT0c7QUFDb0Isc0NBQThCLEdBQUcsSUFBSSxPQUFPLENBQUMseUJBQXlCLEVBQUUsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBRXJIOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFDb0Isc0NBQThCLEdBQUcsSUFBSSxPQUFPLENBQUMseUJBQXlCLEVBQUUsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBRXJIOzs7Ozs7Ozs7O0dBVUc7QUFDb0Isc0NBQThCLEdBQUcsSUFBSSxPQUFPLENBQUMseUJBQXlCLEVBQUUsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBRXJIOzs7Ozs7Ozs7O0dBVUc7QUFDb0Isc0NBQThCLEdBQUcsSUFBSSxPQUFPLENBQUMseUJBQXlCLEVBQUUsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBBbGwga25vd24gTGFtYmRhIHJ1bnRpbWUgZmFtaWxpZXMuXG4gKi9cbmV4cG9ydCBlbnVtIFJ1bnRpbWVGYW1pbHkge1xuICAvKipcbiAgICogQWxsIExhbWJkYSBydW50aW1lcyB0aGF0IGRlcGVuZCBvbiBOb2RlLmpzLlxuICAgKi9cbiAgTk9ERUpTLFxuXG4gIC8qKlxuICAgKiBBbGwgbGFtYmRhIHJ1bnRpbWVzIHRoYXQgZGVwZW5kIG9uIFB5dGhvbi5cbiAgICovXG4gIFBZVEhPTixcblxuICAvKipcbiAgICogQW55IGZ1dHVyZSBydW50aW1lIGZhbWlseS5cbiAgICovXG4gIE9USEVSLFxufVxuXG4vKipcbiAqIFJ1bnRpbWUgb3B0aW9ucyBmb3IgYSBjYW5hcnlcbiAqL1xuZXhwb3J0IGNsYXNzIFJ1bnRpbWUge1xuICAvKipcbiAgICogKipEZXByZWNhdGVkIGJ5IEFXUyBTeW50aGV0aWNzLiBZb3UgY2FuJ3QgY3JlYXRlIGNhbmFyaWVzIHdpdGggZGVwcmVjYXRlZCBydW50aW1lcy4qKlxuICAgKlxuICAgKiBgc3luLTEuMGAgaW5jbHVkZXMgdGhlIGZvbGxvd2luZzpcbiAgICpcbiAgICogLSBTeW50aGV0aWNzIGxpYnJhcnkgMS4wXG4gICAqIC0gU3ludGhldGljcyBoYW5kbGVyIGNvZGUgMS4wXG4gICAqIC0gTGFtYmRhIHJ1bnRpbWUgTm9kZS5qcyAxMC54XG4gICAqIC0gUHVwcGV0ZWVyLWNvcmUgdmVyc2lvbiAxLjE0LjBcbiAgICogLSBUaGUgQ2hyb21pdW0gdmVyc2lvbiB0aGF0IG1hdGNoZXMgUHVwcGV0ZWVyLWNvcmUgMS4xNC4wXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkV2F0Y2gvbGF0ZXN0L21vbml0b3JpbmcvQ2xvdWRXYXRjaF9TeW50aGV0aWNzX0xpYnJhcnlfbm9kZWpzX3B1cHBldGVlci5odG1sI0Nsb3VkV2F0Y2hfU3ludGhldGljc19ydW50aW1ldmVyc2lvbi0xLjBcbiAgICogQGRlcHJlY2F0ZWQgVXNlIHRoZSBsYXRlc3QgdmVyc2lvbiBpbnN0ZWFkXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFNZTlRIRVRJQ1NfMV8wID0gbmV3IFJ1bnRpbWUoJ3N5bi0xLjAnLCBSdW50aW1lRmFtaWx5Lk5PREVKUyk7XG5cbiAgLyoqXG4gICAqICoqRGVwcmVjYXRlZCBieSBBV1MgU3ludGhldGljcy4gWW91IGNhbid0IGNyZWF0ZSBjYW5hcmllcyB3aXRoIGRlcHJlY2F0ZWQgcnVudGltZXMuKipcbiAgICpcbiAgICogYHN5bi1ub2RlanMtMi4wYCBpbmNsdWRlcyB0aGUgZm9sbG93aW5nOlxuICAgKiAtIExhbWJkYSBydW50aW1lIE5vZGUuanMgMTAueFxuICAgKiAtIFB1cHBldGVlci1jb3JlIHZlcnNpb24gMy4zLjBcbiAgICogLSBDaHJvbWl1bSB2ZXJzaW9uIDgzLjAuNDEwMy4wXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkV2F0Y2gvbGF0ZXN0L21vbml0b3JpbmcvQ2xvdWRXYXRjaF9TeW50aGV0aWNzX0xpYnJhcnlfbm9kZWpzX3B1cHBldGVlci5odG1sI0Nsb3VkV2F0Y2hfU3ludGhldGljc19ydW50aW1ldmVyc2lvbi0yLjBcbiAgICogQGRlcHJlY2F0ZWQgVXNlIHRoZSBsYXRlc3QgdmVyc2lvbiBpbnN0ZWFkXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFNZTlRIRVRJQ1NfTk9ERUpTXzJfMCA9IG5ldyBSdW50aW1lKCdzeW4tbm9kZWpzLTIuMCcsIFJ1bnRpbWVGYW1pbHkuTk9ERUpTKTtcblxuICAvKipcbiAgICogKipEZXByZWNhdGVkIGJ5IEFXUyBTeW50aGV0aWNzLiBZb3UgY2FuJ3QgY3JlYXRlIGNhbmFyaWVzIHdpdGggZGVwcmVjYXRlZCBydW50aW1lcy4qKlxuICAgKlxuICAgKiBgc3luLW5vZGVqcy0yLjFgIGluY2x1ZGVzIHRoZSBmb2xsb3dpbmc6XG4gICAqIC0gTGFtYmRhIHJ1bnRpbWUgTm9kZS5qcyAxMC54XG4gICAqIC0gUHVwcGV0ZWVyLWNvcmUgdmVyc2lvbiAzLjMuMFxuICAgKiAtIENocm9taXVtIHZlcnNpb24gODMuMC40MTAzLjBcbiAgICpcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRXYXRjaC9sYXRlc3QvbW9uaXRvcmluZy9DbG91ZFdhdGNoX1N5bnRoZXRpY3NfTGlicmFyeV9ub2RlanNfcHVwcGV0ZWVyLmh0bWwjQ2xvdWRXYXRjaF9TeW50aGV0aWNzX3J1bnRpbWV2ZXJzaW9uLTIuMVxuICAgKiBAZGVwcmVjYXRlZCBVc2UgdGhlIGxhdGVzdCB2ZXJzaW9uIGluc3RlYWRcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgU1lOVEhFVElDU19OT0RFSlNfMl8xID0gbmV3IFJ1bnRpbWUoJ3N5bi1ub2RlanMtMi4xJywgUnVudGltZUZhbWlseS5OT0RFSlMpO1xuXG4gIC8qKlxuICAgKiAqKkRlcHJlY2F0ZWQgYnkgQVdTIFN5bnRoZXRpY3MuIFlvdSBjYW4ndCBjcmVhdGUgY2FuYXJpZXMgd2l0aCBkZXByZWNhdGVkIHJ1bnRpbWVzLioqXG4gICAqXG4gICAqIGBzeW4tbm9kZWpzLTIuMmAgaW5jbHVkZXMgdGhlIGZvbGxvd2luZzpcbiAgICogLSBMYW1iZGEgcnVudGltZSBOb2RlLmpzIDEwLnhcbiAgICogLSBQdXBwZXRlZXItY29yZSB2ZXJzaW9uIDMuMy4wXG4gICAqIC0gQ2hyb21pdW0gdmVyc2lvbiA4My4wLjQxMDMuMFxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZFdhdGNoL2xhdGVzdC9tb25pdG9yaW5nL0Nsb3VkV2F0Y2hfU3ludGhldGljc19MaWJyYXJ5X25vZGVqc19wdXBwZXRlZXIuaHRtbCNDbG91ZFdhdGNoX1N5bnRoZXRpY3NfcnVudGltZXZlcnNpb24tMi4yXG4gICAqIEBkZXByZWNhdGVkIFVzZSB0aGUgbGF0ZXN0IHZlcnNpb24gaW5zdGVhZFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBTWU5USEVUSUNTX05PREVKU18yXzIgPSBuZXcgUnVudGltZSgnc3luLW5vZGVqcy0yLjInLCBSdW50aW1lRmFtaWx5Lk5PREVKUyk7XG5cbiAgLyoqXG4gICAqICoqRGVwcmVjYXRlZCBieSBBV1MgU3ludGhldGljcy4gWW91IGNhbid0IGNyZWF0ZSBjYW5hcmllcyB3aXRoIGRlcHJlY2F0ZWQgcnVudGltZXMuKipcbiAgICpcbiAgICogYHN5bi1ub2RlanMtcHVwcGV0ZWVyLTMuMGAgaW5jbHVkZXMgdGhlIGZvbGxvd2luZzpcbiAgICogLSBMYW1iZGEgcnVudGltZSBOb2RlLmpzIDEyLnhcbiAgICogLSBQdXBwZXRlZXItY29yZSB2ZXJzaW9uIDUuNS4wXG4gICAqIC0gQ2hyb21pdW0gdmVyc2lvbiA4OC4wLjQyOTguMFxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZFdhdGNoL2xhdGVzdC9tb25pdG9yaW5nL0Nsb3VkV2F0Y2hfU3ludGhldGljc19MaWJyYXJ5X25vZGVqc19wdXBwZXRlZXIuaHRtbCNDbG91ZFdhdGNoX1N5bnRoZXRpY3NfcnVudGltZXZlcnNpb24tbm9kZWpzLXB1cHBldGVlci0zLjBcbiAgICogQGRlcHJlY2F0ZWQgVXNlIHRoZSBsYXRlc3QgdmVyc2lvbiBpbnN0ZWFkXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFNZTlRIRVRJQ1NfTk9ERUpTX1BVUFBFVEVFUl8zXzAgPSBuZXcgUnVudGltZSgnc3luLW5vZGVqcy1wdXBwZXRlZXItMy4wJywgUnVudGltZUZhbWlseS5OT0RFSlMpO1xuXG4gIC8qKlxuICAgKiAqKkRlcHJlY2F0ZWQgYnkgQVdTIFN5bnRoZXRpY3MuIFlvdSBjYW4ndCBjcmVhdGUgY2FuYXJpZXMgd2l0aCBkZXByZWNhdGVkIHJ1bnRpbWVzLioqXG4gICAqXG4gICAqIGBzeW4tbm9kZWpzLXB1cHBldGVlci0zLjFgIGluY2x1ZGVzIHRoZSBmb2xsb3dpbmc6XG4gICAqIC0gTGFtYmRhIHJ1bnRpbWUgTm9kZS5qcyAxMi54XG4gICAqIC0gUHVwcGV0ZWVyLWNvcmUgdmVyc2lvbiA1LjUuMFxuICAgKiAtIENocm9taXVtIHZlcnNpb24gODguMC40Mjk4LjBcbiAgICpcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRXYXRjaC9sYXRlc3QvbW9uaXRvcmluZy9DbG91ZFdhdGNoX1N5bnRoZXRpY3NfTGlicmFyeV9ub2RlanNfcHVwcGV0ZWVyLmh0bWwjQ2xvdWRXYXRjaF9TeW50aGV0aWNzX3J1bnRpbWV2ZXJzaW9uLW5vZGVqcy1wdXBwZXRlZXItMy4xXG4gICAqIEBkZXByZWNhdGVkIFVzZSB0aGUgbGF0ZXN0IHZlcnNpb24gaW5zdGVhZFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBTWU5USEVUSUNTX05PREVKU19QVVBQRVRFRVJfM18xID0gbmV3IFJ1bnRpbWUoJ3N5bi1ub2RlanMtcHVwcGV0ZWVyLTMuMScsIFJ1bnRpbWVGYW1pbHkuTk9ERUpTKTtcblxuICAvKipcbiAgICogKipEZXByZWNhdGVkIGJ5IEFXUyBTeW50aGV0aWNzLiBZb3UgY2FuJ3QgY3JlYXRlIGNhbmFyaWVzIHdpdGggZGVwcmVjYXRlZCBydW50aW1lcy4qKlxuICAgKlxuICAgKiBgc3luLW5vZGVqcy1wdXBwZXRlZXItMy4yYCBpbmNsdWRlcyB0aGUgZm9sbG93aW5nOlxuICAgKiAtIExhbWJkYSBydW50aW1lIE5vZGUuanMgMTIueFxuICAgKiAtIFB1cHBldGVlci1jb3JlIHZlcnNpb24gNS41LjBcbiAgICogLSBDaHJvbWl1bSB2ZXJzaW9uIDg4LjAuNDI5OC4wXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkV2F0Y2gvbGF0ZXN0L21vbml0b3JpbmcvQ2xvdWRXYXRjaF9TeW50aGV0aWNzX0xpYnJhcnlfbm9kZWpzX3B1cHBldGVlci5odG1sI0Nsb3VkV2F0Y2hfU3ludGhldGljc19ydW50aW1ldmVyc2lvbi1ub2RlanMtcHVwcGV0ZWVyLTMuMlxuICAgKiBAZGVwcmVjYXRlZCBVc2UgdGhlIGxhdGVzdCB2ZXJzaW9uIGluc3RlYWRcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgU1lOVEhFVElDU19OT0RFSlNfUFVQUEVURUVSXzNfMiA9IG5ldyBSdW50aW1lKCdzeW4tbm9kZWpzLXB1cHBldGVlci0zLjInLCBSdW50aW1lRmFtaWx5Lk5PREVKUyk7XG5cbiAgLyoqXG4gICAqIGBzeW4tbm9kZWpzLXB1cHBldGVlci0zLjNgIGluY2x1ZGVzIHRoZSBmb2xsb3dpbmc6XG4gICAqICoqRGVwcmVjYXRlZCBieSBBV1MgU3ludGhldGljcy4gWW91IGNhbid0IGNyZWF0ZSBjYW5hcmllcyB3aXRoIGRlcHJlY2F0ZWQgcnVudGltZXMuKipcbiAgICpcbiAgICogLSBMYW1iZGEgcnVudGltZSBOb2RlLmpzIDEyLnhcbiAgICogLSBQdXBwZXRlZXItY29yZSB2ZXJzaW9uIDUuNS4wXG4gICAqIC0gQ2hyb21pdW0gdmVyc2lvbiA4OC4wLjQyOTguMFxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZFdhdGNoL2xhdGVzdC9tb25pdG9yaW5nL0Nsb3VkV2F0Y2hfU3ludGhldGljc19MaWJyYXJ5X25vZGVqc19wdXBwZXRlZXIuaHRtbCNDbG91ZFdhdGNoX1N5bnRoZXRpY3NfcnVudGltZXZlcnNpb24tbm9kZWpzLXB1cHBldGVlci0zLjNcbiAgICogQGRlcHJlY2F0ZWQgVXNlIHRoZSBsYXRlc3QgdmVyc2lvbiBpbnN0ZWFkXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFNZTlRIRVRJQ1NfTk9ERUpTX1BVUFBFVEVFUl8zXzMgPSBuZXcgUnVudGltZSgnc3luLW5vZGVqcy1wdXBwZXRlZXItMy4zJywgUnVudGltZUZhbWlseS5OT0RFSlMpO1xuXG4gIC8qKlxuICAgKiAqKkRlcHJlY2F0ZWQgYnkgQVdTIFN5bnRoZXRpY3MuIFlvdSBjYW4ndCBjcmVhdGUgY2FuYXJpZXMgd2l0aCBkZXByZWNhdGVkIHJ1bnRpbWVzLioqXG4gICAqXG4gICAqIGBzeW4tbm9kZWpzLXB1cHBldGVlci0zLjRgIGluY2x1ZGVzIHRoZSBmb2xsb3dpbmc6XG4gICAqIC0gTGFtYmRhIHJ1bnRpbWUgTm9kZS5qcyAxMi54XG4gICAqIC0gUHVwcGV0ZWVyLWNvcmUgdmVyc2lvbiA1LjUuMFxuICAgKiAtIENocm9taXVtIHZlcnNpb24gODguMC40Mjk4LjBcbiAgICpcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRXYXRjaC9sYXRlc3QvbW9uaXRvcmluZy9DbG91ZFdhdGNoX1N5bnRoZXRpY3NfTGlicmFyeV9ub2RlanNfcHVwcGV0ZWVyLmh0bWwjQ2xvdWRXYXRjaF9TeW50aGV0aWNzX3J1bnRpbWV2ZXJzaW9uLW5vZGVqcy1wdXBwZXRlZXItMy40XG4gICAqIEBkZXByZWNhdGVkIFVzZSB0aGUgbGF0ZXN0IHZlcnNpb24gaW5zdGVhZFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBTWU5USEVUSUNTX05PREVKU19QVVBQRVRFRVJfM180ID0gbmV3IFJ1bnRpbWUoJ3N5bi1ub2RlanMtcHVwcGV0ZWVyLTMuNCcsIFJ1bnRpbWVGYW1pbHkuTk9ERUpTKTtcblxuICAvKipcbiAgICogYHN5bi1ub2RlanMtcHVwcGV0ZWVyLTMuNWAgaW5jbHVkZXMgdGhlIGZvbGxvd2luZzpcbiAgICogLSBMYW1iZGEgcnVudGltZSBOb2RlLmpzIDE0LnhcbiAgICogLSBQdXBwZXRlZXItY29yZSB2ZXJzaW9uIDEwLjEuMFxuICAgKiAtIENocm9taXVtIHZlcnNpb24gOTIuMC40NTEyXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkV2F0Y2gvbGF0ZXN0L21vbml0b3JpbmcvQ2xvdWRXYXRjaF9TeW50aGV0aWNzX0xpYnJhcnlfbm9kZWpzX3B1cHBldGVlci5odG1sI0Nsb3VkV2F0Y2hfU3ludGhldGljc19ydW50aW1ldmVyc2lvbi1ub2RlanMtcHVwcGV0ZWVyLTMuNVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBTWU5USEVUSUNTX05PREVKU19QVVBQRVRFRVJfM181ID0gbmV3IFJ1bnRpbWUoJ3N5bi1ub2RlanMtcHVwcGV0ZWVyLTMuNScsIFJ1bnRpbWVGYW1pbHkuTk9ERUpTKTtcblxuICAvKipcbiAgICogYHN5bi1ub2RlanMtcHVwcGV0ZWVyLTMuNmAgaW5jbHVkZXMgdGhlIGZvbGxvd2luZzpcbiAgICogLSBMYW1iZGEgcnVudGltZSBOb2RlLmpzIDE0LnhcbiAgICogLSBQdXBwZXRlZXItY29yZSB2ZXJzaW9uIDEwLjEuMFxuICAgKiAtIENocm9taXVtIHZlcnNpb24gOTIuMC40NTEyXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkV2F0Y2gvbGF0ZXN0L21vbml0b3JpbmcvQ2xvdWRXYXRjaF9TeW50aGV0aWNzX0xpYnJhcnlfbm9kZWpzX3B1cHBldGVlci5odG1sI0Nsb3VkV2F0Y2hfU3ludGhldGljc19ydW50aW1ldmVyc2lvbi1ub2RlanMtcHVwcGV0ZWVyLTMuNlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBTWU5USEVUSUNTX05PREVKU19QVVBQRVRFRVJfM182ID0gbmV3IFJ1bnRpbWUoJ3N5bi1ub2RlanMtcHVwcGV0ZWVyLTMuNicsIFJ1bnRpbWVGYW1pbHkuTk9ERUpTKTtcblxuICAvKipcbiAgICogYHN5bi1ub2RlanMtcHVwcGV0ZWVyLTMuN2AgaW5jbHVkZXMgdGhlIGZvbGxvd2luZzpcbiAgICogLSBMYW1iZGEgcnVudGltZSBOb2RlLmpzIDE0LnhcbiAgICogLSBQdXBwZXRlZXItY29yZSB2ZXJzaW9uIDEwLjEuMFxuICAgKiAtIENocm9taXVtIHZlcnNpb24gOTIuMC40NTEyXG4gICAqXG4gICAqIE5ldyBGZWF0dXJlczpcbiAgICogLSAqKkxvZ2dpbmcgZW5oYW5jZW1lbnQqKjogVGhlIGNhbmFyeSB3aWxsIHVwbG9hZCBsb2dzIHRvIEFtYXpvbiBTMyBldmVuIGlmIGl0IHRpbWVzIG91dCBvciBjcmFzaGVzLlxuICAgKiAtICoqTGFtYmRhIGxheWVyIHNpemUgcmVkdWNlZCoqOiBUaGUgc2l6ZSBvZiB0aGUgTGFtYmRhIGxheWVyIHVzZWQgZm9yIGNhbmFyaWVzIGlzIHJlZHVjZWQgYnkgMzQlLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZFdhdGNoL2xhdGVzdC9tb25pdG9yaW5nL0Nsb3VkV2F0Y2hfU3ludGhldGljc19MaWJyYXJ5X25vZGVqc19wdXBwZXRlZXIuaHRtbCNDbG91ZFdhdGNoX1N5bnRoZXRpY3NfcnVudGltZXZlcnNpb24tbm9kZWpzLXB1cHBldGVlci0zLjdcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgU1lOVEhFVElDU19OT0RFSlNfUFVQUEVURUVSXzNfNyA9IG5ldyBSdW50aW1lKCdzeW4tbm9kZWpzLXB1cHBldGVlci0zLjcnLCBSdW50aW1lRmFtaWx5Lk5PREVKUyk7XG5cbiAgLyoqXG4gICAqIGBzeW4tbm9kZWpzLXB1cHBldGVlci0zLjhgIGluY2x1ZGVzIHRoZSBmb2xsb3dpbmc6XG4gICAqIC0gTGFtYmRhIHJ1bnRpbWUgTm9kZS5qcyAxNC54XG4gICAqIC0gUHVwcGV0ZWVyLWNvcmUgdmVyc2lvbiAxMC4xLjBcbiAgICogLSBDaHJvbWl1bSB2ZXJzaW9uIDkyLjAuNDUxMlxuICAgKlxuICAgKiBOZXcgRmVhdHVyZXM6XG4gICAqIC0gKipQcm9maWxlIGNsZWFudXAqKjogQ2hyb21pdW0gcHJvZmlsZXMgYXJlIG5vdyBjbGVhbmVkIHVwIGFmdGVyIGVhY2ggY2FuYXJ5IHJ1bi5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRXYXRjaC9sYXRlc3QvbW9uaXRvcmluZy9DbG91ZFdhdGNoX1N5bnRoZXRpY3NfTGlicmFyeV9ub2RlanNfcHVwcGV0ZWVyLmh0bWwjQ2xvdWRXYXRjaF9TeW50aGV0aWNzX3J1bnRpbWV2ZXJzaW9uLW5vZGVqcy1wdXBwZXRlZXItMy44XG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFNZTlRIRVRJQ1NfTk9ERUpTX1BVUFBFVEVFUl8zXzggPSBuZXcgUnVudGltZSgnc3luLW5vZGVqcy1wdXBwZXRlZXItMy44JywgUnVudGltZUZhbWlseS5OT0RFSlMpO1xuXG4gIC8qKlxuICAgKiBgc3luLW5vZGVqcy1wdXBwZXRlZXItMy45YCBpbmNsdWRlcyB0aGUgZm9sbG93aW5nOlxuICAgKlxuICAgKiAtIExhbWJkYSBydW50aW1lIE5vZGUuanMgMTQueFxuICAgKiAtIFB1cHBldGVlci1jb3JlIHZlcnNpb24gNS41LjBcbiAgICogLSBDaHJvbWl1bSB2ZXJzaW9uIDkyLjAuNDUxMlxuICAgKlxuICAgKiBOZXcgRmVhdHVyZXM6XG4gICAqIC0gKipEZXBlbmRlbmN5IHVwZ3JhZGVzKio6IFVwZ3JhZGVzIHNvbWUgdGhpcmQtcGFydHkgZGVwZW5kZW5jeSBwYWNrYWdlcy5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRXYXRjaC9sYXRlc3QvbW9uaXRvcmluZy9DbG91ZFdhdGNoX1N5bnRoZXRpY3NfTGlicmFyeV9ub2RlanNfcHVwcGV0ZWVyLmh0bWwjQ2xvdWRXYXRjaF9TeW50aGV0aWNzX3J1bnRpbWV2ZXJzaW9uLW5vZGVqcy1wdXBwZXRlZXItMy45XG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFNZTlRIRVRJQ1NfTk9ERUpTX1BVUFBFVEVFUl8zXzkgPSBuZXcgUnVudGltZSgnc3luLW5vZGVqcy1wdXBwZXRlZXItMy45JywgUnVudGltZUZhbWlseS5OT0RFSlMpO1xuXG4gIC8qKlxuICAgKiBgc3luLW5vZGVqcy1wdXBwZXRlZXItNC4wYCBpbmNsdWRlcyB0aGUgZm9sbG93aW5nOlxuICAgKiAtIExhbWJkYSBydW50aW1lIE5vZGUuanMgMTYueFxuICAgKiAtIFB1cHBldGVlci1jb3JlIHZlcnNpb24gNS41LjBcbiAgICogLSBDaHJvbWl1bSB2ZXJzaW9uIDkyLjAuNDUxMlxuICAgKlxuICAgKiBOZXcgRmVhdHVyZXM6XG4gICAqIC0gKipEZXBlbmRlbmN5IHVwZ3JhZGVzKio6IFRoZSBOb2RlLmpzIGRlcGVuZGVuY3kgaXMgdXBkYXRlZCB0byAxNi54LlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZFdhdGNoL2xhdGVzdC9tb25pdG9yaW5nL0Nsb3VkV2F0Y2hfU3ludGhldGljc19MaWJyYXJ5X25vZGVqc19wdXBwZXRlZXIuaHRtbCNDbG91ZFdhdGNoX1N5bnRoZXRpY3NfcnVudGltZXZlcnNpb24tbm9kZWpzLXB1cHBldGVlci00LjBcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgU1lOVEhFVElDU19OT0RFSlNfUFVQUEVURUVSXzRfMCA9IG5ldyBSdW50aW1lKCdzeW4tbm9kZWpzLXB1cHBldGVlci00LjAnLCBSdW50aW1lRmFtaWx5Lk5PREVKUyk7XG5cbiAgLyoqXG4gICAqIGBzeW4tbm9kZWpzLXB1cHBldGVlci01LjBgIGluY2x1ZGVzIHRoZSBmb2xsb3dpbmc6XG4gICAqIC0gTGFtYmRhIHJ1bnRpbWUgTm9kZS5qcyAxNi54XG4gICAqIC0gUHVwcGV0ZWVyLWNvcmUgdmVyc2lvbiAxOS43LjBcbiAgICogLSBDaHJvbWl1bSB2ZXJzaW9uIDExMS4wLjU1NjMuMTQ2XG4gICAqXG4gICAqIE5ldyBGZWF0dXJlczpcbiAgICogLSAqKkRlcGVuZGVuY3kgdXBncmFkZSoqOiBUaGUgUHVwcGV0ZWVyLWNvcmUgdmVyc2lvbiBpcyB1cGRhdGVkIHRvIDE5LjcuMC4gVGhlIENocm9taXVtIHZlcnNpb24gaXMgdXBncmFkZWQgdG8gMTExLjAuNTU2My4xNDYuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkV2F0Y2gvbGF0ZXN0L21vbml0b3JpbmcvQ2xvdWRXYXRjaF9TeW50aGV0aWNzX0xpYnJhcnlfbm9kZWpzX3B1cHBldGVlci5odG1sI0Nsb3VkV2F0Y2hfU3ludGhldGljc19ydW50aW1ldmVyc2lvbi1ub2RlanMtcHVwcGV0ZWVyLTUuMFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBTWU5USEVUSUNTX05PREVKU19QVVBQRVRFRVJfNV8wID0gbmV3IFJ1bnRpbWUoJ3N5bi1ub2RlanMtcHVwcGV0ZWVyLTUuMCcsIFJ1bnRpbWVGYW1pbHkuTk9ERUpTKTtcblxuICAvKipcbiAgICogYHN5bi1ub2RlanMtcHVwcGV0ZWVyLTUuMWAgaW5jbHVkZXMgdGhlIGZvbGxvd2luZzpcbiAgICogLSBMYW1iZGEgcnVudGltZSBOb2RlLmpzIDE2LnhcbiAgICogLSBQdXBwZXRlZXItY29yZSB2ZXJzaW9uIDE5LjcuMFxuICAgKiAtIENocm9taXVtIHZlcnNpb24gMTExLjAuNTU2My4xNDZcbiAgICpcbiAgICogQnVnIGZpeGVzOlxuICAgKiAtICoqQnVnIGZpeCoqOiBUaGlzIHJ1bnRpbWUgZml4ZXMgYSBidWcgaW4gYHN5bi1ub2RlanMtcHVwcGV0ZWVyLTUuMGAgd2hlcmUgdGhlIEhBUiBmaWxlcyBjcmVhdGVkIGJ5IHRoZSBjYW5hcmllcyB3ZXJlIG1pc3NpbmcgcmVxdWVzdCBoZWFkZXJzLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZFdhdGNoL2xhdGVzdC9tb25pdG9yaW5nL0Nsb3VkV2F0Y2hfU3ludGhldGljc19MaWJyYXJ5X25vZGVqc19wdXBwZXRlZXIuaHRtbCNDbG91ZFdhdGNoX1N5bnRoZXRpY3NfcnVudGltZXZlcnNpb24tbm9kZWpzLXB1cHBldGVlci01LjFcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgU1lOVEhFVElDU19OT0RFSlNfUFVQUEVURUVSXzVfMSA9IG5ldyBSdW50aW1lKCdzeW4tbm9kZWpzLXB1cHBldGVlci01LjEnLCBSdW50aW1lRmFtaWx5Lk5PREVKUyk7XG5cbiAgLyoqXG4gICAqIGBzeW4tcHl0aG9uLXNlbGVuaXVtLTEuMGAgaW5jbHVkZXMgdGhlIGZvbGxvd2luZzpcbiAgICogLSBMYW1iZGEgcnVudGltZSBQeXRob24gMy44XG4gICAqIC0gU2VsZW5pdW0gdmVyc2lvbiAzLjE0MS4wXG4gICAqIC0gQ2hyb21pdW0gdmVyc2lvbiA4My4wLjQxMDMuMFxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZFdhdGNoL2xhdGVzdC9tb25pdG9yaW5nL0Nsb3VkV2F0Y2hfU3ludGhldGljc19MaWJyYXJ5X3B5dGhvbl9zZWxlbml1bS5odG1sI0Nsb3VkV2F0Y2hfU3ludGhldGljc19ydW50aW1ldmVyc2lvbi1zeW4tcHl0aG9uLXNlbGVuaXVtLTEuMFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBTWU5USEVUSUNTX1BZVEhPTl9TRUxFTklVTV8xXzAgPSBuZXcgUnVudGltZSgnc3luLXB5dGhvbi1zZWxlbml1bS0xLjAnLCBSdW50aW1lRmFtaWx5LlBZVEhPTik7XG5cbiAgLyoqXG4gICAqIGBzeW4tcHl0aG9uLXNlbGVuaXVtLTEuMWAgaW5jbHVkZXMgdGhlIGZvbGxvd2luZzpcbiAgICogLSBMYW1iZGEgcnVudGltZSBQeXRob24gMy44XG4gICAqIC0gU2VsZW5pdW0gdmVyc2lvbiAzLjE0MS4wXG4gICAqIC0gQ2hyb21pdW0gdmVyc2lvbiA4My4wLjQxMDMuMFxuICAgKlxuICAgKiBOZXcgRmVhdHVyZXM6XG4gICAqIC0gKipDdXN0b20gaGFuZGxlciBmdW5jdGlvbioqOiBZb3UgY2FuIG5vdyB1c2UgYSBjdXN0b20gaGFuZGxlciBmdW5jdGlvbiBmb3IgeW91ciBjYW5hcnkgc2NyaXB0cy5cbiAgICogLSAqKkNvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgYWRkaW5nIG1ldHJpY3MgYW5kIHN0ZXAgZmFpbHVyZSBjb25maWd1cmF0aW9ucyoqOiBUaGVzZSBvcHRpb25zIHdlcmUgYWxyZWFkeSBhdmFpbGFibGUgaW4gcnVudGltZXMgZm9yIE5vZGUuanMgY2FuYXJpZXMuXG4gICAqIC0gKipDdXN0b20gYXJndW1lbnRzIGluIENocm9tZSoqOiBZb3UgY2FuIG5vdyBvcGVuIGEgYnJvd3NlciBpbiBpbmNvZ25pdG8gbW9kZSBvciBwYXNzIGluIHByb3h5IHNlcnZlciBjb25maWd1cmF0aW9uLlxuICAgKiAtICoqQ3Jvc3MtUmVnaW9uIGFydGlmYWN0IGJ1Y2tldHMqKjogQSBjYW5hcnkgY2FuIHN0b3JlIGl0cyBhcnRpZmFjdHMgaW4gYW4gQW1hem9uIFMzIGJ1Y2tldCBpbiBhIGRpZmZlcmVudCBSZWdpb24uXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkV2F0Y2gvbGF0ZXN0L21vbml0b3JpbmcvQ2xvdWRXYXRjaF9TeW50aGV0aWNzX0xpYnJhcnlfcHl0aG9uX3NlbGVuaXVtLmh0bWwjQ2xvdWRXYXRjaF9TeW50aGV0aWNzX3J1bnRpbWV2ZXJzaW9uLXN5bi1weXRob24tc2VsZW5pdW0tMS4xXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFNZTlRIRVRJQ1NfUFlUSE9OX1NFTEVOSVVNXzFfMSA9IG5ldyBSdW50aW1lKCdzeW4tcHl0aG9uLXNlbGVuaXVtLTEuMScsIFJ1bnRpbWVGYW1pbHkuUFlUSE9OKTtcblxuICAvKipcbiAgICogYHN5bi1weXRob24tc2VsZW5pdW0tMS4yYCBpbmNsdWRlcyB0aGUgZm9sbG93aW5nOlxuICAgKiAtIExhbWJkYSBydW50aW1lIFB5dGhvbiAzLjhcbiAgICogLSBTZWxlbml1bSB2ZXJzaW9uIDMuMTQxLjBcbiAgICogLSBDaHJvbWl1bSB2ZXJzaW9uIDkyLjAuNDUxMi4wXG4gICAqXG4gICAqIE5ldyBGZWF0dXJlczpcbiAgICogLSAqKlVwZGF0ZWQgZGVwZW5kZW5jaWVzKio6IFRoZSBvbmx5IG5ldyBmZWF0dXJlcyBpbiB0aGlzIHJ1bnRpbWUgYXJlIHRoZSB1cGRhdGVkIGRlcGVuZGVuY2llcy5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRXYXRjaC9sYXRlc3QvbW9uaXRvcmluZy9DbG91ZFdhdGNoX1N5bnRoZXRpY3NfTGlicmFyeV9weXRob25fc2VsZW5pdW0uaHRtbCNDbG91ZFdhdGNoX1N5bnRoZXRpY3NfcnVudGltZXZlcnNpb24tc3luLXB5dGhvbi1zZWxlbml1bS0xLjJcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgU1lOVEhFVElDU19QWVRIT05fU0VMRU5JVU1fMV8yID0gbmV3IFJ1bnRpbWUoJ3N5bi1weXRob24tc2VsZW5pdW0tMS4yJywgUnVudGltZUZhbWlseS5QWVRIT04pO1xuXG4gIC8qKlxuICAgKiBgc3luLXB5dGhvbi1zZWxlbml1bS0xLjNgIGluY2x1ZGVzIHRoZSBmb2xsb3dpbmc6XG4gICAqIC0gTGFtYmRhIHJ1bnRpbWUgUHl0aG9uIDMuOFxuICAgKiAtIFNlbGVuaXVtIHZlcnNpb24gMy4xNDEuMFxuICAgKiAtIENocm9taXVtIHZlcnNpb24gOTIuMC40NTEyLjBcbiAgICpcbiAgICogTmV3IEZlYXR1cmVzOlxuICAgKiAtICoqTW9yZSBwcmVjaXNlIHRpbWVzdGFtcHMqKjogVGhlIHN0YXJ0IHRpbWUgYW5kIHN0b3AgdGltZSBvZiBjYW5hcnkgcnVucyBhcmUgbm93IHByZWNpc2UgdG8gdGhlIG1pbGxpc2Vjb25kLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZFdhdGNoL2xhdGVzdC9tb25pdG9yaW5nL0Nsb3VkV2F0Y2hfU3ludGhldGljc19MaWJyYXJ5X3B5dGhvbl9zZWxlbml1bS5odG1sI0Nsb3VkV2F0Y2hfU3ludGhldGljc19ydW50aW1ldmVyc2lvbi1zeW4tcHl0aG9uLXNlbGVuaXVtLTEuM1xuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBTWU5USEVUSUNTX1BZVEhPTl9TRUxFTklVTV8xXzMgPSBuZXcgUnVudGltZSgnc3luLXB5dGhvbi1zZWxlbml1bS0xLjMnLCBSdW50aW1lRmFtaWx5LlBZVEhPTik7XG5cbiAgLyoqXG4gICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgcnVudGltZSB2ZXJzaW9uXG4gICAgKiBAcGFyYW0gZmFtaWx5IFRoZSBMYW1iZGEgcnVudGltZSBmYW1pbHlcbiAgICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIHJlYWRvbmx5IG5hbWU6IHN0cmluZywgcHVibGljIHJlYWRvbmx5IGZhbWlseTogUnVudGltZUZhbWlseSkge1xuICB9XG59XG4iXX0= \ No newline at end of file diff --git a/packages/@aws-cdk/aws-synthetics-alpha/lib/schedule.d.ts b/packages/@aws-cdk/aws-synthetics-alpha/lib/schedule.d.ts new file mode 100644 index 0000000000000..563be0f2fcc1a --- /dev/null +++ b/packages/@aws-cdk/aws-synthetics-alpha/lib/schedule.d.ts @@ -0,0 +1,73 @@ +import { Duration } from 'aws-cdk-lib/core'; +/** + * Schedule for canary runs + */ +export declare class Schedule { + /** + * The Schedule expression + */ + readonly expressionString: string; + /** + * The canary will be executed once. + */ + static once(): Schedule; + /** + * Construct a schedule from a literal schedule expression. The expression must be in a `rate(number units)` format. + * For example, `Schedule.expression('rate(10 minutes)')` + * + * @param expression The expression to use. + */ + static expression(expression: string): Schedule; + /** + * Construct a schedule from an interval. Allowed values: 0 (for a single run) or between 1 and 60 minutes. + * To specify a single run, you can use `Schedule.once()`. + * + * @param interval The interval at which to run the canary + */ + static rate(interval: Duration): Schedule; + /** + * Create a schedule from a set of cron fields + */ + static cron(options: CronOptions): Schedule; + private constructor(); +} +/** + * Options to configure a cron expression + * + * All fields are strings so you can use complex expressions. Absence of + * a field implies '*' or '?', whichever one is appropriate. + * + * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Canaries_cron.html + */ +export interface CronOptions { + /** + * The minute to run this rule at + * + * @default - Every minute + */ + readonly minute?: string; + /** + * The hour to run this rule at + * + * @default - Every hour + */ + readonly hour?: string; + /** + * The day of the month to run this rule at + * + * @default - Every day of the month + */ + readonly day?: string; + /** + * The month to run this rule at + * + * @default - Every month + */ + readonly month?: string; + /** + * The day of the week to run this rule at + * + * @default - Any day of the week + */ + readonly weekDay?: string; +} diff --git a/packages/@aws-cdk/aws-synthetics-alpha/lib/schedule.js b/packages/@aws-cdk/aws-synthetics-alpha/lib/schedule.js new file mode 100644 index 0000000000000..0b0905a4ae8b1 --- /dev/null +++ b/packages/@aws-cdk/aws-synthetics-alpha/lib/schedule.js @@ -0,0 +1,113 @@ +"use strict"; +var _a; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Schedule = void 0; +const jsiiDeprecationWarnings = require("../.warnings.jsii.js"); +const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti"); +/** + * Schedule for canary runs + */ +class Schedule { + /** + * The canary will be executed once. + */ + static once() { + try { + jsiiDeprecationWarnings.print("@aws-cdk/aws-synthetics-alpha.Schedule#once", ""); + } + catch (error) { + if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { + Error.captureStackTrace(error, this.once); + } + throw error; + } + return new Schedule('rate(0 minutes)'); + } + /** + * Construct a schedule from a literal schedule expression. The expression must be in a `rate(number units)` format. + * For example, `Schedule.expression('rate(10 minutes)')` + * + * @param expression The expression to use. + */ + static expression(expression) { + try { + jsiiDeprecationWarnings.print("@aws-cdk/aws-synthetics-alpha.Schedule#expression", ""); + } + catch (error) { + if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { + Error.captureStackTrace(error, this.expression); + } + throw error; + } + return new Schedule(expression); + } + /** + * Construct a schedule from an interval. Allowed values: 0 (for a single run) or between 1 and 60 minutes. + * To specify a single run, you can use `Schedule.once()`. + * + * @param interval The interval at which to run the canary + */ + static rate(interval) { + try { + jsiiDeprecationWarnings.print("@aws-cdk/aws-synthetics-alpha.Schedule#rate", ""); + } + catch (error) { + if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { + Error.captureStackTrace(error, this.rate); + } + throw error; + } + const minutes = interval.toMinutes(); + if (minutes > 60) { + throw new Error('Schedule duration must be between 1 and 60 minutes'); + } + if (minutes === 0) { + return Schedule.once(); + } + if (minutes === 1) { + return new Schedule('rate(1 minute)'); + } + return new Schedule(`rate(${minutes} minutes)`); + } + /** + * Create a schedule from a set of cron fields + */ + static cron(options) { + try { + jsiiDeprecationWarnings.print("@aws-cdk/aws-synthetics-alpha.Schedule#cron", ""); + jsiiDeprecationWarnings._aws_cdk_aws_synthetics_alpha_CronOptions(options); + } + catch (error) { + if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { + Error.captureStackTrace(error, this.cron); + } + throw error; + } + if (options.weekDay !== undefined && options.day !== undefined) { + throw new Error('Cannot supply both \'day\' and \'weekDay\', use at most one'); + } + const minute = fallback(options.minute, '*'); + const hour = fallback(options.hour, '*'); + const month = fallback(options.month, '*'); + // Weekday defaults to '?' if not supplied. If it is supplied, day must become '?' + const day = fallback(options.day, options.weekDay !== undefined ? '?' : '*'); + const weekDay = fallback(options.weekDay, '?'); + // '*' is only allowed in the year field + const year = '*'; + return new Schedule(`cron(${minute} ${hour} ${day} ${month} ${weekDay} ${year})`); + } + constructor( + /** + * The Schedule expression + */ + expressionString) { + this.expressionString = expressionString; + } +} +exports.Schedule = Schedule; +_a = JSII_RTTI_SYMBOL_1; +Schedule[_a] = { fqn: "@aws-cdk/aws-synthetics-alpha.Schedule", version: "0.0.0" }; +function fallback(x, def) { + return x ?? def; +} +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZWR1bGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJzY2hlZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFFQTs7R0FFRztBQUNILE1BQWEsUUFBUTtJQUVuQjs7T0FFRztJQUNJLE1BQU0sQ0FBQyxJQUFJOzs7Ozs7Ozs7O1FBQ2hCLE9BQU8sSUFBSSxRQUFRLENBQUMsaUJBQWlCLENBQUMsQ0FBQztLQUN4QztJQUVEOzs7OztPQUtHO0lBQ0ksTUFBTSxDQUFDLFVBQVUsQ0FBQyxVQUFrQjs7Ozs7Ozs7OztRQUN6QyxPQUFPLElBQUksUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0tBQ2pDO0lBRUQ7Ozs7O09BS0c7SUFDSSxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQWtCOzs7Ozs7Ozs7O1FBQ25DLE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNyQyxJQUFJLE9BQU8sR0FBRyxFQUFFLEVBQUU7WUFDaEIsTUFBTSxJQUFJLEtBQUssQ0FBQyxvREFBb0QsQ0FBQyxDQUFDO1NBQ3ZFO1FBQ0QsSUFBSSxPQUFPLEtBQUssQ0FBQyxFQUFFO1lBQ2pCLE9BQU8sUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO1NBQ3hCO1FBQ0QsSUFBSSxPQUFPLEtBQUssQ0FBQyxFQUFFO1lBQ2pCLE9BQU8sSUFBSSxRQUFRLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztTQUN2QztRQUNELE9BQU8sSUFBSSxRQUFRLENBQUMsUUFBUSxPQUFPLFdBQVcsQ0FBQyxDQUFDO0tBQ2pEO0lBRUQ7O09BRUc7SUFDSSxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQW9COzs7Ozs7Ozs7OztRQUNyQyxJQUFJLE9BQU8sQ0FBQyxPQUFPLEtBQUssU0FBUyxJQUFJLE9BQU8sQ0FBQyxHQUFHLEtBQUssU0FBUyxFQUFFO1lBQzlELE1BQU0sSUFBSSxLQUFLLENBQUMsNkRBQTZELENBQUMsQ0FBQztTQUNoRjtRQUVELE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQzdDLE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3pDLE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBRTNDLGtGQUFrRjtRQUNsRixNQUFNLEdBQUcsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsT0FBTyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM3RSxNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQztRQUUvQyx3Q0FBd0M7UUFDeEMsTUFBTSxJQUFJLEdBQUcsR0FBRyxDQUFDO1FBRWpCLE9BQU8sSUFBSSxRQUFRLENBQUMsUUFBUSxNQUFNLElBQUksSUFBSSxJQUFJLEdBQUcsSUFBSSxLQUFLLElBQUksT0FBTyxJQUFJLElBQUksR0FBRyxDQUFDLENBQUM7S0FDbkY7SUFFRDtJQUNFOztPQUVHO0lBQ2EsZ0JBQXdCO1FBQXhCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBUTtLQUFJOztBQWpFaEQsNEJBa0VDOzs7QUErQ0QsU0FBUyxRQUFRLENBQUMsQ0FBcUIsRUFBRSxHQUFXO0lBQ2xELE9BQU8sQ0FBQyxJQUFJLEdBQUcsQ0FBQztBQUNsQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRHVyYXRpb24gfSBmcm9tICdhd3MtY2RrLWxpYi9jb3JlJztcblxuLyoqXG4gKiBTY2hlZHVsZSBmb3IgY2FuYXJ5IHJ1bnNcbiAqL1xuZXhwb3J0IGNsYXNzIFNjaGVkdWxlIHtcblxuICAvKipcbiAgICogVGhlIGNhbmFyeSB3aWxsIGJlIGV4ZWN1dGVkIG9uY2UuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIG9uY2UoKTogU2NoZWR1bGUge1xuICAgIHJldHVybiBuZXcgU2NoZWR1bGUoJ3JhdGUoMCBtaW51dGVzKScpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdCBhIHNjaGVkdWxlIGZyb20gYSBsaXRlcmFsIHNjaGVkdWxlIGV4cHJlc3Npb24uIFRoZSBleHByZXNzaW9uIG11c3QgYmUgaW4gYSBgcmF0ZShudW1iZXIgdW5pdHMpYCBmb3JtYXQuXG4gICAqIEZvciBleGFtcGxlLCBgU2NoZWR1bGUuZXhwcmVzc2lvbigncmF0ZSgxMCBtaW51dGVzKScpYFxuICAgKlxuICAgKiBAcGFyYW0gZXhwcmVzc2lvbiBUaGUgZXhwcmVzc2lvbiB0byB1c2UuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGV4cHJlc3Npb24oZXhwcmVzc2lvbjogc3RyaW5nKTogU2NoZWR1bGUge1xuICAgIHJldHVybiBuZXcgU2NoZWR1bGUoZXhwcmVzc2lvbik7XG4gIH1cblxuICAvKipcbiAgICogQ29uc3RydWN0IGEgc2NoZWR1bGUgZnJvbSBhbiBpbnRlcnZhbC4gQWxsb3dlZCB2YWx1ZXM6IDAgKGZvciBhIHNpbmdsZSBydW4pIG9yIGJldHdlZW4gMSBhbmQgNjAgbWludXRlcy5cbiAgICogVG8gc3BlY2lmeSBhIHNpbmdsZSBydW4sIHlvdSBjYW4gdXNlIGBTY2hlZHVsZS5vbmNlKClgLlxuICAgKlxuICAgKiBAcGFyYW0gaW50ZXJ2YWwgVGhlIGludGVydmFsIGF0IHdoaWNoIHRvIHJ1biB0aGUgY2FuYXJ5XG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJhdGUoaW50ZXJ2YWw6IER1cmF0aW9uKTogU2NoZWR1bGUge1xuICAgIGNvbnN0IG1pbnV0ZXMgPSBpbnRlcnZhbC50b01pbnV0ZXMoKTtcbiAgICBpZiAobWludXRlcyA+IDYwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NjaGVkdWxlIGR1cmF0aW9uIG11c3QgYmUgYmV0d2VlbiAxIGFuZCA2MCBtaW51dGVzJyk7XG4gICAgfVxuICAgIGlmIChtaW51dGVzID09PSAwKSB7XG4gICAgICByZXR1cm4gU2NoZWR1bGUub25jZSgpO1xuICAgIH1cbiAgICBpZiAobWludXRlcyA9PT0gMSkge1xuICAgICAgcmV0dXJuIG5ldyBTY2hlZHVsZSgncmF0ZSgxIG1pbnV0ZSknKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBTY2hlZHVsZShgcmF0ZSgke21pbnV0ZXN9IG1pbnV0ZXMpYCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgc2NoZWR1bGUgZnJvbSBhIHNldCBvZiBjcm9uIGZpZWxkc1xuICAgKi9cbiAgcHVibGljIHN0YXRpYyBjcm9uKG9wdGlvbnM6IENyb25PcHRpb25zKTogU2NoZWR1bGUge1xuICAgIGlmIChvcHRpb25zLndlZWtEYXkgIT09IHVuZGVmaW5lZCAmJiBvcHRpb25zLmRheSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBzdXBwbHkgYm90aCBcXCdkYXlcXCcgYW5kIFxcJ3dlZWtEYXlcXCcsIHVzZSBhdCBtb3N0IG9uZScpO1xuICAgIH1cblxuICAgIGNvbnN0IG1pbnV0ZSA9IGZhbGxiYWNrKG9wdGlvbnMubWludXRlLCAnKicpO1xuICAgIGNvbnN0IGhvdXIgPSBmYWxsYmFjayhvcHRpb25zLmhvdXIsICcqJyk7XG4gICAgY29uc3QgbW9udGggPSBmYWxsYmFjayhvcHRpb25zLm1vbnRoLCAnKicpO1xuXG4gICAgLy8gV2Vla2RheSBkZWZhdWx0cyB0byAnPycgaWYgbm90IHN1cHBsaWVkLiBJZiBpdCBpcyBzdXBwbGllZCwgZGF5IG11c3QgYmVjb21lICc/J1xuICAgIGNvbnN0IGRheSA9IGZhbGxiYWNrKG9wdGlvbnMuZGF5LCBvcHRpb25zLndlZWtEYXkgIT09IHVuZGVmaW5lZCA/ICc/JyA6ICcqJyk7XG4gICAgY29uc3Qgd2Vla0RheSA9IGZhbGxiYWNrKG9wdGlvbnMud2Vla0RheSwgJz8nKTtcblxuICAgIC8vICcqJyBpcyBvbmx5IGFsbG93ZWQgaW4gdGhlIHllYXIgZmllbGRcbiAgICBjb25zdCB5ZWFyID0gJyonO1xuXG4gICAgcmV0dXJuIG5ldyBTY2hlZHVsZShgY3Jvbigke21pbnV0ZX0gJHtob3VyfSAke2RheX0gJHttb250aH0gJHt3ZWVrRGF5fSAke3llYXJ9KWApO1xuICB9XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICAgKiBUaGUgU2NoZWR1bGUgZXhwcmVzc2lvblxuICAgICAqL1xuICAgIHB1YmxpYyByZWFkb25seSBleHByZXNzaW9uU3RyaW5nOiBzdHJpbmcpIHt9XG59XG5cbi8qKlxuICogT3B0aW9ucyB0byBjb25maWd1cmUgYSBjcm9uIGV4cHJlc3Npb25cbiAqXG4gKiBBbGwgZmllbGRzIGFyZSBzdHJpbmdzIHNvIHlvdSBjYW4gdXNlIGNvbXBsZXggZXhwcmVzc2lvbnMuIEFic2VuY2Ugb2ZcbiAqIGEgZmllbGQgaW1wbGllcyAnKicgb3IgJz8nLCB3aGljaGV2ZXIgb25lIGlzIGFwcHJvcHJpYXRlLlxuICpcbiAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkV2F0Y2gvbGF0ZXN0L21vbml0b3JpbmcvQ2xvdWRXYXRjaF9TeW50aGV0aWNzX0NhbmFyaWVzX2Nyb24uaHRtbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyb25PcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBtaW51dGUgdG8gcnVuIHRoaXMgcnVsZSBhdFxuICAgKlxuICAgKiBAZGVmYXVsdCAtIEV2ZXJ5IG1pbnV0ZVxuICAgKi9cbiAgcmVhZG9ubHkgbWludXRlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgaG91ciB0byBydW4gdGhpcyBydWxlIGF0XG4gICAqXG4gICAqIEBkZWZhdWx0IC0gRXZlcnkgaG91clxuICAgKi9cbiAgcmVhZG9ubHkgaG91cj86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGRheSBvZiB0aGUgbW9udGggdG8gcnVuIHRoaXMgcnVsZSBhdFxuICAgKlxuICAgKiBAZGVmYXVsdCAtIEV2ZXJ5IGRheSBvZiB0aGUgbW9udGhcbiAgICovXG4gIHJlYWRvbmx5IGRheT86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG1vbnRoIHRvIHJ1biB0aGlzIHJ1bGUgYXRcbiAgICpcbiAgICogQGRlZmF1bHQgLSBFdmVyeSBtb250aFxuICAgKi9cbiAgcmVhZG9ubHkgbW9udGg/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBkYXkgb2YgdGhlIHdlZWsgdG8gcnVuIHRoaXMgcnVsZSBhdFxuICAgKlxuICAgKiBAZGVmYXVsdCAtIEFueSBkYXkgb2YgdGhlIHdlZWtcbiAgICovXG4gIHJlYWRvbmx5IHdlZWtEYXk/OiBzdHJpbmc7XG59XG5cbmZ1bmN0aW9uIGZhbGxiYWNrKHg6IHN0cmluZyB8IHVuZGVmaW5lZCwgZGVmOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4geCA/PyBkZWY7XG59XG4iXX0= \ No newline at end of file diff --git a/packages/@aws-cdk/aws-synthetics-alpha/test/canary.test.d.ts b/packages/@aws-cdk/aws-synthetics-alpha/test/canary.test.d.ts new file mode 100644 index 0000000000000..cb0ff5c3b541f --- /dev/null +++ b/packages/@aws-cdk/aws-synthetics-alpha/test/canary.test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/packages/@aws-cdk/aws-synthetics-alpha/test/canary.test.js b/packages/@aws-cdk/aws-synthetics-alpha/test/canary.test.js new file mode 100644 index 0000000000000..4541dbe4f1cdd --- /dev/null +++ b/packages/@aws-cdk/aws-synthetics-alpha/test/canary.test.js @@ -0,0 +1,701 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const path = require("path"); +const assertions_1 = require("aws-cdk-lib/assertions"); +const ec2 = require("aws-cdk-lib/aws-ec2"); +const iam = require("aws-cdk-lib/aws-iam"); +const s3 = require("aws-cdk-lib/aws-s3"); +const aws_cdk_lib_1 = require("aws-cdk-lib"); +const synthetics = require("../lib"); +test('Basic canary properties work', () => { + // GIVEN + const stack = new aws_cdk_lib_1.Stack(); + // WHEN + new synthetics.Canary(stack, 'Canary', { + canaryName: 'mycanary', + test: synthetics.Test.custom({ + handler: 'index.handler', + code: synthetics.Code.fromInline('/* Synthetics handler code */'), + }), + successRetentionPeriod: aws_cdk_lib_1.Duration.days(10), + failureRetentionPeriod: aws_cdk_lib_1.Duration.days(10), + startAfterCreation: false, + timeToLive: aws_cdk_lib_1.Duration.minutes(30), + runtime: synthetics.Runtime.SYNTHETICS_NODEJS_PUPPETEER_3_8, + }); + // THEN + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::Synthetics::Canary', { + Name: 'mycanary', + SuccessRetentionPeriod: 10, + FailureRetentionPeriod: 10, + StartCanaryAfterCreation: false, + Schedule: assertions_1.Match.objectLike({ DurationInSeconds: '1800' }), + RuntimeVersion: 'syn-nodejs-puppeteer-3.8', + }); +}); +test('cleanup.LAMBDA introduces custom resource to delete lambda', () => { + // GIVEN + const stack = new aws_cdk_lib_1.Stack(); + // WHEN + new synthetics.Canary(stack, 'Canary', { + test: synthetics.Test.custom({ + handler: 'index.handler', + code: synthetics.Code.fromInline('/* Synthetics handler code'), + }), + cleanup: synthetics.Cleanup.LAMBDA, + runtime: synthetics.Runtime.SYNTHETICS_NODEJS_PUPPETEER_3_8, + }); + // THEN + assertions_1.Template.fromStack(stack).resourceCountIs('Custom::SyntheticsAutoDeleteUnderlyingResources', 1); +}); +test('Canary can have generated name', () => { + // GIVEN + const stack = new aws_cdk_lib_1.Stack(); + // WHEN + new synthetics.Canary(stack, 'Canary', { + test: synthetics.Test.custom({ + handler: 'index.handler', + code: synthetics.Code.fromInline('/* Synthetics handler code */'), + }), + runtime: synthetics.Runtime.SYNTHETICS_NODEJS_PUPPETEER_3_8, + }); + // THEN + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::Synthetics::Canary', { + Name: 'canary', + }); +}); +test('Name validation does not fail when using Tokens', () => { + // GIVEN + const stack = new aws_cdk_lib_1.Stack(); + // WHEN + new synthetics.Canary(stack, 'Canary', { + canaryName: aws_cdk_lib_1.Lazy.string({ produce: () => 'My Canary' }), + test: synthetics.Test.custom({ + handler: 'index.handler', + code: synthetics.Code.fromInline('/* Synthetics handler code */'), + }), + runtime: synthetics.Runtime.SYNTHETICS_NODEJS_PUPPETEER_3_8, + }); + // THEN: no exception + assertions_1.Template.fromStack(stack).resourceCountIs('AWS::Synthetics::Canary', 1); +}); +test('Throws when name is specified incorrectly', () => { + // GIVEN + const stack = new aws_cdk_lib_1.Stack(); + // THEN + expect(() => new synthetics.Canary(stack, 'Canary', { + canaryName: 'My Canary', + test: synthetics.Test.custom({ + handler: 'index.handler', + code: synthetics.Code.fromInline('/* Synthetics handler code */'), + }), + runtime: synthetics.Runtime.SYNTHETICS_NODEJS_PUPPETEER_3_8, + })) + .toThrowError('Canary name must be lowercase, numbers, hyphens, or underscores (got "My Canary")'); +}); +test('Throws when name has more than 21 characters', () => { + // GIVEN + const stack = new aws_cdk_lib_1.Stack(); + // THEN + expect(() => new synthetics.Canary(stack, 'Canary', { + canaryName: 'a'.repeat(22), + test: synthetics.Test.custom({ + handler: 'index.handler', + code: synthetics.Code.fromInline('/* Synthetics handler code */'), + }), + runtime: synthetics.Runtime.SYNTHETICS_NODEJS_PUPPETEER_3_8, + })) + .toThrowError(`Canary name is too large, must be between 1 and 21 characters, but is 22 (got "${'a'.repeat(22)}")`); +}); +test('An existing role can be specified instead of auto-created', () => { + // GIVEN + const stack = new aws_cdk_lib_1.Stack(); + const role = new iam.Role(stack, 'role', { + assumedBy: new iam.ServicePrincipal('lambda.amazonaws.com'), + }); + // role.addToPolicy(/* required permissions per the documentation */); + // WHEN + new synthetics.Canary(stack, 'Canary', { + role, + test: synthetics.Test.custom({ + handler: 'index.handler', + code: synthetics.Code.fromInline('/* Synthetics handler code */'), + }), + runtime: synthetics.Runtime.SYNTHETICS_NODEJS_PUPPETEER_3_8, + }); + // THEN + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::Synthetics::Canary', { + ExecutionRoleArn: stack.resolve(role.roleArn), + }); +}); +test('An auto-generated bucket can have lifecycle rules', () => { + // GIVEN + const stack = new aws_cdk_lib_1.Stack(); + const lifecycleRules = [{ + expiration: aws_cdk_lib_1.Duration.days(30), + }]; + // WHEN + new synthetics.Canary(stack, 'Canary', { + artifactsBucketLifecycleRules: lifecycleRules, + test: synthetics.Test.custom({ + handler: 'index.handler', + code: synthetics.Code.fromInline('/* Synthetics handler code */'), + }), + runtime: synthetics.Runtime.SYNTHETICS_NODEJS_PUPPETEER_3_8, + }); + // THEN + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::S3::Bucket', { + LifecycleConfiguration: { + Rules: [ + { + ExpirationInDays: 30, + }, + ], + }, + }); +}); +test('An existing bucket and prefix can be specified instead of auto-created', () => { + // GIVEN + const stack = new aws_cdk_lib_1.Stack(); + const bucket = new s3.Bucket(stack, 'mytestbucket'); + const prefix = 'canary'; + // WHEN + new synthetics.Canary(stack, 'Canary', { + artifactsBucketLocation: { bucket, prefix }, + test: synthetics.Test.custom({ + handler: 'index.handler', + code: synthetics.Code.fromInline('/* Synthetics handler code */'), + }), + runtime: synthetics.Runtime.SYNTHETICS_NODEJS_PUPPETEER_3_8, + }); + // THEN + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::Synthetics::Canary', { + ArtifactS3Location: stack.resolve(bucket.s3UrlForObject(prefix)), + }); +}); +test('Runtime can be specified', () => { + // GIVEN + const stack = new aws_cdk_lib_1.Stack(); + // WHEN + new synthetics.Canary(stack, 'Canary', { + runtime: synthetics.Runtime.SYNTHETICS_NODEJS_PUPPETEER_3_8, + test: synthetics.Test.custom({ + handler: 'index.handler', + code: synthetics.Code.fromInline('/* Synthetics handler code */'), + }), + }); + // THEN + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::Synthetics::Canary', { + RuntimeVersion: 'syn-nodejs-puppeteer-3.8', + }); +}); +test('Python runtime can be specified', () => { + // GIVEN + const stack = new aws_cdk_lib_1.Stack(); + // WHEN + new synthetics.Canary(stack, 'Canary', { + runtime: synthetics.Runtime.SYNTHETICS_PYTHON_SELENIUM_1_3, + test: synthetics.Test.custom({ + handler: 'index.handler', + code: synthetics.Code.fromInline('# Synthetics handler code'), + }), + }); + // THEN + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::Synthetics::Canary', { + RuntimeVersion: 'syn-python-selenium-1.3', + }); +}); +test('environment variables can be specified', () => { + // GIVEN + const stack = new aws_cdk_lib_1.Stack(); + const environmentVariables = { + TEST_KEY_1: 'TEST_VALUE_1', + TEST_KEY_2: 'TEST_VALUE_2', + }; + // WHEN + new synthetics.Canary(stack, 'Canary', { + runtime: synthetics.Runtime.SYNTHETICS_NODEJS_PUPPETEER_3_8, + test: synthetics.Test.custom({ + handler: 'index.handler', + code: synthetics.Code.fromInline('/* Synthetics handler code */'), + }), + environmentVariables: environmentVariables, + }); + // THEN + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::Synthetics::Canary', { + RunConfig: { + EnvironmentVariables: environmentVariables, + }, + }); +}); +test('environment variables are skipped if not provided', () => { + // GIVEN + const stack = new aws_cdk_lib_1.Stack(); + // WHEN + new synthetics.Canary(stack, 'Canary', { + runtime: synthetics.Runtime.SYNTHETICS_NODEJS_PUPPETEER_3_8, + test: synthetics.Test.custom({ + handler: 'index.handler', + code: synthetics.Code.fromInline('/* Synthetics handler code */'), + }), + }); + // THEN + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::Synthetics::Canary', { + RunConfig: assertions_1.Match.absent(), + }); +}); +test('Runtime can be customized', () => { + // GIVEN + const stack = new aws_cdk_lib_1.Stack(); + // WHEN + new synthetics.Canary(stack, 'Canary', { + runtime: new synthetics.Runtime('fancy-future-runtime-1337.42', synthetics.RuntimeFamily.OTHER), + test: synthetics.Test.custom({ + handler: 'index.handler', + code: synthetics.Code.fromInline('/* Synthetics handler code */'), + }), + }); + // THEN + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::Synthetics::Canary', { + RuntimeVersion: 'fancy-future-runtime-1337.42', + }); +}); +test('Schedule can be set with Rate', () => { + // GIVEN + const stack = new aws_cdk_lib_1.Stack(); + // WHEN + new synthetics.Canary(stack, 'Canary', { + schedule: synthetics.Schedule.rate(aws_cdk_lib_1.Duration.minutes(3)), + test: synthetics.Test.custom({ + handler: 'index.handler', + code: synthetics.Code.fromInline('/* Synthetics handler code */'), + }), + runtime: synthetics.Runtime.SYNTHETICS_NODEJS_PUPPETEER_3_8, + }); + // THEN + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::Synthetics::Canary', { + Schedule: assertions_1.Match.objectLike({ Expression: 'rate(3 minutes)' }), + }); +}); +test('Schedule can be set to 1 minute', () => { + // GIVEN + const stack = new aws_cdk_lib_1.Stack(); + // WHEN + new synthetics.Canary(stack, 'Canary', { + schedule: synthetics.Schedule.rate(aws_cdk_lib_1.Duration.minutes(1)), + test: synthetics.Test.custom({ + handler: 'index.handler', + code: synthetics.Code.fromInline('/* Synthetics handler code */'), + }), + runtime: synthetics.Runtime.SYNTHETICS_NODEJS_PUPPETEER_3_8, + }); + // THEN + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::Synthetics::Canary', { + Schedule: assertions_1.Match.objectLike({ Expression: 'rate(1 minute)' }), + }); +}); +test('Schedule can be set with Cron', () => { + // GIVEN + const stack = new aws_cdk_lib_1.Stack(); + // WHEN + new synthetics.Canary(stack, 'Canary', { + schedule: synthetics.Schedule.cron({ minute: '30' }), + test: synthetics.Test.custom({ + handler: 'index.handler', + code: synthetics.Code.fromInline('/* Synthetics handler code */'), + }), + runtime: synthetics.Runtime.SYNTHETICS_NODEJS_PUPPETEER_3_8, + }); + // THEN + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::Synthetics::Canary', { + Schedule: assertions_1.Match.objectLike({ Expression: 'cron(30 * * * ? *)' }), + }); +}); +test('Schedule can be set with Expression', () => { + // GIVEN + const stack = new aws_cdk_lib_1.Stack(); + // WHEN + new synthetics.Canary(stack, 'Canary', { + schedule: synthetics.Schedule.expression('rate(1 hour)'), + test: synthetics.Test.custom({ + handler: 'index.handler', + code: synthetics.Code.fromInline('/* Synthetics handler code */'), + }), + runtime: synthetics.Runtime.SYNTHETICS_NODEJS_PUPPETEER_3_8, + }); + // THEN + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::Synthetics::Canary', { + Schedule: assertions_1.Match.objectLike({ Expression: 'rate(1 hour)' }), + }); +}); +test('Schedule can be set to run once', () => { + // GIVEN + const stack = new aws_cdk_lib_1.Stack(); + // WHEN + new synthetics.Canary(stack, 'Canary', { + schedule: synthetics.Schedule.once(), + test: synthetics.Test.custom({ + handler: 'index.handler', + code: synthetics.Code.fromInline('/* Synthetics handler code */'), + }), + runtime: synthetics.Runtime.SYNTHETICS_NODEJS_PUPPETEER_3_8, + }); + // THEN + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::Synthetics::Canary', { + Schedule: assertions_1.Match.objectLike({ Expression: 'rate(0 minutes)' }), + }); +}); +test('Throws when rate above 60 minutes', () => { + // GIVEN + const stack = new aws_cdk_lib_1.Stack(); + // THEN + expect(() => new synthetics.Canary(stack, 'Canary', { + schedule: synthetics.Schedule.rate(aws_cdk_lib_1.Duration.minutes(61)), + test: synthetics.Test.custom({ + handler: 'index.handler', + code: synthetics.Code.fromInline('/* Synthetics handler code */'), + }), + runtime: synthetics.Runtime.SYNTHETICS_NODEJS_PUPPETEER_3_8, + })) + .toThrowError('Schedule duration must be between 1 and 60 minutes'); +}); +test('Throws when rate above is not a whole number of minutes', () => { + // GIVEN + const stack = new aws_cdk_lib_1.Stack(); + // THEN + expect(() => new synthetics.Canary(stack, 'Canary', { + schedule: synthetics.Schedule.rate(aws_cdk_lib_1.Duration.seconds(59)), + test: synthetics.Test.custom({ + handler: 'index.handler', + code: synthetics.Code.fromInline('/* Synthetics handler code */'), + }), + runtime: synthetics.Runtime.SYNTHETICS_NODEJS_PUPPETEER_3_8, + })) + .toThrowError('\'59 seconds\' cannot be converted into a whole number of minutes.'); +}); +test('Can share artifacts bucket between canaries', () => { + // GIVEN + const stack = new aws_cdk_lib_1.Stack(); + // WHEN + const canary1 = new synthetics.Canary(stack, 'Canary1', { + schedule: synthetics.Schedule.once(), + test: synthetics.Test.custom({ + handler: 'index.handler', + code: synthetics.Code.fromInline('/* Synthetics handler code */'), + }), + runtime: synthetics.Runtime.SYNTHETICS_NODEJS_PUPPETEER_3_8, + }); + const canary2 = new synthetics.Canary(stack, 'Canary2', { + schedule: synthetics.Schedule.once(), + test: synthetics.Test.custom({ + handler: 'index.handler', + code: synthetics.Code.fromInline('/* Synthetics handler code */'), + }), + artifactsBucketLocation: { bucket: canary1.artifactsBucket }, + runtime: synthetics.Runtime.SYNTHETICS_NODEJS_PUPPETEER_3_8, + }); + // THEN + expect(canary1.artifactsBucket).toEqual(canary2.artifactsBucket); +}); +test('can specify custom test', () => { + // GIVEN + const stack = new aws_cdk_lib_1.Stack(); + // WHEN + new synthetics.Canary(stack, 'Canary', { + test: synthetics.Test.custom({ + handler: 'index.handler', + code: synthetics.Code.fromInline(` + exports.handler = async () => { + console.log(\'hello world\'); + };`), + }), + runtime: synthetics.Runtime.SYNTHETICS_NODEJS_PUPPETEER_3_8, + }); + // THEN + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::Synthetics::Canary', { + Code: { + Handler: 'index.handler', + Script: ` + exports.handler = async () => { + console.log(\'hello world\'); + };`, + }, + }); +}); +describe('canary in a vpc', () => { + test('can specify vpc', () => { + // GIVEN + const stack = new aws_cdk_lib_1.Stack(); + const vpc = new ec2.Vpc(stack, 'VPC', { maxAzs: 2 }); + // WHEN + new synthetics.Canary(stack, 'Canary', { + test: synthetics.Test.custom({ + handler: 'index.handler', + code: synthetics.Code.fromInline(` + exports.handler = async () => { + console.log(\'hello world\'); + };`), + }), + runtime: synthetics.Runtime.SYNTHETICS_NODEJS_PUPPETEER_3_8, + vpc, + }); + // THEN + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::Synthetics::Canary', { + Code: { + Handler: 'index.handler', + Script: ` + exports.handler = async () => { + console.log(\'hello world\'); + };`, + }, + VPCConfig: { + VpcId: { + Ref: assertions_1.Match.anyValue(), + }, + }, + }); + }); + test('default security group and subnets', () => { + // GIVEN + const stack = new aws_cdk_lib_1.Stack(); + const vpc = new ec2.Vpc(stack, 'VPC', { maxAzs: 2 }); + // WHEN + new synthetics.Canary(stack, 'Canary', { + test: synthetics.Test.custom({ + handler: 'index.handler', + code: synthetics.Code.fromInline(` + exports.handler = async () => { + console.log(\'hello world\'); + };`), + }), + runtime: synthetics.Runtime.SYNTHETICS_NODEJS_PUPPETEER_3_8, + vpc, + }); + // THEN + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::Synthetics::Canary', { + Code: { + Handler: 'index.handler', + Script: ` + exports.handler = async () => { + console.log(\'hello world\'); + };`, + }, + VPCConfig: { + VpcId: { + Ref: assertions_1.Match.anyValue(), + }, + SecurityGroupIds: assertions_1.Match.anyValue(), + SubnetIds: [...vpc.privateSubnets.map(subnet => ({ Ref: assertions_1.Match.stringLikeRegexp(subnet.node.id) }))], + }, + }); + }); + test('provided security group', () => { + // GIVEN + const stack = new aws_cdk_lib_1.Stack(); + const vpc = new ec2.Vpc(stack, 'VPC', { maxAzs: 2 }); + const sg = new ec2.SecurityGroup(stack, 'Sg', { vpc }); + // WHEN + new synthetics.Canary(stack, 'Canary', { + test: synthetics.Test.custom({ + handler: 'index.handler', + code: synthetics.Code.fromInline(` + exports.handler = async () => { + console.log(\'hello world\'); + };`), + }), + runtime: synthetics.Runtime.SYNTHETICS_NODEJS_PUPPETEER_3_8, + vpc, + securityGroups: [sg], + }); + // THEN + const template = assertions_1.Template.fromStack(stack); + const sgTemplate = template.findResources('AWS::EC2::SecurityGroup'); + const sgIds = Object.keys(sgTemplate); + expect(sgIds).toHaveLength(1); + template.hasResourceProperties('AWS::Synthetics::Canary', { + Code: { + Handler: 'index.handler', + Script: ` + exports.handler = async () => { + console.log(\'hello world\'); + };`, + }, + VPCConfig: { + VpcId: { + Ref: assertions_1.Match.anyValue(), + }, + SecurityGroupIds: [{ 'Fn::GetAtt': [sgIds[0], 'GroupId'] }], + }, + }); + }); +}); +test('Role policy generated as expected', () => { + // GIVEN + const stack = new aws_cdk_lib_1.Stack(); + // WHEN + new synthetics.Canary(stack, 'Canary', { + test: synthetics.Test.custom({ + handler: 'index.handler', + code: synthetics.Code.fromInline('/* Synthetics handler code */'), + }), + runtime: synthetics.Runtime.SYNTHETICS_NODEJS_PUPPETEER_3_8, + }); + // THEN + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::IAM::Role', { + Policies: [{ + PolicyDocument: { + Statement: [ + { + Action: 's3:ListAllMyBuckets', + Effect: 'Allow', + Resource: '*', + }, + { + Action: 's3:GetBucketLocation', + Effect: 'Allow', + Resource: { + 'Fn::GetAtt': [ + 'CanaryArtifactsBucket4A60D32B', + 'Arn', + ], + }, + }, + { + Action: 's3:PutObject', + Effect: 'Allow', + Resource: { + 'Fn::Join': [ + '', + [ + { + 'Fn::GetAtt': [ + 'CanaryArtifactsBucket4A60D32B', + 'Arn', + ], + }, + '/*', + ], + ], + }, + }, + { + Action: 'cloudwatch:PutMetricData', + Condition: { + StringEquals: { + 'cloudwatch:namespace': 'CloudWatchSynthetics', + }, + }, + Effect: 'Allow', + Resource: '*', + }, + { + Action: [ + 'logs:CreateLogStream', + 'logs:CreateLogGroup', + 'logs:PutLogEvents', + ], + Effect: 'Allow', + Resource: { + 'Fn::Join': [ + '', + [ + 'arn:', + { + Ref: 'AWS::Partition', + }, + ':logs:', + { + Ref: 'AWS::Region', + }, + ':', + { + Ref: 'AWS::AccountId', + }, + ':log-group:/aws/lambda/cwsyn-*', + ], + ], + }, + }, + ], + }, + }], + }); +}); +test('Should create handler with path for recent runtimes', () => { + // GIVEN + const stack = new aws_cdk_lib_1.Stack(); + // WHEN + new synthetics.Canary(stack, 'Canary', { + canaryName: 'mycanary', + test: synthetics.Test.custom({ + handler: 'folder/canary.functionName', + code: synthetics.Code.fromAsset(path.join(__dirname, 'canaries')), + }), + runtime: synthetics.Runtime.SYNTHETICS_NODEJS_PUPPETEER_3_8, + }); + // THEN + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::Synthetics::Canary', { + Name: 'mycanary', + Code: { + Handler: 'folder/canary.functionName', + }, + RuntimeVersion: 'syn-nodejs-puppeteer-3.8', + }); +}); +describe('handler validation', () => { + test('legacy runtimes', () => { + const stack = new aws_cdk_lib_1.Stack(); + expect(() => { + new synthetics.Canary(stack, 'Canary', { + test: synthetics.Test.custom({ + handler: 'index.functionName', + code: synthetics.Code.fromAsset(path.join(__dirname, 'canaries')), + }), + runtime: synthetics.Runtime.SYNTHETICS_PYTHON_SELENIUM_1_0, + }); + }).toThrow(/Canary Handler must be specified as 'fileName.handler' for legacy runtimes/); + }); + test('recent runtimes', () => { + const stack = new aws_cdk_lib_1.Stack(); + expect(() => { + new synthetics.Canary(stack, 'Canary', { + test: synthetics.Test.custom({ + handler: 'invalidHandler', + code: synthetics.Code.fromAsset(path.join(__dirname, 'canaries')), + }), + runtime: synthetics.Runtime.SYNTHETICS_NODEJS_PUPPETEER_3_9, + }); + }).toThrow(/Canary Handler must be specified either as 'fileName.handler', 'fileName.functionName', or 'folder\/fileName.functionName'/); + expect(() => { + new synthetics.Canary(stack, 'Canary1', { + test: synthetics.Test.custom({ + handler: 'canary.functionName', + code: synthetics.Code.fromAsset(path.join(__dirname, 'canaries')), + }), + runtime: synthetics.Runtime.SYNTHETICS_NODEJS_PUPPETEER_3_9, + }); + }).not.toThrow(); + expect(() => { + new synthetics.Canary(stack, 'Canary2', { + test: synthetics.Test.custom({ + handler: 'folder/canary.functionName', + code: synthetics.Code.fromAsset(path.join(__dirname, 'canaries')), + }), + runtime: synthetics.Runtime.SYNTHETICS_NODEJS_PUPPETEER_3_9, + }); + }).not.toThrow(); + }); + test('handler length', () => { + const stack = new aws_cdk_lib_1.Stack(); + expect(() => { + new synthetics.Canary(stack, 'Canary1', { + test: synthetics.Test.custom({ + handler: 'longHandlerName'.repeat(10) + '.handler', + code: synthetics.Code.fromAsset(path.join(__dirname, 'canaries')), + }), + runtime: synthetics.Runtime.SYNTHETICS_NODEJS_PUPPETEER_3_9, + }); + }).toThrow(/Canary Handler length must be between 1 and 128/); + }); +}); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FuYXJ5LnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJjYW5hcnkudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLDZCQUE2QjtBQUM3Qix1REFBeUQ7QUFDekQsMkNBQTJDO0FBQzNDLDJDQUEyQztBQUMzQyx5Q0FBeUM7QUFDekMsNkNBQW9EO0FBQ3BELHFDQUFxQztBQUVyQyxJQUFJLENBQUMsOEJBQThCLEVBQUUsR0FBRyxFQUFFO0lBQ3hDLFFBQVE7SUFDUixNQUFNLEtBQUssR0FBRyxJQUFJLG1CQUFLLEVBQUUsQ0FBQztJQUUxQixPQUFPO0lBQ1AsSUFBSSxVQUFVLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUU7UUFDckMsVUFBVSxFQUFFLFVBQVU7UUFDdEIsSUFBSSxFQUFFLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO1lBQzNCLE9BQU8sRUFBRSxlQUFlO1lBQ3hCLElBQUksRUFBRSxVQUFVLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQywrQkFBK0IsQ0FBQztTQUNsRSxDQUFDO1FBQ0Ysc0JBQXNCLEVBQUUsc0JBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ3pDLHNCQUFzQixFQUFFLHNCQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUN6QyxrQkFBa0IsRUFBRSxLQUFLO1FBQ3pCLFVBQVUsRUFBRSxzQkFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7UUFDaEMsT0FBTyxFQUFFLFVBQVUsQ0FBQyxPQUFPLENBQUMsK0JBQStCO0tBQzVELENBQUMsQ0FBQztJQUVILE9BQU87SUFDUCxxQkFBUSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxxQkFBcUIsQ0FBQyx5QkFBeUIsRUFBRTtRQUN6RSxJQUFJLEVBQUUsVUFBVTtRQUNoQixzQkFBc0IsRUFBRSxFQUFFO1FBQzFCLHNCQUFzQixFQUFFLEVBQUU7UUFDMUIsd0JBQXdCLEVBQUUsS0FBSztRQUMv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LENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDbkIsQ0FBQyxDQUFDLENBQUM7SUFFSCxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsR0FBRyxFQUFFO1FBQzFCLE1BQU0sS0FBSyxHQUFHLElBQUksbUJBQUssRUFBRSxDQUFDO1FBQzFCLE1BQU0sQ0FBQyxHQUFHLEVBQUU7WUFDVixJQUFJLFVBQVUsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRTtnQkFDdEMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO29CQUMzQixPQUFPLEVBQUUsaUJBQWlCLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxHQUFHLFVBQVU7b0JBQ2xELElBQUksRUFBRSxVQUFVLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxVQUFVLENBQUMsQ0FBQztpQkFDbEUsQ0FBQztnQkFDRixPQUFPLEVBQUUsVUFBVSxDQUFDLE9BQU8sQ0FBQywrQkFBK0I7YUFDNUQsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLGlEQUFpRCxDQUFDLENBQUM7SUFDaEUsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBNYXRjaCwgVGVtcGxhdGUgfSBmcm9tICdhd3MtY2RrLWxpYi9hc3NlcnRpb25zJztcbmltcG9ydCAqIGFzIGVjMiBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZWMyJztcbmltcG9ydCAqIGFzIGlhbSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtaWFtJztcbmltcG9ydCAqIGFzIHMzIGZyb20gJ2F3cy1jZGstbGliL2F3cy1zMyc7XG5pbXBvcnQgeyBEdXJhdGlvbiwgTGF6eSwgU3RhY2sgfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgKiBhcyBzeW50aGV0aWNzIGZyb20gJy4uL2xpYic7XG5cbnRlc3QoJ0Jhc2ljIGNhbmFyeSBwcm9wZXJ0aWVzIHdvcmsnLCAoKSA9PiB7XG4gIC8vIEdJVkVOXG4gIGNvbnN0IHN0YWNrID0gbmV3IFN0YWNrKCk7XG5cbiAgLy8gV0hFTlxuICBuZXcgc3ludGhldGljcy5DYW5hcnkoc3RhY2ssICdDYW5hcnknLCB7XG4gICAgY2FuYXJ5TmFtZTogJ215Y2FuYXJ5JyxcbiAgICB0ZXN0OiBzeW50aGV0aWNzLlRlc3QuY3VzdG9tKHtcbiAgICAgIGhhbmRsZXI6ICdpbmRleC5oYW5kbGVyJyxcbiAgICAgIGNvZGU6IHN5bnRoZXRpY3MuQ29kZS5mcm9tSW5saW5lKCcvKiBTeW50aGV0aWNzIGhhbmRsZXIgY29kZSAqLycpLFxuICAgIH0pLFxuICAgIHN1Y2Nlc3NSZXRlbnRpb25QZXJpb2Q6IER1cmF0aW9uLmRheXMoMTApLFxuICAgIGZhaWx1cmVSZXRlbnRpb25QZXJpb2Q6IER1cmF0aW9uLmRheXMoMTApLFxuICAgIHN0YXJ0QWZ0ZXJDcmVhdGlvbjogZmFsc2UsXG4gICAgdGltZVRvTGl2ZTogRHVyYXRpb24ubWludXRlcygzMCksXG4gICAgcnVudGltZTogc3ludGhldGljcy5SdW50aW1lLlNZTlRIRVRJQ1NfTk9ERUpTX1BVUFBFVEVFUl8zXzgsXG4gIH0pO1xuXG4gIC8vIFRIRU5cbiAgVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6U3ludGhldGljczo6Q2FuYXJ5Jywge1xuICAgIE5hbWU6ICdteWNhbmFyeScsXG4gICAgU3VjY2Vzc1JldGVudGlvblBlcmlvZDogMTAsXG4gICAgRmFpbHVyZVJldGVudGlvblBlcmlvZDogMTAsXG4gICAgU3RhcnRDYW5hcnlBZnRlckNyZWF0aW9uOiBmYWxzZSxcbiAgICBTY2hlZHVsZTogTWF0Y2gub2JqZWN0TGlrZSh7IER1cmF0aW9uSW5TZWNvbmRzOiAnMTgwMCcgfSksXG4gICAgUnVudGltZVZlcnNpb246ICdzeW4tbm9kZWpzLXB1cHBldGVlci0zLjgnLFxuICB9KTtcbn0pO1xuXG50ZXN0KCdjbGVhbnVwLkxBTUJEQSBpbnRyb2R1Y2VzIGN1c3RvbSByZXNvdXJjZSB0byBkZWxldGUgbGFtYmRhJywgKCkgPT4ge1xuICAvLyBHSVZFTlxuICBjb25zdCBzdGFjayA9IG5ldyBTdGFjaygpO1xuXG4gIC8vIFdIRU5cbiAgbmV3IHN5bnRoZXRpY3MuQ2FuYXJ5KHN0YWNrLCAnQ2FuYXJ5Jywge1xuICAgIHRlc3Q6IHN5bnRoZXRpY3MuVGVzdC5jdXN0b20oe1xuICAgICAgaGFuZGxlcjogJ2luZGV4LmhhbmRsZXInLFxuICAgICAgY29kZTogc3ludGhldGljcy5Db2RlLmZyb21JbmxpbmUoJy8qIFN5bnRoZXRpY3MgaGFuZGxlciBjb2RlJyksXG4gICAgfSksXG4gICAgY2xlYW51cDogc3ludGhldGljcy5DbGVhbnVwLkxBTUJEQSxcbiAgICBydW50aW1lOiBzeW50aGV0aWNzLlJ1bnRpbWUuU1lOVEhFVElDU19OT0RFSlNfUFVQUEVURUVSXzNfOCxcbiAgfSk7XG5cbiAgLy8gVEhFTlxuICBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spLnJlc291cmNlQ291bnRJcygnQ3VzdG9tOjpTeW50aGV0aWNzQXV0b0RlbGV0ZVVuZGVybHlpbmdSZXNvdXJjZXMnLCAxKTtcbn0pO1xuXG50ZXN0KCdDYW5hcnkgY2FuIGhhdmUgZ2VuZXJhdGVkIG5hbWUnLCAoKSA9PiB7XG4gIC8vIEdJVkVOXG4gIGNvbnN0IHN0YWNrID0gbmV3IFN0YWNrKCk7XG5cbiAgLy8gV0hFTlxuICBuZXcgc3ludGhldGljcy5DYW5hcnkoc3RhY2ssICdDYW5hcnknLCB7XG4gICAgdGVzdDogc3ludGhldGljcy5UZXN0LmN1c3RvbSh7XG4gICAgICBoYW5kbGVyOiAnaW5kZXguaGFuZGxlcicsXG4gICAgICBjb2RlOiBzeW50aGV0aWNzLkNvZGUuZnJvbUlubGluZSgnLyogU3ludGhldGljcyBoYW5kbGVyIGNvZGUgKi8nKSxcbiAgICB9KSxcbiAgICBydW50aW1lOiBzeW50aGV0aWNzLlJ1bnRpbWUuU1lOVEhFVElDU19OT0RFSlNfUFVQUEVURUVSXzNfOCxcbiAgfSk7XG5cbiAgLy8gVEhFTlxuICBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spLmhhc1Jlc291cmNlUHJvcGVydGllcygnQVdTOjpTeW50aGV0aWNzOjpDYW5hcnknLCB7XG4gICAgTmFtZTogJ2NhbmFyeScsXG4gIH0pO1xufSk7XG5cbnRlc3QoJ05hbWUgdmFsaWRhdGlvbiBkb2VzIG5vdCBmYWlsIHdoZW4gdXNpbmcgVG9rZW5zJywgKCkgPT4ge1xuICAvLyBHSVZFTlxuICBjb25zdCBzdGFjayA9IG5ldyBTdGFjaygpO1xuXG4gIC8vIFdIRU5cbiAgbmV3IHN5bnRoZXRpY3MuQ2FuYXJ5KHN0YWNrLCAnQ2FuYXJ5Jywge1xuICAgIGNhbmFyeU5hbWU6IExhenkuc3RyaW5nKHsgcHJvZHVjZTogKCkgPT4gJ015IENhbmFyeScgfSksXG4gICAgdGVzdDogc3ludGhldGljcy5UZXN0LmN1c3RvbSh7XG4gICAgICBoYW5kbGVyOiAnaW5kZXguaGFuZGxlcicsXG4gICAgICBjb2RlOiBzeW50aGV0aWNzLkNvZGUuZnJvbUlubGluZSgnLyogU3ludGhldGljcyBoYW5kbGVyIGNvZGUgKi8nKSxcbiAgICB9KSxcbiAgICBydW50aW1lOiBzeW50aGV0aWNzLlJ1bnRpbWUuU1lOVEhFVElDU19OT0RFSlNfUFVQUEVURUVSXzNfOCxcbiAgfSk7XG5cbiAgLy8gVEhFTjogbm8gZXhjZXB0aW9uXG4gIFRlbXBsYXRlLmZyb21TdGFjayhzdGFjaykucmVzb3VyY2VDb3VudElzKCdBV1M6OlN5bnRoZXRpY3M6OkNhbmFyeScsIDEpO1xufSk7XG5cbnRlc3QoJ1Rocm93cyB3aGVuIG5hbWUgaXMgc3BlY2lmaWVkIGluY29ycmVjdGx5JywgKCkgPT4ge1xuICAvLyBHSVZFTlxuICBjb25zdCBzdGFjayA9IG5ldyBTdGFjaygpO1xuXG4gIC8vIFRIRU5cbiAgZXhwZWN0KCgpID0+IG5ldyBzeW50aGV0aWNzLkNhbmFyeShzdGFjaywgJ0NhbmFyeScsIHtcbiAgICBjYW5hcnlOYW1lOiAnTXkgQ2FuYXJ5JyxcbiAgICB0ZXN0OiBzeW50aGV0aWNzLlRlc3QuY3VzdG9tKHtcbiAgICAgIGhhbmRsZXI6ICdpbmRleC5oYW5kbGVyJyxcbiAgICAgIGNvZGU6IHN5bnRoZXRpY3MuQ29kZS5mcm9tSW5saW5lKCcvKiBTeW50aGV0aWNzIGhhbmRsZXIgY29kZSAqLycpLFxuICAgIH0pLFxuICAgIHJ1bnRpbWU6IHN5bnRoZXRpY3MuUnVudGltZS5TWU5USEVUSUNTX05PREVKU19QVVBQRVRFRVJfM184LFxuICB9KSlcbiAgICAudG9UaHJvd0Vycm9yKCdDYW5hcnkgbmFtZSBtdXN0IGJlIGxvd2VyY2FzZSwgbnVtYmVycywgaHlwaGVucywgb3IgdW5kZXJzY29yZXMgKGdvdCBcIk15IENhbmFyeVwiKScpO1xufSk7XG5cbnRlc3QoJ1Rocm93cyB3aGVuIG5hbWUgaGFzIG1vcmUgdGhhbiAyMSBjaGFyYWN0ZXJzJywgKCkgPT4ge1xuICAvLyBHSVZFTlxuICBjb25zdCBzdGFjayA9IG5ldyBTdGFjaygpO1xuXG4gIC8vIFRIRU5cbiAgZXhwZWN0KCgpID0+IG5ldyBzeW50aGV0aWNzLkNhbmFyeShzdGFjaywgJ0NhbmFyeScsIHtcbiAgICBjYW5hcnlOYW1lOiAnYScucmVwZWF0KDIyKSxcbiAgICB0ZXN0OiBzeW50aGV0aWNzLlRlc3QuY3VzdG9tKHtcbiAgICAgIGhhbmRsZXI6ICdpbmRleC5oYW5kbGVyJyxcbiAgICAgIGNvZGU6IHN5bnRoZXRpY3MuQ29kZS5mcm9tSW5saW5lKCcvKiBTeW50aGV0aWNzIGhhbmRsZXIgY29kZSAqLycpLFxuICAgIH0pLFxuICAgIHJ1bnRpbWU6IHN5bnRoZXRpY3MuUnVudGltZS5TWU5USEVUSUNTX05PREVKU19QVVBQRVRFRVJfM184LFxuICB9KSlcbiAgICAudG9UaHJvd0Vycm9yKGBDYW5hcnkgbmFtZSBpcyB0b28gbGFyZ2UsIG11c3QgYmUgYmV0d2VlbiAxIGFuZCAyMSBjaGFyYWN0ZXJzLCBidXQgaXMgMjIgKGdvdCBcIiR7J2EnLnJlcGVhdCgyMil9XCIpYCk7XG59KTtcblxudGVzdCgnQW4gZXhpc3Rpbmcgcm9sZSBjYW4gYmUgc3BlY2lmaWVkIGluc3RlYWQgb2YgYXV0by1jcmVhdGVkJywgKCkgPT4ge1xuICAvLyBHSVZFTlxuICBjb25zdCBzdGFjayA9IG5ldyBTdGFjaygpO1xuXG4gIGNvbnN0IHJvbGUgPSBuZXcgaWFtLlJvbGUoc3RhY2ssICdyb2xlJywge1xuICAgIGFzc3VtZWRCeTogbmV3IGlhbS5TZXJ2aWNlUHJpbmNpcGFsKCdsYW1iZGEuYW1hem9uYXdzLmNvbScpLFxuICB9KTtcblxuICAvLyByb2xlLmFkZFRvUG9saWN5KC8qIHJlcXVpcmVkIHBlcm1pc3Npb25zIHBlciB0aGUgZG9jdW1lbnRhdGlvbiAqLyk7XG5cbiAgLy8gV0hFTlxuICBuZXcgc3ludGhldGljcy5DYW5hcnkoc3RhY2ssICdDYW5hcnknLCB7XG4gICAgcm9sZSxcbiAgICB0ZXN0OiBzeW50aGV0aWNzLlRlc3QuY3VzdG9tKHtcbiAgICAgIGhhbmRsZXI6ICdpbmRleC5oYW5kbGVyJyxcbiAgICAgIGNvZGU6IHN5bnRoZXRpY3MuQ29kZS5mcm9tSW5saW5lKCcvKiBTeW50aGV0aWNzIGhhbmRsZXIgY29kZSAqLycpLFxuICAgIH0pLFxuICAgIHJ1bnRpbWU6IHN5bnRoZXRpY3MuUnVudGltZS5TWU5USEVUSUNTX05PREVKU19QVVBQRVRFRVJfM184LFxuICB9KTtcblxuICAvLyBUSEVOXG4gIFRlbXBsYXRlLmZyb21TdGFjayhzdGFjaykuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OlN5bnRoZXRpY3M6OkNhbmFyeScsIHtcbiAgICBFeGVjdXRpb25Sb2xlQXJuOiBzdGFjay5yZXNvbHZlKHJvbGUucm9sZUFybiksXG4gIH0pO1xufSk7XG5cbnRlc3QoJ0FuIGF1dG8tZ2VuZXJhdGVkIGJ1Y2tldCBjYW4gaGF2ZSBsaWZlY3ljbGUgcnVsZXMnLCAoKSA9PiB7XG4gIC8vIEdJVkVOXG4gIGNvbnN0IHN0YWNrID0gbmV3IFN0YWNrKCk7XG4gIGNvbnN0IGxpZmVjeWNsZVJ1bGVzID0gW3tcbiAgICBleHBpcmF0aW9uOiBEdXJhdGlvbi5kYXlzKDMwKSxcbiAgfV07XG5cbiAgLy8gV0hFTlxuICBuZXcgc3ludGhldGljcy5DYW5hcnkoc3RhY2ssICdDYW5hcnknLCB7XG4gICAgYXJ0aWZhY3RzQnVja2V0TGlmZWN5Y2xlUnVsZXM6IGxpZmVjeWNsZVJ1bGVzLFxuICAgIHRlc3Q6IHN5bnRoZXRpY3MuVGVzdC5jdXN0b20oe1xuICAgICAgaGFuZGxlcjogJ2luZGV4LmhhbmRsZXInLFxuICAgICAgY29kZTogc3ludGhldGljcy5Db2RlLmZyb21JbmxpbmUoJy8qIFN5bnRoZXRpY3MgaGFuZGxlciBjb2RlICovJyksXG4gICAgfSksXG4gICAgcnVudGltZTogc3ludGhldGljcy5SdW50aW1lLlNZTlRIRVRJQ1NfTk9ERUpTX1BVUFBFVEVFUl8zXzgsXG4gIH0pO1xuXG4gIC8vIFRIRU5cbiAgVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6UzM6OkJ1Y2tldCcsIHtcbiAgICBMaWZlY3ljbGVDb25maWd1cmF0aW9uOiB7XG4gICAgICBSdWxlczogW1xuICAgICAgICB7XG4gICAgICAgICAgRXhwaXJhdGlvbkluRGF5czogMzAsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH0sXG4gIH0pO1xufSk7XG5cbnRlc3QoJ0FuIGV4aXN0aW5nIGJ1Y2tldCBhbmQgcHJlZml4IGNhbiBiZSBzcGVjaWZpZWQgaW5zdGVhZCBvZiBhdXRvLWNyZWF0ZWQnLCAoKSA9PiB7XG4gIC8vIEdJVkVOXG4gIGNvbnN0IHN0YWNrID0gbmV3IFN0YWNrKCk7XG4gIGNvbnN0IGJ1Y2tldCA9IG5ldyBzMy5CdWNrZXQoc3RhY2ssICdteXRlc3RidWNrZXQnKTtcbiAgY29uc3QgcHJlZml4ID0gJ2NhbmFyeSc7XG5cbiAgLy8gV0hFTlxuICBuZXcgc3ludGhldGljcy5DYW5hcnkoc3RhY2ssICdDYW5hcnknLCB7XG4gICAgYXJ0aWZhY3RzQnVja2V0TG9jYXRpb246IHsgYnVja2V0LCBwcmVmaXggfSxcbiAgICB0ZXN0OiBzeW50aGV0aWNzLlRlc3QuY3VzdG9tKHtcbiAgICAgIGhhbmRsZXI6ICdpbmRleC5oYW5kbGVyJyxcbiAgICAgIGNvZGU6IHN5bnRoZXRpY3MuQ29kZS5mcm9tSW5saW5lKCcvKiBTeW50aGV0aWNzIGhhbmRsZXIgY29kZSAqLycpLFxuICAgIH0pLFxuICAgIHJ1bnRpbWU6IHN5bnRoZXRpY3MuUnVudGltZS5TWU5USEVUSUNTX05PREVKU19QVVBQRVRFRVJfM184LFxuICB9KTtcblxuICAvLyBUSEVOXG4gIFRlbXBsYXRlLmZyb21TdGFjayhzdGFjaykuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OlN5bnRoZXRpY3M6OkNhbmFyeScsIHtcbiAgICBBcnRpZmFjdFMzTG9jYXRpb246IHN0YWNrLnJlc29sdmUoYnVja2V0LnMzVXJsRm9yT2JqZWN0KHByZWZpeCkpLFxuICB9KTtcbn0pO1xuXG50ZXN0KCdSdW50aW1lIGNhbiBiZSBzcGVjaWZpZWQnLCAoKSA9PiB7XG4gIC8vIEdJVkVOXG4gIGNvbnN0IHN0YWNrID0gbmV3IFN0YWNrKCk7XG5cbiAgLy8gV0hFTlxuICBuZXcgc3ludGhldGljcy5DYW5hcnkoc3RhY2ssICdDYW5hcnknLCB7XG4gICAgcnVudGltZTogc3ludGhldGljcy5SdW50aW1lLlNZTlRIRVRJQ1NfTk9ERUpTX1BVUFBFVEVFUl8zXzgsXG4gICAgdGVzdDogc3ludGhldGljcy5UZXN0LmN1c3RvbSh7XG4gICAgICBoYW5kbGVyOiAnaW5kZXguaGFuZGxlcicsXG4gICAgICBjb2RlOiBzeW50aGV0aWNzLkNvZGUuZnJvbUlubGluZSgnLyogU3ludGhldGljcyBoYW5kbGVyIGNvZGUgKi8nKSxcbiAgICB9KSxcbiAgfSk7XG5cbiAgLy8gVEhFTlxuICBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spLmhhc1Jlc291cmNlUHJvcGVydGllcygnQVdTOjpTeW50aGV0aWNzOjpDYW5hcnknLCB7XG4gICAgUnVudGltZVZlcnNpb246ICdzeW4tbm9kZWpzLXB1cHBldGVlci0zLjgnLFxuICB9KTtcbn0pO1xuXG50ZXN0KCdQeXRob24gcnVudGltZSBjYW4gYmUgc3BlY2lmaWVkJywgKCkgPT4ge1xuICAvLyBHSVZFTlxuICBjb25zdCBzdGFjayA9IG5ldyBTdGFjaygpO1xuXG4gIC8vIFdIRU5cbiAgbmV3IHN5bnRoZXRpY3MuQ2FuYXJ5KHN0YWNrLCAnQ2FuYXJ5Jywge1xuICAgIHJ1bnRpbWU6IHN5bnRoZXRpY3MuUnVudGltZS5TWU5USEVUSUNTX1BZVEhPTl9TRUxFTklVTV8xXzMsXG4gICAgdGVzdDogc3ludGhldGljcy5UZXN0LmN1c3RvbSh7XG4gICAgICBoYW5kbGVyOiAnaW5kZXguaGFuZGxlcicsXG4gICAgICBjb2RlOiBzeW50aGV0aWNzLkNvZGUuZnJvbUlubGluZSgnIyBTeW50aGV0aWNzIGhhbmRsZXIgY29kZScpLFxuICAgIH0pLFxuICB9KTtcblxuICAvLyBUSEVOXG4gIFRlbXBsYXRlLmZyb21TdGFjayhzdGFjaykuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OlN5bnRoZXRpY3M6OkNhbmFyeScsIHtcbiAgICBSdW50aW1lVmVyc2lvbjogJ3N5bi1weXRob24tc2VsZW5pdW0tMS4zJyxcbiAgfSk7XG59KTtcblxudGVzdCgnZW52aXJvbm1lbnQgdmFyaWFibGVzIGNhbiBiZSBzcGVjaWZpZWQnLCAoKSA9PiB7XG4gIC8vIEdJVkVOXG4gIGNvbnN0IHN0YWNrID0gbmV3IFN0YWNrKCk7XG4gIGNvbnN0IGVudmlyb25tZW50VmFyaWFibGVzID0ge1xuICAgIFRFU1RfS0VZXzE6ICdURVNUX1ZBTFVFXzEnLFxuICAgIFRFU1RfS0VZXzI6ICdURVNUX1ZBTFVFXzInLFxuICB9O1xuXG4gIC8vIFdIRU5cbiAgbmV3IHN5bnRoZXRpY3MuQ2FuYXJ5KHN0YWNrLCAnQ2FuYXJ5Jywge1xuICAgIHJ1bnRpbWU6IHN5bnRoZXRpY3MuUnVudGltZS5TWU5USEVUSUNTX05PREVKU19QVVBQRVRFRVJfM184LFxuICAgIHRlc3Q6IHN5bnRoZXRpY3MuVGVzdC5jdXN0b20oe1xuICAgICAgaGFuZGxlcjogJ2luZGV4LmhhbmRsZXInLFxuICAgICAgY29kZTogc3ludGhldGljcy5Db2RlLmZyb21JbmxpbmUoJy8qIFN5bnRoZXRpY3MgaGFuZGxlciBjb2RlICovJyksXG4gICAgfSksXG4gICAgZW52aXJvbm1lbnRWYXJpYWJsZXM6IGVudmlyb25tZW50VmFyaWFibGVzLFxuICB9KTtcblxuICAvLyBUSEVOXG4gIFRlbXBsYXRlLmZyb21TdGFjayhzdGFjaykuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OlN5bnRoZXRpY3M6OkNhbmFyeScsIHtcbiAgICBSdW5Db25maWc6IHtcbiAgICAgIEVudmlyb25tZW50VmFyaWFibGVzOiBlbnZpcm9ubWVudFZhcmlhYmxlcyxcbiAgICB9LFxuICB9KTtcbn0pO1xuXG50ZXN0KCdlbnZpcm9ubWVudCB2YXJpYWJsZXMgYXJlIHNraXBwZWQgaWYgbm90IHByb3ZpZGVkJywgKCkgPT4ge1xuICAvLyBHSVZFTlxuICBjb25zdCBzdGFjayA9IG5ldyBTdGFjaygpO1xuXG4gIC8vIFdIRU5cbiAgbmV3IHN5bnRoZXRpY3MuQ2FuYXJ5KHN0YWNrLCAnQ2FuYXJ5Jywge1xuICAgIHJ1bnRpbWU6IHN5bnRoZXRpY3MuUnVudGltZS5TWU5USEVUSUNTX05PREVKU19QVVBQRVRFRVJfM184LFxuICAgIHRlc3Q6IHN5bnRoZXRpY3MuVGVzdC5jdXN0b20oe1xuICAgICAgaGFuZGxlcjogJ2luZGV4LmhhbmRsZXInLFxuICAgICAgY29kZTogc3ludGhldGljcy5Db2RlLmZyb21JbmxpbmUoJy8qIFN5bnRoZXRpY3MgaGFuZGxlciBjb2RlICovJyksXG4gICAgfSksXG4gIH0pO1xuXG4gIC8vIFRIRU5cbiAgVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6U3ludGhldGljczo6Q2FuYXJ5Jywge1xuICAgIFJ1bkNvbmZpZzogTWF0Y2guYWJzZW50KCksXG4gIH0pO1xufSk7XG5cbnRlc3QoJ1J1bnRpbWUgY2FuIGJlIGN1c3RvbWl6ZWQnLCAoKSA9PiB7XG4gIC8vIEdJVkVOXG4gIGNvbnN0IHN0YWNrID0gbmV3IFN0YWNrKCk7XG5cbiAgLy8gV0hFTlxuICBuZXcgc3ludGhldGljcy5DYW5hcnkoc3RhY2ssICdDYW5hcnknLCB7XG4gICAgcnVudGltZTogbmV3IHN5bnRoZXRpY3MuUnVudGltZSgnZmFuY3ktZnV0dXJlLXJ1bnRpbWUtMTMzNy40MicsIHN5bnRoZXRpY3MuUnVudGltZUZhbWlseS5PVEhFUiksXG4gICAgdGVzdDogc3ludGhldGljcy5UZXN0LmN1c3RvbSh7XG4gICAgICBoYW5kbGVyOiAnaW5kZXguaGFuZGxlcicsXG4gICAgICBjb2RlOiBzeW50aGV0aWNzLkNvZGUuZnJvbUlubGluZSgnLyogU3ludGhldGljcyBoYW5kbGVyIGNvZGUgKi8nKSxcbiAgICB9KSxcbiAgfSk7XG5cbiAgLy8gVEhFTlxuICBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spLmhhc1Jlc291cmNlUHJvcGVydGllcygnQVdTOjpTeW50aGV0aWNzOjpDYW5hcnknLCB7XG4gICAgUnVudGltZVZlcnNpb246ICdmYW5jeS1mdXR1cmUtcnVudGltZS0xMzM3LjQyJyxcbiAgfSk7XG59KTtcblxudGVzdCgnU2NoZWR1bGUgY2FuIGJlIHNldCB3aXRoIFJhdGUnLCAoKSA9PiB7XG4gIC8vIEdJVkVOXG4gIGNvbnN0IHN0YWNrID0gbmV3IFN0YWNrKCk7XG5cbiAgLy8gV0hFTlxuICBuZXcgc3ludGhldGljcy5DYW5hcnkoc3RhY2ssICdDYW5hcnknLCB7XG4gICAgc2NoZWR1bGU6IHN5bnRoZXRpY3MuU2NoZWR1bGUucmF0ZShEdXJhdGlvbi5taW51dGVzKDMpKSxcbiAgICB0ZXN0OiBzeW50aGV0aWNzLlRlc3QuY3VzdG9tKHtcbiAgICAgIGhhbmRsZXI6ICdpbmRleC5oYW5kbGVyJyxcbiAgICAgIGNvZGU6IHN5bnRoZXRpY3MuQ29kZS5mcm9tSW5saW5lKCcvKiBTeW50aGV0aWNzIGhhbmRsZXIgY29kZSAqLycpLFxuICAgIH0pLFxuICAgIHJ1bnRpbWU6IHN5bnRoZXRpY3MuUnVudGltZS5TWU5USEVUSUNTX05PREVKU19QVVBQRVRFRVJfM184LFxuICB9KTtcblxuICAvLyBUSEVOXG4gIFRlbXBsYXRlLmZyb21TdGFjayhzdGFjaykuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OlN5bnRoZXRpY3M6OkNhbmFyeScsIHtcbiAgICBTY2hlZHVsZTogTWF0Y2gub2JqZWN0TGlrZSh7IEV4cHJlc3Npb246ICdyYXRlKDMgbWludXRlcyknIH0pLFxuICB9KTtcbn0pO1xuXG50ZXN0KCdTY2hlZHVsZSBjYW4gYmUgc2V0IHRvIDEgbWludXRlJywgKCkgPT4ge1xuICAvLyBHSVZFTlxuICBjb25zdCBzdGFjayA9IG5ldyBTdGFjaygpO1xuXG4gIC8vIFdIRU5cbiAgbmV3IHN5bnRoZXRpY3MuQ2FuYXJ5KHN0YWNrLCAnQ2FuYXJ5Jywge1xuICAgIHNjaGVkdWxlOiBzeW50aGV0aWNzLlNjaGVkdWxlLnJhdGUoRHVyYXRpb24ubWludXRlcygxKSksXG4gICAgdGVzdDogc3ludGhldGljcy5UZXN0LmN1c3RvbSh7XG4gICAgICBoYW5kbGVyOiAnaW5kZXguaGFuZGxlcicsXG4gICAgICBjb2RlOiBzeW50aGV0aWNzLkNvZGUuZnJvbUlubGluZSgnLyogU3ludGhldGljcyBoYW5kbGVyIGNvZGUgKi8nKSxcbiAgICB9KSxcbiAgICBydW50aW1lOiBzeW50aGV0aWNzLlJ1bnRpbWUuU1lOVEhFVElDU19OT0RFSlNfUFVQUEVURUVSXzNfOCxcbiAgfSk7XG5cbiAgLy8gVEhFTlxuICBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spLmhhc1Jlc291cmNlUHJvcGVydGllcygnQVdTOjpTeW50aGV0aWNzOjpDYW5hcnknLCB7XG4gICAgU2NoZWR1bGU6IE1hdGNoLm9iamVjdExpa2UoeyBFeHByZXNzaW9uOiAncmF0ZSgxIG1pbnV0ZSknIH0pLFxuICB9KTtcbn0pO1xuXG50ZXN0KCdTY2hlZHVsZSBjYW4gYmUgc2V0IHdpdGggQ3JvbicsICgpID0+IHtcbiAgLy8gR0lWRU5cbiAgY29uc3Qgc3RhY2sgPSBuZXcgU3RhY2soKTtcblxuICAvLyBXSEVOXG4gIG5ldyBzeW50aGV0aWNzLkNhbmFyeShzdGFjaywgJ0NhbmFyeScsIHtcbiAgICBzY2hlZHVsZTogc3ludGhldGljcy5TY2hlZHVsZS5jcm9uKHsgbWludXRlOiAnMzAnIH0pLFxuICAgIHRlc3Q6IHN5bnRoZXRpY3MuVGVzdC5jdXN0b20oe1xuICAgICAgaGFuZGxlcjogJ2luZGV4LmhhbmRsZXInLFxuICAgICAgY29kZTogc3ludGhldGljcy5Db2RlLmZyb21JbmxpbmUoJy8qIFN5bnRoZXRpY3MgaGFuZGxlciBjb2RlICovJyksXG4gICAgfSksXG4gICAgcnVudGltZTogc3ludGhldGljcy5SdW50aW1lLlNZTlRIRVRJQ1NfTk9ERUpTX1BVUFBFVEVFUl8zXzgsXG4gIH0pO1xuXG4gIC8vIFRIRU5cbiAgVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6U3ludGhldGljczo6Q2FuYXJ5Jywge1xuICAgIFNjaGVkdWxlOiBNYXRjaC5vYmplY3RMaWtlKHsgRXhwcmVzc2lvbjogJ2Nyb24oMzAgKiAqICogPyAqKScgfSksXG4gIH0pO1xufSk7XG5cbnRlc3QoJ1NjaGVkdWxlIGNhbiBiZSBzZXQgd2l0aCBFeHByZXNzaW9uJywgKCkgPT4ge1xuICAvLyBHSVZFTlxuICBjb25zdCBzdGFjayA9IG5ldyBTdGFjaygpO1xuXG4gIC8vIFdIRU5cbiAgbmV3IHN5bnRoZXRpY3MuQ2FuYXJ5KHN0YWNrLCAnQ2FuYXJ5Jywge1xuICAgIHNjaGVkdWxlOiBzeW50aGV0aWNzLlNjaGVkdWxlLmV4cHJlc3Npb24oJ3JhdGUoMSBob3VyKScpLFxuICAgIHRlc3Q6IHN5bnRoZXRpY3MuVGVzdC5jdXN0b20oe1xuICAgICAgaGFuZGxlcjogJ2luZGV4LmhhbmRsZXInLFxuICAgICAgY29kZTogc3ludGhldGljcy5Db2RlLmZyb21JbmxpbmUoJy8qIFN5bnRoZXRpY3MgaGFuZGxlciBjb2RlICovJyksXG4gICAgfSksXG4gICAgcnVudGltZTogc3ludGhldGljcy5SdW50aW1lLlNZTlRIRVRJQ1NfTk9ERUpTX1BVUFBFVEVFUl8zXzgsXG4gIH0pO1xuXG4gIC8vIFRIRU5cbiAgVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6U3ludGhldGljczo6Q2FuYXJ5Jywge1xuICAgIFNjaGVkdWxlOiBNYXRjaC5vYmplY3RMaWtlKHsgRXhwcmVzc2lvbjogJ3JhdGUoMSBob3VyKScgfSksXG4gIH0pO1xufSk7XG5cbnRlc3QoJ1NjaGVkdWxlIGNhbiBiZSBzZXQgdG8gcnVuIG9uY2UnLCAoKSA9PiB7XG4gIC8vIEdJVkVOXG4gIGNvbnN0IHN0YWNrID0gbmV3IFN0YWNrKCk7XG5cbiAgLy8gV0hFTlxuICBuZXcgc3ludGhldGljcy5DYW5hcnkoc3RhY2ssICdDYW5hcnknLCB7XG4gICAgc2NoZWR1bGU6IHN5bnRoZXRpY3MuU2NoZWR1bGUub25jZSgpLFxuICAgIHRlc3Q6IHN5bnRoZXRpY3MuVGVzdC5jdXN0b20oe1xuICAgICAgaGFuZGxlcjogJ2luZGV4LmhhbmRsZXInLFxuICAgICAgY29kZTogc3ludGhldGljcy5Db2RlLmZyb21JbmxpbmUoJy8qIFN5bnRoZXRpY3MgaGFuZGxlciBjb2RlICovJyksXG4gICAgfSksXG4gICAgcnVudGltZTogc3ludGhldGljcy5SdW50aW1lLlNZTlRIRVRJQ1NfTk9ERUpTX1BVUFBFVEVFUl8zXzgsXG4gIH0pO1xuXG4gIC8vIFRIRU5cbiAgVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6U3ludGhldGljczo6Q2FuYXJ5Jywge1xuICAgIFNjaGVkdWxlOiBNYXRjaC5vYmplY3RMaWtlKHsgRXhwcmVzc2lvbjogJ3JhdGUoMCBtaW51dGVzKScgfSksXG4gIH0pO1xufSk7XG5cbnRlc3QoJ1Rocm93cyB3aGVuIHJhdGUgYWJvdmUgNjAgbWludXRlcycsICgpID0+IHtcbiAgLy8gR0lWRU5cbiAgY29uc3Qgc3RhY2sgPSBuZXcgU3RhY2soKTtcblxuICAvLyBUSEVOXG4gIGV4cGVjdCgoKSA9PiBuZXcgc3ludGhldGljcy5DYW5hcnkoc3RhY2ssICdDYW5hcnknLCB7XG4gICAgc2NoZWR1bGU6IHN5bnRoZXRpY3MuU2NoZWR1bGUucmF0ZShEdXJhdGlvbi5taW51dGVzKDYxKSksXG4gICAgdGVzdDogc3ludGhldGljcy5UZXN0LmN1c3RvbSh7XG4gICAgICBoYW5kbGVyOiAnaW5kZXguaGFuZGxlcicsXG4gICAgICBjb2RlOiBzeW50aGV0aWNzLkNvZGUuZnJvbUlubGluZSgnLyogU3ludGhldGljcyBoYW5kbGVyIGNvZGUgKi8nKSxcbiAgICB9KSxcbiAgICBydW50aW1lOiBzeW50aGV0aWNzLlJ1bnRpbWUuU1lOVEhFVElDU19OT0RFSlNfUFVQUEVURUVSXzNfOCxcbiAgfSkpXG4gICAgLnRvVGhyb3dFcnJvcignU2NoZWR1bGUgZHVyYXRpb24gbXVzdCBiZSBiZXR3ZWVuIDEgYW5kIDYwIG1pbnV0ZXMnKTtcbn0pO1xuXG50ZXN0KCdUaHJvd3Mgd2hlbiByYXRlIGFib3ZlIGlzIG5vdCBhIHdob2xlIG51bWJlciBvZiBtaW51dGVzJywgKCkgPT4ge1xuICAvLyBHSVZFTlxuICBjb25zdCBzdGFjayA9IG5ldyBTdGFjaygpO1xuXG4gIC8vIFRIRU5cbiAgZXhwZWN0KCgpID0+IG5ldyBzeW50aGV0aWNzLkNhbmFyeShzdGFjaywgJ0NhbmFyeScsIHtcbiAgICBzY2hlZHVsZTogc3ludGhldGljcy5TY2hlZHVsZS5yYXRlKER1cmF0aW9uLnNlY29uZHMoNTkpKSxcbiAgICB0ZXN0OiBzeW50aGV0aWNzLlRlc3QuY3VzdG9tKHtcbiAgICAgIGhhbmRsZXI6ICdpbmRleC5oYW5kbGVyJyxcbiAgICAgIGNvZGU6IHN5bnRoZXRpY3MuQ29kZS5mcm9tSW5saW5lKCcvKiBTeW50aGV0aWNzIGhhbmRsZXIgY29kZSAqLycpLFxuICAgIH0pLFxuICAgIHJ1bnRpbWU6IHN5bnRoZXRpY3MuUnVudGltZS5TWU5USEVUSUNTX05PREVKU19QVVBQRVRFRVJfM184LFxuICB9KSlcbiAgICAudG9UaHJvd0Vycm9yKCdcXCc1OSBzZWNvbmRzXFwnIGNhbm5vdCBiZSBjb252ZXJ0ZWQgaW50byBhIHdob2xlIG51bWJlciBvZiBtaW51dGVzLicpO1xufSk7XG5cbnRlc3QoJ0NhbiBzaGFyZSBhcnRpZmFjdHMgYnVja2V0IGJldHdlZW4gY2FuYXJpZXMnLCAoKSA9PiB7XG4gIC8vIEdJVkVOXG4gIGNvbnN0IHN0YWNrID0gbmV3IFN0YWNrKCk7XG5cbiAgLy8gV0hFTlxuICBjb25zdCBjYW5hcnkxID0gbmV3IHN5bnRoZXRpY3MuQ2FuYXJ5KHN0YWNrLCAnQ2FuYXJ5MScsIHtcbiAgICBzY2hlZHVsZTogc3ludGhldGljcy5TY2hlZHVsZS5vbmNlKCksXG4gICAgdGVzdDogc3ludGhldGljcy5UZXN0LmN1c3RvbSh7XG4gICAgICBoYW5kbGVyOiAnaW5kZXguaGFuZGxlcicsXG4gICAgICBjb2RlOiBzeW50aGV0aWNzLkNvZGUuZnJvbUlubGluZSgnLyogU3ludGhldGljcyBoYW5kbGVyIGNvZGUgKi8nKSxcbiAgICB9KSxcbiAgICBydW50aW1lOiBzeW50aGV0aWNzLlJ1bnRpbWUuU1lOVEhFVElDU19OT0RFSlNfUFVQUEVURUVSXzNfOCxcbiAgfSk7XG5cbiAgY29uc3QgY2FuYXJ5MiA9IG5ldyBzeW50aGV0aWNzLkNhbmFyeShzdGFjaywgJ0NhbmFyeTInLCB7XG4gICAgc2NoZWR1bGU6IHN5bnRoZXRpY3MuU2NoZWR1bGUub25jZSgpLFxuICAgIHRlc3Q6IHN5bnRoZXRpY3MuVGVzdC5jdXN0b20oe1xuICAgICAgaGFuZGxlcjogJ2luZGV4LmhhbmRsZXInLFxuICAgICAgY29kZTogc3ludGhldGljcy5Db2RlLmZyb21JbmxpbmUoJy8qIFN5bnRoZXRpY3MgaGFuZGxlciBjb2RlICovJyksXG4gICAgfSksXG4gICAgYXJ0aWZhY3RzQnVja2V0TG9jYXRpb246IHsgYnVja2V0OiBjYW5hcnkxLmFydGlmYWN0c0J1Y2tldCB9LFxuICAgIHJ1bnRpbWU6IHN5bnRoZXRpY3MuUnVudGltZS5TWU5USEVUSUNTX05PREVKU19QVVBQRVRFRVJfM184LFxuICB9KTtcblxuICAvLyBUSEVOXG4gIGV4cGVjdChjYW5hcnkxLmFydGlmYWN0c0J1Y2tldCkudG9FcXVhbChjYW5hcnkyLmFydGlmYWN0c0J1Y2tldCk7XG59KTtcblxudGVzdCgnY2FuIHNwZWNpZnkgY3VzdG9tIHRlc3QnLCAoKSA9PiB7XG4gIC8vIEdJVkVOXG4gIGNvbnN0IHN0YWNrID0gbmV3IFN0YWNrKCk7XG5cbiAgLy8gV0hFTlxuICBuZXcgc3ludGhldGljcy5DYW5hcnkoc3RhY2ssICdDYW5hcnknLCB7XG4gICAgdGVzdDogc3ludGhldGljcy5UZXN0LmN1c3RvbSh7XG4gICAgICBoYW5kbGVyOiAnaW5kZXguaGFuZGxlcicsXG4gICAgICBjb2RlOiBzeW50aGV0aWNzLkNvZGUuZnJvbUlubGluZShgXG4gICAgICAgIGV4cG9ydHMuaGFuZGxlciA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhcXCdoZWxsbyB3b3JsZFxcJyk7XG4gICAgICAgIH07YCksXG4gICAgfSksXG4gICAgcnVudGltZTogc3ludGhldGljcy5SdW50aW1lLlNZTlRIRVRJQ1NfTk9ERUpTX1BVUFBFVEVFUl8zXzgsXG4gIH0pO1xuXG4gIC8vIFRIRU5cbiAgVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6U3ludGhldGljczo6Q2FuYXJ5Jywge1xuICAgIENvZGU6IHtcbiAgICAgIEhhbmRsZXI6ICdpbmRleC5oYW5kbGVyJyxcbiAgICAgIFNjcmlwdDogYFxuICAgICAgICBleHBvcnRzLmhhbmRsZXIgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc29sZS5sb2coXFwnaGVsbG8gd29ybGRcXCcpO1xuICAgICAgICB9O2AsXG4gICAgfSxcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoJ2NhbmFyeSBpbiBhIHZwYycsICgpID0+IHtcbiAgdGVzdCgnY2FuIHNwZWNpZnkgdnBjJywgKCkgPT4ge1xuICAgIC8vIEdJVkVOXG4gICAgY29uc3Qgc3RhY2sgPSBuZXcgU3RhY2soKTtcbiAgICBjb25zdCB2cGMgPSBuZXcgZWMyLlZwYyhzdGFjaywgJ1ZQQycsIHsgbWF4QXpzOiAyIH0pO1xuXG4gICAgLy8gV0hFTlxuICAgIG5ldyBzeW50aGV0aWNzLkNhbmFyeShzdGFjaywgJ0NhbmFyeScsIHtcbiAgICAgIHRlc3Q6IHN5bnRoZXRpY3MuVGVzdC5jdXN0b20oe1xuICAgICAgICBoYW5kbGVyOiAnaW5kZXguaGFuZGxlcicsXG4gICAgICAgIGNvZGU6IHN5bnRoZXRpY3MuQ29kZS5mcm9tSW5saW5lKGBcbiAgICAgICAgICBleHBvcnRzLmhhbmRsZXIgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcXCdoZWxsbyB3b3JsZFxcJyk7XG4gICAgICAgICAgfTtgKSxcbiAgICAgIH0pLFxuICAgICAgcnVudGltZTogc3ludGhldGljcy5SdW50aW1lLlNZTlRIRVRJQ1NfTk9ERUpTX1BVUFBFVEVFUl8zXzgsXG4gICAgICB2cGMsXG4gICAgfSk7XG5cbiAgICAvLyBUSEVOXG4gICAgVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6U3ludGhldGljczo6Q2FuYXJ5Jywge1xuICAgICAgQ29kZToge1xuICAgICAgICBIYW5kbGVyOiAnaW5kZXguaGFuZGxlcicsXG4gICAgICAgIFNjcmlwdDogYFxuICAgICAgICAgIGV4cG9ydHMuaGFuZGxlciA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFxcJ2hlbGxvIHdvcmxkXFwnKTtcbiAgICAgICAgICB9O2AsXG4gICAgICB9LFxuICAgICAgVlBDQ29uZmlnOiB7XG4gICAgICAgIFZwY0lkOiB7XG4gICAgICAgICAgUmVmOiBNYXRjaC5hbnlWYWx1ZSgpLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9KTtcbiAgfSk7XG5cbiAgdGVzdCgnZGVmYXVsdCBzZWN1cml0eSBncm91cCBhbmQgc3VibmV0cycsICgpID0+IHtcbiAgICAvLyBHSVZFTlxuICAgIGNvbnN0IHN0YWNrID0gbmV3IFN0YWNrKCk7XG4gICAgY29uc3QgdnBjID0gbmV3IGVjMi5WcGMoc3RhY2ssICdWUEMnLCB7IG1heEF6czogMiB9KTtcblxuICAgIC8vIFdIRU5cbiAgICBuZXcgc3ludGhldGljcy5DYW5hcnkoc3RhY2ssICdDYW5hcnknLCB7XG4gICAgICB0ZXN0OiBzeW50aGV0aWNzLlRlc3QuY3VzdG9tKHtcbiAgICAgICAgaGFuZGxlcjogJ2luZGV4LmhhbmRsZXInLFxuICAgICAgICBjb2RlOiBzeW50aGV0aWNzLkNvZGUuZnJvbUlubGluZShgXG4gICAgICAgICAgZXhwb3J0cy5oYW5kbGVyID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5sb2coXFwnaGVsbG8gd29ybGRcXCcpO1xuICAgICAgICAgIH07YCksXG4gICAgICB9KSxcbiAgICAgIHJ1bnRpbWU6IHN5bnRoZXRpY3MuUnVudGltZS5TWU5USEVUSUNTX05PREVKU19QVVBQRVRFRVJfM184LFxuICAgICAgdnBjLFxuICAgIH0pO1xuXG4gICAgLy8gVEhFTlxuICAgIFRlbXBsYXRlLmZyb21TdGFjayhzdGFjaykuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OlN5bnRoZXRpY3M6OkNhbmFyeScsIHtcbiAgICAgIENvZGU6IHtcbiAgICAgICAgSGFuZGxlcjogJ2luZGV4LmhhbmRsZXInLFxuICAgICAgICBTY3JpcHQ6IGBcbiAgICAgICAgICBleHBvcnRzLmhhbmRsZXIgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcXCdoZWxsbyB3b3JsZFxcJyk7XG4gICAgICAgICAgfTtgLFxuICAgICAgfSxcbiAgICAgIFZQQ0NvbmZpZzoge1xuICAgICAgICBWcGNJZDoge1xuICAgICAgICAgIFJlZjogTWF0Y2guYW55VmFsdWUoKSxcbiAgICAgICAgfSxcbiAgICAgICAgU2VjdXJpdHlHcm91cElkczogTWF0Y2guYW55VmFsdWUoKSxcbiAgICAgICAgU3VibmV0SWRzOiBbLi4udnBjLnByaXZhdGVTdWJuZXRzLm1hcChzdWJuZXQgPT4gKHsgUmVmOiBNYXRjaC5zdHJpbmdMaWtlUmVnZXhwKHN1Ym5ldC5ub2RlLmlkKSB9KSldLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfSk7XG5cbiAgdGVzdCgncHJvdmlkZWQgc2VjdXJpdHkgZ3JvdXAnLCAoKSA9PiB7XG4gICAgLy8gR0lWRU5cbiAgICBjb25zdCBzdGFjayA9IG5ldyBTdGFjaygpO1xuICAgIGNvbnN0IHZwYyA9IG5ldyBlYzIuVnBjKHN0YWNrLCAnVlBDJywgeyBtYXhBenM6IDIgfSk7XG4gICAgY29uc3Qgc2cgPSBuZXcgZWMyLlNlY3VyaXR5R3JvdXAoc3RhY2ssICdTZycsIHsgdnBjIH0pO1xuXG4gICAgLy8gV0hFTlxuICAgIG5ldyBzeW50aGV0aWNzLkNhbmFyeShzdGFjaywgJ0NhbmFyeScsIHtcbiAgICAgIHRlc3Q6IHN5bnRoZXRpY3MuVGVzdC5jdXN0b20oe1xuICAgICAgICBoYW5kbGVyOiAnaW5kZXguaGFuZGxlcicsXG4gICAgICAgIGNvZGU6IHN5bnRoZXRpY3MuQ29kZS5mcm9tSW5saW5lKGBcbiAgICAgICAgICBleHBvcnRzLmhhbmRsZXIgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcXCdoZWxsbyB3b3JsZFxcJyk7XG4gICAgICAgICAgfTtgKSxcbiAgICAgIH0pLFxuICAgICAgcnVudGltZTogc3ludGhldGljcy5SdW50aW1lLlNZTlRIRVRJQ1NfTk9ERUpTX1BVUFBFVEVFUl8zXzgsXG4gICAgICB2cGMsXG4gICAgICBzZWN1cml0eUdyb3VwczogW3NnXSxcbiAgICB9KTtcblxuICAgIC8vIFRIRU5cbiAgICBjb25zdCB0ZW1wbGF0ZSA9IFRlbXBsYXRlLmZyb21TdGFjayhzdGFjayk7XG4gICAgY29uc3Qgc2dUZW1wbGF0ZSA9IHRlbXBsYXRlLmZpbmRSZXNvdXJjZXMoJ0FXUzo6RUMyOjpTZWN1cml0eUdyb3VwJyk7XG4gICAgY29uc3Qgc2dJZHMgPSBPYmplY3Qua2V5cyhzZ1RlbXBsYXRlKTtcblxuICAgIGV4cGVjdChzZ0lkcykudG9IYXZlTGVuZ3RoKDEpO1xuXG4gICAgdGVtcGxhdGUuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OlN5bnRoZXRpY3M6OkNhbmFyeScsIHtcbiAgICAgIENvZGU6IHtcbiAgICAgICAgSGFuZGxlcjogJ2luZGV4LmhhbmRsZXInLFxuICAgICAgICBTY3JpcHQ6IGBcbiAgICAgICAgICBleHBvcnRzLmhhbmRsZXIgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcXCdoZWxsbyB3b3JsZFxcJyk7XG4gICAgICAgICAgfTtgLFxuICAgICAgfSxcbiAgICAgIFZQQ0NvbmZpZzoge1xuICAgICAgICBWcGNJZDoge1xuICAgICAgICAgIFJlZjogTWF0Y2guYW55VmFsdWUoKSxcbiAgICAgICAgfSxcbiAgICAgICAgU2VjdXJpdHlHcm91cElkczogW3sgJ0ZuOjpHZXRBdHQnOiBbc2dJZHNbMF0sICdHcm91cElkJ10gfV0sXG4gICAgICB9LFxuICAgIH0pO1xuICB9KTtcbn0pO1xuXG50ZXN0KCdSb2xlIHBvbGljeSBnZW5lcmF0ZWQgYXMgZXhwZWN0ZWQnLCAoKSA9PiB7XG4gIC8vIEdJVkVOXG4gIGNvbnN0IHN0YWNrID0gbmV3IFN0YWNrKCk7XG5cbiAgLy8gV0hFTlxuICBuZXcgc3ludGhldGljcy5DYW5hcnkoc3RhY2ssICdDYW5hcnknLCB7XG4gICAgdGVzdDogc3ludGhldGljcy5UZXN0LmN1c3RvbSh7XG4gICAgICBoYW5kbGVyOiAnaW5kZXguaGFuZGxlcicsXG4gICAgICBjb2RlOiBzeW50aGV0aWNzLkNvZGUuZnJvbUlubGluZSgnLyogU3ludGhldGljcyBoYW5kbGVyIGNvZGUgKi8nKSxcbiAgICB9KSxcbiAgICBydW50aW1lOiBzeW50aGV0aWNzLlJ1bnRpbWUuU1lOVEhFVElDU19OT0RFSlNfUFVQUEVURUVSXzNfOCxcbiAgfSk7XG5cbiAgLy8gVEhFTlxuICBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spLmhhc1Jlc291cmNlUHJvcGVydGllcygnQVdTOjpJQU06OlJvbGUnLCB7XG4gICAgUG9saWNpZXM6IFt7XG4gICAgICBQb2xpY3lEb2N1bWVudDoge1xuICAgICAgICBTdGF0ZW1lbnQ6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBBY3Rpb246ICdzMzpMaXN0QWxsTXlCdWNrZXRzJyxcbiAgICAgICAgICAgIEVmZmVjdDogJ0FsbG93JyxcbiAgICAgICAgICAgIFJlc291cmNlOiAnKicsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBBY3Rpb246ICdzMzpHZXRCdWNrZXRMb2NhdGlvbicsXG4gICAgICAgICAgICBFZmZlY3Q6ICdBbGxvdycsXG4gICAgICAgICAgICBSZXNvdXJjZToge1xuICAgICAgICAgICAgICAnRm46OkdldEF0dCc6IFtcbiAgICAgICAgICAgICAgICAnQ2FuYXJ5QXJ0aWZhY3RzQnVja2V0NEE2MEQzMkInLFxuICAgICAgICAgICAgICAgICdBcm4nLFxuICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIEFjdGlvbjogJ3MzOlB1dE9iamVjdCcsXG4gICAgICAgICAgICBFZmZlY3Q6ICdBbGxvdycsXG4gICAgICAgICAgICBSZXNvdXJjZToge1xuICAgICAgICAgICAgICAnRm46OkpvaW4nOiBbXG4gICAgICAgICAgICAgICAgJycsXG4gICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAnRm46OkdldEF0dCc6IFtcbiAgICAgICAgICAgICAgICAgICAgICAnQ2FuYXJ5QXJ0aWZhY3RzQnVja2V0NEE2MEQzMkInLFxuICAgICAgICAgICAgICAgICAgICAgICdBcm4nLFxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICcvKicsXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBBY3Rpb246ICdjbG91ZHdhdGNoOlB1dE1ldHJpY0RhdGEnLFxuICAgICAgICAgICAgQ29uZGl0aW9uOiB7XG4gICAgICAgICAgICAgIFN0cmluZ0VxdWFsczoge1xuICAgICAgICAgICAgICAgICdjbG91ZHdhdGNoOm5hbWVzcGFjZSc6ICdDbG91ZFdhdGNoU3ludGhldGljcycsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgRWZmZWN0OiAnQWxsb3cnLFxuICAgICAgICAgICAgUmVzb3VyY2U6ICcqJyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIEFjdGlvbjogW1xuICAgICAgICAgICAgICAnbG9nczpDcmVhdGVMb2dTdHJlYW0nLFxuICAgICAgICAgICAgICAnbG9nczpDcmVhdGVMb2dHcm91cCcsXG4gICAgICAgICAgICAgICdsb2dzOlB1dExvZ0V2ZW50cycsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgRWZmZWN0OiAnQWxsb3cnLFxuICAgICAgICAgICAgUmVzb3VyY2U6IHtcbiAgICAgICAgICAgICAgJ0ZuOjpKb2luJzogW1xuICAgICAgICAgICAgICAgICcnLFxuICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICdhcm46JyxcbiAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgUmVmOiAnQVdTOjpQYXJ0aXRpb24nLFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICc6bG9nczonLFxuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBSZWY6ICdBV1M6OlJlZ2lvbicsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgJzonLFxuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBSZWY6ICdBV1M6OkFjY291bnRJZCcsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgJzpsb2ctZ3JvdXA6L2F3cy9sYW1iZGEvY3dzeW4tKicsXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgfV0sXG4gIH0pO1xufSk7XG5cbnRlc3QoJ1Nob3VsZCBjcmVhdGUgaGFuZGxlciB3aXRoIHBhdGggZm9yIHJlY2VudCBydW50aW1lcycsICgpID0+IHtcbiAgLy8gR0lWRU5cbiAgY29uc3Qgc3RhY2sgPSBuZXcgU3RhY2soKTtcblxuICAvLyBXSEVOXG4gIG5ldyBzeW50aGV0aWNzLkNhbmFyeShzdGFjaywgJ0NhbmFyeScsIHtcbiAgICBjYW5hcnlOYW1lOiAnbXljYW5hcnknLFxuICAgIHRlc3Q6IHN5bnRoZXRpY3MuVGVzdC5jdXN0b20oe1xuICAgICAgaGFuZGxlcjogJ2ZvbGRlci9jYW5hcnkuZnVuY3Rpb25OYW1lJyxcbiAgICAgIGNvZGU6IHN5bnRoZXRpY3MuQ29kZS5mcm9tQXNzZXQocGF0aC5qb2luKF9fZGlybmFtZSwgJ2NhbmFyaWVzJykpLFxuICAgIH0pLFxuICAgIHJ1bnRpbWU6IHN5bnRoZXRpY3MuUnVudGltZS5TWU5USEVUSUNTX05PREVKU19QVVBQRVRFRVJfM184LFxuICB9KTtcblxuICAvLyBUSEVOXG4gIFRlbXBsYXRlLmZyb21TdGFjayhzdGFjaykuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OlN5bnRoZXRpY3M6OkNhbmFyeScsIHtcbiAgICBOYW1lOiAnbXljYW5hcnknLFxuICAgIENvZGU6IHtcbiAgICAgIEhhbmRsZXI6ICdmb2xkZXIvY2FuYXJ5LmZ1bmN0aW9uTmFtZScsXG4gICAgfSxcbiAgICBSdW50aW1lVmVyc2lvbjogJ3N5bi1ub2RlanMtcHVwcGV0ZWVyLTMuOCcsXG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKCdoYW5kbGVyIHZhbGlkYXRpb24nLCAoKSA9PiB7XG4gIHRlc3QoJ2xlZ2FjeSBydW50aW1lcycsICgpID0+IHtcbiAgICBjb25zdCBzdGFjayA9IG5ldyBTdGFjaygpO1xuICAgIGV4cGVjdCgoKSA9PiB7XG4gICAgICBuZXcgc3ludGhldGljcy5DYW5hcnkoc3RhY2ssICdDYW5hcnknLCB7XG4gICAgICAgIHRlc3Q6IHN5bnRoZXRpY3MuVGVzdC5jdXN0b20oe1xuICAgICAgICAgIGhhbmRsZXI6ICdpbmRleC5mdW5jdGlvbk5hbWUnLFxuICAgICAgICAgIGNvZGU6IHN5bnRoZXRpY3MuQ29kZS5mcm9tQXNzZXQocGF0aC5qb2luKF9fZGlybmFtZSwgJ2NhbmFyaWVzJykpLFxuICAgICAgICB9KSxcbiAgICAgICAgcnVudGltZTogc3ludGhldGljcy5SdW50aW1lLlNZTlRIRVRJQ1NfUFlUSE9OX1NFTEVOSVVNXzFfMCxcbiAgICAgIH0pO1xuICAgIH0pLnRvVGhyb3coL0NhbmFyeSBIYW5kbGVyIG11c3QgYmUgc3BlY2lmaWVkIGFzICdmaWxlTmFtZS5oYW5kbGVyJyBmb3IgbGVnYWN5IHJ1bnRpbWVzLyk7XG4gIH0pO1xuXG4gIHRlc3QoJ3JlY2VudCBydW50aW1lcycsICgpID0+IHtcbiAgICBjb25zdCBzdGFjayA9IG5ldyBTdGFjaygpO1xuXG4gICAgZXhwZWN0KCgpID0+IHtcbiAgICAgIG5ldyBzeW50aGV0aWNzLkNhbmFyeShzdGFjaywgJ0NhbmFyeScsIHtcbiAgICAgICAgdGVzdDogc3ludGhldGljcy5UZXN0LmN1c3RvbSh7XG4gICAgICAgICAgaGFuZGxlcjogJ2ludmFsaWRIYW5kbGVyJyxcbiAgICAgICAgICBjb2RlOiBzeW50aGV0aWNzLkNvZGUuZnJvbUFzc2V0KHBhdGguam9pbihfX2Rpcm5hbWUsICdjYW5hcmllcycpKSxcbiAgICAgICAgfSksXG4gICAgICAgIHJ1bnRpbWU6IHN5bnRoZXRpY3MuUnVudGltZS5TWU5USEVUSUNTX05PREVKU19QVVBQRVRFRVJfM185LFxuICAgICAgfSk7XG4gICAgfSkudG9UaHJvdygvQ2FuYXJ5IEhhbmRsZXIgbXVzdCBiZSBzcGVjaWZpZWQgZWl0aGVyIGFzICdmaWxlTmFtZS5oYW5kbGVyJywgJ2ZpbGVOYW1lLmZ1bmN0aW9uTmFtZScsIG9yICdmb2xkZXJcXC9maWxlTmFtZS5mdW5jdGlvbk5hbWUnLyk7XG5cbiAgICBleHBlY3QoKCkgPT4ge1xuICAgICAgbmV3IHN5bnRoZXRpY3MuQ2FuYXJ5KHN0YWNrLCAnQ2FuYXJ5MScsIHtcbiAgICAgICAgdGVzdDogc3ludGhldGljcy5UZXN0LmN1c3RvbSh7XG4gICAgICAgICAgaGFuZGxlcjogJ2NhbmFyeS5mdW5jdGlvbk5hbWUnLFxuICAgICAgICAgIGNvZGU6IHN5bnRoZXRpY3MuQ29kZS5mcm9tQXNzZXQocGF0aC5qb2luKF9fZGlybmFtZSwgJ2NhbmFyaWVzJykpLFxuICAgICAgICB9KSxcbiAgICAgICAgcnVudGltZTogc3ludGhldGljcy5SdW50aW1lLlNZTlRIRVRJQ1NfTk9ERUpTX1BVUFBFVEVFUl8zXzksXG4gICAgICB9KTtcbiAgICB9KS5ub3QudG9UaHJvdygpO1xuXG4gICAgZXhwZWN0KCgpID0+IHtcbiAgICAgIG5ldyBzeW50aGV0aWNzLkNhbmFyeShzdGFjaywgJ0NhbmFyeTInLCB7XG4gICAgICAgIHRlc3Q6IHN5bnRoZXRpY3MuVGVzdC5jdXN0b20oe1xuICAgICAgICAgIGhhbmRsZXI6ICdmb2xkZXIvY2FuYXJ5LmZ1bmN0aW9uTmFtZScsXG4gICAgICAgICAgY29kZTogc3ludGhldGljcy5Db2RlLmZyb21Bc3NldChwYXRoLmpvaW4oX19kaXJuYW1lLCAnY2FuYXJpZXMnKSksXG4gICAgICAgIH0pLFxuICAgICAgICBydW50aW1lOiBzeW50aGV0aWNzLlJ1bnRpbWUuU1lOVEhFVElDU19OT0RFSlNfUFVQUEVURUVSXzNfOSxcbiAgICAgIH0pO1xuICAgIH0pLm5vdC50b1Rocm93KCk7XG4gIH0pO1xuXG4gIHRlc3QoJ2hhbmRsZXIgbGVuZ3RoJywgKCkgPT4ge1xuICAgIGNvbnN0IHN0YWNrID0gbmV3IFN0YWNrKCk7XG4gICAgZXhwZWN0KCgpID0+IHtcbiAgICAgIG5ldyBzeW50aGV0aWNzLkNhbmFyeShzdGFjaywgJ0NhbmFyeTEnLCB7XG4gICAgICAgIHRlc3Q6IHN5bnRoZXRpY3MuVGVzdC5jdXN0b20oe1xuICAgICAgICAgIGhhbmRsZXI6ICdsb25nSGFuZGxlck5hbWUnLnJlcGVhdCgxMCkgKyAnLmhhbmRsZXInLFxuICAgICAgICAgIGNvZGU6IHN5bnRoZXRpY3MuQ29kZS5mcm9tQXNzZXQocGF0aC5qb2luKF9fZGlybmFtZSwgJ2NhbmFyaWVzJykpLFxuICAgICAgICB9KSxcbiAgICAgICAgcnVudGltZTogc3ludGhldGljcy5SdW50aW1lLlNZTlRIRVRJQ1NfTk9ERUpTX1BVUFBFVEVFUl8zXzksXG4gICAgICB9KTtcbiAgICB9KS50b1Rocm93KC9DYW5hcnkgSGFuZGxlciBsZW5ndGggbXVzdCBiZSBiZXR3ZWVuIDEgYW5kIDEyOC8pO1xuICB9KTtcbn0pO1xuIl19 \ No newline at end of file diff --git a/packages/@aws-cdk/aws-synthetics-alpha/test/code.test.d.ts b/packages/@aws-cdk/aws-synthetics-alpha/test/code.test.d.ts new file mode 100644 index 0000000000000..cb0ff5c3b541f --- /dev/null +++ b/packages/@aws-cdk/aws-synthetics-alpha/test/code.test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/packages/@aws-cdk/aws-synthetics-alpha/test/code.test.js b/packages/@aws-cdk/aws-synthetics-alpha/test/code.test.js new file mode 100644 index 0000000000000..7381aa1bc9e28 --- /dev/null +++ b/packages/@aws-cdk/aws-synthetics-alpha/test/code.test.js @@ -0,0 +1,220 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const fs = require("fs"); +const path = require("path"); +const assertions_1 = require("aws-cdk-lib/assertions"); +const s3 = require("aws-cdk-lib/aws-s3"); +const aws_cdk_lib_1 = require("aws-cdk-lib"); +const cxapi = require("aws-cdk-lib/cx-api"); +const synthetics = require("../lib"); +const lib_1 = require("../lib"); +describe(synthetics.Code.fromInline, () => { + test('fromInline works', () => { + // GIVEN + const stack = new aws_cdk_lib_1.Stack(new aws_cdk_lib_1.App(), 'canaries'); + // WHEN + const inline = synthetics.Code.fromInline(` + exports.handler = async () => { + console.log(\'hello world\'); + };`); + // THEN + expect(inline.bind(stack, 'index.handler', lib_1.RuntimeFamily.NODEJS).inlineCode).toEqual(` + exports.handler = async () => { + console.log(\'hello world\'); + };`); + }); + test('fails if empty', () => { + expect(() => synthetics.Code.fromInline('')) + .toThrowError('Canary inline code cannot be empty'); + }); + test('fails if handler is not "index.handler"', () => { + // GIVEN + const stack = new aws_cdk_lib_1.Stack(new aws_cdk_lib_1.App(), 'canaries'); + // THEN + expect(() => synthetics.Code.fromInline('code').bind(stack, 'canary.handler', lib_1.RuntimeFamily.NODEJS)) + .toThrowError('The handler for inline code must be "index.handler" (got "canary.handler")'); + }); +}); +describe(synthetics.Code.fromAsset, () => { + test('fromAsset works for node runtimes', () => { + // GIVEN + const stack = new aws_cdk_lib_1.Stack(new aws_cdk_lib_1.App(), 'canaries'); + // WHEN + const directoryAsset = synthetics.Code.fromAsset(path.join(__dirname, 'canaries')); + new synthetics.Canary(stack, 'Canary', { + test: synthetics.Test.custom({ + handler: 'canary.handler', + code: directoryAsset, + }), + runtime: synthetics.Runtime.SYNTHETICS_NODEJS_PUPPETEER_3_8, + }); + // THEN + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::Synthetics::Canary', { + Code: { + Handler: 'canary.handler', + S3Bucket: stack.resolve(directoryAsset.bind(stack, 'canary.handler', synthetics.RuntimeFamily.NODEJS).s3Location?.bucketName), + S3Key: stack.resolve(directoryAsset.bind(stack, 'canary.handler', synthetics.RuntimeFamily.NODEJS).s3Location?.objectKey), + }, + }); + }); + test('fromAsset works for python runtimes', () => { + // GIVEN + const stack = new aws_cdk_lib_1.Stack(new aws_cdk_lib_1.App(), 'canaries'); + // WHEN + const directoryAsset = synthetics.Code.fromAsset(path.join(__dirname, 'canaries')); + new synthetics.Canary(stack, 'Canary', { + test: synthetics.Test.custom({ + handler: 'canary.handler', + code: directoryAsset, + }), + runtime: synthetics.Runtime.SYNTHETICS_PYTHON_SELENIUM_1_3, + }); + // THEN + assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::Synthetics::Canary', { + Code: { + Handler: 'canary.handler', + S3Bucket: stack.resolve(directoryAsset.bind(stack, 'canary.handler', synthetics.RuntimeFamily.PYTHON).s3Location?.bucketName), + S3Key: stack.resolve(directoryAsset.bind(stack, 'canary.handler', synthetics.RuntimeFamily.PYTHON).s3Location?.objectKey), + }, + }); + }); + test('only one Asset object gets created even if multiple canaries use the same AssetCode', () => { + // GIVEN + const app = new aws_cdk_lib_1.App({ + context: { + [cxapi.NEW_STYLE_STACK_SYNTHESIS_CONTEXT]: false, + }, + }); + const stack = new aws_cdk_lib_1.Stack(app, 'canaries'); + // WHEN + const directoryAsset = synthetics.Code.fromAsset(path.join(__dirname, 'canaries')); + new synthetics.Canary(stack, 'Canary1', { + test: synthetics.Test.custom({ + handler: 'canary.handler', + code: directoryAsset, + }), + runtime: synthetics.Runtime.SYNTHETICS_NODEJS_PUPPETEER_3_8, + }); + new synthetics.Canary(stack, 'Canary2', { + test: synthetics.Test.custom({ + handler: 'canary.handler', + code: directoryAsset, + }), + runtime: synthetics.Runtime.SYNTHETICS_NODEJS_PUPPETEER_3_8, + }); + // THEN + const assembly = app.synth(); + const synthesized = assembly.stacks[0]; + expect(synthesized.assets.length).toEqual(1); + }); + test('works when stack is a part of a stage', () => { + // GIVEN + const app = new aws_cdk_lib_1.App(); + const stage1 = new aws_cdk_lib_1.Stage(app, 'Stage1'); + const stage2 = new aws_cdk_lib_1.Stage(stage1, 'Stage2'); + const stack = new aws_cdk_lib_1.Stack(stage2); + // WHEN + const directoryAsset = synthetics.Code.fromAsset(path.join(__dirname, 'canaries')); + new synthetics.Canary(stack, 'Canary1', { + test: synthetics.Test.custom({ + handler: 'canary.handler', + code: directoryAsset, + }), + runtime: synthetics.Runtime.SYNTHETICS_NODEJS_PUPPETEER_3_8, + }); + }); + test('fails if path does not exist', () => { + const assetPath = path.join(__dirname, 'does-not-exist'); + expect(() => synthetics.Code.fromAsset(assetPath)) + .toThrowError(`${assetPath} is not a valid path`); + }); + test('fails if non-zip asset is used', () => { + // GIVEN + const stack = new aws_cdk_lib_1.Stack(new aws_cdk_lib_1.App(), 'canaries'); + // THEN + const assetPath = path.join(__dirname, 'canaries', 'nodejs', 'node_modules', 'canary.js'); + expect(() => synthetics.Code.fromAsset(assetPath).bind(stack, 'canary.handler', synthetics.RuntimeFamily.NODEJS)) + .toThrowError(`Asset must be a .zip file or a directory (${assetPath})`); + }); + test('fails if node runtime and "nodejs/node_modules" folder structure not used', () => { + // GIVEN + const stack = new aws_cdk_lib_1.Stack(new aws_cdk_lib_1.App(), 'canaries'); + // THEN + const assetPath = path.join(__dirname, 'canaries', 'nodejs', 'node_modules'); + expect(() => synthetics.Code.fromAsset(assetPath).bind(stack, 'canary.handler', synthetics.RuntimeFamily.NODEJS)) + .toThrowError(`The canary resource requires that the handler is present at "nodejs/node_modules/canary.js" but not found at ${assetPath} (https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Canaries_WritingCanary_Nodejs.html)`); + }); + test('fails if python runtime and "python" folder structure not used', () => { + // GIVEN + const stack = new aws_cdk_lib_1.Stack(new aws_cdk_lib_1.App(), 'canaries'); + // THEN + const assetPath = path.join(__dirname, 'canaries', 'python'); + expect(() => synthetics.Code.fromAsset(assetPath).bind(stack, 'canary.handler', synthetics.RuntimeFamily.PYTHON)) + .toThrowError(`The canary resource requires that the handler is present at "python/canary.py" but not found at ${assetPath} (https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Canaries_WritingCanary_Python.html)`); + }); + test('fails if handler is specified incorrectly', () => { + // GIVEN + const stack = new aws_cdk_lib_1.Stack(new aws_cdk_lib_1.App(), 'canaries'); + // THEN + const assetPath = path.join(__dirname, 'canaries', 'nodejs', 'node_modules'); + expect(() => synthetics.Code.fromAsset(assetPath).bind(stack, 'incorrect.handler', synthetics.RuntimeFamily.NODEJS)) + .toThrowError(`The canary resource requires that the handler is present at "nodejs/node_modules/incorrect.js" but not found at ${assetPath} (https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Canaries_WritingCanary_Nodejs.html)`); + }); + test('passes if bundling is specified', () => { + // GIVEN + const stack = new aws_cdk_lib_1.Stack(new aws_cdk_lib_1.App(), 'canaries'); + // WHEN + const assetPath = path.join(__dirname, 'canaries', 'nodejs', 'node_modules'); + const code = synthetics.Code.fromAsset(assetPath, { + bundling: { + image: aws_cdk_lib_1.DockerImage.fromRegistry('dummy'), + local: { + tryBundle(outputDir) { + const stageDir = path.join(outputDir, 'nodejs', 'node_modules'); + fs.mkdirSync(path.join(outputDir, 'nodejs')); + fs.mkdirSync(stageDir); + fs.copyFileSync(path.join(assetPath, 'canary.js'), path.join(stageDir, 'canary.js')); + return true; + }, + }, + }, + }); + // THEN + expect(() => code.bind(stack, 'canary.handler', synthetics.RuntimeFamily.NODEJS)) + .not.toThrow(); + }); + test('fails if bundling is specified but folder structure is wrong', () => { + // GIVEN + const stack = new aws_cdk_lib_1.Stack(new aws_cdk_lib_1.App(), 'canaries'); + // WHEN + const assetPath = path.join(__dirname, 'canaries', 'nodejs', 'node_modules'); + const code = synthetics.Code.fromAsset(assetPath, { + bundling: { + image: aws_cdk_lib_1.DockerImage.fromRegistry('dummy'), + local: { + tryBundle(outputDir) { + fs.copyFileSync(path.join(assetPath, 'canary.js'), path.join(outputDir, 'canary.js')); + return true; + }, + }, + }, + }); + // THEN + expect(() => code.bind(stack, 'canary.handler', synthetics.RuntimeFamily.NODEJS)) + .toThrowError(`The canary resource requires that the handler is present at "nodejs/node_modules/canary.js" but not found at ${assetPath} (https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Canaries_WritingCanary_Nodejs.html)`); + }); +}); +describe(synthetics.Code.fromBucket, () => { + test('fromBucket works', () => { + // GIVEN + const stack = new aws_cdk_lib_1.Stack(new aws_cdk_lib_1.App(), 'canaries'); + const bucket = new s3.Bucket(stack, 'CodeBucket'); + // WHEN + const code = synthetics.Code.fromBucket(bucket, 'code.js'); + const codeConfig = code.bind(stack, 'code.handler', lib_1.RuntimeFamily.NODEJS); + // THEN + expect(codeConfig.s3Location?.bucketName).toEqual(bucket.bucketName); + expect(codeConfig.s3Location?.objectKey).toEqual('code.js'); + }); +}); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29kZS50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiY29kZS50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEseUJBQXlCO0FBQ3pCLDZCQUE2QjtBQUM3Qix1REFBa0Q7QUFDbEQseUNBQXlDO0FBQ3pDLDZDQUE2RDtBQUM3RCw0Q0FBNEM7QUFDNUMscUNBQXFDO0FBQ3JDLGdDQUF1QztBQUV2QyxRQUFRLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsR0FBRyxFQUFFO0lBQ3hDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxHQUFHLEVBQUU7UUFDNUIsUUFBUTtRQUNSLE1BQU0sS0FBSyxHQUFHLElBQUksbUJBQUssQ0FBQyxJQUFJLGlCQUFHLEVBQUUsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUUvQyxPQUFPO1FBQ1AsTUFBTSxNQUFNLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUM7OztTQUdyQyxDQUFDLENBQUM7UUFFUCxPQUFPO1FBQ1AsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLGVBQWUsRUFBRSxtQkFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLE9BQU8sQ0FBQzs7O1NBR2hGLENBQUMsQ0FBQztJQUNULENBQUMsQ0FBQyxDQUFDO0lBRUgsSUFBSSxDQUFDLGdCQUFnQixFQUFFLEdBQUcsRUFBRTtRQUMxQixNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUM7YUFDekMsWUFBWSxDQUFDLG9DQUFvQyxDQUFDLENBQUM7SUFDeEQsQ0FBQyxDQUFDLENBQUM7SUFFSCxJQUFJLENBQUMseUNBQXlDLEVBQUUsR0FBRyxFQUFFO1FBQ25ELFFBQVE7UUFDUixNQUFNLEtBQUssR0FBRyxJQUFJLG1CQUFLLENBQUMsSUFBSSxpQkFBRyxFQUFFLEVBQUUsVUFBVSxDQUFDLENB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QUM7QUFFSCxRQUFRLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsR0FBRyxFQUFFO0lBQ3hDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxHQUFHLEVBQUU7UUFDNUIsUUFBUTtRQUNSLE1BQU0sS0FBSyxHQUFHLElBQUksbUJBQUssQ0FBQyxJQUFJLGlCQUFHLEVBQUUsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUMvQyxNQUFNLE1BQU0sR0FBRyxJQUFJLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBRWxELE9BQU87UUFDUCxNQUFNLElBQUksR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDM0QsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsY0FBYyxFQUFFLG1CQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFMUUsT0FBTztRQUNQLE1BQU0sQ0FBQyxVQUFVLENBQUMsVUFBVSxFQUFFLFVBQVUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDckUsTUFBTSxDQUFDLFVBQVUsQ0FBQyxVQUFVLEVBQUUsU0FBUyxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQzlELENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBmcyBmcm9tICdmcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgVGVtcGxhdGUgfSBmcm9tICdhd3MtY2RrLWxpYi9hc3NlcnRpb25zJztcbmltcG9ydCAqIGFzIHMzIGZyb20gJ2F3cy1jZGstbGliL2F3cy1zMyc7XG5pbXBvcnQgeyBBcHAsIFN0YWdlLCBTdGFjaywgRG9ja2VySW1hZ2UgfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgKiBhcyBjeGFwaSBmcm9tICdhd3MtY2RrLWxpYi9jeC1hcGknO1xuaW1wb3J0ICogYXMgc3ludGhldGljcyBmcm9tICcuLi9saWInO1xuaW1wb3J0IHsgUnVudGltZUZhbWlseSB9IGZyb20gJy4uL2xpYic7XG5cbmRlc2NyaWJlKHN5bnRoZXRpY3MuQ29kZS5mcm9tSW5saW5lLCAoKSA9PiB7XG4gIHRlc3QoJ2Zyb21JbmxpbmUgd29ya3MnLCAoKSA9PiB7XG4gICAgLy8gR0lWRU5cbiAgICBjb25zdCBzdGFjayA9IG5ldyBTdGFjayhuZXcgQXBwKCksICdjYW5hcmllcycpO1xuXG4gICAgLy8gV0hFTlxuICAgIGNvbnN0IGlubGluZSA9IHN5bnRoZXRpY3MuQ29kZS5mcm9tSW5saW5lKGBcbiAgICAgIGV4cG9ydHMuaGFuZGxlciA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coXFwnaGVsbG8gd29ybGRcXCcpO1xuICAgICAgfTtgKTtcblxuICAgIC8vIFRIRU5cbiAgICBleHBlY3QoaW5saW5lLmJpbmQoc3RhY2ssICdpbmRleC5oYW5kbGVyJywgUnVudGltZUZhbWlseS5OT0RFSlMpLmlubGluZUNvZGUpLnRvRXF1YWwoYFxuICAgICAgZXhwb3J0cy5oYW5kbGVyID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZyhcXCdoZWxsbyB3b3JsZFxcJyk7XG4gICAgICB9O2ApO1xuICB9KTtcblxuICB0ZXN0KCdmYWlscyBpZiBlbXB0eScsICgpID0+IHtcbiAgICBleHBlY3QoKCkgPT4gc3ludGhldGljcy5Db2RlLmZyb21JbmxpbmUoJycpKVxuICAgICAgLnRvVGhyb3dFcnJvcignQ2FuYXJ5IGlubGluZSBjb2RlIGNhbm5vdCBiZSBlbXB0eScpO1xuICB9KTtcblxuICB0ZXN0KCdmYWlscyBpZiBoYW5kbGVyIGlzIG5vdCBcImluZGV4LmhhbmRsZXJcIicsICgpID0+IHtcbiAgICAvLyBHSVZFTlxuICAgIGNvbnN0IHN0YWNrID0gbmV3IFN0YWNrKG5ldyBBcHAoKSwgJ2NhbmFyaWVzJyk7XG5cbiAgICAvLyBUSEVOXG4gICAgZXhwZWN0KCgpID0+IHN5bnRoZXRpY3MuQ29kZS5mcm9tSW5saW5lKCdjb2RlJykuYmluZChzdGFjaywgJ2NhbmFyeS5oYW5kbGVyJywgUnVudGltZUZhbWlseS5OT0RFSlMpKVxuICAgICAgLnRvVGhyb3dFcnJvcignVGhlIGhhbmRsZXIgZm9yIGlubGluZSBjb2RlIG11c3QgYmUgXCJpbmRleC5oYW5kbGVyXCIgKGdvdCBcImNhbmFyeS5oYW5kbGVyXCIpJyk7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKHN5bnRoZXRpY3MuQ29kZS5mcm9tQXNzZXQsICgpID0+IHtcbiAgdGVzdCgnZnJvbUFzc2V0IHdvcmtzIGZvciBub2RlIHJ1bnRpbWVzJywgKCkgPT4ge1xuICAgIC8vIEdJVkVOXG4gICAgY29uc3Qgc3RhY2sgPSBuZXcgU3RhY2sobmV3IEFwcCgpLCAnY2FuYXJpZXMnKTtcblxuICAgIC8vIFdIRU5cbiAgICBjb25zdCBkaXJlY3RvcnlBc3NldCA9IHN5bnRoZXRpY3MuQ29kZS5mcm9tQXNzZXQocGF0aC5qb2luKF9fZGlybmFtZSwgJ2NhbmFyaWVzJykpO1xuICAgIG5ldyBzeW50aGV0aWNzLkNhbmFyeShzdGFjaywgJ0NhbmFyeScsIHtcbiAgICAgIHRlc3Q6IHN5bnRoZXRpY3MuVGVzdC5jdXN0b20oe1xuICAgICAgICBoYW5kbGVyOiAnY2FuYXJ5LmhhbmRsZXInLFxuICAgICAgICBjb2RlOiBkaXJlY3RvcnlBc3NldCxcbiAgICAgIH0pLFxuICAgICAgcnVudGltZTogc3ludGhldGljcy5SdW50aW1lLlNZTlRIRVRJQ1NfTk9ERUpTX1BVUFBFVEVFUl8zXzgsXG4gICAgfSk7XG5cbiAgICAvLyBUSEVOXG4gICAgVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6U3ludGhldGljczo6Q2FuYXJ5Jywge1xuICAgICAgQ29kZToge1xuICAgICAgICBIYW5kbGVyOiAnY2FuYXJ5LmhhbmRsZXInLFxuICAgICAgICBTM0J1Y2tldDogc3RhY2sucmVzb2x2ZShkaXJlY3RvcnlBc3NldC5iaW5kKHN0YWNrLCAnY2FuYXJ5LmhhbmRsZXInLCBzeW50aGV0aWNzLlJ1bnRpbWVGYW1pbHkuTk9ERUpTKS5zM0xvY2F0aW9uPy5idWNrZXROYW1lKSxcbiAgICAgICAgUzNLZXk6IHN0YWNrLnJlc29sdmUoZGlyZWN0b3J5QXNzZXQuYmluZChzdGFjaywgJ2NhbmFyeS5oYW5kbGVyJywgc3ludGhldGljcy5SdW50aW1lRmFtaWx5Lk5PREVKUykuczNMb2NhdGlvbj8ub2JqZWN0S2V5KSxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH0pO1xuXG4gIHRlc3QoJ2Zyb21Bc3NldCB3b3JrcyBmb3IgcHl0aG9uIHJ1bnRpbWVzJywgKCkgPT4ge1xuICAgIC8vIEdJVkVOXG4gICAgY29uc3Qgc3RhY2sgPSBuZXcgU3RhY2sobmV3IEFwcCgpLCAnY2FuYXJpZXMnKTtcblxuICAgIC8vIFdIRU5cbiAgICBjb25zdCBkaXJlY3RvcnlBc3NldCA9IHN5bnRoZXRpY3MuQ29kZS5mcm9tQXNzZXQocGF0aC5qb2luKF9fZGlybmFtZSwgJ2NhbmFyaWVzJykpO1xuICAgIG5ldyBzeW50aGV0aWNzLkNhbmFyeShzdGFjaywgJ0NhbmFyeScsIHtcbiAgICAgIHRlc3Q6IHN5bnRoZXRpY3MuVGVzdC5jdXN0b20oe1xuICAgICAgICBoYW5kbGVyOiAnY2FuYXJ5LmhhbmRsZXInLFxuICAgICAgICBjb2RlOiBkaXJlY3RvcnlBc3NldCxcbiAgICAgIH0pLFxuICAgICAgcnVudGltZTogc3ludGhldGljcy5SdW50aW1lLlNZTlRIRVRJQ1NfUFlUSE9OX1NFTEVOSVVNXzFfMyxcbiAgICB9KTtcblxuICAgIC8vIFRIRU5cbiAgICBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spLmhhc1Jlc291cmNlUHJvcGVydGllcygnQVdTOjpTeW50aGV0aWNzOjpDYW5hcnknLCB7XG4gICAgICBDb2RlOiB7XG4gICAgICAgIEhhbmRsZXI6ICdjYW5hcnkuaGFuZGxlcicsXG4gICAgICAgIFMzQnVja2V0OiBzdGFjay5yZXNvbHZlKGRpcmVjdG9yeUFzc2V0LmJpbmQoc3RhY2ssICdjYW5hcnkuaGFuZGxlcicsIHN5bnRoZXRpY3MuUnVudGltZUZhbWlseS5QWVRIT04pLnMzTG9jYXRpb24/LmJ1Y2tldE5hbWUpLFxuICAgICAgICBTM0tleTogc3RhY2sucmVzb2x2ZShkaXJlY3RvcnlBc3NldC5iaW5kKHN0YWNrLCAnY2FuYXJ5LmhhbmRsZXInLCBzeW50aGV0aWNzLlJ1bnRpbWVGYW1pbHkuUFlUSE9OKS5zM0xvY2F0aW9uPy5vYmplY3RLZXkpLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfSk7XG5cbiAgdGVzdCgnb25seSBvbmUgQXNzZXQgb2JqZWN0IGdldHMgY3JlYXRlZCBldmVuIGlmIG11bHRpcGxlIGNhbmFyaWVzIHVzZSB0aGUgc2FtZSBBc3NldENvZGUnLCAoKSA9PiB7XG4gICAgLy8gR0lWRU5cbiAgICBjb25zdCBhcHAgPSBuZXcgQXBwKHtcbiAgICAgIGNvbnRleHQ6IHtcbiAgICAgICAgW2N4YXBpLk5FV19TVFlMRV9TVEFDS19TWU5USEVTSVNfQ09OVEVYVF06IGZhbHNlLFxuICAgICAgfSxcbiAgICB9KTtcbiAgICBjb25zdCBzdGFjayA9IG5ldyBTdGFjayhhcHAsICdjYW5hcmllcycpO1xuXG4gICAgLy8gV0hFTlxuICAgIGNvbnN0IGRpcmVjdG9yeUFzc2V0ID0gc3ludGhldGljcy5Db2RlLmZyb21Bc3NldChwYXRoLmpvaW4oX19kaXJuYW1lLCAnY2FuYXJpZXMnKSk7XG4gICAgbmV3IHN5bnRoZXRpY3MuQ2FuYXJ5KHN0YWNrLCAnQ2FuYXJ5MScsIHtcbiAgICAgIHRlc3Q6IHN5bnRoZXRpY3MuVGVzdC5jdXN0b20oe1xuICAgICAgICBoYW5kbGVyOiAnY2FuYXJ5LmhhbmRsZXInLFxuICAgICAgICBjb2RlOiBkaXJlY3RvcnlBc3NldCxcbiAgICAgIH0pLFxuICAgICAgcnVudGltZTogc3ludGhldGljcy5SdW50aW1lLlNZTlRIRVRJQ1NfTk9ERUpTX1BVUFBFVEVFUl8zXzgsXG4gICAgfSk7XG5cbiAgICBuZXcgc3ludGhldGljcy5DYW5hcnkoc3RhY2ssICdDYW5hcnkyJywge1xuICAgICAgdGVzdDogc3ludGhldGljcy5UZXN0LmN1c3RvbSh7XG4gICAgICAgIGhhbmRsZXI6ICdjYW5hcnkuaGFuZGxlcicsXG4gICAgICAgIGNvZGU6IGRpcmVjdG9yeUFzc2V0LFxuICAgICAgfSksXG4gICAgICBydW50aW1lOiBzeW50aGV0aWNzLlJ1bnRpbWUuU1lOVEhFVElDU19OT0RFSlNfUFVQUEVURUVSXzNfOCxcbiAgICB9KTtcblxuICAgIC8vIFRIRU5cbiAgICBjb25zdCBhc3NlbWJseSA9IGFwcC5zeW50aCgpO1xuICAgIGNvbnN0IHN5bnRoZXNpemVkID0gYXNzZW1ibHkuc3RhY2tzWzBdO1xuXG4gICAgZXhwZWN0KHN5bnRoZXNpemVkLmFzc2V0cy5sZW5ndGgpLnRvRXF1YWwoMSk7XG4gIH0pO1xuXG4gIHRlc3QoJ3dvcmtzIHdoZW4gc3RhY2sgaXMgYSBwYXJ0IG9mIGEgc3RhZ2UnLCAoKSA9PiB7XG4gICAgLy8gR0lWRU5cbiAgICBjb25zdCBhcHAgPSBuZXcgQXBwKCk7XG4gICAgY29uc3Qgc3RhZ2UxID0gbmV3IFN0YWdlKGFwcCwgJ1N0YWdlMScpO1xuICAgIGNvbnN0IHN0YWdlMiA9IG5ldyBTdGFnZShzdGFnZTEsICdTdGFnZTInKTtcbiAgICBjb25zdCBzdGFjayA9IG5ldyBTdGFjayhzdGFnZTIpO1xuXG4gICAgLy8gV0hFTlxuICAgIGNvbnN0IGRpcmVjdG9yeUFzc2V0ID0gc3ludGhldGljcy5Db2RlLmZyb21Bc3NldChwYXRoLmpvaW4oX19kaXJuYW1lLCAnY2FuYXJpZXMnKSk7XG4gICAgbmV3IHN5bnRoZXRpY3MuQ2FuYXJ5KHN0YWNrLCAnQ2FuYXJ5MScsIHtcbiAgICAgIHRlc3Q6IHN5bnRoZXRpY3MuVGVzdC5jdXN0b20oe1xuICAgICAgICBoYW5kbGVyOiAnY2FuYXJ5LmhhbmRsZXInLFxuICAgICAgICBjb2RlOiBkaXJlY3RvcnlBc3NldCxcbiAgICAgIH0pLFxuICAgICAgcnVudGltZTogc3ludGhldGljcy5SdW50aW1lLlNZTlRIRVRJQ1NfTk9ERUpTX1BVUFBFVEVFUl8zXzgsXG4gICAgfSk7XG4gIH0pO1xuXG4gIHRlc3QoJ2ZhaWxzIGlmIHBhdGggZG9lcyBub3QgZXhpc3QnLCAoKSA9PiB7XG4gICAgY29uc3QgYXNzZXRQYXRoID0gcGF0aC5qb2luKF9fZGlybmFtZSwgJ2RvZXMtbm90LWV4aXN0Jyk7XG4gICAgZXhwZWN0KCgpID0+IHN5bnRoZXRpY3MuQ29kZS5mcm9tQXNzZXQoYXNzZXRQYXRoKSlcbiAgICAgIC50b1Rocm93RXJyb3IoYCR7YXNzZXRQYXRofSBpcyBub3QgYSB2YWxpZCBwYXRoYCk7XG4gIH0pO1xuXG4gIHRlc3QoJ2ZhaWxzIGlmIG5vbi16aXAgYXNzZXQgaXMgdXNlZCcsICgpID0+IHtcbiAgICAvLyBHSVZFTlxuICAgIGNvbnN0IHN0YWNrID0gbmV3IFN0YWNrKG5ldyBBcHAoKSwgJ2NhbmFyaWVzJyk7XG5cbiAgICAvLyBUSEVOXG4gICAgY29uc3QgYXNzZXRQYXRoID0gcGF0aC5qb2luKF9fZGlybmFtZSwgJ2NhbmFyaWVzJywgJ25vZGVqcycsICdub2RlX21vZHVsZXMnLCAnY2FuYXJ5LmpzJyk7XG4gICAgZXhwZWN0KCgpID0+IHN5bnRoZXRpY3MuQ29kZS5mcm9tQXNzZXQoYXNzZXRQYXRoKS5iaW5kKHN0YWNrLCAnY2FuYXJ5LmhhbmRsZXInLCBzeW50aGV0aWNzLlJ1bnRpbWVGYW1pbHkuTk9ERUpTKSlcbiAgICAgIC50b1Rocm93RXJyb3IoYEFzc2V0IG11c3QgYmUgYSAuemlwIGZpbGUgb3IgYSBkaXJlY3RvcnkgKCR7YXNzZXRQYXRofSlgKTtcbiAgfSk7XG5cbiAgdGVzdCgnZmFpbHMgaWYgbm9kZSBydW50aW1lIGFuZCBcIm5vZGVqcy9ub2RlX21vZHVsZXNcIiBmb2xkZXIgc3RydWN0dXJlIG5vdCB1c2VkJywgKCkgPT4ge1xuICAgIC8vIEdJVkVOXG4gICAgY29uc3Qgc3RhY2sgPSBuZXcgU3RhY2sobmV3IEFwcCgpLCAnY2FuYXJpZXMnKTtcblxuICAgIC8vIFRIRU5cbiAgICBjb25zdCBhc3NldFBhdGggPSBwYXRoLmpvaW4oX19kaXJuYW1lLCAnY2FuYXJpZXMnLCAnbm9kZWpzJywgJ25vZGVfbW9kdWxlcycpO1xuICAgIGV4cGVjdCgoKSA9PiBzeW50aGV0aWNzLkNvZGUuZnJvbUFzc2V0KGFzc2V0UGF0aCkuYmluZChzdGFjaywgJ2NhbmFyeS5oYW5kbGVyJywgc3ludGhldGljcy5SdW50aW1lRmFtaWx5Lk5PREVKUykpXG4gICAgICAudG9UaHJvd0Vycm9yKGBUaGUgY2FuYXJ5IHJlc291cmNlIHJlcXVpcmVzIHRoYXQgdGhlIGhhbmRsZXIgaXMgcHJlc2VudCBhdCBcIm5vZGVqcy9ub2RlX21vZHVsZXMvY2FuYXJ5LmpzXCIgYnV0IG5vdCBmb3VuZCBhdCAke2Fzc2V0UGF0aH0gKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZFdhdGNoL2xhdGVzdC9tb25pdG9yaW5nL0Nsb3VkV2F0Y2hfU3ludGhldGljc19DYW5hcmllc19Xcml0aW5nQ2FuYXJ5X05vZGVqcy5odG1sKWApO1xuICB9KTtcblxuICB0ZXN0KCdmYWlscyBpZiBweXRob24gcnVudGltZSBhbmQgXCJweXRob25cIiBmb2xkZXIgc3RydWN0dXJlIG5vdCB1c2VkJywgKCkgPT4ge1xuICAgIC8vIEdJVkVOXG4gICAgY29uc3Qgc3RhY2sgPSBuZXcgU3RhY2sobmV3IEFwcCgpLCAnY2FuYXJpZXMnKTtcblxuICAgIC8vIFRIRU5cbiAgICBjb25zdCBhc3NldFBhdGggPSBwYXRoLmpvaW4oX19kaXJuYW1lLCAnY2FuYXJpZXMnLCAncHl0aG9uJyk7XG4gICAgZXhwZWN0KCgpID0+IHN5bnRoZXRpY3MuQ29kZS5mcm9tQXNzZXQoYXNzZXRQYXRoKS5iaW5kKHN0YWNrLCAnY2FuYXJ5LmhhbmRsZXInLCBzeW50aGV0aWNzLlJ1bnRpbWVGYW1pbHkuUFlUSE9OKSlcbiAgICAgIC50b1Rocm93RXJyb3IoYFRoZSBjYW5hcnkgcmVzb3VyY2UgcmVxdWlyZXMgdGhhdCB0aGUgaGFuZGxlciBpcyBwcmVzZW50IGF0IFwicHl0aG9uL2NhbmFyeS5weVwiIGJ1dCBub3QgZm91bmQgYXQgJHthc3NldFBhdGh9IChodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRXYXRjaC9sYXRlc3QvbW9uaXRvcmluZy9DbG91ZFdhdGNoX1N5bnRoZXRpY3NfQ2FuYXJpZXNfV3JpdGluZ0NhbmFyeV9QeXRob24uaHRtbClgKTtcbiAgfSk7XG5cbiAgdGVzdCgnZmFpbHMgaWYgaGFuZGxlciBpcyBzcGVjaWZpZWQgaW5jb3JyZWN0bHknLCAoKSA9PiB7XG4gICAgLy8gR0lWRU5cbiAgICBjb25zdCBzdGFjayA9IG5ldyBTdGFjayhuZXcgQXBwKCksICdjYW5hcmllcycpO1xuXG4gICAgLy8gVEhFTlxuICAgIGNvbnN0IGFzc2V0UGF0aCA9IHBhdGguam9pbihfX2Rpcm5hbWUsICdjYW5hcmllcycsICdub2RlanMnLCAnbm9kZV9tb2R1bGVzJyk7XG4gICAgZXhwZWN0KCgpID0+IHN5bnRoZXRpY3MuQ29kZS5mcm9tQXNzZXQoYXNzZXRQYXRoKS5iaW5kKHN0YWNrLCAnaW5jb3JyZWN0LmhhbmRsZXInLCBzeW50aGV0aWNzLlJ1bnRpbWVGYW1pbHkuTk9ERUpTKSlcbiAgICAgIC50b1Rocm93RXJyb3IoYFRoZSBjYW5hcnkgcmVzb3VyY2UgcmVxdWlyZXMgdGhhdCB0aGUgaGFuZGxlciBpcyBwcmVzZW50IGF0IFwibm9kZWpzL25vZGVfbW9kdWxlcy9pbmNvcnJlY3QuanNcIiBidXQgbm90IGZvdW5kIGF0ICR7YXNzZXRQYXRofSAoaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkV2F0Y2gvbGF0ZXN0L21vbml0b3JpbmcvQ2xvdWRXYXRjaF9TeW50aGV0aWNzX0NhbmFyaWVzX1dyaXRpbmdDYW5hcnlfTm9kZWpzLmh0bWwpYCk7XG4gIH0pO1xuXG4gIHRlc3QoJ3Bhc3NlcyBpZiBidW5kbGluZyBpcyBzcGVjaWZpZWQnLCAoKSA9PiB7XG4gICAgLy8gR0lWRU5cbiAgICBjb25zdCBzdGFjayA9IG5ldyBTdGFjayhuZXcgQXBwKCksICdjYW5hcmllcycpO1xuXG4gICAgLy8gV0hFTlxuICAgIGNvbnN0IGFzc2V0UGF0aCA9IHBhdGguam9pbihfX2Rpcm5hbWUsICdjYW5hcmllcycsICdub2RlanMnLCAnbm9kZV9tb2R1bGVzJyk7XG4gICAgY29uc3QgY29kZSA9IHN5bnRoZXRpY3MuQ29kZS5mcm9tQXNzZXQoYXNzZXRQYXRoLCB7XG4gICAgICBidW5kbGluZzoge1xuICAgICAgICBpbWFnZTogRG9ja2VySW1hZ2UuZnJvbVJlZ2lzdHJ5KCdkdW1teScpLFxuICAgICAgICBsb2NhbDoge1xuICAgICAgICAgIHRyeUJ1bmRsZShvdXRwdXREaXIpIHtcbiAgICAgICAgICAgIGNvbnN0IHN0YWdlRGlyID0gcGF0aC5qb2luKG91dHB1dERpciwgJ25vZGVqcycsICdub2RlX21vZHVsZXMnKTtcbiAgICAgICAgICAgIGZzLm1rZGlyU3luYyhwYXRoLmpvaW4ob3V0cHV0RGlyLCAnbm9kZWpzJykpO1xuICAgICAgICAgICAgZnMubWtkaXJTeW5jKHN0YWdlRGlyKTtcbiAgICAgICAgICAgIGZzLmNvcHlGaWxlU3luYyhwYXRoLmpvaW4oYXNzZXRQYXRoLCAnY2FuYXJ5LmpzJyksIHBhdGguam9pbihzdGFnZURpciwgJ2NhbmFyeS5qcycpKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgLy8gVEhFTlxuICAgIGV4cGVjdCgoKSA9PiBjb2RlLmJpbmQoc3RhY2ssICdjYW5hcnkuaGFuZGxlcicsIHN5bnRoZXRpY3MuUnVudGltZUZhbWlseS5OT0RFSlMpKVxuICAgICAgLm5vdC50b1Rocm93KCk7XG4gIH0pO1xuXG4gIHRlc3QoJ2ZhaWxzIGlmIGJ1bmRsaW5nIGlzIHNwZWNpZmllZCBidXQgZm9sZGVyIHN0cnVjdHVyZSBpcyB3cm9uZycsICgpID0+IHtcbiAgICAvLyBHSVZFTlxuICAgIGNvbnN0IHN0YWNrID0gbmV3IFN0YWNrKG5ldyBBcHAoKSwgJ2NhbmFyaWVzJyk7XG5cbiAgICAvLyBXSEVOXG4gICAgY29uc3QgYXNzZXRQYXRoID0gcGF0aC5qb2luKF9fZGlybmFtZSwgJ2NhbmFyaWVzJywgJ25vZGVqcycsICdub2RlX21vZHVsZXMnKTtcbiAgICBjb25zdCBjb2RlID0gc3ludGhldGljcy5Db2RlLmZyb21Bc3NldChhc3NldFBhdGgsIHtcbiAgICAgIGJ1bmRsaW5nOiB7XG4gICAgICAgIGltYWdlOiBEb2NrZXJJbWFnZS5mcm9tUmVnaXN0cnkoJ2R1bW15JyksXG4gICAgICAgIGxvY2FsOiB7XG4gICAgICAgICAgdHJ5QnVuZGxlKG91dHB1dERpcikge1xuICAgICAgICAgICAgZnMuY29weUZpbGVTeW5jKHBhdGguam9pbihhc3NldFBhdGgsICdjYW5hcnkuanMnKSwgcGF0aC5qb2luKG91dHB1dERpciwgJ2NhbmFyeS5qcycpKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgLy8gVEhFTlxuICAgIGV4cGVjdCgoKSA9PiBjb2RlLmJpbmQoc3RhY2ssICdjYW5hcnkuaGFuZGxlcicsIHN5bnRoZXRpY3MuUnVudGltZUZhbWlseS5OT0RFSlMpKVxuICAgICAgLnRvVGhyb3dFcnJvcihgVGhlIGNhbmFyeSByZXNvdXJjZSByZXF1aXJlcyB0aGF0IHRoZSBoYW5kbGVyIGlzIHByZXNlbnQgYXQgXCJub2RlanMvbm9kZV9tb2R1bGVzL2NhbmFyeS5qc1wiIGJ1dCBub3QgZm91bmQgYXQgJHthc3NldFBhdGh9IChodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRXYXRjaC9sYXRlc3QvbW9uaXRvcmluZy9DbG91ZFdhdGNoX1N5bnRoZXRpY3NfQ2FuYXJpZXNfV3JpdGluZ0NhbmFyeV9Ob2RlanMuaHRtbClgKTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoc3ludGhldGljcy5Db2RlLmZyb21CdWNrZXQsICgpID0+IHtcbiAgdGVzdCgnZnJvbUJ1Y2tldCB3b3JrcycsICgpID0+IHtcbiAgICAvLyBHSVZFTlxuICAgIGNvbnN0IHN0YWNrID0gbmV3IFN0YWNrKG5ldyBBcHAoKSwgJ2NhbmFyaWVzJyk7XG4gICAgY29uc3QgYnVja2V0ID0gbmV3IHMzLkJ1Y2tldChzdGFjaywgJ0NvZGVCdWNrZXQnKTtcblxuICAgIC8vIFdIRU5cbiAgICBjb25zdCBjb2RlID0gc3ludGhldGljcy5Db2RlLmZyb21CdWNrZXQoYnVja2V0LCAnY29kZS5qcycpO1xuICAgIGNvbnN0IGNvZGVDb25maWcgPSBjb2RlLmJpbmQoc3RhY2ssICdjb2RlLmhhbmRsZXInLCBSdW50aW1lRmFtaWx5Lk5PREVKUyk7XG5cbiAgICAvLyBUSEVOXG4gICAgZXhwZWN0KGNvZGVDb25maWcuczNMb2NhdGlvbj8uYnVja2V0TmFtZSkudG9FcXVhbChidWNrZXQuYnVja2V0TmFtZSk7XG4gICAgZXhwZWN0KGNvZGVDb25maWcuczNMb2NhdGlvbj8ub2JqZWN0S2V5KS50b0VxdWFsKCdjb2RlLmpzJyk7XG4gIH0pO1xufSk7XG4iXX0= \ No newline at end of file diff --git a/packages/@aws-cdk/aws-synthetics-alpha/test/integ.canary-auto-delete-lambda.d.ts b/packages/@aws-cdk/aws-synthetics-alpha/test/integ.canary-auto-delete-lambda.d.ts new file mode 100644 index 0000000000000..cb0ff5c3b541f --- /dev/null +++ b/packages/@aws-cdk/aws-synthetics-alpha/test/integ.canary-auto-delete-lambda.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/packages/@aws-cdk/aws-synthetics-alpha/test/integ.canary-auto-delete-lambda.js b/packages/@aws-cdk/aws-synthetics-alpha/test/integ.canary-auto-delete-lambda.js new file mode 100644 index 0000000000000..e6743bc4b7caa --- /dev/null +++ b/packages/@aws-cdk/aws-synthetics-alpha/test/integ.canary-auto-delete-lambda.js @@ -0,0 +1,57 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const aws_cdk_lib_1 = require("aws-cdk-lib"); +const integ_tests_alpha_1 = require("@aws-cdk/integ-tests-alpha"); +const synthetics = require("../lib"); +const custom_resources_1 = require("aws-cdk-lib/custom-resources"); +class TestStack extends aws_cdk_lib_1.Stack { + constructor(scope, id, props) { + super(scope, id, props); + new synthetics.Canary(this, 'Canary', { + canaryName: 'next', + runtime: synthetics.Runtime.SYNTHETICS_NODEJS_PUPPETEER_4_0, + test: synthetics.Test.custom({ + handler: 'index.handler', + code: synthetics.Code.fromInline(` + exports.handler = async () => { + console.log(\'hello world\'); + };`), + }), + cleanup: synthetics.Cleanup.LAMBDA, + }); + const canaryThatWillBeRemoved = new synthetics.Canary(this, 'CanaryRemoved', { + runtime: synthetics.Runtime.SYNTHETICS_NODEJS_PUPPETEER_4_0, + test: synthetics.Test.custom({ + handler: 'index.handler', + code: synthetics.Code.fromInline(` + exports.handler = async () => { + console.log(\'hello world\'); + };`), + }), + cleanup: synthetics.Cleanup.LAMBDA, + startAfterCreation: false, // otherwise we get error: canary is in a state that can't be deleted: RUNNING + }); + // Remove this canary immediately + // so we can test that a non-existing canary will not fail the auto-delete-lambda Custom Resource + new custom_resources_1.AwsCustomResource(this, 'DeleteCanary', { + onCreate: { + physicalResourceId: custom_resources_1.PhysicalResourceId.of(canaryThatWillBeRemoved.canaryName), + service: 'Synthetics', + action: 'deleteCanary', + parameters: { + Name: canaryThatWillBeRemoved.canaryName, + }, + }, + policy: custom_resources_1.AwsCustomResourcePolicy.fromSdkCalls({ + resources: custom_resources_1.AwsCustomResourcePolicy.ANY_RESOURCE, + }), + }); + } +} +const app = new aws_cdk_lib_1.App(); +new integ_tests_alpha_1.IntegTest(app, 'cdk-integ-synthetics-canary-auto-delete', { + testCases: [new TestStack(app, 'cdk-synthetics-canary-auto-delete')], + diffAssets: true, + stackUpdateWorkflow: false, // will error because this stack has a cr that deletes its own resources +}); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZWcuY2FuYXJ5LWF1dG8tZGVsZXRlLWxhbWJkYS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImludGVnLmNhbmFyeS1hdXRvLWRlbGV0ZS1sYW1iZGEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSw2Q0FBcUQ7QUFDckQsa0VBQXVEO0FBRXZELHFDQUFxQztBQUNyQyxtRUFBOEc7QUFFOUcsTUFBTSxTQUFVLFNBQVEsbUJBQUs7SUFDM0IsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUFrQjtRQUMxRCxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUV4QixJQUFJLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRTtZQUNwQyxVQUFVLEVBQUUsTUFBTTtZQUNsQixPQUFPLEVBQUUsVUFBVSxDQUFDLE9BQU8sQ0FBQywrQkFBK0I7WUFDM0QsSUFBSSxFQUFFLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO2dCQUMzQixPQUFPLEVBQUUsZUFBZTtnQkFDeEIsSUFBSSxFQUFFLFVBQVUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDOzs7YUFHNUIsQ0FBQzthQUNQLENBQUM7WUFDRixPQUFPLEVBQUUsVUFBVSxDQUFDLE9BQU8sQ0FBQyxNQUFNO1NBQ25DLENBQUMsQ0FBQztRQUVILE1BQU0sdUJBQXVCLEdBQUcsSUFBSSxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxlQUFlLEVBQUU7WUFDM0UsT0FBTyxFQUFFLFVBQVUsQ0FBQyxPQUFPLENBQUMsK0JBQStCO1lBQzNELElBQUksRUFBRSxVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQztnQkFDM0IsT0FBTyxFQUFFLGVBQWU7Z0JBQ3hCLElBQUksRUFBRSxVQUFVLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQzs7O2FBRzVCLENBQUM7YUFDUCxDQUFDO1lBQ0YsT0FBTyxFQUFFLFVBQVUsQ0FBQyxPQUFPLENBQUMsTUFBTTtZQUNsQyxrQkFBa0IsRUFBRSxLQUFLLEVBQUUsOEVBQThFO1NBQzFHLENBQUMsQ0FBQztRQUVILGlDQUFpQztRQUNqQyxpR0FBaUc7UUFDakcsSUFBSSxvQ0FBaUIsQ0FBQyxJQUFJLEVBQUUsY0FBYyxFQUFFO1lBQzFDLFFBQVEsRUFBRTtnQkFDUixrQkFBa0IsRUFBRSxxQ0FBa0IsQ0FBQyxFQUFFLENBQUMsdUJBQXVCLENBQUMsVUFBVSxDQUFDO2dCQUM3RSxPQUFPLEVBQUUsWUFBWTtnQkFDckIsTUFBTSxFQUFFLGNBQWM7Z0JBQ3RCLFVBQVUsRUFBRTtvQkFDVixJQUFJLEVBQUUsdUJBQXVCLENBQUMsVUFBVTtpQkFDekM7YUFDRjtZQUNELE1BQU0sRUFBRSwwQ0FBdUIsQ0FBQyxZQUFZLENBQUM7Z0JBQzNDLFNBQVMsRUFBRSwwQ0FBdUIsQ0FBQyxZQUFZO2FBQ2hELENBQUM7U0FDSCxDQUFDLENBQUM7S0FDSjtDQUNGO0FBRUQsTUFBTSxHQUFHLEdBQUcsSUFBSSxpQkFBRyxFQUFFLENBQUM7QUFFdEIsSUFBSSw2QkFBUyxDQUFDLEdBQUcsRUFBRSx5Q0FBeUMsRUFBRTtJQUM1RCxTQUFTLEVBQUUsQ0FBQyxJQUFJLFNBQVMsQ0FBQyxHQUFHLEVBQUUsbUNBQW1DLENBQUMsQ0FBQztJQUNwRSxVQUFVLEVBQUUsSUFBSTtJQUNoQixtQkFBbUIsRUFBRSxLQUFLLEVBQUUsd0VBQXdFO0NBQ3JHLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFwcCwgU3RhY2ssIFN0YWNrUHJvcHMgfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgeyBJbnRlZ1Rlc3QgfSBmcm9tICdAYXdzLWNkay9pbnRlZy10ZXN0cy1hbHBoYSc7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCAqIGFzIHN5bnRoZXRpY3MgZnJvbSAnLi4vbGliJztcbmltcG9ydCB7IEF3c0N1c3RvbVJlc291cmNlLCBBd3NDdXN0b21SZXNvdXJjZVBvbGljeSwgUGh5c2ljYWxSZXNvdXJjZUlkIH0gZnJvbSAnYXdzLWNkay1saWIvY3VzdG9tLXJlc291cmNlcyc7XG5cbmNsYXNzIFRlc3RTdGFjayBleHRlbmRzIFN0YWNrIHtcbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM/OiBTdGFja1Byb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkLCBwcm9wcyk7XG5cbiAgICBuZXcgc3ludGhldGljcy5DYW5hcnkodGhpcywgJ0NhbmFyeScsIHtcbiAgICAgIGNhbmFyeU5hbWU6ICduZXh0JyxcbiAgICAgIHJ1bnRpbWU6IHN5bnRoZXRpY3MuUnVudGltZS5TWU5USEVUSUNTX05PREVKU19QVVBQRVRFRVJfNF8wLFxuICAgICAgdGVzdDogc3ludGhldGljcy5UZXN0LmN1c3RvbSh7XG4gICAgICAgIGhhbmRsZXI6ICdpbmRleC5oYW5kbGVyJyxcbiAgICAgICAgY29kZTogc3ludGhldGljcy5Db2RlLmZyb21JbmxpbmUoYFxuICAgICAgICAgIGV4cG9ydHMuaGFuZGxlciA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFxcJ2hlbGxvIHdvcmxkXFwnKTtcbiAgICAgICAgICB9O2ApLFxuICAgICAgfSksXG4gICAgICBjbGVhbnVwOiBzeW50aGV0aWNzLkNsZWFudXAuTEFNQkRBLFxuICAgIH0pO1xuXG4gICAgY29uc3QgY2FuYXJ5VGhhdFdpbGxCZVJlbW92ZWQgPSBuZXcgc3ludGhldGljcy5DYW5hcnkodGhpcywgJ0NhbmFyeVJlbW92ZWQnLCB7XG4gICAgICBydW50aW1lOiBzeW50aGV0aWNzLlJ1bnRpbWUuU1lOVEhFVElDU19OT0RFSlNfUFVQUEVURUVSXzRfMCxcbiAgICAgIHRlc3Q6IHN5bnRoZXRpY3MuVGVzdC5jdXN0b20oe1xuICAgICAgICBoYW5kbGVyOiAnaW5kZXguaGFuZGxlcicsXG4gICAgICAgIGNvZGU6IHN5bnRoZXRpY3MuQ29kZS5mcm9tSW5saW5lKGBcbiAgICAgICAgICBleHBvcnRzLmhhbmRsZXIgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcXCdoZWxsbyB3b3JsZFxcJyk7XG4gICAgICAgICAgfTtgKSxcbiAgICAgIH0pLFxuICAgICAgY2xlYW51cDogc3ludGhldGljcy5DbGVhbnVwLkxBTUJEQSxcbiAgICAgIHN0YXJ0QWZ0ZXJDcmVhdGlvbjogZmFsc2UsIC8vIG90aGVyd2lzZSB3ZSBnZXQgZXJyb3I6IGNhbmFyeSBpcyBpbiBhIHN0YXRlIHRoYXQgY2FuJ3QgYmUgZGVsZXRlZDogUlVOTklOR1xuICAgIH0pO1xuXG4gICAgLy8gUmVtb3ZlIHRoaXMgY2FuYXJ5IGltbWVkaWF0ZWx5XG4gICAgLy8gc28gd2UgY2FuIHRlc3QgdGhhdCBhIG5vbi1leGlzdGluZyBjYW5hcnkgd2lsbCBub3QgZmFpbCB0aGUgYXV0by1kZWxldGUtbGFtYmRhIEN1c3RvbSBSZXNvdXJjZVxuICAgIG5ldyBBd3NDdXN0b21SZXNvdXJjZSh0aGlzLCAnRGVsZXRlQ2FuYXJ5Jywge1xuICAgICAgb25DcmVhdGU6IHtcbiAgICAgICAgcGh5c2ljYWxSZXNvdXJjZUlkOiBQaHlzaWNhbFJlc291cmNlSWQub2YoY2FuYXJ5VGhhdFdpbGxCZVJlbW92ZWQuY2FuYXJ5TmFtZSksXG4gICAgICAgIHNlcnZpY2U6ICdTeW50aGV0aWNzJyxcbiAgICAgICAgYWN0aW9uOiAnZGVsZXRlQ2FuYXJ5JyxcbiAgICAgICAgcGFyYW1ldGVyczoge1xuICAgICAgICAgIE5hbWU6IGNhbmFyeVRoYXRXaWxsQmVSZW1vdmVkLmNhbmFyeU5hbWUsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgcG9saWN5OiBBd3NDdXN0b21SZXNvdXJjZVBvbGljeS5mcm9tU2RrQ2FsbHMoe1xuICAgICAgICByZXNvdXJjZXM6IEF3c0N1c3RvbVJlc291cmNlUG9saWN5LkFOWV9SRVNPVVJDRSxcbiAgICAgIH0pLFxuICAgIH0pO1xuICB9XG59XG5cbmNvbnN0IGFwcCA9IG5ldyBBcHAoKTtcblxubmV3IEludGVnVGVzdChhcHAsICdjZGstaW50ZWctc3ludGhldGljcy1jYW5hcnktYXV0by1kZWxldGUnLCB7XG4gIHRlc3RDYXNlczogW25ldyBUZXN0U3RhY2soYXBwLCAnY2RrLXN5bnRoZXRpY3MtY2FuYXJ5LWF1dG8tZGVsZXRlJyldLFxuICBkaWZmQXNzZXRzOiB0cnVlLFxuICBzdGFja1VwZGF0ZVdvcmtmbG93OiBmYWxzZSwgLy8gd2lsbCBlcnJvciBiZWNhdXNlIHRoaXMgc3RhY2sgaGFzIGEgY3IgdGhhdCBkZWxldGVzIGl0cyBvd24gcmVzb3VyY2VzXG59KTtcbiJdfQ== \ No newline at end of file diff --git a/packages/@aws-cdk/aws-synthetics-alpha/test/integ.canary.d.ts b/packages/@aws-cdk/aws-synthetics-alpha/test/integ.canary.d.ts new file mode 100644 index 0000000000000..cb0ff5c3b541f --- /dev/null +++ b/packages/@aws-cdk/aws-synthetics-alpha/test/integ.canary.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/packages/@aws-cdk/aws-synthetics-alpha/test/integ.canary.js b/packages/@aws-cdk/aws-synthetics-alpha/test/integ.canary.js new file mode 100644 index 0000000000000..03b72399c24da --- /dev/null +++ b/packages/@aws-cdk/aws-synthetics-alpha/test/integ.canary.js @@ -0,0 +1,112 @@ +"use strict"; +/// !cdk-integ canary-one +Object.defineProperty(exports, "__esModule", { value: true }); +const path = require("path"); +const apigateway = require("aws-cdk-lib/aws-apigateway"); +const s3 = require("aws-cdk-lib/aws-s3"); +const cdk = require("aws-cdk-lib"); +const lib_1 = require("../lib"); +const integ_tests_alpha_1 = require("@aws-cdk/integ-tests-alpha"); +const aws_cdk_lib_1 = require("aws-cdk-lib"); +const app = new cdk.App(); +const stack = new cdk.Stack(app, 'canary-one'); +const bucket = new s3.Bucket(stack, 'MyTestBucket', { + removalPolicy: aws_cdk_lib_1.RemovalPolicy.DESTROY, + autoDeleteObjects: true, +}); +const prefix = 'integ'; +const api = new apigateway.RestApi(stack, 'ApiGateway'); +api.root.addMethod('GET', new apigateway.MockIntegration({ + integrationResponses: [{ + statusCode: '200', + }], + passthroughBehavior: apigateway.PassthroughBehavior.NEVER, + requestTemplates: { + 'application/json': '{ "statusCode": 200 }', + }, +}), { + methodResponses: [{ statusCode: '200' }], +}); +const inlineAsset = new lib_1.Canary(stack, 'InlineAsset', { + test: lib_1.Test.custom({ + handler: 'index.handler', + code: lib_1.Code.fromInline(` + exports.handler = async () => { + console.log(\'hello world\'); + };`), + }), + schedule: lib_1.Schedule.rate(cdk.Duration.minutes(1)), + artifactsBucketLocation: { bucket, prefix }, + runtime: lib_1.Runtime.SYNTHETICS_NODEJS_PUPPETEER_4_0, + cleanup: lib_1.Cleanup.LAMBDA, +}); +const directoryAsset = new lib_1.Canary(stack, 'DirectoryAsset', { + test: lib_1.Test.custom({ + handler: 'canary.handler', + code: lib_1.Code.fromAsset(path.join(__dirname, 'canaries')), + }), + runtime: lib_1.Runtime.SYNTHETICS_NODEJS_PUPPETEER_4_0, + environmentVariables: { + URL: api.url, + }, + cleanup: lib_1.Cleanup.LAMBDA, +}); +const folderAsset = new lib_1.Canary(stack, 'FolderAsset', { + test: lib_1.Test.custom({ + handler: 'folder/canary.functionName', + code: lib_1.Code.fromAsset(path.join(__dirname, 'canaries')), + }), + runtime: lib_1.Runtime.SYNTHETICS_NODEJS_PUPPETEER_4_0, + environmentVariables: { + URL: api.url, + }, + cleanup: lib_1.Cleanup.LAMBDA, +}); +const zipAsset = new lib_1.Canary(stack, 'ZipAsset', { + test: lib_1.Test.custom({ + handler: 'canary.handler', + code: lib_1.Code.fromAsset(path.join(__dirname, 'canary.zip')), + }), + artifactsBucketLifecycleRules: [ + { + expiration: cdk.Duration.days(30), + }, + ], + runtime: lib_1.Runtime.SYNTHETICS_NODEJS_PUPPETEER_4_0, + cleanup: lib_1.Cleanup.LAMBDA, +}); +const kebabToPascal = (text) => text.replace(/(^\w|-\w)/g, (v) => v.replace(/-/, '').toUpperCase()); +const createCanaryByRuntimes = (runtime) => new lib_1.Canary(stack, kebabToPascal(runtime.name).replace('.', ''), { + test: lib_1.Test.custom({ + handler: 'canary.handler', + code: lib_1.Code.fromAsset(path.join(__dirname, 'canaries')), + }), + environmentVariables: { + URL: api.url, + }, + runtime, + cleanup: lib_1.Cleanup.LAMBDA, +}); +const puppeteer39 = createCanaryByRuntimes(lib_1.Runtime.SYNTHETICS_NODEJS_PUPPETEER_3_9); +const puppeteer40 = createCanaryByRuntimes(lib_1.Runtime.SYNTHETICS_NODEJS_PUPPETEER_4_0); +const selenium13 = createCanaryByRuntimes(lib_1.Runtime.SYNTHETICS_PYTHON_SELENIUM_1_3); +const test = new integ_tests_alpha_1.IntegTest(app, 'IntegCanaryTest', { + testCases: [stack], +}); +// Assertion that all Canary's are Passed +[ + inlineAsset, + directoryAsset, + folderAsset, + zipAsset, + puppeteer39, + puppeteer40, + selenium13, +].forEach((canary) => test.assertions + .awsApiCall('Synthetics', 'getCanaryRuns', { + Name: canary.canaryName, +}) + .assertAtPath('CanaryRuns.0.Status.State', integ_tests_alpha_1.ExpectedResult.stringLikeRegexp('PASSED')) + .waitForAssertions({ totalTimeout: cdk.Duration.minutes(5) })); +app.synth(); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZWcuY2FuYXJ5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiaW50ZWcuY2FuYXJ5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSx5QkFBeUI7O0FBRXpCLDZCQUE2QjtBQUM3Qix5REFBeUQ7QUFDekQseUNBQXlDO0FBQ3pDLG1DQUFtQztBQUNuQyxnQ0FBd0U7QUFDeEUsa0VBQXVFO0FBQ3ZFLDZDQUE0QztBQUU1QyxNQUFNLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUMxQixNQUFNLEtBQUssR0FBRyxJQUFJLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLFlBQVksQ0FBQyxDQUFDO0FBRS9DLE1BQU0sTUFBTSxHQUFHLElBQUksRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsY0FBYyxFQUFFO0lBQ2xELGFBQWEsRUFBRSwyQkFBYSxDQUFDLE9BQU87SUFDcEMsaUJBQWlCLEVBQUUsSUFBSTtDQUN4QixDQUFDLENBQUM7QUFDSCxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUM7QUFFdkIsTUFBTSxHQUFHLEdBQUcsSUFBSSxVQUFVLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxZQUFZLENBQUMsQ0FBQztBQUN4RCxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxVQUFVLENBQUMsZUFBZSxDQUFDO0lBQ3ZELG9CQUFvQixFQUFFLENBQUM7WUFDckIsVUFBVSxFQUFFLEtBQUs7U0FDbEIsQ0FBQztJQUNGLG1CQUFtQixFQUFFLFVBQVUsQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLO0lBQ3pELGdCQUFnQixFQUFFO1FBQ2hCLGtCQUFrQixFQUFFLHVCQUF1QjtLQUM1QztDQUNGLENBQUMsRUFBRTtJQUNGLGVBQWUsRUFBRSxDQUFDLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxDQUFDO0NBQ3pDLENBQUMsQ0FBQztBQUVILE1BQU0sV0FBVyxHQUFHLElBQUksWUFB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ZWcgY2FuYXJ5LW9uZVxuXG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0ICogYXMgYXBpZ2F0ZXdheSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtYXBpZ2F0ZXdheSc7XG5pbXBvcnQgKiBhcyBzMyBmcm9tICdhd3MtY2RrLWxpYi9hd3MtczMnO1xuaW1wb3J0ICogYXMgY2RrIGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB7IENhbmFyeSwgQ2xlYW51cCwgQ29kZSwgUnVudGltZSwgU2NoZWR1bGUsIFRlc3QgfSBmcm9tICcuLi9saWInO1xuaW1wb3J0IHsgRXhwZWN0ZWRSZXN1bHQsIEludGVnVGVzdCB9IGZyb20gJ0Bhd3MtY2RrL2ludGVnLXRlc3RzLWFscGhhJztcbmltcG9ydCB7IFJlbW92YWxQb2xpY3kgfSBmcm9tICdhd3MtY2RrLWxpYic7XG5cbmNvbnN0IGFwcCA9IG5ldyBjZGsuQXBwKCk7XG5jb25zdCBzdGFjayA9IG5ldyBjZGsuU3RhY2soYXBwLCAnY2FuYXJ5LW9uZScpO1xuXG5jb25zdCBidWNrZXQgPSBuZXcgczMuQnVja2V0KHN0YWNrLCAnTXlUZXN0QnVja2V0Jywge1xuICByZW1vdmFsUG9saWN5OiBSZW1vdmFsUG9saWN5LkRFU1RST1ksXG4gIGF1dG9EZWxldGVPYmplY3RzOiB0cnVlLFxufSk7XG5jb25zdCBwcmVmaXggPSAnaW50ZWcnO1xuXG5jb25zdCBhcGkgPSBuZXcgYXBpZ2F0ZXdheS5SZXN0QXBpKHN0YWNrLCAnQXBpR2F0ZXdheScpO1xuYXBpLnJvb3QuYWRkTWV0aG9kKCdHRVQnLCBuZXcgYXBpZ2F0ZXdheS5Nb2NrSW50ZWdyYXRpb24oe1xuICBpbnRlZ3JhdGlvblJlc3BvbnNlczogW3tcbiAgICBzdGF0dXNDb2RlOiAnMjAwJyxcbiAgfV0sXG4gIHBhc3N0aHJvdWdoQmVoYXZpb3I6IGFwaWdhdGV3YXkuUGFzc3Rocm91Z2hCZWhhdmlvci5ORVZFUixcbiAgcmVxdWVzdFRlbXBsYXRlczoge1xuICAgICdhcHBsaWNhdGlvbi9qc29uJzogJ3sgXCJzdGF0dXNDb2RlXCI6IDIwMCB9JyxcbiAgfSxcbn0pLCB7XG4gIG1ldGhvZFJlc3BvbnNlczogW3sgc3RhdHVzQ29kZTogJzIwMCcgfV0sXG59KTtcblxuY29uc3QgaW5saW5lQXNzZXQgPSBuZXcgQ2FuYXJ5KHN0YWNrLCAnSW5saW5lQXNzZXQnLCB7XG4gIHRlc3Q6IFRlc3QuY3VzdG9tKHtcbiAgICBoYW5kbGVyOiAnaW5kZXguaGFuZGxlcicsXG4gICAgY29kZTogQ29kZS5mcm9tSW5saW5lKGBcbiAgICAgIGV4cG9ydHMuaGFuZGxlciA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coXFwnaGVsbG8gd29ybGRcXCcpO1xuICAgICAgfTtgKSxcbiAgfSksXG4gIHNjaGVkdWxlOiBTY2hlZHVsZS5yYXRlKGNkay5EdXJhdGlvbi5taW51dGVzKDEpKSxcbiAgYXJ0aWZhY3RzQnVja2V0TG9jYXRpb246IHsgYnVja2V0LCBwcmVmaXggfSxcbiAgcnVudGltZTogUnVudGltZS5TWU5USEVUSUNTX05PREVKU19QVVBQRVRFRVJfNF8wLFxuICBjbGVhbnVwOiBDbGVhbnVwLkxBTUJEQSxcbn0pO1xuXG5jb25zdCBkaXJlY3RvcnlBc3NldCA9IG5ldyBDYW5hcnkoc3RhY2ssICdEaXJlY3RvcnlBc3NldCcsIHtcbiAgdGVzdDogVGVzdC5jdXN0b20oe1xuICAgIGhhbmRsZXI6ICdjYW5hcnkuaGFuZGxlcicsXG4gICAgY29kZTogQ29kZS5mcm9tQXNzZXQocGF0aC5qb2luKF9fZGlybmFtZSwgJ2NhbmFyaWVzJykpLFxuICB9KSxcbiAgcnVudGltZTogUnVudGltZS5TWU5USEVUSUNTX05PREVKU19QVVBQRVRFRVJfNF8wLFxuICBlbnZpcm9ubWVudFZhcmlhYmxlczoge1xuICAgIFVSTDogYXBpLnVybCxcbiAgfSxcbiAgY2xlYW51cDogQ2xlYW51cC5MQU1CREEsXG59KTtcblxuY29uc3QgZm9sZGVyQXNzZXQgPSBuZXcgQ2FuYXJ5KHN0YWNrLCAnRm9sZGVyQXNzZXQnLCB7XG4gIHRlc3Q6IFRlc3QuY3VzdG9tKHtcbiAgICBoYW5kbGVyOiAnZm9sZGVyL2NhbmFyeS5mdW5jdGlvbk5hbWUnLFxuICAgIGNvZGU6IENvZGUuZnJvbUFzc2V0KHBhdGguam9pbihfX2Rpcm5hbWUsICdjYW5hcmllcycpKSxcbiAgfSksXG4gIHJ1bnRpbWU6IFJ1bnRpbWUuU1lOVEhFVElDU19OT0RFSlNfUFVQUEVURUVSXzRfMCxcbiAgZW52aXJvbm1lbnRWYXJpYWJsZXM6IHtcbiAgICBVUkw6IGFwaS51cmwsXG4gIH0sXG4gIGNsZWFudXA6IENsZWFudXAuTEFNQkRBLFxufSk7XG5cbmNvbnN0IHppcEFzc2V0ID0gbmV3IENhbmFyeShzdGFjaywgJ1ppcEFzc2V0Jywge1xuICB0ZXN0OiBUZXN0LmN1c3RvbSh7XG4gICAgaGFuZGxlcjogJ2NhbmFyeS5oYW5kbGVyJyxcbiAgICBjb2RlOiBDb2RlLmZyb21Bc3NldChwYXRoLmpvaW4oX19kaXJuYW1lLCAnY2FuYXJ5LnppcCcpKSxcbiAgfSksXG4gIGFydGlmYWN0c0J1Y2tldExpZmVjeWNsZVJ1bGVzOiBbXG4gICAge1xuICAgICAgZXhwaXJhdGlvbjogY2RrLkR1cmF0aW9uLmRheXMoMzApLFxuICAgIH0sXG4gIF0sXG4gIHJ1bnRpbWU6IFJ1bnRpbWUuU1lOVEhFVElDU19OT0RFSlNfUFVQUEVURUVSXzRfMCxcbiAgY2xlYW51cDogQ2xlYW51cC5MQU1CREEsXG59KTtcblxuY29uc3Qga2ViYWJUb1Bhc2NhbCA9ICh0ZXh0IDpzdHJpbmcgKT0+IHRleHQucmVwbGFjZSgvKF5cXHd8LVxcdykvZywgKHYpID0+IHYucmVwbGFjZSgvLS8sICcnKS50b1VwcGVyQ2FzZSgpKTtcbmNvbnN0IGNyZWF0ZUNhbmFyeUJ5UnVudGltZXMgPSAocnVudGltZTogUnVudGltZSkgPT5cbiAgbmV3IENhbmFyeShzdGFjaywga2ViYWJUb1Bhc2NhbChydW50aW1lLm5hbWUpLnJlcGxhY2UoJy4nLCAnJyksIHtcbiAgICB0ZXN0OiBUZXN0LmN1c3RvbSh7XG4gICAgICBoYW5kbGVyOiAnY2FuYXJ5LmhhbmRsZXInLFxuICAgICAgY29kZTogQ29kZS5mcm9tQXNzZXQocGF0aC5qb2luKF9fZGlybmFtZSwgJ2NhbmFyaWVzJykpLFxuICAgIH0pLFxuICAgIGVudmlyb25tZW50VmFyaWFibGVzOiB7XG4gICAgICBVUkw6IGFwaS51cmwsXG4gICAgfSxcbiAgICBydW50aW1lLFxuICAgIGNsZWFudXA6IENsZWFudXAuTEFNQkRBLFxuICB9KTtcblxuY29uc3QgcHVwcGV0ZWVyMzkgPSBjcmVhdGVDYW5hcnlCeVJ1bnRpbWVzKFJ1bnRpbWUuU1lOVEhFVElDU19OT0RFSlNfUFVQUEVURUVSXzNfOSk7XG5jb25zdCBwdXBwZXRlZXI0MCA9IGNyZWF0ZUNhbmFyeUJ5UnVudGltZXMoUnVudGltZS5TWU5USEVUSUNTX05PREVKU19QVVBQRVRFRVJfNF8wKTtcbmNvbnN0IHNlbGVuaXVtMTMgPSBjcmVhdGVDYW5hcnlCeVJ1bnRpbWVzKFJ1bnRpbWUuU1lOVEhFVElDU19QWVRIT05fU0VMRU5JVU1fMV8zKTtcblxuY29uc3QgdGVzdCA9IG5ldyBJbnRlZ1Rlc3QoYXBwLCAnSW50ZWdDYW5hcnlUZXN0Jywge1xuICB0ZXN0Q2FzZXM6IFtzdGFja10sXG59KTtcblxuLy8gQXNzZXJ0aW9uIHRoYXQgYWxsIENhbmFyeSdzIGFyZSBQYXNzZWRcbltcbiAgaW5saW5lQXNzZXQsXG4gIGRpcmVjdG9yeUFzc2V0LFxuICBmb2xkZXJBc3NldCxcbiAgemlwQXNzZXQsXG4gIHB1cHBldGVlcjM5LFxuICBwdXBwZXRlZXI0MCxcbiAgc2VsZW5pdW0xMyxcbl0uZm9yRWFjaCgoY2FuYXJ5KSA9PiB0ZXN0LmFzc2VydGlvbnNcbiAgLmF3c0FwaUNhbGwoJ1N5bnRoZXRpY3MnLCAnZ2V0Q2FuYXJ5UnVucycsIHtcbiAgICBOYW1lOiBjYW5hcnkuY2FuYXJ5TmFtZSxcbiAgfSlcbiAgLmFzc2VydEF0UGF0aCgnQ2FuYXJ5UnVucy4wLlN0YXR1cy5TdGF0ZScsIEV4cGVjdGVkUmVzdWx0LnN0cmluZ0xpa2VSZWdleHAoJ1BBU1NFRCcpKVxuICAud2FpdEZvckFzc2VydGlvbnMoeyB0b3RhbFRpbWVvdXQ6IGNkay5EdXJhdGlvbi5taW51dGVzKDUpIH0pKTtcblxuYXBwLnN5bnRoKCk7XG4iXX0= \ No newline at end of file diff --git a/packages/@aws-cdk/aws-synthetics-alpha/test/integ.vpc.d.ts b/packages/@aws-cdk/aws-synthetics-alpha/test/integ.vpc.d.ts new file mode 100644 index 0000000000000..cb0ff5c3b541f --- /dev/null +++ b/packages/@aws-cdk/aws-synthetics-alpha/test/integ.vpc.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/packages/@aws-cdk/aws-synthetics-alpha/test/integ.vpc.js b/packages/@aws-cdk/aws-synthetics-alpha/test/integ.vpc.js new file mode 100644 index 0000000000000..372c4244cb6f0 --- /dev/null +++ b/packages/@aws-cdk/aws-synthetics-alpha/test/integ.vpc.js @@ -0,0 +1,27 @@ +"use strict"; +/// !cdk-integ canary-vpc +Object.defineProperty(exports, "__esModule", { value: true }); +const path = require("path"); +const ec2 = require("aws-cdk-lib/aws-ec2"); +const cdk = require("aws-cdk-lib"); +const synthetics = require("../lib"); +/* + * Stack verification steps: + * + * -- aws synthetics get-canary --name canary-vpc has state of 'RUNNING' + * -- aws synthetics get-canary --name canary-vpc has VpcId + */ +const app = new cdk.App(); +const stack = new cdk.Stack(app, 'canary-vpc'); +const vpc = new ec2.Vpc(stack, 'MyVpc', { maxAzs: 2, restrictDefaultSecurityGroup: false }); +new synthetics.Canary(stack, 'MyVpcCanary', { + canaryName: 'canary-vpc', + test: synthetics.Test.custom({ + handler: 'canary.handler', + code: synthetics.Code.fromAsset(path.join(__dirname, 'canary.zip')), + }), + runtime: synthetics.Runtime.SYNTHETICS_NODEJS_PUPPETEER_3_8, + vpc, +}); +app.synth(); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZWcudnBjLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiaW50ZWcudnBjLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSx5QkFBeUI7O0FBRXpCLDZCQUE2QjtBQUM3QiwyQ0FBMkM7QUFDM0MsbUNBQW1DO0FBQ25DLHFDQUFxQztBQUVyQzs7Ozs7R0FLRztBQUNILE1BQU0sR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQzFCLE1BQU0sS0FBSyxHQUFHLElBQUksR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsWUFBWSxDQUFDLENBQUM7QUFFL0MsTUFBTSxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLDRCQUE0QixFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7QUFFNUYsSUFBSSxVQUFVLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxhQUFhLEVBQUU7SUFDMUMsVUFBVSxFQUFFLFlBQVk7SUFDeEIsSUFBSSxFQUFFLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQzNCLE9BQU8sRUFBRSxnQkFBZ0I7UUFDekIsSUFBSSxFQUFFLFVBQVUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLFlBQVksQ0FBQyxDQUFDO0tBQ3BFLENBQUM7SUFDRixPQUFPLEVBQUUsVUFBVSxDQUFDLE9BQU8sQ0FBQywrQkFBK0I7SUFDM0QsR0FBRztDQUNKLENBQUMsQ0FBQztBQUVILEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vLyAhY2RrLWludGVnIGNhbmFyeS12cGNcblxuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCAqIGFzIGVjMiBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZWMyJztcbmltcG9ydCAqIGFzIGNkayBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgKiBhcyBzeW50aGV0aWNzIGZyb20gJy4uL2xpYic7XG5cbi8qXG4gKiBTdGFjayB2ZXJpZmljYXRpb24gc3RlcHM6XG4gKlxuICogLS0gYXdzIHN5bnRoZXRpY3MgZ2V0LWNhbmFyeSAtLW5hbWUgY2FuYXJ5LXZwYyBoYXMgc3RhdGUgb2YgJ1JVTk5JTkcnXG4gKiAtLSBhd3Mgc3ludGhldGljcyBnZXQtY2FuYXJ5IC0tbmFtZSBjYW5hcnktdnBjIGhhcyBWcGNJZFxuICovXG5jb25zdCBhcHAgPSBuZXcgY2RrLkFwcCgpO1xuY29uc3Qgc3RhY2sgPSBuZXcgY2RrLlN0YWNrKGFwcCwgJ2NhbmFyeS12cGMnKTtcblxuY29uc3QgdnBjID0gbmV3IGVjMi5WcGMoc3RhY2ssICdNeVZwYycsIHsgbWF4QXpzOiAyLCByZXN0cmljdERlZmF1bHRTZWN1cml0eUdyb3VwOiBmYWxzZSB9KTtcblxubmV3IHN5bnRoZXRpY3MuQ2FuYXJ5KHN0YWNrLCAnTXlWcGNDYW5hcnknLCB7XG4gIGNhbmFyeU5hbWU6ICdjYW5hcnktdnBjJyxcbiAgdGVzdDogc3ludGhldGljcy5UZXN0LmN1c3RvbSh7XG4gICAgaGFuZGxlcjogJ2NhbmFyeS5oYW5kbGVyJyxcbiAgICBjb2RlOiBzeW50aGV0aWNzLkNvZGUuZnJvbUFzc2V0KHBhdGguam9pbihfX2Rpcm5hbWUsICdjYW5hcnkuemlwJykpLFxuICB9KSxcbiAgcnVudGltZTogc3ludGhldGljcy5SdW50aW1lLlNZTlRIRVRJQ1NfTk9ERUpTX1BVUFBFVEVFUl8zXzgsXG4gIHZwYyxcbn0pO1xuXG5hcHAuc3ludGgoKTtcbiJdfQ== \ No newline at end of file diff --git a/packages/@aws-cdk/aws-synthetics-alpha/test/metric.test.d.ts b/packages/@aws-cdk/aws-synthetics-alpha/test/metric.test.d.ts new file mode 100644 index 0000000000000..cb0ff5c3b541f --- /dev/null +++ b/packages/@aws-cdk/aws-synthetics-alpha/test/metric.test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/packages/@aws-cdk/aws-synthetics-alpha/test/metric.test.js b/packages/@aws-cdk/aws-synthetics-alpha/test/metric.test.js new file mode 100644 index 0000000000000..146cbbb09c3e0 --- /dev/null +++ b/packages/@aws-cdk/aws-synthetics-alpha/test/metric.test.js @@ -0,0 +1,59 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const aws_cdk_lib_1 = require("aws-cdk-lib"); +const synthetics = require("../lib"); +test('.metricXxx() methods can be used to obtain Metrics for the canary', () => { + // GIVEN + const stack = new aws_cdk_lib_1.Stack(new aws_cdk_lib_1.App(), 'canaries'); + const canary = new synthetics.Canary(stack, 'mycanary', { + test: synthetics.Test.custom({ + handler: 'index.handler', + code: synthetics.Code.fromInline('foo'), + }), + runtime: synthetics.Runtime.SYNTHETICS_NODEJS_PUPPETEER_3_8, + }); + // WHEN + const metricSuccess = canary.metricSuccessPercent(); + const metricFailed = canary.metricFailed(); + const metricDuration = canary.metricDuration(); + // THEN + expect(metricSuccess).toEqual(expect.objectContaining({ + dimensions: { CanaryName: canary.canaryName }, + namespace: 'CloudWatchSynthetics', + metricName: 'SuccessPercent', + statistic: 'Average', + })); + expect(metricFailed).toEqual(expect.objectContaining({ + dimensions: { CanaryName: canary.canaryName }, + namespace: 'CloudWatchSynthetics', + metricName: 'Failed', + statistic: 'Sum', + })); + expect(metricDuration).toEqual(expect.objectContaining({ + dimensions: { CanaryName: canary.canaryName }, + namespace: 'CloudWatchSynthetics', + metricName: 'Duration', + statistic: 'Average', + })); +}); +test('Metric can specify statistic', () => { + // GIVEN + const stack = new aws_cdk_lib_1.Stack(new aws_cdk_lib_1.App(), 'canaries'); + const canary = new synthetics.Canary(stack, 'mycanary', { + test: synthetics.Test.custom({ + handler: 'index.handler', + code: synthetics.Code.fromInline('foo'), + }), + runtime: synthetics.Runtime.SYNTHETICS_NODEJS_PUPPETEER_3_8, + }); + // WHEN + const metric = canary.metricFailed({ statistic: 'Sum' }); + // THEN + expect(metric).toEqual(expect.objectContaining({ + dimensions: { CanaryName: canary.canaryName }, + namespace: 'CloudWatchSynthetics', + metricName: 'Failed', + statistic: 'Sum', + })); +}); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWV0cmljLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJtZXRyaWMudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLDZDQUF5QztBQUN6QyxxQ0FBcUM7QUFFckMsSUFBSSxDQUFDLG1FQUFtRSxFQUFFLEdBQUcsRUFBRTtJQUM3RSxRQUFRO0lBQ1IsTUFBTSxLQUFLLEdBQUcsSUFBSSxtQkFBSyxDQUFDLElBQUksaUJBQUcsRUFBRSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBRS9DLE1BQU0sTUFBTSxHQUFHLElBQUksVUFBVSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsVUFBVSxFQUFFO1FBQ3RELElBQUksRUFBRSxVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQztZQUMzQixPQUFPLEVBQUUsZUFBZTtZQUN4QixJQUFJLEVBQUUsVUFBVSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDO1NBQ3hDLENBQUM7UUFDRixPQUFPLEVBQUUsVUFBVSxDQUFDLE9BQU8sQ0FBQywrQkFBK0I7S0FDNUQsQ0FBQyxDQUFDO0lBRUgsT0FBTztJQUNQLE1BQU0sYUFBYSxHQUFHLE1BQU0sQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO0lBQ3BELE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUMzQyxNQUFNLGNBQWMsR0FBRyxNQUFNLENBQUMsY0FBYyxFQUFFLENBQUM7SUFFL0MsT0FBTztJQUNQLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDO1FBQ3BELFVBQVUsRUFBRSxFQUFFLFVBQVUsRUFBRSxNQUFNLENBQUMsVUFBVSxFQUFFO1FBQzdDLFNBQVMsRUFBRSxzQkFBc0I7UUFDakMsVUFBVSxFQUFFLGdCQUFnQjtRQUM1QixTQUFTLEVBQUUsU0FBUztLQUNyQixDQUFDLENBQUMsQ0FBQztJQUVKLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDO1FBQ25ELFVBQVUsRUFBRSxFQUFFLFVBQVUsRUFBRSxNQUFNLENBQUMsVUFBVSxFQUFFO1FBQzdDLFNBQVMsRUFBRSxzQkFBc0I7UUFDakMsVUFBVSxFQUFFLFFBQVE7UUFDcEIsU0FBUyxFQUFFLEtBQUs7S0FDakIsQ0FBQyxDQUFDLENBQUM7SUFFSixNQUFNLENBQUMsY0FBYyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQztRQUNyRCxVQUFVLEVBQUUsRUFBRSxVQUFVLEVBQUUsTUFBTSxDQUFDLFVBQVUsRUFBRTtRQUM3QyxTQUFTLEVBQUUsc0JBQXNCO1FBQ2pDLFVBQVUsRUFBRSxVQUFVO1FBQ3RCLFNBQVMsRUFBRSxTQUFTO0tBQ3JCLENBQUMsQ0FBQyxDQUFDO0FBQ04sQ0FBQyxDQUFDLENBQUM7QUFFSCxJQUFJLENBQUMsOEJBQThCLEVBQUUsR0FBRyxFQUFFO0lBQ3hDLFFBQVE7SUFDUixNQUFNLEtBQUssR0FBRyxJQUFJLG1CQUFLLENBQUMsSUFBSSxpQkFBRyxFQUFFLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFFL0MsTUFBTSxNQUFNLEdBQUcsSUFBSSxVQUFVLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxVQUFVLEVBQUU7UUFDdEQsSUFBSSxFQUFFLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO1lBQzNCLE9BQU8sRUFBRSxlQUFlO1lBQ3hCLElBQUksRUFBRSxVQUFVLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUM7U0FDeEMsQ0FBQztRQUNGLE9BQU8sRUFBRSxVQUFVLENBQUMsT0FBTyxDQUFDLCtCQUErQjtLQUM1RCxDQUFDLENBQUM7SUFFSCxPQUFPO0lBQ1AsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBRXpELE9BQU87SUFDUCxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQztRQUM3QyxVQUFVLEVBQUUsRUFBRSxVQUFVLEVBQUUsTUFBTSxDQUFDLFVBQVUsRUFBRTtRQUM3QyxTQUFTLEVBQUUsc0JBQXNCO1FBQ2pDLFVBQVUsRUFBRSxRQUFRO1FBQ3BCLFNBQVMsRUFBRSxLQUFLO0tBQ2pCLENBQUMsQ0FBQyxDQUFDO0FBQ04sQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBcHAsIFN0YWNrIH0gZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0ICogYXMgc3ludGhldGljcyBmcm9tICcuLi9saWInO1xuXG50ZXN0KCcubWV0cmljWHh4KCkgbWV0aG9kcyBjYW4gYmUgdXNlZCB0byBvYnRhaW4gTWV0cmljcyBmb3IgdGhlIGNhbmFyeScsICgpID0+IHtcbiAgLy8gR0lWRU5cbiAgY29uc3Qgc3RhY2sgPSBuZXcgU3RhY2sobmV3IEFwcCgpLCAnY2FuYXJpZXMnKTtcblxuICBjb25zdCBjYW5hcnkgPSBuZXcgc3ludGhldGljcy5DYW5hcnkoc3RhY2ssICdteWNhbmFyeScsIHtcbiAgICB0ZXN0OiBzeW50aGV0aWNzLlRlc3QuY3VzdG9tKHtcbiAgICAgIGhhbmRsZXI6ICdpbmRleC5oYW5kbGVyJyxcbiAgICAgIGNvZGU6IHN5bnRoZXRpY3MuQ29kZS5mcm9tSW5saW5lKCdmb28nKSxcbiAgICB9KSxcbiAgICBydW50aW1lOiBzeW50aGV0aWNzLlJ1bnRpbWUuU1lOVEhFVElDU19OT0RFSlNfUFVQUEVURUVSXzNfOCxcbiAgfSk7XG5cbiAgLy8gV0hFTlxuICBjb25zdCBtZXRyaWNTdWNjZXNzID0gY2FuYXJ5Lm1ldHJpY1N1Y2Nlc3NQZXJjZW50KCk7XG4gIGNvbnN0IG1ldHJpY0ZhaWxlZCA9IGNhbmFyeS5tZXRyaWNGYWlsZWQoKTtcbiAgY29uc3QgbWV0cmljRHVyYXRpb24gPSBjYW5hcnkubWV0cmljRHVyYXRpb24oKTtcblxuICAvLyBUSEVOXG4gIGV4cGVjdChtZXRyaWNTdWNjZXNzKS50b0VxdWFsKGV4cGVjdC5vYmplY3RDb250YWluaW5nKHtcbiAgICBkaW1lbnNpb25zOiB7IENhbmFyeU5hbWU6IGNhbmFyeS5jYW5hcnlOYW1lIH0sXG4gICAgbmFtZXNwYWNlOiAnQ2xvdWRXYXRjaFN5bnRoZXRpY3MnLFxuICAgIG1ldHJpY05hbWU6ICdTdWNjZXNzUGVyY2VudCcsXG4gICAgc3RhdGlzdGljOiAnQXZlcmFnZScsXG4gIH0pKTtcblxuICBleHBlY3QobWV0cmljRmFpbGVkKS50b0VxdWFsKGV4cGVjdC5vYmplY3RDb250YWluaW5nKHtcbiAgICBkaW1lbnNpb25zOiB7IENhbmFyeU5hbWU6IGNhbmFyeS5jYW5hcnlOYW1lIH0sXG4gICAgbmFtZXNwYWNlOiAnQ2xvdWRXYXRjaFN5bnRoZXRpY3MnLFxuICAgIG1ldHJpY05hbWU6ICdGYWlsZWQnLFxuICAgIHN0YXRpc3RpYzogJ1N1bScsXG4gIH0pKTtcblxuICBleHBlY3QobWV0cmljRHVyYXRpb24pLnRvRXF1YWwoZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoe1xuICAgIGRpbWVuc2lvbnM6IHsgQ2FuYXJ5TmFtZTogY2FuYXJ5LmNhbmFyeU5hbWUgfSxcbiAgICBuYW1lc3BhY2U6ICdDbG91ZFdhdGNoU3ludGhldGljcycsXG4gICAgbWV0cmljTmFtZTogJ0R1cmF0aW9uJyxcbiAgICBzdGF0aXN0aWM6ICdBdmVyYWdlJyxcbiAgfSkpO1xufSk7XG5cbnRlc3QoJ01ldHJpYyBjYW4gc3BlY2lmeSBzdGF0aXN0aWMnLCAoKSA9PiB7XG4gIC8vIEdJVkVOXG4gIGNvbnN0IHN0YWNrID0gbmV3IFN0YWNrKG5ldyBBcHAoKSwgJ2NhbmFyaWVzJyk7XG5cbiAgY29uc3QgY2FuYXJ5ID0gbmV3IHN5bnRoZXRpY3MuQ2FuYXJ5KHN0YWNrLCAnbXljYW5hcnknLCB7XG4gICAgdGVzdDogc3ludGhldGljcy5UZXN0LmN1c3RvbSh7XG4gICAgICBoYW5kbGVyOiAnaW5kZXguaGFuZGxlcicsXG4gICAgICBjb2RlOiBzeW50aGV0aWNzLkNvZGUuZnJvbUlubGluZSgnZm9vJyksXG4gICAgfSksXG4gICAgcnVudGltZTogc3ludGhldGljcy5SdW50aW1lLlNZTlRIRVRJQ1NfTk9ERUpTX1BVUFBFVEVFUl8zXzgsXG4gIH0pO1xuXG4gIC8vIFdIRU5cbiAgY29uc3QgbWV0cmljID0gY2FuYXJ5Lm1ldHJpY0ZhaWxlZCh7IHN0YXRpc3RpYzogJ1N1bScgfSk7XG5cbiAgLy8gVEhFTlxuICBleHBlY3QobWV0cmljKS50b0VxdWFsKGV4cGVjdC5vYmplY3RDb250YWluaW5nKHtcbiAgICBkaW1lbnNpb25zOiB7IENhbmFyeU5hbWU6IGNhbmFyeS5jYW5hcnlOYW1lIH0sXG4gICAgbmFtZXNwYWNlOiAnQ2xvdWRXYXRjaFN5bnRoZXRpY3MnLFxuICAgIG1ldHJpY05hbWU6ICdGYWlsZWQnLFxuICAgIHN0YXRpc3RpYzogJ1N1bScsXG4gIH0pKTtcbn0pO1xuIl19 \ No newline at end of file diff --git a/packages/@aws-cdk/aws-synthetics-alpha/test/schedule.test.d.ts b/packages/@aws-cdk/aws-synthetics-alpha/test/schedule.test.d.ts new file mode 100644 index 0000000000000..cb0ff5c3b541f --- /dev/null +++ b/packages/@aws-cdk/aws-synthetics-alpha/test/schedule.test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/packages/@aws-cdk/aws-synthetics-alpha/test/schedule.test.js b/packages/@aws-cdk/aws-synthetics-alpha/test/schedule.test.js new file mode 100644 index 0000000000000..b79819aaa947f --- /dev/null +++ b/packages/@aws-cdk/aws-synthetics-alpha/test/schedule.test.js @@ -0,0 +1,25 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const synthetics = require("../lib"); +describe('cron', () => { + test('day and weekDay are mutex: given week day', () => { + expect(synthetics.Schedule.cron({ + weekDay: 'MON-FRI', + }).expressionString).toEqual('cron(* * ? * MON-FRI *)'); + }); + test('day and weekDay are mutex: given month day', () => { + expect(synthetics.Schedule.cron({ + day: '1', + }).expressionString).toEqual('cron(* * 1 * ? *)'); + }); + test('day and weekDay are mutex: given neither', () => { + expect(synthetics.Schedule.cron({}).expressionString).toEqual('cron(* * * * ? *)'); + }); + test('day and weekDay are mutex: throw if given both', () => { + expect(() => synthetics.Schedule.cron({ + day: '1', + weekDay: 'MON', + })).toThrow('Cannot supply both \'day\' and \'weekDay\', use at most one'); + }); +}); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZWR1bGUudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInNjaGVkdWxlLnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxxQ0FBcUM7QUFFckMsUUFBUSxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUU7SUFDcEIsSUFBSSxDQUFDLDJDQUEyQyxFQUFFLEdBQUcsRUFBRTtRQUNyRCxNQUFNLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUM7WUFDOUIsT0FBTyxFQUFFLFNBQVM7U0FDbkIsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsT0FBTyxDQUFDLHlCQUF5QixDQUFDLENBQUM7SUFDMUQsQ0FBQyxDQUFDLENBQUM7SUFFSCxJQUFJLENBQUMsNENBQTRDLEVBQUUsR0FBRyxFQUFFO1FBQ3RELE1BQU0sQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQztZQUM5QixHQUFHLEVBQUUsR0FBRztTQUNULENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0lBQ3BELENBQUMsQ0FBQyxDQUFDO0lBRUgsSUFBSSxDQUFDLDBDQUEwQyxFQUFFLEdBQUcsRUFBRTtRQUNwRCxNQUFNLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxPQUFPLENBQUMsbUJBQW1CLENBQUMsQ0FBQztJQUNyRixDQUFDLENBQUMsQ0FBQztJQUVILElBQUksQ0FBQyxnREFBZ0QsRUFBRSxHQUFHLEVBQUU7UUFDMUQsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDO1lBQ3BDLEdBQUcsRUFBRSxHQUFHO1lBQ1IsT0FBTyxFQUFFLEtBQUs7U0FDZixDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsNkRBQTZELENBQUMsQ0FBQztJQUM3RSxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgc3ludGhldGljcyBmcm9tICcuLi9saWInO1xuXG5kZXNjcmliZSgnY3JvbicsICgpID0+IHtcbiAgdGVzdCgnZGF5IGFuZCB3ZWVrRGF5IGFyZSBtdXRleDogZ2l2ZW4gd2VlayBkYXknLCAoKSA9PiB7XG4gICAgZXhwZWN0KHN5bnRoZXRpY3MuU2NoZWR1bGUuY3Jvbih7XG4gICAgICB3ZWVrRGF5OiAnTU9OLUZSSScsXG4gICAgfSkuZXhwcmVzc2lvblN0cmluZykudG9FcXVhbCgnY3JvbigqICogPyAqIE1PTi1GUkkgKiknKTtcbiAgfSk7XG5cbiAgdGVzdCgnZGF5IGFuZCB3ZWVrRGF5IGFyZSBtdXRleDogZ2l2ZW4gbW9udGggZGF5JywgKCkgPT4ge1xuICAgIGV4cGVjdChzeW50aGV0aWNzLlNjaGVkdWxlLmNyb24oe1xuICAgICAgZGF5OiAnMScsXG4gICAgfSkuZXhwcmVzc2lvblN0cmluZykudG9FcXVhbCgnY3JvbigqICogMSAqID8gKiknKTtcbiAgfSk7XG5cbiAgdGVzdCgnZGF5IGFuZCB3ZWVrRGF5IGFyZSBtdXRleDogZ2l2ZW4gbmVpdGhlcicsICgpID0+IHtcbiAgICBleHBlY3Qoc3ludGhldGljcy5TY2hlZHVsZS5jcm9uKHt9KS5leHByZXNzaW9uU3RyaW5nKS50b0VxdWFsKCdjcm9uKCogKiAqICogPyAqKScpO1xuICB9KTtcblxuICB0ZXN0KCdkYXkgYW5kIHdlZWtEYXkgYXJlIG11dGV4OiB0aHJvdyBpZiBnaXZlbiBib3RoJywgKCkgPT4ge1xuICAgIGV4cGVjdCgoKSA9PiBzeW50aGV0aWNzLlNjaGVkdWxlLmNyb24oe1xuICAgICAgZGF5OiAnMScsXG4gICAgICB3ZWVrRGF5OiAnTU9OJyxcbiAgICB9KSkudG9UaHJvdygnQ2Fubm90IHN1cHBseSBib3RoIFxcJ2RheVxcJyBhbmQgXFwnd2Vla0RheVxcJywgdXNlIGF0IG1vc3Qgb25lJyk7XG4gIH0pO1xufSk7XG4iXX0= \ No newline at end of file diff --git a/packages/@aws-cdk/aws-synthetics-alpha/tsconfig.json b/packages/@aws-cdk/aws-synthetics-alpha/tsconfig.json new file mode 100644 index 0000000000000..00315950564fd --- /dev/null +++ b/packages/@aws-cdk/aws-synthetics-alpha/tsconfig.json @@ -0,0 +1,53 @@ +{ + "compilerOptions": { + "declarationMap": false, + "inlineSourceMap": true, + "inlineSources": true, + "alwaysStrict": true, + "declaration": true, + "experimentalDecorators": true, + "incremental": true, + "lib": [ + "es2020" + ], + "module": "CommonJS", + "noEmitOnError": true, + "noFallthroughCasesInSwitch": true, + "noImplicitAny": true, + "noImplicitReturns": true, + "noImplicitThis": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "resolveJsonModule": true, + "skipLibCheck": true, + "strict": true, + "strictNullChecks": true, + "strictPropertyInitialization": true, + "stripInternal": false, + "target": "ES2020", + "composite": true, + "tsBuildInfoFile": "tsconfig.tsbuildinfo" + }, + "include": [ + "**/*.ts" + ], + "exclude": [ + "node_modules", + ".types-compat" + ], + "references": [ + { + "path": "../../../tools/@aws-cdk/cdk-build-tools" + }, + { + "path": "../integ-runner" + }, + { + "path": "../../../tools/@aws-cdk/pkglint" + }, + { + "path": "../integ-tests-alpha" + } + ], + "_generated_by_jsii_": "Generated by jsii - safe to delete, and ideally should be in .gitignore" +} \ No newline at end of file diff --git a/packages/aws-cdk-lib/aws-cloudfront/lib/experimental/edge-function.ts b/packages/aws-cdk-lib/aws-cloudfront/lib/experimental/edge-function.ts index bb4f3645777ad..99433bdf48304 100644 --- a/packages/aws-cdk-lib/aws-cloudfront/lib/experimental/edge-function.ts +++ b/packages/aws-cdk-lib/aws-cloudfront/lib/experimental/edge-function.ts @@ -124,8 +124,8 @@ export class EdgeFunction extends Resource implements lambda.IVersion { public grantInvokeUrl(identity: iam.IGrantable): iam.Grant { return this.lambda.grantInvokeUrl(identity); } - public grantInvokeCompositePrincipal(compositePrincipals: iam.CompositePrincipal): iam.Grant[] { - return this.lambda.grantInvokeCompositePrincipal(compositePrincipals); + public grantInvokeCompositePrincipal(compositePrincipal: iam.CompositePrincipal): iam.Grant[] { + return this.lambda.grantInvokeCompositePrincipal(compositePrincipal); } public metric(metricName: string, props?: cloudwatch.MetricOptions): cloudwatch.Metric { return this.lambda.metric(metricName, { ...props, region: EdgeFunction.EDGE_REGION }); diff --git a/packages/aws-cdk-lib/aws-lambda/lib/function-base.ts b/packages/aws-cdk-lib/aws-lambda/lib/function-base.ts index 89a5e8da42b3a..bfa8abb17ff44 100644 --- a/packages/aws-cdk-lib/aws-lambda/lib/function-base.ts +++ b/packages/aws-cdk-lib/aws-lambda/lib/function-base.ts @@ -105,7 +105,7 @@ export interface IFunction extends IResource, ec2.IConnectable, iam.IGrantable { /** * Grant multiple principals the ability to invoke this Lambda via CompositePrincipal */ - grantInvokeCompositePrincipal(principals: iam.CompositePrincipal): iam.Grant[]; + grantInvokeCompositePrincipal(compositePrincipal: iam.CompositePrincipal): iam.Grant[]; /** * Return the given named metric for this Lambda @@ -457,8 +457,8 @@ export abstract class FunctionBase extends Resource implements IFunction, ec2.IC /** * Grant multiple principals the ability to invoke this Lambda via CompositePrincipal */ - public grantInvokeCompositePrincipal(compositePrincipals: iam.CompositePrincipal): iam.Grant[] { - return compositePrincipals.principals.map((principal) => this.grantInvoke(principal)); + public grantInvokeCompositePrincipal(compositePrincipal: iam.CompositePrincipal): iam.Grant[] { + return compositePrincipal.principals.map((principal) => this.grantInvoke(principal)); } public addEventSource(source: IEventSource) { From c29502841775f118d57441abeaa804a8df7ee16f Mon Sep 17 00:00:00 2001 From: Michael Sambol Date: Wed, 18 Oct 2023 19:30:20 -0600 Subject: [PATCH 8/8] remove aws-synthetics-alpha --- packages/@aws-cdk/aws-synthetics-alpha/.jsii | 5669 ----------------- .../aws-synthetics-alpha/.warnings.jsii.js | 217 - .../aws-synthetics-alpha/lib/canary.d.ts | 308 - .../aws-synthetics-alpha/lib/canary.js | 439 -- .../aws-synthetics-alpha/lib/code.d.ts | 107 - .../@aws-cdk/aws-synthetics-alpha/lib/code.js | 253 - .../aws-synthetics-alpha/lib/index.d.ts | 4 - .../aws-synthetics-alpha/lib/index.js | 22 - .../aws-synthetics-alpha/lib/runtime.d.ts | 280 - .../aws-synthetics-alpha/lib/runtime.js | 302 - .../aws-synthetics-alpha/lib/schedule.d.ts | 73 - .../aws-synthetics-alpha/lib/schedule.js | 113 - .../test/canary.test.d.ts | 1 - .../aws-synthetics-alpha/test/canary.test.js | 701 -- .../aws-synthetics-alpha/test/code.test.d.ts | 1 - .../aws-synthetics-alpha/test/code.test.js | 220 - .../test/integ.canary-auto-delete-lambda.d.ts | 1 - .../test/integ.canary-auto-delete-lambda.js | 57 - .../test/integ.canary.d.ts | 1 - .../aws-synthetics-alpha/test/integ.canary.js | 112 - .../aws-synthetics-alpha/test/integ.vpc.d.ts | 1 - .../aws-synthetics-alpha/test/integ.vpc.js | 27 - .../test/metric.test.d.ts | 1 - .../aws-synthetics-alpha/test/metric.test.js | 59 - .../test/schedule.test.d.ts | 1 - .../test/schedule.test.js | 25 - .../aws-synthetics-alpha/tsconfig.json | 53 - 27 files changed, 9048 deletions(-) delete mode 100644 packages/@aws-cdk/aws-synthetics-alpha/.jsii delete mode 100644 packages/@aws-cdk/aws-synthetics-alpha/.warnings.jsii.js delete mode 100644 packages/@aws-cdk/aws-synthetics-alpha/lib/canary.d.ts delete mode 100644 packages/@aws-cdk/aws-synthetics-alpha/lib/canary.js delete mode 100644 packages/@aws-cdk/aws-synthetics-alpha/lib/code.d.ts delete mode 100644 packages/@aws-cdk/aws-synthetics-alpha/lib/code.js delete mode 100644 packages/@aws-cdk/aws-synthetics-alpha/lib/index.d.ts delete mode 100644 packages/@aws-cdk/aws-synthetics-alpha/lib/index.js delete mode 100644 packages/@aws-cdk/aws-synthetics-alpha/lib/runtime.d.ts delete mode 100644 packages/@aws-cdk/aws-synthetics-alpha/lib/runtime.js delete mode 100644 packages/@aws-cdk/aws-synthetics-alpha/lib/schedule.d.ts delete mode 100644 packages/@aws-cdk/aws-synthetics-alpha/lib/schedule.js delete mode 100644 packages/@aws-cdk/aws-synthetics-alpha/test/canary.test.d.ts delete mode 100644 packages/@aws-cdk/aws-synthetics-alpha/test/canary.test.js delete mode 100644 packages/@aws-cdk/aws-synthetics-alpha/test/code.test.d.ts delete mode 100644 packages/@aws-cdk/aws-synthetics-alpha/test/code.test.js delete mode 100644 packages/@aws-cdk/aws-synthetics-alpha/test/integ.canary-auto-delete-lambda.d.ts delete mode 100644 packages/@aws-cdk/aws-synthetics-alpha/test/integ.canary-auto-delete-lambda.js delete mode 100644 packages/@aws-cdk/aws-synthetics-alpha/test/integ.canary.d.ts delete mode 100644 packages/@aws-cdk/aws-synthetics-alpha/test/integ.canary.js delete mode 100644 packages/@aws-cdk/aws-synthetics-alpha/test/integ.vpc.d.ts delete mode 100644 packages/@aws-cdk/aws-synthetics-alpha/test/integ.vpc.js delete mode 100644 packages/@aws-cdk/aws-synthetics-alpha/test/metric.test.d.ts delete mode 100644 packages/@aws-cdk/aws-synthetics-alpha/test/metric.test.js delete mode 100644 packages/@aws-cdk/aws-synthetics-alpha/test/schedule.test.d.ts delete mode 100644 packages/@aws-cdk/aws-synthetics-alpha/test/schedule.test.js delete mode 100644 packages/@aws-cdk/aws-synthetics-alpha/tsconfig.json diff --git a/packages/@aws-cdk/aws-synthetics-alpha/.jsii b/packages/@aws-cdk/aws-synthetics-alpha/.jsii deleted file mode 100644 index 5b406d8d2b5cd..0000000000000 --- a/packages/@aws-cdk/aws-synthetics-alpha/.jsii +++ /dev/null @@ -1,5669 +0,0 @@ -{ - "author": { - "name": "Amazon Web Services", - "organization": true, - "roles": [ - "author" - ], - "url": "https://aws.amazon.com" - }, - "dependencies": { - "aws-cdk-lib": "^0.0.0", - "constructs": "^10.0.0" - }, - "dependencyClosure": { - "@aws-cdk/asset-awscli-v1": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.Asset.AwsCliV1", - "packageId": "Amazon.CDK.Asset.AwsCliV1" - }, - "go": { - "moduleName": "github.com/cdklabs/awscdk-asset-awscli-go", - "packageName": "awscliv1" - }, - "java": { - "maven": { - "artifactId": "cdk-asset-awscli-v1", - "groupId": "software.amazon.awscdk" - }, - "package": "software.amazon.awscdk.cdk.asset.awscli.v1" - }, - "js": { - "npm": "@aws-cdk/asset-awscli-v1" - }, - "python": { - "distName": "aws-cdk.asset-awscli-v1", - "module": "aws_cdk.asset_awscli_v1" - } - } - }, - "@aws-cdk/asset-kubectl-v20": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.Asset.KubectlV20", - "packageId": "Amazon.CDK.Asset.KubectlV20" - }, - "go": { - "moduleName": "github.com/cdklabs/awscdk-asset-kubectl-go", - "packageName": "kubectlv20" - }, - "java": { - "maven": { - "artifactId": "cdk-asset-kubectl-v20", - "groupId": "software.amazon.awscdk" - }, - "package": "software.amazon.awscdk.cdk.asset.kubectl.v20" - }, - "js": { - "npm": "@aws-cdk/asset-kubectl-v20" - }, - "python": { - "distName": "aws-cdk.asset-kubectl-v20", - "module": "aws_cdk.asset_kubectl_v20" - } - } - }, - "@aws-cdk/asset-node-proxy-agent-v6": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.Asset.NodeProxyAgentV6", - "packageId": "Amazon.CDK.Asset.NodeProxyAgentV6" - }, - "go": { - "moduleName": "github.com/cdklabs/awscdk-asset-node-proxy-agent-go", - "packageName": "nodeproxyagentv6" - }, - "java": { - "maven": { - "artifactId": "cdk-asset-node-proxy-agent-v6", - "groupId": "software.amazon.awscdk" - }, - "package": "software.amazon.awscdk.cdk.asset.node.proxy.agent.v6" - }, - "js": { - "npm": "@aws-cdk/asset-node-proxy-agent-v6" - }, - "python": { - "distName": "aws-cdk.asset-node-proxy-agent-v6", - "module": "aws_cdk.asset_node_proxy_agent_v6" - } - } - }, - "aws-cdk-lib": { - "submodules": { - "aws-cdk-lib.alexa_ask": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.Alexa.Ask" - }, - "java": { - "package": "software.amazon.awscdk.alexa.ask" - }, - "python": { - "module": "aws_cdk.alexa_ask" - } - } - }, - "aws-cdk-lib.assertions": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.Assertions" - }, - "java": { - "package": "software.amazon.awscdk.assertions" - }, - "python": { - "module": "aws_cdk.assertions" - } - } - }, - "aws-cdk-lib.assets": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.Assets" - }, - "java": { - "package": "software.amazon.awscdk.assets" - }, - "python": { - "module": "aws_cdk.assets" - } - } - }, - "aws-cdk-lib.aws_accessanalyzer": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.AccessAnalyzer" - }, - "java": { - "package": "software.amazon.awscdk.services.accessanalyzer" - }, - "python": { - "module": "aws_cdk.aws_accessanalyzer" - } - } - }, - "aws-cdk-lib.aws_acmpca": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.ACMPCA" - }, - "java": { - "package": "software.amazon.awscdk.services.acmpca" - }, - "python": { - "module": "aws_cdk.aws_acmpca" - } - } - }, - "aws-cdk-lib.aws_amazonmq": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.AmazonMQ" - }, - "java": { - "package": "software.amazon.awscdk.services.amazonmq" - }, - "python": { - "module": "aws_cdk.aws_amazonmq" - } - } - }, - "aws-cdk-lib.aws_amplify": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.Amplify" - }, - "java": { - "package": "software.amazon.awscdk.services.amplify" - }, - "python": { - "module": "aws_cdk.aws_amplify" - } - } - }, - "aws-cdk-lib.aws_amplifyuibuilder": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.AmplifyUIBuilder" - }, - "java": { - "package": "software.amazon.awscdk.services.amplifyuibuilder" - }, - "python": { - "module": "aws_cdk.aws_amplifyuibuilder" - } - } - }, - "aws-cdk-lib.aws_apigateway": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.APIGateway" - }, - "java": { - "package": "software.amazon.awscdk.services.apigateway" - }, - "python": { - "module": "aws_cdk.aws_apigateway" - } - } - }, - "aws-cdk-lib.aws_apigatewayv2": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.Apigatewayv2" - }, - "java": { - "package": "software.amazon.awscdk.services.apigatewayv2" - }, - "python": { - "module": "aws_cdk.aws_apigatewayv2" - } - } - }, - "aws-cdk-lib.aws_appconfig": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.AppConfig" - }, - "java": { - "package": "software.amazon.awscdk.services.appconfig" - }, - "python": { - "module": "aws_cdk.aws_appconfig" - } - } - }, - "aws-cdk-lib.aws_appflow": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.AppFlow" - }, - "java": { - "package": "software.amazon.awscdk.services.appflow" - }, - "python": { - "module": "aws_cdk.aws_appflow" - } - } - }, - "aws-cdk-lib.aws_appintegrations": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.AppIntegrations" - }, - "java": { - "package": "software.amazon.awscdk.services.appintegrations" - }, - "python": { - "module": "aws_cdk.aws_appintegrations" - } - } - }, - "aws-cdk-lib.aws_applicationautoscaling": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.ApplicationAutoScaling" - }, - "java": { - "package": "software.amazon.awscdk.services.applicationautoscaling" - }, - "python": { - "module": "aws_cdk.aws_applicationautoscaling" - } - } - }, - "aws-cdk-lib.aws_applicationinsights": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.ApplicationInsights" - }, - "java": { - "package": "software.amazon.awscdk.services.applicationinsights" - }, - "python": { - "module": "aws_cdk.aws_applicationinsights" - } - } - }, - "aws-cdk-lib.aws_appmesh": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.AppMesh" - }, - "java": { - "package": "software.amazon.awscdk.services.appmesh" - }, - "python": { - "module": "aws_cdk.aws_appmesh" - } - } - }, - "aws-cdk-lib.aws_apprunner": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.AppRunner" - }, - "java": { - "package": "software.amazon.awscdk.services.apprunner" - }, - "python": { - "module": "aws_cdk.aws_apprunner" - } - } - }, - "aws-cdk-lib.aws_appstream": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.AppStream" - }, - "java": { - "package": "software.amazon.awscdk.services.appstream" - }, - "python": { - "module": "aws_cdk.aws_appstream" - } - } - }, - "aws-cdk-lib.aws_appsync": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.AppSync" - }, - "java": { - "package": "software.amazon.awscdk.services.appsync" - }, - "python": { - "module": "aws_cdk.aws_appsync" - } - } - }, - "aws-cdk-lib.aws_aps": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.APS" - }, - "java": { - "package": "software.amazon.awscdk.services.aps" - }, - "python": { - "module": "aws_cdk.aws_aps" - } - } - }, - "aws-cdk-lib.aws_athena": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.Athena" - }, - "java": { - "package": "software.amazon.awscdk.services.athena" - }, - "python": { - "module": "aws_cdk.aws_athena" - } - } - }, - "aws-cdk-lib.aws_auditmanager": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.AuditManager" - }, - "java": { - "package": "software.amazon.awscdk.services.auditmanager" - }, - "python": { - "module": "aws_cdk.aws_auditmanager" - } - } - }, - "aws-cdk-lib.aws_autoscaling": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.AutoScaling" - }, - "java": { - "package": "software.amazon.awscdk.services.autoscaling" - }, - "python": { - "module": "aws_cdk.aws_autoscaling" - } - } - }, - "aws-cdk-lib.aws_autoscaling_common": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.AutoScaling.Common" - }, - "java": { - "package": "software.amazon.awscdk.services.autoscaling.common" - }, - "python": { - "module": "aws_cdk.aws_autoscaling_common" - } - } - }, - "aws-cdk-lib.aws_autoscaling_hooktargets": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.AutoScaling.HookTargets" - }, - "java": { - "package": "software.amazon.awscdk.services.autoscaling.hooktargets" - }, - "python": { - "module": "aws_cdk.aws_autoscaling_hooktargets" - } - } - }, - "aws-cdk-lib.aws_autoscalingplans": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.AutoScalingPlans" - }, - "java": { - "package": "software.amazon.awscdk.services.autoscalingplans" - }, - "python": { - "module": "aws_cdk.aws_autoscalingplans" - } - } - }, - "aws-cdk-lib.aws_backup": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.Backup" - }, - "java": { - "package": "software.amazon.awscdk.services.backup" - }, - "python": { - "module": "aws_cdk.aws_backup" - } - } - }, - "aws-cdk-lib.aws_backupgateway": { - "targets": { - "dotnet": { - "package": "Amazon.CDK.AWS.BackupGateway" - }, - "java": { - "package": "services.backupgateway" - }, - "python": { - "module": "aws_cdk.aws_backupgateway" - } - } - }, - "aws-cdk-lib.aws_batch": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.Batch" - }, - "java": { - "package": "software.amazon.awscdk.services.batch" - }, - "python": { - "module": "aws_cdk.aws_batch" - } - } - }, - "aws-cdk-lib.aws_billingconductor": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.BillingConductor" - }, - "java": { - "package": "software.amazon.awscdk.services.billingconductor" - }, - "python": { - "module": "aws_cdk.aws_billingconductor" - } - } - }, - "aws-cdk-lib.aws_budgets": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.Budgets" - }, - "java": { - "package": "software.amazon.awscdk.services.budgets" - }, - "python": { - "module": "aws_cdk.aws_budgets" - } - } - }, - "aws-cdk-lib.aws_cassandra": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.Cassandra" - }, - "java": { - "package": "software.amazon.awscdk.services.cassandra" - }, - "python": { - "module": "aws_cdk.aws_cassandra" - } - } - }, - "aws-cdk-lib.aws_ce": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.CE" - }, - "java": { - "package": "software.amazon.awscdk.services.ce" - }, - "python": { - "module": "aws_cdk.aws_ce" - } - } - }, - "aws-cdk-lib.aws_certificatemanager": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.CertificateManager" - }, - "java": { - "package": "software.amazon.awscdk.services.certificatemanager" - }, - "python": { - "module": "aws_cdk.aws_certificatemanager" - } - } - }, - "aws-cdk-lib.aws_chatbot": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.Chatbot" - }, - "java": { - "package": "software.amazon.awscdk.services.chatbot" - }, - "python": { - "module": "aws_cdk.aws_chatbot" - } - } - }, - "aws-cdk-lib.aws_cleanrooms": { - "targets": { - "dotnet": { - "package": "Amazon.CDK.AWS.CleanRooms" - }, - "java": { - "package": "services.cleanrooms" - }, - "python": { - "module": "aws_cdk.aws_cleanrooms" - } - } - }, - "aws-cdk-lib.aws_cloud9": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.Cloud9" - }, - "java": { - "package": "software.amazon.awscdk.services.cloud9" - }, - "python": { - "module": "aws_cdk.aws_cloud9" - } - } - }, - "aws-cdk-lib.aws_cloudformation": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.CloudFormation" - }, - "java": { - "package": "software.amazon.awscdk.services.cloudformation" - }, - "python": { - "module": "aws_cdk.aws_cloudformation" - } - } - }, - "aws-cdk-lib.aws_cloudfront": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.CloudFront" - }, - "java": { - "package": "software.amazon.awscdk.services.cloudfront" - }, - "python": { - "module": "aws_cdk.aws_cloudfront" - } - } - }, - "aws-cdk-lib.aws_cloudfront.experimental": {}, - "aws-cdk-lib.aws_cloudfront_origins": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.CloudFront.Origins" - }, - "java": { - "package": "software.amazon.awscdk.services.cloudfront.origins" - }, - "python": { - "module": "aws_cdk.aws_cloudfront_origins" - } - } - }, - "aws-cdk-lib.aws_cloudtrail": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.CloudTrail" - }, - "java": { - "package": "software.amazon.awscdk.services.cloudtrail" - }, - "python": { - "module": "aws_cdk.aws_cloudtrail" - } - } - }, - "aws-cdk-lib.aws_cloudwatch": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.CloudWatch" - }, - "java": { - "package": "software.amazon.awscdk.services.cloudwatch" - }, - "python": { - "module": "aws_cdk.aws_cloudwatch" - } - } - }, - "aws-cdk-lib.aws_cloudwatch_actions": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.CloudWatch.Actions" - }, - "java": { - "package": "software.amazon.awscdk.services.cloudwatch.actions" - }, - "python": { - "module": "aws_cdk.aws_cloudwatch_actions" - } - } - }, - "aws-cdk-lib.aws_codeartifact": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.CodeArtifact" - }, - "java": { - "package": "software.amazon.awscdk.services.codeartifact" - }, - "python": { - "module": "aws_cdk.aws_codeartifact" - } - } - }, - "aws-cdk-lib.aws_codebuild": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.CodeBuild" - }, - "java": { - "package": "software.amazon.awscdk.services.codebuild" - }, - "python": { - "module": "aws_cdk.aws_codebuild" - } - } - }, - "aws-cdk-lib.aws_codecommit": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.CodeCommit" - }, - "java": { - "package": "software.amazon.awscdk.services.codecommit" - }, - "python": { - "module": "aws_cdk.aws_codecommit" - } - } - }, - "aws-cdk-lib.aws_codedeploy": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.CodeDeploy" - }, - "java": { - "package": "software.amazon.awscdk.services.codedeploy" - }, - "python": { - "module": "aws_cdk.aws_codedeploy" - } - } - }, - "aws-cdk-lib.aws_codeguruprofiler": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.CodeGuruProfiler" - }, - "java": { - "package": "software.amazon.awscdk.services.codeguruprofiler" - }, - "python": { - "module": "aws_cdk.aws_codeguruprofiler" - } - } - }, - "aws-cdk-lib.aws_codegurureviewer": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.CodeGuruReviewer" - }, - "java": { - "package": "software.amazon.awscdk.services.codegurureviewer" - }, - "python": { - "module": "aws_cdk.aws_codegurureviewer" - } - } - }, - "aws-cdk-lib.aws_codepipeline": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.CodePipeline" - }, - "java": { - "package": "software.amazon.awscdk.services.codepipeline" - }, - "python": { - "module": "aws_cdk.aws_codepipeline" - } - } - }, - "aws-cdk-lib.aws_codepipeline_actions": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.CodePipeline.Actions" - }, - "java": { - "package": "software.amazon.awscdk.services.codepipeline.actions" - }, - "python": { - "module": "aws_cdk.aws_codepipeline_actions" - } - } - }, - "aws-cdk-lib.aws_codestar": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.Codestar" - }, - "java": { - "package": "software.amazon.awscdk.services.codestar" - }, - "python": { - "module": "aws_cdk.aws_codestar" - } - } - }, - "aws-cdk-lib.aws_codestarconnections": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.CodeStarConnections" - }, - "java": { - "package": "software.amazon.awscdk.services.codestarconnections" - }, - "python": { - "module": "aws_cdk.aws_codestarconnections" - } - } - }, - "aws-cdk-lib.aws_codestarnotifications": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.CodeStarNotifications" - }, - "java": { - "package": "software.amazon.awscdk.services.codestarnotifications" - }, - "python": { - "module": "aws_cdk.aws_codestarnotifications" - } - } - }, - "aws-cdk-lib.aws_cognito": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.Cognito" - }, - "java": { - "package": "software.amazon.awscdk.services.cognito" - }, - "python": { - "module": "aws_cdk.aws_cognito" - } - } - }, - "aws-cdk-lib.aws_comprehend": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.Comprehend" - }, - "java": { - "package": "software.amazon.awscdk.services.comprehend" - }, - "python": { - "module": "aws_cdk.aws_comprehend" - } - } - }, - "aws-cdk-lib.aws_config": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.Config" - }, - "java": { - "package": "software.amazon.awscdk.services.config" - }, - "python": { - "module": "aws_cdk.aws_config" - } - } - }, - "aws-cdk-lib.aws_connect": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.Connect" - }, - "java": { - "package": "software.amazon.awscdk.services.connect" - }, - "python": { - "module": "aws_cdk.aws_connect" - } - } - }, - "aws-cdk-lib.aws_connectcampaigns": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.ConnectCampaigns" - }, - "java": { - "package": "software.amazon.awscdk.services.connectcampaigns" - }, - "python": { - "module": "aws_cdk.aws_connectcampaigns" - } - } - }, - "aws-cdk-lib.aws_controltower": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.ControlTower" - }, - "java": { - "package": "software.amazon.awscdk.services.controltower" - }, - "python": { - "module": "aws_cdk.aws_controltower" - } - } - }, - "aws-cdk-lib.aws_cur": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.CUR" - }, - "java": { - "package": "software.amazon.awscdk.services.cur" - }, - "python": { - "module": "aws_cdk.aws_cur" - } - } - }, - "aws-cdk-lib.aws_customerprofiles": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.CustomerProfiles" - }, - "java": { - "package": "software.amazon.awscdk.services.customerprofiles" - }, - "python": { - "module": "aws_cdk.aws_customerprofiles" - } - } - }, - "aws-cdk-lib.aws_databrew": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.DataBrew" - }, - "java": { - "package": "software.amazon.awscdk.services.databrew" - }, - "python": { - "module": "aws_cdk.aws_databrew" - } - } - }, - "aws-cdk-lib.aws_datapipeline": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.DataPipeline" - }, - "java": { - "package": "software.amazon.awscdk.services.datapipeline" - }, - "python": { - "module": "aws_cdk.aws_datapipeline" - } - } - }, - "aws-cdk-lib.aws_datasync": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.DataSync" - }, - "java": { - "package": "software.amazon.awscdk.services.datasync" - }, - "python": { - "module": "aws_cdk.aws_datasync" - } - } - }, - "aws-cdk-lib.aws_dax": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.DAX" - }, - "java": { - "package": "software.amazon.awscdk.services.dax" - }, - "python": { - "module": "aws_cdk.aws_dax" - } - } - }, - "aws-cdk-lib.aws_detective": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.Detective" - }, - "java": { - "package": "software.amazon.awscdk.services.detective" - }, - "python": { - "module": "aws_cdk.aws_detective" - } - } - }, - "aws-cdk-lib.aws_devicefarm": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.DeviceFarm" - }, - "java": { - "package": "software.amazon.awscdk.services.devicefarm" - }, - "python": { - "module": "aws_cdk.aws_devicefarm" - } - } - }, - "aws-cdk-lib.aws_devopsguru": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.DevOpsGuru" - }, - "java": { - "package": "software.amazon.awscdk.services.devopsguru" - }, - "python": { - "module": "aws_cdk.aws_devopsguru" - } - } - }, - "aws-cdk-lib.aws_directoryservice": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.DirectoryService" - }, - "java": { - "package": "software.amazon.awscdk.services.directoryservice" - }, - "python": { - "module": "aws_cdk.aws_directoryservice" - } - } - }, - "aws-cdk-lib.aws_dlm": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.DLM" - }, - "java": { - "package": "software.amazon.awscdk.services.dlm" - }, - "python": { - "module": "aws_cdk.aws_dlm" - } - } - }, - "aws-cdk-lib.aws_dms": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.DMS" - }, - "java": { - "package": "software.amazon.awscdk.services.dms" - }, - "python": { - "module": "aws_cdk.aws_dms" - } - } - }, - "aws-cdk-lib.aws_docdb": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.DocDB" - }, - "java": { - "package": "software.amazon.awscdk.services.docdb" - }, - "python": { - "module": "aws_cdk.aws_docdb" - } - } - }, - "aws-cdk-lib.aws_docdbelastic": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.DocDBElastic" - }, - "java": { - "package": "software.amazon.awscdk.services.docdbelastic" - }, - "python": { - "module": "aws_cdk.aws_docdbelastic" - } - } - }, - "aws-cdk-lib.aws_dynamodb": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.DynamoDB" - }, - "java": { - "package": "software.amazon.awscdk.services.dynamodb" - }, - "python": { - "module": "aws_cdk.aws_dynamodb" - } - } - }, - "aws-cdk-lib.aws_ec2": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.EC2" - }, - "java": { - "package": "software.amazon.awscdk.services.ec2" - }, - "python": { - "module": "aws_cdk.aws_ec2" - } - } - }, - "aws-cdk-lib.aws_ecr": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.ECR" - }, - "java": { - "package": "software.amazon.awscdk.services.ecr" - }, - "python": { - "module": "aws_cdk.aws_ecr" - } - } - }, - "aws-cdk-lib.aws_ecr_assets": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.Ecr.Assets" - }, - "java": { - "package": "software.amazon.awscdk.services.ecr.assets" - }, - "python": { - "module": "aws_cdk.aws_ecr_assets" - } - } - }, - "aws-cdk-lib.aws_ecs": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.ECS" - }, - "java": { - "package": "software.amazon.awscdk.services.ecs" - }, - "python": { - "module": "aws_cdk.aws_ecs" - } - } - }, - "aws-cdk-lib.aws_ecs_patterns": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.ECS.Patterns" - }, - "java": { - "package": "software.amazon.awscdk.services.ecs.patterns" - }, - "python": { - "module": "aws_cdk.aws_ecs_patterns" - } - } - }, - "aws-cdk-lib.aws_efs": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.EFS" - }, - "java": { - "package": "software.amazon.awscdk.services.efs" - }, - "python": { - "module": "aws_cdk.aws_efs" - } - } - }, - "aws-cdk-lib.aws_eks": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.EKS" - }, - "java": { - "package": "software.amazon.awscdk.services.eks" - }, - "python": { - "module": "aws_cdk.aws_eks" - } - } - }, - "aws-cdk-lib.aws_elasticache": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.ElastiCache" - }, - "java": { - "package": "software.amazon.awscdk.services.elasticache" - }, - "python": { - "module": "aws_cdk.aws_elasticache" - } - } - }, - "aws-cdk-lib.aws_elasticbeanstalk": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.ElasticBeanstalk" - }, - "java": { - "package": "software.amazon.awscdk.services.elasticbeanstalk" - }, - "python": { - "module": "aws_cdk.aws_elasticbeanstalk" - } - } - }, - "aws-cdk-lib.aws_elasticloadbalancing": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.ElasticLoadBalancing" - }, - "java": { - "package": "software.amazon.awscdk.services.elasticloadbalancing" - }, - "python": { - "module": "aws_cdk.aws_elasticloadbalancing" - } - } - }, - "aws-cdk-lib.aws_elasticloadbalancingv2": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.ElasticLoadBalancingV2" - }, - "java": { - "package": "software.amazon.awscdk.services.elasticloadbalancingv2" - }, - "python": { - "module": "aws_cdk.aws_elasticloadbalancingv2" - } - } - }, - "aws-cdk-lib.aws_elasticloadbalancingv2_actions": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.ElasticLoadBalancingV2.Actions" - }, - "java": { - "package": "software.amazon.awscdk.services.elasticloadbalancingv2.actions" - }, - "python": { - "module": "aws_cdk.aws_elasticloadbalancingv2_actions" - } - } - }, - "aws-cdk-lib.aws_elasticloadbalancingv2_targets": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.ElasticLoadBalancingV2.Targets" - }, - "java": { - "package": "software.amazon.awscdk.services.elasticloadbalancingv2.targets" - }, - "python": { - "module": "aws_cdk.aws_elasticloadbalancingv2_targets" - } - } - }, - "aws-cdk-lib.aws_elasticsearch": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.Elasticsearch" - }, - "java": { - "package": "software.amazon.awscdk.services.elasticsearch" - }, - "python": { - "module": "aws_cdk.aws_elasticsearch" - } - } - }, - "aws-cdk-lib.aws_emr": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.EMR" - }, - "java": { - "package": "software.amazon.awscdk.services.emr" - }, - "python": { - "module": "aws_cdk.aws_emr" - } - } - }, - "aws-cdk-lib.aws_emrcontainers": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.EMRContainers" - }, - "java": { - "package": "software.amazon.awscdk.services.emrcontainers" - }, - "python": { - "module": "aws_cdk.aws_emrcontainers" - } - } - }, - "aws-cdk-lib.aws_emrserverless": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.EMRServerless" - }, - "java": { - "package": "software.amazon.awscdk.services.emrserverless" - }, - "python": { - "module": "aws_cdk.aws_emrserverless" - } - } - }, - "aws-cdk-lib.aws_entityresolution": { - "targets": { - "dotnet": { - "package": "Amazon.CDK.AWS.EntityResolution" - }, - "java": { - "package": "services.entityresolution" - }, - "python": { - "module": "aws_cdk.aws_entityresolution" - } - } - }, - "aws-cdk-lib.aws_events": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.Events" - }, - "java": { - "package": "software.amazon.awscdk.services.events" - }, - "python": { - "module": "aws_cdk.aws_events" - } - } - }, - "aws-cdk-lib.aws_events_targets": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.Events.Targets" - }, - "java": { - "package": "software.amazon.awscdk.services.events.targets" - }, - "python": { - "module": "aws_cdk.aws_events_targets" - } - } - }, - "aws-cdk-lib.aws_eventschemas": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.EventSchemas" - }, - "java": { - "package": "software.amazon.awscdk.services.eventschemas" - }, - "python": { - "module": "aws_cdk.aws_eventschemas" - } - } - }, - "aws-cdk-lib.aws_evidently": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.Evidently" - }, - "java": { - "package": "software.amazon.awscdk.services.evidently" - }, - "python": { - "module": "aws_cdk.aws_evidently" - } - } - }, - "aws-cdk-lib.aws_finspace": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.FinSpace" - }, - "java": { - "package": "software.amazon.awscdk.services.finspace" - }, - "python": { - "module": "aws_cdk.aws_finspace" - } - } - }, - "aws-cdk-lib.aws_fis": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.FIS" - }, - "java": { - "package": "software.amazon.awscdk.services.fis" - }, - "python": { - "module": "aws_cdk.aws_fis" - } - } - }, - "aws-cdk-lib.aws_fms": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.FMS" - }, - "java": { - "package": "software.amazon.awscdk.services.fms" - }, - "python": { - "module": "aws_cdk.aws_fms" - } - } - }, - "aws-cdk-lib.aws_forecast": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.Forecast" - }, - "java": { - "package": "software.amazon.awscdk.services.forecast" - }, - "python": { - "module": "aws_cdk.aws_forecast" - } - } - }, - "aws-cdk-lib.aws_frauddetector": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.FraudDetector" - }, - "java": { - "package": "software.amazon.awscdk.services.frauddetector" - }, - "python": { - "module": "aws_cdk.aws_frauddetector" - } - } - }, - "aws-cdk-lib.aws_fsx": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.FSx" - }, - "java": { - "package": "software.amazon.awscdk.services.fsx" - }, - "python": { - "module": "aws_cdk.aws_fsx" - } - } - }, - "aws-cdk-lib.aws_gamelift": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.GameLift" - }, - "java": { - "package": "software.amazon.awscdk.services.gamelift" - }, - "python": { - "module": "aws_cdk.aws_gamelift" - } - } - }, - "aws-cdk-lib.aws_globalaccelerator": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.GlobalAccelerator" - }, - "java": { - "package": "software.amazon.awscdk.services.globalaccelerator" - }, - "python": { - "module": "aws_cdk.aws_globalaccelerator" - } - } - }, - "aws-cdk-lib.aws_globalaccelerator_endpoints": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.GlobalAccelerator.Endpoints" - }, - "java": { - "package": "software.amazon.awscdk.services.globalaccelerator.endpoints" - }, - "python": { - "module": "aws_cdk.aws_globalaccelerator_endpoints" - } - } - }, - "aws-cdk-lib.aws_glue": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.Glue" - }, - "java": { - "package": "software.amazon.awscdk.services.glue" - }, - "python": { - "module": "aws_cdk.aws_glue" - } - } - }, - "aws-cdk-lib.aws_grafana": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.Grafana" - }, - "java": { - "package": "software.amazon.awscdk.services.grafana" - }, - "python": { - "module": "aws_cdk.aws_grafana" - } - } - }, - "aws-cdk-lib.aws_greengrass": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.Greengrass" - }, - "java": { - "package": "software.amazon.awscdk.services.greengrass" - }, - "python": { - "module": "aws_cdk.aws_greengrass" - } - } - }, - "aws-cdk-lib.aws_greengrassv2": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.GreengrassV2" - }, - "java": { - "package": "software.amazon.awscdk.services.greengrassv2" - }, - "python": { - "module": "aws_cdk.aws_greengrassv2" - } - } - }, - "aws-cdk-lib.aws_groundstation": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.GroundStation" - }, - "java": { - "package": "software.amazon.awscdk.services.groundstation" - }, - "python": { - "module": "aws_cdk.aws_groundstation" - } - } - }, - "aws-cdk-lib.aws_guardduty": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.GuardDuty" - }, - "java": { - "package": "software.amazon.awscdk.services.guardduty" - }, - "python": { - "module": "aws_cdk.aws_guardduty" - } - } - }, - "aws-cdk-lib.aws_healthimaging": { - "targets": { - "dotnet": { - "package": "Amazon.CDK.AWS.HealthImaging" - }, - "java": { - "package": "services.healthimaging" - }, - "python": { - "module": "aws_cdk.aws_healthimaging" - } - } - }, - "aws-cdk-lib.aws_healthlake": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.HealthLake" - }, - "java": { - "package": "software.amazon.awscdk.services.healthlake" - }, - "python": { - "module": "aws_cdk.aws_healthlake" - } - } - }, - "aws-cdk-lib.aws_iam": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.IAM" - }, - "java": { - "package": "software.amazon.awscdk.services.iam" - }, - "python": { - "module": "aws_cdk.aws_iam" - } - } - }, - "aws-cdk-lib.aws_identitystore": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.IdentityStore" - }, - "java": { - "package": "software.amazon.awscdk.services.identitystore" - }, - "python": { - "module": "aws_cdk.aws_identitystore" - } - } - }, - "aws-cdk-lib.aws_imagebuilder": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.ImageBuilder" - }, - "java": { - "package": "software.amazon.awscdk.services.imagebuilder" - }, - "python": { - "module": "aws_cdk.aws_imagebuilder" - } - } - }, - "aws-cdk-lib.aws_inspector": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.Inspector" - }, - "java": { - "package": "software.amazon.awscdk.services.inspector" - }, - "python": { - "module": "aws_cdk.aws_inspector" - } - } - }, - "aws-cdk-lib.aws_inspectorv2": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.InspectorV2" - }, - "java": { - "package": "software.amazon.awscdk.services.inspectorv2" - }, - "python": { - "module": "aws_cdk.aws_inspectorv2" - } - } - }, - "aws-cdk-lib.aws_internetmonitor": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.InternetMonitor" - }, - "java": { - "package": "software.amazon.awscdk.services.internetmonitor" - }, - "python": { - "module": "aws_cdk.aws_internetmonitor" - } - } - }, - "aws-cdk-lib.aws_iot": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.IoT" - }, - "java": { - "package": "software.amazon.awscdk.services.iot" - }, - "python": { - "module": "aws_cdk.aws_iot" - } - } - }, - "aws-cdk-lib.aws_iot1click": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.IoT1Click" - }, - "java": { - "package": "software.amazon.awscdk.services.iot1click" - }, - "python": { - "module": "aws_cdk.aws_iot1click" - } - } - }, - "aws-cdk-lib.aws_iotanalytics": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.IoTAnalytics" - }, - "java": { - "package": "software.amazon.awscdk.services.iotanalytics" - }, - "python": { - "module": "aws_cdk.aws_iotanalytics" - } - } - }, - "aws-cdk-lib.aws_iotcoredeviceadvisor": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.IoTCoreDeviceAdvisor" - }, - "java": { - "package": "software.amazon.awscdk.services.iotcoredeviceadvisor" - }, - "python": { - "module": "aws_cdk.aws_iotcoredeviceadvisor" - } - } - }, - "aws-cdk-lib.aws_iotevents": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.IoTEvents" - }, - "java": { - "package": "software.amazon.awscdk.services.iotevents" - }, - "python": { - "module": "aws_cdk.aws_iotevents" - } - } - }, - "aws-cdk-lib.aws_iotfleethub": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.IoTFleetHub" - }, - "java": { - "package": "software.amazon.awscdk.services.iotfleethub" - }, - "python": { - "module": "aws_cdk.aws_iotfleethub" - } - } - }, - "aws-cdk-lib.aws_iotfleetwise": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.IoTFleetWise" - }, - "java": { - "package": "software.amazon.awscdk.services.iotfleetwise" - }, - "python": { - "module": "aws_cdk.aws_iotfleetwise" - } - } - }, - "aws-cdk-lib.aws_iotsitewise": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.IoTSiteWise" - }, - "java": { - "package": "software.amazon.awscdk.services.iotsitewise" - }, - "python": { - "module": "aws_cdk.aws_iotsitewise" - } - } - }, - "aws-cdk-lib.aws_iotthingsgraph": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.IoTThingsGraph" - }, - "java": { - "package": "software.amazon.awscdk.services.iotthingsgraph" - }, - "python": { - "module": "aws_cdk.aws_iotthingsgraph" - } - } - }, - "aws-cdk-lib.aws_iottwinmaker": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.IoTTwinMaker" - }, - "java": { - "package": "software.amazon.awscdk.services.iottwinmaker" - }, - "python": { - "module": "aws_cdk.aws_iottwinmaker" - } - } - }, - "aws-cdk-lib.aws_iotwireless": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.IoTWireless" - }, - "java": { - "package": "software.amazon.awscdk.services.iotwireless" - }, - "python": { - "module": "aws_cdk.aws_iotwireless" - } - } - }, - "aws-cdk-lib.aws_ivs": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.Ivs" - }, - "java": { - "package": "software.amazon.awscdk.services.ivs" - }, - "python": { - "module": "aws_cdk.aws_ivs" - } - } - }, - "aws-cdk-lib.aws_ivschat": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.IVSChat" - }, - "java": { - "package": "software.amazon.awscdk.services.ivschat" - }, - "python": { - "module": "aws_cdk.aws_ivschat" - } - } - }, - "aws-cdk-lib.aws_kafkaconnect": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.KafkaConnect" - }, - "java": { - "package": "software.amazon.awscdk.services.kafkaconnect" - }, - "python": { - "module": "aws_cdk.aws_kafkaconnect" - } - } - }, - "aws-cdk-lib.aws_kendra": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.Kendra" - }, - "java": { - "package": "software.amazon.awscdk.services.kendra" - }, - "python": { - "module": "aws_cdk.aws_kendra" - } - } - }, - "aws-cdk-lib.aws_kendraranking": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.KendraRanking" - }, - "java": { - "package": "software.amazon.awscdk.services.kendraranking" - }, - "python": { - "module": "aws_cdk.aws_kendraranking" - } - } - }, - "aws-cdk-lib.aws_kinesis": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.Kinesis" - }, - "java": { - "package": "software.amazon.awscdk.services.kinesis" - }, - "python": { - "module": "aws_cdk.aws_kinesis" - } - } - }, - "aws-cdk-lib.aws_kinesisanalytics": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.KinesisAnalytics" - }, - "java": { - "package": "software.amazon.awscdk.services.kinesisanalytics" - }, - "python": { - "module": "aws_cdk.aws_kinesisanalytics" - } - } - }, - "aws-cdk-lib.aws_kinesisanalyticsv2": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.KinesisAnalyticsV2" - }, - "java": { - "package": "software.amazon.awscdk.services.kinesisanalyticsv2" - }, - "python": { - "module": "aws_cdk.aws_kinesisanalyticsv2" - } - } - }, - "aws-cdk-lib.aws_kinesisfirehose": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.KinesisFirehose" - }, - "java": { - "package": "software.amazon.awscdk.services.kinesisfirehose" - }, - "python": { - "module": "aws_cdk.aws_kinesisfirehose" - } - } - }, - "aws-cdk-lib.aws_kinesisvideo": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.KinesisVideo" - }, - "java": { - "package": "software.amazon.awscdk.services.kinesisvideo" - }, - "python": { - "module": "aws_cdk.aws_kinesisvideo" - } - } - }, - "aws-cdk-lib.aws_kms": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.KMS" - }, - "java": { - "package": "software.amazon.awscdk.services.kms" - }, - "python": { - "module": "aws_cdk.aws_kms" - } - } - }, - "aws-cdk-lib.aws_lakeformation": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.LakeFormation" - }, - "java": { - "package": "software.amazon.awscdk.services.lakeformation" - }, - "python": { - "module": "aws_cdk.aws_lakeformation" - } - } - }, - "aws-cdk-lib.aws_lambda": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.Lambda" - }, - "java": { - "package": "software.amazon.awscdk.services.lambda" - }, - "python": { - "module": "aws_cdk.aws_lambda" - } - } - }, - "aws-cdk-lib.aws_lambda_destinations": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.Lambda.Destinations" - }, - "java": { - "package": "software.amazon.awscdk.services.lambda.destinations" - }, - "python": { - "module": "aws_cdk.aws_lambda_destinations" - } - } - }, - "aws-cdk-lib.aws_lambda_event_sources": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.Lambda.EventSources" - }, - "java": { - "package": "software.amazon.awscdk.services.lambda.eventsources" - }, - "python": { - "module": "aws_cdk.aws_lambda_event_sources" - } - } - }, - "aws-cdk-lib.aws_lambda_nodejs": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.Lambda.Nodejs" - }, - "java": { - "package": "software.amazon.awscdk.services.lambda.nodejs" - }, - "python": { - "module": "aws_cdk.aws_lambda_nodejs" - } - } - }, - "aws-cdk-lib.aws_lex": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.Lex" - }, - "java": { - "package": "software.amazon.awscdk.services.lex" - }, - "python": { - "module": "aws_cdk.aws_lex" - } - } - }, - "aws-cdk-lib.aws_licensemanager": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.LicenseManager" - }, - "java": { - "package": "software.amazon.awscdk.services.licensemanager" - }, - "python": { - "module": "aws_cdk.aws_licensemanager" - } - } - }, - "aws-cdk-lib.aws_lightsail": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.Lightsail" - }, - "java": { - "package": "software.amazon.awscdk.services.lightsail" - }, - "python": { - "module": "aws_cdk.aws_lightsail" - } - } - }, - "aws-cdk-lib.aws_location": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.Location" - }, - "java": { - "package": "software.amazon.awscdk.services.location" - }, - "python": { - "module": "aws_cdk.aws_location" - } - } - }, - "aws-cdk-lib.aws_logs": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.Logs" - }, - "java": { - "package": "software.amazon.awscdk.services.logs" - }, - "python": { - "module": "aws_cdk.aws_logs" - } - } - }, - "aws-cdk-lib.aws_logs_destinations": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.Logs.Destinations" - }, - "java": { - "package": "software.amazon.awscdk.services.logs.destinations" - }, - "python": { - "module": "aws_cdk.aws_logs_destinations" - } - } - }, - "aws-cdk-lib.aws_lookoutequipment": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.LookoutEquipment" - }, - "java": { - "package": "software.amazon.awscdk.services.lookoutequipment" - }, - "python": { - "module": "aws_cdk.aws_lookoutequipment" - } - } - }, - "aws-cdk-lib.aws_lookoutmetrics": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.LookoutMetrics" - }, - "java": { - "package": "software.amazon.awscdk.services.lookoutmetrics" - }, - "python": { - "module": "aws_cdk.aws_lookoutmetrics" - } - } - }, - "aws-cdk-lib.aws_lookoutvision": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.LookoutVision" - }, - "java": { - "package": "software.amazon.awscdk.services.lookoutvision" - }, - "python": { - "module": "aws_cdk.aws_lookoutvision" - } - } - }, - "aws-cdk-lib.aws_m2": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.M2" - }, - "java": { - "package": "software.amazon.awscdk.services.m2" - }, - "python": { - "module": "aws_cdk.aws_m2" - } - } - }, - "aws-cdk-lib.aws_macie": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.Macie" - }, - "java": { - "package": "software.amazon.awscdk.services.macie" - }, - "python": { - "module": "aws_cdk.aws_macie" - } - } - }, - "aws-cdk-lib.aws_managedblockchain": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.ManagedBlockchain" - }, - "java": { - "package": "software.amazon.awscdk.services.managedblockchain" - }, - "python": { - "module": "aws_cdk.aws_managedblockchain" - } - } - }, - "aws-cdk-lib.aws_mediaconnect": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.MediaConnect" - }, - "java": { - "package": "software.amazon.awscdk.services.mediaconnect" - }, - "python": { - "module": "aws_cdk.aws_mediaconnect" - } - } - }, - "aws-cdk-lib.aws_mediaconvert": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.MediaConvert" - }, - "java": { - "package": "software.amazon.awscdk.services.mediaconvert" - }, - "python": { - "module": "aws_cdk.aws_mediaconvert" - } - } - }, - "aws-cdk-lib.aws_medialive": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.MediaLive" - }, - "java": { - "package": "software.amazon.awscdk.services.medialive" - }, - "python": { - "module": "aws_cdk.aws_medialive" - } - } - }, - "aws-cdk-lib.aws_mediapackage": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.MediaPackage" - }, - "java": { - "package": "software.amazon.awscdk.services.mediapackage" - }, - "python": { - "module": "aws_cdk.aws_mediapackage" - } - } - }, - "aws-cdk-lib.aws_mediapackagev2": { - "targets": { - "dotnet": { - "package": "Amazon.CDK.AWS.MediaPackageV2" - }, - "java": { - "package": "services.mediapackagev2" - }, - "python": { - "module": "aws_cdk.aws_mediapackagev2" - } - } - }, - "aws-cdk-lib.aws_mediastore": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.MediaStore" - }, - "java": { - "package": "software.amazon.awscdk.services.mediastore" - }, - "python": { - "module": "aws_cdk.aws_mediastore" - } - } - }, - "aws-cdk-lib.aws_mediatailor": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.MediaTailor" - }, - "java": { - "package": "software.amazon.awscdk.services.mediatailor" - }, - "python": { - "module": "aws_cdk.aws_mediatailor" - } - } - }, - "aws-cdk-lib.aws_memorydb": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.MemoryDB" - }, - "java": { - "package": "software.amazon.awscdk.services.memorydb" - }, - "python": { - "module": "aws_cdk.aws_memorydb" - } - } - }, - "aws-cdk-lib.aws_msk": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.MSK" - }, - "java": { - "package": "software.amazon.awscdk.services.msk" - }, - "python": { - "module": "aws_cdk.aws_msk" - } - } - }, - "aws-cdk-lib.aws_mwaa": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.MWAA" - }, - "java": { - "package": "software.amazon.awscdk.services.mwaa" - }, - "python": { - "module": "aws_cdk.aws_mwaa" - } - } - }, - "aws-cdk-lib.aws_neptune": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.Neptune" - }, - "java": { - "package": "software.amazon.awscdk.services.neptune" - }, - "python": { - "module": "aws_cdk.aws_neptune" - } - } - }, - "aws-cdk-lib.aws_networkfirewall": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.NetworkFirewall" - }, - "java": { - "package": "software.amazon.awscdk.services.networkfirewall" - }, - "python": { - "module": "aws_cdk.aws_networkfirewall" - } - } - }, - "aws-cdk-lib.aws_networkmanager": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.NetworkManager" - }, - "java": { - "package": "software.amazon.awscdk.services.networkmanager" - }, - "python": { - "module": "aws_cdk.aws_networkmanager" - } - } - }, - "aws-cdk-lib.aws_nimblestudio": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.NimbleStudio" - }, - "java": { - "package": "software.amazon.awscdk.services.nimblestudio" - }, - "python": { - "module": "aws_cdk.aws_nimblestudio" - } - } - }, - "aws-cdk-lib.aws_oam": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.Oam" - }, - "java": { - "package": "software.amazon.awscdk.services.oam" - }, - "python": { - "module": "aws_cdk.aws_oam" - } - } - }, - "aws-cdk-lib.aws_omics": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.Omics" - }, - "java": { - "package": "software.amazon.awscdk.services.omics" - }, - "python": { - "module": "aws_cdk.aws_omics" - } - } - }, - "aws-cdk-lib.aws_opensearchserverless": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.OpenSearchServerless" - }, - "java": { - "package": "software.amazon.awscdk.services.opensearchserverless" - }, - "python": { - "module": "aws_cdk.aws_opensearchserverless" - } - } - }, - "aws-cdk-lib.aws_opensearchservice": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.OpenSearchService" - }, - "java": { - "package": "software.amazon.awscdk.services.opensearchservice" - }, - "python": { - "module": "aws_cdk.aws_opensearchservice" - } - } - }, - "aws-cdk-lib.aws_opsworks": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.OpsWorks" - }, - "java": { - "package": "software.amazon.awscdk.services.opsworks" - }, - "python": { - "module": "aws_cdk.aws_opsworks" - } - } - }, - "aws-cdk-lib.aws_opsworkscm": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.OpsWorksCM" - }, - "java": { - "package": "software.amazon.awscdk.services.opsworkscm" - }, - "python": { - "module": "aws_cdk.aws_opsworkscm" - } - } - }, - "aws-cdk-lib.aws_organizations": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.Organizations" - }, - "java": { - "package": "software.amazon.awscdk.services.organizations" - }, - "python": { - "module": "aws_cdk.aws_organizations" - } - } - }, - "aws-cdk-lib.aws_osis": { - "targets": { - "dotnet": { - "package": "Amazon.CDK.AWS.OSIS" - }, - "java": { - "package": "services.osis" - }, - "python": { - "module": "aws_cdk.aws_osis" - } - } - }, - "aws-cdk-lib.aws_panorama": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.Panorama" - }, - "java": { - "package": "software.amazon.awscdk.services.panorama" - }, - "python": { - "module": "aws_cdk.aws_panorama" - } - } - }, - "aws-cdk-lib.aws_pcaconnectorad": { - "targets": { - "dotnet": { - "package": "Amazon.CDK.AWS.PCAConnectorAD" - }, - "java": { - "package": "services.pcaconnectorad" - }, - "python": { - "module": "aws_cdk.aws_pcaconnectorad" - } - } - }, - "aws-cdk-lib.aws_personalize": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.Personalize" - }, - "java": { - "package": "software.amazon.awscdk.services.personalize" - }, - "python": { - "module": "aws_cdk.aws_personalize" - } - } - }, - "aws-cdk-lib.aws_pinpoint": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.Pinpoint" - }, - "java": { - "package": "software.amazon.awscdk.services.pinpoint" - }, - "python": { - "module": "aws_cdk.aws_pinpoint" - } - } - }, - "aws-cdk-lib.aws_pinpointemail": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.PinpointEmail" - }, - "java": { - "package": "software.amazon.awscdk.services.pinpointemail" - }, - "python": { - "module": "aws_cdk.aws_pinpointemail" - } - } - }, - "aws-cdk-lib.aws_pipes": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.Pipes" - }, - "java": { - "package": "software.amazon.awscdk.services.pipes" - }, - "python": { - "module": "aws_cdk.aws_pipes" - } - } - }, - "aws-cdk-lib.aws_proton": { - "targets": { - "dotnet": { - "package": "Amazon.CDK.AWS.Proton" - }, - "java": { - "package": "services.proton" - }, - "python": { - "module": "aws_cdk.aws_proton" - } - } - }, - "aws-cdk-lib.aws_qldb": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.QLDB" - }, - "java": { - "package": "software.amazon.awscdk.services.qldb" - }, - "python": { - "module": "aws_cdk.aws_qldb" - } - } - }, - "aws-cdk-lib.aws_quicksight": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.QuickSight" - }, - "java": { - "package": "software.amazon.awscdk.services.quicksight" - }, - "python": { - "module": "aws_cdk.aws_quicksight" - } - } - }, - "aws-cdk-lib.aws_ram": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.RAM" - }, - "java": { - "package": "software.amazon.awscdk.services.ram" - }, - "python": { - "module": "aws_cdk.aws_ram" - } - } - }, - "aws-cdk-lib.aws_rds": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.RDS" - }, - "java": { - "package": "software.amazon.awscdk.services.rds" - }, - "python": { - "module": "aws_cdk.aws_rds" - } - } - }, - "aws-cdk-lib.aws_redshift": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.Redshift" - }, - "java": { - "package": "software.amazon.awscdk.services.redshift" - }, - "python": { - "module": "aws_cdk.aws_redshift" - } - } - }, - "aws-cdk-lib.aws_redshiftserverless": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.RedshiftServerless" - }, - "java": { - "package": "software.amazon.awscdk.services.redshiftserverless" - }, - "python": { - "module": "aws_cdk.aws_redshiftserverless" - } - } - }, - "aws-cdk-lib.aws_refactorspaces": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.RefactorSpaces" - }, - "java": { - "package": "software.amazon.awscdk.services.refactorspaces" - }, - "python": { - "module": "aws_cdk.aws_refactorspaces" - } - } - }, - "aws-cdk-lib.aws_rekognition": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.Rekognition" - }, - "java": { - "package": "software.amazon.awscdk.services.rekognition" - }, - "python": { - "module": "aws_cdk.aws_rekognition" - } - } - }, - "aws-cdk-lib.aws_resiliencehub": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.ResilienceHub" - }, - "java": { - "package": "software.amazon.awscdk.services.resiliencehub" - }, - "python": { - "module": "aws_cdk.aws_resiliencehub" - } - } - }, - "aws-cdk-lib.aws_resourceexplorer2": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.ResourceExplorer2" - }, - "java": { - "package": "software.amazon.awscdk.services.resourceexplorer2" - }, - "python": { - "module": "aws_cdk.aws_resourceexplorer2" - } - } - }, - "aws-cdk-lib.aws_resourcegroups": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.ResourceGroups" - }, - "java": { - "package": "software.amazon.awscdk.services.resourcegroups" - }, - "python": { - "module": "aws_cdk.aws_resourcegroups" - } - } - }, - "aws-cdk-lib.aws_robomaker": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.RoboMaker" - }, - "java": { - "package": "software.amazon.awscdk.services.robomaker" - }, - "python": { - "module": "aws_cdk.aws_robomaker" - } - } - }, - "aws-cdk-lib.aws_rolesanywhere": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.RolesAnywhere" - }, - "java": { - "package": "software.amazon.awscdk.services.rolesanywhere" - }, - "python": { - "module": "aws_cdk.aws_rolesanywhere" - } - } - }, - "aws-cdk-lib.aws_route53": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.Route53" - }, - "java": { - "package": "software.amazon.awscdk.services.route53" - }, - "python": { - "module": "aws_cdk.aws_route53" - } - } - }, - "aws-cdk-lib.aws_route53_patterns": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.Route53.Patterns" - }, - "java": { - "package": "software.amazon.awscdk.services.route53.patterns" - }, - "python": { - "module": "aws_cdk.aws_route53_patterns" - } - } - }, - "aws-cdk-lib.aws_route53_targets": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.Route53.Targets" - }, - "java": { - "package": "software.amazon.awscdk.services.route53.targets" - }, - "python": { - "module": "aws_cdk.aws_route53_targets" - } - } - }, - "aws-cdk-lib.aws_route53recoverycontrol": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.Route53RecoveryControl" - }, - "java": { - "package": "software.amazon.awscdk.services.route53recoverycontrol" - }, - "python": { - "module": "aws_cdk.aws_route53recoverycontrol" - } - } - }, - "aws-cdk-lib.aws_route53recoveryreadiness": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.Route53RecoveryReadiness" - }, - "java": { - "package": "software.amazon.awscdk.services.route53recoveryreadiness" - }, - "python": { - "module": "aws_cdk.aws_route53recoveryreadiness" - } - } - }, - "aws-cdk-lib.aws_route53resolver": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.Route53Resolver" - }, - "java": { - "package": "software.amazon.awscdk.services.route53resolver" - }, - "python": { - "module": "aws_cdk.aws_route53resolver" - } - } - }, - "aws-cdk-lib.aws_rum": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.RUM" - }, - "java": { - "package": "software.amazon.awscdk.services.rum" - }, - "python": { - "module": "aws_cdk.aws_rum" - } - } - }, - "aws-cdk-lib.aws_s3": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.S3" - }, - "java": { - "package": "software.amazon.awscdk.services.s3" - }, - "python": { - "module": "aws_cdk.aws_s3" - } - } - }, - "aws-cdk-lib.aws_s3_assets": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.S3.Assets" - }, - "java": { - "package": "software.amazon.awscdk.services.s3.assets" - }, - "python": { - "module": "aws_cdk.aws_s3_assets" - } - } - }, - "aws-cdk-lib.aws_s3_deployment": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.S3.Deployment" - }, - "java": { - "package": "software.amazon.awscdk.services.s3.deployment" - }, - "python": { - "module": "aws_cdk.aws_s3_deployment" - } - } - }, - "aws-cdk-lib.aws_s3_notifications": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.S3.Notifications" - }, - "java": { - "package": "software.amazon.awscdk.services.s3.notifications" - }, - "python": { - "module": "aws_cdk.aws_s3_notifications" - } - } - }, - "aws-cdk-lib.aws_s3objectlambda": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.S3ObjectLambda" - }, - "java": { - "package": "software.amazon.awscdk.services.s3objectlambda" - }, - "python": { - "module": "aws_cdk.aws_s3objectlambda" - } - } - }, - "aws-cdk-lib.aws_s3outposts": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.S3Outposts" - }, - "java": { - "package": "software.amazon.awscdk.services.s3outposts" - }, - "python": { - "module": "aws_cdk.aws_s3outposts" - } - } - }, - "aws-cdk-lib.aws_sagemaker": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.Sagemaker" - }, - "java": { - "package": "software.amazon.awscdk.services.sagemaker" - }, - "python": { - "module": "aws_cdk.aws_sagemaker" - } - } - }, - "aws-cdk-lib.aws_sam": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.SAM" - }, - "java": { - "package": "software.amazon.awscdk.services.sam" - }, - "python": { - "module": "aws_cdk.aws_sam" - } - } - }, - "aws-cdk-lib.aws_scheduler": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.Scheduler" - }, - "java": { - "package": "software.amazon.awscdk.services.scheduler" - }, - "python": { - "module": "aws_cdk.aws_scheduler" - } - } - }, - "aws-cdk-lib.aws_sdb": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.SDB" - }, - "java": { - "package": "software.amazon.awscdk.services.sdb" - }, - "python": { - "module": "aws_cdk.aws_sdb" - } - } - }, - "aws-cdk-lib.aws_secretsmanager": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.SecretsManager" - }, - "java": { - "package": "software.amazon.awscdk.services.secretsmanager" - }, - "python": { - "module": "aws_cdk.aws_secretsmanager" - } - } - }, - "aws-cdk-lib.aws_securityhub": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.SecurityHub" - }, - "java": { - "package": "software.amazon.awscdk.services.securityhub" - }, - "python": { - "module": "aws_cdk.aws_securityhub" - } - } - }, - "aws-cdk-lib.aws_servicecatalog": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.Servicecatalog" - }, - "java": { - "package": "software.amazon.awscdk.services.servicecatalog" - }, - "python": { - "module": "aws_cdk.aws_servicecatalog" - } - } - }, - "aws-cdk-lib.aws_servicecatalogappregistry": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.Servicecatalogappregistry" - }, - "java": { - "package": "software.amazon.awscdk.services.servicecatalogappregistry" - }, - "python": { - "module": "aws_cdk.aws_servicecatalogappregistry" - } - } - }, - "aws-cdk-lib.aws_servicediscovery": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.ServiceDiscovery" - }, - "java": { - "package": "software.amazon.awscdk.services.servicediscovery" - }, - "python": { - "module": "aws_cdk.aws_servicediscovery" - } - } - }, - "aws-cdk-lib.aws_ses": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.SES" - }, - "java": { - "package": "software.amazon.awscdk.services.ses" - }, - "python": { - "module": "aws_cdk.aws_ses" - } - } - }, - "aws-cdk-lib.aws_ses_actions": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.SES.Actions" - }, - "java": { - "package": "software.amazon.awscdk.services.ses.actions" - }, - "python": { - "module": "aws_cdk.aws_ses_actions" - } - } - }, - "aws-cdk-lib.aws_shield": { - "targets": { - "dotnet": { - "package": "Amazon.CDK.AWS.Shield" - }, - "java": { - "package": "services.shield" - }, - "python": { - "module": "aws_cdk.aws_shield" - } - } - }, - "aws-cdk-lib.aws_signer": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.Signer" - }, - "java": { - "package": "software.amazon.awscdk.services.signer" - }, - "python": { - "module": "aws_cdk.aws_signer" - } - } - }, - "aws-cdk-lib.aws_simspaceweaver": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.SimSpaceWeaver" - }, - "java": { - "package": "software.amazon.awscdk.services.simspaceweaver" - }, - "python": { - "module": "aws_cdk.aws_simspaceweaver" - } - } - }, - "aws-cdk-lib.aws_sns": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.SNS" - }, - "java": { - "package": "software.amazon.awscdk.services.sns" - }, - "python": { - "module": "aws_cdk.aws_sns" - } - } - }, - "aws-cdk-lib.aws_sns_subscriptions": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.SNS.Subscriptions" - }, - "java": { - "package": "software.amazon.awscdk.services.sns.subscriptions" - }, - "python": { - "module": "aws_cdk.aws_sns_subscriptions" - } - } - }, - "aws-cdk-lib.aws_sqs": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.SQS" - }, - "java": { - "package": "software.amazon.awscdk.services.sqs" - }, - "python": { - "module": "aws_cdk.aws_sqs" - } - } - }, - "aws-cdk-lib.aws_ssm": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.SSM" - }, - "java": { - "package": "software.amazon.awscdk.services.ssm" - }, - "python": { - "module": "aws_cdk.aws_ssm" - } - } - }, - "aws-cdk-lib.aws_ssmcontacts": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.SSMContacts" - }, - "java": { - "package": "software.amazon.awscdk.services.ssmcontacts" - }, - "python": { - "module": "aws_cdk.aws_ssmcontacts" - } - } - }, - "aws-cdk-lib.aws_ssmincidents": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.SSMIncidents" - }, - "java": { - "package": "software.amazon.awscdk.services.ssmincidents" - }, - "python": { - "module": "aws_cdk.aws_ssmincidents" - } - } - }, - "aws-cdk-lib.aws_sso": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.SSO" - }, - "java": { - "package": "software.amazon.awscdk.services.sso" - }, - "python": { - "module": "aws_cdk.aws_sso" - } - } - }, - "aws-cdk-lib.aws_stepfunctions": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.StepFunctions" - }, - "java": { - "package": "software.amazon.awscdk.services.stepfunctions" - }, - "python": { - "module": "aws_cdk.aws_stepfunctions" - } - } - }, - "aws-cdk-lib.aws_stepfunctions_tasks": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.StepFunctions.Tasks" - }, - "java": { - "package": "software.amazon.awscdk.services.stepfunctions.tasks" - }, - "python": { - "module": "aws_cdk.aws_stepfunctions_tasks" - } - } - }, - "aws-cdk-lib.aws_supportapp": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.SupportApp" - }, - "java": { - "package": "software.amazon.awscdk.services.supportapp" - }, - "python": { - "module": "aws_cdk.aws_supportapp" - } - } - }, - "aws-cdk-lib.aws_synthetics": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.Synthetics" - }, - "java": { - "package": "software.amazon.awscdk.services.synthetics" - }, - "python": { - "module": "aws_cdk.aws_synthetics" - } - } - }, - "aws-cdk-lib.aws_systemsmanagersap": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.SystemsManagerSAP" - }, - "java": { - "package": "software.amazon.awscdk.services.systemsmanagersap" - }, - "python": { - "module": "aws_cdk.aws_systemsmanagersap" - } - } - }, - "aws-cdk-lib.aws_timestream": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.Timestream" - }, - "java": { - "package": "software.amazon.awscdk.services.timestream" - }, - "python": { - "module": "aws_cdk.aws_timestream" - } - } - }, - "aws-cdk-lib.aws_transfer": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.Transfer" - }, - "java": { - "package": "software.amazon.awscdk.services.transfer" - }, - "python": { - "module": "aws_cdk.aws_transfer" - } - } - }, - "aws-cdk-lib.aws_verifiedpermissions": { - "targets": { - "dotnet": { - "package": "Amazon.CDK.AWS.VerifiedPermissions" - }, - "java": { - "package": "services.verifiedpermissions" - }, - "python": { - "module": "aws_cdk.aws_verifiedpermissions" - } - } - }, - "aws-cdk-lib.aws_voiceid": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.VoiceID" - }, - "java": { - "package": "software.amazon.awscdk.services.voiceid" - }, - "python": { - "module": "aws_cdk.aws_voiceid" - } - } - }, - "aws-cdk-lib.aws_vpclattice": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.VpcLattice" - }, - "java": { - "package": "software.amazon.awscdk.services.vpclattice" - }, - "python": { - "module": "aws_cdk.aws_vpclattice" - } - } - }, - "aws-cdk-lib.aws_waf": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.WAF" - }, - "java": { - "package": "software.amazon.awscdk.services.waf" - }, - "python": { - "module": "aws_cdk.aws_waf" - } - } - }, - "aws-cdk-lib.aws_wafregional": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.WAFRegional" - }, - "java": { - "package": "software.amazon.awscdk.services.waf.regional" - }, - "python": { - "module": "aws_cdk.aws_wafregional" - } - } - }, - "aws-cdk-lib.aws_wafv2": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.WAFv2" - }, - "java": { - "package": "software.amazon.awscdk.services.wafv2" - }, - "python": { - "module": "aws_cdk.aws_wafv2" - } - } - }, - "aws-cdk-lib.aws_wisdom": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.Wisdom" - }, - "java": { - "package": "software.amazon.awscdk.services.wisdom" - }, - "python": { - "module": "aws_cdk.aws_wisdom" - } - } - }, - "aws-cdk-lib.aws_workspaces": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.WorkSpaces" - }, - "java": { - "package": "software.amazon.awscdk.services.workspaces" - }, - "python": { - "module": "aws_cdk.aws_workspaces" - } - } - }, - "aws-cdk-lib.aws_workspacesweb": { - "targets": { - "dotnet": { - "package": "Amazon.CDK.AWS.WorkSpacesWeb" - }, - "java": { - "package": "services.workspacesweb" - }, - "python": { - "module": "aws_cdk.aws_workspacesweb" - } - } - }, - "aws-cdk-lib.aws_xray": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.AWS.XRay" - }, - "java": { - "package": "software.amazon.awscdk.services.xray" - }, - "python": { - "module": "aws_cdk.aws_xray" - } - } - }, - "aws-cdk-lib.cloud_assembly_schema": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.CloudAssembly.Schema" - }, - "java": { - "package": "software.amazon.awscdk.cloudassembly.schema" - }, - "python": { - "module": "aws_cdk.cloud_assembly_schema" - } - } - }, - "aws-cdk-lib.cloudformation_include": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.CloudFormation.Include" - }, - "java": { - "package": "software.amazon.awscdk.cloudformation.include" - }, - "python": { - "module": "aws_cdk.cloudformation_include" - } - } - }, - "aws-cdk-lib.custom_resources": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.CustomResources" - }, - "java": { - "package": "software.amazon.awscdk.customresources" - }, - "python": { - "module": "aws_cdk.custom_resources" - } - } - }, - "aws-cdk-lib.cx_api": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.CXAPI" - }, - "java": { - "package": "software.amazon.awscdk.cxapi" - }, - "python": { - "module": "aws_cdk.cx_api" - } - } - }, - "aws-cdk-lib.lambda_layer_awscli": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.LambdaLayer.AwsCli" - }, - "java": { - "package": "software.amazon.awscdk.lambdalayer.awscli" - }, - "python": { - "module": "aws_cdk.lambda_layer_awscli" - } - } - }, - "aws-cdk-lib.lambda_layer_kubectl": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.LambdaLayer.Kubectl" - }, - "java": { - "package": "software.amazon.awscdk.lambdalayer.kubectl" - }, - "python": { - "module": "aws_cdk.lambda_layer_kubectl" - } - } - }, - "aws-cdk-lib.lambda_layer_node_proxy_agent": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.LambdaLayer.NodeProxyAgent" - }, - "java": { - "package": "software.amazon.awscdk.lambda.layer.node.proxy.agent" - }, - "python": { - "module": "aws_cdk.lambda_layer_node_proxy_agent" - } - } - }, - "aws-cdk-lib.pipelines": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.Pipelines" - }, - "java": { - "package": "software.amazon.awscdk.pipelines" - }, - "python": { - "module": "aws_cdk.pipelines" - } - } - }, - "aws-cdk-lib.region_info": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.RegionInfo" - }, - "java": { - "package": "software.amazon.awscdk.regioninfo" - }, - "python": { - "module": "aws_cdk.region_info" - } - } - }, - "aws-cdk-lib.triggers": { - "targets": { - "dotnet": { - "namespace": "Amazon.CDK.Triggers" - }, - "java": { - "package": "software.amazon.awscdk.triggers" - }, - "python": { - "module": "aws_cdk.triggers" - } - } - } - }, - "targets": { - "dotnet": { - "iconUrl": "https://raw.githubusercontent.com/aws/aws-cdk/main/logo/default-256-dark.png", - "namespace": "Amazon.CDK", - "packageId": "Amazon.CDK.Lib" - }, - "go": { - "moduleName": "github.com/aws/aws-cdk-go", - "packageName": "awscdk" - }, - "java": { - "maven": { - "artifactId": "aws-cdk-lib", - "groupId": "software.amazon.awscdk" - }, - "package": "software.amazon.awscdk" - }, - "js": { - "npm": "aws-cdk-lib" - }, - "python": { - "distName": "aws-cdk-lib", - "module": "aws_cdk" - } - } - }, - "constructs": { - "targets": { - "dotnet": { - "namespace": "Constructs", - "packageId": "Constructs" - }, - "go": { - "moduleName": "github.com/aws/constructs-go" - }, - "java": { - "maven": { - "artifactId": "constructs", - "groupId": "software.constructs" - }, - "package": "software.constructs" - }, - "js": { - "npm": "constructs" - }, - "python": { - "distName": "constructs", - "module": "constructs" - } - } - } - }, - "description": "This module is deprecated. All constructs are now available under aws-cdk-lib/aws-synthetics", - "docs": { - "stability": "deprecated" - }, - "homepage": "https://github.com/aws/aws-cdk", - "jsiiVersion": "5.2.9 (build 00bbc31)", - "keywords": [ - "aws", - "cdk", - "constructs", - "AWS::Synthetics", - "aws-synthetics" - ], - "license": "Apache-2.0", - "metadata": { - "jsii": { - "compiledWithDeprecationWarnings": true, - "pacmak": { - "hasDefaultInterfaces": true - }, - "rosetta": { - "strict": true - } - } - }, - "name": "@aws-cdk/aws-synthetics-alpha", - "readme": { - "markdown": "# Amazon CloudWatch Synthetics Construct Library\n\n\n---\n\n![Deprecated](https://img.shields.io/badge/deprecated-critical.svg?style=for-the-badge)\n\n> This API may emit warnings. Backward compatibility is not guaranteed.\n\n---\n\n\n\nAll constructs moved to aws-cdk-lib/aws-synthetics.\n\nAmazon CloudWatch Synthetics allow you to monitor your application by generating **synthetic** traffic. The traffic is produced by a **canary**: a configurable script that runs on a schedule. You configure the canary script to follow the same routes and perform the same actions as a user, which allows you to continually verify your user experience even when you don't have any traffic on your applications.\n\n## Canary\n\nTo illustrate how to use a canary, assume your application defines the following endpoint:\n\n```console\n% curl \"https://api.example.com/user/books/topbook/\"\nThe Hitchhikers Guide to the Galaxy\n```\n\nThe below code defines a canary that will hit the `books/topbook` endpoint every 5 minutes:\n\n```ts\nconst canary = new synthetics.Canary(this, 'MyCanary', {\n schedule: synthetics.Schedule.rate(Duration.minutes(5)),\n test: synthetics.Test.custom({\n code: synthetics.Code.fromAsset(path.join(__dirname, 'canary')),\n handler: 'index.handler',\n }),\n runtime: synthetics.Runtime.SYNTHETICS_NODEJS_PUPPETEER_4_0,\n environmentVariables: {\n stage: 'prod',\n },\n});\n```\n\nThe following is an example of an `index.js` file which exports the `handler` function:\n\n```js\nconst synthetics = require('Synthetics');\nconst log = require('SyntheticsLogger');\n\nconst pageLoadBlueprint = async function () {\n // Configure the stage of the API using environment variables\n const url = `https://api.example.com/${process.env.stage}/user/books/topbook/`;\n\n const page = await synthetics.getPage();\n const response = await page.goto(url, { waitUntil: 'domcontentloaded', timeout: 30000 });\n // Wait for page to render. Increase or decrease wait time based on endpoint being monitored.\n await page.waitFor(15000);\n // This will take a screenshot that will be included in test output artifacts.\n await synthetics.takeScreenshot('loaded', 'loaded');\n const pageTitle = await page.title();\n log.info('Page title: ' + pageTitle);\n if (response.status() !== 200) {\n throw 'Failed to load page!';\n }\n};\n\nexports.handler = async () => {\n return await pageLoadBlueprint();\n};\n```\n\n> **Note:** The function **must** be called `handler`.\n\nThe canary will automatically produce a CloudWatch Dashboard:\n\n![UI Screenshot](images/ui-screenshot.png)\n\nThe Canary code will be executed in a lambda function created by Synthetics on your behalf. The Lambda function includes a custom [runtime](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Canaries_Library.html) provided by Synthetics. The provided runtime includes a variety of handy tools such as [Puppeteer](https://www.npmjs.com/package/puppeteer-core) (for nodejs based one) and Chromium.\n\nTo learn more about Synthetics capabilities, check out the [docs](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Canaries.html).\n\n### Canary Schedule\n\nYou can specify the schedule on which a canary runs by providing a\n[`Schedule`](https://docs.aws.amazon.com/cdk/api/latest/docs/@aws-cdk_aws-synthetics.Schedule.html)\nobject to the `schedule` property.\n\nConfigure a run rate of up to 60 minutes with `Schedule.rate`:\n\n```ts\nconst schedule = synthetics.Schedule.rate(Duration.minutes(5)); // Runs every 5 minutes.\n```\n\nYou can also specify a [cron expression](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Canaries_cron.html) with `Schedule.cron`:\n\n```ts\nconst schedule = synthetics.Schedule.cron({\n hour: '0,8,16', // Run at 12am, 8am, 4pm UTC every day\n});\n```\n\nIf you want the canary to run just once upon deployment, you can use `Schedule.once()`.\n\n### Deleting underlying resources on canary deletion\n\nWhen you delete a lambda, the following underlying resources are isolated in your AWS account:\n\n - Lambda Function that runs your canary script\n - S3 Bucket for artifact storage\n - IAM roles and policies\n - Log Groups in CloudWatch Logs.\n\nTo learn more about these underlying resources, see\n[Synthetics Canaries Deletion](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/synthetics_canaries_deletion.html).\n\nIn the CDK, you can configure your canary to delete the underlying lambda function when the canary is deleted.\nThis can be provisioned by setting `cleanup: Cleanup.LAMBDA`. Note that this\nwill create a custom resource under the hood that takes care of the lambda deletion for you.\n\n```ts\nconst canary = new synthetics.Canary(this, 'Canary', {\n test: synthetics.Test.custom({\n handler: 'index.handler',\n code: synthetics.Code.fromInline('/* Synthetics handler code'),\n }),\n cleanup: synthetics.Cleanup.LAMBDA,\n runtime: synthetics.Runtime.SYNTHETICS_NODEJS_PUPPETEER_4_0,\n});\n```\n\n> Note: To properly clean up your canary on deletion, you still have to manually delete other resources\n> like S3 buckets and CloudWatch logs.\n\n### Configuring the Canary Script\n\nTo configure the script the canary executes, use the `test` property. The `test` property accepts a `Test` instance that can be initialized by the `Test` class static methods. Currently, the only implemented method is `Test.custom()`, which allows you to bring your own code. In the future, other methods will be added. `Test.custom()` accepts `code` and `handler` properties -- both are required by Synthetics to create a lambda function on your behalf.\n\nThe `synthetics.Code` class exposes static methods to bundle your code artifacts:\n\n - `code.fromInline(code)` - specify an inline script.\n - `code.fromAsset(path)` - specify a .zip file or a directory in the local filesystem which will be zipped and uploaded to S3 on deployment. See the above Note for directory structure.\n - `code.fromBucket(bucket, key[, objectVersion])` - specify an S3 object that contains the .zip file of your runtime code. See the above Note for directory structure.\n\nUsing the `Code` class static initializers:\n\n```ts\n// To supply the code inline:\nnew synthetics.Canary(this, 'Inline Canary', {\n test: synthetics.Test.custom({\n code: synthetics.Code.fromInline('/* Synthetics handler code */'),\n handler: 'index.handler', // must be 'index.handler'\n }),\n runtime: synthetics.Runtime.SYNTHETICS_NODEJS_PUPPETEER_4_0,\n});\n\n// To supply the code from your local filesystem:\nnew synthetics.Canary(this, 'Asset Canary', {\n test: synthetics.Test.custom({\n code: synthetics.Code.fromAsset(path.join(__dirname, 'canary')),\n handler: 'index.handler', // must end with '.handler'\n }),\n runtime: synthetics.Runtime.SYNTHETICS_NODEJS_PUPPETEER_4_0,\n});\n\n// To supply the code from a S3 bucket:\nimport * as s3 from 'aws-cdk-lib/aws-s3';\nconst bucket = new s3.Bucket(this, 'Code Bucket');\nnew synthetics.Canary(this, 'Bucket Canary', {\n test: synthetics.Test.custom({\n code: synthetics.Code.fromBucket(bucket, 'canary.zip'),\n handler: 'index.handler', // must end with '.handler'\n }),\n runtime: synthetics.Runtime.SYNTHETICS_NODEJS_PUPPETEER_4_0,\n});\n```\n\n> **Note:** Synthetics have a specified folder structure for canaries. For Node scripts supplied via `code.fromAsset()` or `code.fromBucket()`, the canary resource requires the following folder structure:\n>\n> ```plaintext\n> canary/\n> ├── nodejs/\n> ├── node_modules/\n> ├── .js\n> ```\n>\n>\n> For Python scripts supplied via `code.fromAsset()` or `code.fromBucket()`, the canary resource requires the following folder structure:\n>\n> ```plaintext\n> canary/\n> ├── python/\n> ├── .py\n> ```\n>\n> See Synthetics [docs](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Canaries_WritingCanary.html).\n\n### Running a canary on a VPC\n\nYou can specify what [VPC a canary executes in](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Canaries_VPC.html).\nThis can allow for monitoring services that may be internal to a specific VPC. To place a canary within a VPC, you can specify the `vpc` property with the desired `VPC` to place then canary in.\nThis will automatically attach the appropriate IAM permissions to attach to the VPC. This will also create a Security Group and attach to the default subnets for the VPC unless specified via `vpcSubnets` and `securityGroups`.\n\n```ts\nimport * as ec2 from 'aws-cdk-lib/aws-ec2';\n\ndeclare const vpc: ec2.IVpc;\nnew synthetics.Canary(this, 'Vpc Canary', {\n test: synthetics.Test.custom({\n code: synthetics.Code.fromAsset(path.join(__dirname, 'canary')),\n handler: 'index.handler',\n }),\n runtime: synthetics.Runtime.SYNTHETICS_NODEJS_PUPPETEER_4_0,\n vpc,\n});\n```\n\n> **Note:** By default, the Synthetics runtime needs access to the S3 and CloudWatch APIs, which will fail in a private subnet without internet access enabled (e.g. an isolated subnnet).\n>\n> Ensure that the Canary is placed in a VPC either with internet connectivity or with VPC Endpoints for S3 and CloudWatch enabled and configured.\n>\n> See [Synthetics VPC docs](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Canaries_VPC.html).\n\n### Alarms\n\nYou can configure a CloudWatch Alarm on a canary metric. Metrics are emitted by CloudWatch automatically and can be accessed by the following APIs:\n\n- `canary.metricSuccessPercent()` - percentage of successful canary runs over a given time\n- `canary.metricDuration()` - how much time each canary run takes, in seconds.\n- `canary.metricFailed()` - number of failed canary runs over a given time\n\nCreate an alarm that tracks the canary metric:\n\n```ts\nimport * as cloudwatch from 'aws-cdk-lib/aws-cloudwatch';\n\ndeclare const canary: synthetics.Canary;\nnew cloudwatch.Alarm(this, 'CanaryAlarm', {\n metric: canary.metricSuccessPercent(),\n evaluationPeriods: 2,\n threshold: 90,\n comparisonOperator: cloudwatch.ComparisonOperator.LESS_THAN_THRESHOLD,\n});\n```\n\n### Artifacts\n\nYou can pass an S3 bucket to store artifacts from canary runs. If you do not,\none will be auto-generated when the canary is created. You may add\n[lifecycle rules](https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-lifecycle-mgmt.html)\nto the auto-generated bucket.\n\n```ts\nconst canary = new synthetics.Canary(this, 'MyCanary', {\n schedule: synthetics.Schedule.rate(Duration.minutes(5)),\n test: synthetics.Test.custom({\n code: synthetics.Code.fromAsset(path.join(__dirname, 'canary')),\n handler: 'index.handler',\n }),\n runtime: synthetics.Runtime.SYNTHETICS_NODEJS_PUPPETEER_4_0,\n artifactsBucketLifecycleRules: [{\n expiration: Duration.days(30),\n }],\n});\n```\n" - }, - "repository": { - "directory": "packages/@aws-cdk/aws-synthetics-alpha", - "type": "git", - "url": "https://github.com/aws/aws-cdk.git" - }, - "schema": "jsii/0.10.0", - "targets": { - "dotnet": { - "iconUrl": "https://raw.githubusercontent.com/aws/aws-cdk/main/logo/default-256-dark.png", - "namespace": "Amazon.CDK.AWS.Synthetics.Alpha", - "packageId": "Amazon.CDK.AWS.Synthetics.Alpha" - }, - "go": { - "moduleName": "github.com/aws/aws-cdk-go", - "packageName": "awscdksyntheticsalpha" - }, - "java": { - "maven": { - "artifactId": "synthetics-alpha", - "groupId": "software.amazon.awscdk" - }, - "package": "software.amazon.awscdk.services.synthetics.alpha" - }, - "js": { - "npm": "@aws-cdk/aws-synthetics-alpha" - }, - "python": { - "classifiers": [ - "Framework :: AWS CDK", - "Framework :: AWS CDK :: 2" - ], - "distName": "aws-cdk.aws-synthetics-alpha", - "module": "aws_cdk.aws_synthetics_alpha" - } - }, - "types": { - "@aws-cdk/aws-synthetics-alpha.ArtifactsBucketLocation": { - "assembly": "@aws-cdk/aws-synthetics-alpha", - "datatype": true, - "docs": { - "remarks": "The artifacts bucket location **cannot**\nbe updated once the canary is created.", - "stability": "deprecated", - "summary": "Options for specifying the s3 location that stores the data of each canary run." - }, - "fqn": "@aws-cdk/aws-synthetics-alpha.ArtifactsBucketLocation", - "kind": "interface", - "locationInModule": { - "filename": "lib/canary.ts", - "line": 81 - }, - "name": "ArtifactsBucketLocation", - "properties": [ - { - "abstract": true, - "docs": { - "stability": "deprecated", - "summary": "The s3 location that stores the data of each run." - }, - "immutable": true, - "locationInModule": { - "filename": "lib/canary.ts", - "line": 85 - }, - "name": "bucket", - "type": { - "fqn": "aws-cdk-lib.aws_s3.IBucket" - } - }, - { - "abstract": true, - "docs": { - "default": "- no prefix", - "remarks": "Specify this if you want a more specific path within the artifacts bucket.", - "stability": "deprecated", - "summary": "The S3 bucket prefix." - }, - "immutable": true, - "locationInModule": { - "filename": "lib/canary.ts", - "line": 92 - }, - "name": "prefix", - "optional": true, - "type": { - "primitive": "string" - } - } - ], - "symbolId": "lib/canary:ArtifactsBucketLocation" - }, - "@aws-cdk/aws-synthetics-alpha.AssetCode": { - "assembly": "@aws-cdk/aws-synthetics-alpha", - "base": "@aws-cdk/aws-synthetics-alpha.Code", - "docs": { - "stability": "deprecated", - "summary": "Canary code from an Asset." - }, - "fqn": "@aws-cdk/aws-synthetics-alpha.AssetCode", - "initializer": { - "docs": { - "stability": "deprecated" - }, - "locationInModule": { - "filename": "lib/code.ts", - "line": 92 - }, - "parameters": [ - { - "docs": { - "summary": "The path to the asset file or directory." - }, - "name": "assetPath", - "type": { - "primitive": "string" - } - }, - { - "name": "options", - "optional": true, - "type": { - "fqn": "aws-cdk-lib.aws_s3_assets.AssetOptions" - } - } - ] - }, - "kind": "class", - "locationInModule": { - "filename": "lib/code.ts", - "line": 86 - }, - "methods": [ - { - "docs": { - "stability": "deprecated", - "summary": "Called when the canary is initialized to allow this object to bind to the stack, add resources and have fun." - }, - "locationInModule": { - "filename": "lib/code.ts", - "line": 100 - }, - "name": "bind", - "overrides": "@aws-cdk/aws-synthetics-alpha.Code", - "parameters": [ - { - "name": "scope", - "type": { - "fqn": "constructs.Construct" - } - }, - { - "name": "handler", - "type": { - "primitive": "string" - } - }, - { - "name": "family", - "type": { - "fqn": "@aws-cdk/aws-synthetics-alpha.RuntimeFamily" - } - } - ], - "returns": { - "type": { - "fqn": "@aws-cdk/aws-synthetics-alpha.CodeConfig" - } - } - } - ], - "name": "AssetCode", - "symbolId": "lib/code:AssetCode" - }, - "@aws-cdk/aws-synthetics-alpha.Canary": { - "assembly": "@aws-cdk/aws-synthetics-alpha", - "base": "aws-cdk-lib.Resource", - "docs": { - "stability": "deprecated", - "summary": "Define a new Canary." - }, - "fqn": "@aws-cdk/aws-synthetics-alpha.Canary", - "initializer": { - "docs": { - "stability": "deprecated" - }, - "locationInModule": { - "filename": "lib/canary.ts", - "line": 286 - }, - "parameters": [ - { - "name": "scope", - "type": { - "fqn": "constructs.Construct" - } - }, - { - "name": "id", - "type": { - "primitive": "string" - } - }, - { - "name": "props", - "type": { - "fqn": "@aws-cdk/aws-synthetics-alpha.CanaryProps" - } - } - ] - }, - "interfaces": [ - "aws-cdk-lib.aws_ec2.IConnectable" - ], - "kind": "class", - "locationInModule": { - "filename": "lib/canary.ts", - "line": 248 - }, - "methods": [ - { - "docs": { - "default": "avg over 5 minutes", - "stability": "deprecated", - "summary": "Measure the Duration of a single canary run, in seconds." - }, - "locationInModule": { - "filename": "lib/canary.ts", - "line": 387 - }, - "name": "metricDuration", - "parameters": [ - { - "docs": { - "summary": "- configuration options for the metric." - }, - "name": "options", - "optional": true, - "type": { - "fqn": "aws-cdk-lib.aws_cloudwatch.MetricOptions" - } - } - ], - "returns": { - "type": { - "fqn": "aws-cdk-lib.aws_cloudwatch.Metric" - } - } - }, - { - "docs": { - "remarks": "Default: sum over 5 minutes", - "stability": "deprecated", - "summary": "Measure the number of failed canary runs over a given time period." - }, - "locationInModule": { - "filename": "lib/canary.ts", - "line": 413 - }, - "name": "metricFailed", - "parameters": [ - { - "docs": { - "summary": "- configuration options for the metric." - }, - "name": "options", - "optional": true, - "type": { - "fqn": "aws-cdk-lib.aws_cloudwatch.MetricOptions" - } - } - ], - "returns": { - "type": { - "fqn": "aws-cdk-lib.aws_cloudwatch.Metric" - } - } - }, - { - "docs": { - "default": "avg over 5 minutes", - "stability": "deprecated", - "summary": "Measure the percentage of successful canary runs." - }, - "locationInModule": { - "filename": "lib/canary.ts", - "line": 402 - }, - "name": "metricSuccessPercent", - "parameters": [ - { - "docs": { - "summary": "- configuration options for the metric." - }, - "name": "options", - "optional": true, - "type": { - "fqn": "aws-cdk-lib.aws_cloudwatch.MetricOptions" - } - } - ], - "returns": { - "type": { - "fqn": "aws-cdk-lib.aws_cloudwatch.Metric" - } - } - } - ], - "name": "Canary", - "properties": [ - { - "docs": { - "stability": "deprecated", - "summary": "Bucket where data from each canary run is stored." - }, - "immutable": true, - "locationInModule": { - "filename": "lib/canary.ts", - "line": 275 - }, - "name": "artifactsBucket", - "type": { - "fqn": "aws-cdk-lib.aws_s3.IBucket" - } - }, - { - "docs": { - "custom": { - "attribute": "true" - }, - "stability": "deprecated", - "summary": "The canary ID." - }, - "immutable": true, - "locationInModule": { - "filename": "lib/canary.ts", - "line": 258 - }, - "name": "canaryId", - "type": { - "primitive": "string" - } - }, - { - "docs": { - "custom": { - "attribute": "true" - }, - "stability": "deprecated", - "summary": "The canary Name." - }, - "immutable": true, - "locationInModule": { - "filename": "lib/canary.ts", - "line": 270 - }, - "name": "canaryName", - "type": { - "primitive": "string" - } - }, - { - "docs": { - "custom": { - "attribute": "true" - }, - "remarks": "For example, 'RUNNING', 'STOPPED', 'NOT STARTED', or 'ERROR'.", - "stability": "deprecated", - "summary": "The state of the canary." - }, - "immutable": true, - "locationInModule": { - "filename": "lib/canary.ts", - "line": 264 - }, - "name": "canaryState", - "type": { - "primitive": "string" - } - }, - { - "docs": { - "remarks": "Will fail if not a VPC-enabled Canary", - "stability": "deprecated", - "summary": "Access the Connections object." - }, - "immutable": true, - "locationInModule": { - "filename": "lib/canary.ts", - "line": 372 - }, - "name": "connections", - "overrides": "aws-cdk-lib.aws_ec2.IConnectable", - "type": { - "fqn": "aws-cdk-lib.aws_ec2.Connections" - } - }, - { - "docs": { - "stability": "deprecated", - "summary": "Execution role associated with this Canary." - }, - "immutable": true, - "locationInModule": { - "filename": "lib/canary.ts", - "line": 252 - }, - "name": "role", - "type": { - "fqn": "aws-cdk-lib.aws_iam.IRole" - } - } - ], - "symbolId": "lib/canary:Canary" - }, - "@aws-cdk/aws-synthetics-alpha.CanaryProps": { - "assembly": "@aws-cdk/aws-synthetics-alpha", - "datatype": true, - "docs": { - "stability": "deprecated", - "summary": "Properties for a canary." - }, - "fqn": "@aws-cdk/aws-synthetics-alpha.CanaryProps", - "kind": "interface", - "locationInModule": { - "filename": "lib/canary.ts", - "line": 98 - }, - "name": "CanaryProps", - "properties": [ - { - "abstract": true, - "docs": { - "see": "https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Canaries_Library.html", - "stability": "deprecated", - "summary": "Specify the runtime version to use for the canary." - }, - "immutable": true, - "locationInModule": { - "filename": "lib/canary.ts", - "line": 176 - }, - "name": "runtime", - "type": { - "fqn": "@aws-cdk/aws-synthetics-alpha.Runtime" - } - }, - { - "abstract": true, - "docs": { - "remarks": "Use `Test.custom()` to specify the test to run.", - "stability": "deprecated", - "summary": "The type of test that you want your canary to run." - }, - "immutable": true, - "locationInModule": { - "filename": "lib/canary.ts", - "line": 181 - }, - "name": "test", - "type": { - "fqn": "@aws-cdk/aws-synthetics-alpha.Test" - } - }, - { - "abstract": true, - "docs": { - "default": "- no rules applied to the generated bucket.", - "remarks": "Has no effect\nif a bucket is passed to `artifactsBucketLocation`. If you pass a bucket\nto `artifactsBucketLocation`, you can add lifecycle rules to the bucket\nitself.", - "stability": "deprecated", - "summary": "Lifecycle rules for the generated canary artifact bucket." - }, - "immutable": true, - "locationInModule": { - "filename": "lib/canary.ts", - "line": 242 - }, - "name": "artifactsBucketLifecycleRules", - "optional": true, - "type": { - "collection": { - "elementtype": { - "fqn": "aws-cdk-lib.aws_s3.LifecycleRule" - }, - "kind": "array" - } - } - }, - { - "abstract": true, - "docs": { - "default": "- A new s3 bucket will be created without a prefix.", - "stability": "deprecated", - "summary": "The s3 location that stores the data of the canary runs." - }, - "immutable": true, - "locationInModule": { - "filename": "lib/canary.ts", - "line": 104 - }, - "name": "artifactsBucketLocation", - "optional": true, - "type": { - "fqn": "@aws-cdk/aws-synthetics-alpha.ArtifactsBucketLocation" - } - }, - { - "abstract": true, - "docs": { - "default": "- A unique name will be generated from the construct ID", - "remarks": "Be sure to give it a descriptive name that distinguishes it from\nother canaries in your account.\n\nDo not include secrets or proprietary information in your canary name. The canary name\nmakes up part of the canary ARN, which is included in outbound calls over the internet.", - "see": "https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/servicelens_canaries_security.html", - "stability": "deprecated", - "summary": "The name of the canary." - }, - "immutable": true, - "locationInModule": { - "filename": "lib/canary.ts", - "line": 169 - }, - "name": "canaryName", - "optional": true, - "type": { - "primitive": "string" - } - }, - { - "abstract": true, - "docs": { - "default": "Cleanup.NOTHING", - "remarks": "Using `Cleanup.LAMBDA` will create a Custom Resource to achieve this.", - "stability": "deprecated", - "summary": "Specify the underlying resources to be cleaned up when the canary is deleted." - }, - "immutable": true, - "locationInModule": { - "filename": "lib/canary.ts", - "line": 232 - }, - "name": "cleanup", - "optional": true, - "type": { - "fqn": "@aws-cdk/aws-synthetics-alpha.Cleanup" - } - }, - { - "abstract": true, - "docs": { - "default": "false", - "deprecated": "this feature has been deprecated by the service team, use `cleanup: Cleanup.LAMBDA` instead which will use a Custom Resource to achieve the same effect.", - "see": "https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-synthetics-canary.html#cfn-synthetics-canary-deletelambdaresourcesoncanarydeletion", - "stability": "deprecated", - "summary": "Whether or not to delete the lambda resources when the canary is deleted." - }, - "immutable": true, - "locationInModule": { - "filename": "lib/canary.ts", - "line": 224 - }, - "name": "enableAutoDeleteLambdas", - "optional": true, - "type": { - "primitive": "boolean" - } - }, - { - "abstract": true, - "docs": { - "default": "- No environment variables.", - "remarks": "Use environment variables\nto apply configuration changes, such as test and production environment configurations, without changing your\nCanary script source code.", - "stability": "deprecated", - "summary": "Key-value pairs that the Synthetics caches and makes available for your canary scripts." - }, - "immutable": true, - "locationInModule": { - "filename": "lib/canary.ts", - "line": 190 - }, - "name": "environmentVariables", - "optional": true, - "type": { - "collection": { - "elementtype": { - "primitive": "string" - }, - "kind": "map" - } - } - }, - { - "abstract": true, - "docs": { - "default": "Duration.days(31)", - "stability": "deprecated", - "summary": "How many days should failed runs be retained." - }, - "immutable": true, - "locationInModule": { - "filename": "lib/canary.ts", - "line": 157 - }, - "name": "failureRetentionPeriod", - "optional": true, - "type": { - "fqn": "aws-cdk-lib.Duration" - } - }, - { - "abstract": true, - "docs": { - "default": "- A unique role will be generated for this canary.\nYou can add permissions to roles by calling 'addToRolePolicy'.", - "remarks": "This is the role that will be assumed by the canary upon execution.\nIt controls the permissions that the canary will have. The role must\nbe assumable by the AWS Lambda service principal.\n\nIf not supplied, a role will be created with all the required permissions.\nIf you provide a Role, you must add the required permissions.", - "see": "required permissions: https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-synthetics-canary.html#cfn-synthetics-canary-executionrolearn", - "stability": "deprecated", - "summary": "Canary execution role." - }, - "immutable": true, - "locationInModule": { - "filename": "lib/canary.ts", - "line": 121 - }, - "name": "role", - "optional": true, - "type": { - "fqn": "aws-cdk-lib.aws_iam.IRole" - } - }, - { - "abstract": true, - "docs": { - "default": "'rate(5 minutes)'", - "remarks": "For example, if you set `schedule` to `rate(10 minutes)`, then the canary will run every 10 minutes.\nYou can set the schedule with `Schedule.rate(Duration)` (recommended) or you can specify an expression using `Schedule.expression()`.", - "stability": "deprecated", - "summary": "Specify the schedule for how often the canary runs." - }, - "immutable": true, - "locationInModule": { - "filename": "lib/canary.ts", - "line": 136 - }, - "name": "schedule", - "optional": true, - "type": { - "fqn": "@aws-cdk/aws-synthetics-alpha.Schedule" - } - }, - { - "abstract": true, - "docs": { - "default": "- If the canary is placed within a VPC and a security group is\nnot specified a dedicated security group will be created for this canary.", - "remarks": "You must provide `vpc` when using this prop.", - "stability": "deprecated", - "summary": "The list of security groups to associate with the canary's network interfaces." - }, - "immutable": true, - "locationInModule": { - "filename": "lib/canary.ts", - "line": 214 - }, - "name": "securityGroups", - "optional": true, - "type": { - "collection": { - "elementtype": { - "fqn": "aws-cdk-lib.aws_ec2.ISecurityGroup" - }, - "kind": "array" - } - } - }, - { - "abstract": true, - "docs": { - "default": "true", - "stability": "deprecated", - "summary": "Whether or not the canary should start after creation." - }, - "immutable": true, - "locationInModule": { - "filename": "lib/canary.ts", - "line": 143 - }, - "name": "startAfterCreation", - "optional": true, - "type": { - "primitive": "boolean" - } - }, - { - "abstract": true, - "docs": { - "default": "Duration.days(31)", - "stability": "deprecated", - "summary": "How many days should successful runs be retained." - }, - "immutable": true, - "locationInModule": { - "filename": "lib/canary.ts", - "line": 150 - }, - "name": "successRetentionPeriod", - "optional": true, - "type": { - "fqn": "aws-cdk-lib.Duration" - } - }, - { - "abstract": true, - "docs": { - "default": "- no limit", - "remarks": "For example, if you set `timeToLive` to be 1 hour and `schedule` to be `rate(10 minutes)`,\nyour canary will run at 10 minute intervals for an hour, for a total of 6 times.", - "stability": "deprecated", - "summary": "How long the canary will be in a 'RUNNING' state." - }, - "immutable": true, - "locationInModule": { - "filename": "lib/canary.ts", - "line": 129 - }, - "name": "timeToLive", - "optional": true, - "type": { - "fqn": "aws-cdk-lib.Duration" - } - }, - { - "abstract": true, - "docs": { - "default": "- Not in VPC", - "remarks": "Specify this if the canary needs to access resources in a VPC.", - "stability": "deprecated", - "summary": "The VPC where this canary is run." - }, - "immutable": true, - "locationInModule": { - "filename": "lib/canary.ts", - "line": 199 - }, - "name": "vpc", - "optional": true, - "type": { - "fqn": "aws-cdk-lib.aws_ec2.IVpc" - } - }, - { - "abstract": true, - "docs": { - "default": "- the Vpc default strategy if not specified", - "remarks": "You must provide `vpc` when using this prop.", - "stability": "deprecated", - "summary": "Where to place the network interfaces within the VPC." - }, - "immutable": true, - "locationInModule": { - "filename": "lib/canary.ts", - "line": 206 - }, - "name": "vpcSubnets", - "optional": true, - "type": { - "fqn": "aws-cdk-lib.aws_ec2.SubnetSelection" - } - } - ], - "symbolId": "lib/canary:CanaryProps" - }, - "@aws-cdk/aws-synthetics-alpha.Cleanup": { - "assembly": "@aws-cdk/aws-synthetics-alpha", - "docs": { - "stability": "deprecated", - "summary": "Different ways to clean up underlying Canary resources when the Canary is deleted." - }, - "fqn": "@aws-cdk/aws-synthetics-alpha.Cleanup", - "kind": "enum", - "locationInModule": { - "filename": "lib/canary.ts", - "line": 62 - }, - "members": [ - { - "docs": { - "remarks": "The user is responsible for cleaning up\nall resources left behind by the Canary.", - "stability": "deprecated", - "summary": "Clean up nothing." - }, - "name": "NOTHING" - }, - { - "docs": { - "remarks": "The user is\nresponsible for cleaning up all other resources left behind\nby the Canary.", - "stability": "deprecated", - "summary": "Clean up the underlying Lambda function only." - }, - "name": "LAMBDA" - } - ], - "name": "Cleanup", - "symbolId": "lib/canary:Cleanup" - }, - "@aws-cdk/aws-synthetics-alpha.Code": { - "abstract": true, - "assembly": "@aws-cdk/aws-synthetics-alpha", - "docs": { - "stability": "deprecated", - "summary": "The code the canary should execute." - }, - "fqn": "@aws-cdk/aws-synthetics-alpha.Code", - "initializer": { - "docs": { - "stability": "deprecated" - } - }, - "kind": "class", - "locationInModule": { - "filename": "lib/code.ts", - "line": 12 - }, - "methods": [ - { - "docs": { - "remarks": "Path must include the folder structure `nodejs/node_modules/myCanaryFilename.js`.", - "returns": "`AssetCode` associated with the specified path.", - "see": "https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Canaries_WritingCanary.html#CloudWatch_Synthetics_Canaries_write_from_scratch", - "stability": "deprecated", - "summary": "Specify code from a local path." - }, - "locationInModule": { - "filename": "lib/code.ts", - "line": 33 - }, - "name": "fromAsset", - "parameters": [ - { - "docs": { - "summary": "Either a directory or a .zip file." - }, - "name": "assetPath", - "type": { - "primitive": "string" - } - }, - { - "name": "options", - "optional": true, - "type": { - "fqn": "aws-cdk-lib.aws_s3_assets.AssetOptions" - } - } - ], - "returns": { - "type": { - "fqn": "@aws-cdk/aws-synthetics-alpha.AssetCode" - } - }, - "static": true - }, - { - "docs": { - "remarks": "The object in the s3 bucket must be a .zip file that contains\nthe structure `nodejs/node_modules/myCanaryFilename.js`.", - "returns": "`S3Code` associated with the specified S3 object.", - "see": "https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Canaries_WritingCanary.html#CloudWatch_Synthetics_Canaries_write_from_scratch", - "stability": "deprecated", - "summary": "Specify code from an s3 bucket." - }, - "locationInModule": { - "filename": "lib/code.ts", - "line": 48 - }, - "name": "fromBucket", - "parameters": [ - { - "docs": { - "summary": "The S3 bucket." - }, - "name": "bucket", - "type": { - "fqn": "aws-cdk-lib.aws_s3.IBucket" - } - }, - { - "docs": { - "summary": "The object key." - }, - "name": "key", - "type": { - "primitive": "string" - } - }, - { - "docs": { - "summary": "Optional S3 object version." - }, - "name": "objectVersion", - "optional": true, - "type": { - "primitive": "string" - } - } - ], - "returns": { - "type": { - "fqn": "@aws-cdk/aws-synthetics-alpha.S3Code" - } - }, - "static": true - }, - { - "docs": { - "returns": "`InlineCode` with inline code.", - "stability": "deprecated", - "summary": "Specify code inline." - }, - "locationInModule": { - "filename": "lib/code.ts", - "line": 21 - }, - "name": "fromInline", - "parameters": [ - { - "docs": { - "summary": "The actual handler code (limited to 5MB)." - }, - "name": "code", - "type": { - "primitive": "string" - } - } - ], - "returns": { - "type": { - "fqn": "@aws-cdk/aws-synthetics-alpha.InlineCode" - } - }, - "static": true - }, - { - "abstract": true, - "docs": { - "returns": "a bound `CodeConfig`.", - "stability": "deprecated", - "summary": "Called when the canary is initialized to allow this object to bind to the stack, add resources and have fun." - }, - "locationInModule": { - "filename": "lib/code.ts", - "line": 61 - }, - "name": "bind", - "parameters": [ - { - "docs": { - "remarks": "Don't be smart about trying to down-cast or\nassume it's initialized. You may just use it as a construct scope.", - "summary": "The binding scope." - }, - "name": "scope", - "type": { - "fqn": "constructs.Construct" - } - }, - { - "name": "handler", - "type": { - "primitive": "string" - } - }, - { - "name": "family", - "type": { - "fqn": "@aws-cdk/aws-synthetics-alpha.RuntimeFamily" - } - } - ], - "returns": { - "type": { - "fqn": "@aws-cdk/aws-synthetics-alpha.CodeConfig" - } - } - } - ], - "name": "Code", - "symbolId": "lib/code:Code" - }, - "@aws-cdk/aws-synthetics-alpha.CodeConfig": { - "assembly": "@aws-cdk/aws-synthetics-alpha", - "datatype": true, - "docs": { - "stability": "deprecated", - "summary": "Configuration of the code class." - }, - "fqn": "@aws-cdk/aws-synthetics-alpha.CodeConfig", - "kind": "interface", - "locationInModule": { - "filename": "lib/code.ts", - "line": 67 - }, - "name": "CodeConfig", - "properties": [ - { - "abstract": true, - "docs": { - "default": "- none", - "stability": "deprecated", - "summary": "Inline code (mutually exclusive with `s3Location`)." - }, - "immutable": true, - "locationInModule": { - "filename": "lib/code.ts", - "line": 80 - }, - "name": "inlineCode", - "optional": true, - "type": { - "primitive": "string" - } - }, - { - "abstract": true, - "docs": { - "default": "- none", - "stability": "deprecated", - "summary": "The location of the code in S3 (mutually exclusive with `inlineCode`)." - }, - "immutable": true, - "locationInModule": { - "filename": "lib/code.ts", - "line": 73 - }, - "name": "s3Location", - "optional": true, - "type": { - "fqn": "aws-cdk-lib.aws_s3.Location" - } - } - ], - "symbolId": "lib/code:CodeConfig" - }, - "@aws-cdk/aws-synthetics-alpha.CronOptions": { - "assembly": "@aws-cdk/aws-synthetics-alpha", - "datatype": true, - "docs": { - "remarks": "All fields are strings so you can use complex expressions. Absence of\na field implies '*' or '?', whichever one is appropriate.", - "see": "https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Canaries_cron.html", - "stability": "deprecated", - "summary": "Options to configure a cron expression." - }, - "fqn": "@aws-cdk/aws-synthetics-alpha.CronOptions", - "kind": "interface", - "locationInModule": { - "filename": "lib/schedule.ts", - "line": 82 - }, - "name": "CronOptions", - "properties": [ - { - "abstract": true, - "docs": { - "default": "- Every day of the month", - "stability": "deprecated", - "summary": "The day of the month to run this rule at." - }, - "immutable": true, - "locationInModule": { - "filename": "lib/schedule.ts", - "line": 102 - }, - "name": "day", - "optional": true, - "type": { - "primitive": "string" - } - }, - { - "abstract": true, - "docs": { - "default": "- Every hour", - "stability": "deprecated", - "summary": "The hour to run this rule at." - }, - "immutable": true, - "locationInModule": { - "filename": "lib/schedule.ts", - "line": 95 - }, - "name": "hour", - "optional": true, - "type": { - "primitive": "string" - } - }, - { - "abstract": true, - "docs": { - "default": "- Every minute", - "stability": "deprecated", - "summary": "The minute to run this rule at." - }, - "immutable": true, - "locationInModule": { - "filename": "lib/schedule.ts", - "line": 88 - }, - "name": "minute", - "optional": true, - "type": { - "primitive": "string" - } - }, - { - "abstract": true, - "docs": { - "default": "- Every month", - "stability": "deprecated", - "summary": "The month to run this rule at." - }, - "immutable": true, - "locationInModule": { - "filename": "lib/schedule.ts", - "line": 109 - }, - "name": "month", - "optional": true, - "type": { - "primitive": "string" - } - }, - { - "abstract": true, - "docs": { - "default": "- Any day of the week", - "stability": "deprecated", - "summary": "The day of the week to run this rule at." - }, - "immutable": true, - "locationInModule": { - "filename": "lib/schedule.ts", - "line": 116 - }, - "name": "weekDay", - "optional": true, - "type": { - "primitive": "string" - } - } - ], - "symbolId": "lib/schedule:CronOptions" - }, - "@aws-cdk/aws-synthetics-alpha.CustomTestOptions": { - "assembly": "@aws-cdk/aws-synthetics-alpha", - "datatype": true, - "docs": { - "stability": "deprecated", - "summary": "Properties for specifying a test." - }, - "fqn": "@aws-cdk/aws-synthetics-alpha.CustomTestOptions", - "kind": "interface", - "locationInModule": { - "filename": "lib/canary.ts", - "line": 46 - }, - "name": "CustomTestOptions", - "properties": [ - { - "abstract": true, - "docs": { - "stability": "deprecated", - "summary": "The code of the canary script." - }, - "immutable": true, - "locationInModule": { - "filename": "lib/canary.ts", - "line": 50 - }, - "name": "code", - "type": { - "fqn": "@aws-cdk/aws-synthetics-alpha.Code" - } - }, - { - "abstract": true, - "docs": { - "remarks": "Must end with `.handler`.", - "stability": "deprecated", - "summary": "The handler for the code." - }, - "immutable": true, - "locationInModule": { - "filename": "lib/canary.ts", - "line": 55 - }, - "name": "handler", - "type": { - "primitive": "string" - } - } - ], - "symbolId": "lib/canary:CustomTestOptions" - }, - "@aws-cdk/aws-synthetics-alpha.InlineCode": { - "assembly": "@aws-cdk/aws-synthetics-alpha", - "base": "@aws-cdk/aws-synthetics-alpha.Code", - "docs": { - "stability": "deprecated", - "summary": "Canary code from an inline string." - }, - "fqn": "@aws-cdk/aws-synthetics-alpha.InlineCode", - "initializer": { - "docs": { - "stability": "deprecated" - }, - "locationInModule": { - "filename": "lib/code.ts", - "line": 160 - }, - "parameters": [ - { - "name": "code", - "type": { - "primitive": "string" - } - } - ] - }, - "kind": "class", - "locationInModule": { - "filename": "lib/code.ts", - "line": 159 - }, - "methods": [ - { - "docs": { - "stability": "deprecated", - "summary": "Called when the canary is initialized to allow this object to bind to the stack, add resources and have fun." - }, - "locationInModule": { - "filename": "lib/code.ts", - "line": 168 - }, - "name": "bind", - "overrides": "@aws-cdk/aws-synthetics-alpha.Code", - "parameters": [ - { - "name": "_scope", - "type": { - "fqn": "constructs.Construct" - } - }, - { - "name": "handler", - "type": { - "primitive": "string" - } - }, - { - "name": "_family", - "type": { - "fqn": "@aws-cdk/aws-synthetics-alpha.RuntimeFamily" - } - } - ], - "returns": { - "type": { - "fqn": "@aws-cdk/aws-synthetics-alpha.CodeConfig" - } - } - } - ], - "name": "InlineCode", - "symbolId": "lib/code:InlineCode" - }, - "@aws-cdk/aws-synthetics-alpha.Runtime": { - "assembly": "@aws-cdk/aws-synthetics-alpha", - "docs": { - "stability": "deprecated", - "summary": "Runtime options for a canary." - }, - "fqn": "@aws-cdk/aws-synthetics-alpha.Runtime", - "initializer": { - "docs": { - "stability": "deprecated" - }, - "locationInModule": { - "filename": "lib/runtime.ts", - "line": 301 - }, - "parameters": [ - { - "docs": { - "summary": "The name of the runtime version." - }, - "name": "name", - "type": { - "primitive": "string" - } - }, - { - "docs": { - "summary": "The Lambda runtime family." - }, - "name": "family", - "type": { - "fqn": "@aws-cdk/aws-synthetics-alpha.RuntimeFamily" - } - } - ] - }, - "kind": "class", - "locationInModule": { - "filename": "lib/runtime.ts", - "line": 24 - }, - "name": "Runtime", - "properties": [ - { - "const": true, - "docs": { - "deprecated": "Use the latest version instead", - "remarks": "`syn-1.0` includes the following:\n\n- Synthetics library 1.0\n- Synthetics handler code 1.0\n- Lambda runtime Node.js 10.x\n- Puppeteer-core version 1.14.0\n- The Chromium version that matches Puppeteer-core 1.14.0", - "see": "https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Library_nodejs_puppeteer.html#CloudWatch_Synthetics_runtimeversion-1.0", - "stability": "deprecated", - "summary": "**Deprecated by AWS Synthetics. You can't create canaries with deprecated runtimes.**." - }, - "immutable": true, - "locationInModule": { - "filename": "lib/runtime.ts", - "line": 39 - }, - "name": "SYNTHETICS_1_0", - "static": true, - "type": { - "fqn": "@aws-cdk/aws-synthetics-alpha.Runtime" - } - }, - { - "const": true, - "docs": { - "deprecated": "Use the latest version instead", - "remarks": "`syn-nodejs-2.0` includes the following:\n- Lambda runtime Node.js 10.x\n- Puppeteer-core version 3.3.0\n- Chromium version 83.0.4103.0", - "see": "https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Library_nodejs_puppeteer.html#CloudWatch_Synthetics_runtimeversion-2.0", - "stability": "deprecated", - "summary": "**Deprecated by AWS Synthetics. You can't create canaries with deprecated runtimes.**." - }, - "immutable": true, - "locationInModule": { - "filename": "lib/runtime.ts", - "line": 52 - }, - "name": "SYNTHETICS_NODEJS_2_0", - "static": true, - "type": { - "fqn": "@aws-cdk/aws-synthetics-alpha.Runtime" - } - }, - { - "const": true, - "docs": { - "deprecated": "Use the latest version instead", - "remarks": "`syn-nodejs-2.1` includes the following:\n- Lambda runtime Node.js 10.x\n- Puppeteer-core version 3.3.0\n- Chromium version 83.0.4103.0", - "see": "https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Library_nodejs_puppeteer.html#CloudWatch_Synthetics_runtimeversion-2.1", - "stability": "deprecated", - "summary": "**Deprecated by AWS Synthetics. You can't create canaries with deprecated runtimes.**." - }, - "immutable": true, - "locationInModule": { - "filename": "lib/runtime.ts", - "line": 65 - }, - "name": "SYNTHETICS_NODEJS_2_1", - "static": true, - "type": { - "fqn": "@aws-cdk/aws-synthetics-alpha.Runtime" - } - }, - { - "const": true, - "docs": { - "deprecated": "Use the latest version instead", - "remarks": "`syn-nodejs-2.2` includes the following:\n- Lambda runtime Node.js 10.x\n- Puppeteer-core version 3.3.0\n- Chromium version 83.0.4103.0", - "see": "https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Library_nodejs_puppeteer.html#CloudWatch_Synthetics_runtimeversion-2.2", - "stability": "deprecated", - "summary": "**Deprecated by AWS Synthetics. You can't create canaries with deprecated runtimes.**." - }, - "immutable": true, - "locationInModule": { - "filename": "lib/runtime.ts", - "line": 78 - }, - "name": "SYNTHETICS_NODEJS_2_2", - "static": true, - "type": { - "fqn": "@aws-cdk/aws-synthetics-alpha.Runtime" - } - }, - { - "const": true, - "docs": { - "deprecated": "Use the latest version instead", - "remarks": "`syn-nodejs-puppeteer-3.0` includes the following:\n- Lambda runtime Node.js 12.x\n- Puppeteer-core version 5.5.0\n- Chromium version 88.0.4298.0", - "see": "https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Library_nodejs_puppeteer.html#CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-3.0", - "stability": "deprecated", - "summary": "**Deprecated by AWS Synthetics. You can't create canaries with deprecated runtimes.**." - }, - "immutable": true, - "locationInModule": { - "filename": "lib/runtime.ts", - "line": 91 - }, - "name": "SYNTHETICS_NODEJS_PUPPETEER_3_0", - "static": true, - "type": { - "fqn": "@aws-cdk/aws-synthetics-alpha.Runtime" - } - }, - { - "const": true, - "docs": { - "deprecated": "Use the latest version instead", - "remarks": "`syn-nodejs-puppeteer-3.1` includes the following:\n- Lambda runtime Node.js 12.x\n- Puppeteer-core version 5.5.0\n- Chromium version 88.0.4298.0", - "see": "https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Library_nodejs_puppeteer.html#CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-3.1", - "stability": "deprecated", - "summary": "**Deprecated by AWS Synthetics. You can't create canaries with deprecated runtimes.**." - }, - "immutable": true, - "locationInModule": { - "filename": "lib/runtime.ts", - "line": 104 - }, - "name": "SYNTHETICS_NODEJS_PUPPETEER_3_1", - "static": true, - "type": { - "fqn": "@aws-cdk/aws-synthetics-alpha.Runtime" - } - }, - { - "const": true, - "docs": { - "deprecated": "Use the latest version instead", - "remarks": "`syn-nodejs-puppeteer-3.2` includes the following:\n- Lambda runtime Node.js 12.x\n- Puppeteer-core version 5.5.0\n- Chromium version 88.0.4298.0", - "see": "https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Library_nodejs_puppeteer.html#CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-3.2", - "stability": "deprecated", - "summary": "**Deprecated by AWS Synthetics. You can't create canaries with deprecated runtimes.**." - }, - "immutable": true, - "locationInModule": { - "filename": "lib/runtime.ts", - "line": 117 - }, - "name": "SYNTHETICS_NODEJS_PUPPETEER_3_2", - "static": true, - "type": { - "fqn": "@aws-cdk/aws-synthetics-alpha.Runtime" - } - }, - { - "const": true, - "docs": { - "deprecated": "Use the latest version instead", - "remarks": "- Lambda runtime Node.js 12.x\n- Puppeteer-core version 5.5.0\n- Chromium version 88.0.4298.0", - "see": "https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Library_nodejs_puppeteer.html#CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-3.3", - "stability": "deprecated", - "summary": "`syn-nodejs-puppeteer-3.3` includes the following: **Deprecated by AWS Synthetics. You can't create canaries with deprecated runtimes.**." - }, - "immutable": true, - "locationInModule": { - "filename": "lib/runtime.ts", - "line": 130 - }, - "name": "SYNTHETICS_NODEJS_PUPPETEER_3_3", - "static": true, - "type": { - "fqn": "@aws-cdk/aws-synthetics-alpha.Runtime" - } - }, - { - "const": true, - "docs": { - "deprecated": "Use the latest version instead", - "remarks": "`syn-nodejs-puppeteer-3.4` includes the following:\n- Lambda runtime Node.js 12.x\n- Puppeteer-core version 5.5.0\n- Chromium version 88.0.4298.0", - "see": "https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Library_nodejs_puppeteer.html#CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-3.4", - "stability": "deprecated", - "summary": "**Deprecated by AWS Synthetics. You can't create canaries with deprecated runtimes.**." - }, - "immutable": true, - "locationInModule": { - "filename": "lib/runtime.ts", - "line": 143 - }, - "name": "SYNTHETICS_NODEJS_PUPPETEER_3_4", - "static": true, - "type": { - "fqn": "@aws-cdk/aws-synthetics-alpha.Runtime" - } - }, - { - "const": true, - "docs": { - "see": "https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Library_nodejs_puppeteer.html#CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-3.5", - "stability": "deprecated", - "summary": "`syn-nodejs-puppeteer-3.5` includes the following: - Lambda runtime Node.js 14.x - Puppeteer-core version 10.1.0 - Chromium version 92.0.4512." - }, - "immutable": true, - "locationInModule": { - "filename": "lib/runtime.ts", - "line": 153 - }, - "name": "SYNTHETICS_NODEJS_PUPPETEER_3_5", - "static": true, - "type": { - "fqn": "@aws-cdk/aws-synthetics-alpha.Runtime" - } - }, - { - "const": true, - "docs": { - "see": "https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Library_nodejs_puppeteer.html#CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-3.6", - "stability": "deprecated", - "summary": "`syn-nodejs-puppeteer-3.6` includes the following: - Lambda runtime Node.js 14.x - Puppeteer-core version 10.1.0 - Chromium version 92.0.4512." - }, - "immutable": true, - "locationInModule": { - "filename": "lib/runtime.ts", - "line": 163 - }, - "name": "SYNTHETICS_NODEJS_PUPPETEER_3_6", - "static": true, - "type": { - "fqn": "@aws-cdk/aws-synthetics-alpha.Runtime" - } - }, - { - "const": true, - "docs": { - "remarks": "New Features:\n- **Logging enhancement**: The canary will upload logs to Amazon S3 even if it times out or crashes.\n- **Lambda layer size reduced**: The size of the Lambda layer used for canaries is reduced by 34%.", - "see": "https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Library_nodejs_puppeteer.html#CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-3.7", - "stability": "deprecated", - "summary": "`syn-nodejs-puppeteer-3.7` includes the following: - Lambda runtime Node.js 14.x - Puppeteer-core version 10.1.0 - Chromium version 92.0.4512." - }, - "immutable": true, - "locationInModule": { - "filename": "lib/runtime.ts", - "line": 177 - }, - "name": "SYNTHETICS_NODEJS_PUPPETEER_3_7", - "static": true, - "type": { - "fqn": "@aws-cdk/aws-synthetics-alpha.Runtime" - } - }, - { - "const": true, - "docs": { - "remarks": "New Features:\n- **Profile cleanup**: Chromium profiles are now cleaned up after each canary run.", - "see": "https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Library_nodejs_puppeteer.html#CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-3.8", - "stability": "deprecated", - "summary": "`syn-nodejs-puppeteer-3.8` includes the following: - Lambda runtime Node.js 14.x - Puppeteer-core version 10.1.0 - Chromium version 92.0.4512." - }, - "immutable": true, - "locationInModule": { - "filename": "lib/runtime.ts", - "line": 190 - }, - "name": "SYNTHETICS_NODEJS_PUPPETEER_3_8", - "static": true, - "type": { - "fqn": "@aws-cdk/aws-synthetics-alpha.Runtime" - } - }, - { - "const": true, - "docs": { - "remarks": "- Lambda runtime Node.js 14.x\n- Puppeteer-core version 5.5.0\n- Chromium version 92.0.4512\n\nNew Features:\n- **Dependency upgrades**: Upgrades some third-party dependency packages.", - "see": "https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Library_nodejs_puppeteer.html#CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-3.9", - "stability": "deprecated", - "summary": "`syn-nodejs-puppeteer-3.9` includes the following:." - }, - "immutable": true, - "locationInModule": { - "filename": "lib/runtime.ts", - "line": 204 - }, - "name": "SYNTHETICS_NODEJS_PUPPETEER_3_9", - "static": true, - "type": { - "fqn": "@aws-cdk/aws-synthetics-alpha.Runtime" - } - }, - { - "const": true, - "docs": { - "remarks": "New Features:\n- **Dependency upgrades**: The Node.js dependency is updated to 16.x.", - "see": "https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Library_nodejs_puppeteer.html#CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-4.0", - "stability": "deprecated", - "summary": "`syn-nodejs-puppeteer-4.0` includes the following: - Lambda runtime Node.js 16.x - Puppeteer-core version 5.5.0 - Chromium version 92.0.4512." - }, - "immutable": true, - "locationInModule": { - "filename": "lib/runtime.ts", - "line": 217 - }, - "name": "SYNTHETICS_NODEJS_PUPPETEER_4_0", - "static": true, - "type": { - "fqn": "@aws-cdk/aws-synthetics-alpha.Runtime" - } - }, - { - "const": true, - "docs": { - "remarks": "New Features:\n- **Dependency upgrade**: The Puppeteer-core version is updated to 19.7.0. The Chromium version is upgraded to 111.0.5563.146.", - "see": "https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Library_nodejs_puppeteer.html#CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-5.0", - "stability": "deprecated", - "summary": "`syn-nodejs-puppeteer-5.0` includes the following: - Lambda runtime Node.js 16.x - Puppeteer-core version 19.7.0 - Chromium version 111.0.5563.146." - }, - "immutable": true, - "locationInModule": { - "filename": "lib/runtime.ts", - "line": 230 - }, - "name": "SYNTHETICS_NODEJS_PUPPETEER_5_0", - "static": true, - "type": { - "fqn": "@aws-cdk/aws-synthetics-alpha.Runtime" - } - }, - { - "const": true, - "docs": { - "remarks": "Bug fixes:\n- **Bug fix**: This runtime fixes a bug in `syn-nodejs-puppeteer-5.0` where the HAR files created by the canaries were missing request headers.", - "see": "https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Library_nodejs_puppeteer.html#CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-5.1", - "stability": "deprecated", - "summary": "`syn-nodejs-puppeteer-5.1` includes the following: - Lambda runtime Node.js 16.x - Puppeteer-core version 19.7.0 - Chromium version 111.0.5563.146." - }, - "immutable": true, - "locationInModule": { - "filename": "lib/runtime.ts", - "line": 243 - }, - "name": "SYNTHETICS_NODEJS_PUPPETEER_5_1", - "static": true, - "type": { - "fqn": "@aws-cdk/aws-synthetics-alpha.Runtime" - } - }, - { - "const": true, - "docs": { - "see": "https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Library_python_selenium.html#CloudWatch_Synthetics_runtimeversion-syn-python-selenium-1.0", - "stability": "deprecated", - "summary": "`syn-python-selenium-1.0` includes the following: - Lambda runtime Python 3.8 - Selenium version 3.141.0 - Chromium version 83.0.4103.0." - }, - "immutable": true, - "locationInModule": { - "filename": "lib/runtime.ts", - "line": 253 - }, - "name": "SYNTHETICS_PYTHON_SELENIUM_1_0", - "static": true, - "type": { - "fqn": "@aws-cdk/aws-synthetics-alpha.Runtime" - } - }, - { - "const": true, - "docs": { - "remarks": "New Features:\n- **Custom handler function**: You can now use a custom handler function for your canary scripts.\n- **Configuration options for adding metrics and step failure configurations**: These options were already available in runtimes for Node.js canaries.\n- **Custom arguments in Chrome**: You can now open a browser in incognito mode or pass in proxy server configuration.\n- **Cross-Region artifact buckets**: A canary can store its artifacts in an Amazon S3 bucket in a different Region.", - "see": "https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Library_python_selenium.html#CloudWatch_Synthetics_runtimeversion-syn-python-selenium-1.1", - "stability": "deprecated", - "summary": "`syn-python-selenium-1.1` includes the following: - Lambda runtime Python 3.8 - Selenium version 3.141.0 - Chromium version 83.0.4103.0." - }, - "immutable": true, - "locationInModule": { - "filename": "lib/runtime.ts", - "line": 269 - }, - "name": "SYNTHETICS_PYTHON_SELENIUM_1_1", - "static": true, - "type": { - "fqn": "@aws-cdk/aws-synthetics-alpha.Runtime" - } - }, - { - "const": true, - "docs": { - "remarks": "New Features:\n- **Updated dependencies**: The only new features in this runtime are the updated dependencies.", - "see": "https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Library_python_selenium.html#CloudWatch_Synthetics_runtimeversion-syn-python-selenium-1.2", - "stability": "deprecated", - "summary": "`syn-python-selenium-1.2` includes the following: - Lambda runtime Python 3.8 - Selenium version 3.141.0 - Chromium version 92.0.4512.0." - }, - "immutable": true, - "locationInModule": { - "filename": "lib/runtime.ts", - "line": 282 - }, - "name": "SYNTHETICS_PYTHON_SELENIUM_1_2", - "static": true, - "type": { - "fqn": "@aws-cdk/aws-synthetics-alpha.Runtime" - } - }, - { - "const": true, - "docs": { - "remarks": "New Features:\n- **More precise timestamps**: The start time and stop time of canary runs are now precise to the millisecond.", - "see": "https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Library_python_selenium.html#CloudWatch_Synthetics_runtimeversion-syn-python-selenium-1.3", - "stability": "deprecated", - "summary": "`syn-python-selenium-1.3` includes the following: - Lambda runtime Python 3.8 - Selenium version 3.141.0 - Chromium version 92.0.4512.0." - }, - "immutable": true, - "locationInModule": { - "filename": "lib/runtime.ts", - "line": 295 - }, - "name": "SYNTHETICS_PYTHON_SELENIUM_1_3", - "static": true, - "type": { - "fqn": "@aws-cdk/aws-synthetics-alpha.Runtime" - } - }, - { - "docs": { - "stability": "deprecated", - "summary": "The Lambda runtime family." - }, - "immutable": true, - "locationInModule": { - "filename": "lib/runtime.ts", - "line": 301 - }, - "name": "family", - "type": { - "fqn": "@aws-cdk/aws-synthetics-alpha.RuntimeFamily" - } - }, - { - "docs": { - "stability": "deprecated", - "summary": "The name of the runtime version." - }, - "immutable": true, - "locationInModule": { - "filename": "lib/runtime.ts", - "line": 301 - }, - "name": "name", - "type": { - "primitive": "string" - } - } - ], - "symbolId": "lib/runtime:Runtime" - }, - "@aws-cdk/aws-synthetics-alpha.RuntimeFamily": { - "assembly": "@aws-cdk/aws-synthetics-alpha", - "docs": { - "stability": "deprecated", - "summary": "All known Lambda runtime families." - }, - "fqn": "@aws-cdk/aws-synthetics-alpha.RuntimeFamily", - "kind": "enum", - "locationInModule": { - "filename": "lib/runtime.ts", - "line": 4 - }, - "members": [ - { - "docs": { - "stability": "deprecated", - "summary": "All Lambda runtimes that depend on Node.js." - }, - "name": "NODEJS" - }, - { - "docs": { - "stability": "deprecated", - "summary": "All lambda runtimes that depend on Python." - }, - "name": "PYTHON" - }, - { - "docs": { - "stability": "deprecated", - "summary": "Any future runtime family." - }, - "name": "OTHER" - } - ], - "name": "RuntimeFamily", - "symbolId": "lib/runtime:RuntimeFamily" - }, - "@aws-cdk/aws-synthetics-alpha.S3Code": { - "assembly": "@aws-cdk/aws-synthetics-alpha", - "base": "@aws-cdk/aws-synthetics-alpha.Code", - "docs": { - "stability": "deprecated", - "summary": "S3 bucket path to the code zip file." - }, - "fqn": "@aws-cdk/aws-synthetics-alpha.S3Code", - "initializer": { - "docs": { - "stability": "deprecated" - }, - "locationInModule": { - "filename": "lib/code.ts", - "line": 184 - }, - "parameters": [ - { - "name": "bucket", - "type": { - "fqn": "aws-cdk-lib.aws_s3.IBucket" - } - }, - { - "name": "key", - "type": { - "primitive": "string" - } - }, - { - "name": "objectVersion", - "optional": true, - "type": { - "primitive": "string" - } - } - ] - }, - "kind": "class", - "locationInModule": { - "filename": "lib/code.ts", - "line": 183 - }, - "methods": [ - { - "docs": { - "stability": "deprecated", - "summary": "Called when the canary is initialized to allow this object to bind to the stack, add resources and have fun." - }, - "locationInModule": { - "filename": "lib/code.ts", - "line": 188 - }, - "name": "bind", - "overrides": "@aws-cdk/aws-synthetics-alpha.Code", - "parameters": [ - { - "name": "_scope", - "type": { - "fqn": "constructs.Construct" - } - }, - { - "name": "_handler", - "type": { - "primitive": "string" - } - }, - { - "name": "_family", - "type": { - "fqn": "@aws-cdk/aws-synthetics-alpha.RuntimeFamily" - } - } - ], - "returns": { - "type": { - "fqn": "@aws-cdk/aws-synthetics-alpha.CodeConfig" - } - } - } - ], - "name": "S3Code", - "symbolId": "lib/code:S3Code" - }, - "@aws-cdk/aws-synthetics-alpha.Schedule": { - "assembly": "@aws-cdk/aws-synthetics-alpha", - "docs": { - "stability": "deprecated", - "summary": "Schedule for canary runs." - }, - "fqn": "@aws-cdk/aws-synthetics-alpha.Schedule", - "kind": "class", - "locationInModule": { - "filename": "lib/schedule.ts", - "line": 6 - }, - "methods": [ - { - "docs": { - "stability": "deprecated", - "summary": "Create a schedule from a set of cron fields." - }, - "locationInModule": { - "filename": "lib/schedule.ts", - "line": 48 - }, - "name": "cron", - "parameters": [ - { - "name": "options", - "type": { - "fqn": "@aws-cdk/aws-synthetics-alpha.CronOptions" - } - } - ], - "returns": { - "type": { - "fqn": "@aws-cdk/aws-synthetics-alpha.Schedule" - } - }, - "static": true - }, - { - "docs": { - "remarks": "The expression must be in a `rate(number units)` format.\nFor example, `Schedule.expression('rate(10 minutes)')`", - "stability": "deprecated", - "summary": "Construct a schedule from a literal schedule expression." - }, - "locationInModule": { - "filename": "lib/schedule.ts", - "line": 21 - }, - "name": "expression", - "parameters": [ - { - "docs": { - "summary": "The expression to use." - }, - "name": "expression", - "type": { - "primitive": "string" - } - } - ], - "returns": { - "type": { - "fqn": "@aws-cdk/aws-synthetics-alpha.Schedule" - } - }, - "static": true - }, - { - "docs": { - "stability": "deprecated", - "summary": "The canary will be executed once." - }, - "locationInModule": { - "filename": "lib/schedule.ts", - "line": 11 - }, - "name": "once", - "returns": { - "type": { - "fqn": "@aws-cdk/aws-synthetics-alpha.Schedule" - } - }, - "static": true - }, - { - "docs": { - "remarks": "Allowed values: 0 (for a single run) or between 1 and 60 minutes.\nTo specify a single run, you can use `Schedule.once()`.", - "stability": "deprecated", - "summary": "Construct a schedule from an interval." - }, - "locationInModule": { - "filename": "lib/schedule.ts", - "line": 31 - }, - "name": "rate", - "parameters": [ - { - "docs": { - "summary": "The interval at which to run the canary." - }, - "name": "interval", - "type": { - "fqn": "aws-cdk-lib.Duration" - } - } - ], - "returns": { - "type": { - "fqn": "@aws-cdk/aws-synthetics-alpha.Schedule" - } - }, - "static": true - } - ], - "name": "Schedule", - "properties": [ - { - "docs": { - "stability": "deprecated", - "summary": "The Schedule expression." - }, - "immutable": true, - "locationInModule": { - "filename": "lib/schedule.ts", - "line": 71 - }, - "name": "expressionString", - "type": { - "primitive": "string" - } - } - ], - "symbolId": "lib/schedule:Schedule" - }, - "@aws-cdk/aws-synthetics-alpha.Test": { - "assembly": "@aws-cdk/aws-synthetics-alpha", - "docs": { - "stability": "deprecated", - "summary": "Specify a test that the canary should run." - }, - "fqn": "@aws-cdk/aws-synthetics-alpha.Test", - "kind": "class", - "locationInModule": { - "filename": "lib/canary.ts", - "line": 22 - }, - "methods": [ - { - "docs": { - "returns": "`Test` associated with the specified Code object", - "stability": "deprecated", - "summary": "Specify a custom test with your own code." - }, - "locationInModule": { - "filename": "lib/canary.ts", - "line": 29 - }, - "name": "custom", - "parameters": [ - { - "docs": { - "summary": "The configuration options." - }, - "name": "options", - "type": { - "fqn": "@aws-cdk/aws-synthetics-alpha.CustomTestOptions" - } - } - ], - "returns": { - "type": { - "fqn": "@aws-cdk/aws-synthetics-alpha.Test" - } - }, - "static": true - } - ], - "name": "Test", - "properties": [ - { - "docs": { - "stability": "deprecated", - "summary": "The code that the canary should run." - }, - "immutable": true, - "locationInModule": { - "filename": "lib/canary.ts", - "line": 39 - }, - "name": "code", - "type": { - "fqn": "@aws-cdk/aws-synthetics-alpha.Code" - } - }, - { - "docs": { - "stability": "deprecated", - "summary": "The handler of the canary." - }, - "immutable": true, - "locationInModule": { - "filename": "lib/canary.ts", - "line": 39 - }, - "name": "handler", - "type": { - "primitive": "string" - } - } - ], - "symbolId": "lib/canary:Test" - } - }, - "version": "0.0.0", - "fingerprint": "eliGrMXxfQFvAyrkm3mPEt33RTLI1n1EjGZvT0Zr/JM=" -} \ No newline at end of file diff --git a/packages/@aws-cdk/aws-synthetics-alpha/.warnings.jsii.js b/packages/@aws-cdk/aws-synthetics-alpha/.warnings.jsii.js deleted file mode 100644 index 5d9b8d489edb2..0000000000000 --- a/packages/@aws-cdk/aws-synthetics-alpha/.warnings.jsii.js +++ /dev/null @@ -1,217 +0,0 @@ -function _aws_cdk_aws_synthetics_alpha_Test(p) { -} -function _aws_cdk_aws_synthetics_alpha_CustomTestOptions(p) { - if (p == null) - return; - visitedObjects.add(p); - try { - if ("code" in p) - print("@aws-cdk/aws-synthetics-alpha.CustomTestOptions#code", ""); - if (!visitedObjects.has(p.code)) - _aws_cdk_aws_synthetics_alpha_Code(p.code); - if ("handler" in p) - print("@aws-cdk/aws-synthetics-alpha.CustomTestOptions#handler", ""); - } - finally { - visitedObjects.delete(p); - } -} -function _aws_cdk_aws_synthetics_alpha_Cleanup(p) { - if (p == null) - return; - visitedObjects.add(p); - try { - print("@aws-cdk/aws-synthetics-alpha.Cleanup", ""); - const ns = require("./lib/canary.js"); - if (Object.values(ns.Cleanup).filter(x => x === p).length > 1) - return; - if (p === ns.Cleanup.NOTHING) - print("@aws-cdk/aws-synthetics-alpha.Cleanup#NOTHING", ""); - if (p === ns.Cleanup.LAMBDA) - print("@aws-cdk/aws-synthetics-alpha.Cleanup#LAMBDA", ""); - } - finally { - visitedObjects.delete(p); - } -} -function _aws_cdk_aws_synthetics_alpha_ArtifactsBucketLocation(p) { - if (p == null) - return; - visitedObjects.add(p); - try { - if ("bucket" in p) - print("@aws-cdk/aws-synthetics-alpha.ArtifactsBucketLocation#bucket", ""); - if ("prefix" in p) - print("@aws-cdk/aws-synthetics-alpha.ArtifactsBucketLocation#prefix", ""); - } - finally { - visitedObjects.delete(p); - } -} -function _aws_cdk_aws_synthetics_alpha_CanaryProps(p) { - if (p == null) - return; - visitedObjects.add(p); - try { - if ("runtime" in p) - print("@aws-cdk/aws-synthetics-alpha.CanaryProps#runtime", ""); - if (!visitedObjects.has(p.runtime)) - _aws_cdk_aws_synthetics_alpha_Runtime(p.runtime); - if ("test" in p) - print("@aws-cdk/aws-synthetics-alpha.CanaryProps#test", ""); - if (!visitedObjects.has(p.test)) - _aws_cdk_aws_synthetics_alpha_Test(p.test); - if ("artifactsBucketLifecycleRules" in p) - print("@aws-cdk/aws-synthetics-alpha.CanaryProps#artifactsBucketLifecycleRules", ""); - if (p.artifactsBucketLifecycleRules != null) - for (const o of p.artifactsBucketLifecycleRules) - if (!visitedObjects.has(o)) - require("aws-cdk-lib/.warnings.jsii.js").aws_cdk_lib_aws_s3_LifecycleRule(o); - if ("artifactsBucketLocation" in p) - print("@aws-cdk/aws-synthetics-alpha.CanaryProps#artifactsBucketLocation", ""); - if (!visitedObjects.has(p.artifactsBucketLocation)) - _aws_cdk_aws_synthetics_alpha_ArtifactsBucketLocation(p.artifactsBucketLocation); - if ("canaryName" in p) - print("@aws-cdk/aws-synthetics-alpha.CanaryProps#canaryName", ""); - if ("cleanup" in p) - print("@aws-cdk/aws-synthetics-alpha.CanaryProps#cleanup", ""); - if (!visitedObjects.has(p.cleanup)) - _aws_cdk_aws_synthetics_alpha_Cleanup(p.cleanup); - if ("enableAutoDeleteLambdas" in p) - print("@aws-cdk/aws-synthetics-alpha.CanaryProps#enableAutoDeleteLambdas", "this feature has been deprecated by the service team, use `cleanup: Cleanup.LAMBDA` instead which will use a Custom Resource to achieve the same effect."); - if ("environmentVariables" in p) - print("@aws-cdk/aws-synthetics-alpha.CanaryProps#environmentVariables", ""); - if ("failureRetentionPeriod" in p) - print("@aws-cdk/aws-synthetics-alpha.CanaryProps#failureRetentionPeriod", ""); - if ("role" in p) - print("@aws-cdk/aws-synthetics-alpha.CanaryProps#role", ""); - if ("schedule" in p) - print("@aws-cdk/aws-synthetics-alpha.CanaryProps#schedule", ""); - if (!visitedObjects.has(p.schedule)) - _aws_cdk_aws_synthetics_alpha_Schedule(p.schedule); - if ("securityGroups" in p) - print("@aws-cdk/aws-synthetics-alpha.CanaryProps#securityGroups", ""); - if (p.securityGroups != null) - for (const o of p.securityGroups) - if (!visitedObjects.has(o)) - require("aws-cdk-lib/.warnings.jsii.js").aws_cdk_lib_aws_ec2_ISecurityGroup(o); - if ("startAfterCreation" in p) - print("@aws-cdk/aws-synthetics-alpha.CanaryProps#startAfterCreation", ""); - if ("successRetentionPeriod" in p) - print("@aws-cdk/aws-synthetics-alpha.CanaryProps#successRetentionPeriod", ""); - if ("timeToLive" in p) - print("@aws-cdk/aws-synthetics-alpha.CanaryProps#timeToLive", ""); - if ("vpc" in p) - print("@aws-cdk/aws-synthetics-alpha.CanaryProps#vpc", ""); - if ("vpcSubnets" in p) - print("@aws-cdk/aws-synthetics-alpha.CanaryProps#vpcSubnets", ""); - } - finally { - visitedObjects.delete(p); - } -} -function _aws_cdk_aws_synthetics_alpha_Canary(p) { -} -function _aws_cdk_aws_synthetics_alpha_Code(p) { -} -function _aws_cdk_aws_synthetics_alpha_CodeConfig(p) { - if (p == null) - return; - visitedObjects.add(p); - try { - if ("inlineCode" in p) - print("@aws-cdk/aws-synthetics-alpha.CodeConfig#inlineCode", ""); - if ("s3Location" in p) - print("@aws-cdk/aws-synthetics-alpha.CodeConfig#s3Location", ""); - } - finally { - visitedObjects.delete(p); - } -} -function _aws_cdk_aws_synthetics_alpha_AssetCode(p) { -} -function _aws_cdk_aws_synthetics_alpha_InlineCode(p) { -} -function _aws_cdk_aws_synthetics_alpha_S3Code(p) { -} -function _aws_cdk_aws_synthetics_alpha_RuntimeFamily(p) { - if (p == null) - return; - visitedObjects.add(p); - try { - print("@aws-cdk/aws-synthetics-alpha.RuntimeFamily", ""); - const ns = require("./lib/runtime.js"); - if (Object.values(ns.RuntimeFamily).filter(x => x === p).length > 1) - return; - if (p === ns.RuntimeFamily.NODEJS) - print("@aws-cdk/aws-synthetics-alpha.RuntimeFamily#NODEJS", ""); - if (p === ns.RuntimeFamily.PYTHON) - print("@aws-cdk/aws-synthetics-alpha.RuntimeFamily#PYTHON", ""); - if (p === ns.RuntimeFamily.OTHER) - print("@aws-cdk/aws-synthetics-alpha.RuntimeFamily#OTHER", ""); - } - finally { - visitedObjects.delete(p); - } -} -function _aws_cdk_aws_synthetics_alpha_Runtime(p) { -} -function _aws_cdk_aws_synthetics_alpha_Schedule(p) { -} -function _aws_cdk_aws_synthetics_alpha_CronOptions(p) { - if (p == null) - return; - visitedObjects.add(p); - try { - if ("day" in p) - print("@aws-cdk/aws-synthetics-alpha.CronOptions#day", ""); - if ("hour" in p) - print("@aws-cdk/aws-synthetics-alpha.CronOptions#hour", ""); - if ("minute" in p) - print("@aws-cdk/aws-synthetics-alpha.CronOptions#minute", ""); - if ("month" in p) - print("@aws-cdk/aws-synthetics-alpha.CronOptions#month", ""); - if ("weekDay" in p) - print("@aws-cdk/aws-synthetics-alpha.CronOptions#weekDay", ""); - } - finally { - visitedObjects.delete(p); - } -} -function print(name, deprecationMessage) { - const deprecated = process.env.JSII_DEPRECATED; - const deprecationMode = ["warn", "fail", "quiet"].includes(deprecated) ? deprecated : "warn"; - const message = `${name} is deprecated.\n ${deprecationMessage.trim()}\n This API will be removed in the next major release.`; - switch (deprecationMode) { - case "fail": - throw new DeprecationError(message); - case "warn": - console.warn("[WARNING]", message); - break; - } -} -function getPropertyDescriptor(obj, prop) { - const descriptor = Object.getOwnPropertyDescriptor(obj, prop); - if (descriptor) { - return descriptor; - } - const proto = Object.getPrototypeOf(obj); - const prototypeDescriptor = proto && getPropertyDescriptor(proto, prop); - if (prototypeDescriptor) { - return prototypeDescriptor; - } - return {}; -} -const visitedObjects = new Set(); -class DeprecationError extends Error { - constructor(...args) { - super(...args); - Object.defineProperty(this, "name", { - configurable: false, - enumerable: true, - value: "DeprecationError", - writable: false, - }); - } -} -module.exports = { print, getPropertyDescriptor, DeprecationError, _aws_cdk_aws_synthetics_alpha_Test, _aws_cdk_aws_synthetics_alpha_CustomTestOptions, _aws_cdk_aws_synthetics_alpha_Cleanup, _aws_cdk_aws_synthetics_alpha_ArtifactsBucketLocation, _aws_cdk_aws_synthetics_alpha_CanaryProps, _aws_cdk_aws_synthetics_alpha_Canary, _aws_cdk_aws_synthetics_alpha_Code, _aws_cdk_aws_synthetics_alpha_CodeConfig, _aws_cdk_aws_synthetics_alpha_AssetCode, _aws_cdk_aws_synthetics_alpha_InlineCode, _aws_cdk_aws_synthetics_alpha_S3Code, _aws_cdk_aws_synthetics_alpha_RuntimeFamily, _aws_cdk_aws_synthetics_alpha_Runtime, _aws_cdk_aws_synthetics_alpha_Schedule, _aws_cdk_aws_synthetics_alpha_CronOptions }; diff --git a/packages/@aws-cdk/aws-synthetics-alpha/lib/canary.d.ts b/packages/@aws-cdk/aws-synthetics-alpha/lib/canary.d.ts deleted file mode 100644 index c964ced1e48ee..0000000000000 --- a/packages/@aws-cdk/aws-synthetics-alpha/lib/canary.d.ts +++ /dev/null @@ -1,308 +0,0 @@ -import { Metric, MetricOptions } from 'aws-cdk-lib/aws-cloudwatch'; -import * as ec2 from 'aws-cdk-lib/aws-ec2'; -import * as iam from 'aws-cdk-lib/aws-iam'; -import * as s3 from 'aws-cdk-lib/aws-s3'; -import * as cdk from 'aws-cdk-lib/core'; -import { Construct } from 'constructs'; -import { Code } from './code'; -import { Runtime } from './runtime'; -import { Schedule } from './schedule'; -/** - * Specify a test that the canary should run - */ -export declare class Test { - readonly code: Code; - readonly handler: string; - /** - * Specify a custom test with your own code - * - * @returns `Test` associated with the specified Code object - * @param options The configuration options - */ - static custom(options: CustomTestOptions): Test; - /** - * Construct a Test property - * - * @param code The code that the canary should run - * @param handler The handler of the canary - */ - private constructor(); -} -/** - * Properties for specifying a test - */ -export interface CustomTestOptions { - /** - * The code of the canary script - */ - readonly code: Code; - /** - * The handler for the code. Must end with `.handler`. - */ - readonly handler: string; -} -/** - * Different ways to clean up underlying Canary resources - * when the Canary is deleted. - */ -export declare enum Cleanup { - /** - * Clean up nothing. The user is responsible for cleaning up - * all resources left behind by the Canary. - */ - NOTHING = "nothing", - /** - * Clean up the underlying Lambda function only. The user is - * responsible for cleaning up all other resources left behind - * by the Canary. - */ - LAMBDA = "lambda" -} -/** - * Options for specifying the s3 location that stores the data of each canary run. The artifacts bucket location **cannot** - * be updated once the canary is created. - */ -export interface ArtifactsBucketLocation { - /** - * The s3 location that stores the data of each run. - */ - readonly bucket: s3.IBucket; - /** - * The S3 bucket prefix. Specify this if you want a more specific path within the artifacts bucket. - * - * @default - no prefix - */ - readonly prefix?: string; -} -/** - * Properties for a canary - */ -export interface CanaryProps { - /** - * The s3 location that stores the data of the canary runs. - * - * @default - A new s3 bucket will be created without a prefix. - */ - readonly artifactsBucketLocation?: ArtifactsBucketLocation; - /** - * Canary execution role. - * - * This is the role that will be assumed by the canary upon execution. - * It controls the permissions that the canary will have. The role must - * be assumable by the AWS Lambda service principal. - * - * If not supplied, a role will be created with all the required permissions. - * If you provide a Role, you must add the required permissions. - * - * @see required permissions: https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-synthetics-canary.html#cfn-synthetics-canary-executionrolearn - * - * @default - A unique role will be generated for this canary. - * You can add permissions to roles by calling 'addToRolePolicy'. - */ - readonly role?: iam.IRole; - /** - * How long the canary will be in a 'RUNNING' state. For example, if you set `timeToLive` to be 1 hour and `schedule` to be `rate(10 minutes)`, - * your canary will run at 10 minute intervals for an hour, for a total of 6 times. - * - * @default - no limit - */ - readonly timeToLive?: cdk.Duration; - /** - * Specify the schedule for how often the canary runs. For example, if you set `schedule` to `rate(10 minutes)`, then the canary will run every 10 minutes. - * You can set the schedule with `Schedule.rate(Duration)` (recommended) or you can specify an expression using `Schedule.expression()`. - * @default 'rate(5 minutes)' - */ - readonly schedule?: Schedule; - /** - * Whether or not the canary should start after creation. - * - * @default true - */ - readonly startAfterCreation?: boolean; - /** - * How many days should successful runs be retained. - * - * @default Duration.days(31) - */ - readonly successRetentionPeriod?: cdk.Duration; - /** - * How many days should failed runs be retained. - * - * @default Duration.days(31) - */ - readonly failureRetentionPeriod?: cdk.Duration; - /** - * The name of the canary. Be sure to give it a descriptive name that distinguishes it from - * other canaries in your account. - * - * Do not include secrets or proprietary information in your canary name. The canary name - * makes up part of the canary ARN, which is included in outbound calls over the internet. - * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/servicelens_canaries_security.html - * - * @default - A unique name will be generated from the construct ID - */ - readonly canaryName?: string; - /** - * Specify the runtime version to use for the canary. - * - * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Canaries_Library.html - */ - readonly runtime: Runtime; - /** - * The type of test that you want your canary to run. Use `Test.custom()` to specify the test to run. - */ - readonly test: Test; - /** - * Key-value pairs that the Synthetics caches and makes available for your canary scripts. Use environment variables - * to apply configuration changes, such as test and production environment configurations, without changing your - * Canary script source code. - * - * @default - No environment variables. - */ - readonly environmentVariables?: { - [key: string]: string; - }; - /** - * The VPC where this canary is run. - * - * Specify this if the canary needs to access resources in a VPC. - * - * @default - Not in VPC - */ - readonly vpc?: ec2.IVpc; - /** - * Where to place the network interfaces within the VPC. You must provide `vpc` when using this prop. - * - * @default - the Vpc default strategy if not specified - */ - readonly vpcSubnets?: ec2.SubnetSelection; - /** - * The list of security groups to associate with the canary's network interfaces. You must provide `vpc` when using this prop. - * - * @default - If the canary is placed within a VPC and a security group is - * not specified a dedicated security group will be created for this canary. - */ - readonly securityGroups?: ec2.ISecurityGroup[]; - /** - * Whether or not to delete the lambda resources when the canary is deleted - * - * @see https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-synthetics-canary.html#cfn-synthetics-canary-deletelambdaresourcesoncanarydeletion - * - * @default false - * @deprecated this feature has been deprecated by the service team, use `cleanup: Cleanup.LAMBDA` instead which will use a Custom Resource to achieve the same effect. - */ - readonly enableAutoDeleteLambdas?: boolean; - /** - * Specify the underlying resources to be cleaned up when the canary is deleted. - * Using `Cleanup.LAMBDA` will create a Custom Resource to achieve this. - * - * @default Cleanup.NOTHING - */ - readonly cleanup?: Cleanup; - /** - * Lifecycle rules for the generated canary artifact bucket. Has no effect - * if a bucket is passed to `artifactsBucketLocation`. If you pass a bucket - * to `artifactsBucketLocation`, you can add lifecycle rules to the bucket - * itself. - * - * @default - no rules applied to the generated bucket. - */ - readonly artifactsBucketLifecycleRules?: Array; -} -/** - * Define a new Canary - */ -export declare class Canary extends cdk.Resource implements ec2.IConnectable { - /** - * Execution role associated with this Canary. - */ - readonly role: iam.IRole; - /** - * The canary ID - * @attribute - */ - readonly canaryId: string; - /** - * The state of the canary. For example, 'RUNNING', 'STOPPED', 'NOT STARTED', or 'ERROR'. - * @attribute - */ - readonly canaryState: string; - /** - * The canary Name - * @attribute - */ - readonly canaryName: string; - /** - * Bucket where data from each canary run is stored. - */ - readonly artifactsBucket: s3.IBucket; - /** - * Actual connections object for the underlying Lambda - * - * May be unset, in which case the canary Lambda is not configured for use in a VPC. - * @internal - */ - private readonly _connections?; - private readonly _resource; - constructor(scope: Construct, id: string, props: CanaryProps); - private cleanupUnderlyingResources; - /** - * Access the Connections object - * - * Will fail if not a VPC-enabled Canary - */ - get connections(): ec2.Connections; - /** - * Measure the Duration of a single canary run, in seconds. - * - * @param options - configuration options for the metric - * - * @default avg over 5 minutes - */ - metricDuration(options?: MetricOptions): Metric; - /** - * Measure the percentage of successful canary runs. - * - * @param options - configuration options for the metric - * - * @default avg over 5 minutes - */ - metricSuccessPercent(options?: MetricOptions): Metric; - /** - * Measure the number of failed canary runs over a given time period. - * - * Default: sum over 5 minutes - * - * @param options - configuration options for the metric - */ - metricFailed(options?: MetricOptions): Metric; - /** - * Returns a default role for the canary - */ - private createDefaultRole; - private logGroupArn; - private lambdaArn; - /** - * Returns the code object taken in by the canary resource. - */ - private createCode; - /** - * Verifies that the handler name matches the conventions given a certain runtime. - * - * @see https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-synthetics-canary-code.html#cfn-synthetics-canary-code-handler - * @param handler - the name of the handler - * @param runtime - the runtime version - */ - private validateHandler; - private createRunConfig; - /** - * Returns a canary schedule object - */ - private createSchedule; - private createVpcConfig; - /** - * Creates a unique name for the canary. The generated name is the physical ID of the canary. - */ - private generateUniqueName; - private cannedMetric; -} diff --git a/packages/@aws-cdk/aws-synthetics-alpha/lib/canary.js b/packages/@aws-cdk/aws-synthetics-alpha/lib/canary.js deleted file mode 100644 index 0ccc6c68dd552..0000000000000 --- a/packages/@aws-cdk/aws-synthetics-alpha/lib/canary.js +++ /dev/null @@ -1,439 +0,0 @@ -"use strict"; -var _a, _b; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.Canary = exports.Cleanup = exports.Test = void 0; -const jsiiDeprecationWarnings = require("../.warnings.jsii.js"); -const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti"); -const crypto = require("crypto"); -const aws_cloudwatch_1 = require("aws-cdk-lib/aws-cloudwatch"); -const ec2 = require("aws-cdk-lib/aws-ec2"); -const iam = require("aws-cdk-lib/aws-iam"); -const s3 = require("aws-cdk-lib/aws-s3"); -const cdk = require("aws-cdk-lib/core"); -const runtime_1 = require("./runtime"); -const synthetics_canned_metrics_generated_1 = require("aws-cdk-lib/aws-synthetics/lib/synthetics-canned-metrics.generated"); -const aws_synthetics_1 = require("aws-cdk-lib/aws-synthetics"); -const core_1 = require("aws-cdk-lib/core"); -const path = require("path"); -const AUTO_DELETE_UNDERLYING_RESOURCES_RESOURCE_TYPE = 'Custom::SyntheticsAutoDeleteUnderlyingResources'; -const AUTO_DELETE_UNDERLYING_RESOURCES_TAG = 'aws-cdk:auto-delete-underlying-resources'; -/** - * Specify a test that the canary should run - */ -class Test { - /** - * Specify a custom test with your own code - * - * @returns `Test` associated with the specified Code object - * @param options The configuration options - */ - static custom(options) { - try { - jsiiDeprecationWarnings.print("@aws-cdk/aws-synthetics-alpha.Test#custom", ""); - jsiiDeprecationWarnings._aws_cdk_aws_synthetics_alpha_CustomTestOptions(options); - } - catch (error) { - if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { - Error.captureStackTrace(error, this.custom); - } - throw error; - } - return new Test(options.code, options.handler); - } - /** - * Construct a Test property - * - * @param code The code that the canary should run - * @param handler The handler of the canary - */ - constructor(code, handler) { - this.code = code; - this.handler = handler; - } -} -exports.Test = Test; -_a = JSII_RTTI_SYMBOL_1; -Test[_a] = { fqn: "@aws-cdk/aws-synthetics-alpha.Test", version: "0.0.0" }; -/** - * Different ways to clean up underlying Canary resources - * when the Canary is deleted. - */ -var Cleanup; -(function (Cleanup) { - /** - * Clean up nothing. The user is responsible for cleaning up - * all resources left behind by the Canary. - */ - Cleanup["NOTHING"] = "nothing"; - /** - * Clean up the underlying Lambda function only. The user is - * responsible for cleaning up all other resources left behind - * by the Canary. - */ - Cleanup["LAMBDA"] = "lambda"; -})(Cleanup || (exports.Cleanup = Cleanup = {})); -/** - * Define a new Canary - */ -class Canary extends cdk.Resource { - constructor(scope, id, props) { - try { - jsiiDeprecationWarnings.print("@aws-cdk/aws-synthetics-alpha.Canary", ""); - jsiiDeprecationWarnings._aws_cdk_aws_synthetics_alpha_CanaryProps(props); - } - catch (error) { - if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { - Error.captureStackTrace(error, Canary); - } - throw error; - } - if (props.canaryName && !cdk.Token.isUnresolved(props.canaryName)) { - validateName(props.canaryName); - } - super(scope, id, { - physicalName: props.canaryName || cdk.Lazy.string({ - produce: () => this.generateUniqueName(), - }), - }); - this.artifactsBucket = props.artifactsBucketLocation?.bucket ?? new s3.Bucket(this, 'ArtifactsBucket', { - encryption: s3.BucketEncryption.KMS_MANAGED, - enforceSSL: true, - lifecycleRules: props.artifactsBucketLifecycleRules, - }); - this.role = props.role ?? this.createDefaultRole(props); - if (props.vpc) { - // Security Groups are created and/or appended in `createVpcConfig`. - this._connections = new ec2.Connections({}); - } - const resource = new aws_synthetics_1.CfnCanary(this, 'Resource', { - artifactS3Location: this.artifactsBucket.s3UrlForObject(props.artifactsBucketLocation?.prefix), - executionRoleArn: this.role.roleArn, - startCanaryAfterCreation: props.startAfterCreation ?? true, - runtimeVersion: props.runtime.name, - name: this.physicalName, - schedule: this.createSchedule(props), - failureRetentionPeriod: props.failureRetentionPeriod?.toDays(), - successRetentionPeriod: props.successRetentionPeriod?.toDays(), - code: this.createCode(props), - runConfig: this.createRunConfig(props), - vpcConfig: this.createVpcConfig(props), - }); - this._resource = resource; - this.canaryId = resource.attrId; - this.canaryState = resource.attrState; - this.canaryName = this.getResourceNameAttribute(resource.ref); - if (props.cleanup === Cleanup.LAMBDA ?? props.enableAutoDeleteLambdas) { - this.cleanupUnderlyingResources(); - } - } - cleanupUnderlyingResources() { - const provider = core_1.CustomResourceProvider.getOrCreateProvider(this, AUTO_DELETE_UNDERLYING_RESOURCES_RESOURCE_TYPE, { - codeDirectory: path.join(__dirname, '..', 'custom-resource-handlers', 'dist', 'aws-synthetics-alpha', 'auto-delete-underlying-resources-handler'), - useCfnResponseWrapper: false, - runtime: core_1.CustomResourceProviderRuntime.NODEJS_18_X, - description: `Lambda function for auto-deleting underlying resources created by ${this.canaryName}.`, - policyStatements: [{ - Effect: 'Allow', - Action: ['lambda:DeleteFunction'], - Resource: this.lambdaArn(), - }, { - Effect: 'Allow', - Action: ['synthetics:GetCanary'], - Resource: '*', - }], - }); - new core_1.CustomResource(this, 'AutoDeleteUnderlyingResourcesCustomResource', { - resourceType: AUTO_DELETE_UNDERLYING_RESOURCES_RESOURCE_TYPE, - serviceToken: provider.serviceToken, - properties: { - CanaryName: this.canaryName, - }, - }); - // We also tag the canary to record the fact that we want it autodeleted. - // The custom resource will check this tag before actually doing the delete. - // Because tagging and untagging will ALWAYS happen before the CR is deleted, - // we can set `autoDeleteLambda: false` without the removal of the CR emptying - // the lambda as a side effect. - cdk.Tags.of(this._resource).add(AUTO_DELETE_UNDERLYING_RESOURCES_TAG, 'true'); - } - /** - * Access the Connections object - * - * Will fail if not a VPC-enabled Canary - */ - get connections() { - try { - jsiiDeprecationWarnings.print("@aws-cdk/aws-synthetics-alpha.Canary#connections", ""); - } - catch (error) { - if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { - Error.captureStackTrace(error, jsiiDeprecationWarnings.getPropertyDescriptor(this, "connections").get); - } - throw error; - } - if (!this._connections) { - // eslint-disable-next-line max-len - throw new Error('Only VPC-associated Canaries have security groups to manage. Supply the "vpc" parameter when creating the Canary.'); - } - return this._connections; - } - /** - * Measure the Duration of a single canary run, in seconds. - * - * @param options - configuration options for the metric - * - * @default avg over 5 minutes - */ - metricDuration(options) { - try { - jsiiDeprecationWarnings.print("@aws-cdk/aws-synthetics-alpha.Canary#metricDuration", ""); - } - catch (error) { - if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { - Error.captureStackTrace(error, this.metricDuration); - } - throw error; - } - return new aws_cloudwatch_1.Metric({ - ...synthetics_canned_metrics_generated_1.CloudWatchSyntheticsMetrics.durationMaximum({ CanaryName: this.canaryName }), - ...{ statistic: 'Average' }, - ...options, - }).attachTo(this); - } - /** - * Measure the percentage of successful canary runs. - * - * @param options - configuration options for the metric - * - * @default avg over 5 minutes - */ - metricSuccessPercent(options) { - try { - jsiiDeprecationWarnings.print("@aws-cdk/aws-synthetics-alpha.Canary#metricSuccessPercent", ""); - } - catch (error) { - if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { - Error.captureStackTrace(error, this.metricSuccessPercent); - } - throw error; - } - return this.cannedMetric(synthetics_canned_metrics_generated_1.CloudWatchSyntheticsMetrics.successPercentAverage, options); - } - /** - * Measure the number of failed canary runs over a given time period. - * - * Default: sum over 5 minutes - * - * @param options - configuration options for the metric - */ - metricFailed(options) { - try { - jsiiDeprecationWarnings.print("@aws-cdk/aws-synthetics-alpha.Canary#metricFailed", ""); - } - catch (error) { - if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { - Error.captureStackTrace(error, this.metricFailed); - } - throw error; - } - return this.cannedMetric(synthetics_canned_metrics_generated_1.CloudWatchSyntheticsMetrics.failedSum, options); - } - /** - * Returns a default role for the canary - */ - createDefaultRole(props) { - const prefix = props.artifactsBucketLocation?.prefix; - // Created role will need these policies to run the Canary. - // https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-synthetics-canary.html#cfn-synthetics-canary-executionrolearn - const policy = new iam.PolicyDocument({ - statements: [ - new iam.PolicyStatement({ - resources: ['*'], - actions: ['s3:ListAllMyBuckets'], - }), - new iam.PolicyStatement({ - resources: [this.artifactsBucket.bucketArn], - actions: ['s3:GetBucketLocation'], - }), - new iam.PolicyStatement({ - resources: [this.artifactsBucket.arnForObjects(`${prefix ? prefix + '/*' : '*'}`)], - actions: ['s3:PutObject'], - }), - new iam.PolicyStatement({ - resources: ['*'], - actions: ['cloudwatch:PutMetricData'], - conditions: { StringEquals: { 'cloudwatch:namespace': 'CloudWatchSynthetics' } }, - }), - new iam.PolicyStatement({ - resources: [this.logGroupArn()], - actions: ['logs:CreateLogStream', 'logs:CreateLogGroup', 'logs:PutLogEvents'], - }), - ], - }); - const managedPolicies = []; - if (props.vpc) { - // Policy that will have ENI creation permissions - managedPolicies.push(iam.ManagedPolicy.fromAwsManagedPolicyName('service-role/AWSLambdaVPCAccessExecutionRole')); - } - return new iam.Role(this, 'ServiceRole', { - assumedBy: new iam.ServicePrincipal('lambda.amazonaws.com'), - inlinePolicies: { - canaryPolicy: policy, - }, - managedPolicies, - }); - } - logGroupArn() { - return cdk.Stack.of(this).formatArn({ - service: 'logs', - resource: 'log-group', - arnFormat: cdk.ArnFormat.COLON_RESOURCE_NAME, - resourceName: '/aws/lambda/cwsyn-*', - }); - } - lambdaArn() { - return cdk.Stack.of(this).formatArn({ - service: 'lambda', - resource: 'function', - arnFormat: cdk.ArnFormat.COLON_RESOURCE_NAME, - resourceName: 'cwsyn-*', - }); - } - /** - * Returns the code object taken in by the canary resource. - */ - createCode(props) { - this.validateHandler(props.test.handler, props.runtime); - const codeConfig = { - handler: props.test.handler, - ...props.test.code.bind(this, props.test.handler, props.runtime.family), - }; - return { - handler: codeConfig.handler, - script: codeConfig.inlineCode, - s3Bucket: codeConfig.s3Location?.bucketName, - s3Key: codeConfig.s3Location?.objectKey, - s3ObjectVersion: codeConfig.s3Location?.objectVersion, - }; - } - /** - * Verifies that the handler name matches the conventions given a certain runtime. - * - * @see https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-synthetics-canary-code.html#cfn-synthetics-canary-code-handler - * @param handler - the name of the handler - * @param runtime - the runtime version - */ - validateHandler(handler, runtime) { - const oldRuntimes = [ - runtime_1.Runtime.SYNTHETICS_PYTHON_SELENIUM_1_0, - runtime_1.Runtime.SYNTHETICS_NODEJS_PUPPETEER_3_0, - runtime_1.Runtime.SYNTHETICS_NODEJS_PUPPETEER_3_1, - runtime_1.Runtime.SYNTHETICS_NODEJS_PUPPETEER_3_2, - runtime_1.Runtime.SYNTHETICS_NODEJS_PUPPETEER_3_3, - ]; - if (oldRuntimes.includes(runtime)) { - if (!handler.match(/^[0-9A-Za-z_\\-]+\.handler*$/)) { - throw new Error(`Canary Handler must be specified as \'fileName.handler\' for legacy runtimes, received ${handler}`); - } - } - else { - if (!handler.match(/^([0-9a-zA-Z_-]+\/)*[0-9A-Za-z_\\-]+\.[A-Za-z_][A-Za-z0-9_]*$/)) { - throw new Error(`Canary Handler must be specified either as \'fileName.handler\', \'fileName.functionName\', or \'folder/fileName.functionName\', received ${handler}`); - } - } - if (handler.length < 1 || handler.length > 128) { - throw new Error(`Canary Handler length must be between 1 and 128, received ${handler.length}`); - } - } - createRunConfig(props) { - if (!props.environmentVariables) { - return undefined; - } - return { - environmentVariables: props.environmentVariables, - }; - } - /** - * Returns a canary schedule object - */ - createSchedule(props) { - return { - durationInSeconds: String(`${props.timeToLive?.toSeconds() ?? 0}`), - expression: props.schedule?.expressionString ?? 'rate(5 minutes)', - }; - } - createVpcConfig(props) { - if (!props.vpc) { - if (props.vpcSubnets != null || props.securityGroups != null) { - throw new Error("You must provide the 'vpc' prop when using VPC-related properties."); - } - return undefined; - } - const { subnetIds } = props.vpc.selectSubnets(props.vpcSubnets); - if (subnetIds.length < 1) { - throw new Error('No matching subnets found in the VPC.'); - } - let securityGroups; - if (props.securityGroups && props.securityGroups.length > 0) { - securityGroups = props.securityGroups; - } - else { - const securityGroup = new ec2.SecurityGroup(this, 'SecurityGroup', { - vpc: props.vpc, - description: 'Automatic security group for Canary ' + cdk.Names.uniqueId(this), - }); - securityGroups = [securityGroup]; - } - this._connections.addSecurityGroup(...securityGroups); - return { - vpcId: props.vpc.vpcId, - subnetIds, - securityGroupIds: cdk.Lazy.list({ produce: () => this.connections.securityGroups.map(sg => sg.securityGroupId) }), - }; - } - /** - * Creates a unique name for the canary. The generated name is the physical ID of the canary. - */ - generateUniqueName() { - const name = cdk.Names.uniqueId(this).toLowerCase().replace(' ', '-'); - if (name.length <= 21) { - return name; - } - else { - return name.substring(0, 15) + nameHash(name); - } - } - cannedMetric(fn, props) { - return new aws_cloudwatch_1.Metric({ - ...fn({ CanaryName: this.canaryName }), - ...props, - }).attachTo(this); - } -} -exports.Canary = Canary; -_b = JSII_RTTI_SYMBOL_1; -Canary[_b] = { fqn: "@aws-cdk/aws-synthetics-alpha.Canary", version: "0.0.0" }; -/** - * Take a hash of the given name. - * - * @param name the name to be hashed - */ -function nameHash(name) { - const md5 = crypto.createHash('sha256').update(name).digest('hex'); - return md5.slice(0, 6); -} -const nameRegex = /^[0-9a-z_\-]+$/; -/** - * Verifies that the name fits the regex expression: ^[0-9a-z_\-]+$. - * - * @param name - the given name of the canary - */ -function validateName(name) { - if (name.length > 21) { - throw new Error(`Canary name is too large, must be between 1 and 21 characters, but is ${name.length} (got "${name}")`); - } - if (!nameRegex.test(name)) { - throw new Error(`Canary name must be lowercase, numbers, hyphens, or underscores (got "${name}")`); - } -} -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FuYXJ5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiY2FuYXJ5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLGlDQUFpQztBQUNqQywrREFBZ0Y7QUFDaEYsMkNBQTJDO0FBQzNDLDJDQUEyQztBQUMzQyx5Q0FBeUM7QUFDekMsd0NBQXdDO0FBR3hDLHVDQUFvQztBQUVwQyw0SEFBaUg7QUFDakgsK0RBQXVEO0FBQ3ZELDJDQUF5RztBQUN6Ryw2QkFBNkI7QUFFN0IsTUFBTSw4Q0FBOEMsR0FBRyxpREFBaUQsQ0FBQztBQUN6RyxNQUFNLG9DQUFvQyxHQUFHLDBDQUEwQyxDQUFDO0FBRXhGOztHQUVHO0FBQ0gsTUFBYSxJQUFJO0lBQ2Y7Ozs7O09BS0c7SUFDSSxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQTBCOzs7Ozs7Ozs7OztRQUM3QyxPQUFPLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0tBQ2hEO0lBRUQ7Ozs7O09BS0c7SUFDSCxZQUFvQyxJQUFVLEVBQWtCLE9BQWU7UUFBM0MsU0FBSSxHQUFKLElBQUksQ0FBTTtRQUFrQixZQUFPLEdBQVAsT0FBTyxDQUFRO0tBQzlFOztBQWxCSCxvQkFtQkM7OztBQWlCRDs7O0dBR0c7QUFDSCxJQUFZLE9BYVg7QUFiRCxXQUFZLE9BQU87SUFDakI7OztPQUdHO0lBQ0gsOEJBQW1CLENBQUE7SUFFbkI7Ozs7T0FJRztJQUNILDRCQUFpQixDQUFBO0FBQ25CLENBQUMsRUFiVyxPQUFPLHVCQUFQLE9BQU8sUUFhbEI7QUEwS0Q7O0dBRUc7QUFDSCxNQUFhLE1BQU8sU0FBUSxHQUFHLENBQUMsUUFBUTtJQXNDdEMsWUFBbUIsS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBa0I7Ozs7Ozs7K0NBdEN4RCxNQUFNOzs7O1FBdUNmLElBQUksS0FBSyxDQUFDLFVBQVUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsWUFBWSxD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SUFDaEMsSUFBSSxJQUFJLENBQUMsTUFBTSxHQUFHLEVBQUUsRUFBRTtRQUNwQixNQUFNLElBQUksS0FBSyxDQUFDLHlFQUF5RSxJQUFJLENBQUMsTUFBTSxVQUFVLElBQUksSUFBSSxDQUFDLENBQUM7S0FDekg7SUFDRCxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRTtRQUN6QixNQUFNLElBQUksS0FBSyxDQUFDLHlFQUF5RSxJQUFJLElBQUksQ0FBQyxDQUFDO0tBQ3BHO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGNyeXB0byBmcm9tICdjcnlwdG8nO1xuaW1wb3J0IHsgTWV0cmljLCBNZXRyaWNPcHRpb25zLCBNZXRyaWNQcm9wcyB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1jbG91ZHdhdGNoJztcbmltcG9ydCAqIGFzIGVjMiBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZWMyJztcbmltcG9ydCAqIGFzIGlhbSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtaWFtJztcbmltcG9ydCAqIGFzIHMzIGZyb20gJ2F3cy1jZGstbGliL2F3cy1zMyc7XG5pbXBvcnQgKiBhcyBjZGsgZnJvbSAnYXdzLWNkay1saWIvY29yZSc7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCB7IENvZGUgfSBmcm9tICcuL2NvZGUnO1xuaW1wb3J0IHsgUnVudGltZSB9IGZyb20gJy4vcnVudGltZSc7XG5pbXBvcnQgeyBTY2hlZHVsZSB9IGZyb20gJy4vc2NoZWR1bGUnO1xuaW1wb3J0IHsgQ2xvdWRXYXRjaFN5bnRoZXRpY3NNZXRyaWNzIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLXN5bnRoZXRpY3MvbGliL3N5bnRoZXRpY3MtY2FubmVkLW1ldHJpY3MuZ2VuZXJhdGVkJztcbmltcG9ydCB7IENmbkNhbmFyeSB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1zeW50aGV0aWNzJztcbmltcG9ydCB7IEN1c3RvbVJlc291cmNlLCBDdXN0b21SZXNvdXJjZVByb3ZpZGVyLCBDdXN0b21SZXNvdXJjZVByb3ZpZGVyUnVudGltZSB9IGZyb20gJ2F3cy1jZGstbGliL2NvcmUnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcblxuY29uc3QgQVVUT19ERUxFVEVfVU5ERVJMWUlOR19SRVNPVVJDRVNfUkVTT1VSQ0VfVFlQRSA9ICdDdXN0b206OlN5bnRoZXRpY3NBdXRvRGVsZXRlVW5kZXJseWluZ1Jlc291cmNlcyc7XG5jb25zdCBBVVRPX0RFTEVURV9VTkRFUkxZSU5HX1JFU09VUkNFU19UQUcgPSAnYXdzLWNkazphdXRvLWRlbGV0ZS11bmRlcmx5aW5nLXJlc291cmNlcyc7XG5cbi8qKlxuICogU3BlY2lmeSBhIHRlc3QgdGhhdCB0aGUgY2FuYXJ5IHNob3VsZCBydW5cbiAqL1xuZXhwb3J0IGNsYXNzIFRlc3Qge1xuICAvKipcbiAgICogU3BlY2lmeSBhIGN1c3RvbSB0ZXN0IHdpdGggeW91ciBvd24gY29kZVxuICAgKlxuICAgKiBAcmV0dXJucyBgVGVzdGAgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQgQ29kZSBvYmplY3RcbiAgICogQHBhcmFtIG9wdGlvbnMgVGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9uc1xuICAgKi9cbiAgcHVibGljIHN0YXRpYyBjdXN0b20ob3B0aW9uczogQ3VzdG9tVGVzdE9wdGlvbnMpOiBUZXN0IHtcbiAgICByZXR1cm4gbmV3IFRlc3Qob3B0aW9ucy5jb2RlLCBvcHRpb25zLmhhbmRsZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdCBhIFRlc3QgcHJvcGVydHlcbiAgICpcbiAgICogQHBhcmFtIGNvZGUgVGhlIGNvZGUgdGhhdCB0aGUgY2FuYXJ5IHNob3VsZCBydW5cbiAgICogQHBhcmFtIGhhbmRsZXIgVGhlIGhhbmRsZXIgb2YgdGhlIGNhbmFyeVxuICAgKi9cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihwdWJsaWMgcmVhZG9ubHkgY29kZTogQ29kZSwgcHVibGljIHJlYWRvbmx5IGhhbmRsZXI6IHN0cmluZykge1xuICB9XG59XG5cbi8qKlxuICogUHJvcGVydGllcyBmb3Igc3BlY2lmeWluZyBhIHRlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDdXN0b21UZXN0T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgY29kZSBvZiB0aGUgY2FuYXJ5IHNjcmlwdFxuICAgKi9cbiAgcmVhZG9ubHkgY29kZTogQ29kZSxcblxuICAvKipcbiAgICogVGhlIGhhbmRsZXIgZm9yIHRoZSBjb2RlLiBNdXN0IGVuZCB3aXRoIGAuaGFuZGxlcmAuXG4gICAqL1xuICByZWFkb25seSBoYW5kbGVyOiBzdHJpbmcsXG59XG5cbi8qKlxuICogRGlmZmVyZW50IHdheXMgdG8gY2xlYW4gdXAgdW5kZXJseWluZyBDYW5hcnkgcmVzb3VyY2VzXG4gKiB3aGVuIHRoZSBDYW5hcnkgaXMgZGVsZXRlZC5cbiAqL1xuZXhwb3J0IGVudW0gQ2xlYW51cCB7XG4gIC8qKlxuICAgKiBDbGVhbiB1cCBub3RoaW5nLiBUaGUgdXNlciBpcyByZXNwb25zaWJsZSBmb3IgY2xlYW5pbmcgdXBcbiAgICogYWxsIHJlc291cmNlcyBsZWZ0IGJlaGluZCBieSB0aGUgQ2FuYXJ5LlxuICAgKi9cbiAgTk9USElORyA9ICdub3RoaW5nJyxcblxuICAvKipcbiAgICogQ2xlYW4gdXAgdGhlIHVuZGVybHlpbmcgTGFtYmRhIGZ1bmN0aW9uIG9ubHkuIFRoZSB1c2VyIGlzXG4gICAqIHJlc3BvbnNpYmxlIGZvciBjbGVhbmluZyB1cCBhbGwgb3RoZXIgcmVzb3VyY2VzIGxlZnQgYmVoaW5kXG4gICAqIGJ5IHRoZSBDYW5hcnkuXG4gICAqL1xuICBMQU1CREEgPSAnbGFtYmRhJyxcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBzcGVjaWZ5aW5nIHRoZSBzMyBsb2NhdGlvbiB0aGF0IHN0b3JlcyB0aGUgZGF0YSBvZiBlYWNoIGNhbmFyeSBydW4uIFRoZSBhcnRpZmFjdHMgYnVja2V0IGxvY2F0aW9uICoqY2Fubm90KipcbiAqIGJlIHVwZGF0ZWQgb25jZSB0aGUgY2FuYXJ5IGlzIGNyZWF0ZWQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXJ0aWZhY3RzQnVja2V0TG9jYXRpb24ge1xuICAvKipcbiAgICogVGhlIHMzIGxvY2F0aW9uIHRoYXQgc3RvcmVzIHRoZSBkYXRhIG9mIGVhY2ggcnVuLlxuICAgKi9cbiAgcmVhZG9ubHkgYnVja2V0OiBzMy5JQnVja2V0O1xuXG4gIC8qKlxuICAgKiBUaGUgUzMgYnVja2V0IHByZWZpeC4gU3BlY2lmeSB0aGlzIGlmIHlvdSB3YW50IGEgbW9yZSBzcGVjaWZpYyBwYXRoIHdpdGhpbiB0aGUgYXJ0aWZhY3RzIGJ1Y2tldC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBwcmVmaXhcbiAgICovXG4gIHJlYWRvbmx5IHByZWZpeD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBhIGNhbmFyeVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENhbmFyeVByb3BzIHtcbiAgLyoqXG4gICAqIFRoZSBzMyBsb2NhdGlvbiB0aGF0IHN0b3JlcyB0aGUgZGF0YSBvZiB0aGUgY2FuYXJ5IHJ1bnMuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gQSBuZXcgczMgYnVja2V0IHdpbGwgYmUgY3JlYXRlZCB3aXRob3V0IGEgcHJlZml4LlxuICAgKi9cbiAgcmVhZG9ubHkgYXJ0aWZhY3RzQnVja2V0TG9jYXRpb24/OiBBcnRpZmFjdHNCdWNrZXRMb2NhdGlvbjtcblxuICAvKipcbiAgICogQ2FuYXJ5IGV4ZWN1dGlvbiByb2xlLlxuICAgKlxuICAgKiBUaGlzIGlzIHRoZSByb2xlIHRoYXQgd2lsbCBiZSBhc3N1bWVkIGJ5IHRoZSBjYW5hcnkgdXBvbiBleGVjdXRpb24uXG4gICAqIEl0IGNvbnRyb2xzIHRoZSBwZXJtaXNzaW9ucyB0aGF0IHRoZSBjYW5hcnkgd2lsbCBoYXZlLiBUaGUgcm9sZSBtdXN0XG4gICAqIGJlIGFzc3VtYWJsZSBieSB0aGUgQVdTIExhbWJkYSBzZXJ2aWNlIHByaW5jaXBhbC5cbiAgICpcbiAgICogSWYgbm90IHN1cHBsaWVkLCBhIHJvbGUgd2lsbCBiZSBjcmVhdGVkIHdpdGggYWxsIHRoZSByZXF1aXJlZCBwZXJtaXNzaW9ucy5cbiAgICogSWYgeW91IHByb3ZpZGUgYSBSb2xlLCB5b3UgbXVzdCBhZGQgdGhlIHJlcXVpcmVkIHBlcm1pc3Npb25zLlxuICAgKlxuICAgKiBAc2VlIHJlcXVpcmVkIHBlcm1pc3Npb25zOiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTQ2xvdWRGb3JtYXRpb24vbGF0ZXN0L1VzZXJHdWlkZS9hd3MtcmVzb3VyY2Utc3ludGhldGljcy1jYW5hcnkuaHRtbCNjZm4tc3ludGhldGljcy1jYW5hcnktZXhlY3V0aW9ucm9sZWFyblxuICAgKlxuICAgKiBAZGVmYXVsdCAtIEEgdW5pcXVlIHJvbGUgd2lsbCBiZSBnZW5lcmF0ZWQgZm9yIHRoaXMgY2FuYXJ5LlxuICAgKiBZb3UgY2FuIGFkZCBwZXJtaXNzaW9ucyB0byByb2xlcyBieSBjYWxsaW5nICdhZGRUb1JvbGVQb2xpY3knLlxuICAgKi9cbiAgcmVhZG9ubHkgcm9sZT86IGlhbS5JUm9sZTtcblxuICAvKipcbiAgICogSG93IGxvbmcgdGhlIGNhbmFyeSB3aWxsIGJlIGluIGEgJ1JVTk5JTkcnIHN0YXRlLiBGb3IgZXhhbXBsZSwgaWYgeW91IHNldCBgdGltZVRvTGl2ZWAgdG8gYmUgMSBob3VyIGFuZCBgc2NoZWR1bGVgIHRvIGJlIGByYXRlKDEwIG1pbnV0ZXMpYCxcbiAgICogeW91ciBjYW5hcnkgd2lsbCBydW4gYXQgMTAgbWludXRlIGludGVydmFscyBmb3IgYW4gaG91ciwgZm9yIGEgdG90YWwgb2YgNiB0aW1lcy5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBsaW1pdFxuICAgKi9cbiAgcmVhZG9ubHkgdGltZVRvTGl2ZT86IGNkay5EdXJhdGlvbjtcblxuICAvKipcbiAgICogU3BlY2lmeSB0aGUgc2NoZWR1bGUgZm9yIGhvdyBvZnRlbiB0aGUgY2FuYXJ5IHJ1bnMuIEZvciBleGFtcGxlLCBpZiB5b3Ugc2V0IGBzY2hlZHVsZWAgdG8gYHJhdGUoMTAgbWludXRlcylgLCB0aGVuIHRoZSBjYW5hcnkgd2lsbCBydW4gZXZlcnkgMTAgbWludXRlcy5cbiAgICogWW91IGNhbiBzZXQgdGhlIHNjaGVkdWxlIHdpdGggYFNjaGVkdWxlLnJhdGUoRHVyYXRpb24pYCAocmVjb21tZW5kZWQpIG9yIHlvdSBjYW4gc3BlY2lmeSBhbiBleHByZXNzaW9uIHVzaW5nIGBTY2hlZHVsZS5leHByZXNzaW9uKClgLlxuICAgKiBAZGVmYXVsdCAncmF0ZSg1IG1pbnV0ZXMpJ1xuICAgKi9cbiAgcmVhZG9ubHkgc2NoZWR1bGU/OiBTY2hlZHVsZTtcblxuICAvKipcbiAgICogV2hldGhlciBvciBub3QgdGhlIGNhbmFyeSBzaG91bGQgc3RhcnQgYWZ0ZXIgY3JlYXRpb24uXG4gICAqXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHJlYWRvbmx5IHN0YXJ0QWZ0ZXJDcmVhdGlvbj86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEhvdyBtYW55IGRheXMgc2hvdWxkIHN1Y2Nlc3NmdWwgcnVucyBiZSByZXRhaW5lZC5cbiAgICpcbiAgICogQGRlZmF1bHQgRHVyYXRpb24uZGF5cygzMSlcbiAgICovXG4gIHJlYWRvbmx5IHN1Y2Nlc3NSZXRlbnRpb25QZXJpb2Q/OiBjZGsuRHVyYXRpb247XG5cbiAgLyoqXG4gICAqIEhvdyBtYW55IGRheXMgc2hvdWxkIGZhaWxlZCBydW5zIGJlIHJldGFpbmVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCBEdXJhdGlvbi5kYXlzKDMxKVxuICAgKi9cbiAgcmVhZG9ubHkgZmFpbHVyZVJldGVudGlvblBlcmlvZD86IGNkay5EdXJhdGlvbjtcblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIGNhbmFyeS4gQmUgc3VyZSB0byBnaXZlIGl0IGEgZGVzY3JpcHRpdmUgbmFtZSB0aGF0IGRpc3Rpbmd1aXNoZXMgaXQgZnJvbVxuICAgKiBvdGhlciBjYW5hcmllcyBpbiB5b3VyIGFjY291bnQuXG4gICAqXG4gICAqIERvIG5vdCBpbmNsdWRlIHNlY3JldHMgb3IgcHJvcHJpZXRhcnkgaW5mb3JtYXRpb24gaW4geW91ciBjYW5hcnkgbmFtZS4gVGhlIGNhbmFyeSBuYW1lXG4gICAqIG1ha2VzIHVwIHBhcnQgb2YgdGhlIGNhbmFyeSBBUk4sIHdoaWNoIGlzIGluY2x1ZGVkIGluIG91dGJvdW5kIGNhbGxzIG92ZXIgdGhlIGludGVybmV0LlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZFdhdGNoL2xhdGVzdC9tb25pdG9yaW5nL3NlcnZpY2VsZW5zX2NhbmFyaWVzX3NlY3VyaXR5Lmh0bWxcbiAgICpcbiAgICogQGRlZmF1bHQgLSBBIHVuaXF1ZSBuYW1lIHdpbGwgYmUgZ2VuZXJhdGVkIGZyb20gdGhlIGNvbnN0cnVjdCBJRFxuICAgKi9cbiAgcmVhZG9ubHkgY2FuYXJ5TmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogU3BlY2lmeSB0aGUgcnVudGltZSB2ZXJzaW9uIHRvIHVzZSBmb3IgdGhlIGNhbmFyeS5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRXYXRjaC9sYXRlc3QvbW9uaXRvcmluZy9DbG91ZFdhdGNoX1N5bnRoZXRpY3NfQ2FuYXJpZXNfTGlicmFyeS5odG1sXG4gICAqL1xuICByZWFkb25seSBydW50aW1lOiBSdW50aW1lO1xuXG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiB0ZXN0IHRoYXQgeW91IHdhbnQgeW91ciBjYW5hcnkgdG8gcnVuLiBVc2UgYFRlc3QuY3VzdG9tKClgIHRvIHNwZWNpZnkgdGhlIHRlc3QgdG8gcnVuLlxuICAgKi9cbiAgcmVhZG9ubHkgdGVzdDogVGVzdDtcblxuICAvKipcbiAgICogS2V5LXZhbHVlIHBhaXJzIHRoYXQgdGhlIFN5bnRoZXRpY3MgY2FjaGVzIGFuZCBtYWtlcyBhdmFpbGFibGUgZm9yIHlvdXIgY2FuYXJ5IHNjcmlwdHMuIFVzZSBlbnZpcm9ubWVudCB2YXJpYWJsZXNcbiAgICogdG8gYXBwbHkgY29uZmlndXJhdGlvbiBjaGFuZ2VzLCBzdWNoIGFzIHRlc3QgYW5kIHByb2R1Y3Rpb24gZW52aXJvbm1lbnQgY29uZmlndXJhdGlvbnMsIHdpdGhvdXQgY2hhbmdpbmcgeW91clxuICAgKiBDYW5hcnkgc2NyaXB0IHNvdXJjZSBjb2RlLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIGVudmlyb25tZW50IHZhcmlhYmxlcy5cbiAgICovXG4gIHJlYWRvbmx5IGVudmlyb25tZW50VmFyaWFibGVzPzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfTtcblxuICAvKipcbiAgICogVGhlIFZQQyB3aGVyZSB0aGlzIGNhbmFyeSBpcyBydW4uXG4gICAqXG4gICAqIFNwZWNpZnkgdGhpcyBpZiB0aGUgY2FuYXJ5IG5lZWRzIHRvIGFjY2VzcyByZXNvdXJjZXMgaW4gYSBWUEMuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm90IGluIFZQQ1xuICAgKi9cbiAgcmVhZG9ubHkgdnBjPzogZWMyLklWcGM7XG5cbiAgLyoqXG4gICAqIFdoZXJlIHRvIHBsYWNlIHRoZSBuZXR3b3JrIGludGVyZmFjZXMgd2l0aGluIHRoZSBWUEMuIFlvdSBtdXN0IHByb3ZpZGUgYHZwY2Agd2hlbiB1c2luZyB0aGlzIHByb3AuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdGhlIFZwYyBkZWZhdWx0IHN0cmF0ZWd5IGlmIG5vdCBzcGVjaWZpZWRcbiAgICovXG4gIHJlYWRvbmx5IHZwY1N1Ym5ldHM/OiBlYzIuU3VibmV0U2VsZWN0aW9uO1xuXG4gIC8qKlxuICAgKiBUaGUgbGlzdCBvZiBzZWN1cml0eSBncm91cHMgdG8gYXNzb2NpYXRlIHdpdGggdGhlIGNhbmFyeSdzIG5ldHdvcmsgaW50ZXJmYWNlcy4gWW91IG11c3QgcHJvdmlkZSBgdnBjYCB3aGVuIHVzaW5nIHRoaXMgcHJvcC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBJZiB0aGUgY2FuYXJ5IGlzIHBsYWNlZCB3aXRoaW4gYSBWUEMgYW5kIGEgc2VjdXJpdHkgZ3JvdXAgaXNcbiAgICogbm90IHNwZWNpZmllZCBhIGRlZGljYXRlZCBzZWN1cml0eSBncm91cCB3aWxsIGJlIGNyZWF0ZWQgZm9yIHRoaXMgY2FuYXJ5LlxuICAgKi9cbiAgcmVhZG9ubHkgc2VjdXJpdHlHcm91cHM/OiBlYzIuSVNlY3VyaXR5R3JvdXBbXTtcblxuICAvKipcbiAgICogV2hldGhlciBvciBub3QgdG8gZGVsZXRlIHRoZSBsYW1iZGEgcmVzb3VyY2VzIHdoZW4gdGhlIGNhbmFyeSBpcyBkZWxldGVkXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0Nsb3VkRm9ybWF0aW9uL2xhdGVzdC9Vc2VyR3VpZGUvYXdzLXJlc291cmNlLXN5bnRoZXRpY3MtY2FuYXJ5Lmh0bWwjY2ZuLXN5bnRoZXRpY3MtY2FuYXJ5LWRlbGV0ZWxhbWJkYXJlc291cmNlc29uY2FuYXJ5ZGVsZXRpb25cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICogQGRlcHJlY2F0ZWQgdGhpcyBmZWF0dXJlIGhhcyBiZWVuIGRlcHJlY2F0ZWQgYnkgdGhlIHNlcnZpY2UgdGVhbSwgdXNlIGBjbGVhbnVwOiBDbGVhbnVwLkxBTUJEQWAgaW5zdGVhZCB3aGljaCB3aWxsIHVzZSBhIEN1c3RvbSBSZXNvdXJjZSB0byBhY2hpZXZlIHRoZSBzYW1lIGVmZmVjdC5cbiAgICovXG4gIHJlYWRvbmx5IGVuYWJsZUF1dG9EZWxldGVMYW1iZGFzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogU3BlY2lmeSB0aGUgdW5kZXJseWluZyByZXNvdXJjZXMgdG8gYmUgY2xlYW5lZCB1cCB3aGVuIHRoZSBjYW5hcnkgaXMgZGVsZXRlZC5cbiAgICogVXNpbmcgYENsZWFudXAuTEFNQkRBYCB3aWxsIGNyZWF0ZSBhIEN1c3RvbSBSZXNvdXJjZSB0byBhY2hpZXZlIHRoaXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IENsZWFudXAuTk9USElOR1xuICAgKi9cbiAgcmVhZG9ubHkgY2xlYW51cD86IENsZWFudXA7XG5cbiAgLyoqXG4gICAqIExpZmVjeWNsZSBydWxlcyBmb3IgdGhlIGdlbmVyYXRlZCBjYW5hcnkgYXJ0aWZhY3QgYnVja2V0LiBIYXMgbm8gZWZmZWN0XG4gICAqIGlmIGEgYnVja2V0IGlzIHBhc3NlZCB0byBgYXJ0aWZhY3RzQnVja2V0TG9jYXRpb25gLiBJZiB5b3UgcGFzcyBhIGJ1Y2tldFxuICAgKiB0byBgYXJ0aWZhY3RzQnVja2V0TG9jYXRpb25gLCB5b3UgY2FuIGFkZCBsaWZlY3ljbGUgcnVsZXMgdG8gdGhlIGJ1Y2tldFxuICAgKiBpdHNlbGYuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gcnVsZXMgYXBwbGllZCB0byB0aGUgZ2VuZXJhdGVkIGJ1Y2tldC5cbiAgICovXG4gIHJlYWRvbmx5IGFydGlmYWN0c0J1Y2tldExpZmVjeWNsZVJ1bGVzPzogQXJyYXk8czMuTGlmZWN5Y2xlUnVsZT47XG59XG5cbi8qKlxuICogRGVmaW5lIGEgbmV3IENhbmFyeVxuICovXG5leHBvcnQgY2xhc3MgQ2FuYXJ5IGV4dGVuZHMgY2RrLlJlc291cmNlIGltcGxlbWVudHMgZWMyLklDb25uZWN0YWJsZSB7XG4gIC8qKlxuICAgKiBFeGVjdXRpb24gcm9sZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBDYW5hcnkuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcm9sZTogaWFtLklSb2xlO1xuXG4gIC8qKlxuICAgKiBUaGUgY2FuYXJ5IElEXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBjYW5hcnlJZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgc3RhdGUgb2YgdGhlIGNhbmFyeS4gRm9yIGV4YW1wbGUsICdSVU5OSU5HJywgJ1NUT1BQRUQnLCAnTk9UIFNUQVJURUQnLCBvciAnRVJST1InLlxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgY2FuYXJ5U3RhdGU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGNhbmFyeSBOYW1lXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBjYW5hcnlOYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEJ1Y2tldCB3aGVyZSBkYXRhIGZyb20gZWFjaCBjYW5hcnkgcnVuIGlzIHN0b3JlZC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBhcnRpZmFjdHNCdWNrZXQ6IHMzLklCdWNrZXQ7XG5cbiAgLyoqXG4gICAqIEFjdHVhbCBjb25uZWN0aW9ucyBvYmplY3QgZm9yIHRoZSB1bmRlcmx5aW5nIExhbWJkYVxuICAgKlxuICAgKiBNYXkgYmUgdW5zZXQsIGluIHdoaWNoIGNhc2UgdGhlIGNhbmFyeSBMYW1iZGEgaXMgbm90IGNvbmZpZ3VyZWQgZm9yIHVzZSBpbiBhIFZQQy5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9jb25uZWN0aW9ucz86IGVjMi5Db25uZWN0aW9ucztcbiAgcHJpdmF0ZSByZWFkb25seSBfcmVzb3VyY2U6IENmbkNhbmFyeTtcblxuICBwdWJsaWMgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IENhbmFyeVByb3BzKSB7XG4gICAgaWYgKHByb3BzLmNhbmFyeU5hbWUgJiYgIWNkay5Ub2tlbi5pc1VucmVzb2x2ZWQocHJvcHMuY2FuYXJ5TmFtZSkpIHtcbiAgICAgIHZhbGlkYXRlTmFtZShwcm9wcy5jYW5hcnlOYW1lKTtcbiAgICB9XG5cbiAgICBzdXBlcihzY29wZSwgaWQsIHtcbiAgICAgIHBoeXNpY2FsTmFtZTogcHJvcHMuY2FuYXJ5TmFtZSB8fCBjZGsuTGF6eS5zdHJpbmcoe1xuICAgICAgICBwcm9kdWNlOiAoKSA9PiB0aGlzLmdlbmVyYXRlVW5pcXVlTmFtZSgpLFxuICAgICAgfSksXG4gICAgfSk7XG5cbiAgICB0aGlzLmFydGlmYWN0c0J1Y2tldCA9IHByb3BzLmFydGlmYWN0c0J1Y2tldExvY2F0aW9uPy5idWNrZXQgPz8gbmV3IHMzLkJ1Y2tldCh0aGlzLCAnQXJ0aWZhY3RzQnVja2V0Jywge1xuICAgICAgZW5jcnlwdGlvbjogczMuQnVja2V0RW5jcnlwdGlvbi5LTVNfTUFOQUdFRCxcbiAgICAgIGVuZm9yY2VTU0w6IHRydWUsXG4gICAgICBsaWZlY3ljbGVSdWxlczogcHJvcHMuYXJ0aWZhY3RzQnVja2V0TGlmZWN5Y2xlUnVsZXMsXG4gICAgfSk7XG5cbiAgICB0aGlzLnJvbGUgPSBwcm9wcy5yb2xlID8/IHRoaXMuY3JlYXRlRGVmYXVsdFJvbGUocHJvcHMpO1xuXG4gICAgaWYgKHByb3BzLnZwYykge1xuICAgICAgLy8gU2VjdXJpdHkgR3JvdXBzIGFyZSBjcmVhdGVkIGFuZC9vciBhcHBlbmRlZCBpbiBgY3JlYXRlVnBjQ29uZmlnYC5cbiAgICAgIHRoaXMuX2Nvbm5lY3Rpb25zID0gbmV3IGVjMi5Db25uZWN0aW9ucyh7fSk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzb3VyY2U6IENmbkNhbmFyeSA9IG5ldyBDZm5DYW5hcnkodGhpcywgJ1Jlc291cmNlJywge1xuICAgICAgYXJ0aWZhY3RTM0xvY2F0aW9uOiB0aGlzLmFydGlmYWN0c0J1Y2tldC5zM1VybEZvck9iamVjdChwcm9wcy5hcnRpZmFjdHNCdWNrZXRMb2NhdGlvbj8ucHJlZml4KSxcbiAgICAgIGV4ZWN1dGlvblJvbGVBcm46IHRoaXMucm9sZS5yb2xlQXJuLFxuICAgICAgc3RhcnRDYW5hcnlBZnRlckNyZWF0aW9uOiBwcm9wcy5zdGFydEFmdGVyQ3JlYXRpb24gPz8gdHJ1ZSxcbiAgICAgIHJ1bnRpbWVWZXJzaW9uOiBwcm9wcy5ydW50aW1lLm5hbWUsXG4gICAgICBuYW1lOiB0aGlzLnBoeXNpY2FsTmFtZSxcbiAgICAgIHNjaGVkdWxlOiB0aGlzLmNyZWF0ZVNjaGVkdWxlKHByb3BzKSxcbiAgICAgIGZhaWx1cmVSZXRlbnRpb25QZXJpb2Q6IHByb3BzLmZhaWx1cmVSZXRlbnRpb25QZXJpb2Q/LnRvRGF5cygpLFxuICAgICAgc3VjY2Vzc1JldGVudGlvblBlcmlvZDogcHJvcHMuc3VjY2Vzc1JldGVudGlvblBlcmlvZD8udG9EYXlzKCksXG4gICAgICBjb2RlOiB0aGlzLmNyZWF0ZUNvZGUocHJvcHMpLFxuICAgICAgcnVuQ29uZmlnOiB0aGlzLmNyZWF0ZVJ1bkNvbmZpZyhwcm9wcyksXG4gICAgICB2cGNDb25maWc6IHRoaXMuY3JlYXRlVnBjQ29uZmlnKHByb3BzKSxcbiAgICB9KTtcbiAgICB0aGlzLl9yZXNvdXJjZSA9IHJlc291cmNlO1xuXG4gICAgdGhpcy5jYW5hcnlJZCA9IHJlc291cmNlLmF0dHJJZDtcbiAgICB0aGlzLmNhbmFyeVN0YXRlID0gcmVzb3VyY2UuYXR0clN0YXRlO1xuICAgIHRoaXMuY2FuYXJ5TmFtZSA9IHRoaXMuZ2V0UmVzb3VyY2VOYW1lQXR0cmlidXRlKHJlc291cmNlLnJlZik7XG5cbiAgICBpZiAocHJvcHMuY2xlYW51cCA9PT0gQ2xlYW51cC5MQU1CREEgPz8gcHJvcHMuZW5hYmxlQXV0b0RlbGV0ZUxhbWJkYXMpIHtcbiAgICAgIHRoaXMuY2xlYW51cFVuZGVybHlpbmdSZXNvdXJjZXMoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNsZWFudXBVbmRlcmx5aW5nUmVzb3VyY2VzKCkge1xuICAgIGNvbnN0IHByb3ZpZGVyID0gQ3VzdG9tUmVzb3VyY2VQcm92aWRlci5nZXRPckNyZWF0ZVByb3ZpZGVyKHRoaXMsIEFVVE9fREVMRVRFX1VOREVSTFlJTkdfUkVTT1VSQ0VTX1JFU09VUkNFX1RZUEUsIHtcbiAgICAgIGNvZGVEaXJlY3Rvcnk6IHBhdGguam9pbihfX2Rpcm5hbWUsICcuLicsICdjdXN0b20tcmVzb3VyY2UtaGFuZGxlcnMnLCAnZGlzdCcsICdhd3Mtc3ludGhldGljcy1hbHBoYScsICdhdXRvLWRlbGV0ZS11bmRlcmx5aW5nLXJlc291cmNlcy1oYW5kbGVyJyksXG4gICAgICB1c2VDZm5SZXNwb25zZVdyYXBwZXI6IGZhbHNlLFxuICAgICAgcnVudGltZTogQ3VzdG9tUmVzb3VyY2VQcm92aWRlclJ1bnRpbWUuTk9ERUpTXzE4X1gsXG4gICAgICBkZXNjcmlwdGlvbjogYExhbWJkYSBmdW5jdGlvbiBmb3IgYXV0by1kZWxldGluZyB1bmRlcmx5aW5nIHJlc291cmNlcyBjcmVhdGVkIGJ5ICR7dGhpcy5jYW5hcnlOYW1lfS5gLFxuICAgICAgcG9saWN5U3RhdGVtZW50czogW3tcbiAgICAgICAgRWZmZWN0OiAnQWxsb3cnLFxuICAgICAgICBBY3Rpb246IFsnbGFtYmRhOkRlbGV0ZUZ1bmN0aW9uJ10sXG4gICAgICAgIFJlc291cmNlOiB0aGlzLmxhbWJkYUFybigpLFxuICAgICAgfSwge1xuICAgICAgICBFZmZlY3Q6ICdBbGxvdycsXG4gICAgICAgIEFjdGlvbjogWydzeW50aGV0aWNzOkdldENhbmFyeSddLFxuICAgICAgICBSZXNvdXJjZTogJyonLFxuICAgICAgfV0sXG4gICAgfSk7XG5cbiAgICBuZXcgQ3VzdG9tUmVzb3VyY2UodGhpcywgJ0F1dG9EZWxldGVVbmRlcmx5aW5nUmVzb3VyY2VzQ3VzdG9tUmVzb3VyY2UnLCB7XG4gICAgICByZXNvdXJjZVR5cGU6IEFVVE9fREVMRVRFX1VOREVSTFlJTkdfUkVTT1VSQ0VTX1JFU09VUkNFX1RZUEUsXG4gICAgICBzZXJ2aWNlVG9rZW46IHByb3ZpZGVyLnNlcnZpY2VUb2tlbixcbiAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgQ2FuYXJ5TmFtZTogdGhpcy5jYW5hcnlOYW1lLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIC8vIFdlIGFsc28gdGFnIHRoZSBjYW5hcnkgdG8gcmVjb3JkIHRoZSBmYWN0IHRoYXQgd2Ugd2FudCBpdCBhdXRvZGVsZXRlZC5cbiAgICAvLyBUaGUgY3VzdG9tIHJlc291cmNlIHdpbGwgY2hlY2sgdGhpcyB0YWcgYmVmb3JlIGFjdHVhbGx5IGRvaW5nIHRoZSBkZWxldGUuXG4gICAgLy8gQmVjYXVzZSB0YWdnaW5nIGFuZCB1bnRhZ2dpbmcgd2lsbCBBTFdBWVMgaGFwcGVuIGJlZm9yZSB0aGUgQ1IgaXMgZGVsZXRlZCxcbiAgICAvLyB3ZSBjYW4gc2V0IGBhdXRvRGVsZXRlTGFtYmRhOiBmYWxzZWAgd2l0aG91dCB0aGUgcmVtb3ZhbCBvZiB0aGUgQ1IgZW1wdHlpbmdcbiAgICAvLyB0aGUgbGFtYmRhIGFzIGEgc2lkZSBlZmZlY3QuXG4gICAgY2RrLlRhZ3Mub2YodGhpcy5fcmVzb3VyY2UpLmFkZChBVVRPX0RFTEVURV9VTkRFUkxZSU5HX1JFU09VUkNFU19UQUcsICd0cnVlJyk7XG4gIH1cblxuICAvKipcbiAgICogQWNjZXNzIHRoZSBDb25uZWN0aW9ucyBvYmplY3RcbiAgICpcbiAgICogV2lsbCBmYWlsIGlmIG5vdCBhIFZQQy1lbmFibGVkIENhbmFyeVxuICAgKi9cbiAgcHVibGljIGdldCBjb25uZWN0aW9ucygpOiBlYzIuQ29ubmVjdGlvbnMge1xuICAgIGlmICghdGhpcy5fY29ubmVjdGlvbnMpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBtYXgtbGVuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ09ubHkgVlBDLWFzc29jaWF0ZWQgQ2FuYXJpZXMgaGF2ZSBzZWN1cml0eSBncm91cHMgdG8gbWFuYWdlLiBTdXBwbHkgdGhlIFwidnBjXCIgcGFyYW1ldGVyIHdoZW4gY3JlYXRpbmcgdGhlIENhbmFyeS4nKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2Nvbm5lY3Rpb25zO1xuICB9XG5cbiAgLyoqXG4gICAqIE1lYXN1cmUgdGhlIER1cmF0aW9uIG9mIGEgc2luZ2xlIGNhbmFyeSBydW4sIGluIHNlY29uZHMuXG4gICAqXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gY29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB0aGUgbWV0cmljXG4gICAqXG4gICAqIEBkZWZhdWx0IGF2ZyBvdmVyIDUgbWludXRlc1xuICAgKi9cbiAgcHVibGljIG1ldHJpY0R1cmF0aW9uKG9wdGlvbnM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljIHtcbiAgICByZXR1cm4gbmV3IE1ldHJpYyh7XG4gICAgICAuLi5DbG91ZFdhdGNoU3ludGhldGljc01ldHJpY3MuZHVyYXRpb25NYXhpbXVtKHsgQ2FuYXJ5TmFtZTogdGhpcy5jYW5hcnlOYW1lIH0pLFxuICAgICAgLi4ueyBzdGF0aXN0aWM6ICdBdmVyYWdlJyB9LFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICB9KS5hdHRhY2hUbyh0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZWFzdXJlIHRoZSBwZXJjZW50YWdlIG9mIHN1Y2Nlc3NmdWwgY2FuYXJ5IHJ1bnMuXG4gICAqXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gY29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB0aGUgbWV0cmljXG4gICAqXG4gICAqIEBkZWZhdWx0IGF2ZyBvdmVyIDUgbWludXRlc1xuICAgKi9cbiAgcHVibGljIG1ldHJpY1N1Y2Nlc3NQZXJjZW50KG9wdGlvbnM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljIHtcbiAgICByZXR1cm4gdGhpcy5jYW5uZWRNZXRyaWMoQ2xvdWRXYXRjaFN5bnRoZXRpY3NNZXRyaWNzLnN1Y2Nlc3NQZXJjZW50QXZlcmFnZSwgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogTWVhc3VyZSB0aGUgbnVtYmVyIG9mIGZhaWxlZCBjYW5hcnkgcnVucyBvdmVyIGEgZ2l2ZW4gdGltZSBwZXJpb2QuXG4gICAqXG4gICAqIERlZmF1bHQ6IHN1bSBvdmVyIDUgbWludXRlc1xuICAgKlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhlIG1ldHJpY1xuICAgKi9cbiAgcHVibGljIG1ldHJpY0ZhaWxlZChvcHRpb25zPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYyB7XG4gICAgcmV0dXJuIHRoaXMuY2FubmVkTWV0cmljKENsb3VkV2F0Y2hTeW50aGV0aWNzTWV0cmljcy5mYWlsZWRTdW0sIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBkZWZhdWx0IHJvbGUgZm9yIHRoZSBjYW5hcnlcbiAgICovXG4gIHByaXZhdGUgY3JlYXRlRGVmYXVsdFJvbGUocHJvcHM6IENhbmFyeVByb3BzKTogaWFtLklSb2xlIHtcbiAgICBjb25zdCBwcmVmaXggPSBwcm9wcy5hcnRpZmFjdHNCdWNrZXRMb2NhdGlvbj8ucHJlZml4O1xuXG4gICAgLy8gQ3JlYXRlZCByb2xlIHdpbGwgbmVlZCB0aGVzZSBwb2xpY2llcyB0byBydW4gdGhlIENhbmFyeS5cbiAgICAvLyBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTQ2xvdWRGb3JtYXRpb24vbGF0ZXN0L1VzZXJHdWlkZS9hd3MtcmVzb3VyY2Utc3ludGhldGljcy1jYW5hcnkuaHRtbCNjZm4tc3ludGhldGljcy1jYW5hcnktZXhlY3V0aW9ucm9sZWFyblxuICAgIGNvbnN0IHBvbGljeSA9IG5ldyBpYW0uUG9saWN5RG9jdW1lbnQoe1xuICAgICAgc3RhdGVtZW50czogW1xuICAgICAgICBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgICAgcmVzb3VyY2VzOiBbJyonXSxcbiAgICAgICAgICBhY3Rpb25zOiBbJ3MzOkxpc3RBbGxNeUJ1Y2tldHMnXSxcbiAgICAgICAgfSksXG4gICAgICAgIG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgICByZXNvdXJjZXM6IFt0aGlzLmFydGlmYWN0c0J1Y2tldC5idWNrZXRBcm5dLFxuICAgICAgICAgIGFjdGlvbnM6IFsnczM6R2V0QnVja2V0TG9jYXRpb24nXSxcbiAgICAgICAgfSksXG4gICAgICAgIG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgICByZXNvdXJjZXM6IFt0aGlzLmFydGlmYWN0c0J1Y2tldC5hcm5Gb3JPYmplY3RzKGAke3ByZWZpeCA/IHByZWZpeCsnLyonIDogJyonfWApXSxcbiAgICAgICAgICBhY3Rpb25zOiBbJ3MzOlB1dE9iamVjdCddLFxuICAgICAgICB9KSxcbiAgICAgICAgbmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICAgIHJlc291cmNlczogWycqJ10sXG4gICAgICAgICAgYWN0aW9uczogWydjbG91ZHdhdGNoOlB1dE1ldHJpY0RhdGEnXSxcbiAgICAgICAgICBjb25kaXRpb25zOiB7IFN0cmluZ0VxdWFsczogeyAnY2xvdWR3YXRjaDpuYW1lc3BhY2UnOiAnQ2xvdWRXYXRjaFN5bnRoZXRpY3MnIH0gfSxcbiAgICAgICAgfSksXG4gICAgICAgIG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgICByZXNvdXJjZXM6IFt0aGlzLmxvZ0dyb3VwQXJuKCldLFxuICAgICAgICAgIGFjdGlvbnM6IFsnbG9nczpDcmVhdGVMb2dTdHJlYW0nLCAnbG9nczpDcmVhdGVMb2dHcm91cCcsICdsb2dzOlB1dExvZ0V2ZW50cyddLFxuICAgICAgICB9KSxcbiAgICAgIF0sXG4gICAgfSk7XG5cbiAgICBjb25zdCBtYW5hZ2VkUG9saWNpZXM6IGlhbS5JTWFuYWdlZFBvbGljeVtdID0gW107XG5cbiAgICBpZiAocHJvcHMudnBjKSB7XG4gICAgICAvLyBQb2xpY3kgdGhhdCB3aWxsIGhhdmUgRU5JIGNyZWF0aW9uIHBlcm1pc3Npb25zXG4gICAgICBtYW5hZ2VkUG9saWNpZXMucHVzaChpYW0uTWFuYWdlZFBvbGljeS5mcm9tQXdzTWFuYWdlZFBvbGljeU5hbWUoJ3NlcnZpY2Utcm9sZS9BV1NMYW1iZGFWUENBY2Nlc3NFeGVjdXRpb25Sb2xlJykpO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgaWFtLlJvbGUodGhpcywgJ1NlcnZpY2VSb2xlJywge1xuICAgICAgYXNzdW1lZEJ5OiBuZXcgaWFtLlNlcnZpY2VQcmluY2lwYWwoJ2xhbWJkYS5hbWF6b25hd3MuY29tJyksXG4gICAgICBpbmxpbmVQb2xpY2llczoge1xuICAgICAgICBjYW5hcnlQb2xpY3k6IHBvbGljeSxcbiAgICAgIH0sXG4gICAgICBtYW5hZ2VkUG9saWNpZXMsXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGxvZ0dyb3VwQXJuKCkge1xuICAgIHJldHVybiBjZGsuU3RhY2sub2YodGhpcykuZm9ybWF0QXJuKHtcbiAgICAgIHNlcnZpY2U6ICdsb2dzJyxcbiAgICAgIHJlc291cmNlOiAnbG9nLWdyb3VwJyxcbiAgICAgIGFybkZvcm1hdDogY2RrLkFybkZvcm1hdC5DT0xPTl9SRVNPVVJDRV9OQU1FLFxuICAgICAgcmVzb3VyY2VOYW1lOiAnL2F3cy9sYW1iZGEvY3dzeW4tKicsXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGxhbWJkYUFybigpIHtcbiAgICByZXR1cm4gY2RrLlN0YWNrLm9mKHRoaXMpLmZvcm1hdEFybih7XG4gICAgICBzZXJ2aWNlOiAnbGFtYmRhJyxcbiAgICAgIHJlc291cmNlOiAnZnVuY3Rpb24nLFxuICAgICAgYXJuRm9ybWF0OiBjZGsuQXJuRm9ybWF0LkNPTE9OX1JFU09VUkNFX05BTUUsXG4gICAgICByZXNvdXJjZU5hbWU6ICdjd3N5bi0qJyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjb2RlIG9iamVjdCB0YWtlbiBpbiBieSB0aGUgY2FuYXJ5IHJlc291cmNlLlxuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVDb2RlKHByb3BzOiBDYW5hcnlQcm9wcyk6IENmbkNhbmFyeS5Db2RlUHJvcGVydHkge1xuICAgIHRoaXMudmFsaWRhdGVIYW5kbGVyKHByb3BzLnRlc3QuaGFuZGxlciwgcHJvcHMucnVudGltZSk7XG4gICAgY29uc3QgY29kZUNvbmZpZyA9IHtcbiAgICAgIGhhbmRsZXI6IHByb3BzLnRlc3QuaGFuZGxlcixcbiAgICAgIC4uLnByb3BzLnRlc3QuY29kZS5iaW5kKHRoaXMsIHByb3BzLnRlc3QuaGFuZGxlciwgcHJvcHMucnVudGltZS5mYW1pbHkpLFxuICAgIH07XG4gICAgcmV0dXJuIHtcbiAgICAgIGhhbmRsZXI6IGNvZGVDb25maWcuaGFuZGxlcixcbiAgICAgIHNjcmlwdDogY29kZUNvbmZpZy5pbmxpbmVDb2RlLFxuICAgICAgczNCdWNrZXQ6IGNvZGVDb25maWcuczNMb2NhdGlvbj8uYnVja2V0TmFtZSxcbiAgICAgIHMzS2V5OiBjb2RlQ29uZmlnLnMzTG9jYXRpb24/Lm9iamVjdEtleSxcbiAgICAgIHMzT2JqZWN0VmVyc2lvbjogY29kZUNvbmZpZy5zM0xvY2F0aW9uPy5vYmplY3RWZXJzaW9uLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpZXMgdGhhdCB0aGUgaGFuZGxlciBuYW1lIG1hdGNoZXMgdGhlIGNvbnZlbnRpb25zIGdpdmVuIGEgY2VydGFpbiBydW50aW1lLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NDbG91ZEZvcm1hdGlvbi9sYXRlc3QvVXNlckd1aWRlL2F3cy1wcm9wZXJ0aWVzLXN5bnRoZXRpY3MtY2FuYXJ5LWNvZGUuaHRtbCNjZm4tc3ludGhldGljcy1jYW5hcnktY29kZS1oYW5kbGVyXG4gICAqIEBwYXJhbSBoYW5kbGVyIC0gdGhlIG5hbWUgb2YgdGhlIGhhbmRsZXJcbiAgICogQHBhcmFtIHJ1bnRpbWUgLSB0aGUgcnVudGltZSB2ZXJzaW9uXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlSGFuZGxlcihoYW5kbGVyOiBzdHJpbmcsIHJ1bnRpbWU6IFJ1bnRpbWUpIHtcbiAgICBjb25zdCBvbGRSdW50aW1lcyA9IFtcbiAgICAgIFJ1bnRpbWUuU1lOVEhFVElDU19QWVRIT05fU0VMRU5JVU1fMV8wLFxuICAgICAgUnVudGltZS5TWU5USEVUSUNTX05PREVKU19QVVBQRVRFRVJfM18wLFxuICAgICAgUnVudGltZS5TWU5USEVUSUNTX05PREVKU19QVVBQRVRFRVJfM18xLFxuICAgICAgUnVudGltZS5TWU5USEVUSUNTX05PREVKU19QVVBQRVRFRVJfM18yLFxuICAgICAgUnVudGltZS5TWU5USEVUSUNTX05PREVKU19QVVBQRVRFRVJfM18zLFxuICAgIF07XG4gICAgaWYgKG9sZFJ1bnRpbWVzLmluY2x1ZGVzKHJ1bnRpbWUpKSB7XG4gICAgICBpZiAoIWhhbmRsZXIubWF0Y2goL15bMC05QS1aYS16X1xcXFwtXStcXC5oYW5kbGVyKiQvKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbmFyeSBIYW5kbGVyIG11c3QgYmUgc3BlY2lmaWVkIGFzIFxcJ2ZpbGVOYW1lLmhhbmRsZXJcXCcgZm9yIGxlZ2FjeSBydW50aW1lcywgcmVjZWl2ZWQgJHtoYW5kbGVyfWApO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIWhhbmRsZXIubWF0Y2goL14oWzAtOWEtekEtWl8tXStcXC8pKlswLTlBLVphLXpfXFxcXC1dK1xcLltBLVphLXpfXVtBLVphLXowLTlfXSokLykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5hcnkgSGFuZGxlciBtdXN0IGJlIHNwZWNpZmllZCBlaXRoZXIgYXMgXFwnZmlsZU5hbWUuaGFuZGxlclxcJywgXFwnZmlsZU5hbWUuZnVuY3Rpb25OYW1lXFwnLCBvciBcXCdmb2xkZXIvZmlsZU5hbWUuZnVuY3Rpb25OYW1lXFwnLCByZWNlaXZlZCAke2hhbmRsZXJ9YCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChoYW5kbGVyLmxlbmd0aCA8IDEgfHwgaGFuZGxlci5sZW5ndGggPiAxMjgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ2FuYXJ5IEhhbmRsZXIgbGVuZ3RoIG11c3QgYmUgYmV0d2VlbiAxIGFuZCAxMjgsIHJlY2VpdmVkICR7aGFuZGxlci5sZW5ndGh9YCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVSdW5Db25maWcocHJvcHM6IENhbmFyeVByb3BzKTogQ2ZuQ2FuYXJ5LlJ1bkNvbmZpZ1Byb3BlcnR5IHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIXByb3BzLmVudmlyb25tZW50VmFyaWFibGVzKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgZW52aXJvbm1lbnRWYXJpYWJsZXM6IHByb3BzLmVudmlyb25tZW50VmFyaWFibGVzLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIGNhbmFyeSBzY2hlZHVsZSBvYmplY3RcbiAgICovXG4gIHByaXZhdGUgY3JlYXRlU2NoZWR1bGUocHJvcHM6IENhbmFyeVByb3BzKTogQ2ZuQ2FuYXJ5LlNjaGVkdWxlUHJvcGVydHkge1xuICAgIHJldHVybiB7XG4gICAgICBkdXJhdGlvbkluU2Vjb25kczogU3RyaW5nKGAke3Byb3BzLnRpbWVUb0xpdmU/LnRvU2Vjb25kcygpID8/IDB9YCksXG4gICAgICBleHByZXNzaW9uOiBwcm9wcy5zY2hlZHVsZT8uZXhwcmVzc2lvblN0cmluZyA/PyAncmF0ZSg1IG1pbnV0ZXMpJyxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVWcGNDb25maWcocHJvcHM6IENhbmFyeVByb3BzKTogQ2ZuQ2FuYXJ5LlZQQ0NvbmZpZ1Byb3BlcnR5IHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIXByb3BzLnZwYykge1xuICAgICAgaWYgKHByb3BzLnZwY1N1Ym5ldHMgIT0gbnVsbCB8fCBwcm9wcy5zZWN1cml0eUdyb3VwcyAhPSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIllvdSBtdXN0IHByb3ZpZGUgdGhlICd2cGMnIHByb3Agd2hlbiB1c2luZyBWUEMtcmVsYXRlZCBwcm9wZXJ0aWVzLlwiKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBjb25zdCB7IHN1Ym5ldElkcyB9ID0gcHJvcHMudnBjLnNlbGVjdFN1Ym5ldHMocHJvcHMudnBjU3VibmV0cyk7XG4gICAgaWYgKHN1Ym5ldElkcy5sZW5ndGggPCAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIG1hdGNoaW5nIHN1Ym5ldHMgZm91bmQgaW4gdGhlIFZQQy4nKTtcbiAgICB9XG5cbiAgICBsZXQgc2VjdXJpdHlHcm91cHM6IGVjMi5JU2VjdXJpdHlHcm91cFtdO1xuICAgIGlmIChwcm9wcy5zZWN1cml0eUdyb3VwcyAmJiBwcm9wcy5zZWN1cml0eUdyb3Vwcy5sZW5ndGggPiAwKSB7XG4gICAgICBzZWN1cml0eUdyb3VwcyA9IHByb3BzLnNlY3VyaXR5R3JvdXBzO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBzZWN1cml0eUdyb3VwID0gbmV3IGVjMi5TZWN1cml0eUdyb3VwKHRoaXMsICdTZWN1cml0eUdyb3VwJywge1xuICAgICAgICB2cGM6IHByb3BzLnZwYyxcbiAgICAgICAgZGVzY3JpcHRpb246ICdBdXRvbWF0aWMgc2VjdXJpdHkgZ3JvdXAgZm9yIENhbmFyeSAnICsgY2RrLk5hbWVzLnVuaXF1ZUlkKHRoaXMpLFxuICAgICAgfSk7XG4gICAgICBzZWN1cml0eUdyb3VwcyA9IFtzZWN1cml0eUdyb3VwXTtcbiAgICB9XG4gICAgdGhpcy5fY29ubmVjdGlvbnMhLmFkZFNlY3VyaXR5R3JvdXAoLi4uc2VjdXJpdHlHcm91cHMpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHZwY0lkOiBwcm9wcy52cGMudnBjSWQsXG4gICAgICBzdWJuZXRJZHMsXG4gICAgICBzZWN1cml0eUdyb3VwSWRzOiBjZGsuTGF6eS5saXN0KHsgcHJvZHVjZTogKCkgPT4gdGhpcy5jb25uZWN0aW9ucy5zZWN1cml0eUdyb3Vwcy5tYXAoc2cgPT4gc2cuc2VjdXJpdHlHcm91cElkKSB9KSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSB1bmlxdWUgbmFtZSBmb3IgdGhlIGNhbmFyeS4gVGhlIGdlbmVyYXRlZCBuYW1lIGlzIHRoZSBwaHlzaWNhbCBJRCBvZiB0aGUgY2FuYXJ5LlxuICAgKi9cbiAgcHJpdmF0ZSBnZW5lcmF0ZVVuaXF1ZU5hbWUoKTogc3RyaW5nIHtcbiAgICBjb25zdCBuYW1lID0gY2RrLk5hbWVzLnVuaXF1ZUlkKHRoaXMpLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgnICcsICctJyk7XG4gICAgaWYgKG5hbWUubGVuZ3RoIDw9IDIxKSB7XG4gICAgICByZXR1cm4gbmFtZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG5hbWUuc3Vic3RyaW5nKDAsIDE1KSArIG5hbWVIYXNoKG5hbWUpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY2FubmVkTWV0cmljKFxuICAgIGZuOiAoZGltczogeyBDYW5hcnlOYW1lOiBzdHJpbmcgfSkgPT4gTWV0cmljUHJvcHMsXG4gICAgcHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljIHtcbiAgICByZXR1cm4gbmV3IE1ldHJpYyh7XG4gICAgICAuLi5mbih7IENhbmFyeU5hbWU6IHRoaXMuY2FuYXJ5TmFtZSB9KSxcbiAgICAgIC4uLnByb3BzLFxuICAgIH0pLmF0dGFjaFRvKHRoaXMpO1xuICB9XG59XG5cbi8qKlxuICogVGFrZSBhIGhhc2ggb2YgdGhlIGdpdmVuIG5hbWUuXG4gKlxuICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgdG8gYmUgaGFzaGVkXG4gKi9cbmZ1bmN0aW9uIG5hbWVIYXNoKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IG1kNSA9IGNyeXB0by5jcmVhdGVIYXNoKCdzaGEyNTYnKS51cGRhdGUobmFtZSkuZGlnZXN0KCdoZXgnKTtcbiAgcmV0dXJuIG1kNS5zbGljZSgwLCA2KTtcbn1cblxuY29uc3QgbmFtZVJlZ2V4OiBSZWdFeHAgPSAvXlswLTlhLXpfXFwtXSskLztcblxuLyoqXG4gKiBWZXJpZmllcyB0aGF0IHRoZSBuYW1lIGZpdHMgdGhlIHJlZ2V4IGV4cHJlc3Npb246IF5bMC05YS16X1xcLV0rJC5cbiAqXG4gKiBAcGFyYW0gbmFtZSAtIHRoZSBnaXZlbiBuYW1lIG9mIHRoZSBjYW5hcnlcbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVOYW1lKG5hbWU6IHN0cmluZykge1xuICBpZiAobmFtZS5sZW5ndGggPiAyMSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgQ2FuYXJ5IG5hbWUgaXMgdG9vIGxhcmdlLCBtdXN0IGJlIGJldHdlZW4gMSBhbmQgMjEgY2hhcmFjdGVycywgYnV0IGlzICR7bmFtZS5sZW5ndGh9IChnb3QgXCIke25hbWV9XCIpYCk7XG4gIH1cbiAgaWYgKCFuYW1lUmVnZXgudGVzdChuYW1lKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgQ2FuYXJ5IG5hbWUgbXVzdCBiZSBsb3dlcmNhc2UsIG51bWJlcnMsIGh5cGhlbnMsIG9yIHVuZGVyc2NvcmVzIChnb3QgXCIke25hbWV9XCIpYCk7XG4gIH1cbn1cbiJdfQ== \ No newline at end of file diff --git a/packages/@aws-cdk/aws-synthetics-alpha/lib/code.d.ts b/packages/@aws-cdk/aws-synthetics-alpha/lib/code.d.ts deleted file mode 100644 index 6c4513ef76e93..0000000000000 --- a/packages/@aws-cdk/aws-synthetics-alpha/lib/code.d.ts +++ /dev/null @@ -1,107 +0,0 @@ -import * as s3 from 'aws-cdk-lib/aws-s3'; -import * as s3_assets from 'aws-cdk-lib/aws-s3-assets'; -import { Construct } from 'constructs'; -import { RuntimeFamily } from './runtime'; -/** - * The code the canary should execute - */ -export declare abstract class Code { - /** - * Specify code inline. - * - * @param code The actual handler code (limited to 5MB) - * - * @returns `InlineCode` with inline code. - */ - static fromInline(code: string): InlineCode; - /** - * Specify code from a local path. Path must include the folder structure `nodejs/node_modules/myCanaryFilename.js`. - * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Canaries_WritingCanary.html#CloudWatch_Synthetics_Canaries_write_from_scratch - * - * @param assetPath Either a directory or a .zip file - * - * @returns `AssetCode` associated with the specified path. - */ - static fromAsset(assetPath: string, options?: s3_assets.AssetOptions): AssetCode; - /** - * Specify code from an s3 bucket. The object in the s3 bucket must be a .zip file that contains - * the structure `nodejs/node_modules/myCanaryFilename.js`. - * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Canaries_WritingCanary.html#CloudWatch_Synthetics_Canaries_write_from_scratch - * - * @param bucket The S3 bucket - * @param key The object key - * @param objectVersion Optional S3 object version - * - * @returns `S3Code` associated with the specified S3 object. - */ - static fromBucket(bucket: s3.IBucket, key: string, objectVersion?: string): S3Code; - /** - * Called when the canary is initialized to allow this object to bind - * to the stack, add resources and have fun. - * - * @param scope The binding scope. Don't be smart about trying to down-cast or - * assume it's initialized. You may just use it as a construct scope. - * - * @returns a bound `CodeConfig`. - */ - abstract bind(scope: Construct, handler: string, family: RuntimeFamily): CodeConfig; -} -/** - * Configuration of the code class - */ -export interface CodeConfig { - /** - * The location of the code in S3 (mutually exclusive with `inlineCode`). - * - * @default - none - */ - readonly s3Location?: s3.Location; - /** - * Inline code (mutually exclusive with `s3Location`). - * - * @default - none - */ - readonly inlineCode?: string; -} -/** - * Canary code from an Asset - */ -export declare class AssetCode extends Code { - private assetPath; - private options?; - private asset?; - /** - * @param assetPath The path to the asset file or directory. - */ - constructor(assetPath: string, options?: s3_assets.AssetOptions | undefined); - bind(scope: Construct, handler: string, family: RuntimeFamily): CodeConfig; - /** - * Validates requirements specified by the canary resource. For example, the canary code with handler `index.handler` - * must be found in the file structure `nodejs/node_modules/index.js`. - * - * Requires path to be either zip file or directory. - * Requires asset directory to have the structure 'nodejs/node_modules'. - * Requires canary file to be directly inside node_modules folder. - * Requires canary file name matches the handler name. - * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Canaries_WritingCanary.html - */ - private validateCanaryAsset; -} -/** - * Canary code from an inline string. - */ -export declare class InlineCode extends Code { - private code; - constructor(code: string); - bind(_scope: Construct, handler: string, _family: RuntimeFamily): CodeConfig; -} -/** - * S3 bucket path to the code zip file - */ -export declare class S3Code extends Code { - private bucket; - private key; - private objectVersion?; - constructor(bucket: s3.IBucket, key: string, objectVersion?: string | undefined); - bind(_scope: Construct, _handler: string, _family: RuntimeFamily): CodeConfig; -} diff --git a/packages/@aws-cdk/aws-synthetics-alpha/lib/code.js b/packages/@aws-cdk/aws-synthetics-alpha/lib/code.js deleted file mode 100644 index 4ad0c096559e5..0000000000000 --- a/packages/@aws-cdk/aws-synthetics-alpha/lib/code.js +++ /dev/null @@ -1,253 +0,0 @@ -"use strict"; -var _a, _b, _c, _d; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.S3Code = exports.InlineCode = exports.AssetCode = exports.Code = void 0; -const jsiiDeprecationWarnings = require("../.warnings.jsii.js"); -const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti"); -const fs = require("fs"); -const path = require("path"); -const s3_assets = require("aws-cdk-lib/aws-s3-assets"); -const runtime_1 = require("./runtime"); -const core_1 = require("aws-cdk-lib/core"); -/** - * The code the canary should execute - */ -class Code { - /** - * Specify code inline. - * - * @param code The actual handler code (limited to 5MB) - * - * @returns `InlineCode` with inline code. - */ - static fromInline(code) { - try { - jsiiDeprecationWarnings.print("@aws-cdk/aws-synthetics-alpha.Code#fromInline", ""); - } - catch (error) { - if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { - Error.captureStackTrace(error, this.fromInline); - } - throw error; - } - return new InlineCode(code); - } - /** - * Specify code from a local path. Path must include the folder structure `nodejs/node_modules/myCanaryFilename.js`. - * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Canaries_WritingCanary.html#CloudWatch_Synthetics_Canaries_write_from_scratch - * - * @param assetPath Either a directory or a .zip file - * - * @returns `AssetCode` associated with the specified path. - */ - static fromAsset(assetPath, options) { - try { - jsiiDeprecationWarnings.print("@aws-cdk/aws-synthetics-alpha.Code#fromAsset", ""); - } - catch (error) { - if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { - Error.captureStackTrace(error, this.fromAsset); - } - throw error; - } - return new AssetCode(assetPath, options); - } - /** - * Specify code from an s3 bucket. The object in the s3 bucket must be a .zip file that contains - * the structure `nodejs/node_modules/myCanaryFilename.js`. - * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Canaries_WritingCanary.html#CloudWatch_Synthetics_Canaries_write_from_scratch - * - * @param bucket The S3 bucket - * @param key The object key - * @param objectVersion Optional S3 object version - * - * @returns `S3Code` associated with the specified S3 object. - */ - static fromBucket(bucket, key, objectVersion) { - try { - jsiiDeprecationWarnings.print("@aws-cdk/aws-synthetics-alpha.Code#fromBucket", ""); - } - catch (error) { - if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { - Error.captureStackTrace(error, this.fromBucket); - } - throw error; - } - return new S3Code(bucket, key, objectVersion); - } -} -exports.Code = Code; -_a = JSII_RTTI_SYMBOL_1; -Code[_a] = { fqn: "@aws-cdk/aws-synthetics-alpha.Code", version: "0.0.0" }; -/** - * Canary code from an Asset - */ -class AssetCode extends Code { - /** - * @param assetPath The path to the asset file or directory. - */ - constructor(assetPath, options) { - super(); - this.assetPath = assetPath; - this.options = options; - try { - jsiiDeprecationWarnings.print("@aws-cdk/aws-synthetics-alpha.AssetCode", ""); - } - catch (error) { - if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { - Error.captureStackTrace(error, AssetCode); - } - throw error; - } - if (!fs.existsSync(this.assetPath)) { - throw new Error(`${this.assetPath} is not a valid path`); - } - } - bind(scope, handler, family) { - try { - jsiiDeprecationWarnings.print("@aws-cdk/aws-synthetics-alpha.AssetCode#bind", ""); - jsiiDeprecationWarnings._aws_cdk_aws_synthetics_alpha_RuntimeFamily(family); - } - catch (error) { - if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { - Error.captureStackTrace(error, this.bind); - } - throw error; - } - // If the same AssetCode is used multiple times, retain only the first instantiation. - if (!this.asset) { - this.asset = new s3_assets.Asset(scope, 'Code', { - path: this.assetPath, - ...this.options, - }); - } - this.validateCanaryAsset(scope, handler, family); - return { - s3Location: { - bucketName: this.asset.s3BucketName, - objectKey: this.asset.s3ObjectKey, - }, - }; - } - /** - * Validates requirements specified by the canary resource. For example, the canary code with handler `index.handler` - * must be found in the file structure `nodejs/node_modules/index.js`. - * - * Requires path to be either zip file or directory. - * Requires asset directory to have the structure 'nodejs/node_modules'. - * Requires canary file to be directly inside node_modules folder. - * Requires canary file name matches the handler name. - * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Canaries_WritingCanary.html - */ - validateCanaryAsset(scope, handler, family) { - if (!this.asset) { - throw new Error("'validateCanaryAsset' must be called after 'this.asset' is instantiated"); - } - // Get the staged (or copied) asset path. - // `this.asset.assetPath` is relative to the `outdir`, not the `assetOutDir`. - const asmManifestDir = core_1.Stage.of(scope)?.outdir; - const assetPath = asmManifestDir ? path.join(asmManifestDir, this.asset.assetPath) : this.assetPath; - if (path.extname(assetPath) !== '.zip') { - if (!fs.lstatSync(assetPath).isDirectory()) { - throw new Error(`Asset must be a .zip file or a directory (${this.assetPath})`); - } - const filename = handler.split('.')[0]; - const nodeFilename = `${filename}.js`; - const pythonFilename = `${filename}.py`; - if (family === runtime_1.RuntimeFamily.NODEJS && !fs.existsSync(path.join(assetPath, 'nodejs', 'node_modules', nodeFilename))) { - throw new Error(`The canary resource requires that the handler is present at "nodejs/node_modules/${nodeFilename}" but not found at ${this.assetPath} (https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Canaries_WritingCanary_Nodejs.html)`); - } - if (family === runtime_1.RuntimeFamily.PYTHON && !fs.existsSync(path.join(assetPath, 'python', pythonFilename))) { - throw new Error(`The canary resource requires that the handler is present at "python/${pythonFilename}" but not found at ${this.assetPath} (https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Canaries_WritingCanary_Python.html)`); - } - } - } -} -exports.AssetCode = AssetCode; -_b = JSII_RTTI_SYMBOL_1; -AssetCode[_b] = { fqn: "@aws-cdk/aws-synthetics-alpha.AssetCode", version: "0.0.0" }; -/** - * Canary code from an inline string. - */ -class InlineCode extends Code { - constructor(code) { - super(); - this.code = code; - try { - jsiiDeprecationWarnings.print("@aws-cdk/aws-synthetics-alpha.InlineCode", ""); - } - catch (error) { - if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { - Error.captureStackTrace(error, InlineCode); - } - throw error; - } - if (code.length === 0) { - throw new Error('Canary inline code cannot be empty'); - } - } - bind(_scope, handler, _family) { - try { - jsiiDeprecationWarnings.print("@aws-cdk/aws-synthetics-alpha.InlineCode#bind", ""); - jsiiDeprecationWarnings._aws_cdk_aws_synthetics_alpha_RuntimeFamily(_family); - } - catch (error) { - if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { - Error.captureStackTrace(error, this.bind); - } - throw error; - } - if (handler !== 'index.handler') { - throw new Error(`The handler for inline code must be "index.handler" (got "${handler}")`); - } - return { - inlineCode: this.code, - }; - } -} -exports.InlineCode = InlineCode; -_c = JSII_RTTI_SYMBOL_1; -InlineCode[_c] = { fqn: "@aws-cdk/aws-synthetics-alpha.InlineCode", version: "0.0.0" }; -/** - * S3 bucket path to the code zip file - */ -class S3Code extends Code { - constructor(bucket, key, objectVersion) { - super(); - this.bucket = bucket; - this.key = key; - this.objectVersion = objectVersion; - try { - jsiiDeprecationWarnings.print("@aws-cdk/aws-synthetics-alpha.S3Code", ""); - } - catch (error) { - if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { - Error.captureStackTrace(error, S3Code); - } - throw error; - } - } - bind(_scope, _handler, _family) { - try { - jsiiDeprecationWarnings.print("@aws-cdk/aws-synthetics-alpha.S3Code#bind", ""); - jsiiDeprecationWarnings._aws_cdk_aws_synthetics_alpha_RuntimeFamily(_family); - } - catch (error) { - if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { - Error.captureStackTrace(error, this.bind); - } - throw error; - } - return { - s3Location: { - bucketName: this.bucket.bucketName, - objectKey: this.key, - objectVersion: this.objectVersion, - }, - }; - } -} -exports.S3Code = S3Code; -_d = JSII_RTTI_SYMBOL_1; -S3Code[_d] = { fqn: "@aws-cdk/aws-synthetics-alpha.S3Code", version: "0.0.0" }; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29kZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImNvZGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEseUJBQXlCO0FBQ3pCLDZCQUE2QjtBQUU3Qix1REFBdUQ7QUFFdkQsdUNBQTBDO0FBQzFDLDJDQUF5QztBQUV6Qzs7R0FFRztBQUNILE1BQXNCLElBQUk7SUFFeEI7Ozs7OztPQU1HO0lBQ0ksTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFZOzs7Ozs7Ozs7O1FBQ25DLE9BQU8sSUFBSSxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7S0FDN0I7SUFFRDs7Ozs7OztPQU9HO0lBQ0ksTUFBTSxDQUFDLFNBQVMsQ0FBQyxTQUFpQixFQUFFLE9BQWdDOzs7Ozs7Ozs7O1FBQ3pFLE9BQU8sSUFBSSxTQUFTLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0tBQzFDO0lBRUQ7Ozs7Ozs7Ozs7T0FVRztJQUNJLE1BQU0sQ0FBQyxVQUFVLENBQUMsTUFBa0IsRUFBRSxHQUFXLEVBQUUsYUFBc0I7Ozs7Ozs7Ozs7UUFDOUUsT0FBTyxJQUFJLE1BQU0sQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLGFBQWEsQ0FBQyxDQUFDO0tBQy9DOztBQXRDSCxvQkFrREM7OztBQXFCRDs7R0FFRztBQUNILE1BQWEsU0FBVSxTQUFRLElBQUk7SUFHakM7O09BRUc7SUFDSCxZQUEyQixTQUFpQixFQUFVLE9BQWdDO1FBQ3BGLEtBQUssRUFBRSxDQUFDO1FBRGlCLGNBQVMsR0FBVCxTQUFTLENBQVE7UUFBVSxZQUFPLEdBQVAsT0FBTyxDQUF5Qjs7Ozs7OytDQU4zRSxTQUFTOzs7O1FBU2xCLElBQUksQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRTtZQUNsQyxNQUFNLElBQUksS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsc0JBQXNCLENBQUMsQ0FBQztTQUMxRDtLQUNGO0lBRU0sSUFBSSxDQUFDLEtB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QUFDO1NBQ3ZEO0tBQ0Y7SUFFTSxJQUFJLENBQUMsTUFBaUIsRUFBRSxPQUFlLEVBQUUsT0FBc0I7Ozs7Ozs7Ozs7O1FBRXBFLElBQUksT0FBTyxLQUFLLGVBQWUsRUFBRTtZQUMvQixNQUFNLElBQUksS0FBSyxDQUFDLDZEQUE2RCxPQUFPLElBQUksQ0FBQyxDQUFDO1NBQzNGO1FBRUQsT0FBTztZQUNMLFVBQVUsRUFBRSxJQUFJLENBQUMsSUFBSTtTQUN0QixDQUFDO0tBQ0g7O0FBbEJILGdDQW1CQzs7O0FBRUQ7O0dBRUc7QUFDSCxNQUFhLE1BQU8sU0FBUSxJQUFJO0lBQzlCLFlBQTJCLE1BQWtCLEVBQVUsR0FBVyxFQUFVLGFBQXNCO1FBQ2hHLEtBQUssRUFBRSxDQUFDO1FBRGlCLFdBQU0sR0FBTixNQUFNLENBQVk7UUFBVSxRQUFHLEdBQUgsR0FBRyxDQUFRO1FBQVUsa0JBQWEsR0FBYixhQUFhLENBQVM7Ozs7OzsrQ0FEdkYsTUFBTTs7OztLQUdoQjtJQUVNLElBQUksQ0FBQyxNQUFpQixFQUFFLFFBQWdCLEVBQUUsT0FBc0I7Ozs7Ozs7Ozs7O1FBQ3JFLE9BQU87WUFDTCxVQUFVLEVBQUU7Z0JBQ1YsVUFBVSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVTtnQkFDbEMsU0FBUyxFQUFFLElBQUksQ0FBQyxHQUFHO2dCQUNuQixhQUFhLEVBQUUsSUFBSSxDQUFDLGFBQWE7YUFDbEM7U0FDRixDQUFDO0tBQ0g7O0FBYkgsd0JBY0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBmcyBmcm9tICdmcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0ICogYXMgczMgZnJvbSAnYXdzLWNkay1saWIvYXdzLXMzJztcbmltcG9ydCAqIGFzIHMzX2Fzc2V0cyBmcm9tICdhd3MtY2RrLWxpYi9hd3MtczMtYXNzZXRzJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgUnVudGltZUZhbWlseSB9IGZyb20gJy4vcnVudGltZSc7XG5pbXBvcnQgeyBTdGFnZSB9IGZyb20gJ2F3cy1jZGstbGliL2NvcmUnO1xuXG4vKipcbiAqIFRoZSBjb2RlIHRoZSBjYW5hcnkgc2hvdWxkIGV4ZWN1dGVcbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIENvZGUge1xuXG4gIC8qKlxuICAgKiBTcGVjaWZ5IGNvZGUgaW5saW5lLlxuICAgKlxuICAgKiBAcGFyYW0gY29kZSBUaGUgYWN0dWFsIGhhbmRsZXIgY29kZSAobGltaXRlZCB0byA1TUIpXG4gICAqXG4gICAqIEByZXR1cm5zIGBJbmxpbmVDb2RlYCB3aXRoIGlubGluZSBjb2RlLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tSW5saW5lKGNvZGU6IHN0cmluZyk6IElubGluZUNvZGUge1xuICAgIHJldHVybiBuZXcgSW5saW5lQ29kZShjb2RlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTcGVjaWZ5IGNvZGUgZnJvbSBhIGxvY2FsIHBhdGguIFBhdGggbXVzdCBpbmNsdWRlIHRoZSBmb2xkZXIgc3RydWN0dXJlIGBub2RlanMvbm9kZV9tb2R1bGVzL215Q2FuYXJ5RmlsZW5hbWUuanNgLlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZFdhdGNoL2xhdGVzdC9tb25pdG9yaW5nL0Nsb3VkV2F0Y2hfU3ludGhldGljc19DYW5hcmllc19Xcml0aW5nQ2FuYXJ5Lmh0bWwjQ2xvdWRXYXRjaF9TeW50aGV0aWNzX0NhbmFyaWVzX3dyaXRlX2Zyb21fc2NyYXRjaFxuICAgKlxuICAgKiBAcGFyYW0gYXNzZXRQYXRoIEVpdGhlciBhIGRpcmVjdG9yeSBvciBhIC56aXAgZmlsZVxuICAgKlxuICAgKiBAcmV0dXJucyBgQXNzZXRDb2RlYCBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBwYXRoLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tQXNzZXQoYXNzZXRQYXRoOiBzdHJpbmcsIG9wdGlvbnM/OiBzM19hc3NldHMuQXNzZXRPcHRpb25zKTogQXNzZXRDb2RlIHtcbiAgICByZXR1cm4gbmV3IEFzc2V0Q29kZShhc3NldFBhdGgsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNwZWNpZnkgY29kZSBmcm9tIGFuIHMzIGJ1Y2tldC4gVGhlIG9iamVjdCBpbiB0aGUgczMgYnVja2V0IG11c3QgYmUgYSAuemlwIGZpbGUgdGhhdCBjb250YWluc1xuICAgKiB0aGUgc3RydWN0dXJlIGBub2RlanMvbm9kZV9tb2R1bGVzL215Q2FuYXJ5RmlsZW5hbWUuanNgLlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZFdhdGNoL2xhdGVzdC9tb25pdG9yaW5nL0Nsb3VkV2F0Y2hfU3ludGhldGljc19DYW5hcmllc19Xcml0aW5nQ2FuYXJ5Lmh0bWwjQ2xvdWRXYXRjaF9TeW50aGV0aWNzX0NhbmFyaWVzX3dyaXRlX2Zyb21fc2NyYXRjaFxuICAgKlxuICAgKiBAcGFyYW0gYnVja2V0IFRoZSBTMyBidWNrZXRcbiAgICogQHBhcmFtIGtleSBUaGUgb2JqZWN0IGtleVxuICAgKiBAcGFyYW0gb2JqZWN0VmVyc2lvbiBPcHRpb25hbCBTMyBvYmplY3QgdmVyc2lvblxuICAgKlxuICAgKiBAcmV0dXJucyBgUzNDb2RlYCBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBTMyBvYmplY3QuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21CdWNrZXQoYnVja2V0OiBzMy5JQnVja2V0LCBrZXk6IHN0cmluZywgb2JqZWN0VmVyc2lvbj86IHN0cmluZyk6IFMzQ29kZSB7XG4gICAgcmV0dXJuIG5ldyBTM0NvZGUoYnVja2V0LCBrZXksIG9iamVjdFZlcnNpb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIHRoZSBjYW5hcnkgaXMgaW5pdGlhbGl6ZWQgdG8gYWxsb3cgdGhpcyBvYmplY3QgdG8gYmluZFxuICAgKiB0byB0aGUgc3RhY2ssIGFkZCByZXNvdXJjZXMgYW5kIGhhdmUgZnVuLlxuICAgKlxuICAgKiBAcGFyYW0gc2NvcGUgVGhlIGJpbmRpbmcgc2NvcGUuIERvbid0IGJlIHNtYXJ0IGFib3V0IHRyeWluZyB0byBkb3duLWNhc3Qgb3JcbiAgICogICAgICAgICAgICAgIGFzc3VtZSBpdCdzIGluaXRpYWxpemVkLiBZb3UgbWF5IGp1c3QgdXNlIGl0IGFzIGEgY29uc3RydWN0IHNjb3BlLlxuICAgKlxuICAgKiBAcmV0dXJucyBhIGJvdW5kIGBDb2RlQ29uZmlnYC5cbiAgICovXG4gIHB1YmxpYyBhYnN0cmFjdCBiaW5kKHNjb3BlOiBDb25zdHJ1Y3QsIGhhbmRsZXI6IHN0cmluZywgZmFtaWx5OiBSdW50aW1lRmFtaWx5KTogQ29kZUNvbmZpZztcbn1cblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIG9mIHRoZSBjb2RlIGNsYXNzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29kZUNvbmZpZyB7XG4gIC8qKlxuICAgKiBUaGUgbG9jYXRpb24gb2YgdGhlIGNvZGUgaW4gUzMgKG11dHVhbGx5IGV4Y2x1c2l2ZSB3aXRoIGBpbmxpbmVDb2RlYCkuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm9uZVxuICAgKi9cbiAgcmVhZG9ubHkgczNMb2NhdGlvbj86IHMzLkxvY2F0aW9uO1xuXG4gIC8qKlxuICAgKiBJbmxpbmUgY29kZSAobXV0dWFsbHkgZXhjbHVzaXZlIHdpdGggYHMzTG9jYXRpb25gKS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBub25lXG4gICAqL1xuICByZWFkb25seSBpbmxpbmVDb2RlPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIENhbmFyeSBjb2RlIGZyb20gYW4gQXNzZXRcbiAqL1xuZXhwb3J0IGNsYXNzIEFzc2V0Q29kZSBleHRlbmRzIENvZGUge1xuICBwcml2YXRlIGFzc2V0PzogczNfYXNzZXRzLkFzc2V0O1xuXG4gIC8qKlxuICAgKiBAcGFyYW0gYXNzZXRQYXRoIFRoZSBwYXRoIHRvIHRoZSBhc3NldCBmaWxlIG9yIGRpcmVjdG9yeS5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIGFzc2V0UGF0aDogc3RyaW5nLCBwcml2YXRlIG9wdGlvbnM/OiBzM19hc3NldHMuQXNzZXRPcHRpb25zKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIGlmICghZnMuZXhpc3RzU3luYyh0aGlzLmFzc2V0UGF0aCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzLmFzc2V0UGF0aH0gaXMgbm90IGEgdmFsaWQgcGF0aGApO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBiaW5kKHNjb3BlOiBDb25zdHJ1Y3QsIGhhbmRsZXI6IHN0cmluZywgZmFtaWx5OiBSdW50aW1lRmFtaWx5KTogQ29kZUNvbmZpZyB7XG4gICAgLy8gSWYgdGhlIHNhbWUgQXNzZXRDb2RlIGlzIHVzZWQgbXVsdGlwbGUgdGltZXMsIHJldGFpbiBvbmx5IHRoZSBmaXJzdCBpbnN0YW50aWF0aW9uLlxuICAgIGlmICghdGhpcy5hc3NldCkge1xuICAgICAgdGhpcy5hc3NldCA9IG5ldyBzM19hc3NldHMuQXNzZXQoc2NvcGUsICdDb2RlJywge1xuICAgICAgICBwYXRoOiB0aGlzLmFzc2V0UGF0aCxcbiAgICAgICAgLi4udGhpcy5vcHRpb25zLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy52YWxpZGF0ZUNhbmFyeUFzc2V0KHNjb3BlLCBoYW5kbGVyLCBmYW1pbHkpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHMzTG9jYXRpb246IHtcbiAgICAgICAgYnVja2V0TmFtZTogdGhpcy5hc3NldC5zM0J1Y2tldE5hbWUsXG4gICAgICAgIG9iamVjdEtleTogdGhpcy5hc3NldC5zM09iamVjdEtleSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgcmVxdWlyZW1lbnRzIHNwZWNpZmllZCBieSB0aGUgY2FuYXJ5IHJlc291cmNlLiBGb3IgZXhhbXBsZSwgdGhlIGNhbmFyeSBjb2RlIHdpdGggaGFuZGxlciBgaW5kZXguaGFuZGxlcmBcbiAgICogbXVzdCBiZSBmb3VuZCBpbiB0aGUgZmlsZSBzdHJ1Y3R1cmUgYG5vZGVqcy9ub2RlX21vZHVsZXMvaW5kZXguanNgLlxuICAgKlxuICAgKiBSZXF1aXJlcyBwYXRoIHRvIGJlIGVpdGhlciB6aXAgZmlsZSBvciBkaXJlY3RvcnkuXG4gICAqIFJlcXVpcmVzIGFzc2V0IGRpcmVjdG9yeSB0byBoYXZlIHRoZSBzdHJ1Y3R1cmUgJ25vZGVqcy9ub2RlX21vZHVsZXMnLlxuICAgKiBSZXF1aXJlcyBjYW5hcnkgZmlsZSB0byBiZSBkaXJlY3RseSBpbnNpZGUgbm9kZV9tb2R1bGVzIGZvbGRlci5cbiAgICogUmVxdWlyZXMgY2FuYXJ5IGZpbGUgbmFtZSBtYXRjaGVzIHRoZSBoYW5kbGVyIG5hbWUuXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkV2F0Y2gvbGF0ZXN0L21vbml0b3JpbmcvQ2xvdWRXYXRjaF9TeW50aGV0aWNzX0NhbmFyaWVzX1dyaXRpbmdDYW5hcnkuaHRtbFxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZUNhbmFyeUFzc2V0KHNjb3BlOiBDb25zdHJ1Y3QsIGhhbmRsZXI6IHN0cmluZywgZmFtaWx5OiBSdW50aW1lRmFtaWx5KSB7XG4gICAgaWYgKCF0aGlzLmFzc2V0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCIndmFsaWRhdGVDYW5hcnlBc3NldCcgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgJ3RoaXMuYXNzZXQnIGlzIGluc3RhbnRpYXRlZFwiKTtcbiAgICB9XG5cbiAgICAvLyBHZXQgdGhlIHN0YWdlZCAob3IgY29waWVkKSBhc3NldCBwYXRoLlxuICAgIC8vIGB0aGlzLmFzc2V0LmFzc2V0UGF0aGAgaXMgcmVsYXRpdmUgdG8gdGhlIGBvdXRkaXJgLCBub3QgdGhlIGBhc3NldE91dERpcmAuXG4gICAgY29uc3QgYXNtTWFuaWZlc3REaXIgPSBTdGFnZS5vZihzY29wZSk/Lm91dGRpcjtcbiAgICBjb25zdCBhc3NldFBhdGggPSBhc21NYW5pZmVzdERpciA/IHBhdGguam9pbihhc21NYW5pZmVzdERpciwgdGhpcy5hc3NldC5hc3NldFBhdGgpOiB0aGlzLmFzc2V0UGF0aDtcblxuICAgIGlmIChwYXRoLmV4dG5hbWUoYXNzZXRQYXRoKSAhPT0gJy56aXAnKSB7XG4gICAgICBpZiAoIWZzLmxzdGF0U3luYyhhc3NldFBhdGgpLmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBBc3NldCBtdXN0IGJlIGEgLnppcCBmaWxlIG9yIGEgZGlyZWN0b3J5ICgke3RoaXMuYXNzZXRQYXRofSlgKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGZpbGVuYW1lID0gaGFuZGxlci5zcGxpdCgnLicpWzBdO1xuICAgICAgY29uc3Qgbm9kZUZpbGVuYW1lID0gYCR7ZmlsZW5hbWV9LmpzYDtcbiAgICAgIGNvbnN0IHB5dGhvbkZpbGVuYW1lID0gYCR7ZmlsZW5hbWV9LnB5YDtcbiAgICAgIGlmIChmYW1pbHkgPT09IFJ1bnRpbWVGYW1pbHkuTk9ERUpTICYmICFmcy5leGlzdHNTeW5jKHBhdGguam9pbihhc3NldFBhdGgsICdub2RlanMnLCAnbm9kZV9tb2R1bGVzJywgbm9kZUZpbGVuYW1lKSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgY2FuYXJ5IHJlc291cmNlIHJlcXVpcmVzIHRoYXQgdGhlIGhhbmRsZXIgaXMgcHJlc2VudCBhdCBcIm5vZGVqcy9ub2RlX21vZHVsZXMvJHtub2RlRmlsZW5hbWV9XCIgYnV0IG5vdCBmb3VuZCBhdCAke3RoaXMuYXNzZXRQYXRofSAoaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkV2F0Y2gvbGF0ZXN0L21vbml0b3JpbmcvQ2xvdWRXYXRjaF9TeW50aGV0aWNzX0NhbmFyaWVzX1dyaXRpbmdDYW5hcnlfTm9kZWpzLmh0bWwpYCk7XG4gICAgICB9XG4gICAgICBpZiAoZmFtaWx5ID09PSBSdW50aW1lRmFtaWx5LlBZVEhPTiAmJiAhZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oYXNzZXRQYXRoLCAncHl0aG9uJywgcHl0aG9uRmlsZW5hbWUpKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBjYW5hcnkgcmVzb3VyY2UgcmVxdWlyZXMgdGhhdCB0aGUgaGFuZGxlciBpcyBwcmVzZW50IGF0IFwicHl0aG9uLyR7cHl0aG9uRmlsZW5hbWV9XCIgYnV0IG5vdCBmb3VuZCBhdCAke3RoaXMuYXNzZXRQYXRofSAoaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkV2F0Y2gvbGF0ZXN0L21vbml0b3JpbmcvQ2xvdWRXYXRjaF9TeW50aGV0aWNzX0NhbmFyaWVzX1dyaXRpbmdDYW5hcnlfUHl0aG9uLmh0bWwpYCk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQ2FuYXJ5IGNvZGUgZnJvbSBhbiBpbmxpbmUgc3RyaW5nLlxuICovXG5leHBvcnQgY2xhc3MgSW5saW5lQ29kZSBleHRlbmRzIENvZGUge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBjb2RlOiBzdHJpbmcpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgaWYgKGNvZGUubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NhbmFyeSBpbmxpbmUgY29kZSBjYW5ub3QgYmUgZW1wdHknKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgYmluZChfc2NvcGU6IENvbnN0cnVjdCwgaGFuZGxlcjogc3RyaW5nLCBfZmFtaWx5OiBSdW50aW1lRmFtaWx5KTogQ29kZUNvbmZpZyB7XG5cbiAgICBpZiAoaGFuZGxlciAhPT0gJ2luZGV4LmhhbmRsZXInKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBoYW5kbGVyIGZvciBpbmxpbmUgY29kZSBtdXN0IGJlIFwiaW5kZXguaGFuZGxlclwiIChnb3QgXCIke2hhbmRsZXJ9XCIpYCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGlubGluZUNvZGU6IHRoaXMuY29kZSxcbiAgICB9O1xuICB9XG59XG5cbi8qKlxuICogUzMgYnVja2V0IHBhdGggdG8gdGhlIGNvZGUgemlwIGZpbGVcbiAqL1xuZXhwb3J0IGNsYXNzIFMzQ29kZSBleHRlbmRzIENvZGUge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBidWNrZXQ6IHMzLklCdWNrZXQsIHByaXZhdGUga2V5OiBzdHJpbmcsIHByaXZhdGUgb2JqZWN0VmVyc2lvbj86IHN0cmluZykge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBwdWJsaWMgYmluZChfc2NvcGU6IENvbnN0cnVjdCwgX2hhbmRsZXI6IHN0cmluZywgX2ZhbWlseTogUnVudGltZUZhbWlseSk6IENvZGVDb25maWcge1xuICAgIHJldHVybiB7XG4gICAgICBzM0xvY2F0aW9uOiB7XG4gICAgICAgIGJ1Y2tldE5hbWU6IHRoaXMuYnVja2V0LmJ1Y2tldE5hbWUsXG4gICAgICAgIG9iamVjdEtleTogdGhpcy5rZXksXG4gICAgICAgIG9iamVjdFZlcnNpb246IHRoaXMub2JqZWN0VmVyc2lvbixcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxufVxuIl19 \ No newline at end of file diff --git a/packages/@aws-cdk/aws-synthetics-alpha/lib/index.d.ts b/packages/@aws-cdk/aws-synthetics-alpha/lib/index.d.ts deleted file mode 100644 index 6d568ad6cec84..0000000000000 --- a/packages/@aws-cdk/aws-synthetics-alpha/lib/index.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -export * from './canary'; -export * from './code'; -export * from './runtime'; -export * from './schedule'; diff --git a/packages/@aws-cdk/aws-synthetics-alpha/lib/index.js b/packages/@aws-cdk/aws-synthetics-alpha/lib/index.js deleted file mode 100644 index dbca29433d92f..0000000000000 --- a/packages/@aws-cdk/aws-synthetics-alpha/lib/index.js +++ /dev/null @@ -1,22 +0,0 @@ -"use strict"; -var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - var desc = Object.getOwnPropertyDescriptor(m, k); - if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { - desc = { enumerable: true, get: function() { return m[k]; } }; - } - Object.defineProperty(o, k2, desc); -}) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; -})); -var __exportStar = (this && this.__exportStar) || function(m, exports) { - for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); -}; -Object.defineProperty(exports, "__esModule", { value: true }); -__exportStar(require("./canary"), exports); -__exportStar(require("./code"), exports); -__exportStar(require("./runtime"), exports); -__exportStar(require("./schedule"), exports); -// AWS::Synthetics CloudFormation Resources: -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsMkNBQXlCO0FBQ3pCLHlDQUF1QjtBQUN2Qiw0Q0FBMEI7QUFDMUIsNkNBQTJCO0FBRTNCLDRDQUE0QyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vY2FuYXJ5JztcbmV4cG9ydCAqIGZyb20gJy4vY29kZSc7XG5leHBvcnQgKiBmcm9tICcuL3J1bnRpbWUnO1xuZXhwb3J0ICogZnJvbSAnLi9zY2hlZHVsZSc7XG5cbi8vIEFXUzo6U3ludGhldGljcyBDbG91ZEZvcm1hdGlvbiBSZXNvdXJjZXM6XG4iXX0= \ No newline at end of file diff --git a/packages/@aws-cdk/aws-synthetics-alpha/lib/runtime.d.ts b/packages/@aws-cdk/aws-synthetics-alpha/lib/runtime.d.ts deleted file mode 100644 index 1537bad63b638..0000000000000 --- a/packages/@aws-cdk/aws-synthetics-alpha/lib/runtime.d.ts +++ /dev/null @@ -1,280 +0,0 @@ -/** - * All known Lambda runtime families. - */ -export declare enum RuntimeFamily { - /** - * All Lambda runtimes that depend on Node.js. - */ - NODEJS = 0, - /** - * All lambda runtimes that depend on Python. - */ - PYTHON = 1, - /** - * Any future runtime family. - */ - OTHER = 2 -} -/** - * Runtime options for a canary - */ -export declare class Runtime { - readonly name: string; - readonly family: RuntimeFamily; - /** - * **Deprecated by AWS Synthetics. You can't create canaries with deprecated runtimes.** - * - * `syn-1.0` includes the following: - * - * - Synthetics library 1.0 - * - Synthetics handler code 1.0 - * - Lambda runtime Node.js 10.x - * - Puppeteer-core version 1.14.0 - * - The Chromium version that matches Puppeteer-core 1.14.0 - * - * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Library_nodejs_puppeteer.html#CloudWatch_Synthetics_runtimeversion-1.0 - * @deprecated Use the latest version instead - */ - static readonly SYNTHETICS_1_0: Runtime; - /** - * **Deprecated by AWS Synthetics. You can't create canaries with deprecated runtimes.** - * - * `syn-nodejs-2.0` includes the following: - * - Lambda runtime Node.js 10.x - * - Puppeteer-core version 3.3.0 - * - Chromium version 83.0.4103.0 - * - * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Library_nodejs_puppeteer.html#CloudWatch_Synthetics_runtimeversion-2.0 - * @deprecated Use the latest version instead - */ - static readonly SYNTHETICS_NODEJS_2_0: Runtime; - /** - * **Deprecated by AWS Synthetics. You can't create canaries with deprecated runtimes.** - * - * `syn-nodejs-2.1` includes the following: - * - Lambda runtime Node.js 10.x - * - Puppeteer-core version 3.3.0 - * - Chromium version 83.0.4103.0 - * - * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Library_nodejs_puppeteer.html#CloudWatch_Synthetics_runtimeversion-2.1 - * @deprecated Use the latest version instead - */ - static readonly SYNTHETICS_NODEJS_2_1: Runtime; - /** - * **Deprecated by AWS Synthetics. You can't create canaries with deprecated runtimes.** - * - * `syn-nodejs-2.2` includes the following: - * - Lambda runtime Node.js 10.x - * - Puppeteer-core version 3.3.0 - * - Chromium version 83.0.4103.0 - * - * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Library_nodejs_puppeteer.html#CloudWatch_Synthetics_runtimeversion-2.2 - * @deprecated Use the latest version instead - */ - static readonly SYNTHETICS_NODEJS_2_2: Runtime; - /** - * **Deprecated by AWS Synthetics. You can't create canaries with deprecated runtimes.** - * - * `syn-nodejs-puppeteer-3.0` includes the following: - * - Lambda runtime Node.js 12.x - * - Puppeteer-core version 5.5.0 - * - Chromium version 88.0.4298.0 - * - * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Library_nodejs_puppeteer.html#CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-3.0 - * @deprecated Use the latest version instead - */ - static readonly SYNTHETICS_NODEJS_PUPPETEER_3_0: Runtime; - /** - * **Deprecated by AWS Synthetics. You can't create canaries with deprecated runtimes.** - * - * `syn-nodejs-puppeteer-3.1` includes the following: - * - Lambda runtime Node.js 12.x - * - Puppeteer-core version 5.5.0 - * - Chromium version 88.0.4298.0 - * - * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Library_nodejs_puppeteer.html#CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-3.1 - * @deprecated Use the latest version instead - */ - static readonly SYNTHETICS_NODEJS_PUPPETEER_3_1: Runtime; - /** - * **Deprecated by AWS Synthetics. You can't create canaries with deprecated runtimes.** - * - * `syn-nodejs-puppeteer-3.2` includes the following: - * - Lambda runtime Node.js 12.x - * - Puppeteer-core version 5.5.0 - * - Chromium version 88.0.4298.0 - * - * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Library_nodejs_puppeteer.html#CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-3.2 - * @deprecated Use the latest version instead - */ - static readonly SYNTHETICS_NODEJS_PUPPETEER_3_2: Runtime; - /** - * `syn-nodejs-puppeteer-3.3` includes the following: - * **Deprecated by AWS Synthetics. You can't create canaries with deprecated runtimes.** - * - * - Lambda runtime Node.js 12.x - * - Puppeteer-core version 5.5.0 - * - Chromium version 88.0.4298.0 - * - * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Library_nodejs_puppeteer.html#CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-3.3 - * @deprecated Use the latest version instead - */ - static readonly SYNTHETICS_NODEJS_PUPPETEER_3_3: Runtime; - /** - * **Deprecated by AWS Synthetics. You can't create canaries with deprecated runtimes.** - * - * `syn-nodejs-puppeteer-3.4` includes the following: - * - Lambda runtime Node.js 12.x - * - Puppeteer-core version 5.5.0 - * - Chromium version 88.0.4298.0 - * - * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Library_nodejs_puppeteer.html#CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-3.4 - * @deprecated Use the latest version instead - */ - static readonly SYNTHETICS_NODEJS_PUPPETEER_3_4: Runtime; - /** - * `syn-nodejs-puppeteer-3.5` includes the following: - * - Lambda runtime Node.js 14.x - * - Puppeteer-core version 10.1.0 - * - Chromium version 92.0.4512 - * - * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Library_nodejs_puppeteer.html#CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-3.5 - */ - static readonly SYNTHETICS_NODEJS_PUPPETEER_3_5: Runtime; - /** - * `syn-nodejs-puppeteer-3.6` includes the following: - * - Lambda runtime Node.js 14.x - * - Puppeteer-core version 10.1.0 - * - Chromium version 92.0.4512 - * - * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Library_nodejs_puppeteer.html#CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-3.6 - */ - static readonly SYNTHETICS_NODEJS_PUPPETEER_3_6: Runtime; - /** - * `syn-nodejs-puppeteer-3.7` includes the following: - * - Lambda runtime Node.js 14.x - * - Puppeteer-core version 10.1.0 - * - Chromium version 92.0.4512 - * - * New Features: - * - **Logging enhancement**: The canary will upload logs to Amazon S3 even if it times out or crashes. - * - **Lambda layer size reduced**: The size of the Lambda layer used for canaries is reduced by 34%. - * - * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Library_nodejs_puppeteer.html#CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-3.7 - */ - static readonly SYNTHETICS_NODEJS_PUPPETEER_3_7: Runtime; - /** - * `syn-nodejs-puppeteer-3.8` includes the following: - * - Lambda runtime Node.js 14.x - * - Puppeteer-core version 10.1.0 - * - Chromium version 92.0.4512 - * - * New Features: - * - **Profile cleanup**: Chromium profiles are now cleaned up after each canary run. - * - * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Library_nodejs_puppeteer.html#CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-3.8 - */ - static readonly SYNTHETICS_NODEJS_PUPPETEER_3_8: Runtime; - /** - * `syn-nodejs-puppeteer-3.9` includes the following: - * - * - Lambda runtime Node.js 14.x - * - Puppeteer-core version 5.5.0 - * - Chromium version 92.0.4512 - * - * New Features: - * - **Dependency upgrades**: Upgrades some third-party dependency packages. - * - * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Library_nodejs_puppeteer.html#CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-3.9 - */ - static readonly SYNTHETICS_NODEJS_PUPPETEER_3_9: Runtime; - /** - * `syn-nodejs-puppeteer-4.0` includes the following: - * - Lambda runtime Node.js 16.x - * - Puppeteer-core version 5.5.0 - * - Chromium version 92.0.4512 - * - * New Features: - * - **Dependency upgrades**: The Node.js dependency is updated to 16.x. - * - * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Library_nodejs_puppeteer.html#CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-4.0 - */ - static readonly SYNTHETICS_NODEJS_PUPPETEER_4_0: Runtime; - /** - * `syn-nodejs-puppeteer-5.0` includes the following: - * - Lambda runtime Node.js 16.x - * - Puppeteer-core version 19.7.0 - * - Chromium version 111.0.5563.146 - * - * New Features: - * - **Dependency upgrade**: The Puppeteer-core version is updated to 19.7.0. The Chromium version is upgraded to 111.0.5563.146. - * - * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Library_nodejs_puppeteer.html#CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-5.0 - */ - static readonly SYNTHETICS_NODEJS_PUPPETEER_5_0: Runtime; - /** - * `syn-nodejs-puppeteer-5.1` includes the following: - * - Lambda runtime Node.js 16.x - * - Puppeteer-core version 19.7.0 - * - Chromium version 111.0.5563.146 - * - * Bug fixes: - * - **Bug fix**: This runtime fixes a bug in `syn-nodejs-puppeteer-5.0` where the HAR files created by the canaries were missing request headers. - * - * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Library_nodejs_puppeteer.html#CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-5.1 - */ - static readonly SYNTHETICS_NODEJS_PUPPETEER_5_1: Runtime; - /** - * `syn-python-selenium-1.0` includes the following: - * - Lambda runtime Python 3.8 - * - Selenium version 3.141.0 - * - Chromium version 83.0.4103.0 - * - * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Library_python_selenium.html#CloudWatch_Synthetics_runtimeversion-syn-python-selenium-1.0 - */ - static readonly SYNTHETICS_PYTHON_SELENIUM_1_0: Runtime; - /** - * `syn-python-selenium-1.1` includes the following: - * - Lambda runtime Python 3.8 - * - Selenium version 3.141.0 - * - Chromium version 83.0.4103.0 - * - * New Features: - * - **Custom handler function**: You can now use a custom handler function for your canary scripts. - * - **Configuration options for adding metrics and step failure configurations**: These options were already available in runtimes for Node.js canaries. - * - **Custom arguments in Chrome**: You can now open a browser in incognito mode or pass in proxy server configuration. - * - **Cross-Region artifact buckets**: A canary can store its artifacts in an Amazon S3 bucket in a different Region. - * - * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Library_python_selenium.html#CloudWatch_Synthetics_runtimeversion-syn-python-selenium-1.1 - */ - static readonly SYNTHETICS_PYTHON_SELENIUM_1_1: Runtime; - /** - * `syn-python-selenium-1.2` includes the following: - * - Lambda runtime Python 3.8 - * - Selenium version 3.141.0 - * - Chromium version 92.0.4512.0 - * - * New Features: - * - **Updated dependencies**: The only new features in this runtime are the updated dependencies. - * - * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Library_python_selenium.html#CloudWatch_Synthetics_runtimeversion-syn-python-selenium-1.2 - */ - static readonly SYNTHETICS_PYTHON_SELENIUM_1_2: Runtime; - /** - * `syn-python-selenium-1.3` includes the following: - * - Lambda runtime Python 3.8 - * - Selenium version 3.141.0 - * - Chromium version 92.0.4512.0 - * - * New Features: - * - **More precise timestamps**: The start time and stop time of canary runs are now precise to the millisecond. - * - * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Library_python_selenium.html#CloudWatch_Synthetics_runtimeversion-syn-python-selenium-1.3 - */ - static readonly SYNTHETICS_PYTHON_SELENIUM_1_3: Runtime; - /** - * @param name The name of the runtime version - * @param family The Lambda runtime family - */ - constructor(name: string, family: RuntimeFamily); -} diff --git a/packages/@aws-cdk/aws-synthetics-alpha/lib/runtime.js b/packages/@aws-cdk/aws-synthetics-alpha/lib/runtime.js deleted file mode 100644 index 545c77d0fe8a9..0000000000000 --- a/packages/@aws-cdk/aws-synthetics-alpha/lib/runtime.js +++ /dev/null @@ -1,302 +0,0 @@ -"use strict"; -var _a; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.Runtime = exports.RuntimeFamily = void 0; -const jsiiDeprecationWarnings = require("../.warnings.jsii.js"); -const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti"); -/** - * All known Lambda runtime families. - */ -var RuntimeFamily; -(function (RuntimeFamily) { - /** - * All Lambda runtimes that depend on Node.js. - */ - RuntimeFamily[RuntimeFamily["NODEJS"] = 0] = "NODEJS"; - /** - * All lambda runtimes that depend on Python. - */ - RuntimeFamily[RuntimeFamily["PYTHON"] = 1] = "PYTHON"; - /** - * Any future runtime family. - */ - RuntimeFamily[RuntimeFamily["OTHER"] = 2] = "OTHER"; -})(RuntimeFamily || (exports.RuntimeFamily = RuntimeFamily = {})); -/** - * Runtime options for a canary - */ -class Runtime { - /** - * @param name The name of the runtime version - * @param family The Lambda runtime family - */ - constructor(name, family) { - this.name = name; - this.family = family; - try { - jsiiDeprecationWarnings.print("@aws-cdk/aws-synthetics-alpha.Runtime", ""); - jsiiDeprecationWarnings._aws_cdk_aws_synthetics_alpha_RuntimeFamily(family); - } - catch (error) { - if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { - Error.captureStackTrace(error, Runtime); - } - throw error; - } - } -} -exports.Runtime = Runtime; -_a = JSII_RTTI_SYMBOL_1; -Runtime[_a] = { fqn: "@aws-cdk/aws-synthetics-alpha.Runtime", version: "0.0.0" }; -/** - * **Deprecated by AWS Synthetics. You can't create canaries with deprecated runtimes.** - * - * `syn-1.0` includes the following: - * - * - Synthetics library 1.0 - * - Synthetics handler code 1.0 - * - Lambda runtime Node.js 10.x - * - Puppeteer-core version 1.14.0 - * - The Chromium version that matches Puppeteer-core 1.14.0 - * - * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Library_nodejs_puppeteer.html#CloudWatch_Synthetics_runtimeversion-1.0 - * @deprecated Use the latest version instead - */ -Runtime.SYNTHETICS_1_0 = new Runtime('syn-1.0', RuntimeFamily.NODEJS); -/** - * **Deprecated by AWS Synthetics. You can't create canaries with deprecated runtimes.** - * - * `syn-nodejs-2.0` includes the following: - * - Lambda runtime Node.js 10.x - * - Puppeteer-core version 3.3.0 - * - Chromium version 83.0.4103.0 - * - * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Library_nodejs_puppeteer.html#CloudWatch_Synthetics_runtimeversion-2.0 - * @deprecated Use the latest version instead - */ -Runtime.SYNTHETICS_NODEJS_2_0 = new Runtime('syn-nodejs-2.0', RuntimeFamily.NODEJS); -/** - * **Deprecated by AWS Synthetics. You can't create canaries with deprecated runtimes.** - * - * `syn-nodejs-2.1` includes the following: - * - Lambda runtime Node.js 10.x - * - Puppeteer-core version 3.3.0 - * - Chromium version 83.0.4103.0 - * - * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Library_nodejs_puppeteer.html#CloudWatch_Synthetics_runtimeversion-2.1 - * @deprecated Use the latest version instead - */ -Runtime.SYNTHETICS_NODEJS_2_1 = new Runtime('syn-nodejs-2.1', RuntimeFamily.NODEJS); -/** - * **Deprecated by AWS Synthetics. You can't create canaries with deprecated runtimes.** - * - * `syn-nodejs-2.2` includes the following: - * - Lambda runtime Node.js 10.x - * - Puppeteer-core version 3.3.0 - * - Chromium version 83.0.4103.0 - * - * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Library_nodejs_puppeteer.html#CloudWatch_Synthetics_runtimeversion-2.2 - * @deprecated Use the latest version instead - */ -Runtime.SYNTHETICS_NODEJS_2_2 = new Runtime('syn-nodejs-2.2', RuntimeFamily.NODEJS); -/** - * **Deprecated by AWS Synthetics. You can't create canaries with deprecated runtimes.** - * - * `syn-nodejs-puppeteer-3.0` includes the following: - * - Lambda runtime Node.js 12.x - * - Puppeteer-core version 5.5.0 - * - Chromium version 88.0.4298.0 - * - * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Library_nodejs_puppeteer.html#CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-3.0 - * @deprecated Use the latest version instead - */ -Runtime.SYNTHETICS_NODEJS_PUPPETEER_3_0 = new Runtime('syn-nodejs-puppeteer-3.0', RuntimeFamily.NODEJS); -/** - * **Deprecated by AWS Synthetics. You can't create canaries with deprecated runtimes.** - * - * `syn-nodejs-puppeteer-3.1` includes the following: - * - Lambda runtime Node.js 12.x - * - Puppeteer-core version 5.5.0 - * - Chromium version 88.0.4298.0 - * - * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Library_nodejs_puppeteer.html#CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-3.1 - * @deprecated Use the latest version instead - */ -Runtime.SYNTHETICS_NODEJS_PUPPETEER_3_1 = new Runtime('syn-nodejs-puppeteer-3.1', RuntimeFamily.NODEJS); -/** - * **Deprecated by AWS Synthetics. You can't create canaries with deprecated runtimes.** - * - * `syn-nodejs-puppeteer-3.2` includes the following: - * - Lambda runtime Node.js 12.x - * - Puppeteer-core version 5.5.0 - * - Chromium version 88.0.4298.0 - * - * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Library_nodejs_puppeteer.html#CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-3.2 - * @deprecated Use the latest version instead - */ -Runtime.SYNTHETICS_NODEJS_PUPPETEER_3_2 = new Runtime('syn-nodejs-puppeteer-3.2', RuntimeFamily.NODEJS); -/** - * `syn-nodejs-puppeteer-3.3` includes the following: - * **Deprecated by AWS Synthetics. You can't create canaries with deprecated runtimes.** - * - * - Lambda runtime Node.js 12.x - * - Puppeteer-core version 5.5.0 - * - Chromium version 88.0.4298.0 - * - * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Library_nodejs_puppeteer.html#CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-3.3 - * @deprecated Use the latest version instead - */ -Runtime.SYNTHETICS_NODEJS_PUPPETEER_3_3 = new Runtime('syn-nodejs-puppeteer-3.3', RuntimeFamily.NODEJS); -/** - * **Deprecated by AWS Synthetics. You can't create canaries with deprecated runtimes.** - * - * `syn-nodejs-puppeteer-3.4` includes the following: - * - Lambda runtime Node.js 12.x - * - Puppeteer-core version 5.5.0 - * - Chromium version 88.0.4298.0 - * - * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Library_nodejs_puppeteer.html#CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-3.4 - * @deprecated Use the latest version instead - */ -Runtime.SYNTHETICS_NODEJS_PUPPETEER_3_4 = new Runtime('syn-nodejs-puppeteer-3.4', RuntimeFamily.NODEJS); -/** - * `syn-nodejs-puppeteer-3.5` includes the following: - * - Lambda runtime Node.js 14.x - * - Puppeteer-core version 10.1.0 - * - Chromium version 92.0.4512 - * - * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Library_nodejs_puppeteer.html#CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-3.5 - */ -Runtime.SYNTHETICS_NODEJS_PUPPETEER_3_5 = new Runtime('syn-nodejs-puppeteer-3.5', RuntimeFamily.NODEJS); -/** - * `syn-nodejs-puppeteer-3.6` includes the following: - * - Lambda runtime Node.js 14.x - * - Puppeteer-core version 10.1.0 - * - Chromium version 92.0.4512 - * - * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Library_nodejs_puppeteer.html#CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-3.6 - */ -Runtime.SYNTHETICS_NODEJS_PUPPETEER_3_6 = new Runtime('syn-nodejs-puppeteer-3.6', RuntimeFamily.NODEJS); -/** - * `syn-nodejs-puppeteer-3.7` includes the following: - * - Lambda runtime Node.js 14.x - * - Puppeteer-core version 10.1.0 - * - Chromium version 92.0.4512 - * - * New Features: - * - **Logging enhancement**: The canary will upload logs to Amazon S3 even if it times out or crashes. - * - **Lambda layer size reduced**: The size of the Lambda layer used for canaries is reduced by 34%. - * - * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Library_nodejs_puppeteer.html#CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-3.7 - */ -Runtime.SYNTHETICS_NODEJS_PUPPETEER_3_7 = new Runtime('syn-nodejs-puppeteer-3.7', RuntimeFamily.NODEJS); -/** - * `syn-nodejs-puppeteer-3.8` includes the following: - * - Lambda runtime Node.js 14.x - * - Puppeteer-core version 10.1.0 - * - Chromium version 92.0.4512 - * - * New Features: - * - **Profile cleanup**: Chromium profiles are now cleaned up after each canary run. - * - * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Library_nodejs_puppeteer.html#CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-3.8 - */ -Runtime.SYNTHETICS_NODEJS_PUPPETEER_3_8 = new Runtime('syn-nodejs-puppeteer-3.8', RuntimeFamily.NODEJS); -/** - * `syn-nodejs-puppeteer-3.9` includes the following: - * - * - Lambda runtime Node.js 14.x - * - Puppeteer-core version 5.5.0 - * - Chromium version 92.0.4512 - * - * New Features: - * - **Dependency upgrades**: Upgrades some third-party dependency packages. - * - * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Library_nodejs_puppeteer.html#CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-3.9 - */ -Runtime.SYNTHETICS_NODEJS_PUPPETEER_3_9 = new Runtime('syn-nodejs-puppeteer-3.9', RuntimeFamily.NODEJS); -/** - * `syn-nodejs-puppeteer-4.0` includes the following: - * - Lambda runtime Node.js 16.x - * - Puppeteer-core version 5.5.0 - * - Chromium version 92.0.4512 - * - * New Features: - * - **Dependency upgrades**: The Node.js dependency is updated to 16.x. - * - * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Library_nodejs_puppeteer.html#CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-4.0 - */ -Runtime.SYNTHETICS_NODEJS_PUPPETEER_4_0 = new Runtime('syn-nodejs-puppeteer-4.0', RuntimeFamily.NODEJS); -/** - * `syn-nodejs-puppeteer-5.0` includes the following: - * - Lambda runtime Node.js 16.x - * - Puppeteer-core version 19.7.0 - * - Chromium version 111.0.5563.146 - * - * New Features: - * - **Dependency upgrade**: The Puppeteer-core version is updated to 19.7.0. The Chromium version is upgraded to 111.0.5563.146. - * - * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Library_nodejs_puppeteer.html#CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-5.0 - */ -Runtime.SYNTHETICS_NODEJS_PUPPETEER_5_0 = new Runtime('syn-nodejs-puppeteer-5.0', RuntimeFamily.NODEJS); -/** - * `syn-nodejs-puppeteer-5.1` includes the following: - * - Lambda runtime Node.js 16.x - * - Puppeteer-core version 19.7.0 - * - Chromium version 111.0.5563.146 - * - * Bug fixes: - * - **Bug fix**: This runtime fixes a bug in `syn-nodejs-puppeteer-5.0` where the HAR files created by the canaries were missing request headers. - * - * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Library_nodejs_puppeteer.html#CloudWatch_Synthetics_runtimeversion-nodejs-puppeteer-5.1 - */ -Runtime.SYNTHETICS_NODEJS_PUPPETEER_5_1 = new Runtime('syn-nodejs-puppeteer-5.1', RuntimeFamily.NODEJS); -/** - * `syn-python-selenium-1.0` includes the following: - * - Lambda runtime Python 3.8 - * - Selenium version 3.141.0 - * - Chromium version 83.0.4103.0 - * - * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Library_python_selenium.html#CloudWatch_Synthetics_runtimeversion-syn-python-selenium-1.0 - */ -Runtime.SYNTHETICS_PYTHON_SELENIUM_1_0 = new Runtime('syn-python-selenium-1.0', RuntimeFamily.PYTHON); -/** - * `syn-python-selenium-1.1` includes the following: - * - Lambda runtime Python 3.8 - * - Selenium version 3.141.0 - * - Chromium version 83.0.4103.0 - * - * New Features: - * - **Custom handler function**: You can now use a custom handler function for your canary scripts. - * - **Configuration options for adding metrics and step failure configurations**: These options were already available in runtimes for Node.js canaries. - * - **Custom arguments in Chrome**: You can now open a browser in incognito mode or pass in proxy server configuration. - * - **Cross-Region artifact buckets**: A canary can store its artifacts in an Amazon S3 bucket in a different Region. - * - * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Library_python_selenium.html#CloudWatch_Synthetics_runtimeversion-syn-python-selenium-1.1 - */ -Runtime.SYNTHETICS_PYTHON_SELENIUM_1_1 = new Runtime('syn-python-selenium-1.1', RuntimeFamily.PYTHON); -/** - * `syn-python-selenium-1.2` includes the following: - * - Lambda runtime Python 3.8 - * - Selenium version 3.141.0 - * - Chromium version 92.0.4512.0 - * - * New Features: - * - **Updated dependencies**: The only new features in this runtime are the updated dependencies. - * - * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Library_python_selenium.html#CloudWatch_Synthetics_runtimeversion-syn-python-selenium-1.2 - */ -Runtime.SYNTHETICS_PYTHON_SELENIUM_1_2 = new Runtime('syn-python-selenium-1.2', RuntimeFamily.PYTHON); -/** - * `syn-python-selenium-1.3` includes the following: - * - Lambda runtime Python 3.8 - * - Selenium version 3.141.0 - * - Chromium version 92.0.4512.0 - * - * New Features: - * - **More precise timestamps**: The start time and stop time of canary runs are now precise to the millisecond. - * - * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Library_python_selenium.html#CloudWatch_Synthetics_runtimeversion-syn-python-selenium-1.3 - */ -Runtime.SYNTHETICS_PYTHON_SELENIUM_1_3 = new Runtime('syn-python-selenium-1.3', RuntimeFamily.PYTHON); -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInJ1bnRpbWUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUE7O0dBRUc7QUFDSCxJQUFZLGFBZVg7QUFmRCxXQUFZLGFBQWE7SUFDdkI7O09BRUc7SUFDSCxxREFBTSxDQUFBO0lBRU47O09BRUc7SUFDSCxxREFBTSxDQUFBO0lBRU47O09BRUc7SUFDSCxtREFBSyxDQUFBO0FBQ1AsQ0FBQyxFQWZXLGFBQWEsNkJBQWIsYUFBYSxRQWV4QjtBQUVEOztHQUVHO0FBQ0gsTUFBYSxPQUFPO0lBaVJsQjs7O1FBR0k7SUFDSixZQUFtQyxJQUFZLEVBQWtCLE1BQXFCO1FBQW5ELFNBQUksR0FBSixJQUFJLENBQVE7UUFBa0IsV0FBTSxHQUFOLE1BQU0sQ0FBZTs7Ozs7OzsrQ0FyUjNFLE9BQU87Ozs7S0FzUmpCOztBQXRSSCwwQkF1UkM7OztBQXRSQzs7Ozs7Ozs7Ozs7OztHQWFHO0FBQ29CLHNCQUFjLEdBQUcsSUFBSSxPQUFPLENBQUMsU0FBUyxFQUFFLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUVyRjs7Ozs7Ozs7OztHQVVHO0FBQ29CLDZCQUFxQixHQUFHLElBQUksT0FBTyxDQUFDLGdCQUFnQixFQUFFLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUVuRzs7Ozs7Ozs7OztHQVVHO0FBQ29CLDZCQUFxQixHQUFHLElBQUksT0FBTyxDQUFDLGdCQUFnQixFQUFFLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUVuRzs7Ozs7Ozs7OztHQVVHO0FBQ29CLDZCQUFxQixHQUFHLElBQUksT0FBTyxDQUFDLGdCQUFnQixFQUFFLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUVuRzs7Ozs7Ozs7OztHQVVHO0FBQ29CLHVDQUErQixHQUFHLElBQUksT0FBTyxDQUFDLDBCQUEwQixFQUFFLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUV2SDs7Ozs7Ozs7OztHQVVHO0FBQ29CLHVDQUErQixHQUFHLElBQUksT0FBTyxDQUFDLDBCQUEwQixFQUFFLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUV2SDs7Ozs7Ozs7OztHQVVHO0FBQ29CLHVDQUErQixHQUFHLElBQUksT0FBTyxDQUFDLDBCQUEwQixFQUFFLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUV2SDs7Ozs7Ozs7OztHQVVHO0FBQ29CLHVDQUErQixHQUFHLElBQUksT0FBTyxDQUFDLDBCQUEwQixFQUFFLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUV2SDs7Ozs7Ozs7OztHQVVHO0FBQ29CLHVDQUErQixHQUFHLElBQUksT0FBTyxDQUFDLDBCQUEwQixFQUFFLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUV2SDs7Ozs7OztHQU9HO0FBQ29CLHVDQUErQixHQUFHLElBQUksT0FBTyxDQUFDLDBCQUEwQixFQUFFLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUV2SDs7Ozs7OztHQU9HO0FBQ29CLHVDQUErQixHQUFHLElBQUksT0FBTyxDQUFDLDBCQUEwQixFQUFFLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUV2SDs7Ozs7Ozs7Ozs7R0FXRztBQUNvQix1Q0FBK0IsR0FBRyxJQUFJLE9BQU8sQ0FBQywwQkFBMEIsRUFBRSxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7QUFFdkg7Ozs7Ozs7Ozs7R0FVRztBQUNvQix1Q0FBK0IsR0FBRyxJQUFJLE9BQU8sQ0FBQywwQkFBMEIsRUFBRSxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7QUFFdkg7Ozs7Ozs7Ozs7O0dBV0c7QUFDb0IsdUNBQStCLEdBQUcsSUFBSSxPQUFPLENBQUMsMEJBQTBCLEVBQUUsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBRXZIOzs7Ozs7Ozs7O0dBVUc7QUFDb0IsdUNBQStCLEdBQUcsSUFBSSxPQUFPLENBQUMsMEJBQTBCLEVBQUUsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBRXZIOzs7Ozs7Ozs7O0dBVUc7QUFDb0IsdUNBQStCLEdBQUcsSUFBSSxPQUFPLENBQUMsMEJBQTBCLEVBQUUsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBRXZIOzs7Ozs7Ozs7O0dBVUc7QUFDb0IsdUNBQStCLEdBQUcsSUFBSSxPQUFPLENBQUMsMEJBQTBCLEVBQUUsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBRXZIOzs7Ozs7O0dBT0c7QUFDb0Isc0NBQThCLEdBQUcsSUFBSSxPQUFPLENBQUMseUJBQXlCLEVBQUUsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBRXJIOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFDb0Isc0NBQThCLEdBQUcsSUFBSSxPQUFPLENBQUMseUJBQXlCLEVBQUUsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBRXJIOzs7Ozs7Ozs7O0dBVUc7QUFDb0Isc0NBQThCLEdBQUcsSUFBSSxPQUFPLENBQUMseUJBQXlCLEVBQUUsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBRXJIOzs7Ozs7Ozs7O0dBVUc7QUFDb0Isc0NBQThCLEdBQUcsSUFBSSxPQUFPLENBQUMseUJBQXlCLEVBQUUsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBBbGwga25vd24gTGFtYmRhIHJ1bnRpbWUgZmFtaWxpZXMuXG4gKi9cbmV4cG9ydCBlbnVtIFJ1bnRpbWVGYW1pbHkge1xuICAvKipcbiAgICogQWxsIExhbWJkYSBydW50aW1lcyB0aGF0IGRlcGVuZCBvbiBOb2RlLmpzLlxuICAgKi9cbiAgTk9ERUpTLFxuXG4gIC8qKlxuICAgKiBBbGwgbGFtYmRhIHJ1bnRpbWVzIHRoYXQgZGVwZW5kIG9uIFB5dGhvbi5cbiAgICovXG4gIFBZVEhPTixcblxuICAvKipcbiAgICogQW55IGZ1dHVyZSBydW50aW1lIGZhbWlseS5cbiAgICovXG4gIE9USEVSLFxufVxuXG4vKipcbiAqIFJ1bnRpbWUgb3B0aW9ucyBmb3IgYSBjYW5hcnlcbiAqL1xuZXhwb3J0IGNsYXNzIFJ1bnRpbWUge1xuICAvKipcbiAgICogKipEZXByZWNhdGVkIGJ5IEFXUyBTeW50aGV0aWNzLiBZb3UgY2FuJ3QgY3JlYXRlIGNhbmFyaWVzIHdpdGggZGVwcmVjYXRlZCBydW50aW1lcy4qKlxuICAgKlxuICAgKiBgc3luLTEuMGAgaW5jbHVkZXMgdGhlIGZvbGxvd2luZzpcbiAgICpcbiAgICogLSBTeW50aGV0aWNzIGxpYnJhcnkgMS4wXG4gICAqIC0gU3ludGhldGljcyBoYW5kbGVyIGNvZGUgMS4wXG4gICAqIC0gTGFtYmRhIHJ1bnRpbWUgTm9kZS5qcyAxMC54XG4gICAqIC0gUHVwcGV0ZWVyLWNvcmUgdmVyc2lvbiAxLjE0LjBcbiAgICogLSBUaGUgQ2hyb21pdW0gdmVyc2lvbiB0aGF0IG1hdGNoZXMgUHVwcGV0ZWVyLWNvcmUgMS4xNC4wXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkV2F0Y2gvbGF0ZXN0L21vbml0b3JpbmcvQ2xvdWRXYXRjaF9TeW50aGV0aWNzX0xpYnJhcnlfbm9kZWpzX3B1cHBldGVlci5odG1sI0Nsb3VkV2F0Y2hfU3ludGhldGljc19ydW50aW1ldmVyc2lvbi0xLjBcbiAgICogQGRlcHJlY2F0ZWQgVXNlIHRoZSBsYXRlc3QgdmVyc2lvbiBpbnN0ZWFkXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFNZTlRIRVRJQ1NfMV8wID0gbmV3IFJ1bnRpbWUoJ3N5bi0xLjAnLCBSdW50aW1lRmFtaWx5Lk5PREVKUyk7XG5cbiAgLyoqXG4gICAqICoqRGVwcmVjYXRlZCBieSBBV1MgU3ludGhldGljcy4gWW91IGNhbid0IGNyZWF0ZSBjYW5hcmllcyB3aXRoIGRlcHJlY2F0ZWQgcnVudGltZXMuKipcbiAgICpcbiAgICogYHN5bi1ub2RlanMtMi4wYCBpbmNsdWRlcyB0aGUgZm9sbG93aW5nOlxuICAgKiAtIExhbWJkYSBydW50aW1lIE5vZGUuanMgMTAueFxuICAgKiAtIFB1cHBldGVlci1jb3JlIHZlcnNpb24gMy4zLjBcbiAgICogLSBDaHJvbWl1bSB2ZXJzaW9uIDgzLjAuNDEwMy4wXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkV2F0Y2gvbGF0ZXN0L21vbml0b3JpbmcvQ2xvdWRXYXRjaF9TeW50aGV0aWNzX0xpYnJhcnlfbm9kZWpzX3B1cHBldGVlci5odG1sI0Nsb3VkV2F0Y2hfU3ludGhldGljc19ydW50aW1ldmVyc2lvbi0yLjBcbiAgICogQGRlcHJlY2F0ZWQgVXNlIHRoZSBsYXRlc3QgdmVyc2lvbiBpbnN0ZWFkXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFNZTlRIRVRJQ1NfTk9ERUpTXzJfMCA9IG5ldyBSdW50aW1lKCdzeW4tbm9kZWpzLTIuMCcsIFJ1bnRpbWVGYW1pbHkuTk9ERUpTKTtcblxuICAvKipcbiAgICogKipEZXByZWNhdGVkIGJ5IEFXUyBTeW50aGV0aWNzLiBZb3UgY2FuJ3QgY3JlYXRlIGNhbmFyaWVzIHdpdGggZGVwcmVjYXRlZCBydW50aW1lcy4qKlxuICAgKlxuICAgKiBgc3luLW5vZGVqcy0yLjFgIGluY2x1ZGVzIHRoZSBmb2xsb3dpbmc6XG4gICAqIC0gTGFtYmRhIHJ1bnRpbWUgTm9kZS5qcyAxMC54XG4gICAqIC0gUHVwcGV0ZWVyLWNvcmUgdmVyc2lvbiAzLjMuMFxuICAgKiAtIENocm9taXVtIHZlcnNpb24gODMuMC40MTAzLjBcbiAgICpcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRXYXRjaC9sYXRlc3QvbW9uaXRvcmluZy9DbG91ZFdhdGNoX1N5bnRoZXRpY3NfTGlicmFyeV9ub2RlanNfcHVwcGV0ZWVyLmh0bWwjQ2xvdWRXYXRjaF9TeW50aGV0aWNzX3J1bnRpbWV2ZXJzaW9uLTIuMVxuICAgKiBAZGVwcmVjYXRlZCBVc2UgdGhlIGxhdGVzdCB2ZXJzaW9uIGluc3RlYWRcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgU1lOVEhFVElDU19OT0RFSlNfMl8xID0gbmV3IFJ1bnRpbWUoJ3N5bi1ub2RlanMtMi4xJywgUnVudGltZUZhbWlseS5OT0RFSlMpO1xuXG4gIC8qKlxuICAgKiAqKkRlcHJlY2F0ZWQgYnkgQVdTIFN5bnRoZXRpY3MuIFlvdSBjYW4ndCBjcmVhdGUgY2FuYXJpZXMgd2l0aCBkZXByZWNhdGVkIHJ1bnRpbWVzLioqXG4gICAqXG4gICAqIGBzeW4tbm9kZWpzLTIuMmAgaW5jbHVkZXMgdGhlIGZvbGxvd2luZzpcbiAgICogLSBMYW1iZGEgcnVudGltZSBOb2RlLmpzIDEwLnhcbiAgICogLSBQdXBwZXRlZXItY29yZSB2ZXJzaW9uIDMuMy4wXG4gICAqIC0gQ2hyb21pdW0gdmVyc2lvbiA4My4wLjQxMDMuMFxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZFdhdGNoL2xhdGVzdC9tb25pdG9yaW5nL0Nsb3VkV2F0Y2hfU3ludGhldGljc19MaWJyYXJ5X25vZGVqc19wdXBwZXRlZXIuaHRtbCNDbG91ZFdhdGNoX1N5bnRoZXRpY3NfcnVudGltZXZlcnNpb24tMi4yXG4gICAqIEBkZXByZWNhdGVkIFVzZSB0aGUgbGF0ZXN0IHZlcnNpb24gaW5zdGVhZFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBTWU5USEVUSUNTX05PREVKU18yXzIgPSBuZXcgUnVudGltZSgnc3luLW5vZGVqcy0yLjInLCBSdW50aW1lRmFtaWx5Lk5PREVKUyk7XG5cbiAgLyoqXG4gICAqICoqRGVwcmVjYXRlZCBieSBBV1MgU3ludGhldGljcy4gWW91IGNhbid0IGNyZWF0ZSBjYW5hcmllcyB3aXRoIGRlcHJlY2F0ZWQgcnVudGltZXMuKipcbiAgICpcbiAgICogYHN5bi1ub2RlanMtcHVwcGV0ZWVyLTMuMGAgaW5jbHVkZXMgdGhlIGZvbGxvd2luZzpcbiAgICogLSBMYW1iZGEgcnVudGltZSBOb2RlLmpzIDEyLnhcbiAgICogLSBQdXBwZXRlZXItY29yZSB2ZXJzaW9uIDUuNS4wXG4gICAqIC0gQ2hyb21pdW0gdmVyc2lvbiA4OC4wLjQyOTguMFxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZFdhdGNoL2xhdGVzdC9tb25pdG9yaW5nL0Nsb3VkV2F0Y2hfU3ludGhldGljc19MaWJyYXJ5X25vZGVqc19wdXBwZXRlZXIuaHRtbCNDbG91ZFdhdGNoX1N5bnRoZXRpY3NfcnVudGltZXZlcnNpb24tbm9kZWpzLXB1cHBldGVlci0zLjBcbiAgICogQGRlcHJlY2F0ZWQgVXNlIHRoZSBsYXRlc3QgdmVyc2lvbiBpbnN0ZWFkXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFNZTlRIRVRJQ1NfTk9ERUpTX1BVUFBFVEVFUl8zXzAgPSBuZXcgUnVudGltZSgnc3luLW5vZGVqcy1wdXBwZXRlZXItMy4wJywgUnVudGltZUZhbWlseS5OT0RFSlMpO1xuXG4gIC8qKlxuICAgKiAqKkRlcHJlY2F0ZWQgYnkgQVdTIFN5bnRoZXRpY3MuIFlvdSBjYW4ndCBjcmVhdGUgY2FuYXJpZXMgd2l0aCBkZXByZWNhdGVkIHJ1bnRpbWVzLioqXG4gICAqXG4gICAqIGBzeW4tbm9kZWpzLXB1cHBldGVlci0zLjFgIGluY2x1ZGVzIHRoZSBmb2xsb3dpbmc6XG4gICAqIC0gTGFtYmRhIHJ1bnRpbWUgTm9kZS5qcyAxMi54XG4gICAqIC0gUHVwcGV0ZWVyLWNvcmUgdmVyc2lvbiA1LjUuMFxuICAgKiAtIENocm9taXVtIHZlcnNpb24gODguMC40Mjk4LjBcbiAgICpcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRXYXRjaC9sYXRlc3QvbW9uaXRvcmluZy9DbG91ZFdhdGNoX1N5bnRoZXRpY3NfTGlicmFyeV9ub2RlanNfcHVwcGV0ZWVyLmh0bWwjQ2xvdWRXYXRjaF9TeW50aGV0aWNzX3J1bnRpbWV2ZXJzaW9uLW5vZGVqcy1wdXBwZXRlZXItMy4xXG4gICAqIEBkZXByZWNhdGVkIFVzZSB0aGUgbGF0ZXN0IHZlcnNpb24gaW5zdGVhZFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBTWU5USEVUSUNTX05PREVKU19QVVBQRVRFRVJfM18xID0gbmV3IFJ1bnRpbWUoJ3N5bi1ub2RlanMtcHVwcGV0ZWVyLTMuMScsIFJ1bnRpbWVGYW1pbHkuTk9ERUpTKTtcblxuICAvKipcbiAgICogKipEZXByZWNhdGVkIGJ5IEFXUyBTeW50aGV0aWNzLiBZb3UgY2FuJ3QgY3JlYXRlIGNhbmFyaWVzIHdpdGggZGVwcmVjYXRlZCBydW50aW1lcy4qKlxuICAgKlxuICAgKiBgc3luLW5vZGVqcy1wdXBwZXRlZXItMy4yYCBpbmNsdWRlcyB0aGUgZm9sbG93aW5nOlxuICAgKiAtIExhbWJkYSBydW50aW1lIE5vZGUuanMgMTIueFxuICAgKiAtIFB1cHBldGVlci1jb3JlIHZlcnNpb24gNS41LjBcbiAgICogLSBDaHJvbWl1bSB2ZXJzaW9uIDg4LjAuNDI5OC4wXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkV2F0Y2gvbGF0ZXN0L21vbml0b3JpbmcvQ2xvdWRXYXRjaF9TeW50aGV0aWNzX0xpYnJhcnlfbm9kZWpzX3B1cHBldGVlci5odG1sI0Nsb3VkV2F0Y2hfU3ludGhldGljc19ydW50aW1ldmVyc2lvbi1ub2RlanMtcHVwcGV0ZWVyLTMuMlxuICAgKiBAZGVwcmVjYXRlZCBVc2UgdGhlIGxhdGVzdCB2ZXJzaW9uIGluc3RlYWRcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgU1lOVEhFVElDU19OT0RFSlNfUFVQUEVURUVSXzNfMiA9IG5ldyBSdW50aW1lKCdzeW4tbm9kZWpzLXB1cHBldGVlci0zLjInLCBSdW50aW1lRmFtaWx5Lk5PREVKUyk7XG5cbiAgLyoqXG4gICAqIGBzeW4tbm9kZWpzLXB1cHBldGVlci0zLjNgIGluY2x1ZGVzIHRoZSBmb2xsb3dpbmc6XG4gICAqICoqRGVwcmVjYXRlZCBieSBBV1MgU3ludGhldGljcy4gWW91IGNhbid0IGNyZWF0ZSBjYW5hcmllcyB3aXRoIGRlcHJlY2F0ZWQgcnVudGltZXMuKipcbiAgICpcbiAgICogLSBMYW1iZGEgcnVudGltZSBOb2RlLmpzIDEyLnhcbiAgICogLSBQdXBwZXRlZXItY29yZSB2ZXJzaW9uIDUuNS4wXG4gICAqIC0gQ2hyb21pdW0gdmVyc2lvbiA4OC4wLjQyOTguMFxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZFdhdGNoL2xhdGVzdC9tb25pdG9yaW5nL0Nsb3VkV2F0Y2hfU3ludGhldGljc19MaWJyYXJ5X25vZGVqc19wdXBwZXRlZXIuaHRtbCNDbG91ZFdhdGNoX1N5bnRoZXRpY3NfcnVudGltZXZlcnNpb24tbm9kZWpzLXB1cHBldGVlci0zLjNcbiAgICogQGRlcHJlY2F0ZWQgVXNlIHRoZSBsYXRlc3QgdmVyc2lvbiBpbnN0ZWFkXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFNZTlRIRVRJQ1NfTk9ERUpTX1BVUFBFVEVFUl8zXzMgPSBuZXcgUnVudGltZSgnc3luLW5vZGVqcy1wdXBwZXRlZXItMy4zJywgUnVudGltZUZhbWlseS5OT0RFSlMpO1xuXG4gIC8qKlxuICAgKiAqKkRlcHJlY2F0ZWQgYnkgQVdTIFN5bnRoZXRpY3MuIFlvdSBjYW4ndCBjcmVhdGUgY2FuYXJpZXMgd2l0aCBkZXByZWNhdGVkIHJ1bnRpbWVzLioqXG4gICAqXG4gICAqIGBzeW4tbm9kZWpzLXB1cHBldGVlci0zLjRgIGluY2x1ZGVzIHRoZSBmb2xsb3dpbmc6XG4gICAqIC0gTGFtYmRhIHJ1bnRpbWUgTm9kZS5qcyAxMi54XG4gICAqIC0gUHVwcGV0ZWVyLWNvcmUgdmVyc2lvbiA1LjUuMFxuICAgKiAtIENocm9taXVtIHZlcnNpb24gODguMC40Mjk4LjBcbiAgICpcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRXYXRjaC9sYXRlc3QvbW9uaXRvcmluZy9DbG91ZFdhdGNoX1N5bnRoZXRpY3NfTGlicmFyeV9ub2RlanNfcHVwcGV0ZWVyLmh0bWwjQ2xvdWRXYXRjaF9TeW50aGV0aWNzX3J1bnRpbWV2ZXJzaW9uLW5vZGVqcy1wdXBwZXRlZXItMy40XG4gICAqIEBkZXByZWNhdGVkIFVzZSB0aGUgbGF0ZXN0IHZlcnNpb24gaW5zdGVhZFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBTWU5USEVUSUNTX05PREVKU19QVVBQRVRFRVJfM180ID0gbmV3IFJ1bnRpbWUoJ3N5bi1ub2RlanMtcHVwcGV0ZWVyLTMuNCcsIFJ1bnRpbWVGYW1pbHkuTk9ERUpTKTtcblxuICAvKipcbiAgICogYHN5bi1ub2RlanMtcHVwcGV0ZWVyLTMuNWAgaW5jbHVkZXMgdGhlIGZvbGxvd2luZzpcbiAgICogLSBMYW1iZGEgcnVudGltZSBOb2RlLmpzIDE0LnhcbiAgICogLSBQdXBwZXRlZXItY29yZSB2ZXJzaW9uIDEwLjEuMFxuICAgKiAtIENocm9taXVtIHZlcnNpb24gOTIuMC40NTEyXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkV2F0Y2gvbGF0ZXN0L21vbml0b3JpbmcvQ2xvdWRXYXRjaF9TeW50aGV0aWNzX0xpYnJhcnlfbm9kZWpzX3B1cHBldGVlci5odG1sI0Nsb3VkV2F0Y2hfU3ludGhldGljc19ydW50aW1ldmVyc2lvbi1ub2RlanMtcHVwcGV0ZWVyLTMuNVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBTWU5USEVUSUNTX05PREVKU19QVVBQRVRFRVJfM181ID0gbmV3IFJ1bnRpbWUoJ3N5bi1ub2RlanMtcHVwcGV0ZWVyLTMuNScsIFJ1bnRpbWVGYW1pbHkuTk9ERUpTKTtcblxuICAvKipcbiAgICogYHN5bi1ub2RlanMtcHVwcGV0ZWVyLTMuNmAgaW5jbHVkZXMgdGhlIGZvbGxvd2luZzpcbiAgICogLSBMYW1iZGEgcnVudGltZSBOb2RlLmpzIDE0LnhcbiAgICogLSBQdXBwZXRlZXItY29yZSB2ZXJzaW9uIDEwLjEuMFxuICAgKiAtIENocm9taXVtIHZlcnNpb24gOTIuMC40NTEyXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkV2F0Y2gvbGF0ZXN0L21vbml0b3JpbmcvQ2xvdWRXYXRjaF9TeW50aGV0aWNzX0xpYnJhcnlfbm9kZWpzX3B1cHBldGVlci5odG1sI0Nsb3VkV2F0Y2hfU3ludGhldGljc19ydW50aW1ldmVyc2lvbi1ub2RlanMtcHVwcGV0ZWVyLTMuNlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBTWU5USEVUSUNTX05PREVKU19QVVBQRVRFRVJfM182ID0gbmV3IFJ1bnRpbWUoJ3N5bi1ub2RlanMtcHVwcGV0ZWVyLTMuNicsIFJ1bnRpbWVGYW1pbHkuTk9ERUpTKTtcblxuICAvKipcbiAgICogYHN5bi1ub2RlanMtcHVwcGV0ZWVyLTMuN2AgaW5jbHVkZXMgdGhlIGZvbGxvd2luZzpcbiAgICogLSBMYW1iZGEgcnVudGltZSBOb2RlLmpzIDE0LnhcbiAgICogLSBQdXBwZXRlZXItY29yZSB2ZXJzaW9uIDEwLjEuMFxuICAgKiAtIENocm9taXVtIHZlcnNpb24gOTIuMC40NTEyXG4gICAqXG4gICAqIE5ldyBGZWF0dXJlczpcbiAgICogLSAqKkxvZ2dpbmcgZW5oYW5jZW1lbnQqKjogVGhlIGNhbmFyeSB3aWxsIHVwbG9hZCBsb2dzIHRvIEFtYXpvbiBTMyBldmVuIGlmIGl0IHRpbWVzIG91dCBvciBjcmFzaGVzLlxuICAgKiAtICoqTGFtYmRhIGxheWVyIHNpemUgcmVkdWNlZCoqOiBUaGUgc2l6ZSBvZiB0aGUgTGFtYmRhIGxheWVyIHVzZWQgZm9yIGNhbmFyaWVzIGlzIHJlZHVjZWQgYnkgMzQlLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZFdhdGNoL2xhdGVzdC9tb25pdG9yaW5nL0Nsb3VkV2F0Y2hfU3ludGhldGljc19MaWJyYXJ5X25vZGVqc19wdXBwZXRlZXIuaHRtbCNDbG91ZFdhdGNoX1N5bnRoZXRpY3NfcnVudGltZXZlcnNpb24tbm9kZWpzLXB1cHBldGVlci0zLjdcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgU1lOVEhFVElDU19OT0RFSlNfUFVQUEVURUVSXzNfNyA9IG5ldyBSdW50aW1lKCdzeW4tbm9kZWpzLXB1cHBldGVlci0zLjcnLCBSdW50aW1lRmFtaWx5Lk5PREVKUyk7XG5cbiAgLyoqXG4gICAqIGBzeW4tbm9kZWpzLXB1cHBldGVlci0zLjhgIGluY2x1ZGVzIHRoZSBmb2xsb3dpbmc6XG4gICAqIC0gTGFtYmRhIHJ1bnRpbWUgTm9kZS5qcyAxNC54XG4gICAqIC0gUHVwcGV0ZWVyLWNvcmUgdmVyc2lvbiAxMC4xLjBcbiAgICogLSBDaHJvbWl1bSB2ZXJzaW9uIDkyLjAuNDUxMlxuICAgKlxuICAgKiBOZXcgRmVhdHVyZXM6XG4gICAqIC0gKipQcm9maWxlIGNsZWFudXAqKjogQ2hyb21pdW0gcHJvZmlsZXMgYXJlIG5vdyBjbGVhbmVkIHVwIGFmdGVyIGVhY2ggY2FuYXJ5IHJ1bi5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRXYXRjaC9sYXRlc3QvbW9uaXRvcmluZy9DbG91ZFdhdGNoX1N5bnRoZXRpY3NfTGlicmFyeV9ub2RlanNfcHVwcGV0ZWVyLmh0bWwjQ2xvdWRXYXRjaF9TeW50aGV0aWNzX3J1bnRpbWV2ZXJzaW9uLW5vZGVqcy1wdXBwZXRlZXItMy44XG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFNZTlRIRVRJQ1NfTk9ERUpTX1BVUFBFVEVFUl8zXzggPSBuZXcgUnVudGltZSgnc3luLW5vZGVqcy1wdXBwZXRlZXItMy44JywgUnVudGltZUZhbWlseS5OT0RFSlMpO1xuXG4gIC8qKlxuICAgKiBgc3luLW5vZGVqcy1wdXBwZXRlZXItMy45YCBpbmNsdWRlcyB0aGUgZm9sbG93aW5nOlxuICAgKlxuICAgKiAtIExhbWJkYSBydW50aW1lIE5vZGUuanMgMTQueFxuICAgKiAtIFB1cHBldGVlci1jb3JlIHZlcnNpb24gNS41LjBcbiAgICogLSBDaHJvbWl1bSB2ZXJzaW9uIDkyLjAuNDUxMlxuICAgKlxuICAgKiBOZXcgRmVhdHVyZXM6XG4gICAqIC0gKipEZXBlbmRlbmN5IHVwZ3JhZGVzKio6IFVwZ3JhZGVzIHNvbWUgdGhpcmQtcGFydHkgZGVwZW5kZW5jeSBwYWNrYWdlcy5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRXYXRjaC9sYXRlc3QvbW9uaXRvcmluZy9DbG91ZFdhdGNoX1N5bnRoZXRpY3NfTGlicmFyeV9ub2RlanNfcHVwcGV0ZWVyLmh0bWwjQ2xvdWRXYXRjaF9TeW50aGV0aWNzX3J1bnRpbWV2ZXJzaW9uLW5vZGVqcy1wdXBwZXRlZXItMy45XG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFNZTlRIRVRJQ1NfTk9ERUpTX1BVUFBFVEVFUl8zXzkgPSBuZXcgUnVudGltZSgnc3luLW5vZGVqcy1wdXBwZXRlZXItMy45JywgUnVudGltZUZhbWlseS5OT0RFSlMpO1xuXG4gIC8qKlxuICAgKiBgc3luLW5vZGVqcy1wdXBwZXRlZXItNC4wYCBpbmNsdWRlcyB0aGUgZm9sbG93aW5nOlxuICAgKiAtIExhbWJkYSBydW50aW1lIE5vZGUuanMgMTYueFxuICAgKiAtIFB1cHBldGVlci1jb3JlIHZlcnNpb24gNS41LjBcbiAgICogLSBDaHJvbWl1bSB2ZXJzaW9uIDkyLjAuNDUxMlxuICAgKlxuICAgKiBOZXcgRmVhdHVyZXM6XG4gICAqIC0gKipEZXBlbmRlbmN5IHVwZ3JhZGVzKio6IFRoZSBOb2RlLmpzIGRlcGVuZGVuY3kgaXMgdXBkYXRlZCB0byAxNi54LlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZFdhdGNoL2xhdGVzdC9tb25pdG9yaW5nL0Nsb3VkV2F0Y2hfU3ludGhldGljc19MaWJyYXJ5X25vZGVqc19wdXBwZXRlZXIuaHRtbCNDbG91ZFdhdGNoX1N5bnRoZXRpY3NfcnVudGltZXZlcnNpb24tbm9kZWpzLXB1cHBldGVlci00LjBcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgU1lOVEhFVElDU19OT0RFSlNfUFVQUEVURUVSXzRfMCA9IG5ldyBSdW50aW1lKCdzeW4tbm9kZWpzLXB1cHBldGVlci00LjAnLCBSdW50aW1lRmFtaWx5Lk5PREVKUyk7XG5cbiAgLyoqXG4gICAqIGBzeW4tbm9kZWpzLXB1cHBldGVlci01LjBgIGluY2x1ZGVzIHRoZSBmb2xsb3dpbmc6XG4gICAqIC0gTGFtYmRhIHJ1bnRpbWUgTm9kZS5qcyAxNi54XG4gICAqIC0gUHVwcGV0ZWVyLWNvcmUgdmVyc2lvbiAxOS43LjBcbiAgICogLSBDaHJvbWl1bSB2ZXJzaW9uIDExMS4wLjU1NjMuMTQ2XG4gICAqXG4gICAqIE5ldyBGZWF0dXJlczpcbiAgICogLSAqKkRlcGVuZGVuY3kgdXBncmFkZSoqOiBUaGUgUHVwcGV0ZWVyLWNvcmUgdmVyc2lvbiBpcyB1cGRhdGVkIHRvIDE5LjcuMC4gVGhlIENocm9taXVtIHZlcnNpb24gaXMgdXBncmFkZWQgdG8gMTExLjAuNTU2My4xNDYuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkV2F0Y2gvbGF0ZXN0L21vbml0b3JpbmcvQ2xvdWRXYXRjaF9TeW50aGV0aWNzX0xpYnJhcnlfbm9kZWpzX3B1cHBldGVlci5odG1sI0Nsb3VkV2F0Y2hfU3ludGhldGljc19ydW50aW1ldmVyc2lvbi1ub2RlanMtcHVwcGV0ZWVyLTUuMFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBTWU5USEVUSUNTX05PREVKU19QVVBQRVRFRVJfNV8wID0gbmV3IFJ1bnRpbWUoJ3N5bi1ub2RlanMtcHVwcGV0ZWVyLTUuMCcsIFJ1bnRpbWVGYW1pbHkuTk9ERUpTKTtcblxuICAvKipcbiAgICogYHN5bi1ub2RlanMtcHVwcGV0ZWVyLTUuMWAgaW5jbHVkZXMgdGhlIGZvbGxvd2luZzpcbiAgICogLSBMYW1iZGEgcnVudGltZSBOb2RlLmpzIDE2LnhcbiAgICogLSBQdXBwZXRlZXItY29yZSB2ZXJzaW9uIDE5LjcuMFxuICAgKiAtIENocm9taXVtIHZlcnNpb24gMTExLjAuNTU2My4xNDZcbiAgICpcbiAgICogQnVnIGZpeGVzOlxuICAgKiAtICoqQnVnIGZpeCoqOiBUaGlzIHJ1bnRpbWUgZml4ZXMgYSBidWcgaW4gYHN5bi1ub2RlanMtcHVwcGV0ZWVyLTUuMGAgd2hlcmUgdGhlIEhBUiBmaWxlcyBjcmVhdGVkIGJ5IHRoZSBjYW5hcmllcyB3ZXJlIG1pc3NpbmcgcmVxdWVzdCBoZWFkZXJzLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZFdhdGNoL2xhdGVzdC9tb25pdG9yaW5nL0Nsb3VkV2F0Y2hfU3ludGhldGljc19MaWJyYXJ5X25vZGVqc19wdXBwZXRlZXIuaHRtbCNDbG91ZFdhdGNoX1N5bnRoZXRpY3NfcnVudGltZXZlcnNpb24tbm9kZWpzLXB1cHBldGVlci01LjFcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgU1lOVEhFVElDU19OT0RFSlNfUFVQUEVURUVSXzVfMSA9IG5ldyBSdW50aW1lKCdzeW4tbm9kZWpzLXB1cHBldGVlci01LjEnLCBSdW50aW1lRmFtaWx5Lk5PREVKUyk7XG5cbiAgLyoqXG4gICAqIGBzeW4tcHl0aG9uLXNlbGVuaXVtLTEuMGAgaW5jbHVkZXMgdGhlIGZvbGxvd2luZzpcbiAgICogLSBMYW1iZGEgcnVudGltZSBQeXRob24gMy44XG4gICAqIC0gU2VsZW5pdW0gdmVyc2lvbiAzLjE0MS4wXG4gICAqIC0gQ2hyb21pdW0gdmVyc2lvbiA4My4wLjQxMDMuMFxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZFdhdGNoL2xhdGVzdC9tb25pdG9yaW5nL0Nsb3VkV2F0Y2hfU3ludGhldGljc19MaWJyYXJ5X3B5dGhvbl9zZWxlbml1bS5odG1sI0Nsb3VkV2F0Y2hfU3ludGhldGljc19ydW50aW1ldmVyc2lvbi1zeW4tcHl0aG9uLXNlbGVuaXVtLTEuMFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBTWU5USEVUSUNTX1BZVEhPTl9TRUxFTklVTV8xXzAgPSBuZXcgUnVudGltZSgnc3luLXB5dGhvbi1zZWxlbml1bS0xLjAnLCBSdW50aW1lRmFtaWx5LlBZVEhPTik7XG5cbiAgLyoqXG4gICAqIGBzeW4tcHl0aG9uLXNlbGVuaXVtLTEuMWAgaW5jbHVkZXMgdGhlIGZvbGxvd2luZzpcbiAgICogLSBMYW1iZGEgcnVudGltZSBQeXRob24gMy44XG4gICAqIC0gU2VsZW5pdW0gdmVyc2lvbiAzLjE0MS4wXG4gICAqIC0gQ2hyb21pdW0gdmVyc2lvbiA4My4wLjQxMDMuMFxuICAgKlxuICAgKiBOZXcgRmVhdHVyZXM6XG4gICAqIC0gKipDdXN0b20gaGFuZGxlciBmdW5jdGlvbioqOiBZb3UgY2FuIG5vdyB1c2UgYSBjdXN0b20gaGFuZGxlciBmdW5jdGlvbiBmb3IgeW91ciBjYW5hcnkgc2NyaXB0cy5cbiAgICogLSAqKkNvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgYWRkaW5nIG1ldHJpY3MgYW5kIHN0ZXAgZmFpbHVyZSBjb25maWd1cmF0aW9ucyoqOiBUaGVzZSBvcHRpb25zIHdlcmUgYWxyZWFkeSBhdmFpbGFibGUgaW4gcnVudGltZXMgZm9yIE5vZGUuanMgY2FuYXJpZXMuXG4gICAqIC0gKipDdXN0b20gYXJndW1lbnRzIGluIENocm9tZSoqOiBZb3UgY2FuIG5vdyBvcGVuIGEgYnJvd3NlciBpbiBpbmNvZ25pdG8gbW9kZSBvciBwYXNzIGluIHByb3h5IHNlcnZlciBjb25maWd1cmF0aW9uLlxuICAgKiAtICoqQ3Jvc3MtUmVnaW9uIGFydGlmYWN0IGJ1Y2tldHMqKjogQSBjYW5hcnkgY2FuIHN0b3JlIGl0cyBhcnRpZmFjdHMgaW4gYW4gQW1hem9uIFMzIGJ1Y2tldCBpbiBhIGRpZmZlcmVudCBSZWdpb24uXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkV2F0Y2gvbGF0ZXN0L21vbml0b3JpbmcvQ2xvdWRXYXRjaF9TeW50aGV0aWNzX0xpYnJhcnlfcHl0aG9uX3NlbGVuaXVtLmh0bWwjQ2xvdWRXYXRjaF9TeW50aGV0aWNzX3J1bnRpbWV2ZXJzaW9uLXN5bi1weXRob24tc2VsZW5pdW0tMS4xXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFNZTlRIRVRJQ1NfUFlUSE9OX1NFTEVOSVVNXzFfMSA9IG5ldyBSdW50aW1lKCdzeW4tcHl0aG9uLXNlbGVuaXVtLTEuMScsIFJ1bnRpbWVGYW1pbHkuUFlUSE9OKTtcblxuICAvKipcbiAgICogYHN5bi1weXRob24tc2VsZW5pdW0tMS4yYCBpbmNsdWRlcyB0aGUgZm9sbG93aW5nOlxuICAgKiAtIExhbWJkYSBydW50aW1lIFB5dGhvbiAzLjhcbiAgICogLSBTZWxlbml1bSB2ZXJzaW9uIDMuMTQxLjBcbiAgICogLSBDaHJvbWl1bSB2ZXJzaW9uIDkyLjAuNDUxMi4wXG4gICAqXG4gICAqIE5ldyBGZWF0dXJlczpcbiAgICogLSAqKlVwZGF0ZWQgZGVwZW5kZW5jaWVzKio6IFRoZSBvbmx5IG5ldyBmZWF0dXJlcyBpbiB0aGlzIHJ1bnRpbWUgYXJlIHRoZSB1cGRhdGVkIGRlcGVuZGVuY2llcy5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRXYXRjaC9sYXRlc3QvbW9uaXRvcmluZy9DbG91ZFdhdGNoX1N5bnRoZXRpY3NfTGlicmFyeV9weXRob25fc2VsZW5pdW0uaHRtbCNDbG91ZFdhdGNoX1N5bnRoZXRpY3NfcnVudGltZXZlcnNpb24tc3luLXB5dGhvbi1zZWxlbml1bS0xLjJcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgU1lOVEhFVElDU19QWVRIT05fU0VMRU5JVU1fMV8yID0gbmV3IFJ1bnRpbWUoJ3N5bi1weXRob24tc2VsZW5pdW0tMS4yJywgUnVudGltZUZhbWlseS5QWVRIT04pO1xuXG4gIC8qKlxuICAgKiBgc3luLXB5dGhvbi1zZWxlbml1bS0xLjNgIGluY2x1ZGVzIHRoZSBmb2xsb3dpbmc6XG4gICAqIC0gTGFtYmRhIHJ1bnRpbWUgUHl0aG9uIDMuOFxuICAgKiAtIFNlbGVuaXVtIHZlcnNpb24gMy4xNDEuMFxuICAgKiAtIENocm9taXVtIHZlcnNpb24gOTIuMC40NTEyLjBcbiAgICpcbiAgICogTmV3IEZlYXR1cmVzOlxuICAgKiAtICoqTW9yZSBwcmVjaXNlIHRpbWVzdGFtcHMqKjogVGhlIHN0YXJ0IHRpbWUgYW5kIHN0b3AgdGltZSBvZiBjYW5hcnkgcnVucyBhcmUgbm93IHByZWNpc2UgdG8gdGhlIG1pbGxpc2Vjb25kLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZFdhdGNoL2xhdGVzdC9tb25pdG9yaW5nL0Nsb3VkV2F0Y2hfU3ludGhldGljc19MaWJyYXJ5X3B5dGhvbl9zZWxlbml1bS5odG1sI0Nsb3VkV2F0Y2hfU3ludGhldGljc19ydW50aW1ldmVyc2lvbi1zeW4tcHl0aG9uLXNlbGVuaXVtLTEuM1xuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBTWU5USEVUSUNTX1BZVEhPTl9TRUxFTklVTV8xXzMgPSBuZXcgUnVudGltZSgnc3luLXB5dGhvbi1zZWxlbml1bS0xLjMnLCBSdW50aW1lRmFtaWx5LlBZVEhPTik7XG5cbiAgLyoqXG4gICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgcnVudGltZSB2ZXJzaW9uXG4gICAgKiBAcGFyYW0gZmFtaWx5IFRoZSBMYW1iZGEgcnVudGltZSBmYW1pbHlcbiAgICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIHJlYWRvbmx5IG5hbWU6IHN0cmluZywgcHVibGljIHJlYWRvbmx5IGZhbWlseTogUnVudGltZUZhbWlseSkge1xuICB9XG59XG4iXX0= \ No newline at end of file diff --git a/packages/@aws-cdk/aws-synthetics-alpha/lib/schedule.d.ts b/packages/@aws-cdk/aws-synthetics-alpha/lib/schedule.d.ts deleted file mode 100644 index 563be0f2fcc1a..0000000000000 --- a/packages/@aws-cdk/aws-synthetics-alpha/lib/schedule.d.ts +++ /dev/null @@ -1,73 +0,0 @@ -import { Duration } from 'aws-cdk-lib/core'; -/** - * Schedule for canary runs - */ -export declare class Schedule { - /** - * The Schedule expression - */ - readonly expressionString: string; - /** - * The canary will be executed once. - */ - static once(): Schedule; - /** - * Construct a schedule from a literal schedule expression. The expression must be in a `rate(number units)` format. - * For example, `Schedule.expression('rate(10 minutes)')` - * - * @param expression The expression to use. - */ - static expression(expression: string): Schedule; - /** - * Construct a schedule from an interval. Allowed values: 0 (for a single run) or between 1 and 60 minutes. - * To specify a single run, you can use `Schedule.once()`. - * - * @param interval The interval at which to run the canary - */ - static rate(interval: Duration): Schedule; - /** - * Create a schedule from a set of cron fields - */ - static cron(options: CronOptions): Schedule; - private constructor(); -} -/** - * Options to configure a cron expression - * - * All fields are strings so you can use complex expressions. Absence of - * a field implies '*' or '?', whichever one is appropriate. - * - * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Canaries_cron.html - */ -export interface CronOptions { - /** - * The minute to run this rule at - * - * @default - Every minute - */ - readonly minute?: string; - /** - * The hour to run this rule at - * - * @default - Every hour - */ - readonly hour?: string; - /** - * The day of the month to run this rule at - * - * @default - Every day of the month - */ - readonly day?: string; - /** - * The month to run this rule at - * - * @default - Every month - */ - readonly month?: string; - /** - * The day of the week to run this rule at - * - * @default - Any day of the week - */ - readonly weekDay?: string; -} diff --git a/packages/@aws-cdk/aws-synthetics-alpha/lib/schedule.js b/packages/@aws-cdk/aws-synthetics-alpha/lib/schedule.js deleted file mode 100644 index 0b0905a4ae8b1..0000000000000 --- a/packages/@aws-cdk/aws-synthetics-alpha/lib/schedule.js +++ /dev/null @@ -1,113 +0,0 @@ -"use strict"; -var _a; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.Schedule = void 0; -const jsiiDeprecationWarnings = require("../.warnings.jsii.js"); -const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti"); -/** - * Schedule for canary runs - */ -class Schedule { - /** - * The canary will be executed once. - */ - static once() { - try { - jsiiDeprecationWarnings.print("@aws-cdk/aws-synthetics-alpha.Schedule#once", ""); - } - catch (error) { - if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { - Error.captureStackTrace(error, this.once); - } - throw error; - } - return new Schedule('rate(0 minutes)'); - } - /** - * Construct a schedule from a literal schedule expression. The expression must be in a `rate(number units)` format. - * For example, `Schedule.expression('rate(10 minutes)')` - * - * @param expression The expression to use. - */ - static expression(expression) { - try { - jsiiDeprecationWarnings.print("@aws-cdk/aws-synthetics-alpha.Schedule#expression", ""); - } - catch (error) { - if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { - Error.captureStackTrace(error, this.expression); - } - throw error; - } - return new Schedule(expression); - } - /** - * Construct a schedule from an interval. Allowed values: 0 (for a single run) or between 1 and 60 minutes. - * To specify a single run, you can use `Schedule.once()`. - * - * @param interval The interval at which to run the canary - */ - static rate(interval) { - try { - jsiiDeprecationWarnings.print("@aws-cdk/aws-synthetics-alpha.Schedule#rate", ""); - } - catch (error) { - if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { - Error.captureStackTrace(error, this.rate); - } - throw error; - } - const minutes = interval.toMinutes(); - if (minutes > 60) { - throw new Error('Schedule duration must be between 1 and 60 minutes'); - } - if (minutes === 0) { - return Schedule.once(); - } - if (minutes === 1) { - return new Schedule('rate(1 minute)'); - } - return new Schedule(`rate(${minutes} minutes)`); - } - /** - * Create a schedule from a set of cron fields - */ - static cron(options) { - try { - jsiiDeprecationWarnings.print("@aws-cdk/aws-synthetics-alpha.Schedule#cron", ""); - jsiiDeprecationWarnings._aws_cdk_aws_synthetics_alpha_CronOptions(options); - } - catch (error) { - if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { - Error.captureStackTrace(error, this.cron); - } - throw error; - } - if (options.weekDay !== undefined && options.day !== undefined) { - throw new Error('Cannot supply both \'day\' and \'weekDay\', use at most one'); - } - const minute = fallback(options.minute, '*'); - const hour = fallback(options.hour, '*'); - const month = fallback(options.month, '*'); - // Weekday defaults to '?' if not supplied. If it is supplied, day must become '?' - const day = fallback(options.day, options.weekDay !== undefined ? '?' : '*'); - const weekDay = fallback(options.weekDay, '?'); - // '*' is only allowed in the year field - const year = '*'; - return new Schedule(`cron(${minute} ${hour} ${day} ${month} ${weekDay} ${year})`); - } - constructor( - /** - * The Schedule expression - */ - expressionString) { - this.expressionString = expressionString; - } -} -exports.Schedule = Schedule; -_a = JSII_RTTI_SYMBOL_1; -Schedule[_a] = { fqn: "@aws-cdk/aws-synthetics-alpha.Schedule", version: "0.0.0" }; -function fallback(x, def) { - return x ?? def; -} -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZWR1bGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJzY2hlZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFFQTs7R0FFRztBQUNILE1BQWEsUUFBUTtJQUVuQjs7T0FFRztJQUNJLE1BQU0sQ0FBQyxJQUFJOzs7Ozs7Ozs7O1FBQ2hCLE9BQU8sSUFBSSxRQUFRLENBQUMsaUJBQWlCLENBQUMsQ0FBQztLQUN4QztJQUVEOzs7OztPQUtHO0lBQ0ksTUFBTSxDQUFDLFVBQVUsQ0FBQyxVQUFrQjs7Ozs7Ozs7OztRQUN6QyxPQUFPLElBQUksUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0tBQ2pDO0lBRUQ7Ozs7O09BS0c7SUFDSSxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQWtCOzs7Ozs7Ozs7O1FBQ25DLE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNyQyxJQUFJLE9BQU8sR0FBRyxFQUFFLEVBQUU7WUFDaEIsTUFBTSxJQUFJLEtBQUssQ0FBQyxvREFBb0QsQ0FBQyxDQUFDO1NBQ3ZFO1FBQ0QsSUFBSSxPQUFPLEtBQUssQ0FBQyxFQUFFO1lBQ2pCLE9BQU8sUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO1NBQ3hCO1FBQ0QsSUFBSSxPQUFPLEtBQUssQ0FBQyxFQUFFO1lBQ2pCLE9BQU8sSUFBSSxRQUFRLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztTQUN2QztRQUNELE9BQU8sSUFBSSxRQUFRLENBQUMsUUFBUSxPQUFPLFdBQVcsQ0FBQyxDQUFDO0tBQ2pEO0lBRUQ7O09BRUc7SUFDSSxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQW9COzs7Ozs7Ozs7OztRQUNyQyxJQUFJLE9BQU8sQ0FBQyxPQUFPLEtBQUssU0FBUyxJQUFJLE9BQU8sQ0FBQyxHQUFHLEtBQUssU0FBUyxFQUFFO1lBQzlELE1BQU0sSUFBSSxLQUFLLENBQUMsNkRBQTZELENBQUMsQ0FBQztTQUNoRjtRQUVELE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQzdDLE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3pDLE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBRTNDLGtGQUFrRjtRQUNsRixNQUFNLEdBQUcsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsT0FBTyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM3RSxNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQztRQUUvQyx3Q0FBd0M7UUFDeEMsTUFBTSxJQUFJLEdBQUcsR0FBRyxDQUFDO1FBRWpCLE9BQU8sSUFBSSxRQUFRLENBQUMsUUFBUSxNQUFNLElBQUksSUFBSSxJQUFJLEdBQUcsSUFBSSxLQUFLLElBQUksT0FBTyxJQUFJLElBQUksR0FBRyxDQUFDLENBQUM7S0FDbkY7SUFFRDtJQUNFOztPQUVHO0lBQ2EsZ0JBQXdCO1FBQXhCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBUTtLQUFJOztBQWpFaEQsNEJBa0VDOzs7QUErQ0QsU0FBUyxRQUFRLENBQUMsQ0FBcUIsRUFBRSxHQUFXO0lBQ2xELE9BQU8sQ0FBQyxJQUFJLEdBQUcsQ0FBQztBQUNsQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRHVyYXRpb24gfSBmcm9tICdhd3MtY2RrLWxpYi9jb3JlJztcblxuLyoqXG4gKiBTY2hlZHVsZSBmb3IgY2FuYXJ5IHJ1bnNcbiAqL1xuZXhwb3J0IGNsYXNzIFNjaGVkdWxlIHtcblxuICAvKipcbiAgICogVGhlIGNhbmFyeSB3aWxsIGJlIGV4ZWN1dGVkIG9uY2UuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIG9uY2UoKTogU2NoZWR1bGUge1xuICAgIHJldHVybiBuZXcgU2NoZWR1bGUoJ3JhdGUoMCBtaW51dGVzKScpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdCBhIHNjaGVkdWxlIGZyb20gYSBsaXRlcmFsIHNjaGVkdWxlIGV4cHJlc3Npb24uIFRoZSBleHByZXNzaW9uIG11c3QgYmUgaW4gYSBgcmF0ZShudW1iZXIgdW5pdHMpYCBmb3JtYXQuXG4gICAqIEZvciBleGFtcGxlLCBgU2NoZWR1bGUuZXhwcmVzc2lvbigncmF0ZSgxMCBtaW51dGVzKScpYFxuICAgKlxuICAgKiBAcGFyYW0gZXhwcmVzc2lvbiBUaGUgZXhwcmVzc2lvbiB0byB1c2UuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGV4cHJlc3Npb24oZXhwcmVzc2lvbjogc3RyaW5nKTogU2NoZWR1bGUge1xuICAgIHJldHVybiBuZXcgU2NoZWR1bGUoZXhwcmVzc2lvbik7XG4gIH1cblxuICAvKipcbiAgICogQ29uc3RydWN0IGEgc2NoZWR1bGUgZnJvbSBhbiBpbnRlcnZhbC4gQWxsb3dlZCB2YWx1ZXM6IDAgKGZvciBhIHNpbmdsZSBydW4pIG9yIGJldHdlZW4gMSBhbmQgNjAgbWludXRlcy5cbiAgICogVG8gc3BlY2lmeSBhIHNpbmdsZSBydW4sIHlvdSBjYW4gdXNlIGBTY2hlZHVsZS5vbmNlKClgLlxuICAgKlxuICAgKiBAcGFyYW0gaW50ZXJ2YWwgVGhlIGludGVydmFsIGF0IHdoaWNoIHRvIHJ1biB0aGUgY2FuYXJ5XG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJhdGUoaW50ZXJ2YWw6IER1cmF0aW9uKTogU2NoZWR1bGUge1xuICAgIGNvbnN0IG1pbnV0ZXMgPSBpbnRlcnZhbC50b01pbnV0ZXMoKTtcbiAgICBpZiAobWludXRlcyA+IDYwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NjaGVkdWxlIGR1cmF0aW9uIG11c3QgYmUgYmV0d2VlbiAxIGFuZCA2MCBtaW51dGVzJyk7XG4gICAgfVxuICAgIGlmIChtaW51dGVzID09PSAwKSB7XG4gICAgICByZXR1cm4gU2NoZWR1bGUub25jZSgpO1xuICAgIH1cbiAgICBpZiAobWludXRlcyA9PT0gMSkge1xuICAgICAgcmV0dXJuIG5ldyBTY2hlZHVsZSgncmF0ZSgxIG1pbnV0ZSknKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBTY2hlZHVsZShgcmF0ZSgke21pbnV0ZXN9IG1pbnV0ZXMpYCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgc2NoZWR1bGUgZnJvbSBhIHNldCBvZiBjcm9uIGZpZWxkc1xuICAgKi9cbiAgcHVibGljIHN0YXRpYyBjcm9uKG9wdGlvbnM6IENyb25PcHRpb25zKTogU2NoZWR1bGUge1xuICAgIGlmIChvcHRpb25zLndlZWtEYXkgIT09IHVuZGVmaW5lZCAmJiBvcHRpb25zLmRheSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBzdXBwbHkgYm90aCBcXCdkYXlcXCcgYW5kIFxcJ3dlZWtEYXlcXCcsIHVzZSBhdCBtb3N0IG9uZScpO1xuICAgIH1cblxuICAgIGNvbnN0IG1pbnV0ZSA9IGZhbGxiYWNrKG9wdGlvbnMubWludXRlLCAnKicpO1xuICAgIGNvbnN0IGhvdXIgPSBmYWxsYmFjayhvcHRpb25zLmhvdXIsICcqJyk7XG4gICAgY29uc3QgbW9udGggPSBmYWxsYmFjayhvcHRpb25zLm1vbnRoLCAnKicpO1xuXG4gICAgLy8gV2Vla2RheSBkZWZhdWx0cyB0byAnPycgaWYgbm90IHN1cHBsaWVkLiBJZiBpdCBpcyBzdXBwbGllZCwgZGF5IG11c3QgYmVjb21lICc/J1xuICAgIGNvbnN0IGRheSA9IGZhbGxiYWNrKG9wdGlvbnMuZGF5LCBvcHRpb25zLndlZWtEYXkgIT09IHVuZGVmaW5lZCA/ICc/JyA6ICcqJyk7XG4gICAgY29uc3Qgd2Vla0RheSA9IGZhbGxiYWNrKG9wdGlvbnMud2Vla0RheSwgJz8nKTtcblxuICAgIC8vICcqJyBpcyBvbmx5IGFsbG93ZWQgaW4gdGhlIHllYXIgZmllbGRcbiAgICBjb25zdCB5ZWFyID0gJyonO1xuXG4gICAgcmV0dXJuIG5ldyBTY2hlZHVsZShgY3Jvbigke21pbnV0ZX0gJHtob3VyfSAke2RheX0gJHttb250aH0gJHt3ZWVrRGF5fSAke3llYXJ9KWApO1xuICB9XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICAgKiBUaGUgU2NoZWR1bGUgZXhwcmVzc2lvblxuICAgICAqL1xuICAgIHB1YmxpYyByZWFkb25seSBleHByZXNzaW9uU3RyaW5nOiBzdHJpbmcpIHt9XG59XG5cbi8qKlxuICogT3B0aW9ucyB0byBjb25maWd1cmUgYSBjcm9uIGV4cHJlc3Npb25cbiAqXG4gKiBBbGwgZmllbGRzIGFyZSBzdHJpbmdzIHNvIHlvdSBjYW4gdXNlIGNvbXBsZXggZXhwcmVzc2lvbnMuIEFic2VuY2Ugb2ZcbiAqIGEgZmllbGQgaW1wbGllcyAnKicgb3IgJz8nLCB3aGljaGV2ZXIgb25lIGlzIGFwcHJvcHJpYXRlLlxuICpcbiAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkV2F0Y2gvbGF0ZXN0L21vbml0b3JpbmcvQ2xvdWRXYXRjaF9TeW50aGV0aWNzX0NhbmFyaWVzX2Nyb24uaHRtbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyb25PcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBtaW51dGUgdG8gcnVuIHRoaXMgcnVsZSBhdFxuICAgKlxuICAgKiBAZGVmYXVsdCAtIEV2ZXJ5IG1pbnV0ZVxuICAgKi9cbiAgcmVhZG9ubHkgbWludXRlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgaG91ciB0byBydW4gdGhpcyBydWxlIGF0XG4gICAqXG4gICAqIEBkZWZhdWx0IC0gRXZlcnkgaG91clxuICAgKi9cbiAgcmVhZG9ubHkgaG91cj86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGRheSBvZiB0aGUgbW9udGggdG8gcnVuIHRoaXMgcnVsZSBhdFxuICAgKlxuICAgKiBAZGVmYXVsdCAtIEV2ZXJ5IGRheSBvZiB0aGUgbW9udGhcbiAgICovXG4gIHJlYWRvbmx5IGRheT86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG1vbnRoIHRvIHJ1biB0aGlzIHJ1bGUgYXRcbiAgICpcbiAgICogQGRlZmF1bHQgLSBFdmVyeSBtb250aFxuICAgKi9cbiAgcmVhZG9ubHkgbW9udGg/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBkYXkgb2YgdGhlIHdlZWsgdG8gcnVuIHRoaXMgcnVsZSBhdFxuICAgKlxuICAgKiBAZGVmYXVsdCAtIEFueSBkYXkgb2YgdGhlIHdlZWtcbiAgICovXG4gIHJlYWRvbmx5IHdlZWtEYXk/OiBzdHJpbmc7XG59XG5cbmZ1bmN0aW9uIGZhbGxiYWNrKHg6IHN0cmluZyB8IHVuZGVmaW5lZCwgZGVmOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4geCA/PyBkZWY7XG59XG4iXX0= \ No newline at end of file diff --git a/packages/@aws-cdk/aws-synthetics-alpha/test/canary.test.d.ts b/packages/@aws-cdk/aws-synthetics-alpha/test/canary.test.d.ts deleted file mode 100644 index cb0ff5c3b541f..0000000000000 --- a/packages/@aws-cdk/aws-synthetics-alpha/test/canary.test.d.ts +++ /dev/null @@ -1 +0,0 @@ -export {}; diff --git a/packages/@aws-cdk/aws-synthetics-alpha/test/canary.test.js b/packages/@aws-cdk/aws-synthetics-alpha/test/canary.test.js deleted file mode 100644 index 4541dbe4f1cdd..0000000000000 --- a/packages/@aws-cdk/aws-synthetics-alpha/test/canary.test.js +++ /dev/null @@ -1,701 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -const path = require("path"); -const assertions_1 = require("aws-cdk-lib/assertions"); -const ec2 = require("aws-cdk-lib/aws-ec2"); -const iam = require("aws-cdk-lib/aws-iam"); -const s3 = require("aws-cdk-lib/aws-s3"); -const aws_cdk_lib_1 = require("aws-cdk-lib"); -const synthetics = require("../lib"); -test('Basic canary properties work', () => { - // GIVEN - const stack = new aws_cdk_lib_1.Stack(); - // WHEN - new synthetics.Canary(stack, 'Canary', { - canaryName: 'mycanary', - test: synthetics.Test.custom({ - handler: 'index.handler', - code: synthetics.Code.fromInline('/* Synthetics handler code */'), - }), - successRetentionPeriod: aws_cdk_lib_1.Duration.days(10), - failureRetentionPeriod: aws_cdk_lib_1.Duration.days(10), - startAfterCreation: false, - timeToLive: aws_cdk_lib_1.Duration.minutes(30), - runtime: synthetics.Runtime.SYNTHETICS_NODEJS_PUPPETEER_3_8, - }); - // THEN - assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::Synthetics::Canary', { - Name: 'mycanary', - SuccessRetentionPeriod: 10, - FailureRetentionPeriod: 10, - StartCanaryAfterCreation: false, - Schedule: assertions_1.Match.objectLike({ DurationInSeconds: '1800' }), - RuntimeVersion: 'syn-nodejs-puppeteer-3.8', - }); -}); -test('cleanup.LAMBDA introduces custom resource to delete lambda', () => { - // GIVEN - const stack = new aws_cdk_lib_1.Stack(); - // WHEN - new synthetics.Canary(stack, 'Canary', { - test: synthetics.Test.custom({ - handler: 'index.handler', - code: synthetics.Code.fromInline('/* Synthetics handler code'), - }), - cleanup: synthetics.Cleanup.LAMBDA, - runtime: synthetics.Runtime.SYNTHETICS_NODEJS_PUPPETEER_3_8, - }); - // THEN - assertions_1.Template.fromStack(stack).resourceCountIs('Custom::SyntheticsAutoDeleteUnderlyingResources', 1); -}); -test('Canary can have generated name', () => { - // GIVEN - const stack = new aws_cdk_lib_1.Stack(); - // WHEN - new synthetics.Canary(stack, 'Canary', { - test: synthetics.Test.custom({ - handler: 'index.handler', - code: synthetics.Code.fromInline('/* Synthetics handler code */'), - }), - runtime: synthetics.Runtime.SYNTHETICS_NODEJS_PUPPETEER_3_8, - }); - // THEN - assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::Synthetics::Canary', { - Name: 'canary', - }); -}); -test('Name validation does not fail when using Tokens', () => { - // GIVEN - const stack = new aws_cdk_lib_1.Stack(); - // WHEN - new synthetics.Canary(stack, 'Canary', { - canaryName: aws_cdk_lib_1.Lazy.string({ produce: () => 'My Canary' }), - test: synthetics.Test.custom({ - handler: 'index.handler', - code: synthetics.Code.fromInline('/* Synthetics handler code */'), - }), - runtime: synthetics.Runtime.SYNTHETICS_NODEJS_PUPPETEER_3_8, - }); - // THEN: no exception - assertions_1.Template.fromStack(stack).resourceCountIs('AWS::Synthetics::Canary', 1); -}); -test('Throws when name is specified incorrectly', () => { - // GIVEN - const stack = new aws_cdk_lib_1.Stack(); - // THEN - expect(() => new synthetics.Canary(stack, 'Canary', { - canaryName: 'My Canary', - test: synthetics.Test.custom({ - handler: 'index.handler', - code: synthetics.Code.fromInline('/* Synthetics handler code */'), - }), - runtime: synthetics.Runtime.SYNTHETICS_NODEJS_PUPPETEER_3_8, - })) - .toThrowError('Canary name must be lowercase, numbers, hyphens, or underscores (got "My Canary")'); -}); -test('Throws when name has more than 21 characters', () => { - // GIVEN - const stack = new aws_cdk_lib_1.Stack(); - // THEN - expect(() => new synthetics.Canary(stack, 'Canary', { - canaryName: 'a'.repeat(22), - test: synthetics.Test.custom({ - handler: 'index.handler', - code: synthetics.Code.fromInline('/* Synthetics handler code */'), - }), - runtime: synthetics.Runtime.SYNTHETICS_NODEJS_PUPPETEER_3_8, - })) - .toThrowError(`Canary name is too large, must be between 1 and 21 characters, but is 22 (got "${'a'.repeat(22)}")`); -}); -test('An existing role can be specified instead of auto-created', () => { - // GIVEN - const stack = new aws_cdk_lib_1.Stack(); - const role = new iam.Role(stack, 'role', { - assumedBy: new iam.ServicePrincipal('lambda.amazonaws.com'), - }); - // role.addToPolicy(/* required permissions per the documentation */); - // WHEN - new synthetics.Canary(stack, 'Canary', { - role, - test: synthetics.Test.custom({ - handler: 'index.handler', - code: synthetics.Code.fromInline('/* Synthetics handler code */'), - }), - runtime: synthetics.Runtime.SYNTHETICS_NODEJS_PUPPETEER_3_8, - }); - // THEN - assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::Synthetics::Canary', { - ExecutionRoleArn: stack.resolve(role.roleArn), - }); -}); -test('An auto-generated bucket can have lifecycle rules', () => { - // GIVEN - const stack = new aws_cdk_lib_1.Stack(); - const lifecycleRules = [{ - expiration: aws_cdk_lib_1.Duration.days(30), - }]; - // WHEN - new synthetics.Canary(stack, 'Canary', { - artifactsBucketLifecycleRules: lifecycleRules, - test: synthetics.Test.custom({ - handler: 'index.handler', - code: synthetics.Code.fromInline('/* Synthetics handler code */'), - }), - runtime: synthetics.Runtime.SYNTHETICS_NODEJS_PUPPETEER_3_8, - }); - // THEN - assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::S3::Bucket', { - LifecycleConfiguration: { - Rules: [ - { - ExpirationInDays: 30, - }, - ], - }, - }); -}); -test('An existing bucket and prefix can be specified instead of auto-created', () => { - // GIVEN - const stack = new aws_cdk_lib_1.Stack(); - const bucket = new s3.Bucket(stack, 'mytestbucket'); - const prefix = 'canary'; - // WHEN - new synthetics.Canary(stack, 'Canary', { - artifactsBucketLocation: { bucket, prefix }, - test: synthetics.Test.custom({ - handler: 'index.handler', - code: synthetics.Code.fromInline('/* Synthetics handler code */'), - }), - runtime: synthetics.Runtime.SYNTHETICS_NODEJS_PUPPETEER_3_8, - }); - // THEN - assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::Synthetics::Canary', { - ArtifactS3Location: stack.resolve(bucket.s3UrlForObject(prefix)), - }); -}); -test('Runtime can be specified', () => { - // GIVEN - const stack = new aws_cdk_lib_1.Stack(); - // WHEN - new synthetics.Canary(stack, 'Canary', { - runtime: synthetics.Runtime.SYNTHETICS_NODEJS_PUPPETEER_3_8, - test: synthetics.Test.custom({ - handler: 'index.handler', - code: synthetics.Code.fromInline('/* Synthetics handler code */'), - }), - }); - // THEN - assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::Synthetics::Canary', { - RuntimeVersion: 'syn-nodejs-puppeteer-3.8', - }); -}); -test('Python runtime can be specified', () => { - // GIVEN - const stack = new aws_cdk_lib_1.Stack(); - // WHEN - new synthetics.Canary(stack, 'Canary', { - runtime: synthetics.Runtime.SYNTHETICS_PYTHON_SELENIUM_1_3, - test: synthetics.Test.custom({ - handler: 'index.handler', - code: synthetics.Code.fromInline('# Synthetics handler code'), - }), - }); - // THEN - assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::Synthetics::Canary', { - RuntimeVersion: 'syn-python-selenium-1.3', - }); -}); -test('environment variables can be specified', () => { - // GIVEN - const stack = new aws_cdk_lib_1.Stack(); - const environmentVariables = { - TEST_KEY_1: 'TEST_VALUE_1', - TEST_KEY_2: 'TEST_VALUE_2', - }; - // WHEN - new synthetics.Canary(stack, 'Canary', { - runtime: synthetics.Runtime.SYNTHETICS_NODEJS_PUPPETEER_3_8, - test: synthetics.Test.custom({ - handler: 'index.handler', - code: synthetics.Code.fromInline('/* Synthetics handler code */'), - }), - environmentVariables: environmentVariables, - }); - // THEN - assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::Synthetics::Canary', { - RunConfig: { - EnvironmentVariables: environmentVariables, - }, - }); -}); -test('environment variables are skipped if not provided', () => { - // GIVEN - const stack = new aws_cdk_lib_1.Stack(); - // WHEN - new synthetics.Canary(stack, 'Canary', { - runtime: synthetics.Runtime.SYNTHETICS_NODEJS_PUPPETEER_3_8, - test: synthetics.Test.custom({ - handler: 'index.handler', - code: synthetics.Code.fromInline('/* Synthetics handler code */'), - }), - }); - // THEN - assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::Synthetics::Canary', { - RunConfig: assertions_1.Match.absent(), - }); -}); -test('Runtime can be customized', () => { - // GIVEN - const stack = new aws_cdk_lib_1.Stack(); - // WHEN - new synthetics.Canary(stack, 'Canary', { - runtime: new synthetics.Runtime('fancy-future-runtime-1337.42', synthetics.RuntimeFamily.OTHER), - test: synthetics.Test.custom({ - handler: 'index.handler', - code: synthetics.Code.fromInline('/* Synthetics handler code */'), - }), - }); - // THEN - assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::Synthetics::Canary', { - RuntimeVersion: 'fancy-future-runtime-1337.42', - }); -}); -test('Schedule can be set with Rate', () => { - // GIVEN - const stack = new aws_cdk_lib_1.Stack(); - // WHEN - new synthetics.Canary(stack, 'Canary', { - schedule: synthetics.Schedule.rate(aws_cdk_lib_1.Duration.minutes(3)), - test: synthetics.Test.custom({ - handler: 'index.handler', - code: synthetics.Code.fromInline('/* Synthetics handler code */'), - }), - runtime: synthetics.Runtime.SYNTHETICS_NODEJS_PUPPETEER_3_8, - }); - // THEN - assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::Synthetics::Canary', { - Schedule: assertions_1.Match.objectLike({ Expression: 'rate(3 minutes)' }), - }); -}); -test('Schedule can be set to 1 minute', () => { - // GIVEN - const stack = new aws_cdk_lib_1.Stack(); - // WHEN - new synthetics.Canary(stack, 'Canary', { - schedule: synthetics.Schedule.rate(aws_cdk_lib_1.Duration.minutes(1)), - test: synthetics.Test.custom({ - handler: 'index.handler', - code: synthetics.Code.fromInline('/* Synthetics handler code */'), - }), - runtime: synthetics.Runtime.SYNTHETICS_NODEJS_PUPPETEER_3_8, - }); - // THEN - assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::Synthetics::Canary', { - Schedule: assertions_1.Match.objectLike({ Expression: 'rate(1 minute)' }), - }); -}); -test('Schedule can be set with Cron', () => { - // GIVEN - const stack = new aws_cdk_lib_1.Stack(); - // WHEN - new synthetics.Canary(stack, 'Canary', { - schedule: synthetics.Schedule.cron({ minute: '30' }), - test: synthetics.Test.custom({ - handler: 'index.handler', - code: synthetics.Code.fromInline('/* Synthetics handler code */'), - }), - runtime: synthetics.Runtime.SYNTHETICS_NODEJS_PUPPETEER_3_8, - }); - // THEN - assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::Synthetics::Canary', { - Schedule: assertions_1.Match.objectLike({ Expression: 'cron(30 * * * ? *)' }), - }); -}); -test('Schedule can be set with Expression', () => { - // GIVEN - const stack = new aws_cdk_lib_1.Stack(); - // WHEN - new synthetics.Canary(stack, 'Canary', { - schedule: synthetics.Schedule.expression('rate(1 hour)'), - test: synthetics.Test.custom({ - handler: 'index.handler', - code: synthetics.Code.fromInline('/* Synthetics handler code */'), - }), - runtime: synthetics.Runtime.SYNTHETICS_NODEJS_PUPPETEER_3_8, - }); - // THEN - assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::Synthetics::Canary', { - Schedule: assertions_1.Match.objectLike({ Expression: 'rate(1 hour)' }), - }); -}); -test('Schedule can be set to run once', () => { - // GIVEN - const stack = new aws_cdk_lib_1.Stack(); - // WHEN - new synthetics.Canary(stack, 'Canary', { - schedule: synthetics.Schedule.once(), - test: synthetics.Test.custom({ - handler: 'index.handler', - code: synthetics.Code.fromInline('/* Synthetics handler code */'), - }), - runtime: synthetics.Runtime.SYNTHETICS_NODEJS_PUPPETEER_3_8, - }); - // THEN - assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::Synthetics::Canary', { - Schedule: assertions_1.Match.objectLike({ Expression: 'rate(0 minutes)' }), - }); -}); -test('Throws when rate above 60 minutes', () => { - // GIVEN - const stack = new aws_cdk_lib_1.Stack(); - // THEN - expect(() => new synthetics.Canary(stack, 'Canary', { - schedule: synthetics.Schedule.rate(aws_cdk_lib_1.Duration.minutes(61)), - test: synthetics.Test.custom({ - handler: 'index.handler', - code: synthetics.Code.fromInline('/* Synthetics handler code */'), - }), - runtime: synthetics.Runtime.SYNTHETICS_NODEJS_PUPPETEER_3_8, - })) - .toThrowError('Schedule duration must be between 1 and 60 minutes'); -}); -test('Throws when rate above is not a whole number of minutes', () => { - // GIVEN - const stack = new aws_cdk_lib_1.Stack(); - // THEN - expect(() => new synthetics.Canary(stack, 'Canary', { - schedule: synthetics.Schedule.rate(aws_cdk_lib_1.Duration.seconds(59)), - test: synthetics.Test.custom({ - handler: 'index.handler', - code: synthetics.Code.fromInline('/* Synthetics handler code */'), - }), - runtime: synthetics.Runtime.SYNTHETICS_NODEJS_PUPPETEER_3_8, - })) - .toThrowError('\'59 seconds\' cannot be converted into a whole number of minutes.'); -}); -test('Can share artifacts bucket between canaries', () => { - // GIVEN - const stack = new aws_cdk_lib_1.Stack(); - // WHEN - const canary1 = new synthetics.Canary(stack, 'Canary1', { - schedule: synthetics.Schedule.once(), - test: synthetics.Test.custom({ - handler: 'index.handler', - code: synthetics.Code.fromInline('/* Synthetics handler code */'), - }), - runtime: synthetics.Runtime.SYNTHETICS_NODEJS_PUPPETEER_3_8, - }); - const canary2 = new synthetics.Canary(stack, 'Canary2', { - schedule: synthetics.Schedule.once(), - test: synthetics.Test.custom({ - handler: 'index.handler', - code: synthetics.Code.fromInline('/* Synthetics handler code */'), - }), - artifactsBucketLocation: { bucket: canary1.artifactsBucket }, - runtime: synthetics.Runtime.SYNTHETICS_NODEJS_PUPPETEER_3_8, - }); - // THEN - expect(canary1.artifactsBucket).toEqual(canary2.artifactsBucket); -}); -test('can specify custom test', () => { - // GIVEN - const stack = new aws_cdk_lib_1.Stack(); - // WHEN - new synthetics.Canary(stack, 'Canary', { - test: synthetics.Test.custom({ - handler: 'index.handler', - code: synthetics.Code.fromInline(` - exports.handler = async () => { - console.log(\'hello world\'); - };`), - }), - runtime: synthetics.Runtime.SYNTHETICS_NODEJS_PUPPETEER_3_8, - }); - // THEN - assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::Synthetics::Canary', { - Code: { - Handler: 'index.handler', - Script: ` - exports.handler = async () => { - console.log(\'hello world\'); - };`, - }, - }); -}); -describe('canary in a vpc', () => { - test('can specify vpc', () => { - // GIVEN - const stack = new aws_cdk_lib_1.Stack(); - const vpc = new ec2.Vpc(stack, 'VPC', { maxAzs: 2 }); - // WHEN - new synthetics.Canary(stack, 'Canary', { - test: synthetics.Test.custom({ - handler: 'index.handler', - code: synthetics.Code.fromInline(` - exports.handler = async () => { - console.log(\'hello world\'); - };`), - }), - runtime: synthetics.Runtime.SYNTHETICS_NODEJS_PUPPETEER_3_8, - vpc, - }); - // THEN - assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::Synthetics::Canary', { - Code: { - Handler: 'index.handler', - Script: ` - exports.handler = async () => { - console.log(\'hello world\'); - };`, - }, - VPCConfig: { - VpcId: { - Ref: assertions_1.Match.anyValue(), - }, - }, - }); - }); - test('default security group and subnets', () => { - // GIVEN - const stack = new aws_cdk_lib_1.Stack(); - const vpc = new ec2.Vpc(stack, 'VPC', { maxAzs: 2 }); - // WHEN - new synthetics.Canary(stack, 'Canary', { - test: synthetics.Test.custom({ - handler: 'index.handler', - code: synthetics.Code.fromInline(` - exports.handler = async () => { - console.log(\'hello world\'); - };`), - }), - runtime: synthetics.Runtime.SYNTHETICS_NODEJS_PUPPETEER_3_8, - vpc, - }); - // THEN - assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::Synthetics::Canary', { - Code: { - Handler: 'index.handler', - Script: ` - exports.handler = async () => { - console.log(\'hello world\'); - };`, - }, - VPCConfig: { - VpcId: { - Ref: assertions_1.Match.anyValue(), - }, - SecurityGroupIds: assertions_1.Match.anyValue(), - SubnetIds: [...vpc.privateSubnets.map(subnet => ({ Ref: assertions_1.Match.stringLikeRegexp(subnet.node.id) }))], - }, - }); - }); - test('provided security group', () => { - // GIVEN - const stack = new aws_cdk_lib_1.Stack(); - const vpc = new ec2.Vpc(stack, 'VPC', { maxAzs: 2 }); - const sg = new ec2.SecurityGroup(stack, 'Sg', { vpc }); - // WHEN - new synthetics.Canary(stack, 'Canary', { - test: synthetics.Test.custom({ - handler: 'index.handler', - code: synthetics.Code.fromInline(` - exports.handler = async () => { - console.log(\'hello world\'); - };`), - }), - runtime: synthetics.Runtime.SYNTHETICS_NODEJS_PUPPETEER_3_8, - vpc, - securityGroups: [sg], - }); - // THEN - const template = assertions_1.Template.fromStack(stack); - const sgTemplate = template.findResources('AWS::EC2::SecurityGroup'); - const sgIds = Object.keys(sgTemplate); - expect(sgIds).toHaveLength(1); - template.hasResourceProperties('AWS::Synthetics::Canary', { - Code: { - Handler: 'index.handler', - Script: ` - exports.handler = async () => { - console.log(\'hello world\'); - };`, - }, - VPCConfig: { - VpcId: { - Ref: assertions_1.Match.anyValue(), - }, - SecurityGroupIds: [{ 'Fn::GetAtt': [sgIds[0], 'GroupId'] }], - }, - }); - }); -}); -test('Role policy generated as expected', () => { - // GIVEN - const stack = new aws_cdk_lib_1.Stack(); - // WHEN - new synthetics.Canary(stack, 'Canary', { - test: synthetics.Test.custom({ - handler: 'index.handler', - code: synthetics.Code.fromInline('/* Synthetics handler code */'), - }), - runtime: synthetics.Runtime.SYNTHETICS_NODEJS_PUPPETEER_3_8, - }); - // THEN - assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::IAM::Role', { - Policies: [{ - PolicyDocument: { - Statement: [ - { - Action: 's3:ListAllMyBuckets', - Effect: 'Allow', - Resource: '*', - }, - { - Action: 's3:GetBucketLocation', - Effect: 'Allow', - Resource: { - 'Fn::GetAtt': [ - 'CanaryArtifactsBucket4A60D32B', - 'Arn', - ], - }, - }, - { - Action: 's3:PutObject', - Effect: 'Allow', - Resource: { - 'Fn::Join': [ - '', - [ - { - 'Fn::GetAtt': [ - 'CanaryArtifactsBucket4A60D32B', - 'Arn', - ], - }, - '/*', - ], - ], - }, - }, - { - Action: 'cloudwatch:PutMetricData', - Condition: { - StringEquals: { - 'cloudwatch:namespace': 'CloudWatchSynthetics', - }, - }, - Effect: 'Allow', - Resource: '*', - }, - { - Action: [ - 'logs:CreateLogStream', - 'logs:CreateLogGroup', - 'logs:PutLogEvents', - ], - Effect: 'Allow', - Resource: { - 'Fn::Join': [ - '', - [ - 'arn:', - { - Ref: 'AWS::Partition', - }, - ':logs:', - { - Ref: 'AWS::Region', - }, - ':', - { - Ref: 'AWS::AccountId', - }, - ':log-group:/aws/lambda/cwsyn-*', - ], - ], - }, - }, - ], - }, - }], - }); -}); -test('Should create handler with path for recent runtimes', () => { - // GIVEN - const stack = new aws_cdk_lib_1.Stack(); - // WHEN - new synthetics.Canary(stack, 'Canary', { - canaryName: 'mycanary', - test: synthetics.Test.custom({ - handler: 'folder/canary.functionName', - code: synthetics.Code.fromAsset(path.join(__dirname, 'canaries')), - }), - runtime: synthetics.Runtime.SYNTHETICS_NODEJS_PUPPETEER_3_8, - }); - // THEN - assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::Synthetics::Canary', { - Name: 'mycanary', - Code: { - Handler: 'folder/canary.functionName', - }, - RuntimeVersion: 'syn-nodejs-puppeteer-3.8', - }); -}); -describe('handler validation', () => { - test('legacy runtimes', () => { - const stack = new aws_cdk_lib_1.Stack(); - expect(() => { - new synthetics.Canary(stack, 'Canary', { - test: synthetics.Test.custom({ - handler: 'index.functionName', - code: synthetics.Code.fromAsset(path.join(__dirname, 'canaries')), - }), - runtime: synthetics.Runtime.SYNTHETICS_PYTHON_SELENIUM_1_0, - }); - }).toThrow(/Canary Handler must be specified as 'fileName.handler' for legacy runtimes/); - }); - test('recent runtimes', () => { - const stack = new aws_cdk_lib_1.Stack(); - expect(() => { - new synthetics.Canary(stack, 'Canary', { - test: synthetics.Test.custom({ - handler: 'invalidHandler', - code: synthetics.Code.fromAsset(path.join(__dirname, 'canaries')), - }), - runtime: synthetics.Runtime.SYNTHETICS_NODEJS_PUPPETEER_3_9, - }); - }).toThrow(/Canary Handler must be specified either as 'fileName.handler', 'fileName.functionName', or 'folder\/fileName.functionName'/); - expect(() => { - new synthetics.Canary(stack, 'Canary1', { - test: synthetics.Test.custom({ - handler: 'canary.functionName', - code: synthetics.Code.fromAsset(path.join(__dirname, 'canaries')), - }), - runtime: synthetics.Runtime.SYNTHETICS_NODEJS_PUPPETEER_3_9, - }); - }).not.toThrow(); - expect(() => { - new synthetics.Canary(stack, 'Canary2', { - test: synthetics.Test.custom({ - handler: 'folder/canary.functionName', - code: synthetics.Code.fromAsset(path.join(__dirname, 'canaries')), - }), - runtime: synthetics.Runtime.SYNTHETICS_NODEJS_PUPPETEER_3_9, - }); - }).not.toThrow(); - }); - test('handler length', () => { - const stack = new aws_cdk_lib_1.Stack(); - expect(() => { - new synthetics.Canary(stack, 'Canary1', { - test: synthetics.Test.custom({ - handler: 'longHandlerName'.repeat(10) + '.handler', - code: synthetics.Code.fromAsset(path.join(__dirname, 'canaries')), - }), - runtime: synthetics.Runtime.SYNTHETICS_NODEJS_PUPPETEER_3_9, - }); - }).toThrow(/Canary Handler length must be between 1 and 128/); - }); -}); -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FuYXJ5LnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJjYW5hcnkudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLDZCQUE2QjtBQUM3Qix1REFBeUQ7QUFDekQsMkNBQTJDO0FBQzNDLDJDQUEyQztBQUMzQyx5Q0FBeUM7QUFDekMsNkNBQW9EO0FBQ3BELHFDQUFxQztBQUVyQyxJQUFJLENBQUMsOEJBQThCLEVBQUUsR0FBRyxFQUFFO0lBQ3hDLFFBQVE7SUFDUixNQUFNLEtBQUssR0FBRyxJQUFJLG1CQUFLLEVBQUUsQ0FBQztJQUUxQixPQUFPO0lBQ1AsSUFBSSxVQUFVLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUU7UUFDckMsVUFBVSxFQUFFLFVBQVU7UUFDdEIsSUFBSSxFQUFFLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO1lBQzNCLE9BQU8sRUFBRSxlQUFlO1lBQ3hCLElBQUksRUFBRSxVQUFVLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQywrQkFBK0IsQ0FBQztTQUNsRSxDQUFDO1FBQ0Ysc0JBQXNCLEVBQUUsc0JBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ3pDLHNCQUFzQixFQUFFLHNCQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUN6QyxrQkFBa0IsRUFBRSxLQUFLO1FBQ3pCLFVBQVUsRUFBRSxzQkFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7UUFDaEMsT0FBTyxFQUFFLFVBQVUsQ0FBQyxPQUFPLENBQUMsK0JBQStCO0tBQzVELENBQUMsQ0FBQztJQUVILE9BQU87SUFDUCxxQkFBUSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxxQkFBcUIsQ0FBQyx5QkFBeUIsRUFBRTtRQUN6RSxJQUFJLEVBQUUsVUFBVTtRQUNoQixzQkFBc0IsRUFBRSxFQUFFO1FBQzFCLHNCQUFzQixFQUFFLEVBQUU7UUFDMUIsd0JBQXdCLEVBQUUsS0FBSztRQUMv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LENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDbkIsQ0FBQyxDQUFDLENBQUM7SUFFSCxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsR0FBRyxFQUFFO1FBQzFCLE1BQU0sS0FBSyxHQUFHLElBQUksbUJBQUssRUFBRSxDQUFDO1FBQzFCLE1BQU0sQ0FBQyxHQUFHLEVBQUU7WUFDVixJQUFJLFVBQVUsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRTtnQkFDdEMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO29CQUMzQixPQUFPLEVBQUUsaUJBQWlCLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxHQUFHLFVBQVU7b0JBQ2xELElBQUksRUFBRSxVQUFVLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxVQUFVLENBQUMsQ0FBQztpQkFDbEUsQ0FBQztnQkFDRixPQUFPLEVBQUUsVUFBVSxDQUFDLE9BQU8sQ0FBQywrQkFBK0I7YUFDNUQsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLGlEQUFpRCxDQUFDLENBQUM7SUFDaEUsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBNYXRjaCwgVGVtcGxhdGUgfSBmcm9tICdhd3MtY2RrLWxpYi9hc3NlcnRpb25zJztcbmltcG9ydCAqIGFzIGVjMiBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZWMyJztcbmltcG9ydCAqIGFzIGlhbSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtaWFtJztcbmltcG9ydCAqIGFzIHMzIGZyb20gJ2F3cy1jZGstbGliL2F3cy1zMyc7XG5pbXBvcnQgeyBEdXJhdGlvbiwgTGF6eSwgU3RhY2sgfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgKiBhcyBzeW50aGV0aWNzIGZyb20gJy4uL2xpYic7XG5cbnRlc3QoJ0Jhc2ljIGNhbmFyeSBwcm9wZXJ0aWVzIHdvcmsnLCAoKSA9PiB7XG4gIC8vIEdJVkVOXG4gIGNvbnN0IHN0YWNrID0gbmV3IFN0YWNrKCk7XG5cbiAgLy8gV0hFTlxuICBuZXcgc3ludGhldGljcy5DYW5hcnkoc3RhY2ssICdDYW5hcnknLCB7XG4gICAgY2FuYXJ5TmFtZTogJ215Y2FuYXJ5JyxcbiAgICB0ZXN0OiBzeW50aGV0aWNzLlRlc3QuY3VzdG9tKHtcbiAgICAgIGhhbmRsZXI6ICdpbmRleC5oYW5kbGVyJyxcbiAgICAgIGNvZGU6IHN5bnRoZXRpY3MuQ29kZS5mcm9tSW5saW5lKCcvKiBTeW50aGV0aWNzIGhhbmRsZXIgY29kZSAqLycpLFxuICAgIH0pLFxuICAgIHN1Y2Nlc3NSZXRlbnRpb25QZXJpb2Q6IER1cmF0aW9uLmRheXMoMTApLFxuICAgIGZhaWx1cmVSZXRlbnRpb25QZXJpb2Q6IER1cmF0aW9uLmRheXMoMTApLFxuICAgIHN0YXJ0QWZ0ZXJDcmVhdGlvbjogZmFsc2UsXG4gICAgdGltZVRvTGl2ZTogRHVyYXRpb24ubWludXRlcygzMCksXG4gICAgcnVudGltZTogc3ludGhldGljcy5SdW50aW1lLlNZTlRIRVRJQ1NfTk9ERUpTX1BVUFBFVEVFUl8zXzgsXG4gIH0pO1xuXG4gIC8vIFRIRU5cbiAgVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6U3ludGhldGljczo6Q2FuYXJ5Jywge1xuICAgIE5hbWU6ICdteWNhbmFyeScsXG4gICAgU3VjY2Vzc1JldGVudGlvblBlcmlvZDogMTAsXG4gICAgRmFpbHVyZVJldGVudGlvblBlcmlvZDogMTAsXG4gICAgU3RhcnRDYW5hcnlBZnRlckNyZWF0aW9uOiBmYWxzZSxcbiAgICBTY2hlZHVsZTogTWF0Y2gub2JqZWN0TGlrZSh7IER1cmF0aW9uSW5TZWNvbmRzOiAnMTgwMCcgfSksXG4gICAgUnVudGltZVZlcnNpb246ICdzeW4tbm9kZWpzLXB1cHBldGVlci0zLjgnLFxuICB9KTtcbn0pO1xuXG50ZXN0KCdjbGVhbnVwLkxBTUJEQSBpbnRyb2R1Y2VzIGN1c3RvbSByZXNvdXJjZSB0byBkZWxldGUgbGFtYmRhJywgKCkgPT4ge1xuICAvLyBHSVZFTlxuICBjb25zdCBzdGFjayA9IG5ldyBTdGFjaygpO1xuXG4gIC8vIFdIRU5cbiAgbmV3IHN5bnRoZXRpY3MuQ2FuYXJ5KHN0YWNrLCAnQ2FuYXJ5Jywge1xuICAgIHRlc3Q6IHN5bnRoZXRpY3MuVGVzdC5jdXN0b20oe1xuICAgICAgaGFuZGxlcjogJ2luZGV4LmhhbmRsZXInLFxuICAgICAgY29kZTogc3ludGhldGljcy5Db2RlLmZyb21JbmxpbmUoJy8qIFN5bnRoZXRpY3MgaGFuZGxlciBjb2RlJyksXG4gICAgfSksXG4gICAgY2xlYW51cDogc3ludGhldGljcy5DbGVhbnVwLkxBTUJEQSxcbiAgICBydW50aW1lOiBzeW50aGV0aWNzLlJ1bnRpbWUuU1lOVEhFVElDU19OT0RFSlNfUFVQUEVURUVSXzNfOCxcbiAgfSk7XG5cbiAgLy8gVEhFTlxuICBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spLnJlc291cmNlQ291bnRJcygnQ3VzdG9tOjpTeW50aGV0aWNzQXV0b0RlbGV0ZVVuZGVybHlpbmdSZXNvdXJjZXMnLCAxKTtcbn0pO1xuXG50ZXN0KCdDYW5hcnkgY2FuIGhhdmUgZ2VuZXJhdGVkIG5hbWUnLCAoKSA9PiB7XG4gIC8vIEdJVkVOXG4gIGNvbnN0IHN0YWNrID0gbmV3IFN0YWNrKCk7XG5cbiAgLy8gV0hFTlxuICBuZXcgc3ludGhldGljcy5DYW5hcnkoc3RhY2ssICdDYW5hcnknLCB7XG4gICAgdGVzdDogc3ludGhldGljcy5UZXN0LmN1c3RvbSh7XG4gICAgICBoYW5kbGVyOiAnaW5kZXguaGFuZGxlcicsXG4gICAgICBjb2RlOiBzeW50aGV0aWNzLkNvZGUuZnJvbUlubGluZSgnLyogU3ludGhldGljcyBoYW5kbGVyIGNvZGUgKi8nKSxcbiAgICB9KSxcbiAgICBydW50aW1lOiBzeW50aGV0aWNzLlJ1bnRpbWUuU1lOVEhFVElDU19OT0RFSlNfUFVQUEVURUVSXzNfOCxcbiAgfSk7XG5cbiAgLy8gVEhFTlxuICBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spLmhhc1Jlc291cmNlUHJvcGVydGllcygnQVdTOjpTeW50aGV0aWNzOjpDYW5hcnknLCB7XG4gICAgTmFtZTogJ2NhbmFyeScsXG4gIH0pO1xufSk7XG5cbnRlc3QoJ05hbWUgdmFsaWRhdGlvbiBkb2VzIG5vdCBmYWlsIHdoZW4gdXNpbmcgVG9rZW5zJywgKCkgPT4ge1xuICAvLyBHSVZFTlxuICBjb25zdCBzdGFjayA9IG5ldyBTdGFjaygpO1xuXG4gIC8vIFdIRU5cbiAgbmV3IHN5bnRoZXRpY3MuQ2FuYXJ5KHN0YWNrLCAnQ2FuYXJ5Jywge1xuICAgIGNhbmFyeU5hbWU6IExhenkuc3RyaW5nKHsgcHJvZHVjZTogKCkgPT4gJ015IENhbmFyeScgfSksXG4gICAgdGVzdDogc3ludGhldGljcy5UZXN0LmN1c3RvbSh7XG4gICAgICBoYW5kbGVyOiAnaW5kZXguaGFuZGxlcicsXG4gICAgICBjb2RlOiBzeW50aGV0aWNzLkNvZGUuZnJvbUlubGluZSgnLyogU3ludGhldGljcyBoYW5kbGVyIGNvZGUgKi8nKSxcbiAgICB9KSxcbiAgICBydW50aW1lOiBzeW50aGV0aWNzLlJ1bnRpbWUuU1lOVEhFVElDU19OT0RFSlNfUFVQUEVURUVSXzNfOCxcbiAgfSk7XG5cbiAgLy8gVEhFTjogbm8gZXhjZXB0aW9uXG4gIFRlbXBsYXRlLmZyb21TdGFjayhzdGFjaykucmVzb3VyY2VDb3VudElzKCdBV1M6OlN5bnRoZXRpY3M6OkNhbmFyeScsIDEpO1xufSk7XG5cbnRlc3QoJ1Rocm93cyB3aGVuIG5hbWUgaXMgc3BlY2lmaWVkIGluY29ycmVjdGx5JywgKCkgPT4ge1xuICAvLyBHSVZFTlxuICBjb25zdCBzdGFjayA9IG5ldyBTdGFjaygpO1xuXG4gIC8vIFRIRU5cbiAgZXhwZWN0KCgpID0+IG5ldyBzeW50aGV0aWNzLkNhbmFyeShzdGFjaywgJ0NhbmFyeScsIHtcbiAgICBjYW5hcnlOYW1lOiAnTXkgQ2FuYXJ5JyxcbiAgICB0ZXN0OiBzeW50aGV0aWNzLlRlc3QuY3VzdG9tKHtcbiAgICAgIGhhbmRsZXI6ICdpbmRleC5oYW5kbGVyJyxcbiAgICAgIGNvZGU6IHN5bnRoZXRpY3MuQ29kZS5mcm9tSW5saW5lKCcvKiBTeW50aGV0aWNzIGhhbmRsZXIgY29kZSAqLycpLFxuICAgIH0pLFxuICAgIHJ1bnRpbWU6IHN5bnRoZXRpY3MuUnVudGltZS5TWU5USEVUSUNTX05PREVKU19QVVBQRVRFRVJfM184LFxuICB9KSlcbiAgICAudG9UaHJvd0Vycm9yKCdDYW5hcnkgbmFtZSBtdXN0IGJlIGxvd2VyY2FzZSwgbnVtYmVycywgaHlwaGVucywgb3IgdW5kZXJzY29yZXMgKGdvdCBcIk15IENhbmFyeVwiKScpO1xufSk7XG5cbnRlc3QoJ1Rocm93cyB3aGVuIG5hbWUgaGFzIG1vcmUgdGhhbiAyMSBjaGFyYWN0ZXJzJywgKCkgPT4ge1xuICAvLyBHSVZFTlxuICBjb25zdCBzdGFjayA9IG5ldyBTdGFjaygpO1xuXG4gIC8vIFRIRU5cbiAgZXhwZWN0KCgpID0+IG5ldyBzeW50aGV0aWNzLkNhbmFyeShzdGFjaywgJ0NhbmFyeScsIHtcbiAgICBjYW5hcnlOYW1lOiAnYScucmVwZWF0KDIyKSxcbiAgICB0ZXN0OiBzeW50aGV0aWNzLlRlc3QuY3VzdG9tKHtcbiAgICAgIGhhbmRsZXI6ICdpbmRleC5oYW5kbGVyJyxcbiAgICAgIGNvZGU6IHN5bnRoZXRpY3MuQ29kZS5mcm9tSW5saW5lKCcvKiBTeW50aGV0aWNzIGhhbmRsZXIgY29kZSAqLycpLFxuICAgIH0pLFxuICAgIHJ1bnRpbWU6IHN5bnRoZXRpY3MuUnVudGltZS5TWU5USEVUSUNTX05PREVKU19QVVBQRVRFRVJfM184LFxuICB9KSlcbiAgICAudG9UaHJvd0Vycm9yKGBDYW5hcnkgbmFtZSBpcyB0b28gbGFyZ2UsIG11c3QgYmUgYmV0d2VlbiAxIGFuZCAyMSBjaGFyYWN0ZXJzLCBidXQgaXMgMjIgKGdvdCBcIiR7J2EnLnJlcGVhdCgyMil9XCIpYCk7XG59KTtcblxudGVzdCgnQW4gZXhpc3Rpbmcgcm9sZSBjYW4gYmUgc3BlY2lmaWVkIGluc3RlYWQgb2YgYXV0by1jcmVhdGVkJywgKCkgPT4ge1xuICAvLyBHSVZFTlxuICBjb25zdCBzdGFjayA9IG5ldyBTdGFjaygpO1xuXG4gIGNvbnN0IHJvbGUgPSBuZXcgaWFtLlJvbGUoc3RhY2ssICdyb2xlJywge1xuICAgIGFzc3VtZWRCeTogbmV3IGlhbS5TZXJ2aWNlUHJpbmNpcGFsKCdsYW1iZGEuYW1hem9uYXdzLmNvbScpLFxuICB9KTtcblxuICAvLyByb2xlLmFkZFRvUG9saWN5KC8qIHJlcXVpcmVkIHBlcm1pc3Npb25zIHBlciB0aGUgZG9jdW1lbnRhdGlvbiAqLyk7XG5cbiAgLy8gV0hFTlxuICBuZXcgc3ludGhldGljcy5DYW5hcnkoc3RhY2ssICdDYW5hcnknLCB7XG4gICAgcm9sZSxcbiAgICB0ZXN0OiBzeW50aGV0aWNzLlRlc3QuY3VzdG9tKHtcbiAgICAgIGhhbmRsZXI6ICdpbmRleC5oYW5kbGVyJyxcbiAgICAgIGNvZGU6IHN5bnRoZXRpY3MuQ29kZS5mcm9tSW5saW5lKCcvKiBTeW50aGV0aWNzIGhhbmRsZXIgY29kZSAqLycpLFxuICAgIH0pLFxuICAgIHJ1bnRpbWU6IHN5bnRoZXRpY3MuUnVudGltZS5TWU5USEVUSUNTX05PREVKU19QVVBQRVRFRVJfM184LFxuICB9KTtcblxuICAvLyBUSEVOXG4gIFRlbXBsYXRlLmZyb21TdGFjayhzdGFjaykuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OlN5bnRoZXRpY3M6OkNhbmFyeScsIHtcbiAgICBFeGVjdXRpb25Sb2xlQXJuOiBzdGFjay5yZXNvbHZlKHJvbGUucm9sZUFybiksXG4gIH0pO1xufSk7XG5cbnRlc3QoJ0FuIGF1dG8tZ2VuZXJhdGVkIGJ1Y2tldCBjYW4gaGF2ZSBsaWZlY3ljbGUgcnVsZXMnLCAoKSA9PiB7XG4gIC8vIEdJVkVOXG4gIGNvbnN0IHN0YWNrID0gbmV3IFN0YWNrKCk7XG4gIGNvbnN0IGxpZmVjeWNsZVJ1bGVzID0gW3tcbiAgICBleHBpcmF0aW9uOiBEdXJhdGlvbi5kYXlzKDMwKSxcbiAgfV07XG5cbiAgLy8gV0hFTlxuICBuZXcgc3ludGhldGljcy5DYW5hcnkoc3RhY2ssICdDYW5hcnknLCB7XG4gICAgYXJ0aWZhY3RzQnVja2V0TGlmZWN5Y2xlUnVsZXM6IGxpZmVjeWNsZVJ1bGVzLFxuICAgIHRlc3Q6IHN5bnRoZXRpY3MuVGVzdC5jdXN0b20oe1xuICAgICAgaGFuZGxlcjogJ2luZGV4LmhhbmRsZXInLFxuICAgICAgY29kZTogc3ludGhldGljcy5Db2RlLmZyb21JbmxpbmUoJy8qIFN5bnRoZXRpY3MgaGFuZGxlciBjb2RlICovJyksXG4gICAgfSksXG4gICAgcnVudGltZTogc3ludGhldGljcy5SdW50aW1lLlNZTlRIRVRJQ1NfTk9ERUpTX1BVUFBFVEVFUl8zXzgsXG4gIH0pO1xuXG4gIC8vIFRIRU5cbiAgVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6UzM6OkJ1Y2tldCcsIHtcbiAgICBMaWZlY3ljbGVDb25maWd1cmF0aW9uOiB7XG4gICAgICBSdWxlczogW1xuICAgICAgICB7XG4gICAgICAgICAgRXhwaXJhdGlvbkluRGF5czogMzAsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH0sXG4gIH0pO1xufSk7XG5cbnRlc3QoJ0FuIGV4aXN0aW5nIGJ1Y2tldCBhbmQgcHJlZml4IGNhbiBiZSBzcGVjaWZpZWQgaW5zdGVhZCBvZiBhdXRvLWNyZWF0ZWQnLCAoKSA9PiB7XG4gIC8vIEdJVkVOXG4gIGNvbnN0IHN0YWNrID0gbmV3IFN0YWNrKCk7XG4gIGNvbnN0IGJ1Y2tldCA9IG5ldyBzMy5CdWNrZXQoc3RhY2ssICdteXRlc3RidWNrZXQnKTtcbiAgY29uc3QgcHJlZml4ID0gJ2NhbmFyeSc7XG5cbiAgLy8gV0hFTlxuICBuZXcgc3ludGhldGljcy5DYW5hcnkoc3RhY2ssICdDYW5hcnknLCB7XG4gICAgYXJ0aWZhY3RzQnVja2V0TG9jYXRpb246IHsgYnVja2V0LCBwcmVmaXggfSxcbiAgICB0ZXN0OiBzeW50aGV0aWNzLlRlc3QuY3VzdG9tKHtcbiAgICAgIGhhbmRsZXI6ICdpbmRleC5oYW5kbGVyJyxcbiAgICAgIGNvZGU6IHN5bnRoZXRpY3MuQ29kZS5mcm9tSW5saW5lKCcvKiBTeW50aGV0aWNzIGhhbmRsZXIgY29kZSAqLycpLFxuICAgIH0pLFxuICAgIHJ1bnRpbWU6IHN5bnRoZXRpY3MuUnVudGltZS5TWU5USEVUSUNTX05PREVKU19QVVBQRVRFRVJfM184LFxuICB9KTtcblxuICAvLyBUSEVOXG4gIFRlbXBsYXRlLmZyb21TdGFjayhzdGFjaykuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OlN5bnRoZXRpY3M6OkNhbmFyeScsIHtcbiAgICBBcnRpZmFjdFMzTG9jYXRpb246IHN0YWNrLnJlc29sdmUoYnVja2V0LnMzVXJsRm9yT2JqZWN0KHByZWZpeCkpLFxuICB9KTtcbn0pO1xuXG50ZXN0KCdSdW50aW1lIGNhbiBiZSBzcGVjaWZpZWQnLCAoKSA9PiB7XG4gIC8vIEdJVkVOXG4gIGNvbnN0IHN0YWNrID0gbmV3IFN0YWNrKCk7XG5cbiAgLy8gV0hFTlxuICBuZXcgc3ludGhldGljcy5DYW5hcnkoc3RhY2ssICdDYW5hcnknLCB7XG4gICAgcnVudGltZTogc3ludGhldGljcy5SdW50aW1lLlNZTlRIRVRJQ1NfTk9ERUpTX1BVUFBFVEVFUl8zXzgsXG4gICAgdGVzdDogc3ludGhldGljcy5UZXN0LmN1c3RvbSh7XG4gICAgICBoYW5kbGVyOiAnaW5kZXguaGFuZGxlcicsXG4gICAgICBjb2RlOiBzeW50aGV0aWNzLkNvZGUuZnJvbUlubGluZSgnLyogU3ludGhldGljcyBoYW5kbGVyIGNvZGUgKi8nKSxcbiAgICB9KSxcbiAgfSk7XG5cbiAgLy8gVEhFTlxuICBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spLmhhc1Jlc291cmNlUHJvcGVydGllcygnQVdTOjpTeW50aGV0aWNzOjpDYW5hcnknLCB7XG4gICAgUnVudGltZVZlcnNpb246ICdzeW4tbm9kZWpzLXB1cHBldGVlci0zLjgnLFxuICB9KTtcbn0pO1xuXG50ZXN0KCdQeXRob24gcnVudGltZSBjYW4gYmUgc3BlY2lmaWVkJywgKCkgPT4ge1xuICAvLyBHSVZFTlxuICBjb25zdCBzdGFjayA9IG5ldyBTdGFjaygpO1xuXG4gIC8vIFdIRU5cbiAgbmV3IHN5bnRoZXRpY3MuQ2FuYXJ5KHN0YWNrLCAnQ2FuYXJ5Jywge1xuICAgIHJ1bnRpbWU6IHN5bnRoZXRpY3MuUnVudGltZS5TWU5USEVUSUNTX1BZVEhPTl9TRUxFTklVTV8xXzMsXG4gICAgdGVzdDogc3ludGhldGljcy5UZXN0LmN1c3RvbSh7XG4gICAgICBoYW5kbGVyOiAnaW5kZXguaGFuZGxlcicsXG4gICAgICBjb2RlOiBzeW50aGV0aWNzLkNvZGUuZnJvbUlubGluZSgnIyBTeW50aGV0aWNzIGhhbmRsZXIgY29kZScpLFxuICAgIH0pLFxuICB9KTtcblxuICAvLyBUSEVOXG4gIFRlbXBsYXRlLmZyb21TdGFjayhzdGFjaykuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OlN5bnRoZXRpY3M6OkNhbmFyeScsIHtcbiAgICBSdW50aW1lVmVyc2lvbjogJ3N5bi1weXRob24tc2VsZW5pdW0tMS4zJyxcbiAgfSk7XG59KTtcblxudGVzdCgnZW52aXJvbm1lbnQgdmFyaWFibGVzIGNhbiBiZSBzcGVjaWZpZWQnLCAoKSA9PiB7XG4gIC8vIEdJVkVOXG4gIGNvbnN0IHN0YWNrID0gbmV3IFN0YWNrKCk7XG4gIGNvbnN0IGVudmlyb25tZW50VmFyaWFibGVzID0ge1xuICAgIFRFU1RfS0VZXzE6ICdURVNUX1ZBTFVFXzEnLFxuICAgIFRFU1RfS0VZXzI6ICdURVNUX1ZBTFVFXzInLFxuICB9O1xuXG4gIC8vIFdIRU5cbiAgbmV3IHN5bnRoZXRpY3MuQ2FuYXJ5KHN0YWNrLCAnQ2FuYXJ5Jywge1xuICAgIHJ1bnRpbWU6IHN5bnRoZXRpY3MuUnVudGltZS5TWU5USEVUSUNTX05PREVKU19QVVBQRVRFRVJfM184LFxuICAgIHRlc3Q6IHN5bnRoZXRpY3MuVGVzdC5jdXN0b20oe1xuICAgICAgaGFuZGxlcjogJ2luZGV4LmhhbmRsZXInLFxuICAgICAgY29kZTogc3ludGhldGljcy5Db2RlLmZyb21JbmxpbmUoJy8qIFN5bnRoZXRpY3MgaGFuZGxlciBjb2RlICovJyksXG4gICAgfSksXG4gICAgZW52aXJvbm1lbnRWYXJpYWJsZXM6IGVudmlyb25tZW50VmFyaWFibGVzLFxuICB9KTtcblxuICAvLyBUSEVOXG4gIFRlbXBsYXRlLmZyb21TdGFjayhzdGFjaykuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OlN5bnRoZXRpY3M6OkNhbmFyeScsIHtcbiAgICBSdW5Db25maWc6IHtcbiAgICAgIEVudmlyb25tZW50VmFyaWFibGVzOiBlbnZpcm9ubWVudFZhcmlhYmxlcyxcbiAgICB9LFxuICB9KTtcbn0pO1xuXG50ZXN0KCdlbnZpcm9ubWVudCB2YXJpYWJsZXMgYXJlIHNraXBwZWQgaWYgbm90IHByb3ZpZGVkJywgKCkgPT4ge1xuICAvLyBHSVZFTlxuICBjb25zdCBzdGFjayA9IG5ldyBTdGFjaygpO1xuXG4gIC8vIFdIRU5cbiAgbmV3IHN5bnRoZXRpY3MuQ2FuYXJ5KHN0YWNrLCAnQ2FuYXJ5Jywge1xuICAgIHJ1bnRpbWU6IHN5bnRoZXRpY3MuUnVudGltZS5TWU5USEVUSUNTX05PREVKU19QVVBQRVRFRVJfM184LFxuICAgIHRlc3Q6IHN5bnRoZXRpY3MuVGVzdC5jdXN0b20oe1xuICAgICAgaGFuZGxlcjogJ2luZGV4LmhhbmRsZXInLFxuICAgICAgY29kZTogc3ludGhldGljcy5Db2RlLmZyb21JbmxpbmUoJy8qIFN5bnRoZXRpY3MgaGFuZGxlciBjb2RlICovJyksXG4gICAgfSksXG4gIH0pO1xuXG4gIC8vIFRIRU5cbiAgVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6U3ludGhldGljczo6Q2FuYXJ5Jywge1xuICAgIFJ1bkNvbmZpZzogTWF0Y2guYWJzZW50KCksXG4gIH0pO1xufSk7XG5cbnRlc3QoJ1J1bnRpbWUgY2FuIGJlIGN1c3RvbWl6ZWQnLCAoKSA9PiB7XG4gIC8vIEdJVkVOXG4gIGNvbnN0IHN0YWNrID0gbmV3IFN0YWNrKCk7XG5cbiAgLy8gV0hFTlxuICBuZXcgc3ludGhldGljcy5DYW5hcnkoc3RhY2ssICdDYW5hcnknLCB7XG4gICAgcnVudGltZTogbmV3IHN5bnRoZXRpY3MuUnVudGltZSgnZmFuY3ktZnV0dXJlLXJ1bnRpbWUtMTMzNy40MicsIHN5bnRoZXRpY3MuUnVudGltZUZhbWlseS5PVEhFUiksXG4gICAgdGVzdDogc3ludGhldGljcy5UZXN0LmN1c3RvbSh7XG4gICAgICBoYW5kbGVyOiAnaW5kZXguaGFuZGxlcicsXG4gICAgICBjb2RlOiBzeW50aGV0aWNzLkNvZGUuZnJvbUlubGluZSgnLyogU3ludGhldGljcyBoYW5kbGVyIGNvZGUgKi8nKSxcbiAgICB9KSxcbiAgfSk7XG5cbiAgLy8gVEhFTlxuICBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spLmhhc1Jlc291cmNlUHJvcGVydGllcygnQVdTOjpTeW50aGV0aWNzOjpDYW5hcnknLCB7XG4gICAgUnVudGltZVZlcnNpb246ICdmYW5jeS1mdXR1cmUtcnVudGltZS0xMzM3LjQyJyxcbiAgfSk7XG59KTtcblxudGVzdCgnU2NoZWR1bGUgY2FuIGJlIHNldCB3aXRoIFJhdGUnLCAoKSA9PiB7XG4gIC8vIEdJVkVOXG4gIGNvbnN0IHN0YWNrID0gbmV3IFN0YWNrKCk7XG5cbiAgLy8gV0hFTlxuICBuZXcgc3ludGhldGljcy5DYW5hcnkoc3RhY2ssICdDYW5hcnknLCB7XG4gICAgc2NoZWR1bGU6IHN5bnRoZXRpY3MuU2NoZWR1bGUucmF0ZShEdXJhdGlvbi5taW51dGVzKDMpKSxcbiAgICB0ZXN0OiBzeW50aGV0aWNzLlRlc3QuY3VzdG9tKHtcbiAgICAgIGhhbmRsZXI6ICdpbmRleC5oYW5kbGVyJyxcbiAgICAgIGNvZGU6IHN5bnRoZXRpY3MuQ29kZS5mcm9tSW5saW5lKCcvKiBTeW50aGV0aWNzIGhhbmRsZXIgY29kZSAqLycpLFxuICAgIH0pLFxuICAgIHJ1bnRpbWU6IHN5bnRoZXRpY3MuUnVudGltZS5TWU5USEVUSUNTX05PREVKU19QVVBQRVRFRVJfM184LFxuICB9KTtcblxuICAvLyBUSEVOXG4gIFRlbXBsYXRlLmZyb21TdGFjayhzdGFjaykuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OlN5bnRoZXRpY3M6OkNhbmFyeScsIHtcbiAgICBTY2hlZHVsZTogTWF0Y2gub2JqZWN0TGlrZSh7IEV4cHJlc3Npb246ICdyYXRlKDMgbWludXRlcyknIH0pLFxuICB9KTtcbn0pO1xuXG50ZXN0KCdTY2hlZHVsZSBjYW4gYmUgc2V0IHRvIDEgbWludXRlJywgKCkgPT4ge1xuICAvLyBHSVZFTlxuICBjb25zdCBzdGFjayA9IG5ldyBTdGFjaygpO1xuXG4gIC8vIFdIRU5cbiAgbmV3IHN5bnRoZXRpY3MuQ2FuYXJ5KHN0YWNrLCAnQ2FuYXJ5Jywge1xuICAgIHNjaGVkdWxlOiBzeW50aGV0aWNzLlNjaGVkdWxlLnJhdGUoRHVyYXRpb24ubWludXRlcygxKSksXG4gICAgdGVzdDogc3ludGhldGljcy5UZXN0LmN1c3RvbSh7XG4gICAgICBoYW5kbGVyOiAnaW5kZXguaGFuZGxlcicsXG4gICAgICBjb2RlOiBzeW50aGV0aWNzLkNvZGUuZnJvbUlubGluZSgnLyogU3ludGhldGljcyBoYW5kbGVyIGNvZGUgKi8nKSxcbiAgICB9KSxcbiAgICBydW50aW1lOiBzeW50aGV0aWNzLlJ1bnRpbWUuU1lOVEhFVElDU19OT0RFSlNfUFVQUEVURUVSXzNfOCxcbiAgfSk7XG5cbiAgLy8gVEhFTlxuICBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spLmhhc1Jlc291cmNlUHJvcGVydGllcygnQVdTOjpTeW50aGV0aWNzOjpDYW5hcnknLCB7XG4gICAgU2NoZWR1bGU6IE1hdGNoLm9iamVjdExpa2UoeyBFeHByZXNzaW9uOiAncmF0ZSgxIG1pbnV0ZSknIH0pLFxuICB9KTtcbn0pO1xuXG50ZXN0KCdTY2hlZHVsZSBjYW4gYmUgc2V0IHdpdGggQ3JvbicsICgpID0+IHtcbiAgLy8gR0lWRU5cbiAgY29uc3Qgc3RhY2sgPSBuZXcgU3RhY2soKTtcblxuICAvLyBXSEVOXG4gIG5ldyBzeW50aGV0aWNzLkNhbmFyeShzdGFjaywgJ0NhbmFyeScsIHtcbiAgICBzY2hlZHVsZTogc3ludGhldGljcy5TY2hlZHVsZS5jcm9uKHsgbWludXRlOiAnMzAnIH0pLFxuICAgIHRlc3Q6IHN5bnRoZXRpY3MuVGVzdC5jdXN0b20oe1xuICAgICAgaGFuZGxlcjogJ2luZGV4LmhhbmRsZXInLFxuICAgICAgY29kZTogc3ludGhldGljcy5Db2RlLmZyb21JbmxpbmUoJy8qIFN5bnRoZXRpY3MgaGFuZGxlciBjb2RlICovJyksXG4gICAgfSksXG4gICAgcnVudGltZTogc3ludGhldGljcy5SdW50aW1lLlNZTlRIRVRJQ1NfTk9ERUpTX1BVUFBFVEVFUl8zXzgsXG4gIH0pO1xuXG4gIC8vIFRIRU5cbiAgVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6U3ludGhldGljczo6Q2FuYXJ5Jywge1xuICAgIFNjaGVkdWxlOiBNYXRjaC5vYmplY3RMaWtlKHsgRXhwcmVzc2lvbjogJ2Nyb24oMzAgKiAqICogPyAqKScgfSksXG4gIH0pO1xufSk7XG5cbnRlc3QoJ1NjaGVkdWxlIGNhbiBiZSBzZXQgd2l0aCBFeHByZXNzaW9uJywgKCkgPT4ge1xuICAvLyBHSVZFTlxuICBjb25zdCBzdGFjayA9IG5ldyBTdGFjaygpO1xuXG4gIC8vIFdIRU5cbiAgbmV3IHN5bnRoZXRpY3MuQ2FuYXJ5KHN0YWNrLCAnQ2FuYXJ5Jywge1xuICAgIHNjaGVkdWxlOiBzeW50aGV0aWNzLlNjaGVkdWxlLmV4cHJlc3Npb24oJ3JhdGUoMSBob3VyKScpLFxuICAgIHRlc3Q6IHN5bnRoZXRpY3MuVGVzdC5jdXN0b20oe1xuICAgICAgaGFuZGxlcjogJ2luZGV4LmhhbmRsZXInLFxuICAgICAgY29kZTogc3ludGhldGljcy5Db2RlLmZyb21JbmxpbmUoJy8qIFN5bnRoZXRpY3MgaGFuZGxlciBjb2RlICovJyksXG4gICAgfSksXG4gICAgcnVudGltZTogc3ludGhldGljcy5SdW50aW1lLlNZTlRIRVRJQ1NfTk9ERUpTX1BVUFBFVEVFUl8zXzgsXG4gIH0pO1xuXG4gIC8vIFRIRU5cbiAgVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6U3ludGhldGljczo6Q2FuYXJ5Jywge1xuICAgIFNjaGVkdWxlOiBNYXRjaC5vYmplY3RMaWtlKHsgRXhwcmVzc2lvbjogJ3JhdGUoMSBob3VyKScgfSksXG4gIH0pO1xufSk7XG5cbnRlc3QoJ1NjaGVkdWxlIGNhbiBiZSBzZXQgdG8gcnVuIG9uY2UnLCAoKSA9PiB7XG4gIC8vIEdJVkVOXG4gIGNvbnN0IHN0YWNrID0gbmV3IFN0YWNrKCk7XG5cbiAgLy8gV0hFTlxuICBuZXcgc3ludGhldGljcy5DYW5hcnkoc3RhY2ssICdDYW5hcnknLCB7XG4gICAgc2NoZWR1bGU6IHN5bnRoZXRpY3MuU2NoZWR1bGUub25jZSgpLFxuICAgIHRlc3Q6IHN5bnRoZXRpY3MuVGVzdC5jdXN0b20oe1xuICAgICAgaGFuZGxlcjogJ2luZGV4LmhhbmRsZXInLFxuICAgICAgY29kZTogc3ludGhldGljcy5Db2RlLmZyb21JbmxpbmUoJy8qIFN5bnRoZXRpY3MgaGFuZGxlciBjb2RlICovJyksXG4gICAgfSksXG4gICAgcnVudGltZTogc3ludGhldGljcy5SdW50aW1lLlNZTlRIRVRJQ1NfTk9ERUpTX1BVUFBFVEVFUl8zXzgsXG4gIH0pO1xuXG4gIC8vIFRIRU5cbiAgVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6U3ludGhldGljczo6Q2FuYXJ5Jywge1xuICAgIFNjaGVkdWxlOiBNYXRjaC5vYmplY3RMaWtlKHsgRXhwcmVzc2lvbjogJ3JhdGUoMCBtaW51dGVzKScgfSksXG4gIH0pO1xufSk7XG5cbnRlc3QoJ1Rocm93cyB3aGVuIHJhdGUgYWJvdmUgNjAgbWludXRlcycsICgpID0+IHtcbiAgLy8gR0lWRU5cbiAgY29uc3Qgc3RhY2sgPSBuZXcgU3RhY2soKTtcblxuICAvLyBUSEVOXG4gIGV4cGVjdCgoKSA9PiBuZXcgc3ludGhldGljcy5DYW5hcnkoc3RhY2ssICdDYW5hcnknLCB7XG4gICAgc2NoZWR1bGU6IHN5bnRoZXRpY3MuU2NoZWR1bGUucmF0ZShEdXJhdGlvbi5taW51dGVzKDYxKSksXG4gICAgdGVzdDogc3ludGhldGljcy5UZXN0LmN1c3RvbSh7XG4gICAgICBoYW5kbGVyOiAnaW5kZXguaGFuZGxlcicsXG4gICAgICBjb2RlOiBzeW50aGV0aWNzLkNvZGUuZnJvbUlubGluZSgnLyogU3ludGhldGljcyBoYW5kbGVyIGNvZGUgKi8nKSxcbiAgICB9KSxcbiAgICBydW50aW1lOiBzeW50aGV0aWNzLlJ1bnRpbWUuU1lOVEhFVElDU19OT0RFSlNfUFVQUEVURUVSXzNfOCxcbiAgfSkpXG4gICAgLnRvVGhyb3dFcnJvcignU2NoZWR1bGUgZHVyYXRpb24gbXVzdCBiZSBiZXR3ZWVuIDEgYW5kIDYwIG1pbnV0ZXMnKTtcbn0pO1xuXG50ZXN0KCdUaHJvd3Mgd2hlbiByYXRlIGFib3ZlIGlzIG5vdCBhIHdob2xlIG51bWJlciBvZiBtaW51dGVzJywgKCkgPT4ge1xuICAvLyBHSVZFTlxuICBjb25zdCBzdGFjayA9IG5ldyBTdGFjaygpO1xuXG4gIC8vIFRIRU5cbiAgZXhwZWN0KCgpID0+IG5ldyBzeW50aGV0aWNzLkNhbmFyeShzdGFjaywgJ0NhbmFyeScsIHtcbiAgICBzY2hlZHVsZTogc3ludGhldGljcy5TY2hlZHVsZS5yYXRlKER1cmF0aW9uLnNlY29uZHMoNTkpKSxcbiAgICB0ZXN0OiBzeW50aGV0aWNzLlRlc3QuY3VzdG9tKHtcbiAgICAgIGhhbmRsZXI6ICdpbmRleC5oYW5kbGVyJyxcbiAgICAgIGNvZGU6IHN5bnRoZXRpY3MuQ29kZS5mcm9tSW5saW5lKCcvKiBTeW50aGV0aWNzIGhhbmRsZXIgY29kZSAqLycpLFxuICAgIH0pLFxuICAgIHJ1bnRpbWU6IHN5bnRoZXRpY3MuUnVudGltZS5TWU5USEVUSUNTX05PREVKU19QVVBQRVRFRVJfM184LFxuICB9KSlcbiAgICAudG9UaHJvd0Vycm9yKCdcXCc1OSBzZWNvbmRzXFwnIGNhbm5vdCBiZSBjb252ZXJ0ZWQgaW50byBhIHdob2xlIG51bWJlciBvZiBtaW51dGVzLicpO1xufSk7XG5cbnRlc3QoJ0NhbiBzaGFyZSBhcnRpZmFjdHMgYnVja2V0IGJldHdlZW4gY2FuYXJpZXMnLCAoKSA9PiB7XG4gIC8vIEdJVkVOXG4gIGNvbnN0IHN0YWNrID0gbmV3IFN0YWNrKCk7XG5cbiAgLy8gV0hFTlxuICBjb25zdCBjYW5hcnkxID0gbmV3IHN5bnRoZXRpY3MuQ2FuYXJ5KHN0YWNrLCAnQ2FuYXJ5MScsIHtcbiAgICBzY2hlZHVsZTogc3ludGhldGljcy5TY2hlZHVsZS5vbmNlKCksXG4gICAgdGVzdDogc3ludGhldGljcy5UZXN0LmN1c3RvbSh7XG4gICAgICBoYW5kbGVyOiAnaW5kZXguaGFuZGxlcicsXG4gICAgICBjb2RlOiBzeW50aGV0aWNzLkNvZGUuZnJvbUlubGluZSgnLyogU3ludGhldGljcyBoYW5kbGVyIGNvZGUgKi8nKSxcbiAgICB9KSxcbiAgICBydW50aW1lOiBzeW50aGV0aWNzLlJ1bnRpbWUuU1lOVEhFVElDU19OT0RFSlNfUFVQUEVURUVSXzNfOCxcbiAgfSk7XG5cbiAgY29uc3QgY2FuYXJ5MiA9IG5ldyBzeW50aGV0aWNzLkNhbmFyeShzdGFjaywgJ0NhbmFyeTInLCB7XG4gICAgc2NoZWR1bGU6IHN5bnRoZXRpY3MuU2NoZWR1bGUub25jZSgpLFxuICAgIHRlc3Q6IHN5bnRoZXRpY3MuVGVzdC5jdXN0b20oe1xuICAgICAgaGFuZGxlcjogJ2luZGV4LmhhbmRsZXInLFxuICAgICAgY29kZTogc3ludGhldGljcy5Db2RlLmZyb21JbmxpbmUoJy8qIFN5bnRoZXRpY3MgaGFuZGxlciBjb2RlICovJyksXG4gICAgfSksXG4gICAgYXJ0aWZhY3RzQnVja2V0TG9jYXRpb246IHsgYnVja2V0OiBjYW5hcnkxLmFydGlmYWN0c0J1Y2tldCB9LFxuICAgIHJ1bnRpbWU6IHN5bnRoZXRpY3MuUnVudGltZS5TWU5USEVUSUNTX05PREVKU19QVVBQRVRFRVJfM184LFxuICB9KTtcblxuICAvLyBUSEVOXG4gIGV4cGVjdChjYW5hcnkxLmFydGlmYWN0c0J1Y2tldCkudG9FcXVhbChjYW5hcnkyLmFydGlmYWN0c0J1Y2tldCk7XG59KTtcblxudGVzdCgnY2FuIHNwZWNpZnkgY3VzdG9tIHRlc3QnLCAoKSA9PiB7XG4gIC8vIEdJVkVOXG4gIGNvbnN0IHN0YWNrID0gbmV3IFN0YWNrKCk7XG5cbiAgLy8gV0hFTlxuICBuZXcgc3ludGhldGljcy5DYW5hcnkoc3RhY2ssICdDYW5hcnknLCB7XG4gICAgdGVzdDogc3ludGhldGljcy5UZXN0LmN1c3RvbSh7XG4gICAgICBoYW5kbGVyOiAnaW5kZXguaGFuZGxlcicsXG4gICAgICBjb2RlOiBzeW50aGV0aWNzLkNvZGUuZnJvbUlubGluZShgXG4gICAgICAgIGV4cG9ydHMuaGFuZGxlciA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhcXCdoZWxsbyB3b3JsZFxcJyk7XG4gICAgICAgIH07YCksXG4gICAgfSksXG4gICAgcnVudGltZTogc3ludGhldGljcy5SdW50aW1lLlNZTlRIRVRJQ1NfTk9ERUpTX1BVUFBFVEVFUl8zXzgsXG4gIH0pO1xuXG4gIC8vIFRIRU5cbiAgVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6U3ludGhldGljczo6Q2FuYXJ5Jywge1xuICAgIENvZGU6IHtcbiAgICAgIEhhbmRsZXI6ICdpbmRleC5oYW5kbGVyJyxcbiAgICAgIFNjcmlwdDogYFxuICAgICAgICBleHBvcnRzLmhhbmRsZXIgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc29sZS5sb2coXFwnaGVsbG8gd29ybGRcXCcpO1xuICAgICAgICB9O2AsXG4gICAgfSxcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoJ2NhbmFyeSBpbiBhIHZwYycsICgpID0+IHtcbiAgdGVzdCgnY2FuIHNwZWNpZnkgdnBjJywgKCkgPT4ge1xuICAgIC8vIEdJVkVOXG4gICAgY29uc3Qgc3RhY2sgPSBuZXcgU3RhY2soKTtcbiAgICBjb25zdCB2cGMgPSBuZXcgZWMyLlZwYyhzdGFjaywgJ1ZQQycsIHsgbWF4QXpzOiAyIH0pO1xuXG4gICAgLy8gV0hFTlxuICAgIG5ldyBzeW50aGV0aWNzLkNhbmFyeShzdGFjaywgJ0NhbmFyeScsIHtcbiAgICAgIHRlc3Q6IHN5bnRoZXRpY3MuVGVzdC5jdXN0b20oe1xuICAgICAgICBoYW5kbGVyOiAnaW5kZXguaGFuZGxlcicsXG4gICAgICAgIGNvZGU6IHN5bnRoZXRpY3MuQ29kZS5mcm9tSW5saW5lKGBcbiAgICAgICAgICBleHBvcnRzLmhhbmRsZXIgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcXCdoZWxsbyB3b3JsZFxcJyk7XG4gICAgICAgICAgfTtgKSxcbiAgICAgIH0pLFxuICAgICAgcnVudGltZTogc3ludGhldGljcy5SdW50aW1lLlNZTlRIRVRJQ1NfTk9ERUpTX1BVUFBFVEVFUl8zXzgsXG4gICAgICB2cGMsXG4gICAgfSk7XG5cbiAgICAvLyBUSEVOXG4gICAgVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6U3ludGhldGljczo6Q2FuYXJ5Jywge1xuICAgICAgQ29kZToge1xuICAgICAgICBIYW5kbGVyOiAnaW5kZXguaGFuZGxlcicsXG4gICAgICAgIFNjcmlwdDogYFxuICAgICAgICAgIGV4cG9ydHMuaGFuZGxlciA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFxcJ2hlbGxvIHdvcmxkXFwnKTtcbiAgICAgICAgICB9O2AsXG4gICAgICB9LFxuICAgICAgVlBDQ29uZmlnOiB7XG4gICAgICAgIFZwY0lkOiB7XG4gICAgICAgICAgUmVmOiBNYXRjaC5hbnlWYWx1ZSgpLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9KTtcbiAgfSk7XG5cbiAgdGVzdCgnZGVmYXVsdCBzZWN1cml0eSBncm91cCBhbmQgc3VibmV0cycsICgpID0+IHtcbiAgICAvLyBHSVZFTlxuICAgIGNvbnN0IHN0YWNrID0gbmV3IFN0YWNrKCk7XG4gICAgY29uc3QgdnBjID0gbmV3IGVjMi5WcGMoc3RhY2ssICdWUEMnLCB7IG1heEF6czogMiB9KTtcblxuICAgIC8vIFdIRU5cbiAgICBuZXcgc3ludGhldGljcy5DYW5hcnkoc3RhY2ssICdDYW5hcnknLCB7XG4gICAgICB0ZXN0OiBzeW50aGV0aWNzLlRlc3QuY3VzdG9tKHtcbiAgICAgICAgaGFuZGxlcjogJ2luZGV4LmhhbmRsZXInLFxuICAgICAgICBjb2RlOiBzeW50aGV0aWNzLkNvZGUuZnJvbUlubGluZShgXG4gICAgICAgICAgZXhwb3J0cy5oYW5kbGVyID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5sb2coXFwnaGVsbG8gd29ybGRcXCcpO1xuICAgICAgICAgIH07YCksXG4gICAgICB9KSxcbiAgICAgIHJ1bnRpbWU6IHN5bnRoZXRpY3MuUnVudGltZS5TWU5USEVUSUNTX05PREVKU19QVVBQRVRFRVJfM184LFxuICAgICAgdnBjLFxuICAgIH0pO1xuXG4gICAgLy8gVEhFTlxuICAgIFRlbXBsYXRlLmZyb21TdGFjayhzdGFjaykuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OlN5bnRoZXRpY3M6OkNhbmFyeScsIHtcbiAgICAgIENvZGU6IHtcbiAgICAgICAgSGFuZGxlcjogJ2luZGV4LmhhbmRsZXInLFxuICAgICAgICBTY3JpcHQ6IGBcbiAgICAgICAgICBleHBvcnRzLmhhbmRsZXIgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcXCdoZWxsbyB3b3JsZFxcJyk7XG4gICAgICAgICAgfTtgLFxuICAgICAgfSxcbiAgICAgIFZQQ0NvbmZpZzoge1xuICAgICAgICBWcGNJZDoge1xuICAgICAgICAgIFJlZjogTWF0Y2guYW55VmFsdWUoKSxcbiAgICAgICAgfSxcbiAgICAgICAgU2VjdXJpdHlHcm91cElkczogTWF0Y2guYW55VmFsdWUoKSxcbiAgICAgICAgU3VibmV0SWRzOiBbLi4udnBjLnByaXZhdGVTdWJuZXRzLm1hcChzdWJuZXQgPT4gKHsgUmVmOiBNYXRjaC5zdHJpbmdMaWtlUmVnZXhwKHN1Ym5ldC5ub2RlLmlkKSB9KSldLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfSk7XG5cbiAgdGVzdCgncHJvdmlkZWQgc2VjdXJpdHkgZ3JvdXAnLCAoKSA9PiB7XG4gICAgLy8gR0lWRU5cbiAgICBjb25zdCBzdGFjayA9IG5ldyBTdGFjaygpO1xuICAgIGNvbnN0IHZwYyA9IG5ldyBlYzIuVnBjKHN0YWNrLCAnVlBDJywgeyBtYXhBenM6IDIgfSk7XG4gICAgY29uc3Qgc2cgPSBuZXcgZWMyLlNlY3VyaXR5R3JvdXAoc3RhY2ssICdTZycsIHsgdnBjIH0pO1xuXG4gICAgLy8gV0hFTlxuICAgIG5ldyBzeW50aGV0aWNzLkNhbmFyeShzdGFjaywgJ0NhbmFyeScsIHtcbiAgICAgIHRlc3Q6IHN5bnRoZXRpY3MuVGVzdC5jdXN0b20oe1xuICAgICAgICBoYW5kbGVyOiAnaW5kZXguaGFuZGxlcicsXG4gICAgICAgIGNvZGU6IHN5bnRoZXRpY3MuQ29kZS5mcm9tSW5saW5lKGBcbiAgICAgICAgICBleHBvcnRzLmhhbmRsZXIgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcXCdoZWxsbyB3b3JsZFxcJyk7XG4gICAgICAgICAgfTtgKSxcbiAgICAgIH0pLFxuICAgICAgcnVudGltZTogc3ludGhldGljcy5SdW50aW1lLlNZTlRIRVRJQ1NfTk9ERUpTX1BVUFBFVEVFUl8zXzgsXG4gICAgICB2cGMsXG4gICAgICBzZWN1cml0eUdyb3VwczogW3NnXSxcbiAgICB9KTtcblxuICAgIC8vIFRIRU5cbiAgICBjb25zdCB0ZW1wbGF0ZSA9IFRlbXBsYXRlLmZyb21TdGFjayhzdGFjayk7XG4gICAgY29uc3Qgc2dUZW1wbGF0ZSA9IHRlbXBsYXRlLmZpbmRSZXNvdXJjZXMoJ0FXUzo6RUMyOjpTZWN1cml0eUdyb3VwJyk7XG4gICAgY29uc3Qgc2dJZHMgPSBPYmplY3Qua2V5cyhzZ1RlbXBsYXRlKTtcblxuICAgIGV4cGVjdChzZ0lkcykudG9IYXZlTGVuZ3RoKDEpO1xuXG4gICAgdGVtcGxhdGUuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OlN5bnRoZXRpY3M6OkNhbmFyeScsIHtcbiAgICAgIENvZGU6IHtcbiAgICAgICAgSGFuZGxlcjogJ2luZGV4LmhhbmRsZXInLFxuICAgICAgICBTY3JpcHQ6IGBcbiAgICAgICAgICBleHBvcnRzLmhhbmRsZXIgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcXCdoZWxsbyB3b3JsZFxcJyk7XG4gICAgICAgICAgfTtgLFxuICAgICAgfSxcbiAgICAgIFZQQ0NvbmZpZzoge1xuICAgICAgICBWcGNJZDoge1xuICAgICAgICAgIFJlZjogTWF0Y2guYW55VmFsdWUoKSxcbiAgICAgICAgfSxcbiAgICAgICAgU2VjdXJpdHlHcm91cElkczogW3sgJ0ZuOjpHZXRBdHQnOiBbc2dJZHNbMF0sICdHcm91cElkJ10gfV0sXG4gICAgICB9LFxuICAgIH0pO1xuICB9KTtcbn0pO1xuXG50ZXN0KCdSb2xlIHBvbGljeSBnZW5lcmF0ZWQgYXMgZXhwZWN0ZWQnLCAoKSA9PiB7XG4gIC8vIEdJVkVOXG4gIGNvbnN0IHN0YWNrID0gbmV3IFN0YWNrKCk7XG5cbiAgLy8gV0hFTlxuICBuZXcgc3ludGhldGljcy5DYW5hcnkoc3RhY2ssICdDYW5hcnknLCB7XG4gICAgdGVzdDogc3ludGhldGljcy5UZXN0LmN1c3RvbSh7XG4gICAgICBoYW5kbGVyOiAnaW5kZXguaGFuZGxlcicsXG4gICAgICBjb2RlOiBzeW50aGV0aWNzLkNvZGUuZnJvbUlubGluZSgnLyogU3ludGhldGljcyBoYW5kbGVyIGNvZGUgKi8nKSxcbiAgICB9KSxcbiAgICBydW50aW1lOiBzeW50aGV0aWNzLlJ1bnRpbWUuU1lOVEhFVElDU19OT0RFSlNfUFVQUEVURUVSXzNfOCxcbiAgfSk7XG5cbiAgLy8gVEhFTlxuICBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spLmhhc1Jlc291cmNlUHJvcGVydGllcygnQVdTOjpJQU06OlJvbGUnLCB7XG4gICAgUG9saWNpZXM6IFt7XG4gICAgICBQb2xpY3lEb2N1bWVudDoge1xuICAgICAgICBTdGF0ZW1lbnQ6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBBY3Rpb246ICdzMzpMaXN0QWxsTXlCdWNrZXRzJyxcbiAgICAgICAgICAgIEVmZmVjdDogJ0FsbG93JyxcbiAgICAgICAgICAgIFJlc291cmNlOiAnKicsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBBY3Rpb246ICdzMzpHZXRCdWNrZXRMb2NhdGlvbicsXG4gICAgICAgICAgICBFZmZlY3Q6ICdBbGxvdycsXG4gICAgICAgICAgICBSZXNvdXJjZToge1xuICAgICAgICAgICAgICAnRm46OkdldEF0dCc6IFtcbiAgICAgICAgICAgICAgICAnQ2FuYXJ5QXJ0aWZhY3RzQnVja2V0NEE2MEQzMkInLFxuICAgICAgICAgICAgICAgICdBcm4nLFxuICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIEFjdGlvbjogJ3MzOlB1dE9iamVjdCcsXG4gICAgICAgICAgICBFZmZlY3Q6ICdBbGxvdycsXG4gICAgICAgICAgICBSZXNvdXJjZToge1xuICAgICAgICAgICAgICAnRm46OkpvaW4nOiBbXG4gICAgICAgICAgICAgICAgJycsXG4gICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAnRm46OkdldEF0dCc6IFtcbiAgICAgICAgICAgICAgICAgICAgICAnQ2FuYXJ5QXJ0aWZhY3RzQnVja2V0NEE2MEQzMkInLFxuICAgICAgICAgICAgICAgICAgICAgICdBcm4nLFxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICcvKicsXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBBY3Rpb246ICdjbG91ZHdhdGNoOlB1dE1ldHJpY0RhdGEnLFxuICAgICAgICAgICAgQ29uZGl0aW9uOiB7XG4gICAgICAgICAgICAgIFN0cmluZ0VxdWFsczoge1xuICAgICAgICAgICAgICAgICdjbG91ZHdhdGNoOm5hbWVzcGFjZSc6ICdDbG91ZFdhdGNoU3ludGhldGljcycsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgRWZmZWN0OiAnQWxsb3cnLFxuICAgICAgICAgICAgUmVzb3VyY2U6ICcqJyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIEFjdGlvbjogW1xuICAgICAgICAgICAgICAnbG9nczpDcmVhdGVMb2dTdHJlYW0nLFxuICAgICAgICAgICAgICAnbG9nczpDcmVhdGVMb2dHcm91cCcsXG4gICAgICAgICAgICAgICdsb2dzOlB1dExvZ0V2ZW50cycsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgRWZmZWN0OiAnQWxsb3cnLFxuICAgICAgICAgICAgUmVzb3VyY2U6IHtcbiAgICAgICAgICAgICAgJ0ZuOjpKb2luJzogW1xuICAgICAgICAgICAgICAgICcnLFxuICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICdhcm46JyxcbiAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgUmVmOiAnQVdTOjpQYXJ0aXRpb24nLFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICc6bG9nczonLFxuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBSZWY6ICdBV1M6OlJlZ2lvbicsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgJzonLFxuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBSZWY6ICdBV1M6OkFjY291bnRJZCcsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgJzpsb2ctZ3JvdXA6L2F3cy9sYW1iZGEvY3dzeW4tKicsXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgfV0sXG4gIH0pO1xufSk7XG5cbnRlc3QoJ1Nob3VsZCBjcmVhdGUgaGFuZGxlciB3aXRoIHBhdGggZm9yIHJlY2VudCBydW50aW1lcycsICgpID0+IHtcbiAgLy8gR0lWRU5cbiAgY29uc3Qgc3RhY2sgPSBuZXcgU3RhY2soKTtcblxuICAvLyBXSEVOXG4gIG5ldyBzeW50aGV0aWNzLkNhbmFyeShzdGFjaywgJ0NhbmFyeScsIHtcbiAgICBjYW5hcnlOYW1lOiAnbXljYW5hcnknLFxuICAgIHRlc3Q6IHN5bnRoZXRpY3MuVGVzdC5jdXN0b20oe1xuICAgICAgaGFuZGxlcjogJ2ZvbGRlci9jYW5hcnkuZnVuY3Rpb25OYW1lJyxcbiAgICAgIGNvZGU6IHN5bnRoZXRpY3MuQ29kZS5mcm9tQXNzZXQocGF0aC5qb2luKF9fZGlybmFtZSwgJ2NhbmFyaWVzJykpLFxuICAgIH0pLFxuICAgIHJ1bnRpbWU6IHN5bnRoZXRpY3MuUnVudGltZS5TWU5USEVUSUNTX05PREVKU19QVVBQRVRFRVJfM184LFxuICB9KTtcblxuICAvLyBUSEVOXG4gIFRlbXBsYXRlLmZyb21TdGFjayhzdGFjaykuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OlN5bnRoZXRpY3M6OkNhbmFyeScsIHtcbiAgICBOYW1lOiAnbXljYW5hcnknLFxuICAgIENvZGU6IHtcbiAgICAgIEhhbmRsZXI6ICdmb2xkZXIvY2FuYXJ5LmZ1bmN0aW9uTmFtZScsXG4gICAgfSxcbiAgICBSdW50aW1lVmVyc2lvbjogJ3N5bi1ub2RlanMtcHVwcGV0ZWVyLTMuOCcsXG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKCdoYW5kbGVyIHZhbGlkYXRpb24nLCAoKSA9PiB7XG4gIHRlc3QoJ2xlZ2FjeSBydW50aW1lcycsICgpID0+IHtcbiAgICBjb25zdCBzdGFjayA9IG5ldyBTdGFjaygpO1xuICAgIGV4cGVjdCgoKSA9PiB7XG4gICAgICBuZXcgc3ludGhldGljcy5DYW5hcnkoc3RhY2ssICdDYW5hcnknLCB7XG4gICAgICAgIHRlc3Q6IHN5bnRoZXRpY3MuVGVzdC5jdXN0b20oe1xuICAgICAgICAgIGhhbmRsZXI6ICdpbmRleC5mdW5jdGlvbk5hbWUnLFxuICAgICAgICAgIGNvZGU6IHN5bnRoZXRpY3MuQ29kZS5mcm9tQXNzZXQocGF0aC5qb2luKF9fZGlybmFtZSwgJ2NhbmFyaWVzJykpLFxuICAgICAgICB9KSxcbiAgICAgICAgcnVudGltZTogc3ludGhldGljcy5SdW50aW1lLlNZTlRIRVRJQ1NfUFlUSE9OX1NFTEVOSVVNXzFfMCxcbiAgICAgIH0pO1xuICAgIH0pLnRvVGhyb3coL0NhbmFyeSBIYW5kbGVyIG11c3QgYmUgc3BlY2lmaWVkIGFzICdmaWxlTmFtZS5oYW5kbGVyJyBmb3IgbGVnYWN5IHJ1bnRpbWVzLyk7XG4gIH0pO1xuXG4gIHRlc3QoJ3JlY2VudCBydW50aW1lcycsICgpID0+IHtcbiAgICBjb25zdCBzdGFjayA9IG5ldyBTdGFjaygpO1xuXG4gICAgZXhwZWN0KCgpID0+IHtcbiAgICAgIG5ldyBzeW50aGV0aWNzLkNhbmFyeShzdGFjaywgJ0NhbmFyeScsIHtcbiAgICAgICAgdGVzdDogc3ludGhldGljcy5UZXN0LmN1c3RvbSh7XG4gICAgICAgICAgaGFuZGxlcjogJ2ludmFsaWRIYW5kbGVyJyxcbiAgICAgICAgICBjb2RlOiBzeW50aGV0aWNzLkNvZGUuZnJvbUFzc2V0KHBhdGguam9pbihfX2Rpcm5hbWUsICdjYW5hcmllcycpKSxcbiAgICAgICAgfSksXG4gICAgICAgIHJ1bnRpbWU6IHN5bnRoZXRpY3MuUnVudGltZS5TWU5USEVUSUNTX05PREVKU19QVVBQRVRFRVJfM185LFxuICAgICAgfSk7XG4gICAgfSkudG9UaHJvdygvQ2FuYXJ5IEhhbmRsZXIgbXVzdCBiZSBzcGVjaWZpZWQgZWl0aGVyIGFzICdmaWxlTmFtZS5oYW5kbGVyJywgJ2ZpbGVOYW1lLmZ1bmN0aW9uTmFtZScsIG9yICdmb2xkZXJcXC9maWxlTmFtZS5mdW5jdGlvbk5hbWUnLyk7XG5cbiAgICBleHBlY3QoKCkgPT4ge1xuICAgICAgbmV3IHN5bnRoZXRpY3MuQ2FuYXJ5KHN0YWNrLCAnQ2FuYXJ5MScsIHtcbiAgICAgICAgdGVzdDogc3ludGhldGljcy5UZXN0LmN1c3RvbSh7XG4gICAgICAgICAgaGFuZGxlcjogJ2NhbmFyeS5mdW5jdGlvbk5hbWUnLFxuICAgICAgICAgIGNvZGU6IHN5bnRoZXRpY3MuQ29kZS5mcm9tQXNzZXQocGF0aC5qb2luKF9fZGlybmFtZSwgJ2NhbmFyaWVzJykpLFxuICAgICAgICB9KSxcbiAgICAgICAgcnVudGltZTogc3ludGhldGljcy5SdW50aW1lLlNZTlRIRVRJQ1NfTk9ERUpTX1BVUFBFVEVFUl8zXzksXG4gICAgICB9KTtcbiAgICB9KS5ub3QudG9UaHJvdygpO1xuXG4gICAgZXhwZWN0KCgpID0+IHtcbiAgICAgIG5ldyBzeW50aGV0aWNzLkNhbmFyeShzdGFjaywgJ0NhbmFyeTInLCB7XG4gICAgICAgIHRlc3Q6IHN5bnRoZXRpY3MuVGVzdC5jdXN0b20oe1xuICAgICAgICAgIGhhbmRsZXI6ICdmb2xkZXIvY2FuYXJ5LmZ1bmN0aW9uTmFtZScsXG4gICAgICAgICAgY29kZTogc3ludGhldGljcy5Db2RlLmZyb21Bc3NldChwYXRoLmpvaW4oX19kaXJuYW1lLCAnY2FuYXJpZXMnKSksXG4gICAgICAgIH0pLFxuICAgICAgICBydW50aW1lOiBzeW50aGV0aWNzLlJ1bnRpbWUuU1lOVEhFVElDU19OT0RFSlNfUFVQUEVURUVSXzNfOSxcbiAgICAgIH0pO1xuICAgIH0pLm5vdC50b1Rocm93KCk7XG4gIH0pO1xuXG4gIHRlc3QoJ2hhbmRsZXIgbGVuZ3RoJywgKCkgPT4ge1xuICAgIGNvbnN0IHN0YWNrID0gbmV3IFN0YWNrKCk7XG4gICAgZXhwZWN0KCgpID0+IHtcbiAgICAgIG5ldyBzeW50aGV0aWNzLkNhbmFyeShzdGFjaywgJ0NhbmFyeTEnLCB7XG4gICAgICAgIHRlc3Q6IHN5bnRoZXRpY3MuVGVzdC5jdXN0b20oe1xuICAgICAgICAgIGhhbmRsZXI6ICdsb25nSGFuZGxlck5hbWUnLnJlcGVhdCgxMCkgKyAnLmhhbmRsZXInLFxuICAgICAgICAgIGNvZGU6IHN5bnRoZXRpY3MuQ29kZS5mcm9tQXNzZXQocGF0aC5qb2luKF9fZGlybmFtZSwgJ2NhbmFyaWVzJykpLFxuICAgICAgICB9KSxcbiAgICAgICAgcnVudGltZTogc3ludGhldGljcy5SdW50aW1lLlNZTlRIRVRJQ1NfTk9ERUpTX1BVUFBFVEVFUl8zXzksXG4gICAgICB9KTtcbiAgICB9KS50b1Rocm93KC9DYW5hcnkgSGFuZGxlciBsZW5ndGggbXVzdCBiZSBiZXR3ZWVuIDEgYW5kIDEyOC8pO1xuICB9KTtcbn0pO1xuIl19 \ No newline at end of file diff --git a/packages/@aws-cdk/aws-synthetics-alpha/test/code.test.d.ts b/packages/@aws-cdk/aws-synthetics-alpha/test/code.test.d.ts deleted file mode 100644 index cb0ff5c3b541f..0000000000000 --- a/packages/@aws-cdk/aws-synthetics-alpha/test/code.test.d.ts +++ /dev/null @@ -1 +0,0 @@ -export {}; diff --git a/packages/@aws-cdk/aws-synthetics-alpha/test/code.test.js b/packages/@aws-cdk/aws-synthetics-alpha/test/code.test.js deleted file mode 100644 index 7381aa1bc9e28..0000000000000 --- a/packages/@aws-cdk/aws-synthetics-alpha/test/code.test.js +++ /dev/null @@ -1,220 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -const fs = require("fs"); -const path = require("path"); -const assertions_1 = require("aws-cdk-lib/assertions"); -const s3 = require("aws-cdk-lib/aws-s3"); -const aws_cdk_lib_1 = require("aws-cdk-lib"); -const cxapi = require("aws-cdk-lib/cx-api"); -const synthetics = require("../lib"); -const lib_1 = require("../lib"); -describe(synthetics.Code.fromInline, () => { - test('fromInline works', () => { - // GIVEN - const stack = new aws_cdk_lib_1.Stack(new aws_cdk_lib_1.App(), 'canaries'); - // WHEN - const inline = synthetics.Code.fromInline(` - exports.handler = async () => { - console.log(\'hello world\'); - };`); - // THEN - expect(inline.bind(stack, 'index.handler', lib_1.RuntimeFamily.NODEJS).inlineCode).toEqual(` - exports.handler = async () => { - console.log(\'hello world\'); - };`); - }); - test('fails if empty', () => { - expect(() => synthetics.Code.fromInline('')) - .toThrowError('Canary inline code cannot be empty'); - }); - test('fails if handler is not "index.handler"', () => { - // GIVEN - const stack = new aws_cdk_lib_1.Stack(new aws_cdk_lib_1.App(), 'canaries'); - // THEN - expect(() => synthetics.Code.fromInline('code').bind(stack, 'canary.handler', lib_1.RuntimeFamily.NODEJS)) - .toThrowError('The handler for inline code must be "index.handler" (got "canary.handler")'); - }); -}); -describe(synthetics.Code.fromAsset, () => { - test('fromAsset works for node runtimes', () => { - // GIVEN - const stack = new aws_cdk_lib_1.Stack(new aws_cdk_lib_1.App(), 'canaries'); - // WHEN - const directoryAsset = synthetics.Code.fromAsset(path.join(__dirname, 'canaries')); - new synthetics.Canary(stack, 'Canary', { - test: synthetics.Test.custom({ - handler: 'canary.handler', - code: directoryAsset, - }), - runtime: synthetics.Runtime.SYNTHETICS_NODEJS_PUPPETEER_3_8, - }); - // THEN - assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::Synthetics::Canary', { - Code: { - Handler: 'canary.handler', - S3Bucket: stack.resolve(directoryAsset.bind(stack, 'canary.handler', synthetics.RuntimeFamily.NODEJS).s3Location?.bucketName), - S3Key: stack.resolve(directoryAsset.bind(stack, 'canary.handler', synthetics.RuntimeFamily.NODEJS).s3Location?.objectKey), - }, - }); - }); - test('fromAsset works for python runtimes', () => { - // GIVEN - const stack = new aws_cdk_lib_1.Stack(new aws_cdk_lib_1.App(), 'canaries'); - // WHEN - const directoryAsset = synthetics.Code.fromAsset(path.join(__dirname, 'canaries')); - new synthetics.Canary(stack, 'Canary', { - test: synthetics.Test.custom({ - handler: 'canary.handler', - code: directoryAsset, - }), - runtime: synthetics.Runtime.SYNTHETICS_PYTHON_SELENIUM_1_3, - }); - // THEN - assertions_1.Template.fromStack(stack).hasResourceProperties('AWS::Synthetics::Canary', { - Code: { - Handler: 'canary.handler', - S3Bucket: stack.resolve(directoryAsset.bind(stack, 'canary.handler', synthetics.RuntimeFamily.PYTHON).s3Location?.bucketName), - S3Key: stack.resolve(directoryAsset.bind(stack, 'canary.handler', synthetics.RuntimeFamily.PYTHON).s3Location?.objectKey), - }, - }); - }); - test('only one Asset object gets created even if multiple canaries use the same AssetCode', () => { - // GIVEN - const app = new aws_cdk_lib_1.App({ - context: { - [cxapi.NEW_STYLE_STACK_SYNTHESIS_CONTEXT]: false, - }, - }); - const stack = new aws_cdk_lib_1.Stack(app, 'canaries'); - // WHEN - const directoryAsset = synthetics.Code.fromAsset(path.join(__dirname, 'canaries')); - new synthetics.Canary(stack, 'Canary1', { - test: synthetics.Test.custom({ - handler: 'canary.handler', - code: directoryAsset, - }), - runtime: synthetics.Runtime.SYNTHETICS_NODEJS_PUPPETEER_3_8, - }); - new synthetics.Canary(stack, 'Canary2', { - test: synthetics.Test.custom({ - handler: 'canary.handler', - code: directoryAsset, - }), - runtime: synthetics.Runtime.SYNTHETICS_NODEJS_PUPPETEER_3_8, - }); - // THEN - const assembly = app.synth(); - const synthesized = assembly.stacks[0]; - expect(synthesized.assets.length).toEqual(1); - }); - test('works when stack is a part of a stage', () => { - // GIVEN - const app = new aws_cdk_lib_1.App(); - const stage1 = new aws_cdk_lib_1.Stage(app, 'Stage1'); - const stage2 = new aws_cdk_lib_1.Stage(stage1, 'Stage2'); - const stack = new aws_cdk_lib_1.Stack(stage2); - // WHEN - const directoryAsset = synthetics.Code.fromAsset(path.join(__dirname, 'canaries')); - new synthetics.Canary(stack, 'Canary1', { - test: synthetics.Test.custom({ - handler: 'canary.handler', - code: directoryAsset, - }), - runtime: synthetics.Runtime.SYNTHETICS_NODEJS_PUPPETEER_3_8, - }); - }); - test('fails if path does not exist', () => { - const assetPath = path.join(__dirname, 'does-not-exist'); - expect(() => synthetics.Code.fromAsset(assetPath)) - .toThrowError(`${assetPath} is not a valid path`); - }); - test('fails if non-zip asset is used', () => { - // GIVEN - const stack = new aws_cdk_lib_1.Stack(new aws_cdk_lib_1.App(), 'canaries'); - // THEN - const assetPath = path.join(__dirname, 'canaries', 'nodejs', 'node_modules', 'canary.js'); - expect(() => synthetics.Code.fromAsset(assetPath).bind(stack, 'canary.handler', synthetics.RuntimeFamily.NODEJS)) - .toThrowError(`Asset must be a .zip file or a directory (${assetPath})`); - }); - test('fails if node runtime and "nodejs/node_modules" folder structure not used', () => { - // GIVEN - const stack = new aws_cdk_lib_1.Stack(new aws_cdk_lib_1.App(), 'canaries'); - // THEN - const assetPath = path.join(__dirname, 'canaries', 'nodejs', 'node_modules'); - expect(() => synthetics.Code.fromAsset(assetPath).bind(stack, 'canary.handler', synthetics.RuntimeFamily.NODEJS)) - .toThrowError(`The canary resource requires that the handler is present at "nodejs/node_modules/canary.js" but not found at ${assetPath} (https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Canaries_WritingCanary_Nodejs.html)`); - }); - test('fails if python runtime and "python" folder structure not used', () => { - // GIVEN - const stack = new aws_cdk_lib_1.Stack(new aws_cdk_lib_1.App(), 'canaries'); - // THEN - const assetPath = path.join(__dirname, 'canaries', 'python'); - expect(() => synthetics.Code.fromAsset(assetPath).bind(stack, 'canary.handler', synthetics.RuntimeFamily.PYTHON)) - .toThrowError(`The canary resource requires that the handler is present at "python/canary.py" but not found at ${assetPath} (https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Canaries_WritingCanary_Python.html)`); - }); - test('fails if handler is specified incorrectly', () => { - // GIVEN - const stack = new aws_cdk_lib_1.Stack(new aws_cdk_lib_1.App(), 'canaries'); - // THEN - const assetPath = path.join(__dirname, 'canaries', 'nodejs', 'node_modules'); - expect(() => synthetics.Code.fromAsset(assetPath).bind(stack, 'incorrect.handler', synthetics.RuntimeFamily.NODEJS)) - .toThrowError(`The canary resource requires that the handler is present at "nodejs/node_modules/incorrect.js" but not found at ${assetPath} (https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Canaries_WritingCanary_Nodejs.html)`); - }); - test('passes if bundling is specified', () => { - // GIVEN - const stack = new aws_cdk_lib_1.Stack(new aws_cdk_lib_1.App(), 'canaries'); - // WHEN - const assetPath = path.join(__dirname, 'canaries', 'nodejs', 'node_modules'); - const code = synthetics.Code.fromAsset(assetPath, { - bundling: { - image: aws_cdk_lib_1.DockerImage.fromRegistry('dummy'), - local: { - tryBundle(outputDir) { - const stageDir = path.join(outputDir, 'nodejs', 'node_modules'); - fs.mkdirSync(path.join(outputDir, 'nodejs')); - fs.mkdirSync(stageDir); - fs.copyFileSync(path.join(assetPath, 'canary.js'), path.join(stageDir, 'canary.js')); - return true; - }, - }, - }, - }); - // THEN - expect(() => code.bind(stack, 'canary.handler', synthetics.RuntimeFamily.NODEJS)) - .not.toThrow(); - }); - test('fails if bundling is specified but folder structure is wrong', () => { - // GIVEN - const stack = new aws_cdk_lib_1.Stack(new aws_cdk_lib_1.App(), 'canaries'); - // WHEN - const assetPath = path.join(__dirname, 'canaries', 'nodejs', 'node_modules'); - const code = synthetics.Code.fromAsset(assetPath, { - bundling: { - image: aws_cdk_lib_1.DockerImage.fromRegistry('dummy'), - local: { - tryBundle(outputDir) { - fs.copyFileSync(path.join(assetPath, 'canary.js'), path.join(outputDir, 'canary.js')); - return true; - }, - }, - }, - }); - // THEN - expect(() => code.bind(stack, 'canary.handler', synthetics.RuntimeFamily.NODEJS)) - .toThrowError(`The canary resource requires that the handler is present at "nodejs/node_modules/canary.js" but not found at ${assetPath} (https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Canaries_WritingCanary_Nodejs.html)`); - }); -}); -describe(synthetics.Code.fromBucket, () => { - test('fromBucket works', () => { - // GIVEN - const stack = new aws_cdk_lib_1.Stack(new aws_cdk_lib_1.App(), 'canaries'); - const bucket = new s3.Bucket(stack, 'CodeBucket'); - // WHEN - const code = synthetics.Code.fromBucket(bucket, 'code.js'); - const codeConfig = code.bind(stack, 'code.handler', lib_1.RuntimeFamily.NODEJS); - // THEN - expect(codeConfig.s3Location?.bucketName).toEqual(bucket.bucketName); - expect(codeConfig.s3Location?.objectKey).toEqual('code.js'); - }); -}); -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29kZS50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiY29kZS50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEseUJBQXlCO0FBQ3pCLDZCQUE2QjtBQUM3Qix1REFBa0Q7QUFDbEQseUNBQXlDO0FBQ3pDLDZDQUE2RDtBQUM3RCw0Q0FBNEM7QUFDNUMscUNBQXFDO0FBQ3JDLGdDQUF1QztBQUV2QyxRQUFRLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsR0FBRyxFQUFFO0lBQ3hDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxHQUFHLEVBQUU7UUFDNUIsUUFBUTtRQUNSLE1BQU0sS0FBSyxHQUFHLElBQUksbUJBQUssQ0FBQyxJQUFJLGlCQUFHLEVBQUUsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUUvQyxPQUFPO1FBQ1AsTUFBTSxNQUFNLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUM7OztTQUdyQyxDQUFDLENBQUM7UUFFUCxPQUFPO1FBQ1AsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLGVBQWUsRUFBRSxtQkFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLE9BQU8sQ0FBQzs7O1NBR2hGLENBQUMsQ0FBQztJQUNULENBQUMsQ0FBQyxDQUFDO0lBRUgsSUFBSSxDQUFDLGdCQUFnQixFQUFFLEdBQUcsRUFBRTtRQUMxQixNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUM7YUFDekMsWUFBWSxDQUFDLG9DQUFvQyxDQUFDLENBQUM7SUFDeEQsQ0FBQyxDQUFDLENBQUM7SUFFSCxJQUFJLENBQUMseUNBQXlDLEVBQUUsR0FBRyxFQUFFO1FBQ25ELFFBQVE7UUFDUixNQUFNLEtBQUssR0FBRyxJQUFJLG1CQUFLLENBQUMsSUFBSSxpQkFBRyxFQUFFLEVBQUUsVUFBVSxDQUFDLENB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QUM7QUFFSCxRQUFRLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsR0FBRyxFQUFFO0lBQ3hDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxHQUFHLEVBQUU7UUFDNUIsUUFBUTtRQUNSLE1BQU0sS0FBSyxHQUFHLElBQUksbUJBQUssQ0FBQyxJQUFJLGlCQUFHLEVBQUUsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUMvQyxNQUFNLE1BQU0sR0FBRyxJQUFJLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBRWxELE9BQU87UUFDUCxNQUFNLElBQUksR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDM0QsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsY0FBYyxFQUFFLG1CQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFMUUsT0FBTztRQUNQLE1BQU0sQ0FBQyxVQUFVLENBQUMsVUFBVSxFQUFFLFVBQVUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDckUsTUFBTSxDQUFDLFVBQVUsQ0FBQyxVQUFVLEVBQUUsU0FBUyxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQzlELENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBmcyBmcm9tICdmcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgVGVtcGxhdGUgfSBmcm9tICdhd3MtY2RrLWxpYi9hc3NlcnRpb25zJztcbmltcG9ydCAqIGFzIHMzIGZyb20gJ2F3cy1jZGstbGliL2F3cy1zMyc7XG5pbXBvcnQgeyBBcHAsIFN0YWdlLCBTdGFjaywgRG9ja2VySW1hZ2UgfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgKiBhcyBjeGFwaSBmcm9tICdhd3MtY2RrLWxpYi9jeC1hcGknO1xuaW1wb3J0ICogYXMgc3ludGhldGljcyBmcm9tICcuLi9saWInO1xuaW1wb3J0IHsgUnVudGltZUZhbWlseSB9IGZyb20gJy4uL2xpYic7XG5cbmRlc2NyaWJlKHN5bnRoZXRpY3MuQ29kZS5mcm9tSW5saW5lLCAoKSA9PiB7XG4gIHRlc3QoJ2Zyb21JbmxpbmUgd29ya3MnLCAoKSA9PiB7XG4gICAgLy8gR0lWRU5cbiAgICBjb25zdCBzdGFjayA9IG5ldyBTdGFjayhuZXcgQXBwKCksICdjYW5hcmllcycpO1xuXG4gICAgLy8gV0hFTlxuICAgIGNvbnN0IGlubGluZSA9IHN5bnRoZXRpY3MuQ29kZS5mcm9tSW5saW5lKGBcbiAgICAgIGV4cG9ydHMuaGFuZGxlciA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coXFwnaGVsbG8gd29ybGRcXCcpO1xuICAgICAgfTtgKTtcblxuICAgIC8vIFRIRU5cbiAgICBleHBlY3QoaW5saW5lLmJpbmQoc3RhY2ssICdpbmRleC5oYW5kbGVyJywgUnVudGltZUZhbWlseS5OT0RFSlMpLmlubGluZUNvZGUpLnRvRXF1YWwoYFxuICAgICAgZXhwb3J0cy5oYW5kbGVyID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZyhcXCdoZWxsbyB3b3JsZFxcJyk7XG4gICAgICB9O2ApO1xuICB9KTtcblxuICB0ZXN0KCdmYWlscyBpZiBlbXB0eScsICgpID0+IHtcbiAgICBleHBlY3QoKCkgPT4gc3ludGhldGljcy5Db2RlLmZyb21JbmxpbmUoJycpKVxuICAgICAgLnRvVGhyb3dFcnJvcignQ2FuYXJ5IGlubGluZSBjb2RlIGNhbm5vdCBiZSBlbXB0eScpO1xuICB9KTtcblxuICB0ZXN0KCdmYWlscyBpZiBoYW5kbGVyIGlzIG5vdCBcImluZGV4LmhhbmRsZXJcIicsICgpID0+IHtcbiAgICAvLyBHSVZFTlxuICAgIGNvbnN0IHN0YWNrID0gbmV3IFN0YWNrKG5ldyBBcHAoKSwgJ2NhbmFyaWVzJyk7XG5cbiAgICAvLyBUSEVOXG4gICAgZXhwZWN0KCgpID0+IHN5bnRoZXRpY3MuQ29kZS5mcm9tSW5saW5lKCdjb2RlJykuYmluZChzdGFjaywgJ2NhbmFyeS5oYW5kbGVyJywgUnVudGltZUZhbWlseS5OT0RFSlMpKVxuICAgICAgLnRvVGhyb3dFcnJvcignVGhlIGhhbmRsZXIgZm9yIGlubGluZSBjb2RlIG11c3QgYmUgXCJpbmRleC5oYW5kbGVyXCIgKGdvdCBcImNhbmFyeS5oYW5kbGVyXCIpJyk7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKHN5bnRoZXRpY3MuQ29kZS5mcm9tQXNzZXQsICgpID0+IHtcbiAgdGVzdCgnZnJvbUFzc2V0IHdvcmtzIGZvciBub2RlIHJ1bnRpbWVzJywgKCkgPT4ge1xuICAgIC8vIEdJVkVOXG4gICAgY29uc3Qgc3RhY2sgPSBuZXcgU3RhY2sobmV3IEFwcCgpLCAnY2FuYXJpZXMnKTtcblxuICAgIC8vIFdIRU5cbiAgICBjb25zdCBkaXJlY3RvcnlBc3NldCA9IHN5bnRoZXRpY3MuQ29kZS5mcm9tQXNzZXQocGF0aC5qb2luKF9fZGlybmFtZSwgJ2NhbmFyaWVzJykpO1xuICAgIG5ldyBzeW50aGV0aWNzLkNhbmFyeShzdGFjaywgJ0NhbmFyeScsIHtcbiAgICAgIHRlc3Q6IHN5bnRoZXRpY3MuVGVzdC5jdXN0b20oe1xuICAgICAgICBoYW5kbGVyOiAnY2FuYXJ5LmhhbmRsZXInLFxuICAgICAgICBjb2RlOiBkaXJlY3RvcnlBc3NldCxcbiAgICAgIH0pLFxuICAgICAgcnVudGltZTogc3ludGhldGljcy5SdW50aW1lLlNZTlRIRVRJQ1NfTk9ERUpTX1BVUFBFVEVFUl8zXzgsXG4gICAgfSk7XG5cbiAgICAvLyBUSEVOXG4gICAgVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6U3ludGhldGljczo6Q2FuYXJ5Jywge1xuICAgICAgQ29kZToge1xuICAgICAgICBIYW5kbGVyOiAnY2FuYXJ5LmhhbmRsZXInLFxuICAgICAgICBTM0J1Y2tldDogc3RhY2sucmVzb2x2ZShkaXJlY3RvcnlBc3NldC5iaW5kKHN0YWNrLCAnY2FuYXJ5LmhhbmRsZXInLCBzeW50aGV0aWNzLlJ1bnRpbWVGYW1pbHkuTk9ERUpTKS5zM0xvY2F0aW9uPy5idWNrZXROYW1lKSxcbiAgICAgICAgUzNLZXk6IHN0YWNrLnJlc29sdmUoZGlyZWN0b3J5QXNzZXQuYmluZChzdGFjaywgJ2NhbmFyeS5oYW5kbGVyJywgc3ludGhldGljcy5SdW50aW1lRmFtaWx5Lk5PREVKUykuczNMb2NhdGlvbj8ub2JqZWN0S2V5KSxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH0pO1xuXG4gIHRlc3QoJ2Zyb21Bc3NldCB3b3JrcyBmb3IgcHl0aG9uIHJ1bnRpbWVzJywgKCkgPT4ge1xuICAgIC8vIEdJVkVOXG4gICAgY29uc3Qgc3RhY2sgPSBuZXcgU3RhY2sobmV3IEFwcCgpLCAnY2FuYXJpZXMnKTtcblxuICAgIC8vIFdIRU5cbiAgICBjb25zdCBkaXJlY3RvcnlBc3NldCA9IHN5bnRoZXRpY3MuQ29kZS5mcm9tQXNzZXQocGF0aC5qb2luKF9fZGlybmFtZSwgJ2NhbmFyaWVzJykpO1xuICAgIG5ldyBzeW50aGV0aWNzLkNhbmFyeShzdGFjaywgJ0NhbmFyeScsIHtcbiAgICAgIHRlc3Q6IHN5bnRoZXRpY3MuVGVzdC5jdXN0b20oe1xuICAgICAgICBoYW5kbGVyOiAnY2FuYXJ5LmhhbmRsZXInLFxuICAgICAgICBjb2RlOiBkaXJlY3RvcnlBc3NldCxcbiAgICAgIH0pLFxuICAgICAgcnVudGltZTogc3ludGhldGljcy5SdW50aW1lLlNZTlRIRVRJQ1NfUFlUSE9OX1NFTEVOSVVNXzFfMyxcbiAgICB9KTtcblxuICAgIC8vIFRIRU5cbiAgICBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spLmhhc1Jlc291cmNlUHJvcGVydGllcygnQVdTOjpTeW50aGV0aWNzOjpDYW5hcnknLCB7XG4gICAgICBDb2RlOiB7XG4gICAgICAgIEhhbmRsZXI6ICdjYW5hcnkuaGFuZGxlcicsXG4gICAgICAgIFMzQnVja2V0OiBzdGFjay5yZXNvbHZlKGRpcmVjdG9yeUFzc2V0LmJpbmQoc3RhY2ssICdjYW5hcnkuaGFuZGxlcicsIHN5bnRoZXRpY3MuUnVudGltZUZhbWlseS5QWVRIT04pLnMzTG9jYXRpb24/LmJ1Y2tldE5hbWUpLFxuICAgICAgICBTM0tleTogc3RhY2sucmVzb2x2ZShkaXJlY3RvcnlBc3NldC5iaW5kKHN0YWNrLCAnY2FuYXJ5LmhhbmRsZXInLCBzeW50aGV0aWNzLlJ1bnRpbWVGYW1pbHkuUFlUSE9OKS5zM0xvY2F0aW9uPy5vYmplY3RLZXkpLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfSk7XG5cbiAgdGVzdCgnb25seSBvbmUgQXNzZXQgb2JqZWN0IGdldHMgY3JlYXRlZCBldmVuIGlmIG11bHRpcGxlIGNhbmFyaWVzIHVzZSB0aGUgc2FtZSBBc3NldENvZGUnLCAoKSA9PiB7XG4gICAgLy8gR0lWRU5cbiAgICBjb25zdCBhcHAgPSBuZXcgQXBwKHtcbiAgICAgIGNvbnRleHQ6IHtcbiAgICAgICAgW2N4YXBpLk5FV19TVFlMRV9TVEFDS19TWU5USEVTSVNfQ09OVEVYVF06IGZhbHNlLFxuICAgICAgfSxcbiAgICB9KTtcbiAgICBjb25zdCBzdGFjayA9IG5ldyBTdGFjayhhcHAsICdjYW5hcmllcycpO1xuXG4gICAgLy8gV0hFTlxuICAgIGNvbnN0IGRpcmVjdG9yeUFzc2V0ID0gc3ludGhldGljcy5Db2RlLmZyb21Bc3NldChwYXRoLmpvaW4oX19kaXJuYW1lLCAnY2FuYXJpZXMnKSk7XG4gICAgbmV3IHN5bnRoZXRpY3MuQ2FuYXJ5KHN0YWNrLCAnQ2FuYXJ5MScsIHtcbiAgICAgIHRlc3Q6IHN5bnRoZXRpY3MuVGVzdC5jdXN0b20oe1xuICAgICAgICBoYW5kbGVyOiAnY2FuYXJ5LmhhbmRsZXInLFxuICAgICAgICBjb2RlOiBkaXJlY3RvcnlBc3NldCxcbiAgICAgIH0pLFxuICAgICAgcnVudGltZTogc3ludGhldGljcy5SdW50aW1lLlNZTlRIRVRJQ1NfTk9ERUpTX1BVUFBFVEVFUl8zXzgsXG4gICAgfSk7XG5cbiAgICBuZXcgc3ludGhldGljcy5DYW5hcnkoc3RhY2ssICdDYW5hcnkyJywge1xuICAgICAgdGVzdDogc3ludGhldGljcy5UZXN0LmN1c3RvbSh7XG4gICAgICAgIGhhbmRsZXI6ICdjYW5hcnkuaGFuZGxlcicsXG4gICAgICAgIGNvZGU6IGRpcmVjdG9yeUFzc2V0LFxuICAgICAgfSksXG4gICAgICBydW50aW1lOiBzeW50aGV0aWNzLlJ1bnRpbWUuU1lOVEhFVElDU19OT0RFSlNfUFVQUEVURUVSXzNfOCxcbiAgICB9KTtcblxuICAgIC8vIFRIRU5cbiAgICBjb25zdCBhc3NlbWJseSA9IGFwcC5zeW50aCgpO1xuICAgIGNvbnN0IHN5bnRoZXNpemVkID0gYXNzZW1ibHkuc3RhY2tzWzBdO1xuXG4gICAgZXhwZWN0KHN5bnRoZXNpemVkLmFzc2V0cy5sZW5ndGgpLnRvRXF1YWwoMSk7XG4gIH0pO1xuXG4gIHRlc3QoJ3dvcmtzIHdoZW4gc3RhY2sgaXMgYSBwYXJ0IG9mIGEgc3RhZ2UnLCAoKSA9PiB7XG4gICAgLy8gR0lWRU5cbiAgICBjb25zdCBhcHAgPSBuZXcgQXBwKCk7XG4gICAgY29uc3Qgc3RhZ2UxID0gbmV3IFN0YWdlKGFwcCwgJ1N0YWdlMScpO1xuICAgIGNvbnN0IHN0YWdlMiA9IG5ldyBTdGFnZShzdGFnZTEsICdTdGFnZTInKTtcbiAgICBjb25zdCBzdGFjayA9IG5ldyBTdGFjayhzdGFnZTIpO1xuXG4gICAgLy8gV0hFTlxuICAgIGNvbnN0IGRpcmVjdG9yeUFzc2V0ID0gc3ludGhldGljcy5Db2RlLmZyb21Bc3NldChwYXRoLmpvaW4oX19kaXJuYW1lLCAnY2FuYXJpZXMnKSk7XG4gICAgbmV3IHN5bnRoZXRpY3MuQ2FuYXJ5KHN0YWNrLCAnQ2FuYXJ5MScsIHtcbiAgICAgIHRlc3Q6IHN5bnRoZXRpY3MuVGVzdC5jdXN0b20oe1xuICAgICAgICBoYW5kbGVyOiAnY2FuYXJ5LmhhbmRsZXInLFxuICAgICAgICBjb2RlOiBkaXJlY3RvcnlBc3NldCxcbiAgICAgIH0pLFxuICAgICAgcnVudGltZTogc3ludGhldGljcy5SdW50aW1lLlNZTlRIRVRJQ1NfTk9ERUpTX1BVUFBFVEVFUl8zXzgsXG4gICAgfSk7XG4gIH0pO1xuXG4gIHRlc3QoJ2ZhaWxzIGlmIHBhdGggZG9lcyBub3QgZXhpc3QnLCAoKSA9PiB7XG4gICAgY29uc3QgYXNzZXRQYXRoID0gcGF0aC5qb2luKF9fZGlybmFtZSwgJ2RvZXMtbm90LWV4aXN0Jyk7XG4gICAgZXhwZWN0KCgpID0+IHN5bnRoZXRpY3MuQ29kZS5mcm9tQXNzZXQoYXNzZXRQYXRoKSlcbiAgICAgIC50b1Rocm93RXJyb3IoYCR7YXNzZXRQYXRofSBpcyBub3QgYSB2YWxpZCBwYXRoYCk7XG4gIH0pO1xuXG4gIHRlc3QoJ2ZhaWxzIGlmIG5vbi16aXAgYXNzZXQgaXMgdXNlZCcsICgpID0+IHtcbiAgICAvLyBHSVZFTlxuICAgIGNvbnN0IHN0YWNrID0gbmV3IFN0YWNrKG5ldyBBcHAoKSwgJ2NhbmFyaWVzJyk7XG5cbiAgICAvLyBUSEVOXG4gICAgY29uc3QgYXNzZXRQYXRoID0gcGF0aC5qb2luKF9fZGlybmFtZSwgJ2NhbmFyaWVzJywgJ25vZGVqcycsICdub2RlX21vZHVsZXMnLCAnY2FuYXJ5LmpzJyk7XG4gICAgZXhwZWN0KCgpID0+IHN5bnRoZXRpY3MuQ29kZS5mcm9tQXNzZXQoYXNzZXRQYXRoKS5iaW5kKHN0YWNrLCAnY2FuYXJ5LmhhbmRsZXInLCBzeW50aGV0aWNzLlJ1bnRpbWVGYW1pbHkuTk9ERUpTKSlcbiAgICAgIC50b1Rocm93RXJyb3IoYEFzc2V0IG11c3QgYmUgYSAuemlwIGZpbGUgb3IgYSBkaXJlY3RvcnkgKCR7YXNzZXRQYXRofSlgKTtcbiAgfSk7XG5cbiAgdGVzdCgnZmFpbHMgaWYgbm9kZSBydW50aW1lIGFuZCBcIm5vZGVqcy9ub2RlX21vZHVsZXNcIiBmb2xkZXIgc3RydWN0dXJlIG5vdCB1c2VkJywgKCkgPT4ge1xuICAgIC8vIEdJVkVOXG4gICAgY29uc3Qgc3RhY2sgPSBuZXcgU3RhY2sobmV3IEFwcCgpLCAnY2FuYXJpZXMnKTtcblxuICAgIC8vIFRIRU5cbiAgICBjb25zdCBhc3NldFBhdGggPSBwYXRoLmpvaW4oX19kaXJuYW1lLCAnY2FuYXJpZXMnLCAnbm9kZWpzJywgJ25vZGVfbW9kdWxlcycpO1xuICAgIGV4cGVjdCgoKSA9PiBzeW50aGV0aWNzLkNvZGUuZnJvbUFzc2V0KGFzc2V0UGF0aCkuYmluZChzdGFjaywgJ2NhbmFyeS5oYW5kbGVyJywgc3ludGhldGljcy5SdW50aW1lRmFtaWx5Lk5PREVKUykpXG4gICAgICAudG9UaHJvd0Vycm9yKGBUaGUgY2FuYXJ5IHJlc291cmNlIHJlcXVpcmVzIHRoYXQgdGhlIGhhbmRsZXIgaXMgcHJlc2VudCBhdCBcIm5vZGVqcy9ub2RlX21vZHVsZXMvY2FuYXJ5LmpzXCIgYnV0IG5vdCBmb3VuZCBhdCAke2Fzc2V0UGF0aH0gKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZFdhdGNoL2xhdGVzdC9tb25pdG9yaW5nL0Nsb3VkV2F0Y2hfU3ludGhldGljc19DYW5hcmllc19Xcml0aW5nQ2FuYXJ5X05vZGVqcy5odG1sKWApO1xuICB9KTtcblxuICB0ZXN0KCdmYWlscyBpZiBweXRob24gcnVudGltZSBhbmQgXCJweXRob25cIiBmb2xkZXIgc3RydWN0dXJlIG5vdCB1c2VkJywgKCkgPT4ge1xuICAgIC8vIEdJVkVOXG4gICAgY29uc3Qgc3RhY2sgPSBuZXcgU3RhY2sobmV3IEFwcCgpLCAnY2FuYXJpZXMnKTtcblxuICAgIC8vIFRIRU5cbiAgICBjb25zdCBhc3NldFBhdGggPSBwYXRoLmpvaW4oX19kaXJuYW1lLCAnY2FuYXJpZXMnLCAncHl0aG9uJyk7XG4gICAgZXhwZWN0KCgpID0+IHN5bnRoZXRpY3MuQ29kZS5mcm9tQXNzZXQoYXNzZXRQYXRoKS5iaW5kKHN0YWNrLCAnY2FuYXJ5LmhhbmRsZXInLCBzeW50aGV0aWNzLlJ1bnRpbWVGYW1pbHkuUFlUSE9OKSlcbiAgICAgIC50b1Rocm93RXJyb3IoYFRoZSBjYW5hcnkgcmVzb3VyY2UgcmVxdWlyZXMgdGhhdCB0aGUgaGFuZGxlciBpcyBwcmVzZW50IGF0IFwicHl0aG9uL2NhbmFyeS5weVwiIGJ1dCBub3QgZm91bmQgYXQgJHthc3NldFBhdGh9IChodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRXYXRjaC9sYXRlc3QvbW9uaXRvcmluZy9DbG91ZFdhdGNoX1N5bnRoZXRpY3NfQ2FuYXJpZXNfV3JpdGluZ0NhbmFyeV9QeXRob24uaHRtbClgKTtcbiAgfSk7XG5cbiAgdGVzdCgnZmFpbHMgaWYgaGFuZGxlciBpcyBzcGVjaWZpZWQgaW5jb3JyZWN0bHknLCAoKSA9PiB7XG4gICAgLy8gR0lWRU5cbiAgICBjb25zdCBzdGFjayA9IG5ldyBTdGFjayhuZXcgQXBwKCksICdjYW5hcmllcycpO1xuXG4gICAgLy8gVEhFTlxuICAgIGNvbnN0IGFzc2V0UGF0aCA9IHBhdGguam9pbihfX2Rpcm5hbWUsICdjYW5hcmllcycsICdub2RlanMnLCAnbm9kZV9tb2R1bGVzJyk7XG4gICAgZXhwZWN0KCgpID0+IHN5bnRoZXRpY3MuQ29kZS5mcm9tQXNzZXQoYXNzZXRQYXRoKS5iaW5kKHN0YWNrLCAnaW5jb3JyZWN0LmhhbmRsZXInLCBzeW50aGV0aWNzLlJ1bnRpbWVGYW1pbHkuTk9ERUpTKSlcbiAgICAgIC50b1Rocm93RXJyb3IoYFRoZSBjYW5hcnkgcmVzb3VyY2UgcmVxdWlyZXMgdGhhdCB0aGUgaGFuZGxlciBpcyBwcmVzZW50IGF0IFwibm9kZWpzL25vZGVfbW9kdWxlcy9pbmNvcnJlY3QuanNcIiBidXQgbm90IGZvdW5kIGF0ICR7YXNzZXRQYXRofSAoaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkV2F0Y2gvbGF0ZXN0L21vbml0b3JpbmcvQ2xvdWRXYXRjaF9TeW50aGV0aWNzX0NhbmFyaWVzX1dyaXRpbmdDYW5hcnlfTm9kZWpzLmh0bWwpYCk7XG4gIH0pO1xuXG4gIHRlc3QoJ3Bhc3NlcyBpZiBidW5kbGluZyBpcyBzcGVjaWZpZWQnLCAoKSA9PiB7XG4gICAgLy8gR0lWRU5cbiAgICBjb25zdCBzdGFjayA9IG5ldyBTdGFjayhuZXcgQXBwKCksICdjYW5hcmllcycpO1xuXG4gICAgLy8gV0hFTlxuICAgIGNvbnN0IGFzc2V0UGF0aCA9IHBhdGguam9pbihfX2Rpcm5hbWUsICdjYW5hcmllcycsICdub2RlanMnLCAnbm9kZV9tb2R1bGVzJyk7XG4gICAgY29uc3QgY29kZSA9IHN5bnRoZXRpY3MuQ29kZS5mcm9tQXNzZXQoYXNzZXRQYXRoLCB7XG4gICAgICBidW5kbGluZzoge1xuICAgICAgICBpbWFnZTogRG9ja2VySW1hZ2UuZnJvbVJlZ2lzdHJ5KCdkdW1teScpLFxuICAgICAgICBsb2NhbDoge1xuICAgICAgICAgIHRyeUJ1bmRsZShvdXRwdXREaXIpIHtcbiAgICAgICAgICAgIGNvbnN0IHN0YWdlRGlyID0gcGF0aC5qb2luKG91dHB1dERpciwgJ25vZGVqcycsICdub2RlX21vZHVsZXMnKTtcbiAgICAgICAgICAgIGZzLm1rZGlyU3luYyhwYXRoLmpvaW4ob3V0cHV0RGlyLCAnbm9kZWpzJykpO1xuICAgICAgICAgICAgZnMubWtkaXJTeW5jKHN0YWdlRGlyKTtcbiAgICAgICAgICAgIGZzLmNvcHlGaWxlU3luYyhwYXRoLmpvaW4oYXNzZXRQYXRoLCAnY2FuYXJ5LmpzJyksIHBhdGguam9pbihzdGFnZURpciwgJ2NhbmFyeS5qcycpKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgLy8gVEhFTlxuICAgIGV4cGVjdCgoKSA9PiBjb2RlLmJpbmQoc3RhY2ssICdjYW5hcnkuaGFuZGxlcicsIHN5bnRoZXRpY3MuUnVudGltZUZhbWlseS5OT0RFSlMpKVxuICAgICAgLm5vdC50b1Rocm93KCk7XG4gIH0pO1xuXG4gIHRlc3QoJ2ZhaWxzIGlmIGJ1bmRsaW5nIGlzIHNwZWNpZmllZCBidXQgZm9sZGVyIHN0cnVjdHVyZSBpcyB3cm9uZycsICgpID0+IHtcbiAgICAvLyBHSVZFTlxuICAgIGNvbnN0IHN0YWNrID0gbmV3IFN0YWNrKG5ldyBBcHAoKSwgJ2NhbmFyaWVzJyk7XG5cbiAgICAvLyBXSEVOXG4gICAgY29uc3QgYXNzZXRQYXRoID0gcGF0aC5qb2luKF9fZGlybmFtZSwgJ2NhbmFyaWVzJywgJ25vZGVqcycsICdub2RlX21vZHVsZXMnKTtcbiAgICBjb25zdCBjb2RlID0gc3ludGhldGljcy5Db2RlLmZyb21Bc3NldChhc3NldFBhdGgsIHtcbiAgICAgIGJ1bmRsaW5nOiB7XG4gICAgICAgIGltYWdlOiBEb2NrZXJJbWFnZS5mcm9tUmVnaXN0cnkoJ2R1bW15JyksXG4gICAgICAgIGxvY2FsOiB7XG4gICAgICAgICAgdHJ5QnVuZGxlKG91dHB1dERpcikge1xuICAgICAgICAgICAgZnMuY29weUZpbGVTeW5jKHBhdGguam9pbihhc3NldFBhdGgsICdjYW5hcnkuanMnKSwgcGF0aC5qb2luKG91dHB1dERpciwgJ2NhbmFyeS5qcycpKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgLy8gVEhFTlxuICAgIGV4cGVjdCgoKSA9PiBjb2RlLmJpbmQoc3RhY2ssICdjYW5hcnkuaGFuZGxlcicsIHN5bnRoZXRpY3MuUnVudGltZUZhbWlseS5OT0RFSlMpKVxuICAgICAgLnRvVGhyb3dFcnJvcihgVGhlIGNhbmFyeSByZXNvdXJjZSByZXF1aXJlcyB0aGF0IHRoZSBoYW5kbGVyIGlzIHByZXNlbnQgYXQgXCJub2RlanMvbm9kZV9tb2R1bGVzL2NhbmFyeS5qc1wiIGJ1dCBub3QgZm91bmQgYXQgJHthc3NldFBhdGh9IChodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRXYXRjaC9sYXRlc3QvbW9uaXRvcmluZy9DbG91ZFdhdGNoX1N5bnRoZXRpY3NfQ2FuYXJpZXNfV3JpdGluZ0NhbmFyeV9Ob2RlanMuaHRtbClgKTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoc3ludGhldGljcy5Db2RlLmZyb21CdWNrZXQsICgpID0+IHtcbiAgdGVzdCgnZnJvbUJ1Y2tldCB3b3JrcycsICgpID0+IHtcbiAgICAvLyBHSVZFTlxuICAgIGNvbnN0IHN0YWNrID0gbmV3IFN0YWNrKG5ldyBBcHAoKSwgJ2NhbmFyaWVzJyk7XG4gICAgY29uc3QgYnVja2V0ID0gbmV3IHMzLkJ1Y2tldChzdGFjaywgJ0NvZGVCdWNrZXQnKTtcblxuICAgIC8vIFdIRU5cbiAgICBjb25zdCBjb2RlID0gc3ludGhldGljcy5Db2RlLmZyb21CdWNrZXQoYnVja2V0LCAnY29kZS5qcycpO1xuICAgIGNvbnN0IGNvZGVDb25maWcgPSBjb2RlLmJpbmQoc3RhY2ssICdjb2RlLmhhbmRsZXInLCBSdW50aW1lRmFtaWx5Lk5PREVKUyk7XG5cbiAgICAvLyBUSEVOXG4gICAgZXhwZWN0KGNvZGVDb25maWcuczNMb2NhdGlvbj8uYnVja2V0TmFtZSkudG9FcXVhbChidWNrZXQuYnVja2V0TmFtZSk7XG4gICAgZXhwZWN0KGNvZGVDb25maWcuczNMb2NhdGlvbj8ub2JqZWN0S2V5KS50b0VxdWFsKCdjb2RlLmpzJyk7XG4gIH0pO1xufSk7XG4iXX0= \ No newline at end of file diff --git a/packages/@aws-cdk/aws-synthetics-alpha/test/integ.canary-auto-delete-lambda.d.ts b/packages/@aws-cdk/aws-synthetics-alpha/test/integ.canary-auto-delete-lambda.d.ts deleted file mode 100644 index cb0ff5c3b541f..0000000000000 --- a/packages/@aws-cdk/aws-synthetics-alpha/test/integ.canary-auto-delete-lambda.d.ts +++ /dev/null @@ -1 +0,0 @@ -export {}; diff --git a/packages/@aws-cdk/aws-synthetics-alpha/test/integ.canary-auto-delete-lambda.js b/packages/@aws-cdk/aws-synthetics-alpha/test/integ.canary-auto-delete-lambda.js deleted file mode 100644 index e6743bc4b7caa..0000000000000 --- a/packages/@aws-cdk/aws-synthetics-alpha/test/integ.canary-auto-delete-lambda.js +++ /dev/null @@ -1,57 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -const aws_cdk_lib_1 = require("aws-cdk-lib"); -const integ_tests_alpha_1 = require("@aws-cdk/integ-tests-alpha"); -const synthetics = require("../lib"); -const custom_resources_1 = require("aws-cdk-lib/custom-resources"); -class TestStack extends aws_cdk_lib_1.Stack { - constructor(scope, id, props) { - super(scope, id, props); - new synthetics.Canary(this, 'Canary', { - canaryName: 'next', - runtime: synthetics.Runtime.SYNTHETICS_NODEJS_PUPPETEER_4_0, - test: synthetics.Test.custom({ - handler: 'index.handler', - code: synthetics.Code.fromInline(` - exports.handler = async () => { - console.log(\'hello world\'); - };`), - }), - cleanup: synthetics.Cleanup.LAMBDA, - }); - const canaryThatWillBeRemoved = new synthetics.Canary(this, 'CanaryRemoved', { - runtime: synthetics.Runtime.SYNTHETICS_NODEJS_PUPPETEER_4_0, - test: synthetics.Test.custom({ - handler: 'index.handler', - code: synthetics.Code.fromInline(` - exports.handler = async () => { - console.log(\'hello world\'); - };`), - }), - cleanup: synthetics.Cleanup.LAMBDA, - startAfterCreation: false, // otherwise we get error: canary is in a state that can't be deleted: RUNNING - }); - // Remove this canary immediately - // so we can test that a non-existing canary will not fail the auto-delete-lambda Custom Resource - new custom_resources_1.AwsCustomResource(this, 'DeleteCanary', { - onCreate: { - physicalResourceId: custom_resources_1.PhysicalResourceId.of(canaryThatWillBeRemoved.canaryName), - service: 'Synthetics', - action: 'deleteCanary', - parameters: { - Name: canaryThatWillBeRemoved.canaryName, - }, - }, - policy: custom_resources_1.AwsCustomResourcePolicy.fromSdkCalls({ - resources: custom_resources_1.AwsCustomResourcePolicy.ANY_RESOURCE, - }), - }); - } -} -const app = new aws_cdk_lib_1.App(); -new integ_tests_alpha_1.IntegTest(app, 'cdk-integ-synthetics-canary-auto-delete', { - testCases: [new TestStack(app, 'cdk-synthetics-canary-auto-delete')], - diffAssets: true, - stackUpdateWorkflow: false, // will error because this stack has a cr that deletes its own resources -}); -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZWcuY2FuYXJ5LWF1dG8tZGVsZXRlLWxhbWJkYS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImludGVnLmNhbmFyeS1hdXRvLWRlbGV0ZS1sYW1iZGEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSw2Q0FBcUQ7QUFDckQsa0VBQXVEO0FBRXZELHFDQUFxQztBQUNyQyxtRUFBOEc7QUFFOUcsTUFBTSxTQUFVLFNBQVEsbUJBQUs7SUFDM0IsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUFrQjtRQUMxRCxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUV4QixJQUFJLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRTtZQUNwQyxVQUFVLEVBQUUsTUFBTTtZQUNsQixPQUFPLEVBQUUsVUFBVSxDQUFDLE9BQU8sQ0FBQywrQkFBK0I7WUFDM0QsSUFBSSxFQUFFLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO2dCQUMzQixPQUFPLEVBQUUsZUFBZTtnQkFDeEIsSUFBSSxFQUFFLFVBQVUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDOzs7YUFHNUIsQ0FBQzthQUNQLENBQUM7WUFDRixPQUFPLEVBQUUsVUFBVSxDQUFDLE9BQU8sQ0FBQyxNQUFNO1NBQ25DLENBQUMsQ0FBQztRQUVILE1BQU0sdUJBQXVCLEdBQUcsSUFBSSxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxlQUFlLEVBQUU7WUFDM0UsT0FBTyxFQUFFLFVBQVUsQ0FBQyxPQUFPLENBQUMsK0JBQStCO1lBQzNELElBQUksRUFBRSxVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQztnQkFDM0IsT0FBTyxFQUFFLGVBQWU7Z0JBQ3hCLElBQUksRUFBRSxVQUFVLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQzs7O2FBRzVCLENBQUM7YUFDUCxDQUFDO1lBQ0YsT0FBTyxFQUFFLFVBQVUsQ0FBQyxPQUFPLENBQUMsTUFBTTtZQUNsQyxrQkFBa0IsRUFBRSxLQUFLLEVBQUUsOEVBQThFO1NBQzFHLENBQUMsQ0FBQztRQUVILGlDQUFpQztRQUNqQyxpR0FBaUc7UUFDakcsSUFBSSxvQ0FBaUIsQ0FBQyxJQUFJLEVBQUUsY0FBYyxFQUFFO1lBQzFDLFFBQVEsRUFBRTtnQkFDUixrQkFBa0IsRUFBRSxxQ0FBa0IsQ0FBQyxFQUFFLENBQUMsdUJBQXVCLENBQUMsVUFBVSxDQUFDO2dCQUM3RSxPQUFPLEVBQUUsWUFBWTtnQkFDckIsTUFBTSxFQUFFLGNBQWM7Z0JBQ3RCLFVBQVUsRUFBRTtvQkFDVixJQUFJLEVBQUUsdUJBQXVCLENBQUMsVUFBVTtpQkFDekM7YUFDRjtZQUNELE1BQU0sRUFBRSwwQ0FBdUIsQ0FBQyxZQUFZLENBQUM7Z0JBQzNDLFNBQVMsRUFBRSwwQ0FBdUIsQ0FBQyxZQUFZO2FBQ2hELENBQUM7U0FDSCxDQUFDLENBQUM7S0FDSjtDQUNGO0FBRUQsTUFBTSxHQUFHLEdBQUcsSUFBSSxpQkFBRyxFQUFFLENBQUM7QUFFdEIsSUFBSSw2QkFBUyxDQUFDLEdBQUcsRUFBRSx5Q0FBeUMsRUFBRTtJQUM1RCxTQUFTLEVBQUUsQ0FBQyxJQUFJLFNBQVMsQ0FBQyxHQUFHLEVBQUUsbUNBQW1DLENBQUMsQ0FBQztJQUNwRSxVQUFVLEVBQUUsSUFBSTtJQUNoQixtQkFBbUIsRUFBRSxLQUFLLEVBQUUsd0VBQXdFO0NBQ3JHLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFwcCwgU3RhY2ssIFN0YWNrUHJvcHMgfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgeyBJbnRlZ1Rlc3QgfSBmcm9tICdAYXdzLWNkay9pbnRlZy10ZXN0cy1hbHBoYSc7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCAqIGFzIHN5bnRoZXRpY3MgZnJvbSAnLi4vbGliJztcbmltcG9ydCB7IEF3c0N1c3RvbVJlc291cmNlLCBBd3NDdXN0b21SZXNvdXJjZVBvbGljeSwgUGh5c2ljYWxSZXNvdXJjZUlkIH0gZnJvbSAnYXdzLWNkay1saWIvY3VzdG9tLXJlc291cmNlcyc7XG5cbmNsYXNzIFRlc3RTdGFjayBleHRlbmRzIFN0YWNrIHtcbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM/OiBTdGFja1Byb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkLCBwcm9wcyk7XG5cbiAgICBuZXcgc3ludGhldGljcy5DYW5hcnkodGhpcywgJ0NhbmFyeScsIHtcbiAgICAgIGNhbmFyeU5hbWU6ICduZXh0JyxcbiAgICAgIHJ1bnRpbWU6IHN5bnRoZXRpY3MuUnVudGltZS5TWU5USEVUSUNTX05PREVKU19QVVBQRVRFRVJfNF8wLFxuICAgICAgdGVzdDogc3ludGhldGljcy5UZXN0LmN1c3RvbSh7XG4gICAgICAgIGhhbmRsZXI6ICdpbmRleC5oYW5kbGVyJyxcbiAgICAgICAgY29kZTogc3ludGhldGljcy5Db2RlLmZyb21JbmxpbmUoYFxuICAgICAgICAgIGV4cG9ydHMuaGFuZGxlciA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFxcJ2hlbGxvIHdvcmxkXFwnKTtcbiAgICAgICAgICB9O2ApLFxuICAgICAgfSksXG4gICAgICBjbGVhbnVwOiBzeW50aGV0aWNzLkNsZWFudXAuTEFNQkRBLFxuICAgIH0pO1xuXG4gICAgY29uc3QgY2FuYXJ5VGhhdFdpbGxCZVJlbW92ZWQgPSBuZXcgc3ludGhldGljcy5DYW5hcnkodGhpcywgJ0NhbmFyeVJlbW92ZWQnLCB7XG4gICAgICBydW50aW1lOiBzeW50aGV0aWNzLlJ1bnRpbWUuU1lOVEhFVElDU19OT0RFSlNfUFVQUEVURUVSXzRfMCxcbiAgICAgIHRlc3Q6IHN5bnRoZXRpY3MuVGVzdC5jdXN0b20oe1xuICAgICAgICBoYW5kbGVyOiAnaW5kZXguaGFuZGxlcicsXG4gICAgICAgIGNvZGU6IHN5bnRoZXRpY3MuQ29kZS5mcm9tSW5saW5lKGBcbiAgICAgICAgICBleHBvcnRzLmhhbmRsZXIgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcXCdoZWxsbyB3b3JsZFxcJyk7XG4gICAgICAgICAgfTtgKSxcbiAgICAgIH0pLFxuICAgICAgY2xlYW51cDogc3ludGhldGljcy5DbGVhbnVwLkxBTUJEQSxcbiAgICAgIHN0YXJ0QWZ0ZXJDcmVhdGlvbjogZmFsc2UsIC8vIG90aGVyd2lzZSB3ZSBnZXQgZXJyb3I6IGNhbmFyeSBpcyBpbiBhIHN0YXRlIHRoYXQgY2FuJ3QgYmUgZGVsZXRlZDogUlVOTklOR1xuICAgIH0pO1xuXG4gICAgLy8gUmVtb3ZlIHRoaXMgY2FuYXJ5IGltbWVkaWF0ZWx5XG4gICAgLy8gc28gd2UgY2FuIHRlc3QgdGhhdCBhIG5vbi1leGlzdGluZyBjYW5hcnkgd2lsbCBub3QgZmFpbCB0aGUgYXV0by1kZWxldGUtbGFtYmRhIEN1c3RvbSBSZXNvdXJjZVxuICAgIG5ldyBBd3NDdXN0b21SZXNvdXJjZSh0aGlzLCAnRGVsZXRlQ2FuYXJ5Jywge1xuICAgICAgb25DcmVhdGU6IHtcbiAgICAgICAgcGh5c2ljYWxSZXNvdXJjZUlkOiBQaHlzaWNhbFJlc291cmNlSWQub2YoY2FuYXJ5VGhhdFdpbGxCZVJlbW92ZWQuY2FuYXJ5TmFtZSksXG4gICAgICAgIHNlcnZpY2U6ICdTeW50aGV0aWNzJyxcbiAgICAgICAgYWN0aW9uOiAnZGVsZXRlQ2FuYXJ5JyxcbiAgICAgICAgcGFyYW1ldGVyczoge1xuICAgICAgICAgIE5hbWU6IGNhbmFyeVRoYXRXaWxsQmVSZW1vdmVkLmNhbmFyeU5hbWUsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgcG9saWN5OiBBd3NDdXN0b21SZXNvdXJjZVBvbGljeS5mcm9tU2RrQ2FsbHMoe1xuICAgICAgICByZXNvdXJjZXM6IEF3c0N1c3RvbVJlc291cmNlUG9saWN5LkFOWV9SRVNPVVJDRSxcbiAgICAgIH0pLFxuICAgIH0pO1xuICB9XG59XG5cbmNvbnN0IGFwcCA9IG5ldyBBcHAoKTtcblxubmV3IEludGVnVGVzdChhcHAsICdjZGstaW50ZWctc3ludGhldGljcy1jYW5hcnktYXV0by1kZWxldGUnLCB7XG4gIHRlc3RDYXNlczogW25ldyBUZXN0U3RhY2soYXBwLCAnY2RrLXN5bnRoZXRpY3MtY2FuYXJ5LWF1dG8tZGVsZXRlJyldLFxuICBkaWZmQXNzZXRzOiB0cnVlLFxuICBzdGFja1VwZGF0ZVdvcmtmbG93OiBmYWxzZSwgLy8gd2lsbCBlcnJvciBiZWNhdXNlIHRoaXMgc3RhY2sgaGFzIGEgY3IgdGhhdCBkZWxldGVzIGl0cyBvd24gcmVzb3VyY2VzXG59KTtcbiJdfQ== \ No newline at end of file diff --git a/packages/@aws-cdk/aws-synthetics-alpha/test/integ.canary.d.ts b/packages/@aws-cdk/aws-synthetics-alpha/test/integ.canary.d.ts deleted file mode 100644 index cb0ff5c3b541f..0000000000000 --- a/packages/@aws-cdk/aws-synthetics-alpha/test/integ.canary.d.ts +++ /dev/null @@ -1 +0,0 @@ -export {}; diff --git a/packages/@aws-cdk/aws-synthetics-alpha/test/integ.canary.js b/packages/@aws-cdk/aws-synthetics-alpha/test/integ.canary.js deleted file mode 100644 index 03b72399c24da..0000000000000 --- a/packages/@aws-cdk/aws-synthetics-alpha/test/integ.canary.js +++ /dev/null @@ -1,112 +0,0 @@ -"use strict"; -/// !cdk-integ canary-one -Object.defineProperty(exports, "__esModule", { value: true }); -const path = require("path"); -const apigateway = require("aws-cdk-lib/aws-apigateway"); -const s3 = require("aws-cdk-lib/aws-s3"); -const cdk = require("aws-cdk-lib"); -const lib_1 = require("../lib"); -const integ_tests_alpha_1 = require("@aws-cdk/integ-tests-alpha"); -const aws_cdk_lib_1 = require("aws-cdk-lib"); -const app = new cdk.App(); -const stack = new cdk.Stack(app, 'canary-one'); -const bucket = new s3.Bucket(stack, 'MyTestBucket', { - removalPolicy: aws_cdk_lib_1.RemovalPolicy.DESTROY, - autoDeleteObjects: true, -}); -const prefix = 'integ'; -const api = new apigateway.RestApi(stack, 'ApiGateway'); -api.root.addMethod('GET', new apigateway.MockIntegration({ - integrationResponses: [{ - statusCode: '200', - }], - passthroughBehavior: apigateway.PassthroughBehavior.NEVER, - requestTemplates: { - 'application/json': '{ "statusCode": 200 }', - }, -}), { - methodResponses: [{ statusCode: '200' }], -}); -const inlineAsset = new lib_1.Canary(stack, 'InlineAsset', { - test: lib_1.Test.custom({ - handler: 'index.handler', - code: lib_1.Code.fromInline(` - exports.handler = async () => { - console.log(\'hello world\'); - };`), - }), - schedule: lib_1.Schedule.rate(cdk.Duration.minutes(1)), - artifactsBucketLocation: { bucket, prefix }, - runtime: lib_1.Runtime.SYNTHETICS_NODEJS_PUPPETEER_4_0, - cleanup: lib_1.Cleanup.LAMBDA, -}); -const directoryAsset = new lib_1.Canary(stack, 'DirectoryAsset', { - test: lib_1.Test.custom({ - handler: 'canary.handler', - code: lib_1.Code.fromAsset(path.join(__dirname, 'canaries')), - }), - runtime: lib_1.Runtime.SYNTHETICS_NODEJS_PUPPETEER_4_0, - environmentVariables: { - URL: api.url, - }, - cleanup: lib_1.Cleanup.LAMBDA, -}); -const folderAsset = new lib_1.Canary(stack, 'FolderAsset', { - test: lib_1.Test.custom({ - handler: 'folder/canary.functionName', - code: lib_1.Code.fromAsset(path.join(__dirname, 'canaries')), - }), - runtime: lib_1.Runtime.SYNTHETICS_NODEJS_PUPPETEER_4_0, - environmentVariables: { - URL: api.url, - }, - cleanup: lib_1.Cleanup.LAMBDA, -}); -const zipAsset = new lib_1.Canary(stack, 'ZipAsset', { - test: lib_1.Test.custom({ - handler: 'canary.handler', - code: lib_1.Code.fromAsset(path.join(__dirname, 'canary.zip')), - }), - artifactsBucketLifecycleRules: [ - { - expiration: cdk.Duration.days(30), - }, - ], - runtime: lib_1.Runtime.SYNTHETICS_NODEJS_PUPPETEER_4_0, - cleanup: lib_1.Cleanup.LAMBDA, -}); -const kebabToPascal = (text) => text.replace(/(^\w|-\w)/g, (v) => v.replace(/-/, '').toUpperCase()); -const createCanaryByRuntimes = (runtime) => new lib_1.Canary(stack, kebabToPascal(runtime.name).replace('.', ''), { - test: lib_1.Test.custom({ - handler: 'canary.handler', - code: lib_1.Code.fromAsset(path.join(__dirname, 'canaries')), - }), - environmentVariables: { - URL: api.url, - }, - runtime, - cleanup: lib_1.Cleanup.LAMBDA, -}); -const puppeteer39 = createCanaryByRuntimes(lib_1.Runtime.SYNTHETICS_NODEJS_PUPPETEER_3_9); -const puppeteer40 = createCanaryByRuntimes(lib_1.Runtime.SYNTHETICS_NODEJS_PUPPETEER_4_0); -const selenium13 = createCanaryByRuntimes(lib_1.Runtime.SYNTHETICS_PYTHON_SELENIUM_1_3); -const test = new integ_tests_alpha_1.IntegTest(app, 'IntegCanaryTest', { - testCases: [stack], -}); -// Assertion that all Canary's are Passed -[ - inlineAsset, - directoryAsset, - folderAsset, - zipAsset, - puppeteer39, - puppeteer40, - selenium13, -].forEach((canary) => test.assertions - .awsApiCall('Synthetics', 'getCanaryRuns', { - Name: canary.canaryName, -}) - .assertAtPath('CanaryRuns.0.Status.State', integ_tests_alpha_1.ExpectedResult.stringLikeRegexp('PASSED')) - .waitForAssertions({ totalTimeout: cdk.Duration.minutes(5) })); -app.synth(); -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZWcuY2FuYXJ5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiaW50ZWcuY2FuYXJ5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSx5QkFBeUI7O0FBRXpCLDZCQUE2QjtBQUM3Qix5REFBeUQ7QUFDekQseUNBQXlDO0FBQ3pDLG1DQUFtQztBQUNuQyxnQ0FBd0U7QUFDeEUsa0VBQXVFO0FBQ3ZFLDZDQUE0QztBQUU1QyxNQUFNLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUMxQixNQUFNLEtBQUssR0FBRyxJQUFJLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLFlBQVksQ0FBQyxDQUFDO0FBRS9DLE1BQU0sTUFBTSxHQUFHLElBQUksRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsY0FBYyxFQUFFO0lBQ2xELGFBQWEsRUFBRSwyQkFBYSxDQUFDLE9BQU87SUFDcEMsaUJBQWlCLEVBQUUsSUFBSTtDQUN4QixDQUFDLENBQUM7QUFDSCxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUM7QUFFdkIsTUFBTSxHQUFHLEdBQUcsSUFBSSxVQUFVLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxZQUFZLENBQUMsQ0FBQztBQUN4RCxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxVQUFVLENBQUMsZUFBZSxDQUFDO0lBQ3ZELG9CQUFvQixFQUFFLENBQUM7WUFDckIsVUFBVSxFQUFFLEtBQUs7U0FDbEIsQ0FBQztJQUNGLG1CQUFtQixFQUFFLFVBQVUsQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLO0lBQ3pELGdCQUFnQixFQUFFO1FBQ2hCLGtCQUFrQixFQUFFLHVCQUF1QjtLQUM1QztDQUNGLENBQUMsRUFBRTtJQUNGLGVBQWUsRUFBRSxDQUFDLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxDQUFDO0NBQ3pDLENBQUMsQ0FBQztBQUVILE1BQU0sV0FBVyxHQUFHLElBQUksWUFB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ZWcgY2FuYXJ5LW9uZVxuXG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0ICogYXMgYXBpZ2F0ZXdheSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtYXBpZ2F0ZXdheSc7XG5pbXBvcnQgKiBhcyBzMyBmcm9tICdhd3MtY2RrLWxpYi9hd3MtczMnO1xuaW1wb3J0ICogYXMgY2RrIGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB7IENhbmFyeSwgQ2xlYW51cCwgQ29kZSwgUnVudGltZSwgU2NoZWR1bGUsIFRlc3QgfSBmcm9tICcuLi9saWInO1xuaW1wb3J0IHsgRXhwZWN0ZWRSZXN1bHQsIEludGVnVGVzdCB9IGZyb20gJ0Bhd3MtY2RrL2ludGVnLXRlc3RzLWFscGhhJztcbmltcG9ydCB7IFJlbW92YWxQb2xpY3kgfSBmcm9tICdhd3MtY2RrLWxpYic7XG5cbmNvbnN0IGFwcCA9IG5ldyBjZGsuQXBwKCk7XG5jb25zdCBzdGFjayA9IG5ldyBjZGsuU3RhY2soYXBwLCAnY2FuYXJ5LW9uZScpO1xuXG5jb25zdCBidWNrZXQgPSBuZXcgczMuQnVja2V0KHN0YWNrLCAnTXlUZXN0QnVja2V0Jywge1xuICByZW1vdmFsUG9saWN5OiBSZW1vdmFsUG9saWN5LkRFU1RST1ksXG4gIGF1dG9EZWxldGVPYmplY3RzOiB0cnVlLFxufSk7XG5jb25zdCBwcmVmaXggPSAnaW50ZWcnO1xuXG5jb25zdCBhcGkgPSBuZXcgYXBpZ2F0ZXdheS5SZXN0QXBpKHN0YWNrLCAnQXBpR2F0ZXdheScpO1xuYXBpLnJvb3QuYWRkTWV0aG9kKCdHRVQnLCBuZXcgYXBpZ2F0ZXdheS5Nb2NrSW50ZWdyYXRpb24oe1xuICBpbnRlZ3JhdGlvblJlc3BvbnNlczogW3tcbiAgICBzdGF0dXNDb2RlOiAnMjAwJyxcbiAgfV0sXG4gIHBhc3N0aHJvdWdoQmVoYXZpb3I6IGFwaWdhdGV3YXkuUGFzc3Rocm91Z2hCZWhhdmlvci5ORVZFUixcbiAgcmVxdWVzdFRlbXBsYXRlczoge1xuICAgICdhcHBsaWNhdGlvbi9qc29uJzogJ3sgXCJzdGF0dXNDb2RlXCI6IDIwMCB9JyxcbiAgfSxcbn0pLCB7XG4gIG1ldGhvZFJlc3BvbnNlczogW3sgc3RhdHVzQ29kZTogJzIwMCcgfV0sXG59KTtcblxuY29uc3QgaW5saW5lQXNzZXQgPSBuZXcgQ2FuYXJ5KHN0YWNrLCAnSW5saW5lQXNzZXQnLCB7XG4gIHRlc3Q6IFRlc3QuY3VzdG9tKHtcbiAgICBoYW5kbGVyOiAnaW5kZXguaGFuZGxlcicsXG4gICAgY29kZTogQ29kZS5mcm9tSW5saW5lKGBcbiAgICAgIGV4cG9ydHMuaGFuZGxlciA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coXFwnaGVsbG8gd29ybGRcXCcpO1xuICAgICAgfTtgKSxcbiAgfSksXG4gIHNjaGVkdWxlOiBTY2hlZHVsZS5yYXRlKGNkay5EdXJhdGlvbi5taW51dGVzKDEpKSxcbiAgYXJ0aWZhY3RzQnVja2V0TG9jYXRpb246IHsgYnVja2V0LCBwcmVmaXggfSxcbiAgcnVudGltZTogUnVudGltZS5TWU5USEVUSUNTX05PREVKU19QVVBQRVRFRVJfNF8wLFxuICBjbGVhbnVwOiBDbGVhbnVwLkxBTUJEQSxcbn0pO1xuXG5jb25zdCBkaXJlY3RvcnlBc3NldCA9IG5ldyBDYW5hcnkoc3RhY2ssICdEaXJlY3RvcnlBc3NldCcsIHtcbiAgdGVzdDogVGVzdC5jdXN0b20oe1xuICAgIGhhbmRsZXI6ICdjYW5hcnkuaGFuZGxlcicsXG4gICAgY29kZTogQ29kZS5mcm9tQXNzZXQocGF0aC5qb2luKF9fZGlybmFtZSwgJ2NhbmFyaWVzJykpLFxuICB9KSxcbiAgcnVudGltZTogUnVudGltZS5TWU5USEVUSUNTX05PREVKU19QVVBQRVRFRVJfNF8wLFxuICBlbnZpcm9ubWVudFZhcmlhYmxlczoge1xuICAgIFVSTDogYXBpLnVybCxcbiAgfSxcbiAgY2xlYW51cDogQ2xlYW51cC5MQU1CREEsXG59KTtcblxuY29uc3QgZm9sZGVyQXNzZXQgPSBuZXcgQ2FuYXJ5KHN0YWNrLCAnRm9sZGVyQXNzZXQnLCB7XG4gIHRlc3Q6IFRlc3QuY3VzdG9tKHtcbiAgICBoYW5kbGVyOiAnZm9sZGVyL2NhbmFyeS5mdW5jdGlvbk5hbWUnLFxuICAgIGNvZGU6IENvZGUuZnJvbUFzc2V0KHBhdGguam9pbihfX2Rpcm5hbWUsICdjYW5hcmllcycpKSxcbiAgfSksXG4gIHJ1bnRpbWU6IFJ1bnRpbWUuU1lOVEhFVElDU19OT0RFSlNfUFVQUEVURUVSXzRfMCxcbiAgZW52aXJvbm1lbnRWYXJpYWJsZXM6IHtcbiAgICBVUkw6IGFwaS51cmwsXG4gIH0sXG4gIGNsZWFudXA6IENsZWFudXAuTEFNQkRBLFxufSk7XG5cbmNvbnN0IHppcEFzc2V0ID0gbmV3IENhbmFyeShzdGFjaywgJ1ppcEFzc2V0Jywge1xuICB0ZXN0OiBUZXN0LmN1c3RvbSh7XG4gICAgaGFuZGxlcjogJ2NhbmFyeS5oYW5kbGVyJyxcbiAgICBjb2RlOiBDb2RlLmZyb21Bc3NldChwYXRoLmpvaW4oX19kaXJuYW1lLCAnY2FuYXJ5LnppcCcpKSxcbiAgfSksXG4gIGFydGlmYWN0c0J1Y2tldExpZmVjeWNsZVJ1bGVzOiBbXG4gICAge1xuICAgICAgZXhwaXJhdGlvbjogY2RrLkR1cmF0aW9uLmRheXMoMzApLFxuICAgIH0sXG4gIF0sXG4gIHJ1bnRpbWU6IFJ1bnRpbWUuU1lOVEhFVElDU19OT0RFSlNfUFVQUEVURUVSXzRfMCxcbiAgY2xlYW51cDogQ2xlYW51cC5MQU1CREEsXG59KTtcblxuY29uc3Qga2ViYWJUb1Bhc2NhbCA9ICh0ZXh0IDpzdHJpbmcgKT0+IHRleHQucmVwbGFjZSgvKF5cXHd8LVxcdykvZywgKHYpID0+IHYucmVwbGFjZSgvLS8sICcnKS50b1VwcGVyQ2FzZSgpKTtcbmNvbnN0IGNyZWF0ZUNhbmFyeUJ5UnVudGltZXMgPSAocnVudGltZTogUnVudGltZSkgPT5cbiAgbmV3IENhbmFyeShzdGFjaywga2ViYWJUb1Bhc2NhbChydW50aW1lLm5hbWUpLnJlcGxhY2UoJy4nLCAnJyksIHtcbiAgICB0ZXN0OiBUZXN0LmN1c3RvbSh7XG4gICAgICBoYW5kbGVyOiAnY2FuYXJ5LmhhbmRsZXInLFxuICAgICAgY29kZTogQ29kZS5mcm9tQXNzZXQocGF0aC5qb2luKF9fZGlybmFtZSwgJ2NhbmFyaWVzJykpLFxuICAgIH0pLFxuICAgIGVudmlyb25tZW50VmFyaWFibGVzOiB7XG4gICAgICBVUkw6IGFwaS51cmwsXG4gICAgfSxcbiAgICBydW50aW1lLFxuICAgIGNsZWFudXA6IENsZWFudXAuTEFNQkRBLFxuICB9KTtcblxuY29uc3QgcHVwcGV0ZWVyMzkgPSBjcmVhdGVDYW5hcnlCeVJ1bnRpbWVzKFJ1bnRpbWUuU1lOVEhFVElDU19OT0RFSlNfUFVQUEVURUVSXzNfOSk7XG5jb25zdCBwdXBwZXRlZXI0MCA9IGNyZWF0ZUNhbmFyeUJ5UnVudGltZXMoUnVudGltZS5TWU5USEVUSUNTX05PREVKU19QVVBQRVRFRVJfNF8wKTtcbmNvbnN0IHNlbGVuaXVtMTMgPSBjcmVhdGVDYW5hcnlCeVJ1bnRpbWVzKFJ1bnRpbWUuU1lOVEhFVElDU19QWVRIT05fU0VMRU5JVU1fMV8zKTtcblxuY29uc3QgdGVzdCA9IG5ldyBJbnRlZ1Rlc3QoYXBwLCAnSW50ZWdDYW5hcnlUZXN0Jywge1xuICB0ZXN0Q2FzZXM6IFtzdGFja10sXG59KTtcblxuLy8gQXNzZXJ0aW9uIHRoYXQgYWxsIENhbmFyeSdzIGFyZSBQYXNzZWRcbltcbiAgaW5saW5lQXNzZXQsXG4gIGRpcmVjdG9yeUFzc2V0LFxuICBmb2xkZXJBc3NldCxcbiAgemlwQXNzZXQsXG4gIHB1cHBldGVlcjM5LFxuICBwdXBwZXRlZXI0MCxcbiAgc2VsZW5pdW0xMyxcbl0uZm9yRWFjaCgoY2FuYXJ5KSA9PiB0ZXN0LmFzc2VydGlvbnNcbiAgLmF3c0FwaUNhbGwoJ1N5bnRoZXRpY3MnLCAnZ2V0Q2FuYXJ5UnVucycsIHtcbiAgICBOYW1lOiBjYW5hcnkuY2FuYXJ5TmFtZSxcbiAgfSlcbiAgLmFzc2VydEF0UGF0aCgnQ2FuYXJ5UnVucy4wLlN0YXR1cy5TdGF0ZScsIEV4cGVjdGVkUmVzdWx0LnN0cmluZ0xpa2VSZWdleHAoJ1BBU1NFRCcpKVxuICAud2FpdEZvckFzc2VydGlvbnMoeyB0b3RhbFRpbWVvdXQ6IGNkay5EdXJhdGlvbi5taW51dGVzKDUpIH0pKTtcblxuYXBwLnN5bnRoKCk7XG4iXX0= \ No newline at end of file diff --git a/packages/@aws-cdk/aws-synthetics-alpha/test/integ.vpc.d.ts b/packages/@aws-cdk/aws-synthetics-alpha/test/integ.vpc.d.ts deleted file mode 100644 index cb0ff5c3b541f..0000000000000 --- a/packages/@aws-cdk/aws-synthetics-alpha/test/integ.vpc.d.ts +++ /dev/null @@ -1 +0,0 @@ -export {}; diff --git a/packages/@aws-cdk/aws-synthetics-alpha/test/integ.vpc.js b/packages/@aws-cdk/aws-synthetics-alpha/test/integ.vpc.js deleted file mode 100644 index 372c4244cb6f0..0000000000000 --- a/packages/@aws-cdk/aws-synthetics-alpha/test/integ.vpc.js +++ /dev/null @@ -1,27 +0,0 @@ -"use strict"; -/// !cdk-integ canary-vpc -Object.defineProperty(exports, "__esModule", { value: true }); -const path = require("path"); -const ec2 = require("aws-cdk-lib/aws-ec2"); -const cdk = require("aws-cdk-lib"); -const synthetics = require("../lib"); -/* - * Stack verification steps: - * - * -- aws synthetics get-canary --name canary-vpc has state of 'RUNNING' - * -- aws synthetics get-canary --name canary-vpc has VpcId - */ -const app = new cdk.App(); -const stack = new cdk.Stack(app, 'canary-vpc'); -const vpc = new ec2.Vpc(stack, 'MyVpc', { maxAzs: 2, restrictDefaultSecurityGroup: false }); -new synthetics.Canary(stack, 'MyVpcCanary', { - canaryName: 'canary-vpc', - test: synthetics.Test.custom({ - handler: 'canary.handler', - code: synthetics.Code.fromAsset(path.join(__dirname, 'canary.zip')), - }), - runtime: synthetics.Runtime.SYNTHETICS_NODEJS_PUPPETEER_3_8, - vpc, -}); -app.synth(); -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZWcudnBjLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiaW50ZWcudnBjLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSx5QkFBeUI7O0FBRXpCLDZCQUE2QjtBQUM3QiwyQ0FBMkM7QUFDM0MsbUNBQW1DO0FBQ25DLHFDQUFxQztBQUVyQzs7Ozs7R0FLRztBQUNILE1BQU0sR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQzFCLE1BQU0sS0FBSyxHQUFHLElBQUksR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsWUFBWSxDQUFDLENBQUM7QUFFL0MsTUFBTSxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLDRCQUE0QixFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7QUFFNUYsSUFBSSxVQUFVLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxhQUFhLEVBQUU7SUFDMUMsVUFBVSxFQUFFLFlBQVk7SUFDeEIsSUFBSSxFQUFFLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQzNCLE9BQU8sRUFBRSxnQkFBZ0I7UUFDekIsSUFBSSxFQUFFLFVBQVUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLFlBQVksQ0FBQyxDQUFDO0tBQ3BFLENBQUM7SUFDRixPQUFPLEVBQUUsVUFBVSxDQUFDLE9BQU8sQ0FBQywrQkFBK0I7SUFDM0QsR0FBRztDQUNKLENBQUMsQ0FBQztBQUVILEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vLyAhY2RrLWludGVnIGNhbmFyeS12cGNcblxuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCAqIGFzIGVjMiBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZWMyJztcbmltcG9ydCAqIGFzIGNkayBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgKiBhcyBzeW50aGV0aWNzIGZyb20gJy4uL2xpYic7XG5cbi8qXG4gKiBTdGFjayB2ZXJpZmljYXRpb24gc3RlcHM6XG4gKlxuICogLS0gYXdzIHN5bnRoZXRpY3MgZ2V0LWNhbmFyeSAtLW5hbWUgY2FuYXJ5LXZwYyBoYXMgc3RhdGUgb2YgJ1JVTk5JTkcnXG4gKiAtLSBhd3Mgc3ludGhldGljcyBnZXQtY2FuYXJ5IC0tbmFtZSBjYW5hcnktdnBjIGhhcyBWcGNJZFxuICovXG5jb25zdCBhcHAgPSBuZXcgY2RrLkFwcCgpO1xuY29uc3Qgc3RhY2sgPSBuZXcgY2RrLlN0YWNrKGFwcCwgJ2NhbmFyeS12cGMnKTtcblxuY29uc3QgdnBjID0gbmV3IGVjMi5WcGMoc3RhY2ssICdNeVZwYycsIHsgbWF4QXpzOiAyLCByZXN0cmljdERlZmF1bHRTZWN1cml0eUdyb3VwOiBmYWxzZSB9KTtcblxubmV3IHN5bnRoZXRpY3MuQ2FuYXJ5KHN0YWNrLCAnTXlWcGNDYW5hcnknLCB7XG4gIGNhbmFyeU5hbWU6ICdjYW5hcnktdnBjJyxcbiAgdGVzdDogc3ludGhldGljcy5UZXN0LmN1c3RvbSh7XG4gICAgaGFuZGxlcjogJ2NhbmFyeS5oYW5kbGVyJyxcbiAgICBjb2RlOiBzeW50aGV0aWNzLkNvZGUuZnJvbUFzc2V0KHBhdGguam9pbihfX2Rpcm5hbWUsICdjYW5hcnkuemlwJykpLFxuICB9KSxcbiAgcnVudGltZTogc3ludGhldGljcy5SdW50aW1lLlNZTlRIRVRJQ1NfTk9ERUpTX1BVUFBFVEVFUl8zXzgsXG4gIHZwYyxcbn0pO1xuXG5hcHAuc3ludGgoKTtcbiJdfQ== \ No newline at end of file diff --git a/packages/@aws-cdk/aws-synthetics-alpha/test/metric.test.d.ts b/packages/@aws-cdk/aws-synthetics-alpha/test/metric.test.d.ts deleted file mode 100644 index cb0ff5c3b541f..0000000000000 --- a/packages/@aws-cdk/aws-synthetics-alpha/test/metric.test.d.ts +++ /dev/null @@ -1 +0,0 @@ -export {}; diff --git a/packages/@aws-cdk/aws-synthetics-alpha/test/metric.test.js b/packages/@aws-cdk/aws-synthetics-alpha/test/metric.test.js deleted file mode 100644 index 146cbbb09c3e0..0000000000000 --- a/packages/@aws-cdk/aws-synthetics-alpha/test/metric.test.js +++ /dev/null @@ -1,59 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -const aws_cdk_lib_1 = require("aws-cdk-lib"); -const synthetics = require("../lib"); -test('.metricXxx() methods can be used to obtain Metrics for the canary', () => { - // GIVEN - const stack = new aws_cdk_lib_1.Stack(new aws_cdk_lib_1.App(), 'canaries'); - const canary = new synthetics.Canary(stack, 'mycanary', { - test: synthetics.Test.custom({ - handler: 'index.handler', - code: synthetics.Code.fromInline('foo'), - }), - runtime: synthetics.Runtime.SYNTHETICS_NODEJS_PUPPETEER_3_8, - }); - // WHEN - const metricSuccess = canary.metricSuccessPercent(); - const metricFailed = canary.metricFailed(); - const metricDuration = canary.metricDuration(); - // THEN - expect(metricSuccess).toEqual(expect.objectContaining({ - dimensions: { CanaryName: canary.canaryName }, - namespace: 'CloudWatchSynthetics', - metricName: 'SuccessPercent', - statistic: 'Average', - })); - expect(metricFailed).toEqual(expect.objectContaining({ - dimensions: { CanaryName: canary.canaryName }, - namespace: 'CloudWatchSynthetics', - metricName: 'Failed', - statistic: 'Sum', - })); - expect(metricDuration).toEqual(expect.objectContaining({ - dimensions: { CanaryName: canary.canaryName }, - namespace: 'CloudWatchSynthetics', - metricName: 'Duration', - statistic: 'Average', - })); -}); -test('Metric can specify statistic', () => { - // GIVEN - const stack = new aws_cdk_lib_1.Stack(new aws_cdk_lib_1.App(), 'canaries'); - const canary = new synthetics.Canary(stack, 'mycanary', { - test: synthetics.Test.custom({ - handler: 'index.handler', - code: synthetics.Code.fromInline('foo'), - }), - runtime: synthetics.Runtime.SYNTHETICS_NODEJS_PUPPETEER_3_8, - }); - // WHEN - const metric = canary.metricFailed({ statistic: 'Sum' }); - // THEN - expect(metric).toEqual(expect.objectContaining({ - dimensions: { CanaryName: canary.canaryName }, - namespace: 'CloudWatchSynthetics', - metricName: 'Failed', - statistic: 'Sum', - })); -}); -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWV0cmljLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJtZXRyaWMudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLDZDQUF5QztBQUN6QyxxQ0FBcUM7QUFFckMsSUFBSSxDQUFDLG1FQUFtRSxFQUFFLEdBQUcsRUFBRTtJQUM3RSxRQUFRO0lBQ1IsTUFBTSxLQUFLLEdBQUcsSUFBSSxtQkFBSyxDQUFDLElBQUksaUJBQUcsRUFBRSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBRS9DLE1BQU0sTUFBTSxHQUFHLElBQUksVUFBVSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsVUFBVSxFQUFFO1FBQ3RELElBQUksRUFBRSxVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQztZQUMzQixPQUFPLEVBQUUsZUFBZTtZQUN4QixJQUFJLEVBQUUsVUFBVSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDO1NBQ3hDLENBQUM7UUFDRixPQUFPLEVBQUUsVUFBVSxDQUFDLE9BQU8sQ0FBQywrQkFBK0I7S0FDNUQsQ0FBQyxDQUFDO0lBRUgsT0FBTztJQUNQLE1BQU0sYUFBYSxHQUFHLE1BQU0sQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO0lBQ3BELE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUMzQyxNQUFNLGNBQWMsR0FBRyxNQUFNLENBQUMsY0FBYyxFQUFFLENBQUM7SUFFL0MsT0FBTztJQUNQLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDO1FBQ3BELFVBQVUsRUFBRSxFQUFFLFVBQVUsRUFBRSxNQUFNLENBQUMsVUFBVSxFQUFFO1FBQzdDLFNBQVMsRUFBRSxzQkFBc0I7UUFDakMsVUFBVSxFQUFFLGdCQUFnQjtRQUM1QixTQUFTLEVBQUUsU0FBUztLQUNyQixDQUFDLENBQUMsQ0FBQztJQUVKLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDO1FBQ25ELFVBQVUsRUFBRSxFQUFFLFVBQVUsRUFBRSxNQUFNLENBQUMsVUFBVSxFQUFFO1FBQzdDLFNBQVMsRUFBRSxzQkFBc0I7UUFDakMsVUFBVSxFQUFFLFFBQVE7UUFDcEIsU0FBUyxFQUFFLEtBQUs7S0FDakIsQ0FBQyxDQUFDLENBQUM7SUFFSixNQUFNLENBQUMsY0FBYyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQztRQUNyRCxVQUFVLEVBQUUsRUFBRSxVQUFVLEVBQUUsTUFBTSxDQUFDLFVBQVUsRUFBRTtRQUM3QyxTQUFTLEVBQUUsc0JBQXNCO1FBQ2pDLFVBQVUsRUFBRSxVQUFVO1FBQ3RCLFNBQVMsRUFBRSxTQUFTO0tBQ3JCLENBQUMsQ0FBQyxDQUFDO0FBQ04sQ0FBQyxDQUFDLENBQUM7QUFFSCxJQUFJLENBQUMsOEJBQThCLEVBQUUsR0FBRyxFQUFFO0lBQ3hDLFFBQVE7SUFDUixNQUFNLEtBQUssR0FBRyxJQUFJLG1CQUFLLENBQUMsSUFBSSxpQkFBRyxFQUFFLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFFL0MsTUFBTSxNQUFNLEdBQUcsSUFBSSxVQUFVLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxVQUFVLEVBQUU7UUFDdEQsSUFBSSxFQUFFLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO1lBQzNCLE9BQU8sRUFBRSxlQUFlO1lBQ3hCLElBQUksRUFBRSxVQUFVLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUM7U0FDeEMsQ0FBQztRQUNGLE9BQU8sRUFBRSxVQUFVLENBQUMsT0FBTyxDQUFDLCtCQUErQjtLQUM1RCxDQUFDLENBQUM7SUFFSCxPQUFPO0lBQ1AsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBRXpELE9BQU87SUFDUCxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQztRQUM3QyxVQUFVLEVBQUUsRUFBRSxVQUFVLEVBQUUsTUFBTSxDQUFDLFVBQVUsRUFBRTtRQUM3QyxTQUFTLEVBQUUsc0JBQXNCO1FBQ2pDLFVBQVUsRUFBRSxRQUFRO1FBQ3BCLFNBQVMsRUFBRSxLQUFLO0tBQ2pCLENBQUMsQ0FBQyxDQUFDO0FBQ04sQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBcHAsIFN0YWNrIH0gZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0ICogYXMgc3ludGhldGljcyBmcm9tICcuLi9saWInO1xuXG50ZXN0KCcubWV0cmljWHh4KCkgbWV0aG9kcyBjYW4gYmUgdXNlZCB0byBvYnRhaW4gTWV0cmljcyBmb3IgdGhlIGNhbmFyeScsICgpID0+IHtcbiAgLy8gR0lWRU5cbiAgY29uc3Qgc3RhY2sgPSBuZXcgU3RhY2sobmV3IEFwcCgpLCAnY2FuYXJpZXMnKTtcblxuICBjb25zdCBjYW5hcnkgPSBuZXcgc3ludGhldGljcy5DYW5hcnkoc3RhY2ssICdteWNhbmFyeScsIHtcbiAgICB0ZXN0OiBzeW50aGV0aWNzLlRlc3QuY3VzdG9tKHtcbiAgICAgIGhhbmRsZXI6ICdpbmRleC5oYW5kbGVyJyxcbiAgICAgIGNvZGU6IHN5bnRoZXRpY3MuQ29kZS5mcm9tSW5saW5lKCdmb28nKSxcbiAgICB9KSxcbiAgICBydW50aW1lOiBzeW50aGV0aWNzLlJ1bnRpbWUuU1lOVEhFVElDU19OT0RFSlNfUFVQUEVURUVSXzNfOCxcbiAgfSk7XG5cbiAgLy8gV0hFTlxuICBjb25zdCBtZXRyaWNTdWNjZXNzID0gY2FuYXJ5Lm1ldHJpY1N1Y2Nlc3NQZXJjZW50KCk7XG4gIGNvbnN0IG1ldHJpY0ZhaWxlZCA9IGNhbmFyeS5tZXRyaWNGYWlsZWQoKTtcbiAgY29uc3QgbWV0cmljRHVyYXRpb24gPSBjYW5hcnkubWV0cmljRHVyYXRpb24oKTtcblxuICAvLyBUSEVOXG4gIGV4cGVjdChtZXRyaWNTdWNjZXNzKS50b0VxdWFsKGV4cGVjdC5vYmplY3RDb250YWluaW5nKHtcbiAgICBkaW1lbnNpb25zOiB7IENhbmFyeU5hbWU6IGNhbmFyeS5jYW5hcnlOYW1lIH0sXG4gICAgbmFtZXNwYWNlOiAnQ2xvdWRXYXRjaFN5bnRoZXRpY3MnLFxuICAgIG1ldHJpY05hbWU6ICdTdWNjZXNzUGVyY2VudCcsXG4gICAgc3RhdGlzdGljOiAnQXZlcmFnZScsXG4gIH0pKTtcblxuICBleHBlY3QobWV0cmljRmFpbGVkKS50b0VxdWFsKGV4cGVjdC5vYmplY3RDb250YWluaW5nKHtcbiAgICBkaW1lbnNpb25zOiB7IENhbmFyeU5hbWU6IGNhbmFyeS5jYW5hcnlOYW1lIH0sXG4gICAgbmFtZXNwYWNlOiAnQ2xvdWRXYXRjaFN5bnRoZXRpY3MnLFxuICAgIG1ldHJpY05hbWU6ICdGYWlsZWQnLFxuICAgIHN0YXRpc3RpYzogJ1N1bScsXG4gIH0pKTtcblxuICBleHBlY3QobWV0cmljRHVyYXRpb24pLnRvRXF1YWwoZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoe1xuICAgIGRpbWVuc2lvbnM6IHsgQ2FuYXJ5TmFtZTogY2FuYXJ5LmNhbmFyeU5hbWUgfSxcbiAgICBuYW1lc3BhY2U6ICdDbG91ZFdhdGNoU3ludGhldGljcycsXG4gICAgbWV0cmljTmFtZTogJ0R1cmF0aW9uJyxcbiAgICBzdGF0aXN0aWM6ICdBdmVyYWdlJyxcbiAgfSkpO1xufSk7XG5cbnRlc3QoJ01ldHJpYyBjYW4gc3BlY2lmeSBzdGF0aXN0aWMnLCAoKSA9PiB7XG4gIC8vIEdJVkVOXG4gIGNvbnN0IHN0YWNrID0gbmV3IFN0YWNrKG5ldyBBcHAoKSwgJ2NhbmFyaWVzJyk7XG5cbiAgY29uc3QgY2FuYXJ5ID0gbmV3IHN5bnRoZXRpY3MuQ2FuYXJ5KHN0YWNrLCAnbXljYW5hcnknLCB7XG4gICAgdGVzdDogc3ludGhldGljcy5UZXN0LmN1c3RvbSh7XG4gICAgICBoYW5kbGVyOiAnaW5kZXguaGFuZGxlcicsXG4gICAgICBjb2RlOiBzeW50aGV0aWNzLkNvZGUuZnJvbUlubGluZSgnZm9vJyksXG4gICAgfSksXG4gICAgcnVudGltZTogc3ludGhldGljcy5SdW50aW1lLlNZTlRIRVRJQ1NfTk9ERUpTX1BVUFBFVEVFUl8zXzgsXG4gIH0pO1xuXG4gIC8vIFdIRU5cbiAgY29uc3QgbWV0cmljID0gY2FuYXJ5Lm1ldHJpY0ZhaWxlZCh7IHN0YXRpc3RpYzogJ1N1bScgfSk7XG5cbiAgLy8gVEhFTlxuICBleHBlY3QobWV0cmljKS50b0VxdWFsKGV4cGVjdC5vYmplY3RDb250YWluaW5nKHtcbiAgICBkaW1lbnNpb25zOiB7IENhbmFyeU5hbWU6IGNhbmFyeS5jYW5hcnlOYW1lIH0sXG4gICAgbmFtZXNwYWNlOiAnQ2xvdWRXYXRjaFN5bnRoZXRpY3MnLFxuICAgIG1ldHJpY05hbWU6ICdGYWlsZWQnLFxuICAgIHN0YXRpc3RpYzogJ1N1bScsXG4gIH0pKTtcbn0pO1xuIl19 \ No newline at end of file diff --git a/packages/@aws-cdk/aws-synthetics-alpha/test/schedule.test.d.ts b/packages/@aws-cdk/aws-synthetics-alpha/test/schedule.test.d.ts deleted file mode 100644 index cb0ff5c3b541f..0000000000000 --- a/packages/@aws-cdk/aws-synthetics-alpha/test/schedule.test.d.ts +++ /dev/null @@ -1 +0,0 @@ -export {}; diff --git a/packages/@aws-cdk/aws-synthetics-alpha/test/schedule.test.js b/packages/@aws-cdk/aws-synthetics-alpha/test/schedule.test.js deleted file mode 100644 index b79819aaa947f..0000000000000 --- a/packages/@aws-cdk/aws-synthetics-alpha/test/schedule.test.js +++ /dev/null @@ -1,25 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -const synthetics = require("../lib"); -describe('cron', () => { - test('day and weekDay are mutex: given week day', () => { - expect(synthetics.Schedule.cron({ - weekDay: 'MON-FRI', - }).expressionString).toEqual('cron(* * ? * MON-FRI *)'); - }); - test('day and weekDay are mutex: given month day', () => { - expect(synthetics.Schedule.cron({ - day: '1', - }).expressionString).toEqual('cron(* * 1 * ? *)'); - }); - test('day and weekDay are mutex: given neither', () => { - expect(synthetics.Schedule.cron({}).expressionString).toEqual('cron(* * * * ? *)'); - }); - test('day and weekDay are mutex: throw if given both', () => { - expect(() => synthetics.Schedule.cron({ - day: '1', - weekDay: 'MON', - })).toThrow('Cannot supply both \'day\' and \'weekDay\', use at most one'); - }); -}); -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZWR1bGUudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInNjaGVkdWxlLnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxxQ0FBcUM7QUFFckMsUUFBUSxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUU7SUFDcEIsSUFBSSxDQUFDLDJDQUEyQyxFQUFFLEdBQUcsRUFBRTtRQUNyRCxNQUFNLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUM7WUFDOUIsT0FBTyxFQUFFLFNBQVM7U0FDbkIsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsT0FBTyxDQUFDLHlCQUF5QixDQUFDLENBQUM7SUFDMUQsQ0FBQyxDQUFDLENBQUM7SUFFSCxJQUFJLENBQUMsNENBQTRDLEVBQUUsR0FBRyxFQUFFO1FBQ3RELE1BQU0sQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQztZQUM5QixHQUFHLEVBQUUsR0FBRztTQUNULENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0lBQ3BELENBQUMsQ0FBQyxDQUFDO0lBRUgsSUFBSSxDQUFDLDBDQUEwQyxFQUFFLEdBQUcsRUFBRTtRQUNwRCxNQUFNLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxPQUFPLENBQUMsbUJBQW1CLENBQUMsQ0FBQztJQUNyRixDQUFDLENBQUMsQ0FBQztJQUVILElBQUksQ0FBQyxnREFBZ0QsRUFBRSxHQUFHLEVBQUU7UUFDMUQsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDO1lBQ3BDLEdBQUcsRUFBRSxHQUFHO1lBQ1IsT0FBTyxFQUFFLEtBQUs7U0FDZixDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsNkRBQTZELENBQUMsQ0FBQztJQUM3RSxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgc3ludGhldGljcyBmcm9tICcuLi9saWInO1xuXG5kZXNjcmliZSgnY3JvbicsICgpID0+IHtcbiAgdGVzdCgnZGF5IGFuZCB3ZWVrRGF5IGFyZSBtdXRleDogZ2l2ZW4gd2VlayBkYXknLCAoKSA9PiB7XG4gICAgZXhwZWN0KHN5bnRoZXRpY3MuU2NoZWR1bGUuY3Jvbih7XG4gICAgICB3ZWVrRGF5OiAnTU9OLUZSSScsXG4gICAgfSkuZXhwcmVzc2lvblN0cmluZykudG9FcXVhbCgnY3JvbigqICogPyAqIE1PTi1GUkkgKiknKTtcbiAgfSk7XG5cbiAgdGVzdCgnZGF5IGFuZCB3ZWVrRGF5IGFyZSBtdXRleDogZ2l2ZW4gbW9udGggZGF5JywgKCkgPT4ge1xuICAgIGV4cGVjdChzeW50aGV0aWNzLlNjaGVkdWxlLmNyb24oe1xuICAgICAgZGF5OiAnMScsXG4gICAgfSkuZXhwcmVzc2lvblN0cmluZykudG9FcXVhbCgnY3JvbigqICogMSAqID8gKiknKTtcbiAgfSk7XG5cbiAgdGVzdCgnZGF5IGFuZCB3ZWVrRGF5IGFyZSBtdXRleDogZ2l2ZW4gbmVpdGhlcicsICgpID0+IHtcbiAgICBleHBlY3Qoc3ludGhldGljcy5TY2hlZHVsZS5jcm9uKHt9KS5leHByZXNzaW9uU3RyaW5nKS50b0VxdWFsKCdjcm9uKCogKiAqICogPyAqKScpO1xuICB9KTtcblxuICB0ZXN0KCdkYXkgYW5kIHdlZWtEYXkgYXJlIG11dGV4OiB0aHJvdyBpZiBnaXZlbiBib3RoJywgKCkgPT4ge1xuICAgIGV4cGVjdCgoKSA9PiBzeW50aGV0aWNzLlNjaGVkdWxlLmNyb24oe1xuICAgICAgZGF5OiAnMScsXG4gICAgICB3ZWVrRGF5OiAnTU9OJyxcbiAgICB9KSkudG9UaHJvdygnQ2Fubm90IHN1cHBseSBib3RoIFxcJ2RheVxcJyBhbmQgXFwnd2Vla0RheVxcJywgdXNlIGF0IG1vc3Qgb25lJyk7XG4gIH0pO1xufSk7XG4iXX0= \ No newline at end of file diff --git a/packages/@aws-cdk/aws-synthetics-alpha/tsconfig.json b/packages/@aws-cdk/aws-synthetics-alpha/tsconfig.json deleted file mode 100644 index 00315950564fd..0000000000000 --- a/packages/@aws-cdk/aws-synthetics-alpha/tsconfig.json +++ /dev/null @@ -1,53 +0,0 @@ -{ - "compilerOptions": { - "declarationMap": false, - "inlineSourceMap": true, - "inlineSources": true, - "alwaysStrict": true, - "declaration": true, - "experimentalDecorators": true, - "incremental": true, - "lib": [ - "es2020" - ], - "module": "CommonJS", - "noEmitOnError": true, - "noFallthroughCasesInSwitch": true, - "noImplicitAny": true, - "noImplicitReturns": true, - "noImplicitThis": true, - "noUnusedLocals": true, - "noUnusedParameters": true, - "resolveJsonModule": true, - "skipLibCheck": true, - "strict": true, - "strictNullChecks": true, - "strictPropertyInitialization": true, - "stripInternal": false, - "target": "ES2020", - "composite": true, - "tsBuildInfoFile": "tsconfig.tsbuildinfo" - }, - "include": [ - "**/*.ts" - ], - "exclude": [ - "node_modules", - ".types-compat" - ], - "references": [ - { - "path": "../../../tools/@aws-cdk/cdk-build-tools" - }, - { - "path": "../integ-runner" - }, - { - "path": "../../../tools/@aws-cdk/pkglint" - }, - { - "path": "../integ-tests-alpha" - } - ], - "_generated_by_jsii_": "Generated by jsii - safe to delete, and ideally should be in .gitignore" -} \ No newline at end of file