breadc 0.7.0 → 0.8.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/LICENSE +1 -1
- package/README.md +16 -15
- package/dist/index.cjs +590 -458
- package/dist/index.d.ts +121 -109
- package/dist/index.mjs +589 -451
- package/package.json +10 -16
package/dist/index.d.ts
CHANGED
|
@@ -1,112 +1,83 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
type TokenType = '--' | '-' | 'number' | 'string' | 'long' | 'short';
|
|
2
|
+
declare class Token {
|
|
3
|
+
private readonly text;
|
|
4
|
+
private _type;
|
|
5
|
+
constructor(text: string);
|
|
5
6
|
/**
|
|
6
|
-
*
|
|
7
|
+
* @returns Raw argument text
|
|
7
8
|
*/
|
|
8
|
-
|
|
9
|
+
raw(): string;
|
|
9
10
|
/**
|
|
10
|
-
*
|
|
11
|
+
* @returns Number representation
|
|
11
12
|
*/
|
|
12
|
-
|
|
13
|
+
number(): number;
|
|
13
14
|
/**
|
|
14
|
-
*
|
|
15
|
+
* @returns Remove start - for long or short option
|
|
15
16
|
*/
|
|
16
|
-
|
|
17
|
+
option(): string;
|
|
18
|
+
isOption(): boolean;
|
|
19
|
+
isText(): boolean;
|
|
20
|
+
type(): TokenType;
|
|
17
21
|
}
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
*/
|
|
27
|
-
declare class Option<F extends string = string, T = string, O = ExtractOptionType<F>> {
|
|
28
|
-
private static OptionRE;
|
|
29
|
-
readonly name: string;
|
|
30
|
-
readonly shortcut?: string;
|
|
31
|
-
readonly default?: O extends boolean ? boolean : string;
|
|
32
|
-
readonly format: string;
|
|
33
|
-
readonly description: string;
|
|
34
|
-
readonly type: 'string' | 'boolean';
|
|
35
|
-
readonly required: boolean;
|
|
36
|
-
readonly construct?: (rawText: ExtractOptionType<F>) => T;
|
|
37
|
-
constructor(format: F, config?: OptionConfig<F, T, O>);
|
|
22
|
+
declare class Lexer {
|
|
23
|
+
private readonly rawArgs;
|
|
24
|
+
private cursor;
|
|
25
|
+
constructor(rawArgs: string[]);
|
|
26
|
+
next(): Token | undefined;
|
|
27
|
+
hasNext(): boolean;
|
|
28
|
+
peek(): Token | undefined;
|
|
29
|
+
[Symbol.iterator](): Iterator<Token, undefined>;
|
|
38
30
|
}
|
|
39
31
|
|
|
40
|
-
interface CommandConfig {
|
|
41
|
-
description?: string;
|
|
42
|
-
}
|
|
43
|
-
declare class Command<F extends string = string, CommandOption extends object = {}> {
|
|
44
|
-
protected static MaxDep: number;
|
|
45
|
-
protected readonly logger: Logger;
|
|
46
|
-
readonly format: string;
|
|
47
|
-
readonly description: string;
|
|
48
|
-
readonly prefix: string[][];
|
|
49
|
-
readonly arguments: string[];
|
|
50
|
-
readonly default: boolean;
|
|
51
|
-
readonly options: Option[];
|
|
52
|
-
private actionFn?;
|
|
53
|
-
constructor(format: F, config: CommandConfig & {
|
|
54
|
-
logger: Logger;
|
|
55
|
-
});
|
|
56
|
-
get isInternal(): boolean;
|
|
57
|
-
alias(command: string): this;
|
|
58
|
-
option<OF extends string, T = undefined>(format: OF, description: string, config?: Omit<OptionConfig<OF, T>, 'description'>): Command<F, CommandOption & ExtractOption<OF, T>>;
|
|
59
|
-
option<OF extends string, T = undefined>(format: OF, config?: OptionConfig<OF, T>): Command<F, CommandOption & ExtractOption<OF, T>>;
|
|
60
|
-
hasPrefix(parsedArgs: ParsedArgs): boolean;
|
|
61
|
-
shouldRun(parsedArgs: ParsedArgs): boolean;
|
|
62
|
-
parseArgs(argv: ParsedArgs, globalOptions: Option[]): ParseResult;
|
|
63
|
-
action(fn: ActionFn<ExtractCommand<F>, CommandOption>): void;
|
|
64
|
-
run(...args: any[]): Promise<any>;
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
interface AppOption {
|
|
68
|
-
version?: string;
|
|
69
|
-
description?: string | string[];
|
|
70
|
-
help?: string | string[] | (() => string | string[]);
|
|
71
|
-
logger?: Partial<Logger> | LoggerFn;
|
|
72
|
-
}
|
|
73
|
-
type LoggerFn = (message: string, ...args: any[]) => void;
|
|
74
|
-
interface Logger {
|
|
75
|
-
println: LoggerFn;
|
|
76
|
-
info: LoggerFn;
|
|
77
|
-
warn: LoggerFn;
|
|
78
|
-
error: LoggerFn;
|
|
79
|
-
debug: LoggerFn;
|
|
80
|
-
}
|
|
81
32
|
interface ParseResult {
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
options: Record<string, string>;
|
|
33
|
+
arguments: Array<string | string[] | undefined>;
|
|
34
|
+
options: Record<string, any>;
|
|
85
35
|
'--': string[];
|
|
86
36
|
}
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
37
|
+
interface Context {
|
|
38
|
+
lexer: Lexer;
|
|
39
|
+
options: Map<string, Option>;
|
|
40
|
+
result: ParseResult;
|
|
41
|
+
}
|
|
42
|
+
interface TreeNode {
|
|
43
|
+
command?: Command;
|
|
44
|
+
children: Map<string, TreeNode>;
|
|
45
|
+
init(context: Context): void;
|
|
46
|
+
next(arg: Token, context: Context): TreeNode | false;
|
|
47
|
+
finish(context: Context): void;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
type Lowercase = 'a' | 'b' | 'c' | 'd' | 'e' | 'f' | 'g' | 'h' | 'i' | 'j' | 'k' | 'l' | 'm' | 'n' | 'o' | 'p' | 'q' | 'r' | 's' | 't' | 'u' | 'v' | 'w' | 'x' | 'y' | 'z';
|
|
51
|
+
type Uppercase = 'A' | 'B' | 'C' | 'D' | 'E' | 'F' | 'G' | 'H' | 'I' | 'J' | 'K' | 'L' | 'M' | 'N' | 'O' | 'P' | 'Q' | 'R' | 'S' | 'T' | 'U' | 'V' | 'W' | 'X' | 'Y' | 'Z';
|
|
52
|
+
type Letter = Lowercase | Uppercase;
|
|
53
|
+
|
|
90
54
|
/**
|
|
91
|
-
* Extract option
|
|
55
|
+
* Extract option type, boolean or string
|
|
56
|
+
*/
|
|
57
|
+
type ExtractOptionType<T extends string> = T extends `-${Letter}, --${infer R} <${infer U}>` ? string : T extends `-${Letter}, --${infer R}` ? boolean : T extends `--${infer R} <${infer U}>` ? string : T extends `--${infer R}` ? boolean : string | boolean;
|
|
58
|
+
/**
|
|
59
|
+
* Extract option raw name
|
|
92
60
|
*
|
|
93
61
|
* Examples:
|
|
94
62
|
* + const t1: ExtractOption<'--option' | '--hello'> = 'hello'
|
|
95
63
|
* + const t2: ExtractOption<'-r, --root'> = 'root'
|
|
64
|
+
* + const t3: ExtractOption<'--page-index'> = 'pageIndex'
|
|
96
65
|
*/
|
|
97
|
-
type
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
type
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
66
|
+
type ExtractOptionRawName<T extends string> = T extends `-${Letter}, --${infer R} <${infer U}>` ? R : T extends `-${Letter}, --${infer R}` ? R : T extends `--${infer R} <${infer U}>` ? R : T extends `--${infer R}` ? R : never;
|
|
67
|
+
/**
|
|
68
|
+
* Extrat camel case option name
|
|
69
|
+
*/
|
|
70
|
+
type ExtractOptionName<T extends string, R extends string = ExtractOptionRawName<T>> = R extends `${infer P1}-${infer P2}-${infer P3}` ? `${P1}${Capitalize<P2>}${Capitalize<P3>}` : R extends `${infer P1}-${infer P2}` ? `${P1}${Capitalize<P2>}` : R;
|
|
71
|
+
/**
|
|
72
|
+
* Extract option information
|
|
73
|
+
*/
|
|
74
|
+
type ExtractOption<T extends string, D = undefined> = {
|
|
75
|
+
[k in ExtractOptionName<T>]: D extends undefined ? ExtractOptionType<T> : D;
|
|
106
76
|
};
|
|
77
|
+
type Push<T extends any[], U, R> = [...T, U, R];
|
|
107
78
|
type ActionFn<T extends any[], Option extends object = {}, R = any> = (...arg: Push<T, Option & {
|
|
108
79
|
'--': string[];
|
|
109
|
-
},
|
|
80
|
+
}, {}>) => R | Promise<R>;
|
|
110
81
|
/**
|
|
111
82
|
* Max Dep: 5
|
|
112
83
|
*
|
|
@@ -114,27 +85,68 @@ type ActionFn<T extends any[], Option extends object = {}, R = any> = (...arg: P
|
|
|
114
85
|
*/
|
|
115
86
|
type ExtractCommand<T extends string> = T extends `<${infer P1}> <${infer P2}> <${infer P3}> <${infer P4}> [...${infer P5}]` ? [string, string, string, string, string[]] : T extends `<${infer P1}> <${infer P2}> <${infer P3}> <${infer P4}> [${infer P5}]` ? [string, string, string, string, string | undefined] : T extends `<${infer P1}> <${infer P2}> <${infer P3}> <${infer P4}> <${infer P5}>` ? [string, string, string, string, string] : T extends `${infer P1} <${infer P2}> <${infer P3}> <${infer P4}> [...${infer P5}]` ? [string, string, string, string[]] : T extends `${infer P1} <${infer P2}> <${infer P3}> <${infer P4}> [${infer P5}]` ? [string, string, string, string | undefined] : T extends `${infer P1} <${infer P2}> <${infer P3}> <${infer P4}> <${infer P5}>` ? [string, string, string, string] : T extends `${infer P1} ${infer P2} <${infer P3}> <${infer P4}> [...${infer P5}]` ? [string, string, string[]] : T extends `${infer P1} ${infer P2} <${infer P3}> <${infer P4}> [${infer P5}]` ? [string, string, string | undefined] : T extends `${infer P1} ${infer P2} <${infer P3}> <${infer P4}> <${infer P5}>` ? [string, string, string] : T extends `${infer P1} ${infer P2} ${infer P3} <${infer P4}> [...${infer P5}]` ? [string, string[]] : T extends `${infer P1} ${infer P2} ${infer P3} <${infer P4}> [${infer P5}]` ? [string, string | undefined] : T extends `${infer P1} ${infer P2} ${infer P3} <${infer P4}> <${infer P5}>` ? [string, string] : T extends `<${infer P1}> <${infer P2}> <${infer P3}> [...${infer P4}]` ? [string, string, string, string[]] : T extends `<${infer P1}> <${infer P2}> <${infer P3}> [${infer P4}]` ? [string, string, string, string | undefined] : T extends `<${infer P1}> <${infer P2}> <${infer P3}> <${infer P4}>` ? [string, string, string, string] : T extends `${infer P1} <${infer P2}> <${infer P3}> [...${infer P4}]` ? [string, string, string[]] : T extends `${infer P1} <${infer P2}> <${infer P3}> [${infer P4}]` ? [string, string, string | undefined] : T extends `${infer P1} <${infer P2}> <${infer P3}> <${infer P4}>` ? [string, string, string] : T extends `${infer P1} ${infer P2} <${infer P3}> [...${infer P4}]` ? [string, string[]] : T extends `${infer P1} ${infer P2} <${infer P3}> [${infer P4}]` ? [string, string | undefined] : T extends `${infer P1} ${infer P2} <${infer P3}> <${infer P4}>` ? [string, string] : T extends `${infer P1} ${infer P2} ${infer P3} [...${infer P4}]` ? [string[]] : T extends `${infer P1} ${infer P2} ${infer P3} [${infer P4}]` ? [string | undefined] : T extends `${infer P1} ${infer P2} ${infer P3} <${infer P4}>` ? [string] : T extends `<${infer P1}> <${infer P2}> [...${infer P3}]` ? [string, string, string[]] : T extends `<${infer P1}> <${infer P2}> [${infer P3}]` ? [string, string, string | undefined] : T extends `<${infer P1}> <${infer P2}> <${infer P3}>` ? [string, string, string] : T extends `${infer P1} <${infer P2}> [...${infer P3}]` ? [string, string[]] : T extends `${infer P1} <${infer P2}> [${infer P3}]` ? [string, string | undefined] : T extends `${infer P1} <${infer P2}> <${infer P3}>` ? [string, string] : T extends `${infer P1} ${infer P2} [...${infer P3}]` ? [string[]] : T extends `${infer P1} ${infer P2} [${infer P3}]` ? [string | undefined] : T extends `${infer P1} ${infer P2} <${infer P3}>` ? [string] : T extends `${infer P1} ${infer P2} ${infer P3}` ? [] : T extends `<${infer P1}> [...${infer P2}]` ? [string, string[]] : T extends `<${infer P1}> [${infer P2}]` ? [string, string | undefined] : T extends `<${infer P1}> <${infer P2}>` ? [string, string] : T extends `${infer P1} [...${infer P2}]` ? [string[]] : T extends `${infer P1} [${infer P2}]` ? [string | undefined] : T extends `${infer P1} <${infer P2}>` ? [string] : T extends `${infer P1} ${infer P2}` ? [] : T extends `[...${infer P1}]` ? [string[]] : T extends `[${infer P1}]` ? [string | undefined] : T extends `<${infer P1}>` ? [string] : T extends `${infer P1}` ? [] : T extends `` ? [] : never;
|
|
116
87
|
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
88
|
+
interface AppOption {
|
|
89
|
+
version?: string;
|
|
90
|
+
description?: string;
|
|
91
|
+
plugins?: Partial<Plugin>[];
|
|
92
|
+
}
|
|
93
|
+
interface Breadc<GlobalOption extends object = {}> {
|
|
94
|
+
option<F extends string = string, T extends string | boolean = ExtractOptionType<F>, R extends any = ExtractOptionType<F>>(format: F, description?: string, option?: OptionOption<T, R>): Breadc<GlobalOption & ExtractOption<F, R>>;
|
|
95
|
+
option<F extends string = string, T extends string | boolean = ExtractOptionType<F>, R extends any = ExtractOptionType<F>>(format: F, option?: OptionOption<T, R>): Breadc<GlobalOption & ExtractOption<F, R>>;
|
|
96
|
+
command<F extends string = string>(format: F, description?: string): Command<F, ExtractCommand<F>, {}, GlobalOption>;
|
|
97
|
+
command<F extends string = string>(format: F, option?: CommandOption): Command<F, ExtractCommand<F>, {}, GlobalOption>;
|
|
98
|
+
parse(args: string[]): {
|
|
99
|
+
command?: Command;
|
|
100
|
+
} & ParseResult;
|
|
101
|
+
run<T = any>(args: string[]): Promise<T>;
|
|
102
|
+
}
|
|
103
|
+
interface Command<F extends string = string, AT extends any[] = ExtractCommand<F>, CommandOption extends object = {}, GlobalOption extends object = {}> {
|
|
104
|
+
callback?: ActionFn<ExtractCommand<F>, CommandOption & GlobalOption>;
|
|
105
|
+
format: F;
|
|
106
|
+
description: string;
|
|
107
|
+
_arguments: Argument[];
|
|
108
|
+
_options: Option[];
|
|
109
|
+
option<OF extends string = string, OT extends string | boolean = ExtractOptionType<F>, OR extends any = ExtractOptionType<F>>(format: OF, description?: string, option?: OptionOption<OT, OR>): Command<F, AT, CommandOption & ExtractOption<OF, OR>, GlobalOption>;
|
|
110
|
+
option<OF extends string = string, OT extends string | boolean = ExtractOptionType<F>, OR extends any = ExtractOptionType<F>>(format: OF, option?: OptionOption<OT, OR>): Command<F, AT, CommandOption & ExtractOption<OF, OR>, GlobalOption>;
|
|
111
|
+
action(fn: ActionFn<AT, CommandOption & GlobalOption>): void;
|
|
112
|
+
}
|
|
113
|
+
interface CommandOption {
|
|
114
|
+
description?: string;
|
|
115
|
+
}
|
|
116
|
+
interface Argument {
|
|
117
|
+
type: 'const' | 'require' | 'optional' | 'rest';
|
|
118
|
+
name: string;
|
|
119
|
+
}
|
|
120
|
+
interface Option<F extends string = string, T extends string | boolean = ExtractOptionType<F>, R extends any = T extends string ? string : T extends boolean ? boolean : never> {
|
|
121
|
+
format: F;
|
|
122
|
+
type: T extends string ? 'string' : T extends boolean ? 'boolean' : never;
|
|
123
|
+
name: string;
|
|
124
|
+
short?: string;
|
|
125
|
+
description: string;
|
|
126
|
+
order: number;
|
|
127
|
+
initial?: R;
|
|
128
|
+
cast?: (value: T extends string ? string : T extends boolean ? boolean : never) => R;
|
|
129
|
+
action?: (cursor: TreeNode, token: Token, context: Context) => TreeNode | false;
|
|
130
|
+
}
|
|
131
|
+
interface OptionOption<T extends string | boolean, R extends any> {
|
|
132
|
+
description?: string;
|
|
133
|
+
default?: T;
|
|
134
|
+
cast?: (value: T) => R;
|
|
135
|
+
}
|
|
136
|
+
interface Plugin {
|
|
137
|
+
onPreRun(breadc: Breadc): void | Promise<void>;
|
|
138
|
+
onPreCommand: Record<string, () => void | Promise<void>>;
|
|
139
|
+
onPostCommand: Record<string, () => void | Promise<void>>;
|
|
140
|
+
onPostRun(breadc: Breadc): void | Promise<void>;
|
|
136
141
|
}
|
|
137
142
|
|
|
138
|
-
declare function breadc
|
|
143
|
+
declare function breadc(name: string, config?: AppOption): Breadc<{}>;
|
|
144
|
+
|
|
145
|
+
declare function definePlugin(plugin: Partial<Plugin>): Partial<Plugin>;
|
|
146
|
+
|
|
147
|
+
declare class BreadcError extends Error {
|
|
148
|
+
}
|
|
149
|
+
declare class ParseError extends Error {
|
|
150
|
+
}
|
|
139
151
|
|
|
140
|
-
export { Breadc,
|
|
152
|
+
export { AppOption, Argument, Breadc, BreadcError, Command, Option, ParseError, Plugin, breadc, breadc as default, definePlugin };
|