| import process from 'node:process';
|
| import {signalsByName} from 'human-signals';
|
|
|
| const getErrorPrefix = ({timedOut, timeout, errorCode, signal, signalDescription, exitCode, isCanceled}) => {
|
| if (timedOut) {
|
| return `timed out after ${timeout} milliseconds`;
|
| }
|
|
|
| if (isCanceled) {
|
| return 'was canceled';
|
| }
|
|
|
| if (errorCode !== undefined) {
|
| return `failed with ${errorCode}`;
|
| }
|
|
|
| if (signal !== undefined) {
|
| return `was killed with ${signal} (${signalDescription})`;
|
| }
|
|
|
| if (exitCode !== undefined) {
|
| return `failed with exit code ${exitCode}`;
|
| }
|
|
|
| return 'failed';
|
| };
|
|
|
| export const makeError = ({
|
| stdout,
|
| stderr,
|
| all,
|
| error,
|
| signal,
|
| exitCode,
|
| command,
|
| escapedCommand,
|
| timedOut,
|
| isCanceled,
|
| killed,
|
| parsed: {options: {timeout, cwd = process.cwd()}},
|
| }) => {
|
|
|
|
|
| exitCode = exitCode === null ? undefined : exitCode;
|
| signal = signal === null ? undefined : signal;
|
| const signalDescription = signal === undefined ? undefined : signalsByName[signal].description;
|
|
|
| const errorCode = error && error.code;
|
|
|
| const prefix = getErrorPrefix({timedOut, timeout, errorCode, signal, signalDescription, exitCode, isCanceled});
|
| const execaMessage = `Command ${prefix}: ${command}`;
|
| const isError = Object.prototype.toString.call(error) === '[object Error]';
|
| const shortMessage = isError ? `${execaMessage}\n${error.message}` : execaMessage;
|
| const message = [shortMessage, stderr, stdout].filter(Boolean).join('\n');
|
|
|
| if (isError) {
|
| error.originalMessage = error.message;
|
| error.message = message;
|
| } else {
|
| error = new Error(message);
|
| }
|
|
|
| error.shortMessage = shortMessage;
|
| error.command = command;
|
| error.escapedCommand = escapedCommand;
|
| error.exitCode = exitCode;
|
| error.signal = signal;
|
| error.signalDescription = signalDescription;
|
| error.stdout = stdout;
|
| error.stderr = stderr;
|
| error.cwd = cwd;
|
|
|
| if (all !== undefined) {
|
| error.all = all;
|
| }
|
|
|
| if ('bufferedData' in error) {
|
| delete error.bufferedData;
|
| }
|
|
|
| error.failed = true;
|
| error.timedOut = Boolean(timedOut);
|
| error.isCanceled = isCanceled;
|
| error.killed = killed && !timedOut;
|
|
|
| return error;
|
| };
|
|
|