@aws-cdk-testing/cli-integ 2.173.4 → 3.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (97) hide show
  1. package/.eslintrc.js +9 -0
  2. package/LICENSE +2 -1
  3. package/bin/query-github +1 -1
  4. package/bin/query-github.js +3 -3
  5. package/bin/query-github.ts +56 -0
  6. package/bin/run-suite +1 -1
  7. package/bin/run-suite.js +3 -3
  8. package/bin/run-suite.ts +140 -0
  9. package/bin/stage-distribution +1 -1
  10. package/bin/stage-distribution.js +3 -2
  11. package/bin/stage-distribution.ts +267 -0
  12. package/bin/test-root +1 -1
  13. package/bin/test-root.ts +3 -0
  14. package/lib/aws.js +9 -6
  15. package/lib/aws.ts +263 -0
  16. package/lib/cli/query-github.d.ts +1 -0
  17. package/lib/cli/query-github.js +54 -0
  18. package/lib/cli/query-github.ts +56 -0
  19. package/lib/cli/run-suite.d.ts +1 -0
  20. package/lib/cli/run-suite.js +131 -0
  21. package/lib/cli/run-suite.ts +140 -0
  22. package/lib/cli/stage-distribution.d.ts +1 -0
  23. package/lib/cli/stage-distribution.js +217 -0
  24. package/lib/cli/stage-distribution.ts +267 -0
  25. package/lib/cli/test-root.d.ts +1 -0
  26. package/lib/cli/test-root.js +6 -0
  27. package/lib/cli/test-root.ts +3 -0
  28. package/lib/corking.ts +33 -0
  29. package/lib/eventually.js +3 -3
  30. package/lib/eventually.ts +42 -0
  31. package/lib/files.js +3 -2
  32. package/lib/files.ts +80 -0
  33. package/lib/github.js +6 -5
  34. package/lib/github.ts +43 -0
  35. package/lib/index.ts +13 -0
  36. package/lib/integ-test.ts +81 -0
  37. package/lib/lists.ts +9 -0
  38. package/lib/memoize.ts +14 -0
  39. package/lib/npm.ts +41 -0
  40. package/lib/package-sources/release-source.js +3 -2
  41. package/lib/package-sources/release-source.ts +81 -0
  42. package/lib/package-sources/repo-source.ts +111 -0
  43. package/lib/package-sources/repo-tools/npm.js +5 -4
  44. package/lib/package-sources/repo-tools/npm.ts +48 -0
  45. package/lib/package-sources/source.ts +35 -0
  46. package/lib/package-sources/subprocess.ts +15 -0
  47. package/lib/resource-pool.js +2 -2
  48. package/lib/resource-pool.ts +140 -0
  49. package/lib/resources.ts +4 -0
  50. package/lib/shell.js +8 -5
  51. package/lib/shell.ts +168 -0
  52. package/lib/staging/codeartifact.js +11 -8
  53. package/lib/staging/codeartifact.ts +387 -0
  54. package/lib/staging/maven.js +5 -3
  55. package/lib/staging/maven.ts +95 -0
  56. package/lib/staging/npm.ts +62 -0
  57. package/lib/staging/nuget.ts +75 -0
  58. package/lib/staging/parallel-shell.js +2 -2
  59. package/lib/staging/parallel-shell.ts +51 -0
  60. package/lib/staging/pypi.ts +50 -0
  61. package/lib/staging/usage-dir.ts +99 -0
  62. package/lib/with-aws.js +3 -2
  63. package/lib/with-aws.ts +67 -0
  64. package/lib/with-cdk-app.js +23 -14
  65. package/lib/with-cdk-app.ts +742 -0
  66. package/lib/with-cli-lib.ts +134 -0
  67. package/lib/with-packages.ts +15 -0
  68. package/lib/with-sam.js +7 -4
  69. package/lib/with-sam.ts +288 -0
  70. package/lib/with-temporary-directory.ts +35 -0
  71. package/lib/with-timeout.ts +33 -0
  72. package/lib/xpmutex.js +2 -2
  73. package/lib/xpmutex.ts +218 -0
  74. package/package.json +86 -62
  75. package/resources/cloud-assemblies/0.36.0/cdk.out +1 -0
  76. package/resources/cloud-assemblies/1.10.0-lookup-default-vpc/cdk.out +1 -0
  77. package/resources/cloud-assemblies/1.10.0-request-azs/cdk.out +1 -0
  78. package/tests/cli-integ-tests/bootstrapping.integtest.js +22 -13
  79. package/tests/cli-integ-tests/bootstrapping.integtest.ts +493 -0
  80. package/tests/cli-integ-tests/cli-lib.integtest.js +3 -2
  81. package/tests/cli-integ-tests/cli-lib.integtest.ts +90 -0
  82. package/tests/cli-integ-tests/cli.integtest.js +76 -49
  83. package/tests/cli-integ-tests/cli.integtest.ts +2874 -0
  84. package/tests/cli-integ-tests/garbage-collection.integtest.js +2 -2
  85. package/tests/cli-integ-tests/garbage-collection.integtest.ts +392 -0
  86. package/tests/init-csharp/init-csharp.integtest.ts +15 -0
  87. package/tests/init-fsharp/init-fsharp.integtest.ts +15 -0
  88. package/tests/init-go/init-go.integtest.ts +23 -0
  89. package/tests/init-java/init-java.integtest.ts +14 -0
  90. package/tests/init-javascript/init-javascript.integtest.ts +59 -0
  91. package/tests/init-python/init-python.integtest.ts +20 -0
  92. package/tests/init-typescript-app/init-typescript-app.integtest.ts +66 -0
  93. package/tests/init-typescript-lib/init-typescript-lib.integtest.ts +13 -0
  94. package/tests/tool-integrations/amplify.integtest.ts +43 -0
  95. package/tests/tool-integrations/with-tool-context.ts +14 -0
  96. package/tests/uberpackage/uberpackage.integtest.ts +11 -0
  97. package/resources/cdk-apps/cfn-include-app/.gitignore +0 -1
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const yargs = require("yargs");
4
+ const github_1 = require("../github");
5
+ async function main() {
6
+ var _a;
7
+ const args = await yargs
8
+ .option('token', {
9
+ descripton: 'GitHub token (default: from environment GITHUB_TOKEN)',
10
+ alias: 't',
11
+ type: 'string',
12
+ requiresArg: true,
13
+ })
14
+ .command('last-release', 'Query the last release', cmd => cmd
15
+ .option('prior-to', {
16
+ description: 'Return the most recent release before the given version',
17
+ alias: 'p',
18
+ type: 'string',
19
+ requiresArg: true,
20
+ })
21
+ .option('major', {
22
+ description: 'Return the most recent release that matches',
23
+ alias: 'm',
24
+ type: 'string',
25
+ requiresArg: true,
26
+ }))
27
+ .demandCommand()
28
+ .help()
29
+ .showHelpOnFail(false)
30
+ .argv;
31
+ const command = args._[0];
32
+ const token = (_a = args.token) !== null && _a !== void 0 ? _a : process.env.GITHUB_TOKEN;
33
+ if (!token) {
34
+ throw new Error('Either pass --token or set GITHUB_TOKEN.');
35
+ }
36
+ switch (command) {
37
+ case 'last-release':
38
+ if (args['prior-to'] && args.major) {
39
+ throw new Error('Cannot pass both `--prior-to and --major at the same time');
40
+ }
41
+ // eslint-disable-next-line no-console
42
+ console.log(await (0, github_1.fetchPreviousVersion)(token, {
43
+ priorTo: args['prior-to'],
44
+ majorVersion: args.major,
45
+ }));
46
+ break;
47
+ }
48
+ }
49
+ main().catch(e => {
50
+ // eslint-disable-next-line no-console
51
+ console.error(e);
52
+ process.exitCode = 1;
53
+ });
54
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcnktZ2l0aHViLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsicXVlcnktZ2l0aHViLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsK0JBQStCO0FBQy9CLHNDQUFpRDtBQUVqRCxLQUFLLFVBQVUsSUFBSTs7SUFDakIsTUFBTSxJQUFJLEdBQUcsTUFBTSxLQUFLO1NBQ3JCLE1BQU0sQ0FBQyxPQUFPLEVBQUU7UUFDZixVQUFVLEVBQUUsdURBQXVEO1FBQ25FLEtBQUssRUFBRSxHQUFHO1FBQ1YsSUFBSSxFQUFFLFFBQVE7UUFDZCxXQUFXLEVBQUUsSUFBSTtLQUNsQixDQUFDO1NBQ0QsT0FBTyxDQUFDLGNBQWMsRUFBRSx3QkFBd0IsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUc7U0FDMUQsTUFBTSxDQUFDLFVBQVUsRUFBRTtRQUNsQixXQUFXLEVBQUUseURBQXlEO1FBQ3RFLEtBQUssRUFBRSxHQUFHO1FBQ1YsSUFBSSxFQUFFLFFBQVE7UUFDZCxXQUFXLEVBQUUsSUFBSTtLQUNsQixDQUFDO1NBQ0QsTUFBTSxDQUFDLE9BQU8sRUFBRTtRQUNmLFdBQVcsRUFBRSw2Q0FBNkM7UUFDMUQsS0FBSyxFQUFFLEdBQUc7UUFDVixJQUFJLEVBQUUsUUFBUTtRQUNkLFdBQVcsRUFBRSxJQUFJO0tBQ2xCLENBQUMsQ0FBQztTQUNKLGFBQWEsRUFBRTtTQUNmLElBQUksRUFBRTtTQUNOLGNBQWMsQ0FBQyxLQUFLLENBQUM7U0FDckIsSUFBSSxDQUFDO0lBRVIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUUxQixNQUFNLEtBQUssR0FBRyxNQUFBLElBQUksQ0FBQyxLQUFLLG1DQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDO0lBQ3JELElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNYLE1BQU0sSUFBSSxLQUFLLENBQUMsMENBQTBDLENBQUMsQ0FBQztJQUM5RCxDQUFDO0lBRUQsUUFBUSxPQUFPLEVBQUUsQ0FBQztRQUNoQixLQUFLLGNBQWM7WUFDakIsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUNuQyxNQUFNLElBQUksS0FBSyxDQUFDLDJEQUEyRCxDQUFDLENBQUM7WUFDL0UsQ0FBQztZQUVELHNDQUFzQztZQUN0QyxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sSUFBQSw2QkFBb0IsRUFBQyxLQUFLLEVBQUU7Z0JBQzVDLE9BQU8sRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDO2dCQUN6QixZQUFZLEVBQUUsSUFBSSxDQUFDLEtBQUs7YUFDekIsQ0FBQyxDQUFDLENBQUM7WUFDSixNQUFNO0lBQ1YsQ0FBQztBQUNILENBQUM7QUFFRCxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUU7SUFDZixzQ0FBc0M7SUFDdEMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNqQixPQUFPLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQztBQUN2QixDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIHlhcmdzIGZyb20gJ3lhcmdzJztcbmltcG9ydCB7IGZldGNoUHJldmlvdXNWZXJzaW9uIH0gZnJvbSAnLi4vZ2l0aHViJztcblxuYXN5bmMgZnVuY3Rpb24gbWFpbigpIHtcbiAgY29uc3QgYXJncyA9IGF3YWl0IHlhcmdzXG4gICAgLm9wdGlvbigndG9rZW4nLCB7XG4gICAgICBkZXNjcmlwdG9uOiAnR2l0SHViIHRva2VuIChkZWZhdWx0OiBmcm9tIGVudmlyb25tZW50IEdJVEhVQl9UT0tFTiknLFxuICAgICAgYWxpYXM6ICd0JyxcbiAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgcmVxdWlyZXNBcmc6IHRydWUsXG4gICAgfSlcbiAgICAuY29tbWFuZCgnbGFzdC1yZWxlYXNlJywgJ1F1ZXJ5IHRoZSBsYXN0IHJlbGVhc2UnLCBjbWQgPT4gY21kXG4gICAgICAub3B0aW9uKCdwcmlvci10bycsIHtcbiAgICAgICAgZGVzY3JpcHRpb246ICdSZXR1cm4gdGhlIG1vc3QgcmVjZW50IHJlbGVhc2UgYmVmb3JlIHRoZSBnaXZlbiB2ZXJzaW9uJyxcbiAgICAgICAgYWxpYXM6ICdwJyxcbiAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgIHJlcXVpcmVzQXJnOiB0cnVlLFxuICAgICAgfSlcbiAgICAgIC5vcHRpb24oJ21ham9yJywge1xuICAgICAgICBkZXNjcmlwdGlvbjogJ1JldHVybiB0aGUgbW9zdCByZWNlbnQgcmVsZWFzZSB0aGF0IG1hdGNoZXMnLFxuICAgICAgICBhbGlhczogJ20nLFxuICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgcmVxdWlyZXNBcmc6IHRydWUsXG4gICAgICB9KSlcbiAgICAuZGVtYW5kQ29tbWFuZCgpXG4gICAgLmhlbHAoKVxuICAgIC5zaG93SGVscE9uRmFpbChmYWxzZSlcbiAgICAuYXJndjtcblxuICBjb25zdCBjb21tYW5kID0gYXJncy5fWzBdO1xuXG4gIGNvbnN0IHRva2VuID0gYXJncy50b2tlbiA/PyBwcm9jZXNzLmVudi5HSVRIVUJfVE9LRU47XG4gIGlmICghdG9rZW4pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0VpdGhlciBwYXNzIC0tdG9rZW4gb3Igc2V0IEdJVEhVQl9UT0tFTi4nKTtcbiAgfVxuXG4gIHN3aXRjaCAoY29tbWFuZCkge1xuICAgIGNhc2UgJ2xhc3QtcmVsZWFzZSc6XG4gICAgICBpZiAoYXJnc1sncHJpb3ItdG8nXSAmJiBhcmdzLm1ham9yKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHBhc3MgYm90aCBgLS1wcmlvci10byBhbmQgLS1tYWpvciBhdCB0aGUgc2FtZSB0aW1lJyk7XG4gICAgICB9XG5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICBjb25zb2xlLmxvZyhhd2FpdCBmZXRjaFByZXZpb3VzVmVyc2lvbih0b2tlbiwge1xuICAgICAgICBwcmlvclRvOiBhcmdzWydwcmlvci10byddLFxuICAgICAgICBtYWpvclZlcnNpb246IGFyZ3MubWFqb3IsXG4gICAgICB9KSk7XG4gICAgICBicmVhaztcbiAgfVxufVxuXG5tYWluKCkuY2F0Y2goZSA9PiB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gIGNvbnNvbGUuZXJyb3IoZSk7XG4gIHByb2Nlc3MuZXhpdENvZGUgPSAxO1xufSk7XG4iXX0=
@@ -0,0 +1,56 @@
1
+ import * as yargs from 'yargs';
2
+ import { fetchPreviousVersion } from '../github';
3
+
4
+ async function main() {
5
+ const args = await yargs
6
+ .option('token', {
7
+ descripton: 'GitHub token (default: from environment GITHUB_TOKEN)',
8
+ alias: 't',
9
+ type: 'string',
10
+ requiresArg: true,
11
+ })
12
+ .command('last-release', 'Query the last release', cmd => cmd
13
+ .option('prior-to', {
14
+ description: 'Return the most recent release before the given version',
15
+ alias: 'p',
16
+ type: 'string',
17
+ requiresArg: true,
18
+ })
19
+ .option('major', {
20
+ description: 'Return the most recent release that matches',
21
+ alias: 'm',
22
+ type: 'string',
23
+ requiresArg: true,
24
+ }))
25
+ .demandCommand()
26
+ .help()
27
+ .showHelpOnFail(false)
28
+ .argv;
29
+
30
+ const command = args._[0];
31
+
32
+ const token = args.token ?? process.env.GITHUB_TOKEN;
33
+ if (!token) {
34
+ throw new Error('Either pass --token or set GITHUB_TOKEN.');
35
+ }
36
+
37
+ switch (command) {
38
+ case 'last-release':
39
+ if (args['prior-to'] && args.major) {
40
+ throw new Error('Cannot pass both `--prior-to and --major at the same time');
41
+ }
42
+
43
+ // eslint-disable-next-line no-console
44
+ console.log(await fetchPreviousVersion(token, {
45
+ priorTo: args['prior-to'],
46
+ majorVersion: args.major,
47
+ }));
48
+ break;
49
+ }
50
+ }
51
+
52
+ main().catch(e => {
53
+ // eslint-disable-next-line no-console
54
+ console.error(e);
55
+ process.exitCode = 1;
56
+ });
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,131 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ /* eslint-disable no-console */
4
+ const path = require("path");
5
+ const jest = require("jest");
6
+ const yargs = require("yargs");
7
+ const release_source_1 = require("../package-sources/release-source");
8
+ const repo_source_1 = require("../package-sources/repo-source");
9
+ const subprocess_1 = require("../package-sources/subprocess");
10
+ async function main() {
11
+ var _a;
12
+ const args = await yargs
13
+ .usage('$0 <SUITENAME>')
14
+ .positional('SUITENAME', {
15
+ descripton: 'Name of the test suite to run',
16
+ type: 'string',
17
+ demandOption: true,
18
+ })
19
+ .option('test', {
20
+ descripton: 'Test pattern to selectively run tests',
21
+ alias: 't',
22
+ type: 'string',
23
+ requiresArg: true,
24
+ })
25
+ .option('test-file', {
26
+ description: 'The specific test file to run',
27
+ type: 'string',
28
+ requiresArg: true,
29
+ })
30
+ .option('use-source', {
31
+ descripton: 'Use TypeScript packages from the given source repository (or "auto")',
32
+ alias: 's',
33
+ type: 'string',
34
+ requiresArg: true,
35
+ })
36
+ .option('use-cli-release', {
37
+ descripton: 'Run the current tests against the CLI at the given version',
38
+ alias: 'u',
39
+ type: 'string',
40
+ requiresArg: true,
41
+ })
42
+ .option('auto-source', {
43
+ alias: 'a',
44
+ description: 'Automatically find the source tree from the current working directory',
45
+ type: 'boolean',
46
+ requiresArg: false,
47
+ })
48
+ .option('runInBand', {
49
+ descripton: 'Run all tests in one Node process',
50
+ alias: 'i',
51
+ type: 'boolean',
52
+ })
53
+ .options('framework-version', {
54
+ description: 'Framework version to use, if different than the CLI version (not all suites respect this)',
55
+ alias: 'f',
56
+ type: 'string',
57
+ })
58
+ .options('verbose', {
59
+ alias: 'v',
60
+ description: 'Run in verbose mode',
61
+ type: 'boolean',
62
+ requiresArg: false,
63
+ })
64
+ .options('passWithNoTests', {
65
+ description: 'Allow passing if the test suite is not found (default true when IS_CANARY mode, false otherwise)',
66
+ type: 'boolean',
67
+ requiresArg: false,
68
+ })
69
+ .help()
70
+ .showHelpOnFail(false)
71
+ .argv;
72
+ const suiteName = args._[0];
73
+ if (!suiteName) {
74
+ throw new Error('Usage: run-suite <SUITENAME>');
75
+ }
76
+ let packageSource;
77
+ function usePackageSource(s) {
78
+ if (packageSource) {
79
+ throw new Error('Cannot specify two package sources');
80
+ }
81
+ packageSource = s;
82
+ }
83
+ if (args['use-source'] || args['auto-source']) {
84
+ if (args['framework-version']) {
85
+ throw new Error('Cannot use --framework-version with --use-source');
86
+ }
87
+ const root = args['use-source'] && args['use-source'] !== 'auto'
88
+ ? args['use-source']
89
+ : await (0, repo_source_1.autoFindRoot)();
90
+ usePackageSource(new repo_source_1.RepoPackageSourceSetup(root));
91
+ }
92
+ else if (args['use-cli-release']) {
93
+ usePackageSource(new release_source_1.ReleasePackageSourceSetup(args['use-cli-release'], args['framework-version']));
94
+ }
95
+ if (!packageSource) {
96
+ throw new Error('Specify either --use-source or --use-cli-release');
97
+ }
98
+ console.log(`Package source: ${packageSource.description}`);
99
+ console.log(`Test suite: ${suiteName}`);
100
+ await packageSource.prepare();
101
+ (0, subprocess_1.serializeForSubprocess)(packageSource);
102
+ if (args.verbose) {
103
+ process.env.VERBOSE = '1';
104
+ }
105
+ // Motivation behind this behavior: when adding a new test suite to the pipeline, because of the way our
106
+ // Pipeline package works, the suite would be added to the pipeline AND as a canary immediately. The canary
107
+ // would fail until the package was actually released, so for canaries we make an exception so that the initial
108
+ // canary would succeed even if the suite wasn't yet available. The fact that the suite is not optional in
109
+ // the pipeline protects us from typos.
110
+ const passWithNoTests = (_a = args.passWithNoTests) !== null && _a !== void 0 ? _a : !!process.env.IS_CANARY;
111
+ // Communicate with the config file (integ.jest.config.js)
112
+ process.env.TEST_SUITE_NAME = suiteName;
113
+ try {
114
+ await jest.run([
115
+ ...args.runInBand ? ['-i'] : [],
116
+ ...args.test ? ['-t', args.test] : [],
117
+ ...args.verbose ? ['--verbose'] : [],
118
+ ...passWithNoTests ? ['--passWithNoTests'] : [],
119
+ ...args['test-file'] ? [args['test-file']] : [],
120
+ ], path.resolve(__dirname, '..', '..', 'resources', 'integ.jest.config.js'));
121
+ }
122
+ finally {
123
+ await packageSource.cleanup();
124
+ }
125
+ }
126
+ main().catch(e => {
127
+ // eslint-disable-next-line no-console
128
+ console.error(e);
129
+ process.exitCode = 1;
130
+ });
131
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVuLXN1aXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsicnVuLXN1aXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsK0JBQStCO0FBQy9CLDZCQUE2QjtBQUM3Qiw2QkFBNkI7QUFDN0IsK0JBQStCO0FBQy9CLHNFQUE4RTtBQUM5RSxnRUFBc0Y7QUFFdEYsOERBQXVFO0FBRXZFLEtBQUssVUFBVSxJQUFJOztJQUNqQixNQUFNLElBQUksR0FBRyxNQUFNLEtBQUs7U0FDckIsS0FBSyxDQUFDLGdCQUFnQixDQUFDO1NBQ3ZCLFVBQVUsQ0FBQyxXQUFXLEVBQUU7UUFDdkIsVUFBVSxFQUFFLCtCQUErQjtRQUMzQyxJQUFJLEVBQUUsUUFBUTtRQUNkLFlBQVksRUFBRSxJQUFJO0tBQ25CLENBQUM7U0FDRCxNQUFNLENBQUMsTUFBTSxFQUFFO1FBQ2QsVUFBVSxFQUFFLHVDQUF1QztRQUNuRCxLQUFLLEVBQUUsR0FBRztRQUNWLElBQUksRUFBRSxRQUFRO1FBQ2QsV0FBVyxFQUFFLElBQUk7S0FDbEIsQ0FBQztTQUNELE1BQU0sQ0FBQyxXQUFXLEVBQUU7UUFDbkIsV0FBVyxFQUFFLCtCQUErQjtRQUM1QyxJQUFJLEVBQUUsUUFBUTtRQUNkLFdBQVcsRUFBRSxJQUFJO0tBQ2xCLENBQUM7U0FDRCxNQUFNLENBQUMsWUFBWSxFQUFFO1FBQ3BCLFVBQVUsRUFBRSxzRUFBc0U7UUFDbEYsS0FBSyxFQUFFLEdBQUc7UUFDVixJQUFJLEVBQUUsUUFBUTtRQUNkLFdBQVcsRUFBRSxJQUFJO0tBQ2xCLENBQUM7U0FDRCxNQUFNLENBQUMsaUJBQWlCLEVBQUU7UUFDekIsVUFBVSxFQUFFLDREQUE0RDtRQUN4RSxLQUFLLEVBQUUsR0FBRztRQUNWLElBQUksRUFBRSxRQUFRO1FBQ2QsV0FBVyxFQUFFLElBQUk7S0FDbEIsQ0FBQztTQUNELE1BQU0sQ0FBQyxhQUFhLEVBQUU7UUFDckIsS0FBSyxFQUFFLEdBQUc7UUFDVixXQUFXLEVBQUUsdUVB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Q0FBQyxDQUFDO0FBQ3ZCLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgbm8tY29uc29sZSAqL1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCAqIGFzIGplc3QgZnJvbSAnamVzdCc7XG5pbXBvcnQgKiBhcyB5YXJncyBmcm9tICd5YXJncyc7XG5pbXBvcnQgeyBSZWxlYXNlUGFja2FnZVNvdXJjZVNldHVwIH0gZnJvbSAnLi4vcGFja2FnZS1zb3VyY2VzL3JlbGVhc2Utc291cmNlJztcbmltcG9ydCB7IFJlcG9QYWNrYWdlU291cmNlU2V0dXAsIGF1dG9GaW5kUm9vdCB9IGZyb20gJy4uL3BhY2thZ2Utc291cmNlcy9yZXBvLXNvdXJjZSc7XG5pbXBvcnQgeyBJUGFja2FnZVNvdXJjZVNldHVwIH0gZnJvbSAnLi4vcGFja2FnZS1zb3VyY2VzL3NvdXJjZSc7XG5pbXBvcnQgeyBzZXJpYWxpemVGb3JTdWJwcm9jZXNzIH0gZnJvbSAnLi4vcGFja2FnZS1zb3VyY2VzL3N1YnByb2Nlc3MnO1xuXG5hc3luYyBmdW5jdGlvbiBtYWluKCkge1xuICBjb25zdCBhcmdzID0gYXdhaXQgeWFyZ3NcbiAgICAudXNhZ2UoJyQwIDxTVUlURU5BTUU+JylcbiAgICAucG9zaXRpb25hbCgnU1VJVEVOQU1FJywge1xuICAgICAgZGVzY3JpcHRvbjogJ05hbWUgb2YgdGhlIHRlc3Qgc3VpdGUgdG8gcnVuJyxcbiAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgZGVtYW5kT3B0aW9uOiB0cnVlLFxuICAgIH0pXG4gICAgLm9wdGlvbigndGVzdCcsIHtcbiAgICAgIGRlc2NyaXB0b246ICdUZXN0IHBhdHRlcm4gdG8gc2VsZWN0aXZlbHkgcnVuIHRlc3RzJyxcbiAgICAgIGFsaWFzOiAndCcsXG4gICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgIHJlcXVpcmVzQXJnOiB0cnVlLFxuICAgIH0pXG4gICAgLm9wdGlvbigndGVzdC1maWxlJywge1xuICAgICAgZGVzY3JpcHRpb246ICdUaGUgc3BlY2lmaWMgdGVzdCBmaWxlIHRvIHJ1bicsXG4gICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgIHJlcXVpcmVzQXJnOiB0cnVlLFxuICAgIH0pXG4gICAgLm9wdGlvbigndXNlLXNvdXJjZScsIHtcbiAgICAgIGRlc2NyaXB0b246ICdVc2UgVHlwZVNjcmlwdCBwYWNrYWdlcyBmcm9tIHRoZSBnaXZlbiBzb3VyY2UgcmVwb3NpdG9yeSAob3IgXCJhdXRvXCIpJyxcbiAgICAgIGFsaWFzOiAncycsXG4gICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgIHJlcXVpcmVzQXJnOiB0cnVlLFxuICAgIH0pXG4gICAgLm9wdGlvbigndXNlLWNsaS1yZWxlYXNlJywge1xuICAgICAgZGVzY3JpcHRvbjogJ1J1biB0aGUgY3VycmVudCB0ZXN0cyBhZ2FpbnN0IHRoZSBDTEkgYXQgdGhlIGdpdmVuIHZlcnNpb24nLFxuICAgICAgYWxpYXM6ICd1JyxcbiAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgcmVxdWlyZXNBcmc6IHRydWUsXG4gICAgfSlcbiAgICAub3B0aW9uKCdhdXRvLXNvdXJjZScsIHtcbiAgICAgIGFsaWFzOiAnYScsXG4gICAgICBkZXNjcmlwdGlvbjogJ0F1dG9tYXRpY2FsbHkgZmluZCB0aGUgc291cmNlIHRyZWUgZnJvbSB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeScsXG4gICAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgICByZXF1aXJlc0FyZzogZmFsc2UsXG4gICAgfSlcbiAgICAub3B0aW9uKCdydW5JbkJhbmQnLCB7XG4gICAgICBkZXNjcmlwdG9uOiAnUnVuIGFsbCB0ZXN0cyBpbiBvbmUgTm9kZSBwcm9jZXNzJyxcbiAgICAgIGFsaWFzOiAnaScsXG4gICAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgfSlcbiAgICAub3B0aW9ucygnZnJhbWV3b3JrLXZlcnNpb24nLCB7XG4gICAgICBkZXNjcmlwdGlvbjogJ0ZyYW1ld29yayB2ZXJzaW9uIHRvIHVzZSwgaWYgZGlmZmVyZW50IHRoYW4gdGhlIENMSSB2ZXJzaW9uIChub3QgYWxsIHN1aXRlcyByZXNwZWN0IHRoaXMpJyxcbiAgICAgIGFsaWFzOiAnZicsXG4gICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICB9KVxuICAgIC5vcHRpb25zKCd2ZXJib3NlJywge1xuICAgICAgYWxpYXM6ICd2JyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnUnVuIGluIHZlcmJvc2UgbW9kZScsXG4gICAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgICByZXF1aXJlc0FyZzogZmFsc2UsXG4gICAgfSlcbiAgICAub3B0aW9ucygncGFzc1dpdGhOb1Rlc3RzJywge1xuICAgICAgZGVzY3JpcHRpb246ICdBbGxvdyBwYXNzaW5nIGlmIHRoZSB0ZXN0IHN1aXRlIGlzIG5vdCBmb3VuZCAoZGVmYXVsdCB0cnVlIHdoZW4gSVNfQ0FOQVJZIG1vZGUsIGZhbHNlIG90aGVyd2lzZSknLFxuICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgcmVxdWlyZXNBcmc6IGZhbHNlLFxuICAgIH0pXG4gICAgLmhlbHAoKVxuICAgIC5zaG93SGVscE9uRmFpbChmYWxzZSlcbiAgICAuYXJndjtcblxuICBjb25zdCBzdWl0ZU5hbWUgPSBhcmdzLl9bMF0gYXMgc3RyaW5nO1xuICBpZiAoIXN1aXRlTmFtZSkge1xuICAgIHRocm93IG5ldyBFcnJvcignVXNhZ2U6IHJ1bi1zdWl0ZSA8U1VJVEVOQU1FPicpO1xuICB9XG5cbiAgbGV0IHBhY2thZ2VTb3VyY2U6IHVuZGVmaW5lZCB8IElQYWNrYWdlU291cmNlU2V0dXA7XG4gIGZ1bmN0aW9uIHVzZVBhY2thZ2VTb3VyY2UoczogSVBhY2thZ2VTb3VyY2VTZXR1cCkge1xuICAgIGlmIChwYWNrYWdlU291cmNlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBzcGVjaWZ5IHR3byBwYWNrYWdlIHNvdXJjZXMnKTtcbiAgICB9XG4gICAgcGFja2FnZVNvdXJjZSA9IHM7XG4gIH1cblxuICBpZiAoYXJnc1sndXNlLXNvdXJjZSddIHx8IGFyZ3NbJ2F1dG8tc291cmNlJ10pIHtcbiAgICBpZiAoYXJnc1snZnJhbWV3b3JrLXZlcnNpb24nXSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgdXNlIC0tZnJhbWV3b3JrLXZlcnNpb24gd2l0aCAtLXVzZS1zb3VyY2UnKTtcbiAgICB9XG5cbiAgICBjb25zdCByb290ID0gYXJnc1sndXNlLXNvdXJjZSddICYmIGFyZ3NbJ3VzZS1zb3VyY2UnXSAhPT0gJ2F1dG8nXG4gICAgICA/IGFyZ3NbJ3VzZS1zb3VyY2UnXVxuICAgICAgOiBhd2FpdCBhdXRvRmluZFJvb3QoKTtcblxuICAgIHVzZVBhY2thZ2VTb3VyY2UobmV3IFJlcG9QYWNrYWdlU291cmNlU2V0dXAocm9vdCkpO1xuICB9IGVsc2UgaWYgKGFyZ3NbJ3VzZS1jbGktcmVsZWFzZSddKSB7XG4gICAgdXNlUGFja2FnZVNvdXJjZShuZXcgUmVsZWFzZVBhY2thZ2VTb3VyY2VTZXR1cChhcmdzWyd1c2UtY2xpLXJlbGVhc2UnXSwgYXJnc1snZnJhbWV3b3JrLXZlcnNpb24nXSkpO1xuICB9XG4gIGlmICghcGFja2FnZVNvdXJjZSkge1xuICAgIHRocm93IG5ldyBFcnJvcignU3BlY2lmeSBlaXRoZXIgLS11c2Utc291cmNlIG9yIC0tdXNlLWNsaS1yZWxlYXNlJyk7XG4gIH1cblxuICBjb25zb2xlLmxvZyhgUGFja2FnZSBzb3VyY2U6ICR7cGFja2FnZVNvdXJjZS5kZXNjcmlwdGlvbn1gKTtcbiAgY29uc29sZS5sb2coYFRlc3Qgc3VpdGU6ICAgICAke3N1aXRlTmFtZX1gKTtcblxuICBhd2FpdCBwYWNrYWdlU291cmNlLnByZXBhcmUoKTtcbiAgc2VyaWFsaXplRm9yU3VicHJvY2VzcyhwYWNrYWdlU291cmNlKTtcblxuICBpZiAoYXJncy52ZXJib3NlKSB7XG4gICAgcHJvY2Vzcy5lbnYuVkVSQk9TRSA9ICcxJztcbiAgfVxuXG4gIC8vIE1vdGl2YXRpb24gYmVoaW5kIHRoaXMgYmVoYXZpb3I6IHdoZW4gYWRkaW5nIGEgbmV3IHRlc3Qgc3VpdGUgdG8gdGhlIHBpcGVsaW5lLCBiZWNhdXNlIG9mIHRoZSB3YXkgb3VyXG4gIC8vIFBpcGVsaW5lIHBhY2thZ2Ugd29ya3MsIHRoZSBzdWl0ZSB3b3VsZCBiZSBhZGRlZCB0byB0aGUgcGlwZWxpbmUgQU5EIGFzIGEgY2FuYXJ5IGltbWVkaWF0ZWx5LiBUaGUgY2FuYXJ5XG4gIC8vIHdvdWxkIGZhaWwgdW50aWwgdGhlIHBhY2thZ2Ugd2FzIGFjdHVhbGx5IHJlbGVhc2VkLCBzbyBmb3IgY2FuYXJpZXMgd2UgbWFrZSBhbiBleGNlcHRpb24gc28gdGhhdCB0aGUgaW5pdGlhbFxuICAvLyBjYW5hcnkgd291bGQgc3VjY2VlZCBldmVuIGlmIHRoZSBzdWl0ZSB3YXNuJ3QgeWV0IGF2YWlsYWJsZS4gVGhlIGZhY3QgdGhhdCB0aGUgc3VpdGUgaXMgbm90IG9wdGlvbmFsIGluXG4gIC8vIHRoZSBwaXBlbGluZSBwcm90ZWN0cyB1cyBmcm9tIHR5cG9zLlxuICBjb25zdCBwYXNzV2l0aE5vVGVzdHMgPSBhcmdzLnBhc3NXaXRoTm9UZXN0cyA/PyAhIXByb2Nlc3MuZW52LklTX0NBTkFSWTtcblxuICAvLyBDb21tdW5pY2F0ZSB3aXRoIHRoZSBjb25maWcgZmlsZSAoaW50ZWcuamVzdC5jb25maWcuanMpXG4gIHByb2Nlc3MuZW52LlRFU1RfU1VJVEVfTkFNRSA9IHN1aXRlTmFtZTtcblxuICB0cnkge1xuICAgIGF3YWl0IGplc3QucnVuKFtcbiAgICAgIC4uLmFyZ3MucnVuSW5CYW5kID8gWyctaSddIDogW10sXG4gICAgICAuLi5hcmdzLnRlc3QgPyBbJy10JywgYXJncy50ZXN0XSA6IFtdLFxuICAgICAgLi4uYXJncy52ZXJib3NlID8gWyctLXZlcmJvc2UnXSA6IFtdLFxuICAgICAgLi4ucGFzc1dpdGhOb1Rlc3RzID8gWyctLXBhc3NXaXRoTm9UZXN0cyddIDogW10sXG4gICAgICAuLi5hcmdzWyd0ZXN0LWZpbGUnXSA/IFthcmdzWyd0ZXN0LWZpbGUnXV0gOiBbXSxcbiAgICBdLCBwYXRoLnJlc29sdmUoX19kaXJuYW1lLCAnLi4nLCAnLi4nLCAncmVzb3VyY2VzJywgJ2ludGVnLmplc3QuY29uZmlnLmpzJykpO1xuXG4gIH0gZmluYWxseSB7XG4gICAgYXdhaXQgcGFja2FnZVNvdXJjZS5jbGVhbnVwKCk7XG4gIH1cbn1cblxubWFpbigpLmNhdGNoKGUgPT4ge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICBjb25zb2xlLmVycm9yKGUpO1xuICBwcm9jZXNzLmV4aXRDb2RlID0gMTtcbn0pO1xuIl19
@@ -0,0 +1,140 @@
1
+ /* eslint-disable no-console */
2
+ import * as path from 'path';
3
+ import * as jest from 'jest';
4
+ import * as yargs from 'yargs';
5
+ import { ReleasePackageSourceSetup } from '../package-sources/release-source';
6
+ import { RepoPackageSourceSetup, autoFindRoot } from '../package-sources/repo-source';
7
+ import { IPackageSourceSetup } from '../package-sources/source';
8
+ import { serializeForSubprocess } from '../package-sources/subprocess';
9
+
10
+ async function main() {
11
+ const args = await yargs
12
+ .usage('$0 <SUITENAME>')
13
+ .positional('SUITENAME', {
14
+ descripton: 'Name of the test suite to run',
15
+ type: 'string',
16
+ demandOption: true,
17
+ })
18
+ .option('test', {
19
+ descripton: 'Test pattern to selectively run tests',
20
+ alias: 't',
21
+ type: 'string',
22
+ requiresArg: true,
23
+ })
24
+ .option('test-file', {
25
+ description: 'The specific test file to run',
26
+ type: 'string',
27
+ requiresArg: true,
28
+ })
29
+ .option('use-source', {
30
+ descripton: 'Use TypeScript packages from the given source repository (or "auto")',
31
+ alias: 's',
32
+ type: 'string',
33
+ requiresArg: true,
34
+ })
35
+ .option('use-cli-release', {
36
+ descripton: 'Run the current tests against the CLI at the given version',
37
+ alias: 'u',
38
+ type: 'string',
39
+ requiresArg: true,
40
+ })
41
+ .option('auto-source', {
42
+ alias: 'a',
43
+ description: 'Automatically find the source tree from the current working directory',
44
+ type: 'boolean',
45
+ requiresArg: false,
46
+ })
47
+ .option('runInBand', {
48
+ descripton: 'Run all tests in one Node process',
49
+ alias: 'i',
50
+ type: 'boolean',
51
+ })
52
+ .options('framework-version', {
53
+ description: 'Framework version to use, if different than the CLI version (not all suites respect this)',
54
+ alias: 'f',
55
+ type: 'string',
56
+ })
57
+ .options('verbose', {
58
+ alias: 'v',
59
+ description: 'Run in verbose mode',
60
+ type: 'boolean',
61
+ requiresArg: false,
62
+ })
63
+ .options('passWithNoTests', {
64
+ description: 'Allow passing if the test suite is not found (default true when IS_CANARY mode, false otherwise)',
65
+ type: 'boolean',
66
+ requiresArg: false,
67
+ })
68
+ .help()
69
+ .showHelpOnFail(false)
70
+ .argv;
71
+
72
+ const suiteName = args._[0] as string;
73
+ if (!suiteName) {
74
+ throw new Error('Usage: run-suite <SUITENAME>');
75
+ }
76
+
77
+ let packageSource: undefined | IPackageSourceSetup;
78
+ function usePackageSource(s: IPackageSourceSetup) {
79
+ if (packageSource) {
80
+ throw new Error('Cannot specify two package sources');
81
+ }
82
+ packageSource = s;
83
+ }
84
+
85
+ if (args['use-source'] || args['auto-source']) {
86
+ if (args['framework-version']) {
87
+ throw new Error('Cannot use --framework-version with --use-source');
88
+ }
89
+
90
+ const root = args['use-source'] && args['use-source'] !== 'auto'
91
+ ? args['use-source']
92
+ : await autoFindRoot();
93
+
94
+ usePackageSource(new RepoPackageSourceSetup(root));
95
+ } else if (args['use-cli-release']) {
96
+ usePackageSource(new ReleasePackageSourceSetup(args['use-cli-release'], args['framework-version']));
97
+ }
98
+ if (!packageSource) {
99
+ throw new Error('Specify either --use-source or --use-cli-release');
100
+ }
101
+
102
+ console.log(`Package source: ${packageSource.description}`);
103
+ console.log(`Test suite: ${suiteName}`);
104
+
105
+ await packageSource.prepare();
106
+ serializeForSubprocess(packageSource);
107
+
108
+ if (args.verbose) {
109
+ process.env.VERBOSE = '1';
110
+ }
111
+
112
+ // Motivation behind this behavior: when adding a new test suite to the pipeline, because of the way our
113
+ // Pipeline package works, the suite would be added to the pipeline AND as a canary immediately. The canary
114
+ // would fail until the package was actually released, so for canaries we make an exception so that the initial
115
+ // canary would succeed even if the suite wasn't yet available. The fact that the suite is not optional in
116
+ // the pipeline protects us from typos.
117
+ const passWithNoTests = args.passWithNoTests ?? !!process.env.IS_CANARY;
118
+
119
+ // Communicate with the config file (integ.jest.config.js)
120
+ process.env.TEST_SUITE_NAME = suiteName;
121
+
122
+ try {
123
+ await jest.run([
124
+ ...args.runInBand ? ['-i'] : [],
125
+ ...args.test ? ['-t', args.test] : [],
126
+ ...args.verbose ? ['--verbose'] : [],
127
+ ...passWithNoTests ? ['--passWithNoTests'] : [],
128
+ ...args['test-file'] ? [args['test-file']] : [],
129
+ ], path.resolve(__dirname, '..', '..', 'resources', 'integ.jest.config.js'));
130
+
131
+ } finally {
132
+ await packageSource.cleanup();
133
+ }
134
+ }
135
+
136
+ main().catch(e => {
137
+ // eslint-disable-next-line no-console
138
+ console.error(e);
139
+ process.exitCode = 1;
140
+ });
@@ -0,0 +1 @@
1
+ export {};