@aws-cdk-testing/cli-integ 3.0.0 → 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.
- package/bin/query-github +1 -1
- package/bin/run-suite +1 -1
- package/bin/stage-distribution +1 -1
- package/bin/test-root +1 -1
- package/lib/cli/query-github.d.ts +1 -0
- package/lib/cli/query-github.js +54 -0
- package/lib/cli/query-github.ts +56 -0
- package/lib/cli/run-suite.d.ts +1 -0
- package/lib/cli/run-suite.js +131 -0
- package/lib/cli/run-suite.ts +140 -0
- package/lib/cli/stage-distribution.d.ts +1 -0
- package/lib/cli/stage-distribution.js +217 -0
- package/lib/cli/stage-distribution.ts +267 -0
- package/lib/cli/test-root.d.ts +1 -0
- package/lib/cli/test-root.js +6 -0
- package/lib/cli/test-root.ts +3 -0
- package/package.json +3 -1
package/bin/query-github
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
require('
|
|
2
|
+
require('../lib/cli/query-github.js');
|
package/bin/run-suite
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
require('
|
|
2
|
+
require('../lib/cli/run-suite.js');
|
package/bin/stage-distribution
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
require('
|
|
2
|
+
require('../lib/cli/stage-distribution.js');
|
package/bin/test-root
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
require('
|
|
2
|
+
require('../lib/cli/test-root.js');
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -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 {};
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
/* eslint-disable no-console */
|
|
4
|
+
const path = require("path");
|
|
5
|
+
const fs = require("fs-extra");
|
|
6
|
+
const glob = require("glob");
|
|
7
|
+
const yargs = require("yargs");
|
|
8
|
+
const __1 = require("..");
|
|
9
|
+
const codeartifact_1 = require("../staging/codeartifact");
|
|
10
|
+
const maven_1 = require("../staging/maven");
|
|
11
|
+
const npm_1 = require("../staging/npm");
|
|
12
|
+
const nuget_1 = require("../staging/nuget");
|
|
13
|
+
const pypi_1 = require("../staging/pypi");
|
|
14
|
+
const usage_dir_1 = require("../staging/usage-dir");
|
|
15
|
+
async function main() {
|
|
16
|
+
await yargs
|
|
17
|
+
.usage('$0 <command>')
|
|
18
|
+
.option('npm', {
|
|
19
|
+
description: 'Upload NPM packages only',
|
|
20
|
+
type: 'boolean',
|
|
21
|
+
requiresArg: false,
|
|
22
|
+
})
|
|
23
|
+
.option('python', {
|
|
24
|
+
description: 'Upload Python packages only',
|
|
25
|
+
type: 'boolean',
|
|
26
|
+
requiresArg: false,
|
|
27
|
+
})
|
|
28
|
+
.option('java', {
|
|
29
|
+
description: 'Upload Java packages only',
|
|
30
|
+
type: 'boolean',
|
|
31
|
+
requiresArg: false,
|
|
32
|
+
})
|
|
33
|
+
.option('dotnet', {
|
|
34
|
+
description: 'Upload Dotnet packages only',
|
|
35
|
+
type: 'boolean',
|
|
36
|
+
requiresArg: false,
|
|
37
|
+
})
|
|
38
|
+
.option('regression', {
|
|
39
|
+
description: 'Enable access to previous versions of the staged packages (this is expensive for CodeArtifact so we only do it when necessary)',
|
|
40
|
+
type: 'boolean',
|
|
41
|
+
requiresArg: false,
|
|
42
|
+
default: false,
|
|
43
|
+
})
|
|
44
|
+
.command('publish <DIRECTORY>', 'Publish a given directory', cmd => cmd
|
|
45
|
+
.positional('DIRECTORY', {
|
|
46
|
+
descripton: 'Directory distribution',
|
|
47
|
+
type: 'string',
|
|
48
|
+
demandOption: true,
|
|
49
|
+
})
|
|
50
|
+
.option('name', {
|
|
51
|
+
alias: 'n',
|
|
52
|
+
description: 'Name of the repository to create (default: generate unique name)',
|
|
53
|
+
type: 'string',
|
|
54
|
+
requiresArg: true,
|
|
55
|
+
}), async (args) => {
|
|
56
|
+
await validateDirectory(args);
|
|
57
|
+
const repo = await (args.name ? codeartifact_1.TestRepository.newWithName(args.name) : codeartifact_1.TestRepository.newRandom());
|
|
58
|
+
const usageDir = usage_dir_1.UsageDir.default();
|
|
59
|
+
await doLogin(repo, usageDir, args);
|
|
60
|
+
await publish(repo, usageDir, args);
|
|
61
|
+
header('Done');
|
|
62
|
+
usageDir.advertise();
|
|
63
|
+
})
|
|
64
|
+
.command('login', 'Login to a given repository', cmd => cmd
|
|
65
|
+
.option('name', {
|
|
66
|
+
alias: 'n',
|
|
67
|
+
description: 'Name of the repository to log in to',
|
|
68
|
+
type: 'string',
|
|
69
|
+
requiresArg: true,
|
|
70
|
+
demandOption: true,
|
|
71
|
+
}), async (args) => {
|
|
72
|
+
const repo = codeartifact_1.TestRepository.existing(args.name);
|
|
73
|
+
const usageDir = usage_dir_1.UsageDir.default();
|
|
74
|
+
await doLogin(repo, usageDir, args);
|
|
75
|
+
usageDir.advertise();
|
|
76
|
+
})
|
|
77
|
+
.command('run <DIRECTORY> <COMMAND..>', 'Publish and run a command', cmd => cmd
|
|
78
|
+
.positional('DIRECTORY', {
|
|
79
|
+
descripton: 'Directory distribution',
|
|
80
|
+
type: 'string',
|
|
81
|
+
demandOption: true,
|
|
82
|
+
})
|
|
83
|
+
.positional('COMMAND', {
|
|
84
|
+
alias: 'c',
|
|
85
|
+
description: 'Run the given command with the packages staged',
|
|
86
|
+
type: 'string',
|
|
87
|
+
array: true,
|
|
88
|
+
demandOption: true,
|
|
89
|
+
})
|
|
90
|
+
.option('cleanup', {
|
|
91
|
+
alias: 'C',
|
|
92
|
+
description: 'Cleanup the repository afterwards',
|
|
93
|
+
type: 'boolean',
|
|
94
|
+
default: true,
|
|
95
|
+
requiresArg: false,
|
|
96
|
+
}), async (args) => {
|
|
97
|
+
var _a;
|
|
98
|
+
await validateDirectory(args);
|
|
99
|
+
const repo = await codeartifact_1.TestRepository.newRandom();
|
|
100
|
+
const usageDir = usage_dir_1.UsageDir.default();
|
|
101
|
+
await doLogin(repo, usageDir, args);
|
|
102
|
+
await publish(repo, usageDir, args);
|
|
103
|
+
try {
|
|
104
|
+
await usageDir.activateInCurrentProcess();
|
|
105
|
+
await (0, __1.shell)((_a = args.COMMAND) !== null && _a !== void 0 ? _a : [], {
|
|
106
|
+
shell: true,
|
|
107
|
+
show: 'always',
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
finally {
|
|
111
|
+
if (args.cleanup) {
|
|
112
|
+
await repo.delete();
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
})
|
|
116
|
+
.command('cleanup', 'Clean up testing repository', cmd => cmd
|
|
117
|
+
.option('name', {
|
|
118
|
+
alias: 'n',
|
|
119
|
+
description: 'Name of the repository to cleanup (default: most recent)',
|
|
120
|
+
type: 'string',
|
|
121
|
+
requiresArg: true,
|
|
122
|
+
}), async (args) => {
|
|
123
|
+
const usageDir = usage_dir_1.UsageDir.default();
|
|
124
|
+
let repositoryName = args.name;
|
|
125
|
+
if (!repositoryName) {
|
|
126
|
+
repositoryName = (await usageDir.currentEnv()).CODEARTIFACT_REPO;
|
|
127
|
+
}
|
|
128
|
+
if (!repositoryName) {
|
|
129
|
+
console.log(`No --name given and no $CODEARTIFACT_REPO found in ${usageDir.directory}, nothing cleaned up`);
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
const repo = codeartifact_1.TestRepository.existing(repositoryName);
|
|
133
|
+
await repo.delete();
|
|
134
|
+
})
|
|
135
|
+
.command('gc', 'Clean up day-old testing repositories', cmd => cmd, async () => {
|
|
136
|
+
await codeartifact_1.TestRepository.gc();
|
|
137
|
+
})
|
|
138
|
+
.demandCommand(1, 'You must supply a command')
|
|
139
|
+
.help()
|
|
140
|
+
.showHelpOnFail(false)
|
|
141
|
+
.parse();
|
|
142
|
+
}
|
|
143
|
+
async function validateDirectory(args) {
|
|
144
|
+
if (!await fs.pathExists(path.join(args.DIRECTORY, 'build.json'))) {
|
|
145
|
+
throw new Error(`${args.DIRECTORY} does not look like a CDK dist directory (build.json missing)`);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
async function doLogin(repo, usageDir, args) {
|
|
149
|
+
const login = await repo.loginInformation();
|
|
150
|
+
const oldEnv = await usageDir.currentEnv();
|
|
151
|
+
await usageDir.clean();
|
|
152
|
+
await usageDir.addToEnv({
|
|
153
|
+
CODEARTIFACT_REPO: login.repositoryName,
|
|
154
|
+
});
|
|
155
|
+
if (oldEnv.BUILD_VERSION) {
|
|
156
|
+
await usageDir.addToEnv({
|
|
157
|
+
BUILD_VERSION: oldEnv.BUILD_VERSION,
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
const doRepo = whichRepos(args);
|
|
161
|
+
await doRepo.npm(() => (0, npm_1.npmLogin)(login, usageDir));
|
|
162
|
+
await doRepo.python(() => (0, pypi_1.pypiLogin)(login, usageDir));
|
|
163
|
+
await doRepo.java(() => (0, maven_1.mavenLogin)(login, usageDir));
|
|
164
|
+
await doRepo.dotnet(() => (0, nuget_1.nugetLogin)(login, usageDir));
|
|
165
|
+
}
|
|
166
|
+
async function publish(repo, usageDir, args) {
|
|
167
|
+
const directory = `${args.DIRECTORY}`;
|
|
168
|
+
const login = await repo.loginInformation();
|
|
169
|
+
const doRepo = whichRepos(args);
|
|
170
|
+
const buildJson = await fs.readJson(path.join(directory, 'build.json'));
|
|
171
|
+
await usageDir.addToEnv({
|
|
172
|
+
BUILD_VERSION: buildJson.version,
|
|
173
|
+
});
|
|
174
|
+
await doRepo.npm(async () => {
|
|
175
|
+
header('NPM');
|
|
176
|
+
await (0, npm_1.uploadNpmPackages)(glob.sync(path.join(directory, 'js', '*.tgz')), login, usageDir);
|
|
177
|
+
});
|
|
178
|
+
await doRepo.python(async () => {
|
|
179
|
+
header('Python');
|
|
180
|
+
await (0, pypi_1.uploadPythonPackages)(glob.sync(path.join(directory, 'python', '*')), login);
|
|
181
|
+
});
|
|
182
|
+
await doRepo.java(async () => {
|
|
183
|
+
header('Java');
|
|
184
|
+
await (0, maven_1.uploadJavaPackages)(glob.sync(path.join(directory, 'java', '**', '*.pom')), login, usageDir);
|
|
185
|
+
});
|
|
186
|
+
await doRepo.dotnet(async () => {
|
|
187
|
+
header('.NET');
|
|
188
|
+
await (0, nuget_1.uploadDotnetPackages)(glob.sync(path.join(directory, 'dotnet', '**', '*.nupkg')), usageDir);
|
|
189
|
+
});
|
|
190
|
+
if (args.regression) {
|
|
191
|
+
console.log('🛍 Configuring packages for upstream versions');
|
|
192
|
+
await repo.markAllUpstreamAllow();
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
function whichRepos(args) {
|
|
196
|
+
const all = args.npm === undefined && args.python === undefined && args.java === undefined && args.dotnet === undefined;
|
|
197
|
+
const invoke = (block) => block();
|
|
198
|
+
const skip = () => { };
|
|
199
|
+
return {
|
|
200
|
+
npm: args.npm || all ? invoke : skip,
|
|
201
|
+
python: args.python || all ? invoke : skip,
|
|
202
|
+
java: args.java || all ? invoke : skip,
|
|
203
|
+
dotnet: args.dotnet || all ? invoke : skip,
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
function header(caption) {
|
|
207
|
+
console.log('');
|
|
208
|
+
console.log('/'.repeat(70));
|
|
209
|
+
console.log(`// ${caption}`);
|
|
210
|
+
console.log('');
|
|
211
|
+
}
|
|
212
|
+
main().catch(e => {
|
|
213
|
+
// eslint-disable-next-line no-console
|
|
214
|
+
console.error(e);
|
|
215
|
+
process.exitCode = 1;
|
|
216
|
+
});
|
|
217
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhZ2UtZGlzdHJpYnV0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsic3RhZ2UtZGlzdHJpYnV0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsK0JBQStCO0FBQy9CLDZCQUE2QjtBQUM3QiwrQkFBK0I7QUFDL0IsNkJBQTZCO0FBQzdCLCtCQUErQjtBQUMvQiwwQkFBMkI7QUFDM0IsMERBQXlEO0FBQ3pELDRDQUFrRTtBQUNsRSx3Q0FBNkQ7QUFDN0QsNENBQW9FO0FBQ3BFLDBDQUFrRTtBQUNsRSxvREFBZ0Q7QUFFaEQsS0FBSyxVQUFVLElBQUk7SUFDakIsTUFBTSxLQUFLO1NBQ1IsS0FBSyxDQUFDLGNBQWMsQ0FBQztTQUNyQixNQUFNLENBQUMsS0FBSyxFQUFFO1FBQ2IsV0FBVyxFQUFFLDBCQUEwQjtRQUN2QyxJQUFJLEVBQUUsU0FBUztRQUNmLFdBQVcsRUFBRSxLQUFLO0tBQ25CLENBQUM7U0FDRCxNQUFNLENBQUMsUUFBUSxFQUFFO1FBQ2hCLFdBQVcsRUFBRSw2QkFBNkI7UUFDMUMsSUFBSSxFQUFFLFNBQVM7UUFDZixXQUFXLEVBQUUsS0FBSztLQUNuQixDQUFDO1NBQ0QsTUFBTSxDQUFDLE1BQU0sRUFBRTtRQUNkLFdBQVcsRUFBRSwyQkFBMkI7UUFDeEMsSUFBSSxFQUFFLFNBQVM7UUFDZixXQUFXLEVBQUUsS0FBSztLQUNuQixDQUFDO1NBQ0QsTUFBTSxDQUFDLFFBQVEsRUFBRTtRQUNoQixXQUFXLEVBQUUsNkJBQTZCO1FBQzFDLElBQUksRUFBRSxTQUFTO1FBQ2YsV0FBVyxFQUFFLEtBQUs7S0FDbkIsQ0FBQztTQUNELE1BQU0sQ0FBQyxZQUFZLEVBQUU7UUFDcEIsV0FBVyxFQUFFLGdJQUFnSTtRQUM3SSxJQUFJLEVBQUUsU0FBUztRQUNmLFdBQVcsRUFBRSxLQUFLO1FBQ2xCLE9BQU8sRUFBRSxLQUFLO0tBQ2YsQ0FBQztTQUNELE9BQU8sQ0FBQyxxQkFBcUIsRUFBRSwyQkFBMkIsRUFBRSxHQUFH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Q0FBQyxPQUFPLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFDOUIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNsQixDQUFDO0FBRUQsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFO0lBQ2Ysc0NBQXNDO0lBQ3RDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDakIsT0FBTyxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUM7QUFDdkIsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBuby1jb25zb2xlICovXG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMtZXh0cmEnO1xuaW1wb3J0ICogYXMgZ2xvYiBmcm9tICdnbG9iJztcbmltcG9ydCAqIGFzIHlhcmdzIGZyb20gJ3lhcmdzJztcbmltcG9ydCB7IHNoZWxsIH0gZnJvbSAnLi4nO1xuaW1wb3J0IHsgVGVzdFJlcG9zaXRvcnkgfSBmcm9tICcuLi9zdGFnaW5nL2NvZGVhcnRpZmFjdCc7XG5pbXBvcnQgeyB1cGxvYWRKYXZhUGFja2FnZXMsIG1hdmVuTG9naW4gfSBmcm9tICcuLi9zdGFnaW5nL21hdmVuJztcbmltcG9ydCB7IHVwbG9hZE5wbVBhY2thZ2VzLCBucG1Mb2dpbiB9IGZyb20gJy4uL3N0YWdpbmcvbnBtJztcbmltcG9ydCB7IHVwbG9hZERvdG5ldFBhY2thZ2VzLCBudWdldExvZ2luIH0gZnJvbSAnLi4vc3RhZ2luZy9udWdldCc7XG5pbXBvcnQgeyB1cGxvYWRQeXRob25QYWNrYWdlcywgcHlwaUxvZ2luIH0gZnJvbSAnLi4vc3RhZ2luZy9weXBpJztcbmltcG9ydCB7IFVzYWdlRGlyIH0gZnJvbSAnLi4vc3RhZ2luZy91c2FnZS1kaXInO1xuXG5hc3luYyBmdW5jdGlvbiBtYWluKCkge1xuICBhd2FpdCB5YXJnc1xuICAgIC51c2FnZSgnJDAgPGNvbW1hbmQ+JylcbiAgICAub3B0aW9uKCducG0nLCB7XG4gICAgICBkZXNjcmlwdGlvbjogJ1VwbG9hZCBOUE0gcGFja2FnZXMgb25seScsXG4gICAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgICByZXF1aXJlc0FyZzogZmFsc2UsXG4gICAgfSlcbiAgICAub3B0aW9uKCdweXRob24nLCB7XG4gICAgICBkZXNjcmlwdGlvbjogJ1VwbG9hZCBQeXRob24gcGFja2FnZXMgb25seScsXG4gICAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgICByZXF1aXJlc0FyZzogZmFsc2UsXG4gICAgfSlcbiAgICAub3B0aW9uKCdqYXZhJywge1xuICAgICAgZGVzY3JpcHRpb246ICdVcGxvYWQgSmF2YSBwYWNrYWdlcyBvbmx5JyxcbiAgICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICAgIHJlcXVpcmVzQXJnOiBmYWxzZSxcbiAgICB9KVxuICAgIC5vcHRpb24oJ2RvdG5ldCcsIHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnVXBsb2FkIERvdG5ldCBwYWNrYWdlcyBvbmx5JyxcbiAgICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICAgIHJlcXVpcmVzQXJnOiBmYWxzZSxcbiAgICB9KVxuICAgIC5vcHRpb24oJ3JlZ3Jlc3Npb24nLCB7XG4gICAgICBkZXNjcmlwdGlvbjogJ0VuYWJsZSBhY2Nlc3MgdG8gcHJldmlvdXMgdmVyc2lvbnMgb2YgdGhlIHN0YWdlZCBwYWNrYWdlcyAodGhpcyBpcyBleHBlbnNpdmUgZm9yIENvZGVBcnRpZmFjdCBzbyB3ZSBvbmx5IGRvIGl0IHdoZW4gbmVjZXNzYXJ5KScsXG4gICAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgICByZXF1aXJlc0FyZzogZmFsc2UsXG4gICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICB9KVxuICAgIC5jb21tYW5kKCdwdWJsaXNoIDxESVJFQ1RPUlk+JywgJ1B1Ymxpc2ggYSBnaXZlbiBkaXJlY3RvcnknLCBjbWQgPT4gY21kXG4gICAgICAucG9zaXRpb25hbCgnRElSRUNUT1JZJywge1xuICAgICAgICBkZXNjcmlwdG9uOiAnRGlyZWN0b3J5IGRpc3RyaWJ1dGlvbicsXG4gICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICBkZW1hbmRPcHRpb246IHRydWUsXG4gICAgICB9KVxuICAgICAgLm9wdGlvbignbmFtZScsIHtcbiAgICAgICAgYWxpYXM6ICduJyxcbiAgICAgICAgZGVzY3JpcHRpb246ICdOYW1lIG9mIHRoZSByZXBvc2l0b3J5IHRvIGNyZWF0ZSAoZGVmYXVsdDogZ2VuZXJhdGUgdW5pcXVlIG5hbWUpJyxcbiAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgIHJlcXVpcmVzQXJnOiB0cnVlLFxuICAgICAgfSksIGFzeW5jIChhcmdzKSA9PiB7XG5cbiAgICAgIGF3YWl0IHZhbGlkYXRlRGlyZWN0b3J5KGFyZ3MpO1xuICAgICAgY29uc3QgcmVwbyA9IGF3YWl0IChhcmdzLm5hbWUgPyBUZXN0UmVwb3NpdG9yeS5uZXdXaXRoTmFtZShhcmdzLm5hbWUpIDogVGVzdFJlcG9zaXRvcnkubmV3UmFuZG9tKCkpO1xuICAgICAgY29uc3QgdXNhZ2VEaXIgPSBVc2FnZURpci5kZWZhdWx0KCk7XG5cbiAgICAgIGF3YWl0IGRvTG9naW4ocmVwbywgdXNhZ2VEaXIsIGFyZ3MpO1xuICAgICAgYXdhaXQgcHVibGlzaChyZXBvLCB1c2FnZURpciwgYXJncyk7XG5cbiAgICAgIGhlYWRlcignRG9uZScpO1xuICAgICAgdXNhZ2VEaXIuYWR2ZXJ0aXNlKCk7XG4gICAgfSlcbiAgICAuY29tbWFuZCgnbG9naW4nLCAnTG9naW4gdG8gYSBnaXZlbiByZXBvc2l0b3J5JywgY21kID0+IGNtZFxuICAgICAgLm9wdGlvbignbmFtZScsIHtcbiAgICAgICAgYWxpYXM6ICduJyxcbiAgICAgICAgZGVzY3JpcHRpb246ICdOYW1lIG9mIHRoZSByZXBvc2l0b3J5IHRvIGxvZyBpbiB0bycsXG4gICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICByZXF1aXJlc0FyZzogdHJ1ZSxcbiAgICAgICAgZGVtYW5kT3B0aW9uOiB0cnVlLFxuICAgICAgfSksIGFzeW5jIChhcmdzKSA9PiB7XG5cbiAgICAgIGNvbnN0IHJlcG8gPSBUZXN0UmVwb3NpdG9yeS5leGlzdGluZyhhcmdzLm5hbWUpO1xuICAgICAgY29uc3QgdXNhZ2VEaXIgPSBVc2FnZURpci5kZWZhdWx0KCk7XG5cbiAgICAgIGF3YWl0IGRvTG9naW4ocmVwbywgdXNhZ2VEaXIsIGFyZ3MpO1xuXG4gICAgICB1c2FnZURpci5hZHZlcnRpc2UoKTtcbiAgICB9KVxuICAgIC5jb21tYW5kKCdydW4gPERJUkVDVE9SWT4gPENPTU1BTkQuLj4nLCAnUHVibGlzaCBhbmQgcnVuIGEgY29tbWFuZCcsIGNtZCA9PiBjbWRcbiAgICAgIC5wb3NpdGlvbmFsKCdESVJFQ1RPUlknLCB7XG4gICAgICAgIGRlc2NyaXB0b246ICdEaXJlY3RvcnkgZGlzdHJpYnV0aW9uJyxcbiAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgIGRlbWFuZE9wdGlvbjogdHJ1ZSxcbiAgICAgIH0pXG4gICAgICAucG9zaXRpb25hbCgnQ09NTUFORCcsIHtcbiAgICAgICAgYWxpYXM6ICdjJyxcbiAgICAgICAgZGVzY3JpcHRpb246ICdSdW4gdGhlIGdpdmVuIGNvbW1hbmQgd2l0aCB0aGUgcGFja2FnZXMgc3RhZ2VkJyxcbiAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgIGFycmF5OiB0cnVlLFxuICAgICAgICBkZW1hbmRPcHRpb246IHRydWUsXG4gICAgICB9KVxuICAgICAgLm9wdGlvbignY2xlYW51cCcsIHtcbiAgICAgICAgYWxpYXM6ICdDJyxcbiAgICAgICAgZGVzY3JpcHRpb246ICdDbGVhbnVwIHRoZSByZXBvc2l0b3J5IGFmdGVyd2FyZHMnLFxuICAgICAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgICAgIGRlZmF1bHQ6IHRydWUsXG4gICAgICAgIHJlcXVpcmVzQXJnOiBmYWxzZSxcbiAgICAgIH0pLCBhc3luYyAoYXJncykgPT4ge1xuXG4gICAgICBhd2FpdCB2YWxpZGF0ZURpcmVjdG9yeShhcmdzKTtcbiAgICAgIGNvbnN0IHJlcG8gPSBhd2FpdCBUZXN0UmVwb3NpdG9yeS5uZXdSYW5kb20oKTtcbiAgICAgIGNvbnN0IHVzYWdlRGlyID0gVXNhZ2VEaXIuZGVmYXVsdCgpO1xuXG4gICAgICBhd2FpdCBkb0xvZ2luKHJlcG8sIHVzYWdlRGlyLCBhcmdzKTtcbiAgICAgIGF3YWl0IHB1Ymxpc2gocmVwbywgdXNhZ2VEaXIsIGFyZ3MpO1xuXG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB1c2FnZURpci5hY3RpdmF0ZUluQ3VycmVudFByb2Nlc3MoKTtcblxuICAgICAgICBhd2FpdCBzaGVsbChhcmdzLkNPTU1BTkQgPz8gW10sIHtcbiAgICAgICAgICBzaGVsbDogdHJ1ZSxcbiAgICAgICAgICBzaG93OiAnYWx3YXlzJyxcbiAgICAgICAgfSk7XG5cbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGlmIChhcmdzLmNsZWFudXApIHtcbiAgICAgICAgICBhd2FpdCByZXBvLmRlbGV0ZSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSlcbiAgICAuY29tbWFuZCgnY2xlYW51cCcsICdDbGVhbiB1cCB0ZXN0aW5nIHJlcG9zaXRvcnknLCBjbWQgPT4gY21kXG4gICAgICAub3B0aW9uKCduYW1lJywge1xuICAgICAgICBhbGlhczogJ24nLFxuICAgICAgICBkZXNjcmlwdGlvbjogJ05hbWUgb2YgdGhlIHJlcG9zaXRvcnkgdG8gY2xlYW51cCAoZGVmYXVsdDogbW9zdCByZWNlbnQpJyxcbiAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgIHJlcXVpcmVzQXJnOiB0cnVlLFxuICAgICAgfSksIGFzeW5jIChhcmdzKSA9PiB7XG5cbiAgICAgIGNvbnN0IHVzYWdlRGlyID0gVXNhZ2VEaXIuZGVmYXVsdCgpO1xuXG4gICAgICBsZXQgcmVwb3NpdG9yeU5hbWUgPSBhcmdzLm5hbWU7XG4gICAgICBpZiAoIXJlcG9zaXRvcnlOYW1lKSB7XG4gICAgICAgIHJlcG9zaXRvcnlOYW1lID0gKGF3YWl0IHVzYWdlRGlyLmN1cnJlbnRFbnYoKSkuQ09ERUFSVElGQUNUX1JFUE87XG4gICAgICB9XG5cbiAgICAgIGlmICghcmVwb3NpdG9yeU5hbWUpIHtcbiAgICAgICAgY29uc29sZS5sb2coYE5vIC0tbmFtZSBnaXZlbiBhbmQgbm8gJENPREVBUlRJRkFDVF9SRVBPIGZvdW5kIGluICR7dXNhZ2VEaXIuZGlyZWN0b3J5fSwgbm90aGluZyBjbGVhbmVkIHVwYCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVwbyA9IFRlc3RSZXBvc2l0b3J5LmV4aXN0aW5nKHJlcG9zaXRvcnlOYW1lKTtcbiAgICAgIGF3YWl0IHJlcG8uZGVsZXRlKCk7XG4gICAgfSlcbiAgICAuY29tbWFuZCgnZ2MnLCAnQ2xlYW4gdXAgZGF5LW9sZCB0ZXN0aW5nIHJlcG9zaXRvcmllcycsIGNtZCA9PiBjbWQsIGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IFRlc3RSZXBvc2l0b3J5LmdjKCk7XG4gICAgfSlcbiAgICAuZGVtYW5kQ29tbWFuZCgxLCAnWW91IG11c3Qgc3VwcGx5IGEgY29tbWFuZCcpXG4gICAgLmhlbHAoKVxuICAgIC5zaG93SGVscE9uRmFpbChmYWxzZSlcbiAgICAucGFyc2UoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gdmFsaWRhdGVEaXJlY3RvcnkoYXJnczoge1xuICBESVJFQ1RPUlk6IHN0cmluZztcbn0pIHtcbiAgaWYgKCFhd2FpdCBmcy5wYXRoRXhpc3RzKHBhdGguam9pbihhcmdzLkRJUkVDVE9SWSwgJ2J1aWxkLmpzb24nKSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYCR7YXJncy5ESVJFQ1RPUll9IGRvZXMgbm90IGxvb2sgbGlrZSBhIENESyBkaXN0IGRpcmVjdG9yeSAoYnVpbGQuanNvbiBtaXNzaW5nKWApO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGRvTG9naW4ocmVwbzogVGVzdFJlcG9zaXRvcnksIHVzYWdlRGlyOiBVc2FnZURpciwgYXJnczoge1xuICBucG0/OiBib29sZWFuO1xuICBweXRob24/OiBib29sZWFuO1xuICBqYXZhPzogYm9vbGVhbjtcbiAgZG90bmV0PzogYm9vbGVhbjtcbn0pIHtcbiAgY29uc3QgbG9naW4gPSBhd2FpdCByZXBvLmxvZ2luSW5mb3JtYXRpb24oKTtcblxuICBjb25zdCBvbGRFbnYgPSBhd2FpdCB1c2FnZURpci5jdXJyZW50RW52KCk7XG5cbiAgYXdhaXQgdXNhZ2VEaXIuY2xlYW4oKTtcbiAgYXdhaXQgdXNhZ2VEaXIuYWRkVG9FbnYoe1xuICAgIENPREVBUlRJRkFDVF9SRVBPOiBsb2dpbi5yZXBvc2l0b3J5TmFtZSxcbiAgfSk7XG5cbiAgaWYgKG9sZEVudi5CVUlMRF9WRVJTSU9OKSB7XG4gICAgYXdhaXQgdXNhZ2VEaXIuYWRkVG9FbnYoe1xuICAgICAgQlVJTERfVkVSU0lPTjogb2xkRW52LkJVSUxEX1ZFUlNJT04sXG4gICAgfSk7XG4gIH1cblxuICBjb25zdCBkb1JlcG8gPSB3aGljaFJlcG9zKGFyZ3MpO1xuXG4gIGF3YWl0IGRvUmVwby5ucG0oKCkgPT4gbnBtTG9naW4obG9naW4sIHVzYWdlRGlyKSk7XG4gIGF3YWl0IGRvUmVwby5weXRob24oKCkgPT4gcHlwaUxvZ2luKGxvZ2luLCB1c2FnZURpcikpO1xuICBhd2FpdCBkb1JlcG8uamF2YSgoKSA9PiBtYXZlbkxvZ2luKGxvZ2luLCB1c2FnZURpcikpO1xuICBhd2FpdCBkb1JlcG8uZG90bmV0KCgpID0+IG51Z2V0TG9naW4obG9naW4sIHVzYWdlRGlyKSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHB1Ymxpc2gocmVwbzogVGVzdFJlcG9zaXRvcnksIHVzYWdlRGlyOiBVc2FnZURpciwgYXJnczoge1xuICBESVJFQ1RPUlk6IHN0cmluZztcbiAgbnBtPzogYm9vbGVhbjtcbiAgcHl0aG9uPzogYm9vbGVhbjtcbiAgamF2YT86IGJvb2xlYW47XG4gIGRvdG5ldD86IGJvb2xlYW47XG4gIHJlZ3Jlc3Npb24/OiBib29sZWFuO1xufSkge1xuICBjb25zdCBkaXJlY3RvcnkgPSBgJHthcmdzLkRJUkVDVE9SWX1gO1xuICBjb25zdCBsb2dpbiA9IGF3YWl0IHJlcG8ubG9naW5JbmZvcm1hdGlvbigpO1xuXG4gIGNvbnN0IGRvUmVwbyA9IHdoaWNoUmVwb3MoYXJncyk7XG5cbiAgY29uc3QgYnVpbGRKc29uID0gYXdhaXQgZnMucmVhZEpzb24ocGF0aC5qb2luKGRpcmVjdG9yeSwgJ2J1aWxkLmpzb24nKSk7XG4gIGF3YWl0IHVzYWdlRGlyLmFkZFRvRW52KHtcbiAgICBCVUlMRF9WRVJTSU9OOiBidWlsZEpzb24udmVyc2lvbixcbiAgfSk7XG5cbiAgYXdhaXQgZG9SZXBvLm5wbShhc3luYyAoKSA9PiB7XG4gICAgaGVhZGVyKCdOUE0nKTtcbiAgICBhd2FpdCB1cGxvYWROcG1QYWNrYWdlcyhnbG9iLnN5bmMocGF0aC5qb2luKGRpcmVjdG9yeSwgJ2pzJywgJyoudGd6JykpLCBsb2dpbiwgdXNhZ2VEaXIpO1xuICB9KTtcblxuICBhd2FpdCBkb1JlcG8ucHl0aG9uKGFzeW5jICgpID0+IHtcbiAgICBoZWFkZXIoJ1B5dGhvbicpO1xuICAgIGF3YWl0IHVwbG9hZFB5dGhvblBhY2thZ2VzKGdsb2Iuc3luYyhwYXRoLmpvaW4oZGlyZWN0b3J5LCAncHl0aG9uJywgJyonKSksIGxvZ2luKTtcbiAgfSk7XG5cbiAgYXdhaXQgZG9SZXBvLmphdmEoYXN5bmMgKCkgPT4ge1xuICAgIGhlYWRlcignSmF2YScpO1xuICAgIGF3YWl0IHVwbG9hZEphdmFQYWNrYWdlcyhnbG9iLnN5bmMocGF0aC5qb2luKGRpcmVjdG9yeSwgJ2phdmEnLCAnKionLCAnKi5wb20nKSksIGxvZ2luLCB1c2FnZURpcik7XG4gIH0pO1xuXG4gIGF3YWl0IGRvUmVwby5kb3RuZXQoYXN5bmMgKCkgPT4ge1xuICAgIGhlYWRlcignLk5FVCcpO1xuICAgIGF3YWl0IHVwbG9hZERvdG5ldFBhY2thZ2VzKGdsb2Iuc3luYyhwYXRoLmpvaW4oZGlyZWN0b3J5LCAnZG90bmV0JywgJyoqJywgJyoubnVwa2cnKSksIHVzYWdlRGlyKTtcbiAgfSk7XG5cbiAgaWYgKGFyZ3MucmVncmVzc2lvbikge1xuICAgIGNvbnNvbGUubG9nKCfwn5uNIENvbmZpZ3VyaW5nIHBhY2thZ2VzIGZvciB1cHN0cmVhbSB2ZXJzaW9ucycpO1xuICAgIGF3YWl0IHJlcG8ubWFya0FsbFVwc3RyZWFtQWxsb3coKTtcbiAgfVxufVxuXG5mdW5jdGlvbiB3aGljaFJlcG9zKGFyZ3M6IHtcbiAgbnBtPzogYm9vbGVhbjtcbiAgcHl0aG9uPzogYm9vbGVhbjtcbiAgamF2YT86IGJvb2xlYW47XG4gIGRvdG5ldD86IGJvb2xlYW47XG59KSB7XG4gIGNvbnN0IGFsbCA9IGFyZ3MubnBtID09PSB1bmRlZmluZWQgJiYgYXJncy5weXRob24gPT09IHVuZGVmaW5lZCAmJiBhcmdzLmphdmEgPT09IHVuZGVmaW5lZCAmJiBhcmdzLmRvdG5ldCA9PT0gdW5kZWZpbmVkO1xuXG4gIGNvbnN0IGludm9rZSA9IChibG9jazogKCkgPT4gUHJvbWlzZTx2b2lkPikgPT4gYmxvY2soKTtcbiAgY29uc3Qgc2tpcCA9ICgpID0+IHsgfTtcblxuICByZXR1cm4ge1xuICAgIG5wbTogYXJncy5ucG0gfHwgYWxsID8gaW52b2tlIDogc2tpcCxcbiAgICBweXRob246IGFyZ3MucHl0aG9uIHx8IGFsbCA/IGludm9rZSA6IHNraXAsXG4gICAgamF2YTogYXJncy5qYXZhIHx8IGFsbCA/IGludm9rZSA6IHNraXAsXG4gICAgZG90bmV0OiBhcmdzLmRvdG5ldCB8fCBhbGwgPyBpbnZva2UgOiBza2lwLFxuICB9O1xufVxuXG5mdW5jdGlvbiBoZWFkZXIoY2FwdGlvbjogc3RyaW5nKSB7XG4gIGNvbnNvbGUubG9nKCcnKTtcbiAgY29uc29sZS5sb2coJy8nLnJlcGVhdCg3MCkpO1xuICBjb25zb2xlLmxvZyhgLy8gICR7Y2FwdGlvbn1gKTtcbiAgY29uc29sZS5sb2coJycpO1xufVxuXG5tYWluKCkuY2F0Y2goZSA9PiB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gIGNvbnNvbGUuZXJyb3IoZSk7XG4gIHByb2Nlc3MuZXhpdENvZGUgPSAxO1xufSk7XG4iXX0=
|
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
/* eslint-disable no-console */
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
import * as fs from 'fs-extra';
|
|
4
|
+
import * as glob from 'glob';
|
|
5
|
+
import * as yargs from 'yargs';
|
|
6
|
+
import { shell } from '..';
|
|
7
|
+
import { TestRepository } from '../staging/codeartifact';
|
|
8
|
+
import { uploadJavaPackages, mavenLogin } from '../staging/maven';
|
|
9
|
+
import { uploadNpmPackages, npmLogin } from '../staging/npm';
|
|
10
|
+
import { uploadDotnetPackages, nugetLogin } from '../staging/nuget';
|
|
11
|
+
import { uploadPythonPackages, pypiLogin } from '../staging/pypi';
|
|
12
|
+
import { UsageDir } from '../staging/usage-dir';
|
|
13
|
+
|
|
14
|
+
async function main() {
|
|
15
|
+
await yargs
|
|
16
|
+
.usage('$0 <command>')
|
|
17
|
+
.option('npm', {
|
|
18
|
+
description: 'Upload NPM packages only',
|
|
19
|
+
type: 'boolean',
|
|
20
|
+
requiresArg: false,
|
|
21
|
+
})
|
|
22
|
+
.option('python', {
|
|
23
|
+
description: 'Upload Python packages only',
|
|
24
|
+
type: 'boolean',
|
|
25
|
+
requiresArg: false,
|
|
26
|
+
})
|
|
27
|
+
.option('java', {
|
|
28
|
+
description: 'Upload Java packages only',
|
|
29
|
+
type: 'boolean',
|
|
30
|
+
requiresArg: false,
|
|
31
|
+
})
|
|
32
|
+
.option('dotnet', {
|
|
33
|
+
description: 'Upload Dotnet packages only',
|
|
34
|
+
type: 'boolean',
|
|
35
|
+
requiresArg: false,
|
|
36
|
+
})
|
|
37
|
+
.option('regression', {
|
|
38
|
+
description: 'Enable access to previous versions of the staged packages (this is expensive for CodeArtifact so we only do it when necessary)',
|
|
39
|
+
type: 'boolean',
|
|
40
|
+
requiresArg: false,
|
|
41
|
+
default: false,
|
|
42
|
+
})
|
|
43
|
+
.command('publish <DIRECTORY>', 'Publish a given directory', cmd => cmd
|
|
44
|
+
.positional('DIRECTORY', {
|
|
45
|
+
descripton: 'Directory distribution',
|
|
46
|
+
type: 'string',
|
|
47
|
+
demandOption: true,
|
|
48
|
+
})
|
|
49
|
+
.option('name', {
|
|
50
|
+
alias: 'n',
|
|
51
|
+
description: 'Name of the repository to create (default: generate unique name)',
|
|
52
|
+
type: 'string',
|
|
53
|
+
requiresArg: true,
|
|
54
|
+
}), async (args) => {
|
|
55
|
+
|
|
56
|
+
await validateDirectory(args);
|
|
57
|
+
const repo = await (args.name ? TestRepository.newWithName(args.name) : TestRepository.newRandom());
|
|
58
|
+
const usageDir = UsageDir.default();
|
|
59
|
+
|
|
60
|
+
await doLogin(repo, usageDir, args);
|
|
61
|
+
await publish(repo, usageDir, args);
|
|
62
|
+
|
|
63
|
+
header('Done');
|
|
64
|
+
usageDir.advertise();
|
|
65
|
+
})
|
|
66
|
+
.command('login', 'Login to a given repository', cmd => cmd
|
|
67
|
+
.option('name', {
|
|
68
|
+
alias: 'n',
|
|
69
|
+
description: 'Name of the repository to log in to',
|
|
70
|
+
type: 'string',
|
|
71
|
+
requiresArg: true,
|
|
72
|
+
demandOption: true,
|
|
73
|
+
}), async (args) => {
|
|
74
|
+
|
|
75
|
+
const repo = TestRepository.existing(args.name);
|
|
76
|
+
const usageDir = UsageDir.default();
|
|
77
|
+
|
|
78
|
+
await doLogin(repo, usageDir, args);
|
|
79
|
+
|
|
80
|
+
usageDir.advertise();
|
|
81
|
+
})
|
|
82
|
+
.command('run <DIRECTORY> <COMMAND..>', 'Publish and run a command', cmd => cmd
|
|
83
|
+
.positional('DIRECTORY', {
|
|
84
|
+
descripton: 'Directory distribution',
|
|
85
|
+
type: 'string',
|
|
86
|
+
demandOption: true,
|
|
87
|
+
})
|
|
88
|
+
.positional('COMMAND', {
|
|
89
|
+
alias: 'c',
|
|
90
|
+
description: 'Run the given command with the packages staged',
|
|
91
|
+
type: 'string',
|
|
92
|
+
array: true,
|
|
93
|
+
demandOption: true,
|
|
94
|
+
})
|
|
95
|
+
.option('cleanup', {
|
|
96
|
+
alias: 'C',
|
|
97
|
+
description: 'Cleanup the repository afterwards',
|
|
98
|
+
type: 'boolean',
|
|
99
|
+
default: true,
|
|
100
|
+
requiresArg: false,
|
|
101
|
+
}), async (args) => {
|
|
102
|
+
|
|
103
|
+
await validateDirectory(args);
|
|
104
|
+
const repo = await TestRepository.newRandom();
|
|
105
|
+
const usageDir = UsageDir.default();
|
|
106
|
+
|
|
107
|
+
await doLogin(repo, usageDir, args);
|
|
108
|
+
await publish(repo, usageDir, args);
|
|
109
|
+
|
|
110
|
+
try {
|
|
111
|
+
await usageDir.activateInCurrentProcess();
|
|
112
|
+
|
|
113
|
+
await shell(args.COMMAND ?? [], {
|
|
114
|
+
shell: true,
|
|
115
|
+
show: 'always',
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
} finally {
|
|
119
|
+
if (args.cleanup) {
|
|
120
|
+
await repo.delete();
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
})
|
|
124
|
+
.command('cleanup', 'Clean up testing repository', cmd => cmd
|
|
125
|
+
.option('name', {
|
|
126
|
+
alias: 'n',
|
|
127
|
+
description: 'Name of the repository to cleanup (default: most recent)',
|
|
128
|
+
type: 'string',
|
|
129
|
+
requiresArg: true,
|
|
130
|
+
}), async (args) => {
|
|
131
|
+
|
|
132
|
+
const usageDir = UsageDir.default();
|
|
133
|
+
|
|
134
|
+
let repositoryName = args.name;
|
|
135
|
+
if (!repositoryName) {
|
|
136
|
+
repositoryName = (await usageDir.currentEnv()).CODEARTIFACT_REPO;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
if (!repositoryName) {
|
|
140
|
+
console.log(`No --name given and no $CODEARTIFACT_REPO found in ${usageDir.directory}, nothing cleaned up`);
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
const repo = TestRepository.existing(repositoryName);
|
|
145
|
+
await repo.delete();
|
|
146
|
+
})
|
|
147
|
+
.command('gc', 'Clean up day-old testing repositories', cmd => cmd, async () => {
|
|
148
|
+
await TestRepository.gc();
|
|
149
|
+
})
|
|
150
|
+
.demandCommand(1, 'You must supply a command')
|
|
151
|
+
.help()
|
|
152
|
+
.showHelpOnFail(false)
|
|
153
|
+
.parse();
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
async function validateDirectory(args: {
|
|
157
|
+
DIRECTORY: string;
|
|
158
|
+
}) {
|
|
159
|
+
if (!await fs.pathExists(path.join(args.DIRECTORY, 'build.json'))) {
|
|
160
|
+
throw new Error(`${args.DIRECTORY} does not look like a CDK dist directory (build.json missing)`);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
async function doLogin(repo: TestRepository, usageDir: UsageDir, args: {
|
|
165
|
+
npm?: boolean;
|
|
166
|
+
python?: boolean;
|
|
167
|
+
java?: boolean;
|
|
168
|
+
dotnet?: boolean;
|
|
169
|
+
}) {
|
|
170
|
+
const login = await repo.loginInformation();
|
|
171
|
+
|
|
172
|
+
const oldEnv = await usageDir.currentEnv();
|
|
173
|
+
|
|
174
|
+
await usageDir.clean();
|
|
175
|
+
await usageDir.addToEnv({
|
|
176
|
+
CODEARTIFACT_REPO: login.repositoryName,
|
|
177
|
+
});
|
|
178
|
+
|
|
179
|
+
if (oldEnv.BUILD_VERSION) {
|
|
180
|
+
await usageDir.addToEnv({
|
|
181
|
+
BUILD_VERSION: oldEnv.BUILD_VERSION,
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
const doRepo = whichRepos(args);
|
|
186
|
+
|
|
187
|
+
await doRepo.npm(() => npmLogin(login, usageDir));
|
|
188
|
+
await doRepo.python(() => pypiLogin(login, usageDir));
|
|
189
|
+
await doRepo.java(() => mavenLogin(login, usageDir));
|
|
190
|
+
await doRepo.dotnet(() => nugetLogin(login, usageDir));
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
async function publish(repo: TestRepository, usageDir: UsageDir, args: {
|
|
194
|
+
DIRECTORY: string;
|
|
195
|
+
npm?: boolean;
|
|
196
|
+
python?: boolean;
|
|
197
|
+
java?: boolean;
|
|
198
|
+
dotnet?: boolean;
|
|
199
|
+
regression?: boolean;
|
|
200
|
+
}) {
|
|
201
|
+
const directory = `${args.DIRECTORY}`;
|
|
202
|
+
const login = await repo.loginInformation();
|
|
203
|
+
|
|
204
|
+
const doRepo = whichRepos(args);
|
|
205
|
+
|
|
206
|
+
const buildJson = await fs.readJson(path.join(directory, 'build.json'));
|
|
207
|
+
await usageDir.addToEnv({
|
|
208
|
+
BUILD_VERSION: buildJson.version,
|
|
209
|
+
});
|
|
210
|
+
|
|
211
|
+
await doRepo.npm(async () => {
|
|
212
|
+
header('NPM');
|
|
213
|
+
await uploadNpmPackages(glob.sync(path.join(directory, 'js', '*.tgz')), login, usageDir);
|
|
214
|
+
});
|
|
215
|
+
|
|
216
|
+
await doRepo.python(async () => {
|
|
217
|
+
header('Python');
|
|
218
|
+
await uploadPythonPackages(glob.sync(path.join(directory, 'python', '*')), login);
|
|
219
|
+
});
|
|
220
|
+
|
|
221
|
+
await doRepo.java(async () => {
|
|
222
|
+
header('Java');
|
|
223
|
+
await uploadJavaPackages(glob.sync(path.join(directory, 'java', '**', '*.pom')), login, usageDir);
|
|
224
|
+
});
|
|
225
|
+
|
|
226
|
+
await doRepo.dotnet(async () => {
|
|
227
|
+
header('.NET');
|
|
228
|
+
await uploadDotnetPackages(glob.sync(path.join(directory, 'dotnet', '**', '*.nupkg')), usageDir);
|
|
229
|
+
});
|
|
230
|
+
|
|
231
|
+
if (args.regression) {
|
|
232
|
+
console.log('🛍 Configuring packages for upstream versions');
|
|
233
|
+
await repo.markAllUpstreamAllow();
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
function whichRepos(args: {
|
|
238
|
+
npm?: boolean;
|
|
239
|
+
python?: boolean;
|
|
240
|
+
java?: boolean;
|
|
241
|
+
dotnet?: boolean;
|
|
242
|
+
}) {
|
|
243
|
+
const all = args.npm === undefined && args.python === undefined && args.java === undefined && args.dotnet === undefined;
|
|
244
|
+
|
|
245
|
+
const invoke = (block: () => Promise<void>) => block();
|
|
246
|
+
const skip = () => { };
|
|
247
|
+
|
|
248
|
+
return {
|
|
249
|
+
npm: args.npm || all ? invoke : skip,
|
|
250
|
+
python: args.python || all ? invoke : skip,
|
|
251
|
+
java: args.java || all ? invoke : skip,
|
|
252
|
+
dotnet: args.dotnet || all ? invoke : skip,
|
|
253
|
+
};
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
function header(caption: string) {
|
|
257
|
+
console.log('');
|
|
258
|
+
console.log('/'.repeat(70));
|
|
259
|
+
console.log(`// ${caption}`);
|
|
260
|
+
console.log('');
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
main().catch(e => {
|
|
264
|
+
// eslint-disable-next-line no-console
|
|
265
|
+
console.error(e);
|
|
266
|
+
process.exitCode = 1;
|
|
267
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const path = require("path");
|
|
4
|
+
// eslint-disable-next-line no-console
|
|
5
|
+
console.log(path.resolve(__dirname, '..', '..'));
|
|
6
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC1yb290LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsidGVzdC1yb290LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsNkJBQTZCO0FBQzdCLHNDQUFzQztBQUN0QyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG5jb25zb2xlLmxvZyhwYXRoLnJlc29sdmUoX19kaXJuYW1lLCAnLi4nLCAnLi4nKSk7XG4iXX0=
|
package/package.json
CHANGED
|
@@ -82,12 +82,14 @@
|
|
|
82
82
|
"fs-extra": "^9",
|
|
83
83
|
"glob": "^7",
|
|
84
84
|
"jest": "^29",
|
|
85
|
+
"jest-junit": "^15",
|
|
85
86
|
"make-runnable": "^1",
|
|
86
87
|
"mockttp": "^3",
|
|
87
88
|
"npm": "^8",
|
|
88
89
|
"p-queue": "^6",
|
|
89
90
|
"semver": "^7",
|
|
90
91
|
"sinon": "^9",
|
|
92
|
+
"ts-jest": "^29",
|
|
91
93
|
"ts-mock-imports": "^1",
|
|
92
94
|
"yaml": "1",
|
|
93
95
|
"yargs": "^17"
|
|
@@ -105,7 +107,7 @@
|
|
|
105
107
|
"publishConfig": {
|
|
106
108
|
"access": "public"
|
|
107
109
|
},
|
|
108
|
-
"version": "3.0.
|
|
110
|
+
"version": "3.0.1",
|
|
109
111
|
"types": "lib/index.d.ts",
|
|
110
112
|
"//": "~~ Generated by projen. To modify, edit .projenrc.js and run \"npx projen\"."
|
|
111
113
|
}
|