From 9a156fea16bce99eef7dcd4b090f4c608cc19fbd Mon Sep 17 00:00:00 2001 From: Jerko Steiner Date: Mon, 5 Aug 2019 20:26:39 +0700 Subject: [PATCH] Add ability to process short flags (untested) --- packages/argparse/src/argparse.ts | 28 ++++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/packages/argparse/src/argparse.ts b/packages/argparse/src/argparse.ts index 989f0a8..6aa35c0 100644 --- a/packages/argparse/src/argparse.ts +++ b/packages/argparse/src/argparse.ts @@ -10,6 +10,7 @@ export type TArgType = export interface IArgConfig { type: T + alias?: string default?: TArgType required?: boolean } @@ -52,19 +53,42 @@ export function argparse( const it = iterate(args) const usedArgs: Record = {} + const aliases: Record = {} const requiredArgs = Object.keys(config).reduce((obj, arg) => { const argConfig = config[arg] if (argConfig.default !== undefined) { result[arg] = argConfig.default } + if (argConfig.alias) { + aliases[argConfig.alias] = arg + } obj[arg] = !!argConfig.required return obj }, {} as Record) while(it.hasNext()) { const arg = it.next() - assert(arg.substring(0, 2) === '--', 'Arguments must start with --') - const argName = arg.substring(2) + assert(arg.substring(0, 1) === '-', 'Arguments must start with -') + let argName: string + if (arg.substring(1, 2) !== '-') { + // flags + const flags = arg.substring(1).split('') + + flags.slice(0, flags.length - 2) + .forEach(flag => { + const alias = aliases[flag] + const argConfig = config[alias] + assert(!!argConfig, 'Unknown flag: ' + flag) + assert(argConfig.type === 'boolean', 'The argument is not a flag/boolean: ' + flag) + delete requiredArgs[alias] + result[alias] = true + }) + + const lastArg = flags[flags.length - 1] + argName = aliases[lastArg] + } else { + argName = arg.substring(2) + } const argConfig = config[argName] assert(!!argConfig, 'Unknown argument: ' + arg) delete requiredArgs[argName]