UNPKG

tsro

Version:

TypeScript Remove Orphaned (tsro) is a CLI utility and library for TypeScript projects that detects and removes files containing invalid imports — imports that refer to nonexistent entities or nonexistent modules.

38 lines (37 loc) 1.66 kB
import pc from "picocolors"; import ts from "typescript"; import { cwd } from "node:process"; import { relative } from "node:path"; import { CliOutput } from "./utils/cliOutput.js"; import { formatCount } from "./utils/formatCount.js"; import { loadTSConfig } from "./utils/loadTsConfig.js"; import { createNodeJsLogger } from "./utils/logger.js"; import { CliError, CliResultError } from "./utils/error.js"; import { collectDiagnostics } from "./modules/diagnostics.js"; const relativeToCwd = (fileName) => relative(cwd(), fileName).replaceAll("\\", "/"); export const tsro = async (config) => { const { mode, configFile = "tsconfig.json", projectRoot = cwd(), system = ts.sys, logger = createNodeJsLogger(), ignoreLibImports = true, } = config; const { options, fileNames, configPath, error } = await loadTSConfig(projectRoot, configFile, system); if (fileNames.length === 0) { logger.write(pc.red(pc.bold("There are no files in the project\n"))); throw new CliError(); } logger.write(`${pc.blue("tsconfig")} ${error ? "using default options" : relativeToCwd(configPath)}\n`); logger.write(pc.gray(`Project has ${formatCount(fileNames.length, "file")}\n`)); const output = new CliOutput({ logger, mode, projectRoot }); const diagnostics = collectDiagnostics({ fileNames, options, ignoreLibImports, }); for (const diagnostic of diagnostics) { if (mode == "write") { system.deleteFile?.(diagnostic.file); } output.deleteFile(diagnostic); } const { code } = output.done(); if (code !== 0) { throw new CliResultError(); } };