-
-
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: