From b67050638b65156c55798b60a0a75e15fe935d2d Mon Sep 17 00:00:00 2001 From: Pavel Feldman Date: Fri, 1 Mar 2024 09:36:04 -0800 Subject: [PATCH] cherry-pick(#29766): fix(tsload): fix tsconfig inheritance resolution --- packages/playwright/src/third_party/tsconfig-loader.ts | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/packages/playwright/src/third_party/tsconfig-loader.ts b/packages/playwright/src/third_party/tsconfig-loader.ts index ffe8af1a00bfa..d14b7602b0dd9 100644 --- a/packages/playwright/src/third_party/tsconfig-loader.ts +++ b/packages/playwright/src/third_party/tsconfig-loader.ts @@ -101,7 +101,8 @@ function resolveConfigFile(baseConfigFile: string, referencedConfigFile: string) referencedConfigFile += '.json'; const currentDir = path.dirname(baseConfigFile); let resolvedConfigFile = path.resolve(currentDir, referencedConfigFile); - if (referencedConfigFile.indexOf('/') !== -1 && referencedConfigFile.indexOf('.') !== -1 && !fs.existsSync(referencedConfigFile)) + // TODO: I don't see how this makes sense, delete in the next minor release. + if (referencedConfigFile.includes('/') && referencedConfigFile.includes('.') && !fs.existsSync(resolvedConfigFile)) resolvedConfigFile = path.join(currentDir, 'node_modules', referencedConfigFile); return resolvedConfigFile; } @@ -117,6 +118,7 @@ function loadTsConfig( let result: LoadedTsConfig = { tsConfigPath: configFilePath, }; + // Retain result instance below, so that caching works. visited.set(configFilePath, result); if (!fs.existsSync(configFilePath)) @@ -137,7 +139,8 @@ function loadTsConfig( const extendsDir = path.dirname(extendedConfig); base.baseUrl = path.join(extendsDir, base.baseUrl); } - result = { ...result, ...base, tsConfigPath: configFilePath }; + // Retain result instance, so that caching works. + Object.assign(result, base, { tsConfigPath: configFilePath }); } const loadedConfig = Object.fromEntries(Object.entries({ @@ -146,7 +149,8 @@ function loadTsConfig( allowJs: parsedConfig?.compilerOptions?.allowJs, }).filter(([, value]) => value !== undefined)); - result = { ...result, ...loadedConfig }; + // Retain result instance, so that caching works. + Object.assign(result, loadedConfig); for (const ref of parsedConfig.references || []) references.push(loadTsConfig(resolveConfigFile(configFilePath, ref.path), references, visited));