You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
nodebb/src/meta/dependencies.js

82 lines
2.6 KiB
JavaScript

10 years ago
'use strict';
9 years ago
var path = require('path');
var fs = require('fs');
var async = require('async');
var semver = require('semver');
var winston = require('winston');
require('colors');
10 years ago
9 years ago
var pkg = require('../../package.json');
10 years ago
module.exports = function (Meta) {
10 years ago
Meta.dependencies = {};
var depsMissing = false;
var depsOutdated = false;
10 years ago
Meta.dependencies.check = function (callback) {
9 years ago
var modules = Object.keys(pkg.dependencies);
8 years ago
10 years ago
winston.verbose('Checking dependencies for outdated modules');
async.each(modules, Meta.dependencies.checkModule, function (err) {
8 years ago
if (err) {
return callback(err);
}
if (depsMissing) {
callback(new Error('dependencies-missing'));
} else if (depsOutdated) {
callback(global.env !== 'development' ? new Error('dependencies-out-of-date') : null);
} else {
callback(null);
}
10 years ago
});
};
Meta.dependencies.checkModule = function (moduleName, callback) {
fs.readFile(path.join(__dirname, '../../node_modules/', moduleName, 'package.json'), {
encoding: 'utf-8',
}, function (err, pkgData) {
if (err) {
// If a bundled plugin/theme is not present, skip the dep check (#3384)
if (err.code === 'ENOENT' && (moduleName === 'nodebb-rewards-essentials' || moduleName.startsWith('nodebb-plugin') || moduleName.startsWith('nodebb-theme'))) {
winston.warn('[meta/dependencies] Bundled plugin ' + moduleName + ' not found, skipping dependency check.');
return callback(null, true);
}
return callback(err);
}
pkgData = Meta.dependencies.parseModuleData(moduleName, pkgData);
var satisfies = Meta.dependencies.doesSatisfy(pkgData, pkg.dependencies[moduleName]);
callback(null, satisfies);
});
};
Meta.dependencies.parseModuleData = function (moduleName, pkgData) {
try {
pkgData = JSON.parse(pkgData);
} catch (e) {
winston.warn('[' + 'missing'.red + '] ' + moduleName.bold + ' is a required dependency but could not be found\n');
depsMissing = true;
return null;
}
return pkgData;
};
Meta.dependencies.doesSatisfy = function (moduleData, packageJSONVersion) {
if (!moduleData) {
return false;
}
var versionOk = !semver.validRange(packageJSONVersion) || semver.satisfies(moduleData.version, packageJSONVersion);
var githubRepo = moduleData._resolved && moduleData._resolved.indexOf('//github.com') !== -1;
var satisfies = versionOk || githubRepo;
if (!satisfies) {
winston.warn('[' + 'outdated'.yellow + '] ' + moduleData.name.bold + ' installed v' + moduleData.version + ', package.json requires ' + packageJSONVersion + '\n');
depsOutdated = true;
}
return satisfies;
};
};