@fto-consult/node-utils
Version:
Bibliothèque d'outils pour application nodeJS
56 lines (47 loc) • 1.57 kB
JavaScript
/***
compare two npm packages versions
@param {string} current, current version
@param {string} other, other version
@param {options} options object :
@return {int}, if 0 then versions are equals, if -1 then current are less than other if 1 then current are greater than other
*/
module.exports = function compareNPMVersions(v1, v2, options) {
v1 = typeof v1 =="string" && v1 || '';
v2 = typeof v2 =="string" && v2 || "";
var lexicographical = options && options.lexicographical,
zeroExtend = options && options.zeroExtend,
v1parts = v1.split('.'),
v2parts = v2.split('.');
function isValidPart(x) {
return (lexicographical ? /^\d+[A-Za-z]*$/ : /^\d+$/).test(x);
}
if (!v1parts.every(isValidPart) || !v2parts.every(isValidPart)) {
return NaN;
}
if (zeroExtend) {
while (v1parts.length < v2parts.length) v1parts.push("0");
while (v2parts.length < v1parts.length) v2parts.push("0");
}
if (!lexicographical) {
v1parts = v1parts.map(Number);
v2parts = v2parts.map(Number);
}
for (var i = 0; i < v1parts.length; ++i) {
if (v2parts.length == i) {
return 1;
}
if (v1parts[i] == v2parts[i]) {
continue;
}
else if (v1parts[i] > v2parts[i]) {
return 1;
}
else {
return -1;
}
}
if (v1parts.length != v2parts.length) {
return -1;
}
return 0;
}