From a9b1905f8ba9e91c2c2e38dbf342b90b9dbc442a Mon Sep 17 00:00:00 2001 From: Ashif4354 Date: Wed, 4 Mar 2026 11:39:23 +0530 Subject: [PATCH] support aliased FastAPI/APIRouter imports --- src/core/analyzer.ts | 7 ++++++- src/core/extractors.ts | 40 +++++++++++++++++++++++++++++++++++++++- 2 files changed, 45 insertions(+), 2 deletions(-) diff --git a/src/core/analyzer.ts b/src/core/analyzer.ts index 3390b15..27d33e5 100644 --- a/src/core/analyzer.ts +++ b/src/core/analyzer.ts @@ -5,6 +5,7 @@ import type { Tree } from "web-tree-sitter" import { logError } from "../utils/logger" import { + aliasExtractor, collectStringVariables, decoratorExtractor, findNodesByType, @@ -42,9 +43,13 @@ export function analyzeTree(tree: Tree, filePath: string): FileAnalysis { const decoratedDefs = findNodesByType(rootNode, "decorated_definition") const routes = decoratedDefs.map(decoratorExtractor).filter(notNull) + const aliases = aliasExtractor(rootNode) + // Get all router assignments const assignments = findNodesByType(rootNode, "assignment") - const routers = assignments.map(routerExtractor).filter(notNull) + const routers = assignments + .map((node) => routerExtractor(node, aliases)) + .filter(notNull) // Get all include_router and mount calls const callNodes = findNodesByType(rootNode, "call") diff --git a/src/core/extractors.ts b/src/core/extractors.ts index ccd127b..ef0c2ed 100644 --- a/src/core/extractors.ts +++ b/src/core/extractors.ts @@ -237,7 +237,10 @@ function extractTags(listNode: Node): string[] { .filter((v): v is string => v !== null) } -export function routerExtractor(node: Node): RouterInfo | null { +export function routerExtractor( + node: Node, + aliasMap?: Map, +): RouterInfo | null { if (node.type !== "assignment") { return null } @@ -254,6 +257,8 @@ export function routerExtractor(node: Node): RouterInfo | null { type = "APIRouter" } else if (funcName === "FastAPI" || funcName === "fastapi.FastAPI") { type = "FastAPI" + } else if (funcName && aliasMap?.has(funcName)) { + type = aliasMap.get(funcName)! } else { return null } @@ -476,3 +481,36 @@ export function mountExtractor(node: Node): MountInfo | null { app: appNode?.text ?? "", } } + +export function aliasExtractor( + node: Node, +): Map { + const importAliases = findNodesByType(node, "aliased_import") + + const aliasMap = new Map() + + for (const node of importAliases) { + const originalNode = node.childForFieldName("name") + const aliasNode = node.childForFieldName("alias") + + if ( + originalNode?.text === "FastAPI" || + originalNode?.text === "fastapi.FastAPI" + ) { + const alias = aliasNode?.text + if (alias) { + aliasMap.set(alias, "FastAPI") + } + } else if ( + originalNode?.text === "APIRouter" || + originalNode?.text === "fastapi.APIRouter" + ) { + const alias = aliasNode?.text + if (alias) { + aliasMap.set(alias, "APIRouter") + } + } + } + + return aliasMap +}