@@ -148,14 +148,20 @@ impl Specifier {
148148
149149 /// Create a new instance from an npm alias specifier
150150 fn from_alias ( value : & str , raw : String ) -> Self {
151- let aliased_version = {
152- let start = value. rfind ( '@' ) . unwrap ( ) + 1 ;
153- value[ start..] . to_string ( )
154- } ;
155- let aliased_name = {
151+ let ( aliased_name, aliased_version) = {
156152 let start = value. find ( ':' ) . unwrap ( ) + 1 ;
157- let end = value. rfind ( '@' ) . unwrap ( ) ;
158- value[ start..end] . to_string ( )
153+ if let Some ( at_pos) = value. rfind ( '@' ) {
154+ if at_pos > start {
155+ // There's a version specifier
156+ ( value[ start..at_pos] . to_string ( ) , value[ at_pos + 1 ..] . to_string ( ) )
157+ } else {
158+ // The @ is part of a scoped package name, no version
159+ ( value[ start..] . to_string ( ) , String :: new ( ) )
160+ }
161+ } else {
162+ // No @ at all, unscoped package without version
163+ ( value[ start..] . to_string ( ) , String :: new ( ) )
164+ }
159165 } ;
160166 if aliased_name. is_empty ( ) {
161167 Self :: Unsupported ( raw:: Raw { raw } )
@@ -384,8 +390,8 @@ impl Specifier {
384390
385391 /// Are both specifiers on eg. "-alpha", or neither have a release channel?
386392 pub fn has_same_release_channel_as ( & self , other : & Specifier ) -> bool {
387- if let ( Specifier :: BasicSemver ( a) , Specifier :: BasicSemver ( b) ) = ( self , other) {
388- a. node_version . pre_release . first ( ) == b. node_version . pre_release . first ( )
393+ if let ( Some ( a) , Some ( b) ) = ( self . get_node_version ( ) , other. get_node_version ( ) ) {
394+ a. pre_release . first ( ) == b. pre_release . first ( )
389395 } else {
390396 false
391397 }
@@ -402,7 +408,7 @@ impl Specifier {
402408 }
403409
404410 pub fn is_older_than ( & self , other : & Specifier ) -> bool {
405- if let ( Specifier :: BasicSemver ( _ ) , Specifier :: BasicSemver ( _ ) ) = ( self , other) {
411+ if self . get_node_version ( ) . is_some ( ) && other. get_node_version ( ) . is_some ( ) {
406412 other > self
407413 } else {
408414 false
@@ -411,8 +417,8 @@ impl Specifier {
411417
412418 /// Is this specifier on the same major version, but otherwise older?
413419 pub fn is_older_than_by_minor ( & self , other : & Specifier ) -> bool {
414- if let ( Specifier :: BasicSemver ( a) , Specifier :: BasicSemver ( b) ) = ( self , other) {
415- b. node_version . major == a. node_version . major && other > self
420+ if let ( Some ( a) , Some ( b) ) = ( self . get_node_version ( ) , other. get_node_version ( ) ) {
421+ b. major == a. major && other > self
416422 } else {
417423 false
418424 }
@@ -421,8 +427,8 @@ impl Specifier {
421427 /// Is this specifier on the same major and minor version, but otherwise
422428 /// older?
423429 pub fn is_older_than_by_patch ( & self , other : & Specifier ) -> bool {
424- if let ( Specifier :: BasicSemver ( a) , Specifier :: BasicSemver ( b) ) = ( self , other) {
425- b. node_version . major == a. node_version . major && b. node_version . minor == a. node_version . minor && other > self
430+ if let ( Some ( a) , Some ( b) ) = ( self . get_node_version ( ) , other. get_node_version ( ) ) {
431+ b. major == a. major && b. minor == a. minor && other > self
426432 } else {
427433 false
428434 }
0 commit comments