ui/app/utils/parse-version.js

91 lines
1.7 KiB
JavaScript

import Semver from 'npm:semver';
export function satisfies(version, range) {
// Semver doesn't take padding zeros like 17.03.1
range = range.replace(/\.0+(\d+)/g,'.$1');
version = version.replace(/\.0+(\d+)/g,'.$1');
if ( !Semver.validRange(range) ) {
console.error('Invalid semver range:', range);
return false;
}
if ( !Semver.valid(version) ) {
console.error('Invalid semver version:', version);
return false;
}
return Semver.satisfies(version, range);
}
// @TODO replace with semver calls and verify compare works the same for -preX tags
export function parse(str) {
str = str+'';
// Trim off leading 'v'
if ( str.substr(0,1).toLowerCase() === 'v' )
{
str = str.substr(1);
}
let parts = str.split(/[.-]/);
return parts;
}
function isNumeric(str) {
return typeof str === 'string' && str.match(/^[0-9]*$/);
}
function comparePart(in1, in2) {
in1 = (in1+"").toLowerCase();
in2 = (in2+"").toLowerCase();
if ( isNumeric(in1) && isNumeric(in2) )
{
let num1 = parseInt(in1,10);
let num2 = parseInt(in2,10);
if ( !isNaN(num1) && !isNaN(num2) )
{
return num1 - num2;
}
}
return in1.localeCompare(in2);
}
export function compare(in1, in2) {
if ( !in1 ) {
return 1;
}
if ( !in2 ) {
return -1;
}
let p1 = parse(in1);
let p2 = parse(in2);
let minLen = Math.min(p1.length, p2.length);
for ( let i = 0 ; i < minLen ; i++ )
{
let res = comparePart(p1[i], p2[i]);
if ( res !== 0 )
{
return res;
}
}
return p1.length - p2.length;
}
export function minorVersion(str) {
let [major, minor /*, patch, pre*/] = parse(str);
if ( !minor )
{
return 'v'+ major +'.0';
}
return 'v' + major + '.' + minor;
}