@@ -31,6 +31,47 @@ function compareVersions(a: string, b: string): boolean {
3131 return { parts, prerelease } ;
3232 } ;
3333
34+ const comparePrerelease = (
35+ pre1 : string | undefined ,
36+ pre2 : string | undefined
37+ ) : number => {
38+ if ( ! pre1 && ! pre2 ) return 0 ; // both no prerelease
39+ if ( ! pre1 && pre2 ) return 1 ; // no prerelease > prerelease
40+ if ( pre1 && ! pre2 ) return - 1 ; // prerelease < no prerelease
41+ if ( typeof pre1 !== 'string' || typeof pre2 !== 'string' ) return 0 ;
42+
43+ // Both have prerelease - compare them properly
44+ const parts1 = pre1 . split ( '.' ) ;
45+ const parts2 = pre2 . split ( '.' ) ;
46+
47+ for ( let i = 0 ; i < Math . max ( parts1 . length , parts2 . length ) ; i ++ ) {
48+ const p1 = parts1 [ i ] ;
49+ const p2 = parts2 [ i ] ;
50+
51+ // If one side is missing, it's less than the other
52+ if ( p1 === undefined ) return - 1 ;
53+ if ( p2 === undefined ) return 1 ;
54+
55+ // Try to parse as numbers for numeric comparison
56+ const num1 = Number ( p1 ) ;
57+ const num2 = Number ( p2 ) ;
58+ const isNum1 = ! Number . isNaN ( num1 ) && p1 !== '' ;
59+ const isNum2 = ! Number . isNaN ( num2 ) && p2 !== '' ;
60+
61+ if ( isNum1 && isNum2 ) {
62+ // Both are numbers - compare numerically
63+ if ( num1 > num2 ) return 1 ;
64+ if ( num1 < num2 ) return - 1 ;
65+ } else {
66+ // At least one is non-numeric - compare as strings
67+ if ( p1 > p2 ) return 1 ;
68+ if ( p1 < p2 ) return - 1 ;
69+ }
70+ }
71+
72+ return 0 ; // equal
73+ } ;
74+
3475 const versionA = parseVersion ( a ) ;
3576 const versionB = parseVersion ( b ) ;
3677
@@ -42,15 +83,8 @@ function compareVersions(a: string, b: string): boolean {
4283
4384 // If versions are equal up to patch level, check prerelease
4485 // No prerelease is considered greater than prerelease
45- if ( ! versionA . prerelease && versionB . prerelease ) return true ;
46- if ( versionA . prerelease && ! versionB . prerelease ) return false ;
47-
48- // Both have prereleases or both don't - they're equal
49- if ( versionA . prerelease && versionB . prerelease ) {
50- return versionA . prerelease > versionB . prerelease ;
51- }
52-
53- return false ;
86+ const preResult = comparePrerelease ( versionA . prerelease , versionB . prerelease ) ;
87+ return preResult > 0 ;
5488}
5589
5690/**
0 commit comments