"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const child_process_1 = require("child_process"); class ShellError extends Error { constructor(message) { message = message && message.split('\n')[0]; // assign only first line super(message); } } exports.ShellError = ShellError; function shellAsync(command, options = {}) { return new Promise((resolve, reject) => { const nextOptions = Object.assign({}, options, { shell: true, stdio: options.stdio || 'inherit' }); const asyncProcess = child_process_1.spawn(command, nextOptions); let output = null; asyncProcess.on('error', (error) => { reject(new ShellError(`Failed to start command: ${command}; ${error.toString()}`)); }); asyncProcess.on('close', (exitCode) => { if (exitCode === 0) { resolve(output); } else { reject(new ShellError(`Command failed: ${command} with exit code ${exitCode}`)); } }); if (nextOptions.stdio === 'pipe') { asyncProcess.stdout.on('data', (buffer) => { output = buffer.toString(); }); } if (nextOptions.timeout) { setTimeout(() => { asyncProcess.kill(); reject(new ShellError(`Command timeout: ${command}`)); }, nextOptions.timeout); } }); } function shellSync(command, options = {}) { try { const nextOptions = Object.assign({}, options, { stdio: options.stdio || 'inherit' }); const buffer = child_process_1.execSync(command, nextOptions); if (buffer) { return buffer.toString(); } return null; } catch (error) { throw new ShellError(error.message); } } function shell(command, options) { return options && options.async ? shellAsync(command, options) : shellSync(command, options); } exports.default = shell; //# sourceMappingURL=shell.js.map