@aws-cdk-testing/cli-integ 2.173.4 → 3.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintrc.js +9 -0
- package/LICENSE +2 -1
- package/bin/query-github +1 -1
- package/bin/query-github.js +3 -3
- package/bin/query-github.ts +56 -0
- package/bin/run-suite +1 -1
- package/bin/run-suite.js +3 -3
- package/bin/run-suite.ts +140 -0
- package/bin/stage-distribution +1 -1
- package/bin/stage-distribution.js +3 -2
- package/bin/stage-distribution.ts +267 -0
- package/bin/test-root +1 -1
- package/bin/test-root.ts +3 -0
- package/lib/aws.js +9 -6
- package/lib/aws.ts +263 -0
- 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/lib/corking.ts +33 -0
- package/lib/eventually.js +3 -3
- package/lib/eventually.ts +42 -0
- package/lib/files.js +3 -2
- package/lib/files.ts +80 -0
- package/lib/github.js +6 -5
- package/lib/github.ts +43 -0
- package/lib/index.ts +13 -0
- package/lib/integ-test.ts +81 -0
- package/lib/lists.ts +9 -0
- package/lib/memoize.ts +14 -0
- package/lib/npm.ts +41 -0
- package/lib/package-sources/release-source.js +3 -2
- package/lib/package-sources/release-source.ts +81 -0
- package/lib/package-sources/repo-source.ts +111 -0
- package/lib/package-sources/repo-tools/npm.js +5 -4
- package/lib/package-sources/repo-tools/npm.ts +48 -0
- package/lib/package-sources/source.ts +35 -0
- package/lib/package-sources/subprocess.ts +15 -0
- package/lib/resource-pool.js +2 -2
- package/lib/resource-pool.ts +140 -0
- package/lib/resources.ts +4 -0
- package/lib/shell.js +8 -5
- package/lib/shell.ts +168 -0
- package/lib/staging/codeartifact.js +11 -8
- package/lib/staging/codeartifact.ts +387 -0
- package/lib/staging/maven.js +5 -3
- package/lib/staging/maven.ts +95 -0
- package/lib/staging/npm.ts +62 -0
- package/lib/staging/nuget.ts +75 -0
- package/lib/staging/parallel-shell.js +2 -2
- package/lib/staging/parallel-shell.ts +51 -0
- package/lib/staging/pypi.ts +50 -0
- package/lib/staging/usage-dir.ts +99 -0
- package/lib/with-aws.js +3 -2
- package/lib/with-aws.ts +67 -0
- package/lib/with-cdk-app.js +23 -14
- package/lib/with-cdk-app.ts +742 -0
- package/lib/with-cli-lib.ts +134 -0
- package/lib/with-packages.ts +15 -0
- package/lib/with-sam.js +7 -4
- package/lib/with-sam.ts +288 -0
- package/lib/with-temporary-directory.ts +35 -0
- package/lib/with-timeout.ts +33 -0
- package/lib/xpmutex.js +2 -2
- package/lib/xpmutex.ts +218 -0
- package/package.json +86 -62
- package/resources/cloud-assemblies/0.36.0/cdk.out +1 -0
- package/resources/cloud-assemblies/1.10.0-lookup-default-vpc/cdk.out +1 -0
- package/resources/cloud-assemblies/1.10.0-request-azs/cdk.out +1 -0
- package/tests/cli-integ-tests/bootstrapping.integtest.js +22 -13
- package/tests/cli-integ-tests/bootstrapping.integtest.ts +493 -0
- package/tests/cli-integ-tests/cli-lib.integtest.js +3 -2
- package/tests/cli-integ-tests/cli-lib.integtest.ts +90 -0
- package/tests/cli-integ-tests/cli.integtest.js +76 -49
- package/tests/cli-integ-tests/cli.integtest.ts +2874 -0
- package/tests/cli-integ-tests/garbage-collection.integtest.js +2 -2
- package/tests/cli-integ-tests/garbage-collection.integtest.ts +392 -0
- package/tests/init-csharp/init-csharp.integtest.ts +15 -0
- package/tests/init-fsharp/init-fsharp.integtest.ts +15 -0
- package/tests/init-go/init-go.integtest.ts +23 -0
- package/tests/init-java/init-java.integtest.ts +14 -0
- package/tests/init-javascript/init-javascript.integtest.ts +59 -0
- package/tests/init-python/init-python.integtest.ts +20 -0
- package/tests/init-typescript-app/init-typescript-app.integtest.ts +66 -0
- package/tests/init-typescript-lib/init-typescript-lib.integtest.ts +13 -0
- package/tests/tool-integrations/amplify.integtest.ts +43 -0
- package/tests/tool-integrations/with-tool-context.ts +14 -0
- package/tests/uberpackage/uberpackage.integtest.ts +11 -0
- package/resources/cdk-apps/cfn-include-app/.gitignore +0 -1
|
@@ -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/lib/corking.ts
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Routines for corking stdout and stderr
|
|
3
|
+
*/
|
|
4
|
+
import * as stream from 'stream';
|
|
5
|
+
|
|
6
|
+
export class MemoryStream extends stream.Writable {
|
|
7
|
+
private parts = new Array<Buffer>();
|
|
8
|
+
|
|
9
|
+
public _write(chunk: Buffer, _encoding: string, callback: (error?: Error | null) => void): void {
|
|
10
|
+
this.parts.push(chunk);
|
|
11
|
+
callback();
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
public buffer() {
|
|
15
|
+
return Buffer.concat(this.parts);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
public clear() {
|
|
19
|
+
this.parts.splice(0, this.parts.length);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
public async flushTo(strm: NodeJS.WritableStream): Promise<void> {
|
|
23
|
+
const flushed = strm.write(this.buffer());
|
|
24
|
+
if (!flushed) {
|
|
25
|
+
return new Promise(ok => strm.once('drain', ok));
|
|
26
|
+
}
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
public toString() {
|
|
31
|
+
return this.buffer().toString();
|
|
32
|
+
}
|
|
33
|
+
}
|
package/lib/eventually.js
CHANGED
|
@@ -15,8 +15,8 @@ const DEFAULT_MAX_ATTEMPTS = 10;
|
|
|
15
15
|
*/
|
|
16
16
|
const eventually = async (call, options) => {
|
|
17
17
|
const opts = {
|
|
18
|
-
interval: options
|
|
19
|
-
maxAttempts: options
|
|
18
|
+
interval: (options === null || options === void 0 ? void 0 : options.interval) ? options.interval : DEFAULT_INTERVAL,
|
|
19
|
+
maxAttempts: (options === null || options === void 0 ? void 0 : options.maxAttempts) ? options.maxAttempts : DEFAULT_MAX_ATTEMPTS,
|
|
20
20
|
};
|
|
21
21
|
while (opts.maxAttempts-- >= 0) {
|
|
22
22
|
try {
|
|
@@ -31,4 +31,4 @@ const eventually = async (call, options) => {
|
|
|
31
31
|
throw new Error('An unexpected error has occurred.');
|
|
32
32
|
};
|
|
33
33
|
exports.default = eventually;
|
|
34
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
34
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZlbnR1YWxseS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImV2ZW50dWFsbHkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFTQSxNQUFNLElBQUksR0FBRyxDQUFDLEVBQVUsRUFBaUIsRUFBRSxDQUFDLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDOUYsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUM7QUFDOUIsTUFBTSxvQkFBb0IsR0FBRyxFQUFFLENBQUM7QUFFaEM7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSxVQUFVLEdBQUcsS0FBSyxFQUFLLElBQXNCLEVBQUUsT0FBMkIsRUFBYyxFQUFFO0lBQzlGLE1BQU0sSUFBSSxHQUFHO1FBQ1gsUUFBUSxFQUFFLENBQUEsT0FBTyxhQUFQLE9BQU8sdUJBQVAsT0FBTyxDQUFFLFFBQVEsRUFBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCO1FBQ2pFLFdBQVcsRUFBRSxDQUFBLE9BQU8sYUFBUCxPQUFPLHVCQUFQLE9BQU8sQ0FBRSxXQUFXLEVBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLG9CQUFvQjtLQUMvRSxDQUFDO0lBRUYsT0FBTyxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDL0IsSUFBSSxDQUFDO1lBQ0gsT0FBTyxNQUFNLElBQUksRUFBRSxDQUFDO1FBQ3RCLENBQUM7UUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1lBQ2IsSUFBSSxJQUFJLENBQUMsV0FBVyxJQUFJLENBQUM7Z0JBQUUsTUFBTSxHQUFHLENBQUM7UUFDdkMsQ0FBQztRQUNELE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUM1QixDQUFDO0lBRUQsTUFBTSxJQUFJLEtBQUssQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFDO0FBQ3ZELENBQUMsQ0FBQztBQUVGLGtCQUFlLFVBQVUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQHBhcmFtIG1heEF0dGVtcHRzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBhdHRlbXB0c1xuICogQHBhcmFtIGludGVydmFsIGludGVydmFsIGluIG1pbGxpc2Vjb25kcyB0byBvYnNlcnZlIGJldHdlZW4gYXR0ZW1wdHNcbiAqL1xuZXhwb3J0IHR5cGUgRXZlbnR1YWxseU9wdGlvbnMgPSB7XG4gIG1heEF0dGVtcHRzPzogbnVtYmVyO1xuICBpbnRlcnZhbD86IG51bWJlcjtcbn07XG5cbmNvbnN0IHdhaXQgPSAobXM6IG51bWJlcik6IFByb21pc2U8dm9pZD4gPT4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpKTtcbmNvbnN0IERFRkFVTFRfSU5URVJWQUwgPSAxMDAwO1xuY29uc3QgREVGQVVMVF9NQVhfQVRURU1QVFMgPSAxMDtcblxuLyoqXG4gKiBSdW5zIGEgZnVuY3Rpb24gb24gYW4gaW50ZXJ2YWwgdW50aWwgdGhlIG1heGltdW0gbnVtYmVyIG9mIGF0dGVtcHRzIGhhc1xuICogYmVlbiByZWFjaGVkLlxuICpcbiAqIERlZmF1bHQgaW50ZXJ2YWwgPSAxMDAwIG1pbGxpc2Vjb25kc1xuICogRGVmYXVsdCBtYXhBdHRlbXB0cyA9IDEwXG4gKlxuICogQHBhcmFtIGZuIGZ1bmN0aW9uIHRvIHJ1blxuICogQHBhcmFtIG9wdGlvbnMgRXZlbnR1YWxseU9wdGlvbnNcbiAqL1xuY29uc3QgZXZlbnR1YWxseSA9IGFzeW5jIDxUPihjYWxsOiAoKSA9PiBQcm9taXNlPFQ+LCBvcHRpb25zPzogRXZlbnR1YWxseU9wdGlvbnMpOiBQcm9taXNlPFQ+ID0+IHtcbiAgY29uc3Qgb3B0cyA9IHtcbiAgICBpbnRlcnZhbDogb3B0aW9ucz8uaW50ZXJ2YWwgPyBvcHRpb25zLmludGVydmFsIDogREVGQVVMVF9JTlRFUlZBTCxcbiAgICBtYXhBdHRlbXB0czogb3B0aW9ucz8ubWF4QXR0ZW1wdHMgPyBvcHRpb25zLm1heEF0dGVtcHRzIDogREVGQVVMVF9NQVhfQVRURU1QVFMsXG4gIH07XG5cbiAgd2hpbGUgKG9wdHMubWF4QXR0ZW1wdHMtLSA+PSAwKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBjYWxsKCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBpZiAob3B0cy5tYXhBdHRlbXB0cyA8PSAwKSB0aHJvdyBlcnI7XG4gICAgfVxuICAgIGF3YWl0IHdhaXQob3B0cy5pbnRlcnZhbCk7XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoJ0FuIHVuZXhwZWN0ZWQgZXJyb3IgaGFzIG9jY3VycmVkLicpO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgZXZlbnR1YWxseTtcbiJdfQ==
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @param maxAttempts the maximum number of attempts
|
|
3
|
+
* @param interval interval in milliseconds to observe between attempts
|
|
4
|
+
*/
|
|
5
|
+
export type EventuallyOptions = {
|
|
6
|
+
maxAttempts?: number;
|
|
7
|
+
interval?: number;
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
const wait = (ms: number): Promise<void> => new Promise((resolve) => setTimeout(resolve, ms));
|
|
11
|
+
const DEFAULT_INTERVAL = 1000;
|
|
12
|
+
const DEFAULT_MAX_ATTEMPTS = 10;
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Runs a function on an interval until the maximum number of attempts has
|
|
16
|
+
* been reached.
|
|
17
|
+
*
|
|
18
|
+
* Default interval = 1000 milliseconds
|
|
19
|
+
* Default maxAttempts = 10
|
|
20
|
+
*
|
|
21
|
+
* @param fn function to run
|
|
22
|
+
* @param options EventuallyOptions
|
|
23
|
+
*/
|
|
24
|
+
const eventually = async <T>(call: () => Promise<T>, options?: EventuallyOptions): Promise<T> => {
|
|
25
|
+
const opts = {
|
|
26
|
+
interval: options?.interval ? options.interval : DEFAULT_INTERVAL,
|
|
27
|
+
maxAttempts: options?.maxAttempts ? options.maxAttempts : DEFAULT_MAX_ATTEMPTS,
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
while (opts.maxAttempts-- >= 0) {
|
|
31
|
+
try {
|
|
32
|
+
return await call();
|
|
33
|
+
} catch (err) {
|
|
34
|
+
if (opts.maxAttempts <= 0) throw err;
|
|
35
|
+
}
|
|
36
|
+
await wait(opts.interval);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
throw new Error('An unexpected error has occurred.');
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
export default eventually;
|