Skip to content

Commit 6b0061a

Browse files
authored
fix: extending tsconfig paths with baseUrl in original tsconfig file (#91)
relates web-infra-dev/rspack#5671
1 parent cb9276d commit 6b0061a

File tree

5 files changed

+30
-12
lines changed

5 files changed

+30
-12
lines changed

fixtures/parcel/tsconfig/extends-paths/src/index.js

Whitespace-only changes.
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
{
2+
"compilerOptions": {
3+
"paths": {
4+
"@/*": ["./*"]
5+
}
6+
}
7+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{
2+
"extends": "./tsconfig.base.json",
3+
"compilerOptions": {
4+
"baseUrl": "src",
5+
},
6+
}

src/tests/tsconfig_paths.rs

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -18,24 +18,26 @@ fn tsconfig() {
1818

1919
#[rustfmt::skip]
2020
let pass = [
21-
(f.clone(), "ts-path", f.join("foo.js")),
22-
(f.join("nested"), "ts-path", f.join("nested/test.js")),
23-
(f.join("tsconfig/index"), "foo", f.join("node_modules/tsconfig-index/foo.js")),
21+
(f.clone(), None, "ts-path", f.join("foo.js")),
22+
(f.join("nested"), None, "ts-path", f.join("nested/test.js")),
23+
(f.join("tsconfig/index"), None, "foo", f.join("node_modules/tsconfig-index/foo.js")),
2424
// This requires reading package.json.tsconfig field
2525
// (f.join("tsconfig/field"), "foo", f.join("node_modules/tsconfig-field/foo.js"))
26-
(f.join("tsconfig/exports"), "foo", f.join("node_modules/tsconfig-exports/foo.js")),
27-
(f.join("tsconfig/extends-extension"), "foo", f.join("tsconfig/extends-extension/foo.js")),
28-
(f.join("tsconfig/extends-extensionless"), "foo", f.join("node_modules/tsconfig-field/foo.js"))
26+
(f.join("tsconfig/exports"), None, "foo", f.join("node_modules/tsconfig-exports/foo.js")),
27+
(f.join("tsconfig/extends-extension"), None, "foo", f.join("tsconfig/extends-extension/foo.js")),
28+
(f.join("tsconfig/extends-extensionless"), None, "foo", f.join("node_modules/tsconfig-field/foo.js")),
29+
(f.join("tsconfig/extends-paths"), Some("src"), "@/index", f.join("tsconfig/extends-paths/src/index.js")),
2930
];
3031

31-
for (path, request, expected) in pass {
32+
for (dir, subdir, request, expected) in pass {
3233
let resolver = Resolver::new(ResolveOptions {
3334
tsconfig: Some(TsconfigOptions {
34-
config_file: path.join("tsconfig.json"),
35+
config_file: dir.join("tsconfig.json"),
3536
references: TsconfigReferences::Auto,
3637
}),
3738
..ResolveOptions::default()
3839
});
40+
let path = subdir.map_or(dir.clone(), |subdir| dir.join(subdir));
3941
let resolved_path = resolver.resolve(&path, request).map(|f| f.full_path());
4042
assert_eq!(resolved_path, Ok(expected), "{request} {path:?}");
4143
}

src/tsconfig.rs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -87,13 +87,16 @@ impl TsConfig {
8787

8888
pub fn extend_tsconfig(&mut self, tsconfig: &Self) {
8989
let compiler_options = &mut self.compiler_options;
90-
if compiler_options.base_url.is_none() {
91-
compiler_options.base_url = tsconfig.compiler_options.base_url.clone();
92-
}
9390
if compiler_options.paths.is_none() {
94-
compiler_options.paths_base = tsconfig.compiler_options.paths_base.clone();
91+
compiler_options.paths_base = compiler_options
92+
.base_url
93+
.as_ref()
94+
.map_or_else(|| tsconfig.compiler_options.paths_base.clone(), Clone::clone);
9595
compiler_options.paths = tsconfig.compiler_options.paths.clone();
9696
}
97+
if compiler_options.base_url.is_none() {
98+
compiler_options.base_url = tsconfig.compiler_options.base_url.clone();
99+
}
97100
}
98101

99102
pub fn resolve(&self, path: &Path, specifier: &str) -> Vec<PathBuf> {

0 commit comments

Comments
 (0)