Skip to content

Commit c34735a

Browse files
feat(findSolutions): Add a toggle to find solutions and print installation commands.
BREAKING CHANGE: no longer prints installation commands by default, instead prints a message about using --install
1 parent 3ce28d0 commit c34735a

File tree

3 files changed

+71
-44
lines changed

3 files changed

+71
-44
lines changed

src/checkPeerDependencies.ts

Lines changed: 64 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -51,24 +51,8 @@ const reportPeerDependencyStatusByDependee = (dep: Dependency, options: CliOptio
5151
}
5252
};
5353

54-
export function checkPeerDependencies(packageManager: string, options: CliOptions) {
55-
const allNestedPeerDependencies = getAllNestedPeerDependencies(options);
56-
57-
if (options.orderBy === 'depender') {
58-
allNestedPeerDependencies.sort((a, b) => `${a.depender}${a.name}`.localeCompare(`${b.depender}${b.name}`));
59-
allNestedPeerDependencies.forEach(dep => reportPeerDependencyStatusByDepender(dep, options));
60-
} else if (options.orderBy === 'dependee') {
61-
allNestedPeerDependencies.sort((a, b) => `${a.name}${a.depender}`.localeCompare(`${b.name}${b.depender}`));
62-
allNestedPeerDependencies.forEach(dep => reportPeerDependencyStatusByDependee(dep, options));
63-
}
64-
65-
const problems = allNestedPeerDependencies.filter(dep => !dep.semverSatisfies && !dep.isYalc);
66-
67-
if (!problems.length) {
68-
console.log(' ✅ All peer dependencies are met');
69-
return;
70-
}
7154

55+
function findSolutions(problems: Dependency[], allNestedPeerDependencies: Dependency[]) {
7256
console.log();
7357
console.log('Searching for solutions...');
7458
console.log();
@@ -89,40 +73,76 @@ export function checkPeerDependencies(packageManager: string, options: CliOption
8973
console.error();
9074
}
9175

92-
const commandLines = getCommandLines(packageManager, resolutionsWithSolutions);
93-
if (options.install && commandLines.length > 0) {
94-
console.log('Installing peerDependencies...');
76+
return { resolutionsWithSolutions, nosolution };
77+
}
78+
79+
function installPeerDependencies(commandLines: any[], options: CliOptions, nosolution: Resolution[], packageManager: string) {
80+
console.log('Installing peerDependencies...');
81+
console.log();
82+
commandLines.forEach(command => {
83+
console.log(`$ ${command}`);
84+
exec(command);
9585
console.log();
96-
commandLines.forEach(command => {
97-
console.log(`$ ${command}`);
98-
exec(command);
99-
console.log();
100-
});
86+
});
10187

102-
const newUnsatisfiedDeps = getAllNestedPeerDependencies(options)
103-
.filter(dep => !dep.semverSatisfies)
104-
.filter(dep => !nosolution.some(x => isSameDep(x.problem, dep)));
88+
const newUnsatisfiedDeps = getAllNestedPeerDependencies(options)
89+
.filter(dep => !dep.semverSatisfies)
90+
.filter(dep => !nosolution.some(x => isSameDep(x.problem, dep)));
10591

106-
if (nosolution.length === 0 && newUnsatisfiedDeps.length === 0) {
107-
console.log('All peer dependencies are met');
108-
}
92+
if (nosolution.length === 0 && newUnsatisfiedDeps.length === 0) {
93+
console.log('All peer dependencies are met');
94+
}
10995

110-
if (newUnsatisfiedDeps.length > 0) {
111-
console.log(`Found ${newUnsatisfiedDeps.length} new unmet peerDependencies...`);
112-
if (++recursiveCount < 5) {
113-
return checkPeerDependencies(packageManager, options);
114-
} else {
115-
console.error('Recursion limit reached (5)');
116-
process.exit(5)
117-
}
96+
if (newUnsatisfiedDeps.length > 0) {
97+
console.log(`Found ${newUnsatisfiedDeps.length} new unmet peerDependencies...`);
98+
if (++recursiveCount < 5) {
99+
return checkPeerDependencies(packageManager, options);
100+
} else {
101+
console.error('Recursion limit reached (5)');
102+
process.exit(5)
118103
}
104+
}
105+
return;
106+
}
107+
108+
export function checkPeerDependencies(packageManager: string, options: CliOptions) {
109+
const allNestedPeerDependencies = getAllNestedPeerDependencies(options);
110+
111+
if (options.orderBy === 'depender') {
112+
allNestedPeerDependencies.sort((a, b) => `${a.depender}${a.name}`.localeCompare(`${b.depender}${b.name}`));
113+
allNestedPeerDependencies.forEach(dep => reportPeerDependencyStatusByDepender(dep, options));
114+
} else if (options.orderBy === 'dependee') {
115+
allNestedPeerDependencies.sort((a, b) => `${a.name}${a.depender}`.localeCompare(`${b.name}${b.depender}`));
116+
allNestedPeerDependencies.forEach(dep => reportPeerDependencyStatusByDependee(dep, options));
117+
}
118+
119+
const problems = allNestedPeerDependencies.filter(dep => !dep.semverSatisfies && !dep.isYalc);
120+
121+
if (!problems.length) {
122+
console.log(' ✅ All peer dependencies are met');
119123
return;
124+
}
120125

121-
} else if (commandLines.length > 0) {
122-
console.log(`Install peerDependencies using ${commandLines.length > 1 ? 'these commands:' : 'this command'}:`);
123-
console.log();
124-
commandLines.forEach(command => console.log(command));
125-
console.log();
126+
if (options.install) {
127+
const { nosolution, resolutionsWithSolutions } = findSolutions(problems, allNestedPeerDependencies);
128+
const commandLines = getCommandLines(packageManager, resolutionsWithSolutions);
129+
130+
if (commandLines.length) {
131+
return installPeerDependencies(commandLines, options, nosolution, packageManager);
132+
}
133+
} else if (options.findSolutions) {
134+
const { resolutionsWithSolutions } = findSolutions(problems, allNestedPeerDependencies);
135+
const commandLines = getCommandLines(packageManager, resolutionsWithSolutions);
136+
137+
if (commandLines.length) {
138+
console.log(`Install peerDependencies using ${commandLines.length > 1 ? 'these commands:' : 'this command'}:`);
139+
console.log();
140+
commandLines.forEach(command => console.log(command));
141+
console.log();
142+
}
143+
} else {
144+
console.log(`Install peerDependencies using "npx check-peer-dependencies --install"`);
126145
}
146+
127147
process.exit(1);
128148
}

src/cli.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,11 @@ const options = yarrrrgs
3838
default: false,
3939
description: 'Run tool only on package root dependencies',
4040
})
41+
.option('findSolutions', {
42+
boolean: true,
43+
default: false,
44+
description: 'Search for solutions and print package installation commands',
45+
})
4146
.option('install', {
4247
boolean: true,
4348
default: false,
@@ -58,6 +63,7 @@ export interface CliOptions {
5863
npm: boolean;
5964
runOnlyOnRootDependencies: boolean;
6065
orderBy: 'depender' | 'dependee';
66+
findSolutions: boolean;
6167
install: boolean;
6268
}
6369

src/solution.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ export function findPossibleResolutions(problems: Dependency[], allPeerDependenc
3333

3434
function findPossibleResolution(packageName, allPeerDeps) {
3535
const requiredPeerVersions = allPeerDeps.filter(dep => dep.name === packageName);
36+
// todo: skip this step if only one required peer version and it's an exact version
3637
const command = `npm view ${packageName} versions`;
3738
let rawVersionsInfo;
3839
try {

0 commit comments

Comments
 (0)