Skip to content

Commit 79b5660

Browse files
committed
feat!: disallow manually passing a list of references to TsconfigOptions::references (#902)
Manually passing in a list of references is useless. `tsconfig.json` should always be the source of truth. Searching on github shows no one uses this option.
1 parent d205b70 commit 79b5660

File tree

6 files changed

+15
-123
lines changed

6 files changed

+15
-123
lines changed

napi/index.d.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -279,7 +279,6 @@ export interface TsconfigOptions {
279279
* Support for Typescript Project References.
280280
*
281281
* * `'auto'`: use the `references` field from tsconfig of `config_file`.
282-
* * `string[]`: manually provided relative or absolute path.
283282
*/
284-
references?: 'auto' | string[]
283+
references?: 'auto'
285284
}

napi/src/options.rs

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -210,9 +210,8 @@ pub struct TsconfigOptions {
210210
/// Support for Typescript Project References.
211211
///
212212
/// * `'auto'`: use the `references` field from tsconfig of `config_file`.
213-
/// * `string[]`: manually provided relative or absolute path.
214-
#[napi(ts_type = "'auto' | string[]")]
215-
pub references: Option<Either<String, Vec<String>>>,
213+
#[napi(ts_type = "'auto'")]
214+
pub references: Option<String>,
216215
}
217216

218217
impl From<Restriction> for oxc_resolver::Restriction {
@@ -250,15 +249,10 @@ impl From<TsconfigOptions> for oxc_resolver::TsconfigOptions {
250249
oxc_resolver::TsconfigOptions {
251250
config_file: PathBuf::from(val.config_file),
252251
references: match val.references {
253-
Some(Either::A(string)) if string.as_str() == "auto" => {
254-
oxc_resolver::TsconfigReferences::Auto
255-
}
256-
Some(Either::A(opt)) => {
252+
Some(string) if string.as_str() == "auto" => oxc_resolver::TsconfigReferences::Auto,
253+
Some(opt) => {
257254
panic!("`{}` is not a valid option for tsconfig references", opt)
258255
}
259-
Some(Either::B(paths)) => oxc_resolver::TsconfigReferences::Paths(
260-
paths.into_iter().map(PathBuf::from).collect::<Vec<_>>(),
261-
),
262256
None => oxc_resolver::TsconfigReferences::Disabled,
263257
},
264258
}

src/options.rs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -494,13 +494,11 @@ pub struct TsconfigOptions {
494494
}
495495

496496
/// Configuration for [TsconfigOptions::references]
497-
#[derive(Debug, Clone)]
497+
#[derive(Debug, Clone, Copy)]
498498
pub enum TsconfigReferences {
499499
Disabled,
500500
/// Use the `references` field from tsconfig of `config_file`.
501501
Auto,
502-
/// Manually provided relative or absolute path.
503-
Paths(Vec<PathBuf>),
504502
}
505503

506504
impl Default for ResolveOptions {

src/tests/tsconfig_project_references.rs

Lines changed: 0 additions & 91 deletions
Original file line numberDiff line numberDiff line change
@@ -134,97 +134,6 @@ fn disabled() {
134134
}
135135
}
136136

137-
#[test]
138-
fn manual() {
139-
let f = super::fixture_root().join("tsconfig/cases/project-references");
140-
141-
// The following resolver's `config_file` has defined it's own paths alias which has higher priority
142-
// some cases will work without references
143-
let resolver = Resolver::new(ResolveOptions {
144-
tsconfig: Some(TsconfigDiscovery::Manual(TsconfigOptions {
145-
config_file: f.join("app"),
146-
references: TsconfigReferences::Paths(vec!["../project-a/conf.json".into()]),
147-
})),
148-
..ResolveOptions::default()
149-
});
150-
151-
#[rustfmt::skip]
152-
let pass = [
153-
// Test normal paths alias
154-
(f.join("app"), "@/index.ts", Ok(f.join("app/aliased/index.ts"))),
155-
(f.join("app"), "@/../index.ts", Ok(f.join("app/index.ts"))),
156-
// Test project reference
157-
(f.join("project-a"), "@/index.ts", Ok(f.join("project-a/aliased/index.ts"))),
158-
(f.join("project-b/src"), "@/index.ts", Ok(f.join("app/aliased/index.ts"))),
159-
// Does not have paths alias
160-
(f.join("project-a"), "./index.ts", Ok(f.join("project-a/index.ts"))),
161-
(f.join("project-c"), "./index.ts", Ok(f.join("project-c/index.ts"))),
162-
];
163-
164-
for (path, request, expected) in pass {
165-
let resolved_path = resolver.resolve(&path, request).map(|f| f.full_path());
166-
assert_eq!(resolved_path, expected, "{request} {path:?}");
167-
}
168-
169-
// The following resolver's `config_file` has no `paths` alias with `references` enabled
170-
let no_paths_resolver = Resolver::new(ResolveOptions {
171-
tsconfig: Some(TsconfigDiscovery::Manual(TsconfigOptions {
172-
config_file: f.join("app/tsconfig.nopaths.json"),
173-
references: TsconfigReferences::Paths(vec!["../project-a/conf.json".into()]),
174-
})),
175-
..ResolveOptions::default()
176-
});
177-
178-
#[rustfmt::skip]
179-
let pass = [
180-
// Test normal paths alias
181-
(f.join("app"), "@/index.ts", Err(ResolveError::NotFound("@/index.ts".into()))),
182-
(f.join("app"), "@/../index.ts", Ok(f.join("app/index.ts"))),
183-
// Test project reference
184-
(f.join("project-a"), "@/index.ts", Ok(f.join("project-a/aliased/index.ts"))),
185-
(f.join("project-b/src"), "@/index.ts", Err(ResolveError::NotFound("@/index.ts".into()))),
186-
// Does not have paths alias
187-
(f.join("project-a"), "./index.ts", Ok(f.join("project-a/index.ts"))),
188-
(f.join("project-c"), "./index.ts", Ok(f.join("project-c/index.ts"))),
189-
];
190-
191-
for (path, request, expected) in pass {
192-
let resolved_path = no_paths_resolver.resolve(&path, request).map(|f| f.full_path());
193-
assert_eq!(resolved_path, expected, "{request} {path:?}");
194-
}
195-
}
196-
197-
#[test]
198-
fn self_reference() {
199-
let f = super::fixture_root().join("tsconfig/cases/project-references");
200-
201-
#[rustfmt::skip]
202-
let pass = [
203-
(f.join("app"), vec!["./tsconfig.json".into()]),
204-
(f.join("app/tsconfig.json"), vec!["./tsconfig.json".into()]),
205-
(f.join("app"), vec![f.join("app")]),
206-
(f.join("app/tsconfig.json"), vec![f.join("app")]),
207-
(f.join("app/tsconfig.json"), vec![f.join("project-b"), f.join("app")]),
208-
];
209-
210-
for (config_file, reference_paths) in pass {
211-
let resolver = Resolver::new(ResolveOptions {
212-
tsconfig: Some(TsconfigDiscovery::Manual(TsconfigOptions {
213-
config_file: config_file.clone(),
214-
references: TsconfigReferences::Paths(reference_paths.clone()),
215-
})),
216-
..ResolveOptions::default()
217-
});
218-
let path = f.join("app");
219-
let resolved_path = resolver.resolve(&path, "@/index.ts").map(|f| f.full_path());
220-
assert_eq!(
221-
resolved_path,
222-
Err(ResolveError::TsconfigSelfReference(f.join("app/tsconfig.json"))),
223-
"{config_file:?} {reference_paths:?}"
224-
);
225-
}
226-
}
227-
228137
#[test]
229138
fn references_with_extends() {
230139
let f = super::fixture_root().join("tsconfig/cases/project-references/extends");

src/tsconfig.rs

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -145,18 +145,13 @@ impl TsConfig {
145145
/// Loads the given references into this tsconfig.
146146
///
147147
/// Returns whether any references are defined in the tsconfig.
148-
pub(crate) fn load_references(&mut self, references: &TsconfigReferences) -> bool {
148+
pub(crate) fn load_references(&mut self, references: TsconfigReferences) -> bool {
149149
match references {
150150
TsconfigReferences::Disabled => {
151151
self.references.drain(..);
152152
}
153153
TsconfigReferences::Auto => {}
154-
TsconfigReferences::Paths(paths) => {
155-
self.references =
156-
paths.iter().map(|path| ProjectReference { path: path.clone() }).collect();
157-
}
158154
}
159-
160155
!self.references.is_empty()
161156
}
162157

src/tsconfig_resolver.rs

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ impl<Fs: FileSystem> ResolverGeneric<Fs> {
138138
self.load_tsconfig(
139139
true,
140140
&tsconfig_options.config_file,
141-
&tsconfig_options.references,
141+
tsconfig_options.references,
142142
&mut ctx,
143143
)
144144
.map(Some)
@@ -160,9 +160,9 @@ impl<Fs: FileSystem> ResolverGeneric<Fs> {
160160
pub fn resolve_tsconfig<P: AsRef<Path>>(&self, path: P) -> Result<Arc<TsConfig>, ResolveError> {
161161
let path = path.as_ref();
162162
let references = match &self.options.tsconfig {
163-
Some(TsconfigDiscovery::Manual(o)) => &o.references,
164-
Some(TsconfigDiscovery::Auto) => &TsconfigReferences::Auto,
165-
None => &TsconfigReferences::Disabled,
163+
Some(TsconfigDiscovery::Manual(o)) => o.references,
164+
Some(TsconfigDiscovery::Auto) => TsconfigReferences::Auto,
165+
None => TsconfigReferences::Disabled,
166166
};
167167
self.load_tsconfig(true, path, references, &mut TsconfigResolveContext::default())
168168
}
@@ -171,7 +171,7 @@ impl<Fs: FileSystem> ResolverGeneric<Fs> {
171171
&self,
172172
root: bool,
173173
path: &Path,
174-
references: &TsconfigReferences,
174+
references: TsconfigReferences,
175175
ctx: &mut TsconfigResolveContext,
176176
) -> Result<Arc<TsConfig>, ResolveError> {
177177
self.cache.get_tsconfig(root, path, |tsconfig| {
@@ -195,7 +195,7 @@ impl<Fs: FileSystem> ResolverGeneric<Fs> {
195195
let extended_tsconfig = self.load_tsconfig(
196196
/* root */ false,
197197
&extended_tsconfig_path,
198-
&TsconfigReferences::Disabled,
198+
TsconfigReferences::Disabled,
199199
ctx,
200200
)?;
201201
tsconfig.extend_tsconfig(&extended_tsconfig);
@@ -247,7 +247,7 @@ impl<Fs: FileSystem> ResolverGeneric<Fs> {
247247
let extended_tsconfig = self.load_tsconfig(
248248
/* root */ false,
249249
&extended_tsconfig_path,
250-
&TsconfigReferences::Disabled,
250+
TsconfigReferences::Disabled,
251251
ctx,
252252
)?;
253253
tsconfig.extend_tsconfig(&extended_tsconfig);
@@ -277,10 +277,7 @@ impl<Fs: FileSystem> ResolverGeneric<Fs> {
277277
}
278278
// Resolve against project references because project references are not discovered yet.
279279
Some(TsconfigDiscovery::Manual(o))
280-
if matches!(
281-
o.references,
282-
TsconfigReferences::Auto | TsconfigReferences::Paths(_)
283-
) =>
280+
if matches!(o.references, TsconfigReferences::Auto) =>
284281
{
285282
tsconfig.resolve_references_then_self_paths(cached_path.path(), specifier)
286283
}

0 commit comments

Comments
 (0)