@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 CHANGED
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env node
2
- require('./query-github.js');
2
+ require('../lib/cli/query-github.js');
package/bin/run-suite CHANGED
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env node
2
- require('./run-suite.js');
2
+ require('../lib/cli/run-suite.js');
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env node
2
- require('./stage-distribution.js');
2
+ require('../lib/cli/stage-distribution.js');
package/bin/test-root CHANGED
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env node
2
- require('./test-root.js');
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=
@@ -0,0 +1,3 @@
1
+ import * as path from 'path';
2
+ // eslint-disable-next-line no-console
3
+ console.log(path.resolve(__dirname, '..', '..'));
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.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
  }