Skip to content

Commit 9ddcfc1

Browse files
committed
feat: support includePrerelease option
1 parent edb0bbb commit 9ddcfc1

File tree

7 files changed

+44
-10
lines changed

7 files changed

+44
-10
lines changed

src/checkPeerDependencies/peerDependencies.spec.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,7 @@ describe("findSolutions", () => {
175175
const { resolutionsWithSolutions, nosolution } = findSolutions(
176176
mockProblems,
177177
mockAllNestedPeerDependencies,
178+
{ ...DEFAULT_VALUE },
178179
);
179180

180181
expect(resolutionsWithSolutions).toEqual([mockResolutions[0]]);

src/checkPeerDependencies/peerDependencies.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,11 +48,13 @@ export function getAllNestedPeerDependencies(
4848
export function findSolutions(
4949
problems: Dependency[],
5050
allNestedPeerDependencies: Dependency[],
51+
options: CliOptions,
5152
): { resolutionsWithSolutions: Resolution[]; nosolution: Resolution[] } {
5253
printSearchMessage(problems.length);
5354
const resolutions: Resolution[] = findPossibleResolutions(
5455
problems,
5556
allNestedPeerDependencies,
57+
options,
5658
);
5759
const resolutionsWithSolutions = getResolutionsWithSolutions(resolutions);
5860
const nosolution = getNoSolutionResolutions(resolutions);
@@ -129,6 +131,7 @@ export function checkPeerDependencies(options: CliOptions): void {
129131
const { nosolution, resolutionsWithSolutions } = findSolutions(
130132
problems,
131133
allNestedPeerDependencies,
134+
options,
132135
);
133136
const commandLines = getCommandLines(resolutionsWithSolutions);
134137

@@ -139,6 +142,7 @@ export function checkPeerDependencies(options: CliOptions): void {
139142
const { resolutionsWithSolutions } = findSolutions(
140143
problems,
141144
allNestedPeerDependencies,
145+
options,
142146
);
143147
const commandLines = getCommandLines(resolutionsWithSolutions);
144148

src/constants.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,5 @@ export const DEFAULT_VALUE = Object.freeze({
1111
runOnlyOnRootDependencies: false,
1212
findSolutions: false,
1313
install: false,
14+
includePrerelease: true,
1415
});

src/index.ts

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -67,10 +67,12 @@ export function getCliArgv() {
6767
description: "Install missing or incorrect peerDependencies",
6868
},
6969
})
70-
// .option({
71-
// includePrerelease: { type: "boolean", default: false },
72-
// })
73-
70+
.option({
71+
includePrerelease: {
72+
type: "boolean",
73+
default: DEFAULT_VALUE.includePrerelease,
74+
},
75+
})
7476
.parseSync();
7577
return argv satisfies CliOptions;
7678
}

src/solution/solution.spec.ts

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { describe, it, expect, vi } from "vitest";
2+
import { DEFAULT_VALUE } from "../constants";
23
import type { Dependency } from "../packageUtils";
34
import {
45
getUniqueProblems,
@@ -151,17 +152,36 @@ describe("semverReverseSort", () => {
151152
});
152153

153154
describe("findPossibleResolution", () => {
154-
it("should find a possible resolution for a package", () => {
155+
it("should find a possible resolution for a package with pre-release", () => {
155156
const packageName = "dep1";
156157
const allPeerDeps: Dependency[] = [defaultDependency];
157158

158159
vi.mocked(mocks.execSync).mockReturnValueOnce(
159-
JSON.stringify(["2.0.1", "1.0.0", "3.0.0", "1.5.2"]),
160+
JSON.stringify(["2.0.1", "1.0.0", "3.0.0", "1.5.2-beta.1"]),
160161
);
161162

162-
const resolution = findPossibleResolution(packageName, allPeerDeps);
163+
const resolution = findPossibleResolution(packageName, allPeerDeps, {
164+
...DEFAULT_VALUE,
165+
includePrerelease: true,
166+
});
163167

164-
expect(resolution).toBe("1.5.2");
168+
expect(resolution).toBe("1.5.2-beta.1");
169+
});
170+
171+
it("should find a possible resolution for a package without pre-release", () => {
172+
const packageName = "dep1";
173+
const allPeerDeps: Dependency[] = [defaultDependency];
174+
175+
vi.mocked(mocks.execSync).mockReturnValueOnce(
176+
JSON.stringify(["2.0.1", "1.0.0", "3.0.0", "1.5.2-beta.1"]),
177+
);
178+
179+
const resolution = findPossibleResolution(packageName, allPeerDeps, {
180+
...DEFAULT_VALUE,
181+
includePrerelease: false,
182+
});
183+
184+
expect(resolution).toBe("1.0.0");
165185
});
166186
});
167187

src/solution/solution.ts

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { execSync } from "node:child_process";
22
import semver from "semver";
33
import type { Dependency } from "../packageUtils/types";
4+
import type { CliOptions } from "../types";
45
import type { Resolution } from "./types";
56

67
export function getUniqueProblems(problems: Dependency[]): Dependency[] {
@@ -39,6 +40,7 @@ export function semverReverseSort(a: string, b: string) {
3940
export function findPossibleResolution(
4041
packageName: string,
4142
allPeerDeps: Dependency[],
43+
options: CliOptions,
4244
) {
4345
const requiredPeerVersions = allPeerDeps.filter(
4446
(dep) => dep.name === packageName,
@@ -56,7 +58,7 @@ export function findPossibleResolution(
5658
return availableVersions.find((ver: string) =>
5759
requiredPeerVersions.every((peerVer) => {
5860
return semver.satisfies(ver, peerVer.version, {
59-
includePrerelease: true,
61+
includePrerelease: options.includePrerelease,
6062
});
6163
}),
6264
);
@@ -72,8 +74,9 @@ export function findPossibleResolution(
7274
export function determineResolutionVersion(
7375
problem: Dependency,
7476
allPeerDependencies: Dependency[],
77+
options: CliOptions,
7578
): string {
76-
return findPossibleResolution(problem.name, allPeerDependencies);
79+
return findPossibleResolution(problem.name, allPeerDependencies, options);
7780
}
7881

7982
export function formatResolution(
@@ -86,6 +89,7 @@ export function formatResolution(
8689
export function findPossibleResolutions(
8790
problems: Dependency[],
8891
allPeerDependencies: Dependency[],
92+
options: CliOptions,
8993
): Resolution[] {
9094
const uniqProblems = getUniqueProblems(problems);
9195

@@ -94,6 +98,7 @@ export function findPossibleResolutions(
9498
const resolutionVersion = determineResolutionVersion(
9599
problem,
96100
allPeerDependencies,
101+
options,
97102
);
98103
const resolution = formatResolution(problem, resolutionVersion);
99104
return { problem, resolution, resolutionType } as Resolution;

src/types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,5 @@ export interface CliOptions {
1111
orderBy: OrderBy;
1212
findSolutions: boolean;
1313
install: boolean;
14+
includePrerelease: boolean;
1415
}

0 commit comments

Comments
 (0)