script/cli-utils.js (30 lines of code) (raw):

#!/usr/bin/env node const fs = require('fs'); const exec = require('child_process').spawnSync; const process = require('process'); const path = require('path'); const input = require('process').stdin; const output = require('process').stdout; const util = require('util'); const readline = require('readline'); 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}`); quit(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()); quit(cmd.status); } else if (options && options.printErr) { // Some commands like npm pack output to stderr logger.log(cmd.stderr.toString()); } return output; }; const prompt = async (prompt) => { return new Promise((resolve) => { rl = readline.createInterface({ input , output }); rl.question(prompt, (answer) => { rl.close(); resolve(answer) }); }); }; const shouldContinuePrompt = async () => { const cont = await new Promise((resolve) => { rl = readline.createInterface({ input , output }); rl.question(`Type '${util.format('\x1b[32m%s\x1b[0m', YES)}' to continue\n`, (answer) => { rl.close(); resolve(answer.trim().toLowerCase() === YES); }); }); if (!cont) { quit(0); } }; const quit = (statusCode) => { process.exit(statusCode); }; module.exports = { logger, spawnOrFail, prompt, shouldContinuePrompt, quit, fs, process, path };