summaryrefslogtreecommitdiff
path: root/desktop/node_modules/@malept/cross-spawn-promise/dist/src/index.js
blob: bed7db1d19d37f41465d2239e541830e2ecc38ab (plain)
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