Files
pnpm/lib/install_multiple.js
Zoltan Kochan 9bc97e76d4 style: use more ES6 syntax
Use lebab to transpile ES5 code to ES6.
Use eslint to fix styling issues afterwards.
Run all js in strict mode to allow let/const
in Node 4.
2016-08-23 21:12:01 +03:00

55 lines
1.8 KiB
JavaScript

'use strict'
const install = require('./install')
const pkgFullName = require('./pkg_full_name')
/*
* Install multiple modules into `modules`.
*
* ctx = { }
* installMultiple(ctx, { minimatch: '^2.0.0' }, {chokidar: '^1.6.0'}, './node_modules')
*/
module.exports = function installMultiple (ctx, requiredPkgsMap, optionalPkgsMap, modules, options) {
requiredPkgsMap = requiredPkgsMap || {}
optionalPkgsMap = optionalPkgsMap || {}
const optionalPkgs = Object.keys(optionalPkgsMap)
.map(pkgName => pkgMeta(pkgName, optionalPkgsMap[pkgName], true))
const requiredPkgs = Object.keys(requiredPkgsMap)
.filter(pkgName => !optionalPkgsMap[pkgName])
.map(pkgName => pkgMeta(pkgName, requiredPkgsMap[pkgName], false))
ctx.dependents = ctx.dependents || {}
ctx.dependencies = ctx.dependencies || {}
return Promise.all(optionalPkgs.concat(requiredPkgs).map(pkg => install(ctx, pkg.fullName, modules, options)
.then(dependency => {
const depFullName = pkgFullName(dependency)
ctx.dependents[depFullName] = ctx.dependents[depFullName] || []
if (ctx.dependents[depFullName].indexOf(options.dependent) === -1) {
ctx.dependents[depFullName].push(options.dependent)
}
ctx.dependencies[options.dependent] = ctx.dependencies[options.dependent] || []
if (ctx.dependencies[options.dependent].indexOf(depFullName) === -1) {
ctx.dependencies[options.dependent].push(depFullName)
}
return dependency
})
.catch(err => {
if (pkg.optional) {
console.log('Skipping failed optional dependency ' + pkg.fullName + ':')
console.log(err.message || err)
return
}
throw err
})))
}
function pkgMeta (name, version, optional) {
return {
fullName: version ? '' + name + '@' + version : name,
optional
}
}