Skip to content

Commit 85b1b7c

Browse files
authored
feat: return not found when recursing non-existent file (#36)
relates to #32
1 parent bcbcceb commit 85b1b7c

File tree

4 files changed

+41
-10
lines changed

4 files changed

+41
-10
lines changed

fixtures/enhanced_resolve/test/fixtures/browser-module/lib/self.js

Whitespace-only changes.

fixtures/enhanced_resolve/test/fixtures/browser-module/package.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,10 @@
77
"module-c": "module-c",
88
"./toString": "./lib/toString.js",
99
"./lib/main.js": "./lib/main.js",
10+
"./main.js": "./lib/main.js",
11+
"./lib/xyz.js": "./xyz.js",
12+
"./xyz.js": "./lib/xyz.js",
13+
"./lib/non-existent.js": "./lib/non-existent.js",
1014
".": false
1115
},
1216
"innerBrowser1": {

src/lib.rs

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -780,24 +780,28 @@ impl<Fs: FileSystem + Default> ResolverGeneric<Fs> {
780780
fn load_browser_field(
781781
&self,
782782
cached_path: &CachedPath,
783-
specifier: Option<&str>,
783+
module_specifier: Option<&str>,
784784
package_json: &PackageJson,
785785
ctx: &mut ResolveContext,
786786
) -> ResolveState {
787787
let path = cached_path.path();
788-
let Some(new_specifier) = package_json.resolve_browser_field(path, specifier)? else {
788+
let Some(new_specifier) = package_json.resolve_browser_field(path, module_specifier)?
789+
else {
789790
return Ok(None);
790791
};
791-
// Finish when resolving to self `{"./a.js": "./a.js"}`
792-
if let Some(new_specifier) = new_specifier.strip_prefix("./") {
793-
if path.ends_with(Path::new(new_specifier)) {
794-
return Ok(Some(cached_path.clone()));
795-
}
796-
}
797-
if specifier.is_some_and(|s| s == new_specifier) {
792+
// Abort when resolving recursive module
793+
if module_specifier.is_some_and(|s| s == new_specifier) {
798794
return Ok(None);
799795
}
800796
if ctx.resolving_alias.as_ref().is_some_and(|s| s == new_specifier) {
797+
// Complete when resolving to self `{"./a.js": "./a.js"}`
798+
if new_specifier.strip_prefix("./").filter(|s| path.ends_with(Path::new(s))).is_some() {
799+
return if cached_path.is_file(&self.cache.fs) {
800+
Ok(Some(cached_path.clone()))
801+
} else {
802+
Err(ResolveError::NotFound(cached_path.path().to_path_buf()))
803+
};
804+
}
801805
return Err(ResolveError::Recursion);
802806
}
803807
let specifier = Specifier::parse(new_specifier).map_err(ResolveError::Specifier)?;

src/tests/browser_field.rs

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,8 @@ fn replace_file() {
6161
("should check only alias field properties", f.clone(), "./toString", f.join("lib/toString.js")),
6262
// not part of enhanced-resolve
6363
("recursion", f.clone(), "module-c", f.join("node_modules/module-c.js")),
64-
("resolve self", f.clone(), "./lib/main.js", f.join("lib/main.js")),
64+
("resolve self 1", f.clone(), "./lib/main.js", f.join("lib/main.js")),
65+
("resolve self 2", f.clone(), "./main.js", f.join("lib/main.js")),
6566
];
6667

6768
for (comment, path, request, expected) in data {
@@ -70,6 +71,28 @@ fn replace_file() {
7071
}
7172
}
7273

74+
#[test]
75+
fn recurse_fail() {
76+
let f = super::fixture();
77+
78+
let resolver = Resolver::new(ResolveOptions {
79+
alias_fields: vec![vec!["browser".into()]],
80+
..ResolveOptions::default()
81+
});
82+
83+
#[rustfmt::skip]
84+
let data = [
85+
("recurse non existent", f.clone(), "./lib/non-existent.js", ResolveError::NotFound(f.join("lib/non-existent.js"))),
86+
("path partial match 1", f.clone(), "./xyz.js", ResolveError::NotFound(f.join("xyz.js"))),
87+
("path partial match 2", f.clone(), "./lib/xyz.js", ResolveError::NotFound(f.join("lib/xyz.js"))),
88+
];
89+
90+
for (comment, path, request, expected) in data {
91+
let resolved_path = resolver.resolve(&path, request).map(|r| r.full_path());
92+
assert_eq!(resolved_path, Err(expected), "{comment} {path:?} {request}");
93+
}
94+
}
95+
7396
#[test]
7497
fn broken() {
7598
let f = super::fixture();

0 commit comments

Comments
 (0)