install-peers-as-dev
Version:
Automatically installs project's peerDependencies as devDependencies
98 lines (75 loc) • 2.36 kB
JavaScript
var fs = require('fs')
, path = require('path')
, installNpm = require('./install-npm.js')
, rootPath = path.resolve(__dirname, '..', '..')
, defaultPeerInstallOptions = {
'save': false
}
;
// in npm@3+ preinstall happens in `node_modules/.staging` folder
// so if we ended up in `node_modules/` jump one level up
if (path.basename(rootPath) === 'node_modules') {
rootPath = path.resolve(rootPath, '..');
}
installPeerDeps();
// --- Subroutines
function installPeerDeps() {
getPackageConfig(rootPath, function(config) {
var peerDeps = getPeerDeps(config)
, peerInstallOptions = getPeerInstallOptions(config)
;
if (!peerDeps) {
console.error('Unable to find peerDependencies in ' + rootPath);
return;
}
// ready to install, switch directories
process.chdir(rootPath);
// TODO: Add alternatives
if (installNpm) {
installNpm(peerDeps, peerInstallOptions);
}
});
}
function getPeerDeps(config) {
var peerDeps;
if (typeof config.peerDependencies === 'object' && !Array.isArray(config.peerDependencies)) {
peerDeps = Object.keys(config.peerDependencies).map(function(name) {
return name + '@' + config.peerDependencies[name];
});
}
return peerDeps;
}
function getPeerInstallOptions(config) {
var peerInstallOptions = defaultPeerInstallOptions;
if (typeof config.peerInstallOptions === 'object' && !Array.isArray(config.peerInstallOptions)) {
Object.keys(config.peerInstallOptions).forEach(function(key) {
peerInstallOptions[key] = config.peerInstallOptions[key];
});
}
return peerInstallOptions;
}
function getPackageConfig(packagePath, callback) {
var packageFile = path.join(packagePath, 'package.json')
, config
;
fs.readFile(packageFile, 'utf-8', function(error, content) {
if (error || !content) {
console.error('Unable to read ' + packageFile + ':', error || 'no content');
return;
}
config = parseConfig(content);
if (config.isParseConfigFailed) {
console.error('Unable to parse ' + packageFile + ':', config.error);
return;
}
callback(config);
});
}
function parseConfig(config) {
try {
config = JSON.parse(config);
} catch (error) {
config = {isParseConfigFailed: true, error: error};
}
return config;
}