12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788 |
- 'use strict';
- const {signalsByName} = require('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';
- };
- const makeError = ({
- stdout,
- stderr,
- all,
- error,
- signal,
- exitCode,
- command,
- escapedCommand,
- timedOut,
- isCanceled,
- killed,
- parsed: {options: {timeout}}
- }) => {
- // `signal` and `exitCode` emitted on `spawned.on('exit')` event can be `null`.
- // We normalize them to `undefined`
- 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;
- 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;
- };
- module.exports = makeError;
|