UNPKG

2.2 kBJavaScriptView Raw
1import process from 'node:process';
2import {signalsByName} from 'human-signals';
3
4const getErrorPrefix = ({timedOut, timeout, errorCode, signal, signalDescription, exitCode, isCanceled}) => {
5 if (timedOut) {
6 return `timed out after ${timeout} milliseconds`;
7 }
8
9 if (isCanceled) {
10 return 'was canceled';
11 }
12
13 if (errorCode !== undefined) {
14 return `failed with ${errorCode}`;
15 }
16
17 if (signal !== undefined) {
18 return `was killed with ${signal} (${signalDescription})`;
19 }
20
21 if (exitCode !== undefined) {
22 return `failed with exit code ${exitCode}`;
23 }
24
25 return 'failed';
26};
27
28export const makeError = ({
29 stdout,
30 stderr,
31 all,
32 error,
33 signal,
34 exitCode,
35 command,
36 escapedCommand,
37 timedOut,
38 isCanceled,
39 killed,
40 parsed: {options: {timeout, cwd = process.cwd()}},
41}) => {
42 // `signal` and `exitCode` emitted on `spawned.on('exit')` event can be `null`.
43 // We normalize them to `undefined`
44 exitCode = exitCode === null ? undefined : exitCode;
45 signal = signal === null ? undefined : signal;
46 const signalDescription = signal === undefined ? undefined : signalsByName[signal].description;
47
48 const errorCode = error && error.code;
49
50 const prefix = getErrorPrefix({timedOut, timeout, errorCode, signal, signalDescription, exitCode, isCanceled});
51 const execaMessage = `Command ${prefix}: ${command}`;
52 const isError = Object.prototype.toString.call(error) === '[object Error]';
53 const shortMessage = isError ? `${execaMessage}\n${error.message}` : execaMessage;
54 const message = [shortMessage, stderr, stdout].filter(Boolean).join('\n');
55
56 if (isError) {
57 error.originalMessage = error.message;
58 error.message = message;
59 } else {
60 error = new Error(message);
61 }
62
63 error.shortMessage = shortMessage;
64 error.command = command;
65 error.escapedCommand = escapedCommand;
66 error.exitCode = exitCode;
67 error.signal = signal;
68 error.signalDescription = signalDescription;
69 error.stdout = stdout;
70 error.stderr = stderr;
71 error.cwd = cwd;
72
73 if (all !== undefined) {
74 error.all = all;
75 }
76
77 if ('bufferedData' in error) {
78 delete error.bufferedData;
79 }
80
81 error.failed = true;
82 error.timedOut = Boolean(timedOut);
83 error.isCanceled = isCanceled;
84 error.killed = killed && !timedOut;
85
86 return error;
87};