From 723de72f935bdfeef5d9786cd77be809c3fbc6fa Mon Sep 17 00:00:00 2001 From: Mariusz Nowak Date: Mon, 9 Dec 2019 14:05:55 +0100 Subject: [PATCH] feat: Install dev dependencies only for top package or on update all --- lib/private/setup-dependencies/index.js | 42 +++++++++++++++++++------ 1 file changed, 32 insertions(+), 10 deletions(-) diff --git a/lib/private/setup-dependencies/index.js b/lib/private/setup-dependencies/index.js index c5fc8f4..52fad3c 100644 --- a/lib/private/setup-dependencies/index.js +++ b/lib/private/setup-dependencies/index.js @@ -4,6 +4,9 @@ const log = require("log").get("npm-cross-link") , getPackageJson = require("../../get-package-json") , processDependency = require("./process-dependency"); +const prodRejectModes = new Set(["dev", "optional"]); +const devRejectModes = new Set(["prod", "optional"]); + const setupRequiredDependencies = async ( packageContext, userConfiguration, @@ -11,16 +14,32 @@ const setupRequiredDependencies = async ( progressData ) => { const { name, packageJson } = packageContext; - const dependencies = (packageContext.dependencies = new Set( - Object.keys(packageJson.dependencies || {}).concat( - Object.keys(packageJson.devDependencies || {}) - ) - )); - dependencies.delete(name); - if (!dependencies.size) return; + const { installMode } = inputOptions; + const { topPackageName } = progressData; + const prodDependencies = new Set(Object.keys(packageJson.dependencies || {})); + prodDependencies.delete(name); + const devDependencies = new Set(Object.keys(packageJson.devDependencies || {})); + devDependencies.delete(name); + for (const dependencyName of prodDependencies) devDependencies.delete(dependencyName); + packageContext.dependencies = new Set([...prodDependencies, ...devDependencies]); + if (!packageContext.dependencies.size) return; + + if ( + prodDependencies.size && + (!topPackageName || topPackageName !== name || !prodRejectModes.has(installMode)) + ) { + log.debug("for %s setup prod dependencies %o", name, prodDependencies); + for (const dependencyName of prodDependencies) { + await processDependency( + packageContext, dependencyName, userConfiguration, inputOptions, progressData + ); + } + } - log.debug("for %s setup required dependencies %o", name, dependencies); - for (const dependencyName of dependencies) { + if (!devDependencies.size) return; + if (topPackageName && (topPackageName !== name || devRejectModes.has(installMode))) return; + log.debug("for %s setup dev dependencies %o", name, devDependencies); + for (const dependencyName of devDependencies) { await processDependency( packageContext, dependencyName, userConfiguration, inputOptions, progressData ); @@ -34,6 +53,8 @@ const setupOptionalDependencies = async ( progressData ) => { const { dependencies, name, packageJson } = packageContext; + const { installMode } = inputOptions; + const { topPackageName } = progressData; const optionalDependencies = new Set( Object.keys(packageJson.optionalDependencies || {}).filter( @@ -43,7 +64,8 @@ const setupOptionalDependencies = async ( if (!optionalDependencies.size) return; for (const dependencyName of optionalDependencies) dependencies.add(dependencyName); - log.info("for %s setup optional dependencies %o", name, dependencies); + if (topPackageName === name && installMode === "dev") return; + log.info("for %s setup optional dependencies %o", name, optionalDependencies); for (const dependencyName of optionalDependencies) { await processDependency( packageContext, dependencyName, userConfiguration, inputOptions, progressData, true