run.ts 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. import type { Package } from '@vben/node-utils';
  2. import { join } from 'node:path';
  3. import { $, fs, getPackages } from '@vben/node-utils';
  4. import { cancel, isCancel, multiselect } from '@clack/prompts';
  5. interface RunOptions {
  6. command?: string;
  7. }
  8. export async function run(options: RunOptions) {
  9. const { command } = options;
  10. const { packages } = await getPackages();
  11. const appPkgs = await findApps(process.cwd(), packages);
  12. const selectApps = await multiselect<any, string>({
  13. message: `Select the app you need to run [${command}]:`,
  14. options: appPkgs.map((item) => ({ label: item, value: item })),
  15. required: true,
  16. });
  17. if (isCancel(selectApps)) {
  18. cancel('👋 Has cancelled');
  19. process.exit(0);
  20. }
  21. if (selectApps.length === 1) {
  22. $.verbose = true;
  23. // 让控制台显示颜色
  24. process.env.FORCE_COLOR = '1';
  25. await $`pnpm --filter=${selectApps[0]} run ${command} `;
  26. return;
  27. }
  28. const filters = [];
  29. for (const app of selectApps) {
  30. filters.push(`--filter=${app}`);
  31. }
  32. $.verbose = true;
  33. // 让控制台显示颜色
  34. process.env.FORCE_COLOR = '1';
  35. await $`turbo run ${command} ${filters}`;
  36. }
  37. /**
  38. * 过滤app包
  39. * @param root
  40. * @param packages
  41. */
  42. async function findApps(root: string, packages: Package[]) {
  43. // apps内的
  44. const appPackages = packages
  45. .filter((pkg) => {
  46. const viteConfigExists = fs.existsSync(join(pkg.dir, 'vite.config.mts'));
  47. return pkg.dir.startsWith(join(root, 'apps')) && viteConfigExists;
  48. })
  49. .map((pkg) => {
  50. return pkg.packageJson.name;
  51. });
  52. return appPackages;
  53. }