@@ -15,12 +15,14 @@ namespace ts {
15
15
// > alphanumerics and hyphen [0-9A-Za-z-]. Identifiers MUST NOT be empty. Numeric identifiers
16
16
// > MUST NOT include leading zeroes.
17
17
const prereleaseRegExp = / ^ (?: 0 | [ 1 - 9 ] \d * | [ a - z - ] [ a - z 0 - 9 - ] * ) (?: \. (?: 0 | [ 1 - 9 ] \d * | [ a - z - ] [ a - z 0 - 9 - ] * ) ) * $ / i;
18
+ const prereleasePartRegExp = / ^ (?: 0 | [ 1 - 9 ] \d * | [ a - z - ] [ a - z 0 - 9 - ] * ) $ / i;
18
19
19
20
// https://semver.org/#spec-item-10
20
21
// > Build metadata MAY be denoted by appending a plus sign and a series of dot separated
21
22
// > identifiers immediately following the patch or pre-release version. Identifiers MUST
22
23
// > comprise only ASCII alphanumerics and hyphen [0-9A-Za-z-]. Identifiers MUST NOT be empty.
23
24
const buildRegExp = / ^ [ a - z 0 - 9 - ] + (?: \. [ a - z 0 - 9 - ] + ) * $ / i;
25
+ const buildPartRegExp = / ^ [ a - z 0 - 9 - ] + $ / i;
24
26
25
27
// https://semver.org/#spec-item-9
26
28
// > Numeric identifiers MUST NOT include leading zeroes.
@@ -30,7 +32,7 @@ namespace ts {
30
32
* Describes a precise semantic version number, https://semver.org
31
33
*/
32
34
export class Version {
33
- static readonly zero = new Version ( 0 , 0 , 0 ) ;
35
+ static readonly zero = new Version ( 0 , 0 , 0 , [ "0" ] ) ;
34
36
35
37
readonly major : number ;
36
38
readonly minor : number ;
@@ -39,8 +41,8 @@ namespace ts {
39
41
readonly build : readonly string [ ] ;
40
42
41
43
constructor ( text : string ) ;
42
- constructor ( major : number , minor ?: number , patch ?: number , prerelease ?: string , build ?: string ) ;
43
- constructor ( major : number | string , minor = 0 , patch = 0 , prerelease = "" , build = "" ) {
44
+ constructor ( major : number , minor ?: number , patch ?: number , prerelease ?: string | readonly string [ ] , build ?: string | readonly string [ ] ) ;
45
+ constructor ( major : number | string , minor = 0 , patch = 0 , prerelease : string | readonly string [ ] = "" , build : string | readonly string [ ] = "" ) {
44
46
if ( typeof major === "string" ) {
45
47
const result = Debug . checkDefined ( tryParseComponents ( major ) , "Invalid version" ) ;
46
48
( { major, minor, patch, prerelease, build } = result ) ;
@@ -49,13 +51,18 @@ namespace ts {
49
51
Debug . assert ( major >= 0 , "Invalid argument: major" ) ;
50
52
Debug . assert ( minor >= 0 , "Invalid argument: minor" ) ;
51
53
Debug . assert ( patch >= 0 , "Invalid argument: patch" ) ;
52
- Debug . assert ( ! prerelease || prereleaseRegExp . test ( prerelease ) , "Invalid argument: prerelease" ) ;
53
- Debug . assert ( ! build || buildRegExp . test ( build ) , "Invalid argument: build" ) ;
54
+
55
+ const prereleaseArray = prerelease ? isArray ( prerelease ) ? prerelease : prerelease . split ( "." ) : emptyArray ;
56
+ const buildArray = build ? isArray ( build ) ? build : build . split ( "." ) : emptyArray ;
57
+
58
+ Debug . assert ( every ( prereleaseArray , s => prereleasePartRegExp . test ( s ) ) , "Invalid argument: prerelease" ) ;
59
+ Debug . assert ( every ( buildArray , s => buildPartRegExp . test ( s ) ) , "Invalid argument: build" ) ;
60
+
54
61
this . major = major ;
55
62
this . minor = minor ;
56
63
this . patch = patch ;
57
- this . prerelease = prerelease ? prerelease . split ( "." ) : emptyArray ;
58
- this . build = build ? build . split ( "." ) : emptyArray ;
64
+ this . prerelease = prereleaseArray ;
65
+ this . build = buildArray ;
59
66
}
60
67
61
68
static tryParse ( text : string ) {
@@ -96,6 +103,17 @@ namespace ts {
96
103
}
97
104
}
98
105
106
+ with ( fields : { major ?: number , minor ?: number , patch ?: number , prerelease ?: string | readonly string [ ] , build ?: string | readonly string [ ] } ) {
107
+ const {
108
+ major = this . major ,
109
+ minor = this . minor ,
110
+ patch = this . patch ,
111
+ prerelease = this . prerelease ,
112
+ build = this . build
113
+ } = fields ;
114
+ return new Version ( major , minor , patch , prerelease , build ) ;
115
+ }
116
+
99
117
toString ( ) {
100
118
let result = `${ this . major } .${ this . minor } .${ this . patch } ` ;
101
119
if ( some ( this . prerelease ) ) result += `-${ this . prerelease . join ( "." ) } ` ;
@@ -184,6 +202,10 @@ namespace ts {
184
202
return undefined ;
185
203
}
186
204
205
+ /**
206
+ * Tests whether a version matches the range. This is equivalent to `satisfies(version, range, { includePrerelease: true })`.
207
+ * in `node-semver`.
208
+ */
187
209
test ( version : Version | string ) {
188
210
if ( typeof version === "string" ) version = new Version ( version ) ;
189
211
return testDisjunction ( version , this . _alternatives ) ;
@@ -311,20 +333,22 @@ namespace ts {
311
333
break ;
312
334
case "<" :
313
335
case ">=" :
314
- comparators . push ( createComparator ( operator , version ) ) ;
336
+ comparators . push (
337
+ isWildcard ( minor ) || isWildcard ( patch ) ? createComparator ( operator , version . with ( { prerelease : "0" } ) ) :
338
+ createComparator ( operator , version ) ) ;
315
339
break ;
316
340
case "<=" :
317
341
case ">" :
318
342
comparators . push (
319
- isWildcard ( minor ) ? createComparator ( operator === "<=" ? "<" : ">=" , version . increment ( "major" ) ) :
320
- isWildcard ( patch ) ? createComparator ( operator === "<=" ? "<" : ">=" , version . increment ( "minor" ) ) :
343
+ isWildcard ( minor ) ? createComparator ( operator === "<=" ? "<" : ">=" , version . increment ( "major" ) . with ( { prerelease : "0" } ) ) :
344
+ isWildcard ( patch ) ? createComparator ( operator === "<=" ? "<" : ">=" , version . increment ( "minor" ) . with ( { prerelease : "0" } ) ) :
321
345
createComparator ( operator , version ) ) ;
322
346
break ;
323
347
case "=" :
324
348
case undefined :
325
349
if ( isWildcard ( minor ) || isWildcard ( patch ) ) {
326
- comparators . push ( createComparator ( ">=" , version ) ) ;
327
- comparators . push ( createComparator ( "<" , version . increment ( isWildcard ( minor ) ? "major" : "minor" ) ) ) ;
350
+ comparators . push ( createComparator ( ">=" , version . with ( { prerelease : "0" } ) ) ) ;
351
+ comparators . push ( createComparator ( "<" , version . increment ( isWildcard ( minor ) ? "major" : "minor" ) . with ( { prerelease : "0" } ) ) ) ;
328
352
}
329
353
else {
330
354
comparators . push ( createComparator ( "=" , version ) ) ;
@@ -389,4 +413,4 @@ namespace ts {
389
413
function formatComparator ( comparator : Comparator ) {
390
414
return `${ comparator . operator } ${ comparator . operand } ` ;
391
415
}
392
- }
416
+ }
0 commit comments