var spawn = require("child_process").spawn; module.exports = shell; module.exports.safe = safe; function shell(cmd, ...args) { console.log("running shell '"+cmd+" "+args.join(" ")+"'"); return new Promise((resolve, reject) => { var child = spawn(cmd, args); function print(out, name) { return function(d) { var s = d.toString(); if (s.trim() === "") return; out.write(cmd+": "+name+": "+s); } } child.stderr.on("data", print(process.stderr, "err")); child.stdout.on("data", print(process.stdout, "out")); child.on("error", reject); child.on("exit", resolve); }); } async function safe(...args) { var code = await shell.apply(null, args); if (code !== 0 && code !== null) throw new Error("Command "+args[0]+" failed, exit code "+code); return code; }