diff --git a/src/v8/add-dialog-content-to-edit-dialog.ts b/src/v8/add-dialog-content-to-edit-dialog.ts new file mode 100644 index 0000000..7a03304 --- /dev/null +++ b/src/v8/add-dialog-content-to-edit-dialog.ts @@ -0,0 +1,84 @@ +import { Node, Project, SyntaxKind, ts } from "ts-morph"; + +export default async function addDialogContentToEditDialog() { + const project = new Project({ tsConfigFilePath: "./admin/tsconfig.json" }); + const sourceFiles = project.getSourceFiles("admin/src/**/*.tsx"); + + sourceFiles.forEach((sourceFile) => { + const importDeclarations = sourceFile.getImportDeclarations(); + + const muiImport = importDeclarations.find( + (importDeclaration) => importDeclaration.getModuleSpecifier().getLiteralValue() === "@mui/material", + ); + + if (!muiImport) { + sourceFile.addImportDeclaration({ + moduleSpecifier: "@mui/material", + namedImports: ["DialogContent"], + }); + } else if (!muiImport.getNamedImports().some((namedImport) => namedImport.getName() === "DialogContent")) { + muiImport.addNamedImport("DialogContent"); + } + + const jsxElements = sourceFile.getDescendantsOfKind(SyntaxKind.JsxElement); + + const elementsToReplace: { node: Node; newText: string }[] = []; + + jsxElements.forEach((jsxElement) => { + const tagName = jsxElement.getOpeningElement().getTagNameNode().getText(); + if (tagName !== "EditDialog") return; + + const children = jsxElement.getJsxChildren(); + const functionAsChild = children.find((child) => Node.isJsxExpression(child) && Node.isArrowFunction(child.getExpression())); + + if (functionAsChild && Node.isJsxExpression(functionAsChild)) { + const expression = functionAsChild.getExpression(); + if (!expression || !Node.isArrowFunction(expression)) return; + + const body = expression.getBody(); + const parameters = expression.getParameters(); + let wrappedContent: string; + + if (Node.isBlock(body)) { + const returnStatement = body.getStatements().find((statement) => Node.isReturnStatement(statement)); + if (!returnStatement || !Node.isReturnStatement(returnStatement)) return; + + let returnedExpression = returnStatement.getExpression(); + if (returnedExpression && Node.isParenthesizedExpression(returnedExpression)) { + returnedExpression = returnedExpression.getExpression(); + } + + if (!returnedExpression) return; + + if (Node.isJsxFragment(returnedExpression)) { + const fragmentChildren = returnedExpression.getChildrenOfKind(SyntaxKind.JsxElement); + const fragmentText = fragmentChildren.map((child) => child.getText()).join("\n"); + wrappedContent = `(\n${fragmentText}\n)`; + } else { + const innerContent = returnedExpression.getText().replace(/\n/g, "\n"); + wrappedContent = `(\n${innerContent}\n)`; + } + + const newFunction = `{(${parameters.map((param) => param.getText()).join(", ")}) => { + return ${wrappedContent};}}`; + elementsToReplace.push({ node: functionAsChild, newText: newFunction }); + } + } else { + const openEditDialog = jsxElement.getOpeningElement().getText(); + const closeEditDialog = jsxElement.getClosingElement().getText(); + const childrensContent = children.map((child) => child.getText()).join("\n"); + + const newContent = `${openEditDialog}\n\n${childrensContent}\n\n${closeEditDialog}`; + elementsToReplace.push({ node: jsxElement, newText: newContent }); + } + }); + + elementsToReplace.forEach(({ node, newText }) => { + node.replaceWithText(newText); + }); + + sourceFile.saveSync(); + }); + + await project.save(); +}