index.ts 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. import type { CAC } from 'cac';
  2. import { join, relative } from 'node:path';
  3. import {
  4. colors,
  5. consola,
  6. findMonorepoRoot,
  7. fs,
  8. getPackages,
  9. gitAdd,
  10. prettierFormat,
  11. toPosixPath,
  12. } from '@vben/node-utils';
  13. const CODE_WORKSPACE_FILE = join('vben-admin.code-workspace');
  14. interface CodeWorkspaceCommandOptions {
  15. autoCommit?: boolean;
  16. spaces?: number;
  17. }
  18. async function createCodeWorkspace({
  19. autoCommit = false,
  20. spaces = 2,
  21. }: CodeWorkspaceCommandOptions) {
  22. const { packages, rootDir } = await getPackages();
  23. let folders = packages.map((pkg) => {
  24. const { dir, packageJson } = pkg;
  25. return {
  26. name: packageJson.name,
  27. path: toPosixPath(relative(rootDir, dir)),
  28. };
  29. });
  30. folders = folders.filter(Boolean);
  31. const monorepoRoot = findMonorepoRoot();
  32. const outputPath = join(monorepoRoot, CODE_WORKSPACE_FILE);
  33. await fs.outputJSON(outputPath, { folders }, { encoding: 'utf8', spaces });
  34. await prettierFormat(outputPath);
  35. if (autoCommit) {
  36. await gitAdd(CODE_WORKSPACE_FILE, monorepoRoot);
  37. }
  38. }
  39. async function runCodeWorkspace({
  40. autoCommit,
  41. spaces,
  42. }: CodeWorkspaceCommandOptions) {
  43. await createCodeWorkspace({
  44. autoCommit,
  45. spaces,
  46. });
  47. if (autoCommit) {
  48. return;
  49. }
  50. consola.log('');
  51. consola.success(colors.green(`${CODE_WORKSPACE_FILE} is updated!`));
  52. consola.log('');
  53. }
  54. function defineCodeWorkspaceCommand(cac: CAC) {
  55. cac
  56. .command('code-workspace')
  57. .usage('Update the `.code-workspace` file')
  58. .option('--spaces [number]', '.code-workspace JSON file spaces.', {
  59. default: 2,
  60. })
  61. .option('--auto-commit', 'auto commit .code-workspace JSON file.', {
  62. default: false,
  63. })
  64. .action(runCodeWorkspace);
  65. }
  66. export { defineCodeWorkspaceCommand };