@@ -49,6 +49,7 @@ use deno_semver::package::PackageReq;
49
49
use deno_semver:: package:: PackageReqReferenceParseError ;
50
50
use deno_semver:: RangeSetOrTag ;
51
51
use deno_semver:: Version ;
52
+ use deno_semver:: VersionReq ;
52
53
use futures:: future:: LocalBoxFuture ;
53
54
use futures:: stream:: FuturesOrdered ;
54
55
use futures:: stream:: FuturesUnordered ;
@@ -205,8 +206,14 @@ pub enum JsrLoadError {
205
206
pub enum JsrPackageFormatError {
206
207
#[ error( transparent) ]
207
208
JsrPackageParseError ( PackageReqReferenceParseError ) ,
208
- #[ error( "Version tag not supported in jsr specifiers." ) ]
209
- VersionTagNotSupported ,
209
+ #[ error( "Version tag not supported in jsr specifiers ('{}').{}" ,
210
+ . tag,
211
+ match . tag. strip_prefix( 'v' ) . and_then( |v| VersionReq :: parse_from_specifier( v) . ok( ) . map( |s| s. tag( ) . is_none( ) ) ) . unwrap_or( false ) {
212
+ true => " Remove leading 'v' before version." ,
213
+ false => ""
214
+ }
215
+ ) ]
216
+ VersionTagNotSupported { tag : String } ,
210
217
}
211
218
212
219
#[ derive( Debug , Clone , Error ) ]
@@ -5055,7 +5062,9 @@ fn validate_jsr_specifier(
5055
5062
let package_ref = JsrPackageReqReference :: from_specifier ( specifier)
5056
5063
. map_err ( JsrPackageFormatError :: JsrPackageParseError ) ?;
5057
5064
match package_ref. req ( ) . version_req . inner ( ) {
5058
- RangeSetOrTag :: Tag ( _) => Err ( JsrPackageFormatError :: VersionTagNotSupported ) ,
5065
+ RangeSetOrTag :: Tag ( tag) => {
5066
+ Err ( JsrPackageFormatError :: VersionTagNotSupported { tag : tag. clone ( ) } )
5067
+ }
5059
5068
RangeSetOrTag :: RangeSet ( _) => Ok ( package_ref) ,
5060
5069
}
5061
5070
}
@@ -6639,4 +6648,32 @@ mod tests {
6639
6648
. unwrap ( ) ;
6640
6649
assert ! ( module. external( ) . is_some( ) ) ;
6641
6650
}
6651
+
6652
+ #[ test]
6653
+ fn leading_v_version_tag_err ( ) {
6654
+ {
6655
+ let err = JsrPackageFormatError :: VersionTagNotSupported {
6656
+ tag : "v1.2" . to_string ( ) ,
6657
+ } ;
6658
+ assert_eq ! ( err. to_string( ) , "Version tag not supported in jsr specifiers ('v1.2'). Remove leading 'v' before version." ) ;
6659
+ }
6660
+ {
6661
+ let err = JsrPackageFormatError :: VersionTagNotSupported {
6662
+ tag : "latest" . to_string ( ) ,
6663
+ } ;
6664
+ assert_eq ! (
6665
+ err. to_string( ) ,
6666
+ "Version tag not supported in jsr specifiers ('latest')."
6667
+ ) ;
6668
+ }
6669
+ {
6670
+ let err = JsrPackageFormatError :: VersionTagNotSupported {
6671
+ tag : "version" . to_string ( ) , // not a vversion with a leading 'v'
6672
+ } ;
6673
+ assert_eq ! (
6674
+ err. to_string( ) ,
6675
+ "Version tag not supported in jsr specifiers ('version')."
6676
+ ) ;
6677
+ }
6678
+ }
6642
6679
}
0 commit comments