teen_process 1.14.3 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,8 +1,6 @@
1
1
  node-teen_process
2
2
  =================
3
3
 
4
- [![Greenkeeper badge](https://badges.greenkeeper.io/appium/node-teen_process.svg)](https://greenkeeper.io/)
5
-
6
4
  A grown-up version of Node's child_process. `exec` is really useful, but it
7
5
  suffers many limitations. This is an es7 (`async`/`await`) implementation of
8
6
  `exec` that uses `spawn` under the hood. It takes care of wrapping commands and
@@ -51,6 +49,8 @@ The `exec` function takes some options, with these defaults:
51
49
  isBuffer: false,
52
50
  shell: undefined,
53
51
  logger: undefined,
52
+ maxStdoutBufferSize: 100 * 1024 * 1024, // 100 MB
53
+ maxStderrBufferSize: 100 * 1024 * 1024, // 100 MB
54
54
  }
55
55
  ```
56
56
 
@@ -58,6 +58,9 @@ Most of these are self-explanatory. `ignoreOutput` is useful if you have a very
58
58
  chatty process whose output you don't care about and don't want to add it to
59
59
  the memory consumed by your program.
60
60
 
61
+ Both buffer size limits are needed to avoid memory overflow while collecting
62
+ process output. If the overall size of output chunks for different stream types exceeds the the given one then the oldest chunks will be pulled out in order to keep the memory load within the acceptable ranges.
63
+
61
64
  If you're on Windows, you'll want to pass `shell: true`, because `exec`
62
65
  actually uses `spawn` under the hood, and is therefore subject to the issues
63
66
  noted about Windows + `spawn` in [the Node
package/build/lib/exec.js CHANGED
@@ -5,8 +5,8 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
5
5
  Object.defineProperty(exports, "__esModule", {
6
6
  value: true
7
7
  });
8
- exports.exec = exec;
9
8
  exports.default = void 0;
9
+ exports.exec = exec;
10
10
 
11
11
  require("source-map-support/register");
12
12
 
@@ -18,6 +18,10 @@ var _bluebird = _interopRequireDefault(require("bluebird"));
18
18
 
19
19
  var _lodash = _interopRequireDefault(require("lodash"));
20
20
 
21
+ var _helpers = require("./helpers");
22
+
23
+ const MAX_BUFFER_SIZE = 100 * 1024 * 1024;
24
+
21
25
  async function exec(cmd, args = [], opts = {}) {
22
26
  const rep = (0, _shellQuote.quote)([cmd, ...args]);
23
27
  opts = Object.assign({
@@ -30,7 +34,9 @@ async function exec(cmd, args = [], opts = {}) {
30
34
  stdio: 'inherit',
31
35
  isBuffer: false,
32
36
  shell: undefined,
33
- logger: undefined
37
+ logger: undefined,
38
+ maxStdoutBufferSize: MAX_BUFFER_SIZE,
39
+ maxStderrBufferSize: MAX_BUFFER_SIZE
34
40
  }, opts);
35
41
  return await new _bluebird.default((resolve, reject) => {
36
42
  let proc = (0, _child_process.spawn)(cmd, args, {
@@ -42,13 +48,11 @@ async function exec(cmd, args = [], opts = {}) {
42
48
  stderrArr = [],
43
49
  timer = null;
44
50
  proc.on('error', err => {
45
- let msg = `Command '${rep}' errored out: ${err.stack}`;
46
-
47
51
  if (err.errno === 'ENOENT') {
48
- msg = `Command '${cmd}' not found. Is it installed?`;
52
+ err = (0, _helpers.formatEnoent)(err, cmd, opts.cwd);
49
53
  }
50
54
 
51
- reject(new Error(msg));
55
+ reject(err);
52
56
  });
53
57
 
54
58
  if (proc.stdin) {
@@ -57,37 +61,48 @@ async function exec(cmd, args = [], opts = {}) {
57
61
  });
58
62
  }
59
63
 
60
- if (proc.stdout) {
61
- proc.stdout.on('error', err => {
62
- reject(new Error(`Standard output '${err.syscall}' error: ${err.stack}`));
63
- });
64
+ const handleStream = (streamType, streamProps) => {
65
+ if (!proc[streamType]) {
66
+ return;
67
+ }
64
68
 
65
- if (!opts.ignoreOutput) {
66
- proc.stdout.on('data', data => {
67
- stdoutArr.push(data);
69
+ proc[streamType].on('error', err => {
70
+ reject(new Error(`${_lodash.default.capitalize(streamType)} '${err.syscall}' error: ${err.stack}`));
71
+ });
68
72
 
69
- if (opts.logger && _lodash.default.isFunction(opts.logger.debug)) {
70
- opts.logger.debug(data);
71
- }
72
- });
73
+ if (opts.ignoreOutput) {
74
+ proc[streamType].on('data', () => {});
75
+ return;
73
76
  }
74
- }
75
77
 
76
- if (proc.stderr) {
77
- proc.stderr.on('error', err => {
78
- reject(new Error(`Standard error '${err.syscall}' error: ${err.stack}`));
78
+ const {
79
+ chunks,
80
+ maxSize
81
+ } = streamProps;
82
+ let size = 0;
83
+ proc[streamType].on('data', chunk => {
84
+ chunks.push(chunk);
85
+ size += chunk.length;
86
+
87
+ while (chunks.length > 1 && size >= maxSize) {
88
+ size -= chunks[0].length;
89
+ chunks.shift();
90
+ }
91
+
92
+ if (opts.logger && _lodash.default.isFunction(opts.logger.debug)) {
93
+ opts.logger.debug(chunk.toString());
94
+ }
79
95
  });
96
+ };
80
97
 
81
- if (!opts.ignoreOutput) {
82
- proc.stderr.on('data', data => {
83
- stderrArr.push(data);
84
-
85
- if (opts.logger && _lodash.default.isFunction(opts.logger.error)) {
86
- opts.logger.error(data);
87
- }
88
- });
89
- }
90
- }
98
+ handleStream('stdout', {
99
+ maxSize: opts.maxStdoutBufferSize,
100
+ chunks: stdoutArr
101
+ });
102
+ handleStream('stderr', {
103
+ maxSize: opts.maxStderrBufferSize,
104
+ chunks: stderrArr
105
+ });
91
106
 
92
107
  function getStdio(isBuffer) {
93
108
  let stdout, stderr;
@@ -156,4 +171,4 @@ var _default = exec;
156
171
  exports.default = _default;require('source-map-support').install();
157
172
 
158
173
 
159
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9leGVjLmpzIl0sIm5hbWVzIjpbImV4ZWMiLCJjbWQiLCJhcmdzIiwib3B0cyIsInJlcCIsIk9iamVjdCIsImFzc2lnbiIsInRpbWVvdXQiLCJlbmNvZGluZyIsImtpbGxTaWduYWwiLCJjd2QiLCJ1bmRlZmluZWQiLCJlbnYiLCJwcm9jZXNzIiwiaWdub3JlT3V0cHV0Iiwic3RkaW8iLCJpc0J1ZmZlciIsInNoZWxsIiwibG9nZ2VyIiwiQiIsInJlc29sdmUiLCJyZWplY3QiLCJwcm9jIiwic3Rkb3V0QXJyIiwic3RkZXJyQXJyIiwidGltZXIiLCJvbiIsImVyciIsIm1zZyIsInN0YWNrIiwiZXJybm8iLCJFcnJvciIsInN0ZGluIiwic3lzY2FsbCIsInN0ZG91dCIsImRhdGEiLCJwdXNoIiwiXyIsImlzRnVuY3Rpb24iLCJkZWJ1ZyIsInN0ZGVyciIsImVycm9yIiwiZ2V0U3RkaW8iLCJCdWZmZXIiLCJjb25jYXQiLCJ0b1N0cmluZyIsImNvZGUiLCJjbGVhclRpbWVvdXQiLCJzZXRUaW1lb3V0Iiwia2lsbCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBRUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBR0EsZUFBZUEsSUFBZixDQUFxQkMsR0FBckIsRUFBMEJDLElBQUksR0FBRyxFQUFqQyxFQUFxQ0MsSUFBSSxHQUFHLEVBQTVDLEVBQWdEO0FBRTlDLFFBQU1DLEdBQUcsR0FBRyx1QkFBTSxDQUFDSCxHQUFELEVBQU0sR0FBR0MsSUFBVCxDQUFOLENBQVo7QUFJQUMsRUFBQUEsSUFBSSxHQUFHRSxNQUFNLENBQUNDLE1BQVAsQ0FBYztBQUNuQkMsSUFBQUEsT0FBTyxFQUFFLElBRFU7QUFFbkJDLElBQUFBLFFBQVEsRUFBRSxNQUZTO0FBR25CQyxJQUFBQSxVQUFVLEVBQUUsU0FITztBQUluQkMsSUFBQUEsR0FBRyxFQUFFQyxTQUpjO0FBS25CQyxJQUFBQSxHQUFHLEVBQUVDLE9BQU8sQ0FBQ0QsR0FMTTtBQU1uQkUsSUFBQUEsWUFBWSxFQUFF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QVNEO0FBQ0YsR0EzRlksQ0FBYjtBQTRGRDs7ZUFHY1AsSSIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIHByb21pc2UvcHJlZmVyLWF3YWl0LXRvLWNhbGxiYWNrcyAqL1xuXG5pbXBvcnQgeyBzcGF3biB9IGZyb20gJ2NoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IHsgcXVvdGUgfSBmcm9tICdzaGVsbC1xdW90ZSc7XG5pbXBvcnQgQiBmcm9tICdibHVlYmlyZCc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuXG5cbmFzeW5jIGZ1bmN0aW9uIGV4ZWMgKGNtZCwgYXJncyA9IFtdLCBvcHRzID0ge30pIHtcbiAgLy8gZ2V0IGEgcXVvdGVkIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBjb21tYW5kIGZvciBlcnJvciBzdHJpbmdzXG4gIGNvbnN0IHJlcCA9IHF1b3RlKFtjbWQsIC4uLmFyZ3NdKTtcblxuICAvLyBleHRlbmQgZGVmYXVsdCBvcHRpb25zOyB3ZSdyZSBiYXNpY2FsbHkgcmUtaW1wbGVtZW50aW5nIGV4ZWMncyBvcHRpb25zXG4gIC8vIGZvciB1c2UgaGVyZSB3aXRoIHNwYXduIHVuZGVyIHRoZSBob29kXG4gIG9wdHMgPSBPYmplY3QuYXNzaWduKHtcbiAgICB0aW1lb3V0OiBudWxsLFxuICAgIGVuY29kaW5nOiAndXRmOCcsXG4gICAga2lsbFNpZ25hbDogJ1NJR1RFUk0nLFxuICAgIGN3ZDogdW5kZWZpbmVkLFxuICAgIGVudjogcHJvY2Vzcy5lbnYsXG4gICAgaWdub3JlT3V0cHV0OiBmYWxzZSxcbiAgICBzdGRpbzogJ2luaGVyaXQnLFxuICAgIGlzQnVmZmVyOiBmYWxzZSxcbiAgICBzaGVsbDogdW5kZWZpbmVkLFxuICAgIGxvZ2dlcjogdW5kZWZpbmVkLFxuICB9LCBvcHRzKTtcblxuICAvLyB0aGlzIGlzIGFuIGFzeW5jIGZ1bmN0aW9uLCBzbyByZXR1cm4gYSBwcm9taXNlXG4gIHJldHVybiBhd2FpdCBuZXcgQigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgLy8gc3Bhd24gdGhlIGNoaWxkIHByb2Nlc3Mgd2l0aCBvcHRpb25zOyB3ZSBkb24ndCBjdXJyZW50bHkgZXhwb3NlIGFueSBvZlxuICAgIC8vIHRoZSBvdGhlciAnc3Bhd24nIG9wdGlvbnMgdGhyb3VnaCB0aGUgQVBJXG4gICAgbGV0IHByb2MgPSBzcGF3bihjbWQsIGFyZ3MsIHtjd2Q6IG9wdHMuY3dkLCBlbnY6IG9wdHMuZW52LCBzaGVsbDogb3B0cy5zaGVsbH0pO1xuICAgIGxldCBzdGRvdXRBcnIgPSBbXSwgc3RkZXJyQXJyID0gW10sIHRpbWVyID0gbnVsbDtcblxuICAgIC8vIGlmIHRoZSBwcm9jZXNzIGVycm9ycyBvdXQsIHJlamVjdCB0aGUgcHJvbWlzZVxuICAgIHByb2Mub24oJ2Vycm9yJywgKGVycikgPT4ge1xuICAgICAgbGV0IG1zZyA9IGBDb21tYW5kICcke3JlcH0nIGVycm9yZWQgb3V0OiAke2Vyci5zdGFja31gO1xuICAgICAgaWYgKGVyci5lcnJubyA9PT0gJ0VOT0VOVCcpIHtcbiAgICAgICAgbXNnID0gYENvbW1hbmQgJyR7Y21kfScgbm90IGZvdW5kLiBJcyBpdCBpbnN0YWxsZWQ/YDtcbiAgICAgIH1cbiAgICAgIHJlamVjdChuZXcgRXJyb3IobXNnKSk7XG4gICAgfSk7XG4gICAgaWYgKHByb2Muc3RkaW4pIHtcbiAgICAgIHByb2Muc3RkaW4ub24oJ2Vycm9yJywgKGVycikgPT4ge1xuICAgICAgICByZWplY3QobmV3IEVycm9yKGBTdGFuZGFyZCBpbnB1dCAnJHtlcnIuc3lzY2FsbH0nIGVycm9yOiAke2Vyci5zdGFja31gKSk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKHByb2Muc3Rkb3V0KSB7XG4gICAgICBwcm9jLnN0ZG91dC5vbignZXJyb3InLCAoZXJyKSA9PiB7XG4gICAgICAgIHJlamVjdChuZXcgRXJyb3IoYFN0YW5kYXJkIG91dHB1dCAnJHtlcnIuc3lzY2FsbH0nIGVycm9yOiAke2Vyci5zdGFja31gKSk7XG4gICAgICB9KTtcbiAgICAgIC8vIGtlZXAgdHJhY2sgb2Ygc3Rkb3V0IGlmIHdlIGhhdmUgbm90IHNhaWQgbm90IHRvXG4gICAgICBpZiAoIW9wdHMuaWdub3JlT3V0cHV0KSB7XG4gICAgICAgIHByb2Muc3Rkb3V0Lm9uKCdkYXRhJywgKGRhdGEpID0+IHtcbiAgICAgICAgICBzdGRvdXRBcnIucHVzaChkYXRhKTtcbiAgICAgICAgICBpZiAob3B0cy5sb2dnZXIgJiYgXy5pc0Z1bmN0aW9uKG9wdHMubG9nZ2VyLmRlYnVnKSkge1xuICAgICAgICAgICAgb3B0cy5sb2dnZXIuZGVidWcoZGF0YSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHByb2Muc3RkZXJyKSB7XG4gICAgICBwcm9jLnN0ZGVyci5vbignZXJyb3InLCAoZXJyKSA9PiB7XG4gICAgICAgIHJlamVjdChuZXcgRXJyb3IoYFN0YW5kYXJkIGVycm9yICcke2Vyci5zeXNjYWxsfScgZXJyb3I6ICR7ZXJyLnN0YWNrfWApKTtcbiAgICAgIH0pO1xuICAgICAgLy8ga2VlcCB0cmFjayBvZiBzdGRlcnIgaWYgd2UgaGF2ZSBub3Qgc2FpZCBub3QgdG9cbiAgICAgIGlmICghb3B0cy5pZ25vcmVPdXRwdXQpIHtcbiAgICAgICAgcHJvYy5zdGRlcnIub24oJ2RhdGEnLCAoZGF0YSkgPT4ge1xuICAgICAgICAgIHN0ZGVyckFyci5wdXNoKGRhdGEpO1xuICAgICAgICAgIGlmIChvcHRzLmxvZ2dlciAmJiBfLmlzRnVuY3Rpb24ob3B0cy5sb2dnZXIuZXJyb3IpKSB7XG4gICAgICAgICAgICBvcHRzLmxvZ2dlci5lcnJvcihkYXRhKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldFN0ZGlvIChpc0J1ZmZlcikge1xuICAgICAgbGV0IHN0ZG91dCwgc3RkZXJyO1xuICAgICAgaWYgKGlzQnVmZmVyKSB7XG4gICAgICAgIHN0ZG91dCA9IEJ1ZmZlci5jb25jYXQoc3Rkb3V0QXJyKTtcbiAgICAgICAgc3RkZXJyID0gQnVmZmVyLmNvbmNhdChzdGRlcnJBcnIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3Rkb3V0ID0gQnVmZmVyLmNvbmNhdChzdGRvdXRBcnIpLnRvU3RyaW5nKG9wdHMuZW5jb2RpbmcpO1xuICAgICAgICBzdGRlcnIgPSBCdWZmZXIuY29uY2F0KHN0ZGVyckFycikudG9TdHJpbmcob3B0cy5lbmNvZGluZyk7XG4gICAgICB9XG4gICAgICByZXR1cm4ge3N0ZG91dCwgc3RkZXJyfTtcbiAgICB9XG5cbiAgICAvLyBpZiB0aGUgcHJvY2VzcyBlbmRzLCBlaXRoZXIgcmVzb2x2ZSBvciByZWplY3QgdGhlIHByb21pc2UgYmFzZWQgb24gdGhlXG4gICAgLy8gZXhpdCBjb2RlIG9mIHRoZSBwcm9jZXNzLiBlaXRoZXIgd2F5LCBhdHRhY2ggc3Rkb3V0LCBzdGRlcnIsIGFuZCBjb2RlLlxuICAgIC8vIEFsc28gY2xlYW4gdXAgdGhlIHRpbWVyIGlmIGl0IGV4aXN0c1xuICAgIHByb2Mub24oJ2Nsb3NlJywgKGNvZGUpID0+IHtcbiAgICAgIGlmICh0aW1lcikge1xuICAgICAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgICAgfVxuICAgICAgbGV0IHtzdGRvdXQsIHN0ZGVycn0gPSBnZXRTdGRpbyhvcHRzLmlzQnVmZmVyKTtcbiAgICAgIGlmIChjb2RlID09PSAwKSB7XG4gICAgICAgIHJlc29sdmUoe3N0ZG91dCwgc3RkZXJyLCBjb2RlfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsZXQgZXJyID0gbmV3IEVycm9yKGBDb21tYW5kICcke3JlcH0nIGV4aXRlZCB3aXRoIGNvZGUgJHtjb2RlfWApO1xuICAgICAgICBlcnIgPSBPYmplY3QuYXNzaWduKGVyciwge3N0ZG91dCwgc3RkZXJyLCBjb2RlfSk7XG4gICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gaWYgd2Ugc2V0IGEgdGltZW91dCBvbiB0aGUgY2hpbGQgcHJvY2VzcywgY3V0IGludG8gdGhlIGV4ZWN1dGlvbiBhbmRcbiAgICAvLyByZWplY3QgaWYgdGhlIHRpbWVvdXQgaXMgcmVhY2hlZC4gQXR0YWNoIHRoZSBzdGRvdXQvc3RkZXJyIHdlIGN1cnJlbnRseVxuICAgIC8vIGhhdmUgaW4gY2FzZSBpdCdzIGhlbHBmdWwgaW4gZGVidWdnaW5nXG4gICAgaWYgKG9wdHMudGltZW91dCkge1xuICAgICAgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgbGV0IHtzdGRvdXQsIHN0ZGVycn0gPSBnZXRTdGRpbyhvcHRzLmlzQnVmZmVyKTtcbiAgICAgICAgbGV0IGVyciA9IG5ldyBFcnJvcihgQ29tbWFuZCAnJHtyZXB9JyB0aW1lZCBvdXQgYWZ0ZXIgJHtvcHRzLnRpbWVvdXR9bXNgKTtcbiAgICAgICAgZXJyID0gT2JqZWN0LmFzc2lnbihlcnIsIHtzdGRvdXQsIHN0ZGVyciwgY29kZTogbnVsbH0pO1xuICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgLy8gcmVqZWN0IGFuZCBUSEVOIGtpbGwgdG8gYXZvaWQgcmFjZSBjb25kaXRpb25zIHdpdGggdGhlIGhhbmRsZXJzXG4gICAgICAgIC8vIGFib3ZlXG4gICAgICAgIHByb2Mua2lsbChvcHRzLmtpbGxTaWduYWwpO1xuICAgICAgfSwgb3B0cy50aW1lb3V0KTtcbiAgICB9XG4gIH0pO1xufVxuXG5leHBvcnQgeyBleGVjIH07XG5leHBvcnQgZGVmYXVsdCBleGVjO1xuIl0sImZpbGUiOiJsaWIvZXhlYy5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLiJ9
174
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGliL2V4ZWMuanMiLCJuYW1lcyI6WyJNQVhfQlVGRkVSX1NJWkUiLCJleGVjIiwiY21kIiwiYXJncyIsIm9wdHMiLCJyZXAiLCJxdW90ZSIsIk9iamVjdCIsImFzc2lnbiIsInRpbWVvdXQiLCJlbmNvZGluZyIsImtpbGxTaWduYWwiLCJjd2QiLCJ1bmRlZmluZWQiLCJlbnYiLCJwcm9jZXNzIiwiaWdub3JlT3V0cHV0Iiwic3RkaW8iLCJpc0J1ZmZlciIsInNoZWxsIiwibG9nZ2VyIiwibWF4U3Rkb3V0QnVmZmVyU2l6ZSIsIm1heFN0ZGVyckJ1ZmZlclNpemUiLCJCIiwicmVzb2x2ZSIsInJlamVjdCIsInByb2MiLCJzcGF3biIsInN0ZG91dEFyciIsInN0ZGVyckFyciIsInRpbWVyIiwib24iLCJlcnIiLCJlcnJubyIsImZvcm1hdEVub2VudCIsInN0ZGluIiwiRXJyb3IiLCJzeXNjYWxsIiwic3RhY2siLCJoYW5kbGVTdHJlYW0iLCJzdHJlYW1UeXBlIiwic3RyZWFtUHJvcHMiLCJfIiwiY2FwaXRhbGl6ZSIsImNodW5rcyIsIm1heFNpemUiLCJzaXplIiwiY2h1bmsiLCJwdXNoIiwibGVuZ3RoIiwic2hpZnQiLCJpc0Z1bmN0aW9uIiwiZGVidWciLCJ0b1N0cmluZyIsImdldFN0ZGlvIiwic3Rkb3V0Iiwic3RkZXJyIiwiQnVmZmVyIiwiY29uY2F0IiwiY29kZSIsImNsZWFyVGltZW91dCIsInNldFRpbWVvdXQiLCJraWxsIl0sInNvdXJjZVJvb3QiOiIuLi8uLiIsInNvdXJjZXMiOlsibGliL2V4ZWMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbi8qIGVzbGludC1kaXNhYmxlIHByb21pc2UvcHJlZmVyLWF3YWl0LXRvLWNhbGxiYWNrcyAqL1xuXG5pbXBvcnQgeyBzcGF3biB9IGZyb20gJ2NoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IHsgcXVvdGUgfSBmcm9tICdzaGVsbC1xdW90ZSc7XG5pbXBvcnQgQiBmcm9tICdibHVlYmlyZCc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgZm9ybWF0RW5vZW50IH0gZnJvbSAnLi9oZWxwZXJzJztcblxuY29uc3QgTUFYX0JVRkZFUl9TSVpFID0gMTAwICogMTAyNCAqIDEwMjQ7XG5cbi8qKlxuICogU3Bhd25zIGEgcHJvY2Vzc1xuICogQHRlbXBsYXRlIHtUZWVuUHJvY2Vzc0V4ZWNPcHRpb25zfSBUXG4gKiBAcGFyYW0ge3N0cmluZ30gY21kIC0gUHJvZ3JhbSB0byBleGVjdXRlXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBbYXJnc10gLSBBcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgcHJvZ3JhbVxuICogQHBhcmFtIHtUfSBbb3B0c10gLSBPcHRpb25zXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxCdWZmZXJQcm9wPFQ+IGV4dGVuZHMgdHJ1ZSA/IFRlZW5Qcm9jZXNzRXhlY0J1ZmZlclJlc3VsdCA6IFRlZW5Qcm9jZXNzRXhlY1N0cmluZ1Jlc3VsdD59XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGV4ZWMgKGNtZCwgYXJncyA9IFtdLCBvcHRzID0gLyoqIEB0eXBlIHtUfSAqLyh7fSkpIHtcbiAgLy8gZ2V0IGEgcXVvdGVkIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBjb21tYW5kIGZvciBlcnJvciBzdHJpbmdzXG4gIGNvbnN0IHJlcCA9IHF1b3RlKFtjbWQsIC4uLmFyZ3NdKTtcblxuICAvLyBleHRlbmQgZGVmYXVsdCBvcHRpb25zOyB3ZSdyZSBiYXNpY2FsbHkgcmUtaW1wbGVtZW50aW5nIGV4ZWMncyBvcHRpb25zXG4gIC8vIGZvciB1c2UgaGVyZSB3aXRoIHNwYXduIHVuZGVyIHRoZSBob29kXG4gIG9wdHMgPSBPYmplY3QuYXNzaWduKHtcbiAgICB0aW1lb3V0OiBudWxsLFxuICAgIGVuY29kaW5nOiAndXRmOCcsXG4gICAga2lsbFNpZ25hbDogJ1NJR1RFUk0nLFxuICAgIGN3ZDogdW5kZWZpbmVkLFxuICAgIGVudjogcHJvY2Vzcy5lbnYsXG4gICAgaWdub3JlT3V0cHV0OiBmYWxzZSxcbiAgICBzdGRpbzogJ2luaGVyaXQnLFxuICAgIGlzQnVmZmVyOiBmYWxzZSxcbiAgICBzaGVsbDogdW5kZWZpbmVkLFxuICAgIGxvZ2dlcjogdW5kZWZpbmVkLFxuICAgIG1heFN0ZG91dEJ1ZmZlclNpemU6IE1BWF9CVUZGRVJfU0laRSxcbiAgICBtYXhTdGRlcnJCdWZmZXJTaXplOiBNQVhfQlVGRkVSX1NJWkUsXG4gIH0sIG9wdHMpO1xuXG4gIC8vIHRoaXMgaXMgYW4gYXN5bmMgZnVuY3Rpb24sIHNvIHJldHVybiBhIHByb21pc2VcbiAgcmV0dXJuIGF3YWl0IG5ldyBCKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAvLyBzcGF3biB0aGUgY2hpbGQgcHJvY2VzcyB3aXRoIG9wdGlvbnM7IHdlIGRvbid0IGN1cnJlbnRseSBleHBvc2UgYW55IG9mXG4gICAgLy8gdGhlIG90aGVyICdzcGF3bicgb3B0aW9ucyB0aHJvdWdoIHRoZSBBUElcbiAgICBsZXQgcHJvYyA9IHNwYXduKGNtZCwgYXJncywge2N3ZDogb3B0cy5jd2QsIGVudjogb3B0cy5lbnYsIHNoZWxsOiBvcHRzLnNoZWxsfSk7XG4gICAgbGV0IHN0ZG91dEFyciA9IFtdLCBzdGRlcnJBcnIgPSBbXSwgdGltZXIgPSBudWxsO1xuXG4gICAgLy8gaWYgdGhlIHByb2Nlc3MgZXJyb3JzIG91dCwgcmVqZWN0IHRoZSBwcm9taXNlXG4gICAgcHJvYy5vbignZXJyb3InLCAvKiogQHBhcmFtIHtOb2RlSlMuRXJybm9FeGNlcHRpb259IGVyciAqLyhlcnIpID0+IHtcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIGlmIChlcnIuZXJybm8gPT09ICdFTk9FTlQnKSB7XG4gICAgICAgIGVyciA9IGZvcm1hdEVub2VudChlcnIsIGNtZCwgb3B0cy5jd2QpO1xuICAgICAgfVxuICAgICAgcmVqZWN0KGVycik7XG4gICAgfSk7XG4gICAgaWYgKHByb2Muc3RkaW4pIHtcbiAgICAgIHByb2Muc3RkaW4ub24oJ2Vycm9yJywgLyoqIEBwYXJhbSB7Tm9kZUpTLkVycm5vRXhjZXB0aW9ufSBlcnIgKi8oZXJyKSA9PiB7XG4gICAgICAgIHJlamVjdChuZXcgRXJyb3IoYFN0YW5kYXJkIGlucHV0ICcke2Vyci5zeXNjYWxsfScgZXJyb3I6ICR7ZXJyLnN0YWNrfWApKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBjb25zdCBoYW5kbGVTdHJlYW0gPSAoc3RyZWFtVHlwZSwgc3RyZWFtUHJvcHMpID0+IHtcbiAgICAgIGlmICghcHJvY1tzdHJlYW1UeXBlXSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHByb2Nbc3RyZWFtVHlwZV0ub24oJ2Vycm9yJywgKGVycikgPT4ge1xuICAgICAgICByZWplY3QobmV3IEVycm9yKGAke18uY2FwaXRhbGl6ZShzdHJlYW1UeXBlKX0gJyR7ZXJyLnN5c2NhbGx9JyBlcnJvcjogJHtlcnIuc3RhY2t9YCkpO1xuICAgICAgfSk7XG5cbiAgICAgIGlmIChvcHRzLmlnbm9yZU91dHB1dCkge1xuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL25vZGUvaXNzdWVzLzQyMzZcbiAgICAgICAgcHJvY1tzdHJlYW1UeXBlXS5vbignZGF0YScsICgpID0+IHt9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBrZWVwIHRyYWNrIG9mIHRoZSBzdHJlYW0gaWYgd2UgZG9uJ3Qgd2FudCB0byBpZ25vcmUgaXRcbiAgICAgIGNvbnN0IHtjaHVua3MsIG1heFNpemV9ID0gc3RyZWFtUHJvcHM7XG4gICAgICBsZXQgc2l6ZSA9IDA7XG4gICAgICBwcm9jW3N0cmVhbVR5cGVdLm9uKCdkYXRhJywgKGNodW5rKSA9PiB7XG4gICAgICAgIGNodW5rcy5wdXNoKGNodW5rKTtcbiAgICAgICAgc2l6ZSArPSBjaHVuay5sZW5ndGg7XG4gICAgICAgIHdoaWxlIChjaHVua3MubGVuZ3RoID4gMSAmJiBzaXplID49IG1heFNpemUpIHtcbiAgICAgICAgICBzaXplIC09IGNodW5rc1swXS5sZW5ndGg7XG4gICAgICAgICAgY2h1bmtzLnNoaWZ0KCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdHMubG9nZ2VyICYmIF8uaXNGdW5jdGlvbihvcHRzLmxvZ2dlci5kZWJ1ZykpIHtcbiAgICAgICAgICBvcHRzLmxvZ2dlci5kZWJ1ZyhjaHVuay50b1N0cmluZygpKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfTtcbiAgICBoYW5kbGVTdHJlYW0oJ3N0ZG91dCcsIHtcbiAgICAgIG1heFNpemU6IG9wdHMubWF4U3Rkb3V0QnVmZmVyU2l6ZSxcbiAgICAgIGNodW5rczogc3Rkb3V0QXJyLFxuICAgIH0pO1xuICAgIGhhbmRsZVN0cmVhbSgnc3RkZXJyJywge1xuICAgICAgbWF4U2l6ZTogb3B0cy5tYXhTdGRlcnJCdWZmZXJTaXplLFxuICAgICAgY2h1bmtzOiBzdGRlcnJBcnIsXG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBAdGVtcGxhdGUge2Jvb2xlYW59IFVcbiAgICAgKiBAcGFyYW0ge1V9IGlzQnVmZmVyXG4gICAgICogQHJldHVybnMge1UgZXh0ZW5kcyB0cnVlID8ge3N0ZG91dDogQnVmZmVyLCBzdGRlcnI6IEJ1ZmZlcn0gOiB7c3Rkb3V0OiBzdHJpbmcsIHN0ZGVycjogc3RyaW5nfX1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXRTdGRpbyAoaXNCdWZmZXIpIHtcbiAgICAgIGxldCBzdGRvdXQsIHN0ZGVycjtcbiAgICAgIGlmIChpc0J1ZmZlcikge1xuICAgICAgICBzdGRvdXQgPSBCdWZmZXIuY29uY2F0KHN0ZG91dEFycik7XG4gICAgICAgIHN0ZGVyciA9IEJ1ZmZlci5jb25jYXQoc3RkZXJyQXJyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0ZG91dCA9IEJ1ZmZlci5jb25jYXQoc3Rkb3V0QXJyKS50b1N0cmluZyhvcHRzLmVuY29kaW5nKTtcbiAgICAgICAgc3RkZXJyID0gQnVmZmVyLmNvbmNhdChzdGRlcnJBcnIpLnRvU3RyaW5nKG9wdHMuZW5jb2RpbmcpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIC8qKiBAdHlwZSB7VSBleHRlbmRzIHRydWUgPyB7c3Rkb3V0OiBCdWZmZXIsIHN0ZGVycjogQnVmZmVyfSA6IHtzdGRvdXQ6IHN0cmluZywgc3RkZXJyOiBzdHJpbmd9fSAqLyh7c3Rkb3V0LCBzdGRlcnJ9KTtcbiAgICB9XG5cbiAgICAvLyBpZiB0aGUgcHJvY2VzcyBlbmRzLCBlaXRoZXIgcmVzb2x2ZSBvciByZWplY3QgdGhlIHByb21pc2UgYmFzZWQgb24gdGhlXG4gICAgLy8gZXhpdCBjb2RlIG9mIHRoZSBwcm9jZXNzLiBlaXRoZXIgd2F5LCBhdHRhY2ggc3Rkb3V0LCBzdGRlcnIsIGFuZCBjb2RlLlxuICAgIC8vIEFsc28gY2xlYW4gdXAgdGhlIHRpbWVyIGlmIGl0IGV4aXN0c1xuICAgIHByb2Mub24oJ2Nsb3NlJywgKGNvZGUpID0+IHtcbiAgICAgIGlmICh0aW1lcikge1xuICAgICAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgICAgfVxuICAgICAgbGV0IHtzdGRvdXQsIHN0ZGVycn0gPSBnZXRTdGRpbyhvcHRzLmlzQnVmZmVyKTtcbiAgICAgIGlmIChjb2RlID09PSAwKSB7XG4gICAgICAgIHJlc29sdmUoLyoqIEB0eXBlIHtCdWZmZXJQcm9wPFQ+IGV4dGVuZHMgdHJ1ZSA/IFRlZW5Qcm9jZXNzRXhlY0J1ZmZlclJlc3VsdCA6IFRlZW5Qcm9jZXNzRXhlY1N0cmluZ1Jlc3VsdH0gKi8oe3N0ZG91dCwgc3RkZXJyLCBjb2RlfSkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGV0IGVyciA9IG5ldyBFcnJvcihgQ29tbWFuZCAnJHtyZXB9JyBleGl0ZWQgd2l0aCBjb2RlICR7Y29kZX1gKTtcbiAgICAgICAgZXJyID0gT2JqZWN0LmFzc2lnbihlcnIsIHtzdGRvdXQsIHN0ZGVyciwgY29kZX0pO1xuICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIGlmIHdlIHNldCBhIHRpbWVvdXQgb24gdGhlIGNoaWxkIHByb2Nlc3MsIGN1dCBpbnRvIHRoZSBleGVjdXRpb24gYW5kXG4gICAgLy8gcmVqZWN0IGlmIHRoZSB0aW1lb3V0IGlzIHJlYWNoZWQuIEF0dGFjaCB0aGUgc3Rkb3V0L3N0ZGVyciB3ZSBjdXJyZW50bHlcbiAgICAvLyBoYXZlIGluIGNhc2UgaXQncyBoZWxwZnVsIGluIGRlYnVnZ2luZ1xuICAgIGlmIChvcHRzLnRpbWVvdXQpIHtcbiAgICAgIHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGxldCB7c3Rkb3V0LCBzdGRlcnJ9ID0gZ2V0U3RkaW8ob3B0cy5pc0J1ZmZlcik7XG4gICAgICAgIGxldCBlcnIgPSBuZXcgRXJyb3IoYENvbW1hbmQgJyR7cmVwfScgdGltZWQgb3V0IGFmdGVyICR7b3B0cy50aW1lb3V0fW1zYCk7XG4gICAgICAgIGVyciA9IE9iamVjdC5hc3NpZ24oZXJyLCB7c3Rkb3V0LCBzdGRlcnIsIGNvZGU6IG51bGx9KTtcbiAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgIC8vIHJlamVjdCBhbmQgVEhFTiBraWxsIHRvIGF2b2lkIHJhY2UgY29uZGl0aW9ucyB3aXRoIHRoZSBoYW5kbGVyc1xuICAgICAgICAvLyBhYm92ZVxuICAgICAgICBwcm9jLmtpbGwob3B0cy5raWxsU2lnbmFsKTtcbiAgICAgIH0sIG9wdHMudGltZW91dCk7XG4gICAgfVxuICB9KTtcbn1cblxuZXhwb3J0IHsgZXhlYyB9O1xuZXhwb3J0IGRlZmF1bHQgZXhlYztcblxuLyoqXG4gKiBPcHRpb25zIG9uIHRvcCBvZiBgU3Bhd25PcHRpb25zYCwgdW5pcXVlIHRvIGB0ZWVuX3Byb2Nlc3MuYFxuICogQHR5cGVkZWYge09iamVjdH0gVGVlblByb2Nlc3NQcm9wc1xuICogQHByb3BlcnR5IHtib29sZWFufSBbaWdub3JlT3V0cHV0XSAtIElnbm9yZSAmIGRpc2NhcmQgYWxsIG91dHB1dFxuICogQHByb3BlcnR5IHtib29sZWFufSBbaXNCdWZmZXJdIC0gUmV0dXJuIG91dHB1dCBhcyBhIEJ1ZmZlclxuICogQHByb3BlcnR5IHtUZWVuUHJvY2Vzc0xvZ2dlcn0gW2xvZ2dlcl0gLSBMb2dnZXIgdG8gdXNlIGZvciBkZWJ1Z2dpbmdcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbbWF4U3Rkb3V0QnVmZmVyU2l6ZV0gLSBNYXhpbXVtIHNpemUgb2YgYHN0ZG91dGAgYnVmZmVyXG4gKiBAcHJvcGVydHkge251bWJlcn0gW21heFN0ZGVyckJ1ZmZlclNpemVdIC0gTWF4aW11bSBzaXplIG9mIGBzdGRlcnJgIGJ1ZmZlclxuICogQHByb3BlcnR5IHtCdWZmZXJFbmNvZGluZ30gW2VuY29kaW5nPSd1dGY4J10gLSBFbmNvZGluZyB0byB1c2UgZm9yIG91dHB1dFxuICovXG5cbi8qKlxuICogQSBsb2dnZXIgb2JqZWN0IHVuZGVyc3Rvb2QgYnkge0BsaW5rIGV4ZWMgdGVlbl9wcm9jZXNzLmV4ZWN9LlxuICogQHR5cGVkZWYge09iamVjdH0gVGVlblByb2Nlc3NMb2dnZXJcbiAqIEBwcm9wZXJ0eSB7KC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkfSBkZWJ1Z1xuICovXG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIGV4ZWMgdGVlbl9wcm9jZXNzLmV4ZWN9LlxuICogQHR5cGVkZWYge2ltcG9ydCgnY2hpbGRfcHJvY2VzcycpLlNwYXduT3B0aW9ucyAmIFRlZW5Qcm9jZXNzUHJvcHN9IFRlZW5Qcm9jZXNzRXhlY09wdGlvbnNcbiAqL1xuXG4vKipcbiAqIFRoZSB2YWx1ZSB7QGxpbmsgZXhlYyB0ZWVuX3Byb2Nlc3MuZXhlY30gcmVzb2x2ZXMgdG8gd2hlbiBgaXNCdWZmZXJgIGlzIGBmYWxzZWBcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFRlZW5Qcm9jZXNzRXhlY1N0cmluZ1Jlc3VsdFxuICogQHByb3BlcnR5IHtzdHJpbmd9IHN0ZG91dCAtIFN0ZG91dFxuICogQHByb3BlcnR5IHtzdHJpbmd9IHN0ZGVyciAtIFN0ZGVyclxuICogQHByb3BlcnR5IHtudW1iZXI/fSBjb2RlIC0gRXhpdCBjb2RlXG4gKi9cblxuLyoqXG4gKiBUaGUgdmFsdWUge0BsaW5rIGV4ZWMgdGVlbl9wcm9jZXNzLmV4ZWN9IHJlc29sdmVzIHRvIHdoZW4gYGlzQnVmZmVyYCBpcyBgdHJ1ZWBcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFRlZW5Qcm9jZXNzRXhlY0J1ZmZlclJlc3VsdFxuICogQHByb3BlcnR5IHtCdWZmZXJ9IHN0ZG91dCAtIFN0ZG91dFxuICogQHByb3BlcnR5IHtCdWZmZXJ9IHN0ZGVyciAtIFN0ZGVyclxuICogQHByb3BlcnR5IHtudW1iZXI/fSBjb2RlIC0gRXhpdCBjb2RlXG4gKi9cblxuLyoqXG4gKiBFeHRyYSBwcm9wcyB7QGxpbmsgZXhlYyB0ZWVuX3Byb2Nlc3MuZXhlY30gYWRkcyB0byBpdHMgZXJyb3Igb2JqZWN0c1xuICogQHR5cGVkZWYge09iamVjdH0gVGVlblByb2Nlc3NFeGVjRXJyb3JQcm9wc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IHN0ZG91dCAtIFNURE9VVFxuICogQHByb3BlcnR5IHtzdHJpbmd9IHN0ZGVyciAtIFNUREVSUlxuICogQHByb3BlcnR5IHtudW1iZXI/fSBjb2RlIC0gRXhpdCBjb2RlXG4gKi9cblxuLyoqXG4gKiBFcnJvciB0aHJvd24gYnkge0BsaW5rIGV4ZWMgdGVlbl9wcm9jZXNzLmV4ZWN9XG4gKiBAdHlwZWRlZiB7RXJyb3IgJiBUZWVuUHJvY2Vzc0V4ZWNFcnJvclByb3BzfSBUZWVuUHJvY2Vzc0V4ZWNFcnJvclxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHt7aXNCdWZmZXI/OiBib29sZWFufX0gTWF5YmVCdWZmZXJcbiAqIEB0eXBlZGVmIHtNYXliZUJ1ZmZlclsnaXNCdWZmZXInXX0gQnVmZmVyUHJvcFxuICogQHByaXZhdGVcbiAqL1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFJQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQSxNQUFNQSxlQUFlLEdBQUcsTUFBTSxJQUFOLEdBQWEsSUFB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
@@ -0,0 +1,35 @@
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.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
+ }require('source-map-support').install();
33
+
34
+
35
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGliL2hlbHBlcnMuanMiLCJuYW1lcyI6WyJmb3JtYXRFbm9lbnQiLCJlcnJvciIsImNtZCIsImN3ZCIsIndoaWNoIiwic3luYyIsImZzIiwiYWNjZXNzU3luYyIsIlJfT0siLCJpZ24iLCJtZXNzYWdlIl0sInNvdXJjZVJvb3QiOiIuLi8uLiIsInNvdXJjZXMiOlsibGliL2hlbHBlcnMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHdoaWNoIGZyb20gJ3doaWNoJztcbmltcG9ydCBmcyBmcm9tICdmcyc7XG5cbi8qKlxuICogRGVjb3JhdGVzIEVOT0VOVCBlcnJvciByZWNlaXZlZCBmcm9tIGEgc3Bhd24gc3lzdGVtIGNhbGxcbiAqIHdpdGggYSBtb3JlIGRlc2NyaXB0aXZlIG1lc3NhZ2UsIHNvIGl0IGNvdWxkIGJlIHByb3Blcmx5IGhhbmRsZWQgYnkgYSB1c2VyLlxuICpcbiAqIEBwYXJhbSB7Tm9kZUpTLkVycm5vRXhjZXB0aW9ufSBlcnJvciBPcmlnaW5hbCBlcnJvciBpbnN0YW5jZS4gISEhIFRoZSBpbnN0YW5jZSBpcyBtdXRhdGVkIGFmdGVyXG4gKiB0aGlzIGhlbHBlciBmdW5jdGlvbiBpbnZvY2F0aW9uXG4gKiBAcGFyYW0ge3N0cmluZ30gY21kIE9yaWdpbmFsIGNvbW1hbmQgdG8gZXhlY3V0ZVxuICogQHBhcmFtIHtzdHJpbmd8VVJMP30gW2N3ZF0gT3B0aW9uYWwgcGF0aCB0byB0aGUgY3VycmVudCB3b3JraW5nIGRpclxuICogQHJldHVybnMge05vZGVKUy5FcnJub0V4Y2VwdGlvbn0gTXV0YXRlZCBlcnJvciBpbnN0YW5jZSB3aXRoIGFuIGltcHJvdmVkIGRlc2NyaXB0aW9uIG9yIGFuXG4gKiB1bmNoYW5nZWQgZXJyb3IgaW5zdGFuY2VcbiAqL1xuZnVuY3Rpb24gZm9ybWF0RW5vZW50IChlcnJvciwgY21kLCBjd2QgPSBudWxsKSB7XG4gIHRyeSB7XG4gICAgd2hpY2guc3luYyhjbWQpO1xuICAgIGlmIChjd2QpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGZzLmFjY2Vzc1N5bmMoY3dkLCBmcy5SX09LKTtcbiAgICAgIH0gY2F0Y2ggKGlnbikge1xuICAgICAgICBlcnJvci5tZXNzYWdlID0gYFRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5ICcke2N3ZH0nIGZvciAnJHtjbWR9JyBjb21tYW5kIGAgK1xuICAgICAgICAgIGBlaXRoZXIgZG9lcyBub3QgZXhpc3Qgb3IgaXMgbm90IGFjY2Vzc2libGVgO1xuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCAoaWduKSB7XG4gICAgZXJyb3IubWVzc2FnZSA9IGBDb21tYW5kICcke2NtZH0nIG5vdCBmb3VuZC4gSXMgaXQgaW5zdGFsbGVkP2A7XG4gIH1cbiAgcmV0dXJuIGVycm9yO1xufVxuXG5leHBvcnQgeyBmb3JtYXRFbm9lbnQgfTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFhQSxTQUFTQSxZQUFULENBQXVCQyxLQUF2QixFQUE4QkMsR0FBOUIsRUFBbUNDLEdBQUcsR0FBRyxJQUF6QyxFQUErQztFQUM3QyxJQUFJO0lBQ0ZDLGNBQUEsQ0FBTUMsSUFBTixDQUFXSCxHQUFYOztJQUNBLElBQUlDLEdBQUosRUFBUztNQUNQLElBQUk7UUFDRkcsV0FBQSxDQUFHQyxVQUFILENBQWNKLEdBQWQsRUFBbUJHLFdBQUEsQ0FBR0UsSUFBdEI7TUFDRCxDQUZELENBRUUsT0FBT0MsR0FBUCxFQUFZO1FBQ1pSLEtBQUssQ0FBQ1MsT0FBTixHQUFpQixrQ0FBaUNQLEdBQUksVUFBU0QsR0FBSSxZQUFuRCxHQUNiLDRDQURIO01BRUQ7SUFDRjtFQUNGLENBVkQsQ0FVRSxPQUFPTyxHQUFQLEVBQVk7SUFDWlIsS0FBSyxDQUFDUyxPQUFOLEdBQWlCLFlBQVdSLEdBQUksK0JBQWhDO0VBQ0Q7O0VBQ0QsT0FBT0QsS0FBUDtBQUNEIn0=
@@ -0,0 +1,34 @@
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;require('source-map-support').install();
32
+
33
+
34
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGliL2luZGV4LmpzIiwibmFtZXMiOlsic3Bhd24iLCJjcCIsIlN1YlByb2Nlc3MiLCJzcEluZGV4IiwiZXhlYyIsImV4ZWNJbmRleCJdLCJzb3VyY2VSb290IjoiLi4vLi4iLCJzb3VyY2VzIjpbImxpYi9pbmRleC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyB0cmFuc3BpbGU6bWFpblxuaW1wb3J0ICogYXMgY3AgZnJvbSAnY2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgKiBhcyBzcEluZGV4IGZyb20gJy4vc3VicHJvY2Vzcyc7XG5pbXBvcnQgKiBhcyBleGVjSW5kZXggZnJvbSAnLi9leGVjJztcblxuXG5jb25zdCB7IHNwYXduIH0gPSBjcDtcbmNvbnN0IHsgU3ViUHJvY2VzcyB9ID0gc3BJbmRleDtcbmNvbnN0IHsgZXhlYyB9ID0gZXhlY0luZGV4O1xuXG5leHBvcnQgeyBleGVjLCBzcGF3biwgU3ViUHJvY2VzcyB9O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFDQTs7QUFDQTs7QUFDQTs7Ozs7O0FBR0EsTUFBTTtFQUFFQTtBQUFGLElBQVlDLEVBQWxCOztBQUNBLE1BQU07RUFBRUM7QUFBRixJQUFpQkMsT0FBdkI7O0FBQ0EsTUFBTTtFQUFFQztBQUFGLElBQVdDLFNBQWpCIn0=
@@ -13,14 +13,14 @@ var _child_process = require("child_process");
13
13
 
14
14
  var _events = _interopRequireDefault(require("events"));
15
15
 
16
- var _through = _interopRequireDefault(require("through"));
17
-
18
16
  var _bluebird = _interopRequireDefault(require("bluebird"));
19
17
 
20
18
  var _shellQuote = require("shell-quote");
21
19
 
22
20
  var _lodash = _interopRequireDefault(require("lodash"));
23
21
 
22
+ var _helpers = require("./helpers");
23
+
24
24
  const {
25
25
  EventEmitter
26
26
  } = _events.default;
@@ -102,9 +102,7 @@ class SubProcess extends EventEmitter {
102
102
  stderr: ''
103
103
  };
104
104
 
105
- const handleOutput = data => {
106
- const streams = _lodash.default.cloneDeep(data);
107
-
105
+ const handleOutput = streams => {
108
106
  const {
109
107
  stdout,
110
108
  stderr
@@ -148,27 +146,27 @@ class SubProcess extends EventEmitter {
148
146
  this.proc.kill('SIGINT');
149
147
 
150
148
  if (err.errno === 'ENOENT') {
151
- err = new Error(`Command '${this.cmd}' not found. Is it installed?`);
149
+ var _this$opts;
150
+
151
+ err = (0, _helpers.formatEnoent)(err, this.cmd, (_this$opts = this.opts) === null || _this$opts === void 0 ? void 0 : _this$opts.cwd);
152
152
  }
153
153
 
154
154
  reject(err);
155
+ this.proc.unref();
156
+ this.proc = null;
155
157
  });
156
158
 
157
159
  if (this.proc.stdout) {
158
- this.proc.stdout.pipe((0, _through.default)(stdout => {
159
- handleOutput({
160
- stdout,
161
- stderr: ''
162
- });
160
+ this.proc.stdout.on('data', chunk => handleOutput({
161
+ stdout: chunk.toString(),
162
+ stderr: ''
163
163
  }));
164
164
  }
165
165
 
166
166
  if (this.proc.stderr) {
167
- this.proc.stderr.pipe((0, _through.default)(stderr => {
168
- handleOutput({
169
- stdout: '',
170
- stderr
171
- });
167
+ this.proc.stderr.on('data', chunk => handleOutput({
168
+ stdout: '',
169
+ stderr: chunk.toString()
172
170
  }));
173
171
  }
174
172
 
@@ -227,7 +225,7 @@ class SubProcess extends EventEmitter {
227
225
  this.proc.kill(signal);
228
226
  setTimeout(() => {
229
227
  reject(new Error(`Process didn't end after ${timeout}ms (cmd: '${this.rep}')`));
230
- }, timeout);
228
+ }, timeout).unref();
231
229
  });
232
230
  }
233
231
 
@@ -268,4 +266,4 @@ var _default = SubProcess;
268
266
  exports.default = _default;require('source-map-support').install();
269
267
 
270
268
 
271
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9zdWJwcm9jZXNzLmpzIl0sIm5hbWVzIjpbIkV2ZW50RW1pdHRlciIsImV2ZW50cyIsIk1BWF9MSU5FX1BPUlRJT05fTEVOR1RIIiwiY3V0U3VmZml4Iiwic3RyIiwic3VmZml4TGVuZ3RoIiwibGVuZ3RoIiwic3Vic3RyIiwiU3ViUHJvY2VzcyIsImNvbnN0cnVjdG9yIiwiY21kIiwiYXJncyIsIm9wdHMiLCJFcnJvciIsIl8iLCJpc1N0cmluZyIsImlzQXJyYXkiLCJwcm9jIiwiZXhwZWN0aW5nRXhpdCIsInJlcCIsImlzUnVubmluZyIsImVtaXRMaW5lcyIsInN0cmVhbSIsImxpbmVzIiwibGluZSIsImVtaXQiLCJ0b1VwcGVyQ2FzZSIsInN0YXJ0Iiwic3RhcnREZXRlY3RvciIsInRpbWVvdXRNcyIsImRldGFjaCIsInN0YXJ0RGVsYXkiLCJnZW5lcmljU3RhcnREZXRlY3RvciIsInN0ZG91dCIsInN0ZGVyciIsImlzTnVtYmVyIiwiaXNCb29sZWFuIiwiZGV0YWNoZWQiLCJCIiwicmVzb2x2ZSIsInJlamVjdCIsInNldEVuY29kaW5nIiwiZW5jb2RpbmciLCJsYXN0TGluZVBvcnRpb24iLCJoYW5kbGVPdXRwdXQiLCJkYXRhIiwic3RyZWFtcyIsImNsb25lRGVlcCIsImUiLCJzdHJlYW1OYW1lIiwic3RyZWFtRGF0YSIsInRvUGFpcnMiLCJzcGxpdCIsIm1hcCIsIngiLCJsYXN0IiwicmVzdWx0TGluZXMiLCJzbGljZSIsImN1cnJlbnRQb3J0aW9uIiwib24iLCJlcnIiLCJyZW1vdmVBbGxMaXN0ZW5lcnMiLCJraWxsIiwiZXJybm8iLCJwaXBlIiwiY29kZSIsInNpZ25hbCIsImhhbmRsZUxhc3RMaW5lcyIsImV2ZW50Iiwic2V0VGltZW91dCIsImZpbmFsbHkiLCJ1bnJlZiIsImxhc3RMaW5lcyIsInN0b3AiLCJ0aW1lb3V0Iiwiam9pbiIsImFsbG93ZWRFeGl0Q29kZXMiLCJpbmRleE9mIiwiZGV0YWNoUHJvY2VzcyIsInBpZCJdLCJtYXBw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b0M7QUFDbEMsUUFBSSxDQUFDLEtBQUt4RCxTQUFWLEVBQXFCO0FBQ25CLFlBQU0sSUFBSVAsS0FBSixDQUFXLDJEQUEwRCxLQUFLTSxHQUFJLElBQTlFLENBQU47QUFDRDs7QUFFRCxXQUFPLE1BQU0sSUFBSW1CLGlCQUFKLENBQU0sQ0FBQ0MsT0FBRCxFQUFVQyxNQUFWLEtBQXFCO0FBQ3RDLFdBQUt2QixJQUFMLENBQVUwQyxFQUFWLENBQWEsTUFBYixFQUFzQk0sSUFBRCxJQUFVO0FBQzdCLFlBQUlXLGdCQUFnQixDQUFDQyxPQUFqQixDQUF5QlosSUFBekIsTUFBbUMsQ0FBQyxDQUF4QyxFQUEyQztBQUN6Q3pCLFVBQUFBLE1BQU0sQ0FBQyxJQUFJM0IsS0FBSixDQUFXLCtCQUE4Qm9ELElBQUssV0FBVSxLQUFLOUMsR0FBSSxJQUFqRSxDQUFELENBQU47QUFDRCxTQUZELE1BRU87QUFDTG9CLFVBQUFBLE9BQU8sQ0FBQzBCLElBQUQsQ0FBUDtBQUNEO0FBQ0YsT0FORDtBQU9ELEtBUlksQ0FBYjtBQVNEOztBQUtEYSxFQUFBQSxhQUFhLEdBQUk7QUFDZixRQUFJLENBQUMsS0FBS2xFLElBQUwsQ0FBVXlCLFFBQWYsRUFBeUI7QUFFdkIsWUFBTSxJQUFJeEIsS0FBSixDQUFXLHFFQUFYLENBQU47QUFDRDs7QUFDRCxRQUFJLEtBQUtJLElBQVQsRUFBZTtBQUNiLFdBQUtBLElBQUwsQ0FBVXNELEtBQVY7QUFDRDtBQUNGOztBQUVELE1BQUlRLEdBQUosR0FBVztBQUNULFdBQU8sS0FBSzlELElBQUwsR0FBWSxLQUFLQSxJQUFMLENBQVU4RCxHQUF0QixHQUE0QixJQUFuQztBQUNEOztBQXpQbUM7OztlQTZQdkJ2RSxVIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgcHJvbWlzZS9wcmVmZXItYXdhaXQtdG8tY2FsbGJhY2tzICovXG5cbmltcG9ydCB7IHNwYXduIH0gZnJvbSAnY2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgZXZlbnRzIGZyb20gJ2V2ZW50cyc7XG5pbXBvcnQgdGhyb3VnaCBmcm9tICd0aHJvdWdoJztcbmNvbnN0IHsgRXZlbnRFbWl0dGVyIH0gPSBldmVudHM7XG5pbXBvcnQgQiBmcm9tICdibHVlYmlyZCc7XG5pbXBvcnQgeyBxdW90ZSB9IGZyb20gJ3NoZWxsLXF1b3RlJztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5cbi8vIFRoaXMgaXMgbmVlZGVkIHRvIGF2b2lkIG1lbW9yeSBsZWFrc1xuLy8gd2hlbiB0aGUgcHJvY2VzcyBvdXRwdXQgaXMgdG9vIGxvbmcgYW5kIGNvbnRhaW5zXG4vLyBubyBsaW5lIGJyZWFrc1xuY29uc3QgTUFYX0xJTkVfUE9SVElPTl9MRU5HVEggPSAweEZGRkY7XG5cbmZ1bmN0aW9uIGN1dFN1ZmZpeCAoc3RyLCBzdWZmaXhMZW5ndGgpIHtcbiAgcmV0dXJuIHN0ci5sZW5ndGggPiBzdWZmaXhMZW5ndGhcbiAgICAvLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD0yODY5XG4gICAgPyBgICR7c3RyLnN1YnN0cihzdHIubGVuZ3RoIC0gc3VmZml4TGVuZ3RoKX1gLnN1YnN0cigxKVxuICAgIDogc3RyO1xufVxuXG5cbmNsYXNzIFN1YlByb2Nlc3MgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xuICBjb25zdHJ1Y3RvciAoY21kLCBhcmdzID0gW10sIG9wdHMgPSB7fSkge1xuICAgIHN1cGVyKCk7XG4gICAgaWYgKCFjbWQpIHRocm93IG5ldyBFcnJvcignQ29tbWFuZCBpcyByZXF1aXJlZCcpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGN1cmx5XG4gICAgaWYgKCFfLmlzU3RyaW5nKGNtZCkpIHRocm93IG5ldyBFcnJvcignQ29tbWFuZCBtdXN0IGJlIGEgc3RyaW5nJyk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgY3VybHlcbiAgICBpZiAoIV8uaXNBcnJheShhcmdzKSkgdGhyb3cgbmV3IEVycm9yKCdBcmdzIG11c3QgYmUgYW4gYXJyYXknKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBjdXJseVxuXG4gICAgdGhpcy5jbWQgPSBjbWQ7XG4gICAgdGhpcy5hcmdzID0gYXJncztcbiAgICB0aGlzLnByb2MgPSBudWxsO1xuICAgIHRoaXMub3B0cyA9IG9wdHM7XG4gICAgdGhpcy5leHBlY3RpbmdFeGl0ID0gZmFsc2U7XG5cbiAgICAvLyBnZXQgYSBxdW90ZWQgcmVwcmVzZW50YXRpb24gb2YgdGhlIGNvbW1hbmQgZm9yIGVycm9yIHN0cmluZ3NcbiAgICB0aGlzLnJlcCA9IHF1b3RlKFtjbWQsIC4uLmFyZ3NdKTtcbiAgfVxuXG4gIGdldCBpc1J1bm5pbmcgKCkge1xuICAgIC8vIHByZXNlbmNlIG9mIGBwcm9jYCBtZWFucyB3ZSBoYXZlIGNvbm5lY3RlZCBhbmQgc3RhcnRlZFxuICAgIHJldHVybiAhIXRoaXMucHJvYztcbiAgfVxuXG4gIGVtaXRMaW5lcyAoc3RyZWFtLCBsaW5lcykge1xuICAgIGZvciAobGV0IGxpbmUgb2YgbGluZXMpIHtcbiAgICAgIHRoaXMuZW1pdCgnc3RyZWFtLWxpbmUnLCBgWyR7c3RyZWFtLnRvVXBwZXJDYXNlKCl9XSAke2xpbmV9YCk7XG4gICAgfVxuICB9XG5cbiAgLy8gc3Bhd24gdGhlIHN1YnByb2Nlc3MgYW5kIHJldHVybiBjb250cm9sIHdoZW5ldmVyIHdlIGRlZW0gdGhhdCBpdCBoYXMgZnVsbHlcbiAgLy8gXCJzdGFydGVkXCJcbiAgYXN5bmMgc3RhcnQgKHN0YXJ0RGV0ZWN0b3IgPSBudWxsLCB0aW1lb3V0TXMgPSBudWxsLCBkZXRhY2ggPSBmYWxzZSkge1xuICAgIGxldCBzdGFydERlbGF5ID0gMTA7XG5cbiAgICBjb25zdCBnZW5lcmljU3RhcnREZXRlY3RvciA9IGZ1bmN0aW9uIGdlbmVyaWNTdGFydERldGVjdG9yIChzdGRvdXQsIHN0ZGVycikge1xuICAgICAgcmV0dXJuIHN0ZG91dCB8fCBzdGRlcnI7XG4gICAgfTtcblxuICAgIC8vIHRoZSBkZWZhdWx0IHN0YXJ0IGRldGVjdG9yIHNpbXBseSByZXR1cm5zIHRydWUgd2hlbiB3ZSBnZXQgYW55IG91dHB1dFxuICAgIGlmIChzdGFydERldGVjdG9yID09PSBudWxsKSB7XG4gICAgICBzdGFydERldGVjdG9yID0gZ2VuZXJpY1N0YXJ0RGV0ZWN0b3I7XG4gICAgfVxuXG4gICAgLy8gaWYgdGhlIHVzZXIgcGFzc2VzIGEgbnVtYmVyLCB0aGVuIHdlIHNpbXBseSBkZWxheSBhIGNlcnRhaW4gYW1vdW50IG9mXG4gICAgLy8gdGltZSBiZWZvcmUgcmV0dXJuaW5nIGNvbnRyb2wsIHJhdGhlciB0aGFuIHdhaXRpbmcgZm9yIGEgY29uZGl0aW9uXG4gICAgaWYgKF8uaXNOdW1iZXIoc3RhcnREZXRlY3RvcikpIHtcbiAgICAgIHN0YXJ0RGVsYXkgPSBzdGFydERldGVjdG9yO1xuICAgICAgc3RhcnREZXRlY3RvciA9IG51bGw7XG4gICAgfVxuXG4gICAgLy8gaWYgdGhlIHVzZXIgcGFzc2VzIGluIGEgYm9vbGVhbiBhcyBvbmUgb2YgdGhlIGFyZ3VtZW50cywgdXNlIGl0IGZvciBgZGV0YWNoYFxuICAgIGlmIChfLmlzQm9vbGVhbihzdGFydERldGVjdG9yKSAmJiBzdGFydERldGVjdG9yKSB7XG4gICAgICBpZiAoIXRoaXMub3B0cy5kZXRhY2hlZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuYWJsZSB0byBkZXRhY2ggcHJvY2VzcyB0aGF0IGlzIG5vdCBzdGFydGVkIHdpdGggJ2RldGFjaGVkJyBvcHRpb25gKTtcbiAgICAgIH1cbiAgICAgIGRldGFjaCA9IHRydWU7XG4gICAgICBzdGFydERldGVjdG9yID0gZ2VuZXJpY1N0YXJ0RGV0ZWN0b3I7XG4gICAgfSBlbHNlIGlmIChfLmlzQm9vbGVhbih0aW1lb3V0TXMpICYmIHRpbWVvdXRNcykge1xuICAgICAgaWYgKCF0aGlzLm9wdHMuZGV0YWNoZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gZGV0YWNoIHByb2Nlc3MgdGhhdCBpcyBub3Qgc3RhcnRlZCB3aXRoICdkZXRhY2hlZCcgb3B0aW9uYCk7XG4gICAgICB9XG4gICAgICBkZXRhY2ggPSB0cnVlO1xuICAgICAgdGltZW91dE1zID0gbnVsbDtcbiAgICB9XG5cbiAgICAvLyByZXR1cm4gYSBwcm9taXNlIHNvIHdlIGNhbiB3cmFwIHRoZSBhc3luYyBiZWhhdmlvclxuICAgIHJldHVybiBhd2FpdCBuZXcgQigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAvLyBhY3R1YWxseSBzcGF3biB0aGUgc3VicHJvY1xuICAgICAgdGhpcy5wcm9jID0gc3Bhd24odGhpcy5jbWQsIHRoaXMuYXJncywgdGhpcy5vcHRzKTtcblxuICAgICAgaWYgKHRoaXMucHJvYy5zdGRvdXQpIHtcbiAgICAgICAgdGhpcy5wcm9jLnN0ZG91dC5zZXRFbmNvZGluZyh0aGlzLm9wdHMuZW5jb2RpbmcgfHwgJ3V0ZjgnKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLnByb2Muc3RkZXJyKSB7XG4gICAgICAgIHRoaXMucHJvYy5zdGRlcnIuc2V0RW5jb2RpbmcodGhpcy5vcHRzLmVuY29kaW5nIHx8ICd1dGY4Jyk7XG4gICAgICB9XG4gICAgICB0aGlzLmxhc3RMaW5lUG9ydGlvbiA9IHtzdGRvdXQ6ICcnLCBzdGRlcnI6ICcnfTtcblxuICAgICAgLy8gdGhpcyBmdW5jdGlvbiBoYW5kbGVzIG91dHB1dCB0aGF0IHdlIGNvbGxlY3QgZnJvbSB0aGUgc3VicHJvY1xuICAgICAgY29uc3QgaGFuZGxlT3V0cHV0ID0gKGRhdGEpID0+IHtcbiAgICAgICAgY29uc3Qgc3RyZWFtcyA9IF8uY2xvbmVEZWVwKGRhdGEpO1xuICAgICAgICBjb25zdCB7c3Rkb3V0LCBzdGRlcnJ9ID0gc3RyZWFtcztcbiAgICAgICAgLy8gaWYgd2UgaGF2ZSBhIHN0YXJ0RGV0ZWN0b3IsIHJ1biBpdCBvbiB0aGUgb3V0cHV0IHNvIHdlIGNhbiByZXNvbHZlL1xuICAgICAgICAvLyByZWplY3QgYW5kIG1vdmUgb24gZnJvbSBzdGFydFxuICAgICAgICB0cnkge1xuICAgICAgICAgIGlmIChzdGFydERldGVjdG9yICYmIHN0YXJ0RGV0ZWN0b3Ioc3Rkb3V0LCBzdGRlcnIpKSB7XG4gICAgICAgICAgICBzdGFydERldGVjdG9yID0gbnVsbDtcbiAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBlbWl0IHRoZSBhY3R1YWwgb3V0cHV0IGZvciB3aG9tZXZlcidzIGxpc3RlbmluZ1xuICAgICAgICB0aGlzLmVtaXQoJ291dHB1dCcsIHN0ZG91dCwgc3RkZXJyKTtcblxuICAgICAgICAvLyB3ZSBhbHNvIHdhbnQgdG8gZW1pdCBsaW5lcywgYnV0IGl0J3MgbW9yZSBjb21wbGV4IHNpbmNlIG91dHB1dFxuICAgICAgICAvLyBjb21lcyBpbiBjaHVua3MgYW5kIGEgbGluZSBjb3VsZCBjb21lIGluIHR3byBkaWZmZXJlbnQgY2h1bmtzLCBzb1xuICAgICAgICAvLyB3ZSBoYXZlIGxvZ2ljIHRvIGhhbmRsZSB0aGF0IGNhc2UgKHVzaW5nIHRoaXMubGFzdExpbmVQb3J0aW9uIHRvXG4gICAgICAgIC8vIHJlbWVtYmVyIGEgbGluZSB0aGF0IHN0YXJ0ZWQgYnV0IGRpZCBub3QgZmluaXNoIGluIHRoZSBsYXN0IGNodW5rKVxuICAgICAgICBmb3IgKGNvbnN0IFtzdHJlYW1OYW1lLCBzdHJlYW1EYXRhXSBvZiBfLnRvUGFpcnMoc3RyZWFtcykpIHtcbiAgICAgICAgICBpZiAoIXN0cmVhbURhdGEpIGNvbnRpbnVlOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGN1cmx5XG4gICAgICAgICAgY29uc3QgbGluZXMgPSBzdHJlYW1EYXRhLnNwbGl0KCdcXG4nKVxuICAgICAgICAgICAgLy8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9Mjg2OVxuICAgICAgICAgICAgLm1hcCgoeCkgPT4gYCAke3h9YC5zdWJzdHIoMSkpO1xuICAgICAgICAgIGlmIChsaW5lcy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICBsaW5lc1swXSA9IHRoaXMubGFzdExpbmVQb3J0aW9uW3N0cmVhbU5hbWVdICsgbGluZXNbMF07XG4gICAgICAgICAgICB0aGlzLmxhc3RMaW5lUG9ydGlvbltzdHJlYW1OYW1lXSA9IGN1dFN1ZmZpeChfLmxhc3QobGluZXMpLCBNQVhfTElORV9QT1JUSU9OX0xFTkdUSCk7XG4gICAgICAgICAgICBjb25zdCByZXN1bHRMaW5lcyA9IGxpbmVzLnNsaWNlKDAsIC0xKTtcbiAgICAgICAgICAgIHRoaXMuZW1pdChgbGluZXMtJHtzdHJlYW1OYW1lfWAsIHJlc3VsdExpbmVzKTtcbiAgICAgICAgICAgIHRoaXMuZW1pdExpbmVzKHN0cmVhbU5hbWUsIHJlc3VsdExpbmVzKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgY3VycmVudFBvcnRpb24gPSBjdXRTdWZmaXgobGluZXNbMF0sIE1BWF9MSU5FX1BPUlRJT05fTEVOR1RIKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmxhc3RMaW5lUG9ydGlvbltzdHJlYW1OYW1lXS5sZW5ndGggKyBjdXJyZW50UG9ydGlvbi5sZW5ndGggPiBNQVhfTElORV9QT1JUSU9OX0xFTkdUSCkge1xuICAgICAgICAgICAgICB0aGlzLmxhc3RMaW5lUG9ydGlvbltzdHJlYW1OYW1lXSA9IGN1cnJlbnRQb3J0aW9uO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy5sYXN0TGluZVBvcnRpb25bc3RyZWFtTmFtZV0gKz0gY3VycmVudFBvcnRpb247XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICAvLyBpZiB3ZSBnZXQgYW4gZXJyb3Igc3Bhd25pbmcgdGhlIHByb2MsIHJlamVjdCBhbmQgY2xlYW4gdXAgdGhlIHByb2NcbiAgICAgIHRoaXMucHJvYy5vbignZXJyb3InLCBlcnIgPT4ge1xuICAgICAgICB0aGlzLnByb2MucmVtb3ZlQWxsTGlzdGVuZXJzKCdleGl0Jyk7XG4gICAgICAgIHRoaXMucHJvYy5raWxsKCdTSUdJTlQnKTtcblxuICAgICAgICBpZiAoZXJyLmVycm5vID09PSAnRU5PRU5UJykge1xuICAgICAgICAgIGVyciA9IG5ldyBFcnJvcihgQ29tbWFuZCAnJHt0aGlzLmNtZH0nIG5vdCBmb3VuZC4gSXMgaXQgaW5zdGFsbGVkP2ApO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgfSk7XG5cbiAgICAgIGlmICh0aGlzLnByb2Muc3Rkb3V0KSB7XG4gICAgICAgIHRoaXMucHJvYy5zdGRvdXQucGlwZSh0aHJvdWdoKHN0ZG91dCA9PiB7XG4gICAgICAgICAgaGFuZGxlT3V0cHV0KHtzdGRvdXQsIHN0ZGVycjogJyd9KTtcbiAgICAgICAgfSkpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5wcm9jLnN0ZGVycikge1xuICAgICAgICB0aGlzLnByb2Muc3RkZXJyLnBpcGUodGhyb3VnaChzdGRlcnIgPT4ge1xuICAgICAgICAgIGhhbmRsZU91dHB1dCh7c3Rkb3V0OiAnJywgc3RkZXJyfSk7XG4gICAgICAgIH0pKTtcbiAgICAgIH1cblxuICAgICAgLy8gd2hlbiB0aGUgcHJvYyBleGl0cywgd2UgbWlnaHQgc3RpbGwgaGF2ZSBhIGJ1ZmZlciBvZiBsaW5lcyB3ZSB3ZXJlXG4gICAgICAvLyB3YWl0aW5nIG9uIG1vcmUgY2h1bmtzIHRvIGNvbXBsZXRlLiBHbyBhaGVhZCBhbmQgZW1pdCB0aG9zZSwgdGhlblxuICAgICAgLy8gcmUtZW1pdCB0aGUgZXhpdCBzbyBhIGxpc3RlbmVyIGNhbiBoYW5kbGUgdGhlIHBvc3NpYmx5LXVuZXhwZWN0ZWQgZXhpdFxuICAgICAgdGhpcy5wcm9jLm9uKCdleGl0JywgKGNvZGUsIHNpZ25hbCkgPT4ge1xuICAgICAgICB0aGlzLmhhbmRsZUxhc3RMaW5lcygpO1xuXG4gICAgICAgIHRoaXMuZW1pdCgnZXhpdCcsIGNvZGUsIHNpZ25hbCk7XG5cbiAgICAgICAgLy8gaW4gYWRkaXRpb24gdG8gdGhlIGJhcmUgZXhpdCBldmVudCwgYWxzbyBlbWl0IG9uZSBvZiB0aHJlZSBvdGhlclxuICAgICAgICAvLyBldmVudHMgdGhhdCBjb250YWluIG1vcmUgaGVscGZ1bCBpbmZvcm1hdGlvbjpcbiAgICAgICAgLy8gJ3N0b3AnOiB3ZSBzdG9wcGVkIHRoaXNcbiAgICAgICAgLy8gJ2RpZSc6IHRoZSBwcm9jZXNzIGVuZGVkIG91dCBvZiBvdXIgY29udHJvbCB3aXRoIGEgbm9uLXplcm8gZXhpdFxuICAgICAgICAvLyAnZW5kJzogdGhlIHByb2Nlc3MgZW5kZWQgb3V0IG9mIG91ciBjb250cm9sIHdpdGggYSB6ZXJvIGV4aXRcbiAgICAgICAgbGV0IGV2ZW50ID0gdGhpcy5leHBlY3RpbmdFeGl0ID8gJ3N0b3AnIDogJ2RpZSc7XG4gICAgICAgIGlmICghdGhpcy5leHBlY3RpbmdFeGl0ICYmIGNvZGUgPT09IDApIHtcbiAgICAgICAgICBldmVudCA9ICdlbmQnO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZW1pdChldmVudCwgY29kZSwgc2lnbmFsKTtcblxuICAgICAgICAvLyBmaW5hbGx5IGNsZWFuIHVwIHRoZSBwcm9jIGFuZCBtYWtlIHN1cmUgdG8gcmVzZXQgb3VyIGV4aXRcbiAgICAgICAgLy8gZXhwZWN0YXRpb25zXG4gICAgICAgIHRoaXMucHJvYyA9IG51bGw7XG4gICAgICAgIHRoaXMuZXhwZWN0aW5nRXhpdCA9IGZhbHNlO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIGlmIHRoZSB1c2VyIGhhc24ndCBnaXZlbiB1cyBhIHN0YXJ0RGV0ZWN0b3IsIGluc3RlYWQganVzdCByZXNvbHZlXG4gICAgICAvLyB3aGVuIHN0YXJ0RGVsYXkgbXMgaGF2ZSBwYXNzZWRcbiAgICAgIGlmICghc3RhcnREZXRlY3Rvcikge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsgcmVzb2x2ZSgpOyB9LCBzdGFydERlbGF5KTtcbiAgICAgIH1cblxuICAgICAgLy8gaWYgdGhlIHVzZXIgaGFzIGdpdmVuIHVzIGEgdGltZW91dCwgc3RhcnQgdGhlIGNsb2NrIGZvciByZWplY3RpbmdcbiAgICAgIC8vIHRoZSBwcm9taXNlIGlmIHdlIHRha2UgdG9vIGxvbmcgdG8gc3RhcnRcbiAgICAgIGlmIChfLmlzTnVtYmVyKHRpbWVvdXRNcykpIHtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgVGhlIHByb2Nlc3MgZGlkIG5vdCBzdGFydCB3aXRoaW4gJHt0aW1lb3V0TXN9bXMgYCArXG4gICAgICAgICAgICBgKGNtZDogJyR7dGhpcy5yZXB9JylgKSk7XG4gICAgICAgIH0sIHRpbWVvdXRNcyk7XG4gICAgICB9XG4gICAgfSkuZmluYWxseSgoKSA9PiB7XG4gICAgICBpZiAoZGV0YWNoICYmIHRoaXMucHJvYykge1xuICAgICAgICB0aGlzLnByb2MudW5yZWYoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGhhbmRsZUxhc3RMaW5lcyAoKSB7XG4gICAgZm9yIChsZXQgc3RyZWFtIG9mIFsnc3Rkb3V0JywgJ3N0ZGVyciddKSB7XG4gICAgICBpZiAodGhpcy5sYXN0TGluZVBvcnRpb25bc3RyZWFtXSkge1xuICAgICAgICBjb25zdCBsYXN0TGluZXMgPSBbdGhpcy5sYXN0TGluZVBvcnRpb25bc3RyZWFtXV07XG4gICAgICAgIHRoaXMuZW1pdChgbGluZXMtJHtzdHJlYW19YCwgbGFzdExpbmVzKTtcbiAgICAgICAgdGhpcy5lbWl0TGluZXMoc3RyZWFtLCBsYXN0TGluZXMpO1xuICAgICAgICB0aGlzLmxhc3RMaW5lUG9ydGlvbltzdHJlYW1dID0gJyc7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgc3RvcCAoc2lnbmFsID0gJ1NJR1RFUk0nLCB0aW1lb3V0ID0gMTAwMDApIHtcbiAgICBpZiAoIXRoaXMuaXNSdW5uaW5nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbid0IHN0b3AgcHJvY2VzczsgaXQncyBub3QgY3VycmVudGx5IHJ1bm5pbmcgKGNtZDogJyR7dGhpcy5yZXB9JylgKTtcbiAgICB9XG4gICAgLy8gbWFrZSBzdXJlIHRvIGVtaXQgYW55IGRhdGEgaW4gb3VyIGxpbmVzIGJ1ZmZlciB3aGVuZXZlciB3ZSdyZSBkb25lIHdpdGhcbiAgICAvLyB0aGUgcHJvY1xuICAgIHRoaXMuaGFuZGxlTGFzdExpbmVzKCk7XG4gICAgcmV0dXJuIGF3YWl0IG5ldyBCKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXMucHJvYy5vbignY2xvc2UnLCByZXNvbHZlKTtcbiAgICAgIHRoaXMuZXhwZWN0aW5nRXhpdCA9IHRydWU7XG4gICAgICB0aGlzLnByb2Mua2lsbChzaWduYWwpO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHJlamVjdChuZXcgRXJyb3IoYFByb2Nlc3MgZGlkbid0IGVuZCBhZnRlciAke3RpbWVvdXR9bXMgKGNtZDogJyR7dGhpcy5yZXB9JylgKSk7XG4gICAgICB9LCB0aW1lb3V0KTtcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGpvaW4gKGFsbG93ZWRFeGl0Q29kZXMgPSBbMF0pIHtcbiAgICBpZiAoIXRoaXMuaXNSdW5uaW5nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBqb2luIHByb2Nlc3M7IGl0IGlzIG5vdCBjdXJyZW50bHkgcnVubmluZyAoY21kOiAnJHt0aGlzLnJlcH0nKWApO1xuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCBuZXcgQigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLnByb2Mub24oJ2V4aXQnLCAoY29kZSkgPT4ge1xuICAgICAgICBpZiAoYWxsb3dlZEV4aXRDb2Rlcy5pbmRleE9mKGNvZGUpID09PSAtMSkge1xuICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoYFByb2Nlc3MgZW5kZWQgd2l0aCBleGl0Y29kZSAke2NvZGV9IChjbWQ6ICcke3RoaXMucmVwfScpYCkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc29sdmUoY29kZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLypcbiAgICogVGhpcyB3aWxsIG9ubHkgd29yayBpZiB0aGUgcHJvY2VzcyBpcyBjcmVhdGVkIHdpdGggdGhlIGBkZXRhY2hlZGAgb3B0aW9uXG4gICAqL1xuICBkZXRhY2hQcm9jZXNzICgpIHtcbiAgICBpZiAoIXRoaXMub3B0cy5kZXRhY2hlZCkge1xuICAgICAgLy8gdGhpcyBtZWFucyB0aGF0IHRoZXJlIGlzIGEgbWlzY29uZmlndXJhdGlvbiBpbiB0aGUgY2FsbGluZyBjb2RlXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuYWJsZSB0byBkZXRhY2ggcHJvY2VzcyB0aGF0IGlzIG5vdCBzdGFydGVkIHdpdGggJ2RldGFjaGVkJyBvcHRpb25gKTtcbiAgICB9XG4gICAgaWYgKHRoaXMucHJvYykge1xuICAgICAgdGhpcy5wcm9jLnVucmVmKCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IHBpZCAoKSB7XG4gICAgcmV0dXJuIHRoaXMucHJvYyA/IHRoaXMucHJvYy5waWQgOiBudWxsO1xuICB9XG59XG5cbmV4cG9ydCB7IFN1YlByb2Nlc3MgfTtcbmV4cG9ydCBkZWZhdWx0IFN1YlByb2Nlc3M7XG4iXSwiZmlsZSI6ImxpYi9zdWJwcm9jZXNzLmpzIiwic291cmNlUm9vdCI6Ii4uLy4uIn0=
269
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGliL3N1YnByb2Nlc3MuanMiLCJuYW1lcyI6WyJFdmVudEVtaXR0ZXIiLCJldmVudHMiLCJNQVhfTElORV9QT1JUSU9OX0xFTkdUSCIsImN1dFN1ZmZpeCIsInN0ciIsInN1ZmZpeExlbmd0aCIsImxlbmd0aCIsInN1YnN0ciIsIlN1YlByb2Nlc3MiLCJjb25zdHJ1Y3RvciIsImNtZCIsImFyZ3MiLCJvcHRzIiwiRXJyb3IiLCJfIiwiaXNTdHJpbmciLCJpc0FycmF5IiwicHJvYyIsImV4cGVjdGluZ0V4aXQiLCJyZXAiLCJxdW90ZSIsImlzUnVubmluZyIsImVtaXRMaW5lcyIsInN0cmVhbSIsImxpbmVzIiwibGluZSIsImVtaXQiLCJ0b1VwcGVyQ2FzZSIsInN0YXJ0Iiwic3RhcnREZXRlY3RvciIsInRpbWVvdXRNcyIsImRldGFjaCIsInN0YXJ0RGVsYXkiLCJnZW5lcmljU3RhcnREZXRlY3RvciIsInN0ZG91dCIsInN0ZGVyciIsImlzTnVtYmVyIiwiaXNCb29sZWFuIiwiZGV0YWNoZWQiLCJCIiwicmVzb2x2ZSIsInJlamVjdCIsInNwYXduIiwic2V0RW5jb2RpbmciLCJlbmNvZGluZyIsImxhc3RMaW5lUG9ydGlvbiIsImhhbmRsZU91dHB1dCIsInN0cmVhbXMiLCJlIiwic3RyZWFtTmFtZSIsInN0cmVhbURhdGEiLCJ0b1BhaXJzIiwic3BsaXQiLCJtYXAiLCJ4IiwibGFzdCIsInJlc3VsdExpbmVzIiwic2xpY2UiLCJjdXJyZW50UG9ydGlvbiIsIm9uIiwiZXJyIiwicmVtb3ZlQWxsTGlzdGVuZXJzIiwia2lsbCIsImVycm5vIiwiZm9ybWF0RW5vZW50IiwiY3dkIiwidW5yZWYiLCJjaHVuayIsInRvU3RyaW5nIiwiY29kZSIsInNpZ25hbCIsImhhbmRsZUxhc3RMaW5lcyIsImV2ZW50Iiwic2V0VGltZW91dCIsImZpbmFsbHkiLCJsYXN0TGluZXMiLCJzdG9wIiwidGltZW91dCIsImpvaW4iLCJhbGxvd2VkRXhpdENvZGVzIiwiaW5kZXhPZiIsImRldGFjaFByb2Nlc3MiLCJwaWQiXSwic291cmNlUm9vdCI6Ii4uLy4uIiwic291cmNlcyI6WyJsaWIvc3VicHJvY2Vzcy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBwcm9taXNlL3ByZWZlci1hd2FpdC10by1jYWxsYmFja3MgKi9cblxuaW1wb3J0IHsgc3Bhd24gfSBmcm9tICdjaGlsZF9wcm9jZXNzJztcbmltcG9ydCBldmVudHMgZnJvbSAnZXZlbnRzJztcbmNvbnN0IHsgRXZlbnRFbWl0dGVyIH0gPSBldmVudHM7XG5pbXBvcnQgQiBmcm9tICdibHVlYmlyZCc7XG5pbXBvcnQgeyBxdW90ZSB9IGZyb20gJ3NoZWxsLXF1b3RlJztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBmb3JtYXRFbm9lbnQgfSBmcm9tICcuL2hlbHBlcnMnO1xuXG5cbi8vIFRoaXMgaXMgbmVlZGVkIHRvIGF2b2lkIG1lbW9yeSBsZWFrc1xuLy8gd2hlbiB0aGUgcHJvY2VzcyBvdXRwdXQgaXMgdG9vIGxvbmcgYW5kIGNvbnRhaW5zXG4vLyBubyBsaW5lIGJyZWFrc1xuY29uc3QgTUFYX0xJTkVfUE9SVElPTl9MRU5HVEggPSAweEZGRkY7XG5cbmZ1bmN0aW9uIGN1dFN1ZmZpeCAoc3RyLCBzdWZmaXhMZW5ndGgpIHtcbiAgcmV0dXJuIHN0ci5sZW5ndGggPiBzdWZmaXhMZW5ndGhcbiAgICAvLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD0yODY5XG4gICAgPyBgICR7c3RyLnN1YnN0cihzdHIubGVuZ3RoIC0gc3VmZml4TGVuZ3RoKX1gLnN1YnN0cigxKVxuICAgIDogc3RyO1xufVxuXG5cbmNsYXNzIFN1YlByb2Nlc3MgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xuICBjb25zdHJ1Y3RvciAoY21kLCBhcmdzID0gW10sIG9wdHMgPSB7fSkge1xuICAgIHN1cGVyKCk7XG4gICAgaWYgKCFjbWQpIHRocm93IG5ldyBFcnJvcignQ29tbWFuZCBpcyByZXF1aXJlZCcpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGN1cmx5XG4gICAgaWYgKCFfLmlzU3RyaW5nKGNtZCkpIHRocm93IG5ldyBFcnJvcignQ29tbWFuZCBtdXN0IGJlIGEgc3RyaW5nJyk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgY3VybHlcbiAgICBpZiAoIV8uaXNBcnJheShhcmdzKSkgdGhyb3cgbmV3IEVycm9yKCdBcmdzIG11c3QgYmUgYW4gYXJyYXknKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBjdXJseVxuXG4gICAgdGhpcy5jbWQgPSBjbWQ7XG4gICAgdGhpcy5hcmdzID0gYXJncztcbiAgICB0aGlzLnByb2MgPSBudWxsO1xuICAgIHRoaXMub3B0cyA9IG9wdHM7XG4gICAgdGhpcy5leHBlY3RpbmdFeGl0ID0gZmFsc2U7XG5cbiAgICAvLyBnZXQgYSBxdW90ZWQgcmVwcmVzZW50YXRpb24gb2YgdGhlIGNvbW1hbmQgZm9yIGVycm9yIHN0cmluZ3NcbiAgICB0aGlzLnJlcCA9IHF1b3RlKFtjbWQsIC4uLmFyZ3NdKTtcbiAgfVxuXG4gIGdldCBpc1J1bm5pbmcgKCkge1xuICAgIC8vIHByZXNlbmNlIG9mIGBwcm9jYCBtZWFucyB3ZSBoYXZlIGNvbm5lY3RlZCBhbmQgc3RhcnRlZFxuICAgIHJldHVybiAhIXRoaXMucHJvYztcbiAgfVxuXG4gIGVtaXRMaW5lcyAoc3RyZWFtLCBsaW5lcykge1xuICAgIGZvciAobGV0IGxpbmUgb2YgbGluZXMpIHtcbiAgICAgIHRoaXMuZW1pdCgnc3RyZWFtLWxpbmUnLCBgWyR7c3RyZWFtLnRvVXBwZXJDYXNlKCl9XSAke2xpbmV9YCk7XG4gICAgfVxuICB9XG5cbiAgLy8gc3Bhd24gdGhlIHN1YnByb2Nlc3MgYW5kIHJldHVybiBjb250cm9sIHdoZW5ldmVyIHdlIGRlZW0gdGhhdCBpdCBoYXMgZnVsbHlcbiAgLy8gXCJzdGFydGVkXCJcbiAgYXN5bmMgc3RhcnQgKHN0YXJ0RGV0ZWN0b3IgPSBudWxsLCB0aW1lb3V0TXMgPSBudWxsLCBkZXRhY2ggPSBmYWxzZSkge1xuICAgIGxldCBzdGFydERlbGF5ID0gMTA7XG5cbiAgICBjb25zdCBnZW5lcmljU3RhcnREZXRlY3RvciA9IGZ1bmN0aW9uIGdlbmVyaWNTdGFydERldGVjdG9yIChzdGRvdXQsIHN0ZGVycikge1xuICAgICAgcmV0dXJuIHN0ZG91dCB8fCBzdGRlcnI7XG4gICAgfTtcblxuICAgIC8vIHRoZSBkZWZhdWx0IHN0YXJ0IGRldGVjdG9yIHNpbXBseSByZXR1cm5zIHRydWUgd2hlbiB3ZSBnZXQgYW55IG91dHB1dFxuICAgIGlmIChzdGFydERldGVjdG9yID09PSBudWxsKSB7XG4gICAgICBzdGFydERldGVjdG9yID0gZ2VuZXJpY1N0YXJ0RGV0ZWN0b3I7XG4gICAgfVxuXG4gICAgLy8gaWYgdGhlIHVzZXIgcGFzc2VzIGEgbnVtYmVyLCB0aGVuIHdlIHNpbXBseSBkZWxheSBhIGNlcnRhaW4gYW1vdW50IG9mXG4gICAgLy8gdGltZSBiZWZvcmUgcmV0dXJuaW5nIGNvbnRyb2wsIHJhdGhlciB0aGFuIHdhaXRpbmcgZm9yIGEgY29uZGl0aW9uXG4gICAgaWYgKF8uaXNOdW1iZXIoc3RhcnREZXRlY3RvcikpIHtcbiAgICAgIHN0YXJ0RGVsYXkgPSBzdGFydERldGVjdG9yO1xuICAgICAgc3RhcnREZXRlY3RvciA9IG51bGw7XG4gICAgfVxuXG4gICAgLy8gaWYgdGhlIHVzZXIgcGFzc2VzIGluIGEgYm9vbGVhbiBhcyBvbmUgb2YgdGhlIGFyZ3VtZW50cywgdXNlIGl0IGZvciBgZGV0YWNoYFxuICAgIGlmIChfLmlzQm9vbGVhbihzdGFydERldGVjdG9yKSAmJiBzdGFydERldGVjdG9yKSB7XG4gICAgICBpZiAoIXRoaXMub3B0cy5kZXRhY2hlZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuYWJsZSB0byBkZXRhY2ggcHJvY2VzcyB0aGF0IGlzIG5vdCBzdGFydGVkIHdpdGggJ2RldGFjaGVkJyBvcHRpb25gKTtcbiAgICAgIH1cbiAgICAgIGRldGFjaCA9IHRydWU7XG4gICAgICBzdGFydERldGVjdG9yID0gZ2VuZXJpY1N0YXJ0RGV0ZWN0b3I7XG4gICAgfSBlbHNlIGlmIChfLmlzQm9vbGVhbih0aW1lb3V0TXMpICYmIHRpbWVvdXRNcykge1xuICAgICAgaWYgKCF0aGlzLm9wdHMuZGV0YWNoZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gZGV0YWNoIHByb2Nlc3MgdGhhdCBpcyBub3Qgc3RhcnRlZCB3aXRoICdkZXRhY2hlZCcgb3B0aW9uYCk7XG4gICAgICB9XG4gICAgICBkZXRhY2ggPSB0cnVlO1xuICAgICAgdGltZW91dE1zID0gbnVsbDtcbiAgICB9XG5cbiAgICAvLyByZXR1cm4gYSBwcm9taXNlIHNvIHdlIGNhbiB3cmFwIHRoZSBhc3luYyBiZWhhdmlvclxuICAgIHJldHVybiBhd2FpdCBuZXcgQigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAvLyBhY3R1YWxseSBzcGF3biB0aGUgc3VicHJvY1xuICAgICAgdGhpcy5wcm9jID0gc3Bhd24odGhpcy5jbWQsIHRoaXMuYXJncywgdGhpcy5vcHRzKTtcblxuICAgICAgaWYgKHRoaXMucHJvYy5zdGRvdXQpIHtcbiAgICAgICAgdGhpcy5wcm9jLnN0ZG91dC5zZXRFbmNvZGluZyh0aGlzLm9wdHMuZW5jb2RpbmcgfHwgJ3V0ZjgnKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLnByb2Muc3RkZXJyKSB7XG4gICAgICAgIHRoaXMucHJvYy5zdGRlcnIuc2V0RW5jb2RpbmcodGhpcy5vcHRzLmVuY29kaW5nIHx8ICd1dGY4Jyk7XG4gICAgICB9XG4gICAgICB0aGlzLmxhc3RMaW5lUG9ydGlvbiA9IHtzdGRvdXQ6ICcnLCBzdGRlcnI6ICcnfTtcblxuICAgICAgLy8gdGhpcyBmdW5jdGlvbiBoYW5kbGVzIG91dHB1dCB0aGF0IHdlIGNvbGxlY3QgZnJvbSB0aGUgc3VicHJvY1xuICAgICAgY29uc3QgaGFuZGxlT3V0cHV0ID0gKHN0cmVhbXMpID0+IHtcbiAgICAgICAgY29uc3Qge3N0ZG91dCwgc3RkZXJyfSA9IHN0cmVhbXM7XG4gICAgICAgIC8vIGlmIHdlIGhhdmUgYSBzdGFydERldGVjdG9yLCBydW4gaXQgb24gdGhlIG91dHB1dCBzbyB3ZSBjYW4gcmVzb2x2ZS9cbiAgICAgICAgLy8gcmVqZWN0IGFuZCBtb3ZlIG9uIGZyb20gc3RhcnRcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBpZiAoc3RhcnREZXRlY3RvciAmJiBzdGFydERldGVjdG9yKHN0ZG91dCwgc3RkZXJyKSkge1xuICAgICAgICAgICAgc3RhcnREZXRlY3RvciA9IG51bGw7XG4gICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gZW1pdCB0aGUgYWN0dWFsIG91dHB1dCBmb3Igd2hvbWV2ZXIncyBsaXN0ZW5pbmdcbiAgICAgICAgdGhpcy5lbWl0KCdvdXRwdXQnLCBzdGRvdXQsIHN0ZGVycik7XG5cbiAgICAgICAgLy8gd2UgYWxzbyB3YW50IHRvIGVtaXQgbGluZXMsIGJ1dCBpdCdzIG1vcmUgY29tcGxleCBzaW5jZSBvdXRwdXRcbiAgICAgICAgLy8gY29tZXMgaW4gY2h1bmtzIGFuZCBhIGxpbmUgY291bGQgY29tZSBpbiB0d28gZGlmZmVyZW50IGNodW5rcywgc29cbiAgICAgICAgLy8gd2UgaGF2ZSBsb2dpYyB0byBoYW5kbGUgdGhhdCBjYXNlICh1c2luZyB0aGlzLmxhc3RMaW5lUG9ydGlvbiB0b1xuICAgICAgICAvLyByZW1lbWJlciBhIGxpbmUgdGhhdCBzdGFydGVkIGJ1dCBkaWQgbm90IGZpbmlzaCBpbiB0aGUgbGFzdCBjaHVuaylcbiAgICAgICAgZm9yIChjb25zdCBbc3RyZWFtTmFtZSwgc3RyZWFtRGF0YV0gb2YgXy50b1BhaXJzKHN0cmVhbXMpKSB7XG4gICAgICAgICAgaWYgKCFzdHJlYW1EYXRhKSBjb250aW51ZTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBjdXJseVxuICAgICAgICAgIGNvbnN0IGxpbmVzID0gc3RyZWFtRGF0YS5zcGxpdCgnXFxuJylcbiAgICAgICAgICAgIC8vIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTI4NjlcbiAgICAgICAgICAgIC5tYXAoKHgpID0+IGAgJHt4fWAuc3Vic3RyKDEpKTtcbiAgICAgICAgICBpZiAobGluZXMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgbGluZXNbMF0gPSB0aGlzLmxhc3RMaW5lUG9ydGlvbltzdHJlYW1OYW1lXSArIGxpbmVzWzBdO1xuICAgICAgICAgICAgdGhpcy5sYXN0TGluZVBvcnRpb25bc3RyZWFtTmFtZV0gPSBjdXRTdWZmaXgoXy5sYXN0KGxpbmVzKSwgTUFYX0xJTkVfUE9SVElPTl9MRU5HVEgpO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0TGluZXMgPSBsaW5lcy5zbGljZSgwLCAtMSk7XG4gICAgICAgICAgICB0aGlzLmVtaXQoYGxpbmVzLSR7c3RyZWFtTmFtZX1gLCByZXN1bHRMaW5lcyk7XG4gICAgICAgICAgICB0aGlzLmVtaXRMaW5lcyhzdHJlYW1OYW1lLCByZXN1bHRMaW5lcyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRQb3J0aW9uID0gY3V0U3VmZml4KGxpbmVzWzBdLCBNQVhfTElORV9QT1JUSU9OX0xFTkdUSCk7XG4gICAgICAgICAgICBpZiAodGhpcy5sYXN0TGluZVBvcnRpb25bc3RyZWFtTmFtZV0ubGVuZ3RoICsgY3VycmVudFBvcnRpb24ubGVuZ3RoID4gTUFYX0xJTkVfUE9SVElPTl9MRU5HVEgpIHtcbiAgICAgICAgICAgICAgdGhpcy5sYXN0TGluZVBvcnRpb25bc3RyZWFtTmFtZV0gPSBjdXJyZW50UG9ydGlvbjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMubGFzdExpbmVQb3J0aW9uW3N0cmVhbU5hbWVdICs9IGN1cnJlbnRQb3J0aW9uO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgLy8gaWYgd2UgZ2V0IGFuIGVycm9yIHNwYXduaW5nIHRoZSBwcm9jLCByZWplY3QgYW5kIGNsZWFuIHVwIHRoZSBwcm9jXG4gICAgICB0aGlzLnByb2Mub24oJ2Vycm9yJywgKGVycikgPT4ge1xuICAgICAgICB0aGlzLnByb2MucmVtb3ZlQWxsTGlzdGVuZXJzKCdleGl0Jyk7XG4gICAgICAgIHRoaXMucHJvYy5raWxsKCdTSUdJTlQnKTtcblxuICAgICAgICBpZiAoZXJyLmVycm5vID09PSAnRU5PRU5UJykge1xuICAgICAgICAgIGVyciA9IGZvcm1hdEVub2VudChlcnIsIHRoaXMuY21kLCB0aGlzLm9wdHM/LmN3ZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KGVycik7XG5cbiAgICAgICAgdGhpcy5wcm9jLnVucmVmKCk7XG4gICAgICAgIHRoaXMucHJvYyA9IG51bGw7XG4gICAgICB9KTtcblxuICAgICAgaWYgKHRoaXMucHJvYy5zdGRvdXQpIHtcbiAgICAgICAgdGhpcy5wcm9jLnN0ZG91dC5vbignZGF0YScsIChjaHVuaykgPT4gaGFuZGxlT3V0cHV0KHtzdGRvdXQ6IGNodW5rLnRvU3RyaW5nKCksIHN0ZGVycjogJyd9KSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLnByb2Muc3RkZXJyKSB7XG4gICAgICAgIHRoaXMucHJvYy5zdGRlcnIub24oJ2RhdGEnLCAoY2h1bmspID0+IGhhbmRsZU91dHB1dCh7c3Rkb3V0OiAnJywgc3RkZXJyOiBjaHVuay50b1N0cmluZygpfSkpO1xuICAgICAgfVxuXG4gICAgICAvLyB3aGVuIHRoZSBwcm9jIGV4aXRzLCB3ZSBtaWdodCBzdGlsbCBoYXZlIGEgYnVmZmVyIG9mIGxpbmVzIHdlIHdlcmVcbiAgICAgIC8vIHdhaXRpbmcgb24gbW9yZSBjaHVua3MgdG8gY29tcGxldGUuIEdvIGFoZWFkIGFuZCBlbWl0IHRob3NlLCB0aGVuXG4gICAgICAvLyByZS1lbWl0IHRoZSBleGl0IHNvIGEgbGlzdGVuZXIgY2FuIGhhbmRsZSB0aGUgcG9zc2libHktdW5leHBlY3RlZCBleGl0XG4gICAgICB0aGlzLnByb2Mub24oJ2V4aXQnLCAoY29kZSwgc2lnbmFsKSA9PiB7XG4gICAgICAgIHRoaXMuaGFuZGxlTGFzdExpbmVzKCk7XG5cbiAgICAgICAgdGhpcy5lbWl0KCdleGl0JywgY29kZSwgc2lnbmFsKTtcblxuICAgICAgICAvLyBpbiBhZGRpdGlvbiB0byB0aGUgYmFyZSBleGl0IGV2ZW50LCBhbHNvIGVtaXQgb25lIG9mIHRocmVlIG90aGVyXG4gICAgICAgIC8vIGV2ZW50cyB0aGF0IGNvbnRhaW4gbW9yZSBoZWxwZnVsIGluZm9ybWF0aW9uOlxuICAgICAgICAvLyAnc3RvcCc6IHdlIHN0b3BwZWQgdGhpc1xuICAgICAgICAvLyAnZGllJzogdGhlIHByb2Nlc3MgZW5kZWQgb3V0IG9mIG91ciBjb250cm9sIHdpdGggYSBub24temVybyBleGl0XG4gICAgICAgIC8vICdlbmQnOiB0aGUgcHJvY2VzcyBlbmRlZCBvdXQgb2Ygb3VyIGNvbnRyb2wgd2l0aCBhIHplcm8gZXhpdFxuICAgICAgICBsZXQgZXZlbnQgPSB0aGlzLmV4cGVjdGluZ0V4aXQgPyAnc3RvcCcgOiAnZGllJztcbiAgICAgICAgaWYgKCF0aGlzLmV4cGVjdGluZ0V4aXQgJiYgY29kZSA9PT0gMCkge1xuICAgICAgICAgIGV2ZW50ID0gJ2VuZCc7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5lbWl0KGV2ZW50LCBjb2RlLCBzaWduYWwpO1xuXG4gICAgICAgIC8vIGZpbmFsbHkgY2xlYW4gdXAgdGhlIHByb2MgYW5kIG1ha2Ugc3VyZSB0byByZXNldCBvdXIgZXhpdFxuICAgICAgICAvLyBleHBlY3RhdGlvbnNcbiAgICAgICAgdGhpcy5wcm9jID0gbnVsbDtcbiAgICAgICAgdGhpcy5leHBlY3RpbmdFeGl0ID0gZmFsc2U7XG4gICAgICB9KTtcblxuICAgICAgLy8gaWYgdGhlIHVzZXIgaGFzbid0IGdpdmVuIHVzIGEgc3RhcnREZXRlY3RvciwgaW5zdGVhZCBqdXN0IHJlc29sdmVcbiAgICAgIC8vIHdoZW4gc3RhcnREZWxheSBtcyBoYXZlIHBhc3NlZFxuICAgICAgaWYgKCFzdGFydERldGVjdG9yKSB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4geyByZXNvbHZlKCk7IH0sIHN0YXJ0RGVsYXkpO1xuICAgICAgfVxuXG4gICAgICAvLyBpZiB0aGUgdXNlciBoYXMgZ2l2ZW4gdXMgYSB0aW1lb3V0LCBzdGFydCB0aGUgY2xvY2sgZm9yIHJlamVjdGluZ1xuICAgICAgLy8gdGhlIHByb21pc2UgaWYgd2UgdGFrZSB0b28gbG9uZyB0byBzdGFydFxuICAgICAgaWYgKF8uaXNOdW1iZXIodGltZW91dE1zKSkge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICByZWplY3QobmV3IEVycm9yKGBUaGUgcHJvY2VzcyBkaWQgbm90IHN0YXJ0IHdpdGhpbiAke3RpbWVvdXRNc31tcyBgICtcbiAgICAgICAgICAgIGAoY21kOiAnJHt0aGlzLnJlcH0nKWApKTtcbiAgICAgICAgfSwgdGltZW91dE1zKTtcbiAgICAgIH1cbiAgICB9KS5maW5hbGx5KCgpID0+IHtcbiAgICAgIGlmIChkZXRhY2ggJiYgdGhpcy5wcm9jKSB7XG4gICAgICAgIHRoaXMucHJvYy51bnJlZigpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgaGFuZGxlTGFzdExpbmVzICgpIHtcbiAgICBmb3IgKGxldCBzdHJlYW0gb2YgWydzdGRvdXQnLCAnc3RkZXJyJ10pIHtcbiAgICAgIGlmICh0aGlzLmxhc3RMaW5lUG9ydGlvbltzdHJlYW1dKSB7XG4gICAgICAgIGNvbnN0IGxhc3RMaW5lcyA9IFt0aGlzLmxhc3RMaW5lUG9ydGlvbltzdHJlYW1dXTtcbiAgICAgICAgdGhpcy5lbWl0KGBsaW5lcy0ke3N0cmVhbX1gLCBsYXN0TGluZXMpO1xuICAgICAgICB0aGlzLmVtaXRMaW5lcyhzdHJlYW0sIGxhc3RMaW5lcyk7XG4gICAgICAgIHRoaXMubGFzdExpbmVQb3J0aW9uW3N0cmVhbV0gPSAnJztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBhc3luYyBzdG9wIChzaWduYWwgPSAnU0lHVEVSTScsIHRpbWVvdXQgPSAxMDAwMCkge1xuICAgIGlmICghdGhpcy5pc1J1bm5pbmcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ2FuJ3Qgc3RvcCBwcm9jZXNzOyBpdCdzIG5vdCBjdXJyZW50bHkgcnVubmluZyAoY21kOiAnJHt0aGlzLnJlcH0nKWApO1xuICAgIH1cbiAgICAvLyBtYWtlIHN1cmUgdG8gZW1pdCBhbnkgZGF0YSBpbiBvdXIgbGluZXMgYnVmZmVyIHdoZW5ldmVyIHdlJ3JlIGRvbmUgd2l0aFxuICAgIC8vIHRoZSBwcm9jXG4gICAgdGhpcy5oYW5kbGVMYXN0TGluZXMoKTtcbiAgICByZXR1cm4gYXdhaXQgbmV3IEIoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpcy5wcm9jLm9uKCdjbG9zZScsIHJlc29sdmUpO1xuICAgICAgdGhpcy5leHBlY3RpbmdFeGl0ID0gdHJ1ZTtcbiAgICAgIHRoaXMucHJvYy5raWxsKHNpZ25hbCk7XG4gICAgICAvLyB0aGlzIHRpbWVvdXQgbmVlZHMgdW5yZWYoKSBvciBub2RlIHdpbGwgd2FpdCBmb3IgdGhlIHRpbWVvdXQgdG8gZmlyZSBiZWZvcmVcbiAgICAgIC8vIGV4aXRpbmcgdGhlIHByb2Nlc3MuXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgUHJvY2VzcyBkaWRuJ3QgZW5kIGFmdGVyICR7dGltZW91dH1tcyAoY21kOiAnJHt0aGlzLnJlcH0nKWApKTtcbiAgICAgIH0sIHRpbWVvdXQpLnVucmVmKCk7XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBqb2luIChhbGxvd2VkRXhpdENvZGVzID0gWzBdKSB7XG4gICAgaWYgKCF0aGlzLmlzUnVubmluZykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3Qgam9pbiBwcm9jZXNzOyBpdCBpcyBub3QgY3VycmVudGx5IHJ1bm5pbmcgKGNtZDogJyR7dGhpcy5yZXB9JylgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXdhaXQgbmV3IEIoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpcy5wcm9jLm9uKCdleGl0JywgKGNvZGUpID0+IHtcbiAgICAgICAgaWYgKGFsbG93ZWRFeGl0Q29kZXMuaW5kZXhPZihjb2RlKSA9PT0gLTEpIHtcbiAgICAgICAgICByZWplY3QobmV3IEVycm9yKGBQcm9jZXNzIGVuZGVkIHdpdGggZXhpdGNvZGUgJHtjb2RlfSAoY21kOiAnJHt0aGlzLnJlcH0nKWApKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXNvbHZlKGNvZGUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qXG4gICAqIFRoaXMgd2lsbCBvbmx5IHdvcmsgaWYgdGhlIHByb2Nlc3MgaXMgY3JlYXRlZCB3aXRoIHRoZSBgZGV0YWNoZWRgIG9wdGlvblxuICAgKi9cbiAgZGV0YWNoUHJvY2VzcyAoKSB7XG4gICAgaWYgKCF0aGlzLm9wdHMuZGV0YWNoZWQpIHtcbiAgICAgIC8vIHRoaXMgbWVhbnMgdGhhdCB0aGVyZSBpcyBhIG1pc2NvbmZpZ3VyYXRpb24gaW4gdGhlIGNhbGxpbmcgY29kZVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gZGV0YWNoIHByb2Nlc3MgdGhhdCBpcyBub3Qgc3RhcnRlZCB3aXRoICdkZXRhY2hlZCcgb3B0aW9uYCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnByb2MpIHtcbiAgICAgIHRoaXMucHJvYy51bnJlZigpO1xuICAgIH1cbiAgfVxuXG4gIGdldCBwaWQgKCkge1xuICAgIHJldHVybiB0aGlzLnByb2MgPyB0aGlzLnByb2MucGlkIDogbnVsbDtcbiAgfVxu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
package/index.js CHANGED
@@ -1,11 +1 @@
1
- // transpile:main
2
- import * as cp from 'child_process';
3
- import * as spIndex from './lib/subprocess';
4
- import * as execIndex from './lib/exec';
5
-
6
-
7
- const { spawn } = cp;
8
- const { SubProcess } = spIndex;
9
- const { exec } = execIndex;
10
-
11
- export { exec, spawn, SubProcess };
1
+ module.exports = require('./build/lib/index.js');
package/lib/exec.js CHANGED
@@ -1,12 +1,24 @@
1
+ // @ts-check
2
+
1
3
  /* eslint-disable promise/prefer-await-to-callbacks */
2
4
 
3
5
  import { spawn } from 'child_process';
4
6
  import { quote } from 'shell-quote';
5
7
  import B from 'bluebird';
6
8
  import _ from 'lodash';
9
+ import { formatEnoent } from './helpers';
7
10
 
11
+ const MAX_BUFFER_SIZE = 100 * 1024 * 1024;
8
12
 
9
- async function exec (cmd, args = [], opts = {}) {
13
+ /**
14
+ * Spawns a process
15
+ * @template {TeenProcessExecOptions} T
16
+ * @param {string} cmd - Program to execute
17
+ * @param {string[]} [args] - Arguments to pass to the program
18
+ * @param {T} [opts] - Options
19
+ * @returns {Promise<BufferProp<T> extends true ? TeenProcessExecBufferResult : TeenProcessExecStringResult>}
20
+ */
21
+ async function exec (cmd, args = [], opts = /** @type {T} */({})) {
10
22
  // get a quoted representation of the command for error strings
11
23
  const rep = quote([cmd, ...args]);
12
24
 
@@ -23,6 +35,8 @@ async function exec (cmd, args = [], opts = {}) {
23
35
  isBuffer: false,
24
36
  shell: undefined,
25
37
  logger: undefined,
38
+ maxStdoutBufferSize: MAX_BUFFER_SIZE,
39
+ maxStderrBufferSize: MAX_BUFFER_SIZE,
26
40
  }, opts);
27
41
 
28
42
  // this is an async function, so return a promise
@@ -33,47 +47,62 @@ async function exec (cmd, args = [], opts = {}) {
33
47
  let stdoutArr = [], stderrArr = [], timer = null;
34
48
 
35
49
  // if the process errors out, reject the promise
36
- proc.on('error', (err) => {
37
- let msg = `Command '${rep}' errored out: ${err.stack}`;
50
+ proc.on('error', /** @param {NodeJS.ErrnoException} err */(err) => {
51
+ // @ts-ignore
38
52
  if (err.errno === 'ENOENT') {
39
- msg = `Command '${cmd}' not found. Is it installed?`;
53
+ err = formatEnoent(err, cmd, opts.cwd);
40
54
  }
41
- reject(new Error(msg));
55
+ reject(err);
42
56
  });
43
57
  if (proc.stdin) {
44
- proc.stdin.on('error', (err) => {
58
+ proc.stdin.on('error', /** @param {NodeJS.ErrnoException} err */(err) => {
45
59
  reject(new Error(`Standard input '${err.syscall}' error: ${err.stack}`));
46
60
  });
47
61
  }
48
- if (proc.stdout) {
49
- proc.stdout.on('error', (err) => {
50
- reject(new Error(`Standard output '${err.syscall}' error: ${err.stack}`));
51
- });
52
- // keep track of stdout if we have not said not to
53
- if (!opts.ignoreOutput) {
54
- proc.stdout.on('data', (data) => {
55
- stdoutArr.push(data);
56
- if (opts.logger && _.isFunction(opts.logger.debug)) {
57
- opts.logger.debug(data);
58
- }
59
- });
62
+ const handleStream = (streamType, streamProps) => {
63
+ if (!proc[streamType]) {
64
+ return;
60
65
  }
61
- }
62
- if (proc.stderr) {
63
- proc.stderr.on('error', (err) => {
64
- reject(new Error(`Standard error '${err.syscall}' error: ${err.stack}`));
66
+
67
+ proc[streamType].on('error', (err) => {
68
+ reject(new Error(`${_.capitalize(streamType)} '${err.syscall}' error: ${err.stack}`));
65
69
  });
66
- // keep track of stderr if we have not said not to
67
- if (!opts.ignoreOutput) {
68
- proc.stderr.on('data', (data) => {
69
- stderrArr.push(data);
70
- if (opts.logger && _.isFunction(opts.logger.error)) {
71
- opts.logger.error(data);
72
- }
73
- });
70
+
71
+ if (opts.ignoreOutput) {
72
+ // https://github.com/nodejs/node/issues/4236
73
+ proc[streamType].on('data', () => {});
74
+ return;
74
75
  }
75
- }
76
76
 
77
+ // keep track of the stream if we don't want to ignore it
78
+ const {chunks, maxSize} = streamProps;
79
+ let size = 0;
80
+ proc[streamType].on('data', (chunk) => {
81
+ chunks.push(chunk);
82
+ size += chunk.length;
83
+ while (chunks.length > 1 && size >= maxSize) {
84
+ size -= chunks[0].length;
85
+ chunks.shift();
86
+ }
87
+ if (opts.logger && _.isFunction(opts.logger.debug)) {
88
+ opts.logger.debug(chunk.toString());
89
+ }
90
+ });
91
+ };
92
+ handleStream('stdout', {
93
+ maxSize: opts.maxStdoutBufferSize,
94
+ chunks: stdoutArr,
95
+ });
96
+ handleStream('stderr', {
97
+ maxSize: opts.maxStderrBufferSize,
98
+ chunks: stderrArr,
99
+ });
100
+
101
+ /**
102
+ * @template {boolean} U
103
+ * @param {U} isBuffer
104
+ * @returns {U extends true ? {stdout: Buffer, stderr: Buffer} : {stdout: string, stderr: string}}
105
+ */
77
106
  function getStdio (isBuffer) {
78
107
  let stdout, stderr;
79
108
  if (isBuffer) {
@@ -83,7 +112,7 @@ async function exec (cmd, args = [], opts = {}) {
83
112
  stdout = Buffer.concat(stdoutArr).toString(opts.encoding);
84
113
  stderr = Buffer.concat(stderrArr).toString(opts.encoding);
85
114
  }
86
- return {stdout, stderr};
115
+ return /** @type {U extends true ? {stdout: Buffer, stderr: Buffer} : {stdout: string, stderr: string}} */({stdout, stderr});
87
116
  }
88
117
 
89
118
  // if the process ends, either resolve or reject the promise based on the
@@ -95,7 +124,7 @@ async function exec (cmd, args = [], opts = {}) {
95
124
  }
96
125
  let {stdout, stderr} = getStdio(opts.isBuffer);
97
126
  if (code === 0) {
98
- resolve({stdout, stderr, code});
127
+ resolve(/** @type {BufferProp<T> extends true ? TeenProcessExecBufferResult : TeenProcessExecStringResult} */({stdout, stderr, code}));
99
128
  } else {
100
129
  let err = new Error(`Command '${rep}' exited with code ${code}`);
101
130
  err = Object.assign(err, {stdout, stderr, code});
@@ -122,3 +151,60 @@ async function exec (cmd, args = [], opts = {}) {
122
151
 
123
152
  export { exec };
124
153
  export default exec;
154
+
155
+ /**
156
+ * Options on top of `SpawnOptions`, unique to `teen_process.`
157
+ * @typedef {Object} TeenProcessProps
158
+ * @property {boolean} [ignoreOutput] - Ignore & discard all output
159
+ * @property {boolean} [isBuffer] - Return output as a Buffer
160
+ * @property {TeenProcessLogger} [logger] - Logger to use for debugging
161
+ * @property {number} [maxStdoutBufferSize] - Maximum size of `stdout` buffer
162
+ * @property {number} [maxStderrBufferSize] - Maximum size of `stderr` buffer
163
+ * @property {BufferEncoding} [encoding='utf8'] - Encoding to use for output
164
+ */
165
+
166
+ /**
167
+ * A logger object understood by {@link exec teen_process.exec}.
168
+ * @typedef {Object} TeenProcessLogger
169
+ * @property {(...args: any[]) => void} debug
170
+ */
171
+
172
+ /**
173
+ * Options for {@link exec teen_process.exec}.
174
+ * @typedef {import('child_process').SpawnOptions & TeenProcessProps} TeenProcessExecOptions
175
+ */
176
+
177
+ /**
178
+ * The value {@link exec teen_process.exec} resolves to when `isBuffer` is `false`
179
+ * @typedef {Object} TeenProcessExecStringResult
180
+ * @property {string} stdout - Stdout
181
+ * @property {string} stderr - Stderr
182
+ * @property {number?} code - Exit code
183
+ */
184
+
185
+ /**
186
+ * The value {@link exec teen_process.exec} resolves to when `isBuffer` is `true`
187
+ * @typedef {Object} TeenProcessExecBufferResult
188
+ * @property {Buffer} stdout - Stdout
189
+ * @property {Buffer} stderr - Stderr
190
+ * @property {number?} code - Exit code
191
+ */
192
+
193
+ /**
194
+ * Extra props {@link exec teen_process.exec} adds to its error objects
195
+ * @typedef {Object} TeenProcessExecErrorProps
196
+ * @property {string} stdout - STDOUT
197
+ * @property {string} stderr - STDERR
198
+ * @property {number?} code - Exit code
199
+ */
200
+
201
+ /**
202
+ * Error thrown by {@link exec teen_process.exec}
203
+ * @typedef {Error & TeenProcessExecErrorProps} TeenProcessExecError
204
+ */
205
+
206
+ /**
207
+ * @template {{isBuffer?: boolean}} MaybeBuffer
208
+ * @typedef {MaybeBuffer['isBuffer']} BufferProp
209
+ * @private
210
+ */
package/lib/helpers.js ADDED
@@ -0,0 +1,32 @@
1
+ import which from 'which';
2
+ import fs from 'fs';
3
+
4
+ /**
5
+ * Decorates ENOENT error received from a spawn system call
6
+ * with a more descriptive message, so it could be properly handled by a user.
7
+ *
8
+ * @param {NodeJS.ErrnoException} error Original error instance. !!! The instance is mutated after
9
+ * this helper function invocation
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
13
+ * unchanged error instance
14
+ */
15
+ function formatEnoent (error, cmd, cwd = null) {
16
+ try {
17
+ which.sync(cmd);
18
+ if (cwd) {
19
+ try {
20
+ fs.accessSync(cwd, fs.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`;
24
+ }
25
+ }
26
+ } catch (ign) {
27
+ error.message = `Command '${cmd}' not found. Is it installed?`;
28
+ }
29
+ return error;
30
+ }
31
+
32
+ export { formatEnoent };
package/lib/index.js ADDED
@@ -0,0 +1,11 @@
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 };
package/lib/subprocess.js CHANGED
@@ -2,11 +2,12 @@
2
2
 
3
3
  import { spawn } from 'child_process';
4
4
  import events from 'events';
5
- import through from 'through';
6
5
  const { EventEmitter } = events;
7
6
  import B from 'bluebird';
8
7
  import { quote } from 'shell-quote';
9
8
  import _ from 'lodash';
9
+ import { formatEnoent } from './helpers';
10
+
10
11
 
11
12
  // This is needed to avoid memory leaks
12
13
  // when the process output is too long and contains
@@ -99,8 +100,7 @@ class SubProcess extends EventEmitter {
99
100
  this.lastLinePortion = {stdout: '', stderr: ''};
100
101
 
101
102
  // this function handles output that we collect from the subproc
102
- const handleOutput = (data) => {
103
- const streams = _.cloneDeep(data);
103
+ const handleOutput = (streams) => {
104
104
  const {stdout, stderr} = streams;
105
105
  // if we have a startDetector, run it on the output so we can resolve/
106
106
  // reject and move on from start
@@ -143,26 +143,25 @@ class SubProcess extends EventEmitter {
143
143
  };
144
144
 
145
145
  // if we get an error spawning the proc, reject and clean up the proc
146
- this.proc.on('error', err => {
146
+ this.proc.on('error', (err) => {
147
147
  this.proc.removeAllListeners('exit');
148
148
  this.proc.kill('SIGINT');
149
149
 
150
150
  if (err.errno === 'ENOENT') {
151
- err = new Error(`Command '${this.cmd}' not found. Is it installed?`);
151
+ err = formatEnoent(err, this.cmd, this.opts?.cwd);
152
152
  }
153
153
  reject(err);
154
+
155
+ this.proc.unref();
156
+ this.proc = null;
154
157
  });
155
158
 
156
159
  if (this.proc.stdout) {
157
- this.proc.stdout.pipe(through(stdout => {
158
- handleOutput({stdout, stderr: ''});
159
- }));
160
+ this.proc.stdout.on('data', (chunk) => handleOutput({stdout: chunk.toString(), stderr: ''}));
160
161
  }
161
162
 
162
163
  if (this.proc.stderr) {
163
- this.proc.stderr.pipe(through(stderr => {
164
- handleOutput({stdout: '', stderr});
165
- }));
164
+ this.proc.stderr.on('data', (chunk) => handleOutput({stdout: '', stderr: chunk.toString()}));
166
165
  }
167
166
 
168
167
  // when the proc exits, we might still have a buffer of lines we were
@@ -233,9 +232,11 @@ class SubProcess extends EventEmitter {
233
232
  this.proc.on('close', resolve);
234
233
  this.expectingExit = true;
235
234
  this.proc.kill(signal);
235
+ // this timeout needs unref() or node will wait for the timeout to fire before
236
+ // exiting the process.
236
237
  setTimeout(() => {
237
238
  reject(new Error(`Process didn't end after ${timeout}ms (cmd: '${this.rep}')`));
238
- }, timeout);
239
+ }, timeout).unref();
239
240
  });
240
241
  }
241
242
 
package/package.json CHANGED
@@ -5,7 +5,7 @@
5
5
  "child_process",
6
6
  "process management"
7
7
  ],
8
- "version": "1.14.3",
8
+ "version": "2.0.0",
9
9
  "author": "appium",
10
10
  "license": "Apache-2.0",
11
11
  "repository": {
@@ -15,10 +15,11 @@
15
15
  "bugs": {
16
16
  "url": "https://github.com/appium/node-teen_process/issues"
17
17
  },
18
- "engines": [
19
- "node"
20
- ],
21
- "main": "./build/index.js",
18
+ "engines": {
19
+ "node": ">=14",
20
+ "npm": ">=6"
21
+ },
22
+ "main": "./index.js",
22
23
  "bin": {},
23
24
  "directories": {
24
25
  "lib": "lib"
@@ -26,7 +27,6 @@
26
27
  "files": [
27
28
  "index.js",
28
29
  "lib",
29
- "build/index.js",
30
30
  "build/lib"
31
31
  ],
32
32
  "dependencies": {
@@ -35,7 +35,7 @@
35
35
  "lodash": "^4.17.4",
36
36
  "shell-quote": "^1.4.3",
37
37
  "source-map-support": "^0.5.3",
38
- "through": "^2.3.8"
38
+ "which": "^2.0.2"
39
39
  },
40
40
  "scripts": {
41
41
  "clean": "rm -rf node_modules && rm -f package-lock.json && npm install",
@@ -53,16 +53,16 @@
53
53
  "precommit-test"
54
54
  ],
55
55
  "devDependencies": {
56
- "ajv": "^6.5.3",
57
- "appium-gulp-plugins": "^4.0.0",
58
- "appium-support": "^2.0.10",
56
+ "@appium/eslint-config-appium": "^6.0.2",
57
+ "@appium/gulp-plugins": "^7.0.2",
58
+ "@appium/support": "^2.59.2",
59
+ "@types/bluebird": "^3.5.36",
60
+ "@types/lodash": "^4.14.177",
61
+ "@types/node": "^17.0.0",
62
+ "@types/shell-quote": "^1.7.1",
59
63
  "chai": "^4.1.2",
60
64
  "chai-as-promised": "^7.1.1",
61
- "eslint-config-appium": "^4.0.0",
62
65
  "gulp": "^4.0.0",
63
66
  "pre-commit": "^1.2.2"
64
- },
65
- "greenkeeper": {
66
- "ignore": []
67
67
  }
68
68
  }
package/build/index.js DELETED
@@ -1,32 +0,0 @@
1
- "use strict";
2
-
3
- var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard");
4
-
5
- Object.defineProperty(exports, "__esModule", {
6
- value: true
7
- });
8
- exports.SubProcess = exports.spawn = exports.exec = void 0;
9
-
10
- require("source-map-support/register");
11
-
12
- var cp = _interopRequireWildcard(require("child_process"));
13
-
14
- var spIndex = _interopRequireWildcard(require("./lib/subprocess"));
15
-
16
- var execIndex = _interopRequireWildcard(require("./lib/exec"));
17
-
18
- const {
19
- spawn
20
- } = cp;
21
- exports.spawn = spawn;
22
- const {
23
- SubProcess
24
- } = spIndex;
25
- exports.SubProcess = SubProcess;
26
- const {
27
- exec
28
- } = execIndex;
29
- exports.exec = exec;require('source-map-support').install();
30
-
31
-
32
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImluZGV4LmpzIl0sIm5hbWVzIjpbInNwYXduIiwiY3AiLCJTdWJQcm9jZXNzIiwic3BJbmRleCIsImV4ZWMiLCJleGVjSW5kZXgiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBR0EsTUFBTTtBQUFFQSxFQUFBQTtBQUFGLElBQVlDLEVBQWxCOztBQUNBLE1BQU07QUFBRUMsRUFBQUE7QUFBRixJQUFpQkMsT0FBdkI7O0FBQ0EsTUFBTTtBQUFFQyxFQUFBQTtBQUFGLElBQVdDLFNBQWpCIiwic291cmNlc0NvbnRlbnQiOlsiLy8gdHJhbnNwaWxlOm1haW5cbmltcG9ydCAqIGFzIGNwIGZyb20gJ2NoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0ICogYXMgc3BJbmRleCBmcm9tICcuL2xpYi9zdWJwcm9jZXNzJztcbmltcG9ydCAqIGFzIGV4ZWNJbmRleCBmcm9tICcuL2xpYi9leGVjJztcblxuXG5jb25zdCB7IHNwYXduIH0gPSBjcDtcbmNvbnN0IHsgU3ViUHJvY2VzcyB9ID0gc3BJbmRleDtcbmNvbnN0IHsgZXhlYyB9ID0gZXhlY0luZGV4O1xuXG5leHBvcnQgeyBleGVjLCBzcGF3biwgU3ViUHJvY2VzcyB9O1xuIl0sImZpbGUiOiJpbmRleC5qcyIsInNvdXJjZVJvb3QiOiIuLiJ9