diff --git a/src/lib.rs b/src/lib.rs index 9299c091..8486ba51 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -973,9 +973,9 @@ impl ResolverGeneric { self.cache.tsconfig(path, |tsconfig| { let directory = self.cache.value(tsconfig.directory()); tracing::trace!(tsconfig = ?tsconfig, "load_tsconfig"); + // Extend tsconfig - let mut extended_tsconfig_paths = vec![]; - for tsconfig_extend_specifier in &tsconfig.extends { + if let Some(tsconfig_extend_specifier) = &tsconfig.extends { let extended_tsconfig_path = match tsconfig_extend_specifier.as_bytes().first() { None => { return Err(ResolveError::Specifier(SpecifierError::Empty( @@ -1004,13 +1004,12 @@ impl ResolverGeneric { })? .to_path_buf(), }; - extended_tsconfig_paths.push(extended_tsconfig_path); - } - for extended_tsconfig_path in extended_tsconfig_paths { + let extended_tsconfig = self.load_tsconfig(&extended_tsconfig_path, &TsconfigReferences::Disabled)?; tsconfig.extend_tsconfig(&extended_tsconfig); } + // Load project references match references { TsconfigReferences::Disabled => { diff --git a/src/tsconfig.rs b/src/tsconfig.rs index 31abaa20..9f12c339 100644 --- a/src/tsconfig.rs +++ b/src/tsconfig.rs @@ -18,8 +18,10 @@ pub struct TsConfig { #[serde(skip)] path: PathBuf, - #[serde(default, deserialize_with = "deserialize_extends")] - pub extends: Vec, + /// The value of extends must be a string containing a path to another configuration file to inherit from. + /// https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-1.html#configuration-inheritance + #[serde(default)] + pub extends: Option, #[serde(default)] pub references: Vec, @@ -50,22 +52,6 @@ pub struct CompilerOptions { paths_base: PathBuf, } -fn deserialize_extends<'de, D>(deserializer: D) -> Result, D::Error> -where - D: serde::Deserializer<'de>, -{ - #[derive(serde::Deserialize)] - #[serde(untagged)] - enum StringOrArray { - String(String), - Array(Vec), - } - Ok(match StringOrArray::deserialize(deserializer)? { - StringOrArray::String(s) => vec![s], - StringOrArray::Array(a) => a, - }) -} - impl TsConfig { pub fn parse(path: &Path, json: &mut str) -> Result { _ = json_strip_comments::strip(json);