UNPKG

@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
"use strict"; 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;