49 lines
1.7 KiB
JavaScript
49 lines
1.7 KiB
JavaScript
(function exposeVersionHelpers(root, factory) {
|
|
const helpers = factory();
|
|
if (typeof module === "object" && module.exports) module.exports = helpers;
|
|
if (root) root.RMMVersions = helpers;
|
|
})(typeof globalThis !== "undefined" ? globalThis : this, function createVersionHelpers() {
|
|
function parseSemVer(value) {
|
|
const match = String(value || "").trim().match(/^v?(\d+)\.(\d+)\.(\d+)(?:-([0-9A-Za-z.-]+))?(?:\+[0-9A-Za-z.-]+)?$/);
|
|
if (!match) return null;
|
|
return {
|
|
major: Number(match[1]),
|
|
minor: Number(match[2]),
|
|
patch: Number(match[3]),
|
|
prerelease: match[4] ? match[4].split(".") : [],
|
|
};
|
|
}
|
|
|
|
function comparePrerelease(left, right) {
|
|
if (!left.length && !right.length) return 0;
|
|
if (!left.length) return 1;
|
|
if (!right.length) return -1;
|
|
const length = Math.max(left.length, right.length);
|
|
for (let index = 0; index < length; index += 1) {
|
|
const a = left[index];
|
|
const b = right[index];
|
|
if (a === undefined) return -1;
|
|
if (b === undefined) return 1;
|
|
if (a === b) continue;
|
|
const aNumber = /^\d+$/.test(a);
|
|
const bNumber = /^\d+$/.test(b);
|
|
if (aNumber && bNumber) return Number(a) < Number(b) ? -1 : 1;
|
|
if (aNumber !== bNumber) return aNumber ? -1 : 1;
|
|
return a < b ? -1 : 1;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
function compareSemVer(leftValue, rightValue) {
|
|
const left = parseSemVer(leftValue);
|
|
const right = parseSemVer(rightValue);
|
|
if (!left || !right) return null;
|
|
for (const key of ["major", "minor", "patch"]) {
|
|
if (left[key] !== right[key]) return left[key] < right[key] ? -1 : 1;
|
|
}
|
|
return comparePrerelease(left.prerelease, right.prerelease);
|
|
}
|
|
|
|
return { parseSemVer, compareSemVer };
|
|
});
|