@my-devkit/cli 2.1.3 → 2.1.4
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/dist/utils/npm.js +16 -0
- package/dist/utils/npm.js.map +1 -1
- package/dist/utils/retry.d.ts +18 -0
- package/dist/utils/retry.js +44 -0
- package/dist/utils/retry.js.map +1 -0
- package/dist/utils/sleep.d.ts +5 -0
- package/dist/utils/sleep.js +14 -0
- package/dist/utils/sleep.js.map +1 -0
- package/package.json +1 -1
- package/src/utils/npm.ts +2 -0
- package/src/utils/retry.ts +56 -0
- package/src/utils/sleep.ts +10 -0
package/dist/utils/npm.js
CHANGED
|
@@ -1,4 +1,13 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
2
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
12
|
exports.Npm = void 0;
|
|
4
13
|
const child_process_1 = require("child_process");
|
|
@@ -6,6 +15,7 @@ const fs = require("fs");
|
|
|
6
15
|
const file_system_1 = require("./file-system");
|
|
7
16
|
const gist_1 = require("./gist");
|
|
8
17
|
const logger_1 = require("./logger");
|
|
18
|
+
const retry_1 = require("./retry");
|
|
9
19
|
class Npm {
|
|
10
20
|
prefix;
|
|
11
21
|
constructor(prefix) {
|
|
@@ -118,4 +128,10 @@ class Npm {
|
|
|
118
128
|
}
|
|
119
129
|
}
|
|
120
130
|
exports.Npm = Npm;
|
|
131
|
+
__decorate([
|
|
132
|
+
(0, retry_1.Retryable)({ exponential: true }),
|
|
133
|
+
__metadata("design:type", Function),
|
|
134
|
+
__metadata("design:paramtypes", []),
|
|
135
|
+
__metadata("design:returntype", Promise)
|
|
136
|
+
], Npm.prototype, "install", null);
|
|
121
137
|
//# sourceMappingURL=npm.js.map
|
package/dist/utils/npm.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"npm.js","sourceRoot":"","sources":["../../src/utils/npm.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"npm.js","sourceRoot":"","sources":["../../src/utils/npm.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Retry operation
|
|
3
|
+
* @param operation
|
|
4
|
+
* @param options
|
|
5
|
+
*/
|
|
6
|
+
export declare function retry<T>(operation: () => Promise<T>, options?: retry.Options): Promise<T>;
|
|
7
|
+
export declare function Retryable(options?: retry.Options): MethodDecorator;
|
|
8
|
+
export declare namespace retry {
|
|
9
|
+
interface Options {
|
|
10
|
+
/**
|
|
11
|
+
* Condition callback
|
|
12
|
+
*/
|
|
13
|
+
condition?: (error: any) => boolean;
|
|
14
|
+
maxAttempts?: number;
|
|
15
|
+
exponential?: boolean;
|
|
16
|
+
continueWithoutError?: boolean;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.retry = retry;
|
|
4
|
+
exports.Retryable = Retryable;
|
|
5
|
+
const logger_1 = require("./logger");
|
|
6
|
+
const sleep_1 = require("./sleep");
|
|
7
|
+
/**
|
|
8
|
+
* Retry operation
|
|
9
|
+
* @param operation
|
|
10
|
+
* @param options
|
|
11
|
+
*/
|
|
12
|
+
async function retry(operation, options) {
|
|
13
|
+
options = { maxAttempts: 6, exponential: false, condition: () => true, continueWithoutError: false, ...options };
|
|
14
|
+
let continueTrying = true;
|
|
15
|
+
let retryCount = 0;
|
|
16
|
+
do {
|
|
17
|
+
try {
|
|
18
|
+
return await operation();
|
|
19
|
+
}
|
|
20
|
+
catch (e) {
|
|
21
|
+
continueTrying = retryCount < options.maxAttempts && options.condition(e);
|
|
22
|
+
if (!continueTrying && options.continueWithoutError) {
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
if (!continueTrying && !options.continueWithoutError) {
|
|
26
|
+
throw e;
|
|
27
|
+
}
|
|
28
|
+
if (options.exponential) {
|
|
29
|
+
await (0, sleep_1.sleep)(Math.pow(2, retryCount) * 1000 + Math.round(Math.random() * 1000));
|
|
30
|
+
}
|
|
31
|
+
retryCount++;
|
|
32
|
+
logger_1.Logger.info(`Retry: retrying... ${retryCount}/${options.maxAttempts}`);
|
|
33
|
+
}
|
|
34
|
+
} while (continueTrying);
|
|
35
|
+
}
|
|
36
|
+
function Retryable(options) {
|
|
37
|
+
return (_target, _propertyKey, descriptor) => {
|
|
38
|
+
const originalMethod = descriptor.value;
|
|
39
|
+
descriptor.value = async function (...args) {
|
|
40
|
+
return retry(async () => await originalMethod.apply(this, args), options);
|
|
41
|
+
};
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=retry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry.js","sourceRoot":"","sources":["../../src/utils/retry.ts"],"names":[],"mappings":";;AAQA,sBAwBC;AAED,8BAQC;AA1CD,qCAAkC;AAClC,mCAAgC;AAEhC;;;;GAIG;AACI,KAAK,UAAU,KAAK,CAAI,SAA2B,EAAE,OAAuB;IAC/E,OAAO,GAAG,EAAE,WAAW,EAAE,CAAC,EAAE,WAAW,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,oBAAoB,EAAE,KAAK,EAAE,GAAG,OAAO,EAAE,CAAC;IAEjH,IAAI,cAAc,GAAG,IAAI,CAAC;IAC1B,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,GAAG,CAAC;QACA,IAAI,CAAC;YACD,OAAO,MAAM,SAAS,EAAE,CAAC;QAC7B,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACT,cAAc,GAAG,UAAU,GAAG,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;YAC1E,IAAI,CAAC,cAAc,IAAI,OAAO,CAAC,oBAAoB,EAAE,CAAC;gBAClD,OAAO;YACX,CAAC;YACD,IAAI,CAAC,cAAc,IAAI,CAAC,OAAO,CAAC,oBAAoB,EAAE,CAAC;gBACnD,MAAM,CAAC,CAAC;YACZ,CAAC;YACD,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;gBACtB,MAAM,IAAA,aAAK,EAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC;YACnF,CAAC;YAED,UAAU,EAAE,CAAC;YACb,eAAM,CAAC,IAAI,CAAC,sBAAsB,UAAU,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;QAC3E,CAAC;IACL,CAAC,QAAQ,cAAc,EAAC;AAC5B,CAAC;AAED,SAAgB,SAAS,CAAC,OAAuB;IAC7C,OAAO,CAAC,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,EAAE;QACzC,MAAM,cAAc,GAAQ,UAAU,CAAC,KAAK,CAAC;QAE5C,UAAkB,CAAC,KAAK,GAAG,KAAK,WAAW,GAAG,IAAe;YAC1D,OAAO,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC,MAAM,cAAc,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;QAC9E,CAAC,CAAC;IACN,CAAC,CAAC;AACN,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.sleep = void 0;
|
|
4
|
+
const logger_1 = require("./logger");
|
|
5
|
+
/**
|
|
6
|
+
* Wait specified miliseconds
|
|
7
|
+
* @param miliseconds
|
|
8
|
+
*/
|
|
9
|
+
const sleep = async (miliseconds) => {
|
|
10
|
+
logger_1.Logger.info(`Sleeping ${miliseconds} ms`);
|
|
11
|
+
return new Promise(resolve => setTimeout(() => resolve(), miliseconds));
|
|
12
|
+
};
|
|
13
|
+
exports.sleep = sleep;
|
|
14
|
+
//# sourceMappingURL=sleep.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sleep.js","sourceRoot":"","sources":["../../src/utils/sleep.ts"],"names":[],"mappings":";;;AAAA,qCAAkC;AAElC;;;GAGG;AACI,MAAM,KAAK,GAAG,KAAK,EAAE,WAAmB,EAAiB,EAAE;IAC9D,eAAM,CAAC,IAAI,CAAC,YAAY,WAAW,KAAK,CAAC,CAAC;IAC1C,OAAO,IAAI,OAAO,CAAO,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,EAAE,WAAW,CAAC,CAAC,CAAC;AAClF,CAAC,CAAA;AAHY,QAAA,KAAK,SAGjB"}
|
package/package.json
CHANGED
package/src/utils/npm.ts
CHANGED
|
@@ -4,6 +4,7 @@ import * as fs from 'fs';
|
|
|
4
4
|
import { FileSystem } from './file-system';
|
|
5
5
|
import { Gist } from './gist';
|
|
6
6
|
import { Logger } from './logger';
|
|
7
|
+
import { Retryable } from './retry';
|
|
7
8
|
|
|
8
9
|
export class Npm {
|
|
9
10
|
constructor(private prefix: string) {
|
|
@@ -52,6 +53,7 @@ export class Npm {
|
|
|
52
53
|
}
|
|
53
54
|
}
|
|
54
55
|
|
|
56
|
+
@Retryable({ exponential: true })
|
|
55
57
|
public async install(): Promise<void> {
|
|
56
58
|
Logger.debug('Install package dependencies', 2);
|
|
57
59
|
await this.execCmd(`npm install --prefix=${this.prefix}`);
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { Logger } from './logger';
|
|
2
|
+
import { sleep } from './sleep';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Retry operation
|
|
6
|
+
* @param operation
|
|
7
|
+
* @param options
|
|
8
|
+
*/
|
|
9
|
+
export async function retry<T>(operation: () => Promise<T>, options?: retry.Options): Promise<T> {
|
|
10
|
+
options = { maxAttempts: 6, exponential: false, condition: () => true, continueWithoutError: false, ...options };
|
|
11
|
+
|
|
12
|
+
let continueTrying = true;
|
|
13
|
+
let retryCount = 0;
|
|
14
|
+
do {
|
|
15
|
+
try {
|
|
16
|
+
return await operation();
|
|
17
|
+
} catch (e) {
|
|
18
|
+
continueTrying = retryCount < options.maxAttempts && options.condition(e);
|
|
19
|
+
if (!continueTrying && options.continueWithoutError) {
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
if (!continueTrying && !options.continueWithoutError) {
|
|
23
|
+
throw e;
|
|
24
|
+
}
|
|
25
|
+
if (options.exponential) {
|
|
26
|
+
await sleep(Math.pow(2, retryCount) * 1000 + Math.round(Math.random() * 1000));
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
retryCount++;
|
|
30
|
+
Logger.info(`Retry: retrying... ${retryCount}/${options.maxAttempts}`);
|
|
31
|
+
}
|
|
32
|
+
} while (continueTrying)
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export function Retryable(options?: retry.Options): MethodDecorator {
|
|
36
|
+
return (_target, _propertyKey, descriptor) => {
|
|
37
|
+
const originalMethod: any = descriptor.value;
|
|
38
|
+
|
|
39
|
+
(descriptor as any).value = async function (...args: unknown[]) {
|
|
40
|
+
return retry(async () => await originalMethod.apply(this, args), options);
|
|
41
|
+
};
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
export namespace retry {
|
|
47
|
+
export interface Options {
|
|
48
|
+
/**
|
|
49
|
+
* Condition callback
|
|
50
|
+
*/
|
|
51
|
+
condition?: (error: any) => boolean;
|
|
52
|
+
maxAttempts?: number;
|
|
53
|
+
exponential?: boolean;
|
|
54
|
+
continueWithoutError?: boolean;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { Logger } from './logger';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Wait specified miliseconds
|
|
5
|
+
* @param miliseconds
|
|
6
|
+
*/
|
|
7
|
+
export const sleep = async (miliseconds: number): Promise<void> => {
|
|
8
|
+
Logger.info(`Sleeping ${miliseconds} ms`);
|
|
9
|
+
return new Promise<void>(resolve => setTimeout(() => resolve(), miliseconds));
|
|
10
|
+
}
|