@@ -8,8 +8,7 @@ import { InternalCommand, InternalArgument, CoercedValue, InternalPositionalArgu
88import { Err , Ok , Result } from './internal/result'
99import { ParserOpts , StoredParserOpts , defaultParserOpts } from './opts'
1010import { PrefixTree } from './internal/prefix-tree'
11-
12- const flagValidationRegex = / - + (?: [ a - z ] + ) /
11+ import { getAliasDenotion , internaliseFlagString } from './internal/util'
1312
1413// What happened when we parsed
1514interface FoundCommand {
@@ -155,70 +154,55 @@ export class Args<TArgTypes extends DefaultArgTypes = DefaultArgTypes> {
155154 }
156155
157156 public arg < TArg extends CoercedValue , TLong extends string > (
158- [ longFlag , shortFlag ] : [ `--${TLong } `, `-${string } `? ] ,
157+ [ _longFlag , ... _aliases ] : [ `--${TLong } `, ... Array < `-${string } ` | `--${ string } ` > ] ,
159158 declaration : MinimalArgument < TArg >
160159 ) : Args < TArgTypes & {
161160 // Add the key to our object of known args
162161 [ key in TLong ] : TArg
163162 } > {
164- if ( ! longFlag . startsWith ( '--' ) ) {
165- throw new SchemaError ( `long flags must start with '--', got '${ longFlag } '` )
166- }
163+ const [ , longFlag ] = internaliseFlagString ( _longFlag )
164+ const aliases = _aliases . map ( a => {
165+ const [ type , value ] = internaliseFlagString ( a )
166+ return {
167+ type,
168+ value
169+ }
170+ } )
167171
168- if ( this . arguments . has ( longFlag . substring ( 2 ) ) ) {
169- throw new SchemaError ( `duplicate long flag '${ longFlag } '` )
172+ if ( this . arguments . has ( longFlag ) ) {
173+ throw new SchemaError ( `duplicate long flag '${ _longFlag } '` )
170174 }
171175
172- if ( ! flagValidationRegex . test ( longFlag ) ) {
173- throw new SchemaError ( `long flags must match '--abcdef...' got '${ longFlag } '` )
176+ for ( const alias of aliases ) {
177+ if ( this . arguments . has ( alias . value ) ) {
178+ throw new SchemaError ( `duplicate alias '${ getAliasDenotion ( alias ) } '` )
179+ }
180+
181+ this . arguments . insert ( alias . value , {
182+ type : 'flag' ,
183+ isLongFlag : true ,
184+ inner : declaration ,
185+ longFlag,
186+ aliases
187+ } )
174188 }
175189
176- this . arguments . insert ( longFlag . substring ( 2 ) , {
190+ this . arguments . insert ( longFlag , {
177191 type : 'flag' ,
178192 isLongFlag : true ,
179193 inner : declaration ,
180- longFlag : longFlag . substring ( 2 ) ,
181- shortFlag : shortFlag ?. substring ( 1 )
194+ longFlag,
195+ aliases
182196 } )
183197
184198 this . argumentsList . push ( {
185199 type : 'flag' ,
186200 isLongFlag : true ,
187201 inner : declaration ,
188- longFlag : longFlag . substring ( 2 ) ,
189- shortFlag : shortFlag ?. substring ( 1 )
202+ longFlag,
203+ aliases
190204 } )
191205
192- if ( shortFlag ) {
193- if ( ! shortFlag . startsWith ( '-' ) ) {
194- throw new SchemaError ( `short flags must start with '-', got '${ shortFlag } '` )
195- }
196-
197- if ( this . arguments . has ( shortFlag . substring ( 1 ) ) ) {
198- throw new SchemaError ( `duplicate short flag '${ shortFlag } '` )
199- }
200-
201- if ( ! flagValidationRegex . test ( shortFlag ) ) {
202- throw new SchemaError ( `short flags must match '-abcdef...' got '${ shortFlag } '` )
203- }
204-
205- this . arguments . insert ( shortFlag . substring ( 1 ) , {
206- type : 'flag' ,
207- inner : declaration ,
208- isLongFlag : false ,
209- longFlag : longFlag . substring ( 2 ) ,
210- shortFlag : shortFlag . substring ( 1 )
211- } )
212-
213- this . argumentsList . push ( {
214- type : 'flag' ,
215- inner : declaration ,
216- isLongFlag : false ,
217- longFlag : longFlag . substring ( 2 ) ,
218- shortFlag : shortFlag . substring ( 1 )
219- } )
220- }
221-
222206 // @ts -expect-error can't infer this because of weird subtyping, not a priority
223207 return this
224208 }
0 commit comments