66 CommandScope
77} from '../models/command' ;
88import { oneLine } from 'common-tags' ;
9- import { Logger } from '@angular-devkit/core/src/logger ' ;
9+ import { logging } from '@angular-devkit/core' ;
1010import { camelize } from '@angular-devkit/core/src/utils/strings' ;
1111
1212const yargsParser = require ( 'yargs-parser' ) ;
@@ -19,12 +19,13 @@ export interface CommandMap {
1919 * Run a command.
2020 * @param commandMap Map of available commands.
2121 * @param args Raw unparsed arguments.
22+ * @param logger The logger to use.
2223 * @param context Execution context.
2324 */
2425export async function runCommand ( commandMap : CommandMap ,
25- args : string [ ] ,
26- logger : Logger ,
27- context : CommandContext ) : Promise < any > {
26+ args : string [ ] ,
27+ logger : logging . Logger ,
28+ context : CommandContext ) : Promise < any > {
2829
2930 const rawOptions = yargsParser ( args , { alias : { help : [ 'h' ] } , boolean : [ 'help' ] } ) ;
3031 let commandName = rawOptions . _ [ 0 ] ;
@@ -55,11 +56,10 @@ export async function runCommand(commandMap: CommandMap,
5556
5657 const command = new Cmd ( context , logger ) ;
5758
58- let options = parseOptions ( yargsParser , args , command . options ) ;
59- options = mapArguments ( options , command . arguments ) ;
59+ args = await command . initializeRaw ( args ) ;
60+ let options = parseOptions ( args , command . options , command . arguments ) ;
6061 await command . initialize ( options ) ;
61- options = parseOptions ( yargsParser , args , command . options ) ;
62- options = mapArguments ( options , command . arguments ) ;
62+ options = parseOptions ( args , command . options , command . arguments ) ;
6363 if ( commandName === 'help' ) {
6464 options . commandMap = commandMap ;
6565 }
@@ -74,9 +74,13 @@ export async function runCommand(commandMap: CommandMap,
7474 }
7575}
7676
77- function parseOptions ( parser : Function ,
78- args : string [ ] ,
79- cmdOpts : Option [ ] ) : any {
77+ export function parseOptions < T = any > (
78+ args : string [ ] ,
79+ cmdOpts : Option [ ] ,
80+ commandArguments : string [ ] ,
81+ ) : T {
82+ const parser = yargsParser ;
83+
8084 const aliases = cmdOpts . concat ( )
8185 . filter ( o => o . aliases && o . aliases . length > 0 )
8286 . reduce ( ( aliases : any , opt : Option ) => {
@@ -131,23 +135,17 @@ function parseOptions(parser: Function,
131135 . filter ( key => key . indexOf ( '-' ) !== - 1 )
132136 . forEach ( key => delete parsedOptions [ key ] ) ;
133137
134- return parsedOptions ;
135- }
136-
137- // Map arguments to options.
138- function mapArguments ( options : any , args : string [ ] ) : any {
139- const optsWithMappedArgs = { ...options } ;
140- optsWithMappedArgs . _ . forEach ( ( value : string , index : number ) => {
138+ parsedOptions . _ . forEach ( ( value : string , index : number ) => {
141139 // Remove the starting "<" and trailing ">".
142- const arg = args [ index ] ;
140+ const arg = commandArguments [ index ] ;
143141 if ( arg ) {
144- optsWithMappedArgs [ arg ] = value ;
142+ parsedOptions [ arg ] = value ;
145143 }
146144 } ) ;
147145
148- delete optsWithMappedArgs . _ ;
146+ delete parsedOptions . _ ;
149147
150- return optsWithMappedArgs ;
148+ return parsedOptions ;
151149}
152150
153151// Find a command.
0 commit comments