-
-
Save cowboy/566233 to your computer and use it in GitHub Desktop.
/*! | |
* isSemVer - v0.1 - 9/05/2010 | |
* http://benalman.com/ | |
* http://semver.org/ | |
* | |
* Copyright (c) 2010 "Cowboy" Ben Alman | |
* Dual licensed under the MIT and GPL licenses. | |
* http://benalman.com/about/license/ | |
*/ | |
// Compare one or more semantic version numbers to a reference version number. | |
// | |
// Returns true if all version criteria are met. Comparison operator defaults | |
// to == if omitted. Valid comparisons are == != < <= > >=. | |
// | |
// isSemVer( my.version, '1.2.3' ) // == is assumed if comparison op excluded | |
// isSemVer( my.version, '>= 1.2.3', '!= 1.2.4alpha' ) | |
// isSemVer( my.version, '< 2.0', '!= 1.2.3', '!= 1.2.4alpha' ) | |
// | |
var isSemVer = (function(){ | |
// This regexp matches an optional comparison operator, followed by optional | |
// whitespace and then a valid semantic version per http://semver.org/. | |
var re = /^(<|>|[=!<>]=)?\s*(\d+(?:\.\d+){0,2})([a-z][a-z0-9\-]*)?$/i; | |
// Returns a value that can be used in version comparison. Because a semantic | |
// version is comprised of 1 to 3 dot-separated numbers followed by an | |
// optional lexicographically-sorted alphanumeric suffix, it is easiest to | |
// convert the entire value into a single string that can be compared in a | |
// lexicographic fashion. Each dot-separated number is first left-padded by | |
// zeroes such that 1.2.3 -> 000000010000000200000003. This allows possible | |
// major / minor / patch versions between 0-99999999. The optional suffix is | |
// then appended, and if one was not provided, ~ will be used because it will | |
// always compare > than any suffix. | |
// | |
// If the include_cmp flag is set, the result value will be prepended with | |
// the specified comparison operator (or == if the operator was omitted). | |
function get_val( str, include_cmp ) { | |
// matches[1] = optional comparison operator. | |
// matches[2] = dot-separated major / minor / patch version. | |
// matches[3] = alphanumeric "special version" suffix. | |
var matches = ( str + '' ).match( re ); | |
return matches | |
// Include matched comparison operator, defaulting to == if necessary. | |
? ( include_cmp ? ( matches[1] || '==' ) : '' ) | |
// Since this string is going to be evaled, wrap it in quotes. | |
+ '"' | |
// In case version passed is like 1 or 1.0, right-pad it with extra .0 | |
+ ( matches[2] + '.0.0' ) | |
// Remove any unnecessary trailing .0 | |
.match( /\d+(?:\.\d+){0,2}/ )[0] | |
// Replace each dot-separated number with a 0-padded value. | |
.replace( /(?:^|\.)(\d+)/g, function(a,b){ | |
return Array( 9 - b.length ).join(0) + b; | |
}) | |
// Append suffix or ~ if suffix was omitted. | |
+ ( matches[3] || '~' ) | |
// Since this string is going to be evaled, wrap it in quotes. | |
+ '"' | |
// Handle an invalid semantic version / comparison. | |
: ( include_cmp ? '==0' : 1 ); | |
}; | |
return function( base_ver ) { | |
// Get the comparison value for the base version. | |
base_ver = get_val( base_ver ); | |
// Iterate over all additional function arguments. | |
for ( var arg, i = 1; arg = arguments[ i++ ]; ) { | |
// If any comparison fails, exit immediately with a false value. | |
if ( !(new Function( 'return ' + base_ver + get_val( arg, 1 ) ))() ) { | |
return false; | |
} | |
} | |
// All comparisons passed, return true! | |
return true; | |
}; | |
})(); |
/*! | |
* isSemVer - v0.1 - 9/05/2010 | |
* http://benalman.com/ | |
* http://semver.org/ | |
* | |
* Copyright (c) 2010 "Cowboy" Ben Alman | |
* Dual licensed under the MIT and GPL licenses. | |
* http://benalman.com/about/license/ | |
*/ | |
var isSemVer=(function(){var a=/^(<|>|[=!<>]=)?\s*(\d+(?:\.\d+){0,2})([a-z][a-z0-9\-]*)?$/i;function b(e,c){var d=(e+"").match(a);return d?(c?(d[1]||"=="):"")+'"'+(d[2]+".0.0").match(/\d+(?:\.\d+){0,2}/)[0].replace(/(?:^|\.)(\d+)/g,function(g,f){return Array(9-f.length).join(0)+f})+(d[3]||"~")+'"':(c?"==0":1)}return function(e){e=b(e);for(var c,d=1;c=arguments[d++];){if(!(new Function("return "+e+b(c,1)))()){return false}}return true}})(); |
Have you seen https://github.com/isaacs/npm/blob/master/lib/utils/semver.js at all?
I like the idea of using -
to test "between-ness" and using x
in a version like 2.x
or 2.x.x
as a shorthand for that. I'm not sure I understand why "~" is an alias for "*" though.
Much better than my crappy $.isVersion: https://github.com/kflorence/misc-js/blob/master/jquery/jquery.isVersion.js
Thanks @cowboy! I'm using this here : http://mozilla.github.io/server-side-tls/ssl-config-generator/
used in my phonegap app to notify updates by comparing current version and previous one stored in db, thanks @cowboy :) https://sresc.io/dA4
Can we get a version without new Function
as that makes it fail CSP. We need to pass script-src: 'unsafe-eval'
otherwise, and browser extensions dont allow this (Firefox). For example running this on github we get this error - http://i.imgur.com/MtLfhqx.png
Some basic unit tests: