UNPKG

sicua

Version:

A tool for analyzing project structure and dependencies

113 lines (112 loc) 4.15 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.enhanceComponentInfo = enhanceComponentInfo; exports.createSourceFiles = createSourceFiles; const typescript_1 = __importDefault(require("typescript")); const ASTUtils_1 = require("../../../utils/ast/ASTUtils"); const propExtractor_1 = require("./propExtractor"); const jsxExtractor_1 = require("./jsxExtractor"); /** * Enhances component information with detailed AST analysis * @param component Original component relation * @param sourceFile TypeScript source file * @param scanResult Scan result with file metadata (optional) * @returns Component with additional information */ function enhanceComponentInfo(component, sourceFile, scanResult) { try { const componentNode = findComponentNode(component.name, sourceFile); if (!componentNode) { return { ...component, sourceFile, }; } const props = (0, propExtractor_1.extractPropTypes)(componentNode, sourceFile); const jsxStructure = (0, jsxExtractor_1.extractJSXStructure)(componentNode, sourceFile); return { ...component, props, jsxStructure, sourceFile, componentNode, }; } catch (error) { console.warn(`Error enhancing component ${component.name}:`, error); return { ...component, sourceFile, }; } } /** * Finds the component node in the source file */ function findComponentNode(componentName, sourceFile) { return ASTUtils_1.ASTUtils.findNodes(sourceFile, (node) => (typescript_1.default.isVariableDeclaration(node) || typescript_1.default.isFunctionDeclaration(node)) && (node.name?.getText() === componentName || node.name?.getText() === `${componentName}`))[0]; } /** * Creates source files from components using scan result data */ function createSourceFiles(components, scanResult) { const sourceFilesMap = new Map(); const validComponents = components.filter((c) => Boolean(c.fullPath) && !c.fullPath.endsWith(".d.ts") && (Boolean(c.content) || Boolean(scanResult?.fileContents.has(c.fullPath)))); for (const component of validComponents) { try { const content = getComponentContent(component, scanResult); if (!content) { continue; } const scriptKind = getScriptKind(component.fullPath); const sourceFile = typescript_1.default.createSourceFile(component.fullPath, content, typescript_1.default.ScriptTarget.Latest, true, scriptKind); sourceFilesMap.set(component.fullPath, sourceFile); } catch (error) { console.warn(`Error creating source file for ${component.fullPath}:`, error); } } return sourceFilesMap; } /** * Gets component content from scan result or component */ function getComponentContent(component, scanResult) { if (scanResult?.fileContents.has(component.fullPath)) { const content = scanResult.fileContents.get(component.fullPath); if (content && content.trim()) { return content; } } if (component.content && component.content.trim()) { return component.content; } return undefined; } /** * Determines TypeScript script kind based on file extension */ function getScriptKind(filePath) { const extension = filePath.toLowerCase().split(".").pop(); switch (extension) { case "tsx": return typescript_1.default.ScriptKind.TSX; case "jsx": return typescript_1.default.ScriptKind.JSX; case "ts": return typescript_1.default.ScriptKind.TS; case "js": return typescript_1.default.ScriptKind.JS; case "mjs": return typescript_1.default.ScriptKind.External; default: return typescript_1.default.ScriptKind.TSX; } }