@wq2/brigadier-ts 1.0.0 → 1.0.2
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/README.md +1 -0
- package/dist/Command.d.ts +1 -1
- package/dist/CommandDispatcher.d.ts +1 -1
- package/dist/CommandDispatcher.js +231 -357
- package/dist/ParseResults.d.ts +1 -1
- package/dist/ParseResults.js +9 -10
- package/dist/StringReader.d.ts +1 -1
- package/dist/StringReader.js +75 -77
- package/dist/arguments/ArgumentType.d.ts +1 -1
- package/dist/arguments/ArgumentType.js +9 -8
- package/dist/arguments/BoolArgumentType.d.ts +5 -1
- package/dist/arguments/BoolArgumentType.js +9 -27
- package/dist/arguments/FloatArgumentType.d.ts +1 -1
- package/dist/arguments/FloatArgumentType.js +11 -30
- package/dist/arguments/IntegerArgumentType.d.ts +1 -1
- package/dist/arguments/IntegerArgumentType.js +11 -30
- package/dist/arguments/LongArgumentType.d.ts +3 -3
- package/dist/arguments/LongArgumentType.js +13 -32
- package/dist/arguments/NumberArgumentType.d.ts +2 -2
- package/dist/arguments/NumberArgumentType.js +15 -33
- package/dist/arguments/StringArgumentType.d.ts +1 -1
- package/dist/arguments/StringArgumentType.js +11 -29
- package/dist/builder/ArgumentBuilder.d.ts +1 -1
- package/dist/builder/ArgumentBuilder.js +31 -71
- package/dist/builder/LiteralArgumentBuilder.js +14 -33
- package/dist/builder/RequiredArgumentBuilder.d.ts +1 -1
- package/dist/builder/RequiredArgumentBuilder.js +18 -37
- package/dist/context/CommandContext.d.ts +1 -1
- package/dist/context/CommandContext.js +31 -32
- package/dist/context/CommandContextBuilder.d.ts +1 -1
- package/dist/context/CommandContextBuilder.js +47 -50
- package/dist/context/ParsedArgument.js +8 -9
- package/dist/context/ParsedCommandNode.d.ts +1 -1
- package/dist/context/ParsedCommandNode.js +7 -8
- package/dist/context/StringRange.js +17 -18
- package/dist/context/SuggestionContext.d.ts +1 -1
- package/dist/context/SuggestionContext.js +3 -4
- package/dist/exceptions/CommandErrorType.d.ts +3 -3
- package/dist/exceptions/CommandErrorType.js +10 -19
- package/dist/exceptions/CommandSyntaxError.js +36 -54
- package/dist/suggestion/Suggestion.d.ts +1 -1
- package/dist/suggestion/Suggestion.js +16 -17
- package/dist/suggestion/Suggestions.d.ts +1 -1
- package/dist/suggestion/Suggestions.js +28 -30
- package/dist/suggestion/SuggestionsBuilder.d.ts +1 -1
- package/dist/suggestion/SuggestionsBuilder.js +22 -23
- package/dist/tree/ArgumentCommandNode.d.ts +1 -1
- package/dist/tree/ArgumentCommandNode.js +22 -40
- package/dist/tree/CommandNode.d.ts +1 -1
- package/dist/tree/CommandNode.js +28 -29
- package/dist/tree/LiteralCommandNode.d.ts +1 -1
- package/dist/tree/LiteralCommandNode.js +28 -41
- package/dist/tree/RootCommandNode.d.ts +1 -1
- package/dist/tree/RootCommandNode.js +17 -69
- package/jest.config.js +5 -5
- package/package.json +32 -32
- package/src/Command.ts +2 -1
- package/src/CommandDispatcher.ts +397 -295
- package/src/ParseResults.ts +26 -22
- package/src/StringReader.ts +212 -193
- package/src/arguments/ArgumentType.ts +13 -8
- package/src/arguments/BoolArgumentType.ts +22 -21
- package/src/arguments/FloatArgumentType.ts +13 -14
- package/src/arguments/IntegerArgumentType.ts +13 -14
- package/src/arguments/LongArgumentType.ts +16 -17
- package/src/arguments/NumberArgumentType.ts +48 -38
- package/src/arguments/StringArgumentType.ts +26 -26
- package/src/builder/ArgumentBuilder.ts +80 -75
- package/src/builder/LiteralArgumentBuilder.ts +31 -21
- package/src/builder/RequiredArgumentBuilder.ts +42 -32
- package/src/context/CommandContext.ts +99 -76
- package/src/context/CommandContextBuilder.ts +169 -143
- package/src/context/ParsedArgument.ts +13 -13
- package/src/context/ParsedCommandNode.ts +14 -14
- package/src/context/StringRange.ts +26 -26
- package/src/context/SuggestionContext.ts +7 -7
- package/src/exceptions/CommandErrorType.ts +20 -13
- package/src/exceptions/CommandSyntaxError.ts +78 -37
- package/src/index.ts +30 -30
- package/src/suggestion/Suggestion.ts +46 -46
- package/src/suggestion/Suggestions.ts +59 -57
- package/src/suggestion/SuggestionsBuilder.ts +59 -57
- package/src/tree/ArgumentCommandNode.ts +51 -40
- package/src/tree/CommandNode.ts +96 -87
- package/src/tree/LiteralCommandNode.ts +78 -57
- package/src/tree/RootCommandNode.ts +33 -23
- package/test/Arguments.test.ts +47 -33
- package/test/CommandDispatcher.test.ts +18 -22
- package/test/StringReader.test.ts +47 -47
- package/tsconfig.json +9 -14
package/src/tree/CommandNode.ts
CHANGED
|
@@ -1,105 +1,114 @@
|
|
|
1
1
|
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
} from
|
|
2
|
+
type StringReader,
|
|
3
|
+
type Command,
|
|
4
|
+
LiteralCommandNode,
|
|
5
|
+
ArgumentCommandNode,
|
|
6
|
+
type CommandContext,
|
|
7
|
+
type CommandContextBuilder,
|
|
8
|
+
type Predicate,
|
|
9
|
+
type RedirectModifier,
|
|
10
|
+
type SuggestionsBuilder,
|
|
11
|
+
type Suggestions,
|
|
12
|
+
} from "..";
|
|
13
13
|
|
|
14
14
|
export abstract class CommandNode<S> {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
15
|
+
private children: Map<string, CommandNode<S>>;
|
|
16
|
+
private literals: Map<string, LiteralCommandNode<S>>;
|
|
17
|
+
private arguments: Map<string, ArgumentCommandNode<S, any>>;
|
|
18
|
+
private command: Command<S>;
|
|
19
|
+
private requirement: Predicate<S>;
|
|
20
|
+
private redirect: CommandNode<S>;
|
|
21
|
+
private modifier: RedirectModifier<S>;
|
|
22
|
+
private forks: boolean;
|
|
23
23
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
24
|
+
constructor(
|
|
25
|
+
command: Command<S>,
|
|
26
|
+
requirement: Predicate<S>,
|
|
27
|
+
redirect: CommandNode<S>,
|
|
28
|
+
modifier: RedirectModifier<S>,
|
|
29
|
+
forks: boolean,
|
|
30
|
+
) {
|
|
31
|
+
this.children = new Map();
|
|
32
|
+
this.literals = new Map();
|
|
33
|
+
this.arguments = new Map();
|
|
34
|
+
this.command = command;
|
|
35
|
+
this.requirement = requirement;
|
|
36
|
+
this.redirect = redirect;
|
|
37
|
+
this.modifier = modifier;
|
|
38
|
+
this.forks = forks;
|
|
39
|
+
}
|
|
34
40
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
41
|
+
getCommand(): Command<S> {
|
|
42
|
+
return this.command;
|
|
43
|
+
}
|
|
38
44
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
45
|
+
getChildren(): CommandNode<S>[] {
|
|
46
|
+
return Array.from(this.children.values());
|
|
47
|
+
}
|
|
42
48
|
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
49
|
+
getChild(name: string): CommandNode<S> {
|
|
50
|
+
return this.children.get(name);
|
|
51
|
+
}
|
|
46
52
|
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
53
|
+
getRedirect(): CommandNode<S> {
|
|
54
|
+
return this.redirect;
|
|
55
|
+
}
|
|
50
56
|
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
57
|
+
getRedirectModifier(): RedirectModifier<S> {
|
|
58
|
+
return this.modifier;
|
|
59
|
+
}
|
|
54
60
|
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
61
|
+
isFork(): boolean {
|
|
62
|
+
return this.forks;
|
|
63
|
+
}
|
|
58
64
|
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
65
|
+
canUse(source: S) {
|
|
66
|
+
return this.requirement(source);
|
|
67
|
+
}
|
|
62
68
|
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
69
|
+
addChild(node: CommandNode<S>): void {
|
|
70
|
+
const child = this.children.get(node.getName());
|
|
71
|
+
if (child != null) {
|
|
72
|
+
if (node.getCommand() != null) {
|
|
73
|
+
child.command = node.getCommand();
|
|
74
|
+
}
|
|
75
|
+
node.getChildren().forEach((grandChild) => {
|
|
76
|
+
child.addChild(grandChild);
|
|
77
|
+
});
|
|
78
|
+
} else {
|
|
79
|
+
this.children.set(node.getName(), node);
|
|
80
|
+
if (node instanceof LiteralCommandNode) {
|
|
81
|
+
this.literals.set(node.getName(), node);
|
|
82
|
+
} else if (node instanceof ArgumentCommandNode) {
|
|
83
|
+
this.arguments.set(node.getName(), node);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
81
87
|
|
|
82
|
-
|
|
88
|
+
abstract parse(reader: StringReader, context: CommandContextBuilder<S>): void;
|
|
83
89
|
|
|
84
|
-
|
|
90
|
+
abstract getName(): string;
|
|
85
91
|
|
|
86
|
-
|
|
92
|
+
abstract getUsageText(): string;
|
|
87
93
|
|
|
88
|
-
|
|
94
|
+
abstract listSuggestions(
|
|
95
|
+
context: CommandContext<S>,
|
|
96
|
+
builder: SuggestionsBuilder,
|
|
97
|
+
): Promise<Suggestions>;
|
|
89
98
|
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
99
|
+
getRelevantNodes(input: StringReader): CommandNode<S>[] {
|
|
100
|
+
if (this.literals.size > 0) {
|
|
101
|
+
const cursor = input.getCursor();
|
|
102
|
+
while (input.canRead() && input.peek() !== " ") {
|
|
103
|
+
input.skip();
|
|
104
|
+
}
|
|
105
|
+
const text = input.getString().substring(cursor, input.getCursor());
|
|
106
|
+
input.setCursor(cursor);
|
|
107
|
+
const literal = this.literals.get(text);
|
|
108
|
+
if (literal != null) {
|
|
109
|
+
return [literal];
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
return Array.from(this.arguments.values());
|
|
113
|
+
}
|
|
105
114
|
}
|
|
@@ -1,64 +1,85 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
} from
|
|
1
|
+
import {
|
|
2
|
+
CommandNode,
|
|
3
|
+
type StringReader,
|
|
4
|
+
type Command,
|
|
5
|
+
StringRange,
|
|
6
|
+
type CommandContext,
|
|
7
|
+
type CommandContextBuilder,
|
|
8
|
+
type Predicate,
|
|
9
|
+
type RedirectModifier,
|
|
10
|
+
CommandSyntaxError,
|
|
11
|
+
Suggestions,
|
|
12
|
+
type SuggestionsBuilder,
|
|
13
|
+
} from "..";
|
|
14
14
|
|
|
15
15
|
export class LiteralCommandNode<S> extends CommandNode<S> {
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
constructor(literal: string, command: Command<S>, requirement: Predicate<S>, redirect: CommandNode<S>, modifier: RedirectModifier<S>, forks: boolean) {
|
|
19
|
-
super(command, requirement, redirect, modifier, forks);
|
|
20
|
-
this.literal = literal;
|
|
21
|
-
}
|
|
16
|
+
private literal: string;
|
|
22
17
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
18
|
+
constructor(
|
|
19
|
+
literal: string,
|
|
20
|
+
command: Command<S>,
|
|
21
|
+
requirement: Predicate<S>,
|
|
22
|
+
redirect: CommandNode<S>,
|
|
23
|
+
modifier: RedirectModifier<S>,
|
|
24
|
+
forks: boolean,
|
|
25
|
+
) {
|
|
26
|
+
super(command, requirement, redirect, modifier, forks);
|
|
27
|
+
this.literal = literal;
|
|
28
|
+
}
|
|
32
29
|
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
}
|
|
46
|
-
return -1;
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
getName(): string {
|
|
50
|
-
return this.literal;
|
|
51
|
-
}
|
|
30
|
+
parse(reader: StringReader, contextBuilder: CommandContextBuilder<S>): void {
|
|
31
|
+
const start = reader.getCursor();
|
|
32
|
+
const end = this.parseInternal(reader);
|
|
33
|
+
if (end > -1) {
|
|
34
|
+
contextBuilder.withNode(this, new StringRange(start, end));
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
throw CommandSyntaxError.LITERAL_INCORRECT.createWithContext(
|
|
38
|
+
reader,
|
|
39
|
+
this.literal,
|
|
40
|
+
);
|
|
41
|
+
}
|
|
52
42
|
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
43
|
+
private parseInternal(reader: StringReader): number {
|
|
44
|
+
const start = reader.getCursor();
|
|
45
|
+
if (reader.canRead(this.literal.length)) {
|
|
46
|
+
const end = start + this.literal.length;
|
|
47
|
+
if (
|
|
48
|
+
reader.getString().substring(start, this.literal.length) ===
|
|
49
|
+
this.literal
|
|
50
|
+
) {
|
|
51
|
+
reader.setCursor(end);
|
|
52
|
+
if (!reader.canRead() || reader.peek() === " ") {
|
|
53
|
+
return end;
|
|
54
|
+
} else {
|
|
55
|
+
reader.setCursor(start);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return -1;
|
|
60
|
+
}
|
|
56
61
|
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
62
|
+
getName(): string {
|
|
63
|
+
return this.literal;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
getUsageText(): string {
|
|
67
|
+
return this.literal;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
listSuggestions(
|
|
71
|
+
// biome-ignore lint/correctness/noUnusedFunctionParameters: yes
|
|
72
|
+
context: CommandContext<S>,
|
|
73
|
+
builder: SuggestionsBuilder,
|
|
74
|
+
): Promise<Suggestions> {
|
|
75
|
+
if (
|
|
76
|
+
this.literal
|
|
77
|
+
.toLowerCase()
|
|
78
|
+
.startsWith(builder.getRemaining().toLowerCase())
|
|
79
|
+
) {
|
|
80
|
+
return builder.suggest(this.literal).buildPromise();
|
|
81
|
+
} else {
|
|
82
|
+
return Suggestions.empty();
|
|
83
|
+
}
|
|
84
|
+
}
|
|
64
85
|
}
|
|
@@ -1,30 +1,40 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
} from
|
|
1
|
+
import {
|
|
2
|
+
CommandNode,
|
|
3
|
+
type StringReader,
|
|
4
|
+
type CommandContextBuilder,
|
|
5
|
+
type CommandContext,
|
|
6
|
+
Suggestions,
|
|
7
|
+
type SuggestionsBuilder,
|
|
8
|
+
} from "..";
|
|
9
9
|
|
|
10
10
|
export class RootCommandNode<S> extends CommandNode<S> {
|
|
11
|
+
constructor() {
|
|
12
|
+
super(
|
|
13
|
+
null,
|
|
14
|
+
async (_) => true,
|
|
15
|
+
null,
|
|
16
|
+
(_) => null,
|
|
17
|
+
false,
|
|
18
|
+
);
|
|
19
|
+
}
|
|
11
20
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
}
|
|
21
|
+
// biome-ignore lint/correctness/noUnusedFunctionParameters: no-op
|
|
22
|
+
parse(reader: StringReader, contextBuilder: CommandContextBuilder<S>): void {}
|
|
15
23
|
|
|
16
|
-
|
|
17
|
-
|
|
24
|
+
getName(): string {
|
|
25
|
+
return "";
|
|
26
|
+
}
|
|
18
27
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
28
|
+
getUsageText(): string {
|
|
29
|
+
return "";
|
|
30
|
+
}
|
|
22
31
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
32
|
+
listSuggestions(
|
|
33
|
+
// biome-ignore lint/correctness/noUnusedFunctionParameters: no-op
|
|
34
|
+
context: CommandContext<S>,
|
|
35
|
+
// biome-ignore lint/correctness/noUnusedFunctionParameters: no-op
|
|
36
|
+
builder: SuggestionsBuilder,
|
|
37
|
+
): Promise<Suggestions> {
|
|
38
|
+
return Suggestions.empty();
|
|
39
|
+
}
|
|
30
40
|
}
|
package/test/Arguments.test.ts
CHANGED
|
@@ -1,36 +1,50 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {
|
|
2
|
+
argument,
|
|
3
|
+
bool,
|
|
4
|
+
CommandDispatcher,
|
|
5
|
+
FloatArgumentType,
|
|
6
|
+
IntegerArgumentType,
|
|
7
|
+
literal,
|
|
8
|
+
LongArgumentType,
|
|
9
|
+
} from "../src";
|
|
2
10
|
|
|
3
|
-
describe(
|
|
4
|
-
test(
|
|
5
|
-
const dispatcher = new CommandDispatcher()
|
|
6
|
-
dispatcher.register(
|
|
7
|
-
.then(
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
11
|
+
describe("Arguments", () => {
|
|
12
|
+
test("Integer", async () => {
|
|
13
|
+
const dispatcher = new CommandDispatcher();
|
|
14
|
+
dispatcher.register(
|
|
15
|
+
literal("foo").then(
|
|
16
|
+
argument("bar", new IntegerArgumentType()).executes(
|
|
17
|
+
async (ctx) => ctx.get("bar") * 2,
|
|
18
|
+
),
|
|
19
|
+
),
|
|
20
|
+
);
|
|
21
|
+
const result = await dispatcher.execute("foo 6", undefined);
|
|
22
|
+
expect(result).toEqual(12);
|
|
23
|
+
});
|
|
14
24
|
|
|
15
|
-
test(
|
|
16
|
-
const dispatcher = new CommandDispatcher()
|
|
17
|
-
dispatcher.register(
|
|
18
|
-
.then(
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
+
test("Long", async () => {
|
|
26
|
+
const dispatcher = new CommandDispatcher();
|
|
27
|
+
dispatcher.register(
|
|
28
|
+
literal("foo").then(
|
|
29
|
+
argument("bar", new LongArgumentType()).executes(
|
|
30
|
+
async (ctx) => ctx.get("bar").toString().length,
|
|
31
|
+
),
|
|
32
|
+
),
|
|
33
|
+
);
|
|
34
|
+
const result = await dispatcher.execute("foo 123456789012345", undefined);
|
|
35
|
+
expect(result).toEqual(15);
|
|
36
|
+
});
|
|
25
37
|
|
|
26
|
-
test(
|
|
27
|
-
const dispatcher = new CommandDispatcher()
|
|
28
|
-
dispatcher.register(
|
|
29
|
-
.then(
|
|
30
|
-
.executes(async ctx =>
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
38
|
+
test("Float", async () => {
|
|
39
|
+
const dispatcher = new CommandDispatcher();
|
|
40
|
+
dispatcher.register(
|
|
41
|
+
literal("foo").then(
|
|
42
|
+
argument("bar", new FloatArgumentType()).executes(async (ctx) =>
|
|
43
|
+
Math.floor(ctx.get("bar")),
|
|
44
|
+
),
|
|
45
|
+
),
|
|
46
|
+
);
|
|
47
|
+
const result = await dispatcher.execute("foo 6.2", undefined);
|
|
48
|
+
expect(result).toEqual(6);
|
|
49
|
+
});
|
|
50
|
+
});
|
|
@@ -1,25 +1,21 @@
|
|
|
1
|
-
import { CommandDispatcher, literal } from
|
|
1
|
+
import { CommandDispatcher, literal } from "../src";
|
|
2
2
|
|
|
3
|
-
describe(
|
|
4
|
-
test(
|
|
5
|
-
|
|
6
|
-
})
|
|
3
|
+
describe("CommandDispatcher", () => {
|
|
4
|
+
test("create", () => {
|
|
5
|
+
new CommandDispatcher();
|
|
6
|
+
});
|
|
7
7
|
|
|
8
|
-
test(
|
|
9
|
-
const dispatcher = new CommandDispatcher()
|
|
10
|
-
dispatcher.register(literal(
|
|
11
|
-
|
|
12
|
-
)
|
|
13
|
-
|
|
14
|
-
expect(result).toEqual(2)
|
|
15
|
-
})
|
|
8
|
+
test("execute", async () => {
|
|
9
|
+
const dispatcher = new CommandDispatcher();
|
|
10
|
+
dispatcher.register(literal("foo").executes(async () => 2));
|
|
11
|
+
const result = await dispatcher.execute("foo", undefined);
|
|
12
|
+
expect(result).toEqual(2);
|
|
13
|
+
});
|
|
16
14
|
|
|
17
|
-
test(
|
|
18
|
-
const dispatcher = new CommandDispatcher()
|
|
19
|
-
dispatcher.register(literal(
|
|
20
|
-
|
|
21
|
-
)
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
})
|
|
25
|
-
})
|
|
15
|
+
test("execute (zero result)", async () => {
|
|
16
|
+
const dispatcher = new CommandDispatcher();
|
|
17
|
+
dispatcher.register(literal("foo").executes(async () => 0));
|
|
18
|
+
const result = await dispatcher.execute("foo", undefined);
|
|
19
|
+
expect(result).toEqual(0);
|
|
20
|
+
});
|
|
21
|
+
});
|
|
@@ -1,47 +1,47 @@
|
|
|
1
|
-
import { StringReader } from
|
|
2
|
-
|
|
3
|
-
describe(
|
|
4
|
-
test(
|
|
5
|
-
const reader = new StringReader(
|
|
6
|
-
const value = reader.readInt()
|
|
7
|
-
expect(value).toEqual(5)
|
|
8
|
-
})
|
|
9
|
-
|
|
10
|
-
test(
|
|
11
|
-
const reader = new StringReader(
|
|
12
|
-
const value = reader.readInt()
|
|
13
|
-
expect(value).toEqual(5)
|
|
14
|
-
expect(reader.getCursor()).toEqual(1)
|
|
15
|
-
})
|
|
16
|
-
|
|
17
|
-
test(
|
|
18
|
-
const reader = new StringReader(
|
|
19
|
-
expect(() => reader.readInt()).toThrow(
|
|
20
|
-
})
|
|
21
|
-
|
|
22
|
-
test(
|
|
23
|
-
const reader = new StringReader(
|
|
24
|
-
expect(() => reader.readInt()).toThrow(
|
|
25
|
-
})
|
|
26
|
-
|
|
27
|
-
test(
|
|
28
|
-
const reader = new StringReader(
|
|
29
|
-
expect(() => reader.readInt()).toThrow(
|
|
30
|
-
})
|
|
31
|
-
|
|
32
|
-
test(
|
|
33
|
-
const reader = new StringReader(
|
|
34
|
-
const value = reader.readFloat()
|
|
35
|
-
expect(value).toEqual(1.3)
|
|
36
|
-
})
|
|
37
|
-
|
|
38
|
-
test(
|
|
39
|
-
const reader = new StringReader(
|
|
40
|
-
expect(() => reader.readFloat()).toThrow(
|
|
41
|
-
})
|
|
42
|
-
|
|
43
|
-
test(
|
|
44
|
-
const reader = new StringReader(
|
|
45
|
-
expect(() => reader.readFloat()).toThrow(
|
|
46
|
-
})
|
|
47
|
-
})
|
|
1
|
+
import { StringReader } from "../src/StringReader";
|
|
2
|
+
|
|
3
|
+
describe("StringReader", () => {
|
|
4
|
+
test("readInt", () => {
|
|
5
|
+
const reader = new StringReader("5");
|
|
6
|
+
const value = reader.readInt();
|
|
7
|
+
expect(value).toEqual(5);
|
|
8
|
+
});
|
|
9
|
+
|
|
10
|
+
test("readInt (trailing)", () => {
|
|
11
|
+
const reader = new StringReader("5a");
|
|
12
|
+
const value = reader.readInt();
|
|
13
|
+
expect(value).toEqual(5);
|
|
14
|
+
expect(reader.getCursor()).toEqual(1);
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
test("readInt (NaN)", () => {
|
|
18
|
+
const reader = new StringReader("5-");
|
|
19
|
+
expect(() => reader.readInt()).toThrow("Invalid integer");
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
test("readInt (invalid)", () => {
|
|
23
|
+
const reader = new StringReader("a");
|
|
24
|
+
expect(() => reader.readInt()).toThrow("Expected integer");
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
test("readInt (float)", () => {
|
|
28
|
+
const reader = new StringReader("1.3");
|
|
29
|
+
expect(() => reader.readInt()).toThrow("Invalid integer");
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
test("readFloat", () => {
|
|
33
|
+
const reader = new StringReader("1.3");
|
|
34
|
+
const value = reader.readFloat();
|
|
35
|
+
expect(value).toEqual(1.3);
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
test("readFloat (NaN)", () => {
|
|
39
|
+
const reader = new StringReader("1.3-");
|
|
40
|
+
expect(() => reader.readFloat()).toThrow("Invalid float");
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
test("readFloat (invalid)", () => {
|
|
44
|
+
const reader = new StringReader("sw");
|
|
45
|
+
expect(() => reader.readFloat()).toThrow("Expected float");
|
|
46
|
+
});
|
|
47
|
+
});
|
package/tsconfig.json
CHANGED
|
@@ -1,16 +1,11 @@
|
|
|
1
1
|
{
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
],
|
|
12
|
-
"exclude": [
|
|
13
|
-
"node_modules",
|
|
14
|
-
"dist"
|
|
15
|
-
]
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"target": "es2020",
|
|
4
|
+
"module": "commonjs",
|
|
5
|
+
"lib": ["ES2020", "dom"],
|
|
6
|
+
"declaration": true,
|
|
7
|
+
"outDir": "dist"
|
|
8
|
+
},
|
|
9
|
+
"include": ["src"],
|
|
10
|
+
"exclude": ["node_modules", "dist"]
|
|
16
11
|
}
|