-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathversion.ts
119 lines (106 loc) · 3.11 KB
/
version.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
function toVersionNumber(segment: string) {
const num = parseInt(segment, 10);
if (Number.isNaN(num)) {
return 0;
}
return num;
}
function getVersionSegment(version: string, index: number) {
const segments = version.split('.');
return toVersionNumber(segments[index]);
}
/**
* get major version number from version string
* @param version
*/
export function getMajorVersion(version: string): number {
return getVersionSegment(version, 0);
}
/**
* get minor version number from version string
* @param version
*/
export function getMinorVersion(version: string): number {
return getVersionSegment(version, 1);
}
/**
* get patch version number from version string
* @param version
*/
export function getPatchVersion(version: string): number {
return getVersionSegment(version, 2);
}
/**
* compare 2 version number
* @param version1
* @param version2
* @param digitsLimit limit the comparsion to only n digits, defaults to 3
*/
export function compareVersion(version1: string, version2: string, digitsLimit = 3): 1 | 0 | -1 {
const segments1 = version1.split('.');
const segments2 = version2.split('.');
const len = Math.min(
Math.max(segments1.length, segments2.length),
digitsLimit || Number.MAX_SAFE_INTEGER,
);
for (let i = 0; i < len; i += 1) {
const seg1 = segments1[i];
const seg2 = segments2[i];
if (seg1 !== seg2) {
const v1 = toVersionNumber(seg1);
const v2 = toVersionNumber(seg2);
if (v1 !== v2) {
return v1 < v2 ? -1 : 1;
}
}
}
return 0;
}
/**
* Helper class for simplify the version compare
*/
class VersionComparer {
constructor(private version: string, private digitsLimit) {}
/**
* is above target version
* @param target target version to compare with
*/
isAbove(target: string): boolean {
return compareVersion(this.version, target, this.digitsLimit) > 0;
}
/**
* is above or equal to target version
* @param target target version to compare with
*/
isAboveOrEqualTo(target: string): boolean {
return compareVersion(this.version, target, this.digitsLimit) >= 0;
}
/**
* is equal to target version
* @param target target version to compare with
*/
isEqualTo(target: string): boolean {
return compareVersion(this.version, target, this.digitsLimit) === 0;
}
/**
* is below target version
* @param target target version to compare with
*/
isBelow(target: string): boolean {
return compareVersion(this.version, target, this.digitsLimit) < 0;
}
/**
* is below or equal to target version
* @param target target version to compare with
*/
isBelowOrEqualTo(target: string): boolean {
return compareVersion(this.version, target, this.digitsLimit) <= 0;
}
}
/**
* create a version comparer based on given version and digitsLimit
* @param ver
* @param digitsLimit
*/
export const version = (ver: string, digitsLimit = 3): VersionComparer =>
new VersionComparer(ver, digitsLimit);