159 lines
4.9 KiB
CoffeeScript
159 lines
4.9 KiB
CoffeeScript
###!
|
|
* Compares two software version numbers (only number)
|
|
*
|
|
* @parse String newVer (e.g. "1.7.1" or "1.2.1").
|
|
* @parse String oldVer (e.g. "1.7.1" or "1.2.1").
|
|
* @return Object {
|
|
* gt:
|
|
* <,return -1
|
|
* =,return 0
|
|
* >,return 1
|
|
* error, return < -1
|
|
*
|
|
* lt:
|
|
* <,return 1
|
|
* =,return 0
|
|
* >,return -1
|
|
* error, return < -1
|
|
*
|
|
* clean:
|
|
* ['dfdsfd','1.0.1'] -> ['1.0.1']
|
|
* ['1.1.b','1.0.1'] -> ['1.0.1']
|
|
* ['1.1.b','1.0.1',12121] -> ['1.0.1']
|
|
*
|
|
* sort:
|
|
* ["1.7.0","1.7","1.ab.8","1.70.0","1.90","1.9.0","1.8"] ->
|
|
* ["1.7","1.7.0","1.8","1.9.0","1.70.0","1.90"]
|
|
*
|
|
* max:
|
|
* ["1.7.0","1.7","1.ab.8","1.70.0","1.90","1.9.0","1.8"] ->
|
|
* return "1.90"
|
|
*
|
|
* min:
|
|
* ["1.7.0","1.7","1.ab.8","1.70.0","1.90","1.9.0","1.8"] ->
|
|
* return "1.7"
|
|
*
|
|
* }
|
|
###
|
|
((root, factory)->
|
|
if typeof exports == 'object'
|
|
module.exports = factory()
|
|
|
|
else if typeof define == 'function' && define.amd
|
|
define(factory)
|
|
else
|
|
root.compareVer = factory()
|
|
)(this, ->
|
|
'use strict'
|
|
VER_RE = /(\d+\.){1,9}\d+/
|
|
_compare = (newVer,oldVer)->
|
|
# if arguments.length != 2
|
|
# return -100
|
|
if typeof newVer + typeof oldVer != 'stringstring'
|
|
return -2
|
|
newMatch = newVer.match(VER_RE)
|
|
oldMatch = oldVer.match(VER_RE)
|
|
if (not newMatch or newMatch[0] != newVer) or (not oldMatch or oldMatch[0] != oldVer)
|
|
return -3
|
|
newVer = newVer.replace(/^0/,'')
|
|
oldVer = oldVer.replace(/^0/,'')
|
|
|
|
if newVer == oldVer
|
|
return 0
|
|
else
|
|
newArr = newVer.split('.')
|
|
oldArr = oldVer.split('.')
|
|
newLen = newArr.length
|
|
oldLen = oldArr.length
|
|
maxLen = Math.max(newLen,oldLen)
|
|
zerofill = ->
|
|
newArr.length < maxLen && newArr.push('0')
|
|
oldArr.length < maxLen && oldArr.push('0')
|
|
newArr.length != oldArr.length && zerofill()
|
|
newLen != oldLen && zerofill()
|
|
if newArr.toString() == oldArr.toString()
|
|
return if newLen > oldLen then 1 else -1
|
|
else
|
|
isTrue = null
|
|
compareNum = ->
|
|
newNum = newArr.shift()
|
|
oldNum = oldArr.shift()
|
|
_newNum = ~~newNum
|
|
_oldNum = ~~oldNum
|
|
if _newNum == 0 and _oldNum == 0
|
|
isTrue = 0
|
|
else if _newNum > _oldNum
|
|
isTrue = 1
|
|
else if _newNum < _oldNum
|
|
isTrue = -1
|
|
else
|
|
isTrue = if newNum.length > oldNum.length then -1 else 1
|
|
_newNum == _oldNum && newArr.length > 0 && compareNum()
|
|
compareNum()
|
|
return isTrue
|
|
|
|
_compareVer = {
|
|
gt: ->
|
|
if arguments.length == 2
|
|
return _compare(arguments[0],arguments[1])
|
|
return -100
|
|
lt: ->
|
|
if arguments.length == 2
|
|
return _compare(arguments[1],arguments[0])
|
|
return -100
|
|
clean: ->
|
|
if arguments.length == 0
|
|
return false
|
|
tempArr = arguments[0]
|
|
len = tempArr.length
|
|
if len < 1
|
|
return []
|
|
else
|
|
_newArr = []
|
|
_clean = ->
|
|
_num = tempArr.shift()
|
|
if typeof _num == 'string'
|
|
_match = _num.match(VER_RE)
|
|
_match && _match[0] == _num && _newArr.push _num
|
|
tempArr.length > 0 && _clean()
|
|
_clean()
|
|
return _newArr
|
|
sort: ->
|
|
if arguments.length == 0
|
|
return false
|
|
tempArr = @clean(arguments[0])
|
|
if tempArr.length <= 1
|
|
return tempArr
|
|
else
|
|
return tempArr.sort (a,b)->
|
|
return _compare(a,b) == 1
|
|
max: ->
|
|
if arguments.length == 0
|
|
return false
|
|
tempArr = arguments[0]
|
|
if tempArr.length == 0
|
|
return false
|
|
else
|
|
tempArr = @clean(tempArr)
|
|
if tempArr.length == 0
|
|
return false
|
|
else
|
|
arr = @sort(tempArr)
|
|
return arr[arr.length - 1]
|
|
min: ->
|
|
if arguments.length == 0
|
|
return false
|
|
tempArr = arguments[0]
|
|
if tempArr.length == 0
|
|
return false
|
|
else
|
|
tempArr = @clean(tempArr)
|
|
if tempArr.length == 0
|
|
return false
|
|
else
|
|
return @sort(tempArr)[0]
|
|
|
|
}
|
|
return _compareVer
|
|
)
|