import { CliOptions, CliParsedCommandHandler, ParsedCliCommand } from './types'; import { isFunction } from './utils'; export const createRunHandler = (cliOptions: CliOptions = {}): CliParsedCommandHandler => { const runHandler = async (parsed: ParsedCliCommand): Promise => { // determine if a passed command option has an associated handler (to short-cirucuit command handler, e.g. help/version) const commandOption = Object.keys(parsed.options) .filter(o => typeof parsed.options[o] !== 'undefined') .find(o => !!(parsed.optionDefinitions[o] && parsed.optionDefinitions[o].commandHandler)); // get handler from command option, then global handler, then the individual command's handler const parsedCmdHandler = commandOption ? parsed.optionDefinitions[commandOption].commandHandler : cliOptions.globalHandler; if (parsedCmdHandler) { if (isFunction(parsedCmdHandler)) { return Promise.resolve(parsedCmdHandler(parsed)); } else { throw new Error(`runHandler Failed: commandHandler is not a function`); } } else if (parsed.command.handler) { return Promise.resolve(parsed.command.handler(parsed.arguments, parsed.options, parsed)); } }; return runHandler; };