11import { expect , describe , it } from 'vitest' ;
2- import { splitVersion , isVersionUnsupportedBelow } from '../common .ts' ;
2+ import { splitVersion , coerceVersion , isVersionUnsupportedBelow , minVersion } from '../semver .ts' ;
33
44describe ( 'versionSplit' , ( ) => {
55 const combinationsVersionSplit = [
@@ -19,6 +19,37 @@ describe('versionSplit', () => {
1919 ) ;
2020} ) ;
2121
22+ describe ( 'coerceVersion' , ( ) => {
23+ const combinationsCoerceVersion = [
24+ { version : '18.13.0' , expected : { major : 18 , minor : 13 , patch : 0 , version : '18.13.0' } } ,
25+ // semver.coerce regex-shifts: first numeric run becomes major
26+ { version : 'x.13.0' , expected : { major : 13 , minor : 0 , patch : 0 , version : '13.0.0' } } ,
27+ // missing/non-numeric parts are filled with 0
28+ { version : '18.y.0' , expected : { major : 18 , minor : 0 , patch : 0 , version : '18.0.0' } } ,
29+ { version : '18.13.z' , expected : { major : 18 , minor : 13 , patch : 0 , version : '18.13.0' } } ,
30+ { version : '18' , expected : { major : 18 , minor : 0 , patch : 0 , version : '18.0.0' } } ,
31+ { version : '18.13' , expected : { major : 18 , minor : 13 , patch : 0 , version : '18.13.0' } } ,
32+ // ranges and `workspace:` prefix are understood
33+ { version : '^9.0.0' , expected : { major : 9 , minor : 0 , patch : 0 , version : '9.0.0' } } ,
34+ { version : '~1.2.3' , expected : { major : 1 , minor : 2 , patch : 3 , version : '1.2.3' } } ,
35+ {
36+ version : 'workspace:^5.4.3' ,
37+ expected : { major : 5 , minor : 4 , patch : 3 , version : '5.4.3' }
38+ } ,
39+ // unparseable input
40+ {
41+ version : 'invalid' ,
42+ expected : { major : undefined , minor : undefined , patch : undefined , version : undefined }
43+ }
44+ ] ;
45+ it . each ( combinationsCoerceVersion ) (
46+ 'should return the correct version for $version' ,
47+ ( { version, expected } ) => {
48+ expect ( coerceVersion ( version ) ) . toEqual ( expected ) ;
49+ }
50+ ) ;
51+ } ) ;
52+
2253describe ( 'minimumRequirement' , ( ) => {
2354 const combinationsMinimumRequirement = [
2455 { version : '17' , below : '18.3.0' , expected : true } ,
@@ -46,3 +77,18 @@ describe('minimumRequirement', () => {
4677 }
4778 ) ;
4879} ) ;
80+
81+ describe ( 'minVersion' , ( ) => {
82+ it ( 'returns the lowest version that satisfies the range' , ( ) => {
83+ expect ( minVersion ( '^9.0.0' ) ) . toBe ( '9.0.0' ) ;
84+ expect ( minVersion ( '~1.2.3' ) ) . toBe ( '1.2.3' ) ;
85+ expect ( minVersion ( 'workspace:^5.4.3' ) ) . toBe ( '5.4.3' ) ;
86+ expect ( minVersion ( '2.x' ) ) . toBe ( '2.0.0' ) ;
87+ expect ( minVersion ( '>=1.0.0 || >=2.3.1 <2.4.5' ) ) . toBe ( '1.0.0' ) ;
88+ } ) ;
89+
90+ it ( 'throws on unparseable ranges' , ( ) => {
91+ expect ( ( ) => minVersion ( 'latest' ) ) . toThrow ( ) ;
92+ expect ( ( ) => minVersion ( 'workspace:*' ) ) . toThrow ( ) ;
93+ } ) ;
94+ } ) ;
0 commit comments