Skip to content

Commit c635417

Browse files
committed
fix: allow resolving package?query#fragment for packages with exports field (#655)
Resolving `package?query#fragment` to packages with exports field is allowed in Vite to allow things like `css-package?url`, `wasm-package?init`. This was not allowed by oxc-resolver and this PR allows that. The current behavior of oxc-resolver comes from this change in enhanced-resolve (webpack/enhanced-resolve#225). This PR adds tests that disallows `pkg?foo` but allows `pkg/nested?foo`. This current behavior doesn't make sense to me. Both `pkg?foo` and `pkg/nested?foo` are not allowed by Node and I don't find a reason to treat them differently. fixes vitejs/rolldown-vite#382 refs 97dfb1a
1 parent 6f7e505 commit c635417

File tree

2 files changed

+2
-14
lines changed

2 files changed

+2
-14
lines changed

src/lib.rs

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1609,17 +1609,6 @@ impl<Fs: FileSystem> ResolverGeneric<Fs> {
16091609
// 2. If subpath is equal to ".", then
16101610
// Note: subpath is not prepended with a dot when passed in.
16111611
if subpath == "." {
1612-
// enhanced-resolve appends query and fragment when resolving exports field
1613-
// https://github.com/webpack/enhanced-resolve/blob/a998c7d218b7a9ec2461fc4fddd1ad5dd7687485/lib/ExportsFieldPlugin.js#L57-L62
1614-
// This is only need when querying the main export, otherwise ctx is passed through.
1615-
if ctx.query.is_some() || ctx.fragment.is_some() {
1616-
let query = ctx.query.clone().unwrap_or_default();
1617-
let fragment = ctx.fragment.clone().unwrap_or_default();
1618-
return Err(ResolveError::PackagePathNotExported(
1619-
format!("./{}{query}{fragment}", subpath.trim_start_matches('.')),
1620-
package_url.path().join("package.json"),
1621-
));
1622-
}
16231612
// 1. Let mainExport be undefined.
16241613
let main_export = match exports.kind() {
16251614
// 2. If exports is a String or Array, or an Object containing no keys starting with ".", then

src/tests/exports_field.rs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@ fn test_simple() {
3838
// only test query and fragment.
3939
("resolver should respect query parameters #1", f2.clone(), "exports-field/dist/main.js?foo", f2.join("node_modules/exports-field/lib/lib2/main.js?foo")),
4040
("resolver should respect fragment parameters #1", f2.clone(), "exports-field/dist/main.js#foo", f2.join("node_modules/exports-field/lib/lib2/main.js#foo")),
41+
("resolver should respect query parameters #2. Direct matching", f2.clone(), "exports-field?foo", f2.join("node_modules/exports-field/index.js?foo")),
42+
("resolver should respect fragment parameters #2. Direct matching", f2.clone(), "exports-field#foo", f2.join("node_modules/exports-field/index.js#foo")),
4143
("relative path should work, if relative path as request is used", f.clone(), "./node_modules/exports-field/lib/main.js", f.join("node_modules/exports-field/lib/main.js")),
4244
("self-resolving root", f.clone(), "@exports-field/core", f.join("a.js")),
4345
("should resolve with wildcard pattern #1", f5.clone(), "m/features/f.js", f5.join("node_modules/m/src/features/f.js")),
@@ -60,15 +62,12 @@ fn test_simple() {
6062
}
6163

6264
let p = f.join("node_modules/exports-field/package.json");
63-
let p2 = f2.join("node_modules/exports-field/package.json");
6465
let p4 = f4.join("node_modules/exports-field/package.json");
6566
let p5 = f5.join("node_modules/m/package.json");
6667

6768
#[rustfmt::skip]
6869
let fail = [
6970
// ("throw error if extension not provided", f2.clone(), "exports-field/dist/main", ResolveError::NotFound(f2.join("node_modules/exports-field/lib/lib2/main"))),
70-
("resolver should respect query parameters #2. Direct matching", f2.clone(), "exports-field?foo", ResolveError::PackagePathNotExported("./?foo".into(), p2.clone())),
71-
("resolver should respect fragment parameters #2. Direct matching", f2, "exports-field#foo", ResolveError::PackagePathNotExported("./#foo".into(), p2)),
7271
("relative path should not work with exports field", f.clone(), "./node_modules/exports-field/dist/main.js", ResolveError::NotFound("./node_modules/exports-field/dist/main.js".into())),
7372
("backtracking should not work for request", f.clone(), "exports-field/dist/../../../a.js", ResolveError::InvalidPackageTarget("./lib/../../../a.js".to_string(), "./dist/".to_string(), p.clone())),
7473
("backtracking should not work for exports field target", f.clone(), "exports-field/dist/a.js", ResolveError::InvalidPackageTarget("./../../a.js".to_string(), "./dist/a.js".to_string(), p.clone())),

0 commit comments

Comments
 (0)