-
Notifications
You must be signed in to change notification settings - Fork 379
Expand file tree
/
Copy pathverifyPatternflyVersions.js
More file actions
75 lines (67 loc) · 2.75 KB
/
verifyPatternflyVersions.js
File metadata and controls
75 lines (67 loc) · 2.75 KB
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
69
70
71
72
73
74
75
/* eslint-disable no-console */
const semver = require('semver');
const { detectProjects } = require("lerna/utils");
// '@patternfly/patternfly': {'4.0.4': ['@patternfly/react-styles', ...]},
// '@patternfly/react-core': {'^4.0.3': ['@patternfly/react-docs', ...]]
const patternflyDeps = {};
const otherDeps = ['typescript', 'tslib'];
async function accumulateDependencies(package, dependencies) {
if (!dependencies) {
return;
}
Object.entries(dependencies)
.filter(([dep, _version]) => dep.startsWith('@patternfly') || otherDeps.includes(dep))
.forEach(([dep, version]) => {
patternflyDeps[dep] = patternflyDeps[dep] || {};
patternflyDeps[dep][version] = patternflyDeps[dep][version] || [];
patternflyDeps[dep][version].push(package);
});
}
function setDependency(dependencies, package, version) {
if (dependencies && dependencies[package]) {
dependencies[package] = version;
}
}
async function verifyPatternflyVersions() {
const { projectGraph, projectFileMap } = await detectProjects();
Object.values(projectGraph.nodes).forEach((node) => {
const package = node.package;
accumulateDependencies(package.name, { [package.name]: `^${package.version}` });
accumulateDependencies(package.name, package.dependencies);
accumulateDependencies(package.name, package.devDependencies);
});
let failed = false;
const mismatchedVersions = Object.entries(patternflyDeps).filter(
([_dep, versions]) => Object.keys(versions).length > 1
);
mismatchedVersions.forEach(([dep, versions]) => {
failed = true;
console.error(`Mismatching versions for ${dep}:`);
Object.entries(versions).forEach(([version, packages]) => console.error(`${version}: ${packages.join(' ')}`));
});
if (process.argv[2] === '--fix') {
mismatchedVersions.forEach(([dep, versions]) => {
const highestVersion = Object.keys(versions)
.sort((a, b) => semver.compare(a.replace(/^\^/, ''), b.replace(/^\^/, '')))
.pop();
Object.keys(versions)
.filter((version) => version !== highestVersion)
.map((version) => versions[version])
.forEach((mismatchedPackages) => {
console.log(`Writing ${dep}@${highestVersion}:`);
mismatchedPackages
.map((package) => projectGraph.nodes[package])
.forEach((package) => {
console.log(package.package.manifestLocation);
setDependency(package.package.dependencies, dep, highestVersion);
setDependency(package.package.devDependencies, dep, highestVersion);
package.package.serialize();
});
});
});
} else if (failed) {
console.error('\nRun script again with --fix to bump to latest version');
process.exit(1);
}
}
verifyPatternflyVersions();