134 lines
4.0 KiB
JavaScript
134 lines
4.0 KiB
JavaScript
import assert from 'node:assert'
|
||
|
||
const log = console
|
||
|
||
function parseVersion (version) {
|
||
const matched = version.match(/^v?(\d{1,2}\.\d{1,2}\.\d{1,3}(?:\.\d{1,2})?)(.*)$/)
|
||
const versionArr = matched[1].split('.')
|
||
return {
|
||
major: Number.parseInt(versionArr[0]), // 大版本
|
||
minor: Number.parseInt(versionArr[1]), // 中版本
|
||
patch: Number.parseInt(versionArr[2]), // 小版本
|
||
temp: Number.parseInt(versionArr[3]) || 0, // 临时版本
|
||
pre: matched[2], // 预发布版本号
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 比较版本号
|
||
*
|
||
* @param onlineVersion 线上版本号
|
||
* @param currentVersion 当前版本号
|
||
* @returns {number} 比较线上版本号是否为更新版本,1=是|0=相等|-1=否|-99=出现异常,比较结果未知
|
||
*/
|
||
function isNewVersion (onlineVersion, currentVersion) {
|
||
if (onlineVersion === currentVersion) {
|
||
return 0
|
||
}
|
||
|
||
try {
|
||
const versionObj = parseVersion(onlineVersion)
|
||
const curVersionObj = parseVersion(currentVersion)
|
||
|
||
// 大版本
|
||
if (versionObj.major > curVersionObj.major) {
|
||
return 1 // 大版本号更大,为新版本,需要更新
|
||
} else if (versionObj.major < curVersionObj.major) {
|
||
return -1 // 大版本号更小,为旧版本,无需更新
|
||
}
|
||
|
||
// 中版本
|
||
if (versionObj.minor > curVersionObj.minor) {
|
||
return 2 // 中版本号更大,为新版本,需要更新
|
||
} else if (versionObj.minor < curVersionObj.minor) {
|
||
return -2 // 中版本号更小,为旧版本,无需更新
|
||
}
|
||
|
||
// 小版本
|
||
if (versionObj.patch > curVersionObj.patch) {
|
||
return 3 // 小版本号更大,为新版本,需要更新
|
||
} else if (versionObj.patch < curVersionObj.patch) {
|
||
return -3 // 小版本号更小,为旧版本,无需更新
|
||
}
|
||
|
||
// 临时版本号
|
||
if (versionObj.temp > curVersionObj.temp) {
|
||
return 4 // 临时版本号更大,为新版本,需要更新
|
||
} else if (versionObj.temp < curVersionObj.temp) {
|
||
return -4 // 临时版本号更小,为旧版本,无需更新
|
||
}
|
||
|
||
// 预发布版本号
|
||
if (versionObj.pre && curVersionObj.pre) {
|
||
// 当两个后缀版本号都存在时,直接比较后缀版本号字符串的大小
|
||
if (versionObj.pre > curVersionObj.pre) {
|
||
return 51
|
||
} else if (versionObj.pre < curVersionObj.pre) {
|
||
return -51
|
||
}
|
||
} else if (!versionObj.pre && curVersionObj.pre) {
|
||
// 线上版本号没有后缀版本号,说明为正式版本,为新版本,需要更新
|
||
return 52
|
||
} else if (versionObj.pre && !curVersionObj.pre) {
|
||
return -52
|
||
} else {
|
||
return -53 // 相同版本,无需更新(一般不会出现,除非例如 `2.0.0` 和 `2.0.0.0` 进行比较)
|
||
}
|
||
} catch (e) {
|
||
log.error(`比对版本失败,当前版本号:${currentVersion},线上版本号:${onlineVersion}, error:`, e)
|
||
return -99 // 比对异常
|
||
}
|
||
}
|
||
|
||
let ret;
|
||
|
||
ret = isNewVersion('2.0.0', '1.0.0')
|
||
console.log(ret)
|
||
assert.strictEqual(ret, 1)
|
||
ret = isNewVersion('1.0.0', '2.0.0')
|
||
console.log(ret)
|
||
assert.strictEqual(ret, -1)
|
||
|
||
ret = isNewVersion('2.1.0', '2.0.0')
|
||
console.log(ret)
|
||
assert.strictEqual(ret, 2)
|
||
ret = isNewVersion('2.0.0', '2.1.0')
|
||
console.log(ret)
|
||
assert.strictEqual(ret, -2)
|
||
|
||
ret = isNewVersion('2.0.1', '2.0.0')
|
||
console.log(ret)
|
||
assert.strictEqual(ret, 3)
|
||
ret = isNewVersion('2.0.0', '2.0.1')
|
||
console.log(ret)
|
||
assert.strictEqual(ret, -3)
|
||
|
||
ret = isNewVersion('2.0.0.1', '2.0.0')
|
||
console.log(ret)
|
||
assert.strictEqual(ret, 4)
|
||
ret = isNewVersion('2.0.0', '2.0.0.1')
|
||
console.log(ret)
|
||
assert.strictEqual(ret, -4)
|
||
|
||
ret = isNewVersion('2.0.0-RC2', '2.0.0-RC1')
|
||
console.log(ret)
|
||
assert.strictEqual(ret, 51)
|
||
ret = isNewVersion('2.0.0-RC1', '2.0.0-RC2')
|
||
console.log(ret)
|
||
assert.strictEqual(ret, -51)
|
||
|
||
ret = isNewVersion('2.0.0', '2.0.0-RC1')
|
||
console.log(ret)
|
||
assert.strictEqual(ret, 52)
|
||
ret = isNewVersion('2.0.0-RC1', '2.0.0')
|
||
console.log(ret)
|
||
assert.strictEqual(ret, -52)
|
||
|
||
ret = isNewVersion('2.0.0.0', '2.0.0')
|
||
console.log(ret)
|
||
assert.strictEqual(ret, -53)
|
||
|
||
ret = isNewVersion('x', 'v')
|
||
console.log(ret)
|
||
assert.strictEqual(ret, -99)
|