From fb6c43788a7b05571cce027f0dc8441f78aa70ff Mon Sep 17 00:00:00 2001 From: JounQin Date: Sun, 16 Mar 2025 03:04:56 +0800 Subject: [PATCH 1/2] feat: support resolving path with extra query --- .../test/fixtures/export-query/add.js | 1 + .../test/fixtures/export-query/equal.js?query | 1 + .../test/fixtures/export-query/minus.js?query | 1 + .../test/fixtures/export-query/package.json | 8 ++++++++ src/lib.rs | 19 +++++++++++++++++++ src/tests/exports_field.rs | 4 ++++ 6 files changed, 34 insertions(+) create mode 100644 fixtures/enhanced_resolve/test/fixtures/export-query/add.js create mode 100644 fixtures/enhanced_resolve/test/fixtures/export-query/equal.js?query create mode 100644 fixtures/enhanced_resolve/test/fixtures/export-query/minus.js?query create mode 100644 fixtures/enhanced_resolve/test/fixtures/export-query/package.json diff --git a/fixtures/enhanced_resolve/test/fixtures/export-query/add.js b/fixtures/enhanced_resolve/test/fixtures/export-query/add.js new file mode 100644 index 00000000..6e31ef4b --- /dev/null +++ b/fixtures/enhanced_resolve/test/fixtures/export-query/add.js @@ -0,0 +1 @@ +export const add = (a, b) => a + b diff --git a/fixtures/enhanced_resolve/test/fixtures/export-query/equal.js?query b/fixtures/enhanced_resolve/test/fixtures/export-query/equal.js?query new file mode 100644 index 00000000..7c99f462 --- /dev/null +++ b/fixtures/enhanced_resolve/test/fixtures/export-query/equal.js?query @@ -0,0 +1 @@ +export const equal = (a, b) => a === b diff --git a/fixtures/enhanced_resolve/test/fixtures/export-query/minus.js?query b/fixtures/enhanced_resolve/test/fixtures/export-query/minus.js?query new file mode 100644 index 00000000..40e6a30f --- /dev/null +++ b/fixtures/enhanced_resolve/test/fixtures/export-query/minus.js?query @@ -0,0 +1 @@ +export const minus = (a, b) => a - b diff --git a/fixtures/enhanced_resolve/test/fixtures/export-query/package.json b/fixtures/enhanced_resolve/test/fixtures/export-query/package.json new file mode 100644 index 00000000..2c08de3f --- /dev/null +++ b/fixtures/enhanced_resolve/test/fixtures/export-query/package.json @@ -0,0 +1,8 @@ +{ + "name": "export-query", + "exports": { + "./add": "./add.js?query1?query2", + "./minus": "./minus.js?query?extra", + "./equal": "./equal.js?query" + } +} diff --git a/src/lib.rs b/src/lib.rs index 7728fc3a..19494cf7 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -936,6 +936,25 @@ impl ResolverGeneric { if let Some(path) = self.load_as_file_or_directory(cached_path, "", ctx)? { return Ok(Some(path)); } + + let mut path_str = cached_path.path().to_str(); + + // 3. If the RESOLVED_PATH contains `?``, it could be a path with query + // so try to resolve it as a file or directory without the query, + // but also `?` is a valid character in a path, so we should try from right to left. + while let Some(s) = path_str { + if let Some((before, _)) = s.rsplit_once('?') { + if let Some(_) = + self.load_as_file_or_directory(&self.cache.value(Path::new(before)), "", ctx)? + { + return Ok(Some(cached_path.clone())); + } + path_str = Some(before); + } else { + break; + } + } + // 3. THROW "not found" Err(ResolveError::NotFound(specifier.to_string())) } diff --git a/src/tests/exports_field.rs b/src/tests/exports_field.rs index 8f3cb4d8..1f5d0433 100644 --- a/src/tests/exports_field.rs +++ b/src/tests/exports_field.rs @@ -12,6 +12,7 @@ fn test_simple() { let f2 = super::fixture().join("exports-field2"); let f4 = super::fixture().join("exports-field-error"); let f5 = super::fixture().join("imports-exports-wildcard"); + let f6 = super::fixture().join("export-query"); let resolver = Resolver::new(ResolveOptions { extensions: vec![".js".into()], @@ -43,6 +44,9 @@ fn test_simple() { ("should resolve with wildcard pattern #7", f5.clone(), "m/middle-3/nested/f", f5.join("node_modules/m/src/middle-3/nested/f/nested/f.js")), ("should resolve with wildcard pattern #8", f5.clone(), "m/middle-4/f/nested", f5.join("node_modules/m/src/middle-4/f/f.js")), ("should resolve with wildcard pattern #9", f5.clone(), "m/middle-5/f$/$", f5.join("node_modules/m/src/middle-5/f$/$.js")), + ("should resolve with query string #10", f6.clone(), "export-query/add", f6.join("add.js?query1?query2")), + ("should resolve with query string #10", f6.clone(), "export-query/minus", f6.join("minus.js?query?extra")), + ("should resolve with query string #10", f6.clone(), "export-query/equal", f6.join("equal.js?query")), ]; // Not needed or snapshot: From 832ea67263da1f3ff2080bc8fb8b74705f8c4b6b Mon Sep 17 00:00:00 2001 From: JounQin Date: Sun, 16 Mar 2025 03:19:28 +0800 Subject: [PATCH 2/2] ci: compatible with Windows, clippy reports --- .../fixtures/export-query/{equal.js?query => equal.js} | 0 .../fixtures/export-query/{minus.js?query => minus.js} | 0 src/lib.rs | 8 ++++++-- src/tests/exports_field.rs | 1 + 4 files changed, 7 insertions(+), 2 deletions(-) rename fixtures/enhanced_resolve/test/fixtures/export-query/{equal.js?query => equal.js} (100%) rename fixtures/enhanced_resolve/test/fixtures/export-query/{minus.js?query => minus.js} (100%) diff --git a/fixtures/enhanced_resolve/test/fixtures/export-query/equal.js?query b/fixtures/enhanced_resolve/test/fixtures/export-query/equal.js similarity index 100% rename from fixtures/enhanced_resolve/test/fixtures/export-query/equal.js?query rename to fixtures/enhanced_resolve/test/fixtures/export-query/equal.js diff --git a/fixtures/enhanced_resolve/test/fixtures/export-query/minus.js?query b/fixtures/enhanced_resolve/test/fixtures/export-query/minus.js similarity index 100% rename from fixtures/enhanced_resolve/test/fixtures/export-query/minus.js?query rename to fixtures/enhanced_resolve/test/fixtures/export-query/minus.js diff --git a/src/lib.rs b/src/lib.rs index 19494cf7..f61cc2f7 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -944,8 +944,12 @@ impl ResolverGeneric { // but also `?` is a valid character in a path, so we should try from right to left. while let Some(s) = path_str { if let Some((before, _)) = s.rsplit_once('?') { - if let Some(_) = - self.load_as_file_or_directory(&self.cache.value(Path::new(before)), "", ctx)? + if (self.load_as_file_or_directory( + &self.cache.value(Path::new(before)), + "", + ctx, + )?) + .is_some() { return Ok(Some(cached_path.clone())); } diff --git a/src/tests/exports_field.rs b/src/tests/exports_field.rs index 1f5d0433..78e770c4 100644 --- a/src/tests/exports_field.rs +++ b/src/tests/exports_field.rs @@ -45,6 +45,7 @@ fn test_simple() { ("should resolve with wildcard pattern #8", f5.clone(), "m/middle-4/f/nested", f5.join("node_modules/m/src/middle-4/f/f.js")), ("should resolve with wildcard pattern #9", f5.clone(), "m/middle-5/f$/$", f5.join("node_modules/m/src/middle-5/f$/$.js")), ("should resolve with query string #10", f6.clone(), "export-query/add", f6.join("add.js?query1?query2")), + // Sadly we can not use real `minus.js?query` and `equal.js?query` file due to Windows: invalid path ("should resolve with query string #10", f6.clone(), "export-query/minus", f6.join("minus.js?query?extra")), ("should resolve with query string #10", f6.clone(), "export-query/equal", f6.join("equal.js?query")), ];