Skip to content

Commit 2c98773

Browse files
jerrykingxyzBoshen
andauthored
fix: tsconfig project reference it self should throw error (#211)
--------- Co-authored-by: Boshen <[email protected]>
1 parent a662c98 commit 2c98773

File tree

4 files changed

+44
-2
lines changed

4 files changed

+44
-2
lines changed

src/error.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,10 @@ pub enum ResolveError {
2828
#[error("Tsconfig not found {0}")]
2929
TsconfigNotFound(PathBuf),
3030

31+
/// Tsconfig's project reference path points to it self
32+
#[error("Tsconfig's project reference path points to this tsconfig {0}")]
33+
TsconfigSelfReference(PathBuf),
34+
3135
#[error("{0}")]
3236
IOError(IOError),
3337

src/lib.rs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1099,7 +1099,14 @@ impl<Fs: FileSystem> ResolverGeneric<Fs> {
10991099
let tsconfig = self.cache.tsconfig(
11001100
/* root */ true,
11011101
&reference_tsconfig_path,
1102-
|_| Ok(()),
1102+
|reference_tsconfig| {
1103+
if reference_tsconfig.path == tsconfig.path {
1104+
return Err(ResolveError::TsconfigSelfReference(
1105+
reference_tsconfig.path.clone(),
1106+
));
1107+
}
1108+
Ok(())
1109+
},
11031110
)?;
11041111
reference.tsconfig.replace(tsconfig);
11051112
}

src/tests/tsconfig_project_references.rs

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,3 +99,34 @@ fn manual() {
9999
assert_eq!(resolved_path, expected, "{request} {path:?}");
100100
}
101101
}
102+
103+
#[test]
104+
fn self_reference() {
105+
let f = super::fixture_root().join("tsconfig/cases/project_references");
106+
107+
#[rustfmt::skip]
108+
let pass = [
109+
(f.join("app"), vec!["./tsconfig.json".into()]),
110+
(f.join("app/tsconfig.json"), vec!["./tsconfig.json".into()]),
111+
(f.join("app"), vec![f.join("app")]),
112+
(f.join("app/tsconfig.json"), vec![f.join("app")]),
113+
(f.join("app/tsconfig.json"), vec![f.join("project_b"), f.join("app")]),
114+
];
115+
116+
for (config_file, reference_paths) in pass {
117+
let resolver = Resolver::new(ResolveOptions {
118+
tsconfig: Some(TsconfigOptions {
119+
config_file: config_file.clone(),
120+
references: TsconfigReferences::Paths(reference_paths.clone()),
121+
}),
122+
..ResolveOptions::default()
123+
});
124+
let path = f.join("app");
125+
let resolved_path = resolver.resolve(&path, "@/index.ts").map(|f| f.full_path());
126+
assert_eq!(
127+
resolved_path,
128+
Err(ResolveError::TsconfigSelfReference(f.join("app/tsconfig.json"))),
129+
"{config_file:?} {reference_paths:?}"
130+
);
131+
}
132+
}

src/tsconfig.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ pub struct TsConfig {
2929

3030
/// Path to `tsconfig.json`. Contains the `tsconfig.json` filename.
3131
#[serde(skip)]
32-
path: PathBuf,
32+
pub(crate) path: PathBuf,
3333

3434
#[serde(default)]
3535
pub extends: Option<ExtendsField>,

0 commit comments

Comments
 (0)