@aws-cdk-testing/cli-integ 3.28.1 → 3.29.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/lib/assertions.d.ts +14 -0
  2. package/lib/assertions.js +29 -0
  3. package/lib/with-sam.js +3 -8
  4. package/npm-shrinkwrap.json +110 -179
  5. package/package.json +2 -3
  6. package/resources/cdk-apps/guard-hook-app/app.js +99 -0
  7. package/resources/cdk-apps/guard-hook-app/cdk.json +4 -0
  8. package/resources/cdk-apps/nested-stack-with-fn-join-export/app.js +46 -0
  9. package/resources/cdk-apps/nested-stack-with-fn-join-export/cdk.json +7 -0
  10. package/resources/cdk-apps/nested-stack-with-iam/app.js +38 -0
  11. package/resources/cdk-apps/nested-stack-with-iam/cdk.json +7 -0
  12. package/tests/cli-integ-tests/deploy/cdk-deploy-guard-hook-failure-displays-annotations.integtest.js +19 -0
  13. package/tests/cli-integ-tests/deploy/cdk-deploy-nested-stacks-with-fn-join-export.integtest.d.ts +1 -0
  14. package/tests/cli-integ-tests/deploy/cdk-deploy-nested-stacks-with-fn-join-export.integtest.js +10 -0
  15. package/tests/cli-integ-tests/deploy/cdk-deploy-skips-unnecessary-updates-for-nested-stacks.integtest.d.ts +1 -0
  16. package/tests/cli-integ-tests/deploy/cdk-deploy-skips-unnecessary-updates-for-nested-stacks.integtest.js +33 -0
  17. package/tests/cli-integ-tests/diff/cdk-cdk-diff---method-change-set-can-be-run-twice-on-a-new-stack.integtest.d.ts +1 -0
  18. package/tests/cli-integ-tests/diff/cdk-cdk-diff---method-change-set-can-be-run-twice-on-a-new-stack.integtest.js +13 -0
  19. package/tests/cli-integ-tests/diff/cdk-cdk-diff---method-change-set-with-doubly-nested-stacks.integtest.d.ts +1 -0
  20. package/tests/cli-integ-tests/diff/cdk-cdk-diff---method-change-set-with-doubly-nested-stacks.integtest.js +16 -0
  21. package/tests/cli-integ-tests/diff/cdk-cdk-diff---method-change-set-with-nested-stacks-through-full-lifecycle.integtest.d.ts +1 -0
  22. package/tests/cli-integ-tests/diff/cdk-cdk-diff---method-change-set-with-nested-stacks-through-full-lifecycle.integtest.js +30 -0
  23. package/tests/cli-integ-tests/diff/cdk-cdk-diff---security-only--method-change-set-detects-security-changes-in-nested-stacks.integtest.d.ts +1 -0
  24. package/tests/cli-integ-tests/diff/cdk-cdk-diff---security-only--method-change-set-detects-security-changes-in-nested-stacks.integtest.js +15 -0
  25. package/tests/cli-integ-tests/diff/cdk-cdk-diff---security-only-detects-security-changes-in-nested-stacks.integtest.d.ts +1 -0
  26. package/tests/cli-integ-tests/diff/cdk-cdk-diff---security-only-detects-security-changes-in-nested-stacks.integtest.js +15 -0
  27. package/tests/cli-integ-tests/publish-assets/cdk-publish-assets-idempotent-and-force.integtest.d.ts +1 -0
  28. package/tests/cli-integ-tests/publish-assets/cdk-publish-assets-idempotent-and-force.integtest.js +18 -0
  29. package/tests/cli-integ-tests/publish-assets/cdk-publish-assets-then-deploy.integtest.d.ts +1 -0
  30. package/tests/cli-integ-tests/publish-assets/cdk-publish-assets-then-deploy.integtest.js +17 -0
  31. package/tests/cli-integ-tests/publish-assets/cdk-publish-assets-without-deploying.integtest.d.ts +1 -0
  32. package/tests/cli-integ-tests/publish-assets/cdk-publish-assets-without-deploying.integtest.js +15 -0
  33. package/tests/telemetry-integ-tests/cdk-synth-telemetry.integtest.js +4 -1
  34. package/tests/cli-integ-tests/deploy/cdk-fast-deploy.integtest.js +0 -33
  35. /package/tests/cli-integ-tests/deploy/{cdk-fast-deploy.integtest.d.ts → cdk-deploy-guard-hook-failure-displays-annotations.integtest.d.ts} +0 -0
@@ -0,0 +1,99 @@
1
+ const cdk = require('aws-cdk-lib/core');
2
+ const s3 = require('aws-cdk-lib/aws-s3');
3
+ const iam = require('aws-cdk-lib/aws-iam');
4
+ const s3deploy = require('aws-cdk-lib/aws-s3-deployment');
5
+
6
+ const stackPrefix = process.env.STACK_NAME_PREFIX;
7
+ if (!stackPrefix) {
8
+ throw new Error('the STACK_NAME_PREFIX environment variable is required');
9
+ }
10
+
11
+ const guardRuleKey = 'rules/AWS_S3_Bucket_AccessControl.guard';
12
+
13
+ const guardRuleContent = `rule AWS_S3_Bucket_AccessControl
14
+ {
15
+ let resources = Resources.*[ Type == "AWS::S3::Bucket" ]
16
+ %resources[*] {
17
+ Properties.AccessControl not exists
18
+ <<
19
+ AccessControl is deprecated
20
+ >>
21
+ }
22
+ }`;
23
+
24
+ // Setup Guard Hook that will evaluate and fail the test stack
25
+ class GuardHookSetupStack extends cdk.Stack {
26
+ constructor(scope, id, props) {
27
+ super(scope, id, props);
28
+
29
+ // S3 bucket for Guard rules
30
+ const rulesBucket = new s3.Bucket(this, 'RulesBucket', {
31
+ removalPolicy: cdk.RemovalPolicy.DESTROY,
32
+ autoDeleteObjects: true,
33
+ });
34
+
35
+ // S3 bucket for Guard logs
36
+ const logsBucket = new s3.Bucket(this, 'LogsBucket', {
37
+ removalPolicy: cdk.RemovalPolicy.DESTROY,
38
+ autoDeleteObjects: true,
39
+ });
40
+
41
+ // Upload Guard rule to rules bucket
42
+ new s3deploy.BucketDeployment(this, 'UploadGuardRule', {
43
+ sources: [s3deploy.Source.data(guardRuleKey, guardRuleContent)],
44
+ destinationBucket: rulesBucket,
45
+ });
46
+
47
+ // IAM role for Guard Hook execution
48
+ const hookRole = new iam.Role(this, 'GuardHookExecutionRole', {
49
+ assumedBy: new iam.ServicePrincipal('hooks.cloudformation.amazonaws.com'),
50
+ });
51
+ hookRole.addToPolicy(new iam.PolicyStatement({
52
+ effect: iam.Effect.ALLOW,
53
+ actions: ['s3:ListBucket', 's3:GetObject', 's3:GetObjectVersion'],
54
+ resources: [rulesBucket.bucketArn, rulesBucket.arnForObjects('*')],
55
+ }));
56
+ hookRole.addToPolicy(new iam.PolicyStatement({
57
+ effect: iam.Effect.ALLOW,
58
+ actions: ['s3:PutObject'],
59
+ resources: [logsBucket.arnForObjects('*')],
60
+ }));
61
+
62
+ // Guard Hook - activates and configures the AWS Guard Hook in this account/region
63
+ new cdk.CfnGuardHook(this, 'GuardHook', {
64
+ alias: 'Private::Guard::TestHook',
65
+ executionRole: hookRole.roleArn,
66
+ failureMode: 'FAIL',
67
+ hookStatus: 'ENABLED',
68
+ ruleLocation: {
69
+ uri: `s3://${rulesBucket.bucketName}/${guardRuleKey}`,
70
+ },
71
+ logBucket: logsBucket.bucketName,
72
+ targetOperations: ['RESOURCE'],
73
+ stackFilters: {
74
+ filteringCriteria: "ANY",
75
+ stackNames: {
76
+ // Do not evalute this stack with the hook
77
+ exclude: [cdk.Aws.STACK_NAME]
78
+ }
79
+ }
80
+ });
81
+ }
82
+ }
83
+
84
+ class GuardHookTestStack extends cdk.Stack {
85
+ constructor(scope, id, props) {
86
+ super(scope, id, props);
87
+
88
+ // This bucket violates the Guard rule by using the deprecated AccessControl property
89
+ new s3.CfnBucket(this, 'NonCompliantBucket', {
90
+ accessControl: 'Private',
91
+ });
92
+ }
93
+ }
94
+
95
+ const app = new cdk.App();
96
+ new GuardHookSetupStack(app, `${stackPrefix}-guard-hook-setup`);
97
+ new GuardHookTestStack(app, `${stackPrefix}-guard-hook-test`);
98
+
99
+ app.synth();
@@ -0,0 +1,4 @@
1
+ {
2
+ "app": "node app.js",
3
+ "versionReporting": false
4
+ }
@@ -0,0 +1,46 @@
1
+ const cdk = require('aws-cdk-lib');
2
+ const { aws_cloudformation: cfn, aws_sns: sns, aws_ssm: ssm } = cdk;
3
+
4
+ /**
5
+ * Reproduces https://t.corp.amazon.com/D423570178
6
+ *
7
+ * When IncludeNestedStacks is true, CloudFormation validates all nested stacks
8
+ * together. Export names using Fn::Join with a runtime reference get collapsed
9
+ * to the placeholder {{IntrinsicFunction://Fn::Join}}, causing a false
10
+ * "duplicate Export names" error when 2+ such exports exist across nested stacks.
11
+ */
12
+
13
+ class NestedStackWithFnJoinExports extends cfn.NestedStack {
14
+ constructor(scope, id, props) {
15
+ super(scope, id, props);
16
+ const topic = new sns.Topic(this, 'Topic');
17
+ new cdk.CfnOutput(this, 'ExportArn', {
18
+ value: topic.topicArn,
19
+ exportName: cdk.Fn.join(':', [props.runtimeRef, 'GetAtt', id, 'Arn']),
20
+ });
21
+ new cdk.CfnOutput(this, 'ExportName', {
22
+ value: topic.topicName,
23
+ exportName: cdk.Fn.join(':', [props.runtimeRef, 'GetAtt', id, 'Name']),
24
+ });
25
+ }
26
+ }
27
+
28
+ class NestedStacksFnJoinExportStack extends cdk.Stack {
29
+ constructor(scope, id, props) {
30
+ super(scope, id, props);
31
+ // SSM parameter name is a runtime reference (not known at validation time)
32
+ const param = new ssm.StringParameter(this, 'Param', { stringValue: 'value' });
33
+ new NestedStackWithFnJoinExports(this, 'Nested1', { runtimeRef: param.parameterName });
34
+ new NestedStackWithFnJoinExports(this, 'Nested2', { runtimeRef: param.parameterName });
35
+ }
36
+ }
37
+
38
+ const app = new cdk.App();
39
+
40
+ const stackPrefix = process.env.STACK_NAME_PREFIX;
41
+ if (!stackPrefix) {
42
+ throw new Error('the STACK_NAME_PREFIX environment variable is required');
43
+ }
44
+
45
+ new NestedStacksFnJoinExportStack(app, `${stackPrefix}-nested-stacks-fn-join-export`);
46
+ app.synth();
@@ -0,0 +1,7 @@
1
+ {
2
+ "app": "node app.js",
3
+ "versionReporting": false,
4
+ "context": {
5
+ "aws-cdk:enableDiffNoFail": "true"
6
+ }
7
+ }
@@ -0,0 +1,38 @@
1
+ const { Stack, App } = require('aws-cdk-lib/core');
2
+ const { NestedStack } = require('aws-cdk-lib/aws-cloudformation');
3
+ const iam = require('aws-cdk-lib/aws-iam');
4
+ const sns = require('aws-cdk-lib/aws-sns');
5
+
6
+ const stackPrefix = process.env.STACK_NAME_PREFIX;
7
+ if (!stackPrefix) {
8
+ throw new Error('the STACK_NAME_PREFIX environment variable is required');
9
+ }
10
+
11
+ class IamNestedStack extends NestedStack {
12
+ constructor(scope, id) {
13
+ super(scope, id);
14
+ new iam.Role(this, 'NestedRole', {
15
+ assumedBy: new iam.ServicePrincipal('lambda.amazonaws.com'),
16
+ });
17
+ }
18
+ }
19
+
20
+ class NoSecurityNestedStack extends NestedStack {
21
+ constructor(scope, id) {
22
+ super(scope, id);
23
+ new sns.Topic(this, 'Topic');
24
+ }
25
+ }
26
+
27
+ class ParentStack extends Stack {
28
+ constructor(scope, id) {
29
+ super(scope, id);
30
+ new IamNestedStack(this, 'IamNested');
31
+ new NoSecurityNestedStack(this, 'NoSecurityNested');
32
+ new IamNestedStack(this, 'AnotherIamNested');
33
+ }
34
+ }
35
+
36
+ const app = new App();
37
+ new ParentStack(app, `${stackPrefix}-nested-iam`);
38
+ app.synth();
@@ -0,0 +1,7 @@
1
+ {
2
+ "app": "node app.js",
3
+ "versionReporting": false,
4
+ "context": {
5
+ "aws-cdk:enableDiffNoFail": "true"
6
+ }
7
+ }
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const lib_1 = require("../../../lib");
4
+ jest.setTimeout(2 * 60 * 60_000);
5
+ (0, lib_1.integTest)('deploy with guard hook failure displays hook annoations', (0, lib_1.withSpecificFixture)('guard-hook-app', async (fixture) => {
6
+ // Deploy the setup stack which creates the Guard Hook via CloudFormation
7
+ await fixture.cdkDeploy('guard-hook-setup');
8
+ // Attempt to deploy non-compliant stack (should fail due to Guard Hook)
9
+ const deployOutput = await fixture.cdkDeploy('guard-hook-test', {
10
+ options: ['--no-rollback'],
11
+ allowErrExit: true,
12
+ });
13
+ expect(deployOutput).toContain('CREATE_FAILED');
14
+ expect(deployOutput).toContain('NonCompliant Rules:');
15
+ expect(deployOutput).toContain('[AWS_S3_Bucket_AccessControl]');
16
+ expect(deployOutput).toContain('• Check was not compliant as property [/Resources/NonCompliantBucket/Properties/AccessControl[L:0,C:91]] existed.');
17
+ expect(deployOutput).toContain('Remediation: AccessControl is deprecated');
18
+ }));
19
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2RrLWRlcGxveS1ndWFyZC1ob29rLWZhaWx1cmUtZGlzcGxheXMtYW5ub3RhdGlvbnMuaW50ZWd0ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiY2RrLWRlcGxveS1ndWFyZC1ob29rLWZhaWx1cmUtZGlzcGxheXMtYW5ub3RhdGlvbnMuaW50ZWd0ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsc0NBQThEO0FBRTlELElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxNQUFNLENBQUMsQ0FBQztBQUVqQyxJQUFBLGVBQVMsRUFDUCx5REFBeUQsRUFDekQsSUFBQSx5QkFBbUIsRUFBQyxnQkFBZ0IsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLEVBQUU7SUFDdEQseUVBQXlFO0lBQ3pFLE1BQU0sT0FBTyxDQUFDLFNBQVMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0lBRTVDLHdFQUF3RTtJQUN4RSxNQUFNLFlBQVksR0FBRyxNQUFNLE9BQU8sQ0FBQyxTQUFTLENBQUMsaUJBQWlCLEVBQUU7UUFDOUQsT0FBTyxFQUFFLENBQUMsZUFBZSxDQUFDO1FBQzFCLFlBQVksRUFBRSxJQUFJO0tBQ25CLENBQUMsQ0FBQztJQUNILE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDLENBQUM7SUFDaEQsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO0lBQ3RELE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQyxTQUFTLENBQUMsK0JBQStCLENBQUMsQ0FBQztJQUNoRSxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUMsU0FBUyxDQUFDLG1IQUFtSCxDQUFDLENBQUM7SUFDcEosTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDLFNBQVMsQ0FBQywwQ0FBMEMsQ0FBQyxDQUFDO0FBQzdFLENBQUMsQ0FBQyxDQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpbnRlZ1Rlc3QsIHdpdGhTcGVjaWZpY0ZpeHR1cmUgfSBmcm9tICcuLi8uLi8uLi9saWInO1xuXG5qZXN0LnNldFRpbWVvdXQoMiAqIDYwICogNjBfMDAwKTtcblxuaW50ZWdUZXN0KFxuICAnZGVwbG95IHdpdGggZ3VhcmQgaG9vayBmYWlsdXJlIGRpc3BsYXlzIGhvb2sgYW5ub2F0aW9ucycsXG4gIHdpdGhTcGVjaWZpY0ZpeHR1cmUoJ2d1YXJkLWhvb2stYXBwJywgYXN5bmMgKGZpeHR1cmUpID0+IHtcbiAgICAvLyBEZXBsb3kgdGhlIHNldHVwIHN0YWNrIHdoaWNoIGNyZWF0ZXMgdGhlIEd1YXJkIEhvb2sgdmlhIENsb3VkRm9ybWF0aW9uXG4gICAgYXdhaXQgZml4dHVyZS5jZGtEZXBsb3koJ2d1YXJkLWhvb2stc2V0dXAnKTtcblxuICAgIC8vIEF0dGVtcHQgdG8gZGVwbG95IG5vbi1jb21wbGlhbnQgc3RhY2sgKHNob3VsZCBmYWlsIGR1ZSB0byBHdWFyZCBIb29rKVxuICAgIGNvbnN0IGRlcGxveU91dHB1dCA9IGF3YWl0IGZpeHR1cmUuY2RrRGVwbG95KCdndWFyZC1ob29rLXRlc3QnLCB7XG4gICAgICBvcHRpb25zOiBbJy0tbm8tcm9sbGJhY2snXSxcbiAgICAgIGFsbG93RXJyRXhpdDogdHJ1ZSxcbiAgICB9KTtcbiAgICBleHBlY3QoZGVwbG95T3V0cHV0KS50b0NvbnRhaW4oJ0NSRUFURV9GQUlMRUQnKTtcbiAgICBleHBlY3QoZGVwbG95T3V0cHV0KS50b0NvbnRhaW4oJ05vbkNvbXBsaWFudCBSdWxlczonKTtcbiAgICBleHBlY3QoZGVwbG95T3V0cHV0KS50b0NvbnRhaW4oJ1tBV1NfUzNfQnVja2V0X0FjY2Vzc0NvbnRyb2xdJyk7XG4gICAgZXhwZWN0KGRlcGxveU91dHB1dCkudG9Db250YWluKCfigKIgQ2hlY2sgd2FzIG5vdCBjb21wbGlhbnQgYXMgcHJvcGVydHkgWy9SZXNvdXJjZXMvTm9uQ29tcGxpYW50QnVja2V0L1Byb3BlcnRpZXMvQWNjZXNzQ29udHJvbFtMOjAsQzo5MV1dIGV4aXN0ZWQuJyk7XG4gICAgZXhwZWN0KGRlcGxveU91dHB1dCkudG9Db250YWluKCdSZW1lZGlhdGlvbjogQWNjZXNzQ29udHJvbCBpcyBkZXByZWNhdGVkJyk7XG4gIH0pLFxuKTtcbiJdfQ==
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const lib_1 = require("../../../lib");
4
+ (0, lib_1.integTest)('deploy nested stacks with Fn::Join export names', (0, lib_1.withSpecificFixture)('nested-stack-with-fn-join-export', async (fixture) => {
5
+ // This should succeed. With IncludeNestedStacks:true, CloudFormation
6
+ // incorrectly reports duplicate export names when multiple nested stacks
7
+ // use Fn::Join with the same runtime reference to build export names.
8
+ await fixture.cdkDeploy('nested-stacks-fn-join-export', { captureStderr: false });
9
+ }));
10
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2RrLWRlcGxveS1uZXN0ZWQtc3RhY2tzLXdpdGgtZm4tam9pbi1leHBvcnQuaW50ZWd0ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiY2RrLWRlcGxveS1uZXN0ZWQtc3RhY2tzLXdpdGgtZm4tam9pbi1leHBvcnQuaW50ZWd0ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsc0NBQThEO0FBRTlELElBQUEsZUFBUyxFQUNQLGlEQUFpRCxFQUNqRCxJQUFBLHlCQUFtQixFQUFDLGtDQUFrQyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsRUFBRTtJQUN4RSxxRUFBcUU7SUFDckUseUVBQXlFO0lBQ3pFLHNFQUFzRTtJQUN0RSxNQUFNLE9BQU8sQ0FBQyxTQUFTLENBQUMsOEJBQThCLEVBQUUsRUFBRSxhQUFhLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztBQUNwRixDQUFDLENBQUMsQ0FDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaW50ZWdUZXN0LCB3aXRoU3BlY2lmaWNGaXh0dXJlIH0gZnJvbSAnLi4vLi4vLi4vbGliJztcblxuaW50ZWdUZXN0KFxuICAnZGVwbG95IG5lc3RlZCBzdGFja3Mgd2l0aCBGbjo6Sm9pbiBleHBvcnQgbmFtZXMnLFxuICB3aXRoU3BlY2lmaWNGaXh0dXJlKCduZXN0ZWQtc3RhY2std2l0aC1mbi1qb2luLWV4cG9ydCcsIGFzeW5jIChmaXh0dXJlKSA9PiB7XG4gICAgLy8gVGhpcyBzaG91bGQgc3VjY2VlZC4gV2l0aCBJbmNsdWRlTmVzdGVkU3RhY2tzOnRydWUsIENsb3VkRm9ybWF0aW9uXG4gICAgLy8gaW5jb3JyZWN0bHkgcmVwb3J0cyBkdXBsaWNhdGUgZXhwb3J0IG5hbWVzIHdoZW4gbXVsdGlwbGUgbmVzdGVkIHN0YWNrc1xuICAgIC8vIHVzZSBGbjo6Sm9pbiB3aXRoIHRoZSBzYW1lIHJ1bnRpbWUgcmVmZXJlbmNlIHRvIGJ1aWxkIGV4cG9ydCBuYW1lcy5cbiAgICBhd2FpdCBmaXh0dXJlLmNka0RlcGxveSgnbmVzdGVkLXN0YWNrcy1mbi1qb2luLWV4cG9ydCcsIHsgY2FwdHVyZVN0ZGVycjogZmFsc2UgfSk7XG4gIH0pLFxuKTtcbiJdfQ==
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const client_cloudformation_1 = require("@aws-sdk/client-cloudformation");
4
+ const lib_1 = require("../../../lib");
5
+ (0, lib_1.integTest)('deploy skips unnecessary updates for nested stacks', (0, lib_1.withDefaultFixture)(async (fixture) => {
6
+ // we are using a stack with a nested stack because CFN will always attempt to
7
+ // update a nested stack, which will allow us to verify that updates are actually
8
+ // skipped unless --force is specified.
9
+ const stackArn = await fixture.cdkDeploy('with-nested-stack', { captureStderr: false });
10
+ const changeSet1 = await getLatestChangeSet();
11
+ // Deploy the same stack again, there should be no new change set created
12
+ await fixture.cdkDeploy('with-nested-stack');
13
+ const changeSet2 = await getLatestChangeSet();
14
+ expect(changeSet2.ChangeSetId).toEqual(changeSet1.ChangeSetId);
15
+ // Deploy the stack again with --force, now we should create a changeset
16
+ await fixture.cdkDeploy('with-nested-stack', { options: ['--force'] });
17
+ const changeSet3 = await getLatestChangeSet();
18
+ expect(changeSet3.ChangeSetId).not.toEqual(changeSet2.ChangeSetId);
19
+ // Deploy the stack again with tags, expected to create a new changeset
20
+ // even though the resources didn't change.
21
+ await fixture.cdkDeploy('with-nested-stack', { options: ['--tags', 'key=value'] });
22
+ const changeSet4 = await getLatestChangeSet();
23
+ expect(changeSet4.ChangeSetId).not.toEqual(changeSet3.ChangeSetId);
24
+ async function getLatestChangeSet() {
25
+ const response = await fixture.aws.cloudFormation.send(new client_cloudformation_1.DescribeStacksCommand({ StackName: stackArn }));
26
+ if (!response.Stacks?.[0]) {
27
+ throw new Error('Did not get a ChangeSet at all');
28
+ }
29
+ fixture.log(`Found Change Set ${response.Stacks?.[0].ChangeSetId}`);
30
+ return response.Stacks?.[0];
31
+ }
32
+ }));
33
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2RrLWRlcGxveS1za2lwcy11bm5lY2Vzc2FyeS11cGRhdGVzLWZvci1uZXN0ZWQtc3RhY2tzLmludGVndGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImNkay1kZXBsb3ktc2tpcHMtdW5uZWNlc3NhcnktdXBkYXRlcy1mb3ItbmVzdGVkLXN0YWNrcy5pbnRlZ3Rlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSwwRUFBdUU7QUFDdkUsc0NBQTZEO0FBRTdELElBQUEsZUFBUyxFQUNQLG9EQUFvRCxFQUNwRCxJQUFBLHdCQUFrQixFQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsRUFBRTtJQUNuQyw4RUFBOEU7SUFDOUUsaUZBQWlGO0lBQ2pGLHVDQUF1QztJQUN2QyxNQUFNLFFBQVEsR0FBRyxNQUFNLE9BQU8sQ0FBQyxTQUFTLENBQUMsbUJBQW1CLEVBQUUsRUFBRSxhQUFhLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUN4RixNQUFNLFVBQVUsR0FBRyxNQUFNLGtCQUFrQixFQUFFLENBQUM7SUFFOUMseUVBQXlFO0lBQ3pFLE1BQU0sT0FBTyxDQUFDLFNBQVMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0lBQzdDLE1BQU0sVUFBVSxHQUFHLE1BQU0sa0JBQWtCLEVBQUUsQ0FBQztJQUM5QyxNQUFNLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLENBQUM7SUFFL0Qsd0VBQXdFO0lBQ3hFLE1BQU0sT0FBTyxDQUFDLFNBQVMsQ0FBQyxtQkFBbUIsRUFBRSxFQUFFLE9BQU8sRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUN2RSxNQUFNLFVBQVUsR0FBRyxNQUFNLGtCQUFrQixFQUFFLENBQUM7SUFDOUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUVuRSx1RUFBdUU7SUFDdkUsMkNBQTJDO0lBQzNDLE1BQU0sT0FBTyxDQUFDLFNBQVMsQ0FBQyxtQkFBbUIsRUFBRSxFQUFFLE9BQU8sRUFBRSxDQUFDLFFBQVEsRUFBRSxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDbkYsTUFBTSxVQUFVLEdBQUcsTUFBTSxrQkFBa0IsRUFBRSxDQUFDO0lBQzlDLE1BQU0sQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLENBQUM7SUFFbkUsS0FBSyxVQUFVLGtCQUFrQjtRQUMvQixNQUFNLFFBQVEsR0FBRyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLDZDQUFxQixDQUFDLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUMzRyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDMUIsTUFBTSxJQUFJLEtBQUssQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDO1FBQ3BELENBQUM7UUFDRCxPQUFPLENBQUMsR0FBRyxDQUFDLG9CQUFvQixRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztRQUNwRSxPQUFPLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM5QixDQUFDO0FBQ0gsQ0FBQyxDQUFDLENBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERlc2NyaWJlU3RhY2tzQ29tbWFuZCB9IGZyb20gJ0Bhd3Mtc2RrL2NsaWVudC1jbG91ZGZvcm1hdGlvbic7XG5pbXBvcnQgeyBpbnRlZ1Rlc3QsIHdpdGhEZWZhdWx0Rml4dHVyZSB9IGZyb20gJy4uLy4uLy4uL2xpYic7XG5cbmludGVnVGVzdChcbiAgJ2RlcGxveSBza2lwcyB1bm5lY2Vzc2FyeSB1cGRhdGVzIGZvciBuZXN0ZWQgc3RhY2tzJyxcbiAgd2l0aERlZmF1bHRGaXh0dXJlKGFzeW5jIChmaXh0dXJlKSA9PiB7XG4gICAgLy8gd2UgYXJlIHVzaW5nIGEgc3RhY2sgd2l0aCBhIG5lc3RlZCBzdGFjayBiZWNhdXNlIENGTiB3aWxsIGFsd2F5cyBhdHRlbXB0IHRvXG4gICAgLy8gdXBkYXRlIGEgbmVzdGVkIHN0YWNrLCB3aGljaCB3aWxsIGFsbG93IHVzIHRvIHZlcmlmeSB0aGF0IHVwZGF0ZXMgYXJlIGFjdHVhbGx5XG4gICAgLy8gc2tpcHBlZCB1bmxlc3MgLS1mb3JjZSBpcyBzcGVjaWZpZWQuXG4gICAgY29uc3Qgc3RhY2tBcm4gPSBhd2FpdCBmaXh0dXJlLmNka0RlcGxveSgnd2l0aC1uZXN0ZWQtc3RhY2snLCB7IGNhcHR1cmVTdGRlcnI6IGZhbHNlIH0pO1xuICAgIGNvbnN0IGNoYW5nZVNldDEgPSBhd2FpdCBnZXRMYXRlc3RDaGFuZ2VTZXQoKTtcblxuICAgIC8vIERlcGxveSB0aGUgc2FtZSBzdGFjayBhZ2FpbiwgdGhlcmUgc2hvdWxkIGJlIG5vIG5ldyBjaGFuZ2Ugc2V0IGNyZWF0ZWRcbiAgICBhd2FpdCBmaXh0dXJlLmNka0RlcGxveSgnd2l0aC1uZXN0ZWQtc3RhY2snKTtcbiAgICBjb25zdCBjaGFuZ2VTZXQyID0gYXdhaXQgZ2V0TGF0ZXN0Q2hhbmdlU2V0KCk7XG4gICAgZXhwZWN0KGNoYW5nZVNldDIuQ2hhbmdlU2V0SWQpLnRvRXF1YWwoY2hhbmdlU2V0MS5DaGFuZ2VTZXRJZCk7XG5cbiAgICAvLyBEZXBsb3kgdGhlIHN0YWNrIGFnYWluIHdpdGggLS1mb3JjZSwgbm93IHdlIHNob3VsZCBjcmVhdGUgYSBjaGFuZ2VzZXRcbiAgICBhd2FpdCBmaXh0dXJlLmNka0RlcGxveSgnd2l0aC1uZXN0ZWQtc3RhY2snLCB7IG9wdGlvbnM6IFsnLS1mb3JjZSddIH0pO1xuICAgIGNvbnN0IGNoYW5nZVNldDMgPSBhd2FpdCBnZXRMYXRlc3RDaGFuZ2VTZXQoKTtcbiAgICBleHBlY3QoY2hhbmdlU2V0My5DaGFuZ2VTZXRJZCkubm90LnRvRXF1YWwoY2hhbmdlU2V0Mi5DaGFuZ2VTZXRJZCk7XG5cbiAgICAvLyBEZXBsb3kgdGhlIHN0YWNrIGFnYWluIHdpdGggdGFncywgZXhwZWN0ZWQgdG8gY3JlYXRlIGEgbmV3IGNoYW5nZXNldFxuICAgIC8vIGV2ZW4gdGhvdWdoIHRoZSByZXNvdXJjZXMgZGlkbid0IGNoYW5nZS5cbiAgICBhd2FpdCBmaXh0dXJlLmNka0RlcGxveSgnd2l0aC1uZXN0ZWQtc3RhY2snLCB7IG9wdGlvbnM6IFsnLS10YWdzJywgJ2tleT12YWx1ZSddIH0pO1xuICAgIGNvbnN0IGNoYW5nZVNldDQgPSBhd2FpdCBnZXRMYXRlc3RDaGFuZ2VTZXQoKTtcbiAgICBleHBlY3QoY2hhbmdlU2V0NC5DaGFuZ2VTZXRJZCkubm90LnRvRXF1YWwoY2hhbmdlU2V0My5DaGFuZ2VTZXRJZCk7XG5cbiAgICBhc3luYyBmdW5jdGlvbiBnZXRMYXRlc3RDaGFuZ2VTZXQoKSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZpeHR1cmUuYXdzLmNsb3VkRm9ybWF0aW9uLnNlbmQobmV3IERlc2NyaWJlU3RhY2tzQ29tbWFuZCh7IFN0YWNrTmFtZTogc3RhY2tBcm4gfSkpO1xuICAgICAgaWYgKCFyZXNwb25zZS5TdGFja3M/LlswXSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0RpZCBub3QgZ2V0IGEgQ2hhbmdlU2V0IGF0IGFsbCcpO1xuICAgICAgfVxuICAgICAgZml4dHVyZS5sb2coYEZvdW5kIENoYW5nZSBTZXQgJHtyZXNwb25zZS5TdGFja3M/LlswXS5DaGFuZ2VTZXRJZH1gKTtcbiAgICAgIHJldHVybiByZXNwb25zZS5TdGFja3M/LlswXTtcbiAgICB9XG4gIH0pLFxuKTtcbiJdfQ==
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const lib_1 = require("../../../lib");
4
+ (0, lib_1.integTest)('cdk diff --method=change-set can be run twice on a new stack', (0, lib_1.withDefaultFixture)(async (fixture) => {
5
+ const stackName = fixture.fullStackName('test-1');
6
+ // First diff creates a CREATE changeset, leaving the stack in REVIEW_IN_PROGRESS
7
+ const diff1 = await fixture.cdk(['diff', '--method=change-set', stackName]);
8
+ expect(diff1).toContain('AWS::SNS::Topic');
9
+ // Second diff should also succeed, not fail with "Stack does not exist" or UPDATE errors
10
+ const diff2 = await fixture.cdk(['diff', '--method=change-set', stackName]);
11
+ expect(diff2).toContain('AWS::SNS::Topic');
12
+ }));
13
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2RrLWNkay1kaWZmLS0tbWV0aG9kLWNoYW5nZS1zZXQtY2FuLWJlLXJ1bi10d2ljZS1vbi1hLW5ldy1zdGFjay5pbnRlZ3Rlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJjZGstY2RrLWRpZmYtLS1tZXRob2QtY2hhbmdlLXNldC1jYW4tYmUtcnVuLXR3aWNlLW9uLWEtbmV3LXN0YWNrLmludGVndGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLHNDQUE2RDtBQUU3RCxJQUFBLGVBQVMsRUFDUCw4REFBOEQsRUFDOUQsSUFBQSx3QkFBa0IsRUFBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLEVBQUU7SUFDbkMsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUVsRCxpRkFBaUY7SUFDakYsTUFBTSxLQUFLLEdBQUcsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLHFCQUFxQixFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUM7SUFDNUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0lBRTNDLHlGQUF5RjtJQUN6RixNQUFNLEtBQUssR0FBRyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUscUJBQXFCLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQztJQUM1RSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsU0FBUyxDQUFDLGlCQUFpQixDQUFDLENBQUM7QUFDN0MsQ0FBQyxDQUFDLENBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGludGVnVGVzdCwgd2l0aERlZmF1bHRGaXh0dXJlIH0gZnJvbSAnLi4vLi4vLi4vbGliJztcblxuaW50ZWdUZXN0KFxuICAnY2RrIGRpZmYgLS1tZXRob2Q9Y2hhbmdlLXNldCBjYW4gYmUgcnVuIHR3aWNlIG9uIGEgbmV3IHN0YWNrJyxcbiAgd2l0aERlZmF1bHRGaXh0dXJlKGFzeW5jIChmaXh0dXJlKSA9PiB7XG4gICAgY29uc3Qgc3RhY2tOYW1lID0gZml4dHVyZS5mdWxsU3RhY2tOYW1lKCd0ZXN0LTEnKTtcblxuICAgIC8vIEZpcnN0IGRpZmYgY3JlYXRlcyBhIENSRUFURSBjaGFuZ2VzZXQsIGxlYXZpbmcgdGhlIHN0YWNrIGluIFJFVklFV19JTl9QUk9HUkVTU1xuICAgIGNvbnN0IGRpZmYxID0gYXdhaXQgZml4dHVyZS5jZGsoWydkaWZmJywgJy0tbWV0aG9kPWNoYW5nZS1zZXQnLCBzdGFja05hbWVdKTtcbiAgICBleHBlY3QoZGlmZjEpLnRvQ29udGFpbignQVdTOjpTTlM6OlRvcGljJyk7XG5cbiAgICAvLyBTZWNvbmQgZGlmZiBzaG91bGQgYWxzbyBzdWNjZWVkLCBub3QgZmFpbCB3aXRoIFwiU3RhY2sgZG9lcyBub3QgZXhpc3RcIiBvciBVUERBVEUgZXJyb3JzXG4gICAgY29uc3QgZGlmZjIgPSBhd2FpdCBmaXh0dXJlLmNkayhbJ2RpZmYnLCAnLS1tZXRob2Q9Y2hhbmdlLXNldCcsIHN0YWNrTmFtZV0pO1xuICAgIGV4cGVjdChkaWZmMikudG9Db250YWluKCdBV1M6OlNOUzo6VG9waWMnKTtcbiAgfSksXG4pO1xuIl19
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const lib_1 = require("../../../lib");
4
+ (0, lib_1.integTest)('cdk diff --method=change-set with doubly nested stacks', (0, lib_1.withDefaultFixture)(async (fixture) => {
5
+ const stackName = fixture.fullStackName('with-doubly-nested-stack');
6
+ // Diff a stack with two levels of nesting
7
+ const diff = await fixture.cdk(['diff', '--method=change-set', stackName]);
8
+ // Root stack should contain the outer nested stack
9
+ expect(diff).toContain('AWS::CloudFormation::Stack');
10
+ // The inner nested stack should contain the SNS topic
11
+ expect(diff).toContain('AWS::SNS::Topic');
12
+ // Should use changeset-based diff successfully
13
+ expect(diff).not.toContain('Could not create a change set');
14
+ expect(diff).toContain('read-only change set');
15
+ }));
16
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2RrLWNkay1kaWZmLS0tbWV0aG9kLWNoYW5nZS1zZXQtd2l0aC1kb3VibHktbmVzdGVkLXN0YWNrcy5pbnRlZ3Rlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJjZGstY2RrLWRpZmYtLS1tZXRob2QtY2hhbmdlLXNldC13aXRoLWRvdWJseS1uZXN0ZWQtc3RhY2tzLmludGVndGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLHNDQUE2RDtBQUU3RCxJQUFBLGVBQVMsRUFDUCx3REFBd0QsRUFDeEQsSUFBQSx3QkFBa0IsRUFBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLEVBQUU7SUFDbkMsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLGFBQWEsQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO0lBRXBFLDBDQUEwQztJQUMxQyxNQUFNLElBQUksR0FBRyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUscUJBQXFCLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQztJQUUzRSxtREFBbUQ7SUFDbkQsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDO0lBQ3JELHNEQUFzRDtJQUN0RCxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFDMUMsK0NBQStDO0lBQy9DLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLCtCQUErQixDQUFDLENBQUM7SUFDNUQsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO0FBQ2pELENBQUMsQ0FBQyxDQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpbnRlZ1Rlc3QsIHdpdGhEZWZhdWx0Rml4dHVyZSB9IGZyb20gJy4uLy4uLy4uL2xpYic7XG5cbmludGVnVGVzdChcbiAgJ2NkayBkaWZmIC0tbWV0aG9kPWNoYW5nZS1zZXQgd2l0aCBkb3VibHkgbmVzdGVkIHN0YWNrcycsXG4gIHdpdGhEZWZhdWx0Rml4dHVyZShhc3luYyAoZml4dHVyZSkgPT4ge1xuICAgIGNvbnN0IHN0YWNrTmFtZSA9IGZpeHR1cmUuZnVsbFN0YWNrTmFtZSgnd2l0aC1kb3VibHktbmVzdGVkLXN0YWNrJyk7XG5cbiAgICAvLyBEaWZmIGEgc3RhY2sgd2l0aCB0d28gbGV2ZWxzIG9mIG5lc3RpbmdcbiAgICBjb25zdCBkaWZmID0gYXdhaXQgZml4dHVyZS5jZGsoWydkaWZmJywgJy0tbWV0aG9kPWNoYW5nZS1zZXQnLCBzdGFja05hbWVdKTtcblxuICAgIC8vIFJvb3Qgc3RhY2sgc2hvdWxkIGNvbnRhaW4gdGhlIG91dGVyIG5lc3RlZCBzdGFja1xuICAgIGV4cGVjdChkaWZmKS50b0NvbnRhaW4oJ0FXUzo6Q2xvdWRGb3JtYXRpb246OlN0YWNrJyk7XG4gICAgLy8gVGhlIGlubmVyIG5lc3RlZCBzdGFjayBzaG91bGQgY29udGFpbiB0aGUgU05TIHRvcGljXG4gICAgZXhwZWN0KGRpZmYpLnRvQ29udGFpbignQVdTOjpTTlM6OlRvcGljJyk7XG4gICAgLy8gU2hvdWxkIHVzZSBjaGFuZ2VzZXQtYmFzZWQgZGlmZiBzdWNjZXNzZnVsbHlcbiAgICBleHBlY3QoZGlmZikubm90LnRvQ29udGFpbignQ291bGQgbm90IGNyZWF0ZSBhIGNoYW5nZSBzZXQnKTtcbiAgICBleHBlY3QoZGlmZikudG9Db250YWluKCdyZWFkLW9ubHkgY2hhbmdlIHNldCcpO1xuICB9KSxcbik7XG4iXX0=
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const lib_1 = require("../../../lib");
4
+ (0, lib_1.integTest)('cdk diff --method=change-set with nested stacks through full lifecycle', (0, lib_1.withDefaultFixture)(async (fixture) => {
5
+ const stackName = fixture.fullStackName('with-nested-stack');
6
+ // 1. Diff a new stack with nested stacks (CREATE change set)
7
+ const diffNew = await fixture.cdk(['diff', '--method=change-set', stackName]);
8
+ // Should show the nested stack resource in the root stack
9
+ expect(diffNew).toContain('AWS::CloudFormation::Stack');
10
+ // Should show the SNS topic from inside the nested stack
11
+ expect(diffNew).toContain('AWS::SNS::Topic');
12
+ // Should use changeset-based diff, not fall back to template diff
13
+ expect(diffNew).not.toContain('Could not create a change set');
14
+ expect(diffNew).not.toContain('falling back to template diff');
15
+ // Should show the changeset info message
16
+ expect(diffNew).toContain('read-only change set');
17
+ // 2. Deploy the stack
18
+ await fixture.cdkDeploy('with-nested-stack');
19
+ // 3. Diff after deploy with no changes — should report no differences
20
+ const diffNoChanges = await fixture.cdk(['diff', '--method=change-set', stackName]);
21
+ expect(diffNoChanges).toContain('There were no differences');
22
+ expect(diffNoChanges).not.toContain('Could not create a change set');
23
+ // 4. Destroy the stack
24
+ await fixture.cdkDestroy('with-nested-stack');
25
+ // 5. Diff again after destroy (CREATE change set for a new stack)
26
+ const diffAfterDestroy = await fixture.cdk(['diff', '--method=change-set', stackName]);
27
+ expect(diffAfterDestroy).toContain('AWS::CloudFormation::Stack');
28
+ expect(diffAfterDestroy).toContain('AWS::SNS::Topic');
29
+ }));
30
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2RrLWNkay1kaWZmLS0tbWV0aG9kLWNoYW5nZS1zZXQtd2l0aC1uZXN0ZWQtc3RhY2tzLXRocm91Z2gtZnVsbC1saWZlY3ljbGUuaW50ZWd0ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiY2RrLWNkay1kaWZmLS0tbWV0aG9kLWNoYW5nZS1zZXQtd2l0aC1uZXN0ZWQtc3RhY2tzLXRocm91Z2gtZnVsbC1saWZlY3ljbGUuaW50ZWd0ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsc0NBQTZEO0FBRTdELElBQUEsZUFBUyxFQUNQLHdFQUF3RSxFQUN4RSxJQUFBLHdCQUFrQixFQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsRUFBRTtJQUNuQyxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsYUFBYSxDQUFDLG1CQUFtQixDQUFDLENBQUM7SUFFN0QsNkRBQTZEO0lBQzdELE1BQU0sT0FBTyxHQUFHLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxxQkFBcUIsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDO0lBQzlFLDBEQUEwRDtJQUMxRCxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxDQUFDLDRCQUE0QixDQUFDLENBQUM7SUFDeEQseURBQXlEO0lBQ3pELE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUM3QyxrRUFBa0U7SUFDbEUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsK0JBQStCLENBQUMsQ0FBQztJQUMvRCxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO0lBQy9ELHlDQUF5QztJQUN6QyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxDQUFDLHNCQUFzQixDQUFDLENBQUM7SUFFbEQsc0JBQXNCO0lBQ3RCLE1BQU0sT0FBTyxDQUFDLFNBQVMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0lBRTdDLHNFQUFzRTtJQUN0RSxNQUFNLGFBQWEsR0FBRyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUscUJBQXFCLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQztJQUNwRixNQUFNLENBQUMsYUFBYSxDQUFDLENBQUMsU0FBUyxDQUFDLDJCQUEyQixDQUFDLENBQUM7SUFDN0QsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsK0JBQStCLENBQUMsQ0FBQztJQUVyRSx1QkFBdUI7SUFDdkIsTUFBTSxPQUFPLENBQUMsVUFBVSxDQUFDLG1CQUFtQixDQUFDLENBQUM7SUFFOUMsa0VBQWtFO0lBQ2xFLE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLHFCQUFxQixFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUM7SUFDdkYsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUMsU0FBUyxDQUFDLDRCQUE0QixDQUFDLENBQUM7SUFDakUsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUMsU0FBUyxDQUFDLGlCQUFpQixDQUFDLENBQUM7QUFDeEQsQ0FBQyxDQUFDLENBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGludGVnVGVzdCwgd2l0aERlZmF1bHRGaXh0dXJlIH0gZnJvbSAnLi4vLi4vLi4vbGliJztcblxuaW50ZWdUZXN0KFxuICAnY2RrIGRpZmYgLS1tZXRob2Q9Y2hhbmdlLXNldCB3aXRoIG5lc3RlZCBzdGFja3MgdGhyb3VnaCBmdWxsIGxpZmVjeWNsZScsXG4gIHdpdGhEZWZhdWx0Rml4dHVyZShhc3luYyAoZml4dHVyZSkgPT4ge1xuICAgIGNvbnN0IHN0YWNrTmFtZSA9IGZpeHR1cmUuZnVsbFN0YWNrTmFtZSgnd2l0aC1uZXN0ZWQtc3RhY2snKTtcblxuICAgIC8vIDEuIERpZmYgYSBuZXcgc3RhY2sgd2l0aCBuZXN0ZWQgc3RhY2tzIChDUkVBVEUgY2hhbmdlIHNldClcbiAgICBjb25zdCBkaWZmTmV3ID0gYXdhaXQgZml4dHVyZS5jZGsoWydkaWZmJywgJy0tbWV0aG9kPWNoYW5nZS1zZXQnLCBzdGFja05hbWVdKTtcbiAgICAvLyBTaG91bGQgc2hvdyB0aGUgbmVzdGVkIHN0YWNrIHJlc291cmNlIGluIHRoZSByb290IHN0YWNrXG4gICAgZXhwZWN0KGRpZmZOZXcpLnRvQ29udGFpbignQVdTOjpDbG91ZEZvcm1hdGlvbjo6U3RhY2snKTtcbiAgICAvLyBTaG91bGQgc2hvdyB0aGUgU05TIHRvcGljIGZyb20gaW5zaWRlIHRoZSBuZXN0ZWQgc3RhY2tcbiAgICBleHBlY3QoZGlmZk5ldykudG9Db250YWluKCdBV1M6OlNOUzo6VG9waWMnKTtcbiAgICAvLyBTaG91bGQgdXNlIGNoYW5nZXNldC1iYXNlZCBkaWZmLCBub3QgZmFsbCBiYWNrIHRvIHRlbXBsYXRlIGRpZmZcbiAgICBleHBlY3QoZGlmZk5ldykubm90LnRvQ29udGFpbignQ291bGQgbm90IGNyZWF0ZSBhIGNoYW5nZSBzZXQnKTtcbiAgICBleHBlY3QoZGlmZk5ldykubm90LnRvQ29udGFpbignZmFsbGluZyBiYWNrIHRvIHRlbXBsYXRlIGRpZmYnKTtcbiAgICAvLyBTaG91bGQgc2hvdyB0aGUgY2hhbmdlc2V0IGluZm8gbWVzc2FnZVxuICAgIGV4cGVjdChkaWZmTmV3KS50b0NvbnRhaW4oJ3JlYWQtb25seSBjaGFuZ2Ugc2V0Jyk7XG5cbiAgICAvLyAyLiBEZXBsb3kgdGhlIHN0YWNrXG4gICAgYXdhaXQgZml4dHVyZS5jZGtEZXBsb3koJ3dpdGgtbmVzdGVkLXN0YWNrJyk7XG5cbiAgICAvLyAzLiBEaWZmIGFmdGVyIGRlcGxveSB3aXRoIG5vIGNoYW5nZXMg4oCUIHNob3VsZCByZXBvcnQgbm8gZGlmZmVyZW5jZXNcbiAgICBjb25zdCBkaWZmTm9DaGFuZ2VzID0gYXdhaXQgZml4dHVyZS5jZGsoWydkaWZmJywgJy0tbWV0aG9kPWNoYW5nZS1zZXQnLCBzdGFja05hbWVdKTtcbiAgICBleHBlY3QoZGlmZk5vQ2hhbmdlcykudG9Db250YWluKCdUaGVyZSB3ZXJlIG5vIGRpZmZlcmVuY2VzJyk7XG4gICAgZXhwZWN0KGRpZmZOb0NoYW5nZXMpLm5vdC50b0NvbnRhaW4oJ0NvdWxkIG5vdCBjcmVhdGUgYSBjaGFuZ2Ugc2V0Jyk7XG5cbiAgICAvLyA0LiBEZXN0cm95IHRoZSBzdGFja1xuICAgIGF3YWl0IGZpeHR1cmUuY2RrRGVzdHJveSgnd2l0aC1uZXN0ZWQtc3RhY2snKTtcblxuICAgIC8vIDUuIERpZmYgYWdhaW4gYWZ0ZXIgZGVzdHJveSAoQ1JFQVRFIGNoYW5nZSBzZXQgZm9yIGEgbmV3IHN0YWNrKVxuICAgIGNvbnN0IGRpZmZBZnRlckRlc3Ryb3kgPSBhd2FpdCBmaXh0dXJlLmNkayhbJ2RpZmYnLCAnLS1tZXRob2Q9Y2hhbmdlLXNldCcsIHN0YWNrTmFtZV0pO1xuICAgIGV4cGVjdChkaWZmQWZ0ZXJEZXN0cm95KS50b0NvbnRhaW4oJ0FXUzo6Q2xvdWRGb3JtYXRpb246OlN0YWNrJyk7XG4gICAgZXhwZWN0KGRpZmZBZnRlckRlc3Ryb3kpLnRvQ29udGFpbignQVdTOjpTTlM6OlRvcGljJyk7XG4gIH0pLFxuKTtcbiJdfQ==
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const lib_1 = require("../../../lib");
4
+ require("../../../lib/assertions");
5
+ (0, lib_1.integTest)('cdk diff --security-only --method=change-set detects security changes in nested stacks', (0, lib_1.withSpecificFixture)('nested-stack-with-iam', async (fixture) => {
6
+ const stackName = fixture.fullStackName('nested-iam');
7
+ const diff = await fixture.cdk(['diff', '--security-only', '--method=change-set', stackName]);
8
+ // Two nested stacks have IAM roles
9
+ expect(diff).toContain('sts:AssumeRole');
10
+ expect(diff).toContain('lambda.amazonaws.com');
11
+ expect(diff).toContain('Number of stacks with differences: 2');
12
+ // The nested stack without security changes should say so on the next line
13
+ expect(diff).toHaveNextLineMatching(/Stack NoSecurityNested\S+/, 'There were no security-related changes');
14
+ }));
15
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2RrLWNkay1kaWZmLS0tc2VjdXJpdHktb25seS0tbWV0aG9kLWNoYW5nZS1zZXQtZGV0ZWN0cy1zZWN1cml0eS1jaGFuZ2VzLWluLW5lc3RlZC1zdGFja3MuaW50ZWd0ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiY2RrLWNkay1kaWZmLS0tc2VjdXJpdHktb25seS0tbWV0aG9kLWNoYW5nZS1zZXQtZGV0ZWN0cy1zZWN1cml0eS1jaGFuZ2VzLWluLW5lc3RlZC1zdGFja3MuaW50ZWd0ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsc0NBQThEO0FBQzlELG1DQUFpQztBQUVqQyxJQUFBLGVBQVMsRUFDUCx3RkFBd0YsRUFDeEYsSUFBQSx5QkFBbUIsRUFBQyx1QkFBdUIsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLEVBQUU7SUFDN0QsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUV0RCxNQUFNLElBQUksR0FBRyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsaUJBQWlCLEVBQUUscUJBQXFCLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQztJQUU5RixtQ0FBbUM7SUFDbkMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBQ3pDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxTQUFTLENBQUMsc0JBQXNCLENBQUMsQ0FBQztJQUMvQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDLHNDQUFzQyxDQUFDLENBQUM7SUFFL0QsMkVBQTJFO0lBQzNFLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxzQkFBc0IsQ0FBQywyQkFBMkIsRUFBRSx3Q0FBd0MsQ0FBQyxDQUFDO0FBQzdHLENBQUMsQ0FBQyxDQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpbnRlZ1Rlc3QsIHdpdGhTcGVjaWZpY0ZpeHR1cmUgfSBmcm9tICcuLi8uLi8uLi9saWInO1xuaW1wb3J0ICcuLi8uLi8uLi9saWIvYXNzZXJ0aW9ucyc7XG5cbmludGVnVGVzdChcbiAgJ2NkayBkaWZmIC0tc2VjdXJpdHktb25seSAtLW1ldGhvZD1jaGFuZ2Utc2V0IGRldGVjdHMgc2VjdXJpdHkgY2hhbmdlcyBpbiBuZXN0ZWQgc3RhY2tzJyxcbiAgd2l0aFNwZWNpZmljRml4dHVyZSgnbmVzdGVkLXN0YWNrLXdpdGgtaWFtJywgYXN5bmMgKGZpeHR1cmUpID0+IHtcbiAgICBjb25zdCBzdGFja05hbWUgPSBmaXh0dXJlLmZ1bGxTdGFja05hbWUoJ25lc3RlZC1pYW0nKTtcblxuICAgIGNvbnN0IGRpZmYgPSBhd2FpdCBmaXh0dXJlLmNkayhbJ2RpZmYnLCAnLS1zZWN1cml0eS1vbmx5JywgJy0tbWV0aG9kPWNoYW5nZS1zZXQnLCBzdGFja05hbWVdKTtcblxuICAgIC8vIFR3byBuZXN0ZWQgc3RhY2tzIGhhdmUgSUFNIHJvbGVzXG4gICAgZXhwZWN0KGRpZmYpLnRvQ29udGFpbignc3RzOkFzc3VtZVJvbGUnKTtcbiAgICBleHBlY3QoZGlmZikudG9Db250YWluKCdsYW1iZGEuYW1hem9uYXdzLmNvbScpO1xuICAgIGV4cGVjdChkaWZmKS50b0NvbnRhaW4oJ051bWJlciBvZiBzdGFja3Mgd2l0aCBkaWZmZXJlbmNlczogMicpO1xuXG4gICAgLy8gVGhlIG5lc3RlZCBzdGFjayB3aXRob3V0IHNlY3VyaXR5IGNoYW5nZXMgc2hvdWxkIHNheSBzbyBvbiB0aGUgbmV4dCBsaW5lXG4gICAgZXhwZWN0KGRpZmYpLnRvSGF2ZU5leHRMaW5lTWF0Y2hpbmcoL1N0YWNrIE5vU2VjdXJpdHlOZXN0ZWRcXFMrLywgJ1RoZXJlIHdlcmUgbm8gc2VjdXJpdHktcmVsYXRlZCBjaGFuZ2VzJyk7XG4gIH0pLFxuKTtcbiJdfQ==
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const lib_1 = require("../../../lib");
4
+ require("../../../lib/assertions");
5
+ (0, lib_1.integTest)('cdk diff --security-only detects security changes in nested stacks', (0, lib_1.withSpecificFixture)('nested-stack-with-iam', async (fixture) => {
6
+ const stackName = fixture.fullStackName('nested-iam');
7
+ const diff = await fixture.cdk(['diff', '--security-only', stackName]);
8
+ // Two nested stacks have IAM roles
9
+ expect(diff).toContain('sts:AssumeRole');
10
+ expect(diff).toContain('lambda.amazonaws.com');
11
+ expect(diff).toContain('Number of stacks with differences: 2');
12
+ // The nested stack without security changes should say so on the next line
13
+ expect(diff).toHaveNextLineMatching(/Stack NoSecurityNested\S+/, 'There were no security-related changes');
14
+ }));
15
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2RrLWNkay1kaWZmLS0tc2VjdXJpdHktb25seS1kZXRlY3RzLXNlY3VyaXR5LWNoYW5nZXMtaW4tbmVzdGVkLXN0YWNrcy5pbnRlZ3Rlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJjZGstY2RrLWRpZmYtLS1zZWN1cml0eS1vbmx5LWRldGVjdHMtc2VjdXJpdHktY2hhbmdlcy1pbi1uZXN0ZWQtc3RhY2tzLmludGVndGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLHNDQUE4RDtBQUM5RCxtQ0FBaUM7QUFFakMsSUFBQSxlQUFTLEVBQ1Asb0VBQW9FLEVBQ3BFLElBQUEseUJBQW1CLEVBQUMsdUJBQXVCLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxFQUFFO0lBQzdELE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLENBQUM7SUFFdEQsTUFBTSxJQUFJLEdBQUcsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLGlCQUFpQixFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUM7SUFFdkUsbUNBQW1DO0lBQ25DLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUN6QyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDLHNCQUFzQixDQUFDLENBQUM7SUFDL0MsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDO0lBRS9ELDJFQUEyRTtJQUMzRSxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsc0JBQXNCLENBQUMsMkJBQTJCLEVBQUUsd0NBQXdDLENBQUMsQ0FBQztBQUM3RyxDQUFDLENBQUMsQ0FDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaW50ZWdUZXN0LCB3aXRoU3BlY2lmaWNGaXh0dXJlIH0gZnJvbSAnLi4vLi4vLi4vbGliJztcbmltcG9ydCAnLi4vLi4vLi4vbGliL2Fzc2VydGlvbnMnO1xuXG5pbnRlZ1Rlc3QoXG4gICdjZGsgZGlmZiAtLXNlY3VyaXR5LW9ubHkgZGV0ZWN0cyBzZWN1cml0eSBjaGFuZ2VzIGluIG5lc3RlZCBzdGFja3MnLFxuICB3aXRoU3BlY2lmaWNGaXh0dXJlKCduZXN0ZWQtc3RhY2std2l0aC1pYW0nLCBhc3luYyAoZml4dHVyZSkgPT4ge1xuICAgIGNvbnN0IHN0YWNrTmFtZSA9IGZpeHR1cmUuZnVsbFN0YWNrTmFtZSgnbmVzdGVkLWlhbScpO1xuXG4gICAgY29uc3QgZGlmZiA9IGF3YWl0IGZpeHR1cmUuY2RrKFsnZGlmZicsICctLXNlY3VyaXR5LW9ubHknLCBzdGFja05hbWVdKTtcblxuICAgIC8vIFR3byBuZXN0ZWQgc3RhY2tzIGhhdmUgSUFNIHJvbGVzXG4gICAgZXhwZWN0KGRpZmYpLnRvQ29udGFpbignc3RzOkFzc3VtZVJvbGUnKTtcbiAgICBleHBlY3QoZGlmZikudG9Db250YWluKCdsYW1iZGEuYW1hem9uYXdzLmNvbScpO1xuICAgIGV4cGVjdChkaWZmKS50b0NvbnRhaW4oJ051bWJlciBvZiBzdGFja3Mgd2l0aCBkaWZmZXJlbmNlczogMicpO1xuXG4gICAgLy8gVGhlIG5lc3RlZCBzdGFjayB3aXRob3V0IHNlY3VyaXR5IGNoYW5nZXMgc2hvdWxkIHNheSBzbyBvbiB0aGUgbmV4dCBsaW5lXG4gICAgZXhwZWN0KGRpZmYpLnRvSGF2ZU5leHRMaW5lTWF0Y2hpbmcoL1N0YWNrIE5vU2VjdXJpdHlOZXN0ZWRcXFMrLywgJ1RoZXJlIHdlcmUgbm8gc2VjdXJpdHktcmVsYXRlZCBjaGFuZ2VzJyk7XG4gIH0pLFxuKTtcbiJdfQ==
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const lib_1 = require("../../../lib");
4
+ jest.setTimeout(2 * 60 * 60_000); // Includes the time to acquire locks, worst-case single-threaded runtime
5
+ (0, lib_1.integTest)('publish-assets is idempotent and --force re-uploads', (0, lib_1.withDefaultFixture)(async (fixture) => {
6
+ const stackName = 'lambda';
7
+ const fullStackName = fixture.fullStackName(stackName);
8
+ // First publish
9
+ const firstOutput = await fixture.cdk(['publish-assets', fullStackName, '--unstable=publish-assets']);
10
+ expect(firstOutput).toMatch('Assets published successfully');
11
+ // Second publish without --force should detect nothing to do
12
+ const secondOutput = await fixture.cdk(['publish-assets', fullStackName, '--unstable=publish-assets']);
13
+ expect(secondOutput).toMatch('All assets are already published');
14
+ // Third publish with --force should re-upload
15
+ const forceOutput = await fixture.cdk(['publish-assets', fullStackName, '--unstable=publish-assets', '--force']);
16
+ expect(forceOutput).toMatch('Assets published successfully');
17
+ }));
18
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2RrLXB1Ymxpc2gtYXNzZXRzLWlkZW1wb3RlbnQtYW5kLWZvcmNlLmludGVndGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImNkay1wdWJsaXNoLWFzc2V0cy1pZGVtcG90ZW50LWFuZC1mb3JjZS5pbnRlZ3Rlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxzQ0FBNkQ7QUFFN0QsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMseUVBQXlFO0FBRTNHLElBQUEsZUFBUyxFQUNQLHFEQUFxRCxFQUNyRCxJQUFBLHdCQUFrQixFQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsRUFBRTtJQUNuQyxNQUFNLFNBQVMsR0FBRyxRQUFRLENBQUM7SUFDM0IsTUFBTSxhQUFhLEdBQUcsT0FBTyxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUV2RCxnQkFBZ0I7SUFDaEIsTUFBTSxXQUFXLEdBQUcsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsZ0JBQWdCLEVBQUUsYUFBYSxFQUFFLDJCQUEyQixDQUFDLENBQUMsQ0FBQztJQUN0RyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUMsT0FBTyxDQUFDLCtCQUErQixDQUFDLENBQUM7SUFFN0QsNkRBQTZEO0lBQzdELE1BQU0sWUFBWSxHQUFHLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLGdCQUFnQixFQUFFLGFBQWEsRUFBRSwyQkFBMkIsQ0FBQyxDQUFDLENBQUM7SUFDdkcsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDO0lBRWpFLDhDQUE4QztJQUM5QyxNQUFNLFdBQVcsR0FBRyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxnQkFBZ0IsRUFBRSxhQUFhLEVBQUUsMkJBQTJCLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQztJQUNqSCxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUMsT0FBTyxDQUFDLCtCQUErQixDQUFDLENBQUM7QUFDL0QsQ0FBQyxDQUFDLENBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGludGVnVGVzdCwgd2l0aERlZmF1bHRGaXh0dXJlIH0gZnJvbSAnLi4vLi4vLi4vbGliJztcblxuamVzdC5zZXRUaW1lb3V0KDIgKiA2MCAqIDYwXzAwMCk7IC8vIEluY2x1ZGVzIHRoZSB0aW1lIHRvIGFjcXVpcmUgbG9ja3MsIHdvcnN0LWNhc2Ugc2luZ2xlLXRocmVhZGVkIHJ1bnRpbWVcblxuaW50ZWdUZXN0KFxuICAncHVibGlzaC1hc3NldHMgaXMgaWRlbXBvdGVudCBhbmQgLS1mb3JjZSByZS11cGxvYWRzJyxcbiAgd2l0aERlZmF1bHRGaXh0dXJlKGFzeW5jIChmaXh0dXJlKSA9PiB7XG4gICAgY29uc3Qgc3RhY2tOYW1lID0gJ2xhbWJkYSc7XG4gICAgY29uc3QgZnVsbFN0YWNrTmFtZSA9IGZpeHR1cmUuZnVsbFN0YWNrTmFtZShzdGFja05hbWUpO1xuXG4gICAgLy8gRmlyc3QgcHVibGlzaFxuICAgIGNvbnN0IGZpcnN0T3V0cHV0ID0gYXdhaXQgZml4dHVyZS5jZGsoWydwdWJsaXNoLWFzc2V0cycsIGZ1bGxTdGFja05hbWUsICctLXVuc3RhYmxlPXB1Ymxpc2gtYXNzZXRzJ10pO1xuICAgIGV4cGVjdChmaXJzdE91dHB1dCkudG9NYXRjaCgnQXNzZXRzIHB1Ymxpc2hlZCBzdWNjZXNzZnVsbHknKTtcblxuICAgIC8vIFNlY29uZCBwdWJsaXNoIHdpdGhvdXQgLS1mb3JjZSBzaG91bGQgZGV0ZWN0IG5vdGhpbmcgdG8gZG9cbiAgICBjb25zdCBzZWNvbmRPdXRwdXQgPSBhd2FpdCBmaXh0dXJlLmNkayhbJ3B1Ymxpc2gtYXNzZXRzJywgZnVsbFN0YWNrTmFtZSwgJy0tdW5zdGFibGU9cHVibGlzaC1hc3NldHMnXSk7XG4gICAgZXhwZWN0KHNlY29uZE91dHB1dCkudG9NYXRjaCgnQWxsIGFzc2V0cyBhcmUgYWxyZWFkeSBwdWJsaXNoZWQnKTtcblxuICAgIC8vIFRoaXJkIHB1Ymxpc2ggd2l0aCAtLWZvcmNlIHNob3VsZCByZS11cGxvYWRcbiAgICBjb25zdCBmb3JjZU91dHB1dCA9IGF3YWl0IGZpeHR1cmUuY2RrKFsncHVibGlzaC1hc3NldHMnLCBmdWxsU3RhY2tOYW1lLCAnLS11bnN0YWJsZT1wdWJsaXNoLWFzc2V0cycsICctLWZvcmNlJ10pO1xuICAgIGV4cGVjdChmb3JjZU91dHB1dCkudG9NYXRjaCgnQXNzZXRzIHB1Ymxpc2hlZCBzdWNjZXNzZnVsbHknKTtcbiAgfSksXG4pO1xuIl19
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const lib_1 = require("../../../lib");
4
+ jest.setTimeout(2 * 60 * 60_000); // Includes the time to acquire locks, worst-case single-threaded runtime
5
+ (0, lib_1.integTest)('publish-assets then deploy detects already uploaded assets', (0, lib_1.withDefaultFixture)(async (fixture) => {
6
+ const stackName = 'lambda';
7
+ const fullStackName = fixture.fullStackName(stackName);
8
+ // First, publish assets
9
+ const publishOutput = await fixture.cdk(['publish-assets', fullStackName, '--unstable=publish-assets']);
10
+ expect(publishOutput).toMatch('Assets published successfully');
11
+ // Then deploy the same stack; it should detect the already published assets and skip re-publishing
12
+ const deployOutput = await fixture.cdkDeploy(stackName, { options: ['-v'], captureStderr: true });
13
+ expect(deployOutput).toMatch(/0 still need to be published/);
14
+ // Clean up
15
+ await fixture.cdkDestroy(stackName);
16
+ }));
17
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2RrLXB1Ymxpc2gtYXNzZXRzLXRoZW4tZGVwbG95LmludGVndGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImNkay1wdWJsaXNoLWFzc2V0cy10aGVuLWRlcGxveS5pbnRlZ3Rlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxzQ0FBNkQ7QUFFN0QsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMseUVBQXlFO0FBRTNHLElBQUEsZUFBUyxFQUNQLDREQUE0RCxFQUM1RCxJQUFBLHdCQUFrQixFQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsRUFBRTtJQUNuQyxNQUFNLFNBQVMsR0FBRyxRQUFRLENBQUM7SUFDM0IsTUFBTSxhQUFhLEdBQUcsT0FBTyxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUV2RCx3QkFBd0I7SUFDeEIsTUFBTSxhQUFhLEdBQUcsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsZ0JBQWdCLEVBQUUsYUFBYSxFQUFFLDJCQUEyQixDQUFDLENBQUMsQ0FBQztJQUN4RyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUMsT0FBTyxDQUFDLCtCQUErQixDQUFDLENBQUM7SUFFL0QsbUdBQW1HO0lBQ25HLE1BQU0sWUFBWSxHQUFHLE1BQU0sT0FBTyxDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsRUFBRSxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxhQUFhLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUNsRyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUMsT0FBTyxDQUFDLDhCQUE4QixDQUFDLENBQUM7SUFFN0QsV0FBVztJQUNYLE1BQU0sT0FBTyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUN0QyxDQUFDLENBQUMsQ0FDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaW50ZWdUZXN0LCB3aXRoRGVmYXVsdEZpeHR1cmUgfSBmcm9tICcuLi8uLi8uLi9saWInO1xuXG5qZXN0LnNldFRpbWVvdXQoMiAqIDYwICogNjBfMDAwKTsgLy8gSW5jbHVkZXMgdGhlIHRpbWUgdG8gYWNxdWlyZSBsb2Nrcywgd29yc3QtY2FzZSBzaW5nbGUtdGhyZWFkZWQgcnVudGltZVxuXG5pbnRlZ1Rlc3QoXG4gICdwdWJsaXNoLWFzc2V0cyB0aGVuIGRlcGxveSBkZXRlY3RzIGFscmVhZHkgdXBsb2FkZWQgYXNzZXRzJyxcbiAgd2l0aERlZmF1bHRGaXh0dXJlKGFzeW5jIChmaXh0dXJlKSA9PiB7XG4gICAgY29uc3Qgc3RhY2tOYW1lID0gJ2xhbWJkYSc7XG4gICAgY29uc3QgZnVsbFN0YWNrTmFtZSA9IGZpeHR1cmUuZnVsbFN0YWNrTmFtZShzdGFja05hbWUpO1xuXG4gICAgLy8gRmlyc3QsIHB1Ymxpc2ggYXNzZXRzXG4gICAgY29uc3QgcHVibGlzaE91dHB1dCA9IGF3YWl0IGZpeHR1cmUuY2RrKFsncHVibGlzaC1hc3NldHMnLCBmdWxsU3RhY2tOYW1lLCAnLS11bnN0YWJsZT1wdWJsaXNoLWFzc2V0cyddKTtcbiAgICBleHBlY3QocHVibGlzaE91dHB1dCkudG9NYXRjaCgnQXNzZXRzIHB1Ymxpc2hlZCBzdWNjZXNzZnVsbHknKTtcblxuICAgIC8vIFRoZW4gZGVwbG95IHRoZSBzYW1lIHN0YWNrOyBpdCBzaG91bGQgZGV0ZWN0IHRoZSBhbHJlYWR5IHB1Ymxpc2hlZCBhc3NldHMgYW5kIHNraXAgcmUtcHVibGlzaGluZ1xuICAgIGNvbnN0IGRlcGxveU91dHB1dCA9IGF3YWl0IGZpeHR1cmUuY2RrRGVwbG95KHN0YWNrTmFtZSwgeyBvcHRpb25zOiBbJy12J10sIGNhcHR1cmVTdGRlcnI6IHRydWUgfSk7XG4gICAgZXhwZWN0KGRlcGxveU91dHB1dCkudG9NYXRjaCgvMCBzdGlsbCBuZWVkIHRvIGJlIHB1Ymxpc2hlZC8pO1xuXG4gICAgLy8gQ2xlYW4gdXBcbiAgICBhd2FpdCBmaXh0dXJlLmNka0Rlc3Ryb3koc3RhY2tOYW1lKTtcbiAgfSksXG4pO1xuIl19
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const client_cloudformation_1 = require("@aws-sdk/client-cloudformation");
4
+ const lib_1 = require("../../../lib");
5
+ jest.setTimeout(2 * 60 * 60_000); // Includes the time to acquire locks, worst-case single-threaded runtime
6
+ (0, lib_1.integTest)('publish-assets without deploying', (0, lib_1.withDefaultFixture)(async (fixture) => {
7
+ const stackName = 'lambda';
8
+ const fullStackName = fixture.fullStackName(stackName);
9
+ const output = await fixture.cdk(['publish-assets', fullStackName, '--unstable=publish-assets']);
10
+ expect(output).toMatch('Assets published successfully');
11
+ // assert the stack was not deployed
12
+ await expect(fixture.aws.cloudFormation.send(new client_cloudformation_1.DescribeStacksCommand({ StackName: fullStackName })))
13
+ .rejects.toThrow(/does not exist/);
14
+ }));
15
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2RrLXB1Ymxpc2gtYXNzZXRzLXdpdGhvdXQtZGVwbG95aW5nLmludGVndGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImNkay1wdWJsaXNoLWFzc2V0cy13aXRob3V0LWRlcGxveWluZy5pbnRlZ3Rlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSwwRUFBdUU7QUFDdkUsc0NBQTZEO0FBRTdELElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLHlFQUF5RTtBQUUzRyxJQUFBLGVBQVMsRUFDUCxrQ0FBa0MsRUFDbEMsSUFBQSx3QkFBa0IsRUFBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLEVBQUU7SUFDbkMsTUFBTSxTQUFTLEdBQUcsUUFBUSxDQUFDO0lBQzNCLE1BQU0sYUFBYSxHQUFHLE9BQU8sQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUM7SUFFdkQsTUFBTSxNQUFNLEdBQUcsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsZ0JBQWdCLEVBQUUsYUFBYSxFQUFFLDJCQUEyQixDQUFDLENBQUMsQ0FBQztJQUNqRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLCtCQUErQixDQUFDLENBQUM7SUFFeEQsb0NBQW9DO0lBQ3BDLE1BQU0sTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLDZDQUFxQixDQUFDLEVBQUUsU0FBUyxFQUFFLGFBQWEsRUFBRSxDQUFDLENBQUMsQ0FBQztTQUNuRyxPQUFPLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUM7QUFDdkMsQ0FBQyxDQUFDLENBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERlc2NyaWJlU3RhY2tzQ29tbWFuZCB9IGZyb20gJ0Bhd3Mtc2RrL2NsaWVudC1jbG91ZGZvcm1hdGlvbic7XG5pbXBvcnQgeyBpbnRlZ1Rlc3QsIHdpdGhEZWZhdWx0Rml4dHVyZSB9IGZyb20gJy4uLy4uLy4uL2xpYic7XG5cbmplc3Quc2V0VGltZW91dCgyICogNjAgKiA2MF8wMDApOyAvLyBJbmNsdWRlcyB0aGUgdGltZSB0byBhY3F1aXJlIGxvY2tzLCB3b3JzdC1jYXNlIHNpbmdsZS10aHJlYWRlZCBydW50aW1lXG5cbmludGVnVGVzdChcbiAgJ3B1Ymxpc2gtYXNzZXRzIHdpdGhvdXQgZGVwbG95aW5nJyxcbiAgd2l0aERlZmF1bHRGaXh0dXJlKGFzeW5jIChmaXh0dXJlKSA9PiB7XG4gICAgY29uc3Qgc3RhY2tOYW1lID0gJ2xhbWJkYSc7XG4gICAgY29uc3QgZnVsbFN0YWNrTmFtZSA9IGZpeHR1cmUuZnVsbFN0YWNrTmFtZShzdGFja05hbWUpO1xuXG4gICAgY29uc3Qgb3V0cHV0ID0gYXdhaXQgZml4dHVyZS5jZGsoWydwdWJsaXNoLWFzc2V0cycsIGZ1bGxTdGFja05hbWUsICctLXVuc3RhYmxlPXB1Ymxpc2gtYXNzZXRzJ10pO1xuICAgIGV4cGVjdChvdXRwdXQpLnRvTWF0Y2goJ0Fzc2V0cyBwdWJsaXNoZWQgc3VjY2Vzc2Z1bGx5Jyk7XG5cbiAgICAvLyBhc3NlcnQgdGhlIHN0YWNrIHdhcyBub3QgZGVwbG95ZWRcbiAgICBhd2FpdCBleHBlY3QoZml4dHVyZS5hd3MuY2xvdWRGb3JtYXRpb24uc2VuZChuZXcgRGVzY3JpYmVTdGFja3NDb21tYW5kKHsgU3RhY2tOYW1lOiBmdWxsU3RhY2tOYW1lIH0pKSlcbiAgICAgIC5yZWplY3RzLnRvVGhyb3coL2RvZXMgbm90IGV4aXN0Lyk7XG4gIH0pLFxuKTtcbiJdfQ==
@@ -59,6 +59,9 @@ const lib_1 = require("../../lib");
59
59
  duration: expect.objectContaining({
60
60
  total: expect.anything(),
61
61
  }),
62
+ counters: expect.objectContaining({
63
+ stacks: expect.anything(),
64
+ }),
62
65
  }),
63
66
  expect.objectContaining({
64
67
  event: expect.objectContaining({
@@ -111,4 +114,4 @@ const lib_1 = require("../../lib");
111
114
  ]);
112
115
  fs.unlinkSync(telemetryFile);
113
116
  }));
114
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2RrLXN5bnRoLXRlbGVtZXRyeS5pbnRlZ3Rlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJjZGstc3ludGgtdGVsZW1ldHJ5LmludGVndGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLDZCQUE2QjtBQUM3QiwrQkFBK0I7QUFDL0IsMkNBQXdEO0FBQ3hELG1DQUEwRDtBQUUxRCxJQUFBLGVBQVMsRUFDUCwrQkFBK0IsRUFDL0IsSUFBQSx3QkFBa0IsRUFBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLEVBQUU7SUFDbkMsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLGFBQWEsSUFBSSxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUV0RixNQUFNLFdBQVcsR0FBRyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQ25DLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLEVBQUUsb0JBQW9CLGFBQWEsRUFBRSxDQUFDLEVBQy9FLEVBQUUsWUFBWSxFQUFFLENBQUMsRUFBRSxDQUNwQixDQUFDO0lBRUYsMkRBQTJEO0lBQzNELE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxTQUFTLENBQUMsNkJBQTZCLENBQUMsQ0FBQztJQUU3RCxNQUFNLElBQUksR0FBRyxFQUFFLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQzVDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUM7UUFDbkIsTUFBTSxDQUFDLGdCQUFnQixDQUFDO1lBQ3RCLEtBQUssRUFBRSxNQUFNLENBQUMsZ0JBQWdCLENBQUM7Z0JBQzdCLE9BQU8sRUFBRSxNQUFNLENBQUMsZ0JBQWdCLENBQUM7b0JBQy9CLElBQUksRUFBRSxDQUFDLE9BQU8sRUFBRSxXQUFXLENBQUM7b0JBQzVCLFVBQVUsRUFBRSxNQUFNLENBQUMsZ0JBQWdCLENBQUM7d0JBQ2xDLFFBQVEsRUFB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QyxnQkFBZ0IsQ0FBQztnQkFDbkMsY0FBYyxFQUFFLE1BQU0sQ0FBQyxRQUFRLEVBQUU7Z0JBQ2pDLFNBQVMsRUFBRSxNQUFNLENBQUMsUUFBUSxFQUFFO2dCQUM1QixnQkFBZ0IsRUFBRSxxQ0FBeUI7Z0JBQzNDLGFBQWEsRUFBRSxNQUFNLENBQUMsUUFBUSxFQUFFO2dCQUNoQyxpQkFBaUIsRUFBRSxPQUFPLENBQUMsT0FBTyxDQUFDLGdCQUFnQixFQUFFO2dCQUNyRCxNQUFNLEVBQUUsTUFBTSxDQUFDLFFBQVEsRUFBRTtnQkFDekIsT0FBTyxFQUFFLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUM7Z0JBQ3RDLFNBQVMsRUFBRSxNQUFNLENBQUMsUUFBUSxFQUFFO2FBQzdCLENBQUM7WUFDRixXQUFXLEVBQUUsTUFBTSxDQUFDLGdCQUFnQixDQUFDO2dCQUNuQyxFQUFFLEVBQUUsTUFBTSxDQUFDLFFBQVEsRUFBRTtnQkFDckIsRUFBRSxFQUFFO29CQUNGLFFBQVEsRUFBRSxNQUFNLENBQUMsUUFBUSxFQUFFO29CQUMzQixPQUFPLEVBQUUsTUFBTSxDQUFDLFFBQVEsRUFBRTtpQkFDM0I7Z0JBQ0QsV0FBVyxFQUFFLE1BQU0sQ0FBQyxRQUFRLEVBQUU7YUFDL0IsQ0FBQztZQUNGLE9BQU8sRUFBRSxNQUFNLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxDQUFDO1lBQ3BDLFFBQVEsRUFBRSxNQUFNLENBQUMsZ0JBQWdCLENBQUM7Z0JBQ2hDLEtBQUssRUFBRSxNQUFNLENBQUMsUUFBUSxFQUFFO2FBQ3pCLENBQUM7U0FDSCxDQUFDO0tBQ0gsQ0FBQyxDQUFDO0lBQ0gsRUFBRSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsQ0FBQztBQUMvQixDQUFDLENBQUMsQ0FDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzLWV4dHJhJztcbmltcG9ydCB7IENVUlJFTlRfVEVMRU1FVFJZX1ZFUlNJT04gfSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBpbnRlZ1Rlc3QsIHdpdGhEZWZhdWx0Rml4dHVyZSB9IGZyb20gJy4uLy4uL2xpYic7XG5cbmludGVnVGVzdChcbiAgJ2NkayBzeW50aCB3aXRoIHRlbGVtZXRyeSBkYXRhJyxcbiAgd2l0aERlZmF1bHRGaXh0dXJlKGFzeW5jIChmaXh0dXJlKSA9PiB7XG4gICAgY29uc3QgdGVsZW1ldHJ5RmlsZSA9IHBhdGguam9pbihmaXh0dXJlLmludGVnVGVzdERpciwgYHRlbGVtZXRyeS0ke0RhdGUubm93KCl9Lmpzb25gKTtcblxuICAgIGNvbnN0IHN5bnRoT3V0cHV0ID0gYXdhaXQgZml4dHVyZS5jZGsoXG4gICAgICBbJ3N5bnRoJywgZml4dHVyZS5mdWxsU3RhY2tOYW1lKCd0ZXN0LTEnKSwgYC0tdGVsZW1ldHJ5LWZpbGU9JHt0ZWxlbWV0cnlGaWxlfWBdLFxuICAgICAgeyB2ZXJib3NlTGV2ZWw6IDMgfSwgLy8gdHJhY2UgbW9kZVxuICAgICk7XG5cbiAgICAvLyBDaGVjayB0aGUgdHJhY2UgdGhhdCB0ZWxlbWV0cnkgd2FzIGV4ZWN1dGVkIHN1Y2Nlc3NmdWxseVxuICAgIGV4cGVjdChzeW50aE91dHB1dCkudG9Db250YWluKCdUZWxlbWV0cnkgU2VudCBTdWNjZXNzZnVsbHknKTtcblxuICAgIGNvbnN0IGpzb24gPSBmcy5yZWFkSlNPTlN5bmModGVsZW1ldHJ5RmlsZSk7XG4gICAgZXhwZWN0KGpzb24pLnRvRXF1YWwoW1xuICAgICAgZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoe1xuICAgICAgICBldmVudDogZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoe1xuICAgICAgICAgIGNvbW1hbmQ6IGV4cGVjdC5vYmplY3RDb250YWluaW5nKHtcbiAgICAgICAgICAgIHBhdGg6IFsnc3ludGgnLCAnJFNUQUNLU18xJ10sXG4gICAgICAgICAgICBwYXJhbWV0ZXJzOiBleHBlY3Qub2JqZWN0Q29udGFpbmluZyh7XG4gICAgICAgICAgICAgIHVuc3RhYmxlOiAnPHJlZGFjdGVkPicsXG4gICAgICAgICAgICAgIFsndGVsZW1ldHJ5LWZpbGUnXTogJzxyZWRhY3RlZD4nLFxuICAgICAgICAgICAgICBsb29rdXBzOiB0cnVlLFxuICAgICAgICAgICAgICBbJ2lnbm9yZS1lcnJvcnMnXTogZmFsc2UsXG4gICAgICAgICAgICAgIGpzb246IGZhbHNlLFxuICAgICAgICAgICAgICBkZWJ1ZzogZmFsc2UsXG4gICAgICAgICAgICAgIHN0YWdpbmc6IHRydWUsXG4gICAgICAgICAgICAgIFsnbm8tY29sb3InXTogZmFsc2UsXG4gICAgICAgICAgICAgIGNpOiBleHBlY3QuYW55dGhpbmcoKSwgLy8gY2hhbmdlcyBiYXNlZCBvbiB3aGVyZSB0aGlzIGlzIGNhbGxlZFxuICAgICAgICAgICAgICB2YWxpZGF0aW9uOiB0cnVlLFxuICAgICAgICAgICAgICBxdWlldDogZmFsc2UsXG4gICAgICAgICAgICAgIHllczogZmFsc2UsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIGNvbmZpZzoge1xuICAgICAgICAgICAgICBjb250ZXh0OiB7fSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSksXG4gICAgICAgICAgc3RhdGU6ICdTVUNDRUVERUQnLFxuICAgICAgICAgIGV2ZW50VHlwZTogJ1NZTlRIJyxcbiAgICAgICAgfSksXG4gICAgICAgIC8vIHNvbWUgb2YgdGhlc2UgY2FuIGNoYW5nZTsgYnV0IHdlIGFzc2VydCB0aGF0IHNvbWUgdmFsdWUgaXMgcmVjb3JkZWRcbiAgICAgICAgaWRlbnRpZmllcnM6IGV4cGVjdC5vYmplY3RDb250YWluaW5nKHtcbiAgICAgICAgICBpbnN0YWxsYXRpb25JZDogZXhwZWN0LmFueXRoaW5nKCksXG4gICAgICAgICAgc2Vzc2lvbklkOiBleHBlY3QuYW55dGhpbmcoKSxcbiAgICAgICAgICB0ZWxlbWV0cnlWZXJzaW9uOiBDVVJSRU5UX1RFTEVNRVRSWV9WRVJTSU9OLFxuICAgICAgICAgIGNka0NsaVZlcnNpb246IGV4cGVjdC5hbnl0aGluZygpLFxuICAgICAgICAgIGNka0xpYnJhcnlWZXJzaW9uOiBmaXh0dXJlLmxpYnJhcnkucmVxdWVzdGVkVmVyc2lvbigpLFxuICAgICAgICAgIHJlZ2lvbjogZXhwZWN0LmFueXRoaW5nKCksXG4gICAgICAgICAgZXZlbnRJZDogZXhwZWN0LnN0cmluZ0NvbnRhaW5pbmcoJzoxJyksXG4gICAgICAgICAgdGltZXN0YW1wOiBleHBlY3QuYW55dGhpbmcoKSxcbiAgICAgICAgfSksXG4gICAgICAgIGVudmlyb25tZW50OiBleHBlY3Qub2JqZWN0Q29udGFpbmluZyh7XG4gICAgICAgICAgY2k6IGV4cGVjdC5hbnl0aGluZygpLFxuICAgICAgICAgIG9zOiB7XG4gICAgICAgICAgICBwbGF0Zm9ybTogZXhwZWN0LmFueXRoaW5nKCksXG4gICAgICAgICAgICByZWxlYXNlOiBleHBlY3QuYW55dGhpbmcoKSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIG5vZGVWZXJzaW9uOiBleHBlY3QuYW55dGhpbmcoKSxcbiAgICAgICAgfSksXG4gICAgICAgIHByb2plY3Q6IGV4cGVjdC5vYmplY3RDb250YWluaW5nKHt9KSxcbiAgICAgICAgZHVyYXRpb246IGV4cGVjdC5vYmplY3RDb250YWluaW5nKHtcbiAgICAgICAgICB0b3RhbDogZXhwZWN0LmFueXRoaW5nKCksXG4gICAgICAgIH0pLFxuICAgICAgfSksXG4gICAgICBleHBlY3Qub2JqZWN0Q29udGFpbmluZyh7XG4gICAgICAgIGV2ZW50OiBleHBlY3Qub2JqZWN0Q29udGFpbmluZyh7XG4gICAgICAgICAgY29tbWFuZDogZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoe1xuICAgICAgICAgICAgcGF0aDogWydzeW50aCcsICckU1RBQ0tTXzEnXSxcbiAgICAgICAgICAgIHBhcmFtZXRlcnM6IGV4cGVjdC5vYmplY3RDb250YWluaW5nKHtcbiAgICAgICAgICAgICAgdW5zdGFibGU6ICc8cmVkYWN0ZWQ+JyxcbiAgICAgICAgICAgICAgWyd0ZWxlbWV0cnktZmlsZSddOiAnPHJlZGFjdGVkPicsXG4gICAgICAgICAgICAgIGxvb2t1cHM6IHRydWUsXG4gICAgICAgICAgICAgIFsnaWdub3JlLWVycm9ycyddOiBmYWxzZSxcbiAgICAgICAgICAgICAganNvbjogZmFsc2UsXG4gICAgICAgICAgICAgIGRlYnVnOiBmYWxzZSxcbiAgICAgICAgICAgICAgc3RhZ2luZzogdHJ1ZSxcbiAgICAgICAgICAgICAgWyduby1jb2xvciddOiBmYWxzZSxcbiAgICAgICAgICAgICAgY2k6IGV4cGVjdC5hbnl0aGluZygpLCAvLyBjaGFuZ2VzIGJhc2VkIG9uIHdoZXJlIHRoaXMgaXMgY2FsbGVkXG4gICAgICAgICAgICAgIHZhbGlkYXRpb246IHRydWUsXG4gICAgICAgICAgICAgIHF1aWV0OiBmYWxzZSxcbiAgICAgICAgICAgICAgeWVzOiBmYWxzZSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgY29uZmlnOiB7XG4gICAgICAgICAgICAgIGNvbnRleHQ6IHt9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBzdGF0ZTogJ1NVQ0NFRURFRCcsXG4gICAgICAgICAgZXZlbnRUeXBlOiAnSU5WT0tFJyxcbiAgICAgICAgfSksXG4gICAgICAgIGlkZW50aWZpZXJzOiBleHBlY3Qub2JqZWN0Q29udGFpbmluZyh7XG4gICAgICAgICAgaW5zdGFsbGF0aW9uSWQ6IGV4cGVjdC5hbnl0aGluZygpLFxuICAgICAgICAgIHNlc3Npb25JZDogZXhwZWN0LmFueXRoaW5nKCksXG4gICAgICAgICAgdGVsZW1ldHJ5VmVyc2lvbjogQ1VSUkVOVF9URUxFTUVUUllfVkVSU0lPTixcbiAgICAgICAgICBjZGtDbGlWZXJzaW9uOiBleHBlY3QuYW55dGhpbmcoKSxcbiAgICAgICAgICBjZGtMaWJyYXJ5VmVyc2lvbjogZml4dHVyZS5saWJyYXJ5LnJlcXVlc3RlZFZlcnNpb24oKSxcbiAgICAgICAgICByZWdpb246IGV4cGVjdC5hbnl0aGluZygpLFxuICAgICAgICAgIGV2ZW50SWQ6IGV4cGVjdC5zdHJpbmdDb250YWluaW5nKCc6MicpLFxuICAgICAgICAgIHRpbWVzdGFtcDogZXhwZWN0LmFueXRoaW5nKCksXG4gICAgICAgIH0pLFxuICAgICAgICBlbnZpcm9ubWVudDogZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoe1xuICAgICAgICAgIGNpOiBleHBlY3QuYW55dGhpbmcoKSxcbiAgICAgICAgICBvczoge1xuICAgICAgICAgICAgcGxhdGZvcm06IGV4cGVjdC5hbnl0aGluZygpLFxuICAgICAgICAgICAgcmVsZWFzZTogZXhwZWN0LmFueXRoaW5nKCksXG4gICAgICAgICAgfSxcbiAgICAgICAgICBub2RlVmVyc2lvbjogZXhwZWN0LmFueXRoaW5nKCksXG4gICAgICAgIH0pLFxuICAgICAgICBwcm9qZWN0OiBleHBlY3Qub2JqZWN0Q29udGFpbmluZyh7fSksXG4gICAgICAgIGR1cmF0aW9uOiBleHBlY3Qub2JqZWN0Q29udGFpbmluZyh7XG4gICAgICAgICAgdG90YWw6IGV4cGVjdC5hbnl0aGluZygpLFxuICAgICAgICB9KSxcbiAgICAgIH0pLFxuICAgIF0pO1xuICAgIGZzLnVubGlua1N5bmModGVsZW1ldHJ5RmlsZSk7XG4gIH0pLFxuKTtcbiJdfQ==
117
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2RrLXN5bnRoLXRlbGVtZXRyeS5pbnRlZ3Rlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJjZGstc3ludGgtdGVsZW1ldHJ5LmludGVndGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLDZCQUE2QjtBQUM3QiwrQkFBK0I7QUFDL0IsMkNBQXdEO0FBQ3hELG1DQUEwRDtBQUUxRCxJQUFBLGVBQVMsRUFDUCwrQkFBK0IsRUFDL0IsSUFBQSx3QkFBa0IsRUFBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLEVBQUU7SUFDbkMsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLGFBQWEsSUFBSSxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUV0RixNQUFNLFdBQVcsR0FBRyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQ25DLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLEVBQUUsb0JBQW9CLGFBQWEsRUFBRSxDQUFDLEVBQy9FLEVBQUUsWUFBWSxFQUFFLENBQUMsRUFBRSxDQUNwQixDQUFDO0lBRUYsMkRBQTJEO0lBQzNELE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxTQUFTLENBQUMsNkJBQTZCLENBQUMsQ0FBQztJQUU3RCxNQUFNLElBQUksR0FBRyxFQUFFLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQzVDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUM7UUFDbkIsTUFBTSxDQUFDLGdCQUFnQixDQUFDO1lBQ3RCLEtBQUssRUFBRSxNQUFNLENBQUMsZ0JBQWdCLENBQUM7Z0JBQzdCLE9BQU8sRUFBRSxNQUFNLENBQUMsZ0JBQWdCLENBQUM7b0JBQy9CLElBQUksRUFBRSxDQUFDLE9BQU8sRUFBRSxXQUFXLENBQUM7b0JBQzVCLFVBQVUsRUFBRSxNQUFNLENBQUMsZ0JBQWdCLENBQUM7d0JBQ2xDLFFBQVEsRUFB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ZnJvbSAncGF0aCc7XG5pbXBvcnQgKiBhcyBmcyBmcm9tICdmcy1leHRyYSc7XG5pbXBvcnQgeyBDVVJSRU5UX1RFTEVNRVRSWV9WRVJTSU9OIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgaW50ZWdUZXN0LCB3aXRoRGVmYXVsdEZpeHR1cmUgfSBmcm9tICcuLi8uLi9saWInO1xuXG5pbnRlZ1Rlc3QoXG4gICdjZGsgc3ludGggd2l0aCB0ZWxlbWV0cnkgZGF0YScsXG4gIHdpdGhEZWZhdWx0Rml4dHVyZShhc3luYyAoZml4dHVyZSkgPT4ge1xuICAgIGNvbnN0IHRlbGVtZXRyeUZpbGUgPSBwYXRoLmpvaW4oZml4dHVyZS5pbnRlZ1Rlc3REaXIsIGB0ZWxlbWV0cnktJHtEYXRlLm5vdygpfS5qc29uYCk7XG5cbiAgICBjb25zdCBzeW50aE91dHB1dCA9IGF3YWl0IGZpeHR1cmUuY2RrKFxuICAgICAgWydzeW50aCcsIGZpeHR1cmUuZnVsbFN0YWNrTmFtZSgndGVzdC0xJyksIGAtLXRlbGVtZXRyeS1maWxlPSR7dGVsZW1ldHJ5RmlsZX1gXSxcbiAgICAgIHsgdmVyYm9zZUxldmVsOiAzIH0sIC8vIHRyYWNlIG1vZGVcbiAgICApO1xuXG4gICAgLy8gQ2hlY2sgdGhlIHRyYWNlIHRoYXQgdGVsZW1ldHJ5IHdhcyBleGVjdXRlZCBzdWNjZXNzZnVsbHlcbiAgICBleHBlY3Qoc3ludGhPdXRwdXQpLnRvQ29udGFpbignVGVsZW1ldHJ5IFNlbnQgU3VjY2Vzc2Z1bGx5Jyk7XG5cbiAgICBjb25zdCBqc29uID0gZnMucmVhZEpTT05TeW5jKHRlbGVtZXRyeUZpbGUpO1xuICAgIGV4cGVjdChqc29uKS50b0VxdWFsKFtcbiAgICAgIGV4cGVjdC5vYmplY3RDb250YWluaW5nKHtcbiAgICAgICAgZXZlbnQ6IGV4cGVjdC5vYmplY3RDb250YWluaW5nKHtcbiAgICAgICAgICBjb21tYW5kOiBleHBlY3Qub2JqZWN0Q29udGFpbmluZyh7XG4gICAgICAgICAgICBwYXRoOiBbJ3N5bnRoJywgJyRTVEFDS1NfMSddLFxuICAgICAgICAgICAgcGFyYW1ldGVyczogZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoe1xuICAgICAgICAgICAgICB1bnN0YWJsZTogJzxyZWRhY3RlZD4nLFxuICAgICAgICAgICAgICBbJ3RlbGVtZXRyeS1maWxlJ106ICc8cmVkYWN0ZWQ+JyxcbiAgICAgICAgICAgICAgbG9va3VwczogdHJ1ZSxcbiAgICAgICAgICAgICAgWydpZ25vcmUtZXJyb3JzJ106IGZhbHNlLFxuICAgICAgICAgICAgICBqc29uOiBmYWxzZSxcbiAgICAgICAgICAgICAgZGVidWc6IGZhbHNlLFxuICAgICAgICAgICAgICBzdGFnaW5nOiB0cnVlLFxuICAgICAgICAgICAgICBbJ25vLWNvbG9yJ106IGZhbHNlLFxuICAgICAgICAgICAgICBjaTogZXhwZWN0LmFueXRoaW5nKCksIC8vIGNoYW5nZXMgYmFzZWQgb24gd2hlcmUgdGhpcyBpcyBjYWxsZWRcbiAgICAgICAgICAgICAgdmFsaWRhdGlvbjogdHJ1ZSxcbiAgICAgICAgICAgICAgcXVpZXQ6IGZhbHNlLFxuICAgICAgICAgICAgICB5ZXM6IGZhbHNlLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBjb25maWc6IHtcbiAgICAgICAgICAgICAgY29udGV4dDoge30sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pLFxuICAgICAgICAgIHN0YXRlOiAnU1VDQ0VFREVEJyxcbiAgICAgICAgICBldmVudFR5cGU6ICdTWU5USCcsXG4gICAgICAgIH0pLFxuICAgICAgICAvLyBzb21lIG9mIHRoZXNlIGNhbiBjaGFuZ2U7IGJ1dCB3ZSBhc3NlcnQgdGhhdCBzb21lIHZhbHVlIGlzIHJlY29yZGVkXG4gICAgICAgIGlkZW50aWZpZXJzOiBleHBlY3Qub2JqZWN0Q29udGFpbmluZyh7XG4gICAgICAgICAgaW5zdGFsbGF0aW9uSWQ6IGV4cGVjdC5hbnl0aGluZygpLFxuICAgICAgICAgIHNlc3Npb25JZDogZXhwZWN0LmFueXRoaW5nKCksXG4gICAgICAgICAgdGVsZW1ldHJ5VmVyc2lvbjogQ1VSUkVOVF9URUxFTUVUUllfVkVSU0lPTixcbiAgICAgICAgICBjZGtDbGlWZXJzaW9uOiBleHBlY3QuYW55dGhpbmcoKSxcbiAgICAgICAgICBjZGtMaWJyYXJ5VmVyc2lvbjogZml4dHVyZS5saWJyYXJ5LnJlcXVlc3RlZFZlcnNpb24oKSxcbiAgICAgICAgICByZWdpb246IGV4cGVjdC5hbnl0aGluZygpLFxuICAgICAgICAgIGV2ZW50SWQ6IGV4cGVjdC5zdHJpbmdDb250YWluaW5nKCc6MScpLFxuICAgICAgICAgIHRpbWVzdGFtcDogZXhwZWN0LmFueXRoaW5nKCksXG4gICAgICAgIH0pLFxuICAgICAgICBlbnZpcm9ubWVudDogZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoe1xuICAgICAgICAgIGNpOiBleHBlY3QuYW55dGhpbmcoKSxcbiAgICAgICAgICBvczoge1xuICAgICAgICAgICAgcGxhdGZvcm06IGV4cGVjdC5hbnl0aGluZygpLFxuICAgICAgICAgICAgcmVsZWFzZTogZXhwZWN0LmFueXRoaW5nKCksXG4gICAgICAgICAgfSxcbiAgICAgICAgICBub2RlVmVyc2lvbjogZXhwZWN0LmFueXRoaW5nKCksXG4gICAgICAgIH0pLFxuICAgICAgICBwcm9qZWN0OiBleHBlY3Qub2JqZWN0Q29udGFpbmluZyh7fSksXG4gICAgICAgIGR1cmF0aW9uOiBleHBlY3Qub2JqZWN0Q29udGFpbmluZyh7XG4gICAgICAgICAgdG90YWw6IGV4cGVjdC5hbnl0aGluZygpLFxuICAgICAgICB9KSxcbiAgICAgICAgY291bnRlcnM6IGV4cGVjdC5vYmplY3RDb250YWluaW5nKHtcbiAgICAgICAgICBzdGFja3M6IGV4cGVjdC5hbnl0aGluZygpLFxuICAgICAgICB9KSxcbiAgICAgIH0pLFxuICAgICAgZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoe1xuICAgICAgICBldmVudDogZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoe1xuICAgICAgICAgIGNvbW1hbmQ6IGV4cGVjdC5vYmplY3RDb250YWluaW5nKHtcbiAgICAgICAgICAgIHBhdGg6IFsnc3ludGgnLCAnJFNUQUNLU18xJ10sXG4gICAgICAgICAgICBwYXJhbWV0ZXJzOiBleHBlY3Qub2JqZWN0Q29udGFpbmluZyh7XG4gICAgICAgICAgICAgIHVuc3RhYmxlOiAnPHJlZGFjdGVkPicsXG4gICAgICAgICAgICAgIFsndGVsZW1ldHJ5LWZpbGUnXTogJzxyZWRhY3RlZD4nLFxuICAgICAgICAgICAgICBsb29rdXBzOiB0cnVlLFxuICAgICAgICAgICAgICBbJ2lnbm9yZS1lcnJvcnMnXTogZmFsc2UsXG4gICAgICAgICAgICAgIGpzb246IGZhbHNlLFxuICAgICAgICAgICAgICBkZWJ1ZzogZmFsc2UsXG4gICAgICAgICAgICAgIHN0YWdpbmc6IHRydWUsXG4gICAgICAgICAgICAgIFsnbm8tY29sb3InXTogZmFsc2UsXG4gICAgICAgICAgICAgIGNpOiBleHBlY3QuYW55dGhpbmcoKSwgLy8gY2hhbmdlcyBiYXNlZCBvbiB3aGVyZSB0aGlzIGlzIGNhbGxlZFxuICAgICAgICAgICAgICB2YWxpZGF0aW9uOiB0cnVlLFxuICAgICAgICAgICAgICBxdWlldDogZmFsc2UsXG4gICAgICAgICAgICAgIHllczogZmFsc2UsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIGNvbmZpZzoge1xuICAgICAgICAgICAgICBjb250ZXh0OiB7fSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSksXG4gICAgICAgICAgc3RhdGU6ICdTVUNDRUVERUQnLFxuICAgICAgICAgIGV2ZW50VHlwZTogJ0lOVk9LRScsXG4gICAgICAgIH0pLFxuICAgICAgICBpZGVudGlmaWVyczogZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoe1xuICAgICAgICAgIGluc3RhbGxhdGlvbklkOiBleHBlY3QuYW55dGhpbmcoKSxcbiAgICAgICAgICBzZXNzaW9uSWQ6IGV4cGVjdC5hbnl0aGluZygpLFxuICAgICAgICAgIHRlbGVtZXRyeVZlcnNpb246IENVUlJFTlRfVEVMRU1FVFJZX1ZFUlNJT04sXG4gICAgICAgICAgY2RrQ2xpVmVyc2lvbjogZXhwZWN0LmFueXRoaW5nKCksXG4gICAgICAgICAgY2RrTGlicmFyeVZlcnNpb246IGZpeHR1cmUubGlicmFyeS5yZXF1ZXN0ZWRWZXJzaW9uKCksXG4gICAgICAgICAgcmVnaW9uOiBleHBlY3QuYW55dGhpbmcoKSxcbiAgICAgICAgICBldmVudElkOiBleHBlY3Quc3RyaW5nQ29udGFpbmluZygnOjInKSxcbiAgICAgICAgICB0aW1lc3RhbXA6IGV4cGVjdC5hbnl0aGluZygpLFxuICAgICAgICB9KSxcbiAgICAgICAgZW52aXJvbm1lbnQ6IGV4cGVjdC5vYmplY3RDb250YWluaW5nKHtcbiAgICAgICAgICBjaTogZXhwZWN0LmFueXRoaW5nKCksXG4gICAgICAgICAgb3M6IHtcbiAgICAgICAgICAgIHBsYXRmb3JtOiBleHBlY3QuYW55dGhpbmcoKSxcbiAgICAgICAgICAgIHJlbGVhc2U6IGV4cGVjdC5hbnl0aGluZygpLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgbm9kZVZlcnNpb246IGV4cGVjdC5hbnl0aGluZygpLFxuICAgICAgICB9KSxcbiAgICAgICAgcHJvamVjdDogZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoe30pLFxuICAgICAgICBkdXJhdGlvbjogZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoe1xuICAgICAgICAgIHRvdGFsOiBleHBlY3QuYW55dGhpbmcoKSxcbiAgICAgICAgfSksXG4gICAgICB9KSxcbiAgICBdKTtcbiAgICBmcy51bmxpbmtTeW5jKHRlbGVtZXRyeUZpbGUpO1xuICB9KSxcbik7XG4iXX0=