UNPKG

payload

Version:

Node, React, Headless CMS and Application Framework built on Next.js

77 lines (76 loc) 3 kB
// @ts-strict-ignore export function parseVersion(version) { const [mainVersion, ...preReleases] = version.split('-'); const parts = mainVersion.split('.').map(Number); return { parts, preReleases }; } function extractNumbers(str) { const matches = str.match(/\d+/g) || []; return matches.map(Number); } function comparePreRelease(v1, v2) { const num1 = extractNumbers(v1); const num2 = extractNumbers(v2); for(let i = 0; i < Math.max(num1.length, num2.length); i++){ if ((num1[i] || 0) < (num2[i] || 0)) { return -1; } if ((num1[i] || 0) > (num2[i] || 0)) { return 1; } } // If numeric parts are equal, compare the whole string if (v1 < v2) { return -1; } if (v1 > v2) { return 1; } return 0; } /** * Compares two semantic version strings, including handling pre-release identifiers. * * This function first compares the major, minor, and patch components as integers. * If these components are equal, it then moves on to compare pre-release versions. * Pre-release versions are compared first by extracting and comparing any numerical values. * If numerical values are equal, it compares the whole pre-release string lexicographically. * * @param {string} compare - The first version string to compare. * @param {string} to - The second version string to compare. * @param {function} [customVersionParser] - An optional function to parse version strings into parts and pre-releases. * @returns {string} - Returns greater if compare is greater than to, lower if compare is less than to, and equal if they are equal. */ export function compareVersions(compare, to, customVersionParser) { const { parts: parts1, preReleases: preReleases1 } = customVersionParser ? customVersionParser(compare) : parseVersion(compare); const { parts: parts2, preReleases: preReleases2 } = customVersionParser ? customVersionParser(to) : parseVersion(to); // Compare main version parts for(let i = 0; i < Math.max(parts1.length, parts2.length); i++){ if ((parts1[i] || 0) > (parts2[i] || 0)) { return 'greater'; } if ((parts1[i] || 0) < (parts2[i] || 0)) { return 'lower'; } } // Compare pre-release parts if main versions are equal if (preReleases1?.length || preReleases2?.length) { for(let i = 0; i < Math.max(preReleases1.length, preReleases2.length); i++){ if (!preReleases1[i]) { return 'greater'; } if (!preReleases2[i]) { return 'lower'; } const result = comparePreRelease(preReleases1[i], preReleases2[i]); if (result !== 0) { return result === 1 ? 'greater' : 'lower'; } // Equal => continue for loop to check for next pre-release part } } return 'equal'; } //# sourceMappingURL=versionUtils.js.map