From 085021ab854b956cfd9d42fbf6d3110652698aaa Mon Sep 17 00:00:00 2001 From: Boshen Date: Thu, 30 Nov 2023 17:01:53 +0800 Subject: [PATCH] fix(resolver): resolve query and fragments with unicode filenames (#1591) --- .../fixtures/enhanced_resolve/test/fixtures/测试.js | 0 crates/oxc_resolver/src/specifier.rs | 2 +- crates/oxc_resolver/src/tests/resolve.rs | 7 +++++++ 3 files changed, 8 insertions(+), 1 deletion(-) create mode 100644 crates/oxc_resolver/fixtures/enhanced_resolve/test/fixtures/测试.js diff --git a/crates/oxc_resolver/fixtures/enhanced_resolve/test/fixtures/测试.js b/crates/oxc_resolver/fixtures/enhanced_resolve/test/fixtures/测试.js new file mode 100644 index 000000000..e69de29bb diff --git a/crates/oxc_resolver/src/specifier.rs b/crates/oxc_resolver/src/specifier.rs index fb679507d..d7bc3c9e0 100644 --- a/crates/oxc_resolver/src/specifier.rs +++ b/crates/oxc_resolver/src/specifier.rs @@ -34,7 +34,7 @@ impl<'a> Specifier<'a> { let mut prev = specifier.chars().next().unwrap(); let mut escaped_indexes = vec![]; - for (i, c) in specifier.chars().enumerate().skip(skip) { + for (i, c) in specifier.char_indices().skip(skip) { if c == '?' { query_start = Some(i); } diff --git a/crates/oxc_resolver/src/tests/resolve.rs b/crates/oxc_resolver/src/tests/resolve.rs index 819c70500..70b816437 100644 --- a/crates/oxc_resolver/src/tests/resolve.rs +++ b/crates/oxc_resolver/src/tests/resolve.rs @@ -27,6 +27,12 @@ fn resolve() { ("file with fragment", f.clone(), "./main1.js#fragment", f.join("main1.js#fragment")), ("file with fragment and query", f.clone(), "./main1.js#fragment?query", f.join("main1.js#fragment?query")), ("file with query and fragment", f.clone(), "./main1.js?#fragment", f.join("main1.js?#fragment")), + + ("file with query (unicode)", f.clone(), "./测试.js?query", f.join("测试.js?query")), + ("file with fragment (unicode)", f.clone(), "./测试.js#fragment", f.join("测试.js#fragment")), + ("file with fragment and query (unicode)", f.clone(), "./测试.js#fragment?query", f.join("测试.js#fragment?query")), + ("file with query and fragment (unicode)", f.clone(), "./测试.js?#fragment", f.join("测试.js?#fragment")), + ("file in module with query", f.clone(), "m1/a?query", f.join("node_modules/m1/a.js?query")), ("file in module with fragment", f.clone(), "m1/a#fragment", f.join("node_modules/m1/a.js#fragment")), ("file in module with fragment and query", f.clone(), "m1/a#fragment?query", f.join("node_modules/m1/a.js#fragment?query")), @@ -43,6 +49,7 @@ 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")), + ]; for (comment, path, request, expected) in pass {