@itsmworkbench/cli
Version:
How to do a cli
61 lines (60 loc) • 3.74 kB
TypeScript
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>>>;