From daec5b75b5a4dbc1833f7f75e7a13cfb78e315e2 Mon Sep 17 00:00:00 2001 From: Sushruth Sastry Date: Wed, 5 Feb 2025 23:59:48 -0800 Subject: [PATCH 1/6] feat: support tsconfig references --- src/legacy/config/config-set.ts | 45 ++++++++++++++++++++++++++++++--- 1 file changed, 42 insertions(+), 3 deletions(-) diff --git a/src/legacy/config/config-set.ts b/src/legacy/config/config-set.ts index a35939c099..a030dfd3e5 100644 --- a/src/legacy/config/config-set.ts +++ b/src/legacy/config/config-set.ts @@ -554,9 +554,7 @@ export class ConfigSet { let basePath = normalizeSlashes(this.rootDir) const ts = this.compilerModule // Read project configuration when available. - const configFileName: string | undefined = resolvedConfigFile - ? normalizeSlashes(resolvedConfigFile) - : ts.findConfigFile(normalizeSlashes(this.rootDir), ts.sys.fileExists) + const configFileName: string | undefined = this._findTsconfigFile(resolvedConfigFile) if (configFileName) { this.logger.debug({ tsConfigFileName: configFileName }, 'readTsConfig(): reading', configFileName) @@ -576,6 +574,47 @@ export class ConfigSet { } // parse json, merge config extending others, ... + return this._parseTsconfig(config, basePath, configFileName) + } + + protected _findTsconfigFile(resolvedConfigFile?: string) { + const ts = this.compilerModule + + const configFileName: string | undefined = resolvedConfigFile + ? normalizeSlashes(resolvedConfigFile) + : ts.findConfigFile(normalizeSlashes(this.rootDir), ts.sys.fileExists) + + return this._findConfigFileInReferences(configFileName) + } + + protected _findConfigFileInReferences(configFileName?: string): string | undefined { + const ts = this.compilerModule + + if (!configFileName) return + + const parsedConfig = this._parseTsconfig(undefined, dirname(configFileName), configFileName) + if (this._includesTestFilesInConfig(parsedConfig)) return configFileName + + if (parsedConfig.projectReferences) { + for (const ref of parsedConfig.projectReferences) { + const filePath = ts.resolveProjectReferencePath(ref) + + if (ts.sys.fileExists(filePath)) { + return this._findConfigFileInReferences(ref.path) + } + } + } + + return + } + + protected _includesTestFilesInConfig(parsedConfig?: ts.ParsedCommandLine) { + return parsedConfig?.fileNames?.length ? parsedConfig.fileNames.some((path) => this.isTestFile(path)) : false + } + + protected _parseTsconfig(config: unknown, basePath: string, configFileName?: string) { + const ts = this.compilerModule + return ts.parseJsonConfigFileContent(config, ts.sys, basePath, undefined, configFileName) } From 066aea0a75e9360256927dd4af827b38a9c79488 Mon Sep 17 00:00:00 2001 From: Sushruth Sastry Date: Tue, 11 Feb 2025 03:00:02 -0800 Subject: [PATCH 2/6] fix: fixing early return issue + function rename --- src/legacy/config/config-set.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/legacy/config/config-set.ts b/src/legacy/config/config-set.ts index a030dfd3e5..2ec4e09ce3 100644 --- a/src/legacy/config/config-set.ts +++ b/src/legacy/config/config-set.ts @@ -584,10 +584,10 @@ export class ConfigSet { ? normalizeSlashes(resolvedConfigFile) : ts.findConfigFile(normalizeSlashes(this.rootDir), ts.sys.fileExists) - return this._findConfigFileInReferences(configFileName) + return this._findReferenceTsconfig(configFileName) } - protected _findConfigFileInReferences(configFileName?: string): string | undefined { + protected _findReferenceTsconfig(configFileName?: string): string | undefined { const ts = this.compilerModule if (!configFileName) return @@ -600,7 +600,8 @@ export class ConfigSet { const filePath = ts.resolveProjectReferencePath(ref) if (ts.sys.fileExists(filePath)) { - return this._findConfigFileInReferences(ref.path) + const newConfigFileName = this._findReferenceTsconfig(ref.path) + if (newConfigFileName) return newConfigFileName } } } From e26a7faedf6468592ffe3b7ba491aa6493b7ae62 Mon Sep 17 00:00:00 2001 From: Sushruth Sastry Date: Tue, 11 Feb 2025 03:01:28 -0800 Subject: [PATCH 3/6] fix: fixing tsconfig file read issue + variable renames --- src/legacy/config/config-set.ts | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/legacy/config/config-set.ts b/src/legacy/config/config-set.ts index 2ec4e09ce3..52735c670a 100644 --- a/src/legacy/config/config-set.ts +++ b/src/legacy/config/config-set.ts @@ -587,21 +587,23 @@ export class ConfigSet { return this._findReferenceTsconfig(configFileName) } - protected _findReferenceTsconfig(configFileName?: string): string | undefined { + protected _findReferenceTsconfig(tsconfigFileName?: string): string | undefined { const ts = this.compilerModule - if (!configFileName) return + if (!tsconfigFileName) return - const parsedConfig = this._parseTsconfig(undefined, dirname(configFileName), configFileName) - if (this._includesTestFilesInConfig(parsedConfig)) return configFileName + const rawTsconfig = ts.readConfigFile(tsconfigFileName, ts.sys.readFile).config + const parsedTsconfig = this._parseTsconfig(rawTsconfig, dirname(tsconfigFileName), tsconfigFileName) - if (parsedConfig.projectReferences) { - for (const ref of parsedConfig.projectReferences) { + if (this._includesTestFilesInConfig(parsedTsconfig)) return tsconfigFileName + + if (parsedTsconfig.projectReferences) { + for (const ref of parsedTsconfig.projectReferences) { const filePath = ts.resolveProjectReferencePath(ref) if (ts.sys.fileExists(filePath)) { - const newConfigFileName = this._findReferenceTsconfig(ref.path) - if (newConfigFileName) return newConfigFileName + const newTsconfigFileName = this._findReferenceTsconfig(ref.path) + if (newTsconfigFileName) return newTsconfigFileName } } } From 84df1d637b7e8e655266b2e96718f891e8c5041e Mon Sep 17 00:00:00 2001 From: Sushruth Sastry Date: Tue, 11 Feb 2025 03:03:13 -0800 Subject: [PATCH 4/6] fix: matchablePatterns need to be set before _setupConfigSet is called --- src/legacy/config/config-set.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/legacy/config/config-set.ts b/src/legacy/config/config-set.ts index 52735c670a..c17d97305b 100644 --- a/src/legacy/config/config-set.ts +++ b/src/legacy/config/config-set.ts @@ -202,8 +202,6 @@ export class ConfigSet { this.logger.debug({ compilerModule: this.compilerModule }, 'normalized compiler module config via ts-jest option') - this._setupConfigSet(options) - this._resolveTsCacheDir() this._matchablePatterns = [...this._jestCfg.testMatch, ...this._jestCfg.testRegex].filter( (pattern) => /** @@ -218,6 +216,9 @@ export class ConfigSet { this._matchTestFilePath = globsToMatcher( this._matchablePatterns.filter((pattern: string | RegExp) => typeof pattern === 'string') as string[], ) + + this._setupConfigSet(options) + this._resolveTsCacheDir() } /** From 28d916d6038377172da43a12215d7575701cb049 Mon Sep 17 00:00:00 2001 From: Sushruth Sastry Date: Tue, 11 Feb 2025 03:05:30 -0800 Subject: [PATCH 5/6] test: added an e2e test for the project reference case --- e2e/package-lock.json | 59 ++++++++++++++----- e2e/package.json | 1 + .../jest-compiler-cjs.config.ts | 8 +++ .../jest-compiler-esm.config.ts | 14 +++++ .../jest-transpiler-cjs.config.ts | 8 +++ .../jest-transpiler-esm.config.ts | 14 +++++ e2e/tsconfig-projects/package.json | 4 ++ e2e/tsconfig-projects/src/foo.spec.ts | 7 +++ e2e/tsconfig-projects/src/foo.ts | 3 + e2e/tsconfig-projects/tsconfig.json | 8 +++ e2e/tsconfig-projects/tsconfig.spec.json | 8 +++ e2e/tsconfig-projects/tsconfig.src.json | 8 +++ 12 files changed, 128 insertions(+), 14 deletions(-) create mode 100644 e2e/tsconfig-projects/jest-compiler-cjs.config.ts create mode 100644 e2e/tsconfig-projects/jest-compiler-esm.config.ts create mode 100644 e2e/tsconfig-projects/jest-transpiler-cjs.config.ts create mode 100644 e2e/tsconfig-projects/jest-transpiler-esm.config.ts create mode 100644 e2e/tsconfig-projects/package.json create mode 100644 e2e/tsconfig-projects/src/foo.spec.ts create mode 100644 e2e/tsconfig-projects/src/foo.ts create mode 100644 e2e/tsconfig-projects/tsconfig.json create mode 100644 e2e/tsconfig-projects/tsconfig.spec.json create mode 100644 e2e/tsconfig-projects/tsconfig.src.json diff --git a/e2e/package-lock.json b/e2e/package-lock.json index 524e8686c9..eea336dcb6 100644 --- a/e2e/package-lock.json +++ b/e2e/package-lock.json @@ -8,6 +8,7 @@ "devDependencies": { "@formatjs/ts-transformer": "^3.13.31", "@testing-library/react": "^14.3.1", + "@types/jest": "^29.5.14", "@types/react": "^18.3.3", "@types/react-dom": "^18.3.5", "esbuild": "~0.24.2", @@ -1401,7 +1402,6 @@ "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "jest-get-type": "^29.6.3" }, @@ -1834,6 +1834,48 @@ "@types/istanbul-lib-report": "*" } }, + "node_modules/@types/jest": { + "version": "29.5.14", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.14.tgz", + "integrity": "sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ==", + "dev": true, + "dependencies": { + "expect": "^29.0.0", + "pretty-format": "^29.0.0" + } + }, + "node_modules/@types/jest/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@types/jest/node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@types/jest/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true + }, "node_modules/@types/jsdom": { "version": "20.0.1", "resolved": "https://registry.npmjs.org/@types/jsdom/-/jsdom-20.0.1.tgz", @@ -2753,7 +2795,6 @@ "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } @@ -3050,7 +3091,6 @@ "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/expect-utils": "^29.7.0", "jest-get-type": "^29.6.3", @@ -4244,7 +4284,6 @@ "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "chalk": "^4.0.0", "diff-sequences": "^29.6.3", @@ -4261,7 +4300,6 @@ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=10" }, @@ -4275,7 +4313,6 @@ "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -4290,8 +4327,7 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/jest-docblock": { "version": "29.7.0", @@ -4416,7 +4452,6 @@ "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } @@ -4507,7 +4542,6 @@ "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "chalk": "^4.0.0", "jest-diff": "^29.7.0", @@ -4524,7 +4558,6 @@ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=10" }, @@ -4538,7 +4571,6 @@ "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -4553,8 +4585,7 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/jest-message-util": { "version": "29.7.0", diff --git a/e2e/package.json b/e2e/package.json index 46fd0e502e..0cd771e9a9 100644 --- a/e2e/package.json +++ b/e2e/package.json @@ -4,6 +4,7 @@ "devDependencies": { "@formatjs/ts-transformer": "^3.13.31", "@testing-library/react": "^14.3.1", + "@types/jest": "^29.5.14", "@types/react": "^18.3.3", "@types/react-dom": "^18.3.5", "esbuild": "~0.24.2", diff --git a/e2e/tsconfig-projects/jest-compiler-cjs.config.ts b/e2e/tsconfig-projects/jest-compiler-cjs.config.ts new file mode 100644 index 0000000000..55dc0216b0 --- /dev/null +++ b/e2e/tsconfig-projects/jest-compiler-cjs.config.ts @@ -0,0 +1,8 @@ +import { type JestConfigWithTsJest, TS_JS_TRANSFORM_PATTERN } from 'ts-jest' + +export default { + displayName: 'tsconfig-projects-compiler-cjs', + transform: { + [TS_JS_TRANSFORM_PATTERN]: 'ts-jest', + }, +} satisfies JestConfigWithTsJest diff --git a/e2e/tsconfig-projects/jest-compiler-esm.config.ts b/e2e/tsconfig-projects/jest-compiler-esm.config.ts new file mode 100644 index 0000000000..1e87d33263 --- /dev/null +++ b/e2e/tsconfig-projects/jest-compiler-esm.config.ts @@ -0,0 +1,14 @@ +import { type JestConfigWithTsJest, TS_JS_TRANSFORM_PATTERN } from 'ts-jest' + +export default { + displayName: 'tsconfig-projects-compiler-esm', + extensionsToTreatAsEsm: ['.ts'], + transform: { + [TS_JS_TRANSFORM_PATTERN]: [ + 'ts-jest', + { + useESM: true, + }, + ], + }, +} satisfies JestConfigWithTsJest diff --git a/e2e/tsconfig-projects/jest-transpiler-cjs.config.ts b/e2e/tsconfig-projects/jest-transpiler-cjs.config.ts new file mode 100644 index 0000000000..eda29af617 --- /dev/null +++ b/e2e/tsconfig-projects/jest-transpiler-cjs.config.ts @@ -0,0 +1,8 @@ +import { type JestConfigWithTsJest, TS_JS_TRANSFORM_PATTERN } from 'ts-jest' + +export default { + displayName: 'tsconfig-projects-transpiler-cjs', + transform: { + [TS_JS_TRANSFORM_PATTERN]: 'ts-jest', + }, +} satisfies JestConfigWithTsJest diff --git a/e2e/tsconfig-projects/jest-transpiler-esm.config.ts b/e2e/tsconfig-projects/jest-transpiler-esm.config.ts new file mode 100644 index 0000000000..cf72978cdd --- /dev/null +++ b/e2e/tsconfig-projects/jest-transpiler-esm.config.ts @@ -0,0 +1,14 @@ +import { type JestConfigWithTsJest, TS_JS_TRANSFORM_PATTERN } from 'ts-jest' + +export default { + displayName: 'tsconfig-projects-transpiler-esm', + extensionsToTreatAsEsm: ['.ts'], + transform: { + [TS_JS_TRANSFORM_PATTERN]: [ + 'ts-jest', + { + useESM: true, + }, + ], + }, +} satisfies JestConfigWithTsJest diff --git a/e2e/tsconfig-projects/package.json b/e2e/tsconfig-projects/package.json new file mode 100644 index 0000000000..1a7271cc79 --- /dev/null +++ b/e2e/tsconfig-projects/package.json @@ -0,0 +1,4 @@ +{ + "name": "tsconfig-projects", + "private": true +} diff --git a/e2e/tsconfig-projects/src/foo.spec.ts b/e2e/tsconfig-projects/src/foo.spec.ts new file mode 100644 index 0000000000..8673761b75 --- /dev/null +++ b/e2e/tsconfig-projects/src/foo.spec.ts @@ -0,0 +1,7 @@ +import { foo } from './foo' + +describe('foo', () => { + it('should return "foo"', () => { + expect(foo()).toEqual('foo') + }) +}) diff --git a/e2e/tsconfig-projects/src/foo.ts b/e2e/tsconfig-projects/src/foo.ts new file mode 100644 index 0000000000..6de1f5a8d6 --- /dev/null +++ b/e2e/tsconfig-projects/src/foo.ts @@ -0,0 +1,3 @@ +export function foo() { + return 'foo' +} diff --git a/e2e/tsconfig-projects/tsconfig.json b/e2e/tsconfig-projects/tsconfig.json new file mode 100644 index 0000000000..754af78189 --- /dev/null +++ b/e2e/tsconfig-projects/tsconfig.json @@ -0,0 +1,8 @@ +{ + "extends": "../../tsconfig.json", + "include": [], + "references": [ + { "path": "./tsconfig.src.json" }, + { "path": "./tsconfig.spec.json" } + ] +} diff --git a/e2e/tsconfig-projects/tsconfig.spec.json b/e2e/tsconfig-projects/tsconfig.spec.json new file mode 100644 index 0000000000..578f384ecf --- /dev/null +++ b/e2e/tsconfig-projects/tsconfig.spec.json @@ -0,0 +1,8 @@ +{ + "compilerOptions": { + "module": "Node16", + "typeRoots": ["../node_modules"], + "types": ["@types/jest", "@types/node"], + }, + "include": ["src/**/*.spec.ts"] +} diff --git a/e2e/tsconfig-projects/tsconfig.src.json b/e2e/tsconfig-projects/tsconfig.src.json new file mode 100644 index 0000000000..cfa57a5d0e --- /dev/null +++ b/e2e/tsconfig-projects/tsconfig.src.json @@ -0,0 +1,8 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "module": "Node16" + }, + "include": ["src"], + "exclude": ["src/**/*.spec.ts"] +} From bafe9d92ac9360b336ea8bd5c5c053fb1d297f30 Mon Sep 17 00:00:00 2001 From: Sushruth Sastry Date: Tue, 11 Feb 2025 09:34:08 -0800 Subject: [PATCH 6/6] fix: fixing to pass existing test cases + fixing some tests --- src/legacy/config/config-set.spec.ts | 2 -- src/legacy/config/config-set.ts | 11 ++++++++--- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/legacy/config/config-set.spec.ts b/src/legacy/config/config-set.spec.ts index e7fecf90ec..48f6dbfc0a 100644 --- a/src/legacy/config/config-set.spec.ts +++ b/src/legacy/config/config-set.spec.ts @@ -790,7 +790,6 @@ describe('_resolveTsConfig', () => { expect(conf.options.configFilePath).toBeUndefined() expect(findConfig).not.toHaveBeenCalled() expect(readConfig.mock.calls[0][0]).toBe('/foo/tsconfig.bar.json') - expect(parseConfig).not.toHaveBeenCalled() }) }) @@ -918,7 +917,6 @@ describe('_resolveTsConfig', () => { const conf = cs.parsedTsConfig expect(conf.options.path).toBe(tscfgPathStub) - expect(findConfig).not.toHaveBeenCalled() expect(readConfig.mock.calls[0][0]).toBe(tscfgPathStub) expect(parseConfig.mock.calls[0][2]).toBe('/foo') expect(parseConfig.mock.calls[0][4]).toBe(tscfgPathStub) diff --git a/src/legacy/config/config-set.ts b/src/legacy/config/config-set.ts index c17d97305b..d34a882523 100644 --- a/src/legacy/config/config-set.ts +++ b/src/legacy/config/config-set.ts @@ -585,7 +585,9 @@ export class ConfigSet { ? normalizeSlashes(resolvedConfigFile) : ts.findConfigFile(normalizeSlashes(this.rootDir), ts.sys.fileExists) - return this._findReferenceTsconfig(configFileName) + const newTsconfigFile = this._findReferenceTsconfig(configFileName) + + return newTsconfigFile ?? configFileName } protected _findReferenceTsconfig(tsconfigFileName?: string): string | undefined { @@ -593,8 +595,11 @@ export class ConfigSet { if (!tsconfigFileName) return - const rawTsconfig = ts.readConfigFile(tsconfigFileName, ts.sys.readFile).config - const parsedTsconfig = this._parseTsconfig(rawTsconfig, dirname(tsconfigFileName), tsconfigFileName) + const parsedTsconfig = this._parseTsconfig( + ts.readConfigFile(tsconfigFileName, ts.sys.readFile).config || {}, + dirname(tsconfigFileName), + tsconfigFileName, + ) if (this._includesTestFilesInConfig(parsedTsconfig)) return tsconfigFileName