@@ -176,23 +176,6 @@ function redactInputFromProperties(obj: Record<string, unknown>, input: string,
176176 * Thrown when underlying parameter parser throws an exception parsing some input.
177177 */
178178export class ArgumentParseError extends ArgumentScannerError {
179- static parseInput < T , P extends InputParser < T , CONTEXT > , CONTEXT extends CommandContext > (
180- externalFlagNameOrPlaceholder : ExternalFlagName | Placeholder ,
181- parser : P ,
182- input : string ,
183- displayValue : string ,
184- source : ArgumentInputSource ,
185- context : CONTEXT ,
186- ) : ReturnType < P > {
187- try {
188- return parser . call ( context , input ) as ReturnType < P > ;
189- } catch ( exc ) {
190- if ( typeof exc === "object" && exc ) {
191- redactInputFromProperties ( exc as Record < string , unknown > , input , displayValue ) ;
192- }
193- throw new ArgumentParseError ( externalFlagNameOrPlaceholder , displayValue , source , exc ) ;
194- }
195- }
196179 /**
197180 * External name of flag or placeholder for positional argument that was parsing this input.
198181 */
@@ -235,27 +218,28 @@ export class ArgumentParseError extends ArgumentScannerError {
235218 }
236219}
237220
221+ function parseInput < T , P extends InputParser < T , CONTEXT > , CONTEXT extends CommandContext > (
222+ externalFlagNameOrPlaceholder : ExternalFlagName | Placeholder ,
223+ parser : P ,
224+ input : string ,
225+ displayValue : string ,
226+ source : ArgumentInputSource ,
227+ context : CONTEXT ,
228+ ) : ReturnType < P > {
229+ try {
230+ return parser . call ( context , input ) as ReturnType < P > ;
231+ } catch ( exc ) {
232+ if ( typeof exc === "object" && exc ) {
233+ redactInputFromProperties ( exc as Record < string , unknown > , input , displayValue ) ;
234+ }
235+ throw new ArgumentParseError ( externalFlagNameOrPlaceholder , displayValue , source , exc ) ;
236+ }
237+ }
238+
238239/**
239240 * Thrown when input fails to match the given values for an enum flag.
240241 */
241242export class EnumValidationError extends ArgumentScannerError {
242- static assertInputIsEnumValue < T extends string > (
243- flag : BaseEnumFlagParameter < T > ,
244- input : string ,
245- displayValue : string ,
246- source : ArgumentInputSource ,
247- config : ScannerConfiguration ,
248- externalFlagName : ExternalFlagName ,
249- ) : asserts input is T {
250- if ( ! flag . values . includes ( input as T ) ) {
251- if ( input === displayValue ) {
252- const corrections = filterClosestAlternatives ( input , flag . values , config . distanceOptions ) ;
253- throw new EnumValidationError ( externalFlagName , input , source , flag . values , corrections ) ;
254- } else {
255- throw new EnumValidationError ( externalFlagName , displayValue , source , flag . values , [ ] ) ;
256- }
257- }
258- }
259243 /**
260244 * External name of flag that was parsing this input.
261245 */
@@ -308,6 +292,24 @@ export class EnumValidationError extends ArgumentScannerError {
308292 }
309293}
310294
295+ function assertInputIsEnumValue < T extends string > (
296+ flag : BaseEnumFlagParameter < T > ,
297+ input : string ,
298+ displayValue : string ,
299+ source : ArgumentInputSource ,
300+ config : ScannerConfiguration ,
301+ externalFlagName : ExternalFlagName ,
302+ ) : asserts input is T {
303+ if ( ! flag . values . includes ( input as T ) ) {
304+ if ( input === displayValue ) {
305+ const corrections = filterClosestAlternatives ( input , flag . values , config . distanceOptions ) ;
306+ throw new EnumValidationError ( externalFlagName , input , source , flag . values , corrections ) ;
307+ } else {
308+ throw new EnumValidationError ( externalFlagName , displayValue , source , flag . values , [ ] ) ;
309+ }
310+ }
311+ }
312+
311313/**
312314 * Thrown when flag was expecting input that was not provided.
313315 */
@@ -583,7 +585,7 @@ async function parseInputsForFlag<CONTEXT extends CommandContext>(
583585 }
584586 const displayValue = flag . default . redact ? "*" . repeat ( defaultValue . length ) : defaultValue ;
585587 if ( flag . kind === "boolean" ) {
586- return ArgumentParseError . parseInput (
588+ return parseInput (
587589 externalFlagName ,
588590 looseBooleanParser ,
589591 defaultValue ,
@@ -593,39 +595,18 @@ async function parseInputsForFlag<CONTEXT extends CommandContext>(
593595 ) ;
594596 }
595597 if ( flag . kind === "enum" ) {
596- EnumValidationError . assertInputIsEnumValue (
597- flag ,
598- defaultValue ,
599- displayValue ,
600- source ,
601- config ,
602- externalFlagName ,
603- ) ;
598+ assertInputIsEnumValue ( flag , defaultValue , displayValue , source , config , externalFlagName ) ;
604599 return defaultValue ;
605600 }
606- return ArgumentParseError . parseInput (
607- externalFlagName ,
608- flag . parse ,
609- defaultValue ,
610- displayValue ,
611- source ,
612- context ,
613- ) ;
601+ return parseInput ( externalFlagName , flag . parse , defaultValue , displayValue , source , context ) ;
614602 }
615603 if ( flag . kind === "boolean" ) {
616604 return flag . default ;
617605 }
618606 if ( flag . kind === "enum" ) {
619607 return flag . default ;
620608 }
621- return ArgumentParseError . parseInput (
622- externalFlagName ,
623- flag . parse ,
624- flag . default ,
625- flag . default ,
626- "default" ,
627- context ,
628- ) ;
609+ return parseInput ( externalFlagName , flag . parse , flag . default , flag . default , "default" , context ) ;
629610 }
630611 if ( flag . optional ) {
631612 return ;
@@ -639,32 +620,30 @@ async function parseInputsForFlag<CONTEXT extends CommandContext>(
639620 }
640621 if ( flag . kind === "counter" ) {
641622 return inputs . reduce ( ( total , input ) => {
642- const value = ArgumentParseError . parseInput ( externalFlagName , numberParser , input , input , "argv" , context ) ;
623+ const value = parseInput ( externalFlagName , numberParser , input , input , "argv" , context ) ;
643624 return total + value ;
644625 } , 0 ) ;
645626 }
646627 if ( "variadic" in flag && flag . variadic ) {
647628 if ( flag . kind === "enum" ) {
648629 for ( const input of inputs ) {
649- EnumValidationError . assertInputIsEnumValue ( flag , input , input , "argv" , config , externalFlagName ) ;
630+ assertInputIsEnumValue ( flag , input , input , "argv" , config , externalFlagName ) ;
650631 }
651632 return inputs ;
652633 }
653634 return Promise . all (
654- inputs . map ( ( input ) =>
655- ArgumentParseError . parseInput ( externalFlagName , flag . parse , input , input , "argv" , context ) ,
656- ) ,
635+ inputs . map ( ( input ) => parseInput ( externalFlagName , flag . parse , input , input , "argv" , context ) ) ,
657636 ) ;
658637 }
659638 const input = inputs [ 0 ] ;
660639 if ( flag . kind === "boolean" ) {
661- return ArgumentParseError . parseInput ( externalFlagName , looseBooleanParser , input , input , "argv" , context ) ;
640+ return parseInput ( externalFlagName , looseBooleanParser , input , input , "argv" , context ) ;
662641 }
663642 if ( flag . kind === "enum" ) {
664- EnumValidationError . assertInputIsEnumValue ( flag , input , input , "argv" , config , externalFlagName ) ;
643+ assertInputIsEnumValue ( flag , input , input , "argv" , config , externalFlagName ) ;
665644 return input ;
666645 }
667- return ArgumentParseError . parseInput ( externalFlagName , flag . parse , input , input , "argv" , context ) ;
646+ return parseInput ( externalFlagName , flag . parse , input , input , "argv" , context ) ;
668647}
669648
670649/**
@@ -895,14 +874,7 @@ export function buildArgumentScanner<FLAGS extends BaseFlags, ARGS extends BaseA
895874 positionalValues_p = allSettledOrElse (
896875 positionalInputs . map ( async ( input , i ) => {
897876 const placeholder = getPlaceholder ( positional . parameter , i + 1 ) ;
898- return ArgumentParseError . parseInput (
899- placeholder ,
900- positional . parameter . parse ,
901- input ,
902- input ,
903- "argv" ,
904- context ,
905- ) ;
877+ return parseInput ( placeholder , positional . parameter . parse , input , input , "argv" , context ) ;
906878 } ) ,
907879 ) as Promise < PromiseSettledOrElseResult < ARGS > > ;
908880 } else {
@@ -912,7 +884,7 @@ export function buildArgumentScanner<FLAGS extends BaseFlags, ARGS extends BaseA
912884 const input = positionalInputs [ i ] ;
913885 if ( typeof input !== "string" ) {
914886 if ( typeof param . default === "string" ) {
915- return ArgumentParseError . parseInput (
887+ return parseInput (
916888 placeholder ,
917889 param . parse ,
918890 param . default ,
@@ -926,7 +898,7 @@ export function buildArgumentScanner<FLAGS extends BaseFlags, ARGS extends BaseA
926898 }
927899 throw new UnsatisfiedPositionalError ( placeholder ) ;
928900 }
929- return ArgumentParseError . parseInput ( placeholder , param . parse , input , input , "argv" , context ) ;
901+ return parseInput ( placeholder , param . parse , input , input , "argv" , context ) ;
930902 } ) ,
931903 ) as Promise < PromiseSettledOrElseResult < ARGS > > ;
932904 }
0 commit comments