Skip to content

Instantly share code, notes, and snippets.

@rzane
Created May 16, 2025 22:04
Show Gist options
  • Save rzane/372e02745cc337c93dbd3e8cbab264c9 to your computer and use it in GitHub Desktop.
Save rzane/372e02745cc337c93dbd3e8cbab264c9 to your computer and use it in GitHub Desktop.
List typescript deprecations

List deprecations

This script will extract deprecations using the TypeScript API.

It's not 100% reliable, but it's pretty good. There seems to be an issue where overloaded functions that have a single deprecated clause will aways report.

#!/usr/bin/env node
import { createRequire } from "module";
import path from "path";
const require = createRequire(path.join(process.cwd(), "package.json"));
const ts = require("typescript");
const configPath = ts.findConfigFile("./", ts.sys.fileExists, "tsconfig.json");
if (!configPath) throw new Error("Could not find a valid 'tsconfig.json'.");
const configFile = ts.readConfigFile(configPath, ts.sys.readFile);
const parsedCommandLine = ts.parseJsonConfigFileContent(
configFile.config,
ts.sys,
path.dirname(configPath),
);
const program = ts.createProgram({
rootNames: parsedCommandLine.fileNames,
options: parsedCommandLine.options,
});
const checker = program.getTypeChecker();
for (const sourceFile of program.getSourceFiles()) {
if (sourceFile.isDeclarationFile) continue;
ts.forEachChild(sourceFile, function visit(node) {
const symbol = node.name && checker.getSymbolAtLocation(node.name);
if (symbol) {
const docs = symbol.getJsDocTags();
const deprecated = docs.find((tag) => tag.name === "deprecated");
if (deprecated) {
const name = symbol.getName();
const { line, character } = sourceFile.getLineAndCharacterOfPosition(
node.getStart(),
);
const filename = path.relative(process.cwd(), sourceFile.fileName);
console.log(`${name} at ${filename}:${line + 1}:${character + 1}`);
}
}
ts.forEachChild(node, visit);
});
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment