commandzen
Version:
A command-line argument parsing library that allows for quick and easy parsing of command-line arguments.
80 lines (79 loc) • 2.58 kB
JavaScript
import { Command, CommandParser, CommandRunner } from "./command";
import { Option } from "./option/Option";
export class CliBuilder {
defaultCommand;
constructor({ name, description }) {
this.defaultCommand = Command.create({ name, description });
this.addHelpToDefaultCommand();
}
static create(props) {
return new CliBuilder(props);
}
addCommand(command) {
command.addOption({
flag: "-h, --help",
description: "Display help information for this command.",
});
this.defaultCommand.addSubcommand(command);
return this;
}
addOption(props) {
this.defaultCommand.addOption(props);
return this;
}
addGlobalOption(props) {
const addOptionToCommand = (command) => {
command.addOption(props);
command.subcommands.forEach((subcommand) => {
addOptionToCommand(subcommand);
});
};
addOptionToCommand(this.defaultCommand);
return this;
}
setDefaultCommand(command) {
this.defaultCommand = command;
this.addHelpToDefaultCommand();
return this;
}
parse(argv = process.argv.slice(2)) {
const command = CommandParser.parse(this.defaultCommand, argv);
CommandRunner.run(command.command, command.options);
}
addHelpToDefaultCommand() {
this.addHelpOptionToCommand(this.defaultCommand);
const helpCommand = this.createCommandHelp();
this.defaultCommand.addSubcommand(helpCommand);
}
addHelpOptionToCommand(command) {
command.addOption({
flag: "-h, --help",
description: "Display help information",
});
}
createCommandHelp() {
return Command.create({
name: "help",
description: "Display help information",
options: [
Option.create({
flag: "-c, --command <command>",
description: "Display help information for a specific command",
}),
],
}).registerAction(({ command }) => {
if (command) {
const subcommand = this.defaultCommand.findSubcommand(command);
if (subcommand) {
subcommand.help();
}
else {
console.warn(`Command '${command}' not found.`);
}
}
else {
this.defaultCommand.help();
}
});
}
}