UNPKG

sherry-utils

Version:
99 lines (86 loc) 2.58 kB
const readline = require('readline') const stripAnsi = require('strip-ansi') const wcwidth = require('wcwidth') const spawn = require('./spawn') const spinner = require('./spinner') const logger = require('./logger') const SherryError = require('./SherryError') const npmClient = require('./npmClient') module.exports = async ({ cwd, installArgs, packages, saveDev, registry }) => { const packageName = packages ? packages.join(', ') : 'packages' return new Promise((resolve, reject) => { const args = [packages ? 'add' : 'install'].concat(packages ? packages : []) if (saveDev) { args.push(npmClient.baseOn === 'npm' ? '-D' : '--dev') } // Private NPM Client should have set registry field, respect the setting. if (npmClient.isPublicClient() && registry) { args.push('--registry', registry) } if (installArgs) { args.push(...installArgs) } logger.debug(npmClient.commandName, args.join(' ')) spinner.start(`Installing ${packageName} with ${npmClient.commandName}`) const ps = spawn(npmClient.commandName, args, { stdio: [0, 'pipe', 'pipe'], cwd, env: Object.assign( { FORCE_COLOR: true, /* eslint-disable camelcase */ npm_config_color: 'always', npm_config_progress: true /* eslint-enable camelcase */ }, process.env ) }) let output = '' const stream = process.stderr ps.stdout && ps.stdout.on('data', data => { output += data spinner.stop() stream.write(data) spinner.start() }) ps.stderr && ps.stderr.on('data', data => { output += data spinner.stop() stream.write(data) spinner.start() }) ps.on('close', code => { spinner.stop() // Clear output when succeeded if (code === 0) { const columns = stream.columns || 80 const lineCount = stripAnsi(output) .split('\n') .reduce((count, line) => { return count + Math.max(1, Math.ceil(wcwidth(line) / columns)) }, 0) for (let i = 0; i < lineCount; i++) { if (i > 0) { readline.moveCursor(stream, 0, -1) } readline.clearLine(stream, 0) readline.cursorTo(stream, 0) } logger.success(`Installed ${packageName}`) } else { throw new SherryError(`Failed to install ${packageName} in ${cwd}`) } resolve({ code, npmClient }) }) ps.on('error', reject) }) }