UNPKG

npm-install-loader

Version:

Webpack loader to automatically npm install & save dependencies.

80 lines (63 loc) 1.93 kB
var spawn = require("cross-spawn"); var fs = require("fs"); var kebabCase = require("lodash.kebabcase"); var path = require("path"); var util = require("util"); module.exports.check = function(dependencies, dirs) { var missing = []; dependencies.forEach(function(dependency) { // Ignore relative modules, which aren't installed by NPM if (/^\./.test(dependency)) { return; } // Only look for the dependency directory dependency = dependency.split('/')[0]; // Bail early if we've already determined this is a missing dependency if (missing.indexOf(dependency) !== -1) { return; } try { // Ignore dependencies that are resolveable require.resolve(dependency); return; } catch(e) { var modulePaths = (dirs || []).map(function(dir) { return path.resolve(dir, dependency); }); // Check all module directories for dependency directory while (modulePaths.length) { var modulePath = modulePaths.shift(); try { // If it exists, Webpack can find it fs.statSync(modulePath); return; } catch(e) {} } // Dependency must be missing missing.push(dependency); } }); return missing; } module.exports.install = function install(dependencies, options) { if (!dependencies || !dependencies.length) { return undefined; } var args = ["install"].concat(dependencies); if (options) { for (option in options) { var arg = util.format("--%s", kebabCase(option)); var value = options[option]; if (value === false) { continue; } if (value === true) { args.push(arg); } else { args.push(util.format("%s='%s'", arg, value)); } } } console.info("Installing missing dependencies %s...", dependencies.join(" ")); return spawn.sync("npm", args, { stdio: "inherit" }); };