ack-webpack
Version:
A code bundler that drastically reduces setup time by offering an init prompt of project setup questions and includes a fantastic browser reloader.
105 lines (85 loc) • 2.43 kB
JavaScript
const ackPath = require('ack-path')
const childProcess = require('child_process')
const spawn = childProcess.spawn;
const windows = process.platform === 'win32'
const spawnOptions = {
cwd: process.cwd(),
env: process.env,
shell:windows
}
function filterArgs(args){
return args.map(value=>escape(value))
}
/**
@options - {
log:optional, typically console.log.bind(console)
}
*/
function promiseSpawn(sArgs, options){
return new Promise((res,rej)=>{
const dataArray = []
if(windows){
sArgs = filterArgs(sArgs)
}
const command = sArgs.shift()
const ls = spawn(command, sArgs, spawnOptions);
var spawnError = null
const upgradeError = err=>{
if(!err)return err
if(err.message){
let msg = err.msg
msg += '\ncommand-args:'+ JSON.stringify(sArgs)
err = new Error(msg)
}else if(err.split){
let msg = err
msg += '\ncommand-args:'+ JSON.stringify(sArgs)
err = new Error(msg)
}
return err
}
let onData = data=>dataArray.push(data)
let onError = err=>spawnError=err
if(options && options.log){
onData = data=>dataArray.push(data) && options.log(data.toString())
onError = err=>spawnError=err && options.log(err)
}
ls.stdout.on('data', onData)
ls.stdout.on('error', onError)
ls.stderr.on('data', onData)
ls.stderr.on('error', onError)
ls.on('close', code=>{
if(spawnError){
return rej( upgradeError(spawnError) )
}
const output = dataArray.join('')//bring all cli data together
if(options && options.log){
options.log( output )
}
res( output )
})
})
}
module.exports = promiseSpawn
module.exports.installPacks = function(packs, options){
let promise = Promise.resolve()
packs.forEach( pack=>promise=promise.then(()=>installer(pack,options)) )
return promise
}
function installer(name, options){
const args = ['npm','install','--save-dev',name]
return promiseSpawn(args, options)
}
module.exports.installer = installer
function isModuleInstalled(name){
try{
require(name)
return true
}catch(e){
const isNotFoundError = e && e.message.match('Cannot find module')
if(isNotFoundError){
return ackPath( process.cwd() ).join('node_modules',name).sync().exists()
}
return true
}
}
module.exports.isModuleInstalled = isModuleInstalled