Skip to content

Commit

Permalink
feat: Install dev dependencies only for top package or on update all
Browse files Browse the repository at this point in the history
  • Loading branch information
medikoo committed Dec 9, 2019
1 parent 9cc55c3 commit 723de72
Showing 1 changed file with 32 additions and 10 deletions.
42 changes: 32 additions & 10 deletions lib/private/setup-dependencies/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,23 +4,42 @@ 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,
inputOptions,
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
);
Expand All @@ -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(
Expand All @@ -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
Expand Down

0 comments on commit 723de72

Please sign in to comment.