Node.js 환경을 가정한 코드입니다. Deno나 Bun에서도 비슷하게 작동하겠지요 (안 해봄)
import ts from "typescript";
import path from "node:path";
export function getAllTypeScriptCompiledFilePaths({
dirToFindTsconfig,
excludeDTs,
}: {
dirToFindTsconfig: string;
excludeDTs?: boolean;
}) {
const tsconfigPath = ts.findConfigFile(dirToFindTsconfig, ts.sys.fileExists);
if (!tsconfigPath) throw new Error(`tsconfig not found`);
const tsconfigFile = ts.readConfigFile(tsconfigPath, ts.sys.readFile);
// TypeScript가 tsconfig의 include, files, exclude 등의 옵션을 바탕으로 계산한
// 컴파일 대상 파일의 목록을 가져옵니다
// extend로 다른 tsconfig를 참조하는 경우 해당 tsconfig의 옵 션까지 반영합니다
const { fileNames } = ts.parseJsonConfigFileContent(
tsconfigFile.config,
ts.sys,
path.dirname(tsconfigPath)
);
return fileNames.filter((fileName) => !excludeDTs || !fileName.endsWith(".d.ts"));
}
try {
const fileNames = getAllTypeScriptCompiledFilePaths({
dirToFindTsconfig: process.cwd(),
excludeDTs: true,
});
console.log(fileNames); // [ '/Users/te6/Projects/test/src/index.ts' ]
} catch (error) {
console.error(error);
}
typescript 의존성을 피하려고 한다면 get-tsconfig같은 라이브러리도 유용 해 보입니다.