import type { ParseFlagsContext } from "../flags/types.js"; import { DefaultValue, ErrorHandler, OptionValueHandler } from "./types.js"; import { BooleanType } from "./types/boolean.js"; import { FileType } from "./types/file.js"; import { NumberType } from "./types/number.js"; import { StringType } from "./types/string.js"; import type { HelpOptions } from "./help/_help_generator.js"; import type { ActionHandler, Argument, ArgumentValue, CommandResult, CompleteHandler, CompleteOptions, Completion, Description, EnvVar, EnvVarOptions, EnvVarValueHandler, Example, GlobalEnvVarOptions, GlobalOptionOptions, HelpHandler, MapTypes, Option, OptionOptions, TypeDef, TypeOptions, TypeOrTypeHandler, VersionHandler } from "./types.js"; import { IntegerType } from "./types/integer.js"; export declare class Command | void = void, TParentCommandTypes extends Record | void = TParentCommandGlobals extends number ? any : void, TCommandOptions extends Record | void = TParentCommandGlobals extends number ? any : void, TCommandArguments extends Array = TParentCommandGlobals extends number ? any : [], TCommandGlobals extends Record | void = TParentCommandGlobals extends number ? any : void, TCommandTypes extends Record | void = TParentCommandGlobals extends number ? any : { number: number; integer: number; string: string; boolean: boolean; file: string; }, TCommandGlobalTypes extends Record | void = TParentCommandGlobals extends number ? any : void, TParentCommand extends Command | undefined = TParentCommandGlobals extends number ? any : undefined> { private types; private rawArgs; private literalArgs; private _name; private _parent?; private _globalParent?; private ver?; private desc; private _usage?; private fn?; private options; private commands; private examples; private envVars; private aliases; private completions; private cmd; private argsDefinition?; private isExecutable; private throwOnError; private _allowEmpty; private _stopEarly; private defaultCommand?; private _useRawArgs; private args; private isHidden; private isGlobal; private hasDefaults; private _versionOptions?; private _helpOptions?; private _versionOption?; private _helpOption?; private _help?; private _shouldExit?; private _meta; private _groupName?; private _noGlobals; private errorHandler?; /** Disable version option. */ versionOption(enable: false): this; /** * Set global version option. * @param flags The flags of the version option. * @param desc The description of the version option. * @param opts Version option options. */ versionOption(flags: string, desc?: string, opts?: OptionOptions, TCommandArguments, TCommandGlobals, TParentCommandGlobals, TCommandTypes, TCommandGlobalTypes, TParentCommandTypes, TParentCommand> & { global: true; }): this; /** * Set version option. * @param flags The flags of the version option. * @param desc The description of the version option. * @param opts Version option options. */ versionOption(flags: string, desc?: string, opts?: OptionOptions): this; /** * Set version option. * @param flags The flags of the version option. * @param desc The description of the version option. * @param opts The action of the version option. */ versionOption(flags: string, desc?: string, opts?: ActionHandler): this; /** Disable help option. */ helpOption(enable: false): this; /** * Set global help option. * @param flags The flags of the help option. * @param desc The description of the help option. * @param opts Help option options. */ helpOption(flags: string, desc?: string, opts?: OptionOptions, TCommandArguments, TCommandGlobals, TParentCommandGlobals, TCommandTypes, TCommandGlobalTypes, TParentCommandTypes, TParentCommand> & { global: true; }): this; /** * Set help option. * @param flags The flags of the help option. * @param desc The description of the help option. * @param opts Help option options. */ helpOption(flags: string, desc?: string, opts?: OptionOptions): this; /** * Set help option. * @param flags The flags of the help option. * @param desc The description of the help option. * @param opts The action of the help option. */ helpOption(flags: string, desc?: string, opts?: ActionHandler): this; /** * Add new sub-command. * @param name Command definition. E.g: `my-command ` * @param cmd The new child command to register. * @param override Override existing child command. */ command) | void | undefined, TGlobalTypes | void | undefined, Record | void, Array, Record | void, Record | void, Record | void, Command | void, Array, Record | void, Record | void, Record | void, undefined>>, TGlobalOptions extends (TParentCommand extends Command ? TParentCommandGlobals : Merge), TGlobalTypes extends (TParentCommand extends Command ? TParentCommandTypes : Merge)>(name: string, cmd: TCommand, override?: boolean): ReturnType extends Command | void, Record | void, infer Options, infer Arguments, infer GlobalOptions, infer Types, infer GlobalTypes, undefined> ? Command> : never; /** * Add new sub-command. * @param name Command definition. E.g: `my-command ` * @param cmd The new child command to register. * @param override Override existing child command. */ command | void, Array, Record | void, Record | void, Record | void, OneOf | undefined>, TGlobalOptions extends (TParentCommand extends Command ? TParentCommandGlobals : Merge), TGlobalTypes extends (TParentCommand extends Command ? TParentCommandTypes : Merge)>(name: string, cmd: TCommand, override?: boolean): TCommand extends Command | void, Record | void, infer Options, infer Arguments, infer GlobalOptions, infer Types, infer GlobalTypes, OneOf | undefined> ? Command> : never; /** * Add new sub-command. * @param nameAndArguments Command definition. E.g: `my-command ` * @param desc The description of the new child command. * @param override Override existing child command. */ command ? TParentCommandTypes : Merge>>(nameAndArguments: TNameAndArguments, desc?: string, override?: boolean): TParentCommandGlobals extends number ? Command : Command ? TParentCommandGlobals : Merge, TParentCommand extends Command ? TParentCommandTypes : Merge, void, TArguments, void, void, void, OneOf>; /** * Add new command alias. * @param alias Tha name of the alias. */ alias(alias: string): this; /** Reset internal command reference to main command. */ reset(): OneOf; /** * Set internal command pointer to child command with given name. * @param name The name of the command to select. */ select | void = any, TArguments extends Array = any, TGlobalOptions extends Record | void = any>(name: string): Command; /***************************************************************************** **** SUB HANDLER ************************************************************ *****************************************************************************/ /** Set command name. */ name(name: string): this; /** * Set command version. * @param version Semantic version string string or method that returns the version string. */ version(version: string | VersionHandler, Partial, TCommandGlobals, TParentCommandGlobals, TCommandTypes, TCommandGlobalTypes, TParentCommandTypes, TParentCommand>): this; meta(name: string, value: string): this; getMeta(): Record; getMeta(name: string): string; /** * Set command help. * @param help Help string, method, or config for generator that returns the help string. */ help(help: string | HelpHandler, Partial, TCommandGlobals, TParentCommandGlobals> | HelpOptions): this; /** * Set the long command description. * @param description The command description. */ description(description: Description): this; /** * Set the command usage. Defaults to arguments. * @param usage The command usage. */ usage(usage: string): this; /** * Hide command from help, completions, etc. */ hidden(): this; /** Make command globally available. */ global(): this; /** Make command executable. */ executable(): this; /** * Set command arguments: * * [optionalArg: number] [...restArgs:string] */ arguments>>, TArgs extends string = string>(args: TArgs): Command; /** * Set command callback method. * @param fn Command action handler. */ action(fn: ActionHandler): this; /** * Don't throw an error if the command was called without arguments. * @param allowEmpty Enable/disable allow empty. */ allowEmpty(allowEmpty?: TAllowEmpty): false extends TAllowEmpty ? this : Command, TParentCommandTypes, Partial, TCommandArguments, TCommandGlobals, TCommandTypes, TCommandGlobalTypes, TParentCommand>; /** * Enable stop early. If enabled, all arguments starting from the first non * option argument will be passed as arguments with type string to the command * action handler. * * For example: * `command --debug-level warning server --port 80` * * Will result in: * - options: `{debugLevel: 'warning'}` * - args: `['server', '--port', '80']` * * @param stopEarly Enable/disable stop early. */ stopEarly(stopEarly?: boolean): this; /** * Disable parsing arguments. If enabled the raw arguments will be passed to * the action handler. This has no effect for parent or child commands. Only * for the command on which this method was called. * @param useRawArgs Enable/disable raw arguments. */ useRawArgs(useRawArgs?: boolean): Command, void, void, void, TParentCommand>; /** * Set default command. The default command is executed when the program * was called without any argument and if no action handler is registered. * @param name Name of the default command. */ default(name: string): this; globalType, TName extends string = string>(name: TName, handler: THandler, options?: Omit): Command>, TParentCommand>; /** * Register custom type. * @param name The name of the type. * @param handler The callback method to parse the type. * @param options Type options. */ type, TName extends string = string>(name: TName, handler: THandler, options?: TypeOptions): Command>, TCommandGlobalTypes, TParentCommand>; globalComplete(name: string, complete: CompleteHandler, options?: Omit): this; /** * Register command specific custom type. * @param name The name of the completion. * @param complete The callback method to complete the type. * @param options Complete options. */ complete(name: string, complete: CompleteHandler, Partial, TCommandGlobals, TParentCommandGlobals, TCommandTypes, TCommandGlobalTypes, TParentCommandTypes, any>, options: CompleteOptions & { global: boolean; }): this; complete(name: string, complete: CompleteHandler, options?: CompleteOptions): this; /** * Throw validation errors instead of calling `Deno.exit()` to handle * validation errors manually. * * A validation error is thrown when the command is wrongly used by the user. * For example: If the user passes some invalid options or arguments to the * command. * * This has no effect for parent commands. Only for the command on which this * method was called and all child commands. * * **Example:** * * ``` * try { * cmd.parse(); * } catch(error) { * if (error instanceof ValidationError) { * cmd.showHelp(); * Deno.exit(1); * } * throw error; * } * ``` * * @see ValidationError */ throwErrors(): this; error(handler: ErrorHandler): this; private getErrorHandler; /** * Same as `.throwErrors()` but also prevents calling `Deno.exit` after * printing help or version with the --help and --version option. */ noExit(): this; /** * Disable inheriting global commands, options and environment variables from * parent commands. */ noGlobals(): this; /** Check whether the command should throw errors or exit. */ protected shouldThrowErrors(): boolean; /** Check whether the command should exit after printing help or version. */ protected shouldExit(): boolean; globalOption>, undefined extends TConflicts ? TRequired : false, TDefaultValue>, TMappedGlobalOptions extends MapValue, TRequired extends OptionOptions["required"] = undefined, TCollect extends OptionOptions["collect"] = undefined, TConflicts extends OptionOptions["conflicts"] = undefined, TDefaultValue = undefined, TMappedValue = undefined>(flags: TFlags, desc: string, opts?: Omit, TCommandArguments, MergeOptions, TParentCommandGlobals, TCommandTypes, TCommandGlobalTypes, TParentCommandTypes, TParentCommand>, "value"> & { default?: DefaultValue; required?: TRequired; collect?: TCollect; value?: OptionValueHandler>, TMappedValue>; } | OptionValueHandler>, TMappedValue>): Command, TCommandTypes, TCommandGlobalTypes, TParentCommand>; /** * Enable grouping of options and set the name of the group. * All option which are added after calling the `.group()` method will be * grouped in the help output. If the `.group()` method can be use multiple * times to create more groups. * * @param name The name of the option group. */ group(name: string): this; /** * Add a new option. * @param flags Flags string e.g: -h, --help, --manual [optionalArg:number] [...restArgs:string] * @param desc Flag description. * @param opts Flag options or custom handler for processing flag value. */ option>, undefined extends TConflicts ? TRequired : false, TDefault>, TMappedGlobalOptions extends MapValue, TRequired extends OptionOptions["required"] = undefined, TCollect extends OptionOptions["collect"] = undefined, TConflicts extends OptionOptions["conflicts"] = undefined, TDefault = undefined, TMappedValue = undefined>(flags: TFlags, desc: string, opts: Omit, TCommandArguments, MergeOptions, TParentCommandGlobals, TCommandTypes, TCommandGlobalTypes, TParentCommandTypes, TParentCommand>, "value"> & { global: true; default?: DefaultValue; required?: TRequired; collect?: TCollect; value?: OptionValueHandler>, TMappedValue>; } | OptionValueHandler>, TMappedValue>): Command, TCommandTypes, TCommandGlobalTypes, TParentCommand>; option>, undefined extends TConflicts ? TRequired : false, TDefaultValue>, TMappedOptions extends MapValue, TRequired extends OptionOptions["required"] = undefined, TCollect extends OptionOptions["collect"] = undefined, TConflicts extends OptionOptions["conflicts"] = undefined, TDefaultValue = undefined, TMappedValue = undefined>(flags: TFlags, desc: string, opts?: Omit, TCommandArguments, TCommandGlobals, TParentCommandGlobals, TCommandTypes, TCommandGlobalTypes, TParentCommandTypes, TParentCommand>, "value"> & { default?: DefaultValue; required?: TRequired; collect?: TCollect; conflicts?: TConflicts; value?: OptionValueHandler>, TMappedValue>; } | OptionValueHandler>, TMappedValue>): Command, TCommandArguments, TCommandGlobals, TCommandTypes, TCommandGlobalTypes, TParentCommand>; /** * Add new command example. * @param name Name of the example. * @param description The content of the example. */ example(name: string, description: string): this; globalEnv>, TRequired>, TMappedGlobalEnvVars extends MapValue, TRequired extends EnvVarOptions["required"] = undefined, TPrefix extends EnvVarOptions["prefix"] = undefined, TMappedValue = undefined>(name: TNameAndValue, description: string, options?: Omit & { required?: TRequired; prefix?: TPrefix; value?: EnvVarValueHandler>, TMappedValue>; }): Command, TCommandTypes, TCommandGlobalTypes, TParentCommand>; /** * Add new environment variable. * @param name Name of the environment variable. * @param description The description of the environment variable. * @param options Environment variable options. */ env>, R>, MG extends MapValue, R extends EnvVarOptions["required"] = undefined, P extends EnvVarOptions["prefix"] = undefined, V = undefined>(name: N, description: string, options: Omit & { global: true; required?: R; prefix?: P; value?: EnvVarValueHandler>, V>; }): Command, TCommandTypes, TCommandGlobalTypes, TParentCommand>; env>, TRequired>, TMappedEnvVar extends MapValue, TRequired extends EnvVarOptions["required"] = undefined, TPrefix extends EnvVarOptions["prefix"] = undefined, TMappedValue = undefined>(name: TNameAndValue, description: string, options?: Omit & { required?: TRequired; prefix?: TPrefix; value?: EnvVarValueHandler>, TMappedValue>; }): Command, TCommandArguments, TCommandGlobals, TCommandTypes, TCommandGlobalTypes, TParentCommand>; /***************************************************************************** **** MAIN HANDLER *********************************************************** *****************************************************************************/ /** * Parse command line arguments and execute matched command. * @param args Command line args to parse. Ex: `cmd.parse( Deno.args )` */ parse(args?: string[]): Promise ? CommandResult, Array, Record, Record, Record, Record, Record, undefined> : CommandResult, MapTypes, MapTypes, MapTypes, TCommandTypes, TCommandGlobalTypes, TParentCommandTypes, TParentCommand>>; private parseCommand; private getSubCommand; private parseGlobalOptionsAndEnvVars; private parseOptionsAndEnvVars; /** Register default options like `--version` and `--help`. */ private registerDefaults; /** * Execute command. * @param options A map of options. * @param args Command arguments. */ protected execute(options: Record, ...args: Array): Promise; /** * Execute external sub-command. * @param args Raw command line arguments. */ protected executeExecutable(args: string[]): Promise; /** Parse raw command line arguments. */ protected parseOptions(ctx: ParseContext, options: Option[], { stopEarly, stopOnUnknown, dotted, }?: ParseOptionsOptions): void; /** Parse argument type. */ protected parseType(type: ArgumentValue): unknown; /** * Read and validate environment variables. * @param ctx Parse context. * @param envVars env vars defined by the command. * @param validate when true, throws an error if a required env var is missing. */ protected parseEnvVars(ctx: ParseContext, envVars: Array, validate?: boolean): Promise; protected findEnvVar(names: readonly string[]): Promise<{ name: string; value: string; } | undefined>; /** * Parse command-line arguments. * @param ctx Parse context. * @param options Parsed command line options. */ protected parseArguments(ctx: ParseContext, options: Record): TCommandArguments; private handleError; /** * Handle error. If `throwErrors` is enabled the error will be thrown, * otherwise a formatted error message will be printed and `Deno.exit(1)` * will be called. This will also trigger registered error handlers. * * @param error The error to handle. */ throw(error: Error): never; /***************************************************************************** **** GETTER ***************************************************************** *****************************************************************************/ /** Get command name. */ getName(): string; /** Get parent command. */ getParent(): TParentCommand; /** * Get parent command from global executed command. * Be sure, to call this method only inside an action handler. Unless this or any child command was executed, * this method returns always undefined. */ getGlobalParent(): Command | undefined; /** Get main command. */ getMainCommand(): Command; /** Get command name aliases. */ getAliases(): string[]; /** Get full command path. */ getPath(): string; /** Get arguments definition. E.g: */ getArgsDefinition(): string | undefined; /** * Get argument by name. * @param name Name of the argument. */ getArgument(name: string): Argument | undefined; /** Get arguments. */ getArguments(): Argument[]; /** Check if command has arguments. */ hasArguments(): boolean; /** Get command version. */ getVersion(): string | undefined; /** Get help handler method. */ private getVersionHandler; /** Get command description. */ getDescription(): string; getUsage(): string | undefined; /** Get short command description. This is the first line of the description. */ getShortDescription(): string; /** Get original command-line arguments. */ getRawArgs(): string[]; /** Get all arguments defined after the double dash. */ getLiteralArgs(): string[]; /** Output generated help without exiting. */ showVersion(): void; /** Returns command name, version and meta data. */ getLongVersion(): string; /** Outputs command name, version and meta data. */ showLongVersion(): void; /** Output generated help without exiting. */ showHelp(options?: HelpOptions): void; /** Get generated help. */ getHelp(options?: HelpOptions): string; /** Get help handler method. */ private getHelpHandler; private exit; /** Check if new version is available and add hint to version. */ checkVersion(): Promise; /***************************************************************************** **** Options GETTER ********************************************************* *****************************************************************************/ /** * Checks whether the command has options or not. * @param hidden Include hidden options. */ hasOptions(hidden?: boolean): boolean; /** * Get options. * @param hidden Include hidden options. */ getOptions(hidden?: boolean): Option[]; /** * Get base options. * @param hidden Include hidden options. */ getBaseOptions(hidden?: boolean): Option[]; /** * Get global options. * @param hidden Include hidden options. */ getGlobalOptions(hidden?: boolean): Option[]; /** * Checks whether the command has an option with given name or not. * @param name Name of the option. Must be in param-case. * @param hidden Include hidden options. */ hasOption(name: string, hidden?: boolean): boolean; /** * Get option by name. * @param name Name of the option. Must be in param-case. * @param hidden Include hidden options. */ getOption(name: string, hidden?: boolean): Option | undefined; /** * Get base option by name. * @param name Name of the option. Must be in param-case. * @param hidden Include hidden options. */ getBaseOption(name: string, hidden?: boolean): Option | undefined; /** * Get global option from parent commands by name. * @param name Name of the option. Must be in param-case. * @param hidden Include hidden options. */ getGlobalOption(name: string, hidden?: boolean): Option | undefined; /** * Remove option by name. * @param name Name of the option. Must be in param-case. */ removeOption(name: string): Option | undefined; /** * Checks whether the command has sub-commands or not. * @param hidden Include hidden commands. */ hasCommands(hidden?: boolean): boolean; /** * Get commands. * @param hidden Include hidden commands. */ getCommands(hidden?: boolean): Array>; /** * Get base commands. * @param hidden Include hidden commands. */ getBaseCommands(hidden?: boolean): Array>; /** * Get global commands. * @param hidden Include hidden commands. */ getGlobalCommands(hidden?: boolean): Array>; /** * Checks whether a child command exists by given name or alias. * @param name Name or alias of the command. * @param hidden Include hidden commands. */ hasCommand(name: string, hidden?: boolean): boolean; /** * Get command by name or alias. * @param name Name or alias of the command. * @param hidden Include hidden commands. */ getCommand>(name: string, hidden?: boolean): TCommand | undefined; /** * Get base command by name or alias. * @param name Name or alias of the command. * @param hidden Include hidden commands. */ getBaseCommand>(name: string, hidden?: boolean): TCommand | undefined; /** * Get global command by name or alias. * @param name Name or alias of the command. * @param hidden Include hidden commands. */ getGlobalCommand>(name: string, hidden?: boolean): TCommand | undefined; /** * Remove sub-command by name or alias. * @param name Name or alias of the command. */ removeCommand(name: string): Command | undefined; /** Get types. */ getTypes(): Array; /** Get base types. */ getBaseTypes(): Array; /** Get global types. */ getGlobalTypes(): Array; /** * Get type by name. * @param name Name of the type. */ getType(name: string): TypeDef | undefined; /** * Get base type by name. * @param name Name of the type. */ getBaseType(name: string): TypeDef | undefined; /** * Get global type by name. * @param name Name of the type. */ getGlobalType(name: string): TypeDef | undefined; /** Get completions. */ getCompletions(): Completion[]; /** Get base completions. */ getBaseCompletions(): Completion[]; /** Get global completions. */ getGlobalCompletions(): Completion[]; /** * Get completion by name. * @param name Name of the completion. */ getCompletion(name: string): Completion | undefined; /** * Get base completion by name. * @param name Name of the completion. */ getBaseCompletion(name: string): Completion | undefined; /** * Get global completions by name. * @param name Name of the completion. */ getGlobalCompletion(name: string): Completion | undefined; /** * Checks whether the command has environment variables or not. * @param hidden Include hidden environment variable. */ hasEnvVars(hidden?: boolean): boolean; /** * Get environment variables. * @param hidden Include hidden environment variable. */ getEnvVars(hidden?: boolean): EnvVar[]; /** * Get base environment variables. * @param hidden Include hidden environment variable. */ getBaseEnvVars(hidden?: boolean): EnvVar[]; /** * Get global environment variables. * @param hidden Include hidden environment variable. */ getGlobalEnvVars(hidden?: boolean): EnvVar[]; /** * Checks whether the command has an environment variable with given name or not. * @param name Name of the environment variable. * @param hidden Include hidden environment variable. */ hasEnvVar(name: string, hidden?: boolean): boolean; /** * Get environment variable by name. * @param name Name of the environment variable. * @param hidden Include hidden environment variable. */ getEnvVar(name: string, hidden?: boolean): EnvVar | undefined; /** * Get base environment variable by name. * @param name Name of the environment variable. * @param hidden Include hidden environment variable. */ getBaseEnvVar(name: string, hidden?: boolean): EnvVar | undefined; /** * Get global environment variable by name. * @param name Name of the environment variable. * @param hidden Include hidden environment variable. */ getGlobalEnvVar(name: string, hidden?: boolean): EnvVar | undefined; /** Checks whether the command has examples or not. */ hasExamples(): boolean; /** Get all examples. */ getExamples(): Example[]; /** Checks whether the command has an example with given name or not. */ hasExample(name: string): boolean; /** Get example with given name. */ getExample(name: string): Example | undefined; private getHelpOption; } type ActionOption = Option & { action: ActionHandler; }; interface ParseContext extends ParseFlagsContext> { action?: ActionOption; env: Record; } interface ParseOptionsOptions { stopEarly?: boolean; stopOnUnknown?: boolean; dotted?: boolean; } type TrimLeft = TValue extends `${TTrimValue}${infer TRest}` ? TRest : TValue; type TrimRight = TValue extends `${infer TRest}${TTrimValue}` ? TRest : TValue; type Lower = TValue extends Uppercase ? Lowercase : Uncapitalize; type CamelCase = TValue extends `${infer TPart}_${infer TRest}` ? `${Lower}${Capitalize>}` : TValue extends `${infer TPart}-${infer TRest}` ? `${Lower}${Capitalize>}` : Lower; type OneOf = TValue extends void ? TDefault : TValue; type Merge = TLeft extends void ? TRight : TRight extends void ? TLeft : TLeft & TRight; type MergeRecursive = TLeft extends void ? TRight : TRight extends void ? TLeft : TLeft & TRight; type OptionalOrRequiredValue = `[${TType}]` | `<${TType}>`; type RestValue = `...${string}` | `${string}...`; /** * Rest args with list type and completions. * * - `[...name:type[]:completion]` * - `<...name:type[]:completion>` * - `[name...:type[]:completion]` * - `` */ type RestArgsListTypeCompletion = OptionalOrRequiredValue<`${RestValue}:${TType}[]:${string}`>; /** * Rest args with list type. * * - `[...name:type[]]` * - `<...name:type[]>` * - `[name...:type[]]` * - `` */ type RestArgsListType = OptionalOrRequiredValue<`${RestValue}:${TType}[]`>; /** * Rest args with type and completions. * * - `[...name:type:completion]` * - `<...name:type:completion>` * - `[name...:type:completion]` * - `` */ type RestArgsTypeCompletion = OptionalOrRequiredValue<`${RestValue}:${TType}:${string}`>; /** * Rest args with type. * * - `[...name:type]` * - `<...name:type>` * - `[name...:type]` * - `` */ type RestArgsType = OptionalOrRequiredValue<`${RestValue}:${TType}`>; /** * Rest args. * - `[...name]` * - `<...name>` * - `[name...]` * - `` */ type RestArgs = OptionalOrRequiredValue<`${RestValue}`>; /** * Single arg with list type and completions. * * - `[name:type[]:completion]` * - `` */ type SingleArgListTypeCompletion = OptionalOrRequiredValue<`${string}:${TType}[]:${string}`>; /** * Single arg with list type. * * - `[name:type[]]` * - `` */ type SingleArgListType = OptionalOrRequiredValue<`${string}:${TType}[]`>; /** * Single arg with type and completion. * * - `[name:type:completion]` * - `` */ type SingleArgTypeCompletion = OptionalOrRequiredValue<`${string}:${TType}:${string}`>; /** * Single arg with type. * * - `[name:type]` * - `` */ type SingleArgType = OptionalOrRequiredValue<`${string}:${TType}`>; /** * Single arg. * * - `[name]` * - `` */ type SingleArg = OptionalOrRequiredValue<`${string}`>; type DefaultTypes = { number: NumberType; integer: IntegerType; string: StringType; boolean: BooleanType; file: FileType; }; type ArgumentType> = TArg extends RestArgsListTypeCompletion ? TTypes extends Record ? Array> : unknown : TArg extends RestArgsListType ? TTypes extends Record ? Array> : unknown : TArg extends RestArgsTypeCompletion ? TTypes extends Record ? Array : unknown : TArg extends RestArgsType ? TTypes extends Record ? Array : unknown : TArg extends RestArgs ? Array : TArg extends SingleArgListTypeCompletion ? TTypes extends Record ? Array : unknown : TArg extends SingleArgListType ? TTypes extends Record ? Array : unknown : TArg extends SingleArgTypeCompletion ? TTypes extends Record ? R : unknown : TArg extends SingleArgType ? TTypes extends Record ? R : unknown : TArg extends SingleArg ? string : unknown; type ArgumentTypes = TFlags extends `${string} ${string}` ? TypedArguments : ArgumentType; type GetArguments = TFlags extends `-${string}=${infer RestFlags}` ? GetArguments : TFlags extends `-${string} ${infer RestFlags}` ? GetArguments : TFlags; type OptionName = Name extends "*" ? string : CamelCase>; type IsRequired = TRequired extends true ? true : TDefault extends undefined ? false : true; type NegatableOption = TDefault extends undefined ? OptionName extends keyof TOptions ? { [Key in OptionName]?: false; } : { [Key in OptionName]: boolean; } : { [Key in OptionName]: NonNullable | false; }; type BooleanOption = TName extends `no-${infer Name}` ? NegatableOption : TName extends `${infer Name}.${infer Rest}` ? (TRequired extends true ? { [Key in OptionName]: BooleanOption; } : { [Key in OptionName]?: BooleanOption; }) : (TRequired extends true ? { [Key in OptionName]: true | TDefault; } : { [Key in OptionName]?: true | TDefault; }); type ValueOption = TName extends `${infer Name}.${infer RestName}` ? (TRequired extends true ? { [Key in OptionName]: ValueOption; } : { [Key in OptionName]?: ValueOption; }) : (TRequired extends true ? { [Key in OptionName]: GetArguments extends `[${string}]` ? NonNullable | true | ArgumentType, TTypes> : NonNullable | ArgumentType, TTypes>; } : { [Key in OptionName]?: GetArguments extends `[${string}]` ? NonNullable | true | ArgumentType, TTypes> : NonNullable | ArgumentType, TTypes>; }); type ValuesOption = TName extends `${infer Name}.${infer RestName}` ? (TRequired extends true ? { [Key in OptionName]: ValuesOption; } : { [Key in OptionName]?: ValuesOption; }) : (TRequired extends true ? { [Key in OptionName]: GetArguments extends `[${string}]` ? NonNullable | true | ArgumentTypes, TTypes> : NonNullable | ArgumentTypes, TTypes>; } : { [Key in OptionName]?: GetArguments extends `[${string}]` ? NonNullable | true | ArgumentTypes, TTypes> : NonNullable | ArgumentTypes, TTypes>; }); type MapValue = TMappedOptions extends undefined ? TCollect extends true ? { [Key in keyof TOptions]: TOptions[Key] extends (Record | undefined) ? MapValue : Array>; } : TOptions : { [Key in keyof TOptions]: TOptions[Key] extends (Record | undefined) ? MapValue : TMappedOptions; }; type GetOptionName = TFlags extends `${string}--${infer Name}=${string}` ? TrimRight : TFlags extends `${string}--${infer Name} ${string}` ? TrimRight : TFlags extends `${string}--${infer Name}` ? Name : TFlags extends `-${infer Name}=${string}` ? TrimRight : TFlags extends `-${infer Name} ${string}` ? TrimRight : TFlags extends `-${infer Name}` ? Name : unknown; type MergeOptions> = TName extends `no-${string}` ? Spread : TName extends `${string}.${string}` ? MergeRecursive : Merge; type TypedOption = number extends TTypes ? any : TFlags extends `${string}--${infer Name}=${infer TRestFlags}` ? ValuesOption, TDefault> : TFlags extends `${string}--${infer Name} ${infer TRestFlags}` ? ValuesOption, TDefault> : TFlags extends `${string}--${infer Name}` ? BooleanOption, TDefault> : TFlags extends `-${infer Name}=${infer TRestFlags}` ? ValuesOption, TDefault> : TFlags extends `-${infer Name} ${infer TRestFlags}` ? ValuesOption, TDefault> : TFlags extends `-${infer Name}` ? BooleanOption, TDefault> : Record; type TypedArguments = number extends TTypes ? any : TArgs extends `${infer TArg} ${infer TRestArgs}` ? TArg extends `[${string}]` ? [ArgumentType?, ...TypedArguments] : [ArgumentType, ...TypedArguments] : TArgs extends `${string}...${string}` ? [ ...ArgumentType extends Array ? TArgs extends `[${string}]` ? Array : [TValue, ...Array] : never ] : TArgs extends `[${string}]` ? [ArgumentType?] : [ArgumentType]; type TypedCommandArguments = number extends TTypes ? any : TNameAndArguments extends `${string} ${infer TFlags}` ? TypedArguments : []; type TypedEnv = number extends TTypes ? any : TNameAndValue extends `${infer Name}=${infer Rest}` ? ValueOption, Rest, TTypes, TRequired, TDefault> : TNameAndValue extends `${infer Name} ${infer Rest}` ? ValueOption, Rest, TTypes, TRequired, TDefault> : TNameAndValue extends `${infer Name}` ? BooleanOption, TOptions, TRequired, TDefault> : Record; type TypedType> = { [Name in TName]: THandler; }; type RequiredKeys = { [Key in keyof TRecord]-?: {} extends Pick ? never : Key; }[keyof TRecord]; type OptionalKeys = { [Key in keyof TRecord]-?: {} extends Pick ? Key : never; }[keyof TRecord]; type SpreadRequiredProperties = { [Key in TKeys]: Exclude | Exclude; }; type SpreadOptionalProperties = { [Key in TKeys]?: TTarget[Key] | TSource[Key]; }; /** Merge types of two objects. */ type Spread = TTarget extends void ? TSource : TSource extends void ? TTarget : Omit & Omit & SpreadRequiredProperties & keyof TTarget> & SpreadRequiredProperties & keyof TSource> & SpreadOptionalProperties & OptionalKeys>; type ValueOf = TValue extends Record ? ValueOf : TValue; export {};