Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,9 @@
"#b": "../b.js",
"#ccc/": "c/",
"#c": "c",
"#a/": "a/"
"#a/": "a/",
"#query": "./a.js?query",
"#fragment": "./a.js#fragment"
},
"other": {
"imports": {
Expand Down
6 changes: 6 additions & 0 deletions src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1634,6 +1634,12 @@ impl<C: Cache> ResolverGeneric<C> {

// 1. If target is a String, then
if let Some(target) = target.as_string() {
// Target string con contain queries or fragments:
// `"exports": { ".": { "default": "./foo.js?query#fragment" }`
let parsed = Specifier::parse(target).map_err(ResolveError::Specifier)?;
ctx.with_query_fragment(parsed.query, parsed.fragment);
let target = parsed.path();

// 1. If target does not start with "./", then
if !target.starts_with("./") {
// 1. If isImports is false, or if target starts with "../" or "/", or if target is a valid URL, then
Expand Down
2 changes: 2 additions & 0 deletions src/tests/exports_field.rs
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,8 @@ fn test_simple() {
let pass = [
("resolve root using exports field, not a main field", f.clone(), "exports-field", f.join("node_modules/exports-field/x.js")),
("resolver should respect condition names", f.clone(), "exports-field/dist/main.js", f.join("node_modules/exports-field/lib/lib2/main.js")),
("should resolve query", f.clone(), "exports-field/query.js", f.join("node_modules/exports-field/x.js?query")),
("should resolve fragment", f.clone(), "exports-field/fragment.js", f.join("node_modules/exports-field/x.js#fragment")),
// enhanced_resolve behaves differently to node.js. enhanced_resolve fallbacks when an
// array item is unresolved, where as node.js fallbacks when an array has an
// InvalidPackageTarget error.
Expand Down
2 changes: 2 additions & 0 deletions src/tests/imports_field.rs
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,8 @@ fn test_simple() {
#[rustfmt::skip]
let pass = [
("should resolve using imports field instead of self-referencing", f.clone(), "#imports-field", f.join("b.js")),
("should resolve query", f.clone(), "#query", f.join("a.js?query")),
("should resolve fragment", f.clone(), "#fragment", f.join("a.js#fragment")),
("should resolve using imports field instead of self-referencing for a subpath", f.join("dir"), "#imports-field", f.join("b.js")),
("should resolve package #1", f.clone(), "#a/dist/main.js", f.join("node_modules/a/lib/lib2/main.js")),
("should resolve package #3", f.clone(), "#ccc/index.js", f.join("node_modules/c/index.js")),
Expand Down
Loading