import fs from "fs-extra"; import path from "path"; import { execSync } from "child_process"; import inquirer from "inquirer"; import chalk from "chalk"; type ProjectSection = "frontend" | "backend"; interface InstallLibraryOptions { section?: ProjectSection; packageManager?: "npm" | "yarn" | "pnpm"; } const LIBRARY_LIST_PATH = path.join(__dirname, "libraryList.json"); // بارگذاری یا ایجاد لیست کتابخانه‌ها function loadLibraryList(): Record { if (!fs.existsSync(LIBRARY_LIST_PATH)) { const defaultList: Record = { frontend: ["react", "react-router", "material-ui", "chakra-ui", "tailwindcss", "shadcn-ui", "hiro-ui"], backend: ["express", "cors", "dotenv", "prisma", "typeorm", "mongoose"], }; fs.writeJSONSync(LIBRARY_LIST_PATH, defaultList, { spaces: 2 }); return defaultList; } return fs.readJSONSync(LIBRARY_LIST_PATH); } // ذخیره لیست کتابخانه‌ها function saveLibraryList(list: Record) { fs.writeJSONSync(LIBRARY_LIST_PATH, list, { spaces: 2 }); } // مسیر نصب هوشمند function getTargetDir(section: ProjectSection): string { const cwd = process.cwd(); if (section === "backend") { const backendSrc = path.join(cwd, "backend", "src"); return fs.existsSync(backendSrc) ? backendSrc : path.join(cwd, "backend"); } else { const srcDir = path.join(cwd, "src"); return fs.existsSync(srcDir) ? srcDir : cwd; } } export async function installLibrary(options: InstallLibraryOptions) { const { section = "frontend", packageManager = "npm" } = options; const libraries = loadLibraryList(); const targetDir = getTargetDir(section); if (!fs.existsSync(targetDir)) { console.error(chalk.red(`❌ ${section} folder not found!`)); return; } process.chdir(targetDir); // پرسش اصلی با انتخاب از لیست یا وارد کردن جدید const { library } = await inquirer.prompt<{ library: string }>({ type: "list", name: "library", message: `Select a library to install in ${section} (or choose "New Library")`, choices: [...libraries[section], "New Library"] }); let libName = library; if (library === "New Library") { const { newLib } = await inquirer.prompt<{ newLib: string }>({ type: "input", name: "newLib", message: "Enter the npm library name:" }); libName = newLib.trim(); } if (!libName) { console.warn(chalk.yellow("⚠️ No library name provided. Aborting.")); return; } // نصب کتابخانه try { console.log(chalk.cyan(`\n⬇ Installing "${libName}" in ${section}...`)); execSync(`${packageManager} install ${libName}`, { stdio: "inherit" }); // افزودن به لیست اگر جدید باشد if (!libraries[section].includes(libName)) { libraries[section].push(libName); saveLibraryList(libraries); console.log(chalk.green(`✅ "${libName}" added to the ${section} library list.`)); } else { console.log(chalk.green(`✅ "${libName}" installed successfully.`)); } } catch (err) { console.error(chalk.red(`❌ Failed to install "${libName}".`), err); } }