@mudah-cli/console 0.1.0 → 0.2.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/command.d.ts +9 -0
- package/dist/command.js +15 -0
- package/dist/command.js.map +1 -1
- package/dist/help.js +11 -1
- package/dist/help.js.map +1 -1
- package/dist/prompts.d.ts +32 -7
- package/dist/prompts.js +196 -23
- package/dist/prompts.js.map +1 -1
- package/dist/signature.d.ts +7 -1
- package/dist/signature.js +40 -7
- package/dist/signature.js.map +1 -1
- package/package.json +5 -5
package/dist/command.d.ts
CHANGED
|
@@ -38,12 +38,21 @@ export declare abstract class Command {
|
|
|
38
38
|
abstract handle(): Promise<number | void> | number | void;
|
|
39
39
|
/** A positional argument value (or its signature default). */
|
|
40
40
|
arg(name: string): string | undefined;
|
|
41
|
+
/**
|
|
42
|
+
* Values collected by a variadic argument (`{paths...}`) — empty when the
|
|
43
|
+
* argument doesn't exist or collected nothing.
|
|
44
|
+
*/
|
|
45
|
+
list(name: string): string[];
|
|
41
46
|
/** An option value: boolean for flags, string for `--opt=value`. */
|
|
42
47
|
option<T extends string | boolean>(name: string): T | undefined;
|
|
43
48
|
protected promptsInstance(): Prompts;
|
|
44
49
|
protected ask(question: string, defaultValue?: string): Promise<string>;
|
|
45
50
|
protected confirm(question: string, defaultValue?: boolean): Promise<boolean>;
|
|
46
51
|
protected select(question: string, choices: string[]): Promise<string>;
|
|
52
|
+
/** Pick any number of choices (arrow keys + space on a TTY, numbered menu otherwise). */
|
|
53
|
+
protected multiselect(question: string, choices: string[], defaultChecked?: number[]): Promise<string[]>;
|
|
54
|
+
/** Masked text entry — the value is never echoed to the terminal. */
|
|
55
|
+
protected password(question: string): Promise<string>;
|
|
47
56
|
/**
|
|
48
57
|
* Render a usage error with this command's usage line. Commands call this
|
|
49
58
|
* when their own validation fails.
|
package/dist/command.js
CHANGED
|
@@ -43,6 +43,13 @@ export class Command {
|
|
|
43
43
|
arg(name) {
|
|
44
44
|
return this.input.args[name];
|
|
45
45
|
}
|
|
46
|
+
/**
|
|
47
|
+
* Values collected by a variadic argument (`{paths...}`) — empty when the
|
|
48
|
+
* argument doesn't exist or collected nothing.
|
|
49
|
+
*/
|
|
50
|
+
list(name) {
|
|
51
|
+
return this.input.lists[name] ?? [];
|
|
52
|
+
}
|
|
46
53
|
/** An option value: boolean for flags, string for `--opt=value`. */
|
|
47
54
|
option(name) {
|
|
48
55
|
return this.input.options[name];
|
|
@@ -61,6 +68,14 @@ export class Command {
|
|
|
61
68
|
select(question, choices) {
|
|
62
69
|
return this.promptsInstance().select(question, choices);
|
|
63
70
|
}
|
|
71
|
+
/** Pick any number of choices (arrow keys + space on a TTY, numbered menu otherwise). */
|
|
72
|
+
multiselect(question, choices, defaultChecked) {
|
|
73
|
+
return this.promptsInstance().multiselect(question, choices, { defaultChecked });
|
|
74
|
+
}
|
|
75
|
+
/** Masked text entry — the value is never echoed to the terminal. */
|
|
76
|
+
password(question) {
|
|
77
|
+
return this.promptsInstance().password(question);
|
|
78
|
+
}
|
|
64
79
|
/**
|
|
65
80
|
* Render a usage error with this command's usage line. Commands call this
|
|
66
81
|
* when their own validation fails.
|
package/dist/command.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"command.js","sourceRoot":"","sources":["../src/command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAoB,MAAM,iBAAiB,CAAC;AAE/D,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,cAAc,EAA0C,MAAM,gBAAgB,CAAC;AAEpG;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,OAAgB,OAAO;IAC3B,iDAAiD;IACjD,SAAS,GAAG,EAAE,CAAC;IAEf,4CAA4C;IAC5C,WAAW,GAAG,EAAE,CAAC;IAEjB,mDAAmD;IACnD,GAAG,CAAe;IAClB,kCAAkC;IAClC,MAAM,CAAU;IAChB,0CAA0C;IAC1C,KAAK,CAAe;IAEZ,OAAO,GAAmB,IAAI,CAAC;IAE7B,eAAe;QACvB,OAAO,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACxC,CAAC;IAED,8CAA8C;IAC9C,QAAQ,CAAC,GAAgB,EAAE,MAAc,EAAE,KAAkB;QAC3D,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAKD,8DAA8D;IAC9D,GAAG,CAAC,IAAY;QACd,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC;IAED,oEAAoE;IACpE,MAAM,CAA6B,IAAY;QAC7C,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAkB,CAAC;IACnD,CAAC;IAES,eAAe;QACvB,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,IAAI,CAAC,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;QAChD,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAES,GAAG,CAAC,QAAgB,EAAE,YAAqB;QACnD,OAAO,IAAI,CAAC,eAAe,EAAE,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,YAAY,EAAE,CAAC,CAAC;IAChE,CAAC;IAES,OAAO,CAAC,QAAgB,EAAE,YAAsB;QACxD,OAAO,IAAI,CAAC,eAAe,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,YAAY,EAAE,CAAC,CAAC;IACpE,CAAC;IAES,MAAM,CAAC,QAAgB,EAAE,OAAiB;QAClD,OAAO,IAAI,CAAC,eAAe,EAAE,CAAC,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC1D,CAAC;IAED;;;OAGG;IACO,UAAU,CAAC,OAAe,EAAE,IAAa;QACjD,OAAO,IAAI,UAAU,CAAC,OAAO,EAAE;YAC7B,IAAI;YACJ,KAAK,EAAE,IAAI,CAAC,SAAS;SACtB,CAAC,CAAC;IACL,CAAC;CACF;AAED,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,kBAAkB,EAA0C,MAAM,gBAAgB,CAAC"}
|
|
1
|
+
{"version":3,"file":"command.js","sourceRoot":"","sources":["../src/command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAoB,MAAM,iBAAiB,CAAC;AAE/D,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,cAAc,EAA0C,MAAM,gBAAgB,CAAC;AAEpG;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,OAAgB,OAAO;IAC3B,iDAAiD;IACjD,SAAS,GAAG,EAAE,CAAC;IAEf,4CAA4C;IAC5C,WAAW,GAAG,EAAE,CAAC;IAEjB,mDAAmD;IACnD,GAAG,CAAe;IAClB,kCAAkC;IAClC,MAAM,CAAU;IAChB,0CAA0C;IAC1C,KAAK,CAAe;IAEZ,OAAO,GAAmB,IAAI,CAAC;IAE7B,eAAe;QACvB,OAAO,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACxC,CAAC;IAED,8CAA8C;IAC9C,QAAQ,CAAC,GAAgB,EAAE,MAAc,EAAE,KAAkB;QAC3D,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAKD,8DAA8D;IAC9D,GAAG,CAAC,IAAY;QACd,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC;IAED;;;OAGG;IACH,IAAI,CAAC,IAAY;QACf,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IACtC,CAAC;IAED,oEAAoE;IACpE,MAAM,CAA6B,IAAY;QAC7C,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAkB,CAAC;IACnD,CAAC;IAES,eAAe;QACvB,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,IAAI,CAAC,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;QAChD,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAES,GAAG,CAAC,QAAgB,EAAE,YAAqB;QACnD,OAAO,IAAI,CAAC,eAAe,EAAE,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,YAAY,EAAE,CAAC,CAAC;IAChE,CAAC;IAES,OAAO,CAAC,QAAgB,EAAE,YAAsB;QACxD,OAAO,IAAI,CAAC,eAAe,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,YAAY,EAAE,CAAC,CAAC;IACpE,CAAC;IAES,MAAM,CAAC,QAAgB,EAAE,OAAiB;QAClD,OAAO,IAAI,CAAC,eAAe,EAAE,CAAC,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC1D,CAAC;IAED,yFAAyF;IAC/E,WAAW,CAAC,QAAgB,EAAE,OAAiB,EAAE,cAAyB;QAClF,OAAO,IAAI,CAAC,eAAe,EAAE,CAAC,WAAW,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,cAAc,EAAE,CAAC,CAAC;IACnF,CAAC;IAED,qEAAqE;IAC3D,QAAQ,CAAC,QAAgB;QACjC,OAAO,IAAI,CAAC,eAAe,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACnD,CAAC;IAED;;;OAGG;IACO,UAAU,CAAC,OAAe,EAAE,IAAa;QACjD,OAAO,IAAI,UAAU,CAAC,OAAO,EAAE;YAC7B,IAAI;YACJ,KAAK,EAAE,IAAI,CAAC,SAAS;SACtB,CAAC,CAAC;IACL,CAAC;CACF;AAED,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,kBAAkB,EAA0C,MAAM,gBAAgB,CAAC"}
|
package/dist/help.js
CHANGED
|
@@ -3,6 +3,10 @@ import { visibleLength } from '@mudah-cli/ui';
|
|
|
3
3
|
export function formatUsage(entry) {
|
|
4
4
|
const parts = [entry.signature.name];
|
|
5
5
|
for (const arg of entry.signature.args) {
|
|
6
|
+
if (arg.variadic) {
|
|
7
|
+
parts.push(`{${arg.name}...}`);
|
|
8
|
+
continue;
|
|
9
|
+
}
|
|
6
10
|
if (arg.optional) {
|
|
7
11
|
parts.push(arg.defaultValue !== undefined ? `{${arg.name}=${arg.defaultValue}}` : `{${arg.name}?}`);
|
|
8
12
|
}
|
|
@@ -47,7 +51,13 @@ export function renderCommandHelp(appName, entry, lines) {
|
|
|
47
51
|
lines.push('Arguments:');
|
|
48
52
|
const width = Math.max(...entry.signature.args.map((a) => a.name.length)) + 2;
|
|
49
53
|
for (const arg of entry.signature.args) {
|
|
50
|
-
const kind = arg.
|
|
54
|
+
const kind = arg.variadic
|
|
55
|
+
? 'one or more (variadic)'
|
|
56
|
+
: arg.optional
|
|
57
|
+
? arg.defaultValue !== undefined
|
|
58
|
+
? `optional (default: ${arg.defaultValue})`
|
|
59
|
+
: 'optional'
|
|
60
|
+
: 'required';
|
|
51
61
|
lines.push(` ${arg.name + ' '.repeat(Math.max(1, width - arg.name.length))} ${kind}`);
|
|
52
62
|
}
|
|
53
63
|
lines.push('');
|
package/dist/help.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"help.js","sourceRoot":"","sources":["../src/help.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAG9C,yEAAyE;AACzE,MAAM,UAAU,WAAW,CAAC,KAAmB;IAC7C,MAAM,KAAK,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IACrC,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;QACvC,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAC;YACjB,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC;QACtG,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC;QACrG,CAAC;IACH,CAAC;IACD,IAAI,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvC,KAAK,CAAC,IAAI,CACR,KAAK,CAAC,SAAS,CAAC,OAAO;aACpB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;aAC3D,IAAI,CAAC,GAAG,CAAC,CACb,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACzB,CAAC;AAED,iDAAiD;AACjD,MAAM,UAAU,gBAAgB,CAAC,KAAmB,EAAE,KAAa;IACjE,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACvF,OAAO,KAAK,MAAM,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;AAC5C,CAAC;AAED,oCAAoC;AACpC,MAAM,UAAU,iBAAiB,CAAC,OAAe,EAAE,OAAe,EAAE,OAAuB,EAAE,KAAe;IAC1G,KAAK,CAAC,IAAI,CAAC,GAAG,OAAO,KAAK,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;IACzC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,KAAK,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;QACtC,OAAO;IACT,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACxB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACzE,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;IAC7C,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,QAAQ,OAAO,yCAAyC,CAAC,CAAC;AAC3E,CAAC;AAED,kCAAkC;AAClC,MAAM,UAAU,iBAAiB,CAAC,OAAe,EAAE,KAAmB,EAAE,KAAe;IACrF,KAAK,CAAC,IAAI,CAAC,UAAU,OAAO,IAAI,WAAW,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IAC1D,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;QACtB,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAC1B,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,WAAW,EAAE,EAAE,EAAE,CAAC,CAAC;IAC3C,CAAC;IACD,IAAI,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpC,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACzB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC;QAC9E,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;YACvC,MAAM,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"help.js","sourceRoot":"","sources":["../src/help.ts"],"names":[],"mappings":"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"}
|
package/dist/prompts.d.ts
CHANGED
|
@@ -1,13 +1,22 @@
|
|
|
1
1
|
export interface PromptOptions {
|
|
2
2
|
input?: NodeJS.ReadStream;
|
|
3
3
|
output?: NodeJS.WritableStream;
|
|
4
|
-
/** Bypasses the
|
|
4
|
+
/** Bypasses the interactive UI entirely (tests and non-interactive runs). */
|
|
5
5
|
forcedValue?: string;
|
|
6
6
|
}
|
|
7
|
+
/** What the caller gets back from an interactive select. */
|
|
8
|
+
export interface SelectResult {
|
|
9
|
+
index: number;
|
|
10
|
+
value: string;
|
|
11
|
+
}
|
|
7
12
|
/**
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
13
|
+
* Interactive prompts.
|
|
14
|
+
*
|
|
15
|
+
* - Non-TTY (piped/CI) or `forcedValue` set: no raw mode is touched; answers
|
|
16
|
+
* come from defaults/forced values, and list prompts fall back to numbered
|
|
17
|
+
* menus over readline so piped scripts keep working.
|
|
18
|
+
* - TTY: text uses readline; select/multiselect run a raw-mode arrow-key UI
|
|
19
|
+
* through {@link KeyParser} (↑↓ move, space toggles, enter submits).
|
|
11
20
|
*/
|
|
12
21
|
export declare class Prompts {
|
|
13
22
|
private rl;
|
|
@@ -20,8 +29,24 @@ export declare class Prompts {
|
|
|
20
29
|
confirm(question: string, options?: PromptOptions & {
|
|
21
30
|
defaultValue?: boolean;
|
|
22
31
|
}): Promise<boolean>;
|
|
23
|
-
/**
|
|
32
|
+
/**
|
|
33
|
+
* Pick one choice. Arrow keys on a TTY; numbered menu otherwise.
|
|
34
|
+
* `forcedValue` accepts a 1-based number.
|
|
35
|
+
*/
|
|
24
36
|
select(question: string, choices: string[], options?: PromptOptions): Promise<string>;
|
|
25
|
-
/**
|
|
26
|
-
|
|
37
|
+
/** Like {@link select} but returns the chosen index as well. */
|
|
38
|
+
selectIndex(question: string, choices: string[], options?: PromptOptions): Promise<SelectResult>;
|
|
39
|
+
/**
|
|
40
|
+
* Pick any number of choices (space toggles, enter submits). Returns
|
|
41
|
+
* checked values in display order; comma-separated fallback when piped.
|
|
42
|
+
*/
|
|
43
|
+
multiselect(question: string, choices: string[], options?: PromptOptions & {
|
|
44
|
+
defaultChecked?: number[];
|
|
45
|
+
}): Promise<string[]>;
|
|
46
|
+
/** Like {@link multiselect} but returns selected indices. */
|
|
47
|
+
multiSelectIndices(question: string, choices: string[], options?: PromptOptions & {
|
|
48
|
+
defaultChecked?: number[];
|
|
49
|
+
}): Promise<number[]>;
|
|
50
|
+
/** Masked free-text question. No local echo on TTYs; asterisk feedback only. */
|
|
51
|
+
password(question: string, options?: PromptOptions): Promise<string>;
|
|
27
52
|
}
|
package/dist/prompts.js
CHANGED
|
@@ -1,14 +1,23 @@
|
|
|
1
1
|
import * as readline from 'node:readline';
|
|
2
|
+
import { KeyParser } from '@mudah-cli/terminal';
|
|
2
3
|
/**
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
4
|
+
* Interactive prompts.
|
|
5
|
+
*
|
|
6
|
+
* - Non-TTY (piped/CI) or `forcedValue` set: no raw mode is touched; answers
|
|
7
|
+
* come from defaults/forced values, and list prompts fall back to numbered
|
|
8
|
+
* menus over readline so piped scripts keep working.
|
|
9
|
+
* - TTY: text uses readline; select/multiselect run a raw-mode arrow-key UI
|
|
10
|
+
* through {@link KeyParser} (↑↓ move, space toggles, enter submits).
|
|
6
11
|
*/
|
|
7
12
|
export class Prompts {
|
|
8
13
|
rl = null;
|
|
9
|
-
makeReader() {
|
|
14
|
+
makeReader(input, output) {
|
|
10
15
|
if (!this.rl) {
|
|
11
|
-
this.rl = readline.createInterface({
|
|
16
|
+
this.rl = readline.createInterface({
|
|
17
|
+
input: input ?? process.stdin,
|
|
18
|
+
output: output ?? process.stdout,
|
|
19
|
+
terminal: process.stdin.isTTY === true,
|
|
20
|
+
});
|
|
12
21
|
}
|
|
13
22
|
return this.rl;
|
|
14
23
|
}
|
|
@@ -16,7 +25,7 @@ export class Prompts {
|
|
|
16
25
|
async ask(question, options = {}) {
|
|
17
26
|
if (options.forcedValue !== undefined)
|
|
18
27
|
return options.forcedValue;
|
|
19
|
-
const rl = this.makeReader();
|
|
28
|
+
const rl = this.makeReader(options.input, options.output);
|
|
20
29
|
const suffix = options.defaultValue !== undefined ? ` (${options.defaultValue})` : '';
|
|
21
30
|
return new Promise((resolve) => {
|
|
22
31
|
rl.question(`${question}${suffix} `, (answer) => {
|
|
@@ -36,30 +45,194 @@ export class Prompts {
|
|
|
36
45
|
return def;
|
|
37
46
|
return answer.toLowerCase().startsWith('y');
|
|
38
47
|
}
|
|
39
|
-
/**
|
|
48
|
+
/**
|
|
49
|
+
* Pick one choice. Arrow keys on a TTY; numbered menu otherwise.
|
|
50
|
+
* `forcedValue` accepts a 1-based number.
|
|
51
|
+
*/
|
|
40
52
|
async select(question, choices, options = {}) {
|
|
53
|
+
const result = await this.selectIndex(question, choices, options);
|
|
54
|
+
return result.value;
|
|
55
|
+
}
|
|
56
|
+
/** Like {@link select} but returns the chosen index as well. */
|
|
57
|
+
async selectIndex(question, choices, options = {}) {
|
|
58
|
+
if (choices.length === 0)
|
|
59
|
+
throw new Error('[console] select() requires at least one choice.');
|
|
41
60
|
if (options.forcedValue !== undefined) {
|
|
42
|
-
const
|
|
61
|
+
const index = Number(options.forcedValue) - 1;
|
|
62
|
+
const choice = choices[index];
|
|
43
63
|
if (!choice)
|
|
44
64
|
throw new Error(`[console] Forced select value "${options.forcedValue}" is out of range.`);
|
|
45
|
-
return choice;
|
|
65
|
+
return { index, value: choice };
|
|
46
66
|
}
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
67
|
+
// A caller-provided input stream decides interactivity (fake TTYs in
|
|
68
|
+
// tests); plain process.stdin falls back to numbered menus when piped.
|
|
69
|
+
const interactive = (options.input ?? process.stdin).isTTY === true;
|
|
70
|
+
if (!interactive) {
|
|
71
|
+
writeOut(options.output, `\n${question}\n`);
|
|
72
|
+
choices.forEach((choice, i) => writeOut(options.output, ` ${i + 1}. ${choice}\n`));
|
|
73
|
+
const answer = await this.ask('Choose', options);
|
|
74
|
+
const index = Number(answer) - 1;
|
|
75
|
+
const choice = choices[index];
|
|
76
|
+
if (!choice)
|
|
77
|
+
throw new Error(`[console] Invalid selection "${answer}".`);
|
|
78
|
+
return { index, value: choice };
|
|
56
79
|
}
|
|
57
|
-
|
|
80
|
+
const result = await rawSelect(question, choices, { ...options, multi: false });
|
|
81
|
+
return { index: result.index, value: result.value };
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Pick any number of choices (space toggles, enter submits). Returns
|
|
85
|
+
* checked values in display order; comma-separated fallback when piped.
|
|
86
|
+
*/
|
|
87
|
+
async multiselect(question, choices, options = {}) {
|
|
88
|
+
const indices = await this.multiSelectIndices(question, choices, options);
|
|
89
|
+
return indices.map((i) => choices[i]);
|
|
58
90
|
}
|
|
59
|
-
/**
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
91
|
+
/** Like {@link multiselect} but returns selected indices. */
|
|
92
|
+
async multiSelectIndices(question, choices, options = {}) {
|
|
93
|
+
if (choices.length === 0)
|
|
94
|
+
throw new Error('[console] multiselect() requires at least one choice.');
|
|
95
|
+
if (options.forcedValue !== undefined) {
|
|
96
|
+
return parseNumberList(options.forcedValue, choices.length);
|
|
97
|
+
}
|
|
98
|
+
const interactive = (options.input ?? process.stdin).isTTY === true;
|
|
99
|
+
if (!interactive) {
|
|
100
|
+
writeOut(options.output, `\n${question}\n`);
|
|
101
|
+
choices.forEach((choice, i) => writeOut(options.output, ` ${i + 1}. ${choice}\n`));
|
|
102
|
+
const answer = await this.ask('Choose (comma-separated numbers)', options);
|
|
103
|
+
return parseNumberList(answer, choices.length);
|
|
104
|
+
}
|
|
105
|
+
const result = await rawSelect(question, choices, { ...options, multi: true });
|
|
106
|
+
return result.indices ?? [];
|
|
63
107
|
}
|
|
108
|
+
/** Masked free-text question. No local echo on TTYs; asterisk feedback only. */
|
|
109
|
+
async password(question, options = {}) {
|
|
110
|
+
if (options.forcedValue !== undefined)
|
|
111
|
+
return options.forcedValue;
|
|
112
|
+
const input = options.input ?? process.stdin;
|
|
113
|
+
const output = options.output ?? process.stdout;
|
|
114
|
+
writeOut(output, `${question} `);
|
|
115
|
+
if (input.isTTY !== true) {
|
|
116
|
+
const rl = this.makeReader(options.input, options.output);
|
|
117
|
+
const answer = await new Promise((resolve) => rl.question('', resolve));
|
|
118
|
+
writeOut(output, '\n');
|
|
119
|
+
return answer;
|
|
120
|
+
}
|
|
121
|
+
const wasRaw = input.isRaw ?? false;
|
|
122
|
+
input.setRawMode(true);
|
|
123
|
+
input.resume();
|
|
124
|
+
let value = '';
|
|
125
|
+
try {
|
|
126
|
+
await new Promise((resolve) => {
|
|
127
|
+
const parser = new KeyParser();
|
|
128
|
+
const onKey = (chunk) => {
|
|
129
|
+
for (const event of parser.feed(String(chunk))) {
|
|
130
|
+
if (event.name === 'enter') {
|
|
131
|
+
input.off('data', onKey);
|
|
132
|
+
resolve();
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
if (event.name === 'backspace') {
|
|
136
|
+
value = value.slice(0, -1);
|
|
137
|
+
}
|
|
138
|
+
else if (event.ch !== undefined && event.ch >= ' ') {
|
|
139
|
+
value += event.ch;
|
|
140
|
+
writeOut(output, '*');
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
};
|
|
144
|
+
input.on('data', onKey);
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
finally {
|
|
148
|
+
input.setRawMode(wasRaw);
|
|
149
|
+
writeOut(output, '\n');
|
|
150
|
+
}
|
|
151
|
+
return value;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
/** The shared raw-mode arrow-key picker used by select/multiselect on TTYs. */
|
|
155
|
+
function rawSelect(question, choices, options) {
|
|
156
|
+
const input = options.input ?? process.stdin;
|
|
157
|
+
const output = options.output ?? process.stdout;
|
|
158
|
+
return new Promise((resolve) => {
|
|
159
|
+
let cursor = 0;
|
|
160
|
+
const checked = new Set(options.multi ? (options.defaultChecked ?? []) : []);
|
|
161
|
+
let frameHeight = 0;
|
|
162
|
+
const parser = new KeyParser();
|
|
163
|
+
const render = () => {
|
|
164
|
+
const lines = [`${question}`];
|
|
165
|
+
choices.forEach((choice, i) => {
|
|
166
|
+
const pointer = i === cursor ? '❯ ' : ' ';
|
|
167
|
+
const box = options.multi ? (checked.has(i) ? '[x] ' : '[ ] ') : '';
|
|
168
|
+
lines.push(`${pointer}${box}${choice}`);
|
|
169
|
+
});
|
|
170
|
+
lines.push('', options.multi ? 'space toggle · ↑↓ move · enter submit' : '↑↓ move · enter choose · esc cancel');
|
|
171
|
+
return lines;
|
|
172
|
+
};
|
|
173
|
+
const draw = () => {
|
|
174
|
+
if (frameHeight > 0) {
|
|
175
|
+
writeOut(output, `\x1b[${frameHeight}A\x1b[J`);
|
|
176
|
+
}
|
|
177
|
+
writeOut(output, `${render().join('\n')}\n`);
|
|
178
|
+
frameHeight = render().length;
|
|
179
|
+
};
|
|
180
|
+
const cleanup = (result) => {
|
|
181
|
+
input.off('data', onData);
|
|
182
|
+
if (input.isTTY)
|
|
183
|
+
input.setRawMode(false);
|
|
184
|
+
writeOut(output, `\x1b[${frameHeight}A\x1b[J`);
|
|
185
|
+
resolve(result);
|
|
186
|
+
};
|
|
187
|
+
const onData = (chunk) => {
|
|
188
|
+
// One parser across chunks so split sequences reassemble.
|
|
189
|
+
for (const event of parser.feed(String(chunk))) {
|
|
190
|
+
switch (event.name) {
|
|
191
|
+
case 'up':
|
|
192
|
+
cursor = Math.max(0, cursor - 1);
|
|
193
|
+
break;
|
|
194
|
+
case 'down':
|
|
195
|
+
cursor = Math.min(choices.length - 1, cursor + 1);
|
|
196
|
+
break;
|
|
197
|
+
case 'space':
|
|
198
|
+
if (options.multi) {
|
|
199
|
+
if (checked.has(cursor))
|
|
200
|
+
checked.delete(cursor);
|
|
201
|
+
else
|
|
202
|
+
checked.add(cursor);
|
|
203
|
+
}
|
|
204
|
+
break;
|
|
205
|
+
case 'enter': {
|
|
206
|
+
const value = choices[cursor];
|
|
207
|
+
cleanup(options.multi
|
|
208
|
+
? { index: cursor, value, indices: [...checked].sort((a, b) => a - b) }
|
|
209
|
+
: { index: cursor, value });
|
|
210
|
+
return;
|
|
211
|
+
}
|
|
212
|
+
case 'escape':
|
|
213
|
+
case 'ctrl+c':
|
|
214
|
+
cleanup({ index: -1, value: '', indices: [] });
|
|
215
|
+
return;
|
|
216
|
+
default:
|
|
217
|
+
break;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
draw();
|
|
221
|
+
};
|
|
222
|
+
input.setRawMode(true);
|
|
223
|
+
input.resume();
|
|
224
|
+
input.on('data', onData);
|
|
225
|
+
draw();
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
function parseNumberList(answer, max) {
|
|
229
|
+
const parsed = answer
|
|
230
|
+
.split(',')
|
|
231
|
+
.map((part) => Number(part.trim()) - 1)
|
|
232
|
+
.filter((index) => index >= 0 && index < max);
|
|
233
|
+
return [...new Set(parsed)].sort((a, b) => a - b);
|
|
234
|
+
}
|
|
235
|
+
function writeOut(stream, text) {
|
|
236
|
+
stream?.write(text);
|
|
64
237
|
}
|
|
65
238
|
//# sourceMappingURL=prompts.js.map
|
package/dist/prompts.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../src/prompts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../src/prompts.ts"],"names":[],"mappings":"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"}
|
package/dist/signature.d.ts
CHANGED
|
@@ -2,6 +2,8 @@ export interface ParsedArg {
|
|
|
2
2
|
name: string;
|
|
3
3
|
optional: boolean;
|
|
4
4
|
defaultValue?: string;
|
|
5
|
+
/** Variadic: collects all remaining positionals (`{paths...}`). */
|
|
6
|
+
variadic?: boolean;
|
|
5
7
|
}
|
|
6
8
|
export interface ParsedOption {
|
|
7
9
|
name: string;
|
|
@@ -16,6 +18,8 @@ export interface ParsedSignature {
|
|
|
16
18
|
}
|
|
17
19
|
export interface ParsedInput {
|
|
18
20
|
args: Record<string, string>;
|
|
21
|
+
/** Variadic arg values, keyed by arg name (only for `{name...}`). */
|
|
22
|
+
lists: Record<string, string[]>;
|
|
19
23
|
options: Record<string, string | boolean>;
|
|
20
24
|
}
|
|
21
25
|
/**
|
|
@@ -23,13 +27,15 @@ export interface ParsedInput {
|
|
|
23
27
|
*
|
|
24
28
|
* ```
|
|
25
29
|
* deploy {branch?} {ref=main} [--force] [--env=production]
|
|
30
|
+
* convert {paths...} [--to=webp]
|
|
26
31
|
* ```
|
|
27
32
|
*/
|
|
28
33
|
export declare function parseSignature(signature: string): ParsedSignature;
|
|
29
34
|
/**
|
|
30
35
|
* Parse raw argv (everything after the command name) against a parsed
|
|
31
36
|
* signature. Positional values fill args in order; `--name` / `--name=value`
|
|
32
|
-
* fill options.
|
|
37
|
+
* fill options. A trailing variadic arg collects all remaining positionals.
|
|
38
|
+
* Throws `ArgumentParseError` on violations.
|
|
33
39
|
*/
|
|
34
40
|
export declare function parseInput(signature: ParsedSignature, argv: string[]): ParsedInput;
|
|
35
41
|
export declare class ArgumentParseError extends Error {
|
package/dist/signature.js
CHANGED
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* ```
|
|
5
5
|
* deploy {branch?} {ref=main} [--force] [--env=production]
|
|
6
|
+
* convert {paths...} [--to=webp]
|
|
6
7
|
* ```
|
|
7
8
|
*/
|
|
8
9
|
export function parseSignature(signature) {
|
|
@@ -10,18 +11,38 @@ export function parseSignature(signature) {
|
|
|
10
11
|
const trimmed = signature.trim();
|
|
11
12
|
const firstSpace = trimmed.search(/\s/);
|
|
12
13
|
result.name = firstSpace === -1 ? trimmed : trimmed.slice(0, firstSpace);
|
|
14
|
+
let variadicIndex = -1;
|
|
13
15
|
for (const match of trimmed.matchAll(/\{([^{}]+)\}/g)) {
|
|
14
16
|
const inner = match[1];
|
|
15
|
-
|
|
17
|
+
// Non-greedy name so trailing "..." is captured by the variadic group,
|
|
18
|
+
// not eaten by the name character class.
|
|
19
|
+
const parsed = /^([a-zA-Z][\w:.-]*?)(\?)?(\.\.\.)?(?:=(.*))?$/.exec(inner);
|
|
16
20
|
if (!parsed) {
|
|
17
21
|
throw new Error(`[console] Invalid argument syntax "{${inner}}" in signature "${signature}".`);
|
|
18
22
|
}
|
|
23
|
+
const isVariadic = parsed[3] !== undefined;
|
|
24
|
+
if (isVariadic && parsed[4] !== undefined) {
|
|
25
|
+
throw new Error(`[console] Variadic argument "{${inner}}" cannot take a default value.`);
|
|
26
|
+
}
|
|
27
|
+
if (isVariadic && parsed[2] === '?') {
|
|
28
|
+
throw new Error(`[console] Variadic argument "{${inner}}" cannot also be optional.`);
|
|
29
|
+
}
|
|
30
|
+
if (isVariadic) {
|
|
31
|
+
if (variadicIndex !== -1) {
|
|
32
|
+
throw new Error(`[console] Only one variadic argument is allowed in signature "${signature}".`);
|
|
33
|
+
}
|
|
34
|
+
variadicIndex = result.args.length;
|
|
35
|
+
}
|
|
19
36
|
result.args.push({
|
|
20
37
|
name: parsed[1],
|
|
21
38
|
optional: parsed[2] === '?',
|
|
22
|
-
|
|
39
|
+
...(isVariadic ? { variadic: true } : {}),
|
|
40
|
+
defaultValue: parsed[4],
|
|
23
41
|
});
|
|
24
42
|
}
|
|
43
|
+
if (variadicIndex !== -1 && variadicIndex !== result.args.length - 1) {
|
|
44
|
+
throw new Error(`[console] Variadic argument must be the final argument in signature "${signature}".`);
|
|
45
|
+
}
|
|
25
46
|
for (const match of trimmed.matchAll(/\[-{2}([a-zA-Z][\w-]*)(?:=([^}\]]*))?\]/g)) {
|
|
26
47
|
const name = match[1];
|
|
27
48
|
const takesValue = match[2] !== undefined;
|
|
@@ -36,10 +57,11 @@ export function parseSignature(signature) {
|
|
|
36
57
|
/**
|
|
37
58
|
* Parse raw argv (everything after the command name) against a parsed
|
|
38
59
|
* signature. Positional values fill args in order; `--name` / `--name=value`
|
|
39
|
-
* fill options.
|
|
60
|
+
* fill options. A trailing variadic arg collects all remaining positionals.
|
|
61
|
+
* Throws `ArgumentParseError` on violations.
|
|
40
62
|
*/
|
|
41
63
|
export function parseInput(signature, argv) {
|
|
42
|
-
const input = { args: {}, options: {} };
|
|
64
|
+
const input = { args: {}, lists: {}, options: {} };
|
|
43
65
|
const positionals = [];
|
|
44
66
|
for (let i = 0; i < argv.length; i++) {
|
|
45
67
|
const token = argv[i];
|
|
@@ -66,11 +88,13 @@ export function parseInput(signature, argv) {
|
|
|
66
88
|
throw new ArgumentParseError(`Unknown option "--${name}" for command "${signature.name}".`);
|
|
67
89
|
}
|
|
68
90
|
}
|
|
69
|
-
|
|
70
|
-
|
|
91
|
+
const variadic = signature.args.length > 0 && (signature.args.at(-1)?.variadic === true);
|
|
92
|
+
const fixedArgs = variadic ? signature.args.slice(0, -1) : signature.args;
|
|
93
|
+
if (!variadic && positionals.length > signature.args.length) {
|
|
71
94
|
throw new ArgumentParseError(`Too many arguments for "${signature.name}": expected at most ${signature.args.length}.`);
|
|
72
95
|
}
|
|
73
|
-
|
|
96
|
+
// Fixed args consume positionals in order.
|
|
97
|
+
fixedArgs.forEach((arg, index) => {
|
|
74
98
|
const value = positionals[index];
|
|
75
99
|
if (value !== undefined) {
|
|
76
100
|
input.args[arg.name] = value;
|
|
@@ -82,6 +106,15 @@ export function parseInput(signature, argv) {
|
|
|
82
106
|
throw new ArgumentParseError(`Missing required argument "${arg.name}" for command "${signature.name}".`);
|
|
83
107
|
}
|
|
84
108
|
});
|
|
109
|
+
// The variadic arg collects everything left.
|
|
110
|
+
if (variadic) {
|
|
111
|
+
const collected = positionals.slice(fixedArgs.length);
|
|
112
|
+
const variadicName = signature.args.at(-1).name;
|
|
113
|
+
if (collected.length === 0) {
|
|
114
|
+
throw new ArgumentParseError(`Missing required argument "${variadicName}..." for command "${signature.name}".`);
|
|
115
|
+
}
|
|
116
|
+
input.lists[variadicName] = collected;
|
|
117
|
+
}
|
|
85
118
|
// Fill options with defaults.
|
|
86
119
|
for (const option of signature.options) {
|
|
87
120
|
if (input.options[option.name] === undefined) {
|
package/dist/signature.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"signature.js","sourceRoot":"","sources":["../src/signature.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"signature.js","sourceRoot":"","sources":["../src/signature.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mudah-cli/console",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "Command system: string signatures, typed dispatch, interactive prompts, and help rendering.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -18,10 +18,10 @@
|
|
|
18
18
|
],
|
|
19
19
|
"sideEffects": false,
|
|
20
20
|
"dependencies": {
|
|
21
|
-
"@mudah-cli/animation": "^0.
|
|
22
|
-
"@mudah-cli/core": "^0.
|
|
23
|
-
"@mudah-cli/terminal": "^0.
|
|
24
|
-
"@mudah-cli/ui": "^0.
|
|
21
|
+
"@mudah-cli/animation": "^0.2.0",
|
|
22
|
+
"@mudah-cli/core": "^0.2.0",
|
|
23
|
+
"@mudah-cli/terminal": "^0.2.0",
|
|
24
|
+
"@mudah-cli/ui": "^0.2.0"
|
|
25
25
|
},
|
|
26
26
|
"publishConfig": {
|
|
27
27
|
"access": "public"
|