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
JavaScript
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();
}
};