Skip to content
This repository was archived by the owner on Feb 26, 2024. It is now read-only.

Commit d63ae98

Browse files
Merge pull request #5384 from trufflesuite/check-truffle-package-versions-on-change
Verify versions of @truffle dependencies on commit
2 parents 5326294 + 555763d commit d63ae98

File tree

3 files changed

+95
-6
lines changed

3 files changed

+95
-6
lines changed

package.json

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@
1212
"dependency-graph": "lerna-dependency-graph -f pdf -o dependency-graph.pdf",
1313
"solc-bump": "node ./scripts/solc-bump.js",
1414
"update": "lernaupdate",
15-
"depcheck": "lerna exec --stream --no-bail dependency-check --ignore @truffle/contract-tests --ignore @truffle/dashboard-message-bus-e2e-test -- --missing ."
15+
"depcheck": "lerna exec --stream --no-bail dependency-check --ignore @truffle/contract-tests --ignore @truffle/dashboard-message-bus-e2e-test -- --missing .",
16+
"check-truffle-namespace-dependency-versions": "node ./scripts/check-truffle-namespace-dependency-versions.js"
1617
},
1718
"devDependencies": {
1819
"@typescript-eslint/eslint-plugin": "^5.6.0",
@@ -37,6 +38,7 @@
3738
},
3839
"lint-staged": {
3940
"*.{js,ts,jsx,tsx}": "eslint --fix",
40-
"*.{js,ts,jsx,tsx,css,md}": "prettier --write"
41+
"*.{js,ts,jsx,tsx,css,md}": "prettier --write",
42+
"packages/*/package.json": "node ./scripts/check-truffle-namespace-dependency-versions.js"
4143
}
4244
}

packages/core/package.json

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,23 +24,23 @@
2424
"dependencies": {
2525
"@truffle/artifactor": "^4.0.163",
2626
"@truffle/box": "^2.1.54",
27-
"@truffle/codec": "^0.13.2",
27+
"@truffle/codec": "^0.13.3",
2828
"@truffle/compile-common": "^0.7.32",
2929
"@truffle/compile-solidity": "^6.0.37",
3030
"@truffle/config": "^1.3.34",
3131
"@truffle/contract": "^4.5.19",
32-
"@truffle/dashboard": "^0.1.9",
32+
"@truffle/dashboard": "^0.1.10",
3333
"@truffle/debug-utils": "^6.0.29",
3434
"@truffle/debugger": "^11.0.2",
3535
"@truffle/decoder": "^5.2.22",
3636
"@truffle/deployer": "^3.2.90",
3737
"@truffle/environment": "^0.2.117",
3838
"@truffle/error": "^0.1.0",
39-
"@truffle/expect": "^0.1.1",
39+
"@truffle/expect": "^0.1.2",
4040
"@truffle/fetch-and-compile": "^0.5.12",
4141
"@truffle/interface-adapter": "^0.5.20",
4242
"@truffle/migrate": "^3.3.4",
43-
"@truffle/plugins": "^0.2.7",
43+
"@truffle/plugins": "^0.2.8",
4444
"@truffle/preserve": "^0.2.7",
4545
"@truffle/promise-tracker": "^0.1.1",
4646
"@truffle/provider": "^0.2.58",
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
const fs = require("fs");
2+
const path = require("path");
3+
4+
const chalk = require("chalk");
5+
6+
const debug = require("debug")("check-package-versions");
7+
8+
function main() {
9+
const packages = readPackages();
10+
const errors = [];
11+
12+
for (const candidateName in packages) {
13+
for (const dependencyName in packages) {
14+
errors.push(
15+
...checkDependencyVersionRange(
16+
packages[candidateName],
17+
packages[dependencyName]
18+
)
19+
);
20+
}
21+
}
22+
23+
for (const error of errors) {
24+
console.error(chalk.red("Error:"), error);
25+
}
26+
const doneColor = errors.length > 0 ? chalk.red : chalk.green;
27+
console.error(
28+
doneColor("Done."),
29+
`Found ${errors.length} errors for @truffle namespace version dependencies.`
30+
);
31+
32+
if (errors.length > 0) {
33+
process.exit(1);
34+
}
35+
}
36+
37+
function getPackageDirectoryNames() {
38+
return fs.readdirSync(path.join(__dirname, "..", "packages"));
39+
}
40+
41+
function readPackages() {
42+
const packages = getPackageDirectoryNames();
43+
const packageSpecs = {};
44+
for (const packageName of packages) {
45+
const packageFilePath = path.join(
46+
path.resolve(__dirname, "..", "packages", packageName),
47+
"package.json"
48+
);
49+
const rawJson = fs.readFileSync(packageFilePath, { encoding: "utf8" });
50+
packageSpecs[packageName] = JSON.parse(rawJson);
51+
}
52+
53+
return packageSpecs;
54+
}
55+
56+
const depTypes = [
57+
"dependencies",
58+
"devDependencies",
59+
"peerDependencies",
60+
"optionalDependencies"
61+
];
62+
63+
function* checkDependencyVersionRange(candidate, dependency) {
64+
const name = dependency.name;
65+
const version = dependency.version;
66+
67+
for (const depType of depTypes) {
68+
const deps = candidate[depType];
69+
if (deps && Object.keys(deps).includes(name)) {
70+
const rawRange = deps[name];
71+
72+
if (rawRange !== `^${version}`) {
73+
yield `Package "${candidate.name}" depends on "${name}@${rawRange}", but range has not been updated for version ${version}`;
74+
} else {
75+
debug(
76+
`${candidate.name} requires ${name}@${version} (${rawRange} is up-to-date for version ${version})`
77+
);
78+
}
79+
} else {
80+
debug(`${candidate.name} does not require ${name}`);
81+
}
82+
}
83+
}
84+
85+
if (require.main === module) {
86+
main();
87+
}

0 commit comments

Comments
 (0)