diff --git a/packages/argparse/src/argparse.test.ts b/packages/argparse/src/argparse.test.ts index b9be5ed..2930cad 100644 --- a/packages/argparse/src/argparse.test.ts +++ b/packages/argparse/src/argparse.test.ts @@ -159,7 +159,7 @@ describe('argparse', () => { type: 'string[]', }, help: arg('boolean'), - }, exit, log) + }, '', exit, log) expect(parse([CMD]).value).toEqual([]) expect(parse([CMD, '--value', 'one']).value).toEqual(['one']) parse([CMD, '--help']) @@ -182,7 +182,7 @@ describe('argparse', () => { alias: 'o', }, help: arg('boolean'), - }, exit, log) + }, '', exit, log) expect(parse([CMD]).value).toEqual([]) expect(parse([CMD, '--value', 'a', 'b', '--other', '-o', '3'])).toEqual({ value: ['a', 'b', '--other'], @@ -204,7 +204,7 @@ describe('argparse', () => { value: arg('string[]', {n: '+', required: true}), other: arg('number'), help: arg('boolean'), - }, exit, log) + }, '', exit, log) expect(() => parse([CMD])).toThrowError(/Missing required args: value/) expect(parse([CMD, '--value', 'a', '--other', '3'])).toEqual({ value: ['a', '--other', '3'], @@ -232,7 +232,7 @@ describe('argparse', () => { value: arg('string[]', {n: '*', required: true, positional: true}), other: arg('number'), help: arg('boolean'), - }, exit, log) + }, '', exit, log) expect(parse([CMD, 'a', 'b']).value).toEqual(['a', 'b']) expect(() => parse([CMD, '--other', '3']).value) .toThrowError(/Missing.*: value/) @@ -272,7 +272,7 @@ describe('argparse', () => { type: 'number', positional: true, }, - }, exit, log) + }, '', exit, log) expect(parse([CMD]).a).toBe(NaN) expect(parse([CMD, '12']).a).toBe(12) parse([CMD, '--help']) @@ -352,13 +352,15 @@ Positional arguments: two: arg('number'), three: arg('boolean'), help: arg('boolean'), - }, exit, log) + }, 'This command does something', exit, log) expect(exit.mock.calls.length).toBe(0) parse([CMD, '--help']) expect(exit.mock.calls.length).toBe(1) expect(log.mock.calls[0][0]).toEqual([ `${CMD} [OPTIONS]`, '', + 'This command does something', + '', 'Options:', ' --one string', ' --two number', @@ -383,7 +385,7 @@ Positional arguments: positional: true, }), help: arg('boolean'), - }, exit, log) + }, '', exit, log) expect(exit.mock.calls.length).toBe(0) parse([CMD, '--help']) expect(exit.mock.calls.length).toBe(1) diff --git a/packages/argparse/src/argparse.ts b/packages/argparse/src/argparse.ts index fffc624..52d2bc8 100644 --- a/packages/argparse/src/argparse.ts +++ b/packages/argparse/src/argparse.ts @@ -150,14 +150,14 @@ function checkChoice(argument: string, choice: T, choices?: T[]) { } } -export function padRight(str: string, chars: number) { +function padRight(str: string, chars: number) { while (str.length < chars) { str += ' ' } return str } -export function help(command: string, config: IArgsConfig) { +function help(command: string, config: IArgsConfig, desc: string = '') { const keys = Object.keys(config) function getArrayHelp( @@ -257,7 +257,7 @@ export function help(command: string, config: IArgsConfig) { .filter(k => k.length) .join(' ') - return [commandHelp, positionalHelp, optionsHelp] + return [commandHelp, desc, positionalHelp, optionsHelp] .filter(h => h.length) .join('\n\n') } @@ -274,6 +274,7 @@ export function arg( export function argparse( config: T, + description: string = '', exit: () => void = () => process.exit(), /* tslint:disable-next-line */ log: (message: string) => void = console.log.bind(console), @@ -360,7 +361,7 @@ export function argparse( : getNextPositional(argument) const argConfig = config[argName] if (!isPositional && argName === 'help') { - log(help(command, config)) + log(help(command, config, description)) exit() // should never reach this in real life return null as any