Skip to content

Commit

Permalink
feat(command): return literal arguments in .parse() method and ad…
Browse files Browse the repository at this point in the history
…d `.getLiteralArgs()` method (#26)
  • Loading branch information
c4spar committed Jun 4, 2020
1 parent 0980b42 commit 385f38f
Show file tree
Hide file tree
Showing 3 changed files with 33 additions and 11 deletions.
19 changes: 13 additions & 6 deletions packages/command/lib/base-command.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ export class BaseCommand<O = any, A extends Array<any> = any> {
[ 'boolean', { name: 'boolean', handler: new BooleanType() } ]
] );
protected rawArgs: string[] = [];
protected literalArgs: string[] = [];
// @TODO: get script name: https://github.com/denoland/deno/pull/5034
// protected name: string = location.pathname.split( '/' ).pop() as string;
protected _name: string = 'COMMAND';
Expand Down Expand Up @@ -537,26 +538,28 @@ export class BaseCommand<O = any, A extends Array<any> = any> {
await this.executeExecutable( this.rawArgs );
}

return { options: {} as O, args: this.rawArgs as any as A, cmd: this };
return { options: {} as O, args: this.rawArgs as any as A, cmd: this, literal: this.literalArgs };

} else if ( this._useRawArgs ) {

if ( dry ) {
return { options: {} as O, args: this.rawArgs as any as A, cmd: this };
return { options: {} as O, args: this.rawArgs as any as A, cmd: this, literal: this.literalArgs };
}

return await this.execute( {} as O, ...this.rawArgs as A );

} else {

const { flags, unknown } = this.parseFlags( this.rawArgs, true );
const { flags, unknown, literal } = this.parseFlags( this.rawArgs );

this.literalArgs = literal;

const params = this.parseArguments( unknown, flags );

this.validateEnvVars();

if ( dry ) {
return { options: flags, args: params as any as A, cmd: this };
return { options: flags, args: params as any as A, cmd: this, literal: this.literalArgs };
}

return await this.execute( flags, ...params );
Expand All @@ -575,7 +578,7 @@ export class BaseCommand<O = any, A extends Array<any> = any> {

if ( actionOption && actionOption.action ) {
await actionOption.action( options, ...args );
return { options, args: args as any as A, cmd: this };
return { options, args: args as any as A, cmd: this, literal: this.literalArgs };
}

if ( this.fn ) {
Expand All @@ -601,7 +604,7 @@ export class BaseCommand<O = any, A extends Array<any> = any> {
}
}

return { options, args: args as any as A, cmd: this };
return { options, args: args as any as A, cmd: this, literal: this.literalArgs };
}

/**
Expand Down Expand Up @@ -1392,6 +1395,10 @@ export class BaseCommand<O = any, A extends Array<any> = any> {
return this.examples.find( example => example.name === name );
}

public getLiteralArgs(): string[] {
return this.literalArgs;
}

/********************************************************************************
**** HELPER ********************************************************************
********************************************************************************/
Expand Down
10 changes: 5 additions & 5 deletions packages/command/lib/types.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
import { BaseCommand } from './base-command.ts';
import { ITypeHandler } from '../../flags/lib/types.ts';
import { IFlagArgument, IFlagOptions, IGenericObject, OptionType } from '../../flags/lib/types.ts';
import { IFlagArgument, IFlagOptions, ITypeHandler, OptionType } from '../../flags/lib/types.ts';
import { Type } from '../types/type.ts';
import { BaseCommand } from './base-command.ts';

/** Action handler. */
export type IAction<O, A extends Array<any>> = ( options: O, ...args: A ) => void | Promise<void>;
Expand Down Expand Up @@ -77,8 +76,9 @@ export interface IExample {

/** Result of `cmd.parse()`. */
export interface IParseResult<O = any, A extends Array<any> = any> {
options: O,
args: A
options: O;
args: A;
literal: string[];
cmd: BaseCommand<O>;
}

Expand Down
15 changes: 15 additions & 0 deletions packages/command/test/command/literal-arguments_test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import { Command } from '../../lib/command.ts';
import { assertEquals } from '../lib/assert.ts';

Deno.test( 'command literal arguments', async () => {

const { options, args, literal } = await new Command()
.throwErrors()
.option( '-f, --flag [val:string]', '...' )
.action( () => {} )
.parse( [ '-f', 'value', '--', '-t', 'abc' ] );

assertEquals( options, { flag: 'value' } );
assertEquals( args, [] );
assertEquals( literal, [ '-t', 'abc' ] );
} );

0 comments on commit 385f38f

Please sign in to comment.