semver-utils.js/semver-utils.js

152 lines
3.4 KiB
JavaScript

(function () {
"use strict";
// TODO break these down into escaped strings with meaningful comments and create using new RegExp()
// |optional 'v'
// | | 3 segment version
// | | |optional release prefixed by '-'
// | | | |optional build prefixed by '+'
var reSemver = /^v?((\d+)\.(\d+)\.(\d+))(?:-([\dA-Za-z\-]+(?:\.[\dA-Za-z\-]+)*))?(?:\+([\dA-Za-z\-]+(?:\.[\dA-Za-z\-]+)*))?$/
//, reSemverRange = /\s*((\|\||\-)|(([<>~]?=?)\s*(v)?([0-9]+)(\.(x|[0-9]+))?(\.(x|[0-9]+))?(([\-+])([a-zA-Z0-9\.]+))?))\s*/g
, reSemverRange = /\s*((\|\||\-)|(([<>~^]?=?)\s*(v)?([0-9]+)(\.(x|\*|[0-9]+))?(\.(x|\*|[0-9]+))?(([\-+])([a-zA-Z0-9\.]+))?))\s*/g
;
// Returns a new object with all of the undefined properties removed from the given object
function pruned(obj) {
var o = {};
for(var key in obj) {
if ('undefined' !== typeof obj[key]) {
o[key] = obj[key];
}
}
return o;
}
function stringifySemver(obj) {
var str = ''
;
str += obj.major || '0';
str += '.';
str += obj.minor || '0';
str += '.';
str += obj.patch || '0';
if (obj.release) {
str += '-' + obj.release;
}
if (obj.build) {
str += '+' + obj.build;
}
return str;
}
function stringifySemverRange(arr) {
var str = ''
;
function stringify(ver) {
if (ver.operator) {
str += ver.operator + ' ';
}
if (ver.major) {
str += ver.toString() + ' ';
}
}
arr.forEach(stringify);
return str.trim();
}
function SemVer(obj) {
if (!obj) {
return;
}
var me = this
;
Object.keys(obj).forEach(function (key) {
me[key] = obj[key];
});
}
SemVer.prototype.toString = function () {
return stringifySemver(this);
};
/*
function SemVerRange(obj) {
if (!obj) {
return;
}
var me = this
;
Object.keys(obj).forEach(function (key) {
me[key] = obj[key];
});
}
SemVerRange.prototype = [];
SemVerRange.prototype.toString = stringifySemverRange;
*/
function parseSemver(version) {
// semver, major, minor, patch
// https://github.com/mojombo/semver/issues/32
// https://github.com/isaacs/node-semver/issues/10
// optional v
var m = reSemver.exec(version) || []
, ver = new SemVer(pruned({
semver: m[0]
, version: m[1]
, major: m[2]
, minor: m[3]
, patch: m[4]
, release: m[5]
, build: m[6]
}))
;
if (0 === m.length) {
ver = null;
}
return ver;
}
function parseSemverRange(str) {
var m
, arr = []
, obj
;
while (m = reSemverRange.exec(str)) {
obj = {
semver: m[3]
, operator: m[4] || m[2]
, major: m[6]
, minor: m[8]
, patch: m[10]
};
if ('+' === m[12]) {
obj.build = m[13];
}
if ('-' === m[12]) {
obj.release = m[13];
}
arr.push(new SemVer(pruned(obj)));
//console.log(m);
}
//return new SemVerRange(arr);
return arr;
}
module.exports.parse = parseSemver;
module.exports.stringify = stringifySemver;
module.exports.parseRange = parseSemverRange;
module.exports.stringifyRange = stringifySemverRange;
}());