131 lines
16 KiB
JavaScript
131 lines
16 KiB
JavaScript
"use strict";
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.shell = shell;
|
|
const child_process = require("child_process");
|
|
/**
|
|
* OS helpers
|
|
*
|
|
* Shell function which both prints to stdout and collects the output into a
|
|
* string.
|
|
*/
|
|
async function shell(command, options) {
|
|
handleShellOutput(renderCommandLine(command), options, 'open');
|
|
const child = child_process.spawn(command[0], command.slice(1), {
|
|
...options,
|
|
stdio: [options.input ? 'pipe' : 'ignore', 'pipe', 'pipe'],
|
|
});
|
|
return new Promise((resolve, reject) => {
|
|
if (options.input) {
|
|
child.stdin.write(options.input);
|
|
child.stdin.end();
|
|
}
|
|
const stdout = new Array();
|
|
const stderr = new Array();
|
|
// Both emit event and collect output
|
|
child.stdout.on('data', (chunk) => {
|
|
handleShellOutput(chunk, options, 'data_stdout');
|
|
stdout.push(chunk);
|
|
});
|
|
child.stderr.on('data', (chunk) => {
|
|
handleShellOutput(chunk, options, 'data_stderr');
|
|
stderr.push(chunk);
|
|
});
|
|
child.once('error', reject);
|
|
child.once('close', (code, signal) => {
|
|
handleShellOutput(renderCommandLine(command), options, 'close');
|
|
if (code === 0) {
|
|
resolve(Buffer.concat(stdout).toString('utf-8'));
|
|
}
|
|
else {
|
|
const out = Buffer.concat(stderr).toString('utf-8').trim();
|
|
reject(new ProcessFailed(code, signal, `${renderCommandLine(command)} exited with ${code != null ? 'error code' : 'signal'} ${code ?? signal}: ${out}`));
|
|
}
|
|
});
|
|
});
|
|
}
|
|
function handleShellOutput(chunk, options, shellEventType) {
|
|
switch (options.subprocessOutputDestination) {
|
|
case 'ignore':
|
|
return;
|
|
case 'publish':
|
|
options.shellEventPublisher(shellEventType, chunk.toString('utf-8'));
|
|
break;
|
|
case 'stdio':
|
|
default:
|
|
switch (shellEventType) {
|
|
case 'data_stdout':
|
|
process.stdout.write(chunk);
|
|
break;
|
|
case 'data_stderr':
|
|
process.stderr.write(chunk);
|
|
break;
|
|
case 'open':
|
|
options.shellEventPublisher(shellEventType, chunk.toString('utf-8'));
|
|
break;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
class ProcessFailed extends Error {
|
|
constructor(exitCode, signal, message) {
|
|
super(message);
|
|
this.exitCode = exitCode;
|
|
this.signal = signal;
|
|
this.code = 'PROCESS_FAILED';
|
|
}
|
|
}
|
|
/**
|
|
* Render the given command line as a string
|
|
*
|
|
* Probably missing some cases but giving it a good effort.
|
|
*/
|
|
function renderCommandLine(cmd) {
|
|
if (process.platform !== 'win32') {
|
|
return doRender(cmd, hasAnyChars(' ', '\\', '!', '"', "'", '&', '$'), posixEscape);
|
|
}
|
|
else {
|
|
return doRender(cmd, hasAnyChars(' ', '"', '&', '^', '%'), windowsEscape);
|
|
}
|
|
}
|
|
/**
|
|
* Render a UNIX command line
|
|
*/
|
|
function doRender(cmd, needsEscaping, doEscape) {
|
|
return cmd.map((x) => (needsEscaping(x) ? doEscape(x) : x)).join(' ');
|
|
}
|
|
/**
|
|
* Return a predicate that checks if a string has any of the indicated chars in it
|
|
*/
|
|
function hasAnyChars(...chars) {
|
|
return (str) => {
|
|
return chars.some((c) => str.indexOf(c) !== -1);
|
|
};
|
|
}
|
|
/**
|
|
* Escape a shell argument for POSIX shells
|
|
*
|
|
* Wrapping in single quotes and escaping single quotes inside will do it for us.
|
|
*/
|
|
function posixEscape(x) {
|
|
// Turn ' -> '"'"'
|
|
x = x.replace(/'/g, "'\"'\"'");
|
|
return `'${x}'`;
|
|
}
|
|
/**
|
|
* Escape a shell argument for cmd.exe
|
|
*
|
|
* This is how to do it right, but I'm not following everything:
|
|
*
|
|
* https://blogs.msdn.microsoft.com/twistylittlepassagesallalike/2011/04/23/everyone-quotes-command-line-arguments-the-wrong-way/
|
|
*/
|
|
function windowsEscape(x) {
|
|
// First surround by double quotes, ignore the part about backslashes
|
|
x = `"${x}"`;
|
|
// Now escape all special characters
|
|
const shellMeta = new Set(['"', '&', '^', '%']);
|
|
return x
|
|
.split('')
|
|
.map((c) => (shellMeta.has(x) ? '^' + c : c))
|
|
.join('');
|
|
}
|
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2hlbGwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJzaGVsbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQW1CQSxzQkE2Q0M7QUFoRUQsK0NBQStDO0FBYS9DOzs7OztHQUtHO0FBQ0ksS0FBSyxVQUFVLEtBQUssQ0FBQyxPQUFpQixFQUFFLE9BQXFCO0lBQ2xFLGlCQUFpQixDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQztJQUMvRCxNQUFNLEtBQUssR0FBRyxhQUFhLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFO1FBQzlELEdBQUcsT0FBTztRQUNWLEtBQUssRUFBRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUM7S0FDM0QsQ0FBQyxDQUFDO0lBRUgsT0FBTyxJQUFJLE9BQU8sQ0FBUyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtRQUM3QyxJQUFJLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNsQixLQUFLLENBQUMsS0FBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDbEMsS0FBSyxDQUFDLEtBQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNyQixDQUFDO1FBRUQsTUFBTSxNQUFNLEdBQUcsSUFBSSxLQUFLLEVBQU8sQ0FBQztRQUNoQyxNQUFNLE1BQU0sR0FBRyxJQUFJLEtBQUssRUFBTyxDQUFDO1FBRWhDLHFDQUFxQztRQUNyQyxLQUFLLENBQUMsTUFBTyxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUNqQyxpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLGFBQWEsQ0FBQyxDQUFDO1lB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SUFDOUIscUVBQXFFO0lBQ3JFLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDO0lBQ2Isb0NBQW9DO0lBQ3BDLE1BQU0sU0FBUyxHQUFHLElBQUksR0FBRyxDQUFTLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUN4RCxPQUFPLENBQUM7U0FDTCxLQUFLLENBQUMsRUFBRSxDQUFDO1NBQ1QsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQzVDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNkLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBjaGlsZF9wcm9jZXNzIGZyb20gJ2NoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IHR5cGUgeyBTdWJwcm9jZXNzT3V0cHV0RGVzdGluYXRpb24gfSBmcm9tICcuL2Fzc2V0LWhhbmRsZXInO1xuXG5leHBvcnQgdHlwZSBTaGVsbEV2ZW50VHlwZSA9ICdvcGVuJyB8ICdkYXRhX3N0ZG91dCcgfCAnZGF0YV9zdGRlcnInIHwgJ2Nsb3NlJztcblxuZXhwb3J0IHR5cGUgU2hlbGxFdmVudFB1Ymxpc2hlciA9IChldmVudDogU2hlbGxFdmVudFR5cGUsIG1lc3NhZ2U6IHN0cmluZykgPT4gdm9pZDtcblxuZXhwb3J0IGludGVyZmFjZSBTaGVsbE9wdGlvbnMgZXh0ZW5kcyBjaGlsZF9wcm9jZXNzLlNwYXduT3B0aW9ucyB7XG4gIHJlYWRvbmx5IHNoZWxsRXZlbnRQdWJsaXNoZXI6IFNoZWxsRXZlbnRQdWJsaXNoZXI7XG4gIHJlYWRvbmx5IGlucHV0Pzogc3RyaW5nO1xuICByZWFkb25seSBzdWJwcm9jZXNzT3V0cHV0RGVzdGluYXRpb24/OiBTdWJwcm9jZXNzT3V0cHV0RGVzdGluYXRpb247XG59XG5cbi8qKlxuICogT1MgaGVscGVyc1xuICpcbiAqIFNoZWxsIGZ1bmN0aW9uIHdoaWNoIGJvdGggcHJpbnRzIHRvIHN0ZG91dCBhbmQgY29sbGVjdHMgdGhlIG91dHB1dCBpbnRvIGFcbiAqIHN0cmluZy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNoZWxsKGNvbW1hbmQ6IHN0cmluZ1tdLCBvcHRpb25zOiBTaGVsbE9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xuICBoYW5kbGVTaGVsbE91dHB1dChyZW5kZXJDb21tYW5kTGluZShjb21tYW5kKSwgb3B0aW9ucywgJ29wZW4nKTtcbiAgY29uc3QgY2hpbGQgPSBjaGlsZF9wcm9jZXNzLnNwYXduKGNvbW1hbmRbMF0sIGNvbW1hbmQuc2xpY2UoMSksIHtcbiAgICAuLi5vcHRpb25zLFxuICAgIHN0ZGlvOiBbb3B0aW9ucy5pbnB1dCA/ICdwaXBlJyA6ICdpZ25vcmUnLCAncGlwZScsICdwaXBlJ10sXG4gIH0pO1xuXG4gIHJldHVybiBuZXcgUHJvbWlzZTxzdHJpbmc+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBpZiAob3B0aW9ucy5pbnB1dCkge1xuICAgICAgY2hpbGQuc3RkaW4hLndyaXRlKG9wdGlvbnMuaW5wdXQpO1xuICAgICAgY2hpbGQuc3RkaW4hLmVuZCgpO1xuICAgIH1cblxuICAgIGNvbnN0IHN0ZG91dCA9IG5ldyBBcnJheTxhbnk+KCk7XG4gICAgY29uc3Qgc3RkZXJyID0gbmV3IEFycmF5PGFueT4oKTtcblxuICAgIC8vIEJvdGggZW1pdCBldmVudCBhbmQgY29sbGVjdCBvdXRwdXRcbiAgICBjaGlsZC5zdGRvdXQhLm9uKCdkYXRhJywgKGNodW5rKSA9PiB7XG4gICAgICBoYW5kbGVTaGVsbE91dHB1dChjaHVuaywgb3B0aW9ucywgJ2RhdGFfc3Rkb3V0Jyk7XG4gICAgICBzdGRvdXQucHVzaChjaHVuayk7XG4gICAgfSk7XG5cbiAgICBjaGlsZC5zdGRlcnIhLm9uKCdkYXRhJywgKGNodW5rKSA9PiB7XG4gICAgICBoYW5kbGVTaGVsbE91dHB1dChjaHVuaywgb3B0aW9ucywgJ2RhdGFfc3RkZXJyJyk7XG4gICAgICBzdGRlcnIucHVzaChjaHVuayk7XG4gICAgfSk7XG5cbiAgICBjaGlsZC5vbmNlKCdlcnJvcicsIHJlamVjdCk7XG5cbiAgICBjaGlsZC5vbmNlKCdjbG9zZScsIChjb2RlLCBzaWduYWwpID0+IHtcbiAgICAgIGhhbmRsZVNoZWxsT3V0cHV0KHJlbmRlckNvbW1hbmRMaW5lKGNvbW1hbmQpLCBvcHRpb25zLCAnY2xvc2UnKTtcbiAgICAgIGlmIChjb2RlID09PSAwKSB7XG4gICAgICAgIHJlc29sdmUoQnVmZmVyLmNvbmNhdChzdGRvdXQpLnRvU3RyaW5nKCd1dGYtOCcpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IG91dCA9IEJ1ZmZlci5jb25jYXQoc3RkZXJyKS50b1N0cmluZygndXRmLTgnKS50cmltKCk7XG4gICAgICAgIHJlamVjdChcbiAgICAgICAgICBuZXcgUHJvY2Vzc0ZhaWxlZChcbiAgICAgICAgICAgIGNvZGUsXG4gICAgICAgICAgICBzaWduYWwsXG4gICAgICAgICAgICBgJHtyZW5kZXJDb21tYW5kTGluZShjb21tYW5kKX0gZXhpdGVkIHdpdGggJHtjb2RlICE9IG51bGwgPyAnZXJyb3IgY29kZScgOiAnc2lnbmFsJ30gJHtjb2RlID8/IHNpZ25hbH06ICR7b3V0fWAsXG4gICAgICAgICAgKSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGhhbmRsZVNoZWxsT3V0cHV0KFxuICBjaHVuazogQnVmZmVyIHwgc3RyaW5nLFxuICBvcHRpb25zOiBTaGVsbE9wdGlvbnMsXG4gIHNoZWxsRXZlbnRUeXBlOiBTaGVsbEV2ZW50VHlwZSxcbik6IHZvaWQge1xuICBzd2l0Y2ggKG9wdGlvbnMuc3VicHJvY2Vzc091dHB1dERlc3RpbmF0aW9uKSB7XG4gICAgY2FzZSAnaWdub3JlJzpcbiAgICAgIHJldHVybjtcbiAgICBjYXNlICdwdWJsaXNoJzpcbiAgICAgIG9wdGlvbnMuc2hlbGxFdmVudFB1Ymxpc2hlcihzaGVsbEV2ZW50VHlwZSwgY2h1bmsudG9TdHJpbmcoJ3V0Zi04JykpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnc3RkaW8nOlxuICAgIGRlZmF1bHQ6XG4gICAgICBzd2l0Y2ggKHNoZWxsRXZlbnRUeXBlKSB7XG4gICAgICAgIGNhc2UgJ2RhdGFfc3Rkb3V0JzpcbiAgICAgICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShjaHVuayk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2RhdGFfc3RkZXJyJzpcbiAgICAgICAgICBwcm9jZXNzLnN0ZGVyci53cml0ZShjaHVuayk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ29wZW4nOlxuICAgICAgICAgIG9wdGlvbnMuc2hlbGxFdmVudFB1Ymxpc2hlcihzaGVsbEV2ZW50VHlwZSwgY2h1bmsudG9TdHJpbmcoJ3V0Zi04JykpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gIH1cbn1cbmV4cG9ydCB0eXBlIFByb2Nlc3NGYWlsZWRFcnJvciA9IFByb2Nlc3NGYWlsZWQ7XG5cbmNsYXNzIFByb2Nlc3NGYWlsZWQgZXh0ZW5kcyBFcnJvciB7XG4gIHB1YmxpYyByZWFkb25seSBjb2RlID0gJ1BST0NFU1NfRkFJTEVEJztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgcmVhZG9ubHkgZXhpdENvZGU6IG51bWJlciB8IG51bGwsXG4gICAgcHVibGljIHJlYWRvbmx5IHNpZ25hbDogTm9kZUpTLlNpZ25hbHMgfCBudWxsLFxuICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgKSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBSZW5kZXIgdGhlIGdpdmVuIGNvbW1hbmQgbGluZSBhcyBhIHN0cmluZ1xuICpcbiAqIFByb2JhYmx5IG1pc3Npbmcgc29tZSBjYXNlcyBidXQgZ2l2aW5nIGl0IGEgZ29vZCBlZmZvcnQuXG4gKi9cbmZ1bmN0aW9uIHJlbmRlckNvbW1hbmRMaW5lKGNtZDogc3RyaW5nW10pIHtcbiAgaWYgKHByb2Nlc3MucGxhdGZvcm0gIT09ICd3aW4zMicpIHtcbiAgICByZXR1cm4gZG9SZW5kZXIoY21kLCBoYXNBbnlDaGFycygnICcsICdcXFxcJywgJyEnLCAnXCInLCBcIidcIiwgJyYnLCAnJCcpLCBwb3NpeEVzY2FwZSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGRvUmVuZGVyKGNtZCwgaGFzQW55Q2hhcnMoJyAnLCAnXCInLCAnJicsICdeJywgJyUnKSwgd2luZG93c0VzY2FwZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBSZW5kZXIgYSBVTklYIGNvbW1hbmQgbGluZVxuICovXG5mdW5jdGlvbiBkb1JlbmRlcihcbiAgY21kOiBzdHJpbmdbXSxcbiAgbmVlZHNFc2NhcGluZzogKHg6IHN0cmluZykgPT4gYm9vbGVhbixcbiAgZG9Fc2NhcGU6ICh4OiBzdHJpbmcpID0+IHN0cmluZyxcbik6IHN0cmluZyB7XG4gIHJldHVybiBjbWQubWFwKCh4KSA9PiAobmVlZHNFc2NhcGluZyh4KSA/IGRvRXNjYXBlKHgpIDogeCkpLmpvaW4oJyAnKTtcbn1cblxuLyoqXG4gKiBSZXR1cm4gYSBwcmVkaWNhdGUgdGhhdCBjaGVja3MgaWYgYSBzdHJpbmcgaGFzIGFueSBvZiB0aGUgaW5kaWNhdGVkIGNoYXJzIGluIGl0XG4gKi9cbmZ1bmN0aW9uIGhhc0FueUNoYXJzKC4uLmNoYXJzOiBzdHJpbmdbXSk6ICh4OiBzdHJpbmcpID0+IGJvb2xlYW4ge1xuICByZXR1cm4gKHN0cjogc3RyaW5nKSA9PiB7XG4gICAgcmV0dXJuIGNoYXJzLnNvbWUoKGMpID0+IHN0ci5pbmRleE9mKGMpICE9PSAtMSk7XG4gIH07XG59XG5cbi8qKlxuICogRXNjYXBlIGEgc2hlbGwgYXJndW1lbnQgZm9yIFBPU0lYIHNoZWxsc1xuICpcbiAqIFdyYXBwaW5nIGluIHNpbmdsZSBxdW90ZXMgYW5kIGVzY2FwaW5nIHNpbmdsZSBxdW90ZXMgaW5zaWRlIHdpbGwgZG8gaXQgZm9yIHVzLlxuICovXG5mdW5jdGlvbiBwb3NpeEVzY2FwZSh4OiBzdHJpbmcpIHtcbiAgLy8gVHVybiAnIC0+ICdcIidcIidcbiAgeCA9IHgucmVwbGFjZSgvJy9nLCBcIidcXFwiJ1xcXCInXCIpO1xuICByZXR1cm4gYCcke3h9J2A7XG59XG5cbi8qKlxuICogRXNjYXBlIGEgc2hlbGwgYXJndW1lbnQgZm9yIGNtZC5leGVcbiAqXG4gKiBUaGlzIGlzIGhvdyB0byBkbyBpdCByaWdodCwgYnV0IEknbSBub3QgZm9sbG93aW5nIGV2ZXJ5dGhpbmc6XG4gKlxuICogaHR0cHM6Ly9ibG9ncy5tc2RuLm1pY3Jvc29mdC5jb20vdHdpc3R5bGl0dGxlcGFzc2FnZXNhbGxhbGlrZS8yMDExLzA0LzIzL2V2ZXJ5b25lLXF1b3Rlcy1jb21tYW5kLWxpbmUtYXJndW1lbnRzLXRoZS13cm9uZy13YXkvXG4gKi9cbmZ1bmN0aW9uIHdpbmRvd3NFc2NhcGUoeDogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8gRmlyc3Qgc3Vycm91bmQgYnkgZG91YmxlIHF1b3RlcywgaWdub3JlIHRoZSBwYXJ0IGFib3V0IGJhY2tzbGFzaGVzXG4gIHggPSBgXCIke3h9XCJgO1xuICAvLyBOb3cgZXNjYXBlIGFsbCBzcGVjaWFsIGNoYXJhY3RlcnNcbiAgY29uc3Qgc2hlbGxNZXRhID0gbmV3IFNldDxzdHJpbmc+KFsnXCInLCAnJicsICdeJywgJyUnXSk7XG4gIHJldHVybiB4XG4gICAgLnNwbGl0KCcnKVxuICAgIC5tYXAoKGMpID0+IChzaGVsbE1ldGEuaGFzKHgpID8gJ14nICsgYyA6IGMpKVxuICAgIC5qb2luKCcnKTtcbn1cbiJdfQ==
|