@cainiaofe/cn-utils
Version:
菜鸟前端基础工具库
80 lines (79 loc) • 3.1 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
var Semver = /** @class */ (function () {
function Semver() {
}
/**
* Get version precisions count
*
* @example
* getVersionPrecision("1.10.3") // 3
*
* @param {string} version
* @return {number}
*/
Semver.getVersionPrecision = function (version) {
return version.split('.').length;
};
/**
* Calculate browser version weight
*
* @example
* compareVersions('1.10.2.1', '1.8.2.1.90') // 1
* compareVersions('1.010.2.1', '1.09.2.1.90'); // 1
* compareVersions('1.10.2.1', '1.10.2.1'); // 0
* compareVersions('1.10.2.1', '1.0800.2'); // -1
* compareVersions('1.10.2.1', '1.10', true); // 0
*
* @param {String} versionA versions versions to compare
* @param {String} versionB versions versions to compare
* @param {boolean} [isLoose] enable loose comparison
* @return {Number} comparison result: -1 when versionA is lower,
* 1 when versionA is bigger, 0 when both equal
*/
/* eslint consistent-return: 1 */
Semver.compareVersions = function (versionA, versionB, isLoose) {
if (isLoose === void 0) { isLoose = false; }
// 1) get common precision for both versions, for example for "10.0" and "9" it should be 2
var versionAPrecision = Semver.getVersionPrecision(versionA);
var versionBPrecision = Semver.getVersionPrecision(versionB);
var precision = Math.max(versionAPrecision, versionBPrecision);
var lastPrecision = 0;
var chunks = [versionA, versionB].map(function (version) {
var delta = precision - Semver.getVersionPrecision(version);
// 2) "9" -> "9.0" (for precision = 2)
var _version = version + new Array(delta + 1).join('.0');
// 3) "9.0" -> ["000000000"", "000000009"]
return _version
.split('.')
.map(function (chunk) { return new Array(20 - chunk.length).join('0') + chunk; })
.reverse();
});
// adjust precision for loose comparison
if (isLoose) {
lastPrecision =
precision - Math.min(versionAPrecision, versionBPrecision);
}
// iterate in reverse order by reversed chunks array
precision -= 1;
while (precision >= lastPrecision) {
// 4) compare: "000000009" > "000000010" = false (but "9" > "10" = true)
if (chunks[0][precision] > chunks[1][precision]) {
return 1;
}
if (chunks[0][precision] === chunks[1][precision]) {
if (precision === lastPrecision) {
// all version chunks are same
return 0;
}
precision -= 1;
}
else if (chunks[0][precision] < chunks[1][precision]) {
return -1;
}
}
return undefined;
};
return Semver;
}());
exports.default = Semver;