| [9af201e] | 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 | escapedCommand,
|
|---|
| 37 | timedOut,
|
|---|
| 38 | isCanceled,
|
|---|
| 39 | killed,
|
|---|
| 40 | parsed: {options: {timeout}}
|
|---|
| 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 |
|
|---|
| 72 | if (all !== undefined) {
|
|---|
| 73 | error.all = all;
|
|---|
| 74 | }
|
|---|
| 75 |
|
|---|
| 76 | if ('bufferedData' in error) {
|
|---|
| 77 | delete error.bufferedData;
|
|---|
| 78 | }
|
|---|
| 79 |
|
|---|
| 80 | error.failed = true;
|
|---|
| 81 | error.timedOut = Boolean(timedOut);
|
|---|
| 82 | error.isCanceled = isCanceled;
|
|---|
| 83 | error.killed = killed && !timedOut;
|
|---|
| 84 |
|
|---|
| 85 | return error;
|
|---|
| 86 | };
|
|---|
| 87 |
|
|---|
| 88 | module.exports = makeError;
|
|---|