rittenhop-ghost/versions/5.94.2/node_modules/compare-ver/index.coffee

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
)