From 4a5c0c0a788594a53094e5089d3a1a44f29bf589 Mon Sep 17 00:00:00 2001 From: Feng Yu Date: Wed, 30 Mar 2022 10:21:56 +0800 Subject: [PATCH] Update src/tsconfig-loader.ts MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Michaƫl De Boey --- src/__tests__/tsconfig-loader.test.ts | 63 +++++++++++++++++---------- src/tsconfig-loader.ts | 22 ++++------ 2 files changed, 50 insertions(+), 35 deletions(-) diff --git a/src/__tests__/tsconfig-loader.test.ts b/src/__tests__/tsconfig-loader.test.ts index b69a07d..4836898 100644 --- a/src/__tests__/tsconfig-loader.test.ts +++ b/src/__tests__/tsconfig-loader.test.ts @@ -107,47 +107,66 @@ describe("tsconfig-loader", () => { describe("walkForTsConfig", () => { it("should find tsconfig in starting directory", () => { const pathToTsconfig = join("/root", "dir1", "tsconfig.json"); - const res = walkForTsConfig( - join("/root", "dir1"), - (path) => path === pathToTsconfig - ); - // assert.equal(res, pathToTsconfig); + const res = walkForTsConfig(join("/root", "dir1"), (path) => { + if (path === "/root/dir1") { + return ["tsconfig.json"]; + } else { + return []; + } + }); expect(res).toBe(pathToTsconfig); }); it("should find jsconfig in starting directory", () => { const pathToJsconfig = join("/root", "dir1", "jsconfig.json"); - const res = walkForTsConfig( - join("/root", "dir1"), - (path) => path === pathToJsconfig - ); - // assert.equal(res, pathToTsconfig); + const res = walkForTsConfig(join("/root", "dir1"), (path) => { + if (path === "/root/dir1") { + return ["jsconfig.json"]; + } else { + return []; + } + }); expect(res).toBe(pathToJsconfig); }); + it("tsconfig.json take precedence over jsconfig.json when both exist", () => { + const pathToTsconfig = join("/root/dir1", "tsconfig.json"); + const res = walkForTsConfig(join("/root", "dir1"), (path) => { + if (path === "/root/dir1") { + return ["jsconfig.json", "tsconfig.json"]; + } else { + return []; + } + }); + expect(res).toBe(pathToTsconfig); + }); + it("should find tsconfig in parent directory", () => { const pathToTsconfig = join("/root", "tsconfig.json"); - const res = walkForTsConfig( - join("/root", "dir1"), - (path) => path === pathToTsconfig - ); - // assert.equal(res, pathToTsconfig); + const res = walkForTsConfig(join("/root", "dir1"), (path) => { + if (path === "/root") { + return ["tsconfig.json"]; + } else { + return []; + } + }); expect(res).toBe(pathToTsconfig); }); it("should find jsconfig in parent directory", () => { const pathToTsconfig = join("/root", "jsconfig.json"); - const res = walkForTsConfig( - join("/root", "dir1"), - (path) => path === pathToTsconfig - ); - // assert.equal(res, pathToTsconfig); + const res = walkForTsConfig(join("/root", "dir1"), (path) => { + if (path === "/root") { + return ["jsconfig.json"]; + } else { + return []; + } + }); expect(res).toBe(pathToTsconfig); }); it("should return undefined when reaching the top", () => { - const res = walkForTsConfig(join("/root", "dir1", "kalle"), () => false); - // assert.equal(res, undefined); + const res = walkForTsConfig(join("/root", "dir1", "kalle"), () => []); expect(res).toBeUndefined(); }); }); diff --git a/src/tsconfig-loader.ts b/src/tsconfig-loader.ts index 9854f34..93b6326 100644 --- a/src/tsconfig-loader.ts +++ b/src/tsconfig-loader.ts @@ -90,30 +90,26 @@ function resolveConfigPath(cwd: string, filename?: string): string | undefined { const configAbsolutePath = walkForTsConfig(cwd); return configAbsolutePath ? path.resolve(configAbsolutePath) : undefined; } - export function walkForTsConfig( directory: string, - // eslint-disable-next-line no-shadow - existsSync: (path: string) => boolean = fs.existsSync + readdirSync: (path: string) => string[] = fs.readdirSync ): string | undefined { - let configPath = path.join(directory, "./tsconfig.json"); - if (existsSync(configPath)) { - return configPath; - } - - configPath = path.join(directory, "./jsconfig.json"); - if (existsSync(configPath)) { - return configPath; + const files = readdirSync(directory); + const filesToCheck = ["tsconfig.json", "jsconfig.json"]; + for (const fileToCheck of filesToCheck) { + if (files.indexOf(fileToCheck) !== -1) { + return path.join(directory, fileToCheck); + } } - const parentDirectory = path.join(directory, "../"); + const parentDirectory = path.dirname(directory); // If we reached the top if (directory === parentDirectory) { return undefined; } - return walkForTsConfig(parentDirectory, existsSync); + return walkForTsConfig(parentDirectory, readdirSync); } export function loadTsconfig(