teen_process 2.2.3 → 2.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +18 -5
- package/build/lib/subprocess.d.ts +27 -11
- package/build/lib/subprocess.d.ts.map +1 -1
- package/build/lib/subprocess.js +33 -22
- package/build/lib/subprocess.js.map +1 -1
- package/lib/subprocess.js +47 -31
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -111,6 +111,21 @@ async function tailFileForABit () {
|
|
|
111
111
|
|
|
112
112
|
Errors with start/stop are thrown in the calling context.
|
|
113
113
|
|
|
114
|
+
### Options
|
|
115
|
+
|
|
116
|
+
The instance constructor accepts same options that Node.js's
|
|
117
|
+
[spawn](https://nodejs.org/api/child_process.html#child_processspawncommand-args-options)
|
|
118
|
+
API plus some custom options:
|
|
119
|
+
|
|
120
|
+
* `isBuffer` - If set to `true` then both stdout and stderr chunks are delivered
|
|
121
|
+
as buffers rather than strings to the following entities:
|
|
122
|
+
- `startDetector` argument
|
|
123
|
+
- `output` event
|
|
124
|
+
* `encoding` - If provided then arguments of the `startDetector` argument and of the
|
|
125
|
+
`output` event will be encoded to strings using this given encoding, unless `isBuffer`
|
|
126
|
+
is set to `true`. If no explicit encoding is provided then `utf8` encoding is used by
|
|
127
|
+
default.
|
|
128
|
+
|
|
114
129
|
### Events
|
|
115
130
|
|
|
116
131
|
You can listen to 8 events:
|
|
@@ -151,11 +166,9 @@ proc.on('output', (stdout, stderr) => {
|
|
|
151
166
|
console.log(`stderr: ${stderr}`);
|
|
152
167
|
});
|
|
153
168
|
|
|
154
|
-
//
|
|
155
|
-
proc.on('
|
|
156
|
-
console.log(
|
|
157
|
-
// ['foo', 'bar', 'baz']
|
|
158
|
-
// automatically handles rejoining lines across stream chunks
|
|
169
|
+
// line-stderr is just the same
|
|
170
|
+
proc.on('line-stdout', (line) => {
|
|
171
|
+
console.log(line);
|
|
159
172
|
});
|
|
160
173
|
|
|
161
174
|
// stream-line gives you one line at a time, with [STDOUT] or [STDERR]
|
|
@@ -1,13 +1,20 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
/**
|
|
2
|
+
* @template {SubProcessOptions} TSubProcessOptions
|
|
3
|
+
*/
|
|
4
|
+
export class SubProcess<TSubProcessOptions extends SubProcessOptions> extends EventEmitter<[never]> {
|
|
4
5
|
/**
|
|
5
6
|
* @param {string} cmd
|
|
6
|
-
* @param {string[]} [args]
|
|
7
|
-
* @param {
|
|
7
|
+
* @param {string[]} [args=[]]
|
|
8
|
+
* @param {TSubProcessOptions} [opts]
|
|
9
|
+
*/
|
|
10
|
+
constructor(cmd: string, args?: string[], opts?: TSubProcessOptions);
|
|
11
|
+
/**
|
|
12
|
+
* @callback StartDetector
|
|
13
|
+
* @param {TSubProcessOptions extends TIsBufferOpts ? Buffer : string} stdout
|
|
14
|
+
* @param {TSubProcessOptions extends TIsBufferOpts ? Buffer : string} [stderr]
|
|
15
|
+
* @returns {any}
|
|
8
16
|
*/
|
|
9
|
-
|
|
10
|
-
/** @type {import('child_process').ChildProcess?} */
|
|
17
|
+
/** @type {import('child_process').ChildProcess | null} */
|
|
11
18
|
proc: import("child_process").ChildProcess | null;
|
|
12
19
|
/** @type {string[]} */
|
|
13
20
|
args: string[];
|
|
@@ -16,9 +23,9 @@ export class SubProcess extends events<[never]> {
|
|
|
16
23
|
*/
|
|
17
24
|
cmd: string;
|
|
18
25
|
/**
|
|
19
|
-
* @type {
|
|
26
|
+
* @type {SubProcessOptions}
|
|
20
27
|
*/
|
|
21
|
-
opts:
|
|
28
|
+
opts: SubProcessOptions;
|
|
22
29
|
/**
|
|
23
30
|
* @type {boolean}
|
|
24
31
|
*/
|
|
@@ -43,7 +50,7 @@ export class SubProcess extends events<[never]> {
|
|
|
43
50
|
* @param {boolean} detach
|
|
44
51
|
* @returns {Promise<void>}
|
|
45
52
|
*/
|
|
46
|
-
start(startDetector?:
|
|
53
|
+
start(startDetector?: ((stdout: TSubProcessOptions extends TIsBufferOpts ? Buffer : string, stderr?: (TSubProcessOptions extends TIsBufferOpts ? Buffer<ArrayBufferLike> : string) | undefined) => any) | (number | null), timeoutMs?: number | null, detach?: boolean): Promise<void>;
|
|
47
54
|
/**
|
|
48
55
|
* @deprecated This method is deprecated and will be removed
|
|
49
56
|
*/
|
|
@@ -59,5 +66,14 @@ export class SubProcess extends events<[never]> {
|
|
|
59
66
|
detachProcess(): void;
|
|
60
67
|
get pid(): number | null | undefined;
|
|
61
68
|
}
|
|
62
|
-
|
|
69
|
+
export default SubProcess;
|
|
70
|
+
export type SubProcessCustomOptions = {
|
|
71
|
+
isBuffer?: boolean | undefined;
|
|
72
|
+
encoding?: string | undefined;
|
|
73
|
+
};
|
|
74
|
+
export type SubProcessOptions = SubProcessCustomOptions & import("child_process").SpawnOptionsWithoutStdio;
|
|
75
|
+
export type TIsBufferOpts = {
|
|
76
|
+
isBuffer: true;
|
|
77
|
+
};
|
|
78
|
+
import { EventEmitter } from 'events';
|
|
63
79
|
//# sourceMappingURL=subprocess.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subprocess.d.ts","sourceRoot":"","sources":["../../lib/subprocess.js"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"subprocess.d.ts","sourceRoot":"","sources":["../../lib/subprocess.js"],"names":[],"mappings":"AAQA;;GAEG;AACH,wBAFiC,kBAAkB,SAArC,iBAAkB;IA+B9B;;;;OAIG;IACH,iBAJW,MAAM,SACN,MAAM,EAAE,SACR,kBAAkB,EAgB5B;IA/CD;;;;;OAKG;IAEH,0DAA0D;IAC1D,MADW,OAAO,eAAe,EAAE,YAAY,GAAG,IAAI,CACjD;IACL,uBAAuB;IACvB,MADW,MAAM,EAAE,CACd;IACL;;OAEG;IACH,KAFU,MAAM,CAEZ;IACJ;;MAEE;IACF,MAFU,iBAAiB,CAEtB;IACL;;OAEG;IACH,eAFU,OAAO,CAEH;IACd;;OAEG;IACH,KAFU,MAAM,CAEZ;IAuBJ,yBAGC;IAED;;;;OAIG;IACH,sBAHW,MAAM,SACN,QAAQ,CAAC,MAAM,CAAC,GAAC,MAAM,QAYjC;IAED;;;;;;;;OAQG;IACH,sBALW,UAzEA,kBAAkB,SAAS,aAAa,GAAG,MAAM,GAAG,MAAM,yGAExD,GAAG,KAuES,MAAM,OAAC,CAAA,cACrB,MAAM,OAAC,WACP,OAAO,GACL,OAAO,CAAC,IAAI,CAAC,CAiKzB;IAED;;OAEG;IACH,wBAGC;IAED;;;;;OAKG;IACH,cAJW,MAAM,CAAC,OAAO,YACd,MAAM,GACJ,OAAO,CAAC,IAAI,CAAC,CAgBzB;IAED,gDAcC;IAKD,sBAQC;IAED,qCAEC;CACF;;;;;;gCAWY,uBAAuB,GAAG,OAAO,eAAe,EAAE,wBAAwB;4BAC1E;IAAC,QAAQ,EAAE,IAAI,CAAA;CAAC;6BAtUA,QAAQ"}
|
package/build/lib/subprocess.js
CHANGED
|
@@ -5,20 +5,22 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.SubProcess = void 0;
|
|
7
7
|
const child_process_1 = require("child_process");
|
|
8
|
-
const events_1 =
|
|
9
|
-
const { EventEmitter } = events_1.default;
|
|
8
|
+
const events_1 = require("events");
|
|
10
9
|
const bluebird_1 = __importDefault(require("bluebird"));
|
|
11
10
|
const shell_quote_1 = require("shell-quote");
|
|
12
11
|
const lodash_1 = __importDefault(require("lodash"));
|
|
13
12
|
const helpers_1 = require("./helpers");
|
|
14
13
|
const node_readline_1 = require("node:readline");
|
|
15
|
-
|
|
14
|
+
/**
|
|
15
|
+
* @template {SubProcessOptions} TSubProcessOptions
|
|
16
|
+
*/
|
|
17
|
+
class SubProcess extends events_1.EventEmitter {
|
|
16
18
|
/**
|
|
17
19
|
* @param {string} cmd
|
|
18
|
-
* @param {string[]} [args]
|
|
19
|
-
* @param {
|
|
20
|
+
* @param {string[]} [args=[]]
|
|
21
|
+
* @param {TSubProcessOptions} [opts]
|
|
20
22
|
*/
|
|
21
|
-
constructor(cmd, args = [], opts
|
|
23
|
+
constructor(cmd, args = [], opts) {
|
|
22
24
|
super();
|
|
23
25
|
if (!cmd)
|
|
24
26
|
throw new Error('Command is required'); // eslint-disable-line curly
|
|
@@ -29,7 +31,7 @@ class SubProcess extends EventEmitter {
|
|
|
29
31
|
this.cmd = cmd;
|
|
30
32
|
this.args = args;
|
|
31
33
|
this.proc = null;
|
|
32
|
-
this.opts = opts;
|
|
34
|
+
this.opts = opts ?? {};
|
|
33
35
|
this.expectingExit = false;
|
|
34
36
|
// get a quoted representation of the command for error strings
|
|
35
37
|
this.rep = (0, shell_quote_1.quote)([cmd, ...args]);
|
|
@@ -97,16 +99,12 @@ class SubProcess extends EventEmitter {
|
|
|
97
99
|
return await new bluebird_1.default((resolve, reject) => {
|
|
98
100
|
// actually spawn the subproc
|
|
99
101
|
this.proc = (0, child_process_1.spawn)(this.cmd, this.args, this.opts);
|
|
100
|
-
if (this.proc.stdout) {
|
|
101
|
-
this.proc.stdout.setEncoding(this.opts.encoding || 'utf8');
|
|
102
|
-
}
|
|
103
|
-
if (this.proc.stderr) {
|
|
104
|
-
this.proc.stderr.setEncoding(this.opts.encoding || 'utf8');
|
|
105
|
-
}
|
|
106
102
|
// this function handles output that we collect from the subproc
|
|
107
103
|
/**
|
|
108
|
-
*
|
|
109
|
-
*
|
|
104
|
+
* @param { {
|
|
105
|
+
* stdout: TSubProcessOptions extends TIsBufferOpts ? Buffer : string,
|
|
106
|
+
* stderr: TSubProcessOptions extends TIsBufferOpts ? Buffer : string
|
|
107
|
+
* } } streams
|
|
110
108
|
*/
|
|
111
109
|
const handleOutput = (streams) => {
|
|
112
110
|
const { stdout, stderr } = streams;
|
|
@@ -129,7 +127,7 @@ class SubProcess extends EventEmitter {
|
|
|
129
127
|
this.proc?.removeAllListeners('exit');
|
|
130
128
|
this.proc?.kill('SIGINT');
|
|
131
129
|
if (err.code === 'ENOENT') {
|
|
132
|
-
err = await (0, helpers_1.formatEnoent)(err, this.cmd, this.opts?.cwd);
|
|
130
|
+
err = await (0, helpers_1.formatEnoent)(err, this.cmd, this.opts?.cwd?.toString());
|
|
133
131
|
}
|
|
134
132
|
reject(err);
|
|
135
133
|
this.proc?.unref();
|
|
@@ -149,12 +147,22 @@ class SubProcess extends EventEmitter {
|
|
|
149
147
|
}
|
|
150
148
|
});
|
|
151
149
|
};
|
|
150
|
+
const isBuffer = Boolean(this.opts.isBuffer);
|
|
151
|
+
const encoding = this.opts.encoding || 'utf8';
|
|
152
152
|
if (this.proc.stdout) {
|
|
153
|
-
this.proc.stdout.on('data', (chunk) => handleOutput({
|
|
153
|
+
this.proc.stdout.on('data', (chunk) => handleOutput({
|
|
154
|
+
stdout: isBuffer ? chunk : chunk.toString(encoding),
|
|
155
|
+
// @ts-ignore This is OK
|
|
156
|
+
stderr: isBuffer ? Buffer.alloc(0) : '',
|
|
157
|
+
}));
|
|
154
158
|
handleStreamLines('stdout', this.proc.stdout);
|
|
155
159
|
}
|
|
156
160
|
if (this.proc.stderr) {
|
|
157
|
-
this.proc.stderr.on('data', (chunk) => handleOutput({
|
|
161
|
+
this.proc.stderr.on('data', (chunk) => handleOutput({
|
|
162
|
+
// @ts-ignore This is OK
|
|
163
|
+
stdout: isBuffer ? Buffer.alloc(0) : '',
|
|
164
|
+
stderr: isBuffer ? chunk : chunk.toString(encoding)
|
|
165
|
+
}));
|
|
158
166
|
handleStreamLines('stderr', this.proc.stderr);
|
|
159
167
|
}
|
|
160
168
|
// when the proc exits, we might still have a buffer of lines we were
|
|
@@ -258,9 +266,12 @@ class SubProcess extends EventEmitter {
|
|
|
258
266
|
exports.SubProcess = SubProcess;
|
|
259
267
|
exports.default = SubProcess;
|
|
260
268
|
/**
|
|
261
|
-
* @
|
|
262
|
-
* @
|
|
263
|
-
* @
|
|
264
|
-
|
|
269
|
+
* @typedef {Object} SubProcessCustomOptions
|
|
270
|
+
* @property {boolean} [isBuffer]
|
|
271
|
+
* @property {string} [encoding]
|
|
272
|
+
*/
|
|
273
|
+
/**
|
|
274
|
+
* @typedef {SubProcessCustomOptions & import('child_process').SpawnOptionsWithoutStdio} SubProcessOptions
|
|
275
|
+
* @typedef {{isBuffer: true}} TIsBufferOpts
|
|
265
276
|
*/
|
|
266
277
|
//# sourceMappingURL=subprocess.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subprocess.js","sourceRoot":"","sources":["../../lib/subprocess.js"],"names":[],"mappings":";;;;;;AAAA,iDAAsC;AACtC,
|
|
1
|
+
{"version":3,"file":"subprocess.js","sourceRoot":"","sources":["../../lib/subprocess.js"],"names":[],"mappings":";;;;;;AAAA,iDAAsC;AACtC,mCAAsC;AACtC,wDAAyB;AACzB,6CAAoC;AACpC,oDAAuB;AACvB,uCAAyC;AACzC,iDAAgD;AAEhD;;GAEG;AACH,MAAa,UAAW,SAAQ,qBAAY;IA6B1C;;;;OAIG;IACH,YAAa,GAAG,EAAE,IAAI,GAAG,EAAE,EAAE,IAAI;QAC/B,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,GAAG;YAAE,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC,CAAC,4BAA4B;QAC9E,IAAI,CAAC,gBAAC,CAAC,QAAQ,CAAC,GAAG,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC,CAAC,4BAA4B;QAC/F,IAAI,CAAC,gBAAC,CAAC,OAAO,CAAC,IAAI,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC,CAAC,4BAA4B;QAE5F,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;QAE3B,+DAA+D;QAC/D,IAAI,CAAC,GAAG,GAAG,IAAA,mBAAK,EAAC,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC;IACnC,CAAC;IAED,IAAI,SAAS;QACX,yDAAyD;QACzD,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;IACrB,CAAC;IAED;;;;OAIG;IACH,SAAS,CAAE,UAAU,EAAE,KAAK;QAC1B,MAAM,MAAM,GAAG,CAAC,qBAAqB,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,UAAU,CAAC,WAAW,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;QAEjH,IAAI,gBAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YACtB,MAAM,CAAC,KAAK,CAAC,CAAC;QAChB,CAAC;aAAM,CAAC;YACN,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,MAAM,CAAC,IAAI,CAAC,CAAC;YACf,CAAC;QACH,CAAC;IACH,CAAC;IAED;;;;;;;;OAQG;IACH,KAAK,CAAC,KAAK,CAAE,aAAa,GAAG,IAAI,EAAE,SAAS,GAAG,IAAI,EAAE,MAAM,GAAG,KAAK;QACjE,IAAI,UAAU,GAAG,EAAE,CAAC;QAEpB,MAAM,oBAAoB,GAAG,4BAA4B,CAAA,CAAC,SAAS,oBAAoB,CAAE,MAAM,EAAE,MAAM;YACrG,OAAO,MAAM,IAAI,MAAM,CAAC;QAC1B,CAAC,CAAC,CAAC;QAEH,wEAAwE;QACxE,IAAI,aAAa,KAAK,IAAI,EAAE,CAAC;YAC3B,aAAa,GAAG,oBAAoB,CAAC;QACvC,CAAC;QAED,wEAAwE;QACxE,qEAAqE;QACrE,IAAI,gBAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;YAC9B,UAAU,GAAG,aAAa,CAAC;YAC3B,aAAa,GAAG,IAAI,CAAC;QACvB,CAAC;QAED,+EAA+E;QAC/E,IAAI,gBAAC,CAAC,SAAS,CAAC,aAAa,CAAC,IAAI,aAAa,EAAE,CAAC;YAChD,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACxB,MAAM,IAAI,KAAK,CAAC,qEAAqE,CAAC,CAAC;YACzF,CAAC;YACD,MAAM,GAAG,IAAI,CAAC;YACd,aAAa,GAAG,oBAAoB,CAAC;QACvC,CAAC;aAAM,IAAI,gBAAC,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,SAAS,EAAE,CAAC;YAC/C,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACxB,MAAM,IAAI,KAAK,CAAC,qEAAqE,CAAC,CAAC;YACzF,CAAC;YACD,MAAM,GAAG,IAAI,CAAC;YACd,SAAS,GAAG,IAAI,CAAC;QACnB,CAAC;QAED,qDAAqD;QACrD,OAAO,MAAM,IAAI,kBAAC,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,6BAA6B;YAC7B,IAAI,CAAC,IAAI,GAAG,IAAA,qBAAK,EAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YAElD,gEAAgE;YAChE;;;;;eAKG;YACH,MAAM,YAAY,GAAG,CAAC,OAAO,EAAE,EAAE;gBAC/B,MAAM,EAAC,MAAM,EAAE,MAAM,EAAC,GAAG,OAAO,CAAC;gBACjC,sEAAsE;gBACtE,gCAAgC;gBAChC,IAAI,CAAC;oBACH,IAAI,gBAAC,CAAC,UAAU,CAAC,aAAa,CAAC,IAAI,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC;wBACjE,aAAa,GAAG,IAAI,CAAC;wBACrB,OAAO,EAAE,CAAC;oBACZ,CAAC;gBACH,CAAC;gBAAC,OAAO,CAAC,EAAE,CAAC;oBACX,MAAM,CAAC,CAAC,CAAC,CAAC;gBACZ,CAAC;gBAED,kDAAkD;gBAClD,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;YACtC,CAAC,CAAC;YAEF,qEAAqE;YACrE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,yCAAyC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;gBAC5E,IAAI,CAAC,IAAI,EAAE,kBAAkB,CAAC,MAAM,CAAC,CAAC;gBACtC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;gBAE1B,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;oBAC1B,GAAG,GAAG,MAAM,IAAA,sBAAY,EAAC,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC,CAAC;gBACtE,CAAC;gBACD,MAAM,CAAC,GAAG,CAAC,CAAC;gBAEZ,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC;gBACnB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;YACnB,CAAC,CAAC,CAAC;YAEH,MAAM,iBAAiB,GAAG,CAAC,qBAAqB,CAAC,UAAU,EAAE,wCAAwC,CAAC,KAAK,EAAE,EAAE;gBAC7G,MAAM,EAAE,GAAG,IAAA,+BAAe,EAAC,EAAC,KAAK,EAAC,CAAC,CAAC;gBACpC,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;oBACrB,6BAA6B;oBAC7B,yCAAyC;oBACzC,IAAI,IAAI,CAAC,aAAa,CAAC,SAAS,UAAU,EAAE,CAAC,EAAE,CAAC;wBAC9C,IAAI,CAAC,IAAI,CAAC,SAAS,UAAU,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;oBAC3C,CAAC;oBACD,IAAI,CAAC,IAAI,CAAC,QAAQ,UAAU,EAAE,EAAE,IAAI,CAAC,CAAC;oBACtC,IAAI,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,EAAE,CAAC;wBACtC,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;oBACnC,CAAC;gBACH,CAAC,CAAC,CAAC;YACL,CAAC,CAAC;YAEF,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC7C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,MAAM,CAAC;YAE9C,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;gBACrB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,CACpC,YAAY,CAAC;oBACX,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC;oBACnD,wBAAwB;oBACxB,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE;iBACxC,CAAC,CACH,CAAC;gBACF,iBAAiB,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAChD,CAAC;YAED,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;gBACrB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,CACpC,YAAY,CAAC;oBACX,wBAAwB;oBACxB,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE;oBACvC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC;iBACpD,CAAC,CACH,CAAC;gBACF,iBAAiB,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAChD,CAAC;YAED,qEAAqE;YACrE,oEAAoE;YACpE,yEAAyE;YACzE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE;gBACpC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;gBAEhC,mEAAmE;gBACnE,gDAAgD;gBAChD,0BAA0B;gBAC1B,mEAAmE;gBACnE,+DAA+D;gBAC/D,IAAI,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;gBAChD,IAAI,CAAC,IAAI,CAAC,aAAa,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;oBACtC,KAAK,GAAG,KAAK,CAAC;gBAChB,CAAC;gBACD,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;gBAE/B,4DAA4D;gBAC5D,eAAe;gBACf,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;gBACjB,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;YAC7B,CAAC,CAAC,CAAC;YAEH,oEAAoE;YACpE,iCAAiC;YACjC,IAAI,CAAC,aAAa,EAAE,CAAC;gBACnB,UAAU,CAAC,GAAG,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;YAC/C,CAAC;YAED,oEAAoE;YACpE,2CAA2C;YAC3C,IAAI,gBAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC1B,UAAU,CAAC,GAAG,EAAE;oBACd,MAAM,CAAC,IAAI,KAAK,CAAC,oCAAoC,SAAS,KAAK;wBACjE,UAAU,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;gBAC7B,CAAC,EAAE,SAAS,CAAC,CAAC;YAChB,CAAC;QACH,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE;YACd,IAAI,MAAM,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;gBACxB,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YACpB,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,eAAe;QACb,wDAAwD;QACxD,+CAA+C;IACjD,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,IAAI,CAAE,MAAM,GAAG,SAAS,EAAE,OAAO,GAAG,KAAK;QAC7C,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,yDAAyD,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;QACzF,CAAC;QACD,OAAO,MAAM,IAAI,kBAAC,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAChC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;YAC1B,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;YACxB,8EAA8E;YAC9E,uBAAuB;YACvB,UAAU,CAAC,GAAG,EAAE;gBACd,MAAM,CAAC,IAAI,KAAK,CAAC,4BAA4B,OAAO,aAAa,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;YAClF,CAAC,EAAE,OAAO,CAAC,CAAC,KAAK,EAAE,CAAC;QACtB,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,IAAI,CAAE,gBAAgB,GAAG,CAAC,CAAC,CAAC;QAChC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,2DAA2D,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;QAC3F,CAAC;QAED,OAAO,MAAM,IAAI,kBAAC,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;gBAC7B,IAAI,IAAI,KAAK,IAAI,IAAI,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;oBAC3D,MAAM,CAAC,IAAI,KAAK,CAAC,+BAA+B,IAAI,WAAW,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;gBAChF,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,IAAI,CAAC,CAAC;gBAChB,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,aAAa;QACX,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACxB,kEAAkE;YAClE,MAAM,IAAI,KAAK,CAAC,qEAAqE,CAAC,CAAC;QACzF,CAAC;QACD,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;QACpB,CAAC;IACH,CAAC;IAED,IAAI,GAAG;QACL,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;IAC1C,CAAC;CACF;AAhTD,gCAgTC;AAED,kBAAe,UAAU,CAAC;AAE1B;;;;GAIG;AAEH;;;GAGG"}
|
package/lib/subprocess.js
CHANGED
|
@@ -1,35 +1,38 @@
|
|
|
1
1
|
import { spawn } from 'child_process';
|
|
2
|
-
import
|
|
3
|
-
const { EventEmitter } = events;
|
|
2
|
+
import { EventEmitter } from 'events';
|
|
4
3
|
import B from 'bluebird';
|
|
5
4
|
import { quote } from 'shell-quote';
|
|
6
5
|
import _ from 'lodash';
|
|
7
6
|
import { formatEnoent } from './helpers';
|
|
8
7
|
import { createInterface } from 'node:readline';
|
|
9
8
|
|
|
10
|
-
|
|
9
|
+
/**
|
|
10
|
+
* @template {SubProcessOptions} TSubProcessOptions
|
|
11
|
+
*/
|
|
12
|
+
export class SubProcess extends EventEmitter {
|
|
13
|
+
/**
|
|
14
|
+
* @callback StartDetector
|
|
15
|
+
* @param {TSubProcessOptions extends TIsBufferOpts ? Buffer : string} stdout
|
|
16
|
+
* @param {TSubProcessOptions extends TIsBufferOpts ? Buffer : string} [stderr]
|
|
17
|
+
* @returns {any}
|
|
18
|
+
*/
|
|
11
19
|
|
|
12
|
-
/** @type {import('child_process').ChildProcess
|
|
20
|
+
/** @type {import('child_process').ChildProcess | null} */
|
|
13
21
|
proc;
|
|
14
|
-
|
|
15
22
|
/** @type {string[]} */
|
|
16
23
|
args;
|
|
17
|
-
|
|
18
24
|
/**
|
|
19
25
|
* @type {string}
|
|
20
26
|
*/
|
|
21
27
|
cmd;
|
|
22
|
-
|
|
23
28
|
/**
|
|
24
|
-
* @type {
|
|
29
|
+
* @type {SubProcessOptions}
|
|
25
30
|
*/
|
|
26
31
|
opts;
|
|
27
|
-
|
|
28
32
|
/**
|
|
29
33
|
* @type {boolean}
|
|
30
34
|
*/
|
|
31
35
|
expectingExit;
|
|
32
|
-
|
|
33
36
|
/**
|
|
34
37
|
* @type {string}
|
|
35
38
|
*/
|
|
@@ -37,10 +40,10 @@ class SubProcess extends EventEmitter {
|
|
|
37
40
|
|
|
38
41
|
/**
|
|
39
42
|
* @param {string} cmd
|
|
40
|
-
* @param {string[]} [args]
|
|
41
|
-
* @param {
|
|
43
|
+
* @param {string[]} [args=[]]
|
|
44
|
+
* @param {TSubProcessOptions} [opts]
|
|
42
45
|
*/
|
|
43
|
-
constructor (cmd, args = [], opts
|
|
46
|
+
constructor (cmd, args = [], opts) {
|
|
44
47
|
super();
|
|
45
48
|
if (!cmd) throw new Error('Command is required'); // eslint-disable-line curly
|
|
46
49
|
if (!_.isString(cmd)) throw new Error('Command must be a string'); // eslint-disable-line curly
|
|
@@ -49,7 +52,7 @@ class SubProcess extends EventEmitter {
|
|
|
49
52
|
this.cmd = cmd;
|
|
50
53
|
this.args = args;
|
|
51
54
|
this.proc = null;
|
|
52
|
-
this.opts = opts;
|
|
55
|
+
this.opts = opts ?? {};
|
|
53
56
|
this.expectingExit = false;
|
|
54
57
|
|
|
55
58
|
// get a quoted representation of the command for error strings
|
|
@@ -126,17 +129,12 @@ class SubProcess extends EventEmitter {
|
|
|
126
129
|
// actually spawn the subproc
|
|
127
130
|
this.proc = spawn(this.cmd, this.args, this.opts);
|
|
128
131
|
|
|
129
|
-
if (this.proc.stdout) {
|
|
130
|
-
this.proc.stdout.setEncoding(this.opts.encoding || 'utf8');
|
|
131
|
-
}
|
|
132
|
-
if (this.proc.stderr) {
|
|
133
|
-
this.proc.stderr.setEncoding(this.opts.encoding || 'utf8');
|
|
134
|
-
}
|
|
135
|
-
|
|
136
132
|
// this function handles output that we collect from the subproc
|
|
137
133
|
/**
|
|
138
|
-
*
|
|
139
|
-
*
|
|
134
|
+
* @param { {
|
|
135
|
+
* stdout: TSubProcessOptions extends TIsBufferOpts ? Buffer : string,
|
|
136
|
+
* stderr: TSubProcessOptions extends TIsBufferOpts ? Buffer : string
|
|
137
|
+
* } } streams
|
|
140
138
|
*/
|
|
141
139
|
const handleOutput = (streams) => {
|
|
142
140
|
const {stdout, stderr} = streams;
|
|
@@ -161,7 +159,7 @@ class SubProcess extends EventEmitter {
|
|
|
161
159
|
this.proc?.kill('SIGINT');
|
|
162
160
|
|
|
163
161
|
if (err.code === 'ENOENT') {
|
|
164
|
-
err = await formatEnoent(err, this.cmd, this.opts?.cwd);
|
|
162
|
+
err = await formatEnoent(err, this.cmd, this.opts?.cwd?.toString());
|
|
165
163
|
}
|
|
166
164
|
reject(err);
|
|
167
165
|
|
|
@@ -184,13 +182,28 @@ class SubProcess extends EventEmitter {
|
|
|
184
182
|
});
|
|
185
183
|
};
|
|
186
184
|
|
|
185
|
+
const isBuffer = Boolean(this.opts.isBuffer);
|
|
186
|
+
const encoding = this.opts.encoding || 'utf8';
|
|
187
|
+
|
|
187
188
|
if (this.proc.stdout) {
|
|
188
|
-
this.proc.stdout.on('data', (chunk) =>
|
|
189
|
+
this.proc.stdout.on('data', (chunk) =>
|
|
190
|
+
handleOutput({
|
|
191
|
+
stdout: isBuffer ? chunk : chunk.toString(encoding),
|
|
192
|
+
// @ts-ignore This is OK
|
|
193
|
+
stderr: isBuffer ? Buffer.alloc(0) : '',
|
|
194
|
+
}),
|
|
195
|
+
);
|
|
189
196
|
handleStreamLines('stdout', this.proc.stdout);
|
|
190
197
|
}
|
|
191
198
|
|
|
192
199
|
if (this.proc.stderr) {
|
|
193
|
-
this.proc.stderr.on('data', (chunk) =>
|
|
200
|
+
this.proc.stderr.on('data', (chunk) =>
|
|
201
|
+
handleOutput({
|
|
202
|
+
// @ts-ignore This is OK
|
|
203
|
+
stdout: isBuffer ? Buffer.alloc(0) : '',
|
|
204
|
+
stderr: isBuffer ? chunk : chunk.toString(encoding)
|
|
205
|
+
}),
|
|
206
|
+
);
|
|
194
207
|
handleStreamLines('stderr', this.proc.stderr);
|
|
195
208
|
}
|
|
196
209
|
|
|
@@ -302,12 +315,15 @@ class SubProcess extends EventEmitter {
|
|
|
302
315
|
}
|
|
303
316
|
}
|
|
304
317
|
|
|
305
|
-
export { SubProcess };
|
|
306
318
|
export default SubProcess;
|
|
307
319
|
|
|
308
320
|
/**
|
|
309
|
-
* @
|
|
310
|
-
* @
|
|
311
|
-
* @
|
|
312
|
-
|
|
321
|
+
* @typedef {Object} SubProcessCustomOptions
|
|
322
|
+
* @property {boolean} [isBuffer]
|
|
323
|
+
* @property {string} [encoding]
|
|
324
|
+
*/
|
|
325
|
+
|
|
326
|
+
/**
|
|
327
|
+
* @typedef {SubProcessCustomOptions & import('child_process').SpawnOptionsWithoutStdio} SubProcessOptions
|
|
328
|
+
* @typedef {{isBuffer: true}} TIsBufferOpts
|
|
313
329
|
*/
|