index.d.cts 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298
  1. type OptionType = 'string' | 'boolean' | 'number' | 'positional';
  2. type OutputType = string | boolean | number | undefined;
  3. type BuilderConfig<TType extends OptionType = OptionType> = {
  4. name?: string | undefined;
  5. aliases: string[];
  6. type: TType;
  7. description?: string;
  8. default?: OutputType;
  9. isHidden?: boolean;
  10. isRequired?: boolean;
  11. isInt?: boolean;
  12. minVal?: number;
  13. maxVal?: number;
  14. enumVals?: [string, ...string[]];
  15. };
  16. type ProcessedBuilderConfig = {
  17. name: string;
  18. aliases: string[];
  19. type: OptionType;
  20. description?: string;
  21. default?: OutputType;
  22. isHidden?: boolean;
  23. isRequired?: boolean;
  24. isInt?: boolean;
  25. minVal?: number;
  26. maxVal?: number;
  27. enumVals?: [string, ...string[]];
  28. };
  29. type BuilderConfigLimited = BuilderConfig & {
  30. type: Exclude<OptionType, 'positional'>;
  31. };
  32. declare class OptionBuilderBase<TBuilderConfig extends BuilderConfig = BuilderConfig, TOutput extends OutputType = string, TOmit extends string = '', TEnums extends string | undefined = undefined> {
  33. _: {
  34. config: TBuilderConfig;
  35. /**
  36. * Type-level only field
  37. *
  38. * Do not attempt to access at a runtime
  39. */
  40. $output: TOutput;
  41. };
  42. private config;
  43. constructor(config?: TBuilderConfig);
  44. string<TName extends string>(name: TName): Omit<OptionBuilderBase<BuilderConfig<'string'>, string | undefined, TOmit | OptionType | 'min' | 'max' | 'int'>, TOmit | OptionType | 'min' | 'max' | 'int'>;
  45. string(): Omit<OptionBuilderBase<BuilderConfig<'string'>, string | undefined, TOmit | OptionType | 'min' | 'max' | 'int'>, TOmit | OptionType | 'min' | 'max' | 'int'>;
  46. number<TName extends string>(name: TName): Omit<OptionBuilderBase<BuilderConfig<'number'>, number | undefined, TOmit | OptionType | 'enum'>, TOmit | OptionType | 'enum'>;
  47. number(): Omit<OptionBuilderBase<BuilderConfig<'number'>, string | undefined, TOmit | OptionType | 'enum'>, TOmit | OptionType | 'enum'>;
  48. boolean<TName extends string>(name: TName): Omit<OptionBuilderBase<BuilderConfig<'boolean'>, boolean | undefined, TOmit | OptionType | 'min' | 'max' | 'enum' | 'int'>, TOmit | OptionType | 'min' | 'max' | 'enum' | 'int'>;
  49. boolean(): Omit<OptionBuilderBase<BuilderConfig<'boolean'>, boolean | undefined, TOmit | OptionType | 'min' | 'max' | 'enum' | 'int'>, TOmit | OptionType | 'min' | 'max' | 'enum' | 'int'>;
  50. positional<TName extends string>(displayName: TName): Omit<OptionBuilderBase<BuilderConfig<'positional'>, string | undefined, TOmit | OptionType | 'min' | 'max' | 'int' | 'alias'>, TOmit | OptionType | 'min' | 'max' | 'int' | 'alias'>;
  51. positional(): Omit<OptionBuilderBase<BuilderConfig<'positional'>, string | undefined, TOmit | OptionType | 'min' | 'max' | 'int' | 'alias'>, TOmit | OptionType | 'min' | 'max' | 'int' | 'alias'>;
  52. alias(...aliases: string[]): Omit<OptionBuilderBase<TBuilderConfig, TOutput, TOmit | 'alias'>, TOmit | 'alias'>;
  53. desc<TDescription extends string>(description: TDescription): Omit<OptionBuilderBase<TBuilderConfig, TOutput, TOmit | 'desc'>, TOmit | 'desc'>;
  54. hidden(): Omit<OptionBuilderBase<TBuilderConfig, TOutput, TOmit | 'hidden'>, TOmit | 'hidden'>;
  55. required(): Omit<OptionBuilderBase<TBuilderConfig, Exclude<TOutput, undefined>, TOmit | 'required' | 'default'>, TOmit | 'required' | 'default'>;
  56. default<TDefVal extends TEnums extends undefined ? Exclude<TOutput, undefined> : TEnums>(value: TDefVal): Omit<OptionBuilderBase<TBuilderConfig, Exclude<TOutput, undefined>, TOmit | 'enum' | 'required' | 'default', TEnums>, TOmit | 'enum' | 'required' | 'default'>;
  57. enum<TValues extends [string, ...string[]], TUnion extends TValues[number] = TValues[number]>(...values: TValues): Omit<OptionBuilderBase<TBuilderConfig, TUnion | (TOutput extends undefined ? undefined : never), TOmit | 'enum', TUnion>, TOmit | 'enum'>;
  58. min(value: number): Omit<OptionBuilderBase<TBuilderConfig, TOutput, TOmit | 'min'>, TOmit | 'min'>;
  59. max(value: number): Omit<OptionBuilderBase<TBuilderConfig, TOutput, TOmit | 'max'>, TOmit | 'max'>;
  60. int(): Omit<OptionBuilderBase<TBuilderConfig, TOutput, TOmit | 'int'>, TOmit | 'int'>;
  61. }
  62. type GenericBuilderInternalsFields = {
  63. /**
  64. * Type-level only field
  65. *
  66. * Do not attempt to access at a runtime
  67. */
  68. $output: OutputType;
  69. config: BuilderConfig;
  70. };
  71. type GenericBuilderInternals = {
  72. _: GenericBuilderInternalsFields;
  73. };
  74. type GenericBuilderInternalsFieldsLimited = {
  75. /**
  76. * Type-level only field
  77. *
  78. * Do not attempt to access at a runtime
  79. */
  80. $output: OutputType;
  81. config: BuilderConfigLimited;
  82. };
  83. type GenericBuilderInternalsLimited = {
  84. _: GenericBuilderInternalsFieldsLimited;
  85. };
  86. type ProcessedOptions<TOptionConfig extends Record<string, GenericBuilderInternals> = Record<string, GenericBuilderInternals>> = {
  87. [K in keyof TOptionConfig]: K extends string ? {
  88. config: ProcessedBuilderConfig;
  89. /**
  90. * Type-level only field
  91. *
  92. * Do not attempt to access at a runtime
  93. */
  94. $output: TOptionConfig[K]['_']['$output'];
  95. } : never;
  96. };
  97. type Simplify<T> = {
  98. [K in keyof T]: T[K];
  99. } & {};
  100. type TypeOf<TOptions extends Record<string, GenericBuilderInternals>> = Simplify<{
  101. [K in keyof TOptions]: TOptions[K]['_']['$output'];
  102. }>;
  103. declare function string<TName extends string>(name: TName): Omit<OptionBuilderBase<BuilderConfig<'string'>, string | undefined, OptionType | 'min' | 'max' | 'int'>, OptionType | 'min' | 'max' | 'int'>;
  104. declare function string(): Omit<OptionBuilderBase<BuilderConfig<'string'>, string | undefined, OptionType | 'min' | 'max' | 'int'>, OptionType | 'min' | 'max' | 'int'>;
  105. declare function number<TName extends string>(name: TName): Omit<OptionBuilderBase<BuilderConfig<'number'>, number | undefined, OptionType | 'enum'>, OptionType | 'enum'>;
  106. declare function number(): Omit<OptionBuilderBase<BuilderConfig<'number'>, number | undefined, OptionType | 'enum'>, OptionType | 'enum'>;
  107. declare function boolean<TName extends string>(name: TName): Omit<OptionBuilderBase<BuilderConfig<'boolean'>, boolean | undefined, OptionType | 'min' | 'max' | 'int' | 'enum'>, OptionType | 'min' | 'max' | 'int' | 'enum'>;
  108. declare function boolean(): Omit<OptionBuilderBase<BuilderConfig<'boolean'>, boolean | undefined, OptionType | 'min' | 'max' | 'int' | 'enum'>, OptionType | 'min' | 'max' | 'int' | 'enum'>;
  109. declare function positional<TName extends string>(displayName: TName): Omit<OptionBuilderBase<BuilderConfig<'positional'>, string | undefined, OptionType | 'min' | 'max' | 'int' | 'alias'>, OptionType | 'min' | 'max' | 'int' | 'alias'>;
  110. declare function positional(): Omit<OptionBuilderBase<BuilderConfig<'positional'>, string | undefined, OptionType | 'min' | 'max' | 'int' | 'alias'>, OptionType | 'min' | 'max' | 'int' | 'alias'>;
  111. type CommandHandler<TOpts extends Record<string, GenericBuilderInternals> | undefined = Record<string, GenericBuilderInternals> | undefined> = (options: TOpts extends Record<string, GenericBuilderInternals> ? TypeOf<TOpts> : undefined) => any;
  112. type CommandInfo = {
  113. name: string;
  114. aliases?: [string, ...string[]];
  115. desc?: string;
  116. shortDesc?: string;
  117. hidden?: boolean;
  118. options?: Record<string, ProcessedBuilderConfig>;
  119. metadata?: any;
  120. subcommands?: CommandsInfo;
  121. };
  122. type CommandsInfo = Record<string, CommandInfo>;
  123. type EventType = 'before' | 'after';
  124. type BroCliConfig = {
  125. name?: string;
  126. description?: string;
  127. argSource?: string[];
  128. help?: string | Function;
  129. version?: string | Function;
  130. omitKeysOfUndefinedOptions?: boolean;
  131. hook?: (event: EventType, command: Command) => any;
  132. theme?: EventHandler;
  133. };
  134. type GenericCommandHandler = (options?: Record<string, OutputType> | undefined) => any;
  135. type RawCommand<TOpts extends Record<string, GenericBuilderInternals> | undefined = Record<string, GenericBuilderInternals> | undefined, TOptsData = TOpts extends Record<string, GenericBuilderInternals> ? TypeOf<TOpts> : undefined, TTransformed = TOptsData extends undefined ? undefined : TOptsData> = {
  136. name?: string;
  137. aliases?: [string, ...string[]];
  138. desc?: string;
  139. shortDesc?: string;
  140. hidden?: boolean;
  141. options?: TOpts;
  142. help?: string | Function;
  143. transform?: (options: TOptsData) => TTransformed;
  144. handler?: (options: Awaited<TTransformed>) => any;
  145. subcommands?: [Command, ...Command[]];
  146. metadata?: any;
  147. };
  148. type AnyRawCommand<TOpts extends Record<string, GenericBuilderInternals> | undefined = Record<string, GenericBuilderInternals> | undefined> = {
  149. name?: string;
  150. aliases?: [string, ...string[]];
  151. desc?: string;
  152. shortDesc?: string;
  153. hidden?: boolean;
  154. options?: TOpts;
  155. help?: string | Function;
  156. transform?: GenericCommandHandler;
  157. handler?: GenericCommandHandler;
  158. subcommands?: [Command, ...Command[]];
  159. metadata?: any;
  160. };
  161. type Command<TOptsType = any, TTransformedType = any> = {
  162. name: string;
  163. aliases?: [string, ...string[]];
  164. desc?: string;
  165. shortDesc?: string;
  166. hidden?: boolean;
  167. options?: ProcessedOptions;
  168. help?: string | Function;
  169. transform?: GenericCommandHandler;
  170. handler?: GenericCommandHandler;
  171. subcommands?: [Command, ...Command[]];
  172. parent?: Command;
  173. metadata?: any;
  174. };
  175. type CommandCandidate = {
  176. data: string;
  177. originalIndex: number;
  178. };
  179. type InnerCommandParseRes = {
  180. command: Command | undefined;
  181. args: string[];
  182. };
  183. type TestResult<THandlerInput> = {
  184. type: 'handler';
  185. options: THandlerInput;
  186. } | {
  187. type: 'help' | 'version';
  188. } | {
  189. type: 'error';
  190. error: unknown;
  191. };
  192. declare const command: <TOpts extends Record<string, GenericBuilderInternals> | undefined, TOptsData = TOpts extends Record<string, GenericBuilderInternals> ? { [K_1 in keyof { [K in keyof TOpts]: TOpts[K]["_"]["$output"]; }]: { [K in keyof TOpts]: TOpts[K]["_"]["$output"]; }[K_1]; } : undefined, TTransformed = TOptsData>(command: RawCommand<TOpts, TOptsData, TTransformed>) => Command<TOptsData, Awaited<TTransformed>>;
  193. declare const getCommandNameWithParents: (command: Command) => string;
  194. /**
  195. * Runs CLI commands
  196. *
  197. * @param commands - command collection
  198. *
  199. * @param config - additional settings
  200. */
  201. declare const run: (commands: Command[], config?: BroCliConfig) => Promise<void>;
  202. declare const handler: <TOpts extends Record<string, GenericBuilderInternals>>(options: TOpts, handler: CommandHandler<TOpts>) => CommandHandler<TOpts>;
  203. declare const test: <TOpts, THandlerInput>(command: Command<TOpts, THandlerInput>, args: string) => Promise<TestResult<THandlerInput>>;
  204. declare const commandsInfo: (commands: Command[]) => CommandsInfo;
  205. type CommandHelpEvent = {
  206. type: 'command_help';
  207. name: string | undefined;
  208. description: string | undefined;
  209. command: Command;
  210. };
  211. type GlobalHelpEvent = {
  212. type: 'global_help';
  213. description: string | undefined;
  214. name: string | undefined;
  215. commands: Command[];
  216. };
  217. type MissingArgsEvent = {
  218. type: 'error';
  219. violation: 'missing_args_error';
  220. name: string | undefined;
  221. description: string | undefined;
  222. command: Command;
  223. missing: [string[], ...string[][]];
  224. };
  225. type UnrecognizedArgsEvent = {
  226. type: 'error';
  227. violation: 'unrecognized_args_error';
  228. name: string | undefined;
  229. description: string | undefined;
  230. command: Command;
  231. unrecognized: [string, ...string[]];
  232. };
  233. type UnknownCommandEvent = {
  234. type: 'error';
  235. violation: 'unknown_command_error';
  236. name: string | undefined;
  237. description: string | undefined;
  238. commands: Command[];
  239. offender: string;
  240. };
  241. type UnknownSubcommandEvent = {
  242. type: 'error';
  243. violation: 'unknown_subcommand_error';
  244. name: string | undefined;
  245. description: string | undefined;
  246. command: Command;
  247. offender: string;
  248. };
  249. type UnknownErrorEvent = {
  250. type: 'error';
  251. violation: 'unknown_error';
  252. name: string | undefined;
  253. description: string | undefined;
  254. error: unknown;
  255. };
  256. type VersionEvent = {
  257. type: 'version';
  258. name: string | undefined;
  259. description: string | undefined;
  260. };
  261. type GenericValidationViolation = 'above_max' | 'below_min' | 'expected_int' | 'invalid_boolean_syntax' | 'invalid_string_syntax' | 'invalid_number_syntax' | 'invalid_number_value' | 'enum_violation';
  262. type ValidationViolation = BroCliEvent extends infer Event ? Event extends {
  263. violation: string;
  264. } ? Event['violation'] : never : never;
  265. type ValidationErrorEvent = {
  266. type: 'error';
  267. violation: GenericValidationViolation;
  268. name: string | undefined;
  269. description: string | undefined;
  270. command: Command;
  271. option: ProcessedBuilderConfig;
  272. offender: {
  273. namePart?: string;
  274. dataPart?: string;
  275. };
  276. };
  277. type BroCliEvent = CommandHelpEvent | GlobalHelpEvent | MissingArgsEvent | UnrecognizedArgsEvent | UnknownCommandEvent | UnknownSubcommandEvent | ValidationErrorEvent | VersionEvent | UnknownErrorEvent;
  278. type BroCliEventType = BroCliEvent['type'];
  279. /**
  280. * Return `true` if your handler processes the event
  281. *
  282. * Return `false` to process event with a built-in handler
  283. */
  284. type EventHandler = (event: BroCliEvent) => boolean | Promise<boolean>;
  285. /**
  286. * Internal error class used to bypass runCli's logging without stack trace
  287. *
  288. * Used only for malformed commands and options
  289. */
  290. declare class BroCliError extends Error {
  291. event?: BroCliEvent | undefined;
  292. constructor(message: string | undefined, event?: BroCliEvent | undefined);
  293. }
  294. export { type AnyRawCommand, type BroCliConfig, BroCliError, type BroCliEvent, type BroCliEventType, type BuilderConfig, type BuilderConfigLimited, type Command, type CommandCandidate, type CommandHandler, type CommandHelpEvent, type CommandInfo, type CommandsInfo, type EventHandler, type EventType, type GenericBuilderInternals, type GenericBuilderInternalsFields, type GenericBuilderInternalsFieldsLimited, type GenericBuilderInternalsLimited, type GenericCommandHandler, type GenericValidationViolation, type GlobalHelpEvent, type InnerCommandParseRes, type MissingArgsEvent, OptionBuilderBase, type OptionType, type OutputType, type ProcessedBuilderConfig, type ProcessedOptions, type RawCommand, type Simplify, type TestResult, type TypeOf, type UnknownCommandEvent, type UnknownErrorEvent, type UnknownSubcommandEvent, type UnrecognizedArgsEvent, type ValidationErrorEvent, type ValidationViolation, type VersionEvent, boolean, command, commandsInfo, getCommandNameWithParents, handler, number, positional, run, string, test };