import { execaCommand, getPackages } from '@vben/node-utils'; import { cancel, isCancel, select } from '@clack/prompts'; interface RunOptions { command?: string; } export async function run(options: RunOptions) { const { command } = options; if (!command) { console.error('Please enter the command to run'); process.exit(1); } const { packages } = await getPackages(); // const appPkgs = await findApps(process.cwd(), packages); // const websitePkg = packages.find( // (item) => item.packageJson.name === '@vben/website', // ); // 只显示有对应命令的包 const selectPkgs = packages.filter((pkg) => { return (pkg?.packageJson as Record)?.scripts?.[command]; }); let selectPkg: string | symbol; if (selectPkgs.length > 1) { selectPkg = await select({ message: `Select the app you need to run [${command}]:`, options: selectPkgs.map((item) => ({ label: item?.packageJson.name, value: item?.packageJson.name, })), }); if (isCancel(selectPkg) || !selectPkg) { cancel('👋 Has cancelled'); process.exit(0); } } else { selectPkg = selectPkgs[0]?.packageJson?.name ?? ''; } if (!selectPkg) { console.error('No app found'); process.exit(1); } execaCommand(`pnpm --filter=${selectPkg} run ${command}`, { stdio: 'inherit', }); } /** * 过滤app包 * @param root * @param packages */ // async function findApps(root: string, packages: Package[]) { // // apps内的 // const appPackages = packages.filter((pkg) => { // const viteConfigExists = fs.existsSync(join(pkg.dir, 'vite.config.mts')); // return pkg.dir.startsWith(join(root, 'apps')) && viteConfigExists; // }); // return appPackages; // }