Skip to content

Commit 0a3862b

Browse files
committed
CLI: Use semver to validate that CLI dependencies actually satisfy the required version, see #637
1 parent d2a97bb commit 0a3862b

File tree

1 file changed

+9
-3
lines changed

1 file changed

+9
-3
lines changed

cli/util.js

+9-3
Original file line numberDiff line numberDiff line change
@@ -78,21 +78,27 @@ exports.setup = function() {
7878
// find out which modules are missing
7979
var pkg = require(path.join(__dirname, "..", "package.json"));
8080
var install = [];
81+
var semver;
8182
pkg.cliDependencies.forEach(function(name) {
83+
var version = pkg.dependencies[name] || pkg.devDependencies[name];
8284
try {
83-
require.resolve(name + "/package.json"); // jsdoc has no main file
85+
var mPath = require.resolve(name + "/package.json"); // jsdoc has no main file
86+
var mPkg = JSON.parse(fs.readFileSync(mPath));
87+
if (semver && !semver.satisfies(mPkg.version, version))
88+
throw Error(mPkg.version + " is outdated");
8489
} catch (e) {
85-
var version = pkg.dependencies[name] || pkg.devDependencies[name];
90+
process.stderr.write("installing " + name + "@" + version + " (" + e.message + ")\n");
8691
install.push(version ? name + "@" + version : name);
8792
}
93+
if (name === "semver")
94+
semver = require("semver");
8895
});
8996
if (!install.length) {
9097
try { fs.rmdirSync(path.join(__dirname, "node_modules")); } catch (e) {}
9198
return;
9299
}
93100

94101
// if any are missing, install them. this relies on an empty package.json in cli/.
95-
process.stderr.write("installing CLI dependencies: " + install.join(", ") + "\n");
96102
child_process.execSync("npm --silent install " + install.join(" "), {
97103
cwd: __dirname,
98104
stdio: "ignore"

0 commit comments

Comments
 (0)