Skip to content

Commit

Permalink
feat(flags): support method as option default value
Browse files Browse the repository at this point in the history
  • Loading branch information
c4spar committed Apr 4, 2020
1 parent 6e3bc57 commit ce09421
Show file tree
Hide file tree
Showing 4 changed files with 16 additions and 20 deletions.
2 changes: 1 addition & 1 deletion packages/flags/lib/flags.ts
Expand Up @@ -113,7 +113,7 @@ export function parseFlags( args: string[], opts: IParseOptions = {} ): IFlagsRe
if ( typeof flags[ friendlyName ] === 'undefined' ) {

if ( typeof option.default !== 'undefined' ) {
flags[ friendlyName ] = option.default;
flags[ friendlyName ] = typeof option.default === 'function' ? option.default() : option.default;
} else if ( option.args && option.args[ 0 ].optionalValue ) {
flags[ friendlyName ] = true;
} else {
Expand Down
4 changes: 3 additions & 1 deletion packages/flags/lib/types.ts
Expand Up @@ -45,6 +45,8 @@ export interface IFlagArgument {
separator?: string;
}

export type IDefaultValue = IFlagValue | ( () => undefined | IFlagValue );

/**
* Flag value handler for custom value processing.
*/
Expand All @@ -58,7 +60,7 @@ export interface IFlagOptions extends IFlagArgument {
args?: IFlagArgument[];
aliases?: string[];
standalone?: boolean;
default?: IFlagValue,
default?: IDefaultValue;
required?: boolean;
requires?: string[];
conflicts?: string[];
Expand Down
19 changes: 4 additions & 15 deletions packages/flags/lib/validate-flags.ts
Expand Up @@ -19,22 +19,11 @@ export function validateFlags( flags: IFlagOptions[], values: IFlags, knownFlaks

const options = keys.map( name => ( { name, option: getOption( flags, paramCase( name ) ) } ) );

// Set default value's
for ( const option of flags ) {

const name = camelCase( option.name );

if (
typeof option.default !== 'undefined'
&& (
typeof values[ name ] === 'undefined'
// @TODO: create a test for list default value
// || (
// Array.isArray( values[ name ] )
// && ( values[ name ] as any[] )?.filter( val => typeof val !== 'undefined' ).length === 0
// )
)
) {
values[ name ] = option.default;
const name: string = camelCase( option.name );
if ( typeof values[ name ] === 'undefined' && typeof option.default !== 'undefined' ) {
values[ name ] = typeof option.default === 'function' ? option.default() : option.default;
}
}

Expand Down
11 changes: 8 additions & 3 deletions packages/flags/test/option/default_test.ts
Expand Up @@ -34,23 +34,28 @@ const options = <IParseOptions>{
aliases: [ 'N' ],
type: OptionType.NUMBER,
default: 1
}, {
name: 'method',
aliases: [ 'm' ],
type: OptionType.NUMBER,
default: () => 1
} ]
};

Deno.test( function flags_optionDefault_defaultValues() {

const { flags, unknown, literal } = parseFlags( [], options );

assertEquals( flags, { boolean: false, string: '0', number: 0, boolean2: true, string2: '1', number2: 1 } );
assertEquals( flags, { boolean: false, string: '0', number: 0, boolean2: true, string2: '1', number2: 1, method: 1 } );
assertEquals( unknown, [] );
assertEquals( literal, [] );
} );

Deno.test( function flags_optionDefault_defaultValues() {

const { flags, unknown, literal } = parseFlags( [ '-b', '1', '-s', '1', '-n', '1', '-B', '0', '-S', '0', '-N', '0' ], options );
const { flags, unknown, literal } = parseFlags( [ '-b', '1', '-s', '1', '-n', '1', '-B', '0', '-S', '0', '-N', '0', '-m', '0' ], options );

assertEquals( flags, { boolean: true, string: '1', number: 1, boolean2: false, string2: '0', number2: 0 } );
assertEquals( flags, { boolean: true, string: '1', number: 1, boolean2: false, string2: '0', number2: 0, method: 0 } );
assertEquals( unknown, [] );
assertEquals( literal, [] );
} );
Expand Down

0 comments on commit ce09421

Please sign in to comment.