@foxframework/core
Version:
A modern, production-ready web framework for TypeScript/Node.js with modular routing, integrated template engine, CLI tools, and enterprise features
128 lines (127 loc) • 4.42 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.CommandManager = void 0;
class CommandManager {
constructor() {
this.commands = new Map();
}
/**
* Register a command with the command manager
*/
registerCommand(command) {
this.commands.set(command.name, command);
}
/**
* Register multiple commands on a parent command
*/
registerCommands(parentCommand, commands) {
commands.forEach(commandDef => {
const command = parentCommand
.command(commandDef.name)
.description(commandDef.description);
// Add aliases
if (commandDef.aliases) {
commandDef.aliases.forEach(alias => command.alias(alias));
}
// Add options
if (commandDef.options) {
commandDef.options.forEach(option => {
const optionString = this.buildOptionString(option);
command.option(optionString, option.description, option.default);
});
}
// Add arguments
if (commandDef.arguments) {
commandDef.arguments.forEach(arg => {
const argString = arg.required ? `<${arg.name}>` : `[${arg.name}]`;
command.argument(argString, arg.description);
});
}
// Set action
command.action(async (...args) => {
try {
// Extract arguments and options
const commandArgs = this.extractArguments(args, commandDef);
const options = args[args.length - 2]; // Options are second to last
const parentCmd = args[args.length - 1]; // Command instance is last
const parentOptions = parentCmd.parent?.opts() || {}; // Parent options
// Create CLI context
const context = {
command: commandDef,
projectRoot: process.cwd(),
verbose: parentOptions.verbose || false,
quiet: parentOptions.quiet || false,
noColor: parentOptions.noColor || false
};
// Validate if validator exists
if (commandDef.validate) {
const validation = commandDef.validate(commandArgs, options);
if (!validation.valid) {
console.error(`Validation failed: ${validation.message}`);
process.exit(1);
}
}
// Execute command
await commandDef.action(commandArgs, options, context);
}
catch (error) {
this.handleError(error, args[args.length - 1].parent?.opts() || {});
}
});
this.registerCommand(commandDef);
});
}
/**
* Build option string for commander
*/
buildOptionString(option) {
let optionStr = '';
if (option.alias) {
optionStr += `-${option.alias}, `;
}
optionStr += `--${option.name}`;
if (option.type && option.type !== 'boolean') {
optionStr += ` <${option.name}>`;
}
return optionStr;
}
/**
* Extract arguments from commander args
*/
extractArguments(args, commandDef) {
const result = {};
if (commandDef.arguments) {
commandDef.arguments.forEach((argDef, index) => {
if (index < args.length - 2) {
result[argDef.name] = args[index];
}
});
}
return result;
}
/**
* Handle command errors
*/
handleError(error, options) {
if (options?.verbose) {
console.error(error);
}
else {
console.error(`Error: ${error.message}`);
}
process.exit(1);
}
/**
* Get registered command
*/
getCommand(name) {
return this.commands.get(name);
}
/**
* Get all registered commands
*/
getAllCommands() {
return Array.from(this.commands.values());
}
}
exports.CommandManager = CommandManager;
;