import defaultConfig from "../griddorc"; import { existsSync, writeFileSync } from "fs"; import { join } from "path"; import { generateAstFromSourceFile, writeGriddoFile, checkIfElementExists, readTemplate, writeStorybookFile, writeSchemaFile, writeStylesFile } from "./utils"; import processElement from "./processElement"; import { AddItemOptions } from "./types"; import { ParseResult } from "@babel/parser"; const ROOT = process.cwd(); const TEMPLATES_FOLDER = defaultConfig.griddoTemplatesFolder; export default function addItem({ element, name, niceName, storybook, type }: AddItemOptions) { const path = `${ROOT}/${TEMPLATES_FOLDER}/${element}s`; const baseFolder = TEMPLATES_FOLDER && existsSync(path) ? path : join(__dirname, "..", `templates/${element}s`); const uiFolder = defaultConfig[`${element}s` as string].ui; const schemasFolder = defaultConfig[`${element}s` as string].schemas; const alias = defaultConfig[`${element}s` as string].alias; // Indexs file location const uiIndexFile = `${uiFolder}/index.tsx`; const schemasIndexFile = `${schemasFolder}/index.ts`; // Indexs file AST code let uiAST: ParseResult | undefined; let schemasAST: ParseResult | undefined; let componentTplFile = ""; let storiesTplFile = ""; let schemaTplFile = ""; if (element !== "object") { uiAST = generateAstFromSourceFile(uiIndexFile); componentTplFile = readTemplate(baseFolder, element, "ui"); storiesTplFile = readTemplate(baseFolder, element, "stories"); } if (element !== "element") { schemasAST = generateAstFromSourceFile(schemasIndexFile); schemaTplFile = readTemplate(baseFolder, element, "schema"); } // Si el template que se pretende añadir ya existe como archivo, exit(1) // TODO: hacer esta comprobación con el AST if (checkIfElementExists({ type: `${element}s`, name: name })) { process.exit(1); } const elementProcessed = processElement(element, { uiAST, schemasAST, alias, componentTplFile, schemaTplFile, storiesTplFile, name, niceName, type }); const { uiCode, schemaCode, componentTpl, schemaTpl, storiesTpl } = elementProcessed; if (element !== "element") { // schemas/components/index writeFileSync(schemasIndexFile, schemaCode); // schema writeSchemaFile(schemasFolder, name, schemaTpl); } if (element !== "object") { // components/index writeFileSync(uiIndexFile, uiCode); // component writeGriddoFile(uiFolder, name, componentTpl); // storybook storybook && writeStorybookFile(uiFolder, name, storiesTpl); // styles writeStylesFile(uiFolder, name, ""); } }