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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (97) hide show
  1. package/.eslintrc.js +9 -0
  2. package/LICENSE +2 -1
  3. package/bin/query-github +1 -1
  4. package/bin/query-github.js +3 -3
  5. package/bin/query-github.ts +56 -0
  6. package/bin/run-suite +1 -1
  7. package/bin/run-suite.js +3 -3
  8. package/bin/run-suite.ts +140 -0
  9. package/bin/stage-distribution +1 -1
  10. package/bin/stage-distribution.js +3 -2
  11. package/bin/stage-distribution.ts +267 -0
  12. package/bin/test-root +1 -1
  13. package/bin/test-root.ts +3 -0
  14. package/lib/aws.js +9 -6
  15. package/lib/aws.ts +263 -0
  16. package/lib/cli/query-github.d.ts +1 -0
  17. package/lib/cli/query-github.js +54 -0
  18. package/lib/cli/query-github.ts +56 -0
  19. package/lib/cli/run-suite.d.ts +1 -0
  20. package/lib/cli/run-suite.js +131 -0
  21. package/lib/cli/run-suite.ts +140 -0
  22. package/lib/cli/stage-distribution.d.ts +1 -0
  23. package/lib/cli/stage-distribution.js +217 -0
  24. package/lib/cli/stage-distribution.ts +267 -0
  25. package/lib/cli/test-root.d.ts +1 -0
  26. package/lib/cli/test-root.js +6 -0
  27. package/lib/cli/test-root.ts +3 -0
  28. package/lib/corking.ts +33 -0
  29. package/lib/eventually.js +3 -3
  30. package/lib/eventually.ts +42 -0
  31. package/lib/files.js +3 -2
  32. package/lib/files.ts +80 -0
  33. package/lib/github.js +6 -5
  34. package/lib/github.ts +43 -0
  35. package/lib/index.ts +13 -0
  36. package/lib/integ-test.ts +81 -0
  37. package/lib/lists.ts +9 -0
  38. package/lib/memoize.ts +14 -0
  39. package/lib/npm.ts +41 -0
  40. package/lib/package-sources/release-source.js +3 -2
  41. package/lib/package-sources/release-source.ts +81 -0
  42. package/lib/package-sources/repo-source.ts +111 -0
  43. package/lib/package-sources/repo-tools/npm.js +5 -4
  44. package/lib/package-sources/repo-tools/npm.ts +48 -0
  45. package/lib/package-sources/source.ts +35 -0
  46. package/lib/package-sources/subprocess.ts +15 -0
  47. package/lib/resource-pool.js +2 -2
  48. package/lib/resource-pool.ts +140 -0
  49. package/lib/resources.ts +4 -0
  50. package/lib/shell.js +8 -5
  51. package/lib/shell.ts +168 -0
  52. package/lib/staging/codeartifact.js +11 -8
  53. package/lib/staging/codeartifact.ts +387 -0
  54. package/lib/staging/maven.js +5 -3
  55. package/lib/staging/maven.ts +95 -0
  56. package/lib/staging/npm.ts +62 -0
  57. package/lib/staging/nuget.ts +75 -0
  58. package/lib/staging/parallel-shell.js +2 -2
  59. package/lib/staging/parallel-shell.ts +51 -0
  60. package/lib/staging/pypi.ts +50 -0
  61. package/lib/staging/usage-dir.ts +99 -0
  62. package/lib/with-aws.js +3 -2
  63. package/lib/with-aws.ts +67 -0
  64. package/lib/with-cdk-app.js +23 -14
  65. package/lib/with-cdk-app.ts +742 -0
  66. package/lib/with-cli-lib.ts +134 -0
  67. package/lib/with-packages.ts +15 -0
  68. package/lib/with-sam.js +7 -4
  69. package/lib/with-sam.ts +288 -0
  70. package/lib/with-temporary-directory.ts +35 -0
  71. package/lib/with-timeout.ts +33 -0
  72. package/lib/xpmutex.js +2 -2
  73. package/lib/xpmutex.ts +218 -0
  74. package/package.json +86 -62
  75. package/resources/cloud-assemblies/0.36.0/cdk.out +1 -0
  76. package/resources/cloud-assemblies/1.10.0-lookup-default-vpc/cdk.out +1 -0
  77. package/resources/cloud-assemblies/1.10.0-request-azs/cdk.out +1 -0
  78. package/tests/cli-integ-tests/bootstrapping.integtest.js +22 -13
  79. package/tests/cli-integ-tests/bootstrapping.integtest.ts +493 -0
  80. package/tests/cli-integ-tests/cli-lib.integtest.js +3 -2
  81. package/tests/cli-integ-tests/cli-lib.integtest.ts +90 -0
  82. package/tests/cli-integ-tests/cli.integtest.js +76 -49
  83. package/tests/cli-integ-tests/cli.integtest.ts +2874 -0
  84. package/tests/cli-integ-tests/garbage-collection.integtest.js +2 -2
  85. package/tests/cli-integ-tests/garbage-collection.integtest.ts +392 -0
  86. package/tests/init-csharp/init-csharp.integtest.ts +15 -0
  87. package/tests/init-fsharp/init-fsharp.integtest.ts +15 -0
  88. package/tests/init-go/init-go.integtest.ts +23 -0
  89. package/tests/init-java/init-java.integtest.ts +14 -0
  90. package/tests/init-javascript/init-javascript.integtest.ts +59 -0
  91. package/tests/init-python/init-python.integtest.ts +20 -0
  92. package/tests/init-typescript-app/init-typescript-app.integtest.ts +66 -0
  93. package/tests/init-typescript-lib/init-typescript-lib.integtest.ts +13 -0
  94. package/tests/tool-integrations/amplify.integtest.ts +43 -0
  95. package/tests/tool-integrations/with-tool-context.ts +14 -0
  96. package/tests/uberpackage/uberpackage.integtest.ts +11 -0
  97. package/resources/cdk-apps/cfn-include-app/.gitignore +0 -1
@@ -0,0 +1,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/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?.interval ? options.interval : DEFAULT_INTERVAL,
19
- maxAttempts: options?.maxAttempts ? options.maxAttempts : DEFAULT_MAX_ATTEMPTS,
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZlbnR1YWxseS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImV2ZW50dWFsbHkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFTQSxNQUFNLElBQUksR0FBRyxDQUFDLEVBQVUsRUFBaUIsRUFBRSxDQUFDLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDOUYsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUM7QUFDOUIsTUFBTSxvQkFBb0IsR0FBRyxFQUFFLENBQUM7QUFFaEM7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSxVQUFVLEdBQUcsS0FBSyxFQUFLLElBQXNCLEVBQUUsT0FBMkIsRUFBYyxFQUFFO0lBQzlGLE1BQU0sSUFBSSxHQUFHO1FBQ1gsUUFBUSxFQUFFLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLGdCQUFnQjtRQUNqRSxXQUFXLEVBQUUsT0FBTyxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsb0JBQW9CO0tBQy9FLENBQUM7SUFFRixPQUFPLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUMvQixJQUFJLENBQUM7WUFDSCxPQUFPLE1BQU0sSUFBSSxFQUFFLENBQUM7UUFDdEIsQ0FBQztRQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7WUFDYixJQUFJLElBQUksQ0FBQyxXQUFXLElBQUksQ0FBQztnQkFBRSxNQUFNLEdBQUcsQ0FBQztRQUN2QyxDQUFDO1FBQ0QsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzVCLENBQUM7SUFFRCxNQUFNLElBQUksS0FBSyxDQUFDLG1DQUFtQyxDQUFDLENBQUM7QUFDdkQsQ0FBQyxDQUFDO0FBRUYsa0JBQWUsVUFBVSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAcGFyYW0gbWF4QXR0ZW1wdHMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGF0dGVtcHRzXG4gKiBAcGFyYW0gaW50ZXJ2YWwgaW50ZXJ2YWwgaW4gbWlsbGlzZWNvbmRzIHRvIG9ic2VydmUgYmV0d2VlbiBhdHRlbXB0c1xuICovXG5leHBvcnQgdHlwZSBFdmVudHVhbGx5T3B0aW9ucyA9IHtcbiAgbWF4QXR0ZW1wdHM/OiBudW1iZXI7XG4gIGludGVydmFsPzogbnVtYmVyO1xufTtcblxuY29uc3Qgd2FpdCA9IChtczogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiA9PiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtcykpO1xuY29uc3QgREVGQVVMVF9JTlRFUlZBTCA9IDEwMDA7XG5jb25zdCBERUZBVUxUX01BWF9BVFRFTVBUUyA9IDEwO1xuXG4vKipcbiAqIFJ1bnMgYSBmdW5jdGlvbiBvbiBhbiBpbnRlcnZhbCB1bnRpbCB0aGUgbWF4aW11bSBudW1iZXIgb2YgYXR0ZW1wdHMgaGFzXG4gKiBiZWVuIHJlYWNoZWQuXG4gKlxuICogRGVmYXVsdCBpbnRlcnZhbCA9IDEwMDAgbWlsbGlzZWNvbmRzXG4gKiBEZWZhdWx0IG1heEF0dGVtcHRzID0gMTBcbiAqXG4gKiBAcGFyYW0gZm4gZnVuY3Rpb24gdG8gcnVuXG4gKiBAcGFyYW0gb3B0aW9ucyBFdmVudHVhbGx5T3B0aW9uc1xuICovXG5jb25zdCBldmVudHVhbGx5ID0gYXN5bmMgPFQ+KGNhbGw6ICgpID0+IFByb21pc2U8VD4sIG9wdGlvbnM/OiBFdmVudHVhbGx5T3B0aW9ucyk6IFByb21pc2U8VD4gPT4ge1xuICBjb25zdCBvcHRzID0ge1xuICAgIGludGVydmFsOiBvcHRpb25zPy5pbnRlcnZhbCA/IG9wdGlvbnMuaW50ZXJ2YWwgOiBERUZBVUxUX0lOVEVSVkFMLFxuICAgIG1heEF0dGVtcHRzOiBvcHRpb25zPy5tYXhBdHRlbXB0cyA/IG9wdGlvbnMubWF4QXR0ZW1wdHMgOiBERUZBVUxUX01BWF9BVFRFTVBUUyxcbiAgfTtcblxuICB3aGlsZSAob3B0cy5tYXhBdHRlbXB0cy0tID49IDApIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGNhbGwoKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGlmIChvcHRzLm1heEF0dGVtcHRzIDw9IDApIHRocm93IGVycjtcbiAgICB9XG4gICAgYXdhaXQgd2FpdChvcHRzLmludGVydmFsKTtcbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcignQW4gdW5leHBlY3RlZCBlcnJvciBoYXMgb2NjdXJyZWQuJyk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBldmVudHVhbGx5O1xuIl19
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;