Skip to content

Commit 547bce7

Browse files
committed
feat(tsconfig): complete inheritance of compilerOptions fields (#657)
Some `compilerOptions` fields were added without implementing the corresponding inheritance logic.
1 parent e8b1acd commit 547bce7

File tree

5 files changed

+68
-16
lines changed

5 files changed

+68
-16
lines changed

fixtures/tsconfig/cases/extends-base-url/base-tsconfig.json

Lines changed: 0 additions & 5 deletions
This file was deleted.
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
{
2+
"compilerOptions": {
3+
"baseUrl": "./src",
4+
"emitDecoratorMetadata": true,
5+
"useDefineForClassFields": true,
6+
"rewriteRelativeImportExtensions": true
7+
}
8+
}

src/tests/tsconfig_extends.rs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ use std::path::Path;
88
use crate::{ResolveOptions, Resolver, TsConfig, TsconfigOptions, TsconfigReferences};
99

1010
#[test]
11-
fn test_extend_tsconfig_base_url() {
12-
let f = super::fixture_root().join("tsconfig/cases/extends-base-url");
11+
fn test_extend_tsconfig_compiler_options() {
12+
let f = super::fixture_root().join("tsconfig/cases/extends-compiler-options");
1313

1414
let resolver = Resolver::new(ResolveOptions {
1515
tsconfig: Some(TsconfigOptions {
@@ -22,8 +22,11 @@ fn test_extend_tsconfig_base_url() {
2222
let resolution = resolver.resolve_tsconfig(&f).expect("resolved");
2323
let compiler_options = resolution.compiler_options();
2424

25-
// Should inherit baseUrl from parent
25+
// Should inherit compilerOptions from parent
2626
assert_eq!(compiler_options.base_url, Some(f.join("src")));
27+
assert_eq!(compiler_options.emit_decorator_metadata, Some(true));
28+
assert_eq!(compiler_options.use_define_for_class_fields, Some(true));
29+
assert_eq!(compiler_options.rewrite_relative_import_extensions, Some(true));
2730
}
2831

2932
#[test]

src/tsconfig.rs

Lines changed: 54 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,7 @@ impl TsConfig {
133133
}
134134

135135
/// Inherits settings from the given tsconfig into `self`.
136+
#[allow(clippy::cognitive_complexity, clippy::too_many_lines)]
136137
pub(crate) fn extend_tsconfig(&mut self, tsconfig: &Self) {
137138
let compiler_options = self.compiler_options_mut();
138139

@@ -171,6 +172,31 @@ impl TsConfig {
171172
}
172173
}
173174

175+
if compiler_options.emit_decorator_metadata.is_none() {
176+
if let Some(emit_decorator_metadata) =
177+
tsconfig.compiler_options().emit_decorator_metadata()
178+
{
179+
compiler_options.set_emit_decorator_metadata(*emit_decorator_metadata);
180+
}
181+
}
182+
183+
if compiler_options.use_define_for_class_fields.is_none() {
184+
if let Some(use_define_for_class_fields) =
185+
tsconfig.compiler_options().use_define_for_class_fields()
186+
{
187+
compiler_options.set_use_define_for_class_fields(*use_define_for_class_fields);
188+
}
189+
}
190+
191+
if compiler_options.rewrite_relative_import_extensions.is_none() {
192+
if let Some(rewrite_relative_import_extensions) =
193+
tsconfig.compiler_options().rewrite_relative_import_extensions()
194+
{
195+
compiler_options
196+
.set_rewrite_relative_import_extensions(*rewrite_relative_import_extensions);
197+
}
198+
}
199+
174200
if compiler_options.jsx().is_none() {
175201
if let Some(jsx) = tsconfig.compiler_options().jsx() {
176202
compiler_options.set_jsx(jsx.to_string());
@@ -475,15 +501,35 @@ impl CompilerOptions {
475501
self.experimental_decorators = Some(experimental_decorators);
476502
}
477503

478-
// /// Whether to emit decorator metadata.
479-
// fn emit_decorator_metadata(&self) -> Option<&bool> {
480-
// self.emit_decorator_metadata.as_ref()
481-
// }
504+
/// Whether to emit decorator metadata.
505+
fn emit_decorator_metadata(&self) -> Option<&bool> {
506+
self.emit_decorator_metadata.as_ref()
507+
}
508+
509+
/// Sets whether to emit decorator metadata.
510+
fn set_emit_decorator_metadata(&mut self, emit_decorator_metadata: bool) {
511+
self.emit_decorator_metadata = Some(emit_decorator_metadata);
512+
}
513+
514+
/// Whether to use define for class fields.
515+
fn use_define_for_class_fields(&self) -> Option<&bool> {
516+
self.use_define_for_class_fields.as_ref()
517+
}
482518

483-
// /// Sets whether to emit decorator metadata.
484-
// fn set_emit_decorator_metadata(&mut self, emit_decorator_metadata: bool) {
485-
// self.emit_decorator_metadata = Some(emit_decorator_metadata);
486-
// }
519+
/// Sets whether to use define for class fields.
520+
fn set_use_define_for_class_fields(&mut self, use_define_for_class_fields: bool) {
521+
self.use_define_for_class_fields = Some(use_define_for_class_fields);
522+
}
523+
524+
/// Whether to rewrite relative import extensions.
525+
fn rewrite_relative_import_extensions(&self) -> Option<&bool> {
526+
self.rewrite_relative_import_extensions.as_ref()
527+
}
528+
529+
/// Sets whether to rewrite relative import extensions.
530+
fn set_rewrite_relative_import_extensions(&mut self, rewrite_relative_import_extensions: bool) {
531+
self.rewrite_relative_import_extensions = Some(rewrite_relative_import_extensions);
532+
}
487533

488534
/// JSX.
489535
fn jsx(&self) -> Option<&str> {

0 commit comments

Comments
 (0)