mixcli 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +410 -0
- package/dist/index.d.ts +410 -0
- package/dist/index.js +1141 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +1100 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +40 -0
- package/readme.md +15 -0
package/dist/index.d.mts
ADDED
@@ -0,0 +1,410 @@
|
|
1
|
+
import { LiteEvent } from 'flex-tools/events/liteEvent';
|
2
|
+
import { Option, Command } from 'commander';
|
3
|
+
import { PromptObject } from 'prompts';
|
4
|
+
import * as flex_tools from 'flex-tools';
|
5
|
+
|
6
|
+
type PromptType = "text" | "password" | "invisible" | "number" | "confirm" | "list" | "toggle" | "select" | "multiselect" | "autocomplete" | "date" | "autocompleteMultiselect";
|
7
|
+
type PromptParam = 'auto' | boolean | PromptType | PromptObject;
|
8
|
+
type InputPromptParam = PromptParam | ((value: any) => PromptParam) | boolean;
|
9
|
+
type PromptParamDefaultValue = string | boolean | string[];
|
10
|
+
interface PromptChoice {
|
11
|
+
title: string;
|
12
|
+
value?: any;
|
13
|
+
disabled?: boolean | undefined;
|
14
|
+
selected?: boolean | undefined;
|
15
|
+
description?: string | undefined;
|
16
|
+
}
|
17
|
+
interface IPromptableOptions {
|
18
|
+
required?: boolean;
|
19
|
+
optional?: boolean;
|
20
|
+
default?: PromptParamDefaultValue;
|
21
|
+
choices?: (PromptChoice | any)[];
|
22
|
+
prompt?: InputPromptParam;
|
23
|
+
validate?: (value: any) => boolean;
|
24
|
+
}
|
25
|
+
interface IPromptable {
|
26
|
+
name(): string;
|
27
|
+
description?: string;
|
28
|
+
flags: string;
|
29
|
+
promptChoices?: PromptChoice[];
|
30
|
+
argChoices?: string[];
|
31
|
+
variadic?: boolean;
|
32
|
+
defaultValue?: PromptParamDefaultValue;
|
33
|
+
input?: any;
|
34
|
+
required?: boolean;
|
35
|
+
validate?: (value: any) => boolean;
|
36
|
+
getPrompt(inputValue?: any): PromptObject | undefined;
|
37
|
+
}
|
38
|
+
/**
|
39
|
+
* 负责生成prompt对象
|
40
|
+
*
|
41
|
+
*/
|
42
|
+
declare class PromptManager {
|
43
|
+
args: InputPromptParam;
|
44
|
+
private _promptable;
|
45
|
+
constructor(promptable: IPromptable, promptArgs?: InputPromptParam);
|
46
|
+
/**
|
47
|
+
* 返回输入的是否是有效的prompt类型
|
48
|
+
* @param type
|
49
|
+
* @returns
|
50
|
+
*/
|
51
|
+
isValid(type: any): boolean;
|
52
|
+
/**
|
53
|
+
* 推断是否需要提示
|
54
|
+
*
|
55
|
+
*/
|
56
|
+
isNeed(input: any, defaultValue?: any): boolean;
|
57
|
+
/**
|
58
|
+
* 返回生成prompt对象
|
59
|
+
*
|
60
|
+
* @param inputValue 从命令行输入的值
|
61
|
+
*/
|
62
|
+
get(inputValue?: any): PromptObject<string> | undefined;
|
63
|
+
/**
|
64
|
+
* 推断prompt类型
|
65
|
+
*
|
66
|
+
* @param inputValue 从命令行输入的值
|
67
|
+
*/
|
68
|
+
infer(inputValue?: any): string;
|
69
|
+
}
|
70
|
+
|
71
|
+
interface MixedOptionParams extends IPromptableOptions {
|
72
|
+
hidden?: boolean;
|
73
|
+
defaultDescription?: string;
|
74
|
+
conflicts?: string | string[];
|
75
|
+
env?: string;
|
76
|
+
argParser?: <T>(value: string, previous: T) => T;
|
77
|
+
hideHelp?: boolean;
|
78
|
+
mandatory?: boolean;
|
79
|
+
implies?: {
|
80
|
+
[key: string]: any;
|
81
|
+
};
|
82
|
+
}
|
83
|
+
declare class MixOption extends Option implements IPromptable {
|
84
|
+
prompt?: PromptManager;
|
85
|
+
promptChoices?: PromptChoice[];
|
86
|
+
private _validate?;
|
87
|
+
constructor(flags: string, description?: string | undefined, optsOrDefault?: any);
|
88
|
+
validate(value: any): boolean;
|
89
|
+
choices(values: (PromptChoice | string)[]): void;
|
90
|
+
private resetChoices;
|
91
|
+
addChoice(value: PromptChoice | string): void;
|
92
|
+
removeChoice(value: any): void;
|
93
|
+
clearChoice(): void;
|
94
|
+
/**
|
95
|
+
* 返回选项的提示对象
|
96
|
+
*
|
97
|
+
* @remarks
|
98
|
+
*
|
99
|
+
*
|
100
|
+
*
|
101
|
+
* @param inputValue
|
102
|
+
* @returns
|
103
|
+
*/
|
104
|
+
getPrompt(inputValue?: any): PromptObject | undefined;
|
105
|
+
}
|
106
|
+
|
107
|
+
type ICommandHookListener = ({ args, options, command, }: {
|
108
|
+
args: any[];
|
109
|
+
options: Record<string, any>;
|
110
|
+
command: MixCommand;
|
111
|
+
}) => void | Promise<void>;
|
112
|
+
type BeforeCommandHookListener = ({ args, options, command, }: {
|
113
|
+
args: any[];
|
114
|
+
options: Record<string, any>;
|
115
|
+
command: MixCommand;
|
116
|
+
}) => void | Promise<void>;
|
117
|
+
type AfterCommandHookListener = ({ value, args, options, command, }: {
|
118
|
+
value: any;
|
119
|
+
args: any[];
|
120
|
+
options: Record<string, any>;
|
121
|
+
command: MixCommand;
|
122
|
+
}) => void | Promise<void>;
|
123
|
+
interface ActionOptions {
|
124
|
+
id: string;
|
125
|
+
at: "replace" | "before" | "after" | "preappend" | "append" | number;
|
126
|
+
enhance: boolean;
|
127
|
+
}
|
128
|
+
interface ActionRegistry extends Omit<ActionOptions, "at"> {
|
129
|
+
fn: Function;
|
130
|
+
}
|
131
|
+
type OriginalAction = (...args: any[]) => void | Promise<void>;
|
132
|
+
type EnhanceAction = ({ args, options, value, command, }: {
|
133
|
+
args: any[];
|
134
|
+
options: Record<string, any>;
|
135
|
+
value: any;
|
136
|
+
command: MixCommand;
|
137
|
+
}) => void | Promise<any>;
|
138
|
+
declare const BREAK: unique symbol;
|
139
|
+
declare class MixCommand extends Command {
|
140
|
+
private _beforeHooks;
|
141
|
+
private _afterHooks;
|
142
|
+
private _customPrompts;
|
143
|
+
private _optionValues;
|
144
|
+
private _actions;
|
145
|
+
private _enable_prompts;
|
146
|
+
constructor(name?: string);
|
147
|
+
/**
|
148
|
+
* 是否是根命令
|
149
|
+
*/
|
150
|
+
get isRoot(): boolean;
|
151
|
+
get actions(): ActionRegistry[];
|
152
|
+
get beforeHooks(): [BeforeCommandHookListener, boolean][];
|
153
|
+
get afterHooks(): [AfterCommandHookListener, boolean][];
|
154
|
+
get fullname(): string;
|
155
|
+
/**
|
156
|
+
* 返回根命令
|
157
|
+
*/
|
158
|
+
root(): MixCommand;
|
159
|
+
action(fn: EnhanceAction, options: ActionOptions): this;
|
160
|
+
action(fn: OriginalAction): this;
|
161
|
+
/**
|
162
|
+
* 读取命令配置值,包括父命令提供的配置选项
|
163
|
+
* @param command
|
164
|
+
*/
|
165
|
+
private getOptionValues;
|
166
|
+
/**
|
167
|
+
* 本函数在运行时子类进行action生成该命令的action
|
168
|
+
*/
|
169
|
+
private getWrapperedAction;
|
170
|
+
/**
|
171
|
+
* 向上查找所有祖先命令
|
172
|
+
*/
|
173
|
+
private getAncestorCommands;
|
174
|
+
/***
|
175
|
+
* 将所有actions包装成一个链式调用的函数
|
176
|
+
*/
|
177
|
+
private wrapperChainActions;
|
178
|
+
/**
|
179
|
+
* 当传入--work-dirs时用来处理工作目录
|
180
|
+
*/
|
181
|
+
private wrapperWorkDirsAction;
|
182
|
+
getOption(name: string): MixOption;
|
183
|
+
/**
|
184
|
+
* 添加一个Before钩子
|
185
|
+
* @param listener
|
186
|
+
* @param scope =false时代表只在本命令执行,=true时代表在本命令及其子命令执行
|
187
|
+
* @returns
|
188
|
+
*/
|
189
|
+
before(listener: BeforeCommandHookListener, scope?: boolean): this;
|
190
|
+
private executeBeforeHooks;
|
191
|
+
/**
|
192
|
+
* 添加一个After钩子
|
193
|
+
* @param listener
|
194
|
+
* @param scope =false时代表只在本命令执行,=true时代表在本命令及其子命令执行
|
195
|
+
* @returns
|
196
|
+
*/
|
197
|
+
after(listener: AfterCommandHookListener, scope?: boolean): this;
|
198
|
+
private executeAfterHooks;
|
199
|
+
private preActionHook;
|
200
|
+
private isEnablePrompts;
|
201
|
+
/**
|
202
|
+
* 生成选项自动提示
|
203
|
+
*
|
204
|
+
* @remarks
|
205
|
+
* FlexCli要求所有未提供默认值的Option自动生成提示
|
206
|
+
*
|
207
|
+
* - 未提供默认值,并且是必选的参数Option
|
208
|
+
* - 指定了choices但未提供有效值的Option
|
209
|
+
*
|
210
|
+
*/
|
211
|
+
private generateAutoPrompts;
|
212
|
+
option(flags: string, description?: string | undefined, defaultValue?: any): this;
|
213
|
+
/**
|
214
|
+
* 添加提示
|
215
|
+
*
|
216
|
+
* @remarks
|
217
|
+
*
|
218
|
+
* 添加一些自定义提示
|
219
|
+
*
|
220
|
+
*
|
221
|
+
* @param questions
|
222
|
+
* @param show 是否显示提示信息,auto表示只有在用户没有提供option的值时才显示提示信息,always表示总是显示提示信息,never表示不显示提示信息
|
223
|
+
* @returns
|
224
|
+
*/
|
225
|
+
prompt(questions: PromptObject | PromptObject[]): this;
|
226
|
+
/**
|
227
|
+
*
|
228
|
+
* 选择命令并执行
|
229
|
+
*
|
230
|
+
* @remorks
|
231
|
+
*
|
232
|
+
* 当命令具有多个子命令时,并且没有提供默认子命令时,提示用户选择一个子命令
|
233
|
+
*
|
234
|
+
*/
|
235
|
+
selectCommands(): Promise<void>;
|
236
|
+
/**
|
237
|
+
* 禁用/启用所有提示
|
238
|
+
*/
|
239
|
+
disablePrompts(): this;
|
240
|
+
enablePrompts(): this;
|
241
|
+
}
|
242
|
+
|
243
|
+
interface MixCliOptions {
|
244
|
+
name: string;
|
245
|
+
title?: string | (string | boolean | number)[];
|
246
|
+
description?: string;
|
247
|
+
version?: string;
|
248
|
+
logo?: string;
|
249
|
+
before?: (thisCommand: Command, actionCommand: Command) => void;
|
250
|
+
after?: (thisCommand: Command, actionCommand: Command) => void;
|
251
|
+
include?: string | RegExp | string[] | RegExp[];
|
252
|
+
exclude?: string | RegExp | string[] | RegExp[];
|
253
|
+
cliDir?: string;
|
254
|
+
context?: Record<string, any>;
|
255
|
+
prompt?: 'auto' | boolean;
|
256
|
+
}
|
257
|
+
type MixCliCommand = (cli: MixCli) => MixCommand | MixCommand[] | void;
|
258
|
+
type MixCliEvents = "register";
|
259
|
+
declare class MixCli extends LiteEvent<any, MixCliEvents> {
|
260
|
+
options: Required<MixCliOptions>;
|
261
|
+
root: Command;
|
262
|
+
private findSignals;
|
263
|
+
constructor(options?: MixCliOptions);
|
264
|
+
get context(): Record<string, any>;
|
265
|
+
get name(): string;
|
266
|
+
/**
|
267
|
+
* 是否禁用了所有的交互提示
|
268
|
+
*/
|
269
|
+
get isDisabledPrompts(): any;
|
270
|
+
/**
|
271
|
+
* 扫描当前工程的依赖,加载匹配include的依赖下的命令
|
272
|
+
*/
|
273
|
+
private installCommands;
|
274
|
+
/**
|
275
|
+
* 创建根命令
|
276
|
+
*
|
277
|
+
*/
|
278
|
+
private createRootCommand;
|
279
|
+
/**
|
280
|
+
* 添加帮助选项
|
281
|
+
*
|
282
|
+
* @param text 帮助文本
|
283
|
+
* @param position 显示位置,可选值:before|after|beforeAll|afterAll
|
284
|
+
* @param fixIndent 是否自动修正缩进,如果为true,则会自动修正缩进,当显示多行时文本时,会自动修正缩进
|
285
|
+
*
|
286
|
+
*/
|
287
|
+
addHelp(text: string, { pos, alignIndent }: {
|
288
|
+
pos: 'before' | 'after' | 'beforeAll' | 'afterAll';
|
289
|
+
alignIndent?: boolean | number;
|
290
|
+
}): void;
|
291
|
+
/**
|
292
|
+
* 注册一个命令
|
293
|
+
* @param cmd
|
294
|
+
*/
|
295
|
+
register(cmd: MixCliCommand): void;
|
296
|
+
hasCommand(name: string): boolean;
|
297
|
+
/**
|
298
|
+
* 根据命令名称查找命令
|
299
|
+
*
|
300
|
+
* @remarks
|
301
|
+
*
|
302
|
+
* find("dev")
|
303
|
+
* find("dev.microservice") 支持多级命令
|
304
|
+
* find("abc",DevCommand) 允许指定从DevCommand下开始查找abc命令
|
305
|
+
*
|
306
|
+
* @param name
|
307
|
+
*/
|
308
|
+
get(name: string): MixCommand | undefined;
|
309
|
+
/**
|
310
|
+
* 查找一个命令
|
311
|
+
*
|
312
|
+
* 如果命令不存在,则等待命令注册后再返回
|
313
|
+
*
|
314
|
+
* 在多包场景下,如果命令在其他包中注册并且该包中的命令还没注册,则会等待命令注册后再返回
|
315
|
+
*
|
316
|
+
* @param name
|
317
|
+
* @returns
|
318
|
+
*/
|
319
|
+
find(name: string): Promise<MixCommand | undefined>;
|
320
|
+
/**
|
321
|
+
* 判断命令是否存在
|
322
|
+
*
|
323
|
+
* @param name
|
324
|
+
* @returns
|
325
|
+
*/
|
326
|
+
exists(name: string): boolean;
|
327
|
+
/**
|
328
|
+
* 运行命令行程序
|
329
|
+
*/
|
330
|
+
run(): void;
|
331
|
+
/**
|
332
|
+
* 创建一个命令
|
333
|
+
*
|
334
|
+
*
|
335
|
+
*/
|
336
|
+
create(): void;
|
337
|
+
}
|
338
|
+
|
339
|
+
/**
|
340
|
+
*
|
341
|
+
* 在控制台输出一个字符串
|
342
|
+
* 本方法会将字符串中的每一行空格去掉
|
343
|
+
*
|
344
|
+
* @remarks
|
345
|
+
*
|
346
|
+
* outputStr(String.raw`
|
347
|
+
* a
|
348
|
+
* b`)
|
349
|
+
*
|
350
|
+
* 会输出
|
351
|
+
* a
|
352
|
+
* b
|
353
|
+
*
|
354
|
+
* 此功能可以用于输出多行字符串时,保持代码的缩进格式,而不会影响输出结果
|
355
|
+
*
|
356
|
+
* @param str : 要输出的字符串
|
357
|
+
* @param vars : 用于替换字符串中的变量
|
358
|
+
*
|
359
|
+
*/
|
360
|
+
declare function outputStr(str: string, vars?: Record<string, any> | any[]): void;
|
361
|
+
/**
|
362
|
+
* 修正多行字符串的缩进
|
363
|
+
*
|
364
|
+
* @param text
|
365
|
+
* @param indent
|
366
|
+
* @returns
|
367
|
+
*/
|
368
|
+
declare function fixIndent(text: string, indent?: boolean | number): string;
|
369
|
+
/**
|
370
|
+
* 增加内置选项
|
371
|
+
* @param command
|
372
|
+
*/
|
373
|
+
declare function addBuiltInOptions(command: any): void;
|
374
|
+
/**
|
375
|
+
* 是否命令行中包含了--debug-cli选项
|
376
|
+
*/
|
377
|
+
declare function isDebug(): boolean;
|
378
|
+
declare function isEnablePrompts(): boolean;
|
379
|
+
/**
|
380
|
+
* 打印调试信息
|
381
|
+
* @param message
|
382
|
+
* @param args
|
383
|
+
*/
|
384
|
+
declare function outputDebug(message: string, ...args: any[]): void;
|
385
|
+
declare const fileExists: flex_tools.AsyncFunction;
|
386
|
+
declare const readFile: flex_tools.AsyncFunction;
|
387
|
+
declare const writeFile: flex_tools.AsyncFunction;
|
388
|
+
declare const mkdir: flex_tools.AsyncFunction;
|
389
|
+
/**
|
390
|
+
* 基于artTemplate模板生成文件
|
391
|
+
*
|
392
|
+
* @param {*} tmplFile
|
393
|
+
* @param {*} vars
|
394
|
+
*/
|
395
|
+
declare function createFileByTemplate(targetFile: string, tmplFile: string, vars?: Record<string, any>): Promise<string>;
|
396
|
+
/**
|
397
|
+
* 创建目录
|
398
|
+
*
|
399
|
+
*
|
400
|
+
*
|
401
|
+
* @param {String[]} dirs 要创建的目录列表,类型为字符串数组
|
402
|
+
* @param callback 创建目录过程中的回调函数,类型为异步函数,接收一个参数 dir,表示当前正在创建的目录
|
403
|
+
* @returns 该函数返回一个 Promise 对象,表示创建目录的操作是否完成
|
404
|
+
*/
|
405
|
+
declare function mkDirs(dirs: string[], { callback, base }: {
|
406
|
+
callback?: Function;
|
407
|
+
base?: string;
|
408
|
+
}): Promise<void>;
|
409
|
+
|
410
|
+
export { ActionOptions, ActionRegistry, AfterCommandHookListener, BREAK, BeforeCommandHookListener, EnhanceAction, ICommandHookListener, MixCli, MixCliCommand, MixCliEvents, MixCliOptions, MixCommand, MixOption, MixedOptionParams, OriginalAction, addBuiltInOptions, createFileByTemplate, fileExists, fixIndent, isDebug, isEnablePrompts, mkDirs, mkdir, outputDebug, outputStr, readFile, writeFile };
|