-
Notifications
You must be signed in to change notification settings - Fork 20
/
types.ts
108 lines (92 loc) 路 2.59 KB
/
types.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
// ----- Args -----
export type ArgType =
| "boolean"
| "string"
| "number"
| "enum"
| "positional"
| undefined;
export type _ArgDef<T extends ArgType, VT extends boolean | number | string> = {
type?: T;
description?: string;
valueHint?: string;
alias?: string | string[];
default?: VT;
required?: boolean;
options?: (string | number)[];
};
export type BooleanArgDef = Omit<_ArgDef<"boolean", boolean>, "options">;
export type StringArgDef = Omit<_ArgDef<"string", string>, "options">;
export type NumberArgDef = Omit<_ArgDef<"number", boolean>, "options">;
export type EnumArgDef = _ArgDef<"enum", string>;
export type PositionalArgDef = Omit<
_ArgDef<"positional", string>,
"alias" | "options"
>;
export type ArgDef =
| BooleanArgDef
| StringArgDef
| NumberArgDef
| PositionalArgDef
| EnumArgDef;
export type ArgsDef = Record<string, ArgDef>;
export type Arg = ArgDef & { name: string; alias: string[] };
export type ParsedArgs<T extends ArgsDef = ArgsDef> = { _: string[] } & Record<
{ [K in keyof T]: T[K] extends { type: "positional" } ? K : never }[keyof T],
string
> &
Record<
{
[K in keyof T]: T[K] extends { type: "string" } ? K : never;
}[keyof T],
string
> &
Record<
{
[K in keyof T]: T[K] extends { type: "number" } ? K : never;
}[keyof T],
number
> &
Record<
{
[K in keyof T]: T[K] extends { type: "boolean" } ? K : never;
}[keyof T],
boolean
> &
Record<
{
[K in keyof T]: T[K] extends { type: "enum" } ? K : never;
}[keyof T],
{
[K in keyof T]: T[K] extends { options: infer U } ? U : never;
}[keyof T]
> &
Record<string, string | number | boolean | string[]>;
// ----- Command -----
// Command: Shared
export interface CommandMeta {
name?: string;
version?: string;
description?: string;
hidden?: boolean;
}
// Command: Definition
export type SubCommandsDef = Record<string, Resolvable<CommandDef<any>>>;
export type CommandDef<T extends ArgsDef = ArgsDef> = {
meta?: Resolvable<CommandMeta>;
args?: Resolvable<T>;
subCommands?: Resolvable<SubCommandsDef>;
setup?: (context: CommandContext<T>) => any | Promise<any>;
cleanup?: (context: CommandContext<T>) => any | Promise<any>;
run?: (context: CommandContext<T>) => any | Promise<any>;
};
export type CommandContext<T extends ArgsDef = ArgsDef> = {
rawArgs: string[];
args: ParsedArgs<T>;
cmd: CommandDef<T>;
subCommand?: CommandDef<T>;
data?: any;
};
// ----- Utils -----
export type Awaitable<T> = () => T | Promise<T>;
export type Resolvable<T> = T | Promise<T> | (() => T) | (() => Promise<T>);