Skip to content

Commit e84cffb

Browse files
committed
test(tsconfig): add focused test for references with extends
Add a dedicated test (`references_with_extends`) and fixture (`references-extends/`) that exercises the fix from the previous commit in isolation: a single-level reference whose `baseUrl`/`paths` are inherited via `extends "../tsconfig.base.json"`. Without `merge_tsconfig_extends` being applied to the reference, the test fails with `NotFound` — confirming the test would have caught the latent extends-on-reference bug. Also revert the `references-transitive` fixture so it focuses purely on multi-level walking; the extends-merging behavior is now covered by the new fixture and test.
1 parent 7cfc5ac commit e84cffb

7 files changed

Lines changed: 55 additions & 2 deletions

File tree

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export const from = "app";
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
{
2+
"compilerOptions": {
3+
"baseUrl": "./",
4+
"paths": {
5+
"@/*": ["./aliased/*"]
6+
}
7+
},
8+
"references": [{ "path": "../project_b" }]
9+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export const from = "project_b via extends";
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
{
2+
"extends": "../tsconfig.base.json",
3+
"compilerOptions": {
4+
"composite": true,
5+
"baseUrl": "./src"
6+
}
7+
}

fixtures/tsconfig/cases/references-transitive/tsconfig.base.json renamed to fixtures/tsconfig/cases/references-extends/tsconfig.base.json

File renamed without changes.
Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
{
2-
"extends": "../tsconfig.base.json",
32
"compilerOptions": {
43
"composite": true,
5-
"baseUrl": "./"
4+
"baseUrl": "./",
5+
"paths": {
6+
"@/*": ["./aliased/*"]
7+
}
68
}
79
}

src/tests/tsconfig_project_references.rs

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -228,3 +228,36 @@ async fn transitive_references() {
228228
assert_eq!(resolved_path, Ok(expected), "{request} from {path:?}");
229229
}
230230
}
231+
232+
// When a project reference uses `extends` to inherit its `baseUrl`/`paths`
233+
// from a shared base config, those fields must be merged before the
234+
// reference is consulted for resolution. Without merging `extends` on
235+
// referenced configs, a request from inside `project_b` would see no
236+
// alias candidates and fail to resolve.
237+
#[tokio::test]
238+
async fn references_with_extends() {
239+
let f = super::fixture_root().join("tsconfig/cases/references-extends");
240+
241+
let resolver = Resolver::new(ResolveOptions {
242+
tsconfig: Some(TsconfigOptions {
243+
config_file: f.join("app"),
244+
references: TsconfigReferences::Auto,
245+
}),
246+
..ResolveOptions::default()
247+
});
248+
249+
// From project_b's directory, the inherited `paths` from
250+
// ../tsconfig.base.json must apply (baseUrl ./src).
251+
let resolved_path = resolver
252+
.resolve(&f.join("project_b/src"), "@/index.ts")
253+
.await
254+
.map(|p| p.full_path());
255+
assert_eq!(resolved_path, Ok(f.join("project_b/src/aliased/index.ts")));
256+
257+
// The entry tsconfig still uses its own `paths`.
258+
let resolved_path = resolver
259+
.resolve(&f.join("app"), "@/index.ts")
260+
.await
261+
.map(|p| p.full_path());
262+
assert_eq!(resolved_path, Ok(f.join("app/aliased/index.ts")));
263+
}

0 commit comments

Comments
 (0)