teen_process 2.1.6 → 2.1.7

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.
@@ -37,7 +37,7 @@ export type TeenProcessLogger = {
37
37
  /**
38
38
  * Options for {@link exec teen_process.exec}.
39
39
  */
40
- export type TeenProcessExecOptions = import('child_process').SpawnOptions & TeenProcessProps;
40
+ export type TeenProcessExecOptions = import("child_process").SpawnOptions & TeenProcessProps;
41
41
  /**
42
42
  * The value {@link exec teen_process.exec} resolves to when `isBuffer` is `false`
43
43
  */
@@ -94,15 +94,15 @@ export type TeenProcessExecErrorProps = {
94
94
  */
95
95
  export type TeenProcessExecError = Error & TeenProcessExecErrorProps;
96
96
  export type BufferProp<MaybeBuffer extends {
97
- isBuffer?: boolean | undefined;
98
- }> = MaybeBuffer['isBuffer'];
97
+ isBuffer?: boolean;
98
+ }> = MaybeBuffer["isBuffer"];
99
99
  /**
100
100
  * Spawns a process
101
101
  * @template {TeenProcessExecOptions} T
102
102
  * @param {string} cmd - Program to execute
103
103
  * @param {string[]} [args] - Arguments to pass to the program
104
- * @param {T} [opts] - Options
104
+ * @param {T} [originalOpts] - Options
105
105
  * @returns {Promise<BufferProp<T> extends true ? TeenProcessExecBufferResult : TeenProcessExecStringResult>}
106
106
  */
107
- export function exec<T extends TeenProcessExecOptions>(cmd: string, args?: string[] | undefined, opts?: T | undefined): Promise<BufferProp<T> extends true ? TeenProcessExecBufferResult : TeenProcessExecStringResult>;
107
+ export function exec<T extends TeenProcessExecOptions>(cmd: string, args?: string[] | undefined, originalOpts?: T | undefined): Promise<BufferProp<T> extends true ? TeenProcessExecBufferResult : TeenProcessExecStringResult>;
108
108
  //# sourceMappingURL=exec.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"exec.d.ts","sourceRoot":"","sources":["../../lib/exec.js"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;WAuKc,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI;;;;;qCAKzB,OAAO,eAAe,EAAE,YAAY,GAAG,gBAAgB;;;;;;;;YAMtD,MAAM;;;;YACN,MAAM;;;;UACN,MAAM;;;;;;;;;YAMN,MAAM;;;;YACN,MAAM;;;;UACN,MAAM;;;;;;;;;YAMN,MAAM;;;;YACN,MAAM;;;;UACN,MAAM;;;;;mCAKP,KAAK,GAAG,yBAAyB;;;KAKjC,WAAW,CAAC,UAAU,CAAC;AApMpC;;;;;;;GAOG;AACH,4DALW,MAAM,sJAuIhB"}
1
+ {"version":3,"file":"exec.d.ts","sourceRoot":"","sources":["../../lib/exec.js"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;WA8Kc,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI;;;;;qCAKzB,OAAO,eAAe,EAAE,YAAY,GAAG,gBAAgB;;;;;;;;YAMtD,MAAM;;;;YACN,MAAM;;;;UACN,MAAM,OAAC;;;;;;;;;YAMP,MAAM;;;;YACN,MAAM;;;;UACN,MAAM,OAAC;;;;;;;;;YAMP,MAAM;;;;YACN,MAAM;;;;UACN,MAAM,OAAC;;;;;mCAKR,KAAK,GAAG,yBAAyB;uBAIV,WAAW,SAAlC;IAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,IACtB,WAAW,CAAC,UAAU,CAAC;AA3MpC;;;;;;;GAOG;AACH,qBANsC,CAAC,SAAzB,sBAAuB,OAC1B,MAAM,8DAGJ,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,IAAI,GAAG,2BAA2B,GAAG,2BAA2B,CAAC,CA2I3G"}
package/build/lib/exec.js CHANGED
@@ -4,7 +4,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  return (mod && mod.__esModule) ? mod : { "default": mod };
5
5
  };
6
6
  Object.defineProperty(exports, "__esModule", { value: true });
7
- exports.exec = void 0;
7
+ exports.exec = exec;
8
8
  const child_process_1 = require("child_process");
9
9
  const shell_quote_1 = require("shell-quote");
10
10
  const bluebird_1 = __importDefault(require("bluebird"));
@@ -16,15 +16,15 @@ const MAX_BUFFER_SIZE = 100 * 1024 * 1024;
16
16
  * @template {TeenProcessExecOptions} T
17
17
  * @param {string} cmd - Program to execute
18
18
  * @param {string[]} [args] - Arguments to pass to the program
19
- * @param {T} [opts] - Options
19
+ * @param {T} [originalOpts] - Options
20
20
  * @returns {Promise<BufferProp<T> extends true ? TeenProcessExecBufferResult : TeenProcessExecStringResult>}
21
21
  */
22
- async function exec(cmd, args = [], opts = /** @type {T} */ ({})) {
22
+ async function exec(cmd, args = [], originalOpts = /** @type {T} */ ({})) {
23
23
  // get a quoted representation of the command for error strings
24
24
  const rep = (0, shell_quote_1.quote)([cmd, ...args]);
25
25
  // extend default options; we're basically re-implementing exec's options
26
26
  // for use here with spawn under the hood
27
- opts = /** @type {T} */ (lodash_1.default.defaults(opts, {
27
+ const opts = /** @type {T} */ (lodash_1.default.defaults(originalOpts, {
28
28
  timeout: null,
29
29
  encoding: 'utf8',
30
30
  killSignal: 'SIGTERM',
@@ -43,8 +43,12 @@ async function exec(cmd, args = [], opts = /** @type {T} */ ({})) {
43
43
  return await new bluebird_1.default((resolve, reject) => {
44
44
  // spawn the child process with options; we don't currently expose any of
45
45
  // the other 'spawn' options through the API
46
- let proc = (0, child_process_1.spawn)(cmd, args, { cwd: opts.cwd, env: opts.env, shell: opts.shell });
47
- let stdoutArr = [], stderrArr = [], timer = null;
46
+ const proc = (0, child_process_1.spawn)(cmd, args, { cwd: opts.cwd, env: opts.env, shell: opts.shell });
47
+ /** @type {Buffer[]} */
48
+ const stdoutArr = [];
49
+ /** @type {Buffer[]} */
50
+ const stderrArr = [];
51
+ let timer = null;
48
52
  // if the process errors out, reject the promise
49
53
  proc.on('error', /** @param {NodeJS.ErrnoException} err */ async (err) => {
50
54
  if (err.code === 'ENOENT') {
@@ -72,7 +76,7 @@ async function exec(cmd, args = [], opts = /** @type {T} */ ({})) {
72
76
  // keep track of the stream if we don't want to ignore it
73
77
  const { chunks, maxSize } = streamProps;
74
78
  let size = 0;
75
- proc[streamType].on('data', (chunk) => {
79
+ proc[streamType].on('data', (/** @type {Buffer} */ chunk) => {
76
80
  chunks.push(chunk);
77
81
  size += chunk.length;
78
82
  while (chunks.length > 1 && size >= maxSize) {
@@ -98,7 +102,10 @@ async function exec(cmd, args = [], opts = /** @type {T} */ ({})) {
98
102
  * @returns {U extends true ? {stdout: Buffer, stderr: Buffer} : {stdout: string, stderr: string}}
99
103
  */
100
104
  function getStdio(isBuffer) {
101
- let stdout, stderr;
105
+ /** @type {string | Buffer} */
106
+ let stdout;
107
+ /** @type {string | Buffer} */
108
+ let stderr;
102
109
  if (isBuffer) {
103
110
  stdout = Buffer.concat(stdoutArr);
104
111
  stderr = Buffer.concat(stderrArr);
@@ -116,7 +123,7 @@ async function exec(cmd, args = [], opts = /** @type {T} */ ({})) {
116
123
  if (timer) {
117
124
  clearTimeout(timer);
118
125
  }
119
- let { stdout, stderr } = getStdio(isBuffer);
126
+ const { stdout, stderr } = getStdio(isBuffer);
120
127
  if (code === 0) {
121
128
  resolve(/** @type {BufferProp<T> extends true ? TeenProcessExecBufferResult : TeenProcessExecStringResult} */ ({ stdout, stderr, code }));
122
129
  }
@@ -131,7 +138,7 @@ async function exec(cmd, args = [], opts = /** @type {T} */ ({})) {
131
138
  // have in case it's helpful in debugging
132
139
  if (opts.timeout) {
133
140
  timer = setTimeout(() => {
134
- let { stdout, stderr } = getStdio(isBuffer);
141
+ const { stdout, stderr } = getStdio(isBuffer);
135
142
  let err = new Error(`Command '${rep}' timed out after ${opts.timeout}ms`);
136
143
  err = Object.assign(err, { stdout, stderr, code: null });
137
144
  reject(err);
@@ -142,7 +149,6 @@ async function exec(cmd, args = [], opts = /** @type {T} */ ({})) {
142
149
  }
143
150
  });
144
151
  }
145
- exports.exec = exec;
146
152
  exports.default = exec;
147
153
  /**
148
154
  * Options on top of `SpawnOptions`, unique to `teen_process.`
@@ -1 +1 @@
1
- {"version":3,"file":"exec.js","sourceRoot":"","sources":["../../lib/exec.js"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"exec.js","sourceRoot":"","sources":["../../lib/exec.js"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../lib/helpers.js"],"names":[],"mappings":"AAGA;;;;;;;;;;GAUG;AACH,oCAPW,OAAO,cAAc,OAErB,MAAM,oCAEJ,QAAQ,OAAO,cAAc,CAAC,CAwB1C"}
1
+ {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../lib/helpers.js"],"names":[],"mappings":"AAGA;;;;;;;;;;GAUG;AACH,oCAPW,MAAM,CAAC,cAAc,OAErB,MAAM,oCAEJ,OAAO,CAAC,MAAM,CAAC,cAAc,CAAC,CAwB1C"}
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.formatEnoent = void 0;
6
+ exports.formatEnoent = formatEnoent;
7
7
  const path_1 = __importDefault(require("path"));
8
8
  const promises_1 = __importDefault(require("fs/promises"));
9
9
  /**
@@ -39,5 +39,4 @@ async function formatEnoent(error, cmd, cwd = null) {
39
39
  `nor in any folders specified in the PATH environment variable (${pathMsg})`;
40
40
  return error;
41
41
  }
42
- exports.formatEnoent = formatEnoent;
43
42
  //# sourceMappingURL=helpers.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../lib/helpers.js"],"names":[],"mappings":";;;;;;AAAA,gDAAwB;AACxB,2DAA6B;AAE7B;;;;;;;;;;GAUG;AACH,KAAK,UAAU,YAAY,CAAE,KAAK,EAAE,GAAG,EAAE,GAAG,GAAG,IAAI;IACjD,IAAI,GAAG,EAAE,CAAC;QACR,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,kBAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAChC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;gBACxB,KAAK,CAAC,OAAO,GAAG,0BAA0B,GAAG,SAAS,GAAG,8BAA8B,CAAC;gBACxF,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACxB,KAAK,CAAC,OAAO,GAAG,0BAA0B,GAAG,SAAS,GAAG,kBAAkB,CAAC;gBAC5E,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAG,cAAI,CAAC,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAClD,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,sCAAsC,CAAC;IAC3E,KAAK,CAAC,OAAO,GAAG,IAAI,GAAG,oEAAoE,MAAM,IAAI;QACnG,kEAAkE,OAAO,GAAG,CAAC;IAC/E,OAAO,KAAK,CAAC;AACf,CAAC;AAEQ,oCAAY"}
1
+ {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../lib/helpers.js"],"names":[],"mappings":";;;;;AAqCS,oCAAY;AArCrB,gDAAwB;AACxB,2DAA6B;AAE7B;;;;;;;;;;GAUG;AACH,KAAK,UAAU,YAAY,CAAE,KAAK,EAAE,GAAG,EAAE,GAAG,GAAG,IAAI;IACjD,IAAI,GAAG,EAAE,CAAC;QACR,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,kBAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAChC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;gBACxB,KAAK,CAAC,OAAO,GAAG,0BAA0B,GAAG,SAAS,GAAG,8BAA8B,CAAC;gBACxF,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACxB,KAAK,CAAC,OAAO,GAAG,0BAA0B,GAAG,SAAS,GAAG,kBAAkB,CAAC;gBAC5E,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAG,cAAI,CAAC,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAClD,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,sCAAsC,CAAC;IAC3E,KAAK,CAAC,OAAO,GAAG,IAAI,GAAG,oEAAoE,MAAM,IAAI;QACnG,kEAAkE,OAAO,GAAG,CAAC;IAC/E,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -1,4 +1,3 @@
1
- /// <reference types="node" />
2
1
  export const exec: typeof execIndex.exec;
3
2
  export const spawn: typeof cp.spawn;
4
3
  export const SubProcess: typeof spIndex.SubProcess;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../lib/index.js"],"names":[],"mappings":";;;;2BAK2B,QAAQ;oBAFf,eAAe;yBACV,cAAc"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../lib/index.js"],"names":[],"mappings":";;;2BAK2B,QAAQ;oBAFf,eAAe;yBACV,cAAc"}
@@ -1,4 +1,3 @@
1
- /// <reference types="node" />
2
1
  export default SubProcess;
3
2
  export type StartDetector = (stdout: string, stderr?: string | undefined) => any;
4
3
  export class SubProcess extends events<[never]> {
@@ -8,15 +7,8 @@ export class SubProcess extends events<[never]> {
8
7
  * @param {any} [opts]
9
8
  */
10
9
  constructor(cmd: string, args?: string[] | undefined, opts?: any);
11
- /**
12
- * @type { {stdout: string, stderr: string} }
13
- */
14
- lastLinePortion: {
15
- stdout: string;
16
- stderr: string;
17
- };
18
10
  /** @type {import('child_process').ChildProcess?} */
19
- proc: import('child_process').ChildProcess | null;
11
+ proc: import("child_process").ChildProcess | null;
20
12
  /** @type {string[]} */
21
13
  args: string[];
22
14
  /**
@@ -38,11 +30,13 @@ export class SubProcess extends events<[never]> {
38
30
  get isRunning(): boolean;
39
31
  /**
40
32
  *
41
- * @param {string} stream
42
- * @param {Iterable<string>} lines
33
+ * @param {string} streamName
34
+ * @param {Iterable<string>|string} lines
43
35
  */
44
- emitLines(stream: string, lines: Iterable<string>): void;
36
+ emitLines(streamName: string, lines: Iterable<string> | string): void;
45
37
  /**
38
+ * spawn the subprocess and return control whenever we deem that it has fully
39
+ * "started"
46
40
  *
47
41
  * @param {StartDetector|number?} startDetector
48
42
  * @param {number?} timeoutMs
@@ -50,6 +44,9 @@ export class SubProcess extends events<[never]> {
50
44
  * @returns {Promise<void>}
51
45
  */
52
46
  start(startDetector?: StartDetector | (number | null), timeoutMs?: number | null, detach?: boolean): Promise<void>;
47
+ /**
48
+ * @deprecated This method is deprecated and will be removed
49
+ */
53
50
  handleLastLines(): void;
54
51
  /**
55
52
  *
@@ -1 +1 @@
1
- {"version":3,"file":"subprocess.d.ts","sourceRoot":"","sources":["../../lib/subprocess.js"],"names":[],"mappings":";;qCAsVW,MAAM,kCAEJ,GAAG;AAhUhB;IAiCE;;;;OAIG;IACH,iBAJW,MAAM,sCAEN,GAAG,EAkBb;IApDD;;OAEG;IACH,iBAFW;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAC,CAE3B;IAEhB,oDAAoD;IACpD,MADW,OAAO,eAAe,EAAE,YAAY,QAC1C;IAEL,uBAAuB;IACvB,MADW,MAAM,EAAE,CACd;IAEL;;OAEG;IACH,KAFU,MAAM,CAEZ;IAEJ;;MAEE;IACF,MAFU,GAAG,CAER;IAEL;;OAEG;IACH,eAFU,OAAO,CAEH;IAEd;;OAEG;IACH,KAFU,MAAM,CAEZ;IAyBJ,yBAGC;IAED;;;;OAIG;IACH,kBAHW,MAAM,SACN,SAAS,MAAM,CAAC,QAM1B;IAID;;;;;;OAMG;IACH,sBALW,aAAa,IAAC,MAAM,QAAC,cACrB,MAAM,kBACN,OAAO,GACL,QAAQ,IAAI,CAAC,CAkKzB;IAED,wBASC;IAED;;;;;OAKG;IACH,cAJW,OAAO,OAAO,YACd,MAAM,GACJ,QAAQ,IAAI,CAAC,CAmBzB;IAED,gDAcC;IAKD,sBAQC;IAED,qCAEC;CACF;mBA5UkB,QAAQ"}
1
+ {"version":3,"file":"subprocess.d.ts","sourceRoot":"","sources":["../../lib/subprocess.js"],"names":[],"mappings":";qCA8SW,MAAM,kCAEJ,GAAG;AAvShB;IA4BE;;;;OAIG;IACH,iBAJW,MAAM,sCAEN,GAAG,EAgBb;IA7CD,oDAAoD;IACpD,MADW,OAAO,eAAe,EAAE,YAAY,OAAC,CAC3C;IAEL,uBAAuB;IACvB,MADW,MAAM,EAAE,CACd;IAEL;;OAEG;IACH,KAFU,MAAM,CAEZ;IAEJ;;MAEE;IACF,MAFU,GAAG,CAER;IAEL;;OAEG;IACH,eAFU,OAAO,CAEH;IAEd;;OAEG;IACH,KAFU,MAAM,CAEZ;IAuBJ,yBAGC;IAED;;;;OAIG;IACH,sBAHW,MAAM,SACN,QAAQ,CAAC,MAAM,CAAC,GAAC,MAAM,QAYjC;IAED;;;;;;;;OAQG;IACH,sBALW,aAAa,IAAC,MAAM,OAAC,CAAA,cACrB,MAAM,OAAC,WACP,OAAO,GACL,OAAO,CAAC,IAAI,CAAC,CAgJzB;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;mBAtSkB,QAAQ"}
@@ -1,5 +1,4 @@
1
1
  "use strict";
2
- /* eslint-disable promise/prefer-await-to-callbacks */
3
2
  var __importDefault = (this && this.__importDefault) || function (mod) {
4
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
5
4
  };
@@ -12,16 +11,7 @@ const bluebird_1 = __importDefault(require("bluebird"));
12
11
  const shell_quote_1 = require("shell-quote");
13
12
  const lodash_1 = __importDefault(require("lodash"));
14
13
  const helpers_1 = require("./helpers");
15
- // This is needed to avoid memory leaks
16
- // when the process output is too long and contains
17
- // no line breaks
18
- const MAX_LINE_PORTION_LENGTH = 0xFFFF;
19
- function cutSuffix(str, suffixLength) {
20
- return str.length > suffixLength
21
- // https://bugs.chromium.org/p/v8/issues/detail?id=2869
22
- ? ` ${str.substr(str.length - suffixLength)}`.substr(1)
23
- : str;
24
- }
14
+ const node_readline_1 = require("node:readline");
25
15
  class SubProcess extends EventEmitter {
26
16
  /**
27
17
  * @param {string} cmd
@@ -43,7 +33,6 @@ class SubProcess extends EventEmitter {
43
33
  this.expectingExit = false;
44
34
  // get a quoted representation of the command for error strings
45
35
  this.rep = (0, shell_quote_1.quote)([cmd, ...args]);
46
- this.lastLinePortion = { stdout: '', stderr: '' };
47
36
  }
48
37
  get isRunning() {
49
38
  // presence of `proc` means we have connected and started
@@ -51,17 +40,23 @@ class SubProcess extends EventEmitter {
51
40
  }
52
41
  /**
53
42
  *
54
- * @param {string} stream
55
- * @param {Iterable<string>} lines
43
+ * @param {string} streamName
44
+ * @param {Iterable<string>|string} lines
56
45
  */
57
- emitLines(stream, lines) {
58
- for (let line of lines) {
59
- this.emit('stream-line', `[${stream.toUpperCase()}] ${line}`);
46
+ emitLines(streamName, lines) {
47
+ const doEmit = (/** @type {string} */ line) => this.emit('stream-line', `[${streamName.toUpperCase()}] ${line}`);
48
+ if (lodash_1.default.isString(lines)) {
49
+ doEmit(lines);
50
+ }
51
+ else {
52
+ for (const line of lines) {
53
+ doEmit(line);
54
+ }
60
55
  }
61
56
  }
62
- // spawn the subprocess and return control whenever we deem that it has fully
63
- // "started"
64
57
  /**
58
+ * spawn the subprocess and return control whenever we deem that it has fully
59
+ * "started"
65
60
  *
66
61
  * @param {StartDetector|number?} startDetector
67
62
  * @param {number?} timeoutMs
@@ -108,7 +103,6 @@ class SubProcess extends EventEmitter {
108
103
  if (this.proc.stderr) {
109
104
  this.proc.stderr.setEncoding(this.opts.encoding || 'utf8');
110
105
  }
111
- this.lastLinePortion = { stdout: '', stderr: '' };
112
106
  // this function handles output that we collect from the subproc
113
107
  /**
114
108
  *
@@ -129,33 +123,6 @@ class SubProcess extends EventEmitter {
129
123
  }
130
124
  // emit the actual output for whomever's listening
131
125
  this.emit('output', stdout, stderr);
132
- // we also want to emit lines, but it's more complex since output
133
- // comes in chunks and a line could come in two different chunks, so
134
- // we have logic to handle that case (using this.lastLinePortion to
135
- // remember a line that started but did not finish in the last chunk)
136
- for (const [streamName, streamData] of /** @type {[['stdout', string], ['stderr', string]]} */ (lodash_1.default.toPairs(streams))) {
137
- if (!streamData)
138
- continue; // eslint-disable-line curly
139
- const lines = streamData.split('\n')
140
- // https://bugs.chromium.org/p/v8/issues/detail?id=2869
141
- .map((x) => ` ${x}`.substr(1));
142
- if (lines.length > 1) {
143
- lines[0] = this.lastLinePortion[streamName] + lines[0];
144
- this.lastLinePortion[streamName] = cutSuffix(lodash_1.default.last(lines), MAX_LINE_PORTION_LENGTH);
145
- const resultLines = lines.slice(0, -1);
146
- this.emit(`lines-${streamName}`, resultLines);
147
- this.emitLines(streamName, resultLines);
148
- }
149
- else {
150
- const currentPortion = cutSuffix(lines[0], MAX_LINE_PORTION_LENGTH);
151
- if (this.lastLinePortion[streamName].length + currentPortion.length > MAX_LINE_PORTION_LENGTH) {
152
- this.lastLinePortion[streamName] = currentPortion;
153
- }
154
- else {
155
- this.lastLinePortion[streamName] += currentPortion;
156
- }
157
- }
158
- }
159
126
  };
160
127
  // if we get an error spawning the proc, reject and clean up the proc
161
128
  this.proc.on('error', /** @param {NodeJS.ErrnoException} err */ async (err) => {
@@ -168,17 +135,25 @@ class SubProcess extends EventEmitter {
168
135
  this.proc?.unref();
169
136
  this.proc = null;
170
137
  });
138
+ const handleStreamLines = (/** @type {string} */ streamName, /** @type {import('stream').Readable} */ input) => {
139
+ const rl = (0, node_readline_1.createInterface)({ input });
140
+ rl.on('line', (line) => {
141
+ this.emit(`lines-${streamName}`, [line]);
142
+ this.emitLines(streamName, line);
143
+ });
144
+ };
171
145
  if (this.proc.stdout) {
172
146
  this.proc.stdout.on('data', (chunk) => handleOutput({ stdout: chunk.toString(), stderr: '' }));
147
+ handleStreamLines('stdout', this.proc.stdout);
173
148
  }
174
149
  if (this.proc.stderr) {
175
150
  this.proc.stderr.on('data', (chunk) => handleOutput({ stdout: '', stderr: chunk.toString() }));
151
+ handleStreamLines('stderr', this.proc.stderr);
176
152
  }
177
153
  // when the proc exits, we might still have a buffer of lines we were
178
154
  // waiting on more chunks to complete. Go ahead and emit those, then
179
155
  // re-emit the exit so a listener can handle the possibly-unexpected exit
180
156
  this.proc.on('exit', (code, signal) => {
181
- this.handleLastLines();
182
157
  this.emit('exit', code, signal);
183
158
  // in addition to the bare exit event, also emit one of three other
184
159
  // events that contain more helpful information:
@@ -214,15 +189,12 @@ class SubProcess extends EventEmitter {
214
189
  }
215
190
  });
216
191
  }
192
+ /**
193
+ * @deprecated This method is deprecated and will be removed
194
+ */
217
195
  handleLastLines() {
218
- for (let stream of ['stdout', 'stderr']) {
219
- if (this.lastLinePortion[stream]) {
220
- const lastLines = [this.lastLinePortion[stream]];
221
- this.emit(`lines-${stream}`, lastLines);
222
- this.emitLines(stream, lastLines);
223
- this.lastLinePortion[stream] = '';
224
- }
225
- }
196
+ // TODO: THis is a noop left for backward compatibility.
197
+ // TODO: Remove it after the major version bump
226
198
  }
227
199
  /**
228
200
  *
@@ -234,9 +206,6 @@ class SubProcess extends EventEmitter {
234
206
  if (!this.isRunning) {
235
207
  throw new Error(`Can't stop process; it's not currently running (cmd: '${this.rep}')`);
236
208
  }
237
- // make sure to emit any data in our lines buffer whenever we're done with
238
- // the proc
239
- this.handleLastLines();
240
209
  return await new bluebird_1.default((resolve, reject) => {
241
210
  this.proc?.on('close', resolve);
242
211
  this.expectingExit = true;
@@ -1 +1 @@
1
- {"version":3,"file":"subprocess.js","sourceRoot":"","sources":["../../lib/subprocess.js"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"subprocess.js","sourceRoot":"","sources":["../../lib/subprocess.js"],"names":[],"mappings":"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"}
package/lib/exec.js CHANGED
@@ -13,16 +13,16 @@ const MAX_BUFFER_SIZE = 100 * 1024 * 1024;
13
13
  * @template {TeenProcessExecOptions} T
14
14
  * @param {string} cmd - Program to execute
15
15
  * @param {string[]} [args] - Arguments to pass to the program
16
- * @param {T} [opts] - Options
16
+ * @param {T} [originalOpts] - Options
17
17
  * @returns {Promise<BufferProp<T> extends true ? TeenProcessExecBufferResult : TeenProcessExecStringResult>}
18
18
  */
19
- async function exec (cmd, args = [], opts = /** @type {T} */({})) {
19
+ async function exec (cmd, args = [], originalOpts = /** @type {T} */({})) {
20
20
  // get a quoted representation of the command for error strings
21
21
  const rep = quote([cmd, ...args]);
22
22
 
23
23
  // extend default options; we're basically re-implementing exec's options
24
24
  // for use here with spawn under the hood
25
- opts = /** @type {T} */(_.defaults(opts, {
25
+ const opts = /** @type {T} */(_.defaults(originalOpts, {
26
26
  timeout: null,
27
27
  encoding: 'utf8',
28
28
  killSignal: 'SIGTERM',
@@ -43,8 +43,12 @@ async function exec (cmd, args = [], opts = /** @type {T} */({})) {
43
43
  return await new B((resolve, reject) => {
44
44
  // spawn the child process with options; we don't currently expose any of
45
45
  // the other 'spawn' options through the API
46
- let proc = spawn(cmd, args, {cwd: opts.cwd, env: opts.env, shell: opts.shell});
47
- let stdoutArr = [], stderrArr = [], timer = null;
46
+ const proc = spawn(cmd, args, {cwd: opts.cwd, env: opts.env, shell: opts.shell});
47
+ /** @type {Buffer[]} */
48
+ const stdoutArr = [];
49
+ /** @type {Buffer[]} */
50
+ const stderrArr = [];
51
+ let timer = null;
48
52
 
49
53
  // if the process errors out, reject the promise
50
54
  proc.on('error', /** @param {NodeJS.ErrnoException} err */ async (err) => {
@@ -76,7 +80,7 @@ async function exec (cmd, args = [], opts = /** @type {T} */({})) {
76
80
  // keep track of the stream if we don't want to ignore it
77
81
  const {chunks, maxSize} = streamProps;
78
82
  let size = 0;
79
- proc[streamType].on('data', (chunk) => {
83
+ proc[streamType].on('data', (/** @type {Buffer} */ chunk) => {
80
84
  chunks.push(chunk);
81
85
  size += chunk.length;
82
86
  while (chunks.length > 1 && size >= maxSize) {
@@ -103,7 +107,10 @@ async function exec (cmd, args = [], opts = /** @type {T} */({})) {
103
107
  * @returns {U extends true ? {stdout: Buffer, stderr: Buffer} : {stdout: string, stderr: string}}
104
108
  */
105
109
  function getStdio (isBuffer) {
106
- let stdout, stderr;
110
+ /** @type {string | Buffer} */
111
+ let stdout;
112
+ /** @type {string | Buffer} */
113
+ let stderr;
107
114
  if (isBuffer) {
108
115
  stdout = Buffer.concat(stdoutArr);
109
116
  stderr = Buffer.concat(stderrArr);
@@ -121,7 +128,7 @@ async function exec (cmd, args = [], opts = /** @type {T} */({})) {
121
128
  if (timer) {
122
129
  clearTimeout(timer);
123
130
  }
124
- let {stdout, stderr} = getStdio(isBuffer);
131
+ const {stdout, stderr} = getStdio(isBuffer);
125
132
  if (code === 0) {
126
133
  resolve(/** @type {BufferProp<T> extends true ? TeenProcessExecBufferResult : TeenProcessExecStringResult} */({stdout, stderr, code}));
127
134
  } else {
@@ -136,7 +143,7 @@ async function exec (cmd, args = [], opts = /** @type {T} */({})) {
136
143
  // have in case it's helpful in debugging
137
144
  if (opts.timeout) {
138
145
  timer = setTimeout(() => {
139
- let {stdout, stderr} = getStdio(isBuffer);
146
+ const {stdout, stderr} = getStdio(isBuffer);
140
147
  let err = new Error(`Command '${rep}' timed out after ${opts.timeout}ms`);
141
148
  err = Object.assign(err, {stdout, stderr, code: null});
142
149
  reject(err);
package/lib/subprocess.js CHANGED
@@ -1,5 +1,3 @@
1
- /* eslint-disable promise/prefer-await-to-callbacks */
2
-
3
1
  import { spawn } from 'child_process';
4
2
  import events from 'events';
5
3
  const { EventEmitter } = events;
@@ -7,28 +5,10 @@ import B from 'bluebird';
7
5
  import { quote } from 'shell-quote';
8
6
  import _ from 'lodash';
9
7
  import { formatEnoent } from './helpers';
10
-
11
-
12
- // This is needed to avoid memory leaks
13
- // when the process output is too long and contains
14
- // no line breaks
15
- const MAX_LINE_PORTION_LENGTH = 0xFFFF;
16
-
17
- function cutSuffix (str, suffixLength) {
18
- return str.length > suffixLength
19
- // https://bugs.chromium.org/p/v8/issues/detail?id=2869
20
- ? ` ${str.substr(str.length - suffixLength)}`.substr(1)
21
- : str;
22
- }
23
-
8
+ import { createInterface } from 'node:readline';
24
9
 
25
10
  class SubProcess extends EventEmitter {
26
11
 
27
- /**
28
- * @type { {stdout: string, stderr: string} }
29
- */
30
- lastLinePortion;
31
-
32
12
  /** @type {import('child_process').ChildProcess?} */
33
13
  proc;
34
14
 
@@ -74,8 +54,6 @@ class SubProcess extends EventEmitter {
74
54
 
75
55
  // get a quoted representation of the command for error strings
76
56
  this.rep = quote([cmd, ...args]);
77
-
78
- this.lastLinePortion = {stdout: '', stderr: ''};
79
57
  }
80
58
 
81
59
  get isRunning () {
@@ -85,18 +63,24 @@ class SubProcess extends EventEmitter {
85
63
 
86
64
  /**
87
65
  *
88
- * @param {string} stream
89
- * @param {Iterable<string>} lines
66
+ * @param {string} streamName
67
+ * @param {Iterable<string>|string} lines
90
68
  */
91
- emitLines (stream, lines) {
92
- for (let line of lines) {
93
- this.emit('stream-line', `[${stream.toUpperCase()}] ${line}`);
69
+ emitLines (streamName, lines) {
70
+ const doEmit = (/** @type {string} */ line) => this.emit('stream-line', `[${streamName.toUpperCase()}] ${line}`);
71
+
72
+ if (_.isString(lines)) {
73
+ doEmit(lines);
74
+ } else {
75
+ for (const line of lines) {
76
+ doEmit(line);
77
+ }
94
78
  }
95
79
  }
96
80
 
97
- // spawn the subprocess and return control whenever we deem that it has fully
98
- // "started"
99
81
  /**
82
+ * spawn the subprocess and return control whenever we deem that it has fully
83
+ * "started"
100
84
  *
101
85
  * @param {StartDetector|number?} startDetector
102
86
  * @param {number?} timeoutMs
@@ -148,7 +132,6 @@ class SubProcess extends EventEmitter {
148
132
  if (this.proc.stderr) {
149
133
  this.proc.stderr.setEncoding(this.opts.encoding || 'utf8');
150
134
  }
151
- this.lastLinePortion = {stdout: '', stderr: ''};
152
135
 
153
136
  // this function handles output that we collect from the subproc
154
137
  /**
@@ -170,31 +153,6 @@ class SubProcess extends EventEmitter {
170
153
 
171
154
  // emit the actual output for whomever's listening
172
155
  this.emit('output', stdout, stderr);
173
-
174
- // we also want to emit lines, but it's more complex since output
175
- // comes in chunks and a line could come in two different chunks, so
176
- // we have logic to handle that case (using this.lastLinePortion to
177
- // remember a line that started but did not finish in the last chunk)
178
- for (const [streamName, streamData] of /** @type {[['stdout', string], ['stderr', string]]} */(_.toPairs(streams))) {
179
- if (!streamData) continue; // eslint-disable-line curly
180
- const lines = streamData.split('\n')
181
- // https://bugs.chromium.org/p/v8/issues/detail?id=2869
182
- .map((x) => ` ${x}`.substr(1));
183
- if (lines.length > 1) {
184
- lines[0] = this.lastLinePortion[streamName] + lines[0];
185
- this.lastLinePortion[streamName] = cutSuffix(_.last(lines), MAX_LINE_PORTION_LENGTH);
186
- const resultLines = lines.slice(0, -1);
187
- this.emit(`lines-${streamName}`, resultLines);
188
- this.emitLines(streamName, resultLines);
189
- } else {
190
- const currentPortion = cutSuffix(lines[0], MAX_LINE_PORTION_LENGTH);
191
- if (this.lastLinePortion[streamName].length + currentPortion.length > MAX_LINE_PORTION_LENGTH) {
192
- this.lastLinePortion[streamName] = currentPortion;
193
- } else {
194
- this.lastLinePortion[streamName] += currentPortion;
195
- }
196
- }
197
- }
198
156
  };
199
157
 
200
158
  // if we get an error spawning the proc, reject and clean up the proc
@@ -211,20 +169,28 @@ class SubProcess extends EventEmitter {
211
169
  this.proc = null;
212
170
  });
213
171
 
172
+ const handleStreamLines = (/** @type {string} */ streamName, /** @type {import('stream').Readable} */ input) => {
173
+ const rl = createInterface({input});
174
+ rl.on('line', (line) => {
175
+ this.emit(`lines-${streamName}`, [line]);
176
+ this.emitLines(streamName, line);
177
+ });
178
+ };
179
+
214
180
  if (this.proc.stdout) {
215
181
  this.proc.stdout.on('data', (chunk) => handleOutput({stdout: chunk.toString(), stderr: ''}));
182
+ handleStreamLines('stdout', this.proc.stdout);
216
183
  }
217
184
 
218
185
  if (this.proc.stderr) {
219
186
  this.proc.stderr.on('data', (chunk) => handleOutput({stdout: '', stderr: chunk.toString()}));
187
+ handleStreamLines('stderr', this.proc.stderr);
220
188
  }
221
189
 
222
190
  // when the proc exits, we might still have a buffer of lines we were
223
191
  // waiting on more chunks to complete. Go ahead and emit those, then
224
192
  // re-emit the exit so a listener can handle the possibly-unexpected exit
225
193
  this.proc.on('exit', (code, signal) => {
226
- this.handleLastLines();
227
-
228
194
  this.emit('exit', code, signal);
229
195
 
230
196
  // in addition to the bare exit event, also emit one of three other
@@ -265,15 +231,12 @@ class SubProcess extends EventEmitter {
265
231
  });
266
232
  }
267
233
 
234
+ /**
235
+ * @deprecated This method is deprecated and will be removed
236
+ */
268
237
  handleLastLines () {
269
- for (let stream of ['stdout', 'stderr']) {
270
- if (this.lastLinePortion[stream]) {
271
- const lastLines = [this.lastLinePortion[stream]];
272
- this.emit(`lines-${stream}`, lastLines);
273
- this.emitLines(stream, lastLines);
274
- this.lastLinePortion[stream] = '';
275
- }
276
- }
238
+ // TODO: THis is a noop left for backward compatibility.
239
+ // TODO: Remove it after the major version bump
277
240
  }
278
241
 
279
242
  /**
@@ -286,9 +249,6 @@ class SubProcess extends EventEmitter {
286
249
  if (!this.isRunning) {
287
250
  throw new Error(`Can't stop process; it's not currently running (cmd: '${this.rep}')`);
288
251
  }
289
- // make sure to emit any data in our lines buffer whenever we're done with
290
- // the proc
291
- this.handleLastLines();
292
252
  return await new B((resolve, reject) => {
293
253
  this.proc?.on('close', resolve);
294
254
  this.expectingExit = true;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "teen_process",
3
- "version": "2.1.6",
3
+ "version": "2.1.7",
4
4
  "description": "A grown up version of Node's spawn/exec",
5
5
  "keywords": [
6
6
  "child_process",
@@ -73,7 +73,7 @@
73
73
  "prettier": "^3.1.0",
74
74
  "semantic-release": "^24.0.0",
75
75
  "sinon": "^18.0.0",
76
- "typescript": "~5.4",
76
+ "typescript": "^5.4.1",
77
77
  "ts-node": "^10.9.1"
78
78
  },
79
79
  "engines": {