From 3f938348e4f91ab519cbb3a38bb02c9b6f50ba6d Mon Sep 17 00:00:00 2001 From: Logicer Date: Wed, 20 Dec 2023 18:30:51 +1100 Subject: [PATCH] support tsconfig extends array --- packages/core/src/tsconfig.ts | 49 ++++++++++++++++++++--------------- 1 file changed, 28 insertions(+), 21 deletions(-) diff --git a/packages/core/src/tsconfig.ts b/packages/core/src/tsconfig.ts index 1158da8..ac8bbfc 100644 --- a/packages/core/src/tsconfig.ts +++ b/packages/core/src/tsconfig.ts @@ -89,7 +89,7 @@ function getTsConfigFilePath(project: string, fallbackProject?: string[]) { } interface JsonConfig { - extends?: string + extends?: string | string[] compilerOptions?: { baseUrl?: string; outDir?: string; [name: string]: unknown } include?: string[] exclude?: string[] @@ -113,28 +113,35 @@ async function getTsConfig(configFilePath: string, dirname: string): Promise path.resolve(p, 'node_modules', config.extends || '')) + let lastBasename = dirname + const extendsArray = Array.isArray(config.extends) ? config.extends : [config.extends] + let extendsCompilerOptions: JsonConfig = {}; + for (const extend of extendsArray) { + let project: string + let fallbackProjects: string[] = [] + if (path.isAbsolute(extend)) { + project = extend + } else if (extend === '.' + || extend === '..' + || extend.startsWith(`.${path.sep}`) + || extend.startsWith(`..${path.sep}`) + || extend.startsWith('./') + || extend.startsWith('../') + ) { + project = path.resolve(dirname, extend) + } else { + project = path.resolve(dirname, 'node_modules', extend) + const paths = await findParentsWithNodeModules(dirname) + fallbackProjects = paths.map(p => path.resolve(p, 'node_modules', extend || '')) + } + const { configFilePath, dirname: extendsBasename } = getTsConfigFilePath(project, fallbackProjects) + lastBasename = extendsBasename; + const extendsConfig = await getTsConfig(configFilePath, extendsBasename); + extendsCompilerOptions = { ...extendsCompilerOptions, ...extendsConfig.compilerOptions } } - const { configFilePath, dirname: extendsBasename } = getTsConfigFilePath(project, fallbackProjects) - const extendsConfig = await getTsConfig(configFilePath, extendsBasename) + config.compilerOptions = { ...extendsCompilerOptions, ...config.compilerOptions } const topLevelBaseUrl = config.compilerOptions ? config.compilerOptions.baseUrl : undefined - config.compilerOptions = { ...extendsConfig.compilerOptions, ...config.compilerOptions } - config.basePath = topLevelBaseUrl ? dirname : extendsBasename; + config.basePath = topLevelBaseUrl ? dirname : lastBasename; } return config }