teen_process 2.0.2 → 2.0.3

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/index.js CHANGED
@@ -1 +1,12 @@
1
- module.exports = require('./build/lib/index.js');
1
+ import {install} from 'source-map-support';
2
+ install();
3
+
4
+ import * as cp from 'child_process';
5
+ import * as spIndex from './lib/subprocess';
6
+ import * as execIndex from './lib/exec';
7
+
8
+ const { spawn } = cp;
9
+ const { SubProcess } = spIndex;
10
+ const { exec } = execIndex;
11
+
12
+ export { exec, spawn, SubProcess };
package/lib/exec.js CHANGED
@@ -47,10 +47,9 @@ async function exec (cmd, args = [], opts = /** @type {T} */({})) {
47
47
  let stdoutArr = [], stderrArr = [], timer = null;
48
48
 
49
49
  // if the process errors out, reject the promise
50
- proc.on('error', /** @param {NodeJS.ErrnoException} err */(err) => {
51
- // @ts-ignore
52
- if (err.errno === 'ENOENT') {
53
- err = formatEnoent(err, cmd, opts.cwd);
50
+ proc.on('error', /** @param {NodeJS.ErrnoException} err */ async (err) => {
51
+ if (err.code === 'ENOENT') {
52
+ err = await formatEnoent(err, cmd, opts.cwd?.toString());
54
53
  }
55
54
  reject(err);
56
55
  });
package/lib/helpers.js CHANGED
@@ -1,5 +1,5 @@
1
- import which from 'which';
2
- import fs from 'fs';
1
+ import path from 'path';
2
+ import fs from 'fs/promises';
3
3
 
4
4
  /**
5
5
  * Decorates ENOENT error received from a spawn system call
@@ -8,24 +8,30 @@ import fs from 'fs';
8
8
  * @param {NodeJS.ErrnoException} error Original error instance. !!! The instance is mutated after
9
9
  * this helper function invocation
10
10
  * @param {string} cmd Original command to execute
11
- * @param {string|URL?} [cwd] Optional path to the current working dir
12
- * @returns {NodeJS.ErrnoException} Mutated error instance with an improved description or an
11
+ * @param {string?} [cwd] Optional path to the current working dir
12
+ * @returns {Promise<NodeJS.ErrnoException>} Mutated error instance with an improved description or an
13
13
  * unchanged error instance
14
14
  */
15
- function formatEnoent (error, cmd, cwd = null) {
16
- try {
17
- which.sync(cmd);
18
- if (cwd) {
19
- try {
20
- fs.accessSync(cwd, fs.constants.R_OK);
21
- } catch (ign) {
22
- error.message = `The current working directory '${cwd}' for '${cmd}' command ` +
23
- `either does not exist or is not accessible`;
15
+ async function formatEnoent (error, cmd, cwd = null) {
16
+ if (cwd) {
17
+ try {
18
+ const stat = await fs.stat(cwd);
19
+ if (!stat.isDirectory()) {
20
+ error.message = `The working directory '${cwd}' of '${cmd}' is not a valid folder path`;
21
+ return error;
22
+ }
23
+ } catch (e) {
24
+ if (e.code === 'ENOENT') {
25
+ error.message = `The working directory '${cwd}' of '${cmd}' does not exist`;
26
+ return error;
24
27
  }
25
28
  }
26
- } catch (ign) {
27
- error.message = `Command '${cmd}' not found. Is it installed?`;
28
29
  }
30
+
31
+ const curDir = path.resolve(cwd ?? process.cwd());
32
+ const pathMsg = process.env.PATH ?? 'which is not defined for the process';
33
+ error.message = `'${cmd}' executable is not found neither in the process working folder (${curDir}) ` +
34
+ `nor in any folders specified in the PATH environment variable (${pathMsg})`;
29
35
  return error;
30
36
  }
31
37
 
package/lib/subprocess.js CHANGED
@@ -198,12 +198,12 @@ class SubProcess extends EventEmitter {
198
198
  };
199
199
 
200
200
  // if we get an error spawning the proc, reject and clean up the proc
201
- this.proc.on('error', /** @param {NodeJS.ErrnoException} err */ (err) => {
201
+ this.proc.on('error', /** @param {NodeJS.ErrnoException} err */ async (err) => {
202
202
  this.proc?.removeAllListeners('exit');
203
203
  this.proc?.kill('SIGINT');
204
204
 
205
205
  if (err.code === 'ENOENT') {
206
- err = formatEnoent(err, this.cmd, this.opts?.cwd);
206
+ err = await formatEnoent(err, this.cmd, this.opts?.cwd);
207
207
  }
208
208
  reject(err);
209
209
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "teen_process",
3
- "version": "2.0.2",
3
+ "version": "2.0.3",
4
4
  "description": "A grown up version of Node's spawn/exec",
5
5
  "keywords": [
6
6
  "child_process",
@@ -31,14 +31,16 @@
31
31
  "build/lib"
32
32
  ],
33
33
  "scripts": {
34
- "build": "babel --out-dir=build/lib lib",
34
+ "build": "tsc -b",
35
+ "clean": "npm run build -- --clean",
35
36
  "dev": "npm run build -- --watch",
36
37
  "lint": "eslint .",
37
38
  "lint:fix": "npm run lint -- --fix",
38
39
  "lint:types": "tsc",
39
40
  "precommit-lint": "lint-staged",
40
41
  "precommit-msg": "echo 'Pre-commit checks...' && exit 0",
41
- "prepare": "npm run build",
42
+ "prepare": "npm run rebuild",
43
+ "rebuild": "npm run clean && npm run build",
42
44
  "test": "mocha"
43
45
  },
44
46
  "pre-commit": [
@@ -56,46 +58,42 @@
56
58
  "singleQuote": true
57
59
  },
58
60
  "dependencies": {
59
- "@babel/runtime": "7.19.0",
60
61
  "bluebird": "3.7.2",
61
62
  "lodash": "4.17.21",
62
- "shell-quote": "1.7.3",
63
- "source-map-support": "0.5.21",
64
- "which": "2.0.2"
63
+ "shell-quote": "1.8.1",
64
+ "source-map-support": "0.5.21"
65
65
  },
66
66
  "devDependencies": {
67
- "@appium/eslint-config-appium": "7.0.0",
68
- "@appium/support": "2.60.0",
69
- "@babel/cli": "7.18.10",
70
- "@babel/core": "7.19.1",
71
- "@babel/eslint-parser": "7.19.1",
72
- "@babel/plugin-transform-runtime": "7.19.1",
73
- "@babel/preset-env": "7.19.1",
74
- "@babel/register": "7.18.9",
75
- "@types/bluebird": "3.5.37",
76
- "@types/chai": "4.3.3",
67
+ "@appium/eslint-config-appium": "8.0.3",
68
+ "@appium/tsconfig": "0.3.0",
69
+ "@appium/types": "0.11.1",
70
+ "@types/bluebird": "3.5.38",
71
+ "@types/chai": "4.3.5",
77
72
  "@types/chai-as-promised": "7.1.5",
78
- "@types/lodash": "4.14.185",
79
- "@types/mocha": "9.1.1",
80
- "@types/node": "18.6.5",
73
+ "@types/lodash": "4.14.195",
74
+ "@types/mocha": "10.0.1",
75
+ "@types/node": "18.16.17",
81
76
  "@types/shell-quote": "1.7.1",
82
- "@types/which": "2.0.1",
83
- "babel-plugin-source-map-support": "2.2.0",
84
- "chai": "4.3.6",
77
+ "@types/sinon": "10.0.15",
78
+ "@types/source-map-support": "0.5.6",
79
+ "@types/ws": "8.5.4",
80
+ "chai": "4.3.7",
85
81
  "chai-as-promised": "7.1.1",
86
- "eslint": "8.24.0",
87
- "eslint-config-prettier": "8.5.0",
88
- "eslint-plugin-import": "2.26.0",
82
+ "eslint": "8.42.0",
83
+ "eslint-config-prettier": "8.8.0",
84
+ "eslint-plugin-import": "2.27.5",
89
85
  "eslint-plugin-mocha": "10.1.0",
90
- "eslint-plugin-promise": "6.0.1",
91
- "lint-staged": "13.0.3",
92
- "mocha": "10.0.0",
86
+ "eslint-plugin-promise": "6.1.1",
87
+ "lint-staged": "13.2.2",
88
+ "mocha": "10.2.0",
93
89
  "pre-commit": "1.2.2",
94
- "prettier": "2.7.1",
95
- "typescript": "4.8.3"
90
+ "prettier": "2.8.8",
91
+ "sinon": "15.1.2",
92
+ "typescript": "5.1.3",
93
+ "ts-node": "10.9.1"
96
94
  },
97
95
  "engines": {
98
- "node": ">=14",
99
- "npm": ">=6"
96
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0",
97
+ "npm": ">=8"
100
98
  }
101
99
  }
package/build/lib/exec.js DELETED
@@ -1,173 +0,0 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
- Object.defineProperty(exports, "__esModule", {
6
- value: true
7
- });
8
- exports.default = void 0;
9
- exports.exec = exec;
10
-
11
- require("source-map-support/register");
12
-
13
- var _child_process = require("child_process");
14
-
15
- var _shellQuote = require("shell-quote");
16
-
17
- var _bluebird = _interopRequireDefault(require("bluebird"));
18
-
19
- var _lodash = _interopRequireDefault(require("lodash"));
20
-
21
- var _helpers = require("./helpers");
22
-
23
- const MAX_BUFFER_SIZE = 100 * 1024 * 1024;
24
-
25
- async function exec(cmd, args = [], opts = {}) {
26
- const rep = (0, _shellQuote.quote)([cmd, ...args]);
27
- opts = _lodash.default.defaults(opts, {
28
- timeout: null,
29
- encoding: 'utf8',
30
- killSignal: 'SIGTERM',
31
- cwd: undefined,
32
- env: process.env,
33
- ignoreOutput: false,
34
- stdio: 'inherit',
35
- isBuffer: false,
36
- shell: undefined,
37
- logger: undefined,
38
- maxStdoutBufferSize: MAX_BUFFER_SIZE,
39
- maxStderrBufferSize: MAX_BUFFER_SIZE
40
- });
41
- const isBuffer = Boolean(opts.isBuffer);
42
- return await new _bluebird.default((resolve, reject) => {
43
- let proc = (0, _child_process.spawn)(cmd, args, {
44
- cwd: opts.cwd,
45
- env: opts.env,
46
- shell: opts.shell
47
- });
48
- let stdoutArr = [],
49
- stderrArr = [],
50
- timer = null;
51
- proc.on('error', err => {
52
- if (err.errno === 'ENOENT') {
53
- err = (0, _helpers.formatEnoent)(err, cmd, opts.cwd);
54
- }
55
-
56
- reject(err);
57
- });
58
-
59
- if (proc.stdin) {
60
- proc.stdin.on('error', err => {
61
- reject(new Error(`Standard input '${err.syscall}' error: ${err.stack}`));
62
- });
63
- }
64
-
65
- const handleStream = (streamType, streamProps) => {
66
- if (!proc[streamType]) {
67
- return;
68
- }
69
-
70
- proc[streamType].on('error', err => {
71
- reject(new Error(`${_lodash.default.capitalize(streamType)} '${err.syscall}' error: ${err.stack}`));
72
- });
73
-
74
- if (opts.ignoreOutput) {
75
- proc[streamType].on('data', () => {});
76
- return;
77
- }
78
-
79
- const {
80
- chunks,
81
- maxSize
82
- } = streamProps;
83
- let size = 0;
84
- proc[streamType].on('data', chunk => {
85
- chunks.push(chunk);
86
- size += chunk.length;
87
-
88
- while (chunks.length > 1 && size >= maxSize) {
89
- size -= chunks[0].length;
90
- chunks.shift();
91
- }
92
-
93
- if (opts.logger && _lodash.default.isFunction(opts.logger.debug)) {
94
- opts.logger.debug(chunk.toString());
95
- }
96
- });
97
- };
98
-
99
- handleStream('stdout', {
100
- maxSize: opts.maxStdoutBufferSize,
101
- chunks: stdoutArr
102
- });
103
- handleStream('stderr', {
104
- maxSize: opts.maxStderrBufferSize,
105
- chunks: stderrArr
106
- });
107
-
108
- function getStdio(isBuffer) {
109
- let stdout, stderr;
110
-
111
- if (isBuffer) {
112
- stdout = Buffer.concat(stdoutArr);
113
- stderr = Buffer.concat(stderrArr);
114
- } else {
115
- stdout = Buffer.concat(stdoutArr).toString(opts.encoding);
116
- stderr = Buffer.concat(stderrArr).toString(opts.encoding);
117
- }
118
-
119
- return {
120
- stdout,
121
- stderr
122
- };
123
- }
124
-
125
- proc.on('close', code => {
126
- if (timer) {
127
- clearTimeout(timer);
128
- }
129
-
130
- let {
131
- stdout,
132
- stderr
133
- } = getStdio(isBuffer);
134
-
135
- if (code === 0) {
136
- resolve({
137
- stdout,
138
- stderr,
139
- code
140
- });
141
- } else {
142
- let err = new Error(`Command '${rep}' exited with code ${code}`);
143
- err = Object.assign(err, {
144
- stdout,
145
- stderr,
146
- code
147
- });
148
- reject(err);
149
- }
150
- });
151
-
152
- if (opts.timeout) {
153
- timer = setTimeout(() => {
154
- let {
155
- stdout,
156
- stderr
157
- } = getStdio(isBuffer);
158
- let err = new Error(`Command '${rep}' timed out after ${opts.timeout}ms`);
159
- err = Object.assign(err, {
160
- stdout,
161
- stderr,
162
- code: null
163
- });
164
- reject(err);
165
- proc.kill(opts.killSignal);
166
- }, opts.timeout);
167
- }
168
- });
169
- }
170
-
171
- var _default = exec;
172
- exports.default = _default;
173
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJNQVhfQlVGRkVSX1NJWkUiLCJleGVjIiwiY21kIiwiYXJncyIsIm9wdHMiLCJyZXAiLCJxdW90ZSIsIl8iLCJkZWZhdWx0cyIsInRpbWVvdXQiLCJlbmNvZGluZyIsImtpbGxTaWduYWwiLCJjd2QiLCJ1bmRlZmluZWQiLCJlbnYiLCJwcm9jZXNzIiwiaWdub3JlT3V0cHV0Iiwic3RkaW8iLCJpc0J1ZmZlciIsInNoZWxsIiwibG9nZ2VyIiwibWF4U3Rkb3V0QnVmZmVyU2l6ZSIsIm1heFN0ZGVyckJ1ZmZlclNpemUiLCJCb29sZWFuIiwiQiIsInJlc29sdmUiLCJyZWplY3QiLCJwcm9jIiwic3Bhd24iLCJzdGRvdXRBcnIiLCJzdGRlcnJBcnIiLCJ0aW1lciIsIm9uIiwiZXJyIiwiZXJybm8iLCJmb3JtYXRFbm9lbnQiLCJzdGRpbiIsIkVycm9yIiwic3lzY2FsbCIsInN0YWNrIiwiaGFuZGxlU3RyZWFtIiwic3RyZWFtVHlwZSIsInN0cmVhbVByb3BzIiwiY2FwaXRhbGl6ZSIsImNodW5rcyIsIm1heFNpemUiLCJzaXplIiwiY2h1bmsiLCJwdXNoIiwibGVuZ3RoIiwic2hpZnQiLCJpc0Z1bmN0aW9uIiwiZGVidWciLCJ0b1N0cmluZyIsImdldFN0ZGlvIiwic3Rkb3V0Iiwic3RkZXJyIiwiQnVmZmVyIiwiY29uY2F0IiwiY29kZSIsImNsZWFyVGltZW91dCIsIk9iamVjdCIsImFzc2lnbiIsInNldFRpbWVvdXQiLCJraWxsIl0sInNvdXJjZXMiOlsiLi4vLi4vbGliL2V4ZWMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgcHJvbWlzZS9wcmVmZXItYXdhaXQtdG8tY2FsbGJhY2tzICovXG5cbmltcG9ydCB7IHNwYXduIH0gZnJvbSAnY2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgeyBxdW90ZSB9IGZyb20gJ3NoZWxsLXF1b3RlJztcbmltcG9ydCBCIGZyb20gJ2JsdWViaXJkJztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBmb3JtYXRFbm9lbnQgfSBmcm9tICcuL2hlbHBlcnMnO1xuXG5jb25zdCBNQVhfQlVGRkVSX1NJWkUgPSAxMDAgKiAxMDI0ICogMTAyNDtcblxuLyoqXG4gKiBTcGF3bnMgYSBwcm9jZXNzXG4gKiBAdGVtcGxhdGUge1RlZW5Qcm9jZXNzRXhlY09wdGlvbnN9IFRcbiAqIEBwYXJhbSB7c3RyaW5nfSBjbWQgLSBQcm9ncmFtIHRvIGV4ZWN1dGVcbiAqIEBwYXJhbSB7c3RyaW5nW119IFthcmdzXSAtIEFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBwcm9ncmFtXG4gKiBAcGFyYW0ge1R9IFtvcHRzXSAtIE9wdGlvbnNcbiAqIEByZXR1cm5zIHtQcm9taXNlPEJ1ZmZlclByb3A8VD4gZXh0ZW5kcyB0cnVlID8gVGVlblByb2Nlc3NFeGVjQnVmZmVyUmVzdWx0IDogVGVlblByb2Nlc3NFeGVjU3RyaW5nUmVzdWx0Pn1cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZXhlYyAoY21kLCBhcmdzID0gW10sIG9wdHMgPSAvKiogQHR5cGUge1R9ICovKHt9KSkge1xuICAvLyBnZXQgYSBxdW90ZWQgcmVwcmVzZW50YXRpb24gb2YgdGhlIGNvbW1hbmQgZm9yIGVycm9yIHN0cmluZ3NcbiAgY29uc3QgcmVwID0gcXVvdGUoW2NtZCwgLi4uYXJnc10pO1xuXG4gIC8vIGV4dGVuZCBkZWZhdWx0IG9wdGlvbnM7IHdlJ3JlIGJhc2ljYWxseSByZS1pbXBsZW1lbnRpbmcgZXhlYydzIG9wdGlvbnNcbiAgLy8gZm9yIHVzZSBoZXJlIHdpdGggc3Bhd24gdW5kZXIgdGhlIGhvb2RcbiAgb3B0cyA9IC8qKiBAdHlwZSB7VH0gKi8oXy5kZWZhdWx0cyhvcHRzLCB7XG4gICAgdGltZW91dDogbnVsbCxcbiAgICBlbmNvZGluZzogJ3V0ZjgnLFxuICAgIGtpbGxTaWduYWw6ICdTSUdURVJNJyxcbiAgICBjd2Q6IHVuZGVmaW5lZCxcbiAgICBlbnY6IHByb2Nlc3MuZW52LFxuICAgIGlnbm9yZU91dHB1dDogZmFsc2UsXG4gICAgc3RkaW86ICdpbmhlcml0JyxcbiAgICBpc0J1ZmZlcjogZmFsc2UsXG4gICAgc2hlbGw6IHVuZGVmaW5lZCxcbiAgICBsb2dnZXI6IHVuZGVmaW5lZCxcbiAgICBtYXhTdGRvdXRCdWZmZXJTaXplOiBNQVhfQlVGRkVSX1NJWkUsXG4gICAgbWF4U3RkZXJyQnVmZmVyU2l6ZTogTUFYX0JVRkZFUl9TSVpFLFxuICB9KSk7XG5cbiAgY29uc3QgaXNCdWZmZXIgPSBCb29sZWFuKG9wdHMuaXNCdWZmZXIpO1xuXG4gIC8vIHRoaXMgaXMgYW4gYXN5bmMgZnVuY3Rpb24sIHNvIHJldHVybiBhIHByb21pc2VcbiAgcmV0dXJuIGF3YWl0IG5ldyBCKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAvLyBzcGF3biB0aGUgY2hpbGQgcHJvY2VzcyB3aXRoIG9wdGlvbnM7IHdlIGRvbid0IGN1cnJlbnRseSBleHBvc2UgYW55IG9mXG4gICAgLy8gdGhlIG90aGVyICdzcGF3bicgb3B0aW9ucyB0aHJvdWdoIHRoZSBBUElcbiAgICBsZXQgcHJvYyA9IHNwYXduKGNtZCwgYXJncywge2N3ZDogb3B0cy5jd2QsIGVudjogb3B0cy5lbnYsIHNoZWxsOiBvcHRzLnNoZWxsfSk7XG4gICAgbGV0IHN0ZG91dEFyciA9IFtdLCBzdGRlcnJBcnIgPSBbXSwgdGltZXIgPSBudWxsO1xuXG4gICAgLy8gaWYgdGhlIHByb2Nlc3MgZXJyb3JzIG91dCwgcmVqZWN0IHRoZSBwcm9taXNlXG4gICAgcHJvYy5vbignZXJyb3InLCAvKiogQHBhcmFtIHtOb2RlSlMuRXJybm9FeGNlcHRpb259IGVyciAqLyhlcnIpID0+IHtcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIGlmIChlcnIuZXJybm8gPT09ICdFTk9FTlQnKSB7XG4gICAgICAgIGVyciA9IGZvcm1hdEVub2VudChlcnIsIGNtZCwgb3B0cy5jd2QpO1xuICAgICAgfVxuICAgICAgcmVqZWN0KGVycik7XG4gICAgfSk7XG4gICAgaWYgKHByb2Muc3RkaW4pIHtcbiAgICAgIHByb2Muc3RkaW4ub24oJ2Vycm9yJywgLyoqIEBwYXJhbSB7Tm9kZUpTLkVycm5vRXhjZXB0aW9ufSBlcnIgKi8oZXJyKSA9PiB7XG4gICAgICAgIHJlamVjdChuZXcgRXJyb3IoYFN0YW5kYXJkIGlucHV0ICcke2Vyci5zeXNjYWxsfScgZXJyb3I6ICR7ZXJyLnN0YWNrfWApKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBjb25zdCBoYW5kbGVTdHJlYW0gPSAoc3RyZWFtVHlwZSwgc3RyZWFtUHJvcHMpID0+IHtcbiAgICAgIGlmICghcHJvY1tzdHJlYW1UeXBlXSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHByb2Nbc3RyZWFtVHlwZV0ub24oJ2Vycm9yJywgKGVycikgPT4ge1xuICAgICAgICByZWplY3QobmV3IEVycm9yKGAke18uY2FwaXRhbGl6ZShzdHJlYW1UeXBlKX0gJyR7ZXJyLnN5c2NhbGx9JyBlcnJvcjogJHtlcnIuc3RhY2t9YCkpO1xuICAgICAgfSk7XG5cbiAgICAgIGlmIChvcHRzLmlnbm9yZU91dHB1dCkge1xuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL25vZGUvaXNzdWVzLzQyMzZcbiAgICAgICAgcHJvY1tzdHJlYW1UeXBlXS5vbignZGF0YScsICgpID0+IHt9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBrZWVwIHRyYWNrIG9mIHRoZSBzdHJlYW0gaWYgd2UgZG9uJ3Qgd2FudCB0byBpZ25vcmUgaXRcbiAgICAgIGNvbnN0IHtjaHVua3MsIG1heFNpemV9ID0gc3RyZWFtUHJvcHM7XG4gICAgICBsZXQgc2l6ZSA9IDA7XG4gICAgICBwcm9jW3N0cmVhbVR5cGVdLm9uKCdkYXRhJywgKGNodW5rKSA9PiB7XG4gICAgICAgIGNodW5rcy5wdXNoKGNodW5rKTtcbiAgICAgICAgc2l6ZSArPSBjaHVuay5sZW5ndGg7XG4gICAgICAgIHdoaWxlIChjaHVua3MubGVuZ3RoID4gMSAmJiBzaXplID49IG1heFNpemUpIHtcbiAgICAgICAgICBzaXplIC09IGNodW5rc1swXS5sZW5ndGg7XG4gICAgICAgICAgY2h1bmtzLnNoaWZ0KCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdHMubG9nZ2VyICYmIF8uaXNGdW5jdGlvbihvcHRzLmxvZ2dlci5kZWJ1ZykpIHtcbiAgICAgICAgICBvcHRzLmxvZ2dlci5kZWJ1ZyhjaHVuay50b1N0cmluZygpKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfTtcbiAgICBoYW5kbGVTdHJlYW0oJ3N0ZG91dCcsIHtcbiAgICAgIG1heFNpemU6IG9wdHMubWF4U3Rkb3V0QnVmZmVyU2l6ZSxcbiAgICAgIGNodW5rczogc3Rkb3V0QXJyLFxuICAgIH0pO1xuICAgIGhhbmRsZVN0cmVhbSgnc3RkZXJyJywge1xuICAgICAgbWF4U2l6ZTogb3B0cy5tYXhTdGRlcnJCdWZmZXJTaXplLFxuICAgICAgY2h1bmtzOiBzdGRlcnJBcnIsXG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBAdGVtcGxhdGUge2Jvb2xlYW59IFVcbiAgICAgKiBAcGFyYW0ge1V9IGlzQnVmZmVyXG4gICAgICogQHJldHVybnMge1UgZXh0ZW5kcyB0cnVlID8ge3N0ZG91dDogQnVmZmVyLCBzdGRlcnI6IEJ1ZmZlcn0gOiB7c3Rkb3V0OiBzdHJpbmcsIHN0ZGVycjogc3RyaW5nfX1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXRTdGRpbyAoaXNCdWZmZXIpIHtcbiAgICAgIGxldCBzdGRvdXQsIHN0ZGVycjtcbiAgICAgIGlmIChpc0J1ZmZlcikge1xuICAgICAgICBzdGRvdXQgPSBCdWZmZXIuY29uY2F0KHN0ZG91dEFycik7XG4gICAgICAgIHN0ZGVyciA9IEJ1ZmZlci5jb25jYXQoc3RkZXJyQXJyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0ZG91dCA9IEJ1ZmZlci5jb25jYXQoc3Rkb3V0QXJyKS50b1N0cmluZyhvcHRzLmVuY29kaW5nKTtcbiAgICAgICAgc3RkZXJyID0gQnVmZmVyLmNvbmNhdChzdGRlcnJBcnIpLnRvU3RyaW5nKG9wdHMuZW5jb2RpbmcpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIC8qKiBAdHlwZSB7VSBleHRlbmRzIHRydWUgPyB7c3Rkb3V0OiBCdWZmZXIsIHN0ZGVycjogQnVmZmVyfSA6IHtzdGRvdXQ6IHN0cmluZywgc3RkZXJyOiBzdHJpbmd9fSAqLyh7c3Rkb3V0LCBzdGRlcnJ9KTtcbiAgICB9XG5cbiAgICAvLyBpZiB0aGUgcHJvY2VzcyBlbmRzLCBlaXRoZXIgcmVzb2x2ZSBvciByZWplY3QgdGhlIHByb21pc2UgYmFzZWQgb24gdGhlXG4gICAgLy8gZXhpdCBjb2RlIG9mIHRoZSBwcm9jZXNzLiBlaXRoZXIgd2F5LCBhdHRhY2ggc3Rkb3V0LCBzdGRlcnIsIGFuZCBjb2RlLlxuICAgIC8vIEFsc28gY2xlYW4gdXAgdGhlIHRpbWVyIGlmIGl0IGV4aXN0c1xuICAgIHByb2Mub24oJ2Nsb3NlJywgKGNvZGUpID0+IHtcbiAgICAgIGlmICh0aW1lcikge1xuICAgICAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgICAgfVxuICAgICAgbGV0IHtzdGRvdXQsIHN0ZGVycn0gPSBnZXRTdGRpbyhpc0J1ZmZlcik7XG4gICAgICBpZiAoY29kZSA9PT0gMCkge1xuICAgICAgICByZXNvbHZlKC8qKiBAdHlwZSB7QnVmZmVyUHJvcDxUPiBleHRlbmRzIHRydWUgPyBUZWVuUHJvY2Vzc0V4ZWNCdWZmZXJSZXN1bHQgOiBUZWVuUHJvY2Vzc0V4ZWNTdHJpbmdSZXN1bHR9ICovKHtzdGRvdXQsIHN0ZGVyciwgY29kZX0pKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxldCBlcnIgPSBuZXcgRXJyb3IoYENvbW1hbmQgJyR7cmVwfScgZXhpdGVkIHdpdGggY29kZSAke2NvZGV9YCk7XG4gICAgICAgIGVyciA9IE9iamVjdC5hc3NpZ24oZXJyLCB7c3Rkb3V0LCBzdGRlcnIsIGNvZGV9KTtcbiAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBpZiB3ZSBzZXQgYSB0aW1lb3V0IG9uIHRoZSBjaGlsZCBwcm9jZXNzLCBjdXQgaW50byB0aGUgZXhlY3V0aW9uIGFuZFxuICAgIC8vIHJlamVjdCBpZiB0aGUgdGltZW91dCBpcyByZWFjaGVkLiBBdHRhY2ggdGhlIHN0ZG91dC9zdGRlcnIgd2UgY3VycmVudGx5XG4gICAgLy8gaGF2ZSBpbiBjYXNlIGl0J3MgaGVscGZ1bCBpbiBkZWJ1Z2dpbmdcbiAgICBpZiAob3B0cy50aW1lb3V0KSB7XG4gICAgICB0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBsZXQge3N0ZG91dCwgc3RkZXJyfSA9IGdldFN0ZGlvKGlzQnVmZmVyKTtcbiAgICAgICAgbGV0IGVyciA9IG5ldyBFcnJvcihgQ29tbWFuZCAnJHtyZXB9JyB0aW1lZCBvdXQgYWZ0ZXIgJHtvcHRzLnRpbWVvdXR9bXNgKTtcbiAgICAgICAgZXJyID0gT2JqZWN0LmFzc2lnbihlcnIsIHtzdGRvdXQsIHN0ZGVyciwgY29kZTogbnVsbH0pO1xuICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgLy8gcmVqZWN0IGFuZCBUSEVOIGtpbGwgdG8gYXZvaWQgcmFjZSBjb25kaXRpb25zIHdpdGggdGhlIGhhbmRsZXJzXG4gICAgICAgIC8vIGFib3ZlXG4gICAgICAgIHByb2Mua2lsbChvcHRzLmtpbGxTaWduYWwpO1xuICAgICAgfSwgb3B0cy50aW1lb3V0KTtcbiAgICB9XG4gIH0pO1xufVxuXG5leHBvcnQgeyBleGVjIH07XG5leHBvcnQgZGVmYXVsdCBleGVjO1xuXG4vKipcbiAqIE9wdGlvbnMgb24gdG9wIG9mIGBTcGF3bk9wdGlvbnNgLCB1bmlxdWUgdG8gYHRlZW5fcHJvY2Vzcy5gXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBUZWVuUHJvY2Vzc1Byb3BzXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtpZ25vcmVPdXRwdXRdIC0gSWdub3JlICYgZGlzY2FyZCBhbGwgb3V0cHV0XG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtpc0J1ZmZlcl0gLSBSZXR1cm4gb3V0cHV0IGFzIGEgQnVmZmVyXG4gKiBAcHJvcGVydHkge1RlZW5Qcm9jZXNzTG9nZ2VyfSBbbG9nZ2VyXSAtIExvZ2dlciB0byB1c2UgZm9yIGRlYnVnZ2luZ1xuICogQHByb3BlcnR5IHtudW1iZXJ9IFttYXhTdGRvdXRCdWZmZXJTaXplXSAtIE1heGltdW0gc2l6ZSBvZiBgc3Rkb3V0YCBidWZmZXJcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbbWF4U3RkZXJyQnVmZmVyU2l6ZV0gLSBNYXhpbXVtIHNpemUgb2YgYHN0ZGVycmAgYnVmZmVyXG4gKiBAcHJvcGVydHkge0J1ZmZlckVuY29kaW5nfSBbZW5jb2Rpbmc9J3V0ZjgnXSAtIEVuY29kaW5nIHRvIHVzZSBmb3Igb3V0cHV0XG4gKi9cblxuLyoqXG4gKiBBIGxvZ2dlciBvYmplY3QgdW5kZXJzdG9vZCBieSB7QGxpbmsgZXhlYyB0ZWVuX3Byb2Nlc3MuZXhlY30uXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBUZWVuUHJvY2Vzc0xvZ2dlclxuICogQHByb3BlcnR5IHsoLi4uYXJnczogYW55W10pID0+IHZvaWR9IGRlYnVnXG4gKi9cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgZXhlYyB0ZWVuX3Byb2Nlc3MuZXhlY30uXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdjaGlsZF9wcm9jZXNzJykuU3Bhd25PcHRpb25zICYgVGVlblByb2Nlc3NQcm9wc30gVGVlblByb2Nlc3NFeGVjT3B0aW9uc1xuICovXG5cbi8qKlxuICogVGhlIHZhbHVlIHtAbGluayBleGVjIHRlZW5fcHJvY2Vzcy5leGVjfSByZXNvbHZlcyB0byB3aGVuIGBpc0J1ZmZlcmAgaXMgYGZhbHNlYFxuICogQHR5cGVkZWYge09iamVjdH0gVGVlblByb2Nlc3NFeGVjU3RyaW5nUmVzdWx0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gc3Rkb3V0IC0gU3Rkb3V0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gc3RkZXJyIC0gU3RkZXJyXG4gKiBAcHJvcGVydHkge251bWJlcj99IGNvZGUgLSBFeGl0IGNvZGVcbiAqL1xuXG4vKipcbiAqIFRoZSB2YWx1ZSB7QGxpbmsgZXhlYyB0ZWVuX3Byb2Nlc3MuZXhlY30gcmVzb2x2ZXMgdG8gd2hlbiBgaXNCdWZmZXJgIGlzIGB0cnVlYFxuICogQHR5cGVkZWYge09iamVjdH0gVGVlblByb2Nlc3NFeGVjQnVmZmVyUmVzdWx0XG4gKiBAcHJvcGVydHkge0J1ZmZlcn0gc3Rkb3V0IC0gU3Rkb3V0XG4gKiBAcHJvcGVydHkge0J1ZmZlcn0gc3RkZXJyIC0gU3RkZXJyXG4gKiBAcHJvcGVydHkge251bWJlcj99IGNvZGUgLSBFeGl0IGNvZGVcbiAqL1xuXG4vKipcbiAqIEV4dHJhIHByb3BzIHtAbGluayBleGVjIHRlZW5fcHJvY2Vzcy5leGVjfSBhZGRzIHRvIGl0cyBlcnJvciBvYmplY3RzXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBUZWVuUHJvY2Vzc0V4ZWNFcnJvclByb3BzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gc3Rkb3V0IC0gU1RET1VUXG4gKiBAcHJvcGVydHkge3N0cmluZ30gc3RkZXJyIC0gU1RERVJSXG4gKiBAcHJvcGVydHkge251bWJlcj99IGNvZGUgLSBFeGl0IGNvZGVcbiAqL1xuXG4vKipcbiAqIEVycm9yIHRocm93biBieSB7QGxpbmsgZXhlYyB0ZWVuX3Byb2Nlc3MuZXhlY31cbiAqIEB0eXBlZGVmIHtFcnJvciAmIFRlZW5Qcm9jZXNzRXhlY0Vycm9yUHJvcHN9IFRlZW5Qcm9jZXNzRXhlY0Vycm9yXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge3tpc0J1ZmZlcj86IGJvb2xlYW59fSBNYXliZUJ1ZmZlclxuICogQHR5cGVkZWYge01heWJlQnVmZmVyWydpc0J1ZmZlciddfSBCdWZmZXJQcm9wXG4gKiBAcHJpdmF0ZVxuICovXG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7OztBQUVBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUVBLE1BQU1BLGVBQWUsR0FB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
@@ -1,33 +0,0 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
- Object.defineProperty(exports, "__esModule", {
6
- value: true
7
- });
8
- exports.formatEnoent = formatEnoent;
9
-
10
- require("source-map-support/register");
11
-
12
- var _which = _interopRequireDefault(require("which"));
13
-
14
- var _fs = _interopRequireDefault(require("fs"));
15
-
16
- function formatEnoent(error, cmd, cwd = null) {
17
- try {
18
- _which.default.sync(cmd);
19
-
20
- if (cwd) {
21
- try {
22
- _fs.default.accessSync(cwd, _fs.default.constants.R_OK);
23
- } catch (ign) {
24
- error.message = `The current working directory '${cwd}' for '${cmd}' command ` + `either does not exist or is not accessible`;
25
- }
26
- }
27
- } catch (ign) {
28
- error.message = `Command '${cmd}' not found. Is it installed?`;
29
- }
30
-
31
- return error;
32
- }
33
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJmb3JtYXRFbm9lbnQiLCJlcnJvciIsImNtZCIsImN3ZCIsIndoaWNoIiwic3luYyIsImZzIiwiYWNjZXNzU3luYyIsImNvbnN0YW50cyIsIlJfT0siLCJpZ24iLCJtZXNzYWdlIl0sInNvdXJjZXMiOlsiLi4vLi4vbGliL2hlbHBlcnMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHdoaWNoIGZyb20gJ3doaWNoJztcbmltcG9ydCBmcyBmcm9tICdmcyc7XG5cbi8qKlxuICogRGVjb3JhdGVzIEVOT0VOVCBlcnJvciByZWNlaXZlZCBmcm9tIGEgc3Bhd24gc3lzdGVtIGNhbGxcbiAqIHdpdGggYSBtb3JlIGRlc2NyaXB0aXZlIG1lc3NhZ2UsIHNvIGl0IGNvdWxkIGJlIHByb3Blcmx5IGhhbmRsZWQgYnkgYSB1c2VyLlxuICpcbiAqIEBwYXJhbSB7Tm9kZUpTLkVycm5vRXhjZXB0aW9ufSBlcnJvciBPcmlnaW5hbCBlcnJvciBpbnN0YW5jZS4gISEhIFRoZSBpbnN0YW5jZSBpcyBtdXRhdGVkIGFmdGVyXG4gKiB0aGlzIGhlbHBlciBmdW5jdGlvbiBpbnZvY2F0aW9uXG4gKiBAcGFyYW0ge3N0cmluZ30gY21kIE9yaWdpbmFsIGNvbW1hbmQgdG8gZXhlY3V0ZVxuICogQHBhcmFtIHtzdHJpbmd8VVJMP30gW2N3ZF0gT3B0aW9uYWwgcGF0aCB0byB0aGUgY3VycmVudCB3b3JraW5nIGRpclxuICogQHJldHVybnMge05vZGVKUy5FcnJub0V4Y2VwdGlvbn0gTXV0YXRlZCBlcnJvciBpbnN0YW5jZSB3aXRoIGFuIGltcHJvdmVkIGRlc2NyaXB0aW9uIG9yIGFuXG4gKiB1bmNoYW5nZWQgZXJyb3IgaW5zdGFuY2VcbiAqL1xuZnVuY3Rpb24gZm9ybWF0RW5vZW50IChlcnJvciwgY21kLCBjd2QgPSBudWxsKSB7XG4gIHRyeSB7XG4gICAgd2hpY2guc3luYyhjbWQpO1xuICAgIGlmIChjd2QpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGZzLmFjY2Vzc1N5bmMoY3dkLCBmcy5jb25zdGFudHMuUl9PSyk7XG4gICAgICB9IGNhdGNoIChpZ24pIHtcbiAgICAgICAgZXJyb3IubWVzc2FnZSA9IGBUaGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSAnJHtjd2R9JyBmb3IgJyR7Y21kfScgY29tbWFuZCBgICtcbiAgICAgICAgICBgZWl0aGVyIGRvZXMgbm90IGV4aXN0IG9yIGlzIG5vdCBhY2Nlc3NpYmxlYDtcbiAgICAgIH1cbiAgICB9XG4gIH0gY2F0Y2ggKGlnbikge1xuICAgIGVycm9yLm1lc3NhZ2UgPSBgQ29tbWFuZCAnJHtjbWR9JyBub3QgZm91bmQuIElzIGl0IGluc3RhbGxlZD9gO1xuICB9XG4gIHJldHVybiBlcnJvcjtcbn1cblxuZXhwb3J0IHsgZm9ybWF0RW5vZW50IH07XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBYUEsU0FBU0EsWUFBVCxDQUF1QkMsS0FBdkIsRUFBOEJDLEdBQTlCLEVBQW1DQyxHQUFHLEdBQUcsSUFBekMsRUFBK0M7RUFDN0MsSUFBSTtJQUNGQyxjQUFBLENBQU1DLElBQU4sQ0FBV0gsR0FBWDs7SUFDQSxJQUFJQyxHQUFKLEVBQVM7TUFDUCxJQUFJO1FBQ0ZHLFdBQUEsQ0FBR0MsVUFBSCxDQUFjSixHQUFkLEVBQW1CRyxXQUFBLENBQUdFLFNBQUgsQ0FBYUMsSUFBaEM7TUFDRCxDQUZELENBRUUsT0FBT0MsR0FBUCxFQUFZO1FBQ1pULEtBQUssQ0FBQ1UsT0FBTixHQUFpQixrQ0FBaUNSLEdBQUksVUFBU0QsR0FBSSxZQUFuRCxHQUNiLDRDQURIO01BRUQ7SUFDRjtFQUNGLENBVkQsQ0FVRSxPQUFPUSxHQUFQLEVBQVk7SUFDWlQsS0FBSyxDQUFDVSxPQUFOLEdBQWlCLFlBQVdULEdBQUksK0JBQWhDO0VBQ0Q7O0VBQ0QsT0FBT0QsS0FBUDtBQUNEIn0=
@@ -1,32 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.spawn = exports.exec = exports.SubProcess = void 0;
7
-
8
- require("source-map-support/register");
9
-
10
- var cp = _interopRequireWildcard(require("child_process"));
11
-
12
- var spIndex = _interopRequireWildcard(require("./subprocess"));
13
-
14
- var execIndex = _interopRequireWildcard(require("./exec"));
15
-
16
- function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
17
-
18
- function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
19
-
20
- const {
21
- spawn
22
- } = cp;
23
- exports.spawn = spawn;
24
- const {
25
- SubProcess
26
- } = spIndex;
27
- exports.SubProcess = SubProcess;
28
- const {
29
- exec
30
- } = execIndex;
31
- exports.exec = exec;
32
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJzcGF3biIsImNwIiwiU3ViUHJvY2VzcyIsInNwSW5kZXgiLCJleGVjIiwiZXhlY0luZGV4Il0sInNvdXJjZXMiOlsiLi4vLi4vbGliL2luZGV4LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIHRyYW5zcGlsZTptYWluXG5pbXBvcnQgKiBhcyBjcCBmcm9tICdjaGlsZF9wcm9jZXNzJztcbmltcG9ydCAqIGFzIHNwSW5kZXggZnJvbSAnLi9zdWJwcm9jZXNzJztcbmltcG9ydCAqIGFzIGV4ZWNJbmRleCBmcm9tICcuL2V4ZWMnO1xuXG5cbmNvbnN0IHsgc3Bhd24gfSA9IGNwO1xuY29uc3QgeyBTdWJQcm9jZXNzIH0gPSBzcEluZGV4O1xuY29uc3QgeyBleGVjIH0gPSBleGVjSW5kZXg7XG5cbmV4cG9ydCB7IGV4ZWMsIHNwYXduLCBTdWJQcm9jZXNzIH07XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUNBOztBQUNBOztBQUNBOzs7Ozs7QUFHQSxNQUFNO0VBQUVBO0FBQUYsSUFBWUMsRUFBbEI7O0FBQ0EsTUFBTTtFQUFFQztBQUFGLElBQWlCQyxPQUF2Qjs7QUFDQSxNQUFNO0VBQUVDO0FBQUYsSUFBV0MsU0FBakIifQ==
@@ -1,285 +0,0 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
- Object.defineProperty(exports, "__esModule", {
6
- value: true
7
- });
8
- exports.default = exports.SubProcess = void 0;
9
-
10
- require("source-map-support/register");
11
-
12
- var _child_process = require("child_process");
13
-
14
- var _events = _interopRequireDefault(require("events"));
15
-
16
- var _bluebird = _interopRequireDefault(require("bluebird"));
17
-
18
- var _shellQuote = require("shell-quote");
19
-
20
- var _lodash = _interopRequireDefault(require("lodash"));
21
-
22
- var _helpers = require("./helpers");
23
-
24
- const {
25
- EventEmitter
26
- } = _events.default;
27
- const MAX_LINE_PORTION_LENGTH = 0xFFFF;
28
-
29
- function cutSuffix(str, suffixLength) {
30
- return str.length > suffixLength ? ` ${str.substr(str.length - suffixLength)}`.substr(1) : str;
31
- }
32
-
33
- class SubProcess extends EventEmitter {
34
- lastLinePortion;
35
- proc;
36
- args;
37
- cmd;
38
- opts;
39
- expectingExit;
40
- rep;
41
-
42
- constructor(cmd, args = [], opts = {}) {
43
- super();
44
- if (!cmd) throw new Error('Command is required');
45
- if (!_lodash.default.isString(cmd)) throw new Error('Command must be a string');
46
- if (!_lodash.default.isArray(args)) throw new Error('Args must be an array');
47
- this.cmd = cmd;
48
- this.args = args;
49
- this.proc = null;
50
- this.opts = opts;
51
- this.expectingExit = false;
52
- this.rep = (0, _shellQuote.quote)([cmd, ...args]);
53
- this.lastLinePortion = {
54
- stdout: '',
55
- stderr: ''
56
- };
57
- }
58
-
59
- get isRunning() {
60
- return !!this.proc;
61
- }
62
-
63
- emitLines(stream, lines) {
64
- for (let line of lines) {
65
- this.emit('stream-line', `[${stream.toUpperCase()}] ${line}`);
66
- }
67
- }
68
-
69
- async start(startDetector = null, timeoutMs = null, detach = false) {
70
- let startDelay = 10;
71
-
72
- const genericStartDetector = function genericStartDetector(stdout, stderr) {
73
- return stdout || stderr;
74
- };
75
-
76
- if (startDetector === null) {
77
- startDetector = genericStartDetector;
78
- }
79
-
80
- if (_lodash.default.isNumber(startDetector)) {
81
- startDelay = startDetector;
82
- startDetector = null;
83
- }
84
-
85
- if (_lodash.default.isBoolean(startDetector) && startDetector) {
86
- if (!this.opts.detached) {
87
- throw new Error(`Unable to detach process that is not started with 'detached' option`);
88
- }
89
-
90
- detach = true;
91
- startDetector = genericStartDetector;
92
- } else if (_lodash.default.isBoolean(timeoutMs) && timeoutMs) {
93
- if (!this.opts.detached) {
94
- throw new Error(`Unable to detach process that is not started with 'detached' option`);
95
- }
96
-
97
- detach = true;
98
- timeoutMs = null;
99
- }
100
-
101
- return await new _bluebird.default((resolve, reject) => {
102
- this.proc = (0, _child_process.spawn)(this.cmd, this.args, this.opts);
103
-
104
- if (this.proc.stdout) {
105
- this.proc.stdout.setEncoding(this.opts.encoding || 'utf8');
106
- }
107
-
108
- if (this.proc.stderr) {
109
- this.proc.stderr.setEncoding(this.opts.encoding || 'utf8');
110
- }
111
-
112
- this.lastLinePortion = {
113
- stdout: '',
114
- stderr: ''
115
- };
116
-
117
- const handleOutput = streams => {
118
- const {
119
- stdout,
120
- stderr
121
- } = streams;
122
-
123
- try {
124
- if (_lodash.default.isFunction(startDetector) && startDetector(stdout, stderr)) {
125
- startDetector = null;
126
- resolve();
127
- }
128
- } catch (e) {
129
- reject(e);
130
- }
131
-
132
- this.emit('output', stdout, stderr);
133
-
134
- for (const [streamName, streamData] of _lodash.default.toPairs(streams)) {
135
- if (!streamData) continue;
136
- const lines = streamData.split('\n').map(x => ` ${x}`.substr(1));
137
-
138
- if (lines.length > 1) {
139
- lines[0] = this.lastLinePortion[streamName] + lines[0];
140
- this.lastLinePortion[streamName] = cutSuffix(_lodash.default.last(lines), MAX_LINE_PORTION_LENGTH);
141
- const resultLines = lines.slice(0, -1);
142
- this.emit(`lines-${streamName}`, resultLines);
143
- this.emitLines(streamName, resultLines);
144
- } else {
145
- const currentPortion = cutSuffix(lines[0], MAX_LINE_PORTION_LENGTH);
146
-
147
- if (this.lastLinePortion[streamName].length + currentPortion.length > MAX_LINE_PORTION_LENGTH) {
148
- this.lastLinePortion[streamName] = currentPortion;
149
- } else {
150
- this.lastLinePortion[streamName] += currentPortion;
151
- }
152
- }
153
- }
154
- };
155
-
156
- this.proc.on('error', err => {
157
- var _this$proc, _this$proc2, _this$proc3;
158
-
159
- (_this$proc = this.proc) === null || _this$proc === void 0 ? void 0 : _this$proc.removeAllListeners('exit');
160
- (_this$proc2 = this.proc) === null || _this$proc2 === void 0 ? void 0 : _this$proc2.kill('SIGINT');
161
-
162
- if (err.code === 'ENOENT') {
163
- var _this$opts;
164
-
165
- err = (0, _helpers.formatEnoent)(err, this.cmd, (_this$opts = this.opts) === null || _this$opts === void 0 ? void 0 : _this$opts.cwd);
166
- }
167
-
168
- reject(err);
169
- (_this$proc3 = this.proc) === null || _this$proc3 === void 0 ? void 0 : _this$proc3.unref();
170
- this.proc = null;
171
- });
172
-
173
- if (this.proc.stdout) {
174
- this.proc.stdout.on('data', chunk => handleOutput({
175
- stdout: chunk.toString(),
176
- stderr: ''
177
- }));
178
- }
179
-
180
- if (this.proc.stderr) {
181
- this.proc.stderr.on('data', chunk => handleOutput({
182
- stdout: '',
183
- stderr: chunk.toString()
184
- }));
185
- }
186
-
187
- this.proc.on('exit', (code, signal) => {
188
- this.handleLastLines();
189
- this.emit('exit', code, signal);
190
- let event = this.expectingExit ? 'stop' : 'die';
191
-
192
- if (!this.expectingExit && code === 0) {
193
- event = 'end';
194
- }
195
-
196
- this.emit(event, code, signal);
197
- this.proc = null;
198
- this.expectingExit = false;
199
- });
200
-
201
- if (!startDetector) {
202
- setTimeout(() => {
203
- resolve();
204
- }, startDelay);
205
- }
206
-
207
- if (_lodash.default.isNumber(timeoutMs)) {
208
- setTimeout(() => {
209
- reject(new Error(`The process did not start within ${timeoutMs}ms ` + `(cmd: '${this.rep}')`));
210
- }, timeoutMs);
211
- }
212
- }).finally(() => {
213
- if (detach && this.proc) {
214
- this.proc.unref();
215
- }
216
- });
217
- }
218
-
219
- handleLastLines() {
220
- for (let stream of ['stdout', 'stderr']) {
221
- if (this.lastLinePortion[stream]) {
222
- const lastLines = [this.lastLinePortion[stream]];
223
- this.emit(`lines-${stream}`, lastLines);
224
- this.emitLines(stream, lastLines);
225
- this.lastLinePortion[stream] = '';
226
- }
227
- }
228
- }
229
-
230
- async stop(signal = 'SIGTERM', timeout = 10000) {
231
- if (!this.isRunning) {
232
- throw new Error(`Can't stop process; it's not currently running (cmd: '${this.rep}')`);
233
- }
234
-
235
- this.handleLastLines();
236
- return await new _bluebird.default((resolve, reject) => {
237
- var _this$proc4, _this$proc5;
238
-
239
- (_this$proc4 = this.proc) === null || _this$proc4 === void 0 ? void 0 : _this$proc4.on('close', resolve);
240
- this.expectingExit = true;
241
- (_this$proc5 = this.proc) === null || _this$proc5 === void 0 ? void 0 : _this$proc5.kill(signal);
242
- setTimeout(() => {
243
- reject(new Error(`Process didn't end after ${timeout}ms (cmd: '${this.rep}')`));
244
- }, timeout).unref();
245
- });
246
- }
247
-
248
- async join(allowedExitCodes = [0]) {
249
- if (!this.isRunning) {
250
- throw new Error(`Cannot join process; it is not currently running (cmd: '${this.rep}')`);
251
- }
252
-
253
- return await new _bluebird.default((resolve, reject) => {
254
- var _this$proc6;
255
-
256
- (_this$proc6 = this.proc) === null || _this$proc6 === void 0 ? void 0 : _this$proc6.on('exit', code => {
257
- if (code !== null && allowedExitCodes.indexOf(code) === -1) {
258
- reject(new Error(`Process ended with exitcode ${code} (cmd: '${this.rep}')`));
259
- } else {
260
- resolve(code);
261
- }
262
- });
263
- });
264
- }
265
-
266
- detachProcess() {
267
- if (!this.opts.detached) {
268
- throw new Error(`Unable to detach process that is not started with 'detached' option`);
269
- }
270
-
271
- if (this.proc) {
272
- this.proc.unref();
273
- }
274
- }
275
-
276
- get pid() {
277
- return this.proc ? this.proc.pid : null;
278
- }
279
-
280
- }
281
-
282
- exports.SubProcess = SubProcess;
283
- var _default = SubProcess;
284
- exports.default = _default;
285
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJFdmVudEVtaXR0ZXIiLCJldmVudHMiLCJNQVhfTElORV9QT1JUSU9OX0xFTkdUSCIsImN1dFN1ZmZpeCIsInN0ciIsInN1ZmZpeExlbmd0aCIsImxlbmd0aCIsInN1YnN0ciIsIlN1YlByb2Nlc3MiLCJsYXN0TGluZVBvcnRpb24iLCJwcm9jIiwiYXJncyIsImNtZCIsIm9wdHMiLCJleHBlY3RpbmdFeGl0IiwicmVwIiwiY29uc3RydWN0b3IiLCJFcnJvciIsIl8iLCJpc1N0cmluZyIsImlzQXJyYXkiLCJxdW90ZSIsInN0ZG91dCIsInN0ZGVyciIsImlzUnVubmluZyIsImVtaXRMaW5lcyIsInN0cmVhbSIsImxpbmVzIiwibGluZSIsImVtaXQiLCJ0b1VwcGVyQ2FzZSIsInN0YXJ0Iiwic3RhcnREZXRlY3RvciIsInRpbWVvdXRNcyIsImRldGFjaCIsInN0YXJ0RGVsYXkiLCJnZW5lcmljU3RhcnREZXRlY3RvciIsImlzTnVtYmVyIiwiaXNCb29sZWFuIiwiZGV0YWNoZWQiLCJCIiwicmVzb2x2ZSIsInJlamVjdCIsInNwYXduIiwic2V0RW5jb2RpbmciLCJlbmNvZGluZyIsImhhbmRsZU91dHB1dCIsInN0cmVhbXMiLCJpc0Z1bmN0aW9uIiwiZSIsInN0cmVhbU5hbWUiLCJzdHJlYW1EYXRhIiwidG9QYWlycyIsInNwbGl0IiwibWFwIiwieCIsImxhc3QiLCJyZXN1bHRMaW5lcyIsInNsaWNlIiwiY3VycmVudFBvcnRpb24iLCJvbiIsImVyciIsInJlbW92ZUFsbExpc3RlbmVycyIsImtpbGwiLCJjb2RlIiwiZm9ybWF0RW5vZW50IiwiY3dkIiwidW5yZWYiLCJjaHVuayIsInRvU3RyaW5nIiwic2lnbmFsIiwiaGFuZGxlTGFzdExpbmVzIiwiZXZlbnQiLCJzZXRUaW1lb3V0IiwiZmluYWxseSIsImxhc3RMaW5lcyIsInN0b3AiLCJ0aW1lb3V0Iiwiam9pbiIsImFsbG93ZWRFeGl0Q29kZXMiLCJpbmRleE9mIiwiZGV0YWNoUHJvY2VzcyIsInBpZCJdLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi9zdWJwcm9jZXNzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIHByb21pc2UvcHJlZmVyLWF3YWl0LXRvLWNhbGxiYWNrcyAqL1xuXG5pbXBvcnQgeyBzcGF3biB9IGZyb20gJ2NoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IGV2ZW50cyBmcm9tICdldmVudHMnO1xuY29uc3QgeyBFdmVudEVtaXR0ZXIgfSA9IGV2ZW50cztcbmltcG9ydCBCIGZyb20gJ2JsdWViaXJkJztcbmltcG9ydCB7IHF1b3RlIH0gZnJvbSAnc2hlbGwtcXVvdGUnO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IGZvcm1hdEVub2VudCB9IGZyb20gJy4vaGVscGVycyc7XG5cblxuLy8gVGhpcyBpcyBuZWVkZWQgdG8gYXZvaWQgbWVtb3J5IGxlYWtzXG4vLyB3aGVuIHRoZSBwcm9jZXNzIG91dHB1dCBpcyB0b28gbG9uZyBhbmQgY29udGFpbnNcbi8vIG5vIGxpbmUgYnJlYWtzXG5jb25zdCBNQVhfTElORV9QT1JUSU9OX0xFTkdUSCA9IDB4RkZGRjtcblxuZnVuY3Rpb24gY3V0U3VmZml4IChzdHIsIHN1ZmZpeExlbmd0aCkge1xuICByZXR1cm4gc3RyLmxlbmd0aCA+IHN1ZmZpeExlbmd0aFxuICAgIC8vIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTI4NjlcbiAgICA/IGAgJHtzdHIuc3Vic3RyKHN0ci5sZW5ndGggLSBzdWZmaXhMZW5ndGgpfWAuc3Vic3RyKDEpXG4gICAgOiBzdHI7XG59XG5cblxuY2xhc3MgU3ViUHJvY2VzcyBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG5cbiAgLyoqXG4gICAqIEB0eXBlIHsge3N0ZG91dDogc3RyaW5nLCBzdGRlcnI6IHN0cmluZ30gfVxuICAgKi9cbiAgbGFzdExpbmVQb3J0aW9uO1xuXG4gIC8qKiBAdHlwZSB7aW1wb3J0KCdjaGlsZF9wcm9jZXNzJykuQ2hpbGRQcm9jZXNzP30gKi9cbiAgcHJvYztcblxuICAvKiogQHR5cGUge3N0cmluZ1tdfSAqL1xuICBhcmdzO1xuXG4gIC8qKlxuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKi9cbiAgY21kO1xuXG4gIC8qKlxuICAgKiBAdHlwZSB7YW55fVxuICAqL1xuICBvcHRzO1xuXG4gIC8qKlxuICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICovXG4gIGV4cGVjdGluZ0V4aXQ7XG5cbiAgLyoqXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqL1xuICByZXA7XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjbWRcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gW2FyZ3NdXG4gICAqIEBwYXJhbSB7YW55fSBbb3B0c11cbiAgICovXG4gIGNvbnN0cnVjdG9yIChjbWQsIGFyZ3MgPSBbXSwgb3B0cyA9IHt9KSB7XG4gICAgc3VwZXIoKTtcbiAgICBpZiAoIWNtZCkgdGhyb3cgbmV3IEVycm9yKCdDb21tYW5kIGlzIHJlcXVpcmVkJyk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgY3VybHlcbiAgICBpZiAoIV8uaXNTdHJpbmcoY21kKSkgdGhyb3cgbmV3IEVycm9yKCdDb21tYW5kIG11c3QgYmUgYSBzdHJpbmcnKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBjdXJseVxuICAgIGlmICghXy5pc0FycmF5KGFyZ3MpKSB0aHJvdyBuZXcgRXJyb3IoJ0FyZ3MgbXVzdCBiZSBhbiBhcnJheScpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGN1cmx5XG5cbiAgICB0aGlzLmNtZCA9IGNtZDtcbiAgICB0aGlzLmFyZ3MgPSBhcmdzO1xuICAgIHRoaXMucHJvYyA9IG51bGw7XG4gICAgdGhpcy5vcHRzID0gb3B0cztcbiAgICB0aGlzLmV4cGVjdGluZ0V4aXQgPSBmYWxzZTtcblxuICAgIC8vIGdldCBhIHF1b3RlZCByZXByZXNlbnRhdGlvbiBvZiB0aGUgY29tbWFuZCBmb3IgZXJyb3Igc3RyaW5nc1xuICAgIHRoaXMucmVwID0gcXVvdGUoW2NtZCwgLi4uYXJnc10pO1xuXG4gICAgdGhpcy5sYXN0TGluZVBvcnRpb24gPSB7c3Rkb3V0OiAnJywgc3RkZXJyOiAnJ307XG4gIH1cblxuICBnZXQgaXNSdW5uaW5nICgpIHtcbiAgICAvLyBwcmVzZW5jZSBvZiBgcHJvY2AgbWVhbnMgd2UgaGF2ZSBjb25uZWN0ZWQgYW5kIHN0YXJ0ZWRcbiAgICByZXR1cm4gISF0aGlzLnByb2M7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0cmVhbVxuICAgKiBAcGFyYW0ge0l0ZXJhYmxlPHN0cmluZz59IGxpbmVzXG4gICAqL1xuICBlbWl0TGluZXMgKHN0cmVhbSwgbGluZXMpIHtcbiAgICBmb3IgKGxldCBsaW5lIG9mIGxpbmVzKSB7XG4gICAgICB0aGlzLmVtaXQoJ3N0cmVhbS1saW5lJywgYFske3N0cmVhbS50b1VwcGVyQ2FzZSgpfV0gJHtsaW5lfWApO1xuICAgIH1cbiAgfVxuXG4gIC8vIHNwYXduIHRoZSBzdWJwcm9jZXNzIGFuZCByZXR1cm4gY29udHJvbCB3aGVuZXZlciB3ZSBkZWVtIHRoYXQgaXQgaGFzIGZ1bGx5XG4gIC8vIFwic3RhcnRlZFwiXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge1N0YXJ0RGV0ZWN0b3J8bnVtYmVyP30gc3RhcnREZXRlY3RvclxuICAgKiBAcGFyYW0ge251bWJlcj99IHRpbWVvdXRNc1xuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGRldGFjaFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIHN0YXJ0IChzdGFydERldGVjdG9yID0gbnVsbCwgdGltZW91dE1zID0gbnVsbCwgZGV0YWNoID0gZmFsc2UpIHtcbiAgICBsZXQgc3RhcnREZWxheSA9IDEwO1xuXG4gICAgY29uc3QgZ2VuZXJpY1N0YXJ0RGV0ZWN0b3IgPSAvKiogQHR5cGUge1N0YXJ0RGV0ZWN0b3J9ICovKGZ1bmN0aW9uIGdlbmVyaWNTdGFydERldGVjdG9yIChzdGRvdXQsIHN0ZGVycikge1xuICAgICAgcmV0dXJuIHN0ZG91dCB8fCBzdGRlcnI7XG4gICAgfSk7XG5cbiAgICAvLyB0aGUgZGVmYXVsdCBzdGFydCBkZXRlY3RvciBzaW1wbHkgcmV0dXJucyB0cnVlIHdoZW4gd2UgZ2V0IGFueSBvdXRwdXRcbiAgICBpZiAoc3RhcnREZXRlY3RvciA9PT0gbnVsbCkge1xuICAgICAgc3RhcnREZXRlY3RvciA9IGdlbmVyaWNTdGFydERldGVjdG9yO1xuICAgIH1cblxuICAgIC8vIGlmIHRoZSB1c2VyIHBhc3NlcyBhIG51bWJlciwgdGhlbiB3ZSBzaW1wbHkgZGVsYXkgYSBjZXJ0YWluIGFtb3VudCBvZlxuICAgIC8vIHRpbWUgYmVmb3JlIHJldHVybmluZyBjb250cm9sLCByYXRoZXIgdGhhbiB3YWl0aW5nIGZvciBhIGNvbmRpdGlvblxuICAgIGlmIChfLmlzTnVtYmVyKHN0YXJ0RGV0ZWN0b3IpKSB7XG4gICAgICBzdGFydERlbGF5ID0gc3RhcnREZXRlY3RvcjtcbiAgICAgIHN0YXJ0RGV0ZWN0b3IgPSBudWxsO1xuICAgIH1cblxuICAgIC8vIGlmIHRoZSB1c2VyIHBhc3NlcyBpbiBhIGJvb2xlYW4gYXMgb25lIG9mIHRoZSBhcmd1bWVudHMsIHVzZSBpdCBmb3IgYGRldGFjaGBcbiAgICBpZiAoXy5pc0Jvb2xlYW4oc3RhcnREZXRlY3RvcikgJiYgc3RhcnREZXRlY3Rvcikge1xuICAgICAgaWYgKCF0aGlzLm9wdHMuZGV0YWNoZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gZGV0YWNoIHByb2Nlc3MgdGhhdCBpcyBub3Qgc3RhcnRlZCB3aXRoICdkZXRhY2hlZCcgb3B0aW9uYCk7XG4gICAgICB9XG4gICAgICBkZXRhY2ggPSB0cnVlO1xuICAgICAgc3RhcnREZXRlY3RvciA9IGdlbmVyaWNTdGFydERldGVjdG9yO1xuICAgIH0gZWxzZSBpZiAoXy5pc0Jvb2xlYW4odGltZW91dE1zKSAmJiB0aW1lb3V0TXMpIHtcbiAgICAgIGlmICghdGhpcy5vcHRzLmRldGFjaGVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIGRldGFjaCBwcm9jZXNzIHRoYXQgaXMgbm90IHN0YXJ0ZWQgd2l0aCAnZGV0YWNoZWQnIG9wdGlvbmApO1xuICAgICAgfVxuICAgICAgZGV0YWNoID0gdHJ1ZTtcbiAgICAgIHRpbWVvdXRNcyA9IG51bGw7XG4gICAgfVxuXG4gICAgLy8gcmV0dXJuIGEgcHJvbWlzZSBzbyB3ZSBjYW4gd3JhcCB0aGUgYXN5bmMgYmVoYXZpb3JcbiAgICByZXR1cm4gYXdhaXQgbmV3IEIoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgLy8gYWN0dWFsbHkgc3Bhd24gdGhlIHN1YnByb2NcbiAgICAgIHRoaXMucHJvYyA9IHNwYXduKHRoaXMuY21kLCB0aGlzLmFyZ3MsIHRoaXMub3B0cyk7XG5cbiAgICAgIGlmICh0aGlzLnByb2Muc3Rkb3V0KSB7XG4gICAgICAgIHRoaXMucHJvYy5zdGRvdXQuc2V0RW5jb2RpbmcodGhpcy5vcHRzLmVuY29kaW5nIHx8ICd1dGY4Jyk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5wcm9jLnN0ZGVycikge1xuICAgICAgICB0aGlzLnByb2Muc3RkZXJyLnNldEVuY29kaW5nKHRoaXMub3B0cy5lbmNvZGluZyB8fCAndXRmOCcpO1xuICAgICAgfVxuICAgICAgdGhpcy5sYXN0TGluZVBvcnRpb24gPSB7c3Rkb3V0OiAnJywgc3RkZXJyOiAnJ307XG5cbiAgICAgIC8vIHRoaXMgZnVuY3Rpb24gaGFuZGxlcyBvdXRwdXQgdGhhdCB3ZSBjb2xsZWN0IGZyb20gdGhlIHN1YnByb2NcbiAgICAgIC8qKlxuICAgICAgICpcbiAgICAgICAqIEBwYXJhbSB7IHtzdGRvdXQ6IHN0cmluZywgc3RkZXJyOiBzdHJpbmd9IH0gc3RyZWFtc1xuICAgICAgICovXG4gICAgICBjb25zdCBoYW5kbGVPdXRwdXQgPSAoc3RyZWFtcykgPT4ge1xuICAgICAgICBjb25zdCB7c3Rkb3V0LCBzdGRlcnJ9ID0gc3RyZWFtcztcbiAgICAgICAgLy8gaWYgd2UgaGF2ZSBhIHN0YXJ0RGV0ZWN0b3IsIHJ1biBpdCBvbiB0aGUgb3V0cHV0IHNvIHdlIGNhbiByZXNvbHZlL1xuICAgICAgICAvLyByZWplY3QgYW5kIG1vdmUgb24gZnJvbSBzdGFydFxuICAgICAgICB0cnkge1xuICAgICAgICAgIGlmIChfLmlzRnVuY3Rpb24oc3RhcnREZXRlY3RvcikgJiYgc3RhcnREZXRlY3RvcihzdGRvdXQsIHN0ZGVycikpIHtcbiAgICAgICAgICAgIHN0YXJ0RGV0ZWN0b3IgPSBudWxsO1xuICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGVtaXQgdGhlIGFjdHVhbCBvdXRwdXQgZm9yIHdob21ldmVyJ3MgbGlzdGVuaW5nXG4gICAgICAgIHRoaXMuZW1pdCgnb3V0cHV0Jywgc3Rkb3V0LCBzdGRlcnIpO1xuXG4gICAgICAgIC8vIHdlIGFsc28gd2FudCB0byBlbWl0IGxpbmVzLCBidXQgaXQncyBtb3JlIGNvbXBsZXggc2luY2Ugb3V0cHV0XG4gICAgICAgIC8vIGNvbWVzIGluIGNodW5rcyBhbmQgYSBsaW5lIGNvdWxkIGNvbWUgaW4gdHdvIGRpZmZlcmVudCBjaHVua3MsIHNvXG4gICAgICAgIC8vIHdlIGhhdmUgbG9naWMgdG8gaGFuZGxlIHRoYXQgY2FzZSAodXNpbmcgdGhpcy5sYXN0TGluZVBvcnRpb24gdG9cbiAgICAgICAgLy8gcmVtZW1iZXIgYSBsaW5lIHRoYXQgc3RhcnRlZCBidXQgZGlkIG5vdCBmaW5pc2ggaW4gdGhlIGxhc3QgY2h1bmspXG4gICAgICAgIGZvciAoY29uc3QgW3N0cmVhbU5hbWUsIHN0cmVhbURhdGFdIG9mIC8qKiBAdHlwZSB7W1snc3Rkb3V0Jywgc3RyaW5nXSwgWydzdGRlcnInLCBzdHJpbmddXX0gKi8oXy50b1BhaXJzKHN0cmVhbXMpKSkge1xuICAgICAgICAgIGlmICghc3RyZWFtRGF0YSkgY29udGludWU7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgY3VybHlcbiAgICAgICAgICBjb25zdCBsaW5lcyA9IHN0cmVhbURhdGEuc3BsaXQoJ1xcbicpXG4gICAgICAgICAgICAvLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD0yODY5XG4gICAgICAgICAgICAubWFwKCh4KSA9PiBgICR7eH1gLnN1YnN0cigxKSk7XG4gICAgICAgICAgaWYgKGxpbmVzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgIGxpbmVzWzBdID0gdGhpcy5sYXN0TGluZVBvcnRpb25bc3RyZWFtTmFtZV0gKyBsaW5lc1swXTtcbiAgICAgICAgICAgIHRoaXMubGFzdExpbmVQb3J0aW9uW3N0cmVhbU5hbWVdID0gY3V0U3VmZml4KF8ubGFzdChsaW5lcyksIE1BWF9MSU5FX1BPUlRJT05fTEVOR1RIKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdExpbmVzID0gbGluZXMuc2xpY2UoMCwgLTEpO1xuICAgICAgICAgICAgdGhpcy5lbWl0KGBsaW5lcy0ke3N0cmVhbU5hbWV9YCwgcmVzdWx0TGluZXMpO1xuICAgICAgICAgICAgdGhpcy5lbWl0TGluZXMoc3RyZWFtTmFtZSwgcmVzdWx0TGluZXMpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50UG9ydGlvbiA9IGN1dFN1ZmZpeChsaW5lc1swXSwgTUFYX0xJTkVfUE9SVElPTl9MRU5HVEgpO1xuICAgICAgICAgICAgaWYgKHRoaXMubGFzdExpbmVQb3J0aW9uW3N0cmVhbU5hbWVdLmxlbmd0aCArIGN1cnJlbnRQb3J0aW9uLmxlbmd0aCA+IE1BWF9MSU5FX1BPUlRJT05fTEVOR1RIKSB7XG4gICAgICAgICAgICAgIHRoaXMubGFzdExpbmVQb3J0aW9uW3N0cmVhbU5hbWVdID0gY3VycmVudFBvcnRpb247XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLmxhc3RMaW5lUG9ydGlvbltzdHJlYW1OYW1lXSArPSBjdXJyZW50UG9ydGlvbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIC8vIGlmIHdlIGdldCBhbiBlcnJvciBzcGF3bmluZyB0aGUgcHJvYywgcmVqZWN0IGFuZCBjbGVhbiB1cCB0aGUgcHJvY1xuICAgICAgdGhpcy5wcm9jLm9uKCdlcnJvcicsIC8qKiBAcGFyYW0ge05vZGVKUy5FcnJub0V4Y2VwdGlvbn0gZXJyICovIChlcnIpID0+IHtcbiAgICAgICAgdGhpcy5wcm9jPy5yZW1vdmVBbGxMaXN0ZW5lcnMoJ2V4aXQnKTtcbiAgICAgICAgdGhpcy5wcm9jPy5raWxsKCdTSUdJTlQnKTtcblxuICAgICAgICBpZiAoZXJyLmNvZGUgPT09ICdFTk9FTlQnKSB7XG4gICAgICAgICAgZXJyID0gZm9ybWF0RW5vZW50KGVyciwgdGhpcy5jbWQsIHRoaXMub3B0cz8uY3dkKTtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoZXJyKTtcblxuICAgICAgICB0aGlzLnByb2M/LnVucmVmKCk7XG4gICAgICAgIHRoaXMucHJvYyA9IG51bGw7XG4gICAgICB9KTtcblxuICAgICAgaWYgKHRoaXMucHJvYy5zdGRvdXQpIHtcbiAgICAgICAgdGhpcy5wcm9jLnN0ZG91dC5vbignZGF0YScsIChjaHVuaykgPT4gaGFuZGxlT3V0cHV0KHtzdGRvdXQ6IGNodW5rLnRvU3RyaW5nKCksIHN0ZGVycjogJyd9KSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLnByb2Muc3RkZXJyKSB7XG4gICAgICAgIHRoaXMucHJvYy5zdGRlcnIub24oJ2RhdGEnLCAoY2h1bmspID0+IGhhbmRsZU91dHB1dCh7c3Rkb3V0OiAnJywgc3RkZXJyOiBjaHVuay50b1N0cmluZygpfSkpO1xuICAgICAgfVxuXG4gICAgICAvLyB3aGVuIHRoZSBwcm9jIGV4aXRzLCB3ZSBtaWdodCBzdGlsbCBoYXZlIGEgYnVmZmVyIG9mIGxpbmVzIHdlIHdlcmVcbiAgICAgIC8vIHdhaXRpbmcgb24gbW9yZSBjaHVua3MgdG8gY29tcGxldGUuIEdvIGFoZWFkIGFuZCBlbWl0IHRob3NlLCB0aGVuXG4gICAgICAvLyByZS1lbWl0IHRoZSBleGl0IHNvIGEgbGlzdGVuZXIgY2FuIGhhbmRsZSB0aGUgcG9zc2libHktdW5leHBlY3RlZCBleGl0XG4gICAgICB0aGlzLnByb2Mub24oJ2V4aXQnLCAoY29kZSwgc2lnbmFsKSA9PiB7XG4gICAgICAgIHRoaXMuaGFuZGxlTGFzdExpbmVzKCk7XG5cbiAgICAgICAgdGhpcy5lbWl0KCdleGl0JywgY29kZSwgc2lnbmFsKTtcblxuICAgICAgICAvLyBpbiBhZGRpdGlvbiB0byB0aGUgYmFyZSBleGl0IGV2ZW50LCBhbHNvIGVtaXQgb25lIG9mIHRocmVlIG90aGVyXG4gICAgICAgIC8vIGV2ZW50cyB0aGF0IGNvbnRhaW4gbW9yZSBoZWxwZnVsIGluZm9ybWF0aW9uOlxuICAgICAgICAvLyAnc3RvcCc6IHdlIHN0b3BwZWQgdGhpc1xuICAgICAgICAvLyAnZGllJzogdGhlIHByb2Nlc3MgZW5kZWQgb3V0IG9mIG91ciBjb250cm9sIHdpdGggYSBub24temVybyBleGl0XG4gICAgICAgIC8vICdlbmQnOiB0aGUgcHJvY2VzcyBlbmRlZCBvdXQgb2Ygb3VyIGNvbnRyb2wgd2l0aCBhIHplcm8gZXhpdFxuICAgICAgICBsZXQgZXZlbnQgPSB0aGlzLmV4cGVjdGluZ0V4aXQgPyAnc3RvcCcgOiAnZGllJztcbiAgICAgICAgaWYgKCF0aGlzLmV4cGVjdGluZ0V4aXQgJiYgY29kZSA9PT0gMCkge1xuICAgICAgICAgIGV2ZW50ID0gJ2VuZCc7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5lbWl0KGV2ZW50LCBjb2RlLCBzaWduYWwpO1xuXG4gICAgICAgIC8vIGZpbmFsbHkgY2xlYW4gdXAgdGhlIHByb2MgYW5kIG1ha2Ugc3VyZSB0byByZXNldCBvdXIgZXhpdFxuICAgICAgICAvLyBleHBlY3RhdGlvbnNcbiAgICAgICAgdGhpcy5wcm9jID0gbnVsbDtcbiAgICAgICAgdGhpcy5leHBlY3RpbmdFeGl0ID0gZmFsc2U7XG4gICAgICB9KTtcblxuICAgICAgLy8gaWYgdGhlIHVzZXIgaGFzbid0IGdpdmVuIHVzIGEgc3RhcnREZXRlY3RvciwgaW5zdGVhZCBqdXN0IHJlc29sdmVcbiAgICAgIC8vIHdoZW4gc3RhcnREZWxheSBtcyBoYXZlIHBhc3NlZFxuICAgICAgaWYgKCFzdGFydERldGVjdG9yKSB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4geyByZXNvbHZlKCk7IH0sIHN0YXJ0RGVsYXkpO1xuICAgICAgfVxuXG4gICAgICAvLyBpZiB0aGUgdXNlciBoYXMgZ2l2ZW4gdXMgYSB0aW1lb3V0LCBzdGFydCB0aGUgY2xvY2sgZm9yIHJlamVjdGluZ1xuICAgICAgLy8gdGhlIHByb21pc2UgaWYgd2UgdGFrZSB0b28gbG9uZyB0byBzdGFydFxuICAgICAgaWYgKF8uaXNOdW1iZXIodGltZW91dE1zKSkge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICByZWplY3QobmV3IEVycm9yKGBUaGUgcHJvY2VzcyBkaWQgbm90IHN0YXJ0IHdpdGhpbiAke3RpbWVvdXRNc31tcyBgICtcbiAgICAgICAgICAgIGAoY21kOiAnJHt0aGlzLnJlcH0nKWApKTtcbiAgICAgICAgfSwgdGltZW91dE1zKTtcbiAgICAgIH1cbiAgICB9KS5maW5hbGx5KCgpID0+IHtcbiAgICAgIGlmIChkZXRhY2ggJiYgdGhpcy5wcm9jKSB7XG4gICAgICAgIHRoaXMucHJvYy51bnJlZigpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgaGFuZGxlTGFzdExpbmVzICgpIHtcbiAgICBmb3IgKGxldCBzdHJlYW0gb2YgWydzdGRvdXQnLCAnc3RkZXJyJ10pIHtcbiAgICAgIGlmICh0aGlzLmxhc3RMaW5lUG9ydGlvbltzdHJlYW1dKSB7XG4gICAgICAgIGNvbnN0IGxhc3RMaW5lcyA9IFt0aGlzLmxhc3RMaW5lUG9ydGlvbltzdHJlYW1dXTtcbiAgICAgICAgdGhpcy5lbWl0KGBsaW5lcy0ke3N0cmVhbX1gLCBsYXN0TGluZXMpO1xuICAgICAgICB0aGlzLmVtaXRMaW5lcyhzdHJlYW0sIGxhc3RMaW5lcyk7XG4gICAgICAgIHRoaXMubGFzdExpbmVQb3J0aW9uW3N0cmVhbV0gPSAnJztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtOb2RlSlMuU2lnbmFsc30gc2lnbmFsXG4gICAqIEBwYXJhbSB7bnVtYmVyfSB0aW1lb3V0XG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgc3RvcCAoc2lnbmFsID0gJ1NJR1RFUk0nLCB0aW1lb3V0ID0gMTAwMDApIHtcbiAgICBpZiAoIXRoaXMuaXNSdW5uaW5nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbid0IHN0b3AgcHJvY2VzczsgaXQncyBub3QgY3VycmVudGx5IHJ1bm5pbmcgKGNtZDogJyR7dGhpcy5yZXB9JylgKTtcbiAgICB9XG4gICAgLy8gbWFrZSBzdXJlIHRvIGVtaXQgYW55IGRhdGEgaW4gb3VyIGxpbmVzIGJ1ZmZlciB3aGVuZXZlciB3ZSdyZSBkb25lIHdpdGhcbiAgICAvLyB0aGUgcHJvY1xuICAgIHRoaXMuaGFuZGxlTGFzdExpbmVzKCk7XG4gICAgcmV0dXJuIGF3YWl0IG5ldyBCKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXMucHJvYz8ub24oJ2Nsb3NlJywgcmVzb2x2ZSk7XG4gICAgICB0aGlzLmV4cGVjdGluZ0V4aXQgPSB0cnVlO1xuICAgICAgdGhpcy5wcm9jPy5raWxsKHNpZ25hbCk7XG4gICAgICAvLyB0aGlzIHRpbWVvdXQgbmVlZHMgdW5yZWYoKSBvciBub2RlIHdpbGwgd2FpdCBmb3IgdGhlIHRpbWVvdXQgdG8gZmlyZSBiZWZvcmVcbiAgICAgIC8vIGV4aXRpbmcgdGhlIHByb2Nlc3MuXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgUHJvY2VzcyBkaWRuJ3QgZW5kIGFmdGVyICR7dGltZW91dH1tcyAoY21kOiAnJHt0aGlzLnJlcH0nKWApKTtcbiAgICAgIH0sIHRpbWVvdXQpLnVucmVmKCk7XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBqb2luIChhbGxvd2VkRXhpdENvZGVzID0gWzBdKSB7XG4gICAgaWYgKCF0aGlzLmlzUnVubmluZykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3Qgam9pbiBwcm9jZXNzOyBpdCBpcyBub3QgY3VycmVudGx5IHJ1bm5pbmcgKGNtZDogJyR7dGhpcy5yZXB9JylgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXdhaXQgbmV3IEIoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpcy5wcm9jPy5vbignZXhpdCcsIChjb2RlKSA9PiB7XG4gICAgICAgIGlmIChjb2RlICE9PSBudWxsICYmIGFsbG93ZWRFeGl0Q29kZXMuaW5kZXhPZihjb2RlKSA9PT0gLTEpIHtcbiAgICAgICAgICByZWplY3QobmV3IEVycm9yKGBQcm9jZXNzIGVuZGVkIHdpdGggZXhpdGNvZGUgJHtjb2RlfSAoY21kOiAnJHt0aGlzLnJlcH0nKWApKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXNvbHZlKGNvZGUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qXG4gICAqIFRoaXMgd2lsbCBvbmx5IHdvcmsgaWYgdGhlIHByb2Nlc3MgaXMgY3JlYXRlZCB3aXRoIHRoZSBgZGV0YWNoZWRgIG9wdGlvblxuICAgKi9cbiAgZGV0YWNoUHJvY2VzcyAoKSB7XG4gICAgaWYgKCF0aGlzLm9wdHMuZGV0YWNoZWQpIHtcbiAgICAgIC8vIHRoaXMgbWVhbnMgdGhhdCB0aGVyZSBpcyBhIG1pc2NvbmZpZ3VyYXRpb24gaW4gdGhlIGNhbGxpbmcgY29kZVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gZGV0YWNoIHByb2Nlc3MgdGhhdCBpcyBub3Qgc3RhcnRlZCB3aXRoICdkZXRhY2hlZCcgb3B0aW9uYCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnByb2MpIHtcbiAgICAgIHRoaXMucHJvYy51bnJlZigpO1xuICAgIH1cbiAgfVxuXG4gIGdldCBwaWQgKCkge1xuICAgIHJldHVybiB0aGlzLnByb2MgPyB0aGlzLnByb2MucGlkIDogbnVsbDtcbiAgfVxufVxuXG5leHBvcnQgeyBTdWJQcm9jZXNzIH07XG5leHBvcnQgZGVmYXVsdCBTdWJQcm9jZXNzO1xuXG4vKipcbiAqIEBjYWxsYmFjayBTdGFydERldGVjdG9yXG4gKiBAcGFyYW0ge3N0cmluZ30gc3Rkb3V0XG4gKiBAcGFyYW0ge3N0cmluZ30gW3N0ZGVycl1cbiAqIEByZXR1cm5zIHthbnl9XG4gKi9cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFFQTs7QUFDQTs7QUFFQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFKQSxNQUFNO0VBQUVBO0FBQUYsSUFBbUJDLGVBQXpCO0FBVUEsTUFBTUMsdUJBQXVCLEdBQUcsTUFBaEM7O0FBRUEsU0FBU0MsU0FBVCxDQUFvQkMsR0FBcEIsRUFBeUJDLFlBQXpCLEVBQXVDO0VBQ3JDLE9BQU9ELEdBQUcsQ0FBQ0UsTUFBSixHQUFhRCxZQUFiLEdBRUYsSUFBR0QsR0FBRyxDQUFDRyxNQUFKLENBQVdILEdBQUcsQ0FBQ0UsTUFBSixHQUFhRCxZQUF4QixDQUFzQyxFQUExQyxDQUE0Q0UsTUFBNUMsQ0FBbUQsQ0FBbkQsQ0FGRyxHQUdISCxHQUhKO0FBSUQ7O0FBR0QsTUFBTUksVUFBTixTQUF5QlIsWUFBekIsQ0FBc0M7RUFLcENTLGVBQWU7RUFHZkMsSUFBSTtFQUdKQyxJQUFJO0VBS0pDLEdBQUc7RUFLSEMsSUFBSTtFQUtKQyxhQUFhO0VBS2JDLEdBQUc7O0VBT0hDLFdBQVcsQ0FBRUosR0FBRixFQUFPRCxJQUFJLEdBQUcsRUFBZCxFQUFrQkUsSUFBSSxH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
package/lib/index.js DELETED
@@ -1,11 +0,0 @@
1
- // transpile:main
2
- import * as cp from 'child_process';
3
- import * as spIndex from './subprocess';
4
- import * as execIndex from './exec';
5
-
6
-
7
- const { spawn } = cp;
8
- const { SubProcess } = spIndex;
9
- const { exec } = execIndex;
10
-
11
- export { exec, spawn, SubProcess };