1717 * under the License.
1818 */
1919
20- import { relative } from 'path' ;
21-
22- import dedent from 'dedent' ;
2320import getopts from 'getopts' ;
2421
25- import { Options } from './run' ;
22+ import { RunOptions } from './run' ;
2623
2724export interface Flags {
2825 verbose : boolean ;
@@ -36,23 +33,52 @@ export interface Flags {
3633 [ key : string ] : undefined | boolean | string | string [ ] ;
3734}
3835
39- export function getFlags ( argv : string [ ] , options : Options ) : Flags {
36+ export interface FlagOptions {
37+ allowUnexpected ?: boolean ;
38+ guessTypesForUnexpectedFlags ?: boolean ;
39+ help ?: string ;
40+ alias ?: { [ key : string ] : string | string [ ] } ;
41+ boolean ?: string [ ] ;
42+ string ?: string [ ] ;
43+ default ?: { [ key : string ] : any } ;
44+ }
45+
46+ export function mergeFlagOptions ( global : FlagOptions = { } , local : FlagOptions = { } ) : FlagOptions {
47+ return {
48+ alias : {
49+ ...global . alias ,
50+ ...local . alias ,
51+ } ,
52+ boolean : [ ...( global . boolean || [ ] ) , ...( local . boolean || [ ] ) ] ,
53+ string : [ ...( global . string || [ ] ) , ...( local . string || [ ] ) ] ,
54+ default : {
55+ ...global . alias ,
56+ ...local . alias ,
57+ } ,
58+
59+ help : local . help ,
60+
61+ allowUnexpected : ! ! ( global . allowUnexpected || local . allowUnexpected ) ,
62+ guessTypesForUnexpectedFlags : ! ! ( global . allowUnexpected || local . allowUnexpected ) ,
63+ } ;
64+ }
65+
66+ export function getFlags ( argv : string [ ] , flagOptions : RunOptions [ 'flags' ] = { } ) : Flags {
4067 const unexpectedNames = new Set < string > ( ) ;
41- const flagOpts = options . flags || { } ;
4268
4369 const { verbose, quiet, silent, debug, help, _, ...others } = getopts ( argv , {
44- string : flagOpts . string ,
45- boolean : [ ...( flagOpts . boolean || [ ] ) , 'verbose' , 'quiet' , 'silent' , 'debug' , 'help' ] ,
70+ string : flagOptions . string ,
71+ boolean : [ ...( flagOptions . boolean || [ ] ) , 'verbose' , 'quiet' , 'silent' , 'debug' , 'help' ] ,
4672 alias : {
47- ...( flagOpts . alias || { } ) ,
73+ ...flagOptions . alias ,
4874 v : 'verbose' ,
4975 } ,
50- default : flagOpts . default ,
76+ default : flagOptions . default ,
5177 unknown : ( name : string ) => {
5278 unexpectedNames . add ( name ) ;
53- return flagOpts . guessTypesForUnexpectedFlags ;
79+ return ! ! flagOptions . guessTypesForUnexpectedFlags ;
5480 } ,
55- } as any ) ;
81+ } ) ;
5682
5783 const unexpected : string [ ] = [ ] ;
5884 for ( const unexpectedName of unexpectedNames ) {
@@ -119,32 +145,3 @@ export function getFlags(argv: string[], options: Options): Flags {
119145 ...others ,
120146 } ;
121147}
122-
123- export function getHelp ( options : Options ) {
124- const usage = options . usage || `node ${ relative ( process . cwd ( ) , process . argv [ 1 ] ) } ` ;
125-
126- const optionHelp = (
127- dedent ( options ?. flags ?. help || '' ) +
128- '\n' +
129- dedent `
130- --verbose, -v Log verbosely
131- --debug Log debug messages (less than verbose)
132- --quiet Only log errors
133- --silent Don't log anything
134- --help Show this message
135- `
136- )
137- . split ( '\n' )
138- . filter ( Boolean )
139- . join ( '\n ' ) ;
140-
141- return `
142- ${ usage }
143-
144- ${ dedent ( options . description || 'Runs a dev task' )
145- . split ( '\n' )
146- . join ( '\n ' ) }
147-
148- Options:
149- ${ optionHelp + '\n\n' } ` ;
150- }
0 commit comments