@commander-js/extra-typings
Advanced tools
Comparing version 10.0.2 to 10.0.3
100
index.d.ts
@@ -32,19 +32,35 @@ | ||
type InferArgumentType<Value extends string, DefaultT, CoerceT> = | ||
type InferArgumentType<Value extends string, DefaultT, CoerceT, ChoicesT> = | ||
[CoerceT] extends [undefined] | ||
? InferVariadic<Value, string> | DefaultT | ||
: CoerceT | DefaultT; | ||
? InferVariadic<Value, [ChoicesT] extends [undefined] ? string : ChoicesT> | DefaultT | ||
: ([ChoicesT] extends [undefined] | ||
? CoerceT | DefaultT | ||
: CoerceT | DefaultT | ChoicesT | ||
) | ||
// Special handling for optional variadic argument, won't be undefined as implementation returns []. | ||
type InferArgumentOptionalType<Value extends string, DefaultT, CoerceT> = | ||
type InferArgumentOptionalType<Value extends string, DefaultT, CoerceT, ChoicesT> = | ||
Value extends `${string}...` | ||
? InferArgumentType<Value, [DefaultT] extends [undefined] ? never : DefaultT, CoerceT> | ||
: InferArgumentType<Value, DefaultT, CoerceT> | ||
type InferArgument<S extends string, DefaultT = undefined, CoerceT = undefined> = | ||
? InferArgumentType<Value, [DefaultT] extends [undefined] ? never : DefaultT, CoerceT, ChoicesT> | ||
: InferArgumentType<Value, DefaultT, CoerceT, ChoicesT> | ||
// ArgRequired comes from .argRequired()/.argOptional(), and ArgRequiredFromUsage is implied by usage <required>/[optional] | ||
type ResolveRequired<ArgRequired extends boolean|undefined, ArgRequiredFromUsage extends boolean> = | ||
ArgRequired extends undefined | ||
? ArgRequiredFromUsage | ||
: ArgRequired; | ||
type InferArgumentTypeResolvedRequired<Value extends string, DefaultT, CoerceT, ArgRequired extends boolean, ChoicesT> = | ||
ArgRequired extends true | ||
? InferArgumentType<Value, never, CoerceT, ChoicesT> | ||
: InferArgumentOptionalType<Value, DefaultT, CoerceT, ChoicesT>; | ||
// Resolve whether argument required, and strip []/<> from around value. | ||
type InferArgument<S extends string, DefaultT = undefined, CoerceT = undefined, ArgRequired extends boolean|undefined = undefined, ChoicesT = undefined> = | ||
S extends `<${infer Value}>` | ||
? InferArgumentType<Value, never, CoerceT> | ||
? InferArgumentTypeResolvedRequired<Value, DefaultT, CoerceT, ResolveRequired<ArgRequired, true>, ChoicesT> | ||
: S extends `[${infer Value}]` | ||
? InferArgumentOptionalType<Value, DefaultT, CoerceT> | ||
: InferArgumentType<S, never, CoerceT>; // the implementation fallback is treat as <required> | ||
? InferArgumentTypeResolvedRequired<Value, DefaultT, CoerceT, ResolveRequired<ArgRequired, false>, ChoicesT> | ||
: InferArgumentTypeResolvedRequired<S, DefaultT, CoerceT, ResolveRequired<ArgRequired, true>, ChoicesT>; // the implementation fallback is treat as <required> | ||
@@ -61,7 +77,2 @@ type InferArguments<S extends string> = | ||
type NullableCopy<T, U> = | ||
U extends undefined | ||
? T | undefined | ||
: T; | ||
type FlagsToFlag<Flags extends string> = | ||
@@ -143,19 +154,19 @@ Flags extends `${string},${infer LongFlag}` | ||
// Fill in appropriate PresetT value if undefined. | ||
type InferOptionTypes<Options, Flag extends string, Value extends string, ValueT, PresetT, DefaultT, CoerceT, Mandatory extends boolean> = | ||
type InferOptionTypes<Options, Flag extends string, Value extends string, ValueT, PresetT, DefaultT, CoerceT, Mandatory extends boolean, ChoicesT> = | ||
InferOptionsNegateCombo<Options, Flag, ConvertFlagToName<Flag>, | ||
CoerceValueType<CoerceT, InferVariadic<Value, ValueT>>, | ||
NegatePresetType<Flag, CoercePresetType<CoerceT, PresetT>>, | ||
NegateDefaultType<Flag, DefaultT>, | ||
IsAlwaysDefined<DefaultT, Mandatory>>; | ||
CoerceValueType<CoerceT, [ChoicesT] extends [undefined] ? InferVariadic<Value, ValueT> : InferVariadic<Value, ChoicesT>>, | ||
NegatePresetType<Flag, CoercePresetType<CoerceT, PresetT>>, | ||
NegateDefaultType<Flag, DefaultT>, | ||
IsAlwaysDefined<DefaultT, Mandatory>>; | ||
type InferOptionsFlag<Options, Flags extends string, Value extends string, ValueT, PresetT, DefaultT, CoerceT, Mandatory extends boolean> = | ||
InferOptionTypes<Options, FlagsToFlag<Trim<Flags>>, Trim<Value>, ValueT, PresetT, DefaultT, CoerceT, Mandatory>; | ||
type InferOptionsFlag<Options, Flags extends string, Value extends string, ValueT, PresetT, DefaultT, CoerceT, Mandatory extends boolean, ChoicesT> = | ||
InferOptionTypes<Options, FlagsToFlag<Trim<Flags>>, Trim<Value>, ValueT, PresetT, DefaultT, CoerceT, Mandatory, ChoicesT>; | ||
// Split up Usage into Flags and Value | ||
type InferOptions<Options, Usage extends string, DefaultT, CoerceT, Mandatory extends boolean, PresetT = undefined> = | ||
type InferOptions<Options, Usage extends string, DefaultT, CoerceT, Mandatory extends boolean, PresetT = undefined, ChoicesT = undefined> = | ||
Usage extends `${infer Flags} <${infer Value}>` | ||
? InferOptionsFlag<Options, Flags, Value, string, never, DefaultT, CoerceT, Mandatory> | ||
? InferOptionsFlag<Options, Flags, Value, string, never, DefaultT, CoerceT, Mandatory, ChoicesT> | ||
: Usage extends `${infer Flags} [${infer Value}]` | ||
? InferOptionsFlag<Options, Flags, Value, string, PresetT, DefaultT, CoerceT, Mandatory> | ||
: InferOptionsFlag<Options, Usage, '', never, PresetT, DefaultT, CoerceT, Mandatory>; | ||
? InferOptionsFlag<Options, Flags, Value, string, PresetT, DefaultT, CoerceT, Mandatory, ChoicesT> | ||
: InferOptionsFlag<Options, Usage, '', never, PresetT, DefaultT, CoerceT, Mandatory, ChoicesT>; | ||
@@ -203,3 +214,3 @@ export type CommandUnknownOpts = Command<unknown[], OptionValues>; | ||
export class Argument<Usage extends string = '', ArgType = InferArgument<Usage>> { | ||
export class Argument<Usage extends string = '', DefaultT = undefined, CoerceT = undefined, ArgRequired extends boolean|undefined = undefined, ChoicesT = undefined> { | ||
description: string; | ||
@@ -224,3 +235,3 @@ required: boolean; | ||
*/ | ||
default<T>(value: T, description?: string): Argument<string, NonNullable<ArgType> | T>; | ||
default<T>(value: T, description?: string): Argument<Usage, T, CoerceT, ArgRequired, ChoicesT>; | ||
@@ -230,3 +241,3 @@ /** | ||
*/ | ||
argParser<T>(fn: (value: string, previous: T) => T): Argument<string, NullableCopy<T, ArgType>>; | ||
argParser<T>(fn: (value: string, previous: T) => T): Argument<Usage, DefaultT, T, ArgRequired, undefined>; // setting ChoicesT to undefined because argParser overwrites choices | ||
@@ -236,3 +247,3 @@ /** | ||
*/ | ||
choices(values: readonly string[]): this; | ||
choices<T extends readonly string[]>(values: T): Argument<Usage, DefaultT, undefined, ArgRequired, T[number]>; // setting CoerceT to undefined because choices overrides argParser | ||
@@ -242,3 +253,3 @@ /** | ||
*/ | ||
argRequired(): Argument<string, NonNullable<ArgType>>; | ||
argRequired(): Argument<Usage, DefaultT, CoerceT, true, ChoicesT>; | ||
@@ -248,6 +259,6 @@ /** | ||
*/ | ||
argOptional(): Argument<string, ArgType | undefined>; | ||
argOptional(): Argument<Usage, DefaultT, CoerceT, false, ChoicesT>; | ||
} | ||
export class Option<Usage extends string = '', PresetT = undefined, DefaultT = undefined, CoerceT = undefined, Mandatory extends boolean = false> { | ||
export class Option<Usage extends string = '', PresetT = undefined, DefaultT = undefined, CoerceT = undefined, Mandatory extends boolean = false, ChoicesT = undefined> { | ||
flags: string; | ||
@@ -275,3 +286,3 @@ description: string; | ||
*/ | ||
default<T>(value: T, description?: string): Option<Usage, PresetT, T, CoerceT, Mandatory>; | ||
default<T>(value: T, description?: string): Option<Usage, PresetT, T, CoerceT, Mandatory, ChoicesT>; | ||
@@ -288,3 +299,3 @@ /** | ||
*/ | ||
preset<T>(arg: T): Option<Usage, T, DefaultT, CoerceT, Mandatory>; | ||
preset<T>(arg: T): Option<Usage, T, DefaultT, CoerceT, Mandatory, ChoicesT>; | ||
@@ -331,3 +342,3 @@ /** | ||
*/ | ||
argParser<T>(fn: (value: string, previous: T) => T): Option<Usage, PresetT, DefaultT, T, Mandatory>; | ||
argParser<T>(fn: (value: string, previous: T) => T): Option<Usage, PresetT, DefaultT, T, Mandatory, undefined>; // setting ChoicesT to undefined because argParser overrides choices | ||
@@ -337,3 +348,3 @@ /** | ||
*/ | ||
makeOptionMandatory<M extends boolean = true>(mandatory?: M): Option<Usage, PresetT, DefaultT, CoerceT, M>; | ||
makeOptionMandatory<M extends boolean = true>(mandatory?: M): Option<Usage, PresetT, DefaultT, CoerceT, M, ChoicesT>; | ||
@@ -348,3 +359,3 @@ /** | ||
*/ | ||
choices(values: readonly string[]): this; | ||
choices<T extends readonly string[]>(values: T): Option<Usage, PresetT, DefaultT, undefined, Mandatory, T[number]>; // setting CoerceT to undefined becuase choices overrides argParser | ||
@@ -568,3 +579,4 @@ /** | ||
*/ | ||
addArgument<S extends string, ArgType>(arg: Argument<S, ArgType>): Command<[...Args, ArgType]>; | ||
addArgument<Usage extends string, DefaultT, CoerceT, ArgRequired extends boolean|undefined, ChoicesT>( | ||
arg: Argument<Usage, DefaultT, CoerceT, ArgRequired, ChoicesT>): Command<[...Args, InferArgument<Usage, DefaultT, CoerceT, ArgRequired, ChoicesT>]>; | ||
@@ -682,3 +694,3 @@ | ||
*/ | ||
action(fn: (...args: [...Args, Opts, this]) => void): this; | ||
action(fn: (...args: [...Args, Opts, this]) => void | Promise<void>): this; | ||
@@ -767,4 +779,4 @@ /** | ||
*/ | ||
addOption<Usage extends string, PresetT, DefaultT, CoerceT, Mandatory extends boolean>( | ||
option: Option<Usage, PresetT, DefaultT, CoerceT, Mandatory>): Command<Args, InferOptions<Opts, Usage, DefaultT, CoerceT, Mandatory, PresetT>>; | ||
addOption<Usage extends string, PresetT, DefaultT, CoerceT, Mandatory extends boolean, ChoicesT>( | ||
option: Option<Usage, PresetT, DefaultT, CoerceT, Mandatory, ChoicesT>): Command<Args, InferOptions<Opts, Usage, DefaultT, CoerceT, Mandatory, PresetT, ChoicesT>>; | ||
@@ -1091,2 +1103,2 @@ /** | ||
export const program: Command; | ||
{ | ||
"name": "@commander-js/extra-typings", | ||
"version": "10.0.2", | ||
"version": "10.0.3", | ||
"description": "Infer strong typings for commander options and action handlers", | ||
@@ -5,0 +5,0 @@ "main": "index.js", |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
48030
988