diff --git a/scripts/check-no-register-http-handler.mjs b/scripts/check-no-register-http-handler.mjs new file mode 100644 index 00000000000..0884295be2d --- /dev/null +++ b/scripts/check-no-register-http-handler.mjs @@ -0,0 +1,38 @@ +#!/usr/bin/env node + +import ts from "typescript"; +import { runCallsiteGuard } from "./lib/callsite-guard.mjs"; +import { runAsScript, toLine, unwrapExpression } from "./lib/ts-guard-utils.mjs"; + +const sourceRoots = ["src", "extensions"]; + +function isDeprecatedRegisterHttpHandlerCall(expression) { + const callee = unwrapExpression(expression); + return ts.isPropertyAccessExpression(callee) && callee.name.text === "registerHttpHandler"; +} + +export function findDeprecatedRegisterHttpHandlerLines(content, fileName = "source.ts") { + const sourceFile = ts.createSourceFile(fileName, content, ts.ScriptTarget.Latest, true); + const lines = []; + const visit = (node) => { + if (ts.isCallExpression(node) && isDeprecatedRegisterHttpHandlerCall(node.expression)) { + lines.push(toLine(sourceFile, node.expression)); + } + ts.forEachChild(node, visit); + }; + visit(sourceFile); + return lines; +} + +export async function main() { + await runCallsiteGuard({ + importMetaUrl: import.meta.url, + sourceRoots, + findCallLines: findDeprecatedRegisterHttpHandlerLines, + header: "Found deprecated plugin API call registerHttpHandler(...):", + footer: + "Use registerHttpRoute({ path, auth, match, handler }) and registerPluginHttpRoute for dynamic webhook paths.", + }); +} + +runAsScript(import.meta.url, main);