@aws-cdk-testing/cli-integ 3.23.0 → 3.25.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (30) hide show
  1. package/npm-shrinkwrap.json +1562 -3013
  2. package/package.json +23 -23
  3. package/resources/cdk-apps/app/app.js +23 -0
  4. package/resources/cdk-apps/app/docker-concurrent/image1/Dockerfile +2 -0
  5. package/resources/cdk-apps/app/docker-concurrent/image2/Dockerfile +2 -0
  6. package/resources/cdk-apps/app/docker-concurrent/image3/Dockerfile +2 -0
  7. package/tests/cli-integ-tests/deploy/cdk-deploy-stack-with-multiple-docker-assets.integtest.d.ts +1 -0
  8. package/tests/cli-integ-tests/deploy/cdk-deploy-stack-with-multiple-docker-assets.integtest.js +10 -0
  9. package/tests/cli-integ-tests/deploy/cdk-deploy-with-revert-drift.integtest.d.ts +1 -0
  10. package/tests/cli-integ-tests/deploy/cdk-deploy-with-revert-drift.integtest.js +39 -0
  11. package/tests/cli-integ-tests/doctor/cdk-doctor.integtest.d.ts +1 -0
  12. package/tests/cli-integ-tests/doctor/cdk-doctor.integtest.js +11 -0
  13. package/tests/cli-integ-tests/drift/cdk-cdk-drift---fail-throws-when-drift-is-detected.integtest.js +3 -24
  14. package/tests/cli-integ-tests/drift/cdk-cdk-drift.integtest.js +3 -24
  15. package/tests/cli-integ-tests/drift/drift_helpers.d.ts +1 -0
  16. package/tests/cli-integ-tests/drift/drift_helpers.js +28 -0
  17. package/tests/cli-integ-tests/metadata/cdk-metadata.integtest.d.ts +1 -0
  18. package/tests/cli-integ-tests/metadata/cdk-metadata.integtest.js +11 -0
  19. package/tests/cli-integ-tests/watch/cdk-watch-detects-file-changes-with-glob-patterns-negative.integtest.d.ts +1 -0
  20. package/tests/cli-integ-tests/watch/cdk-watch-detects-file-changes-with-glob-patterns-negative.integtest.js +74 -0
  21. package/tests/cli-integ-tests/watch/cdk-watch-detects-file-changes-with-glob-patterns.integtest.d.ts +1 -0
  22. package/tests/cli-integ-tests/watch/cdk-watch-detects-file-changes-with-glob-patterns.integtest.js +61 -0
  23. package/tests/cli-integ-tests/watch/watch-helpers.d.ts +11 -0
  24. package/tests/cli-integ-tests/watch/watch-helpers.js +33 -0
  25. package/tests/toolkit-lib-integ-tests/toolkit-deploy-stack-with-multiple-docker-assets.integtest.d.ts +1 -0
  26. package/tests/toolkit-lib-integ-tests/toolkit-deploy-stack-with-multiple-docker-assets.integtest.js +22 -0
  27. package/tests/toolkit-lib-integ-tests/toolkit-watch-glob-negative.integtest.d.ts +1 -0
  28. package/tests/toolkit-lib-integ-tests/toolkit-watch-glob-negative.integtest.js +52 -0
  29. package/tests/toolkit-lib-integ-tests/toolkit-watch-glob.integtest.d.ts +1 -0
  30. package/tests/toolkit-lib-integ-tests/toolkit-watch-glob.integtest.js +68 -0
package/package.json CHANGED
@@ -39,9 +39,9 @@
39
39
  "organization": true
40
40
  },
41
41
  "devDependencies": {
42
- "@aws-cdk/toolkit-lib": "1.16.0",
42
+ "@aws-cdk/toolkit-lib": "1.18.0",
43
43
  "@aws-cdk/yarn-cling": "0.0.0",
44
- "@cdklabs/eslint-plugin": "^1.3.5",
44
+ "@cdklabs/eslint-plugin": "^1.5.6",
45
45
  "@stylistic/eslint-plugin": "^3",
46
46
  "@types/fs-extra": "^9",
47
47
  "@types/jest": "^29.5.14",
@@ -56,9 +56,9 @@
56
56
  "eslint-config-prettier": "^9.1.2",
57
57
  "eslint-import-resolver-typescript": "^3.10.1",
58
58
  "eslint-plugin-import": "^2.32.0",
59
- "eslint-plugin-jest": "^29.12.1",
60
- "eslint-plugin-jsdoc": "^62.4.1",
61
- "eslint-plugin-prettier": "^5.5.4",
59
+ "eslint-plugin-jest": "^29.15.0",
60
+ "eslint-plugin-jsdoc": "^62.7.1",
61
+ "eslint-plugin-prettier": "^5.5.5",
62
62
  "jest": "^29.7.0",
63
63
  "jest-junit": "^16",
64
64
  "license-checker": "^25.0.1",
@@ -67,23 +67,23 @@
67
67
  "typescript": "5.9"
68
68
  },
69
69
  "dependencies": {
70
- "@aws-sdk/client-cloudformation": "^3.953.0",
71
- "@aws-sdk/client-codeartifact": "^3.953.0",
72
- "@aws-sdk/client-ecr": "^3.953.0",
73
- "@aws-sdk/client-ecr-public": "^3.953.0",
74
- "@aws-sdk/client-ecs": "^3.953.0",
75
- "@aws-sdk/client-iam": "^3.953.0",
76
- "@aws-sdk/client-lambda": "^3.975.0",
77
- "@aws-sdk/client-s3": "^3.953.0",
78
- "@aws-sdk/client-secrets-manager": "^3.953.0",
79
- "@aws-sdk/client-sns": "^3.953.0",
80
- "@aws-sdk/client-sso": "^3.953.0",
81
- "@aws-sdk/client-sts": "^3.953.0",
82
- "@aws-sdk/credential-providers": "^3.953.0",
83
- "@cdklabs/cdk-atmosphere-client": "^0.0.86",
70
+ "@aws-sdk/client-cloudformation": "^3.1004.0",
71
+ "@aws-sdk/client-codeartifact": "^3.1004.0",
72
+ "@aws-sdk/client-ecr": "^3.1004.0",
73
+ "@aws-sdk/client-ecr-public": "^3.1004.0",
74
+ "@aws-sdk/client-ecs": "^3.1004.0",
75
+ "@aws-sdk/client-iam": "^3.1004.0",
76
+ "@aws-sdk/client-lambda": "^3.1004.0",
77
+ "@aws-sdk/client-s3": "^3.1004.0",
78
+ "@aws-sdk/client-secrets-manager": "^3.1004.0",
79
+ "@aws-sdk/client-sns": "^3.1004.0",
80
+ "@aws-sdk/client-sso": "^3.1004.0",
81
+ "@aws-sdk/client-sts": "^3.1004.0",
82
+ "@aws-sdk/credential-providers": "^3.1004.0",
83
+ "@cdklabs/cdk-atmosphere-client": "^0.0.91",
84
84
  "@octokit/rest": "^20",
85
- "@smithy/types": "^4.10.0",
86
- "@smithy/util-retry": "^4.2.6",
85
+ "@smithy/types": "^4.13.0",
86
+ "@smithy/util-retry": "^4.2.11",
87
87
  "axios": "^1",
88
88
  "chalk": "^4",
89
89
  "fast-glob": "^3.3.3",
@@ -92,7 +92,7 @@
92
92
  "jest-junit": "^15",
93
93
  "make-runnable": "^1",
94
94
  "mockttp": "^3",
95
- "node-pty": "^1.0.0",
95
+ "node-pty": "^1.1.0",
96
96
  "npm": "^11",
97
97
  "p-queue": "^6",
98
98
  "proxy-agent": "^6.5.0",
@@ -116,7 +116,7 @@
116
116
  "publishConfig": {
117
117
  "access": "public"
118
118
  },
119
- "version": "3.23.0",
119
+ "version": "3.25.0",
120
120
  "types": "lib/index.d.ts",
121
121
  "//": "~~ Generated by projen. To modify, edit .projenrc.js and run \"npx projen\"."
122
122
  }
@@ -757,6 +757,28 @@ class DockerStackWithCustomFile extends cdk.Stack {
757
757
  }
758
758
  }
759
759
 
760
+ class MultipleDockerAssetsStack extends cdk.Stack {
761
+ constructor(parent, id, props) {
762
+ super(parent, id, props);
763
+
764
+ new docker.DockerImageAsset(this, 'image1', {
765
+ directory: path.join(__dirname, 'docker-concurrent/image1')
766
+ });
767
+ new docker.DockerImageAsset(this, 'image2', {
768
+ directory: path.join(__dirname, 'docker-concurrent/image2')
769
+ });
770
+ new docker.DockerImageAsset(this, 'image3', {
771
+ directory: path.join(__dirname, 'docker-concurrent/image3')
772
+ });
773
+
774
+ // Add at least a single resource (WaitConditionHandle), otherwise this stack will never
775
+ // be deployed (and its assets never built)
776
+ new cdk.CfnResource(this, 'Handle', {
777
+ type: 'AWS::CloudFormation::WaitConditionHandle'
778
+ });
779
+ }
780
+ }
781
+
760
782
  /**
761
783
  * A stack that will never succeed deploying (done in a way that CDK cannot detect but CFN will complain about)
762
784
  */
@@ -972,6 +994,7 @@ switch (stackSet) {
972
994
  new DockerStack(app, `${stackPrefix}-docker`);
973
995
  new DockerInUseStack(app, `${stackPrefix}-docker-in-use`);
974
996
  new DockerStackWithCustomFile(app, `${stackPrefix}-docker-with-custom-file`);
997
+ new MultipleDockerAssetsStack(app, `${stackPrefix}-multiple-docker-assets`);
975
998
 
976
999
  new NotificationArnsStack(app, `${stackPrefix}-notification-arns`);
977
1000
 
@@ -0,0 +1,2 @@
1
+ FROM public.ecr.aws/docker/library/alpine:latest
2
+ RUN echo "image1"
@@ -0,0 +1,2 @@
1
+ FROM public.ecr.aws/docker/library/alpine:latest
2
+ RUN echo "image2"
@@ -0,0 +1,2 @@
1
+ FROM public.ecr.aws/docker/library/alpine:latest
2
+ RUN echo "image3"
@@ -0,0 +1,10 @@
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)('deploy stack with multiple docker assets', (0, lib_1.withDefaultFixture)(async (fixture) => {
6
+ await fixture.cdkDeploy('multiple-docker-assets', {
7
+ options: ['--asset-parallelism', '--asset-build-concurrency', '3'],
8
+ });
9
+ }));
10
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2RrLWRlcGxveS1zdGFjay13aXRoLW11bHRpcGxlLWRvY2tlci1hc3NldHMuaW50ZWd0ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiY2RrLWRlcGxveS1zdGFjay13aXRoLW11bHRpcGxlLWRvY2tlci1hc3NldHMuaW50ZWd0ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsc0NBQTZEO0FBRTdELElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLHlFQUF5RTtBQUUzRyxJQUFBLGVBQVMsRUFDUCwwQ0FBMEMsRUFDMUMsSUFBQSx3QkFBa0IsRUFBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLEVBQUU7SUFDbkMsTUFBTSxPQUFPLENBQUMsU0FBUyxDQUFDLHdCQUF3QixFQUFFO1FBQ2hELE9BQU8sRUFBRSxDQUFDLHFCQUFxQixFQUFFLDJCQUEyQixFQUFFLEdBQUcsQ0FBQztLQUNuRSxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaW50ZWdUZXN0LCB3aXRoRGVmYXVsdEZpeHR1cmUgfSBmcm9tICcuLi8uLi8uLi9saWInO1xuXG5qZXN0LnNldFRpbWVvdXQoMiAqIDYwICogNjBfMDAwKTsgLy8gSW5jbHVkZXMgdGhlIHRpbWUgdG8gYWNxdWlyZSBsb2Nrcywgd29yc3QtY2FzZSBzaW5nbGUtdGhyZWFkZWQgcnVudGltZVxuXG5pbnRlZ1Rlc3QoXG4gICdkZXBsb3kgc3RhY2sgd2l0aCBtdWx0aXBsZSBkb2NrZXIgYXNzZXRzJyxcbiAgd2l0aERlZmF1bHRGaXh0dXJlKGFzeW5jIChmaXh0dXJlKSA9PiB7XG4gICAgYXdhaXQgZml4dHVyZS5jZGtEZXBsb3koJ211bHRpcGxlLWRvY2tlci1hc3NldHMnLCB7XG4gICAgICBvcHRpb25zOiBbJy0tYXNzZXQtcGFyYWxsZWxpc20nLCAnLS1hc3NldC1idWlsZC1jb25jdXJyZW5jeScsICczJ10sXG4gICAgfSk7XG4gIH0pLFxuKTtcbiJdfQ==
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const client_cloudformation_1 = require("@aws-sdk/client-cloudformation");
4
+ const client_lambda_1 = require("@aws-sdk/client-lambda");
5
+ const lib_1 = require("../../../lib");
6
+ const drift_helpers_1 = require("../drift/drift_helpers");
7
+ jest.setTimeout(2 * 60 * 60_000); // Includes the time to acquire locks, worst-case single-threaded runtime
8
+ (0, lib_1.integTest)('deploy with revert-drift true', (0, lib_1.withDefaultFixture)(async (fixture) => {
9
+ await fixture.cdkDeploy('driftable', {});
10
+ // Get the Lambda, we want to now make it drift
11
+ const response = await fixture.aws.cloudFormation.send(new client_cloudformation_1.DescribeStackResourcesCommand({
12
+ StackName: fixture.fullStackName('driftable'),
13
+ }));
14
+ const lambdaResource = response.StackResources?.find(resource => resource.ResourceType === 'AWS::Lambda::Function');
15
+ if (!lambdaResource || !lambdaResource.PhysicalResourceId) {
16
+ throw new Error('Could not find Lambda function in stack resources');
17
+ }
18
+ const functionName = lambdaResource.PhysicalResourceId;
19
+ // Update the Lambda function, introducing drift
20
+ await fixture.aws.lambda.send(new client_lambda_1.UpdateFunctionConfigurationCommand({
21
+ FunctionName: functionName,
22
+ Description: 'I\'m slowly drifting (drifting away)',
23
+ }));
24
+ // Wait for the stack update to complete
25
+ await (0, drift_helpers_1.waitForLambdaUpdateComplete)(fixture, functionName);
26
+ const drifted = await fixture.cdk(['drift', fixture.fullStackName('driftable')], { verbose: false });
27
+ expect(drifted).toMatch(/Stack.*driftable/);
28
+ expect(drifted).toContain('1 resource has drifted');
29
+ // Update the Stack with drift-aware
30
+ await fixture.cdkDeploy('driftable', {
31
+ options: ['--revert-drift'],
32
+ captureStderr: false,
33
+ });
34
+ // After performing a drift-aware deployment, verify that no drift has occurred.
35
+ const noDrifted = await fixture.cdk(['drift', fixture.fullStackName('driftable')], { verbose: false });
36
+ expect(noDrifted).toMatch(/Stack.*driftable/); // can't just .toContain because of formatting
37
+ expect(noDrifted).toContain('No drift detected');
38
+ }));
39
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2RrLWRlcGxveS13aXRoLXJldmVydC1kcmlmdC5pbnRlZ3Rlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJjZGstZGVwbG95LXdpdGgtcmV2ZXJ0LWRyaWZ0LmludGVndGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLDBFQUErRTtBQUMvRSwwREFBNEU7QUFDNUUsc0NBQTZEO0FBQzdELDBEQUFxRTtBQUVyRSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyx5RUFBeUU7QUFFM0csSUFBQSxlQUFTLEVBQ1AsK0JBQStCLEVBQy9CLElBQUEsd0JBQWtCLEVBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxFQUFFO0lBQ25DLE1BQU0sT0FBTyxDQUFDLFNBQVMsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFFekMsK0NBQStDO0lBQy9DLE1BQU0sUUFBUSxHQUFHLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUNwRCxJQUFJLHFEQUE2QixDQUFDO1FBQ2hDLFNBQVMsRUFBRSxPQUFPLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQztLQUM5QyxDQUFDLENBQ0gsQ0FBQztJQUNGLE1BQU0sY0FBYyxHQUFHLFFBQVEsQ0FBQyxjQUFjLEVBQUUsSUFBSSxDQUNsRCxRQUFRLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxZQUFZLEtBQUssdUJBQXVCLENBQzlELENBQUM7SUFDRixJQUFJLENBQUMsY0FBYyxJQUFJLENBQUMsY0FBYyxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDMUQsTUFBTSxJQUFJLEtBQUssQ0FBQyxtREFBbUQsQ0FBQyxDQUFDO0lBQ3ZFLENBQUM7SUFDRCxNQUFNLFlBQVksR0FBRyxjQUFjLENBQUMsa0JBQWtCLENBQUM7SUFFdkQsZ0RBQWdEO0lBQ2hELE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUMzQixJQUFJLGtEQUFrQyxDQUFDO1FBQ3JDLFlBQVksRUFBRSxZQUFZO1FBQzFCLFdBQVcsRUFBRSxzQ0FBc0M7S0FDcEQsQ0FBQyxDQUNILENBQUM7SUFFRix3Q0FBd0M7SUFDeEMsTUFBTSxJQUFBLDJDQUEyQixFQUFDLE9BQU8sRUFBRSxZQUFZLENBQUMsQ0FBQztJQUV6RCxNQUFNLE9BQU8sR0FBRyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsQ0FBQyxFQUFFLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7SUFFckcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0lBQzVDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLENBQUMsd0JBQXdCLENBQUMsQ0FBQztJQUVwRCxvQ0FBb0M7SUFDcEMsTUFBTSxPQUFPLENBQUMsU0FBUyxDQUFDLFdBQVcsRUFBRTtRQUNuQyxPQUFPLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQztRQUMzQixhQUFhLEVBQUUsS0FBSztLQUNyQixDQUFDLENBQUM7SUFFSCxnRkFBZ0Y7SUFDaEYsTUFBTSxTQUFTLEdBQUcsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLENBQUMsRUFBRSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBRXZHLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLDhDQUE4QztJQUM3RixNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsU0FBUyxDQUFDLG1CQUFtQixDQUFDLENBQUM7QUFDbkQsQ0FBQyxDQUFDLENBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERlc2NyaWJlU3RhY2tSZXNvdXJjZXNDb21tYW5kIH0gZnJvbSAnQGF3cy1zZGsvY2xpZW50LWNsb3VkZm9ybWF0aW9uJztcbmltcG9ydCB7IFVwZGF0ZUZ1bmN0aW9uQ29uZmlndXJhdGlvbkNvbW1hbmQgfSBmcm9tICdAYXdzLXNkay9jbGllbnQtbGFtYmRhJztcbmltcG9ydCB7IGludGVnVGVzdCwgd2l0aERlZmF1bHRGaXh0dXJlIH0gZnJvbSAnLi4vLi4vLi4vbGliJztcbmltcG9ydCB7IHdhaXRGb3JMYW1iZGFVcGRhdGVDb21wbGV0ZSB9IGZyb20gJy4uL2RyaWZ0L2RyaWZ0X2hlbHBlcnMnO1xuXG5qZXN0LnNldFRpbWVvdXQoMiAqIDYwICogNjBfMDAwKTsgLy8gSW5jbHVkZXMgdGhlIHRpbWUgdG8gYWNxdWlyZSBsb2Nrcywgd29yc3QtY2FzZSBzaW5nbGUtdGhyZWFkZWQgcnVudGltZVxuXG5pbnRlZ1Rlc3QoXG4gICdkZXBsb3kgd2l0aCByZXZlcnQtZHJpZnQgdHJ1ZScsXG4gIHdpdGhEZWZhdWx0Rml4dHVyZShhc3luYyAoZml4dHVyZSkgPT4ge1xuICAgIGF3YWl0IGZpeHR1cmUuY2RrRGVwbG95KCdkcmlmdGFibGUnLCB7fSk7XG5cbiAgICAvLyBHZXQgdGhlIExhbWJkYSwgd2Ugd2FudCB0byBub3cgbWFrZSBpdCBkcmlmdFxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZml4dHVyZS5hd3MuY2xvdWRGb3JtYXRpb24uc2VuZChcbiAgICAgIG5ldyBEZXNjcmliZVN0YWNrUmVzb3VyY2VzQ29tbWFuZCh7XG4gICAgICAgIFN0YWNrTmFtZTogZml4dHVyZS5mdWxsU3RhY2tOYW1lKCdkcmlmdGFibGUnKSxcbiAgICAgIH0pLFxuICAgICk7XG4gICAgY29uc3QgbGFtYmRhUmVzb3VyY2UgPSByZXNwb25zZS5TdGFja1Jlc291cmNlcz8uZmluZChcbiAgICAgIHJlc291cmNlID0+IHJlc291cmNlLlJlc291cmNlVHlwZSA9PT0gJ0FXUzo6TGFtYmRhOjpGdW5jdGlvbicsXG4gICAgKTtcbiAgICBpZiAoIWxhbWJkYVJlc291cmNlIHx8ICFsYW1iZGFSZXNvdXJjZS5QaHlzaWNhbFJlc291cmNlSWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ291bGQgbm90IGZpbmQgTGFtYmRhIGZ1bmN0aW9uIGluIHN0YWNrIHJlc291cmNlcycpO1xuICAgIH1cbiAgICBjb25zdCBmdW5jdGlvbk5hbWUgPSBsYW1iZGFSZXNvdXJjZS5QaHlzaWNhbFJlc291cmNlSWQ7XG5cbiAgICAvLyBVcGRhdGUgdGhlIExhbWJkYSBmdW5jdGlvbiwgaW50cm9kdWNpbmcgZHJpZnRcbiAgICBhd2FpdCBmaXh0dXJlLmF3cy5sYW1iZGEuc2VuZChcbiAgICAgIG5ldyBVcGRhdGVGdW5jdGlvbkNvbmZpZ3VyYXRpb25Db21tYW5kKHtcbiAgICAgICAgRnVuY3Rpb25OYW1lOiBmdW5jdGlvbk5hbWUsXG4gICAgICAgIERlc2NyaXB0aW9uOiAnSVxcJ20gc2xvd2x5IGRyaWZ0aW5nIChkcmlmdGluZyBhd2F5KScsXG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgLy8gV2FpdCBmb3IgdGhlIHN0YWNrIHVwZGF0ZSB0byBjb21wbGV0ZVxuICAgIGF3YWl0IHdhaXRGb3JMYW1iZGFVcGRhdGVDb21wbGV0ZShmaXh0dXJlLCBmdW5jdGlvbk5hbWUpO1xuXG4gICAgY29uc3QgZHJpZnRlZCA9IGF3YWl0IGZpeHR1cmUuY2RrKFsnZHJpZnQnLCBmaXh0dXJlLmZ1bGxTdGFja05hbWUoJ2RyaWZ0YWJsZScpXSwgeyB2ZXJib3NlOiBmYWxzZSB9KTtcblxuICAgIGV4cGVjdChkcmlmdGVkKS50b01hdGNoKC9TdGFjay4qZHJpZnRhYmxlLyk7XG4gICAgZXhwZWN0KGRyaWZ0ZWQpLnRvQ29udGFpbignMSByZXNvdXJjZSBoYXMgZHJpZnRlZCcpO1xuXG4gICAgLy8gVXBkYXRlIHRoZSBTdGFjayB3aXRoIGRyaWZ0LWF3YXJlXG4gICAgYXdhaXQgZml4dHVyZS5jZGtEZXBsb3koJ2RyaWZ0YWJsZScsIHtcbiAgICAgIG9wdGlvbnM6IFsnLS1yZXZlcnQtZHJpZnQnXSxcbiAgICAgIGNhcHR1cmVTdGRlcnI6IGZhbHNlLFxuICAgIH0pO1xuXG4gICAgLy8gQWZ0ZXIgcGVyZm9ybWluZyBhIGRyaWZ0LWF3YXJlIGRlcGxveW1lbnQsIHZlcmlmeSB0aGF0IG5vIGRyaWZ0IGhhcyBvY2N1cnJlZC5cbiAgICBjb25zdCBub0RyaWZ0ZWQgPSBhd2FpdCBmaXh0dXJlLmNkayhbJ2RyaWZ0JywgZml4dHVyZS5mdWxsU3RhY2tOYW1lKCdkcmlmdGFibGUnKV0sIHsgdmVyYm9zZTogZmFsc2UgfSk7XG5cbiAgICBleHBlY3Qobm9EcmlmdGVkKS50b01hdGNoKC9TdGFjay4qZHJpZnRhYmxlLyk7IC8vIGNhbid0IGp1c3QgLnRvQ29udGFpbiBiZWNhdXNlIG9mIGZvcm1hdHRpbmdcbiAgICBleHBlY3Qobm9EcmlmdGVkKS50b0NvbnRhaW4oJ05vIGRyaWZ0IGRldGVjdGVkJyk7XG4gIH0pLFxuKTtcbiJdfQ==
@@ -0,0 +1,11 @@
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)('cdk doctor displays diagnostic information', (0, lib_1.withDefaultFixture)(async (fixture) => {
6
+ const output = await fixture.cdk(['doctor']);
7
+ expect(output).toContain('CDK Version');
8
+ expect(output).toContain('AWS environment variables');
9
+ expect(output).toContain('CDK environment variables');
10
+ }));
11
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2RrLWRvY3Rvci5pbnRlZ3Rlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJjZGstZG9jdG9yLmludGVndGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLHNDQUE2RDtBQUU3RCxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsTUFBTSxDQUFDLENBQUM7QUFFakMsSUFBQSxlQUFTLEVBQ1AsNENBQTRDLEVBQzVDLElBQUEsd0JBQWtCLEVBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxFQUFFO0lBQ25DLE1BQU0sTUFBTSxHQUFHLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUFDN0MsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUN4QyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsU0FBUyxDQUFDLDJCQUEyQixDQUFDLENBQUM7SUFDdEQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFNBQVMsQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO0FBQ3hELENBQUMsQ0FBQyxDQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpbnRlZ1Rlc3QsIHdpdGhEZWZhdWx0Rml4dHVyZSB9IGZyb20gJy4uLy4uLy4uL2xpYic7XG5cbmplc3Quc2V0VGltZW91dCgyICogNjAgKiA2MF8wMDApO1xuXG5pbnRlZ1Rlc3QoXG4gICdjZGsgZG9jdG9yIGRpc3BsYXlzIGRpYWdub3N0aWMgaW5mb3JtYXRpb24nLFxuICB3aXRoRGVmYXVsdEZpeHR1cmUoYXN5bmMgKGZpeHR1cmUpID0+IHtcbiAgICBjb25zdCBvdXRwdXQgPSBhd2FpdCBmaXh0dXJlLmNkayhbJ2RvY3RvciddKTtcbiAgICBleHBlY3Qob3V0cHV0KS50b0NvbnRhaW4oJ0NESyBWZXJzaW9uJyk7XG4gICAgZXhwZWN0KG91dHB1dCkudG9Db250YWluKCdBV1MgZW52aXJvbm1lbnQgdmFyaWFibGVzJyk7XG4gICAgZXhwZWN0KG91dHB1dCkudG9Db250YWluKCdDREsgZW52aXJvbm1lbnQgdmFyaWFibGVzJyk7XG4gIH0pLFxuKTtcbiJdfQ==
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const client_cloudformation_1 = require("@aws-sdk/client-cloudformation");
4
4
  const client_lambda_1 = require("@aws-sdk/client-lambda");
5
+ const drift_helpers_1 = require("./drift_helpers");
5
6
  const lib_1 = require("../../../lib");
6
7
  jest.setTimeout(2 * 60 * 60_000); // Includes the time to acquire locks, worst-case single-threaded runtime
7
8
  (0, lib_1.integTest)('cdk drift --fail throws when drift is detected', (0, lib_1.withDefaultFixture)(async (fixture) => {
@@ -24,29 +25,7 @@ jest.setTimeout(2 * 60 * 60_000); // Includes the time to acquire locks, worst-c
24
25
  Description: 'I\'m slowly drifting (drifting away)',
25
26
  }));
26
27
  // Wait for the stack update to complete
27
- await waitForLambdaUpdateComplete(fixture, functionName);
28
+ await (0, drift_helpers_1.waitForLambdaUpdateComplete)(fixture, functionName);
28
29
  await expect(fixture.cdk(['drift', '--fail', fixture.fullStackName('driftable')], { verbose: false })).rejects.toThrow('exited with error');
29
30
  }));
30
- async function waitForLambdaUpdateComplete(fixture, functionName) {
31
- const delaySeconds = 5;
32
- const timeout = 30_000; // timeout after 30s
33
- const deadline = Date.now() + timeout;
34
- while (true) {
35
- const response = await fixture.aws.lambda.send(new client_lambda_1.GetFunctionCommand({
36
- FunctionName: functionName,
37
- }));
38
- const lastUpdateStatus = response.Configuration?.LastUpdateStatus;
39
- if (lastUpdateStatus === 'Successful') {
40
- return; // Update completed successfully
41
- }
42
- if (lastUpdateStatus === 'Failed') {
43
- throw new Error('Lambda function update failed');
44
- }
45
- if (Date.now() > deadline) {
46
- throw new Error(`Timed out after ${timeout / 1000} seconds.`);
47
- }
48
- // Wait before checking again
49
- await (0, lib_1.sleep)(delaySeconds * 1000);
50
- }
51
- }
52
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2RrLWNkay1kcmlmdC0tLWZhaWwtdGhyb3dzLXdoZW4tZHJpZnQtaXMtZGV0ZWN0ZWQuaW50ZWd0ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiY2RrLWNkay1kcmlmdC0tLWZhaWwtdGhyb3dzLXdoZW4tZHJpZnQtaXMtZGV0ZWN0ZWQuaW50ZWd0ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsMEVBQStFO0FBQy9FLDBEQUFnRztBQUNoRyxzQ0FBb0U7QUFFcEUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMseUVBQXlFO0FBRTNHLElBQUEsZUFBUyxFQUNQLGdEQUFnRCxFQUNoRCxJQUFBLHdCQUFrQixFQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsRUFBRTtJQUNuQyxNQUFNLE9BQU8sQ0FBQyxTQUFTLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBRXpDLHNGQUFzRjtJQUN0RixNQUFNLEtBQUssR0FBRyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE9BQU8sQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLENBQUMsRUFBRSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBRTdHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxTQUFTLENBQUMsbUJBQW1CLENBQUMsQ0FBQztJQUU3QywrQ0FBK0M7SUFDL0MsTUFBTSxRQUFRLEdBQUcsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQ3BELElBQUkscURBQTZCLENBQUM7UUFDaEMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDO0tBQzlDLENBQUMsQ0FDSCxDQUFDO0lBQ0YsTUFBTSxjQUFjLEdBQUcsUUFBUSxDQUFDLGNBQWMsRUFBRSxJQUFJLENBQ2xELFFBQVEsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLFlBQVksS0FBSyx1QkFBdUIsQ0FDOUQsQ0FBQztJQUNGLElBQUksQ0FBQyxjQUFjLElBQUksQ0FBQyxjQUFjLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUMxRCxNQUFNLElBQUksS0FBSyxDQUFDLG1EQUFtRCxDQUFDLENBQUM7SUFDdkUsQ0FBQztJQUNELE1BQU0sWUFBWSxHQUFHLGNBQWMsQ0FBQyxrQkFBa0IsQ0FBQztJQUV2RCxnREFBZ0Q7SUFDaEQsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQzNCLElBQUksa0RBQWtDLENBQUM7UUFDckMsWUFBWSxFQUFFLFlBQVk7UUFDMUIsV0FBVyxFQUFFLHNDQUFzQztLQUNwRCxDQUFDLENBQ0gsQ0FBQztJQUVGLHdDQUF3QztJQUN4QyxNQUFNLDJCQUEyQixDQUFDLE9BQU8sRUFBRSxZQUFZLENBQUMsQ0FBQztJQUV6RCxNQUFNLE1BQU0sQ0FDVixPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxPQUFPLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FDekYsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLG1CQUFtQixDQUFDLENBQUM7QUFDekMsQ0FBQyxDQUFDLENBQ0gsQ0FBQztBQUVGLEtBQUssVUFBVSwyQkFBMkIsQ0FBQyxPQUFZLEVBQUUsWUFBb0I7SUFDM0UsTUFBTSxZQUFZLEdBQUcsQ0FBQyxDQUFDO0lBQ3ZCLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxDQUFDLG9CQUFvQjtJQUM1QyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsT0FBTyxDQUFDO0lBRXRDLE9BQU8sSUFBSSxFQUFFLENBQUM7UUFDWixNQUFNLFFBQVEsR0FBRyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FDNUMsSUFBSSxrQ0FBa0IsQ0FBQztZQUNyQixZQUFZLEVBQUUsWUFBWTtTQUMzQixDQUFDLENBQ0gsQ0FBQztRQUVGLE1BQU0sZ0JBQWdCLEdBQUcsUUFBUSxDQUFDLGFBQWEsRUFBRSxnQkFBZ0IsQ0FBQztRQUVsRSxJQUFJLGdCQUFnQixLQUFLLFlBQVksRUFBRSxDQUFDO1lBQ3RDLE9BQU8sQ0FBQyxnQ0FBZ0M7UUFDMUMsQ0FBQztRQUVELElBQUksZ0JBQWdCLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDbEMsTUFBTSxJQUFJLEtBQUssQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO1FBQ25ELENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxRQUFRLEVBQUUsQ0FBQztZQUMxQixNQUFNLElBQUksS0FBSyxDQUFDLG1CQUFtQixPQUFPLEdBQUcsSUFBSSxXQUFXLENBQUMsQ0FBQztRQUNoRSxDQUFDO1FBRUQsNkJBQTZCO1FBQzdCLE1BQU0sSUFBQSxXQUFLLEVBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxDQUFDO0lBQ25DLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGVzY3JpYmVTdGFja1Jlc291cmNlc0NvbW1hbmQgfSBmcm9tICdAYXdzLXNkay9jbGllbnQtY2xvdWRmb3JtYXRpb24nO1xuaW1wb3J0IHsgR2V0RnVuY3Rpb25Db21tYW5kLCBVcGRhdGVGdW5jdGlvbkNvbmZpZ3VyYXRpb25Db21tYW5kIH0gZnJvbSAnQGF3cy1zZGsvY2xpZW50LWxhbWJkYSc7XG5pbXBvcnQgeyBpbnRlZ1Rlc3QsIHNsZWVwLCB3aXRoRGVmYXVsdEZpeHR1cmUgfSBmcm9tICcuLi8uLi8uLi9saWInO1xuXG5qZXN0LnNldFRpbWVvdXQoMiAqIDYwICogNjBfMDAwKTsgLy8gSW5jbHVkZXMgdGhlIHRpbWUgdG8gYWNxdWlyZSBsb2Nrcywgd29yc3QtY2FzZSBzaW5nbGUtdGhyZWFkZWQgcnVudGltZVxuXG5pbnRlZ1Rlc3QoXG4gICdjZGsgZHJpZnQgLS1mYWlsIHRocm93cyB3aGVuIGRyaWZ0IGlzIGRldGVjdGVkJyxcbiAgd2l0aERlZmF1bHRGaXh0dXJlKGFzeW5jIChmaXh0dXJlKSA9PiB7XG4gICAgYXdhaXQgZml4dHVyZS5jZGtEZXBsb3koJ2RyaWZ0YWJsZScsIHt9KTtcblxuICAgIC8vIEFzc2VydCB0aGF0LCByaWdodCBhZnRlciBkZXBsb3lpbmcsIHRoZXJlIGlzIG5vIGRyaWZ0IChiZWNhdXNlIHdlIGp1c3QgZGVwbG95ZWQgaXQpXG4gICAgY29uc3QgZHJpZnQgPSBhd2FpdCBmaXh0dXJlLmNkayhbJ2RyaWZ0JywgJy0tZmFpbCcsIGZpeHR1cmUuZnVsbFN0YWNrTmFtZSgnZHJpZnRhYmxlJyldLCB7IHZlcmJvc2U6IGZhbHNlIH0pO1xuXG4gICAgZXhwZWN0KGRyaWZ0KS50b0NvbnRhaW4oJ05vIGRyaWZ0IGRldGVjdGVkJyk7XG5cbiAgICAvLyBHZXQgdGhlIExhbWJkYSwgd2Ugd2FudCB0byBub3cgbWFrZSBpdCBkcmlmdFxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZml4dHVyZS5hd3MuY2xvdWRGb3JtYXRpb24uc2VuZChcbiAgICAgIG5ldyBEZXNjcmliZVN0YWNrUmVzb3VyY2VzQ29tbWFuZCh7XG4gICAgICAgIFN0YWNrTmFtZTogZml4dHVyZS5mdWxsU3RhY2tOYW1lKCdkcmlmdGFibGUnKSxcbiAgICAgIH0pLFxuICAgICk7XG4gICAgY29uc3QgbGFtYmRhUmVzb3VyY2UgPSByZXNwb25zZS5TdGFja1Jlc291cmNlcz8uZmluZChcbiAgICAgIHJlc291cmNlID0+IHJlc291cmNlLlJlc291cmNlVHlwZSA9PT0gJ0FXUzo6TGFtYmRhOjpGdW5jdGlvbicsXG4gICAgKTtcbiAgICBpZiAoIWxhbWJkYVJlc291cmNlIHx8ICFsYW1iZGFSZXNvdXJjZS5QaHlzaWNhbFJlc291cmNlSWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ291bGQgbm90IGZpbmQgTGFtYmRhIGZ1bmN0aW9uIGluIHN0YWNrIHJlc291cmNlcycpO1xuICAgIH1cbiAgICBjb25zdCBmdW5jdGlvbk5hbWUgPSBsYW1iZGFSZXNvdXJjZS5QaHlzaWNhbFJlc291cmNlSWQ7XG5cbiAgICAvLyBVcGRhdGUgdGhlIExhbWJkYSBmdW5jdGlvbiwgaW50cm9kdWNpbmcgZHJpZnRcbiAgICBhd2FpdCBmaXh0dXJlLmF3cy5sYW1iZGEuc2VuZChcbiAgICAgIG5ldyBVcGRhdGVGdW5jdGlvbkNvbmZpZ3VyYXRpb25Db21tYW5kKHtcbiAgICAgICAgRnVuY3Rpb25OYW1lOiBmdW5jdGlvbk5hbWUsXG4gICAgICAgIERlc2NyaXB0aW9uOiAnSVxcJ20gc2xvd2x5IGRyaWZ0aW5nIChkcmlmdGluZyBhd2F5KScsXG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgLy8gV2FpdCBmb3IgdGhlIHN0YWNrIHVwZGF0ZSB0byBjb21wbGV0ZVxuICAgIGF3YWl0IHdhaXRGb3JMYW1iZGFVcGRhdGVDb21wbGV0ZShmaXh0dXJlLCBmdW5jdGlvbk5hbWUpO1xuXG4gICAgYXdhaXQgZXhwZWN0KFxuICAgICAgZml4dHVyZS5jZGsoWydkcmlmdCcsICctLWZhaWwnLCBmaXh0dXJlLmZ1bGxTdGFja05hbWUoJ2RyaWZ0YWJsZScpXSwgeyB2ZXJib3NlOiBmYWxzZSB9KSxcbiAgICApLnJlamVjdHMudG9UaHJvdygnZXhpdGVkIHdpdGggZXJyb3InKTtcbiAgfSksXG4pO1xuXG5hc3luYyBmdW5jdGlvbiB3YWl0Rm9yTGFtYmRhVXBkYXRlQ29tcGxldGUoZml4dHVyZTogYW55LCBmdW5jdGlvbk5hbWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBkZWxheVNlY29uZHMgPSA1O1xuICBjb25zdCB0aW1lb3V0ID0gMzBfMDAwOyAvLyB0aW1lb3V0IGFmdGVyIDMwc1xuICBjb25zdCBkZWFkbGluZSA9IERhdGUubm93KCkgKyB0aW1lb3V0O1xuXG4gIHdoaWxlICh0cnVlKSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmaXh0dXJlLmF3cy5sYW1iZGEuc2VuZChcbiAgICAgIG5ldyBHZXRGdW5jdGlvbkNvbW1hbmQoe1xuICAgICAgICBGdW5jdGlvbk5hbWU6IGZ1bmN0aW9uTmFtZSxcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICBjb25zdCBsYXN0VXBkYXRlU3RhdHVzID0gcmVzcG9uc2UuQ29uZmlndXJhdGlvbj8uTGFzdFVwZGF0ZVN0YXR1cztcblxuICAgIGlmIChsYXN0VXBkYXRlU3RhdHVzID09PSAnU3VjY2Vzc2Z1bCcpIHtcbiAgICAgIHJldHVybjsgLy8gVXBkYXRlIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHlcbiAgICB9XG5cbiAgICBpZiAobGFzdFVwZGF0ZVN0YXR1cyA9PT0gJ0ZhaWxlZCcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTGFtYmRhIGZ1bmN0aW9uIHVwZGF0ZSBmYWlsZWQnKTtcbiAgICB9XG5cbiAgICBpZiAoRGF0ZS5ub3coKSA+IGRlYWRsaW5lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFRpbWVkIG91dCBhZnRlciAke3RpbWVvdXQgLyAxMDAwfSBzZWNvbmRzLmApO1xuICAgIH1cblxuICAgIC8vIFdhaXQgYmVmb3JlIGNoZWNraW5nIGFnYWluXG4gICAgYXdhaXQgc2xlZXAoZGVsYXlTZWNvbmRzICogMTAwMCk7XG4gIH1cbn1cbiJdfQ==
31
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2RrLWNkay1kcmlmdC0tLWZhaWwtdGhyb3dzLXdoZW4tZHJpZnQtaXMtZGV0ZWN0ZWQuaW50ZWd0ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiY2RrLWNkay1kcmlmdC0tLWZhaWwtdGhyb3dzLXdoZW4tZHJpZnQtaXMtZGV0ZWN0ZWQuaW50ZWd0ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsMEVBQStFO0FBQy9FLDBEQUE0RTtBQUM1RSxtREFBOEQ7QUFDOUQsc0NBQTZEO0FBRTdELElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLHlFQUF5RTtBQUUzRyxJQUFBLGVBQVMsRUFDUCxnREFBZ0QsRUFDaEQsSUFBQSx3QkFBa0IsRUFBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLEVBQUU7SUFDbkMsTUFBTSxPQUFPLENBQUMsU0FBUyxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUV6QyxzRkFBc0Y7SUFDdEYsTUFBTSxLQUFLLEdBQUcsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxPQUFPLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUU3RyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsU0FBUyxDQUFDLG1CQUFtQixDQUFDLENBQUM7SUFFN0MsK0NBQStDO0lBQy9DLE1BQU0sUUFBUSxHQUFHLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUNwRCxJQUFJLHFEQUE2QixDQUFDO1FBQ2hDLFNBQVMsRUFBRSxPQUFPLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQztLQUM5QyxDQUFDLENBQ0gsQ0FBQztJQUNGLE1BQU0sY0FBYyxHQUFHLFFBQVEsQ0FBQyxjQUFjLEVBQUUsSUFBSSxDQUNsRCxRQUFRLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxZQUFZLEtBQUssdUJBQXVCLENBQzlELENBQUM7SUFDRixJQUFJLENBQUMsY0FBYyxJQUFJLENBQUMsY0FBYyxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDMUQsTUFBTSxJQUFJLEtBQUssQ0FBQyxtREFBbUQsQ0FBQyxDQUFDO0lBQ3ZFLENBQUM7SUFDRCxNQUFNLFlBQVksR0FBRyxjQUFjLENBQUMsa0JBQWtCLENBQUM7SUFFdkQsZ0RBQWdEO0lBQ2hELE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUMzQixJQUFJLGtEQUFrQyxDQUFDO1FBQ3JDLFlBQVksRUFBRSxZQUFZO1FBQzFCLFdBQVcsRUFBRSxzQ0FBc0M7S0FDcEQsQ0FBQyxDQUNILENBQUM7SUFFRix3Q0FBd0M7SUFDeEMsTUFBTSxJQUFBLDJDQUEyQixFQUFDLE9BQU8sRUFBRSxZQUFZLENBQUMsQ0FBQztJQUV6RCxNQUFNLE1BQU0sQ0FDVixPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxPQUFPLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FDekYsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLG1CQUFtQixDQUFDLENBQUM7QUFDekMsQ0FBQyxDQUFDLENBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERlc2NyaWJlU3RhY2tSZXNvdXJjZXNDb21tYW5kIH0gZnJvbSAnQGF3cy1zZGsvY2xpZW50LWNsb3VkZm9ybWF0aW9uJztcbmltcG9ydCB7IFVwZGF0ZUZ1bmN0aW9uQ29uZmlndXJhdGlvbkNvbW1hbmQgfSBmcm9tICdAYXdzLXNkay9jbGllbnQtbGFtYmRhJztcbmltcG9ydCB7IHdhaXRGb3JMYW1iZGFVcGRhdGVDb21wbGV0ZSB9IGZyb20gJy4vZHJpZnRfaGVscGVycyc7XG5pbXBvcnQgeyBpbnRlZ1Rlc3QsIHdpdGhEZWZhdWx0Rml4dHVyZSB9IGZyb20gJy4uLy4uLy4uL2xpYic7XG5cbmplc3Quc2V0VGltZW91dCgyICogNjAgKiA2MF8wMDApOyAvLyBJbmNsdWRlcyB0aGUgdGltZSB0byBhY3F1aXJlIGxvY2tzLCB3b3JzdC1jYXNlIHNpbmdsZS10aHJlYWRlZCBydW50aW1lXG5cbmludGVnVGVzdChcbiAgJ2NkayBkcmlmdCAtLWZhaWwgdGhyb3dzIHdoZW4gZHJpZnQgaXMgZGV0ZWN0ZWQnLFxuICB3aXRoRGVmYXVsdEZpeHR1cmUoYXN5bmMgKGZpeHR1cmUpID0+IHtcbiAgICBhd2FpdCBmaXh0dXJlLmNka0RlcGxveSgnZHJpZnRhYmxlJywge30pO1xuXG4gICAgLy8gQXNzZXJ0IHRoYXQsIHJpZ2h0IGFmdGVyIGRlcGxveWluZywgdGhlcmUgaXMgbm8gZHJpZnQgKGJlY2F1c2Ugd2UganVzdCBkZXBsb3llZCBpdClcbiAgICBjb25zdCBkcmlmdCA9IGF3YWl0IGZpeHR1cmUuY2RrKFsnZHJpZnQnLCAnLS1mYWlsJywgZml4dHVyZS5mdWxsU3RhY2tOYW1lKCdkcmlmdGFibGUnKV0sIHsgdmVyYm9zZTogZmFsc2UgfSk7XG5cbiAgICBleHBlY3QoZHJpZnQpLnRvQ29udGFpbignTm8gZHJpZnQgZGV0ZWN0ZWQnKTtcblxuICAgIC8vIEdldCB0aGUgTGFtYmRhLCB3ZSB3YW50IHRvIG5vdyBtYWtlIGl0IGRyaWZ0XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmaXh0dXJlLmF3cy5jbG91ZEZvcm1hdGlvbi5zZW5kKFxuICAgICAgbmV3IERlc2NyaWJlU3RhY2tSZXNvdXJjZXNDb21tYW5kKHtcbiAgICAgICAgU3RhY2tOYW1lOiBmaXh0dXJlLmZ1bGxTdGFja05hbWUoJ2RyaWZ0YWJsZScpLFxuICAgICAgfSksXG4gICAgKTtcbiAgICBjb25zdCBsYW1iZGFSZXNvdXJjZSA9IHJlc3BvbnNlLlN0YWNrUmVzb3VyY2VzPy5maW5kKFxuICAgICAgcmVzb3VyY2UgPT4gcmVzb3VyY2UuUmVzb3VyY2VUeXBlID09PSAnQVdTOjpMYW1iZGE6OkZ1bmN0aW9uJyxcbiAgICApO1xuICAgIGlmICghbGFtYmRhUmVzb3VyY2UgfHwgIWxhbWJkYVJlc291cmNlLlBoeXNpY2FsUmVzb3VyY2VJZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgZmluZCBMYW1iZGEgZnVuY3Rpb24gaW4gc3RhY2sgcmVzb3VyY2VzJyk7XG4gICAgfVxuICAgIGNvbnN0IGZ1bmN0aW9uTmFtZSA9IGxhbWJkYVJlc291cmNlLlBoeXNpY2FsUmVzb3VyY2VJZDtcblxuICAgIC8vIFVwZGF0ZSB0aGUgTGFtYmRhIGZ1bmN0aW9uLCBpbnRyb2R1Y2luZyBkcmlmdFxuICAgIGF3YWl0IGZpeHR1cmUuYXdzLmxhbWJkYS5zZW5kKFxuICAgICAgbmV3IFVwZGF0ZUZ1bmN0aW9uQ29uZmlndXJhdGlvbkNvbW1hbmQoe1xuICAgICAgICBGdW5jdGlvbk5hbWU6IGZ1bmN0aW9uTmFtZSxcbiAgICAgICAgRGVzY3JpcHRpb246ICdJXFwnbSBzbG93bHkgZHJpZnRpbmcgKGRyaWZ0aW5nIGF3YXkpJyxcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICAvLyBXYWl0IGZvciB0aGUgc3RhY2sgdXBkYXRlIHRvIGNvbXBsZXRlXG4gICAgYXdhaXQgd2FpdEZvckxhbWJkYVVwZGF0ZUNvbXBsZXRlKGZpeHR1cmUsIGZ1bmN0aW9uTmFtZSk7XG5cbiAgICBhd2FpdCBleHBlY3QoXG4gICAgICBmaXh0dXJlLmNkayhbJ2RyaWZ0JywgJy0tZmFpbCcsIGZpeHR1cmUuZnVsbFN0YWNrTmFtZSgnZHJpZnRhYmxlJyldLCB7IHZlcmJvc2U6IGZhbHNlIH0pLFxuICAgICkucmVqZWN0cy50b1Rocm93KCdleGl0ZWQgd2l0aCBlcnJvcicpO1xuICB9KSxcbik7XG4iXX0=
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const client_cloudformation_1 = require("@aws-sdk/client-cloudformation");
4
4
  const client_lambda_1 = require("@aws-sdk/client-lambda");
5
+ const drift_helpers_1 = require("./drift_helpers");
5
6
  const lib_1 = require("../../../lib");
6
7
  jest.setTimeout(2 * 60 * 60_000); // Includes the time to acquire locks, worst-case single-threaded runtime
7
8
  (0, lib_1.integTest)('cdk drift', (0, lib_1.withDefaultFixture)(async (fixture) => {
@@ -27,7 +28,7 @@ jest.setTimeout(2 * 60 * 60_000); // Includes the time to acquire locks, worst-c
27
28
  Description: 'I\'m slowly drifting (drifting away)',
28
29
  }));
29
30
  // Wait for the stack update to complete
30
- await waitForLambdaUpdateComplete(fixture, functionName);
31
+ await (0, drift_helpers_1.waitForLambdaUpdateComplete)(fixture, functionName);
31
32
  const driftAfterModification = await fixture.cdk(['drift', fixture.fullStackName('driftable')], { verbose: false });
32
33
  const expectedMatches = [
33
34
  /Stack.*driftable/,
@@ -47,26 +48,4 @@ jest.setTimeout(2 * 60 * 60_000); // Includes the time to acquire locks, worst-c
47
48
  expect(driftAfterModification).toContain(expectedSubstring);
48
49
  }
49
50
  }));
50
- async function waitForLambdaUpdateComplete(fixture, functionName) {
51
- const delaySeconds = 5;
52
- const timeout = 30_000; // timeout after 30s
53
- const deadline = Date.now() + timeout;
54
- while (true) {
55
- const response = await fixture.aws.lambda.send(new client_lambda_1.GetFunctionCommand({
56
- FunctionName: functionName,
57
- }));
58
- const lastUpdateStatus = response.Configuration?.LastUpdateStatus;
59
- if (lastUpdateStatus === 'Successful') {
60
- return; // Update completed successfully
61
- }
62
- if (lastUpdateStatus === 'Failed') {
63
- throw new Error('Lambda function update failed');
64
- }
65
- if (Date.now() > deadline) {
66
- throw new Error(`Timed out after ${timeout / 1000} seconds.`);
67
- }
68
- // Wait before checking again
69
- await (0, lib_1.sleep)(delaySeconds * 1000);
70
- }
71
- }
72
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2RrLWNkay1kcmlmdC5pbnRlZ3Rlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJjZGstY2RrLWRyaWZ0LmludGVndGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLDBFQUErRTtBQUMvRSwwREFBZ0c7QUFDaEcsc0NBQW9FO0FBRXBFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLHlFQUF5RTtBQUUzRyxJQUFBLGVBQVMsRUFDUCxXQUFXLEVBQ1gsSUFBQSx3QkFBa0IsRUFBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLEVBQUU7SUFDbkMsTUFBTSxPQUFPLENBQUMsU0FBUyxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUV6QyxzRkFBc0Y7SUFDdEYsTUFBTSxLQUFLLEdBQUcsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLENBQUMsRUFBRSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBRW5HLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLDhDQUE4QztJQUN6RixNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsU0FBUyxDQUFDLG1CQUFtQixDQUFDLENBQUM7SUFDN0MsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLFNBQVMsQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDO0lBQ2hFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsb0RBQW9EO0lBRTlGLCtDQUErQztJQUMvQyxNQUFNLFFBQVEsR0FBRyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLElBQUksQ0FDcEQsSUFBSSxxREFBNkIsQ0FBQztRQUNoQyxTQUFTLEVBQUUsT0FB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WSxHQUFHLElBQUksQ0FBQyxDQUFDO0lBQ25DLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGVzY3JpYmVTdGFja1Jlc291cmNlc0NvbW1hbmQgfSBmcm9tICdAYXdzLXNkay9jbGllbnQtY2xvdWRmb3JtYXRpb24nO1xuaW1wb3J0IHsgR2V0RnVuY3Rpb25Db21tYW5kLCBVcGRhdGVGdW5jdGlvbkNvbmZpZ3VyYXRpb25Db21tYW5kIH0gZnJvbSAnQGF3cy1zZGsvY2xpZW50LWxhbWJkYSc7XG5pbXBvcnQgeyBpbnRlZ1Rlc3QsIHNsZWVwLCB3aXRoRGVmYXVsdEZpeHR1cmUgfSBmcm9tICcuLi8uLi8uLi9saWInO1xuXG5qZXN0LnNldFRpbWVvdXQoMiAqIDYwICogNjBfMDAwKTsgLy8gSW5jbHVkZXMgdGhlIHRpbWUgdG8gYWNxdWlyZSBsb2Nrcywgd29yc3QtY2FzZSBzaW5nbGUtdGhyZWFkZWQgcnVudGltZVxuXG5pbnRlZ1Rlc3QoXG4gICdjZGsgZHJpZnQnLFxuICB3aXRoRGVmYXVsdEZpeHR1cmUoYXN5bmMgKGZpeHR1cmUpID0+IHtcbiAgICBhd2FpdCBmaXh0dXJlLmNka0RlcGxveSgnZHJpZnRhYmxlJywge30pO1xuXG4gICAgLy8gQXNzZXJ0IHRoYXQsIHJpZ2h0IGFmdGVyIGRlcGxveWluZywgdGhlcmUgaXMgbm8gZHJpZnQgKGJlY2F1c2Ugd2UganVzdCBkZXBsb3llZCBpdClcbiAgICBjb25zdCBkcmlmdCA9IGF3YWl0IGZpeHR1cmUuY2RrKFsnZHJpZnQnLCBmaXh0dXJlLmZ1bGxTdGFja05hbWUoJ2RyaWZ0YWJsZScpXSwgeyB2ZXJib3NlOiBmYWxzZSB9KTtcblxuICAgIGV4cGVjdChkcmlmdCkudG9NYXRjaCgvU3RhY2suKmRyaWZ0YWJsZS8pOyAvLyBjYW4ndCBqdXN0IC50b0NvbnRhaW4gYmVjYXVzZSBvZiBmb3JtYXR0aW5nXG4gICAgZXhwZWN0KGRyaWZ0KS50b0NvbnRhaW4oJ05vIGRyaWZ0IGRldGVjdGVkJyk7XG4gICAgZXhwZWN0KGRyaWZ0KS50b0NvbnRhaW4oJ+KcqCAgTnVtYmVyIG9mIHJlc291cmNlcyB3aXRoIGRyaWZ0OiAwJyk7XG4gICAgZXhwZWN0KGRyaWZ0KS5ub3QudG9Db250YWluKCd1bmNoZWNrZWQnKTsgLy8gc2hvdWxkIG5vdCBzZWUgdW5jaGVja2VkIHJlc291cmNlcyB1bmxlc3MgdmVyYm9zZVxuXG4gICAgLy8gR2V0IHRoZSBMYW1iZGEsIHdlIHdhbnQgdG8gbm93IG1ha2UgaXQgZHJpZnRcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZpeHR1cmUuYXdzLmNsb3VkRm9ybWF0aW9uLnNlbmQoXG4gICAgICBuZXcgRGVzY3JpYmVTdGFja1Jlc291cmNlc0NvbW1hbmQoe1xuICAgICAgICBTdGFja05hbWU6IGZpeHR1cmUuZnVsbFN0YWNrTmFtZSgnZHJpZnRhYmxlJyksXG4gICAgICB9KSxcbiAgICApO1xuICAgIGNvbnN0IGxhbWJkYVJlc291cmNlID0gcmVzcG9uc2UuU3RhY2tSZXNvdXJjZXM/LmZpbmQoXG4gICAgICByZXNvdXJjZSA9PiByZXNvdXJjZS5SZXNvdXJjZVR5cGUgPT09ICdBV1M6OkxhbWJkYTo6RnVuY3Rpb24nLFxuICAgICk7XG4gICAgaWYgKCFsYW1iZGFSZXNvdXJjZSB8fCAhbGFtYmRhUmVzb3VyY2UuUGh5c2ljYWxSZXNvdXJjZUlkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvdWxkIG5vdCBmaW5kIExhbWJkYSBmdW5jdGlvbiBpbiBzdGFjayByZXNvdXJjZXMnKTtcbiAgICB9XG4gICAgY29uc3QgZnVuY3Rpb25OYW1lID0gbGFtYmRhUmVzb3VyY2UuUGh5c2ljYWxSZXNvdXJjZUlkO1xuXG4gICAgLy8gVXBkYXRlIHRoZSBMYW1iZGEgZnVuY3Rpb24sIGludHJvZHVjaW5nIGRyaWZ0XG4gICAgYXdhaXQgZml4dHVyZS5hd3MubGFtYmRhLnNlbmQoXG4gICAgICBuZXcgVXBkYXRlRnVuY3Rpb25Db25maWd1cmF0aW9uQ29tbWFuZCh7XG4gICAgICAgIEZ1bmN0aW9uTmFtZTogZnVuY3Rpb25OYW1lLFxuICAgICAgICBEZXNjcmlwdGlvbjogJ0lcXCdtIHNsb3dseSBkcmlmdGluZyAoZHJpZnRpbmcgYXdheSknLFxuICAgICAgfSksXG4gICAgKTtcblxuICAgIC8vIFdhaXQgZm9yIHRoZSBzdGFjayB1cGRhdGUgdG8gY29tcGxldGVcbiAgICBhd2FpdCB3YWl0Rm9yTGFtYmRhVXBkYXRlQ29tcGxldGUoZml4dHVyZSwgZnVuY3Rpb25OYW1lKTtcblxuICAgIGNvbnN0IGRyaWZ0QWZ0ZXJNb2RpZmljYXRpb24gPSBhd2FpdCBmaXh0dXJlLmNkayhbJ2RyaWZ0JywgZml4dHVyZS5mdWxsU3RhY2tOYW1lKCdkcmlmdGFibGUnKV0sIHsgdmVyYm9zZTogZmFsc2UgfSk7XG5cbiAgICBjb25zdCBleHBlY3RlZE1hdGNoZXMgPSBbXG4gICAgICAvU3RhY2suKmRyaWZ0YWJsZS8sXG4gICAgICAvWy1dLipUaGlzIGlzIG15IGZ1bmN0aW9uIS9tLFxuICAgICAgL1srXS4qSSdtIHNsb3dseSBkcmlmdGluZyBcXChkcmlmdGluZyBhd2F5XFwpL20sXG4gICAgXTtcbiAgICBjb25zdCBleHBlY3RlZFN1YnN0cmluZ3MgPSBbXG4gICAgICAnMSByZXNvdXJjZSBoYXMgZHJpZnRlZCcsIC8vIG51bSByZXNvdXJjZXMgZHJpZnRlZFxuICAgICAgJ+KcqCAgTnVtYmVyIG9mIHJlc291cmNlcyB3aXRoIGRyaWZ0OiAxJyxcbiAgICAgICdBV1M6OkxhbWJkYTo6RnVuY3Rpb24nLCAvLyB0aGUgbGFtYmRhIHNob3VsZCBiZSBtYXJrZWQgZHJpZnRlZFxuICAgICAgJy9EZXNjcmlwdGlvbicsIC8vIHRoZSByZXNvdXJjZXMgdGhhdCBoYXZlIGRyaWZ0ZWRcbiAgICBdO1xuICAgIGZvciAoY29uc3QgZXhwZWN0ZWRNYXRjaCBvZiBleHBlY3RlZE1hdGNoZXMpIHtcbiAgICAgIGV4cGVjdChkcmlmdEFmdGVyTW9kaWZpY2F0aW9uKS50b01hdGNoKGV4cGVjdGVkTWF0Y2gpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGV4cGVjdGVkU3Vic3RyaW5nIG9mIGV4cGVjdGVkU3Vic3RyaW5ncykge1xuICAgICAgZXhwZWN0KGRyaWZ0QWZ0ZXJNb2RpZmljYXRpb24pLnRvQ29udGFpbihleHBlY3RlZFN1YnN0cmluZyk7XG4gICAgfVxuICB9KSxcbik7XG5cbmFzeW5jIGZ1bmN0aW9uIHdhaXRGb3JMYW1iZGFVcGRhdGVDb21wbGV0ZShmaXh0dXJlOiBhbnksIGZ1bmN0aW9uTmFtZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGRlbGF5U2Vjb25kcyA9IDU7XG4gIGNvbnN0IHRpbWVvdXQgPSAzMF8wMDA7IC8vIHRpbWVvdXQgYWZ0ZXIgMzBzXG4gIGNvbnN0IGRlYWRsaW5lID0gRGF0ZS5ub3coKSArIHRpbWVvdXQ7XG5cbiAgd2hpbGUgKHRydWUpIHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZpeHR1cmUuYXdzLmxhbWJkYS5zZW5kKFxuICAgICAgbmV3IEdldEZ1bmN0aW9uQ29tbWFuZCh7XG4gICAgICAgIEZ1bmN0aW9uTmFtZTogZnVuY3Rpb25OYW1lLFxuICAgICAgfSksXG4gICAgKTtcblxuICAgIGNvbnN0IGxhc3RVcGRhdGVTdGF0dXMgPSByZXNwb25zZS5Db25maWd1cmF0aW9uPy5MYXN0VXBkYXRlU3RhdHVzO1xuXG4gICAgaWYgKGxhc3RVcGRhdGVTdGF0dXMgPT09ICdTdWNjZXNzZnVsJykge1xuICAgICAgcmV0dXJuOyAvLyBVcGRhdGUgY29tcGxldGVkIHN1Y2Nlc3NmdWxseVxuICAgIH1cblxuICAgIGlmIChsYXN0VXBkYXRlU3RhdHVzID09PSAnRmFpbGVkJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdMYW1iZGEgZnVuY3Rpb24gdXBkYXRlIGZhaWxlZCcpO1xuICAgIH1cblxuICAgIGlmIChEYXRlLm5vdygpID4gZGVhZGxpbmUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVGltZWQgb3V0IGFmdGVyICR7dGltZW91dCAvIDEwMDB9IHNlY29uZHMuYCk7XG4gICAgfVxuXG4gICAgLy8gV2FpdCBiZWZvcmUgY2hlY2tpbmcgYWdhaW5cbiAgICBhd2FpdCBzbGVlcChkZWxheVNlY29uZHMgKiAxMDAwKTtcbiAgfVxufVxuIl19
51
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2RrLWNkay1kcmlmdC5pbnRlZ3Rlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJjZGstY2RrLWRyaWZ0LmludGVndGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLDBFQUErRTtBQUMvRSwwREFBNEU7QUFDNUUsbURBQThEO0FBQzlELHNDQUE2RDtBQUU3RCxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyx5RUFBeUU7QUFFM0csSUFBQSxlQUFTLEVBQ1AsV0FBVyxFQUNYLElBQUEsd0JBQWtCLEVBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxFQUFFO0lBQ25DLE1BQU0sT0FBTyxDQUFDLFNBQVMsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFFekMsc0ZBQXNGO0lBQ3RGLE1BQU0sS0FBSyxHQUFHLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUVuRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyw4Q0FBOEM7SUFDekYsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLFNBQVMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0lBQzdDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxTQUFTLENBQUMsc0NBQXNDLENBQUMsQ0FBQztJQUNoRSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLG9EQUFvRDtJQUU5RiwrQ0FBK0M7SUFDL0MsTUFBTSxRQUFRLEdBQUcsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQ3BELElBQUkscURBQTZCLENBQUM7UUFDaEMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDO0tBQzlDLENBQUMsQ0FDSCxDQUFDO0lBQ0YsTUFBTSxjQUFjLEdBQUcsUUFBUSxDQUFDLGNBQWMsRUFBRSxJQUFJLENBQ2xELFFBQVEsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLFlBQVksS0FBSyx1QkFBdUIsQ0FDOUQsQ0FBQztJQUNGLElBQUksQ0FBQyxjQUFjLElBQUksQ0FBQyxjQUFjLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUMxRCxNQUFNLElBQUksS0FBSyxDQUFDLG1EQUFtRCxDQUFDLENBQUM7SUFDdkUsQ0FBQztJQUNELE1BQU0sWUFBWSxHQUFHLGNBQWMsQ0FBQyxrQkFBa0IsQ0FBQztJQUV2RCxnREFBZ0Q7SUFDaEQsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQzNCLElBQUksa0RBQWtDLENBQUM7UUFDckMsWUFBWSxFQUFFLFlBQVk7UUFDMUIsV0FBVyxFQUFFLHNDQUFzQztLQUNwRCxDQUFDLENBQ0gsQ0FBQztJQUVGLHdDQUF3QztJQUN4QyxNQUFNLElBQUEsMkNBQTJCLEVBQUMsT0FBTyxFQUFFLFlBQVksQ0FBQyxDQUFDO0lBRXpELE1BQU0sc0JBQXNCLEdBQUcsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLENBQUMsRUFBRSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBRXBILE1BQU0sZUFBZSxHQUFHO1FBQ3RCLGtCQUFrQjtRQUNsQiw0QkFBNEI7UUFDNUIsNkNBQTZDO0tBQzlDLENBQUM7SUFDRixNQUFNLGtCQUFrQixHQUFHO1FBQ3pCLHdCQUF3QixFQUFFLHdCQUF3QjtRQUNsRCxzQ0FBc0M7UUFDdEMsdUJBQXVCLEVBQUUsc0NBQXNDO1FBQy9ELGNBQWMsRUFBRSxrQ0FBa0M7S0FDbkQsQ0FBQztJQUNGLEtBQUssTUFBTSxhQUFhLElBQUksZUFBZSxFQUFFLENBQUM7UUFDNUMsTUFBTSxDQUFDLHNCQUFzQixDQUFDLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQ3hELENBQUM7SUFDRCxLQUFLLE1BQU0saUJBQWlCLElBQUksa0JBQWtCLEVBQUUsQ0FBQztRQUNuRCxNQUFNLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxTQUFTLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUM5RCxDQUFDO0FBQ0gsQ0FBQyxDQUFDLENBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERlc2NyaWJlU3RhY2tSZXNvdXJjZXNDb21tYW5kIH0gZnJvbSAnQGF3cy1zZGsvY2xpZW50LWNsb3VkZm9ybWF0aW9uJztcbmltcG9ydCB7IFVwZGF0ZUZ1bmN0aW9uQ29uZmlndXJhdGlvbkNvbW1hbmQgfSBmcm9tICdAYXdzLXNkay9jbGllbnQtbGFtYmRhJztcbmltcG9ydCB7IHdhaXRGb3JMYW1iZGFVcGRhdGVDb21wbGV0ZSB9IGZyb20gJy4vZHJpZnRfaGVscGVycyc7XG5pbXBvcnQgeyBpbnRlZ1Rlc3QsIHdpdGhEZWZhdWx0Rml4dHVyZSB9IGZyb20gJy4uLy4uLy4uL2xpYic7XG5cbmplc3Quc2V0VGltZW91dCgyICogNjAgKiA2MF8wMDApOyAvLyBJbmNsdWRlcyB0aGUgdGltZSB0byBhY3F1aXJlIGxvY2tzLCB3b3JzdC1jYXNlIHNpbmdsZS10aHJlYWRlZCBydW50aW1lXG5cbmludGVnVGVzdChcbiAgJ2NkayBkcmlmdCcsXG4gIHdpdGhEZWZhdWx0Rml4dHVyZShhc3luYyAoZml4dHVyZSkgPT4ge1xuICAgIGF3YWl0IGZpeHR1cmUuY2RrRGVwbG95KCdkcmlmdGFibGUnLCB7fSk7XG5cbiAgICAvLyBBc3NlcnQgdGhhdCwgcmlnaHQgYWZ0ZXIgZGVwbG95aW5nLCB0aGVyZSBpcyBubyBkcmlmdCAoYmVjYXVzZSB3ZSBqdXN0IGRlcGxveWVkIGl0KVxuICAgIGNvbnN0IGRyaWZ0ID0gYXdhaXQgZml4dHVyZS5jZGsoWydkcmlmdCcsIGZpeHR1cmUuZnVsbFN0YWNrTmFtZSgnZHJpZnRhYmxlJyldLCB7IHZlcmJvc2U6IGZhbHNlIH0pO1xuXG4gICAgZXhwZWN0KGRyaWZ0KS50b01hdGNoKC9TdGFjay4qZHJpZnRhYmxlLyk7IC8vIGNhbid0IGp1c3QgLnRvQ29udGFpbiBiZWNhdXNlIG9mIGZvcm1hdHRpbmdcbiAgICBleHBlY3QoZHJpZnQpLnRvQ29udGFpbignTm8gZHJpZnQgZGV0ZWN0ZWQnKTtcbiAgICBleHBlY3QoZHJpZnQpLnRvQ29udGFpbign4pyoICBOdW1iZXIgb2YgcmVzb3VyY2VzIHdpdGggZHJpZnQ6IDAnKTtcbiAgICBleHBlY3QoZHJpZnQpLm5vdC50b0NvbnRhaW4oJ3VuY2hlY2tlZCcpOyAvLyBzaG91bGQgbm90IHNlZSB1bmNoZWNrZWQgcmVzb3VyY2VzIHVubGVzcyB2ZXJib3NlXG5cbiAgICAvLyBHZXQgdGhlIExhbWJkYSwgd2Ugd2FudCB0byBub3cgbWFrZSBpdCBkcmlmdFxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZml4dHVyZS5hd3MuY2xvdWRGb3JtYXRpb24uc2VuZChcbiAgICAgIG5ldyBEZXNjcmliZVN0YWNrUmVzb3VyY2VzQ29tbWFuZCh7XG4gICAgICAgIFN0YWNrTmFtZTogZml4dHVyZS5mdWxsU3RhY2tOYW1lKCdkcmlmdGFibGUnKSxcbiAgICAgIH0pLFxuICAgICk7XG4gICAgY29uc3QgbGFtYmRhUmVzb3VyY2UgPSByZXNwb25zZS5TdGFja1Jlc291cmNlcz8uZmluZChcbiAgICAgIHJlc291cmNlID0+IHJlc291cmNlLlJlc291cmNlVHlwZSA9PT0gJ0FXUzo6TGFtYmRhOjpGdW5jdGlvbicsXG4gICAgKTtcbiAgICBpZiAoIWxhbWJkYVJlc291cmNlIHx8ICFsYW1iZGFSZXNvdXJjZS5QaHlzaWNhbFJlc291cmNlSWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ291bGQgbm90IGZpbmQgTGFtYmRhIGZ1bmN0aW9uIGluIHN0YWNrIHJlc291cmNlcycpO1xuICAgIH1cbiAgICBjb25zdCBmdW5jdGlvbk5hbWUgPSBsYW1iZGFSZXNvdXJjZS5QaHlzaWNhbFJlc291cmNlSWQ7XG5cbiAgICAvLyBVcGRhdGUgdGhlIExhbWJkYSBmdW5jdGlvbiwgaW50cm9kdWNpbmcgZHJpZnRcbiAgICBhd2FpdCBmaXh0dXJlLmF3cy5sYW1iZGEuc2VuZChcbiAgICAgIG5ldyBVcGRhdGVGdW5jdGlvbkNvbmZpZ3VyYXRpb25Db21tYW5kKHtcbiAgICAgICAgRnVuY3Rpb25OYW1lOiBmdW5jdGlvbk5hbWUsXG4gICAgICAgIERlc2NyaXB0aW9uOiAnSVxcJ20gc2xvd2x5IGRyaWZ0aW5nIChkcmlmdGluZyBhd2F5KScsXG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgLy8gV2FpdCBmb3IgdGhlIHN0YWNrIHVwZGF0ZSB0byBjb21wbGV0ZVxuICAgIGF3YWl0IHdhaXRGb3JMYW1iZGFVcGRhdGVDb21wbGV0ZShmaXh0dXJlLCBmdW5jdGlvbk5hbWUpO1xuXG4gICAgY29uc3QgZHJpZnRBZnRlck1vZGlmaWNhdGlvbiA9IGF3YWl0IGZpeHR1cmUuY2RrKFsnZHJpZnQnLCBmaXh0dXJlLmZ1bGxTdGFja05hbWUoJ2RyaWZ0YWJsZScpXSwgeyB2ZXJib3NlOiBmYWxzZSB9KTtcblxuICAgIGNvbnN0IGV4cGVjdGVkTWF0Y2hlcyA9IFtcbiAgICAgIC9TdGFjay4qZHJpZnRhYmxlLyxcbiAgICAgIC9bLV0uKlRoaXMgaXMgbXkgZnVuY3Rpb24hL20sXG4gICAgICAvWytdLipJJ20gc2xvd2x5IGRyaWZ0aW5nIFxcKGRyaWZ0aW5nIGF3YXlcXCkvbSxcbiAgICBdO1xuICAgIGNvbnN0IGV4cGVjdGVkU3Vic3RyaW5ncyA9IFtcbiAgICAgICcxIHJlc291cmNlIGhhcyBkcmlmdGVkJywgLy8gbnVtIHJlc291cmNlcyBkcmlmdGVkXG4gICAgICAn4pyoICBOdW1iZXIgb2YgcmVzb3VyY2VzIHdpdGggZHJpZnQ6IDEnLFxuICAgICAgJ0FXUzo6TGFtYmRhOjpGdW5jdGlvbicsIC8vIHRoZSBsYW1iZGEgc2hvdWxkIGJlIG1hcmtlZCBkcmlmdGVkXG4gICAgICAnL0Rlc2NyaXB0aW9uJywgLy8gdGhlIHJlc291cmNlcyB0aGF0IGhhdmUgZHJpZnRlZFxuICAgIF07XG4gICAgZm9yIChjb25zdCBleHBlY3RlZE1hdGNoIG9mIGV4cGVjdGVkTWF0Y2hlcykge1xuICAgICAgZXhwZWN0KGRyaWZ0QWZ0ZXJNb2RpZmljYXRpb24pLnRvTWF0Y2goZXhwZWN0ZWRNYXRjaCk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgZXhwZWN0ZWRTdWJzdHJpbmcgb2YgZXhwZWN0ZWRTdWJzdHJpbmdzKSB7XG4gICAgICBleHBlY3QoZHJpZnRBZnRlck1vZGlmaWNhdGlvbikudG9Db250YWluKGV4cGVjdGVkU3Vic3RyaW5nKTtcbiAgICB9XG4gIH0pLFxuKTtcbiJdfQ==
@@ -0,0 +1 @@
1
+ export declare function waitForLambdaUpdateComplete(fixture: any, functionName: string): Promise<void>;
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.waitForLambdaUpdateComplete = waitForLambdaUpdateComplete;
4
+ const client_lambda_1 = require("@aws-sdk/client-lambda");
5
+ const lib_1 = require("../../../lib");
6
+ async function waitForLambdaUpdateComplete(fixture, functionName) {
7
+ const delaySeconds = 5;
8
+ const timeout = 30_000; // timeout after 30s
9
+ const deadline = Date.now() + timeout;
10
+ while (true) {
11
+ const response = await fixture.aws.lambda.send(new client_lambda_1.GetFunctionCommand({
12
+ FunctionName: functionName,
13
+ }));
14
+ const lastUpdateStatus = response.Configuration?.LastUpdateStatus;
15
+ if (lastUpdateStatus === 'Successful') {
16
+ return; // Update completed successfully
17
+ }
18
+ if (lastUpdateStatus === 'Failed') {
19
+ throw new Error('Lambda function update failed');
20
+ }
21
+ if (Date.now() > deadline) {
22
+ throw new Error(`Timed out after ${timeout / 1000} seconds.`);
23
+ }
24
+ // Wait before checking again
25
+ await (0, lib_1.sleep)(delaySeconds * 1000);
26
+ }
27
+ }
28
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJpZnRfaGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImRyaWZ0X2hlbHBlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFHQSxrRUE2QkM7QUFoQ0QsMERBQTREO0FBQzVELHNDQUFxQztBQUU5QixLQUFLLFVBQVUsMkJBQTJCLENBQUMsT0FBWSxFQUFFLFlBQW9CO0lBQ2xGLE1BQU0sWUFBWSxHQUFHLENBQUMsQ0FBQztJQUN2QixNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsQ0FBQyxvQkFBb0I7SUFDNUMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLE9BQU8sQ0FBQztJQUV0QyxPQUFPLElBQUksRUFBRSxDQUFDO1FBQ1osTUFBTSxRQUFRLEdBQUcsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQzVDLElBQUksa0NBQWtCLENBQUM7WUFDckIsWUFBWSxFQUFFLFlBQVk7U0FDM0IsQ0FBQyxDQUNILENBQUM7UUFFRixNQUFNLGdCQUFnQixHQUFHLFFBQVEsQ0FBQyxhQUFhLEVBQUUsZ0JBQWdCLENBQUM7UUFFbEUsSUFBSSxnQkFBZ0IsS0FBSyxZQUFZLEVBQUUsQ0FBQztZQUN0QyxPQUFPLENBQUMsZ0NBQWdDO1FBQzFDLENBQUM7UUFFRCxJQUFJLGdCQUFnQixLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQ2xDLE1BQU0sSUFBSSxLQUFLLENBQUMsK0JBQStCLENBQUMsQ0FBQztRQUNuRCxDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsUUFBUSxFQUFFLENBQUM7WUFDMUIsTUFBTSxJQUFJLEtBQUssQ0FBQyxtQkFBbUIsT0FBTyxHQUFHLElBQUksV0FBVyxDQUFDLENBQUM7UUFDaEUsQ0FBQztRQUVELDZCQUE2QjtRQUM3QixNQUFNLElBQUEsV0FBSyxFQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsQ0FBQztJQUNuQyxDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEdldEZ1bmN0aW9uQ29tbWFuZCB9IGZyb20gJ0Bhd3Mtc2RrL2NsaWVudC1sYW1iZGEnO1xuaW1wb3J0IHsgc2xlZXAgfSBmcm9tICcuLi8uLi8uLi9saWInO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd2FpdEZvckxhbWJkYVVwZGF0ZUNvbXBsZXRlKGZpeHR1cmU6IGFueSwgZnVuY3Rpb25OYW1lOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZGVsYXlTZWNvbmRzID0gNTtcbiAgY29uc3QgdGltZW91dCA9IDMwXzAwMDsgLy8gdGltZW91dCBhZnRlciAzMHNcbiAgY29uc3QgZGVhZGxpbmUgPSBEYXRlLm5vdygpICsgdGltZW91dDtcblxuICB3aGlsZSAodHJ1ZSkge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZml4dHVyZS5hd3MubGFtYmRhLnNlbmQoXG4gICAgICBuZXcgR2V0RnVuY3Rpb25Db21tYW5kKHtcbiAgICAgICAgRnVuY3Rpb25OYW1lOiBmdW5jdGlvbk5hbWUsXG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgY29uc3QgbGFzdFVwZGF0ZVN0YXR1cyA9IHJlc3BvbnNlLkNvbmZpZ3VyYXRpb24/Lkxhc3RVcGRhdGVTdGF0dXM7XG5cbiAgICBpZiAobGFzdFVwZGF0ZVN0YXR1cyA9PT0gJ1N1Y2Nlc3NmdWwnKSB7XG4gICAgICByZXR1cm47IC8vIFVwZGF0ZSBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5XG4gICAgfVxuXG4gICAgaWYgKGxhc3RVcGRhdGVTdGF0dXMgPT09ICdGYWlsZWQnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0xhbWJkYSBmdW5jdGlvbiB1cGRhdGUgZmFpbGVkJyk7XG4gICAgfVxuXG4gICAgaWYgKERhdGUubm93KCkgPiBkZWFkbGluZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaW1lZCBvdXQgYWZ0ZXIgJHt0aW1lb3V0IC8gMTAwMH0gc2Vjb25kcy5gKTtcbiAgICB9XG5cbiAgICAvLyBXYWl0IGJlZm9yZSBjaGVja2luZyBhZ2FpblxuICAgIGF3YWl0IHNsZWVwKGRlbGF5U2Vjb25kcyAqIDEwMDApO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,11 @@
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)('cdk metadata displays stack metadata', (0, lib_1.withDefaultFixture)(async (fixture) => {
6
+ await fixture.cdk(['synth', fixture.fullStackName('test-2')]);
7
+ const output = await fixture.cdk(['metadata', fixture.fullStackName('test-2')]);
8
+ // Most basic metadata type
9
+ expect(output).toContain('aws:cdk:logicalId');
10
+ }));
11
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2RrLW1ldGFkYXRhLmludGVndGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImNkay1tZXRhZGF0YS5pbnRlZ3Rlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxzQ0FBNkQ7QUFFN0QsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLE1BQU0sQ0FBQyxDQUFDO0FBRWpDLElBQUEsZUFBUyxFQUNQLHNDQUFzQyxFQUN0QyxJQUFBLHdCQUFrQixFQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsRUFBRTtJQUNuQyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDOUQsTUFBTSxNQUFNLEdBQUcsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsVUFBVSxFQUFFLE9BQU8sQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRWhGLDJCQUEyQjtJQUMzQixNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsU0FBUyxDQUFDLG1CQUFtQixDQUFDLENBQUM7QUFDaEQsQ0FBQyxDQUFDLENBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGludGVnVGVzdCwgd2l0aERlZmF1bHRGaXh0dXJlIH0gZnJvbSAnLi4vLi4vLi4vbGliJztcblxuamVzdC5zZXRUaW1lb3V0KDIgKiA2MCAqIDYwXzAwMCk7XG5cbmludGVnVGVzdChcbiAgJ2NkayBtZXRhZGF0YSBkaXNwbGF5cyBzdGFjayBtZXRhZGF0YScsXG4gIHdpdGhEZWZhdWx0Rml4dHVyZShhc3luYyAoZml4dHVyZSkgPT4ge1xuICAgIGF3YWl0IGZpeHR1cmUuY2RrKFsnc3ludGgnLCBmaXh0dXJlLmZ1bGxTdGFja05hbWUoJ3Rlc3QtMicpXSk7XG4gICAgY29uc3Qgb3V0cHV0ID0gYXdhaXQgZml4dHVyZS5jZGsoWydtZXRhZGF0YScsIGZpeHR1cmUuZnVsbFN0YWNrTmFtZSgndGVzdC0yJyldKTtcblxuICAgIC8vIE1vc3QgYmFzaWMgbWV0YWRhdGEgdHlwZVxuICAgIGV4cGVjdChvdXRwdXQpLnRvQ29udGFpbignYXdzOmNkazpsb2dpY2FsSWQnKTtcbiAgfSksXG4pO1xuIl19
@@ -0,0 +1,74 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const child_process = require("child_process");
4
+ const fs = require("fs");
5
+ const path = require("path");
6
+ const watch_helpers_1 = require("./watch-helpers");
7
+ const lib_1 = require("../../../lib");
8
+ jest.setTimeout(3 * 60 * 1000); // 3 minutes for watch tests
9
+ (0, lib_1.integTest)('cdk watch does NOT detect file changes for excluded patterns', (0, lib_1.withDefaultFixture)(async (fixture) => {
10
+ // Create a test file that will be watched (for initial deploy)
11
+ const watchedFile = path.join(fixture.integTestDir, 'watched-file.ts');
12
+ fs.writeFileSync(watchedFile, 'export const initial = true;');
13
+ // Update cdk.json to include watch configuration with specific exclude
14
+ const cdkJsonPath = path.join(fixture.integTestDir, 'cdk.json');
15
+ const cdkJson = JSON.parse(fs.readFileSync(cdkJsonPath, 'utf-8'));
16
+ cdkJson.watch = {
17
+ include: ['**/*.ts'],
18
+ exclude: ['**/*.excluded.ts'],
19
+ };
20
+ fs.writeFileSync(cdkJsonPath, JSON.stringify(cdkJson, null, 2));
21
+ await fixture.cli.makeCliAvailable();
22
+ let output = '';
23
+ // Start cdk watch with detached process group for clean termination
24
+ const watchProcess = child_process.spawn('cdk', [
25
+ 'watch', '--hotswap', '-v', fixture.fullStackName('test-1'),
26
+ ], {
27
+ cwd: fixture.integTestDir,
28
+ shell: true,
29
+ stdio: 'pipe',
30
+ env: { ...process.env, ...fixture.cdkShellEnv() },
31
+ });
32
+ try {
33
+ watchProcess.stdout?.on('data', (data) => {
34
+ output += data.toString();
35
+ fixture.log(data.toString());
36
+ });
37
+ watchProcess.stderr?.on('data', (data) => {
38
+ output += data.toString();
39
+ fixture.log(data.toString());
40
+ });
41
+ await (0, watch_helpers_1.waitForOutput)(() => output, "Triggering initial 'cdk deploy'");
42
+ fixture.log('✓ Watch start detected');
43
+ await (0, watch_helpers_1.waitForOutput)(() => output, 'deployment time');
44
+ fixture.log('✓ Initial deployment completed');
45
+ // Count deployments before creating excluded file
46
+ const deploymentsBefore = (output.match(/deployment time/g) || []).length;
47
+ // Create an excluded file - this should NOT trigger a watch event
48
+ const excludedFile = path.join(fixture.integTestDir, 'should-be-ignored.excluded.ts');
49
+ fs.writeFileSync(excludedFile, 'export const excluded = true;');
50
+ fixture.log('Created excluded file: should-be-ignored.excluded.ts');
51
+ // Wait a reasonable time for any potential (unwanted) detection
52
+ await (0, lib_1.sleep)(5000);
53
+ // Verify no "Detected change" message for the excluded file
54
+ const detectedExcluded = output.includes('Detected change to') && output.includes('excluded');
55
+ expect(detectedExcluded).toBe(false);
56
+ // Verify deployment count hasn't increased
57
+ const deploymentsAfter = (output.match(/deployment time/g) || []).length;
58
+ expect(deploymentsAfter).toBe(deploymentsBefore);
59
+ fixture.log('✓ Watch correctly ignored excluded file');
60
+ // Now modify a watched file to confirm watch is still working
61
+ fs.writeFileSync(watchedFile, 'export const modified = true;');
62
+ await (0, watch_helpers_1.waitForOutput)(() => output, 'Detected change to');
63
+ fixture.log('✓ Watch still detects changes to included files');
64
+ }
65
+ finally {
66
+ try {
67
+ watchProcess.kill('SIGTERM');
68
+ }
69
+ catch {
70
+ // process may have already exited
71
+ }
72
+ }
73
+ }));
74
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2RrLXdhdGNoLWRldGVjdHMtZmlsZS1jaGFuZ2VzLXdpdGgtZ2xvYi1wYXR0ZXJucy1uZWdhdGl2ZS5pbnRlZ3Rlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJjZGstd2F0Y2gtZGV0ZWN0cy1maWxlLWNoYW5nZXMtd2l0aC1nbG9iLXBhdHRlcm5zLW5lZ2F0aXZlLmludGVndGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLCtDQUErQztBQUMvQyx5QkFBeUI7QUFDekIsNkJBQTZCO0FBQzdCLG1EQUFnRDtBQUNoRCxzQ0FBb0U7QUFFcEUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsNEJBQTRCO0FBRTVELElBQUEsZUFBUyxFQUNQLDhEQUE4RCxFQUM5RCxJQUFBLHdCQUFrQixFQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsRUFBRTtJQUNuQywrREFBK0Q7SUFDL0QsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLGlCQUFpQixDQUFDLENBQUM7SUFDdkUsRUFBRSxDQUFDLGFBQWEsQ0FBQyxXQUFXLEVBQUUsOEJBQThCLENBQUMsQ0FBQztJQUU5RCx1RUFBdUU7SUFDdkUsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ2hFLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxXQUFXLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUNsRSxPQUFPLENBQUMsS0FBSyxHQUFHO1FBQ2QsT0FBTyxFQUFFLENBQUMsU0FBUyxDQUFDO1FBQ3BCLE9BQU8sRUFBRSxDQUFDLGtCQUFrQixDQUFDO0tBQzlCLENBQUM7SUFDRixFQUFFLENBQUMsYUFBYSxDQUFDLFdBQVcsRUFBRSxJQUFJLENB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QUFFLCtCQUErQixDQUFDLENBQUM7UUFFL0QsTUFBTSxJQUFBLDZCQUFhLEVBQUMsR0FBRyxFQUFFLENBQUMsTUFBTSxFQUFFLG9CQUFvQixDQUFDLENBQUM7UUFDeEQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxpREFBaUQsQ0FBQyxDQUFDO0lBQ2pFLENBQUM7WUFBUyxDQUFDO1FBQ1QsSUFBSSxDQUFDO1lBQ0gsWUFBWSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUMvQixDQUFDO1FBQUMsTUFBTSxDQUFDO1lBQ1Asa0NBQWtDO1FBQ3BDLENBQUM7SUFDSCxDQUFDO0FBQ0gsQ0FBQyxDQUFDLENBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGNoaWxkX3Byb2Nlc3MgZnJvbSAnY2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgKiBhcyBmcyBmcm9tICdmcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgd2FpdEZvck91dHB1dCB9IGZyb20gJy4vd2F0Y2gtaGVscGVycyc7XG5pbXBvcnQgeyBpbnRlZ1Rlc3QsIHdpdGhEZWZhdWx0Rml4dHVyZSwgc2xlZXAgfSBmcm9tICcuLi8uLi8uLi9saWInO1xuXG5qZXN0LnNldFRpbWVvdXQoMyAqIDYwICogMTAwMCk7IC8vIDMgbWludXRlcyBmb3Igd2F0Y2ggdGVzdHNcblxuaW50ZWdUZXN0KFxuICAnY2RrIHdhdGNoIGRvZXMgTk9UIGRldGVjdCBmaWxlIGNoYW5nZXMgZm9yIGV4Y2x1ZGVkIHBhdHRlcm5zJyxcbiAgd2l0aERlZmF1bHRGaXh0dXJlKGFzeW5jIChmaXh0dXJlKSA9PiB7XG4gICAgLy8gQ3JlYXRlIGEgdGVzdCBmaWxlIHRoYXQgd2lsbCBiZSB3YXRjaGVkIChmb3IgaW5pdGlhbCBkZXBsb3kpXG4gICAgY29uc3Qgd2F0Y2hlZEZpbGUgPSBwYXRoLmpvaW4oZml4dHVyZS5pbnRlZ1Rlc3REaXIsICd3YXRjaGVkLWZpbGUudHMnKTtcbiAgICBmcy53cml0ZUZpbGVTeW5jKHdhdGNoZWRGaWxlLCAnZXhwb3J0IGNvbnN0IGluaXRpYWwgPSB0cnVlOycpO1xuXG4gICAgLy8gVXBkYXRlIGNkay5qc29uIHRvIGluY2x1ZGUgd2F0Y2ggY29uZmlndXJhdGlvbiB3aXRoIHNwZWNpZmljIGV4Y2x1ZGVcbiAgICBjb25zdCBjZGtKc29uUGF0aCA9IHBhdGguam9pbihmaXh0dXJlLmludGVnVGVzdERpciwgJ2Nkay5qc29uJyk7XG4gICAgY29uc3QgY2RrSnNvbiA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKGNka0pzb25QYXRoLCAndXRmLTgnKSk7XG4gICAgY2RrSnNvbi53YXRjaCA9IHtcbiAgICAgIGluY2x1ZGU6IFsnKiovKi50cyddLFxuICAgICAgZXhjbHVkZTogWycqKi8qLmV4Y2x1ZGVkLnRzJ10sXG4gICAgfTtcbiAgICBmcy53cml0ZUZpbGVTeW5jKGNka0pzb25QYXRoLCBKU09OLnN0cmluZ2lmeShjZGtKc29uLCBudWxsLCAyKSk7XG5cbiAgICBhd2FpdCBmaXh0dXJlLmNsaS5tYWtlQ2xpQXZhaWxhYmxlKCk7XG5cbiAgICBsZXQgb3V0cHV0ID0gJyc7XG5cbiAgICAvLyBTdGFydCBjZGsgd2F0Y2ggd2l0aCBkZXRhY2hlZCBwcm9jZXNzIGdyb3VwIGZvciBjbGVhbiB0ZXJtaW5hdGlvblxuICAgIGNvbnN0IHdhdGNoUHJvY2VzcyA9IGNoaWxkX3Byb2Nlc3Muc3Bhd24oJ2NkaycsIFtcbiAgICAgICd3YXRjaCcsICctLWhvdHN3YXAnLCAnLXYnLCBmaXh0dXJlLmZ1bGxTdGFja05hbWUoJ3Rlc3QtMScpLFxuICAgIF0sIHtcbiAgICAgIGN3ZDogZml4dHVyZS5pbnRlZ1Rlc3REaXIsXG4gICAgICBzaGVsbDogdHJ1ZSxcbiAgICAgIHN0ZGlvOiAncGlwZScsXG4gICAgICBlbnY6IHsgLi4ucHJvY2Vzcy5lbnYsIC4uLmZpeHR1cmUuY2RrU2hlbGxFbnYoKSB9LFxuICAgIH0pO1xuXG4gICAgdHJ5IHtcbiAgICAgIHdhdGNoUHJvY2Vzcy5zdGRvdXQ/Lm9uKCdkYXRhJywgKGRhdGEpID0+IHtcbiAgICAgICAgb3V0cHV0ICs9IGRhdGEudG9TdHJpbmcoKTtcbiAgICAgICAgZml4dHVyZS5sb2coZGF0YS50b1N0cmluZygpKTtcbiAgICAgIH0pO1xuICAgICAgd2F0Y2hQcm9jZXNzLnN0ZGVycj8ub24oJ2RhdGEnLCAoZGF0YSkgPT4ge1xuICAgICAgICBvdXRwdXQgKz0gZGF0YS50b1N0cmluZygpO1xuICAgICAgICBmaXh0dXJlLmxvZyhkYXRhLnRvU3RyaW5nKCkpO1xuICAgICAgfSk7XG5cbiAgICAgIGF3YWl0IHdhaXRGb3JPdXRwdXQoKCkgPT4gb3V0cHV0LCBcIlRyaWdnZXJpbmcgaW5pdGlhbCAnY2RrIGRlcGxveSdcIik7XG4gICAgICBmaXh0dXJlLmxvZygn4pyTIFdhdGNoIHN0YXJ0IGRldGVjdGVkJyk7XG5cbiAgICAgIGF3YWl0IHdhaXRGb3JPdXRwdXQoKCkgPT4gb3V0cHV0LCAnZGVwbG95bWVudCB0aW1lJyk7XG4gICAgICBmaXh0dXJlLmxvZygn4pyTIEluaXRpYWwgZGVwbG95bWVudCBjb21wbGV0ZWQnKTtcblxuICAgICAgLy8gQ291bnQgZGVwbG95bWVudHMgYmVmb3JlIGNyZWF0aW5nIGV4Y2x1ZGVkIGZpbGVcbiAgICAgIGNvbnN0IGRlcGxveW1lbnRzQmVmb3JlID0gKG91dHB1dC5tYXRjaCgvZGVwbG95bWVudCB0aW1lL2cpIHx8IFtdKS5sZW5ndGg7XG5cbiAgICAgIC8vIENyZWF0ZSBhbiBleGNsdWRlZCBmaWxlIC0gdGhpcyBzaG91bGQgTk9UIHRyaWdnZXIgYSB3YXRjaCBldmVudFxuICAgICAgY29uc3QgZXhjbHVkZWRGaWxlID0gcGF0aC5qb2luKGZpeHR1cmUuaW50ZWdUZXN0RGlyLCAnc2hvdWxkLWJlLWlnbm9yZWQuZXhjbHVkZWQudHMnKTtcbiAgICAgIGZzLndyaXRlRmlsZVN5bmMoZXhjbHVkZWRGaWxlLCAnZXhwb3J0IGNvbnN0IGV4Y2x1ZGVkID0gdHJ1ZTsnKTtcbiAgICAgIGZpeHR1cmUubG9nKCdDcmVhdGVkIGV4Y2x1ZGVkIGZpbGU6IHNob3VsZC1iZS1pZ25vcmVkLmV4Y2x1ZGVkLnRzJyk7XG5cbiAgICAgIC8vIFdhaXQgYSByZWFzb25hYmxlIHRpbWUgZm9yIGFueSBwb3RlbnRpYWwgKHVud2FudGVkKSBkZXRlY3Rpb25cbiAgICAgIGF3YWl0IHNsZWVwKDUwMDApO1xuXG4gICAgICAvLyBWZXJpZnkgbm8gXCJEZXRlY3RlZCBjaGFuZ2VcIiBtZXNzYWdlIGZvciB0aGUgZXhjbHVkZWQgZmlsZVxuICAgICAgY29uc3QgZGV0ZWN0ZWRFeGNsdWRlZCA9IG91dHB1dC5pbmNsdWRlcygnRGV0ZWN0ZWQgY2hhbmdlIHRvJykgJiYgb3V0cHV0LmluY2x1ZGVzKCdleGNsdWRlZCcpO1xuICAgICAgZXhwZWN0KGRldGVjdGVkRXhjbHVkZWQpLnRvQmUoZmFsc2UpO1xuXG4gICAgICAvLyBWZXJpZnkgZGVwbG95bWVudCBjb3VudCBoYXNuJ3QgaW5jcmVhc2VkXG4gICAgICBjb25zdCBkZXBsb3ltZW50c0FmdGVyID0gKG91dHB1dC5tYXRjaCgvZGVwbG95bWVudCB0aW1lL2cpIHx8IFtdKS5sZW5ndGg7XG4gICAgICBleHBlY3QoZGVwbG95bWVudHNBZnRlcikudG9CZShkZXBsb3ltZW50c0JlZm9yZSk7XG5cbiAgICAgIGZpeHR1cmUubG9nKCfinJMgV2F0Y2ggY29ycmVjdGx5IGlnbm9yZWQgZXhjbHVkZWQgZmlsZScpO1xuXG4gICAgICAvLyBOb3cgbW9kaWZ5IGEgd2F0Y2hlZCBmaWxlIHRvIGNvbmZpcm0gd2F0Y2ggaXMgc3RpbGwgd29ya2luZ1xuICAgICAgZnMud3JpdGVGaWxlU3luYyh3YXRjaGVkRmlsZSwgJ2V4cG9ydCBjb25zdCBtb2RpZmllZCA9IHRydWU7Jyk7XG5cbiAgICAgIGF3YWl0IHdhaXRGb3JPdXRwdXQoKCkgPT4gb3V0cHV0LCAnRGV0ZWN0ZWQgY2hhbmdlIHRvJyk7XG4gICAgICBmaXh0dXJlLmxvZygn4pyTIFdhdGNoIHN0aWxsIGRldGVjdHMgY2hhbmdlcyB0byBpbmNsdWRlZCBmaWxlcycpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0cnkge1xuICAgICAgICB3YXRjaFByb2Nlc3Mua2lsbCgnU0lHVEVSTScpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIHByb2Nlc3MgbWF5IGhhdmUgYWxyZWFkeSBleGl0ZWRcbiAgICAgIH1cbiAgICB9XG4gIH0pLFxuKTtcbiJdfQ==
@@ -0,0 +1,61 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const child_process = require("child_process");
4
+ const fs = require("fs");
5
+ const path = require("path");
6
+ const watch_helpers_1 = require("./watch-helpers");
7
+ const lib_1 = require("../../../lib");
8
+ jest.setTimeout(3 * 60 * 1000); // 3 minutes for watch tests
9
+ (0, lib_1.integTest)('cdk watch detects file changes with glob patterns', (0, lib_1.withDefaultFixture)(async (fixture) => {
10
+ // Create a test file that will be watched
11
+ const testFile = path.join(fixture.integTestDir, 'watch-test-file.ts');
12
+ fs.writeFileSync(testFile, 'export const initial = true;');
13
+ // Update cdk.json to include watch configuration
14
+ const cdkJsonPath = path.join(fixture.integTestDir, 'cdk.json');
15
+ const cdkJson = JSON.parse(fs.readFileSync(cdkJsonPath, 'utf-8'));
16
+ cdkJson.watch = {
17
+ include: ['**/*.ts'],
18
+ };
19
+ fs.writeFileSync(cdkJsonPath, JSON.stringify(cdkJson, null, 2));
20
+ await fixture.cli.makeCliAvailable();
21
+ let output = '';
22
+ // Start cdk watch with detached process group for clean termination
23
+ const watchProcess = child_process.spawn('cdk', [
24
+ 'watch', '--hotswap', '-v', fixture.fullStackName('test-1'),
25
+ ], {
26
+ cwd: fixture.integTestDir,
27
+ shell: true,
28
+ stdio: 'pipe',
29
+ env: { ...process.env, ...fixture.cdkShellEnv() },
30
+ });
31
+ try {
32
+ watchProcess.stdout?.on('data', (data) => {
33
+ output += data.toString();
34
+ fixture.log(data.toString());
35
+ });
36
+ watchProcess.stderr?.on('data', (data) => {
37
+ output += data.toString();
38
+ fixture.log(data.toString());
39
+ });
40
+ await (0, watch_helpers_1.waitForOutput)(() => output, "Triggering initial 'cdk deploy'");
41
+ fixture.log('✓ Watch start detected');
42
+ await (0, watch_helpers_1.waitForOutput)(() => output, 'deployment time');
43
+ fixture.log('✓ Initial deployment completed');
44
+ // Update the test file timestamp to trigger a watch event
45
+ child_process.spawn('touch', [testFile]);
46
+ await (0, watch_helpers_1.waitForOutput)(() => output, 'Detected change to');
47
+ fixture.log('✓ Watch detected file change');
48
+ // Wait for the second deployment to complete (2 occurrences of 'deployment time')
49
+ await (0, watch_helpers_1.waitForCondition)(() => (output.match(/deployment time/g) || []).length >= 2);
50
+ fixture.log('✓ Second deployment completed');
51
+ }
52
+ finally {
53
+ try {
54
+ watchProcess.kill('SIGTERM');
55
+ }
56
+ catch (e) {
57
+ // process may have already exited
58
+ }
59
+ }
60
+ }));
61
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2RrLXdhdGNoLWRldGVjdHMtZmlsZS1jaGFuZ2VzLXdpdGgtZ2xvYi1wYXR0ZXJucy5pbnRlZ3Rlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJjZGstd2F0Y2gtZGV0ZWN0cy1maWxlLWNoYW5nZXMtd2l0aC1nbG9iLXBhdHRlcm5zLmludGVndGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLCtDQUErQztBQUMvQyx5QkFBeUI7QUFDekIsNkJBQTZCO0FBQzdCLG1EQUFrRTtBQUNsRSxzQ0FBNkQ7QUFFN0QsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsNEJBQTRCO0FBRTVELElBQUEsZUFBUyxFQUNQLG1EQUFtRCxFQUNuRCxJQUFBLHdCQUFrQixFQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsRUFBRTtJQUNuQywwQ0FBMEM7SUFDMUMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLG9CQUFvQixDQUFDLENBQUM7SUFDdkUsRUFBRSxDQUFDLGFBQWEsQ0FBQyxRQUFRLEVBQUUsOEJBQThCLENBQUMsQ0FBQztJQUUzRCxpREFBaUQ7SUFDakQsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ2hFLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxXQUFXLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUNsRSxPQUFPLENBQUMsS0FBSyxHQUFHO1FBQ2QsT0FBTyxFQUFFLENBQUMsU0FBUyxDQUFDO0tBQ3JCLENBQUM7SUFDRixFQUFFLENBQUMsYUFBYSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUVoRSxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztJQUVyQyxJQUFJLE1BQU0sR0FBRyxFQUFFLENBQUM7SUFFaEIsb0VBQW9FO0lBQ3BFLE1BQU0sWUFBWSxHQUFHLGFBQWEsQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFO1FBQzlDLE9BQU8sRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDO0tBQzVELEVBQUU7UUFDRCxHQUFHLEVBQUUsT0FBTyxDQUFDLFlBQVk7UUFDekIsS0FBSyxFQUFFLElBQUk7UUFDWCxLQUFLLEVBQUUsTUFBTTtRQUNiLEdBQUcsRUFBRSxFQUFFLEdBQUcsT0FBTyxDQUFDLEdBQUcsRUFBRSxHQUFHLE9BQU8sQ0FBQyxXQUFXLEVBQUUsRUFBRTtLQUNsRCxDQUFDLENBQUM7SUFFSCxJQUFJLENBQUM7UUFDSCxZQUFZLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUN2QyxNQUFNLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQzFCLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDL0IsQ0FBQyxDQUFDLENBQUM7UUFDSCxZQUFZLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUN2QyxNQUFNLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQzFCLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDL0IsQ0FBQyxDQUFDLENBQUM7UUFFSCxNQUFNLElBQUEsNkJBQWEsRUFBQyxHQUFHLEVBQUUsQ0FBQyxNQUFNLEVBQUUsaUNBQWlDLENBQUMsQ0FBQztRQUNyRSxPQUFPLENBQUMsR0FBRyxDQUFDLHdCQUF3QixDQUFDLENBQUM7UUFFdEMsTUFBTSxJQUFBLDZCQUFhLEVBQUMsR0FBRyxFQUFFLENBQUMsTUFBTSxFQUFFLGlCQUFpQixDQUFDLENBQUM7UUFDckQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDO1FBRTlDLDBEQUEwRDtRQUMxRCxhQUFhLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7UUFFekMsTUFBTSxJQUFBLDZCQUFhLEVBQUMsR0FBRyxFQUFFLENBQUMsTUFBTSxFQUFFLG9CQUFvQixDQUFDLENBQUM7UUFDeEQsT0FBTyxDQUFDLEdBQUcsQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO1FBRTVDLGtGQUFrRjtRQUNsRixNQUFNLElBQUEsZ0NBQWdCLEVBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLGtCQUFrQixDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ25GLE9BQU8sQ0FBQyxHQUFHLENBQUMsK0JBQStCLENBQUMsQ0FBQztJQUMvQyxDQUFDO1lBQVMsQ0FBQztRQUNULElBQUksQ0FBQztZQUNILFlBQVksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDL0IsQ0FBQztRQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDWCxrQ0FBa0M7UUFDcEMsQ0FBQztJQUNILENBQUM7QUFDSCxDQUFDLENBQUMsQ0FDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgY2hpbGRfcHJvY2VzcyBmcm9tICdjaGlsZF9wcm9jZXNzJztcbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyB3YWl0Rm9yT3V0cHV0LCB3YWl0Rm9yQ29uZGl0aW9uIH0gZnJvbSAnLi93YXRjaC1oZWxwZXJzJztcbmltcG9ydCB7IGludGVnVGVzdCwgd2l0aERlZmF1bHRGaXh0dXJlIH0gZnJvbSAnLi4vLi4vLi4vbGliJztcblxuamVzdC5zZXRUaW1lb3V0KDMgKiA2MCAqIDEwMDApOyAvLyAzIG1pbnV0ZXMgZm9yIHdhdGNoIHRlc3RzXG5cbmludGVnVGVzdChcbiAgJ2NkayB3YXRjaCBkZXRlY3RzIGZpbGUgY2hhbmdlcyB3aXRoIGdsb2IgcGF0dGVybnMnLFxuICB3aXRoRGVmYXVsdEZpeHR1cmUoYXN5bmMgKGZpeHR1cmUpID0+IHtcbiAgICAvLyBDcmVhdGUgYSB0ZXN0IGZpbGUgdGhhdCB3aWxsIGJlIHdhdGNoZWRcbiAgICBjb25zdCB0ZXN0RmlsZSA9IHBhdGguam9pbihmaXh0dXJlLmludGVnVGVzdERpciwgJ3dhdGNoLXRlc3QtZmlsZS50cycpO1xuICAgIGZzLndyaXRlRmlsZVN5bmModGVzdEZpbGUsICdleHBvcnQgY29uc3QgaW5pdGlhbCA9IHRydWU7Jyk7XG5cbiAgICAvLyBVcGRhdGUgY2RrLmpzb24gdG8gaW5jbHVkZSB3YXRjaCBjb25maWd1cmF0aW9uXG4gICAgY29uc3QgY2RrSnNvblBhdGggPSBwYXRoLmpvaW4oZml4dHVyZS5pbnRlZ1Rlc3REaXIsICdjZGsuanNvbicpO1xuICAgIGNvbnN0IGNka0pzb24gPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhjZGtKc29uUGF0aCwgJ3V0Zi04JykpO1xuICAgIGNka0pzb24ud2F0Y2ggPSB7XG4gICAgICBpbmNsdWRlOiBbJyoqLyoudHMnXSxcbiAgICB9O1xuICAgIGZzLndyaXRlRmlsZVN5bmMoY2RrSnNvblBhdGgsIEpTT04uc3RyaW5naWZ5KGNka0pzb24sIG51bGwsIDIpKTtcblxuICAgIGF3YWl0IGZpeHR1cmUuY2xpLm1ha2VDbGlBdmFpbGFibGUoKTtcblxuICAgIGxldCBvdXRwdXQgPSAnJztcblxuICAgIC8vIFN0YXJ0IGNkayB3YXRjaCB3aXRoIGRldGFjaGVkIHByb2Nlc3MgZ3JvdXAgZm9yIGNsZWFuIHRlcm1pbmF0aW9uXG4gICAgY29uc3Qgd2F0Y2hQcm9jZXNzID0gY2hpbGRfcHJvY2Vzcy5zcGF3bignY2RrJywgW1xuICAgICAgJ3dhdGNoJywgJy0taG90c3dhcCcsICctdicsIGZpeHR1cmUuZnVsbFN0YWNrTmFtZSgndGVzdC0xJyksXG4gICAgXSwge1xuICAgICAgY3dkOiBmaXh0dXJlLmludGVnVGVzdERpcixcbiAgICAgIHNoZWxsOiB0cnVlLFxuICAgICAgc3RkaW86ICdwaXBlJyxcbiAgICAgIGVudjogeyAuLi5wcm9jZXNzLmVudiwgLi4uZml4dHVyZS5jZGtTaGVsbEVudigpIH0sXG4gICAgfSk7XG5cbiAgICB0cnkge1xuICAgICAgd2F0Y2hQcm9jZXNzLnN0ZG91dD8ub24oJ2RhdGEnLCAoZGF0YSkgPT4ge1xuICAgICAgICBvdXRwdXQgKz0gZGF0YS50b1N0cmluZygpO1xuICAgICAgICBmaXh0dXJlLmxvZyhkYXRhLnRvU3RyaW5nKCkpO1xuICAgICAgfSk7XG4gICAgICB3YXRjaFByb2Nlc3Muc3RkZXJyPy5vbignZGF0YScsIChkYXRhKSA9PiB7XG4gICAgICAgIG91dHB1dCArPSBkYXRhLnRvU3RyaW5nKCk7XG4gICAgICAgIGZpeHR1cmUubG9nKGRhdGEudG9TdHJpbmcoKSk7XG4gICAgICB9KTtcblxuICAgICAgYXdhaXQgd2FpdEZvck91dHB1dCgoKSA9PiBvdXRwdXQsIFwiVHJpZ2dlcmluZyBpbml0aWFsICdjZGsgZGVwbG95J1wiKTtcbiAgICAgIGZpeHR1cmUubG9nKCfinJMgV2F0Y2ggc3RhcnQgZGV0ZWN0ZWQnKTtcblxuICAgICAgYXdhaXQgd2FpdEZvck91dHB1dCgoKSA9PiBvdXRwdXQsICdkZXBsb3ltZW50IHRpbWUnKTtcbiAgICAgIGZpeHR1cmUubG9nKCfinJMgSW5pdGlhbCBkZXBsb3ltZW50IGNvbXBsZXRlZCcpO1xuXG4gICAgICAvLyBVcGRhdGUgdGhlIHRlc3QgZmlsZSB0aW1lc3RhbXAgdG8gdHJpZ2dlciBhIHdhdGNoIGV2ZW50XG4gICAgICBjaGlsZF9wcm9jZXNzLnNwYXduKCd0b3VjaCcsIFt0ZXN0RmlsZV0pO1xuXG4gICAgICBhd2FpdCB3YWl0Rm9yT3V0cHV0KCgpID0+IG91dHB1dCwgJ0RldGVjdGVkIGNoYW5nZSB0bycpO1xuICAgICAgZml4dHVyZS5sb2coJ+KckyBXYXRjaCBkZXRlY3RlZCBmaWxlIGNoYW5nZScpO1xuXG4gICAgICAvLyBXYWl0IGZvciB0aGUgc2Vjb25kIGRlcGxveW1lbnQgdG8gY29tcGxldGUgKDIgb2NjdXJyZW5jZXMgb2YgJ2RlcGxveW1lbnQgdGltZScpXG4gICAgICBhd2FpdCB3YWl0Rm9yQ29uZGl0aW9uKCgpID0+IChvdXRwdXQubWF0Y2goL2RlcGxveW1lbnQgdGltZS9nKSB8fCBbXSkubGVuZ3RoID49IDIpO1xuICAgICAgZml4dHVyZS5sb2coJ+KckyBTZWNvbmQgZGVwbG95bWVudCBjb21wbGV0ZWQnKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgd2F0Y2hQcm9jZXNzLmtpbGwoJ1NJR1RFUk0nKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gcHJvY2VzcyBtYXkgaGF2ZSBhbHJlYWR5IGV4aXRlZFxuICAgICAgfVxuICAgIH1cbiAgfSksXG4pO1xuIl19
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Shared helper functions for watch integration tests.
3
+ */
4
+ /**
5
+ * Wait for a specific string to appear in the output.
6
+ */
7
+ export declare function waitForOutput(getOutput: () => string, searchString: string): Promise<void>;
8
+ /**
9
+ * Wait for a condition to become true.
10
+ */
11
+ export declare function waitForCondition(condition: () => boolean): Promise<void>;