주요 내용으로 이동하기

타입스크립트가 tsconfig 읽고 컴파일하는 대상 파일 알아내기

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같은 라이브러리도 유용해 보입니다.