Skip to content

Commit e22c368

Browse files
authoredApr 19, 2024··
fix(es/resolver): Prioritze jsc.paths by length in tsc resolver (#8875)
**Description:** See #8858 **BREAKING CHANGE:** `jsc.paths` are now prioritized differently to align with `tsc`. The order is: 1. Exact matches 2. Wildcard pattern matches, sorted by length of prefix before wildcard **Related issue:** - Closes #8858
1 parent 2e0663b commit e22c368

File tree

2 files changed

+49
-2
lines changed

2 files changed

+49
-2
lines changed
 

‎crates/swc_ecma_loader/src/resolvers/tsc.rs

+14-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
1-
use std::path::{Component, Path, PathBuf};
1+
use std::{
2+
cmp::Ordering,
3+
path::{Component, Path, PathBuf},
4+
};
25

36
use anyhow::{bail, Context, Error};
47
use swc_common::FileName;
@@ -58,7 +61,7 @@ where
5861
);
5962
}
6063

61-
let paths = paths
64+
let mut paths: Vec<(Pattern, Vec<String>)> = paths
6265
.into_iter()
6366
.map(|(from, to)| {
6467
assert!(
@@ -92,6 +95,15 @@ where
9295
})
9396
.collect();
9497

98+
paths.sort_by(|(a, _), (b, _)| match (a, b) {
99+
(Pattern::Wildcard { .. }, Pattern::Exact(_)) => Ordering::Greater,
100+
(Pattern::Exact(_), Pattern::Wildcard { .. }) => Ordering::Less,
101+
(Pattern::Exact(_), Pattern::Exact(_)) => Ordering::Equal,
102+
(Pattern::Wildcard { prefix: prefix_a }, Pattern::Wildcard { prefix: prefix_b }) => {
103+
prefix_a.len().cmp(&prefix_b.len()).reverse()
104+
}
105+
});
106+
95107
Self {
96108
inner,
97109
base_url_filename: FileName::Real(base_url.clone()),

‎crates/swc_ecma_loader/tests/tsc_resolver.rs

+35
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,41 @@ fn base_url_precedence() {
189189
}
190190
}
191191

192+
#[test]
193+
fn pattern_length_precedence() {
194+
let mut map = HashMap::default();
195+
map.insert(
196+
"./packages/helpers/src/hello".to_string(),
197+
"good".to_string(),
198+
);
199+
200+
let r = TsConfigResolver::new(
201+
TestResolver(map),
202+
".".into(),
203+
vec![
204+
("@app/*".into(), vec!["./packages/*/src".into()]),
205+
(
206+
"@app/helpers/*".into(),
207+
vec!["./packages/helpers/src/*".into()],
208+
),
209+
],
210+
);
211+
212+
{
213+
let resolved = r
214+
.resolve(&FileName::Anon, "@app/helpers/hello")
215+
.expect("should resolve @app/helpers/hello");
216+
217+
assert_eq!(
218+
resolved,
219+
Resolution {
220+
filename: FileName::Custom("good".into()),
221+
slug: None
222+
}
223+
);
224+
}
225+
}
226+
192227
struct TestResolver(AHashMap<String, String>);
193228

194229
impl Resolve for TestResolver {

0 commit comments

Comments
 (0)
Please sign in to comment.