import type { CAC } from 'cac'; import { join, relative } from 'node:path'; import { colors, consola, findMonorepoRoot, getPackages, gitAdd, outputJSON, prettierFormat, toPosixPath, } from '@vben/node-utils'; const CODE_WORKSPACE_FILE = join('vben-admin.code-workspace'); interface CodeWorkspaceCommandOptions { autoCommit?: boolean; spaces?: number; } async function createCodeWorkspace({ autoCommit = false, spaces = 2, }: CodeWorkspaceCommandOptions) { const { packages, rootDir } = await getPackages(); let folders = packages.map((pkg) => { const { dir, packageJson } = pkg; return { name: packageJson.name, path: toPosixPath(relative(rootDir, dir)), }; }); folders = folders.filter(Boolean); const monorepoRoot = findMonorepoRoot(); const outputPath = join(monorepoRoot, CODE_WORKSPACE_FILE); await outputJSON(outputPath, { folders }, spaces); await prettierFormat(outputPath); if (autoCommit) { await gitAdd(CODE_WORKSPACE_FILE, monorepoRoot); } } async function runCodeWorkspace({ autoCommit, spaces, }: CodeWorkspaceCommandOptions) { await createCodeWorkspace({ autoCommit, spaces, }); if (autoCommit) { return; } consola.log(''); consola.success(colors.green(`${CODE_WORKSPACE_FILE} is updated!`)); consola.log(''); } function defineCodeWorkspaceCommand(cac: CAC) { cac .command('code-workspace') .usage('Update the `.code-workspace` file') .option('--spaces [number]', '.code-workspace JSON file spaces.', { default: 2, }) .option('--auto-commit', 'auto commit .code-workspace JSON file.', { default: false, }) .action(runCodeWorkspace); } export { defineCodeWorkspaceCommand };