UNPKG

1.75 kBJavaScriptView Raw
1'use strict';
2const os = require('os');
3const util = require('util');
4
5const getCode = (error, code) => {
6 if (error && error.code) {
7 return [error.code, os.constants.errno[error.code]];
8 }
9
10 if (Number.isInteger(code)) {
11 return [util.getSystemErrorName(-code), code];
12 }
13
14 return [];
15};
16
17const getErrorPrefix = ({timedOut, timeout, signal, exitCodeName, exitCode, isCanceled}) => {
18 if (timedOut) {
19 return `timed out after ${timeout} milliseconds`;
20 }
21
22 if (isCanceled) {
23 return 'was canceled';
24 }
25
26 if (signal) {
27 return `was killed with ${signal}`;
28 }
29
30 if (exitCode !== undefined) {
31 return `failed with exit code ${exitCode} (${exitCodeName})`;
32 }
33
34 return 'failed';
35};
36
37const makeError = ({
38 stdout,
39 stderr,
40 all,
41 error,
42 signal,
43 code,
44 command,
45 timedOut,
46 isCanceled,
47 killed,
48 parsed: {options: {timeout}}
49}) => {
50 const [exitCodeName, exitCode] = getCode(error, code);
51
52 const prefix = getErrorPrefix({timedOut, timeout, signal, exitCodeName, exitCode, isCanceled});
53 const message = `Command ${prefix}: ${command}`;
54
55 if (error instanceof Error) {
56 error.message = `${message}\n${error.message}`;
57 } else {
58 error = new Error(message);
59 }
60
61 error.command = command;
62 delete error.code;
63 error.exitCode = exitCode;
64 error.exitCodeName = exitCodeName;
65 error.stdout = stdout;
66 error.stderr = stderr;
67
68 if (all !== undefined) {
69 error.all = all;
70 }
71
72 if ('bufferedData' in error) {
73 delete error.bufferedData;
74 }
75
76 error.failed = true;
77 error.timedOut = Boolean(timedOut);
78 error.isCanceled = isCanceled;
79 error.killed = killed && !timedOut;
80 // `signal` emitted on `spawned.on('exit')` event can be `null`. We normalize
81 // it to `undefined`
82 error.signal = signal || undefined;
83
84 return error;
85};
86
87module.exports = makeError;