1 | import process from 'node:process';
|
2 | import {signalsByName} from 'human-signals';
|
3 |
|
4 | const 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 |
|
28 | export 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 |
|
43 |
|
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 | };
|