import { API, Collection, FileInfo, Identifier, MemberExpression } from 'jscodeshift'; import { getMinifiedComponentKey, getComponent, getMinifiedCallExpressions } from '../../utils/parse'; import { Operation } from '../../types/transformer'; import { MigrateReport, TransformError, UIConfig } from '../../types/runner'; import { generateUID } from '../../utils/helper'; import { saveTempData } from '../../utils/file'; import { modifyAST } from '../../utils/transform'; export default async (file: FileInfo, api: API, options: { reportDir: string }): Promise => { const errors: TransformError[] = []; const uiConfig: UIConfig = { components: {}, }; const modifiedFiles = []; let root!: Collection; try { const j = api.jscodeshift; root = j(file.source); const callExpressions = getMinifiedCallExpressions(root, j); callExpressions.forEach((expr) => { if (expr) { const operation = ((expr.node.callee as MemberExpression)?.property as Identifier)?.name as Operation; const isValidExp = Object.values(Operation).includes(operation); if (isValidExp) { const originalArgs = expr.node.arguments || []; const componentKey = getMinifiedComponentKey(originalArgs) || generateUID(); const [component, flexVariable] = getComponent(expr.node.callee as MemberExpression, true) as string[]; if (!component || !flexVariable) { throw new Error('Unable to find the Dynamic Component usage'); } modifyAST(operation, uiConfig, componentKey, component, originalArgs, flexVariable, expr, j, false); } } }); } catch (e: any) { errors.push({ file: file.path, message: e.message, }); } const updatedSource = root.toSource(); if (updatedSource !== file.source) { modifiedFiles.push(file.path); } await saveTempData( { modifiedFiles, uiConfig, domManipulation: [], errors, }, options.reportDir, ); return updatedSource; };