UNPKG

@itsmworkbench/cli

Version:

How to do a cli

61 lines (60 loc) 3.74 kB
import { ErrorsAnd, NameAnd } from "@laoban/utils"; import { FileOps } from "@laoban/fileops"; import { CliConfigTC, CliTcFinder } from "./cliconfig"; import { Env } from "@itsmworkbench/utils"; export type ActionFn<Commander> = (commander: Commander, opts: NameAnd<string | boolean | string[]>, ...args: any[]) => void | Promise<void>; export interface Option { description?: string; default?: any; } export interface CommandDetails<Commander> { cmd: string; description: string; options: NameAnd<Option>; action: ActionFn<Commander>; } export type CommandFn<Commander, Context, Config> = (context: Context, config: Config) => CommandDetails<Commander>; export type ListOfCommandDetails<Commander, Context, Config> = (CommandDetails<Commander> | CommandFn<Commander, Context, Config>)[]; export interface SubCommandDetails<Commander, Context, Config> { cmd: string; description: string; commands: ListOfCommandDetails<Commander, Context, Config>; } export interface HasNameAndVersion { name: string; version: string; } export interface HasCurrentDirectory { currentDirectory: string; } export interface HasEnv { env: NameAnd<string | undefined>; } export interface CliContext extends HasNameAndVersion, HasCurrentDirectory, HasEnv { env: Env; args: string[]; fileOps: FileOps; } export declare function cliContext(name: string, version: string, fileOps: FileOps): CliContext; export type ContextConfigAndCommander<Commander, Context, Config, CleanConfig> = { context: Context; config: CleanConfig; configFileName?: string; cliConfigTc: CliConfigTC<Config, CleanConfig>; commander: Commander; }; export type CreateCommanderFn<Commander, Context, CleanConfig> = (context: Context, config: CleanConfig) => Commander; export type AddSubCommandFn<Commander, Context, Config, CleanConfig> = (cc: ContextConfigAndCommander<Commander, Context, Config, CleanConfig>, cmd: SubCommandDetails<Commander, Context, CleanConfig>) => ContextConfigAndCommander<Commander, Context, Config, CleanConfig>; export type AddCommandsFn<Commander, Context, Config, CleanConfig> = (commander: ContextConfigAndCommander<Commander, Context, Config, CleanConfig>, cmd: ListOfCommandDetails<Commander, Context, CleanConfig>) => ContextConfigAndCommander<Commander, Context, Config, CleanConfig>; export type ExecuteFn<Commander> = (commander: Commander, args: string[]) => Promise<Commander>; export type CliTc<Commander, Context, Config, CleanConfig> = { createCommander: CreateCommanderFn<Commander, Context, CleanConfig>; /** This is used to add a subcommand to a commander. The sub command will have commands coming off it*/ addSubCommand: AddSubCommandFn<Commander, Context, Config, CleanConfig>; /** Adds an actual command that will do something */ addCommands: AddCommandsFn<Commander, Context, Config, CleanConfig>; /** Adds an actual command that will do something. This is for when the command needs to be dynamically created based on context or config */ execute: ExecuteFn<Commander>; }; export declare function cliTc<Commander, Context, Config, CleanConfig>(createCommander: CreateCommanderFn<Commander, Context, CleanConfig>, addSubCommand: AddSubCommandFn<Commander, Context, Config, CleanConfig>, addCommands: AddCommandsFn<Commander, Context, Config, CleanConfig>, execute: ExecuteFn<Commander>): CliTc<Commander, Context, Config, CleanConfig>; export declare function makeCli<Commander, Context extends CliContext, Config, CleanConfig>(context: Context, configTc: CliTcFinder<Config, CleanConfig>, cliTc: CliTc<Commander, Context, Config, CleanConfig>): Promise<ErrorsAnd<ContextConfigAndCommander<Commander, Context, Config, CleanConfig>>>;