Skip to content

Commit 5994c9c

Browse files
feat: Add support for ignoring peer dependencies (via cli option or config stored in package.json)
1 parent e2f0fee commit 5994c9c

File tree

3 files changed

+33
-17
lines changed

3 files changed

+33
-17
lines changed

src/checkPeerDependencies.ts

Lines changed: 25 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,19 @@ function getAllNestedPeerDependencies(options: CliOptions): Dependency[] {
1818
return { ...dep, installedVersion, semverSatisfies, isYalc };
1919
}
2020

21-
return gatheredDependencies.map(applySemverInformation);
21+
function applyIgnoreInformation (dep: Dependency): Dependency {
22+
const isIgnored = options.ignore.includes(dep.name)
23+
return {...dep, isIgnored}
24+
}
25+
26+
return gatheredDependencies.map(applySemverInformation).map(applyIgnoreInformation);
2227
}
2328

2429
let recursiveCount = 0;
2530

26-
const reportPeerDependencyStatus = (dep: Dependency, byDepender: boolean, showSatisfiedDep: boolean, showOptionalDep: boolean) => {
31+
const isProblem = (dep: Dependency) => !dep.semverSatisfies && !dep.isIgnored && !dep.isYalc && !dep.isPeerOptionalDependency;
32+
33+
const reportPeerDependencyStatus = (dep: Dependency, byDepender: boolean, showSatisfiedDep: boolean, verbose: boolean) => {
2734
const message = byDepender ?
2835
`${dep.depender.name}@${dep.depender.version} requires ${dep.name} ${dep.version}` :
2936
`${dep.name} ${dep.version} is required by ${dep.depender.name}@${dep.depender.version}`;
@@ -35,14 +42,18 @@ const reportPeerDependencyStatus = (dep: Dependency, byDepender: boolean, showSa
3542
} else if (dep.isYalc) {
3643
console.log(` ☑️ ${message} (${dep.installedVersion} is installed via yalc)`);
3744
} else if (dep.installedVersion && dep.isPeerOptionalDependency) {
38-
if (showOptionalDep) {
39-
console.log(` ☑️ ${message}) OPTIONAL (${dep.installedVersion} is installed)`);
45+
if (verbose) {
46+
console.log(` ☑️ ${message}) OPTIONAL (${dep.installedVersion} is installed)`);
47+
}
48+
} else if (dep.isIgnored) {
49+
if (verbose) {
50+
console.log(` ☑️ ${message} IGNORED (${dep.name} is not installed)`);
4051
}
4152
} else if (dep.installedVersion) {
4253
console.log(` ❌ ${message}) (${dep.installedVersion} is installed)`);
4354
} else if (dep.isPeerOptionalDependency) {
44-
if (showOptionalDep) {
45-
console.log(` ☑️ ${message} OPTIONAL (${dep.name} is not installed)`);
55+
if (verbose) {
56+
console.log(` ☑️ ${message} OPTIONAL (${dep.name} is not installed)`);
4657
}
4758
} else {
4859
console.log(` ❌ ${message} (${dep.name} is not installed)`);
@@ -82,16 +93,16 @@ function installPeerDependencies(commandLines: any[], options: CliOptions, nosol
8293
console.log();
8394
});
8495

85-
const newUnsatisfiedDeps = getAllNestedPeerDependencies(options)
86-
.filter(dep => !dep.semverSatisfies)
96+
const newProblems = getAllNestedPeerDependencies(options)
97+
.filter(dep => isProblem(dep))
8798
.filter(dep => !nosolution.some(x => isSameDep(x.problem, dep)));
8899

89-
if (nosolution.length === 0 && newUnsatisfiedDeps.length === 0) {
100+
if (nosolution.length === 0 && newProblems.length === 0) {
90101
console.log('All peer dependencies are met');
91102
}
92103

93-
if (newUnsatisfiedDeps.length > 0) {
94-
console.log(`Found ${newUnsatisfiedDeps.length} new unmet peerDependencies...`);
104+
if (newProblems.length > 0) {
105+
console.log(`Found ${newProblems.length} new unmet peerDependencies...`);
95106
if (++recursiveCount < 5) {
96107
return checkPeerDependencies(packageManager, options);
97108
} else {
@@ -110,19 +121,17 @@ function report(options: CliOptions, allNestedPeerDependencies: Dependency[]) {
110121
}
111122

112123
allNestedPeerDependencies.forEach(dep => {
113-
const isUnsatisfied = (dep: Dependency) => !dep.semverSatisfies && !dep.isYalc;
114124
const relatedPeerDeps = allNestedPeerDependencies.filter(other => other.name === dep.name && other !== dep);
115-
const showIfSatisfied = options.verbose || relatedPeerDeps.some(isUnsatisfied);
116-
const showOptionalDep = options.verbose;
117-
reportPeerDependencyStatus(dep, options.orderBy === 'depender', showIfSatisfied, showOptionalDep);
125+
const showIfSatisfied = options.verbose || relatedPeerDeps.some(dep => isProblem(dep));
126+
reportPeerDependencyStatus(dep, options.orderBy === 'depender', showIfSatisfied, options.verbose);
118127
});
119128
}
120129

121130
export function checkPeerDependencies(packageManager: string, options: CliOptions) {
122131
const allNestedPeerDependencies = getAllNestedPeerDependencies(options);
123132
report(options, allNestedPeerDependencies);
124133

125-
const problems = allNestedPeerDependencies.filter(dep => !dep.semverSatisfies && !dep.isYalc && !dep.isPeerOptionalDependency);
134+
const problems = allNestedPeerDependencies.filter(dep => isProblem(dep));
126135

127136
if (!problems.length) {
128137
console.log(' ✅ All peer dependencies are met');

src/cli.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,12 @@ const options = yarrrrgs
3535
default: false,
3636
description: 'Prints every peer dependency, even those that are met',
3737
})
38+
.option('ignore', {
39+
string: true,
40+
array: true,
41+
default: [],
42+
description: 'package name to ignore (may specify multiple)',
43+
})
3844
.option('runOnlyOnRootDependencies', {
3945
boolean: true,
4046
default: false,
@@ -63,6 +69,7 @@ export interface CliOptions {
6369
verbose: boolean;
6470
debug: boolean;
6571
npm: boolean;
72+
ignore: string[];
6673
runOnlyOnRootDependencies: boolean;
6774
orderBy: 'depender' | 'dependee';
6875
findSolutions: boolean;

src/packageUtils.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ export interface Dependency {
4141
installedVersion?: string | undefined;
4242
semverSatisfies?: boolean;
4343
isYalc?: boolean;
44+
isIgnored?: boolean;
4445
}
4546

4647
interface PackageMeta {
@@ -184,7 +185,6 @@ export function getInstalledVersion(dep: Dependency): string | undefined {
184185
return isYalc ? `${packageJson.version}-yalc` : packageJson.version;
185186
}
186187

187-
188188
export function isSameDep(a: Dependency, b: Dependency) {
189189
const keys: Array<keyof Dependency> = [ "name", "version", "installedVersion", "semverSatisfies", "isYalc", "isPeerDevDependency", ];
190190
return keys.every(key => a[key] === b[key]) &&

0 commit comments

Comments
 (0)