diff --git a/src/adapters/fileSystem.stub.ts b/src/adapters/fileSystem.stub.ts index 678432b34..e10337f93 100644 --- a/src/adapters/fileSystem.stub.ts +++ b/src/adapters/fileSystem.stub.ts @@ -1,8 +1,9 @@ import { FileSystem } from "../adapters/fileSystem"; import { fn } from "../fn"; -export const createStubFileSystem = ({ data = {}, exists = true } = {}) => ({ +export const createStubFileSystem = ({ data = {}, exists = true, isDir = false } = {}) => ({ fileExists: async () => exists, + directoryExists: async () => exists && isDir, readFile: async () => data, writeFile: fn(), }); diff --git a/src/adapters/fileSystem.ts b/src/adapters/fileSystem.ts index 2b5f825da..08a9434b6 100644 --- a/src/adapters/fileSystem.ts +++ b/src/adapters/fileSystem.ts @@ -1,5 +1,6 @@ export type FileSystem = { fileExists: (filePath: string) => Promise; - readFile: (filePath: string) => Promise; - writeFile: (filePath: string, contents: string) => Promise; + directoryExists: (filePath: string) => Promise; + readFile: (filePath: string) => Promise; + writeFile: (filePath: string, contents: string) => Promise; }; diff --git a/src/adapters/fsFileSystem.ts b/src/adapters/fsFileSystem.ts index 7e29dfde0..774f2c201 100644 --- a/src/adapters/fsFileSystem.ts +++ b/src/adapters/fsFileSystem.ts @@ -11,6 +11,14 @@ export const fsFileSystem: FileSystem = { return false; } }, + directoryExists: async (filePath: string) => { + try { + const stat = await fs.promises.stat(filePath); + return stat.isDirectory(); + } catch (error) { + return false; + } + }, readFile: async (filePath: string) => { try { return (await fs.promises.readFile(filePath)).toString(); diff --git a/src/api/dependencies.ts b/src/api/dependencies.ts index 37269d04f..a9fd55454 100644 --- a/src/api/dependencies.ts +++ b/src/api/dependencies.ts @@ -121,6 +121,7 @@ export const findOriginalConfigurationsDependencies: FindOriginalConfigurationsD export const collectCommentFileNamesDependencies: CollectCommentFileNamesDependencies = { findTypeScriptConfiguration: bind(findTypeScriptConfiguration, findConfigurationDependencies), + fileSystem: fsFileSystem, }; export const extractGlobPathsDependencies: ExtractGlobPathsDependencies = { diff --git a/src/comments/collectCommentFileNames.test.ts b/src/comments/collectCommentFileNames.test.ts index 137b0b233..010837c72 100644 --- a/src/comments/collectCommentFileNames.test.ts +++ b/src/comments/collectCommentFileNames.test.ts @@ -1,5 +1,7 @@ import { describe, expect, it } from "@jest/globals"; +import { createStubFileSystem } from "../adapters/fileSystem.stub"; +import { fsFileSystem as fileSystem } from "../adapters/fsFileSystem"; import { collectCommentFileNames } from "./collectCommentFileNames"; const stubFoundConfiguration = { @@ -10,7 +12,10 @@ describe("collectCommentFileNames", () => { it("returns an error result when filePathGlobs is true and typescriptConfiguration is undefined", async () => { const findTypeScriptConfiguration = async () => stubFoundConfiguration; - const result = await collectCommentFileNames({ findTypeScriptConfiguration }, true); + const result = await collectCommentFileNames( + { findTypeScriptConfiguration, fileSystem }, + true, + ); expect(result).toEqual(expect.any(Error)); }); @@ -22,7 +27,7 @@ describe("collectCommentFileNames", () => { }; const result = await collectCommentFileNames( - { findTypeScriptConfiguration }, + { findTypeScriptConfiguration, fileSystem }, true, typescriptConfiguration, ); @@ -35,7 +40,7 @@ describe("collectCommentFileNames", () => { const filePathGlobs = ["a.ts"]; const result = await collectCommentFileNames( - { findTypeScriptConfiguration }, + { findTypeScriptConfiguration, fileSystem }, filePathGlobs, ); @@ -51,7 +56,7 @@ describe("collectCommentFileNames", () => { const filePathGlobs = "a.ts"; const result = await collectCommentFileNames( - { findTypeScriptConfiguration }, + { findTypeScriptConfiguration, fileSystem }, filePathGlobs, ); @@ -65,7 +70,7 @@ describe("collectCommentFileNames", () => { const findTypeScriptConfiguration = async () => error; const result = await collectCommentFileNames( - { findTypeScriptConfiguration }, + { findTypeScriptConfiguration, fileSystem }, "tsconfig.json", ); @@ -76,7 +81,7 @@ describe("collectCommentFileNames", () => { const findTypeScriptConfiguration = async () => stubFoundConfiguration; const result = await collectCommentFileNames( - { findTypeScriptConfiguration }, + { findTypeScriptConfiguration, fileSystem }, "tsconfig.json", ); @@ -84,4 +89,22 @@ describe("collectCommentFileNames", () => { include: ["a.ts"], }); }); + + it("returns only files when filePathGlobs includes directories", async () => { + const findTypeScriptConfiguration = async () => ({ + include: ["directory"], + }); + + const result = await collectCommentFileNames( + { + findTypeScriptConfiguration, + fileSystem: createStubFileSystem({ isDir: true }), + }, + "tsconfig.json", + ); + + expect(result).toEqual({ + include: [], + }); + }); }); diff --git a/src/comments/collectCommentFileNames.ts b/src/comments/collectCommentFileNames.ts index eef3e5860..570dcd5e2 100644 --- a/src/comments/collectCommentFileNames.ts +++ b/src/comments/collectCommentFileNames.ts @@ -1,3 +1,4 @@ +import { FileSystem } from "../adapters/fileSystem"; import { SansDependencies } from "../binding"; import { findTypeScriptConfiguration, @@ -7,6 +8,7 @@ import { uniqueFromSources } from "../utils"; export type CollectCommentFileNamesDependencies = { findTypeScriptConfiguration: SansDependencies; + fileSystem: Pick; }; export type CommentFileNames = { @@ -26,12 +28,27 @@ export const collectCommentFileNames = async ( ); } + const includeList = uniqueFromSources( + typescriptConfiguration.files, + typescriptConfiguration.include, + ); + + // Remove directories specified in the include list. Ignore + // Errors as they'll be handled when reading the file. + const includeListFiles = ( + await Promise.all(includeList.map(dependencies.fileSystem.directoryExists)) + ) + .map((isDirectory, i) => { + if (isDirectory) { + return null; + } + return includeList[i]; + }) + .filter((item): item is string => typeof item === "string"); + return { exclude: typescriptConfiguration.exclude, - include: uniqueFromSources( - typescriptConfiguration.files, - typescriptConfiguration.include, - ), + include: includeListFiles, }; } diff --git a/src/converters/comments/convertFileComments.test.ts b/src/converters/comments/convertFileComments.test.ts index 0e94c709d..24fa14a19 100644 --- a/src/converters/comments/convertFileComments.test.ts +++ b/src/converters/comments/convertFileComments.test.ts @@ -6,7 +6,7 @@ import { createStubConverter } from "../lintConfigs/rules/ruleConverter.stubs"; import { convertFileComments, ConvertFileCommentsDependencies } from "./convertFileComments"; const createStubDependencies = ( - readFileResult: Error | string, + readFileResult: NodeJS.ErrnoException | string, ): ConvertFileCommentsDependencies => ({ converters: new Map([ ["ts-a", createStubConverter(["es-a"])],