remove semver dependency for plugins

Signed-off-by: si458 <simonsmith5521@gmail.com>

si458 committed Jun 10, 2025 at 18:01 UTC 960326ab40754351c5eba386765a01340cbc2b50
4 files changed +34 -7
docker/Dockerfile
+1 -1
@@ -121,7 +121,7 @@ RUN case "$PREINSTALL_LIBS" in \
121 true|yes|TRUE|YES) \
122 cd meshcentral && \
123 echo -e "----------\nPREINSTALLING LIBRARIES...\n----------"; \
124 - npm install ssh2@1.16.0 semver@7.7.1 nodemailer@6.10.0 image-size@2.0.1 wildleek@2.0.0 otplib@12.0.1 yubikeyotp@0.2.0;; \
124 + npm install ssh2@1.16.0 nodemailer@6.10.0 image-size@2.0.1 wildleek@2.0.0 otplib@12.0.1 yubikeyotp@0.2.0;; \
125 false|no|FALSE|NO) \
126 echo "Not pre-installing libraries.";; \
127 *) \
docker/README.md
+1 -1
@@ -174,7 +174,7 @@ The following build arguments are available for customizing the build process:
174 - **INCLUDE_MONGODB_TOOLS**: Include MongoDB client and related tools.
175 - **INCLUDE_POSTGRESQL_TOOLS**: Include PostgreSQL client tools.
176 - **INCLUDE_MARIADB_TOOLS**: Include MariaDB/MySQL client tools.
177 -- **PREINSTALL_LIBS**: Pre-install specific libraries like `ssh2`, `semver`, `nodemailer`, etc.
177 +- **PREINSTALL_LIBS**: Pre-install specific libraries like `ssh2`, `nodemailer`, etc.
178
179 ### Build Commands with Arguments
180
meshcentral.js
-1
@@ -4311,7 +4311,6 @@ function mainStart() {
4311 if (config.settings.acebase != null) { modules.push('acebase@1.29.5'); } // Add AceBase, official driver.
4312 if (config.settings.sqlite3 != null) { modules.push('sqlite3@5.1.7'); } // Add sqlite3, official driver.
4313 if (config.settings.vault != null) { modules.push('node-vault@0.10.2'); } // Add official HashiCorp's Vault module.
4314 - if ((config.settings.plugins != null) && (config.settings.plugins != false) && ((typeof config.settings.plugins != 'object') || (config.settings.plugins.enabled != false))) { modules.push('semver@7.7.1'); } // Required for version compat testing and update checks
4314 if ((config.settings.plugins != null) && (config.settings.plugins.proxy != null)) { modules.push('https-proxy-agent@7.0.2'); } // Required for HTTP/HTTPS proxy support
4315 else if (config.settings.xmongodb != null) { modules.push('mongojs@3.1.0'); } // Add MongoJS, old driver.
4316 if (nodemailer || ((config.smtp != null) && (config.smtp.name != 'console')) || (config.sendmail != null)) { modules.push('nodemailer@6.9.16'); } // Add SMTP support
pluginHandler.js
+32 -4
@@ -286,6 +286,36 @@ module.exports.pluginHandler = function (parent) {
286 return true;
287 }
288
289 + obj.versionGreater = function(a, b) {
290 + a = obj.versionToNumber(String(a).replace(/^v/, ''));
291 + b = obj.versionToNumber(String(b).replace(/^v/, ''));
292 + const partsA = a.split('.').map(Number);
293 + const partsB = b.split('.').map(Number);
294 +
295 + for (let i = 0; i < Math.max(partsA.length, partsB.length); i++) {
296 + const numA = partsA[i] || 0;
297 + const numB = partsB[i] || 0;
298 + if (numA > numB) return true;
299 + if (numA < numB) return false;
300 + }
301 + return false;
302 + };
303 +
304 + obj.versionLower = function(a, b) {
305 + a = obj.versionToNumber(String(a).replace(/^v/, ''));
306 + b = obj.versionToNumber(String(b).replace(/^v/, ''));
307 + const partsA = a.split('.').map(Number);
308 + const partsB = b.split('.').map(Number);
309 +
310 + for (let i = 0; i < Math.max(partsA.length, partsB.length); i++) {
311 + const numA = partsA[i] || 0;
312 + const numB = partsB[i] || 0;
313 + if (numA < numB) return true;
314 + if (numA > numB) return false;
315 + }
316 + return false;
317 + };
318 +
319 obj.getPluginLatest = function () {
320 return new Promise(function (resolve, reject) {
321 parent.db.getPlugins(function (err, plugins) {
@@ -305,12 +335,11 @@ module.exports.pluginHandler = function (parent) {
335 if (conf.configUrl == newconf.configUrl) curconf = conf;
336 });
337 if (curconf == null) reject("Some plugin configs could not be parsed");
308 - var s = require('semver');
338 latestRet.push({
339 'id': curconf._id,
340 'installedVersion': curconf.version,
341 'version': newconf.version,
313 - 'hasUpdate': s.gt(newconf.version, curconf.version),
342 + 'hasUpdate': obj.versionGreater(newconf.version, curconf.version),
343 'meshCentralCompat': obj.versionCompare(parent.currentVer, newconf.meshCentralCompat),
344 'changelogUrl': curconf.changelogUrl,
345 'status': curconf.status
@@ -484,9 +513,8 @@ module.exports.pluginHandler = function (parent) {
513 try {
514 var vers = JSON.parse(versStr);
515 var vList = [];
487 - var s = require('semver');
516 vers.forEach((v) => {
489 - if (s.lt(v.name, plugin.version)) vList.push(v);
517 + if (obj.versionLower(v.name, plugin.version)) vList.push(v);
518 });
519 if (vers.length == 0) reject("No previous versions available.");
520 resolve({ 'id': plugin._id, 'name': plugin.name, versionList: vList });