mirror of
https://github.com/NodeBB/NodeBB.git
synced 2025-10-26 08:36:12 +01:00
feat: #7743, meta/dependencies
This commit is contained in:
@@ -1,59 +1,51 @@
|
||||
'use strict';
|
||||
|
||||
var path = require('path');
|
||||
var fs = require('fs');
|
||||
var async = require('async');
|
||||
var semver = require('semver');
|
||||
var winston = require('winston');
|
||||
const path = require('path');
|
||||
const fs = require('fs');
|
||||
const util = require('util');
|
||||
const readFileAsync = util.promisify(fs.readFile);
|
||||
|
||||
const semver = require('semver');
|
||||
const winston = require('winston');
|
||||
require('colors');
|
||||
|
||||
var pkg = require('../../package.json');
|
||||
const pkg = require('../../package.json');
|
||||
|
||||
var Dependencies = module.exports;
|
||||
const Dependencies = module.exports;
|
||||
|
||||
var depsMissing = false;
|
||||
var depsOutdated = false;
|
||||
let depsMissing = false;
|
||||
let depsOutdated = false;
|
||||
|
||||
Dependencies.check = function (callback) {
|
||||
var modules = Object.keys(pkg.dependencies);
|
||||
Dependencies.check = async function () {
|
||||
const modules = Object.keys(pkg.dependencies);
|
||||
|
||||
winston.verbose('Checking dependencies for outdated modules');
|
||||
|
||||
async.each(modules, Dependencies.checkModule, function (err) {
|
||||
if (err) {
|
||||
return callback(err);
|
||||
}
|
||||
await Promise.all(modules.map(module => Dependencies.checkModule(module)));
|
||||
|
||||
if (depsMissing) {
|
||||
callback(new Error('dependencies-missing'));
|
||||
} else if (depsOutdated) {
|
||||
callback(global.env !== 'development' ? new Error('dependencies-out-of-date') : null);
|
||||
} else {
|
||||
callback(null);
|
||||
}
|
||||
});
|
||||
if (depsMissing) {
|
||||
throw new Error('dependencies-missing');
|
||||
} else if (depsOutdated && global.env !== 'development') {
|
||||
throw new Error('dependencies-out-of-date');
|
||||
}
|
||||
};
|
||||
|
||||
var pluginNamePattern = /^(@.*?\/)?nodebb-(theme|plugin|widget|rewards)-.*$/;
|
||||
|
||||
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' && pluginNamePattern.test(moduleName)) {
|
||||
winston.warn('[meta/dependencies] Bundled plugin ' + moduleName + ' not found, skipping dependency check.');
|
||||
return callback(null, true);
|
||||
}
|
||||
return callback(err);
|
||||
}
|
||||
const pluginNamePattern = /^(@.*?\/)?nodebb-(theme|plugin|widget|rewards)-.*$/;
|
||||
|
||||
Dependencies.checkModule = async function (moduleName) {
|
||||
try {
|
||||
let pkgData = await readFileAsync(path.join(__dirname, '../../node_modules/', moduleName, 'package.json'), 'utf8');
|
||||
pkgData = Dependencies.parseModuleData(moduleName, pkgData);
|
||||
|
||||
var satisfies = Dependencies.doesSatisfy(pkgData, pkg.dependencies[moduleName]);
|
||||
callback(null, satisfies);
|
||||
});
|
||||
const satisfies = Dependencies.doesSatisfy(pkgData, pkg.dependencies[moduleName]);
|
||||
return satisfies;
|
||||
} catch (err) {
|
||||
if (err.code === 'ENOENT' && pluginNamePattern.test(moduleName)) {
|
||||
winston.warn('[meta/dependencies] Bundled plugin ' + moduleName + ' not found, skipping dependency check.');
|
||||
return true;
|
||||
}
|
||||
throw err;
|
||||
}
|
||||
};
|
||||
|
||||
Dependencies.parseModuleData = function (moduleName, pkgData) {
|
||||
@@ -71,9 +63,9 @@ 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.includes('//github.com');
|
||||
var satisfies = versionOk || githubRepo;
|
||||
const versionOk = !semver.validRange(packageJSONVersion) || semver.satisfies(moduleData.version, packageJSONVersion);
|
||||
const githubRepo = moduleData._resolved && moduleData._resolved.includes('//github.com');
|
||||
const satisfies = versionOk || githubRepo;
|
||||
if (!satisfies) {
|
||||
winston.warn('[' + 'outdated'.yellow + '] ' + moduleData.name.bold + ' installed v' + moduleData.version + ', package.json requires ' + packageJSONVersion + '\n');
|
||||
depsOutdated = true;
|
||||
|
||||
Reference in New Issue
Block a user