Skip to content

Commit 3a9d5e7

Browse files
committed
fix: do not resolve to node_modules/pacakge/index (#849)
fixes #845 The option `main_files` is kind of confusing, it's supposed to be the file stem without the extension (e.g. index), but somehow it ended up being a lookup for `index` then `index.js` instead of just `index.js`. This reduces an extra "is file" system call for `node_modules/package/index`.
1 parent ea425f6 commit 3a9d5e7

File tree

6 files changed

+92
-93
lines changed

6 files changed

+92
-93
lines changed

src/lib.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -756,7 +756,7 @@ impl<Fs: FileSystem> ResolverGeneric<Fs> {
756756
for main_file in &self.options.main_files {
757757
let cached_path = cached_path.normalize_with(main_file, self.cache.as_ref());
758758
if self.options.enforce_extension.is_disabled()
759-
&& let Some(path) = self.load_alias_or_file(&cached_path, ctx)?
759+
&& let Some(path) = self.load_browser_field_or_alias(&cached_path, ctx)?
760760
&& self.check_restrictions(path.path())
761761
{
762762
return Ok(Some(path));
@@ -1515,7 +1515,7 @@ impl<Fs: FileSystem> ResolverGeneric<Fs> {
15151515
.clone_with_options(ResolveOptions {
15161516
tsconfig: None,
15171517
extensions: vec![".json".into()],
1518-
main_files: vec!["tsconfig.json".into()],
1518+
main_files: vec!["tsconfig".into()],
15191519
#[cfg(feature = "yarn_pnp")]
15201520
yarn_pnp: self.options.yarn_pnp,
15211521
#[cfg(feature = "yarn_pnp")]

src/tests/alias.rs

Lines changed: 52 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -18,18 +18,18 @@ fn alias() {
1818
let f = Path::new("/");
1919

2020
let file_system = MemoryFS::new(&[
21-
("/a/index", ""),
22-
("/a/dir/index", ""),
23-
("/recursive/index", ""),
24-
("/recursive/dir/index", ""),
25-
("/b/index", ""),
26-
("/b/dir/index", ""),
27-
("/c/index", ""),
28-
("/c/dir/index", ""),
29-
("/d/index.js", ""),
21+
("/a/index.js", ""),
22+
("/a/dir/index.js", ""),
23+
("/recursive/index.js", ""),
24+
("/recursive/dir/index.js", ""),
25+
("/b/index.js", ""),
26+
("/b/dir/index.js", ""),
27+
("/c/index.js", ""),
28+
("/c/dir/index.js", ""),
29+
("/d/index.js.js", ""),
3030
("/d/dir/.empty", ""),
31-
("/e/index", ""),
32-
("/e/anotherDir/index", ""),
31+
("/e/index.js", ""),
32+
("/e/anotherDir/index.js", ""),
3333
("/e/dir/file", ""),
3434
("/dashed-name", ""),
3535
]);
@@ -39,8 +39,8 @@ fn alias() {
3939
ResolveOptions {
4040
alias: vec![
4141
("aliasA".into(), vec![AliasValue::from("a")]),
42-
("b$".into(), vec![AliasValue::from("a/index")]),
43-
("c$".into(), vec![AliasValue::from("/a/index")]),
42+
("b$".into(), vec![AliasValue::from("a/index.js")]),
43+
("c$".into(), vec![AliasValue::from("/a/index.js")]),
4444
(
4545
"multiAlias".into(),
4646
vec![
@@ -53,7 +53,7 @@ fn alias() {
5353
),
5454
("recursive".into(), vec![AliasValue::from("recursive/dir")]),
5555
("/d/dir".into(), vec![AliasValue::from("/c/dir")]),
56-
("/d/index.js".into(), vec![AliasValue::from("/c/index")]),
56+
("/d/index.js".into(), vec![AliasValue::from("/c/index.js")]),
5757
("#".into(), vec![AliasValue::from("/c/dir")]),
5858
("@".into(), vec![AliasValue::from("/c/dir")]),
5959
("ignored".into(), vec![AliasValue::Ignore]),
@@ -75,51 +75,51 @@ fn alias() {
7575

7676
#[rustfmt::skip]
7777
let pass = [
78-
("should resolve a not aliased module 1", "a", "/a/index"),
79-
("should resolve a not aliased module 2", "a/index", "/a/index"),
80-
("should resolve a not aliased module 3", "a/dir", "/a/dir/index"),
81-
("should resolve a not aliased module 4", "a/dir/index", "/a/dir/index"),
82-
("should resolve an aliased module 1", "aliasA", "/a/index"),
83-
("should resolve an aliased module 2", "aliasA/index", "/a/index"),
84-
("should resolve an aliased module 3", "aliasA/dir", "/a/dir/index"),
85-
("should resolve an aliased module 4", "aliasA/dir/index", "/a/dir/index"),
86-
("should resolve '#' alias 1", "#", "/c/dir/index"),
87-
("should resolve '#' alias 2", "#/index", "/c/dir/index"),
88-
("should resolve '@' alias 1", "@", "/c/dir/index"),
89-
("should resolve '@' alias 2", "@/index", "/c/dir/index"),
90-
("should resolve '@' alias 3", "@/", "/c/dir/index"),
91-
("should resolve a recursive aliased module 1", "recursive", "/recursive/dir/index"),
92-
("should resolve a recursive aliased module 2", "recursive/index", "/recursive/dir/index"),
93-
("should resolve a recursive aliased module 3", "recursive/dir", "/recursive/dir/index"),
94-
("should resolve a recursive aliased module 4", "recursive/dir/index", "/recursive/dir/index"),
95-
("should resolve a file aliased module 1", "b", "/a/index"),
96-
("should resolve a file aliased module 2", "c", "/a/index"),
97-
("should resolve a file aliased module with a query 1", "b?query", "/a/index?query"),
98-
("should resolve a file aliased module with a query 2", "c?query", "/a/index?query"),
99-
("should resolve a path in a file aliased module 1", "b/index", "/b/index"),
100-
("should resolve a path in a file aliased module 2", "b/dir", "/b/dir/index"),
101-
("should resolve a path in a file aliased module 3", "b/dir/index", "/b/dir/index"),
102-
("should resolve a path in a file aliased module 4", "c/index", "/c/index"),
103-
("should resolve a path in a file aliased module 5", "c/dir", "/c/dir/index"),
104-
("should resolve a path in a file aliased module 6", "c/dir/index", "/c/dir/index"),
105-
("should resolve a file aliased file 1", "d", "/c/index"),
106-
("should resolve a file aliased file 2", "d/dir/index", "/c/dir/index"),
78+
("should resolve a not aliased module 1", "a", "/a/index.js"),
79+
("should resolve a not aliased module 2", "a/index.js", "/a/index.js"),
80+
("should resolve a not aliased module 3", "a/dir", "/a/dir/index.js"),
81+
("should resolve a not aliased module 4", "a/dir/index.js", "/a/dir/index.js"),
82+
("should resolve an aliased module 1", "aliasA", "/a/index.js"),
83+
("should resolve an aliased module 2", "aliasA/index.js", "/a/index.js"),
84+
("should resolve an aliased module 3", "aliasA/dir", "/a/dir/index.js"),
85+
("should resolve an aliased module 4", "aliasA/dir/index.js", "/a/dir/index.js"),
86+
("should resolve '#' alias 1", "#", "/c/dir/index.js"),
87+
("should resolve '#' alias 2", "#/index.js", "/c/dir/index.js"),
88+
("should resolve '@' alias 1", "@", "/c/dir/index.js"),
89+
("should resolve '@' alias 2", "@/index.js", "/c/dir/index.js"),
90+
("should resolve '@' alias 3", "@/", "/c/dir/index.js"),
91+
("should resolve a recursive aliased module 1", "recursive", "/recursive/dir/index.js"),
92+
("should resolve a recursive aliased module 2", "recursive/index.js", "/recursive/dir/index.js"),
93+
("should resolve a recursive aliased module 3", "recursive/dir", "/recursive/dir/index.js"),
94+
("should resolve a recursive aliased module 4", "recursive/dir/index.js", "/recursive/dir/index.js"),
95+
("should resolve a file aliased module 1", "b", "/a/index.js"),
96+
("should resolve a file aliased module 2", "c", "/a/index.js"),
97+
("should resolve a file aliased module with a query 1", "b?query", "/a/index.js?query"),
98+
("should resolve a file aliased module with a query 2", "c?query", "/a/index.js?query"),
99+
("should resolve a path in a file aliased module 1", "b/index.js", "/b/index.js"),
100+
("should resolve a path in a file aliased module 2", "b/dir", "/b/dir/index.js"),
101+
("should resolve a path in a file aliased module 3", "b/dir/index.js", "/b/dir/index.js"),
102+
("should resolve a path in a file aliased module 4", "c/index.js", "/c/index.js"),
103+
("should resolve a path in a file aliased module 5", "c/dir", "/c/dir/index.js"),
104+
("should resolve a path in a file aliased module 6", "c/dir/index.js", "/c/dir/index.js"),
105+
("should resolve a file aliased file 1", "d", "/c/index.js"),
106+
("should resolve a file aliased file 2", "d/dir/index.js", "/c/dir/index.js"),
107107
("should resolve a file in multiple aliased dirs 1", "multiAlias/dir/file", "/e/dir/file"),
108-
("should resolve a file in multiple aliased dirs 2", "multiAlias/anotherDir", "/e/anotherDir/index"),
108+
("should resolve a file in multiple aliased dirs 2", "multiAlias/anotherDir", "/e/anotherDir/index.js"),
109109
// wildcard
110-
("should resolve wildcard alias 1", "@a", "/a/index"),
111-
("should resolve wildcard alias 2", "@a/dir", "/a/dir/index"),
110+
("should resolve wildcard alias 1", "@a", "/a/index.js"),
111+
("should resolve wildcard alias 2", "@a/dir", "/a/dir/index.js"),
112112
("should resolve wildcard alias 3", "@e/dir/file", "/e/dir/file"),
113-
("should resolve wildcard alias 4", "@e/anotherDir", "/e/anotherDir/index"),
113+
("should resolve wildcard alias 4", "@e/anotherDir", "/e/anotherDir/index.js"),
114114
("should resolve wildcard alias 5", "@e/dir/file", "/e/dir/file"),
115115
// added to test value without wildcard
116-
("should resolve scoped package name with sub dir 1", "@adir/index", "/a/index"),
117-
("should resolve scoped package name with sub dir 2", "@adir/dir", "/a/index"),
116+
("should resolve scoped package name with sub dir 1", "@adir/index.js", "/a/index.js"),
117+
("should resolve scoped package name with sub dir 2", "@adir/dir", "/a/index.js"),
118118
// not part of enhanced-resolve, added to make sure query in alias value works
119-
("should resolve query in alias value", "alias_query?query_before", "/a/index?query_after"),
120-
("should resolve query in alias value", "alias_fragment#fragment_before", "/a/index#fragment_after"),
119+
("should resolve query in alias value", "alias_query?query_before", "/a/index.js?query_after"),
120+
("should resolve query in alias value", "alias_fragment#fragment_before", "/a/index.js#fragment_after"),
121121
("should resolve dashed name", "dashed-name", "/dashed-name"),
122-
("should resolve scoped package name with sub dir", "@scope/package-name/file", "/c/dir/index"),
122+
("should resolve scoped package name with sub dir", "@scope/package-name/file", "/c/dir/index.js"),
123123
];
124124

125125
for (comment, request, expected) in pass {

src/tests/extension_alias.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ fn not_apply_to_extension_nor_main_files() {
5757

5858
let resolver = Resolver::new(ResolveOptions {
5959
extensions: vec![".js".into()],
60-
main_files: vec!["index.js".into()],
60+
main_files: vec!["index".into()],
6161
extension_alias: vec![(".js".into(), vec![])],
6262
..ResolveOptions::default()
6363
});

src/tests/fallback.rs

Lines changed: 36 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -11,20 +11,20 @@ fn fallback() {
1111
let f = Path::new("/");
1212

1313
let file_system = MemoryFS::new(&[
14-
("/a/index", ""),
15-
("/a/dir/index", ""),
16-
("/recursive/index", ""),
17-
("/recursive/dir/index", ""),
14+
("/a/index.js", ""),
15+
("/a/dir/index.js", ""),
16+
("/recursive/index.js", ""),
17+
("/recursive/dir/index.js", ""),
1818
("/recursive/dir/file", ""),
19-
("/recursive/dir/dir/index", ""),
20-
("/b/index", ""),
21-
("/b/dir/index", ""),
22-
("/c/index", ""),
23-
("/c/dir/index", ""),
24-
("/d/index.js", ""),
19+
("/recursive/dir/dir/index.js", ""),
20+
("/b/index.js", ""),
21+
("/b/dir/index.js", ""),
22+
("/c/index.js", ""),
23+
("/c/dir/index.js", ""),
24+
("/d/index.js.js", ""),
2525
("/d/dir/.empty", ""),
26-
("/e/index", ""),
27-
("/e/anotherDir/index", ""),
26+
("/e/index.js", ""),
27+
("/e/anotherDir/index.js", ""),
2828
("/e/dir/file", ""),
2929
]);
3030

@@ -33,8 +33,8 @@ fn fallback() {
3333
ResolveOptions {
3434
fallback: vec![
3535
("aliasA".into(), vec![AliasValue::Path("a".into())]),
36-
("b$".into(), vec![AliasValue::Path("a/index".into())]),
37-
("c$".into(), vec![AliasValue::Path("/a/index".into())]),
36+
("b$".into(), vec![AliasValue::Path("a/index.js".into())]),
37+
("c$".into(), vec![AliasValue::Path("/a/index.js".into())]),
3838
(
3939
"multiAlias".into(),
4040
vec![
@@ -47,7 +47,7 @@ fn fallback() {
4747
),
4848
("recursive".into(), vec![AliasValue::Path("recursive/dir".into())]),
4949
("/d/dir".into(), vec![AliasValue::Path("/c/dir".into())]),
50-
("/d/index.js".into(), vec![AliasValue::Path("/c/index".into())]),
50+
("/d/index.js.js".into(), vec![AliasValue::Path("/c/index.js".into())]),
5151
("ignored".into(), vec![AliasValue::Ignore]),
5252
("node:path".into(), vec![AliasValue::Ignore]),
5353
],
@@ -58,29 +58,29 @@ fn fallback() {
5858

5959
#[rustfmt::skip]
6060
let pass = [
61-
("should resolve a not aliased module 1", "a", "/a/index"),
62-
("should resolve a not aliased module 2", "a/index", "/a/index"),
63-
("should resolve a not aliased module 3", "a/dir", "/a/dir/index"),
64-
("should resolve a not aliased module 4", "a/dir/index", "/a/dir/index"),
65-
("should resolve an fallback module 1", "aliasA", "/a/index"),
66-
("should resolve an fallback module 2", "aliasA/index", "/a/index"),
67-
("should resolve an fallback module 3", "aliasA/dir", "/a/dir/index"),
68-
("should resolve an fallback module 4", "aliasA/dir/index", "/a/dir/index"),
69-
("should resolve a recursive aliased module 1", "recursive", "/recursive/index"),
70-
("should resolve a recursive aliased module 2", "recursive/index", "/recursive/index"),
71-
("should resolve a recursive aliased module 3", "recursive/dir", "/recursive/dir/index"),
72-
("should resolve a recursive aliased module 4", "recursive/dir/index", "/recursive/dir/index"),
61+
("should resolve a not aliased module 1", "a", "/a/index.js"),
62+
("should resolve a not aliased module 2", "a/index.js", "/a/index.js"),
63+
("should resolve a not aliased module 3", "a/dir", "/a/dir/index.js"),
64+
("should resolve a not aliased module 4", "a/dir/index.js", "/a/dir/index.js"),
65+
("should resolve an fallback module 1", "aliasA", "/a/index.js"),
66+
("should resolve an fallback module 2", "aliasA/index.js", "/a/index.js"),
67+
("should resolve an fallback module 3", "aliasA/dir", "/a/dir/index.js"),
68+
("should resolve an fallback module 4", "aliasA/dir/index.js", "/a/dir/index.js"),
69+
("should resolve a recursive aliased module 1", "recursive", "/recursive/index.js"),
70+
("should resolve a recursive aliased module 2", "recursive/index.js", "/recursive/index.js"),
71+
("should resolve a recursive aliased module 3", "recursive/dir", "/recursive/dir/index.js"),
72+
("should resolve a recursive aliased module 4", "recursive/dir/index.js", "/recursive/dir/index.js"),
7373
("should resolve a recursive aliased module 5", "recursive/file", "/recursive/dir/file"),
74-
("should resolve a file aliased module with a query 1", "b?query", "/b/index?query"),
75-
("should resolve a file aliased module with a query 2", "c?query", "/c/index?query"),
76-
("should resolve a path in a file aliased module 1", "b/index", "/b/index"),
77-
("should resolve a path in a file aliased module 2", "b/dir", "/b/dir/index"),
78-
("should resolve a path in a file aliased module 3", "b/dir/index", "/b/dir/index"),
79-
("should resolve a path in a file aliased module 4", "c/index", "/c/index"),
80-
("should resolve a path in a file aliased module 5", "c/dir", "/c/dir/index"),
81-
("should resolve a path in a file aliased module 6", "c/dir/index", "/c/dir/index"),
74+
("should resolve a file aliased module with a query 1", "b?query", "/b/index.js?query"),
75+
("should resolve a file aliased module with a query 2", "c?query", "/c/index.js?query"),
76+
("should resolve a path in a file aliased module 1", "b/index.js", "/b/index.js"),
77+
("should resolve a path in a file aliased module 2", "b/dir", "/b/dir/index.js"),
78+
("should resolve a path in a file aliased module 3", "b/dir/index.js", "/b/dir/index.js"),
79+
("should resolve a path in a file aliased module 4", "c/index.js", "/c/index.js"),
80+
("should resolve a path in a file aliased module 5", "c/dir", "/c/dir/index.js"),
81+
("should resolve a path in a file aliased module 6", "c/dir/index.js", "/c/dir/index.js"),
8282
("should resolve a file in multiple aliased dirs 1", "multiAlias/dir/file", "/e/dir/file"),
83-
("should resolve a file in multiple aliased dirs 2", "multiAlias/anotherDir", "/e/anotherDir/index"),
83+
("should resolve a file in multiple aliased dirs 2", "multiAlias/anotherDir", "/e/anotherDir/index.js"),
8484
];
8585

8686
for (comment, request, expected) in pass {

src/tests/imports_field.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ fn test_simple() {
1515

1616
let resolver = Resolver::new(ResolveOptions {
1717
extensions: vec![".js".into()],
18-
main_files: vec!["index.js".into()],
18+
main_files: vec!["index".into()],
1919
condition_names: vec!["webpack".into()],
2020
..ResolveOptions::default()
2121
});

src/tests/missing.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@ fn test() {
3737
(
3838
"m1/",
3939
vec![
40-
f.join("node_modules/m1/index"),
4140
f.join("node_modules/m1/index.js"),
4241
f.join("node_modules/m1/index.json"),
4342
f.join("node_modules/m1/index.node"),

0 commit comments

Comments
 (0)