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.
39 lines (38 loc) • 1.75 kB
JavaScript
import ts from "typescript";
import { checkLib } from "../utils/checkLib.js";
import { getTsAliases } from "../utils/getTsAliases.js";
import { validateDefaultImport, validateNamedImports, validateNamespaceImport, } from "../utils/validators.js";
export const validateImportsInFile = (sourceFile, program, ignoreLibImports) => {
const checker = program.getTypeChecker();
const aliases = getTsAliases(program);
const diagnostics = [];
ts.forEachChild(sourceFile, (node) => {
if (!ts.isImportDeclaration(node) || !ts.isStringLiteral(node.moduleSpecifier))
return;
const moduleSymbol = checker.getSymbolAtLocation(node.moduleSpecifier);
const importPath = node.moduleSpecifier.text;
const start = node.moduleSpecifier.getStart();
const { line, character } = sourceFile.getLineAndCharacterOfPosition(start);
if (!moduleSymbol) {
diagnostics.push({
file: sourceFile.fileName,
code: `"${importPath}" not resolved`,
line: line + 1,
char: character + 1,
});
return;
}
const isLib = checkLib(importPath, aliases);
if (isLib && ignoreLibImports) {
return;
}
const exports = checker.getExportsOfModule(moduleSymbol);
// Named imports
diagnostics.push(...validateNamedImports(node, sourceFile, importPath, exports));
// Default import
diagnostics.push(...validateDefaultImport(node, sourceFile, importPath, exports));
// Namespace import (import * as X from ...)
diagnostics.push(...validateNamespaceImport(node, sourceFile, importPath, moduleSymbol));
});
return diagnostics;
};