-
Notifications
You must be signed in to change notification settings - Fork 12k
/
peer-deps-check.mts
68 lines (55 loc) · 1.94 KB
/
peer-deps-check.mts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
/**
* @license
* Copyright Google LLC All Rights Reserved.
*
* Use of this source code is governed by an MIT-style license that can be
* found in the LICENSE file at https://angular.io/license
*/
import semver from 'semver';
/** Path to the current directory. */
/** Describes a parsed `package.json` file. */
export interface PackageJson {
name?: string;
peerDependencies?: Record<string, string>;
}
export async function checkPeerDependencies(
newVersion: semver.SemVer,
allPackages: PackageJson[],
): Promise<string[]> {
const { major, minor } = newVersion;
const isPrerelease = !!newVersion.prerelease[0];
const isMajor = minor === 0;
let expectedFwPeerDep = `^${major}.0.0`;
if (isMajor && isPrerelease) {
expectedFwPeerDep += ` || ^${major}.0.0-next.0`;
} else if (isPrerelease) {
expectedFwPeerDep += ` || ^${major}.${minor}.0-next.0`;
}
const failures: string[] = [];
for (const pkgInfo of allPackages) {
failures.push(...checkPackage(pkgInfo, expectedFwPeerDep));
}
return failures;
}
/** Checks the given package and collects errors for the peer dependency ranges. */
function checkPackage(pkgJson: PackageJson, expectedFwPeerDep: string): string[] {
if (pkgJson.peerDependencies === undefined) {
return [];
}
const failures: string[] = [];
for (const [depName, range] of Object.entries(pkgJson.peerDependencies)) {
// Even though `ng-packagr` might not strictly follow the same release schedules
// like official Angular packages, we generally expect it to match. It's better
// flagging it than silently passing pre-checks. The caretaker can always forcibly
// ignore this check.
if (!depName.startsWith('@angular/') && depName !== 'ng-packagr') {
continue;
}
if (range !== expectedFwPeerDep) {
failures.push(
`${pkgJson.name}: Unexpected peer dependency range for "${depName}". Expected: ${expectedFwPeerDep}`,
);
}
}
return failures;
}