1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
|
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.spawn = exports.ExitSignalError = exports.ExitCodeError = exports.ExitError = exports.CrossSpawnError = void 0;
const cross_spawn_1 = __importDefault(require("cross-spawn"));
function stringifyCommand(cmd, args) {
if (args && Array.isArray(args) && args.length > 0) {
return `${cmd} ${args.join(" ")}`;
}
else {
return cmd;
}
}
/**
* Wrapper error for when the spawn function itself emits an error.
*/
class CrossSpawnError extends Error {
constructor(cmd, args, originalError, stderr) {
const fullCommand = stringifyCommand(cmd, args);
const errorMessage = originalError.message || originalError;
super(`Error executing command (${fullCommand}):\n${errorMessage}\n${stderr}`.trim());
this.originalError = originalError;
}
}
exports.CrossSpawnError = CrossSpawnError;
/**
* Base error class for when a process does not exit with a status code of zero.
*/
class ExitError extends Error {
constructor(cmd, args, message, stdout, stderr) {
super(message);
this.cmd = cmd;
this.args = args;
this.stdout = stdout;
this.stderr = stderr;
}
}
exports.ExitError = ExitError;
/**
* The error thrown when a process emits a non-zero exit code.
*/
class ExitCodeError extends ExitError {
constructor(cmd, args, code, stdout, stderr) {
const fullCommand = stringifyCommand(cmd, args);
super(cmd, args, `Command failed with a non-zero return code (${code}):\n${fullCommand}\n${stdout}\n${stderr}`.trim(), stdout, stderr);
this.code = code;
}
}
exports.ExitCodeError = ExitCodeError;
/**
* The error thrown when a process exits via a signal.
*/
class ExitSignalError extends ExitError {
constructor(cmd, args, signal, stdout, stderr) {
const fullCommand = stringifyCommand(cmd, args);
super(cmd, args, `Command terminated via a signal (${signal}):\n${fullCommand}\n${stdout}\n${stderr}`.trim(), stdout, stderr);
this.signal = signal;
}
}
exports.ExitSignalError = ExitSignalError;
/**
* A wrapper around `cross-spawn`'s `spawn` function which can optionally log the command executed
* and/or change the error object via a callback.
*
* @param cmd - The command to run
*/
async function spawn(cmd, args, options) {
if (!options) {
options = {};
}
const { logger, updateErrorCallback, ...spawnOptions } = options;
if (logger)
logger(`Executing command ${stringifyCommand(cmd, args)}`);
return new Promise((resolve, reject) => {
let stdout = "";
let stderr = "";
const process = cross_spawn_1.default(cmd, args, spawnOptions);
if (process.stdout) {
process.stdout.on("data", (data) => {
stdout += data.toString();
});
}
if (process.stderr) {
process.stderr.on("data",
/* istanbul ignore next */ (data) => {
stderr += data.toString();
});
}
process.on("close", (code, signal) => {
if (code === 0) {
resolve(stdout);
}
else if (code === null) {
reject(new ExitSignalError(cmd, args, signal, stdout, stderr));
}
else {
reject(new ExitCodeError(cmd, args, code, stdout, stderr));
}
});
process.on("error", (err) => {
if (updateErrorCallback) {
updateErrorCallback(err, !!logger);
}
reject(new CrossSpawnError(cmd, args, err, stderr));
});
});
}
exports.spawn = spawn;
//# sourceMappingURL=index.js.map
|