@@ -105,7 +105,11 @@ pub async fn install(
105105 let mut packages = IndexMap :: < String , Package > :: new ( ) ;
106106 for package_spec in package_specs {
107107 // Parse package spec (e.g., "typescript", "typescript@5.0.0", "@scope/pkg")
108- let ( package_name, _version_spec) = parse_package_spec ( package_spec) ;
108+
109+ let ( package_name, _version_spec) = match parse_package_spec ( package_spec) {
110+ Ok ( result) => result,
111+ Err ( error) => return Err ( ( Some ( package_spec. clone ( ) ) , error) ) ,
112+ } ;
109113 packages. insert ( package_name, Package { spec : package_spec, staging_dir : None } ) ;
110114 }
111115 let packages_count = packages. len ( ) ;
@@ -395,7 +399,7 @@ async fn install_one(
395399/// 1. Try to use PackageMetadata for binary list
396400/// 2. Fallback to scanning BinConfig files for orphaned binaries
397401pub async fn uninstall ( package_name : & str , dry_run : bool ) -> Result < ( ) , Error > {
398- let ( package_name, _) = parse_package_spec ( package_name) ;
402+ let ( package_name, _) = parse_package_spec ( package_name) ? ;
399403
400404 // Phase 1: Try to use PackageMetadata for binary list
401405 let bins = if let Some ( metadata) = PackageMetadata :: load ( & package_name) . await ? {
@@ -881,28 +885,35 @@ mod tests {
881885
882886 #[ test]
883887 fn test_parse_package_spec_simple ( ) {
884- let ( name, version) = parse_package_spec ( "typescript" ) ;
888+ let ( name, version) = parse_package_spec ( "typescript" ) . unwrap ( ) ;
885889 assert_eq ! ( name, "typescript" ) ;
886890 assert_eq ! ( version, None ) ;
887891 }
888892
889893 #[ test]
890894 fn test_parse_package_spec_with_version ( ) {
891- let ( name, version) = parse_package_spec ( "typescript@5.0.0" ) ;
895+ let ( name, version) = parse_package_spec ( "typescript@5.0.0" ) . unwrap ( ) ;
892896 assert_eq ! ( name, "typescript" ) ;
893897 assert_eq ! ( version, Some ( "5.0.0" . to_string( ) ) ) ;
894898 }
895899
896900 #[ test]
897901 fn test_parse_package_spec_scoped ( ) {
898- let ( name, version) = parse_package_spec ( "@types/node" ) ;
902+ let ( name, version) = parse_package_spec ( "@types/node" ) . unwrap ( ) ;
899903 assert_eq ! ( name, "@types/node" ) ;
900904 assert_eq ! ( version, None ) ;
901905 }
902906
903907 #[ test]
904908 fn test_parse_package_spec_scoped_with_version ( ) {
905- let ( name, version) = parse_package_spec ( "@types/node@20.0.0" ) ;
909+ let ( name, version) = parse_package_spec ( "@types/node@20.0.0" ) . unwrap ( ) ;
910+ assert_eq ! ( name, "@types/node" ) ;
911+ assert_eq ! ( version, Some ( "20.0.0" . to_string( ) ) ) ;
912+ }
913+
914+ #[ test]
915+ fn test_parse_package_spec_local ( ) {
916+ let ( name, version) = parse_package_spec ( "./packages/cli" ) . unwrap ( ) ;
906917 assert_eq ! ( name, "@types/node" ) ;
907918 assert_eq ! ( version, Some ( "20.0.0" . to_string( ) ) ) ;
908919 }
0 commit comments