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; // }