|
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; |
|
}; |
|
|