scripts/utilities.js (91 lines of code) (raw):
// Helper modules for common functions.
const exec = require('child_process').spawnSync;
const process = require('process');
const util = require('util');
const prompt = require('prompt-sync')();
const YES = 'yes';
const logger = {
error: (output, info = '') =>
console.error('\x1b[31m%s\x1b[0m', output, info), // Red
log: output => console.log('\x1b[36m%s\x1b[0m', output), // Teal
warn: output => console.warn('\x1b[33m%s\x1b[0m', output) // Yellow
};
const spawnOrFail = (command, args, options) => {
const cmd = exec(command, args, { shell: true });
if (cmd.error) {
logger.log(`Command ${command} failed with ${cmd.error.code}`);
process.exit(255);
}
const output = cmd.stdout.toString();
if (!options || !options.skipOutput) {
logger.log(output);
}
if (cmd.status !== 0) {
logger.error(`Command ${command} failed with exit code ${cmd.status} signal ${cmd.signal}`);
logger.error(cmd.stderr.toString());
process.exit(cmd.status);
} else if (options && options.printErr) { // Some commands like npm pack output to stderr
logger.log(cmd.stderr.toString());
}
return output;
};
// automatically catch peer dependency warnings and error out
const checkWarning = (command, args, options, dependency) => {
options = {
...options,
shell: true
};
const cmd = exec(command, args, options);
if (cmd.stderr.toString().match(`npm WARN ${dependency}`)) {
logger.log(`Command ${command} failed with incompatible peer dependency for ${dependency}`);
process.exit(255);
}
if (cmd.error) {
logger.log(`Command ${command} failed with ${cmd.error.code}`);
process.exit(255);
}
const output = cmd.stdout.toString();
logger.log(output);
if (cmd.status !== 0) {
logger.log(
`Command ${command} failed with exit code ${cmd.status} signal ${cmd.signal}`
);
logger.log(cmd.stderr.toString());
process.exit(cmd.status);
}
return output;
};
// Will prompt user for input before continue
// Exptected input 'yes' to continue
// Optinal callback(): instead of terminating process will run passed cb.
function shouldContinuePrompt(callback = null) {
const answer = prompt(
`Type '${util.format('\x1b[32m%s\x1b[0m', YES)}' to continue `
);
if (!answer || answer.trim().toLowerCase() !== YES) {
logger.log('Exiting...');
if (callback) {
callback();
} else {
process.exit(1);
}
}
}
const packDependency = () => {
spawnOrFail('npm', ['install']);
spawnOrFail('npm', ['run build']);
spawnOrFail('npm', ['pack']);
}
const updateDependency = (name, path) => {
if(path) {
logger.log(`Installing ${name} from local file`);
spawnOrFail('npm', [`install ${path}`]);
}else{
logger.log(`Installing ${name} from npm`);
spawnOrFail('npm', [`install ${name}`]);
}
}
module.exports = {
logger,
spawnOrFail,
process,
shouldContinuePrompt,
checkWarning,
packDependency,
updateDependency
};