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]