@@ -277,6 +277,11 @@ const parseComparator = (comp, options) => {
277277
278278const isX = id => ! id || id . toLowerCase ( ) === 'x' || id === '*'
279279
280+ const invalidXRangeOrder = ( M , m , p ) => (
281+ ( isX ( M ) && ! isX ( m ) ) ||
282+ ( isX ( m ) && p && ! isX ( p ) )
283+ )
284+
280285// ~, ~> --> * (any, kinda silly)
281286// ~2, ~2.x, ~2.x.x, ~>2, ~>2.x ~>2.x.x --> >=2.0.0 <3.0.0-0
282287// ~2.0, ~2.0.x, ~>2.0, ~>2.0.x --> >=2.0.0 <2.1.0-0
@@ -373,10 +378,10 @@ const replaceCaret = (comp, options) => {
373378 if ( M === '0' ) {
374379 if ( m === '0' ) {
375380 ret = `>=${ M } .${ m } .${ p
376- } ${ z } <${ M } .${ m } .${ + p + 1 } -0`
381+ } <${ M } .${ m } .${ + p + 1 } -0`
377382 } else {
378383 ret = `>=${ M } .${ m } .${ p
379- } ${ z } <${ M } .${ + m + 1 } .0-0`
384+ } <${ M } .${ + m + 1 } .0-0`
380385 }
381386 } else {
382387 ret = `>=${ M } .${ m } .${ p
@@ -402,6 +407,10 @@ const replaceXRange = (comp, options) => {
402407 const r = options . loose ? re [ t . XRANGELOOSE ] : re [ t . XRANGE ]
403408 return comp . replace ( r , ( ret , gtlt , M , m , p , pr ) => {
404409 debug ( 'xRange' , comp , ret , gtlt , M , m , p , pr )
410+ if ( invalidXRangeOrder ( M , m , p ) ) {
411+ return comp
412+ }
413+
405414 const xM = isX ( M )
406415 const xm = xM || isX ( m )
407416 const xp = xm || isX ( p )
0 commit comments