@aws-cdk-testing/cli-integ 3.2.3 → 3.3.0
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/lib/process.d.ts +45 -0
- package/lib/process.js +97 -0
- package/lib/process.ts +154 -0
- package/lib/shell.d.ts +51 -0
- package/lib/shell.js +81 -20
- package/lib/shell.ts +144 -17
- package/lib/with-cdk-app.d.ts +4 -1
- package/lib/with-cdk-app.js +6 -4
- package/lib/with-cdk-app.ts +9 -2
- package/package.json +2 -1
- package/resources/cdk-apps/app/app.js +36 -25
- package/tests/cli-integ-tests/cdk-destroy-interactive.integtest.d.ts +1 -0
- package/tests/cli-integ-tests/cdk-destroy-interactive.integtest.js +32 -0
- package/tests/cli-integ-tests/cdk-destroy-interactive.integtest.ts +36 -0
- package/tests/cli-integ-tests/cdk-import-interactive.integtest.d.ts +1 -0
- package/tests/cli-integ-tests/cdk-import-interactive.integtest.js +46 -0
- package/tests/cli-integ-tests/cdk-import-interactive.integtest.ts +53 -0
- package/tests/cli-integ-tests/cli.integtest.js +2 -1
- package/tests/cli-integ-tests/cli.integtest.ts +3 -1
- package/tests/cli-integ-tests/proxy.integtest.js +1 -2
- package/tests/cli-integ-tests/proxy.integtest.ts +0 -1
- package/tests/tool-integrations/amplify.integtest.js +19 -10
- package/tests/tool-integrations/amplify.integtest.ts +20 -9
package/lib/process.d.ts
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import * as child from 'child_process';
|
|
2
|
+
import * as pty from 'node-pty';
|
|
3
|
+
/**
|
|
4
|
+
* IProcess provides an interface to work with a subprocess.
|
|
5
|
+
*/
|
|
6
|
+
export interface IProcess {
|
|
7
|
+
/**
|
|
8
|
+
* Register a callback to be invoked when a chunk is written to stdout.
|
|
9
|
+
*/
|
|
10
|
+
onStdout(callback: (chunk: Buffer) => void): void;
|
|
11
|
+
/**
|
|
12
|
+
* Register a callback to be invoked when a chunk is written to stderr.
|
|
13
|
+
*/
|
|
14
|
+
onStderr(callback: (chunk: Buffer) => void): void;
|
|
15
|
+
/**
|
|
16
|
+
* Register a callback to be invoked when the process exists.
|
|
17
|
+
*/
|
|
18
|
+
onExit(callback: (exitCode: number) => void): void;
|
|
19
|
+
/**
|
|
20
|
+
* Register a callback to be invoked if the process failed to start.
|
|
21
|
+
*/
|
|
22
|
+
onError(callback: (error: Error) => void): void;
|
|
23
|
+
/**
|
|
24
|
+
* Write the process stdin stream.
|
|
25
|
+
*/
|
|
26
|
+
writeStdin(data: string): void;
|
|
27
|
+
/**
|
|
28
|
+
* Singal that no more data will be written to stdin. In non tty process you must
|
|
29
|
+
* call this method to make sure the process exits.
|
|
30
|
+
*
|
|
31
|
+
* @param delay - optional delay in milliseconds before the signal is sent.
|
|
32
|
+
*
|
|
33
|
+
*/
|
|
34
|
+
endStdin(delay?: number): void;
|
|
35
|
+
}
|
|
36
|
+
export declare class Process {
|
|
37
|
+
/**
|
|
38
|
+
* Spawn a process with a TTY attached.
|
|
39
|
+
*/
|
|
40
|
+
static spawnTTY(command: string, args: string[], options?: pty.IPtyForkOptions | pty.IWindowsPtyForkOptions): IProcess;
|
|
41
|
+
/**
|
|
42
|
+
* Spawn a process without a forcing a TTY.
|
|
43
|
+
*/
|
|
44
|
+
static spawn(command: string, args: string[], options?: child.SpawnOptions): IProcess;
|
|
45
|
+
}
|
package/lib/process.js
ADDED
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Process = void 0;
|
|
4
|
+
const child = require("child_process");
|
|
5
|
+
const pty = require("node-pty");
|
|
6
|
+
;
|
|
7
|
+
class Process {
|
|
8
|
+
/**
|
|
9
|
+
* Spawn a process with a TTY attached.
|
|
10
|
+
*/
|
|
11
|
+
static spawnTTY(command, args, options = {}) {
|
|
12
|
+
const process = pty.spawn(command, args, {
|
|
13
|
+
name: 'xterm-color',
|
|
14
|
+
...options,
|
|
15
|
+
});
|
|
16
|
+
return new PtyProcess(process);
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Spawn a process without a forcing a TTY.
|
|
20
|
+
*/
|
|
21
|
+
static spawn(command, args, options = {}) {
|
|
22
|
+
const process = child.spawn(command, args, {
|
|
23
|
+
shell: true,
|
|
24
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
25
|
+
...options,
|
|
26
|
+
});
|
|
27
|
+
return new NonPtyProcess(process);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
exports.Process = Process;
|
|
31
|
+
class PtyProcess {
|
|
32
|
+
constructor(process) {
|
|
33
|
+
this.process = process;
|
|
34
|
+
}
|
|
35
|
+
endStdin(_) {
|
|
36
|
+
// not needed because all streams are the same in tty.
|
|
37
|
+
}
|
|
38
|
+
onError(_) {
|
|
39
|
+
// not needed because the pty.spawn will simply fail in this case.
|
|
40
|
+
}
|
|
41
|
+
onStdout(callback) {
|
|
42
|
+
this.process.onData((e) => callback(Buffer.from(e)));
|
|
43
|
+
}
|
|
44
|
+
onStderr(callback) {
|
|
45
|
+
// in a pty all streams are the same
|
|
46
|
+
return this.onStdout(callback);
|
|
47
|
+
}
|
|
48
|
+
onExit(callback) {
|
|
49
|
+
this.process.onExit((e) => { callback(e.exitCode); });
|
|
50
|
+
}
|
|
51
|
+
writeStdin(data) {
|
|
52
|
+
// in a pty all streams are the same
|
|
53
|
+
this.process.write(data);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
;
|
|
57
|
+
class NonPtyProcess {
|
|
58
|
+
constructor(process) {
|
|
59
|
+
this.process = process;
|
|
60
|
+
}
|
|
61
|
+
onError(callback) {
|
|
62
|
+
this.process.once('error', callback);
|
|
63
|
+
}
|
|
64
|
+
onStdout(callback) {
|
|
65
|
+
this.assertDefined('stdout', this.process.stdout);
|
|
66
|
+
this.process.stdout.on('data', callback);
|
|
67
|
+
}
|
|
68
|
+
onStderr(callback) {
|
|
69
|
+
this.assertDefined('stderr', this.process.stderr);
|
|
70
|
+
this.process.stderr.on('data', callback);
|
|
71
|
+
}
|
|
72
|
+
onExit(callback) {
|
|
73
|
+
this.process.on('close', callback);
|
|
74
|
+
}
|
|
75
|
+
writeStdin(content) {
|
|
76
|
+
this.assertDefined('stdin', this.process.stdin);
|
|
77
|
+
this.process.stdin.write(content);
|
|
78
|
+
}
|
|
79
|
+
endStdin(delay) {
|
|
80
|
+
if (this.process.stdin == null) {
|
|
81
|
+
throw new Error('No stdin defined for process');
|
|
82
|
+
}
|
|
83
|
+
if (delay) {
|
|
84
|
+
setTimeout(() => this.process.stdin.end(), delay);
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
this.process.stdin.end();
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
assertDefined(name, stream) {
|
|
91
|
+
if (stream == null) {
|
|
92
|
+
throw new Error(`No ${name} defined for child process`);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
;
|
|
97
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvY2Vzcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInByb2Nlc3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsdUNBQXVDO0FBRXZDLGdDQUFnQztBQXlDL0IsQ0FBQztBQUVGLE1BQWEsT0FBTztJQUVsQjs7T0FFRztJQUNJLE1BQU0sQ0FBQyxRQUFRLENBQUMsT0FBZSxFQUFFLElBQWMsRUFBRSxVQUE0RCxFQUFFO1FBRXBILE1BQU0sT0FBTyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRTtZQUN2QyxJQUFJLEVBQUUsYUFBYTtZQUNuQixHQUFHLE9BQU87U0FDWCxDQUFDLENBQUE7UUFDRixPQUFPLElBQUksVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBRWpDLENBQUM7SUFFRDs7T0FFRztJQUNJLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBZSxFQUFFLElBQWMsRUFBRSxVQUE4QixFQUFFO1FBRW5GLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRTtZQUN6QyxLQUFLLEVBQUUsSUFBSTtZQUNYLEtBQUssRUFBRSxDQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDO1lBQ2pDLEdBQUcsT0FBTztTQUNYLENBQUMsQ0FBQztRQUNILE9BQU8sSUFBSSxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUM7SUFFcEMsQ0FBQztDQUVGO0FBN0JELDBCQTZCQztBQUVELE1BQU0sVUFBVTtJQUVkLFlBQW9DLE9BQWlCO1FBQWpCLFlBQU8sR0FBUCxPQUFPLENBQVU7SUFBRyxDQUFDO0lBRWxELFFBQVEsQ0FBQyxDQUFVO1FBQ3hCLHNEQUFzRDtJQUN4RCxDQUFDO0lBRU0sT0FBTyxDQUFDLENBQXlCO1FBQ3RDLGtFQUFrRTtJQUNwRSxDQUFDO0lBRU0sUUFBUSxDQUFDLFFBQWlDO1FBQy9DLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdkQsQ0FBQztJQUVNLFFBQVEsQ0FBQyxRQUFpQztRQUMvQyxvQ0FBb0M7UUFDcEMsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFFTSxNQUFNLENBQUMsUUFBb0M7UUFDaEQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUEsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBR00sVUFBVSxDQUFDLElBQVk7UUFDNUIsb0NBQW9DO1FBQ3BDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFBO0lBQzFCLENBQUM7Q0FFRjtBQUFBLENBQUM7QUFFRixNQUFNLGFBQWE7SUFFakIsWUFBb0MsT0FBMkI7UUFBM0IsWUFBTyxHQUFQLE9BQU8sQ0FBb0I7SUFBRyxDQUFDO0lBRTVELE9BQU8sQ0FBQyxRQUFnQztRQUM3QyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVNLFFBQVEsQ0FBQyxRQUFpQztRQUMvQyxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2xELElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVNLFFBQVEsQ0FBQyxRQUFpQztRQUMvQyxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2xELElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVNLE1BQU0sQ0FBQyxRQUFvQztRQUNoRCxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVNLFVBQVUsQ0FBQyxPQUFlO1FBQy9CLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDaEQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFFTSxRQUFRLENBQUMsS0FBYztRQUM1QixJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxJQUFJLElBQUksRUFBRSxDQUFDO1lBQy9CLE1BQU0sSUFBSSxLQUFLLENBQUMsOEJBQThCLENBQUMsQ0FBQztRQUNsRCxDQUFDO1FBQ0QsSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUNWLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQU0sQ0FBQyxHQUFHLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNyRCxDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBTSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQzVCLENBQUM7SUFDSCxDQUFDO0lBRU0sYUFBYSxDQUFDLElBQW1DLEVBQUUsTUFBK0M7UUFDdkcsSUFBSSxNQUFNLElBQUksSUFBSSxFQUFFLENBQUM7WUFDbkIsTUFBTSxJQUFJLEtBQUssQ0FBQyxNQUFNLElBQUksNEJBQTRCLENBQUMsQ0FBQztRQUMxRCxDQUFDO0lBQ0gsQ0FBQztDQUVGO0FBQUEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGNoaWxkIGZyb20gJ2NoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IHsgUmVhZGFibGUsIFdyaXRhYmxlIH0gZnJvbSAnc3RyZWFtJztcbmltcG9ydCAqIGFzIHB0eSBmcm9tICdub2RlLXB0eSc7XG5cbi8qKlxuICogSVByb2Nlc3MgcHJvdmlkZXMgYW4gaW50ZXJmYWNlIHRvIHdvcmsgd2l0aCBhIHN1YnByb2Nlc3MuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSVByb2Nlc3Mge1xuXG4gIC8qKlxuICAgKiBSZWdpc3RlciBhIGNhbGxiYWNrIHRvIGJlIGludm9rZWQgd2hlbiBhIGNodW5rIGlzIHdyaXR0ZW4gdG8gc3Rkb3V0LlxuICAgKi9cbiAgb25TdGRvdXQoY2FsbGJhY2s6IChjaHVuazogQnVmZmVyKSA9PiB2b2lkKTogdm9pZDtcblxuICAvKipcbiAgICogUmVnaXN0ZXIgYSBjYWxsYmFjayB0byBiZSBpbnZva2VkIHdoZW4gYSBjaHVuayBpcyB3cml0dGVuIHRvIHN0ZGVyci5cbiAgICovXG4gIG9uU3RkZXJyKGNhbGxiYWNrOiAoY2h1bms6IEJ1ZmZlcikgPT4gdm9pZCk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVyIGEgY2FsbGJhY2sgdG8gYmUgaW52b2tlZCB3aGVuIHRoZSBwcm9jZXNzIGV4aXN0cy5cbiAgICovXG4gIG9uRXhpdChjYWxsYmFjazogKGV4aXRDb2RlOiBudW1iZXIpID0+IHZvaWQpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBSZWdpc3RlciBhIGNhbGxiYWNrIHRvIGJlIGludm9rZWQgaWYgdGhlIHByb2Nlc3MgZmFpbGVkIHRvIHN0YXJ0LlxuICAgKi9cbiAgb25FcnJvcihjYWxsYmFjazogKGVycm9yOiBFcnJvcikgPT4gdm9pZCk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFdyaXRlIHRoZSBwcm9jZXNzIHN0ZGluIHN0cmVhbS5cbiAgICovXG4gIHdyaXRlU3RkaW4oZGF0YTogc3RyaW5nKTogdm9pZDtcblxuICAvKipcbiAgICogU2luZ2FsIHRoYXQgbm8gbW9yZSBkYXRhIHdpbGwgYmUgd3JpdHRlbiB0byBzdGRpbi4gSW4gbm9uIHR0eSBwcm9jZXNzIHlvdSBtdXN0XG4gICAqIGNhbGwgdGhpcyBtZXRob2QgdG8gbWFrZSBzdXJlIHRoZSBwcm9jZXNzIGV4aXRzLlxuICAgKlxuICAgKiBAcGFyYW0gZGVsYXkgLSBvcHRpb25hbCBkZWxheSBpbiBtaWxsaXNlY29uZHMgYmVmb3JlIHRoZSBzaWduYWwgaXMgc2VudC5cbiAgICpcbiAgICovXG4gIGVuZFN0ZGluKGRlbGF5PzogbnVtYmVyKTogdm9pZDtcblxufTtcblxuZXhwb3J0IGNsYXNzIFByb2Nlc3Mge1xuXG4gIC8qKlxuICAgKiBTcGF3biBhIHByb2Nlc3Mgd2l0aCBhIFRUWSBhdHRhY2hlZC5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgc3Bhd25UVFkoY29tbWFuZDogc3RyaW5nLCBhcmdzOiBzdHJpbmdbXSwgb3B0aW9uczogcHR5LklQdHlGb3JrT3B0aW9ucyB8IHB0eS5JV2luZG93c1B0eUZvcmtPcHRpb25zID0ge30pOiBJUHJvY2VzcyB7XG5cbiAgICBjb25zdCBwcm9jZXNzID0gcHR5LnNwYXduKGNvbW1hbmQsIGFyZ3MsIHtcbiAgICAgIG5hbWU6ICd4dGVybS1jb2xvcicsXG4gICAgICAuLi5vcHRpb25zLFxuICAgIH0pXG4gICAgcmV0dXJuIG5ldyBQdHlQcm9jZXNzKHByb2Nlc3MpO1xuXG4gIH1cblxuICAvKipcbiAgICogU3Bhd24gYSBwcm9jZXNzIHdpdGhvdXQgYSBmb3JjaW5nIGEgVFRZLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBzcGF3bihjb21tYW5kOiBzdHJpbmcsIGFyZ3M6IHN0cmluZ1tdLCBvcHRpb25zOiBjaGlsZC5TcGF3bk9wdGlvbnMgPSB7fSk6IElQcm9jZXNzIHtcblxuICAgIGNvbnN0IHByb2Nlc3MgPSBjaGlsZC5zcGF3bihjb21tYW5kLCBhcmdzLCB7XG4gICAgICBzaGVsbDogdHJ1ZSxcbiAgICAgIHN0ZGlvOiBbJ2lnbm9yZScsICdwaXBlJywgJ3BpcGUnXSxcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgfSk7XG4gICAgcmV0dXJuIG5ldyBOb25QdHlQcm9jZXNzKHByb2Nlc3MpO1xuXG4gIH1cblxufVxuXG5jbGFzcyBQdHlQcm9jZXNzIGltcGxlbWVudHMgSVByb2Nlc3Mge1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHByb2Nlc3M6IHB0eS5JUHR5KSB7fVxuXG4gIHB1YmxpYyBlbmRTdGRpbihfPzogbnVtYmVyKTogdm9pZCB7XG4gICAgLy8gbm90IG5lZWRlZCBiZWNhdXNlIGFsbCBzdHJlYW1zIGFyZSB0aGUgc2FtZSBpbiB0dHkuXG4gIH1cblxuICBwdWJsaWMgb25FcnJvcihfOiAoZXJyb3I6IEVycm9yKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgLy8gbm90IG5lZWRlZCBiZWNhdXNlIHRoZSBwdHkuc3Bhd24gd2lsbCBzaW1wbHkgZmFpbCBpbiB0aGlzIGNhc2UuXG4gIH1cblxuICBwdWJsaWMgb25TdGRvdXQoY2FsbGJhY2s6IChjaHVuazogQnVmZmVyKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5wcm9jZXNzLm9uRGF0YSgoZSkgPT4gY2FsbGJhY2soQnVmZmVyLmZyb20oZSkpKTtcbiAgfVxuXG4gIHB1YmxpYyBvblN0ZGVycihjYWxsYmFjazogKGNodW5rOiBCdWZmZXIpID0+IHZvaWQpOiB2b2lkIHtcbiAgICAvLyBpbiBhIHB0eSBhbGwgc3RyZWFtcyBhcmUgdGhlIHNhbWVcbiAgICByZXR1cm4gdGhpcy5vblN0ZG91dChjYWxsYmFjayk7XG4gIH1cblxuICBwdWJsaWMgb25FeGl0KGNhbGxiYWNrOiAoZXhpdENvZGU6IG51bWJlcikgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMucHJvY2Vzcy5vbkV4aXQoKGUpID0+IHsgY2FsbGJhY2soZS5leGl0Q29kZSkgfSk7XG4gIH1cblxuXG4gIHB1YmxpYyB3cml0ZVN0ZGluKGRhdGE6IHN0cmluZyk6IHZvaWQge1xuICAgIC8vIGluIGEgcHR5IGFsbCBzdHJlYW1zIGFyZSB0aGUgc2FtZVxuICAgIHRoaXMucHJvY2Vzcy53cml0ZShkYXRhKVxuICB9XG5cbn07XG5cbmNsYXNzIE5vblB0eVByb2Nlc3MgaW1wbGVtZW50cyBJUHJvY2VzcyB7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgcHJvY2VzczogY2hpbGQuQ2hpbGRQcm9jZXNzKSB7fVxuXG4gIHB1YmxpYyBvbkVycm9yKGNhbGxiYWNrOiAoZXJyb3I6IEVycm9yKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5wcm9jZXNzLm9uY2UoJ2Vycm9yJywgY2FsbGJhY2spO1xuICB9XG5cbiAgcHVibGljIG9uU3Rkb3V0KGNhbGxiYWNrOiAoY2h1bms6IEJ1ZmZlcikgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMuYXNzZXJ0RGVmaW5lZCgnc3Rkb3V0JywgdGhpcy5wcm9jZXNzLnN0ZG91dCk7XG4gICAgdGhpcy5wcm9jZXNzLnN0ZG91dC5vbignZGF0YScsIGNhbGxiYWNrKTtcbiAgfVxuXG4gIHB1YmxpYyBvblN0ZGVycihjYWxsYmFjazogKGNodW5rOiBCdWZmZXIpID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLmFzc2VydERlZmluZWQoJ3N0ZGVycicsIHRoaXMucHJvY2Vzcy5zdGRlcnIpO1xuICAgIHRoaXMucHJvY2Vzcy5zdGRlcnIub24oJ2RhdGEnLCBjYWxsYmFjayk7XG4gIH1cblxuICBwdWJsaWMgb25FeGl0KGNhbGxiYWNrOiAoZXhpdENvZGU6IG51bWJlcikgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMucHJvY2Vzcy5vbignY2xvc2UnLCBjYWxsYmFjayk7XG4gIH1cblxuICBwdWJsaWMgd3JpdGVTdGRpbihjb250ZW50OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmFzc2VydERlZmluZWQoJ3N0ZGluJywgdGhpcy5wcm9jZXNzLnN0ZGluKTtcbiAgICB0aGlzLnByb2Nlc3Muc3RkaW4ud3JpdGUoY29udGVudCk7XG4gIH1cblxuICBwdWJsaWMgZW5kU3RkaW4oZGVsYXk/OiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5wcm9jZXNzLnN0ZGluID09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTm8gc3RkaW4gZGVmaW5lZCBmb3IgcHJvY2VzcycpO1xuICAgIH1cbiAgICBpZiAoZGVsYXkpIHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5wcm9jZXNzLnN0ZGluIS5lbmQoKSwgZGVsYXkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnByb2Nlc3Muc3RkaW4hLmVuZCgpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBhc3NlcnREZWZpbmVkKG5hbWU6ICdzdGRpbicgfCAnc3Rkb3V0JyB8ICdzdGRlcnInLCBzdHJlYW0/OiBSZWFkYWJsZSB8IFdyaXRhYmxlIHwgdW5kZWZpbmVkIHwgbnVsbCk6IGFzc2VydHMgc3RyZWFtIHtcbiAgICBpZiAoc3RyZWFtID09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gJHtuYW1lfSBkZWZpbmVkIGZvciBjaGlsZCBwcm9jZXNzYCk7XG4gICAgfVxuICB9XG5cbn07Il19
|
package/lib/process.ts
ADDED
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
import * as child from 'child_process';
|
|
2
|
+
import { Readable, Writable } from 'stream';
|
|
3
|
+
import * as pty from 'node-pty';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* IProcess provides an interface to work with a subprocess.
|
|
7
|
+
*/
|
|
8
|
+
export interface IProcess {
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Register a callback to be invoked when a chunk is written to stdout.
|
|
12
|
+
*/
|
|
13
|
+
onStdout(callback: (chunk: Buffer) => void): void;
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Register a callback to be invoked when a chunk is written to stderr.
|
|
17
|
+
*/
|
|
18
|
+
onStderr(callback: (chunk: Buffer) => void): void;
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Register a callback to be invoked when the process exists.
|
|
22
|
+
*/
|
|
23
|
+
onExit(callback: (exitCode: number) => void): void;
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Register a callback to be invoked if the process failed to start.
|
|
27
|
+
*/
|
|
28
|
+
onError(callback: (error: Error) => void): void;
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Write the process stdin stream.
|
|
32
|
+
*/
|
|
33
|
+
writeStdin(data: string): void;
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Singal that no more data will be written to stdin. In non tty process you must
|
|
37
|
+
* call this method to make sure the process exits.
|
|
38
|
+
*
|
|
39
|
+
* @param delay - optional delay in milliseconds before the signal is sent.
|
|
40
|
+
*
|
|
41
|
+
*/
|
|
42
|
+
endStdin(delay?: number): void;
|
|
43
|
+
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
export class Process {
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Spawn a process with a TTY attached.
|
|
50
|
+
*/
|
|
51
|
+
public static spawnTTY(command: string, args: string[], options: pty.IPtyForkOptions | pty.IWindowsPtyForkOptions = {}): IProcess {
|
|
52
|
+
|
|
53
|
+
const process = pty.spawn(command, args, {
|
|
54
|
+
name: 'xterm-color',
|
|
55
|
+
...options,
|
|
56
|
+
})
|
|
57
|
+
return new PtyProcess(process);
|
|
58
|
+
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Spawn a process without a forcing a TTY.
|
|
63
|
+
*/
|
|
64
|
+
public static spawn(command: string, args: string[], options: child.SpawnOptions = {}): IProcess {
|
|
65
|
+
|
|
66
|
+
const process = child.spawn(command, args, {
|
|
67
|
+
shell: true,
|
|
68
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
69
|
+
...options,
|
|
70
|
+
});
|
|
71
|
+
return new NonPtyProcess(process);
|
|
72
|
+
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
class PtyProcess implements IProcess {
|
|
78
|
+
|
|
79
|
+
public constructor(private readonly process: pty.IPty) {}
|
|
80
|
+
|
|
81
|
+
public endStdin(_?: number): void {
|
|
82
|
+
// not needed because all streams are the same in tty.
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
public onError(_: (error: Error) => void): void {
|
|
86
|
+
// not needed because the pty.spawn will simply fail in this case.
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
public onStdout(callback: (chunk: Buffer) => void): void {
|
|
90
|
+
this.process.onData((e) => callback(Buffer.from(e)));
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
public onStderr(callback: (chunk: Buffer) => void): void {
|
|
94
|
+
// in a pty all streams are the same
|
|
95
|
+
return this.onStdout(callback);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
public onExit(callback: (exitCode: number) => void): void {
|
|
99
|
+
this.process.onExit((e) => { callback(e.exitCode) });
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
public writeStdin(data: string): void {
|
|
104
|
+
// in a pty all streams are the same
|
|
105
|
+
this.process.write(data)
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
};
|
|
109
|
+
|
|
110
|
+
class NonPtyProcess implements IProcess {
|
|
111
|
+
|
|
112
|
+
public constructor(private readonly process: child.ChildProcess) {}
|
|
113
|
+
|
|
114
|
+
public onError(callback: (error: Error) => void): void {
|
|
115
|
+
this.process.once('error', callback);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
public onStdout(callback: (chunk: Buffer) => void): void {
|
|
119
|
+
this.assertDefined('stdout', this.process.stdout);
|
|
120
|
+
this.process.stdout.on('data', callback);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
public onStderr(callback: (chunk: Buffer) => void): void {
|
|
124
|
+
this.assertDefined('stderr', this.process.stderr);
|
|
125
|
+
this.process.stderr.on('data', callback);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
public onExit(callback: (exitCode: number) => void): void {
|
|
129
|
+
this.process.on('close', callback);
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
public writeStdin(content: string): void {
|
|
133
|
+
this.assertDefined('stdin', this.process.stdin);
|
|
134
|
+
this.process.stdin.write(content);
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
public endStdin(delay?: number): void {
|
|
138
|
+
if (this.process.stdin == null) {
|
|
139
|
+
throw new Error('No stdin defined for process');
|
|
140
|
+
}
|
|
141
|
+
if (delay) {
|
|
142
|
+
setTimeout(() => this.process.stdin!.end(), delay);
|
|
143
|
+
} else {
|
|
144
|
+
this.process.stdin!.end();
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
public assertDefined(name: 'stdin' | 'stdout' | 'stderr', stream?: Readable | Writable | undefined | null): asserts stream {
|
|
149
|
+
if (stream == null) {
|
|
150
|
+
throw new Error(`No ${name} defined for child process`);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
};
|
package/lib/shell.d.ts
CHANGED
|
@@ -7,6 +7,51 @@ import { TemporaryDirectoryContext } from './with-temporary-directory';
|
|
|
7
7
|
* Is platform-aware, handles errors nicely.
|
|
8
8
|
*/
|
|
9
9
|
export declare function shell(command: string[], options?: ShellOptions): Promise<string>;
|
|
10
|
+
/**
|
|
11
|
+
* Models a single user interaction with the shell.
|
|
12
|
+
*/
|
|
13
|
+
export interface UserInteraction {
|
|
14
|
+
/**
|
|
15
|
+
* The prompt to expect. Regex matched against the last line in
|
|
16
|
+
* the output before the prompt is displayed.
|
|
17
|
+
*
|
|
18
|
+
* Most commonly this would be a simple string to match for inclusion.
|
|
19
|
+
*
|
|
20
|
+
* Examples:
|
|
21
|
+
*
|
|
22
|
+
* - Process Output: "Hey there! Are you sure?"
|
|
23
|
+
* Prompt: /Are you sure?/
|
|
24
|
+
* Match (Yes/No): Yes
|
|
25
|
+
* Reason: "Hey there! Are you sure?" ~ /Are you sure?/
|
|
26
|
+
*
|
|
27
|
+
* - Process Output: "Hey there!\nAre you sure?"
|
|
28
|
+
* Prompt: /Are you sure?/
|
|
29
|
+
* Match (Yes/No): Yes
|
|
30
|
+
* Reason: "Are you sure?" ~ /Are you sure?/
|
|
31
|
+
*
|
|
32
|
+
* - Process Output: "Are you sure?\n(remember this is destructive)"
|
|
33
|
+
* Prompt: /Are you sure?/
|
|
34
|
+
* Match (Yes/No): No
|
|
35
|
+
* Reason: "(remember this is destructive)" ≄ /Are you sure?/
|
|
36
|
+
*
|
|
37
|
+
* - Process Output: "Are you sure?\n(remember this is destructive)"
|
|
38
|
+
* Prompt: /remember this is destructive/
|
|
39
|
+
* Match (Yes/No): Yes
|
|
40
|
+
* Reason: "(remember this is destructive)" ~ /remember this is destructive/
|
|
41
|
+
*
|
|
42
|
+
*/
|
|
43
|
+
readonly prompt: RegExp;
|
|
44
|
+
/**
|
|
45
|
+
* The input to provide.
|
|
46
|
+
*/
|
|
47
|
+
readonly input: string;
|
|
48
|
+
/**
|
|
49
|
+
* The string to signal the end of input.
|
|
50
|
+
*
|
|
51
|
+
* @default os.EOL
|
|
52
|
+
*/
|
|
53
|
+
readonly end?: string;
|
|
54
|
+
}
|
|
10
55
|
export interface ShellOptions extends child_process.SpawnOptions {
|
|
11
56
|
/**
|
|
12
57
|
* Properties to add to 'env'
|
|
@@ -41,6 +86,12 @@ export interface ShellOptions extends child_process.SpawnOptions {
|
|
|
41
86
|
* @default always
|
|
42
87
|
*/
|
|
43
88
|
readonly show?: 'always' | 'never' | 'error';
|
|
89
|
+
/**
|
|
90
|
+
* Provide user interaction to respond to shell prompts.
|
|
91
|
+
*
|
|
92
|
+
* Order and count should correspond to the expected prompts issued by the subprocess.
|
|
93
|
+
*/
|
|
94
|
+
readonly interact?: UserInteraction[];
|
|
44
95
|
}
|
|
45
96
|
export declare class ShellHelper {
|
|
46
97
|
private readonly _cwd;
|
package/lib/shell.js
CHANGED
|
@@ -4,16 +4,17 @@ exports.ShellHelper = void 0;
|
|
|
4
4
|
exports.shell = shell;
|
|
5
5
|
exports.rimraf = rimraf;
|
|
6
6
|
exports.addToShellPath = addToShellPath;
|
|
7
|
-
const child_process = require("child_process");
|
|
8
7
|
const fs = require("fs");
|
|
8
|
+
const os = require("os");
|
|
9
9
|
const path = require("path");
|
|
10
|
+
const process_1 = require("./process");
|
|
10
11
|
/**
|
|
11
12
|
* A shell command that does what you want
|
|
12
13
|
*
|
|
13
14
|
* Is platform-aware, handles errors nicely.
|
|
14
15
|
*/
|
|
15
16
|
async function shell(command, options = {}) {
|
|
16
|
-
var _a, _b;
|
|
17
|
+
var _a, _b, _c;
|
|
17
18
|
if (options.modEnv && options.env) {
|
|
18
19
|
throw new Error('Use either env or modEnv but not both');
|
|
19
20
|
}
|
|
@@ -27,44 +28,68 @@ async function shell(command, options = {}) {
|
|
|
27
28
|
writeToOutputs(`💻 ${command.join(' ')}\n`);
|
|
28
29
|
const show = (_a = options.show) !== null && _a !== void 0 ? _a : 'always';
|
|
29
30
|
const env = (_b = options.env) !== null && _b !== void 0 ? _b : (options.modEnv ? { ...process.env, ...options.modEnv } : process.env);
|
|
30
|
-
const
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
31
|
+
const tty = options.interact && options.interact.length > 0;
|
|
32
|
+
// Coerce to `any` because `ShellOptions` contains custom properties
|
|
33
|
+
// that don't exist in the underlying interfaces. We could either rebuild each options map,
|
|
34
|
+
// or just pass through and let the underlying implemenation ignore what it doesn't know about.
|
|
35
|
+
// We choose the lazy one.
|
|
36
|
+
const spawnOptions = { ...options, env };
|
|
37
|
+
const child = tty
|
|
38
|
+
? process_1.Process.spawnTTY(command[0], command.slice(1), spawnOptions)
|
|
39
|
+
: process_1.Process.spawn(command[0], command.slice(1), spawnOptions);
|
|
40
|
+
// copy because we will be shifting it
|
|
41
|
+
const remainingInteractions = [...((_c = options.interact) !== null && _c !== void 0 ? _c : [])];
|
|
37
42
|
return new Promise((resolve, reject) => {
|
|
38
43
|
const stdout = new Array();
|
|
39
44
|
const stderr = new Array();
|
|
40
|
-
|
|
45
|
+
const lastLine = new LastLine();
|
|
46
|
+
child.onStdout(chunk => {
|
|
47
|
+
var _a;
|
|
41
48
|
if (show === 'always') {
|
|
42
|
-
writeToOutputs(chunk);
|
|
49
|
+
writeToOutputs(chunk.toString('utf-8'));
|
|
43
50
|
}
|
|
44
51
|
stdout.push(chunk);
|
|
52
|
+
lastLine.append(chunk.toString('utf-8'));
|
|
53
|
+
const interaction = remainingInteractions[0];
|
|
54
|
+
if (interaction) {
|
|
55
|
+
if (interaction.prompt.test(lastLine.get())) {
|
|
56
|
+
// subprocess expects a user input now
|
|
57
|
+
child.writeStdin(interaction.input + ((_a = interaction.end) !== null && _a !== void 0 ? _a : os.EOL));
|
|
58
|
+
remainingInteractions.shift();
|
|
59
|
+
}
|
|
60
|
+
}
|
|
45
61
|
});
|
|
46
|
-
child.
|
|
62
|
+
child.onStderr(chunk => {
|
|
47
63
|
var _a;
|
|
48
64
|
if (show === 'always') {
|
|
49
|
-
writeToOutputs(chunk);
|
|
65
|
+
writeToOutputs(chunk.toString('utf-8'));
|
|
50
66
|
}
|
|
51
67
|
if ((_a = options.captureStderr) !== null && _a !== void 0 ? _a : true) {
|
|
52
68
|
stderr.push(chunk);
|
|
53
69
|
}
|
|
54
70
|
});
|
|
55
|
-
child.
|
|
56
|
-
child.
|
|
71
|
+
child.onError(reject);
|
|
72
|
+
child.onExit(code => {
|
|
57
73
|
const stderrOutput = Buffer.concat(stderr).toString('utf-8');
|
|
58
74
|
const stdoutOutput = Buffer.concat(stdout).toString('utf-8');
|
|
59
75
|
const out = (options.onlyStderr ? stderrOutput : stdoutOutput + stderrOutput).trim();
|
|
76
|
+
const logAndreject = (error) => {
|
|
77
|
+
if (show === 'error') {
|
|
78
|
+
writeToOutputs(`${out}\n`);
|
|
79
|
+
}
|
|
80
|
+
reject(error);
|
|
81
|
+
};
|
|
82
|
+
if (remainingInteractions.length !== 0) {
|
|
83
|
+
// regardless of the exit code, if we didn't consume all expected interactions we probably
|
|
84
|
+
// did somethiing wrong.
|
|
85
|
+
logAndreject(new Error(`Expected more user interactions but subprocess exited with ${code}`));
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
60
88
|
if (code === 0 || options.allowErrExit) {
|
|
61
89
|
resolve(out);
|
|
62
90
|
}
|
|
63
91
|
else {
|
|
64
|
-
|
|
65
|
-
writeToOutputs(`${out}\n`);
|
|
66
|
-
}
|
|
67
|
-
reject(new Error(`'${command.join(' ')}' exited with error code ${code}.`));
|
|
92
|
+
logAndreject(new Error(`'${command.join(' ')}' exited with error code ${code}.`));
|
|
68
93
|
}
|
|
69
94
|
});
|
|
70
95
|
});
|
|
@@ -128,4 +153,40 @@ function addToShellPath(x) {
|
|
|
128
153
|
}
|
|
129
154
|
process.env.PATH = parts.join(':');
|
|
130
155
|
}
|
|
131
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2hlbGwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJzaGVsbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFXQSxzQkE4REM7QUFtRUQsd0JBd0JDO0FBRUQsd0NBUUM7QUE5S0QsK0NBQStDO0FBQy9DLHlCQUF5QjtBQUN6Qiw2QkFBNkI7QUFJN0I7Ozs7R0FJRztBQUNJLEtBQUssVUFBVSxLQUFLLENBQUMsT0FBaUIsRUFBRSxVQUF3QixFQUFFOztJQUN2RSxJQUFJLE9BQU8sQ0FBQyxNQUFNLElBQUksT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ2xDLE1BQU0sSUFBSSxLQUFLLENBQUMsdUNBQXVDLENBQUMsQ0FBQztJQUMzRCxDQUFDO0lBRUQsTUFBTSxPQUFPLEdBQUcsSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3pDLE1BQU0sY0FBYyxHQUFHLENBQUMsQ0FBUyxFQUFFLEVBQUU7UUFDbkMsS0FBSyxNQUFNLFlBQVksSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUNuQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3hCLENBQUM7SUFDSCxDQUFDLENBQUM7SUFFRiw0QkFBNEI7SUFDNUIsY0FBYyxDQUFDLE1BQU0sT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDNUMsTUFBTSxJQUFJLEdBQUcsTUFBQSxPQUFPLENBQUMsSUFBSSxtQ0FBSSxRQUFRLENBQUM7SUFFdEMsTUFBTSxHQUFHLEdBQUcsTUFBQSxPQUFPLENBQUMsR0FBRyxtQ0FBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxPQUFPLENBQUMsR0FBRyxFQUFFLEdBQUcsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7SUFFbEcsTUFBTSxLQUFLLEdBQUcsYUFBYSxDQUFDLEtBQUss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QUFDLENBQUM7SUFDVixDQUFDO0FBQ0gsQ0FBQztBQUVELFNBQWdCLGNBQWMsQ0FBQyxDQUFTOztJQUN0QyxNQUFNLEtBQUssR0FBRyxNQUFBLE1BQUEsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLDBDQUFFLEtBQUssQ0FBQyxHQUFHLENBQUMsbUNBQUksRUFBRSxDQUFDO0lBRWpELElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDdkIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNuQixDQUFDO0lBRUQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNyQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgY2hpbGRfcHJvY2VzcyBmcm9tICdjaGlsZF9wcm9jZXNzJztcbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBUZXN0Q29udGV4dCB9IGZyb20gJy4vaW50ZWctdGVzdCc7XG5pbXBvcnQgeyBUZW1wb3JhcnlEaXJlY3RvcnlDb250ZXh0IH0gZnJvbSAnLi93aXRoLXRlbXBvcmFyeS1kaXJlY3RvcnknO1xuXG4vKipcbiAqIEEgc2hlbGwgY29tbWFuZCB0aGF0IGRvZXMgd2hhdCB5b3Ugd2FudFxuICpcbiAqIElzIHBsYXRmb3JtLWF3YXJlLCBoYW5kbGVzIGVycm9ycyBuaWNlbHkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzaGVsbChjb21tYW5kOiBzdHJpbmdbXSwgb3B0aW9uczogU2hlbGxPcHRpb25zID0ge30pOiBQcm9taXNlPHN0cmluZz4ge1xuICBpZiAob3B0aW9ucy5tb2RFbnYgJiYgb3B0aW9ucy5lbnYpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1VzZSBlaXRoZXIgZW52IG9yIG1vZEVudiBidXQgbm90IGJvdGgnKTtcbiAgfVxuXG4gIGNvbnN0IG91dHB1dHMgPSBuZXcgU2V0KG9wdGlvbnMub3V0cHV0cyk7XG4gIGNvbnN0IHdyaXRlVG9PdXRwdXRzID0gKHg6IHN0cmluZykgPT4ge1xuICAgIGZvciAoY29uc3Qgb3V0cHV0U3RyZWFtIG9mIG91dHB1dHMpIHtcbiAgICAgIG91dHB1dFN0cmVhbS53cml0ZSh4KTtcbiAgICB9XG4gIH07XG5cbiAgLy8gQWx3YXlzIG91dHB1dCB0aGUgY29tbWFuZFxuICB3cml0ZVRvT3V0cHV0cyhg8J+SuyAke2NvbW1hbmQuam9pbignICcpfVxcbmApO1xuICBjb25zdCBzaG93ID0gb3B0aW9ucy5zaG93ID8/ICdhbHdheXMnO1xuXG4gIGNvbnN0IGVudiA9IG9wdGlvbnMuZW52ID8/IChvcHRpb25zLm1vZEVudiA/IHsgLi4ucHJvY2Vzcy5lbnYsIC4uLm9wdGlvbnMubW9kRW52IH0gOiBwcm9jZXNzLmVudik7XG5cbiAgY29uc3QgY2hpbGQgPSBjaGlsZF9wcm9jZXNzLnNwYXduKGNvbW1hbmRbMF0sIGNvbW1hbmQuc2xpY2UoMSksIHtcbiAgICAuLi5vcHRpb25zLFxuICAgIGVudixcbiAgICAvLyBOZWVkIHRoaXMgZm9yIFdpbmRvd3Mgd2hlcmUgd2Ugd2FudCAuY21kIGFuZCAuYmF0IHRvIGJlIGZvdW5kIGFzIHdlbGwuXG4gICAgc2hlbGw6IHRydWUsXG4gICAgc3RkaW86IFsnaWdub3JlJywgJ3BpcGUnLCAncGlwZSddLFxuICB9KTtcblxuICByZXR1cm4gbmV3IFByb21pc2U8c3RyaW5nPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3Qgc3Rkb3V0ID0gbmV3IEFycmF5PEJ1ZmZlcj4oKTtcbiAgICBjb25zdCBzdGRlcnIgPSBuZXcgQXJyYXk8QnVmZmVyPigpO1xuXG4gICAgY2hpbGQuc3Rkb3V0IS5vbignZGF0YScsIGNodW5rID0+IHtcbiAgICAgIGlmIChzaG93ID09PSAnYWx3YXlzJykge1xuICAgICAgICB3cml0ZVRvT3V0cHV0cyhjaHVuayk7XG4gICAgICB9XG4gICAgICBzdGRvdXQucHVzaChjaHVuayk7XG4gICAgfSk7XG5cbiAgICBjaGlsZC5zdGRlcnIhLm9uKCdkYXRhJywgY2h1bmsgPT4ge1xuICAgICAgaWYgKHNob3cgPT09ICdhbHdheXMnKSB7XG4gICAgICAgIHdyaXRlVG9PdXRwdXRzKGNodW5rKTtcbiAgICAgIH1cbiAgICAgIGlmIChvcHRpb25zLmNhcHR1cmVTdGRlcnIgPz8gdHJ1ZSkge1xuICAgICAgICBzdGRlcnIucHVzaChjaHVuayk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBjaGlsZC5vbmNlKCdlcnJvcicsIHJlamVjdCk7XG5cbiAgICBjaGlsZC5vbmNlKCdjbG9zZScsIGNvZGUgPT4ge1xuICAgICAgY29uc3Qgc3RkZXJyT3V0cHV0ID0gQnVmZmVyLmNvbmNhdChzdGRlcnIpLnRvU3RyaW5nKCd1dGYtOCcpO1xuICAgICAgY29uc3Qgc3Rkb3V0T3V0cHV0ID0gQnVmZmVyLmNvbmNhdChzdGRvdXQpLnRvU3RyaW5nKCd1dGYtOCcpO1xuICAgICAgY29uc3Qgb3V0ID0gKG9wdGlvbnMub25seVN0ZGVyciA/IHN0ZGVyck91dHB1dCA6IHN0ZG91dE91dHB1dCArIHN0ZGVyck91dHB1dCkudHJpbSgpO1xuICAgICAgaWYgKGNvZGUgPT09IDAgfHwgb3B0aW9ucy5hbGxvd0VyckV4aXQpIHtcbiAgICAgICAgcmVzb2x2ZShvdXQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHNob3cgPT09ICdlcnJvcicpIHtcbiAgICAgICAgICB3cml0ZVRvT3V0cHV0cyhgJHtvdXR9XFxuYCk7XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgJyR7Y29tbWFuZC5qb2luKCcgJyl9JyBleGl0ZWQgd2l0aCBlcnJvciBjb2RlICR7Y29kZX0uYCkpO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTaGVsbE9wdGlvbnMgZXh0ZW5kcyBjaGlsZF9wcm9jZXNzLlNwYXduT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBQcm9wZXJ0aWVzIHRvIGFkZCB0byAnZW52J1xuICAgKi9cbiAgcmVhZG9ubHkgbW9kRW52PzogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPjtcblxuICAvKipcbiAgICogRG9uJ3QgZmFpbCB3aGVuIGV4aXRpbmcgd2l0aCBhbiBlcnJvclxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgYWxsb3dFcnJFeGl0PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBjYXB0dXJlIHN0ZGVyclxuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICByZWFkb25seSBjYXB0dXJlU3RkZXJyPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogUGFzcyBvdXRwdXQgaGVyZVxuICAgKi9cbiAgcmVhZG9ubHkgb3V0cHV0cz86IE5vZGVKUy5Xcml0YWJsZVN0cmVhbVtdO1xuXG4gIC8qKlxuICAgKiBPbmx5IHJldHVybiBzdGRlcnIuIEZvciBleGFtcGxlLCB0aGlzIGlzIHVzZWQgdG8gdmFsaWRhdGVcbiAgICogdGhhdCB3aGVuIENJPXRydWUsIGFsbCBsb2dzIGFyZSBzZW50IHRvIHN0ZG91dC5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IG9ubHlTdGRlcnI/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBEb24ndCBsb2cgdG8gc3Rkb3V0XG4gICAqXG4gICAqIEBkZWZhdWx0IGFsd2F5c1xuICAgKi9cbiAgcmVhZG9ubHkgc2hvdz86ICdhbHdheXMnIHwgJ25ldmVyJyB8ICdlcnJvcic7XG59XG5cbmV4cG9ydCBjbGFzcyBTaGVsbEhlbHBlciB7XG4gIHB1YmxpYyBzdGF0aWMgZnJvbUNvbnRleHQoY29udGV4dDogVGVzdENvbnRleHQgJiBUZW1wb3JhcnlEaXJlY3RvcnlDb250ZXh0KSB7XG4gICAgcmV0dXJuIG5ldyBTaGVsbEhlbHBlcihjb250ZXh0LmludGVnVGVzdERpciwgY29udGV4dC5vdXRwdXQpO1xuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBfY3dkOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfb3V0cHV0OiBOb2RlSlMuV3JpdGFibGVTdHJlYW0pIHsgfVxuXG4gIHB1YmxpYyBhc3luYyBzaGVsbChjb21tYW5kOiBzdHJpbmdbXSwgb3B0aW9uczogT21pdDxTaGVsbE9wdGlvbnMsICdjd2QnIHwgJ291dHB1dHMnPiA9IHt9KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gc2hlbGwoY29tbWFuZCwge1xuICAgICAgb3V0cHV0czogW3RoaXMuX291dHB1dF0sXG4gICAgICBjd2Q6IHRoaXMuX2N3ZCxcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBybSAtcmYgcmVpbXBsZW1lbnRhdGlvbiwgZG9uJ3Qgd2FudCB0byBkZXBlbmQgb24gYW4gTlBNIHBhY2thZ2UgZm9yIHRoaXNcbiAqXG4gKiBSZXR1cm5zIGB0cnVlYCBpZiBldmVyeXRoaW5nIGdvdCBkZWxldGVkLCBvciBgZmFsc2VgIGlmIHNvbWUgZmlsZXMgY291bGRcbiAqIG5vdCBiZSBkZWxldGVkIGR1ZSB0byBwZXJtaXNzaW9ucyBpc3N1ZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByaW1yYWYoZnNQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICBsZXQgc3VjY2VzcyA9IHRydWU7XG4gICAgY29uc3QgaXNEaXIgPSBmcy5sc3RhdFN5bmMoZnNQYXRoKS5pc0RpcmVjdG9yeSgpO1xuXG4gICAgaWYgKGlzRGlyKSB7XG4gICAgICBmb3IgKGNvbnN0IGZpbGUgb2YgZnMucmVhZGRpclN5bmMoZnNQYXRoKSkge1xuICAgICAgICBzdWNjZXNzICYmPSByaW1yYWYocGF0aC5qb2luKGZzUGF0aCwgZmlsZSkpO1xuICAgICAgfVxuICAgICAgZnMucm1kaXJTeW5jKGZzUGF0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZzLnVubGlua1N5bmMoZnNQYXRoKTtcbiAgICB9XG4gICAgcmV0dXJuIHN1Y2Nlc3M7XG4gIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgIC8vIENhbiBoYXBwZW4gaWYgc29tZSBmaWxlcyBnb3QgZ2VuZXJhdGVkIGluc2lkZSBhIERvY2tlciBjb250YWluZXIgYW5kIGFyZSBub3cgaW5hZHZlcnRlbnRseSBvd25lZCBieSBgcm9vdGAuXG4gICAgLy8gV2UgY2FuJ3QgZXZlciBjbGVhbiB0aG9zZSB1cCBhbnltb3JlLCBidXQgc2luY2UgaXQgb25seSBoYXBwZW5zIGluc2lkZSBHaXRIdWIgQWN0aW9ucyBjb250YWluZXJzIHdlIGFsc28gZG9uJ3QgY2FyZSB0b28gbXVjaC5cbiAgICBpZiAoZS5jb2RlID09PSAnRUFDQ0VTJyB8fCBlLmNvZGUgPT09ICdFTk9URU1QVFknKSB7IHJldHVybiBmYWxzZTsgfVxuXG4gICAgLy8gQWxyZWFkeSBnb25lXG4gICAgaWYgKGUuY29kZSA9PT0gJ0VOT0VOVCcpIHsgcmV0dXJuIHRydWU7IH1cblxuICAgIHRocm93IGU7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFkZFRvU2hlbGxQYXRoKHg6IHN0cmluZykge1xuICBjb25zdCBwYXJ0cyA9IHByb2Nlc3MuZW52LlBBVEg/LnNwbGl0KCc6JykgPz8gW107XG5cbiAgaWYgKCFwYXJ0cy5pbmNsdWRlcyh4KSkge1xuICAgIHBhcnRzLnVuc2hpZnQoeCk7XG4gIH1cblxuICBwcm9jZXNzLmVudi5QQVRIID0gcGFydHMuam9pbignOicpO1xufVxuIl19
|
|
156
|
+
/**
|
|
157
|
+
* Accumulate text since the last line break (or beginning of string) it has seen in the chunks.
|
|
158
|
+
*
|
|
159
|
+
* Examples:
|
|
160
|
+
*
|
|
161
|
+
* - Chunks: ['one\n', 'two\n', three']
|
|
162
|
+
* - Last Line: 'three'
|
|
163
|
+
*
|
|
164
|
+
* - Chunks: ['one', 'two', '\nthree']
|
|
165
|
+
* - Last Line: 'three'
|
|
166
|
+
*
|
|
167
|
+
* - Chunks: ['one', 'two']
|
|
168
|
+
* - Last Line: 'onetwo'
|
|
169
|
+
*
|
|
170
|
+
* - Chunks: ['one', 'two', '\nthree', 'four']
|
|
171
|
+
* - Last Line: 'threefour'
|
|
172
|
+
*/
|
|
173
|
+
class LastLine {
|
|
174
|
+
constructor() {
|
|
175
|
+
this.lastLine = '';
|
|
176
|
+
}
|
|
177
|
+
append(chunk) {
|
|
178
|
+
const lines = chunk.split(os.EOL);
|
|
179
|
+
if (lines.length === 1) {
|
|
180
|
+
// chunk doesn't contain a new line so just append
|
|
181
|
+
this.lastLine += lines[0];
|
|
182
|
+
}
|
|
183
|
+
else {
|
|
184
|
+
// chunk contains multiple lines so just override with the last one
|
|
185
|
+
this.lastLine = lines[lines.length - 1];
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
get() {
|
|
189
|
+
return this.lastLine;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2hlbGwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJzaGVsbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFhQSxzQkErRkM7QUEwSEQsd0JBd0JDO0FBRUQsd0NBUUM7QUF2UUQseUJBQXlCO0FBQ3pCLHlCQUF5QjtBQUN6Qiw2QkFBNkI7QUFFN0IsdUNBQW9DO0FBR3BDOzs7O0dBSUc7QUFDSSxLQUFLLFVBQVUsS0FBSyxDQUFDLE9BQWlCLEVBQUUsVUFBd0IsRUFBRTs7SUFDdkUsSUFBSSxPQUFPLENBQUMsTUFBTSxJQUFJLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNsQyxNQUFNLElBQUksS0FBSyxDQUFDLHVDQUF1QyxDQUFDLENBQUM7SUFDM0QsQ0FBQztJQUVELE1BQU0sT0FBTyxHQUFHLElBQUksR0FBRyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN6QyxNQUFNLGNBQWMsR0FBRyxDQUFDLENBQVMsRUFBRSxFQUFFO1FBQ25DLEtBQUssTUFBTSxZQUFZLElBQUksT0FBTyxFQUFFLENBQUM7WUFDbkMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN4QixDQUFDO0lBQ0gsQ0FBQyxDQUFDO0lBRUYsNEJBQTRCO0lBQzVCLGNBQWMsQ0FBQyxNQUFNLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzVDLE1BQU0sSUFBSSxHQUFHLE1BQUEsT0FBTyxDQUFDLElBQUksbUNBQUksUUFBUSxDQUFDO0lBRXRDLE1BQU0sR0FBRyxHQUFHLE1BQUEsT0FBTyxDQUFDLEdBQUcsbUNBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsT0FBTyxDQUFDLEdBQUcsRUFBRSxHQUFHLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2xHLE1BQU0sR0FBRyxHQUFHLE9B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dXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGNoaWxkX3Byb2Nlc3MgZnJvbSAnY2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgKiBhcyBmcyBmcm9tICdmcyc7XG5pbXBvcnQgKiBhcyBvcyBmcm9tICdvcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgVGVzdENvbnRleHQgfSBmcm9tICcuL2ludGVnLXRlc3QnO1xuaW1wb3J0IHsgUHJvY2VzcyB9IGZyb20gJy4vcHJvY2Vzcyc7XG5pbXBvcnQgeyBUZW1wb3JhcnlEaXJlY3RvcnlDb250ZXh0IH0gZnJvbSAnLi93aXRoLXRlbXBvcmFyeS1kaXJlY3RvcnknO1xuXG4vKipcbiAqIEEgc2hlbGwgY29tbWFuZCB0aGF0IGRvZXMgd2hhdCB5b3Ugd2FudFxuICpcbiAqIElzIHBsYXRmb3JtLWF3YXJlLCBoYW5kbGVzIGVycm9ycyBuaWNlbHkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzaGVsbChjb21tYW5kOiBzdHJpbmdbXSwgb3B0aW9uczogU2hlbGxPcHRpb25zID0ge30pOiBQcm9taXNlPHN0cmluZz4ge1xuICBpZiAob3B0aW9ucy5tb2RFbnYgJiYgb3B0aW9ucy5lbnYpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1VzZSBlaXRoZXIgZW52IG9yIG1vZEVudiBidXQgbm90IGJvdGgnKTtcbiAgfVxuXG4gIGNvbnN0IG91dHB1dHMgPSBuZXcgU2V0KG9wdGlvbnMub3V0cHV0cyk7XG4gIGNvbnN0IHdyaXRlVG9PdXRwdXRzID0gKHg6IHN0cmluZykgPT4ge1xuICAgIGZvciAoY29uc3Qgb3V0cHV0U3RyZWFtIG9mIG91dHB1dHMpIHtcbiAgICAgIG91dHB1dFN0cmVhbS53cml0ZSh4KTtcbiAgICB9XG4gIH07XG5cbiAgLy8gQWx3YXlzIG91dHB1dCB0aGUgY29tbWFuZFxuICB3cml0ZVRvT3V0cHV0cyhg8J+SuyAke2NvbW1hbmQuam9pbignICcpfVxcbmApO1xuICBjb25zdCBzaG93ID0gb3B0aW9ucy5zaG93ID8/ICdhbHdheXMnO1xuXG4gIGNvbnN0IGVudiA9IG9wdGlvbnMuZW52ID8/IChvcHRpb25zLm1vZEVudiA/IHsgLi4ucHJvY2Vzcy5lbnYsIC4uLm9wdGlvbnMubW9kRW52IH0gOiBwcm9jZXNzLmVudik7XG4gIGNvbnN0IHR0eSA9IG9wdGlvbnMuaW50ZXJhY3QgJiYgb3B0aW9ucy5pbnRlcmFjdC5sZW5ndGggPiAwO1xuXG4gIC8vIENvZXJjZSB0byBgYW55YCBiZWNhdXNlIGBTaGVsbE9wdGlvbnNgIGNvbnRhaW5zIGN1c3RvbSBwcm9wZXJ0aWVzXG4gIC8vIHRoYXQgZG9uJ3QgZXhpc3QgaW4gdGhlIHVuZGVybHlpbmcgaW50ZXJmYWNlcy4gV2UgY291bGQgZWl0aGVyIHJlYnVpbGQgZWFjaCBvcHRpb25zIG1hcCxcbiAgLy8gb3IganVzdCBwYXNzIHRocm91Z2ggYW5kIGxldCB0aGUgdW5kZXJseWluZyBpbXBsZW1lbmF0aW9uIGlnbm9yZSB3aGF0IGl0IGRvZXNuJ3Qga25vdyBhYm91dC5cbiAgLy8gV2UgY2hvb3NlIHRoZSBsYXp5IG9uZS5cbiAgY29uc3Qgc3Bhd25PcHRpb25zID0geyAuLi5vcHRpb25zLCBlbnYgfSBhcyBhbnk7XG5cbiAgY29uc3QgY2hpbGQgPSB0dHlcbiAgICA/IFByb2Nlc3Muc3Bhd25UVFkoY29tbWFuZFswXSwgY29tbWFuZC5zbGljZSgxKSwgc3Bhd25PcHRpb25zKVxuICAgIDogUHJvY2Vzcy5zcGF3bihjb21tYW5kWzBdLCBjb21tYW5kLnNsaWNlKDEpLCBzcGF3bk9wdGlvbnMpXG5cbiAgLy8gY29weSBiZWNhdXNlIHdlIHdpbGwgYmUgc2hpZnRpbmcgaXRcbiAgY29uc3QgcmVtYWluaW5nSW50ZXJhY3Rpb25zID0gWy4uLihvcHRpb25zLmludGVyYWN0ID8/IFtdKV07XG5cbiAgcmV0dXJuIG5ldyBQcm9taXNlPHN0cmluZz4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IHN0ZG91dCA9IG5ldyBBcnJheTxCdWZmZXI+KCk7XG4gICAgY29uc3Qgc3RkZXJyID0gbmV3IEFycmF5PEJ1ZmZlcj4oKTtcblxuICAgIGNvbnN0IGxhc3RMaW5lID0gbmV3IExhc3RMaW5lKCk7XG5cbiAgICBjaGlsZC5vblN0ZG91dChjaHVuayA9PiB7XG4gICAgICBpZiAoc2hvdyA9PT0gJ2Fsd2F5cycpIHtcbiAgICAgICAgd3JpdGVUb091dHB1dHMoY2h1bmsudG9TdHJpbmcoJ3V0Zi04JykpO1xuICAgICAgfVxuICAgICAgc3Rkb3V0LnB1c2goY2h1bmspO1xuICAgICAgbGFzdExpbmUuYXBwZW5kKGNodW5rLnRvU3RyaW5nKCd1dGYtOCcpKTtcblxuICAgICAgY29uc3QgaW50ZXJhY3Rpb24gPSByZW1haW5pbmdJbnRlcmFjdGlvbnNbMF07XG4gICAgICBpZiAoaW50ZXJhY3Rpb24pIHtcblxuICAgICAgICBpZiAoaW50ZXJhY3Rpb24ucHJvbXB0LnRlc3QobGFzdExpbmUuZ2V0KCkpKSB7XG4gICAgICAgICAgLy8gc3VicHJvY2VzcyBleHBlY3RzIGEgdXNlciBpbnB1dCBub3dcbiAgICAgICAgICBjaGlsZC53cml0ZVN0ZGluKGludGVyYWN0aW9uLmlucHV0ICsgKGludGVyYWN0aW9uLmVuZCA/PyBvcy5FT0wpKTtcbiAgICAgICAgICByZW1haW5pbmdJbnRlcmFjdGlvbnMuc2hpZnQoKTtcbiAgICAgICAgfVxuXG4gICAgICB9XG5cbiAgICB9KTtcblxuICAgIGNoaWxkLm9uU3RkZXJyKGNodW5rID0+IHtcbiAgICAgIGlmIChzaG93ID09PSAnYWx3YXlzJykge1xuICAgICAgICB3cml0ZVRvT3V0cHV0cyhjaHVuay50b1N0cmluZygndXRmLTgnKSk7XG4gICAgICB9XG4gICAgICBpZiAob3B0aW9ucy5jYXB0dXJlU3RkZXJyID8/IHRydWUpIHtcbiAgICAgICAgc3RkZXJyLnB1c2goY2h1bmspO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgY2hpbGQub25FcnJvcihyZWplY3QpO1xuXG4gICAgY2hpbGQub25FeGl0KGNvZGUgPT4ge1xuICAgICAgY29uc3Qgc3RkZXJyT3V0cHV0ID0gQnVmZmVyLmNvbmNhdChzdGRlcnIpLnRvU3RyaW5nKCd1dGYtOCcpO1xuICAgICAgY29uc3Qgc3Rkb3V0T3V0cHV0ID0gQnVmZmVyLmNvbmNhdChzdGRvdXQpLnRvU3RyaW5nKCd1dGYtOCcpO1xuICAgICAgY29uc3Qgb3V0ID0gKG9wdGlvbnMub25seVN0ZGVyciA/IHN0ZGVyck91dHB1dCA6IHN0ZG91dE91dHB1dCArIHN0ZGVyck91dHB1dCkudHJpbSgpO1xuXG4gICAgICBjb25zdCBsb2dBbmRyZWplY3QgPSAoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICAgIGlmIChzaG93ID09PSAnZXJyb3InKSB7XG4gICAgICAgICAgd3JpdGVUb091dHB1dHMoYCR7b3V0fVxcbmApO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9XG5cbiAgICAgIGlmIChyZW1haW5pbmdJbnRlcmFjdGlvbnMubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgIC8vIHJlZ2FyZGxlc3Mgb2YgdGhlIGV4aXQgY29kZSwgaWYgd2UgZGlkbid0IGNvbnN1bWUgYWxsIGV4cGVjdGVkIGludGVyYWN0aW9ucyB3ZSBwcm9iYWJseVxuICAgICAgICAvLyBkaWQgc29tZXRoaWluZyB3cm9uZy5cbiAgICAgICAgbG9nQW5kcmVqZWN0KG5ldyBFcnJvcihgRXhwZWN0ZWQgbW9yZSB1c2VyIGludGVyYWN0aW9ucyBidXQgc3VicHJvY2VzcyBleGl0ZWQgd2l0aCAke2NvZGV9YCkpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChjb2RlID09PSAwIHx8IG9wdGlvbnMuYWxsb3dFcnJFeGl0KSB7XG4gICAgICAgIHJlc29sdmUob3V0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvZ0FuZHJlamVjdChuZXcgRXJyb3IoYCcke2NvbW1hbmQuam9pbignICcpfScgZXhpdGVkIHdpdGggZXJyb3IgY29kZSAke2NvZGV9LmApKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG59XG5cbi8qKlxuICogTW9kZWxzIGEgc2luZ2xlIHVzZXIgaW50ZXJhY3Rpb24gd2l0aCB0aGUgc2hlbGwuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXNlckludGVyYWN0aW9uIHtcbiAgLyoqXG4gICAqIFRoZSBwcm9tcHQgdG8gZXhwZWN0LiBSZWdleCBtYXRjaGVkIGFnYWluc3QgdGhlIGxhc3QgbGluZSBpblxuICAgKiB0aGUgb3V0cHV0IGJlZm9yZSB0aGUgcHJvbXB0IGlzIGRpc3BsYXllZC5cbiAgICpcbiAgICogTW9zdCBjb21tb25seSB0aGlzIHdvdWxkIGJlIGEgc2ltcGxlIHN0cmluZyB0byBtYXRjaCBmb3IgaW5jbHVzaW9uLlxuICAgKlxuICAgKiBFeGFtcGxlczpcbiAgICpcbiAgICogLSBQcm9jZXNzIE91dHB1dDogXCJIZXkgdGhlcmUhIEFyZSB5b3Ugc3VyZT9cIlxuICAgKiAgIFByb21wdDogL0FyZSB5b3Ugc3VyZT8vXG4gICAqICAgTWF0Y2ggKFllcy9Obyk6IFllc1xuICAgKiAgIFJlYXNvbjogXCJIZXkgdGhlcmUhIEFyZSB5b3Ugc3VyZT9cIiB+IC9BcmUgeW91IHN1cmU/L1xuICAgKlxuICAgKiAtIFByb2Nlc3MgT3V0cHV0OiBcIkhleSB0aGVyZSFcXG5BcmUgeW91IHN1cmU/XCJcbiAgICogICBQcm9tcHQ6IC9BcmUgeW91IHN1cmU/L1xuICAgKiAgIE1hdGNoIChZZXMvTm8pOiBZZXNcbiAgICogICBSZWFzb246IFwiQXJlIHlvdSBzdXJlP1wiIH4gL0FyZSB5b3Ugc3VyZT8vXG4gICAqXG4gICAqIC0gUHJvY2VzcyBPdXRwdXQ6IFwiQXJlIHlvdSBzdXJlP1xcbihyZW1lbWJlciB0aGlzIGlzIGRlc3RydWN0aXZlKVwiXG4gICAqICAgUHJvbXB0OiAvQXJlIHlvdSBzdXJlPy9cbiAgICogICBNYXRjaCAoWWVzL05vKTogTm9cbiAgICogICBSZWFzb246IFwiKHJlbWVtYmVyIHRoaXMgaXMgZGVzdHJ1Y3RpdmUpXCIg4omEIC9BcmUgeW91IHN1cmU/L1xuICAgKlxuICAgKiAtIFByb2Nlc3MgT3V0cHV0OiBcIkFyZSB5b3Ugc3VyZT9cXG4ocmVtZW1iZXIgdGhpcyBpcyBkZXN0cnVjdGl2ZSlcIlxuICAgKiAgIFByb21wdDogL3JlbWVtYmVyIHRoaXMgaXMgZGVzdHJ1Y3RpdmUvXG4gICAqICAgTWF0Y2ggKFllcy9Obyk6IFllc1xuICAgKiAgIFJlYXNvbjogXCIocmVtZW1iZXIgdGhpcyBpcyBkZXN0cnVjdGl2ZSlcIiB+IC9yZW1lbWJlciB0aGlzIGlzIGRlc3RydWN0aXZlL1xuICAgKlxuICAgKi9cbiAgcmVhZG9ubHkgcHJvbXB0OiBSZWdFeHA7XG4gIC8qKlxuICAgKiBUaGUgaW5wdXQgdG8gcHJvdmlkZS5cbiAgICovXG4gIHJlYWRvbmx5IGlucHV0OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBzdHJpbmcgdG8gc2lnbmFsIHRoZSBlbmQgb2YgaW5wdXQuXG4gICAqXG4gICAqIEBkZWZhdWx0IG9zLkVPTFxuICAgKi9cbiAgcmVhZG9ubHkgZW5kPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNoZWxsT3B0aW9ucyBleHRlbmRzIGNoaWxkX3Byb2Nlc3MuU3Bhd25PcHRpb25zIHtcbiAgLyoqXG4gICAqIFByb3BlcnRpZXMgdG8gYWRkIHRvICdlbnYnXG4gICAqL1xuICByZWFkb25seSBtb2RFbnY/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+O1xuXG4gIC8qKlxuICAgKiBEb24ndCBmYWlsIHdoZW4gZXhpdGluZyB3aXRoIGFuIGVycm9yXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBhbGxvd0VyckV4aXQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGNhcHR1cmUgc3RkZXJyXG4gICAqXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHJlYWRvbmx5IGNhcHR1cmVTdGRlcnI/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBQYXNzIG91dHB1dCBoZXJlXG4gICAqL1xuICByZWFkb25seSBvdXRwdXRzPzogTm9kZUpTLldyaXRhYmxlU3RyZWFtW107XG5cbiAgLyoqXG4gICAqIE9ubHkgcmV0dXJuIHN0ZGVyci4gRm9yIGV4YW1wbGUsIHRoaXMgaXMgdXNlZCB0byB2YWxpZGF0ZVxuICAgKiB0aGF0IHdoZW4gQ0k9dHJ1ZSwgYWxsIGxvZ3MgYXJlIHNlbnQgdG8gc3Rkb3V0LlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgb25seVN0ZGVycj86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIERvbid0IGxvZyB0byBzdGRvdXRcbiAgICpcbiAgICogQGRlZmF1bHQgYWx3YXlzXG4gICAqL1xuICByZWFkb25seSBzaG93PzogJ2Fsd2F5cycgfCAnbmV2ZXInIHwgJ2Vycm9yJztcblxuICAvKipcbiAgICogUHJvdmlkZSB1c2VyIGludGVyYWN0aW9uIHRvIHJlc3BvbmQgdG8gc2hlbGwgcHJvbXB0cy5cbiAgICpcbiAgICogT3JkZXIgYW5kIGNvdW50IHNob3VsZCBjb3JyZXNwb25kIHRvIHRoZSBleHBlY3RlZCBwcm9tcHRzIGlzc3VlZCBieSB0aGUgc3VicHJvY2Vzcy5cbiAgICovXG4gIHJlYWRvbmx5IGludGVyYWN0PzogVXNlckludGVyYWN0aW9uW107XG5cbn1cblxuZXhwb3J0IGNsYXNzIFNoZWxsSGVscGVyIHtcbiAgcHVibGljIHN0YXRpYyBmcm9tQ29udGV4dChjb250ZXh0OiBUZXN0Q29udGV4dCAmIFRlbXBvcmFyeURpcmVjdG9yeUNvbnRleHQpIHtcbiAgICByZXR1cm4gbmV3IFNoZWxsSGVscGVyKGNvbnRleHQuaW50ZWdUZXN0RGlyLCBjb250ZXh0Lm91dHB1dCk7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9jd2Q6IHN0cmluZyxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9vdXRwdXQ6IE5vZGVKUy5Xcml0YWJsZVN0cmVhbSkgeyB9XG5cbiAgcHVibGljIGFzeW5jIHNoZWxsKGNvbW1hbmQ6IHN0cmluZ1tdLCBvcHRpb25zOiBPbWl0PFNoZWxsT3B0aW9ucywgJ2N3ZCcgfCAnb3V0cHV0cyc+ID0ge30pOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBzaGVsbChjb21tYW5kLCB7XG4gICAgICBvdXRwdXRzOiBbdGhpcy5fb3V0cHV0XSxcbiAgICAgIGN3ZDogdGhpcy5fY3dkLFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIHJtIC1yZiByZWltcGxlbWVudGF0aW9uLCBkb24ndCB3YW50IHRvIGRlcGVuZCBvbiBhbiBOUE0gcGFja2FnZSBmb3IgdGhpc1xuICpcbiAqIFJldHVybnMgYHRydWVgIGlmIGV2ZXJ5dGhpbmcgZ290IGRlbGV0ZWQsIG9yIGBmYWxzZWAgaWYgc29tZSBmaWxlcyBjb3VsZFxuICogbm90IGJlIGRlbGV0ZWQgZHVlIHRvIHBlcm1pc3Npb25zIGlzc3Vlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJpbXJhZihmc1BhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICB0cnkge1xuICAgIGxldCBzdWNjZXNzID0gdHJ1ZTtcbiAgICBjb25zdCBpc0RpciA9IGZzLmxzdGF0U3luYyhmc1BhdGgpLmlzRGlyZWN0b3J5KCk7XG5cbiAgICBpZiAoaXNEaXIpIHtcbiAgICAgIGZvciAoY29uc3QgZmlsZSBvZiBmcy5yZWFkZGlyU3luYyhmc1BhdGgpKSB7XG4gICAgICAgIHN1Y2Nlc3MgJiY9IHJpbXJhZihwYXRoLmpvaW4oZnNQYXRoLCBmaWxlKSk7XG4gICAgICB9XG4gICAgICBmcy5ybWRpclN5bmMoZnNQYXRoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZnMudW5saW5rU3luYyhmc1BhdGgpO1xuICAgIH1cbiAgICByZXR1cm4gc3VjY2VzcztcbiAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgLy8gQ2FuIGhhcHBlbiBpZiBzb21lIGZpbGVzIGdvdCBnZW5lcmF0ZWQgaW5zaWRlIGEgRG9ja2VyIGNvbnRhaW5lciBhbmQgYXJlIG5vdyBpbmFkdmVydGVudGx5IG93bmVkIGJ5IGByb290YC5cbiAgICAvLyBXZSBjYW4ndCBldmVyIGNsZWFuIHRob3NlIHVwIGFueW1vcmUsIGJ1dCBzaW5jZSBpdCBvbmx5IGhhcHBlbnMgaW5zaWRlIEdpdEh1YiBBY3Rpb25zIGNvbnRhaW5lcnMgd2UgYWxzbyBkb24ndCBjYXJlIHRvbyBtdWNoLlxuICAgIGlmIChlLmNvZGUgPT09ICdFQUNDRVMnIHx8IGUuY29kZSA9PT0gJ0VOT1RFTVBUWScpIHsgcmV0dXJuIGZhbHNlOyB9XG5cbiAgICAvLyBBbHJlYWR5IGdvbmVcbiAgICBpZiAoZS5jb2RlID09PSAnRU5PRU5UJykgeyByZXR1cm4gdHJ1ZTsgfVxuXG4gICAgdGhyb3cgZTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gYWRkVG9TaGVsbFBhdGgoeDogc3RyaW5nKSB7XG4gIGNvbnN0IHBhcnRzID0gcHJvY2Vzcy5lbnYuUEFUSD8uc3BsaXQoJzonKSA/PyBbXTtcblxuICBpZiAoIXBhcnRzLmluY2x1ZGVzKHgpKSB7XG4gICAgcGFydHMudW5zaGlmdCh4KTtcbiAgfVxuXG4gIHByb2Nlc3MuZW52LlBBVEggPSBwYXJ0cy5qb2luKCc6Jyk7XG59XG5cbi8qKlxuICogQWNjdW11bGF0ZSB0ZXh0IHNpbmNlIHRoZSBsYXN0IGxpbmUgYnJlYWsgKG9yIGJlZ2lubmluZyBvZiBzdHJpbmcpIGl0IGhhcyBzZWVuIGluIHRoZSBjaHVua3MuXG4gKlxuICogRXhhbXBsZXM6XG4gKlxuICogLSBDaHVua3M6IFsnb25lXFxuJywgJ3R3b1xcbicsIHRocmVlJ11cbiAqIC0gTGFzdCBMaW5lOiAndGhyZWUnXG4gKlxuICogLSBDaHVua3M6IFsnb25lJywgJ3R3bycsICdcXG50aHJlZSddXG4gKiAtIExhc3QgTGluZTogJ3RocmVlJ1xuICpcbiAqIC0gQ2h1bmtzOiBbJ29uZScsICd0d28nXVxuICogLSBMYXN0IExpbmU6ICdvbmV0d28nXG4gKlxuICogLSBDaHVua3M6IFsnb25lJywgJ3R3bycsICdcXG50aHJlZScsICdmb3VyJ11cbiAqIC0gTGFzdCBMaW5lOiAndGhyZWVmb3VyJ1xuICovXG5jbGFzcyBMYXN0TGluZSB7XG5cbiAgcHJpdmF0ZSBsYXN0TGluZTogc3RyaW5nID0gJyc7XG5cbiAgcHVibGljIGFwcGVuZChjaHVuazogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgbGluZXMgPSBjaHVuay5zcGxpdChvcy5FT0wpO1xuICAgIGlmIChsaW5lcy5sZW5ndGggPT09IDEpIHtcbiAgICAgIC8vIGNodW5rIGRvZXNuJ3QgY29udGFpbiBhIG5ldyBsaW5lIHNvIGp1c3QgYXBwZW5kXG4gICAgICB0aGlzLmxhc3RMaW5lICs9IGxpbmVzWzBdO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBjaHVuayBjb250YWlucyBtdWx0aXBsZSBsaW5lcyBzbyBqdXN0IG92ZXJyaWRlIHdpdGggdGhlIGxhc3Qgb25lXG4gICAgICB0aGlzLmxhc3RMaW5lID0gbGluZXNbbGluZXMubGVuZ3RoIC0gMV07XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmxhc3RMaW5lO1xuICB9XG59Il19
|