time-to-botec

Benchmark sampling in different programming languages
Log | Files | Refs | README

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