diff --git a/packages/typescript-estree/src/parseSettings/getProjectConfigFiles.ts b/packages/typescript-estree/src/parseSettings/getProjectConfigFiles.ts index f7f3dc8851b8..dff7be7412ec 100644 --- a/packages/typescript-estree/src/parseSettings/getProjectConfigFiles.ts +++ b/packages/typescript-estree/src/parseSettings/getProjectConfigFiles.ts @@ -39,6 +39,12 @@ export function getProjectConfigFiles( let directory = path.dirname(parseSettings.filePath); const checkedDirectories = [directory]; + // Normalize tsconfigRootDir once to avoid repeated regex operations in the loop + const normalizedTsconfigRootDirLength = Math.max( + 1, + parseSettings.tsconfigRootDir.replace(/[/\\]+$/, '').length, + ); + do { log('Checking tsconfig.json path: %s', directory); const tsconfigPath = path.join(directory, 'tsconfig.json'); @@ -57,7 +63,7 @@ export function getProjectConfigFiles( checkedDirectories.push(directory); } while ( directory.length > 1 && - directory.length >= parseSettings.tsconfigRootDir.length + directory.length >= normalizedTsconfigRootDirLength ); throw new Error( diff --git a/packages/typescript-estree/tests/lib/getProjectConfigFiles.test.ts b/packages/typescript-estree/tests/lib/getProjectConfigFiles.test.ts index 8e464eb746fc..6762dce3e67c 100644 --- a/packages/typescript-estree/tests/lib/getProjectConfigFiles.test.ts +++ b/packages/typescript-estree/tests/lib/getProjectConfigFiles.test.ts @@ -178,5 +178,20 @@ describe(getProjectConfigFiles, () => { `[Error: project was set to \`true\` but couldn't find any tsconfig.json relative to './repos/repo/packages/package/file.ts' within '/'.]`, ); }); + + it('works correctly with trailing path separator in tsconfigRootDir', () => { + mockExistsSync.mockImplementation( + filePath => filePath === path.normalize('repos/repo/tsconfig.json'), + ); + + const actual = getProjectConfigFiles( + { ...parseSettings, tsconfigRootDir: './repos/repo/' }, + true, + ); + + expect(actual).toStrictEqual([ + path.normalize('repos/repo/tsconfig.json'), + ]); + }); }); });