@aws-cdk-testing/cli-integ 3.23.0 → 3.24.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 (20) hide show
  1. package/npm-shrinkwrap.json +1549 -3007
  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/watch/cdk-watch-detects-file-changes-with-glob-patterns-negative.integtest.d.ts +1 -0
  10. package/tests/cli-integ-tests/watch/cdk-watch-detects-file-changes-with-glob-patterns-negative.integtest.js +72 -0
  11. package/tests/cli-integ-tests/watch/cdk-watch-detects-file-changes-with-glob-patterns.integtest.d.ts +1 -0
  12. package/tests/cli-integ-tests/watch/cdk-watch-detects-file-changes-with-glob-patterns.integtest.js +59 -0
  13. package/tests/cli-integ-tests/watch/watch-helpers.d.ts +11 -0
  14. package/tests/cli-integ-tests/watch/watch-helpers.js +33 -0
  15. package/tests/toolkit-lib-integ-tests/toolkit-deploy-stack-with-multiple-docker-assets.integtest.d.ts +1 -0
  16. package/tests/toolkit-lib-integ-tests/toolkit-deploy-stack-with-multiple-docker-assets.integtest.js +22 -0
  17. package/tests/toolkit-lib-integ-tests/toolkit-watch-glob-negative.integtest.d.ts +1 -0
  18. package/tests/toolkit-lib-integ-tests/toolkit-watch-glob-negative.integtest.js +52 -0
  19. package/tests/toolkit-lib-integ-tests/toolkit-watch-glob.integtest.d.ts +1 -0
  20. 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.17.0",
43
43
  "@aws-cdk/yarn-cling": "0.0.0",
44
- "@cdklabs/eslint-plugin": "^1.3.5",
44
+ "@cdklabs/eslint-plugin": "^1.5.5",
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.1000.0",
71
+ "@aws-sdk/client-codeartifact": "^3.1000.0",
72
+ "@aws-sdk/client-ecr": "^3.1000.0",
73
+ "@aws-sdk/client-ecr-public": "^3.1000.0",
74
+ "@aws-sdk/client-ecs": "^3.1000.0",
75
+ "@aws-sdk/client-iam": "^3.1000.0",
76
+ "@aws-sdk/client-lambda": "^3.1000.0",
77
+ "@aws-sdk/client-s3": "^3.1000.0",
78
+ "@aws-sdk/client-secrets-manager": "^3.1000.0",
79
+ "@aws-sdk/client-sns": "^3.1000.0",
80
+ "@aws-sdk/client-sso": "^3.1000.0",
81
+ "@aws-sdk/client-sts": "^3.1000.0",
82
+ "@aws-sdk/credential-providers": "^3.1000.0",
83
+ "@cdklabs/cdk-atmosphere-client": "^0.0.90",
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.10",
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.24.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,72 @@
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
+ detached: true,
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
+ // Kill the entire process group (negative PID)
67
+ if (watchProcess.pid) {
68
+ process.kill(-watchProcess.pid, 'SIGTERM');
69
+ }
70
+ }
71
+ }));
72
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2RrLXdhdGNoLWRldGVjdHMtZmlsZS1jaGFuZ2VzLXdpdGgtZ2xvYi1wYXR0ZXJucy1uZWdhdGl2ZS5pbnRlZ3Rlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJjZGstd2F0Y2gtZGV0ZWN0cy1maWxlLWNoYW5nZXMtd2l0aC1nbG9iLXBhdHRlcm5zLW5lZ2F0aXZlLmludGVndGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLCtDQUErQztBQUMvQyx5QkFBeUI7QUFDekIsNkJBQTZCO0FBQzdCLG1EQUFnRDtBQUNoRCxzQ0FBb0U7QUFFcEUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsNEJBQTRCO0FBRTVELElBQUEsZUFBUyxFQUNQLDhEQUE4RCxFQUM5RCxJQUFBLHdCQUFrQixFQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsRUFBRTtJQUNuQywrREFBK0Q7SUFDL0QsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLGlCQUFpQixDQUFDLENBQUM7SUFDdkUsRUFBRSxDQUFDLGFBQWEsQ0FBQyxXQUFXLEVBQUUsOEJBQThCLENBQUMsQ0FBQztJQUU5RCx1RUFBdUU7SUFDdkUsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ2hFLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxXQUFXLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUNsRSxPQUFPLENBQUMsS0FBSyxHQUFHO1FBQ2QsT0FBTyxFQUFFLENBQUMsU0FBUyxDQUFDO1FBQ3BCLE9BQU8sRUFBRSxDQUFDLGtCQUFrQixDQUFDO0tBQzlCLENBQUM7SUFDRixFQUFFLENBQUMsYUFBYSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUVoRSxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztJQUVyQyxJQUFJLE1BQU0sR0FBRyxFQUFFLENBQUM7SUFFaEIsb0VBQW9FO0lBQ3BFLE1BQU0sWUFBWSxHQUFHLGFBQWEsQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFO1FBQzlDLE9BQU8sRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDO0tBQzVELEVBQUU7UUFDRCxHQUFHLEVBQUUsT0FBTyxDQUFDLFlBQVk7UUFDekIsS0FBSyxFQUFFLElBQUk7UUFDWCxRQUFRLEVBQUUsSUFBSTtRQUNkLEdBQUcsRUFBRSxFQUFFLEdBQUcsT0FBTyxDQUFDLEdBQUcsRUFBRSxHQUFHLE9BQU8sQ0FBQyxXQUFXLEVBQUUsRUFBRTtLQUNsRCxDQUFDLENBQUM7SUFFSCxJQUFJLENBQUM7UUFDSCxZQUFZLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUN2QyxNQUFNLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQzFCLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDL0IsQ0FBQyxDQUFDLENBQUM7UUFDSCxZQUFZLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUN2QyxNQUFNLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQzFCLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDL0IsQ0FBQyxDQUFDLENBQUM7UUFFSCxNQUFNLElBQUEsNkJBQWEsRUFBQyxHQUFHLEVBQUUsQ0FBQyxNQUFNLEVBQUUsaUNBQWlDLENBQUMsQ0FBQztRQUNyRSxPQUFPLENBQUMsR0FBRyxDQUFDLHdCQUF3QixDQUFDLENBQUM7UUFFdEMsTUFBTSxJQUFBLDZCQUFhLEVBQUMsR0FBRyxFQUFFLENBQUMsTUFBTSxFQUFFLGlCQUFpQixDQUFDLENBQUM7UUFDckQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDO1FBRTlDLGtEQUFrRDtRQUNsRCxNQUFNLGlCQUFpQixHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQztRQUUxRSxrRUFBa0U7UUFDbEUsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLCtCQUErQixDQUFDLENBQUM7UUFDdEYsRUFBRSxDQUFDLGFBQWEsQ0FBQyxZQUFZLEVBQUUsK0JBQStCLENBQUMsQ0FBQztRQUNoRSxPQUFPLENBQUMsR0FBRyxDQUFDLHNEQUFzRCxDQUFDLENBQUM7UUFFcEUsZ0VBQWdFO1FBQ2hFLE1BQU0sSUFBQSxXQUFLLEVBQUMsSUFBSSxDQUFDLENBQUM7UUFFbEIsNERBQTREO1FBQzVELE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDOUYsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRXJDLDJDQUEyQztRQUMzQyxNQUFNLGdCQUFnQixHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQztRQUN6RSxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUVqRCxPQUFPLENBQUMsR0FBRyxDQUFDLHlDQUF5QyxDQUFDLENBQUM7UUFFdkQsOERBQThEO1FBQzlELEVBQUUsQ0FBQyxhQUFhLENBQUMsV0FBVyxFQUFFLCtCQUErQixDQUFDLENBQUM7UUFFL0QsTUFBTSxJQUFBLDZCQUFhLEVBQUMsR0FBRyxFQUFFLENBQUMsTUFBTSxFQUFFLG9CQUFvQixDQUFDLENBQUM7UUFDeEQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxpREFBaUQsQ0FBQyxDQUFDO0lBQ2pFLENBQUM7WUFBUyxDQUFDO1FBQ1QsK0NBQStDO1FBQy9DLElBQUksWUFBWSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ3JCLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQzdDLENBQUM7SUFDSCxDQUFDO0FBQ0gsQ0FBQyxDQUFDLENBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGNoaWxkX3Byb2Nlc3MgZnJvbSAnY2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgKiBhcyBmcyBmcm9tICdmcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgd2FpdEZvck91dHB1dCB9IGZyb20gJy4vd2F0Y2gtaGVscGVycyc7XG5pbXBvcnQgeyBpbnRlZ1Rlc3QsIHdpdGhEZWZhdWx0Rml4dHVyZSwgc2xlZXAgfSBmcm9tICcuLi8uLi8uLi9saWInO1xuXG5qZXN0LnNldFRpbWVvdXQoMyAqIDYwICogMTAwMCk7IC8vIDMgbWludXRlcyBmb3Igd2F0Y2ggdGVzdHNcblxuaW50ZWdUZXN0KFxuICAnY2RrIHdhdGNoIGRvZXMgTk9UIGRldGVjdCBmaWxlIGNoYW5nZXMgZm9yIGV4Y2x1ZGVkIHBhdHRlcm5zJyxcbiAgd2l0aERlZmF1bHRGaXh0dXJlKGFzeW5jIChmaXh0dXJlKSA9PiB7XG4gICAgLy8gQ3JlYXRlIGEgdGVzdCBmaWxlIHRoYXQgd2lsbCBiZSB3YXRjaGVkIChmb3IgaW5pdGlhbCBkZXBsb3kpXG4gICAgY29uc3Qgd2F0Y2hlZEZpbGUgPSBwYXRoLmpvaW4oZml4dHVyZS5pbnRlZ1Rlc3REaXIsICd3YXRjaGVkLWZpbGUudHMnKTtcbiAgICBmcy53cml0ZUZpbGVTeW5jKHdhdGNoZWRGaWxlLCAnZXhwb3J0IGNvbnN0IGluaXRpYWwgPSB0cnVlOycpO1xuXG4gICAgLy8gVXBkYXRlIGNkay5qc29uIHRvIGluY2x1ZGUgd2F0Y2ggY29uZmlndXJhdGlvbiB3aXRoIHNwZWNpZmljIGV4Y2x1ZGVcbiAgICBjb25zdCBjZGtKc29uUGF0aCA9IHBhdGguam9pbihmaXh0dXJlLmludGVnVGVzdERpciwgJ2Nkay5qc29uJyk7XG4gICAgY29uc3QgY2RrSnNvbiA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKGNka0pzb25QYXRoLCAndXRmLTgnKSk7XG4gICAgY2RrSnNvbi53YXRjaCA9IHtcbiAgICAgIGluY2x1ZGU6IFsnKiovKi50cyddLFxuICAgICAgZXhjbHVkZTogWycqKi8qLmV4Y2x1ZGVkLnRzJ10sXG4gICAgfTtcbiAgICBmcy53cml0ZUZpbGVTeW5jKGNka0pzb25QYXRoLCBKU09OLnN0cmluZ2lmeShjZGtKc29uLCBudWxsLCAyKSk7XG5cbiAgICBhd2FpdCBmaXh0dXJlLmNsaS5tYWtlQ2xpQXZhaWxhYmxlKCk7XG5cbiAgICBsZXQgb3V0cHV0ID0gJyc7XG5cbiAgICAvLyBTdGFydCBjZGsgd2F0Y2ggd2l0aCBkZXRhY2hlZCBwcm9jZXNzIGdyb3VwIGZvciBjbGVhbiB0ZXJtaW5hdGlvblxuICAgIGNvbnN0IHdhdGNoUHJvY2VzcyA9IGNoaWxkX3Byb2Nlc3Muc3Bhd24oJ2NkaycsIFtcbiAgICAgICd3YXRjaCcsICctLWhvdHN3YXAnLCAnLXYnLCBmaXh0dXJlLmZ1bGxTdGFja05hbWUoJ3Rlc3QtMScpLFxuICAgIF0sIHtcbiAgICAgIGN3ZDogZml4dHVyZS5pbnRlZ1Rlc3REaXIsXG4gICAgICBzaGVsbDogdHJ1ZSxcbiAgICAgIGRldGFjaGVkOiB0cnVlLFxuICAgICAgZW52OiB7IC4uLnByb2Nlc3MuZW52LCAuLi5maXh0dXJlLmNka1NoZWxsRW52KCkgfSxcbiAgICB9KTtcblxuICAgIHRyeSB7XG4gICAgICB3YXRjaFByb2Nlc3Muc3Rkb3V0Py5vbignZGF0YScsIChkYXRhKSA9PiB7XG4gICAgICAgIG91dHB1dCArPSBkYXRhLnRvU3RyaW5nKCk7XG4gICAgICAgIGZpeHR1cmUubG9nKGRhdGEudG9TdHJpbmcoKSk7XG4gICAgICB9KTtcbiAgICAgIHdhdGNoUHJvY2Vzcy5zdGRlcnI/Lm9uKCdkYXRhJywgKGRhdGEpID0+IHtcbiAgICAgICAgb3V0cHV0ICs9IGRhdGEudG9TdHJpbmcoKTtcbiAgICAgICAgZml4dHVyZS5sb2coZGF0YS50b1N0cmluZygpKTtcbiAgICAgIH0pO1xuXG4gICAgICBhd2FpdCB3YWl0Rm9yT3V0cHV0KCgpID0+IG91dHB1dCwgXCJUcmlnZ2VyaW5nIGluaXRpYWwgJ2NkayBkZXBsb3knXCIpO1xuICAgICAgZml4dHVyZS5sb2coJ+KckyBXYXRjaCBzdGFydCBkZXRlY3RlZCcpO1xuXG4gICAgICBhd2FpdCB3YWl0Rm9yT3V0cHV0KCgpID0+IG91dHB1dCwgJ2RlcGxveW1lbnQgdGltZScpO1xuICAgICAgZml4dHVyZS5sb2coJ+KckyBJbml0aWFsIGRlcGxveW1lbnQgY29tcGxldGVkJyk7XG5cbiAgICAgIC8vIENvdW50IGRlcGxveW1lbnRzIGJlZm9yZSBjcmVhdGluZyBleGNsdWRlZCBmaWxlXG4gICAgICBjb25zdCBkZXBsb3ltZW50c0JlZm9yZSA9IChvdXRwdXQubWF0Y2goL2RlcGxveW1lbnQgdGltZS9nKSB8fCBbXSkubGVuZ3RoO1xuXG4gICAgICAvLyBDcmVhdGUgYW4gZXhjbHVkZWQgZmlsZSAtIHRoaXMgc2hvdWxkIE5PVCB0cmlnZ2VyIGEgd2F0Y2ggZXZlbnRcbiAgICAgIGNvbnN0IGV4Y2x1ZGVkRmlsZSA9IHBhdGguam9pbihmaXh0dXJlLmludGVnVGVzdERpciwgJ3Nob3VsZC1iZS1pZ25vcmVkLmV4Y2x1ZGVkLnRzJyk7XG4gICAgICBmcy53cml0ZUZpbGVTeW5jKGV4Y2x1ZGVkRmlsZSwgJ2V4cG9ydCBjb25zdCBleGNsdWRlZCA9IHRydWU7Jyk7XG4gICAgICBmaXh0dXJlLmxvZygnQ3JlYXRlZCBleGNsdWRlZCBmaWxlOiBzaG91bGQtYmUtaWdub3JlZC5leGNsdWRlZC50cycpO1xuXG4gICAgICAvLyBXYWl0IGEgcmVhc29uYWJsZSB0aW1lIGZvciBhbnkgcG90ZW50aWFsICh1bndhbnRlZCkgZGV0ZWN0aW9uXG4gICAgICBhd2FpdCBzbGVlcCg1MDAwKTtcblxuICAgICAgLy8gVmVyaWZ5IG5vIFwiRGV0ZWN0ZWQgY2hhbmdlXCIgbWVzc2FnZSBmb3IgdGhlIGV4Y2x1ZGVkIGZpbGVcbiAgICAgIGNvbnN0IGRldGVjdGVkRXhjbHVkZWQgPSBvdXRwdXQuaW5jbHVkZXMoJ0RldGVjdGVkIGNoYW5nZSB0bycpICYmIG91dHB1dC5pbmNsdWRlcygnZXhjbHVkZWQnKTtcbiAgICAgIGV4cGVjdChkZXRlY3RlZEV4Y2x1ZGVkKS50b0JlKGZhbHNlKTtcblxuICAgICAgLy8gVmVyaWZ5IGRlcGxveW1lbnQgY291bnQgaGFzbid0IGluY3JlYXNlZFxuICAgICAgY29uc3QgZGVwbG95bWVudHNBZnRlciA9IChvdXRwdXQubWF0Y2goL2RlcGxveW1lbnQgdGltZS9nKSB8fCBbXSkubGVuZ3RoO1xuICAgICAgZXhwZWN0KGRlcGxveW1lbnRzQWZ0ZXIpLnRvQmUoZGVwbG95bWVudHNCZWZvcmUpO1xuXG4gICAgICBmaXh0dXJlLmxvZygn4pyTIFdhdGNoIGNvcnJlY3RseSBpZ25vcmVkIGV4Y2x1ZGVkIGZpbGUnKTtcblxuICAgICAgLy8gTm93IG1vZGlmeSBhIHdhdGNoZWQgZmlsZSB0byBjb25maXJtIHdhdGNoIGlzIHN0aWxsIHdvcmtpbmdcbiAgICAgIGZzLndyaXRlRmlsZVN5bmMod2F0Y2hlZEZpbGUsICdleHBvcnQgY29uc3QgbW9kaWZpZWQgPSB0cnVlOycpO1xuXG4gICAgICBhd2FpdCB3YWl0Rm9yT3V0cHV0KCgpID0+IG91dHB1dCwgJ0RldGVjdGVkIGNoYW5nZSB0bycpO1xuICAgICAgZml4dHVyZS5sb2coJ+KckyBXYXRjaCBzdGlsbCBkZXRlY3RzIGNoYW5nZXMgdG8gaW5jbHVkZWQgZmlsZXMnKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgLy8gS2lsbCB0aGUgZW50aXJlIHByb2Nlc3MgZ3JvdXAgKG5lZ2F0aXZlIFBJRClcbiAgICAgIGlmICh3YXRjaFByb2Nlc3MucGlkKSB7XG4gICAgICAgIHByb2Nlc3Mua2lsbCgtd2F0Y2hQcm9jZXNzLnBpZCwgJ1NJR1RFUk0nKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pLFxuKTtcbiJdfQ==
@@ -0,0 +1,59 @@
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
+ detached: true,
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
+ // Kill the entire process group (negative PID)
54
+ if (watchProcess.pid) {
55
+ process.kill(-watchProcess.pid, 'SIGTERM');
56
+ }
57
+ }
58
+ }));
59
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2RrLXdhdGNoLWRldGVjdHMtZmlsZS1jaGFuZ2VzLXdpdGgtZ2xvYi1wYXR0ZXJucy5pbnRlZ3Rlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJjZGstd2F0Y2gtZGV0ZWN0cy1maWxlLWNoYW5nZXMtd2l0aC1nbG9iLXBhdHRlcm5zLmludGVndGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLCtDQUErQztBQUMvQyx5QkFBeUI7QUFDekIsNkJBQTZCO0FBQzdCLG1EQUFrRTtBQUNsRSxzQ0FBNkQ7QUFFN0QsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsNEJBQTRCO0FBRTVELElBQUEsZUFBUyxFQUNQLG1EQUFtRCxFQUNuRCxJQUFBLHdCQUFrQixFQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsRUFBRTtJQUNuQywwQ0FBMEM7SUFDMUMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLG9CQUFvQixDQUFDLENBQUM7SUFDdkUsRUFBRSxDQUFDLGFBQWEsQ0FBQyxRQUFRLEVBQUUsOEJBQThCLENBQUMsQ0FBQztJQUUzRCxpREFBaUQ7SUFDakQsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ2hFLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxXQUFXLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUNsRSxPQUFPLENBQUMsS0FBSyxHQUFHO1FBQ2QsT0FBTyxFQUFFLENBQUMsU0FBUyxDQUFDO0tBQ3JCLENBQUM7SUFDRixFQUFFLENBQUMsYUFBYSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUVoRSxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztJQUVyQyxJQUFJLE1BQU0sR0FBRyxFQUFFLENBQUM7SUFFaEIsb0VBQW9FO0lBQ3BFLE1BQU0sWUFBWSxHQUFHLGFBQWEsQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFO1FBQzlDLE9BQU8sRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDO0tBQzVELEVBQUU7UUFDRCxHQUFHLEVBQUUsT0FBTyxDQUFDLFlBQVk7UUFDekIsS0FBSyxFQUFFLElBQUk7UUFDWCxRQUFRLEVBQUUsSUFBSTtRQUNkLEdBQUcsRUFBRSxFQUFFLEdBQUcsT0FBTyxDQUFDLEdBQUcsRUFBRSxHQUFHLE9BQU8sQ0FBQyxXQUFXLEVBQUUsRUFBRTtLQUNsRCxDQUFDLENBQUM7SUFFSCxJQUFJLENBQUM7UUFDSCxZQUFZLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUN2QyxNQUFNLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQzFCLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDL0IsQ0FBQyxDQUFDLENBQUM7UUFDSCxZQUFZLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUN2QyxNQUFNLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQzFCLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDL0IsQ0FBQyxDQUFDLENBQUM7UUFFSCxNQUFNLElBQUEsNkJBQWEsRUFBQyxHQUFHLEVBQUUsQ0FBQyxNQUFNLEVBQUUsaUNBQWlDLENBQUMsQ0FBQztRQUNyRSxPQUFPLENBQUMsR0FBRyxDQUFDLHdCQUF3QixDQUFDLENBQUM7UUFFdEMsTUFBTSxJQUFBLDZCQUFhLEVBQUMsR0FBRyxFQUFFLENBQUMsTUFBTSxFQUFFLGlCQUFpQixDQUFDLENBQUM7UUFDckQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDO1FBRTlDLDBEQUEwRDtRQUMxRCxhQUFhLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7UUFFekMsTUFBTSxJQUFBLDZCQUFhLEVBQUMsR0FBRyxFQUFFLENBQUMsTUFBTSxFQUFFLG9CQUFvQixDQUFDLENBQUM7UUFDeEQsT0FBTyxDQUFDLEdBQUcsQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO1FBRTVDLGtGQUFrRjtRQUNsRixNQUFNLElBQUEsZ0NBQWdCLEVBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLGtCQUFrQixDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ25GLE9BQU8sQ0FBQyxHQUFHLENBQUMsK0JBQStCLENBQUMsQ0FBQztJQUMvQyxDQUFDO1lBQVMsQ0FBQztRQUNULCtDQUErQztRQUMvQyxJQUFJLFlBQVksQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNyQixPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsWUFBWSxDQUFDLEdBQUcsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUM3QyxDQUFDO0lBQ0gsQ0FBQztBQUNILENBQUMsQ0FBQyxDQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBjaGlsZF9wcm9jZXNzIGZyb20gJ2NoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IHdhaXRGb3JPdXRwdXQsIHdhaXRGb3JDb25kaXRpb24gfSBmcm9tICcuL3dhdGNoLWhlbHBlcnMnO1xuaW1wb3J0IHsgaW50ZWdUZXN0LCB3aXRoRGVmYXVsdEZpeHR1cmUgfSBmcm9tICcuLi8uLi8uLi9saWInO1xuXG5qZXN0LnNldFRpbWVvdXQoMyAqIDYwICogMTAwMCk7IC8vIDMgbWludXRlcyBmb3Igd2F0Y2ggdGVzdHNcblxuaW50ZWdUZXN0KFxuICAnY2RrIHdhdGNoIGRldGVjdHMgZmlsZSBjaGFuZ2VzIHdpdGggZ2xvYiBwYXR0ZXJucycsXG4gIHdpdGhEZWZhdWx0Rml4dHVyZShhc3luYyAoZml4dHVyZSkgPT4ge1xuICAgIC8vIENyZWF0ZSBhIHRlc3QgZmlsZSB0aGF0IHdpbGwgYmUgd2F0Y2hlZFxuICAgIGNvbnN0IHRlc3RGaWxlID0gcGF0aC5qb2luKGZpeHR1cmUuaW50ZWdUZXN0RGlyLCAnd2F0Y2gtdGVzdC1maWxlLnRzJyk7XG4gICAgZnMud3JpdGVGaWxlU3luYyh0ZXN0RmlsZSwgJ2V4cG9ydCBjb25zdCBpbml0aWFsID0gdHJ1ZTsnKTtcblxuICAgIC8vIFVwZGF0ZSBjZGsuanNvbiB0byBpbmNsdWRlIHdhdGNoIGNvbmZpZ3VyYXRpb25cbiAgICBjb25zdCBjZGtKc29uUGF0aCA9IHBhdGguam9pbihmaXh0dXJlLmludGVnVGVzdERpciwgJ2Nkay5qc29uJyk7XG4gICAgY29uc3QgY2RrSnNvbiA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKGNka0pzb25QYXRoLCAndXRmLTgnKSk7XG4gICAgY2RrSnNvbi53YXRjaCA9IHtcbiAgICAgIGluY2x1ZGU6IFsnKiovKi50cyddLFxuICAgIH07XG4gICAgZnMud3JpdGVGaWxlU3luYyhjZGtKc29uUGF0aCwgSlNPTi5zdHJpbmdpZnkoY2RrSnNvbiwgbnVsbCwgMikpO1xuXG4gICAgYXdhaXQgZml4dHVyZS5jbGkubWFrZUNsaUF2YWlsYWJsZSgpO1xuXG4gICAgbGV0IG91dHB1dCA9ICcnO1xuXG4gICAgLy8gU3RhcnQgY2RrIHdhdGNoIHdpdGggZGV0YWNoZWQgcHJvY2VzcyBncm91cCBmb3IgY2xlYW4gdGVybWluYXRpb25cbiAgICBjb25zdCB3YXRjaFByb2Nlc3MgPSBjaGlsZF9wcm9jZXNzLnNwYXduKCdjZGsnLCBbXG4gICAgICAnd2F0Y2gnLCAnLS1ob3Rzd2FwJywgJy12JywgZml4dHVyZS5mdWxsU3RhY2tOYW1lKCd0ZXN0LTEnKSxcbiAgICBdLCB7XG4gICAgICBjd2Q6IGZpeHR1cmUuaW50ZWdUZXN0RGlyLFxuICAgICAgc2hlbGw6IHRydWUsXG4gICAgICBkZXRhY2hlZDogdHJ1ZSxcbiAgICAgIGVudjogeyAuLi5wcm9jZXNzLmVudiwgLi4uZml4dHVyZS5jZGtTaGVsbEVudigpIH0sXG4gICAgfSk7XG5cbiAgICB0cnkge1xuICAgICAgd2F0Y2hQcm9jZXNzLnN0ZG91dD8ub24oJ2RhdGEnLCAoZGF0YSkgPT4ge1xuICAgICAgICBvdXRwdXQgKz0gZGF0YS50b1N0cmluZygpO1xuICAgICAgICBmaXh0dXJlLmxvZyhkYXRhLnRvU3RyaW5nKCkpO1xuICAgICAgfSk7XG4gICAgICB3YXRjaFByb2Nlc3Muc3RkZXJyPy5vbignZGF0YScsIChkYXRhKSA9PiB7XG4gICAgICAgIG91dHB1dCArPSBkYXRhLnRvU3RyaW5nKCk7XG4gICAgICAgIGZpeHR1cmUubG9nKGRhdGEudG9TdHJpbmcoKSk7XG4gICAgICB9KTtcblxuICAgICAgYXdhaXQgd2FpdEZvck91dHB1dCgoKSA9PiBvdXRwdXQsIFwiVHJpZ2dlcmluZyBpbml0aWFsICdjZGsgZGVwbG95J1wiKTtcbiAgICAgIGZpeHR1cmUubG9nKCfinJMgV2F0Y2ggc3RhcnQgZGV0ZWN0ZWQnKTtcblxuICAgICAgYXdhaXQgd2FpdEZvck91dHB1dCgoKSA9PiBvdXRwdXQsICdkZXBsb3ltZW50IHRpbWUnKTtcbiAgICAgIGZpeHR1cmUubG9nKCfinJMgSW5pdGlhbCBkZXBsb3ltZW50IGNvbXBsZXRlZCcpO1xuXG4gICAgICAvLyBVcGRhdGUgdGhlIHRlc3QgZmlsZSB0aW1lc3RhbXAgdG8gdHJpZ2dlciBhIHdhdGNoIGV2ZW50XG4gICAgICBjaGlsZF9wcm9jZXNzLnNwYXduKCd0b3VjaCcsIFt0ZXN0RmlsZV0pO1xuXG4gICAgICBhd2FpdCB3YWl0Rm9yT3V0cHV0KCgpID0+IG91dHB1dCwgJ0RldGVjdGVkIGNoYW5nZSB0bycpO1xuICAgICAgZml4dHVyZS5sb2coJ+KckyBXYXRjaCBkZXRlY3RlZCBmaWxlIGNoYW5nZScpO1xuXG4gICAgICAvLyBXYWl0IGZvciB0aGUgc2Vjb25kIGRlcGxveW1lbnQgdG8gY29tcGxldGUgKDIgb2NjdXJyZW5jZXMgb2YgJ2RlcGxveW1lbnQgdGltZScpXG4gICAgICBhd2FpdCB3YWl0Rm9yQ29uZGl0aW9uKCgpID0+IChvdXRwdXQubWF0Y2goL2RlcGxveW1lbnQgdGltZS9nKSB8fCBbXSkubGVuZ3RoID49IDIpO1xuICAgICAgZml4dHVyZS5sb2coJ+KckyBTZWNvbmQgZGVwbG95bWVudCBjb21wbGV0ZWQnKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgLy8gS2lsbCB0aGUgZW50aXJlIHByb2Nlc3MgZ3JvdXAgKG5lZ2F0aXZlIFBJRClcbiAgICAgIGlmICh3YXRjaFByb2Nlc3MucGlkKSB7XG4gICAgICAgIHByb2Nlc3Mua2lsbCgtd2F0Y2hQcm9jZXNzLnBpZCwgJ1NJR1RFUk0nKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pLFxuKTtcbiJdfQ==
@@ -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>;
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ /**
3
+ * Shared helper functions for watch integration tests.
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.waitForOutput = waitForOutput;
7
+ exports.waitForCondition = waitForCondition;
8
+ /**
9
+ * Poll a condition until we see it.
10
+ */
11
+ async function poll(condition) {
12
+ return new Promise((resolve) => {
13
+ const check = () => {
14
+ if (condition())
15
+ return resolve();
16
+ setTimeout(check, 1000);
17
+ };
18
+ check();
19
+ });
20
+ }
21
+ /**
22
+ * Wait for a specific string to appear in the output.
23
+ */
24
+ async function waitForOutput(getOutput, searchString) {
25
+ return poll(() => getOutput().includes(searchString));
26
+ }
27
+ /**
28
+ * Wait for a condition to become true.
29
+ */
30
+ async function waitForCondition(condition) {
31
+ return poll(condition);
32
+ }
33
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2F0Y2gtaGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIndhdGNoLWhlbHBlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOztHQUVHOztBQWtCSCxzQ0FFQztBQUtELDRDQUVDO0FBekJEOztHQUVHO0FBQ0gsS0FBSyxVQUFVLElBQUksQ0FBQyxTQUF3QjtJQUMxQyxPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUU7UUFDN0IsTUFBTSxLQUFLLEdBQUcsR0FBRyxFQUFFO1lBQ2pCLElBQUksU0FBUyxFQUFFO2dCQUFFLE9BQU8sT0FBTyxFQUFFLENBQUM7WUFDbEMsVUFBVSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztRQUMxQixDQUFDLENBQUM7UUFDRixLQUFLLEVBQUUsQ0FBQztJQUNWLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVEOztHQUVHO0FBQ0ksS0FBSyxVQUFVLGFBQWEsQ0FBQyxTQUF1QixFQUFFLFlBQW9CO0lBQy9FLE9BQU8sSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDO0FBQ3hELENBQUM7QUFFRDs7R0FFRztBQUNJLEtBQUssVUFBVSxnQkFBZ0IsQ0FBQyxTQUF3QjtJQUM3RCxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUN6QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBTaGFyZWQgaGVscGVyIGZ1bmN0aW9ucyBmb3Igd2F0Y2ggaW50ZWdyYXRpb24gdGVzdHMuXG4gKi9cblxuLyoqXG4gKiBQb2xsIGEgY29uZGl0aW9uIHVudGlsIHdlIHNlZSBpdC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcG9sbChjb25kaXRpb246ICgpID0+IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgY29uc3QgY2hlY2sgPSAoKSA9PiB7XG4gICAgICBpZiAoY29uZGl0aW9uKCkpIHJldHVybiByZXNvbHZlKCk7XG4gICAgICBzZXRUaW1lb3V0KGNoZWNrLCAxMDAwKTtcbiAgICB9O1xuICAgIGNoZWNrKCk7XG4gIH0pO1xufVxuXG4vKipcbiAqIFdhaXQgZm9yIGEgc3BlY2lmaWMgc3RyaW5nIHRvIGFwcGVhciBpbiB0aGUgb3V0cHV0LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd2FpdEZvck91dHB1dChnZXRPdXRwdXQ6ICgpID0+IHN0cmluZywgc2VhcmNoU3RyaW5nOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIHBvbGwoKCkgPT4gZ2V0T3V0cHV0KCkuaW5jbHVkZXMoc2VhcmNoU3RyaW5nKSk7XG59XG5cbi8qKlxuICogV2FpdCBmb3IgYSBjb25kaXRpb24gdG8gYmVjb21lIHRydWUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB3YWl0Rm9yQ29uZGl0aW9uKGNvbmRpdGlvbjogKCkgPT4gYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gcG9sbChjb25kaXRpb24pO1xufVxuIl19
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ /* eslint-disable import/no-extraneous-dependencies */
4
+ const toolkit = require("@aws-cdk/toolkit-lib");
5
+ const toolkit_helpers_1 = require("./toolkit-helpers");
6
+ const lib_1 = require("../../lib");
7
+ jest.setTimeout(2 * 60 * 60_000); // Includes the time to acquire locks, worst-case single-threaded runtime
8
+ (0, lib_1.integTest)('toolkit deploy stack with multiple docker assets', (0, lib_1.withDefaultFixture)(async (fixture) => {
9
+ const tk = (0, toolkit_helpers_1.toolkitFromFixture)(fixture);
10
+ const assembly = await (0, toolkit_helpers_1.assemblyFromCdkAppDir)(tk, fixture);
11
+ const stacks = {
12
+ strategy: toolkit.StackSelectionStrategy.PATTERN_MUST_MATCH_SINGLE,
13
+ patterns: [fixture.fullStackName('multiple-docker-assets')],
14
+ };
15
+ await tk.deploy(assembly, {
16
+ stacks,
17
+ assetParallelism: true,
18
+ assetBuildConcurrency: 3,
19
+ });
20
+ await tk.destroy(assembly, { stacks });
21
+ }));
22
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbGtpdC1kZXBsb3ktc3RhY2std2l0aC1tdWx0aXBsZS1kb2NrZXItYXNzZXRzLmludGVndGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInRvb2xraXQtZGVwbG95LXN0YWNrLXdpdGgtbXVsdGlwbGUtZG9ja2VyLWFzc2V0cy5pbnRlZ3Rlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxzREFBc0Q7QUFDdEQsZ0RBQWdEO0FBQ2hELHVEQUE4RTtBQUM5RSxtQ0FBMEQ7QUFFMUQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMseUVBQXlFO0FBRTNHLElBQUEsZUFBUyxFQUNQLGtEQUFrRCxFQUNsRCxJQUFBLHdCQUFrQixFQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsRUFBRTtJQUNuQyxNQUFNLEVBQUUsR0FBRyxJQUFBLG9DQUFrQixFQUFDLE9BQU8sQ0FBQyxDQUFDO0lBRXZDLE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBQSx1Q0FBcUIsRUFBQyxFQUFFLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFFMUQsTUFBTSxNQUFNLEdBQTBCO1FBQ3BDLFFBQVEsRUFBRSxPQUFPLENBQUMsc0JBQXNCLENBQUMseUJBQXlCO1FBQ2xFLFFBQVEsRUFBRSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsd0JBQXdCLENBQUMsQ0FBQztLQUM1RCxDQUFDO0lBRUYsTUFBTSxFQUFFLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRTtRQUN4QixNQUFNO1FBQ04sZ0JBQWdCLEVBQUUsSUFBSTtRQUN0QixxQkFBcUIsRUFBRSxDQUFDO0tBQ3pCLENBQUMsQ0FBQztJQUNILE1BQU0sRUFBRSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO0FBQ3pDLENBQUMsQ0FBQyxDQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBpbXBvcnQvbm8tZXh0cmFuZW91cy1kZXBlbmRlbmNpZXMgKi9cbmltcG9ydCAqIGFzIHRvb2xraXQgZnJvbSAnQGF3cy1jZGsvdG9vbGtpdC1saWInO1xuaW1wb3J0IHsgYXNzZW1ibHlGcm9tQ2RrQXBwRGlyLCB0b29sa2l0RnJvbUZpeHR1cmUgfSBmcm9tICcuL3Rvb2xraXQtaGVscGVycyc7XG5pbXBvcnQgeyBpbnRlZ1Rlc3QsIHdpdGhEZWZhdWx0Rml4dHVyZSB9IGZyb20gJy4uLy4uL2xpYic7XG5cbmplc3Quc2V0VGltZW91dCgyICogNjAgKiA2MF8wMDApOyAvLyBJbmNsdWRlcyB0aGUgdGltZSB0byBhY3F1aXJlIGxvY2tzLCB3b3JzdC1jYXNlIHNpbmdsZS10aHJlYWRlZCBydW50aW1lXG5cbmludGVnVGVzdChcbiAgJ3Rvb2xraXQgZGVwbG95IHN0YWNrIHdpdGggbXVsdGlwbGUgZG9ja2VyIGFzc2V0cycsXG4gIHdpdGhEZWZhdWx0Rml4dHVyZShhc3luYyAoZml4dHVyZSkgPT4ge1xuICAgIGNvbnN0IHRrID0gdG9vbGtpdEZyb21GaXh0dXJlKGZpeHR1cmUpO1xuXG4gICAgY29uc3QgYXNzZW1ibHkgPSBhd2FpdCBhc3NlbWJseUZyb21DZGtBcHBEaXIodGssIGZpeHR1cmUpO1xuXG4gICAgY29uc3Qgc3RhY2tzOiB0b29sa2l0LlN0YWNrU2VsZWN0b3IgPSB7XG4gICAgICBzdHJhdGVneTogdG9vbGtpdC5TdGFja1NlbGVjdGlvblN0cmF0ZWd5LlBBVFRFUk5fTVVTVF9NQVRDSF9TSU5HTEUsXG4gICAgICBwYXR0ZXJuczogW2ZpeHR1cmUuZnVsbFN0YWNrTmFtZSgnbXVsdGlwbGUtZG9ja2VyLWFzc2V0cycpXSxcbiAgICB9O1xuXG4gICAgYXdhaXQgdGsuZGVwbG95KGFzc2VtYmx5LCB7XG4gICAgICBzdGFja3MsXG4gICAgICBhc3NldFBhcmFsbGVsaXNtOiB0cnVlLFxuICAgICAgYXNzZXRCdWlsZENvbmN1cnJlbmN5OiAzLFxuICAgIH0pO1xuICAgIGF3YWl0IHRrLmRlc3Ryb3koYXNzZW1ibHksIHsgc3RhY2tzIH0pO1xuICB9KSxcbik7XG4iXX0=
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ /* eslint-disable import/no-extraneous-dependencies */
4
+ const toolkit = require("@aws-cdk/toolkit-lib");
5
+ const toolkit_helpers_1 = require("./toolkit-helpers");
6
+ const lib_1 = require("../../lib");
7
+ /**
8
+ * Integration test for toolkit-lib watch with glob pattern matching.
9
+ *
10
+ * These tests verify that the chokidar v4 glob pattern fix does not
11
+ * detects file changes on files that are excluded via config.
12
+ */
13
+ (0, lib_1.integTest)('toolkit watch excludes node_modules and dotfiles by default', (0, lib_1.withDefaultFixture)(async (fixture) => {
14
+ const tk = (0, toolkit_helpers_1.toolkitFromFixture)(fixture);
15
+ const assembly = await (0, toolkit_helpers_1.assemblyFromCdkAppDir)(tk, fixture);
16
+ // Track the exclude patterns that were configured
17
+ const configMessages = [];
18
+ // Create a custom IoHost to capture configuration messages
19
+ const customTk = new toolkit.Toolkit({
20
+ ioHost: {
21
+ notify: async (msg) => {
22
+ if (msg.code === 'CDK_TOOLKIT_I5310') {
23
+ configMessages.push(msg.message);
24
+ }
25
+ },
26
+ requestResponse: async () => undefined,
27
+ },
28
+ });
29
+ // Start watching with default exclude patterns
30
+ const watcher = await customTk.watch(assembly, {
31
+ include: ['**'],
32
+ watchDir: fixture.integTestDir,
33
+ deploymentMethod: { method: 'hotswap' },
34
+ });
35
+ try {
36
+ // Wait for initialization
37
+ await new Promise(resolve => setTimeout(resolve, 500));
38
+ // Verify that default excludes are applied
39
+ const configMsg = configMessages.find(m => m.includes("'exclude' patterns"));
40
+ expect(configMsg).toBeDefined();
41
+ // Check that default excludes are present
42
+ expect(configMsg).toContain('node_modules');
43
+ expect(configMsg).toContain('.*');
44
+ fixture.log('✓ Toolkit watch applies default exclude patterns correctly');
45
+ fixture.log(` Config: ${configMsg.substring(0, 200)}...`);
46
+ }
47
+ finally {
48
+ await watcher.dispose();
49
+ await new Promise(resolve => setTimeout(resolve, 1000)); // Allow async operations to complete
50
+ }
51
+ }));
52
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbGtpdC13YXRjaC1nbG9iLW5lZ2F0aXZlLmludGVndGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInRvb2xraXQtd2F0Y2gtZ2xvYi1uZWdhdGl2ZS5pbnRlZ3Rlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxzREFBc0Q7QUFDdEQsZ0RBQWdEO0FBQ2hELHVEQUE4RTtBQUM5RSxtQ0FBMEQ7QUFFMUQ7Ozs7O0dBS0c7QUFFSCxJQUFBLGVBQVMsRUFDUCw2REFBNkQsRUFDN0QsSUFBQSx3QkFBa0IsRUFBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLEVBQUU7SUFDbkMsTUFBTSxFQUFFLEdBQUcsSUFBQSxvQ0FBa0IsRUFBQyxPQUFPLENBQUMsQ0FBQztJQUN2QyxNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUEsdUNBQXFCLEVBQUMsRUFBRSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBRTFELGtEQUFrRDtJQUNsRCxNQUFNLGNBQWMsR0FBYSxFQUFFLENBQUM7SUFFcEMsMkRBQTJEO0lBQzNELE1BQU0sUUFBUSxHQUFHLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQztRQUNuQyxNQUFNLEVBQUU7WUFDTixNQUFNLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxFQUFFO2dCQUNwQixJQUFJLEdBQUcsQ0FBQyxJQUFJLEtBQUssbUJBQW1CLEVBQUUsQ0FBQztvQkFDckMsY0FBYyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQ25DLENBQUM7WUFDSCxDQUFDO1lBQ0QsZUFBZSxFQUFFLEtBQUssSUFBbUIsRUFBRSxDQUFDLFNBQXlCO1NBQ3RFO0tBQ0YsQ0FBQyxDQUFDO0lBRUgsK0NBQStDO0lBQy9DLE1BQU0sT0FBTyxHQUFHLE1BQU0sUUFBUSxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUU7UUFDN0MsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDO1FBQ2YsUUFBUSxFQUFFLE9BQU8sQ0FBQyxZQUFZO1FBQzlCLGdCQUFnQixFQUFFLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRTtLQUN4QyxDQUFDLENBQUM7SUFFSCxJQUFJLENBQUM7UUFDSCwwQkFBMEI7UUFDMUIsTUFBTSxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUV2RCwyQ0FBMkM7UUFDM0MsTUFBTSxTQUFTLEdBQUcsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDO1FBQzdFLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUVoQywwQ0FBMEM7UUFDMUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUM1QyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRWxDLE9BQU8sQ0FBQyxHQUFHLENBQUMsNERBQTRELENBQUMsQ0FBQztRQUMxRSxPQUFPLENBQUMsR0FBRyxDQUFDLGFBQWEsU0FBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzlELENBQUM7WUFBUyxDQUFDO1FBQ1QsTUFBTSxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDeEIsTUFBTSxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLHFDQUFxQztJQUNoRyxDQUFDO0FBQ0gsQ0FBQyxDQUFDLENBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIGltcG9ydC9uby1leHRyYW5lb3VzLWRlcGVuZGVuY2llcyAqL1xuaW1wb3J0ICogYXMgdG9vbGtpdCBmcm9tICdAYXdzLWNkay90b29sa2l0LWxpYic7XG5pbXBvcnQgeyBhc3NlbWJseUZyb21DZGtBcHBEaXIsIHRvb2xraXRGcm9tRml4dHVyZSB9IGZyb20gJy4vdG9vbGtpdC1oZWxwZXJzJztcbmltcG9ydCB7IGludGVnVGVzdCwgd2l0aERlZmF1bHRGaXh0dXJlIH0gZnJvbSAnLi4vLi4vbGliJztcblxuLyoqXG4gKiBJbnRlZ3JhdGlvbiB0ZXN0IGZvciB0b29sa2l0LWxpYiB3YXRjaCB3aXRoIGdsb2IgcGF0dGVybiBtYXRjaGluZy5cbiAqXG4gKiBUaGVzZSB0ZXN0cyB2ZXJpZnkgdGhhdCB0aGUgY2hva2lkYXIgdjQgZ2xvYiBwYXR0ZXJuIGZpeCBkb2VzIG5vdFxuICogZGV0ZWN0cyBmaWxlIGNoYW5nZXMgb24gZmlsZXMgdGhhdCBhcmUgZXhjbHVkZWQgdmlhIGNvbmZpZy5cbiAqL1xuXG5pbnRlZ1Rlc3QoXG4gICd0b29sa2l0IHdhdGNoIGV4Y2x1ZGVzIG5vZGVfbW9kdWxlcyBhbmQgZG90ZmlsZXMgYnkgZGVmYXVsdCcsXG4gIHdpdGhEZWZhdWx0Rml4dHVyZShhc3luYyAoZml4dHVyZSkgPT4ge1xuICAgIGNvbnN0IHRrID0gdG9vbGtpdEZyb21GaXh0dXJlKGZpeHR1cmUpO1xuICAgIGNvbnN0IGFzc2VtYmx5ID0gYXdhaXQgYXNzZW1ibHlGcm9tQ2RrQXBwRGlyKHRrLCBmaXh0dXJlKTtcblxuICAgIC8vIFRyYWNrIHRoZSBleGNsdWRlIHBhdHRlcm5zIHRoYXQgd2VyZSBjb25maWd1cmVkXG4gICAgY29uc3QgY29uZmlnTWVzc2FnZXM6IHN0cmluZ1tdID0gW107XG5cbiAgICAvLyBDcmVhdGUgYSBjdXN0b20gSW9Ib3N0IHRvIGNhcHR1cmUgY29uZmlndXJhdGlvbiBtZXNzYWdlc1xuICAgIGNvbnN0IGN1c3RvbVRrID0gbmV3IHRvb2xraXQuVG9vbGtpdCh7XG4gICAgICBpb0hvc3Q6IHtcbiAgICAgICAgbm90aWZ5OiBhc3luYyAobXNnKSA9PiB7XG4gICAgICAgICAgaWYgKG1zZy5jb2RlID09PSAnQ0RLX1RPT0xLSVRfSTUzMTAnKSB7XG4gICAgICAgICAgICBjb25maWdNZXNzYWdlcy5wdXNoKG1zZy5tZXNzYWdlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHJlcXVlc3RSZXNwb25zZTogYXN5bmMgPFQ+KCk6IFByb21pc2U8VD4gPT4gdW5kZWZpbmVkIGFzIHVua25vd24gYXMgVCxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICAvLyBTdGFydCB3YXRjaGluZyB3aXRoIGRlZmF1bHQgZXhjbHVkZSBwYXR0ZXJuc1xuICAgIGNvbnN0IHdhdGNoZXIgPSBhd2FpdCBjdXN0b21Uay53YXRjaChhc3NlbWJseSwge1xuICAgICAgaW5jbHVkZTogWycqKiddLFxuICAgICAgd2F0Y2hEaXI6IGZpeHR1cmUuaW50ZWdUZXN0RGlyLFxuICAgICAgZGVwbG95bWVudE1ldGhvZDogeyBtZXRob2Q6ICdob3Rzd2FwJyB9LFxuICAgIH0pO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIFdhaXQgZm9yIGluaXRpYWxpemF0aW9uXG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgNTAwKSk7XG5cbiAgICAgIC8vIFZlcmlmeSB0aGF0IGRlZmF1bHQgZXhjbHVkZXMgYXJlIGFwcGxpZWRcbiAgICAgIGNvbnN0IGNvbmZpZ01zZyA9IGNvbmZpZ01lc3NhZ2VzLmZpbmQobSA9PiBtLmluY2x1ZGVzKFwiJ2V4Y2x1ZGUnIHBhdHRlcm5zXCIpKTtcbiAgICAgIGV4cGVjdChjb25maWdNc2cpLnRvQmVEZWZpbmVkKCk7XG5cbiAgICAgIC8vIENoZWNrIHRoYXQgZGVmYXVsdCBleGNsdWRlcyBhcmUgcHJlc2VudFxuICAgICAgZXhwZWN0KGNvbmZpZ01zZykudG9Db250YWluKCdub2RlX21vZHVsZXMnKTtcbiAgICAgIGV4cGVjdChjb25maWdNc2cpLnRvQ29udGFpbignLionKTtcblxuICAgICAgZml4dHVyZS5sb2coJ+KckyBUb29sa2l0IHdhdGNoIGFwcGxpZXMgZGVmYXVsdCBleGNsdWRlIHBhdHRlcm5zIGNvcnJlY3RseScpO1xuICAgICAgZml4dHVyZS5sb2coYCAgQ29uZmlnOiAke2NvbmZpZ01zZyEuc3Vic3RyaW5nKDAsIDIwMCl9Li4uYCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IHdhdGNoZXIuZGlzcG9zZSgpO1xuICAgICAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIDEwMDApKTsgLy8gQWxsb3cgYXN5bmMgb3BlcmF0aW9ucyB0byBjb21wbGV0ZVxuICAgIH1cbiAgfSksXG4pO1xuIl19
@@ -0,0 +1,68 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ /* eslint-disable import/no-extraneous-dependencies */
4
+ const fs = require("fs");
5
+ const path = require("path");
6
+ const toolkit = require("@aws-cdk/toolkit-lib");
7
+ const toolkit_helpers_1 = require("./toolkit-helpers");
8
+ const lib_1 = require("../../lib");
9
+ /**
10
+ * Integration test for toolkit-lib watch with glob pattern matching.
11
+ *
12
+ * These tests verify that the chokidar v4 glob pattern fix detects file changes.
13
+ */
14
+ (0, lib_1.integTest)('toolkit watch detects file changes with glob patterns', (0, lib_1.withDefaultFixture)(async (fixture) => {
15
+ const tk = (0, toolkit_helpers_1.toolkitFromFixture)(fixture);
16
+ const assembly = await (0, toolkit_helpers_1.assemblyFromCdkAppDir)(tk, fixture);
17
+ // Track events received from the watcher
18
+ const receivedEvents = [];
19
+ // Create a custom IoHost to capture watch events
20
+ const customTk = new toolkit.Toolkit({
21
+ ioHost: {
22
+ notify: async (msg) => {
23
+ receivedEvents.push({ code: msg.code, message: msg.message });
24
+ },
25
+ requestResponse: async () => undefined,
26
+ },
27
+ });
28
+ // Create a test file in the watch directory
29
+ const testFile = path.join(fixture.integTestDir, 'watch-test-file.ts');
30
+ // Start watching with specific include patterns
31
+ const watcher = await customTk.watch(assembly, {
32
+ include: ['**/*.ts'],
33
+ exclude: ['**/node_modules/**', '**/*.test.ts'],
34
+ watchDir: fixture.integTestDir,
35
+ // Use a deployment method that won't actually deploy (we just want to test file watching)
36
+ deploymentMethod: { method: 'hotswap' },
37
+ });
38
+ try {
39
+ // Wait a bit for the watcher to initialize
40
+ await (0, lib_1.sleep)(1000);
41
+ // Create a new .ts file - this should be detected
42
+ fs.writeFileSync(testFile, 'export const watchTest = true;');
43
+ // Wait for the file change to be detected
44
+ await (0, lib_1.sleep)(2000);
45
+ // Verify that the watcher detected the file
46
+ const observingEvents = receivedEvents.filter(e => e.code === 'CDK_TOOLKIT_I5311' || // observing file
47
+ e.code === 'CDK_TOOLKIT_I5312' || // detected change
48
+ e.code === 'CDK_TOOLKIT_I5314');
49
+ fixture.log(`Received ${observingEvents.length} watch-related events`);
50
+ for (const event of observingEvents) {
51
+ fixture.log(` ${event.code}: ${event.message.substring(0, 100)}...`);
52
+ }
53
+ // The watcher should have received the ready event and started observing
54
+ const hasReadyOrObserving = receivedEvents.some(e => e.code === 'CDK_TOOLKIT_I5314' || // triggering initial deploy
55
+ e.code === 'CDK_TOOLKIT_I5311');
56
+ expect(hasReadyOrObserving).toBe(true);
57
+ fixture.log('✓ Toolkit watch successfully initialized and detected files');
58
+ }
59
+ finally {
60
+ // Clean up - dispose and wait for async operations to settle
61
+ await watcher.dispose();
62
+ await (0, lib_1.sleep)(1000); // Allow async operations to complete
63
+ if (fs.existsSync(testFile)) {
64
+ fs.unlinkSync(testFile);
65
+ }
66
+ }
67
+ }));
68
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbGtpdC13YXRjaC1nbG9iLmludGVndGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInRvb2xraXQtd2F0Y2gtZ2xvYi5pbnRlZ3Rlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxzREFBc0Q7QUFDdEQseUJBQXlCO0FBQ3pCLDZCQUE2QjtBQUM3QixnREFBZ0Q7QUFDaEQsdURBQThFO0FBQzlFLG1DQUFpRTtBQUVqRTs7OztHQUlHO0FBRUgsSUFBQSxlQUFTLEVBQ1AsdURBQXVELEVBQ3ZELElBQUEsd0JBQWtCLEVBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxFQUFFO0lBQ25DLE1BQU0sRUFBRSxHQUFHLElBQUEsb0NBQWtCLEVBQUMsT0FBTyxDQUFDLENBQUM7SUFDdkMsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFBLHVDQUFxQixFQUFDLEVBQUUsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUUxRCx5Q0FBeUM7SUFDekMsTUFBTSxjQUFjLEdBQXlELEVBQUUsQ0FBQztJQUVoRixpREFBaUQ7SUFDakQsTUFBTSxRQUFRLEdBQUcsSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDO1FBQ25DLE1BQU0sRUFBRTtZQUNOLE1BQU0sRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUU7Z0JBQ3BCLGNBQWMsQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsR0FBRyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7WUFDaEUsQ0FBQztZQUNELGVBQWUsRUFBRSxLQUFLLElBQW1CLEVBQUUsQ0FBQyxTQUF5QjtTQUN0RTtLQUNGLENBQUMsQ0FBQztJQUVILDRDQUE0QztJQUM1QyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUUsb0JBQW9CLENBQUMsQ0FBQztJQUV2RSxnREFBZ0Q7SUFDaEQsTUFBTSxPQUFPLEdBQUcsTUFBTSxRQUFRLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRTtRQUM3QyxPQUFPLEVBQUUsQ0FBQyxTQUFTLENBQUM7UUFDcEIsT0FBTyxFQUFFLENBQUMsb0JBQW9CLEVBQUUsY0FBYyxDQUFDO1FBQy9DLFFBQVEsRUFBRSxPQUFPLENBQUMsWUFBWTtRQUM5QiwwRkFBMEY7UUFDMUYsZ0JBQWdCLEVBQUUsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFO0tBQ3hDLENBQUMsQ0FBQztJQUVILElBQUksQ0FBQztRQUNILDJDQUEyQztRQUMzQyxNQUFNLElBQUEsV0FBSyxFQUFDLElBQUksQ0FBQyxDQUFDO1FBRWxCLGtEQUFrRDtRQUNsRCxFQUFFLENBQUMsYUFBYSxDQUFDLFFBQVEsRUFBRSxnQ0FBZ0MsQ0FBQyxDQUFDO1FBRTdELDBDQUEwQztRQUMxQyxNQUFNLElBQUEsV0FBSyxFQUFDLElBQUksQ0FBQyxDQUFDO1FBRWxCLDRDQUE0QztRQUM1QyxNQUFNLGVBQWUsR0FBRyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQ2hELENBQUMsQ0FBQyxJQUFJLEtBQUssbUJBQW1CLElBQUksaUJBQWlCO1lBQ25ELENBQUMsQ0FBQyxJQUFJLEtBQUssbUJBQW1CLElBQUksa0JBQWtCO1lBQ3BELENBQUMsQ0FBQyxJQUFJLEtBQUssbUJBQW1CLENBQy9CLENBQUM7UUFFRixPQUFPLENBQUMsR0FBRyxDQUFDLFlBQVksZUFBZSxDQUFDLE1BQU0sdUJBQXVCLENBQUMsQ0FBQztRQUN2RSxLQUFLLE1BQU0sS0FBSyxJQUFJLGVBQWUsRUFBRSxDQUFDO1lBQ3BDLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxLQUFLLENBQUMsSUFBSSxLQUFLLEtBQUssQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDeEUsQ0FBQztRQUVELHlFQUF5RTtRQUN6RSxNQUFNLG1CQUFtQixHQUFHLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FDbEQsQ0FBQyxDQUFDLElBQUksS0FBSyxtQkFBbUIsSUFBSSw0QkFBNEI7WUFDOUQsQ0FBQyxDQUFDLElBQUksS0FBSyxtQkFBbUIsQ0FDL0IsQ0FBQztRQUNGLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUV2QyxPQUFPLENBQUMsR0FBRyxDQUFDLDZEQUE2RCxDQUFDLENBQUM7SUFDN0UsQ0FBQztZQUFTLENBQUM7UUFDVCw2REFBNkQ7UUFDN0QsTUFBTSxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDeEIsTUFBTSxJQUFBLFdBQUssRUFBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLHFDQUFxQztRQUN4RCxJQUFJLEVBQUUsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztZQUM1QixFQUFFLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzFCLENBQUM7SUFDSCxDQUFDO0FBQ0gsQ0FBQyxDQUFDLENBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIGltcG9ydC9uby1leHRyYW5lb3VzLWRlcGVuZGVuY2llcyAqL1xuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCAqIGFzIHRvb2xraXQgZnJvbSAnQGF3cy1jZGsvdG9vbGtpdC1saWInO1xuaW1wb3J0IHsgYXNzZW1ibHlGcm9tQ2RrQXBwRGlyLCB0b29sa2l0RnJvbUZpeHR1cmUgfSBmcm9tICcuL3Rvb2xraXQtaGVscGVycyc7XG5pbXBvcnQgeyBpbnRlZ1Rlc3QsIHdpdGhEZWZhdWx0Rml4dHVyZSwgc2xlZXAgfSBmcm9tICcuLi8uLi9saWInO1xuXG4vKipcbiAqIEludGVncmF0aW9uIHRlc3QgZm9yIHRvb2xraXQtbGliIHdhdGNoIHdpdGggZ2xvYiBwYXR0ZXJuIG1hdGNoaW5nLlxuICpcbiAqIFRoZXNlIHRlc3RzIHZlcmlmeSB0aGF0IHRoZSBjaG9raWRhciB2NCBnbG9iIHBhdHRlcm4gZml4IGRldGVjdHMgZmlsZSBjaGFuZ2VzLlxuICovXG5cbmludGVnVGVzdChcbiAgJ3Rvb2xraXQgd2F0Y2ggZGV0ZWN0cyBmaWxlIGNoYW5nZXMgd2l0aCBnbG9iIHBhdHRlcm5zJyxcbiAgd2l0aERlZmF1bHRGaXh0dXJlKGFzeW5jIChmaXh0dXJlKSA9PiB7XG4gICAgY29uc3QgdGsgPSB0b29sa2l0RnJvbUZpeHR1cmUoZml4dHVyZSk7XG4gICAgY29uc3QgYXNzZW1ibHkgPSBhd2FpdCBhc3NlbWJseUZyb21DZGtBcHBEaXIodGssIGZpeHR1cmUpO1xuXG4gICAgLy8gVHJhY2sgZXZlbnRzIHJlY2VpdmVkIGZyb20gdGhlIHdhdGNoZXJcbiAgICBjb25zdCByZWNlaXZlZEV2ZW50czogQXJyYXk8eyBjb2RlOiBzdHJpbmcgfCB1bmRlZmluZWQ7IG1lc3NhZ2U6IHN0cmluZyB9PiA9IFtdO1xuXG4gICAgLy8gQ3JlYXRlIGEgY3VzdG9tIElvSG9zdCB0byBjYXB0dXJlIHdhdGNoIGV2ZW50c1xuICAgIGNvbnN0IGN1c3RvbVRrID0gbmV3IHRvb2xraXQuVG9vbGtpdCh7XG4gICAgICBpb0hvc3Q6IHtcbiAgICAgICAgbm90aWZ5OiBhc3luYyAobXNnKSA9PiB7XG4gICAgICAgICAgcmVjZWl2ZWRFdmVudHMucHVzaCh7IGNvZGU6IG1zZy5jb2RlLCBtZXNzYWdlOiBtc2cubWVzc2FnZSB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgcmVxdWVzdFJlc3BvbnNlOiBhc3luYyA8VD4oKTogUHJvbWlzZTxUPiA9PiB1bmRlZmluZWQgYXMgdW5rbm93biBhcyBULFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIC8vIENyZWF0ZSBhIHRlc3QgZmlsZSBpbiB0aGUgd2F0Y2ggZGlyZWN0b3J5XG4gICAgY29uc3QgdGVzdEZpbGUgPSBwYXRoLmpvaW4oZml4dHVyZS5pbnRlZ1Rlc3REaXIsICd3YXRjaC10ZXN0LWZpbGUudHMnKTtcblxuICAgIC8vIFN0YXJ0IHdhdGNoaW5nIHdpdGggc3BlY2lmaWMgaW5jbHVkZSBwYXR0ZXJuc1xuICAgIGNvbnN0IHdhdGNoZXIgPSBhd2FpdCBjdXN0b21Uay53YXRjaChhc3NlbWJseSwge1xuICAgICAgaW5jbHVkZTogWycqKi8qLnRzJ10sXG4gICAgICBleGNsdWRlOiBbJyoqL25vZGVfbW9kdWxlcy8qKicsICcqKi8qLnRlc3QudHMnXSxcbiAgICAgIHdhdGNoRGlyOiBmaXh0dXJlLmludGVnVGVzdERpcixcbiAgICAgIC8vIFVzZSBhIGRlcGxveW1lbnQgbWV0aG9kIHRoYXQgd29uJ3QgYWN0dWFsbHkgZGVwbG95ICh3ZSBqdXN0IHdhbnQgdG8gdGVzdCBmaWxlIHdhdGNoaW5nKVxuICAgICAgZGVwbG95bWVudE1ldGhvZDogeyBtZXRob2Q6ICdob3Rzd2FwJyB9LFxuICAgIH0pO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIFdhaXQgYSBiaXQgZm9yIHRoZSB3YXRjaGVyIHRvIGluaXRpYWxpemVcbiAgICAgIGF3YWl0IHNsZWVwKDEwMDApO1xuXG4gICAgICAvLyBDcmVhdGUgYSBuZXcgLnRzIGZpbGUgLSB0aGlzIHNob3VsZCBiZSBkZXRlY3RlZFxuICAgICAgZnMud3JpdGVGaWxlU3luYyh0ZXN0RmlsZSwgJ2V4cG9ydCBjb25zdCB3YXRjaFRlc3QgPSB0cnVlOycpO1xuXG4gICAgICAvLyBXYWl0IGZvciB0aGUgZmlsZSBjaGFuZ2UgdG8gYmUgZGV0ZWN0ZWRcbiAgICAgIGF3YWl0IHNsZWVwKDIwMDApO1xuXG4gICAgICAvLyBWZXJpZnkgdGhhdCB0aGUgd2F0Y2hlciBkZXRlY3RlZCB0aGUgZmlsZVxuICAgICAgY29uc3Qgb2JzZXJ2aW5nRXZlbnRzID0gcmVjZWl2ZWRFdmVudHMuZmlsdGVyKGUgPT5cbiAgICAgICAgZS5jb2RlID09PSAnQ0RLX1RPT0xLSVRfSTUzMTEnIHx8IC8vIG9ic2VydmluZyBmaWxlXG4gICAgICAgIGUuY29kZSA9PT0gJ0NES19UT09MS0lUX0k1MzEyJyB8fCAvLyBkZXRlY3RlZCBjaGFuZ2VcbiAgICAgICAgZS5jb2RlID09PSAnQ0RLX1RPT0xLSVRfSTUzMTQnLCAvLyB0cmlnZ2VyaW5nIGRlcGxveVxuICAgICAgKTtcblxuICAgICAgZml4dHVyZS5sb2coYFJlY2VpdmVkICR7b2JzZXJ2aW5nRXZlbnRzLmxlbmd0aH0gd2F0Y2gtcmVsYXRlZCBldmVudHNgKTtcbiAgICAgIGZvciAoY29uc3QgZXZlbnQgb2Ygb2JzZXJ2aW5nRXZlbnRzKSB7XG4gICAgICAgIGZpeHR1cmUubG9nKGAgICR7ZXZlbnQuY29kZX06ICR7ZXZlbnQubWVzc2FnZS5zdWJzdHJpbmcoMCwgMTAwKX0uLi5gKTtcbiAgICAgIH1cblxuICAgICAgLy8gVGhlIHdhdGNoZXIgc2hvdWxkIGhhdmUgcmVjZWl2ZWQgdGhlIHJlYWR5IGV2ZW50IGFuZCBzdGFydGVkIG9ic2VydmluZ1xuICAgICAgY29uc3QgaGFzUmVhZHlPck9ic2VydmluZyA9IHJlY2VpdmVkRXZlbnRzLnNvbWUoZSA9PlxuICAgICAgICBlLmNvZGUgPT09ICdDREtfVE9PTEtJVF9JNTMxNCcgfHwgLy8gdHJpZ2dlcmluZyBpbml0aWFsIGRlcGxveVxuICAgICAgICBlLmNvZGUgPT09ICdDREtfVE9PTEtJVF9JNTMxMScsIC8vIG9ic2VydmluZyBmaWxlc1xuICAgICAgKTtcbiAgICAgIGV4cGVjdChoYXNSZWFkeU9yT2JzZXJ2aW5nKS50b0JlKHRydWUpO1xuXG4gICAgICBmaXh0dXJlLmxvZygn4pyTIFRvb2xraXQgd2F0Y2ggc3VjY2Vzc2Z1bGx5IGluaXRpYWxpemVkIGFuZCBkZXRlY3RlZCBmaWxlcycpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICAvLyBDbGVhbiB1cCAtIGRpc3Bvc2UgYW5kIHdhaXQgZm9yIGFzeW5jIG9wZXJhdGlvbnMgdG8gc2V0dGxlXG4gICAgICBhd2FpdCB3YXRjaGVyLmRpc3Bvc2UoKTtcbiAgICAgIGF3YWl0IHNsZWVwKDEwMDApOyAvLyBBbGxvdyBhc3luYyBvcGVyYXRpb25zIHRvIGNvbXBsZXRlXG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyh0ZXN0RmlsZSkpIHtcbiAgICAgICAgZnMudW5saW5rU3luYyh0ZXN0RmlsZSk7XG4gICAgICB9XG4gICAgfVxuICB9KSxcbik7XG4iXX0=