firebase-ci
Version:
Simplified Firebase interaction for continuous integration including deploying hosting, functions, and database/storage rules.
92 lines (75 loc) • 2.18 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.isPromise = isPromise;
exports.runCommand = runCommand;
exports.shellescape = shellescape;
var _stream = _interopRequireDefault(require("stream"));
var _child_process = require("child_process");
var _logger = require("../utils/logger");
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
process.env.FORCE_COLOR = true;
function isPromise(valToCheck) {
return valToCheck && typeof valToCheck.then === 'function';
}
function runCommand({
beforeMsg,
successMsg,
command,
errorMsg,
args,
pipeOutput = true
}) {
if (beforeMsg) (0, _logger.info)(beforeMsg);
return new Promise((resolve, reject) => {
const child = (0, _child_process.spawn)(command, args, {
env: process.env,
shell: true
});
let output;
let error;
const customStream = new _stream.default.Writable();
const customErrorStream = new _stream.default.Writable();
customStream._write = (data, ...argv) => {
output += data;
if (pipeOutput) {
process.stdout._write(data, ...argv);
}
};
customErrorStream._write = (data, ...argv) => {
error += data;
if (pipeOutput) {
process.stderr._write(data, ...argv);
}
};
child.stdout.pipe(customStream);
child.stderr.pipe(customErrorStream);
child.on('exit', (code, signal) => {
if (code !== 0) {
if (output && output.indexOf('npm WARN') !== -1) {
return resolve(successMsg || output);
}
reject(error || output);
} else {
if (successMsg) (0, _logger.info)(successMsg);
if (output && output.indexOf('undefined') === 0) {
resolve(successMsg || output.replace('undefined', ''));
} else {
resolve(successMsg || output);
}
}
});
});
}
function shellescape(a) {
const ret = [];
a.forEach(s => {
if (/[^A-Za-z0-9_/:=-]/.test(s)) {
s = "'" + s.replace(/'/g, "'\\''") + "'";
s = s.replace(/^(?:'')+/g, '').replace(/\\'''/g, "\\'");
}
ret.push(s);
});
return ret.join(' ');
}