diff --git a/fixtures/enhanced-resolve/test/fixtures/node_modules/@scope/dir-and-file/foo.js b/fixtures/enhanced-resolve/test/fixtures/node_modules/@scope/dir-and-file/foo.js new file mode 100644 index 00000000..e69de29b diff --git a/fixtures/enhanced-resolve/test/fixtures/node_modules/@scope/dir-and-file/foo/bar.js b/fixtures/enhanced-resolve/test/fixtures/node_modules/@scope/dir-and-file/foo/bar.js new file mode 100644 index 00000000..e69de29b diff --git a/fixtures/enhanced-resolve/test/fixtures/node_modules/@scope/dir-and-file/foo/index.js b/fixtures/enhanced-resolve/test/fixtures/node_modules/@scope/dir-and-file/foo/index.js new file mode 100644 index 00000000..e69de29b diff --git a/fixtures/enhanced-resolve/test/fixtures/node_modules/@scope/dir-and-file/package.json b/fixtures/enhanced-resolve/test/fixtures/node_modules/@scope/dir-and-file/package.json new file mode 100644 index 00000000..026d2a9c --- /dev/null +++ b/fixtures/enhanced-resolve/test/fixtures/node_modules/@scope/dir-and-file/package.json @@ -0,0 +1,3 @@ +{ + "name": "@scope/dir-and-file" +} diff --git a/fixtures/enhanced-resolve/test/fixtures/node_modules/dir-and-file/foo.js b/fixtures/enhanced-resolve/test/fixtures/node_modules/dir-and-file/foo.js new file mode 100644 index 00000000..e69de29b diff --git a/fixtures/enhanced-resolve/test/fixtures/node_modules/dir-and-file/foo/bar.js b/fixtures/enhanced-resolve/test/fixtures/node_modules/dir-and-file/foo/bar.js new file mode 100644 index 00000000..e69de29b diff --git a/fixtures/enhanced-resolve/test/fixtures/node_modules/dir-and-file/foo/index.js b/fixtures/enhanced-resolve/test/fixtures/node_modules/dir-and-file/foo/index.js new file mode 100644 index 00000000..e69de29b diff --git a/fixtures/enhanced-resolve/test/fixtures/node_modules/dir-and-file/package.json b/fixtures/enhanced-resolve/test/fixtures/node_modules/dir-and-file/package.json new file mode 100644 index 00000000..a66419b1 --- /dev/null +++ b/fixtures/enhanced-resolve/test/fixtures/node_modules/dir-and-file/package.json @@ -0,0 +1,3 @@ +{ + "name": "dir-and-file" +} diff --git a/src/lib.rs b/src/lib.rs index 0c9e0a2d..b1c58118 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -932,7 +932,15 @@ impl ResolverGeneric { return Ok(self.cache.is_dir(&cached_path, ctx).then(|| cached_path.clone())); } - // Perf: try LOAD_AS_DIRECTORY first. No modern package manager creates `node_modules/X.js`. + // Only load the file if it is targeting a `X/sub/dir`. + if specifier != package_name + && !specifier.ends_with('/') + && let Some(path) = self.load_as_file(&cached_path, tsconfig, ctx)? + { + return Ok(Some(path)); + } + // Otherwise just load the directory. + // No modern package manager creates `node_modules/X.js`. if self.cache.is_dir(&cached_path, ctx) { if let Some(path) = self.load_browser_field_or_alias(&cached_path, tsconfig, ctx)? @@ -942,6 +950,7 @@ impl ResolverGeneric { if let Some(path) = self.load_as_directory(&cached_path, tsconfig, ctx)? { return Ok(Some(path)); } + // Still need to try to load the file in case there are path aliases. } else if let Some(path) = self.load_as_file(&cached_path, tsconfig, ctx)? { return Ok(Some(path)); } diff --git a/src/tests/resolve.rs b/src/tests/resolve.rs index 76bee505..80e5fb79 100644 --- a/src/tests/resolve.rs +++ b/src/tests/resolve.rs @@ -49,7 +49,11 @@ fn resolve() { ("handle fragment edge case (no fragment)", f.clone(), "./no#fragment/#/#", f.join("no#fragment/#/#.js")), ("handle fragment edge case (fragment)", f.clone(), "./no#fragment/#/", f.join("no.js#fragment/#/")), ("handle fragment escaping", f.clone(), "./no\0#fragment/\0#/\0##fragment", f.join("no#fragment/#/#.js#fragment")), - + // Test `node_modules/X/foo/` and `node_modules/X/foo.js` precedence. + ("file and dir precedence 1", f.clone(), "dir-and-file/foo", f.join("node_modules/dir-and-file/foo.js")), + ("file and dir precedence 2", f.clone(), "@scope/dir-and-file/foo", f.join("node_modules/@scope/dir-and-file/foo.js")), + ("file and dir precedence 1", f.clone(), "dir-and-file/foo/", f.join("node_modules/dir-and-file/foo/index.js")), + ("file and dir precedence 2", f.clone(), "@scope/dir-and-file/foo/", f.join("node_modules/@scope/dir-and-file/foo/index.js")), ]; for (comment, path, request, expected) in pass {