UNPKG

7.76 kBTypeScriptView Raw
1import { Flags as Flags$1, TypeFlag } from 'type-flag';
2import { Options } from 'terminal-columns';
3
4declare type CommandOptions<Parameters = string[]> = {
5 /**
6 Name of the command used to invoke it. Also displayed in `--help` output.
7 */
8 name: string;
9 /**
10 Aliases for the command used to invoke it. Also displayed in `--help` output.
11 */
12 alias?: string | string[];
13 /**
14 Parameters accepted by the command. Parameters must be in the following formats:
15
16 - Required parameter: `<parameter name>`
17 - Optional parameter: `[parameter name]`
18 - Required spread parameter: `<parameter name...>`
19 - Optional spread parameter: `[parameter name...]`
20 */
21 parameters?: Parameters;
22 /**
23 Flags accepted by the command
24 */
25 flags?: Flags;
26 /**
27 Options to configure the help documentation. Pass in `false` to disable handling `--help, -h`.
28 */
29 help?: false | HelpOptions;
30};
31declare function command<Options extends CommandOptions<[...Parameters]>, Parameters extends string[]>(options: Readonly<Options> & CommandOptions<[...Parameters]>, callback?: CallbackFunction<ParseArgv<Options, Parameters>>): Command<Options, ParseArgv<Options, Parameters, Options['name']>>;
32declare type Command<Options extends CommandOptions = CommandOptions, ParsedType = any> = {
33 readonly options: Options;
34 readonly callback?: CallbackFunction<any>;
35 [parsedType]: ParsedType;
36};
37
38declare type FlagData = {
39 name: string;
40 flag: Flags[string];
41 flagFormatted: string;
42 aliasesEnabled: boolean;
43 aliasFormatted: string | undefined;
44};
45
46declare type TypeFunction = (value: any) => any;
47declare type HelpDocumentNodeOrString<Type extends PropertyKey> = string | HelpDocumentNode<Type>;
48declare class Renderers {
49 text(text: string): string;
50 bold(text: string): string;
51 indentText({ text, spaces }: {
52 text: string;
53 spaces: number;
54 }): string;
55 heading(text: string): string;
56 section({ title, body, indentBody, }: {
57 title?: string;
58 body?: string;
59 indentBody?: number;
60 }): string;
61 table({ tableData, tableOptions, tableBreakpoints, }: {
62 tableData: string[][];
63 tableOptions?: Options;
64 tableBreakpoints?: Record<string, Options>;
65 }): string;
66 flagParameter(typeFunction: TypeFunction | readonly [TypeFunction]): string;
67 flagOperator(_: FlagData): string;
68 flagName(flagData: FlagData): string;
69 flagDefault(value: any): string;
70 flagDescription({ flag }: FlagData): string;
71 render(nodes: (HelpDocumentNodeOrString<keyof this> | HelpDocumentNodeOrString<keyof this>[])): string;
72}
73
74declare const parsedType: unique symbol;
75declare type Flags = Flags$1<{
76 /**
77 Description to be used in help output
78
79 @example
80 ```
81 description: 'Unit of output (metric, imperial)',
82 ```
83 */
84 description?: string;
85 /**
86 Placeholder label to be used in help output
87
88 @example Required value
89 ```
90 placeholder: '<locale>'
91 ```
92 */
93 placeholder?: string;
94}>;
95declare type CallbackFunction<Parsed> = (parsed: {
96 [Key in keyof Parsed]: Parsed[Key];
97}) => void;
98declare type HasVersion<Options extends {
99 flags?: Flags;
100}> = (Options extends {
101 version: string;
102} ? Options['flags'] & {
103 version: BooleanConstructor;
104} : Options['flags']);
105declare type HasHelp<Options extends {
106 flags?: Flags;
107}> = (Options extends {
108 help: false;
109} ? Options['flags'] : Options['flags'] & {
110 help: BooleanConstructor;
111});
112declare type HasHelpOrVersion<Options> = HasVersion<Options> & HasHelp<Options>;
113declare type HelpDocumentNode<Types extends PropertyKey = keyof Renderers> = {
114 id?: string;
115 type: Types;
116 data: any;
117};
118declare type HelpOptions = {
119 /**
120 Version of the script displayed in `--help` output. Use to avoid enabling `--version` flag.
121 */
122 version?: string;
123 /**
124 Description of the script or command to display in `--help` output.
125 */
126 description?: string;
127 /**
128 Usage code examples to display in `--help` output.
129 */
130 usage?: false | string | string[];
131 /**
132 Example code snippets to display in `--help` output.
133 */
134 examples?: string | string[];
135 /**
136 Function to customize the help document before it is logged.
137 */
138 render?: (nodes: HelpDocumentNode<keyof Renderers>[], renderers: Renderers) => string;
139};
140declare type CliOptions<Commands = Command[], Parameters extends string[] = string[]> = {
141 /**
142 Name of the script displayed in `--help` output.
143 */
144 name?: string;
145 /**
146 Version of the script displayed in `--version` and `--help` outputs.
147 */
148 version?: string;
149 /**
150 Parameters accepted by the script. Parameters must be in the following formats:
151
152 - Required parameter: `<parameter name>`
153 - Optional parameter: `[parameter name]`
154 - Required spread parameter: `<parameter name...>`
155 - Optional spread parameter: `[parameter name...]`
156 */
157 parameters?: Parameters;
158 /**
159 Commands to register to the script.
160 */
161 commands?: Commands;
162 /**
163 Flags accepted by the script
164 */
165 flags?: Flags;
166 /**
167 Options to configure the help documentation. Pass in `false` to disable handling `--help, -h`.
168 */
169 help?: false | HelpOptions;
170};
171declare type kebabToCamel<Word extends string> = (Word extends `${infer Prefix}-${infer Suffix}` | `${infer Prefix} ${infer Suffix}` ? `${Prefix}${Capitalize<kebabToCamel<Suffix>>}` : Word);
172declare type StripBrackets<Parameter extends string> = (Parameter extends `<${infer ParameterName}>` | `[${infer ParameterName}]` ? (ParameterName extends `${infer SpreadName}...` ? SpreadName : ParameterName) : never);
173declare type ParameterType<Parameter extends string> = (Parameter extends `<${infer _ParameterName}...>` | `[${infer _ParameterName}...]` ? string[] : Parameter extends `<${infer _ParameterName}>` ? string : Parameter extends `[${infer _ParameterName}]` ? string | undefined : never);
174declare type WithCommand<Options extends {
175 flags?: Flags;
176}, Command extends string | undefined = undefined> = {
177 command: Command;
178} & Options;
179declare type TypeFlagWrapper<Options extends {
180 flags?: Flags;
181}, Parameters extends string[]> = TypeFlag<HasHelpOrVersion<Options>> & {
182 _: {
183 [Parameter in Parameters[number] as kebabToCamel<StripBrackets<Parameter>>]: ParameterType<Parameter>;
184 };
185 showHelp: (options?: HelpOptions) => void;
186 showVersion: () => void;
187};
188declare type ParseArgv<Options extends {
189 flags?: Flags;
190}, Parameters extends string[], Command extends string | undefined = ''> = (Command extends '' ? TypeFlagWrapper<Options, Parameters> : WithCommand<TypeFlagWrapper<Options, Parameters>, Command>);
191
192declare function cli<Options extends CliOptions<undefined, [...Parameters]>, Parameters extends string[]>(options: Options & CliOptions<undefined, [...Parameters]>, callback?: CallbackFunction<ParseArgv<Options, Parameters>>, argv?: string[]): {
193 [Key in keyof ParseArgv<Options, Parameters, undefined>]: ParseArgv<Options, Parameters, undefined>[Key];
194};
195declare function cli<Options extends CliOptions<[...Commands], [...Parameters]>, Commands extends Command[], Parameters extends string[]>(options: Options & CliOptions<[...Commands], [...Parameters]>, callback?: CallbackFunction<ParseArgv<Options, Parameters>>, argv?: string[]): ({
196 [Key in keyof ParseArgv<Options, Parameters, undefined>]: ParseArgv<Options, Parameters, undefined>[Key];
197} | {
198 [KeyA in keyof Commands]: (Commands[KeyA] extends Command ? ({
199 [KeyB in keyof Commands[KeyA][typeof parsedType]]: Commands[KeyA][typeof parsedType][KeyB];
200 }) : never);
201}[number]);
202
203export { cli, command };