UNPKG

u-semver

Version:

A micro parser and version resolver for Semantic Version

138 lines (110 loc) 4.07 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _slicedToArray = (function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; })(); exports.resolve = resolve; var SEMVER_RX = /^([\^\~])?(\d+)\.(\d+)\.(\d+)(-(\w+)(\.(\d+))?)?$/; var BASE_SEMVER_RX = /^(\d+).(\d+).(\d+)/; var MULTIPLIERS = [1000000, 1000, 10, 0, 1]; var first = function first(xs) { return xs[0]; }; var last = function last(xs) { return xs[xs.length - 1]; }; var find = function find(f, xs) { return first(xs.filter(f)); }; var isNumber = function isNumber(x) { return !isNaN(x); }; var toInt = function toInt(x) { return +x; }; var toValidIntMatches = function toValidIntMatches(x) { return x.match(SEMVER_RX).slice(1).map(toInt).filter(isNumber); }; var filterVersion = function filterVersion(filters) { return function (x) { return toValidIntMatches(x).reduce(function (acc, y, i) { return acc && (filters[i] !== undefined ? y >= filters[i] : true); }, true); }; }; var isPreRelease = function isPreRelease(x) { return (/(alpha|beta)/.test(x) ); }; var allowsPreRelease = function allowsPreRelease(x) { return x && x.indexOf('-') >= 0; }; var getBaseSemVer = function getBaseSemVer(x) { return x.match(BASE_SEMVER_RX)[0]; }; function semVerToNum(x) { var matches = toValidIntMatches(x); var reducer = function reducer(acc, y, i) { return acc + y * MULTIPLIERS[i]; }; return matches.reduce(reducer, 0); } var sort = exports.sort = function sort(xs) { return xs.slice().sort(sortSemVer); }; function sortSemVer(a, b) { var _map = [a, b].map(semVerToNum); var _map2 = _slicedToArray(_map, 2); var valueA = _map2[0]; var valueB = _map2[1]; var _map3 = [a, b].map(getBaseSemVer); var _map4 = _slicedToArray(_map3, 2); var baseA = _map4[0]; var baseB = _map4[1]; // check pre-release precedence when bases are equal if (baseA === baseB) { if (/beta/.test(a) && /alpha/.test(b)) { return 1; } if (/alpha/.test(a) && /beta/.test(b) || isPreRelease(a) && !isPreRelease(b)) { return -1; } } return valueA - valueB; } function findLatest(xs) { var sorted = sort(xs); var latest = last(sorted); return allowsPreRelease(latest) ? find(function (x) { return x === latest.split('-')[0]; }, xs) || latest : latest; } var findPattern = function findPattern(xs, pattern, filters) { return findLatest(xs.filter(function (x) { return RegExp(pattern).test(x); }).filter(filterVersion(filters))); }; // (range: string, versions: list<string>, pre: boolean) -> string function resolve(range, versions, pre) { if (range === 'latest') { return findLatest(versions); } var _SEMVER_RX$exec = SEMVER_RX.exec(range); var _SEMVER_RX$exec2 = _slicedToArray(_SEMVER_RX$exec, 7); var root = _SEMVER_RX$exec2[0]; var prefix = _SEMVER_RX$exec2[1]; var major = _SEMVER_RX$exec2[2]; var minor = _SEMVER_RX$exec2[3]; var patch = _SEMVER_RX$exec2[4]; var partial = _SEMVER_RX$exec2[5]; var beta = _SEMVER_RX$exec2[6]; if (!prefix) { // match exact value return find(function (v) { return v === root; }, versions); } var pattern = prefix === '^' ? '^(' + major + ')\\.(\\d+)\\.(\\d+)' : '^(' + major + ')\\.(' + minor + ')\\.(\\d+)'; var filters = [major, minor, patch, partial, beta]; return pre ? findPattern(versions, pattern + '(-(\\w+)(\\.(\\d+))?)?$', filters) : findPattern(versions, pattern + '$', filters); }