error.js
1 'use strict'; 2 const {signalsByName} = require('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 const makeError = ({ 29 stdout, 30 stderr, 31 all, 32 error, 33 signal, 34 exitCode, 35 command, 36 timedOut, 37 isCanceled, 38 killed, 39 parsed: {options: {timeout}} 40 }) => { 41 // `signal` and `exitCode` emitted on `spawned.on('exit')` event can be `null`. 42 // We normalize them to `undefined` 43 exitCode = exitCode === null ? undefined : exitCode; 44 signal = signal === null ? undefined : signal; 45 const signalDescription = signal === undefined ? undefined : signalsByName[signal].description; 46 47 const errorCode = error && error.code; 48 49 const prefix = getErrorPrefix({timedOut, timeout, errorCode, signal, signalDescription, exitCode, isCanceled}); 50 const execaMessage = `Command ${prefix}: ${command}`; 51 const isError = Object.prototype.toString.call(error) === '[object Error]'; 52 const shortMessage = isError ? `${execaMessage}\n${error.message}` : execaMessage; 53 const message = [shortMessage, stderr, stdout].filter(Boolean).join('\n'); 54 55 if (isError) { 56 error.originalMessage = error.message; 57 error.message = message; 58 } else { 59 error = new Error(message); 60 } 61 62 error.shortMessage = shortMessage; 63 error.command = command; 64 error.exitCode = exitCode; 65 error.signal = signal; 66 error.signalDescription = signalDescription; 67 error.stdout = stdout; 68 error.stderr = stderr; 69 70 if (all !== undefined) { 71 error.all = all; 72 } 73 74 if ('bufferedData' in error) { 75 delete error.bufferedData; 76 } 77 78 error.failed = true; 79 error.timedOut = Boolean(timedOut); 80 error.isCanceled = isCanceled; 81 error.killed = killed && !timedOut; 82 83 return error; 84 }; 85 86 module.exports = makeError;