1 | 'use strict';
|
2 | const os = require('os');
|
3 | const util = require('util');
|
4 |
|
5 | const 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 |
|
17 | const 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 |
|
37 | const 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 |
|
81 |
|
82 | error.signal = signal || undefined;
|
83 |
|
84 | return error;
|
85 | };
|
86 |
|
87 | module.exports = makeError;
|