sicua
Version:
A tool for analyzing project structure and dependencies
113 lines (112 loc) • 4.15 kB
JavaScript
;
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;
}
}