From d88f7ad53934f37b843e63d73a17eae7425f1e91 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Fri, 20 Mar 2026 19:51:27 -0500 Subject: [PATCH] fix: arrays --- .../src/components/ApiMacroType.astro | 64 +++++++++---------- 1 file changed, 31 insertions(+), 33 deletions(-) diff --git a/packages/website-ue/src/components/ApiMacroType.astro b/packages/website-ue/src/components/ApiMacroType.astro index 68b083e8f..bbc91fd71 100644 --- a/packages/website-ue/src/components/ApiMacroType.astro +++ b/packages/website-ue/src/components/ApiMacroType.astro @@ -10,14 +10,18 @@ import { Code } from "./Code"; import { createProgram, forEachChild, + isArrayTypeNode, isEnumDeclaration, + isExpressionWithTypeArguments, isInterfaceDeclaration, isMethodSignature, isPropertySignature, isTypeAliasDeclaration, + isTypeNode, isTypeReferenceNode, type InterfaceDeclaration, type Node, + type Symbol, type TypeNode, } from "typescript"; @@ -44,6 +48,7 @@ if (source === undefined) { const checker = program.getTypeChecker(); const collected = new Map(); +const visited = new Set(); let declaration: InterfaceDeclaration | undefined; forEachChild(source, (node) => { @@ -77,50 +82,43 @@ function collectNodes(node: Node) { } function collectTypes(node: TypeNode) { + if (isArrayTypeNode(node)) { + collectTypes(node.elementType); + return; + } + + if (isTypeReferenceNode(node)) { + node.typeArguments?.forEach(collectTypes); + } + const type = checker.getTypeAtLocation(node); const symbol = type.getSymbol(); - if (!symbol) return; + if (!symbol || visited.has(symbol)) return; - const name = symbol.getName(); + visited.add(symbol); - if (!collected.has(name)) { - const declarations = symbol.getDeclarations(); + const declarations = symbol.getDeclarations(); - if (!declarations) return; + if (!declarations) return; - declarations.forEach((declaration) => { - const source = declaration.getSourceFile(); - const isInSource = roots.some((root) => source.fileName.startsWith(root)); + for (const declaration of declarations) { + if (isInterfaceDeclaration(declaration)) { + collected.set(declaration.name.text, declaration.getText()); - if (!isInSource) return; - - if ( - !isInterfaceDeclaration(declaration) && - !isTypeAliasDeclaration(declaration) && - !isEnumDeclaration(declaration) - ) { - return; - } - - const name = declaration.name.text; - - if (collected.has(name)) return; - - collected.set(name, declaration.getText()); - forEachChild(declaration, collectTypesFromNode); - }); + declaration.members.forEach((member) => { + if (isPropertySignature(member) && member.type) { + collectTypes(member.type); + } + }); + } else { + forEachChild(declaration, (child) => { + if (isTypeNode(child)) collectTypes(child); + }); + } } } -function collectTypesFromNode(node: Node) { - if (isTypeReferenceNode(node)) { - collectTypes(node); - } - - forEachChild(node, collectTypesFromNode); -} - collectNodes(declaration); let content = "";