breadc 0.8.9 → 0.9.1

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.ts CHANGED
@@ -1,163 +1,221 @@
1
- type TokenType = '--' | '-' | 'number' | 'string' | 'long' | 'short';
2
- declare class Token {
3
- private readonly text;
4
- private _type;
5
- constructor(text: string);
6
- /**
7
- * @returns Raw argument text
8
- */
9
- raw(): string;
10
- /**
11
- * @returns Number representation
12
- */
13
- number(): number;
14
- /**
15
- * @returns Remove start - for long or short option
16
- */
17
- option(): string;
18
- isOption(): boolean;
19
- isText(): boolean;
20
- type(): TokenType;
21
- }
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>;
1
+ type TokenType = '--' | '-' | 'number' | 'string' | 'long' | 'short';
2
+ declare class Token {
3
+ private readonly text;
4
+ private _type;
5
+ constructor(text: string);
6
+ /**
7
+ * @returns Raw argument text
8
+ */
9
+ raw(): string;
10
+ /**
11
+ * @returns Number representation
12
+ */
13
+ number(): number;
14
+ /**
15
+ * @returns Remove start - for long or short option
16
+ */
17
+ option(): string;
18
+ isOption(): boolean;
19
+ isText(): boolean;
20
+ type(): TokenType;
30
21
  }
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>;
30
+ }
31
+
32
+ type Prettify<T> = {
33
+ [K in keyof T]: T[K];
34
+ } & {};
35
+ 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';
36
+ 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';
37
+ type Letter = Lowercase | Uppercase;
31
38
 
32
- interface ParseResult {
33
- arguments: Array<string | string[] | undefined>;
34
- options: Record<string, any>;
35
- '--': string[];
36
- }
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;
39
+ type CallbackFn = (result: BreadcParseResult) => any;
40
+ interface ParseResult {
41
+ /**
42
+ * Arguments that will be passed to action callback
43
+ * When parsing, this array is empty
44
+ */
45
+ arguments: Array<string | string[] | undefined>;
46
+ /**
47
+ * Options map
48
+ */
49
+ options: Record<string, any>;
50
+ /**
51
+ * Rest arguments.
52
+ * When parsing, this contains all the non-option arguments
53
+ */
54
+ '--': string[];
55
+ }
56
+ type BreadcParseResult = Prettify<ParseResult & {
57
+ callback?: CallbackFn;
58
+ meta: Record<string, any>;
59
+ matched: {
60
+ node: TreeNode;
61
+ command?: Command;
62
+ option?: Option;
63
+ };
64
+ }>;
65
+ interface Context {
66
+ /**
67
+ * Lexer instance
68
+ */
69
+ lexer: Lexer;
70
+ /**
71
+ * Options supported in the current context
72
+ */
73
+ options: Map<string, Option>;
74
+ /**
75
+ * Parse result
76
+ */
77
+ result: ParseResult;
78
+ /**
79
+ * Some other meta information passed
80
+ */
81
+ meta: Record<string, any>;
82
+ /**
83
+ * Configuration
84
+ */
85
+ config: {
86
+ allowUnknownOption: 'error' | 'skip' | 'rest';
87
+ };
88
+ parseOption(cursor: TreeNode, token: Token, context: Context): TreeNode | false;
89
+ }
90
+ interface TreeNode<F extends CallbackFn = CallbackFn> {
91
+ command?: Command;
92
+ option?: Option;
93
+ /**
94
+ * Out-going edges from this node
95
+ */
96
+ children: Map<string, TreeNode>;
97
+ init(context: Context): void;
98
+ next(arg: Token, context: Context): TreeNode | false;
99
+ finish(context: Context): F | undefined;
48
100
  }
49
101
 
50
102
  declare function makeTreeNode(pnode: Partial<TreeNode>): TreeNode;
51
103
 
52
- type Prettify<T> = {
53
- [K in keyof T]: T[K];
54
- } & {};
55
- 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';
56
- 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';
57
- type Letter = Lowercase | Uppercase;
58
-
59
- /**
60
- * Extract option type, boolean or string
61
- */
62
- 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;
63
- /**
64
- * Extract option raw name
65
- *
66
- * Examples:
67
- * + const t1: ExtractOption<'--option' | '--hello'> = 'hello'
68
- * + const t2: ExtractOption<'-r, --root'> = 'root'
69
- * + const t3: ExtractOption<'--page-index'> = 'pageIndex'
70
- */
71
- type ExtractOptionRawName<T extends string> = T extends `-${Letter}, --${infer R} <${infer U}>` ? R : T extends `-${Letter}, --no-${infer R}` ? R : T extends `-${Letter}, --${infer R}` ? R : T extends `--${infer R} <${infer U}>` ? R : T extends `--no-${infer R}` ? R : T extends `--${infer R}` ? R : never;
72
- /**
73
- * Extrat camel case option name
74
- */
75
- 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;
76
- /**
77
- * Extract option information
78
- */
79
- type ExtractOption<T extends string, D = undefined> = {
80
- [k in ExtractOptionName<T>]: D extends undefined ? ExtractOptionType<T> : D;
81
- };
82
- type Push<T extends any[], U, R> = [...T, U, R];
83
- type ActionFn<T extends any[], Option extends object = {}, R = any> = (...arg: Push<T, Prettify<Option & {
84
- '--': string[];
85
- }>, {}>) => R | Promise<R>;
86
- /**
87
- * Max Dep: 5
88
- *
89
- * Generated by: npx tsx examples/genType.ts 5
90
- */
104
+ /**
105
+ * Extract option type, boolean or string
106
+ */
107
+ 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;
108
+ /**
109
+ * Extract option raw name
110
+ *
111
+ * Examples:
112
+ * + const t1: ExtractOption<'--option' | '--hello'> = 'hello'
113
+ * + const t2: ExtractOption<'-r, --root'> = 'root'
114
+ * + const t3: ExtractOption<'--page-index'> = 'pageIndex'
115
+ */
116
+ type ExtractOptionRawName<T extends string> = T extends `-${Letter}, --${infer R} <${infer U}>` ? R : T extends `-${Letter}, --no-${infer R}` ? R : T extends `-${Letter}, --${infer R}` ? R : T extends `--${infer R} <${infer U}>` ? R : T extends `--no-${infer R}` ? R : T extends `--${infer R}` ? R : never;
117
+ /**
118
+ * Extrat camel case option name
119
+ */
120
+ 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;
121
+ /**
122
+ * Extract option information
123
+ */
124
+ type ExtractOption<T extends string, D = never> = {
125
+ [k in ExtractOptionName<T>]: D extends never ? ExtractOptionType<T> : D;
126
+ };
127
+ type Push<T extends any[], U, R> = [...T, U, R];
128
+ type ActionFn<T extends any[], Option extends object = {}, R = any> = (...arg: Push<T, Prettify<Option & {
129
+ '--': string[];
130
+ }>, {}>) => R | Promise<R>;
131
+ /**
132
+ * Max Dep: 5
133
+ *
134
+ * Generated by: npx tsx examples/genType.ts 5
135
+ */
91
136
  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;
92
137
 
93
- interface AppOption {
94
- version?: string;
95
- description?: string;
96
- plugins?: Partial<Plugin>[];
97
- }
98
- interface Breadc<GlobalOption extends object = {}> {
99
- name: string;
100
- description: string;
101
- 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>>;
102
- 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>>;
103
- command<F extends string = string>(format: F, description?: string): Command<F, ExtractCommand<F>, {}, GlobalOption>;
104
- command<F extends string = string>(format: F, option?: CommandOption): Command<F, ExtractCommand<F>, {}, GlobalOption>;
105
- parse(args: string[]): {
106
- command?: Command;
107
- } & ParseResult;
108
- run<T = any>(args: string[]): Promise<T>;
109
- }
110
- interface Command<F extends string = string, AT extends any[] = ExtractCommand<F>, CommandOption extends object = {}, GlobalOption extends object = {}> {
111
- callback?: (result: ParseResult) => Promise<any>;
112
- format: F;
113
- description: string;
114
- _default: boolean;
115
- _arguments: Argument[];
116
- _options: Option[];
117
- option<OF extends string = string, OT extends string | boolean = ExtractOptionType<OF>, OR extends any = ExtractOptionType<OF>>(format: OF, description?: string, option?: OptionOption<OT, OR>): Command<F, AT, CommandOption & ExtractOption<OF, OR>, GlobalOption>;
118
- option<OF extends string = string, OT extends string | boolean = ExtractOptionType<OF>, OR extends any = ExtractOptionType<OF>>(format: OF, option?: OptionOption<OT, OR>): Command<F, AT, CommandOption & ExtractOption<OF, OR>, GlobalOption>;
119
- alias(format: string): Command<F, AT, CommandOption, GlobalOption>;
120
- action(fn: ActionFn<AT, CommandOption & GlobalOption>): void;
121
- }
122
- interface CommandOption {
123
- description?: string;
124
- }
125
- interface Argument {
126
- type: 'const' | 'require' | 'optional' | 'rest';
127
- name: string;
128
- }
129
- interface Option<F extends string = string, T extends string | boolean = ExtractOptionType<F>, R extends any = T extends string ? string : T extends boolean ? boolean : never> {
130
- format: F;
131
- type: T extends string ? 'string' : T extends boolean ? 'boolean' : never;
132
- name: string;
133
- short?: string;
134
- description: string;
135
- order: number;
136
- initial?: R;
137
- cast?: (value: T extends string ? string : T extends boolean ? boolean : never) => R;
138
- action?: (cursor: TreeNode, token: Token, context: Context) => TreeNode | false;
139
- }
140
- interface OptionOption<T extends string | boolean, R extends any = T> {
141
- description?: string;
142
- default?: T;
143
- cast?: (value: T) => R;
144
- }
145
- type CommandHookFn = (result: ParseResult) => void | Promise<void>;
146
- interface Plugin {
147
- onInit?(breadc: Breadc, allCommands: Command[], globalOptions: Option[]): void;
148
- onPreRun?(breadc: Breadc): void | Promise<void>;
149
- onPreCommand?: Record<string, CommandHookFn> | CommandHookFn;
150
- onPostCommand?: Record<string, CommandHookFn> | CommandHookFn;
151
- onPostRun?(breadc: Breadc): void | Promise<void>;
138
+ interface AppOption {
139
+ version?: string;
140
+ description?: string;
141
+ plugins?: Partial<Plugin>[];
142
+ builtin?: {
143
+ version?: false | Partial<{
144
+ description: string;
145
+ content: string;
146
+ }>;
147
+ help?: false | Partial<{
148
+ description: string;
149
+ }>;
150
+ };
151
+ }
152
+ interface Breadc<GlobalOption extends object = {}> {
153
+ name: string;
154
+ description: string;
155
+ option<OF extends string = string, OT extends string | boolean = ExtractOptionType<OF>, OO extends OptionOption<OT, any> = OptionOption<OT, any>, OR extends any = OO extends {
156
+ cast(...args: any[]): infer CR;
157
+ } ? CR : OO['default'] extends OT ? OT : OT extends string ? undefined | string : OT extends boolean ? boolean : undefined | string | boolean>(format: OF, description?: string | OO, option?: OO): Breadc<GlobalOption & ExtractOption<OF, OR>>;
158
+ command<F extends string = string>(format: F, description?: string, option?: CommandOption): Command<F, ExtractCommand<F>, {}, GlobalOption>;
159
+ command<F extends string = string>(format: F, option?: CommandOption): Command<F, ExtractCommand<F>, {}, GlobalOption>;
160
+ parse(args: string[]): BreadcParseResult;
161
+ run<T = any>(args: string[]): Promise<T>;
162
+ }
163
+ interface Command<F extends string = string, AT extends any[] = ExtractCommand<F>, CommandOption extends object = {}, GlobalOption extends object = {}> {
164
+ callback?: (result: ParseResult) => Promise<any>;
165
+ format: F;
166
+ description: string;
167
+ _default: boolean;
168
+ _arguments: Argument[];
169
+ _options: Option[];
170
+ option<OF extends string = string, OT extends string | boolean = ExtractOptionType<OF>, OO extends OptionOption<OT, any> = OptionOption<OT, any>, OR extends any = OO extends {
171
+ cast(...args: any[]): infer CR;
172
+ } ? CR : OO['default'] extends OT ? OT : OT extends string ? undefined | string : OT extends boolean ? boolean : undefined | string | boolean>(format: OF, description?: string | OO, option?: OO): Command<F, AT, CommandOption & ExtractOption<OF, OR>, GlobalOption>;
173
+ alias(format: string): Command<F, AT, CommandOption, GlobalOption>;
174
+ action(fn: ActionFn<AT, CommandOption & GlobalOption>): void;
175
+ }
176
+ interface CommandOption {
177
+ description?: string;
178
+ /**
179
+ * Config how to handle unknown options
180
+ */
181
+ allowUnknownOption?: 'error' | 'skip' | 'rest';
182
+ }
183
+ interface Argument {
184
+ type: 'const' | 'require' | 'optional' | 'rest';
185
+ name: string;
186
+ }
187
+ interface Option<F extends string = string, T extends string | boolean = ExtractOptionType<F>, R extends unknown = any> {
188
+ format: F;
189
+ type: T extends string ? 'string' : T extends boolean ? 'boolean' : never;
190
+ name: string;
191
+ short?: string;
192
+ description: string;
193
+ order: number;
194
+ initial?: R;
195
+ cast?: (value: T extends string ? string : T extends boolean ? boolean : never) => R;
196
+ parse?: (cursor: TreeNode, token: Token, context: Context) => TreeNode | false;
197
+ }
198
+ interface OptionOption<T extends string | boolean, R extends any = any> {
199
+ description?: string;
200
+ default?: T;
201
+ cast?: (value: T) => R;
202
+ }
203
+ type CommandHookFn = (result: ParseResult) => void | Promise<void>;
204
+ interface Plugin {
205
+ onInit?(breadc: Breadc, allCommands: Command[], globalOptions: Option[]): void;
206
+ onPreRun?(breadc: Breadc): void | Promise<void>;
207
+ onPreCommand?: Record<string, CommandHookFn> | CommandHookFn;
208
+ onPostCommand?: Record<string, CommandHookFn> | CommandHookFn;
209
+ onPostRun?(breadc: Breadc): void | Promise<void>;
152
210
  }
153
211
 
154
212
  declare function breadc(name: string, config?: AppOption): Breadc<{}>;
155
213
 
156
214
  declare function definePlugin(plugin: Partial<Plugin>): Partial<Plugin>;
157
215
 
158
- declare class BreadcError extends Error {
159
- }
160
- declare class ParseError extends Error {
216
+ declare class BreadcError extends Error {
217
+ }
218
+ declare class ParseError extends Error {
161
219
  }
162
220
 
163
- export { AppOption, Argument, Breadc, BreadcError, Command, Option, ParseError, Plugin, breadc, breadc as default, definePlugin, makeTreeNode };
221
+ export { AppOption, Argument, Breadc, BreadcError, Command, Option, ParseError, Plugin, breadc, definePlugin, makeTreeNode };