error.js (2204B)
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 // `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 };