Skip to content

Commit 6ef3021

Browse files
fix: Install peer deps as devDependencies if the peer dep came from a dev dependency
fix: Properly install dev dependencies when using npm as the package manager Closes #21
1 parent 01d75dc commit 6ef3021

File tree

2 files changed

+20
-17
lines changed

2 files changed

+20
-17
lines changed

src/packageManager.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,12 @@ export function getCommandLines(packageManager: string, resolutions: Resolution[
2424
if (upgrades.length) {
2525
commands.push(`yarn upgrade ${upgrades.join(' ')}`);
2626
}
27-
} else if (packageManager === 'npm' && (installs.length || upgrades.length)) {
27+
} else if (packageManager === 'npm' && (installs.length || upgrades.length || devInstalls.length)) {
2828
if (installs.length || upgrades.length) {
2929
commands.push(`npm install ${installs.concat(upgrades).join(' ')}`);
3030
}
3131
if (devInstalls.length) {
32-
commands.push(`npm install -D ${installs.concat(upgrades).join(' ')}`);
32+
commands.push(`npm install -D ${devInstalls}`);
3333
}
3434
}
3535
return commands;

src/packageUtils.ts

Lines changed: 18 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -31,11 +31,13 @@ interface PackageJson {
3131
};
3232
}
3333

34+
export type DependencyType = 'dependencies' | 'devDependencies' | 'peerDependencies' | 'optionalDependencies';
35+
3436
export interface Dependency {
3537
name: string;
3638
version: string;
3739
depender: PackageMeta;
38-
type: 'dependencies' | 'devDependencies' | 'peerDependencies' | 'optionalDependencies';
40+
type: DependencyType
3941
isPeerOptionalDependency: boolean;
4042
isPeerDevDependency: boolean;
4143
installedVersion?: string | undefined;
@@ -61,15 +63,15 @@ export function gatherPeerDependencies(packagePath, options: CliOptions): Depend
6163
const visitor: DependencyWalkVisitor = (path, json, deps) => {
6264
peerDeps = peerDeps.concat(deps.peerDependencies);
6365
};
64-
walkPackageDependencyTree(packagePath, visitor, [], options);
66+
walkPackageDependencyTree(packagePath, false, visitor, [], options);
6567

6668
// Eliminate duplicates
6769
return peerDeps.reduce((acc: Dependency[], dep: Dependency) => {
6870
return acc.some(dep2 => isSameDep(dep, dep2)) ? acc : acc.concat(dep);
6971
}, [] as Dependency[]);
7072
}
7173

72-
export function walkPackageDependencyTree(packagePath: string, visitor: DependencyWalkVisitor, visitedPaths: string[], options: CliOptions) {
74+
export function walkPackageDependencyTree(packagePath: string, isAncestorDevDependency: boolean, visitor: DependencyWalkVisitor, visitedPaths: string[], options: CliOptions) {
7375
const isRootPackage = visitedPaths.length === 0;
7476

7577
if (visitedPaths.includes(packagePath)) {
@@ -84,15 +86,16 @@ export function walkPackageDependencyTree(packagePath: string, visitor: Dependen
8486
}
8587

8688
const packageJson = readJson(packageJsonPath) as PackageJson;
87-
const packageDependencies = getPackageMeta(packagePath, packageJson);
89+
const packageDependencies = getPackageMeta(packagePath, packageJson, isAncestorDevDependency);
8890

8991
if (options.debug) {
9092
console.log(packageJsonPath);
9193
packageDependencies.peerDependencies.forEach(dep => console.log(dep))
9294
}
95+
9396
visitor(packagePath, packageJson, packageDependencies);
9497

95-
function walkDependency(dependency) {
98+
function walkDependency(dependency: Dependency, isAncestorDevDependency: boolean) {
9699
if (resolve.isCore(dependency.name)) {
97100
return;
98101
}
@@ -111,14 +114,14 @@ export function walkPackageDependencyTree(packagePath: string, visitor: Dependen
111114
}
112115
}
113116

114-
walkPackageDependencyTree(dependencyPath, visitor, visitedPaths, options);
117+
walkPackageDependencyTree(dependencyPath, isAncestorDevDependency, visitor, visitedPaths, options);
115118
}
116119

117-
if (isRootPackage) packageDependencies.devDependencies.forEach(walkDependency);
118-
if (isRootPackage || !options.runOnlyOnRootDependencies) packageDependencies.dependencies.forEach(walkDependency)
120+
if (isRootPackage) packageDependencies.devDependencies.forEach(dep => walkDependency(dep, true));
121+
if (isRootPackage || !options.runOnlyOnRootDependencies) packageDependencies.dependencies.forEach(dep => walkDependency (dep, false));
119122
}
120123

121-
function buildDependencyArray(type: Dependency["type"], pkgJson: PackageJson, depender: PackageMeta): Dependency[] {
124+
function buildDependencyArray(type: Dependency["type"], pkgJson: PackageJson, depender: PackageMeta, isAncestorDevDependency: boolean): Dependency[] {
122125
const dependenciesObject = pkgJson[type] || {};
123126
const peerDependenciesMeta = pkgJson.peerDependenciesMeta || {};
124127
// backwards compat
@@ -128,7 +131,7 @@ function buildDependencyArray(type: Dependency["type"], pkgJson: PackageJson, de
128131

129132
return packageNames.map(name => {
130133
const isPeerOptionalDependency= !!peerDependenciesMeta[name]?.optional;
131-
const isPeerDevDependency = !!peerDependenciesMeta[name]?.dev || !!peerDevDependencies.includes(name);
134+
const isPeerDevDependency = isAncestorDevDependency || !!peerDependenciesMeta[name]?.dev || !!peerDevDependencies.includes(name);
132135

133136
return {
134137
name,
@@ -141,14 +144,14 @@ function buildDependencyArray(type: Dependency["type"], pkgJson: PackageJson, de
141144
});
142145
}
143146

144-
export function getPackageMeta(packagePath: string, packageJson: PackageJson): PackageMeta {
147+
export function getPackageMeta(packagePath: string, packageJson: PackageJson, isAncestorDevDependency: boolean): PackageMeta {
145148
const { name, version} = packageJson;
146149
const packageMeta = { name, version, packagePath } as PackageMeta;
147150

148-
packageMeta.dependencies = buildDependencyArray("dependencies", packageJson, packageMeta);
149-
packageMeta.devDependencies = buildDependencyArray("devDependencies", packageJson, packageMeta);
150-
packageMeta.optionalDependencies = buildDependencyArray("optionalDependencies", packageJson, packageMeta);
151-
packageMeta.peerDependencies = buildDependencyArray("peerDependencies", packageJson, packageMeta);
151+
packageMeta.dependencies = buildDependencyArray("dependencies", packageJson, packageMeta, isAncestorDevDependency);
152+
packageMeta.devDependencies = buildDependencyArray("devDependencies", packageJson, packageMeta, isAncestorDevDependency);
153+
packageMeta.optionalDependencies = buildDependencyArray("optionalDependencies", packageJson, packageMeta, isAncestorDevDependency);
154+
packageMeta.peerDependencies = buildDependencyArray("peerDependencies", packageJson, packageMeta, isAncestorDevDependency);
152155

153156
return packageMeta;
154157
}

0 commit comments

Comments
 (0)