cli.ts1.2 KBView on GitHub
import { intro, select, isCancel, outro, log } from '@clack/prompts';
import * as commands from './commands';

let args = [];
if (process.argv.slice(2).length === 0) {
  intro(`Welcome to the Nizzy CLI`);

  const user = process.env.USER || process.env.USERNAME || 'there';

  const command = await select({
    message: `Hey ${user}, what do you want to do?`,
    options: Object.values(commands).map((command) => ({
      label: command.description,
      value: command.id,
    })),
    maxItems: 5,
  });

  if (isCancel(command)) {
    outro('No worries, come back anytime!');
    process.exit(0);
  }

  args = [command];
} else {
  intro(`Nizzy CLI`);
  args = process.argv.slice(2);
}

if (['help', '-h', '--help'].includes(args[0])) {
  log.message('Available commands:');
  log.message(
    Object.values(commands)
      .map((command) => ` ${command.id.padStart(15)}    ${command.description}`)
      .join('\n'),
  );
  outro('Run `pnpm nizzy` for an interactive experience\n');
  process.exit(0);
}

const command = Object.values(commands).find((command) => command.id === args[0]);

if (!command) {
  outro("Umm, I don't know how to do that yet");
  process.exit(0);
}

await command.run();
outro(`Done!`);
process.exit(0);