jsii-release 0.2.675 → 0.2.677

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 (35) hide show
  1. package/.projenrc.ts +21 -3
  2. package/README.md +27 -0
  3. package/bin/publib-ca +2 -0
  4. package/lib/bin/publib-ca.d.ts +1 -0
  5. package/lib/bin/publib-ca.js +154 -0
  6. package/lib/codeartifact/codeartifact-cli.d.ts +31 -0
  7. package/lib/codeartifact/codeartifact-cli.js +133 -0
  8. package/lib/codeartifact/codeartifact-repo.d.ts +69 -0
  9. package/lib/codeartifact/codeartifact-repo.js +299 -0
  10. package/lib/codeartifact/display.d.ts +1 -0
  11. package/lib/codeartifact/display.js +11 -0
  12. package/lib/codeartifact/files.d.ts +15 -0
  13. package/lib/codeartifact/files.js +104 -0
  14. package/lib/codeartifact/shell.d.ts +51 -0
  15. package/lib/codeartifact/shell.js +132 -0
  16. package/lib/codeartifact/staging/maven.d.ts +5 -0
  17. package/lib/codeartifact/staging/maven.js +120 -0
  18. package/lib/codeartifact/staging/npm.d.ts +4 -0
  19. package/lib/codeartifact/staging/npm.js +84 -0
  20. package/lib/codeartifact/staging/nuget.d.ts +4 -0
  21. package/lib/codeartifact/staging/nuget.js +76 -0
  22. package/lib/codeartifact/staging/parallel-shell.d.ts +6 -0
  23. package/lib/codeartifact/staging/parallel-shell.js +49 -0
  24. package/lib/codeartifact/staging/pip.d.ts +4 -0
  25. package/lib/codeartifact/staging/pip.js +52 -0
  26. package/lib/codeartifact/usage-dir.d.ts +55 -0
  27. package/lib/codeartifact/usage-dir.js +160 -0
  28. package/lib/help/corking.d.ts +15 -0
  29. package/lib/help/corking.js +57 -0
  30. package/lib/help/shell.d.ts +4 -0
  31. package/lib/help/shell.js +4 -2
  32. package/lib/help/sleep.d.ts +1 -0
  33. package/lib/help/sleep.js +8 -0
  34. package/package.json +13 -2
  35. package/package.json.bak +13 -2
@@ -0,0 +1,299 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CodeArtifactRepo = void 0;
4
+ const client_codeartifact_1 = require("@aws-sdk/client-codeartifact");
5
+ const sleep_1 = require("../help/sleep");
6
+ const COLLECT_BY_TAG = 'collect-by';
7
+ const REPO_LIFETIME_MS = 24 * 3600 * 1000; // One day
8
+ /**
9
+ * A CodeArtifact repository
10
+ */
11
+ class CodeArtifactRepo {
12
+ /**
13
+ * Create a CodeArtifact repo with a random name
14
+ */
15
+ static async createRandom(options = {}) {
16
+ const qualifier = Math.random().toString(36).replace(/[^a-z0-9]+/g, '');
17
+ const repo = new CodeArtifactRepo(`test-${qualifier}`, options);
18
+ await repo.create();
19
+ return repo;
20
+ }
21
+ /**
22
+ * Create a CodeArtifact repository with a given name
23
+ */
24
+ static async createWithName(name, options = {}) {
25
+ const repo = new CodeArtifactRepo(name, options);
26
+ await repo.create();
27
+ return repo;
28
+ }
29
+ /**
30
+ * Reference an existing CodeArtifact repository
31
+ */
32
+ static existing(repositoryName, options = {}) {
33
+ return new CodeArtifactRepo(repositoryName, options);
34
+ }
35
+ /**
36
+ * Garbage collect repositories
37
+ */
38
+ static async gc(options = {}) {
39
+ var _a, _b;
40
+ if (!await CodeArtifactRepo.existing('*dummy*').domainExists()) {
41
+ return;
42
+ }
43
+ const codeArtifact = new client_codeartifact_1.CodeartifactClient({
44
+ credentials: options.credentials,
45
+ });
46
+ let nextToken;
47
+ do {
48
+ const page = await retryThrottled(() => codeArtifact.send(new client_codeartifact_1.ListRepositoriesCommand({ nextToken })));
49
+ for (const repo of (_a = page.repositories) !== null && _a !== void 0 ? _a : []) {
50
+ const tags = await retryThrottled(() => codeArtifact.send(new client_codeartifact_1.ListTagsForResourceCommand({ resourceArn: repo.arn })));
51
+ const collectable = (_b = tags === null || tags === void 0 ? void 0 : tags.tags) === null || _b === void 0 ? void 0 : _b.find(t => t.key === COLLECT_BY_TAG && Number(t.value) < Date.now());
52
+ if (collectable) {
53
+ // eslint-disable-next-line no-console
54
+ console.error('Deleting', repo.name);
55
+ await retryThrottled(() => codeArtifact.send(new client_codeartifact_1.DeleteRepositoryCommand({
56
+ domain: repo.domainName,
57
+ repository: repo.name,
58
+ })));
59
+ }
60
+ }
61
+ nextToken = page.nextToken;
62
+ } while (nextToken);
63
+ }
64
+ constructor(repositoryName, options = {}) {
65
+ this.repositoryName = repositoryName;
66
+ this.npmUpstream = 'npm-upstream';
67
+ this.pypiUpstream = 'pypi-upstream';
68
+ this.nugetUpstream = 'nuget-upstream';
69
+ this.mavenUpstream = 'maven-upstream';
70
+ this.domain = CodeArtifactRepo.DEFAULT_DOMAIN;
71
+ this.codeArtifact = new client_codeartifact_1.CodeartifactClient({ credentials: options.credentials });
72
+ }
73
+ /**
74
+ * Create the repository
75
+ */
76
+ async create() {
77
+ await this.ensureDomain();
78
+ await this.ensureUpstreams();
79
+ await this.ensureRepository(this.repositoryName, {
80
+ description: 'Testing repository',
81
+ upstreams: [
82
+ this.npmUpstream,
83
+ this.pypiUpstream,
84
+ this.nugetUpstream,
85
+ this.mavenUpstream,
86
+ ],
87
+ tags: {
88
+ [COLLECT_BY_TAG]: `${Date.now() + REPO_LIFETIME_MS}`,
89
+ },
90
+ });
91
+ }
92
+ /**
93
+ * Absorb old login information
94
+ */
95
+ setLoginInformation(loginInfo) {
96
+ if (loginInfo.repositoryName !== this.repositoryName) {
97
+ throw new Error(`This login info seems to be for a different repo. '${this.repositoryName}' != '${loginInfo.repositoryName}'`);
98
+ }
99
+ this._loginInformation = loginInfo;
100
+ }
101
+ async login() {
102
+ var _a, _b;
103
+ if (this._loginInformation) {
104
+ return this._loginInformation;
105
+ }
106
+ const durationSeconds = 12 * 3600;
107
+ const authToken = await this.send(new client_codeartifact_1.GetAuthorizationTokenCommand({ domain: this.domain, durationSeconds }));
108
+ this._loginInformation = {
109
+ // eslint-disable-next-line max-len
110
+ authToken: authToken.authorizationToken,
111
+ expirationTimeMs: (_b = (_a = authToken.expiration) === null || _a === void 0 ? void 0 : _a.getTime()) !== null && _b !== void 0 ? _b : (Date.now() + durationSeconds * 1000),
112
+ repositoryName: this.repositoryName,
113
+ npmEndpoint: (await this.send(new client_codeartifact_1.GetRepositoryEndpointCommand({ domain: this.domain, repository: this.repositoryName, format: 'npm' }))).repositoryEndpoint,
114
+ mavenEndpoint: (await this.send(new client_codeartifact_1.GetRepositoryEndpointCommand({ domain: this.domain, repository: this.repositoryName, format: 'maven' }))).repositoryEndpoint,
115
+ nugetEndpoint: (await this.send(new client_codeartifact_1.GetRepositoryEndpointCommand({ domain: this.domain, repository: this.repositoryName, format: 'nuget' }))).repositoryEndpoint,
116
+ pypiEndpoint: (await this.send(new client_codeartifact_1.GetRepositoryEndpointCommand({ domain: this.domain, repository: this.repositoryName, format: 'pypi' }))).repositoryEndpoint,
117
+ };
118
+ return this._loginInformation;
119
+ }
120
+ async delete() {
121
+ try {
122
+ await this.send(new client_codeartifact_1.DeleteRepositoryCommand({
123
+ domain: this.domain,
124
+ repository: this.repositoryName,
125
+ }));
126
+ // eslint-disable-next-line no-console
127
+ console.error('Deleted', this.repositoryName);
128
+ }
129
+ catch (e) {
130
+ if (!isResourceNotFoundException(e)) {
131
+ throw e;
132
+ }
133
+ // Okay
134
+ }
135
+ }
136
+ /**
137
+ * List all packages and mark them as "allow upstream versions".
138
+ *
139
+ * If we don't do this and we publish `foo@2.3.4-rc.0`, then we can't
140
+ * download `foo@2.3.0` anymore because by default CodeArtifact will
141
+ * block different versions from the same package.
142
+ */
143
+ async markAllUpstreamAllow() {
144
+ for await (const pkg of this.listPackages({ upstream: 'BLOCK' })) {
145
+ await this.send(new client_codeartifact_1.PutPackageOriginConfigurationCommand({
146
+ domain: this.domain,
147
+ repository: this.repositoryName,
148
+ format: pkg.format,
149
+ package: pkg.package,
150
+ namespace: pkg.namespace,
151
+ restrictions: {
152
+ publish: 'ALLOW',
153
+ upstream: 'ALLOW',
154
+ },
155
+ }));
156
+ }
157
+ }
158
+ async ensureDomain() {
159
+ if (await this.domainExists()) {
160
+ return;
161
+ }
162
+ await this.send(new client_codeartifact_1.CreateDomainCommand({
163
+ domain: this.domain,
164
+ tags: [{ key: 'testing', value: 'true' }],
165
+ }));
166
+ }
167
+ async ensureUpstreams() {
168
+ await this.ensureRepository(this.npmUpstream, {
169
+ description: 'The upstream repository for NPM',
170
+ external: 'public:npmjs',
171
+ });
172
+ await this.ensureRepository(this.mavenUpstream, {
173
+ description: 'The upstream repository for Maven',
174
+ external: 'public:maven-central',
175
+ });
176
+ await this.ensureRepository(this.nugetUpstream, {
177
+ description: 'The upstream repository for NuGet',
178
+ external: 'public:nuget-org',
179
+ });
180
+ await this.ensureRepository(this.pypiUpstream, {
181
+ description: 'The upstream repository for PyPI',
182
+ external: 'public:pypi',
183
+ });
184
+ }
185
+ async ensureRepository(name, options) {
186
+ var _a;
187
+ if (await this.repositoryExists(name)) {
188
+ return;
189
+ }
190
+ await this.send(new client_codeartifact_1.CreateRepositoryCommand({
191
+ domain: this.domain,
192
+ repository: name,
193
+ description: options === null || options === void 0 ? void 0 : options.description,
194
+ upstreams: (_a = options === null || options === void 0 ? void 0 : options.upstreams) === null || _a === void 0 ? void 0 : _a.map(repositoryName => ({ repositoryName })),
195
+ tags: (options === null || options === void 0 ? void 0 : options.tags) ? Object.entries(options.tags).map(([key, value]) => ({ key, value })) : undefined,
196
+ }));
197
+ if (options === null || options === void 0 ? void 0 : options.external) {
198
+ const externalConnection = options.external;
199
+ await retry(() => this.send(new client_codeartifact_1.AssociateExternalConnectionCommand({
200
+ domain: this.domain,
201
+ repository: name,
202
+ externalConnection,
203
+ })));
204
+ }
205
+ }
206
+ async domainExists() {
207
+ try {
208
+ await this.send(new client_codeartifact_1.DescribeDomainCommand({ domain: this.domain }));
209
+ return true;
210
+ }
211
+ catch (e) {
212
+ if (!isResourceNotFoundException(e)) {
213
+ throw e;
214
+ }
215
+ return false;
216
+ }
217
+ }
218
+ async repositoryExists(name) {
219
+ try {
220
+ await this.send(new client_codeartifact_1.DescribeRepositoryCommand({ domain: this.domain, repository: name }));
221
+ return true;
222
+ }
223
+ catch (e) {
224
+ if (!isResourceNotFoundException(e)) {
225
+ throw e;
226
+ }
227
+ return false;
228
+ }
229
+ }
230
+ async *listPackages(filter = {}) {
231
+ var _a;
232
+ let response = await this.send(new client_codeartifact_1.ListPackagesCommand({
233
+ domain: this.domain,
234
+ repository: this.repositoryName,
235
+ ...filter,
236
+ }));
237
+ while (true) {
238
+ for (const p of (_a = response.packages) !== null && _a !== void 0 ? _a : []) {
239
+ yield p;
240
+ }
241
+ if (!response.nextToken) {
242
+ break;
243
+ }
244
+ response = await this.send(new client_codeartifact_1.ListPackagesCommand({
245
+ domain: this.domain,
246
+ repository: this.repositoryName,
247
+ ...filter,
248
+ nextToken: response.nextToken,
249
+ }));
250
+ }
251
+ }
252
+ // eslint-disable-next-line max-len
253
+ send(command) {
254
+ return retryThrottled(() => this.codeArtifact.send(command));
255
+ }
256
+ }
257
+ exports.CodeArtifactRepo = CodeArtifactRepo;
258
+ CodeArtifactRepo.DEFAULT_DOMAIN = 'publib-ca';
259
+ async function retry(block) {
260
+ let attempts = 3;
261
+ while (true) {
262
+ try {
263
+ return await block();
264
+ }
265
+ catch (e) {
266
+ if (attempts-- === 0) {
267
+ throw e;
268
+ }
269
+ // eslint-disable-next-line no-console
270
+ console.debug(e.message);
271
+ await (0, sleep_1.sleep)(500);
272
+ }
273
+ }
274
+ }
275
+ async function retryThrottled(block) {
276
+ let time = 100;
277
+ let attempts = 15;
278
+ while (true) {
279
+ try {
280
+ return await block();
281
+ }
282
+ catch (e) {
283
+ // eslint-disable-next-line no-console
284
+ console.debug(e.message);
285
+ if (e.code !== 'ThrottlingException') {
286
+ throw e;
287
+ }
288
+ if (attempts-- === 0) {
289
+ throw e;
290
+ }
291
+ await (0, sleep_1.sleep)(Math.floor(Math.random() * time));
292
+ time *= 2;
293
+ }
294
+ }
295
+ }
296
+ function isResourceNotFoundException(x) {
297
+ return x instanceof client_codeartifact_1.ResourceNotFoundException;
298
+ }
299
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29kZWFydGlmYWN0LXJlcG8uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29kZWFydGlmYWN0L2NvZGVhcnRpZmFjdC1yZXBvLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHNFQUFnYztBQUVoYyx5Q0FBc0M7QUFFdEMsTUFBTSxjQUFjLEdBQUcsWUFBWSxDQUFDO0FBQ3BDLE1BQU0sZ0JBQWdCLEdBQUcsRUFBRSxHQUFHLElBQUksR0FBRyxJQUFJLENBQUMsQ0FBQyxVQUFVO0FBTXJEOztHQUVHO0FBQ0gsTUFBYSxnQkFBZ0I7SUFHM0I7O09BRUc7SUFDSSxNQUFNLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxVQUFtQyxFQUFFO1FBQ3BFLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLGFBQWEsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUV4RSxNQUFNLElBQUksR0FBRyxJQUFJLGdCQUFnQixDQUFDLFFBQVEsU0FBUyxFQUFFLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDaEUsTUFBTSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDcEIsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQ7O09BRUc7SUFDSSxNQUFNLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxJQUFZLEVBQUUsVUFBbUMsRUFBRTtRQUNwRixNQUFNLElBQUksR0FBRyxJQUFJLGdCQUFnQixDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNqRCxNQUFNLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNwQixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRDs7T0FFRztJQUNJLE1BQU0sQ0FBQyxRQUFRLENBQUMsY0FBc0IsRUFBRSxVQUFtQyxFQUFFO1FBQ2xGLE9BQU8sSUFBSSxnQkFBZ0IsQ0FBQyxjQUFjLEVBQUUsT0FBTyxDQUFDLENB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RSxDQUFDO1NBQ3RCO1FBQUMsT0FBTyxDQUFNLEVBQUU7WUFDZixJQUFJLFFBQVEsRUFBRSxLQUFLLENBQUMsRUFBRTtnQkFBRSxNQUFNLENBQUMsQ0FBQzthQUFFO1lBQ2xDLHNDQUFzQztZQUN0QyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUN6QixNQUFNLElBQUEsYUFBSyxFQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQ2xCO0tBQ0Y7QUFDSCxDQUFDO0FBRUQsS0FBSyxVQUFVLGNBQWMsQ0FBSSxLQUF1QjtJQUN0RCxJQUFJLElBQUksR0FBRyxHQUFHLENBQUM7SUFDZixJQUFJLFFBQVEsR0FBRyxFQUFFLENBQUM7SUFDbEIsT0FBTyxJQUFJLEVBQUU7UUFDWCxJQUFJO1lBQ0YsT0FBTyxNQUFNLEtBQUssRUFBRSxDQUFDO1NBQ3RCO1FBQUMsT0FBTyxDQUFNLEVBQUU7WUFDZixzQ0FBc0M7WUFDdEMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDekIsSUFBSSxDQUFDLENBQUMsSUFBSSxLQUFLLHFCQUFxQixFQUFFO2dCQUFFLE1BQU0sQ0FBQyxDQUFDO2FBQUU7WUFDbEQsSUFBSSxRQUFRLEVBQUUsS0FBSyxDQUFDLEVBQUU7Z0JBQUUsTUFBTSxDQUFDLENBQUM7YUFBRTtZQUNsQyxNQUFNLElBQUEsYUFBSyxFQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDOUMsSUFBSSxJQUFJLENBQUMsQ0FBQztTQUNYO0tBQ0Y7QUFDSCxDQUFDO0FBWUQsU0FBUywyQkFBMkIsQ0FBQyxDQUFNO0lBQ3pDLE9BQU8sQ0FBQyxZQUFZLCtDQUF5QixDQUFDO0FBQ2hELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBc3NvY2lhdGVFeHRlcm5hbENvbm5lY3Rpb25Db21tYW5kLCBDb2RlYXJ0aWZhY3RDbGllbnQsIENyZWF0ZURvbWFpbkNvbW1hbmQsIENyZWF0ZVJlcG9zaXRvcnlDb21tYW5kLCBEZWxldGVSZXBvc2l0b3J5Q29tbWFuZCwgRGVzY3JpYmVEb21haW5Db21tYW5kLCBEZXNjcmliZVJlcG9zaXRvcnlDb21tYW5kLCBHZXRBdXRob3JpemF0aW9uVG9rZW5Db21tYW5kLCBHZXRSZXBvc2l0b3J5RW5kcG9pbnRDb21tYW5kLCBMaXN0UGFja2FnZXNDb21tYW5kLCBMaXN0UGFja2FnZXNDb21tYW5kSW5wdXQsIExpc3RSZXBvc2l0b3JpZXNDb21tYW5kLCBMaXN0VGFnc0ZvclJlc291cmNlQ29tbWFuZCwgUHV0UGFja2FnZU9yaWdpbkNvbmZpZ3VyYXRpb25Db21tYW5kLCBSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uIH0gZnJvbSAnQGF3cy1zZGsvY2xpZW50LWNvZGVhcnRpZmFjdCc7XG5pbXBvcnQgeyBBd3NDcmVkZW50aWFsSWRlbnRpdHlQcm92aWRlciwgQ29tbWFuZCwgTWV0YWRhdGFCZWFyZXIgfSBmcm9tICdAYXdzLXNkay90eXBlcyc7XG5pbXBvcnQgeyBzbGVlcCB9IGZyb20gJy4uL2hlbHAvc2xlZXAnO1xuXG5jb25zdCBDT0xMRUNUX0JZX1RBRyA9ICdjb2xsZWN0LWJ5JztcbmNvbnN0IFJFUE9fTElGRVRJTUVfTVMgPSAyNCAqIDM2MDAgKiAxMDAwOyAvLyBPbmUgZGF5XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29kZUFydGlmYWN0UmVwb09wdGlvbnMge1xuICByZWFkb25seSBjcmVkZW50aWFscz86IEF3c0NyZWRlbnRpYWxJZGVudGl0eVByb3ZpZGVyO1xufVxuXG4vKipcbiAqIEEgQ29kZUFydGlmYWN0IHJlcG9zaXRvcnlcbiAqL1xuZXhwb3J0IGNsYXNzIENvZGVBcnRpZmFjdFJlcG8ge1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IERFRkFVTFRfRE9NQUlOID0gJ3B1YmxpYi1jYSc7XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIENvZGVBcnRpZmFjdCByZXBvIHdpdGggYSByYW5kb20gbmFtZVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBhc3luYyBjcmVhdGVSYW5kb20ob3B0aW9uczogQ29kZUFydGlmYWN0UmVwb09wdGlvbnMgPSB7fSkge1xuICAgIGNvbnN0IHF1YWxpZmllciA9IE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnJlcGxhY2UoL1teYS16MC05XSsvZywgJycpO1xuXG4gICAgY29uc3QgcmVwbyA9IG5ldyBDb2RlQXJ0aWZhY3RSZXBvKGB0ZXN0LSR7cXVhbGlmaWVyfWAsIG9wdGlvbnMpO1xuICAgIGF3YWl0IHJlcG8uY3JlYXRlKCk7XG4gICAgcmV0dXJuIHJlcG87XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgQ29kZUFydGlmYWN0IHJlcG9zaXRvcnkgd2l0aCBhIGdpdmVuIG5hbWVcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgYXN5bmMgY3JlYXRlV2l0aE5hbWUobmFtZTogc3RyaW5nLCBvcHRpb25zOiBDb2RlQXJ0aWZhY3RSZXBvT3B0aW9ucyA9IHt9KSB7XG4gICAgY29uc3QgcmVwbyA9IG5ldyBDb2RlQXJ0aWZhY3RSZXBvKG5hbWUsIG9wdGlvbnMpO1xuICAgIGF3YWl0IHJlcG8uY3JlYXRlKCk7XG4gICAgcmV0dXJuIHJlcG87XG4gIH1cblxuICAvKipcbiAgICogUmVmZXJlbmNlIGFuIGV4aXN0aW5nIENvZGVBcnRpZmFjdCByZXBvc2l0b3J5XG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGV4aXN0aW5nKHJlcG9zaXRvcnlOYW1lOiBzdHJpbmcsIG9wdGlvbnM6IENvZGVBcnRpZmFjdFJlcG9PcHRpb25zID0ge30pIHtcbiAgICByZXR1cm4gbmV3IENvZGVBcnRpZmFjdFJlcG8ocmVwb3NpdG9yeU5hbWUsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdhcmJhZ2UgY29sbGVjdCByZXBvc2l0b3JpZXNcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgYXN5bmMgZ2Mob3B0aW9uczogQ29kZUFydGlmYWN0UmVwb09wdGlvbnMgPSB7fSkge1xuICAgIGlmICghYXdhaXQgQ29kZUFydGlmYWN0UmVwby5leGlzdGluZygnKmR1bW15KicpLmRvbWFpbkV4aXN0cygpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY29kZUFydGlmYWN0ID0gbmV3IENvZGVhcnRpZmFjdENsaWVudCh7XG4gICAgICBjcmVkZW50aWFsczogb3B0aW9ucy5jcmVkZW50aWFscyxcbiAgICB9KTtcblxuICAgIGxldCBuZXh0VG9rZW46IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBkbyB7XG4gICAgICBjb25zdCBwYWdlID0gYXdhaXQgcmV0cnlUaHJvdHRsZWQoKCkgPT4gY29kZUFydGlmYWN0LnNlbmQobmV3IExpc3RSZXBvc2l0b3JpZXNDb21tYW5kKHsgbmV4dFRva2VuIH0pKSk7XG5cbiAgICAgIGZvciAoY29uc3QgcmVwbyBvZiBwYWdlLnJlcG9zaXRvcmllcyA/PyBbXSkge1xuICAgICAgICBjb25zdCB0YWdzID0gYXdhaXQgcmV0cnlUaHJvdHRsZWQoKCkgPT4gY29kZUFydGlmYWN0LnNlbmQobmV3IExpc3RUYWdzRm9yUmVzb3VyY2VDb21tYW5kKHsgcmVzb3VyY2VBcm46IHJlcG8uYXJuISB9KSkpO1xuICAgICAgICBjb25zdCBjb2xsZWN0YWJsZSA9IHRhZ3M/LnRhZ3M/LmZpbmQodCA9PiB0LmtleSA9PT0gQ09MTEVDVF9CWV9UQUcgJiYgTnVtYmVyKHQudmFsdWUpIDwgRGF0ZS5ub3coKSk7XG4gICAgICAgIGlmIChjb2xsZWN0YWJsZSkge1xuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgICAgY29uc29sZS5lcnJvcignRGVsZXRpbmcnLCByZXBvLm5hbWUpO1xuICAgICAgICAgIGF3YWl0IHJldHJ5VGhyb3R0bGVkKCgpID0+IGNvZGVBcnRpZmFjdC5zZW5kKG5ldyBEZWxldGVSZXBvc2l0b3J5Q29tbWFuZCh7XG4gICAgICAgICAgICBkb21haW46IHJlcG8uZG9tYWluTmFtZSEsXG4gICAgICAgICAgICByZXBvc2l0b3J5OiByZXBvLm5hbWUhLFxuICAgICAgICAgIH0pKSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgbmV4dFRva2VuID0gcGFnZS5uZXh0VG9rZW47XG4gICAgfSB3aGlsZSAobmV4dFRva2VuKTtcbiAgfVxuXG4gIHB1YmxpYyByZWFkb25seSBucG1VcHN0cmVhbSA9ICducG0tdXBzdHJlYW0nO1xuICBwdWJsaWMgcmVhZG9ubHkgcHlwaVVwc3RyZWFtID0gJ3B5cGktdXBzdHJlYW0nO1xuICBwdWJsaWMgcmVhZG9ubHkgbnVnZXRVcHN0cmVhbSA9ICdudWdldC11cHN0cmVhbSc7XG4gIHB1YmxpYyByZWFkb25seSBtYXZlblVwc3RyZWFtID0gJ21hdmVuLXVwc3RyZWFtJztcbiAgcHVibGljIHJlYWRvbmx5IGRvbWFpbiA9IENvZGVBcnRpZmFjdFJlcG8uREVGQVVMVF9ET01BSU47XG5cbiAgcHJpdmF0ZSByZWFkb25seSBjb2RlQXJ0aWZhY3Q7XG5cbiAgcHJpdmF0ZSBfbG9naW5JbmZvcm1hdGlvbjogTG9naW5JbmZvcm1hdGlvbiB8IHVuZGVmaW5lZDtcblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyByZWFkb25seSByZXBvc2l0b3J5TmFtZTogc3RyaW5nLFxuICAgIG9wdGlvbnM6IENvZGVBcnRpZmFjdFJlcG9PcHRpb25zID0ge30sXG4gICkge1xuICAgIHRoaXMuY29kZUFydGlmYWN0ID0gbmV3IENvZGVhcnRpZmFjdENsaWVudCh7IGNyZWRlbnRpYWxzOiBvcHRpb25zLmNyZWRlbnRpYWxzIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSB0aGUgcmVwb3NpdG9yeVxuICAgKi9cbiAgcHVibGljIGFzeW5jIGNyZWF0ZSgpIHtcbiAgICBhd2FpdCB0aGlzLmVuc3VyZURvbWFpbigpO1xuICAgIGF3YWl0IHRoaXMuZW5zdXJlVXBzdHJlYW1zKCk7XG5cbiAgICBhd2FpdCB0aGlzLmVuc3VyZVJlcG9zaXRvcnkodGhpcy5yZXBvc2l0b3J5TmFtZSwge1xuICAgICAgZGVzY3JpcHRpb246ICdUZXN0aW5nIHJlcG9zaXRvcnknLFxuICAgICAgdXBzdHJlYW1zOiBbXG4gICAgICAgIHRoaXMubnBtVXBzdHJlYW0sXG4gICAgICAgIHRoaXMucHlwaVVwc3RyZWFtLFxuICAgICAgICB0aGlzLm51Z2V0VXBzdHJlYW0sXG4gICAgICAgIHRoaXMubWF2ZW5VcHN0cmVhbSxcbiAgICAgIF0sXG4gICAgICB0YWdzOiB7XG4gICAgICAgIFtDT0xMRUNUX0JZX1RBR106IGAke0RhdGUubm93KCkgKyBSRVBPX0xJRkVUSU1FX01TfWAsXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFic29yYiBvbGQgbG9naW4gaW5mb3JtYXRpb25cbiAgICovXG4gIHB1YmxpYyBzZXRMb2dpbkluZm9ybWF0aW9uKGxvZ2luSW5mbzogTG9naW5JbmZvcm1hdGlvbikge1xuICAgIGlmIChsb2dpbkluZm8ucmVwb3NpdG9yeU5hbWUgIT09IHRoaXMucmVwb3NpdG9yeU5hbWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVGhpcyBsb2dpbiBpbmZvIHNlZW1zIHRvIGJlIGZvciBhIGRpZmZlcmVudCByZXBvLiAnJHt0aGlzLnJlcG9zaXRvcnlOYW1lfScgIT0gJyR7bG9naW5JbmZvLnJlcG9zaXRvcnlOYW1lfSdgKTtcbiAgICB9XG4gICAgdGhpcy5fbG9naW5JbmZvcm1hdGlvbiA9IGxvZ2luSW5mbztcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBsb2dpbigpOiBQcm9taXNlPExvZ2luSW5mb3JtYXRpb24+IHtcbiAgICBpZiAodGhpcy5fbG9naW5JbmZvcm1hdGlvbikge1xuICAgICAgcmV0dXJuIHRoaXMuX2xvZ2luSW5mb3JtYXRpb247XG4gICAgfVxuXG4gICAgY29uc3QgZHVyYXRpb25TZWNvbmRzID0gMTIgKiAzNjAwO1xuICAgIGNvbnN0IGF1dGhUb2tlbiA9IGF3YWl0IHRoaXMuc2VuZChuZXcgR2V0QXV0aG9yaXphdGlvblRva2VuQ29tbWFuZCh7IGRvbWFpbjogdGhpcy5kb21haW4sIGR1cmF0aW9uU2Vjb25kcyB9KSk7XG5cbiAgICB0aGlzLl9sb2dpbkluZm9ybWF0aW9uID0ge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1sZW5cbiAgICAgIGF1dGhUb2tlbjogYXV0aFRva2VuLmF1dGhvcml6YXRpb25Ub2tlbiEsXG4gICAgICBleHBpcmF0aW9uVGltZU1zOiBhdXRoVG9rZW4uZXhwaXJhdGlvbj8uZ2V0VGltZSgpID8/IChEYXRlLm5vdygpICsgZHVyYXRpb25TZWNvbmRzICogMTAwMCksXG4gICAgICByZXBvc2l0b3J5TmFtZTogdGhpcy5yZXBvc2l0b3J5TmFtZSxcbiAgICAgIG5wbUVuZHBvaW50OiAoYXdhaXQgdGhpcy5zZW5kKG5ldyBHZXRSZXBvc2l0b3J5RW5kcG9pbnRDb21tYW5kKHsgZG9tYWluOiB0aGlzLmRvbWFpbiwgcmVwb3NpdG9yeTogdGhpcy5yZXBvc2l0b3J5TmFtZSwgZm9ybWF0OiAnbnBtJyB9KSkpLnJlcG9zaXRvcnlFbmRwb2ludCEsXG4gICAgICBtYXZlbkVuZHBvaW50OiAoYXdhaXQgdGhpcy5zZW5kKG5ldyBHZXRSZXBvc2l0b3J5RW5kcG9pbnRDb21tYW5kKHsgZG9tYWluOiB0aGlzLmRvbWFpbiwgcmVwb3NpdG9yeTogdGhpcy5yZXBvc2l0b3J5TmFtZSwgZm9ybWF0OiAnbWF2ZW4nIH0pKSkucmVwb3NpdG9yeUVuZHBvaW50ISxcbiAgICAgIG51Z2V0RW5kcG9pbnQ6IChhd2FpdCB0aGlzLnNlbmQobmV3IEdldFJlcG9zaXRvcnlFbmRwb2ludENvbW1hbmQoeyBkb21haW46IHRoaXMuZG9tYWluLCByZXBvc2l0b3J5OiB0aGlzLnJlcG9zaXRvcnlOYW1lLCBmb3JtYXQ6ICdudWdldCcgfSkpKS5yZXBvc2l0b3J5RW5kcG9pbnQhLFxuICAgICAgcHlwaUVuZHBvaW50OiAoYXdhaXQgdGhpcy5zZW5kKG5ldyBHZXRSZXBvc2l0b3J5RW5kcG9pbnRDb21tYW5kKHsgZG9tYWluOiB0aGlzLmRvbWFpbiwgcmVwb3NpdG9yeTogdGhpcy5yZXBvc2l0b3J5TmFtZSwgZm9ybWF0OiAncHlwaScgfSkpKS5yZXBvc2l0b3J5RW5kcG9pbnQhLFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuX2xvZ2luSW5mb3JtYXRpb247XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZGVsZXRlKCkge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLnNlbmQobmV3IERlbGV0ZVJlcG9zaXRvcnlDb21tYW5kKHtcbiAgICAgICAgZG9tYWluOiB0aGlzLmRvbWFpbixcbiAgICAgICAgcmVwb3NpdG9yeTogdGhpcy5yZXBvc2l0b3J5TmFtZSxcbiAgICAgIH0pKTtcblxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0RlbGV0ZWQnLCB0aGlzLnJlcG9zaXRvcnlOYW1lKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIGlmICghaXNSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uKGUpKSB7IHRocm93IGU7IH1cbiAgICAgIC8vIE9rYXlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTGlzdCBhbGwgcGFja2FnZXMgYW5kIG1hcmsgdGhlbSBhcyBcImFsbG93IHVwc3RyZWFtIHZlcnNpb25zXCIuXG4gICAqXG4gICAqIElmIHdlIGRvbid0IGRvIHRoaXMgYW5kIHdlIHB1Ymxpc2ggYGZvb0AyLjMuNC1yYy4wYCwgdGhlbiB3ZSBjYW4ndFxuICAgKiBkb3dubG9hZCBgZm9vQDIuMy4wYCBhbnltb3JlIGJlY2F1c2UgYnkgZGVmYXVsdCBDb2RlQXJ0aWZhY3Qgd2lsbFxuICAgKiBibG9jayBkaWZmZXJlbnQgdmVyc2lvbnMgZnJvbSB0aGUgc2FtZSBwYWNrYWdlLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIG1hcmtBbGxVcHN0cmVhbUFsbG93KCkge1xuICAgIGZvciBhd2FpdCAoY29uc3QgcGtnIG9mIHRoaXMubGlzdFBhY2thZ2VzKHsgdXBzdHJlYW06ICdCTE9DSycgfSkpIHtcbiAgICAgIGF3YWl0IHRoaXMuc2VuZChuZXcgUHV0UGFja2FnZU9yaWdpbkNvbmZpZ3VyYXRpb25Db21tYW5kKHtcbiAgICAgICAgZG9tYWluOiB0aGlzLmRvbWFpbixcbiAgICAgICAgcmVwb3NpdG9yeTogdGhpcy5yZXBvc2l0b3J5TmFtZSxcblxuICAgICAgICBmb3JtYXQ6IHBrZy5mb3JtYXQhLFxuICAgICAgICBwYWNrYWdlOiBwa2cucGFja2FnZSEsXG4gICAgICAgIG5hbWVzcGFjZTogcGtnLm5hbWVzcGFjZSEsXG4gICAgICAgIHJlc3RyaWN0aW9uczoge1xuICAgICAgICAgIHB1Ymxpc2g6ICdBTExPVycsXG4gICAgICAgICAgdXBzdHJlYW06ICdBTExPVycsXG4gICAgICAgIH0sXG4gICAgICB9KSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBlbnN1cmVEb21haW4oKSB7XG4gICAgaWYgKGF3YWl0IHRoaXMuZG9tYWluRXhpc3RzKCkpIHsgcmV0dXJuOyB9XG4gICAgYXdhaXQgdGhpcy5zZW5kKG5ldyBDcmVhdGVEb21haW5Db21tYW5kKHtcbiAgICAgIGRvbWFpbjogdGhpcy5kb21haW4sXG4gICAgICB0YWdzOiBbeyBrZXk6ICd0ZXN0aW5nJywgdmFsdWU6ICd0cnVlJyB9XSxcbiAgICB9KSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGVuc3VyZVVwc3RyZWFtcygpIHtcbiAgICBhd2FpdCB0aGlzLmVuc3VyZVJlcG9zaXRvcnkodGhpcy5ucG1VcHN0cmVhbSwge1xuICAgICAgZGVzY3JpcHRpb246ICdUaGUgdXBzdHJlYW0gcmVwb3NpdG9yeSBmb3IgTlBNJyxcbiAgICAgIGV4dGVybmFsOiAncHVibGljOm5wbWpzJyxcbiAgICB9KTtcbiAgICBhd2FpdCB0aGlzLmVuc3VyZVJlcG9zaXRvcnkodGhpcy5tYXZlblVwc3RyZWFtLCB7XG4gICAgICBkZXNjcmlwdGlvbjogJ1RoZSB1cHN0cmVhbSByZXBvc2l0b3J5IGZvciBNYXZlbicsXG4gICAgICBleHRlcm5hbDogJ3B1YmxpYzptYXZlbi1jZW50cmFsJyxcbiAgICB9KTtcbiAgICBhd2FpdCB0aGlzLmVuc3VyZVJlcG9zaXRvcnkodGhpcy5udWdldFVwc3RyZWFtLCB7XG4gICAgICBkZXNjcmlwdGlvbjogJ1RoZSB1cHN0cmVhbSByZXBvc2l0b3J5IGZvciBOdUdldCcsXG4gICAgICBleHRlcm5hbDogJ3B1YmxpYzpudWdldC1vcmcnLFxuICAgIH0pO1xuICAgIGF3YWl0IHRoaXMuZW5zdXJlUmVwb3NpdG9yeSh0aGlzLnB5cGlVcHN0cmVhbSwge1xuICAgICAgZGVzY3JpcHRpb246ICdUaGUgdXBzdHJlYW0gcmVwb3NpdG9yeSBmb3IgUHlQSScsXG4gICAgICBleHRlcm5hbDogJ3B1YmxpYzpweXBpJyxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZW5zdXJlUmVwb3NpdG9yeShuYW1lOiBzdHJpbmcsIG9wdGlvbnM/OiB7XG4gICAgcmVhZG9ubHkgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gICAgcmVhZG9ubHkgZXh0ZXJuYWw/OiBzdHJpbmc7XG4gICAgcmVhZG9ubHkgdXBzdHJlYW1zPzogc3RyaW5nW107XG4gICAgcmVhZG9ubHkgdGFncz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIH0pIHtcbiAgICBpZiAoYXdhaXQgdGhpcy5yZXBvc2l0b3J5RXhpc3RzKG5hbWUpKSB7IHJldHVybjsgfVxuXG4gICAgYXdhaXQgdGhpcy5zZW5kKG5ldyBDcmVhdGVSZXBvc2l0b3J5Q29tbWFuZCh7XG4gICAgICBkb21haW46IHRoaXMuZG9tYWluLFxuICAgICAgcmVwb3NpdG9yeTogbmFtZSxcbiAgICAgIGRlc2NyaXB0aW9uOiBvcHRpb25zPy5kZXNjcmlwdGlvbixcbiAgICAgIHVwc3RyZWFtczogb3B0aW9ucz8udXBzdHJlYW1zPy5tYXAocmVwb3NpdG9yeU5hbWUgPT4gKHsgcmVwb3NpdG9yeU5hbWUgfSkpLFxuICAgICAgdGFnczogb3B0aW9ucz8udGFncyA/IE9iamVjdC5lbnRyaWVzKG9wdGlvbnMudGFncykubWFwKChba2V5LCB2YWx1ZV0pID0+ICh7IGtleSwgdmFsdWUgfSkpIDogdW5kZWZpbmVkLFxuICAgIH0pKTtcblxuICAgIGlmIChvcHRpb25zPy5leHRlcm5hbCkge1xuICAgICAgY29uc3QgZXh0ZXJuYWxDb25uZWN0aW9uID0gb3B0aW9ucy5leHRlcm5hbDtcbiAgICAgIGF3YWl0IHJldHJ5KCgpID0+IHRoaXMuc2VuZChuZXcgQXNzb2NpYXRlRXh0ZXJuYWxDb25uZWN0aW9uQ29tbWFuZCh7XG4gICAgICAgIGRvbWFpbjogdGhpcy5kb21haW4sXG4gICAgICAgIHJlcG9zaXRvcnk6IG5hbWUsXG4gICAgICAgIGV4dGVybmFsQ29ubmVjdGlvbixcbiAgICAgIH0pKSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBkb21haW5FeGlzdHMoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuc2VuZChuZXcgRGVzY3JpYmVEb21haW5Db21tYW5kKHsgZG9tYWluOiB0aGlzLmRvbWFpbiB9KSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIGlmICghaXNSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uKGUpKSB7IHRocm93IGU7IH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJlcG9zaXRvcnlFeGlzdHMobmFtZTogc3RyaW5nKSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuc2VuZChuZXcgRGVzY3JpYmVSZXBvc2l0b3J5Q29tbWFuZCh7IGRvbWFpbjogdGhpcy5kb21haW4sIHJlcG9zaXRvcnk6IG5hbWUgfSkpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICBpZiAoIWlzUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbihlKSkgeyB0aHJvdyBlOyB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyogbGlzdFBhY2thZ2VzKGZpbHRlcjogUGljazxMaXN0UGFja2FnZXNDb21tYW5kSW5wdXQsICd1cHN0cmVhbSd8J3B1Ymxpc2gnfCdmb3JtYXQnPiA9IHt9KSB7XG4gICAgbGV0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5zZW5kKG5ldyBMaXN0UGFja2FnZXNDb21tYW5kKHtcbiAgICAgIGRvbWFpbjogdGhpcy5kb21haW4sXG4gICAgICByZXBvc2l0b3J5OiB0aGlzLnJlcG9zaXRvcnlOYW1lLFxuICAgICAgLi4uZmlsdGVyLFxuICAgIH0pKTtcblxuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBmb3IgKGNvbnN0IHAgb2YgcmVzcG9uc2UucGFja2FnZXMgPz8gW10pIHtcbiAgICAgICAgeWllbGQgcDtcbiAgICAgIH1cblxuICAgICAgaWYgKCFyZXNwb25zZS5uZXh0VG9rZW4pIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIHJlc3BvbnNlID0gYXdhaXQgdGhpcy5zZW5kKG5ldyBMaXN0UGFja2FnZXNDb21tYW5kKHtcbiAgICAgICAgZG9tYWluOiB0aGlzLmRvbWFpbixcbiAgICAgICAgcmVwb3NpdG9yeTogdGhpcy5yZXBvc2l0b3J5TmFtZSxcbiAgICAgICAgLi4uZmlsdGVyLFxuICAgICAgICBuZXh0VG9rZW46IHJlc3BvbnNlLm5leHRUb2tlbixcbiAgICAgIH0pKTtcbiAgICB9XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbWF4LWxlblxuICBwcml2YXRlIHNlbmQ8Q2xpZW50SW5wdXQgZXh0ZW5kcyBvYmplY3QsIElucHV0VHlwZSBleHRlbmRzIENsaWVudElucHV0LCBDbGllbnRPdXRwdXQgZXh0ZW5kcyBNZXRhZGF0YUJlYXJlciwgT3V0cHV0VHlwZSBleHRlbmRzIENsaWVudE91dHB1dD4oY29tbWFuZDogQ29tbWFuZDxDbGllbnRJbnB1dCwgSW5wdXRUeXBlLCBDbGllbnRPdXRwdXQsIE91dHB1dFR5cGUsIGFueT4pOiBQcm9taXNlPE91dHB1dFR5cGU+IHtcbiAgICByZXR1cm4gcmV0cnlUaHJvdHRsZWQoKCkgPT4gdGhpcy5jb2RlQXJ0aWZhY3Quc2VuZChjb21tYW5kIGFzIGFueSkpO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJldHJ5PEE+KGJsb2NrOiAoKSA9PiBQcm9taXNlPEE+KSB7XG4gIGxldCBhdHRlbXB0cyA9IDM7XG4gIHdoaWxlICh0cnVlKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBibG9jaygpO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgaWYgKGF0dGVtcHRzLS0gPT09IDApIHsgdGhyb3cgZTsgfVxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGUuZGVidWcoZS5tZXNzYWdlKTtcbiAgICAgIGF3YWl0IHNsZWVwKDUwMCk7XG4gICAgfVxuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJldHJ5VGhyb3R0bGVkPEE+KGJsb2NrOiAoKSA9PiBQcm9taXNlPEE+KSB7XG4gIGxldCB0aW1lID0gMTAwO1xuICBsZXQgYXR0ZW1wdHMgPSAxNTtcbiAgd2hpbGUgKHRydWUpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGJsb2NrKCk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgY29uc29sZS5kZWJ1ZyhlLm1lc3NhZ2UpO1xuICAgICAgaWYgKGUuY29kZSAhPT0gJ1Rocm90dGxpbmdFeGNlcHRpb24nKSB7IHRocm93IGU7IH1cbiAgICAgIGlmIChhdHRlbXB0cy0tID09PSAwKSB7IHRocm93IGU7IH1cbiAgICAgIGF3YWl0IHNsZWVwKE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIHRpbWUpKTtcbiAgICAgIHRpbWUgKj0gMjtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBMb2dpbkluZm9ybWF0aW9uIHtcbiAgcmVhZG9ubHkgYXV0aFRva2VuOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGV4cGlyYXRpb25UaW1lTXM6IG51bWJlcjtcbiAgcmVhZG9ubHkgcmVwb3NpdG9yeU5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgbnBtRW5kcG9pbnQ6IHN0cmluZztcbiAgcmVhZG9ubHkgbWF2ZW5FbmRwb2ludDogc3RyaW5nO1xuICByZWFkb25seSBudWdldEVuZHBvaW50OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHB5cGlFbmRwb2ludDogc3RyaW5nO1xufVxuXG5mdW5jdGlvbiBpc1Jlc291cmNlTm90Rm91bmRFeGNlcHRpb24oeDogYW55KTogeCBpcyBSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uIHtcbiAgcmV0dXJuIHggaW5zdGFuY2VvZiBSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uO1xufSJdfQ==
@@ -0,0 +1 @@
1
+ export declare function header(caption: string): void;
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.header = void 0;
4
+ function header(caption) {
5
+ console.log('');
6
+ console.log('/'.repeat(70));
7
+ console.log(`// ${caption}`);
8
+ console.log('');
9
+ }
10
+ exports.header = header;
11
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlzcGxheS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb2RlYXJ0aWZhY3QvZGlzcGxheS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxTQUFnQixNQUFNLENBQUMsT0FBZTtJQUNwQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2hCLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzVCLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBQzlCLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDbEIsQ0FBQztBQUxELHdCQUtDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGZ1bmN0aW9uIGhlYWRlcihjYXB0aW9uOiBzdHJpbmcpIHtcbiAgY29uc29sZS5sb2coJycpO1xuICBjb25zb2xlLmxvZygnLycucmVwZWF0KDcwKSk7XG4gIGNvbnNvbGUubG9nKGAvLyAgJHtjYXB0aW9ufWApO1xuICBjb25zb2xlLmxvZygnJyk7XG59Il19
@@ -0,0 +1,15 @@
1
+ export declare function rmFile(filename: string): Promise<void>;
2
+ export declare function addToFile(filename: string, line: string): Promise<void>;
3
+ export declare function writeFile(filename: string, contents: string): Promise<void>;
4
+ export declare function copyDirectoryContents(dir: string, target: string): Promise<void>;
5
+ export declare function findUp(name: string, directory?: string): string | undefined;
6
+ /**
7
+ * Docker-safe home directory
8
+ */
9
+ export declare function homeDir(): string;
10
+ export declare function loadLines(filename: string): Promise<string[]>;
11
+ export declare function writeLines(filename: string, lines: string[]): Promise<void>;
12
+ /**
13
+ * Update a spaceless ini file in place
14
+ */
15
+ export declare function updateIniKey(lines: string[], key: string, value: string): void;
@@ -0,0 +1,104 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ exports.updateIniKey = exports.writeLines = exports.loadLines = exports.homeDir = exports.findUp = exports.copyDirectoryContents = exports.writeFile = exports.addToFile = exports.rmFile = void 0;
27
+ const os = __importStar(require("os"));
28
+ const path = __importStar(require("path"));
29
+ const fs = __importStar(require("fs-extra"));
30
+ async function rmFile(filename) {
31
+ if (await fs.pathExists(filename)) {
32
+ await fs.unlink(filename);
33
+ }
34
+ }
35
+ exports.rmFile = rmFile;
36
+ async function addToFile(filename, line) {
37
+ let contents = await fs.pathExists(filename) ? await fs.readFile(filename, { encoding: 'utf-8' }) : '';
38
+ if (!contents.endsWith('\n')) {
39
+ contents += '\n';
40
+ }
41
+ contents += line + '\n';
42
+ await writeFile(filename, contents);
43
+ }
44
+ exports.addToFile = addToFile;
45
+ async function writeFile(filename, contents) {
46
+ await fs.mkdirp(path.dirname(filename));
47
+ await fs.writeFile(filename, contents, { encoding: 'utf-8' });
48
+ }
49
+ exports.writeFile = writeFile;
50
+ async function copyDirectoryContents(dir, target) {
51
+ for (const file of await fs.readdir(path.join(dir))) {
52
+ await fs.copyFile(path.join(dir, file), path.join(target, file));
53
+ }
54
+ }
55
+ exports.copyDirectoryContents = copyDirectoryContents;
56
+ function findUp(name, directory = process.cwd()) {
57
+ const absoluteDirectory = path.resolve(directory);
58
+ const file = path.join(directory, name);
59
+ if (fs.existsSync(file)) {
60
+ return file;
61
+ }
62
+ const { root } = path.parse(absoluteDirectory);
63
+ if (absoluteDirectory == root) {
64
+ return undefined;
65
+ }
66
+ return findUp(name, path.dirname(absoluteDirectory));
67
+ }
68
+ exports.findUp = findUp;
69
+ /**
70
+ * Docker-safe home directory
71
+ */
72
+ function homeDir() {
73
+ var _a;
74
+ return (_a = os.userInfo().homedir) !== null && _a !== void 0 ? _a : os.homedir();
75
+ }
76
+ exports.homeDir = homeDir;
77
+ async function loadLines(filename) {
78
+ return await fs.pathExists(filename) ? (await fs.readFile(filename, { encoding: 'utf-8' })).trim().split('\n') : [];
79
+ }
80
+ exports.loadLines = loadLines;
81
+ async function writeLines(filename, lines) {
82
+ // Must end in a newline or our bash script won't read it properly
83
+ await fs.writeFile(filename, lines.join('\n') + '\n', { encoding: 'utf-8' });
84
+ }
85
+ exports.writeLines = writeLines;
86
+ /**
87
+ * Update a spaceless ini file in place
88
+ */
89
+ function updateIniKey(lines, key, value) {
90
+ const prefix = `${key}=`;
91
+ let found = false;
92
+ for (let i = 0; i < lines.length; i++) {
93
+ if (lines[i].startsWith(prefix)) {
94
+ lines[i] = prefix + value;
95
+ found = true;
96
+ break;
97
+ }
98
+ }
99
+ if (!found) {
100
+ lines.push(prefix + value);
101
+ }
102
+ }
103
+ exports.updateIniKey = updateIniKey;
104
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29kZWFydGlmYWN0L2ZpbGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsdUNBQXlCO0FBQ3pCLDJDQUE2QjtBQUM3Qiw2Q0FBK0I7QUFFeEIsS0FBSyxVQUFVLE1BQU0sQ0FBQyxRQUFnQjtJQUMzQyxJQUFJLE1BQU0sRUFBRSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsRUFBRTtRQUNqQyxNQUFNLEVBQUUsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7S0FDM0I7QUFDSCxDQUFDO0FBSkQsd0JBSUM7QUFFTSxLQUFLLFVBQVUsU0FBUyxDQUFDLFFBQWdCLEVBQUUsSUFBWTtJQUM1RCxJQUFJLFFBQVEsR0FBRyxNQUFNLEVBQUUsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQ3ZHLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFO1FBQzVCLFFBQVEsSUFBSSxJQUFJLENBQUM7S0FDbEI7SUFDRCxRQUFRLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQztJQUV4QixNQUFNLFNBQVMsQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUM7QUFDdEMsQ0FBQztBQVJELDhCQVFDO0FBRU0sS0FBSyxVQUFVLFNBQVMsQ0FBQyxRQUFnQixFQUFFLFFBQWdCO0lBQ2hFLE1BQU0sRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUFDeEMsTUFBTSxFQUFFLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsRUFBRSxRQUFRLEVB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LE1BQU0sR0FBRyxLQUFLLENBQUMsQ0FBQztLQUM1QjtBQUNILENBQUM7QUFiRCxvQ0FhQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIG9zIGZyb20gJ29zJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgKiBhcyBmcyBmcm9tICdmcy1leHRyYSc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBybUZpbGUoZmlsZW5hbWU6IHN0cmluZykge1xuICBpZiAoYXdhaXQgZnMucGF0aEV4aXN0cyhmaWxlbmFtZSkpIHtcbiAgICBhd2FpdCBmcy51bmxpbmsoZmlsZW5hbWUpO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhZGRUb0ZpbGUoZmlsZW5hbWU6IHN0cmluZywgbGluZTogc3RyaW5nKSB7XG4gIGxldCBjb250ZW50cyA9IGF3YWl0IGZzLnBhdGhFeGlzdHMoZmlsZW5hbWUpID8gYXdhaXQgZnMucmVhZEZpbGUoZmlsZW5hbWUsIHsgZW5jb2Rpbmc6ICd1dGYtOCcgfSkgOiAnJztcbiAgaWYgKCFjb250ZW50cy5lbmRzV2l0aCgnXFxuJykpIHtcbiAgICBjb250ZW50cyArPSAnXFxuJztcbiAgfVxuICBjb250ZW50cyArPSBsaW5lICsgJ1xcbic7XG5cbiAgYXdhaXQgd3JpdGVGaWxlKGZpbGVuYW1lLCBjb250ZW50cyk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB3cml0ZUZpbGUoZmlsZW5hbWU6IHN0cmluZywgY29udGVudHM6IHN0cmluZykge1xuICBhd2FpdCBmcy5ta2RpcnAocGF0aC5kaXJuYW1lKGZpbGVuYW1lKSk7XG4gIGF3YWl0IGZzLndyaXRlRmlsZShmaWxlbmFtZSwgY29udGVudHMsIHsgZW5jb2Rpbmc6ICd1dGYtOCcgfSk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjb3B5RGlyZWN0b3J5Q29udGVudHMoZGlyOiBzdHJpbmcsIHRhcmdldDogc3RyaW5nKSB7XG4gIGZvciAoY29uc3QgZmlsZSBvZiBhd2FpdCBmcy5yZWFkZGlyKHBhdGguam9pbihkaXIpKSkge1xuICAgIGF3YWl0IGZzLmNvcHlGaWxlKHBhdGguam9pbihkaXIsIGZpbGUpLCBwYXRoLmpvaW4odGFyZ2V0LCBmaWxlKSk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbmRVcChuYW1lOiBzdHJpbmcsIGRpcmVjdG9yeTogc3RyaW5nID0gcHJvY2Vzcy5jd2QoKSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGFic29sdXRlRGlyZWN0b3J5ID0gcGF0aC5yZXNvbHZlKGRpcmVjdG9yeSk7XG5cbiAgY29uc3QgZmlsZSA9IHBhdGguam9pbihkaXJlY3RvcnksIG5hbWUpO1xuICBpZiAoZnMuZXhpc3RzU3luYyhmaWxlKSkge1xuICAgIHJldHVybiBmaWxlO1xuICB9XG5cbiAgY29uc3QgeyByb290IH0gPSBwYXRoLnBhcnNlKGFic29sdXRlRGlyZWN0b3J5KTtcbiAgaWYgKGFic29sdXRlRGlyZWN0b3J5ID09IHJvb3QpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcmV0dXJuIGZpbmRVcChuYW1lLCBwYXRoLmRpcm5hbWUoYWJzb2x1dGVEaXJlY3RvcnkpKTtcbn1cblxuXG4vKipcbiAqIERvY2tlci1zYWZlIGhvbWUgZGlyZWN0b3J5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBob21lRGlyKCkge1xuICByZXR1cm4gb3MudXNlckluZm8oKS5ob21lZGlyID8/IG9zLmhvbWVkaXIoKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxvYWRMaW5lcyhmaWxlbmFtZTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICByZXR1cm4gYXdhaXQgZnMucGF0aEV4aXN0cyhmaWxlbmFtZSkgPyAoYXdhaXQgZnMucmVhZEZpbGUoZmlsZW5hbWUsIHsgZW5jb2Rpbmc6ICd1dGYtOCcgfSkpLnRyaW0oKS5zcGxpdCgnXFxuJykgOiBbXTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdyaXRlTGluZXMoZmlsZW5hbWU6IHN0cmluZywgbGluZXM6IHN0cmluZ1tdKSB7XG4gIC8vIE11c3QgZW5kIGluIGEgbmV3bGluZSBvciBvdXIgYmFzaCBzY3JpcHQgd29uJ3QgcmVhZCBpdCBwcm9wZXJseVxuICBhd2FpdCBmcy53cml0ZUZpbGUoZmlsZW5hbWUsIGxpbmVzLmpvaW4oJ1xcbicpICsgJ1xcbicsIHsgZW5jb2Rpbmc6ICd1dGYtOCcgfSk7XG59XG5cbi8qKlxuICogVXBkYXRlIGEgc3BhY2VsZXNzIGluaSBmaWxlIGluIHBsYWNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVJbmlLZXkobGluZXM6IHN0cmluZ1tdLCBrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZykge1xuICBjb25zdCBwcmVmaXggPSBgJHtrZXl9PWA7XG4gIGxldCBmb3VuZCA9IGZhbHNlO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGxpbmVzW2ldLnN0YXJ0c1dpdGgocHJlZml4KSkge1xuICAgICAgbGluZXNbaV0gPSBwcmVmaXggKyB2YWx1ZTtcbiAgICAgIGZvdW5kID0gdHJ1ZTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICBpZiAoIWZvdW5kKSB7XG4gICAgbGluZXMucHVzaChwcmVmaXggKyB2YWx1ZSk7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,51 @@
1
+ /// <reference types="node" />
2
+ /// <reference types="node" />
3
+ import * as child_process from 'child_process';
4
+ /**
5
+ * A shell command that does what you want
6
+ *
7
+ * Is platform-aware, handles errors nicely.
8
+ */
9
+ export declare function shell(command: string | string[], options?: ShellOptions): Promise<string>;
10
+ export interface ShellOptions extends child_process.SpawnOptions {
11
+ /**
12
+ * Properties to add to 'env'
13
+ */
14
+ readonly modEnv?: Record<string, string>;
15
+ /**
16
+ * Don't fail when exiting with an error
17
+ *
18
+ * @default false
19
+ */
20
+ readonly allowErrExit?: boolean;
21
+ /**
22
+ * Whether to capture stderr
23
+ *
24
+ * @default true
25
+ */
26
+ readonly captureStderr?: boolean;
27
+ /**
28
+ * Pass output here
29
+ *
30
+ * @default stdout unless quiet=true
31
+ */
32
+ readonly output?: NodeJS.WritableStream;
33
+ /**
34
+ * Only return stderr. For example, this is used to validate
35
+ * that when CI=true, all logs are sent to stdout.
36
+ *
37
+ * @default false
38
+ */
39
+ readonly onlyStderr?: boolean;
40
+ /**
41
+ * Don't log to stdout
42
+ *
43
+ * @default always
44
+ */
45
+ readonly show?: 'always' | 'never' | 'error';
46
+ }
47
+ /**
48
+ * rm -rf reimplementation, don't want to depend on an NPM package for this
49
+ */
50
+ export declare function rimraf(fsPath: string): void;
51
+ export declare function addToShellPath(x: string): void;