Skip to content

Commit 7c4a101

Browse files
authored
fix: improve error when jsr specifier has a leading v in version requirement (#553)
1 parent 4dff5d9 commit 7c4a101

File tree

2 files changed

+41
-4
lines changed

2 files changed

+41
-4
lines changed

src/graph.rs

+40-3
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ use deno_semver::package::PackageReq;
4949
use deno_semver::package::PackageReqReferenceParseError;
5050
use deno_semver::RangeSetOrTag;
5151
use deno_semver::Version;
52+
use deno_semver::VersionReq;
5253
use futures::future::LocalBoxFuture;
5354
use futures::stream::FuturesOrdered;
5455
use futures::stream::FuturesUnordered;
@@ -205,8 +206,14 @@ pub enum JsrLoadError {
205206
pub enum JsrPackageFormatError {
206207
#[error(transparent)]
207208
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 },
210217
}
211218

212219
#[derive(Debug, Clone, Error)]
@@ -5055,7 +5062,9 @@ fn validate_jsr_specifier(
50555062
let package_ref = JsrPackageReqReference::from_specifier(specifier)
50565063
.map_err(JsrPackageFormatError::JsrPackageParseError)?;
50575064
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+
}
50595068
RangeSetOrTag::RangeSet(_) => Ok(package_ref),
50605069
}
50615070
}
@@ -6639,4 +6648,32 @@ mod tests {
66396648
.unwrap();
66406649
assert!(module.external().is_some());
66416650
}
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+
}
66426679
}

tests/specs/graph/jsr/version_tag_not_supported.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ import 'jsr:@scope/a@tag';
4141
},
4242
{
4343
"specifier": "jsr:@scope/a@tag",
44-
"error": "Version tag not supported in jsr specifiers."
44+
"error": "Version tag not supported in jsr specifiers ('tag')."
4545
}
4646
],
4747
"redirects": {}

0 commit comments

Comments
 (0)