UNPKG

1.38 kBPlain TextView Raw
1import { CliOptions, CliParsedCommandHandler, ParsedCliCommand } from './types';
2import { isFunction } from './utils';
3
4export const createRunHandler = (cliOptions: CliOptions = {}): CliParsedCommandHandler => {
5 const runHandler = async (parsed: ParsedCliCommand): Promise<void | number> => {
6 // determine if a passed command option has an associated handler (to short-cirucuit command handler)
7 const commandOption = Object.keys(parsed.options)
8 .filter(o => typeof parsed.options[o] !== 'undefined')
9 .find(o => !!(parsed.optionDefinitions[o] && parsed.optionDefinitions[o].commandHandler));
10
11 // get handler from command option, then global handler, then the individual command's handler
12 const parsedCmdHandler = commandOption
13 ? parsed.optionDefinitions[commandOption].commandHandler
14 : cliOptions.globalHandler;
15
16 if (parsedCmdHandler) {
17 if (isFunction(parsedCmdHandler)) {
18 return Promise.resolve(parsedCmdHandler(parsed));
19 } else {
20 throw new Error(`runHandler Failed: commandHandler is not a function`);
21 }
22 } else if (parsed.command.handler) {
23 return Promise.resolve(parsed.command.handler(parsed.arguments, parsed.options));
24 }
25 };
26
27 return runHandler;
28};