Skip to content

Commit 862232e

Browse files
feat(debug): Added a --debug cli flag
This option prints each package.json that is parsed, and the peer deps found in each one
1 parent c35f300 commit 862232e

File tree

3 files changed

+35
-16
lines changed

3 files changed

+35
-16
lines changed

src/checkPeerDependencies.ts

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,13 @@
22
import * as semver from 'semver';
33

44
import { exec } from 'shelljs';
5+
import { CliOptions } from './cli';
56
import { getCommandLines } from './packageManager';
67
import { Dependency, gatherPeerDependencies, getInstalledVersion } from './packageUtils';
78
import { findPossibleResolutions } from './solution';
89

9-
function getAllNestedPeerDependencies() {
10-
const gatheredDependencies = gatherPeerDependencies(".");
10+
function getAllNestedPeerDependencies(options: CliOptions) {
11+
const gatheredDependencies = gatherPeerDependencies(".", options);
1112

1213
const allNestedPeerDependencies: Dependency[] = gatheredDependencies.map(dep => {
1314
const installedVersion = getInstalledVersion(dep);
@@ -22,8 +23,8 @@ function getAllNestedPeerDependencies() {
2223

2324
let recursiveCount = 0;
2425

25-
export function checkPeerDependencies(packageManager: string, installMissingPeerDependencies: boolean) {
26-
const allNestedPeerDependencies = getAllNestedPeerDependencies();
26+
export function checkPeerDependencies(packageManager: string, options: CliOptions) {
27+
const allNestedPeerDependencies = getAllNestedPeerDependencies(options);
2728

2829
allNestedPeerDependencies.forEach(dep => {
2930
if (dep.semverSatisfies) {
@@ -66,7 +67,7 @@ export function checkPeerDependencies(packageManager: string, installMissingPeer
6667
}
6768

6869
const commandLines = getCommandLines(packageManager, installs, upgrades);
69-
if (installMissingPeerDependencies && commandLines.length > 0) {
70+
if (options.install && commandLines.length > 0) {
7071
console.log('Installing peerDependencies...');
7172
console.log();
7273
commandLines.forEach(command => {
@@ -75,7 +76,7 @@ export function checkPeerDependencies(packageManager: string, installMissingPeer
7576
console.log();
7677
});
7778

78-
const newUnsatisfiedDeps = getAllNestedPeerDependencies()
79+
const newUnsatisfiedDeps = getAllNestedPeerDependencies(options)
7980
.filter(dep => !dep.semverSatisfies)
8081
.filter(dep => !nosolution.some(x => isSameDep(x.problem, dep)));
8182

@@ -86,7 +87,7 @@ export function checkPeerDependencies(packageManager: string, installMissingPeer
8687
if (newUnsatisfiedDeps.length > 0) {
8788
console.log(`Found ${newUnsatisfiedDeps.length} new unmet peerDependencies...`);
8889
if (++recursiveCount < 5) {
89-
return checkPeerDependencies(packageManager, installMissingPeerDependencies);
90+
return checkPeerDependencies(packageManager, options);
9091
} else {
9192
console.error('Recursion limit reached (5)');
9293
process.exit(5)

src/cli.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,10 @@ const options: CliOptions = yarrrrgs
1818
boolean: true,
1919
description: `Use npm package manager`,
2020
})
21+
.option('debug', {
22+
boolean: true,
23+
description: 'Print debugging information'
24+
})
2125
.option('install', {
2226
boolean: true,
2327
description: 'Install missing or incorrect peerDependencies'
@@ -32,6 +36,7 @@ const options: CliOptions = yarrrrgs
3236
export interface CliOptions {
3337
help: boolean;
3438
yarn: boolean;
39+
debug: boolean;
3540
npm: boolean;
3641
install: boolean;
3742
}
@@ -41,4 +46,4 @@ if (options.help) {
4146
}
4247

4348
const packageManager = getPackageManager(options.yarn, options.npm);
44-
checkPeerDependencies(packageManager, options.install);
49+
checkPeerDependencies(packageManager, options);

src/packageUtils.ts

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import * as fs from 'fs';
22
import * as path from "path";
33
import * as resolve from 'resolve';
4+
import { CliOptions } from './cli';
45
import { readJson } from './readJson';
56

67
interface PackageJson {
@@ -37,20 +38,27 @@ interface PackageDependencies {
3738

3839
type DependencyWalkVisitor = (packagePath: string, packageJson: PackageJson, packageDependencies: PackageDependencies) => void;
3940

40-
export function gatherPeerDependencies(packagePath): Dependency[] {
41+
export function gatherPeerDependencies(packagePath, options: CliOptions): Dependency[] {
4142
let peerDeps = [];
42-
43-
walkPackageDependencyTree(packagePath, (path, json, deps) => {
44-
peerDeps = peerDeps.concat(deps.peerDependencies)
45-
}, []);
43+
const visitor: DependencyWalkVisitor = (path, json, deps) => {
44+
peerDeps = peerDeps.concat(deps.peerDependencies);
45+
};
46+
walkPackageDependencyTree(packagePath, visitor, [], options);
4647

4748
// Eliminate duplicates
49+
const isSame = (dep: Dependency, dep2: Dependency) => {
50+
return dep.name === dep2.name
51+
&& dep.version === dep2.version
52+
&& dep.depender === dep2.depender
53+
&& dep.dependerVersion === dep2.dependerVersion;
54+
};
55+
4856
return peerDeps.reduce((acc: Dependency[], dep: Dependency) => {
49-
return acc.some(dep2 => dep.name === dep2.name && dep.version === dep2.version) ? acc : acc.concat(dep);
57+
return acc.some(dep2 => isSame(dep, dep2)) ? acc : acc.concat(dep);
5058
}, [] as Dependency[])
5159
}
5260

53-
export function walkPackageDependencyTree(packagePath: string, visitor: DependencyWalkVisitor, visitedPaths: string[]) {
61+
export function walkPackageDependencyTree(packagePath: string, visitor: DependencyWalkVisitor, visitedPaths: string[], options: CliOptions) {
5462
if (visitedPaths.includes(packagePath)) {
5563
return;
5664
}
@@ -65,6 +73,10 @@ export function walkPackageDependencyTree(packagePath: string, visitor: Dependen
6573
const packageJson = readJson(packageJsonPath) as PackageJson;
6674
const packageDependencies = getPackageDependencies(packagePath, packageJson);
6775

76+
if (options.debug) {
77+
console.log(packageJsonPath);
78+
packageDependencies.peerDependencies.forEach(dep => console.log(dep))
79+
}
6880
visitor(packagePath, packageJson, packageDependencies);
6981

7082
function walkDependency(dependency) {
@@ -76,7 +88,7 @@ export function walkPackageDependencyTree(packagePath: string, visitor: Dependen
7688
if (!dependencyPath) {
7789
throw new Error(`Unable to resolve package ${dependency.name} from ${packagePath}`)
7890
}
79-
walkPackageDependencyTree(dependencyPath, visitor, visitedPaths);
91+
walkPackageDependencyTree(dependencyPath, visitor, visitedPaths, options);
8092
}
8193

8294
packageDependencies.dependencies.forEach(walkDependency);
@@ -121,6 +133,7 @@ export function resolvePackageDir(basedir: string, packageName: string) {
121133
// As long as we have a packagePath, it's fine
122134
}
123135

136+
// noinspection JSUnusedAssignment
124137
return packagePath;
125138
}
126139

0 commit comments

Comments
 (0)