summaryrefslogtreecommitdiff
path: root/ext/node/resolution.rs
diff options
context:
space:
mode:
Diffstat (limited to 'ext/node/resolution.rs')
-rw-r--r--ext/node/resolution.rs36
1 files changed, 33 insertions, 3 deletions
diff --git a/ext/node/resolution.rs b/ext/node/resolution.rs
index 21ce589c2..d6734066c 100644
--- a/ext/node/resolution.rs
+++ b/ext/node/resolution.rs
@@ -548,7 +548,9 @@ fn parse_package_name(
} else if specifier.starts_with('@') {
is_scoped = true;
if let Some(index) = separator_index {
- separator_index = specifier[index + 1..].find('/');
+ separator_index = specifier[index + 1..]
+ .find('/')
+ .map(|new_index| index + 1 + new_index);
} else {
valid_package_name = false;
}
@@ -707,9 +709,9 @@ pub fn legacy_main_resolve(
) -> Result<PathBuf, AnyError> {
let maybe_main =
if referrer_kind == NodeModuleKind::Esm && package_json.typ == "module" {
- &package_json.module
+ package_json.module.as_ref().or(package_json.main.as_ref())
} else {
- &package_json.main
+ package_json.main.as_ref()
};
let mut guess;
@@ -791,3 +793,31 @@ pub fn legacy_main_resolve(
Err(generic_error("not found"))
}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+
+ #[test]
+ fn test_parse_package_name() {
+ let dummy_referrer = Url::parse("http://example.com").unwrap();
+
+ assert_eq!(
+ parse_package_name("fetch-blob", &dummy_referrer).unwrap(),
+ ("fetch-blob".to_string(), ".".to_string(), false)
+ );
+ assert_eq!(
+ parse_package_name("@vue/plugin-vue", &dummy_referrer).unwrap(),
+ ("@vue/plugin-vue".to_string(), ".".to_string(), true)
+ );
+ assert_eq!(
+ parse_package_name("@astrojs/prism/dist/highlighter", &dummy_referrer)
+ .unwrap(),
+ (
+ "@astrojs/prism".to_string(),
+ "./dist/highlighter".to_string(),
+ true
+ )
+ );
+ }
+}