From 50c79f7098a60ee796f4b4f7657d30087e0af16b 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 | 50 +++++++++++++++------------ src/tsconfig-loader.ts | 22 ++++++------ 2 files changed, 37 insertions(+), 35 deletions(-) diff --git a/src/__tests__/tsconfig-loader.test.ts b/src/__tests__/tsconfig-loader.test.ts index b69a07d..676939b 100644 --- a/src/__tests__/tsconfig-loader.test.ts +++ b/src/__tests__/tsconfig-loader.test.ts @@ -107,47 +107,51 @@ 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("should find tsconfig in parent directory", () => { + 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.only("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 639d6ba..b1baeac 100644 --- a/src/tsconfig-loader.ts +++ b/src/tsconfig-loader.ts @@ -90,29 +90,27 @@ function resolveConfigPath(cwd: string, filename?: string): string | undefined { const configAbsolutePath = walkForTsConfig(cwd); return configAbsolutePath ? path.resolve(configAbsolutePath) : undefined; } - export function walkForTsConfig( directory: string, - 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; + console.log("directory", directory); + 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(